
--_005_C5A0092C63E939488005F15F736A8112097A57B9SHSMSX101ccrcor_ Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 SGksDQogICBJbiBvcmRlciB0byBhZGQgbmV3IGZlYXR1cmUgdG8gT3ZpcnQsIHRoYXQgaXMgdXNl ciBjYW4gY2hvb3NlIHZpcnR1YWwgbWFjaGluZSB3aGV0aGVyIG9uIHRydXN0ZWQgbWFjaGluZSBv ciBub3Qgd2hlbiBpdCBydW5zIHVwLCB3ZSBtb2RpZmllZCB0aGUgcmVsYXRpdmUgZmlsZXMuDQpP dXIgZ29hbCBpcyB3aGVuIHRoZSB1c2VyIGNsaWNrIHRoZSB0cnVzdGVkIGJ1dHRvbiwgUnVuL01p Z3JhdGlvbiBvcHRpb25zIGFyZSBkaXNhYmxlZC4gQnV0IHVuZm9ydHVuYXRlbHksIHdlIGhhdmVu 4oCZdCBzdWNjZWVkZWQgaW4gZ3JhcGhpYyBpbnRlcmZhY2UuIA0KSSBtb2RpZmllZCB0aGVzZSBm aWxlcywgSSBjYW7igJl0IHNlZSBIb3N0IFRhYiwgY2FuIHlvdSBnaXZlIG1lIHNvbWUgaGVscD8g TWF5YmUgd2UgbmVlZCBtb2RpZnkgbW9yZSBmaWxlcy4gV2UgZGlkIHRoZSBmb2xsb3dpbmcgZWZm b3J0czoNCigxKSBhZGQgYSB0cnVzdGVkIHJhZGlvIGJ1dHRvbi4NCigyKSBNb2RpZnkgQWJzdHJh Y3RWbVBvcHVwV2lkZ2V0LnVpLnhtbA0KPGc6SG9yaXpvbnRhbFBhbmVsIHZlcnRpY2FsQWxpZ25t ZW50PSdBTElHTl9NSURETEUnPg0KwqDCoMKgwqAgPGc6UmFkaW9CdXR0b24gdWk6ZmllbGQ9InJ1 blZNT25UcnVzdGVkSG9zdCIvPg0KwqAgwqDCoMKgPGU6RW50aXR5TW9kZWxSYWRpb0J1dHRvbkVk aXRvciB3aWR0aD0iMTUwcHgiIHVpOmZpZWxkPSJydW5WTU9uVHJ1c3RlZEhvc3RFZGl0b3IiDQrC oMKgwqDCoMKgwqDCoMKgIMKgwqDCoMKgwqDCoMKgwqAgYWRkU3R5bGVOYW1lcz0ie3N0eWxlLnJh ZGlvQnV0dG9ufSIgLz4NCjwvZzpIb3Jpem9udGFsUGFuZWw+DQooMykgTW9kaWZ5IEFic3RyYWN0 Vm1Qb3B1cFdpZGdldC5qYXZhDQpAVWlGaWVsZChwcm92aWRlZCA9IHRydWUpDQpAUGF0aCh2YWx1 ZSA9ICJydW5WTU9uVHJ1c3RlZEhvc3QuZW50aXR5IikNCsKgwqDCoCBAV2l0aEVsZW1lbnRJZCgi cnVuVk1PblRydXN0ZWRIb3N0IikNCnB1YmxpYyBFbnRpdHlNb2RlbFJhZGlvQnV0dG9uRWRpdG9y IHJ1blZNT25UcnVzdGVkSG9zdEVkaXRvcjsNCg0KaW5pdExpc3RlbmVycyBtZXRob2Q6DQpvYmpl Y3QuZ2V0SXNBdXRvQXNzaWduKCkuZ2V0UHJvcGVydHlDaGFuZ2VkRXZlbnQoKS5hZGRMaXN0ZW5l cihuZXcgSUV2ZW50TGlzdGVuZXIoKSB7DQrCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIEBPdmVycmlk ZQ0KwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwdWJsaWMgdm9pZCBldmVudFJhaXNlZChFdmVudCBl diwgT2JqZWN0IHNlbmRlciwgRXZlbnRBcmdzIGFyZ3MpIHsNCsKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBib29sZWFuIGlzQXV0b0Fzc2lnbiA9IChCb29sZWFuKSBvYmplY3QuZ2V0SXNB dXRvQXNzaWduKCkuZ2V0RW50aXR5KCk7DQrCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg Ym9vbGVhbiBydW5WTU9uVHJ1c3RlZEhvc3QgPSAoQm9vbGVhbikgb2JqZWN0LmdldFJ1blZNT25U cnVzdGVkSG9zdCgpLmdldEVudGl0eSgpOw0KwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IGRlZmF1bHRIb3N0RWRpdG9yLnNldEVuYWJsZWQoIWlzQXV0b0Fzc2lnbiAmJiAhcnVuVk1PblRy dXN0ZWRIb3N0KTsNCsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAvL2RlZmF1bHRIb3N0 RWRpdG9yLnNldEVuYWJsZWQoIWlzQXV0b0Fzc2lnbik7DQrCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgLy8gb25seSB0aGlzIGlzIG5vdCBiaW5kIHRvIHRoZSBtb2RlbCwgc28gbmVlZHMg dG8gbGlzdGVuIHRvIHRoZSBjaGFuZ2UgZXhwbGljaXRseQ0KwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBzcGVjaWZpY0hvc3Quc2V0VmFsdWUoIWlzQXV0b0Fzc2lnbiAmJiAhcnVuVk1PblRy dXN0ZWRIb3N0KTsNCsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgLy9zcGVjaWZpY0hvc3Qu c2V0VmFsdWUoIWlzQXV0b0Fzc2lnbik7DQrCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0NCsKgwqDC oMKgwqDCoMKgIH0pOw0KaXNBdXRvQXNzaWduRWRpdG9yLmFkZERvbUhhbmRsZXIobmV3IENsaWNr SGFuZGxlcigpIHsNCsKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgQE92ZXJyaWRlDQrCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIHB1YmxpYyB2b2lkIG9uQ2xpY2soQ2xpY2tFdmVudCBldmVudCkgew0KwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGRlZmF1bHRIb3N0RWRpdG9yLnNldEVuYWJsZWQo ZmFsc2UpOw0KwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9DQrCoMKgwqDCoMKgwqDCoCB9LCBDbGlj a0V2ZW50LmdldFR5cGUoKSk7DQrCoMKgwqDCoMKgwqDCoCB2bS5nZXRJc0F1dG9Bc3NpZ24oKS5n ZXRFbnRpdHlDaGFuZ2VkRXZlbnQoKS5hZGRMaXN0ZW5lcihuZXcgSUV2ZW50TGlzdGVuZXIoKSB7 DQrCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIEBPdmVycmlkZQ0KwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBwdWJsaWMgdm9pZCBldmVudFJhaXNlZChFdmVudCBldiwgT2JqZWN0IHNlbmRlciwgRXZlbnRB cmdzIGFyZ3MpIHsNCsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoIWlzQXV0b0Fz c2lnbkVkaXRvci5hc1JhZGlvQnV0dG9uKCkuZ2V0VmFsdWUoKSAmJiAhcnVuVk1PblRydXN0ZWRI b3N0RWRpdG9yLmFzUmFkaW9CdXR0b24oKS5nZXRWYWx1ZSgpKQ0KwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIHsNCsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHNw ZWNpZmljSG9zdC5zZXRWYWx1ZSh0cnVlLCB0cnVlKTsNCsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCB9DQrCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0NCsKgwqDCoMKgwqDCoMKgIH0pOw0K wqDCoMKgwqDCoMKgwqAgcnVuVk1PblRydXN0ZWRIb3N0RWRpdG9yLmFkZERvbUhhbmRsZXIobmV3 IENsaWNrSGFuZGxlcigpIHsNCsKgwqAgwqDCoMKgwqDCoMKgwqDCoMKgQE92ZXJyaWRlDQrCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIHB1YmxpYyB2b2lkIG9uQ2xpY2soQ2xpY2tFdmVudCBldmVudCkg ew0KwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGRlZmF1bHRIb3N0RWRpdG9yLnNldEVu YWJsZWQoZmFsc2UpOw0KwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9DQrCoMKgwqDCoMKgwqDCoCB9 LCBDbGlja0V2ZW50LmdldFR5cGUoKSk7DQrCoMKgwqDCoMKgwqDCoCB2bS5nZXRSdW5WTU9uVHJ1 c3RlZEhvc3QoKS5nZXRFbnRpdHlDaGFuZ2VkRXZlbnQoKS5hZGRMaXN0ZW5lcihuZXcgSUV2ZW50 TGlzdGVuZXIoKSB7DQrCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIEBPdmVycmlkZQ0KwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBwdWJsaWMgdm9pZCBldmVudFJhaXNlZChFdmVudCBldiwgT2JqZWN0IHNl bmRlciwgRXZlbnRBcmdzIGFyZ3MpIHsNCsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBp ZiAoIXJ1blZNT25UcnVzdGVkSG9zdEVkaXRvci5hc1JhZGlvQnV0dG9uKCkuZ2V0VmFsdWUoKSAm JiAhaXNBdXRvQXNzaWduRWRpdG9yLmFzUmFkaW9CdXR0b24oKS5nZXRWYWx1ZSgpKQ0KwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHsNCsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIHNwZWNpZmljSG9zdC5zZXRWYWx1ZSh0cnVlLCB0cnVlKTsNCsKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCB9DQrCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0NCsKgwqDCoMKg wqDCoMKgIH0pOw0KKDQpIE1vZGlmeSBVbml0Vm1Nb2RlbC5qYXZhDQrCoCBwcml2YXRlIHZvaWQg UnVuVk1PblRydXN0ZWRIb3N0X0VudGl0eUNoYW5nZWQoT2JqZWN0IHNlbmRlciwgRXZlbnRBcmdz IGFyZ3MpDQrCoMKgIHsNCsKgwqDCoMKgwqDCoMKgIGlmICgoQm9vbGVhbikgZ2V0UnVuVk1PblRy dXN0ZWRIb3N0KCkuZ2V0RW50aXR5KCkgPT0gdHJ1ZSkNCsKgwqDCoMKgwqDCoMKgIHsNCsKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgY2xlYXJBbmREaXNhYmxlKGdldFJ1blZNT25TcGVjaWZpY0hvc3Qo KSk7DQrCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNsZWFyQW5kRGlzYWJsZShnZXRIb3N0Q3B1KCkp Ow0KwqDCoMKgwqDCoMKgwqAgfQ0KwqDCoMKgwqDCoMKgwqAgZWxzZQ0KwqDCoMKgwqDCoMKgwqAg ew0KwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBnZXRSdW5WTU9uU3BlY2lmaWNIb3N0KCkuc2V0SXND aGFuZ2FibGUodHJ1ZSk7DQrCoMKgwqDCoMKgwqDCoCB9DQrCoMKgIMKgwqDCoMKgwqBiZWhhdmlv ci51cGRhdGVDcHVQaW5uaW5nVmlzaWJpbGl0eSgpOw0K44CA44CAfQ0KDQo= --_005_C5A0092C63E939488005F15F736A8112097A57B9SHSMSX101ccrcor_ Content-Type: text/xml; name="AbstractVmPopupWidget.ui.xml" Content-Description: AbstractVmPopupWidget.ui.xml Content-Disposition: attachment; filename="AbstractVmPopupWidget.ui.xml"; size=16078; creation-date="Tue, 12 Mar 2013 08:33:20 GMT"; modification-date="Tue, 12 Mar 2013 08:24:34 GMT" Content-Transfer-Encoding: base64 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSB1aTpVaUJp bmRlciBTWVNURU0gImh0dHA6Ly9kbC5nb29nbGUuY29tL2d3dC9EVEQveGh0bWwuZW50Ij4NCjx1 aTpVaUJpbmRlciB4bWxuczp1aT0idXJuOnVpOmNvbS5nb29nbGUuZ3d0LnVpYmluZGVyIiB4bWxu czpnPSJ1cm46aW1wb3J0OmNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpIg0KICAgICAgICAg ICAgIHhtbG5zOmQ9InVybjppbXBvcnQ6b3JnLm92aXJ0LmVuZ2luZS51aS5jb21tb24ud2lkZ2V0 LmRpYWxvZyINCiAgICAgICAgICAgICB4bWxuczplPSJ1cm46aW1wb3J0Om9yZy5vdmlydC5lbmdp bmUudWkuY29tbW9uLndpZGdldC5lZGl0b3IiDQogICAgICAgICAgICAgeG1sbnM6dD0idXJuOmlt cG9ydDpvcmcub3ZpcnQuZW5naW5lLnVpLmNvbW1vbi53aWRnZXQuZGlhbG9nLnRhYiINCiAgICAg ICAgICAgICB4bWxuczpzPSJ1cm46aW1wb3J0Om9yZy5vdmlydC5lbmdpbmUudWkuY29tbW9uLndp ZGdldC51aWNvbW1vbi5zdG9yYWdlIg0KICAgICAgICAgICAgIHhtbG5zOms9InVybjppbXBvcnQ6 b3JnLm92aXJ0LmVuZ2luZS51aS5jb21tb24ud2lkZ2V0LmZvcm0ua2V5X3ZhbHVlIj4NCg0KICAg IDx1aTp3aXRoIGZpZWxkPSdjb25zdGFudHMnIHR5cGU9J29yZy5vdmlydC5lbmdpbmUudWkuY29t bW9uLkNvbW1vbkFwcGxpY2F0aW9uQ29uc3RhbnRzJy8+DQoNCiAgICA8dWk6c3R5bGUgdHlwZT0i b3JnLm92aXJ0LmVuZ2luZS51aS5jb21tb24ud2lkZ2V0LnVpY29tbW9uLnBvcHVwLkFic3RyYWN0 Vm1Qb3B1cFdpZGdldC5TdHlsZSI+DQoJCS5nZW5lcmFsVGFiVG9wRGVjb3JhdG9yIHsNCgkJCWJh Y2tncm91bmQtY29sb3I6ICNEM0QzRDM7DQoJCQltYXJnaW4tdG9wOiA0cHg7DQoJCQltYXJnaW4t cmlnaHQ6IDNweDsNCgkJCW1hcmdpbi1ib3R0b206IDIwcHg7DQoJCQlwYWRkaW5nLXRvcDogNnB4 Ow0KCQkJcGFkZGluZy1ib3R0b206IDZweDsNCgkJfQ0KDQoJCS5zZWN0aW9uUGFuZWwgew0KCQkJ bWFyZ2luLWJvdHRvbTogMjBweDsNCgkJfQ0KDQoJCS5zZWN0aW9uTGFiZWwgew0KCQkJZm9udC13 ZWlnaHQ6IGJvbGQ7DQoJCQltYXJnaW4tdG9wOiAxMHB4Ow0KCQkJbWFyZ2luLWJvdHRvbTogNXB4 Ow0KCQl9DQoNCgkJLnNlY3Rpb25Db21tZW50IHsNCgkJCW1hcmdpbi10b3A6IDEwcHg7DQoJCQlt YXJnaW4tbGVmdDogNXB4Ow0KCQkJZm9udC1zdHlsZTogaXRhbGljOw0KCQl9DQoNCgkJLmNoZWNr Ym94V2l0aExvbmdMYWJlbCwuY2hlY2tib3ggew0KCQkJbWFyZ2luLWxlZnQ6IC05cHg7DQoJCX0N Cg0KCQkuY2hlY2tib3hXaXRoTG9uZ0xhYmVsIGxhYmVsIHsNCgkJCW1hcmdpbi1sZWZ0OiAyNnB4 Ow0KCQkJbWFyZ2luLXRvcDogLTI2cHg7DQoJCQlkaXNwbGF5OiBibG9jazsNCgkJCWxpbmUtaGVp Z2h0OiAyMHB4Ow0KCQl9DQoNCgkJLmxvbmdDaGVja2JveENvbnRlbnQgew0KCQkJd2lkdGg6IDkw JTsNCgkJfQ0KDQoJCS5wcm92aXNpb25pbmdFZGl0b3Igew0KCQkJcGFkZGluZy1yaWdodDogMjVw eDsNCgkJfQ0KDQoJCS5wcm92aXNpb25pbmdFZGl0b3JDb250ZW50ICB7DQoJCQlkaXNwbGF5OiBu b25lOw0KCQl9DQoNCgkJLnByb3Zpc2lvbmluZ1JhZGlvQ29udGVudCAgew0KCQkJcGFkZGluZy10 b3A6IDNweDsNCgkJCXdpZHRoOiAxMDAlOw0KCQl9DQoNCgkJLmRpc2tzQWxsb2NhdGlvbiB7DQoJ CQlwYWRkaW5nLWxlZnQ6IDVweDsNCgkJCXBhZGRpbmctdG9wOiAxMHB4Ow0KCQl9DQoNCgkJLmRp c2tzQWxsb2NhdGlvblBhbmVsIHsNCgkJCXdpZHRoOiA0OTBweDsNCgkJCXBhZGRpbmctdG9wOiA1 cHg7DQoJCQlwYWRkaW5nLWJvdHRvbTogMTBweDsNCgkJfQ0KDQogICAgICAgIC50ZXh0Qm94IHsN CiAgICAgICAgICAgIHdpZHRoOiAzMHB4Ow0KICAgICAgICAgICAgZmxvYXQ6IHJpZ2h0Ow0KICAg ICAgICB9DQoNCiAgICAgICAgLm51bU9mVm1zTGFiZWwgew0KICAgICAgICAgICAgbWFyZ2luLWxl ZnQ6IDVweDsNCiAgICAgICAgICAgIGNvbG9yOiAjMzMzMzMzOw0KICAgICAgICB9DQoNCiAgICAg ICAgLmFzc2lnbmVkVm1zTGFiZWwgew0KICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDhweDsNCiAg ICAgICAgfQ0KDQogICAgICAgIC5wcmVzdGFydGVkSGludExhYmVsIHsNCiAgICAgICAgICAgIGZv bnQtc2l6ZTogN3B0Ow0KICAgICAgICAgICAgY29sb3I6IGdyYXk7DQogICAgICAgICAgICB0ZXh0 LWFsaWduOiByaWdodDsNCiAgICAgICAgfQ0KDQoJCS5yYWRpb0J1dHRvbiB7DQoNCgkJfQ0KDQoJ CS5yYWRpb0J1dHRvblNwZWNpZmljSG9zdCB7DQogICAgICAgICAgICBtYXJnaW4tbGVmdDogNXB4 Ow0KCQl9DQoNCgkJLnJhZGlvQnV0dG9uUnVuT25UcnVzdGVkSG9zdCB7DQogICAgICAgICAgICBt YXJnaW4tbGVmdDogNXB4Ow0KICAgICAgICAgICAgICAgIH0NCg0KCQkubGFiZWwgew0KCQkJd2lk dGg6IDM1MHB4Ow0KCQl9DQoNCiAgICAgICAgLmxhYmVsRGlzYWJsZWQgew0KICAgICAgICAgICAg Y29sb3I6IGdyYXk7DQogICAgICAgIH0NCg0KCQkucnVuSG9zdFBhbmVsIHsNCg0KCQl9DQoNCgkJ LmF0dGFjaENkUGFuZWwgew0KCQkJd2lkdGg6IDEwMCU7DQoJCX0NCg0KICAgICAgICAuY2RBdHRh Y2hlZExhYmVsV2lkdGggew0KICAgICAgICAgICAgd2lkdGg6IDMwcHg7DQogICAgICAgIH0NCg0K CQkuaG9zdFJ1bk1pZ3JhdGlvbk9wdGlvbnMgew0KCQkJbWFyZ2luLWxlZnQ6IDZweDsNCgkJfQ0K DQoJCS53YXJuaW5nTWVzc2FnZUxhYmVsIHsNCgkJCWNvbG9yOiAjQ0QyMTI3Ow0KCQkJcG9zaXRp b246IGFic29sdXRlOw0KCQkJYm90dG9tOiAxMHB4Ow0KCQl9DQoNCgkJLmV4cGxhbmF0aW9uTGFi ZWwgew0KCQkJZm9udC1zdHlsZTogaXRhbGljOw0KCQkJbWFyZ2luLWxlZnQ6IDQwcHg7DQoJCQlt YXJnaW4tYm90dG9tOiAxMHB4Ow0KCQkJd2lkdGg6IDMwMHB4Ow0KCQl9DQoNCgkJLmNwdVBpbm5p bmdTdHlsZSB7DQoJCX0NCg0KCQkuZXhwYW5kZXJDb250ZW50LC5nZW5lcmFsRXhwYW5kZXJDb250 ZW50IHsNCgkJCXBhZGRpbmctbGVmdDogMTBweDsNCgkJfQ0KCQkNCgkJLmV4cGFuZGVyQ29udGVu dCB7DQoJCQlmbG9hdDogbGVmdDsNCgkJfQ0KDQoJCS53YXJuaW5nTGFiZWwgew0KICAgICAgICAg ICAgY29sb3I6IHJlZDsNCiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgICAgICAg ICAgbWFyZ2luLWJvdHRvbTogMTBweDsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLnBv b2xFZGl0Vm1zIHsNCgkJCWxpbmUtaGVpZ2h0OiAzMHB4Ow0KCQkJcGFkZGluZzogMCA1cHg7DQoJ CQlwYWRkaW5nLWJvdHRvbTogMzVweDsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLnBy ZXN0YXJ0ZWRWbXNFZGl0b3JDb250ZW50IHsNCiAgICAgICAgCXdpZHRoOiAyMzBweDsNCiAgICAg ICAgfQ0KICAgICAgICANCiAgICAgICAgLnByZXN0YXJ0ZWRWbXNFZGl0b3Igew0KICAgICAgICAJ ZmxvYXQ6IHJpZ2h0Ow0KICAgICAgICAJd2lkdGg6IDIzMHB4Ow0KICAgICAgICB9DQogICAgICAg IA0KICAgICAgICAuZWRpdFByZXN0YXJ0ZWRWbXNFZGl0b3Igew0KICAgICAgICAJZmxvYXQ6IGxl ZnQ7DQogICAgICAgIAlwYWRkaW5nLXJpZ2h0OiAxMHB4Ow0KICAgICAgICB9DQogICAgICAgIA0K ICAgICAgICAucHJlc3RhcnRlZFZtc0ljb24gew0KICAgICAgICAJZmxvYXQ6IGxlZnQ7DQogICAg ICAgIAlwYWRkaW5nLXRvcDogNXB4Ow0KICAgICAgICAgICAgcGFkZGluZy1sZWZ0OiAycHg7DQog ICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC5wcmVzdGFydGVkTGFiZWxXaXRoSGVscCB7DQog ICAgICAgIAlmbG9hdDogbGVmdDsNCiAgICAgICAgCXdpZHRoOiAyNTFweDsNCiAgICAgICAgfQ0K DQogICAgICAgIC5pbmNyZWFzZVByZXN0YXJ0ZWRMYWJlbCB7DQogICAgICAgIAlmbG9hdDogbGVm dDsNCiAgICAgICAgCXdpZHRoOiAyNTFweDsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAg LmVpZHRQcmVzdGFydGVkVm1zIHsNCiAgICAgICAgCWZsb2F0OiBsZWZ0Ow0KICAgICAgICAJd2lk dGg6IDIzMHB4Ow0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAuZWlkdEluY3JlYXNlVm1z IHsNCiAgICAgICAgCWZsb2F0OiBsZWZ0Ow0KICAgICAgICAJd2lkdGg6IDIzMHB4Ow0KICAgICAg ICB9DQogICAgICAgIA0KICAgICAgICAucHJlc3RhcnRlZExhYmVsIHsNCiAgICAgICAgCWZsb2F0 OiBsZWZ0Ow0KICAgICAgICAJY29sb3I6ICMzMzMzMzM7DQogICAgICAgIH0NCiAgICAgICAgDQog ICAgICAgIC5pbmNyZWFzZVZtc0luUG9vbFZtcyB7DQogICAgICAgIAlmbG9hdDogbGVmdDsNCiAg ICAgICAgfQ0KICAgICAgICANCgk8L3VpOnN0eWxlPg0KDQoJPHQ6RGlhbG9nVGFiUGFuZWwgd2lk dGg9IjEwMCUiIGhlaWdodD0iMTAwJSI+DQoJCTx0OnRhYj4NCgkJCTx0OkRpYWxvZ1RhYiB1aTpm aWVsZD0iZ2VuZXJhbFRhYiI+DQoJCQkJPHQ6Y29udGVudD4NCgkJCQkJPGc6Rmxvd1BhbmVsPg0K CQkJCQkJPGc6Rmxvd1BhbmVsIGFkZFN0eWxlTmFtZXM9IntzdHlsZS5nZW5lcmFsVGFiVG9wRGVj b3JhdG9yfSI+DQoJCQkJCQkJPGU6TGlzdE1vZGVsTGlzdEJveEVkaXRvciB1aTpmaWVsZD0iZGF0 YUNlbnRlckVkaXRvciIgLz4NCgkJCQkJCQk8ZTpMaXN0TW9kZWxMaXN0Qm94RWRpdG9yIHVpOmZp ZWxkPSJjbHVzdGVyRWRpdG9yIiAvPg0KCQkJCQkJCTxlOkxpc3RNb2RlbExpc3RCb3hFZGl0b3Ig dWk6ZmllbGQ9InF1b3RhRWRpdG9yIiAvPg0KCQkJCQkJPC9nOkZsb3dQYW5lbD4NCgkJCQkJCTxn OkZsb3dQYW5lbCBhZGRTdHlsZU5hbWVzPSJ7c3R5bGUuc2VjdGlvblBhbmVsfSI+DQoJCQkJCQkJ PGU6RW50aXR5TW9kZWxUZXh0Qm94RWRpdG9yIHVpOmZpZWxkPSJuYW1lRWRpdG9yIiAvPg0KCQkJ CQkJCTxlOkVudGl0eU1vZGVsVGV4dEJveEVkaXRvciB1aTpmaWVsZD0iZGVzY3JpcHRpb25FZGl0 b3IiIC8+DQoNCjwhLS0gCQkJCQkJTmV3IFZNIFBvb2wJCQkJCQkJIC0tPg0KCQkJCQkJCTxlOkVu dGl0eU1vZGVsVGV4dEJveEVkaXRvciB1aTpmaWVsZD0ibnVtT2ZWbXNFZGl0b3IiIC8+DQogICAg ICAgICAgICAgICAgICAgICAgICAgICAgPGc6Rmxvd1BhbmVsIHVpOmZpZWxkPSJuZXdQb29sRWRp dFZtc1BhbmVsIiBhZGRTdHlsZU5hbWVzPSJ7c3R5bGUucG9vbEVkaXRWbXN9Ij4NCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAJPGc6Rmxvd1BhbmVsIGFkZFN0eWxlTmFtZXM9IntzdHlsZS5w cmVzdGFydGVkTGFiZWxXaXRoSGVscH0iPg0KCQkJCQkJCQkJPGc6TGFiZWwgdWk6ZmllbGQ9InBy ZXN0YXJ0ZWRMYWJlbCIgYWRkU3R5bGVOYW1lcz0ie3N0eWxlLnByZXN0YXJ0ZWRMYWJlbH0iIC8+ DQoJCQkJCQkJCQk8ZDpJbmZvSWNvbiB1aTpmaWVsZD0ibmV3UG9vbFByZXN0YXJ0ZWRWbXNJY29u IiBhZGRTdHlsZU5hbWVzPSJ7c3R5bGUucHJlc3RhcnRlZFZtc0ljb259IiAvPg0KCQkJCQkJCQk8 L2c6Rmxvd1BhbmVsPg0KCQkJCQkJCQk8ZTpFbnRpdHlNb2RlbFRleHRCb3hPbmx5RWRpdG9yIHVp OmZpZWxkPSJwcmVzdGFydGVkVm1zRWRpdG9yIiBhZGRTdHlsZU5hbWVzPSJ7c3R5bGUucHJlc3Rh cnRlZFZtc0VkaXRvcn0iIGNvbnRlbnRXaWRnZXRTdHlsZU5hbWU9IntzdHlsZS5wcmVzdGFydGVk Vm1zRWRpdG9yQ29udGVudH0iIC8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nOkZs b3dQYW5lbD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICANCjwhLS0gICAgICAgICAgICAg ICAgICAgICAgICAgICAgIEVkaXQgVk0gUG9vbCAtLT4NCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICA8ZzpGbG93UGFuZWwgYWRkU3R5bGVOYW1lcz0ie3N0eWxlLnBvb2xFZGl0Vm1zfSIgdWk6 ZmllbGQ9ImVkaXRQb29sRWRpdFZtc1BhbmVsIj4NCgkJCQkJCQkJPGc6Rmxvd1BhbmVsIGFkZFN0 eWxlTmFtZXM9IntzdHlsZS5wcmVzdGFydGVkTGFiZWxXaXRoSGVscH0iPg0KCQkJCQkJCQkJPGc6 TGFiZWwgdWk6ZmllbGQ9ImVkaXRQcmVzdGFydGVkVm1zTGFiZWwiIGFkZFN0eWxlTmFtZXM9Intz dHlsZS5wcmVzdGFydGVkTGFiZWx9IiAvPg0KCQkJCQkJCQkJPGQ6SW5mb0ljb24gdWk6ZmllbGQ9 ImVkaXRQb29sUHJlc3RhcnRlZFZtc0ljb24iIGFkZFN0eWxlTmFtZXM9IntzdHlsZS5wcmVzdGFy dGVkVm1zSWNvbn0iIC8+DQoJCQkJCQkJCTwvZzpGbG93UGFuZWw+DQoJCQkJCQkJCTxnOkZsb3dQ YW5lbCBhZGRTdHlsZU5hbWVzPSJ7c3R5bGUuZWlkdFByZXN0YXJ0ZWRWbXN9Ij4NCgkJCQkJCQkJ CTxlOkVudGl0eU1vZGVsVGV4dEJveE9ubHlFZGl0b3IgdWk6ZmllbGQ9ImVkaXRQcmVzdGFydGVk Vm1zRWRpdG9yIiBhZGRTdHlsZU5hbWVzPSJ7c3R5bGUuZWRpdFByZXN0YXJ0ZWRWbXNFZGl0b3J9 IiBjb250ZW50V2lkZ2V0U3R5bGVOYW1lPSJ7c3R5bGUudGV4dEJveH0iIC8+DQoJCQkJCQkJCQk8 ZzpWYWx1ZUxhYmVsIHVpOmZpZWxkPSJvdXRPZnhJblBvb2wiIC8+DQoJCQkJCQkJCTwvZzpGbG93 UGFuZWw+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nOkZsb3dQYW5lbD4NCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZzpG bG93UGFuZWwgdWk6ZmllbGQ9ImVkaXRQb29sSW5jcmFzZU51bU9mVm1zUGFuZWwiIGFkZFN0eWxl TmFtZXM9IntzdHlsZS5wb29sRWRpdFZtc30iPg0KCQkJCQkJCQk8ZzpMYWJlbCB0ZXh0PSJ7Y29u c3RhbnRzLmluY3JlYXNlTnVtYmVyT2ZWTXNJblBvb2xCeX0iIGFkZFN0eWxlTmFtZXM9IntzdHls ZS5pbmNyZWFzZVByZXN0YXJ0ZWRMYWJlbH0iIC8+DQoJCQkJCQkJCTxnOkZsb3dQYW5lbCBhZGRT dHlsZU5hbWVzPSJ7c3R5bGUuZWlkdEluY3JlYXNlVm1zfSI+DQoJCQkJCQkJCQk8ZTpFbnRpdHlN b2RlbFRleHRCb3hPbmx5RWRpdG9yIHVpOmZpZWxkPSJpbmNyYXNlTnVtT2ZWbXNFZGl0b3IiIGFk ZFN0eWxlTmFtZXM9IntzdHlsZS5lZGl0UHJlc3RhcnRlZFZtc0VkaXRvcn0iIGNvbnRlbnRXaWRn ZXRTdHlsZU5hbWU9IntzdHlsZS50ZXh0Qm94fSIgLz4NCgkJCQkJCQkJCTxnOkxhYmVsIHRleHQ9 Intjb25zdGFudHMudm1zfSIgYWRkU3R5bGVOYW1lcz0ie3N0eWxlLmluY3JlYXNlVm1zSW5Qb29s Vm1zfSIgLz4NCgkJCQkJCQkJPC9nOkZsb3dQYW5lbD4NCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICA8L2c6Rmxvd1BhbmVsPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlOkxpc3RN b2RlbExpc3RCb3hFZGl0b3IgdWk6ZmllbGQ9InRlbXBsYXRlRWRpdG9yIi8+DQogICAgICAgICAg ICAgICAgICAgICAgICA8L2c6Rmxvd1BhbmVsPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGc6 Rmxvd1BhbmVsIGFkZFN0eWxlTmFtZXM9IntzdHlsZS5zZWN0aW9uUGFuZWx9Ij4NCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICA8ZTpFbnRpdHlNb2RlbFRleHRCb3hFZGl0b3IgdWk6ZmllbGQ9 Im1lbVNpemVFZGl0b3IiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZTpFbnRpdHlN b2RlbFRleHRCb3hFZGl0b3IgdWk6ZmllbGQ9InRvdGFsdkNQVXNFZGl0b3IiIC8+DQoJCQkJCQkJ PGc6Rmxvd1BhbmVsIGFkZFN0eWxlTmFtZXM9IntzdHlsZS5zZWN0aW9uUGFuZWx9Ij4NCgkJCQkJ CQkJPGQ6QWR2YW5jZWRQYXJhbWV0ZXJzRXhwYW5kZXIgdWk6ZmllbGQ9ImdlbmVyYWxBZHZhbmNl ZFBhcmFtZXRlckV4cGFuZGVyIi8+DQoJCQkJCQkJCTxnOkZsb3dQYW5lbCB1aTpmaWVsZD0iZ2Vu ZXJhbEFkdmFuY2VkUGFyYW1ldGVyRXhwYW5kZXJDb250ZW50IiBhZGRTdHlsZU5hbWVzPSJ7c3R5 bGUuZ2VuZXJhbEV4cGFuZGVyQ29udGVudH0iPg0KCQkJCQkJCQkJPGU6TGlzdE1vZGVsTGlzdEJv eEVkaXRvciB1aTpmaWVsZD0iY29yZVBlclNvY2tldEVkaXRvciIgLz4NCgkJCQkJCQkJCTxlOkxp c3RNb2RlbExpc3RCb3hFZGl0b3IgdWk6ZmllbGQ9Im51bU9mU29ja2V0c0VkaXRvciIgLz4NCgkJ CQkJCQkJPC9nOkZsb3dQYW5lbD4NCgkJCQkJCQk8L2c6Rmxvd1BhbmVsPg0KCQkJCQkJPC9nOkZs b3dQYW5lbD4NCgkJCQkJCTxnOkZsb3dQYW5lbCBhZGRTdHlsZU5hbWVzPSJ7c3R5bGUuc2VjdGlv blBhbmVsfSI+DQoJCQkJCQkJPGU6TGlzdE1vZGVsTGlzdEJveEVkaXRvciB1aTpmaWVsZD0ib1NU eXBlRWRpdG9yIiAvPg0KCQkJCQkJCTxlOkVudGl0eU1vZGVsQ2hlY2tCb3hFZGl0b3IgdWk6Zmll bGQ9ImlzU3RhdGVsZXNzRWRpdG9yIiBhZGRTdHlsZU5hbWVzPSJ7c3R5bGUuY2hlY2tib3h9IiAv Pg0KCQkJCQkJCTxlOkVudGl0eU1vZGVsQ2hlY2tCb3hFZGl0b3IgdWk6ZmllbGQ9ImlzRGVsZXRl UHJvdGVjdGVkRWRpdG9yIiBhZGRTdHlsZU5hbWVzPSJ7c3R5bGUuY2hlY2tib3h9IiAvPg0KCQkJ CQkJPC9nOkZsb3dQYW5lbD4NCgkJCQkJCTxnOkZsb3dQYW5lbCBhZGRTdHlsZU5hbWVzPSJ7c3R5 bGUuc2VjdGlvblBhbmVsfSI+DQoJCQkJCQkJDQoJCQkJCQk8L2c6Rmxvd1BhbmVsPg0KCQkJCQkJ PGc6TGFiZWwgdWk6ZmllbGQ9ImdlbmVyYWxXYXJuaW5nTWVzc2FnZSIgYWRkU3R5bGVOYW1lcz0i e3N0eWxlLndhcm5pbmdNZXNzYWdlTGFiZWx9IiAvPg0KCQkJCQk8L2c6Rmxvd1BhbmVsPg0KCQkJ CTwvdDpjb250ZW50Pg0KCQkJPC90OkRpYWxvZ1RhYj4NCgkJPC90OnRhYj4NCgkJPHQ6dGFiPg0K CQkJPHQ6RGlhbG9nVGFiIHVpOmZpZWxkPSJwb29sVGFiIj4NCgkJCQk8dDpjb250ZW50Pg0KCQkJ CQk8ZzpGbG93UGFuZWw+DQoJCQkJCQk8ZTpMaXN0TW9kZWxMaXN0Qm94RWRpdG9yIHVpOmZpZWxk PSJwb29sVHlwZUVkaXRvciIgLz4NCgkJCQkJPC9nOkZsb3dQYW5lbD4NCgkJCQk8L3Q6Y29udGVu dD4NCgkJCTwvdDpEaWFsb2dUYWI+DQoJCTwvdDp0YWI+DQoJCTx0OnRhYj4NCgkJICAgICAgIDx0 OkRpYWxvZ1RhYiB1aTpmaWVsZD0iaW5pdGlhbFJ1blRhYiI+DQoJCQkJPHQ6Y29udGVudD4NCgkJ CQkJPGc6Rmxvd1BhbmVsPg0KCQkJCSAgICAgIAkgICAgICAgIDxnOkxhYmVsIGFkZFN0eWxlTmFt ZXM9IntzdHlsZS5zZWN0aW9uTGFiZWx9IiB0ZXh0PSJ7Y29uc3RhbnRzLmluaXRpYWxSdW5HZW5l cmFsfSIgLz4NCgkJCQkJICAgICAgICA8ZTpMaXN0TW9kZWxMaXN0Qm94RWRpdG9yIHVpOmZpZWxk PSJ0aW1lWm9uZUVkaXRvciIgLz4NCgkJCQkJCTxnOkxhYmVsIGFkZFN0eWxlTmFtZXM9IntzdHls ZS5zZWN0aW9uTGFiZWx9IiB0ZXh0PSJ7Y29uc3RhbnRzLmluaXRpYWxSdW5XaW5kb3dzfSIgLz4N CgkJCQkJCTxlOkxpc3RNb2RlbExpc3RCb3hFZGl0b3IgdWk6ZmllbGQ9ImRvbWFpbkVkaXRvciIg Lz4NCgkJCQkJPC9nOkZsb3dQYW5lbD4NCgkJCQk8L3Q6Y29udGVudD4NCgkJCTwvdDpEaWFsb2dU YWI+DQoJCTwvdDp0YWI+DQoJCTx0OnRhYj4NCgkJCTx0OkRpYWxvZ1RhYiB1aTpmaWVsZD0iY29u c29sZVRhYiI+DQoJCQkJPHQ6Y29udGVudD4NCgkJCQkJPGc6Rmxvd1BhbmVsPg0KCQkJCQkJPGU6 TGlzdE1vZGVsTGlzdEJveEVkaXRvciB1aTpmaWVsZD0iZGlzcGxheVByb3RvY29sRWRpdG9yIiAv Pg0KCQkJCQkJPGU6TGlzdE1vZGVsTGlzdEJveEVkaXRvciB1aTpmaWVsZD0idXNiU3VwcG9ydEVk aXRvciIgLz4NCgkJCQkJCTxlOkxpc3RNb2RlbExpc3RCb3hFZGl0b3IgdWk6ZmllbGQ9Im51bU9m TW9uaXRvcnNFZGl0b3IiIC8+DQoJCQkJCQk8ZTpFbnRpdHlNb2RlbENoZWNrQm94RWRpdG9yIHVp OmZpZWxkPSJpc1NtYXJ0Y2FyZEVuYWJsZWRFZGl0b3IiIGFkZFN0eWxlTmFtZXM9IntzdHlsZS5j aGVja2JveH0iIC8+DQoJCQkJCQk8ZzpMYWJlbCB1aTpmaWVsZD0ibmF0aXZlVXNiV2FybmluZ01l c3NhZ2UiIHRleHQ9Intjb25zdGFudHMubmF0aXZlVXNiU3VwcG9ydFdhcm5pbmd9IiBhZGRTdHls ZU5hbWVzPSJ7c3R5bGUud2FybmluZ01lc3NhZ2VMYWJlbH0iIC8+DQoJCQkJCQk8ZDpBZHZhbmNl ZFBhcmFtZXRlcnNFeHBhbmRlciB1aTpmaWVsZD0iZXhwYW5kZXIiLz4NCgkJCQkJCTxnOkZsb3dQ YW5lbCB1aTpmaWVsZD0iZXhwYW5kZXJDb250ZW50IiBhZGRTdHlsZU5hbWVzPSJ7c3R5bGUuZXhw YW5kZXJDb250ZW50fSI+DQoJCQkJCQkJPGc6TGFiZWwgYWRkU3R5bGVOYW1lcz0ie3N0eWxlLndh cm5pbmdMYWJlbH0iIHRleHQ9Intjb25zdGFudHMuYWR2YW5jZWRPcHRpb25zTGFiZWx9IiAvPg0K CQkJCQkJCTxlOkVudGl0eU1vZGVsQ2hlY2tCb3hFZGl0b3IgdWk6ZmllbGQ9ImFsbG93Q29uc29s ZVJlY29ubmVjdEVkaXRvciIgYWRkU3R5bGVOYW1lcz0ie3N0eWxlLmNoZWNrYm94V2l0aExvbmdM YWJlbH0iIC8+DQoJCQkJCQk8L2c6Rmxvd1BhbmVsPg0KCQkJCQk8L2c6Rmxvd1BhbmVsPg0KCQkJ CTwvdDpjb250ZW50Pg0KCQkJPC90OkRpYWxvZ1RhYj4NCgkJPC90OnRhYj4NCgkJPHQ6dGFiPg0K CQkJPHQ6RGlhbG9nVGFiIHVpOmZpZWxkPSJob3N0VGFiIj4NCgkJCQk8dDpjb250ZW50Pg0KCQkJ CQk8ZzpGbG93UGFuZWw+DQoJCQkJCQk8ZzpMYWJlbCBhZGRTdHlsZU5hbWVzPSJ7c3R5bGUuc2Vj dGlvbkxhYmVsfSIgdGV4dD0ie2NvbnN0YW50cy5ydW5PblZtUG9wdXB9IiAvPg0KCQkJCQkJPGc6 VmVydGljYWxQYW5lbCBhZGRTdHlsZU5hbWVzPSJ7c3R5bGUucnVuSG9zdFBhbmVsfSIgdmVydGlj YWxBbGlnbm1lbnQ9J0FMSUdOX01JRERMRSc+DQoJCQkJCQkJPGU6RW50aXR5TW9kZWxSYWRpb0J1 dHRvbkVkaXRvciB3aWR0aD0iMTUwcHgiIHVpOmZpZWxkPSJpc0F1dG9Bc3NpZ25FZGl0b3IiDQoJ CQkJCQkJCWFkZFN0eWxlTmFtZXM9IntzdHlsZS5yYWRpb0J1dHRvbn0iIC8+DQogICAgICAgICAg ICAgICAgICAgICAgICAgICAgPGc6SG9yaXpvbnRhbFBhbmVsIHZlcnRpY2FsQWxpZ25tZW50PSdB TElHTl9NSURETEUnPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZzpSYWRpb0J1 dHRvbiB1aTpmaWVsZD0ic3BlY2lmaWNIb3N0IiBhZGRTdHlsZU5hbWVzPSJ7c3R5bGUucmFkaW9C dXR0b25TcGVjaWZpY0hvc3R9IiAvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8 ZzpMYWJlbCB1aTpmaWVsZD0ic3BlY2lmaWNIb3N0TGFiZWwiIHRleHQ9Intjb25zdGFudHMuc3Bl Y2lmaWNWbVBvcHVwfSIgLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGU6TGlz dE1vZGVsTGlzdEJveEVkaXRvciB1aTpmaWVsZD0iZGVmYXVsdEhvc3RFZGl0b3IiIC8+DQogICAg ICAgICAgICAgICAgICAgICAgICAgICAgPC9nOkhvcml6b250YWxQYW5lbD4NCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICA8ZzpIb3Jpem9udGFsUGFuZWwgdmVydGljYWxBbGlnbm1lbnQ9J0FM SUdOX01JRERMRSc+DQoJCQkJCQkJPGU6RW50aXR5TW9kZWxSYWRpb0J1dHRvbkVkaXRvciB3aWR0 aD0iMTUwcHgiIHVpOmZpZWxkPSJydW5WTU9uVHJ1c3RlZEhvc3RFZGl0b3IiDQoJCQkJCQkJCWFk ZFN0eWxlTmFtZXM9IntzdHlsZS5yYWRpb0J1dHRvbn0iIC8+DQogICAgICAgICAgICAgICAgICAg ICAgICAgICAgPC9nOkhvcml6b250YWxQYW5lbD4NCgkJCQkJCTwvZzpWZXJ0aWNhbFBhbmVsPg0K CQkJCQkJPGc6TGFiZWwgYWRkU3R5bGVOYW1lcz0ie3N0eWxlLnNlY3Rpb25MYWJlbH0iIHRleHQ9 Intjb25zdGFudHMucnVuTWlncmF0aW9uT3B0aW9uc1ZtUG9wdXB9IiAvPg0KCQkJCQkJPGc6VmVy dGljYWxQYW5lbCB3aWR0aD0iMTAwJSIgYWRkU3R5bGVOYW1lcz0ie3N0eWxlLmhvc3RSdW5NaWdy YXRpb25PcHRpb25zfSI+DQoJCQkJCQkJPGU6RW50aXR5TW9kZWxDaGVja0JveEVkaXRvciB1aTpm aWVsZD0icnVuVk1PblNwZWNpZmljSG9zdEVkaXRvciIgYWRkU3R5bGVOYW1lcz0ie3N0eWxlLmNo ZWNrYm94fSIgLz4NCgkJCQkJCQk8ZTpFbnRpdHlNb2RlbENoZWNrQm94RWRpdG9yIHVpOmZpZWxk PSJob3N0Q3B1RWRpdG9yIiBhZGRTdHlsZU5hbWVzPSJ7c3R5bGUuY2hlY2tib3h9IiAvPg0KCQkJ CQkJCTxlOkVudGl0eU1vZGVsQ2hlY2tCb3hFZGl0b3IgdWk6ZmllbGQ9ImRvbnRNaWdyYXRlVk1F ZGl0b3IiIGFkZFN0eWxlTmFtZXM9IntzdHlsZS5jaGVja2JveFdpdGhMb25nTGFiZWx9IiAvPg0K CQkJCQkJPC9nOlZlcnRpY2FsUGFuZWw+DQoJCQkJCQk8ZTpFbnRpdHlNb2RlbFRleHRCb3hFZGl0 b3IgdWk6ZmllbGQ9ImNwdVBpbm5pbmciIGFkZFN0eWxlTmFtZXM9IntzdHlsZS5jcHVQaW5uaW5n U3R5bGV9Ii8+DQoJCQkJCQk8ZzpIVE1MIHVpOmZpZWxkPSJjcHVQaW5uaW5nTGFiZWwiIGFkZFN0 eWxlTmFtZXM9IntzdHlsZS5leHBsYW5hdGlvbkxhYmVsfSxnZW5lcmFsRGlhbG9nQ29tbWVudCIg Lz4NCgkJCQkJPC9nOkZsb3dQYW5lbD4NCgkJCQk8L3Q6Y29udGVudD4NCgkJCTwvdDpEaWFsb2dU YWI+DQoJCTwvdDp0YWI+DQoJCTx0OnRhYj4NCgkJCTx0OkRpYWxvZ1RhYiB1aTpmaWVsZD0iaGln aEF2YWlsYWJpbGl0eVRhYiI+DQoJCQkJPHQ6Y29udGVudD4NCgkJCQkJPGc6Rmxvd1BhbmVsPg0K CQkJCQkJPGc6Rmxvd1BhbmVsIGFkZFN0eWxlTmFtZXM9IntzdHlsZS5zZWN0aW9uUGFuZWx9Ij4N CgkJCQkJCQk8ZTpFbnRpdHlNb2RlbENoZWNrQm94RWRpdG9yIHVpOmZpZWxkPSJpc0hpZ2hseUF2 YWlsYWJsZUVkaXRvciIgYWRkU3R5bGVOYW1lcz0ie3N0eWxlLmNoZWNrYm94fSIgLz4NCgkJCQkJ CTwvZzpGbG93UGFuZWw+DQoJCQkJCQk8ZzpGbG93UGFuZWwgYWRkU3R5bGVOYW1lcz0ie3N0eWxl LnNlY3Rpb25QYW5lbH0iPg0KCQkJCQkJCTxnOkxhYmVsIGFkZFN0eWxlTmFtZXM9IntzdHlsZS5z ZWN0aW9uTGFiZWx9IiB0ZXh0PSJ7Y29uc3RhbnRzLnByaW9yRm9yUnVuTWlncmF0aW9uUXVldWVW bVBvcHVwfSIgLz4NCgkJCQkJCQk8ZTpFbnRpdHlNb2RlbENlbGxUYWJsZSB1aTpmaWVsZD0icHJp b3JpdHlFZGl0b3IiIC8+DQoJCQkJCQk8L2c6Rmxvd1BhbmVsPg0KCQkJCQk8L2c6Rmxvd1BhbmVs Pg0KCQkJCTwvdDpjb250ZW50Pg0KCQkJPC90OkRpYWxvZ1RhYj4NCgkJPC90OnRhYj4NCgkJPHQ6 dGFiPg0KCQkJPHQ6RGlhbG9nVGFiIHVpOmZpZWxkPSJyZXNvdXJjZUFsbG9jYXRpb25UYWIiPg0K CQkJCTx0OmNvbnRlbnQ+DQoJCQkJCTxnOkZsb3dQYW5lbD4NCgkJCQkJCTxnOkZsb3dQYW5lbCBh ZGRTdHlsZU5hbWVzPSJ7c3R5bGUuc2VjdGlvblBhbmVsfSI+DQoJCQkJCQkJPGc6TGFiZWwgYWRk U3R5bGVOYW1lcz0ie3N0eWxlLnNlY3Rpb25MYWJlbH0iIHRleHQ9Intjb25zdGFudHMubWVtQWxs b2NWbVBvcHVwfSIgLz4NCgkJCQkJCQk8ZTpFbnRpdHlNb2RlbFRleHRCb3hFZGl0b3IgdWk6Zmll bGQ9Im1pbkFsbG9jYXRlZE1lbW9yeUVkaXRvciIgLz4NCgkJCQkJCTwvZzpGbG93UGFuZWw+DQoJ CQkJCQk8ZzpGbG93UGFuZWwgdWk6ZmllbGQ9InN0b3JhZ2VBbGxvY2F0aW9uUGFuZWwiIGFkZFN0 eWxlTmFtZXM9IntzdHlsZS5zZWN0aW9uUGFuZWx9Ij4NCgkJCQkJCQk8ZzpIb3Jpem9udGFsUGFu ZWw+DQoJCQkJCQkJCTxnOkxhYmVsIGFkZFN0eWxlTmFtZXM9IntzdHlsZS5zZWN0aW9uTGFiZWx9 IiB0ZXh0PSJ7Y29uc3RhbnRzLnN0b3JhZ2VBbGxvY1ZtUG9wdXB9IiAvPg0KCQkJCQkJCQk8ZzpM YWJlbCBhZGRTdHlsZU5hbWVzPSJ7c3R5bGUuc2VjdGlvbkNvbW1lbnR9IiB0ZXh0PSJ7Y29uc3Rh bnRzLmF2YWlsT25seVRlbXBsU2VsZWN0ZWRWbVBvcHVwfSIgLz4NCgkJCQkJCQk8L2c6SG9yaXpv bnRhbFBhbmVsPg0KCQkJCQkJCTxnOkhvcml6b250YWxQYW5lbCB1aTpmaWVsZD0icHJvdmlzaW9u U2VsZWN0aW9uUGFuZWwiPg0KCQkJCQkJCQk8ZTpMaXN0TW9kZWxMaXN0Qm94RWRpdG9yIHVpOmZp ZWxkPSJwcm92aXNpb25pbmdFZGl0b3IiIGFkZFN0eWxlTmFtZXM9IntzdHlsZS5wcm92aXNpb25p bmdFZGl0b3J9IiAvPg0KCQkJCQkJCQk8ZzpWZXJ0aWNhbFBhbmVsPg0KCQkJCQkJCQkJPGU6RW50 aXR5TW9kZWxSYWRpb0J1dHRvbkVkaXRvciB1aTpmaWVsZD0icHJvdmlzaW9uaW5nVGhpbkVkaXRv ciIvPg0KCQkJCQkJCQkJPGU6RW50aXR5TW9kZWxSYWRpb0J1dHRvbkVkaXRvciB1aTpmaWVsZD0i cHJvdmlzaW9uaW5nQ2xvbmVFZGl0b3IiLz4NCgkJCQkJCQkJPC9nOlZlcnRpY2FsUGFuZWw+DQoJ CQkJCQkJPC9nOkhvcml6b250YWxQYW5lbD4NCgkJCQkJCQk8ZzpGbG93UGFuZWwgdWk6ZmllbGQ9 ImRpc2tzQWxsb2NhdGlvblBhbmVsIj4NCgkJCQkJCQk8ZzpMYWJlbCB1aTpmaWVsZD0iZGlza3NB bGxvY2F0aW9uTGFiZWwiIHRleHQ9Intjb25zdGFudHMuZGlza3NBbGxvY2F0aW9ufSIgIGFkZFN0 eWxlTmFtZXM9IntzdHlsZS5kaXNrc0FsbG9jYXRpb259IiB2aXNpYmxlPSJmYWxzZSIgLz4NCgkJ CQkJCQkJPGc6VmVydGljYWxQYW5lbD4NCgkJCQkJCQkJCTxzOkRpc2tzQWxsb2NhdGlvblZpZXcg dWk6ZmllbGQ9ImRpc2tzQWxsb2NhdGlvblZpZXciIGxpc3RIZWlnaHQ9IjE3MHB4IiBsaXN0V2lk dGg9IjQ5MHB4IiBzaG93Vm9sdW1lVHlwZT0idHJ1ZSIgYWRkU3R5bGVOYW1lcz0ie3N0eWxlLmRp c2tzQWxsb2NhdGlvblBhbmVsfSIgLz4NCgkJCQkJCQkJPC9nOlZlcnRpY2FsUGFuZWw+DQoJCQkJ CQkJPC9nOkZsb3dQYW5lbD4NCgkJCQkJCTwvZzpGbG93UGFuZWw+DQoJCQkJCTwvZzpGbG93UGFu ZWw+DQoJCQkJPC90OmNvbnRlbnQ+DQoJCQk8L3Q6RGlhbG9nVGFiPg0KCQk8L3Q6dGFiPg0KCQk8 dDp0YWI+DQoJCQk8dDpEaWFsb2dUYWIgdWk6ZmllbGQ9ImJvb3RPcHRpb25zVGFiIj4NCgkJCQk8 dDpjb250ZW50Pg0KCQkJCQk8ZzpGbG93UGFuZWw+DQoJCQkJCQk8ZzpGbG93UGFuZWwgYWRkU3R5 bGVOYW1lcz0ie3N0eWxlLnNlY3Rpb25QYW5lbH0iPg0KCQkJCQkJCTxnOkxhYmVsIGFkZFN0eWxl TmFtZXM9IntzdHlsZS5zZWN0aW9uTGFiZWx9IiB0ZXh0PSJ7Y29uc3RhbnRzLmJvb3RTZXF1ZW5j ZVZtUG9wdXB9IiAvPg0KCQkJCQkJCTxlOkxpc3RNb2RlbExpc3RCb3hFZGl0b3IgdWk6ZmllbGQ9 ImZpcnN0Qm9vdERldmljZUVkaXRvciIgLz4NCgkJCQkJCQk8ZTpMaXN0TW9kZWxMaXN0Qm94RWRp dG9yIHVpOmZpZWxkPSJzZWNvbmRCb290RGV2aWNlRWRpdG9yIiAvPg0KCQkJCQkJCTxnOkhvcml6 b250YWxQYW5lbCBhZGRTdHlsZU5hbWVzPSJ7c3R5bGUuYXR0YWNoQ2RQYW5lbH0iIHZlcnRpY2Fs QWxpZ25tZW50PSJBTElHTl9NSURETEUiPg0KCQkJCQkJCQk8ZTpFbnRpdHlNb2RlbENoZWNrQm94 RWRpdG9yIGxhYmVsPSJ7Y29uc3RhbnRzLmF0dGFjaENkVm1Qb3B1cH0iIHVpOmZpZWxkPSJjZEF0 dGFjaGVkRWRpdG9yIiAvPg0KCQkJCQkJCQk8ZTpMaXN0TW9kZWxMaXN0Qm94RWRpdG9yIHVpOmZp ZWxkPSJjZEltYWdlRWRpdG9yIiAvPg0KCQkJCQkJCTwvZzpIb3Jpem9udGFsUGFuZWw+DQoJCQkJ CQk8L2c6Rmxvd1BhbmVsPg0KCQkJCQkJPGc6Rmxvd1BhbmVsIHVpOmZpZWxkPSJsaW51eEJvb3RP cHRpb25zUGFuZWwiIGFkZFN0eWxlTmFtZXM9IntzdHlsZS5zZWN0aW9uUGFuZWx9Ij4NCgkJCQkJ CQk8ZzpMYWJlbCBhZGRTdHlsZU5hbWVzPSJ7c3R5bGUuc2VjdGlvbkxhYmVsfSIgdGV4dD0ie2Nv bnN0YW50cy5saW51eEJvb3RPcHRpb25zVm1Qb3B1cH0iIC8+DQoJCQkJCQkJPGU6RW50aXR5TW9k ZWxUZXh0Qm94RWRpdG9yIHVpOmZpZWxkPSJrZXJuZWxfcGF0aEVkaXRvciIgLz4NCgkJCQkJCQk8 ZTpFbnRpdHlNb2RlbFRleHRCb3hFZGl0b3IgdWk6ZmllbGQ9ImluaXRyZF9wYXRoRWRpdG9yIiAv Pg0KCQkJCQkJCTxlOkVudGl0eU1vZGVsVGV4dEJveEVkaXRvciB1aTpmaWVsZD0ia2VybmVsX3Bh cmFtZXRlcnNFZGl0b3IiIC8+DQoJCQkJCQk8L2c6Rmxvd1BhbmVsPg0KCQkJCQk8L2c6Rmxvd1Bh bmVsPg0KCQkJCTwvdDpjb250ZW50Pg0KCQkJPC90OkRpYWxvZ1RhYj4NCgkJPC90OnRhYj4NCgkJ PHQ6dGFiPg0KCQkJPHQ6RGlhbG9nVGFiIHVpOmZpZWxkPSJjdXN0b21Qcm9wZXJ0aWVzVGFiIj4N CgkJCQk8dDpjb250ZW50Pg0KCQkJCQk8ZzpGbG93UGFuZWw+DQogICAgICAgICAgICAgICAgICAg ICAgICA8azpLZXlWYWx1ZVdpZGdldCB1aTpmaWVsZD0iY3VzdG9tUHJvcGVydGllc1NoZWV0RWRp dG9yIi8+DQoJCQkJCTwvZzpGbG93UGFuZWw+DQoJCQkJPC90OmNvbnRlbnQ+DQoJCQk8L3Q6RGlh bG9nVGFiPg0KCQk8L3Q6dGFiPg0KCTwvdDpEaWFsb2dUYWJQYW5lbD4NCg0KPC91aTpVaUJpbmRl cj4NCg== --_005_C5A0092C63E939488005F15F736A8112097A57B9SHSMSX101ccrcor_ Content-Type: application/octet-stream; name="UnitVmModel.java" Content-Description: UnitVmModel.java Content-Disposition: attachment; filename="UnitVmModel.java"; size=75481; creation-date="Tue, 12 Mar 2013 08:33:20 GMT"; modification-date="Tue, 12 Mar 2013 08:25:07 GMT" Content-Transfer-Encoding: base64 cGFja2FnZSBvcmcub3ZpcnQuZW5naW5lLnVpLnVpY29tbW9ud2ViLm1vZGVscy52bXM7CgppbXBv cnQgamF2YS51dGlsLkFycmF5TGlzdDsKaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CmltcG9ydCBq YXZhLnV0aWwuQ29sbGVjdGlvbnM7CmltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKaW1wb3J0 IGphdmEudXRpbC5EYXRlOwppbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CmltcG9ydCBqYXZhLnV0 aWwuTGlzdDsKCmltcG9ydCBvcmcub3ZpcnQuZW5naW5lLmNvcmUuY29tbW9uLmJ1c2luZXNzZW50 aXRpZXMuQm9vdFNlcXVlbmNlOwppbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS5jb3JlLmNvbW1vbi5i dXNpbmVzc2VudGl0aWVzLkRpc3BsYXlUeXBlOwppbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS5jb3Jl LmNvbW1vbi5idXNpbmVzc2VudGl0aWVzLlF1b3RhRW5mb3JjZW1lbnRUeXBlRW51bTsKaW1wb3J0 IG9yZy5vdmlydC5lbmdpbmUuY29yZS5jb21tb24uYnVzaW5lc3NlbnRpdGllcy5Vc2JQb2xpY3k7 CmltcG9ydCBvcmcub3ZpcnQuZW5naW5lLmNvcmUuY29tbW9uLmJ1c2luZXNzZW50aXRpZXMuVkRT OwppbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS5jb3JlLmNvbW1vbi5idXNpbmVzc2VudGl0aWVzLlZE U0dyb3VwOwppbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS5jb3JlLmNvbW1vbi5idXNpbmVzc2VudGl0 aWVzLlZtT3NUeXBlOwppbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS5jb3JlLmNvbW1vbi5idXNpbmVz c2VudGl0aWVzLlZtVHlwZTsKaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUuY29yZS5jb21tb24uYnVz aW5lc3NlbnRpdGllcy5zdG9yYWdlX2RvbWFpbnM7CmltcG9ydCBvcmcub3ZpcnQuZW5naW5lLmNv cmUuY29tbW9uLmJ1c2luZXNzZW50aXRpZXMuc3RvcmFnZV9wb29sOwppbXBvcnQgb3JnLm92aXJ0 LmVuZ2luZS5jb3JlLmNvbW1vbi5xdWVyaWVzLlZkY1F1ZXJ5VHlwZTsKaW1wb3J0IG9yZy5vdmly dC5lbmdpbmUuY29yZS5jb21wYXQuRXZlbnQ7CmltcG9ydCBvcmcub3ZpcnQuZW5naW5lLmNvcmUu Y29tcGF0LkV2ZW50QXJnczsKaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUuY29yZS5jb21wYXQuR3Vp ZDsKaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUuY29yZS5jb21wYXQuSUV2ZW50TGlzdGVuZXI7Cmlt cG9ydCBvcmcub3ZpcnQuZW5naW5lLmNvcmUuY29tcGF0Lk5HdWlkOwppbXBvcnQgb3JnLm92aXJ0 LmVuZ2luZS5jb3JlLmNvbXBhdC5Qcm9wZXJ0eUNoYW5nZWRFdmVudEFyZ3M7CmltcG9ydCBvcmcu b3ZpcnQuZW5naW5lLmNvcmUuY29tcGF0LlN0cmluZ0hlbHBlcjsKaW1wb3J0IG9yZy5vdmlydC5l bmdpbmUuY29yZS5jb21wYXQuVmVyc2lvbjsKaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUudWkuZnJv bnRlbmQuQXN5bmNRdWVyeTsKaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUudWkuZnJvbnRlbmQuRnJv bnRlbmQ7CmltcG9ydCBvcmcub3ZpcnQuZW5naW5lLnVpLmZyb250ZW5kLklOZXdBc3luY0NhbGxi YWNrOwppbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS51aS51aWNvbW1vbndlYi5MaW5xOwppbXBvcnQg b3JnLm92aXJ0LmVuZ2luZS51aS51aWNvbW1vbndlYi5kYXRhcHJvdmlkZXIuQXN5bmNEYXRhUHJv dmlkZXI7CmltcG9ydCBvcmcub3ZpcnQuZW5naW5lLnVpLnVpY29tbW9ud2ViLm1vZGVscy5FbnRp dHlNb2RlbDsKaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUudWkudWljb21tb253ZWIubW9kZWxzLkxp c3RNb2RlbDsKaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUudWkudWljb21tb253ZWIubW9kZWxzLk1v ZGVsOwppbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS51aS51aWNvbW1vbndlYi5tb2RlbHMuU3lzdGVt VHJlZUl0ZW1Nb2RlbDsKaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUudWkudWljb21tb253ZWIubW9k ZWxzLlN5c3RlbVRyZWVJdGVtVHlwZTsKaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUudWkudWljb21t b253ZWIubW9kZWxzLnN0b3JhZ2UuRGlza3NBbGxvY2F0aW9uTW9kZWw7CmltcG9ydCBvcmcub3Zp cnQuZW5naW5lLnVpLnVpY29tbW9ud2ViLm1vZGVscy52bXMua2V5X3ZhbHVlLktleVZhbHVlTW9k ZWw7CmltcG9ydCBvcmcub3ZpcnQuZW5naW5lLnVpLnVpY29tbW9ud2ViLnZhbGlkYXRpb24uQnl0 ZVNpemVWYWxpZGF0aW9uOwppbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS51aS51aWNvbW1vbndlYi52 YWxpZGF0aW9uLkkxOE5OYW1lVmFsaWRhdGlvbjsKaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUudWku dWljb21tb253ZWIudmFsaWRhdGlvbi5JVmFsaWRhdGlvbjsKaW1wb3J0IG9yZy5vdmlydC5lbmdp bmUudWkudWljb21tb253ZWIudmFsaWRhdGlvbi5JbnRlZ2VyVmFsaWRhdGlvbjsKaW1wb3J0IG9y Zy5vdmlydC5lbmdpbmUudWkudWljb21tb253ZWIudmFsaWRhdGlvbi5MZW5ndGhWYWxpZGF0aW9u OwppbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS51aS51aWNvbW1vbndlYi52YWxpZGF0aW9uLk5vVHJp bW1pbmdXaGl0ZXNwYWNlc1ZhbGlkYXRpb247CmltcG9ydCBvcmcub3ZpcnQuZW5naW5lLnVpLnVp Y29tbW9ud2ViLnZhbGlkYXRpb24uTm90RW1wdHlRdW90YVZhbGlkYXRpb247CmltcG9ydCBvcmcu b3ZpcnQuZW5naW5lLnVpLnVpY29tbW9ud2ViLnZhbGlkYXRpb24uTm90RW1wdHlWYWxpZGF0aW9u OwppbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS51aS51aWNvbW1vbndlYi52YWxpZGF0aW9uLlNwZWNp YWxBc2NpaUkxOE5Pck5vbmVWYWxpZGF0aW9uOwppbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS51aS51 aWNvbW1vbndlYi52YWxpZGF0aW9uLlZhbGlkYXRpb25SZXN1bHQ7CmltcG9ydCBvcmcub3ZpcnQu ZW5naW5lLnVpLnVpY29tcGF0LkNvbnN0YW50c01hbmFnZXI7CgpwdWJsaWMgY2xhc3MgVW5pdFZt TW9kZWwgZXh0ZW5kcyBNb2RlbCB7CgogICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lORE9X U19WTV9OQU1FX01BWF9MSU1JVCA9IDE1OwogICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9O X1dJTkRPV1NfVk1fTkFNRV9NQVhfTElNSVQgPSA2NDsKICAgIHB1YmxpYyBzdGF0aWMgZmluYWwg aW50IFZNX1RFTVBMQVRFX05BTUVfTUFYX0xJTUlUID0gNDA7CiAgICBwdWJsaWMgc3RhdGljIGZp bmFsIGludCBERVNDUklQVElPTl9NQVhfTElNSVQgPSAyNTU7CgogICAgcHJpdmF0ZSBib29sZWFu IHByaXZhdGVJc05ldzsKCiAgICBwdWJsaWMgYm9vbGVhbiBnZXRJc05ldygpCiAgICB7CiAgICAg ICAgcmV0dXJuIHByaXZhdGVJc05ldzsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBzZXRJc05ldyhi b29sZWFuIHZhbHVlKQogICAgewogICAgICAgIHByaXZhdGVJc05ldyA9IHZhbHVlOwogICAgfQoK ICAgIHByaXZhdGUgYm9vbGVhbiB2bUF0dGFjaGVkVG9Qb29sOwoKICAgIHB1YmxpYyBib29sZWFu IGlzVm1BdHRhY2hlZFRvUG9vbCgpIHsKICAgICAgICByZXR1cm4gdm1BdHRhY2hlZFRvUG9vbDsK ICAgIH0KCiAgICAvKioKICAgICAqIE5vdGU6IFdlIGFzc3VtZSB0aGF0IHRoaXMgbWV0aG9kIGlz IGNhbGxlZCBvbmx5IG9uY2UsIG9uIHRoZSBjcmVhdGlvbiBzdGFnZQogICAgICogb2YgdGhlIG1v ZGVsLiBpZiB0aGlzIGFzc3VtcHRpb24gaXMgY2hhbmdlZCAoaS5lIHRoZSBWTSBjYW4gYXR0YWNo ZWQvZGV0YWNoZWQKICAgICAqIGZyb20gYSBwb29sIGFmdGVyIHRoZSBtb2RlbCBpcyBjcmVhdGVk KSwgdGhpcyBtZXRob2Qgc2hvdWxkIGJlIG1vZGlmaWVkCiAgICAgKi8KICAgIHB1YmxpYyB2b2lk IHNldFZtQXR0YWNoZWRUb1Bvb2woYm9vbGVhbiB2YWx1ZSkgewogICAgICAgIGlmICh2YWx1ZSkg ewogICAgICAgICAgICAvLyA9PUdlbmVyYWwgVGFiPT0KICAgICAgICAgICAgZ2V0RGF0YUNlbnRl cigpLnNldElzQ2hhbmdhYmxlKGZhbHNlKTsKICAgICAgICAgICAgZ2V0Q2x1c3RlcigpLnNldElz Q2hhbmdhYmxlKCF2YWx1ZSk7CiAgICAgICAgICAgIGdldFF1b3RhKCkuc2V0SXNDaGFuZ2FibGUo ZmFsc2UpOwogICAgICAgICAgICBnZXREZXNjcmlwdGlvbigpLnNldElzQ2hhbmdhYmxlKGZhbHNl KTsKCiAgICAgICAgICAgIGdldE51bU9mRGVza3RvcHMoKS5zZXRJc0NoYW5nYWJsZShmYWxzZSk7 CiAgICAgICAgICAgIGdldFByZXN0YXJ0ZWRWbXMoKS5zZXRJc0NoYW5nYWJsZShmYWxzZSk7Cgog ICAgICAgICAgICBnZXRUZW1wbGF0ZSgpLnNldElzQ2hhbmdhYmxlKGZhbHNlKTsKICAgICAgICAg ICAgZ2V0TWVtU2l6ZSgpLnNldElzQ2hhbmdhYmxlKGZhbHNlKTsKICAgICAgICAgICAgZ2V0VG90 YWxDUFVDb3JlcygpLnNldElzQ2hhbmdhYmxlKGZhbHNlKTsKCiAgICAgICAgICAgIGdldENvcmVz UGVyU29ja2V0KCkuc2V0SXNDaGFuZ2FibGUoZmFsc2UpOwogICAgICAgICAgICBnZXROdW1PZlNv Y2tldHMoKS5zZXRJc0NoYW5nYWJsZShmYWxzZSk7CgogICAgICAgICAgICBnZXRPU1R5cGUoKS5z ZXRJc0NoYW5nYWJsZShmYWxzZSk7CiAgICAgICAgICAgIGdldElzU3RhdGVsZXNzKCkuc2V0SXND aGFuZ2FibGUoZmFsc2UpOwogICAgICAgICAgICBnZXRJc0RlbGV0ZVByb3RlY3RlZCgpLnNldElz Q2hhbmdhYmxlKGZhbHNlKTsKCiAgICAgICAgICAgIC8vID09SW5pdGlhbCBydW4gVGFiPT0KICAg ICAgICAgICAgZ2V0VGltZVpvbmUoKS5zZXRJc0NoYW5nYWJsZShmYWxzZSk7CiAgICAgICAgICAg IGdldERvbWFpbigpLnNldElzQ2hhbmdhYmxlKGZhbHNlKTsKCiAgICAgICAgICAgIC8vID09Q29u c29sZSBUYWI9PQogICAgICAgICAgICBnZXREaXNwbGF5UHJvdG9jb2woKS5zZXRJc0NoYW5nYWJs ZShmYWxzZSk7CiAgICAgICAgICAgIGdldFVzYlBvbGljeSgpLnNldElzQ2hhbmdhYmxlKGZhbHNl KTsKICAgICAgICAgICAgZ2V0TnVtT2ZNb25pdG9ycygpLnNldElzQ2hhbmdhYmxlKGZhbHNlKTsK ICAgICAgICAgICAgZ2V0SXNTbWFydGNhcmRFbmFibGVkKCkuc2V0SXNDaGFuZ2FibGUoZmFsc2Up OwogICAgICAgICAgICBnZXRBbGxvd0NvbnNvbGVSZWNvbm5lY3QoKS5zZXRJc0NoYW5nYWJsZShm YWxzZSk7CgogICAgICAgICAgICAvLyA9PUhvc3QgVGFiPT0KICAgICAgICAgICAgZ2V0SXNBdXRv QXNzaWduKCkuc2V0SXNDaGFuZ2FibGUoZmFsc2UpOwogICAgICAgICAgICBnZXREZWZhdWx0SG9z dCgpLnNldElzQ2hhbmdhYmxlKGZhbHNlKTsKICAgICAgICAgICAgZ2V0UnVuVk1PblNwZWNpZmlj SG9zdCgpLnNldElzQ2hhbmdhYmxlKGZhbHNlKTsKICAgICAgICAgICAgZ2V0UnVuVk1PblRydXN0 ZWRIb3N0KCkuc2V0SXNDaGFuZ2FibGUoZmFsc2UpOwogICAgICAgICAgICBnZXRIb3N0Q3B1KCku c2V0SXNDaGFuZ2FibGUoZmFsc2UpOwogICAgICAgICAgICBnZXREb250TWlncmF0ZVZNKCkuc2V0 SXNDaGFuZ2FibGUoZmFsc2UpOwogICAgICAgICAgICBnZXRDcHVQaW5uaW5nKCkuc2V0SXNDaGFu Z2FibGUoZmFsc2UpOwoKICAgICAgICAgICAgLy8gPT1SZXNvdXJjZSBBbGxvY2F0aW9uIFRhYj09 CiAgICAgICAgICAgIGdldE1pbkFsbG9jYXRlZE1lbW9yeSgpLnNldElzQ2hhbmdhYmxlKGZhbHNl KTsKICAgICAgICAgICAgZ2V0UHJvdmlzaW9uaW5nKCkuc2V0SXNDaGFuZ2FibGUoZmFsc2UpOwog ICAgICAgICAgICBnZXRQcm92aXNpb25pbmdUaGluX0lzU2VsZWN0ZWQoKS5zZXRJc0NoYW5nYWJs ZShmYWxzZSk7CiAgICAgICAgICAgIGdldFByb3Zpc2lvbmluZ0Nsb25lX0lzU2VsZWN0ZWQoKS5z ZXRJc0NoYW5nYWJsZShmYWxzZSk7CiAgICAgICAgICAgIGdldERpc2tzQWxsb2NhdGlvbk1vZGVs KCkuc2V0SXNDaGFuZ2FibGUoZmFsc2UpOwoKICAgICAgICAgICAgLy8gPT1Cb290IE9wdGlvbnMg VGFiPT0KICAgICAgICAgICAgZ2V0Rmlyc3RCb290RGV2aWNlKCkuc2V0SXNDaGFuZ2FibGUoZmFs c2UpOwogICAgICAgICAgICBnZXRTZWNvbmRCb290RGV2aWNlKCkuc2V0SXNDaGFuZ2FibGUoZmFs c2UpOwogICAgICAgICAgICBnZXRDZEF0dGFjaGVkKCkuc2V0SXNDaGFuZ2FibGUoZmFsc2UpOwog ICAgICAgICAgICBnZXRDZEltYWdlKCkuc2V0SXNDaGFuZ2FibGUoZmFsc2UpOwogICAgICAgICAg ICBnZXRLZXJuZWxfcGF0aCgpLnNldElzQ2hhbmdhYmxlKGZhbHNlKTsKICAgICAgICAgICAgZ2V0 SW5pdHJkX3BhdGgoKS5zZXRJc0NoYW5nYWJsZShmYWxzZSk7CiAgICAgICAgICAgIGdldEtlcm5l bF9wYXJhbWV0ZXJzKCkuc2V0SXNDaGFuZ2FibGUoZmFsc2UpOwoKICAgICAgICAgICAgLy8gPT1D dXN0b20gUHJvcGVydGllcyBUYWI9PQogICAgICAgICAgICBnZXRDdXN0b21Qcm9wZXJ0aWVzKCku c2V0SXNDaGFuZ2FibGUoZmFsc2UpOwoKICAgICAgICAgICAgdm1BdHRhY2hlZFRvUG9vbCA9IHRy dWU7CiAgICAgICAgfQogICAgfQoKICAgIHByaXZhdGUgVm1UeXBlIHByaXZhdGVWbVR5cGUgPSBn ZXRWbVR5cGUoKS52YWx1ZXMoKVswXTsKCiAgICBwdWJsaWMgVm1UeXBlIGdldFZtVHlwZSgpCiAg ICB7CiAgICAgICAgcmV0dXJuIHByaXZhdGVWbVR5cGU7CiAgICB9CgogICAgcHVibGljIHZvaWQg c2V0Vm1UeXBlKFZtVHlwZSB2YWx1ZSkKICAgIHsKICAgICAgICBwcml2YXRlVm1UeXBlID0gdmFs dWU7CiAgICB9CgogICAgcHJpdmF0ZSBTdHJpbmcgcHJpdmF0ZUhhc2g7CgogICAgcHVibGljIFN0 cmluZyBnZXRIYXNoKCkKICAgIHsKICAgICAgICByZXR1cm4gcHJpdmF0ZUhhc2g7CiAgICB9Cgog ICAgcHVibGljIHZvaWQgc2V0SGFzaChTdHJpbmcgdmFsdWUpCiAgICB7CiAgICAgICAgcHJpdmF0 ZUhhc2ggPSB2YWx1ZTsKICAgIH0KCiAgICBwcml2YXRlIGJvb2xlYW4gaXNCbGFua1RlbXBsYXRl OwoKICAgIHB1YmxpYyBib29sZWFuIGdldElzQmxhbmtUZW1wbGF0ZSgpCiAgICB7CiAgICAgICAg cmV0dXJuIGlzQmxhbmtUZW1wbGF0ZTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBzZXRJc0JsYW5r VGVtcGxhdGUoYm9vbGVhbiB2YWx1ZSkKICAgIHsKICAgICAgICBpZiAoaXNCbGFua1RlbXBsYXRl ICE9IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgaXNCbGFua1RlbXBsYXRlID0gdmFsdWU7 CiAgICAgICAgICAgIE9uUHJvcGVydHlDaGFuZ2VkKG5ldyBQcm9wZXJ0eUNoYW5nZWRFdmVudEFy Z3MoIklzQmxhbmtUZW1wbGF0ZSIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgIH0KICAgIH0KCiAg ICBwcml2YXRlIGJvb2xlYW4gaXNXaW5kb3dzT1M7CgogICAgcHVibGljIGJvb2xlYW4gZ2V0SXNX aW5kb3dzT1MoKQogICAgewogICAgICAgIHJldHVybiBpc1dpbmRvd3NPUzsKICAgIH0KCiAgICBw dWJsaWMgdm9pZCBzZXRJc1dpbmRvd3NPUyhib29sZWFuIHZhbHVlKQogICAgewogICAgICAgIGlm IChpc1dpbmRvd3NPUyAhPSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlzV2luZG93c09T ID0gdmFsdWU7CiAgICAgICAgICAgIE9uUHJvcGVydHlDaGFuZ2VkKG5ldyBQcm9wZXJ0eUNoYW5n ZWRFdmVudEFyZ3MoIklzV2luZG93c09TIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgfQogICAg fQoKICAgIHByaXZhdGUgYm9vbGVhbiBpc0xpbnV4X1VuYXNzaWduX1Vua25vd25PUzsKCiAgICBw dWJsaWMgYm9vbGVhbiBnZXRJc0xpbnV4X1VuYXNzaWduX1Vua25vd25PUygpCiAgICB7CiAgICAg ICAgcmV0dXJuIGlzTGludXhfVW5hc3NpZ25fVW5rbm93bk9TOwogICAgfQoKICAgIHB1YmxpYyB2 b2lkIHNldElzTGludXhfVW5hc3NpZ25fVW5rbm93bk9TKGJvb2xlYW4gdmFsdWUpCiAgICB7CiAg ICAgICAgaWYgKGlzTGludXhfVW5hc3NpZ25fVW5rbm93bk9TICE9IHZhbHVlKQogICAgICAgIHsK ICAgICAgICAgICAgaXNMaW51eF9VbmFzc2lnbl9Vbmtub3duT1MgPSB2YWx1ZTsKICAgICAgICAg ICAgT25Qcm9wZXJ0eUNoYW5nZWQobmV3IFByb3BlcnR5Q2hhbmdlZEV2ZW50QXJncygiSXNMaW51 eF9VbmFzc2lnbl9Vbmtub3duT1MiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICB9CiAgICB9Cgog ICAgcHJpdmF0ZSBTdHJpbmcgY3B1Tm90aWZpY2F0aW9uOwoKICAgIHB1YmxpYyBTdHJpbmcgZ2V0 Q1BVTm90aWZpY2F0aW9uKCkKICAgIHsKICAgICAgICByZXR1cm4gY3B1Tm90aWZpY2F0aW9uOwog ICAgfQoKICAgIHB1YmxpYyB2b2lkIHNldENQVU5vdGlmaWNhdGlvbihTdHJpbmcgdmFsdWUpCiAg ICB7CiAgICAgICAgaWYgKCFTdHJpbmdIZWxwZXIuc3RyaW5nc0VxdWFsKGNwdU5vdGlmaWNhdGlv biwgdmFsdWUpKQogICAgICAgIHsKICAgICAgICAgICAgY3B1Tm90aWZpY2F0aW9uID0gdmFsdWU7 CiAgICAgICAgICAgIE9uUHJvcGVydHlDaGFuZ2VkKG5ldyBQcm9wZXJ0eUNoYW5nZWRFdmVudEFy Z3MoIkNQVU5vdGlmaWNhdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgIH0KICAgIH0KCiAg ICBwdWJsaWMgYm9vbGVhbiBpc0NQVXNBbW91bnRWYWxpZDsKCiAgICBwdWJsaWMgYm9vbGVhbiBn ZXRJc0NQVXNBbW91bnRWYWxpZCgpCiAgICB7CiAgICAgICAgcmV0dXJuIGlzQ1BVc0Ftb3VudFZh bGlkOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHNldElzQ1BVc0Ftb3VudFZhbGlkKGJvb2xlYW4g dmFsdWUpCiAgICB7CiAgICAgICAgaWYgKGlzQ1BVc0Ftb3VudFZhbGlkICE9IHZhbHVlKQogICAg ICAgIHsKICAgICAgICAgICAgaXNDUFVzQW1vdW50VmFsaWQgPSB2YWx1ZTsKICAgICAgICAgICAg T25Qcm9wZXJ0eUNoYW5nZWQobmV3IFByb3BlcnR5Q2hhbmdlZEV2ZW50QXJncygiSXNDUFVzQW1v dW50VmFsaWQiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSBi b29sZWFuIGlzR2VuZXJhbFRhYlZhbGlkOwoKICAgIHB1YmxpYyBib29sZWFuIGdldElzR2VuZXJh bFRhYlZhbGlkKCkKICAgIHsKICAgICAgICByZXR1cm4gaXNHZW5lcmFsVGFiVmFsaWQ7CiAgICB9 CgogICAgcHVibGljIHZvaWQgc2V0SXNHZW5lcmFsVGFiVmFsaWQoYm9vbGVhbiB2YWx1ZSkKICAg IHsKICAgICAgICBpZiAoaXNHZW5lcmFsVGFiVmFsaWQgIT0gdmFsdWUpCiAgICAgICAgewogICAg ICAgICAgICBpc0dlbmVyYWxUYWJWYWxpZCA9IHZhbHVlOwogICAgICAgICAgICBPblByb3BlcnR5 Q2hhbmdlZChuZXcgUHJvcGVydHlDaGFuZ2VkRXZlbnRBcmdzKCJJc0dlbmVyYWxUYWJWYWxpZCIp KTsgLy8kTk9OLU5MUy0xJAogICAgICAgIH0KICAgIH0KCiAgICBwcml2YXRlIGJvb2xlYW4gaXNG aXJzdFJ1blRhYlZhbGlkOwoKICAgIHB1YmxpYyBib29sZWFuIGdldElzRmlyc3RSdW5UYWJWYWxp ZCgpCiAgICB7CiAgICAgICAgcmV0dXJuIGlzRmlyc3RSdW5UYWJWYWxpZDsKICAgIH0KCiAgICBw dWJsaWMgdm9pZCBzZXRJc0ZpcnN0UnVuVGFiVmFsaWQoYm9vbGVhbiB2YWx1ZSkKICAgIHsKICAg ICAgICBpZiAoaXNGaXJzdFJ1blRhYlZhbGlkICE9IHZhbHVlKQogICAgICAgIHsKICAgICAgICAg ICAgaXNGaXJzdFJ1blRhYlZhbGlkID0gdmFsdWU7CiAgICAgICAgICAgIE9uUHJvcGVydHlDaGFu Z2VkKG5ldyBQcm9wZXJ0eUNoYW5nZWRFdmVudEFyZ3MoIklzRmlyc3RSdW5UYWJWYWxpZCIpKTsg Ly8kTk9OLU5MUy0xJAogICAgICAgIH0KICAgIH0KCiAgICBwcml2YXRlIGJvb2xlYW4gaXNEaXNw bGF5VGFiVmFsaWQ7CgogICAgcHVibGljIGJvb2xlYW4gZ2V0SXNEaXNwbGF5VGFiVmFsaWQoKQog ICAgewogICAgICAgIHJldHVybiBpc0Rpc3BsYXlUYWJWYWxpZDsKICAgIH0KCiAgICBwdWJsaWMg dm9pZCBzZXRJc0Rpc3BsYXlUYWJWYWxpZChib29sZWFuIHZhbHVlKQogICAgewogICAgICAgIGlm IChpc0Rpc3BsYXlUYWJWYWxpZCAhPSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlzRGlz cGxheVRhYlZhbGlkID0gdmFsdWU7CiAgICAgICAgICAgIE9uUHJvcGVydHlDaGFuZ2VkKG5ldyBQ cm9wZXJ0eUNoYW5nZWRFdmVudEFyZ3MoIklzRGlzcGxheVRhYlZhbGlkIikpOyAvLyROT04tTkxT LTEkCiAgICAgICAgfQogICAgfQoKICAgIHByaXZhdGUgYm9vbGVhbiBpc0FsbG9jYXRpb25UYWJW YWxpZDsKCiAgICBwdWJsaWMgYm9vbGVhbiBnZXRJc0FsbG9jYXRpb25UYWJWYWxpZCgpCiAgICB7 CiAgICAgICAgcmV0dXJuIGlzQWxsb2NhdGlvblRhYlZhbGlkOwogICAgfQoKICAgIHB1YmxpYyB2 b2lkIHNldElzQWxsb2NhdGlvblRhYlZhbGlkKGJvb2xlYW4gdmFsdWUpCiAgICB7CiAgICAgICAg aWYgKGlzQWxsb2NhdGlvblRhYlZhbGlkICE9IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAg aXNBbGxvY2F0aW9uVGFiVmFsaWQgPSB2YWx1ZTsKICAgICAgICAgICAgT25Qcm9wZXJ0eUNoYW5n ZWQobmV3IFByb3BlcnR5Q2hhbmdlZEV2ZW50QXJncygiSXNBbGxvY2F0aW9uVGFiVmFsaWQiKSk7 IC8vJE5PTi1OTFMtMSQKICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSBib29sZWFuIGlzSG9z dFRhYlZhbGlkOwoKICAgIHB1YmxpYyBib29sZWFuIGdldElzSG9zdFRhYlZhbGlkKCkKICAgIHsK ICAgICAgICByZXR1cm4gaXNIb3N0VGFiVmFsaWQ7CiAgICB9CgogICAgcHVibGljIHZvaWQgc2V0 SXNIb3N0VGFiVmFsaWQoYm9vbGVhbiB2YWx1ZSkKICAgIHsKICAgICAgICBpZiAoaXNIb3N0VGFi VmFsaWQgIT0gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBpc0hvc3RUYWJWYWxpZCA9IHZh bHVlOwogICAgICAgICAgICBPblByb3BlcnR5Q2hhbmdlZChuZXcgUHJvcGVydHlDaGFuZ2VkRXZl bnRBcmdzKCJJc0hvc3RUYWJWYWxpZCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgIH0KICAgIH0K CiAgICBwcml2YXRlIGJvb2xlYW4gaXNCb290U2VxdWVuY2VUYWJWYWxpZDsKCiAgICBwdWJsaWMg Ym9vbGVhbiBnZXRJc0Jvb3RTZXF1ZW5jZVRhYlZhbGlkKCkKICAgIHsKICAgICAgICByZXR1cm4g aXNCb290U2VxdWVuY2VUYWJWYWxpZDsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBzZXRJc0Jvb3RT ZXF1ZW5jZVRhYlZhbGlkKGJvb2xlYW4gdmFsdWUpCiAgICB7CiAgICAgICAgaWYgKGlzQm9vdFNl cXVlbmNlVGFiVmFsaWQgIT0gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBpc0Jvb3RTZXF1 ZW5jZVRhYlZhbGlkID0gdmFsdWU7CiAgICAgICAgICAgIE9uUHJvcGVydHlDaGFuZ2VkKG5ldyBQ cm9wZXJ0eUNoYW5nZWRFdmVudEFyZ3MoIklzQm9vdFNlcXVlbmNlVGFiVmFsaWQiKSk7IC8vJE5P Ti1OTFMtMSQKICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSBib29sZWFuIGlzQ3VzdG9tUHJv cGVydGllc1RhYlZhbGlkOwoKICAgIHB1YmxpYyBib29sZWFuIGdldElzQ3VzdG9tUHJvcGVydGll c1RhYlZhbGlkKCkKICAgIHsKICAgICAgICByZXR1cm4gaXNDdXN0b21Qcm9wZXJ0aWVzVGFiVmFs aWQ7CiAgICB9CgogICAgcHVibGljIHZvaWQgc2V0SXNDdXN0b21Qcm9wZXJ0aWVzVGFiVmFsaWQo Ym9vbGVhbiB2YWx1ZSkKICAgIHsKICAgICAgICBpZiAoaXNDdXN0b21Qcm9wZXJ0aWVzVGFiVmFs aWQgIT0gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBpc0N1c3RvbVByb3BlcnRpZXNUYWJW YWxpZCA9IHZhbHVlOwogICAgICAgICAgICBPblByb3BlcnR5Q2hhbmdlZChuZXcgUHJvcGVydHlD aGFuZ2VkRXZlbnRBcmdzKCJJc0N1c3RvbVByb3BlcnRpZXNUYWJWYWxpZCIpKTsgLy8kTk9OLU5M Uy0xJAogICAgICAgIH0KICAgIH0KCiAgICBwcml2YXRlIE5vdENoYW5nYWJsZUZvclZtSW5Qb29s TGlzdE1vZGVsIHByaXZhdGVEYXRhQ2VudGVyOwoKICAgIHB1YmxpYyBMaXN0TW9kZWwgZ2V0RGF0 YUNlbnRlcigpCiAgICB7CiAgICAgICAgcmV0dXJuIHByaXZhdGVEYXRhQ2VudGVyOwogICAgfQoK ICAgIHByaXZhdGUgdm9pZCBzZXREYXRhQ2VudGVyKE5vdENoYW5nYWJsZUZvclZtSW5Qb29sTGlz dE1vZGVsIHZhbHVlKQogICAgewogICAgICAgIHByaXZhdGVEYXRhQ2VudGVyID0gdmFsdWU7CiAg ICB9CgogICAgcHJpdmF0ZSBOb3RDaGFuZ2FibGVGb3JWbUluUG9vbExpc3RNb2RlbCBwcml2YXRl U3RvcmFnZURvbWFpbjsKCiAgICBwdWJsaWMgTGlzdE1vZGVsIGdldFN0b3JhZ2VEb21haW4oKQog ICAgewogICAgICAgIHJldHVybiBwcml2YXRlU3RvcmFnZURvbWFpbjsKICAgIH0KCiAgICBwcml2 YXRlIHZvaWQgc2V0U3RvcmFnZURvbWFpbihOb3RDaGFuZ2FibGVGb3JWbUluUG9vbExpc3RNb2Rl bCB2YWx1ZSkKICAgIHsKICAgICAgICBwcml2YXRlU3RvcmFnZURvbWFpbiA9IHZhbHVlOwogICAg fQoKICAgIHByaXZhdGUgTm90Q2hhbmdhYmxlRm9yVm1JblBvb2xMaXN0TW9kZWwgcHJpdmF0ZVRl bXBsYXRlOwoKICAgIHB1YmxpYyBMaXN0TW9kZWwgZ2V0VGVtcGxhdGUoKQogICAgewogICAgICAg IHJldHVybiBwcml2YXRlVGVtcGxhdGU7CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIHNldFRlbXBs YXRlKE5vdENoYW5nYWJsZUZvclZtSW5Qb29sTGlzdE1vZGVsIHZhbHVlKQogICAgewogICAgICAg IHByaXZhdGVUZW1wbGF0ZSA9IHZhbHVlOwogICAgfQoKICAgIHByaXZhdGUgRW50aXR5TW9kZWwg cHJpdmF0ZU5hbWU7CgogICAgcHVibGljIEVudGl0eU1vZGVsIGdldE5hbWUoKQogICAgewogICAg ICAgIHJldHVybiBwcml2YXRlTmFtZTsKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgc2V0TmFtZShF bnRpdHlNb2RlbCB2YWx1ZSkKICAgIHsKICAgICAgICBwcml2YXRlTmFtZSA9IHZhbHVlOwogICAg fQoKICAgIHByaXZhdGUgTm90Q2hhbmdhYmxlRm9yVm1JblBvb2xMaXN0TW9kZWwgcHJpdmF0ZU9T VHlwZTsKCiAgICBwdWJsaWMgTGlzdE1vZGVsIGdldE9TVHlwZSgpCiAgICB7CiAgICAgICAgcmV0 dXJuIHByaXZhdGVPU1R5cGU7CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIHNldE9TVHlwZShOb3RD aGFuZ2FibGVGb3JWbUluUG9vbExpc3RNb2RlbCB2YWx1ZSkKICAgIHsKICAgICAgICBwcml2YXRl T1NUeXBlID0gdmFsdWU7CiAgICB9CgogICAgcHJpdmF0ZSBOb3RDaGFuZ2FibGVGb3JWbUluUG9v bExpc3RNb2RlbCBwcml2YXRlTnVtT2ZNb25pdG9yczsKCiAgICBwdWJsaWMgTGlzdE1vZGVsIGdl dE51bU9mTW9uaXRvcnMoKQogICAgewogICAgICAgIHJldHVybiBwcml2YXRlTnVtT2ZNb25pdG9y czsKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgc2V0TnVtT2ZNb25pdG9ycyhOb3RDaGFuZ2FibGVG b3JWbUluUG9vbExpc3RNb2RlbCB2YWx1ZSkKICAgIHsKICAgICAgICBwcml2YXRlTnVtT2ZNb25p dG9ycyA9IHZhbHVlOwogICAgfQoKICAgIHByaXZhdGUgTm90Q2hhbmdhYmxlRm9yVm1JblBvb2xF bnRpdHlNb2RlbCBwcml2YXRlQWxsb3dDb25zb2xlUmVjb25uZWN0OwoKICAgIHB1YmxpYyBFbnRp dHlNb2RlbCBnZXRBbGxvd0NvbnNvbGVSZWNvbm5lY3QoKQogICAgewogICAgICAgIHJldHVybiBw cml2YXRlQWxsb3dDb25zb2xlUmVjb25uZWN0OwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBzZXRB bGxvd0NvbnNvbGVSZWNvbm5lY3QoTm90Q2hhbmdhYmxlRm9yVm1JblBvb2xFbnRpdHlNb2RlbCB2 YWx1ZSkKICAgIHsKICAgICAgICBwcml2YXRlQWxsb3dDb25zb2xlUmVjb25uZWN0ID0gdmFsdWU7 CiAgICB9CgogICAgcHJpdmF0ZSBOb3RDaGFuZ2FibGVGb3JWbUluUG9vbEVudGl0eU1vZGVsIHBy aXZhdGVEZXNjcmlwdGlvbjsKCiAgICBwdWJsaWMgRW50aXR5TW9kZWwgZ2V0RGVzY3JpcHRpb24o KQogICAgewogICAgICAgIHJldHVybiBwcml2YXRlRGVzY3JpcHRpb247CiAgICB9CgogICAgcHJp dmF0ZSB2b2lkIHNldERlc2NyaXB0aW9uKE5vdENoYW5nYWJsZUZvclZtSW5Qb29sRW50aXR5TW9k ZWwgdmFsdWUpCiAgICB7CiAgICAgICAgcHJpdmF0ZURlc2NyaXB0aW9uID0gdmFsdWU7CiAgICB9 CgogICAgcHJpdmF0ZSBOb3RDaGFuZ2FibGVGb3JWbUluUG9vbExpc3RNb2RlbCBwcml2YXRlRG9t YWluOwoKICAgIHB1YmxpYyBMaXN0TW9kZWwgZ2V0RG9tYWluKCkKICAgIHsKICAgICAgICByZXR1 cm4gcHJpdmF0ZURvbWFpbjsKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgc2V0RG9tYWluKE5vdENo YW5nYWJsZUZvclZtSW5Qb29sTGlzdE1vZGVsIHZhbHVlKQogICAgewogICAgICAgIHByaXZhdGVE b21haW4gPSB2YWx1ZTsKICAgIH0KCiAgICBwcml2YXRlIE5vdENoYW5nYWJsZUZvclZtSW5Qb29s RW50aXR5TW9kZWwgcHJpdmF0ZU1lbVNpemU7CgogICAgcHVibGljIEVudGl0eU1vZGVsIGdldE1l bVNpemUoKQogICAgewogICAgICAgIHJldHVybiBwcml2YXRlTWVtU2l6ZTsKICAgIH0KCiAgICBw cml2YXRlIHZvaWQgc2V0TWVtU2l6ZShOb3RDaGFuZ2FibGVGb3JWbUluUG9vbEVudGl0eU1vZGVs IHZhbHVlKQogICAgewogICAgICAgIHByaXZhdGVNZW1TaXplID0gdmFsdWU7CiAgICB9CgogICAg cHJpdmF0ZSBOb3RDaGFuZ2FibGVGb3JWbUluUG9vbEVudGl0eU1vZGVsIHByaXZhdGVNaW5BbGxv Y2F0ZWRNZW1vcnk7CgogICAgcHVibGljIEVudGl0eU1vZGVsIGdldE1pbkFsbG9jYXRlZE1lbW9y eSgpCiAgICB7CiAgICAgICAgcmV0dXJuIHByaXZhdGVNaW5BbGxvY2F0ZWRNZW1vcnk7CiAgICB9 CgogICAgcHJpdmF0ZSB2b2lkIHNldE1pbkFsbG9jYXRlZE1lbW9yeShOb3RDaGFuZ2FibGVGb3JW bUluUG9vbEVudGl0eU1vZGVsIHZhbHVlKQogICAgewogICAgICAgIHByaXZhdGVNaW5BbGxvY2F0 ZWRNZW1vcnkgPSB2YWx1ZTsKICAgIH0KCiAgICBwcml2YXRlIE5vdENoYW5nYWJsZUZvclZtSW5Q b29sTGlzdE1vZGVsIHByaXZhdGVRdW90YTsKCiAgICBwdWJsaWMgTGlzdE1vZGVsIGdldFF1b3Rh KCkKICAgIHsKICAgICAgICByZXR1cm4gcHJpdmF0ZVF1b3RhOwogICAgfQoKICAgIHByaXZhdGUg dm9pZCBzZXRRdW90YShOb3RDaGFuZ2FibGVGb3JWbUluUG9vbExpc3RNb2RlbCB2YWx1ZSkKICAg IHsKICAgICAgICBwcml2YXRlUXVvdGEgPSB2YWx1ZTsKICAgIH0KCiAgICBwcml2YXRlIE5vdENo YW5nYWJsZUZvclZtSW5Qb29sTGlzdE1vZGVsIHByaXZhdGVDbHVzdGVyOwoKICAgIHB1YmxpYyBM aXN0TW9kZWwgZ2V0Q2x1c3RlcigpCiAgICB7CiAgICAgICAgcmV0dXJuIHByaXZhdGVDbHVzdGVy OwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBzZXRDbHVzdGVyKE5vdENoYW5nYWJsZUZvclZtSW5Q b29sTGlzdE1vZGVsIHZhbHVlKQogICAgewogICAgICAgIHByaXZhdGVDbHVzdGVyID0gdmFsdWU7 CiAgICB9CgogICAgcHJpdmF0ZSBOb3RDaGFuZ2FibGVGb3JWbUluUG9vbExpc3RNb2RlbCBwcml2 YXRlVXNiUG9saWN5OwoKICAgIHB1YmxpYyBMaXN0TW9kZWwgZ2V0VXNiUG9saWN5KCkKICAgIHsK ICAgICAgICByZXR1cm4gcHJpdmF0ZVVzYlBvbGljeTsKICAgIH0KCiAgICBwcml2YXRlIHZvaWQg c2V0VXNiUG9saWN5KE5vdENoYW5nYWJsZUZvclZtSW5Qb29sTGlzdE1vZGVsIHZhbHVlKQogICAg ewogICAgICAgIHByaXZhdGVVc2JQb2xpY3kgPSB2YWx1ZTsKICAgIH0KCiAgICBwcml2YXRlIE5v dENoYW5nYWJsZUZvclZtSW5Qb29sTGlzdE1vZGVsIHByaXZhdGVUaW1lWm9uZTsKCiAgICBwdWJs aWMgTGlzdE1vZGVsIGdldFRpbWVab25lKCkKICAgIHsKICAgICAgICByZXR1cm4gcHJpdmF0ZVRp bWVab25lOwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBzZXRUaW1lWm9uZShOb3RDaGFuZ2FibGVG b3JWbUluUG9vbExpc3RNb2RlbCB2YWx1ZSkKICAgIHsKICAgICAgICBwcml2YXRlVGltZVpvbmUg PSB2YWx1ZTsKICAgIH0KCiAgICBwcml2YXRlIE5vdENoYW5nYWJsZUZvclZtSW5Qb29sTGlzdE1v ZGVsIHByaXZhdGVOdW1PZlNvY2tldHM7CgogICAgcHVibGljIExpc3RNb2RlbCBnZXROdW1PZlNv Y2tldHMoKQogICAgewogICAgICAgIHJldHVybiBwcml2YXRlTnVtT2ZTb2NrZXRzOwogICAgfQoK ICAgIHByaXZhdGUgdm9pZCBzZXROdW1PZlNvY2tldHMoTm90Q2hhbmdhYmxlRm9yVm1JblBvb2xM aXN0TW9kZWwgdmFsdWUpCiAgICB7CiAgICAgICAgcHJpdmF0ZU51bU9mU29ja2V0cyA9IHZhbHVl OwogICAgfQoKICAgIHByaXZhdGUgTm90Q2hhbmdhYmxlRm9yVm1JblBvb2xFbnRpdHlNb2RlbCBw cml2YXRlVG90YWxDUFVDb3JlczsKCiAgICBwdWJsaWMgRW50aXR5TW9kZWwgZ2V0VG90YWxDUFVD b3JlcygpCiAgICB7CiAgICAgICAgcmV0dXJuIHByaXZhdGVUb3RhbENQVUNvcmVzOwogICAgfQoK ICAgIHByaXZhdGUgdm9pZCBzZXRUb3RhbENQVUNvcmVzKE5vdENoYW5nYWJsZUZvclZtSW5Qb29s RW50aXR5TW9kZWwgdmFsdWUpCiAgICB7CiAgICAgICAgcHJpdmF0ZVRvdGFsQ1BVQ29yZXMgPSB2 YWx1ZTsKICAgIH0KCiAgICBwcml2YXRlIE5vdENoYW5nYWJsZUZvclZtSW5Qb29sTGlzdE1vZGVs IHByaXZhdGVDb3Jlc1BlclNvY2tldDsKCiAgICBwdWJsaWMgTGlzdE1vZGVsIGdldENvcmVzUGVy U29ja2V0KCkKICAgIHsKICAgICAgICByZXR1cm4gcHJpdmF0ZUNvcmVzUGVyU29ja2V0OwogICAg fQoKICAgIHByaXZhdGUgdm9pZCBzZXRDb3Jlc1BlclNvY2tldChOb3RDaGFuZ2FibGVGb3JWbUlu UG9vbExpc3RNb2RlbCB2YWx1ZSkKICAgIHsKICAgICAgICBwcml2YXRlQ29yZXNQZXJTb2NrZXQg PSB2YWx1ZTsKICAgIH0KCiAgICBwcml2YXRlIE5vdENoYW5nYWJsZUZvclZtSW5Qb29sTGlzdE1v ZGVsIHByaXZhdGVEZWZhdWx0SG9zdDsKCiAgICBwdWJsaWMgTGlzdE1vZGVsIGdldERlZmF1bHRI b3N0KCkKICAgIHsKICAgICAgICByZXR1cm4gcHJpdmF0ZURlZmF1bHRIb3N0OwogICAgfQoKICAg IHByaXZhdGUgdm9pZCBzZXREZWZhdWx0SG9zdChOb3RDaGFuZ2FibGVGb3JWbUluUG9vbExpc3RN b2RlbCB2YWx1ZSkKICAgIHsKICAgICAgICBwcml2YXRlRGVmYXVsdEhvc3QgPSB2YWx1ZTsKICAg IH0KCiAgICBwcml2YXRlIE5vdENoYW5nYWJsZUZvclZtSW5Qb29sRW50aXR5TW9kZWwgcHJpdmF0 ZWlzU21hcnRjYXJkRW5hYmxlZDsKCiAgICBwdWJsaWMgRW50aXR5TW9kZWwgZ2V0SXNTbWFydGNh cmRFbmFibGVkKCkKICAgIHsKICAgICAgICByZXR1cm4gcHJpdmF0ZWlzU21hcnRjYXJkRW5hYmxl ZDsKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgc2V0SXNTbWFydGNhcmRFbmFibGVkKE5vdENoYW5n YWJsZUZvclZtSW5Qb29sRW50aXR5TW9kZWwgdmFsdWUpCiAgICB7CiAgICAgICAgcHJpdmF0ZWlz U21hcnRjYXJkRW5hYmxlZCA9IHZhbHVlOwogICAgfQoKICAgIHByaXZhdGUgTm90Q2hhbmdhYmxl Rm9yVm1JblBvb2xFbnRpdHlNb2RlbCBwcml2YXRlSXNTdGF0ZWxlc3M7CgogICAgcHVibGljIEVu dGl0eU1vZGVsIGdldElzU3RhdGVsZXNzKCkKICAgIHsKICAgICAgICByZXR1cm4gcHJpdmF0ZUlz U3RhdGVsZXNzOwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBzZXRJc1N0YXRlbGVzcyhOb3RDaGFu Z2FibGVGb3JWbUluUG9vbEVudGl0eU1vZGVsIHZhbHVlKQogICAgewogICAgICAgIHByaXZhdGVJ c1N0YXRlbGVzcyA9IHZhbHVlOwogICAgfQoKICAgIHByaXZhdGUgTm90Q2hhbmdhYmxlRm9yVm1J blBvb2xFbnRpdHlNb2RlbCBwcml2YXRlSXNEZWxldGVQcm90ZWN0ZWQ7CgogICAgcHVibGljIEVu dGl0eU1vZGVsIGdldElzRGVsZXRlUHJvdGVjdGVkKCkgewogICAgICAgIHJldHVybiBwcml2YXRl SXNEZWxldGVQcm90ZWN0ZWQ7CiAgICB9CgogICAgcHVibGljIHZvaWQgc2V0SXNEZWxldGVQcm90 ZWN0ZWQoTm90Q2hhbmdhYmxlRm9yVm1JblBvb2xFbnRpdHlNb2RlbCBkZWxldGVQcm90ZWN0ZWQp IHsKICAgICAgICB0aGlzLnByaXZhdGVJc0RlbGV0ZVByb3RlY3RlZCA9IGRlbGV0ZVByb3RlY3Rl ZDsKICAgIH0KCiAgICBwcml2YXRlIE5vdENoYW5nYWJsZUZvclZtSW5Qb29sTGlzdE1vZGVsIHBy aXZhdGVEaXNwbGF5UHJvdG9jb2w7CgogICAgcHVibGljIExpc3RNb2RlbCBnZXREaXNwbGF5UHJv dG9jb2woKQogICAgewogICAgICAgIHJldHVybiBwcml2YXRlRGlzcGxheVByb3RvY29sOwogICAg fQoKICAgIHByaXZhdGUgdm9pZCBzZXREaXNwbGF5UHJvdG9jb2woTm90Q2hhbmdhYmxlRm9yVm1J blBvb2xMaXN0TW9kZWwgdmFsdWUpCiAgICB7CiAgICAgICAgcHJpdmF0ZURpc3BsYXlQcm90b2Nv bCA9IHZhbHVlOwogICAgfQoKICAgIHByaXZhdGUgTm90Q2hhbmdhYmxlRm9yVm1JblBvb2xFbnRp dHlNb2RlbCBwcml2YXRlUHJvdmlzaW9uaW5nOwoKICAgIHB1YmxpYyBFbnRpdHlNb2RlbCBnZXRQ cm92aXNpb25pbmcoKQogICAgewogICAgICAgIHJldHVybiBwcml2YXRlUHJvdmlzaW9uaW5nOwog ICAgfQoKICAgIHByaXZhdGUgdm9pZCBzZXRQcm92aXNpb25pbmcoTm90Q2hhbmdhYmxlRm9yVm1J blBvb2xFbnRpdHlNb2RlbCB2YWx1ZSkKICAgIHsKICAgICAgICBwcml2YXRlUHJvdmlzaW9uaW5n ID0gdmFsdWU7CiAgICB9CgogICAgcHJpdmF0ZSBOb3RDaGFuZ2FibGVGb3JWbUluUG9vbEVudGl0 eU1vZGVsIHByaXZhdGVQcm92aXNpb25pbmdUaGluX0lzU2VsZWN0ZWQ7CgogICAgcHVibGljIEVu dGl0eU1vZGVsIGdldFByb3Zpc2lvbmluZ1RoaW5fSXNTZWxlY3RlZCgpCiAgICB7CiAgICAgICAg cmV0dXJuIHByaXZhdGVQcm92aXNpb25pbmdUaGluX0lzU2VsZWN0ZWQ7CiAgICB9CgogICAgcHVi bGljIHZvaWQgc2V0UHJvdmlzaW9uaW5nVGhpbl9Jc1NlbGVjdGVkKE5vdENoYW5nYWJsZUZvclZt SW5Qb29sRW50aXR5TW9kZWwgdmFsdWUpCiAgICB7CiAgICAgICAgcHJpdmF0ZVByb3Zpc2lvbmlu Z1RoaW5fSXNTZWxlY3RlZCA9IHZhbHVlOwogICAgfQoKICAgIHByaXZhdGUgTm90Q2hhbmdhYmxl Rm9yVm1JblBvb2xFbnRpdHlNb2RlbCBwcml2YXRlUHJvdmlzaW9uaW5nQ2xvbmVfSXNTZWxlY3Rl ZDsKCiAgICBwdWJsaWMgRW50aXR5TW9kZWwgZ2V0UHJvdmlzaW9uaW5nQ2xvbmVfSXNTZWxlY3Rl ZCgpCiAgICB7CiAgICAgICAgcmV0dXJuIHByaXZhdGVQcm92aXNpb25pbmdDbG9uZV9Jc1NlbGVj dGVkOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHNldFByb3Zpc2lvbmluZ0Nsb25lX0lzU2VsZWN0 ZWQoTm90Q2hhbmdhYmxlRm9yVm1JblBvb2xFbnRpdHlNb2RlbCB2YWx1ZSkKICAgIHsKICAgICAg ICBwcml2YXRlUHJvdmlzaW9uaW5nQ2xvbmVfSXNTZWxlY3RlZCA9IHZhbHVlOwogICAgfQoKICAg IHByaXZhdGUgTm90Q2hhbmdhYmxlRm9yVm1JblBvb2xMaXN0TW9kZWwgcHJpdmF0ZVByaW9yaXR5 OwoKICAgIHB1YmxpYyBMaXN0TW9kZWwgZ2V0UHJpb3JpdHkoKQogICAgewogICAgICAgIHJldHVy biBwcml2YXRlUHJpb3JpdHk7CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIHNldFByaW9yaXR5KE5v dENoYW5nYWJsZUZvclZtSW5Qb29sTGlzdE1vZGVsIHZhbHVlKQogICAgewogICAgICAgIHByaXZh dGVQcmlvcml0eSA9IHZhbHVlOwogICAgfQoKICAgIHByaXZhdGUgTm90Q2hhbmdhYmxlRm9yVm1J blBvb2xFbnRpdHlNb2RlbCBwcml2YXRlSXNIaWdobHlBdmFpbGFibGU7CgogICAgcHVibGljIEVu dGl0eU1vZGVsIGdldElzSGlnaGx5QXZhaWxhYmxlKCkKICAgIHsKICAgICAgICByZXR1cm4gcHJp dmF0ZUlzSGlnaGx5QXZhaWxhYmxlOwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBzZXRJc0hpZ2hs eUF2YWlsYWJsZShOb3RDaGFuZ2FibGVGb3JWbUluUG9vbEVudGl0eU1vZGVsIHZhbHVlKQogICAg ewogICAgICAgIHByaXZhdGVJc0hpZ2hseUF2YWlsYWJsZSA9IHZhbHVlOwogICAgfQoKICAgIHBy aXZhdGUgTm90Q2hhbmdhYmxlRm9yVm1JblBvb2xMaXN0TW9kZWwgcHJpdmF0ZUZpcnN0Qm9vdERl dmljZTsKCiAgICBwdWJsaWMgTGlzdE1vZGVsIGdldEZpcnN0Qm9vdERldmljZSgpCiAgICB7CiAg ICAgICAgcmV0dXJuIHByaXZhdGVGaXJzdEJvb3REZXZpY2U7CiAgICB9CgogICAgcHJpdmF0ZSB2 b2lkIHNldEZpcnN0Qm9vdERldmljZShOb3RDaGFuZ2FibGVGb3JWbUluUG9vbExpc3RNb2RlbCB2 YWx1ZSkKICAgIHsKICAgICAgICBwcml2YXRlRmlyc3RCb290RGV2aWNlID0gdmFsdWU7CiAgICB9 CgogICAgcHJpdmF0ZSBOb3RDaGFuZ2FibGVGb3JWbUluUG9vbExpc3RNb2RlbCBwcml2YXRlU2Vj b25kQm9vdERldmljZTsKCiAgICBwdWJsaWMgTGlzdE1vZGVsIGdldFNlY29uZEJvb3REZXZpY2Uo KQogICAgewogICAgICAgIHJldHVybiBwcml2YXRlU2Vjb25kQm9vdERldmljZTsKICAgIH0KCiAg ICBwcml2YXRlIHZvaWQgc2V0U2Vjb25kQm9vdERldmljZShOb3RDaGFuZ2FibGVGb3JWbUluUG9v bExpc3RNb2RlbCB2YWx1ZSkKICAgIHsKICAgICAgICBwcml2YXRlU2Vjb25kQm9vdERldmljZSA9 IHZhbHVlOwogICAgfQoKICAgIHByaXZhdGUgTm90Q2hhbmdhYmxlRm9yVm1JblBvb2xMaXN0TW9k ZWwgcHJpdmF0ZUNkSW1hZ2U7CgogICAgcHVibGljIExpc3RNb2RlbCBnZXRDZEltYWdlKCkKICAg IHsKICAgICAgICByZXR1cm4gcHJpdmF0ZUNkSW1hZ2U7CiAgICB9CgogICAgcHJpdmF0ZSB2b2lk IHNldENkSW1hZ2UoTm90Q2hhbmdhYmxlRm9yVm1JblBvb2xMaXN0TW9kZWwgdmFsdWUpCiAgICB7 CiAgICAgICAgcHJpdmF0ZUNkSW1hZ2UgPSB2YWx1ZTsKICAgIH0KCiAgICBwcml2YXRlIE5vdENo YW5nYWJsZUZvclZtSW5Qb29sRW50aXR5TW9kZWwgY2RBdHRhY2hlZDsKCiAgICBwdWJsaWMgRW50 aXR5TW9kZWwgZ2V0Q2RBdHRhY2hlZCgpIHsKICAgICAgICByZXR1cm4gY2RBdHRhY2hlZDsKICAg IH0KCiAgICBwdWJsaWMgdm9pZCBzZXRDZEF0dGFjaGVkKE5vdENoYW5nYWJsZUZvclZtSW5Qb29s RW50aXR5TW9kZWwgdmFsdWUpIHsKICAgICAgICBjZEF0dGFjaGVkID0gdmFsdWU7CiAgICB9Cgog ICAgcHJpdmF0ZSBOb3RDaGFuZ2FibGVGb3JWbUluUG9vbEVudGl0eU1vZGVsIHByaXZhdGVJbml0 cmRfcGF0aDsKCiAgICBwdWJsaWMgRW50aXR5TW9kZWwgZ2V0SW5pdHJkX3BhdGgoKQogICAgewog ICAgICAgIHJldHVybiBwcml2YXRlSW5pdHJkX3BhdGg7CiAgICB9CgogICAgcHJpdmF0ZSB2b2lk IHNldEluaXRyZF9wYXRoKE5vdENoYW5nYWJsZUZvclZtSW5Qb29sRW50aXR5TW9kZWwgdmFsdWUp CiAgICB7CiAgICAgICAgcHJpdmF0ZUluaXRyZF9wYXRoID0gdmFsdWU7CiAgICB9CgogICAgcHJp dmF0ZSBOb3RDaGFuZ2FibGVGb3JWbUluUG9vbEVudGl0eU1vZGVsIHByaXZhdGVLZXJuZWxfcGF0 aDsKCiAgICBwdWJsaWMgRW50aXR5TW9kZWwgZ2V0S2VybmVsX3BhdGgoKQogICAgewogICAgICAg IHJldHVybiBwcml2YXRlS2VybmVsX3BhdGg7CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIHNldEtl cm5lbF9wYXRoKE5vdENoYW5nYWJsZUZvclZtSW5Qb29sRW50aXR5TW9kZWwgdmFsdWUpCiAgICB7 CiAgICAgICAgcHJpdmF0ZUtlcm5lbF9wYXRoID0gdmFsdWU7CiAgICB9CgogICAgcHJpdmF0ZSBO b3RDaGFuZ2FibGVGb3JWbUluUG9vbEVudGl0eU1vZGVsIHByaXZhdGVLZXJuZWxfcGFyYW1ldGVy czsKCiAgICBwdWJsaWMgRW50aXR5TW9kZWwgZ2V0S2VybmVsX3BhcmFtZXRlcnMoKQogICAgewog ICAgICAgIHJldHVybiBwcml2YXRlS2VybmVsX3BhcmFtZXRlcnM7CiAgICB9CgogICAgcHJpdmF0 ZSB2b2lkIHNldEtlcm5lbF9wYXJhbWV0ZXJzKE5vdENoYW5nYWJsZUZvclZtSW5Qb29sRW50aXR5 TW9kZWwgdmFsdWUpCiAgICB7CiAgICAgICAgcHJpdmF0ZUtlcm5lbF9wYXJhbWV0ZXJzID0gdmFs dWU7CiAgICB9CgogICAgcHJpdmF0ZSBOb3RDaGFuZ2FibGVGb3JWbUluUG9vbEVudGl0eU1vZGVs IHByaXZhdGVDdXN0b21Qcm9wZXJ0aWVzOwoKICAgIHB1YmxpYyBFbnRpdHlNb2RlbCBnZXRDdXN0 b21Qcm9wZXJ0aWVzKCkKICAgIHsKICAgICAgICByZXR1cm4gcHJpdmF0ZUN1c3RvbVByb3BlcnRp ZXM7CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIHNldEN1c3RvbVByb3BlcnRpZXMoTm90Q2hhbmdh YmxlRm9yVm1JblBvb2xFbnRpdHlNb2RlbCB2YWx1ZSkKICAgIHsKICAgICAgICBwcml2YXRlQ3Vz dG9tUHJvcGVydGllcyA9IHZhbHVlOwogICAgfQoKICAgIHByaXZhdGUgTm90Q2hhbmdhYmxlRm9y Vm1JblBvb2xLZXlWYWx1ZU1vZGVsIGN1c3RvbVByb3BlcnR5U2hlZXQ7CgogICAgcHVibGljIEtl eVZhbHVlTW9kZWwgZ2V0Q3VzdG9tUHJvcGVydHlTaGVldCgpIHsKICAgICAgICByZXR1cm4gY3Vz dG9tUHJvcGVydHlTaGVldDsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21Qcm9wZXJ0 eVNoZWV0KE5vdENoYW5nYWJsZUZvclZtSW5Qb29sS2V5VmFsdWVNb2RlbCBjdXN0b21Qcm9wZXJ0 eVNoZWV0KSB7CiAgICAgICAgdGhpcy5jdXN0b21Qcm9wZXJ0eVNoZWV0ID0gY3VzdG9tUHJvcGVy dHlTaGVldDsKICAgIH0KCiAgICBwcml2YXRlIEhhc2hNYXA8VmVyc2lvbiwgQXJyYXlMaXN0PFN0 cmluZz4+IHByaXZhdGVDdXN0b21Qcm9wZXJ0aWVzS2V5c0xpc3Q7CgogICAgcHVibGljIEhhc2hN YXA8VmVyc2lvbiwgQXJyYXlMaXN0PFN0cmluZz4+IGdldEN1c3RvbVByb3BlcnRpZXNLZXlzTGlz dCgpCiAgICB7CiAgICAgICAgcmV0dXJuIHByaXZhdGVDdXN0b21Qcm9wZXJ0aWVzS2V5c0xpc3Q7 CiAgICB9CgogICAgcHVibGljIHZvaWQgc2V0Q3VzdG9tUHJvcGVydGllc0tleXNMaXN0KEhhc2hN YXA8VmVyc2lvbiwgQXJyYXlMaXN0PFN0cmluZz4+IHZhbHVlKQogICAgewogICAgICAgIHByaXZh dGVDdXN0b21Qcm9wZXJ0aWVzS2V5c0xpc3QgPSB2YWx1ZTsKICAgIH0KCiAgICBwcml2YXRlIE5v dENoYW5nYWJsZUZvclZtSW5Qb29sRW50aXR5TW9kZWwgcHJpdmF0ZUlzQXV0b0Fzc2lnbjsKCiAg ICBwdWJsaWMgRW50aXR5TW9kZWwgZ2V0SXNBdXRvQXNzaWduKCkKICAgIHsKICAgICAgICByZXR1 cm4gcHJpdmF0ZUlzQXV0b0Fzc2lnbjsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBzZXRJc0F1dG9B c3NpZ24oTm90Q2hhbmdhYmxlRm9yVm1JblBvb2xFbnRpdHlNb2RlbCB2YWx1ZSkKICAgIHsKICAg ICAgICBwcml2YXRlSXNBdXRvQXNzaWduID0gdmFsdWU7CiAgICB9CgogICAgcHJpdmF0ZSBOb3RD aGFuZ2FibGVGb3JWbUluUG9vbEVudGl0eU1vZGVsIHByaXZhdGVSdW5WTU9uU3BlY2lmaWNIb3N0 OwoKICAgIHB1YmxpYyBFbnRpdHlNb2RlbCBnZXRSdW5WTU9uU3BlY2lmaWNIb3N0KCkKICAgIHsK ICAgICAgICByZXR1cm4gcHJpdmF0ZVJ1blZNT25TcGVjaWZpY0hvc3Q7CiAgICB9CgogICAgcHVi bGljIHZvaWQgc2V0UnVuVk1PblNwZWNpZmljSG9zdChOb3RDaGFuZ2FibGVGb3JWbUluUG9vbEVu dGl0eU1vZGVsIHZhbHVlKQogICAgewogICAgICAgIHByaXZhdGVSdW5WTU9uU3BlY2lmaWNIb3N0 ID0gdmFsdWU7CiAgICB9CgogICAgcHJpdmF0ZSBOb3RDaGFuZ2FibGVGb3JWbUluUG9vbEVudGl0 eU1vZGVsIHByaXZhdGVSdW5WTU9uVHJ1c3RlZEhvc3Q7CgogICAgcHVibGljIEVudGl0eU1vZGVs IGdldFJ1blZNT25UcnVzdGVkSG9zdCgpCiAgICB7CiAgICAgICAgcmV0dXJuIHByaXZhdGVSdW5W TU9uVHJ1c3RlZEhvc3Q7CiAgICB9CgogICAgcHVibGljIHZvaWQgc2V0UnVuVk1PblRydXN0ZWRI b3N0KE5vdENoYW5nYWJsZUZvclZtSW5Qb29sRW50aXR5TW9kZWwgdmFsdWUpCiAgICB7CiAgICAg ICAgcHJpdmF0ZVJ1blZNT25UcnVzdGVkSG9zdCA9IHZhbHVlOwogICAgfQoKICAgIHByaXZhdGUg Tm90Q2hhbmdhYmxlRm9yVm1JblBvb2xFbnRpdHlNb2RlbCBob3N0Q3B1OwoKICAgIHB1YmxpYyBF bnRpdHlNb2RlbCBnZXRIb3N0Q3B1KCkgewogICAgICAgIHJldHVybiBob3N0Q3B1OwogICAgfQoK ICAgIHB1YmxpYyB2b2lkIHNldEhvc3RDcHUoTm90Q2hhbmdhYmxlRm9yVm1JblBvb2xFbnRpdHlN b2RlbCBob3N0Q3B1KSB7CiAgICAgICAgdGhpcy5ob3N0Q3B1ID0gaG9zdENwdTsKICAgIH0KCiAg ICBwcml2YXRlIE5vdENoYW5nYWJsZUZvclZtSW5Qb29sRW50aXR5TW9kZWwgcHJpdmF0ZURvbnRN aWdyYXRlVk07CgogICAgcHVibGljIEVudGl0eU1vZGVsIGdldERvbnRNaWdyYXRlVk0oKQogICAg ewogICAgICAgIHJldHVybiBwcml2YXRlRG9udE1pZ3JhdGVWTTsKICAgIH0KCiAgICBwdWJsaWMg dm9pZCBzZXREb250TWlncmF0ZVZNKE5vdENoYW5nYWJsZUZvclZtSW5Qb29sRW50aXR5TW9kZWwg dmFsdWUpCiAgICB7CiAgICAgICAgcHJpdmF0ZURvbnRNaWdyYXRlVk0gPSB2YWx1ZTsKICAgIH0K CiAgICBwcml2YXRlIE5vdENoYW5nYWJsZUZvclZtSW5Qb29sRW50aXR5TW9kZWwgcHJpdmF0ZUlz VGVtcGxhdGVQdWJsaWM7CgogICAgcHVibGljIEVudGl0eU1vZGVsIGdldElzVGVtcGxhdGVQdWJs aWMoKQogICAgewogICAgICAgIHJldHVybiBwcml2YXRlSXNUZW1wbGF0ZVB1YmxpYzsKICAgIH0K CiAgICBwcml2YXRlIHZvaWQgc2V0SXNUZW1wbGF0ZVB1YmxpYyhOb3RDaGFuZ2FibGVGb3JWbUlu UG9vbEVudGl0eU1vZGVsIHZhbHVlKQogICAgewogICAgICAgIHByaXZhdGVJc1RlbXBsYXRlUHVi bGljID0gdmFsdWU7CiAgICB9CgogICAgcHJpdmF0ZSBib29sZWFuIHByaXZhdGVJc0ZpcnN0UnVu OwoKICAgIHB1YmxpYyBib29sZWFuIGdldElzRmlyc3RSdW4oKQogICAgewogICAgICAgIHJldHVy biBwcml2YXRlSXNGaXJzdFJ1bjsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBzZXRJc0ZpcnN0UnVu KGJvb2xlYW4gdmFsdWUpCiAgICB7CiAgICAgICAgcHJpdmF0ZUlzRmlyc3RSdW4gPSB2YWx1ZTsK ICAgIH0KCiAgICBwcml2YXRlIExpc3Q8RGlza01vZGVsPiBkaXNrczsKCiAgICBwdWJsaWMgTGlz dDxEaXNrTW9kZWw+IGdldERpc2tzKCkKICAgIHsKICAgICAgICByZXR1cm4gZGlza3M7CiAgICB9 CgogICAgcHVibGljIHZvaWQgc2V0RGlza3MoTGlzdDxEaXNrTW9kZWw+IHZhbHVlKQogICAgewog ICAgICAgIGlmIChkaXNrcyAhPSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGRpc2tzID0g dmFsdWU7CiAgICAgICAgICAgIE9uUHJvcGVydHlDaGFuZ2VkKG5ldyBQcm9wZXJ0eUNoYW5nZWRF dmVudEFyZ3MoIkRpc2tzIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgfQogICAgfQoKICAgIHBy aXZhdGUgRGlza3NBbGxvY2F0aW9uTW9kZWwgZGlza3NBbGxvY2F0aW9uTW9kZWw7CgogICAgcHVi bGljIERpc2tzQWxsb2NhdGlvbk1vZGVsIGdldERpc2tzQWxsb2NhdGlvbk1vZGVsKCkKICAgIHsK ICAgICAgICByZXR1cm4gZGlza3NBbGxvY2F0aW9uTW9kZWw7CiAgICB9CgogICAgcHJpdmF0ZSB2 b2lkIHNldERpc2tzQWxsb2NhdGlvbk1vZGVsKERpc2tzQWxsb2NhdGlvbk1vZGVsIHZhbHVlKQog ICAgewogICAgICAgIGRpc2tzQWxsb2NhdGlvbk1vZGVsID0gdmFsdWU7CiAgICB9CgogICAgcHJp dmF0ZSBib29sZWFuIGlzRGlza3NBdmFpbGFibGU7CgogICAgcHVibGljIGJvb2xlYW4gZ2V0SXNE aXNrc0F2YWlsYWJsZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIGlzRGlza3NBdmFpbGFibGU7CiAg ICB9CgogICAgcHVibGljIHZvaWQgc2V0SXNEaXNrc0F2YWlsYWJsZShib29sZWFuIHZhbHVlKQog ICAgewogICAgICAgIGlmIChpc0Rpc2tzQXZhaWxhYmxlICE9IHZhbHVlKQogICAgICAgIHsKICAg ICAgICAgICAgaXNEaXNrc0F2YWlsYWJsZSA9IHZhbHVlOwogICAgICAgICAgICBPblByb3BlcnR5 Q2hhbmdlZChuZXcgUHJvcGVydHlDaGFuZ2VkRXZlbnRBcmdzKCJJc0Rpc2tzQXZhaWxhYmxlIikp OyAvLyROT04tTkxTLTEkCiAgICAgICAgfQogICAgfQoKICAgIHByaXZhdGUgYm9vbGVhbiBpc0hv c3RBdmFpbGFibGU7CgogICAgcHVibGljIGJvb2xlYW4gZ2V0SXNIb3N0QXZhaWxhYmxlKCkKICAg IHsKICAgICAgICByZXR1cm4gaXNIb3N0QXZhaWxhYmxlOwogICAgfQoKICAgIHB1YmxpYyB2b2lk IHNldElzSG9zdEF2YWlsYWJsZShib29sZWFuIHZhbHVlKQogICAgewogICAgICAgIGlmIChpc0hv c3RBdmFpbGFibGUgIT0gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBpc0hvc3RBdmFpbGFi bGUgPSB2YWx1ZTsKICAgICAgICAgICAgT25Qcm9wZXJ0eUNoYW5nZWQobmV3IFByb3BlcnR5Q2hh bmdlZEV2ZW50QXJncygiSXNIb3N0QXZhaWxhYmxlIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAg fQogICAgfQoKICAgIHByaXZhdGUgQm9vbGVhbiBpc0RhdGFjZW50ZXJBdmFpbGFibGU7CgogICAg cHVibGljIEJvb2xlYW4gZ2V0SXNEYXRhY2VudGVyQXZhaWxhYmxlKCkKICAgIHsKICAgICAgICBy ZXR1cm4gaXNEYXRhY2VudGVyQXZhaWxhYmxlOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHNldElz RGF0YWNlbnRlckF2YWlsYWJsZShCb29sZWFuIHZhbHVlKQogICAgewogICAgICAgIGlmIChpc0Rh dGFjZW50ZXJBdmFpbGFibGUgPT0gbnVsbCAmJiB2YWx1ZSA9PSBudWxsKQogICAgICAgIHsKICAg ICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoaXNEYXRhY2VudGVyQXZhaWxh YmxlID09IG51bGwgfHwgIWlzRGF0YWNlbnRlckF2YWlsYWJsZS5lcXVhbHModmFsdWUpKQogICAg ICAgIHsKICAgICAgICAgICAgaXNEYXRhY2VudGVyQXZhaWxhYmxlID0gdmFsdWU7CiAgICAgICAg ICAgIE9uUHJvcGVydHlDaGFuZ2VkKG5ldyBQcm9wZXJ0eUNoYW5nZWRFdmVudEFyZ3MoIklzRGF0 YWNlbnRlckF2YWlsYWJsZSIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgIH0KICAgIH0KCiAgICBw cml2YXRlIGZpbmFsIFZtTW9kZWxCZWhhdmlvckJhc2UgYmVoYXZpb3I7CgogICAgcHVibGljIFZt TW9kZWxCZWhhdmlvckJhc2UgZ2V0QmVoYXZpb3IoKSB7CiAgICAgICAgcmV0dXJuIGJlaGF2aW9y OwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBzZXRCZWhhdmlvcihWbU1vZGVsQmVoYXZpb3JCYXNl IHZhbHVlKSB7CiAgICB9CgogICAgcHJpdmF0ZSBpbnQgX21pbk1lbVNpemUgPSAxOwoKICAgIHB1 YmxpYyBpbnQgZ2V0X01pbk1lbVNpemUoKQogICAgewogICAgICAgIHJldHVybiBfbWluTWVtU2l6 ZTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBzZXRfTWluTWVtU2l6ZShpbnQgdmFsdWUpCiAgICB7 CiAgICAgICAgX21pbk1lbVNpemUgPSB2YWx1ZTsKICAgIH0KCiAgICBwcml2YXRlIGludCBfbWF4 TWVtU2l6ZTMyID0gMjA0ODA7CgogICAgcHVibGljIGludCBnZXRfTWF4TWVtU2l6ZTMyKCkKICAg IHsKICAgICAgICByZXR1cm4gX21heE1lbVNpemUzMjsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBz ZXRfTWF4TWVtU2l6ZTMyKGludCB2YWx1ZSkKICAgIHsKICAgICAgICBfbWF4TWVtU2l6ZTMyID0g dmFsdWU7CiAgICB9CgogICAgcHJpdmF0ZSBpbnQgX21heE1lbVNpemU2NCA9IDI2MjE0NDsKCiAg ICBwdWJsaWMgaW50IGdldF9NYXhNZW1TaXplNjQoKQogICAgewogICAgICAgIHJldHVybiBfbWF4 TWVtU2l6ZTY0OwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHNldF9NYXhNZW1TaXplNjQoaW50IHZh bHVlKQogICAgewogICAgICAgIF9tYXhNZW1TaXplNjQgPSB2YWx1ZTsKICAgIH0KCiAgICBwcml2 YXRlIE5vdENoYW5nYWJsZUZvclZtSW5Qb29sRW50aXR5TW9kZWwgY3B1UGlubmluZzsKCiAgICBw dWJsaWMgRW50aXR5TW9kZWwgZ2V0Q3B1UGlubmluZygpIHsKICAgICAgICByZXR1cm4gY3B1UGlu bmluZzsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBzZXRDcHVQaW5uaW5nKE5vdENoYW5nYWJsZUZv clZtSW5Qb29sRW50aXR5TW9kZWwgY3B1UGlubmluZykgewogICAgICAgIHRoaXMuY3B1UGlubmlu ZyA9IGNwdVBpbm5pbmc7CiAgICB9CgogICAgcHVibGljIFVuaXRWbU1vZGVsKFZtTW9kZWxCZWhh dmlvckJhc2UgYmVoYXZpb3IpCiAgICB7CiAgICAgICAgRnJvbnRlbmQuZ2V0UXVlcnlTdGFydGVk RXZlbnQoKS5hZGRMaXN0ZW5lcih0aGlzKTsKICAgICAgICBGcm9udGVuZC5nZXRRdWVyeUNvbXBs ZXRlRXZlbnQoKS5hZGRMaXN0ZW5lcih0aGlzKTsKCiAgICAgICAgRnJvbnRlbmQuU3Vic2NyaWJl KG5ldyBWZGNRdWVyeVR5cGVbXSB7IFZkY1F1ZXJ5VHlwZS5HZXRTdG9yYWdlRG9tYWluc0J5U3Rv cmFnZVBvb2xJZCwKICAgICAgICAgICAgICAgIFZkY1F1ZXJ5VHlwZS5HZXRBbGxJc29JbWFnZXNM aXN0QnlTdG9yYWdlUG9vbElkLCBWZGNRdWVyeVR5cGUuR2V0VGltZVpvbmVzLAogICAgICAgICAg ICAgICAgVmRjUXVlcnlUeXBlLkdldERlZnVhbHRUaW1lWm9uZSwKICAgICAgICAgICAgICAgIFZk Y1F1ZXJ5VHlwZS5HZXREb21haW5MaXN0LCBWZGNRdWVyeVR5cGUuR2V0Q29uZmlndXJhdGlvblZh bHVlLAogICAgICAgICAgICAgICAgVmRjUXVlcnlUeXBlLkdldFZkc0dyb3Vwc0J5U3RvcmFnZVBv b2xJZCwgVmRjUXVlcnlUeXBlLkdldFZtVGVtcGxhdGVzQnlTdG9yYWdlUG9vbElkLAogICAgICAg ICAgICAgICAgVmRjUXVlcnlUeXBlLkdldFZtVGVtcGxhdGVzRGlza3MsIFZkY1F1ZXJ5VHlwZS5H ZXRTdG9yYWdlRG9tYWluc0J5Vm1UZW1wbGF0ZUlkLAogICAgICAgICAgICAgICAgVmRjUXVlcnlU eXBlLkdldFN0b3JhZ2VEb21haW5CeUlkLCBWZGNRdWVyeVR5cGUuR2V0RGF0YUNlbnRlcnNXaXRo UGVybWl0dGVkQWN0aW9uT25DbHVzdGVycywKICAgICAgICAgICAgICAgIFZkY1F1ZXJ5VHlwZS5H ZXRDbHVzdGVyc1dpdGhQZXJtaXR0ZWRBY3Rpb24sIFZkY1F1ZXJ5VHlwZS5HZXRWbVRlbXBsYXRl c1dpdGhQZXJtaXR0ZWRBY3Rpb24sCiAgICAgICAgICAgICAgICBWZGNRdWVyeVR5cGUuR2V0VmRz R3JvdXBCeUlkLCBWZGNRdWVyeVR5cGUuR2V0U3RvcmFnZVBvb2xCeUlkLCBWZGNRdWVyeVR5cGUu R2V0QWxsRGlza3NCeVZtSWQsCiAgICAgICAgICAgICAgICBWZGNRdWVyeVR5cGUuR2V0Vm1UZW1w bGF0ZSwgVmRjUXVlcnlUeXBlLkdldFZtQ29uZmlndXJhdGlvbkJ5U25hcHNob3QsCiAgICAgICAg ICAgICAgICBWZGNRdWVyeVR5cGUuR2V0UGVybWl0dGVkU3RvcmFnZURvbWFpbnNCeVN0b3JhZ2VQ b29sSWQsIFZkY1F1ZXJ5VHlwZS5TZWFyY2ggfSk7CgogICAgICAgIHRoaXMuYmVoYXZpb3IgPSBi ZWhhdmlvcjsKICAgICAgICB0aGlzLmJlaGF2aW9yLnNldE1vZGVsKHRoaXMpOwoKICAgICAgICBz ZXRTdG9yYWdlRG9tYWluKG5ldyBOb3RDaGFuZ2FibGVGb3JWbUluUG9vbExpc3RNb2RlbCgpKTsK ICAgICAgICBzZXROYW1lKG5ldyBOb3RDaGFuZ2FibGVGb3JWbUluUG9vbEVudGl0eU1vZGVsKCkp OwogICAgICAgIHNldE51bU9mTW9uaXRvcnMobmV3IE5vdENoYW5nYWJsZUZvclZtSW5Qb29sTGlz dE1vZGVsKCkpOwogICAgICAgIHNldEFsbG93Q29uc29sZVJlY29ubmVjdChuZXcgTm90Q2hhbmdh YmxlRm9yVm1JblBvb2xFbnRpdHlNb2RlbCgpKTsKICAgICAgICBzZXREZXNjcmlwdGlvbihuZXcg Tm90Q2hhbmdhYmxlRm9yVm1JblBvb2xFbnRpdHlNb2RlbCgpKTsKICAgICAgICBzZXREb21haW4o bmV3IE5vdENoYW5nYWJsZUZvclZtSW5Qb29sTGlzdE1vZGVsKCkpOwogICAgICAgIHNldE1pbkFs bG9jYXRlZE1lbW9yeShuZXcgTm90Q2hhbmdhYmxlRm9yVm1JblBvb2xFbnRpdHlNb2RlbCgpKTsK ICAgICAgICBzZXRVc2JQb2xpY3kobmV3IE5vdENoYW5nYWJsZUZvclZtSW5Qb29sTGlzdE1vZGVs KCkpOwogICAgICAgIHNldElzU3RhdGVsZXNzKG5ldyBOb3RDaGFuZ2FibGVGb3JWbUluUG9vbEVu dGl0eU1vZGVsKCkpOwogICAgICAgIHNldElzU21hcnRjYXJkRW5hYmxlZChuZXcgTm90Q2hhbmdh YmxlRm9yVm1JblBvb2xFbnRpdHlNb2RlbCgpKTsKICAgICAgICBzZXRJc0RlbGV0ZVByb3RlY3Rl ZChuZXcgTm90Q2hhbmdhYmxlRm9yVm1JblBvb2xFbnRpdHlNb2RlbCgpKTsKCiAgICAgICAgc2V0 Q2RJbWFnZShuZXcgTm90Q2hhbmdhYmxlRm9yVm1JblBvb2xMaXN0TW9kZWwoKSk7CiAgICAgICAg Z2V0Q2RJbWFnZSgpLnNldElzQ2hhbmdhYmxlKGZhbHNlKTsKCiAgICAgICAgc2V0Q2RBdHRhY2hl ZChuZXcgTm90Q2hhbmdhYmxlRm9yVm1JblBvb2xFbnRpdHlNb2RlbCgpKTsKICAgICAgICBnZXRD ZEF0dGFjaGVkKCkuZ2V0RW50aXR5Q2hhbmdlZEV2ZW50KCkuYWRkTGlzdGVuZXIobmV3IElFdmVu dExpc3RlbmVyKCkgewogICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgcHVibGljIHZv aWQgZXZlbnRSYWlzZWQoRXZlbnQgZXYsIE9iamVjdCBzZW5kZXIsIEV2ZW50QXJncyBhcmdzKSB7 CgogICAgICAgICAgICAgICAgZ2V0Q2RJbWFnZSgpLnNldElzQ2hhbmdhYmxlKChCb29sZWFuKSBn ZXRDZEF0dGFjaGVkKCkuZ2V0RW50aXR5KCkpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAg ICAgICAgZ2V0Q2RBdHRhY2hlZCgpLnNldEVudGl0eShmYWxzZSk7CgogICAgICAgIHNldElzSGln aGx5QXZhaWxhYmxlKG5ldyBOb3RDaGFuZ2FibGVGb3JWbUluUG9vbEVudGl0eU1vZGVsKCkpOwog ICAgICAgIHNldERvbnRNaWdyYXRlVk0obmV3IE5vdENoYW5nYWJsZUZvclZtSW5Qb29sRW50aXR5 TW9kZWwoKSk7CiAgICAgICAgc2V0SXNUZW1wbGF0ZVB1YmxpYyhuZXcgTm90Q2hhbmdhYmxlRm9y Vm1JblBvb2xFbnRpdHlNb2RlbCgpKTsKICAgICAgICBzZXRLZXJuZWxfcGFyYW1ldGVycyhuZXcg Tm90Q2hhbmdhYmxlRm9yVm1JblBvb2xFbnRpdHlNb2RlbCgpKTsKICAgICAgICBzZXRLZXJuZWxf cGF0aChuZXcgTm90Q2hhbmdhYmxlRm9yVm1JblBvb2xFbnRpdHlNb2RlbCgpKTsKICAgICAgICBz ZXRJbml0cmRfcGF0aChuZXcgTm90Q2hhbmdhYmxlRm9yVm1JblBvb2xFbnRpdHlNb2RlbCgpKTsK ICAgICAgICBzZXRDdXN0b21Qcm9wZXJ0aWVzKG5ldyBOb3RDaGFuZ2FibGVGb3JWbUluUG9vbEVu dGl0eU1vZGVsKCkpOwogICAgICAgIHNldEN1c3RvbVByb3BlcnR5U2hlZXQobmV3IE5vdENoYW5n YWJsZUZvclZtSW5Qb29sS2V5VmFsdWVNb2RlbCgpKTsKICAgICAgICBzZXREaXNwbGF5UHJvdG9j b2wobmV3IE5vdENoYW5nYWJsZUZvclZtSW5Qb29sTGlzdE1vZGVsKCkpOwogICAgICAgIHNldFNl Y29uZEJvb3REZXZpY2UobmV3IE5vdENoYW5nYWJsZUZvclZtSW5Qb29sTGlzdE1vZGVsKCkpOwog ICAgICAgIHNldFByaW9yaXR5KG5ldyBOb3RDaGFuZ2FibGVGb3JWbUluUG9vbExpc3RNb2RlbCgp KTsKCiAgICAgICAgc2V0RGF0YUNlbnRlcihuZXcgTm90Q2hhbmdhYmxlRm9yVm1JblBvb2xMaXN0 TW9kZWwoKSk7CiAgICAgICAgZ2V0RGF0YUNlbnRlcigpLmdldFNlbGVjdGVkSXRlbUNoYW5nZWRF dmVudCgpLmFkZExpc3RlbmVyKHRoaXMpOwoKICAgICAgICBzZXRUZW1wbGF0ZShuZXcgTm90Q2hh bmdhYmxlRm9yVm1JblBvb2xMaXN0TW9kZWwoKSk7CiAgICAgICAgZ2V0VGVtcGxhdGUoKS5nZXRT ZWxlY3RlZEl0ZW1DaGFuZ2VkRXZlbnQoKS5hZGRMaXN0ZW5lcih0aGlzKTsKCiAgICAgICAgc2V0 UXVvdGEobmV3IE5vdENoYW5nYWJsZUZvclZtSW5Qb29sTGlzdE1vZGVsKCkpOwogICAgICAgIGdl dFF1b3RhKCkuc2V0SXNBdmFpbGFibGUoZmFsc2UpOwoKICAgICAgICBzZXRDbHVzdGVyKG5ldyBO b3RDaGFuZ2FibGVGb3JWbUluUG9vbExpc3RNb2RlbCgpKTsKICAgICAgICBnZXRDbHVzdGVyKCku Z2V0U2VsZWN0ZWRJdGVtQ2hhbmdlZEV2ZW50KCkuYWRkTGlzdGVuZXIodGhpcyk7CgogICAgICAg IHNldFRpbWVab25lKG5ldyBOb3RDaGFuZ2FibGVGb3JWbUluUG9vbExpc3RNb2RlbCgpKTsKICAg ICAgICBnZXRUaW1lWm9uZSgpLmdldFNlbGVjdGVkSXRlbUNoYW5nZWRFdmVudCgpLmFkZExpc3Rl bmVyKHRoaXMpOwoKICAgICAgICBzZXREZWZhdWx0SG9zdChuZXcgTm90Q2hhbmdhYmxlRm9yVm1J blBvb2xMaXN0TW9kZWwoKSk7CiAgICAgICAgZ2V0RGVmYXVsdEhvc3QoKS5nZXRTZWxlY3RlZEl0 ZW1DaGFuZ2VkRXZlbnQoKS5hZGRMaXN0ZW5lcih0aGlzKTsKCiAgICAgICAgc2V0T1NUeXBlKG5l dyBOb3RDaGFuZ2FibGVGb3JWbUluUG9vbExpc3RNb2RlbCgpKTsKICAgICAgICBnZXRPU1R5cGUo KS5nZXRTZWxlY3RlZEl0ZW1DaGFuZ2VkRXZlbnQoKS5hZGRMaXN0ZW5lcih0aGlzKTsKCiAgICAg ICAgc2V0Rmlyc3RCb290RGV2aWNlKG5ldyBOb3RDaGFuZ2FibGVGb3JWbUluUG9vbExpc3RNb2Rl bCgpKTsKICAgICAgICBnZXRGaXJzdEJvb3REZXZpY2UoKS5nZXRTZWxlY3RlZEl0ZW1DaGFuZ2Vk RXZlbnQoKS5hZGRMaXN0ZW5lcih0aGlzKTsKCiAgICAgICAgc2V0UHJvdmlzaW9uaW5nKG5ldyBO b3RDaGFuZ2FibGVGb3JWbUluUG9vbEVudGl0eU1vZGVsKCkpOwogICAgICAgIGdldFByb3Zpc2lv bmluZygpLmdldEVudGl0eUNoYW5nZWRFdmVudCgpLmFkZExpc3RlbmVyKHRoaXMpOwoKICAgICAg ICBzZXRNZW1TaXplKG5ldyBOb3RDaGFuZ2FibGVGb3JWbUluUG9vbEVudGl0eU1vZGVsKCkpOwog ICAgICAgIGdldE1lbVNpemUoKS5nZXRFbnRpdHlDaGFuZ2VkRXZlbnQoKS5hZGRMaXN0ZW5lcih0 aGlzKTsKCiAgICAgICAgc2V0VG90YWxDUFVDb3JlcyhuZXcgTm90Q2hhbmdhYmxlRm9yVm1JblBv b2xFbnRpdHlNb2RlbCgpKTsKICAgICAgICBnZXRUb3RhbENQVUNvcmVzKCkuZ2V0RW50aXR5Q2hh bmdlZEV2ZW50KCkuYWRkTGlzdGVuZXIodGhpcyk7CgogICAgICAgIHNldE51bU9mU29ja2V0cyhu ZXcgTm90Q2hhbmdhYmxlRm9yVm1JblBvb2xMaXN0TW9kZWwoKSk7CiAgICAgICAgZ2V0TnVtT2ZT b2NrZXRzKCkuZ2V0U2VsZWN0ZWRJdGVtQ2hhbmdlZEV2ZW50KCkuYWRkTGlzdGVuZXIodGhpcyk7 CgogICAgICAgIHNldENvcmVzUGVyU29ja2V0KG5ldyBOb3RDaGFuZ2FibGVGb3JWbUluUG9vbExp c3RNb2RlbCgpKTsKICAgICAgICBnZXRDb3Jlc1BlclNvY2tldCgpLmdldFNlbGVjdGVkSXRlbUNo YW5nZWRFdmVudCgpLmFkZExpc3RlbmVyKHRoaXMpOwoKICAgICAgICBzZXRSdW5WTU9uU3BlY2lm aWNIb3N0KG5ldyBOb3RDaGFuZ2FibGVGb3JWbUluUG9vbEVudGl0eU1vZGVsKCkpOwogICAgICAg IGdldFJ1blZNT25TcGVjaWZpY0hvc3QoKS5nZXRFbnRpdHlDaGFuZ2VkRXZlbnQoKS5hZGRMaXN0 ZW5lcih0aGlzKTsKCiAgICAgICAgc2V0UnVuVk1PblRydXN0ZWRIb3N0KG5ldyBOb3RDaGFuZ2Fi bGVGb3JWbUluUG9vbEVudGl0eU1vZGVsKCkpOwogICAgICAgIGdldFJ1blZNT25UcnVzdGVkSG9z dCgpLmdldEVudGl0eUNoYW5nZWRFdmVudCgpLmFkZExpc3RlbmVyKHRoaXMpOwoKICAgICAgICBz ZXRIb3N0Q3B1KG5ldyBOb3RDaGFuZ2FibGVGb3JWbUluUG9vbEVudGl0eU1vZGVsKCkpOwogICAg ICAgIGdldEhvc3RDcHUoKS5nZXRFbnRpdHlDaGFuZ2VkRXZlbnQoKS5hZGRMaXN0ZW5lcih0aGlz KTsKCiAgICAgICAgc2V0RG9udE1pZ3JhdGVWTShuZXcgTm90Q2hhbmdhYmxlRm9yVm1JblBvb2xF bnRpdHlNb2RlbCgpKTsKICAgICAgICBnZXREb250TWlncmF0ZVZNKCkuZ2V0RW50aXR5Q2hhbmdl ZEV2ZW50KCkuYWRkTGlzdGVuZXIodGhpcyk7CgogICAgICAgIHNldElzQXV0b0Fzc2lnbihuZXcg Tm90Q2hhbmdhYmxlRm9yVm1JblBvb2xFbnRpdHlNb2RlbCgpKTsKICAgICAgICBnZXRJc0F1dG9B c3NpZ24oKS5nZXRFbnRpdHlDaGFuZ2VkRXZlbnQoKS5hZGRMaXN0ZW5lcih0aGlzKTsKCiAgICAg ICAgc2V0SXNUZW1wbGF0ZVB1YmxpYyhuZXcgTm90Q2hhbmdhYmxlRm9yVm1JblBvb2xFbnRpdHlN b2RlbCgpKTsKICAgICAgICBnZXRJc1RlbXBsYXRlUHVibGljKCkuZ2V0RW50aXR5Q2hhbmdlZEV2 ZW50KCkuYWRkTGlzdGVuZXIodGhpcyk7CgogICAgICAgIHNldElzSG9zdFRhYlZhbGlkKHRydWUp OwogICAgICAgIHNldElzQ3VzdG9tUHJvcGVydGllc1RhYlZhbGlkKGdldElzSG9zdFRhYlZhbGlk KCkpOwogICAgICAgIHNldElzQm9vdFNlcXVlbmNlVGFiVmFsaWQoZ2V0SXNDdXN0b21Qcm9wZXJ0 aWVzVGFiVmFsaWQoKSk7CiAgICAgICAgc2V0SXNBbGxvY2F0aW9uVGFiVmFsaWQoZ2V0SXNCb290 U2VxdWVuY2VUYWJWYWxpZCgpKTsKICAgICAgICBzZXRJc0Rpc3BsYXlUYWJWYWxpZChnZXRJc0Fs bG9jYXRpb25UYWJWYWxpZCgpKTsKICAgICAgICBzZXRJc0ZpcnN0UnVuVGFiVmFsaWQoZ2V0SXNE aXNwbGF5VGFiVmFsaWQoKSk7CiAgICAgICAgc2V0SXNHZW5lcmFsVGFiVmFsaWQoZ2V0SXNGaXJz dFJ1blRhYlZhbGlkKCkpOwoKICAgICAgICAvLyBOT1RFOiBUaGlzIGlzIGJlY2F1c2UgY3VycmVu dGx5IHRoZSBhdXRvIGdlbmVyYXRlZCB2aWV3IGNvZGUgdHJpZXMgdG8gcmVnaXN0ZXIgZXZlbnRz IG9mIHBvb2x0eXBlIGZvcgogICAgICAgIC8vIFZNL1RlbXBsYXRlIHZpZXdzIGFzIHRoaXMgbW9k ZWwgaXMgc2hhcmVkIGFjcm9zcyBWTS9UZW1wbGF0ZS9Qb29sIG1vZGVscwogICAgICAgIHNldFBv b2xUeXBlKG5ldyBOb3RDaGFuZ2FibGVGb3JWbUluUG9vbExpc3RNb2RlbCgpKTsKCiAgICAgICAg c2V0TnVtT2ZEZXNrdG9wcyhuZXcgTm90Q2hhbmdhYmxlRm9yVm1JblBvb2xFbnRpdHlNb2RlbCgp KTsKICAgICAgICBnZXROdW1PZkRlc2t0b3BzKCkuc2V0RW50aXR5KDApOwogICAgICAgIGdldE51 bU9mRGVza3RvcHMoKS5zZXRJc0F2YWlsYWJsZShmYWxzZSk7CgogICAgICAgIHNldEFzc2lnbmVk Vm1zKG5ldyBOb3RDaGFuZ2FibGVGb3JWbUluUG9vbEVudGl0eU1vZGVsKCkpOwogICAgICAgIGdl dEFzc2lnbmVkVm1zKCkuc2V0RW50aXR5KDApOwogICAgICAgIGdldEFzc2lnbmVkVm1zKCkuc2V0 SXNBdmFpbGFibGUoZmFsc2UpOwogICAgICAgIC8vIEFzc2lnbmVkIFZNcyBjb3VudCBpcyBhbHdh eXMgcmVhZC1vbmx5LgogICAgICAgIGdldEFzc2lnbmVkVm1zKCkuc2V0SXNDaGFuZ2FibGUoZmFs c2UpOwoKICAgICAgICBzZXRQcmVzdGFydGVkVm1zKG5ldyBOb3RDaGFuZ2FibGVGb3JWbUluUG9v bEVudGl0eU1vZGVsKCkpOwogICAgICAgIGdldFByZXN0YXJ0ZWRWbXMoKS5zZXRFbnRpdHkoMCk7 CiAgICAgICAgZ2V0UHJlc3RhcnRlZFZtcygpLnNldElzQXZhaWxhYmxlKGZhbHNlKTsKCiAgICAg ICAgc2V0RGlza3NBbGxvY2F0aW9uTW9kZWwobmV3IERpc2tzQWxsb2NhdGlvbk1vZGVsKCkpOwoK ICAgICAgICBzZXRQcm92aXNpb25pbmdDbG9uZV9Jc1NlbGVjdGVkKG5ldyBOb3RDaGFuZ2FibGVG b3JWbUluUG9vbEVudGl0eU1vZGVsKCkpOwogICAgICAgIGdldFByb3Zpc2lvbmluZ0Nsb25lX0lz U2VsZWN0ZWQoKS5nZXRFbnRpdHlDaGFuZ2VkRXZlbnQoKS5hZGRMaXN0ZW5lcih0aGlzKTsKCiAg ICAgICAgc2V0UHJvdmlzaW9uaW5nVGhpbl9Jc1NlbGVjdGVkKG5ldyBOb3RDaGFuZ2FibGVGb3JW bUluUG9vbEVudGl0eU1vZGVsKCkpOwogICAgICAgIGdldFByb3Zpc2lvbmluZ1RoaW5fSXNTZWxl Y3RlZCgpLmdldEVudGl0eUNoYW5nZWRFdmVudCgpLmFkZExpc3RlbmVyKHRoaXMpOwoKICAgICAg ICBzZXRDcHVQaW5uaW5nKG5ldyBOb3RDaGFuZ2FibGVGb3JWbUluUG9vbEVudGl0eU1vZGVsKCkp OwogICAgICAgIGdldENwdVBpbm5pbmcoKS5zZXRFbnRpdHkoIiIpOwogICAgICAgIGdldENwdVBp bm5pbmcoKS5zZXRJc0F2YWlsYWJsZShmYWxzZSk7CgogICAgICAgIGluaXRUaW1lWm9uZXMoKTsK ICAgIH0KCiAgICBwcml2YXRlIHZvaWQgaW5pdFRpbWVab25lcygpIHsKICAgICAgICBnZXRPU1R5 cGUoKS5nZXRTZWxlY3RlZEl0ZW1DaGFuZ2VkRXZlbnQoKS5hZGRMaXN0ZW5lcihuZXcgSUV2ZW50 TGlzdGVuZXIoKSB7CgogICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgcHVibGljIHZv aWQgZXZlbnRSYWlzZWQoRXZlbnQgZXYsIE9iamVjdCBzZW5kZXIsIEV2ZW50QXJncyBhcmdzKSB7 CiAgICAgICAgICAgICAgICBnZXRCZWhhdmlvcigpLnVwZGF0ZVRpbWVab25lKCk7CiAgICAgICAg ICAgIH0KICAgICAgICB9KTsKCiAgICB9CgogICAgcHVibGljIHZvaWQgSW5pdGlhbGl6ZShTeXN0 ZW1UcmVlSXRlbU1vZGVsIFN5c3RlbVRyZWVTZWxlY3RlZEl0ZW0pCiAgICB7CiAgICAgICAgc3Vw ZXIuSW5pdGlhbGl6ZSgpOwoKICAgICAgICBzZXRIYXNoKGdldEhhc2hOYW1lKCkgKyBuZXcgRGF0 ZSgpKTsKCiAgICAgICAgZ2V0TWVtU2l6ZSgpLnNldEVudGl0eSgyNTYpOwogICAgICAgIGdldE1p bkFsbG9jYXRlZE1lbW9yeSgpLnNldEVudGl0eSgyNTYpOwogICAgICAgIGdldElzU3RhdGVsZXNz KCkuc2V0RW50aXR5KGZhbHNlKTsKICAgICAgICBnZXRJc1NtYXJ0Y2FyZEVuYWJsZWQoKS5zZXRF bnRpdHkoZmFsc2UpOwogICAgICAgIGdldElzSGlnaGx5QXZhaWxhYmxlKCkuc2V0RW50aXR5KGZh bHNlKTsKICAgICAgICBnZXREb250TWlncmF0ZVZNKCkuc2V0RW50aXR5KGZhbHNlKTsKICAgICAg ICBnZXRJc0F1dG9Bc3NpZ24oKS5zZXRFbnRpdHkodHJ1ZSk7CiAgICAgICAgZ2V0SXNUZW1wbGF0 ZVB1YmxpYygpLnNldEVudGl0eSh0cnVlKTsKCiAgICAgICAgZ2V0UnVuVk1PblNwZWNpZmljSG9z dCgpLnNldEVudGl0eShmYWxzZSk7CiAgICAgICAgZ2V0UnVuVk1PblNwZWNpZmljSG9zdCgpLnNl dElzQ2hhbmdhYmxlKGZhbHNlKTsKCiAgICAgICAgZ2V0UnVuVk1PblRydXN0ZWRIb3N0KCkuc2V0 RW50aXR5KGZhbHNlKTsKCiAgICAgICAgZ2V0SG9zdENwdSgpLnNldEVudGl0eShmYWxzZSk7CiAg ICAgICAgZ2V0UnVuVk1PblNwZWNpZmljSG9zdCgpLnNldElzQ2hhbmdhYmxlKGZhbHNlKTsKCiAg ICAgICAgZ2V0Q2RJbWFnZSgpLnNldElzQ2hhbmdhYmxlKGZhbHNlKTsKCiAgICAgICAgSW5pdE9T VHlwZSgpOwogICAgICAgIEluaXREaXNwbGF5UHJvdG9jb2woKTsKICAgICAgICBJbml0Rmlyc3RC b290RGV2aWNlKCk7CiAgICAgICAgSW5pdE51bU9mTW9uaXRvcnMoKTsKICAgICAgICBJbml0QWxs b3dDb25zb2xlUmVjb25uZWN0KCk7CiAgICAgICAgSW5pdE1pbmltYWxWbU1lbVNpemUoKTsKICAg ICAgICBJbml0TWF4aW1hbFZtTWVtU2l6ZTMyT1MoKTsKCiAgICAgICAgYmVoYXZpb3IuSW5pdGlh bGl6ZShTeXN0ZW1UcmVlU2VsZWN0ZWRJdGVtKTsKICAgIH0KCiAgICBAT3ZlcnJpZGUKICAgIHB1 YmxpYyB2b2lkIGV2ZW50UmFpc2VkKEV2ZW50IGV2LCBPYmplY3Qgc2VuZGVyLCBFdmVudEFyZ3Mg YXJncykKICAgIHsKICAgICAgICBzdXBlci5ldmVudFJhaXNlZChldiwgc2VuZGVyLCBhcmdzKTsK CiAgICAgICAgaWYgKGV2LmVxdWFscyhGcm9udGVuZC5RdWVyeVN0YXJ0ZWRFdmVudERlZmluaXRp b24pCiAgICAgICAgICAgICAgICAmJiBTdHJpbmdIZWxwZXIuc3RyaW5nc0VxdWFsKEZyb250ZW5k LmdldEN1cnJlbnRDb250ZXh0KCksIGdldEhhc2goKSkpCiAgICAgICAgewogICAgICAgICAgICBG cm9udGVuZF9RdWVyeVN0YXJ0ZWQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXYuZXF1 YWxzKEZyb250ZW5kLlF1ZXJ5Q29tcGxldGVFdmVudERlZmluaXRpb24pCiAgICAgICAgICAgICAg ICAmJiBTdHJpbmdIZWxwZXIuc3RyaW5nc0VxdWFsKEZyb250ZW5kLmdldEN1cnJlbnRDb250ZXh0 KCksIGdldEhhc2goKSkpCiAgICAgICAgewogICAgICAgICAgICBGcm9udGVuZF9RdWVyeUNvbXBs ZXRlKCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGV2LmVxdWFscyhMaXN0TW9kZWwuU2Vs ZWN0ZWRJdGVtQ2hhbmdlZEV2ZW50RGVmaW5pdGlvbikpCiAgICAgICAgewogICAgICAgICAgICBp ZiAoc2VuZGVyID09IGdldERhdGFDZW50ZXIoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAg ICAgRGF0YUNlbnRlcl9TZWxlY3RlZEl0ZW1DaGFuZ2VkKHNlbmRlciwgYXJncyk7CiAgICAgICAg ICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoc2VuZGVyID09IGdldFRlbXBsYXRlKCkpCiAgICAg ICAgICAgIHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlX1NlbGVjdGVkSXRlbUNoYW5nZWQoc2Vu ZGVyLCBhcmdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChzZW5kZXIgPT0g Z2V0Q2x1c3RlcigpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDbHVzdGVyX1NlbGVj dGVkSXRlbUNoYW5nZWQoc2VuZGVyLCBhcmdzKTsKICAgICAgICAgICAgICAgIEluaXRVc2JQb2xp Y3koKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChzZW5kZXIgPT0gZ2V0VGlt ZVpvbmUoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVGltZVpvbmVfU2VsZWN0ZWRJ dGVtQ2hhbmdlZChzZW5kZXIsIGFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2Ug aWYgKHNlbmRlciA9PSBnZXREZWZhdWx0SG9zdCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAg ICAgICBEZWZhdWx0SG9zdF9TZWxlY3RlZEl0ZW1DaGFuZ2VkKHNlbmRlciwgYXJncyk7CiAgICAg ICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoc2VuZGVyID09IGdldE9TVHlwZSgpKQogICAg ICAgICAgICB7CiAgICAgICAgICAgICAgICBPU1R5cGVfU2VsZWN0ZWRJdGVtQ2hhbmdlZChzZW5k ZXIsIGFyZ3MpOwogICAgICAgICAgICAgICAgSW5pdFVzYlBvbGljeSgpOwogICAgICAgICAgICB9 CiAgICAgICAgICAgIGVsc2UgaWYgKHNlbmRlciA9PSBnZXRGaXJzdEJvb3REZXZpY2UoKSkKICAg ICAgICAgICAgewogICAgICAgICAgICAgICAgRmlyc3RCb290RGV2aWNlX1NlbGVjdGVkSXRlbUNo YW5nZWQoc2VuZGVyLCBhcmdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChz ZW5kZXIgPT0gZ2V0RGlzcGxheVByb3RvY29sKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAg ICAgIERpc3BsYXlQcm90b2NvbF9TZWxlY3RlZEl0ZW1DaGFuZ2VkKHNlbmRlciwgYXJncyk7CiAg ICAgICAgICAgICAgICBJbml0VXNiUG9saWN5KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAg ZWxzZSBpZiAoc2VuZGVyID09IGdldE51bU9mU29ja2V0cygpKQogICAgICAgICAgICB7CiAgICAg ICAgICAgICAgICBOdW1PZlNvY2tldHNfRW50aXR5Q2hhbmdlZChzZW5kZXIsIGFyZ3MpOwogICAg ICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHNlbmRlciA9PSBnZXRDb3Jlc1BlclNvY2tl dCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDb3Jlc1BlclNvY2tldF9FbnRpdHlD aGFuZ2VkKHNlbmRlciwgYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxz ZSBpZiAoZXYuZXF1YWxzKEVudGl0eU1vZGVsLkVudGl0eUNoYW5nZWRFdmVudERlZmluaXRpb24p KQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHNlbmRlciA9PSBnZXRNZW1TaXplKCkpCiAgICAg ICAgICAgIHsKICAgICAgICAgICAgICAgIE1lbVNpemVfRW50aXR5Q2hhbmdlZChzZW5kZXIsIGFy Z3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHNlbmRlciA9PSBnZXRUb3Rh bENQVUNvcmVzKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFRvdGFsQ1BVQ29yZXNf RW50aXR5Q2hhbmdlZChzZW5kZXIsIGFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVs c2UgaWYgKHNlbmRlciA9PSBnZXRSdW5WTU9uU3BlY2lmaWNIb3N0KCkpCiAgICAgICAgICAgIHsK ICAgICAgICAgICAgICAgIFJ1blZNT25TcGVjaWZpY0hvc3RfRW50aXR5Q2hhbmdlZChzZW5kZXIs IGFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHNlbmRlciA9PSBnZXRE b250TWlncmF0ZVZNKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERvbnRNaWdyYXRl Vk1fRW50aXR5Q2hhbmdlZChzZW5kZXIsIGFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAg IGVsc2UgaWYgKHNlbmRlciA9PSBnZXRSdW5WTU9uVHJ1c3RlZEhvc3QoKSkKICAgICAgICAgICAg ewogICAgICAgICAgICAgICAgUnVuVk1PblRydXN0ZWRIb3N0X0VudGl0eUNoYW5nZWQoc2VuZGVy LCBhcmdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChzZW5kZXIgPT0gZ2V0 SXNBdXRvQXNzaWduKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIElzQXV0b0Fzc2ln bl9FbnRpdHlDaGFuZ2VkKHNlbmRlciwgYXJncyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAg IGVsc2UgaWYgKHNlbmRlciA9PSBnZXRQcm92aXNpb25pbmcoKSkKICAgICAgICAgICAgewogICAg ICAgICAgICAgICAgUHJvdmlzaW9uaW5nX1NlbGVjdGVkSXRlbUNoYW5nZWQoc2VuZGVyLCBhcmdz KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChzZW5kZXIgPT0gZ2V0UHJvdmlz aW9uaW5nVGhpbl9Jc1NlbGVjdGVkKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlm ICgoQm9vbGVhbikgZ2V0UHJvdmlzaW9uaW5nVGhpbl9Jc1NlbGVjdGVkKCkuZ2V0RW50aXR5KCkp IHsKICAgICAgICAgICAgICAgICAgICBnZXRQcm92aXNpb25pbmcoKS5zZXRFbnRpdHkoZmFsc2Up OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHNl bmRlciA9PSBnZXRQcm92aXNpb25pbmdDbG9uZV9Jc1NlbGVjdGVkKCkpCiAgICAgICAgICAgIHsK ICAgICAgICAgICAgICAgIGlmICgoQm9vbGVhbikgZ2V0UHJvdmlzaW9uaW5nQ2xvbmVfSXNTZWxl Y3RlZCgpLmdldEVudGl0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgZ2V0UHJvdmlzaW9uaW5n KCkuc2V0RW50aXR5KHRydWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAg ICAgfQogICAgfQoKICAgIHByaXZhdGUgaW50IHF1ZXJ5Q291bnRlcjsKCiAgICBwcml2YXRlIHZv aWQgRnJvbnRlbmRfUXVlcnlTdGFydGVkKCkKICAgIHsKICAgICAgICBxdWVyeUNvdW50ZXIrKzsK ICAgICAgICBpZiAoZ2V0UHJvZ3Jlc3MoKSA9PSBudWxsKQogICAgICAgIHsKICAgICAgICAgICAg U3RhcnRQcm9ncmVzcyhudWxsKTsKICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIEZy b250ZW5kX1F1ZXJ5Q29tcGxldGUoKQogICAgewogICAgICAgIHF1ZXJ5Q291bnRlci0tOwogICAg ICAgIGlmIChxdWVyeUNvdW50ZXIgPT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIFN0b3BQcm9n cmVzcygpOwogICAgICAgIH0KICAgIH0KCiAgICBwcm90ZWN0ZWQgdm9pZCBJbml0TnVtT2ZNb25p dG9ycygpCiAgICB7CiAgICAgICAgaWYgKGdldFZtVHlwZSgpID09IFZtVHlwZS5EZXNrdG9wKQog ICAgICAgIHsKICAgICAgICAgICAgQXN5bmNEYXRhUHJvdmlkZXIuR2V0TnVtT2ZNb25pdG9yTGlz dChuZXcgQXN5bmNRdWVyeSh0aGlzLAogICAgICAgICAgICAgICAgICAgIG5ldyBJTmV3QXN5bmND YWxsYmFjaygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAg ICAgICAgICAgICAgIHB1YmxpYyB2b2lkIE9uU3VjY2VzcyhPYmplY3QgdGFyZ2V0LCBPYmplY3Qg cmV0dXJuVmFsdWUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbml0Vm1Nb2RlbCBt b2RlbCA9IChVbml0Vm1Nb2RlbCkgdGFyZ2V0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAg SW50ZWdlciBvbGROdW1PZk1vbml0b3JzID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGlmIChtb2RlbC5nZXROdW1PZk1vbml0b3JzKCkuZ2V0U2VsZWN0ZWRJdGVtKCkgIT0gbnVs bCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBvbGROdW1PZk1vbml0b3JzID0gKEludGVnZXIpIG1vZGVsLmdldE51bU9mTW9uaXRv cnMoKS5nZXRTZWxlY3RlZEl0ZW0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAg ICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdDxJbnRlZ2VyPiBudW1PZk1vbml0b3Jz ID0gKEFycmF5TGlzdDxJbnRlZ2VyPikgcmV0dXJuVmFsdWU7CiAgICAgICAgICAgICAgICAgICAg ICAgICAgICBtb2RlbC5nZXROdW1PZk1vbml0b3JzKCkuc2V0SXRlbXMobnVtT2ZNb25pdG9ycyk7 CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2xkTnVtT2ZNb25pdG9ycyAhPSBudWxs KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIG1vZGVsLmdldE51bU9mTW9uaXRvcnMoKS5zZXRTZWxlY3RlZEl0ZW0ob2xkTnVtT2ZN b25pdG9ycyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAg ICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgZ2V0SGFzaCgpKSk7CiAgICAgICAgfQog ICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGdldE51bU9mTW9uaXRvcnMoKS5zZXRJ dGVtcyhuZXcgQXJyYXlMaXN0PEludGVnZXI+KEFycmF5cy5hc0xpc3QobmV3IEludGVnZXJbXSB7 IDEgfSkpKTsKICAgICAgICAgICAgZ2V0TnVtT2ZNb25pdG9ycygpLnNldFNlbGVjdGVkSXRlbSgx KTsKICAgICAgICB9CiAgICB9CgogICAgcHJvdGVjdGVkIHZvaWQgSW5pdEFsbG93Q29uc29sZVJl Y29ubmVjdCgpCiAgICB7CiAgICAgICAgZ2V0QWxsb3dDb25zb2xlUmVjb25uZWN0KCkuc2V0RW50 aXR5KGdldFZtVHlwZSgpID09IFZtVHlwZS5TZXJ2ZXIpOwogICAgfQoKICAgIHByaXZhdGUgdm9p ZCBJbml0T1NUeXBlKCkKICAgIHsKICAgICAgICBMaXN0PFZtT3NUeXBlPiBvc0xpc3QgPSBBcnJh eXMuYXNMaXN0KFZtT3NUeXBlLnZhbHVlcygpKTsKICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KG9z TGlzdCwgbmV3IENvbXBhcmF0b3I8Vm1Pc1R5cGU+KCkgewoKICAgICAgICAgICAgQE92ZXJyaWRl CiAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShWbU9zVHlwZSBvMSwgVm1Pc1R5cGUgbzIp IHsKICAgICAgICAgICAgICAgIC8vIG1vdmluZyBVbmFzc2lnbmVkIHRvIHRoZSBoZWFkIG9mIHRo ZSBsaXN0CiAgICAgICAgICAgICAgICBpZiAobzEubmFtZSgpLmVxdWFscyhWbU9zVHlwZS5VbmFz c2lnbmVkLm5hbWUoKSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAg ICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKG8yLm5hbWUoKS5lcXVhbHMoVm1Pc1R5cGUu VW5hc3NpZ25lZC5uYW1lKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAg ICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIG8xLm5hbWUoKS5jb21wYXJlVG8o bzIubmFtZSgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICBnZXRPU1R5cGUo KS5zZXRJdGVtcyhvc0xpc3QpOwogICAgICAgIGdldE9TVHlwZSgpLnNldFNlbGVjdGVkSXRlbShW bU9zVHlwZS5VbmFzc2lnbmVkKTsKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgSW5pdFVzYlBvbGlj eSgpIHsKICAgICAgICBWRFNHcm91cCBjbHVzdGVyID0gKFZEU0dyb3VwKSBnZXRDbHVzdGVyKCku Z2V0U2VsZWN0ZWRJdGVtKCk7CiAgICAgICAgVm1Pc1R5cGUgb3NUeXBlID0gKFZtT3NUeXBlKSBn ZXRPU1R5cGUoKS5nZXRTZWxlY3RlZEl0ZW0oKTsKICAgICAgICBEaXNwbGF5VHlwZSBkaXNwbGF5 VHlwZSA9IChEaXNwbGF5VHlwZSkgKGdldERpc3BsYXlQcm90b2NvbCgpLmdldFNlbGVjdGVkSXRl bSgpICE9IG51bGwgPwogICAgICAgICAgICAgICAgKChFbnRpdHlNb2RlbCkgZ2V0RGlzcGxheVBy b3RvY29sKCkuZ2V0U2VsZWN0ZWRJdGVtKCkpLmdldEVudGl0eSgpIDogbnVsbCk7CgogICAgICAg IGlmIChvc1R5cGUgPT0gbnVsbCB8fCBjbHVzdGVyID09IG51bGwgfHwgZGlzcGxheVR5cGUgPT0g bnVsbCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBnZXRVc2JQb2xp Y3koKS5zZXRJc0NoYW5nYWJsZSh0cnVlKTsKICAgICAgICBpZiAoVmVyc2lvbi52M18xLmNvbXBh cmVUbyhjbHVzdGVyLmdldGNvbXBhdGliaWxpdHlfdmVyc2lvbigpKSA+IDApIHsKICAgICAgICAg ICAgaWYgKG9zVHlwZS5pc1dpbmRvd3MoKSkgewogICAgICAgICAgICAgICAgZ2V0VXNiUG9saWN5 KCkuc2V0SXRlbXMoQXJyYXlzLmFzTGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgVXNiUG9s aWN5LkRJU0FCTEVELAogICAgICAgICAgICAgICAgICAgICAgICBVc2JQb2xpY3kuRU5BQkxFRF9M RUdBQ1kKICAgICAgICAgICAgICAgICAgICAgICAgKSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAg ICAgICAgICAgICAgICBnZXRVc2JQb2xpY3koKS5zZXRJdGVtcyhBcnJheXMuYXNMaXN0KFVzYlBv bGljeS5ESVNBQkxFRCkpOwogICAgICAgICAgICAgICAgZ2V0VXNiUG9saWN5KCkuc2V0U2VsZWN0 ZWRJdGVtKFVzYlBvbGljeS5ESVNBQkxFRCk7CiAgICAgICAgICAgICAgICBnZXRVc2JQb2xpY3ko KS5zZXRJc0NoYW5nYWJsZShmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAg IGlmIChWZXJzaW9uLnYzXzEuY29tcGFyZVRvKGNsdXN0ZXIuZ2V0Y29tcGF0aWJpbGl0eV92ZXJz aW9uKCkpIDw9IDApIHsKICAgICAgICAgICAgaWYgKG9zVHlwZS5pc0xpbnV4KCkpIHsKICAgICAg ICAgICAgICAgIGdldFVzYlBvbGljeSgpLnNldEl0ZW1zKEFycmF5cy5hc0xpc3QoCiAgICAgICAg ICAgICAgICAgICAgICAgIFVzYlBvbGljeS5ESVNBQkxFRCwKICAgICAgICAgICAgICAgICAgICAg ICAgVXNiUG9saWN5LkVOQUJMRURfTkFUSVZFCiAgICAgICAgICAgICAgICAgICAgICAgICkpOwog ICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZ2V0VXNiUG9saWN5KCkuc2V0SXRl bXMoCiAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgVXNiUG9saWN5LkRJU0FCTEVELAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFVzYlBvbGljeS5FTkFCTEVEX0xFR0FDWSwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBVc2JQb2xpY3kuRU5BQkxFRF9OQVRJVkUKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICApKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKGRp c3BsYXlUeXBlICE9IERpc3BsYXlUeXBlLnF4bCkgewogICAgICAgICAgICBnZXRVc2JQb2xpY3ko KS5zZXRJc0NoYW5nYWJsZShmYWxzZSk7CiAgICAgICAgfQoKICAgICAgICBnZXRVc2JQb2xpY3ko KS5zZXRTZWxlY3RlZEl0ZW0oVXNiUG9saWN5LkRJU0FCTEVEKTsKICAgIH0KCiAgICBwcml2YXRl IHZvaWQgSW5pdE1pbmltYWxWbU1lbVNpemUoKQogICAgewogICAgICAgIEFzeW5jRGF0YVByb3Zp ZGVyLkdldE1pbmltYWxWbU1lbVNpemUobmV3IEFzeW5jUXVlcnkodGhpcywKICAgICAgICAgICAg ICAgIG5ldyBJTmV3QXN5bmNDYWxsYmFjaygpIHsKICAgICAgICAgICAgICAgICAgICBAT3ZlcnJp ZGUKICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBPblN1Y2Nlc3MoT2JqZWN0IHRhcmdl dCwgT2JqZWN0IHJldHVyblZhbHVlKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBVbml0Vm1N b2RlbCB2bU1vZGVsID0gKFVuaXRWbU1vZGVsKSB0YXJnZXQ7CiAgICAgICAgICAgICAgICAgICAg ICAgIHZtTW9kZWwuc2V0X01pbk1lbVNpemUoKEludGVnZXIpIHJldHVyblZhbHVlKTsKCiAgICAg ICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgZ2V0SGFzaCgpKSk7CiAgICB9Cgog ICAgcHJpdmF0ZSB2b2lkIEluaXRNYXhpbWFsVm1NZW1TaXplMzJPUygpCiAgICB7CiAgICAgICAg QXN5bmNEYXRhUHJvdmlkZXIuR2V0TWF4aW1hbFZtTWVtU2l6ZTMyT1MobmV3IEFzeW5jUXVlcnko dGhpcywKICAgICAgICAgICAgICAgIG5ldyBJTmV3QXN5bmNDYWxsYmFjaygpIHsKICAgICAgICAg ICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBPblN1 Y2Nlc3MoT2JqZWN0IHRhcmdldCwgT2JqZWN0IHJldHVyblZhbHVlKSB7CgogICAgICAgICAgICAg ICAgICAgICAgICBVbml0Vm1Nb2RlbCB2bU1vZGVsID0gKFVuaXRWbU1vZGVsKSB0YXJnZXQ7CiAg ICAgICAgICAgICAgICAgICAgICAgIHZtTW9kZWwuc2V0X01heE1lbVNpemUzMigoSW50ZWdlcikg cmV0dXJuVmFsdWUpOwoKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCBn ZXRIYXNoKCkpKTsKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgVXBkYXRlTWF4aW1hbFZtTWVtU2l6 ZSgpCiAgICB7CiAgICAgICAgVkRTR3JvdXAgY2x1c3RlciA9IChWRFNHcm91cCkgZ2V0Q2x1c3Rl cigpLmdldFNlbGVjdGVkSXRlbSgpOwoKICAgICAgICBpZiAoY2x1c3RlciAhPSBudWxsKQogICAg ICAgIHsKICAgICAgICAgICAgQXN5bmNEYXRhUHJvdmlkZXIuR2V0TWF4aW1hbFZtTWVtU2l6ZTY0 T1MobmV3IEFzeW5jUXVlcnkodGhpcywKICAgICAgICAgICAgICAgICAgICBuZXcgSU5ld0FzeW5j Q2FsbGJhY2soKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAg ICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBPblN1Y2Nlc3MoT2JqZWN0IHRhcmdldCwgT2JqZWN0 IHJldHVyblZhbHVlKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pdFZtTW9kZWwg dm1Nb2RlbCA9IChVbml0Vm1Nb2RlbCkgdGFyZ2V0OwogICAgICAgICAgICAgICAgICAgICAgICAg ICAgdm1Nb2RlbC5zZXRfTWF4TWVtU2l6ZTY0KChJbnRlZ2VyKSByZXR1cm5WYWx1ZSk7CgogICAg ICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgZ2V0SGFzaCgpKSwg Y2x1c3Rlci5nZXRjb21wYXRpYmlsaXR5X3ZlcnNpb24oKS50b1N0cmluZygpKTsKICAgICAgICB9 CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIEluaXREaXNwbGF5UHJvdG9jb2woKQogICAgewogICAg ICAgIEFycmF5TGlzdDxFbnRpdHlNb2RlbD4gZGlzcGxheVByb3RvY29sT3B0aW9ucyA9IG5ldyBB cnJheUxpc3Q8RW50aXR5TW9kZWw+KCk7CgogICAgICAgIEVudGl0eU1vZGVsIHNwaWNlUHJvdG9j b2wgPSBuZXcgRW50aXR5TW9kZWwoKTsKICAgICAgICBzcGljZVByb3RvY29sLnNldFRpdGxlKENv bnN0YW50c01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRDb25zdGFudHMoKS5zcGljZVRpdGxlKCkp OwogICAgICAgIHNwaWNlUHJvdG9jb2wuc2V0RW50aXR5KERpc3BsYXlUeXBlLnF4bCk7CgogICAg ICAgIEVudGl0eU1vZGVsIHZuY1Byb3RvY29sID0gbmV3IEVudGl0eU1vZGVsKCk7CiAgICAgICAg dm5jUHJvdG9jb2wuc2V0VGl0bGUoQ29uc3RhbnRzTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldENv bnN0YW50cygpLlZOQ1RpdGxlKCkpOwogICAgICAgIHZuY1Byb3RvY29sLnNldEVudGl0eShEaXNw bGF5VHlwZS52bmMpOwoKICAgICAgICBkaXNwbGF5UHJvdG9jb2xPcHRpb25zLmFkZChzcGljZVBy b3RvY29sKTsKICAgICAgICBkaXNwbGF5UHJvdG9jb2xPcHRpb25zLmFkZCh2bmNQcm90b2NvbCk7 CiAgICAgICAgZ2V0RGlzcGxheVByb3RvY29sKCkuc2V0SXRlbXMoZGlzcGxheVByb3RvY29sT3B0 aW9ucyk7CgogICAgICAgIGdldERpc3BsYXlQcm90b2NvbCgpLmdldFNlbGVjdGVkSXRlbUNoYW5n ZWRFdmVudCgpLmFkZExpc3RlbmVyKHRoaXMpOwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBJbml0 Rmlyc3RCb290RGV2aWNlKCkKICAgIHsKICAgICAgICBFbnRpdHlNb2RlbCB0ZW1wVmFyID0gbmV3 IEVudGl0eU1vZGVsKCk7CiAgICAgICAgdGVtcFZhci5zZXRUaXRsZShDb25zdGFudHNNYW5hZ2Vy LmdldEluc3RhbmNlKCkuZ2V0Q29uc3RhbnRzKCkuaGFyZERpc2tUaXRsZSgpKTsKICAgICAgICB0 ZW1wVmFyLnNldEVudGl0eShCb290U2VxdWVuY2UuQyk7CiAgICAgICAgRW50aXR5TW9kZWwgaGFy ZERpc2tPcHRpb24gPSB0ZW1wVmFyOwoKICAgICAgICBBcnJheUxpc3Q8RW50aXR5TW9kZWw+IGZp cnN0Qm9vdERldmljZUl0ZW1zID0gbmV3IEFycmF5TGlzdDxFbnRpdHlNb2RlbD4oKTsKICAgICAg ICBmaXJzdEJvb3REZXZpY2VJdGVtcy5hZGQoaGFyZERpc2tPcHRpb24pOwogICAgICAgIEVudGl0 eU1vZGVsIHRlbXBWYXIyID0gbmV3IEVudGl0eU1vZGVsKCk7CiAgICAgICAgdGVtcFZhcjIuc2V0 VGl0bGUoQ29uc3RhbnRzTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldENvbnN0YW50cygpLmNkcm9t VGl0bGUoKSk7CiAgICAgICAgdGVtcFZhcjIuc2V0RW50aXR5KEJvb3RTZXF1ZW5jZS5EKTsKICAg ICAgICBmaXJzdEJvb3REZXZpY2VJdGVtcy5hZGQodGVtcFZhcjIpOwogICAgICAgIEVudGl0eU1v ZGVsIHRlbXBWYXIzID0gbmV3IEVudGl0eU1vZGVsKCk7CiAgICAgICAgdGVtcFZhcjMuc2V0VGl0 bGUoQ29uc3RhbnRzTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldENvbnN0YW50cygpLm5ldHdvcmtQ WEVUaXRsZSgpKTsKICAgICAgICB0ZW1wVmFyMy5zZXRFbnRpdHkoQm9vdFNlcXVlbmNlLk4pOwog ICAgICAgIGZpcnN0Qm9vdERldmljZUl0ZW1zLmFkZCh0ZW1wVmFyMyk7CiAgICAgICAgZ2V0Rmly c3RCb290RGV2aWNlKCkuc2V0SXRlbXMoZmlyc3RCb290RGV2aWNlSXRlbXMpOwogICAgICAgIGdl dEZpcnN0Qm9vdERldmljZSgpLnNldFNlbGVjdGVkSXRlbShoYXJkRGlza09wdGlvbik7CiAgICB9 CgogICAgcHJpdmF0ZSB2b2lkIERhdGFDZW50ZXJfU2VsZWN0ZWRJdGVtQ2hhbmdlZChPYmplY3Qg c2VuZGVyLCBFdmVudEFyZ3MgYXJncykKICAgIHsKICAgICAgICBiZWhhdmlvci5EYXRhQ2VudGVy X1NlbGVjdGVkSXRlbUNoYW5nZWQoKTsKCiAgICAgICAgc3RvcmFnZV9wb29sIGRhdGFDZW50ZXIg PSAoc3RvcmFnZV9wb29sKSBnZXREYXRhQ2VudGVyKCkuZ2V0U2VsZWN0ZWRJdGVtKCk7CiAgICAg ICAgaWYgKGRhdGFDZW50ZXIgIT0gbnVsbCkgewogICAgICAgICAgICBnZXREaXNrc0FsbG9jYXRp b25Nb2RlbCgpLnNldFF1b3RhRW5mb3JjZW1lbnRUeXBlKGRhdGFDZW50ZXIuZ2V0UXVvdGFFbmZv cmNlbWVudFR5cGUoKSk7CiAgICAgICAgfQogICAgfQoKICAgIHByaXZhdGUgdm9pZCBUZW1wbGF0 ZV9TZWxlY3RlZEl0ZW1DaGFuZ2VkKE9iamVjdCBzZW5kZXIsIEV2ZW50QXJncyBhcmdzKQogICAg ewogICAgICAgIGJlaGF2aW9yLlRlbXBsYXRlX1NlbGVjdGVkSXRlbUNoYW5nZWQoKTsKICAgIH0K CiAgICBwcml2YXRlIHZvaWQgQ2x1c3Rlcl9TZWxlY3RlZEl0ZW1DaGFuZ2VkKE9iamVjdCBzZW5k ZXIsIEV2ZW50QXJncyBhcmdzKQogICAgewogICAgICAgIGJlaGF2aW9yLkNsdXN0ZXJfU2VsZWN0 ZWRJdGVtQ2hhbmdlZCgpOwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBUaW1lWm9uZV9TZWxlY3Rl ZEl0ZW1DaGFuZ2VkKE9iamVjdCBzZW5kZXIsIEV2ZW50QXJncyBhcmdzKQogICAgewogICAgfQoK ICAgIHByaXZhdGUgdm9pZCBEZWZhdWx0SG9zdF9TZWxlY3RlZEl0ZW1DaGFuZ2VkKE9iamVjdCBz ZW5kZXIsIEV2ZW50QXJncyBhcmdzKQogICAgewogICAgICAgIGJlaGF2aW9yLkRlZmF1bHRIb3N0 X1NlbGVjdGVkSXRlbUNoYW5nZWQoKTsKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgT1NUeXBlX1Nl bGVjdGVkSXRlbUNoYW5nZWQoT2JqZWN0IHNlbmRlciwgRXZlbnRBcmdzIGFyZ3MpCiAgICB7CiAg ICAgICAgVm1Pc1R5cGUgb3NUeXBlID0gKFZtT3NUeXBlKSBnZXRPU1R5cGUoKS5nZXRTZWxlY3Rl ZEl0ZW0oKTsKCiAgICAgICAgc2V0SXNXaW5kb3dzT1MoQXN5bmNEYXRhUHJvdmlkZXIuSXNXaW5k b3dzT3NUeXBlKG9zVHlwZSkpOwogICAgICAgIHNldElzTGludXhfVW5hc3NpZ25fVW5rbm93bk9T KEFzeW5jRGF0YVByb3ZpZGVyLklzTGludXhPc1R5cGUob3NUeXBlKSB8fCBvc1R5cGUgPT0gVm1P c1R5cGUuVW5hc3NpZ25lZAogICAgICAgICAgICAgICAgfHwgb3NUeXBlID09IFZtT3NUeXBlLk90 aGVyKTsKCiAgICAgICAgZ2V0SW5pdHJkX3BhdGgoKS5zZXRJc0NoYW5nYWJsZShnZXRJc0xpbnV4 X1VuYXNzaWduX1Vua25vd25PUygpKTsKICAgICAgICBnZXRJbml0cmRfcGF0aCgpLnNldElzQXZh aWxhYmxlKGdldElzTGludXhfVW5hc3NpZ25fVW5rbm93bk9TKCkpOwoKICAgICAgICBnZXRLZXJu ZWxfcGF0aCgpLnNldElzQ2hhbmdhYmxlKGdldElzTGludXhfVW5hc3NpZ25fVW5rbm93bk9TKCkp OwogICAgICAgIGdldEtlcm5lbF9wYXRoKCkuc2V0SXNBdmFpbGFibGUoZ2V0SXNMaW51eF9VbmFz c2lnbl9Vbmtub3duT1MoKSk7CgogICAgICAgIGdldEtlcm5lbF9wYXJhbWV0ZXJzKCkuc2V0SXND aGFuZ2FibGUoZ2V0SXNMaW51eF9VbmFzc2lnbl9Vbmtub3duT1MoKSk7CiAgICAgICAgZ2V0S2Vy bmVsX3BhcmFtZXRlcnMoKS5zZXRJc0F2YWlsYWJsZShnZXRJc0xpbnV4X1VuYXNzaWduX1Vua25v d25PUygpKTsKCiAgICAgICAgZ2V0RG9tYWluKCkuc2V0SXNDaGFuZ2FibGUoZ2V0SXNXaW5kb3dz T1MoKSk7CiAgICAgICAgZ2V0QmVoYXZpb3IoKS51cGRhdGVUaW1lWm9uZSgpOwoKICAgIH0KCiAg ICBwcml2YXRlIHZvaWQgRmlyc3RCb290RGV2aWNlX1NlbGVjdGVkSXRlbUNoYW5nZWQoT2JqZWN0 IHNlbmRlciwgRXZlbnRBcmdzIGFyZ3MpCiAgICB7CiAgICAgICAgRW50aXR5TW9kZWwgZW50aXR5 TW9kZWwgPSAoRW50aXR5TW9kZWwpIGdldEZpcnN0Qm9vdERldmljZSgpLmdldFNlbGVjdGVkSXRl bSgpOwogICAgICAgIEJvb3RTZXF1ZW5jZSBmaXJzdERldmljZSA9IChCb290U2VxdWVuY2UpIGVu dGl0eU1vZGVsLmdldEVudGl0eSgpOwoKICAgICAgICBBcnJheUxpc3Q8RW50aXR5TW9kZWw+IGxp c3QgPSBuZXcgQXJyYXlMaXN0PEVudGl0eU1vZGVsPigpOwogICAgICAgIGZvciAoT2JqZWN0IGl0 ZW0gOiBnZXRGaXJzdEJvb3REZXZpY2UoKS5nZXRJdGVtcygpKQogICAgICAgIHsKICAgICAgICAg ICAgRW50aXR5TW9kZWwgYSA9IChFbnRpdHlNb2RlbCkgaXRlbTsKICAgICAgICAgICAgaWYgKChC b290U2VxdWVuY2UpIGEuZ2V0RW50aXR5KCkgIT0gZmlyc3REZXZpY2UpCiAgICAgICAgICAgIHsK ICAgICAgICAgICAgICAgIGxpc3QuYWRkKGEpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAg ICAgICBFbnRpdHlNb2RlbCB0ZW1wVmFyID0gbmV3IEVudGl0eU1vZGVsKCk7CiAgICAgICAgdGVt cFZhci5zZXRUaXRsZShDb25zdGFudHNNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0Q29uc3RhbnRz KCkubm9uZVRpdGxlKCkpOwogICAgICAgIEVudGl0eU1vZGVsIG5vbmVPcHRpb24gPSB0ZW1wVmFy OwoKICAgICAgICBsaXN0LmFkZCgwLCBub25lT3B0aW9uKTsKCiAgICAgICAgZ2V0U2Vjb25kQm9v dERldmljZSgpLnNldEl0ZW1zKGxpc3QpOwogICAgICAgIGdldFNlY29uZEJvb3REZXZpY2UoKS5z ZXRTZWxlY3RlZEl0ZW0obm9uZU9wdGlvbik7CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIFByb3Zp c2lvbmluZ19TZWxlY3RlZEl0ZW1DaGFuZ2VkKE9iamVjdCBzZW5kZXIsIEV2ZW50QXJncyBhcmdz KQogICAgewogICAgICAgIGJlaGF2aW9yLlByb3Zpc2lvbmluZ19TZWxlY3RlZEl0ZW1DaGFuZ2Vk KCk7CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIERpc3BsYXlQcm90b2NvbF9TZWxlY3RlZEl0ZW1D aGFuZ2VkKE9iamVjdCBzZW5kZXIsIEV2ZW50QXJncyBhcmdzKQogICAgewogICAgICAgIEVudGl0 eU1vZGVsIGVudGl0eU1vZGVsID0gKEVudGl0eU1vZGVsKSBnZXREaXNwbGF5UHJvdG9jb2woKS5n ZXRTZWxlY3RlZEl0ZW0oKTsKICAgICAgICBpZiAoZW50aXR5TW9kZWwgPT0gbnVsbCkKICAgICAg ICB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgRGlzcGxheVR5cGUgdHlw ZSA9IChEaXNwbGF5VHlwZSkgZW50aXR5TW9kZWwuZ2V0RW50aXR5KCk7CgogICAgICAgIGlmICh0 eXBlID09IERpc3BsYXlUeXBlLnZuYykKICAgICAgICB7CiAgICAgICAgICAgIGdldFVzYlBvbGlj eSgpLnNldFNlbGVjdGVkSXRlbShvcmcub3ZpcnQuZW5naW5lLmNvcmUuY29tbW9uLmJ1c2luZXNz ZW50aXRpZXMuVXNiUG9saWN5LkRJU0FCTEVEKTsKICAgICAgICAgICAgZ2V0SXNTbWFydGNhcmRF bmFibGVkKCkuc2V0RW50aXR5KGZhbHNlKTsKICAgICAgICB9CgogICAgICAgIGdldFVzYlBvbGlj eSgpLnNldElzQ2hhbmdhYmxlKHR5cGUgPT0gRGlzcGxheVR5cGUucXhsKTsKICAgICAgICBnZXRJ c1NtYXJ0Y2FyZEVuYWJsZWQoKS5zZXRJc0NoYW5nYWJsZSh0eXBlID09IERpc3BsYXlUeXBlLnF4 bCk7CgogICAgICAgIFVwZGF0ZU51bU9mTW9uaXRvcnMoKTsKICAgIH0KCiAgICBwcml2YXRlIHZv aWQgTWVtU2l6ZV9FbnRpdHlDaGFuZ2VkKE9iamVjdCBzZW5kZXIsIEV2ZW50QXJncyBhcmdzKQog ICAgewogICAgICAgIGJlaGF2aW9yLlVwZGF0ZU1pbkFsbG9jYXRlZE1lbW9yeSgpOwogICAgfQoK ICAgIHByaXZhdGUgdm9pZCBOdW1PZlNvY2tldHNfRW50aXR5Q2hhbmdlZChPYmplY3Qgc2VuZGVy LCBFdmVudEFyZ3MgYXJncykKICAgIHsKICAgICAgICBiZWhhdmlvci5udW1PZlNvY2tldENoYW5n ZWQoKTsKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgVG90YWxDUFVDb3Jlc19FbnRpdHlDaGFuZ2Vk KE9iamVjdCBzZW5kZXIsIEV2ZW50QXJncyBhcmdzKSB7CiAgICAgICAgLy8gZG8gbm90IGxpc3Rl biBvbiBjaGFuZ2VzIHdoaWxlIHRoZSB0b3RhbENwdUNvcmVzQ2hhbmdlZCBpcyBhZGp1c3Rpbmcg dGhlbQogICAgICAgIGdldE51bU9mU29ja2V0cygpLmdldFNlbGVjdGVkSXRlbUNoYW5nZWRFdmVu dCgpLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwogICAgICAgIGdldFRvdGFsQ1BVQ29yZXMoKS5nZXRF bnRpdHlDaGFuZ2VkRXZlbnQoKS5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKICAgICAgICBnZXRDb3Jl c1BlclNvY2tldCgpLmdldFNlbGVjdGVkSXRlbUNoYW5nZWRFdmVudCgpLnJlbW92ZUxpc3RlbmVy KHRoaXMpOwoKICAgICAgICBiZWhhdmlvci50b3RhbENwdUNvcmVzQ2hhbmdlZCgpOwoKICAgICAg ICAvLyBzdGFydCBsaXN0ZW5pbmcgYWdhaW4KICAgICAgICBnZXRUb3RhbENQVUNvcmVzKCkuZ2V0 RW50aXR5Q2hhbmdlZEV2ZW50KCkuYWRkTGlzdGVuZXIodGhpcyk7CiAgICAgICAgZ2V0TnVtT2ZT b2NrZXRzKCkuZ2V0U2VsZWN0ZWRJdGVtQ2hhbmdlZEV2ZW50KCkuYWRkTGlzdGVuZXIodGhpcyk7 CiAgICAgICAgZ2V0Q29yZXNQZXJTb2NrZXQoKS5nZXRTZWxlY3RlZEl0ZW1DaGFuZ2VkRXZlbnQo KS5hZGRMaXN0ZW5lcih0aGlzKTsKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgQ29yZXNQZXJTb2Nr ZXRfRW50aXR5Q2hhbmdlZChPYmplY3Qgc2VuZGVyLCBFdmVudEFyZ3MgYXJncykgewogICAgICAg IGJlaGF2aW9yLmNvcmVzUGVyU29ja2V0Q2hhbmdlZCgpOwogICAgfQoKICAgIHByaXZhdGUgdm9p ZCBjbGVhckFuZERpc2FibGUoRW50aXR5TW9kZWwgZW50aXR5TW9kZWwpIHsKICAgICAgICBlbnRp dHlNb2RlbC5zZXRFbnRpdHkoZmFsc2UpOwogICAgICAgIGVudGl0eU1vZGVsLnNldElzQ2hhbmdh YmxlKGZhbHNlKTsKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgUnVuVk1PblNwZWNpZmljSG9zdF9F bnRpdHlDaGFuZ2VkKE9iamVjdCBzZW5kZXIsIEV2ZW50QXJncyBhcmdzKQogICAgewogICAgICAg IGlmICgoQm9vbGVhbikgZ2V0UnVuVk1PblNwZWNpZmljSG9zdCgpLmdldEVudGl0eSgpID09IHRy dWUpCiAgICAgICAgewogICAgICAgICAgICBjbGVhckFuZERpc2FibGUoZ2V0RG9udE1pZ3JhdGVW TSgpKTsKICAgICAgICAgICAgZ2V0SG9zdENwdSgpLnNldElzQ2hhbmdhYmxlKHRydWUpOwogICAg ICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBjbGVhckFuZERpc2FibGUo Z2V0SG9zdENwdSgpKTsKICAgICAgICAgICAgZ2V0RG9udE1pZ3JhdGVWTSgpLnNldElzQ2hhbmdh YmxlKHRydWUpOwogICAgICAgIH0KICAgICAgICBiZWhhdmlvci51cGRhdGVDcHVQaW5uaW5nVmlz aWJpbGl0eSgpOwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBSdW5WTU9uVHJ1c3RlZEhvc3RfRW50 aXR5Q2hhbmdlZChPYmplY3Qgc2VuZGVyLCBFdmVudEFyZ3MgYXJncykKICAgIHsKICAgICAgICBp ZiAoKEJvb2xlYW4pIGdldFJ1blZNT25UcnVzdGVkSG9zdCgpLmdldEVudGl0eSgpID09IHRydWUp CiAgICAgICAgewogICAgICAgICAgICBjbGVhckFuZERpc2FibGUoZ2V0UnVuVk1PblNwZWNpZmlj SG9zdCgpKTsKICAgICAgICAgICAgY2xlYXJBbmREaXNhYmxlKGdldEhvc3RDcHUoKSk7CiAgICAg ICAgICAgIGNsZWFyQW5kRGlzYWJsZShnZXREb250TWlncmF0ZVZNKCkpOwogICAgICAgIH0KICAg ICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBnZXRSdW5WTU9uU3BlY2lmaWNIb3N0KCku c2V0SXNDaGFuZ2FibGUodHJ1ZSk7CiAgICAgICAgICAgIGdldERvbnRNaWdyYXRlVk0oKS5zZXRJ c0NoYW5nYWJsZSh0cnVlKTsKICAgICAgICB9CiAgICAgICAgYmVoYXZpb3IudXBkYXRlQ3B1UGlu bmluZ1Zpc2liaWxpdHkoKTsKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgRG9udE1pZ3JhdGVWTV9F bnRpdHlDaGFuZ2VkKE9iamVjdCBzZW5kZXIsIEV2ZW50QXJncyBhcmdzKQogICAgewogICAgICAg IGlmKChCb29sZWFuKSBnZXREb250TWlncmF0ZVZNKCkuZ2V0RW50aXR5KCkgPT0gdHJ1ZSApIHsK ICAgICAgICAgICAgY2xlYXJBbmREaXNhYmxlKGdldFJ1blZNT25TcGVjaWZpY0hvc3QoKSk7CiAg ICAgICAgICAgIGdldEhvc3RDcHUoKS5zZXRJc0NoYW5nYWJsZSh0cnVlKTsKICAgICAgICB9CiAg ICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgY2xlYXJBbmREaXNhYmxlKGdldEhvc3RD cHUoKSk7CiAgICAgICAgICAgIGdldFJ1blZNT25TcGVjaWZpY0hvc3QoKS5zZXRJc0NoYW5nYWJs ZSh0cnVlKTsKICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIElzQXV0b0Fzc2lnbl9F bnRpdHlDaGFuZ2VkKE9iamVjdCBzZW5kZXIsIEV2ZW50QXJncyBhcmdzKQogICAgewogICAgICAg IGlmICgoQm9vbGVhbikgZ2V0SXNBdXRvQXNzaWduKCkuZ2V0RW50aXR5KCkgPT0gdHJ1ZSkKICAg ICAgICB7CiAgICAgICAgICAgIGNsZWFyQW5kRGlzYWJsZShnZXRSdW5WTU9uU3BlY2lmaWNIb3N0 KCkpOwogICAgICAgICAgICBjbGVhckFuZERpc2FibGUoZ2V0SG9zdENwdSgpKTsKICAgICAgICB9 CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgZ2V0UnVuVk1PblNwZWNpZmljSG9z dCgpLnNldElzQ2hhbmdhYmxlKHRydWUpOwogICAgICAgIH0KICAgICAgICBiZWhhdmlvci51cGRh dGVDcHVQaW5uaW5nVmlzaWJpbGl0eSgpOwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBVcGRhdGVO dW1PZk1vbml0b3JzKCkKICAgIHsKICAgICAgICBib29sZWFuIGlzVm5jID0gZmFsc2U7CgogICAg ICAgIGlmIChnZXREaXNwbGF5UHJvdG9jb2woKS5nZXRTZWxlY3RlZEl0ZW0oKSAhPSBudWxsKQog ICAgICAgIHsKICAgICAgICAgICAgRGlzcGxheVR5cGUgZGlzcGxheVR5cGUgPSAoRGlzcGxheVR5 cGUpICgoRW50aXR5TW9kZWwpIGdldERpc3BsYXlQcm90b2NvbCgpLmdldFNlbGVjdGVkSXRlbSgp KS5nZXRFbnRpdHkoKTsKICAgICAgICAgICAgaXNWbmMgPSBkaXNwbGF5VHlwZSA9PSBEaXNwbGF5 VHlwZS52bmM7CiAgICAgICAgfQoKICAgICAgICBpZiAoaXNWbmMpCiAgICAgICAgewogICAgICAg ICAgICBnZXROdW1PZk1vbml0b3JzKCkuc2V0U2VsZWN0ZWRJdGVtKDEpOwogICAgICAgICAgICBn ZXROdW1PZk1vbml0b3JzKCkuc2V0SXNDaGFuZ2FibGUoZmFsc2UpOwogICAgICAgIH0gZWxzZSB7 CiAgICAgICAgICAgIGdldE51bU9mTW9uaXRvcnMoKS5zZXRJc0NoYW5nYWJsZSh0cnVlKTsKICAg ICAgICB9CiAgICB9CgogICAgcHVibGljIEJvb3RTZXF1ZW5jZSBnZXRCb290U2VxdWVuY2UoKQog ICAgewogICAgICAgIEVudGl0eU1vZGVsIGZpcnN0U2VsZWN0ZWRJdGVtID0gKEVudGl0eU1vZGVs KSBnZXRGaXJzdEJvb3REZXZpY2UoKS5nZXRTZWxlY3RlZEl0ZW0oKTsKICAgICAgICBFbnRpdHlN b2RlbCBzZWNvbmRTZWxlY3RlZEl0ZW0gPSAoRW50aXR5TW9kZWwpIGdldFNlY29uZEJvb3REZXZp Y2UoKS5nZXRTZWxlY3RlZEl0ZW0oKTsKCiAgICAgICAgU3RyaW5nIGZpcnN0U2VsZWN0ZWRTdHJp bmcgPQogICAgICAgICAgICAgICAgZmlyc3RTZWxlY3RlZEl0ZW0uZ2V0RW50aXR5KCkgPT0gbnVs bCA/ICIiIDogZmlyc3RTZWxlY3RlZEl0ZW0uZ2V0RW50aXR5KCkudG9TdHJpbmcoKTsgLy8kTk9O LU5MUy0xJAogICAgICAgIFN0cmluZyBzZWNvbmRTZWxlY3RlZFN0cmluZyA9CiAgICAgICAgICAg ICAgICBzZWNvbmRTZWxlY3RlZEl0ZW0uZ2V0RW50aXR5KCkgPT0gbnVsbCA/ICIiIDogc2Vjb25k U2VsZWN0ZWRJdGVtLmdldEVudGl0eSgpLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKCiAgICAg ICAgcmV0dXJuIEJvb3RTZXF1ZW5jZS52YWx1ZU9mKGZpcnN0U2VsZWN0ZWRTdHJpbmcgKyBzZWNv bmRTZWxlY3RlZFN0cmluZyk7CiAgICB9CgogICAgcHVibGljIHZvaWQgc2V0Qm9vdFNlcXVlbmNl KEJvb3RTZXF1ZW5jZSB2YWx1ZSkKICAgIHsKICAgICAgICBBcnJheUxpc3Q8Qm9vdFNlcXVlbmNl PiBpdGVtcyA9IG5ldyBBcnJheUxpc3Q8Qm9vdFNlcXVlbmNlPigpOwogICAgICAgIGZvciAoY2hh ciBhIDogdmFsdWUudG9TdHJpbmcoKS50b0NoYXJBcnJheSgpKQogICAgICAgIHsKICAgICAgICAg ICAgaXRlbXMuYWRkKEJvb3RTZXF1ZW5jZS52YWx1ZU9mKChuZXcgQ2hhcmFjdGVyKGEpKS50b1N0 cmluZygpKSk7CiAgICAgICAgfQoKICAgICAgICBPYmplY3QgZmlyc3RCb290RGV2aWNlID0gbnVs bDsKICAgICAgICBmb3IgKE9iamVjdCBpdGVtIDogZ2V0Rmlyc3RCb290RGV2aWNlKCkuZ2V0SXRl bXMoKSkKICAgICAgICB7CiAgICAgICAgICAgIEVudGl0eU1vZGVsIGEgPSAoRW50aXR5TW9kZWwp IGl0ZW07CiAgICAgICAgICAgIGlmICgoQm9vdFNlcXVlbmNlKSBhLmdldEVudGl0eSgpID09IExp bnEuRmlyc3RPckRlZmF1bHQoaXRlbXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBm aXJzdEJvb3REZXZpY2UgPSBhOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGdldEZp cnN0Qm9vdERldmljZSgpLnNldFNlbGVjdGVkSXRlbShmaXJzdEJvb3REZXZpY2UpOwoKICAgICAg ICBBcnJheUxpc3Q8RW50aXR5TW9kZWw+IHNlY29uZERldmljZU9wdGlvbnMgPQogICAgICAgICAg ICAgICAgTGlucS48RW50aXR5TW9kZWw+IENhc3QoZ2V0U2Vjb25kQm9vdERldmljZSgpLmdldEl0 ZW1zKCkpOwoKICAgICAgICBpZiAoaXRlbXMuc2l6ZSgpID4gMSkKICAgICAgICB7CiAgICAgICAg ICAgIEJvb3RTZXF1ZW5jZSBsYXN0ID0gaXRlbXMuZ2V0KGl0ZW1zLnNpemUoKSAtIDEpOwogICAg ICAgICAgICBmb3IgKEVudGl0eU1vZGVsIGEgOiBzZWNvbmREZXZpY2VPcHRpb25zKQogICAgICAg ICAgICB7CiAgICAgICAgICAgICAgICBpZiAoYS5nZXRFbnRpdHkoKSAhPSBudWxsICYmIChCb290 U2VxdWVuY2UpIGEuZ2V0RW50aXR5KCkgPT0gbGFzdCkKICAgICAgICAgICAgICAgIHsKICAgICAg ICAgICAgICAgICAgICBnZXRTZWNvbmRCb290RGV2aWNlKCkuc2V0U2VsZWN0ZWRJdGVtKGEpOwog ICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9 CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGZvciAoRW50aXR5 TW9kZWwgYSA6IHNlY29uZERldmljZU9wdGlvbnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAg ICAgIGlmIChhLmdldEVudGl0eSgpID09IG51bGwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAg ICAgICAgICAgICAgZ2V0U2Vjb25kQm9vdERldmljZSgpLnNldFNlbGVjdGVkSXRlbShhKTsKICAg ICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQog ICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgdm9pZCBTZXREYXRhQ2VudGVyKFVuaXRWbU1vZGVs IG1vZGVsLCBBcnJheUxpc3Q8c3RvcmFnZV9wb29sPiBsaXN0KQogICAgewogICAgICAgIGlmICht b2RlbC5nZXRCZWhhdmlvcigpLmdldFN5c3RlbVRyZWVTZWxlY3RlZEl0ZW0oKSAhPSBudWxsCiAg ICAgICAgICAgICAgICAmJiBtb2RlbC5nZXRCZWhhdmlvcigpLmdldFN5c3RlbVRyZWVTZWxlY3Rl ZEl0ZW0oKS5nZXRUeXBlKCkgIT0gU3lzdGVtVHJlZUl0ZW1UeXBlLlN5c3RlbSkKICAgICAgICB7 CiAgICAgICAgICAgIHN3aXRjaCAobW9kZWwuZ2V0QmVoYXZpb3IoKS5nZXRTeXN0ZW1UcmVlU2Vs ZWN0ZWRJdGVtKCkuZ2V0VHlwZSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgIGNhc2UgVGVt cGxhdGVzOgogICAgICAgICAgICBjYXNlIERhdGFDZW50ZXI6CiAgICAgICAgICAgICAgICBzdG9y YWdlX3Bvb2wgc2VsZWN0RGF0YUNlbnRlciA9CiAgICAgICAgICAgICAgICAgICAgICAgIChzdG9y YWdlX3Bvb2wpIG1vZGVsLmdldEJlaGF2aW9yKCkuZ2V0U3lzdGVtVHJlZVNlbGVjdGVkSXRlbSgp LmdldEVudGl0eSgpOwogICAgICAgICAgICAgICAgZm9yIChzdG9yYWdlX3Bvb2wgZGMgOiBsaXN0 KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdERhdGFDZW50ZXIuZ2V0SWQoKS5lcXVh bHMoZGMuZ2V0SWQoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0RGF0YUNlbnRl ciA9IGRjOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAg ICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtb2RlbC5nZXREYXRhQ2VudGVy KCkKICAgICAgICAgICAgICAgICAgICAgICAgLnNldEl0ZW1zKG5ldyBBcnJheUxpc3Q8c3RvcmFn ZV9wb29sPihBcnJheXMuYXNMaXN0KG5ldyBzdG9yYWdlX3Bvb2xbXSB7IHNlbGVjdERhdGFDZW50 ZXIgfSkpKTsKICAgICAgICAgICAgICAgIG1vZGVsLmdldERhdGFDZW50ZXIoKS5zZXRTZWxlY3Rl ZEl0ZW0oc2VsZWN0RGF0YUNlbnRlcik7CiAgICAgICAgICAgICAgICBtb2RlbC5nZXREYXRhQ2Vu dGVyKCkuc2V0SXNDaGFuZ2FibGUoZmFsc2UpOwogICAgICAgICAgICAgICAgbW9kZWwuZ2V0RGF0 YUNlbnRlcigpLnNldEluZm8oIkNhbm5vdCBjaG9vc2UgRGF0YSBDZW50ZXIgaW4gdHJlZSBjb250 ZXh0Iik7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBj YXNlIENsdXN0ZXI6CiAgICAgICAgICAgIGNhc2UgVk1zOgogICAgICAgICAgICAgICAgVkRTR3Jv dXAgY2x1c3RlciA9IChWRFNHcm91cCkgbW9kZWwuZ2V0QmVoYXZpb3IoKS5nZXRTeXN0ZW1UcmVl U2VsZWN0ZWRJdGVtKCkuZ2V0RW50aXR5KCk7CiAgICAgICAgICAgICAgICBmb3IgKHN0b3JhZ2Vf cG9vbCBkYyA6IGxpc3QpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYg KGRjLmdldElkKCkuZXF1YWxzKGNsdXN0ZXIuZ2V0U3RvcmFnZVBvb2xJZCgpKSkKICAgICAgICAg ICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmdldERhdGFDZW50ZXIo KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJdGVtcyhuZXcgQXJyYXlMaXN0 PHN0b3JhZ2VfcG9vbD4oQXJyYXlzLmFzTGlzdChuZXcgc3RvcmFnZV9wb29sW10geyBkYyB9KSkp OwogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5nZXREYXRhQ2VudGVyKCkuc2V0U2VsZWN0 ZWRJdGVtKGRjKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAg ICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbW9kZWwuZ2V0RGF0YUNl bnRlcigpLnNldElzQ2hhbmdhYmxlKGZhbHNlKTsKICAgICAgICAgICAgICAgIG1vZGVsLmdldERh dGFDZW50ZXIoKS5zZXRJbmZvKCJDYW5ub3QgY2hvb3NlIERhdGEgQ2VudGVyIGluIHRyZWUgY29u dGV4dCIpOyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAg Y2FzZSBIb3N0OgogICAgICAgICAgICAgICAgVkRTIGhvc3QgPSAoVkRTKSBtb2RlbC5nZXRCZWhh dmlvcigpLmdldFN5c3RlbVRyZWVTZWxlY3RlZEl0ZW0oKS5nZXRFbnRpdHkoKTsKICAgICAgICAg ICAgICAgIGZvciAoc3RvcmFnZV9wb29sIGRjIDogbGlzdCkKICAgICAgICAgICAgICAgIHsKICAg ICAgICAgICAgICAgICAgICBpZiAoZGMuZ2V0SWQoKS5lcXVhbHMoaG9zdC5nZXRTdG9yYWdlUG9v bElkKCkpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbW9k ZWwuZ2V0RGF0YUNlbnRlcigpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEl0 ZW1zKG5ldyBBcnJheUxpc3Q8c3RvcmFnZV9wb29sPihBcnJheXMuYXNMaXN0KG5ldyBzdG9yYWdl X3Bvb2xbXSB7IGRjIH0pKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmdldERhdGFD ZW50ZXIoKS5zZXRTZWxlY3RlZEl0ZW0oZGMpOwogICAgICAgICAgICAgICAgICAgICAgICBtb2Rl bC5nZXREYXRhQ2VudGVyKCkuc2V0SXNDaGFuZ2FibGUoZmFsc2UpOwogICAgICAgICAgICAgICAg ICAgICAgICBtb2RlbC5nZXREYXRhQ2VudGVyKCkuc2V0SW5mbygiQ2Fubm90IGNob29zZSBEYXRh IENlbnRlciBpbiB0cmVlIGNvbnRleHQiKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgICAg ICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAg ICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBTdG9yYWdlOgogICAgICAgICAg ICAgICAgc3RvcmFnZV9kb21haW5zIHN0b3JhZ2UgPSAoc3RvcmFnZV9kb21haW5zKSBtb2RlbC5n ZXRCZWhhdmlvcigpLmdldFN5c3RlbVRyZWVTZWxlY3RlZEl0ZW0oKS5nZXRFbnRpdHkoKTsKICAg ICAgICAgICAgICAgIGZvciAoc3RvcmFnZV9wb29sIGRjIDogbGlzdCkKICAgICAgICAgICAgICAg IHsKICAgICAgICAgICAgICAgICAgICBpZiAoZGMuZ2V0SWQoKS5lcXVhbHMoc3RvcmFnZS5nZXRz dG9yYWdlX3Bvb2xfaWQoKSkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAg ICAgICAgICBtb2RlbC5nZXREYXRhQ2VudGVyKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAuc2V0SXRlbXMobmV3IEFycmF5TGlzdDxzdG9yYWdlX3Bvb2w+KEFycmF5cy5hc0xpc3Qo bmV3IHN0b3JhZ2VfcG9vbFtdIHsgZGMgfSkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgbW9k ZWwuZ2V0RGF0YUNlbnRlcigpLnNldFNlbGVjdGVkSXRlbShkYyk7CiAgICAgICAgICAgICAgICAg ICAgICAgIG1vZGVsLmdldERhdGFDZW50ZXIoKS5zZXRJc0NoYW5nYWJsZShmYWxzZSk7CiAgICAg ICAgICAgICAgICAgICAgICAgIG1vZGVsLmdldERhdGFDZW50ZXIoKS5zZXRJbmZvKCJDYW5ub3Qg Y2hvb3NlIERhdGEgQ2VudGVyIGluIHRyZWUgY29udGV4dCIpOyAvLyROT04tTkxTLTEkCiAgICAg ICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAg ICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAg ICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZQog ICAgICAgIHsKICAgICAgICAgICAgbW9kZWwuZ2V0RGF0YUNlbnRlcigpLnNldEl0ZW1zKGxpc3Qp OwogICAgICAgICAgICBtb2RlbC5nZXREYXRhQ2VudGVyKCkuc2V0U2VsZWN0ZWRJdGVtKExpbnEu Rmlyc3RPckRlZmF1bHQobGlzdCkpOwogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgdm9pZCBT ZXRDbHVzdGVycyhVbml0Vm1Nb2RlbCBtb2RlbCwgQXJyYXlMaXN0PFZEU0dyb3VwPiBjbHVzdGVy cywgTkd1aWQgY2x1c3Rlckd1aWQpCiAgICB7CiAgICAgICAgVm1Nb2RlbEJlaGF2aW9yQmFzZSBi ZWhhdmlvciA9IG1vZGVsLmdldEJlaGF2aW9yKCk7CiAgICAgICAgaWYgKGJlaGF2aW9yLmdldFN5 c3RlbVRyZWVTZWxlY3RlZEl0ZW0oKSAhPSBudWxsCiAgICAgICAgICAgICAgICAmJiBiZWhhdmlv ci5nZXRTeXN0ZW1UcmVlU2VsZWN0ZWRJdGVtKCkuZ2V0VHlwZSgpICE9IFN5c3RlbVRyZWVJdGVt VHlwZS5TeXN0ZW0pCiAgICAgICAgewogICAgICAgICAgICBzd2l0Y2ggKG1vZGVsLmdldEJlaGF2 aW9yKCkuZ2V0U3lzdGVtVHJlZVNlbGVjdGVkSXRlbSgpLmdldFR5cGUoKSkKICAgICAgICAgICAg ewogICAgICAgICAgICBjYXNlIENsdXN0ZXI6CiAgICAgICAgICAgIGNhc2UgVk1zOgogICAgICAg ICAgICAgICAgVkRTR3JvdXAgY2x1c3RlciA9IChWRFNHcm91cCkgYmVoYXZpb3IuZ2V0U3lzdGVt VHJlZVNlbGVjdGVkSXRlbSgpLmdldEVudGl0eSgpOwogICAgICAgICAgICAgICAgbW9kZWwuZ2V0 Q2x1c3RlcigpLnNldEl0ZW1zKG5ldyBBcnJheUxpc3Q8VkRTR3JvdXA+KEFycmF5cy5hc0xpc3Qo bmV3IFZEU0dyb3VwW10geyBjbHVzdGVyIH0pKSk7CiAgICAgICAgICAgICAgICBtb2RlbC5nZXRD bHVzdGVyKCkuc2V0U2VsZWN0ZWRJdGVtKGNsdXN0ZXIpOwogICAgICAgICAgICAgICAgbW9kZWwu Z2V0Q2x1c3RlcigpLnNldElzQ2hhbmdhYmxlKGZhbHNlKTsKICAgICAgICAgICAgICAgIG1vZGVs LmdldENsdXN0ZXIoKS5zZXRJbmZvKCJDYW5ub3QgY2hvb3NlIENsdXN0ZXIgaW4gdHJlZSBjb250 ZXh0Iik7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBj YXNlIEhvc3Q6CiAgICAgICAgICAgICAgICBWRFMgaG9zdCA9IChWRFMpIGJlaGF2aW9yLmdldFN5 c3RlbVRyZWVTZWxlY3RlZEl0ZW0oKS5nZXRFbnRpdHkoKTsKICAgICAgICAgICAgICAgIGZvciAo VkRTR3JvdXAgaXRlckNsdXN0ZXIgOiBjbHVzdGVycykKICAgICAgICAgICAgICAgIHsKICAgICAg ICAgICAgICAgICAgICBpZiAoaXRlckNsdXN0ZXIuZ2V0SWQoKS5lcXVhbHMoaG9zdC5nZXR2ZHNf Z3JvdXBfaWQoKSkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAg ICBtb2RlbC5nZXRDbHVzdGVyKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0 SXRlbXMobmV3IEFycmF5TGlzdDxWRFNHcm91cD4oQXJyYXlzLmFzTGlzdChuZXcgVkRTR3JvdXBb XSB7IGl0ZXJDbHVzdGVyIH0pKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmdldENs dXN0ZXIoKS5zZXRTZWxlY3RlZEl0ZW0oaXRlckNsdXN0ZXIpOwogICAgICAgICAgICAgICAgICAg ICAgICBtb2RlbC5nZXRDbHVzdGVyKCkuc2V0SXNDaGFuZ2FibGUoZmFsc2UpOwogICAgICAgICAg ICAgICAgICAgICAgICBtb2RlbC5nZXRDbHVzdGVyKCkuc2V0SW5mbygiQ2Fubm90IGNob29zZSBD bHVzdGVyIGluIHRyZWUgY29udGV4dCIpOyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICAgICAg ICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAg ICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAg bW9kZWwuZ2V0Q2x1c3RlcigpLnNldEl0ZW1zKGNsdXN0ZXJzKTsKICAgICAgICAgICAgICAgIGlm IChjbHVzdGVyR3VpZCA9PSBudWxsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAg ICAgIG1vZGVsLmdldENsdXN0ZXIoKS5zZXRTZWxlY3RlZEl0ZW0oTGlucS5GaXJzdE9yRGVmYXVs dChjbHVzdGVycykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAg ICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1vZGVsLmdldENsdXN0ZXIoKS5zZXRT ZWxlY3RlZEl0ZW0oTGlucS5GaXJzdE9yRGVmYXVsdChjbHVzdGVycywKICAgICAgICAgICAgICAg ICAgICAgICAgICAgIG5ldyBMaW5xLkNsdXN0ZXJQcmVkaWNhdGUoKEd1aWQpIGNsdXN0ZXJHdWlk KSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAg IH0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKCiAgICAgICAgICAgIG1vZGVsLmdl dENsdXN0ZXIoKS5zZXRJdGVtcyhjbHVzdGVycyk7CiAgICAgICAgICAgIGlmIChjbHVzdGVyR3Vp ZCA9PSBudWxsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBtb2RlbC5nZXRDbHVzdGVy KCkuc2V0U2VsZWN0ZWRJdGVtKExpbnEuRmlyc3RPckRlZmF1bHQoY2x1c3RlcnMpKTsKICAgICAg ICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG1v ZGVsLmdldENsdXN0ZXIoKS5zZXRTZWxlY3RlZEl0ZW0oTGlucS5GaXJzdE9yRGVmYXVsdChjbHVz dGVycywKICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExpbnEuQ2x1c3RlclByZWRpY2F0ZSgo R3VpZCkgY2x1c3Rlckd1aWQpKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAg cHVibGljIGJvb2xlYW4gVmFsaWRhdGUoKQogICAgewogICAgICAgIGdldERhdGFDZW50ZXIoKS5W YWxpZGF0ZVNlbGVjdGVkSXRlbShuZXcgSVZhbGlkYXRpb25bXSB7IG5ldyBOb3RFbXB0eVZhbGlk YXRpb24oKSB9KTsKICAgICAgICBnZXRDbHVzdGVyKCkuVmFsaWRhdGVTZWxlY3RlZEl0ZW0obmV3 IElWYWxpZGF0aW9uW10geyBuZXcgTm90RW1wdHlWYWxpZGF0aW9uKCkgfSk7CiAgICAgICAgZ2V0 TWVtU2l6ZSgpLlZhbGlkYXRlRW50aXR5KG5ldyBJVmFsaWRhdGlvbltdIHsgbmV3IEJ5dGVTaXpl VmFsaWRhdGlvbigpIH0pOwogICAgICAgIGdldE1pbkFsbG9jYXRlZE1lbW9yeSgpLlZhbGlkYXRl RW50aXR5KG5ldyBJVmFsaWRhdGlvbltdIHsgbmV3IEJ5dGVTaXplVmFsaWRhdGlvbigpIH0pOwog ICAgICAgIGdldE9TVHlwZSgpLlZhbGlkYXRlU2VsZWN0ZWRJdGVtKG5ldyBOb3RFbXB0eVZhbGlk YXRpb25bXSB7IG5ldyBOb3RFbXB0eVZhbGlkYXRpb24oKSB9KTsKCiAgICAgICAgc3RvcmFnZV9w b29sIGRhdGFDZW50ZXIgPSAoc3RvcmFnZV9wb29sKSBnZXREYXRhQ2VudGVyKCkuZ2V0U2VsZWN0 ZWRJdGVtKCk7CiAgICAgICAgaWYgKGRhdGFDZW50ZXIgIT0gbnVsbCAmJiBkYXRhQ2VudGVyLmdl dFF1b3RhRW5mb3JjZW1lbnRUeXBlKCkgPT0gUXVvdGFFbmZvcmNlbWVudFR5cGVFbnVtLkhBUkRf RU5GT1JDRU1FTlQpIHsKICAgICAgICAgICAgZ2V0UXVvdGEoKS5WYWxpZGF0ZVNlbGVjdGVkSXRl bShuZXcgSVZhbGlkYXRpb25bXSB7IG5ldyBOb3RFbXB0eVF1b3RhVmFsaWRhdGlvbigpIH0pOwog ICAgICAgIH0KCiAgICAgICAgZ2V0VG90YWxDUFVDb3JlcygpLlZhbGlkYXRlRW50aXR5KG5ldyBJ VmFsaWRhdGlvbltdIHsKICAgICAgICAgICAgICAgIG5ldyBOb3RFbXB0eVZhbGlkYXRpb24oKSwK ICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyVmFsaWRhdGlvbigxLCBiZWhhdmlvci5tYXhDcHVz KSwKICAgICAgICAgICAgICAgIG5ldyBUb3RhbENwdUNvcmVzQ29tcG9zYWJsZVZhbGlkYXRpb24o KSB9KTsKCiAgICAgICAgaWYgKGdldE9TVHlwZSgpLmdldElzVmFsaWQoKSkKICAgICAgICB7CiAg ICAgICAgICAgIFZtT3NUeXBlIG9zVHlwZSA9IChWbU9zVHlwZSkgZ2V0T1NUeXBlKCkuZ2V0U2Vs ZWN0ZWRJdGVtKCk7CiAgICAgICAgICAgIGdldE5hbWUoKS5WYWxpZGF0ZUVudGl0eSgKICAgICAg ICAgICAgICAgICAgICBuZXcgSVZhbGlkYXRpb25bXSB7CiAgICAgICAgICAgICAgICAgICAgICAg ICAgICBuZXcgTm90RW1wdHlWYWxpZGF0aW9uKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICBuZXcgTGVuZ3RoVmFsaWRhdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo Z2V0QmVoYXZpb3IoKSBpbnN0YW5jZW9mIFRlbXBsYXRlVm1Nb2RlbEJlaGF2aW9yIHx8IGdldEJl aGF2aW9yKCkgaW5zdGFuY2VvZiBOZXdUZW1wbGF0ZVZtTW9kZWxCZWhhdmlvcikKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBWTV9URU1QTEFURV9OQU1FX01BWF9MSU1JVCA6 IEFzeW5jRGF0YVByb3ZpZGVyLklzV2luZG93c09zVHlwZShvc1R5cGUpID8gV0lORE9XU19WTV9O QU1FX01BWF9MSU1JVCA6IE5PTl9XSU5ET1dTX1ZNX05BTUVfTUFYX0xJTUlUKSwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgIG5ldyBJMThOTmFtZVZhbGlkYXRpb24oKQogICAgICAgICAgICAg ICAgICAgIH0pOwoKICAgICAgICAgICAgZ2V0RGVzY3JpcHRpb24oKS5WYWxpZGF0ZUVudGl0eSgK ICAgICAgICAgICAgICAgICAgICBuZXcgSVZhbGlkYXRpb25bXSB7CiAgICAgICAgICAgICAgICAg ICAgICAgICAgICBuZXcgTGVuZ3RoVmFsaWRhdGlvbihERVNDUklQVElPTl9NQVhfTElNSVQpLAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNwZWNpYWxBc2NpaUkxOE5Pck5vbmVWYWxp ZGF0aW9uKCkKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGJvb2xlYW4gaXM2 NE9zVHlwZSA9CiAgICAgICAgICAgICAgICAgICAgKG9zVHlwZSA9PSBWbU9zVHlwZS5PdGhlciB8 fCBvc1R5cGUgPT0gVm1Pc1R5cGUuT3RoZXJMaW51eCB8fCBBc3luY0RhdGFQcm92aWRlci5JczY0 Yml0T3NUeXBlKG9zVHlwZSkpOwogICAgICAgICAgICBpbnQgbWF4TWVtU2l6ZSA9IGlzNjRPc1R5 cGUgPyBnZXRfTWF4TWVtU2l6ZTY0KCkgOiBnZXRfTWF4TWVtU2l6ZTMyKCk7CgogICAgICAgICAg ICBWYWxpZGF0ZU1lbW9yeVNpemUoZ2V0TWVtU2l6ZSgpLCBtYXhNZW1TaXplLCBfbWluTWVtU2l6 ZSk7CiAgICAgICAgICAgIGlmICghKHRoaXMuZ2V0QmVoYXZpb3IoKSBpbnN0YW5jZW9mIFRlbXBs YXRlVm1Nb2RlbEJlaGF2aW9yKSkgewogICAgICAgICAgICAgICAgLy8gTWluaW11bSAnUGh5c2lj YWwgTWVtb3J5IEd1YXJhbnRlZWQnIGlzIDFNQgogICAgICAgICAgICAgICAgVmFsaWRhdGVNZW1v cnlTaXplKGdldE1pbkFsbG9jYXRlZE1lbW9yeSgpLCAoSW50ZWdlcikgZ2V0TWVtU2l6ZSgpLmdl dEVudGl0eSgpLCAxKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKChCb29s ZWFuKSBnZXRJc0F1dG9Bc3NpZ24oKS5nZXRFbnRpdHkoKSA9PSBmYWxzZSAmJiAoQm9vbGVhbikg Z2V0UnVuVk1PblRydXN0ZWRIb3N0KCkuZ2V0RW50aXR5KCkgPT0gZmFsc2UgKSB7CiAgICAgICAg ICAgIGdldERlZmF1bHRIb3N0KCkuVmFsaWRhdGVTZWxlY3RlZEl0ZW0obmV3IElWYWxpZGF0aW9u W10geyBuZXcgTm90RW1wdHlWYWxpZGF0aW9uKCkgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAg ICAgICAgZ2V0RGVmYXVsdEhvc3QoKS5zZXRJc1ZhbGlkKHRydWUpOwogICAgICAgIH0KCiAgICAg ICAgZ2V0VGVtcGxhdGUoKS5WYWxpZGF0ZVNlbGVjdGVkSXRlbShuZXcgSVZhbGlkYXRpb25bXSB7 IG5ldyBOb3RFbXB0eVZhbGlkYXRpb24oKSB9KTsKICAgICAgICBnZXREaXNrc0FsbG9jYXRpb25N b2RlbCgpLlZhbGlkYXRlRW50aXR5KG5ldyBJVmFsaWRhdGlvbltdIHt9KTsKCiAgICAgICAgZ2V0 Q2RJbWFnZSgpLnNldElzVmFsaWQodHJ1ZSk7CiAgICAgICAgaWYgKGdldENkSW1hZ2UoKS5nZXRJ c0NoYW5nYWJsZSgpKSB7CiAgICAgICAgICAgIGdldENkSW1hZ2UoKS5WYWxpZGF0ZVNlbGVjdGVk SXRlbShuZXcgSVZhbGlkYXRpb25bXSB7IG5ldyBOb3RFbXB0eVZhbGlkYXRpb24oKSB9KTsKICAg ICAgICB9CgogICAgICAgIGdldEtlcm5lbF9wYXRoKCkuc2V0SXNWYWxpZCh0cnVlKTsKICAgICAg ICBnZXRLZXJuZWxfcGFyYW1ldGVycygpLnNldElzVmFsaWQodHJ1ZSk7CiAgICAgICAgZ2V0SW5p dHJkX3BhdGgoKS5zZXRJc1ZhbGlkKHRydWUpOwogICAgICAgIGlmIChnZXRLZXJuZWxfcGF0aCgp LmdldEVudGl0eSgpID09IG51bGwpIHsKICAgICAgICAgICAgZ2V0S2VybmVsX3BhdGgoKS5zZXRF bnRpdHkoIiIpOyAvLyROT04tTkxTLTEkCiAgICAgICAgfQogICAgICAgIGlmIChnZXRLZXJuZWxf cGFyYW1ldGVycygpLmdldEVudGl0eSgpID09IG51bGwpIHsKICAgICAgICAgICAgZ2V0S2VybmVs X3BhcmFtZXRlcnMoKS5zZXRFbnRpdHkoIiIpOyAvLyROT04tTkxTLTEkCiAgICAgICAgfQogICAg ICAgIGlmIChnZXRJbml0cmRfcGF0aCgpLmdldEVudGl0eSgpID09IG51bGwpIHsKICAgICAgICAg ICAgZ2V0SW5pdHJkX3BhdGgoKS5zZXRFbnRpdHkoIiIpOyAvLyROT04tTkxTLTEkCiAgICAgICAg fQoKICAgICAgICBpZiAoaXNMaW51eF9VbmFzc2lnbl9Vbmtub3duT1MpIHsKICAgICAgICAgICAg Z2V0S2VybmVsX3BhdGgoKS5WYWxpZGF0ZUVudGl0eShuZXcgSVZhbGlkYXRpb25bXSB7IG5ldyBO b1RyaW1taW5nV2hpdGVzcGFjZXNWYWxpZGF0aW9uKCkgfSk7CiAgICAgICAgICAgIGdldEluaXRy ZF9wYXRoKCkuVmFsaWRhdGVFbnRpdHkobmV3IElWYWxpZGF0aW9uW10geyBuZXcgTm9UcmltbWlu Z1doaXRlc3BhY2VzVmFsaWRhdGlvbigpIH0pOwogICAgICAgICAgICBnZXRLZXJuZWxfcGFyYW1l dGVycygpLlZhbGlkYXRlRW50aXR5KG5ldyBJVmFsaWRhdGlvbltdIHsgbmV3IE5vVHJpbW1pbmdX aGl0ZXNwYWNlc1ZhbGlkYXRpb24oKSB9KTsKCiAgICAgICAgICAgIFN0cmluZyBrZXJuZWxQYXRo ID0gKFN0cmluZykgZ2V0S2VybmVsX3BhdGgoKS5nZXRFbnRpdHkoKTsKICAgICAgICAgICAgU3Ry aW5nIGluaXRyZFBhdGggPSAoU3RyaW5nKSBnZXRJbml0cmRfcGF0aCgpLmdldEVudGl0eSgpOwog ICAgICAgICAgICBTdHJpbmcga2VybmVsUGFyYW1zID0gKFN0cmluZykgZ2V0S2VybmVsX3BhcmFt ZXRlcnMoKS5nZXRFbnRpdHkoKTsKCiAgICAgICAgICAgIGlmICgoa2VybmVsUGFyYW1zLmxlbmd0 aCgpID4gMCB8fCBpbml0cmRQYXRoLmxlbmd0aCgpID4gMCkgJiYga2VybmVsUGF0aC5sZW5ndGgo KSA9PSAwKSB7CiAgICAgICAgICAgICAgICBib29sZWFuIGtlcm5lbFBhcmFtSW52YWxpZCA9IGZh bHNlOwogICAgICAgICAgICAgICAgYm9vbGVhbiBpbmV0ZFBhdGhJbnZhbGlkID0gZmFsc2U7Cgog ICAgICAgICAgICAgICAgaWYgKGtlcm5lbFBhcmFtcy5sZW5ndGgoKSA+IDApIHsKICAgICAgICAg ICAgICAgICAgICBnZXRLZXJuZWxfcGFyYW1ldGVycygpLnNldElzVmFsaWQoZmFsc2UpOwogICAg ICAgICAgICAgICAgICAgIGtlcm5lbFBhcmFtSW52YWxpZCA9IHRydWU7CiAgICAgICAgICAgICAg ICB9CiAgICAgICAgICAgICAgICBpZiAoaW5pdHJkUGF0aC5sZW5ndGgoKSA+IDApIHsKICAgICAg ICAgICAgICAgICAgICBnZXRJbml0cmRfcGF0aCgpLnNldElzVmFsaWQoZmFsc2UpOwogICAgICAg ICAgICAgICAgICAgIGluZXRkUGF0aEludmFsaWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQoK ICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPQogICAgICAgICAgICAgICAgICAgICAgICBDb25z dGFudHNNYW5hZ2VyLmdldEluc3RhbmNlKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAuZ2V0TWVzc2FnZXMoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbnZhbGlk UGF0aChrZXJuZWxQYXJhbUludmFsaWQgPyBDb25zdGFudHNNYW5hZ2VyLmdldEluc3RhbmNlKCkK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb25zdGFudHMoKQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmtlcm5lbEludmFsaWQoKSA6 ICIiLCAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBrZXJuZWxQYXJhbUludmFsaWQgJiYgaW5ldGRQYXRoSW52YWxpZCA/IENvbnN0YW50c01hbmFn ZXIuZ2V0SW5zdGFuY2UoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAuZ2V0Q29uc3RhbnRzKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgLm9yKCkgOiAiIiwgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgaW5ldGRQYXRoSW52YWxpZCA/IENvbnN0YW50c01hbmFn ZXIuZ2V0SW5zdGFuY2UoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAuZ2V0Q29uc3RhbnRzKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgLmluZXRkSW52YWxpZCgpIDogIiIpOyAvLyROT04tTkxTLTEkCgogICAg ICAgICAgICAgICAgZ2V0S2VybmVsX3BhdGgoKS5zZXRJc1ZhbGlkKGZhbHNlKTsKICAgICAgICAg ICAgICAgIGdldEluaXRyZF9wYXRoKCkuZ2V0SW52YWxpZGl0eVJlYXNvbnMoKS5hZGQobXNnKTsK ICAgICAgICAgICAgICAgIGdldEtlcm5lbF9wYXJhbWV0ZXJzKCkuZ2V0SW52YWxpZGl0eVJlYXNv bnMoKS5hZGQobXNnKTsKICAgICAgICAgICAgICAgIGdldEtlcm5lbF9wYXRoKCkuZ2V0SW52YWxp ZGl0eVJlYXNvbnMoKS5hZGQobXNnKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAg Ym9vbGVhbiBjdXN0b21Qcm9wZXJ0eVNoZWV0VmFsaWQgPSBnZXRDdXN0b21Qcm9wZXJ0eVNoZWV0 KCkudmFsaWRhdGUoKTsKCiAgICAgICAgc2V0SXNCb290U2VxdWVuY2VUYWJWYWxpZCh0cnVlKTsK ICAgICAgICBzZXRJc0FsbG9jYXRpb25UYWJWYWxpZChnZXRJc0Jvb3RTZXF1ZW5jZVRhYlZhbGlk KCkpOwogICAgICAgIHNldElzRGlzcGxheVRhYlZhbGlkKGdldElzQWxsb2NhdGlvblRhYlZhbGlk KCkpOwogICAgICAgIHNldElzRmlyc3RSdW5UYWJWYWxpZChnZXRJc0Rpc3BsYXlUYWJWYWxpZCgp KTsKICAgICAgICBzZXRJc0dlbmVyYWxUYWJWYWxpZChnZXRJc0ZpcnN0UnVuVGFiVmFsaWQoKSk7 CgogICAgICAgIHNldElzR2VuZXJhbFRhYlZhbGlkKGdldE5hbWUoKS5nZXRJc1ZhbGlkKCkgJiYg Z2V0RGVzY3JpcHRpb24oKS5nZXRJc1ZhbGlkKCkgJiYgZ2V0RGF0YUNlbnRlcigpLmdldElzVmFs aWQoKQogICAgICAgICAgICAgICAgJiYgZ2V0VGVtcGxhdGUoKS5nZXRJc1ZhbGlkKCkgJiYgZ2V0 Q2x1c3RlcigpLmdldElzVmFsaWQoKSAmJiBnZXRNZW1TaXplKCkuZ2V0SXNWYWxpZCgpCiAgICAg ICAgICAgICAgICAmJiBnZXRNaW5BbGxvY2F0ZWRNZW1vcnkoKS5nZXRJc1ZhbGlkKCkpOwoKICAg ICAgICBzZXRJc0ZpcnN0UnVuVGFiVmFsaWQoZ2V0RG9tYWluKCkuZ2V0SXNWYWxpZCgpICYmIGdl dFRpbWVab25lKCkuZ2V0SXNWYWxpZCgpKTsKICAgICAgICBzZXRJc0Rpc3BsYXlUYWJWYWxpZChn ZXRVc2JQb2xpY3koKS5nZXRJc1ZhbGlkKCkgJiYgZ2V0TnVtT2ZNb25pdG9ycygpLmdldElzVmFs aWQoKSk7CiAgICAgICAgc2V0SXNIb3N0VGFiVmFsaWQoZ2V0RGVmYXVsdEhvc3QoKS5nZXRJc1Zh bGlkKCkpOwogICAgICAgIHNldElzQWxsb2NhdGlvblRhYlZhbGlkKGdldERpc2tzQWxsb2NhdGlv bk1vZGVsKCkuZ2V0SXNWYWxpZCgpICYmIGdldE1pbkFsbG9jYXRlZE1lbW9yeSgpLmdldElzVmFs aWQoKSk7CiAgICAgICAgc2V0SXNCb290U2VxdWVuY2VUYWJWYWxpZChnZXRDZEltYWdlKCkuZ2V0 SXNWYWxpZCgpICYmIGdldEtlcm5lbF9wYXRoKCkuZ2V0SXNWYWxpZCgpKTsKICAgICAgICBzZXRJ c0N1c3RvbVByb3BlcnRpZXNUYWJWYWxpZChjdXN0b21Qcm9wZXJ0eVNoZWV0VmFsaWQpOwoKICAg ICAgICByZXR1cm4gZ2V0TmFtZSgpLmdldElzVmFsaWQoKSAmJiBnZXREZXNjcmlwdGlvbigpLmdl dElzVmFsaWQoKSAmJiBnZXREYXRhQ2VudGVyKCkuZ2V0SXNWYWxpZCgpCiAgICAgICAgICAgICAg ICAmJiBnZXREaXNrc0FsbG9jYXRpb25Nb2RlbCgpLmdldElzVmFsaWQoKSAmJiBnZXRUZW1wbGF0 ZSgpLmdldElzVmFsaWQoKSAmJiBnZXRDbHVzdGVyKCkuZ2V0SXNWYWxpZCgpCiAgICAgICAgICAg ICAgICAmJiBnZXREZWZhdWx0SG9zdCgpLmdldElzVmFsaWQoKSAmJiBnZXRNZW1TaXplKCkuZ2V0 SXNWYWxpZCgpICYmIGdldE1pbkFsbG9jYXRlZE1lbW9yeSgpLmdldElzVmFsaWQoKQogICAgICAg ICAgICAgICAgJiYgZ2V0TnVtT2ZNb25pdG9ycygpLmdldElzVmFsaWQoKSAmJiBnZXREb21haW4o KS5nZXRJc1ZhbGlkKCkgJiYgZ2V0VXNiUG9saWN5KCkuZ2V0SXNWYWxpZCgpCiAgICAgICAgICAg ICAgICAmJiBnZXRUaW1lWm9uZSgpLmdldElzVmFsaWQoKSAmJiBnZXRPU1R5cGUoKS5nZXRJc1Zh bGlkKCkgJiYgZ2V0Q2RJbWFnZSgpLmdldElzVmFsaWQoKQogICAgICAgICAgICAgICAgJiYgZ2V0 S2VybmVsX3BhdGgoKS5nZXRJc1ZhbGlkKCkKICAgICAgICAgICAgICAgICYmIGdldEtlcm5lbF9w YXJhbWV0ZXJzKCkuZ2V0SXNWYWxpZCgpICYmIGdldEluaXRyZF9wYXRoKCkuZ2V0SXNWYWxpZCgp CiAgICAgICAgICAgICAgICAmJiBiZWhhdmlvci5WYWxpZGF0ZSgpCiAgICAgICAgICAgICAgICAm JiBjdXN0b21Qcm9wZXJ0eVNoZWV0VmFsaWQgJiYgZ2V0UXVvdGEoKS5nZXRJc1ZhbGlkKCk7Cgog ICAgfQoKICAgIGNsYXNzIFRvdGFsQ3B1Q29yZXNDb21wb3NhYmxlVmFsaWRhdGlvbiBpbXBsZW1l bnRzIElWYWxpZGF0aW9uIHsKCiAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgcHVibGljIFZhbGlk YXRpb25SZXN1bHQgVmFsaWRhdGUoT2JqZWN0IHZhbHVlKSB7CiAgICAgICAgICAgIGJvb2xlYW4g aXNPayA9IGJlaGF2aW9yLmlzTnVtT2ZTb2NrZXRzQ29ycmVjdChJbnRlZ2VyLnBhcnNlSW50KGdl dFRvdGFsQ1BVQ29yZXMoKS5nZXRFbnRpdHkoKS50b1N0cmluZygpKSk7CiAgICAgICAgICAgIFZh bGlkYXRpb25SZXN1bHQgcmVzID0gbmV3IFZhbGlkYXRpb25SZXN1bHQoKTsKICAgICAgICAgICAg cmVzLnNldFN1Y2Nlc3MoaXNPayk7CiAgICAgICAgICAgIHJlcy5zZXRSZWFzb25zKEFycmF5cy5h c0xpc3QoQ29uc3RhbnRzTWFuYWdlci5nZXRJbnN0YW5jZSgpCiAgICAgICAgICAgICAgICAgICAg LmdldE1lc3NhZ2VzKCkKICAgICAgICAgICAgICAgICAgICAuaW5jb3JyZWN0VkNQVU51bWJlcigp KSk7CiAgICAgICAgICAgIHJldHVybiByZXM7CgogICAgICAgIH0KCiAgICB9CgogICAgcHJpdmF0 ZSB2b2lkIFZhbGlkYXRlTWVtb3J5U2l6ZShFbnRpdHlNb2RlbCBtb2RlbCwgaW50IG1heE1lbVNp emUsIGludCBtaW5NZW1TaXplKQogICAgewogICAgICAgIGJvb2xlYW4gaXNWYWxpZCA9IGZhbHNl OwoKICAgICAgICBpbnQgbWVtU2l6ZSA9IChJbnRlZ2VyKSBtb2RlbC5nZXRFbnRpdHkoKTsKCiAg ICAgICAgaWYgKG1lbVNpemUgPT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIG1vZGVsLmdldElu dmFsaWRpdHlSZWFzb25zKCkuYWRkKENvbnN0YW50c01hbmFnZXIuZ2V0SW5zdGFuY2UoKQogICAg ICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlcygpCiAgICAgICAgICAgICAgICAgICAgLm1lbVNp emVCZXR3ZWVuKG1pbk1lbVNpemUsIG1heE1lbVNpemUpKTsKICAgICAgICB9CiAgICAgICAgZWxz ZSBpZiAobWVtU2l6ZSA+IG1heE1lbVNpemUpCiAgICAgICAgewogICAgICAgICAgICBtb2RlbC5n ZXRJbnZhbGlkaXR5UmVhc29ucygpLmFkZChDb25zdGFudHNNYW5hZ2VyLmdldEluc3RhbmNlKCkK ICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZXMoKQogICAgICAgICAgICAgICAgICAgIC5t YXhNZW1TaXplSXMobWF4TWVtU2l6ZSkpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChtZW1T aXplIDwgbWluTWVtU2l6ZSkKICAgICAgICB7CiAgICAgICAgICAgIG1vZGVsLmdldEludmFsaWRp dHlSZWFzb25zKCkuYWRkKENvbnN0YW50c01hbmFnZXIuZ2V0SW5zdGFuY2UoKQogICAgICAgICAg ICAgICAgICAgIC5nZXRNZXNzYWdlcygpCiAgICAgICAgICAgICAgICAgICAgLm1pbk1lbVNpemVJ cyhtaW5NZW1TaXplKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAg ICAgIGlzVmFsaWQgPSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgbW9kZWwuc2V0SXNWYWxpZChp c1ZhbGlkKTsKICAgIH0KCiAgICBwcml2YXRlIE5vdENoYW5nYWJsZUZvclZtSW5Qb29sTGlzdE1v ZGVsIHBvb2xUeXBlOwoKICAgIHB1YmxpYyBMaXN0TW9kZWwgZ2V0UG9vbFR5cGUoKQogICAgewog ICAgICAgIHJldHVybiBwb29sVHlwZTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgdm9pZCBzZXRQb29s VHlwZShOb3RDaGFuZ2FibGVGb3JWbUluUG9vbExpc3RNb2RlbCB2YWx1ZSkKICAgIHsKICAgICAg ICBwb29sVHlwZSA9IHZhbHVlOwogICAgfQoKICAgIHByaXZhdGUgTm90Q2hhbmdhYmxlRm9yVm1J blBvb2xFbnRpdHlNb2RlbCBudW1PZkRlc2t0b3BzOwoKICAgIHB1YmxpYyBFbnRpdHlNb2RlbCBn ZXROdW1PZkRlc2t0b3BzKCkKICAgIHsKICAgICAgICByZXR1cm4gbnVtT2ZEZXNrdG9wczsKICAg IH0KCiAgICBwcm90ZWN0ZWQgdm9pZCBzZXROdW1PZkRlc2t0b3BzKE5vdENoYW5nYWJsZUZvclZt SW5Qb29sRW50aXR5TW9kZWwgdmFsdWUpCiAgICB7CiAgICAgICAgbnVtT2ZEZXNrdG9wcyA9IHZh bHVlOwogICAgfQoKICAgIHByaXZhdGUgTm90Q2hhbmdhYmxlRm9yVm1JblBvb2xFbnRpdHlNb2Rl bCBhc3NpZ25lZFZtczsKCiAgICBwdWJsaWMgRW50aXR5TW9kZWwgZ2V0QXNzaWduZWRWbXMoKQog ICAgewogICAgICAgIHJldHVybiBhc3NpZ25lZFZtczsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBz ZXRBc3NpZ25lZFZtcyhOb3RDaGFuZ2FibGVGb3JWbUluUG9vbEVudGl0eU1vZGVsIHZhbHVlKQog ICAgewogICAgICAgIGFzc2lnbmVkVm1zID0gdmFsdWU7CiAgICB9CgogICAgcHJpdmF0ZSBib29s ZWFuIGlzUG9vbFRhYlZhbGlkOwoKICAgIHB1YmxpYyBib29sZWFuIGdldElzUG9vbFRhYlZhbGlk KCkKICAgIHsKICAgICAgICByZXR1cm4gaXNQb29sVGFiVmFsaWQ7CiAgICB9CgogICAgcHVibGlj IHZvaWQgc2V0SXNQb29sVGFiVmFsaWQoYm9vbGVhbiB2YWx1ZSkKICAgIHsKICAgICAgICBpZiAo aXNQb29sVGFiVmFsaWQgIT0gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBpc1Bvb2xUYWJW YWxpZCA9IHZhbHVlOwogICAgICAgICAgICBPblByb3BlcnR5Q2hhbmdlZChuZXcgUHJvcGVydHlD aGFuZ2VkRXZlbnRBcmdzKCJJc1Bvb2xUYWJWYWxpZCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAg IH0KICAgIH0KCiAgICBwcml2YXRlIE5vdENoYW5nYWJsZUZvclZtSW5Qb29sRW50aXR5TW9kZWwg cHJlc3RhcnRlZFZtczsKCiAgICBwdWJsaWMgRW50aXR5TW9kZWwgZ2V0UHJlc3RhcnRlZFZtcygp IHsKICAgICAgICByZXR1cm4gcHJlc3RhcnRlZFZtczsKICAgIH0KCiAgICBwcm90ZWN0ZWQgdm9p ZCBzZXRQcmVzdGFydGVkVm1zKE5vdENoYW5nYWJsZUZvclZtSW5Qb29sRW50aXR5TW9kZWwgdmFs dWUpIHsKICAgICAgICBwcmVzdGFydGVkVm1zID0gdmFsdWU7CiAgICB9CgogICAgcHJpdmF0ZSBT dHJpbmcgcHJlc3RhcnRlZFZtc0hpbnQ7CgogICAgcHVibGljIFN0cmluZyBnZXRQcmVzdGFydGVk Vm1zSGludCgpIHsKICAgICAgICByZXR1cm4gcHJlc3RhcnRlZFZtc0hpbnQ7CiAgICB9CgogICAg cHVibGljIHZvaWQgc2V0UHJlc3RhcnRlZFZtc0hpbnQoU3RyaW5nIHZhbHVlKSB7CiAgICAgICAg aWYgKHByZXN0YXJ0ZWRWbXNIaW50ICE9IHZhbHVlKSB7CiAgICAgICAgICAgIHByZXN0YXJ0ZWRW bXNIaW50ID0gdmFsdWU7CiAgICAgICAgICAgIE9uUHJvcGVydHlDaGFuZ2VkKG5ldyBQcm9wZXJ0 eUNoYW5nZWRFdmVudEFyZ3MoIlByZXN0YXJ0ZWRWbXNIaW50IikpOyAvLyROT04tTkxTLTEkCiAg ICAgICAgfQogICAgfQoKICAgIHByaXZhdGUgY2xhc3MgTm90Q2hhbmdhYmxlRm9yVm1JblBvb2xM aXN0TW9kZWwgZXh0ZW5kcyBMaXN0TW9kZWwgewogICAgICAgIEBPdmVycmlkZQogICAgICAgIHB1 YmxpYyB2b2lkIHNldElzQ2hhbmdhYmxlKGJvb2xlYW4gdmFsdWUpIHsKICAgICAgICAgICAgaWYg KCFpc1ZtQXR0YWNoZWRUb1Bvb2woKSkKICAgICAgICAgICAgICAgIHN1cGVyLnNldElzQ2hhbmdh YmxlKHZhbHVlKTsKICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSBjbGFzcyBOb3RDaGFuZ2Fi bGVGb3JWbUluUG9vbEVudGl0eU1vZGVsIGV4dGVuZHMgRW50aXR5TW9kZWwgewogICAgICAgIEBP dmVycmlkZQogICAgICAgIHB1YmxpYyB2b2lkIHNldElzQ2hhbmdhYmxlKGJvb2xlYW4gdmFsdWUp IHsKICAgICAgICAgICAgaWYgKCFpc1ZtQXR0YWNoZWRUb1Bvb2woKSkKICAgICAgICAgICAgICAg IHN1cGVyLnNldElzQ2hhbmdhYmxlKHZhbHVlKTsKICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0 ZSBjbGFzcyBOb3RDaGFuZ2FibGVGb3JWbUluUG9vbEtleVZhbHVlTW9kZWwgZXh0ZW5kcyBLZXlW YWx1ZU1vZGVsIHsKICAgICAgICBAT3ZlcnJpZGUKICAgICAgICBwdWJsaWMgdm9pZCBzZXRJc0No YW5nYWJsZShib29sZWFuIHZhbHVlKSB7CiAgICAgICAgICAgIGlmICghaXNWbUF0dGFjaGVkVG9Q b29sKCkpCiAgICAgICAgICAgICAgICBzdXBlci5zZXRJc0NoYW5nYWJsZSh2YWx1ZSk7CiAgICAg ICAgfQogICAgfQp9Cg== --_005_C5A0092C63E939488005F15F736A8112097A57B9SHSMSX101ccrcor_ Content-Type: application/octet-stream; name="AbstractVmPopupWidget.java" Content-Description: AbstractVmPopupWidget.java Content-Disposition: attachment; filename="AbstractVmPopupWidget.java"; size=44510; creation-date="Tue, 12 Mar 2013 08:33:20 GMT"; modification-date="Tue, 12 Mar 2013 08:24:49 GMT" Content-Transfer-Encoding: base64 cGFja2FnZSBvcmcub3ZpcnQuZW5naW5lLnVpLmNvbW1vbi53aWRnZXQudWljb21tb24ucG9wdXA7 CgppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKaW1wb3J0IGphdmEudXRpbC5MaXN0OwppbXBv cnQgamF2YS51dGlsLk1hcC5FbnRyeTsKCmltcG9ydCBvcmcub3ZpcnQuZW5naW5lLmNvcmUuY29t bW9uLmJ1c2luZXNzZW50aXRpZXMuRGlzazsKaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUuY29yZS5j b21tb24uYnVzaW5lc3NlbnRpdGllcy5EaXNrLkRpc2tTdG9yYWdlVHlwZTsKaW1wb3J0IG9yZy5v dmlydC5lbmdpbmUuY29yZS5jb21tb24uYnVzaW5lc3NlbnRpdGllcy5EaXNrSW1hZ2U7CmltcG9y dCBvcmcub3ZpcnQuZW5naW5lLmNvcmUuY29tbW9uLmJ1c2luZXNzZW50aXRpZXMuSW1hZ2VTdGF0 dXM7CmltcG9ydCBvcmcub3ZpcnQuZW5naW5lLmNvcmUuY29tbW9uLmJ1c2luZXNzZW50aXRpZXMu UXVvdGE7CmltcG9ydCBvcmcub3ZpcnQuZW5naW5lLmNvcmUuY29tbW9uLmJ1c2luZXNzZW50aXRp ZXMuVXNiUG9saWN5OwppbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS5jb3JlLmNvbW1vbi5idXNpbmVz c2VudGl0aWVzLlZEUzsKaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUuY29yZS5jb21tb24uYnVzaW5l c3NlbnRpdGllcy5WRFNHcm91cDsKaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUuY29yZS5jb21tb24u YnVzaW5lc3NlbnRpdGllcy5WbVRlbXBsYXRlOwppbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS5jb3Jl LmNvbW1vbi5idXNpbmVzc2VudGl0aWVzLlZtVHlwZTsKaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUu Y29yZS5jb21tb24uYnVzaW5lc3NlbnRpdGllcy5zdG9yYWdlX3Bvb2w7CmltcG9ydCBvcmcub3Zp cnQuZW5naW5lLmNvcmUuY29tcGF0LkV2ZW50OwppbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS5jb3Jl LmNvbXBhdC5FdmVudEFyZ3M7CmltcG9ydCBvcmcub3ZpcnQuZW5naW5lLmNvcmUuY29tcGF0LklF dmVudExpc3RlbmVyOwppbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS5jb3JlLmNvbXBhdC5Qcm9wZXJ0 eUNoYW5nZWRFdmVudEFyZ3M7CmltcG9ydCBvcmcub3ZpcnQuZW5naW5lLnVpLmNvbW1vbi5Db21t b25BcHBsaWNhdGlvbkNvbnN0YW50czsKaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUudWkuY29tbW9u LkNvbW1vbkFwcGxpY2F0aW9uTWVzc2FnZXM7CmltcG9ydCBvcmcub3ZpcnQuZW5naW5lLnVpLmNv bW1vbi5Db21tb25BcHBsaWNhdGlvblJlc291cmNlczsKaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUu dWkuY29tbW9uLmlkaGFuZGxlci5XaXRoRWxlbWVudElkOwppbXBvcnQgb3JnLm92aXJ0LmVuZ2lu ZS51aS5jb21tb24ud2lkZ2V0LkFsaWduOwppbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS51aS5jb21t b24ud2lkZ2V0LmRpYWxvZy5BZHZhbmNlZFBhcmFtZXRlcnNFeHBhbmRlcjsKaW1wb3J0IG9yZy5v dmlydC5lbmdpbmUudWkuY29tbW9uLndpZGdldC5kaWFsb2cuSW5mb0ljb247CmltcG9ydCBvcmcu b3ZpcnQuZW5naW5lLnVpLmNvbW1vbi53aWRnZXQuZGlhbG9nLnRhYi5EaWFsb2dUYWI7CmltcG9y dCBvcmcub3ZpcnQuZW5naW5lLnVpLmNvbW1vbi53aWRnZXQuZGlhbG9nLnRhYi5EaWFsb2dUYWJQ YW5lbDsKaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUudWkuY29tbW9uLndpZGdldC5lZGl0b3IuRW50 aXR5TW9kZWxDZWxsVGFibGU7CmltcG9ydCBvcmcub3ZpcnQuZW5naW5lLnVpLmNvbW1vbi53aWRn ZXQuZWRpdG9yLkVudGl0eU1vZGVsQ2hlY2tCb3hFZGl0b3I7CmltcG9ydCBvcmcub3ZpcnQuZW5n aW5lLnVpLmNvbW1vbi53aWRnZXQuZWRpdG9yLkVudGl0eU1vZGVsUmFkaW9CdXR0b25FZGl0b3I7 CmltcG9ydCBvcmcub3ZpcnQuZW5naW5lLnVpLmNvbW1vbi53aWRnZXQuZWRpdG9yLkVudGl0eU1v ZGVsVGV4dEJveEVkaXRvcjsKaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUudWkuY29tbW9uLndpZGdl dC5lZGl0b3IuRW50aXR5TW9kZWxUZXh0Qm94T25seUVkaXRvcjsKaW1wb3J0IG9yZy5vdmlydC5l bmdpbmUudWkuY29tbW9uLndpZGdldC5lZGl0b3IuTGlzdE1vZGVsTGlzdEJveEVkaXRvcjsKaW1w b3J0IG9yZy5vdmlydC5lbmdpbmUudWkuY29tbW9uLndpZGdldC5mb3JtLmtleV92YWx1ZS5LZXlW YWx1ZVdpZGdldDsKaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUudWkuY29tbW9uLndpZGdldC5wYXJz ZXIuTWVtb3J5U2l6ZVBhcnNlcjsKaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUudWkuY29tbW9uLndp ZGdldC5yZW5kZXJlci5FbnVtUmVuZGVyZXI7CmltcG9ydCBvcmcub3ZpcnQuZW5naW5lLnVpLmNv bW1vbi53aWRnZXQucmVuZGVyZXIuTWVtb3J5U2l6ZVJlbmRlcmVyOwppbXBvcnQgb3JnLm92aXJ0 LmVuZ2luZS51aS5jb21tb24ud2lkZ2V0LnJlbmRlcmVyLk51bGxTYWZlUmVuZGVyZXI7CmltcG9y dCBvcmcub3ZpcnQuZW5naW5lLnVpLmNvbW1vbi53aWRnZXQudGFibGUuY29sdW1uLlRleHRDb2x1 bW5XaXRoVG9vbHRpcDsKaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUudWkuY29tbW9uLndpZGdldC51 aWNvbW1vbi5zdG9yYWdlLkRpc2tzQWxsb2NhdGlvblZpZXc7CmltcG9ydCBvcmcub3ZpcnQuZW5n aW5lLnVpLnVpY29tbW9ud2ViLm1vZGVscy5FbnRpdHlNb2RlbDsKaW1wb3J0IG9yZy5vdmlydC5l bmdpbmUudWkudWljb21tb253ZWIubW9kZWxzLkxpc3RNb2RlbDsKaW1wb3J0IG9yZy5vdmlydC5l bmdpbmUudWkudWljb21tb253ZWIubW9kZWxzLnZtcy5EaXNrTW9kZWw7CmltcG9ydCBvcmcub3Zp cnQuZW5naW5lLnVpLnVpY29tbW9ud2ViLm1vZGVscy52bXMuVW5pdFZtTW9kZWw7CmltcG9ydCBv cmcub3ZpcnQuZW5naW5lLnVpLnVpY29tcGF0LkVudW1UcmFuc2xhdG9yOwppbXBvcnQgb3JnLm92 aXJ0LmVuZ2luZS51aS51aWNvbXBhdC5leHRlcm5hbC5TdHJpbmdVdGlsczsKCmltcG9ydCBjb20u Z29vZ2xlLmd3dC5jb3JlLmNsaWVudC5HV1Q7CmltcG9ydCBjb20uZ29vZ2xlLmd3dC5lZGl0b3Iu Y2xpZW50LlNpbXBsZUJlYW5FZGl0b3JEcml2ZXI7CmltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVu dC5kb20uY2xpZW50LkNsaWNrRXZlbnQ7CmltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20u Y2xpZW50LkNsaWNrSGFuZGxlcjsKaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmxvZ2ljYWwu c2hhcmVkLlZhbHVlQ2hhbmdlRXZlbnQ7CmltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5sb2dp Y2FsLnNoYXJlZC5WYWx1ZUNoYW5nZUhhbmRsZXI7CmltcG9ydCBjb20uZ29vZ2xlLmd3dC5yZXNv dXJjZXMuY2xpZW50LkNzc1Jlc291cmNlOwppbXBvcnQgY29tLmdvb2dsZS5nd3Quc2FmZWh0bWwu Y2xpZW50LlNhZmVIdG1sVGVtcGxhdGVzOwppbXBvcnQgY29tLmdvb2dsZS5nd3Quc2FmZWh0bWwu c2hhcmVkLlNhZmVIdG1sOwppbXBvcnQgY29tLmdvb2dsZS5nd3QudGV4dC5zaGFyZWQuQWJzdHJh Y3RSZW5kZXJlcjsKaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVpYmluZGVyLmNsaWVudC5VaUJpbmRl cjsKaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVpYmluZGVyLmNsaWVudC5VaUZpZWxkOwppbXBvcnQg Y29tLmdvb2dsZS5nd3QudXNlci5jZWxsdmlldy5jbGllbnQuQ2VsbFRhYmxlOwppbXBvcnQgY29t Lmdvb2dsZS5nd3QudXNlci5jZWxsdmlldy5jbGllbnQuQ2VsbFRhYmxlLlJlc291cmNlczsKaW1w b3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkZsb3dQYW5lbDsKaW1wb3J0IGNvbS5n b29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkhUTUw7CmltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2Vy LmNsaWVudC51aS5Ib3Jpem9udGFsUGFuZWw7CmltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNs aWVudC51aS5MYWJlbDsKaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLlBhbmVs OwppbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuUmFkaW9CdXR0b247CmltcG9y dCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5WYWx1ZUxhYmVsOwoKcHVibGljIGFic3Ry YWN0IGNsYXNzIEFic3RyYWN0Vm1Qb3B1cFdpZGdldCBleHRlbmRzIEFic3RyYWN0TW9kZWxCb3Vu ZFBvcHVwV2lkZ2V0PFVuaXRWbU1vZGVsPiB7CgogICAgaW50ZXJmYWNlIERyaXZlciBleHRlbmRz IFNpbXBsZUJlYW5FZGl0b3JEcml2ZXI8VW5pdFZtTW9kZWwsIEFic3RyYWN0Vm1Qb3B1cFdpZGdl dD4gewogICAgICAgIERyaXZlciBkcml2ZXIgPSBHV1QuY3JlYXRlKERyaXZlci5jbGFzcyk7CiAg ICB9CgogICAgaW50ZXJmYWNlIFZpZXdVaUJpbmRlciBleHRlbmRzIFVpQmluZGVyPERpYWxvZ1Rh YlBhbmVsLCBBYnN0cmFjdFZtUG9wdXBXaWRnZXQ+IHsKICAgICAgICBWaWV3VWlCaW5kZXIgdWlC aW5kZXIgPSBHV1QuY3JlYXRlKFZpZXdVaUJpbmRlci5jbGFzcyk7CiAgICB9CgogICAgcHJvdGVj dGVkIGludGVyZmFjZSBTdHlsZSBleHRlbmRzIENzc1Jlc291cmNlIHsKICAgICAgICBTdHJpbmcg bG9uZ0NoZWNrYm94Q29udGVudCgpOwoKICAgICAgICBTdHJpbmcgcHJvdmlzaW9uaW5nRWRpdG9y Q29udGVudCgpOwoKICAgICAgICBTdHJpbmcgcHJvdmlzaW9uaW5nUmFkaW9Db250ZW50KCk7Cgog ICAgICAgIFN0cmluZyBjZEF0dGFjaGVkTGFiZWxXaWR0aCgpOwoKICAgICAgICBTdHJpbmcgYXNz aWduZWRWbXNMYWJlbCgpOwoKICAgICAgICBTdHJpbmcgbGFiZWxEaXNhYmxlZCgpOwogICAgfQoK ICAgIGludGVyZmFjZSBQcmVzdGFydGVkVm1zQ29udGV4dEhlbHAgZXh0ZW5kcyBTYWZlSHRtbFRl bXBsYXRlcyB7CiAgICAgICAgQFRlbXBsYXRlKCI8aT57MH08L2k+IikKICAgICAgICBTYWZlSHRt bCBpdGFsaWNUZXh0Q29udGFpbmVyKFN0cmluZyB0ZXh0KTsKICAgIH0KCiAgICBwcml2YXRlIHN0 YXRpYyBQcmVzdGFydGVkVm1zQ29udGV4dEhlbHAgcHJlc3RhcnRlZFZtc0NvbnRleHRIZWxwOwoK ICAgIEBVaUZpZWxkCiAgICBwcm90ZWN0ZWQgU3R5bGUgc3R5bGU7CgogICAgLy8gPT1HZW5lcmFs IFRhYj09CiAgICBAVWlGaWVsZAogICAgcHJvdGVjdGVkIERpYWxvZ1RhYiBnZW5lcmFsVGFiOwoK ICAgIEBVaUZpZWxkKHByb3ZpZGVkID0gdHJ1ZSkKICAgIEBQYXRoKHZhbHVlID0gImRhdGFDZW50 ZXIuc2VsZWN0ZWRJdGVtIikKICAgIEBXaXRoRWxlbWVudElkKCJkYXRhQ2VudGVyIikKICAgIHB1 YmxpYyBMaXN0TW9kZWxMaXN0Qm94RWRpdG9yPE9iamVjdD4gZGF0YUNlbnRlckVkaXRvcjsKCiAg ICBAVWlGaWVsZChwcm92aWRlZCA9IHRydWUpCiAgICBAUGF0aCh2YWx1ZSA9ICJjbHVzdGVyLnNl bGVjdGVkSXRlbSIpCiAgICBAV2l0aEVsZW1lbnRJZCgiY2x1c3RlciIpCiAgICBwdWJsaWMgTGlz dE1vZGVsTGlzdEJveEVkaXRvcjxPYmplY3Q+IGNsdXN0ZXJFZGl0b3I7CgogICAgQFVpRmllbGQo cHJvdmlkZWQgPSB0cnVlKQogICAgQFBhdGgodmFsdWUgPSAicXVvdGEuc2VsZWN0ZWRJdGVtIikK ICAgIEBXaXRoRWxlbWVudElkKCJxdW90YSIpCiAgICBwdWJsaWMgTGlzdE1vZGVsTGlzdEJveEVk aXRvcjxPYmplY3Q+IHF1b3RhRWRpdG9yOwoKICAgIEBVaUZpZWxkCiAgICBAUGF0aCh2YWx1ZSA9 ICJuYW1lLmVudGl0eSIpCiAgICBAV2l0aEVsZW1lbnRJZCgibmFtZSIpCiAgICBwdWJsaWMgRW50 aXR5TW9kZWxUZXh0Qm94RWRpdG9yIG5hbWVFZGl0b3I7CgogICAgQFVpRmllbGQKICAgIEBQYXRo KHZhbHVlID0gImRlc2NyaXB0aW9uLmVudGl0eSIpCiAgICBAV2l0aEVsZW1lbnRJZCgiZGVzY3Jp cHRpb24iKQogICAgcHVibGljIEVudGl0eU1vZGVsVGV4dEJveEVkaXRvciBkZXNjcmlwdGlvbkVk aXRvcjsKCiAgICBAVWlGaWVsZChwcm92aWRlZCA9IHRydWUpCiAgICBAUGF0aCh2YWx1ZSA9ICJ0 ZW1wbGF0ZS5zZWxlY3RlZEl0ZW0iKQogICAgQFdpdGhFbGVtZW50SWQoInRlbXBsYXRlIikKICAg IHB1YmxpYyBMaXN0TW9kZWxMaXN0Qm94RWRpdG9yPE9iamVjdD4gdGVtcGxhdGVFZGl0b3I7Cgog ICAgQFVpRmllbGQocHJvdmlkZWQgPSB0cnVlKQogICAgQFBhdGgodmFsdWUgPSAibWVtU2l6ZS5l bnRpdHkiKQogICAgQFdpdGhFbGVtZW50SWQoIm1lbVNpemUiKQogICAgcHVibGljIEVudGl0eU1v ZGVsVGV4dEJveEVkaXRvciBtZW1TaXplRWRpdG9yOwoKICAgIEBVaUZpZWxkCiAgICBASWdub3Jl CiAgICBIVE1MIGNwdVBpbm5pbmdMYWJlbDsKCiAgICBAVWlGaWVsZAogICAgQFBhdGgodmFsdWUg PSAidG90YWxDUFVDb3Jlcy5lbnRpdHkiKQogICAgQFdpdGhFbGVtZW50SWQoInRvdGFsQ1BVQ29y ZXMiKQogICAgcHVibGljIEVudGl0eU1vZGVsVGV4dEJveEVkaXRvciB0b3RhbHZDUFVzRWRpdG9y OwoKICAgIEBVaUZpZWxkCiAgICBAUGF0aCh2YWx1ZSA9ICJudW1PZlNvY2tldHMuc2VsZWN0ZWRJ dGVtIikKICAgIEBXaXRoRWxlbWVudElkKCJudW1PZlNvY2tldHMiKQogICAgcHVibGljIExpc3RN b2RlbExpc3RCb3hFZGl0b3I8T2JqZWN0PiBudW1PZlNvY2tldHNFZGl0b3I7CgogICAgQFVpRmll bGQKICAgIEBQYXRoKHZhbHVlID0gImNvcmVzUGVyU29ja2V0LnNlbGVjdGVkSXRlbSIpCiAgICBA V2l0aEVsZW1lbnRJZCgiY29yZXNQZXJTb2NrZXQiKQogICAgcHVibGljIExpc3RNb2RlbExpc3RC b3hFZGl0b3I8T2JqZWN0PiBjb3JlUGVyU29ja2V0RWRpdG9yOwoKICAgIEBVaUZpZWxkKHByb3Zp ZGVkID0gdHJ1ZSkKICAgIEBQYXRoKHZhbHVlID0gIm9TVHlwZS5zZWxlY3RlZEl0ZW0iKQogICAg QFdpdGhFbGVtZW50SWQoIm9zVHlwZSIpCiAgICBwdWJsaWMgTGlzdE1vZGVsTGlzdEJveEVkaXRv cjxPYmplY3Q+IG9TVHlwZUVkaXRvcjsKCiAgICBAVWlGaWVsZChwcm92aWRlZCA9IHRydWUpCiAg ICBAUGF0aCh2YWx1ZSA9ICJpc0RlbGV0ZVByb3RlY3RlZC5lbnRpdHkiKQogICAgQFdpdGhFbGVt ZW50SWQoImlzRGVsZXRlUHJvdGVjdGVkIikKICAgIHB1YmxpYyBFbnRpdHlNb2RlbENoZWNrQm94 RWRpdG9yIGlzRGVsZXRlUHJvdGVjdGVkRWRpdG9yOwoKICAgIEBVaUZpZWxkCiAgICBASWdub3Jl CiAgICBMYWJlbCBnZW5lcmFsV2FybmluZ01lc3NhZ2U7CgogICAgLy8gPT0gUG9vbHMgPT0KICAg IEBVaUZpZWxkCiAgICBwcm90ZWN0ZWQgRGlhbG9nVGFiIHBvb2xUYWI7CgogICAgQFVpRmllbGQo cHJvdmlkZWQgPSB0cnVlKQogICAgQFBhdGgodmFsdWUgPSAicG9vbFR5cGUuc2VsZWN0ZWRJdGVt IikKICAgIEBXaXRoRWxlbWVudElkKCJwb29sVHlwZSIpCiAgICBwdWJsaWMgTGlzdE1vZGVsTGlz dEJveEVkaXRvcjxPYmplY3Q+IHBvb2xUeXBlRWRpdG9yOwoKICAgIEBVaUZpZWxkKHByb3ZpZGVk ID0gdHJ1ZSkKICAgIEBJZ25vcmUKICAgIHB1YmxpYyBJbmZvSWNvbiBuZXdQb29sUHJlc3RhcnRl ZFZtc0ljb247CgogICAgQFVpRmllbGQocHJvdmlkZWQgPSB0cnVlKQogICAgQElnbm9yZQogICAg cHVibGljIEluZm9JY29uIGVkaXRQb29sUHJlc3RhcnRlZFZtc0ljb247CgogICAgQFVpRmllbGQK ICAgIEBQYXRoKHZhbHVlID0gInByZXN0YXJ0ZWRWbXMuZW50aXR5IikKICAgIEBXaXRoRWxlbWVu dElkKCJwcmVzdGFydGVkVm1zIikKICAgIHB1YmxpYyBFbnRpdHlNb2RlbFRleHRCb3hPbmx5RWRp dG9yIHByZXN0YXJ0ZWRWbXNFZGl0b3I7CgogICAgQFVpRmllbGQKICAgIEBJZ25vcmUKICAgIHB1 YmxpYyBGbG93UGFuZWwgbmV3UG9vbEVkaXRWbXNQYW5lbDsKCiAgICBAVWlGaWVsZAogICAgQEln bm9yZQogICAgcHVibGljIExhYmVsIHByZXN0YXJ0ZWRMYWJlbDsKCiAgICBAVWlGaWVsZChwcm92 aWRlZCA9IHRydWUpCiAgICBAUGF0aCgibnVtT2ZEZXNrdG9wcy5lbnRpdHkiKQogICAgQFdpdGhF bGVtZW50SWQoIm51bU9mVm1zIikKICAgIHB1YmxpYyBFbnRpdHlNb2RlbFRleHRCb3hFZGl0b3Ig bnVtT2ZWbXNFZGl0b3I7CgogICAgQFVpRmllbGQKICAgIEBJZ25vcmUKICAgIHB1YmxpYyBGbG93 UGFuZWwgZWRpdFBvb2xFZGl0Vm1zUGFuZWw7CgogICAgQFVpRmllbGQKICAgIEBJZ25vcmUKICAg IHB1YmxpYyBGbG93UGFuZWwgZWRpdFBvb2xJbmNyYXNlTnVtT2ZWbXNQYW5lbDsKCiAgICBAVWlG aWVsZAogICAgQElnbm9yZQogICAgcHVibGljIExhYmVsIGVkaXRQcmVzdGFydGVkVm1zTGFiZWw7 CgogICAgQFVpRmllbGQKICAgIEBQYXRoKCJwcmVzdGFydGVkVm1zLmVudGl0eSIpCiAgICBAV2l0 aEVsZW1lbnRJZCgiZWRpdFByZXN0YXJ0ZWRWbXMiKQogICAgcHVibGljIEVudGl0eU1vZGVsVGV4 dEJveE9ubHlFZGl0b3IgZWRpdFByZXN0YXJ0ZWRWbXNFZGl0b3I7CgogICAgQFVpRmllbGQocHJv dmlkZWQgPSB0cnVlKQogICAgQFBhdGgoIm51bU9mRGVza3RvcHMuZW50aXR5IikKICAgIEBXaXRo RWxlbWVudElkKCJpbmNyYXNlTnVtT2ZWbXMiKQogICAgcHVibGljIEVudGl0eU1vZGVsVGV4dEJv eE9ubHlFZGl0b3IgaW5jcmFzZU51bU9mVm1zRWRpdG9yOwoKICAgIEBVaUZpZWxkKHByb3ZpZGVk ID0gdHJ1ZSkKICAgIEBQYXRoKCJhc3NpZ25lZFZtcy5lbnRpdHkiKQogICAgcHVibGljIFZhbHVl TGFiZWw8T2JqZWN0PiBvdXRPZnhJblBvb2w7CgogICAgLy8gPT1Jbml0aWFsIHJ1biBUYWI9PQog ICAgQFVpRmllbGQKICAgIHByb3RlY3RlZCBEaWFsb2dUYWIgaW5pdGlhbFJ1blRhYjsKCiAgICBA VWlGaWVsZChwcm92aWRlZCA9IHRydWUpCiAgICBAUGF0aCh2YWx1ZSA9ICJkb21haW4uc2VsZWN0 ZWRJdGVtIikKICAgIEBXaXRoRWxlbWVudElkKCJkb21haW4iKQogICAgcHVibGljIExpc3RNb2Rl bExpc3RCb3hFZGl0b3I8T2JqZWN0PiBkb21haW5FZGl0b3I7CgogICAgQFVpRmllbGQocHJvdmlk ZWQgPSB0cnVlKQogICAgQFBhdGgodmFsdWUgPSAidGltZVpvbmUuc2VsZWN0ZWRJdGVtIikKICAg IEBXaXRoRWxlbWVudElkKCJ0aW1lWm9uZSIpCiAgICBwdWJsaWMgTGlzdE1vZGVsTGlzdEJveEVk aXRvcjxPYmplY3Q+IHRpbWVab25lRWRpdG9yOwoKICAgIC8vID09Q29uc29sZSBUYWI9PQogICAg QFVpRmllbGQKICAgIHByb3RlY3RlZCBEaWFsb2dUYWIgY29uc29sZVRhYjsKCiAgICBAVWlGaWVs ZChwcm92aWRlZCA9IHRydWUpCiAgICBAUGF0aCh2YWx1ZSA9ICJkaXNwbGF5UHJvdG9jb2wuc2Vs ZWN0ZWRJdGVtIikKICAgIEBXaXRoRWxlbWVudElkKCJkaXNwbGF5UHJvdG9jb2wiKQogICAgcHVi bGljIExpc3RNb2RlbExpc3RCb3hFZGl0b3I8T2JqZWN0PiBkaXNwbGF5UHJvdG9jb2xFZGl0b3I7 CgogICAgQFVpRmllbGQocHJvdmlkZWQgPSB0cnVlKQogICAgQFBhdGgodmFsdWUgPSAidXNiUG9s aWN5LnNlbGVjdGVkSXRlbSIpCiAgICBAV2l0aEVsZW1lbnRJZCgidXNiUG9saWN5IikKICAgIHB1 YmxpYyBMaXN0TW9kZWxMaXN0Qm94RWRpdG9yPE9iamVjdD4gdXNiU3VwcG9ydEVkaXRvcjsKCiAg ICBAVWlGaWVsZChwcm92aWRlZCA9IHRydWUpCiAgICBAUGF0aCh2YWx1ZSA9ICJudW1PZk1vbml0 b3JzLnNlbGVjdGVkSXRlbSIpCiAgICBAV2l0aEVsZW1lbnRJZCgibnVtT2ZNb25pdG9ycyIpCiAg ICBwdWJsaWMgTGlzdE1vZGVsTGlzdEJveEVkaXRvcjxPYmplY3Q+IG51bU9mTW9uaXRvcnNFZGl0 b3I7CgogICAgQFVpRmllbGQocHJvdmlkZWQgPSB0cnVlKQogICAgQFBhdGgodmFsdWUgPSAiaXNT dGF0ZWxlc3MuZW50aXR5IikKICAgIEBXaXRoRWxlbWVudElkKCJpc1N0YXRlbGVzcyIpCiAgICBw dWJsaWMgRW50aXR5TW9kZWxDaGVja0JveEVkaXRvciBpc1N0YXRlbGVzc0VkaXRvcjsKCiAgICBA VWlGaWVsZChwcm92aWRlZCA9IHRydWUpCiAgICBAUGF0aCh2YWx1ZSA9ICJpc1NtYXJ0Y2FyZEVu YWJsZWQuZW50aXR5IikKICAgIEBXaXRoRWxlbWVudElkKCJpc1NtYXJ0Y2FyZEVuYWJsZWQiKQog ICAgcHVibGljIEVudGl0eU1vZGVsQ2hlY2tCb3hFZGl0b3IgaXNTbWFydGNhcmRFbmFibGVkRWRp dG9yOwoKICAgIEBVaUZpZWxkKHByb3ZpZGVkID0gdHJ1ZSkKICAgIEBQYXRoKHZhbHVlID0gImFs bG93Q29uc29sZVJlY29ubmVjdC5lbnRpdHkiKQogICAgQFdpdGhFbGVtZW50SWQoImFsbG93Q29u c29sZVJlY29ubmVjdCIpCiAgICBwdWJsaWMgRW50aXR5TW9kZWxDaGVja0JveEVkaXRvciBhbGxv d0NvbnNvbGVSZWNvbm5lY3RFZGl0b3I7CgogICAgLy8gPT1Ib3N0IFRhYj09CiAgICBAVWlGaWVs ZAogICAgcHJvdGVjdGVkIERpYWxvZ1RhYiBob3N0VGFiOwoKICAgIEBVaUZpZWxkKHByb3ZpZGVk ID0gdHJ1ZSkKICAgIEBQYXRoKHZhbHVlID0gInJ1blZNT25TcGVjaWZpY0hvc3QuZW50aXR5IikK ICAgIEBXaXRoRWxlbWVudElkKCJydW5WTU9uU3BlY2lmaWNIb3N0IikKICAgIHB1YmxpYyBFbnRp dHlNb2RlbENoZWNrQm94RWRpdG9yIHJ1blZNT25TcGVjaWZpY0hvc3RFZGl0b3I7CgogICAgQFVp RmllbGQocHJvdmlkZWQgPSB0cnVlKQogICAgQFBhdGgodmFsdWUgPSAiaG9zdENwdS5lbnRpdHki KQogICAgQFdpdGhFbGVtZW50SWQoImhvc3RDcHUiKQogICAgcHVibGljIEVudGl0eU1vZGVsQ2hl Y2tCb3hFZGl0b3IgaG9zdENwdUVkaXRvcjsKCiAgICBAVWlGaWVsZChwcm92aWRlZCA9IHRydWUp CiAgICBAUGF0aCh2YWx1ZSA9ICJkb250TWlncmF0ZVZNLmVudGl0eSIpCiAgICBAV2l0aEVsZW1l bnRJZCgiZG9udE1pZ3JhdGVWTSIpCiAgICBwdWJsaWMgRW50aXR5TW9kZWxDaGVja0JveEVkaXRv ciBkb250TWlncmF0ZVZNRWRpdG9yOwoKICAgIEBVaUZpZWxkKHByb3ZpZGVkID0gdHJ1ZSkKICAg IEBJZ25vcmUKICAgIEBXaXRoRWxlbWVudElkKCJzcGVjaWZpY0hvc3QiKQogICAgcHVibGljIFJh ZGlvQnV0dG9uIHNwZWNpZmljSG9zdDsKCiAgICBAVWlGaWVsZAogICAgQElnbm9yZQogICAgcHVi bGljIExhYmVsIHNwZWNpZmljSG9zdExhYmVsOwoKICAgIEBVaUZpZWxkKHByb3ZpZGVkID0gdHJ1 ZSkKICAgIEBQYXRoKHZhbHVlID0gImRlZmF1bHRIb3N0LnNlbGVjdGVkSXRlbSIpCiAgICBAV2l0 aEVsZW1lbnRJZCgiZGVmYXVsdEhvc3QiKQogICAgcHVibGljIExpc3RNb2RlbExpc3RCb3hFZGl0 b3I8T2JqZWN0PiBkZWZhdWx0SG9zdEVkaXRvcjsKCiAgICBAVWlGaWVsZChwcm92aWRlZCA9IHRy dWUpCiAgICBAUGF0aCh2YWx1ZSA9ICJpc0F1dG9Bc3NpZ24uZW50aXR5IikKICAgIEBXaXRoRWxl bWVudElkKCJpc0F1dG9Bc3NpZ24iKQogICAgcHVibGljIEVudGl0eU1vZGVsUmFkaW9CdXR0b25F ZGl0b3IgaXNBdXRvQXNzaWduRWRpdG9yOwoKICAgIEBVaUZpZWxkKHByb3ZpZGVkID0gdHJ1ZSkK ICAgIEBQYXRoKHZhbHVlID0gInJ1blZNT25UcnVzdGVkSG9zdC5lbnRpdHkiKQogICAgQFdpdGhF bGVtZW50SWQoInJ1blZNT25UcnVzdGVkSG9zdCIpCiAgICBwdWJsaWMgRW50aXR5TW9kZWxSYWRp b0J1dHRvbkVkaXRvciBydW5WTU9uVHJ1c3RlZEhvc3RFZGl0b3I7CgogICAgQFVpRmllbGQKICAg IEBQYXRoKHZhbHVlID0gImNwdVBpbm5pbmcuZW50aXR5IikKICAgIEBXaXRoRWxlbWVudElkKCJj cHVQaW5uaW5nIikKICAgIHB1YmxpYyBFbnRpdHlNb2RlbFRleHRCb3hFZGl0b3IgY3B1UGlubmlu ZzsKCiAgICAvLyA9PUhpZ2ggQXZhaWxhYmlsaXR5IFRhYj09CiAgICBAVWlGaWVsZAogICAgcHJv dGVjdGVkIERpYWxvZ1RhYiBoaWdoQXZhaWxhYmlsaXR5VGFiOwoKICAgIEBVaUZpZWxkKHByb3Zp ZGVkID0gdHJ1ZSkKICAgIEBQYXRoKHZhbHVlID0gImlzSGlnaGx5QXZhaWxhYmxlLmVudGl0eSIp CiAgICBAV2l0aEVsZW1lbnRJZCgiaXNIaWdobHlBdmFpbGFibGUiKQogICAgcHVibGljIEVudGl0 eU1vZGVsQ2hlY2tCb3hFZGl0b3IgaXNIaWdobHlBdmFpbGFibGVFZGl0b3I7CgogICAgLy8gVE9E TzogUHJpb3JpdHkgaXMgYSBMaXN0TW9kZWwgd2hpY2ggaXMgcmVuZGVyZWQgYXMgUmFkaW9Cb3gK ICAgIEBVaUZpZWxkKHByb3ZpZGVkID0gdHJ1ZSkKICAgIEBJZ25vcmUKICAgIEBXaXRoRWxlbWVu dElkKCJwcmlvcml0eSIpCiAgICBwdWJsaWMgRW50aXR5TW9kZWxDZWxsVGFibGU8TGlzdE1vZGVs PiBwcmlvcml0eUVkaXRvcjsKCiAgICAvLyA9PVJlc291cmNlIEFsbG9jYXRpb24gVGFiPT0KICAg IEBVaUZpZWxkCiAgICBwcm90ZWN0ZWQgRGlhbG9nVGFiIHJlc291cmNlQWxsb2NhdGlvblRhYjsK CiAgICBAVWlGaWVsZAogICAgcHJvdGVjdGVkIEZsb3dQYW5lbCBzdG9yYWdlQWxsb2NhdGlvblBh bmVsOwoKICAgIEBVaUZpZWxkCiAgICBwcm90ZWN0ZWQgSG9yaXpvbnRhbFBhbmVsIHByb3Zpc2lv blNlbGVjdGlvblBhbmVsOwoKICAgIEBVaUZpZWxkCiAgICBwcm90ZWN0ZWQgRmxvd1BhbmVsIGRp c2tzQWxsb2NhdGlvblBhbmVsOwoKICAgIEBVaUZpZWxkCiAgICBASWdub3JlCiAgICBAV2l0aEVs ZW1lbnRJZCgicHJvdmlzaW9uaW5nIikKICAgIHB1YmxpYyBMaXN0TW9kZWxMaXN0Qm94RWRpdG9y PE9iamVjdD4gcHJvdmlzaW9uaW5nRWRpdG9yOwoKICAgIEBVaUZpZWxkKHByb3ZpZGVkID0gdHJ1 ZSkKICAgIEBQYXRoKHZhbHVlID0gIm1pbkFsbG9jYXRlZE1lbW9yeS5lbnRpdHkiKQogICAgQFdp dGhFbGVtZW50SWQoIm1pbkFsbG9jYXRlZE1lbW9yeSIpCiAgICBwdWJsaWMgRW50aXR5TW9kZWxU ZXh0Qm94RWRpdG9yIG1pbkFsbG9jYXRlZE1lbW9yeUVkaXRvcjsKCiAgICBAVWlGaWVsZChwcm92 aWRlZCA9IHRydWUpCiAgICBAUGF0aCh2YWx1ZSA9ICJwcm92aXNpb25pbmdUaGluX0lzU2VsZWN0 ZWQuZW50aXR5IikKICAgIEBXaXRoRWxlbWVudElkKCJwcm92aXNpb25pbmdUaGluIikKICAgIHB1 YmxpYyBFbnRpdHlNb2RlbFJhZGlvQnV0dG9uRWRpdG9yIHByb3Zpc2lvbmluZ1RoaW5FZGl0b3I7 CgogICAgQFVpRmllbGQocHJvdmlkZWQgPSB0cnVlKQogICAgQFBhdGgodmFsdWUgPSAicHJvdmlz aW9uaW5nQ2xvbmVfSXNTZWxlY3RlZC5lbnRpdHkiKQogICAgQFdpdGhFbGVtZW50SWQoInByb3Zp c2lvbmluZ0Nsb25lIikKICAgIHB1YmxpYyBFbnRpdHlNb2RlbFJhZGlvQnV0dG9uRWRpdG9yIHBy b3Zpc2lvbmluZ0Nsb25lRWRpdG9yOwoKICAgIEBVaUZpZWxkCiAgICBASWdub3JlCiAgICBMYWJl bCBkaXNrc0FsbG9jYXRpb25MYWJlbDsKCiAgICBAVWlGaWVsZChwcm92aWRlZCA9IHRydWUpCiAg ICBASWdub3JlCiAgICBAV2l0aEVsZW1lbnRJZCgiZGlza3NBbGxvY2F0aW9uIikKICAgIHB1Ymxp YyBEaXNrc0FsbG9jYXRpb25WaWV3IGRpc2tzQWxsb2NhdGlvblZpZXc7CgogICAgLy8gPT1Cb290 IE9wdGlvbnMgVGFiPT0KICAgIEBVaUZpZWxkCiAgICBwcm90ZWN0ZWQgRGlhbG9nVGFiIGJvb3RP cHRpb25zVGFiOwoKICAgIEBVaUZpZWxkKHByb3ZpZGVkID0gdHJ1ZSkKICAgIEBQYXRoKHZhbHVl ID0gImZpcnN0Qm9vdERldmljZS5zZWxlY3RlZEl0ZW0iKQogICAgQFdpdGhFbGVtZW50SWQoImZp cnN0Qm9vdERldmljZSIpCiAgICBwdWJsaWMgTGlzdE1vZGVsTGlzdEJveEVkaXRvcjxPYmplY3Q+ IGZpcnN0Qm9vdERldmljZUVkaXRvcjsKCiAgICBAVWlGaWVsZChwcm92aWRlZCA9IHRydWUpCiAg ICBAUGF0aCh2YWx1ZSA9ICJzZWNvbmRCb290RGV2aWNlLnNlbGVjdGVkSXRlbSIpCiAgICBAV2l0 aEVsZW1lbnRJZCgic2Vjb25kQm9vdERldmljZSIpCiAgICBwdWJsaWMgTGlzdE1vZGVsTGlzdEJv eEVkaXRvcjxPYmplY3Q+IHNlY29uZEJvb3REZXZpY2VFZGl0b3I7CgogICAgQFVpRmllbGQocHJv dmlkZWQgPSB0cnVlKQogICAgQFBhdGgodmFsdWUgPSAiY2RJbWFnZS5zZWxlY3RlZEl0ZW0iKQog ICAgQFdpdGhFbGVtZW50SWQoImNkSW1hZ2UiKQogICAgcHVibGljIExpc3RNb2RlbExpc3RCb3hF ZGl0b3I8T2JqZWN0PiBjZEltYWdlRWRpdG9yOwoKICAgIEBVaUZpZWxkKHByb3ZpZGVkID0gdHJ1 ZSkKICAgIEBQYXRoKHZhbHVlID0gImNkQXR0YWNoZWQuZW50aXR5IikKICAgIEBXaXRoRWxlbWVu dElkKCJjZEF0dGFjaGVkIikKICAgIHB1YmxpYyBFbnRpdHlNb2RlbENoZWNrQm94RWRpdG9yIGNk QXR0YWNoZWRFZGl0b3I7CgogICAgQFVpRmllbGQKICAgIHByb3RlY3RlZCBGbG93UGFuZWwgbGlu dXhCb290T3B0aW9uc1BhbmVsOwoKICAgIEBVaUZpZWxkCiAgICBAUGF0aCh2YWx1ZSA9ICJrZXJu ZWxfcGF0aC5lbnRpdHkiKQogICAgQFdpdGhFbGVtZW50SWQoImtlcm5lbFBhdGgiKQogICAgcHVi bGljIEVudGl0eU1vZGVsVGV4dEJveEVkaXRvciBrZXJuZWxfcGF0aEVkaXRvcjsKCiAgICBAVWlG aWVsZAogICAgQFBhdGgodmFsdWUgPSAiaW5pdHJkX3BhdGguZW50aXR5IikKICAgIEBXaXRoRWxl bWVudElkKCJpbml0cmRQYXRoIikKICAgIHB1YmxpYyBFbnRpdHlNb2RlbFRleHRCb3hFZGl0b3Ig aW5pdHJkX3BhdGhFZGl0b3I7CgogICAgQFVpRmllbGQKICAgIEBQYXRoKHZhbHVlID0gImtlcm5l bF9wYXJhbWV0ZXJzLmVudGl0eSIpCiAgICBAV2l0aEVsZW1lbnRJZCgia2VybmVsUGFyYW1ldGVy cyIpCiAgICBwdWJsaWMgRW50aXR5TW9kZWxUZXh0Qm94RWRpdG9yIGtlcm5lbF9wYXJhbWV0ZXJz RWRpdG9yOwoKICAgIEBVaUZpZWxkCiAgICBASWdub3JlCiAgICBMYWJlbCBuYXRpdmVVc2JXYXJu aW5nTWVzc2FnZTsKCiAgICAvLyA9PUN1c3RvbSBQcm9wZXJ0aWVzIFRhYj09CiAgICBAVWlGaWVs ZAogICAgcHJvdGVjdGVkIERpYWxvZ1RhYiBjdXN0b21Qcm9wZXJ0aWVzVGFiOwoKICAgIEBVaUZp ZWxkCiAgICBASWdub3JlCiAgICBwcm90ZWN0ZWQgS2V5VmFsdWVXaWRnZXQgY3VzdG9tUHJvcGVy dGllc1NoZWV0RWRpdG9yOwoKICAgIENvbW1vbkFwcGxpY2F0aW9uQ29uc3RhbnRzIGNvbnN0YW50 czsKICAgIENvbW1vbkFwcGxpY2F0aW9uTWVzc2FnZXMgbWVzc2FnZXM7CgogICAgQFVpRmllbGQK ICAgIEBJZ25vcmUKICAgIHByb3RlY3RlZCBBZHZhbmNlZFBhcmFtZXRlcnNFeHBhbmRlciBleHBh bmRlcjsKCiAgICBAVWlGaWVsZAogICAgQElnbm9yZQogICAgUGFuZWwgZXhwYW5kZXJDb250ZW50 OwoKICAgIEBVaUZpZWxkCiAgICBASWdub3JlCiAgICBBZHZhbmNlZFBhcmFtZXRlcnNFeHBhbmRl ciBnZW5lcmFsQWR2YW5jZWRQYXJhbWV0ZXJFeHBhbmRlcjsKCiAgICBAVWlGaWVsZAogICAgQEln bm9yZQogICAgUGFuZWwgZ2VuZXJhbEFkdmFuY2VkUGFyYW1ldGVyRXhwYW5kZXJDb250ZW50OwoK ICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInVuY2hlY2tlZCIsICJyYXd0eXBlcyIgfSkKICAgIHB1 YmxpYyBBYnN0cmFjdFZtUG9wdXBXaWRnZXQoQ29tbW9uQXBwbGljYXRpb25Db25zdGFudHMgY29u c3RhbnRzLAogICAgICAgICAgICBDb21tb25BcHBsaWNhdGlvblJlc291cmNlcyByZXNvdXJjZXMs CiAgICAgICAgICAgIGZpbmFsIENvbW1vbkFwcGxpY2F0aW9uTWVzc2FnZXMgbWVzc2FnZXMpIHsK ICAgICAgICB0aGlzLmNvbnN0YW50cyA9IGNvbnN0YW50czsKICAgICAgICB0aGlzLm1lc3NhZ2Vz ID0gbWVzc2FnZXM7CgogICAgICAgIGluaXRMaXN0Qm94RWRpdG9ycygpOwogICAgICAgIC8vIENv bnRhaW5zIGEgc3BlY2lhbCBwYXJzZXIvcmVuZGVyZXIKICAgICAgICBtZW1TaXplRWRpdG9yID0g bmV3IEVudGl0eU1vZGVsVGV4dEJveEVkaXRvcigKICAgICAgICAgICAgICAgIG5ldyBNZW1vcnlT aXplUmVuZGVyZXIoY29uc3RhbnRzKSwgbmV3IE1lbW9yeVNpemVQYXJzZXIoKSk7CiAgICAgICAg bWluQWxsb2NhdGVkTWVtb3J5RWRpdG9yID0gbmV3IEVudGl0eU1vZGVsVGV4dEJveEVkaXRvcigK ICAgICAgICAgICAgICAgIG5ldyBNZW1vcnlTaXplUmVuZGVyZXIoY29uc3RhbnRzKSwgbmV3IE1l bW9yeVNpemVQYXJzZXIoKSk7CgogICAgICAgIC8vIFRPRE86IEhvdyB0byBhbGlnbiByaWdodCB3 aXRob3V0IGNyZWF0aW5nIHRoZSB3aWRnZXQgbWFudWFsbHk/CiAgICAgICAgcnVuVk1PblNwZWNp ZmljSG9zdEVkaXRvciA9IG5ldyBFbnRpdHlNb2RlbENoZWNrQm94RWRpdG9yKEFsaWduLlJJR0hU KTsKICAgICAgICBob3N0Q3B1RWRpdG9yID0gbmV3IEVudGl0eU1vZGVsQ2hlY2tCb3hFZGl0b3Io QWxpZ24uUklHSFQpOwogICAgICAgIGRvbnRNaWdyYXRlVk1FZGl0b3IgPSBuZXcgRW50aXR5TW9k ZWxDaGVja0JveEVkaXRvcihBbGlnbi5SSUdIVCk7CiAgICAgICAgaXNIaWdobHlBdmFpbGFibGVF ZGl0b3IgPSBuZXcgRW50aXR5TW9kZWxDaGVja0JveEVkaXRvcihBbGlnbi5SSUdIVCk7CiAgICAg ICAgaXNTdGF0ZWxlc3NFZGl0b3IgPSBuZXcgRW50aXR5TW9kZWxDaGVja0JveEVkaXRvcihBbGln bi5SSUdIVCk7CiAgICAgICAgaXNEZWxldGVQcm90ZWN0ZWRFZGl0b3IgPSBuZXcgRW50aXR5TW9k ZWxDaGVja0JveEVkaXRvcihBbGlnbi5SSUdIVCk7CiAgICAgICAgaXNTbWFydGNhcmRFbmFibGVk RWRpdG9yID0gbmV3IEVudGl0eU1vZGVsQ2hlY2tCb3hFZGl0b3IoQWxpZ24uUklHSFQpOwogICAg ICAgIGNkQXR0YWNoZWRFZGl0b3IgPSBuZXcgRW50aXR5TW9kZWxDaGVja0JveEVkaXRvcihBbGln bi5MRUZUKTsKICAgICAgICBhbGxvd0NvbnNvbGVSZWNvbm5lY3RFZGl0b3IgPSBuZXcgRW50aXR5 TW9kZWxDaGVja0JveEVkaXRvcihBbGlnbi5SSUdIVCk7CgogICAgICAgIHByaW9yaXR5RWRpdG9y ID0gbmV3IEVudGl0eU1vZGVsQ2VsbFRhYmxlPExpc3RNb2RlbD4oCiAgICAgICAgICAgICAgICAo UmVzb3VyY2VzKSBHV1QuY3JlYXRlKEJ1dHRvbkNlbGxUYWJsZVJlc291cmNlcy5jbGFzcykpOwog ICAgICAgIGRpc2tzQWxsb2NhdGlvblZpZXcgPSBuZXcgRGlza3NBbGxvY2F0aW9uVmlldyhjb25z dGFudHMpOwoKICAgICAgICBpZiAocHJlc3RhcnRlZFZtc0NvbnRleHRIZWxwID09IG51bGwpIHsK ICAgICAgICAgICAgcHJlc3RhcnRlZFZtc0NvbnRleHRIZWxwID0gR1dULmNyZWF0ZShQcmVzdGFy dGVkVm1zQ29udGV4dEhlbHAuY2xhc3MpOwogICAgICAgIH0KCiAgICAgICAgaW5pdFBvb2xTcGVj aWZpY1dpZGdldHMocmVzb3VyY2VzLCBtZXNzYWdlcyk7CgogICAgICAgIGluaXRXaWRnZXQoVmll d1VpQmluZGVyLnVpQmluZGVyLmNyZWF0ZUFuZEJpbmRVaSh0aGlzKSk7CgogICAgICAgIGV4cGFu ZGVyLmluaXRXaXRoQ29udGVudChleHBhbmRlckNvbnRlbnQuZ2V0RWxlbWVudCgpKTsKICAgICAg ICBnZW5lcmFsQWR2YW5jZWRQYXJhbWV0ZXJFeHBhbmRlci5pbml0V2l0aENvbnRlbnQoZ2VuZXJh bEFkdmFuY2VkUGFyYW1ldGVyRXhwYW5kZXJDb250ZW50LmdldEVsZW1lbnQoKSk7CiAgICAgICAg ZWRpdFByZXN0YXJ0ZWRWbXNFZGl0b3Iuc2V0S2VlcFRpdGxlT25TZXRFbmFibGVkKHRydWUpOwoK ICAgICAgICBhcHBseVN0eWxlcygpOwoKICAgICAgICBwb29sVGFiLnNldFZpc2libGUoZmFsc2Up OwoKICAgICAgICBsb2NhbGl6ZShjb25zdGFudHMpOwoKICAgICAgICBnZW5lcmF0ZUlkcygpOwoK ICAgICAgICBoaWRlUG9vbFNwZWNpZmljRmllbGRzKCk7CgogICAgICAgIHByaW9yaXR5RWRpdG9y LmFkZEVudGl0eU1vZGVsQ29sdW1uKG5ldyBUZXh0Q29sdW1uV2l0aFRvb2x0aXA8RW50aXR5TW9k ZWw+KCkgewogICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgcHVibGljIFN0cmluZyBn ZXRWYWx1ZShFbnRpdHlNb2RlbCBtb2RlbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG1vZGVs LmdldFRpdGxlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LCAiIik7IC8vJE5PTi1OTFMtMSQK CiAgICAgICAgRHJpdmVyLmRyaXZlci5pbml0aWFsaXplKHRoaXMpOwogICAgfQoKICAgIHByb3Rl Y3RlZCB2b2lkIGluaXRQb29sU3BlY2lmaWNXaWRnZXRzKENvbW1vbkFwcGxpY2F0aW9uUmVzb3Vy Y2VzIHJlc291cmNlcywKICAgICAgICAgICAgZmluYWwgQ29tbW9uQXBwbGljYXRpb25NZXNzYWdl cyBtZXNzYWdlcykgewogICAgICAgIGNyZWF0ZU51bU9mRGVza3RvcEVkaXRvcnMoKTsKCiAgICAg ICAgaW5jcmFzZU51bU9mVm1zRWRpdG9yLnNldEtlZXBUaXRsZU9uU2V0RW5hYmxlZCh0cnVlKTsK ICAgICAgICBudW1PZlZtc0VkaXRvci5zZXRLZWVwVGl0bGVPblNldEVuYWJsZWQodHJ1ZSk7Cgog ICAgICAgIG5ld1Bvb2xQcmVzdGFydGVkVm1zSWNvbiA9CiAgICAgICAgICAgICAgICBuZXcgSW5m b0ljb24ocHJlc3RhcnRlZFZtc0NvbnRleHRIZWxwLml0YWxpY1RleHRDb250YWluZXIobWVzc2Fn ZXMucHJlc3RhcnRlZEhlbHAoKSksIHJlc291cmNlcyk7IC8vJE5PTi1OTFMtMSQKCiAgICAgICAg ZWRpdFBvb2xQcmVzdGFydGVkVm1zSWNvbiA9CiAgICAgICAgICAgICAgICBuZXcgSW5mb0ljb24o cHJlc3RhcnRlZFZtc0NvbnRleHRIZWxwLml0YWxpY1RleHRDb250YWluZXIobWVzc2FnZXMucHJl c3RhcnRlZEhlbHAoKSksIHJlc291cmNlcyk7IC8vJE5PTi1OTFMtMSQKCiAgICAgICAgb3V0T2Z4 SW5Qb29sID0gbmV3IFZhbHVlTGFiZWw8T2JqZWN0PihuZXcgQWJzdHJhY3RSZW5kZXJlcjxPYmpl Y3Q+KCkgewoKICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcg cmVuZGVyKE9iamVjdCBvYmplY3QpIHsKICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlcy5v dXRPZlhWTXNJblBvb2wob2JqZWN0LnRvU3RyaW5nKCkpOwogICAgICAgICAgICB9CgogICAgICAg IH0pOwogICAgfQoKICAgIC8qKgogICAgICogVGhlcmUgYXJlIHR3byBlZGl0b3JzIHdoaWNoIGVk aXRzIHRoZSBzYW1lIGVudGl0eSAtIGluIHRoZSBjb3JyZWN0IHN1YmNsYXNzIG1ha2Ugc3VyZSB0 aGF0IHRoZSBjb3JyZWN0IG9uZSdzCiAgICAgKiB2YWx1ZSBpcyB1c2VkIHRvIGVkaXQgdGhlIG1v ZGVsCiAgICAgKiA8cD4KICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGp1c3QgY3Jl YXRlcyB0aGUgc2ltcGxlIGVkaXRvcnMKICAgICAqLwogICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRl TnVtT2ZEZXNrdG9wRWRpdG9ycygpIHsKICAgICAgICBpbmNyYXNlTnVtT2ZWbXNFZGl0b3IgPSBu ZXcgRW50aXR5TW9kZWxUZXh0Qm94T25seUVkaXRvcigpOwogICAgICAgIG51bU9mVm1zRWRpdG9y ID0gbmV3IEVudGl0eU1vZGVsVGV4dEJveEVkaXRvcigpOwogICAgfQoKICAgIHByaXZhdGUgdm9p ZCBoaWRlUG9vbFNwZWNpZmljRmllbGRzKCkgewogICAgICAgIG51bU9mVm1zRWRpdG9yLnNldFZp c2libGUoZmFsc2UpOwogICAgICAgIG5ld1Bvb2xFZGl0Vm1zUGFuZWwuc2V0VmlzaWJsZShmYWxz ZSk7CiAgICAgICAgZWRpdFBvb2xFZGl0Vm1zUGFuZWwuc2V0VmlzaWJsZShmYWxzZSk7CiAgICAg ICAgZWRpdFBvb2xJbmNyYXNlTnVtT2ZWbXNQYW5lbC5zZXRWaXNpYmxlKGZhbHNlKTsKICAgIH0K CiAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBnZW5lcmF0ZUlkcygpOwoKICAgIEBTdXBwcmVz c1dhcm5pbmdzKHsgInJhd3R5cGVzIiwgInVuY2hlY2tlZCIgfSkKICAgIHByaXZhdGUgdm9pZCBp bml0TGlzdEJveEVkaXRvcnMoKSB7CiAgICAgICAgLy8gR2VuZXJhbCB0YWIKICAgICAgICBkYXRh Q2VudGVyRWRpdG9yID0gbmV3IExpc3RNb2RlbExpc3RCb3hFZGl0b3I8T2JqZWN0PihuZXcgTnVs bFNhZmVSZW5kZXJlcjxPYmplY3Q+KCkgewogICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAg ICAgcHVibGljIFN0cmluZyByZW5kZXJOdWxsU2FmZShPYmplY3Qgb2JqZWN0KSB7CiAgICAgICAg ICAgICAgICByZXR1cm4gKChzdG9yYWdlX3Bvb2wpIG9iamVjdCkuZ2V0bmFtZSgpOwogICAgICAg ICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIGNsdXN0ZXJFZGl0b3IgPSBuZXcgTGlzdE1vZGVs TGlzdEJveEVkaXRvcjxPYmplY3Q+KG5ldyBOdWxsU2FmZVJlbmRlcmVyPE9iamVjdD4oKSB7CiAg ICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHJlbmRlck51bGxT YWZlKE9iamVjdCBvYmplY3QpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoKFZEU0dyb3VwKSBv YmplY3QpLmdldG5hbWUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICBxdW90 YUVkaXRvciA9IG5ldyBMaXN0TW9kZWxMaXN0Qm94RWRpdG9yPE9iamVjdD4obmV3IE51bGxTYWZl UmVuZGVyZXI8T2JqZWN0PigpIHsKICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgIHB1 YmxpYyBTdHJpbmcgcmVuZGVyTnVsbFNhZmUoT2JqZWN0IG9iamVjdCkgewogICAgICAgICAgICAg ICAgcmV0dXJuICgoUXVvdGEpIG9iamVjdCkuZ2V0UXVvdGFOYW1lKCk7CiAgICAgICAgICAgIH0K ICAgICAgICB9KTsKCiAgICAgICAgdGVtcGxhdGVFZGl0b3IgPSBuZXcgTGlzdE1vZGVsTGlzdEJv eEVkaXRvcjxPYmplY3Q+KG5ldyBOdWxsU2FmZVJlbmRlcmVyPE9iamVjdD4oKSB7CiAgICAgICAg ICAgIEBPdmVycmlkZQogICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHJlbmRlck51bGxTYWZlKE9i amVjdCBvYmplY3QpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoKFZtVGVtcGxhdGUpIG9iamVj dCkuZ2V0bmFtZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIG9TVHlwZUVk aXRvciA9IG5ldyBMaXN0TW9kZWxMaXN0Qm94RWRpdG9yPE9iamVjdD4obmV3IEVudW1SZW5kZXJl cigpKTsKCiAgICAgICAgLy8gUG9vbHMKICAgICAgICBwb29sVHlwZUVkaXRvciA9IG5ldyBMaXN0 TW9kZWxMaXN0Qm94RWRpdG9yPE9iamVjdD4obmV3IE51bGxTYWZlUmVuZGVyZXI8T2JqZWN0Pigp IHsKICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgcmVuZGVy TnVsbFNhZmUoT2JqZWN0IG9iamVjdCkgewogICAgICAgICAgICAgICAgcmV0dXJuICgoRW50aXR5 TW9kZWwpIG9iamVjdCkuZ2V0VGl0bGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAg ICAgICAvLyBXaW5kb3dzIFN5c3ByZXAKICAgICAgICBkb21haW5FZGl0b3IgPSBuZXcgTGlzdE1v ZGVsTGlzdEJveEVkaXRvcjxPYmplY3Q+KG5ldyBOdWxsU2FmZVJlbmRlcmVyPE9iamVjdD4oKSB7 CiAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHJlbmRlck51 bGxTYWZlKE9iamVjdCBvYmplY3QpIHsKICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3QudG9T dHJpbmcoKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICB0aW1lWm9uZUVkaXRv ciA9IG5ldyBMaXN0TW9kZWxMaXN0Qm94RWRpdG9yPE9iamVjdD4obmV3IE51bGxTYWZlUmVuZGVy ZXI8T2JqZWN0PigpIHsKICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgIHB1YmxpYyBT dHJpbmcgcmVuZGVyTnVsbFNhZmUoT2JqZWN0IG9iamVjdCkgewogICAgICAgICAgICAgICAgcmV0 dXJuICgoRW50cnk8U3RyaW5nLCBTdHJpbmc+KSBvYmplY3QpLmdldFZhbHVlKCk7CiAgICAgICAg ICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgLy8gQ29uc29sZSB0YWIKICAgICAgICBkaXNwbGF5 UHJvdG9jb2xFZGl0b3IgPSBuZXcgTGlzdE1vZGVsTGlzdEJveEVkaXRvcjxPYmplY3Q+KG5ldyBO dWxsU2FmZVJlbmRlcmVyPE9iamVjdD4oKSB7CiAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAg ICAgICBwdWJsaWMgU3RyaW5nIHJlbmRlck51bGxTYWZlKE9iamVjdCBvYmplY3QpIHsKICAgICAg ICAgICAgICAgIHJldHVybiAoKEVudGl0eU1vZGVsKSBvYmplY3QpLmdldFRpdGxlKCk7CiAgICAg ICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgdXNiU3VwcG9ydEVkaXRvciA9IG5ldyBMaXN0 TW9kZWxMaXN0Qm94RWRpdG9yPE9iamVjdD4obmV3IEVudW1SZW5kZXJlcigpKTsKICAgICAgICBu dW1PZk1vbml0b3JzRWRpdG9yID0gbmV3IExpc3RNb2RlbExpc3RCb3hFZGl0b3I8T2JqZWN0Pihu ZXcgTnVsbFNhZmVSZW5kZXJlcjxPYmplY3Q+KCkgewogICAgICAgICAgICBAT3ZlcnJpZGUKICAg ICAgICAgICAgcHVibGljIFN0cmluZyByZW5kZXJOdWxsU2FmZShPYmplY3Qgb2JqZWN0KSB7CiAg ICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0LnRvU3RyaW5nKCk7CiAgICAgICAgICAgIH0KICAg ICAgICB9KTsKCiAgICAgICAgLy8gSG9zdCBUYWIKICAgICAgICBzcGVjaWZpY0hvc3QgPSBuZXcg UmFkaW9CdXR0b24oInJ1blZtT25Ib3N0R3JvdXAiKTsgLy8kTk9OLU5MUy0xJAogICAgICAgIGlz QXV0b0Fzc2lnbkVkaXRvciA9IG5ldyBFbnRpdHlNb2RlbFJhZGlvQnV0dG9uRWRpdG9yKCJydW5W bU9uSG9zdEdyb3VwIik7IC8vJE5PTi1OTFMtMSQKICAgICAgICBkZWZhdWx0SG9zdEVkaXRvciA9 IG5ldyBMaXN0TW9kZWxMaXN0Qm94RWRpdG9yPE9iamVjdD4obmV3IE51bGxTYWZlUmVuZGVyZXI8 T2JqZWN0PigpIHsKICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgIHB1YmxpYyBTdHJp bmcgcmVuZGVyTnVsbFNhZmUoT2JqZWN0IG9iamVjdCkgewogICAgICAgICAgICAgICAgcmV0dXJu ICgoVkRTKSBvYmplY3QpLmdldHZkc19uYW1lKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsK ICAgICAgICBydW5WTU9uVHJ1c3RlZEhvc3RFZGl0b3IgPSBuZXcgRW50aXR5TW9kZWxSYWRpb0J1 dHRvbkVkaXRvcigicnVuVm1Pbkhvc3RHcm91cCIpOyAvLyROT04tTkxTLTEkCgogICAgICAgIC8v IFJlc291cmNlIEFsbG9jYXRpb24KICAgICAgICBwcm92aXNpb25pbmdUaGluRWRpdG9yID0gbmV3 IEVudGl0eU1vZGVsUmFkaW9CdXR0b25FZGl0b3IoInByb3Zpc2lvbmluZ0dyb3VwIik7IC8vJE5P Ti1OTFMtMSQKICAgICAgICBwcm92aXNpb25pbmdDbG9uZUVkaXRvciA9IG5ldyBFbnRpdHlNb2Rl bFJhZGlvQnV0dG9uRWRpdG9yKCJwcm92aXNpb25pbmdHcm91cCIpOyAvLyROT04tTkxTLTEkCgog ICAgICAgIC8vIEJvb3QgT3B0aW9ucyBUYWIKICAgICAgICBmaXJzdEJvb3REZXZpY2VFZGl0b3Ig PSBuZXcgTGlzdE1vZGVsTGlzdEJveEVkaXRvcjxPYmplY3Q+KG5ldyBOdWxsU2FmZVJlbmRlcmVy PE9iamVjdD4oKSB7CiAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICBwdWJsaWMgU3Ry aW5nIHJlbmRlck51bGxTYWZlKE9iamVjdCBvYmplY3QpIHsKICAgICAgICAgICAgICAgIHJldHVy biAoKEVudGl0eU1vZGVsKSBvYmplY3QpLmdldFRpdGxlKCk7CiAgICAgICAgICAgIH0KICAgICAg ICB9KTsKCiAgICAgICAgc2Vjb25kQm9vdERldmljZUVkaXRvciA9IG5ldyBMaXN0TW9kZWxMaXN0 Qm94RWRpdG9yPE9iamVjdD4obmV3IE51bGxTYWZlUmVuZGVyZXI8T2JqZWN0PigpIHsKICAgICAg ICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgcmVuZGVyTnVsbFNhZmUo T2JqZWN0IG9iamVjdCkgewogICAgICAgICAgICAgICAgcmV0dXJuICgoRW50aXR5TW9kZWwpIG9i amVjdCkuZ2V0VGl0bGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICBjZElt YWdlRWRpdG9yID0gbmV3IExpc3RNb2RlbExpc3RCb3hFZGl0b3I8T2JqZWN0PihuZXcgTnVsbFNh ZmVSZW5kZXJlcjxPYmplY3Q+KCkgewogICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAg cHVibGljIFN0cmluZyByZW5kZXJOdWxsU2FmZShPYmplY3Qgb2JqZWN0KSB7CiAgICAgICAgICAg ICAgICByZXR1cm4gKFN0cmluZykgb2JqZWN0OwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAg ICB9CgogICAgcHJvdGVjdGVkIHZvaWQgbG9jYWxpemUoQ29tbW9uQXBwbGljYXRpb25Db25zdGFu dHMgY29uc3RhbnRzKSB7CiAgICAgICAgLy8gVGFicwogICAgICAgIGhpZ2hBdmFpbGFiaWxpdHlU YWIuc2V0TGFiZWwoY29uc3RhbnRzLmhpZ2hBdmFpbFZtUG9wdXAoKSk7CiAgICAgICAgcmVzb3Vy Y2VBbGxvY2F0aW9uVGFiLnNldExhYmVsKGNvbnN0YW50cy5yZXNvdXJjZUFsbG9jVm1Qb3B1cCgp KTsKICAgICAgICBib290T3B0aW9uc1RhYi5zZXRMYWJlbChjb25zdGFudHMuYm9vdE9wdGlvbnNW bVBvcHVwKCkpOwogICAgICAgIGN1c3RvbVByb3BlcnRpZXNUYWIuc2V0TGFiZWwoY29uc3RhbnRz LmN1c3RvbVByb3BzVm1Qb3B1cCgpKTsKCiAgICAgICAgLy8gR2VuZXJhbCBUYWIKICAgICAgICBn ZW5lcmFsVGFiLnNldExhYmVsKGNvbnN0YW50cy5HZW5lcmFsVm1Qb3B1cCgpKTsKICAgICAgICBk YXRhQ2VudGVyRWRpdG9yLnNldExhYmVsKGNvbnN0YW50cy5kY1ZtUG9wdXAoKSk7CiAgICAgICAg Y2x1c3RlckVkaXRvci5zZXRMYWJlbChjb25zdGFudHMuaG9zdENsdXN0ZXJWbVBvcHVwKCkpOwog ICAgICAgIHF1b3RhRWRpdG9yLnNldExhYmVsKGNvbnN0YW50cy5xdW90YVZtUG9wdXAoKSk7CiAg ICAgICAgbmFtZUVkaXRvci5zZXRMYWJlbChjb25zdGFudHMubmFtZVZtUG9wdXAoKSk7CiAgICAg ICAgZGVzY3JpcHRpb25FZGl0b3Iuc2V0TGFiZWwoY29uc3RhbnRzLmRlc2NyaXB0aW9uVm1Qb3B1 cCgpKTsKICAgICAgICB0ZW1wbGF0ZUVkaXRvci5zZXRMYWJlbChjb25zdGFudHMuYmFzZWRPblRl bXBsYXRlVm1Qb3B1cCgpKTsKICAgICAgICBtZW1TaXplRWRpdG9yLnNldExhYmVsKGNvbnN0YW50 cy5tZW1TaXplVm1Qb3B1cCgpKTsKICAgICAgICB0b3RhbHZDUFVzRWRpdG9yLnNldExhYmVsKGNv bnN0YW50cy5udW1PZlZDUFVzKCkpOwogICAgICAgIGNvcmVQZXJTb2NrZXRFZGl0b3Iuc2V0TGFi ZWwoY29uc3RhbnRzLmNvcmVzUGVyU29ja2V0KCkpOwogICAgICAgIG51bU9mU29ja2V0c0VkaXRv ci5zZXRMYWJlbChjb25zdGFudHMubnVtT2ZTb2NrZXRzKCkpOwoKICAgICAgICBvU1R5cGVFZGl0 b3Iuc2V0TGFiZWwoY29uc3RhbnRzLm9zVm1Qb3B1cCgpKTsKICAgICAgICBpc1N0YXRlbGVzc0Vk aXRvci5zZXRMYWJlbChjb25zdGFudHMuc3RhdGVsZXNzVm1Qb3B1cCgpKTsKICAgICAgICBpc0Rl bGV0ZVByb3RlY3RlZEVkaXRvci5zZXRMYWJlbChjb25zdGFudHMuZGVsZXRlUHJvdGVjdGlvblBv cHVwKCkpOwogICAgICAgIGlzU21hcnRjYXJkRW5hYmxlZEVkaXRvci5zZXRMYWJlbChjb25zdGFu dHMuc21hcnRjYXJkVm1Qb3B1cCgpKTsKCiAgICAgICAgLy8gUG9vbHMgVGFiCiAgICAgICAgcG9v bFRhYi5zZXRMYWJlbChjb25zdGFudHMucG9vbFZtUG9wdXAoKSk7CiAgICAgICAgcG9vbFR5cGVF ZGl0b3Iuc2V0TGFiZWwoY29uc3RhbnRzLnBvb2xUeXBlVm1Qb3B1cCgpKTsKICAgICAgICBlZGl0 UHJlc3RhcnRlZFZtc0xhYmVsLnNldFRleHQoY29uc3RhbnRzLnByZXN0YXJ0ZWRWbXMoKSk7Cgog ICAgICAgIHByZXN0YXJ0ZWRMYWJlbC5zZXRUZXh0KGNvbnN0YW50cy5wcmVzdGFydGVkUG9vbFBv cHVwKCkpOwogICAgICAgIG51bU9mVm1zRWRpdG9yLnNldExhYmVsKGNvbnN0YW50cy5udW1PZlZt c1Bvb2xQb3B1cCgpKTsKCiAgICAgICAgLy8gaW5pdGlhbCBydW4gVGFiCiAgICAgICAgaW5pdGlh bFJ1blRhYi5zZXRMYWJlbChjb25zdGFudHMuaW5pdGlhbFJ1blZtUG9wdXAoKSk7CiAgICAgICAg ZG9tYWluRWRpdG9yLnNldExhYmVsKGNvbnN0YW50cy5kb21haW5WbVBvcHVwKCkpOwogICAgICAg IHRpbWVab25lRWRpdG9yLnNldExhYmVsKGNvbnN0YW50cy50elZtUG9wdXAoKSk7CgogICAgICAg IC8vIENvbnNvbGUgVGFiCiAgICAgICAgY29uc29sZVRhYi5zZXRMYWJlbChjb25zdGFudHMuY29u c29sZVZtUG9wdXAoKSk7CiAgICAgICAgZGlzcGxheVByb3RvY29sRWRpdG9yLnNldExhYmVsKGNv bnN0YW50cy5wcm90b2NvbFZtUG9wdXAoKSk7CiAgICAgICAgdXNiU3VwcG9ydEVkaXRvci5zZXRM YWJlbChjb25zdGFudHMudXNiUG9saWN5Vm1Qb3B1cCgpKTsKICAgICAgICBudW1PZk1vbml0b3Jz RWRpdG9yLnNldExhYmVsKGNvbnN0YW50cy5tb25pdG9yc1ZtUG9wdXAoKSk7CiAgICAgICAgYWxs b3dDb25zb2xlUmVjb25uZWN0RWRpdG9yLnNldExhYmVsKGNvbnN0YW50cy5hbGxvd0NvbnNvbGVS ZWNvbm5lY3QoKSk7CgogICAgICAgIC8vIEhvc3QgVGFiCiAgICAgICAgaG9zdFRhYi5zZXRMYWJl bChjb25zdGFudHMuaG9zdFZtUG9wdXAoKSk7CiAgICAgICAgaXNBdXRvQXNzaWduRWRpdG9yLnNl dExhYmVsKGNvbnN0YW50cy5hbnlIb3N0SW5DbHVzdGVyVm1Qb3B1cCgpKTsKICAgICAgICAvLyBz cGVjaWZpY0hvc3RFZGl0b3Iuc2V0TGFiZWwoIlNwZWNpZmljIik7CiAgICAgICAgcnVuVk1PblRy dXN0ZWRIb3N0RWRpdG9yLnNldExhYmVsKGNvbnN0YW50cy5ydW5WTU9uVHJ1c3RlZEhvc3RWbVBv cHVwKCkpOwogICAgICAgIHJ1blZNT25TcGVjaWZpY0hvc3RFZGl0b3Iuc2V0TGFiZWwoY29uc3Rh bnRzLnJ1bk9uU2VsZWN0ZWRIb3N0Vm1Qb3B1cCgpKTsKICAgICAgICBob3N0Q3B1RWRpdG9yLnNl dExhYmVsKGNvbnN0YW50cy51c2VIb3N0Q3B1KCkpOwogICAgICAgIGRvbnRNaWdyYXRlVk1FZGl0 b3Iuc2V0TGFiZWwoY29uc3RhbnRzLmFsbG93TWlncmF0aW9uT25seUFkbWluVm1Qb3B1cCgpKTsK ICAgICAgICBjcHVQaW5uaW5nLnNldExhYmVsKGNvbnN0YW50cy5jcHVQaW5uaW5nTGFiZWwoKSk7 CiAgICAgICAgY3B1UGlubmluZ0xhYmVsLnNldEhUTUwoY29uc3RhbnRzLmNwdVBpbm5pbmdMYWJl bEV4cGxhbmF0aW9uKCkpOwoKICAgICAgICAvLyBIaWdoIEF2YWlsYWJpbGl0eSBUYWIKICAgICAg ICBpc0hpZ2hseUF2YWlsYWJsZUVkaXRvci5zZXRMYWJlbChjb25zdGFudHMuaGlnaGx5QXZhaWxh YmxlVm1Qb3B1cCgpKTsKCiAgICAgICAgLy8gUmVzb3VyY2UgQWxsb2NhdGlvbiBUYWIKICAgICAg ICBwcm92aXNpb25pbmdFZGl0b3Iuc2V0TGFiZWwoY29uc3RhbnRzLnRlbXBsYXRlUHJvdmlzVm1Q b3B1cCgpKTsKICAgICAgICBwcm92aXNpb25pbmdUaGluRWRpdG9yLnNldExhYmVsKGNvbnN0YW50 cy50aGluVm1Qb3B1cCgpKTsKICAgICAgICBwcm92aXNpb25pbmdDbG9uZUVkaXRvci5zZXRMYWJl bChjb25zdGFudHMuY2xvbmVWbVBvcHVwKCkpOwogICAgICAgIG1pbkFsbG9jYXRlZE1lbW9yeUVk aXRvci5zZXRMYWJlbChjb25zdGFudHMucGh5c01lbUd1YXJWbVBvcHVwKCkpOwoKICAgICAgICAv LyBCb290IE9wdGlvbnMKICAgICAgICBmaXJzdEJvb3REZXZpY2VFZGl0b3Iuc2V0TGFiZWwoY29u c3RhbnRzLmZpcnN0RGV2aWNlVm1Qb3B1cCgpKTsKICAgICAgICBzZWNvbmRCb290RGV2aWNlRWRp dG9yLnNldExhYmVsKGNvbnN0YW50cy5zZWNvbmREZXZpY2VWbVBvcHVwKCkpOwogICAgICAgIGtl cm5lbF9wYXRoRWRpdG9yLnNldExhYmVsKGNvbnN0YW50cy5rZXJuZWxQYXRoVm1Qb3B1cCgpKTsK ICAgICAgICBpbml0cmRfcGF0aEVkaXRvci5zZXRMYWJlbChjb25zdGFudHMuaW5pdHJkUGF0aFZt UG9wdXAoKSk7CiAgICAgICAga2VybmVsX3BhcmFtZXRlcnNFZGl0b3Iuc2V0TGFiZWwoY29uc3Rh bnRzLmtlcm5lbFBhcmFtc1ZtUG9wdXAoKSk7CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIGFwcGx5 U3R5bGVzKCkgewogICAgICAgIHJ1blZNT25TcGVjaWZpY0hvc3RFZGl0b3IuYWRkQ29udGVudFdp ZGdldFN0eWxlTmFtZShzdHlsZS5sb25nQ2hlY2tib3hDb250ZW50KCkpOwogICAgICAgIGhvc3RD cHVFZGl0b3IuYWRkQ29udGVudFdpZGdldFN0eWxlTmFtZShzdHlsZS5sb25nQ2hlY2tib3hDb250 ZW50KCkpOwogICAgICAgIGRvbnRNaWdyYXRlVk1FZGl0b3IuYWRkQ29udGVudFdpZGdldFN0eWxl TmFtZShzdHlsZS5sb25nQ2hlY2tib3hDb250ZW50KCkpOwogICAgICAgIGFsbG93Q29uc29sZVJl Y29ubmVjdEVkaXRvci5hZGRDb250ZW50V2lkZ2V0U3R5bGVOYW1lKHN0eWxlLmxvbmdDaGVja2Jv eENvbnRlbnQoKSk7CiAgICAgICAgcHJvdmlzaW9uaW5nRWRpdG9yLmFkZENvbnRlbnRXaWRnZXRT dHlsZU5hbWUoc3R5bGUucHJvdmlzaW9uaW5nRWRpdG9yQ29udGVudCgpKTsKICAgICAgICBwcm92 aXNpb25pbmdUaGluRWRpdG9yLmFkZENvbnRlbnRXaWRnZXRTdHlsZU5hbWUoc3R5bGUucHJvdmlz aW9uaW5nUmFkaW9Db250ZW50KCkpOwogICAgICAgIHByb3Zpc2lvbmluZ0Nsb25lRWRpdG9yLmFk ZENvbnRlbnRXaWRnZXRTdHlsZU5hbWUoc3R5bGUucHJvdmlzaW9uaW5nUmFkaW9Db250ZW50KCkp OwogICAgICAgIGNkQXR0YWNoZWRFZGl0b3IuYWRkQ29udGVudFdpZGdldFN0eWxlTmFtZShzdHls ZS5jZEF0dGFjaGVkTGFiZWxXaWR0aCgpKTsKICAgIH0KCiAgICBAT3ZlcnJpZGUKICAgIHB1Ymxp YyB2b2lkIGVkaXQoVW5pdFZtTW9kZWwgb2JqZWN0KSB7CiAgICAgICAgcHJpb3JpdHlFZGl0b3Iu c2V0Um93RGF0YShuZXcgQXJyYXlMaXN0PEVudGl0eU1vZGVsPigpKTsKICAgICAgICBwcmlvcml0 eUVkaXRvci5lZGl0KG9iamVjdC5nZXRQcmlvcml0eSgpKTsKICAgICAgICBEcml2ZXIuZHJpdmVy LmVkaXQob2JqZWN0KTsKICAgICAgICBpbml0VGFiQXZhaWxhYmlsaXR5TGlzdGVuZXJzKG9iamVj dCk7CiAgICAgICAgaW5pdExpc3RlbmVycyhvYmplY3QpOwogICAgICAgIGluaXRDdXN0b21Qcm9w ZXJ0eVNoZWV0KG9iamVjdCk7CgogICAgICAgIC8vIG51bU9mVm1zTGFiZWwuc2V0VmlzaWJsZShm YWxzZSk7CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIGluaXRDdXN0b21Qcm9wZXJ0eVNoZWV0KGZp bmFsIFVuaXRWbU1vZGVsIG9iamVjdCkgewogICAgICAgIG9iamVjdC5nZXRDdXN0b21Qcm9wZXJ0 eVNoZWV0KCkuZ2V0S2V5VmFsdWVMaW5lcygpLmdldEl0ZW1zQ2hhbmdlZEV2ZW50KCkuYWRkTGlz dGVuZXIobmV3IElFdmVudExpc3RlbmVyKCkgewoKICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAg ICAgICAgIHB1YmxpYyB2b2lkIGV2ZW50UmFpc2VkKEV2ZW50IGV2LCBPYmplY3Qgc2VuZGVyLCBF dmVudEFyZ3MgYXJncykgewogICAgICAgICAgICAgICAgY3VzdG9tUHJvcGVydGllc1NoZWV0RWRp dG9yLmVkaXQob2JqZWN0LmdldEN1c3RvbVByb3BlcnR5U2hlZXQoKSk7CiAgICAgICAgICAgIH0K ICAgICAgICB9KTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgdm9pZCBzZXR1cEhvc3RUYWJBdmFpbGFi aWxpdHkoVW5pdFZtTW9kZWwgbW9kZWwpIHsKICAgICAgICAvL2hvc3RUYWIuc2V0VmlzaWJsZSht b2RlbC5nZXRJc0hvc3RBdmFpbGFibGUoKSk7CiAgICAgICAgaG9zdFRhYi5zZXRWaXNpYmxlKHRy dWUpOwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBpbml0TGlzdGVuZXJzKGZpbmFsIFVuaXRWbU1v ZGVsIG9iamVjdCkgewogICAgICAgIC8vIFRPRE8gc2hvdWxkIGJlIGhhbmRsZWQgYnkgdGhlIGNv cmUgZnJhbWV3b3JrCiAgICAgICAgb2JqZWN0LmdldFByb3BlcnR5Q2hhbmdlZEV2ZW50KCkuYWRk TGlzdGVuZXIobmV3IElFdmVudExpc3RlbmVyKCkgewogICAgICAgICAgICBAT3ZlcnJpZGUKICAg ICAgICAgICAgcHVibGljIHZvaWQgZXZlbnRSYWlzZWQoRXZlbnQgZXYsIE9iamVjdCBzZW5kZXIs IEV2ZW50QXJncyBhcmdzKSB7CiAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcE5hbWUgPSAoKFBy b3BlcnR5Q2hhbmdlZEV2ZW50QXJncykgYXJncykuUHJvcGVydHlOYW1lOwogICAgICAgICAgICAg ICAgaWYgKCJJc0hvc3RBdmFpbGFibGUiLmVxdWFscyhwcm9wTmFtZSkpIHsgLy8kTk9OLU5MUy0x JAogICAgICAgICAgICAgICAgICAgIHNldHVwSG9zdFRhYkF2YWlsYWJpbGl0eShvYmplY3QpOwog ICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiSXNIb3N0VGFiVmFsaWQiLmVxdWFscyhwcm9wTmFt ZSkpIHsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3QuZ2V0SXNI b3N0VGFiVmFsaWQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBob3N0VGFiLm1hcmtBc1Zh bGlkKCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAg ICAgaG9zdFRhYi5tYXJrQXNJbnZhbGlkKG51bGwpOwogICAgICAgICAgICAgICAgICAgIH0KICAg ICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgc2V0dXBIb3N0VGFiQXZhaWxhYmlsaXR5KG9i amVjdCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgb2JqZWN0LmdldElzQXV0 b0Fzc2lnbigpLmdldFByb3BlcnR5Q2hhbmdlZEV2ZW50KCkuYWRkTGlzdGVuZXIobmV3IElFdmVu dExpc3RlbmVyKCkgewogICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgcHVibGljIHZv aWQgZXZlbnRSYWlzZWQoRXZlbnQgZXYsIE9iamVjdCBzZW5kZXIsIEV2ZW50QXJncyBhcmdzKSB7 CiAgICAgICAgICAgICAgICBib29sZWFuIGlzQXV0b0Fzc2lnbiA9IChCb29sZWFuKSBvYmplY3Qu Z2V0SXNBdXRvQXNzaWduKCkuZ2V0RW50aXR5KCk7CiAgICAgICAgICAgICAgICBib29sZWFuIHJ1 blZNT25UcnVzdGVkSG9zdCA9IChCb29sZWFuKSBvYmplY3QuZ2V0UnVuVk1PblRydXN0ZWRIb3N0 KCkuZ2V0RW50aXR5KCk7CiAgICAgICAgICAgICAgICBkZWZhdWx0SG9zdEVkaXRvci5zZXRFbmFi bGVkKCFpc0F1dG9Bc3NpZ24gJiYgIXJ1blZNT25UcnVzdGVkSG9zdCk7CiAgICAgICAgICAgICAg ICAvL2RlZmF1bHRIb3N0RWRpdG9yLnNldEVuYWJsZWQoIWlzQXV0b0Fzc2lnbik7CgogICAgICAg ICAgICAgICAgLy8gb25seSB0aGlzIGlzIG5vdCBiaW5kIHRvIHRoZSBtb2RlbCwgc28gbmVlZHMg dG8gbGlzdGVuIHRvIHRoZSBjaGFuZ2UgZXhwbGljaXRseQogICAgICAgICAgICAgICBzcGVjaWZp Y0hvc3Quc2V0VmFsdWUoIWlzQXV0b0Fzc2lnbiAmJiAhcnVuVk1PblRydXN0ZWRIb3N0KTsKICAg ICAgICAgICAgICAgLy9zcGVjaWZpY0hvc3Quc2V0VmFsdWUoIWlzQXV0b0Fzc2lnbik7CiAgICAg ICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgLy8gb25seSBmb3Igbm9uIGxvY2FsIHN0b3Jh Z2UgYXZhaWxhYmxlCiAgICAgICAgc2V0dXBIb3N0VGFiQXZhaWxhYmlsaXR5KG9iamVjdCk7Cgog ICAgICAgIG9iamVjdC5nZXRTdG9yYWdlRG9tYWluKCkuZ2V0SXRlbXNDaGFuZ2VkRXZlbnQoKS5h ZGRMaXN0ZW5lcihuZXcgSUV2ZW50TGlzdGVuZXIoKSB7CiAgICAgICAgICAgIEBPdmVycmlkZQog ICAgICAgICAgICBwdWJsaWMgdm9pZCBldmVudFJhaXNlZChFdmVudCBldiwgT2JqZWN0IHNlbmRl ciwgRXZlbnRBcmdzIGFyZ3MpIHsKICAgICAgICAgICAgICAgIGFkZERpc2tBbGxvY2F0aW9uKG9i amVjdCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgb2JqZWN0LmdldFByb3Zp c2lvbmluZygpLmdldFByb3BlcnR5Q2hhbmdlZEV2ZW50KCkuYWRkTGlzdGVuZXIobmV3IElFdmVu dExpc3RlbmVyKCkgewogICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgcHVibGljIHZv aWQgZXZlbnRSYWlzZWQoRXZlbnQgZXYsIE9iamVjdCBzZW5kZXIsIEV2ZW50QXJncyBhcmdzKSB7 CiAgICAgICAgICAgICAgICBib29sZWFuIGlzUHJvdmlzaW9uaW5nQ2hhbmdhYmxlID0gb2JqZWN0 LmdldFByb3Zpc2lvbmluZygpLmdldElzQ2hhbmdhYmxlKCk7CiAgICAgICAgICAgICAgICBwcm92 aXNpb25pbmdUaGluRWRpdG9yLnNldEVuYWJsZWQoaXNQcm92aXNpb25pbmdDaGFuZ2FibGUpOwog ICAgICAgICAgICAgICAgcHJvdmlzaW9uaW5nQ2xvbmVFZGl0b3Iuc2V0RW5hYmxlZChpc1Byb3Zp c2lvbmluZ0NoYW5nYWJsZSk7CgogICAgICAgICAgICAgICAgYm9vbGVhbiBpc1Byb3Zpc2lvbmlu Z0F2YWlsYWJsZSA9IG9iamVjdC5nZXRQcm92aXNpb25pbmcoKS5nZXRJc0F2YWlsYWJsZSgpOwog ICAgICAgICAgICAgICAgcHJvdmlzaW9uU2VsZWN0aW9uUGFuZWwuc2V0VmlzaWJsZShpc1Byb3Zp c2lvbmluZ0F2YWlsYWJsZSk7CgogICAgICAgICAgICAgICAgYm9vbGVhbiBpc0Rpc2tzQXZhaWxh YmxlID0gb2JqZWN0LmdldElzRGlza3NBdmFpbGFibGUoKTsKICAgICAgICAgICAgICAgIGRpc2tz QWxsb2NhdGlvblBhbmVsLnNldFZpc2libGUoaXNEaXNrc0F2YWlsYWJsZSk7CgogICAgICAgICAg ICAgICAgc3RvcmFnZUFsbG9jYXRpb25QYW5lbC5zZXRWaXNpYmxlKGlzUHJvdmlzaW9uaW5nQXZh aWxhYmxlIHx8IGlzRGlza3NBdmFpbGFibGUpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7Cgog ICAgICAgIG9iamVjdC5nZXRVc2JQb2xpY3koKS5nZXRQcm9wZXJ0eUNoYW5nZWRFdmVudCgpLmFk ZExpc3RlbmVyKG5ldyBJRXZlbnRMaXN0ZW5lcigpIHsKCiAgICAgICAgICAgIEBPdmVycmlkZQog ICAgICAgICAgICBwdWJsaWMgdm9pZCBldmVudFJhaXNlZChFdmVudCBldiwgT2JqZWN0IHNlbmRl ciwgRXZlbnRBcmdzIGFyZ3MpIHsKICAgICAgICAgICAgICAgIFByb3BlcnR5Q2hhbmdlZEV2ZW50 QXJncyBlID0gKFByb3BlcnR5Q2hhbmdlZEV2ZW50QXJncykgYXJnczsKCiAgICAgICAgICAgICAg ICBpZiAoZS5Qcm9wZXJ0eU5hbWUgPT0gIlNlbGVjdGVkSXRlbSIpIHsgLy8kTk9OLU5MUy0xJAog ICAgICAgICAgICAgICAgICAgIHVwZGF0ZVVzYk5hdGl2ZU1lc3NhZ2VWaXNpYmlsaXR5KG9iamVj dCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAg dXBkYXRlVXNiTmF0aXZlTWVzc2FnZVZpc2liaWxpdHkob2JqZWN0KTsKICAgIH0KCiAgICBwcm90 ZWN0ZWQgdm9pZCB1cGRhdGVVc2JOYXRpdmVNZXNzYWdlVmlzaWJpbGl0eShmaW5hbCBVbml0Vm1N b2RlbCBvYmplY3QpIHsKICAgICAgICBuYXRpdmVVc2JXYXJuaW5nTWVzc2FnZS5zZXRWaXNpYmxl KG9iamVjdC5nZXRVc2JQb2xpY3koKS5nZXRTZWxlY3RlZEl0ZW0oKSA9PSBVc2JQb2xpY3kuRU5B QkxFRF9OQVRJVkUpOwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBhZGREaXNrQWxsb2NhdGlvbihV bml0Vm1Nb2RlbCBtb2RlbCkgewogICAgICAgIC8vIEFycmF5TGlzdDxzdG9yYWdlX2RvbWFpbnM+ IHN0b3JhZ2VEb21haW5zID0gKEFycmF5TGlzdDxzdG9yYWdlX2RvbWFpbnM+KSBtb2RlbC5nZXRT dG9yYWdlRG9tYWluKCkuZ2V0SXRlbXMoKTsKICAgICAgICBpZiAoIW1vZGVsLmdldElzRGlza3NB dmFpbGFibGUoKSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGRpc2tz QWxsb2NhdGlvblZpZXcuZWRpdChtb2RlbC5nZXREaXNrc0FsbG9jYXRpb25Nb2RlbCgpKTsKICAg ICAgICBtb2RlbC5nZXREaXNrc0FsbG9jYXRpb25Nb2RlbCgpLmdldFN0b3JhZ2VEb21haW4oKS5z ZXRJdGVtcyhtb2RlbC5nZXRTdG9yYWdlRG9tYWluKCkuZ2V0SXRlbXMoKSk7CiAgICAgICAgbW9k ZWwuZ2V0RGlza3NBbGxvY2F0aW9uTW9kZWwoKS5zZXREaXNrcyhtb2RlbC5nZXREaXNrcygpKTsK ICAgIH0KCiAgICBwcml2YXRlIHZvaWQgaW5pdFRhYkF2YWlsYWJpbGl0eUxpc3RlbmVycyhmaW5h bCBVbml0Vm1Nb2RlbCB2bSkgewogICAgICAgIC8vIFRPRE8gc2hvdWxkIGJlIGhhbmRsZWQgYnkg dGhlIGNvcmUgZnJhbWV3b3JrCiAgICAgICAgdm0uZ2V0UHJvcGVydHlDaGFuZ2VkRXZlbnQoKS5h ZGRMaXN0ZW5lcihuZXcgSUV2ZW50TGlzdGVuZXIoKSB7CiAgICAgICAgICAgIEBPdmVycmlkZQog ICAgICAgICAgICBwdWJsaWMgdm9pZCBldmVudFJhaXNlZChFdmVudCBldiwgT2JqZWN0IHNlbmRl ciwgRXZlbnRBcmdzIGFyZ3MpIHsKICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wTmFtZSA9ICgo UHJvcGVydHlDaGFuZ2VkRXZlbnRBcmdzKSBhcmdzKS5Qcm9wZXJ0eU5hbWU7CiAgICAgICAgICAg ICAgICBpZiAoIklzV2luZG93c09TIi5lcXVhbHMocHJvcE5hbWUpKSB7IC8vJE5PTi1OTFMtMSQK ICAgICAgICAgICAgICAgICAgICBkb21haW5FZGl0b3Iuc2V0RW5hYmxlZCh2bS5nZXRJc1dpbmRv d3NPUygpKTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIklzR2VuZXJhbFRhYlZhbGlkIi5l cXVhbHMocHJvcE5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgICAgICAgICBpZiAo dm0uZ2V0SXNHZW5lcmFsVGFiVmFsaWQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBnZW5l cmFsVGFiLm1hcmtBc1ZhbGlkKCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAg ICAgICAgICAgICAgICAgICAgZ2VuZXJhbFRhYi5tYXJrQXNJbnZhbGlkKG51bGwpOwogICAgICAg ICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIklzRGlzcGxheVRhYlZh bGlkIi5lcXVhbHMocHJvcE5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgICAgICAg ICBpZiAodm0uZ2V0SXNEaXNwbGF5VGFiVmFsaWQoKSkgewogICAgICAgICAgICAgICAgICAgICAg ICBjb25zb2xlVGFiLm1hcmtBc1ZhbGlkKCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsK ICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZVRhYi5tYXJrQXNJbnZhbGlkKG51bGwpOwog ICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIklzQWxsb2Nh dGlvblRhYlZhbGlkIi5lcXVhbHMocHJvcE5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKICAgICAgICAg ICAgICAgICAgICBpZiAodm0uZ2V0SXNBbGxvY2F0aW9uVGFiVmFsaWQoKSkgewogICAgICAgICAg ICAgICAgICAgICAgICByZXNvdXJjZUFsbG9jYXRpb25UYWIubWFya0FzVmFsaWQoKTsKICAgICAg ICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZUFs bG9jYXRpb25UYWIubWFya0FzSW52YWxpZChudWxsKTsKICAgICAgICAgICAgICAgICAgICB9CiAg ICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJJc0hpZ2hseUF2YWlsYWJsZSIuZXF1YWxzKHByb3BO YW1lKSkgeyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICAgICAgICAgaGlnaEF2YWlsYWJpbGl0 eVRhYi5zZXRWaXNpYmxlKChCb29sZWFuKSB2bS5nZXRJc0hpZ2hseUF2YWlsYWJsZSgpLmdldEVu dGl0eSgpKTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIklzQm9vdFNlcXVlbmNlVGFiVmFs aWQiLmVxdWFscyhwcm9wTmFtZSkpIHsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgICAgICAg IGlmICgoQm9vbGVhbikgdm0uZ2V0SXNIaWdobHlBdmFpbGFibGUoKS5nZXRFbnRpdHkoKSkgewog ICAgICAgICAgICAgICAgICAgICAgICBib290T3B0aW9uc1RhYi5tYXJrQXNWYWxpZCgpOwogICAg ICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJvb3RPcHRp b25zVGFiLm1hcmtBc0ludmFsaWQobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAg ICAgICAgICAgfSBlbHNlIGlmICgiSXNDdXN0b21Qcm9wZXJ0aWVzVGFiVmFsaWQiLmVxdWFscyhw cm9wTmFtZSkpIHsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgICAgICAgIGlmICh2bS5nZXRJ c0N1c3RvbVByb3BlcnRpZXNUYWJWYWxpZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGN1 c3RvbVByb3BlcnRpZXNUYWIubWFya0FzVmFsaWQoKTsKICAgICAgICAgICAgICAgICAgICB9IGVs c2UgewogICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21Qcm9wZXJ0aWVzVGFiLm1hcmtBc0lu dmFsaWQobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAg ICAgICAgICAgICAgZWxzZSBpZiAoIklzRGlza3NBdmFpbGFibGUiLmVxdWFscyhwcm9wTmFtZSkp IHsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNEaXNrc0F2YWls YWJsZSA9IHZtLmdldElzRGlza3NBdmFpbGFibGUoKTsKICAgICAgICAgICAgICAgICAgICBkaXNr c0FsbG9jYXRpb25QYW5lbC5zZXRWaXNpYmxlKGlzRGlza3NBdmFpbGFibGUpOwoKICAgICAgICAg ICAgICAgICAgICBib29sZWFuIGlzUHJvdmlzaW9uaW5nQXZhaWxhYmxlID0gdm0uZ2V0UHJvdmlz aW9uaW5nKCkuZ2V0SXNBdmFpbGFibGUoKTsKICAgICAgICAgICAgICAgICAgICBzdG9yYWdlQWxs b2NhdGlvblBhbmVsLnNldFZpc2libGUoaXNQcm92aXNpb25pbmdBdmFpbGFibGUgfHwgaXNEaXNr c0F2YWlsYWJsZSk7CgogICAgICAgICAgICAgICAgICAgIGlmIChpc0Rpc2tzQXZhaWxhYmxlKSB7 CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB3YXJuaW5nIG1lc3NhZ2UgYnkgZGlz a3Mgc3RhdHVzCiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZURpc2tzV2FybmluZ0J5SW1h Z2VTdGF0dXModm0uZ2V0RGlza3MoKSwgSW1hZ2VTdGF0dXMuSUxMRUdBTCk7CiAgICAgICAgICAg ICAgICAgICAgICAgIHVwZGF0ZURpc2tzV2FybmluZ0J5SW1hZ2VTdGF0dXModm0uZ2V0RGlza3Mo KSwgSW1hZ2VTdGF0dXMuTE9DS0VEKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAg ICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIHdhcm5pbmcg bWVzc2FnZQogICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmFsV2FybmluZ01lc3NhZ2Uuc2V0 VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAg ICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgLy8gSGlnaCBBdmFpbGFi aWxpdHkgb25seSBhdmFpbCBpbiBzZXJ2ZXIgbW9kZQogICAgICAgIGhpZ2hBdmFpbGFiaWxpdHlU YWIuc2V0VmlzaWJsZSh2bS5nZXRWbVR5cGUoKS5lcXVhbHMoVm1UeXBlLlNlcnZlcikpOwoKICAg ICAgICAvLyBUT0RPOiBNb3ZlIHRvIGEgbW9yZSBhcHByb3ByaWF0ZSBtZXRob2QKICAgICAgICB2 bS5nZXRQcm9wZXJ0eUNoYW5nZWRFdmVudCgpLmFkZExpc3RlbmVyKG5ldyBJRXZlbnRMaXN0ZW5l cigpIHsKICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgIHB1YmxpYyB2b2lkIGV2ZW50 UmFpc2VkKEV2ZW50IGV2LCBPYmplY3Qgc2VuZGVyLCBFdmVudEFyZ3MgYXJncykgewogICAgICAg ICAgICAgICAgU3RyaW5nIHByb3BOYW1lID0gKChQcm9wZXJ0eUNoYW5nZWRFdmVudEFyZ3MpIGFy Z3MpLlByb3BlcnR5TmFtZTsKICAgICAgICAgICAgICAgIGlmICgiSXNMaW51eF9VbmFzc2lnbl9V bmtub3duT1MiLmVxdWFscyhwcm9wTmFtZSkpIHsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAg ICAgICAgIGxpbnV4Qm9vdE9wdGlvbnNQYW5lbC5zZXRWaXNpYmxlKHZtLmdldElzTGludXhfVW5h c3NpZ25fVW5rbm93bk9TKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAg ICAgfSk7CgogICAgICAgIC8vIG9ubHkgYXZhaWwgZm9yIGRlc2t0b3AgbW9kZQogICAgICAgIGlz U3RhdGVsZXNzRWRpdG9yLnNldFZpc2libGUodm0uZ2V0Vm1UeXBlKCkuZXF1YWxzKFZtVHlwZS5E ZXNrdG9wKSk7CiAgICAgICAgbnVtT2ZNb25pdG9yc0VkaXRvci5zZXRWaXNpYmxlKHZtLmdldFZt VHlwZSgpLmVxdWFscyhWbVR5cGUuRGVza3RvcCkpOwoKICAgICAgICBkZWZhdWx0SG9zdEVkaXRv ci5zZXRFbmFibGVkKGZhbHNlKTsKICAgICAgICBzcGVjaWZpY0hvc3QuYWRkVmFsdWVDaGFuZ2VI YW5kbGVyKG5ldyBWYWx1ZUNoYW5nZUhhbmRsZXI8Qm9vbGVhbj4oKSB7CiAgICAgICAgICAgIEBP dmVycmlkZQogICAgICAgICAgICBwdWJsaWMgdm9pZCBvblZhbHVlQ2hhbmdlKFZhbHVlQ2hhbmdl RXZlbnQ8Qm9vbGVhbj4gZXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0SG9zdEVk aXRvci5zZXRFbmFibGVkKHNwZWNpZmljSG9zdC5nZXRWYWx1ZSgpKTsKICAgICAgICAgICAgICAg ICAgICAgVmFsdWVDaGFuZ2VFdmVudC5maXJlKGlzQXV0b0Fzc2lnbkVkaXRvci5hc1JhZGlvQnV0 dG9uKCksIGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICAvLyBUT0RP OiBUaGlzIGlzIGEgaGFjayBhbmQgc2hvdWxkIGJlIGhhbmRsZWQgY2xlYW5seSB2aWEgbW9kZWwg cHJvcGVydHkgYXZhaWxhYmlsaXR5CiAgICAgICAgaXNBdXRvQXNzaWduRWRpdG9yLmFkZERvbUhh bmRsZXIobmV3IENsaWNrSGFuZGxlcigpIHsKICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAg ICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soQ2xpY2tFdmVudCBldmVudCkgewogICAgICAgICAgICAg ICAgZGVmYXVsdEhvc3RFZGl0b3Iuc2V0RW5hYmxlZChmYWxzZSk7CiAgICAgICAgICAgIH0KICAg ICAgICB9LCBDbGlja0V2ZW50LmdldFR5cGUoKSk7CgogICAgICAgIHZtLmdldElzQXV0b0Fzc2ln bigpLmdldEVudGl0eUNoYW5nZWRFdmVudCgpLmFkZExpc3RlbmVyKG5ldyBJRXZlbnRMaXN0ZW5l cigpIHsKCiAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICBwdWJsaWMgdm9pZCBldmVu dFJhaXNlZChFdmVudCBldiwgT2JqZWN0IHNlbmRlciwgRXZlbnRBcmdzIGFyZ3MpIHsKICAgICAg ICAgICAgICAgIGlmICghaXNBdXRvQXNzaWduRWRpdG9yLmFzUmFkaW9CdXR0b24oKS5nZXRWYWx1 ZSgpICYmICFydW5WTU9uVHJ1c3RlZEhvc3RFZGl0b3IuYXNSYWRpb0J1dHRvbigpLmdldFZhbHVl KCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWNIb3N0LnNl dFZhbHVlKHRydWUsIHRydWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAg ICAgfSk7CgogICAgICAgIC8qcnVuVk1PblRydXN0ZWRIb3N0RWRpdG9yLmFkZERvbUhhbmRsZXIo bmV3IENsaWNrSGFuZGxlcigpIHsKICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgIHB1 YmxpYyB2b2lkIG9uQ2xpY2soQ2xpY2tFdmVudCBldmVudCkgewogICAgICAgICAgICAgICAgZGVm YXVsdEhvc3RFZGl0b3Iuc2V0RW5hYmxlZChmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9 LCBDbGlja0V2ZW50LmdldFR5cGUoKSk7CgogICAgICAgIHZtLmdldFJ1blZNT25UcnVzdGVkSG9z dCgpLmdldEVudGl0eUNoYW5nZWRFdmVudCgpLmFkZExpc3RlbmVyKG5ldyBJRXZlbnRMaXN0ZW5l cigpIHsKCiAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICBwdWJsaWMgdm9pZCBldmVu dFJhaXNlZChFdmVudCBldiwgT2JqZWN0IHNlbmRlciwgRXZlbnRBcmdzIGFyZ3MpIHsKICAgICAg ICAgICAgICAgIGlmICghcnVuVk1PblRydXN0ZWRIb3N0RWRpdG9yLmFzUmFkaW9CdXR0b24oKS5n ZXRWYWx1ZSgpICYmICFpc0F1dG9Bc3NpZ25FZGl0b3IuYXNSYWRpb0J1dHRvbigpLmdldFZhbHVl KCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWNIb3N0LnNl dFZhbHVlKHRydWUsIHRydWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAg ICAgfSk7Ki8KCiAgICAgICAgY3B1UGlubmluZ0xhYmVsLnNldFZpc2libGUodm0uZ2V0Q3B1UGlu bmluZygpLmdldElzQXZhaWxhYmxlKCkpOwogICAgICAgIHZtLmdldENwdVBpbm5pbmcoKS5nZXRQ cm9wZXJ0eUNoYW5nZWRFdmVudCgpLmFkZExpc3RlbmVyKG5ldyBJRXZlbnRMaXN0ZW5lcigpIHsK CiAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICBwdWJsaWMgdm9pZCBldmVudFJhaXNl ZChFdmVudCBldiwgT2JqZWN0IHNlbmRlciwgRXZlbnRBcmdzIGFyZ3MpIHsKICAgICAgICAgICAg ICAgIGNwdVBpbm5pbmdMYWJlbC5zZXRWaXNpYmxlKHZtLmdldENwdVBpbm5pbmcoKS5nZXRJc0F2 YWlsYWJsZSgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgIH0KCiAgICBwcml2YXRl IHZvaWQgdXBkYXRlRGlza3NXYXJuaW5nQnlJbWFnZVN0YXR1cyhMaXN0PERpc2tNb2RlbD4gZGlz a3MsIEltYWdlU3RhdHVzIGltYWdlU3RhdHVzKSB7CiAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4g ZGlza3NBbGlhc2VzID0KICAgICAgICAgICAgICAgIGdldERpc2tzQWxpYXNlc0J5SW1hZ2VTdGF0 dXMoZGlza3MsIGltYWdlU3RhdHVzKTsKCiAgICAgICAgaWYgKCFkaXNrc0FsaWFzZXMuaXNFbXB0 eSgpKSB7CiAgICAgICAgICAgIGdlbmVyYWxXYXJuaW5nTWVzc2FnZS5zZXRUZXh0KG1lc3NhZ2Vz LmRpc2tzU3RhdHVzV2FybmluZygKICAgICAgICAgICAgICAgICAgICBFbnVtVHJhbnNsYXRvci5j cmVhdGVBbmRUcmFuc2xhdGUoaW1hZ2VTdGF0dXMpLAogICAgICAgICAgICAgICAgICAgIChTdHJp bmdVdGlscy5qb2luKGRpc2tzQWxpYXNlcywgIiwgIikpKSk7IC8vJE5PTi1OTFMtMSQKICAgICAg ICB9CiAgICB9CgogICAgcHJpdmF0ZSBBcnJheUxpc3Q8U3RyaW5nPiBnZXREaXNrc0FsaWFzZXNC eUltYWdlU3RhdHVzKExpc3Q8RGlza01vZGVsPiBkaXNrcywgSW1hZ2VTdGF0dXMgc3RhdHVzKSB7 CiAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gZGlza3NBbGlhc2VzID0gbmV3IEFycmF5TGlzdDxT dHJpbmc+KCk7CgogICAgICAgIGlmIChkaXNrcyA9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVy biBkaXNrc0FsaWFzZXM7CiAgICAgICAgfQoKICAgICAgICBmb3IgKERpc2tNb2RlbCBkaXNrTW9k ZWwgOiBkaXNrcykgewogICAgICAgICAgICBEaXNrIGRpc2sgPSBkaXNrTW9kZWwuZ2V0RGlzaygp OwogICAgICAgICAgICBpZiAoZGlzay5nZXREaXNrU3RvcmFnZVR5cGUoKSA9PSBEaXNrU3RvcmFn ZVR5cGUuSU1BR0UgJiYKICAgICAgICAgICAgICAgICAgICAoKERpc2tJbWFnZSkgZGlzaykuZ2V0 aW1hZ2VTdGF0dXMoKSA9PSBzdGF0dXMpIHsKCiAgICAgICAgICAgICAgICBkaXNrc0FsaWFzZXMu YWRkKGRpc2suZ2V0RGlza0FsaWFzKCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAg ICByZXR1cm4gZGlza3NBbGlhc2VzOwogICAgfQoKICAgIEBPdmVycmlkZQogICAgcHVibGljIFVu aXRWbU1vZGVsIGZsdXNoKCkgewogICAgICAgIHByaW9yaXR5RWRpdG9yLmZsdXNoKCk7CiAgICAg ICAgcmV0dXJuIERyaXZlci5kcml2ZXIuZmx1c2goKTsKICAgIH0KCiAgICBAT3ZlcnJpZGUKICAg IHB1YmxpYyB2b2lkIGZvY3VzSW5wdXQoKSB7CiAgICAgICAgbmFtZUVkaXRvci5zZXRGb2N1cyh0 cnVlKTsKICAgIH0KCiAgICBwdWJsaWMgaW50ZXJmYWNlIEJ1dHRvbkNlbGxUYWJsZVJlc291cmNl cyBleHRlbmRzIENlbGxUYWJsZS5SZXNvdXJjZXMgewogICAgICAgIGludGVyZmFjZSBUYWJsZVN0 eWxlIGV4dGVuZHMgQ2VsbFRhYmxlLlN0eWxlIHsKICAgICAgICB9CgogICAgICAgIEBPdmVycmlk ZQogICAgICAgIEBTb3VyY2UoeyBDZWxsVGFibGUuU3R5bGUuREVGQVVMVF9DU1MsICJvcmcvb3Zp cnQvZW5naW5lL3VpL2NvbW1vbi9jc3MvQnV0dG9uQ2VsbFRhYmxlLmNzcyIgfSkKICAgICAgICBU YWJsZVN0eWxlIGNlbGxUYWJsZVN0eWxlKCk7CiAgICB9CgogICAgQE92ZXJyaWRlCiAgICBwdWJs aWMgaW50IHNldFRhYkluZGV4ZXMoaW50IG5leHRUYWJJbmRleCkgewogICAgICAgIC8vID09R2Vu ZXJhbCBUYWI9PQogICAgICAgIG5leHRUYWJJbmRleCA9IGdlbmVyYWxUYWIuc2V0VGFiSW5kZXhl cyhuZXh0VGFiSW5kZXgpOwogICAgICAgIGRhdGFDZW50ZXJFZGl0b3Iuc2V0VGFiSW5kZXgobmV4 dFRhYkluZGV4KyspOwogICAgICAgIGNsdXN0ZXJFZGl0b3Iuc2V0VGFiSW5kZXgobmV4dFRhYklu ZGV4KyspOwogICAgICAgIHF1b3RhRWRpdG9yLnNldFRhYkluZGV4KG5leHRUYWJJbmRleCsrKTsK ICAgICAgICBuYW1lRWRpdG9yLnNldFRhYkluZGV4KG5leHRUYWJJbmRleCsrKTsKICAgICAgICBk ZXNjcmlwdGlvbkVkaXRvci5zZXRUYWJJbmRleChuZXh0VGFiSW5kZXgrKyk7CgogICAgICAgIG51 bU9mVm1zRWRpdG9yLnNldFRhYkluZGV4KG5leHRUYWJJbmRleCsrKTsKICAgICAgICBwcmVzdGFy dGVkVm1zRWRpdG9yLnNldFRhYkluZGV4KG5leHRUYWJJbmRleCsrKTsKICAgICAgICBlZGl0UHJl c3RhcnRlZFZtc0VkaXRvci5zZXRUYWJJbmRleChuZXh0VGFiSW5kZXgrKyk7CiAgICAgICAgaW5j cmFzZU51bU9mVm1zRWRpdG9yLnNldFRhYkluZGV4KG5leHRUYWJJbmRleCsrKTsKCiAgICAgICAg dGVtcGxhdGVFZGl0b3Iuc2V0VGFiSW5kZXgobmV4dFRhYkluZGV4KyspOwogICAgICAgIG1lbVNp emVFZGl0b3Iuc2V0VGFiSW5kZXgobmV4dFRhYkluZGV4KyspOwogICAgICAgIHRvdGFsdkNQVXNF ZGl0b3Iuc2V0VGFiSW5kZXgobmV4dFRhYkluZGV4KyspOwoKICAgICAgICBuZXh0VGFiSW5kZXgg PSBnZW5lcmFsQWR2YW5jZWRQYXJhbWV0ZXJFeHBhbmRlci5zZXRUYWJJbmRleGVzKG5leHRUYWJJ bmRleCk7CiAgICAgICAgY29yZVBlclNvY2tldEVkaXRvci5zZXRUYWJJbmRleChuZXh0VGFiSW5k ZXgrKyk7CiAgICAgICAgbnVtT2ZTb2NrZXRzRWRpdG9yLnNldFRhYkluZGV4KG5leHRUYWJJbmRl eCsrKTsKCiAgICAgICAgb1NUeXBlRWRpdG9yLnNldFRhYkluZGV4KG5leHRUYWJJbmRleCsrKTsK ICAgICAgICBpc1N0YXRlbGVzc0VkaXRvci5zZXRUYWJJbmRleChuZXh0VGFiSW5kZXgrKyk7CiAg ICAgICAgaXNEZWxldGVQcm90ZWN0ZWRFZGl0b3Iuc2V0VGFiSW5kZXgobmV4dFRhYkluZGV4Kysp OwoKICAgICAgICAvLyA9PSBQb29scyA9PQogICAgICAgIG5leHRUYWJJbmRleCA9IHBvb2xUYWIu c2V0VGFiSW5kZXhlcyhuZXh0VGFiSW5kZXgpOwogICAgICAgIHBvb2xUeXBlRWRpdG9yLnNldFRh YkluZGV4KG5leHRUYWJJbmRleCsrKTsKCiAgICAgICAgLy8gPT1Jbml0aWFsIHJ1biBUYWI9PQog ICAgICAgIG5leHRUYWJJbmRleCA9IGluaXRpYWxSdW5UYWIuc2V0VGFiSW5kZXhlcyhuZXh0VGFi SW5kZXgpOwogICAgICAgIHRpbWVab25lRWRpdG9yLnNldFRhYkluZGV4KG5leHRUYWJJbmRleCsr KTsKICAgICAgICBkb21haW5FZGl0b3Iuc2V0VGFiSW5kZXgobmV4dFRhYkluZGV4KyspOwoKICAg ICAgICAvLyA9PUNvbnNvbGUgVGFiPT0KICAgICAgICBuZXh0VGFiSW5kZXggPSBjb25zb2xlVGFi LnNldFRhYkluZGV4ZXMobmV4dFRhYkluZGV4KTsKICAgICAgICBkaXNwbGF5UHJvdG9jb2xFZGl0 b3Iuc2V0VGFiSW5kZXgobmV4dFRhYkluZGV4KyspOwogICAgICAgIHVzYlN1cHBvcnRFZGl0b3Iu c2V0VGFiSW5kZXgobmV4dFRhYkluZGV4KyspOwogICAgICAgIG51bU9mTW9uaXRvcnNFZGl0b3Iu c2V0VGFiSW5kZXgobmV4dFRhYkluZGV4KyspOwogICAgICAgIGlzU21hcnRjYXJkRW5hYmxlZEVk aXRvci5zZXRUYWJJbmRleChuZXh0VGFiSW5kZXgrKyk7CiAgICAgICAgbmV4dFRhYkluZGV4ID0g ZXhwYW5kZXIuc2V0VGFiSW5kZXhlcyhuZXh0VGFiSW5kZXgpOwogICAgICAgIGFsbG93Q29uc29s ZVJlY29ubmVjdEVkaXRvci5zZXRUYWJJbmRleChuZXh0VGFiSW5kZXgrKyk7CgogICAgICAgIC8v ID09SG9zdCBUYWI9PQogICAgICAgIG5leHRUYWJJbmRleCA9IGhvc3RUYWIuc2V0VGFiSW5kZXhl cyhuZXh0VGFiSW5kZXgpOwogICAgICAgIGlzQXV0b0Fzc2lnbkVkaXRvci5zZXRUYWJJbmRleChu ZXh0VGFiSW5kZXgrKyk7CiAgICAgICAgc3BlY2lmaWNIb3N0LnNldFRhYkluZGV4KG5leHRUYWJJ bmRleCsrKTsKICAgICAgICBkZWZhdWx0SG9zdEVkaXRvci5zZXRUYWJJbmRleChuZXh0VGFiSW5k ZXgrKyk7CiAgICAgICAgcnVuVk1PblNwZWNpZmljSG9zdEVkaXRvci5zZXRUYWJJbmRleChuZXh0 VGFiSW5kZXgrKyk7CiAgICAgICAgcnVuVk1PblRydXN0ZWRIb3N0RWRpdG9yLnNldFRhYkluZGV4 KG5leHRUYWJJbmRleCsrKTsKICAgICAgICBob3N0Q3B1RWRpdG9yLnNldFRhYkluZGV4KG5leHRU YWJJbmRleCsrKTsKICAgICAgICBkb250TWlncmF0ZVZNRWRpdG9yLnNldFRhYkluZGV4KG5leHRU YWJJbmRleCsrKTsKICAgICAgICBjcHVQaW5uaW5nLnNldFRhYkluZGV4KG5leHRUYWJJbmRleCsr KTsKCiAgICAgICAgLy8gPT1IaWdoIEF2YWlsYWJpbGl0eSBUYWI9PQogICAgICAgIG5leHRUYWJJ bmRleCA9IGhpZ2hBdmFpbGFiaWxpdHlUYWIuc2V0VGFiSW5kZXhlcyhuZXh0VGFiSW5kZXgpOwog ICAgICAgIGlzSGlnaGx5QXZhaWxhYmxlRWRpdG9yLnNldFRhYkluZGV4KG5leHRUYWJJbmRleCsr KTsKICAgICAgICBwcmlvcml0eUVkaXRvci5zZXRUYWJJbmRleChuZXh0VGFiSW5kZXgrKyk7Cgog ICAgICAgIC8vID09UmVzb3VyY2UgQWxsb2NhdGlvbiBUYWI9PQogICAgICAgIG5leHRUYWJJbmRl eCA9IHJlc291cmNlQWxsb2NhdGlvblRhYi5zZXRUYWJJbmRleGVzKG5leHRUYWJJbmRleCk7CiAg ICAgICAgbWluQWxsb2NhdGVkTWVtb3J5RWRpdG9yLnNldFRhYkluZGV4KG5leHRUYWJJbmRleCsr KTsKICAgICAgICBwcm92aXNpb25pbmdFZGl0b3Iuc2V0VGFiSW5kZXgobmV4dFRhYkluZGV4Kysp OwogICAgICAgIHByb3Zpc2lvbmluZ1RoaW5FZGl0b3Iuc2V0VGFiSW5kZXgobmV4dFRhYkluZGV4 KyspOwogICAgICAgIHByb3Zpc2lvbmluZ0Nsb25lRWRpdG9yLnNldFRhYkluZGV4KG5leHRUYWJJ bmRleCsrKTsKICAgICAgICBuZXh0VGFiSW5kZXggPSBkaXNrc0FsbG9jYXRpb25WaWV3LnNldFRh YkluZGV4ZXMobmV4dFRhYkluZGV4KTsKCiAgICAgICAgLy8gPT1Cb290IE9wdGlvbnMgVGFiPT0K ICAgICAgICBuZXh0VGFiSW5kZXggPSBib290T3B0aW9uc1RhYi5zZXRUYWJJbmRleGVzKG5leHRU YWJJbmRleCk7CiAgICAgICAgZmlyc3RCb290RGV2aWNlRWRpdG9yLnNldFRhYkluZGV4KG5leHRU YWJJbmRleCsrKTsKICAgICAgICBzZWNvbmRCb290RGV2aWNlRWRpdG9yLnNldFRhYkluZGV4KG5l eHRUYWJJbmRleCsrKTsKICAgICAgICBjZEF0dGFjaGVkRWRpdG9yLnNldFRhYkluZGV4KG5leHRU YWJJbmRleCsrKTsKICAgICAgICBjZEltYWdlRWRpdG9yLnNldFRhYkluZGV4KG5leHRUYWJJbmRl eCsrKTsKICAgICAgICBrZXJuZWxfcGF0aEVkaXRvci5zZXRUYWJJbmRleChuZXh0VGFiSW5kZXgr Kyk7CiAgICAgICAgaW5pdHJkX3BhdGhFZGl0b3Iuc2V0VGFiSW5kZXgobmV4dFRhYkluZGV4Kysp OwogICAgICAgIGtlcm5lbF9wYXJhbWV0ZXJzRWRpdG9yLnNldFRhYkluZGV4KG5leHRUYWJJbmRl eCsrKTsKCiAgICAgICAgLy8gPT1DdXN0b20gUHJvcGVydGllcyBUYWI9PQogICAgICAgIG5leHRU YWJJbmRleCA9IGN1c3RvbVByb3BlcnRpZXNUYWIuc2V0VGFiSW5kZXhlcyhuZXh0VGFiSW5kZXgp OwovLyAgICAgICAgY3VzdG9tUHJvcGVydGllc1NoZWV0RWRpdG9yLnNldFRhYkluZGV4KG5leHRU YWJJbmRleCsrKTsKCiAgICAgICAgcmV0dXJuIG5leHRUYWJJbmRleDsKICAgIH0KfQo= --_005_C5A0092C63E939488005F15F736A8112097A57B9SHSMSX101ccrcor_ Content-Type: application/octet-stream; name="VmListModel.java" Content-Description: VmListModel.java Content-Disposition: attachment; filename="VmListModel.java"; size=114678; creation-date="Tue, 12 Mar 2013 08:37:27 GMT"; modification-date="Tue, 12 Mar 2013 08:29:15 GMT" Content-Transfer-Encoding: base64 cGFja2FnZSBvcmcub3ZpcnQuZW5naW5lLnVpLnVpY29tbW9ud2ViLm1vZGVscy52bXM7CgppbXBv cnQgamF2YS51dGlsLkFycmF5TGlzdDsKaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CmltcG9ydCBq YXZhLnV0aWwuSGFzaE1hcDsKaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwppbXBvcnQgamF2 YS51dGlsLkxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuTWFwOwppbXBvcnQgamF2YS51dGlsLk1hcC5F bnRyeTsKCmltcG9ydCBvcmcub3ZpcnQuZW5naW5lLmNvcmUuY29tbW9uLlZkY0FjdGlvblV0aWxz OwppbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS5jb3JlLmNvbW1vbi5hY3Rpb24uQWRkVm1Gcm9tU2Ny YXRjaFBhcmFtZXRlcnM7CmltcG9ydCBvcmcub3ZpcnQuZW5naW5lLmNvcmUuY29tbW9uLmFjdGlv bi5BZGRWbUZyb21UZW1wbGF0ZVBhcmFtZXRlcnM7CmltcG9ydCBvcmcub3ZpcnQuZW5naW5lLmNv cmUuY29tbW9uLmFjdGlvbi5BZGRWbVRlbXBsYXRlUGFyYW1ldGVyczsKaW1wb3J0IG9yZy5vdmly dC5lbmdpbmUuY29yZS5jb21tb24uYWN0aW9uLkF0dGFjaEVudGl0eVRvVGFnUGFyYW1ldGVyczsK aW1wb3J0IG9yZy5vdmlydC5lbmdpbmUuY29yZS5jb21tb24uYWN0aW9uLkNoYW5nZURpc2tDb21t YW5kUGFyYW1ldGVyczsKaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUuY29yZS5jb21tb24uYWN0aW9u LkNoYW5nZVZNQ2x1c3RlclBhcmFtZXRlcnM7CmltcG9ydCBvcmcub3ZpcnQuZW5naW5lLmNvcmUu Y29tbW9uLmFjdGlvbi5IaWJlcm5hdGVWbVBhcmFtZXRlcnM7CmltcG9ydCBvcmcub3ZpcnQuZW5n aW5lLmNvcmUuY29tbW9uLmFjdGlvbi5NaWdyYXRlVm1QYXJhbWV0ZXJzOwppbXBvcnQgb3JnLm92 aXJ0LmVuZ2luZS5jb3JlLmNvbW1vbi5hY3Rpb24uTWlncmF0ZVZtVG9TZXJ2ZXJQYXJhbWV0ZXJz OwppbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS5jb3JlLmNvbW1vbi5hY3Rpb24uTW92ZVZtUGFyYW1l dGVyczsKaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUuY29yZS5jb21tb24uYWN0aW9uLlJlbW92ZVZt UGFyYW1ldGVyczsKaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUuY29yZS5jb21tb24uYWN0aW9uLlJ1 blZtT25jZVBhcmFtczsKaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUuY29yZS5jb21tb24uYWN0aW9u LlJ1blZtUGFyYW1zOwppbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS5jb3JlLmNvbW1vbi5hY3Rpb24u U2h1dGRvd25WbVBhcmFtZXRlcnM7CmltcG9ydCBvcmcub3ZpcnQuZW5naW5lLmNvcmUuY29tbW9u LmFjdGlvbi5TdG9wVm1QYXJhbWV0ZXJzOwppbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS5jb3JlLmNv bW1vbi5hY3Rpb24uU3RvcFZtVHlwZUVudW07CmltcG9ydCBvcmcub3ZpcnQuZW5naW5lLmNvcmUu Y29tbW9uLmFjdGlvbi5WZGNBY3Rpb25QYXJhbWV0ZXJzQmFzZTsKaW1wb3J0IG9yZy5vdmlydC5l bmdpbmUuY29yZS5jb21tb24uYWN0aW9uLlZkY0FjdGlvblR5cGU7CmltcG9ydCBvcmcub3ZpcnQu ZW5naW5lLmNvcmUuY29tbW9uLmFjdGlvbi5WZGNSZXR1cm5WYWx1ZUJhc2U7CmltcG9ydCBvcmcu b3ZpcnQuZW5naW5lLmNvcmUuY29tbW9uLmFjdGlvbi5WbU1hbmFnZW1lbnRQYXJhbWV0ZXJzQmFz ZTsKaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUuY29yZS5jb21tb24uYWN0aW9uLlZtT3BlcmF0aW9u UGFyYW1ldGVyQmFzZTsKaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUuY29yZS5jb21tb24uYnVzaW5l c3NlbnRpdGllcy5EaXNrOwppbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS5jb3JlLmNvbW1vbi5idXNp bmVzc2VudGl0aWVzLkRpc2suRGlza1N0b3JhZ2VUeXBlOwppbXBvcnQgb3JnLm92aXJ0LmVuZ2lu ZS5jb3JlLmNvbW1vbi5idXNpbmVzc2VudGl0aWVzLkRpc2tJbWFnZTsKaW1wb3J0IG9yZy5vdmly dC5lbmdpbmUuY29yZS5jb21tb24uYnVzaW5lc3NlbnRpdGllcy5EaXNwbGF5VHlwZTsKaW1wb3J0 IG9yZy5vdmlydC5lbmdpbmUuY29yZS5jb21tb24uYnVzaW5lc3NlbnRpdGllcy5NaWdyYXRpb25T dXBwb3J0OwppbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS5jb3JlLmNvbW1vbi5idXNpbmVzc2VudGl0 aWVzLlF1b3RhOwppbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS5jb3JlLmNvbW1vbi5idXNpbmVzc2Vu dGl0aWVzLlVzYlBvbGljeTsKaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUuY29yZS5jb21tb24uYnVz aW5lc3NlbnRpdGllcy5WRFM7CmltcG9ydCBvcmcub3ZpcnQuZW5naW5lLmNvcmUuY29tbW9uLmJ1 c2luZXNzZW50aXRpZXMuVkRTR3JvdXA7CmltcG9ydCBvcmcub3ZpcnQuZW5naW5lLmNvcmUuY29t bW9uLmJ1c2luZXNzZW50aXRpZXMuVk07CmltcG9ydCBvcmcub3ZpcnQuZW5naW5lLmNvcmUuY29t bW9uLmJ1c2luZXNzZW50aXRpZXMuVm1Pc1R5cGU7CmltcG9ydCBvcmcub3ZpcnQuZW5naW5lLmNv cmUuY29tbW9uLmJ1c2luZXNzZW50aXRpZXMuVm1UZW1wbGF0ZTsKaW1wb3J0IG9yZy5vdmlydC5l bmdpbmUuY29yZS5jb21tb24uYnVzaW5lc3NlbnRpdGllcy5WbVR5cGU7CmltcG9ydCBvcmcub3Zp cnQuZW5naW5lLmNvcmUuY29tbW9uLmJ1c2luZXNzZW50aXRpZXMuVm9sdW1lVHlwZTsKaW1wb3J0 IG9yZy5vdmlydC5lbmdpbmUuY29yZS5jb21tb24uYnVzaW5lc3NlbnRpdGllcy5zdG9yYWdlX2Rv bWFpbnM7CmltcG9ydCBvcmcub3ZpcnQuZW5naW5lLmNvcmUuY29tbW9uLmJ1c2luZXNzZW50aXRp ZXMuc3RvcmFnZV9wb29sOwppbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS5jb3JlLmNvbW1vbi5idXNp bmVzc2VudGl0aWVzLm5ldHdvcmsuVm1OZXR3b3JrSW50ZXJmYWNlOwppbXBvcnQgb3JnLm92aXJ0 LmVuZ2luZS5jb3JlLmNvbW1vbi5pbnRlcmZhY2VzLlNlYXJjaFR5cGU7CmltcG9ydCBvcmcub3Zp cnQuZW5naW5lLmNvcmUuY29tbW9uLm1vZGUuQXBwbGljYXRpb25Nb2RlOwppbXBvcnQgb3JnLm92 aXJ0LmVuZ2luZS5jb3JlLmNvbW1vbi5xdWVyaWVzLkdldEFsbERpc2tzQnlWbUlkUGFyYW1ldGVy czsKaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUuY29yZS5jb21tb24ucXVlcmllcy5JZFF1ZXJ5UGFy YW1ldGVyczsKaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUuY29yZS5jb21tb24ucXVlcmllcy5TZWFy Y2hQYXJhbWV0ZXJzOwppbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS5jb3JlLmNvbW1vbi5xdWVyaWVz LlZkY1F1ZXJ5UGFyYW1ldGVyc0Jhc2U7CmltcG9ydCBvcmcub3ZpcnQuZW5naW5lLmNvcmUuY29t bW9uLnF1ZXJpZXMuVmRjUXVlcnlSZXR1cm5WYWx1ZTsKaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUu Y29yZS5jb21tb24ucXVlcmllcy5WZGNRdWVyeVR5cGU7CmltcG9ydCBvcmcub3ZpcnQuZW5naW5l LmNvcmUuY29tcGF0LkV2ZW50OwppbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS5jb3JlLmNvbXBhdC5F dmVudEFyZ3M7CmltcG9ydCBvcmcub3ZpcnQuZW5naW5lLmNvcmUuY29tcGF0Lkd1aWQ7CmltcG9y dCBvcmcub3ZpcnQuZW5naW5lLmNvcmUuY29tcGF0Lk5HdWlkOwppbXBvcnQgb3JnLm92aXJ0LmVu Z2luZS5jb3JlLmNvbXBhdC5PYnNlcnZhYmxlQ29sbGVjdGlvbjsKaW1wb3J0IG9yZy5vdmlydC5l bmdpbmUuY29yZS5jb21wYXQuUHJvcGVydHlDaGFuZ2VkRXZlbnRBcmdzOwppbXBvcnQgb3JnLm92 aXJ0LmVuZ2luZS5jb3JlLmNvbXBhdC5TdHJpbmdIZWxwZXI7CmltcG9ydCBvcmcub3ZpcnQuZW5n aW5lLmNvcmUuY29tcGF0LlZlcnNpb247CmltcG9ydCBvcmcub3ZpcnQuZW5naW5lLmNvcmUuc2Vh cmNoYmFja2VuZC5TZWFyY2hPYmplY3RzOwppbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS51aS5mcm9u dGVuZC5Bc3luY1F1ZXJ5OwppbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS51aS5mcm9udGVuZC5Gcm9u dGVuZDsKaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUudWkuZnJvbnRlbmQuSU5ld0FzeW5jQ2FsbGJh Y2s7CmltcG9ydCBvcmcub3ZpcnQuZW5naW5lLnVpLnVpY29tbW9ud2ViLkNsb25lcjsKaW1wb3J0 IG9yZy5vdmlydC5lbmdpbmUudWkudWljb21tb253ZWIuTGlucTsKaW1wb3J0IG9yZy5vdmlydC5l bmdpbmUudWkudWljb21tb253ZWIuVGFnc0VxdWFsaXR5Q29tcGFyZXI7CmltcG9ydCBvcmcub3Zp cnQuZW5naW5lLnVpLnVpY29tbW9ud2ViLlVJQ29tbWFuZDsKaW1wb3J0IG9yZy5vdmlydC5lbmdp bmUudWkudWljb21tb253ZWIuZGF0YXByb3ZpZGVyLkFzeW5jRGF0YVByb3ZpZGVyOwppbXBvcnQg b3JnLm92aXJ0LmVuZ2luZS51aS51aWNvbW1vbndlYi5tb2RlbHMuQ29uZmlybWF0aW9uTW9kZWw7 CmltcG9ydCBvcmcub3ZpcnQuZW5naW5lLnVpLnVpY29tbW9ud2ViLm1vZGVscy5FbnRpdHlNb2Rl bDsKaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUudWkudWljb21tb253ZWIubW9kZWxzLklTdXBwb3J0 U3lzdGVtVHJlZUNvbnRleHQ7CmltcG9ydCBvcmcub3ZpcnQuZW5naW5lLnVpLnVpY29tbW9ud2Vi Lm1vZGVscy5Nb2RlbDsKaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUudWkudWljb21tb253ZWIubW9k ZWxzLlN5c3RlbVRyZWVJdGVtTW9kZWw7CmltcG9ydCBvcmcub3ZpcnQuZW5naW5lLnVpLnVpY29t bW9ud2ViLm1vZGVscy5jb25maWd1cmUuQ2hhbmdlQ0RNb2RlbDsKaW1wb3J0IG9yZy5vdmlydC5l bmdpbmUudWkudWljb21tb253ZWIubW9kZWxzLmNvbmZpZ3VyZS5QZXJtaXNzaW9uTGlzdE1vZGVs OwppbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS51aS51aWNvbW1vbndlYi5tb2RlbHMudGFncy5UYWdM aXN0TW9kZWw7CmltcG9ydCBvcmcub3ZpcnQuZW5naW5lLnVpLnVpY29tbW9ud2ViLm1vZGVscy50 YWdzLlRhZ01vZGVsOwppbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS51aS51aWNvbW1vbndlYi5tb2Rl bHMudGVtcGxhdGVzLlZtQmFzZUxpc3RNb2RlbDsKaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUudWku dWljb21tb253ZWIubW9kZWxzLnVzZXJwb3J0YWwuQXR0YWNoQ2RNb2RlbDsKaW1wb3J0IG9yZy5v dmlydC5lbmdpbmUudWkudWljb21wYXQuQXNzZW1ibHk7CmltcG9ydCBvcmcub3ZpcnQuZW5naW5l LnVpLnVpY29tcGF0LkNvbnN0YW50c01hbmFnZXI7CmltcG9ydCBvcmcub3ZpcnQuZW5naW5lLnVp LnVpY29tcGF0LkZyb250ZW5kQWN0aW9uQXN5bmNSZXN1bHQ7CmltcG9ydCBvcmcub3ZpcnQuZW5n aW5lLnVpLnVpY29tcGF0LkZyb250ZW5kTXVsdGlwbGVBY3Rpb25Bc3luY1Jlc3VsdDsKaW1wb3J0 IG9yZy5vdmlydC5lbmdpbmUudWkudWljb21wYXQuRnJvbnRlbmRNdWx0aXBsZVF1ZXJ5QXN5bmNS ZXN1bHQ7CmltcG9ydCBvcmcub3ZpcnQuZW5naW5lLnVpLnVpY29tcGF0LklGcm9udGVuZEFjdGlv bkFzeW5jQ2FsbGJhY2s7CmltcG9ydCBvcmcub3ZpcnQuZW5naW5lLnVpLnVpY29tcGF0LklGcm9u dGVuZE11bHRpcGxlQWN0aW9uQXN5bmNDYWxsYmFjazsKaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUu dWkudWljb21wYXQuSUZyb250ZW5kTXVsdGlwbGVRdWVyeUFzeW5jQ2FsbGJhY2s7CmltcG9ydCBv cmcub3ZpcnQuZW5naW5lLnVpLnVpY29tcGF0LlJlc291cmNlTWFuYWdlcjsKCnB1YmxpYyBjbGFz cyBWbUxpc3RNb2RlbCBleHRlbmRzIFZtQmFzZUxpc3RNb2RlbDxWTT4gaW1wbGVtZW50cyBJU3Vw cG9ydFN5c3RlbVRyZWVDb250ZXh0CnsKCiAgICBwcml2YXRlIFVJQ29tbWFuZCBwcml2YXRlTmV3 U2VydmVyQ29tbWFuZDsKCiAgICBwdWJsaWMgVUlDb21tYW5kIGdldE5ld1NlcnZlckNvbW1hbmQo KQogICAgewogICAgICAgIHJldHVybiBwcml2YXRlTmV3U2VydmVyQ29tbWFuZDsKICAgIH0KCiAg ICBwcml2YXRlIHZvaWQgc2V0TmV3U2VydmVyQ29tbWFuZChVSUNvbW1hbmQgdmFsdWUpCiAgICB7 CiAgICAgICAgcHJpdmF0ZU5ld1NlcnZlckNvbW1hbmQgPSB2YWx1ZTsKICAgIH0KCiAgICBwcml2 YXRlIFVJQ29tbWFuZCBwcml2YXRlTmV3RGVza3RvcENvbW1hbmQ7CgogICAgcHVibGljIFVJQ29t bWFuZCBnZXROZXdEZXNrdG9wQ29tbWFuZCgpCiAgICB7CiAgICAgICAgcmV0dXJuIHByaXZhdGVO ZXdEZXNrdG9wQ29tbWFuZDsKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgc2V0TmV3RGVza3RvcENv bW1hbmQoVUlDb21tYW5kIHZhbHVlKQogICAgewogICAgICAgIHByaXZhdGVOZXdEZXNrdG9wQ29t bWFuZCA9IHZhbHVlOwogICAgfQoKICAgIHByaXZhdGUgVUlDb21tYW5kIHByaXZhdGVFZGl0Q29t bWFuZDsKCiAgICBwdWJsaWMgVUlDb21tYW5kIGdldEVkaXRDb21tYW5kKCkKICAgIHsKICAgICAg ICByZXR1cm4gcHJpdmF0ZUVkaXRDb21tYW5kOwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBzZXRF ZGl0Q29tbWFuZChVSUNvbW1hbmQgdmFsdWUpCiAgICB7CiAgICAgICAgcHJpdmF0ZUVkaXRDb21t YW5kID0gdmFsdWU7CiAgICB9CgogICAgcHJpdmF0ZSBVSUNvbW1hbmQgcHJpdmF0ZVJlbW92ZUNv bW1hbmQ7CgogICAgcHVibGljIFVJQ29tbWFuZCBnZXRSZW1vdmVDb21tYW5kKCkKICAgIHsKICAg ICAgICByZXR1cm4gcHJpdmF0ZVJlbW92ZUNvbW1hbmQ7CiAgICB9CgogICAgcHJpdmF0ZSB2b2lk IHNldFJlbW92ZUNvbW1hbmQoVUlDb21tYW5kIHZhbHVlKQogICAgewogICAgICAgIHByaXZhdGVS ZW1vdmVDb21tYW5kID0gdmFsdWU7CiAgICB9CgogICAgcHJpdmF0ZSBVSUNvbW1hbmQgcHJpdmF0 ZVJ1bkNvbW1hbmQ7CgogICAgcHVibGljIFVJQ29tbWFuZCBnZXRSdW5Db21tYW5kKCkKICAgIHsK ICAgICAgICByZXR1cm4gcHJpdmF0ZVJ1bkNvbW1hbmQ7CiAgICB9CgogICAgcHJpdmF0ZSB2b2lk IHNldFJ1bkNvbW1hbmQoVUlDb21tYW5kIHZhbHVlKQogICAgewogICAgICAgIHByaXZhdGVSdW5D b21tYW5kID0gdmFsdWU7CiAgICB9CgogICAgcHJpdmF0ZSBVSUNvbW1hbmQgcHJpdmF0ZVBhdXNl Q29tbWFuZDsKCiAgICBwdWJsaWMgVUlDb21tYW5kIGdldFBhdXNlQ29tbWFuZCgpCiAgICB7CiAg ICAgICAgcmV0dXJuIHByaXZhdGVQYXVzZUNvbW1hbmQ7CiAgICB9CgogICAgcHJpdmF0ZSB2b2lk IHNldFBhdXNlQ29tbWFuZChVSUNvbW1hbmQgdmFsdWUpCiAgICB7CiAgICAgICAgcHJpdmF0ZVBh dXNlQ29tbWFuZCA9IHZhbHVlOwogICAgfQoKICAgIHByaXZhdGUgVUlDb21tYW5kIHByaXZhdGVT dG9wQ29tbWFuZDsKCiAgICBwdWJsaWMgVUlDb21tYW5kIGdldFN0b3BDb21tYW5kKCkKICAgIHsK ICAgICAgICByZXR1cm4gcHJpdmF0ZVN0b3BDb21tYW5kOwogICAgfQoKICAgIHByaXZhdGUgdm9p ZCBzZXRTdG9wQ29tbWFuZChVSUNvbW1hbmQgdmFsdWUpCiAgICB7CiAgICAgICAgcHJpdmF0ZVN0 b3BDb21tYW5kID0gdmFsdWU7CiAgICB9CgogICAgcHJpdmF0ZSBVSUNvbW1hbmQgcHJpdmF0ZVNo dXRkb3duQ29tbWFuZDsKCiAgICBwdWJsaWMgVUlDb21tYW5kIGdldFNodXRkb3duQ29tbWFuZCgp CiAgICB7CiAgICAgICAgcmV0dXJuIHByaXZhdGVTaHV0ZG93bkNvbW1hbmQ7CiAgICB9CgogICAg cHJpdmF0ZSB2b2lkIHNldFNodXRkb3duQ29tbWFuZChVSUNvbW1hbmQgdmFsdWUpCiAgICB7CiAg ICAgICAgcHJpdmF0ZVNodXRkb3duQ29tbWFuZCA9IHZhbHVlOwogICAgfQoKICAgIHByaXZhdGUg VUlDb21tYW5kIHByaXZhdGVDYW5jZWxNaWdyYXRlQ29tbWFuZDsKCiAgICBwdWJsaWMgVUlDb21t YW5kIGdldENhbmNlbE1pZ3JhdGVDb21tYW5kKCkgewogICAgICAgIHJldHVybiBwcml2YXRlQ2Fu Y2VsTWlncmF0ZUNvbW1hbmQ7CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIHNldENhbmNlbE1pZ3Jh dGVDb21tYW5kKFVJQ29tbWFuZCB2YWx1ZSkgewogICAgICAgIHByaXZhdGVDYW5jZWxNaWdyYXRl Q29tbWFuZCA9IHZhbHVlOwogICAgfQoKICAgIHByaXZhdGUgVUlDb21tYW5kIHByaXZhdGVNaWdy YXRlQ29tbWFuZDsKCiAgICBwdWJsaWMgVUlDb21tYW5kIGdldE1pZ3JhdGVDb21tYW5kKCkKICAg IHsKICAgICAgICByZXR1cm4gcHJpdmF0ZU1pZ3JhdGVDb21tYW5kOwogICAgfQoKICAgIHByaXZh dGUgdm9pZCBzZXRNaWdyYXRlQ29tbWFuZChVSUNvbW1hbmQgdmFsdWUpCiAgICB7CiAgICAgICAg cHJpdmF0ZU1pZ3JhdGVDb21tYW5kID0gdmFsdWU7CiAgICB9CgogICAgcHJpdmF0ZSBVSUNvbW1h bmQgcHJpdmF0ZU5ld1RlbXBsYXRlQ29tbWFuZDsKCiAgICBwdWJsaWMgVUlDb21tYW5kIGdldE5l d1RlbXBsYXRlQ29tbWFuZCgpCiAgICB7CiAgICAgICAgcmV0dXJuIHByaXZhdGVOZXdUZW1wbGF0 ZUNvbW1hbmQ7CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIHNldE5ld1RlbXBsYXRlQ29tbWFuZChV SUNvbW1hbmQgdmFsdWUpCiAgICB7CiAgICAgICAgcHJpdmF0ZU5ld1RlbXBsYXRlQ29tbWFuZCA9 IHZhbHVlOwogICAgfQoKICAgIHByaXZhdGUgVUlDb21tYW5kIHByaXZhdGVSdW5PbmNlQ29tbWFu ZDsKCiAgICBwdWJsaWMgVUlDb21tYW5kIGdldFJ1bk9uY2VDb21tYW5kKCkKICAgIHsKICAgICAg ICByZXR1cm4gcHJpdmF0ZVJ1bk9uY2VDb21tYW5kOwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBz ZXRSdW5PbmNlQ29tbWFuZChVSUNvbW1hbmQgdmFsdWUpCiAgICB7CiAgICAgICAgcHJpdmF0ZVJ1 bk9uY2VDb21tYW5kID0gdmFsdWU7CiAgICB9CgogICAgcHJpdmF0ZSBVSUNvbW1hbmQgcHJpdmF0 ZUV4cG9ydENvbW1hbmQ7CgogICAgcHVibGljIFVJQ29tbWFuZCBnZXRFeHBvcnRDb21tYW5kKCkK ICAgIHsKICAgICAgICByZXR1cm4gcHJpdmF0ZUV4cG9ydENvbW1hbmQ7CiAgICB9CgogICAgcHJp dmF0ZSB2b2lkIHNldEV4cG9ydENvbW1hbmQoVUlDb21tYW5kIHZhbHVlKQogICAgewogICAgICAg IHByaXZhdGVFeHBvcnRDb21tYW5kID0gdmFsdWU7CiAgICB9CgogICAgcHJpdmF0ZSBVSUNvbW1h bmQgcHJpdmF0ZU1vdmVDb21tYW5kOwoKICAgIHB1YmxpYyBVSUNvbW1hbmQgZ2V0TW92ZUNvbW1h bmQoKQogICAgewogICAgICAgIHJldHVybiBwcml2YXRlTW92ZUNvbW1hbmQ7CiAgICB9CgogICAg cHJpdmF0ZSB2b2lkIHNldE1vdmVDb21tYW5kKFVJQ29tbWFuZCB2YWx1ZSkKICAgIHsKICAgICAg ICBwcml2YXRlTW92ZUNvbW1hbmQgPSB2YWx1ZTsKICAgIH0KCiAgICBwcml2YXRlIFVJQ29tbWFu ZCBwcml2YXRlUmV0cmlldmVJc29JbWFnZXNDb21tYW5kOwoKICAgIHB1YmxpYyBVSUNvbW1hbmQg Z2V0UmV0cmlldmVJc29JbWFnZXNDb21tYW5kKCkKICAgIHsKICAgICAgICByZXR1cm4gcHJpdmF0 ZVJldHJpZXZlSXNvSW1hZ2VzQ29tbWFuZDsKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgc2V0UmV0 cmlldmVJc29JbWFnZXNDb21tYW5kKFVJQ29tbWFuZCB2YWx1ZSkKICAgIHsKICAgICAgICBwcml2 YXRlUmV0cmlldmVJc29JbWFnZXNDb21tYW5kID0gdmFsdWU7CiAgICB9CgogICAgcHJpdmF0ZSBV SUNvbW1hbmQgcHJpdmF0ZUd1aWRlQ29tbWFuZDsKCiAgICBwdWJsaWMgVUlDb21tYW5kIGdldEd1 aWRlQ29tbWFuZCgpCiAgICB7CiAgICAgICAgcmV0dXJuIHByaXZhdGVHdWlkZUNvbW1hbmQ7CiAg ICB9CgogICAgcHJpdmF0ZSB2b2lkIHNldEd1aWRlQ29tbWFuZChVSUNvbW1hbmQgdmFsdWUpCiAg ICB7CiAgICAgICAgcHJpdmF0ZUd1aWRlQ29tbWFuZCA9IHZhbHVlOwogICAgfQoKICAgIHByaXZh dGUgVUlDb21tYW5kIHByaXZhdGVDaGFuZ2VDZENvbW1hbmQ7CgogICAgcHVibGljIFVJQ29tbWFu ZCBnZXRDaGFuZ2VDZENvbW1hbmQoKQogICAgewogICAgICAgIHJldHVybiBwcml2YXRlQ2hhbmdl Q2RDb21tYW5kOwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBzZXRDaGFuZ2VDZENvbW1hbmQoVUlD b21tYW5kIHZhbHVlKQogICAgewogICAgICAgIHByaXZhdGVDaGFuZ2VDZENvbW1hbmQgPSB2YWx1 ZTsKICAgIH0KCiAgICBwcml2YXRlIFVJQ29tbWFuZCBwcml2YXRlQXNzaWduVGFnc0NvbW1hbmQ7 CgogICAgcHVibGljIFVJQ29tbWFuZCBnZXRBc3NpZ25UYWdzQ29tbWFuZCgpCiAgICB7CiAgICAg ICAgcmV0dXJuIHByaXZhdGVBc3NpZ25UYWdzQ29tbWFuZDsKICAgIH0KCiAgICBwcml2YXRlIHZv aWQgc2V0QXNzaWduVGFnc0NvbW1hbmQoVUlDb21tYW5kIHZhbHVlKQogICAgewogICAgICAgIHBy aXZhdGVBc3NpZ25UYWdzQ29tbWFuZCA9IHZhbHVlOwogICAgfQoKICAgIHByaXZhdGUgTW9kZWwg ZXJyb3JXaW5kb3c7CgogICAgcHVibGljIE1vZGVsIGdldEVycm9yV2luZG93KCkKICAgIHsKICAg ICAgICByZXR1cm4gZXJyb3JXaW5kb3c7CiAgICB9CgogICAgcHVibGljIHZvaWQgc2V0RXJyb3JX aW5kb3coTW9kZWwgdmFsdWUpCiAgICB7CiAgICAgICAgaWYgKGVycm9yV2luZG93ICE9IHZhbHVl KQogICAgICAgIHsKICAgICAgICAgICAgZXJyb3JXaW5kb3cgPSB2YWx1ZTsKICAgICAgICAgICAg T25Qcm9wZXJ0eUNoYW5nZWQobmV3IFByb3BlcnR5Q2hhbmdlZEV2ZW50QXJncygiRXJyb3JXaW5k b3ciKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSBDb25zb2xl TW9kZWwgZGVmYXVsdENvbnNvbGVNb2RlbDsKCiAgICBwdWJsaWMgQ29uc29sZU1vZGVsIGdldERl ZmF1bHRDb25zb2xlTW9kZWwoKQogICAgewogICAgICAgIHJldHVybiBkZWZhdWx0Q29uc29sZU1v ZGVsOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRDb25zb2xlTW9kZWwoQ29uc29s ZU1vZGVsIHZhbHVlKQogICAgewogICAgICAgIGlmIChkZWZhdWx0Q29uc29sZU1vZGVsICE9IHZh bHVlKQogICAgICAgIHsKICAgICAgICAgICAgZGVmYXVsdENvbnNvbGVNb2RlbCA9IHZhbHVlOwog ICAgICAgICAgICBPblByb3BlcnR5Q2hhbmdlZChuZXcgUHJvcGVydHlDaGFuZ2VkRXZlbnRBcmdz KCJEZWZhdWx0Q29uc29sZU1vZGVsIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgfQogICAgfQoK ICAgIHByaXZhdGUgQ29uc29sZU1vZGVsIGFkZGl0aW9uYWxDb25zb2xlTW9kZWw7CgogICAgcHVi bGljIENvbnNvbGVNb2RlbCBnZXRBZGRpdGlvbmFsQ29uc29sZU1vZGVsKCkKICAgIHsKICAgICAg ICByZXR1cm4gYWRkaXRpb25hbENvbnNvbGVNb2RlbDsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBz ZXRBZGRpdGlvbmFsQ29uc29sZU1vZGVsKENvbnNvbGVNb2RlbCB2YWx1ZSkKICAgIHsKICAgICAg ICBpZiAoYWRkaXRpb25hbENvbnNvbGVNb2RlbCAhPSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAg ICAgIGFkZGl0aW9uYWxDb25zb2xlTW9kZWwgPSB2YWx1ZTsKICAgICAgICAgICAgT25Qcm9wZXJ0 eUNoYW5nZWQobmV3IFByb3BlcnR5Q2hhbmdlZEV2ZW50QXJncygiQWRkaXRpb25hbENvbnNvbGVN b2RlbCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgIH0KICAgIH0KCiAgICBwcml2YXRlIGJvb2xl YW4gaGFzQWRkaXRpb25hbENvbnNvbGVNb2RlbDsKCiAgICBwdWJsaWMgYm9vbGVhbiBnZXRIYXNB ZGRpdGlvbmFsQ29uc29sZU1vZGVsKCkKICAgIHsKICAgICAgICByZXR1cm4gaGFzQWRkaXRpb25h bENvbnNvbGVNb2RlbDsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBzZXRIYXNBZGRpdGlvbmFsQ29u c29sZU1vZGVsKGJvb2xlYW4gdmFsdWUpCiAgICB7CiAgICAgICAgaWYgKGhhc0FkZGl0aW9uYWxD b25zb2xlTW9kZWwgIT0gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBoYXNBZGRpdGlvbmFs Q29uc29sZU1vZGVsID0gdmFsdWU7CiAgICAgICAgICAgIE9uUHJvcGVydHlDaGFuZ2VkKG5ldyBQ cm9wZXJ0eUNoYW5nZWRFdmVudEFyZ3MoIkhhc0FkZGl0aW9uYWxDb25zb2xlTW9kZWwiKSk7IC8v JE5PTi1OTFMtMSQKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIE9ic2VydmFibGVDb2xsZWN0 aW9uPENoYW5nZUNETW9kZWw+IGlzb0ltYWdlczsKCiAgICBwdWJsaWMgT2JzZXJ2YWJsZUNvbGxl Y3Rpb248Q2hhbmdlQ0RNb2RlbD4gZ2V0SXNvSW1hZ2VzKCkKICAgIHsKICAgICAgICByZXR1cm4g aXNvSW1hZ2VzOwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBzZXRJc29JbWFnZXMoT2JzZXJ2YWJs ZUNvbGxlY3Rpb248Q2hhbmdlQ0RNb2RlbD4gdmFsdWUpCiAgICB7CiAgICAgICAgaWYgKChpc29J bWFnZXMgPT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB8fCAoaXNvSW1hZ2VzICE9IG51bGwgJiYg IWlzb0ltYWdlcy5lcXVhbHModmFsdWUpKSkKICAgICAgICB7CiAgICAgICAgICAgIGlzb0ltYWdl cyA9IHZhbHVlOwogICAgICAgICAgICBPblByb3BlcnR5Q2hhbmdlZChuZXcgUHJvcGVydHlDaGFu Z2VkRXZlbnRBcmdzKCJJc29JbWFnZXMiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICB9CiAgICB9 CgogICAgLy8gZ2V0IHsgcmV0dXJuIFNlbGVjdGVkSXRlbXMgPT0gbnVsbCA/IG5ldyBvYmplY3Rb MF0gOiBTZWxlY3RlZEl0ZW1zLkNhc3Q8Vk0+KCkuU2VsZWN0KGEgPT4KICAgIC8vIGEudm1fZ3Vp ZCkuQ2FzdDxvYmplY3Q+KCkuVG9BcnJheSgpOyB9CiAgICBwcm90ZWN0ZWQgT2JqZWN0W10gZ2V0 U2VsZWN0ZWRLZXlzKCkKICAgIHsKICAgICAgICBpZiAoZ2V0U2VsZWN0ZWRJdGVtcygpID09IG51 bGwpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdFswXTsKICAgICAgICB9 CgogICAgICAgIE9iamVjdFtdIGtleXMgPSBuZXcgT2JqZWN0W2dldFNlbGVjdGVkSXRlbXMoKS5z aXplKCldOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ2V0U2VsZWN0ZWRJdGVtcygpLnNp emUoKTsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAga2V5c1tpXSA9ICgoVk0pIGdldFNlbGVj dGVkSXRlbXMoKS5nZXQoaSkpLmdldElkKCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4ga2V5 czsKICAgIH0KCiAgICBwcml2YXRlIE9iamVjdCBwcml2YXRlR3VpZGVDb250ZXh0OwoKICAgIHB1 YmxpYyBPYmplY3QgZ2V0R3VpZGVDb250ZXh0KCkKICAgIHsKICAgICAgICByZXR1cm4gcHJpdmF0 ZUd1aWRlQ29udGV4dDsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBzZXRHdWlkZUNvbnRleHQoT2Jq ZWN0IHZhbHVlKQogICAgewogICAgICAgIHByaXZhdGVHdWlkZUNvbnRleHQgPSB2YWx1ZTsKICAg IH0KCiAgICBwcml2YXRlIFZNIHByaXZhdGVjdXJyZW50Vm07CgogICAgcHVibGljIFZNIGdldGN1 cnJlbnRWbSgpCiAgICB7CiAgICAgICAgcmV0dXJuIHByaXZhdGVjdXJyZW50Vm07CiAgICB9Cgog ICAgcHVibGljIHZvaWQgc2V0Y3VycmVudFZtKFZNIHZhbHVlKQogICAgewogICAgICAgIHByaXZh dGVjdXJyZW50Vm0gPSB2YWx1ZTsKICAgIH0KCiAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8R3Vp ZCwgQXJyYXlMaXN0PENvbnNvbGVNb2RlbD4+IGNhY2hlZENvbnNvbGVNb2RlbHM7CgogICAgcHJp dmF0ZSBIYXNoTWFwPFZlcnNpb24sIEFycmF5TGlzdDxTdHJpbmc+PiBwcml2YXRlQ3VzdG9tUHJv cGVydGllc0tleXNMaXN0OwoKICAgIHByaXZhdGUgSGFzaE1hcDxWZXJzaW9uLCBBcnJheUxpc3Q8 U3RyaW5nPj4gZ2V0Q3VzdG9tUHJvcGVydGllc0tleXNMaXN0KCkgewogICAgICAgIHJldHVybiBw cml2YXRlQ3VzdG9tUHJvcGVydGllc0tleXNMaXN0OwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBz ZXRDdXN0b21Qcm9wZXJ0aWVzS2V5c0xpc3QoSGFzaE1hcDxWZXJzaW9uLCBBcnJheUxpc3Q8U3Ry aW5nPj4gdmFsdWUpIHsKICAgICAgICBwcml2YXRlQ3VzdG9tUHJvcGVydGllc0tleXNMaXN0ID0g dmFsdWU7CiAgICB9CgogICAgcHVibGljIFZtTGlzdE1vZGVsKCkKICAgIHsKICAgICAgICBzZXRU aXRsZShDb25zdGFudHNNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0Q29uc3RhbnRzKCkudmlydHVh bE1hY2hpbmVzVGl0bGUoKSk7CiAgICAgICAgc2V0SGFzaE5hbWUoInZpcnR1YWxfbWFjaGluZXMi KTsgLy8kTk9OLU5MUy0xJAoKICAgICAgICBzZXREZWZhdWx0U2VhcmNoU3RyaW5nKCJWbXM6Iik7 IC8vJE5PTi1OTFMtMSQKICAgICAgICBzZXRTZWFyY2hTdHJpbmcoZ2V0RGVmYXVsdFNlYXJjaFN0 cmluZygpKTsKICAgICAgICBzZXRTZWFyY2hPYmplY3RzKG5ldyBTdHJpbmdbXSB7IFNlYXJjaE9i amVjdHMuVk1fT0JKX05BTUUsIFNlYXJjaE9iamVjdHMuVk1fUExVX09CSl9OQU1FIH0pOwogICAg ICAgIHNldEF2YWlsYWJsZUluTW9kZXMoQXBwbGljYXRpb25Nb2RlLlZpcnRPbmx5KTsKCiAgICAg ICAgY2FjaGVkQ29uc29sZU1vZGVscyA9IG5ldyBIYXNoTWFwPEd1aWQsIEFycmF5TGlzdDxDb25z b2xlTW9kZWw+PigpOwoKICAgICAgICBzZXROZXdTZXJ2ZXJDb21tYW5kKG5ldyBVSUNvbW1hbmQo Ik5ld1NlcnZlciIsIHRoaXMpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgIHNldE5ld0Rlc2t0b3BD b21tYW5kKG5ldyBVSUNvbW1hbmQoIk5ld0Rlc2t0b3AiLCB0aGlzKSk7IC8vJE5PTi1OTFMtMSQK ICAgICAgICBzZXRFZGl0Q29tbWFuZChuZXcgVUlDb21tYW5kKCJFZGl0IiwgdGhpcykpOyAvLyRO T04tTkxTLTEkCiAgICAgICAgc2V0UmVtb3ZlQ29tbWFuZChuZXcgVUlDb21tYW5kKCJSZW1vdmUi LCB0aGlzKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICBzZXRSdW5Db21tYW5kKG5ldyBVSUNvbW1h bmQoIlJ1biIsIHRoaXMsIHRydWUpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgIHNldFBhdXNlQ29t bWFuZChuZXcgVUlDb21tYW5kKCJQYXVzZSIsIHRoaXMpKTsgLy8kTk9OLU5MUy0xJAogICAgICAg IHNldFN0b3BDb21tYW5kKG5ldyBVSUNvbW1hbmQoIlN0b3AiLCB0aGlzKSk7IC8vJE5PTi1OTFMt MSQKICAgICAgICBzZXRTaHV0ZG93bkNvbW1hbmQobmV3IFVJQ29tbWFuZCgiU2h1dGRvd24iLCB0 aGlzKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICBzZXRNaWdyYXRlQ29tbWFuZChuZXcgVUlDb21t YW5kKCJNaWdyYXRlIiwgdGhpcykpOyAvLyROT04tTkxTLTEkCiAgICAgICAgc2V0Q2FuY2VsTWln cmF0ZUNvbW1hbmQobmV3IFVJQ29tbWFuZCgiQ2FuY2VsTWlncmF0aW9uIiwgdGhpcykpOyAvLyRO T04tTkxTLTEkCiAgICAgICAgc2V0TmV3VGVtcGxhdGVDb21tYW5kKG5ldyBVSUNvbW1hbmQoIk5l d1RlbXBsYXRlIiwgdGhpcykpOyAvLyROT04tTkxTLTEkCiAgICAgICAgc2V0UnVuT25jZUNvbW1h bmQobmV3IFVJQ29tbWFuZCgiUnVuT25jZSIsIHRoaXMpKTsgLy8kTk9OLU5MUy0xJAogICAgICAg IHNldEV4cG9ydENvbW1hbmQobmV3IFVJQ29tbWFuZCgiRXhwb3J0IiwgdGhpcykpOyAvLyROT04t TkxTLTEkCiAgICAgICAgc2V0TW92ZUNvbW1hbmQobmV3IFVJQ29tbWFuZCgiTW92ZSIsIHRoaXMp KTsgLy8kTk9OLU5MUy0xJAogICAgICAgIHNldEd1aWRlQ29tbWFuZChuZXcgVUlDb21tYW5kKCJH dWlkZSIsIHRoaXMpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgIHNldFJldHJpZXZlSXNvSW1hZ2Vz Q29tbWFuZChuZXcgVUlDb21tYW5kKCJSZXRyaWV2ZUlzb0ltYWdlcyIsIHRoaXMpKTsgLy8kTk9O LU5MUy0xJAogICAgICAgIHNldENoYW5nZUNkQ29tbWFuZChuZXcgVUlDb21tYW5kKCJDaGFuZ2VD RCIsIHRoaXMpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgIHNldEFzc2lnblRhZ3NDb21tYW5kKG5l dyBVSUNvbW1hbmQoIkFzc2lnblRhZ3MiLCB0aGlzKSk7IC8vJE5PTi1OTFMtMSQKCiAgICAgICAg c2V0SXNvSW1hZ2VzKG5ldyBPYnNlcnZhYmxlQ29sbGVjdGlvbjxDaGFuZ2VDRE1vZGVsPigpKTsK ICAgICAgICBDaGFuZ2VDRE1vZGVsIHRlbXBWYXIgPSBuZXcgQ2hhbmdlQ0RNb2RlbCgpOwogICAg ICAgIHRlbXBWYXIuc2V0VGl0bGUoQ29uc3RhbnRzTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldENv bnN0YW50cygpLnJldHJpZXZpbmdDRHNUaXRsZSgpKTsKICAgICAgICBnZXRJc29JbWFnZXMoKS5h ZGQodGVtcFZhcik7CgogICAgICAgIFVwZGF0ZUFjdGlvbkF2YWlsYWJpbGl0eSgpOwoKICAgICAg ICBnZXRTZWFyY2hOZXh0UGFnZUNvbW1hbmQoKS5zZXRJc0F2YWlsYWJsZSh0cnVlKTsKICAgICAg ICBnZXRTZWFyY2hQcmV2aW91c1BhZ2VDb21tYW5kKCkuc2V0SXNBdmFpbGFibGUodHJ1ZSk7CiAg ICAgICAgaWYgKGdldEN1c3RvbVByb3BlcnRpZXNLZXlzTGlzdCgpID09IG51bGwpIHsKICAgICAg ICAgICAgQXN5bmNEYXRhUHJvdmlkZXIuR2V0Q3VzdG9tUHJvcGVydGllc0xpc3QobmV3IEFzeW5j UXVlcnkodGhpcywKICAgICAgICAgICAgICAgICAgICBuZXcgSU5ld0FzeW5jQ2FsbGJhY2soKSB7 CiAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgICAgICAgICAg ICBwdWJsaWMgdm9pZCBPblN1Y2Nlc3MoT2JqZWN0IHRhcmdldCwgT2JqZWN0IHJldHVyblZhbHVl KSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgVm1MaXN0TW9kZWwgbW9kZWwgPSAoVm1M aXN0TW9kZWwpIHRhcmdldDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR1cm5W YWx1ZSAhPSBudWxsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIG1vZGVsLnNldEN1c3RvbVByb3BlcnRpZXNLZXlzTGlzdChuZXcg SGFzaE1hcDxWZXJzaW9uLCBBcnJheUxpc3Q8U3RyaW5nPj4oKSk7CiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgSGFzaE1hcDxWZXJzaW9uLCBTdHJpbmc+IGRpY3Rpb25hcnkgPSAoSGFz aE1hcDxWZXJzaW9uLCBTdHJpbmc+KSByZXR1cm5WYWx1ZTsKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxWZXJzaW9uLCBTdHJpbmc+IGtleVZhbHVlUGFpciA6 IGRpY3Rpb25hcnkuZW50cnlTZXQoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7 CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmdldEN1c3RvbVByb3Bl cnRpZXNLZXlzTGlzdCgpLnB1dChrZXlWYWx1ZVBhaXIuZ2V0S2V5KCksCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOwog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBzIDoga2V5VmFs dWVQYWlyLmdldFZhbHVlKCkuc3BsaXQoIls7XSIsIC0xKSkgLy8kTk9OLU5MUy0xJAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBtb2RlbC5nZXRDdXN0b21Qcm9wZXJ0aWVzS2V5c0xpc3QoKS5nZXQoa2V5 VmFsdWVQYWlyLmdldEtleSgpKS5hZGQocyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAg ICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAg ICAgICB9KSk7CiAgICAgICAgfQoKICAgICAgICAvLyBDYWxsICdJc0NvbW1hbmRDb21wYXRpYmxl JyBmb3IgcHJlY2FjaGluZwogICAgICAgIEFzeW5jRGF0YVByb3ZpZGVyLklzQ29tbWFuZENvbXBh dGlibGUobmV3IEFzeW5jUXVlcnkodGhpcywKICAgICAgICAgICAgICAgIG5ldyBJTmV3QXN5bmND YWxsYmFjaygpIHsKICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAg ICAgICBwdWJsaWMgdm9pZCBPblN1Y2Nlc3MoT2JqZWN0IHRhcmdldCwgT2JqZWN0IHJldHVyblZh bHVlKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSksIG51bGwsIG51 bGwsIG51bGwpOwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBBc3NpZ25UYWdzKCkKICAgIHsKICAg ICAgICBpZiAoZ2V0V2luZG93KCkgIT0gbnVsbCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVy bjsKICAgICAgICB9CgogICAgICAgIFRhZ0xpc3RNb2RlbCBtb2RlbCA9IG5ldyBUYWdMaXN0TW9k ZWwoKTsKICAgICAgICBzZXRXaW5kb3cobW9kZWwpOwogICAgICAgIG1vZGVsLnNldFRpdGxlKENv bnN0YW50c01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRDb25zdGFudHMoKS5hc3NpZ25UYWdzVGl0 bGUoKSk7CiAgICAgICAgbW9kZWwuc2V0SGFzaE5hbWUoImFzc2lnbl90YWdzX3ZtcyIpOyAvLyRO T04tTkxTLTEkCgogICAgICAgIEdldEF0dGFjaGVkVGFnc1RvU2VsZWN0ZWRWTXMobW9kZWwpOwoK ICAgICAgICBVSUNvbW1hbmQgdGVtcFZhciA9IG5ldyBVSUNvbW1hbmQoIk9uQXNzaWduVGFncyIs IHRoaXMpOyAvLyROT04tTkxTLTEkCiAgICAgICAgdGVtcFZhci5zZXRUaXRsZShDb25zdGFudHNN YW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0Q29uc3RhbnRzKCkub2soKSk7CiAgICAgICAgdGVtcFZh ci5zZXRJc0RlZmF1bHQodHJ1ZSk7CiAgICAgICAgbW9kZWwuZ2V0Q29tbWFuZHMoKS5hZGQodGVt cFZhcik7CiAgICAgICAgVUlDb21tYW5kIHRlbXBWYXIyID0gbmV3IFVJQ29tbWFuZCgiQ2FuY2Vs IiwgdGhpcyk7IC8vJE5PTi1OTFMtMSQKICAgICAgICB0ZW1wVmFyMi5zZXRUaXRsZShDb25zdGFu dHNNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0Q29uc3RhbnRzKCkuY2FuY2VsKCkpOwogICAgICAg IHRlbXBWYXIyLnNldElzQ2FuY2VsKHRydWUpOwogICAgICAgIG1vZGVsLmdldENvbW1hbmRzKCku YWRkKHRlbXBWYXIyKTsKICAgIH0KCiAgICBwdWJsaWMgTWFwPEd1aWQsIEJvb2xlYW4+IGF0dGFj aGVkVGFnc1RvRW50aXRpZXM7CiAgICBwdWJsaWMgQXJyYXlMaXN0PG9yZy5vdmlydC5lbmdpbmUu Y29yZS5jb21tb24uYnVzaW5lc3NlbnRpdGllcy50YWdzPiBhbGxBdHRhY2hlZFRhZ3M7CiAgICBw dWJsaWMgaW50IHNlbGVjdGVkSXRlbXNDb3VudGVyOwoKICAgIHByaXZhdGUgdm9pZCBHZXRBdHRh Y2hlZFRhZ3NUb1NlbGVjdGVkVk1zKFRhZ0xpc3RNb2RlbCBtb2RlbCkKICAgIHsKICAgICAgICBB cnJheUxpc3Q8R3VpZD4gdm1JZHMgPSBuZXcgQXJyYXlMaXN0PEd1aWQ+KCk7CiAgICAgICAgZm9y IChPYmplY3QgaXRlbSA6IGdldFNlbGVjdGVkSXRlbXMoKSkKICAgICAgICB7CiAgICAgICAgICAg IFZNIHZtID0gKFZNKSBpdGVtOwogICAgICAgICAgICB2bUlkcy5hZGQodm0uZ2V0SWQoKSk7CiAg ICAgICAgfQoKICAgICAgICBhdHRhY2hlZFRhZ3NUb0VudGl0aWVzID0gbmV3IEhhc2hNYXA8R3Vp ZCwgQm9vbGVhbj4oKTsKICAgICAgICBhbGxBdHRhY2hlZFRhZ3MgPSBuZXcgQXJyYXlMaXN0PG9y Zy5vdmlydC5lbmdpbmUuY29yZS5jb21tb24uYnVzaW5lc3NlbnRpdGllcy50YWdzPigpOwogICAg ICAgIHNlbGVjdGVkSXRlbXNDb3VudGVyID0gMDsKCiAgICAgICAgZm9yIChHdWlkIGlkIDogdm1J ZHMpCiAgICAgICAgewogICAgICAgICAgICBBc3luY0RhdGFQcm92aWRlci5HZXRBdHRhY2hlZFRh Z3NUb1ZtKG5ldyBBc3luY1F1ZXJ5KG5ldyBPYmplY3RbXSB7IHRoaXMsIG1vZGVsIH0sCiAgICAg ICAgICAgICAgICAgICAgbmV3IElOZXdBc3luY0NhbGxiYWNrKCkgewogICAgICAgICAgICAgICAg ICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgT25T dWNjZXNzKE9iamVjdCB0YXJnZXQsIE9iamVjdCByZXR1cm5WYWx1ZSkgewoKICAgICAgICAgICAg ICAgICAgICAgICAgICAgIE9iamVjdFtdIGFycmF5ID0gKE9iamVjdFtdKSB0YXJnZXQ7CiAgICAg ICAgICAgICAgICAgICAgICAgICAgICBWbUxpc3RNb2RlbCB2bUxpc3RNb2RlbCA9IChWbUxpc3RN b2RlbCkgYXJyYXlbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWdMaXN0TW9kZWwg dGFnTGlzdE1vZGVsID0gKFRhZ0xpc3RNb2RlbCkgYXJyYXlbMV07CiAgICAgICAgICAgICAgICAg ICAgICAgICAgICB2bUxpc3RNb2RlbC5hbGxBdHRhY2hlZFRhZ3MuYWRkQWxsKChBcnJheUxpc3Q8 b3JnLm92aXJ0LmVuZ2luZS5jb3JlLmNvbW1vbi5idXNpbmVzc2VudGl0aWVzLnRhZ3M+KSByZXR1 cm5WYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bUxpc3RNb2RlbC5zZWxlY3Rl ZEl0ZW1zQ291bnRlcisrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZtTGlzdE1v ZGVsLnNlbGVjdGVkSXRlbXNDb3VudGVyID09IHZtTGlzdE1vZGVsLmdldFNlbGVjdGVkSXRlbXMo KS5zaXplKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgUG9zdEdldEF0dGFjaGVkVGFncyh2bUxpc3RNb2RlbCwgdGFnTGlzdE1v ZGVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAg ICAgIH0KICAgICAgICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICAgICAgICBpZCk7CiAg ICAgICAgfQogICAgfQoKICAgIHByaXZhdGUgdm9pZCBQb3N0R2V0QXR0YWNoZWRUYWdzKFZtTGlz dE1vZGVsIHZtTGlzdE1vZGVsLCBUYWdMaXN0TW9kZWwgdGFnTGlzdE1vZGVsKQogICAgewogICAg ICAgIGlmICh2bUxpc3RNb2RlbC5nZXRMYXN0RXhlY3V0ZWRDb21tYW5kKCkgPT0gZ2V0QXNzaWdu VGFnc0NvbW1hbmQoKSkKICAgICAgICB7CiAgICAgICAgICAgIEFycmF5TGlzdDxvcmcub3ZpcnQu ZW5naW5lLmNvcmUuY29tbW9uLmJ1c2luZXNzZW50aXRpZXMudGFncz4gYXR0YWNoZWRUYWdzID0K ICAgICAgICAgICAgICAgICAgICBMaW5xLkRpc3RpbmN0KHZtTGlzdE1vZGVsLmFsbEF0dGFjaGVk VGFncywgbmV3IFRhZ3NFcXVhbGl0eUNvbXBhcmVyKCkpOwogICAgICAgICAgICBmb3IgKG9yZy5v dmlydC5lbmdpbmUuY29yZS5jb21tb24uYnVzaW5lc3NlbnRpdGllcy50YWdzIHRhZyA6IGF0dGFj aGVkVGFncykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKICAg ICAgICAgICAgICAgIGZvciAob3JnLm92aXJ0LmVuZ2luZS5jb3JlLmNvbW1vbi5idXNpbmVzc2Vu dGl0aWVzLnRhZ3MgdGFnMiA6IHZtTGlzdE1vZGVsLmFsbEF0dGFjaGVkVGFncykKICAgICAgICAg ICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGFnMi5nZXR0YWdfaWQoKS5lcXVhbHMo dGFnLmdldHRhZ19pZCgpKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAg ICAgICAgIGNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQog ICAgICAgICAgICAgICAgdm1MaXN0TW9kZWwuYXR0YWNoZWRUYWdzVG9FbnRpdGllcy5wdXQodGFn LmdldHRhZ19pZCgpLCBjb3VudCA9PSB2bUxpc3RNb2RlbC5nZXRTZWxlY3RlZEl0ZW1zKCkuc2l6 ZSgpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0YWdMaXN0TW9kZWwuc2V0QXR0YWNoZWRU YWdzVG9FbnRpdGllcyh2bUxpc3RNb2RlbC5hdHRhY2hlZFRhZ3NUb0VudGl0aWVzKTsKICAgICAg ICB9CiAgICAgICAgZWxzZSBpZiAoU3RyaW5nSGVscGVyLnN0cmluZ3NFcXVhbCh2bUxpc3RNb2Rl bC5nZXRMYXN0RXhlY3V0ZWRDb21tYW5kKCkuZ2V0TmFtZSgpLCAiT25Bc3NpZ25UYWdzIikpIC8v JE5PTi1OTFMtMSQKICAgICAgICB7CiAgICAgICAgICAgIHZtTGlzdE1vZGVsLlBvc3RPbkFzc2ln blRhZ3ModGFnTGlzdE1vZGVsLmdldEF0dGFjaGVkVGFnc1RvRW50aXRpZXMoKSk7CiAgICAgICAg fQogICAgfQoKICAgIHByaXZhdGUgdm9pZCBPbkFzc2lnblRhZ3MoKQogICAgewogICAgICAgIFRh Z0xpc3RNb2RlbCBtb2RlbCA9IChUYWdMaXN0TW9kZWwpIGdldFdpbmRvdygpOwoKICAgICAgICBH ZXRBdHRhY2hlZFRhZ3NUb1NlbGVjdGVkVk1zKG1vZGVsKTsKICAgIH0KCiAgICBwdWJsaWMgdm9p ZCBQb3N0T25Bc3NpZ25UYWdzKE1hcDxHdWlkLCBCb29sZWFuPiBhdHRhY2hlZFRhZ3MpCiAgICB7 CiAgICAgICAgVGFnTGlzdE1vZGVsIG1vZGVsID0gKFRhZ0xpc3RNb2RlbCkgZ2V0V2luZG93KCk7 CiAgICAgICAgQXJyYXlMaXN0PEd1aWQ+IHZtSWRzID0gbmV3IEFycmF5TGlzdDxHdWlkPigpOwoK ICAgICAgICBmb3IgKE9iamVjdCBpdGVtIDogZ2V0U2VsZWN0ZWRJdGVtcygpKQogICAgICAgIHsK ICAgICAgICAgICAgVk0gdm0gPSAoVk0pIGl0ZW07CiAgICAgICAgICAgIHZtSWRzLmFkZCh2bS5n ZXRJZCgpKTsKICAgICAgICB9CgogICAgICAgIC8vIHByZXBhcmUgYXR0YWNoL2RldGFjaCBsaXN0 cwogICAgICAgIEFycmF5TGlzdDxHdWlkPiB0YWdzVG9BdHRhY2ggPSBuZXcgQXJyYXlMaXN0PEd1 aWQ+KCk7CiAgICAgICAgQXJyYXlMaXN0PEd1aWQ+IHRhZ3NUb0RldGFjaCA9IG5ldyBBcnJheUxp c3Q8R3VpZD4oKTsKCiAgICAgICAgaWYgKG1vZGVsLmdldEl0ZW1zKCkgIT0gbnVsbCAmJiAoKEFy cmF5TGlzdDxUYWdNb2RlbD4pIG1vZGVsLmdldEl0ZW1zKCkpLnNpemUoKSA+IDApCiAgICAgICAg ewogICAgICAgICAgICBBcnJheUxpc3Q8VGFnTW9kZWw+IHRhZ3MgPSAoQXJyYXlMaXN0PFRhZ01v ZGVsPikgbW9kZWwuZ2V0SXRlbXMoKTsKICAgICAgICAgICAgVGFnTW9kZWwgcm9vdFRhZyA9IHRh Z3MuZ2V0KDApOwogICAgICAgICAgICBUYWdNb2RlbC5SZWN1cnNpdmVFZGl0QXR0YWNoRGV0YWNo TGlzdHMocm9vdFRhZywgYXR0YWNoZWRUYWdzLCB0YWdzVG9BdHRhY2gsIHRhZ3NUb0RldGFjaCk7 CiAgICAgICAgfQoKICAgICAgICBBcnJheUxpc3Q8VmRjQWN0aW9uUGFyYW1ldGVyc0Jhc2U+IHBh cmFtZXRlcnMgPSBuZXcgQXJyYXlMaXN0PFZkY0FjdGlvblBhcmFtZXRlcnNCYXNlPigpOwogICAg ICAgIGZvciAoR3VpZCBhIDogdGFnc1RvQXR0YWNoKQogICAgICAgIHsKICAgICAgICAgICAgcGFy YW1ldGVycy5hZGQobmV3IEF0dGFjaEVudGl0eVRvVGFnUGFyYW1ldGVycyhhLCB2bUlkcykpOwog ICAgICAgIH0KICAgICAgICBGcm9udGVuZC5SdW5NdWx0aXBsZUFjdGlvbihWZGNBY3Rpb25UeXBl LkF0dGFjaFZtc1RvVGFnLCBwYXJhbWV0ZXJzKTsKCiAgICAgICAgcGFyYW1ldGVycyA9IG5ldyBB cnJheUxpc3Q8VmRjQWN0aW9uUGFyYW1ldGVyc0Jhc2U+KCk7CiAgICAgICAgZm9yIChHdWlkIGEg OiB0YWdzVG9EZXRhY2gpCiAgICAgICAgewogICAgICAgICAgICBwYXJhbWV0ZXJzLmFkZChuZXcg QXR0YWNoRW50aXR5VG9UYWdQYXJhbWV0ZXJzKGEsIHZtSWRzKSk7CiAgICAgICAgfQogICAgICAg IEZyb250ZW5kLlJ1bk11bHRpcGxlQWN0aW9uKFZkY0FjdGlvblR5cGUuRGV0YWNoVm1Gcm9tVGFn LCBwYXJhbWV0ZXJzKTsKCiAgICAgICAgQ2FuY2VsKCk7CiAgICB9CgogICAgcHJpdmF0ZSB2b2lk IEd1aWRlKCkKICAgIHsKICAgICAgICBWbUd1aWRlTW9kZWwgbW9kZWwgPSBuZXcgVm1HdWlkZU1v ZGVsKCk7CiAgICAgICAgc2V0V2luZG93KG1vZGVsKTsKICAgICAgICBtb2RlbC5zZXRUaXRsZShD b25zdGFudHNNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0Q29uc3RhbnRzKCkubmV3VmlydHVhbE1h Y2hpbmVHdWlkZU1lVGl0bGUoKSk7CiAgICAgICAgbW9kZWwuc2V0SGFzaE5hbWUoIm5ld192aXJ0 dWFsX21hY2hpbmVfLV9ndWlkZV9tZSIpOyAvLyROT04tTkxTLTEkCgogICAgICAgIGlmIChnZXRH dWlkZUNvbnRleHQoKSA9PSBudWxsKSB7CiAgICAgICAgICAgIFZNIHZtID0gKFZNKSBnZXRTZWxl Y3RlZEl0ZW0oKTsKICAgICAgICAgICAgc2V0R3VpZGVDb250ZXh0KHZtLmdldElkKCkpOwogICAg ICAgIH0KCiAgICAgICAgQXN5bmNEYXRhUHJvdmlkZXIuR2V0Vm1CeUlkKG5ldyBBc3luY1F1ZXJ5 KHRoaXMsCiAgICAgICAgICAgICAgICBuZXcgSU5ld0FzeW5jQ2FsbGJhY2soKSB7CiAgICAgICAg ICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgT25T dWNjZXNzKE9iamVjdCB0YXJnZXQsIE9iamVjdCByZXR1cm5WYWx1ZSkgewogICAgICAgICAgICAg ICAgICAgICAgICBWbUxpc3RNb2RlbCB2bUxpc3RNb2RlbCA9IChWbUxpc3RNb2RlbCkgdGFyZ2V0 OwogICAgICAgICAgICAgICAgICAgICAgICBWbUd1aWRlTW9kZWwgbW9kZWwgPSAoVm1HdWlkZU1v ZGVsKSB2bUxpc3RNb2RlbC5nZXRXaW5kb3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgbW9k ZWwuc2V0RW50aXR5KHJldHVyblZhbHVlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29t bWFuZCB0ZW1wVmFyID0gbmV3IFVJQ29tbWFuZCgiQ2FuY2VsIiwgdm1MaXN0TW9kZWwpOyAvLyRO T04tTkxTLTEkCiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBWYXIuc2V0VGl0bGUoQ29uc3Rh bnRzTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldENvbnN0YW50cygpLmNvbmZpZ3VyZUxhdGVyVGl0 bGUoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBWYXIuc2V0SXNEZWZhdWx0KHRydWUp OwogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wVmFyLnNldElzQ2FuY2VsKHRydWUpOwogICAg ICAgICAgICAgICAgICAgICAgICBtb2RlbC5nZXRDb21tYW5kcygpLmFkZCh0ZW1wVmFyKTsKICAg ICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSwgKEd1aWQpIGdldEd1aWRlQ29u dGV4dCgpKTsKICAgIH0KCiAgICBAT3ZlcnJpZGUKICAgIHByb3RlY3RlZCB2b2lkIEluaXREZXRh aWxNb2RlbHMoKQogICAgewogICAgICAgIHN1cGVyLkluaXREZXRhaWxNb2RlbHMoKTsKCiAgICAg ICAgT2JzZXJ2YWJsZUNvbGxlY3Rpb248RW50aXR5TW9kZWw+IGxpc3QgPSBuZXcgT2JzZXJ2YWJs ZUNvbGxlY3Rpb248RW50aXR5TW9kZWw+KCk7CiAgICAgICAgbGlzdC5hZGQobmV3IFZtR2VuZXJh bE1vZGVsKCkpOwogICAgICAgIGxpc3QuYWRkKG5ldyBWbUludGVyZmFjZUxpc3RNb2RlbCgpKTsK ICAgICAgICBWbURpc2tMaXN0TW9kZWwgZGlza0xpc3RNb2RlbCA9IG5ldyBWbURpc2tMaXN0TW9k ZWwoKTsKICAgICAgICBkaXNrTGlzdE1vZGVsLnNldFN5c3RlbVRyZWVDb250ZXh0KHRoaXMpOwog ICAgICAgIGxpc3QuYWRkKGRpc2tMaXN0TW9kZWwpOwogICAgICAgIGxpc3QuYWRkKG5ldyBWbVNu YXBzaG90TGlzdE1vZGVsKCkpOwogICAgICAgIGxpc3QuYWRkKG5ldyBWbUV2ZW50TGlzdE1vZGVs KCkpOwogICAgICAgIGxpc3QuYWRkKG5ldyBWbUFwcExpc3RNb2RlbCgpKTsKICAgICAgICBsaXN0 LmFkZChuZXcgUGVybWlzc2lvbkxpc3RNb2RlbCgpKTsKICAgICAgICBsaXN0LmFkZChuZXcgVm1T ZXNzaW9uc01vZGVsKCkpOwogICAgICAgIHNldERldGFpbE1vZGVscyhsaXN0KTsKICAgIH0KCiAg ICBAT3ZlcnJpZGUKICAgIHB1YmxpYyBib29sZWFuIElzU2VhcmNoU3RyaW5nTWF0Y2goU3RyaW5n IHNlYXJjaFN0cmluZykKICAgIHsKICAgICAgICByZXR1cm4gc2VhcmNoU3RyaW5nLnRyaW0oKS50 b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoInZtIik7IC8vJE5PTi1OTFMtMSQKICAgIH0KCiAgICBA T3ZlcnJpZGUKICAgIHByb3RlY3RlZCB2b2lkIFN5bmNTZWFyY2goKQogICAgewogICAgICAgIFNl YXJjaFBhcmFtZXRlcnMgdGVtcFZhciA9IG5ldyBTZWFyY2hQYXJhbWV0ZXJzKGdldFNlYXJjaFN0 cmluZygpLCBTZWFyY2hUeXBlLlZNKTsKICAgICAgICB0ZW1wVmFyLnNldE1heENvdW50KGdldFNl YXJjaFBhZ2VTaXplKCkpOwogICAgICAgIHN1cGVyLlN5bmNTZWFyY2goVmRjUXVlcnlUeXBlLlNl YXJjaCwgdGVtcFZhcik7CiAgICB9CgogICAgQE92ZXJyaWRlCiAgICBwcm90ZWN0ZWQgdm9pZCBB c3luY1NlYXJjaCgpCiAgICB7CiAgICAgICAgc3VwZXIuQXN5bmNTZWFyY2goKTsKCiAgICAgICAg c2V0QXN5bmNSZXN1bHQoRnJvbnRlbmQuUmVnaXN0ZXJTZWFyY2goZ2V0U2VhcmNoU3RyaW5nKCks IFNlYXJjaFR5cGUuVk0sIGdldFNlYXJjaFBhZ2VTaXplKCkpKTsKICAgICAgICBzZXRJdGVtcyhn ZXRBc3luY1Jlc3VsdCgpLmdldERhdGEoKSk7CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIFVwZGF0 ZUNvbnNvbGVNb2RlbHMoKQogICAgewogICAgICAgIExpc3QgdGVtcFZhciA9IGdldFNlbGVjdGVk SXRlbXMoKTsKICAgICAgICBMaXN0IHNlbGVjdGVkSXRlbXMgPSAodGVtcFZhciAhPSBudWxsKSA/ IHRlbXBWYXIgOiBuZXcgQXJyYXlMaXN0KCk7CiAgICAgICAgT2JqZWN0IHRlbXBWYXIyID0gZ2V0 U2VsZWN0ZWRJdGVtKCk7CiAgICAgICAgVk0gdm0gPSAoVk0pICgodGVtcFZhcjIgaW5zdGFuY2Vv ZiBWTSkgPyB0ZW1wVmFyMiA6IG51bGwpOwoKICAgICAgICBpZiAodm0gPT0gbnVsbCB8fCBzZWxl Y3RlZEl0ZW1zLnNpemUoKSA+IDEpCiAgICAgICAgewogICAgICAgICAgICBzZXREZWZhdWx0Q29u c29sZU1vZGVsKG51bGwpOwogICAgICAgICAgICBzZXRBZGRpdGlvbmFsQ29uc29sZU1vZGVsKG51 bGwpOwogICAgICAgICAgICBzZXRIYXNBZGRpdGlvbmFsQ29uc29sZU1vZGVsKGZhbHNlKTsKICAg ICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFjYWNoZWRDb25z b2xlTW9kZWxzLmNvbnRhaW5zS2V5KHZtLmdldElkKCkpKQogICAgICAgICAgICB7CiAgICAgICAg ICAgICAgICBTcGljZUNvbnNvbGVNb2RlbCBzcGljZUNvbnNvbGVNb2RlbCA9IG5ldyBTcGljZUNv bnNvbGVNb2RlbCgpOwogICAgICAgICAgICAgICAgc3BpY2VDb25zb2xlTW9kZWwuZ2V0RXJyb3JF dmVudCgpLmFkZExpc3RlbmVyKHRoaXMpOwogICAgICAgICAgICAgICAgVm5jQ29uc29sZU1vZGVs IHZuY0NvbnNvbGVNb2RlbCA9IG5ldyBWbmNDb25zb2xlTW9kZWwoKTsKICAgICAgICAgICAgICAg IHZuY0NvbnNvbGVNb2RlbC5zZXRNb2RlbCh0aGlzKTsKICAgICAgICAgICAgICAgIFJkcENvbnNv bGVNb2RlbCByZHBDb25zb2xlTW9kZWwgPSBuZXcgUmRwQ29uc29sZU1vZGVsKCk7CgogICAgICAg ICAgICAgICAgY2FjaGVkQ29uc29sZU1vZGVscy5wdXQodm0uZ2V0SWQoKSwKICAgICAgICAgICAg ICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxDb25zb2xlTW9kZWw+KEFycmF5cy5hc0xpc3QobmV3 IENvbnNvbGVNb2RlbFtdIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGljZUNv bnNvbGVNb2RlbCwgdm5jQ29uc29sZU1vZGVsLCByZHBDb25zb2xlTW9kZWwgfSkpKTsKICAgICAg ICAgICAgfQoKICAgICAgICAgICAgQXJyYXlMaXN0PENvbnNvbGVNb2RlbD4gY2FjaGVkTW9kZWxz ID0gY2FjaGVkQ29uc29sZU1vZGVscy5nZXQodm0uZ2V0SWQoKSk7CiAgICAgICAgICAgIGZvciAo Q29uc29sZU1vZGVsIGEgOiBjYWNoZWRNb2RlbHMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAg ICAgIGEuc2V0RW50aXR5KG51bGwpOwogICAgICAgICAgICAgICAgYS5zZXRFbnRpdHkodm0pOwog ICAgICAgICAgICB9CgogICAgICAgICAgICBzZXREZWZhdWx0Q29uc29sZU1vZGVsKHZtLmdldERp c3BsYXlUeXBlKCkgPT0gRGlzcGxheVR5cGUudm5jID8gY2FjaGVkTW9kZWxzLmdldCgxKSA6IGNh Y2hlZE1vZGVscy5nZXQoMCkpOwoKICAgICAgICAgICAgaWYgKEFzeW5jRGF0YVByb3ZpZGVyLklz V2luZG93c09zVHlwZSh2bS5nZXRWbU9zKCkpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAg ICBmb3IgKENvbnNvbGVNb2RlbCBhIDogY2FjaGVkTW9kZWxzKQogICAgICAgICAgICAgICAgewog ICAgICAgICAgICAgICAgICAgIGlmIChhIGluc3RhbmNlb2YgUmRwQ29uc29sZU1vZGVsKQogICAg ICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0QWRkaXRpb25hbENv bnNvbGVNb2RlbChhKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAg ICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2V0SGFzQWRkaXRp b25hbENvbnNvbGVNb2RlbCh0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAg ICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNldEFkZGl0aW9uYWxDb25zb2xlTW9kZWwobnVs bCk7CiAgICAgICAgICAgICAgICBzZXRIYXNBZGRpdGlvbmFsQ29uc29sZU1vZGVsKGZhbHNlKTsK ICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgQXJyYXlMaXN0PENvbnNv bGVNb2RlbD4gR2V0Q29uc29sZU1vZGVsc0J5Vm1HdWlkKEd1aWQgdm1HdWlkKQogICAgewogICAg ICAgIGlmIChjYWNoZWRDb25zb2xlTW9kZWxzICE9IG51bGwgJiYgY2FjaGVkQ29uc29sZU1vZGVs cy5jb250YWluc0tleSh2bUd1aWQpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGNhY2hl ZENvbnNvbGVNb2RlbHMuZ2V0KHZtR3VpZCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbnVs bDsKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgTmV3RGVza3RvcCgpCiAgICB7CiAgICAgICAgTmV3 SW50ZXJuYWwoVm1UeXBlLkRlc2t0b3ApOwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBOZXdTZXJ2 ZXIoKQogICAgewogICAgICAgIE5ld0ludGVybmFsKFZtVHlwZS5TZXJ2ZXIpOwogICAgfQoKICAg IHByaXZhdGUgdm9pZCBOZXdJbnRlcm5hbChWbVR5cGUgdm1UeXBlKQogICAgewogICAgICAgIGlm IChnZXRXaW5kb3coKSAhPSBudWxsKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuOwogICAg ICAgIH0KCiAgICAgICAgVW5pdFZtTW9kZWwgbW9kZWwgPSBuZXcgVW5pdFZtTW9kZWwobmV3IE5l d1ZtTW9kZWxCZWhhdmlvcigpKTsKICAgICAgICBtb2RlbC5zZXRUaXRsZShDb25zdGFudHNNYW5h Z2VyLmdldEluc3RhbmNlKCkKICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlcygpCiAgICAgICAg ICAgICAgICAubmV3Vm1UaXRsZSh2bVR5cGUgPT0gVm1UeXBlLlNlcnZlciA/IENvbnN0YW50c01h bmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRDb25zdGFudHMoKS5zZXJ2ZXJWbVR5cGUoKQogICAgICAg ICAgICAgICAgICAgICAgICA6IENvbnN0YW50c01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRDb25z dGFudHMoKS5kZXNrdG9wVm1UeXBlKCkpKTsKICAgICAgICBtb2RlbC5zZXRIYXNoTmFtZSgibmV3 XyIgKyAodm1UeXBlID09IFZtVHlwZS5TZXJ2ZXIgPyAic2VydmVyIiA6ICJkZXNrdG9wIikpOyAv LyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAogICAgICAgIG1vZGVsLnNl dElzTmV3KHRydWUpOwogICAgICAgIG1vZGVsLnNldFZtVHlwZSh2bVR5cGUpOwogICAgICAgIG1v ZGVsLnNldEN1c3RvbVByb3BlcnRpZXNLZXlzTGlzdChnZXRDdXN0b21Qcm9wZXJ0aWVzS2V5c0xp c3QoKSk7CgogICAgICAgIHNldFdpbmRvdyhtb2RlbCk7CgogICAgICAgIG1vZGVsLkluaXRpYWxp emUoZ2V0U3lzdGVtVHJlZVNlbGVjdGVkSXRlbSgpKTsKCiAgICAgICAgLy8gRW5zdXJlcyB0aGF0 IHRoZSBkZWZhdWx0IHByb3Zpc2lvbmluZyBpcyAiQ2xvbmUiIGZvciBhIG5ldyBzZXJ2ZXIgYW5k ICJUaGluIiBmb3IgYSBuZXcgZGVza3RvcC4KICAgICAgICBib29sZWFuIHNlbGVjdFZhbHVlID0g bW9kZWwuZ2V0Vm1UeXBlKCkgPT0gVm1UeXBlLlNlcnZlcjsKICAgICAgICBtb2RlbC5nZXRQcm92 aXNpb25pbmcoKS5zZXRFbnRpdHkoc2VsZWN0VmFsdWUpOwoKICAgICAgICBVSUNvbW1hbmQgdGVt cFZhciA9IG5ldyBVSUNvbW1hbmQoIk9uU2F2ZSIsIHRoaXMpOyAvLyROT04tTkxTLTEkCiAgICAg ICAgdGVtcFZhci5zZXRUaXRsZShDb25zdGFudHNNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0Q29u c3RhbnRzKCkub2soKSk7CiAgICAgICAgdGVtcFZhci5zZXRJc0RlZmF1bHQodHJ1ZSk7CiAgICAg ICAgbW9kZWwuZ2V0Q29tbWFuZHMoKS5hZGQodGVtcFZhcik7CiAgICAgICAgVUlDb21tYW5kIHRl bXBWYXIyID0gbmV3IFVJQ29tbWFuZCgiQ2FuY2VsIiwgdGhpcyk7IC8vJE5PTi1OTFMtMSQKICAg ICAgICB0ZW1wVmFyMi5zZXRUaXRsZShDb25zdGFudHNNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0 Q29uc3RhbnRzKCkuY2FuY2VsKCkpOwogICAgICAgIHRlbXBWYXIyLnNldElzQ2FuY2VsKHRydWUp OwogICAgICAgIG1vZGVsLmdldENvbW1hbmRzKCkuYWRkKHRlbXBWYXIyKTsKICAgIH0KCiAgICBw cml2YXRlIHZvaWQgRWRpdCgpCiAgICB7CiAgICAgICAgVk0gdm0gPSAoVk0pIGdldFNlbGVjdGVk SXRlbSgpOwogICAgICAgIGlmICh2bSA9PSBudWxsKQogICAgICAgIHsKICAgICAgICAgICAgcmV0 dXJuOwogICAgICAgIH0KCiAgICAgICAgaWYgKGdldFdpbmRvdygpICE9IG51bGwpCiAgICAgICAg ewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBVbml0Vm1Nb2RlbCBtb2Rl bCA9IG5ldyBVbml0Vm1Nb2RlbChuZXcgRXhpc3RpbmdWbU1vZGVsQmVoYXZpb3Iodm0pKTsKICAg ICAgICBtb2RlbC5zZXRWbVR5cGUodm0uZ2V0Vm1UeXBlKCkpOwogICAgICAgIG1vZGVsLnNldFZt QXR0YWNoZWRUb1Bvb2wodm0uZ2V0Vm1Qb29sSWQoKSAhPSBudWxsKTsKICAgICAgICBzZXRXaW5k b3cobW9kZWwpOwogICAgICAgIG1vZGVsLnNldFRpdGxlKENvbnN0YW50c01hbmFnZXIuZ2V0SW5z dGFuY2UoKQogICAgICAgICAgICAgICAgLmdldE1lc3NhZ2VzKCkKICAgICAgICAgICAgICAgIC5l ZGl0Vm1UaXRsZSh2bS5nZXRWbVR5cGUoKSA9PSBWbVR5cGUuU2VydmVyID8gQ29uc3RhbnRzTWFu YWdlci5nZXRJbnN0YW5jZSgpCiAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb25zdGFudHMo KQogICAgICAgICAgICAgICAgICAgICAgICAuc2VydmVyVm1UeXBlKCkKICAgICAgICAgICAgICAg ICAgICAgICAgOiBDb25zdGFudHNNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0Q29uc3RhbnRzKCku ZGVza3RvcFZtVHlwZSgpKSk7CiAgICAgICAgbW9kZWwuc2V0SGFzaE5hbWUoImVkaXRfIiArICh2 bS5nZXRWbVR5cGUoKSA9PSBWbVR5cGUuU2VydmVyID8gInNlcnZlciIgOiAiZGVza3RvcCIpKTsg Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKICAgICAgICBtb2RlbC5z ZXRDdXN0b21Qcm9wZXJ0aWVzS2V5c0xpc3QoZ2V0Q3VzdG9tUHJvcGVydGllc0tleXNMaXN0KCkp OwoKICAgICAgICBtb2RlbC5Jbml0aWFsaXplKHRoaXMuZ2V0U3lzdGVtVHJlZVNlbGVjdGVkSXRl bSgpKTsKCiAgICAgICAgVUlDb21tYW5kIHRlbXBWYXIgPSBuZXcgVUlDb21tYW5kKCJPblNhdmUi LCB0aGlzKTsgLy8kTk9OLU5MUy0xJAogICAgICAgIHRlbXBWYXIuc2V0VGl0bGUoQ29uc3RhbnRz TWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldENvbnN0YW50cygpLm9rKCkpOwogICAgICAgIHRlbXBW YXIuc2V0SXNEZWZhdWx0KHRydWUpOwogICAgICAgIG1vZGVsLmdldENvbW1hbmRzKCkuYWRkKHRl bXBWYXIpOwogICAgICAgIFVJQ29tbWFuZCB0ZW1wVmFyMiA9IG5ldyBVSUNvbW1hbmQoIkNhbmNl bCIsIHRoaXMpOyAvLyROT04tTkxTLTEkCiAgICAgICAgdGVtcFZhcjIuc2V0VGl0bGUoQ29uc3Rh bnRzTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldENvbnN0YW50cygpLmNhbmNlbCgpKTsKICAgICAg ICB0ZW1wVmFyMi5zZXRJc0NhbmNlbCh0cnVlKTsKICAgICAgICBtb2RlbC5nZXRDb21tYW5kcygp LmFkZCh0ZW1wVmFyMik7CiAgICB9CgogICAgcHJpdmF0ZSBNYXA8R3VpZCwgRW50aXR5TW9kZWw+ IHZtc1JlbW92ZU1hcDsKCiAgICBwcml2YXRlIHZvaWQgcmVtb3ZlKCkKICAgIHsKICAgICAgICBp ZiAoZ2V0V2luZG93KCkgIT0gbnVsbCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybjsKICAg ICAgICB9CgogICAgICAgIENvbmZpcm1hdGlvbk1vZGVsIHdpbmRvdyA9IG5ldyBDb25maXJtYXRp b25Nb2RlbCgpOwogICAgICAgIHNldFdpbmRvdyh3aW5kb3cpOwogICAgICAgIHdpbmRvdy5zZXRU aXRsZShDb25zdGFudHNNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0Q29uc3RhbnRzKCkucmVtb3Zl VmlydHVhbE1hY2hpbmVzVGl0bGUoKSk7CiAgICAgICAgd2luZG93LnNldEhhc2hOYW1lKCJyZW1v dmVfdmlydHVhbF9tYWNoaW5lIik7IC8vJE5PTi1OTFMtMSQKICAgICAgICB3aW5kb3cuc2V0TWVz c2FnZShDb25zdGFudHNNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0Q29uc3RhbnRzKCkudmlydHVh bE1hY2hpbmVzTXNnKCkpOwoKICAgICAgICB2bXNSZW1vdmVNYXAgPSBuZXcgSGFzaE1hcDxHdWlk LCBFbnRpdHlNb2RlbD4oKTsKCiAgICAgICAgZm9yIChPYmplY3Qgc2VsZWN0ZWRJdGVtIDogZ2V0 U2VsZWN0ZWRJdGVtcygpKQogICAgICAgIHsKICAgICAgICAgICAgVk0gdm0gPSAoVk0pIHNlbGVj dGVkSXRlbTsKICAgICAgICAgICAgRW50aXR5TW9kZWwgcmVtb3ZlRGlza3NDaGVja2JveCA9IG5l dyBFbnRpdHlNb2RlbCh0cnVlKTsKICAgICAgICAgICAgcmVtb3ZlRGlza3NDaGVja2JveC5zZXRU aXRsZShDb25zdGFudHNNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0Q29uc3RhbnRzKCkucmVtb3Zl RGlza3NUaXRsZSgpKTsKICAgICAgICAgICAgcmVtb3ZlRGlza3NDaGVja2JveC5zZXRNZXNzYWdl KHZtLmdldFZtTmFtZSgpKTsKICAgICAgICAgICAgaWYgKCFOR3VpZC5FbXB0eS5lcXVhbHModm0u Z2V0Vm10R3VpZCgpKSkgewogICAgICAgICAgICAgICAgdXBkYXRlUmVtb3ZlRGlza3NDaGVja0Jv eChyZW1vdmVEaXNrc0NoZWNrYm94LCB0cnVlLCBmYWxzZSwgQ29uc3RhbnRzTWFuYWdlci5nZXRJ bnN0YW5jZSgpCiAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb25zdGFudHMoKQogICAgICAg ICAgICAgICAgICAgICAgICAucmVtb3ZlVm1EaXNrc1RlbXBsYXRlTXNnKCkpOwogICAgICAgICAg ICB9CiAgICAgICAgICAgIHZtc1JlbW92ZU1hcC5wdXQodm0uZ2V0SWQoKSwgcmVtb3ZlRGlza3ND aGVja2JveCk7CiAgICAgICAgfQogICAgICAgIHdpbmRvdy5zZXRJdGVtcyh2bXNSZW1vdmVNYXAu ZW50cnlTZXQoKSk7CiAgICAgICAgaW5pdFJlbW92ZURpc2tzQ2hlY2tib3hlcyh2bXNSZW1vdmVN YXApOwoKICAgICAgICBVSUNvbW1hbmQgdGVtcFZhciA9IG5ldyBVSUNvbW1hbmQoIk9uUmVtb3Zl IiwgdGhpcyk7IC8vJE5PTi1OTFMtMSQKICAgICAgICB0ZW1wVmFyLnNldFRpdGxlKENvbnN0YW50 c01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRDb25zdGFudHMoKS5vaygpKTsKICAgICAgICB0ZW1w VmFyLnNldElzRGVmYXVsdCh0cnVlKTsKICAgICAgICB3aW5kb3cuZ2V0Q29tbWFuZHMoKS5hZGQo dGVtcFZhcik7CiAgICAgICAgVUlDb21tYW5kIHRlbXBWYXIyID0gbmV3IFVJQ29tbWFuZCgiQ2Fu Y2VsIiwgdGhpcyk7IC8vJE5PTi1OTFMtMSQKICAgICAgICB0ZW1wVmFyMi5zZXRUaXRsZShDb25z dGFudHNNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0Q29uc3RhbnRzKCkuY2FuY2VsKCkpOwogICAg ICAgIHRlbXBWYXIyLnNldElzQ2FuY2VsKHRydWUpOwogICAgICAgIHdpbmRvdy5nZXRDb21tYW5k cygpLmFkZCh0ZW1wVmFyMik7CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVJlbW92ZURp c2tzQ2hlY2tCb3goRW50aXR5TW9kZWwgbW9kZWwsCiAgICAgICAgICAgIGJvb2xlYW4gZGVsZXRl RGlza3MsCiAgICAgICAgICAgIGJvb2xlYW4gaXNDaGFuZ2FibGUsCiAgICAgICAgICAgIFN0cmlu ZyBjaGFuZ2VQcm9oaWJpdGlvblJlYXNvbikgewoKICAgICAgICBtb2RlbC5zZXRFbnRpdHkoZGVs ZXRlRGlza3MpOwogICAgICAgIGlmICghaXNDaGFuZ2FibGUgJiYgY2hhbmdlUHJvaGliaXRpb25S ZWFzb24gIT0gbnVsbCkgewogICAgICAgICAgICBtb2RlbC5nZXRDaGFuZ2VQcm9oaWJpdGlvblJl YXNvbnMoKS5hZGQoY2hhbmdlUHJvaGliaXRpb25SZWFzb24pOwogICAgICAgIH0KICAgICAgICBt b2RlbC5zZXRJc0NoYW5nYWJsZShpc0NoYW5nYWJsZSk7CiAgICB9CgogICAgcHJpdmF0ZSB2b2lk IGluaXRSZW1vdmVEaXNrc0NoZWNrYm94ZXMoZmluYWwgTWFwPEd1aWQsIEVudGl0eU1vZGVsPiB2 bXNNYXApIHsKICAgICAgICBBcnJheUxpc3Q8VmRjUXVlcnlQYXJhbWV0ZXJzQmFzZT4gcGFyYW1z ID0gbmV3IEFycmF5TGlzdDxWZGNRdWVyeVBhcmFtZXRlcnNCYXNlPigpOwogICAgICAgIEFycmF5 TGlzdDxWZGNRdWVyeVR5cGU+IHF1ZXJpZXMgPSBuZXcgQXJyYXlMaXN0PFZkY1F1ZXJ5VHlwZT4o KTsKCiAgICAgICAgZm9yIChFbnRyeTxHdWlkLCBFbnRpdHlNb2RlbD4gZW50cnkgOiB2bXNNYXAu ZW50cnlTZXQoKSkgewogICAgICAgICAgICBpZiAoZW50cnkuZ2V0VmFsdWUoKS5nZXRJc0NoYW5n YWJsZSgpKSB7IC8vIE5vIHBvaW50IGluIGZldGNoaW5nIFZNIGRpc2tzIGZyb20gb25lcyB0aGF0 IGFscmVhZHkgZGV0ZXJtaW5lZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIC8vIGlzIHVuY2hhbmdlYWJsZSBzaW5jZSB0aGV5IGFyZSBhbHJlYWR5 IGluaXRpYWxpemVkCiAgICAgICAgICAgICAgICBwYXJhbXMuYWRkKG5ldyBHZXRBbGxEaXNrc0J5 Vm1JZFBhcmFtZXRlcnMoZW50cnkuZ2V0S2V5KCkpKTsKICAgICAgICAgICAgICAgIHF1ZXJpZXMu YWRkKFZkY1F1ZXJ5VHlwZS5HZXRBbGxEaXNrc0J5Vm1JZCk7CiAgICAgICAgICAgIH0KICAgICAg ICB9CgogICAgICAgIC8vIFRPRE86IFRoZXJlJ3Mgbm8gcG9pbnQgaW4gY3JlYXRpbmcgYSBWZGNR dWVyeVR5cGUgbGlzdCB3aGVuIHlvdSB3YW5uYSBydW4gdGhlIHNhbWUgcXVlcnkgZm9yIGFsbCBw YXJhbWV0ZXJzLAogICAgICAgIC8vIHJldmlzZSB3aGVuIHJlZmFjdG9yaW5nIG9yZy5vdmlydC5l bmdpbmUudWkuRnJvbnRlbmQgdG8gc3VwcG9ydCBydW5NdWx0aXBsZVF1ZXJ5IHdpdGggYSBzaW5n bGUgcXVlcnkKICAgICAgICBpZiAoIXBhcmFtcy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgRnJv bnRlbmQuUnVuTXVsdGlwbGVRdWVyaWVzKHF1ZXJpZXMsIHBhcmFtcywgbmV3IElGcm9udGVuZE11 bHRpcGxlUXVlcnlBc3luY0NhbGxiYWNrKCkgewogICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAg ICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBFeGVjdXRlZChGcm9udGVuZE11bHRpcGxlUXVlcnlB c3luY1Jlc3VsdCByZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsg aSA8IHJlc3VsdC5nZXRSZXR1cm5WYWx1ZXMoKS5zaXplKCk7IGkrKykgewogICAgICAgICAgICAg ICAgICAgICAgICBpZiAocmVzdWx0LmdldFJldHVyblZhbHVlcygpLmdldChpKS5nZXRTdWNjZWVk ZWQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgR3VpZCB2bUlkID0gKChHZXRBbGxE aXNrc0J5Vm1JZFBhcmFtZXRlcnMpIHJlc3VsdC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KGkpKS5nZXRW bUlkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0UmVtb3ZlRGlza3NDaGVjYm94 ZXNQb3N0KHZtSWQsIChMaXN0PERpc2s+KSByZXN1bHQuZ2V0UmV0dXJuVmFsdWVzKCkuZ2V0KGkp LmdldFJldHVyblZhbHVlKCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAg ICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAg ICB9CgogICAgcHJpdmF0ZSB2b2lkIGluaXRSZW1vdmVEaXNrc0NoZWNib3hlc1Bvc3QoR3VpZCB2 bUlkLCBMaXN0PERpc2s+IGRpc2tzKSB7CiAgICAgICAgRW50aXR5TW9kZWwgbW9kZWwgPSB2bXNS ZW1vdmVNYXAuZ2V0KHZtSWQpOwogICAgICAgIGlmIChkaXNrcy5pc0VtcHR5KCkpIHsKICAgICAg ICAgICAgdXBkYXRlUmVtb3ZlRGlza3NDaGVja0JveChtb2RlbCwgZmFsc2UsIGZhbHNlLCBDb25z dGFudHNNYW5hZ2VyLmdldEluc3RhbmNlKCkKICAgICAgICAgICAgICAgICAgICAuZ2V0Q29uc3Rh bnRzKCkKICAgICAgICAgICAgICAgICAgICAucmVtb3ZlVm1EaXNrc05vRGlza3NNc2coKSk7CiAg ICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGJvb2xlYW4gaXNPbmx5U2hhcmVk RGlza3MgPSB0cnVlOwogICAgICAgIGJvb2xlYW4gaXNTbmFwc2hvdEV4aXN0cyA9IGZhbHNlOwog ICAgICAgIGZvciAoRGlzayBkaXNrIDogZGlza3MpIHsKICAgICAgICAgICAgaWYgKCFkaXNrLmlz U2hhcmVhYmxlKCkpIHsKICAgICAgICAgICAgICAgIGlzT25seVNoYXJlZERpc2tzID0gZmFsc2U7 CiAgICAgICAgICAgICAgICBpZiAoZGlzay5nZXREaXNrU3RvcmFnZVR5cGUoKSA9PSBEaXNrU3Rv cmFnZVR5cGUuSU1BR0UpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoKChEaXNrSW1hZ2UpIGRp c2spLmdldFNuYXBzaG90cygpLnNpemUoKSA+IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAg aXNTbmFwc2hvdEV4aXN0cyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwog ICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAg ICAgIH0KCiAgICAgICAgaWYgKGlzU25hcHNob3RFeGlzdHMpIHsKICAgICAgICAgICAgdXBkYXRl UmVtb3ZlRGlza3NDaGVja0JveChtb2RlbCwgdHJ1ZSwgZmFsc2UsIENvbnN0YW50c01hbmFnZXIu Z2V0SW5zdGFuY2UoKQogICAgICAgICAgICAgICAgICAgIC5nZXRDb25zdGFudHMoKQogICAgICAg ICAgICAgICAgICAgIC5yZW1vdmVWbURpc2tzU25hcHNob3RzTXNnKCkpOwogICAgICAgICAgICBy ZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpZiAoaXNPbmx5U2hhcmVkRGlza3MpIHsKICAgICAg ICAgICAgdXBkYXRlUmVtb3ZlRGlza3NDaGVja0JveChtb2RlbCwgZmFsc2UsIGZhbHNlLCBDb25z dGFudHNNYW5hZ2VyLmdldEluc3RhbmNlKCkKICAgICAgICAgICAgICAgICAgICAuZ2V0Q29uc3Rh bnRzKCkKICAgICAgICAgICAgICAgICAgICAucmVtb3ZlVm1EaXNrc0FsbFNoYXJlZE1zZygpKTsK ICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBwcml2YXRlIHZvaWQgTW92 ZSgpCiAgICB7CiAgICAgICAgVk0gdm0gPSAoVk0pIGdldFNlbGVjdGVkSXRlbSgpOwogICAgICAg IGlmICh2bSA9PSBudWxsKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0K CiAgICAgICAgaWYgKGdldFdpbmRvdygpICE9IG51bGwpCiAgICAgICAgewogICAgICAgICAgICBy ZXR1cm47CiAgICAgICAgfQoKICAgICAgICBNb3ZlRGlza01vZGVsIG1vZGVsID0gbmV3IE1vdmVE aXNrTW9kZWwoKTsKICAgICAgICBzZXRXaW5kb3cobW9kZWwpOwogICAgICAgIG1vZGVsLnNldFRp dGxlKENvbnN0YW50c01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRDb25zdGFudHMoKS5tb3ZlVmly dHVhbE1hY2hpbmVUaXRsZSgpKTsKICAgICAgICBtb2RlbC5zZXRIYXNoTmFtZSgibW92ZV92aXJ0 dWFsX21hY2hpbmUiKTsgLy8kTk9OLU5MUy0xJAogICAgICAgIG1vZGVsLnNldElzU291cmNlU3Rv cmFnZURvbWFpbk5hbWVBdmFpbGFibGUodHJ1ZSk7CiAgICAgICAgbW9kZWwuc2V0RW50aXR5KHRo aXMpOwogICAgICAgIG1vZGVsLlN0YXJ0UHJvZ3Jlc3MobnVsbCk7CgogICAgICAgIEFzeW5jRGF0 YVByb3ZpZGVyLkdldFZtRGlza0xpc3QobmV3IEFzeW5jUXVlcnkodGhpcywgbmV3IElOZXdBc3lu Y0NhbGxiYWNrKCkgewogICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgcHVibGljIHZv aWQgT25TdWNjZXNzKE9iamVjdCB0YXJnZXQsIE9iamVjdCByZXR1cm5WYWx1ZSkgewogICAgICAg ICAgICAgICAgVm1MaXN0TW9kZWwgdm1MaXN0TW9kZWwgPSAoVm1MaXN0TW9kZWwpIHRhcmdldDsK ICAgICAgICAgICAgICAgIE1vdmVEaXNrTW9kZWwgbW92ZURpc2tNb2RlbCA9IChNb3ZlRGlza01v ZGVsKSB2bUxpc3RNb2RlbC5nZXRXaW5kb3coKTsKICAgICAgICAgICAgICAgIExpbmtlZExpc3Q8 RGlza0ltYWdlPiBkaXNrcyA9IChMaW5rZWRMaXN0PERpc2tJbWFnZT4pIHJldHVyblZhbHVlOwog ICAgICAgICAgICAgICAgQXJyYXlMaXN0PERpc2tJbWFnZT4gZGlza0ltYWdlcyA9IG5ldyBBcnJh eUxpc3Q8RGlza0ltYWdlPigpOwogICAgICAgICAgICAgICAgZGlza0ltYWdlcy5hZGRBbGwoZGlz a3MpOwoKICAgICAgICAgICAgICAgIG1vdmVEaXNrTW9kZWwuaW5pdChkaXNrSW1hZ2VzKTsKICAg ICAgICAgICAgfQogICAgICAgIH0pLCB2bS5nZXRJZCgpLCB0cnVlKTsKICAgIH0KCiAgICBAT3Zl cnJpZGUKICAgIHByb3RlY3RlZCBTdHJpbmcgdGhlcmVJc05vRXhwb3J0RG9tYWluQmFja3VwRW50 aXR5QXR0YWNoRXhwb3J0RG9tYWluVG9WbXNEY01zZygpIHsKICAgICAgICByZXR1cm4gQ29uc3Rh bnRzTWFuYWdlci5nZXRJbnN0YW5jZSgpCiAgICAgICAgICAgICAgICAuZ2V0Q29uc3RhbnRzKCkK ICAgICAgICAgICAgICAgIC50aGVyZUlzTm9FeHBvcnREb21haW5CYWNrdXBWbUF0dGFjaEV4cG9y dERvbWFpblRvVm1zRGNNc2coKTsKICAgIH0KCiAgICBAT3ZlcnJpZGUKICAgIHByb3RlY3RlZCBW ZGNRdWVyeVR5cGUgZ2V0RW50aXR5RXhwb3J0RG9tYWluKCkgewogICAgICAgIHJldHVybiBWZGNR dWVyeVR5cGUuR2V0Vm1zRnJvbUV4cG9ydERvbWFpbjsKICAgIH0KCiAgICBAT3ZlcnJpZGUKICAg IHByb3RlY3RlZCBTdHJpbmcgZW50aXR5UmVzaWRlT25TZXZlcmFsRENzTWFrZVN1cmVUaGVFeHBv cnRlZFZNUmVzaWRlT25TYW1lRGNNc2coKSB7CiAgICAgICAgcmV0dXJuIENvbnN0YW50c01hbmFn ZXIuZ2V0SW5zdGFuY2UoKQogICAgICAgICAgICAgICAgLmdldENvbnN0YW50cygpCiAgICAgICAg ICAgICAgICAudm1zUmVzaWRlT25TZXZlcmFsRENzTWFrZVN1cmVUaGVFeHBvcnRlZFZNUmVzaWRl T25TYW1lRGNNc2coKTsKICAgIH0KCiAgICBAT3ZlcnJpZGUKICAgIHByb3RlY3RlZCBib29sZWFu IGVudGl0aWVzU2VsZWN0ZWRPbkRpZmZlcmVudERhdGFDZW50ZXJzKCkKICAgIHsKICAgICAgICBB cnJheUxpc3Q8Vk0+IHZtcyA9IG5ldyBBcnJheUxpc3Q8Vk0+KCk7CiAgICAgICAgZm9yIChPYmpl Y3Qgc2VsZWN0ZWRJdGVtIDogZ2V0U2VsZWN0ZWRJdGVtcygpKQogICAgICAgIHsKICAgICAgICAg ICAgVk0gYSA9IChWTSkgc2VsZWN0ZWRJdGVtOwogICAgICAgICAgICB2bXMuYWRkKGEpOwogICAg ICAgIH0KCiAgICAgICAgTWFwPE5HdWlkLCBBcnJheUxpc3Q8Vk0+PiB0ID0gbmV3IEhhc2hNYXA8 Tkd1aWQsIEFycmF5TGlzdDxWTT4+KCk7CiAgICAgICAgZm9yIChWTSBhIDogdm1zKQogICAgICAg IHsKICAgICAgICAgICAgaWYgKCF0LmNvbnRhaW5zS2V5KGEuZ2V0U3RvcmFnZVBvb2xJZCgpKSkK ICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdC5wdXQoYS5nZXRTdG9yYWdlUG9vbElkKCks IG5ldyBBcnJheUxpc3Q8Vk0+KCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBBcnJheUxp c3Q8Vk0+IGxpc3QgPSB0LmdldChhLmdldFN0b3JhZ2VQb29sSWQoKSk7CiAgICAgICAgICAgIGxp c3QuYWRkKGEpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHQuc2l6ZSgpID4gMTsKICAgIH0K CiAgICBAT3ZlcnJpZGUKICAgIHByb3RlY3RlZCBTdHJpbmcgZXh0cmFjdE5hbWVGcm9tRW50aXR5 KFZNIGVudGl0eSkgewogICAgICAgIHJldHVybiBlbnRpdHkuZ2V0Vm1OYW1lKCk7CiAgICB9Cgog ICAgQE92ZXJyaWRlCiAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlbnRpdGl0ZXNFcXVhbHNOdWxsU2Fm ZShWTSBlMSwgVk0gZTIpIHsKICAgICAgICByZXR1cm4gZTEuZ2V0SWQoKS5lcXVhbHMoZTIuZ2V0 SWQoKSk7CiAgICB9CgogICAgQE92ZXJyaWRlCiAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbXBvc2VF bnRpdHlPblN0b3JhZ2UoU3RyaW5nIGVudGl0aWVzKSB7CiAgICAgICAgcmV0dXJuIENvbnN0YW50 c01hbmFnZXIuZ2V0SW5zdGFuY2UoKQogICAgICAgICAgICAgICAgLmdldE1lc3NhZ2VzKCkKICAg ICAgICAgICAgICAgIC52bXNBbHJlYWR5RXhpc3RPblRhcmdldEV4cG9ydERvbWFpbihlbnRpdGll cyk7CiAgICB9CgogICAgQE92ZXJyaWRlCiAgICBwcm90ZWN0ZWQgSXRlcmFibGU8Vk0+IGFzSXRl cmFibGVSZXR1cm5WYWx1ZShPYmplY3QgcmV0dXJuVmFsdWUpIHsKICAgICAgICByZXR1cm4gKExp c3Q8Vk0+KSByZXR1cm5WYWx1ZTsKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgR2V0VGVtcGxhdGVz Tm90UHJlc2VudE9uRXhwb3J0RG9tYWluKCkKICAgIHsKICAgICAgICBFeHBvcnRWbU1vZGVsIG1v ZGVsID0gKEV4cG9ydFZtTW9kZWwpIGdldFdpbmRvdygpOwogICAgICAgIEd1aWQgc3RvcmFnZURv bWFpbklkID0gKChzdG9yYWdlX2RvbWFpbnMpIG1vZGVsLmdldFN0b3JhZ2UoKS5nZXRTZWxlY3Rl ZEl0ZW0oKSkuZ2V0SWQoKTsKCiAgICAgICAgQXN5bmNEYXRhUHJvdmlkZXIuR2V0RGF0YUNlbnRl cnNCeVN0b3JhZ2VEb21haW4obmV3IEFzeW5jUXVlcnkodGhpcywKICAgICAgICAgICAgICAgIG5l dyBJTmV3QXN5bmNDYWxsYmFjaygpIHsKICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAg ICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBPblN1Y2Nlc3MoT2JqZWN0IHRhcmdldCwgT2Jq ZWN0IHJldHVyblZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFZtTGlzdE1vZGVsIHZt TGlzdE1vZGVsID0gKFZtTGlzdE1vZGVsKSB0YXJnZXQ7CiAgICAgICAgICAgICAgICAgICAgICAg IEFycmF5TGlzdDxzdG9yYWdlX3Bvb2w+IHN0b3JhZ2VQb29scyA9CiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgKEFycmF5TGlzdDxzdG9yYWdlX3Bvb2w+KSByZXR1cm5WYWx1ZTsKICAg ICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZV9wb29sIHN0b3JhZ2VQb29sID0gc3RvcmFnZVBv b2xzLnNpemUoKSA+IDAgPyBzdG9yYWdlUG9vbHMuZ2V0KDApIDogbnVsbDsKCiAgICAgICAgICAg ICAgICAgICAgICAgIHZtTGlzdE1vZGVsLlBvc3RHZXRUZW1wbGF0ZXNOb3RQcmVzZW50T25FeHBv cnREb21haW4oc3RvcmFnZVBvb2wpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAg ICAgIH0pLCBzdG9yYWdlRG9tYWluSWQpOwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBQb3N0R2V0 VGVtcGxhdGVzTm90UHJlc2VudE9uRXhwb3J0RG9tYWluKHN0b3JhZ2VfcG9vbCBzdG9yYWdlUG9v bCkKICAgIHsKICAgICAgICBFeHBvcnRWbU1vZGVsIG1vZGVsID0gKEV4cG9ydFZtTW9kZWwpIGdl dFdpbmRvdygpOwogICAgICAgIEd1aWQgc3RvcmFnZURvbWFpbklkID0gKChzdG9yYWdlX2RvbWFp bnMpIG1vZGVsLmdldFN0b3JhZ2UoKS5nZXRTZWxlY3RlZEl0ZW0oKSkuZ2V0SWQoKTsKCiAgICAg ICAgaWYgKHN0b3JhZ2VQb29sICE9IG51bGwpCiAgICAgICAgewogICAgICAgICAgICBBc3luY0Rh dGFQcm92aWRlci5HZXRBbGxUZW1wbGF0ZXNGcm9tRXhwb3J0RG9tYWluKG5ldyBBc3luY1F1ZXJ5 KHRoaXMsCiAgICAgICAgICAgICAgICAgICAgbmV3IElOZXdBc3luY0NhbGxiYWNrKCkgewogICAg ICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAgICAgICAgICAgcHVi bGljIHZvaWQgT25TdWNjZXNzKE9iamVjdCB0YXJnZXQsIE9iamVjdCByZXR1cm5WYWx1ZSkgewog ICAgICAgICAgICAgICAgICAgICAgICAgICAgVm1MaXN0TW9kZWwgdm1MaXN0TW9kZWwgPSAoVm1M aXN0TW9kZWwpIHRhcmdldDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhc2hNYXA8Vm1U ZW1wbGF0ZSwgQXJyYXlMaXN0PERpc2tJbWFnZT4+IHRlbXBsYXRlc0Rpc2tTZXQgPQogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSGFzaE1hcDxWbVRlbXBsYXRlLCBBcnJheUxp c3Q8RGlza0ltYWdlPj4pIHJldHVyblZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAg SGFzaE1hcDxTdHJpbmcsIEFycmF5TGlzdDxTdHJpbmc+PiB0ZW1wbGF0ZURpYyA9CiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgQXJyYXlMaXN0 PFN0cmluZz4+KCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgcmVs ZXZhbnQgdGVtcGxhdGVzIGFyZSBhbHJlYWR5IHRoZXJlCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICBmb3IgKE9iamVjdCBzZWxlY3RlZEl0ZW0gOiB2bUxpc3RNb2RlbC5nZXRTZWxlY3RlZEl0 ZW1zKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgVk0gdm0gPSAoVk0pIHNlbGVjdGVkSXRlbTsKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBib29sZWFuIGhhc01hdGNoID0gZmFsc2U7CiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgZm9yIChWbVRlbXBsYXRlIGEgOiB0ZW1wbGF0ZXNEaXNrU2V0LmtleVNl dCgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgaWYgKHZtLmdldFZtdEd1aWQoKS5lcXVhbHMoYS5nZXRJZCgpKSkK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgaGFzTWF0Y2ggPSB0cnVlOwogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGlmICghdm0uZ2V0Vm10R3VpZCgpLmVxdWFscyhOR3VpZC5FbXB0 eSkgJiYgIWhhc01hdGNoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0ZW1wbGF0ZURpYy5jb250YWluc0tl eSh2bS5nZXRWbXROYW1lKCkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7 CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZURpYy5wdXQo dm0uZ2V0Vm10TmFtZSgpLCBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSk7CiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgdGVtcGxhdGVEaWMuZ2V0KHZtLmdldFZtdE5hbWUoKSkuYWRkKHZtLmdldFZtTmFtZSgpKTsK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAg ICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRlbXBTdHI7CiAgICAg ICAgICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiB0ZW1wTGlzdDsKICAgICAg ICAgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IG1pc3NpbmdUZW1wbGF0ZXMg PSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZv ciAoTWFwLkVudHJ5PFN0cmluZywgQXJyYXlMaXN0PFN0cmluZz4+IGtleVZhbHVlUGFpciA6IHRl bXBsYXRlRGljLmVudHJ5U2V0KCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcExpc3QgPSBrZXlWYWx1ZVBhaXIuZ2V0VmFs dWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wU3RyID0gIlRlbXBsYXRl ICIgKyBrZXlWYWx1ZVBhaXIuZ2V0S2V5KCkgKyAiIChmb3IgIjsgLy8kTk9OLU5MUy0xJCAvLyRO T04tTkxTLTIkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGk7CiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRlbXBMaXN0LnNpemUoKSAt IDE7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHRlbXBTdHIgKz0gdGVtcExpc3QuZ2V0KGkpICsgIiwgIjsg Ly8kTk9OLU5MUy0xJAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB0ZW1wU3RyICs9IHRlbXBMaXN0LmdldChpKSArICIpIjsg Ly8kTk9OLU5MUy0xJAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NpbmdUZW1w bGF0ZXMuYWRkKHRlbXBTdHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHZtTGlzdE1vZGVsLlBvc3RFeHBvcnRHZXRNaXNzaW5nVGVt cGxhdGVzKG1pc3NpbmdUZW1wbGF0ZXMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAg ICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgICAgICAgc3RvcmFnZVBvb2wuZ2V0SWQo KSwKICAgICAgICAgICAgICAgICAgICBzdG9yYWdlRG9tYWluSWQpOwogICAgICAgIH0KICAgIH0K CiAgICBwcml2YXRlIHZvaWQgUG9zdEV4cG9ydEdldE1pc3NpbmdUZW1wbGF0ZXMoQXJyYXlMaXN0 PFN0cmluZz4gbWlzc2luZ1RlbXBsYXRlc0Zyb21WbXMpCiAgICB7CiAgICAgICAgRXhwb3J0Vm1N b2RlbCBtb2RlbCA9IChFeHBvcnRWbU1vZGVsKSBnZXRXaW5kb3coKTsKICAgICAgICBHdWlkIHN0 b3JhZ2VEb21haW5JZCA9ICgoc3RvcmFnZV9kb21haW5zKSBtb2RlbC5nZXRTdG9yYWdlKCkuZ2V0 U2VsZWN0ZWRJdGVtKCkpLmdldElkKCk7CiAgICAgICAgQXJyYXlMaXN0PFZkY0FjdGlvblBhcmFt ZXRlcnNCYXNlPiBwYXJhbWV0ZXJzID0gbmV3IEFycmF5TGlzdDxWZGNBY3Rpb25QYXJhbWV0ZXJz QmFzZT4oKTsKCiAgICAgICAgbW9kZWwuU3RvcFByb2dyZXNzKCk7CgogICAgICAgIGZvciAoT2Jq ZWN0IGEgOiBnZXRTZWxlY3RlZEl0ZW1zKCkpCiAgICAgICAgewogICAgICAgICAgICBWTSB2bSA9 IChWTSkgYTsKICAgICAgICAgICAgTW92ZVZtUGFyYW1ldGVycyBwYXJhbWV0ZXIgPSBuZXcgTW92 ZVZtUGFyYW1ldGVycyh2bS5nZXRJZCgpLCBzdG9yYWdlRG9tYWluSWQpOwogICAgICAgICAgICBw YXJhbWV0ZXIuc2V0Rm9yY2VPdmVycmlkZSgoQm9vbGVhbikgbW9kZWwuZ2V0Rm9yY2VPdmVycmlk ZSgpLmdldEVudGl0eSgpKTsKICAgICAgICAgICAgcGFyYW1ldGVyLnNldENvcHlDb2xsYXBzZSgo Qm9vbGVhbikgbW9kZWwuZ2V0Q29sbGFwc2VTbmFwc2hvdHMoKS5nZXRFbnRpdHkoKSk7CiAgICAg ICAgICAgIHBhcmFtZXRlci5zZXRUZW1wbGF0ZU11c3RFeGlzdHModHJ1ZSk7CgogICAgICAgICAg ICBwYXJhbWV0ZXJzLmFkZChwYXJhbWV0ZXIpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCEoQm9v bGVhbikgbW9kZWwuZ2V0Q29sbGFwc2VTbmFwc2hvdHMoKS5nZXRFbnRpdHkoKSkKICAgICAgICB7 CiAgICAgICAgICAgIGlmICgobWlzc2luZ1RlbXBsYXRlc0Zyb21WbXMgPT0gbnVsbCB8fCBtaXNz aW5nVGVtcGxhdGVzRnJvbVZtcy5zaXplKCkgPiAwKSkKICAgICAgICAgICAgewogICAgICAgICAg ICAgICAgQ29uZmlybWF0aW9uTW9kZWwgY29uZmlybU1vZGVsID0gbmV3IENvbmZpcm1hdGlvbk1v ZGVsKCk7CiAgICAgICAgICAgICAgICBzZXRDb25maXJtV2luZG93KGNvbmZpcm1Nb2RlbCk7CiAg ICAgICAgICAgICAgICBjb25maXJtTW9kZWwuc2V0VGl0bGUoQ29uc3RhbnRzTWFuYWdlci5nZXRJ bnN0YW5jZSgpCiAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb25zdGFudHMoKQogICAgICAg ICAgICAgICAgICAgICAgICAudGVtcGxhdGVzTm90Rm91bmRPbkV4cG9ydERvbWFpblRpdGxlKCkp OwogICAgICAgICAgICAgICAgY29uZmlybU1vZGVsLnNldEhhc2hOYW1lKCJ0ZW1wbGF0ZV9ub3Rf Zm91bmRfb25fZXhwb3J0X2RvbWFpbiIpOyAvLyROT04tTkxTLTEkCgogICAgICAgICAgICAgICAg Y29uZmlybU1vZGVsLnNldE1lc3NhZ2UobWlzc2luZ1RlbXBsYXRlc0Zyb21WbXMgPT0gbnVsbCA/ IENvbnN0YW50c01hbmFnZXIuZ2V0SW5zdGFuY2UoKQogICAgICAgICAgICAgICAgICAgICAgICAu Z2V0Q29uc3RhbnRzKCkKICAgICAgICAgICAgICAgICAgICAgICAgLmNvdWxkTm90UmVhZFRlbXBs YXRlc0Zyb21FeHBvcnREb21haW5Nc2coKQogICAgICAgICAgICAgICAgICAgICAgICA6IENvbnN0 YW50c01hbmFnZXIuZ2V0SW5zdGFuY2UoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IC5nZXRDb25zdGFudHMoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVGb2xs b3dpbmdUZW1wbGF0ZXNBcmVNaXNzaW5nT25UYXJnZXRFeHBvcnREb21haW5Nc2coKSk7CiAgICAg ICAgICAgICAgICBjb25maXJtTW9kZWwuc2V0SXRlbXMobWlzc2luZ1RlbXBsYXRlc0Zyb21WbXMp OwoKICAgICAgICAgICAgICAgIFVJQ29tbWFuZCB0ZW1wVmFyID0gbmV3IFVJQ29tbWFuZCgiT25F eHBvcnROb1RlbXBsYXRlcyIsIHRoaXMpOyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICAgICB0 ZW1wVmFyLnNldFRpdGxlKENvbnN0YW50c01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRDb25zdGFu dHMoKS5vaygpKTsKICAgICAgICAgICAgICAgIHRlbXBWYXIuc2V0SXNEZWZhdWx0KHRydWUpOwog ICAgICAgICAgICAgICAgY29uZmlybU1vZGVsLmdldENvbW1hbmRzKCkuYWRkKHRlbXBWYXIpOwog ICAgICAgICAgICAgICAgVUlDb21tYW5kIHRlbXBWYXIyID0gbmV3IFVJQ29tbWFuZCgiQ2FuY2Vs Q29uZmlybWF0aW9uIiwgdGhpcyk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgICAgIHRlbXBW YXIyLnNldFRpdGxlKENvbnN0YW50c01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRDb25zdGFudHMo KS5jYW5jZWwoKSk7CiAgICAgICAgICAgICAgICB0ZW1wVmFyMi5zZXRJc0NhbmNlbCh0cnVlKTsK ICAgICAgICAgICAgICAgIGNvbmZpcm1Nb2RlbC5nZXRDb21tYW5kcygpLmFkZCh0ZW1wVmFyMik7 CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAg ICAgICBpZiAobW9kZWwuZ2V0UHJvZ3Jlc3MoKSAhPSBudWxsKQogICAgICAgICAgICAgICAgewog ICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAg ICAgICBtb2RlbC5TdGFydFByb2dyZXNzKG51bGwpOwoKICAgICAgICAgICAgICAgIEZyb250ZW5k LlJ1bk11bHRpcGxlQWN0aW9uKFZkY0FjdGlvblR5cGUuRXhwb3J0Vm0sIHBhcmFtZXRlcnMsCiAg ICAgICAgICAgICAgICAgICAgICAgIG5ldyBJRnJvbnRlbmRNdWx0aXBsZUFjdGlvbkFzeW5jQ2Fs bGJhY2soKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIEV4ZWN1dGVkKEZyb250ZW5kTXVsdGlwbGVB Y3Rpb25Bc3luY1Jlc3VsdCByZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBFeHBvcnRWbU1vZGVsIGxvY2FsTW9kZWwgPSAoRXhwb3J0Vm1Nb2RlbCkgcmVzdWx0LmdldFN0 YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxNb2RlbC5TdG9wUHJv Z3Jlc3MoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW5jZWwoKTsKICAgICAg ICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwgbW9kZWwp OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAg ICAgIGlmIChtb2RlbC5nZXRQcm9ncmVzcygpICE9IG51bGwpCiAgICAgICAgICAgIHsKICAgICAg ICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yIChWZGNBY3Rp b25QYXJhbWV0ZXJzQmFzZSBpdGVtIDogcGFyYW1ldGVycykKICAgICAgICAgICAgewogICAgICAg ICAgICAgICAgTW92ZVZtUGFyYW1ldGVycyBwYXJhbWV0ZXIgPSAoTW92ZVZtUGFyYW1ldGVycykg aXRlbTsKICAgICAgICAgICAgICAgIHBhcmFtZXRlci5zZXRUZW1wbGF0ZU11c3RFeGlzdHMoZmFs c2UpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBtb2RlbC5TdGFydFByb2dyZXNzKG51bGwp OwoKICAgICAgICAgICAgRnJvbnRlbmQuUnVuTXVsdGlwbGVBY3Rpb24oVmRjQWN0aW9uVHlwZS5F eHBvcnRWbSwgcGFyYW1ldGVycywKICAgICAgICAgICAgICAgICAgICBuZXcgSUZyb250ZW5kTXVs dGlwbGVBY3Rpb25Bc3luY0NhbGxiYWNrKCkgewogICAgICAgICAgICAgICAgICAgICAgICBAT3Zl cnJpZGUKICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgRXhlY3V0ZWQoRnJvbnRl bmRNdWx0aXBsZUFjdGlvbkFzeW5jUmVzdWx0IHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAg ICAgICAgICAgRXhwb3J0Vm1Nb2RlbCBsb2NhbE1vZGVsID0gKEV4cG9ydFZtTW9kZWwpIHJlc3Vs dC5nZXRTdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxNb2RlbC5TdG9w UHJvZ3Jlc3MoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbmNlbCgpOwogICAgICAg ICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgbW9kZWwpOwogICAgICAg IH0KICAgIH0KCiAgICBwdWJsaWMgdm9pZCBPbkV4cG9ydCgpCiAgICB7CiAgICAgICAgRXhwb3J0 Vm1Nb2RlbCBtb2RlbCA9IChFeHBvcnRWbU1vZGVsKSBnZXRXaW5kb3coKTsKICAgICAgICBHdWlk IHN0b3JhZ2VEb21haW5JZCA9ICgoc3RvcmFnZV9kb21haW5zKSBtb2RlbC5nZXRTdG9yYWdlKCku Z2V0U2VsZWN0ZWRJdGVtKCkpLmdldElkKCk7CiAgICAgICAgaWYgKCFtb2RlbC5WYWxpZGF0ZSgp KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgbW9kZWwu U3RhcnRQcm9ncmVzcyhudWxsKTsKCiAgICAgICAgR2V0VGVtcGxhdGVzTm90UHJlc2VudE9uRXhw b3J0RG9tYWluKCk7CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIE9uRXhwb3J0Tm9UZW1wbGF0ZXMo KQogICAgewogICAgICAgIEV4cG9ydFZtTW9kZWwgbW9kZWwgPSAoRXhwb3J0Vm1Nb2RlbCkgZ2V0 V2luZG93KCk7CiAgICAgICAgR3VpZCBzdG9yYWdlRG9tYWluSWQgPSAoKHN0b3JhZ2VfZG9tYWlu cykgbW9kZWwuZ2V0U3RvcmFnZSgpLmdldFNlbGVjdGVkSXRlbSgpKS5nZXRJZCgpOwoKICAgICAg ICBpZiAobW9kZWwuZ2V0UHJvZ3Jlc3MoKSAhPSBudWxsKQogICAgICAgIHsKICAgICAgICAgICAg cmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgQXJyYXlMaXN0PFZkY0FjdGlvblBhcmFtZXRlcnNC YXNlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxWZGNBY3Rpb25QYXJhbWV0ZXJzQmFzZT4oKTsKICAg ICAgICBmb3IgKE9iamVjdCBpdGVtIDogZ2V0U2VsZWN0ZWRJdGVtcygpKQogICAgICAgIHsKICAg ICAgICAgICAgVk0gYSA9IChWTSkgaXRlbTsKICAgICAgICAgICAgTW92ZVZtUGFyYW1ldGVycyBw YXJhbWV0ZXJzID0gbmV3IE1vdmVWbVBhcmFtZXRlcnMoYS5nZXRJZCgpLCBzdG9yYWdlRG9tYWlu SWQpOwogICAgICAgICAgICBwYXJhbWV0ZXJzLnNldEZvcmNlT3ZlcnJpZGUoKEJvb2xlYW4pIG1v ZGVsLmdldEZvcmNlT3ZlcnJpZGUoKS5nZXRFbnRpdHkoKSk7CiAgICAgICAgICAgIHBhcmFtZXRl cnMuc2V0Q29weUNvbGxhcHNlKChCb29sZWFuKSBtb2RlbC5nZXRDb2xsYXBzZVNuYXBzaG90cygp LmdldEVudGl0eSgpKTsKICAgICAgICAgICAgcGFyYW1ldGVycy5zZXRUZW1wbGF0ZU11c3RFeGlz dHMoZmFsc2UpOwoKICAgICAgICAgICAgbGlzdC5hZGQocGFyYW1ldGVycyk7CiAgICAgICAgfQoK ICAgICAgICBtb2RlbC5TdGFydFByb2dyZXNzKG51bGwpOwoKICAgICAgICBGcm9udGVuZC5SdW5N dWx0aXBsZUFjdGlvbihWZGNBY3Rpb25UeXBlLkV4cG9ydFZtLCBsaXN0LAogICAgICAgICAgICAg ICAgbmV3IElGcm9udGVuZE11bHRpcGxlQWN0aW9uQXN5bmNDYWxsYmFjaygpIHsKICAgICAgICAg ICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBFeGVj dXRlZChGcm9udGVuZE11bHRpcGxlQWN0aW9uQXN5bmNSZXN1bHQgcmVzdWx0KSB7CgogICAgICAg ICAgICAgICAgICAgICAgICBFeHBvcnRWbU1vZGVsIGxvY2FsTW9kZWwgPSAoRXhwb3J0Vm1Nb2Rl bCkgcmVzdWx0LmdldFN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsTW9kZWwu U3RvcFByb2dyZXNzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIENhbmNlbCgpOwoKICAgICAg ICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCBtb2RlbCk7CiAgICB9CgogICAgcHJp dmF0ZSB2b2lkIFJ1bk9uY2UoKQogICAgewogICAgICAgIFZNIHZtID0gKFZNKSBnZXRTZWxlY3Rl ZEl0ZW0oKTsKICAgICAgICBSdW5PbmNlTW9kZWwgbW9kZWwgPSBuZXcgUnVuT25jZU1vZGVsKCk7 CiAgICAgICAgc2V0V2luZG93KG1vZGVsKTsKICAgICAgICBtb2RlbC5zZXRUaXRsZShDb25zdGFu dHNNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0Q29uc3RhbnRzKCkucnVuVmlydHVhbE1hY2hpbmVz VGl0bGUoKSk7CiAgICAgICAgbW9kZWwuc2V0SGFzaE5hbWUoInJ1bl92aXJ0dWFsX21hY2hpbmUi KTsgLy8kTk9OLU5MUy0xJAogICAgICAgIG1vZGVsLmdldEF0dGFjaElzbygpLnNldEVudGl0eShm YWxzZSk7CiAgICAgICAgbW9kZWwuZ2V0QXR0YWNoRmxvcHB5KCkuc2V0RW50aXR5KGZhbHNlKTsK ICAgICAgICBtb2RlbC5nZXRSdW5Bc1N0YXRlbGVzcygpLnNldEVudGl0eSh2bS5pc1N0YXRlbGVz cygpKTsKICAgICAgICBtb2RlbC5nZXRSdW5BbmRQYXVzZSgpLnNldEVudGl0eShmYWxzZSk7CiAg ICAgICAgbW9kZWwuc2V0SHdBY2NlbGVyYXRpb24odHJ1ZSk7CgogICAgICAgIC8vIHBhc3Npbmcg S2VybmVsIHBhcmFtZXRlcnMKICAgICAgICBtb2RlbC5nZXRLZXJuZWxfcGFyYW1ldGVycygpLnNl dEVudGl0eSh2bS5nZXRLZXJuZWxQYXJhbXMoKSk7CiAgICAgICAgbW9kZWwuZ2V0S2VybmVsX3Bh dGgoKS5zZXRFbnRpdHkodm0uZ2V0S2VybmVsVXJsKCkpOwogICAgICAgIG1vZGVsLmdldEluaXRy ZF9wYXRoKCkuc2V0RW50aXR5KHZtLmdldEluaXRyZFVybCgpKTsKCiAgICAgICAgLy8gQ3VzdG9t IFByb3BlcnRpZXMKICAgICAgICBtb2RlbC5nZXRDdXN0b21Qcm9wZXJ0eVNoZWV0KCkKICAgICAg ICAgICAgICAgIC5zZXRLZXlWYWx1ZVN0cmluZyh0aGlzLmdldEN1c3RvbVByb3BlcnRpZXNLZXlz TGlzdCgpCiAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQodm0uZ2V0VmRzR3JvdXBDb21wYXRp YmlsaXR5VmVyc2lvbigpKSk7CiAgICAgICAgbW9kZWwuZ2V0Q3VzdG9tUHJvcGVydHlTaGVldCgp LnNldEVudGl0eSh2bS5nZXRDdXN0b21Qcm9wZXJ0aWVzKCkpOwogICAgICAgIG1vZGVsLnNldEN1 c3RvbVByb3BlcnRpZXNLZXlzTGlzdCh0aGlzLmdldEN1c3RvbVByb3BlcnRpZXNLZXlzTGlzdCgp CiAgICAgICAgICAgICAgICAuZ2V0KHZtLmdldFZkc0dyb3VwQ29tcGF0aWJpbGl0eVZlcnNpb24o KSkpOwoKICAgICAgICBtb2RlbC5zZXRJc0xpbnV4X1VuYXNzaWduX1Vua25vd25PUyhBc3luY0Rh dGFQcm92aWRlci5Jc0xpbnV4T3NUeXBlKHZtLmdldFZtT3MoKSkKICAgICAgICAgICAgICAgIHx8 IHZtLmdldFZtT3MoKSA9PSBWbU9zVHlwZS5VbmFzc2lnbmVkIHx8IHZtLmdldFZtT3MoKSA9PSBW bU9zVHlwZS5PdGhlcik7CiAgICAgICAgbW9kZWwuZ2V0SXNMaW51eE9wdGlvbnNBdmFpbGFibGUo KS5zZXRFbnRpdHkobW9kZWwuZ2V0SXNMaW51eF9VbmFzc2lnbl9Vbmtub3duT1MoKSk7CiAgICAg ICAgbW9kZWwuc2V0SXNXaW5kb3dzT1MoQXN5bmNEYXRhUHJvdmlkZXIuSXNXaW5kb3dzT3NUeXBl KHZtLmdldFZtT3MoKSkpOwogICAgICAgIG1vZGVsLmdldElzVm1GaXJzdFJ1bigpLnNldEVudGl0 eSghdm0uaXNJbml0aWFsaXplZCgpKTsKICAgICAgICBtb2RlbC5nZXRTeXNQcmVwRG9tYWluTmFt ZSgpLnNldFNlbGVjdGVkSXRlbSh2bS5nZXRWbURvbWFpbigpKTsKCiAgICAgICAgUnVuT25jZVVw ZGF0ZURpc3BsYXlQcm90b2NvbHModm0pOwogICAgICAgIFJ1bk9uY2VVcGRhdGVGbG9wcHkodm0s IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsKICAgICAgICBSdW5PbmNlVXBkYXRlSW1hZ2VzKHZt KTsKICAgICAgICBSdW5PbmNlVXBkYXRlRG9tYWlucygpOwogICAgICAgIFJ1bk9uY2VVcGRhdGVC b290U2VxdWVuY2Uodm0pOwoKICAgICAgICBVSUNvbW1hbmQgdGVtcFZhciA9IG5ldyBVSUNvbW1h bmQoIk9uUnVuT25jZSIsIHRoaXMpOyAvLyROT04tTkxTLTEkCiAgICAgICAgdGVtcFZhci5zZXRU aXRsZShDb25zdGFudHNNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0Q29uc3RhbnRzKCkub2soKSk7 CiAgICAgICAgdGVtcFZhci5zZXRJc0RlZmF1bHQodHJ1ZSk7CiAgICAgICAgbW9kZWwuZ2V0Q29t bWFuZHMoKS5hZGQodGVtcFZhcik7CiAgICAgICAgVUlDb21tYW5kIHRlbXBWYXIyID0gbmV3IFVJ Q29tbWFuZCgiQ2FuY2VsIiwgdGhpcyk7IC8vJE5PTi1OTFMtMSQKICAgICAgICB0ZW1wVmFyMi5z ZXRUaXRsZShDb25zdGFudHNNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0Q29uc3RhbnRzKCkuY2Fu Y2VsKCkpOwogICAgICAgIHRlbXBWYXIyLnNldElzQ2FuY2VsKHRydWUpOwogICAgICAgIG1vZGVs LmdldENvbW1hbmRzKCkuYWRkKHRlbXBWYXIyKTsKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgUnVu T25jZVVwZGF0ZURpc3BsYXlQcm90b2NvbHMoVk0gdm0pCiAgICB7CiAgICAgICAgUnVuT25jZU1v ZGVsIG1vZGVsID0gKFJ1bk9uY2VNb2RlbCkgZ2V0V2luZG93KCk7CgogICAgICAgIEVudGl0eU1v ZGVsIHRlbXBWYXIgPSBuZXcgRW50aXR5TW9kZWwoKTsKICAgICAgICB0ZW1wVmFyLnNldFRpdGxl KENvbnN0YW50c01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRDb25zdGFudHMoKS5WTkNUaXRsZSgp KTsKICAgICAgICB0ZW1wVmFyLnNldEVudGl0eShEaXNwbGF5VHlwZS52bmMpOwogICAgICAgIEVu dGl0eU1vZGVsIHZuY1Byb3RvY29sID0gdGVtcFZhcjsKCiAgICAgICAgRW50aXR5TW9kZWwgdGVt cFZhcjIgPSBuZXcgRW50aXR5TW9kZWwoKTsKICAgICAgICB0ZW1wVmFyMi5zZXRUaXRsZShDb25z dGFudHNNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0Q29uc3RhbnRzKCkuc3BpY2VUaXRsZSgpKTsK ICAgICAgICB0ZW1wVmFyMi5zZXRFbnRpdHkoRGlzcGxheVR5cGUucXhsKTsKICAgICAgICBFbnRp dHlNb2RlbCBxeGxQcm90b2NvbCA9IHRlbXBWYXIyOwoKICAgICAgICBib29sZWFuIGlzVm5jU2Vs ZWN0ZWQgPSB2bS5nZXREZWZhdWx0RGlzcGxheVR5cGUoKSA9PSBEaXNwbGF5VHlwZS52bmM7CiAg ICAgICAgbW9kZWwuZ2V0RGlzcGxheUNvbnNvbGVfVm5jX0lzU2VsZWN0ZWQoKS5zZXRFbnRpdHko aXNWbmNTZWxlY3RlZCk7CiAgICAgICAgbW9kZWwuZ2V0RGlzcGxheUNvbnNvbGVfU3BpY2VfSXNT ZWxlY3RlZCgpLnNldEVudGl0eSghaXNWbmNTZWxlY3RlZCk7CgogICAgICAgIEFycmF5TGlzdDxF bnRpdHlNb2RlbD4gaXRlbXMgPSBuZXcgQXJyYXlMaXN0PEVudGl0eU1vZGVsPigpOwogICAgICAg IGl0ZW1zLmFkZCh2bmNQcm90b2NvbCk7CiAgICAgICAgaXRlbXMuYWRkKHF4bFByb3RvY29sKTsK ICAgICAgICBtb2RlbC5nZXREaXNwbGF5UHJvdG9jb2woKS5zZXRJdGVtcyhpdGVtcyk7CiAgICAg ICAgbW9kZWwuZ2V0RGlzcGxheVByb3RvY29sKCkuc2V0U2VsZWN0ZWRJdGVtKGlzVm5jU2VsZWN0 ZWQgPyB2bmNQcm90b2NvbCA6IHF4bFByb3RvY29sKTsKICAgIH0KCiAgICBwcml2YXRlIHZvaWQg UnVuT25jZVVwZGF0ZUJvb3RTZXF1ZW5jZShWTSB2bSkKICAgIHsKICAgICAgICBBc3luY1F1ZXJ5 IF9hc3luY1F1ZXJ5ID0gbmV3IEFzeW5jUXVlcnkoKTsKICAgICAgICBfYXN5bmNRdWVyeS5zZXRN b2RlbCh0aGlzKTsKCiAgICAgICAgX2FzeW5jUXVlcnkuYXN5bmNDYWxsYmFjayA9IG5ldyBJTmV3 QXN5bmNDYWxsYmFjaygpIHsKICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgIHB1Ymxp YyB2b2lkIE9uU3VjY2VzcyhPYmplY3QgbW9kZWwsIE9iamVjdCBSZXR1cm5WYWx1ZSkKICAgICAg ICAgICAgewogICAgICAgICAgICAgICAgVm1MaXN0TW9kZWwgdm1MaXN0TW9kZWwgPSAoVm1MaXN0 TW9kZWwpIG1vZGVsOwogICAgICAgICAgICAgICAgUnVuT25jZU1vZGVsIHJ1bk9uY2VNb2RlbCA9 IChSdW5PbmNlTW9kZWwpIHZtTGlzdE1vZGVsLmdldFdpbmRvdygpOwogICAgICAgICAgICAgICAg Ym9vbGVhbiBoYXNOaWNzID0KICAgICAgICAgICAgICAgICAgICAgICAgKChBcnJheUxpc3Q8Vm1O ZXR3b3JrSW50ZXJmYWNlPikgKChWZGNRdWVyeVJldHVyblZhbHVlKSBSZXR1cm5WYWx1ZSkuZ2V0 UmV0dXJuVmFsdWUoKSkuc2l6ZSgpID4gMDsKCiAgICAgICAgICAgICAgICBpZiAoIWhhc05pY3Mp CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQm9vdFNlcXVlbmNlTW9kZWwg Ym9vdFNlcXVlbmNlTW9kZWwgPSBydW5PbmNlTW9kZWwuZ2V0Qm9vdFNlcXVlbmNlKCk7CiAgICAg ICAgICAgICAgICAgICAgYm9vdFNlcXVlbmNlTW9kZWwuZ2V0TmV0d29ya09wdGlvbigpLnNldElz Q2hhbmdhYmxlKGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICBib290U2VxdWVuY2VNb2RlbC5n ZXROZXR3b3JrT3B0aW9uKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDaGFuZ2VQ cm9oaWJpdGlvblJlYXNvbnMoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZCgiVmly dHVhbCBNYWNoaW5lIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgbmV0d29yayBpbnRlcmZhY2UgZGVm aW5lZCB0byBib290IGZyb20gbmV0d29yay4iKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAg ICAgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgRnJvbnRlbmQuUnVuUXVlcnko VmRjUXVlcnlUeXBlLkdldFZtSW50ZXJmYWNlc0J5Vm1JZCwgbmV3IElkUXVlcnlQYXJhbWV0ZXJz KHZtLmdldElkKCkpLCBfYXN5bmNRdWVyeSk7CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIFJ1bk9u Y2VVcGRhdGVEb21haW5zKCkKICAgIHsKICAgICAgICBSdW5PbmNlTW9kZWwgbW9kZWwgPSAoUnVu T25jZU1vZGVsKSBnZXRXaW5kb3coKTsKCiAgICAgICAgLy8gVXBkYXRlIERvbWFpbiBsaXN0CiAg ICAgICAgQXN5bmNEYXRhUHJvdmlkZXIuR2V0RG9tYWluTGlzdChuZXcgQXN5bmNRdWVyeShtb2Rl bCwKICAgICAgICAgICAgICAgIG5ldyBJTmV3QXN5bmNDYWxsYmFjaygpIHsKICAgICAgICAgICAg ICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBPblN1Y2Nl c3MoT2JqZWN0IHRhcmdldCwgT2JqZWN0IHJldHVyblZhbHVlKSB7CgogICAgICAgICAgICAgICAg ICAgICAgICBSdW5PbmNlTW9kZWwgcnVuT25jZU1vZGVsID0gKFJ1bk9uY2VNb2RlbCkgdGFyZ2V0 OwogICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gZG9tYWlucyA9IChMaXN0PFN0 cmluZz4pIHJldHVyblZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb2xkRG9t YWluID0gKFN0cmluZykgcnVuT25jZU1vZGVsLmdldFN5c1ByZXBEb21haW5OYW1lKCkuZ2V0U2Vs ZWN0ZWRJdGVtKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbGREb21haW4gIT0gbnVs bCAmJiAhb2xkRG9tYWluLmVxdWFscygiIikgJiYgIWRvbWFpbnMuY29udGFpbnMob2xkRG9tYWlu KSkgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAg ICAgICAgICAgICAgICBkb21haW5zLmFkZCgwLCBvbGREb21haW4pOwogICAgICAgICAgICAgICAg ICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bk9uY2VNb2RlbC5nZXRTeXNQcmVw RG9tYWluTmFtZSgpLnNldEl0ZW1zKGRvbWFpbnMpOwogICAgICAgICAgICAgICAgICAgICAgICBT dHJpbmcgc2VsZWN0ZWREb21haW4gPSAob2xkRG9tYWluICE9IG51bGwpID8gb2xkRG9tYWluIDog TGlucS5GaXJzdE9yRGVmYXVsdChkb21haW5zKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYg KCFTdHJpbmdIZWxwZXIuc3RyaW5nc0VxdWFsKHNlbGVjdGVkRG9tYWluLCAiIikpIC8vJE5PTi1O TFMtMSQKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAg ICAgcnVuT25jZU1vZGVsLmdldFN5c1ByZXBEb21haW5OYW1lKCkuc2V0U2VsZWN0ZWRJdGVtKHNl bGVjdGVkRG9tYWluKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAg ICAgICB9CiAgICAgICAgICAgICAgICB9KSwgdHJ1ZSk7CiAgICB9CgogICAgcHVibGljIHZvaWQg UnVuT25jZVVwZGF0ZUZsb3BweShWTSB2bSwgQXJyYXlMaXN0PFN0cmluZz4gaW1hZ2VzKQogICAg ewogICAgICAgIFJ1bk9uY2VNb2RlbCBtb2RlbCA9IChSdW5PbmNlTW9kZWwpIGdldFdpbmRvdygp OwoKICAgICAgICBpZiAoQXN5bmNEYXRhUHJvdmlkZXIuSXNXaW5kb3dzT3NUeXBlKHZtLmdldFZt T3MoKSkpCiAgICAgICAgewogICAgICAgICAgICAvLyBBZGQgYSBwc2V1ZG8gZmxvcHB5IGRpc2sg aW1hZ2UgdXNlZCBmb3IgV2luZG93cycgc3lzcHJlcC4KICAgICAgICAgICAgaWYgKCF2bS5pc0lu aXRpYWxpemVkKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGltYWdlcy5hZGQoMCwg IltzeXNwcmVwXSIpOyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICAgICBtb2RlbC5nZXRBdHRh Y2hGbG9wcHkoKS5zZXRFbnRpdHkodHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxz ZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpbWFnZXMuYWRkKCJbc3lzcHJlcF0iKTsg Ly8kTk9OLU5MUy0xJAogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBtb2RlbC5nZXRG bG9wcHlJbWFnZSgpLnNldEl0ZW1zKGltYWdlcyk7CgogICAgICAgIGlmIChtb2RlbC5nZXRGbG9w cHlJbWFnZSgpLmdldElzQ2hhbmdhYmxlKCkgJiYgbW9kZWwuZ2V0RmxvcHB5SW1hZ2UoKS5nZXRT ZWxlY3RlZEl0ZW0oKSA9PSBudWxsKQogICAgICAgIHsKICAgICAgICAgICAgbW9kZWwuZ2V0Rmxv cHB5SW1hZ2UoKS5zZXRTZWxlY3RlZEl0ZW0oTGlucS5GaXJzdE9yRGVmYXVsdChpbWFnZXMpKTsK ICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIFJ1bk9uY2VVcGRhdGVJbWFnZXMoVk0g dm0pIHsKCiAgICAgICAgQXN5bmNRdWVyeSBfYXN5bmNRdWVyeTIgPSBuZXcgQXN5bmNRdWVyeSgp OwogICAgICAgIF9hc3luY1F1ZXJ5Mi5zZXRNb2RlbCh0aGlzKTsKCiAgICAgICAgX2FzeW5jUXVl cnkyLmFzeW5jQ2FsbGJhY2sgPSBuZXcgSU5ld0FzeW5jQ2FsbGJhY2soKSB7CiAgICAgICAgICAg IEBPdmVycmlkZQogICAgICAgICAgICBwdWJsaWMgdm9pZCBPblN1Y2Nlc3MoT2JqZWN0IG1vZGVs MiwgT2JqZWN0IHJlc3VsdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVm1MaXN0TW9k ZWwgdm1MaXN0TW9kZWwyID0gKFZtTGlzdE1vZGVsKSBtb2RlbDI7CiAgICAgICAgICAgICAgICBW TSBzZWxlY3RlZFZNID0gKFZNKSB2bUxpc3RNb2RlbDIuZ2V0U2VsZWN0ZWRJdGVtKCk7CiAgICAg ICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBpbWFnZXMgPSAoQXJyYXlMaXN0PFN0cmluZz4p IHJlc3VsdDsKCiAgICAgICAgICAgICAgICB2bUxpc3RNb2RlbDIuUnVuT25jZVVwZGF0ZUZsb3Bw eShzZWxlY3RlZFZNLCBpbWFnZXMpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBB c3luY0RhdGFQcm92aWRlci5HZXRGbG9wcHlJbWFnZUxpc3QoX2FzeW5jUXVlcnkyLCB2bS5nZXRT dG9yYWdlUG9vbElkKCkpOwoKICAgICAgICBBc3luY1F1ZXJ5IGdldEltYWdlTGlzdFF1ZXJ5ID0g bmV3IEFzeW5jUXVlcnkoKTsKICAgICAgICBnZXRJbWFnZUxpc3RRdWVyeS5zZXRNb2RlbCh0aGlz KTsKCiAgICAgICAgZ2V0SW1hZ2VMaXN0UXVlcnkuYXN5bmNDYWxsYmFjayA9IG5ldyBJTmV3QXN5 bmNDYWxsYmFjaygpIHsKICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgIHB1YmxpYyB2 b2lkIE9uU3VjY2VzcyhPYmplY3QgbW9kZWwxLCBPYmplY3QgcmVzdWx0KQogICAgICAgICAgICB7 CiAgICAgICAgICAgICAgICBWbUxpc3RNb2RlbCB2bUxpc3RNb2RlbDEgPSAoVm1MaXN0TW9kZWwp IG1vZGVsMTsKICAgICAgICAgICAgICAgIFJ1bk9uY2VNb2RlbCBydW5PbmNlTW9kZWwgPSAoUnVu T25jZU1vZGVsKSB2bUxpc3RNb2RlbDEuZ2V0V2luZG93KCk7CiAgICAgICAgICAgICAgICBBcnJh eUxpc3Q8U3RyaW5nPiBpbWFnZXMgPSAoQXJyYXlMaXN0PFN0cmluZz4pIHJlc3VsdDsKCiAgICAg ICAgICAgICAgICBydW5PbmNlTW9kZWwuZ2V0SXNvSW1hZ2UoKS5zZXRJdGVtcyhpbWFnZXMpOwog ICAgICAgICAgICAgICAgaWYgKHJ1bk9uY2VNb2RlbC5nZXRJc29JbWFnZSgpLmdldElzQ2hhbmdh YmxlKCkKICAgICAgICAgICAgICAgICAgICAgICAgJiYgcnVuT25jZU1vZGVsLmdldElzb0ltYWdl KCkuZ2V0U2VsZWN0ZWRJdGVtKCkgPT0gbnVsbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAg ICAgICAgICAgICBydW5PbmNlTW9kZWwuZ2V0SXNvSW1hZ2UoKS5zZXRTZWxlY3RlZEl0ZW0oTGlu cS5GaXJzdE9yRGVmYXVsdChpbWFnZXMpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAg fQogICAgICAgIH07CiAgICAgICAgQXN5bmNEYXRhUHJvdmlkZXIuR2V0SXJzSW1hZ2VMaXN0KGdl dEltYWdlTGlzdFF1ZXJ5LCB2bS5nZXRTdG9yYWdlUG9vbElkKCkpOwoKICAgIH0KCiAgICBwcml2 YXRlIHZvaWQgT25SdW5PbmNlKCkKICAgIHsKICAgICAgICBWTSB2bSA9IChWTSkgZ2V0U2VsZWN0 ZWRJdGVtKCk7CiAgICAgICAgaWYgKHZtID09IG51bGwpCiAgICAgICAgewogICAgICAgICAgICBD YW5jZWwoKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgUnVuT25jZU1v ZGVsIG1vZGVsID0gKFJ1bk9uY2VNb2RlbCkgZ2V0V2luZG93KCk7CgogICAgICAgIGlmICghbW9k ZWwuVmFsaWRhdGUoKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9Cgog ICAgICAgIEJvb3RTZXF1ZW5jZU1vZGVsIGJvb3RTZXF1ZW5jZU1vZGVsID0gbW9kZWwuZ2V0Qm9v dFNlcXVlbmNlKCk7CgogICAgICAgIFJ1blZtT25jZVBhcmFtcyB0ZW1wVmFyID0gbmV3IFJ1blZt T25jZVBhcmFtcygpOwogICAgICAgIHRlbXBWYXIuc2V0Vm1JZCh2bS5nZXRJZCgpKTsKICAgICAg ICB0ZW1wVmFyLnNldEJvb3RTZXF1ZW5jZShib290U2VxdWVuY2VNb2RlbC5nZXRTZXF1ZW5jZSgp KTsKICAgICAgICB0ZW1wVmFyLnNldERpc2tQYXRoKChCb29sZWFuKSBtb2RlbC5nZXRBdHRhY2hJ c28oKS5nZXRFbnRpdHkoKSA/IChTdHJpbmcpIG1vZGVsLmdldElzb0ltYWdlKCkuZ2V0U2VsZWN0 ZWRJdGVtKCkKICAgICAgICAgICAgICAgIDogIiIpOyAvLyROT04tTkxTLTEkCiAgICAgICAgdGVt cFZhci5zZXRGbG9wcHlQYXRoKG1vZGVsLmdldEZsb3BweUltYWdlUGF0aCgpKTsKICAgICAgICB0 ZW1wVmFyLnNldEt2bUVuYWJsZShtb2RlbC5nZXRId0FjY2VsZXJhdGlvbigpKTsKICAgICAgICB0 ZW1wVmFyLnNldFJ1bkFuZFBhdXNlKChCb29sZWFuKSBtb2RlbC5nZXRSdW5BbmRQYXVzZSgpLmdl dEVudGl0eSgpKTsKICAgICAgICB0ZW1wVmFyLnNldEFjcGlFbmFibGUodHJ1ZSk7CiAgICAgICAg dGVtcFZhci5zZXRSdW5Bc1N0YXRlbGVzcygoQm9vbGVhbikgbW9kZWwuZ2V0UnVuQXNTdGF0ZWxl c3MoKS5nZXRFbnRpdHkoKSk7CiAgICAgICAgdGVtcFZhci5zZXRSZWluaXRpYWxpemUobW9kZWwu Z2V0UmVpbml0aWFsaXplKCkpOwogICAgICAgIHRlbXBWYXIuc2V0Q3VzdG9tUHJvcGVydGllcyht b2RlbC5nZXRDdXN0b21Qcm9wZXJ0eVNoZWV0KCkuZ2V0RW50aXR5KCkpOwogICAgICAgIFJ1blZt T25jZVBhcmFtcyBwYXJhbSA9IHRlbXBWYXI7CgogICAgICAgIC8vIGtlcm5lbCBwYXJhbXMKICAg ICAgICBpZiAobW9kZWwuZ2V0S2VybmVsX3BhdGgoKS5nZXRFbnRpdHkoKSAhPSBudWxsKQogICAg ICAgIHsKICAgICAgICAgICAgcGFyYW0uc2V0a2VybmVsX3VybCgoU3RyaW5nKSBtb2RlbC5nZXRL ZXJuZWxfcGF0aCgpLmdldEVudGl0eSgpKTsKICAgICAgICB9CiAgICAgICAgaWYgKG1vZGVsLmdl dEtlcm5lbF9wYXJhbWV0ZXJzKCkuZ2V0RW50aXR5KCkgIT0gbnVsbCkKICAgICAgICB7CiAgICAg ICAgICAgIHBhcmFtLnNldGtlcm5lbF9wYXJhbXMoKFN0cmluZykgbW9kZWwuZ2V0S2VybmVsX3Bh cmFtZXRlcnMoKS5nZXRFbnRpdHkoKSk7CiAgICAgICAgfQogICAgICAgIGlmIChtb2RlbC5nZXRJ bml0cmRfcGF0aCgpLmdldEVudGl0eSgpICE9IG51bGwpCiAgICAgICAgewogICAgICAgICAgICBw YXJhbS5zZXRpbml0cmRfdXJsKChTdHJpbmcpIG1vZGVsLmdldEluaXRyZF9wYXRoKCkuZ2V0RW50 aXR5KCkpOwogICAgICAgIH0KCiAgICAgICAgLy8gU3lzcHJlcCBwYXJhbXMKICAgICAgICBpZiAo bW9kZWwuZ2V0U3lzUHJlcERvbWFpbk5hbWUoKS5nZXRTZWxlY3RlZEl0ZW0oKSAhPSBudWxsKQog ICAgICAgIHsKICAgICAgICAgICAgcGFyYW0uc2V0U3lzUHJlcERvbWFpbk5hbWUobW9kZWwuZ2V0 U3lzUHJlcFNlbGVjdGVkRG9tYWluTmFtZSgpLmdldEVudGl0eSgpLmVxdWFscygiIikgPyAoU3Ry aW5nKSBtb2RlbC5nZXRTeXNQcmVwU2VsZWN0ZWREb21haW5OYW1lKCkgLy8kTk9OLU5MUy0xJAog ICAgICAgICAgICAgICAgICAgIC5nZXRFbnRpdHkoKQogICAgICAgICAgICAgICAgICAgIDogKFN0 cmluZykgbW9kZWwuZ2V0U3lzUHJlcERvbWFpbk5hbWUoKS5nZXRTZWxlY3RlZEl0ZW0oKSk7CiAg ICAgICAgfQogICAgICAgIGlmIChtb2RlbC5nZXRTeXNQcmVwVXNlck5hbWUoKS5nZXRFbnRpdHko KSAhPSBudWxsKQogICAgICAgIHsKICAgICAgICAgICAgcGFyYW0uc2V0U3lzUHJlcFVzZXJOYW1l KChTdHJpbmcpIG1vZGVsLmdldFN5c1ByZXBVc2VyTmFtZSgpLmdldEVudGl0eSgpKTsKICAgICAg ICB9CiAgICAgICAgaWYgKG1vZGVsLmdldFN5c1ByZXBQYXNzd29yZCgpLmdldEVudGl0eSgpICE9 IG51bGwpCiAgICAgICAgewogICAgICAgICAgICBwYXJhbS5zZXRTeXNQcmVwUGFzc3dvcmQoKFN0 cmluZykgbW9kZWwuZ2V0U3lzUHJlcFBhc3N3b3JkKCkuZ2V0RW50aXR5KCkpOwogICAgICAgIH0K CiAgICAgICAgRW50aXR5TW9kZWwgZGlzcGxheVByb3RvY29sU2VsZWN0ZWRJdGVtID0gKEVudGl0 eU1vZGVsKSBtb2RlbC5nZXREaXNwbGF5UHJvdG9jb2woKS5nZXRTZWxlY3RlZEl0ZW0oKTsKICAg ICAgICBwYXJhbS5zZXRVc2VWbmMoKERpc3BsYXlUeXBlKSBkaXNwbGF5UHJvdG9jb2xTZWxlY3Rl ZEl0ZW0uZ2V0RW50aXR5KCkgPT0gRGlzcGxheVR5cGUudm5jKTsKICAgICAgICBpZiAoKEJvb2xl YW4pIG1vZGVsLmdldERpc3BsYXlDb25zb2xlX1ZuY19Jc1NlbGVjdGVkKCkuZ2V0RW50aXR5KCkK ICAgICAgICAgICAgICAgIHx8IChCb29sZWFuKSBtb2RlbC5nZXREaXNwbGF5Q29uc29sZV9TcGlj ZV9Jc1NlbGVjdGVkKCkuZ2V0RW50aXR5KCkpCiAgICAgICAgewogICAgICAgICAgICBwYXJhbS5z ZXRVc2VWbmMoKEJvb2xlYW4pIG1vZGVsLmdldERpc3BsYXlDb25zb2xlX1ZuY19Jc1NlbGVjdGVk KCkuZ2V0RW50aXR5KCkpOwogICAgICAgIH0KCiAgICAgICAgRnJvbnRlbmQuUnVuQWN0aW9uKFZk Y0FjdGlvblR5cGUuUnVuVm1PbmNlLCBwYXJhbSwKICAgICAgICAgICAgICAgIG5ldyBJRnJvbnRl bmRBY3Rpb25Bc3luY0NhbGxiYWNrKCkgewogICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQog ICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIEV4ZWN1dGVkKEZyb250ZW5kQWN0aW9uQXN5 bmNSZXN1bHQgcmVzdWx0KSB7CgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAg IH0sIHRoaXMpOwoKICAgICAgICBDYW5jZWwoKTsKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgTmV3 VGVtcGxhdGUoKQogICAgewogICAgICAgIFZNIHZtID0gKFZNKSBnZXRTZWxlY3RlZEl0ZW0oKTsK ICAgICAgICBpZiAodm0gPT0gbnVsbCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybjsKICAg ICAgICB9CgogICAgICAgIGlmIChnZXRXaW5kb3coKSAhPSBudWxsKQogICAgICAgIHsKICAgICAg ICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgVW5pdFZtTW9kZWwgbW9kZWwgPSBuZXcg VW5pdFZtTW9kZWwobmV3IE5ld1RlbXBsYXRlVm1Nb2RlbEJlaGF2aW9yKHZtKSk7CiAgICAgICAg c2V0V2luZG93KG1vZGVsKTsKICAgICAgICBtb2RlbC5zZXRUaXRsZShDb25zdGFudHNNYW5hZ2Vy LmdldEluc3RhbmNlKCkuZ2V0Q29uc3RhbnRzKCkubmV3VGVtcGxhdGVUaXRsZSgpKTsKICAgICAg ICBtb2RlbC5zZXRIYXNoTmFtZSgibmV3X3RlbXBsYXRlIik7IC8vJE5PTi1OTFMtMSQKICAgICAg ICBtb2RlbC5zZXRJc05ldyh0cnVlKTsKICAgICAgICBtb2RlbC5zZXRWbVR5cGUodm0uZ2V0Vm1U eXBlKCkpOwoKICAgICAgICBtb2RlbC5Jbml0aWFsaXplKGdldFN5c3RlbVRyZWVTZWxlY3RlZEl0 ZW0oKSk7CgogICAgICAgIFVJQ29tbWFuZCB0ZW1wVmFyID0gbmV3IFVJQ29tbWFuZCgiT25OZXdU ZW1wbGF0ZSIsIHRoaXMpOyAvLyROT04tTkxTLTEkCiAgICAgICAgdGVtcFZhci5zZXRUaXRsZShD b25zdGFudHNNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0Q29uc3RhbnRzKCkub2soKSk7CiAgICAg ICAgdGVtcFZhci5zZXRJc0RlZmF1bHQodHJ1ZSk7CiAgICAgICAgbW9kZWwuZ2V0Q29tbWFuZHMo KS5hZGQodGVtcFZhcik7CiAgICAgICAgVUlDb21tYW5kIHRlbXBWYXIyID0gbmV3IFVJQ29tbWFu ZCgiQ2FuY2VsIiwgdGhpcyk7IC8vJE5PTi1OTFMtMSQKICAgICAgICB0ZW1wVmFyMi5zZXRUaXRs ZShDb25zdGFudHNNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0Q29uc3RhbnRzKCkuY2FuY2VsKCkp OwogICAgICAgIHRlbXBWYXIyLnNldElzQ2FuY2VsKHRydWUpOwogICAgICAgIG1vZGVsLmdldENv bW1hbmRzKCkuYWRkKHRlbXBWYXIyKTsKCiAgICAgICAgbW9kZWwuZ2V0SXNIaWdobHlBdmFpbGFi bGUoKS5zZXRFbnRpdHkodm0uZ2V0U3RhdGljRGF0YSgpLmlzQXV0b1N0YXJ0dXAoKSk7CiAgICB9 CgogICAgcHJpdmF0ZSB2b2lkIE9uTmV3VGVtcGxhdGUoKQogICAgewogICAgICAgIFVuaXRWbU1v ZGVsIG1vZGVsID0gKFVuaXRWbU1vZGVsKSBnZXRXaW5kb3coKTsKICAgICAgICBWTSB2bSA9IChW TSkgZ2V0U2VsZWN0ZWRJdGVtKCk7CiAgICAgICAgaWYgKHZtID09IG51bGwpCiAgICAgICAgewog ICAgICAgICAgICBDYW5jZWwoKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAg ICAgaWYgKG1vZGVsLmdldFByb2dyZXNzKCkgIT0gbnVsbCkKICAgICAgICB7CiAgICAgICAgICAg IHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmICghbW9kZWwuVmFsaWRhdGUoKSkKICAgICAg ICB7CiAgICAgICAgICAgIG1vZGVsLnNldElzVmFsaWQoZmFsc2UpOwogICAgICAgIH0KICAgICAg ICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIG1vZGVs LmdldE5hbWUoKS5nZXRFbnRpdHkoKTsKCiAgICAgICAgICAgIC8vIENoZWNrIG5hbWUgdW5pY2l0 YXRlLgogICAgICAgICAgICBBc3luY0RhdGFQcm92aWRlci5Jc1RlbXBsYXRlTmFtZVVuaXF1ZShu ZXcgQXN5bmNRdWVyeSh0aGlzLAogICAgICAgICAgICAgICAgICAgIG5ldyBJTmV3QXN5bmNDYWxs YmFjaygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICAg ICAgICAgICAgIHB1YmxpYyB2b2lkIE9uU3VjY2VzcyhPYmplY3QgdGFyZ2V0LCBPYmplY3QgcmV0 dXJuVmFsdWUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWbUxpc3RNb2RlbCB2bUxp c3RNb2RlbCA9IChWbUxpc3RNb2RlbCkgdGFyZ2V0OwogICAgICAgICAgICAgICAgICAgICAgICAg ICAgYm9vbGVhbiBpc05hbWVVbmlxdWUgPSAoQm9vbGVhbikgcmV0dXJuVmFsdWU7CiAgICAgICAg ICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFtZVVuaXF1ZSkKICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbml0Vm1Nb2RlbCBW bU1vZGVsID0gKFVuaXRWbU1vZGVsKSB2bUxpc3RNb2RlbC5nZXRXaW5kb3coKTsKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBWbU1vZGVsLmdldEludmFsaWRpdHlSZWFzb25zKCkuY2xl YXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWbU1vZGVsLmdldE5hbWUoKQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEludmFsaWRpdHlSZWFz b25zKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoQ29uc3Rh bnRzTWFuYWdlci5nZXRJbnN0YW5jZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIC5nZXRDb25zdGFudHMoKQogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAubmFtZU11c3RCZVVuaXF1ZUludmFsaWRSZWFzb24oKSk7 CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm1Nb2RlbC5nZXROYW1lKCkuc2V0SXNW YWxpZChmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm1Nb2RlbC5zZXRJ c1ZhbGlkKGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB2bUxpc3RNb2RlbC5Qb3N0TmFtZVVuaXF1ZUNoZWNr KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAg ICB9CiAgICAgICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgICAgICAgbmFtZSk7CiAg ICAgICAgfQogICAgfQoKICAgIHB1YmxpYyB2b2lkIFBvc3ROYW1lVW5pcXVlQ2hlY2soKQogICAg ewogICAgICAgIFVuaXRWbU1vZGVsIG1vZGVsID0gKFVuaXRWbU1vZGVsKSBnZXRXaW5kb3coKTsK ICAgICAgICBWTSB2bSA9IChWTSkgZ2V0U2VsZWN0ZWRJdGVtKCk7CgogICAgICAgIFZNIHRlbXBW YXIgPSBuZXcgVk0oKTsKICAgICAgICB0ZW1wVmFyLnNldElkKHZtLmdldElkKCkpOwogICAgICAg IHRlbXBWYXIuc2V0Vm1UeXBlKG1vZGVsLmdldFZtVHlwZSgpKTsKICAgICAgICBpZiAobW9kZWwu Z2V0UXVvdGEoKS5nZXRTZWxlY3RlZEl0ZW0oKSAhPSBudWxsKSB7CiAgICAgICAgICAgIHRlbXBW YXIuc2V0UXVvdGFJZCgoKFF1b3RhKSBtb2RlbC5nZXRRdW90YSgpLmdldFNlbGVjdGVkSXRlbSgp KS5nZXRJZCgpKTsKICAgICAgICB9CiAgICAgICAgdGVtcFZhci5zZXRWbU9zKChWbU9zVHlwZSkg bW9kZWwuZ2V0T1NUeXBlKCkuZ2V0U2VsZWN0ZWRJdGVtKCkpOwogICAgICAgIHRlbXBWYXIuc2V0 TnVtT2ZNb25pdG9ycygoSW50ZWdlcikgbW9kZWwuZ2V0TnVtT2ZNb25pdG9ycygpLmdldFNlbGVj dGVkSXRlbSgpKTsKICAgICAgICB0ZW1wVmFyLnNldEFsbG93Q29uc29sZVJlY29ubmVjdCgoQm9v bGVhbikgbW9kZWwuZ2V0QWxsb3dDb25zb2xlUmVjb25uZWN0KCkuZ2V0RW50aXR5KCkpOwogICAg ICAgIHRlbXBWYXIuc2V0Vm1Eb21haW4obW9kZWwuZ2V0RG9tYWluKCkuZ2V0SXNBdmFpbGFibGUo KSA/IChTdHJpbmcpIG1vZGVsLmdldERvbWFpbigpLmdldFNlbGVjdGVkSXRlbSgpIDogIiIpOyAv LyROT04tTkxTLTEkCiAgICAgICAgdGVtcFZhci5zZXRWbU1lbVNpemVNYigoSW50ZWdlcikgbW9k ZWwuZ2V0TWVtU2l6ZSgpLmdldEVudGl0eSgpKTsKICAgICAgICB0ZW1wVmFyLnNldE1pbkFsbG9j YXRlZE1lbSgoSW50ZWdlcikgbW9kZWwuZ2V0TWluQWxsb2NhdGVkTWVtb3J5KCkuZ2V0RW50aXR5 KCkpOwogICAgICAgIHRlbXBWYXIuc2V0VmRzR3JvdXBJZCgoKFZEU0dyb3VwKSBtb2RlbC5nZXRD bHVzdGVyKCkuZ2V0U2VsZWN0ZWRJdGVtKCkpLmdldElkKCkpOwogICAgICAgIHRlbXBWYXIuc2V0 VGltZVpvbmUobW9kZWwuZ2V0VGltZVpvbmUoKS5nZXRJc0F2YWlsYWJsZSgpICYmIG1vZGVsLmdl dFRpbWVab25lKCkuZ2V0U2VsZWN0ZWRJdGVtKCkgIT0gbnVsbCA/ICgoTWFwLkVudHJ5PFN0cmlu ZywgU3RyaW5nPikgbW9kZWwuZ2V0VGltZVpvbmUoKQogICAgICAgICAgICAgICAgLmdldFNlbGVj dGVkSXRlbSgpKS5nZXRLZXkoKQogICAgICAgICAgICAgICAgOiAiIik7IC8vJE5PTi1OTFMtMSQK ICAgICAgICB0ZW1wVmFyLnNldE51bU9mU29ja2V0cygoSW50ZWdlcikgbW9kZWwuZ2V0TnVtT2ZT b2NrZXRzKCkuZ2V0U2VsZWN0ZWRJdGVtKCkpOwogICAgICAgIHRlbXBWYXIuc2V0Q3B1UGVyU29j a2V0KEludGVnZXIucGFyc2VJbnQobW9kZWwuZ2V0VG90YWxDUFVDb3JlcygpLmdldEVudGl0eSgp LnRvU3RyaW5nKCkpCiAgICAgICAgICAgICAgICAvIChJbnRlZ2VyKSBtb2RlbC5nZXROdW1PZlNv Y2tldHMoKS5nZXRTZWxlY3RlZEl0ZW0oKSk7CiAgICAgICAgdGVtcFZhci5zZXRBdXRvU3VzcGVu ZChmYWxzZSk7CiAgICAgICAgdGVtcFZhci5zZXRTdGF0ZWxlc3MoKEJvb2xlYW4pIG1vZGVsLmdl dElzU3RhdGVsZXNzKCkuZ2V0RW50aXR5KCkpOwogICAgICAgIHRlbXBWYXIuc2V0U21hcnRjYXJk RW5hYmxlZCgoQm9vbGVhbikgbW9kZWwuZ2V0SXNTbWFydGNhcmRFbmFibGVkKCkuZ2V0RW50aXR5 KCkpOwogICAgICAgIHRlbXBWYXIuc2V0RGVsZXRlUHJvdGVjdGVkKChCb29sZWFuKSBtb2RlbC5n ZXRJc0RlbGV0ZVByb3RlY3RlZCgpLmdldEVudGl0eSgpKTsKICAgICAgICB0ZW1wVmFyLnNldERl ZmF1bHRCb290U2VxdWVuY2UobW9kZWwuZ2V0Qm9vdFNlcXVlbmNlKCkpOwogICAgICAgIHRlbXBW YXIuc2V0QXV0b1N0YXJ0dXAoKEJvb2xlYW4pIG1vZGVsLmdldElzSGlnaGx5QXZhaWxhYmxlKCku Z2V0RW50aXR5KCkpOwogICAgICAgIHRlbXBWYXIuc2V0SXNvUGF0aChtb2RlbC5nZXRDZEltYWdl KCkuZ2V0SXNDaGFuZ2FibGUoKSA/IChTdHJpbmcpIG1vZGVsLmdldENkSW1hZ2UoKS5nZXRTZWxl Y3RlZEl0ZW0oKSA6ICIiKTsgLy8kTk9OLU5MUy0xJAogICAgICAgIHRlbXBWYXIuc2V0VXNiUG9s aWN5KHZtLmdldFVzYlBvbGljeSgpKTsKICAgICAgICB0ZW1wVmFyLnNldEluaXRyZFVybCh2bS5n ZXRJbml0cmRVcmwoKSk7CiAgICAgICAgdGVtcFZhci5zZXRLZXJuZWxVcmwodm0uZ2V0S2VybmVs VXJsKCkpOwogICAgICAgIHRlbXBWYXIuc2V0S2VybmVsUGFyYW1zKHZtLmdldEtlcm5lbFBhcmFt cygpKTsKICAgICAgICB0ZW1wVmFyLnNldERlZGljYXRlZFZtRm9yVmRzKHZtLmdldERlZGljYXRl ZFZtRm9yVmRzKCkpOwogICAgICAgIHRlbXBWYXIuc2V0TWlncmF0aW9uU3VwcG9ydCh2bS5nZXRN aWdyYXRpb25TdXBwb3J0KCkpOwoKICAgICAgICBWTSBuZXd2bSA9IHRlbXBWYXI7CgogICAgICAg IEVudGl0eU1vZGVsIGRpc3BsYXlQcm90b2NvbFNlbGVjdGVkSXRlbSA9IChFbnRpdHlNb2RlbCkg bW9kZWwuZ2V0RGlzcGxheVByb3RvY29sKCkuZ2V0U2VsZWN0ZWRJdGVtKCk7CiAgICAgICAgbmV3 dm0uc2V0RGVmYXVsdERpc3BsYXlUeXBlKChEaXNwbGF5VHlwZSkgZGlzcGxheVByb3RvY29sU2Vs ZWN0ZWRJdGVtLmdldEVudGl0eSgpKTsKCiAgICAgICAgRW50aXR5TW9kZWwgcHJpb3JpdHlTZWxl Y3RlZEl0ZW0gPSAoRW50aXR5TW9kZWwpIG1vZGVsLmdldFByaW9yaXR5KCkuZ2V0U2VsZWN0ZWRJ dGVtKCk7CiAgICAgICAgbmV3dm0uc2V0UHJpb3JpdHkoKEludGVnZXIpIHByaW9yaXR5U2VsZWN0 ZWRJdGVtLmdldEVudGl0eSgpKTsKCiAgICAgICAgQWRkVm1UZW1wbGF0ZVBhcmFtZXRlcnMgYWRk Vm1UZW1wbGF0ZVBhcmFtZXRlcnMgPQogICAgICAgICAgICAgICAgbmV3IEFkZFZtVGVtcGxhdGVQ YXJhbWV0ZXJzKG5ld3ZtLAogICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBtb2RlbC5n ZXROYW1lKCkuZ2V0RW50aXR5KCksCiAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIG1v ZGVsLmdldERlc2NyaXB0aW9uKCkuZ2V0RW50aXR5KCkpOwogICAgICAgIGFkZFZtVGVtcGxhdGVQ YXJhbWV0ZXJzLnNldFB1YmxpY1VzZSgoQm9vbGVhbikgbW9kZWwuZ2V0SXNUZW1wbGF0ZVB1Ymxp YygpLmdldEVudGl0eSgpKTsKCiAgICAgICAgYWRkVm1UZW1wbGF0ZVBhcmFtZXRlcnMuc2V0RGlz a0luZm9EZXN0aW5hdGlvbk1hcCgKICAgICAgICAgICAgICAgIG1vZGVsLmdldERpc2tzQWxsb2Nh dGlvbk1vZGVsKCkKICAgICAgICAgICAgICAgICAgICAgICAgLmdldEltYWdlVG9EZXN0aW5hdGlv bkRvbWFpbk1hcCgoQm9vbGVhbikgbW9kZWwuZ2V0RGlza3NBbGxvY2F0aW9uTW9kZWwoKQogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRJc1NpbmdsZVN0b3JhZ2VEb21haW4oKQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRFbnRpdHkoKSkpOwoKICAgICAgICBt b2RlbC5TdGFydFByb2dyZXNzKG51bGwpOwoKICAgICAgICBGcm9udGVuZC5SdW5BY3Rpb24oVmRj QWN0aW9uVHlwZS5BZGRWbVRlbXBsYXRlLCBhZGRWbVRlbXBsYXRlUGFyYW1ldGVycywKICAgICAg ICAgICAgICAgIG5ldyBJRnJvbnRlbmRBY3Rpb25Bc3luY0NhbGxiYWNrKCkgewogICAgICAgICAg ICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIEV4ZWN1 dGVkKEZyb250ZW5kQWN0aW9uQXN5bmNSZXN1bHQgcmVzdWx0KSB7CgogICAgICAgICAgICAgICAg ICAgICAgICBWbUxpc3RNb2RlbCB2bUxpc3RNb2RlbCA9IChWbUxpc3RNb2RlbCkgcmVzdWx0Lmdl dFN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZtTGlzdE1vZGVsLmdldFdpbmRvdygp LlN0b3BQcm9ncmVzcygpOwogICAgICAgICAgICAgICAgICAgICAgICBWZGNSZXR1cm5WYWx1ZUJh c2UgcmV0dXJuVmFsdWVCYXNlID0gcmVzdWx0LmdldFJldHVyblZhbHVlKCk7CiAgICAgICAgICAg ICAgICAgICAgICAgIGlmIChyZXR1cm5WYWx1ZUJhc2UgIT0gbnVsbCAmJiByZXR1cm5WYWx1ZUJh c2UuZ2V0U3VjY2VlZGVkKCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHZtTGlzdE1vZGVsLkNhbmNlbCgpOwogICAgICAgICAgICAgICAgICAg ICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIHRoaXMpOwog ICAgfQoKICAgIHByaXZhdGUgdm9pZCBNaWdyYXRlKCkKICAgIHsKICAgICAgICBWTSB2bSA9IChW TSkgZ2V0U2VsZWN0ZWRJdGVtKCk7CiAgICAgICAgaWYgKHZtID09IG51bGwpCiAgICAgICAgewog ICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpZiAoZ2V0V2luZG93KCkgIT0g bnVsbCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIE1p Z3JhdGVNb2RlbCBtb2RlbCA9IG5ldyBNaWdyYXRlTW9kZWwoKTsKICAgICAgICBzZXRXaW5kb3co bW9kZWwpOwogICAgICAgIG1vZGVsLnNldFRpdGxlKENvbnN0YW50c01hbmFnZXIuZ2V0SW5zdGFu Y2UoKS5nZXRDb25zdGFudHMoKS5taWdyYXRlVmlydHVhbE1hY2hpbmVzVGl0bGUoKSk7CiAgICAg ICAgbW9kZWwuc2V0SGFzaE5hbWUoIm1pZ3JhdGVfdmlydHVhbF9tYWNoaW5lIik7IC8vJE5PTi1O TFMtMSQKICAgICAgICBtb2RlbC5zZXRWbXNPblNhbWVDbHVzdGVyKHRydWUpOwogICAgICAgIG1v ZGVsLnNldElzQXV0b1NlbGVjdCh0cnVlKTsKICAgICAgICBtb2RlbC5zZXRWbUxpc3QoTGlucS48 Vk0+IENhc3QoZ2V0U2VsZWN0ZWRJdGVtcygpKSk7CgogICAgICAgIEFzeW5jRGF0YVByb3ZpZGVy LkdldFVwSG9zdExpc3RCeUNsdXN0ZXIobmV3IEFzeW5jUXVlcnkodGhpcywKICAgICAgICAgICAg ICAgIG5ldyBJTmV3QXN5bmNDYWxsYmFjaygpIHsKICAgICAgICAgICAgICAgICAgICBAT3ZlcnJp ZGUKICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBPblN1Y2Nlc3MoT2JqZWN0IHRhcmdl dCwgT2JqZWN0IHJldHVyblZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFZtTGlzdE1v ZGVsIHZtTGlzdE1vZGVsID0gKFZtTGlzdE1vZGVsKSB0YXJnZXQ7CiAgICAgICAgICAgICAgICAg ICAgICAgIHZtTGlzdE1vZGVsLlBvc3RNaWdyYXRlR2V0VXBIb3N0cygoQXJyYXlMaXN0PFZEUz4p IHJldHVyblZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSwg dm0uZ2V0VmRzR3JvdXBOYW1lKCkpOwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBDYW5jZWxNaWdy YXRpb24oKQogICAgewogICAgICAgIEFycmF5TGlzdDxWZGNBY3Rpb25QYXJhbWV0ZXJzQmFzZT4g bGlzdCA9IG5ldyBBcnJheUxpc3Q8VmRjQWN0aW9uUGFyYW1ldGVyc0Jhc2U+KCk7CiAgICAgICAg Zm9yIChPYmplY3QgaXRlbSA6IGdldFNlbGVjdGVkSXRlbXMoKSkgewogICAgICAgICAgICBWTSBh ID0gKFZNKSBpdGVtOwogICAgICAgICAgICBsaXN0LmFkZChuZXcgVm1PcGVyYXRpb25QYXJhbWV0 ZXJCYXNlKGEuZ2V0SWQoKSkpOwogICAgICAgIH0KCiAgICAgICAgRnJvbnRlbmQuUnVuTXVsdGlw bGVBY3Rpb24oVmRjQWN0aW9uVHlwZS5DYW5jZWxNaWdyYXRlVm0sIGxpc3QsCiAgICAgICAgICAg ICAgICBuZXcgSUZyb250ZW5kTXVsdGlwbGVBY3Rpb25Bc3luY0NhbGxiYWNrKCkgewogICAgICAg ICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIEV4 ZWN1dGVkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJvbnRlbmRNdWx0aXBsZUFjdGlv bkFzeW5jUmVzdWx0IHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAg ICAgIH0sIG51bGwpOwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBQb3N0TWlncmF0ZUdldFVwSG9z dHMoQXJyYXlMaXN0PFZEUz4gaG9zdHMpCiAgICB7CiAgICAgICAgTWlncmF0ZU1vZGVsIG1vZGVs ID0gKE1pZ3JhdGVNb2RlbCkgZ2V0V2luZG93KCk7CiAgICAgICAgTkd1aWQgcnVuX29uX3ZkcyA9 IG51bGw7CiAgICAgICAgYm9vbGVhbiBhbGxSdW5PblNhbWVWZHMgPSB0cnVlOwoKICAgICAgICBm b3IgKE9iamVjdCBpdGVtIDogZ2V0U2VsZWN0ZWRJdGVtcygpKQogICAgICAgIHsKICAgICAgICAg ICAgVk0gYSA9IChWTSkgaXRlbTsKICAgICAgICAgICAgaWYgKCFhLmdldFZkc0dyb3VwSWQoKS5l cXVhbHMoKChWTSkgZ2V0U2VsZWN0ZWRJdGVtcygpLmdldCgwKSkuZ2V0VmRzR3JvdXBJZCgpKSkK ICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbW9kZWwuc2V0Vm1zT25TYW1lQ2x1c3Rlcihm YWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHJ1bl9vbl92ZHMgPT0gbnVsbCkK ICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcnVuX29uX3ZkcyA9IGEuZ2V0UnVuT25WZHMo KS5nZXRWYWx1ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGFsbFJ1bk9u U2FtZVZkcyAmJiAhcnVuX29uX3Zkcy5lcXVhbHMoYS5nZXRSdW5PblZkcygpLmdldFZhbHVlKCkp KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBhbGxSdW5PblNhbWVWZHMgPSBmYWxzZTsK ICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbW9kZWwuc2V0SXNIb3N0U2VsQXZhaWxh YmxlKG1vZGVsLmdldFZtc09uU2FtZUNsdXN0ZXIoKSAmJiBob3N0cy5zaXplKCkgPiAwKTsKCiAg ICAgICAgaWYgKG1vZGVsLmdldFZtc09uU2FtZUNsdXN0ZXIoKSAmJiBhbGxSdW5PblNhbWVWZHMp CiAgICAgICAgewogICAgICAgICAgICBWRFMgcnVuT25TYW1lVkRTID0gbnVsbDsKICAgICAgICAg ICAgZm9yIChWRFMgaG9zdCA6IGhvc3RzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBp ZiAoaG9zdC5nZXRJZCgpLmVxdWFscyhydW5fb25fdmRzKSkKICAgICAgICAgICAgICAgIHsKICAg ICAgICAgICAgICAgICAgICBydW5PblNhbWVWRFMgPSBob3N0OwogICAgICAgICAgICAgICAgfQog ICAgICAgICAgICB9CiAgICAgICAgICAgIGhvc3RzLnJlbW92ZShydW5PblNhbWVWRFMpOwogICAg ICAgIH0KICAgICAgICBpZiAoaG9zdHMuaXNFbXB0eSgpKQogICAgICAgIHsKICAgICAgICAgICAg bW9kZWwuc2V0SXNIb3N0U2VsQXZhaWxhYmxlKGZhbHNlKTsKCiAgICAgICAgICAgIGlmIChhbGxS dW5PblNhbWVWZHMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG1vZGVsLnNldE5vU2Vs QXZhaWxhYmxlKHRydWUpOwoKICAgICAgICAgICAgICAgIFVJQ29tbWFuZCB0ZW1wVmFyID0gbmV3 IFVJQ29tbWFuZCgiQ2FuY2VsIiwgdGhpcyk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgICAg IHRlbXBWYXIuc2V0VGl0bGUoQ29uc3RhbnRzTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldENvbnN0 YW50cygpLmNsb3NlKCkpOwogICAgICAgICAgICAgICAgdGVtcFZhci5zZXRJc0RlZmF1bHQodHJ1 ZSk7CiAgICAgICAgICAgICAgICB0ZW1wVmFyLnNldElzQ2FuY2VsKHRydWUpOwogICAgICAgICAg ICAgICAgbW9kZWwuZ2V0Q29tbWFuZHMoKS5hZGQodGVtcFZhcik7CiAgICAgICAgICAgIH0KICAg ICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgbW9kZWwuZ2V0SG9zdHMo KS5zZXRJdGVtcyhob3N0cyk7CiAgICAgICAgICAgIG1vZGVsLmdldEhvc3RzKCkuc2V0U2VsZWN0 ZWRJdGVtKExpbnEuRmlyc3RPckRlZmF1bHQoaG9zdHMpKTsKCiAgICAgICAgICAgIFVJQ29tbWFu ZCB0ZW1wVmFyMiA9IG5ldyBVSUNvbW1hbmQoIk9uTWlncmF0ZSIsIHRoaXMpOyAvLyROT04tTkxT LTEkCiAgICAgICAgICAgIHRlbXBWYXIyLnNldFRpdGxlKENvbnN0YW50c01hbmFnZXIuZ2V0SW5z dGFuY2UoKS5nZXRDb25zdGFudHMoKS5vaygpKTsKICAgICAgICAgICAgdGVtcFZhcjIuc2V0SXNE ZWZhdWx0KHRydWUpOwogICAgICAgICAgICBtb2RlbC5nZXRDb21tYW5kcygpLmFkZCh0ZW1wVmFy Mik7CiAgICAgICAgICAgIFVJQ29tbWFuZCB0ZW1wVmFyMyA9IG5ldyBVSUNvbW1hbmQoIkNhbmNl bCIsIHRoaXMpOyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgIHRlbXBWYXIzLnNldFRpdGxlKENv bnN0YW50c01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRDb25zdGFudHMoKS5jYW5jZWwoKSk7CiAg ICAgICAgICAgIHRlbXBWYXIzLnNldElzQ2FuY2VsKHRydWUpOwogICAgICAgICAgICBtb2RlbC5n ZXRDb21tYW5kcygpLmFkZCh0ZW1wVmFyMyk7CiAgICAgICAgfQogICAgfQoKICAgIHByaXZhdGUg dm9pZCBPbk1pZ3JhdGUoKQogICAgewogICAgICAgIE1pZ3JhdGVNb2RlbCBtb2RlbCA9IChNaWdy YXRlTW9kZWwpIGdldFdpbmRvdygpOwoKICAgICAgICBpZiAobW9kZWwuZ2V0UHJvZ3Jlc3MoKSAh PSBudWxsKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAg bW9kZWwuU3RhcnRQcm9ncmVzcyhudWxsKTsKCiAgICAgICAgaWYgKG1vZGVsLmdldElzQXV0b1Nl bGVjdCgpKQogICAgICAgIHsKICAgICAgICAgICAgQXJyYXlMaXN0PFZkY0FjdGlvblBhcmFtZXRl cnNCYXNlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxWZGNBY3Rpb25QYXJhbWV0ZXJzQmFzZT4oKTsK ICAgICAgICAgICAgZm9yIChPYmplY3QgaXRlbSA6IGdldFNlbGVjdGVkSXRlbXMoKSkKICAgICAg ICAgICAgewogICAgICAgICAgICAgICAgVk0gYSA9IChWTSkgaXRlbTsKICAgICAgICAgICAgICAg IGxpc3QuYWRkKG5ldyBNaWdyYXRlVm1QYXJhbWV0ZXJzKHRydWUsIGEuZ2V0SWQoKSkpOwogICAg ICAgICAgICB9CgogICAgICAgICAgICBGcm9udGVuZC5SdW5NdWx0aXBsZUFjdGlvbihWZGNBY3Rp b25UeXBlLk1pZ3JhdGVWbSwgbGlzdCwKICAgICAgICAgICAgICAgICAgICBuZXcgSUZyb250ZW5k TXVsdGlwbGVBY3Rpb25Bc3luY0NhbGxiYWNrKCkgewogICAgICAgICAgICAgICAgICAgICAgICBA T3ZlcnJpZGUKICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgRXhlY3V0ZWQoRnJv bnRlbmRNdWx0aXBsZUFjdGlvbkFzeW5jUmVzdWx0IHJlc3VsdCkgewoKICAgICAgICAgICAgICAg ICAgICAgICAgICAgIE1pZ3JhdGVNb2RlbCBsb2NhbE1vZGVsID0gKE1pZ3JhdGVNb2RlbCkgcmVz dWx0LmdldFN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbE1vZGVsLlN0 b3BQcm9ncmVzcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuY2VsKCk7CgogICAg ICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgbW9kZWwpOwogICAg ICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBBcnJheUxpc3Q8VmRjQWN0 aW9uUGFyYW1ldGVyc0Jhc2U+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFZkY0FjdGlvblBhcmFtZXRl cnNCYXNlPigpOwogICAgICAgICAgICBmb3IgKE9iamVjdCBpdGVtIDogZ2V0U2VsZWN0ZWRJdGVt cygpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWTSBhID0gKFZNKSBpdGVtOwoKICAg ICAgICAgICAgICAgIGlmIChhLmdldFJ1bk9uVmRzKCkuZ2V0VmFsdWUoKS5lcXVhbHMoKChWRFMp IG1vZGVsLmdldEhvc3RzKCkuZ2V0U2VsZWN0ZWRJdGVtKCkpLmdldElkKCkpKQogICAgICAgICAg ICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQoK ICAgICAgICAgICAgICAgIGxpc3QuYWRkKG5ldyBNaWdyYXRlVm1Ub1NlcnZlclBhcmFtZXRlcnMo dHJ1ZSwgYS5nZXRJZCgpLCAoKFZEUykgbW9kZWwuZ2V0SG9zdHMoKQogICAgICAgICAgICAgICAg ICAgICAgICAuZ2V0U2VsZWN0ZWRJdGVtKCkpLmdldElkKCkpKTsKICAgICAgICAgICAgfQoKICAg ICAgICAgICAgRnJvbnRlbmQuUnVuTXVsdGlwbGVBY3Rpb24oVmRjQWN0aW9uVHlwZS5NaWdyYXRl Vm1Ub1NlcnZlciwgbGlzdCwKICAgICAgICAgICAgICAgICAgICBuZXcgSUZyb250ZW5kTXVsdGlw bGVBY3Rpb25Bc3luY0NhbGxiYWNrKCkgewogICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJp ZGUKICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgRXhlY3V0ZWQoRnJvbnRlbmRN dWx0aXBsZUFjdGlvbkFzeW5jUmVzdWx0IHJlc3VsdCkgewoKICAgICAgICAgICAgICAgICAgICAg ICAgICAgIE1pZ3JhdGVNb2RlbCBsb2NhbE1vZGVsID0gKE1pZ3JhdGVNb2RlbCkgcmVzdWx0Lmdl dFN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbE1vZGVsLlN0b3BQcm9n cmVzcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuY2VsKCk7CgogICAgICAgICAg ICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgbW9kZWwpOwogICAgICAgIH0K ICAgIH0KCiAgICBwcml2YXRlIHZvaWQgU2h1dGRvd24oKQogICAgewogICAgICAgIENvbmZpcm1h dGlvbk1vZGVsIG1vZGVsID0gbmV3IENvbmZpcm1hdGlvbk1vZGVsKCk7CiAgICAgICAgc2V0V2lu ZG93KG1vZGVsKTsKICAgICAgICBtb2RlbC5zZXRUaXRsZShDb25zdGFudHNNYW5hZ2VyLmdldElu c3RhbmNlKCkuZ2V0Q29uc3RhbnRzKCkuc2h1dGRvd25WaXJ0dWFsTWFjaGluZXNUaXRsZSgpKTsK ICAgICAgICBtb2RlbC5zZXRIYXNoTmFtZSgic2h1dF9kb3duX3ZpcnR1YWxfbWFjaGluZSIpOyAv LyROT04tTkxTLTEkCiAgICAgICAgbW9kZWwuc2V0TWVzc2FnZShDb25zdGFudHNNYW5hZ2VyLmdl dEluc3RhbmNlKCkKICAgICAgICAgICAgICAgIC5nZXRDb25zdGFudHMoKQogICAgICAgICAgICAg ICAgLmFyZVlvdVN1cmVZb3VXYW50VG9TaHV0RG93blRoZUZvbGxvd2luZ1ZpcnR1YWxNYWNoaW5l c01zZygpKTsKICAgICAgICAvLyBtb2RlbC5JdGVtcyA9IFNlbGVjdGVkSXRlbXMuQ2FzdDxWTT4o KS5TZWxlY3QoYSA9PiBhLnZtX25hbWUpOwogICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGl0ZW1z ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CiAgICAgICAgZm9yIChPYmplY3QgaXRlbSA6IGdl dFNlbGVjdGVkSXRlbXMoKSkKICAgICAgICB7CiAgICAgICAgICAgIFZNIGEgPSAoVk0pIGl0ZW07 CiAgICAgICAgICAgIGl0ZW1zLmFkZChhLmdldFZtTmFtZSgpKTsKICAgICAgICB9CiAgICAgICAg bW9kZWwuc2V0SXRlbXMoaXRlbXMpOwoKICAgICAgICBVSUNvbW1hbmQgdGVtcFZhciA9IG5ldyBV SUNvbW1hbmQoIk9uU2h1dGRvd24iLCB0aGlzKTsgLy8kTk9OLU5MUy0xJAogICAgICAgIHRlbXBW YXIuc2V0VGl0bGUoQ29uc3RhbnRzTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldENvbnN0YW50cygp Lm9rKCkpOwogICAgICAgIHRlbXBWYXIuc2V0SXNEZWZhdWx0KHRydWUpOwogICAgICAgIG1vZGVs LmdldENvbW1hbmRzKCkuYWRkKHRlbXBWYXIpOwogICAgICAgIFVJQ29tbWFuZCB0ZW1wVmFyMiA9 IG5ldyBVSUNvbW1hbmQoIkNhbmNlbCIsIHRoaXMpOyAvLyROT04tTkxTLTEkCiAgICAgICAgdGVt cFZhcjIuc2V0VGl0bGUoQ29uc3RhbnRzTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldENvbnN0YW50 cygpLmNhbmNlbCgpKTsKICAgICAgICB0ZW1wVmFyMi5zZXRJc0NhbmNlbCh0cnVlKTsKICAgICAg ICBtb2RlbC5nZXRDb21tYW5kcygpLmFkZCh0ZW1wVmFyMik7CiAgICB9CgogICAgcHJpdmF0ZSB2 b2lkIE9uU2h1dGRvd24oKQogICAgewogICAgICAgIENvbmZpcm1hdGlvbk1vZGVsIG1vZGVsID0g KENvbmZpcm1hdGlvbk1vZGVsKSBnZXRXaW5kb3coKTsKCiAgICAgICAgaWYgKG1vZGVsLmdldFBy b2dyZXNzKCkgIT0gbnVsbCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9 CgogICAgICAgIEFycmF5TGlzdDxWZGNBY3Rpb25QYXJhbWV0ZXJzQmFzZT4gbGlzdCA9IG5ldyBB cnJheUxpc3Q8VmRjQWN0aW9uUGFyYW1ldGVyc0Jhc2U+KCk7CiAgICAgICAgZm9yIChPYmplY3Qg aXRlbSA6IGdldFNlbGVjdGVkSXRlbXMoKSkKICAgICAgICB7CiAgICAgICAgICAgIFZNIGEgPSAo Vk0pIGl0ZW07CiAgICAgICAgICAgIGxpc3QuYWRkKG5ldyBTaHV0ZG93blZtUGFyYW1ldGVycyhh LmdldElkKCksIHRydWUpKTsKICAgICAgICB9CgogICAgICAgIG1vZGVsLlN0YXJ0UHJvZ3Jlc3Mo bnVsbCk7CgogICAgICAgIEZyb250ZW5kLlJ1bk11bHRpcGxlQWN0aW9uKFZkY0FjdGlvblR5cGUu U2h1dGRvd25WbSwgbGlzdCwKICAgICAgICAgICAgICAgIG5ldyBJRnJvbnRlbmRNdWx0aXBsZUFj dGlvbkFzeW5jQ2FsbGJhY2soKSB7CiAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAg ICAgICAgICAgICAgICAgcHVibGljIHZvaWQgRXhlY3V0ZWQoRnJvbnRlbmRNdWx0aXBsZUFjdGlv bkFzeW5jUmVzdWx0IHJlc3VsdCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlybWF0 aW9uTW9kZWwgbG9jYWxNb2RlbCA9IChDb25maXJtYXRpb25Nb2RlbCkgcmVzdWx0LmdldFN0YXRl KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsTW9kZWwuU3RvcFByb2dyZXNzKCk7CiAg ICAgICAgICAgICAgICAgICAgICAgIENhbmNlbCgpOwoKICAgICAgICAgICAgICAgICAgICB9CiAg ICAgICAgICAgICAgICB9LCBtb2RlbCk7CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIHN0b3AoKQog ICAgewogICAgICAgIENvbmZpcm1hdGlvbk1vZGVsIG1vZGVsID0gbmV3IENvbmZpcm1hdGlvbk1v ZGVsKCk7CiAgICAgICAgc2V0V2luZG93KG1vZGVsKTsKICAgICAgICBtb2RlbC5zZXRUaXRsZShD b25zdGFudHNNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0Q29uc3RhbnRzKCkuc3RvcFZpcnR1YWxN YWNoaW5lc1RpdGxlKCkpOwogICAgICAgIG1vZGVsLnNldEhhc2hOYW1lKCJzdG9wX3ZpcnR1YWxf bWFjaGluZSIpOyAvLyROT04tTkxTLTEkCiAgICAgICAgbW9kZWwuc2V0TWVzc2FnZShDb25zdGFu dHNNYW5hZ2VyLmdldEluc3RhbmNlKCkKICAgICAgICAgICAgICAgIC5nZXRDb25zdGFudHMoKQog ICAgICAgICAgICAgICAgLmFyZVlvdVN1cmVZb3VXYW50VG9TdG9wVGhlRm9sbG93aW5nVmlydHVh bE1hY2hpbmVzTXNnKCkpOwogICAgICAgIC8vIG1vZGVsLkl0ZW1zID0gU2VsZWN0ZWRJdGVtcy5D YXN0PFZNPigpLlNlbGVjdChhID0+IGEudm1fbmFtZSk7CiAgICAgICAgQXJyYXlMaXN0PFN0cmlu Zz4gaXRlbXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKICAgICAgICBmb3IgKE9iamVjdCBp dGVtIDogZ2V0U2VsZWN0ZWRJdGVtcygpKQogICAgICAgIHsKICAgICAgICAgICAgVk0gYSA9IChW TSkgaXRlbTsKICAgICAgICAgICAgaXRlbXMuYWRkKGEuZ2V0Vm1OYW1lKCkpOwogICAgICAgIH0K ICAgICAgICBtb2RlbC5zZXRJdGVtcyhpdGVtcyk7CgogICAgICAgIFVJQ29tbWFuZCB0ZW1wVmFy ID0gbmV3IFVJQ29tbWFuZCgiT25TdG9wIiwgdGhpcyk7IC8vJE5PTi1OTFMtMSQKICAgICAgICB0 ZW1wVmFyLnNldFRpdGxlKENvbnN0YW50c01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRDb25zdGFu dHMoKS5vaygpKTsKICAgICAgICB0ZW1wVmFyLnNldElzRGVmYXVsdCh0cnVlKTsKICAgICAgICBt b2RlbC5nZXRDb21tYW5kcygpLmFkZCh0ZW1wVmFyKTsKICAgICAgICBVSUNvbW1hbmQgdGVtcFZh cjIgPSBuZXcgVUlDb21tYW5kKCJDYW5jZWwiLCB0aGlzKTsgLy8kTk9OLU5MUy0xJAogICAgICAg IHRlbXBWYXIyLnNldFRpdGxlKENvbnN0YW50c01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRDb25z dGFudHMoKS5jYW5jZWwoKSk7CiAgICAgICAgdGVtcFZhcjIuc2V0SXNDYW5jZWwodHJ1ZSk7CiAg ICAgICAgbW9kZWwuZ2V0Q29tbWFuZHMoKS5hZGQodGVtcFZhcjIpOwogICAgfQoKICAgIHByaXZh dGUgdm9pZCBPblN0b3AoKQogICAgewogICAgICAgIENvbmZpcm1hdGlvbk1vZGVsIG1vZGVsID0g KENvbmZpcm1hdGlvbk1vZGVsKSBnZXRXaW5kb3coKTsKCiAgICAgICAgaWYgKG1vZGVsLmdldFBy b2dyZXNzKCkgIT0gbnVsbCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9 CgogICAgICAgIEFycmF5TGlzdDxWZGNBY3Rpb25QYXJhbWV0ZXJzQmFzZT4gbGlzdCA9IG5ldyBB cnJheUxpc3Q8VmRjQWN0aW9uUGFyYW1ldGVyc0Jhc2U+KCk7CiAgICAgICAgZm9yIChPYmplY3Qg aXRlbSA6IGdldFNlbGVjdGVkSXRlbXMoKSkKICAgICAgICB7CiAgICAgICAgICAgIFZNIGEgPSAo Vk0pIGl0ZW07CiAgICAgICAgICAgIGxpc3QuYWRkKG5ldyBTdG9wVm1QYXJhbWV0ZXJzKGEuZ2V0 SWQoKSwgU3RvcFZtVHlwZUVudW0uTk9STUFMKSk7CiAgICAgICAgfQoKICAgICAgICBtb2RlbC5T dGFydFByb2dyZXNzKG51bGwpOwoKICAgICAgICBGcm9udGVuZC5SdW5NdWx0aXBsZUFjdGlvbihW ZGNBY3Rpb25UeXBlLlN0b3BWbSwgbGlzdCwKICAgICAgICAgICAgICAgIG5ldyBJRnJvbnRlbmRN dWx0aXBsZUFjdGlvbkFzeW5jQ2FsbGJhY2soKSB7CiAgICAgICAgICAgICAgICAgICAgQE92ZXJy aWRlCiAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgRXhlY3V0ZWQoRnJvbnRlbmRNdWx0 aXBsZUFjdGlvbkFzeW5jUmVzdWx0IHJlc3VsdCkgewoKICAgICAgICAgICAgICAgICAgICAgICAg Q29uZmlybWF0aW9uTW9kZWwgbG9jYWxNb2RlbCA9IChDb25maXJtYXRpb25Nb2RlbCkgcmVzdWx0 LmdldFN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsTW9kZWwuU3RvcFByb2dy ZXNzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIENhbmNlbCgpOwoKICAgICAgICAgICAgICAg ICAgICB9CiAgICAgICAgICAgICAgICB9LCBtb2RlbCk7CiAgICB9CgogICAgcHJpdmF0ZSB2b2lk IFBhdXNlKCkKICAgIHsKICAgICAgICBBcnJheUxpc3Q8VmRjQWN0aW9uUGFyYW1ldGVyc0Jhc2U+ IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFZkY0FjdGlvblBhcmFtZXRlcnNCYXNlPigpOwogICAgICAg IGZvciAoT2JqZWN0IGl0ZW0gOiBnZXRTZWxlY3RlZEl0ZW1zKCkpCiAgICAgICAgewogICAgICAg ICAgICBWTSBhID0gKFZNKSBpdGVtOwogICAgICAgICAgICBsaXN0LmFkZChuZXcgSGliZXJuYXRl Vm1QYXJhbWV0ZXJzKGEuZ2V0SWQoKSkpOwogICAgICAgIH0KCiAgICAgICAgRnJvbnRlbmQuUnVu TXVsdGlwbGVBY3Rpb24oVmRjQWN0aW9uVHlwZS5IaWJlcm5hdGVWbSwgbGlzdCwKICAgICAgICAg ICAgICAgIG5ldyBJRnJvbnRlbmRNdWx0aXBsZUFjdGlvbkFzeW5jQ2FsbGJhY2soKSB7CiAgICAg ICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQg RXhlY3V0ZWQoRnJvbnRlbmRNdWx0aXBsZUFjdGlvbkFzeW5jUmVzdWx0IHJlc3VsdCkgewoKICAg ICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCBudWxsKTsKICAgIH0KCiAgICBw cml2YXRlIHZvaWQgUnVuKCkKICAgIHsKICAgICAgICBBcnJheUxpc3Q8VmRjQWN0aW9uUGFyYW1l dGVyc0Jhc2U+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFZkY0FjdGlvblBhcmFtZXRlcnNCYXNlPigp OwogICAgICAgIGZvciAoT2JqZWN0IGl0ZW0gOiBnZXRTZWxlY3RlZEl0ZW1zKCkpCiAgICAgICAg ewogICAgICAgICAgICBWTSBhID0gKFZNKSBpdGVtOwogICAgICAgICAgICAvLyB1c2Ugc3lzcHJl cCBpZmYgdGhlIHZtIGlzIG5vdCBpbml0aWFsaXplZCBhbmQgdm0gaGFzIFdpbiBPUwogICAgICAg ICAgICBib29sZWFuIHJlaW5pdGlhbGl6ZSA9ICFhLmlzSW5pdGlhbGl6ZWQoKSAmJiBBc3luY0Rh dGFQcm92aWRlci5Jc1dpbmRvd3NPc1R5cGUoYS5nZXRWbU9zKCkpOwogICAgICAgICAgICBSdW5W bVBhcmFtcyB0ZW1wVmFyID0gbmV3IFJ1blZtUGFyYW1zKGEuZ2V0SWQoKSk7CiAgICAgICAgICAg IHRlbXBWYXIuc2V0UmVpbml0aWFsaXplKHJlaW5pdGlhbGl6ZSk7CiAgICAgICAgICAgIGxpc3Qu YWRkKHRlbXBWYXIpOwogICAgICAgIH0KCiAgICAgICAgRnJvbnRlbmQuUnVuTXVsdGlwbGVBY3Rp b24oVmRjQWN0aW9uVHlwZS5SdW5WbSwgbGlzdCwKICAgICAgICAgICAgICAgIG5ldyBJRnJvbnRl bmRNdWx0aXBsZUFjdGlvbkFzeW5jQ2FsbGJhY2soKSB7CiAgICAgICAgICAgICAgICAgICAgQE92 ZXJyaWRlCiAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgRXhlY3V0ZWQoRnJvbnRlbmRN dWx0aXBsZUFjdGlvbkFzeW5jUmVzdWx0IHJlc3VsdCkgewoKICAgICAgICAgICAgICAgICAgICB9 CiAgICAgICAgICAgICAgICB9LCBudWxsKTsKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgT25SZW1v dmUoKQogICAgewogICAgICAgIENvbmZpcm1hdGlvbk1vZGVsIG1vZGVsID0gKENvbmZpcm1hdGlv bk1vZGVsKSBnZXRXaW5kb3coKTsKCiAgICAgICAgaWYgKG1vZGVsLmdldFByb2dyZXNzKCkgIT0g bnVsbCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIEFy cmF5TGlzdDxWZGNBY3Rpb25QYXJhbWV0ZXJzQmFzZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8VmRj QWN0aW9uUGFyYW1ldGVyc0Jhc2U+KCk7CiAgICAgICAgZm9yIChFbnRyeTxHdWlkLCBFbnRpdHlN b2RlbD4gZW50cnkgOiB2bXNSZW1vdmVNYXAuZW50cnlTZXQoKSkKICAgICAgICB7CiAgICAgICAg ICAgIGxpc3QuYWRkKG5ldyBSZW1vdmVWbVBhcmFtZXRlcnMoZW50cnkuZ2V0S2V5KCksIGZhbHNl LCAoQm9vbGVhbikgZW50cnkuZ2V0VmFsdWUoKS5nZXRFbnRpdHkoKSkpOwogICAgICAgIH0KCiAg ICAgICAgbW9kZWwuU3RhcnRQcm9ncmVzcyhudWxsKTsKCiAgICAgICAgRnJvbnRlbmQuUnVuTXVs dGlwbGVBY3Rpb24oVmRjQWN0aW9uVHlwZS5SZW1vdmVWbSwgbGlzdCwKICAgICAgICAgICAgICAg IG5ldyBJRnJvbnRlbmRNdWx0aXBsZUFjdGlvbkFzeW5jQ2FsbGJhY2soKSB7CiAgICAgICAgICAg ICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgRXhlY3V0 ZWQoRnJvbnRlbmRNdWx0aXBsZUFjdGlvbkFzeW5jUmVzdWx0IHJlc3VsdCkgewoKICAgICAgICAg ICAgICAgICAgICAgICAgQ29uZmlybWF0aW9uTW9kZWwgbG9jYWxNb2RlbCA9IChDb25maXJtYXRp b25Nb2RlbCkgcmVzdWx0LmdldFN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2Fs TW9kZWwuU3RvcFByb2dyZXNzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIENhbmNlbCgpOwoK ICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCBtb2RlbCk7CiAgICB9Cgog ICAgcHJpdmF0ZSB2b2lkIENoYW5nZUNEKCkKICAgIHsKICAgICAgICBWTSB2bSA9IChWTSkgZ2V0 U2VsZWN0ZWRJdGVtKCk7CiAgICAgICAgaWYgKHZtID09IG51bGwpCiAgICAgICAgewogICAgICAg ICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBBdHRhY2hDZE1vZGVsIG1vZGVsID0gbmV3 IEF0dGFjaENkTW9kZWwoKTsKICAgICAgICBzZXRXaW5kb3cobW9kZWwpOwogICAgICAgIG1vZGVs LnNldFRpdGxlKENvbnN0YW50c01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRDb25zdGFudHMoKS5j aGFuZ2VDRFRpdGxlKCkpOwogICAgICAgIG1vZGVsLnNldEhhc2hOYW1lKCJjaGFuZ2VfY2QiKTsg Ly8kTk9OLU5MUy0xJAoKICAgICAgICBBdHRhY2hDZE1vZGVsIGF0dGFjaENkTW9kZWwgPSAoQXR0 YWNoQ2RNb2RlbCkgZ2V0V2luZG93KCk7CiAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gaW1hZ2Vz MSA9CiAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChu ZXcgU3RyaW5nW10geyAiTm8gQ0RzIiB9KSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICBhdHRhY2hD ZE1vZGVsLmdldElzb0ltYWdlKCkuc2V0SXRlbXMoaW1hZ2VzMSk7CiAgICAgICAgYXR0YWNoQ2RN b2RlbC5nZXRJc29JbWFnZSgpLnNldFNlbGVjdGVkSXRlbShMaW5xLkZpcnN0T3JEZWZhdWx0KGlt YWdlczEpKTsKCiAgICAgICAgQXN5bmNRdWVyeSBnZXRJcnNJbWFnZUxpc3RDYWxsYmFjayA9IG5l dyBBc3luY1F1ZXJ5KCk7CiAgICAgICAgZ2V0SXJzSW1hZ2VMaXN0Q2FsbGJhY2suc2V0TW9kZWwo dGhpcyk7CgogICAgICAgIGdldElyc0ltYWdlTGlzdENhbGxiYWNrLmFzeW5jQ2FsbGJhY2sgPSBu ZXcgSU5ld0FzeW5jQ2FsbGJhY2soKSB7CiAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAg ICBwdWJsaWMgdm9pZCBPblN1Y2Nlc3MoT2JqZWN0IG1vZGVsLCBPYmplY3QgcmVzdWx0KQogICAg ICAgICAgICB7CiAgICAgICAgICAgICAgICBWbUxpc3RNb2RlbCB2bUxpc3RNb2RlbDIgPSAoVm1M aXN0TW9kZWwpIG1vZGVsOwogICAgICAgICAgICAgICAgQXR0YWNoQ2RNb2RlbCBfYXR0YWNoQ2RN b2RlbCA9IChBdHRhY2hDZE1vZGVsKSB2bUxpc3RNb2RlbDIuZ2V0V2luZG93KCk7CiAgICAgICAg ICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBpbWFnZXMgPSAoQXJyYXlMaXN0PFN0cmluZz4pIHJl c3VsdDsKICAgICAgICAgICAgICAgIGlmIChpbWFnZXMuc2l6ZSgpID4gMCkKICAgICAgICAgICAg ICAgIHsKICAgICAgICAgICAgICAgICAgICBpbWFnZXMuYWRkKDAsIENvbnNvbGVNb2RlbC5FamVj dExhYmVsKTsKICAgICAgICAgICAgICAgICAgICBfYXR0YWNoQ2RNb2RlbC5nZXRJc29JbWFnZSgp LnNldEl0ZW1zKGltYWdlcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAo X2F0dGFjaENkTW9kZWwuZ2V0SXNvSW1hZ2UoKS5nZXRJc0NoYW5nYWJsZSgpKQogICAgICAgICAg ICAgICAgewogICAgICAgICAgICAgICAgICAgIF9hdHRhY2hDZE1vZGVsLmdldElzb0ltYWdlKCku c2V0U2VsZWN0ZWRJdGVtKExpbnEuRmlyc3RPckRlZmF1bHQoaW1hZ2VzKSk7CiAgICAgICAgICAg ICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIEFzeW5jRGF0YVByb3ZpZGVy LkdldElyc0ltYWdlTGlzdChnZXRJcnNJbWFnZUxpc3RDYWxsYmFjaywgdm0uZ2V0U3RvcmFnZVBv b2xJZCgpKTsKCiAgICAgICAgVUlDb21tYW5kIHRlbXBWYXIgPSBuZXcgVUlDb21tYW5kKCJPbkNo YW5nZUNEIiwgdGhpcyk7IC8vJE5PTi1OTFMtMSQKICAgICAgICB0ZW1wVmFyLnNldFRpdGxlKENv bnN0YW50c01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRDb25zdGFudHMoKS5vaygpKTsKICAgICAg ICB0ZW1wVmFyLnNldElzRGVmYXVsdCh0cnVlKTsKICAgICAgICBtb2RlbC5nZXRDb21tYW5kcygp LmFkZCh0ZW1wVmFyKTsKICAgICAgICBVSUNvbW1hbmQgdGVtcFZhcjIgPSBuZXcgVUlDb21tYW5k KCJDYW5jZWwiLCB0aGlzKTsgLy8kTk9OLU5MUy0xJAogICAgICAgIHRlbXBWYXIyLnNldFRpdGxl KENvbnN0YW50c01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRDb25zdGFudHMoKS5jYW5jZWwoKSk7 CiAgICAgICAgdGVtcFZhcjIuc2V0SXNDYW5jZWwodHJ1ZSk7CiAgICAgICAgbW9kZWwuZ2V0Q29t bWFuZHMoKS5hZGQodGVtcFZhcjIpOwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBPbkNoYW5nZUNE KCkKICAgIHsKICAgICAgICBWTSB2bSA9IChWTSkgZ2V0U2VsZWN0ZWRJdGVtKCk7CiAgICAgICAg aWYgKHZtID09IG51bGwpCiAgICAgICAgewogICAgICAgICAgICBDYW5jZWwoKTsKICAgICAgICAg ICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgQXR0YWNoQ2RNb2RlbCBtb2RlbCA9IChBdHRh Y2hDZE1vZGVsKSBnZXRXaW5kb3coKTsKICAgICAgICBpZiAobW9kZWwuZ2V0UHJvZ3Jlc3MoKSAh PSBudWxsKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAg U3RyaW5nIGlzb05hbWUgPQogICAgICAgICAgICAgICAgKFN0cmluZ0hlbHBlci5zdHJpbmdzRXF1 YWwobW9kZWwuZ2V0SXNvSW1hZ2UoKS5nZXRTZWxlY3RlZEl0ZW0oKS50b1N0cmluZygpLCBDb25z b2xlTW9kZWwuRWplY3RMYWJlbCkpID8gIiIgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgICAg ICAgICAgICA6IG1vZGVsLmdldElzb0ltYWdlKCkuZ2V0U2VsZWN0ZWRJdGVtKCkudG9TdHJpbmco KTsKCiAgICAgICAgbW9kZWwuU3RhcnRQcm9ncmVzcyhudWxsKTsKCiAgICAgICAgRnJvbnRlbmQu UnVuQWN0aW9uKFZkY0FjdGlvblR5cGUuQ2hhbmdlRGlzaywgbmV3IENoYW5nZURpc2tDb21tYW5k UGFyYW1ldGVycyh2bS5nZXRJZCgpLCBpc29OYW1lKSwKICAgICAgICAgICAgICAgIG5ldyBJRnJv bnRlbmRBY3Rpb25Bc3luY0NhbGxiYWNrKCkgewogICAgICAgICAgICAgICAgICAgIEBPdmVycmlk ZQogICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIEV4ZWN1dGVkKEZyb250ZW5kQWN0aW9u QXN5bmNSZXN1bHQgcmVzdWx0KSB7CgogICAgICAgICAgICAgICAgICAgICAgICBBdHRhY2hDZE1v ZGVsIGF0dGFjaENkTW9kZWwgPSAoQXR0YWNoQ2RNb2RlbCkgcmVzdWx0LmdldFN0YXRlKCk7CiAg ICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaENkTW9kZWwuU3RvcFByb2dyZXNzKCk7CiAgICAg ICAgICAgICAgICAgICAgICAgIENhbmNlbCgpOwoKICAgICAgICAgICAgICAgICAgICB9CiAgICAg ICAgICAgICAgICB9LCBtb2RlbCk7CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIHByZVNhdmUoKQog ICAgewogICAgICAgIGZpbmFsIFVuaXRWbU1vZGVsIG1vZGVsID0gKFVuaXRWbU1vZGVsKSBnZXRX aW5kb3coKTsKICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIG1vZGVsLmdldE5h bWUoKS5nZXRFbnRpdHkoKTsKCiAgICAgICAgaWYgKG1vZGVsLmdldElzTmV3KCkgPT0gZmFsc2Ug JiYgc2VsZWN0ZWRJdGVtID09IG51bGwpCiAgICAgICAgewogICAgICAgICAgICBDYW5jZWwoKTsK ICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgc2V0Y3VycmVudFZtKG1vZGVs LmdldElzTmV3KCkgPyBuZXcgVk0oKSA6IChWTSkgQ2xvbmVyLmNsb25lKHNlbGVjdGVkSXRlbSkp OwoKICAgICAgICBpZiAoIW1vZGVsLlZhbGlkYXRlKCkpCiAgICAgICAgewogICAgICAgICAgICBy ZXR1cm47CiAgICAgICAgfQoKICAgICAgICBBc3luY0RhdGFQcm92aWRlci5Jc1ZtTmFtZVVuaXF1 ZShuZXcgQXN5bmNRdWVyeSh0aGlzLCBuZXcgSU5ld0FzeW5jQ2FsbGJhY2soKSB7CgogICAgICAg ICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgcHVibGljIHZvaWQgT25TdWNjZXNzKE9iamVjdCB0 YXJnZXQsIE9iamVjdCByZXR1cm5WYWx1ZSkgewogICAgICAgICAgICAgICAgaWYgKCEoQm9vbGVh bikgcmV0dXJuVmFsdWUgJiYgbmFtZS5jb21wYXJlVG9JZ25vcmVDYXNlKGdldGN1cnJlbnRWbSgp LmdldFZtTmFtZSgpKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwuZ2V0TmFtZSgp CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SW52YWxpZGl0eVJlYXNvbnMoKQogICAg ICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChDb25zdGFudHNNYW5hZ2VyLmdldEluc3RhbmNl KCkuZ2V0Q29uc3RhbnRzKCkubmFtZU11c3RCZVVuaXF1ZUludmFsaWRSZWFzb24oKSk7CiAgICAg ICAgICAgICAgICAgICAgbW9kZWwuZ2V0TmFtZSgpLnNldElzVmFsaWQoZmFsc2UpOwogICAgICAg ICAgICAgICAgICAgIG1vZGVsLnNldElzR2VuZXJhbFRhYlZhbGlkKGZhbHNlKTsKICAgICAgICAg ICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwuZ2V0TmFtZSgpCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SW52YWxpZGl0eVJlYXNvbnMoKS5jbGVhcigpOwog ICAgICAgICAgICAgICAgICAgIG1vZGVsLmdldE5hbWUoKS5zZXRJc1ZhbGlkKHRydWUpOwogICAg ICAgICAgICAgICAgICAgIG1vZGVsLnNldElzR2VuZXJhbFRhYlZhbGlkKHRydWUpOwogICAgICAg ICAgICAgICAgICAgIG9uU2F2ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAg ICAgICAgfSksIG5hbWUpOwoKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgb25TYXZlKCkKICAgIHsK ICAgICAgICBVbml0Vm1Nb2RlbCBtb2RlbCA9IChVbml0Vm1Nb2RlbCkgZ2V0V2luZG93KCk7CiAg ICAgICAgVk0gc2VsZWN0ZWRJdGVtID0gKFZNKSBnZXRTZWxlY3RlZEl0ZW0oKTsKCiAgICAgICAg U3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBtb2RlbC5nZXROYW1lKCkuZ2V0RW50aXR5KCk7CgogICAg ICAgIC8vIFNhdmUgY2hhbmdlcy4KICAgICAgICBWbVRlbXBsYXRlIHRlbXBsYXRlID0gKFZtVGVt cGxhdGUpIG1vZGVsLmdldFRlbXBsYXRlKCkuZ2V0U2VsZWN0ZWRJdGVtKCk7CgogICAgICAgIGdl dGN1cnJlbnRWbSgpLnNldFZtVHlwZShtb2RlbC5nZXRWbVR5cGUoKSk7CiAgICAgICAgZ2V0Y3Vy cmVudFZtKCkuc2V0Vm10R3VpZCh0ZW1wbGF0ZS5nZXRJZCgpKTsKICAgICAgICBnZXRjdXJyZW50 Vm0oKS5zZXRWbU5hbWUobmFtZSk7CiAgICAgICAgaWYgKG1vZGVsLmdldFF1b3RhKCkuZ2V0U2Vs ZWN0ZWRJdGVtKCkgIT0gbnVsbCkgewogICAgICAgICAgICBnZXRjdXJyZW50Vm0oKS5zZXRRdW90 YUlkKCgoUXVvdGEpIG1vZGVsLmdldFF1b3RhKCkuZ2V0U2VsZWN0ZWRJdGVtKCkpLmdldElkKCkp OwogICAgICAgIH0KICAgICAgICBnZXRjdXJyZW50Vm0oKS5zZXRWbU9zKChWbU9zVHlwZSkgbW9k ZWwuZ2V0T1NUeXBlKCkuZ2V0U2VsZWN0ZWRJdGVtKCkpOwogICAgICAgIGdldGN1cnJlbnRWbSgp LnNldE51bU9mTW9uaXRvcnMoKEludGVnZXIpIG1vZGVsLmdldE51bU9mTW9uaXRvcnMoKS5nZXRT ZWxlY3RlZEl0ZW0oKSk7CiAgICAgICAgZ2V0Y3VycmVudFZtKCkuc2V0QWxsb3dDb25zb2xlUmVj b25uZWN0KChCb29sZWFuKSBtb2RlbC5nZXRBbGxvd0NvbnNvbGVSZWNvbm5lY3QoKS5nZXRFbnRp dHkoKSk7CiAgICAgICAgZ2V0Y3VycmVudFZtKCkuc2V0Vm1EZXNjcmlwdGlvbigoU3RyaW5nKSBt b2RlbC5nZXREZXNjcmlwdGlvbigpLmdldEVudGl0eSgpKTsKICAgICAgICBnZXRjdXJyZW50Vm0o KS5zZXRWbURvbWFpbihtb2RlbC5nZXREb21haW4oKS5nZXRJc0F2YWlsYWJsZSgpID8gKFN0cmlu ZykgbW9kZWwuZ2V0RG9tYWluKCkuZ2V0U2VsZWN0ZWRJdGVtKCkKICAgICAgICAgICAgICAgIDog IiIpOyAvLyROT04tTkxTLTEkCiAgICAgICAgZ2V0Y3VycmVudFZtKCkuc2V0Vm1NZW1TaXplTWIo KEludGVnZXIpIG1vZGVsLmdldE1lbVNpemUoKS5nZXRFbnRpdHkoKSk7CiAgICAgICAgZ2V0Y3Vy cmVudFZtKCkuc2V0TWluQWxsb2NhdGVkTWVtKChJbnRlZ2VyKSBtb2RlbC5nZXRNaW5BbGxvY2F0 ZWRNZW1vcnkoKS5nZXRFbnRpdHkoKSk7CiAgICAgICAgR3VpZCBuZXdDbHVzdGVySUQgPSAoKFZE U0dyb3VwKSBtb2RlbC5nZXRDbHVzdGVyKCkuZ2V0U2VsZWN0ZWRJdGVtKCkpLmdldElkKCk7CiAg ICAgICAgZ2V0Y3VycmVudFZtKCkuc2V0VmRzR3JvdXBJZChuZXdDbHVzdGVySUQpOwogICAgICAg IGdldGN1cnJlbnRWbSgpLnNldFRpbWVab25lKChtb2RlbC5nZXRUaW1lWm9uZSgpLmdldElzQXZh aWxhYmxlKCkgJiYgbW9kZWwuZ2V0VGltZVpvbmUoKS5nZXRTZWxlY3RlZEl0ZW0oKSAhPSBudWxs KSA/ICgoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPikgbW9kZWwuZ2V0VGltZVpvbmUoKQogICAg ICAgICAgICAgICAgLmdldFNlbGVjdGVkSXRlbSgpKS5nZXRLZXkoKQogICAgICAgICAgICAgICAg OiAiIik7IC8vJE5PTi1OTFMtMSQKICAgICAgICBnZXRjdXJyZW50Vm0oKS5zZXROdW1PZlNvY2tl dHMoKEludGVnZXIpIG1vZGVsLmdldE51bU9mU29ja2V0cygpLmdldFNlbGVjdGVkSXRlbSgpKTsK ICAgICAgICBnZXRjdXJyZW50Vm0oKS5zZXRDcHVQZXJTb2NrZXQoSW50ZWdlci5wYXJzZUludCht b2RlbC5nZXRUb3RhbENQVUNvcmVzKCkuZ2V0RW50aXR5KCkudG9TdHJpbmcoKSkKICAgICAgICAg ICAgICAgIC8gKEludGVnZXIpIG1vZGVsLmdldE51bU9mU29ja2V0cygpLmdldFNlbGVjdGVkSXRl bSgpKTsKICAgICAgICBnZXRjdXJyZW50Vm0oKS5zZXRVc2JQb2xpY3koKFVzYlBvbGljeSkgbW9k ZWwuZ2V0VXNiUG9saWN5KCkuZ2V0U2VsZWN0ZWRJdGVtKCkpOwogICAgICAgIGdldGN1cnJlbnRW bSgpLnNldEF1dG9TdXNwZW5kKGZhbHNlKTsKICAgICAgICBnZXRjdXJyZW50Vm0oKS5zZXRTdGF0 ZWxlc3MoKEJvb2xlYW4pIG1vZGVsLmdldElzU3RhdGVsZXNzKCkuZ2V0RW50aXR5KCkpOwogICAg ICAgIGdldGN1cnJlbnRWbSgpLnNldFNtYXJ0Y2FyZEVuYWJsZWQoKEJvb2xlYW4pIG1vZGVsLmdl dElzU21hcnRjYXJkRW5hYmxlZCgpLmdldEVudGl0eSgpKTsKICAgICAgICBnZXRjdXJyZW50Vm0o KS5zZXREZWxldGVQcm90ZWN0ZWQoKEJvb2xlYW4pIG1vZGVsLmdldElzRGVsZXRlUHJvdGVjdGVk KCkuZ2V0RW50aXR5KCkpOwogICAgICAgIGdldGN1cnJlbnRWbSgpLnNldERlZmF1bHRCb290U2Vx dWVuY2UobW9kZWwuZ2V0Qm9vdFNlcXVlbmNlKCkpOwogICAgICAgIGdldGN1cnJlbnRWbSgpLnNl dElzb1BhdGgobW9kZWwuZ2V0Q2RJbWFnZSgpLmdldElzQ2hhbmdhYmxlKCkgPyAoU3RyaW5nKSBt b2RlbC5nZXRDZEltYWdlKCkuZ2V0U2VsZWN0ZWRJdGVtKCkKICAgICAgICAgICAgICAgIDogIiIp OyAvLyROT04tTkxTLTEkCiAgICAgICAgZ2V0Y3VycmVudFZtKCkuc2V0QXV0b1N0YXJ0dXAoKEJv b2xlYW4pIG1vZGVsLmdldElzSGlnaGx5QXZhaWxhYmxlKCkuZ2V0RW50aXR5KCkpOwoKICAgICAg ICBnZXRjdXJyZW50Vm0oKS5zZXRJbml0cmRVcmwoKFN0cmluZykgbW9kZWwuZ2V0SW5pdHJkX3Bh dGgoKS5nZXRFbnRpdHkoKSk7CiAgICAgICAgZ2V0Y3VycmVudFZtKCkuc2V0S2VybmVsVXJsKChT dHJpbmcpIG1vZGVsLmdldEtlcm5lbF9wYXRoKCkuZ2V0RW50aXR5KCkpOwogICAgICAgIGdldGN1 cnJlbnRWbSgpLnNldEtlcm5lbFBhcmFtcygoU3RyaW5nKSBtb2RlbC5nZXRLZXJuZWxfcGFyYW1l dGVycygpLmdldEVudGl0eSgpKTsKCiAgICAgICAgZ2V0Y3VycmVudFZtKCkuc2V0Q3VzdG9tUHJv cGVydGllcyhtb2RlbC5nZXRDdXN0b21Qcm9wZXJ0eVNoZWV0KCkuZ2V0RW50aXR5KCkpOwoKICAg ICAgICBFbnRpdHlNb2RlbCBkaXNwbGF5UHJvdG9jb2xTZWxlY3RlZEl0ZW0gPSAoRW50aXR5TW9k ZWwpIG1vZGVsLmdldERpc3BsYXlQcm90b2NvbCgpLmdldFNlbGVjdGVkSXRlbSgpOwogICAgICAg IGdldGN1cnJlbnRWbSgpLnNldERlZmF1bHREaXNwbGF5VHlwZSgoRGlzcGxheVR5cGUpIGRpc3Bs YXlQcm90b2NvbFNlbGVjdGVkSXRlbS5nZXRFbnRpdHkoKSk7CgogICAgICAgIEVudGl0eU1vZGVs IHByaW9yaXR5U2VsZWN0ZWRJdGVtID0gKEVudGl0eU1vZGVsKSBtb2RlbC5nZXRQcmlvcml0eSgp LmdldFNlbGVjdGVkSXRlbSgpOwogICAgICAgIGdldGN1cnJlbnRWbSgpLnNldFByaW9yaXR5KChJ bnRlZ2VyKSBwcmlvcml0eVNlbGVjdGVkSXRlbS5nZXRFbnRpdHkoKSk7CgogICAgICAgIGdldGN1 cnJlbnRWbSgpLnNldENwdVBpbm5pbmcoKFN0cmluZykgbW9kZWwuZ2V0Q3B1UGlubmluZygpCiAg ICAgICAgICAgICAgICAuZ2V0RW50aXR5KCkpOwoKICAgICAgICBWRFMgZGVmYXVsdEhvc3QgPSAo VkRTKSBtb2RlbC5nZXREZWZhdWx0SG9zdCgpLmdldFNlbGVjdGVkSXRlbSgpOwogICAgICAgIGlm ICgoQm9vbGVhbikgbW9kZWwuZ2V0SXNBdXRvQXNzaWduKCkuZ2V0RW50aXR5KCkpCiAgICAgICAg ewogICAgICAgICAgICBnZXRjdXJyZW50Vm0oKS5zZXREZWRpY2F0ZWRWbUZvclZkcyhudWxsKTsK ICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgZ2V0Y3VycmVudFZt KCkuc2V0RGVkaWNhdGVkVm1Gb3JWZHMoZGVmYXVsdEhvc3QuZ2V0SWQoKSk7CiAgICAgICAgfQoK ICAgICAgICBnZXRjdXJyZW50Vm0oKS5zZXRNaWdyYXRpb25TdXBwb3J0KE1pZ3JhdGlvblN1cHBv cnQuTUlHUkFUQUJMRSk7CiAgICAgICAgaWYgKChCb29sZWFuKSBtb2RlbC5nZXRSdW5WTU9uU3Bl Y2lmaWNIb3N0KCkuZ2V0RW50aXR5KCkpCiAgICAgICAgewogICAgICAgICAgICBnZXRjdXJyZW50 Vm0oKS5zZXRNaWdyYXRpb25TdXBwb3J0KE1pZ3JhdGlvblN1cHBvcnQuUElOTkVEX1RPX0hPU1Qp OwogICAgICAgICAgICBnZXRjdXJyZW50Vm0oKS5zZXRVc2VIb3N0Q3B1RmxhZ3MoKEJvb2xlYW4p IG1vZGVsLmdldEhvc3RDcHUoKS5nZXRFbnRpdHkoKSk7CiAgICAgICAgfQogICAgICAgIGVsc2Ug aWYgKChCb29sZWFuKSBtb2RlbC5nZXREb250TWlncmF0ZVZNKCkuZ2V0RW50aXR5KCkpCiAgICAg ICAgewogICAgICAgICAgICBnZXRjdXJyZW50Vm0oKS5zZXRNaWdyYXRpb25TdXBwb3J0KE1pZ3Jh dGlvblN1cHBvcnQuSU1QTElDSVRMWV9OT05fTUlHUkFUQUJMRSk7CiAgICAgICAgICAgIGdldGN1 cnJlbnRWbSgpLnNldFVzZUhvc3RDcHVGbGFncygoQm9vbGVhbikgbW9kZWwuZ2V0SG9zdENwdSgp LmdldEVudGl0eSgpKTsKICAgICAgICB9CgogICAgICAgIGlmICgoQm9vbGVhbikgbW9kZWwuZ2V0 UnVuVk1PblRydXN0ZWRIb3N0KCkuZ2V0RW50aXR5KCkpCiAgICAgICAgewogICAgICAgICAgICBn ZXRjdXJyZW50Vm0oKS5zZXRUcnVzdGVkSG9zdEZsYWcoKEJvb2xlYW4pIG1vZGVsLmdldFJ1blZN T25UcnVzdGVkSG9zdCgpLmdldEVudGl0eSgpKTsKICAgICAgICAgICAgZ2V0Y3VycmVudFZtKCku c2V0RGVkaWNhdGVkVm1Gb3JWZHMobnVsbCk7CiAgICAgICAgfQoKICAgICAgICBpZiAobW9kZWwu Z2V0SXNOZXcoKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChnZXRjdXJyZW50Vm0oKS5nZXRW bXRHdWlkKCkuZXF1YWxzKE5HdWlkLkVtcHR5KSkKICAgICAgICAgICAgewogICAgICAgICAgICAg ICAgaWYgKG1vZGVsLmdldFByb2dyZXNzKCkgIT0gbnVsbCkKICAgICAgICAgICAgICAgIHsKICAg ICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAg ICAgbW9kZWwuU3RhcnRQcm9ncmVzcyhudWxsKTsKCiAgICAgICAgICAgICAgICBGcm9udGVuZC5S dW5BY3Rpb24oVmRjQWN0aW9uVHlwZS5BZGRWbUZyb21TY3JhdGNoLCBuZXcgQWRkVm1Gcm9tU2Ny YXRjaFBhcmFtZXRlcnMoZ2V0Y3VycmVudFZtKCksCiAgICAgICAgICAgICAgICAgICAgICAgIG5l dyBBcnJheUxpc3Q8RGlza0ltYWdlPigpLAogICAgICAgICAgICAgICAgICAgICAgICBOR3VpZC5F bXB0eSksCiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJRnJvbnRlbmRBY3Rpb25Bc3luY0Nh bGxiYWNrKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBFeGVjdXRlZChGcm9udGVuZEFjdGlvbkFz eW5jUmVzdWx0IHJlc3VsdCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWbUxp c3RNb2RlbCB2bUxpc3RNb2RlbCA9IChWbUxpc3RNb2RlbCkgcmVzdWx0LmdldFN0YXRlKCk7CiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm1MaXN0TW9kZWwuZ2V0V2luZG93KCkuU3Rv cFByb2dyZXNzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmRjUmV0dXJuVmFs dWVCYXNlIHJldHVyblZhbHVlQmFzZSA9IHJlc3VsdC5nZXRSZXR1cm5WYWx1ZSgpOwogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR1cm5WYWx1ZUJhc2UgIT0gbnVsbCAmJiBy ZXR1cm5WYWx1ZUJhc2UuZ2V0U3VjY2VlZGVkKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bUxpc3RNb2RlbC5D YW5jZWwoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm1MaXN0TW9kZWwu c2V0R3VpZGVDb250ZXh0KHJldHVyblZhbHVlQmFzZS5nZXRBY3Rpb25SZXR1cm5WYWx1ZSgpKTsK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm1MaXN0TW9kZWwuVXBkYXRlQWN0 aW9uQXZhaWxhYmlsaXR5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZt TGlzdE1vZGVsLmdldEd1aWRlQ29tbWFuZCgpLkV4ZWN1dGUoKTsKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAg ICAgICAgICAgICAgICB9LCB0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAg ICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChtb2RlbC5nZXRQcm9ncmVzcygpICE9IG51 bGwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAg ICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICgoQm9vbGVhbikgbW9kZWwuZ2V0UHJvdmlz aW9uaW5nKCkuZ2V0RW50aXR5KCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAg ICAgbW9kZWwuU3RhcnRQcm9ncmVzcyhudWxsKTsKCiAgICAgICAgICAgICAgICAgICAgQXN5bmNR dWVyeSBfYXN5bmNRdWVyeSA9IG5ldyBBc3luY1F1ZXJ5KCk7CiAgICAgICAgICAgICAgICAgICAg X2FzeW5jUXVlcnkuc2V0TW9kZWwodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgX2FzeW5jUXVl cnkuYXN5bmNDYWxsYmFjayA9IG5ldyBJTmV3QXN5bmNDYWxsYmFjaygpIHsKICAgICAgICAgICAg ICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lk IE9uU3VjY2VzcyhPYmplY3QgbW9kZWwxLCBPYmplY3QgcmVzdWx0MSkKICAgICAgICAgICAgICAg ICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgVm1MaXN0TW9kZWwgdm1MaXN0 TW9kZWwgPSAoVm1MaXN0TW9kZWwpIG1vZGVsMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAg IEFycmF5TGlzdDxEaXNrSW1hZ2U+IHRlbXBsYXRlRGlza3MgPSAoQXJyYXlMaXN0PERpc2tJbWFn ZT4pIHJlc3VsdDE7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pdFZtTW9kZWwgdW5p dFZtTW9kZWwgPSAoVW5pdFZtTW9kZWwpIHZtTGlzdE1vZGVsLmdldFdpbmRvdygpOwoKICAgICAg ICAgICAgICAgICAgICAgICAgICAgIEhhc2hNYXA8R3VpZCwgRGlza0ltYWdlPiBpbWFnZVRvRGVz dGluYXRpb25Eb21haW5NYXAgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1 bml0Vm1Nb2RlbC5nZXREaXNrc0FsbG9jYXRpb25Nb2RlbCgpLmdldEltYWdlVG9EZXN0aW5hdGlv bkRvbWFpbk1hcCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdDxzdG9y YWdlX2RvbWFpbnM+IGFjdGl2ZVN0b3JhZ2VEb21haW5zID0KICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgdW5pdFZtTW9kZWwuZ2V0RGlza3NBbGxvY2F0aW9uTW9kZWwoKS5nZXRB Y3RpdmVTdG9yYWdlRG9tYWlucygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhc2hN YXA8R3VpZCwgRGlza0ltYWdlPiBkaWN0ID0gdW5pdFZtTW9kZWwuZ2V0RGlza3NBbGxvY2F0aW9u TW9kZWwoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SW1hZ2VUb0Rl c3RpbmF0aW9uRG9tYWluTWFwKChCb29sZWFuKSB1bml0Vm1Nb2RlbC5nZXREaXNrc0FsbG9jYXRp b25Nb2RlbCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdl dElzU2luZ2xlU3RvcmFnZURvbWFpbigpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgLmdldEVudGl0eSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZv ciAoRGlza0ltYWdlIHRlbXBsYXRlRGlzayA6IHRlbXBsYXRlRGlza3MpCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlza01vZGVs IGRpc2sgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoRGlza01v ZGVsIGEgOiB1bml0Vm1Nb2RlbC5nZXREaXNrc0FsbG9jYXRpb25Nb2RlbCgpLmdldERpc2tzKCkp CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBpZiAodGVtcGxhdGVEaXNrLmdldElkKCkuZXF1YWxzKGEuZ2V0RGlzaygp LmdldElkKCkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNrID0gYTsKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlX2RvbWFpbnMgc3RvcmFnZURvbWFpbiA9CiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5xLmdldFN0b3JhZ2VCeUlk KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZVRv RGVzdGluYXRpb25Eb21haW5NYXAuZ2V0KHRlbXBsYXRlRGlzay5nZXRJZCgpKQogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRzdG9yYWdl X2lkcygpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgLmdldCgwKSwgYWN0aXZlU3RvcmFnZURvbWFpbnMpOwoKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBpZiAoZGlzayAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGRpY3QuZ2V0KHRlbXBsYXRlRGlzay5nZXRJZCgpKQogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXR2b2x1bWVfdHlwZSgoVm9sdW1lVHlw ZSkgZGlzay5nZXRWb2x1bWVUeXBlKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIC5nZXRTZWxlY3RlZEl0ZW0oKSk7CiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGRpY3QuZ2V0KHRlbXBsYXRlRGlzay5nZXRJZCgpKQogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXR2b2x1bWVfZm9ybWF0KEFz eW5jRGF0YVByb3ZpZGVyLkdldERpc2tWb2x1bWVGb3JtYXQoCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVm9sdW1lVHlwZSkgZGlzay5nZXRWb2x1 bWVUeXBlKCkuZ2V0U2VsZWN0ZWRJdGVtKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlRG9tYWluLmdldHN0b3JhZ2VfdHlwZSgpKSk7 CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXNrLmdldFF1b3RhKCku Z2V0U2VsZWN0ZWRJdGVtKCkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgZGljdC5nZXQodGVtcGxhdGVEaXNrLmdldElkKCkpLnNldFF1b3RhSWQoKChR dW90YSkgZGlzay5nZXRRdW90YSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIC5nZXRTZWxlY3RlZEl0ZW0oKSkuZ2V0SWQoKSk7CiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9 CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAg ICAgc3RvcmFnZV9kb21haW5zIHN0b3JhZ2VEb21haW4gPQogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAoc3RvcmFnZV9kb21haW5zKSB1bml0Vm1Nb2RlbC5nZXREaXNrc0FsbG9j YXRpb25Nb2RlbCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg LmdldFN0b3JhZ2VEb21haW4oKS5nZXRTZWxlY3RlZEl0ZW0oKTsKCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICBBZGRWbUZyb21UZW1wbGF0ZVBhcmFtZXRlcnMgcGFyYW0gPQogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWRkVm1Gcm9tVGVtcGxhdGVQYXJhbWV0ZXJz KHZtTGlzdE1vZGVsLmdldGN1cnJlbnRWbSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGRpY3QsIHN0b3JhZ2VEb21haW4uZ2V0SWQoKSk7CgogICAgICAgICAg ICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0PFZkY0FjdGlvblBhcmFtZXRlcnNCYXNlPiBwYXJh bWV0ZXJzID0gbmV3IEFycmF5TGlzdDxWZGNBY3Rpb25QYXJhbWV0ZXJzQmFzZT4oKTsKICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMuYWRkKHBhcmFtKTsKCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICBGcm9udGVuZC5SdW5NdWx0aXBsZUFjdGlvbihWZGNBY3Rpb25UeXBl LkFkZFZtRnJvbVRlbXBsYXRlLCBwYXJhbWV0ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBuZXcgSUZyb250ZW5kTXVsdGlwbGVBY3Rpb25Bc3luY0NhbGxiYWNrKCkgewog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBFeGVjdXRlZChGcm9u dGVuZE11bHRpcGxlQWN0aW9uQXN5bmNSZXN1bHQgcmVzdWx0KSB7CiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgVm1MaXN0TW9kZWwgdm1MaXN0TW9kZWwxID0gKFZt TGlzdE1vZGVsKSByZXN1bHQuZ2V0U3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB2bUxpc3RNb2RlbDEuZ2V0V2luZG93KCkuU3RvcFByb2dyZXNzKCk7 CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm1MaXN0TW9kZWwx LkNhbmNlbCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB2bUxpc3RNb2RlbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAg ICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIEFzeW5jRGF0YVByb3ZpZGVy LkdldFRlbXBsYXRlRGlza0xpc3QoX2FzeW5jUXVlcnksIHRlbXBsYXRlLmdldElkKCkpOwogICAg ICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAg ICAgICAgICAgICAgICAgIGlmIChtb2RlbC5nZXRQcm9ncmVzcygpICE9IG51bGwpCiAgICAgICAg ICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAg ICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBtb2RlbC5TdGFydFByb2dyZXNzKG51bGwp OwoKICAgICAgICAgICAgICAgICAgICBWbU1hbmFnZW1lbnRQYXJhbWV0ZXJzQmFzZSBwYXJhbXMg PSBuZXcgVm1NYW5hZ2VtZW50UGFyYW1ldGVyc0Jhc2UoZ2V0Y3VycmVudFZtKCkpOwogICAgICAg ICAgICAgICAgICAgIHBhcmFtcy5zZXREaXNrSW5mb0Rlc3RpbmF0aW9uTWFwKAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgbW9kZWwuZ2V0RGlza3NBbGxvY2F0aW9uTW9kZWwoKQogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SW1hZ2VUb0Rlc3RpbmF0aW9uRG9tYWlu TWFwKChCb29sZWFuKSBtb2RlbC5nZXREaXNrc0FsbG9jYXRpb25Nb2RlbCgpCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldElzU2luZ2xlU3RvcmFnZURvbWFp bigpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEVudGl0 eSgpKSk7CgogICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdDxWZGNBY3Rpb25QYXJhbWV0ZXJz QmFzZT4gcGFyYW1ldGVycyA9IG5ldyBBcnJheUxpc3Q8VmRjQWN0aW9uUGFyYW1ldGVyc0Jhc2U+ KCk7CiAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycy5hZGQocGFyYW1zKTsKCiAgICAgICAg ICAgICAgICAgICAgRnJvbnRlbmQuUnVuTXVsdGlwbGVBY3Rpb24oVmRjQWN0aW9uVHlwZS5BZGRW bSwgcGFyYW1ldGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJRnJvbnRlbmRN dWx0aXBsZUFjdGlvbkFzeW5jQ2FsbGJhY2soKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZv aWQgRXhlY3V0ZWQoRnJvbnRlbmRNdWx0aXBsZUFjdGlvbkFzeW5jUmVzdWx0IHJlc3VsdCkgewog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWbUxpc3RNb2RlbCB2bUxpc3RNb2Rl bDEgPSAoVm1MaXN0TW9kZWwpIHJlc3VsdC5nZXRTdGF0ZSgpOwogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB2bUxpc3RNb2RlbDEuZ2V0V2luZG93KCkuU3RvcFByb2dyZXNzKCk7 CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtTGlzdE1vZGVsMS5DYW5jZWwo KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAg ICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyk7CiAgICAgICAgICAg ICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSAvLyBVcGRhdGUgZXhp c3RpbmcgVk0gLT4gY29uc2lzdHMgb2YgZWRpdGluZyBWTSBjbHVzdGVyLCBhbmQgaWYgc3VjY2Vl ZHMgLSBlZGl0aW5nIFZNOgogICAgICAgIHsKICAgICAgICAgICAgaWYgKG1vZGVsLmdldFByb2dy ZXNzKCkgIT0gbnVsbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAg ICAgICAgICB9CgogICAgICAgICAgICAvLyBydW5FZGl0Vk06IHNob3VsZCBiZSB0cnVlIGlmIENs dXN0ZXIgaGFzbid0IGNoYW5nZWQgb3IgaWYKICAgICAgICAgICAgLy8gQ2x1c3RlciBoYXMgY2hh bmdlZCBhbmQgRWRpdGluZyBpdCBpbiB0aGUgQmFja2VuZCBoYXMgc3VjY2VlZGVkOgogICAgICAg ICAgICBHdWlkIG9sZENsdXN0ZXJJRCA9IHNlbGVjdGVkSXRlbS5nZXRWZHNHcm91cElkKCk7CiAg ICAgICAgICAgIGlmIChvbGRDbHVzdGVySUQuZXF1YWxzKG5ld0NsdXN0ZXJJRCkgPT0gZmFsc2Up CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENoYW5nZVZNQ2x1c3RlclBhcmFtZXRlcnMg cGFyYW1ldGVycyA9CiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDaGFuZ2VWTUNsdXN0ZXJQ YXJhbWV0ZXJzKG5ld0NsdXN0ZXJJRCwgZ2V0Y3VycmVudFZtKCkuZ2V0SWQoKSk7CgogICAgICAg ICAgICAgICAgbW9kZWwuU3RhcnRQcm9ncmVzcyhudWxsKTsKCiAgICAgICAgICAgICAgICBGcm9u dGVuZC5SdW5BY3Rpb24oVmRjQWN0aW9uVHlwZS5DaGFuZ2VWTUNsdXN0ZXIsIHBhcmFtZXRlcnMs CiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJRnJvbnRlbmRBY3Rpb25Bc3luY0NhbGxiYWNr KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBFeGVjdXRlZChGcm9udGVuZEFjdGlvbkFzeW5jUmVz dWx0IHJlc3VsdCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWbUxpc3RNb2Rl bCB2bUxpc3RNb2RlbCA9IChWbUxpc3RNb2RlbCkgcmVzdWx0LmdldFN0YXRlKCk7CiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgVmRjUmV0dXJuVmFsdWVCYXNlIHJldHVyblZhbHVlQmFz ZSA9IHJlc3VsdC5nZXRSZXR1cm5WYWx1ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGlmIChyZXR1cm5WYWx1ZUJhc2UgIT0gbnVsbCAmJiByZXR1cm5WYWx1ZUJhc2UuZ2V0U3Vj Y2VlZGVkKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBGcm9udGVuZC5SdW5BY3Rpb24oVmRjQWN0aW9uVHlwZS5V cGRhdGVWbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcg Vm1NYW5hZ2VtZW50UGFyYW1ldGVyc0Jhc2Uodm1MaXN0TW9kZWwuZ2V0Y3VycmVudFZtKCkpLAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJRnJvbnRlbmRB Y3Rpb25Bc3luY0NhbGxiYWNrKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgcHVibGljIHZvaWQgRXhlY3V0ZWQoRnJvbnRlbmRBY3Rpb25Bc3luY1Jl c3VsdCByZXN1bHQxKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgVm1MaXN0TW9kZWwgdm1MaXN0TW9kZWwxID0gKFZtTGlzdE1vZGVsKSByZXN1 bHQxLmdldFN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB2bUxpc3RNb2RlbDEuZ2V0V2luZG93KCkuU3RvcFByb2dyZXNzKCk7CiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZGNSZXR1cm5W YWx1ZUJhc2UgcmV0VmFsID0gcmVzdWx0MS5nZXRSZXR1cm5WYWx1ZSgpOwogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1N1Y2NlZWRl ZCA9IHJldFZhbC5nZXRTdWNjZWVkZWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXRWYWwgIT0gbnVsbCAmJiBpc1N1Y2NlZWRlZCkK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bUxp c3RNb2RlbDEuQ2FuY2VsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bUxpc3RNb2RlbCk7 CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtTGlzdE1vZGVsLmdldFdpbmRvdygpLlN0b3BQ cm9ncmVzcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMpOwogICAg ICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAg aWYgKG1vZGVsLmdldFByb2dyZXNzKCkgIT0gbnVsbCkKICAgICAgICAgICAgICAgIHsKICAgICAg ICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAg bW9kZWwuU3RhcnRQcm9ncmVzcyhudWxsKTsKCiAgICAgICAgICAgICAgICBGcm9udGVuZC5SdW5B Y3Rpb24oVmRjQWN0aW9uVHlwZS5VcGRhdGVWbSwgbmV3IFZtTWFuYWdlbWVudFBhcmFtZXRlcnNC YXNlKGdldGN1cnJlbnRWbSgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgbmV3IElGcm9udGVu ZEFjdGlvbkFzeW5jQ2FsbGJhY2soKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3Zl cnJpZGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIEV4ZWN1dGVkKEZy b250ZW5kQWN0aW9uQXN5bmNSZXN1bHQgcmVzdWx0KSB7CgogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFZtTGlzdE1vZGVsIHZtTGlzdE1vZGVsID0gKFZtTGlzdE1vZGVsKSByZXN1bHQu Z2V0U3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bUxpc3RNb2RlbC5n ZXRXaW5kb3coKS5TdG9wUHJvZ3Jlc3MoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBWZGNSZXR1cm5WYWx1ZUJhc2UgcmV0dXJuVmFsdWVCYXNlID0gcmVzdWx0LmdldFJldHVyblZh bHVlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHVyblZhbHVlQmFz ZSAhPSBudWxsICYmIHJldHVyblZhbHVlQmFzZS5nZXRTdWNjZWVkZWQoKSkKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHZtTGlzdE1vZGVsLkNhbmNlbCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0K CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0s IHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHByaXZhdGUgdm9pZCBS ZXRyaWV2ZUlzb0ltYWdlcygpCiAgICB7CiAgICAgICAgT2JqZWN0IHRlbXBWYXIgPSBnZXRTZWxl Y3RlZEl0ZW0oKTsKICAgICAgICBWTSB2bSA9IChWTSkgKCh0ZW1wVmFyIGluc3RhbmNlb2YgVk0p ID8gdGVtcFZhciA6IG51bGwpOwogICAgICAgIGlmICh2bSA9PSBudWxsKQogICAgICAgIHsKICAg ICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgR3VpZCBzdG9yYWdlUG9vbElkID0g dm0uZ2V0U3RvcmFnZVBvb2xJZCgpOwoKICAgICAgICBnZXRJc29JbWFnZXMoKS5jbGVhcigpOwoK ICAgICAgICBDaGFuZ2VDRE1vZGVsIHRlbXBWYXIyID0gbmV3IENoYW5nZUNETW9kZWwoKTsKICAg ICAgICB0ZW1wVmFyMi5zZXRUaXRsZShDb25zb2xlTW9kZWwuRWplY3RMYWJlbCk7CiAgICAgICAg Q2hhbmdlQ0RNb2RlbCBlamVjdE1vZGVsID0gdGVtcFZhcjI7CiAgICAgICAgZWplY3RNb2RlbC5n ZXRFeGVjdXRlZEV2ZW50KCkuYWRkTGlzdGVuZXIodGhpcyk7CiAgICAgICAgZ2V0SXNvSW1hZ2Vz KCkuYWRkKGVqZWN0TW9kZWwpOwoKICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3 IEFycmF5TGlzdDxTdHJpbmc+KCk7CiAgICAgICAgQ2hhbmdlQ0RNb2RlbCB0ZW1wVmFyNCA9IG5l dyBDaGFuZ2VDRE1vZGVsKCk7CiAgICAgICAgdGVtcFZhcjQuc2V0VGl0bGUoQ29uc3RhbnRzTWFu YWdlci5nZXRJbnN0YW5jZSgpLmdldENvbnN0YW50cygpLm5vQ0RzVGl0bGUoKSk7CiAgICAgICAg Z2V0SXNvSW1hZ2VzKCkuYWRkKHRlbXBWYXI0KTsKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgY2hh bmdlQ0QoT2JqZWN0IHNlbmRlciwgRXZlbnRBcmdzIGUpCiAgICB7CiAgICAgICAgQ2hhbmdlQ0RN b2RlbCBtb2RlbCA9IChDaGFuZ2VDRE1vZGVsKSBzZW5kZXI7CgogICAgICAgIC8vIFRPRE86IFBh dGNoIQogICAgICAgIFN0cmluZyBpc29OYW1lID0gbW9kZWwuZ2V0VGl0bGUoKTsKICAgICAgICBp ZiAoU3RyaW5nSGVscGVyLnN0cmluZ3NFcXVhbChpc29OYW1lLCAiTm8gQ0RzIikpIC8vJE5PTi1O TFMtMSQKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIE9i amVjdCB0ZW1wVmFyID0gZ2V0U2VsZWN0ZWRJdGVtKCk7CiAgICAgICAgVk0gdm0gPSAoVk0pICgo dGVtcFZhciBpbnN0YW5jZW9mIFZNKSA/IHRlbXBWYXIgOiBudWxsKTsKICAgICAgICBpZiAodm0g PT0gbnVsbCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAg IEZyb250ZW5kLlJ1bk11bHRpcGxlQWN0aW9uKFZkY0FjdGlvblR5cGUuQ2hhbmdlRGlzaywKICAg ICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8VmRjQWN0aW9uUGFyYW1ldGVyc0Jhc2U+KEFycmF5 cy5hc0xpc3QobmV3IFZkY0FjdGlvblBhcmFtZXRlcnNCYXNlW10geyBuZXcgQ2hhbmdlRGlza0Nv bW1hbmRQYXJhbWV0ZXJzKHZtLmdldElkKCksCiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmlu Z0hlbHBlci5zdHJpbmdzRXF1YWwoaXNvTmFtZSwgQ29uc29sZU1vZGVsLkVqZWN0TGFiZWwpID8g IiIgOiBpc29OYW1lKSB9KSksIC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgICAgIG5ldyBJRnJv bnRlbmRNdWx0aXBsZUFjdGlvbkFzeW5jQ2FsbGJhY2soKSB7CiAgICAgICAgICAgICAgICAgICAg QE92ZXJyaWRlCiAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgRXhlY3V0ZWQoRnJvbnRl bmRNdWx0aXBsZUFjdGlvbkFzeW5jUmVzdWx0IHJlc3VsdCkgewoKICAgICAgICAgICAgICAgICAg ICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgbnVsbCk7CiAgICB9CgogICAg cHVibGljIHZvaWQgQ2FuY2VsKCkKICAgIHsKICAgICAgICBGcm9udGVuZC5VbnN1YnNjcmliZSgp OwoKICAgICAgICBDYW5jZWxDb25maXJtYXRpb24oKTsKCiAgICAgICAgc2V0R3VpZGVDb250ZXh0 KG51bGwpOwogICAgICAgIHNldFdpbmRvdyhudWxsKTsKCiAgICAgICAgVXBkYXRlQWN0aW9uQXZh aWxhYmlsaXR5KCk7CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIENhbmNlbENvbmZpcm1hdGlvbigp CiAgICB7CiAgICAgICAgc2V0Q29uZmlybVdpbmRvdyhudWxsKTsKICAgIH0KCiAgICBwdWJsaWMg dm9pZCBDYW5jZWxFcnJvcigpCiAgICB7CiAgICAgICAgc2V0RXJyb3JXaW5kb3cobnVsbCk7CiAg ICB9CgogICAgQE92ZXJyaWRlCiAgICBwcm90ZWN0ZWQgdm9pZCBPblNlbGVjdGVkSXRlbUNoYW5n ZWQoKQogICAgewogICAgICAgIHN1cGVyLk9uU2VsZWN0ZWRJdGVtQ2hhbmdlZCgpOwoKICAgICAg ICBVcGRhdGVBY3Rpb25BdmFpbGFiaWxpdHkoKTsKICAgICAgICBVcGRhdGVDb25zb2xlTW9kZWxz KCk7CiAgICB9CgogICAgQE92ZXJyaWRlCiAgICBwcm90ZWN0ZWQgdm9pZCBTZWxlY3RlZEl0ZW1z Q2hhbmdlZCgpCiAgICB7CiAgICAgICAgc3VwZXIuU2VsZWN0ZWRJdGVtc0NoYW5nZWQoKTsKCiAg ICAgICAgVXBkYXRlQWN0aW9uQXZhaWxhYmlsaXR5KCk7CiAgICAgICAgVXBkYXRlQ29uc29sZU1v ZGVscygpOwogICAgfQoKICAgIEBPdmVycmlkZQogICAgcHJvdGVjdGVkIHZvaWQgU2VsZWN0ZWRJ dGVtUHJvcGVydHlDaGFuZ2VkKE9iamVjdCBzZW5kZXIsIFByb3BlcnR5Q2hhbmdlZEV2ZW50QXJn cyBlKQogICAgewogICAgICAgIHN1cGVyLlNlbGVjdGVkSXRlbVByb3BlcnR5Q2hhbmdlZChzZW5k ZXIsIGUpOwoKICAgICAgICBpZiAoZS5Qcm9wZXJ0eU5hbWUuZXF1YWxzKCJzdGF0dXMiKSkgLy8k Tk9OLU5MUy0xJAogICAgICAgIHsKICAgICAgICAgICAgVXBkYXRlQWN0aW9uQXZhaWxhYmlsaXR5 KCk7CgogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlLlByb3BlcnR5TmFtZS5lcXVhbHMoImRp c3BsYXlfdHlwZSIpKSAvLyROT04tTkxTLTEkCiAgICAgICAgewogICAgICAgICAgICBVcGRhdGVD b25zb2xlTW9kZWxzKCk7CiAgICAgICAgfQogICAgfQoKICAgIHByaXZhdGUgdm9pZCBVcGRhdGVB Y3Rpb25BdmFpbGFiaWxpdHkoKQogICAgewogICAgICAgIExpc3QgaXRlbXMgPQogICAgICAgICAg ICAgICAgZ2V0U2VsZWN0ZWRJdGVtcygpICE9IG51bGwgJiYgZ2V0U2VsZWN0ZWRJdGVtKCkgIT0g bnVsbCA/IGdldFNlbGVjdGVkSXRlbXMoKQogICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBB cnJheUxpc3QoKTsKCiAgICAgICAgZ2V0RWRpdENvbW1hbmQoKS5zZXRJc0V4ZWN1dGlvbkFsbG93 ZWQoaXNFZGl0Q29tbWFuZEV4ZWN1dGlvbkFsbG93ZWQoaXRlbXMpKTsKICAgICAgICBnZXRSZW1v dmVDb21tYW5kKCkuc2V0SXNFeGVjdXRpb25BbGxvd2VkKGl0ZW1zLnNpemUoKSA+IDAKICAgICAg ICAgICAgICAgICYmIFZkY0FjdGlvblV0aWxzLkNhbkV4ZWN1dGUoaXRlbXMsIFZNLmNsYXNzLCBW ZGNBY3Rpb25UeXBlLlJlbW92ZVZtKSk7CiAgICAgICAgZ2V0UnVuQ29tbWFuZCgpLnNldElzRXhl Y3V0aW9uQWxsb3dlZChpdGVtcy5zaXplKCkgPiAwCiAgICAgICAgICAgICAgICAmJiBWZGNBY3Rp b25VdGlscy5DYW5FeGVjdXRlKGl0ZW1zLCBWTS5jbGFzcywgVmRjQWN0aW9uVHlwZS5SdW5WbSkp OwogICAgICAgIGdldFBhdXNlQ29tbWFuZCgpLnNldElzRXhlY3V0aW9uQWxsb3dlZChpdGVtcy5z aXplKCkgPiAwCiAgICAgICAgICAgICAgICAmJiBWZGNBY3Rpb25VdGlscy5DYW5FeGVjdXRlKGl0 ZW1zLCBWTS5jbGFzcywgVmRjQWN0aW9uVHlwZS5IaWJlcm5hdGVWbSkpOwogICAgICAgIGdldFNo dXRkb3duQ29tbWFuZCgpLnNldElzRXhlY3V0aW9uQWxsb3dlZChpdGVtcy5zaXplKCkgPiAwCiAg ICAgICAgICAgICAgICAmJiBWZGNBY3Rpb25VdGlscy5DYW5FeGVjdXRlKGl0ZW1zLCBWTS5jbGFz cywgVmRjQWN0aW9uVHlwZS5TaHV0ZG93blZtKSk7CiAgICAgICAgZ2V0U3RvcENvbW1hbmQoKS5z ZXRJc0V4ZWN1dGlvbkFsbG93ZWQoaXRlbXMuc2l6ZSgpID4gMAogICAgICAgICAgICAgICAgJiYg VmRjQWN0aW9uVXRpbHMuQ2FuRXhlY3V0ZShpdGVtcywgVk0uY2xhc3MsIFZkY0FjdGlvblR5cGUu U3RvcFZtKSk7CiAgICAgICAgZ2V0TWlncmF0ZUNvbW1hbmQoKS5zZXRJc0V4ZWN1dGlvbkFsbG93 ZWQoaXRlbXMuc2l6ZSgpID4gMAogICAgICAgICAgICAgICAgJiYgVmRjQWN0aW9uVXRpbHMuQ2Fu RXhlY3V0ZShpdGVtcywgVk0uY2xhc3MsIFZkY0FjdGlvblR5cGUuTWlncmF0ZVZtKSk7CiAgICAg ICAgZ2V0Q2FuY2VsTWlncmF0ZUNvbW1hbmQoKS5zZXRJc0V4ZWN1dGlvbkFsbG93ZWQoaXRlbXMu c2l6ZSgpID4gMAogICAgICAgICAgICAgICAgJiYgVmRjQWN0aW9uVXRpbHMuQ2FuRXhlY3V0ZShp dGVtcywgVk0uY2xhc3MsIFZkY0FjdGlvblR5cGUuQ2FuY2VsTWlncmF0ZVZtKSk7CiAgICAgICAg Z2V0TmV3VGVtcGxhdGVDb21tYW5kKCkuc2V0SXNFeGVjdXRpb25BbGxvd2VkKGl0ZW1zLnNpemUo KSA9PSAxCiAgICAgICAgICAgICAgICAmJiBWZGNBY3Rpb25VdGlscy5DYW5FeGVjdXRlKGl0ZW1z LCBWTS5jbGFzcywgVmRjQWN0aW9uVHlwZS5BZGRWbVRlbXBsYXRlKSk7CiAgICAgICAgZ2V0UnVu T25jZUNvbW1hbmQoKS5zZXRJc0V4ZWN1dGlvbkFsbG93ZWQoaXRlbXMuc2l6ZSgpID09IDEKICAg ICAgICAgICAgICAgICYmIFZkY0FjdGlvblV0aWxzLkNhbkV4ZWN1dGUoaXRlbXMsIFZNLmNsYXNz LCBWZGNBY3Rpb25UeXBlLlJ1blZtT25jZSkpOwogICAgICAgIGdldEV4cG9ydENvbW1hbmQoKS5z ZXRJc0V4ZWN1dGlvbkFsbG93ZWQoaXRlbXMuc2l6ZSgpID4gMAogICAgICAgICAgICAgICAgJiYg VmRjQWN0aW9uVXRpbHMuQ2FuRXhlY3V0ZShpdGVtcywgVk0uY2xhc3MsIFZkY0FjdGlvblR5cGUu RXhwb3J0Vm0pKTsKICAgICAgICBnZXRNb3ZlQ29tbWFuZCgpLnNldElzRXhlY3V0aW9uQWxsb3dl ZChpdGVtcy5zaXplKCkgPT0gMQogICAgICAgICAgICAgICAgJiYgVmRjQWN0aW9uVXRpbHMuQ2Fu RXhlY3V0ZShpdGVtcywgVk0uY2xhc3MsIFZkY0FjdGlvblR5cGUuTW92ZVZtKSk7CiAgICAgICAg Z2V0UmV0cmlldmVJc29JbWFnZXNDb21tYW5kKCkuc2V0SXNFeGVjdXRpb25BbGxvd2VkKGl0ZW1z LnNpemUoKSA9PSAxCiAgICAgICAgICAgICAgICAmJiBWZGNBY3Rpb25VdGlscy5DYW5FeGVjdXRl KGl0ZW1zLCBWTS5jbGFzcywgVmRjQWN0aW9uVHlwZS5DaGFuZ2VEaXNrKSk7CiAgICAgICAgZ2V0 Q2hhbmdlQ2RDb21tYW5kKCkuc2V0SXNFeGVjdXRpb25BbGxvd2VkKGl0ZW1zLnNpemUoKSA9PSAx CiAgICAgICAgICAgICAgICAmJiBWZGNBY3Rpb25VdGlscy5DYW5FeGVjdXRlKGl0ZW1zLCBWTS5j bGFzcywgVmRjQWN0aW9uVHlwZS5DaGFuZ2VEaXNrKSk7CiAgICAgICAgZ2V0QXNzaWduVGFnc0Nv bW1hbmQoKS5zZXRJc0V4ZWN1dGlvbkFsbG93ZWQoaXRlbXMuc2l6ZSgpID4gMCk7CgogICAgICAg IGdldEd1aWRlQ29tbWFuZCgpLnNldElzRXhlY3V0aW9uQWxsb3dlZChnZXRHdWlkZUNvbnRleHQo KSAhPSBudWxsCiAgICAgICAgICAgICAgICB8fCAoZ2V0U2VsZWN0ZWRJdGVtKCkgIT0gbnVsbCAm JiBnZXRTZWxlY3RlZEl0ZW1zKCkgIT0gbnVsbCAmJiBnZXRTZWxlY3RlZEl0ZW1zKCkuc2l6ZSgp ID09IDEpKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybiB0cnVlIGlmIGFuZCBvbmx5IGlm IG9uZSBlbGVtZW50IGlzIHNlbGVjdGVkLgogICAgICovCiAgICBwcml2YXRlIGJvb2xlYW4gaXNF ZGl0Q29tbWFuZEV4ZWN1dGlvbkFsbG93ZWQoTGlzdCBpdGVtcykgewogICAgICAgIGlmIChpdGVt cyA9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAg aWYgKGl0ZW1zLnNpemUoKSAhPSAxKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAg ICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgQE92ZXJyaWRlCiAgICBwdWJsaWMg dm9pZCBldmVudFJhaXNlZChFdmVudCBldiwgT2JqZWN0IHNlbmRlciwgRXZlbnRBcmdzIGFyZ3Mp CiAgICB7CiAgICAgICAgc3VwZXIuZXZlbnRSYWlzZWQoZXYsIHNlbmRlciwgYXJncyk7CgogICAg ICAgIGlmIChldi5lcXVhbHMoQ2hhbmdlQ0RNb2RlbC5FeGVjdXRlZEV2ZW50RGVmaW5pdGlvbikp CiAgICAgICAgewogICAgICAgICAgICBjaGFuZ2VDRChzZW5kZXIsIGFyZ3MpOwogICAgICAgIH0K ICAgICAgICBlbHNlIGlmIChldi5lcXVhbHMoQ29uc29sZU1vZGVsLkVycm9yRXZlbnREZWZpbml0 aW9uKSAmJiBzZW5kZXIgaW5zdGFuY2VvZiBTcGljZUNvbnNvbGVNb2RlbCkKICAgICAgICB7CiAg ICAgICAgICAgIFNwaWNlQ29uc29sZU1vZGVsX0Vycm9yKHNlbmRlciwgKEVycm9yQ29kZUV2ZW50 QXJncykgYXJncyk7CiAgICAgICAgfQogICAgfQoKICAgIHByaXZhdGUgdm9pZCBTcGljZUNvbnNv bGVNb2RlbF9FcnJvcihPYmplY3Qgc2VuZGVyLCBFcnJvckNvZGVFdmVudEFyZ3MgZSkKICAgIHsK ICAgICAgICBSZXNvdXJjZU1hbmFnZXIgcm0gPQogICAgICAgICAgICAgICAgbmV3IFJlc291cmNl TWFuYWdlcigiVUlDb21tb24uUmVzb3VyY2VzLlJkcEVycm9ycy5SZHBFcnJvcnMiLCBBc3NlbWJs eS5HZXRFeGVjdXRpbmdBc3NlbWJseSgpKTsgLy8kTk9OLU5MUy0xJAoKICAgICAgICBDb25maXJt YXRpb25Nb2RlbCBtb2RlbCA9IG5ldyBDb25maXJtYXRpb25Nb2RlbCgpOwogICAgICAgIGlmIChn ZXRFcnJvcldpbmRvdygpID09IG51bGwpCiAgICAgICAgewogICAgICAgICAgICBzZXRFcnJvcldp bmRvdyhtb2RlbCk7CiAgICAgICAgfQogICAgICAgIG1vZGVsLnNldFRpdGxlKENvbnN0YW50c01h bmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRDb25zdGFudHMoKS5jb25zb2xlRGlzY29ubmVjdGVkVGl0 bGUoKSk7CiAgICAgICAgbW9kZWwuc2V0SGFzaE5hbWUoImNvbnNvbGVfZGlzY29ubmVjdGVkIik7 IC8vJE5PTi1OTFMtMSQKICAgICAgICBtb2RlbC5zZXRNZXNzYWdlKENvbnN0YW50c01hbmFnZXIu Z2V0SW5zdGFuY2UoKQogICAgICAgICAgICAgICAgLmdldE1lc3NhZ2VzKCkKICAgICAgICAgICAg ICAgIC5lcnJDb25uZWN0aW5nVm1Vc2luZ1NwaWNlTXNnKHJtLkdldFN0cmluZygiRSIgKyBlLmdl dEVycm9yQ29kZSgpKSkpOyAvLyROT04tTkxTLTEkCgogICAgICAgIHJtLlJlbGVhc2VBbGxSZXNv dXJjZXMoKTsKCiAgICAgICAgVUlDb21tYW5kIHRlbXBWYXIgPSBuZXcgVUlDb21tYW5kKCJDYW5j ZWxFcnJvciIsIHRoaXMpOyAvLyROT04tTkxTLTEkCiAgICAgICAgdGVtcFZhci5zZXRUaXRsZShD b25zdGFudHNNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0Q29uc3RhbnRzKCkuY2xvc2UoKSk7CiAg ICAgICAgdGVtcFZhci5zZXRJc0RlZmF1bHQodHJ1ZSk7CiAgICAgICAgdGVtcFZhci5zZXRJc0Nh bmNlbCh0cnVlKTsKICAgICAgICBtb2RlbC5nZXRDb21tYW5kcygpLmFkZCh0ZW1wVmFyKTsKICAg IH0KCiAgICBAT3ZlcnJpZGUKICAgIHB1YmxpYyB2b2lkIEV4ZWN1dGVDb21tYW5kKFVJQ29tbWFu ZCBjb21tYW5kKQogICAgewogICAgICAgIHN1cGVyLkV4ZWN1dGVDb21tYW5kKGNvbW1hbmQpOwoK ICAgICAgICBpZiAoY29tbWFuZCA9PSBnZXROZXdTZXJ2ZXJDb21tYW5kKCkpCiAgICAgICAgewog ICAgICAgICAgICBOZXdTZXJ2ZXIoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoY29tbWFu ZCA9PSBnZXROZXdEZXNrdG9wQ29tbWFuZCgpKQogICAgICAgIHsKICAgICAgICAgICAgTmV3RGVz a3RvcCgpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChjb21tYW5kID09IGdldEVkaXRDb21t YW5kKCkpCiAgICAgICAgewogICAgICAgICAgICBFZGl0KCk7CiAgICAgICAgfQogICAgICAgIGVs c2UgaWYgKGNvbW1hbmQgPT0gZ2V0UmVtb3ZlQ29tbWFuZCgpKQogICAgICAgIHsKICAgICAgICAg ICAgcmVtb3ZlKCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGNvbW1hbmQgPT0gZ2V0UnVu Q29tbWFuZCgpKQogICAgICAgIHsKICAgICAgICAgICAgUnVuKCk7CiAgICAgICAgfQogICAgICAg IGVsc2UgaWYgKGNvbW1hbmQgPT0gZ2V0UGF1c2VDb21tYW5kKCkpCiAgICAgICAgewogICAgICAg ICAgICBQYXVzZSgpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChjb21tYW5kID09IGdldFN0 b3BDb21tYW5kKCkpCiAgICAgICAgewogICAgICAgICAgICBzdG9wKCk7CiAgICAgICAgfQogICAg ICAgIGVsc2UgaWYgKGNvbW1hbmQgPT0gZ2V0U2h1dGRvd25Db21tYW5kKCkpCiAgICAgICAgewog ICAgICAgICAgICBTaHV0ZG93bigpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChjb21tYW5k ID09IGdldE1pZ3JhdGVDb21tYW5kKCkpCiAgICAgICAgewogICAgICAgICAgICBNaWdyYXRlKCk7 CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGNvbW1hbmQgPT0gZ2V0TmV3VGVtcGxhdGVDb21t YW5kKCkpCiAgICAgICAgewogICAgICAgICAgICBOZXdUZW1wbGF0ZSgpOwogICAgICAgIH0KICAg ICAgICBlbHNlIGlmIChjb21tYW5kID09IGdldFJ1bk9uY2VDb21tYW5kKCkpCiAgICAgICAgewog ICAgICAgICAgICBSdW5PbmNlKCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGNvbW1hbmQg PT0gZ2V0RXhwb3J0Q29tbWFuZCgpKQogICAgICAgIHsKICAgICAgICAgICAgRXhwb3J0KENvbnN0 YW50c01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRDb25zdGFudHMoKS5leHBvcnRWaXJ0dWFsTWFj aGluZVRpdGxlKCkpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChjb21tYW5kID09IGdldE1v dmVDb21tYW5kKCkpCiAgICAgICAgewogICAgICAgICAgICBNb3ZlKCk7CiAgICAgICAgfQogICAg ICAgIGVsc2UgaWYgKGNvbW1hbmQgPT0gZ2V0R3VpZGVDb21tYW5kKCkpCiAgICAgICAgewogICAg ICAgICAgICBHdWlkZSgpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChjb21tYW5kID09IGdl dFJldHJpZXZlSXNvSW1hZ2VzQ29tbWFuZCgpKQogICAgICAgIHsKICAgICAgICAgICAgUmV0cmll dmVJc29JbWFnZXMoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoY29tbWFuZCA9PSBnZXRD aGFuZ2VDZENvbW1hbmQoKSkKICAgICAgICB7CiAgICAgICAgICAgIENoYW5nZUNEKCk7CiAgICAg ICAgfQogICAgICAgIGVsc2UgaWYgKGNvbW1hbmQgPT0gZ2V0QXNzaWduVGFnc0NvbW1hbmQoKSkK ICAgICAgICB7CiAgICAgICAgICAgIEFzc2lnblRhZ3MoKTsKICAgICAgICB9CiAgICAgICAgZWxz ZSBpZiAoU3RyaW5nSGVscGVyLnN0cmluZ3NFcXVhbChjb21tYW5kLmdldE5hbWUoKSwgIk9uQXNz aWduVGFncyIpKSAvLyROT04tTkxTLTEkCiAgICAgICAgewogICAgICAgICAgICBPbkFzc2lnblRh Z3MoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoU3RyaW5nSGVscGVyLnN0cmluZ3NFcXVh bChjb21tYW5kLmdldE5hbWUoKSwgIkNhbmNlbCIpKSAvLyROT04tTkxTLTEkCiAgICAgICAgewog ICAgICAgICAgICBDYW5jZWwoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoU3RyaW5nSGVs cGVyLnN0cmluZ3NFcXVhbChjb21tYW5kLmdldE5hbWUoKSwgIk9uU2F2ZSIpKSAvLyROT04tTkxT LTEkCiAgICAgICAgewogICAgICAgICAgICBwcmVTYXZlKCk7CiAgICAgICAgfQogICAgICAgIGVs c2UgaWYgKFN0cmluZ0hlbHBlci5zdHJpbmdzRXF1YWwoY29tbWFuZC5nZXROYW1lKCksICJPblJl bW92ZSIpKSAvLyROT04tTkxTLTEkCiAgICAgICAgewogICAgICAgICAgICBPblJlbW92ZSgpOwog ICAgICAgIH0KICAgICAgICBlbHNlIGlmIChTdHJpbmdIZWxwZXIuc3RyaW5nc0VxdWFsKGNvbW1h bmQuZ2V0TmFtZSgpLCAiT25FeHBvcnQiKSkgLy8kTk9OLU5MUy0xJAogICAgICAgIHsKICAgICAg ICAgICAgT25FeHBvcnQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoU3RyaW5nSGVscGVy LnN0cmluZ3NFcXVhbChjb21tYW5kLmdldE5hbWUoKSwgIk9uRXhwb3J0Tm9UZW1wbGF0ZXMiKSkg Ly8kTk9OLU5MUy0xJAogICAgICAgIHsKICAgICAgICAgICAgT25FeHBvcnROb1RlbXBsYXRlcygp OwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChTdHJpbmdIZWxwZXIuc3RyaW5nc0VxdWFsKGNv bW1hbmQuZ2V0TmFtZSgpLCAiQ2FuY2VsQ29uZmlybWF0aW9uIikpIC8vJE5PTi1OTFMtMSQKICAg ICAgICB7CiAgICAgICAgICAgIENhbmNlbENvbmZpcm1hdGlvbigpOwogICAgICAgIH0KICAgICAg ICBlbHNlIGlmIChTdHJpbmdIZWxwZXIuc3RyaW5nc0VxdWFsKGNvbW1hbmQuZ2V0TmFtZSgpLCAi Q2FuY2VsRXJyb3IiKSkgLy8kTk9OLU5MUy0xJAogICAgICAgIHsKICAgICAgICAgICAgQ2FuY2Vs RXJyb3IoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoU3RyaW5nSGVscGVyLnN0cmluZ3NF cXVhbChjb21tYW5kLmdldE5hbWUoKSwgIk9uUnVuT25jZSIpKSAvLyROT04tTkxTLTEkCiAgICAg ICAgewogICAgICAgICAgICBPblJ1bk9uY2UoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAo U3RyaW5nSGVscGVyLnN0cmluZ3NFcXVhbChjb21tYW5kLmdldE5hbWUoKSwgIk9uTmV3VGVtcGxh dGUiKSkgLy8kTk9OLU5MUy0xJAogICAgICAgIHsKICAgICAgICAgICAgT25OZXdUZW1wbGF0ZSgp OwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChTdHJpbmdIZWxwZXIuc3RyaW5nc0VxdWFsKGNv bW1hbmQuZ2V0TmFtZSgpLCAiT25NaWdyYXRlIikpIC8vJE5PTi1OTFMtMSQKICAgICAgICB7CiAg ICAgICAgICAgIE9uTWlncmF0ZSgpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChjb21tYW5k ID09IGdldENhbmNlbE1pZ3JhdGVDb21tYW5kKCkpCiAgICAgICAgewogICAgICAgICAgICBDYW5j ZWxNaWdyYXRpb24oKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoU3RyaW5nSGVscGVyLnN0 cmluZ3NFcXVhbChjb21tYW5kLmdldE5hbWUoKSwgIk9uU2h1dGRvd24iKSkgLy8kTk9OLU5MUy0x JAogICAgICAgIHsKICAgICAgICAgICAgT25TaHV0ZG93bigpOwogICAgICAgIH0KICAgICAgICBl bHNlIGlmIChTdHJpbmdIZWxwZXIuc3RyaW5nc0VxdWFsKGNvbW1hbmQuZ2V0TmFtZSgpLCAiT25T dG9wIikpIC8vJE5PTi1OTFMtMSQKICAgICAgICB7CiAgICAgICAgICAgIE9uU3RvcCgpOwogICAg ICAgIH0KICAgICAgICBlbHNlIGlmIChTdHJpbmdIZWxwZXIuc3RyaW5nc0VxdWFsKGNvbW1hbmQu Z2V0TmFtZSgpLCAiT25DaGFuZ2VDRCIpKSAvLyROT04tTkxTLTEkCiAgICAgICAgewogICAgICAg ICAgICBPbkNoYW5nZUNEKCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGNvbW1hbmQuZ2V0 TmFtZSgpLmVxdWFscygiY2xvc2VWbmNJbmZvIikpIHsgLy8kTk9OLU5MUy0xJAogICAgICAgICAg ICBzZXRXaW5kb3cobnVsbCk7CiAgICAgICAgfQogICAgfQoKICAgIHByaXZhdGUgU3lzdGVtVHJl ZUl0ZW1Nb2RlbCBzeXN0ZW1UcmVlU2VsZWN0ZWRJdGVtOwoKICAgIEBPdmVycmlkZQogICAgcHVi bGljIFN5c3RlbVRyZWVJdGVtTW9kZWwgZ2V0U3lzdGVtVHJlZVNlbGVjdGVkSXRlbSgpCiAgICB7 CiAgICAgICAgcmV0dXJuIHN5c3RlbVRyZWVTZWxlY3RlZEl0ZW07CiAgICB9CgogICAgQE92ZXJy aWRlCiAgICBwdWJsaWMgdm9pZCBzZXRTeXN0ZW1UcmVlU2VsZWN0ZWRJdGVtKFN5c3RlbVRyZWVJ dGVtTW9kZWwgdmFsdWUpCiAgICB7CiAgICAgICAgc3lzdGVtVHJlZVNlbGVjdGVkSXRlbSA9IHZh bHVlOwogICAgICAgIE9uUHJvcGVydHlDaGFuZ2VkKG5ldyBQcm9wZXJ0eUNoYW5nZWRFdmVudEFy Z3MoIlN5c3RlbVRyZWVTZWxlY3RlZEl0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKICAgIH0KCiAgICBA T3ZlcnJpZGUKICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TGlzdE5hbWUoKSB7CiAgICAgICAgcmV0 dXJuICJWbUxpc3RNb2RlbCI7IC8vJE5PTi1OTFMtMSQKICAgIH0KCiAgICBAT3ZlcnJpZGUKICAg IHByb3RlY3RlZCBHdWlkIGV4dHJhY3RTdG9yYWdlUG9vbElkTnVsbFNhZmUoVk0gZW50aXR5KSB7 CiAgICAgICAgcmV0dXJuIGVudGl0eS5nZXRTdG9yYWdlUG9vbElkKCk7CiAgICB9Cn0K --_005_C5A0092C63E939488005F15F736A8112097A57B9SHSMSX101ccrcor_--