[Engine-devel] Got some troubles when I want to modify oVirt GUI

--_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_--

Hi, first of all, did you consider submitting this as RFE in oVirt bugzilla? Maybe it could be useful to have it in oVirt. (Implementing this via UI plugin would be far too complicated, as UI code is tightly coupled with UiCommon code in case of VM dialog.) Regarding UI code changes, the general idea is to implement business logic in UiCommon models (VmListModel, UnitVmModel, etc.) and have UI code bind to these models. It would be best if you just send a patch (diff) instead of specific files, it's really hard to see what changes you made, but based on the files you sent, here are my comments: * Changes in UnitVmModel look good, you basically added two new fields [privateRunVMOnSpecificHost, privateRunVMOnTrustedHost], hooked up their *_EntityChanged methods, and implemented logic for handling field value changes in these methods * Changes in VmListModel look good, you used newly added UnitVmModel fields in onSave [I assume setTrustedHostFlag/setDedicatedVmForVds are new fields for VM entity?], note - you might also want to update UpdateActionAvailability disable migrating VM when RunVMOnTrustedHost=true, etc. * AbstractVmPopupWidget already has specificHost radio button & drop-down on Host dialog tab, and I assume you want to reuse the drop-down (host list) for trustedHost, so just add new radio button there: AbstractVmPopupWidget.ui.xml line 331 <g:HorizontalPanel verticalAlignment='ALIGN_MIDDLE'> <g:RadioButton name="specificOrTrustedHostGroup" ui:field="specificHost" addStyleNames="{style.radioButtonSpecificHost}" /> <g:RadioButton name="specificOrTrustedHostGroup" ui:field="trustedHost" addStyleNames="{style.radioButtonSpecificHost}" /> <g:Label ui:field="specificHostLabel" text="{constants.specificVmPopup}" /> <e:ListModelListBoxEditor ui:field="defaultHostEditor" /> </g:HorizontalPanel> * In AbstractVmPopupWidget you to bind newly added RadioButton: @UiField(provided = true) @Ignore @WithElementId("trustedHost") public RadioButton trustedHost; You create trustedHost widget in constructor, and in initTabAvailabilityListeners you just add trustedHost.addValueChangeHandler(...) to have logic when trustedHost gets selected. Regards, Vojtech ----- Original Message ----- From: "Wei D Chen" <wei.d.chen@intel.com> To: engine-devel@ovirt.org Sent: Tuesday, March 12, 2013 9:48:34 AM Subject: [Engine-devel] Got some troubles when I want to modify oVirt GUI Hi, In order to add new feature to Ovirt, that is user can choose virtual machine whether on trusted machine or not when it runs up, we modified the relative files. Our goal is when the user click the trusted button, Run/Migration options are disabled. But unfortunately, we haven’t succeeded in graphic interface. I modified these files, I can’t see Host Tab, can you give me some help? Maybe we need modify more files. We did the following efforts: (1) add a trusted radio button. (2) Modify AbstractVmPopupWidget.ui.xml <g:HorizontalPanel verticalAlignment='ALIGN_MIDDLE'> <g:RadioButton ui:field="runVMOnTrustedHost"/> <e:EntityModelRadioButtonEditor width="150px" ui:field="runVMOnTrustedHostEditor" addStyleNames="{style.radioButton}" /> </g:HorizontalPanel> (3) Modify AbstractVmPopupWidget.java @UiField(provided = true) @Path(value = "runVMOnTrustedHost.entity") @WithElementId("runVMOnTrustedHost") public EntityModelRadioButtonEditor runVMOnTrustedHostEditor; initListeners method: object.getIsAutoAssign().getPropertyChangedEvent().addListener(new IEventListener() { @Override public void eventRaised(Event ev, Object sender, EventArgs args) { boolean isAutoAssign = (Boolean) object.getIsAutoAssign().getEntity(); boolean runVMOnTrustedHost = (Boolean) object.getRunVMOnTrustedHost().getEntity(); defaultHostEditor.setEnabled(!isAutoAssign && !runVMOnTrustedHost); //defaultHostEditor.setEnabled(!isAutoAssign); // only this is not bind to the model, so needs to listen to the change explicitly specificHost.setValue(!isAutoAssign && !runVMOnTrustedHost); //specificHost.setValue(!isAutoAssign); } }); isAutoAssignEditor.addDomHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { defaultHostEditor.setEnabled(false); } }, ClickEvent.getType()); vm.getIsAutoAssign().getEntityChangedEvent().addListener(new IEventListener() { @Override public void eventRaised(Event ev, Object sender, EventArgs args) { if (!isAutoAssignEditor.asRadioButton().getValue() && !runVMOnTrustedHostEditor.asRadioButton().getValue()) { specificHost.setValue(true, true); } } }); runVMOnTrustedHostEditor.addDomHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { defaultHostEditor.setEnabled(false); } }, ClickEvent.getType()); vm.getRunVMOnTrustedHost().getEntityChangedEvent().addListener(new IEventListener() { @Override public void eventRaised(Event ev, Object sender, EventArgs args) { if (!runVMOnTrustedHostEditor.asRadioButton().getValue() && !isAutoAssignEditor.asRadioButton().getValue()) { specificHost.setValue(true, true); } } }); (4) Modify UnitVmModel.java private void RunVMOnTrustedHost_EntityChanged(Object sender, EventArgs args) { if ((Boolean) getRunVMOnTrustedHost().getEntity() == true) { clearAndDisable(getRunVMOnSpecificHost()); clearAndDisable(getHostCpu()); } else { getRunVMOnSpecificHost().setIsChangable(true); } behavior.updateCpuPinningVisibility(); } _______________________________________________ Engine-devel mailing list Engine-devel@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-devel

On 03/12/2013 12:57 PM, Vojtech Szocs wrote:
Hi,
first of all, did you consider submitting this as RFE in oVirt bugzilla? Maybe it could be useful to have it in oVirt. (Implementing this via UI plugin would be far too complicated, as UI code is tightly coupled with UiCommon code in case of VM dialog.)>
my understanding this is a full blown feature, not a plugin. Wei D - please note UI is to help the user to not make mistakes, but validations must also happen at engine side to cover rest api, etc.
Regarding UI code changes, the general idea is to implement business logic in UiCommon models (VmListModel, UnitVmModel, etc.) and have UI code bind to these models. It would be best if you just send a patch (diff) instead of specific files, it's really hard to see what changes you made, but based on the files you sent, here are my comments:
* Changes in UnitVmModel look good, you basically added two new fields [privateRunVMOnSpecificHost, privateRunVMOnTrustedHost], hooked up their *_EntityChanged methods, and implemented logic for handling field value changes in these methods
* Changes in VmListModel look good, you used newly added UnitVmModel fields in onSave [I assume setTrustedHostFlag/setDedicatedVmForVds are new fields for VM entity?], note - you might also want to update UpdateActionAvailability disable migrating VM when RunVMOnTrustedHost=true, etc.
* AbstractVmPopupWidget already has specificHost radio button & drop-down on Host dialog tab, and I assume you want to reuse the drop-down (host list) for trustedHost, so just add new radio button there:
AbstractVmPopupWidget.ui.xml line 331
<g:HorizontalPanel verticalAlignment='ALIGN_MIDDLE'> <g:RadioButton name="specificOrTrustedHostGroup" ui:field="specificHost" addStyleNames="{style.radioButtonSpecificHost}" /> <g:RadioButton name="specificOrTrustedHostGroup" ui:field="trustedHost" addStyleNames="{style.radioButtonSpecificHost}" /> <g:Label ui:field="specificHostLabel" text="{constants.specificVmPopup}" /> <e:ListModelListBoxEditor ui:field="defaultHostEditor" /> </g:HorizontalPanel>
* In AbstractVmPopupWidget you to bind newly added RadioButton:
@UiField(provided = true) @Ignore @WithElementId("trustedHost") public RadioButton trustedHost;
You create trustedHost widget in constructor, and in initTabAvailabilityListeners you just add trustedHost.addValueChangeHandler(...) to have logic when trustedHost gets selected.
Regards, Vojtech
----- Original Message ----- From: "Wei D Chen" <wei.d.chen@intel.com> To: engine-devel@ovirt.org Sent: Tuesday, March 12, 2013 9:48:34 AM Subject: [Engine-devel] Got some troubles when I want to modify oVirt GUI
Hi, In order to add new feature to Ovirt, that is user can choose virtual machine whether on trusted machine or not when it runs up, we modified the relative files. Our goal is when the user click the trusted button, Run/Migration options are disabled. But unfortunately, we haven’t succeeded in graphic interface. I modified these files, I can’t see Host Tab, can you give me some help? Maybe we need modify more files. We did the following efforts: (1) add a trusted radio button. (2) Modify AbstractVmPopupWidget.ui.xml <g:HorizontalPanel verticalAlignment='ALIGN_MIDDLE'> <g:RadioButton ui:field="runVMOnTrustedHost"/> <e:EntityModelRadioButtonEditor width="150px" ui:field="runVMOnTrustedHostEditor" addStyleNames="{style.radioButton}" /> </g:HorizontalPanel> (3) Modify AbstractVmPopupWidget.java @UiField(provided = true) @Path(value = "runVMOnTrustedHost.entity") @WithElementId("runVMOnTrustedHost") public EntityModelRadioButtonEditor runVMOnTrustedHostEditor;
initListeners method: object.getIsAutoAssign().getPropertyChangedEvent().addListener(new IEventListener() { @Override public void eventRaised(Event ev, Object sender, EventArgs args) { boolean isAutoAssign = (Boolean) object.getIsAutoAssign().getEntity(); boolean runVMOnTrustedHost = (Boolean) object.getRunVMOnTrustedHost().getEntity(); defaultHostEditor.setEnabled(!isAutoAssign && !runVMOnTrustedHost); //defaultHostEditor.setEnabled(!isAutoAssign); // only this is not bind to the model, so needs to listen to the change explicitly specificHost.setValue(!isAutoAssign && !runVMOnTrustedHost); //specificHost.setValue(!isAutoAssign); } }); isAutoAssignEditor.addDomHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { defaultHostEditor.setEnabled(false); } }, ClickEvent.getType()); vm.getIsAutoAssign().getEntityChangedEvent().addListener(new IEventListener() { @Override public void eventRaised(Event ev, Object sender, EventArgs args) { if (!isAutoAssignEditor.asRadioButton().getValue() && !runVMOnTrustedHostEditor.asRadioButton().getValue()) { specificHost.setValue(true, true); } } }); runVMOnTrustedHostEditor.addDomHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { defaultHostEditor.setEnabled(false); } }, ClickEvent.getType()); vm.getRunVMOnTrustedHost().getEntityChangedEvent().addListener(new IEventListener() { @Override public void eventRaised(Event ev, Object sender, EventArgs args) { if (!runVMOnTrustedHostEditor.asRadioButton().getValue() && !isAutoAssignEditor.asRadioButton().getValue()) { specificHost.setValue(true, true); } } }); (4) Modify UnitVmModel.java private void RunVMOnTrustedHost_EntityChanged(Object sender, EventArgs args) { if ((Boolean) getRunVMOnTrustedHost().getEntity() == true) { clearAndDisable(getRunVMOnSpecificHost()); clearAndDisable(getHostCpu()); } else { getRunVMOnSpecificHost().setIsChangable(true); } behavior.updateCpuPinningVisibility(); }
_______________________________________________ Engine-devel mailing list Engine-devel@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-devel _______________________________________________ Engine-devel mailing list Engine-devel@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-devel

----- Original Message -----
From: "Itamar Heim" <iheim@redhat.com> To: "Vojtech Szocs" <vszocs@redhat.com> Cc: engine-devel@ovirt.org Sent: Tuesday, March 12, 2013 3:30:57 PM Subject: Re: [Engine-devel] Got some troubles when I want to modify oVirt GUI
On 03/12/2013 12:57 PM, Vojtech Szocs wrote:
Hi,
first of all, did you consider submitting this as RFE in oVirt bugzilla? Maybe it could be useful to have it in oVirt. (Implementing this via UI plugin would be far too complicated, as UI code is tightly coupled with UiCommon code in case of VM dialog.)>
my understanding this is a full blown feature, not a plugin.
Wei D - please note UI is to help the user to not make mistakes, but validations must also happen at engine side to cover rest api, etc.
+1. Also, a detailed wiki page may help both developer and readers to get a better understanding of how it should look and work. For example, how do you plan to implement the REST API changes? Wei D, I know that Gang Wei started: http://www.ovirt.org/Trusted_compute_pools But as you can see, it does not mention your original intention to implement the UI as a plugin, while as you can see it would be better to have it as an internal UI addition. Also, as mentioned REST parts are missing and a more detailed design for the engine is missing here. Wei D, is there a reason why not top have a detailed page similar to: http://www.ovirt.org/Features/Watchdog_engine_support ?
Regarding UI code changes, the general idea is to implement business logic in UiCommon models (VmListModel, UnitVmModel, etc.) and have UI code bind to these models. It would be best if you just send a patch (diff) instead of specific files, it's really hard to see what changes you made, but based on the files you sent, here are my comments:
* Changes in UnitVmModel look good, you basically added two new fields [privateRunVMOnSpecificHost, privateRunVMOnTrustedHost], hooked up their *_EntityChanged methods, and implemented logic for handling field value changes in these methods
* Changes in VmListModel look good, you used newly added UnitVmModel fields in onSave [I assume setTrustedHostFlag/setDedicatedVmForVds are new fields for VM entity?], note - you might also want to update UpdateActionAvailability disable migrating VM when RunVMOnTrustedHost=true, etc.
* AbstractVmPopupWidget already has specificHost radio button & drop-down on Host dialog tab, and I assume you want to reuse the drop-down (host list) for trustedHost, so just add new radio button there:
AbstractVmPopupWidget.ui.xml line 331
<g:HorizontalPanel verticalAlignment='ALIGN_MIDDLE'> <g:RadioButton name="specificOrTrustedHostGroup" ui:field="specificHost" addStyleNames="{style.radioButtonSpecificHost}" /> <g:RadioButton name="specificOrTrustedHostGroup" ui:field="trustedHost" addStyleNames="{style.radioButtonSpecificHost}" /> <g:Label ui:field="specificHostLabel" text="{constants.specificVmPopup}" /> <e:ListModelListBoxEditor ui:field="defaultHostEditor" /> </g:HorizontalPanel>
* In AbstractVmPopupWidget you to bind newly added RadioButton:
@UiField(provided = true) @Ignore @WithElementId("trustedHost") public RadioButton trustedHost;
You create trustedHost widget in constructor, and in initTabAvailabilityListeners you just add trustedHost.addValueChangeHandler(...) to have logic when trustedHost gets selected.
Regards, Vojtech
----- Original Message ----- From: "Wei D Chen" <wei.d.chen@intel.com> To: engine-devel@ovirt.org Sent: Tuesday, March 12, 2013 9:48:34 AM Subject: [Engine-devel] Got some troubles when I want to modify oVirt GUI
Hi, In order to add new feature to Ovirt, that is user can choose virtual machine whether on trusted machine or not when it runs up, we modified the relative files. Our goal is when the user click the trusted button, Run/Migration options are disabled. But unfortunately, we haven’t succeeded in graphic interface. I modified these files, I can’t see Host Tab, can you give me some help? Maybe we need modify more files. We did the following efforts: (1) add a trusted radio button. (2) Modify AbstractVmPopupWidget.ui.xml <g:HorizontalPanel verticalAlignment='ALIGN_MIDDLE'> <g:RadioButton ui:field="runVMOnTrustedHost"/> <e:EntityModelRadioButtonEditor width="150px" ui:field="runVMOnTrustedHostEditor" addStyleNames="{style.radioButton}" /> </g:HorizontalPanel> (3) Modify AbstractVmPopupWidget.java @UiField(provided = true) @Path(value = "runVMOnTrustedHost.entity") @WithElementId("runVMOnTrustedHost") public EntityModelRadioButtonEditor runVMOnTrustedHostEditor;
initListeners method: object.getIsAutoAssign().getPropertyChangedEvent().addListener(new IEventListener() { @Override public void eventRaised(Event ev, Object sender, EventArgs args) { boolean isAutoAssign = (Boolean) object.getIsAutoAssign().getEntity(); boolean runVMOnTrustedHost = (Boolean) object.getRunVMOnTrustedHost().getEntity(); defaultHostEditor.setEnabled(!isAutoAssign && !runVMOnTrustedHost); //defaultHostEditor.setEnabled(!isAutoAssign); // only this is not bind to the model, so needs to listen to the change explicitly specificHost.setValue(!isAutoAssign && !runVMOnTrustedHost); //specificHost.setValue(!isAutoAssign); } }); isAutoAssignEditor.addDomHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { defaultHostEditor.setEnabled(false); } }, ClickEvent.getType()); vm.getIsAutoAssign().getEntityChangedEvent().addListener(new IEventListener() { @Override public void eventRaised(Event ev, Object sender, EventArgs args) { if (!isAutoAssignEditor.asRadioButton().getValue() && !runVMOnTrustedHostEditor.asRadioButton().getValue()) { specificHost.setValue(true, true); } } }); runVMOnTrustedHostEditor.addDomHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { defaultHostEditor.setEnabled(false); } }, ClickEvent.getType()); vm.getRunVMOnTrustedHost().getEntityChangedEvent().addListener(new IEventListener() { @Override public void eventRaised(Event ev, Object sender, EventArgs args) { if (!runVMOnTrustedHostEditor.asRadioButton().getValue() && !isAutoAssignEditor.asRadioButton().getValue()) { specificHost.setValue(true, true); } } }); (4) Modify UnitVmModel.java private void RunVMOnTrustedHost_EntityChanged(Object sender, EventArgs args) { if ((Boolean) getRunVMOnTrustedHost().getEntity() == true) { clearAndDisable(getRunVMOnSpecificHost()); clearAndDisable(getHostCpu()); } else { getRunVMOnSpecificHost().setIsChangable(true); } behavior.updateCpuPinningVisibility(); }
_______________________________________________ Engine-devel mailing list Engine-devel@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-devel _______________________________________________ Engine-devel mailing list Engine-devel@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-devel
_______________________________________________ Engine-devel mailing list Engine-devel@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-devel

Thanks Doron & Vojetch & Itamar, we will update our design wiki page ASAP, and also, REST API is in pipeline. Best Regards, Dave Chen
-----Original Message----- From: Doron Fediuck [mailto:dfediuck@redhat.com] Sent: Tuesday, March 12, 2013 10:13 PM To: Chen, Wei D Cc: engine-devel@ovirt.org; Vojtech Szocs; Itamar Heim Subject: Re: [Engine-devel] Got some troubles when I want to modify oVirt GUI
----- Original Message -----
From: "Itamar Heim" <iheim@redhat.com> To: "Vojtech Szocs" <vszocs@redhat.com> Cc: engine-devel@ovirt.org Sent: Tuesday, March 12, 2013 3:30:57 PM Subject: Re: [Engine-devel] Got some troubles when I want to modify oVirt GUI
On 03/12/2013 12:57 PM, Vojtech Szocs wrote:
Hi,
first of all, did you consider submitting this as RFE in oVirt bugzilla? Maybe it could be useful to have it in oVirt. (Implementing this via UI plugin would be far too complicated, as UI code is tightly coupled with UiCommon code in case of VM dialog.)>
my understanding this is a full blown feature, not a plugin.
Wei D - please note UI is to help the user to not make mistakes, but validations must also happen at engine side to cover rest api, etc.
+1. Also, a detailed wiki page may help both developer and readers to get a better understanding of how it should look and work. For example, how do you plan to implement the REST API changes?
Wei D, I know that Gang Wei started: http://www.ovirt.org/Trusted_compute_pools But as you can see, it does not mention your original intention to implement the UI as a plugin, while as you can see it would be better to have it as an internal UI addition. Also, as mentioned REST parts are missing and a more detailed design for the engine is missing here.
Wei D, is there a reason why not top have a detailed page similar to: http://www.ovirt.org/Features/Watchdog_engine_support ?
Regarding UI code changes, the general idea is to implement business logic in UiCommon models (VmListModel, UnitVmModel, etc.) and have UI code bind to these models. It would be best if you just send a patch (diff) instead of specific files, it's really hard to see what changes you made, but based on the files you sent, here are my comments:
* Changes in UnitVmModel look good, you basically added two new fields [privateRunVMOnSpecificHost, privateRunVMOnTrustedHost], hooked up their *_EntityChanged methods, and implemented logic for handling field value changes in these methods
* Changes in VmListModel look good, you used newly added UnitVmModel fields in onSave [I assume setTrustedHostFlag/setDedicatedVmForVds are new fields for VM entity?], note - you might also want to update UpdateActionAvailability disable migrating VM when RunVMOnTrustedHost=true, etc.
* AbstractVmPopupWidget already has specificHost radio button & drop-down on Host dialog tab, and I assume you want to reuse the drop-down (host list) for trustedHost, so just add new radio button there:
AbstractVmPopupWidget.ui.xml line 331
<g:HorizontalPanel verticalAlignment='ALIGN_MIDDLE'> <g:RadioButton name="specificOrTrustedHostGroup" ui:field="specificHost" addStyleNames="{style.radioButtonSpecificHost}" /> <g:RadioButton name="specificOrTrustedHostGroup" ui:field="trustedHost" addStyleNames="{style.radioButtonSpecificHost}" /> <g:Label ui:field="specificHostLabel" text="{constants.specificVmPopup}" /> <e:ListModelListBoxEditor ui:field="defaultHostEditor" /> </g:HorizontalPanel>
* In AbstractVmPopupWidget you to bind newly added RadioButton:
@UiField(provided = true) @Ignore @WithElementId("trustedHost") public RadioButton trustedHost;
You create trustedHost widget in constructor, and in initTabAvailabilityListeners you just add trustedHost.addValueChangeHandler(...) to have logic when trustedHost gets selected.
Regards, Vojtech
----- Original Message ----- From: "Wei D Chen" <wei.d.chen@intel.com> To: engine-devel@ovirt.org Sent: Tuesday, March 12, 2013 9:48:34 AM Subject: [Engine-devel] Got some troubles when I want to modify oVirt GUI
Hi, In order to add new feature to Ovirt, that is user can choose virtual machine whether on trusted machine or not when it runs up, we modified the relative files. Our goal is when the user click the trusted button, Run/Migration options are disabled. But unfortunately, we haven’t succeeded in graphic interface. I modified these files, I can’t see Host Tab, can you give me some help? Maybe we need modify more files. We did the following efforts: (1) add a trusted radio button. (2) Modify AbstractVmPopupWidget.ui.xml <g:HorizontalPanel verticalAlignment='ALIGN_MIDDLE'> <g:RadioButton ui:field="runVMOnTrustedHost"/> <e:EntityModelRadioButtonEditor width="150px" ui:field="runVMOnTrustedHostEditor" addStyleNames="{style.radioButton}" /> </g:HorizontalPanel> (3) Modify AbstractVmPopupWidget.java @UiField(provided = true) @Path(value = "runVMOnTrustedHost.entity") @WithElementId("runVMOnTrustedHost") public EntityModelRadioButtonEditor runVMOnTrustedHostEditor;
initListeners method: object.getIsAutoAssign().getPropertyChangedEvent().addListener(new IEventListener() { @Override public void eventRaised(Event ev, Object sender, EventArgs args) { boolean isAutoAssign = (Boolean) object.getIsAutoAssign().getEntity(); boolean runVMOnTrustedHost = (Boolean) object.getRunVMOnTrustedHost().getEntity(); defaultHostEditor.setEnabled(!isAutoAssign && !runVMOnTrustedHost); //defaultHostEditor.setEnabled(!isAutoAssign); // only this is not bind to the model, so needs to listen to the change explicitly specificHost.setValue(!isAutoAssign && !runVMOnTrustedHost); //specificHost.setValue(!isAutoAssign); } }); isAutoAssignEditor.addDomHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { defaultHostEditor.setEnabled(false); } }, ClickEvent.getType());
vm.getIsAutoAssign().getEntityChangedEvent().addListener(new
IEventListener() { @Override public void eventRaised(Event ev, Object sender, EventArgs args) { if (!isAutoAssignEditor.asRadioButton().getValue() && !runVMOnTrustedHostEditor.asRadioButton().getValu
e())
{ specificHost.setValue(true, true); } } }); runVMOnTrustedHostEditor.addDomHandler(new
ClickHandler()
{ @Override public void onClick(ClickEvent event) { defaultHostEditor.setEnabled(false); } }, ClickEvent.getType());
vm.getRunVMOnTrustedHost().getEntityChangedEvent().addListener(new
IEventListener() { @Override public void eventRaised(Event ev, Object sender, EventArgs args) { if
(!runVMOnTrustedHostEditor.asRadioButton().getValue()
&& !isAutoAssignEditor.asRadioButton().getValue()) { specificHost.setValue(true, true); } } }); (4) Modify UnitVmModel.java private void RunVMOnTrustedHost_EntityChanged(Object sender, EventArgs args) { if ((Boolean) getRunVMOnTrustedHost().getEntity() == true) { clearAndDisable(getRunVMOnSpecificHost()); clearAndDisable(getHostCpu()); } else { getRunVMOnSpecificHost().setIsChangable(true); } behavior.updateCpuPinningVisibility(); }
_______________________________________________ Engine-devel mailing list Engine-devel@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-devel _______________________________________________ Engine-devel mailing list Engine-devel@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-devel
_______________________________________________ Engine-devel mailing list Engine-devel@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-devel
participants (4)
-
Chen, Wei D
-
Doron Fediuck
-
Itamar Heim
-
Vojtech Szocs