ZGlmZiAtLWdpdCBhL2phdmEvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2phdmEvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBjMDViMzE4Li40OTg1NWUzIDEwMDY0NAotLS0gYS9qYXZhL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvamF2YS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yMyw4ICsyMywxMSBAQAogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uVklCUkFURSIgLz4KICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19ORVRXT1JLX1NUQVRFIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9VU0VSX0RJQ1RJT05BUlkiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9VU0VSX0RJQ1RJT05BUlkiIC8+CiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX0NPTlRBQ1RTIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVDRUlWRV9CT09UX0NPTVBMRVRFRCIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5ET1dOTE9BRF9XSVRIT1VUX05PVElGSUNBVElPTiIgLz4KIAogICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2Fvc3BfYW5kcm9pZF9rZXlib2FyZF9pbWVfbmFtZSIKICAgICAgICAgICAgIGFuZHJvaWQ6aWNvbj0iQG1pcG1hcC9pY19pbWVfc2V0dGluZ3MiCkBAIC05MSw1ICs5NCw0NCBAQAogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRleHQuc3R5bGUuU1VHR0VTVElPTl9QSUNLRUQiIC8+CiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvcmVjZWl2ZXI+CisKKyAgICAgICAgPHByb3ZpZGVyIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuZGljdGlvbmFyeXBhY2suRGljdGlvbmFyeVByb3ZpZGVyIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmFudFVyaVBlcm1pc3Npb25zPSJ0cnVlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0iZmFsc2UiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmF1dGhvcml0aWVzPSJAc3RyaW5nL2F1dGhvcml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bXVsdGlwcm9jZXNzPSJmYWxzZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvZGljdGlvbmFyeV9wcm92aWRlcl9uYW1lIj4KKyAgICAgICAgPC9wcm92aWRlcj4KKworICAgICAgICA8c2VydmljZSBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmRpY3Rpb25hcnlwYWNrLkRpY3Rpb25hcnlTZXJ2aWNlIgorICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2RpY3Rpb25hcnlfc2VydmljZV9uYW1lIj4KKyAgICAgICAgPC9zZXJ2aWNlPgorCisgICAgICAgIDxyZWNlaXZlciBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmRpY3Rpb25hcnlwYWNrLkV2ZW50SGFuZGxlciI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkRPV05MT0FEX0NPTVBMRVRFIiAvPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uREFURV9DSEFOR0VEIiAvPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi5kaWN0aW9uYXJ5cGFjay5VUERBVEVfTk9XIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L3JlY2VpdmVyPgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmRpY3Rpb25hcnlwYWNrLkRpY3Rpb25hcnlTZXR0aW5nc0FjdGl2aXR5IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9kaWN0aW9uYXJ5X3NldHRpbmdzX3RpdGxlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDppY29uPSJAbWlwbWFwL2ljX2ltZV9zZXR0aW5ncyIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLkhvbG8iCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnVpT3B0aW9ucz0ic3BsaXRBY3Rpb25CYXJXaGVuTmFycm93Ij4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmRpY3Rpb25hcnlwYWNrLkRvd25sb2FkT3Zlck1ldGVyZWREaWFsb2ciCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2RpY3Rpb25hcnlfaW5zdGFsbF9vdmVyX21ldGVyZWRfbmV0d29ya19wcm9tcHQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmljb249IkBtaXBtYXAvaWNfaW1lX3NldHRpbmdzIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuSG9sbyI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KICAgICA8L2FwcGxpY2F0aW9uPgogPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbm90aWZ5X2RpY3Rpb25hcnkucG5nIGIvamF2YS9yZXMvZHJhd2FibGUtaGRwaS9pY19ub3RpZnlfZGljdGlvbmFyeS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVmZTRmNgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbm90aWZ5X2RpY3Rpb25hcnkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2phdmEvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbm90aWZ5X2RpY3Rpb25hcnkucG5nIGIvamF2YS9yZXMvZHJhd2FibGUtbWRwaS9pY19ub3RpZnlfZGljdGlvbmFyeS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM4NzAxZgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbm90aWZ5X2RpY3Rpb25hcnkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2phdmEvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX25vdGlmeV9kaWN0aW9uYXJ5LnBuZyBiL2phdmEvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX25vdGlmeV9kaWN0aW9uYXJ5LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGY0OWRlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9yZXMvZHJhd2FibGUteGhkcGkvaWNfbm90aWZ5X2RpY3Rpb25hcnkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2phdmEvcmVzL2xheW91dC9kaWN0aW9uYXJ5X2xpbmUueG1sIGIvamF2YS9yZXMvbGF5b3V0L2RpY3Rpb25hcnlfbGluZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThkMTVhYgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL2xheW91dC9kaWN0aW9uYXJ5X2xpbmUueG1sCkBAIC0wLDAgKzEsODQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKioKKyoqIENvcHlyaWdodCAyMDEyLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+Cis8IS0tIFRPRE86IFJlbW92ZSBwYWRkaW5nUmlnaHQsIGxheW91dF9tYXJnaW5MZWZ0LCBsYXlvdXRfbWFyZ2luUmlnaHQgZm9yIEFQSSB2ZXJzaW9uIDE3KyAtLT4KKzxMaW5lYXJMYXlvdXQKKyAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDptaW5IZWlnaHQ9Ij9hbmRyb2lkOmF0dHIvbGlzdFByZWZlcnJlZEl0ZW1IZWlnaHQiCisgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9Ij9hbmRyb2lkOmF0dHIvc2Nyb2xsYmFyU2l6ZSIKKyAgICBhbmRyb2lkOnBhZGRpbmdFbmQ9Ij9hbmRyb2lkOmF0dHIvc2Nyb2xsYmFyU2l6ZSIKKyAgICBhbmRyb2lkOmJhY2tncm91bmQ9Ij9hbmRyb2lkOmF0dHIvc2VsZWN0YWJsZUl0ZW1CYWNrZ3JvdW5kIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTVkaXAiCisgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luU3RhcnQ9IjE1ZGlwIgorICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI2ZGlwIgorICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkVuZD0iNmRpcCIKKyAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjZkaXAiCisgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI2ZGlwIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSI+CisKKyAgPExpbmVhckxheW91dAorICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkArYW5kcm9pZDppZC90aXRsZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNWRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luU3RhcnQ9IjVkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJtYXJxdWVlIgorICAgICAgICBhbmRyb2lkOmZhZGluZ0VkZ2U9Imhvcml6b250YWwiIC8+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCthbmRyb2lkOmlkL3N1bW1hcnkiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjVkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblN0YXJ0PSI1ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsIgorICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iP2FuZHJvaWQ6YXR0ci90ZXh0Q29sb3JTZWNvbmRhcnkiCisgICAgICAgIGFuZHJvaWQ6bWF4TGluZXM9IjEiIC8+CisKKyAgICA8IS0tIDxQcm9ncmVzc0JhciAtLT4KKyAgICA8IS0tICAgICBhbmRyb2lkOmlkPSJAK2lkL2RpY3Rpb25hcnlfbGluZV9wcm9ncmVzc19iYXIiIC0tPgorICAgIDwhLS0gICAgIHN0eWxlPSJAYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5Qcm9ncmVzc0Jhci5Ib3Jpem9udGFsIiAtLT4KKyAgICA8IS0tICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiAtLT4KKyAgICA8IS0tICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIgLS0+CisgICAgPCEtLSAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiIC8+IC0tPgorCisgIDwvTGluZWFyTGF5b3V0PgorCisgIDxCdXR0b24KKyAgICAgIGFuZHJvaWQ6aWQ9IkArYW5kcm9pZDppZC93b3JkbGlzdF9idXR0b24iCisgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiCisgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodHxjZW50ZXJfdmVydGljYWwiCisgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2luc3RhbGxfZGljdCIgLz4KKworPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy9sYXlvdXQvZG93bmxvYWRfb3Zlcl9tZXRlcmVkLnhtbCBiL2phdmEvcmVzL2xheW91dC9kb3dubG9hZF9vdmVyX21ldGVyZWQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZGU1ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3Jlcy9sYXlvdXQvZG93bmxvYWRfb3Zlcl9tZXRlcmVkLnhtbApAQCAtMCwwICsxLDc4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxMiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8TGluZWFyTGF5b3V0CisgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpkaXZpZGVyPSI/YW5kcm9pZDphdHRyL2RpdmlkZXJIb3Jpem9udGFsIgorICAgIGFuZHJvaWQ6c2hvd0RpdmlkZXJzPSJtaWRkbGUiCisgICAgYW5kcm9pZDpkaXZpZGVyUGFkZGluZz0iMGRpcCIgPgorCisgICAgPCEtLSBUaGUgbGlzdCBvZiBwYWNrYWdlcyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIHJlcXVlc3RpbmcgVUlECisgICAgYW5kIHRoZSBhY2NvdW50L2F1dGh0b2tlblR5cGUgdGhhdCBpcyBiZWluZyByZXF1ZXN0ZWQgLS0+CisgICAgPFNjcm9sbFZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZHAiCisgICAgICAgIGFuZHJvaWQ6ZmlsbFZpZXdwb3J0PSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0idG9wfGNlbnRlcl9ob3Jpem9udGFsIj4KKworICAgICAgPFRleHRWaWV3CisgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQiCisgICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjE0ZGlwIgorICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjE2ZGlwIgorICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjE2ZGlwIgorICAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSIxMmRpcCIgLz4KKworICAgIDwvU2Nyb2xsVmlldz4KKworICAgIDwhLS0gVGhlIGJ1dHRvbnMgdG8gdHJpZ2dlciBkb3dubG9hZCBvciB3YWl0IC0tPgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9idXR0b25zIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYnV0dG9uQmFyU3R5bGUiPgorCisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZGVueV9idXR0b24iCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvZG9fbm90X2Rvd25sb2FkX292ZXJfbWV0ZXJlZCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjIiCisgICAgICAgICAgICBhbmRyb2lkOm9uQ2xpY2s9Im9uQ2xpY2tEZW55IgorICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYnV0dG9uQmFyQnV0dG9uU3R5bGUiIC8+CisKKyAgICAgICAgPCEtLSBUaGUgdGV4dCBvZiB0aGlzIGJ1dHRvbiBjb250YWlucyB0aGUgc2l6ZSBvZiB0aGUgZGljdGlvbmFyeSBzbyBpdCB3aWxsIGJlIGZpbGxlZCBwcm9ncmFtbWF0aWNhbGx5IC0tPgorICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FsbG93X2J1dHRvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjIiCisgICAgICAgICAgICBhbmRyb2lkOm9uQ2xpY2s9Im9uQ2xpY2tBbGxvdyIKKyAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL2J1dHRvbkJhckJ1dHRvblN0eWxlIiAvPgorCisgICAgPC9MaW5lYXJMYXlvdXQ+Cis8L0xpbmVhckxheW91dD4KKwpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvbGF5b3V0L2xvYWRpbmdfcGFnZS54bWwgYi9qYXZhL3Jlcy9sYXlvdXQvbG9hZGluZ19wYWdlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTgxNmNkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9yZXMvbGF5b3V0L2xvYWRpbmdfcGFnZS54bWwKQEAgLTAsMCArMSwzOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPFJlbGF0aXZlTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2xvYWRpbmdfY29udGFpbmVyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiA+CisgIDxQcm9ncmVzc0JhciBhbmRyb2lkOmlkPSJAK2lkL2xvYWRpbmdfcHJvZ3Jlc3NfYmFyIgorICAgICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvcHJvZ3Jlc3NCYXJTdHlsZUxhcmdlIgorICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVySW5QYXJlbnQ9InRydWUiIC8+CisgIDxUZXh0VmlldyBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL2xvYWRpbmdfcHJvZ3Jlc3NfYmFyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVySG9yaXpvbnRhbD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9tZXNzYWdlX2xvYWRpbmciCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjRkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiIC8+Cis8L1JlbGF0aXZlTGF5b3V0PgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvcmF3L2VtcHR5LmRpY3QgYi9qYXZhL3Jlcy9yYXcvZW1wdHkuZGljdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTFiZjk2Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9yZXMvcmF3L2VtcHR5LmRpY3QKQEAgLTAsMCArMSBAQAoreLEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMtYWYvc3RyaW5ncy54bWwgYi9qYXZhL3Jlcy92YWx1ZXMtYWYvc3RyaW5ncy54bWwKaW5kZXggZGM2ZmRmMi4uMDdiNDUwMyAxMDA2NDQKLS0tIGEvamF2YS9yZXMvdmFsdWVzLWFmL3N0cmluZ3MueG1sCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1hZi9zdHJpbmdzLnhtbApAQCAtMTcwLDQgKzE3MCwzNiBAQAogICAgIDxzdHJpbmcgbmFtZT0iYnV0dG9uX2RlZmF1bHQiIG1zZ2lkPSIzOTg4MDE3ODQwNDMxODgxNDkxIj4iVmVyc3RlayI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxhbmd1YWdlX3NldHRpbmdzIiBtc2dpZD0iMTY3MTE1MzA1MzIwMTgwOTAzMSI+IlRhYWwgZW4gaW52b2VyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0X2lucHV0X21ldGhvZCIgbXNnaWQ9IjQzMDE2MDIzNzQ2MDkyNzUwMDMiPiJLaWVzIGludm9lcm1ldG9kZSI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4iV29vcmRlYm9la3ZlcnNrYWZmZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3Byb3ZpZGVyX25hbWUiIG1zZ2lkPSI3NzEwNDE1NTk5MzcxMTYxMDkyIj4iV29vcmRlYm9la3ZlcnNrYWZmZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NlcnZpY2VfbmFtZSIgbXNnaWQ9IjU1MTY1MDY5NzM0ODIwMjA1NiI+Ildvb3JkZWJvZWstZGllbnMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiJXb29yZGVib2VrIHNlIG9wZGF0ZWVyaW5saWd0aW5nIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc190aXRsZSIgbXNnaWQ9IjcyNDM5MzA5Njc4NDUwMjA0MDciPiJBZGRpc2lvbmVsZSB3b29yZGVib2VrZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbF9vdmVyX21ldGVyZWRfbmV0d29ya19wcm9tcHQiIG1zZ2lkPSIzNjQyNjM0NjIzNDY1MzQ5NzE2Ij4iV29vcmRlYm9layBiZXNraWtiYWFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc19zdW1tYXJ5IiBtc2dpZD0iODU5OTY3OTQzNDc5OTc0OTA1MyI+Ikluc3RlbGxpbmdzIHZpciB3b29yZGVib2VrZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzZXJfZGljdGlvbmFyaWVzIiBtc2dpZD0iNzUxOTczNjIzMjQyMzkyOTEyNCI+IkdlYnJ1aWtlcndvb3JkZWJvZWtlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4iR2VicnVpa2Vyd29vcmRlYm9layI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfYXZhaWxhYmxlIiBtc2dpZD0iMzE5MjkyMDYwODUyMDYxODA4MyI+Ildvb3JkZWJvZWsgYmVza2lrYmFhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZG93bmxvYWRpbmciIG1zZ2lkPSI4NTk0OTc0NzYyNjYzMDk1OTYiPiJMYWFpIHRhbnMgYWYiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxlZCIgbXNnaWQ9IjY0MjU1ODY4OTk2NzEzNzgxNjAiPiJHZcOvbnN0YWxsZWVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kaXNhYmxlZCIgbXNnaWQ9IjM0NDg1NzEyODA0OTA3NDYwMzIiPiJHZcOvbnN0YWxsZWVyLCBnZWRlYWt0aXZlZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5ub3RfY29ubmVjdF90b19kaWN0X3NlcnZpY2UiIG1zZ2lkPSI2ODc1NjY1NDk0NzI2MzAwNDI3Ij4iS2FuIG5pZSBhYW4gd29vcmRlYm9la2RpZW5zIGtvcHBlbCBuaWUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19kaWN0aW9uYXJpZXNfYXZhaWxhYmxlIiBtc2dpZD0iNTIwNjIyNTA3Nzk0NTYzNzgxMCI+IkdlZW4gd29vcmRlYm9la2UgYmVza2lrYmFhciBuaWUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiJIZXJsYWFpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibGFzdF91cGRhdGUiIG1zZ2lkPSIzMTAxNTQ5NzE5ODI3NjAwMzQ2Ij4iTGFhcyBvcGdlZGF0ZWVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV91cGRhdGluZyIgbXNnaWQ9IjgyMDE4NjI3NjcwNDEzNDcyMCI+IktvbnRyb2xlZXIgdmlyIG9wZGF0ZXJpbmdzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV9sb2FkaW5nIiBtc2dpZD0iODYxMTMzOTE0OTgyNTA0NzQ0NiI+IkxhYWkgdGFucy4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1haW5fZGljdF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjE2Nzk5NjQzMDY5ODAwOTg1NzAiPiJIb29md29vcmRlYm9layI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbCIgbXNnaWQ9IjU1ODY1MzE3MzY2MDkxODMzMDQiPiJLYW5zZWxsZWVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5zdGFsbF9kaWN0IiBtc2dpZD0iNTUyNTAwNTUyNDY5NzYwNzg2NSI+Ikluc3RhbGxlZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWxfZG93bmxvYWRfZGljdCIgbXNnaWQ9IjcxNjMxNzM2NTAyOTg4MzgzNjciPiJLYW5zZWxsZWVyIGFmbGFhaXNlbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpc2FibGVfZGljdCIgbXNnaWQ9Ijc2ODU4MTAwNDAyMzY0OTc3MDAiPiJEZWFrdGl2ZWVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZW5hYmxlX2RpY3QiIG1zZ2lkPSIzODQ4MTc5Nzg0NzAyNDczNjgwIj4iQWt0aXZlZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfZGljdCIgbXNnaWQ9IjU4MTcxNTkyOTA1MDM4NDM3NjYiPiJWZWUgdWl0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQiIG1zZ2lkPSI0OTY1MjY0ODQ5MDU3NjU2NTIxIj4iRGllIGdla29zZSB0YWFsIG9wIGpvdSBtb2JpZWxlIHRvZXN0ZWwgaGV0IFwnbiBiZXNraWtiYXJlIHdvb3JkZWJvZWsuJmx0O2JyLyZndDsgT25zIGJldmVlbCBhYW4gZGF0IGRpZSA8eGxpZmY6ZyBpZD0iTEFOR1VBR0UiPiUxJHM8L3hsaWZmOmc+LXdvb3JkZWJvZWsgJmx0O2ImZ3Q7YWZnZWxhYWkmbHQ7L2ImZ3Q7IHdvcmQgb20gam91IHRpa2VydmFyaW5nIFwnbiBiZXRlciBlZW4gdGUgbWFhay4mbHQ7YnIvJmd0OyAmbHQ7YnIvJmd0OyBEaXQga2FuIFwnbiBtaW51dXQgb2YgdHdlZSBuZWVtIG9tIG9vciAzRyBhZiB0ZSBsYWFpLiBIZWZmaW5ncyBtYWcgZ2VsZCBhcyBqeSBuaWUgXCduICZsdDtiJmd0O29uYmVwZXJrdGUgZGF0YXBsYW4mbHQ7L2ImZ3Q7LiZsdDtici8mZ3Q7IGhldCBuaWUgQXMgankgb25zZWtlciBvb3Igam91IGRhdGFwbGFuIGlzLCBiZXZlZWwgb25zIGFhbiBkYXQgankgXCduIFdpRmktdmVyYmluZGluZyBzb2VrIG9tIG91dG9tYXRpZXMgdGUgYmVnaW4gYWZsYWFpLiZsdDtici8mZ3Q7ICZsdDtici8mZ3Q7IFdlbms6IEp5IGthbiB3b29yZGVib2VrZSBhZmxhYWkgZW4gdmVyd3lkZXIgZGV1ciB0ZSBnYWFuIG5hICZsdDtiJmd0O1RhYWwgZW4gaW52b2VyJmx0Oy9iJmd0OyBpbiBkaWUgJmx0O2ImZ3Q7SW5zdGVsbGluZ3MmbHQ7L2ImZ3Q7LWtpZXNseXMgdmFuIGpvdSBtb2JpZWxlIHRvZXN0ZWwuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfb3Zlcl9tZXRlcmVkIiBtc2dpZD0iNDAyNDAxMzc2NDkzNzg1MDA2MSI+IkxhYWkgbm91IGFmICg8eGxpZmY6ZyBpZD0iU0laRV9JTl9NRUdBQllURVMiPiUxJC4xZjwveGxpZmY6Zz5NQikiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb19ub3RfZG93bmxvYWRfb3Zlcl9tZXRlcmVkIiBtc2dpZD0iNjk2Mzc3MDg4NTAzMzc2NTM3OCI+IkxhYWkgb29yIFdpLUZpIGFmIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDU2MDU3NjM3OTY4MDY2MDA0NyI+IlwnbiBXb29yZGVib2VrIGlzIHZpciA8eGxpZmY6ZyBpZD0iTEFOR1VBR0UiPiUxJHM8L3hsaWZmOmc+IGJlc2tpa2JhYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24iIG1zZ2lkPSIzNTU1MTUzODEyODUzMTc4MzIiPiJEcnVrIG9tIHRlIGhlcnNpZW4gZW4gYWYg4oCL4oCLdGUgbGFhaSI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLWFtL3N0cmluZ3MueG1sIGIvamF2YS9yZXMvdmFsdWVzLWFtL3N0cmluZ3MueG1sCmluZGV4IDE5MDdkYzkuLjZmNzQwYTkgMTAwNjQ0Ci0tLSBhL2phdmEvcmVzL3ZhbHVlcy1hbS9zdHJpbmdzLnhtbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtYW0vc3RyaW5ncy54bWwKQEAgLTE3MCw0ICsxNzAsMzkgQEAKICAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9kZWZhdWx0IiBtc2dpZD0iMzk4ODAxNzg0MDQzMTg4MTQ5MSI+IuGKkOGJo+GIqiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxhbmd1YWdlX3NldHRpbmdzIiBtc2dpZD0iMTY3MTE1MzA1MzIwMTgwOTAzMSI+IuGJi+GKleGJiyDhiqXhipMg4YyN4Ymk4Ym1Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0X2lucHV0X21ldGhvZCIgbXNnaWQ9IjQzMDE2MDIzNzQ2MDkyNzUwMDMiPiLhi6jhjI3hiaThibUg4Yi14YiN4Ym1IOGLreGIneGIqOGMoSI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4i4YiY4Yud4YyI4YmgIOGJg+GIi+GJtSDhiqDhiYXhiKvhiaIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3Byb3ZpZGVyX25hbWUiIG1zZ2lkPSI3NzEwNDE1NTk5MzcxMTYxMDkyIj4i4YiY4Yud4YyI4YmgIOGJg+GIi+GJtSDhiqDhiYXhiKvhiaIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NlcnZpY2VfbmFtZSIgbXNnaWQ9IjU1MTY1MDY5NzM0ODIwMjA1NiI+IuGLqOGImOGLneGMiOGJoCDhiYPhiIvhibUg4Yqg4YyI4YiN4YyN4YiO4Ym1Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzMjc0ODYxNTE0Njk1MDMyOTU0Ij4i4YiY4Yud4YyI4YmgIOGJg+GIi+GJtSDhiJvhi5jhiJjhipsg4YiY4Yio4YyDIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc190aXRsZSIgbXNnaWQ9IjcyNDM5MzA5Njc4NDUwMjA0MDciPiLhiqXhi6jhibPhiqjhiIkg4Yuo4Yia4Yur4Yu14YyJIOGImOGLneGMiOGJoCDhiYPhiIvhibbhib0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxfb3Zlcl9tZXRlcmVkX25ldHdvcmtfcHJvbXB0IiBtc2dpZD0iMzY0MjYzNDYyMzQ2NTM0OTcxNiI+IuGImOGLneGMiOGJoCDhiYPhiIvhibUg4Yut4YyI4Yqb4YiNIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc19zdW1tYXJ5IiBtc2dpZD0iODU5OTY3OTQzNDc5OTc0OTA1MyI+IuGLqOGImOGLneGMiOGJoCDhiYPhiIvhibUg4YmF4YqV4Yml4Yiu4Ym9Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNlcl9kaWN0aW9uYXJpZXMiIG1zZ2lkPSI3NTE5NzM2MjMyNDIzOTI5MTI0Ij4i4Yuo4Ymw4Yyg4YmD4YiaIOGImOGLneGMiOGJoCDhiYPhiIvhibUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X3VzZXJfZGljdF9wcmVmX25hbWUiIG1zZ2lkPSI1MjIxMjUxNTI3NTc2MDc3OTAiPiLhi6jhibDhjKDhiYPhiJog4YiY4Yud4YyI4YmgIOGJg+GIi+GJtSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfYXZhaWxhYmxlIiBtc2dpZD0iMzE5MjkyMDYwODUyMDYxODA4MyI+IuGImOGLneGMiOGJoCDhiYPhiIvhibUg4Yqg4YiIIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kb3dubG9hZGluZyIgbXNnaWQ9Ijg1OTQ5NzQ3NjI2NjMwOTU5NiI+IuGJoOGKoOGIgeGKlSDhjIrhi5wg4Ymg4Yib4YuN4Yio4Yu1IOGIi+GLrSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbGVkIiBtc2dpZD0iNjQyNTU4Njg5OTY3MTM3ODE2MCI+IuGJsOGMreGKl+GIjSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZGlzYWJsZWQiIG1zZ2lkPSIzNDQ4NTcxMjgwNDkwNzQ2MDMyIj4i4Ymw4Yyt4YqX4YiN4Y2jIOGJsOGIsOGKk+GKreGIj+GIjSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiLhi4jhi7Ag4YiY4Yud4YyI4YmgIOGJg+GIi+GJtSDhiqDhjIjhiI3hjIjhiI7hibUg4Ymg4Yib4YyI4YqT4YqY4Ym1IOGIi+GLrSDhib3hjI3hiK0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19kaWN0aW9uYXJpZXNfYXZhaWxhYmxlIiBtc2dpZD0iNTIwNjIyNTA3Nzk0NTYzNzgxMCI+IuGIneGKleGInSDhiJjhi53hjIjhiaAg4YmD4YiL4Ym1IOGLqOGIieGInSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNoZWNrX2Zvcl91cGRhdGVzX25vdyIgbXNnaWQ9IjY0MjA1Nzk4NjEyNzYyNDk4NiI+IuGKoOGLteGItSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imxhc3RfdXBkYXRlIiBtc2dpZD0iMzEwMTU0OTcxOTgyNzYwMDM0NiI+IuGIiOGImOGMqOGIqOGIuyDhjIrhi5wg4Yuo4YuY4YiY4YqQ4YuNIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV91cGRhdGluZyIgbXNnaWQ9IjgyMDE4NjI3NjcwNDEzNDcyMCI+IuGLneGIm+GKlOGLjuGJveGKlSDhiaDhiJjhjYjhibDhiL0g4YiL4YutIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV9sb2FkaW5nIiBtc2dpZD0iODYxMTMzOTE0OTgyNTA0NzQ0NiI+IuGJoOGImOGMq+GKlSDhiIvhi63igKYiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtYWluX2RpY3RfZGVzY3JpcHRpb24iIG1zZ2lkPSIxNjc5OTY0MzA2OTgwMDk4NTcwIj4i4YuL4YqTIOGImOGLneGMiOGJoCDhiYPhiI0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWwiIG1zZ2lkPSI1NTg2NTMxNzM2NjA5MTgzMzA0Ij4i4Ymw4YuI4YuNIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5zdGFsbF9kaWN0IiBtc2dpZD0iNTUyNTAwNTUyNDY5NzYwNzg2NSI+IuGMq+GKlSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbF9kb3dubG9hZF9kaWN0IiBtc2dpZD0iNzE2MzE3MzY1MDI5ODgzODM2NyI+IuGIm+GLjeGIqOGLteGKlSDhibDhi4jhi40iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaXNhYmxlX2RpY3QiIG1zZ2lkPSI3Njg1ODEwMDQwMjM2NDk3NzAwIj4i4Yqg4Yiw4YqT4Yqt4YiNIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZW5hYmxlX2RpY3QiIG1zZ2lkPSIzODQ4MTc5Nzg0NzAyNDczNjgwIj4i4Yqg4YqV4YmDIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVsZXRlX2RpY3QiIG1zZ2lkPSI1ODE3MTU5MjkwNTAzODQzNzY2Ij4i4Yiw4Yit4YudIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNob3VsZF9kb3dubG9hZF9vdmVyX21ldGVyZWRfcHJvbXB0ICg0OTY1MjY0ODQ5MDU3NjU2NTIxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvd25sb2FkX292ZXJfbWV0ZXJlZCAoNDAyNDAxMzc2NDkzNzg1MDA2MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb19ub3RfZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg2OTYzNzcwODg1MDMzNzY1Mzc4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDU2MDU3NjM3OTY4MDY2MDA0NyI+IuGImOGLneGMiOGJoCDhiYPhiIvhibUg4YiIPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPiDhi63hjIjhipvhiI0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24iIG1zZ2lkPSIzNTU1MTUzODEyODUzMTc4MzIiPiLhiIjhiJjhjIjhiJ3hjIjhiJ3hipMg4YiI4Yib4YuN4Yio4Yu1IOGJsOGMq+GKlSI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLWFyL3N0cmluZ3MueG1sIGIvamF2YS9yZXMvdmFsdWVzLWFyL3N0cmluZ3MueG1sCmluZGV4IDEyNjhmNDMuLjU2NjhkNTkgMTAwNjQ0Ci0tLSBhL2phdmEvcmVzL3ZhbHVlcy1hci9zdHJpbmdzLnhtbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtYXIvc3RyaW5ncy54bWwKQEAgLTE3MCw0ICsxNzAsMzkgQEAKICAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9kZWZhdWx0IiBtc2dpZD0iMzk4ODAxNzg0MDQzMTg4MTQ5MSI+Itin2YTYp9mB2KrYsdin2LbZitipIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGFuZ3VhZ2Vfc2V0dGluZ3MiIG1zZ2lkPSIxNjcxMTUzMDUzMjAxODA5MDMxIj4i2KfZhNmE2LrYqSDZiNin2YTYpdiv2K7Yp9mEIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0X2lucHV0X21ldGhvZCIgbXNnaWQ9IjQzMDE2MDIzNzQ2MDkyNzUwMDMiPiLYp9iu2KrZitin2LEg2KPYs9mE2YjYqCDYp9mE2KXYr9iu2KfZhCI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4i2YXZgtiv2YUg2KfZhNmC2KfZhdmI2LMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3Byb3ZpZGVyX25hbWUiIG1zZ2lkPSI3NzEwNDE1NTk5MzcxMTYxMDkyIj4i2YXZgtiv2YUg2KfZhNmC2KfZhdmI2LMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NlcnZpY2VfbmFtZSIgbXNnaWQ9IjU1MTY1MDY5NzM0ODIwMjA1NiI+Itiu2K/ZhdipINin2YTZgtin2YXZiNizIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzMjc0ODYxNTE0Njk1MDMyOTU0Ij4i2YXYudmE2YjZhdin2Kog2KrYrdiv2YrYqyDYp9mE2YLYp9mF2YjYsyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3NfdGl0bGUiIG1zZ2lkPSI3MjQzOTMwOTY3ODQ1MDIwNDA3Ij4i2KfZhNmC2YjYp9mF2YrYsyDYp9mE2KXYttin2YHZitipIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsX292ZXJfbWV0ZXJlZF9uZXR3b3JrX3Byb21wdCIgbXNnaWQ9IjM2NDI2MzQ2MjM0NjUzNDk3MTYiPiLZgtin2YXZiNizINmF2KrZiNmB2LEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4i2KXYudiv2KfYr9in2Kog2KfZhNmC2YjYp9mF2YrYsyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzZXJfZGljdGlvbmFyaWVzIiBtc2dpZD0iNzUxOTczNjIzMjQyMzkyOTEyNCI+ItmC2YjYp9mF2YrYsyDYp9mE2YXYs9iq2K7Yr9mFIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4i2YLYp9mF2YjYsyDYp9mE2YXYs9iq2K7Yr9mFIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9hdmFpbGFibGUiIG1zZ2lkPSIzMTkyOTIwNjA4NTIwNjE4MDgzIj4i2KfZhNmC2KfZhdmI2LMg2YXYqtin2K0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rvd25sb2FkaW5nIiBtc2dpZD0iODU5NDk3NDc2MjY2MzA5NTk2Ij4i2YrYqtmFINit2KfZhNmK2YvYpyDYp9mE2KrZhtiy2YrZhCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbGVkIiBtc2dpZD0iNjQyNTU4Njg5OTY3MTM3ODE2MCI+ItmF2KvYqNiqIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kaXNhYmxlZCIgbXNnaWQ9IjM0NDg1NzEyODA0OTA3NDYwMzIiPiLZhdir2KjYqtiMINmF2LnYt9mEIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2Fubm90X2Nvbm5lY3RfdG9fZGljdF9zZXJ2aWNlIiBtc2dpZD0iNjg3NTY2NTQ5NDcyNjMwMDQyNyI+ItmF2LTZg9mE2Kkg2YHZiiDYp9mE2KfYqti12KfZhCDYqNiu2K/ZhdipINin2YTZgtin2YXZiNizIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZGljdGlvbmFyaWVzX2F2YWlsYWJsZSIgbXNnaWQ9IjUyMDYyMjUwNzc5NDU2Mzc4MTAiPiLZhNinINiq2KrZiNmB2LEg2KPZitipINmC2YjYp9mF2YrYsyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNoZWNrX2Zvcl91cGRhdGVzX25vdyIgbXNnaWQ9IjY0MjA1Nzk4NjEyNzYyNDk4NiI+Itiq2K3Yr9mK2KsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsYXN0X3VwZGF0ZSIgbXNnaWQ9IjMxMDE1NDk3MTk4Mjc2MDAzNDYiPiLYqtin2LHZitiuINii2K7YsSDYqtit2K/ZitirIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV91cGRhdGluZyIgbXNnaWQ9IjgyMDE4NjI3NjcwNDEzNDcyMCI+Itis2KfYsdmNINin2YTYqNit2Ksg2LnZhiDYqtit2K/Zitir2KfYqiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfbG9hZGluZyIgbXNnaWQ9Ijg2MTEzMzkxNDk4MjUwNDc0NDYiPiLYqtit2YXZitmELi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWFpbl9kaWN0X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMTY3OTk2NDMwNjk4MDA5ODU3MCI+Itin2YTZgtin2YXZiNizINin2YTYsdim2YrYs9mKIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsIiBtc2dpZD0iNTU4NjUzMTczNjYwOTE4MzMwNCI+Itil2YTYutin2KEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJpbnN0YWxsX2RpY3QiIG1zZ2lkPSI1NTI1MDA1NTI0Njk3NjA3ODY1Ij4i2KrYq9io2YrYqiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbF9kb3dubG9hZF9kaWN0IiBtc2dpZD0iNzE2MzE3MzY1MDI5ODgzODM2NyI+Itil2YTYutin2KEg2KfZhNiq2YbYstmK2YQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaXNhYmxlX2RpY3QiIG1zZ2lkPSI3Njg1ODEwMDQwMjM2NDk3NzAwIj4i2KrYudi32YrZhCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVuYWJsZV9kaWN0IiBtc2dpZD0iMzg0ODE3OTc4NDcwMjQ3MzY4MCI+Itiq2YXZg9mK2YYiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfZGljdCIgbXNnaWQ9IjU4MTcxNTkyOTA1MDM4NDM3NjYiPiLYrdiw2YEiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQgKDQ5NjUyNjQ4NDkwNTc2NTY1MjEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg0MDI0MDEzNzY0OTM3ODUwMDYxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvX25vdF9kb3dubG9hZF9vdmVyX21ldGVyZWQgKDY5NjM3NzA4ODUwMzM3NjUzNzgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0NTYwNTc2Mzc5NjgwNjYwMDQ3Ij4i2YfZhtin2YMg2YLYp9mF2YjYsyDZhdiq2YjZgdixINmE2YTYutipIDx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24iIG1zZ2lkPSIzNTU1MTUzODEyODUzMTc4MzIiPiLYp9i22LrYtyDZhNmE2YXYsdin2KzYudipINmI2KfZhNiq2YbYstmK2YQiPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1iZS9zdHJpbmdzLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1iZS9zdHJpbmdzLnhtbAppbmRleCA2ZmMyOGU1Li5kMTJlNDdjIDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMtYmUvc3RyaW5ncy54bWwKKysrIGIvamF2YS9yZXMvdmFsdWVzLWJlL3N0cmluZ3MueG1sCkBAIC0xNzAsNCArMTcwLDM5IEBACiAgICAgPHN0cmluZyBuYW1lPSJidXR0b25fZGVmYXVsdCIgbXNnaWQ9IjM5ODgwMTc4NDA0MzE4ODE0OTEiPiLQn9CwINC30LzQsNGe0YfQsNC90L3RliI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxhbmd1YWdlX3NldHRpbmdzIiBtc2dpZD0iMTY3MTE1MzA1MzIwMTgwOTAzMSI+ItCc0L7QstCwINGWINGe0LLQvtC0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0X2lucHV0X21ldGhvZCIgbXNnaWQ9IjQzMDE2MDIzNzQ2MDkyNzUwMDMiPiLQktGL0LHQtdGA0YvRhtC1INC80LXRgtCw0LQg0YPQstC+0LTRgyI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4i0J/QsNGB0YLQsNGe0YjRh9GL0Log0YHQu9C+0Z7QvdGW0LrQsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfcHJvdmlkZXJfbmFtZSIgbXNnaWQ9Ijc3MTA0MTU1OTkzNzExNjEwOTIiPiLQn9Cw0YHRgtCw0Z7RiNGH0YvQuiDRgdC70L7RntC90ZbQutCwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXJ2aWNlX25hbWUiIG1zZ2lkPSI1NTE2NTA2OTczNDgyMDIwNTYiPiLQodC70L7RntC90ZbQuiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRvd25sb2FkX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzI3NDg2MTUxNDY5NTAzMjk1NCI+ItCG0L3RhNCw0YDQvNCw0YbRi9GPINCw0LHQvdCw0Z7Qu9C10L3QvdGPINGB0LvQvtGe0L3RltC60LAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3RpdGxlIiBtc2dpZD0iNzI0MzkzMDk2Nzg0NTAyMDQwNyI+ItCU0LDQtNCw0YLQutC+0LLRi9GPINGB0LvQvtGe0L3RltC60ZYiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxfb3Zlcl9tZXRlcmVkX25ldHdvcmtfcHJvbXB0IiBtc2dpZD0iMzY0MjYzNDYyMzQ2NTM0OTcxNiI+ItCU0LDRgdGC0YPQv9C90Ysg0YHQu9C+0Z7QvdGW0LoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4i0J3QsNC70LDQtNGLINC00LvRjyDRgdC70L7RntC90ZbQutCw0Z4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2VyX2RpY3Rpb25hcmllcyIgbXNnaWQ9Ijc1MTk3MzYyMzI0MjM5MjkxMjQiPiLQmtCw0YDRi9GB0YLQsNC70YzQvdGW0YbQutGW0Y8g0YHQu9C+0Z7QvdGW0LrRliI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfdXNlcl9kaWN0X3ByZWZfbmFtZSIgbXNnaWQ9IjUyMjEyNTE1Mjc1NzYwNzc5MCI+ItCa0LDRgNGL0YHRgtCw0LvRjNC90ZbRhtC60ZYg0YHQu9C+0Z7QvdGW0LoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiLQlNCw0YHRgtGD0L/QvdGLINGB0LvQvtGe0L3RltC6Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kb3dubG9hZGluZyIgbXNnaWQ9Ijg1OTQ5NzQ3NjI2NjMwOTU5NiI+ItCh0L/QsNC80L/QvtGe0LLQsNC10YbRhtCwINC30LDRgNCw0LciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxlZCIgbXNnaWQ9IjY0MjU1ODY4OTk2NzEzNzgxNjAiPiLQo9GB0YLQsNC70Y/QstCw0L3RiyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZGlzYWJsZWQiIG1zZ2lkPSIzNDQ4NTcxMjgwNDkwNzQ2MDMyIj4i0KPRgdGC0LDQu9GP0LLQsNC90LAsINCw0LTQutC70Y7Rh9Cw0L3QsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiLQn9GA0LDQsdC70LXQvNCwINC/0LDQtNC60LvRjtGH0Y3QvdC90Y8g0LTQsCDRgdC70L7RntC90ZbQutCwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZGljdGlvbmFyaWVzX2F2YWlsYWJsZSIgbXNnaWQ9IjUyMDYyMjUwNzc5NDU2Mzc4MTAiPiLQodC70L7RntC90ZbQutCw0Z4g0L3Rj9C80LAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiLQkNCx0L3QsNCy0ZbRhtGMIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibGFzdF91cGRhdGUiIG1zZ2lkPSIzMTAxNTQ5NzE5ODI3NjAwMzQ2Ij4i0JDQv9C+0YjQvdGP0LUg0LDQsdC90LDRntC70LXQvdC90LUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX3VwZGF0aW5nIiBtc2dpZD0iODIwMTg2Mjc2NzA0MTM0NzIwIj4i0J/RgNCw0LLQtdGA0LrQsCDQvdCw0Y/RntC90LDRgdGG0ZYg0LDQsdC90LDRntC70LXQvdC90Y/RniI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfbG9hZGluZyIgbXNnaWQ9Ijg2MTEzMzkxNDk4MjUwNDc0NDYiPiLQl9Cw0LPRgNGD0LfQutCwLi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWFpbl9kaWN0X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMTY3OTk2NDMwNjk4MDA5ODU3MCI+ItCQ0YHQvdC+0Z7QvdGLINGB0LvQvtGe0L3RltC6Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsIiBtc2dpZD0iNTU4NjUzMTczNjYwOTE4MzMwNCI+ItCQ0LTQvNC10L3QsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imluc3RhbGxfZGljdCIgbXNnaWQ9IjU1MjUwMDU1MjQ2OTc2MDc4NjUiPiLQo9GB0YLQsNC70Y/QstCw0YbRjCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbF9kb3dubG9hZF9kaWN0IiBtc2dpZD0iNzE2MzE3MzY1MDI5ODgzODM2NyI+ItCQ0LTQvNGP0L3RltGG0Ywg0YHQv9Cw0LzQv9Cw0LLQsNC90L3QtSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpc2FibGVfZGljdCIgbXNnaWQ9Ijc2ODU4MTAwNDAyMzY0OTc3MDAiPiLQkNC00LrQu9GO0YfRi9GG0YwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlbmFibGVfZGljdCIgbXNnaWQ9IjM4NDgxNzk3ODQ3MDI0NzM2ODAiPiLQo9C60LvRjtGH0YvRhtGMIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVsZXRlX2RpY3QiIG1zZ2lkPSI1ODE3MTU5MjkwNTAzODQzNzY2Ij4i0JLRi9C00LDQu9GW0YbRjCI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaG91bGRfZG93bmxvYWRfb3Zlcl9tZXRlcmVkX3Byb21wdCAoNDk2NTI2NDg0OTA1NzY1NjUyMSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb3dubG9hZF9vdmVyX21ldGVyZWQgKDQwMjQwMTM3NjQ5Mzc4NTAwNjEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZG9fbm90X2Rvd25sb2FkX292ZXJfbWV0ZXJlZCAoNjk2Mzc3MDg4NTAzMzc2NTM3OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ1NjA1NzYzNzk2ODA2NjAwNDciPiLQodC70L7RntC90ZbQuiDQtNC70Y8g0LzQvtCy0YsgXCI8eGxpZmY6ZyBpZD0iTEFOR1VBR0UiPiUxJHM8L3hsaWZmOmc+XCIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24iIG1zZ2lkPSIzNTU1MTUzODEyODUzMTc4MzIiPiLQndCw0YZp0YHQvWnRhtC1LCDQutCw0LEg0L/RgNCw0LPQu9C10LTQt9C10YbRjCBpINGB0L/QsNC80L/QsNCy0LDRhtGMIjwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMtYmcvc3RyaW5ncy54bWwgYi9qYXZhL3Jlcy92YWx1ZXMtYmcvc3RyaW5ncy54bWwKaW5kZXggNzZiZDJkMS4uMzdlYWEzMyAxMDA2NDQKLS0tIGEvamF2YS9yZXMvdmFsdWVzLWJnL3N0cmluZ3MueG1sCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1iZy9zdHJpbmdzLnhtbApAQCAtMTcwLDQgKzE3MCwzOSBAQAogICAgIDxzdHJpbmcgbmFtZT0iYnV0dG9uX2RlZmF1bHQiIG1zZ2lkPSIzOTg4MDE3ODQwNDMxODgxNDkxIj4i0KHRgtCw0L3QtNCw0YDRgtC90LgiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYW5ndWFnZV9zZXR0aW5ncyIgbXNnaWQ9IjE2NzExNTMwNTMyMDE4MDkwMzEiPiLQldC30LjQuiDQuCDQstGK0LLQtdC20LTQsNC90LUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RfaW5wdXRfbWV0aG9kIiBtc2dpZD0iNDMwMTYwMjM3NDYwOTI3NTAwMyI+ItCY0LfQsdC+0YAg0L3QsCDQvNC10YLQvtC0INC90LAg0LLRitCy0LXQttC00LDQvdC1Ijwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJhcHBfbmFtZSIgbXNnaWQ9IjEwMTcwNTgxODYzMjI3MTQ0MDUiPiLQlNC+0YHRgtCw0LLRh9C40Log0L3QsCDRgNC10YfQvdC40LrQsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfcHJvdmlkZXJfbmFtZSIgbXNnaWQ9Ijc3MTA0MTU1OTkzNzExNjEwOTIiPiLQlNC+0YHRgtCw0LLRh9C40Log0L3QsCDRgNC10YfQvdC40LrQsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2VydmljZV9uYW1lIiBtc2dpZD0iNTUxNjUwNjk3MzQ4MjAyMDU2Ij4i0KPRgdC70YPQs9CwINC30LAg0YDQtdGH0L3QuNC6Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzMjc0ODYxNTE0Njk1MDMyOTU0Ij4i0JjQvdGE0L7RgNC80LDRhtC40Y8g0LfQsCDQsNC60YLRg9Cw0LvQuNC30LDRhtC40Y/RgtCwINC90LAg0YDQtdGH0L3QuNGG0LjRgtC1Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc190aXRsZSIgbXNnaWQ9IjcyNDM5MzA5Njc4NDUwMjA0MDciPiLQlNC+0LHQsNCy0LXQvdC4INGA0LXRh9C90LjRhtC4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsX292ZXJfbWV0ZXJlZF9uZXR3b3JrX3Byb21wdCIgbXNnaWQ9IjM2NDI2MzQ2MjM0NjUzNDk3MTYiPiLQndCw0LvQuNGG0LUg0LUg0YDQtdGH0L3QuNC6Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc19zdW1tYXJ5IiBtc2dpZD0iODU5OTY3OTQzNDc5OTc0OTA1MyI+ItCd0LDRgdGC0YDQvtC50LrQuCDQt9CwINGA0LXRh9C90LjRhtC4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNlcl9kaWN0aW9uYXJpZXMiIG1zZ2lkPSI3NTE5NzM2MjMyNDIzOTI5MTI0Ij4i0J/QvtGC0YDQtdCx0LjRgtC10LvRgdC60Lgg0YDQtdGH0L3QuNGG0LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X3VzZXJfZGljdF9wcmVmX25hbWUiIG1zZ2lkPSI1MjIxMjUxNTI3NTc2MDc3OTAiPiLQn9C+0YLRgNC10LHQuNGC0LXQu9GB0LrQuCDRgNC10YfQvdC40LoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiLQoNC10YfQvdC40LrRitGCINC1INC90LDQu9C40YbQtSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZG93bmxvYWRpbmciIG1zZ2lkPSI4NTk0OTc0NzYyNjYzMDk1OTYiPiLQmNC30YLQtdCz0LvRj9GCINGB0LUg0L/QvtC90LDRgdGC0L7Rj9GJ0LXQvCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbGVkIiBtc2dpZD0iNjQyNTU4Njg5OTY3MTM3ODE2MCI+ItCY0L3RgdGC0LDQu9C40YDQsNC90L4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rpc2FibGVkIiBtc2dpZD0iMzQ0ODU3MTI4MDQ5MDc0NjAzMiI+ItCY0L3RgdGC0LDQu9C40YDQsNC90L4sINC00LXQsNC60YLQuNCy0LjRgNCw0L3QviI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiLQmNC80LAg0L/RgNC+0LHQu9C10Lwg0YEg0LLRgNGK0LfQutCw0YLQsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2RpY3Rpb25hcmllc19hdmFpbGFibGUiIG1zZ2lkPSI1MjA2MjI1MDc3OTQ1NjM3ODEwIj4i0J3Rj9C80LAg0L3QsNC70LjRh9C90Lgg0YDQtdGH0L3QuNGG0LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiLQntC/0YDQtdGB0L3Rj9Cy0LDQvdC1Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibGFzdF91cGRhdGUiIG1zZ2lkPSIzMTAxNTQ5NzE5ODI3NjAwMzQ2Ij4i0J/QvtGB0LvQtdC00L3QsCDQsNC60YLRg9Cw0LvQuNC30LDRhtC40Y86Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV91cGRhdGluZyIgbXNnaWQ9IjgyMDE4NjI3NjcwNDEzNDcyMCI+ItCf0YDQvtCy0LXRgNGP0LLQsCDRgdC1INC30LAg0LDQutGC0YPQsNC70LjQt9Cw0YbQuNC4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV9sb2FkaW5nIiBtc2dpZD0iODYxMTMzOTE0OTgyNTA0NzQ0NiI+ItCX0LDRgNC10LbQtNCwINGB0LUuLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtYWluX2RpY3RfZGVzY3JpcHRpb24iIG1zZ2lkPSIxNjc5OTY0MzA2OTgwMDk4NTcwIj4i0J7RgdC90L7QstC10L0g0YDQtdGH0L3QuNC6Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsIiBtc2dpZD0iNTU4NjUzMTczNjYwOTE4MzMwNCI+ItCe0YLQutCw0LciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJpbnN0YWxsX2RpY3QiIG1zZ2lkPSI1NTI1MDA1NTI0Njk3NjA3ODY1Ij4i0JjQvdGB0YLQsNC70LjRgNCw0L3QtSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbF9kb3dubG9hZF9kaWN0IiBtc2dpZD0iNzE2MzE3MzY1MDI5ODgzODM2NyI+ItCQ0L3Rg9C70LjRgNCw0L3QtSDQvdCwINC40LfRgtC10LPQu9GP0L3QtdGC0L4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaXNhYmxlX2RpY3QiIG1zZ2lkPSI3Njg1ODEwMDQwMjM2NDk3NzAwIj4i0JTQtdCw0LrRgtC40LLQuNGA0LDQvdC1Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZW5hYmxlX2RpY3QiIG1zZ2lkPSIzODQ4MTc5Nzg0NzAyNDczNjgwIj4i0JDQutGC0LjQstC40YDQsNC90LUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfZGljdCIgbXNnaWQ9IjU4MTcxNTkyOTA1MDM4NDM3NjYiPiLQmNC30YLRgNC40LLQsNC90LUiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQgKDQ5NjUyNjQ4NDkwNTc2NTY1MjEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg0MDI0MDEzNzY0OTM3ODUwMDYxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvX25vdF9kb3dubG9hZF9vdmVyX21ldGVyZWQgKDY5NjM3NzA4ODUwMzM3NjUzNzgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0NTYwNTc2Mzc5NjgwNjYwMDQ3Ij4i0JfQsCA8eGxpZmY6ZyBpZD0iTEFOR1VBR0UiPiUxJHM8L3hsaWZmOmc+INC1INC90LDQu9C40YbQtSDRgNC10YfQvdC40LoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24iIG1zZ2lkPSIzNTU1MTUzODEyODUzMTc4MzIiPiLQndCw0YLQuNGB0L3QtdGC0LUsINC30LAg0LTQsCDQv9GA0LXQs9C70LXQtNCw0YLQtSDQuCDQuNC30YLQtdCz0LvQuNGC0LUiPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1jYS9zdHJpbmdzLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1jYS9zdHJpbmdzLnhtbAppbmRleCBlZDg4MzMzLi5jNDViMDdjIDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMtY2Evc3RyaW5ncy54bWwKKysrIGIvamF2YS9yZXMvdmFsdWVzLWNhL3N0cmluZ3MueG1sCkBAIC0xNzAsNCArMTcwLDM2IEBACiAgICAgPHN0cmluZyBuYW1lPSJidXR0b25fZGVmYXVsdCIgbXNnaWQ9IjM5ODgwMTc4NDA0MzE4ODE0OTEiPiJQcmVkZXRlcm1pbmF0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGFuZ3VhZ2Vfc2V0dGluZ3MiIG1zZ2lkPSIxNjcxMTUzMDUzMjAxODA5MDMxIj4iSWRpb21hIGkgaW50cm9kdWNjacOzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0X2lucHV0X21ldGhvZCIgbXNnaWQ9IjQzMDE2MDIzNzQ2MDkyNzUwMDMiPiJTZWxlY2Npw7MgZGUgbcOodG9kZXMgZFwnaW50cm9kdWNjacOzIjwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJhcHBfbmFtZSIgbXNnaWQ9IjEwMTcwNTgxODYzMjI3MTQ0MDUiPiJQcm92ZcOvZG9yIGRlIGRpY2Npb25hcmlzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9wcm92aWRlcl9uYW1lIiBtc2dpZD0iNzcxMDQxNTU5OTM3MTE2MTA5MiI+IlByb3Zlw69kb3IgZGUgZGljY2lvbmFyaXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NlcnZpY2VfbmFtZSIgbXNnaWQ9IjU1MTY1MDY5NzM0ODIwMjA1NiI+IlNlcnZlaSBkZSBkaWNjaW9uYXJpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzMjc0ODYxNTE0Njk1MDMyOTU0Ij4iSW5mb3JtYWNpw7MgZFwnYWN0dWFsaXR6YWNpw7MgZGVsIGRpY2Npb25hcmkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3RpdGxlIiBtc2dpZD0iNzI0MzkzMDk2Nzg0NTAyMDQwNyI+IkRpY2Npb25hcmlzIGNvbXBsZW1lbnRhcmlzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsX292ZXJfbWV0ZXJlZF9uZXR3b3JrX3Byb21wdCIgbXNnaWQ9IjM2NDI2MzQ2MjM0NjUzNDk3MTYiPiJEaWNjaW9uYXJpIGRpc3BvbmlibGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4iQ29uZmlndXJhY2nDsyBkZWxzIGRpY2Npb25hcmlzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNlcl9kaWN0aW9uYXJpZXMiIG1zZ2lkPSI3NTE5NzM2MjMyNDIzOTI5MTI0Ij4iRGljY2lvbmFyaXMgZGUgbFwndXN1YXJpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4iRGljY2lvbmFyaSBkZSBsXCd1c3VhcmkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiJEaWNjaW9uYXJpIGRpc3BvbmlibGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rvd25sb2FkaW5nIiBtc2dpZD0iODU5NDk3NDc2MjY2MzA5NTk2Ij4iU1wnZXN0w6AgYmFpeGFudCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbGVkIiBtc2dpZD0iNjQyNTU4Njg5OTY3MTM3ODE2MCI+Ikluc3RhbMK3bGF0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kaXNhYmxlZCIgbXNnaWQ9IjM0NDg1NzEyODA0OTA3NDYwMzIiPiJJbnN0YWzCt2xhdCwgZGVzYWN0aXZhdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiJTXCdoYSBwcm9kdcOvdCB1biBwcm9ibGVtYSBlbiBjb25uZWN0YXIgYWwgc2VydmVpIGRlIGRpY2Npb25hcmkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19kaWN0aW9uYXJpZXNfYXZhaWxhYmxlIiBtc2dpZD0iNTIwNjIyNTA3Nzk0NTYzNzgxMCI+Ik5vIGhpIGhhIGNhcCBkaWNjaW9uYXJpIGRpc3BvbmlibGUuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2hlY2tfZm9yX3VwZGF0ZXNfbm93IiBtc2dpZD0iNjQyMDU3OTg2MTI3NjI0OTg2Ij4iQWN0dWFsaXR6YSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imxhc3RfdXBkYXRlIiBtc2dpZD0iMzEwMTU0OTcxOTgyNzYwMDM0NiI+IsOabHRpbWEgYWN0dWFsaXR6YWNpw7MiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX3VwZGF0aW5nIiBtc2dpZD0iODIwMTg2Mjc2NzA0MTM0NzIwIj4iU1wnZXN0w6AgY29tcHJvdmFudCBzaSBoaSBoYSBhY3R1YWxpdHphY2lvbnMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX2xvYWRpbmciIG1zZ2lkPSI4NjExMzM5MTQ5ODI1MDQ3NDQ2Ij4iU1wnZXN0w6AgY2FycmVnYW50Li4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWFpbl9kaWN0X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMTY3OTk2NDMwNjk4MDA5ODU3MCI+IkRpY2Npb25hcmkgcHJpbmNpcGFsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsIiBtc2dpZD0iNTU4NjUzMTczNjYwOTE4MzMwNCI+IkNhbmNlbMK3bGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJpbnN0YWxsX2RpY3QiIG1zZ2lkPSI1NTI1MDA1NTI0Njk3NjA3ODY1Ij4iSW5zdGFswrdsYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbF9kb3dubG9hZF9kaWN0IiBtc2dpZD0iNzE2MzE3MzY1MDI5ODgzODM2NyI+IkNhbmNlbMK3bGEgbGEgYmFpeGFkYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpc2FibGVfZGljdCIgbXNnaWQ9Ijc2ODU4MTAwNDAyMzY0OTc3MDAiPiJEZXNhY3RpdmEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlbmFibGVfZGljdCIgbXNnaWQ9IjM4NDgxNzk3ODQ3MDI0NzM2ODAiPiJBY3RpdmEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfZGljdCIgbXNnaWQ9IjU4MTcxNTkyOTA1MDM4NDM3NjYiPiJTdXByaW1laXgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzaG91bGRfZG93bmxvYWRfb3Zlcl9tZXRlcmVkX3Byb21wdCIgbXNnaWQ9IjQ5NjUyNjQ4NDkwNTc2NTY1MjEiPiJMXCdpZGlvbWEgc2VsZWNjaW9uYXQgYWwgdGV1IGRpc3Bvc2l0aXUgbcOyYmlsIHTDqSB1biBkaWNjaW9uYXJpIGRpc3BvbmlibGUuJmx0O2JyLyZndDsgRXQgcmVjb21hbmVtIHF1ZSAmbHQ7YiZndDtiYWl4aXMmbHQ7L2ImZ3Q7IGVsIGRpY2Npb25hcmkgZGUgPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPiBwZXIgbWlsbG9yYXIgbGEgdGV2YSBleHBlcmnDqG5jaWEgZFwnZXNjcmlwdHVyYS4mbHQ7YnIvJmd0OyAmbHQ7YnIvJmd0OyBMYSBiYWl4YWRhIHBvdCB0cmlnYXIgdW4gcGFyZWxsIGRlIG1pbnV0cyBtaXRqYW7Dp2FudCAzRy4gw4lzIHBvc3NpYmxlIHF1ZSBzXCdhcGxpcXVpbiBjw6BycmVjcyBzaSBubyB0ZW5zIHVuICZsdDtiJmd0O3BsYSBkZSBkYWRlcyBpbMK3bGltaXRhdCZsdDsvYiZndDsuJmx0O2JyLyZndDsgU2kgbm8gZXN0w6BzIHNlZ3VyIGRlIHF1aW4gcGxhIGRlIGRhZGVzIHRlbnMsIGV0IHJlY29tYW5lbSBxdWUgY2VycXVpcyB1bmEgY29ubmV4acOzIFdpLUZpIHBlciBjb21lbsOnYXIgbGEgYmFpeGFkYSBhdXRvbcOgdGljYW1lbnQuJmx0O2JyLyZndDsgJmx0O2JyLyZndDsgQ29uc2VsbDogUG90cyBiYWl4YXIgaSBlbGltaW5hciBkaWNjaW9uYXJpcyBzaSB2YXMgYSBsYSBzZWNjacOzICZsdDtiJmd0O0lkaW9tYSBpIGVudHJhZGEmbHQ7L2ImZ3Q7IGRlbCBtZW7DuiAmbHQ7YiZndDtDb25maWd1cmFjacOzJmx0Oy9iJmd0OyBkZWwgZGlzcG9zaXRpdSBtw7JiaWwuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfb3Zlcl9tZXRlcmVkIiBtc2dpZD0iNDAyNDAxMzc2NDkzNzg1MDA2MSI+IkJhaXhhIGFyYSAoPHhsaWZmOmcgaWQ9IlNJWkVfSU5fTUVHQUJZVEVTIj4lMSQuMWY8L3hsaWZmOmc+IE1CKSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRvX25vdF9kb3dubG9hZF9vdmVyX21ldGVyZWQiIG1zZ2lkPSI2OTYzNzcwODg1MDMzNzY1Mzc4Ij4iQmFpeGEgbWl0amFuw6dhbnQgV2ktRmkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0NTYwNTc2Mzc5NjgwNjYwMDQ3Ij4iSGkgaGEgdW4gZGljY2lvbmFyaSBkaXNwb25pYmxlIHBlciBhIGxcJ2lkaW9tYTogPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM1NTUxNTM4MTI4NTMxNzgzMiI+IlByZW0gcGVyIG9waW5hciBpIHBlciBiYWl4YXIiPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbAppbmRleCBiOTI0ZGFkLi41MDNjZTFiIDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMtY3Mvc3RyaW5ncy54bWwKKysrIGIvamF2YS9yZXMvdmFsdWVzLWNzL3N0cmluZ3MueG1sCkBAIC0xNzAsNCArMTcwLDM5IEBACiAgICAgPHN0cmluZyBuYW1lPSJidXR0b25fZGVmYXVsdCIgbXNnaWQ9IjM5ODgwMTc4NDA0MzE4ODE0OTEiPiJWw71jaG96w60iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYW5ndWFnZV9zZXR0aW5ncyIgbXNnaWQ9IjE2NzExNTMwNTMyMDE4MDkwMzEiPiJKYXp5ayBhIHphZMOhdsOhbsOtIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0X2lucHV0X21ldGhvZCIgbXNnaWQ9IjQzMDE2MDIzNzQ2MDkyNzUwMDMiPiJWw71ixJtyIG1ldG9keSB6YWTDoXbDoW7DrSBkYXQiPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9uYW1lIiBtc2dpZD0iMTAxNzA1ODE4NjMyMjcxNDQwNSI+IlBvc2t5dG92YXRlbCBzbG92bsOta3UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3Byb3ZpZGVyX25hbWUiIG1zZ2lkPSI3NzEwNDE1NTk5MzcxMTYxMDkyIj4iUG9za3l0b3ZhdGVsIHNsb3Zuw61rdSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2VydmljZV9uYW1lIiBtc2dpZD0iNTUxNjUwNjk3MzQ4MjAyMDU2Ij4iU2x1xb5iYSBzbG92bsOta3UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiJJbmZvcm1hY2UgbyBha3R1YWxpemFjaSBzbG92bsOta3UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3RpdGxlIiBtc2dpZD0iNzI0MzkzMDk2Nzg0NTAyMDQwNyI+IkRvcGzFiGtvdsOpIHNsb3Zuw61reSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbF9vdmVyX21ldGVyZWRfbmV0d29ya19wcm9tcHQiIG1zZ2lkPSIzNjQyNjM0NjIzNDY1MzQ5NzE2Ij4iSmUgayBkaXNwb3ppY2kgc2xvdm7DrWsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4iTmFzdGF2ZW7DrSBwcm8gc2xvdm7DrWt5Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNlcl9kaWN0aW9uYXJpZXMiIG1zZ2lkPSI3NTE5NzM2MjMyNDIzOTI5MTI0Ij4iVcW+aXZhdGVsc2vDqSBzbG92bsOta3kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X3VzZXJfZGljdF9wcmVmX25hbWUiIG1zZ2lkPSI1MjIxMjUxNTI3NTc2MDc3OTAiPiJVxb5pdmF0ZWxza8O9IHNsb3Zuw61rIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9hdmFpbGFibGUiIG1zZ2lkPSIzMTkyOTIwNjA4NTIwNjE4MDgzIj4iSyBkaXNwb3ppY2kgamUgc2xvdm7DrWsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rvd25sb2FkaW5nIiBtc2dpZD0iODU5NDk3NDc2MjY2MzA5NTk2Ij4iQWt0dcOhbG7DrSBzdGFob3bDoW7DrSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbGVkIiBtc2dpZD0iNjQyNTU4Njg5OTY3MTM3ODE2MCI+Ik5haW5zdGFsb3bDoW5vIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kaXNhYmxlZCIgbXNnaWQ9IjM0NDg1NzEyODA0OTA3NDYwMzIiPiJOYWluc3RhbG92w6FubywgemFrw6F6w6FubyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiJQcm9ibC4gcyBwxZlpcC4gayBzbC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19kaWN0aW9uYXJpZXNfYXZhaWxhYmxlIiBtc2dpZD0iNTIwNjIyNTA3Nzk0NTYzNzgxMCI+IsW9w6FkbsOpIHNsb3Zuw61reSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNoZWNrX2Zvcl91cGRhdGVzX25vdyIgbXNnaWQ9IjY0MjA1Nzk4NjEyNzYyNDk4NiI+IkFrdHVhbGl6b3ZhdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imxhc3RfdXBkYXRlIiBtc2dpZD0iMzEwMTU0OTcxOTgyNzYwMDM0NiI+IlBvc2xlZG7DrSBha3R1YWxpemFjZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfdXBkYXRpbmciIG1zZ2lkPSI4MjAxODYyNzY3MDQxMzQ3MjAiPiJLb250cm9sYSBha3R1YWxpemFjw60iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX2xvYWRpbmciIG1zZ2lkPSI4NjExMzM5MTQ5ODI1MDQ3NDQ2Ij4iTmHEjcOtdMOhbsOtLi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWFpbl9kaWN0X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMTY3OTk2NDMwNjk4MDA5ODU3MCI+IkhsYXZuw60gc2xvdm7DrWsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWwiIG1zZ2lkPSI1NTg2NTMxNzM2NjA5MTgzMzA0Ij4iWnJ1xaFpdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imluc3RhbGxfZGljdCIgbXNnaWQ9IjU1MjUwMDU1MjQ2OTc2MDc4NjUiPiJOYWluc3RhbG92YXQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWxfZG93bmxvYWRfZGljdCIgbXNnaWQ9IjcxNjMxNzM2NTAyOTg4MzgzNjciPiJacnXFoWl0IHN0YWhvdsOhbsOtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWJsZV9kaWN0IiBtc2dpZD0iNzY4NTgxMDA0MDIzNjQ5NzcwMCI+Ilpha8OhemF0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZW5hYmxlX2RpY3QiIG1zZ2lkPSIzODQ4MTc5Nzg0NzAyNDczNjgwIj4iUG92b2xpdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlbGV0ZV9kaWN0IiBtc2dpZD0iNTgxNzE1OTI5MDUwMzg0Mzc2NiI+IlNtYXphdCI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaG91bGRfZG93bmxvYWRfb3Zlcl9tZXRlcmVkX3Byb21wdCAoNDk2NTI2NDg0OTA1NzY1NjUyMSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb3dubG9hZF9vdmVyX21ldGVyZWQgKDQwMjQwMTM3NjQ5Mzc4NTAwNjEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZG9fbm90X2Rvd25sb2FkX292ZXJfbWV0ZXJlZCAoNjk2Mzc3MDg4NTAzMzc2NTM3OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ1NjA1NzYzNzk2ODA2NjAwNDciPiJKZSBrIGRpc3BvemljaSBzbG92bsOtayBwcm8gamF6eWsgPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM1NTUxNTM4MTI4NTMxNzgzMiI+IlN0aXNrbnV0w61tIHprb250cm9sdWpldGUgYSBzdMOhaG5ldGUiPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1kYS9zdHJpbmdzLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1kYS9zdHJpbmdzLnhtbAppbmRleCBlOTAzNDRhLi5hZjQ3MmY3IDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMtZGEvc3RyaW5ncy54bWwKKysrIGIvamF2YS9yZXMvdmFsdWVzLWRhL3N0cmluZ3MueG1sCkBAIC0xNzAsNCArMTcwLDM2IEBACiAgICAgPHN0cmluZyBuYW1lPSJidXR0b25fZGVmYXVsdCIgbXNnaWQ9IjM5ODgwMTc4NDA0MzE4ODE0OTEiPiJTdGFuZGFyZCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxhbmd1YWdlX3NldHRpbmdzIiBtc2dpZD0iMTY3MTE1MzA1MzIwMTgwOTAzMSI+IlNwcm9nIG9nIGlucHV0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0X2lucHV0X21ldGhvZCIgbXNnaWQ9IjQzMDE2MDIzNzQ2MDkyNzUwMDMiPiJWw6ZsZyBpbnB1dG1ldG9kZSI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4iRGljdGlvbmFyeSBQcm92aWRlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfcHJvdmlkZXJfbmFtZSIgbXNnaWQ9Ijc3MTA0MTU1OTkzNzExNjEwOTIiPiJEaWN0aW9uYXJ5IFByb3ZpZGVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXJ2aWNlX25hbWUiIG1zZ2lkPSI1NTE2NTA2OTczNDgyMDIwNTYiPiJPcmRib2dzdGplbmVzdGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiJPcGRhdGVyaW5nc29wbHlzbmluZ2VyIGZvciBvcmRiw7hnZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3RpdGxlIiBtc2dpZD0iNzI0MzkzMDk2Nzg0NTAyMDQwNyI+IlRpbGzDpmdzb3JkYsO4Z2VyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsX292ZXJfbWV0ZXJlZF9uZXR3b3JrX3Byb21wdCIgbXNnaWQ9IjM2NDI2MzQ2MjM0NjUzNDk3MTYiPiJEZXIgZXIgZW4gdGlsZ8OmbmdlbGlnIG9yZGJvZyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3Nfc3VtbWFyeSIgbXNnaWQ9Ijg1OTk2Nzk0MzQ3OTk3NDkwNTMiPiJJbmRzdGlsbGluZ2VyIGZvciBvcmRiw7hnZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2VyX2RpY3Rpb25hcmllcyIgbXNnaWQ9Ijc1MTk3MzYyMzI0MjM5MjkxMjQiPiJCcnVnZXJvcmRiw7hnZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X3VzZXJfZGljdF9wcmVmX25hbWUiIG1zZ2lkPSI1MjIxMjUxNTI3NTc2MDc3OTAiPiJCcnVnZXJvcmRib2ciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiJPcmRib2cgZXIgdGlsZ8OmbmdlbGlnIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kb3dubG9hZGluZyIgbXNnaWQ9Ijg1OTQ5NzQ3NjI2NjMwOTU5NiI+IkRvd25sb2FkZXIgaSDDuGplYmxpa2tldCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbGVkIiBtc2dpZD0iNjQyNTU4Njg5OTY3MTM3ODE2MCI+Ikluc3RhbGxlcmV0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kaXNhYmxlZCIgbXNnaWQ9IjM0NDg1NzEyODA0OTA3NDYwMzIiPiJJbnN0YWxsZXJldCwgZGVha3RpdmVyZXQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5ub3RfY29ubmVjdF90b19kaWN0X3NlcnZpY2UiIG1zZ2lkPSI2ODc1NjY1NDk0NzI2MzAwNDI3Ij4iVWRlbiBvcmRib2dzdGplbmVzdGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19kaWN0aW9uYXJpZXNfYXZhaWxhYmxlIiBtc2dpZD0iNTIwNjIyNTA3Nzk0NTYzNzgxMCI+IkluZ2VuIHRpbGcuIG9yZGLDuGdlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNoZWNrX2Zvcl91cGRhdGVzX25vdyIgbXNnaWQ9IjY0MjA1Nzk4NjEyNzYyNDk4NiI+Ik9wZGF0ZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsYXN0X3VwZGF0ZSIgbXNnaWQ9IjMxMDE1NDk3MTk4Mjc2MDAzNDYiPiJTaWRzdCBvcGRhdGVyZXQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX3VwZGF0aW5nIiBtc2dpZD0iODIwMTg2Mjc2NzA0MTM0NzIwIj4iU8O4Z2VyIGVmdGVyIG9wZGF0ZXJpbmdlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfbG9hZGluZyIgbXNnaWQ9Ijg2MTEzMzkxNDk4MjUwNDc0NDYiPiJJbmRsw6ZzZXIuLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtYWluX2RpY3RfZGVzY3JpcHRpb24iIG1zZ2lkPSIxNjc5OTY0MzA2OTgwMDk4NTcwIj4iSG92ZWRvcmRib2ciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWwiIG1zZ2lkPSI1NTg2NTMxNzM2NjA5MTgzMzA0Ij4iQW5udWxsZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJpbnN0YWxsX2RpY3QiIG1zZ2lkPSI1NTI1MDA1NTI0Njk3NjA3ODY1Ij4iSW5zdGFsbGVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsX2Rvd25sb2FkX2RpY3QiIG1zZ2lkPSI3MTYzMTczNjUwMjk4ODM4MzY3Ij4iQW5udWxsZXIgZG93bmxvYWQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaXNhYmxlX2RpY3QiIG1zZ2lkPSI3Njg1ODEwMDQwMjM2NDk3NzAwIj4iRGVha3RpdmVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZW5hYmxlX2RpY3QiIG1zZ2lkPSIzODQ4MTc5Nzg0NzAyNDczNjgwIj4iQWt0aXbDqXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfZGljdCIgbXNnaWQ9IjU4MTcxNTkyOTA1MDM4NDM3NjYiPiJTbGV0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQiIG1zZ2lkPSI0OTY1MjY0ODQ5MDU3NjU2NTIxIj4iRGV0IHZhbGd0ZSBzcHJvZyBww6UgZGluIG1vYmlsZW5oZWQgaGFyIGVuIHRpbGfDpm5nZWxpZyBvcmRib2cuJmx0O2JyLyZndDsgVmkgYW5iZWZhbGVyLCBhdCBkdSAgJmx0O2ImZ3Q7ZG93bmxvYWRlciZsdDsvYiZndDsgPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPi1vcmRib2dlbiBmb3IgYXQgZm9yYmVkcmUgZGluIHNrcml2ZW9wbGV2ZWxzZS4mbHQ7YnIvJmd0OyAmbHQ7YnIvJmd0OyBEb3dubG9hZGVuIGthbiB0YWdlIDEtMiBtaW51dHRlciB2aWEgM0cuIERlciBibGl2ZXIgbXVsaWd2aXMgb3BrcsOmdmV0IGFmZ2lmdGVyLCBodmlzIGR1IGlra2UgaGFyIGV0ICZsdDtiJmd0O3ViZWdyw6Zuc2V0IGRhdGFhYm9ubmVtZW50Jmx0Oy9iJmd0Oy4mbHQ7YnIvJmd0Oy4gSHZpcyBkdSBpa2tlIGVyIHNpa2tlciBww6UsIGh2aWxrZXQgZGF0YWFib25uZW10IGR1IGhhciwgYW5iZWZhbGVyIHZpLCBhdCBkdSBmaW5kZXIgZW4gV2ktRmktZm9yYmluZGVsc2UgZm9yIGF0IHN0YXJ0ZSBhdXRvbWF0aXNrIGRvd25sb2FkLiZsdDtici8mZ3Q7ICZsdDtici8mZ3Q7VGlwOiBEdSBrYW4gZG93bmxvYWRlIG9nIGZqZXJuZSBvcmRiw7hnZXIgdmVkIGF0IGfDpSB0aWwgJmx0O2ImZ3Q7U3Byb2cgb2cgaW5wdXQgJmx0Oy9iJmd0OyBpIG1lbnVlbiAmbHQ7YiZndDtJbmRzdGlsbGluZ2VyJmx0Oy9iJmd0OyBww6UgZGluIG1vYmlsZW5oZWQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfb3Zlcl9tZXRlcmVkIiBtc2dpZD0iNDAyNDAxMzc2NDkzNzg1MDA2MSI+IkRvd25sb2FkIG51ICg8eGxpZmY6ZyBpZD0iU0laRV9JTl9NRUdBQllURVMiPiUxJC4xZjwveGxpZmY6Zz4gTUIpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG9fbm90X2Rvd25sb2FkX292ZXJfbWV0ZXJlZCIgbXNnaWQ9IjY5NjM3NzA4ODUwMzM3NjUzNzgiPiJEb3dubG9hZCB2aWEgV2ktRmkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0NTYwNTc2Mzc5NjgwNjYwMDQ3Ij4iRGVyIGVyIGVuIHRpbGfDpm5nZWxpZyBvcmRib2cgZm9yIDx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24iIG1zZ2lkPSIzNTU1MTUzODEyODUzMTc4MzIiPiJUcnlrIGZvciBhdCBnZW5uZW1nw6Ugb2cgZG93bmxvYWRlIjwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMtZGUvc3RyaW5ncy54bWwgYi9qYXZhL3Jlcy92YWx1ZXMtZGUvc3RyaW5ncy54bWwKaW5kZXggY2U2MjBmMC4uN2VmM2QwMCAxMDA2NDQKLS0tIGEvamF2YS9yZXMvdmFsdWVzLWRlL3N0cmluZ3MueG1sCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1kZS9zdHJpbmdzLnhtbApAQCAtMTcwLDQgKzE3MCwzNiBAQAogICAgIDxzdHJpbmcgbmFtZT0iYnV0dG9uX2RlZmF1bHQiIG1zZ2lkPSIzOTg4MDE3ODQwNDMxODgxNDkxIj4iU3RhbmRhcmQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYW5ndWFnZV9zZXR0aW5ncyIgbXNnaWQ9IjE2NzExNTMwNTMyMDE4MDkwMzEiPiJTcHJhY2hlICZhbXA7IEVpbmdhYmUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RfaW5wdXRfbWV0aG9kIiBtc2dpZD0iNDMwMTYwMjM3NDYwOTI3NTAwMyI+IkVpbmdhYmVtZXRob2RlIHfDpGhsZW4iPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9uYW1lIiBtc2dpZD0iMTAxNzA1ODE4NjMyMjcxNDQwNSI+IlfDtnJ0ZXJidWNoYmVyZWl0c3RlbGx1bmciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3Byb3ZpZGVyX25hbWUiIG1zZ2lkPSI3NzEwNDE1NTk5MzcxMTYxMDkyIj4iV8O2cnRlcmJ1Y2hiZXJlaXRzdGVsbHVuZyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2VydmljZV9uYW1lIiBtc2dpZD0iNTUxNjUwNjk3MzQ4MjAyMDU2Ij4iV8O2cnRlcmJ1Y2giPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiJVcGRhdGUtSW5mb3JtYXRpb25lbiBmw7xyIFfDtnJ0ZXJidWNoIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc190aXRsZSIgbXNnaWQ9IjcyNDM5MzA5Njc4NDUwMjA0MDciPiJFcndlaXRlcnRlIFfDtnJ0ZXJiw7xjaGVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsX292ZXJfbWV0ZXJlZF9uZXR3b3JrX3Byb21wdCIgbXNnaWQ9IjM2NDI2MzQ2MjM0NjUzNDk3MTYiPiJXw7ZydGVyYnVjaCB2ZXJmw7xnYmFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc19zdW1tYXJ5IiBtc2dpZD0iODU5OTY3OTQzNDc5OTc0OTA1MyI+IkVpbnN0ZWxsdW5nZW4gZsO8ciBXw7ZydGVyYsO8Y2hlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzZXJfZGljdGlvbmFyaWVzIiBtc2dpZD0iNzUxOTczNjIzMjQyMzkyOTEyNCI+Ik1laW5lIFfDtnJ0ZXJiw7xjaGVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4iTWVpbiBXw7ZydGVyYnVjaCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfYXZhaWxhYmxlIiBtc2dpZD0iMzE5MjkyMDYwODUyMDYxODA4MyI+IlfDtnJ0ZXJidWNoIHZlcmbDvGdiYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rvd25sb2FkaW5nIiBtc2dpZD0iODU5NDk3NDc2MjY2MzA5NTk2Ij4iQWt0dWVsbGUgRG93bmxvYWRzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsZWQiIG1zZ2lkPSI2NDI1NTg2ODk5NjcxMzc4MTYwIj4iSW5zdGFsbGllcnQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rpc2FibGVkIiBtc2dpZD0iMzQ0ODU3MTI4MDQ5MDc0NjAzMiI+Ikluc3RhbGxpZXJ0LCBkZWFrdGl2aWVydCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiJLZWluIFfDtnJ0ZXJidWNoZGllbnN0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZGljdGlvbmFyaWVzX2F2YWlsYWJsZSIgbXNnaWQ9IjUyMDYyMjUwNzc5NDU2Mzc4MTAiPiJLZWluZSBXw7ZydGVyYsO8Y2hlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNoZWNrX2Zvcl91cGRhdGVzX25vdyIgbXNnaWQ9IjY0MjA1Nzk4NjEyNzYyNDk4NiI+IkFrdHVhbGlzaWVyZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsYXN0X3VwZGF0ZSIgbXNnaWQ9IjMxMDE1NDk3MTk4Mjc2MDAzNDYiPiJadWxldHp0IGFrdHVhbGlzaWVydCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfdXBkYXRpbmciIG1zZ2lkPSI4MjAxODYyNzY3MDQxMzQ3MjAiPiJTdWNoZSBuYWNoIFVwZGF0ZXMuLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX2xvYWRpbmciIG1zZ2lkPSI4NjExMzM5MTQ5ODI1MDQ3NDQ2Ij4iV2lyZCBnZWxhZGVuLi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWFpbl9kaWN0X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMTY3OTk2NDMwNjk4MDA5ODU3MCI+IkFsbGdlbWVpbmVzIFfDtnJ0ZXJidWNoIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsIiBtc2dpZD0iNTU4NjUzMTczNjYwOTE4MzMwNCI+IkFiYnJlY2hlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imluc3RhbGxfZGljdCIgbXNnaWQ9IjU1MjUwMDU1MjQ2OTc2MDc4NjUiPiJJbnN0YWxsaWVyZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWxfZG93bmxvYWRfZGljdCIgbXNnaWQ9IjcxNjMxNzM2NTAyOTg4MzgzNjciPiJEb3dubG9hZCBhYmJyZWNoZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaXNhYmxlX2RpY3QiIG1zZ2lkPSI3Njg1ODEwMDQwMjM2NDk3NzAwIj4iRGVha3RpdmllcmVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZW5hYmxlX2RpY3QiIG1zZ2lkPSIzODQ4MTc5Nzg0NzAyNDczNjgwIj4iQWt0aXZpZXJlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlbGV0ZV9kaWN0IiBtc2dpZD0iNTgxNzE1OTI5MDUwMzg0Mzc2NiI+IkzDtnNjaGVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQiIG1zZ2lkPSI0OTY1MjY0ODQ5MDU3NjU2NTIxIj4iRsO8ciBkaWUgYXVmIGRlbSBNb2JpbGdlcsOkdCBhdXNnZXfDpGhsdGUgU3ByYWNoZSBpc3QgZWluIFfDtnJ0ZXJidWNoIHZlcmbDvGdiYXIuJmx0O2JyLyZndDsgJmx0O2ImZ3Q7TGFkZW4gU2llIGRhcyA8eGxpZmY6ZyBpZD0iTEFOR1VBR0UiPiUxJHM8L3hsaWZmOmc+LVfDtnJ0ZXJidWNoIGhlcnVudGVyJmx0Oy9iJmd0OyB1bmQgdmVyYmVzc2VybiBTaWUgSWhyZSBFaW5nYWJlZXJmYWhydW5nLiZsdDtici8mZ3Q7ICZsdDtici8mZ3Q7RGVyIERvd25sb2FkIMO8YmVyIDNHIGthbm4gZWluIGJpcyB6d2VpIE1pbnV0ZW4gZGF1ZXJuLiBGYWxscyBTaWUga2VpbmUgJmx0O2ImZ3Q7RGF0ZW5mbGF0cmF0ZSZsdDsvYiZndDsgaGFiZW4sIGZhbGxlbiBldmVudHVlbGwgR2Viw7xocmVuIGFuLiZsdDtici8mZ3Q7IFNvbGx0ZW4gU2llIHNpY2ggbmljaHQgc2ljaGVyIHNlaW4sIHdlbGNoZW4gRGF0ZW50YXJpZiBTaWUgaGFiZW4sIHN1Y2hlbiBTaWUgZWluZSBXTEFOLVZlcmJpbmR1bmcsIHVtIGRlbiBEb3dubG9hZCBhdXRvbWF0aXNjaCB6dSBzdGFydGVuLiZsdDtici8mZ3Q7ICZsdDtici8mZ3Q7VGlwcDogSW0gTWVuw7wgJmx0O2ImZ3Q7RWluc3RlbGx1bmdlbiZsdDsvYiZndDsgSWhyZXMgTW9iaWxnZXLDpHRzIGvDtm5uZW4gU2llIHVudGVyICZsdDtiJmd0O1NwcmFjaGUgJmFtcDsgRWluZ2FiZSZsdDsvYiZndDsgV8O2cnRlcmLDvGNoZXIgaGVydW50ZXJsYWRlbiB1bmQgZW50ZmVybmVuLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRvd25sb2FkX292ZXJfbWV0ZXJlZCIgbXNnaWQ9IjQwMjQwMTM3NjQ5Mzc4NTAwNjEiPiJKZXR6dCBoZXJ1bnRlcmxhZGVuICg8eGxpZmY6ZyBpZD0iU0laRV9JTl9NRUdBQllURVMiPiUxJC4xZjwveGxpZmY6Zz4gTUIpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG9fbm90X2Rvd25sb2FkX292ZXJfbWV0ZXJlZCIgbXNnaWQ9IjY5NjM3NzA4ODUwMzM3NjUzNzgiPiLDnGJlciBXTEFOIGhlcnVudGVybGFkZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0NTYwNTc2Mzc5NjgwNjYwMDQ3Ij4iRXMgaXN0IGVpbiBXw7ZydGVyYnVjaCBmw7xyIDx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4gdmVyZsO8Z2Jhci4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24iIG1zZ2lkPSIzNTU1MTUzODEyODUzMTc4MzIiPiJadW0gTGVzZW4gdW5kIEhlcnVudGVybGFkZW4gZHLDvGNrZW4iPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1lbC9zdHJpbmdzLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1lbC9zdHJpbmdzLnhtbAppbmRleCBhZjIzMWI0Li43NGZmY2Y5IDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMtZWwvc3RyaW5ncy54bWwKKysrIGIvamF2YS9yZXMvdmFsdWVzLWVsL3N0cmluZ3MueG1sCkBAIC0xNzAsNCArMTcwLDM5IEBACiAgICAgPHN0cmluZyBuYW1lPSJidXR0b25fZGVmYXVsdCIgbXNnaWQ9IjM5ODgwMTc4NDA0MzE4ODE0OTEiPiLOoM+Bzr/Otc+AzrnOu86/zrPOriI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxhbmd1YWdlX3NldHRpbmdzIiBtc2dpZD0iMTY3MTE1MzA1MzIwMTgwOTAzMSI+Is6TzrvPjs+Dz4POsSDOus6xzrkgzrXOuc+DzrHOs8+JzrPOriI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdF9pbnB1dF9tZXRob2QiIG1zZ2lkPSI0MzAxNjAyMzc0NjA5Mjc1MDAzIj4izpXPgM65zrvOv86zzq4gzrzOtc64z4zOtM6/z4UgzrXOuc+DzrHOs8+JzrPOrs+CIjwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJhcHBfbmFtZSIgbXNnaWQ9IjEwMTcwNTgxODYzMjI3MTQ0MDUiPiLOoM6xz4HOv8+Hzq3Osc+CIM67zrXOvs65zrrOv8+NIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9wcm92aWRlcl9uYW1lIiBtc2dpZD0iNzcxMDQxNTU5OTM3MTE2MTA5MiI+Is6gzrHPgc6/z4fOrc6xz4IgzrvOtc6+zrnOus6/z40iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NlcnZpY2VfbmFtZSIgbXNnaWQ9IjU1MTY1MDY5NzM0ODIwMjA1NiI+Is6lz4DOt8+BzrXPg86vzrEgzrvOtc6+zrnOus6/z40iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiLOlc69zrfOvM6tz4HPic+Dzrcgz4DOu863z4HOv8+Gzr/Pgc65z47OvSDOu861zr7Ouc66zr/PjSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3NfdGl0bGUiIG1zZ2lkPSI3MjQzOTMwOTY3ODQ1MDIwNDA3Ij4izqDPgc+Mz4POuM61z4TOsSDOu861zr7Ouc66zqwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxfb3Zlcl9tZXRlcmVkX25ldHdvcmtfcHJvbXB0IiBtc2dpZD0iMzY0MjYzNDYyMzQ2NTM0OTcxNiI+Is6UzrnOsc64zq3Pg865zrzOvyDOu861zr7Ouc66z4wiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4izqHPhc64zrzOr8+DzrXOuc+CIM6zzrnOsSDOu861zr7Ouc66zqwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2VyX2RpY3Rpb25hcmllcyIgbXNnaWQ9Ijc1MTk3MzYyMzI0MjM5MjkxMjQiPiLOm861zr7Ouc66zqwgz4fPgc6uz4PPhM63Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4izpvOtc6+zrnOus+MIM+Hz4HOrs+Dz4TOtyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfYXZhaWxhYmxlIiBtc2dpZD0iMzE5MjkyMDYwODUyMDYxODA4MyI+Is6UzrnOsc64zq3Pg865zrzOvyDOu861zr7Ouc66z4wiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rvd25sb2FkaW5nIiBtc2dpZD0iODU5NDk3NDc2MjY2MzA5NTk2Ij4izpvOrs+IzrcgzrHPhc+Ezq7OvSDPhM63IM+Dz4TOuc6zzrzOriI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbGVkIiBtc2dpZD0iNjQyNTU4Njg5OTY3MTM3ODE2MCI+Is6VzrPOus6xz4TOtc+Dz4TOt868zq3Ovc6/Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kaXNhYmxlZCIgbXNnaWQ9IjM0NDg1NzEyODA0OTA3NDYwMzIiPiLOlc6zzrrOsc+EzrHPg8+EzqzOuM63zrrOtSwgzrHPgM61zr3Otc+BzrPOv8+Azr/Ouc6uzrjOt866zrUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5ub3RfY29ubmVjdF90b19kaWN0X3NlcnZpY2UiIG1zZ2lkPSI2ODc1NjY1NDk0NzI2MzAwNDI3Ij4izqDPgc+MzrLOuy7Pg8+Nzr3OtC7Pg8+Ezr8gzrvOtc6+LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2RpY3Rpb25hcmllc19hdmFpbGFibGUiIG1zZ2lkPSI1MjA2MjI1MDc3OTQ1NjM3ODEwIj4izpTOtc69IM+Fz4DOrM+Bz4fOv8+Fzr0gzrTOuc6xzrjOrc+DzrnOvM6xIM67zrXOvs65zrrOrCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNoZWNrX2Zvcl91cGRhdGVzX25vdyIgbXNnaWQ9IjY0MjA1Nzk4NjEyNzYyNDk4NiI+Is6Rzr3Osc69zq3Pic+DzrciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsYXN0X3VwZGF0ZSIgbXNnaWQ9IjMxMDE1NDk3MTk4Mjc2MDAzNDYiPiLOpM61zrvOtc+Fz4TOsc6vzrEgzrXOvc63zrzOrc+Bz4nPg863Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV91cGRhdGluZyIgbXNnaWQ9IjgyMDE4NjI3NjcwNDEzNDcyMCI+Is6IzrvOtc6zz4fOv8+CIM6zzrnOsSDOtc69zrfOvM61z4HPjs+DzrXOuc+CIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV9sb2FkaW5nIiBtc2dpZD0iODYxMTMzOTE0OTgyNTA0NzQ0NiI+Is6mz4zPgc+Ez4nPg863Li4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWFpbl9kaWN0X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMTY3OTk2NDMwNjk4MDA5ODU3MCI+Is6az43Pgc65zr8gzrvOtc6+zrnOus+MIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsIiBtc2dpZD0iNTU4NjUzMTczNjYwOTE4MzMwNCI+Is6RzrrPjc+Bz4nPg863Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5zdGFsbF9kaWN0IiBtc2dpZD0iNTUyNTAwNTUyNDY5NzYwNzg2NSI+Is6VzrPOus6xz4TOrM+Dz4TOsc+DzrciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWxfZG93bmxvYWRfZGljdCIgbXNnaWQ9IjcxNjMxNzM2NTAyOTg4MzgzNjciPiLOkc66z43Pgc+Jz4POtyDOu86uz4jOt8+CIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWJsZV9kaWN0IiBtc2dpZD0iNzY4NTgxMDA0MDIzNjQ5NzcwMCI+Is6Rz4DOtc69zrXPgc6zzr/PgM6/zq/Ot8+DzrciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlbmFibGVfZGljdCIgbXNnaWQ9IjM4NDgxNzk3ODQ3MDI0NzM2ODAiPiLOlc69zrXPgc6zzr/PgM6/zq/Ot8+DzrciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfZGljdCIgbXNnaWQ9IjU4MTcxNTkyOTA1MDM4NDM3NjYiPiLOlM65zrHOs8+BzrHPhs6uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNob3VsZF9kb3dubG9hZF9vdmVyX21ldGVyZWRfcHJvbXB0ICg0OTY1MjY0ODQ5MDU3NjU2NTIxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvd25sb2FkX292ZXJfbWV0ZXJlZCAoNDAyNDAxMzc2NDkzNzg1MDA2MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb19ub3RfZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg2OTYzNzcwODg1MDMzNzY1Mzc4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDU2MDU3NjM3OTY4MDY2MDA0NyI+Is6lz4DOrM+Bz4fOtc65IM60zrnOsc64zq3Pg865zrzOvyDOu861zr7Ouc66z4wgzrPOuc6xIM+EzrEgPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM1NTUxNTM4MTI4NTMxNzgzMiI+Is6gzrHPhM6uz4PPhM61IM6zzrnOsSDOrc67zrXOs8+Hzr8gzrrOsc65IM67zq7PiM63Ijwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMtZW4tckdCL3N0cmluZ3MueG1sIGIvamF2YS9yZXMvdmFsdWVzLWVuLXJHQi9zdHJpbmdzLnhtbAppbmRleCA5ZTdkNjRmLi4zYmI3YmFiIDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMtZW4tckdCL3N0cmluZ3MueG1sCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1lbi1yR0Ivc3RyaW5ncy54bWwKQEAgLTE3MCw0ICsxNzAsMzYgQEAKICAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9kZWZhdWx0IiBtc2dpZD0iMzk4ODAxNzg0MDQzMTg4MTQ5MSI+IkRlZmF1bHQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYW5ndWFnZV9zZXR0aW5ncyIgbXNnaWQ9IjE2NzExNTMwNTMyMDE4MDkwMzEiPiJMYW5ndWFnZSAmYW1wOyBpbnB1dCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdF9pbnB1dF9tZXRob2QiIG1zZ2lkPSI0MzAxNjAyMzc0NjA5Mjc1MDAzIj4iQ2hvb3NlIGlucHV0IG1ldGhvZCI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4iRGljdGlvbmFyeSBQcm92aWRlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfcHJvdmlkZXJfbmFtZSIgbXNnaWQ9Ijc3MTA0MTU1OTkzNzExNjEwOTIiPiJEaWN0aW9uYXJ5IFByb3ZpZGVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXJ2aWNlX25hbWUiIG1zZ2lkPSI1NTE2NTA2OTczNDgyMDIwNTYiPiJEaWN0aW9uYXJ5IFNlcnZpY2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiJEaWN0aW9uYXJ5IHVwZGF0ZSBpbmZvcm1hdGlvbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3NfdGl0bGUiIG1zZ2lkPSI3MjQzOTMwOTY3ODQ1MDIwNDA3Ij4iQWRkLW9uIGRpY3Rpb25hcmllcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbF9vdmVyX21ldGVyZWRfbmV0d29ya19wcm9tcHQiIG1zZ2lkPSIzNjQyNjM0NjIzNDY1MzQ5NzE2Ij4iRGljdGlvbmFyeSBhdmFpbGFibGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4iU2V0dGluZ3MgZm9yIGRpY3Rpb25hcmllcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzZXJfZGljdGlvbmFyaWVzIiBtc2dpZD0iNzUxOTczNjIzMjQyMzkyOTEyNCI+IlVzZXIgZGljdGlvbmFyaWVzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4iVXNlciBkaWN0aW9uYXJ5Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9hdmFpbGFibGUiIG1zZ2lkPSIzMTkyOTIwNjA4NTIwNjE4MDgzIj4iRGljdGlvbmFyeSBhdmFpbGFibGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rvd25sb2FkaW5nIiBtc2dpZD0iODU5NDk3NDc2MjY2MzA5NTk2Ij4iQ3VycmVudGx5IGRvd25sb2FkaW5nIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsZWQiIG1zZ2lkPSI2NDI1NTg2ODk5NjcxMzc4MTYwIj4iSW5zdGFsbGVkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kaXNhYmxlZCIgbXNnaWQ9IjM0NDg1NzEyODA0OTA3NDYwMzIiPiJJbnN0YWxsZWQsIGRpc2FibGVkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2Fubm90X2Nvbm5lY3RfdG9fZGljdF9zZXJ2aWNlIiBtc2dpZD0iNjg3NTY2NTQ5NDcyNjMwMDQyNyI+IlByb2JsZW0gd2hpbGUgY29ubmVjdGluZyB0byBkaWN0aW9uYXJ5IHNlcnZpY2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19kaWN0aW9uYXJpZXNfYXZhaWxhYmxlIiBtc2dpZD0iNTIwNjIyNTA3Nzk0NTYzNzgxMCI+Ik5vIGRpY3Rpb25hcmllcyBhdmFpbGFibGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiJSZWZyZXNoIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibGFzdF91cGRhdGUiIG1zZ2lkPSIzMTAxNTQ5NzE5ODI3NjAwMzQ2Ij4iTGFzdCB1cGRhdGVkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV91cGRhdGluZyIgbXNnaWQ9IjgyMDE4NjI3NjcwNDEzNDcyMCI+IkNoZWNraW5nIGZvciB1cGRhdGVzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV9sb2FkaW5nIiBtc2dpZD0iODYxMTMzOTE0OTgyNTA0NzQ0NiI+IkxvYWRpbmcuLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtYWluX2RpY3RfZGVzY3JpcHRpb24iIG1zZ2lkPSIxNjc5OTY0MzA2OTgwMDk4NTcwIj4iTWFpbiBkaWN0aW9uYXJ5Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsIiBtc2dpZD0iNTU4NjUzMTczNjYwOTE4MzMwNCI+IkNhbmNlbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imluc3RhbGxfZGljdCIgbXNnaWQ9IjU1MjUwMDU1MjQ2OTc2MDc4NjUiPiJJbnN0YWxsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsX2Rvd25sb2FkX2RpY3QiIG1zZ2lkPSI3MTYzMTczNjUwMjk4ODM4MzY3Ij4iQ2FuY2VsIGRvd25sb2FkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWJsZV9kaWN0IiBtc2dpZD0iNzY4NTgxMDA0MDIzNjQ5NzcwMCI+IkRpc2FibGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlbmFibGVfZGljdCIgbXNnaWQ9IjM4NDgxNzk3ODQ3MDI0NzM2ODAiPiJFbmFibGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfZGljdCIgbXNnaWQ9IjU4MTcxNTkyOTA1MDM4NDM3NjYiPiJEZWxldGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzaG91bGRfZG93bmxvYWRfb3Zlcl9tZXRlcmVkX3Byb21wdCIgbXNnaWQ9IjQ5NjUyNjQ4NDkwNTc2NTY1MjEiPiJUaGUgc2VsZWN0ZWQgbGFuZ3VhZ2Ugb24geW91ciBtb2JpbGUgZGV2aWNlIGhhcyBhbiBhdmFpbGFibGUgZGljdGlvbmFyeS4mbHQ7YnIvJmd0OyBXZSByZWNvbW1lbmQgJmx0O2ImZ3Q7ZG93bmxvYWRpbmcmbHQ7L2ImZ3Q7IHRoZSA8eGxpZmY6ZyBpZD0iTEFOR1VBR0UiPiUxJHM8L3hsaWZmOmc+IGRpY3Rpb25hcnkgdG8gaW1wcm92ZSB5b3VyIHR5cGluZyBleHBlcmllbmNlLiZsdDtici8mZ3Q7ICZsdDtici8mZ3Q7IFRoZSBkb3dubG9hZCBjb3VsZCB0YWtlIGEgbWludXRlIG9yIHR3byBvdmVyIDNHLiBDaGFyZ2VzIG1heSBhcHBseSBpZiB5b3UgZG9uXCd0IGhhdmUgYW4gJmx0O2ImZ3Q7dW5saW1pdGVkIGRhdGEgcGxhbiZsdDsvYiZndDsuJmx0O2JyLyZndDsgSWYgeW91IGFyZSBub3Qgc3VyZSB3aGljaCBkYXRhIHBsYW4geW91IGhhdmUsIHdlIHJlY29tbWVuZCBmaW5kaW5nIGEgV2lmaSBjb25uZWN0aW9uIHRvIHN0YXJ0IHRoZSBkb3dubG9hZCBhdXRvbWF0aWNhbGx5LiZsdDtici8mZ3Q7ICZsdDtici8mZ3Q7IFRpcDogWW91IGNhbiBkb3dubG9hZCBhbmQgcmVtb3ZlIGRpY3Rpb25hcmllcyBieSBnb2luZyB0byAmbHQ7YiZndDtMYW5ndWFnZSAmYW1wOyBpbnB1dCZsdDsvYiZndDsgaW4gdGhlICZsdDtiJmd0O1NldHRpbmdzJmx0Oy9iJmd0OyBtZW51IG9mIHlvdXIgbW9iaWxlIGRldmljZS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9vdmVyX21ldGVyZWQiIG1zZ2lkPSI0MDI0MDEzNzY0OTM3ODUwMDYxIj4iRG93bmxvYWQgbm93ICg8eGxpZmY6ZyBpZD0iU0laRV9JTl9NRUdBQllURVMiPiUxJC4xZjwveGxpZmY6Zz5NQikiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb19ub3RfZG93bmxvYWRfb3Zlcl9tZXRlcmVkIiBtc2dpZD0iNjk2Mzc3MDg4NTAzMzc2NTM3OCI+IkRvd25sb2FkIG92ZXIgV2lmaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ1NjA1NzYzNzk2ODA2NjAwNDciPiJBIGRpY3Rpb25hcnkgaXMgYXZhaWxhYmxlIGZvciA8eGxpZmY6ZyBpZD0iTEFOR1VBR0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzU1NTE1MzgxMjg1MzE3ODMyIj4iUHJlc3MgdG8gcmV2aWV3IGFuZCBkb3dubG9hZCI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLWVzLXJVUy9zdHJpbmdzLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1lcy1yVVMvc3RyaW5ncy54bWwKaW5kZXggNTBiMjQ2MS4uMGQwYWExNCAxMDA2NDQKLS0tIGEvamF2YS9yZXMvdmFsdWVzLWVzLXJVUy9zdHJpbmdzLnhtbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtZXMtclVTL3N0cmluZ3MueG1sCkBAIC0xNzAsNCArMTcwLDM2IEBACiAgICAgPHN0cmluZyBuYW1lPSJidXR0b25fZGVmYXVsdCIgbXNnaWQ9IjM5ODgwMTc4NDA0MzE4ODE0OTEiPiJQcmVkZXRlcm1pbmFkbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxhbmd1YWdlX3NldHRpbmdzIiBtc2dpZD0iMTY3MTE1MzA1MzIwMTgwOTAzMSI+IlRlY2xhZG8gZSBpZGlvbWEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RfaW5wdXRfbWV0aG9kIiBtc2dpZD0iNDMwMTYwMjM3NDYwOTI3NTAwMyI+IlNlbGVjY2lvbmFyIG3DqXRvZG8gZGUgZW50cmFkYSI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4iUHJvdmVlZG9yIGRlIGRpY2Npb25hcmlvcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfcHJvdmlkZXJfbmFtZSIgbXNnaWQ9Ijc3MTA0MTU1OTkzNzExNjEwOTIiPiJQcm92ZWVkb3IgZGUgZGljY2lvbmFyaW9zIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXJ2aWNlX25hbWUiIG1zZ2lkPSI1NTE2NTA2OTczNDgyMDIwNTYiPiJTZXJ2aWNpbyBkZSBkaWNjaW9uYXJpb3MiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiJJbmZvcm1hY2nDs24gYWNlcmNhIGRlIGxhIGFjdHVhbGl6YWNpw7NuIGRlbCBkaWNjaW9uYXJpbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3NfdGl0bGUiIG1zZ2lkPSI3MjQzOTMwOTY3ODQ1MDIwNDA3Ij4iRGljY2lvbmFyaW9zIGNvbXBsZW1lbnRhcmlvcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbF9vdmVyX21ldGVyZWRfbmV0d29ya19wcm9tcHQiIG1zZ2lkPSIzNjQyNjM0NjIzNDY1MzQ5NzE2Ij4iRGljY2lvbmFyaW8gZGlzcG9uaWJsZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3Nfc3VtbWFyeSIgbXNnaWQ9Ijg1OTk2Nzk0MzQ3OTk3NDkwNTMiPiJDb25maWd1cmFjacOzbiBkZSBsb3MgZGljY2lvbmFyaW9zIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNlcl9kaWN0aW9uYXJpZXMiIG1zZ2lkPSI3NTE5NzM2MjMyNDIzOTI5MTI0Ij4iRGljY2lvbmFyaW9zIGRlbCB1c3VhcmlvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4iRGljY2lvbmFyaW8gZGVsIHVzdWFyaW8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiJEaWNjaW9uYXJpbyBkaXNwb25pYmxlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kb3dubG9hZGluZyIgbXNnaWQ9Ijg1OTQ5NzQ3NjI2NjMwOTU5NiI+IkRlc2NhcmdhIGVuIGN1cnNvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsZWQiIG1zZ2lkPSI2NDI1NTg2ODk5NjcxMzc4MTYwIj4iSW5zdGFsYWRvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kaXNhYmxlZCIgbXNnaWQ9IjM0NDg1NzEyODA0OTA3NDYwMzIiPiJJbnN0YWxhZG8sIGluaGFiaWxpdGFkbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiJFcnIuIGNvbmV4LiBjb24gZGljLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2RpY3Rpb25hcmllc19hdmFpbGFibGUiIG1zZ2lkPSI1MjA2MjI1MDc3OTQ1NjM3ODEwIj4iTm8gaGF5IGRpY2Npb25hcmlvcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiJBY3R1YWxpemFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibGFzdF91cGRhdGUiIG1zZ2lkPSIzMTAxNTQ5NzE5ODI3NjAwMzQ2Ij4iw5psdGltYSBhY3R1YWxpemFjacOzbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfdXBkYXRpbmciIG1zZ2lkPSI4MjAxODYyNzY3MDQxMzQ3MjAiPiJCdXNjYW5kbyBsYXMgYWN0dWFsaXphY2lvbmVzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV9sb2FkaW5nIiBtc2dpZD0iODYxMTMzOTE0OTgyNTA0NzQ0NiI+IkNhcmdhbmRv4oCmIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWFpbl9kaWN0X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMTY3OTk2NDMwNjk4MDA5ODU3MCI+IkRpY2Npb25hcmlvIHByaW5jaXBhbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbCIgbXNnaWQ9IjU1ODY1MzE3MzY2MDkxODMzMDQiPiJDYW5jZWxhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imluc3RhbGxfZGljdCIgbXNnaWQ9IjU1MjUwMDU1MjQ2OTc2MDc4NjUiPiJJbnN0YWxhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbF9kb3dubG9hZF9kaWN0IiBtc2dpZD0iNzE2MzE3MzY1MDI5ODgzODM2NyI+IkNhbmNlbGFyIGxhIGRlc2NhcmdhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWJsZV9kaWN0IiBtc2dpZD0iNzY4NTgxMDA0MDIzNjQ5NzcwMCI+IkluaGFiaWxpdGFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZW5hYmxlX2RpY3QiIG1zZ2lkPSIzODQ4MTc5Nzg0NzAyNDczNjgwIj4iQWN0aXZhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlbGV0ZV9kaWN0IiBtc2dpZD0iNTgxNzE1OTI5MDUwMzg0Mzc2NiI+IkVsaW1pbmFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQiIG1zZ2lkPSI0OTY1MjY0ODQ5MDU3NjU2NTIxIj4iSGF5IHVuIGRpY2Npb25hcmlvIGRpc3BvbmlibGUgcGFyYSBlbCBpZGlvbWEgc2VsZWNjaW9uYWRvIGVuIHR1IGRpc3Bvc2l0aXZvIG3Ds3ZpbC4mbHQ7YnIvJmd0OyBUZSByZWNvbWVuZGFtb3MgcXVlICZsdDtiJmd0O2Rlc2Nhcmd1ZXMmbHQ7L2ImZ3Q7IGVsIGRpY2Npb25hcmlvIGRlIDx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4gcGFyYSBtZWpvcmFyIHR1IGV4cGVyaWVuY2lhIGRlIGVzY3JpdHVyYS4mbHQ7YnIvJmd0OyAmbHQ7YnIvJmd0OyBMYSBkZXNjYXJnYSBwdWVkZSB0YXJkYXIgdW5vcyBtaW51dG9zIGVuIHJlZGVzIDNHLiBTaSBubyB0aWVuZXMgdW4gJmx0O2ImZ3Q7cGxhbiBkZSBkYXRvcyBpbGltaXRhZG8mbHQ7L2ImZ3Q7LCBlcyBwb3NpYmxlIHF1ZSBzZSBhcGxpcXVlbiBjYXJnb3MuJmx0O2JyLyZndDsgU2kgbm8gY29ub2NlcyBsYXMgY2FyYWN0ZXLDrXN0aWNhcyBkZSB0dSBwbGFuIGRlIGRhdG9zLCB0ZSByZWNvbWVuZGFtb3MgcXVlIHVzZXMgdW5hIGNvbmV4acOzbiBXaS1GaSBwYXJhIGluaWNpYXIgbGEgZGVzY2FyZ2EgYXV0b23DoXRpY2FtZW50ZS4mbHQ7YnIvJmd0OyAmbHQ7YnIvJmd0OyBTdWdlcmVuY2lhOiBQdWVkZXMgZGVzY2FyZ2FyIHkgZWxpbWluYXIgZGljY2lvbmFyaW9zIGVuIGxhIHNlY2Npw7NuICZsdDtiJmd0O0lkaW9tYSBlIGludHJvZHVjY2nDs24gZGUgdGV4dG8mbHQ7L2ImZ3Q7IGRlbCBtZW7DuiAmbHQ7YiZndDtBanVzdGVzJmx0Oy9iJmd0OyBkZWwgZGlzcG9zaXRpdm8gbcOzdmlsLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRvd25sb2FkX292ZXJfbWV0ZXJlZCIgbXNnaWQ9IjQwMjQwMTM3NjQ5Mzc4NTAwNjEiPiJEZXNjYXJnYXIgYWhvcmEgKCA8eGxpZmY6ZyBpZD0iU0laRV9JTl9NRUdBQllURVMiPiUxJC4xZjwveGxpZmY6Zz4gTUIpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG9fbm90X2Rvd25sb2FkX292ZXJfbWV0ZXJlZCIgbXNnaWQ9IjY5NjM3NzA4ODUwMzM3NjUzNzgiPiJEZXNjYXJnYXIgbWVkaWFudGUgV2ktRmkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0NTYwNTc2Mzc5NjgwNjYwMDQ3Ij4iSGF5IHVuIGRpY2Npb25hcmlvIGRpc3BvbmlibGUgZGUgPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24iIG1zZ2lkPSIzNTU1MTUzODEyODUzMTc4MzIiPiJQdWxzYSBwYXJhIGNvbnN1bHRhciB5IGRlc2NhcmdhciI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLWVzL3N0cmluZ3MueG1sIGIvamF2YS9yZXMvdmFsdWVzLWVzL3N0cmluZ3MueG1sCmluZGV4IDQyNDI3ZmUuLjk1ODQ2ZWYgMTAwNjQ0Ci0tLSBhL2phdmEvcmVzL3ZhbHVlcy1lcy9zdHJpbmdzLnhtbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtZXMvc3RyaW5ncy54bWwKQEAgLTE3MCw0ICsxNzAsMzYgQEAKICAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9kZWZhdWx0IiBtc2dpZD0iMzk4ODAxNzg0MDQzMTg4MTQ5MSI+IlByZWRldGVybWluYWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGFuZ3VhZ2Vfc2V0dGluZ3MiIG1zZ2lkPSIxNjcxMTUzMDUzMjAxODA5MDMxIj4iSWRpb21hIHkgZW50cmFkYSBkZSB0ZXh0byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdF9pbnB1dF9tZXRob2QiIG1zZ2lkPSI0MzAxNjAyMzc0NjA5Mjc1MDAzIj4iU2VsZWNjaW9uYSB1biBtw6l0b2RvIGRlIGVudHJhZGEiPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9uYW1lIiBtc2dpZD0iMTAxNzA1ODE4NjMyMjcxNDQwNSI+IlByb3ZlZWRvciBkZWwgZGljY2lvbmFyaW8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3Byb3ZpZGVyX25hbWUiIG1zZ2lkPSI3NzEwNDE1NTk5MzcxMTYxMDkyIj4iUHJvdmVlZG9yIGRlbCBkaWNjaW9uYXJpbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2VydmljZV9uYW1lIiBtc2dpZD0iNTUxNjUwNjk3MzQ4MjAyMDU2Ij4iU2VydmljaW8gZGUgZGljY2lvbmFyaW8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiJJbmZvcm1hY2nDs24gZGUgYWN0dWFsaXphY2nDs24gZGVsIGRpY2Npb25hcmlvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc190aXRsZSIgbXNnaWQ9IjcyNDM5MzA5Njc4NDUwMjA0MDciPiJEaWNjaW9uYXJpb3MgY29tcGxlbWVudGFyaW9zIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsX292ZXJfbWV0ZXJlZF9uZXR3b3JrX3Byb21wdCIgbXNnaWQ9IjM2NDI2MzQ2MjM0NjUzNDk3MTYiPiJEaWNjaW9uYXJpbyBkaXNwb25pYmxlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc19zdW1tYXJ5IiBtc2dpZD0iODU5OTY3OTQzNDc5OTc0OTA1MyI+IkFqdXN0ZXMgZGUgZGljY2lvbmFyaW9zIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNlcl9kaWN0aW9uYXJpZXMiIG1zZ2lkPSI3NTE5NzM2MjMyNDIzOTI5MTI0Ij4iRGljY2lvbmFyaW9zIGRlbCB1c3VhcmlvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4iRGljY2lvbmFyaW8gZGVsIHVzdWFyaW8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiJIYXkgdW4gZGljY2lvbmFyaW8gZGlzcG9uaWJsZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZG93bmxvYWRpbmciIG1zZ2lkPSI4NTk0OTc0NzYyNjYzMDk1OTYiPiJEZXNjYXJnYXMgZW4gY3Vyc28iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxlZCIgbXNnaWQ9IjY0MjU1ODY4OTk2NzEzNzgxNjAiPiJJbnN0YWxhZG8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rpc2FibGVkIiBtc2dpZD0iMzQ0ODU3MTI4MDQ5MDc0NjAzMiI+Ikluc3RhbGFkbyAoaW5oYWJpbGl0YWRvKSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiJFcnJvciBhbCBjb25lY3RhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2RpY3Rpb25hcmllc19hdmFpbGFibGUiIG1zZ2lkPSI1MjA2MjI1MDc3OTQ1NjM3ODEwIj4iTm8gaGF5IGRpY2Npb25hcmlvcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNoZWNrX2Zvcl91cGRhdGVzX25vdyIgbXNnaWQ9IjY0MjA1Nzk4NjEyNzYyNDk4NiI+IkFjdHVhbGl6YXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsYXN0X3VwZGF0ZSIgbXNnaWQ9IjMxMDE1NDk3MTk4Mjc2MDAzNDYiPiLDmmx0aW1hIGFjdHVhbGl6YWNpw7NuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV91cGRhdGluZyIgbXNnaWQ9IjgyMDE4NjI3NjcwNDEzNDcyMCI+IkJ1c2NhbmRvIGFjdHVhbGl6YWNpb25lcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfbG9hZGluZyIgbXNnaWQ9Ijg2MTEzMzkxNDk4MjUwNDc0NDYiPiJDYXJnYW5kby4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1haW5fZGljdF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjE2Nzk5NjQzMDY5ODAwOTg1NzAiPiJEaWNjaW9uYXJpbyBwcmluY2lwYWwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWwiIG1zZ2lkPSI1NTg2NTMxNzM2NjA5MTgzMzA0Ij4iQ2FuY2VsYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJpbnN0YWxsX2RpY3QiIG1zZ2lkPSI1NTI1MDA1NTI0Njk3NjA3ODY1Ij4iSW5zdGFsYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWxfZG93bmxvYWRfZGljdCIgbXNnaWQ9IjcxNjMxNzM2NTAyOTg4MzgzNjciPiJDYW5jZWxhciBkZXNjYXJnYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpc2FibGVfZGljdCIgbXNnaWQ9Ijc2ODU4MTAwNDAyMzY0OTc3MDAiPiJJbmhhYmlsaXRhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVuYWJsZV9kaWN0IiBtc2dpZD0iMzg0ODE3OTc4NDcwMjQ3MzY4MCI+IkhhYmlsaXRhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlbGV0ZV9kaWN0IiBtc2dpZD0iNTgxNzE1OTI5MDUwMzg0Mzc2NiI+IkVsaW1pbmFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQiIG1zZ2lkPSI0OTY1MjY0ODQ5MDU3NjU2NTIxIj4iSGF5IHVuIGRpY2Npb25hcmlvIGRpc3BvbmlibGUgcGFyYSBlbCBpZGlvbWEgc2VsZWNjaW9uYWRvIGVuIHR1IGRpc3Bvc2l0aXZvIG3Ds3ZpbC4mbHQ7YnIvJmd0OyBUZSByZWNvbWVuZGFtb3MgcXVlICZsdDtiJmd0O2Rlc2Nhcmd1ZXMmbHQ7L2ImZ3Q7IGVsIGRpY2Npb25hcmlvIGRlIDx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4gcGFyYSBtZWpvcmFyIHR1IGV4cGVyaWVuY2lhIGRlIGVzY3JpdHVyYS4mbHQ7YnIvJmd0OyAmbHQ7YnIvJmd0OyBMYSBkZXNjYXJnYSBwdWVkZSB0YXJkYXIgdW5vcyBtaW51dG9zIGVuIHJlZGVzIDNHLiBTaSBubyB0aWVuZXMgdW4gJmx0O2ImZ3Q7cGxhbiBkZSBkYXRvcyBpbGltaXRhZG8mbHQ7L2ImZ3Q7LCBlcyBwb3NpYmxlIHF1ZSBzZSBhcGxpcXVlbiBjYXJnb3MuJmx0O2JyLyZndDsgU2kgbm8gY29ub2NlcyBsYXMgY2FyYWN0ZXLDrXN0aWNhcyBkZSB0dSBwbGFuIGRlIGRhdG9zLCB0ZSByZWNvbWVuZGFtb3MgcXVlIHVzZXMgdW5hIGNvbmV4acOzbiBXaS1GaSBwYXJhIGluaWNpYXIgbGEgZGVzY2FyZ2EgYXV0b23DoXRpY2FtZW50ZS4mbHQ7YnIvJmd0OyAmbHQ7YnIvJmd0OyBTdWdlcmVuY2lhOiBwdWVkZXMgZGVzY2FyZ2FyIHkgZWxpbWluYXIgZGljY2lvbmFyaW9zIGVuIGxhIHNlY2Npw7NuICZsdDtiJmd0O0lkaW9tYSBlIGludHJvZHVjY2nDs24gZGUgdGV4dG8mbHQ7L2ImZ3Q7IGRlbCBtZW7DuiAmbHQ7YiZndDtBanVzdGVzJmx0Oy9iJmd0OyBkZWwgZGlzcG9zaXRpdm8gbcOzdmlsLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRvd25sb2FkX292ZXJfbWV0ZXJlZCIgbXNnaWQ9IjQwMjQwMTM3NjQ5Mzc4NTAwNjEiPiJEZXNjYXJnYXIgYWhvcmEgKDx4bGlmZjpnIGlkPSJTSVpFX0lOX01FR0FCWVRFUyI+JTEkLjFmPC94bGlmZjpnPiBNQikiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb19ub3RfZG93bmxvYWRfb3Zlcl9tZXRlcmVkIiBtc2dpZD0iNjk2Mzc3MDg4NTAzMzc2NTM3OCI+IkRlc2NhcmdhciBtZWRpYW50ZSBXaS1GaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ1NjA1NzYzNzk2ODA2NjAwNDciPiJIYXkgdW4gZGljY2lvbmFyaW8gZGlzcG9uaWJsZSBkZSA8eGxpZmY6ZyBpZD0iTEFOR1VBR0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzU1NTE1MzgxMjg1MzE3ODMyIj4iUHVsc2EgcGFyYSBjb21wcm9iYXIgeSBkZXNjYXJnYXIiPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1ldC9zdHJpbmdzLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1ldC9zdHJpbmdzLnhtbAppbmRleCA1MWViNDdiLi4wNjk3Y2FiIDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMtZXQvc3RyaW5ncy54bWwKKysrIGIvamF2YS9yZXMvdmFsdWVzLWV0L3N0cmluZ3MueG1sCkBAIC0xNzAsNCArMTcwLDM2IEBACiAgICAgPHN0cmluZyBuYW1lPSJidXR0b25fZGVmYXVsdCIgbXNnaWQ9IjM5ODgwMTc4NDA0MzE4ODE0OTEiPiJWYWlrZXbDpMOkcnR1cyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxhbmd1YWdlX3NldHRpbmdzIiBtc2dpZD0iMTY3MTE1MzA1MzIwMTgwOTAzMSI+IktlZWxlZCBqYSBzaXNlc3RhbWluZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdF9pbnB1dF9tZXRob2QiIG1zZ2lkPSI0MzAxNjAyMzc0NjA5Mjc1MDAzIj4iVmFsaWdlIHNpc2VzdHVzbWVldG9kIjwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJhcHBfbmFtZSIgbXNnaWQ9IjEwMTcwNTgxODYzMjI3MTQ0MDUiPiJTw7VuYXN0aWt1cGFra3VqYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfcHJvdmlkZXJfbmFtZSIgbXNnaWQ9Ijc3MTA0MTU1OTkzNzExNjEwOTIiPiJTw7VuYXN0aWt1cGFra3VqYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2VydmljZV9uYW1lIiBtc2dpZD0iNTUxNjUwNjk3MzQ4MjAyMDU2Ij4iU8O1bmFyYWFtYXR1dGVlbnVzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzMjc0ODYxNTE0Njk1MDMyOTU0Ij4iU8O1bmFzdGlrdSB2w6Ryc2tlbmRhbWlzdGVhdmUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3RpdGxlIiBtc2dpZD0iNzI0MzkzMDk2Nzg0NTAyMDQwNyI+IlBpc3Rpa3PDtW5hc3Rpa3VkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsX292ZXJfbWV0ZXJlZF9uZXR3b3JrX3Byb21wdCIgbXNnaWQ9IjM2NDI2MzQ2MjM0NjUzNDk3MTYiPiJTw7VuYXN0aWsgb24gc2FhZGF2YWwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4iU8O1bmFzdGlrZSBzZWFkZWQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2VyX2RpY3Rpb25hcmllcyIgbXNnaWQ9Ijc1MTk3MzYyMzI0MjM5MjkxMjQiPiJLYXN1dGFqYXPDtW5hc3Rpa3VkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4iS2FzdXRhamFzw7VuYXN0aWsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiJTw7VuYXN0aWsgb24gc2FhZGF2YWwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rvd25sb2FkaW5nIiBtc2dpZD0iODU5NDk3NDc2MjY2MzA5NTk2Ij4iUHJhZWd1IGFsbGFsYWFkaW1pc2VsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsZWQiIG1zZ2lkPSI2NDI1NTg2ODk5NjcxMzc4MTYwIj4iSW5zdGFsbGl0dWQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rpc2FibGVkIiBtc2dpZD0iMzQ0ODU3MTI4MDQ5MDc0NjAzMiI+Ikluc3RhbGxpdHVkLCBrZWVsYXR1ZCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiJUw7VyZ2Ugc8O1bmFzdC4gw7xoZW5kLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2RpY3Rpb25hcmllc19hdmFpbGFibGUiIG1zZ2lkPSI1MjA2MjI1MDc3OTQ1NjM3ODEwIj4iU8O1bmFzdGlra2UgcG9sZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNoZWNrX2Zvcl91cGRhdGVzX25vdyIgbXNnaWQ9IjY0MjA1Nzk4NjEyNzYyNDk4NiI+IlbDpHJza2VuZGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsYXN0X3VwZGF0ZSIgbXNnaWQ9IjMxMDE1NDk3MTk4Mjc2MDAzNDYiPiJWaWltYXRpIHbDpHJza2VuZGF0dWQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX3VwZGF0aW5nIiBtc2dpZD0iODIwMTg2Mjc2NzA0MTM0NzIwIj4iVsOkcnNrZW5kdXN0ZSBvdHNpbWluZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfbG9hZGluZyIgbXNnaWQ9Ijg2MTEzMzkxNDk4MjUwNDc0NDYiPiJMYWFkaW1pbmUgLi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWFpbl9kaWN0X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMTY3OTk2NDMwNjk4MDA5ODU3MCI+IlDDtWhpc8O1bmFzdGlrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsIiBtc2dpZD0iNTU4NjUzMTczNjYwOTE4MzMwNCI+IlTDvGhpc3RhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5zdGFsbF9kaWN0IiBtc2dpZD0iNTUyNTAwNTUyNDY5NzYwNzg2NSI+Ikluc3RhbGxpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsX2Rvd25sb2FkX2RpY3QiIG1zZ2lkPSI3MTYzMTczNjUwMjk4ODM4MzY3Ij4iVMO8aGlzdGEgYWxsYWxhYWRpbWluZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpc2FibGVfZGljdCIgbXNnaWQ9Ijc2ODU4MTAwNDAyMzY0OTc3MDAiPiJLZWVsYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVuYWJsZV9kaWN0IiBtc2dpZD0iMzg0ODE3OTc4NDcwMjQ3MzY4MCI+Ikx1YmEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfZGljdCIgbXNnaWQ9IjU4MTcxNTkyOTA1MDM4NDM3NjYiPiJLdXN0dXRhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQiIG1zZ2lkPSI0OTY1MjY0ODQ5MDU3NjU2NTIxIj4iTW9iaWlsc2VhZG1lcyB2YWxpdHVkIGtlZWxlbGUgb24gc2FhZGF2YWwgc8O1bmFzdGlrLiZsdDtici8mZ3Q7IFRla3N0aSBzaXNlc3RhbWlzZWtzICBzb292aXRhbWUgJmx0O2ImZ3Q7YWxsYSBsYWFkaWRhJmx0Oy9iJmd0OyBzw7VuYXN0aWt1IDx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4uJmx0O2JyLyZndDsgJmx0O2JyLyZndDsgM0cga2F1ZHUgYWxsYWxhYWRpbWlzZWxlIHbDtWliIGt1bHVkYSBtaW51dCB2w7VpIHBhYXIuIEtlaHRpZGEgdsO1aXZhZCB0YXN1ZCwga3VpIHRlIGVpIGthc3V0YSAmbHQ7YiZndDtwaWlyYW1hdHV0IGFuZG1lcGFrZXR0aSZsdDsvYiZndDsuJmx0O2JyLyZndDsgS3VpIHRlIGVpIHRlYSwgbWlsbGlzdCBhbmRtZXBha2V0dGkga2FzdXRhdGUsIHNvb3ZpdGFtZSBhbGxhbGFhZGltaXNlIGF1dG9tYWF0c2VrcyBrw6Rpdml0YW1pc2VrcyBsZWlkYSBXaUZpLcO8aGVuZHVzZS4mbHQ7YnIvJmd0OyAmbHQ7YnIvJmd0OyBOw7V1YW5uZTogc8O1bmFzdGlra2Ugc2FhdGUgYWxsYSBsYWFkaWRhIGphIGVlbWFsZGFkYSwgdGVoZXMgdmFsaWt1ICZsdDtiJmd0O0tlZWxlICZhbXA7IHNpc2VuZCZsdDsvYiZndDsgbW9iaWlsc2VhZG1lIG1lbsO8w7xzICZsdDtiJmd0O1NlYWRlZCZsdDsvYiZndDsuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfb3Zlcl9tZXRlcmVkIiBtc2dpZD0iNDAyNDAxMzc2NDkzNzg1MDA2MSI+IkxhYWRpIGtvaGUgYWxsYSAoPHhsaWZmOmcgaWQ9IlNJWkVfSU5fTUVHQUJZVEVTIj4lMSQuMWY8L3hsaWZmOmc+IE1CKSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRvX25vdF9kb3dubG9hZF9vdmVyX21ldGVyZWQiIG1zZ2lkPSI2OTYzNzcwODg1MDMzNzY1Mzc4Ij4iTGFhZGkgYWxsYSBXaUZpIGthdWR1Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDU2MDU3NjM3OTY4MDY2MDA0NyI+IlPDtW5hc3RpayBvbiA8eGxpZmY6ZyBpZD0iTEFOR1VBR0UiPiUxJHM8L3hsaWZmOmc+IGtlZWxlIGphb2tzIHNhYWRhdmFsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzU1NTE1MzgxMjg1MzE3ODMyIj4iVmFqdXRhZ2Ugw7xsZXZhYXRhbWlzZWtzIGphIGFsbGFsYWFkaW1pc2VrcyI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLWZhL3N0cmluZ3MueG1sIGIvamF2YS9yZXMvdmFsdWVzLWZhL3N0cmluZ3MueG1sCmluZGV4IDhmNzFmMTkuLmVjYzdlMjggMTAwNjQ0Ci0tLSBhL2phdmEvcmVzL3ZhbHVlcy1mYS9zdHJpbmdzLnhtbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtZmEvc3RyaW5ncy54bWwKQEAgLTE3NCw0ICsxNzQsMzkgQEAKICAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9kZWZhdWx0IiBtc2dpZD0iMzk4ODAxNzg0MDQzMTg4MTQ5MSI+Itm+24zYtOKAjNmB2LHYtiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxhbmd1YWdlX3NldHRpbmdzIiBtc2dpZD0iMTY3MTE1MzA1MzIwMTgwOTAzMSI+Itiy2KjYp9mGINmIINmI2LHZiNiv24wiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RfaW5wdXRfbWV0aG9kIiBtc2dpZD0iNDMwMTYwMjM3NDYwOTI3NTAwMyI+Itin2YbYqtiu2KfYqCDYsdmI2LQg2YjYsdmI2K/bjCI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4i2KfYsdin2KbZh+KAjNiv2YfZhtiv2Ycg2YHYsdmH2YbaryDZhNi62KoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3Byb3ZpZGVyX25hbWUiIG1zZ2lkPSI3NzEwNDE1NTk5MzcxMTYxMDkyIj4i2KfYsdin2KbZhyDYr9mH2YbYr9mHINmB2LHZh9mG2q8g2YTYutiqIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXJ2aWNlX25hbWUiIG1zZ2lkPSI1NTE2NTA2OTczNDgyMDIwNTYiPiLYs9ix2YjbjNizINmB2LHZh9mG2q8g2YTYutiqIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzMjc0ODYxNTE0Njk1MDMyOTU0Ij4i2KfYt9mE2KfYudin2Kog2KjZh+KAjNix2YjYstix2LPYp9mG24wg2YHYsdmH2YbaryDZhNi62KoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3RpdGxlIiBtc2dpZD0iNzI0MzkzMDk2Nzg0NTAyMDQwNyI+ItmB2LHZh9mG2q/igIzZh9in24wg2YTYutiqINin2YHYstmI2K/ZhtuMIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsX292ZXJfbWV0ZXJlZF9uZXR3b3JrX3Byb21wdCIgbXNnaWQ9IjM2NDI2MzQ2MjM0NjUzNDk3MTYiPiLZgdix2YfZhtqvINmE2LrYqiDYr9ixINiv2LPYqtix2LMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4i2KrZhti424zZhdin2Kog2KjYsdin24wg2YHYsdmH2Ybar+KAjCDZhNi62KrigIzZh9inIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNlcl9kaWN0aW9uYXJpZXMiIG1zZ2lkPSI3NTE5NzM2MjMyNDIzOTI5MTI0Ij4i2YHYsdmH2Ybar+KAjNmH2KfbjCDZhNi62Kog2qnYp9ix2KjYsSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfdXNlcl9kaWN0X3ByZWZfbmFtZSIgbXNnaWQ9IjUyMjEyNTE1Mjc1NzYwNzc5MCI+ItmB2LHZh9mG2q/igIwg2YTYutiqINqp2KfYsdio2LEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiLZgdix2YfZhtqvINmE2LrYqiDZhdmI2KzZiNivINin2LPYqiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZG93bmxvYWRpbmciIG1zZ2lkPSI4NTk0OTc0NzYyNjYzMDk1OTYiPiLZhdmI2KfYsdivINiv2LEg2K3Yp9mEINiv2KfZhtmE2YjYryDaqdmG2YjZhtuMIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsZWQiIG1zZ2lkPSI2NDI1NTg2ODk5NjcxMzc4MTYwIj4i2YbYtdioINi02K8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rpc2FibGVkIiBtc2dpZD0iMzQ0ODU3MTI4MDQ5MDc0NjAzMiI+ItmG2LXYqCDYtNiv2Iwg2LrbjNix2YHYudin2YQg2LTYryI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiLZhdi02qnZhCDYp9iq2LXYp9mEINio2Ycg2LPYsdmI24zYsyDZgdix2YfZhtqvINmE2LrYqiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2RpY3Rpb25hcmllc19hdmFpbGFibGUiIG1zZ2lkPSI1MjA2MjI1MDc3OTQ1NjM3ODEwIj4i2YfbjNqGINmB2LHZh9mG2q8g2YTYutiq24wg2YXZiNis2YjYryDZhtuM2LPYqiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNoZWNrX2Zvcl91cGRhdGVzX25vdyIgbXNnaWQ9IjY0MjA1Nzk4NjEyNzYyNDk4NiI+Itio2KfYstiu2YjYp9mG24wiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsYXN0X3VwZGF0ZSIgbXNnaWQ9IjMxMDE1NDk3MTk4Mjc2MDAzNDYiPiLYqtin2LHbjNiuINii2K7YsduM2YYg2KjZh+KAjNix2YjYstix2LPYp9mG24wiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX3VwZGF0aW5nIiBtc2dpZD0iODIwMTg2Mjc2NzA0MTM0NzIwIj4i2K/Ysdit2KfZhCDYqNix2LHYs9uMINio2YfigIzYsdmI2LLYsdiz2KfZhtuM4oCM2YfYpyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfbG9hZGluZyIgbXNnaWQ9Ijg2MTEzMzkxNDk4MjUwNDc0NDYiPiLYr9ixINit2KfZhCDYqNin2LHar9uM2LHbjC4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1haW5fZGljdF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjE2Nzk5NjQzMDY5ODAwOTg1NzAiPiLZgdix2YfZhtqv4oCMINmE2LrYqiDYp9i12YTbjCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbCIgbXNnaWQ9IjU1ODY1MzE3MzY2MDkxODMzMDQiPiLZhNi62YgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJpbnN0YWxsX2RpY3QiIG1zZ2lkPSI1NTI1MDA1NTI0Njk3NjA3ODY1Ij4i2YbYtdioIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsX2Rvd25sb2FkX2RpY3QiIG1zZ2lkPSI3MTYzMTczNjUwMjk4ODM4MzY3Ij4i2YTYutmIINiv2KfZhtmE2YjYryI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpc2FibGVfZGljdCIgbXNnaWQ9Ijc2ODU4MTAwNDAyMzY0OTc3MDAiPiLYutuM2LHZgdi52KfZhCDaqdix2K/ZhiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVuYWJsZV9kaWN0IiBtc2dpZD0iMzg0ODE3OTc4NDcwMjQ3MzY4MCI+ItmB2LnYp9mEINqp2LHYr9mGIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVsZXRlX2RpY3QiIG1zZ2lkPSI1ODE3MTU5MjkwNTAzODQzNzY2Ij4i2K3YsNmBIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNob3VsZF9kb3dubG9hZF9vdmVyX21ldGVyZWRfcHJvbXB0ICg0OTY1MjY0ODQ5MDU3NjU2NTIxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvd25sb2FkX292ZXJfbWV0ZXJlZCAoNDAyNDAxMzc2NDkzNzg1MDA2MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb19ub3RfZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg2OTYzNzcwODg1MDMzNzY1Mzc4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDU2MDU3NjM3OTY4MDY2MDA0NyI+ItuM2qkg2YHYsdmH2YbaryDZhNi62Kog2KjYsdin24wgPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPiDYr9ixINiv2LPYqtix2LMg2KfYs9iqIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzU1NTE1MzgxMjg1MzE3ODMyIj4i2KjYsdin24wg2YXYsdmI2LEg2Ygg2K/Yp9mG2YTZiNivINmB2LTYp9ixINiv2YfbjNivIjwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMtZmkvc3RyaW5ncy54bWwgYi9qYXZhL3Jlcy92YWx1ZXMtZmkvc3RyaW5ncy54bWwKaW5kZXggOWZlOGYxYi4uNjI0ZTRlNiAxMDA2NDQKLS0tIGEvamF2YS9yZXMvdmFsdWVzLWZpL3N0cmluZ3MueG1sCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1maS9zdHJpbmdzLnhtbApAQCAtMTcwLDQgKzE3MCwzOSBAQAogICAgIDxzdHJpbmcgbmFtZT0iYnV0dG9uX2RlZmF1bHQiIG1zZ2lkPSIzOTg4MDE3ODQwNDMxODgxNDkxIj4iT2xldHVzYXJ2b3QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYW5ndWFnZV9zZXR0aW5ncyIgbXNnaWQ9IjE2NzExNTMwNTMyMDE4MDkwMzEiPiJLaWVsaSBqYSBzecO2dHTDtnRhcGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RfaW5wdXRfbWV0aG9kIiBtc2dpZD0iNDMwMTYwMjM3NDYwOTI3NTAwMyI+IlZhbGl0c2Ugc3nDtnR0w7Z0YXBhIjwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJhcHBfbmFtZSIgbXNnaWQ9IjEwMTcwNTgxODYzMjI3MTQ0MDUiPiJTYW5ha2lyamFuIHRhcmpvYWphIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9wcm92aWRlcl9uYW1lIiBtc2dpZD0iNzcxMDQxNTU5OTM3MTE2MTA5MiI+IlNhbmFraXJqYW4gdGFyam9hamEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NlcnZpY2VfbmFtZSIgbXNnaWQ9IjU1MTY1MDY5NzM0ODIwMjA1NiI+IlNhbmFraXJqYXBhbHZlbHUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiJTYW5ha2lyamFuIHDDpGl2aXR5c3RpZWRvdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3NfdGl0bGUiIG1zZ2lkPSI3MjQzOTMwOTY3ODQ1MDIwNDA3Ij4iU2FuYWtpcmphbGlzw6Rvc2F0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsX292ZXJfbWV0ZXJlZF9uZXR3b3JrX3Byb21wdCIgbXNnaWQ9IjM2NDI2MzQ2MjM0NjUzNDk3MTYiPiJTYW5ha2lyamEgc2FhdGF2aWxsYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3Nfc3VtbWFyeSIgbXNnaWQ9Ijg1OTk2Nzk0MzQ3OTk3NDkwNTMiPiJTYW5ha2lyam9qZW4gYXNldHVrc2V0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNlcl9kaWN0aW9uYXJpZXMiIG1zZ2lkPSI3NTE5NzM2MjMyNDIzOTI5MTI0Ij4iS8OkeXR0w6Rqw6RuIHNhbmFraXJqYXQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X3VzZXJfZGljdF9wcmVmX25hbWUiIG1zZ2lkPSI1MjIxMjUxNTI3NTc2MDc3OTAiPiJLw6R5dHTDpGrDpG4gc2FuYWtpcmphIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9hdmFpbGFibGUiIG1zZ2lkPSIzMTkyOTIwNjA4NTIwNjE4MDgzIj4iU2FuYWtpcmphIHNhYXRhdmlsbGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rvd25sb2FkaW5nIiBtc2dpZD0iODU5NDk3NDc2MjY2MzA5NTk2Ij4iTGFkYXRhYW4gcGFyaGFpbGxhYW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxlZCIgbXNnaWQ9IjY0MjU1ODY4OTk2NzEzNzgxNjAiPiJBc2VubmV0dHUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rpc2FibGVkIiBtc2dpZD0iMzQ0ODU3MTI4MDQ5MDc0NjAzMiI+IkFzZW5uZXR0dSwgcG9pc3RldHR1IGvDpHl0w7ZzdMOkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2Fubm90X2Nvbm5lY3RfdG9fZGljdF9zZXJ2aWNlIiBtc2dpZD0iNjg3NTY2NTQ5NDcyNjMwMDQyNyI+Ik9uZ2VsbWEgeWhkLiBzYW5hay5wYWx2ZWx1dW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19kaWN0aW9uYXJpZXNfYXZhaWxhYmxlIiBtc2dpZD0iNTIwNjIyNTA3Nzk0NTYzNzgxMCI+IkVpIHNhbmFraXJqLiBzYWF0YXYuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2hlY2tfZm9yX3VwZGF0ZXNfbm93IiBtc2dpZD0iNjQyMDU3OTg2MTI3NjI0OTg2Ij4iUMOkaXZpdMOkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibGFzdF91cGRhdGUiIG1zZ2lkPSIzMTAxNTQ5NzE5ODI3NjAwMzQ2Ij4iVmlpbWVrc2kgcMOkaXZpdGV0dHkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX3VwZGF0aW5nIiBtc2dpZD0iODIwMTg2Mjc2NzA0MTM0NzIwIj4iVGFya2lzdGV0YWFuIHDDpGl2aXR5a3Npw6QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX2xvYWRpbmciIG1zZ2lkPSI4NjExMzM5MTQ5ODI1MDQ3NDQ2Ij4iTGFkYXRhYW4uLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtYWluX2RpY3RfZGVzY3JpcHRpb24iIG1zZ2lkPSIxNjc5OTY0MzA2OTgwMDk4NTcwIj4iUMOkw6RzYW5ha2lyamEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWwiIG1zZ2lkPSI1NTg2NTMxNzM2NjA5MTgzMzA0Ij4iUGVydXV0YSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imluc3RhbGxfZGljdCIgbXNnaWQ9IjU1MjUwMDU1MjQ2OTc2MDc4NjUiPiJBc2VubmEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWxfZG93bmxvYWRfZGljdCIgbXNnaWQ9IjcxNjMxNzM2NTAyOTg4MzgzNjciPiJQZXJ1dXRhIGxhdGF1cyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpc2FibGVfZGljdCIgbXNnaWQ9Ijc2ODU4MTAwNDAyMzY0OTc3MDAiPiJQb2lzdGEga8OkeXTDtnN0w6QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlbmFibGVfZGljdCIgbXNnaWQ9IjM4NDgxNzk3ODQ3MDI0NzM2ODAiPiJPdGEga8OkeXR0w7bDtm4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfZGljdCIgbXNnaWQ9IjU4MTcxNTkyOTA1MDM4NDM3NjYiPiJQb2lzdGEiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQgKDQ5NjUyNjQ4NDkwNTc2NTY1MjEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg0MDI0MDEzNzY0OTM3ODUwMDYxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvX25vdF9kb3dubG9hZF9vdmVyX21ldGVyZWQgKDY5NjM3NzA4ODUwMzM3NjUzNzgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0NTYwNTc2Mzc5NjgwNjYwMDQ3Ij4iS2llbGVuIDx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4gc2FuYWtpcmphIG9uIHNhYXRhdmlsbGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24iIG1zZ2lkPSIzNTU1MTUzODEyODUzMTc4MzIiPiJQYWluYSB0w6R0w6QsIGpvcyBoYWx1YXQgdGFya2FzdGVsbGEga29oZGV0dGEgdGFpIGxhZGF0YSBzZW4iPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1mci9zdHJpbmdzLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1mci9zdHJpbmdzLnhtbAppbmRleCA4YjIyODc0Li43Nzg4ZTVjIDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMtZnIvc3RyaW5ncy54bWwKKysrIGIvamF2YS9yZXMvdmFsdWVzLWZyL3N0cmluZ3MueG1sCkBAIC0xNzAsNCArMTcwLDM2IEBACiAgICAgPHN0cmluZyBuYW1lPSJidXR0b25fZGVmYXVsdCIgbXNnaWQ9IjM5ODgwMTc4NDA0MzE4ODE0OTEiPiJQYXIgZMOpZmF1dCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxhbmd1YWdlX3NldHRpbmdzIiBtc2dpZD0iMTY3MTE1MzA1MzIwMTgwOTAzMSI+Ikxhbmd1ZSBldCBzYWlzaWUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RfaW5wdXRfbWV0aG9kIiBtc2dpZD0iNDMwMTYwMjM3NDYwOTI3NTAwMyI+IlPDqWxlY3Rpb25uZXogbGUgbW9kZSBkZSBzYWlzaWUiPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9uYW1lIiBtc2dpZD0iMTAxNzA1ODE4NjMyMjcxNDQwNSI+IkZvdXJuaXNzZXVyIGRlIGRpY3Rpb25uYWlyZXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3Byb3ZpZGVyX25hbWUiIG1zZ2lkPSI3NzEwNDE1NTk5MzcxMTYxMDkyIj4iRm91cm5pc3NldXIgZGUgZGljdGlvbm5haXJlcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2VydmljZV9uYW1lIiBtc2dpZD0iNTUxNjUwNjk3MzQ4MjAyMDU2Ij4iU2VydmljZSBkZSBkaWN0aW9ubmFpcmVzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzMjc0ODYxNTE0Njk1MDMyOTU0Ij4iSW5mb3JtYXRpb25zIHJlbGF0aXZlcyDDoCBsYSBtaXNlIMOgIGpvdXIgZGVzIGRpY3Rpb25uYWlyZXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3RpdGxlIiBtc2dpZD0iNzI0MzkzMDk2Nzg0NTAyMDQwNyI+IkRpY3Rpb25uYWlyZXMgY29tcGzDqW1lbnRhaXJlcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbF9vdmVyX21ldGVyZWRfbmV0d29ya19wcm9tcHQiIG1zZ2lkPSIzNjQyNjM0NjIzNDY1MzQ5NzE2Ij4iRGljdGlvbm5haXJlIGRpc3BvbmlibGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4iUGFyYW3DqHRyZXMgZGVzIGRpY3Rpb25uYWlyZXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2VyX2RpY3Rpb25hcmllcyIgbXNnaWQ9Ijc1MTk3MzYyMzI0MjM5MjkxMjQiPiJEaWN0aW9ubmFpcmVzIHBlcnNvbm5lbHMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X3VzZXJfZGljdF9wcmVmX25hbWUiIG1zZ2lkPSI1MjIxMjUxNTI3NTc2MDc3OTAiPiJEaWN0aW9ubmFpcmUgcGVyc29ubmVsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9hdmFpbGFibGUiIG1zZ2lkPSIzMTkyOTIwNjA4NTIwNjE4MDgzIj4iRGljdGlvbm5haXJlIGRpc3BvbmlibGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rvd25sb2FkaW5nIiBtc2dpZD0iODU5NDk3NDc2MjY2MzA5NTk2Ij4iRW4gY291cnMgZGUgdMOpbMOpY2hhcmdlbWVudOKApiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbGVkIiBtc2dpZD0iNjQyNTU4Njg5OTY3MTM3ODE2MCI+Ikluc3RhbGzDqSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZGlzYWJsZWQiIG1zZ2lkPSIzNDQ4NTcxMjgwNDkwNzQ2MDMyIj4iSW5zdGFsbMOpLCBkw6lzYWN0aXbDqSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiJQYXMgZGUgc2VydmljZSBkaWN0aW9ubmFpcmUuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZGljdGlvbmFyaWVzX2F2YWlsYWJsZSIgbXNnaWQ9IjUyMDYyMjUwNzc5NDU2Mzc4MTAiPiJBdWN1biBkaWN0aW9ubmFpcmUuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2hlY2tfZm9yX3VwZGF0ZXNfbm93IiBtc2dpZD0iNjQyMDU3OTg2MTI3NjI0OTg2Ij4iQWN0dWFsaXNlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imxhc3RfdXBkYXRlIiBtc2dpZD0iMzEwMTU0OTcxOTgyNzYwMDM0NiI+IkRlcm5pw6hyZSBtaXNlIMOgIGpvdXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX3VwZGF0aW5nIiBtc2dpZD0iODIwMTg2Mjc2NzA0MTM0NzIwIj4iUmVjaGVyY2hlIGRlIG1pc2VzIMOgIGpvdXIgZW4gY291cnPigKYiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX2xvYWRpbmciIG1zZ2lkPSI4NjExMzM5MTQ5ODI1MDQ3NDQ2Ij4iQ2hhcmdlbWVudOKApiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1haW5fZGljdF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjE2Nzk5NjQzMDY5ODAwOTg1NzAiPiJEaWN0aW9ubmFpcmUgcHJpbmNpcGFsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsIiBtc2dpZD0iNTU4NjUzMTczNjYwOTE4MzMwNCI+IkFubnVsZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJpbnN0YWxsX2RpY3QiIG1zZ2lkPSI1NTI1MDA1NTI0Njk3NjA3ODY1Ij4iSW5zdGFsbGVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsX2Rvd25sb2FkX2RpY3QiIG1zZ2lkPSI3MTYzMTczNjUwMjk4ODM4MzY3Ij4iQW5udWxlciBsZSB0w6lsw6ljaGFyZ2VtZW50Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWJsZV9kaWN0IiBtc2dpZD0iNzY4NTgxMDA0MDIzNjQ5NzcwMCI+IkTDqXNhY3RpdmVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZW5hYmxlX2RpY3QiIG1zZ2lkPSIzODQ4MTc5Nzg0NzAyNDczNjgwIj4iQWN0aXZlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlbGV0ZV9kaWN0IiBtc2dpZD0iNTgxNzE1OTI5MDUwMzg0Mzc2NiI+IlN1cHByaW1lciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNob3VsZF9kb3dubG9hZF9vdmVyX21ldGVyZWRfcHJvbXB0IiBtc2dpZD0iNDk2NTI2NDg0OTA1NzY1NjUyMSI+IlVuIGRpY3Rpb25uYWlyZSBlc3QgZGlzcG9uaWJsZSBwb3VyIGxhIGxhbmd1ZSBzw6lsZWN0aW9ubsOpZSBzdXIgdm90cmUgYXBwYXJlaWwgbW9iaWxlLiZsdDtici8mZ3Q7IE5vdXMgdm91cyBpbnZpdG9ucyDDoCAmbHQ7YiZndDt0w6lsw6ljaGFyZ2VyJmx0Oy9iJmd0OyBsZSBkaWN0aW9ubmFpcmUgPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPiBwb3VyIGZhY2lsaXRlciB2b3RyZSBzYWlzaWUuJmx0O2JyLyZndDsgJmx0O2JyLyZndDsgTGUgdMOpbMOpY2hhcmdlbWVudCBwZXV0IHByZW5kcmUgdW5lIMOgIGRldXjCoG1pbnV0ZXMgdmlhIHVuZSBjb25uZXhpb24gM0cuIERlcyBmcmFpcyBwZXV2ZW50IHNcJ2FwcGxpcXVlciBzaSB2b3VzIG5lIGRpc3Bvc2V6IHBhcyBkXCd1biAmbHQ7YiZndDtmb3JmYWl0IEludGVybmV0IGlsbGltaXTDqSZsdDsvYiZndDsuJmx0O2JyLyZndDsgU2kgdm91cyBuXCfDqnRlcyBwYXMgc8O7ciBkZSB2b3RyZSBmb3JmYWl0LCBub3VzIHZvdXMgY29uc2VpbGxvbnMgZFwndXRpbGlzZXIgdW5lIGNvbm5leGlvbiBXaS1GaSBwb3VyIGxhbmNlciBhdXRvbWF0aXF1ZW1lbnQgbGUgdMOpbMOpY2hhcmdlbWVudC4mbHQ7YnIvJmd0OyAmbHQ7YnIvJmd0OyBBc3R1Y2XCoDogVm91cyBwb3V2ZXogdMOpbMOpY2hhcmdlciBldCBzdXBwcmltZXIgZGVzIGRpY3Rpb25uYWlyZXMgZGFucyAmbHQ7YiZndDtMYW5ndWUgZXQgc2Fpc2llJmx0Oy9iJmd0OyBkdSBtZW51ICZsdDtiJmd0O1BhcmFtw6h0cmVzJmx0Oy9iJmd0OyBkZSB2b3RyZSBhcHBhcmVpbCBtb2JpbGUuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfb3Zlcl9tZXRlcmVkIiBtc2dpZD0iNDAyNDAxMzc2NDkzNzg1MDA2MSI+IlTDqWzDqWNoYXJnZXIgbWFpbnRlbmFudCAoPHhsaWZmOmcgaWQ9IlNJWkVfSU5fTUVHQUJZVEVTIj4lMSQuMWY8L3hsaWZmOmc+wqBNbykiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb19ub3RfZG93bmxvYWRfb3Zlcl9tZXRlcmVkIiBtc2dpZD0iNjk2Mzc3MDg4NTAzMzc2NTM3OCI+IlTDqWzDqWNoYXJnZXIgdmlhIFdpLUZpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDU2MDU3NjM3OTY4MDY2MDA0NyI+IlVuIGRpY3Rpb25uYWlyZSBlc3QgZGlzcG9uaWJsZSBlbiA8eGxpZmY6ZyBpZD0iTEFOR1VBR0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzU1NTE1MzgxMjg1MzE3ODMyIj4iQXBwdXlleiBpY2kgcG91ciBjb25zdWx0ZXIgZXQgdMOpbMOpY2hhcmdlciBsZSBkaWN0aW9ubmFpcmUuIjwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMtaGkvc3RyaW5ncy54bWwgYi9qYXZhL3Jlcy92YWx1ZXMtaGkvc3RyaW5ncy54bWwKaW5kZXggNzcwODFiZC4uNDY3NjAzNCAxMDA2NDQKLS0tIGEvamF2YS9yZXMvdmFsdWVzLWhpL3N0cmluZ3MueG1sCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1oaS9zdHJpbmdzLnhtbApAQCAtMTcwLDQgKzE3MCwzOSBAQAogICAgIDxzdHJpbmcgbmFtZT0iYnV0dG9uX2RlZmF1bHQiIG1zZ2lkPSIzOTg4MDE3ODQwNDMxODgxNDkxIj4i4KSh4KS/4KSr4KS84KWJ4KSy4KWN4KSfIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGFuZ3VhZ2Vfc2V0dGluZ3MiIG1zZ2lkPSIxNjcxMTUzMDUzMjAxODA5MDMxIj4i4KSt4KS+4KS34KS+IOCklOCksCDgpIfgpKjgpKrgpYHgpJ8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RfaW5wdXRfbWV0aG9kIiBtc2dpZD0iNDMwMTYwMjM3NDYwOTI3NTAwMyI+IuCkh+CkqOCkquClgeCknyDgpKrgpKbgpY3gpKfgpKTgpL8g4KSa4KWB4KSo4KWH4KSCIjwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJhcHBfbmFtZSIgbXNnaWQ9IjEwMTcwNTgxODYzMjI3MTQ0MDUiPiLgpKHgpL/gpJXgpY3igI3gpLbgpKjgpLDgpYAg4KSq4KWN4KSw4KSm4KS+4KSk4KS+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9wcm92aWRlcl9uYW1lIiBtc2dpZD0iNzcxMDQxNTU5OTM3MTE2MTA5MiI+IuCkoeCkv+CkleCljeKAjeCktuCkqOCksOClgCDgpKrgpY3gpLDgpKbgpL7gpKTgpL4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NlcnZpY2VfbmFtZSIgbXNnaWQ9IjU1MTY1MDY5NzM0ODIwMjA1NiI+IuCkoeCkv+CkleCljeKAjeCktuCkqOCksOClgCDgpLjgpYfgpLXgpL4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiLgpKHgpL/gpJXgpY3igI3gpLbgpKjgpLDgpYAg4KSF4KSq4KSh4KWH4KSfIOCknOCkvuCkqOCkleCkvuCksOClgCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3NfdGl0bGUiIG1zZ2lkPSI3MjQzOTMwOTY3ODQ1MDIwNDA3Ij4i4KSP4KShLeCkkeCkqCDgpKHgpL/gpJXgpY3gpLbgpKjgpLDgpYAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxfb3Zlcl9tZXRlcmVkX25ldHdvcmtfcHJvbXB0IiBtc2dpZD0iMzY0MjYzNDYyMzQ2NTM0OTcxNiI+IuCkoeCkv+CkleCljeKAjeCktuCkqOCksOClgCDgpIngpKrgpLLgpKzgpY3igI3gpKciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4i4KSh4KS/4KSV4KWN4oCN4KS24KSo4KSw4KWAIOCkleClhyDgpLLgpL/gpI8g4KS44KWH4KSf4KS/4KSC4KSXIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNlcl9kaWN0aW9uYXJpZXMiIG1zZ2lkPSI3NTE5NzM2MjMyNDIzOTI5MTI0Ij4i4KSJ4KSq4KSv4KWL4KSX4KSV4KSw4KWN4KSk4KS+IOCkoeCkv+CkleCljeCktuCkqOCksOClgCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfdXNlcl9kaWN0X3ByZWZfbmFtZSIgbXNnaWQ9IjUyMjEyNTE1Mjc1NzYwNzc5MCI+IuCkieCkquCkr+Cli+Ckl+CkleCksOCljeCkpOCkviDgpKHgpL/gpJXgpY3gpLbgpKjgpLDgpYAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiLgpKHgpL/gpJXgpY3gpLbgpKjgpLDgpYAg4KSJ4KSq4KSy4KSs4KWN4oCN4KSnIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kb3dubG9hZGluZyIgbXNnaWQ9Ijg1OTQ5NzQ3NjI2NjMwOTU5NiI+IuCkteCksOCljeCkpOCkruCkvuCkqCDgpK7gpYfgpIIg4KSh4KS+4KSJ4KSo4KSy4KWL4KShIOCkueCliyDgpLDgpLngpL4g4KS54KWIIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsZWQiIG1zZ2lkPSI2NDI1NTg2ODk5NjcxMzc4MTYwIj4i4KSH4KSC4KS44KWN4oCN4KSf4KWJ4KSyIOCkueCliCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZGlzYWJsZWQiIG1zZ2lkPSIzNDQ4NTcxMjgwNDkwNzQ2MDMyIj4i4KSH4KSC4KS44KWN4oCN4KSf4KWJ4KSyIOCkueCliCwg4KSF4KSV4KWN4KS34KSuIOCkueCliCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiLgpKHgpL/gpJXgpY3igI3gpLYuIOCkuOClh+CkteCkviDgpLjgpYcg4KSV4KSo4KWH4KSV4KWN4oCN4KSfIOCkleCksOCkqOClhyDgpK7gpYfgpIIg4KS44KSu4KS44KWN4oCN4KSv4KS+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZGljdGlvbmFyaWVzX2F2YWlsYWJsZSIgbXNnaWQ9IjUyMDYyMjUwNzc5NDU2Mzc4MTAiPiLgpJXgpYvgpIgg4KSh4KS/4KSV4KWN4oCN4KS24KSo4KSw4KWAIOCkieCkquCksuCkrOCljeKAjeCkpyDgpKjgpLngpYDgpIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiLgpLDgpYDgpKvgpLzgpY3gpLDgpYfgpLYg4KSV4KSw4KWH4KSCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibGFzdF91cGRhdGUiIG1zZ2lkPSIzMTAxNTQ5NzE5ODI3NjAwMzQ2Ij4i4KSF4KSC4KSk4KS/4KSuIOCkheCkquCkoeClh+CknyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfdXBkYXRpbmciIG1zZ2lkPSI4MjAxODYyNzY3MDQxMzQ3MjAiPiLgpIXgpKrgpKHgpYfgpJ8g4KSm4KWH4KSW4KWHIOCknOCkviDgpLDgpLngpYcg4KS54KWI4KSCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV9sb2FkaW5nIiBtc2dpZD0iODYxMTMzOTE0OTgyNTA0NzQ0NiI+IuCksuCli+CkoSDgpLngpYsg4KSw4KS54KWAIOCkueCliC4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1haW5fZGljdF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjE2Nzk5NjQzMDY5ODAwOTg1NzAiPiLgpK7gpYHgpJbgpY3igI3gpK8g4KSh4KS/4KSV4KWN4oCN4KS24KSo4KSw4KWAIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsIiBtc2dpZD0iNTU4NjUzMTczNjYwOTE4MzMwNCI+IuCksOCkpuCljeCkpiDgpJXgpLDgpYfgpIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJpbnN0YWxsX2RpY3QiIG1zZ2lkPSI1NTI1MDA1NTI0Njk3NjA3ODY1Ij4i4KSH4KSC4KS44KWN4oCN4KSf4KWJ4KSyIOCkleCksOClh+CkgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbF9kb3dubG9hZF9kaWN0IiBtc2dpZD0iNzE2MzE3MzY1MDI5ODgzODM2NyI+IuCkoeCkvuCkieCkqOCksuCli+CkoSDgpLDgpKbgpY3gpKYg4KSV4KSw4KWH4KSCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWJsZV9kaWN0IiBtc2dpZD0iNzY4NTgxMDA0MDIzNjQ5NzcwMCI+IuCkheCkleCljeCkt+CkriDgpJXgpLDgpYfgpIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlbmFibGVfZGljdCIgbXNnaWQ9IjM4NDgxNzk3ODQ3MDI0NzM2ODAiPiLgpLjgpJXgpY3gpLfgpK4g4KSV4KSw4KWH4KSCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVsZXRlX2RpY3QiIG1zZ2lkPSI1ODE3MTU5MjkwNTAzODQzNzY2Ij4i4KS54KSf4KS+4KSP4KSCIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNob3VsZF9kb3dubG9hZF9vdmVyX21ldGVyZWRfcHJvbXB0ICg0OTY1MjY0ODQ5MDU3NjU2NTIxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvd25sb2FkX292ZXJfbWV0ZXJlZCAoNDAyNDAxMzc2NDkzNzg1MDA2MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb19ub3RfZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg2OTYzNzcwODg1MDMzNzY1Mzc4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDU2MDU3NjM3OTY4MDY2MDA0NyI+Ijx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4g4KSV4KWHIOCksuCkv+CkjyDgpKHgpL/gpJXgpY3igI3gpLbgpKjgpLDgpYAg4KSJ4KSq4KSy4KSs4KWN4oCN4KSnIOCkueCliCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM1NTUxNTM4MTI4NTMxNzgzMiI+IuCkuOCkruClgOCkleCljeCkt+CkviDgpJTgpLAg4KSh4KS+4KSJ4KSo4KSy4KWL4KShIOCkleCksOCkqOClhyDgpJXgpYcg4KSy4KS/4KSPIOCkpuCkrOCkvuCkj+CkgiI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLWhyL3N0cmluZ3MueG1sIGIvamF2YS9yZXMvdmFsdWVzLWhyL3N0cmluZ3MueG1sCmluZGV4IDA3MTBkMzAuLjE4NDUzNTYgMTAwNjQ0Ci0tLSBhL2phdmEvcmVzL3ZhbHVlcy1oci9zdHJpbmdzLnhtbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtaHIvc3RyaW5ncy54bWwKQEAgLTE3MCw0ICsxNzAsMzkgQEAKICAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9kZWZhdWx0IiBtc2dpZD0iMzk4ODAxNzg0MDQzMTg4MTQ5MSI+IlphZGFubyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxhbmd1YWdlX3NldHRpbmdzIiBtc2dpZD0iMTY3MTE1MzA1MzIwMTgwOTAzMSI+IkplemlrIGkgdW5vcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdF9pbnB1dF9tZXRob2QiIG1zZ2lkPSI0MzAxNjAyMzc0NjA5Mjc1MDAzIj4iT2RhYmlyIG5hxI1pbmEgdW5vc2EiPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9uYW1lIiBtc2dpZD0iMTAxNzA1ODE4NjMyMjcxNDQwNSI+IkRhdmF0ZWxqIHJqZcSNbmlrYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfcHJvdmlkZXJfbmFtZSIgbXNnaWQ9Ijc3MTA0MTU1OTkzNzExNjEwOTIiPiJEYXZhdGVsaiByamXEjW5pa2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NlcnZpY2VfbmFtZSIgbXNnaWQ9IjU1MTY1MDY5NzM0ODIwMjA1NiI+IlVzbHVnYSByamXEjW5pa2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiJBxb51cmlyYW5lIGluZm9ybWFjaWplIHJqZcSNbmlrYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3NfdGl0bGUiIG1zZ2lkPSI3MjQzOTMwOTY3ODQ1MDIwNDA3Ij4iUmplxI1uaWNpIC0gZG9kYWNpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsX292ZXJfbWV0ZXJlZF9uZXR3b3JrX3Byb21wdCIgbXNnaWQ9IjM2NDI2MzQ2MjM0NjUzNDk3MTYiPiJEb3N0dXBhbiBqZSByamXEjW5payI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3Nfc3VtbWFyeSIgbXNnaWQ9Ijg1OTk2Nzk0MzQ3OTk3NDkwNTMiPiJQb3N0YXZrZSB6YSByamXEjW5pa2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2VyX2RpY3Rpb25hcmllcyIgbXNnaWQ9Ijc1MTk3MzYyMzI0MjM5MjkxMjQiPiJLb3Jpc25pxI1raSByamXEjW5pY2kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X3VzZXJfZGljdF9wcmVmX25hbWUiIG1zZ2lkPSI1MjIxMjUxNTI3NTc2MDc3OTAiPiJLb3Jpc25pxI1raSByamXEjW5payI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfYXZhaWxhYmxlIiBtc2dpZD0iMzE5MjkyMDYwODUyMDYxODA4MyI+IlJqZcSNbmlrIGplIGRvc3R1cGFuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kb3dubG9hZGluZyIgbXNnaWQ9Ijg1OTQ5NzQ3NjI2NjMwOTU5NiI+IlRyZW51dGHEjW5vIHUgcHJldXppbWFuanUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxlZCIgbXNnaWQ9IjY0MjU1ODY4OTk2NzEzNzgxNjAiPiJJbnN0YWxpcmFubyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZGlzYWJsZWQiIG1zZ2lkPSIzNDQ4NTcxMjgwNDkwNzQ2MDMyIj4iSW5zdGFsaXJhbm8sIG9uZW1vZ3XEh2VubyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiJOZW1hIHVzbHVnZSByamXEjW5pa2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19kaWN0aW9uYXJpZXNfYXZhaWxhYmxlIiBtc2dpZD0iNTIwNjIyNTA3Nzk0NTYzNzgxMCI+IlJqZcSNbmljaSBuZWRvc3R1cG5pIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2hlY2tfZm9yX3VwZGF0ZXNfbm93IiBtc2dpZD0iNjQyMDU3OTg2MTI3NjI0OTg2Ij4iT3N2amXFvmkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsYXN0X3VwZGF0ZSIgbXNnaWQ9IjMxMDE1NDk3MTk4Mjc2MDAzNDYiPiJaYWRuamUgYcW+dXJpcmFuamUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX3VwZGF0aW5nIiBtc2dpZD0iODIwMTg2Mjc2NzA0MTM0NzIwIj4iUHJvdmplcmEgYcW+dXJpcmFuamEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX2xvYWRpbmciIG1zZ2lkPSI4NjExMzM5MTQ5ODI1MDQ3NDQ2Ij4iVcSNaXRhdmFuamUuLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtYWluX2RpY3RfZGVzY3JpcHRpb24iIG1zZ2lkPSIxNjc5OTY0MzA2OTgwMDk4NTcwIj4iR2xhdm5pIHJqZcSNbmlrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsIiBtc2dpZD0iNTU4NjUzMTczNjYwOTE4MzMwNCI+Ik9kdXN0YW5pIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5zdGFsbF9kaWN0IiBtc2dpZD0iNTUyNTAwNTUyNDY5NzYwNzg2NSI+Ikluc3RhbGlyYWoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWxfZG93bmxvYWRfZGljdCIgbXNnaWQ9IjcxNjMxNzM2NTAyOTg4MzgzNjciPiJPdGthxb5pIHByZXV6aW1hbmplIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWJsZV9kaWN0IiBtc2dpZD0iNzY4NTgxMDA0MDIzNjQ5NzcwMCI+Ik9uZW1vZ3XEh2kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlbmFibGVfZGljdCIgbXNnaWQ9IjM4NDgxNzk3ODQ3MDI0NzM2ODAiPiJPbW9ndcSHaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlbGV0ZV9kaWN0IiBtc2dpZD0iNTgxNzE1OTI5MDUwMzg0Mzc2NiI+Ikl6YnJpxaFpIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNob3VsZF9kb3dubG9hZF9vdmVyX21ldGVyZWRfcHJvbXB0ICg0OTY1MjY0ODQ5MDU3NjU2NTIxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvd25sb2FkX292ZXJfbWV0ZXJlZCAoNDAyNDAxMzc2NDkzNzg1MDA2MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb19ub3RfZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg2OTYzNzcwODg1MDMzNzY1Mzc4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDU2MDU3NjM3OTY4MDY2MDA0NyI+IkRvc3R1cGFuIGplIHJqZcSNbmlrIHphIDx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4gamV6aWsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24iIG1zZ2lkPSIzNTU1MTUzODEyODUzMTc4MzIiPiJQcml0aXNuaXRlIHphIHByZWdsZWQgaSBwcmV1emltYW5qZSI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLWh1L3N0cmluZ3MueG1sIGIvamF2YS9yZXMvdmFsdWVzLWh1L3N0cmluZ3MueG1sCmluZGV4IGU5YzdhYTAuLjU1Y2QzYzIgMTAwNjQ0Ci0tLSBhL2phdmEvcmVzL3ZhbHVlcy1odS9zdHJpbmdzLnhtbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtaHUvc3RyaW5ncy54bWwKQEAgLTE3MCw0ICsxNzAsMzkgQEAKICAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9kZWZhdWx0IiBtc2dpZD0iMzk4ODAxNzg0MDQzMTg4MTQ5MSI+IkFsYXDDqXJ0ZWxtZXpldHQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYW5ndWFnZV9zZXR0aW5ncyIgbXNnaWQ9IjE2NzExNTMwNTMyMDE4MDkwMzEiPiJOeWVsdiDDqXMgYmV2aXRlbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdF9pbnB1dF9tZXRob2QiIG1zZ2lkPSI0MzAxNjAyMzc0NjA5Mjc1MDAzIj4iQmV2aXRlbGkgbcOzZCBraXbDoWxhc3p0w6FzYSI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4iU3rDs3TDoXJzem9sZ8OhbHRhdMOzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9wcm92aWRlcl9uYW1lIiBtc2dpZD0iNzcxMDQxNTU5OTM3MTE2MTA5MiI+IlN6w7N0w6Fyc3pvbGfDoWx0YXTDsyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2VydmljZV9uYW1lIiBtc2dpZD0iNTUxNjUwNjk3MzQ4MjAyMDU2Ij4iU3rDs3TDoXIgc3pvbGfDoWx0YXTDoXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiJTesOzdMOhcmZyaXNzw610w6lzc2VsIGthcGNzb2xhdG9zIGluZm9ybcOhY2nDs2siPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3RpdGxlIiBtc2dpZD0iNzI0MzkzMDk2Nzg0NTAyMDQwNyI+IkLFkXbDrXRtw6lueWVrOiBzesOzdMOhcmFrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsX292ZXJfbWV0ZXJlZF9uZXR3b3JrX3Byb21wdCIgbXNnaWQ9IjM2NDI2MzQ2MjM0NjUzNDk3MTYiPiJWYW4gcmVuZGVsa2V6w6lzcmUgw6FsbMOzIHN6w7N0w6FyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc19zdW1tYXJ5IiBtc2dpZD0iODU5OTY3OTQzNDc5OTc0OTA1MyI+IlN6w7N0w6FyYWsgYmXDoWxsw610w6FzYWkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2VyX2RpY3Rpb25hcmllcyIgbXNnaWQ9Ijc1MTk3MzYyMzI0MjM5MjkxMjQiPiJGZWxoYXN6bsOhbMOzaSBzesOzdMOhcmFrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4iRmVsaGFzem7DoWzDs2kgc3rDs3TDoXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiJWYW4gcmVuZGVsa2V6w6lzcmUgw6FsbMOzIHN6w7N0w6FyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kb3dubG9hZGluZyIgbXNnaWQ9Ijg1OTQ5NzQ3NjI2NjMwOTU5NiI+IkplbGVubGVnaSBsZXTDtmx0w6lzZWsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxlZCIgbXNnaWQ9IjY0MjU1ODY4OTk2NzEzNzgxNjAiPiJUZWxlcMOtdHZlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kaXNhYmxlZCIgbXNnaWQ9IjM0NDg1NzEyODA0OTA3NDYwMzIiPiJUZWxlcMOtdHZlLCBraWthcGNzb2x2YSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiJDc2F0bGFrb3rDoXNpIGhpYmEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19kaWN0aW9uYXJpZXNfYXZhaWxhYmxlIiBtc2dpZD0iNTIwNjIyNTA3Nzk0NTYzNzgxMCI+Ik5pbmNzIHN6w7N0w6FyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2hlY2tfZm9yX3VwZGF0ZXNfbm93IiBtc2dpZD0iNjQyMDU3OTg2MTI3NjI0OTg2Ij4iRnJpc3PDrXTDqXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsYXN0X3VwZGF0ZSIgbXNnaWQ9IjMxMDE1NDk3MTk4Mjc2MDAzNDYiPiJVdG9sasOhcmEgZnJpc3PDrXR2ZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfdXBkYXRpbmciIG1zZ2lkPSI4MjAxODYyNzY3MDQxMzQ3MjAiPiJGcmlzc8OtdMOpc2VrIGtlcmVzw6lzZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfbG9hZGluZyIgbXNnaWQ9Ijg2MTEzMzkxNDk4MjUwNDc0NDYiPiJCZXTDtmx0w6lzLi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWFpbl9kaWN0X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMTY3OTk2NDMwNjk4MDA5ODU3MCI+IkbFkSBzesOzdMOhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbCIgbXNnaWQ9IjU1ODY1MzE3MzY2MDkxODMzMDQiPiJNw6lnc2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJpbnN0YWxsX2RpY3QiIG1zZ2lkPSI1NTI1MDA1NTI0Njk3NjA3ODY1Ij4iVGVsZXDDrXTDqXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWxfZG93bmxvYWRfZGljdCIgbXNnaWQ9IjcxNjMxNzM2NTAyOTg4MzgzNjciPiJMZXTDtmx0w6lzIG1lZ3N6YWvDrXTDoXNhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWJsZV9kaWN0IiBtc2dpZD0iNzY4NTgxMDA0MDIzNjQ5NzcwMCI+Iktpa2FwY3NvbMOhcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVuYWJsZV9kaWN0IiBtc2dpZD0iMzg0ODE3OTc4NDcwMjQ3MzY4MCI+IkJla2FwY3NvbMOhcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlbGV0ZV9kaWN0IiBtc2dpZD0iNTgxNzE1OTI5MDUwMzg0Mzc2NiI+IlTDtnJsw6lzIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNob3VsZF9kb3dubG9hZF9vdmVyX21ldGVyZWRfcHJvbXB0ICg0OTY1MjY0ODQ5MDU3NjU2NTIxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvd25sb2FkX292ZXJfbWV0ZXJlZCAoNDAyNDAxMzc2NDkzNzg1MDA2MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb19ub3RfZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg2OTYzNzcwODg1MDMzNzY1Mzc4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDU2MDU3NjM3OTY4MDY2MDA0NyI+Ijx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4gbnllbHZoZXogdmFuIHJlbmRlbGtlesOpc3JlIMOhbGzDsyBzesOzdMOhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM1NTUxNTM4MTI4NTMxNzgzMiI+Ik55b21qYSBtZWcgYXogw6F0dGVraW50w6lzaGV6IMOpcyBsZXTDtmx0w6lzaGV6Ijwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMtaW4vc3RyaW5ncy54bWwgYi9qYXZhL3Jlcy92YWx1ZXMtaW4vc3RyaW5ncy54bWwKaW5kZXggNWVmZThkZC4uZjliMDI4YyAxMDA2NDQKLS0tIGEvamF2YS9yZXMvdmFsdWVzLWluL3N0cmluZ3MueG1sCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1pbi9zdHJpbmdzLnhtbApAQCAtMTcwLDQgKzE3MCwzOSBAQAogICAgIDxzdHJpbmcgbmFtZT0iYnV0dG9uX2RlZmF1bHQiIG1zZ2lkPSIzOTg4MDE3ODQwNDMxODgxNDkxIj4iRGVmYXVsdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxhbmd1YWdlX3NldHRpbmdzIiBtc2dpZD0iMTY3MTE1MzA1MzIwMTgwOTAzMSI+IkJhaGFzYSAmYW1wOyBtYXN1a2FuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0X2lucHV0X21ldGhvZCIgbXNnaWQ9IjQzMDE2MDIzNzQ2MDkyNzUwMDMiPiJQaWxpaCBtZXRvZGUgbWFzdWthbiI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4iUGVueWVkaWEgS2FtdXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3Byb3ZpZGVyX25hbWUiIG1zZ2lkPSI3NzEwNDE1NTk5MzcxMTYxMDkyIj4iUGVueWVkaWEgS2FtdXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NlcnZpY2VfbmFtZSIgbXNnaWQ9IjU1MTY1MDY5NzM0ODIwMjA1NiI+IkxheWFuYW4gS2FtdXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiJJbmZvcm1hc2kgcGVtYmFydWFuIGthbXVzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc190aXRsZSIgbXNnaWQ9IjcyNDM5MzA5Njc4NDUwMjA0MDciPiJLYW11cyBwZW5nYXlhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsX292ZXJfbWV0ZXJlZF9uZXR3b3JrX3Byb21wdCIgbXNnaWQ9IjM2NDI2MzQ2MjM0NjUzNDk3MTYiPiJLYW11cyB0ZXJzZWRpYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3Nfc3VtbWFyeSIgbXNnaWQ9Ijg1OTk2Nzk0MzQ3OTk3NDkwNTMiPiJTZXRlbGFuIHVudHVrIGthbXVzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNlcl9kaWN0aW9uYXJpZXMiIG1zZ2lkPSI3NTE5NzM2MjMyNDIzOTI5MTI0Ij4iS2FtdXMgcGVuZ2d1bmEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X3VzZXJfZGljdF9wcmVmX25hbWUiIG1zZ2lkPSI1MjIxMjUxNTI3NTc2MDc3OTAiPiJLYW11cyBwZW5nZ3VuYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfYXZhaWxhYmxlIiBtc2dpZD0iMzE5MjkyMDYwODUyMDYxODA4MyI+IkthbXVzIHlhbmcgdGVyc2VkaWEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rvd25sb2FkaW5nIiBtc2dpZD0iODU5NDk3NDc2MjY2MzA5NTk2Ij4iU2FhdCBpbmkgc2VkYW5nIG1lbmd1bmR1aCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbGVkIiBtc2dpZD0iNjQyNTU4Njg5OTY3MTM3ODE2MCI+IlRlcnBhc2FuZyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZGlzYWJsZWQiIG1zZ2lkPSIzNDQ4NTcxMjgwNDkwNzQ2MDMyIj4iVGVycGFzYW5nLCBkaW5vbmFrdGlma2FuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2Fubm90X2Nvbm5lY3RfdG9fZGljdF9zZXJ2aWNlIiBtc2dpZD0iNjg3NTY2NTQ5NDcyNjMwMDQyNyI+Ik1hc2FsYWgga29uZWtzaSBrZSBsYXlhbmFuIGthbXVzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZGljdGlvbmFyaWVzX2F2YWlsYWJsZSIgbXNnaWQ9IjUyMDYyMjUwNzc5NDU2Mzc4MTAiPiJUaWRhayB0ZXJzZWRpYSBrYW11cyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNoZWNrX2Zvcl91cGRhdGVzX25vdyIgbXNnaWQ9IjY0MjA1Nzk4NjEyNzYyNDk4NiI+IlNlZ2Fya2FuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibGFzdF91cGRhdGUiIG1zZ2lkPSIzMTAxNTQ5NzE5ODI3NjAwMzQ2Ij4iVGVyYWtoaXIgZGlwZXJiYXJ1aSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfdXBkYXRpbmciIG1zZ2lkPSI4MjAxODYyNzY3MDQxMzQ3MjAiPiJNZW1lcmlrc2EgcGVtYmFydWFuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV9sb2FkaW5nIiBtc2dpZD0iODYxMTMzOTE0OTgyNTA0NzQ0NiI+Ik1lbXVhdC4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1haW5fZGljdF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjE2Nzk5NjQzMDY5ODAwOTg1NzAiPiJLYW11cyB1dGFtYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbCIgbXNnaWQ9IjU1ODY1MzE3MzY2MDkxODMzMDQiPiJCYXRhbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imluc3RhbGxfZGljdCIgbXNnaWQ9IjU1MjUwMDU1MjQ2OTc2MDc4NjUiPiJQYXNhbmciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWxfZG93bmxvYWRfZGljdCIgbXNnaWQ9IjcxNjMxNzM2NTAyOTg4MzgzNjciPiJCYXRhbGthbiB1bmR1aGFuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWJsZV9kaWN0IiBtc2dpZD0iNzY4NTgxMDA0MDIzNjQ5NzcwMCI+Ik5vbmFrdGlma2FuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZW5hYmxlX2RpY3QiIG1zZ2lkPSIzODQ4MTc5Nzg0NzAyNDczNjgwIj4iQWt0aWZrYW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfZGljdCIgbXNnaWQ9IjU4MTcxNTkyOTA1MDM4NDM3NjYiPiJIYXB1cyI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaG91bGRfZG93bmxvYWRfb3Zlcl9tZXRlcmVkX3Byb21wdCAoNDk2NTI2NDg0OTA1NzY1NjUyMSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb3dubG9hZF9vdmVyX21ldGVyZWQgKDQwMjQwMTM3NjQ5Mzc4NTAwNjEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZG9fbm90X2Rvd25sb2FkX292ZXJfbWV0ZXJlZCAoNjk2Mzc3MDg4NTAzMzc2NTM3OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ1NjA1NzYzNzk2ODA2NjAwNDciPiJLYW11cyB0ZXJzZWRpYSB1bnR1ayBiYWhhc2EgPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM1NTUxNTM4MTI4NTMxNzgzMiI+IlRla2FuIHVudHVrIG1lbmluamF1IGRhbiBtZW5ndW5kdWgiPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1pdC9zdHJpbmdzLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1pdC9zdHJpbmdzLnhtbAppbmRleCAwYTYyZjhhLi41MmE5OWM0IDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMtaXQvc3RyaW5ncy54bWwKKysrIGIvamF2YS9yZXMvdmFsdWVzLWl0L3N0cmluZ3MueG1sCkBAIC0xNzAsNCArMTcwLDM2IEBACiAgICAgPHN0cmluZyBuYW1lPSJidXR0b25fZGVmYXVsdCIgbXNnaWQ9IjM5ODgwMTc4NDA0MzE4ODE0OTEiPiJQcmVkZWZpbml0byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxhbmd1YWdlX3NldHRpbmdzIiBtc2dpZD0iMTY3MTE1MzA1MzIwMTgwOTAzMSI+Ikxpbmd1YSBlIGlucHV0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0X2lucHV0X21ldGhvZCIgbXNnaWQ9IjQzMDE2MDIzNzQ2MDkyNzUwMDMiPiJTY2VnbGkgaWwgbWV0b2RvIGRpIGltbWlzc2lvbmUiPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9uYW1lIiBtc2dpZD0iMTAxNzA1ODE4NjMyMjcxNDQwNSI+IkRpY3Rpb25hcnkgUHJvdmlkZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3Byb3ZpZGVyX25hbWUiIG1zZ2lkPSI3NzEwNDE1NTk5MzcxMTYxMDkyIj4iRGljdGlvbmFyeSBQcm92aWRlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2VydmljZV9uYW1lIiBtc2dpZD0iNTUxNjUwNjk3MzQ4MjAyMDU2Ij4iU2Vydml6aW8gZGl6aW9uYXJpbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRvd25sb2FkX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzI3NDg2MTUxNDY5NTAzMjk1NCI+IkluZm9ybWF6aW9uaSBhZ2dpb3JuYXRlIGRpemlvbmFyaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3NfdGl0bGUiIG1zZ2lkPSI3MjQzOTMwOTY3ODQ1MDIwNDA3Ij4iRGl6aW9uYXJpIGFnZ2l1bnRpdmkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxfb3Zlcl9tZXRlcmVkX25ldHdvcmtfcHJvbXB0IiBtc2dpZD0iMzY0MjYzNDYyMzQ2NTM0OTcxNiI+IkRpemlvbmFyaW8gZGlzcG9uaWJpbGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4iSW1wb3N0YXppb25pIHBlciBkaXppb25hcmkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2VyX2RpY3Rpb25hcmllcyIgbXNnaWQ9Ijc1MTk3MzYyMzI0MjM5MjkxMjQiPiJEaXppb25hcmkgdXRlbnRlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4iRGl6aW9uYXJpbyB1dGVudGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiJEaXppb25hcmlvIGRpc3BvbmliaWxlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kb3dubG9hZGluZyIgbXNnaWQ9Ijg1OTQ5NzQ3NjI2NjMwOTU5NiI+IkluIGZhc2UgZGkgZG93bmxvYWQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxlZCIgbXNnaWQ9IjY0MjU1ODY4OTk2NzEzNzgxNjAiPiJJbnN0YWxsYXRvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kaXNhYmxlZCIgbXNnaWQ9IjM0NDg1NzEyODA0OTA3NDYwMzIiPiJJbnN0YWxsYXRvLCBkaXNhYmlsaXRhdG8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5ub3RfY29ubmVjdF90b19kaWN0X3NlcnZpY2UiIG1zZ2lkPSI2ODc1NjY1NDk0NzI2MzAwNDI3Ij4iUHJvYmxlbWEgY29ubmVzcy4gZGl6aW9uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2RpY3Rpb25hcmllc19hdmFpbGFibGUiIG1zZ2lkPSI1MjA2MjI1MDc3OTQ1NjM3ODEwIj4iTmVzc3VuIGRpemlvbmFyaW8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiJBZ2dpb3JuYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imxhc3RfdXBkYXRlIiBtc2dpZD0iMzEwMTU0OTcxOTgyNzYwMDM0NiI+IlVsdGltbyBhZ2dpb3JuYW1lbnRvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV91cGRhdGluZyIgbXNnaWQ9IjgyMDE4NjI3NjcwNDEzNDcyMCI+IlZlcmlmaWNhIGRpc3BvbmliaWxpdMOgIGFnZ2lvcm5hbWVudGkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX2xvYWRpbmciIG1zZ2lkPSI4NjExMzM5MTQ5ODI1MDQ3NDQ2Ij4iQ2FyaWNhbWVudG8uLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtYWluX2RpY3RfZGVzY3JpcHRpb24iIG1zZ2lkPSIxNjc5OTY0MzA2OTgwMDk4NTcwIj4iRGl6aW9uYXJpbyBwcmluY2lwYWxlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsIiBtc2dpZD0iNTU4NjUzMTczNjYwOTE4MzMwNCI+IkFubnVsbGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJpbnN0YWxsX2RpY3QiIG1zZ2lkPSI1NTI1MDA1NTI0Njk3NjA3ODY1Ij4iSW5zdGFsbGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWxfZG93bmxvYWRfZGljdCIgbXNnaWQ9IjcxNjMxNzM2NTAyOTg4MzgzNjciPiJBbm51bGxhIGRvd25sb2FkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWJsZV9kaWN0IiBtc2dpZD0iNzY4NTgxMDA0MDIzNjQ5NzcwMCI+IkRpc2F0dGl2YSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVuYWJsZV9kaWN0IiBtc2dpZD0iMzg0ODE3OTc4NDcwMjQ3MzY4MCI+IkFiaWxpdGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfZGljdCIgbXNnaWQ9IjU4MTcxNTkyOTA1MDM4NDM3NjYiPiJFbGltaW5hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQiIG1zZ2lkPSI0OTY1MjY0ODQ5MDU3NjU2NTIxIj4iTGEgbGluZ3VhIHNlbGV6aW9uYXRhIHN1bCB0dW8gZGlzcG9zaXRpdm8gbW9iaWxlIGhhIHVuIGRpemlvbmFyaW8gZGlzcG9uaWJpbGUuJmx0O2JyLyZndDsgVGkgY29uc2lnbGlhbW8gZGkgJmx0O2ImZ3Q7c2NhcmljYXJlJmx0Oy9iJmd0OyBpbCBkaXppb25hcmlvIGRpIDx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4gcGVyIG1pZ2xpb3JhcmUgbFwnZXNwZXJpZW56YSBkaSBkaWdpdGF6aW9uZS4mbHQ7YnIvJmd0OyAmbHQ7YnIvJmd0OyBJbCBkb3dubG9hZCBwb3RyZWJiZSByaWNoaWVkZXJlIHVuIHBhaW8gZGkgbWludXRpIHN1IHJldGkgM0cuIFBvdHJlYmJlcm8gZXNzZXJlIGFwcGxpY2F0ZSBkZWxsZSB0YXJpZmZlIHNlIG5vbiBkaXNwb25pIGRpIHVuICZsdDtiJmd0O3BpYW5vIGRhdGkgaWxsaW1pdGF0byZsdDsvYiZndDsuJmx0O2JyLyZndDsgU2Ugbm9uIHNhaSBiZW5lIHF1YWxlIHBpYW5vIGRhdGkgw6ggaW4gdXNvLCB0aSBjb25zaWdsaWFtbyBkaSB0cm92YXJlIHVuYSBjb25uZXNzaW9uZSBXaS1GaSBwZXIgYXZ2aWFyZSBpbCBkb3dubG9hZCBhdXRvbWF0aWNhbWVudGUuJmx0O2JyLyZndDsgJmx0O2JyLyZndDsgU3VnZ2VyaW1lbnRvLiBQdW9pIHNjYXJpY2FyZSBlIHJpbXVvdmVyZSBpIGRpemlvbmFyaSBwYXNzYW5kbyBhICZsdDtiJmd0O0xpbmd1ZSBlIGltbWlzc2lvbmUmbHQ7L2ImZ3Q7IG5lbCBtZW51ICZsdDtiJmd0O0ltcG9zdGF6aW9uaSZsdDsvYiZndDsgZGVsIHR1byBkaXNwb3NpdGl2byBtb2JpbGUuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfb3Zlcl9tZXRlcmVkIiBtc2dpZD0iNDAyNDAxMzc2NDkzNzg1MDA2MSI+IlNjYXJpY2Egb3JhICg8eGxpZmY6ZyBpZD0iU0laRV9JTl9NRUdBQllURVMiPiUxJC4xZjwveGxpZmY6Zz4gTUIpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG9fbm90X2Rvd25sb2FkX292ZXJfbWV0ZXJlZCIgbXNnaWQ9IjY5NjM3NzA4ODUwMzM3NjUzNzgiPiJTY2FyaWNhIHRyYW1pdGUgV2ktRmkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0NTYwNTc2Mzc5NjgwNjYwMDQ3Ij4iw4ggZGlzcG9uaWJpbGUgdW4gZGl6aW9uYXJpbyBwZXIgPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM1NTUxNTM4MTI4NTMxNzgzMiI+IlByZW1pIHBlciBlc2FtaW5hcmUgZSBzY2FyaWNhcmUiPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1pdy9zdHJpbmdzLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1pdy9zdHJpbmdzLnhtbAppbmRleCAzM2Q5ZmM1Li45ZTU0MTFiIDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMtaXcvc3RyaW5ncy54bWwKKysrIGIvamF2YS9yZXMvdmFsdWVzLWl3L3N0cmluZ3MueG1sCkBAIC0xNzAsNCArMTcwLDM2IEBACiAgICAgPHN0cmluZyBuYW1lPSJidXR0b25fZGVmYXVsdCIgbXNnaWQ9IjM5ODgwMTc4NDA0MzE4ODE0OTEiPiLXkdeo15nXqNeqINee15fXk9ecIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGFuZ3VhZ2Vfc2V0dGluZ3MiIG1zZ2lkPSIxNjcxMTUzMDUzMjAxODA5MDMxIj4i16nXpNeUINeV16fXnNeYIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0X2lucHV0X21ldGhvZCIgbXNnaWQ9IjQzMDE2MDIzNzQ2MDkyNzUwMDMiPiLXkdeX15nXqNeqINep15nXmNeqINen15zXmCI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4i16HXpNenINeU157Xmdec15XXnyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfcHJvdmlkZXJfbmFtZSIgbXNnaWQ9Ijc3MTA0MTU1OTkzNzExNjEwOTIiPiLXodek16cg15TXnteZ15zXldefIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXJ2aWNlX25hbWUiIG1zZ2lkPSI1NTE2NTA2OTczNDgyMDIwNTYiPiLXqdeZ16jXldeqINee15nXnNeV158iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiLXpNeo15jXmSDXoteT15vXldefINee15nXnNeV158iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3RpdGxlIiBtc2dpZD0iNzI0MzkzMDk2Nzg0NTAyMDQwNyI+IteU15XXodek16og157Xmdec15XXoNeZ150iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxfb3Zlcl9tZXRlcmVkX25ldHdvcmtfcHJvbXB0IiBtc2dpZD0iMzY0MjYzNDYyMzQ2NTM0OTcxNiI+Itee15nXnNeV158g15bXnteZ158iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4i15TXkteT16jXldeqINei15HXldeoINee15nXnNeV16DXmdedIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNlcl9kaWN0aW9uYXJpZXMiIG1zZ2lkPSI3NTE5NzM2MjMyNDIzOTI5MTI0Ij4i157Xmdec15XXoNeZINee16nXqtee16kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X3VzZXJfZGljdF9wcmVmX25hbWUiIG1zZ2lkPSI1MjIxMjUxNTI3NTc2MDc3OTAiPiLXnteZ15zXldefINee16nXqtee16kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiLXnteZ15zXldefINeW157XmdefIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kb3dubG9hZGluZyIgbXNnaWQ9Ijg1OTQ5NzQ3NjI2NjMwOTU5NiI+Itee15XXqNeZ15Mg15vXoteqIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsZWQiIG1zZ2lkPSI2NDI1NTg2ODk5NjcxMzc4MTYwIj4i157Xldeq16fXnyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZGlzYWJsZWQiIG1zZ2lkPSIzNDQ4NTcxMjgwNDkwNzQ2MDMyIj4i157Xldeq16fXnywg157Xldep15HXqiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiLXkdei15nXlCDXkdeU16rXl9eR16jXldeqINec16nXmdeo15XXqiDXlNee15nXnNeV158iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19kaWN0aW9uYXJpZXNfYXZhaWxhYmxlIiBtc2dpZD0iNTIwNjIyNTA3Nzk0NTYzNzgxMCI+IteQ15nXnyDXnteZ15zXldeg15nXnSDXltee15nXoNeZ150iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiLXqNei16DXnyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imxhc3RfdXBkYXRlIiBtc2dpZD0iMzEwMTU0OTcxOTgyNzYwMDM0NiI+Itei15XXk9eb158g15zXkNeX16jXldeg15QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX3VwZGF0aW5nIiBtc2dpZD0iODIwMTg2Mjc2NzA0MTM0NzIwIj4i157Xl9ek16kg16LXk9eb15XXoNeZ150iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX2xvYWRpbmciIG1zZ2lkPSI4NjExMzM5MTQ5ODI1MDQ3NDQ2Ij4i15jXldei158uLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtYWluX2RpY3RfZGVzY3JpcHRpb24iIG1zZ2lkPSIxNjc5OTY0MzA2OTgwMDk4NTcwIj4i157Xmdec15XXnyDXqNeQ16nXmSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbCIgbXNnaWQ9IjU1ODY1MzE3MzY2MDkxODMzMDQiPiLXkdeZ15jXldecIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5zdGFsbF9kaWN0IiBtc2dpZD0iNTUyNTAwNTUyNDY5NzYwNzg2NSI+IteU16rXp9efIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsX2Rvd25sb2FkX2RpY3QiIG1zZ2lkPSI3MTYzMTczNjUwMjk4ODM4MzY3Ij4i15HXmNecINeU15XXqNeT15QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaXNhYmxlX2RpY3QiIG1zZ2lkPSI3Njg1ODEwMDQwMjM2NDk3NzAwIj4i15TXqdeR16oiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlbmFibGVfZGljdCIgbXNnaWQ9IjM4NDgxNzk3ODQ3MDI0NzM2ODAiPiLXlNek15XXmiDXnNek16LXmdecIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVsZXRlX2RpY3QiIG1zZ2lkPSI1ODE3MTU5MjkwNTAzODQzNzY2Ij4i157Xl9enIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQiIG1zZ2lkPSI0OTY1MjY0ODQ5MDU3NjU2NTIxIj4i15zXqdek15Qg15TXoNeR15fXqNeqINeR157Xm9ep15nXqCDXlNeg15nXmdeTINep15zXmiDXmdepINee15nXnNeV158g15bXnteZ158uJmx0O2JyLyZndDsg15DXoNeVINee157XnNeZ16bXmdedICZsdDtiJmd0O9ec15TXldeo15nXkyZsdDsvYiZndDsg15DXqiDXlNee15nXnNeV158g15E8eGxpZmY6ZyBpZD0iTEFOR1VBR0UiPiUxJHM8L3hsaWZmOmc+INeb15PXmSDXnNep16TXqCDXkNeqINeX15XXldeZ15nXqiDXlNeU16fXnNeT15QuJmx0O2JyLyZndDsgJmx0O2JyLyZndDsg15TXlNeV16jXk9eUINei16nXldeZ15Qg15zXkNeo15XXmiDXk9en15Qg15DXlSDXqdeq15nXmdedINeRLTNHLiDXmdeZ16rXm9efINep16rXl9eV15nXkSDXkNedINeQ15nXnyDXnNeaICZsdDtiJmd0O9eq15XXm9eg15nXqiDXoNeq15XXoNeZ150g15HXnNeq15kg157XldeS15HXnNeqJmx0Oy9iJmd0Oy4mbHQ7YnIvJmd0OyDXkNedINeQ15nXoNeaINeR15jXldeXINeQ15nXlteVINeq15XXm9eg15nXqiDXoNeq15XXoNeZ150g15nXqSDXnNeaLCDXkNeg15Ug157Xntec15nXpteZ150g15zXl9ek16kg15fXmdeR15XXqCBXaS1GaSDXm9eT15kg15zXlNeq15fXmdecINeR15TXldeo15PXlCDXkdeQ15XXpNefINeQ15XXmNeV157XmNeZLiZsdDtici8mZ3Q7ICZsdDtici8mZ3Q7INeY15nXpDog16DXmdeq158g15zXlNeV16jXmdeTINeV15zXlNeh15nXqCDXnteZ15zXldeg15nXnSDXkSZsdDtiJmd0O9ep16TXlCDXlden15zXmCZsdDsvYiZndDsg15HXqtek16jXmdeYICZsdDtiJmd0O9eU15LXk9eo15XXqiZsdDsvYiZndDsg16nXnCDXlNee15vXqdeZ16gg15TXoNeZ15nXkyDXqdec15ouIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfb3Zlcl9tZXRlcmVkIiBtc2dpZD0iNDAyNDAxMzc2NDkzNzg1MDA2MSI+IteU15XXqNeTINei15vXqdeZ15UgKDx4bGlmZjpnIGlkPSJTSVpFX0lOX01FR0FCWVRFUyI+JTEkLjFmPC94bGlmZjpnPk1CKSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRvX25vdF9kb3dubG9hZF9vdmVyX21ldGVyZWQiIG1zZ2lkPSI2OTYzNzcwODg1MDMzNzY1Mzc4Ij4i15TXldeo15Mg15HXkNee16bXoteV16ogV2ktRmkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0NTYwNTc2Mzc5NjgwNjYwMDQ3Ij4i15nXqSDXnteZ15zXldefINeW157XmdefINei15HXldeoIDx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24iIG1zZ2lkPSIzNTU1MTUzODEyODUzMTc4MzIiPiLXnNeX16Ug15vXk9eZINec16LXmdeZ158g15XXnNeU15XXqNeZ15MiPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1qYS9zdHJpbmdzLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1qYS9zdHJpbmdzLnhtbAppbmRleCAyNWIzN2E0Li41NDY0ZDYwIDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMtamEvc3RyaW5ncy54bWwKKysrIGIvamF2YS9yZXMvdmFsdWVzLWphL3N0cmluZ3MueG1sCkBAIC0xNzAsNCArMTcwLDM5IEBACiAgICAgPHN0cmluZyBuYW1lPSJidXR0b25fZGVmYXVsdCIgbXNnaWQ9IjM5ODgwMTc4NDA0MzE4ODE0OTEiPiLjg4fjg5Xjgqnjg6vjg4giPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYW5ndWFnZV9zZXR0aW5ncyIgbXNnaWQ9IjE2NzExNTMwNTMyMDE4MDkwMzEiPiLoqIDoqp7jgajlhaXlipsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RfaW5wdXRfbWV0aG9kIiBtc2dpZD0iNDMwMTYwMjM3NDYwOTI3NTAwMyI+IuWFpeWKm+aWueazleOBrumBuOaKniI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4i6L6e5pu45o+Q5L6b5YWDIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9wcm92aWRlcl9uYW1lIiBtc2dpZD0iNzcxMDQxNTU5OTM3MTE2MTA5MiI+Iui+nuabuOaPkOS+m+WFgyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2VydmljZV9uYW1lIiBtc2dpZD0iNTUxNjUwNjk3MzQ4MjAyMDU2Ij4i6L6e5pu4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzMjc0ODYxNTE0Njk1MDMyOTU0Ij4i6L6e5pu444Gu44Ki44OD44OX44OH44O844OI5oOF5aCxIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc190aXRsZSIgbXNnaWQ9IjcyNDM5MzA5Njc4NDUwMjA0MDciPiLjgqLjg4njgqrjg7Povp7mm7giPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxfb3Zlcl9tZXRlcmVkX25ldHdvcmtfcHJvbXB0IiBtc2dpZD0iMzY0MjYzNDYyMzQ2NTM0OTcxNiI+Iui+nuabuOOCkuWIqeeUqOOBp+OBjeOBvuOBmSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3Nfc3VtbWFyeSIgbXNnaWQ9Ijg1OTk2Nzk0MzQ3OTk3NDkwNTMiPiLovp7mm7jjga7oqK3lrpoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2VyX2RpY3Rpb25hcmllcyIgbXNnaWQ9Ijc1MTk3MzYyMzI0MjM5MjkxMjQiPiLljZjoqp7jg6rjgrnjg4giPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X3VzZXJfZGljdF9wcmVmX25hbWUiIG1zZ2lkPSI1MjIxMjUxNTI3NTc2MDc3OTAiPiLljZjoqp7jg6rjgrnjg4giPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiLovp7mm7jjgpLliKnnlKjjgafjgY3jgb7jgZkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rvd25sb2FkaW5nIiBtc2dpZD0iODU5NDk3NDc2MjY2MzA5NTk2Ij4i44OA44Km44Oz44Ot44O844OJ44GX44Gm44GE44G+44GZIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsZWQiIG1zZ2lkPSI2NDI1NTg2ODk5NjcxMzc4MTYwIj4i44Kk44Oz44K544OI44O844Or5riI44G/Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kaXNhYmxlZCIgbXNnaWQ9IjM0NDg1NzEyODA0OTA3NDYwMzIiPiLjgqTjg7Pjgrnjg4jjg7zjg6vmuIjjgb/jgIHnhKHlirkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5ub3RfY29ubmVjdF90b19kaWN0X3NlcnZpY2UiIG1zZ2lkPSI2ODc1NjY1NDk0NzI2MzAwNDI3Ij4i6L6e5pu444Gr5o6l57aa44Gn44GN44G+44Gb44KTIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZGljdGlvbmFyaWVzX2F2YWlsYWJsZSIgbXNnaWQ9IjUyMDYyMjUwNzc5NDU2Mzc4MTAiPiLovp7mm7jjga/jgYLjgorjgb7jgZvjgpMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiLmm7TmlrAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsYXN0X3VwZGF0ZSIgbXNnaWQ9IjMxMDE1NDk3MTk4Mjc2MDAzNDYiPiLmnIDntYLmm7TmlrDml6UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX3VwZGF0aW5nIiBtc2dpZD0iODIwMTg2Mjc2NzA0MTM0NzIwIj4i44Ki44OD44OX44OH44O844OI44KS56K66KqN44GX44Gm44GE44G+44GZIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV9sb2FkaW5nIiBtc2dpZD0iODYxMTMzOTE0OTgyNTA0NzQ0NiI+IuiqreOBv+i+vOOBv+S4rS4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1haW5fZGljdF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjE2Nzk5NjQzMDY5ODAwOTg1NzAiPiLjg6HjgqTjg7Povp7mm7giPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWwiIG1zZ2lkPSI1NTg2NTMxNzM2NjA5MTgzMzA0Ij4i44Kt44Oj44Oz44K744OrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5zdGFsbF9kaWN0IiBtc2dpZD0iNTUyNTAwNTUyNDY5NzYwNzg2NSI+IuOCpOODs+OCueODiOODvOODqyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbF9kb3dubG9hZF9kaWN0IiBtc2dpZD0iNzE2MzE3MzY1MDI5ODgzODM2NyI+IuODgOOCpuODs+ODreODvOODieOCkuOCreODo+ODs+OCu+ODqyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpc2FibGVfZGljdCIgbXNnaWQ9Ijc2ODU4MTAwNDAyMzY0OTc3MDAiPiLnhKHlirnjgavjgZnjgosiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlbmFibGVfZGljdCIgbXNnaWQ9IjM4NDgxNzk3ODQ3MDI0NzM2ODAiPiLmnInlirnjgavjgZnjgosiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfZGljdCIgbXNnaWQ9IjU4MTcxNTkyOTA1MDM4NDM3NjYiPiLliYrpmaQiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQgKDQ5NjUyNjQ4NDkwNTc2NTY1MjEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg0MDI0MDEzNzY0OTM3ODUwMDYxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvX25vdF9kb3dubG9hZF9vdmVyX21ldGVyZWQgKDY5NjM3NzA4ODUwMzM3NjUzNzgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0NTYwNTc2Mzc5NjgwNjYwMDQ3Ij4iPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPuOBrui+nuabuOOCkuWIqeeUqOOBp+OBjeOBvuOBmSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM1NTUxNTM4MTI4NTMxNzgzMiI+IuaKvOOBmeOBqOeiuuiqjS/jg4Djgqbjg7Pjg63jg7zjg4njgafjgY3jgb7jgZkiPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1rby9zdHJpbmdzLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1rby9zdHJpbmdzLnhtbAppbmRleCAzYjAyMjhhLi5jYTFjMmVhIDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMta28vc3RyaW5ncy54bWwKKysrIGIvamF2YS9yZXMvdmFsdWVzLWtvL3N0cmluZ3MueG1sCkBAIC0xNzAsNCArMTcwLDM5IEBACiAgICAgPHN0cmluZyBuYW1lPSJidXR0b25fZGVmYXVsdCIgbXNnaWQ9IjM5ODgwMTc4NDA0MzE4ODE0OTEiPiLquLDrs7jqsJIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYW5ndWFnZV9zZXR0aW5ncyIgbXNnaWQ9IjE2NzExNTMwNTMyMDE4MDkwMzEiPiLslrjslrQg67CPIO2CpOuztOuTnCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdF9pbnB1dF9tZXRob2QiIG1zZ2lkPSI0MzAxNjAyMzc0NjA5Mjc1MDAzIj4i7J6F66ClIOuwqeuylSDshKDtg50iPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9uYW1lIiBtc2dpZD0iMTAxNzA1ODE4NjMyMjcxNDQwNSI+IuyCrOyghCDsoJzqs7Xsl4XssrQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3Byb3ZpZGVyX25hbWUiIG1zZ2lkPSI3NzEwNDE1NTk5MzcxMTYxMDkyIj4i7IKs7KCEIOygnOqzteyXheyytCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2VydmljZV9uYW1lIiBtc2dpZD0iNTUxNjUwNjk3MzQ4MjAyMDU2Ij4i7IKs7KCEIOyEnOu5hOyKpCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRvd25sb2FkX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzI3NDg2MTUxNDY5NTAzMjk1NCI+IuyCrOyghCDsl4XrjbDsnbTtirgg7KCV67O0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc190aXRsZSIgbXNnaWQ9IjcyNDM5MzA5Njc4NDUwMjA0MDciPiLsgqzsoIQg7LaU6rCAIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsX292ZXJfbWV0ZXJlZF9uZXR3b3JrX3Byb21wdCIgbXNnaWQ9IjM2NDI2MzQ2MjM0NjUzNDk3MTYiPiLsgqzsoIQg7IKs7JqpIOqwgOuKpSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3Nfc3VtbWFyeSIgbXNnaWQ9Ijg1OTk2Nzk0MzQ3OTk3NDkwNTMiPiLsgqzsoIQg7ISk7KCVIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNlcl9kaWN0aW9uYXJpZXMiIG1zZ2lkPSI3NTE5NzM2MjMyNDIzOTI5MTI0Ij4i7IKs7Jqp7J6QIOyCrOyghCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfdXNlcl9kaWN0X3ByZWZfbmFtZSIgbXNnaWQ9IjUyMjEyNTE1Mjc1NzYwNzc5MCI+IuyCrOyaqeyekCDsgqzsoIQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiLsgqzsoIQg7IKs7JqpIOqwgOuKpSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZG93bmxvYWRpbmciIG1zZ2lkPSI4NTk0OTc0NzYyNjYzMDk1OTYiPiLtmITsnqwg64uk7Jq066Gc65OcIOykkSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbGVkIiBtc2dpZD0iNjQyNTU4Njg5OTY3MTM3ODE2MCI+IuyEpOy5mOuQqCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZGlzYWJsZWQiIG1zZ2lkPSIzNDQ4NTcxMjgwNDkwNzQ2MDMyIj4i7ISk7LmYIOyZhOujjOuQmOyXiOycvOuCmCDsgqzsmqkg7KSR7KeA65CoIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2Fubm90X2Nvbm5lY3RfdG9fZGljdF9zZXJ2aWNlIiBtc2dpZD0iNjg3NTY2NTQ5NDcyNjMwMDQyNyI+IuyCrOyghCDshJzruYTsiqTsl5Ag7Jew6rKw7ZWY64qUIOuPmeyViCDrrLjsoJzqsIAg67Cc7IOd7ZaI7Iq164uI64ukLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2RpY3Rpb25hcmllc19hdmFpbGFibGUiIG1zZ2lkPSI1MjA2MjI1MDc3OTQ1NjM3ODEwIj4i7IKs7Jqp7ZWgIOyImCDsnojripQg7IKs7KCE7J20IOyXhuyKteuLiOuLpC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiLsg4jroZzqs6DsuagiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsYXN0X3VwZGF0ZSIgbXNnaWQ9IjMxMDE1NDk3MTk4Mjc2MDAzNDYiPiLstZzqt7wg7JeF642w7J207Yq4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV91cGRhdGluZyIgbXNnaWQ9IjgyMDE4NjI3NjcwNDEzNDcyMCI+IuyXheuNsOydtO2KuOulvCDtmZXsnbjtlZjripQg7KSRIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV9sb2FkaW5nIiBtc2dpZD0iODYxMTMzOTE0OTgyNTA0NzQ0NiI+IuuhnOuTnCDspJEuLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtYWluX2RpY3RfZGVzY3JpcHRpb24iIG1zZ2lkPSIxNjc5OTY0MzA2OTgwMDk4NTcwIj4i6riw67O4IOyCrOyghCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbCIgbXNnaWQ9IjU1ODY1MzE3MzY2MDkxODMzMDQiPiLst6jshowiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJpbnN0YWxsX2RpY3QiIG1zZ2lkPSI1NTI1MDA1NTI0Njk3NjA3ODY1Ij4i7ISk7LmYIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsX2Rvd25sb2FkX2RpY3QiIG1zZ2lkPSI3MTYzMTczNjUwMjk4ODM4MzY3Ij4i64uk7Jq066Gc65OcIOy3qOyGjCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpc2FibGVfZGljdCIgbXNnaWQ9Ijc2ODU4MTAwNDAyMzY0OTc3MDAiPiLsgqzsmqkg7KSR7KeAIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZW5hYmxlX2RpY3QiIG1zZ2lkPSIzODQ4MTc5Nzg0NzAyNDczNjgwIj4i7IKs7JqpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVsZXRlX2RpY3QiIG1zZ2lkPSI1ODE3MTU5MjkwNTAzODQzNzY2Ij4i7IKt7KCcIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNob3VsZF9kb3dubG9hZF9vdmVyX21ldGVyZWRfcHJvbXB0ICg0OTY1MjY0ODQ5MDU3NjU2NTIxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvd25sb2FkX292ZXJfbWV0ZXJlZCAoNDAyNDAxMzc2NDkzNzg1MDA2MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb19ub3RfZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg2OTYzNzcwODg1MDMzNzY1Mzc4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDU2MDU3NjM3OTY4MDY2MDA0NyI+Ijx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4g7IKs7KCE7J2EIOyCrOyaqe2VoCDsiJgg7J6I7Iq164uI64ukLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM1NTUxNTM4MTI4NTMxNzgzMiI+IuqygO2GoO2VmOqzoCDri6TsmrTroZzrk5ztlZjroKTrqbQg64iE66W07IS47JqULiI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLWx0L3N0cmluZ3MueG1sIGIvamF2YS9yZXMvdmFsdWVzLWx0L3N0cmluZ3MueG1sCmluZGV4IDliZmZmYmMuLjQ5ZDlhZWMgMTAwNjQ0Ci0tLSBhL2phdmEvcmVzL3ZhbHVlcy1sdC9zdHJpbmdzLnhtbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtbHQvc3RyaW5ncy54bWwKQEAgLTE3MCw0ICsxNzAsMzkgQEAKICAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9kZWZhdWx0IiBtc2dpZD0iMzk4ODAxNzg0MDQzMTg4MTQ5MSI+Ik51bWF0eXRpZWppIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGFuZ3VhZ2Vfc2V0dGluZ3MiIG1zZ2lkPSIxNjcxMTUzMDUzMjAxODA5MDMxIj4iS2FsYmEgaXIgxK92ZXN0aXMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RfaW5wdXRfbWV0aG9kIiBtc2dpZD0iNDMwMTYwMjM3NDYwOTI3NTAwMyI+IlBhc2lyaW5raXRlIMSvdmVzdGllcyBtZXRvZMSFIjwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJhcHBfbmFtZSIgbXNnaWQ9IjEwMTcwNTgxODYzMjI3MTQ0MDUiPiLFvW9keW5vIHRlaWvEl2phcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfcHJvdmlkZXJfbmFtZSIgbXNnaWQ9Ijc3MTA0MTU1OTkzNzExNjEwOTIiPiLFvW9keW5vIHRlaWvEl2phcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2VydmljZV9uYW1lIiBtc2dpZD0iNTUxNjUwNjk3MzQ4MjAyMDU2Ij4ixb1vZHlubyBwYXNsYXVnYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRvd25sb2FkX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzI3NDg2MTUxNDY5NTAzMjk1NCI+IsW9b2R5bm8gYXRuYXVqaW5pbW8gaW5mb3JtYWNpamEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3RpdGxlIiBtc2dpZD0iNzI0MzkzMDk2Nzg0NTAyMDQwNyI+IlBhcGlsZG9taSDFvm9keW5haSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbF9vdmVyX21ldGVyZWRfbmV0d29ya19wcm9tcHQiIG1zZ2lkPSIzNjQyNjM0NjIzNDY1MzQ5NzE2Ij4ixb1vZHluYXMgZ2FsaW1hcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3Nfc3VtbWFyeSIgbXNnaWQ9Ijg1OTk2Nzk0MzQ3OTk3NDkwNTMiPiLFvW9keW7FsyBudXN0YXR5bWFpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNlcl9kaWN0aW9uYXJpZXMiIG1zZ2lkPSI3NTE5NzM2MjMyNDIzOTI5MTI0Ij4iTmF1ZG90b2pvIMW+b2R5bmFpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4iTmF1ZG90b2pvIMW+b2R5bmFzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9hdmFpbGFibGUiIG1zZ2lkPSIzMTkyOTIwNjA4NTIwNjE4MDgzIj4ixb1vZHluYXMgZ2FsaW1hcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZG93bmxvYWRpbmciIG1zZ2lkPSI4NTk0OTc0NzYyNjYzMDk1OTYiPiLFoGl1byBtZXR1IGF0c2lzaXVuxI1pYW1hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsZWQiIG1zZ2lkPSI2NDI1NTg2ODk5NjcxMzc4MTYwIj4ixK5kaWVndGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rpc2FibGVkIiBtc2dpZD0iMzQ0ODU3MTI4MDQ5MDc0NjAzMiI+IsSuZGllZ3RhLCBuZWxlaWTFvmlhbWEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5ub3RfY29ubmVjdF90b19kaWN0X3NlcnZpY2UiIG1zZ2lkPSI2ODc1NjY1NDk0NzI2MzAwNDI3Ij4iUHJpc2lqdW5naW1vIHByaWUgxb5vZHlubyBwYXNsYXVnb3MgcHJvYmxlbWEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19kaWN0aW9uYXJpZXNfYXZhaWxhYmxlIiBtc2dpZD0iNTIwNjIyNTA3Nzk0NTYzNzgxMCI+Ik7El3JhIGdhbGltxbMgxb5vZHluxbMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiJBdG5hdWppbnRpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibGFzdF91cGRhdGUiIG1zZ2lkPSIzMTAxNTQ5NzE5ODI3NjAwMzQ2Ij4iUGFza3V0aW7EryBrYXJ0xIUgYXRuYXVqaW50YSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfdXBkYXRpbmciIG1zZ2lkPSI4MjAxODYyNzY3MDQxMzQ3MjAiPiJJZcWha29tYSBuYXVqaW5pxbMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX2xvYWRpbmciIG1zZ2lkPSI4NjExMzM5MTQ5ODI1MDQ3NDQ2Ij4ixK5rZWxpYW1hLi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWFpbl9kaWN0X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMTY3OTk2NDMwNjk4MDA5ODU3MCI+IlBhZ3JpbmRpbmlzIMW+b2R5bmFzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsIiBtc2dpZD0iNTU4NjUzMTczNjYwOTE4MzMwNCI+IkF0xaFhdWt0aSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imluc3RhbGxfZGljdCIgbXNnaWQ9IjU1MjUwMDU1MjQ2OTc2MDc4NjUiPiLErmRpZWd0aSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbF9kb3dubG9hZF9kaWN0IiBtc2dpZD0iNzE2MzE3MzY1MDI5ODgzODM2NyI+IkF0xaFhdWt0aSBhdHNpc2l1bnRpbcSFIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWJsZV9kaWN0IiBtc2dpZD0iNzY4NTgxMDA0MDIzNjQ5NzcwMCI+Ik5lbGVpc3RpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZW5hYmxlX2RpY3QiIG1zZ2lkPSIzODQ4MTc5Nzg0NzAyNDczNjgwIj4ixK5nYWxpbnRpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVsZXRlX2RpY3QiIG1zZ2lkPSI1ODE3MTU5MjkwNTAzODQzNzY2Ij4iScWhdHJpbnRpIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNob3VsZF9kb3dubG9hZF9vdmVyX21ldGVyZWRfcHJvbXB0ICg0OTY1MjY0ODQ5MDU3NjU2NTIxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvd25sb2FkX292ZXJfbWV0ZXJlZCAoNDAyNDAxMzc2NDkzNzg1MDA2MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb19ub3RfZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg2OTYzNzcwODg1MDMzNzY1Mzc4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDU2MDU3NjM3OTY4MDY2MDA0NyI+IkdhbGltYXMgPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPiDFvm9keW5hcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM1NTUxNTM4MTI4NTMxNzgzMiI+IlBhc3BhdXNraXRlLCBrYWQgcGVyxb5pxatyxJd0dW3El3RlIGlyIGF0c2lzacWzc3R1bcSXdGUiPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1sdi9zdHJpbmdzLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1sdi9zdHJpbmdzLnhtbAppbmRleCA1ZGNhYTAxLi40ZDZmYjNjIDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMtbHYvc3RyaW5ncy54bWwKKysrIGIvamF2YS9yZXMvdmFsdWVzLWx2L3N0cmluZ3MueG1sCkBAIC0xNzAsNCArMTcwLDM2IEBACiAgICAgPHN0cmluZyBuYW1lPSJidXR0b25fZGVmYXVsdCIgbXNnaWQ9IjM5ODgwMTc4NDA0MzE4ODE0OTEiPiJOb2tsdXPEk2p1bXMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYW5ndWFnZV9zZXR0aW5ncyIgbXNnaWQ9IjE2NzExNTMwNTMyMDE4MDkwMzEiPiJWYWxvZGEgdW4gaWV2YWRlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0X2lucHV0X21ldGhvZCIgbXNnaWQ9IjQzMDE2MDIzNzQ2MDkyNzUwMDMiPiJJZXZhZGVzIG1ldG9kZXMgaXp2xJNsZSI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4iVsSBcmRuxKtjYXMgbm9kcm/FoWluxIF0xIFqcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfcHJvdmlkZXJfbmFtZSIgbXNnaWQ9Ijc3MTA0MTU1OTkzNzExNjEwOTIiPiJWxIFyZG7Eq2NhcyBub2Ryb8WhaW7EgXTEgWpzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXJ2aWNlX25hbWUiIG1zZ2lkPSI1NTE2NTA2OTczNDgyMDIwNTYiPiJWxIFyZG7Eq2NhcyBwYWthbHBvanVtcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRvd25sb2FkX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzI3NDg2MTUxNDY5NTAzMjk1NCI+IlbEgXJkbsSrY2FzIGF0amF1bmluxIFqdW1hIGluZm9ybcSBY2lqYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3NfdGl0bGUiIG1zZ2lkPSI3MjQzOTMwOTY3ODQ1MDIwNDA3Ij4iUGlldmllbm9qdW12xIFyZG7Eq2NhcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbF9vdmVyX21ldGVyZWRfbmV0d29ya19wcm9tcHQiIG1zZ2lkPSIzNjQyNjM0NjIzNDY1MzQ5NzE2Ij4iVsSBcmRuxKtjYSBpciBwaWVlamFtYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3Nfc3VtbWFyeSIgbXNnaWQ9Ijg1OTk2Nzk0MzQ3OTk3NDkwNTMiPiJWxIFyZG7Eq2N1IGllc3RhdMSranVtaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzZXJfZGljdGlvbmFyaWVzIiBtc2dpZD0iNzUxOTczNjIzMjQyMzkyOTEyNCI+IkxpZXRvdMSBamEgdsSBcmRuxKtjYXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X3VzZXJfZGljdF9wcmVmX25hbWUiIG1zZ2lkPSI1MjIxMjUxNTI3NTc2MDc3OTAiPiJMaWV0b3TEgWphIHbEgXJkbsSrY2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiJWxIFyZG7Eq2NhIGlyIHBpZWVqYW1hLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZG93bmxvYWRpbmciIG1zZ2lkPSI4NTk0OTc0NzYyNjYzMDk1OTYiPiJOb3RpZWsgbGVqdXBpZWzEgWRlLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbGVkIiBtc2dpZD0iNjQyNTU4Njg5OTY3MTM3ODE2MCI+Ikluc3RhbMSTdGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rpc2FibGVkIiBtc2dpZD0iMzQ0ODU3MTI4MDQ5MDc0NjAzMiI+Ikluc3RhbMSTdGEsIGF0c3DEk2pvdGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5ub3RfY29ubmVjdF90b19kaWN0X3NlcnZpY2UiIG1zZ2lkPSI2ODc1NjY1NDk0NzI2MzAwNDI3Ij4iUHJvYmzEk21hLCBzYXZpZW4uIGFyIHbEgXJkbi4gcGFrLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2RpY3Rpb25hcmllc19hdmFpbGFibGUiIG1zZ2lkPSI1MjA2MjI1MDc3OTQ1NjM3ODEwIj4iVsSBcmRuLiBuYXYgcGllZWphbWFzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2hlY2tfZm9yX3VwZGF0ZXNfbm93IiBtc2dpZD0iNjQyMDU3OTg2MTI3NjI0OTg2Ij4iQXRzdmFpZHppbsSBdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imxhc3RfdXBkYXRlIiBtc2dpZD0iMzEwMTU0OTcxOTgyNzYwMDM0NiI+IlDEk2TEk2pvIHJlaXppIGF0amF1bmluxIF0cyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfdXBkYXRpbmciIG1zZ2lkPSI4MjAxODYyNzY3MDQxMzQ3MjAiPiJOb3RpZWsgcMSBcmJhdWRlLCB2YWkgaXIgcGllZWphbWkgYXRqYXVuaW7EgWp1bWkuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV9sb2FkaW5nIiBtc2dpZD0iODYxMTMzOTE0OTgyNTA0NzQ0NiI+Ik5vdGllayBpZWzEgWRlLi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWFpbl9kaWN0X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMTY3OTk2NDMwNjk4MDA5ODU3MCI+IkdhbHZlbsSBIHbEgXJkbsSrY2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWwiIG1zZ2lkPSI1NTg2NTMxNzM2NjA5MTgzMzA0Ij4iQXRjZWx0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5zdGFsbF9kaWN0IiBtc2dpZD0iNTUyNTAwNTUyNDY5NzYwNzg2NSI+Ikluc3RhbMSTdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbF9kb3dubG9hZF9kaWN0IiBtc2dpZD0iNzE2MzE3MzY1MDI5ODgzODM2NyI+IkF0Y2VsdCBsZWp1cGllbMSBZGkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaXNhYmxlX2RpY3QiIG1zZ2lkPSI3Njg1ODEwMDQwMjM2NDk3NzAwIj4iQXRzcMSTam90Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZW5hYmxlX2RpY3QiIG1zZ2lkPSIzODQ4MTc5Nzg0NzAyNDczNjgwIj4iSWVzcMSTam90Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVsZXRlX2RpY3QiIG1zZ2lkPSI1ODE3MTU5MjkwNTAzODQzNzY2Ij4iRHrEk3N0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQiIG1zZ2lkPSI0OTY1MjY0ODQ5MDU3NjU2NTIxIj4iTW9iaWxhasSBIGllcsSrY8STIGF0bGFzxKt0YWphaSB2YWxvZGFpIGlyIHBpZWVqYW1hIHbEgXJkbsSrY2EuJmx0O2JyLyZndDsgSWV0ZWljYW1zICZsdDtiJmd0O2xlanVwaWVsxIFkxJN0Jmx0Oy9iJmd0OyA8eGxpZmY6ZyBpZD0iTEFOR1VBR0UiPiUxJHM8L3hsaWZmOmc+IHbEgXJkbsSrY3UsIGxhaSB1emxhYm90dSByYWtzdMSrxaFhbmFzIGllc3DEk2phcy4mbHQ7YnIvJmd0OyAmbHQ7YnIvJmd0OyBMZWp1cGllbMSBZGUsIGl6bWFudG9qb3TCoDNHLCBhaXrFhmVtcyBkYcW+YXMgbWluxat0ZXMuIEphIG5lbGlldG9qYXQgJmx0O2ImZ3Q7bmVpZXJvYmXFvm90dSBkYXR1IHBsxIFudSZsdDsvYiZndDssIHZhciB0aWt0IHBpZW3Ek3JvdGEgbWFrc2EuJmx0O2JyLyZndDsgSmEgbmV6aW7EgXQsIGvEgWR1IGRhdHUgcGzEgW51IGxpZXRvamF0LCBhdHJvZGlldCBXaS1GaSBzYXZpZW5vanVtdSwgbGFpIGF1dG9txIF0aXNraSBzxIFrdHUgbGVqdXBpZWzEgWRpLiZsdDtici8mZ3Q7ICZsdDtici8mZ3Q7IFBhZG9tczogdsSBcmRuxKtjYXMgdmFyIGxlanVwaWVsxIFkxJN0IHVuIG5vxYZlbXQgbW9iaWzEgXMgaWVyxKtjZXMgaXp2xJNsbmVzICZsdDtiJmd0O0llc3RhdMSranVtaSZsdDsvYiZndDsgc2FkYcS8xIEgJmx0O2ImZ3Q7VmFsb2RhcyBpZXZhZGUmbHQ7L2ImZ3Q7LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRvd25sb2FkX292ZXJfbWV0ZXJlZCIgbXNnaWQ9IjQwMjQwMTM3NjQ5Mzc4NTAwNjEiPiJMZWp1cGllbMSBZMSTdCB0xatsxKt0ICg8eGxpZmY6ZyBpZD0iU0laRV9JTl9NRUdBQllURVMiPiUxJC4xZjwveGxpZmY6Zz7CoE1CKSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRvX25vdF9kb3dubG9hZF9vdmVyX21ldGVyZWQiIG1zZ2lkPSI2OTYzNzcwODg1MDMzNzY1Mzc4Ij4iTGVqdXBpZWzEgWTEk3QsIGl6bWFudG9qb3QgV2ktRmkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0NTYwNTc2Mzc5NjgwNjYwMDQ3Ij4iSXIgcGllZWphbWEgdsSBcmRuxKtjYSDFocSBZGFpIHZhbG9kYWk6IDx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24iIG1zZ2lkPSIzNTU1MTUzODEyODUzMTc4MzIiPiJOb3NwaWVkaWV0LCBsYWkgcMSBcnNrYXTEq3R1IHVuIGxlanVwaWVsxIFkxJN0dSI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLW1zL3N0cmluZ3MueG1sIGIvamF2YS9yZXMvdmFsdWVzLW1zL3N0cmluZ3MueG1sCmluZGV4IDQ4NjZmZWQuLjdiY2MyODYgMTAwNjQ0Ci0tLSBhL2phdmEvcmVzL3ZhbHVlcy1tcy9zdHJpbmdzLnhtbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtbXMvc3RyaW5ncy54bWwKQEAgLTE3MCw0ICsxNzAsMzkgQEAKICAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9kZWZhdWx0IiBtc2dpZD0iMzk4ODAxNzg0MDQzMTg4MTQ5MSI+IkxhbGFpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGFuZ3VhZ2Vfc2V0dGluZ3MiIG1zZ2lkPSIxNjcxMTUzMDUzMjAxODA5MDMxIj4iQmFoYXNhICZhbXA7IGlucHV0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0X2lucHV0X21ldGhvZCIgbXNnaWQ9IjQzMDE2MDIzNzQ2MDkyNzUwMDMiPiJQaWxpaCBrYWVkYWggaW5wdXQiPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9uYW1lIiBtc2dpZD0iMTAxNzA1ODE4NjMyMjcxNDQwNSI+IlBlbWJla2FsIEthbXVzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9wcm92aWRlcl9uYW1lIiBtc2dpZD0iNzcxMDQxNTU5OTM3MTE2MTA5MiI+IlBlbWJla2FsIEthbXVzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXJ2aWNlX25hbWUiIG1zZ2lkPSI1NTE2NTA2OTczNDgyMDIwNTYiPiJQZXJraGlkbWF0YW4gS2FtdXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiJNYWtsdW1hdCBrZW1hcyBraW5pIGthbXVzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc190aXRsZSIgbXNnaWQ9IjcyNDM5MzA5Njc4NDUwMjA0MDciPiJLYW11cyB0YW1iYWhhbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbF9vdmVyX21ldGVyZWRfbmV0d29ya19wcm9tcHQiIG1zZ2lkPSIzNjQyNjM0NjIzNDY1MzQ5NzE2Ij4iS2FtdXMgdGVyc2VkaWEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4iVGV0YXBhbiB1bnR1ayBrYW11cyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzZXJfZGljdGlvbmFyaWVzIiBtc2dpZD0iNzUxOTczNjIzMjQyMzkyOTEyNCI+IkthbXVzIHBlbmdndW5hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4iS2FtdXMgcGVuZ2d1bmEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiJLYW11cyB0ZXJzZWRpYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZG93bmxvYWRpbmciIG1zZ2lkPSI4NTk0OTc0NzYyNjYzMDk1OTYiPiJTZWRhbmcgbWVtdWF0IHR1cnVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsZWQiIG1zZ2lkPSI2NDI1NTg2ODk5NjcxMzc4MTYwIj4iRGlwYXNhbmciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rpc2FibGVkIiBtc2dpZD0iMzQ0ODU3MTI4MDQ5MDc0NjAzMiI+IkRpcGFzYW5nLCBkaWx1bXB1aGthbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiJNYXNhbGFoIG1lbnlhbWJ1bmcga2VwYWRhIHBlcmtoaWRtYXRhbiBrYW11cyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2RpY3Rpb25hcmllc19hdmFpbGFibGUiIG1zZ2lkPSI1MjA2MjI1MDc3OTQ1NjM3ODEwIj4iVGlhZGEga2FtdXMgdGVyc2VkaWEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiJNdWF0IHNlbXVsYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imxhc3RfdXBkYXRlIiBtc2dpZD0iMzEwMTU0OTcxOTgyNzYwMDM0NiI+IkthbGkgdGVyYWtoaXIgZGlrZW1hcyBraW5pIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV91cGRhdGluZyIgbXNnaWQ9IjgyMDE4NjI3NjcwNDEzNDcyMCI+Ik1lbnllbWFrIGtlbWFzIGtpbmkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX2xvYWRpbmciIG1zZ2lkPSI4NjExMzM5MTQ5ODI1MDQ3NDQ2Ij4iTWVtdWF0a2FuLi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWFpbl9kaWN0X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMTY3OTk2NDMwNjk4MDA5ODU3MCI+IkthbXVzIHV0YW1hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsIiBtc2dpZD0iNTU4NjUzMTczNjYwOTE4MzMwNCI+IkJhdGFsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5zdGFsbF9kaWN0IiBtc2dpZD0iNTUyNTAwNTUyNDY5NzYwNzg2NSI+IlBhc2FuZyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbF9kb3dubG9hZF9kaWN0IiBtc2dpZD0iNzE2MzE3MzY1MDI5ODgzODM2NyI+IkJhdGFsa2FuIG11YXQgdHVydW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaXNhYmxlX2RpY3QiIG1zZ2lkPSI3Njg1ODEwMDQwMjM2NDk3NzAwIj4iTHVtcHVoa2FuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZW5hYmxlX2RpY3QiIG1zZ2lkPSIzODQ4MTc5Nzg0NzAyNDczNjgwIj4iRGF5YWthbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlbGV0ZV9kaWN0IiBtc2dpZD0iNTgxNzE1OTI5MDUwMzg0Mzc2NiI+IlBhZGFtIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNob3VsZF9kb3dubG9hZF9vdmVyX21ldGVyZWRfcHJvbXB0ICg0OTY1MjY0ODQ5MDU3NjU2NTIxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvd25sb2FkX292ZXJfbWV0ZXJlZCAoNDAyNDAxMzc2NDkzNzg1MDA2MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb19ub3RfZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg2OTYzNzcwODg1MDMzNzY1Mzc4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDU2MDU3NjM3OTY4MDY2MDA0NyI+IkthbXVzIHRlcnNlZGlhIHVudHVrIDx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24iIG1zZ2lkPSIzNTU1MTUzODEyODUzMTc4MzIiPiJUZWthbiB1bnR1ayBtZW5ndWxhcyBkYW4gbWVtdWF0IHR1cnVuIjwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMtbmIvc3RyaW5ncy54bWwgYi9qYXZhL3Jlcy92YWx1ZXMtbmIvc3RyaW5ncy54bWwKaW5kZXggMzI3OTNlZi4uMmUxZDQ0ZSAxMDA2NDQKLS0tIGEvamF2YS9yZXMvdmFsdWVzLW5iL3N0cmluZ3MueG1sCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1uYi9zdHJpbmdzLnhtbApAQCAtMTcwLDQgKzE3MCwzNiBAQAogICAgIDxzdHJpbmcgbmFtZT0iYnV0dG9uX2RlZmF1bHQiIG1zZ2lkPSIzOTg4MDE3ODQwNDMxODgxNDkxIj4iU3RhbmRhcmQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYW5ndWFnZV9zZXR0aW5ncyIgbXNnaWQ9IjE2NzExNTMwNTMyMDE4MDkwMzEiPiJTcHLDpWsgb2cgaW5uZGF0YSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdF9pbnB1dF9tZXRob2QiIG1zZ2lkPSI0MzAxNjAyMzc0NjA5Mjc1MDAzIj4iVmVsZyBpbm5kYXRhbWV0b2RlIjwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJhcHBfbmFtZSIgbXNnaWQ9IjEwMTcwNTgxODYzMjI3MTQ0MDUiPiJPcmRsaXN0ZWxldmVyYW5kw7hyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9wcm92aWRlcl9uYW1lIiBtc2dpZD0iNzcxMDQxNTU5OTM3MTE2MTA5MiI+Ik9yZGxpc3RlbGV2ZXJhbmTDuHIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NlcnZpY2VfbmFtZSIgbXNnaWQ9IjU1MTY1MDY5NzM0ODIwMjA1NiI+Ik9yZGJva3RqZW5lc3RlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzMjc0ODYxNTE0Njk1MDMyOTU0Ij4iT3BwZGF0ZXJpbmdzaW5mb3JtYXNqb24gZm9yIG9yZGxpc3RlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc190aXRsZSIgbXNnaWQ9IjcyNDM5MzA5Njc4NDUwMjA0MDciPiJUaWxsZWdnc29yZGxpc3RlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbF9vdmVyX21ldGVyZWRfbmV0d29ya19wcm9tcHQiIG1zZ2lkPSIzNjQyNjM0NjIzNDY1MzQ5NzE2Ij4iT3JkbGlzdGUgZXIgdGlsZ2plbmdlbGlnIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc19zdW1tYXJ5IiBtc2dpZD0iODU5OTY3OTQzNDc5OTc0OTA1MyI+IklubnN0aWxsaW5nZXIgZm9yIG9yZGxpc3RlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzZXJfZGljdGlvbmFyaWVzIiBtc2dpZD0iNzUxOTczNjIzMjQyMzkyOTEyNCI+IkJydWtlcm9yZGxpc3RlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfdXNlcl9kaWN0X3ByZWZfbmFtZSIgbXNnaWQ9IjUyMjEyNTE1Mjc1NzYwNzc5MCI+IkJydWtlcm9yZGxpc3RlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9hdmFpbGFibGUiIG1zZ2lkPSIzMTkyOTIwNjA4NTIwNjE4MDgzIj4iT3JkbGlzdGUgZXIgdGlsZ2plbmdlbGlnIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kb3dubG9hZGluZyIgbXNnaWQ9Ijg1OTQ5NzQ3NjI2NjMwOTU5NiI+Ikxhc3RlciBuZWQgbsOlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsZWQiIG1zZ2lkPSI2NDI1NTg2ODk5NjcxMzc4MTYwIj4iSW5zdGFsbGVydCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZGlzYWJsZWQiIG1zZ2lkPSIzNDQ4NTcxMjgwNDkwNzQ2MDMyIj4iSW5zdGFsbGVydCwgZGVha3RpdmVydCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiJLYW4gaWtrZSBrb2JsZSB0aWwgb3JkbGlzdGV0amVuZXN0ZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19kaWN0aW9uYXJpZXNfYXZhaWxhYmxlIiBtc2dpZD0iNTIwNjIyNTA3Nzk0NTYzNzgxMCI+IkZhbnQgaW5nZW4gb3JkbGlzdGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiJMYXN0IGlubiBww6Ugbnl0dCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imxhc3RfdXBkYXRlIiBtc2dpZD0iMzEwMTU0OTcxOTgyNzYwMDM0NiI+IlNpc3Qgb3BwZGF0ZXJ0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV91cGRhdGluZyIgbXNnaWQ9IjgyMDE4NjI3NjcwNDEzNDcyMCI+IlNlciBldHRlciBvcHBkYXRlcmluZ2VyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV9sb2FkaW5nIiBtc2dpZD0iODYxMTMzOTE0OTgyNTA0NzQ0NiI+Ikxhc3RlciBpbm4g4oCmIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWFpbl9kaWN0X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMTY3OTk2NDMwNjk4MDA5ODU3MCI+IkhvdmVkb3JkbGlzdGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWwiIG1zZ2lkPSI1NTg2NTMxNzM2NjA5MTgzMzA0Ij4iQXZicnl0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5zdGFsbF9kaWN0IiBtc2dpZD0iNTUyNTAwNTUyNDY5NzYwNzg2NSI+Ikluc3RhbGxlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbF9kb3dubG9hZF9kaWN0IiBtc2dpZD0iNzE2MzE3MzY1MDI5ODgzODM2NyI+IkF2YnJ5dCBuZWRsYXN0aW5nZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaXNhYmxlX2RpY3QiIG1zZ2lkPSI3Njg1ODEwMDQwMjM2NDk3NzAwIj4iRGVha3RpdmVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZW5hYmxlX2RpY3QiIG1zZ2lkPSIzODQ4MTc5Nzg0NzAyNDczNjgwIj4iQWt0aXZlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlbGV0ZV9kaWN0IiBtc2dpZD0iNTgxNzE1OTI5MDUwMzg0Mzc2NiI+IlNsZXR0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQiIG1zZ2lkPSI0OTY1MjY0ODQ5MDU3NjU2NTIxIj4iRGV0IHZhbGd0ZSBzcHLDpWtldCBww6UgbW9iaWxlbmVoZXRlbiBkaW4gaGFyIGVuIHRpbGdqZW5nZWxpZyBvcmRsaXN0ZS4mbHQ7YnIvJmd0OyBWaSBhbmJlZmFsZXIgw6UgJmx0O2ImZ3Q7bGFzdGUgbmVkJmx0Oy9iJmd0OyBvcmRsaXN0ZW4gZm9yIDx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4uIERldHRlIGZvcmJlZHJlciBza3JpdmVvcHBsZXZlbHNlbiBkaW4uJmx0O2JyLyZndDsgJmx0O2JyLyZndDsgTmVkbGFzdGluZ2VuIGthbiB0YSBmcmEgZXR0IHRpbCB0byBtaW51dHRlciB2aWEgM0cuIEJlbGFzdG5pbmdlciBrYW4gcMOlbMO4cGUgaHZpcyBkdSBpa2tlIGhhciBldCBhYm9ubmVtZW50IG1lZCAmbHQ7YiZndDt1YmVncmVuc2V0IGRhdGFicnVrJmx0Oy9iJmd0Oy4mbHQ7YnIvJmd0OyBIdmlzIGR1IGVyIHVzaWtrZXIgcMOlIGh2aWxrZW4gYWJvbm5lbWVudHN0eXBlIGR1IGhhciwgYW5iZWZhbGVyIHZpIGRlZyDDpSBmaW5uZSBlbiBXaS1GaS10aWxrb2JsaW5nIGZvciDDpSBzdGFydGUgbmVkbGFzdGluZ2VuIGF1dG9tYXRpc2suJmx0O2JyLyZndDsgJmx0O2JyLyZndDsgVGlwczogRHUga2FuIGxhc3RlIG5lZCBvZyBmamVybmUgb3JkbGlzdGVyIHZlZCDDpSBnw6UgdGlsICZsdDtiJmd0O1NwcsOlayBvZyBpbm5kYXRhJmx0Oy9iJmd0OyBpIG1lbnllbiBmb3IgJmx0O2ImZ3Q7SW5uc3RpbGxpbmdlciZsdDsvYiZndDsgcMOlIG1vYmlsZW5oZXRlbiBkaW4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfb3Zlcl9tZXRlcmVkIiBtc2dpZD0iNDAyNDAxMzc2NDkzNzg1MDA2MSI+Ikxhc3QgbmVkIG7DpSAoPHhsaWZmOmcgaWQ9IlNJWkVfSU5fTUVHQUJZVEVTIj4lMSQuMWY8L3hsaWZmOmc+IE1CKSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRvX25vdF9kb3dubG9hZF9vdmVyX21ldGVyZWQiIG1zZ2lkPSI2OTYzNzcwODg1MDMzNzY1Mzc4Ij4iTGFzdCBuZWQgdmlhIFdpLUZpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDU2MDU3NjM3OTY4MDY2MDA0NyI+IkVuIG9yZGxpc3RlIGVyIHRpbGdqZW5nZWxpZyBmb3IgPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM1NTUxNTM4MTI4NTMxNzgzMiI+IlRyeWtrIGZvciDDpSBzZSBnamVubm9tIG9nIGxhc3RlIG5lZCI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLW5sL3N0cmluZ3MueG1sIGIvamF2YS9yZXMvdmFsdWVzLW5sL3N0cmluZ3MueG1sCmluZGV4IDQ4MjI2MTcuLjU1YWVlNjMgMTAwNjQ0Ci0tLSBhL2phdmEvcmVzL3ZhbHVlcy1ubC9zdHJpbmdzLnhtbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtbmwvc3RyaW5ncy54bWwKQEAgLTE3MCw0ICsxNzAsMzYgQEAKICAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9kZWZhdWx0IiBtc2dpZD0iMzk4ODAxNzg0MDQzMTg4MTQ5MSI+IlN0YW5kYWFyZCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxhbmd1YWdlX3NldHRpbmdzIiBtc2dpZD0iMTY3MTE1MzA1MzIwMTgwOTAzMSI+IlRhYWwgZW4gaW52b2VyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0X2lucHV0X21ldGhvZCIgbXNnaWQ9IjQzMDE2MDIzNzQ2MDkyNzUwMDMiPiJJbnZvZXJtZXRob2RlIHNlbGVjdGVyZW4iPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9uYW1lIiBtc2dpZD0iMTAxNzA1ODE4NjMyMjcxNDQwNSI+Ildvb3JkZW5ib2VrbGV2ZXJhbmNpZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3Byb3ZpZGVyX25hbWUiIG1zZ2lkPSI3NzEwNDE1NTk5MzcxMTYxMDkyIj4iV29vcmRlbmJvZWtsZXZlcmFuY2llciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2VydmljZV9uYW1lIiBtc2dpZD0iNTUxNjUwNjk3MzQ4MjAyMDU2Ij4iV29vcmRlbmJvZWtzZXJ2aWNlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzMjc0ODYxNTE0Njk1MDMyOTU0Ij4iSW5mb3JtYXRpZSBvdmVyIHdvb3JkZW5ib2VrdXBkYXRlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc190aXRsZSIgbXNnaWQ9IjcyNDM5MzA5Njc4NDUwMjA0MDciPiJXb29yZGVuYm9la2VuIHRvZXZvZWdlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbF9vdmVyX21ldGVyZWRfbmV0d29ya19wcm9tcHQiIG1zZ2lkPSIzNjQyNjM0NjIzNDY1MzQ5NzE2Ij4iV29vcmRlbmJvZWsgYmVzY2hpa2JhYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4iSW5zdGVsbGluZ2VuIHZvb3Igd29vcmRlbmJvZWtlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzZXJfZGljdGlvbmFyaWVzIiBtc2dpZD0iNzUxOTczNjIzMjQyMzkyOTEyNCI+IkdlYnJ1aWtlcnN3b29yZGVuYm9la2VuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4iR2VicnVpa2Vyc3dvb3JkZW5ib2VrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9hdmFpbGFibGUiIG1zZ2lkPSIzMTkyOTIwNjA4NTIwNjE4MDgzIj4iV29vcmRlbmJvZWsgYmVzY2hpa2JhYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rvd25sb2FkaW5nIiBtc2dpZD0iODU5NDk3NDc2MjY2MzA5NTk2Ij4iV29yZHQgZ2Vkb3dubG9hZCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbGVkIiBtc2dpZD0iNjQyNTU4Njg5OTY3MTM3ODE2MCI+Ikdlw69uc3RhbGxlZXJkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kaXNhYmxlZCIgbXNnaWQ9IjM0NDg1NzEyODA0OTA3NDYwMzIiPiJHZcOvbnN0YWxsZWVyZCwgdWl0Z2VzY2hha2VsZCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiJWZXJiaW5kaW5nc3Byb2JsZWVtIHdvb3JkZW5ib2Vrc2VydmljZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2RpY3Rpb25hcmllc19hdmFpbGFibGUiIG1zZ2lkPSI1MjA2MjI1MDc3OTQ1NjM3ODEwIj4iR2VlbiB3b29yZGVuYm9la2VuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2hlY2tfZm9yX3VwZGF0ZXNfbm93IiBtc2dpZD0iNjQyMDU3OTg2MTI3NjI0OTg2Ij4iVmVybmlldXdlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imxhc3RfdXBkYXRlIiBtc2dpZD0iMzEwMTU0OTcxOTgyNzYwMDM0NiI+IkxhYXRzdCBiaWpnZXdlcmt0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV91cGRhdGluZyIgbXNnaWQ9IjgyMDE4NjI3NjcwNDEzNDcyMCI+IkNvbnRyb2xlcmVuIG9wIHVwZGF0ZXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX2xvYWRpbmciIG1zZ2lkPSI4NjExMzM5MTQ5ODI1MDQ3NDQ2Ij4iTGFkZW4uLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtYWluX2RpY3RfZGVzY3JpcHRpb24iIG1zZ2lkPSIxNjc5OTY0MzA2OTgwMDk4NTcwIj4iQWxnZW1lZW4gd29vcmRlbmJvZWsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWwiIG1zZ2lkPSI1NTg2NTMxNzM2NjA5MTgzMzA0Ij4iQW5udWxlcmVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5zdGFsbF9kaWN0IiBtc2dpZD0iNTUyNTAwNTUyNDY5NzYwNzg2NSI+Ikluc3RhbGxlcmVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsX2Rvd25sb2FkX2RpY3QiIG1zZ2lkPSI3MTYzMTczNjUwMjk4ODM4MzY3Ij4iRG93bmxvYWQgYW5udWxlcmVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWJsZV9kaWN0IiBtc2dpZD0iNzY4NTgxMDA0MDIzNjQ5NzcwMCI+IlVpdHNjaGFrZWxlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVuYWJsZV9kaWN0IiBtc2dpZD0iMzg0ODE3OTc4NDcwMjQ3MzY4MCI+Ikluc2NoYWtlbGVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVsZXRlX2RpY3QiIG1zZ2lkPSI1ODE3MTU5MjkwNTAzODQzNzY2Ij4iVmVyd2lqZGVyZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzaG91bGRfZG93bmxvYWRfb3Zlcl9tZXRlcmVkX3Byb21wdCIgbXNnaWQ9IjQ5NjUyNjQ4NDkwNTc2NTY1MjEiPiJFciBpcyBlZW4gd29vcmRlbmJvZWsgYmVzY2hpa2JhYXIgdm9vciBkZSBnZXNlbGVjdGVlcmRlIHRhYWwgb3AgdXcgbW9iaWVsZSBhcHBhcmFhdC4mbHQ7YnIvJmd0OyBXZSByYWRlbiB1IGFhbiBoZXQgd29vcmRlbmJvZWsgdm9vciBoZXQgPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPiB0ZSAmbHQ7YiZndDtkb3dubG9hZGVuJmx0Oy9iJmd0OyBvbSB1dyB0eXBldmFhcmRpZ2hlaWQgdGUgdmVyYmV0ZXJlbi4mbHQ7YnIvJmd0OyAmbHQ7YnIvJmd0OyBEZSBkb3dubG9hZCBrYW4gZWVuIG9mIHR3ZWUgbWludXRlbiBkdXJlbiB2aWEgM0cuIEVyIGt1bm5lbiBrb3N0ZW4gd29yZGVuIGJlcmVrZW5kIGFscyB1IGdlZW4gJmx0O2ImZ3Q7b25iZXBlcmt0IGdlZ2V2ZW5zYWJvbm5lbWVudCZsdDsvYiZndDsgaGVlZnQuJmx0O2JyLyZndDsgQWxzIHUgbmlldCB6ZWtlciB3ZWV0IHdlbGsgZ2VnZXZlbnNhYm9ubmVtZW50IHUgaGVlZnQsIHJhZGVuIHdlIHUgYWFuIGVlbiB3aWZpLXZlcmJpbmRpbmcgdGUgem9la2VuIG9tIGRlIGRvd25sb2FkIGF1dG9tYXRpc2NoIHRlIHN0YXJ0ZW4uJmx0O2JyLyZndDsgJmx0O2JyLyZndDsgVGlwOiB1IGt1bnQgd29vcmRlbmJvZWtlbiBkb3dubG9hZGVuIGVuIHZlcndpamRlcmVuIGRvb3IgbmFhciAmbHQ7YiZndDtUYWFsIGVuIGludm9lciZsdDsvYiZndDsgaW4gaGV0IG1lbnUgJmx0O2ImZ3Q7SW5zdGVsbGluZ2VuJmx0Oy9iJmd0OyB2YW4gdXcgbW9iaWVsZSBhcHBhcmFhdCB0ZSBnYWFuLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRvd25sb2FkX292ZXJfbWV0ZXJlZCIgbXNnaWQ9IjQwMjQwMTM3NjQ5Mzc4NTAwNjEiPiJOdSBkb3dubG9hZGVuICg8eGxpZmY6ZyBpZD0iU0laRV9JTl9NRUdBQllURVMiPiUxJC4xZjwveGxpZmY6Zz4gTUIpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG9fbm90X2Rvd25sb2FkX292ZXJfbWV0ZXJlZCIgbXNnaWQ9IjY5NjM3NzA4ODUwMzM3NjUzNzgiPiJEb3dubG9hZGVuIHZpYSB3aWZpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDU2MDU3NjM3OTY4MDY2MDA0NyI+IkVyIGlzIGVlbiB3b29yZGVuYm9layBiZXNjaGlrYmFhciB2b29yIDx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24iIG1zZ2lkPSIzNTU1MTUzODEyODUzMTc4MzIiPiJEcnVrIG9tIHRlIGNvbnRyb2xlcmVuIGVuIHRlIGRvd25sb2FkZW4iPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1wbC9zdHJpbmdzLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1wbC9zdHJpbmdzLnhtbAppbmRleCA3YmI4Yjc3Li42OGZlZDQwIDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMtcGwvc3RyaW5ncy54bWwKKysrIGIvamF2YS9yZXMvdmFsdWVzLXBsL3N0cmluZ3MueG1sCkBAIC0xNzAsNCArMTcwLDM5IEBACiAgICAgPHN0cmluZyBuYW1lPSJidXR0b25fZGVmYXVsdCIgbXNnaWQ9IjM5ODgwMTc4NDA0MzE4ODE0OTEiPiJEb215xZtsbmUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYW5ndWFnZV9zZXR0aW5ncyIgbXNnaWQ9IjE2NzExNTMwNTMyMDE4MDkwMzEiPiJKxJl6eWssIGtsYXdpYXR1cmEsIGfFgm9zIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0X2lucHV0X21ldGhvZCIgbXNnaWQ9IjQzMDE2MDIzNzQ2MDkyNzUwMDMiPiJXeWJpZXJ6IG1ldG9kxJkgd3Byb3dhZHphbmlhIjwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJhcHBfbmFtZSIgbXNnaWQ9IjEwMTcwNTgxODYzMjI3MTQ0MDUiPiJEb3N0YXdjYSBzxYJvd25pa2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3Byb3ZpZGVyX25hbWUiIG1zZ2lkPSI3NzEwNDE1NTk5MzcxMTYxMDkyIj4iRG9zdGF3Y2Egc8WCb3duaWthIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXJ2aWNlX25hbWUiIG1zZ2lkPSI1NTE2NTA2OTczNDgyMDIwNTYiPiJVc8WCdWdhIHPFgm93bmlrYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRvd25sb2FkX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzI3NDg2MTUxNDY5NTAzMjk1NCI+IkluZm9ybWFjamUgbyBha3R1YWxpemFjamkgc8WCb3duaWthIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc190aXRsZSIgbXNnaWQ9IjcyNDM5MzA5Njc4NDUwMjA0MDciPiJTxYJvd25pa2kgZG9kYXRrb3dlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsX292ZXJfbWV0ZXJlZF9uZXR3b3JrX3Byb21wdCIgbXNnaWQ9IjM2NDI2MzQ2MjM0NjUzNDk3MTYiPiJEb3N0xJlwbnkgc8WCb3duaWsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4iVXN0YXdpZW5pYSBzxYJvd25pa8OzdyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzZXJfZGljdGlvbmFyaWVzIiBtc2dpZD0iNzUxOTczNjIzMjQyMzkyOTEyNCI+IlPFgm93bmlraSB1xbx5dGtvd25pa2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X3VzZXJfZGljdF9wcmVmX25hbWUiIG1zZ2lkPSI1MjIxMjUxNTI3NTc2MDc3OTAiPiJTxYJvd25payB1xbx5dGtvd25pa2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiJTxYJvd25payBqZXN0IGRvc3TEmXBueSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZG93bmxvYWRpbmciIG1zZ2lkPSI4NTk0OTc0NzYyNjYzMDk1OTYiPiJBa3R1YWxuaWUgcG9iaWVyYW55Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsZWQiIG1zZ2lkPSI2NDI1NTg2ODk5NjcxMzc4MTYwIj4iWmFpbnN0YWxvd2FueSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZGlzYWJsZWQiIG1zZ2lkPSIzNDQ4NTcxMjgwNDkwNzQ2MDMyIj4iWmFpbnN0YWxvd2FueSwgd3nFgsSFY3pvbnkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5ub3RfY29ubmVjdF90b19kaWN0X3NlcnZpY2UiIG1zZ2lkPSI2ODc1NjY1NDk0NzI2MzAwNDI3Ij4iUHJvYmxlbSB6IHBvxYLEhWN6ZW5pZW0geiB1c8WCdWfEhSBzxYJvd25pa2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19kaWN0aW9uYXJpZXNfYXZhaWxhYmxlIiBtc2dpZD0iNTIwNjIyNTA3Nzk0NTYzNzgxMCI+IkJyYWsgc8WCb3duaWvDs3ciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiJPZMWbd2llxbwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsYXN0X3VwZGF0ZSIgbXNnaWQ9IjMxMDE1NDk3MTk4Mjc2MDAzNDYiPiJPc3RhdG5pYSBha3R1YWxpemFjamEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX3VwZGF0aW5nIiBtc2dpZD0iODIwMTg2Mjc2NzA0MTM0NzIwIj4iU3ByYXdkemFuaWUgZG9zdMSZcG5vxZtjaSBha3R1YWxpemFjamkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX2xvYWRpbmciIG1zZ2lkPSI4NjExMzM5MTQ5ODI1MDQ3NDQ2Ij4iV2N6eXR5d2FuaWUuLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtYWluX2RpY3RfZGVzY3JpcHRpb24iIG1zZ2lkPSIxNjc5OTY0MzA2OTgwMDk4NTcwIj4iU8WCb3duaWsgZ8WCw7N3bnkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWwiIG1zZ2lkPSI1NTg2NTMxNzM2NjA5MTgzMzA0Ij4iQW51bHVqIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5zdGFsbF9kaWN0IiBtc2dpZD0iNTUyNTAwNTUyNDY5NzYwNzg2NSI+IlphaW5zdGFsdWoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWxfZG93bmxvYWRfZGljdCIgbXNnaWQ9IjcxNjMxNzM2NTAyOTg4MzgzNjciPiJBbnVsdWogcG9iaWVyYW5pZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpc2FibGVfZGljdCIgbXNnaWQ9Ijc2ODU4MTAwNDAyMzY0OTc3MDAiPiJXecWCxIVjeiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVuYWJsZV9kaWN0IiBtc2dpZD0iMzg0ODE3OTc4NDcwMjQ3MzY4MCI+IlfFgsSFY3oiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfZGljdCIgbXNnaWQ9IjU4MTcxNTkyOTA1MDM4NDM3NjYiPiJVc3XFhCI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaG91bGRfZG93bmxvYWRfb3Zlcl9tZXRlcmVkX3Byb21wdCAoNDk2NTI2NDg0OTA1NzY1NjUyMSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb3dubG9hZF9vdmVyX21ldGVyZWQgKDQwMjQwMTM3NjQ5Mzc4NTAwNjEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZG9fbm90X2Rvd25sb2FkX292ZXJfbWV0ZXJlZCAoNjk2Mzc3MDg4NTAzMzc2NTM3OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ1NjA1NzYzNzk2ODA2NjAwNDciPiJEbGEgasSZenlrYTogPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPiBqZXN0IGRvc3TEmXBueSBzxYJvd25payI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM1NTUxNTM4MTI4NTMxNzgzMiI+Ik5hY2nFm25paiwgYWJ5IHNwcmF3ZHppxIcgaSBwb2JyYcSHIjwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMtcHQtclBUL3N0cmluZ3MueG1sIGIvamF2YS9yZXMvdmFsdWVzLXB0LXJQVC9zdHJpbmdzLnhtbAppbmRleCBjYWE0MDE5Li4xNWZmNjViIDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMtcHQtclBUL3N0cmluZ3MueG1sCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1wdC1yUFQvc3RyaW5ncy54bWwKQEAgLTE3MCw0ICsxNzAsMzYgQEAKICAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9kZWZhdWx0IiBtc2dpZD0iMzk4ODAxNzg0MDQzMTg4MTQ5MSI+IlByZWRlZmluaWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGFuZ3VhZ2Vfc2V0dGluZ3MiIG1zZ2lkPSIxNjcxMTUzMDUzMjAxODA5MDMxIj4iSWRpb21hIGUgZW50cmFkYSBkZSBzb20iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RfaW5wdXRfbWV0aG9kIiBtc2dpZD0iNDMwMTYwMjM3NDYwOTI3NTAwMyI+IkVzY29saGVyIG8gbcOpdG9kbyBkZSBlbnRyYWRhIjwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJhcHBfbmFtZSIgbXNnaWQ9IjEwMTcwNTgxODYzMjI3MTQ0MDUiPiJGb3JuZWNlZG9yIGRlIERpY2lvbsOhcmlvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9wcm92aWRlcl9uYW1lIiBtc2dpZD0iNzcxMDQxNTU5OTM3MTE2MTA5MiI+IkZvcm5lY2Vkb3IgZGUgRGljaW9uw6FyaW8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NlcnZpY2VfbmFtZSIgbXNnaWQ9IjU1MTY1MDY5NzM0ODIwMjA1NiI+IlNlcnZpw6dvIGRlIERpY2lvbsOhcmlvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzMjc0ODYxNTE0Njk1MDMyOTU0Ij4iSW5mb3JtYcOnw7VlcyBkZSBhdHVhbGl6YcOnw6NvIGRvIGRpY2lvbsOhcmlvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc190aXRsZSIgbXNnaWQ9IjcyNDM5MzA5Njc4NDUwMjA0MDciPiJEaWNpb27DoXJpb3Mgc3VwbGVtZW50YXJlcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbF9vdmVyX21ldGVyZWRfbmV0d29ya19wcm9tcHQiIG1zZ2lkPSIzNjQyNjM0NjIzNDY1MzQ5NzE2Ij4iRGljaW9uw6FyaW8gZGlzcG9uw612ZWwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4iRGVmaW5pw6fDtWVzIGRvcyBkaWNpb27DoXJpb3MiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2VyX2RpY3Rpb25hcmllcyIgbXNnaWQ9Ijc1MTk3MzYyMzI0MjM5MjkxMjQiPiJEaWNpb27DoXJpb3MgZG8gdXRpbGl6YWRvciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfdXNlcl9kaWN0X3ByZWZfbmFtZSIgbXNnaWQ9IjUyMjEyNTE1Mjc1NzYwNzc5MCI+IkRpY2lvbsOhcmlvIGRvIHV0aWxpemFkb3IiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiJEaWNpb27DoXJpbyBkaXNwb27DrXZlbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZG93bmxvYWRpbmciIG1zZ2lkPSI4NTk0OTc0NzYyNjYzMDk1OTYiPiJUcmFuc2ZlcsOqbmNpYSBlbSBjdXJzbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbGVkIiBtc2dpZD0iNjQyNTU4Njg5OTY3MTM3ODE2MCI+Ikluc3RhbGFkbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZGlzYWJsZWQiIG1zZ2lkPSIzNDQ4NTcxMjgwNDkwNzQ2MDMyIj4iSW5zdGFsYWRvLCBkZXNhdGl2YWRvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2Fubm90X2Nvbm5lY3RfdG9fZGljdF9zZXJ2aWNlIiBtc2dpZD0iNjg3NTY2NTQ5NDcyNjMwMDQyNyI+IlByb2JsZW1hIGFvIGxpZ2FyIGFvIHNlcnZpw6dvIGRlIGRpY2lvbsOhcmlvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZGljdGlvbmFyaWVzX2F2YWlsYWJsZSIgbXNnaWQ9IjUyMDYyMjUwNzc5NDU2Mzc4MTAiPiJTZW0gZGljaW9uw6FyaW9zIGRpc3BvbsOtdmVpcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNoZWNrX2Zvcl91cGRhdGVzX25vdyIgbXNnaWQ9IjY0MjA1Nzk4NjEyNzYyNDk4NiI+IkF0dWFsaXphciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imxhc3RfdXBkYXRlIiBtc2dpZD0iMzEwMTU0OTcxOTgyNzYwMDM0NiI+IsOabHRpbWEgYXR1YWxpemHDp8OjbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfdXBkYXRpbmciIG1zZ2lkPSI4MjAxODYyNzY3MDQxMzQ3MjAiPiJBIHZlcmlmaWNhciBleGlzdMOqbmNpYSBkZSBhdHVhbGl6YcOnw7VlcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfbG9hZGluZyIgbXNnaWQ9Ijg2MTEzMzkxNDk4MjUwNDc0NDYiPiJBIGNhcnJlZ2FyLi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWFpbl9kaWN0X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMTY3OTk2NDMwNjk4MDA5ODU3MCI+IkRpY2lvbsOhcmlvIHByaW5jaXBhbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbCIgbXNnaWQ9IjU1ODY1MzE3MzY2MDkxODMzMDQiPiJDYW5jZWxhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imluc3RhbGxfZGljdCIgbXNnaWQ9IjU1MjUwMDU1MjQ2OTc2MDc4NjUiPiJJbnN0YWxhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbF9kb3dubG9hZF9kaWN0IiBtc2dpZD0iNzE2MzE3MzY1MDI5ODgzODM2NyI+IkNhbmNlbGFyIHRyYW5zZmVyw6puY2lhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWJsZV9kaWN0IiBtc2dpZD0iNzY4NTgxMDA0MDIzNjQ5NzcwMCI+IkRlc2F0aXZhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVuYWJsZV9kaWN0IiBtc2dpZD0iMzg0ODE3OTc4NDcwMjQ3MzY4MCI+IkF0aXZhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlbGV0ZV9kaWN0IiBtc2dpZD0iNTgxNzE1OTI5MDUwMzg0Mzc2NiI+IkVsaW1pbmFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQiIG1zZ2lkPSI0OTY1MjY0ODQ5MDU3NjU2NTIxIj4iTyBpZGlvbWEgc2VsZWNpb25hZG8gbm8gc2V1IGRpc3Bvc2l0aXZvIG3Ds3ZlbCB0ZW0gdW0gZGljaW9uw6FyaW8gZGlzcG9uw612ZWwuJmx0O2JyLyZndDsgUmVjb21lbmRhbW9zIHF1ZSAmbHQ7YiZndDt0cmFuc2ZpcmEmbHQ7L2ImZ3Q7IG8gZGljaW9uw6FyaW8gPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPiBwYXJhIG1lbGhvcmFyIGEgc3VhIGV4cGVyacOqbmNpYSBkZSBpbnRyb2R1w6fDo28uJmx0O2JyLyZndDsgJmx0O2JyLyZndDsgQSB0cmFuc2ZlcsOqbmNpYSBwb2RlIGRlbW9yYXIgdW0gb3UgZG9pcyBtaW51dG9zIHZpYSAzRy4gUG9kZXLDo28gc2VyIGFwbGljYWRhcyB0YXhhcyBzZSBuw6NvIHRpdmVyIHVtICZsdDtiJmd0O3BsYW5vIGRlIGRhZG9zIGlsaW1pdGFkbyZsdDsvYiZndDsuJmx0O2JyLyZndDsgU2UgbsOjbyB0aXZlciBhIGNlcnRlemEgZG8gcGxhbm8gZGUgZGFkb3MgcXVlIHRlbSwgcmVjb21lbmRhbW9zIHF1ZSBsb2NhbGl6ZSB1bWEgbGlnYcOnw6NvIFdpLUZpIHBhcmEgY29tZcOnYXIgYSB0cmFuc2ZlcsOqbmNpYSBhdXRvbWF0aWNhbWVudGUuJmx0O2JyLyZndDsgJmx0O2JyLyZndDsgU3VnZXN0w6NvOiBwb2RlIHRyYW5zZmVyaXIgZSByZW1vdmVyIGRpY2lvbsOhcmlvcyBhY2VkZW5kbyBhICZsdDtiJmd0O0lkaW9tYSBlIGludHJvZHXDp8OjbyZsdDsvYiZndDsgbm8gbWVudSAmbHQ7YiZndDtEZWZpbmnDp8O1ZXMmbHQ7L2ImZ3Q7IGRvIHNldSBkaXNwb3NpdGl2byBtw7N2ZWwuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfb3Zlcl9tZXRlcmVkIiBtc2dpZD0iNDAyNDAxMzc2NDkzNzg1MDA2MSI+IlRyYW5zZmVyaXIgYWdvcmEgKDx4bGlmZjpnIGlkPSJTSVpFX0lOX01FR0FCWVRFUyI+JTEkLjFmPC94bGlmZjpnPiBNQikiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb19ub3RfZG93bmxvYWRfb3Zlcl9tZXRlcmVkIiBtc2dpZD0iNjk2Mzc3MDg4NTAzMzc2NTM3OCI+IlRyYW5zZmVyaXIgdmlhIFdpLUZpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDU2MDU3NjM3OTY4MDY2MDA0NyI+IkVzdMOhIGRpc3BvbsOtdmVsIHVtIGRpY2lvbsOhcmlvIHBhcmEgPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM1NTUxNTM4MTI4NTMxNzgzMiI+IlByaW1hIHBhcmEgY29uc3VsdGFyIGUgdHJhbnNmZXJpciI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLXB0L3N0cmluZ3MueG1sIGIvamF2YS9yZXMvdmFsdWVzLXB0L3N0cmluZ3MueG1sCmluZGV4IGVkOGNkZWMuLjMxMzQxMTUgMTAwNjQ0Ci0tLSBhL2phdmEvcmVzL3ZhbHVlcy1wdC9zdHJpbmdzLnhtbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtcHQvc3RyaW5ncy54bWwKQEAgLTE3MCw0ICsxNzAsMzkgQEAKICAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9kZWZhdWx0IiBtc2dpZD0iMzk4ODAxNzg0MDQzMTg4MTQ5MSI+IlBhZHLDo28iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYW5ndWFnZV9zZXR0aW5ncyIgbXNnaWQ9IjE2NzExNTMwNTMyMDE4MDkwMzEiPiJJZGlvbWEgZSBlbnRyYWRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0X2lucHV0X21ldGhvZCIgbXNnaWQ9IjQzMDE2MDIzNzQ2MDkyNzUwMDMiPiJTZWxlY2lvbmUgbyBtw6l0b2RvIGRlIGVudHJhZGEiPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9uYW1lIiBtc2dpZD0iMTAxNzA1ODE4NjMyMjcxNDQwNSI+IlByb3ZlZG9yIGRlIGRpY2lvbsOhcmlvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9wcm92aWRlcl9uYW1lIiBtc2dpZD0iNzcxMDQxNTU5OTM3MTE2MTA5MiI+IlByb3ZlZG9yIGRlIGRpY2lvbsOhcmlvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXJ2aWNlX25hbWUiIG1zZ2lkPSI1NTE2NTA2OTczNDgyMDIwNTYiPiJTZXJ2acOnbyBkZSBkaWNpb27DoXJpbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRvd25sb2FkX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzI3NDg2MTUxNDY5NTAzMjk1NCI+IkluZm9ybWHDp8O1ZXMgZGUgYXR1YWxpemHDp8OjbyBkbyBkaWNpb27DoXJpbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3NfdGl0bGUiIG1zZ2lkPSI3MjQzOTMwOTY3ODQ1MDIwNDA3Ij4iRGljaW9uw6FyaW9zIGNvbXBsZW1lbnRhcmVzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsX292ZXJfbWV0ZXJlZF9uZXR3b3JrX3Byb21wdCIgbXNnaWQ9IjM2NDI2MzQ2MjM0NjUzNDk3MTYiPiJEaWNpb27DoXJpbyBkaXNwb27DrXZlbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3Nfc3VtbWFyeSIgbXNnaWQ9Ijg1OTk2Nzk0MzQ3OTk3NDkwNTMiPiJDb25maWd1cmHDp8O1ZXMgZG9zIGRpY2lvbsOhcmlvcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzZXJfZGljdGlvbmFyaWVzIiBtc2dpZD0iNzUxOTczNjIzMjQyMzkyOTEyNCI+IkRpY2lvbsOhcmlvIGRvIHVzdcOhcmlvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4iRGljaW9uw6FyaW8gZG8gdXN1w6FyaW8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiJEaWNpb27DoXJpbyBkaXNwb27DrXZlbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZG93bmxvYWRpbmciIG1zZ2lkPSI4NTk0OTc0NzYyNjYzMDk1OTYiPiJEb3dubG9hZCBlbSBhbmRhbWVudG8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxlZCIgbXNnaWQ9IjY0MjU1ODY4OTk2NzEzNzgxNjAiPiJJbnN0YWxhZG8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rpc2FibGVkIiBtc2dpZD0iMzQ0ODU3MTI4MDQ5MDc0NjAzMiI+Ikluc3RhbGFkbywgZGVzYXRpdmFkbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiJQcm9iLiBkZSBjb25leMOjbyBjLyBkaWMuIGRlIHNlcnYuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZGljdGlvbmFyaWVzX2F2YWlsYWJsZSIgbXNnaWQ9IjUyMDYyMjUwNzc5NDU2Mzc4MTAiPiJOZW5odW0gZGljaW9uw6FyaW8gZGlzcG9uw612ZWwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiJBdHVhbGl6YXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsYXN0X3VwZGF0ZSIgbXNnaWQ9IjMxMDE1NDk3MTk4Mjc2MDAzNDYiPiLDmmx0aW1hIGF0dWFsaXphw6fDo28iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX3VwZGF0aW5nIiBtc2dpZD0iODIwMTg2Mjc2NzA0MTM0NzIwIj4iVmVyaWZpY2FuZG8gYXR1YWxpemHDp8O1ZXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX2xvYWRpbmciIG1zZ2lkPSI4NjExMzM5MTQ5ODI1MDQ3NDQ2Ij4iQ2FycmVnYW5kby4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1haW5fZGljdF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjE2Nzk5NjQzMDY5ODAwOTg1NzAiPiJEaWNpb27DoXJpbyBwcmluY2lwYWwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWwiIG1zZ2lkPSI1NTg2NTMxNzM2NjA5MTgzMzA0Ij4iQ2FuY2VsYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJpbnN0YWxsX2RpY3QiIG1zZ2lkPSI1NTI1MDA1NTI0Njk3NjA3ODY1Ij4iSW5zdGFsYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWxfZG93bmxvYWRfZGljdCIgbXNnaWQ9IjcxNjMxNzM2NTAyOTg4MzgzNjciPiJDYW5jZWxhciBkb3dubG9hZCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpc2FibGVfZGljdCIgbXNnaWQ9Ijc2ODU4MTAwNDAyMzY0OTc3MDAiPiJEZXNhdGl2YXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlbmFibGVfZGljdCIgbXNnaWQ9IjM4NDgxNzk3ODQ3MDI0NzM2ODAiPiJQZXJtaXRpciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlbGV0ZV9kaWN0IiBtc2dpZD0iNTgxNzE1OTI5MDUwMzg0Mzc2NiI+IkV4Y2x1aXIiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQgKDQ5NjUyNjQ4NDkwNTc2NTY1MjEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg0MDI0MDEzNzY0OTM3ODUwMDYxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvX25vdF9kb3dubG9hZF9vdmVyX21ldGVyZWQgKDY5NjM3NzA4ODUwMzM3NjUzNzgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0NTYwNTc2Mzc5NjgwNjYwMDQ3Ij4iSMOhIHVtIGRpY2lvbsOhcmlvIGRpc3BvbsOtdmVsIHBhcmEgPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM1NTUxNTM4MTI4NTMxNzgzMiI+IlByZXNzaW9uZSBwYXJhIGNvbnN1bHRhciBlIGZhemVyIG8gZG93bmxvYWQiPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1yby9zdHJpbmdzLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1yby9zdHJpbmdzLnhtbAppbmRleCA1ZmJjYmU1Li5kNGMzOWFmNSAxMDA2NDQKLS0tIGEvamF2YS9yZXMvdmFsdWVzLXJvL3N0cmluZ3MueG1sCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1yby9zdHJpbmdzLnhtbApAQCAtMTcwLDQgKzE3MCwzOSBAQAogICAgIDxzdHJpbmcgbmFtZT0iYnV0dG9uX2RlZmF1bHQiIG1zZ2lkPSIzOTg4MDE3ODQwNDMxODgxNDkxIj4iUHJlc3RhYmlsaXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYW5ndWFnZV9zZXR0aW5ncyIgbXNnaWQ9IjE2NzExNTMwNTMyMDE4MDkwMzEiPiJMaW1ixIMgyJlpIGludHJvZHVjZXJlIGRlIHRleHQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RfaW5wdXRfbWV0aG9kIiBtc2dpZD0iNDMwMTYwMjM3NDYwOTI3NTAwMyI+IkFsZWdlyJtpIG1ldG9kYSBkZSBpbnRyb2R1Y2VyZSBkZSB0ZXh0Ijwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJhcHBfbmFtZSIgbXNnaWQ9IjEwMTcwNTgxODYzMjI3MTQ0MDUiPiJGdXJuaXpvcnVsIGRpY8WjaW9uYXJ1bHVpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9wcm92aWRlcl9uYW1lIiBtc2dpZD0iNzcxMDQxNTU5OTM3MTE2MTA5MiI+IkZ1cm5pem9ydWwgZGljxaNpb25hcnVsdWkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NlcnZpY2VfbmFtZSIgbXNnaWQ9IjU1MTY1MDY5NzM0ODIwMjA1NiI+IlNlcnZpY2l1bCBEaWPFo2lvbmFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzMjc0ODYxNTE0Njk1MDMyOTU0Ij4iSW5mb3JtYcWjaWkgcHJpdmluZCBhY3R1YWxpemFyZWEgZGljxaNpb25hcnVsdWkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3RpdGxlIiBtc2dpZD0iNzI0MzkzMDk2Nzg0NTAyMDQwNyI+IkRpY8WjaW9uYXJlIHN1cGxpbWVudGFyZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbF9vdmVyX21ldGVyZWRfbmV0d29ya19wcm9tcHQiIG1zZ2lkPSIzNjQyNjM0NjIzNDY1MzQ5NzE2Ij4iRGljxaNpb25hciBkaXNwb25pYmlsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc19zdW1tYXJ5IiBtc2dpZD0iODU5OTY3OTQzNDc5OTc0OTA1MyI+IlNldMSDcmkgcGVudHJ1IGRpY8WjaW9uYXJlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNlcl9kaWN0aW9uYXJpZXMiIG1zZ2lkPSI3NTE5NzM2MjMyNDIzOTI5MTI0Ij4iRGljxaNpb25hcmVsZSB1dGlsaXphdG9ydWx1aSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfdXNlcl9kaWN0X3ByZWZfbmFtZSIgbXNnaWQ9IjUyMjEyNTE1Mjc1NzYwNzc5MCI+IkRpY8WjaW9uYXJ1bCB1dGlsaXphdG9ydWx1aSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfYXZhaWxhYmxlIiBtc2dpZD0iMzE5MjkyMDYwODUyMDYxODA4MyI+IkRpY8WjaW9uYXIgZGlzcG9uaWJpbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZG93bmxvYWRpbmciIG1zZ2lkPSI4NTk0OTc0NzYyNjYzMDk1OTYiPiJTZSBkZXNjYXJjxIMgYWN1bSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbGVkIiBtc2dpZD0iNjQyNTU4Njg5OTY3MTM3ODE2MCI+Ikluc3RhbGF0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kaXNhYmxlZCIgbXNnaWQ9IjM0NDg1NzEyODA0OTA3NDYwMzIiPiJJbnN0YWxhdCwgZGV6YWN0aXZhdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiJOdSBzZSBjb25lY3QuIGRpY8WjLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2RpY3Rpb25hcmllc19hdmFpbGFibGUiIG1zZ2lkPSI1MjA2MjI1MDc3OTQ1NjM3ODEwIj4iTmljaXVuIGRpY8WjaW9uYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiJBY3R1YWxpemHFo2kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsYXN0X3VwZGF0ZSIgbXNnaWQ9IjMxMDE1NDk3MTk4Mjc2MDAzNDYiPiJEYXRhIHVsdGltZWkgbW9kaWZpY8SDcmkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX3VwZGF0aW5nIiBtc2dpZD0iODIwMTg2Mjc2NzA0MTM0NzIwIj4iU2UgdmVyaWZpY8SDIGV4aXN0ZW7Fo2EgYWN0dWFsaXrEg3JpbG9yIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV9sb2FkaW5nIiBtc2dpZD0iODYxMTMzOTE0OTgyNTA0NzQ0NiI+IlNlIMOubmNhcmPEgy4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1haW5fZGljdF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjE2Nzk5NjQzMDY5ODAwOTg1NzAiPiJEaWPFo2lvbmFyIHByaW5jaXBhbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbCIgbXNnaWQ9IjU1ODY1MzE3MzY2MDkxODMzMDQiPiJBbnVsYcWjaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imluc3RhbGxfZGljdCIgbXNnaWQ9IjU1MjUwMDU1MjQ2OTc2MDc4NjUiPiJJbnN0YWxhxaNpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsX2Rvd25sb2FkX2RpY3QiIG1zZ2lkPSI3MTYzMTczNjUwMjk4ODM4MzY3Ij4iQW51bGHFo2kgZGVzY8SDcmNhcmVhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWJsZV9kaWN0IiBtc2dpZD0iNzY4NTgxMDA0MDIzNjQ5NzcwMCI+IkRlemFjdGl2YcWjaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVuYWJsZV9kaWN0IiBtc2dpZD0iMzg0ODE3OTc4NDcwMjQ3MzY4MCI+IkFjdGl2YcWjaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlbGV0ZV9kaWN0IiBtc2dpZD0iNTgxNzE1OTI5MDUwMzg0Mzc2NiI+IsWedGVyZ2XFo2kiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQgKDQ5NjUyNjQ4NDkwNTc2NTY1MjEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg0MDI0MDEzNzY0OTM3ODUwMDYxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvX25vdF9kb3dubG9hZF9vdmVyX21ldGVyZWQgKDY5NjM3NzA4ODUwMzM3NjUzNzgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0NTYwNTc2Mzc5NjgwNjYwMDQ3Ij4iRXN0ZSBkaXNwb25pYmlsIHVuIGRpY8WjaW9uYXIgcGVudHJ1IDx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24iIG1zZ2lkPSIzNTU1MTUzODEyODUzMTc4MzIiPiJBcMSDc2HFo2kgcGVudHJ1IGEgZXhhbWluYSDFn2kgcGVudHJ1IGEgZGVzY8SDcmNhIjwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMtcnUvc3RyaW5ncy54bWwgYi9qYXZhL3Jlcy92YWx1ZXMtcnUvc3RyaW5ncy54bWwKaW5kZXggYzIxYmJmOS4uNjgxYzc2ZCAxMDA2NDQKLS0tIGEvamF2YS9yZXMvdmFsdWVzLXJ1L3N0cmluZ3MueG1sCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1ydS9zdHJpbmdzLnhtbApAQCAtMTcwLDQgKzE3MCwzOSBAQAogICAgIDxzdHJpbmcgbmFtZT0iYnV0dG9uX2RlZmF1bHQiIG1zZ2lkPSIzOTg4MDE3ODQwNDMxODgxNDkxIj4i0J/QviDRg9C80L7Qu9GH0LDQvdC40Y4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYW5ndWFnZV9zZXR0aW5ncyIgbXNnaWQ9IjE2NzExNTMwNTMyMDE4MDkwMzEiPiLQr9C30YvQuiDQuCDQstCy0L7QtCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdF9pbnB1dF9tZXRob2QiIG1zZ2lkPSI0MzAxNjAyMzc0NjA5Mjc1MDAzIj4i0JLRi9Cx0LXRgNC40YLQtSDRgdC/0L7RgdC+0LEg0LLQstC+0LTQsCI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4i0J/QvtGB0YLQsNCy0YnQuNC6INGB0LvQvtCy0LDRgNC10LkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3Byb3ZpZGVyX25hbWUiIG1zZ2lkPSI3NzEwNDE1NTk5MzcxMTYxMDkyIj4i0J/QvtGB0YLQsNCy0YnQuNC6INGB0LvQvtCy0LDRgNC10LkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NlcnZpY2VfbmFtZSIgbXNnaWQ9IjU1MTY1MDY5NzM0ODIwMjA1NiI+ItCh0LvRg9C20LHQsCDRgdC70L7QstCw0YDQtdC5Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzMjc0ODYxNTE0Njk1MDMyOTU0Ij4i0J7QsdC90L7QstC70LXQvdC40Y8g0YHQu9C+0LLQsNGA0Y8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3RpdGxlIiBtc2dpZD0iNzI0MzkzMDk2Nzg0NTAyMDQwNyI+ItCU0L7Qv9C+0LvQvdC40YLQtdC70YzQvdGL0LUg0YHQu9C+0LLQsNGA0LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxfb3Zlcl9tZXRlcmVkX25ldHdvcmtfcHJvbXB0IiBtc2dpZD0iMzY0MjYzNDYyMzQ2NTM0OTcxNiI+ItCh0LvQvtCy0LDRgNGMINC00L7RgdGC0YPQv9C10L0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4i0J3QsNGB0YLRgNC+0LnQutC4INGB0LvQvtCy0LDRgNC10LkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2VyX2RpY3Rpb25hcmllcyIgbXNnaWQ9Ijc1MTk3MzYyMzI0MjM5MjkxMjQiPiLQn9C+0LvRjNC30L7QstCw0YLQtdC70YzRgdC60LjQtSDRgdC70L7QstCw0YDQuCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfdXNlcl9kaWN0X3ByZWZfbmFtZSIgbXNnaWQ9IjUyMjEyNTE1Mjc1NzYwNzc5MCI+ItCf0L7Qu9GM0LfQvtCy0LDRgtC10LvRjNGB0LrQuNC5INGB0LvQvtCy0LDRgNGMIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9hdmFpbGFibGUiIG1zZ2lkPSIzMTkyOTIwNjA4NTIwNjE4MDgzIj4i0KHQu9C+0LLQsNGA0Ywg0LTQvtGB0YLRg9C/0LXQvSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZG93bmxvYWRpbmciIG1zZ2lkPSI4NTk0OTc0NzYyNjYzMDk1OTYiPiLQl9Cw0LPRgNGD0LfQutCwLi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsZWQiIG1zZ2lkPSI2NDI1NTg2ODk5NjcxMzc4MTYwIj4i0KPRgdGC0LDQvdC+0LLQu9C10L0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rpc2FibGVkIiBtc2dpZD0iMzQ0ODU3MTI4MDQ5MDc0NjAzMiI+ItCj0YHRgtCw0L3QvtCy0LvQtdC9LCDQvtGC0LrQu9GO0YfQtdC9Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2Fubm90X2Nvbm5lY3RfdG9fZGljdF9zZXJ2aWNlIiBtc2dpZD0iNjg3NTY2NTQ5NDcyNjMwMDQyNyI+ItCe0YjQuNCx0LrQsCDQv9C+0LTQutC70Y7Rh9C10L3QuNGPIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZGljdGlvbmFyaWVzX2F2YWlsYWJsZSIgbXNnaWQ9IjUyMDYyMjUwNzc5NDU2Mzc4MTAiPiLQodC70L7QstCw0YDQuCDQvdC10LTQvtGB0YLRg9C/0L3RiyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNoZWNrX2Zvcl91cGRhdGVzX25vdyIgbXNnaWQ9IjY0MjA1Nzk4NjEyNzYyNDk4NiI+ItCe0LHQvdC+0LLQuNGC0YwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsYXN0X3VwZGF0ZSIgbXNnaWQ9IjMxMDE1NDk3MTk4Mjc2MDAzNDYiPiLQn9C+0YHQu9C10LTQvdC10LUg0L7QsdC90L7QstC70LXQvdC40LUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX3VwZGF0aW5nIiBtc2dpZD0iODIwMTg2Mjc2NzA0MTM0NzIwIj4i0J/RgNC+0LLQtdGA0LrQsCDQvtCx0L3QvtCy0LvQtdC90LjQuS4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfbG9hZGluZyIgbXNnaWQ9Ijg2MTEzMzkxNDk4MjUwNDc0NDYiPiLQl9Cw0LPRgNGD0LfQutCwLi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWFpbl9kaWN0X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMTY3OTk2NDMwNjk4MDA5ODU3MCI+ItCe0YHQvdC+0LLQvdC+0Lkg0YHQu9C+0LLQsNGA0YwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWwiIG1zZ2lkPSI1NTg2NTMxNzM2NjA5MTgzMzA0Ij4i0J7RgtC80LXQvdCwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5zdGFsbF9kaWN0IiBtc2dpZD0iNTUyNTAwNTUyNDY5NzYwNzg2NSI+ItCj0YHRgtCw0L3QvtCy0LjRgtGMIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsX2Rvd25sb2FkX2RpY3QiIG1zZ2lkPSI3MTYzMTczNjUwMjk4ODM4MzY3Ij4i0J7RgtC80LXQvdC40YLRjCDQt9Cw0LPRgNGD0LfQutGDIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWJsZV9kaWN0IiBtc2dpZD0iNzY4NTgxMDA0MDIzNjQ5NzcwMCI+ItCe0YLQutC70Y7Rh9C40YLRjCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVuYWJsZV9kaWN0IiBtc2dpZD0iMzg0ODE3OTc4NDcwMjQ3MzY4MCI+ItCS0LrQu9GO0YfQuNGC0YwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfZGljdCIgbXNnaWQ9IjU4MTcxNTkyOTA1MDM4NDM3NjYiPiLQo9C00LDQu9C40YLRjCI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaG91bGRfZG93bmxvYWRfb3Zlcl9tZXRlcmVkX3Byb21wdCAoNDk2NTI2NDg0OTA1NzY1NjUyMSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb3dubG9hZF9vdmVyX21ldGVyZWQgKDQwMjQwMTM3NjQ5Mzc4NTAwNjEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZG9fbm90X2Rvd25sb2FkX292ZXJfbWV0ZXJlZCAoNjk2Mzc3MDg4NTAzMzc2NTM3OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ1NjA1NzYzNzk2ODA2NjAwNDciPiLQlNC+0YHRgtGD0L/QtdC9INGB0LvQvtCy0LDRgNGMOiA8eGxpZmY6ZyBpZD0iTEFOR1VBR0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzU1NTE1MzgxMjg1MzE3ODMyIj4i0J3QsNC20LzQuNGC0LUsINGH0YLQvtCx0Ysg0L/RgNC+0YHQvNC+0YLRgNC10YLRjCDQuCDQt9Cw0LPRgNGD0LfQuNGC0YwiPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1zay9zdHJpbmdzLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1zay9zdHJpbmdzLnhtbAppbmRleCBhYWQyMzZlLi41ZDA4MjA4IDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMtc2svc3RyaW5ncy54bWwKKysrIGIvamF2YS9yZXMvdmFsdWVzLXNrL3N0cmluZ3MueG1sCkBAIC0xNzAsNCArMTcwLDM5IEBACiAgICAgPHN0cmluZyBuYW1lPSJidXR0b25fZGVmYXVsdCIgbXNnaWQ9IjM5ODgwMTc4NDA0MzE4ODE0OTEiPiJQcmVkdm9sZW7DqSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxhbmd1YWdlX3NldHRpbmdzIiBtc2dpZD0iMTY3MTE1MzA1MzIwMTgwOTAzMSI+IkphenlrICZhbXA7IHZzdHVwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0X2lucHV0X21ldGhvZCIgbXNnaWQ9IjQzMDE2MDIzNzQ2MDkyNzUwMDMiPiJadm9sacWlIG1ldMOzZHUgdnN0dXB1Ijwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJhcHBfbmFtZSIgbXNnaWQ9IjEwMTcwNTgxODYzMjI3MTQ0MDUiPiJQb3NreXRvdmF0ZcS+IHNsb3Zuw61rYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfcHJvdmlkZXJfbmFtZSIgbXNnaWQ9Ijc3MTA0MTU1OTkzNzExNjEwOTIiPiJQb3NreXRvdmF0ZcS+IHNsb3Zuw61rYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2VydmljZV9uYW1lIiBtc2dpZD0iNTUxNjUwNjk3MzQ4MjAyMDU2Ij4iU2x1xb5iYSBzbG92bsOta2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiJJbmZvcm3DoWNpZSBha3R1YWxpesOhY2llIHNsb3Zuw61rYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3NfdGl0bGUiIG1zZ2lkPSI3MjQzOTMwOTY3ODQ1MDIwNDA3Ij4iRG9wbG5rb3bDqSBzbG92bsOta3kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxfb3Zlcl9tZXRlcmVkX25ldHdvcmtfcHJvbXB0IiBtc2dpZD0iMzY0MjYzNDYyMzQ2NTM0OTcxNiI+IksgZGlzcG96w61jaWkgamUgc2xvdm7DrWsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4iTmFzdGF2ZW5pYSBwcmUgc2xvdm7DrWt5Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNlcl9kaWN0aW9uYXJpZXMiIG1zZ2lkPSI3NTE5NzM2MjMyNDIzOTI5MTI0Ij4iUG91xb7DrXZhdGXEvnNrw6kgc2xvdm7DrWt5Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4iUG91xb7DrXZhdGXEvnNrw70gc2xvdm7DrWsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiJLIGRpc3BvesOtY2lpIGplIHNsb3Zuw61rIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kb3dubG9hZGluZyIgbXNnaWQ9Ijg1OTQ5NzQ3NjI2NjMwOTU5NiI+IkFrdHXDoWxuZSBwcmViZXJhbmllIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsZWQiIG1zZ2lkPSI2NDI1NTg2ODk5NjcxMzc4MTYwIj4iTmFpbsWhdGFsb3ZhbsO9Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kaXNhYmxlZCIgbXNnaWQ9IjM0NDg1NzEyODA0OTA3NDYwMzIiPiJOYWluxaF0YWxvdmFuw70sIHpha8OhemFuw70iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5ub3RfY29ubmVjdF90b19kaWN0X3NlcnZpY2UiIG1zZ2lkPSI2ODc1NjY1NDk0NzI2MzAwNDI3Ij4iUHJvYmzDqW0gcyBwcmlwb2plbsOtbSBrIHNsdcW+YmUgc2xvdm7DrWthIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZGljdGlvbmFyaWVzX2F2YWlsYWJsZSIgbXNnaWQ9IjUyMDYyMjUwNzc5NDU2Mzc4MTAiPiJTbG92bsOta3kgbmVkb3N0dXBuw6kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiJPYm5vdmnFpSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imxhc3RfdXBkYXRlIiBtc2dpZD0iMzEwMTU0OTcxOTgyNzYwMDM0NiI+IlBvc2xlZG7DoSBha3R1YWxpesOhY2lhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV91cGRhdGluZyIgbXNnaWQ9IjgyMDE4NjI3NjcwNDEzNDcyMCI+IlByZWJpZWhhIGtvbnRyb2xhIGFrdHVhbGl6w6FjacOtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV9sb2FkaW5nIiBtc2dpZD0iODYxMTMzOTE0OTgyNTA0NzQ0NiI+IlByZWJpZWhhIG5hxI3DrXRhdmFuaWUuLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtYWluX2RpY3RfZGVzY3JpcHRpb24iIG1zZ2lkPSIxNjc5OTY0MzA2OTgwMDk4NTcwIj4iSGxhdm7DvSBzbG92bsOtayI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbCIgbXNnaWQ9IjU1ODY1MzE3MzY2MDkxODMzMDQiPiJacnXFoWnFpSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imluc3RhbGxfZGljdCIgbXNnaWQ9IjU1MjUwMDU1MjQ2OTc2MDc4NjUiPiJJbsWhdGFsb3ZhxaUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWxfZG93bmxvYWRfZGljdCIgbXNnaWQ9IjcxNjMxNzM2NTAyOTg4MzgzNjciPiJacnXFoWnFpSBwcmViZXJhbmllIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWJsZV9kaWN0IiBtc2dpZD0iNzY4NTgxMDA0MDIzNjQ5NzcwMCI+Ilpha8OhemHFpSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVuYWJsZV9kaWN0IiBtc2dpZD0iMzg0ODE3OTc4NDcwMjQ3MzY4MCI+IlBvdm9sacWlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVsZXRlX2RpY3QiIG1zZ2lkPSI1ODE3MTU5MjkwNTAzODQzNzY2Ij4iT2RzdHLDoW5pxaUiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQgKDQ5NjUyNjQ4NDkwNTc2NTY1MjEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg0MDI0MDEzNzY0OTM3ODUwMDYxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvX25vdF9kb3dubG9hZF9vdmVyX21ldGVyZWQgKDY5NjM3NzA4ODUwMzM3NjUzNzgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0NTYwNTc2Mzc5NjgwNjYwMDQ3Ij4iSyBkaXNwb3rDrWNpaSBqZSBzbG92bsOtayBwcmUgamF6eWsgPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM1NTUxNTM4MTI4NTMxNzgzMiI+IlN0bGHEjWVuw61tIHNrb250cm9sdWpldGUgYSBwcmV2ZXptZXRlIjwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMtc2wvc3RyaW5ncy54bWwgYi9qYXZhL3Jlcy92YWx1ZXMtc2wvc3RyaW5ncy54bWwKaW5kZXggZjBkMjM5Zi4uOTdlNTUxOCAxMDA2NDQKLS0tIGEvamF2YS9yZXMvdmFsdWVzLXNsL3N0cmluZ3MueG1sCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1zbC9zdHJpbmdzLnhtbApAQCAtMTcwLDQgKzE3MCwzNiBAQAogICAgIDxzdHJpbmcgbmFtZT0iYnV0dG9uX2RlZmF1bHQiIG1zZ2lkPSIzOTg4MDE3ODQwNDMxODgxNDkxIj4iUHJpdnpldG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYW5ndWFnZV9zZXR0aW5ncyIgbXNnaWQ9IjE2NzExNTMwNTMyMDE4MDkwMzEiPiJKZXppayBpbiB2bm9zIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0X2lucHV0X21ldGhvZCIgbXNnaWQ9IjQzMDE2MDIzNzQ2MDkyNzUwMDMiPiJJemJpcmEgbmHEjWluYSB2bm9zYSI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4iU2xvdmFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9wcm92aWRlcl9uYW1lIiBtc2dpZD0iNzcxMDQxNTU5OTM3MTE2MTA5MiI+IlN0b3JpdGV2IHNsb3ZhcmphIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXJ2aWNlX25hbWUiIG1zZ2lkPSI1NTE2NTA2OTczNDgyMDIwNTYiPiJTbG92YXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiJQb2RhdGtpIG8gcG9zb2RvYml0dmkgc2xvdmFyamEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3RpdGxlIiBtc2dpZD0iNzI0MzkzMDk2Nzg0NTAyMDQwNyI+IkRvZGF0bmkgc2xvdmFyamkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxfb3Zlcl9tZXRlcmVkX25ldHdvcmtfcHJvbXB0IiBtc2dpZD0iMzY0MjYzNDYyMzQ2NTM0OTcxNiI+IlNsb3ZhciBqZSBuYSB2b2xqbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3Nfc3VtbWFyeSIgbXNnaWQ9Ijg1OTk2Nzk0MzQ3OTk3NDkwNTMiPiJOYXN0YXZpdHZlIHphIHNsb3ZhcmplIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNlcl9kaWN0aW9uYXJpZXMiIG1zZ2lkPSI3NTE5NzM2MjMyNDIzOTI5MTI0Ij4iVXBvcmFibmnFoWtpIHNsb3ZhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfdXNlcl9kaWN0X3ByZWZfbmFtZSIgbXNnaWQ9IjUyMjEyNTE1Mjc1NzYwNzc5MCI+IlVwb3JhYm5pxaFraSBzbG92YXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiJTbG92YXIgamUgbmEgdm9sam8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rvd25sb2FkaW5nIiBtc2dpZD0iODU5NDk3NDc2MjY2MzA5NTk2Ij4iVHJlbnV0bm8gc2UgcHJlbmHFoWEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxlZCIgbXNnaWQ9IjY0MjU1ODY4OTk2NzEzNzgxNjAiPiJOYW1lxaHEjWVubyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZGlzYWJsZWQiIG1zZ2lkPSIzNDQ4NTcxMjgwNDkwNzQ2MDMyIj4iTmFtZcWhxI1lbiwgb25lbW9nb8SNZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5ub3RfY29ubmVjdF90b19kaWN0X3NlcnZpY2UiIG1zZ2lkPSI2ODc1NjY1NDk0NzI2MzAwNDI3Ij4iVGXFvmF2YSBzIHBvdmV6YXZvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZGljdGlvbmFyaWVzX2F2YWlsYWJsZSIgbXNnaWQ9IjUyMDYyMjUwNzc5NDU2Mzc4MTAiPiJOaSBzbG92YXJqZXYiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiJPc3Zlxb5pIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibGFzdF91cGRhdGUiIG1zZ2lkPSIzMTAxNTQ5NzE5ODI3NjAwMzQ2Ij4iTmF6YWRuamUgcG9zb2RvYmxqZW5vIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV91cGRhdGluZyIgbXNnaWQ9IjgyMDE4NjI3NjcwNDEzNDcyMCI+IlByZXZlcmphbmplLCBhbGkgc28gbmEgdm9sam8gcG9zb2RvYml0dmUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX2xvYWRpbmciIG1zZ2lkPSI4NjExMzM5MTQ5ODI1MDQ3NDQ2Ij4iTmFsYWdhbmplIC4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1haW5fZGljdF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjE2Nzk5NjQzMDY5ODAwOTg1NzAiPiJHbGF2bmkgc2xvdmFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsIiBtc2dpZD0iNTU4NjUzMTczNjYwOTE4MzMwNCI+IlByZWtsacSNaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imluc3RhbGxfZGljdCIgbXNnaWQ9IjU1MjUwMDU1MjQ2OTc2MDc4NjUiPiJOYW1lc3RpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsX2Rvd25sb2FkX2RpY3QiIG1zZ2lkPSI3MTYzMTczNjUwMjk4ODM4MzY3Ij4iUHJla2xpxI1pIHByZW5vcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpc2FibGVfZGljdCIgbXNnaWQ9Ijc2ODU4MTAwNDAyMzY0OTc3MDAiPiJPbmVtb2dvxI1pIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZW5hYmxlX2RpY3QiIG1zZ2lkPSIzODQ4MTc5Nzg0NzAyNDczNjgwIj4iT21vZ2/EjWkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfZGljdCIgbXNnaWQ9IjU4MTcxNTkyOTA1MDM4NDM3NjYiPiJJemJyacWhaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNob3VsZF9kb3dubG9hZF9vdmVyX21ldGVyZWRfcHJvbXB0IiBtc2dpZD0iNDk2NTI2NDg0OTA1NzY1NjUyMSI+IlphIGl6YnJhbiBqZXppayB2IG1vYi4gbmFwcmF2aSBqZSBuYSB2b2xqbyBzbG92YXIuJmx0O2JyLyZndDsgWmEgaXpib2xqxaFhbm8gaXprdcWhbmpvIHRpcGthbmphIHByaXBvcm/EjWFtbywgZGEgJmx0O2ImZ3Q7cHJlbmVzZXRlJmx0Oy9iJmd0OyBzbG92YXIgemEgdGEgamV6aWs6IDx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4uJmx0O2JyLyZndDsgJmx0O2JyLyZndDsgUHJlbm9zIHByZWsgcG92ZXphdmUgVU1UUyBsYWhrbyB0cmFqYSBtaW51dG8gYWxpIGR2ZS4gxIxlIG5pbWF0ZSAmbHQ7YiZndDtuZW9tZWplbi4gcHJlbm9zYSBwb2RhdGtvdiZsdDsvYiZndDsuJmx0O2JyLyZndDssIGdhIGJvc3RlIG1vcmRhIG1vcmFsaSBwbGHEjWF0aS4gxIxlIG5lIHZlc3RlLCBrYXRlcmkgcG9kLiBwYWtldCBpbWF0ZSwgcG9pxaHEjWl0ZSBvbXJlxb5qZSBXaS1GaSwgZGEgcHJlbm9zIHphxI1uZXRlIHNhbW9kZWpuby4mbHQ7YnIvJmd0OyAmbHQ7YnIvJmd0OyBOYXN2ZXQ6IFNsb3ZhcmplIGxhaGtvIHByZW5lc2V0ZSBpbiBvZHN0cmFuaXRlIHRha28sIGRhIHYgbWVuaWp1ICZsdDtiJmd0O05hc3Rhdml0dmUmbHQ7L2ImZ3Q7IHYgbmFwcmF2aSBvZHByZXRlICZsdDtiJmd0O0plemlrIGluIHZub3MmbHQ7L2ImZ3Q7LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRvd25sb2FkX292ZXJfbWV0ZXJlZCIgbXNnaWQ9IjQwMjQwMTM3NjQ5Mzc4NTAwNjEiPiJQcmVuZXNpIHpkYWogKDx4bGlmZjpnIGlkPSJTSVpFX0lOX01FR0FCWVRFUyI+JTEkLjFmPC94bGlmZjpnPiBNQikiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb19ub3RfZG93bmxvYWRfb3Zlcl9tZXRlcmVkIiBtc2dpZD0iNjk2Mzc3MDg4NTAzMzc2NTM3OCI+IlByZW5vcyBwcmVrIHBvdmV6YXZlIFdpLUZpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDU2MDU3NjM3OTY4MDY2MDA0NyI+IlNsb3ZhciBqZSBuYSB2b2xqbyB6YSBqZXppayA8eGxpZmY6ZyBpZD0iTEFOR1VBR0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzU1NTE1MzgxMjg1MzE3ODMyIj4iUHJpdGlzbml0ZSB6YSBwcmVnbGVkIGluIHByZW5vcyI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLXNyL3N0cmluZ3MueG1sIGIvamF2YS9yZXMvdmFsdWVzLXNyL3N0cmluZ3MueG1sCmluZGV4IDExZmYwOWEuLjliMzAyMjMgMTAwNjQ0Ci0tLSBhL2phdmEvcmVzL3ZhbHVlcy1zci9zdHJpbmdzLnhtbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtc3Ivc3RyaW5ncy54bWwKQEAgLTE3MCw0ICsxNzAsMzkgQEAKICAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9kZWZhdWx0IiBtc2dpZD0iMzk4ODAxNzg0MDQzMTg4MTQ5MSI+ItCf0L7QtNGA0LDQt9GD0LzQtdCy0LDQvdC+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGFuZ3VhZ2Vfc2V0dGluZ3MiIG1zZ2lkPSIxNjcxMTUzMDUzMjAxODA5MDMxIj4i0IjQtdC30LjQuiDQuCDRg9C90L7RgSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdF9pbnB1dF9tZXRob2QiIG1zZ2lkPSI0MzAxNjAyMzc0NjA5Mjc1MDAzIj4i0JjQt9Cx0L7RgCDQvNC10YLQvtC00LAg0YPQvdC+0YHQsCI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4i0JTQvtCx0LDQstGZ0LDRhyDRgNC10YfQvdC40LrQsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfcHJvdmlkZXJfbmFtZSIgbXNnaWQ9Ijc3MTA0MTU1OTkzNzExNjEwOTIiPiLQlNC+0LHQsNCy0ZnQsNGHINGA0LXRh9C90LjQutCwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXJ2aWNlX25hbWUiIG1zZ2lkPSI1NTE2NTA2OTczNDgyMDIwNTYiPiLQo9GB0LvRg9Cz0LAg0YDQtdGH0L3QuNC60LAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiLQmNC90YTQvtGA0LzQsNGG0LjRmNC1INC+INCw0LbRg9GA0LjRgNCw0ZrRgyDRgNC10YfQvdC40LrQsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3NfdGl0bGUiIG1zZ2lkPSI3MjQzOTMwOTY3ODQ1MDIwNDA3Ij4i0J/QvtC80L7Rm9C90Lgg0YDQtdGH0L3QuNGG0LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxfb3Zlcl9tZXRlcmVkX25ldHdvcmtfcHJvbXB0IiBtc2dpZD0iMzY0MjYzNDYyMzQ2NTM0OTcxNiI+ItCg0LXRh9C90LjQuiDRmNC1INC00L7RgdGC0YPQv9Cw0L0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4i0J/QvtC00LXRiNCw0LLQsNGa0LAg0LfQsCDRgNC10YfQvdC40LrQtSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzZXJfZGljdGlvbmFyaWVzIiBtc2dpZD0iNzUxOTczNjIzMjQyMzkyOTEyNCI+ItCa0L7RgNC40YHQvdC40YfQutC4INGA0LXRh9C90LjRhtC4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4i0JrQvtGA0LjRgdC90LjRh9C60Lgg0YDQtdGH0L3QuNC6Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9hdmFpbGFibGUiIG1zZ2lkPSIzMTkyOTIwNjA4NTIwNjE4MDgzIj4i0KDQtdGH0L3QuNC6INGY0LUg0LTQvtGB0YLRg9C/0LDQvSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZG93bmxvYWRpbmciIG1zZ2lkPSI4NTk0OTc0NzYyNjYzMDk1OTYiPiLQotGA0LXQvdGD0YLQvdC+INGB0LUg0L/RgNC10YPQt9C40LzQsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbGVkIiBtc2dpZD0iNjQyNTU4Njg5OTY3MTM3ODE2MCI+ItCY0L3RgdGC0LDQu9C40YDQsNC90L4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rpc2FibGVkIiBtc2dpZD0iMzQ0ODU3MTI4MDQ5MDc0NjAzMiI+ItCY0L3RgdGC0LDQu9C40YDQsNC9LCDQvtC90LXQvNC+0LPRg9Gb0LXQvSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiLQndC10LzQsCDRg9GB0LvRg9Cz0LUg0YDQtdGH0L3QuNC60LAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19kaWN0aW9uYXJpZXNfYXZhaWxhYmxlIiBtc2dpZD0iNTIwNjIyNTA3Nzk0NTYzNzgxMCI+ItCd0LXQvNCwINC00L7RgdGC0YPQv9C90LjRhSDRgNC10YfQvdC40LrQsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNoZWNrX2Zvcl91cGRhdGVzX25vdyIgbXNnaWQ9IjY0MjA1Nzk4NjEyNzYyNDk4NiI+ItCe0YHQstC10LbQuCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imxhc3RfdXBkYXRlIiBtc2dpZD0iMzEwMTU0OTcxOTgyNzYwMDM0NiI+ItCf0L7RgdC70LXQtNGa0LUg0LDQttGD0YDQuNGA0LDRmtC1Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV91cGRhdGluZyIgbXNnaWQ9IjgyMDE4NjI3NjcwNDEzNDcyMCI+ItCi0YDQsNC20LXRmtC1INCw0LbRg9GA0LjRgNCw0ZrQsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfbG9hZGluZyIgbXNnaWQ9Ijg2MTEzMzkxNDk4MjUwNDc0NDYiPiLQo9GH0LjRgtCw0LLQsNGa0LUuLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtYWluX2RpY3RfZGVzY3JpcHRpb24iIG1zZ2lkPSIxNjc5OTY0MzA2OTgwMDk4NTcwIj4i0JPQu9Cw0LLQvdC4INGA0LXRh9C90LjQuiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbCIgbXNnaWQ9IjU1ODY1MzE3MzY2MDkxODMzMDQiPiLQntGC0LrQsNC20LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJpbnN0YWxsX2RpY3QiIG1zZ2lkPSI1NTI1MDA1NTI0Njk3NjA3ODY1Ij4i0JjQvdGB0YLQsNC70LjRgNCw0ZgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWxfZG93bmxvYWRfZGljdCIgbXNnaWQ9IjcxNjMxNzM2NTAyOTg4MzgzNjciPiLQntGC0LrQsNC20Lgg0L/RgNC10YPQt9C40LzQsNGa0LUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaXNhYmxlX2RpY3QiIG1zZ2lkPSI3Njg1ODEwMDQwMjM2NDk3NzAwIj4i0J7QvdC10LzQvtCz0YPRm9C4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZW5hYmxlX2RpY3QiIG1zZ2lkPSIzODQ4MTc5Nzg0NzAyNDczNjgwIj4i0J7QvNC+0LPRg9Gb0LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfZGljdCIgbXNnaWQ9IjU4MTcxNTkyOTA1MDM4NDM3NjYiPiLQmNC30LHRgNC40YjQuCI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaG91bGRfZG93bmxvYWRfb3Zlcl9tZXRlcmVkX3Byb21wdCAoNDk2NTI2NDg0OTA1NzY1NjUyMSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb3dubG9hZF9vdmVyX21ldGVyZWQgKDQwMjQwMTM3NjQ5Mzc4NTAwNjEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZG9fbm90X2Rvd25sb2FkX292ZXJfbWV0ZXJlZCAoNjk2Mzc3MDg4NTAzMzc2NTM3OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ1NjA1NzYzNzk2ODA2NjAwNDciPiLQoNC10YfQvdC40Log0ZjQtSDQtNC+0YHRgtGD0L/QsNC9INC30LAgPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM1NTUxNTM4MTI4NTMxNzgzMiI+ItCf0YDQuNGC0LjRgdC90LjRgtC1INC30LAg0L/RgNC10LPQu9C10LQg0Lgg0L/RgNC10YPQt9C40LzQsNGa0LUiPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1zdi9zdHJpbmdzLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1zdi9zdHJpbmdzLnhtbAppbmRleCBiZTI3OGZhLi4yNGVhNDI4IDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMtc3Yvc3RyaW5ncy54bWwKKysrIGIvamF2YS9yZXMvdmFsdWVzLXN2L3N0cmluZ3MueG1sCkBAIC0xNzAsNCArMTcwLDM2IEBACiAgICAgPHN0cmluZyBuYW1lPSJidXR0b25fZGVmYXVsdCIgbXNnaWQ9IjM5ODgwMTc4NDA0MzE4ODE0OTEiPiJTdGFuZGFyZCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxhbmd1YWdlX3NldHRpbmdzIiBtc2dpZD0iMTY3MTE1MzA1MzIwMTgwOTAzMSI+IlNwcsOlayAmYW1wOyBpbm1hdG5pbmciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RfaW5wdXRfbWV0aG9kIiBtc2dpZD0iNDMwMTYwMjM3NDYwOTI3NTAwMyI+IlbDpGxqIGlubWF0bmluZ3NtZXRvZCI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4iRGljdGlvbmFyeSBQcm92aWRlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfcHJvdmlkZXJfbmFtZSIgbXNnaWQ9Ijc3MTA0MTU1OTkzNzExNjEwOTIiPiJEaWN0aW9uYXJ5IFByb3ZpZGVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXJ2aWNlX25hbWUiIG1zZ2lkPSI1NTE2NTA2OTczNDgyMDIwNTYiPiJPcmRib2tzdGrDpG5zdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRvd25sb2FkX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzI3NDg2MTUxNDY5NTAzMjk1NCI+IlVwcGRhdGVyaW5nc2luZm9ybWF0aW9uIGbDtnIgb3JkbGlzdGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3RpdGxlIiBtc2dpZD0iNzI0MzkzMDk2Nzg0NTAyMDQwNyI+IlRpbGzDpGdnc29yZGxpc3RvciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbF9vdmVyX21ldGVyZWRfbmV0d29ya19wcm9tcHQiIG1zZ2lkPSIzNjQyNjM0NjIzNDY1MzQ5NzE2Ij4iRW4gb3JkbGlzdGEgw6RyIHRpbGxnw6RuZ2xpZyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3Nfc3VtbWFyeSIgbXNnaWQ9Ijg1OTk2Nzk0MzQ3OTk3NDkwNTMiPiJJbnN0w6RsbG5pbmdhciBmw7ZyIG9yZGxpc3RvciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzZXJfZGljdGlvbmFyaWVzIiBtc2dpZD0iNzUxOTczNjIzMjQyMzkyOTEyNCI+IkVnbmEgb3JkbGlzdG9yIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4iRWdlbiBvcmRsaXN0YSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfYXZhaWxhYmxlIiBtc2dpZD0iMzE5MjkyMDYwODUyMDYxODA4MyI+IkVuIG9yZGxpc3RhIMOkciB0aWxsZ8OkbmdsaWciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rvd25sb2FkaW5nIiBtc2dpZD0iODU5NDk3NDc2MjY2MzA5NTk2Ij4iSMOkbXRhcyBmw7ZyIG7DpHJ2YXJhbmRlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsZWQiIG1zZ2lkPSI2NDI1NTg2ODk5NjcxMzc4MTYwIj4iSW5zdGFsbGVyYWQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rpc2FibGVkIiBtc2dpZD0iMzQ0ODU3MTI4MDQ5MDc0NjAzMiI+Ikluc3RhbGxlcmFkLCBpbmFrdGl2ZXJhZCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiJQcm9ibGVtIG1lZCBhdHQgYW5zbHV0YSB0aWxsIG9yZGxpc3RldGrDpG5zdGVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZGljdGlvbmFyaWVzX2F2YWlsYWJsZSIgbXNnaWQ9IjUyMDYyMjUwNzc5NDU2Mzc4MTAiPiJEZXQgZmlubnMgaW5nYSBvcmRiw7Zja2VyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2hlY2tfZm9yX3VwZGF0ZXNfbm93IiBtc2dpZD0iNjQyMDU3OTg2MTI3NjI0OTg2Ij4iVXBwZGF0ZXJhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibGFzdF91cGRhdGUiIG1zZ2lkPSIzMTAxNTQ5NzE5ODI3NjAwMzQ2Ij4iU2VuYXN0IHVwcGRhdGVyYWQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX3VwZGF0aW5nIiBtc2dpZD0iODIwMTg2Mjc2NzA0MTM0NzIwIj4iU8O2a2VyIGVmdGVyIHVwcGRhdGVyaW5nYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX2xvYWRpbmciIG1zZ2lkPSI4NjExMzM5MTQ5ODI1MDQ3NDQ2Ij4iTMOkc2VyIGluIC4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1haW5fZGljdF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjE2Nzk5NjQzMDY5ODAwOTg1NzAiPiJIdXZ1ZG9yZGxpc3RhbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbCIgbXNnaWQ9IjU1ODY1MzE3MzY2MDkxODMzMDQiPiJBdmJyeXQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJpbnN0YWxsX2RpY3QiIG1zZ2lkPSI1NTI1MDA1NTI0Njk3NjA3ODY1Ij4iSW5zdGFsbGVyYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbF9kb3dubG9hZF9kaWN0IiBtc2dpZD0iNzE2MzE3MzY1MDI5ODgzODM2NyI+IkF2YnJ5dCBow6RtdG5pbmciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaXNhYmxlX2RpY3QiIG1zZ2lkPSI3Njg1ODEwMDQwMjM2NDk3NzAwIj4iSW5ha3RpdmVyYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVuYWJsZV9kaWN0IiBtc2dpZD0iMzg0ODE3OTc4NDcwMjQ3MzY4MCI+IkFrdGl2ZXJhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVsZXRlX2RpY3QiIG1zZ2lkPSI1ODE3MTU5MjkwNTAzODQzNzY2Ij4iVGEgYm9ydCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNob3VsZF9kb3dubG9hZF9vdmVyX21ldGVyZWRfcHJvbXB0IiBtc2dpZD0iNDk2NTI2NDg0OTA1NzY1NjUyMSI+IkRldCBmaW5ucyBlbiBvcmRsaXN0YSBmw7ZyIHNwcsOla2V0IGR1IGhhciB2YWx0IGkgZW5oZXRlbi4mbHQ7YnIvJmd0OyBWaSByZWtvbW1lbmRlcmFyIGF0dCBkdSAmbHQ7YiZndDtow6RtdGFyJmx0Oy9iJmd0OyBkZW4gPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPiBvcmRsaXN0YW4uJmx0O2JyLyZndDsgJmx0O2JyLyZndDsgRGV0IGthbiB0YSBuw6Vnb24gbWludXQgYXR0IGjDpG10YSBkZW4gw7Z2ZXIgM0cuIEF2Z2lmdGVyIGthbiB0aWxsa29tbWEgb20gZHUgaW50ZSBoYXIgZXR0IGFib25uZW1hbmcgbWVkICZsdDtiJmd0O29iZWdyw6Ruc2FkIGRhdGF0cmFmaWsmbHQ7L2ImZ3Q7LiZsdDtici8mZ3Q7IE9tIGR1IMOkciBvc8Oka2VyIHDDpSBkaXR0IGFib25uZW1hbmcgcmVrb21tZW5kZXJhciB2aSBhdHQgZHUgYW5zbHV0ZXIgdGlsbCBldHQgV2ktRmktbsOkdHZlcmsgb2NoIGjDpG10YXIgb3JkbGlzdGFuIGF1dG9tYXRpc2t0LiZsdDtici8mZ3Q7ICZsdDtici8mZ3Q7IFRpcHMhIER1IGthbiBow6RtdGEgb2NoIHRhIGJvcnQgb3JkbGlzdG9yIHVuZGVyICZsdDtiJmd0O1NwcsOlayBvY2ggaW5tYXRuaW5nJmx0Oy9iJmd0OyBpIG1lbnluICZsdDtiJmd0O0luc3TDpGxsbmluZ2FyJmx0Oy9iJmd0OyBww6UgZW5oZXRlbi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9vdmVyX21ldGVyZWQiIG1zZ2lkPSI0MDI0MDEzNzY0OTM3ODUwMDYxIj4iSMOkbXRhIG51ICg8eGxpZmY6ZyBpZD0iU0laRV9JTl9NRUdBQllURVMiPiUxJC4xZjwveGxpZmY6Zz4gTUIpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG9fbm90X2Rvd25sb2FkX292ZXJfbWV0ZXJlZCIgbXNnaWQ9IjY5NjM3NzA4ODUwMzM3NjUzNzgiPiJIw6RtdGEgw7Z2ZXIgV2ktRmkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0NTYwNTc2Mzc5NjgwNjYwMDQ3Ij4iRW4gb3JkbGlzdGEgw6RyIHRpbGxnw6RuZ2xpZyBmw7ZyIDx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24iIG1zZ2lkPSIzNTU1MTUzODEyODUzMTc4MzIiPiJUcnljayBvbSBkdSB2aWxsIGdyYW5za2Egb2NoIGjDpG10YSI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLXN3L3N0cmluZ3MueG1sIGIvamF2YS9yZXMvdmFsdWVzLXN3L3N0cmluZ3MueG1sCmluZGV4IDFmYzkyZmIuLmE5NzQ3NTMgMTAwNjQ0Ci0tLSBhL2phdmEvcmVzL3ZhbHVlcy1zdy9zdHJpbmdzLnhtbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtc3cvc3RyaW5ncy54bWwKQEAgLTE3MCw0ICsxNzAsMzkgQEAKICAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9kZWZhdWx0IiBtc2dpZD0iMzk4ODAxNzg0MDQzMTg4MTQ5MSI+IkNoYWd1by1tc2luZ2kiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYW5ndWFnZV9zZXR0aW5ncyIgbXNnaWQ9IjE2NzExNTMwNTMyMDE4MDkwMzEiPiJMdWdoYSBuYSB1aW5naXphamkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RfaW5wdXRfbWV0aG9kIiBtc2dpZD0iNDMwMTYwMjM3NDYwOTI3NTAwMyI+IkNoYWd1YSBtYmludSB5YSBrdWluZ2l6YSBkYXRhIjwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJhcHBfbmFtZSIgbXNnaWQ9IjEwMTcwNTgxODYzMjI3MTQ0MDUiPiJNdG9hamkgS2FtdXNpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9wcm92aWRlcl9uYW1lIiBtc2dpZD0iNzcxMDQxNTU5OTM3MTE2MTA5MiI+Ik10b2FqaSBLYW11c2kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NlcnZpY2VfbmFtZSIgbXNnaWQ9IjU1MTY1MDY5NzM0ODIwMjA1NiI+Ikh1ZHVtYSB5YSBLYW11c2kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiJNYWVsZXpvIHlhIGt1c2FzaXNoYSBrYW11c2kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3RpdGxlIiBtc2dpZD0iNzI0MzkzMDk2Nzg0NTAyMDQwNyI+Ik55b25nZXphIHphIGthbXVzaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbF9vdmVyX21ldGVyZWRfbmV0d29ya19wcm9tcHQiIG1zZ2lkPSIzNjQyNjM0NjIzNDY1MzQ5NzE2Ij4iS2FtdXNpIGluYXBhdGlrYW5hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc19zdW1tYXJ5IiBtc2dpZD0iODU5OTY3OTQzNDc5OTc0OTA1MyI+Ik1pcGFuZ2lsaW8geWEga2FtdXNpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNlcl9kaWN0aW9uYXJpZXMiIG1zZ2lkPSI3NTE5NzM2MjMyNDIzOTI5MTI0Ij4iS2FtdXNpIHlhIG10dW1pYWppIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4iS2FtdXNpIHlhIG10dW1pYWppIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9hdmFpbGFibGUiIG1zZ2lkPSIzMTkyOTIwNjA4NTIwNjE4MDgzIj4iS2FtdXNpIGluYXBhdGlrYW5hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kb3dubG9hZGluZyIgbXNnaWQ9Ijg1OTQ5NzQ3NjI2NjMwOTU5NiI+IkluYXBha3VhIHNhc2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxlZCIgbXNnaWQ9IjY0MjU1ODY4OTk2NzEzNzgxNjAiPiJJbWVzYWtpbmlzaHdhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kaXNhYmxlZCIgbXNnaWQ9IjM0NDg1NzEyODA0OTA3NDYwMzIiPiJrdXNha2luaXNoYSwgaW1lbGVtYXp3YSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiJUYXRpem8ga3V1bmdhbmlzaGEga3dhIGh1ZHVtYSB5YSBrYW11c2kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19kaWN0aW9uYXJpZXNfYXZhaWxhYmxlIiBtc2dpZD0iNTIwNjIyNTA3Nzk0NTYzNzgxMCI+Ikhha3VuYSBrYW11c2kgaW5hcGF0aWthbmEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiJaaW11YSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imxhc3RfdXBkYXRlIiBtc2dpZD0iMzEwMTU0OTcxOTgyNzYwMDM0NiI+Ik1hcmEgeWEgbXdpc2hvIGt1c2FzaXNod2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX3VwZGF0aW5nIiBtc2dpZD0iODIwMTg2Mjc2NzA0MTM0NzIwIj4iSW5hdGFmdXRhIHZpc2FzaXNoaS4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfbG9hZGluZyIgbXNnaWQ9Ijg2MTEzMzkxNDk4MjUwNDc0NDYiPiJJbmFwYWtpYS4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1haW5fZGljdF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjE2Nzk5NjQzMDY5ODAwOTg1NzAiPiJLYW11c2kga3V1Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsIiBtc2dpZD0iNTU4NjUzMTczNjYwOTE4MzMwNCI+IkthdGlzaGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJpbnN0YWxsX2RpY3QiIG1zZ2lkPSI1NTI1MDA1NTI0Njk3NjA3ODY1Ij4iU2FraW5pc2hhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsX2Rvd25sb2FkX2RpY3QiIG1zZ2lkPSI3MTYzMTczNjUwMjk4ODM4MzY3Ij4iR2hhaXJpIGt1cGFrdWEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaXNhYmxlX2RpY3QiIG1zZ2lkPSI3Njg1ODEwMDQwMjM2NDk3NzAwIj4iTGVtYXphIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZW5hYmxlX2RpY3QiIG1zZ2lkPSIzODQ4MTc5Nzg0NzAyNDczNjgwIj4iV2V6ZXNoYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlbGV0ZV9kaWN0IiBtc2dpZD0iNTgxNzE1OTI5MDUwMzg0Mzc2NiI+IkZ1dGEiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQgKDQ5NjUyNjQ4NDkwNTc2NTY1MjEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg0MDI0MDEzNzY0OTM3ODUwMDYxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvX25vdF9kb3dubG9hZF9vdmVyX21ldGVyZWQgKDY5NjM3NzA4ODUwMzM3NjUzNzgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0NTYwNTc2Mzc5NjgwNjYwMDQ3Ij4iS2FtdXNpIGluYXBhdGlrYW5hIHlhIDx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24iIG1zZ2lkPSIzNTU1MTUzODEyODUzMTc4MzIiPiJCb255ZXphIGlsaSBrdWthZ3VhIG5hIGt1cGFrdWEiPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy10aC9zdHJpbmdzLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy10aC9zdHJpbmdzLnhtbAppbmRleCA4NGM0YTAzLi4yY2Y5MTMwIDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMtdGgvc3RyaW5ncy54bWwKKysrIGIvamF2YS9yZXMvdmFsdWVzLXRoL3N0cmluZ3MueG1sCkBAIC0xNzAsNCArMTcwLDM5IEBACiAgICAgPHN0cmluZyBuYW1lPSJidXR0b25fZGVmYXVsdCIgbXNnaWQ9IjM5ODgwMTc4NDA0MzE4ODE0OTEiPiLguITguYjguLLguYDguKPguLTguYjguKHguJXguYnguJkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYW5ndWFnZV9zZXR0aW5ncyIgbXNnaWQ9IjE2NzExNTMwNTMyMDE4MDkwMzEiPiLguKDguLLguKnguLLguYHguKXguLDguIHguLLguKPguJvguYnguK3guJnguILguYnguK3guKHguLnguKUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RfaW5wdXRfbWV0aG9kIiBtc2dpZD0iNDMwMTYwMjM3NDYwOTI3NTAwMyI+IuC5gOC4peC4t+C4reC4geC4p+C4tOC4mOC4teC4geC4suC4o+C4m+C5ieC4reC4meC4guC5ieC4reC4oeC4ueC4pSI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4i4Lic4Li54LmJ4LmD4Lir4LmJ4Lia4Lij4Li04LiB4Liy4Lij4Lie4LiI4LiZ4Liy4LiZ4Li44LiB4Lij4LihIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9wcm92aWRlcl9uYW1lIiBtc2dpZD0iNzcxMDQxNTU5OTM3MTE2MTA5MiI+IuC4nOC4ueC5ieC5g+C4q+C5ieC4muC4o+C4tOC4geC4suC4o+C4nuC4iOC4meC4suC4meC4uOC4geC4o+C4oSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2VydmljZV9uYW1lIiBtc2dpZD0iNTUxNjUwNjk3MzQ4MjAyMDU2Ij4i4Lia4Lij4Li04LiB4Liy4Lij4Lie4LiI4LiZ4Liy4LiZ4Li44LiB4Lij4LihIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzMjc0ODYxNTE0Njk1MDMyOTU0Ij4i4LiC4LmJ4Lit4Lih4Li54Lil4Lit4Lix4Lib4LmA4LiU4LiV4Liq4Liz4Lir4Lij4Lix4Lia4Lie4LiI4LiZ4Liy4LiZ4Li44LiB4Lij4LihIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc190aXRsZSIgbXNnaWQ9IjcyNDM5MzA5Njc4NDUwMjA0MDciPiLguJ7guIjguJnguLLguJnguLjguIHguKPguKEgQWRkLU9uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsX292ZXJfbWV0ZXJlZF9uZXR3b3JrX3Byb21wdCIgbXNnaWQ9IjM2NDI2MzQ2MjM0NjUzNDk3MTYiPiLguKHguLXguJ7guIjguJnguLLguJnguLjguIHguKPguKHguYPguKvguYnguYPguIrguYnguIfguLLguJkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4i4LiB4Liy4Lij4LiV4Lix4LmJ4LiH4LiE4LmI4Liy4Liq4Liz4Lir4Lij4Lix4Lia4Lie4LiI4LiZ4Liy4LiZ4Li44LiB4Lij4LihIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNlcl9kaWN0aW9uYXJpZXMiIG1zZ2lkPSI3NTE5NzM2MjMyNDIzOTI5MTI0Ij4i4Lie4LiI4LiZ4Liy4LiZ4Li44LiB4Lij4Lih4Lic4Li54LmJ4LmD4LiK4LmJIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4i4Lie4LiI4LiZ4Liy4LiZ4Li44LiB4Lij4Lih4Lic4Li54LmJ4LmD4LiK4LmJIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9hdmFpbGFibGUiIG1zZ2lkPSIzMTkyOTIwNjA4NTIwNjE4MDgzIj4i4Lih4Li14Lie4LiI4LiZ4Liy4LiZ4Li44LiB4Lij4Lih4LmD4Lir4LmJ4LmD4LiK4LmJ4LiH4Liy4LiZIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kb3dubG9hZGluZyIgbXNnaWQ9Ijg1OTQ5NzQ3NjI2NjMwOTU5NiI+IuC4geC4s+C4peC4seC4h+C4lOC4suC4p+C4meC5jOC5guC4q+C4peC4lOC4reC4ouC4ueC5iCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbGVkIiBtc2dpZD0iNjQyNTU4Njg5OTY3MTM3ODE2MCI+IuC4leC4tOC4lOC4leC4seC5ieC4h+C5geC4peC5ieC4pyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZGlzYWJsZWQiIG1zZ2lkPSIzNDQ4NTcxMjgwNDkwNzQ2MDMyIj4i4LiV4Li04LiU4LiV4Lix4LmJ4LiH4LmB4Lil4LmJ4Lin4LmB4LiV4LmI4Lib4Li04LiU4LmD4LiK4LmJ4LiH4Liy4LiZIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2Fubm90X2Nvbm5lY3RfdG9fZGljdF9zZXJ2aWNlIiBtc2dpZD0iNjg3NTY2NTQ5NDcyNjMwMDQyNyI+IuC4nuC4muC4m+C4seC4jeC4q+C4suC4guC4k+C4sOC5gOC4iuC4t+C5iOC4reC4oeC4leC5iOC4rSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2RpY3Rpb25hcmllc19hdmFpbGFibGUiIG1zZ2lkPSI1MjA2MjI1MDc3OTQ1NjM3ODEwIj4i4LmE4Lih4LmI4Lih4Li14Lie4LiI4LiZ4Liy4LiZ4Li44LiB4Lij4LihIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2hlY2tfZm9yX3VwZGF0ZXNfbm93IiBtc2dpZD0iNjQyMDU3OTg2MTI3NjI0OTg2Ij4i4Lij4Li14LmA4Lif4Lij4LiKIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibGFzdF91cGRhdGUiIG1zZ2lkPSIzMTAxNTQ5NzE5ODI3NjAwMzQ2Ij4i4Lib4Lij4Lix4Lia4Lib4Lij4Li44LiH4Lil4LmI4Liy4Liq4Li44LiU4LmA4Lih4Li34LmI4LitIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV91cGRhdGluZyIgbXNnaWQ9IjgyMDE4NjI3NjcwNDEzNDcyMCI+IuC4geC4s+C4peC4seC4h+C4leC4o+C4p+C4iOC4quC4reC4muC4geC4suC4o+C4reC4seC4m+C5gOC4lOC4lS4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfbG9hZGluZyIgbXNnaWQ9Ijg2MTEzMzkxNDk4MjUwNDc0NDYiPiLguIHguLPguKXguLHguIfguYLguKvguKXguJQuLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtYWluX2RpY3RfZGVzY3JpcHRpb24iIG1zZ2lkPSIxNjc5OTY0MzA2OTgwMDk4NTcwIj4i4Lie4LiI4LiZ4Liy4LiZ4Li44LiB4Lij4Lih4Lir4Lil4Lix4LiBIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsIiBtc2dpZD0iNTU4NjUzMTczNjYwOTE4MzMwNCI+IuC4ouC4geC5gOC4peC4tOC4gSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imluc3RhbGxfZGljdCIgbXNnaWQ9IjU1MjUwMDU1MjQ2OTc2MDc4NjUiPiLguJXguLTguJTguJXguLHguYnguIciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWxfZG93bmxvYWRfZGljdCIgbXNnaWQ9IjcxNjMxNzM2NTAyOTg4MzgzNjciPiLguKLguIHguYDguKXguLTguIHguIHguLLguKPguJTguLLguKfguJnguYzguYLguKvguKXguJQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaXNhYmxlX2RpY3QiIG1zZ2lkPSI3Njg1ODEwMDQwMjM2NDk3NzAwIj4i4Lib4Li04LiU4LmD4LiK4LmJ4LiH4Liy4LiZIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZW5hYmxlX2RpY3QiIG1zZ2lkPSIzODQ4MTc5Nzg0NzAyNDczNjgwIj4i4LmA4Lib4Li04LiU4LmD4LiK4LmJ4LiH4Liy4LiZIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVsZXRlX2RpY3QiIG1zZ2lkPSI1ODE3MTU5MjkwNTAzODQzNzY2Ij4i4Lil4LiaIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNob3VsZF9kb3dubG9hZF9vdmVyX21ldGVyZWRfcHJvbXB0ICg0OTY1MjY0ODQ5MDU3NjU2NTIxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvd25sb2FkX292ZXJfbWV0ZXJlZCAoNDAyNDAxMzc2NDkzNzg1MDA2MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb19ub3RfZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg2OTYzNzcwODg1MDMzNzY1Mzc4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDU2MDU3NjM3OTY4MDY2MDA0NyI+IuC4oeC4teC4nuC4iOC4meC4suC4meC4uOC4geC4o+C4oeC5g+C4q+C5ieC5g+C4iuC5ieC4h+C4suC4meC5g+C4meC4oOC4suC4qeC4siA8eGxpZmY6ZyBpZD0iTEFOR1VBR0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzU1NTE1MzgxMjg1MzE3ODMyIj4i4LiB4LiU4LmA4Lie4Li34LmI4Lit4LiV4Lij4Lin4LiI4Liq4Lit4Lia4LmB4Lil4Liw4LiU4Liy4Lin4LiZ4LmM4LmC4Lir4Lil4LiUIjwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMtdGwvc3RyaW5ncy54bWwgYi9qYXZhL3Jlcy92YWx1ZXMtdGwvc3RyaW5ncy54bWwKaW5kZXggZTJhNTlhNC4uYWQ1NzE0ZCAxMDA2NDQKLS0tIGEvamF2YS9yZXMvdmFsdWVzLXRsL3N0cmluZ3MueG1sCisrKyBiL2phdmEvcmVzL3ZhbHVlcy10bC9zdHJpbmdzLnhtbApAQCAtMTcwLDQgKzE3MCwzOSBAQAogICAgIDxzdHJpbmcgbmFtZT0iYnV0dG9uX2RlZmF1bHQiIG1zZ2lkPSIzOTg4MDE3ODQwNDMxODgxNDkxIj4iRGVmYXVsdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxhbmd1YWdlX3NldHRpbmdzIiBtc2dpZD0iMTY3MTE1MzA1MzIwMTgwOTAzMSI+Ildpa2EgYXQgaW5wdXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RfaW5wdXRfbWV0aG9kIiBtc2dpZD0iNDMwMTYwMjM3NDYwOTI3NTAwMyI+IlB1bWlsaSBuZyBwYW1hbWFyYWFuIG5nIHBhZy1pbnB1dCI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4iUHJvdmlkZXIgbmcgRGlrc3l1bmFyeW8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3Byb3ZpZGVyX25hbWUiIG1zZ2lkPSI3NzEwNDE1NTk5MzcxMTYxMDkyIj4iUHJvdmlkZXIgbmcgRGlrc3l1bmFyeW8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NlcnZpY2VfbmFtZSIgbXNnaWQ9IjU1MTY1MDY5NzM0ODIwMjA1NiI+IlNlcmJpc3lvIG5nIERpa3N5dW5hcnlvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzMjc0ODYxNTE0Njk1MDMyOTU0Ij4iSW1wb3JtYXN5b24gbmcgcGFnLXVwZGF0ZSBzYSBkaWtzeXVuYXJ5byI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3NfdGl0bGUiIG1zZ2lkPSI3MjQzOTMwOTY3ODQ1MDIwNDA3Ij4iTWdhIGRpa3N5dW5hcnlvIG5hIGFkZC1vbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbF9vdmVyX21ldGVyZWRfbmV0d29ya19wcm9tcHQiIG1zZ2lkPSIzNjQyNjM0NjIzNDY1MzQ5NzE2Ij4iQXZhaWxhYmxlIGFuZyBkaWtzeXVuYXJ5byI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3Nfc3VtbWFyeSIgbXNnaWQ9Ijg1OTk2Nzk0MzQ3OTk3NDkwNTMiPiJNZ2Egc2V0dGluZyBwYXJhIHNhIG1nYSBkaWtzeXVuYXJ5byI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzZXJfZGljdGlvbmFyaWVzIiBtc2dpZD0iNzUxOTczNjIzMjQyMzkyOTEyNCI+Ik1nYSBkaWtzeXVuYXJ5byBuZyB1c2VyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4iRGlrc3l1bmFyeW8gbmcgdXNlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfYXZhaWxhYmxlIiBtc2dpZD0iMzE5MjkyMDYwODUyMDYxODA4MyI+IkF2YWlsYWJsZSBhbmcgZGlrc3l1bmFyeW8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rvd25sb2FkaW5nIiBtc2dpZD0iODU5NDk3NDc2MjY2MzA5NTk2Ij4iS2FzYWx1a3V5YW5nIG5hZ2RhLWRvd25sb2FkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsZWQiIG1zZ2lkPSI2NDI1NTg2ODk5NjcxMzc4MTYwIj4iTmFrYS1pbnN0YWxsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kaXNhYmxlZCIgbXNnaWQ9IjM0NDg1NzEyODA0OTA3NDYwMzIiPiJOYWthLWluc3RhbGwsIGhpbmRpIHBpbmFnYW5hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2Fubm90X2Nvbm5lY3RfdG9fZGljdF9zZXJ2aWNlIiBtc2dpZD0iNjg3NTY2NTQ5NDcyNjMwMDQyNyI+IlByb2JsZW1hIHNhIHBhZ2tvbmVrdGEgc2Egc2VyYmlzeW8gbmcgZGlrc3l1bmFyeW8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19kaWN0aW9uYXJpZXNfYXZhaWxhYmxlIiBtc2dpZD0iNTIwNjIyNTA3Nzk0NTYzNzgxMCI+IldhbGFuZyBhdmFpbGFibGUgbmEgbWdhIGRpa3N5dW5hcnlvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2hlY2tfZm9yX3VwZGF0ZXNfbm93IiBtc2dpZD0iNjQyMDU3OTg2MTI3NjI0OTg2Ij4iSS1yZWZyZXNoIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibGFzdF91cGRhdGUiIG1zZ2lkPSIzMTAxNTQ5NzE5ODI3NjAwMzQ2Ij4iSHVsaW5nIG5hLXVwZGF0ZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfdXBkYXRpbmciIG1zZ2lkPSI4MjAxODYyNzY3MDQxMzQ3MjAiPiJUdW1pdGluZ2luIG5nIG1nYSB1cGRhdGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX2xvYWRpbmciIG1zZ2lkPSI4NjExMzM5MTQ5ODI1MDQ3NDQ2Ij4iTmFnbG8tbG9hZC4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1haW5fZGljdF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjE2Nzk5NjQzMDY5ODAwOTg1NzAiPiJQYW5ndW5haGluZyBkaWtzeXVuYXJ5byI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbCIgbXNnaWQ9IjU1ODY1MzE3MzY2MDkxODMzMDQiPiJLYW5zZWxhaGluIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5zdGFsbF9kaWN0IiBtc2dpZD0iNTUyNTAwNTUyNDY5NzYwNzg2NSI+IkktaW5zdGFsbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbF9kb3dubG9hZF9kaWN0IiBtc2dpZD0iNzE2MzE3MzY1MDI5ODgzODM2NyI+IkthbnNlbGFoaW4gYW5nIHBhZy1kb3dubG9hZCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpc2FibGVfZGljdCIgbXNnaWQ9Ijc2ODU4MTAwNDAyMzY0OTc3MDAiPiJIdXdhZyBwYWdhbmFoaW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlbmFibGVfZGljdCIgbXNnaWQ9IjM4NDgxNzk3ODQ3MDI0NzM2ODAiPiJQYWdhbmFoaW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfZGljdCIgbXNnaWQ9IjU4MTcxNTkyOTA1MDM4NDM3NjYiPiJUYW5nZ2FsaW4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQgKDQ5NjUyNjQ4NDkwNTc2NTY1MjEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg0MDI0MDEzNzY0OTM3ODUwMDYxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvX25vdF9kb3dubG9hZF9vdmVyX21ldGVyZWQgKDY5NjM3NzA4ODUwMzM3NjUzNzgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0NTYwNTc2Mzc5NjgwNjYwMDQ3Ij4iQXZhaWxhYmxlIGFuZyBpc2FuZyBkaWtzeXVuYXJ5byBwYXJhIHNhIDx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24iIG1zZ2lkPSIzNTU1MTUzODEyODUzMTc4MzIiPiJQaW5kdXRpbiB1cGFuZyBzdXJpaW4gYXQgaS1kb3dubG9hZCI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLXRyL3N0cmluZ3MueG1sIGIvamF2YS9yZXMvdmFsdWVzLXRyL3N0cmluZ3MueG1sCmluZGV4IGM3OGQ1NmIuLjdlMTIyYWQgMTAwNjQ0Ci0tLSBhL2phdmEvcmVzL3ZhbHVlcy10ci9zdHJpbmdzLnhtbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtdHIvc3RyaW5ncy54bWwKQEAgLTE3MCw0ICsxNzAsMzkgQEAKICAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9kZWZhdWx0IiBtc2dpZD0iMzk4ODAxNzg0MDQzMTg4MTQ5MSI+IlZhcnNhecSxbGFuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGFuZ3VhZ2Vfc2V0dGluZ3MiIG1zZ2lkPSIxNjcxMTUzMDUzMjAxODA5MDMxIj4iRGlsIHZlIGdpcmnFnyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdF9pbnB1dF9tZXRob2QiIG1zZ2lkPSI0MzAxNjAyMzc0NjA5Mjc1MDAzIj4iR2lyacWfIHnDtm50ZW1pbmkgc2XDp2luIjwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJhcHBfbmFtZSIgbXNnaWQ9IjEwMTcwNTgxODYzMjI3MTQ0MDUiPiJTw7Z6bMO8ayBTYcSfbGF5xLFjxLEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3Byb3ZpZGVyX25hbWUiIG1zZ2lkPSI3NzEwNDE1NTk5MzcxMTYxMDkyIj4iU8O2emzDvGsgU2HEn2xhecSxY8SxIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXJ2aWNlX25hbWUiIG1zZ2lkPSI1NTE2NTA2OTczNDgyMDIwNTYiPiJTw7Z6bMO8ayBIaXptZXRpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzMjc0ODYxNTE0Njk1MDMyOTU0Ij4iU8O2emzDvGsgZ8O8bmNlbGxlbWUgYmlsZ2lsZXJpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc190aXRsZSIgbXNnaWQ9IjcyNDM5MzA5Njc4NDUwMjA0MDciPiJFa2xpIHPDtnpsw7xrbGVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsX292ZXJfbWV0ZXJlZF9uZXR3b3JrX3Byb21wdCIgbXNnaWQ9IjM2NDI2MzQ2MjM0NjUzNDk3MTYiPiJLdWxsYW7EsWxhYmlsZWNlayBzw7Z6bMO8ayB2YXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4iU8O2emzDvGtsZXIgacOnaW4gYXlhcmxhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzZXJfZGljdGlvbmFyaWVzIiBtc2dpZD0iNzUxOTczNjIzMjQyMzkyOTEyNCI+Ikt1bGxhbsSxY8SxIHPDtnpsw7xrbGVyaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfdXNlcl9kaWN0X3ByZWZfbmFtZSIgbXNnaWQ9IjUyMjEyNTE1Mjc1NzYwNzc5MCI+Ikt1bGxhbsSxY8SxIHPDtnpsw7zEn8O8Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9hdmFpbGFibGUiIG1zZ2lkPSIzMTkyOTIwNjA4NTIwNjE4MDgzIj4iU8O2emzDvGsga3VsbGFuxLFsYWJpbGlyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kb3dubG9hZGluZyIgbXNnaWQ9Ijg1OTQ5NzQ3NjI2NjMwOTU5NiI+IsWedSBhbmRhIGluZGlyaWxpeW9yIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsZWQiIG1zZ2lkPSI2NDI1NTg2ODk5NjcxMzc4MTYwIj4iWcO8a2xlbmRpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kaXNhYmxlZCIgbXNnaWQ9IjM0NDg1NzEyODA0OTA3NDYwMzIiPiJZw7xrbGVuZGksIGRldnJlIGTEscWfxLEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5ub3RfY29ubmVjdF90b19kaWN0X3NlcnZpY2UiIG1zZ2lkPSI2ODc1NjY1NDk0NzI2MzAwNDI3Ij4iU8O2emzDvGsgaGl6bWV0aW5lIGJhxJ9sYW50xLEgeW9rIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZGljdGlvbmFyaWVzX2F2YWlsYWJsZSIgbXNnaWQ9IjUyMDYyMjUwNzc5NDU2Mzc4MTAiPiJLdWxsYW7EsWxhYmlsaXIgc8O2emzDvGsgeW9rIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2hlY2tfZm9yX3VwZGF0ZXNfbm93IiBtc2dpZD0iNjQyMDU3OTg2MTI3NjI0OTg2Ij4iWWVuaWxlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibGFzdF91cGRhdGUiIG1zZ2lkPSIzMTAxNTQ5NzE5ODI3NjAwMzQ2Ij4iU29uIGfDvG5jZWxsZW1lIHRhcmloaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfdXBkYXRpbmciIG1zZ2lkPSI4MjAxODYyNzY3MDQxMzQ3MjAiPiJHw7xuY2VsbGVtZWxlciBkZW5ldGxlbml5b3IuLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX2xvYWRpbmciIG1zZ2lkPSI4NjExMzM5MTQ5ODI1MDQ3NDQ2Ij4iWcO8a2xlbml5b3IuLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtYWluX2RpY3RfZGVzY3JpcHRpb24iIG1zZ2lkPSIxNjc5OTY0MzA2OTgwMDk4NTcwIj4iQW5hIHPDtnpsw7xrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsIiBtc2dpZD0iNTU4NjUzMTczNjYwOTE4MzMwNCI+IsSwcHRhbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imluc3RhbGxfZGljdCIgbXNnaWQ9IjU1MjUwMDU1MjQ2OTc2MDc4NjUiPiJZw7xrbGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWxfZG93bmxvYWRfZGljdCIgbXNnaWQ9IjcxNjMxNzM2NTAyOTg4MzgzNjciPiLEsG5kaXJtZXlpIGlwdGFsIGV0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWJsZV9kaWN0IiBtc2dpZD0iNzY4NTgxMDA0MDIzNjQ5NzcwMCI+IkRldnJlIGTEscWfxLEgYsSxcmFrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZW5hYmxlX2RpY3QiIG1zZ2lkPSIzODQ4MTc5Nzg0NzAyNDczNjgwIj4iRXRraW5sZcWfdGlyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVsZXRlX2RpY3QiIG1zZ2lkPSI1ODE3MTU5MjkwNTAzODQzNzY2Ij4iU2lsIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNob3VsZF9kb3dubG9hZF9vdmVyX21ldGVyZWRfcHJvbXB0ICg0OTY1MjY0ODQ5MDU3NjU2NTIxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvd25sb2FkX292ZXJfbWV0ZXJlZCAoNDAyNDAxMzc2NDkzNzg1MDA2MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb19ub3RfZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg2OTYzNzcwODg1MDMzNzY1Mzc4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDU2MDU3NjM3OTY4MDY2MDA0NyI+Ijx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4gacOnaW4ga3VsbGFuxLFsYWJpbGVjZWsgYmlyIHPDtnpsw7xrIHZhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM1NTUxNTM4MTI4NTMxNzgzMiI+IsSwbmNlbGVtZWsgdmUgaW5kaXJtZWsgacOnaW4gdMSxa2xhecSxbiI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLXVrL3N0cmluZ3MueG1sIGIvamF2YS9yZXMvdmFsdWVzLXVrL3N0cmluZ3MueG1sCmluZGV4IGExN2YwZDEuLjYwOWM4MGIgMTAwNjQ0Ci0tLSBhL2phdmEvcmVzL3ZhbHVlcy11ay9zdHJpbmdzLnhtbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtdWsvc3RyaW5ncy54bWwKQEAgLTE3MCw0ICsxNzAsMzkgQEAKICAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9kZWZhdWx0IiBtc2dpZD0iMzk4ODAxNzg0MDQzMTg4MTQ5MSI+ItCX0LAg0YPQvNC+0LLRh9Cw0L3QvdGP0LwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYW5ndWFnZV9zZXR0aW5ncyIgbXNnaWQ9IjE2NzExNTMwNTMyMDE4MDkwMzEiPiLQnNC+0LLQsCDRgtCwINCy0LLQtdC00LXQvdC90Y8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RfaW5wdXRfbWV0aG9kIiBtc2dpZD0iNDMwMTYwMjM3NDYwOTI3NTAwMyI+ItCS0LjQsdGA0LDRgtC4INC80LXRgtC+0LQg0LLQstC10LTQtdC90L3RjyI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4i0J/QvtGB0YLQsNGH0LDQu9GM0L3QuNC6INGB0LvQvtCy0L3QuNC60LAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3Byb3ZpZGVyX25hbWUiIG1zZ2lkPSI3NzEwNDE1NTk5MzcxMTYxMDkyIj4i0J/QvtGB0YLQsNGH0LDQu9GM0L3QuNC6INGB0LvQvtCy0L3QuNC60LAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NlcnZpY2VfbmFtZSIgbXNnaWQ9IjU1MTY1MDY5NzM0ODIwMjA1NiI+ItCf0L7RgdC70YPQs9CwINGB0LvQvtCy0L3QuNC60LAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiLQhtC90YTQvtGA0LzQsNGG0ZbRjyDQv9GA0L4g0L7QvdC+0LLQu9C10L3QvdGPINGB0LvQvtCy0L3QuNC60LAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3RpdGxlIiBtc2dpZD0iNzI0MzkzMDk2Nzg0NTAyMDQwNyI+ItCU0L7QtNCw0YLQutC+0LLRliDRgdC70L7QstC90LjQutC4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsX292ZXJfbWV0ZXJlZF9uZXR3b3JrX3Byb21wdCIgbXNnaWQ9IjM2NDI2MzQ2MjM0NjUzNDk3MTYiPiLQodC70L7QstC90LjQuiDQtNC+0YHRgtGD0L/QvdC40LkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4i0J3QsNC70LDRiNGC0YPQstCw0L3QvdGPINC00LvRjyDRgdC70L7QstC90LjQutGW0LIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2VyX2RpY3Rpb25hcmllcyIgbXNnaWQ9Ijc1MTk3MzYyMzI0MjM5MjkxMjQiPiLQodC70L7QstC90LjQutC4INC60L7RgNC40YHRgtGD0LLQsNGH0LAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X3VzZXJfZGljdF9wcmVmX25hbWUiIG1zZ2lkPSI1MjIxMjUxNTI3NTc2MDc3OTAiPiLQodC70L7QstC90LjQuiDQutC+0YDQuNGB0YLRg9Cy0LDRh9CwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9hdmFpbGFibGUiIG1zZ2lkPSIzMTkyOTIwNjA4NTIwNjE4MDgzIj4i0KHQu9C+0LLQvdC40Log0LTQvtGB0YLRg9C/0L3QuNC5Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kb3dubG9hZGluZyIgbXNnaWQ9Ijg1OTQ5NzQ3NjI2NjMwOTU5NiI+ItCX0LDRgNCw0Lcg0LfQsNCy0LDQvdGC0LDQttGD0ZTRgtGM0YHRjyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbGVkIiBtc2dpZD0iNjQyNTU4Njg5OTY3MTM3ODE2MCI+ItCj0YHRgtCw0L3QvtCy0LvQtdC90L4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rpc2FibGVkIiBtc2dpZD0iMzQ0ODU3MTI4MDQ5MDc0NjAzMiI+ItCj0YHRgtCw0L3QvtCy0LvQtdC90L4sINCy0LjQvNC60L3QtdC90L4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5ub3RfY29ubmVjdF90b19kaWN0X3NlcnZpY2UiIG1zZ2lkPSI2ODc1NjY1NDk0NzI2MzAwNDI3Ij4i0J3QtdC80LAg0LfigJnRlNC00L3QsNC90L3RjyDQt9GWINGB0LvQvtCy0L3QuNC60L7QvCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2RpY3Rpb25hcmllc19hdmFpbGFibGUiIG1zZ2lkPSI1MjA2MjI1MDc3OTQ1NjM3ODEwIj4i0KHQu9C+0LLQvdC40LrQuCDQvdC10LTQvtGB0YLRg9C/0L3RliI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNoZWNrX2Zvcl91cGRhdGVzX25vdyIgbXNnaWQ9IjY0MjA1Nzk4NjEyNzYyNDk4NiI+ItCe0L3QvtCy0LjRgtC4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibGFzdF91cGRhdGUiIG1zZ2lkPSIzMTAxNTQ5NzE5ODI3NjAwMzQ2Ij4i0J7RgdGC0LDQvdC90ZQg0L7QvdC+0LLQu9C10L3QvdGPIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV91cGRhdGluZyIgbXNnaWQ9IjgyMDE4NjI3NjcwNDEzNDcyMCI+ItCf0LXRgNC10LLRltGA0LrQsCDQvdCw0Y/QstC90L7RgdGC0ZYg0L7QvdC+0LLQu9C10L3RjCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfbG9hZGluZyIgbXNnaWQ9Ijg2MTEzMzkxNDk4MjUwNDc0NDYiPiLQl9Cw0LLQsNC90YLQsNC20LXQvdC90Y8uLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtYWluX2RpY3RfZGVzY3JpcHRpb24iIG1zZ2lkPSIxNjc5OTY0MzA2OTgwMDk4NTcwIj4i0J7RgdC90L7QstC90LjQuSDRgdC70L7QstC90LjQuiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbCIgbXNnaWQ9IjU1ODY1MzE3MzY2MDkxODMzMDQiPiLQodC60LDRgdGD0LLQsNGC0LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJpbnN0YWxsX2RpY3QiIG1zZ2lkPSI1NTI1MDA1NTI0Njk3NjA3ODY1Ij4i0KPRgdGC0LDQvdC+0LLQuNGC0LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWxfZG93bmxvYWRfZGljdCIgbXNnaWQ9IjcxNjMxNzM2NTAyOTg4MzgzNjciPiLQodC60LDRgdGD0LLQsNGC0Lgg0LfQsNCy0LDQvdGC0LDQttC10L3QvdGPIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWJsZV9kaWN0IiBtc2dpZD0iNzY4NTgxMDA0MDIzNjQ5NzcwMCI+ItCS0LjQvNC60L3Rg9GC0LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlbmFibGVfZGljdCIgbXNnaWQ9IjM4NDgxNzk3ODQ3MDI0NzM2ODAiPiLQo9Cy0ZbQvNC60L3Rg9GC0LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfZGljdCIgbXNnaWQ9IjU4MTcxNTkyOTA1MDM4NDM3NjYiPiLQktC40LTQsNC70LjRgtC4Ijwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNob3VsZF9kb3dubG9hZF9vdmVyX21ldGVyZWRfcHJvbXB0ICg0OTY1MjY0ODQ5MDU3NjU2NTIxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvd25sb2FkX292ZXJfbWV0ZXJlZCAoNDAyNDAxMzc2NDkzNzg1MDA2MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb19ub3RfZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg2OTYzNzcwODg1MDMzNzY1Mzc4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDU2MDU3NjM3OTY4MDY2MDA0NyI+ItCU0L7RgdGC0YPQv9C90LjQuSDRgdC70L7QstC90LjQuiDQtNC70Y8g0YLQsNC60L7RlyDQvNC+0LLQuDogPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM1NTUxNTM4MTI4NTMxNzgzMiI+ItCd0LDRgtC40YHQvdGW0YLRjCwg0YnQvtCxINC/0LXRgNC10LPQu9GP0L3Rg9GC0Lgg0YLQsCDQt9Cw0LLQsNC90YLQsNC20LjRgtC4Ijwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMtdmkvc3RyaW5ncy54bWwgYi9qYXZhL3Jlcy92YWx1ZXMtdmkvc3RyaW5ncy54bWwKaW5kZXggMmRjZmIxOS4uMTJkMDViYiAxMDA2NDQKLS0tIGEvamF2YS9yZXMvdmFsdWVzLXZpL3N0cmluZ3MueG1sCisrKyBiL2phdmEvcmVzL3ZhbHVlcy12aS9zdHJpbmdzLnhtbApAQCAtMTcwLDQgKzE3MCwzOSBAQAogICAgIDxzdHJpbmcgbmFtZT0iYnV0dG9uX2RlZmF1bHQiIG1zZ2lkPSIzOTg4MDE3ODQwNDMxODgxNDkxIj4iTeG6t2MgxJHhu4tuaCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxhbmd1YWdlX3NldHRpbmdzIiBtc2dpZD0iMTY3MTE1MzA1MzIwMTgwOTAzMSI+Ik5nw7RuIG5n4buvIHbDoCBwaMawxqFuZyB0aOG7qWMgbmjhuq1wIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0X2lucHV0X21ldGhvZCIgbXNnaWQ9IjQzMDE2MDIzNzQ2MDkyNzUwMDMiPiJDaOG7jW4gcGjGsMahbmcgdGjhu6ljIG5o4bqtcCI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4iTmjDoCBjdW5nIGPhuqVwIHThu6sgxJFp4buDbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfcHJvdmlkZXJfbmFtZSIgbXNnaWQ9Ijc3MTA0MTU1OTkzNzExNjEwOTIiPiJOaMOgIGN1bmcgY+G6pXAgdOG7qyDEkWnhu4NuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXJ2aWNlX25hbWUiIG1zZ2lkPSI1NTE2NTA2OTczNDgyMDIwNTYiPiJE4buLY2ggduG7pSB04burIMSRaeG7g24iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiJUaMO0bmcgdGluIGPhuq1wIG5o4bqtdCB04burIMSRaeG7g24iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3RpdGxlIiBtc2dpZD0iNzI0MzkzMDk2Nzg0NTAyMDQwNyI+IlThu6sgxJFp4buDbiBwaOG7pSB0cuG7oyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbF9vdmVyX21ldGVyZWRfbmV0d29ya19wcm9tcHQiIG1zZ2lkPSIzNjQyNjM0NjIzNDY1MzQ5NzE2Ij4iQ8OzIHPhurVuIHThu6sgxJFp4buDbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3Nfc3VtbWFyeSIgbXNnaWQ9Ijg1OTk2Nzk0MzQ3OTk3NDkwNTMiPiJDw6BpIMSR4bq3dCBkw6BuaCBjaG8gdOG7qyDEkWnhu4NuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNlcl9kaWN0aW9uYXJpZXMiIG1zZ2lkPSI3NTE5NzM2MjMyNDIzOTI5MTI0Ij4iVOG7qyDEkWnhu4NuIG5nxrDhu51pIGTDuW5nIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4iVOG7qyDEkWnhu4NuIG5nxrDhu51pIGTDuW5nIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9hdmFpbGFibGUiIG1zZ2lkPSIzMTkyOTIwNjA4NTIwNjE4MDgzIj4iQ8OzIHPhurVuIHThu6sgxJFp4buDbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZG93bmxvYWRpbmciIG1zZ2lkPSI4NTk0OTc0NzYyNjYzMDk1OTYiPiJIaeG7h24gxJFhbmcgdOG6o2kgeHXhu5FuZyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbGVkIiBtc2dpZD0iNjQyNTU4Njg5OTY3MTM3ODE2MCI+IsSQw6MgY8OgaSDEkeG6t3QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rpc2FibGVkIiBtc2dpZD0iMzQ0ODU3MTI4MDQ5MDc0NjAzMiI+IsSQw6MgY8OgaSDEkeG6t3QsIGLhu4sgdOG6r3QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5ub3RfY29ubmVjdF90b19kaWN0X3NlcnZpY2UiIG1zZ2lkPSI2ODc1NjY1NDk0NzI2MzAwNDI3Ij4iTOG7l2kga27hu5FpIGQuduG7pSB0LsSRaeG7g24iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19kaWN0aW9uYXJpZXNfYXZhaWxhYmxlIiBtc2dpZD0iNTIwNjIyNTA3Nzk0NTYzNzgxMCI+Iktow7RuZyBjw7MgdOG7qyDEkWnhu4NuIG7DoG8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiJMw6BtIG3hu5tpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibGFzdF91cGRhdGUiIG1zZ2lkPSIzMTAxNTQ5NzE5ODI3NjAwMzQ2Ij4iQ+G6rXAgbmjhuq10IGzhuqduIGN14buRaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfdXBkYXRpbmciIG1zZ2lkPSI4MjAxODYyNzY3MDQxMzQ3MjAiPiLEkGFuZyBraeG7g20gdHJhIGPhuq1wIG5o4bqtdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfbG9hZGluZyIgbXNnaWQ9Ijg2MTEzMzkxNDk4MjUwNDc0NDYiPiLEkGFuZyB04bqjaS4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1haW5fZGljdF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjE2Nzk5NjQzMDY5ODAwOTg1NzAiPiJU4burIMSRaeG7g24gY2jDrW5oIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsIiBtc2dpZD0iNTU4NjUzMTczNjYwOTE4MzMwNCI+Ikjhu6d5Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5zdGFsbF9kaWN0IiBtc2dpZD0iNTUyNTAwNTUyNDY5NzYwNzg2NSI+IkPDoGkgxJHhurd0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsX2Rvd25sb2FkX2RpY3QiIG1zZ2lkPSI3MTYzMTczNjUwMjk4ODM4MzY3Ij4iSOG7p3kgdOG6o2kgeHXhu5FuZyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpc2FibGVfZGljdCIgbXNnaWQ9Ijc2ODU4MTAwNDAyMzY0OTc3MDAiPiJU4bqvdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVuYWJsZV9kaWN0IiBtc2dpZD0iMzg0ODE3OTc4NDcwMjQ3MzY4MCI+IkLhuq10Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVsZXRlX2RpY3QiIG1zZ2lkPSI1ODE3MTU5MjkwNTAzODQzNzY2Ij4iWMOzYSI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaG91bGRfZG93bmxvYWRfb3Zlcl9tZXRlcmVkX3Byb21wdCAoNDk2NTI2NDg0OTA1NzY1NjUyMSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb3dubG9hZF9vdmVyX21ldGVyZWQgKDQwMjQwMTM3NjQ5Mzc4NTAwNjEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZG9fbm90X2Rvd25sb2FkX292ZXJfbWV0ZXJlZCAoNjk2Mzc3MDg4NTAzMzc2NTM3OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ1NjA1NzYzNzk2ODA2NjAwNDciPiJDw7Mgc+G6tW4gdOG7qyDEkWnhu4NuIGNobyA8eGxpZmY6ZyBpZD0iTEFOR1VBR0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzU1NTE1MzgxMjg1MzE3ODMyIj4iTmjhuqVuIMSR4buDIHhlbSBs4bqhaSB2w6AgdOG6o2kgeHXhu5FuZyI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLXpoLXJDTi9zdHJpbmdzLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy16aC1yQ04vc3RyaW5ncy54bWwKaW5kZXggM2U0Nzc3Ni4uMGUyZmQ3YyAxMDA2NDQKLS0tIGEvamF2YS9yZXMvdmFsdWVzLXpoLXJDTi9zdHJpbmdzLnhtbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtemgtckNOL3N0cmluZ3MueG1sCkBAIC0xNzAsNCArMTcwLDM5IEBACiAgICAgPHN0cmluZyBuYW1lPSJidXR0b25fZGVmYXVsdCIgbXNnaWQ9IjM5ODgwMTc4NDA0MzE4ODE0OTEiPiLpu5jorqQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYW5ndWFnZV9zZXR0aW5ncyIgbXNnaWQ9IjE2NzExNTMwNTMyMDE4MDkwMzEiPiLor63oqIDlkozovpPlhaXms5UiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RfaW5wdXRfbWV0aG9kIiBtc2dpZD0iNDMwMTYwMjM3NDYwOTI3NTAwMyI+IumAieaLqei+k+WFpeazlSI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4i6K+N5YW45aSn5YWoIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9wcm92aWRlcl9uYW1lIiBtc2dpZD0iNzcxMDQxNTU5OTM3MTE2MTA5MiI+IuivjeWFuOWkp+WFqCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2VydmljZV9uYW1lIiBtc2dpZD0iNTUxNjUwNjk3MzQ4MjAyMDU2Ij4i5a2X5YW45pyN5YqhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzMjc0ODYxNTE0Njk1MDMyOTU0Ij4i6K+N5YW45pu05paw5L+h5oGvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc190aXRsZSIgbXNnaWQ9IjcyNDM5MzA5Njc4NDUwMjA0MDciPiLpmYTliqDor43lhbgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxfb3Zlcl9tZXRlcmVkX25ldHdvcmtfcHJvbXB0IiBtc2dpZD0iMzY0MjYzNDYyMzQ2NTM0OTcxNiI+IuivjeWFuOWPr+S+m+S4i+i9vSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3Nfc3VtbWFyeSIgbXNnaWQ9Ijg1OTk2Nzk0MzQ3OTk3NDkwNTMiPiLor43lhbjorr7nva4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2VyX2RpY3Rpb25hcmllcyIgbXNnaWQ9Ijc1MTk3MzYyMzI0MjM5MjkxMjQiPiLnlKjmiLfor43lhbgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X3VzZXJfZGljdF9wcmVmX25hbWUiIG1zZ2lkPSI1MjIxMjUxNTI3NTc2MDc3OTAiPiLnlKjmiLfor43lhbgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiLor43lhbjlj6/kvpvkuIvovb0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rvd25sb2FkaW5nIiBtc2dpZD0iODU5NDk3NDc2MjY2MzA5NTk2Ij4i55uu5YmN5q2j5Zyo5LiL6L29Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsZWQiIG1zZ2lkPSI2NDI1NTg2ODk5NjcxMzc4MTYwIj4i5bey5a6J6KOFIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kaXNhYmxlZCIgbXNnaWQ9IjM0NDg1NzEyODA0OTA3NDYwMzIiPiLlt7Llronoo4XvvIzlt7LlgZznlKgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5ub3RfY29ubmVjdF90b19kaWN0X3NlcnZpY2UiIG1zZ2lkPSI2ODc1NjY1NDk0NzI2MzAwNDI3Ij4i6L+e5o6l5Yiw6K+N5YW45pyN5Yqh5pe25Y+R55Sf6Zeu6aKYIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZGljdGlvbmFyaWVzX2F2YWlsYWJsZSIgbXNnaWQ9IjUyMDYyMjUwNzc5NDU2Mzc4MTAiPiLmsqHmnInlj6/nlKjnmoTor43lhbgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiLliLfmlrAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsYXN0X3VwZGF0ZSIgbXNnaWQ9IjMxMDE1NDk3MTk4Mjc2MDAzNDYiPiLmnIDlkI7mm7TmlrDml7bpl7QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX3VwZGF0aW5nIiBtc2dpZD0iODIwMTg2Mjc2NzA0MTM0NzIwIj4i5q2j5Zyo5qOA5p+l5pu05pawIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV9sb2FkaW5nIiBtc2dpZD0iODYxMTMzOTE0OTgyNTA0NzQ0NiI+Iuato+WcqOWKoOi9vS4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1haW5fZGljdF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjE2Nzk5NjQzMDY5ODAwOTg1NzAiPiLkuLvor43lhbgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWwiIG1zZ2lkPSI1NTg2NTMxNzM2NjA5MTgzMzA0Ij4i5Y+W5raIIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5zdGFsbF9kaWN0IiBtc2dpZD0iNTUyNTAwNTUyNDY5NzYwNzg2NSI+IuWuieijhSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbF9kb3dubG9hZF9kaWN0IiBtc2dpZD0iNzE2MzE3MzY1MDI5ODgzODM2NyI+IuWPlua2iOS4i+i9vSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpc2FibGVfZGljdCIgbXNnaWQ9Ijc2ODU4MTAwNDAyMzY0OTc3MDAiPiLlgZznlKgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlbmFibGVfZGljdCIgbXNnaWQ9IjM4NDgxNzk3ODQ3MDI0NzM2ODAiPiLlkK/nlKgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfZGljdCIgbXNnaWQ9IjU4MTcxNTkyOTA1MDM4NDM3NjYiPiLliKDpmaQiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQgKDQ5NjUyNjQ4NDkwNTc2NTY1MjEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg0MDI0MDEzNzY0OTM3ODUwMDYxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvX25vdF9kb3dubG9hZF9vdmVyX21ldGVyZWQgKDY5NjM3NzA4ODUwMzM3NjUzNzgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0NTYwNTc2Mzc5NjgwNjYwMDQ3Ij4iPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPuivjeWFuOWPr+S+m+S4i+i9vSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM1NTUxNTM4MTI4NTMxNzgzMiI+IuaMieatpOmAmuefpeWNs+WPr+afpeeci+WSjOS4i+i9vSI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLXpoLXJUVy9zdHJpbmdzLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy16aC1yVFcvc3RyaW5ncy54bWwKaW5kZXggYWI2YzY2NC4uYWU0YTQ4ZiAxMDA2NDQKLS0tIGEvamF2YS9yZXMvdmFsdWVzLXpoLXJUVy9zdHJpbmdzLnhtbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtemgtclRXL3N0cmluZ3MueG1sCkBAIC0xNzAsNCArMTcwLDM5IEBACiAgICAgPHN0cmluZyBuYW1lPSJidXR0b25fZGVmYXVsdCIgbXNnaWQ9IjM5ODgwMTc4NDA0MzE4ODE0OTEiPiLpoJDoqK0iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYW5ndWFnZV9zZXR0aW5ncyIgbXNnaWQ9IjE2NzExNTMwNTMyMDE4MDkwMzEiPiLoqp7oqIDoiIfovLjlhaXoqK3lrpoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RfaW5wdXRfbWV0aG9kIiBtc2dpZD0iNDMwMTYwMjM3NDYwOTI3NTAwMyI+IumBuOaTh+i8uOWFpeazlSI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4i5a2X5YW45o+Q5L6b6ICFIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9wcm92aWRlcl9uYW1lIiBtc2dpZD0iNzcxMDQxNTU5OTM3MTE2MTA5MiI+IuWtl+WFuOaPkOS+m+iAhSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2VydmljZV9uYW1lIiBtc2dpZD0iNTUxNjUwNjk3MzQ4MjAyMDU2Ij4i5a2X5YW45pyN5YuZIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzMjc0ODYxNTE0Njk1MDMyOTU0Ij4i5a2X5YW45pu05paw6LOH6KiKIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc190aXRsZSIgbXNnaWQ9IjcyNDM5MzA5Njc4NDUwMjA0MDciPiLlpJbmjpvlrZflhbgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxfb3Zlcl9tZXRlcmVkX25ldHdvcmtfcHJvbXB0IiBtc2dpZD0iMzY0MjYzNDYyMzQ2NTM0OTcxNiI+IuWtl+WFuOWPr+S+m+S4i+i8iSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3Nfc3VtbWFyeSIgbXNnaWQ9Ijg1OTk2Nzk0MzQ3OTk3NDkwNTMiPiLlrZflhbjoqK3lrpoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2VyX2RpY3Rpb25hcmllcyIgbXNnaWQ9Ijc1MTk3MzYyMzI0MjM5MjkxMjQiPiLkvb/nlKjogIXlrZflhbgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X3VzZXJfZGljdF9wcmVmX25hbWUiIG1zZ2lkPSI1MjIxMjUxNTI3NTc2MDc3OTAiPiLkvb/nlKjogIXlrZflhbgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiLlj6/nlKjnmoTlrZflhbgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rvd25sb2FkaW5nIiBtc2dpZD0iODU5NDk3NDc2MjY2MzA5NTk2Ij4i55uu5YmN5q2j5Zyo5LiL6LyJIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsZWQiIG1zZ2lkPSI2NDI1NTg2ODk5NjcxMzc4MTYwIj4i5bey5a6J6KOdIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kaXNhYmxlZCIgbXNnaWQ9IjM0NDg1NzEyODA0OTA3NDYwMzIiPiLlt7Llronoo53kvYbnm67liY3lgZznlKgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5ub3RfY29ubmVjdF90b19kaWN0X3NlcnZpY2UiIG1zZ2lkPSI2ODc1NjY1NDk0NzI2MzAwNDI3Ij4i6YCj57ea6Iez5a2X5YW45pyN5YuZ5pmC55m855Sf5ZWP6aGMIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZGljdGlvbmFyaWVzX2F2YWlsYWJsZSIgbXNnaWQ9IjUyMDYyMjUwNzc5NDU2Mzc4MTAiPiLmspLmnInlj6/nlKjnmoTlrZflhbgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiLph43mlrDmlbTnkIYiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsYXN0X3VwZGF0ZSIgbXNnaWQ9IjMxMDE1NDk3MTk4Mjc2MDAzNDYiPiLkuIrmrKHmm7TmlrDmmYLplpMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX3VwZGF0aW5nIiBtc2dpZD0iODIwMTg2Mjc2NzA0MTM0NzIwIj4i5q2j5Zyo5qqi5p+l5pu05pawIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV9sb2FkaW5nIiBtc2dpZD0iODYxMTMzOTE0OTgyNTA0NzQ0NiI+Iui8ieWFpeS4rS4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1haW5fZGljdF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjE2Nzk5NjQzMDY5ODAwOTg1NzAiPiLkuLvopoHlrZflhbgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWwiIG1zZ2lkPSI1NTg2NTMxNzM2NjA5MTgzMzA0Ij4i5Y+W5raIIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5zdGFsbF9kaWN0IiBtc2dpZD0iNTUyNTAwNTUyNDY5NzYwNzg2NSI+IuWuieijnSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbF9kb3dubG9hZF9kaWN0IiBtc2dpZD0iNzE2MzE3MzY1MDI5ODgzODM2NyI+IuWPlua2iOS4i+i8iSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpc2FibGVfZGljdCIgbXNnaWQ9Ijc2ODU4MTAwNDAyMzY0OTc3MDAiPiLlgZznlKgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlbmFibGVfZGljdCIgbXNnaWQ9IjM4NDgxNzk3ODQ3MDI0NzM2ODAiPiLllZ/nlKgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfZGljdCIgbXNnaWQ9IjU4MTcxNTkyOTA1MDM4NDM3NjYiPiLliKrpmaQiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQgKDQ5NjUyNjQ4NDkwNTc2NTY1MjEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg0MDI0MDEzNzY0OTM3ODUwMDYxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvX25vdF9kb3dubG9hZF9vdmVyX21ldGVyZWQgKDY5NjM3NzA4ODUwMzM3NjUzNzgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0NTYwNTc2Mzc5NjgwNjYwMDQ3Ij4i5pSv5o+044CMPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPuOAjeWtl+WFuCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM1NTUxNTM4MTI4NTMxNzgzMiI+IuaMieS4i+WNs+WPr+afpeeci+S4puS4i+i8iSI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLXp1L3N0cmluZ3MueG1sIGIvamF2YS9yZXMvdmFsdWVzLXp1L3N0cmluZ3MueG1sCmluZGV4IDY3NzU4OGIuLjllMTE4MjEgMTAwNjQ0Ci0tLSBhL2phdmEvcmVzL3ZhbHVlcy16dS9zdHJpbmdzLnhtbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtenUvc3RyaW5ncy54bWwKQEAgLTE3MCw0ICsxNzAsMzkgQEAKICAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9kZWZhdWx0IiBtc2dpZD0iMzk4ODAxNzg0MDQzMTg4MTQ5MSI+Ik9rdXplbnpha2FsZWxheW8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYW5ndWFnZV9zZXR0aW5ncyIgbXNnaWQ9IjE2NzExNTMwNTMyMDE4MDkwMzEiPiJVbGltaSBub2tva3VmYWt3YXlvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0X2lucHV0X21ldGhvZCIgbXNnaWQ9IjQzMDE2MDIzNzQ2MDkyNzUwMDMiPiJLaGV0aGEgaW5kbGVsYSB5b2t1ZmFrYSI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4iVW1obGluemVraSBXZXNpY2hhemFtYXp3aSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfcHJvdmlkZXJfbmFtZSIgbXNnaWQ9Ijc3MTA0MTU1OTkzNzExNjEwOTIiPiJVbWhsaW56ZWtpIFdlc2ljaGF6YW1hendpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXJ2aWNlX25hbWUiIG1zZ2lkPSI1NTE2NTA2OTczNDgyMDIwNTYiPiJJbnNpemEgeWVzaWNoYXphbWF6d2kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiJVbHdhemkgbG9rdWJ1eWVrZXphIGlzaWNoYXphbWF6d2kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3RpdGxlIiBtc2dpZD0iNzI0MzkzMDk2Nzg0NTAyMDQwNyI+IkZha2EgaXppY2hhemFtYXp3aSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbF9vdmVyX21ldGVyZWRfbmV0d29ya19wcm9tcHQiIG1zZ2lkPSIzNjQyNjM0NjIzNDY1MzQ5NzE2Ij4iSXNpY2hhemFtYXp3aSBzaXlhdGhvbGFrYWxhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc19zdW1tYXJ5IiBtc2dpZD0iODU5OTY3OTQzNDc5OTc0OTA1MyI+Ikl6aWx1bmdpc2VsZWxvIHplemljaGF6YW1hendpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNlcl9kaWN0aW9uYXJpZXMiIG1zZ2lkPSI3NTE5NzM2MjMyNDIzOTI5MTI0Ij4iU2ViZW56aXNhIGlzaWNoYXphbWF6d2kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X3VzZXJfZGljdF9wcmVmX25hbWUiIG1zZ2lkPSI1MjIxMjUxNTI3NTc2MDc3OTAiPiJJc2ljaGF6YW1hendpIFNvbXNlYmVuemlzaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfYXZhaWxhYmxlIiBtc2dpZD0iMzE5MjkyMDYwODUyMDYxODA4MyI+IklzaWNoYXphbWF6d2kgc2l5YXRob2xha2FsYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZG93bmxvYWRpbmciIG1zZ2lkPSI4NTk0OTc0NzYyNjYzMDk1OTYiPiJPa3dhbWFuamUgaXlhbGF5aXNoYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbGVkIiBtc2dpZD0iNjQyNTU4Njg5OTY3MTM3ODE2MCI+Ikt1ZmFraXdlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kaXNhYmxlZCIgbXNnaWQ9IjM0NDg1NzEyODA0OTA3NDYwMzIiPiJLdWZha2l3ZSwga3VtaXNpd2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5ub3RfY29ubmVjdF90b19kaWN0X3NlcnZpY2UiIG1zZ2lkPSI2ODc1NjY1NDk0NzI2MzAwNDI3Ij4iSW5raW5nYSB5b2t1eGh1bWFuaXNla2EgZXNldmlzaW5pIHllc2ljaGF6YW1hendpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZGljdGlvbmFyaWVzX2F2YWlsYWJsZSIgbXNnaWQ9IjUyMDYyMjUwNzc5NDU2Mzc4MTAiPiJBemlraG8gaXphY2hhemltYXp3aSBlemlraG9uYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNoZWNrX2Zvcl91cGRhdGVzX25vdyIgbXNnaWQ9IjY0MjA1Nzk4NjEyNzYyNDk4NiI+IlZ1c2VsZWxhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibGFzdF91cGRhdGUiIG1zZ2lkPSIzMTAxNTQ5NzE5ODI3NjAwMzQ2Ij4iSWdjaW5lIHVrdWx1bmdpc3dhOiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfdXBkYXRpbmciIG1zZ2lkPSI4MjAxODYyNzY3MDQxMzQ3MjAiPiJJaGxvbGEgaXppYnV5ZWtlem8uLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX2xvYWRpbmciIG1zZ2lkPSI4NjExMzM5MTQ5ODI1MDQ3NDQ2Ij4iS3V5YWxheWlzaGEuLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtYWluX2RpY3RfZGVzY3JpcHRpb24iIG1zZ2lkPSIxNjc5OTY0MzA2OTgwMDk4NTcwIj4iSXNpY2hhemltYXp3aSBzYWtobyBuZ3FhbmdpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsIiBtc2dpZD0iNTU4NjUzMTczNjYwOTE4MzMwNCI+IktoYW5zZWxhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5zdGFsbF9kaWN0IiBtc2dpZD0iNTUyNTAwNTUyNDY5NzYwNzg2NSI+IkZha2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWxfZG93bmxvYWRfZGljdCIgbXNnaWQ9IjcxNjMxNzM2NTAyOTg4MzgzNjciPiJLaGFuc2VsYSB1a3VsYXlpc2hhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWJsZV9kaWN0IiBtc2dpZD0iNzY4NTgxMDA0MDIzNjQ5NzcwMCI+IlllbnphIGt1bmdhc2ViZW56aSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVuYWJsZV9kaWN0IiBtc2dpZD0iMzg0ODE3OTc4NDcwMjQ3MzY4MCI+IlZ1bWVsYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlbGV0ZV9kaWN0IiBtc2dpZD0iNTgxNzE1OTI5MDUwMzg0Mzc2NiI+IlN1c2EiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQgKDQ5NjUyNjQ4NDkwNTc2NTY1MjEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg0MDI0MDEzNzY0OTM3ODUwMDYxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvX25vdF9kb3dubG9hZF9vdmVyX21ldGVyZWQgKDY5NjM3NzA4ODUwMzM3NjUzNzgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0NTYwNTc2Mzc5NjgwNjYwMDQ3Ij4iSXNpY2hhemFtYXp3aSBzZS08eGxpZmY6ZyBpZD0iTEFOR1VBR0UiPiUxJHM8L3hsaWZmOmc+IHNpeWF0aG9sYWthbGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24iIG1zZ2lkPSIzNTU1MTUzODEyODUzMTc4MzIiPiJDaW5kZXplbGEgdWt1emUgdWJ1eWVrZXplIGJlc2UgdWxhbmRhIjwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMvY29uZmlnLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy9jb25maWcueG1sCmluZGV4IGQyNDhhNjguLmE5MGJhODAgMTAwNjQ0Ci0tLSBhL2phdmEvcmVzL3ZhbHVlcy9jb25maWcueG1sCisrKyBiL2phdmEvcmVzL3ZhbHVlcy9jb25maWcueG1sCkBAIC0xMjMsNCArMTIzLDEzIEBACiAgICAgICAgICAgICA0ID0gPwogICAgIC0tPgogICAgIDxpbnRlZ2VyIG5hbWU9ImxvZ19zY3JlZW5fbWV0cmljcyI+MDwvaW50ZWdlcj4KKworICAgIDwhLS0gU2V0dGluZ3MgZm9yIHRoZSBkaWN0aW9uYXJ5IHBhY2sgLS0+CisgICAgPGJvb2wgbmFtZT0iYWxsb3dfb3Zlcl9tZXRlcmVkIj5mYWxzZTwvYm9vbD4KKyAgICA8Ym9vbCBuYW1lPSJhbGxvd19vdmVyX3JvYW1pbmciPmZhbHNlPC9ib29sPgorICAgIDxib29sIG5hbWU9ImRpY3RfZG93bmxvYWRzX3Zpc2libGVfaW5fZG93bmxvYWRfVUkiPmZhbHNlPC9ib29sPgorICAgIDxib29sIG5hbWU9Im1ldGFkYXRhX2Rvd25sb2Fkc192aXNpYmxlX2luX2Rvd25sb2FkX1VJIj5mYWxzZTwvYm9vbD4KKyAgICA8Ym9vbCBuYW1lPSJkaXNwbGF5X25vdGlmaWNhdGlvbl9mb3JfYXV0b191cGRhdGUiPmZhbHNlPC9ib29sPgorICAgIDxib29sIG5hbWU9ImRpc3BsYXlfbm90aWZpY2F0aW9uX2Zvcl91c2VyX3JlcXVlc3RlZF91cGRhdGUiPmZhbHNlPC9ib29sPgorCiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy9kb25vdHRyYW5zbGF0ZS54bWwgYi9qYXZhL3Jlcy92YWx1ZXMvZG9ub3R0cmFuc2xhdGUueG1sCmluZGV4IGVkZjYxNWEuLjFlNzBmYmIgMTAwNjQ0Ci0tLSBhL2phdmEvcmVzL3ZhbHVlcy9kb25vdHRyYW5zbGF0ZS54bWwKKysrIGIvamF2YS9yZXMvdmFsdWVzL2Rvbm90dHJhbnNsYXRlLnhtbApAQCAtMjEwLDggKzIxMCwxMiBAQAogICAgICAgICA8aXRlbT5xd2VydHk8L2l0ZW0+CiAgICAgPC9zdHJpbmctYXJyYXk+CiAKLSAgICA8IS0tIGRpY3Rpb25hcnkgcGFjayBwYWNrYWdlIG5hbWUgL3NldHRpbmdzIGFjdGl2aXR5IChmb3Igc2hhcmVkIHByZWZzIGFuZCBzZXR0aW5ncykgLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3BhY2tfcGFja2FnZV9uYW1lIj5jb20uZ29vZ2xlLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uZGljdGlvbmFyeXBhY2s8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfcGFja19zZXR0aW5nc19hY3Rpdml0eSI+Y29tLmdvb2dsZS5hbmRyb2lkLmlucHV0bWV0aG9kLmxhdGluLmRpY3Rpb25hcnlwYWNrLkRpY3Rpb25hcnlTZXR0aW5nc0FjdGl2aXR5PC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZXR0aW5nc193YXJuaW5nX3Jlc2VhcmNoZXJfbW9kZSI+QXR0ZW50aW9uISAgWW91IGFyZSB1c2luZyB0aGUgc3BlY2lhbCBrZXlib2FyZCBmb3IgcmVzZWFyY2ggcHVycG9zZXMuPC9zdHJpbmc+CisKKyAgICA8IS0tIGRpY3Rpb25hcnkgcGFjayBzZXR0aW5ncyAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfcGFja19zZXR0aW5nc19hY3Rpdml0eSI+Y29tLmFuZHJvaWQuaW5wdXRtZXRob2QuZGljdGlvbmFyeXBhY2suRGljdGlvbmFyeVNldHRpbmdzQWN0aXZpdHk8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImF1dGhvcml0eSI+Y29tLmFuZHJvaWQuaW5wdXRtZXRob2QuZGljdGlvbmFyeXBhY2suYW9zcDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF9tZXRhZGF0YV91cmkiPjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9jYWxfbWV0YWRhdGFfZmlsZW5hbWUiPm1ldGFkYXRhLmpzb248L3N0cmluZz4KKwogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9qYXZhL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKaW5kZXggZTg5MTc0Yi4uMjczNTI1MSAxMDA2NDQKLS0tIGEvamF2YS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCisrKyBiL2phdmEvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMzA4LDYgKzMwOCw4IEBACiAgICAgICAtIG9wZXJhdGlvbltDSEFSIExJTUlUPTEwMF0gLS0+CiAgICAgPCEtLSBUT0RPOiByZW1vdmUgdHJhbnNsYXRhYmxlPWZhbHNlIGF0dHJpYnV0ZSBvbmNlIHRleHQgaXMgc3RhYmxlIC0tPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZWFyY2hfZmVlZGJhY2tfZGVtb25zdHJhdGlvbl9pbnN0cnVjdGlvbnMiIHRyYW5zbGF0YWJsZT0iZmFsc2UiPlBsZWFzZSBkZW1vbnN0cmF0ZSB0aGUgaXNzdWUgeW91IGFyZSB3cml0aW5nIGFib3V0LlxuXG5XaGVuIGZpbmlzaGVkLCBzZWxlY3QgdGhlIFwiQnVnP1wiIGJ1dHRvbiBhZ2Fpbi4iPC9zdHJpbmc+CisgICAgPCEtLSBUaXRsZSBvZiBhIHByZWZlcmVuY2UgdG8gc2VuZCBmZWVkYmFjay4gW0NIQVIgTElNSVQ9MzBdLS0+CisgICAgPHN0cmluZyBuYW1lPSJzZW5kX2ZlZWRiYWNrIj5TZW5kIGZlZWRiYWNrPC9zdHJpbmc+CiAgICAgPCEtLSBUZW1wb3Jhcnkgbm90aWZpY2F0aW9uIG9mIHJlY29yZGluZyBmYWlsdXJlIFtDSEFSIExJTUlUPTEwMF0gLS0+CiAgICAgPCEtLSBUT0RPOiByZW1vdmUgdHJhbnNsYXRhYmxlPWZhbHNlIGF0dHJpYnV0ZSBvbmNlIHRleHQgaXMgc3RhYmxlIC0tPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZWFyY2hfZmVlZGJhY2tfcmVjb3JkaW5nX2ZhaWx1cmUiIHRyYW5zbGF0YWJsZT0iZmFsc2UiPlJlY29yZGluZyBjYW5jZWxsZWQgZHVlIHRvIHRpbWVvdXQ8L3N0cmluZz4KQEAgLTQ1OSw0ICs0NjEsNzggQEAKICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdF9pbnB1dF9tZXRob2QiPkNob29zZSBpbnB1dCBtZXRob2Q8L3N0cmluZz4KICAgICA8IS0tIE9wdGlvbiB0byBzaG93IHNldHVwIHdpemFyZCBpY29uLiBbQ0hBUiBMSU1JVD0zMF0tLT4KICAgICA8c3RyaW5nIG5hbWU9InNob3dfc2V0dXBfd2l6YXJkX2ljb24iIHRyYW5zbGF0YWJsZT0iZmFsc2UiPlNob3cgc2V0dXAgd2l6YXJkIGljb248L3N0cmluZz4KKworICAgIDwhLS0gVGhlIGRpY3Rpb25hcnkgcHJvdmlkZXIgYXBwbGljYXRpb24gbmFtZS4gVmlzaWJsZSBpbiBTZXR0aW5ncy9BcHBsaWNhdGlvbnMvTWFuYWdlIGFwcGxpY2F0aW9ucy4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJhcHBfbmFtZSI+RGljdGlvbmFyeSBQcm92aWRlcjwvc3RyaW5nPgorICAgIDwhLS0gVGhlIGRpY3Rpb25hcnkgcHJvdmlkZXIgQ29udGVudFByb3ZpZGVyIG5hbWUuIFZpc2libGUgaW4gU2V0dGluZ3MvQXBwbGljYXRpb25zL1J1bm5pbmcgc2VydmljZXMuIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9wcm92aWRlcl9uYW1lIj5EaWN0aW9uYXJ5IFByb3ZpZGVyPC9zdHJpbmc+CisgICAgPCEtLSBUaGUgZGljdGlvbmFyeSBwcm92aWRlciBTZXJ2aWNlIG5hbWUuIFZpc2libGUgaW4gU2V0dGluZ3MvQXBwbGljYXRpb25zL1J1bm5pbmcgc2VydmljZXMuIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXJ2aWNlX25hbWUiPkRpY3Rpb25hcnkgU2VydmljZTwvc3RyaW5nPgorCisgICAgPCEtLSBEb3dubG9hZGFibGUgZGljdGlvbmFyaWVzIHdpbGwgZ2V0IHVwZGF0ZSBpbmZvcm1hdGlvbiB0aHJvdWdoIHRoZSBuZXR3b3JrLiBUaGlzIGRlc2NyaWJlcyB0aGUgYXNzb2NpYXRlZCBkb3dubG9hZC4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiI+RGljdGlvbmFyeSB1cGRhdGUgaW5mb3JtYXRpb248L3N0cmluZz4KKworICAgIDwhLS0gVGl0bGUgYW5kIHN1bW1hcnkgb2YgdGhlIGRpY3Rpb25hcnkgc2V0dGluZ3Mgc2NyZWVuIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc190aXRsZSI+QWRkLW9uIGRpY3Rpb25hcmllczwvc3RyaW5nPgorICAgIDwhLS0gVGl0bGUgZm9yIHRoZSBwcm9tcHQgZGlhbG9nIHdoaWNoIGluZm9ybXMgdGhlIHVzZXIgdGhhdCBhIGRpY3Rpb25hcnkgaXMgYXZhaWxhYmxlIGZvciB0aGUgY3VycmVudCBsYW5ndWFnZSBhbmQgYXNrcyB0byBkZWNpZGUgd2hldGhlciB0byBkb3dubG9hZCBpdCBvdmVyIDNnIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsX292ZXJfbWV0ZXJlZF9uZXR3b3JrX3Byb21wdCI+RGljdGlvbmFyeSBhdmFpbGFibGU8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3Nfc3VtbWFyeSI+U2V0dGluZ3MgZm9yIGRpY3Rpb25hcmllczwvc3RyaW5nPgorICAgIDwhLS0gTmFtZSBvZiB0aGUgdXNlciBkaWN0aW9uYXJpZXMgc2V0dGluZ3MgY2F0ZWdvcnkgLS0+CisgICAgPHN0cmluZyBuYW1lPSJ1c2VyX2RpY3Rpb25hcmllcyI+VXNlciBkaWN0aW9uYXJpZXM8L3N0cmluZz4KKyAgICA8IS0tIE5hbWUgZm9yIHRoZSAidXNlciBkaWN0aW9uYXJ5IiBwcmVmZXJlbmNlIGl0ZW0gd2hlbiB0aGVyZSBpcyBvbmx5IG9uZSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfdXNlcl9kaWN0X3ByZWZfbmFtZSI+VXNlciBkaWN0aW9uYXJ5PC9zdHJpbmc+CisgICAgPCEtLSBNZXNzYWdlIGFib3V0IHNvbWUgZGljdGlvbmFyeSBpbmRpY2F0aW5nIGl0IGNhbiBiZSBkb3dubG9hZGVkLCBidXQgaGFzbid0IGJlZW4geWV0IC0tPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9hdmFpbGFibGUiPkRpY3Rpb25hcnkgYXZhaWxhYmxlPC9zdHJpbmc+CisgICAgPCEtLSBNZXNzYWdlIGFib3V0IHNvbWUgZGljdGlvbmFyeSBpbmRpY2F0aW5nIGl0IGlzIGRvd25sb2FkaW5nIGFuZCBzaG91bGQgYmUgYXZhaWxhYmxlIHNvb24gLS0+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rvd25sb2FkaW5nIj5DdXJyZW50bHkgZG93bmxvYWRpbmc8L3N0cmluZz4KKyAgICA8IS0tIE1lc3NhZ2UgYWJvdXQgc29tZSBkaWN0aW9uYXJ5IGluZGljYXRpbmcgaXQgaXMgYWxyZWFkeSBpbnN0YWxsZWQgLS0+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxlZCI+SW5zdGFsbGVkPC9zdHJpbmc+CisgICAgPCEtLSBNZXNzYWdlIGFib3V0IHNvbWUgZGljdGlvbmFyeSBpbmRpY2F0aW5nIHRoZSBmaWxlIGlzIGluc3RhbGxlZCwgYnV0IHRoZSBkaWN0aW9uYXJ5IGlzIGRpc2FibGVkIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kaXNhYmxlZCI+SW5zdGFsbGVkLCBkaXNhYmxlZDwvc3RyaW5nPgorCisgICAgPCEtLSBNZXNzYWdlIHRvIGRpc3BsYXkgaW4gdGhlIGRpY3Rpb25hcmllcyBzZXR0aW5nIHNjcmVlbiB3aGVuIHNvbWUgZXJyb3IgcHJldmVudGVkIHVzIHRvIGxpc3QgaW5zdGFsbGVkIGRpY3Rpb25hcmllcyBbQ0hBUiBMSU1JVD0yMF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJjYW5ub3RfY29ubmVjdF90b19kaWN0X3NlcnZpY2UiPlByb2JsZW0gY29ubmVjdGluZyB0byBkaWN0aW9uYXJ5IHNlcnZpY2U8L3N0cmluZz4KKyAgICA8IS0tIE1lc3NhZ2UgdG8gZGlzcGxheSBpbiB0aGUgZGljdGlvbmFyaWVzIHNldHRpbmcgc2NyZWVuIHdoZW4gd2UgZm91bmQgdGhhdCBubyBkaWN0aW9uYXJpZXMgYXJlIGF2YWlsYWJsZSBbQ0hBUiBMSU1JVD0yMF0tLT4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2RpY3Rpb25hcmllc19hdmFpbGFibGUiPk5vIGRpY3Rpb25hcmllcyBhdmFpbGFibGU8L3N0cmluZz4KKworICAgIDwhLS0gVGl0bGUgb2YgdGhlIG9wdGlvbnMgdG8gcHJlc3MgdG8gcmVmcmVzaCB0aGUgbGlzdCAoYXMgaW4sIGNoZWNrIGZvciB1cGRhdGVzIG5vdykgW0NIQVJfTElNSVQ9NTBdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iY2hlY2tfZm9yX3VwZGF0ZXNfbm93Ij5SZWZyZXNoPC9zdHJpbmc+CisgICAgPCEtLSBIaW50IHRvIHRlbGwgd2hlbiB0aGUgZGF0YSB3YXMgbGFzdCB1cGRhdGVkLiBVc2FnZSA6ICJMYXN0IHVwZGF0ZWQgW2RhdGVdIiwgbWF5IGNvbnRhaW4gYSA6IG9yIHNvLiBbQ0hBUiBMSU1JVD00NV0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJsYXN0X3VwZGF0ZSI+TGFzdCB1cGRhdGVkPC9zdHJpbmc+CisKKyAgICA8IS0tIE1lc3NhZ2UgdG8gZGlzcGxheSBpbiBhIGRpYWxvZyBib3ggd2hpbGUgd2UgYXJlIGFjdGl2ZWx5IHVwZGF0aW5nIHRoZSB3b3JkIGxpc3QgW0NIQVIgTElNSVQ9NjBdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV91cGRhdGluZyI+Q2hlY2tpbmcgZm9yIHVwZGF0ZXM8L3N0cmluZz4KKyAgICA8IS0tIE1lc3NhZ2UgdG8gZGlzcGxheSB3aGlsZSB0aGUgYWRkLW9uIGRpY3Rpb25hcnkgbGlzdCBpcyB1cGRhdGluZyBbbm8gc3BhY2UgY29uc3RyYWludHMgb24gdGhpcywgdGhlcmUgaXMgcGxlbnR5IG9mIHNwYWNlIGJ1dCBzaG9ydGVyIGlzIGJldHRlciBiZWNhdXNlIGl0J3Mgb25seSBvbiB0aGUgc2NyZWVuIGZvciBhIHNlY29uZF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX2xvYWRpbmciPkxvYWRpbmcuLi48L3N0cmluZz4KKworICAgIDwhLS0gU3RyaW5nIHRvIGV4cGxhaW4gdGhpcyBkaWN0aW9uYXJ5IGlzIHRoZSBtYWluIGRpY3Rpb25hcnkgZm9yIHRoaXMgbGFuZ3VhZ2UgW0NIQVJfTElNSVQ9MzBdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ibWFpbl9kaWN0X2Rlc2NyaXB0aW9uIj5NYWluIGRpY3Rpb25hcnk8L3N0cmluZz4KKworICAgIDwhLS0gU3RhbmRhcmQgbWVzc2FnZSB0byBkaXNtaXNzIGEgZGlhbG9nIGJveCAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbCI+Q2FuY2VsPC9zdHJpbmc+CisKKyAgICA8IS0tIEFjdGlvbiB0byBkb3dubG9hZCBhbmQgaW5zdGFsbCBhIGRpY3Rpb25hcnkgW0NIQVJfTElNSVQ9MTVdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iaW5zdGFsbF9kaWN0Ij5JbnN0YWxsPC9zdHJpbmc+CisgICAgPCEtLSBBY3Rpb24gdG8gY2FuY2VsIHRoZSBvbmdvaW5nIGRvd25sb2FkIG9mIGEgZGljdGlvbmFyeSBmaWxlIFtDSEFSX0xJTUlUPTI1XSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbF9kb3dubG9hZF9kaWN0Ij5DYW5jZWw8L3N0cmluZz4KKyAgICA8IS0tIEFjdGlvbiB0byBkZWxldGUgYSBkaWN0aW9uYXJ5IGZpbGUgW0NIQVJfTElNSVQ9MTVdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iZGVsZXRlX2RpY3QiPkRlbGV0ZTwvc3RyaW5nPgorCisgICAgPCEtLSBNZXNzYWdlIGluIHRoZSBwb3B1cCBpbmZvcm1pbmcgdGhlIHVzZXIgYSBkaWN0aW9uYXJ5IGlzIGF2YWlsYWJsZSBmb3IgdGhlaXIgbGFuZ3VhZ2UsIGFuZCBhc2tpbmcgZm9yIGEgZGVjaXNpb24gdG8gZG93bmxvYWQgb3ZlciB0aGVpciBtb2JpbGUgZGF0YSBwbGFuIG9yIG5vdC4gVGhlIHJlYXNvbiB3ZSBhc2sgZm9yIHRoaXMgaXMsIHRoZSBkYXRhIGlzIGxhcmdlIGFuZCBtYXkgYmUgZG93bmxvYWRlZCBvdmVyIGEgcGFpZC1wZXItbWVnYWJ5dGUgY29ubmVjdGlvbiBidXQgYSBkaWN0aW9uYXJ5IGlzIGFsc28gZXNzZW50aWFsIHRvIHR5cGUgY29tZm9ydGFibHksIHNvIHdlIGFzayB0aGUgdXNlci4gVGhpcyBvbmx5IHBvcHMgaW4gc2VsZWN0ZWQgY2FzZXMsIHdoZW4gdGhlcmUgaXMgbm8gZGljdGlvbmFyeSBhdCBhbGwgY3VycmVudGx5LCBhbmQgdGhlIG9ubHkgYXZhaWxhYmxlIG5ldHdvcmsgc2VlbXMgdG8gYmUgbWV0ZXJlZC4gVGhlICJMYW5ndWFnZSAmIGlucHV0IiBwYXJ0IHNob3VsZCBiZSBzZXQgdG8gdGhlIGFjdHVhbCBuYW1lIG9mIHRoZSBvcHRpb24gKG1lc3NhZ2UgSUQgNTI5MjcxNjc0NzI2NDQ0MjM1OSBpbiB0aGUgdHJhbnNsYXRpb24gY29uc29sZSkuIFtDSEFSX0xJTUlUPTcwMF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJzaG91bGRfZG93bmxvYWRfb3Zlcl9tZXRlcmVkX3Byb21wdCI+VGhlIHNlbGVjdGVkIGxhbmd1YWdlIG9uIHlvdXIgbW9iaWxlIGRldmljZSBoYXMgYW4gYXZhaWxhYmxlIGRpY3Rpb25hcnkuJmx0O2JyLz4KK1dlIHJlY29tbWVuZCAmbHQ7Yj5kb3dubG9hZGluZyZsdDsvYj4gdGhlIDx4bGlmZjpnIGlkPSJsYW5ndWFnZSIgZXhhbXBsZT0iRW5nbGlzaCI+JTEkczwveGxpZmY6Zz4gZGljdGlvbmFyeSB0byBpbXByb3ZlIHlvdXIgdHlwaW5nIGV4cGVyaWVuY2UuJmx0O2JyLz4KKyZsdDtici8+CitUaGUgZG93bmxvYWQgY291bGQgdGFrZSBhIG1pbnV0ZSBvciB0d28gb3ZlciAzRy4gQ2hhcmdlcyBtYXkgYXBwbHkgaWYgeW91IGRvblwndCBoYXZlIGFuICZsdDtiPnVubGltaXRlZCBkYXRhIHBsYW4mbHQ7L2I+LiZsdDtici8+CitJZiB5b3UgYXJlIG5vdCBzdXJlIHdoaWNoIGRhdGEgcGxhbiB5b3UgaGF2ZSwgd2UgcmVjb21tZW5kIGZpbmRpbmcgYSBXaS1GaSBjb25uZWN0aW9uIHRvIHN0YXJ0IHRoZSBkb3dubG9hZCBhdXRvbWF0aWNhbGx5LiZsdDtici8+CismbHQ7YnIvPgorVGlwOiBZb3UgY2FuIGRvd25sb2FkIGFuZCByZW1vdmUgZGljdGlvbmFyaWVzIGJ5IGdvaW5nIHRvICZsdDtiPkxhbmd1YWdlICZhbXA7IGlucHV0Jmx0Oy9iPiBpbiB0aGUgJmx0O2I+U2V0dGluZ3MmbHQ7L2I+IG1lbnUgb2YgeW91ciBtb2JpbGUgZGV2aWNlLjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfb3Zlcl9tZXRlcmVkIj5Eb3dubG9hZCBub3cgKDx4bGlmZjpnIGlkPSJzaXplX2luX21lZ2FieXRlcyIgZXhhbXBsZT0iMC43Ij4lMSQuMWY8L3hsaWZmOmc+TUIpPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb19ub3RfZG93bmxvYWRfb3Zlcl9tZXRlcmVkIj5Eb3dubG9hZCBvdmVyIFdpLUZpPC9zdHJpbmc+CisgICAgPCEtLSBUaGUgdGV4dCBvZiB0aGUgImRpY3Rpb25hcnkgYXZhaWxhYmxlIiBub3RpZmljYXRpb24uIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIj5BIGRpY3Rpb25hcnkgaXMgYXZhaWxhYmxlIGZvciA8eGxpZmY6ZyBpZD0ibGFuZ3VhZ2UiIGV4YW1wbGU9IkVuZ2xpc2giPiUxJHM8L3hsaWZmOmc+PC9zdHJpbmc+CisgICAgPCEtLSBUaGUgc21hbGwgc3VidGV4dCBpbiB0aGUgImRpY3Rpb25hcnkgYXZhaWxhYmxlIiBub3RpZmljYXRpb24uIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX2Rlc2NyaXB0aW9uIj5QcmVzcyB0byByZXZpZXcgYW5kIGRvd25sb2FkPC9zdHJpbmc+CisKKyAgICA8IS0tIFRoZSB0ZXh0IG9mIHRoZSB0b2FzdCB3YXJuaW5nIGEgZG93bmxvYWQgaXMgc3RhcnRpbmcgYXV0b21hdGljYWxseSB0byBlbmFibGUgc3VnZ2VzdGlvbnMgZm9yIHRoZSBzZWxlY3RlZCBsYW5ndWFnZSBbQ0hBUiBMSU1JVD0xMDBdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0idG9hc3RfZG93bmxvYWRpbmdfc3VnZ2VzdGlvbnMiPkRvd25sb2FkaW5nOiBzdWdnZXN0aW9ucyBmb3IgPHhsaWZmOmcgaWQ9Imxhbmd1YWdlIiBleGFtcGxlPSJFbmdsaXNoIj4lMSRzPC94bGlmZjpnPiB3aWxsIGJlIHJlYWR5IHNvb24uPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3htbC9kaWN0aW9uYXJ5X3NldHRpbmdzLnhtbCBiL2phdmEvcmVzL3htbC9kaWN0aW9uYXJ5X3NldHRpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODRkZmU1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9yZXMveG1sL2RpY3Rpb25hcnlfc2V0dGluZ3MueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKioKKyoqIENvcHlyaWdodCAyMDExLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxQcmVmZXJlbmNlU2NyZWVuCisgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL2RpY3Rpb25hcnlfc2V0dGluZ3NfdGl0bGUiCisgICBhbmRyb2lkOnN1bW1hcnk9IkBzdHJpbmcvZGljdGlvbmFyeV9zZXR0aW5nc19zdW1tYXJ5Ij4KKworPC9QcmVmZXJlbmNlU2NyZWVuPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMveG1sL3ByZWZzLnhtbCBiL2phdmEvcmVzL3htbC9wcmVmcy54bWwKaW5kZXggZTVmZWY4OC4uZTI5OWNlNCAxMDA2NDQKLS0tIGEvamF2YS9yZXMveG1sL3ByZWZzLnhtbAorKysgYi9qYXZhL3Jlcy94bWwvcHJlZnMueG1sCkBAIC01OSw3ICs1OSw2IEBACiAgICAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL2NvbmZpZ3VyZV9kaWN0aW9uYXJpZXNfdGl0bGUiPgogICAgICAgICAgICA8aW50ZW50CiAgICAgICAgICAgICAgIGFuZHJvaWQ6YWN0aW9uPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIKLSAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJAc3RyaW5nL2RpY3Rpb25hcnlfcGFja19wYWNrYWdlX25hbWUiCiAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0Q2xhc3M9IkBzdHJpbmcvZGljdGlvbmFyeV9wYWNrX3NldHRpbmdzX2FjdGl2aXR5Ij4KICAgICAgICAgICAgICA8ZXh0cmEKICAgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJjbGllbnRJZCIKQEAgLTE3OCw2ICsxNzcsOSBAQAogICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvc2hvd19zZXR1cF93aXphcmRfaWNvbiIgLz4KICAgICAgICAgPC9QcmVmZXJlbmNlU2NyZWVuPgogICAgICAgICA8UHJlZmVyZW5jZVNjcmVlbgorICAgICAgICAgICAgYW5kcm9pZDprZXk9InNlbmRfZmVlZGJhY2siCisgICAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL3NlbmRfZmVlZGJhY2siIC8+CisgICAgICAgIDxQcmVmZXJlbmNlU2NyZWVuCiAgICAgICAgICAgICBhbmRyb2lkOmtleT0iZGVidWdfc2V0dGluZ3MiCiAgICAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJEZWJ1ZyBzZXR0aW5ncyIKICAgICAgICAgICAgIGFuZHJvaWQ6cGVyc2lzdGVudD0idHJ1ZSIKZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2NvbXBhdC9Db25uZWN0aXZpdHlNYW5hZ2VyQ29tcGF0VXRpbHMuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2NvbXBhdC9Db25uZWN0aXZpdHlNYW5hZ2VyQ29tcGF0VXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTYxZjdhCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvY29tcGF0L0Nvbm5lY3Rpdml0eU1hbmFnZXJDb21wYXRVdGlscy5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmNvbXBhdDsKKworaW1wb3J0IGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eU1hbmFnZXI7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBDb25uZWN0aXZpdHlNYW5hZ2VyQ29tcGF0VXRpbHMgeworICAgIC8vIENvbm5lY3Rpdml0eU1hbmFnZXIjaXNBY3RpdmVOZXR3b3JrTWV0ZXJlZCgpIGhhcyBiZWVuIGludHJvZHVjZWQKKyAgICAvLyBpbiBBUEkgbGV2ZWwgMTYgKEJ1aWxkLlZFUlNJT05fQ09ERVMuSkVMTFlfQkVBTikuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWV0aG9kIE1FVEhPRF9pc0FjdGl2ZU5ldHdvcmtNZXRlcmVkID0gQ29tcGF0VXRpbHMuZ2V0TWV0aG9kKAorICAgICAgICAgICAgQ29ubmVjdGl2aXR5TWFuYWdlci5jbGFzcywgImlzQWN0aXZlTmV0d29ya01ldGVyZWQiKTsKKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FjdGl2ZU5ldHdvcmtNZXRlcmVkKGZpbmFsIENvbm5lY3Rpdml0eU1hbmFnZXIgbWFuYWdlcikgeworICAgICAgICByZXR1cm4gKEJvb2xlYW4pQ29tcGF0VXRpbHMuaW52b2tlKG1hbmFnZXIsCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIEFQSSB0ZWxsaW5nIHdoZXRoZXIgdGhlIG5ldHdvcmsgaXMgbWV0ZXJlZCBvciBub3QgaXMgbm90IGF2YWlsYWJsZSwKKyAgICAgICAgICAgICAgICAvLyB0aGVuIHRoZSBjbG9zZXN0IHRoaW5nIGlzICJpZiBpdCdzIGEgbW9iaWxlIGNvbm5lY3Rpb24iLgorICAgICAgICAgICAgICAgIG1hbmFnZXIuZ2V0QWN0aXZlTmV0d29ya0luZm8oKS5nZXRUeXBlKCkgPT0gQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX01PQklMRSwKKyAgICAgICAgICAgICAgICBNRVRIT0RfaXNBY3RpdmVOZXR3b3JrTWV0ZXJlZCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvY29tcGF0L0Rvd25sb2FkTWFuYWdlckNvbXBhdFV0aWxzLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9jb21wYXQvRG93bmxvYWRNYW5hZ2VyQ29tcGF0VXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGI5YzVkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvY29tcGF0L0Rvd25sb2FkTWFuYWdlckNvbXBhdFV0aWxzLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuY29tcGF0OworCitpbXBvcnQgYW5kcm9pZC5hcHAuRG93bmxvYWRNYW5hZ2VyOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworCitwdWJsaWMgZmluYWwgY2xhc3MgRG93bmxvYWRNYW5hZ2VyQ29tcGF0VXRpbHMgeworICAgIC8vIERvd25sb2FkTWFuYWdlci5SZXF1ZXN0I3NldEFsbG93ZWRPdmVyTWV0ZXJlZCgpIGhhcyBiZWVuIGludHJvZHVjZWQKKyAgICAvLyBpbiBBUEkgbGV2ZWwgMTYgKEJ1aWxkLlZFUlNJT05fQ09ERVMuSkVMTFlfQkVBTikuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWV0aG9kIE1FVEhPRF9zZXRBbGxvd2VkT3Zlck1ldGVyZWQgPSBDb21wYXRVdGlscy5nZXRNZXRob2QoCisgICAgICAgICAgICBEb3dubG9hZE1hbmFnZXIuUmVxdWVzdC5jbGFzcywgInNldEFsbG93ZWRPdmVyTWV0ZXJlZCIsIEJvb2xlYW4uVFlQRSk7CisKKyAgICBwdWJsaWMgc3RhdGljIERvd25sb2FkTWFuYWdlci5SZXF1ZXN0IHNldEFsbG93ZWRPdmVyTWV0ZXJlZCgKKyAgICAgICAgICAgIGZpbmFsIERvd25sb2FkTWFuYWdlci5SZXF1ZXN0IHJlcXVlc3QsIGZpbmFsIGJvb2xlYW4gYWxsb3dPdmVyTWV0ZXJlZCkgeworICAgICAgICByZXR1cm4gKERvd25sb2FkTWFuYWdlci5SZXF1ZXN0KUNvbXBhdFV0aWxzLmludm9rZShyZXF1ZXN0LAorICAgICAgICAgICAgICAgIHJlcXVlc3QgLyogZGVmYXVsdCByZXR1cm4gdmFsdWUgKi8sIE1FVEhPRF9zZXRBbGxvd2VkT3Zlck1ldGVyZWQsIGFsbG93T3Zlck1ldGVyZWQpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBoYXNTZXRBbGxvd2VkT3Zlck1ldGVyZWQoKSB7CisgICAgICAgIHJldHVybiBudWxsICE9IE1FVEhPRF9zZXRBbGxvd2VkT3Zlck1ldGVyZWQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svQWN0aW9uQmF0Y2guamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL0FjdGlvbkJhdGNoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY0YTUyZgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL0FjdGlvbkJhdGNoLmphdmEKQEAgLTAsMCArMSw2NDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAqIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5kaWN0aW9uYXJ5cGFjazsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkRvd25sb2FkTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5Eb3dubG9hZE1hbmFnZXIuUmVxdWVzdDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuY29tcGF0LkRvd25sb2FkTWFuYWdlckNvbXBhdFV0aWxzOworaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmxhdGluLlI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuUXVldWU7CisKKy8qKgorICogT2JqZWN0IHJlcHJlc2VudGluZyBhbiB1cGdyYWRlIGZyb20gb25lIHN0YXRlIHRvIGFub3RoZXIuCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBiYXNpY2FsbHkgZW5jYXBzdWxhdGVzIGEgbGlzdCBvZiBSdW5uYWJsZSBvYmplY3RzLiBJbiB0aGUgZnV0dXJlCisgKiBpdCBtYXkgbWFuYWdlIGRlcGVuZGVuY2llcyBiZXR3ZWVuIHRoZW0uIENvbmNyZXRlbHksIGl0IGRvZXMgbm90IHVzZSBSdW5uYWJsZSBiZWNhdXNlIHRoZQorICogYWN0aW9ucyBuZWVkIGFuIGFyZ3VtZW50LgorICovCisvKgorCitUaGUgc3RhdGUgb2YgYSB3b3JkIGxpc3QgZm9sbG93cyB0aGUgZm9sbG93aW5nIHNjaGVtZS4KKworICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKyAgTWFrZUF2YWlsYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgfCAgICAgICAgLi0tLS0tLS0tLS0tLUZvcmdldC0tLS0tLS0tJworICAgICAgIFYgICAgICAgIHwKKyBTVEFUVVNfQVZBSUxBQkxFICA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KKyAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK1N0YXJ0RG93bmxvYWRBY3Rpb24gICAgICAgICAgICAgICAgICBGaW5pc2hEZWxldGVBY3Rpb24KKyAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICBWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK1NUQVRVU19ET1dOTE9BRElORyAgICAgIEVuYWJsZUFjdGlvbi0tIFNUQVRVU19ERUxFVElORworICAgICAgIHwgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgXgorSW5zdGFsbEFmdGVyRG93bmxvYWRBY3Rpb24gICB8ICAgICAgICAgICAgICAgfAorICAgICAgIHwgICAgIC4tLS0tLS0tLS0tLS0tLS0nICAgICAgICBTdGFydERlbGV0ZUFjdGlvbgorICAgICAgIHwgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgIFYgICAgIFYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIFNUQVRVU19JTlNUQUxMRUQgIDwtLUVuYWJsZUFjdGlvbi0tICAgU1RBVFVTX0RJU0FCTEVECisgICAgICAgICAgICAgICAgICAgIC0tRGlzYWJsZUFjdGlvbi0tPgorCisgIEl0IG1heSBhbHNvIGJlIHBvc3NpYmxlIHRoYXQgRGlzYWJsZUFjdGlvbiBvciBTdGFydERlbGV0ZUFjdGlvbiBvcgorICBEb3dubG9hZEFjdGlvbiBydW4gd2hlbiB0aGUgZmlsZSBpcyBzdGlsbCBkb3dubG9hZGluZy4gIFRoaXMgY2FuY2VscworICB0aGUgZG93bmxvYWQgYW5kIHJldHVybnMgdG8gU1RBVFVTX0FWQUlMQUJMRS4KKyAgQWxzbywgYW4gVXBkYXRlRGF0YUFjdGlvbiBtYXkgYXBwbHkgaW4gYW55IHN0YXRlLiBJdCBkb2VzIG5vdCBhZmZlY3QKKyAgdGhlIHN0YXRlIGluIGFueSB3YXkgKG5vciB0eXBlLCBsb2NhbCBmaWxlbmFtZSwgaWQgb3IgdmVyc2lvbikgYnV0CisgIG1heSB1cGRhdGUgb3RoZXIgYXR0cmlidXRlcyBsaWtlIGRlc2NyaXB0aW9uIG9yIHJlbW90ZSBmaWxlbmFtZS4KKworICBGb3JnZXQgaXMgYW4gREIgbWFpbnRlbmFuY2UgYWN0aW9uIHRoYXQgcmVtb3ZlcyB0aGUgZW50cnkgaWYgaXQgaXMgbm90IGluc3RhbGxlZCBvciBkaXNhYmxlZC4KKyAgVGhpcyBoYXBwZW5zIHdoZW4gdGhlIHdvcmQgbGlzdCBpbmZvcm1hdGlvbiBkaXNhcHBlYXJlZCBmcm9tIHRoZSBzZXJ2ZXIsIG9yIHdoZW4gYSBuZXcgdmVyc2lvbgorICBpcyBhdmFpbGFibGUgYW5kIHdlIHNob3VsZCBmb3JnZXQgYWJvdXQgdGhlIG9sZCBvbmUuCisqLworcHVibGljIGZpbmFsIGNsYXNzIEFjdGlvbkJhdGNoIHsKKyAgICAvKioKKyAgICAgKiBBIHBpZWNlIG9mIHVwZGF0ZS4KKyAgICAgKgorICAgICAqIEFjdGlvbiBpcyBiYXNpY2FsbHkgbGlrZSBhIFJ1bm5hYmxlIHRoYXQgdGFrZXMgYW4gYXJndW1lbnQuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBBY3Rpb24geworICAgICAgICAvKioKKyAgICAgICAgICogRXhlY3V0ZSB0aGlzIGFjdGlvbiBOT1cuCisgICAgICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0IHRvIGdldCBzeXN0ZW0gc2VydmljZXMsIHJlc291cmNlcywgZGF0YWJhc2VzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKGZpbmFsIENvbnRleHQgY29udGV4dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQW4gYWN0aW9uIHRoYXQgc3RhcnRzIGRvd25sb2FkaW5nIGFuIGF2YWlsYWJsZSB3b3JkIGxpc3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBTdGFydERvd25sb2FkQWN0aW9uIGltcGxlbWVudHMgQWN0aW9uIHsKKyAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRGljdGlvbmFyeVByb3ZpZGVyOiIgKyBTdGFydERvd25sb2FkQWN0aW9uLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQ2xpZW50SWQ7CisgICAgICAgIC8vIFRoZSBkYXRhIHRvIGRvd25sb2FkLiBNYXkgbm90IGJlIG51bGwuCisgICAgICAgIGZpbmFsIFdvcmRMaXN0TWV0YWRhdGEgbVdvcmRMaXN0OworICAgICAgICBmaW5hbCBib29sZWFuIG1Gb3JjZVN0YXJ0Tm93OworICAgICAgICBwdWJsaWMgU3RhcnREb3dubG9hZEFjdGlvbihmaW5hbCBTdHJpbmcgY2xpZW50SWQsCisgICAgICAgICAgICAgICAgZmluYWwgV29yZExpc3RNZXRhZGF0YSB3b3JkTGlzdCwgZmluYWwgYm9vbGVhbiBmb3JjZVN0YXJ0Tm93KSB7CisgICAgICAgICAgICBVdGlscy5sKCJOZXcgZG93bmxvYWQgYWN0aW9uIGZvciBjbGllbnQgIiwgY2xpZW50SWQsICIgOiAiLCB3b3JkTGlzdCk7CisgICAgICAgICAgICBtQ2xpZW50SWQgPSBjbGllbnRJZDsKKyAgICAgICAgICAgIG1Xb3JkTGlzdCA9IHdvcmRMaXN0OworICAgICAgICAgICAgbUZvcmNlU3RhcnROb3cgPSBmb3JjZVN0YXJ0Tm93OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoZmluYWwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBpZiAobnVsbCA9PSBtV29yZExpc3QpIHsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuCisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiVXBkYXRlQWN0aW9uIHdpdGggYSBudWxsIHBhcmFtZXRlciEiKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBVdGlscy5sKCJEb3dubG9hZGluZyB3b3JkIGxpc3QiKTsKKyAgICAgICAgICAgIGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiID0gTWV0YWRhdGFEYkhlbHBlci5nZXREYihjb250ZXh0LCBtQ2xpZW50SWQpOworICAgICAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBNZXRhZGF0YURiSGVscGVyLmdldENvbnRlbnRWYWx1ZXNCeVdvcmRMaXN0SWQoZGIsCisgICAgICAgICAgICAgICAgICAgIG1Xb3JkTGlzdC5tSWQsIG1Xb3JkTGlzdC5tVmVyc2lvbik7CisgICAgICAgICAgICBmaW5hbCBpbnQgc3RhdHVzID0gdmFsdWVzLmdldEFzSW50ZWdlcihNZXRhZGF0YURiSGVscGVyLlNUQVRVU19DT0xVTU4pOworICAgICAgICAgICAgZmluYWwgRG93bmxvYWRNYW5hZ2VyIG1hbmFnZXIgPQorICAgICAgICAgICAgICAgICAgICAoRG93bmxvYWRNYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5ET1dOTE9BRF9TRVJWSUNFKTsKKyAgICAgICAgICAgIGlmIChNZXRhZGF0YURiSGVscGVyLlNUQVRVU19ET1dOTE9BRElORyA9PSBzdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgd29yZCBsaXN0IGlzIHN0aWxsIGRvd25sb2FkaW5nLiBDYW5jZWwgdGhlIGRvd25sb2FkIGFuZCByZXZlcnQgdGhlCisgICAgICAgICAgICAgICAgLy8gd29yZCBsaXN0IHN0YXR1cyB0byAiYXZhaWxhYmxlIi4KKyAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBtYW5hZ2VyKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIERvd25sb2FkTWFuYWdlciBpcyBkaXNhYmxlZCAob3Igbm90IGluc3RhbGxlZD8pLiBXZSBjYW4ndCBjYW5jZWwgLSB0aGVyZQorICAgICAgICAgICAgICAgICAgICAvLyBpcyBub3RoaW5nIHdlIGNhbiBkby4gV2Ugc3RpbGwgbmVlZCB0byBtYXJrIHRoZSBlbnRyeSBhcyBhdmFpbGFibGUuCisgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIucmVtb3ZlKHZhbHVlcy5nZXRBc0xvbmcoTWV0YWRhdGFEYkhlbHBlci5QRU5ESU5HSURfQ09MVU1OKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIE1ldGFkYXRhRGJIZWxwZXIubWFya0VudHJ5QXNBdmFpbGFibGUoZGIsIG1Xb3JkTGlzdC5tSWQsIG1Xb3JkTGlzdC5tVmVyc2lvbik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0FWQUlMQUJMRSAhPSBzdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuCisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5leHBlY3RlZCBzdGF0ZSBvZiB0aGUgd29yZCBsaXN0ICciICsgbVdvcmRMaXN0Lm1JZCArICInIDogIiArIHN0YXR1cworICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGZvciBhbiB1cGdyYWRlIGFjdGlvbi4gRmFsbCBiYWNrIHRvIGRvd25sb2FkLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRG93bmxvYWQgaXQuCisgICAgICAgICAgICBVdGlscy5sKCJVcGdyYWRlIHdvcmQgbGlzdCwgZG93bmxvYWRpbmciLCBtV29yZExpc3QubVJlbW90ZUZpbGVuYW1lKTsKKworICAgICAgICAgICAgLy8gVE9ETzogaWYgRG93bmxvYWRNYW5hZ2VyIGlzIGRpc2FibGVkIG9yIG5vdCBpbnN0YWxsZWQsIGRvd25sb2FkIGJ5IG91cnNlbHZlcworICAgICAgICAgICAgaWYgKG51bGwgPT0gbWFuYWdlcikgcmV0dXJuOworCisgICAgICAgICAgICAvLyBUaGlzIGlzIGFuIHVwZ3JhZGVkIHdvcmQgbGlzdDogd2Ugc2hvdWxkIGRvd25sb2FkIGl0LgorICAgICAgICAgICAgZmluYWwgVXJpIHVyaSA9IFVyaS5wYXJzZShtV29yZExpc3QubVJlbW90ZUZpbGVuYW1lKTsKKyAgICAgICAgICAgIGZpbmFsIFJlcXVlc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHVyaSk7CisKKyAgICAgICAgICAgIGZpbmFsIFJlc291cmNlcyByZXMgPSBjb250ZXh0LmdldFJlc291cmNlcygpOworICAgICAgICAgICAgaWYgKCFtRm9yY2VTdGFydE5vdykgeworICAgICAgICAgICAgICAgIGlmIChEb3dubG9hZE1hbmFnZXJDb21wYXRVdGlscy5oYXNTZXRBbGxvd2VkT3Zlck1ldGVyZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGFsbG93T3Zlck1ldGVyZWQ7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoVXBkYXRlSGFuZGxlci5nZXREb3dubG9hZE92ZXJNZXRlcmVkU2V0dGluZyhjb250ZXh0KSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFVwZGF0ZUhhbmRsZXIuRE9XTkxPQURfT1ZFUl9NRVRFUkVEX0RJU0FMTE9XRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2VyIHNhaWQgbm86IGRvbid0IGFsbG93LgorICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dPdmVyTWV0ZXJlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVXBkYXRlSGFuZGxlci5ET1dOTE9BRF9PVkVSX01FVEVSRURfQUxMT1dFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZXIgc2FpZCB5ZXM6IGFsbG93LgorICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dPdmVyTWV0ZXJlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogLy8gVXBkYXRlSGFuZGxlci5ET1dOTE9BRF9PVkVSX01FVEVSRURfU0VUVElOR19VTktOT1dOCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBrbm93OiB1c2UgdGhlIGRlZmF1bHQgdmFsdWUgZnJvbSBjb25maWd1cmF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dPdmVyTWV0ZXJlZCA9IHJlcy5nZXRCb29sZWFuKFIuYm9vbC5hbGxvd19vdmVyX21ldGVyZWQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIERvd25sb2FkTWFuYWdlckNvbXBhdFV0aWxzLnNldEFsbG93ZWRPdmVyTWV0ZXJlZChyZXF1ZXN0LCBhbGxvd092ZXJNZXRlcmVkKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnNldEFsbG93ZWROZXR3b3JrVHlwZXMoUmVxdWVzdC5ORVRXT1JLX1dJRkkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXF1ZXN0LnNldEFsbG93ZWRPdmVyUm9hbWluZyhyZXMuZ2V0Qm9vbGVhbihSLmJvb2wuYWxsb3dfb3Zlcl9yb2FtaW5nKSk7CisgICAgICAgICAgICB9IC8vIGlmIG1Gb3JjZVN0YXJ0Tm93LCB0aGVuIGFsbG93IGFsbCBuZXR3b3JrIHR5cGVzIGFuZCByb2FtaW5nLCB3aGljaCBpcyB0aGUgZGVmYXVsdC4KKyAgICAgICAgICAgIHJlcXVlc3Quc2V0VGl0bGUobVdvcmRMaXN0Lm1EZXNjcmlwdGlvbik7CisgICAgICAgICAgICByZXF1ZXN0LnNldE5vdGlmaWNhdGlvblZpc2liaWxpdHkoCisgICAgICAgICAgICAgICAgICAgIHJlcy5nZXRCb29sZWFuKFIuYm9vbC5kaXNwbGF5X25vdGlmaWNhdGlvbl9mb3JfYXV0b191cGRhdGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBSZXF1ZXN0LlZJU0lCSUxJVFlfVklTSUJMRSA6IFJlcXVlc3QuVklTSUJJTElUWV9ISURERU4pOworICAgICAgICAgICAgcmVxdWVzdC5zZXRWaXNpYmxlSW5Eb3dubG9hZHNVaSgKKyAgICAgICAgICAgICAgICAgICAgcmVzLmdldEJvb2xlYW4oUi5ib29sLmRpY3RfZG93bmxvYWRzX3Zpc2libGVfaW5fZG93bmxvYWRfVUkpKTsKKworICAgICAgICAgICAgZmluYWwgbG9uZyBkb3dubG9hZElkID0gVXBkYXRlSGFuZGxlci5yZWdpc3RlckRvd25sb2FkUmVxdWVzdChtYW5hZ2VyLCByZXF1ZXN0LCBkYiwKKyAgICAgICAgICAgICAgICAgICAgbVdvcmRMaXN0Lm1JZCwgbVdvcmRMaXN0Lm1WZXJzaW9uKTsKKyAgICAgICAgICAgIFV0aWxzLmwoIlN0YXJ0aW5nIGRvd25sb2FkIG9mIiwgdXJpLCAid2l0aCBpZCIsIGRvd25sb2FkSWQpOworICAgICAgICAgICAgUHJpdmF0ZUxvZy5sb2coIlN0YXJ0aW5nIGRvd25sb2FkIG9mICIgKyB1cmkgKyAiLCBpZCA6ICIgKyBkb3dubG9hZElkLCBjb250ZXh0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFuIGFjdGlvbiB0aGF0IHVwZGF0ZXMgdGhlIGRhdGFiYXNlIHRvIHJlZmxlY3QgdGhlIHN0YXR1cyBvZiBhIG5ld2x5IGluc3RhbGxlZCB3b3JkIGxpc3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBJbnN0YWxsQWZ0ZXJEb3dubG9hZEFjdGlvbiBpbXBsZW1lbnRzIEFjdGlvbiB7CisgICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkRpY3Rpb25hcnlQcm92aWRlcjoiCisgICAgICAgICAgICAgICAgKyBJbnN0YWxsQWZ0ZXJEb3dubG9hZEFjdGlvbi5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1DbGllbnRJZDsKKyAgICAgICAgLy8gVGhlIHN0YXRlIHRvIHVwZ3JhZGUgZnJvbS4gTWF5IG5vdCBiZSBudWxsLgorICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIG1Xb3JkTGlzdFZhbHVlczsKKworICAgICAgICBwdWJsaWMgSW5zdGFsbEFmdGVyRG93bmxvYWRBY3Rpb24oZmluYWwgU3RyaW5nIGNsaWVudElkLAorICAgICAgICAgICAgICAgIGZpbmFsIENvbnRlbnRWYWx1ZXMgd29yZExpc3RWYWx1ZXMpIHsKKyAgICAgICAgICAgIFV0aWxzLmwoIk5ldyBJbnN0YWxsQWZ0ZXJEb3dubG9hZEFjdGlvbiBmb3IgY2xpZW50ICIsIGNsaWVudElkLCAiIDogIiwgd29yZExpc3RWYWx1ZXMpOworICAgICAgICAgICAgbUNsaWVudElkID0gY2xpZW50SWQ7CisgICAgICAgICAgICBtV29yZExpc3RWYWx1ZXMgPSB3b3JkTGlzdFZhbHVlczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKGZpbmFsIENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgaWYgKG51bGwgPT0gbVdvcmRMaXN0VmFsdWVzKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiSW5zdGFsbEFmdGVyRG93bmxvYWRBY3Rpb24gd2l0aCBhIG51bGwgcGFyYW1ldGVyISIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIGludCBzdGF0dXMgPSBtV29yZExpc3RWYWx1ZXMuZ2V0QXNJbnRlZ2VyKE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0NPTFVNTik7CisgICAgICAgICAgICBpZiAoTWV0YWRhdGFEYkhlbHBlci5TVEFUVVNfRE9XTkxPQURJTkcgIT0gc3RhdHVzKSB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGlkID0gbVdvcmRMaXN0VmFsdWVzLmdldEFzU3RyaW5nKE1ldGFkYXRhRGJIZWxwZXIuV09SRExJU1RJRF9DT0xVTU4pOworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlVuZXhwZWN0ZWQgc3RhdGUgb2YgdGhlIHdvcmQgbGlzdCAnIiArIGlkICsgIicgOiAiICsgc3RhdHVzCisgICAgICAgICAgICAgICAgICAgICAgICArICIgZm9yIGFuIEluc3RhbGxBZnRlckRvd25sb2FkIGFjdGlvbi4gQmFpbGluZyBvdXQuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVXRpbHMubCgiU2V0dGluZyB3b3JkIGxpc3QgYXMgaW5zdGFsbGVkIik7CisgICAgICAgICAgICBmaW5hbCBTUUxpdGVEYXRhYmFzZSBkYiA9IE1ldGFkYXRhRGJIZWxwZXIuZ2V0RGIoY29udGV4dCwgbUNsaWVudElkKTsKKyAgICAgICAgICAgIE1ldGFkYXRhRGJIZWxwZXIubWFya0VudHJ5QXNGaW5pc2hlZERvd25sb2FkaW5nQW5kSW5zdGFsbGVkKGRiLCBtV29yZExpc3RWYWx1ZXMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQW4gYWN0aW9uIHRoYXQgZW5hYmxlcyBhbiBleGlzdGluZyB3b3JkIGxpc3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBFbmFibGVBY3Rpb24gaW1wbGVtZW50cyBBY3Rpb24geworICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJEaWN0aW9uYXJ5UHJvdmlkZXI6IiArIEVuYWJsZUFjdGlvbi5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1DbGllbnRJZDsKKyAgICAgICAgLy8gVGhlIHN0YXRlIHRvIHVwZ3JhZGUgZnJvbS4gTWF5IG5vdCBiZSBudWxsLgorICAgICAgICBmaW5hbCBXb3JkTGlzdE1ldGFkYXRhIG1Xb3JkTGlzdDsKKworICAgICAgICBwdWJsaWMgRW5hYmxlQWN0aW9uKGZpbmFsIFN0cmluZyBjbGllbnRJZCwgZmluYWwgV29yZExpc3RNZXRhZGF0YSB3b3JkTGlzdCkgeworICAgICAgICAgICAgVXRpbHMubCgiTmV3IEVuYWJsZUFjdGlvbiBmb3IgY2xpZW50ICIsIGNsaWVudElkLCAiIDogIiwgd29yZExpc3QpOworICAgICAgICAgICAgbUNsaWVudElkID0gY2xpZW50SWQ7CisgICAgICAgICAgICBtV29yZExpc3QgPSB3b3JkTGlzdDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKGZpbmFsIENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgaWYgKG51bGwgPT0gbVdvcmRMaXN0KSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRW5hYmxlQWN0aW9uIHdpdGggYSBudWxsIHBhcmFtZXRlciEiKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBVdGlscy5sKCJFbmFibGluZyB3b3JkIGxpc3QiKTsKKyAgICAgICAgICAgIGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiID0gTWV0YWRhdGFEYkhlbHBlci5nZXREYihjb250ZXh0LCBtQ2xpZW50SWQpOworICAgICAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBNZXRhZGF0YURiSGVscGVyLmdldENvbnRlbnRWYWx1ZXNCeVdvcmRMaXN0SWQoZGIsCisgICAgICAgICAgICAgICAgICAgIG1Xb3JkTGlzdC5tSWQsIG1Xb3JkTGlzdC5tVmVyc2lvbik7CisgICAgICAgICAgICBmaW5hbCBpbnQgc3RhdHVzID0gdmFsdWVzLmdldEFzSW50ZWdlcihNZXRhZGF0YURiSGVscGVyLlNUQVRVU19DT0xVTU4pOworICAgICAgICAgICAgaWYgKE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0RJU0FCTEVEICE9IHN0YXR1cworICAgICAgICAgICAgICAgICAgICAmJiBNZXRhZGF0YURiSGVscGVyLlNUQVRVU19ERUxFVElORyAhPSBzdGF0dXMpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJVbmV4cGVjdGVkIHN0YXRlIG9mIHRoZSB3b3JkIGxpc3QgJyIgKyBtV29yZExpc3QubUlkICsgIiA6ICIgKyBzdGF0dXMKKyAgICAgICAgICAgICAgICAgICAgICArICIgZm9yIGFuIGVuYWJsZSBhY3Rpb24uIENhbmNlbGxpbmciKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBNZXRhZGF0YURiSGVscGVyLm1hcmtFbnRyeUFzRW5hYmxlZChkYiwgbVdvcmRMaXN0Lm1JZCwgbVdvcmRMaXN0Lm1WZXJzaW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFuIGFjdGlvbiB0aGF0IGRpc2FibGVzIGEgd29yZCBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRGlzYWJsZUFjdGlvbiBpbXBsZW1lbnRzIEFjdGlvbiB7CisgICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkRpY3Rpb25hcnlQcm92aWRlcjoiICsgRGlzYWJsZUFjdGlvbi5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1DbGllbnRJZDsKKyAgICAgICAgLy8gVGhlIHdvcmQgbGlzdCB0byBkaXNhYmxlLiBNYXkgbm90IGJlIG51bGwuCisgICAgICAgIGZpbmFsIFdvcmRMaXN0TWV0YWRhdGEgbVdvcmRMaXN0OworICAgICAgICBwdWJsaWMgRGlzYWJsZUFjdGlvbihmaW5hbCBTdHJpbmcgY2xpZW50SWQsIGZpbmFsIFdvcmRMaXN0TWV0YWRhdGEgd29yZGxpc3QpIHsKKyAgICAgICAgICAgIFV0aWxzLmwoIk5ldyBEaXNhYmxlIGFjdGlvbiBmb3IgY2xpZW50ICIsIGNsaWVudElkLCAiIDogIiwgd29yZGxpc3QpOworICAgICAgICAgICAgbUNsaWVudElkID0gY2xpZW50SWQ7CisgICAgICAgICAgICBtV29yZExpc3QgPSB3b3JkbGlzdDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKGZpbmFsIENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgaWYgKG51bGwgPT0gbVdvcmRMaXN0KSB7IC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbgorICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkRpc2FibGVBY3Rpb24gd2l0aCBhIG51bGwgd29yZCBsaXN0ISIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFV0aWxzLmwoIkRpc2FibGluZyB3b3JkIGxpc3QgOiAiICsgbVdvcmRMaXN0KTsKKyAgICAgICAgICAgIGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiID0gTWV0YWRhdGFEYkhlbHBlci5nZXREYihjb250ZXh0LCBtQ2xpZW50SWQpOworICAgICAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBNZXRhZGF0YURiSGVscGVyLmdldENvbnRlbnRWYWx1ZXNCeVdvcmRMaXN0SWQoZGIsCisgICAgICAgICAgICAgICAgICAgIG1Xb3JkTGlzdC5tSWQsIG1Xb3JkTGlzdC5tVmVyc2lvbik7CisgICAgICAgICAgICBmaW5hbCBpbnQgc3RhdHVzID0gdmFsdWVzLmdldEFzSW50ZWdlcihNZXRhZGF0YURiSGVscGVyLlNUQVRVU19DT0xVTU4pOworICAgICAgICAgICAgaWYgKE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0lOU1RBTExFRCA9PSBzdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAvLyBEaXNhYmxpbmcgYW4gaW5zdGFsbGVkIHdvcmQgbGlzdAorICAgICAgICAgICAgICAgIE1ldGFkYXRhRGJIZWxwZXIubWFya0VudHJ5QXNEaXNhYmxlZChkYiwgbVdvcmRMaXN0Lm1JZCwgbVdvcmRMaXN0Lm1WZXJzaW9uKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0RPV05MT0FESU5HICE9IHN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJVbmV4cGVjdGVkIHN0YXRlIG9mIHRoZSB3b3JkIGxpc3QgJyIgKyBtV29yZExpc3QubUlkICsgIicgOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdGF0dXMgKyAiIGZvciBhIGRpc2FibGUgYWN0aW9uLiBGYWxsIGJhY2sgdG8gbWFya2luZyBhcyBhdmFpbGFibGUuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFRoZSB3b3JkIGxpc3QgaXMgc3RpbGwgZG93bmxvYWRpbmcuIENhbmNlbCB0aGUgZG93bmxvYWQgYW5kIHJldmVydCB0aGUKKyAgICAgICAgICAgICAgICAvLyB3b3JkIGxpc3Qgc3RhdHVzIHRvICJhdmFpbGFibGUiLgorICAgICAgICAgICAgICAgIGZpbmFsIERvd25sb2FkTWFuYWdlciBtYW5hZ2VyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChEb3dubG9hZE1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkRPV05MT0FEX1NFUlZJQ0UpOworICAgICAgICAgICAgICAgIGlmIChudWxsICE9IG1hbmFnZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgY2FuJ3QgY2FuY2VsIHRoZSBkb3dubG9hZCBiZWNhdXNlIERvd25sb2FkTWFuYWdlciBpcyBub3QgYXZhaWxhYmxlLAorICAgICAgICAgICAgICAgICAgICAvLyB3ZSBzdGlsbCBuZWVkIHRvIG1hcmsgdGhlIGVudHJ5IGFzIGF2YWlsYWJsZS4KKyAgICAgICAgICAgICAgICAgICAgbWFuYWdlci5yZW1vdmUodmFsdWVzLmdldEFzTG9uZyhNZXRhZGF0YURiSGVscGVyLlBFTkRJTkdJRF9DT0xVTU4pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTWV0YWRhdGFEYkhlbHBlci5tYXJrRW50cnlBc0F2YWlsYWJsZShkYiwgbVdvcmRMaXN0Lm1JZCwgbVdvcmRMaXN0Lm1WZXJzaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFuIGFjdGlvbiB0aGF0IG1ha2VzIGEgd29yZCBsaXN0IGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIE1ha2VBdmFpbGFibGVBY3Rpb24gaW1wbGVtZW50cyBBY3Rpb24geworICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJEaWN0aW9uYXJ5UHJvdmlkZXI6IiArIE1ha2VBdmFpbGFibGVBY3Rpb24uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQ2xpZW50SWQ7CisgICAgICAgIC8vIFRoZSB3b3JkIGxpc3QgdG8gbWFrZSBhdmFpbGFibGUuIE1heSBub3QgYmUgbnVsbC4KKyAgICAgICAgZmluYWwgV29yZExpc3RNZXRhZGF0YSBtV29yZExpc3Q7CisgICAgICAgIHB1YmxpYyBNYWtlQXZhaWxhYmxlQWN0aW9uKGZpbmFsIFN0cmluZyBjbGllbnRJZCwgZmluYWwgV29yZExpc3RNZXRhZGF0YSB3b3JkbGlzdCkgeworICAgICAgICAgICAgVXRpbHMubCgiTmV3IE1ha2VBdmFpbGFibGUgYWN0aW9uIiwgY2xpZW50SWQsICIgOiAiLCB3b3JkbGlzdCk7CisgICAgICAgICAgICBtQ2xpZW50SWQgPSBjbGllbnRJZDsKKyAgICAgICAgICAgIG1Xb3JkTGlzdCA9IHdvcmRsaXN0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoZmluYWwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBpZiAobnVsbCA9PSBtV29yZExpc3QpIHsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuCisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiTWFrZUF2YWlsYWJsZUFjdGlvbiB3aXRoIGEgbnVsbCB3b3JkIGxpc3QhIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIgPSBNZXRhZGF0YURiSGVscGVyLmdldERiKGNvbnRleHQsIG1DbGllbnRJZCk7CisgICAgICAgICAgICBpZiAobnVsbCAhPSBNZXRhZGF0YURiSGVscGVyLmdldENvbnRlbnRWYWx1ZXNCeVdvcmRMaXN0SWQoZGIsCisgICAgICAgICAgICAgICAgICAgIG1Xb3JkTGlzdC5tSWQsIG1Xb3JkTGlzdC5tVmVyc2lvbikpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJVbmV4cGVjdGVkIHN0YXRlIG9mIHRoZSB3b3JkIGxpc3QgJyIgKyBtV29yZExpc3QubUlkICsgIicgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGZvciBhIG1ha2VhdmFpbGFibGUgYWN0aW9uLiBNYXJraW5nIGFzIGF2YWlsYWJsZSBhbnl3YXkuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBVdGlscy5sKCJNYWtpbmcgd29yZCBsaXN0IGF2YWlsYWJsZSA6ICIgKyBtV29yZExpc3QpOworICAgICAgICAgICAgLy8gSWYgbUxvY2FsRmlsZW5hbWUgaXMgbnVsbCwgdGhlbiBpdCdzIGEgcmVtb3RlIGZpbGUgdGhhdCBoYXNuJ3QgYmVlbiBkb3dubG9hZGVkCisgICAgICAgICAgICAvLyB5ZXQsIHNvIHdlIHNldCB0aGUgbG9jYWwgZmlsZW5hbWUgdG8gdGhlIGVtcHR5IHN0cmluZy4KKyAgICAgICAgICAgIGZpbmFsIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gTWV0YWRhdGFEYkhlbHBlci5tYWtlQ29udGVudFZhbHVlcygwLAorICAgICAgICAgICAgICAgICAgICBNZXRhZGF0YURiSGVscGVyLlRZUEVfQlVMSywgTWV0YWRhdGFEYkhlbHBlci5TVEFUVVNfQVZBSUxBQkxFLAorICAgICAgICAgICAgICAgICAgICBtV29yZExpc3QubUlkLCBtV29yZExpc3QubUxvY2FsZSwgbVdvcmRMaXN0Lm1EZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCA9PSBtV29yZExpc3QubUxvY2FsRmlsZW5hbWUgPyAiIiA6IG1Xb3JkTGlzdC5tTG9jYWxGaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbVdvcmRMaXN0Lm1SZW1vdGVGaWxlbmFtZSwgbVdvcmRMaXN0Lm1MYXN0VXBkYXRlLCBtV29yZExpc3QubUNoZWNrc3VtLAorICAgICAgICAgICAgICAgICAgICBtV29yZExpc3QubUZpbGVTaXplLCBtV29yZExpc3QubVZlcnNpb24sIG1Xb3JkTGlzdC5tRm9ybWF0VmVyc2lvbik7CisgICAgICAgICAgICBQcml2YXRlTG9nLmxvZygiSW5zZXJ0ICdhdmFpbGFibGUnIHJlY29yZCBmb3IgIiArIG1Xb3JkTGlzdC5tRGVzY3JpcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKyAiIGFuZCBsb2NhbGUgIiArIG1Xb3JkTGlzdC5tTG9jYWxlLCBjb250ZXh0KTsKKyAgICAgICAgICAgIGRiLmluc2VydChNZXRhZGF0YURiSGVscGVyLk1FVEFEQVRBX1RBQkxFX05BTUUsIG51bGwsIHZhbHVlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbiBhY3Rpb24gdGhhdCBtYXJrcyBhIHdvcmQgbGlzdCBhcyBwcmUtaW5zdGFsbGVkLgorICAgICAqCisgICAgICogVGhpcyBpcyBhbG1vc3QgdGhlIHNhbWUgYXMgTWFrZUF2YWlsYWJsZUFjdGlvbiwgYXMgaXQgb25seSBpbnNlcnRzIGEgbGluZSB3aXRoIHBhcmFtZXRlcnMKKyAgICAgKiByZWNlaXZlZCBmcm9tIG91dHNpZGUuCisgICAgICogVW5saWtlIE1ha2VBdmFpbGFibGVBY3Rpb24sIHRoZSBwYXJhbWV0ZXJzIGFyZSBub3QgcmVjZWl2ZWQgZnJvbSBhIGRvd25sb2FkZWQgbWV0YWRhdGEgZmlsZQorICAgICAqIGJ1dCBmcm9tIHRoZSBjbGllbnQgZGlyZWN0bHk7IGl0IG1hcmtzIGEgd29yZCBsaXN0IGFzIGJlaW5nICJpbnN0YWxsZWQiIGFuZCBub3QgImF2YWlsYWJsZSIuCisgICAgICogSXQgYWxzbyBleHBsaWNpdGx5IHNldHMgdGhlIGZpbGVuYW1lIHRvIHRoZSBlbXB0eSBzdHJpbmcsIHNvIHRoYXQgd2UgZG9uJ3QgdHJ5IHRvIG9wZW4KKyAgICAgKiBpdCBvbiBvdXIgc2lkZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIE1hcmtQcmVJbnN0YWxsZWRBY3Rpb24gaW1wbGVtZW50cyBBY3Rpb24geworICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJEaWN0aW9uYXJ5UHJvdmlkZXI6IgorICAgICAgICAgICAgICAgICsgTWFya1ByZUluc3RhbGxlZEFjdGlvbi5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1DbGllbnRJZDsKKyAgICAgICAgLy8gVGhlIHdvcmQgbGlzdCB0byBtYXJrIHByZS1pbnN0YWxsZWQuIE1heSBub3QgYmUgbnVsbC4KKyAgICAgICAgZmluYWwgV29yZExpc3RNZXRhZGF0YSBtV29yZExpc3Q7CisgICAgICAgIHB1YmxpYyBNYXJrUHJlSW5zdGFsbGVkQWN0aW9uKGZpbmFsIFN0cmluZyBjbGllbnRJZCwgZmluYWwgV29yZExpc3RNZXRhZGF0YSB3b3JkbGlzdCkgeworICAgICAgICAgICAgVXRpbHMubCgiTmV3IE1hcmtQcmVJbnN0YWxsZWQgYWN0aW9uIiwgY2xpZW50SWQsICIgOiAiLCB3b3JkbGlzdCk7CisgICAgICAgICAgICBtQ2xpZW50SWQgPSBjbGllbnRJZDsKKyAgICAgICAgICAgIG1Xb3JkTGlzdCA9IHdvcmRsaXN0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoZmluYWwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBpZiAobnVsbCA9PSBtV29yZExpc3QpIHsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuCisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiTWFya1ByZUluc3RhbGxlZEFjdGlvbiB3aXRoIGEgbnVsbCB3b3JkIGxpc3QhIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIgPSBNZXRhZGF0YURiSGVscGVyLmdldERiKGNvbnRleHQsIG1DbGllbnRJZCk7CisgICAgICAgICAgICBpZiAobnVsbCAhPSBNZXRhZGF0YURiSGVscGVyLmdldENvbnRlbnRWYWx1ZXNCeVdvcmRMaXN0SWQoZGIsCisgICAgICAgICAgICAgICAgICAgIG1Xb3JkTGlzdC5tSWQsIG1Xb3JkTGlzdC5tVmVyc2lvbikpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJVbmV4cGVjdGVkIHN0YXRlIG9mIHRoZSB3b3JkIGxpc3QgJyIgKyBtV29yZExpc3QubUlkICsgIicgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGZvciBhIG1hcmtwcmVpbnN0YWxsZWQgYWN0aW9uLiBNYXJraW5nIGFzIHByZWluc3RhbGxlZCBhbnl3YXkuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBVdGlscy5sKCJNYXJraW5nIHdvcmQgbGlzdCBwcmVpbnN0YWxsZWQgOiAiICsgbVdvcmRMaXN0KTsKKyAgICAgICAgICAgIC8vIFRoaXMgd29yZCBsaXN0IGlzIHByZS1pbnN0YWxsZWQgOiB3ZSBkb24ndCBoYXZlIGl0cyBmaWxlLiBXZSBzaG91bGQgcmVzZXQKKyAgICAgICAgICAgIC8vIHRoZSBsb2NhbCBmaWxlIG5hbWUgdG8gdGhlIGVtcHR5IHN0cmluZyBzbyB0aGF0IHdlIGRvbid0IHRyeSB0byBvcGVuIGl0CisgICAgICAgICAgICAvLyBhY2NpZGVudGFsbHkuIFRoZSByZW1vdGUgZmlsZW5hbWUgbWF5IGJlIHNldCBieSB0aGUgYXBwbGljYXRpb24gaWYgaXQgc28gd2lzaGVzLgorICAgICAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBNZXRhZGF0YURiSGVscGVyLm1ha2VDb250ZW50VmFsdWVzKDAsCisgICAgICAgICAgICAgICAgICAgIE1ldGFkYXRhRGJIZWxwZXIuVFlQRV9CVUxLLCBNZXRhZGF0YURiSGVscGVyLlNUQVRVU19JTlNUQUxMRUQsCisgICAgICAgICAgICAgICAgICAgIG1Xb3JkTGlzdC5tSWQsIG1Xb3JkTGlzdC5tTG9jYWxlLCBtV29yZExpc3QubURlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAiIiwgbVdvcmRMaXN0Lm1SZW1vdGVGaWxlbmFtZSwgbVdvcmRMaXN0Lm1MYXN0VXBkYXRlLAorICAgICAgICAgICAgICAgICAgICBtV29yZExpc3QubUNoZWNrc3VtLCBtV29yZExpc3QubUZpbGVTaXplLCBtV29yZExpc3QubVZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgIG1Xb3JkTGlzdC5tRm9ybWF0VmVyc2lvbik7CisgICAgICAgICAgICBQcml2YXRlTG9nLmxvZygiSW5zZXJ0ICdwcmVpbnN0YWxsZWQnIHJlY29yZCBmb3IgIiArIG1Xb3JkTGlzdC5tRGVzY3JpcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKyAiIGFuZCBsb2NhbGUgIiArIG1Xb3JkTGlzdC5tTG9jYWxlLCBjb250ZXh0KTsKKyAgICAgICAgICAgIGRiLmluc2VydChNZXRhZGF0YURiSGVscGVyLk1FVEFEQVRBX1RBQkxFX05BTUUsIG51bGwsIHZhbHVlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbiBhY3Rpb24gdGhhdCB1cGRhdGVzIGluZm9ybWF0aW9uIGFib3V0IGEgd29yZCBsaXN0IC0gZGVzY3JpcHRpb24sIGxvY2FsZSBldGMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFVwZGF0ZURhdGFBY3Rpb24gaW1wbGVtZW50cyBBY3Rpb24geworICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJEaWN0aW9uYXJ5UHJvdmlkZXI6IiArIFVwZGF0ZURhdGFBY3Rpb24uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQ2xpZW50SWQ7CisgICAgICAgIGZpbmFsIFdvcmRMaXN0TWV0YWRhdGEgbVdvcmRMaXN0OworICAgICAgICBwdWJsaWMgVXBkYXRlRGF0YUFjdGlvbihmaW5hbCBTdHJpbmcgY2xpZW50SWQsIGZpbmFsIFdvcmRMaXN0TWV0YWRhdGEgd29yZGxpc3QpIHsKKyAgICAgICAgICAgIFV0aWxzLmwoIk5ldyBVcGRhdGVEYXRhIGFjdGlvbiBmb3IgY2xpZW50ICIsIGNsaWVudElkLCAiIDogIiwgd29yZGxpc3QpOworICAgICAgICAgICAgbUNsaWVudElkID0gY2xpZW50SWQ7CisgICAgICAgICAgICBtV29yZExpc3QgPSB3b3JkbGlzdDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKGZpbmFsIENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgaWYgKG51bGwgPT0gbVdvcmRMaXN0KSB7IC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbgorICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlVwZGF0ZURhdGFBY3Rpb24gd2l0aCBhIG51bGwgd29yZCBsaXN0ISIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiID0gTWV0YWRhdGFEYkhlbHBlci5nZXREYihjb250ZXh0LCBtQ2xpZW50SWQpOworICAgICAgICAgICAgQ29udGVudFZhbHVlcyBvbGRWYWx1ZXMgPSBNZXRhZGF0YURiSGVscGVyLmdldENvbnRlbnRWYWx1ZXNCeVdvcmRMaXN0SWQoZGIsCisgICAgICAgICAgICAgICAgICAgIG1Xb3JkTGlzdC5tSWQsIG1Xb3JkTGlzdC5tVmVyc2lvbik7CisgICAgICAgICAgICBpZiAobnVsbCA9PSBvbGRWYWx1ZXMpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJUcnlpbmcgdG8gdXBkYXRlIGRhdGEgYWJvdXQgYSBub24tZXhpc3Rpbmcgd29yZCBsaXN0LiBCYWlsaW5nIG91dC4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBVdGlscy5sKCJVcGRhdGluZyBkYXRhIGFib3V0IGEgd29yZCBsaXN0IDogIiArIG1Xb3JkTGlzdCk7CisgICAgICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIHZhbHVlcyA9IE1ldGFkYXRhRGJIZWxwZXIubWFrZUNvbnRlbnRWYWx1ZXMoCisgICAgICAgICAgICAgICAgICAgIG9sZFZhbHVlcy5nZXRBc0ludGVnZXIoTWV0YWRhdGFEYkhlbHBlci5QRU5ESU5HSURfQ09MVU1OKSwKKyAgICAgICAgICAgICAgICAgICAgb2xkVmFsdWVzLmdldEFzSW50ZWdlcihNZXRhZGF0YURiSGVscGVyLlRZUEVfQ09MVU1OKSwKKyAgICAgICAgICAgICAgICAgICAgb2xkVmFsdWVzLmdldEFzSW50ZWdlcihNZXRhZGF0YURiSGVscGVyLlNUQVRVU19DT0xVTU4pLAorICAgICAgICAgICAgICAgICAgICBtV29yZExpc3QubUlkLCBtV29yZExpc3QubUxvY2FsZSwgbVdvcmRMaXN0Lm1EZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgb2xkVmFsdWVzLmdldEFzU3RyaW5nKE1ldGFkYXRhRGJIZWxwZXIuTE9DQUxfRklMRU5BTUVfQ09MVU1OKSwKKyAgICAgICAgICAgICAgICAgICAgbVdvcmRMaXN0Lm1SZW1vdGVGaWxlbmFtZSwgbVdvcmRMaXN0Lm1MYXN0VXBkYXRlLCBtV29yZExpc3QubUNoZWNrc3VtLAorICAgICAgICAgICAgICAgICAgICBtV29yZExpc3QubUZpbGVTaXplLCBtV29yZExpc3QubVZlcnNpb24sIG1Xb3JkTGlzdC5tRm9ybWF0VmVyc2lvbik7CisgICAgICAgICAgICBQcml2YXRlTG9nLmxvZygiVXBkYXRpbmcgcmVjb3JkIGZvciAiICsgbVdvcmRMaXN0Lm1EZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgICAgICArICIgYW5kIGxvY2FsZSAiICsgbVdvcmRMaXN0Lm1Mb2NhbGUsIGNvbnRleHQpOworICAgICAgICAgICAgZGIudXBkYXRlKE1ldGFkYXRhRGJIZWxwZXIuTUVUQURBVEFfVEFCTEVfTkFNRSwgdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICBNZXRhZGF0YURiSGVscGVyLldPUkRMSVNUSURfQ09MVU1OICsgIiA9ID8gQU5EICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIE1ldGFkYXRhRGJIZWxwZXIuVkVSU0lPTl9DT0xVTU4gKyAiID0gPyIsCisgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IG1Xb3JkTGlzdC5tSWQsIEludGVnZXIudG9TdHJpbmcobVdvcmRMaXN0Lm1WZXJzaW9uKSB9KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFuIGFjdGlvbiB0aGF0IGRlbGV0ZXMgdGhlIG1ldGFkYXRhIGFib3V0IGEgd29yZCBsaXN0IGlmIHBvc3NpYmxlLgorICAgICAqCisgICAgICogVGhpcyBpcyB0cmlnZ2VyZWQgd2hlbiBhIHNwZWNpZmljIHdvcmQgbGlzdCBkaXNhcHBlYXJlZCBmcm9tIHRoZSBzZXJ2ZXIsIG9yIHdoZW4gYSBmcmVzaGVyCisgICAgICogd29yZCBsaXN0IGlzIGF2YWlsYWJsZSBhbmQgdGhlIG9sZCBvbmUgd2FzIG5vdCBpbnN0YWxsZWQuCisgICAgICogSWYgdGhlIHdvcmQgbGlzdCBoYXMgbm90IGJlZW4gaW5zdGFsbGVkLCBpdCdzIHBvc3NpYmxlIHRvIGRlbGV0ZSBpdHMgYXNzb2NpYXRlZCBtZXRhZGF0YS4KKyAgICAgKiBPdGhlcndpc2UsIHRoZSBzZXR0aW5ncyBhcmUgcmV0YWluZWQgc28gdGhhdCB0aGUgdXNlciBjYW4gc3RpbGwgYWRtaW5pc3RyYXRlIGl0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRm9yZ2V0QWN0aW9uIGltcGxlbWVudHMgQWN0aW9uIHsKKyAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRGljdGlvbmFyeVByb3ZpZGVyOiIgKyBGb3JnZXRBY3Rpb24uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQ2xpZW50SWQ7CisgICAgICAgIC8vIFRoZSB3b3JkIGxpc3QgdG8gcmVtb3ZlLiBNYXkgbm90IGJlIG51bGwuCisgICAgICAgIGZpbmFsIFdvcmRMaXN0TWV0YWRhdGEgbVdvcmRMaXN0OworICAgICAgICBmaW5hbCBib29sZWFuIG1IYXNOZXdlclZlcnNpb247CisgICAgICAgIHB1YmxpYyBGb3JnZXRBY3Rpb24oZmluYWwgU3RyaW5nIGNsaWVudElkLCBmaW5hbCBXb3JkTGlzdE1ldGFkYXRhIHdvcmRsaXN0LAorICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaGFzTmV3ZXJWZXJzaW9uKSB7CisgICAgICAgICAgICBVdGlscy5sKCJOZXcgVHJ5UmVtb3ZlIGFjdGlvbiBmb3IgY2xpZW50ICIsIGNsaWVudElkLCAiIDogIiwgd29yZGxpc3QpOworICAgICAgICAgICAgbUNsaWVudElkID0gY2xpZW50SWQ7CisgICAgICAgICAgICBtV29yZExpc3QgPSB3b3JkbGlzdDsKKyAgICAgICAgICAgIG1IYXNOZXdlclZlcnNpb24gPSBoYXNOZXdlclZlcnNpb247CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZShmaW5hbCBDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIGlmIChudWxsID09IG1Xb3JkTGlzdCkgeyAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4KKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJUcnlSZW1vdmVBY3Rpb24gd2l0aCBhIG51bGwgd29yZCBsaXN0ISIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFV0aWxzLmwoIlRyeWluZyB0byByZW1vdmUgd29yZCBsaXN0IDogIiArIG1Xb3JkTGlzdCk7CisgICAgICAgICAgICBmaW5hbCBTUUxpdGVEYXRhYmFzZSBkYiA9IE1ldGFkYXRhRGJIZWxwZXIuZ2V0RGIoY29udGV4dCwgbUNsaWVudElkKTsKKyAgICAgICAgICAgIGZpbmFsIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gTWV0YWRhdGFEYkhlbHBlci5nZXRDb250ZW50VmFsdWVzQnlXb3JkTGlzdElkKGRiLAorICAgICAgICAgICAgICAgICAgICBtV29yZExpc3QubUlkLCBtV29yZExpc3QubVZlcnNpb24pOworICAgICAgICAgICAgaWYgKG51bGwgPT0gdmFsdWVzKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiVHJ5aW5nIHRvIHVwZGF0ZSB0aGUgbWV0YWRhdGEgb2YgYSBub24tZXhpc3Rpbmcgd29yZGxpc3QuIENhbmNlbGxpbmcuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgaW50IHN0YXR1cyA9IHZhbHVlcy5nZXRBc0ludGVnZXIoTWV0YWRhdGFEYkhlbHBlci5TVEFUVVNfQ09MVU1OKTsKKyAgICAgICAgICAgIGlmIChtSGFzTmV3ZXJWZXJzaW9uICYmIE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0FWQUlMQUJMRSAhPSBzdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgbmV3ZXIgdmVyc2lvbiBvZiB0aGlzIHdvcmQgbGlzdCwgd2Ugc2hvdWxkIGJlIGhlcmUgT05MWSBpZiBpdCB3YXMKKyAgICAgICAgICAgICAgICAvLyBub3QgaW5zdGFsbGVkIC0gZWxzZSB3ZSBzaG91bGQgYmUgdXBncmFkaW5nIGl0LgorICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlVuZXhwZWN0ZWQgc3RhdHVzIGZvciBmb3JnZXR0aW5nIGEgd29yZCBsaXN0IGluZm8gOiAiICsgc3RhdHVzCisgICAgICAgICAgICAgICAgICAgICAgICArICIsIHJlbW92aW5nIFVSTCB0byBwcmV2ZW50IHJlLWRvd25sb2FkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoTWV0YWRhdGFEYkhlbHBlci5TVEFUVVNfSU5TVEFMTEVEID09IHN0YXR1cworICAgICAgICAgICAgICAgICAgICB8fCBNZXRhZGF0YURiSGVscGVyLlNUQVRVU19ESVNBQkxFRCA9PSBzdGF0dXMKKyAgICAgICAgICAgICAgICAgICAgfHwgTWV0YWRhdGFEYkhlbHBlci5TVEFUVVNfREVMRVRJTkcgPT0gc3RhdHVzKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgaXQgaXMgaW5zdGFsbGVkIG9yIGRpc2FibGVkLCB0aGVuIHdlIGNhbm5vdCByZW1vdmUgdGhlIGVudHJ5IGxlc3QgdGhlIHVzZXIKKyAgICAgICAgICAgICAgICAvLyBsb3NlIHRoZSBhYmlsaXR5IHRvIGRlbGV0ZSB0aGUgZmlsZSBvciBvdGhlcndpc2UgYWRtaW5pc3RyYXRlIGl0LiBXZSB3aWxsIHRodXMKKyAgICAgICAgICAgICAgICAvLyBsZWF2ZSBpdCBhcyBpcywgYnV0IHJlbW92ZSB0aGUgVVJJIGZyb20gdGhlIGRhdGFiYXNlIHNpbmNlIGl0IGlzIG5vdCBzdXBwb3NlZCB0bworICAgICAgICAgICAgICAgIC8vIGJlIGFjY2Vzc2libGUgYW55IG1vcmUuCisgICAgICAgICAgICAgICAgLy8gSWYgaXQgaXMgZGVsZXRpbmcgYW5kIHdlIGRvbid0IGhhdmUgYSBuZXcgdmVyc2lvbiwgdGhlbiB3ZSBoYXZlIHRvIHdhaXQgdW50aWwKKyAgICAgICAgICAgICAgICAvLyBBbmRyb2lkIEtleWJvYXJkIGFjdHVhbGx5IGhhcyBkZWxldGVkIGl0IGJlZm9yZSB3ZSBjYW4gcmVtb3ZlIGl0cyBtZXRhZGF0YS4KKyAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KE1ldGFkYXRhRGJIZWxwZXIuUkVNT1RFX0ZJTEVOQU1FX0NPTFVNTiwgIiIpOworICAgICAgICAgICAgICAgIGRiLnVwZGF0ZShNZXRhZGF0YURiSGVscGVyLk1FVEFEQVRBX1RBQkxFX05BTUUsIHZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFkYXRhRGJIZWxwZXIuV09SRExJU1RJRF9DT0xVTU4gKyAiID0gPyBBTkQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIE1ldGFkYXRhRGJIZWxwZXIuVkVSU0lPTl9DT0xVTU4gKyAiID0gPyIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBtV29yZExpc3QubUlkLCBJbnRlZ2VyLnRvU3RyaW5nKG1Xb3JkTGlzdC5tVmVyc2lvbikgfSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIElmIGl0J3MgQVZBSUxBQkxFIG9yIERPV05MT0FESU5HIG9yIGV2ZW4gVU5LTk9XTiwgZGVsZXRlIHRoZSBlbnRyeS4KKyAgICAgICAgICAgICAgICBkYi5kZWxldGUoTWV0YWRhdGFEYkhlbHBlci5NRVRBREFUQV9UQUJMRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgTWV0YWRhdGFEYkhlbHBlci5XT1JETElTVElEX0NPTFVNTiArICIgPSA/IEFORCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTWV0YWRhdGFEYkhlbHBlci5WRVJTSU9OX0NPTFVNTiArICIgPSA/IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IG1Xb3JkTGlzdC5tSWQsIEludGVnZXIudG9TdHJpbmcobVdvcmRMaXN0Lm1WZXJzaW9uKSB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFuIGFjdGlvbiB0aGF0IHNldHMgdGhlIHdvcmQgbGlzdCBmb3IgZGVsZXRpb24gYXMgc29vbiBhcyBwb3NzaWJsZS4KKyAgICAgKgorICAgICAqIFRoaXMgaXMgdHJpZ2dlcmVkIHdoZW4gdGhlIHVzZXIgcmVxdWVzdHMgZGVsZXRpb24gb2YgYSB3b3JkIGxpc3QuIFRoaXMgd2lsbCBtYXJrIGl0IGFzCisgICAgICogZGVsZXRlZCBpbiB0aGUgZGF0YWJhc2UsIGFuZCBmaXJlIGFuIGludGVudCBmb3IgQW5kcm9pZCBLZXlib2FyZCB0byB0YWtlIG5vdGljZSBhbmQKKyAgICAgKiByZWxvYWQgaXRzIGRpY3Rpb25hcmllcyByaWdodCBhd2F5IGlmIGl0IGlzIHVwLiBJZiBpdCBpcyBub3QgdXAgbm93LCB0aGVuIGl0IHdpbGwKKyAgICAgKiBkZWxldGUgdGhlIGFjdHVhbCBmaWxlIHRoZSBuZXh0IHRpbWUgaXQgZ2V0cyB1cC4KKyAgICAgKiBBIGZpbGUgbWFya2VkIGFzIGRlbGV0ZWQgY2F1c2VzIHRoZSBjb250ZW50IHByb3ZpZGVyIHRvIHN1cHBseSBhIHplcm8tc2l6ZWQgZmlsZSB0bworICAgICAqIEFuZHJvaWQgS2V5Ym9hcmQsIHdoaWNoIHdpbGwgb3ZlcndyaXRlIGFueSBleGlzdGluZyBmaWxlIGFuZCBwcm92aWRlIG5vIHdvcmRzIGZvciB0aGlzCisgICAgICogd29yZCBsaXN0LiBUaGlzIGlzIG5vdCBleGFjdGx5IGEgImRlbGV0aW9uIiwgc2luY2UgdGhlcmUgaXMgYW4gYWN0dWFsIGZpbGUgd2hpY2ggdGFrZXMgdXAKKyAgICAgKiBhIGZldyBieXRlcyBvbiB0aGUgZGlzaywgYnV0IHRoaXMgYWxsb3dzIHRvIG92ZXJyaWRlIGEgZGVmYXVsdCBkaWN0aW9uYXJ5IHdpdGggYW4gZW1wdHkKKyAgICAgKiBkaWN0aW9uYXJ5LiBUaGlzIHdheSwgdGhlcmUgaXMgbm8gbmVlZCBmb3IgdGhlIHVzZXIgdG8gbWFrZSBhIGRpc3RpbmN0aW9uIGJldHdlZW4KKyAgICAgKiBkaWN0aW9uYXJpZXMgaW5zdGFsbGVkIGJ5IGRlZmF1bHQgYW5kIGFkZC1vbiBkaWN0aW9uYXJpZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBTdGFydERlbGV0ZUFjdGlvbiBpbXBsZW1lbnRzIEFjdGlvbiB7CisgICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkRpY3Rpb25hcnlQcm92aWRlcjoiICsgU3RhcnREZWxldGVBY3Rpb24uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQ2xpZW50SWQ7CisgICAgICAgIC8vIFRoZSB3b3JkIGxpc3QgdG8gZGVsZXRlLiBNYXkgbm90IGJlIG51bGwuCisgICAgICAgIGZpbmFsIFdvcmRMaXN0TWV0YWRhdGEgbVdvcmRMaXN0OworICAgICAgICBwdWJsaWMgU3RhcnREZWxldGVBY3Rpb24oZmluYWwgU3RyaW5nIGNsaWVudElkLCBmaW5hbCBXb3JkTGlzdE1ldGFkYXRhIHdvcmRsaXN0KSB7CisgICAgICAgICAgICBVdGlscy5sKCJOZXcgU3RhcnREZWxldGUgYWN0aW9uIGZvciBjbGllbnQgIiwgY2xpZW50SWQsICIgOiAiLCB3b3JkbGlzdCk7CisgICAgICAgICAgICBtQ2xpZW50SWQgPSBjbGllbnRJZDsKKyAgICAgICAgICAgIG1Xb3JkTGlzdCA9IHdvcmRsaXN0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoZmluYWwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBpZiAobnVsbCA9PSBtV29yZExpc3QpIHsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuCisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiU3RhcnREZWxldGVBY3Rpb24gd2l0aCBhIG51bGwgd29yZCBsaXN0ISIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFV0aWxzLmwoIlRyeWluZyB0byBkZWxldGUgd29yZCBsaXN0IDogIiArIG1Xb3JkTGlzdCk7CisgICAgICAgICAgICBmaW5hbCBTUUxpdGVEYXRhYmFzZSBkYiA9IE1ldGFkYXRhRGJIZWxwZXIuZ2V0RGIoY29udGV4dCwgbUNsaWVudElkKTsKKyAgICAgICAgICAgIGZpbmFsIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gTWV0YWRhdGFEYkhlbHBlci5nZXRDb250ZW50VmFsdWVzQnlXb3JkTGlzdElkKGRiLAorICAgICAgICAgICAgICAgICAgICBtV29yZExpc3QubUlkLCBtV29yZExpc3QubVZlcnNpb24pOworICAgICAgICAgICAgaWYgKG51bGwgPT0gdmFsdWVzKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiVHJ5aW5nIHRvIHNldCBhIG5vbi1leGlzdGluZyB3b3JkbGlzdCBmb3IgcmVtb3ZhbC4gQ2FuY2VsbGluZy4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBpbnQgc3RhdHVzID0gdmFsdWVzLmdldEFzSW50ZWdlcihNZXRhZGF0YURiSGVscGVyLlNUQVRVU19DT0xVTU4pOworICAgICAgICAgICAgaWYgKE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0RJU0FCTEVEICE9IHN0YXR1cykgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlVuZXhwZWN0ZWQgc3RhdHVzIGZvciBkZWxldGluZyBhIHdvcmQgbGlzdCBpbmZvIDogIiArIHN0YXR1cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBNZXRhZGF0YURiSGVscGVyLm1hcmtFbnRyeUFzRGVsZXRpbmcoZGIsIG1Xb3JkTGlzdC5tSWQsIG1Xb3JkTGlzdC5tVmVyc2lvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbiBhY3Rpb24gdGhhdCB2YWxpZGF0ZXMgYSB3b3JkIGxpc3QgYXMgZGVsZXRlZC4KKyAgICAgKgorICAgICAqIFRoaXMgd2lsbCByZXN0b3JlIHRoZSB3b3JkIGxpc3QgYXMgYXZhaWxhYmxlIGlmIGl0IHN0aWxsIGlzLCBvciByZW1vdmUgdGhlIGVudHJ5IGlmCisgICAgICogaXQgaXMgbm90IGFueSBtb3JlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmluaXNoRGVsZXRlQWN0aW9uIGltcGxlbWVudHMgQWN0aW9uIHsKKyAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRGljdGlvbmFyeVByb3ZpZGVyOiIgKyBGaW5pc2hEZWxldGVBY3Rpb24uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQ2xpZW50SWQ7CisgICAgICAgIC8vIFRoZSB3b3JkIGxpc3QgdG8gZGVsZXRlLiBNYXkgbm90IGJlIG51bGwuCisgICAgICAgIGZpbmFsIFdvcmRMaXN0TWV0YWRhdGEgbVdvcmRMaXN0OworICAgICAgICBwdWJsaWMgRmluaXNoRGVsZXRlQWN0aW9uKGZpbmFsIFN0cmluZyBjbGllbnRJZCwgZmluYWwgV29yZExpc3RNZXRhZGF0YSB3b3JkbGlzdCkgeworICAgICAgICAgICAgVXRpbHMubCgiTmV3IEZpbmlzaERlbGV0ZSBhY3Rpb24gZm9yIGNsaWVudCIsIGNsaWVudElkLCAiIDogIiwgd29yZGxpc3QpOworICAgICAgICAgICAgbUNsaWVudElkID0gY2xpZW50SWQ7CisgICAgICAgICAgICBtV29yZExpc3QgPSB3b3JkbGlzdDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKGZpbmFsIENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgaWYgKG51bGwgPT0gbVdvcmRMaXN0KSB7IC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbgorICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZpbmlzaERlbGV0ZUFjdGlvbiB3aXRoIGEgbnVsbCB3b3JkIGxpc3QhIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVXRpbHMubCgiVHJ5aW5nIHRvIGRlbGV0ZSB3b3JkIGxpc3QgOiAiICsgbVdvcmRMaXN0KTsKKyAgICAgICAgICAgIGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiID0gTWV0YWRhdGFEYkhlbHBlci5nZXREYihjb250ZXh0LCBtQ2xpZW50SWQpOworICAgICAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBNZXRhZGF0YURiSGVscGVyLmdldENvbnRlbnRWYWx1ZXNCeVdvcmRMaXN0SWQoZGIsCisgICAgICAgICAgICAgICAgICAgIG1Xb3JkTGlzdC5tSWQsIG1Xb3JkTGlzdC5tVmVyc2lvbik7CisgICAgICAgICAgICBpZiAobnVsbCA9PSB2YWx1ZXMpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJUcnlpbmcgdG8gc2V0IGEgbm9uLWV4aXN0aW5nIHdvcmRsaXN0IGZvciByZW1vdmFsLiBDYW5jZWxsaW5nLiIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIGludCBzdGF0dXMgPSB2YWx1ZXMuZ2V0QXNJbnRlZ2VyKE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0NPTFVNTik7CisgICAgICAgICAgICBpZiAoTWV0YWRhdGFEYkhlbHBlci5TVEFUVVNfREVMRVRJTkcgIT0gc3RhdHVzKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5leHBlY3RlZCBzdGF0dXMgZm9yIGZpbmlzaC1kZWxldGluZyBhIHdvcmQgbGlzdCBpbmZvIDogIiArIHN0YXR1cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVtb3RlRmlsZW5hbWUgPQorICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuZ2V0QXNTdHJpbmcoTWV0YWRhdGFEYkhlbHBlci5SRU1PVEVfRklMRU5BTUVfQ09MVU1OKTsKKyAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzbid0IGEgcmVtb3RlIGZpbGVuYW1lIGFueSBtb3JlLCB0aGVuIHdlIGRvbid0IGtub3cgd2hlcmUgdG8gZ2V0IHRoZSBmaWxlCisgICAgICAgICAgICAvLyBmcm9tIGFueSBtb3JlLCBzbyB3ZSByZW1vdmUgdGhlIGVudHJ5IGVudGlyZWx5LiBBcyBhIG1hdHRlciBvZiBmYWN0LCBpZiB0aGUgZmlsZSB3YXMKKyAgICAgICAgICAgIC8vIG1hcmtlZCBERUxFVElORyBidXQgZGlzYXBwZWFyZWQgZnJvbSB0aGUgbWV0YWRhdGEgb24gdGhlIHNlcnZlciwgaXQgZW5kZWQgdXAKKyAgICAgICAgICAgIC8vIHRoaXMgd2F5LgorICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHJlbW90ZUZpbGVuYW1lKSkgeworICAgICAgICAgICAgICAgIGRiLmRlbGV0ZShNZXRhZGF0YURiSGVscGVyLk1FVEFEQVRBX1RBQkxFX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICBNZXRhZGF0YURiSGVscGVyLldPUkRMSVNUSURfQ09MVU1OICsgIiA9ID8gQU5EICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBNZXRhZGF0YURiSGVscGVyLlZFUlNJT05fQ09MVU1OICsgIiA9ID8iLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgbVdvcmRMaXN0Lm1JZCwgSW50ZWdlci50b1N0cmluZyhtV29yZExpc3QubVZlcnNpb24pIH0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBNZXRhZGF0YURiSGVscGVyLm1hcmtFbnRyeUFzQXZhaWxhYmxlKGRiLCBtV29yZExpc3QubUlkLCBtV29yZExpc3QubVZlcnNpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gQW4gYWN0aW9uIGJhdGNoIGNvbnNpc3RzIG9mIGFuIG9yZGVyZWQgcXVldWUgb2YgQWN0aW9ucyB0aGF0IGNhbiBleGVjdXRlLgorICAgIHByaXZhdGUgZmluYWwgUXVldWU8QWN0aW9uPiBtQWN0aW9uczsKKworICAgIHB1YmxpYyBBY3Rpb25CYXRjaCgpIHsKKyAgICAgICAgbUFjdGlvbnMgPSBuZXcgTGlua2VkTGlzdDxBY3Rpb24+KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkKGZpbmFsIEFjdGlvbiBhKSB7CisgICAgICAgIG1BY3Rpb25zLmFkZChhKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgYWxsIHRoZSBhY3Rpb25zIG9mIGFub3RoZXIgYWN0aW9uIGJhdGNoLgorICAgICAqIEBwYXJhbSB0aGF0IHRoZSB1cGdyYWRlIHRvIG1lcmdlIGludG8gdGhpcyBvbmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYXBwZW5kKGZpbmFsIEFjdGlvbkJhdGNoIHRoYXQpIHsKKyAgICAgICAgZm9yIChmaW5hbCBBY3Rpb24gYSA6IHRoYXQubUFjdGlvbnMpIHsKKyAgICAgICAgICAgIGFkZChhKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgdGhpcyBiYXRjaC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0IGZvciBnZXR0aW5nIHJlc291cmNlcywgZGF0YWJhc2VzLCBzeXN0ZW0gc2VydmljZXMuCisgICAgICogQHBhcmFtIHJlcG9ydGVyIGEgUmVwb3J0ZXIgdG8gc2VuZCBlcnJvcnMgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZShmaW5hbCBDb250ZXh0IGNvbnRleHQsIGZpbmFsIFByb2JsZW1SZXBvcnRlciByZXBvcnRlcikgeworICAgICAgICBVdGlscy5sKCJFeGVjdXRpbmcgYSBiYXRjaCBvZiBhY3Rpb25zIik7CisgICAgICAgIFF1ZXVlPEFjdGlvbj4gcmVtYWluaW5nQWN0aW9ucyA9IG1BY3Rpb25zOworICAgICAgICB3aGlsZSAoIXJlbWFpbmluZ0FjdGlvbnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBmaW5hbCBBY3Rpb24gYSA9IHJlbWFpbmluZ0FjdGlvbnMucG9sbCgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBhLmV4ZWN1dGUoY29udGV4dCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGlmIChudWxsICE9IHJlcG9ydGVyKQorICAgICAgICAgICAgICAgICAgICByZXBvcnRlci5yZXBvcnQoZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9Bc3NldEZpbGVBZGRyZXNzLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9Bc3NldEZpbGVBZGRyZXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmViYjU5ZgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL0Fzc2V0RmlsZUFkZHJlc3MuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgKiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuZGljdGlvbmFyeXBhY2s7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKy8qKgorICogSW1tdXRhYmxlIGNsYXNzIHRvIGhvbGQgdGhlIGFkZHJlc3Mgb2YgYW4gYXNzZXQuCisgKiBBcyBvcHBvc2VkIHRvIGEgbm9ybWFsIGZpbGUsIGFuIGFzc2V0IGlzIHVzdWFsbHkgcmVwcmVzZW50ZWQgYXMgYSBjb250aWd1b3VzIGJ5dGUgYXJyYXkgaW4KKyAqIHRoZSBwYWNrYWdlIGZpbGUuIE9wZW4gaXQgY29ycmVjdGx5IHRodXMgcmVxdWlyZXMgdGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgaXQgaXMgaW4sIGJ1dAorICogYWxzbyB0aGUgb2Zmc2V0IGluIHRoZSBmaWxlIGFuZCB0aGUgbGVuZ3RoIG9mIHRoaXMgZGF0YS4gVGhpcyBjbGFzcyBlbmNhcHN1bGF0ZXMgdGhlc2UgdGhyZWUuCisgKi8KK2ZpbmFsIGNsYXNzIEFzc2V0RmlsZUFkZHJlc3MgeworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbUZpbGVuYW1lOworICAgIHB1YmxpYyBmaW5hbCBsb25nIG1PZmZzZXQ7CisgICAgcHVibGljIGZpbmFsIGxvbmcgbUxlbmd0aDsKKworICAgIHB1YmxpYyBBc3NldEZpbGVBZGRyZXNzKGZpbmFsIFN0cmluZyBmaWxlbmFtZSwgZmluYWwgbG9uZyBvZmZzZXQsIGZpbmFsIGxvbmcgbGVuZ3RoKSB7CisgICAgICAgIG1GaWxlbmFtZSA9IGZpbGVuYW1lOworICAgICAgICBtT2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICBtTGVuZ3RoID0gbGVuZ3RoOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ha2VzIGFuIEFzc2V0RmlsZUFkZHJlc3MuIFRoaXMgbWF5IHJldHVybiBudWxsLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGVuYW1lIHRoZSBmaWxlbmFtZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBhZGRyZXNzLCBvciBudWxsIGlmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0IG9yIHRoZSBwYXJhbWV0ZXJzIGFyZSBub3QgdmFsaWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBBc3NldEZpbGVBZGRyZXNzIG1ha2VGcm9tRmlsZU5hbWUoZmluYWwgU3RyaW5nIGZpbGVuYW1lKSB7CisgICAgICAgIGlmIChudWxsID09IGZpbGVuYW1lKSByZXR1cm4gbnVsbDsKKyAgICAgICAgZmluYWwgRmlsZSBmID0gbmV3IEZpbGUoZmlsZW5hbWUpOworICAgICAgICBpZiAoIWYuaXNGaWxlKCkpIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gbmV3IEFzc2V0RmlsZUFkZHJlc3MoZmlsZW5hbWUsIDBsLCBmLmxlbmd0aCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWtlcyBhbiBBc3NldEZpbGVBZGRyZXNzLiBUaGlzIG1heSByZXR1cm4gbnVsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgZmlsZW5hbWUuCisgICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0LgorICAgICAqIEBwYXJhbSBsZW5ndGggdGhlIGxlbmd0aC4KKyAgICAgKiBAcmV0dXJuIHRoZSBhZGRyZXNzLCBvciBudWxsIGlmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0IG9yIHRoZSBwYXJhbWV0ZXJzIGFyZSBub3QgdmFsaWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBBc3NldEZpbGVBZGRyZXNzIG1ha2VGcm9tRmlsZU5hbWVBbmRPZmZzZXQoZmluYWwgU3RyaW5nIGZpbGVuYW1lLAorICAgICAgICAgICAgZmluYWwgbG9uZyBvZmZzZXQsIGZpbmFsIGxvbmcgbGVuZ3RoKSB7CisgICAgICAgIGlmIChudWxsID09IGZpbGVuYW1lKSByZXR1cm4gbnVsbDsKKyAgICAgICAgZmluYWwgRmlsZSBmID0gbmV3IEZpbGUoZmlsZW5hbWUpOworICAgICAgICBpZiAoIWYuaXNGaWxlKCkpIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gbmV3IEFzc2V0RmlsZUFkZHJlc3MoZmlsZW5hbWUsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9CYWRGb3JtYXRFeGNlcHRpb24uamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL0JhZEZvcm1hdEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMDkwZGQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9CYWRGb3JtYXRFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgKiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuZGljdGlvbmFyeXBhY2s7CisKKy8qKgorICogRXhjZXB0aW9uIHRocm93biB3aGVuIHRoZSBtZXRhZGF0YSBmb3IgdGhlIGRpY3Rpb25hcnkgZG9lcyBub3QgY29tcGx5IHRvIGEga25vd24gZm9ybWF0LgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQmFkRm9ybWF0RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgQmFkRm9ybWF0RXhjZXB0aW9uKCkgeworICAgICAgICBzdXBlcigpOworICAgIH0KKworICAgIHB1YmxpYyBCYWRGb3JtYXRFeGNlcHRpb24oZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgc3VwZXIobWVzc2FnZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svQ29tbW9uUHJlZmVyZW5jZXMuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL0NvbW1vblByZWZlcmVuY2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MyN2U2ZAotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL0NvbW1vblByZWZlcmVuY2VzLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkKKyAqIG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5kaWN0aW9uYXJ5cGFjazsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlczsKKworcHVibGljIGZpbmFsIGNsYXNzIENvbW1vblByZWZlcmVuY2VzIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTU9OX1BSRUZFUkVOQ0VTX05BTUUgPSAiTGF0aW5JbWVEaWN0UHJlZnMiOworCisgICAgcHVibGljIHN0YXRpYyBTaGFyZWRQcmVmZXJlbmNlcyBnZXRDb21tb25QcmVmZXJlbmNlcyhmaW5hbCBDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0U2hhcmVkUHJlZmVyZW5jZXMoQ09NTU9OX1BSRUZFUkVOQ0VTX05BTUUsIENvbnRleHQuTU9ERV9XT1JMRF9SRUFEQUJMRSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGVuYWJsZShmaW5hbCBTaGFyZWRQcmVmZXJlbmNlcyBwcmVmLCBmaW5hbCBTdHJpbmcgaWQpIHsKKyAgICAgICAgZmluYWwgU2hhcmVkUHJlZmVyZW5jZXMuRWRpdG9yIGVkaXRvciA9IHByZWYuZWRpdCgpOworICAgICAgICBlZGl0b3IucHV0Qm9vbGVhbihpZCwgdHJ1ZSk7CisgICAgICAgIGVkaXRvci5hcHBseSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkaXNhYmxlKGZpbmFsIFNoYXJlZFByZWZlcmVuY2VzIHByZWYsIGZpbmFsIFN0cmluZyBpZCkgeworICAgICAgICBmaW5hbCBTaGFyZWRQcmVmZXJlbmNlcy5FZGl0b3IgZWRpdG9yID0gcHJlZi5lZGl0KCk7CisgICAgICAgIGVkaXRvci5wdXRCb29sZWFuKGlkLCBmYWxzZSk7CisgICAgICAgIGVkaXRvci5hcHBseSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL0NvbXBsZXRlZERvd25sb2FkSW5mby5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svQ29tcGxldGVkRG93bmxvYWRJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYxOTg3NQotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL0NvbXBsZXRlZERvd25sb2FkSW5mby5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmRpY3Rpb25hcnlwYWNrOworCitpbXBvcnQgYW5kcm9pZC5hcHAuRG93bmxvYWRNYW5hZ2VyOworCisvKioKKyAqIFN0cnVjdCBjbGFzcyB0byBlbmNhcHN1bGF0ZSB0aGUgcmVzdWx0IG9mIGEgY29tcGxldGVkIGRvd25sb2FkLgorICovCitwdWJsaWMgY2xhc3MgQ29tcGxldGVkRG93bmxvYWRJbmZvIHsKKyAgICBmaW5hbCBTdHJpbmcgbVVyaTsKKyAgICBmaW5hbCBsb25nIG1Eb3dubG9hZElkOworICAgIGZpbmFsIGludCBtU3RhdHVzOworICAgIHB1YmxpYyBDb21wbGV0ZWREb3dubG9hZEluZm8oZmluYWwgU3RyaW5nIHVyaSwgZmluYWwgbG9uZyBkb3dubG9hZElkLCBmaW5hbCBpbnQgc3RhdHVzKSB7CisgICAgICAgIG1VcmkgPSB1cmk7CisgICAgICAgIG1Eb3dubG9hZElkID0gZG93bmxvYWRJZDsKKyAgICAgICAgbVN0YXR1cyA9IHN0YXR1czsKKyAgICB9CisgICAgcHVibGljIGJvb2xlYW4gd2FzU3VjY2Vzc2Z1bCgpIHsKKyAgICAgICAgcmV0dXJuIERvd25sb2FkTWFuYWdlci5TVEFUVVNfU1VDQ0VTU0ZVTCA9PSBtU3RhdHVzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL0RpY3Rpb25hcnlQYWNrQ29uc3RhbnRzLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9EaWN0aW9uYXJ5UGFja0NvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjOGI0NjYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9EaWN0aW9uYXJ5UGFja0NvbnN0YW50cy5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAqIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5kaWN0aW9uYXJ5cGFjazsKKworLyoqCisgKiBBIGNsYXNzIHRvIGdyb3VwIGNvbnN0YW50cyBmb3IgZGljdGlvbmFyeSBwYWNrIHVzYWdlLgorICoKKyAqIFRoaXMgY2xhc3Mgb25seSBkZWZpbmVzIGNvbnN0YW50cy4gSXQgc2hvdWxkIG5vdCBtYWtlIGFueSByZWZlcmVuY2VzIHRvIG91dHNpZGUgY29kZSBhcyBmYXIgYXMKKyAqIHBvc3NpYmxlLCBhcyBpdCdzIHVzZWQgdG8gc2VwYXJhdGUgY2xlYW5seSB0aGUga2V5Ym9hcmQgY29kZSBmcm9tIHRoZSBkaWN0aW9uYXJ5IHBhY2sgY29kZTsgdGhpcworICogaXMgbmVlZGVkIGluIHBhcnRpY3VsYXIgdG8gY2xlYW5seSBjb21waWxlIHJlZ3Jlc3Npb24gdGVzdHMuCisgKi8KK3B1YmxpYyBjbGFzcyBEaWN0aW9uYXJ5UGFja0NvbnN0YW50cyB7CisgICAgLyoqCisgICAgICogQXV0aG9yaXR5IGZvciB0aGUgQ29udGVudFByb3ZpZGVyIHByb3RvY29sLgorICAgICAqLworICAgIC8vIFRPRE86IGZpbmQgc29tZSB3YXkgdG8gZmFjdG9yaXplIHRoaXMgc3RyaW5nIHdpdGggdGhlIG9uZSBpbiB0aGUgcmVzb3VyY2VzCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUSE9SSVRZID0gImNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmRpY3Rpb25hcnlwYWNrLmFvc3AiOworCisgICAgLyoqCisgICAgICogVGhlIGFjdGlvbiBvZiB0aGUgaW50ZW50IGZvciBwdWJsaXNoaW5nIHRoYXQgbmV3IGRpY3Rpb25hcnkgZGF0YSBpcyBhdmFpbGFibGUuCisgICAgICovCisgICAgLy8gVE9ETzogbWFrZSB0aGlzIGRpZmZlcmVudCBhY3Jvc3MgZGlmZmVyZW50IHBhY2thZ2VzLiBBIHN1Z2dlc3RlZCBjb3Vyc2Ugb2YgYWN0aW9uIGlzCisgICAgLy8gdG8gdXNlIHRoZSBwYWNrYWdlIG5hbWUgaW5zaWRlIHRoaXMgc3RyaW5nLgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19ESUNUSU9OQVJZX0lOVEVOVF9BQ1RJT04gPQorICAgICAgICAgICAgImNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmRpY3Rpb25hcnlwYWNrLm5ld2RpY3QiOworfQpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svRGljdGlvbmFyeVByb3ZpZGVyLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9EaWN0aW9uYXJ5UHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2IzYjhlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svRGljdGlvbmFyeVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw1MzMgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgKiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuZGljdGlvbmFyeXBhY2s7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LlVyaU1hdGNoZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldEZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQWJzdHJhY3RDdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uUjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKKy8qKgorICogUHJvdmlkZXIgZm9yIGRpY3Rpb25hcmllcy4KKyAqCisgKiBUaGlzIGNsYXNzIGlzIGEgQ29udGVudFByb3ZpZGVyIGV4cG9zaW5nIGFsbCBhdmFpbGFibGUgZGljdGlvbmFyeSBkYXRhIGFzIG1hbmFnZWQgYnkKKyAqIHRoZSBkaWN0aW9uYXJ5IHBhY2suCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBEaWN0aW9uYXJ5UHJvdmlkZXIgZXh0ZW5kcyBDb250ZW50UHJvdmlkZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBEaWN0aW9uYXJ5UHJvdmlkZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPQorICAgICAgICAgICAgVXJpLnBhcnNlKENvbnRlbnRSZXNvbHZlci5TQ0hFTUVfQ09OVEVOVCArICI6Ly8iICsgRGljdGlvbmFyeVBhY2tDb25zdGFudHMuQVVUSE9SSVRZKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfUEFSQU1FVEVSX01BWV9QUk9NUFRfVVNFUiA9ICJtYXlQcm9tcHQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9QQVJBTUVURVJfVFJVRSA9ICJ0cnVlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfUEFSQU1FVEVSX0RFTEVURV9SRVNVTFQgPSAicmVzdWx0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfUEFSQU1FVEVSX1NVQ0NFU1MgPSAic3VjY2VzcyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX1BBUkFNRVRFUl9GQUlMVVJFID0gImZhaWx1cmUiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX1BBUkFNRVRFUl9QUk9UT0NPTF9WRVJTSU9OID0gInByb3RvY29sIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9fTUFUQ0ggPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESUNUSU9OQVJZX1YxX1dIT0xFX0xJU1QgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESUNUSU9OQVJZX1YxX0RJQ1RfSU5GTyA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJQ1RJT05BUllfVjJfTUVUQURBVEEgPSAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESUNUSU9OQVJZX1YyX1dIT0xFX0xJU1QgPSA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESUNUSU9OQVJZX1YyX0RJQ1RfSU5GTyA9IDU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJQ1RJT05BUllfVjJfREFUQUZJTEUgPSA2OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVyaU1hdGNoZXIgc1VyaU1hdGNoZXJWMSA9IG5ldyBVcmlNYXRjaGVyKE5PX01BVENIKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVcmlNYXRjaGVyIHNVcmlNYXRjaGVyVjIgPSBuZXcgVXJpTWF0Y2hlcihOT19NQVRDSCk7CisgICAgc3RhdGljCisgICAgeworICAgICAgICBzVXJpTWF0Y2hlclYxLmFkZFVSSShEaWN0aW9uYXJ5UGFja0NvbnN0YW50cy5BVVRIT1JJVFksICJsaXN0IiwgRElDVElPTkFSWV9WMV9XSE9MRV9MSVNUKTsKKyAgICAgICAgc1VyaU1hdGNoZXJWMS5hZGRVUkkoRGljdGlvbmFyeVBhY2tDb25zdGFudHMuQVVUSE9SSVRZLCAiKiIsIERJQ1RJT05BUllfVjFfRElDVF9JTkZPKTsKKyAgICAgICAgc1VyaU1hdGNoZXJWMi5hZGRVUkkoRGljdGlvbmFyeVBhY2tDb25zdGFudHMuQVVUSE9SSVRZLCAiKi9tZXRhZGF0YSIsCisgICAgICAgICAgICAgICAgRElDVElPTkFSWV9WMl9NRVRBREFUQSk7CisgICAgICAgIHNVcmlNYXRjaGVyVjIuYWRkVVJJKERpY3Rpb25hcnlQYWNrQ29uc3RhbnRzLkFVVEhPUklUWSwgIiovbGlzdCIsIERJQ1RJT05BUllfVjJfV0hPTEVfTElTVCk7CisgICAgICAgIHNVcmlNYXRjaGVyVjIuYWRkVVJJKERpY3Rpb25hcnlQYWNrQ29uc3RhbnRzLkFVVEhPUklUWSwgIiovZGljdC8qIiwKKyAgICAgICAgICAgICAgICBESUNUSU9OQVJZX1YyX0RJQ1RfSU5GTyk7CisgICAgICAgIHNVcmlNYXRjaGVyVjIuYWRkVVJJKERpY3Rpb25hcnlQYWNrQ29uc3RhbnRzLkFVVEhPUklUWSwgIiovZGF0YWZpbGUvKiIsCisgICAgICAgICAgICAgICAgRElDVElPTkFSWV9WMl9EQVRBRklMRSk7CisgICAgfQorCisgICAgLy8gTUlNRSB0eXBlcyBmb3IgZGljdGlvbmFyeSBhbmQgZGljdGlvbmFyeSBsaXN0LCBhcyByZXF1aXJlZCBieSBDb250ZW50UHJvdmlkZXIgY29udHJhY3QuCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElDVF9MSVNUX01JTUVfVFlQRSA9CisgICAgICAgICAgICAidm5kLmFuZHJvaWQuY3Vyc29yLml0ZW0vdm5kLmdvb2dsZS5kaWN0aW9uYXJ5bGlzdCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElDVF9EQVRBRklMRV9NSU1FX1RZUEUgPQorICAgICAgICAgICAgInZuZC5hbmRyb2lkLmN1cnNvci5pdGVtL3ZuZC5nb29nbGUuZGljdGlvbmFyeSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9DQVRFR09SWV9TRVBBUkFUT1IgPSAiOiI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBXb3JkTGlzdEluZm8geworICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIG1JZDsKKyAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBtTG9jYWxlOworICAgICAgICBwdWJsaWMgZmluYWwgaW50IG1NYXRjaExldmVsOworICAgICAgICBwdWJsaWMgV29yZExpc3RJbmZvKGZpbmFsIFN0cmluZyBpZCwgZmluYWwgU3RyaW5nIGxvY2FsZSwgZmluYWwgaW50IG1hdGNoTGV2ZWwpIHsKKyAgICAgICAgICAgIG1JZCA9IGlkOworICAgICAgICAgICAgbUxvY2FsZSA9IGxvY2FsZTsKKyAgICAgICAgICAgIG1NYXRjaExldmVsID0gbWF0Y2hMZXZlbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY3Vyc29yIGZvciByZXR1cm5pbmcgYSBsaXN0IG9mIGZpbGUgaWRzIGZyb20gYSBMaXN0IG9mIHN0cmluZ3MuCisgICAgICoKKyAgICAgKiBUaGlzIHNpbXVsYXRlcyBvbmx5IHRoZSBuZWNlc3NhcnkgbWV0aG9kcy4gSXQgaGFzIG5vIGVycm9yIGhhbmRsaW5nIHRvIHNwZWFrIG9mLAorICAgICAqIGFuZCBkb2VzIG5vdCBzdXBwb3J0IGV2ZXJ5dGhpbmcgYSBkYXRhYmFzZSBkb2VzLCBvbmx5IGEgZmV3IHNlbGVjdCBuZWNlc3NhcnkgbWV0aG9kcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZVBhdGhDdXJzb3IgZXh0ZW5kcyBBYnN0cmFjdEN1cnNvciB7CisKKyAgICAgICAgLy8gQ29sdW1uIG5hbWVzIGZvciB0aGUgY3Vyc29yIHJldHVybmVkIGJ5IHRoaXMgY29udGVudCBwcm92aWRlci4KKyAgICAgICAgc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nW10gY29sdW1uTmFtZXMgPSB7ICJpZCIsICJsb2NhbGUiIH07CisKKyAgICAgICAgLy8gVGhlIGxpc3Qgb2Ygd29yZCBsaXN0cyBzZXJ2ZWQgYnkgdGhpcyBwcm92aWRlciB0aGF0IG1hdGNoIHRoZSBjbGllbnQgcmVxdWVzdC4KKyAgICAgICAgZmluYWwgV29yZExpc3RJbmZvW10gbVdvcmRMaXN0czsKKyAgICAgICAgLy8gTm90ZSA6IHRoZSBjdXJzb3IgYWxzbyB1c2VzIG1Qb3MsIHdoaWNoIGlzIGRlZmluZWQgaW4gQWJzdHJhY3RDdXJzb3IuCisKKyAgICAgICAgcHVibGljIFJlc291cmNlUGF0aEN1cnNvcihmaW5hbCBDb2xsZWN0aW9uPFdvcmRMaXN0SW5mbz4gd29yZExpc3RzKSB7CisgICAgICAgICAgICAvLyBBbGxvY2F0aW5nIGEgMC1zaXplIFdvcmRMaXN0SW5mbyBoZXJlIGFsbG93cyB0aGUgdG9BcnJheSgpIG1ldGhvZAorICAgICAgICAgICAgLy8gdG8gZW5zdXJlIHdlIGhhdmUgYSBzdHJvbmdseS10eXBlZCBhcnJheS4gSXQncyB0aHJvd24gb3V0LiBUaGF0J3MKKyAgICAgICAgICAgIC8vIHdoYXQgdGhlIGRvY3VtZW50YXRpb24gb2YgI3RvQXJyYXkgc2F5cyB0byBkbyBpbiBvcmRlciB0byBnZXQgYQorICAgICAgICAgICAgLy8gbmV3IHN0cm9uZ2x5IHR5cGVkIGFycmF5IG9mIHRoZSBjb3JyZWN0IHNpemUuCisgICAgICAgICAgICBtV29yZExpc3RzID0gd29yZExpc3RzLnRvQXJyYXkobmV3IFdvcmRMaXN0SW5mb1swXSk7CisgICAgICAgICAgICBtUG9zID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q29sdW1uTmFtZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gY29sdW1uTmFtZXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtV29yZExpc3RzLmxlbmd0aDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgZG91YmxlIGdldERvdWJsZShpbnQgY29sdW1uKSB7IHJldHVybiAwOyB9CisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgZmxvYXQgZ2V0RmxvYXQoaW50IGNvbHVtbikgeyByZXR1cm4gMDsgfQorICAgICAgICBAT3ZlcnJpZGUgcHVibGljIGludCBnZXRJbnQoaW50IGNvbHVtbikgeyByZXR1cm4gMDsgfQorICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHNob3J0IGdldFNob3J0KGludCBjb2x1bW4pIHsgcmV0dXJuIDA7IH0KKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBsb25nIGdldExvbmcoaW50IGNvbHVtbikgeyByZXR1cm4gMDsgfQorCisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhmaW5hbCBpbnQgY29sdW1uKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGNvbHVtbikgeworICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIG1Xb3JkTGlzdHNbbVBvc10ubUlkOworICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIG1Xb3JkTGlzdHNbbVBvc10ubUxvY2FsZTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0IDogcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNOdWxsKGZpbmFsIGludCBjb2x1bW4pIHsKKyAgICAgICAgICAgIGlmIChtUG9zID49IG1Xb3JkTGlzdHMubGVuZ3RoKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBjb2x1bW4gIT0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgbWF0Y2hVcmkoZmluYWwgVXJpIHVyaSkgeworICAgICAgICBpbnQgcHJvdG9jb2xWZXJzaW9uID0gMTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHByb3RvY29sVmVyc2lvbkFyZyA9IHVyaS5nZXRRdWVyeVBhcmFtZXRlcihRVUVSWV9QQVJBTUVURVJfUFJPVE9DT0xfVkVSU0lPTik7CisgICAgICAgIGlmICgiMiIuZXF1YWxzKHByb3RvY29sVmVyc2lvbkFyZykpIHByb3RvY29sVmVyc2lvbiA9IDI7CisgICAgICAgIHN3aXRjaCAocHJvdG9jb2xWZXJzaW9uKSB7CisgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBzVXJpTWF0Y2hlclYxLm1hdGNoKHVyaSk7CisgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBzVXJpTWF0Y2hlclYyLm1hdGNoKHVyaSk7CisgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gTk9fTUFUQ0g7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Q2xpZW50SWQoZmluYWwgVXJpIHVyaSkgeworICAgICAgICBpbnQgcHJvdG9jb2xWZXJzaW9uID0gMTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHByb3RvY29sVmVyc2lvbkFyZyA9IHVyaS5nZXRRdWVyeVBhcmFtZXRlcihRVUVSWV9QQVJBTUVURVJfUFJPVE9DT0xfVkVSU0lPTik7CisgICAgICAgIGlmICgiMiIuZXF1YWxzKHByb3RvY29sVmVyc2lvbkFyZykpIHByb3RvY29sVmVyc2lvbiA9IDI7CisgICAgICAgIHN3aXRjaCAocHJvdG9jb2xWZXJzaW9uKSB7CisgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBudWxsOyAvLyBJbiBwcm90b2NvbCAxLCB0aGUgY2xpZW50IElEIGlzIGFsd2F5cyBudWxsLgorICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gdXJpLmdldFBhdGhTZWdtZW50cygpLmdldCgwKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgTUlNRSB0eXBlIG9mIHRoZSBjb250ZW50IGFzc29jaWF0ZWQgd2l0aCBhbiBVcmkKKyAgICAgKgorICAgICAqIEBzZWUgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlciNnZXRUeXBlKGFuZHJvaWQubmV0LlVyaSkKKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgdGhlIFVSSSBvZiB0aGUgY29udGVudCB0aGUgdHlwZSBvZiB3aGljaCBzaG91bGQgYmUgcmV0dXJuZWQuCisgICAgICogQHJldHVybiB0aGUgTUlNRSB0eXBlLCBvciBudWxsIGlmIHRoZSBVUkwgaXMgbm90IHJlY29nbml6ZWQuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRUeXBlKGZpbmFsIFVyaSB1cmkpIHsKKyAgICAgICAgUHJpdmF0ZUxvZy5sb2coIkFza2VkIGZvciB0eXBlIG9mIDogIiArIHVyaSwgdGhpcyk7CisgICAgICAgIGZpbmFsIGludCBtYXRjaCA9IG1hdGNoVXJpKHVyaSk7CisgICAgICAgIHN3aXRjaCAobWF0Y2gpIHsKKyAgICAgICAgICAgIGNhc2UgTk9fTUFUQ0g6IHJldHVybiBudWxsOworICAgICAgICAgICAgY2FzZSBESUNUSU9OQVJZX1YxX1dIT0xFX0xJU1Q6CisgICAgICAgICAgICBjYXNlIERJQ1RJT05BUllfVjFfRElDVF9JTkZPOgorICAgICAgICAgICAgY2FzZSBESUNUSU9OQVJZX1YyX1dIT0xFX0xJU1Q6CisgICAgICAgICAgICBjYXNlIERJQ1RJT05BUllfVjJfRElDVF9JTkZPOiByZXR1cm4gRElDVF9MSVNUX01JTUVfVFlQRTsKKyAgICAgICAgICAgIGNhc2UgRElDVElPTkFSWV9WMl9EQVRBRklMRTogcmV0dXJuIERJQ1RfREFUQUZJTEVfTUlNRV9UWVBFOworICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBRdWVyeSB0aGUgcHJvdmlkZXIgZm9yIGRpY3Rpb25hcnkgZmlsZXMuCisgICAgICoKKyAgICAgKiBUaGlzIHZlcnNpb24gZGlzcGF0Y2hlcyB0aGUgcXVlcnkgYWNjb3JkaW5nIHRvIHRoZSBwcm90b2NvbCB2ZXJzaW9uIGZvdW5kIGluIHRoZQorICAgICAqID9wcm90b2NvbD0gcXVlcnkgcGFyYW1ldGVyLiBJZiBhYnNlbnQgb3Igbm90IHdlbGwtZm9ybWVkLCBpdCBkZWZhdWx0cyB0byAxLgorICAgICAqIEBzZWUgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlciNxdWVyeShVcmksIFN0cmluZ1tdLCBTdHJpbmcsIFN0cmluZ1tdLCBTdHJpbmcpCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIGEgY29udGVudCB1cmkgKHNlZSBzVXJpTWF0Y2hlclZ7MSwyfSBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZSBmb3IgZm9ybWF0KQorICAgICAqIEBwYXJhbSBwcm9qZWN0aW9uIGlnbm9yZWQuIEFsbCBjb2x1bW5zIGFyZSBhbHdheXMgcmV0dXJuZWQuCisgICAgICogQHBhcmFtIHNlbGVjdGlvbiBpZ25vcmVkLgorICAgICAqIEBwYXJhbSBzZWxlY3Rpb25BcmdzIGlnbm9yZWQuCisgICAgICogQHBhcmFtIHNvcnRPcmRlciBpZ25vcmVkLiBUaGUgcmVzdWx0cyBhcmUgYWx3YXlzIHJldHVybmVkIGluIG5vIHBhcnRpY3VsYXIgb3JkZXIuCisgICAgICogQHJldHVybiBhIGN1cnNvciBtYXRjaGluZyB0aGUgdXJpLCBvciBudWxsIGlmIHRoZSBVUkkgd2FzIG5vdCByZWNvZ25pemVkLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDdXJzb3IgcXVlcnkoZmluYWwgVXJpIHVyaSwgZmluYWwgU3RyaW5nW10gcHJvamVjdGlvbiwgZmluYWwgU3RyaW5nIHNlbGVjdGlvbiwKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsIGZpbmFsIFN0cmluZyBzb3J0T3JkZXIpIHsKKyAgICAgICAgVXRpbHMubCgiVXJpID0iLCB1cmkpOworICAgICAgICBQcml2YXRlTG9nLmxvZygiUXVlcnkgOiAiICsgdXJpLCB0aGlzKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGNsaWVudElkID0gZ2V0Q2xpZW50SWQodXJpKTsKKyAgICAgICAgZmluYWwgaW50IG1hdGNoID0gbWF0Y2hVcmkodXJpKTsKKyAgICAgICAgc3dpdGNoIChtYXRjaCkgeworICAgICAgICAgICAgY2FzZSBESUNUSU9OQVJZX1YxX1dIT0xFX0xJU1Q6CisgICAgICAgICAgICBjYXNlIERJQ1RJT05BUllfVjJfV0hPTEVfTElTVDoKKyAgICAgICAgICAgICAgICBmaW5hbCBDdXJzb3IgYyA9IE1ldGFkYXRhRGJIZWxwZXIucXVlcnlEaWN0aW9uYXJpZXMoZ2V0Q29udGV4dCgpLCBjbGllbnRJZCk7CisgICAgICAgICAgICAgICAgVXRpbHMubCgiTGlzdCBvZiBkaWN0aW9uYXJpZXMgd2l0aCBjb3VudCIsIGMuZ2V0Q291bnQoKSk7CisgICAgICAgICAgICAgICAgUHJpdmF0ZUxvZy5sb2coIlJldHVybmVkIGEgbGlzdCBvZiAiICsgYy5nZXRDb3VudCgpICsgIiBpdGVtcyIsIHRoaXMpOworICAgICAgICAgICAgICAgIHJldHVybiBjOworICAgICAgICAgICAgY2FzZSBESUNUSU9OQVJZX1YyX0RJQ1RfSU5GTzoKKyAgICAgICAgICAgICAgICAvLyBJbiBwcm90b2NvbCB2ZXJzaW9uIDIsIHdlIHJldHVybiBudWxsIGlmIHRoZSBjbGllbnQgaXMgdW5rbm93bi4gT3RoZXJ3aXNlCisgICAgICAgICAgICAgICAgLy8gd2UgYmVoYXZlIGV4YWN0bHkgbGlrZSBmb3IgcHJvdG9jb2wgMS4KKyAgICAgICAgICAgICAgICBpZiAoIU1ldGFkYXRhRGJIZWxwZXIuaXNDbGllbnRLbm93bihnZXRDb250ZXh0KCksIGNsaWVudElkKSkgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgLy8gRmFsbCB0aHJvdWdoCisgICAgICAgICAgICBjYXNlIERJQ1RJT05BUllfVjFfRElDVF9JTkZPOgorICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsb2NhbGUgPSB1cmkuZ2V0TGFzdFBhdGhTZWdtZW50KCk7CisgICAgICAgICAgICAgICAgLy8gSWYgTGF0aW5JTUUgZG9lcyBub3QgaGF2ZSBhIGRpY3Rpb25hcnkgZm9yIHRoaXMgbG9jYWxlIGF0IGFsbCwgaXQgd2lsbAorICAgICAgICAgICAgICAgIC8vIHNlbmQgdXMgdHJ1ZSBmb3IgdGhpcyB2YWx1ZS4gSW4gdGhpcyBjYXNlLCB3ZSBtYXkgcHJvbXB0IHRoZSB1c2VyIGZvcgorICAgICAgICAgICAgICAgIC8vIGEgZGVjaXNpb24gYWJvdXQgZG93bmxvYWRpbmcgYSBkaWN0aW9uYXJ5IGV2ZW4gb3ZlciBhIG1ldGVyZWQgY29ubmVjdGlvbi4KKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWF5UHJvbXB0VmFsdWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgdXJpLmdldFF1ZXJ5UGFyYW1ldGVyKFFVRVJZX1BBUkFNRVRFUl9NQVlfUFJPTVBUX1VTRVIpOworICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gbWF5UHJvbXB0ID0gUVVFUllfUEFSQU1FVEVSX1RSVUUuZXF1YWxzKG1heVByb21wdFZhbHVlKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPFdvcmRMaXN0SW5mbz4gZGljdEZpbGVzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGdldERpY3Rpb25hcnlXb3JkTGlzdHNGb3JMb2NhbGUoY2xpZW50SWQsIGxvY2FsZSwgbWF5UHJvbXB0KTsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBwYXNzIGNsaWVudElkIHRvIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5U2VydmljZS51cGRhdGVOb3dJZk5vdFVwZGF0ZWRJbkFWZXJ5TG9uZ1RpbWUoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBkaWN0RmlsZXMgJiYgZGljdEZpbGVzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgUHJpdmF0ZUxvZy5sb2coIlJldHVybmVkICIgKyBkaWN0RmlsZXMuc2l6ZSgpICsgIiBmaWxlcyIsIHRoaXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlUGF0aEN1cnNvcihkaWN0RmlsZXMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFByaXZhdGVMb2cubG9nKCJObyBkaWN0aW9uYXJ5IGZpbGVzIGZvciB0aGlzIFVSTCIsIHRoaXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlUGF0aEN1cnNvcihDb2xsZWN0aW9ucy48V29yZExpc3RJbmZvPmVtcHR5TGlzdCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBWMl9NRVRBREFUQSBhbmQgVjJfREFUQUZJTEUgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIHF1ZXJ5KCkKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGdldCB0aGUgd29yZGxpc3QgbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIGEgd29yZGxpc3QgSUQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xpZW50SWQgdGhlIElEIG9mIHRoZSBjbGllbnQKKyAgICAgKiBAcGFyYW0gd29yZGxpc3RJZCB0aGUgSUQgb2YgdGhlIHdvcmRsaXN0IGZvciB3aGljaCB0byBnZXQgdGhlIG1ldGFkYXRhLgorICAgICAqIEByZXR1cm4gdGhlIG1ldGFkYXRhIGZvciB0aGlzIHdvcmRsaXN0IElELCBvciBudWxsIGlmIG5vbmUgY291bGQgYmUgZm91bmQuCisgICAgICovCisgICAgcHJpdmF0ZSBDb250ZW50VmFsdWVzIGdldFdvcmRsaXN0TWV0YWRhdGFGb3JXb3JkbGlzdElkKGZpbmFsIFN0cmluZyBjbGllbnRJZCwKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB3b3JkbGlzdElkKSB7CisgICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IGdldENvbnRleHQoKTsKKyAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHdvcmRsaXN0SWQpKSByZXR1cm4gbnVsbDsKKyAgICAgICAgZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIgPSBNZXRhZGF0YURiSGVscGVyLmdldERiKGNvbnRleHQsIGNsaWVudElkKTsKKyAgICAgICAgcmV0dXJuIE1ldGFkYXRhRGJIZWxwZXIuZ2V0SW5zdGFsbGVkT3JEZWxldGluZ1dvcmRMaXN0Q29udGVudFZhbHVlc0J5V29yZExpc3RJZCgKKyAgICAgICAgICAgICAgICBkYiwgd29yZGxpc3RJZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3BlbnMgYW4gYXNzZXQgZmlsZSBmb3IgYW4gVVJJLgorICAgICAqCisgICAgICogQ2FsbGVkIGJ5IHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyI29wZW5Bc3NldEZpbGVEZXNjcmlwdG9yKFVyaSwgU3RyaW5nKX0gb3IKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlciNvcGVuSW5wdXRTdHJlYW0oVXJpKX0gZnJvbSBhIGNsaWVudCByZXF1ZXN0aW5nIGEKKyAgICAgKiBkaWN0aW9uYXJ5LgorICAgICAqIEBzZWUgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlciNvcGVuQXNzZXRGaWxlKFVyaSwgU3RyaW5nKQorICAgICAqCisgICAgICogQHBhcmFtIHVyaSB0aGUgVVJJIHRoZSBmaWxlIGlzIGZvci4KKyAgICAgKiBAcGFyYW0gbW9kZSB0aGUgbW9kZSB0byByZWFkIHRoZSBmaWxlLiBNVVNUIGJlICJyIiBmb3IgcmVhZG9ubHkuCisgICAgICogQHJldHVybiB0aGUgZGVzY3JpcHRvciwgb3IgbnVsbCBpZiB0aGUgZmlsZSBpcyBub3QgZm91bmQgb3IgaWYgbW9kZSBpcyBub3QgZXF1YWxzIHRvICJyIi4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQXNzZXRGaWxlRGVzY3JpcHRvciBvcGVuQXNzZXRGaWxlKGZpbmFsIFVyaSB1cmksIGZpbmFsIFN0cmluZyBtb2RlKSB7CisgICAgICAgIGlmIChudWxsID09IG1vZGUgfHwgISJyIi5lcXVhbHMobW9kZSkpIHJldHVybiBudWxsOworCisgICAgICAgIGZpbmFsIGludCBtYXRjaCA9IG1hdGNoVXJpKHVyaSk7CisgICAgICAgIGlmIChESUNUSU9OQVJZX1YxX0RJQ1RfSU5GTyAhPSBtYXRjaCAmJiBESUNUSU9OQVJZX1YyX0RBVEFGSUxFICE9IG1hdGNoKSB7CisgICAgICAgICAgICAvLyBVbnN1cHBvcnRlZCBVUkkgZm9yIG9wZW5Bc3NldEZpbGUKKyAgICAgICAgICAgIExvZy53KFRBRywgIlVuc3VwcG9ydGVkIFVSSSBmb3Igb3BlbkFzc2V0RmlsZSA6ICIgKyB1cmkpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgU3RyaW5nIHdvcmRsaXN0SWQgPSB1cmkuZ2V0TGFzdFBhdGhTZWdtZW50KCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBjbGllbnRJZCA9IGdldENsaWVudElkKHVyaSk7CisgICAgICAgIGZpbmFsIENvbnRlbnRWYWx1ZXMgd29yZExpc3QgPSBnZXRXb3JkbGlzdE1ldGFkYXRhRm9yV29yZGxpc3RJZChjbGllbnRJZCwgd29yZGxpc3RJZCk7CisKKyAgICAgICAgaWYgKG51bGwgPT0gd29yZExpc3QpIHJldHVybiBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgc3RhdHVzID0gd29yZExpc3QuZ2V0QXNJbnRlZ2VyKE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0NPTFVNTik7CisgICAgICAgICAgICBpZiAoTWV0YWRhdGFEYkhlbHBlci5TVEFUVVNfREVMRVRJTkcgPT0gc3RhdHVzKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyB3aWxsIHJldHVybiBhbiBlbXB0eSBmaWxlIChSLnJhdy5lbXB0eSBwb2ludHMgYXQgYW4gZW1wdHkgZGljdGlvbmFyeSkKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGhvdyB3ZSAiZGVsZXRlIiB0aGUgZmlsZXMuIEl0IGFsbG93cyBBbmRyb2lkIEtleWJvYXJkIHRvIGZha2UgZGVsZXRpbmcKKyAgICAgICAgICAgICAgICAvLyBhIGRlZmF1bHQgZGljdGlvbmFyeSAtIHdoaWNoIGlzIGFjdHVhbGx5IGluIGl0cyBhc3NldHMgYW5kIGNhbid0IGJlIHJlYWxseQorICAgICAgICAgICAgICAgIC8vIGRlbGV0ZWQuCisgICAgICAgICAgICAgICAgZmluYWwgQXNzZXRGaWxlRGVzY3JpcHRvciBhZmQgPSBnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkub3BlblJhd1Jlc291cmNlRmQoCisgICAgICAgICAgICAgICAgICAgICAgICBSLnJhdy5lbXB0eSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFmZDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxvY2FsRmlsZW5hbWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgd29yZExpc3QuZ2V0QXNTdHJpbmcoTWV0YWRhdGFEYkhlbHBlci5MT0NBTF9GSUxFTkFNRV9DT0xVTU4pOworICAgICAgICAgICAgICAgIGZpbmFsIEZpbGUgZiA9IGdldENvbnRleHQoKS5nZXRGaWxlU3RyZWFtUGF0aChsb2NhbEZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBQYXJjZWxGaWxlRGVzY3JpcHRvciBwZmQgPQorICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3Iub3BlbihmLCBQYXJjZWxGaWxlRGVzY3JpcHRvci5NT0RFX1JFQURfT05MWSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBc3NldEZpbGVEZXNjcmlwdG9yKHBmZCwgMCwgcGZkLmdldFN0YXRTaXplKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gTm8gZmlsZSA6IGZhbGwgdGhyb3VnaCBhbmQgcmV0dXJuIG51bGwKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyB0aGUgbWV0YWRhdGEgYW5kIHJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YgZGljdGlvbmFyaWVzIGZvciBhIGdpdmVuIGxvY2FsZS4KKyAgICAgKgorICAgICAqIFdvcmQgbGlzdCBJRHMgYXJlIGV4cGVjdGVkIHRvIGJlIGluIHRoZSBmb3JtIGNhdGVnb3J5Om1hbnVhbF9pZC4gVGhpcyBtZXRob2QKKyAgICAgKiB3aWxsIHNlbGVjdCBvbmx5IG9uZSB3b3JkIGxpc3QgZm9yIGVhY2ggY2F0ZWdvcnk6IHRoZSBvbmUgd2l0aCB0aGUgbW9zdCBzcGVjaWZpYworICAgICAqIGxvY2FsZSBtYXRjaGluZyB0aGUgbG9jYWxlIHNwZWNpZmllZCBpbiB0aGUgVVJJLiBUaGUgbWFudWFsIGlkIHNlcnZlcyBvbmx5IHRvCisgICAgICogZGlzdGluZ3Vpc2ggYSB3b3JkIGxpc3QgZnJvbSBhbm90aGVyIGZvciB0aGUgcHVycG9zZSBvZiB1cGRhdGluZywgYW5kIGlzIGFyYml0cmFyeQorICAgICAqIGJ1dCBtYXkgbm90IGNvbnRhaW4gYSBjb2xvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGllbnRJZCB0aGUgSUQgb2YgdGhlIGNsaWVudCByZXF1ZXN0aW5nIHRoZSBsaXN0CisgICAgICogQHBhcmFtIGxvY2FsZSB0aGUgbG9jYWxlIGZvciB3aGljaCB3ZSB3YW50IHRoZSBsaXN0LCBhcyBhIFN0cmluZworICAgICAqIEBwYXJhbSBtYXlQcm9tcHQgdHJ1ZSBpZiB3ZSBhcmUgYWxsb3dlZCB0byBwcm9tcHQgdGhlIHVzZXIgZm9yIGFyYml0cmF0aW9uIHZpYSBub3RpZmljYXRpb24KKyAgICAgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiBpZHMuIEl0IGlzIGd1YXJhbnRlZWQgdG8gYmUgbm9uLW51bGwsIGJ1dCBtYXkgYmUgZW1wdHkuCisgICAgICovCisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPFdvcmRMaXN0SW5mbz4gZ2V0RGljdGlvbmFyeVdvcmRMaXN0c0ZvckxvY2FsZShmaW5hbCBTdHJpbmcgY2xpZW50SWQsCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYWxlLCBmaW5hbCBib29sZWFuIG1heVByb21wdCkgeworICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBnZXRDb250ZXh0KCk7CisgICAgICAgIGZpbmFsIEN1cnNvciByZXN1bHRzID0KKyAgICAgICAgICAgICAgICBNZXRhZGF0YURiSGVscGVyLnF1ZXJ5SW5zdGFsbGVkT3JEZWxldGluZ09yQXZhaWxhYmxlRGljdGlvbmFyeU1ldGFkYXRhKGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRJZCk7CisgICAgICAgIGlmIChudWxsID09IHJlc3VsdHMpIHsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy48V29yZExpc3RJbmZvPmVtcHR5TGlzdCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmluYWwgSGFzaE1hcDxTdHJpbmcsIFdvcmRMaXN0SW5mbz4gZGljdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFdvcmRMaXN0SW5mbz4oKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBpZEluZGV4ID0gcmVzdWx0cy5nZXRDb2x1bW5JbmRleChNZXRhZGF0YURiSGVscGVyLldPUkRMSVNUSURfQ09MVU1OKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBsb2NhbGVJbmRleCA9IHJlc3VsdHMuZ2V0Q29sdW1uSW5kZXgoTWV0YWRhdGFEYkhlbHBlci5MT0NBTEVfQ09MVU1OKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBsb2NhbEZpbGVOYW1lSW5kZXggPQorICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmdldENvbHVtbkluZGV4KE1ldGFkYXRhRGJIZWxwZXIuTE9DQUxfRklMRU5BTUVfQ09MVU1OKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBzdGF0dXNJbmRleCA9IHJlc3VsdHMuZ2V0Q29sdW1uSW5kZXgoTWV0YWRhdGFEYkhlbHBlci5TVEFUVVNfQ09MVU1OKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHRzLm1vdmVUb0ZpcnN0KCkpIHsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB3b3JkTGlzdElkID0gcmVzdWx0cy5nZXRTdHJpbmcoaWRJbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eSh3b3JkTGlzdElkKSkgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIHdvcmRMaXN0SWRBcnJheSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFV0aWxzLnNwbGl0KHdvcmRMaXN0SWQsIElEX0NBVEVHT1JZX1NFUEFSQVRPUik7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB3b3JkTGlzdENhdGVnb3J5OworICAgICAgICAgICAgICAgICAgICBpZiAoMiA9PSB3b3JkTGlzdElkQXJyYXkubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGF0IHRoZSBjYXRlZ29yeTptYW51YWxfaWQgZm9ybWF0LgorICAgICAgICAgICAgICAgICAgICAgICAgd29yZExpc3RDYXRlZ29yeSA9IHdvcmRMaXN0SWRBcnJheVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gcmVhZCB3b3JkTGlzdElkQXJyYXlbMV0gaGVyZSwgYmVjYXVzZSBpdCdzIGlycmVsZXZhbnQgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvcmQgbGlzdCBzZWxlY3Rpb24gLSBpdCdzIGp1c3QgYSBuYW1lIHdlIHVzZSB0byBpZGVudGlmeSB3aGljaCBkYXRhIGZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIGEgbmV3ZXIgdmVyc2lvbiBvZiB3aGljaCB3b3JkIGxpc3QuIFdlIGRvIGhvd2V2ZXIgcmV0dXJuIHRoZSBmdWxsIGlkCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdHJpbmcgZm9yIGVhY2ggc2VsZWN0ZWQgd29yZCBsaXN0LCBzbyBpbiB0aGlzIHNlbnNlIHdlIGFyZSAndXNpbmcnIGl0LgorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBkb2VzIG5vdCBjb250YWluIGEgY29sb24sIGxpa2UgdGhlIG9sZCBmb3JtYXQgZG9lcy4gT2xkLWZvcm1hdCBJRHMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBwb2ludCB0byBtYWluIGRpY3Rpb25hcmllcywgc28gd2UgZm9yY2UgdGhlIG1haW4gY2F0ZWdvcnkgdXBvbiBpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRMaXN0Q2F0ZWdvcnkgPSBVcGRhdGVIYW5kbGVyLk1BSU5fRElDVElPTkFSWV9DQVRFR09SWTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgd29yZExpc3RMb2NhbGUgPSByZXN1bHRzLmdldFN0cmluZyhsb2NhbGVJbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB3b3JkTGlzdExvY2FsRmlsZW5hbWUgPSByZXN1bHRzLmdldFN0cmluZyhsb2NhbEZpbGVOYW1lSW5kZXgpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgd29yZExpc3RTdGF0dXMgPSByZXN1bHRzLmdldEludChzdGF0dXNJbmRleCk7CisgICAgICAgICAgICAgICAgICAgIC8vIFRlc3QgdGhlIHJlcXVlc3RlZCBsb2NhbGUgYWdhaW5zdCB0aGlzIHdvcmRsaXN0IGxvY2FsZS4gVGhlIHJlcXVlc3RlZCBsb2NhbGUKKyAgICAgICAgICAgICAgICAgICAgLy8gaGFzIHRvIGVpdGhlciBtYXRjaCBleGFjdGx5IG9yIGJlIG1vcmUgc3BlY2lmaWMgdGhhbiB0aGUgZGljdGlvbmFyeSAtIGEKKyAgICAgICAgICAgICAgICAgICAgLy8gZGljdGlvbmFyeSBmb3IgImVuIiB3b3VsZCBtYXRjaCBib3RoIGEgcmVxdWVzdCBmb3IgImVuIiBvciBmb3IgImVuX1VTIiwgYnV0IGEKKyAgICAgICAgICAgICAgICAgICAgLy8gZGljdGlvbmFyeSBmb3IgImVuX0dCIiB3b3VsZCBub3QgbWF0Y2ggYSByZXF1ZXN0IGZvciAiZW5fVVMiLiBUaHVzIGlmIGFsbAorICAgICAgICAgICAgICAgICAgICAvLyB0aHJlZSBvZiAiZW4iICJlbl9VUyIgYW5kICJlbl9HQiIgZGljdGlvbmFyaWVzIGFyZSBpbnN0YWxsZWQsIGEgcmVxdWVzdCBmb3IKKyAgICAgICAgICAgICAgICAgICAgLy8gImVuX1VTIiB3b3VsZCBtYXRjaCAiZW4iIGFuZCAiZW5fVVMiLCBhbmQgYSByZXF1ZXN0IGZvciAiZW4iIG9ubHkgd291bGQgb25seQorICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaCB0aGUgZ2VuZXJpYyAiZW4iIGRpY3Rpb25hcnkuIEZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUgZG9jdW1lbnRhdGlvbgorICAgICAgICAgICAgICAgICAgICAvLyBmb3IgTG9jYWxlVXRpbHMjZ2V0TWF0Y2hMZXZlbC4KKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG1hdGNoTGV2ZWwgPSBMb2NhbGVVdGlscy5nZXRNYXRjaExldmVsKHdvcmRMaXN0TG9jYWxlLCBsb2NhbGUpOworICAgICAgICAgICAgICAgICAgICBpZiAoIUxvY2FsZVV0aWxzLmlzTWF0Y2gobWF0Y2hMZXZlbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBsb2NhbGUgb2YgdGhpcyB3b3JkbGlzdCBkb2VzIG5vdCBtYXRjaCB0aGUgcmVxdWlyZWQgbG9jYWxlLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCB0aGlzIHdvcmRsaXN0IGFuZCBnbyB0byB0aGUgbmV4dC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChNZXRhZGF0YURiSGVscGVyLlNUQVRVU19JTlNUQUxMRUQgPT0gd29yZExpc3RTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCBpdCBoYXMgYmVlbiBkZWxldGVkIGFuZCB0aGUgSU1FIHNob3VsZAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBoYXZlIGl0LiBEbyBub3QgcmV0dXJuIGl0LiBIb3dldmVyLCB0aGlzIG9ubHkgYXBwbGllcyBpZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvcmQgbGlzdCBpcyBJTlNUQUxMRUQsIGZvciBpZiBpdCBpcyBERUxFVElORyB3ZSBzaG91bGQgcmV0dXJuIGl0IGFsd2F5cworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gdGhhdCBBbmRyb2lkIEtleWJvYXJkIGNhbiBwZXJmb3JtIHRoZSBhY3R1YWwgZGVsZXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIGYgPSBnZXRDb250ZXh0KCkuZ2V0RmlsZVN0cmVhbVBhdGgod29yZExpc3RMb2NhbEZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5pc0ZpbGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0FWQUlMQUJMRSA9PSB3b3JkTGlzdFN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGxvY2FsZSBpcyB0aGUgaWQgZm9yIHRoZSBtYWluIGRpY3Rpb25hcnkuCisgICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGVIYW5kbGVyLmluc3RhbGxJZk5ldmVyUmVxdWVzdGVkKGNvbnRleHQsIGNsaWVudElkLCB3b3JkTGlzdElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXlQcm9tcHQpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZmluYWwgV29yZExpc3RJbmZvIGN1cnJlbnRCZXN0TWF0Y2ggPSBkaWN0cy5nZXQod29yZExpc3RDYXRlZ29yeSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09IGN1cnJlbnRCZXN0TWF0Y2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBjdXJyZW50QmVzdE1hdGNoLm1NYXRjaExldmVsIDwgbWF0Y2hMZXZlbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGljdHMucHV0KHdvcmRMaXN0Q2F0ZWdvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBXb3JkTGlzdEluZm8od29yZExpc3RJZCwgd29yZExpc3RMb2NhbGUsIG1hdGNoTGV2ZWwpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gd2hpbGUgKHJlc3VsdHMubW92ZVRvTmV4dCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdHMuY2xvc2UoKTsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKGRpY3RzLnZhbHVlcygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERlbGV0ZXMgdGhlIGZpbGUgcG9pbnRlZCBieSBVcmksIGFzIHJldHVybmVkIGJ5IG9wZW5Bc3NldEZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIHRoZSBVUkkgdGhlIGZpbGUgaXMgZm9yLgorICAgICAqIEBwYXJhbSBzZWxlY3Rpb24gaWdub3JlZAorICAgICAqIEBwYXJhbSBzZWxlY3Rpb25BcmdzIGlnbm9yZWQKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZmlsZXMgZGVsZXRlZCAoMCBvciAxIGluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uKQorICAgICAqIEBzZWUgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlciNkZWxldGUoVXJpLCBTdHJpbmcsIFN0cmluZ1tdKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZGVsZXRlKGZpbmFsIFVyaSB1cmksIGZpbmFsIFN0cmluZyBzZWxlY3Rpb24sIGZpbmFsIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpCisgICAgICAgICAgICB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24geworICAgICAgICBmaW5hbCBpbnQgbWF0Y2ggPSBtYXRjaFVyaSh1cmkpOworICAgICAgICBpZiAoRElDVElPTkFSWV9WMV9ESUNUX0lORk8gPT0gbWF0Y2ggfHwgRElDVElPTkFSWV9WMl9EQVRBRklMRSA9PSBtYXRjaCkgeworICAgICAgICAgICAgcmV0dXJuIGRlbGV0ZURhdGFGaWxlKHVyaSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKERJQ1RJT05BUllfVjJfTUVUQURBVEEgPT0gbWF0Y2gpIHsKKyAgICAgICAgICAgIGlmIChNZXRhZGF0YURiSGVscGVyLmRlbGV0ZUNsaWVudChnZXRDb250ZXh0KCksIGdldENsaWVudElkKHVyaSkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICAvLyBVbnN1cHBvcnRlZCBVUkkgZm9yIGRlbGV0ZQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBkZWxldGVEYXRhRmlsZShmaW5hbCBVcmkgdXJpKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyB3b3JkbGlzdElkID0gdXJpLmdldExhc3RQYXRoU2VnbWVudCgpOworICAgICAgICBmaW5hbCBTdHJpbmcgY2xpZW50SWQgPSBnZXRDbGllbnRJZCh1cmkpOworICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIHdvcmRMaXN0ID0gZ2V0V29yZGxpc3RNZXRhZGF0YUZvcldvcmRsaXN0SWQoY2xpZW50SWQsIHdvcmRsaXN0SWQpOworICAgICAgICBpZiAobnVsbCA9PSB3b3JkTGlzdCkgcmV0dXJuIDA7CisgICAgICAgIGZpbmFsIGludCBzdGF0dXMgPSB3b3JkTGlzdC5nZXRBc0ludGVnZXIoTWV0YWRhdGFEYkhlbHBlci5TVEFUVVNfQ09MVU1OKTsKKyAgICAgICAgZmluYWwgaW50IHZlcnNpb24gPSB3b3JkTGlzdC5nZXRBc0ludGVnZXIoTWV0YWRhdGFEYkhlbHBlci5WRVJTSU9OX0NPTFVNTik7CisgICAgICAgIGlmIChNZXRhZGF0YURiSGVscGVyLlNUQVRVU19ERUxFVElORyA9PSBzdGF0dXMpIHsKKyAgICAgICAgICAgIFVwZGF0ZUhhbmRsZXIubWFya0FzRGVsZXRlZChnZXRDb250ZXh0KCksIGNsaWVudElkLCB3b3JkbGlzdElkLCB2ZXJzaW9uLCBzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0gZWxzZSBpZiAoTWV0YWRhdGFEYkhlbHBlci5TVEFUVVNfSU5TVEFMTEVEID09IHN0YXR1cykgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IHVyaS5nZXRRdWVyeVBhcmFtZXRlcihRVUVSWV9QQVJBTUVURVJfREVMRVRFX1JFU1VMVCk7CisgICAgICAgICAgICBpZiAoUVVFUllfUEFSQU1FVEVSX0ZBSUxVUkUuZXF1YWxzKHJlc3VsdCkpIHsKKyAgICAgICAgICAgICAgICBVcGRhdGVIYW5kbGVyLm1hcmtBc0Jyb2tlbihnZXRDb250ZXh0KCksIGNsaWVudElkLCB3b3JkbGlzdElkLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsb2NhbEZpbGVuYW1lID0KKyAgICAgICAgICAgICAgICAgICAgd29yZExpc3QuZ2V0QXNTdHJpbmcoTWV0YWRhdGFEYkhlbHBlci5MT0NBTF9GSUxFTkFNRV9DT0xVTU4pOworICAgICAgICAgICAgZmluYWwgRmlsZSBmID0gZ2V0Q29udGV4dCgpLmdldEZpbGVTdHJlYW1QYXRoKGxvY2FsRmlsZW5hbWUpOworICAgICAgICAgICAgLy8gZi5kZWxldGUoKSByZXR1cm5zIHRydWUgaWYgdGhlIGZpbGUgd2FzIHN1Y2Nlc3NmdWxseSBkZWxldGVkLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgICAgICAgIGlmIChmLmRlbGV0ZSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiQXR0ZW1wdCB0byBkZWxldGUgYSBmaWxlIHdob3NlIHN0YXR1cyBpcyAiICsgc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5zZXJ0IGRhdGEgaW50byB0aGUgcHJvdmlkZXIuIE1heSBiZSBlaXRoZXIgYSBtZXRhZGF0YSBzb3VyY2UgVVJMIG9yIHNvbWUgZGljdGlvbmFyeSBpbmZvLgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSB0aGUgZGVzaWduYXRlZCBjb250ZW50IFVSSS4gU2VlIHNVcmlNYXRjaGVyVnsxLDJ9IGZvciBhdmFpbGFibGUgVVJJcy4KKyAgICAgKiBAcGFyYW0gdmFsdWVzIHRoZSB2YWx1ZXMgdG8gaW5zZXJ0IGZvciB0aGlzIGNvbnRlbnQgdXJpCisgICAgICogQHJldHVybiB0aGUgVVJJIGZvciB0aGUgbmV3bHkgaW5zZXJ0ZWQgaXRlbS4gTWF5IGJlIG51bGwgaWYgYXJndW1lbnRzIGRvbid0IGFsbG93IGZvciBpbnNlcnQKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVXJpIGluc2VydChmaW5hbCBVcmkgdXJpLCBmaW5hbCBDb250ZW50VmFsdWVzIHZhbHVlcykKKyAgICAgICAgICAgIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChudWxsID09IHVyaSB8fCBudWxsID09IHZhbHVlcykgcmV0dXJuIG51bGw7IC8vIFNob3VsZCBuZXZlciBoYXBwZW4gYnV0IGxldCdzIGJlIHNhZmUKKyAgICAgICAgUHJpdmF0ZUxvZy5sb2coIkluc2VydCwgdXJpID0gIiArIHVyaS50b1N0cmluZygpLCB0aGlzKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGNsaWVudElkID0gZ2V0Q2xpZW50SWQodXJpKTsKKyAgICAgICAgc3dpdGNoIChtYXRjaFVyaSh1cmkpKSB7CisgICAgICAgICAgICBjYXNlIERJQ1RJT05BUllfVjJfTUVUQURBVEE6CisgICAgICAgICAgICAgICAgLy8gVGhlIHZhbHVlcyBzaG91bGQgY29udGFpbiBhIHZhbGlkIGNsaWVudCBJRCBhbmQgYSB2YWxpZCBVUkkgZm9yIHRoZSBtZXRhZGF0YS4KKyAgICAgICAgICAgICAgICAvLyBUaGUgY2xpZW50IElEIG1heSBub3QgYmUgbnVsbCwgbm9yIG1heSBpdCBiZSBlbXB0eSBiZWNhdXNlIHRoZSBlbXB0eSBjbGllbnQgSUQKKyAgICAgICAgICAgICAgICAvLyBpcyByZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNlLgorICAgICAgICAgICAgICAgIC8vIFRoZSBtZXRhZGF0YSBVUkkgbWF5IG5vdCBiZSBudWxsLCBidXQgaXQgbWF5IGJlIGVtcHR5IGlmIHRoZSBjbGllbnQgZG9lcyBub3QKKyAgICAgICAgICAgICAgICAvLyB3YW50IHRoZSBkaWN0aW9uYXJ5IHBhY2sgdG8gdXBkYXRlIHRoZSBtZXRhZGF0YSBhdXRvbWF0aWNhbGx5LgorICAgICAgICAgICAgICAgIE1ldGFkYXRhRGJIZWxwZXIudXBkYXRlQ2xpZW50SW5mbyhnZXRDb250ZXh0KCksIGNsaWVudElkLCB2YWx1ZXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBESUNUSU9OQVJZX1YyX0RJQ1RfSU5GTzoKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBXb3JkTGlzdE1ldGFkYXRhIG5ld0RpY3Rpb25hcnlNZXRhZGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZExpc3RNZXRhZGF0YS5jcmVhdGVGcm9tQ29udGVudFZhbHVlcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFkYXRhRGJIZWxwZXIuY29tcGxldGVXaXRoRGVmYXVsdFZhbHVlcyh2YWx1ZXMpKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkJhdGNoLk1hcmtQcmVJbnN0YWxsZWRBY3Rpb24oY2xpZW50SWQsIG5ld0RpY3Rpb25hcnlNZXRhZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXhlY3V0ZShnZXRDb250ZXh0KCkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEJhZEZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIk5vdCBlbm91Z2ggaW5mb3JtYXRpb24gdG8gaW5zZXJ0IHRoaXMgZGljdGlvbmFyeSAiICsgdmFsdWVzLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERJQ1RJT05BUllfVjFfV0hPTEVfTElTVDoKKyAgICAgICAgICAgIGNhc2UgRElDVElPTkFSWV9WMV9ESUNUX0lORk86CisgICAgICAgICAgICAgICAgUHJpdmF0ZUxvZy5sb2coIkF0dGVtcHQgdG8gaW5zZXJ0IDogIiArIHVyaSwgdGhpcyk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIkluc2VydGlvbiBpbiB0aGUgZGljdGlvbmFyeSBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgdmVyc2lvbiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB1cmk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXBkYXRpbmcgZGF0YSBpcyBub3Qgc3VwcG9ydGVkLCBhbmQgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24uCisgICAgICogQHNlZSBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyI3VwZGF0ZShVcmksIENvbnRlbnRWYWx1ZXMsIFN0cmluZywgU3RyaW5nW10pCisgICAgICogQHNlZSBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyI2luc2VydChVcmksIENvbnRlbnRWYWx1ZXMpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCB1cGRhdGUoZmluYWwgVXJpIHVyaSwgZmluYWwgQ29udGVudFZhbHVlcyB2YWx1ZXMsIGZpbmFsIFN0cmluZyBzZWxlY3Rpb24sCisgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKSB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24geworICAgICAgICBQcml2YXRlTG9nLmxvZygiQXR0ZW1wdCB0byB1cGRhdGUgOiAiICsgdXJpLCB0aGlzKTsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJVcGRhdGluZyBkaWN0aW9uYXJ5IHdvcmRzIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9EaWN0aW9uYXJ5U2VydmljZS5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svRGljdGlvbmFyeVNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODE3ZWI0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svRGljdGlvbmFyeVNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDI0MiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAqIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5kaWN0aW9uYXJ5cGFjazsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFsYXJtTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQuYXBwLlNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXM7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQudGV4dC5mb3JtYXQuRGF0ZVV0aWxzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi5SOworCitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworCisvKioKKyAqIFNlcnZpY2UgdGhhdCBoYW5kbGVzIGJhY2tncm91bmQgdGFza3MgZm9yIHRoZSBkaWN0aW9uYXJ5IHByb3ZpZGVyLgorICoKKyAqIFRoaXMgc2VydmljZSBwcm92aWRlcyB0aGUgY29udGV4dCBmb3IgdGhlIGxvbmctcnVubmluZyBvcGVyYXRpb25zIGRvbmUgYnkgdGhlCisgKiBkaWN0aW9uYXJ5IHByb3ZpZGVyLiBUaG9zZSBpbmNsdWRlOgorICogLSBDaGVja2luZyBmb3IgdGhlIGxhc3QgdXBkYXRlIGRhdGUgYW5kIHNjaGVkdWxpbmcgdGhlIG5leHQgdXBkYXRlLiBUaGlzIHJ1bnMgZXZlcnkKKyAqICAgZGF5IGFyb3VuZCBtaWRuaWdodCwgdXBvbiByZWNlcHRpb24gb2YgdGhlIERBVEVfQ0hBTkdFRF9JTlRFTlRfQUNUSU9OIGJyb2FkY2FzdC4KKyAqICAgRXZlcnkgZm91ciBkYXlzLCBpdCBzY2hlZHVsZXMgYW4gdXBkYXRlIG9mIHRoZSBtZXRhZGF0YSB3aXRoIHRoZSBhbGFybSBtYW5hZ2VyLgorICogLSBJc3N1aW5nIHRoZSBvcmRlciB0byB1cGRhdGUgdGhlIG1ldGFkYXRhLiBUaGlzIHJ1bnMgZXZlcnkgZm91ciBkYXlzLCBiZXR3ZWVuIDAgYW5kCisgKiAgIDYsIHVwb24gcmVjZXB0aW9uIG9mIHRoZSBVUERBVEVfTk9XX0lOVEVOVF9BQ1RJT04gYnJvYWRjYXN0IHNlbnQgYnkgdGhlIGFsYXJtIG1hbmFnZXIKKyAqICAgYXMgYSByZXN1bHQgb2YgdGhlIGFib3ZlIGFjdGlvbi4KKyAqIC0gSGFuZGxpbmcgYSBkb3dubG9hZCB0aGF0IGp1c3QgZW5kZWQuIFRoZXNlIGNvbWUgaW4gdHdvIGZsYXZvcnM6CisgKiAgIC0gTWV0YWRhdGEgaXMgZmluaXNoZWQgZG93bmxvYWRpbmcuIFdlIHNob3VsZCBjaGVjayB3aGV0aGVyIHRoZXJlIGFyZSBuZXcgZGljdGlvbmFyaWVzCisgKiAgICAgYXZhaWxhYmxlLCBhbmQgZG93bmxvYWQgdGhvc2UgdGhhdCB3ZSBuZWVkIHRoYXQgaGF2ZSBuZXcgdmVyc2lvbnMuCisgKiAgIC0gQSBkaWN0aW9uYXJ5IGZpbGUgZmluaXNoZWQgZG93bmxvYWRpbmcuIFdlIHNob3VsZCBwdXQgdGhlIGZpbGUgcmVhZHkgZm9yIGEgY2xpZW50IElNRQorICogICAgIHRvIGFjY2VzcywgYW5kIG1hcmsgdGhlIGN1cnJlbnQgc3RhdGUgYXMgc3VjaC4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIERpY3Rpb25hcnlTZXJ2aWNlIGV4dGVuZHMgU2VydmljZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IERpY3Rpb25hcnlTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBwYWNrYWdlIG5hbWUsIHRvIHVzZSBpbiB0aGUgaW50ZW50IGFjdGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VfTkFNRSA9ICJjb20uYW5kcm9pZC5hbmRyb2lkLmlucHV0bWV0aG9kLmxhdGluIjsKKworICAgIC8qKgorICAgICAqIFRoZSBhY3Rpb24gb2YgdGhlIGludGVudCB0byB0ZWxsIHRoZSBkaWN0aW9uYXJ5IHByb3ZpZGVyIHRvIHVwZGF0ZSBub3cuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVQREFURV9OT1dfSU5URU5UX0FDVElPTiA9IFBBQ0tBR0VfTkFNRSArICIuVVBEQVRFX05PVyI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgYWN0aW9uIG9mIHRoZSBkYXRlIGNoYW5naW5nLCB1c2VkIHRvIHNjaGVkdWxlIGEgcGVyaW9kaWMgZnJlc2huZXNzIGNoZWNrCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEVfQ0hBTkdFRF9JTlRFTlRfQUNUSU9OID0KKyAgICAgICAgICAgIEludGVudC5BQ1RJT05fREFURV9DSEFOR0VEOworCisgICAgLyoqCisgICAgICogVGhlIGFjdGlvbiBvZiBkaXNwbGF5aW5nIGEgdG9hc3QgdG8gd2FybiB0aGUgdXNlciBhbiBhdXRvbWF0aWMgZG93bmxvYWQgaXMgc3RhcnRpbmcuCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1dfRE9XTkxPQURfVE9BU1RfSU5URU5UX0FDVElPTiA9CisgICAgICAgICAgICBQQUNLQUdFX05BTUUgKyAiLlNIT1dfRE9XTkxPQURfVE9BU1RfSU5URU5UX0FDVElPTiI7CisKKyAgICAvKioKKyAgICAgKiBBIGxvY2FsZSBhcmd1bWVudCwgYXMgYSBTdHJpbmcuCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMRV9JTlRFTlRfQVJHVU1FTlQgPSAibG9jYWxlIjsKKworICAgIC8qKgorICAgICAqIEhvdyBvZnRlbiwgaW4gbWlsbGlzZWNvbmRzLCB3ZSB3YW50IHRvIHVwZGF0ZSB0aGUgbWV0YWRhdGEuIFRoaXMgaXMgYQorICAgICAqIGZsb29yIHZhbHVlOyBhY3R1YWxseSwgaXQgbWF5IGhhcHBlbiBzZXZlcmFsIGhvdXJzIGxhdGVyLCBvciBldmVuIG1vcmUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBVUERBVEVfRlJFUVVFTkNZID0gNCAqIERhdGVVdGlscy5EQVlfSU5fTUlMTElTOworCisgICAgLyoqCisgICAgICogV2UgYXJlIHdha2VkIGFyb3VuZCBtaWRuaWdodCwgbG9jYWwgdGltZS4gV2Ugd2FudCB0byB3YWtlIGJldHdlZW4gbWlkbmlnaHQgYW5kIDYgYW0sCisgICAgICogcm91Z2hseS4gU28gdXNlIGEgcmFuZG9tIHRpbWUgYmV0d2VlbiAwIGFuZCB0aGlzIGRlbGF5LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfQUxBUk1fREVMQVkgPSA2ICogKChpbnQpQWxhcm1NYW5hZ2VyLklOVEVSVkFMX0hPVVIpOworCisgICAgLyoqCisgICAgICogSG93IGxvbmcgd2UgY29uc2lkZXIgYSAidmVyeSBsb25nIHRpbWUiLiBJZiBubyB1cGRhdGUgdG9vayBwbGFjZSBpbiB0aGlzIHRpbWUsCisgICAgICogdGhlIGNvbnRlbnQgcHJvdmlkZXIgd2lsbCB0cmlnZ2VyIGFuIHVwZGF0ZSBpbiB0aGUgYmFja2dyb3VuZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFZFUllfTE9OR19USU1FID0gMTQgKiBEYXRlVXRpbHMuREFZX0lOX01JTExJUzsKKworICAgIC8qKgorICAgICAqIFRoZSBsYXN0IHNlZW4gc3RhcnQgSWQuIFRoaXMgbXVzdCBiZSBzdG9yZWQgYmVjYXVzZSB3ZSBtdXN0IG9ubHkgY2FsbCBzdG9wU2VsZlJlc3VsdCgpIHdpdGgKKyAgICAgKiB0aGUgbGFzdCBzZWVuIElkLCBvciB0aGUgc2VydmljZSB3b24ndCBzdG9wLgorICAgICAqLworICAgIHByaXZhdGUgaW50IG1MYXN0U2VlblN0YXJ0SWQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY29tbWFuZCBjb3VudC4gV2UgbmVlZCB0aGlzIGJlY2F1c2Ugd2UgbmVlZCB0byBub3QgY2FsbCBzdG9wU2VsZlJlc3VsdCgpIHdoaWxlIHdlIHN0aWxsCisgICAgICogaGF2ZSBjb21tYW5kcyBydW5uaW5nLgorICAgICAqLworICAgIHByaXZhdGUgaW50IG1Db21tYW5kQ291bnQ7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZSgpIHsKKyAgICAgICAgbUxhc3RTZWVuU3RhcnRJZCA9IDA7CisgICAgICAgIG1Db21tYW5kQ291bnQgPSAwOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveSgpIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSUJpbmRlciBvbkJpbmQoSW50ZW50IGludGVudCkgeworICAgICAgICAvLyBUaGlzIHNlcnZpY2UgY2Fubm90IGJlIGJvdW5kCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIGFuIGV4cGxpY2l0IGNvbW1hbmQuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgYXJiaXRyYXJ5IGNvbW1hbmRzIHRoYXQgYXJlIGV4ZWN1dGVkIHVwb24gcmVjZXB0aW9uIG9mIGNlcnRhaW4KKyAgICAgKiBldmVudHMgdGhhdCBzaG91bGQgYmUgZXhlY3V0ZWQgb24gdGhlIGNvbnRleHQgb2YgdGhpcyBzZXJ2aWNlLiBUaGUgc3VwcG9ydGVkIGNvbW1hbmRzIGFyZToKKyAgICAgKiAtIENoZWNrIGxhc3QgdXBkYXRlIHRpbWUgYW5kIHBvc3NpYmx5IHNjaGVkdWxlIGFuIHVwZGF0ZSBvZiB0aGUgZGF0YSBmb3IgbGF0ZXIuCisgICAgICogICAgIFRoaXMgaXMgdHJpZ2dlcmVkIGV2ZXJ5IGRheSwgdXBvbiByZWNlcHRpb24gb2YgdGhlIERBVEVfQ0hBTkdFRF9JTlRFTlRfQUNUSU9OIGJyb2FkY2FzdC4KKyAgICAgKiAtIFVwZGF0ZSBkYXRhIE5PVy4KKyAgICAgKiAgICAgVGhpcyBpcyBub3JtYWxseSByZWNlaXZlZCB1cG9uIHRyaWdnZXIgb2YgdGhlIHNjaGVkdWxlZCB1cGRhdGUuCisgICAgICogLSBIYW5kbGUgYSBmaW5pc2hlZCBkb3dubG9hZC4KKyAgICAgKiAgICAgVGhpcyBleGVjdXRlcyB0aGUgYWN0aW9ucyB0aGF0IG11c3QgYmUgdGFrZW4gYWZ0ZXIgYSBmaWxlIChtZXRhZGF0YSBvciBkaWN0aW9uYXJ5IGRhdGEKKyAgICAgKiAgICAgaGFzIGJlZW4gZG93bmxvYWRlZCAob3IgZmFpbGVkIHRvIGRvd25sb2FkKS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBvblN0YXJ0Q29tbWFuZChmaW5hbCBJbnRlbnQgaW50ZW50LCBmaW5hbCBpbnQgZmxhZ3MsCisgICAgICAgICAgICBmaW5hbCBpbnQgc3RhcnRJZCkgeworICAgICAgICBmaW5hbCBEaWN0aW9uYXJ5U2VydmljZSBzZWxmID0gdGhpczsKKyAgICAgICAgbUxhc3RTZWVuU3RhcnRJZCA9IHN0YXJ0SWQ7CisgICAgICAgIG1Db21tYW5kQ291bnQgKz0gMTsKKyAgICAgICAgaWYgKFNIT1dfRE9XTkxPQURfVE9BU1RfSU5URU5UX0FDVElPTi5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkgeworICAgICAgICAgICAgLy8gVGhpcyBpcyBhIFVJIGFjdGlvbiwgaXQgY2FuJ3QgYmUgcnVuIGluIGFub3RoZXIgdGhyZWFkCisgICAgICAgICAgICBzaG93U3RhcnREb3dubG9hZGluZ1RvYXN0KHRoaXMsIExvY2FsZVV0aWxzLmNvbnN0cnVjdExvY2FsZUZyb21TdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIGludGVudC5nZXRTdHJpbmdFeHRyYShMT0NBTEVfSU5URU5UX0FSR1VNRU5UKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gSWYgaXQncyBhIGNvbW1hbmQgdGhhdCBkb2VzIG5vdCByZXF1aXJlIFVJLCBjcmVhdGUgYSB0aHJlYWQgdG8gZG8gdGhlIHdvcmsKKyAgICAgICAgICAgIC8vIGFuZCByZXR1cm4gcmlnaHQgYXdheS4gREFURV9DSEFOR0VEIG9yIFVQREFURV9OT1cgYXJlIGV4YW1wbGVzIG9mIHN1Y2ggY29tbWFuZHMuCisgICAgICAgICAgICBuZXcgVGhyZWFkKCJ1cGRhdGVPckZpbmlzaERvd25sb2FkIikgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hCcm9hZGNhc3Qoc2VsZiwgaW50ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkKHNlbGYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgtLW1Db21tYW5kQ291bnQgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RvcFNlbGZSZXN1bHQobUxhc3RTZWVuU3RhcnRJZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ2FuJ3Qgc3RvcCBvdXJzZWx2ZXMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LnN0YXJ0KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFNlcnZpY2UuU1RBUlRfUkVERUxJVkVSX0lOVEVOVDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGRpc3BhdGNoQnJvYWRjYXN0KGZpbmFsIENvbnRleHQgY29udGV4dCwgZmluYWwgSW50ZW50IGludGVudCkgeworICAgICAgICBpZiAoREFURV9DSEFOR0VEX0lOVEVOVF9BQ1RJT04uZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSkpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgaGFwcGVucyB3aGVuIHRoZSBkYXRlIG9mIHRoZSBkZXZpY2UgY2hhbmdlcy4gVGhpcyBub3JtYWxseSBoYXBwZW5zCisgICAgICAgICAgICAvLyBhdCBtaWRuaWdodCBsb2NhbCB0aW1lLCBidXQgaXQgbWF5IGhhcHBlbiBpZiB0aGUgdXNlciBjaGFuZ2VzIHRoZSBkYXRlCisgICAgICAgICAgICAvLyBieSBoYW5kIG9yIHNvbWV0aGluZyBzaW1pbGFyIGhhcHBlbnMuCisgICAgICAgICAgICBjaGVja1RpbWVBbmRNYXliZVNldHVwVXBkYXRlQWxhcm0oY29udGV4dCk7CisgICAgICAgIH0gZWxzZSBpZiAoVVBEQVRFX05PV19JTlRFTlRfQUNUSU9OLmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7CisgICAgICAgICAgICAvLyBJbnRlbnQgdG8gdHJpZ2dlciBhbiB1cGRhdGUgbm93LgorICAgICAgICAgICAgVXBkYXRlSGFuZGxlci51cGRhdGUoY29udGV4dCwgZmFsc2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVXBkYXRlSGFuZGxlci5kb3dubG9hZEZpbmlzaGVkKGNvbnRleHQsIGludGVudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXR1cHMgYW4gYWxhcm0gdG8gY2hlY2sgZm9yIHVwZGF0ZXMgaWYgYW4gdXBkYXRlIGlzIGR1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrVGltZUFuZE1heWJlU2V0dXBVcGRhdGVBbGFybShmaW5hbCBDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgLy8gT2YgYWxsIGNsaWVudHMsIGlmIHRoZSBvbmUgdGhhdCBoYXNuJ3QgYmVlbiB1cGRhdGVkIGZvciB0aGUgbG9uZ2VzdAorICAgICAgICAvLyBpcyBzdGlsbCBtb3JlIHJlY2VudCB0aGFuIFVQREFURV9GUkVRVUVOQ1ksIGRvIG5vdGhpbmcuCisgICAgICAgIGlmICghaXNMYXN0VXBkYXRlQXRMZWFzdFRoaXNPbGQoY29udGV4dCwgVVBEQVRFX0ZSRVFVRU5DWSkpIHJldHVybjsKKworICAgICAgICBQcml2YXRlTG9nLmxvZygiRGF0ZSBjaGFuZ2VkIC0gcmVnaXN0ZXJpbmcgYWxhcm0iLCBjb250ZXh0KTsKKyAgICAgICAgQWxhcm1NYW5hZ2VyIGFsYXJtTWFuYWdlciA9IChBbGFybU1hbmFnZXIpY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQUxBUk1fU0VSVklDRSk7CisKKyAgICAgICAgLy8gQmVzdCBlZmZvcnQgdG8gd2FrZSBiZXR3ZWVuIG1pZG5pZ2h0IGFuZCBNQVhfQUxBUk1fREVMQVkgaW4gdGhlIG1vcm5pbmcuCisgICAgICAgIC8vIEl0IGRvZXNuJ3QgbWF0dGVyIHRvbyBtdWNoIGlmIHRoaXMgaXMgdmVyeSBpbmV4YWN0LgorICAgICAgICBmaW5hbCBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBmaW5hbCBsb25nIGFsYXJtVGltZSA9IG5vdyArIG5ldyBSYW5kb20oKS5uZXh0SW50KE1BWF9BTEFSTV9ERUxBWSk7CisgICAgICAgIGZpbmFsIEludGVudCB1cGRhdGVJbnRlbnQgPSBuZXcgSW50ZW50KERpY3Rpb25hcnlTZXJ2aWNlLlVQREFURV9OT1dfSU5URU5UX0FDVElPTik7CisgICAgICAgIGZpbmFsIFBlbmRpbmdJbnRlbnQgcGVuZGluZ0ludGVudCA9IFBlbmRpbmdJbnRlbnQuZ2V0QnJvYWRjYXN0KGNvbnRleHQsIDAsCisgICAgICAgICAgICAgICAgdXBkYXRlSW50ZW50LCBQZW5kaW5nSW50ZW50LkZMQUdfQ0FOQ0VMX0NVUlJFTlQpOworCisgICAgICAgIC8vIFdlIHNldCB0aGUgYWxhcm0gaW4gdGhlIHR5cGUgdGhhdCBkb2Vzbid0IGZvcmNlZnVsbHkgd2FrZSB0aGUgZGV2aWNlCisgICAgICAgIC8vIGZyb20gc2xlZXAsIGJ1dCBmaXJlcyB0aGUgbmV4dCB0aW1lIHRoZSBkZXZpY2UgYWN0dWFsbHkgd2FrZXMgZm9yIGFueQorICAgICAgICAvLyBvdGhlciByZWFzb24uCisgICAgICAgIGlmIChudWxsICE9IGFsYXJtTWFuYWdlcikgYWxhcm1NYW5hZ2VyLnNldChBbGFybU1hbmFnZXIuUlRDLCBhbGFybVRpbWUsIHBlbmRpbmdJbnRlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIGRlY2lkZSB3aGV0aGVyIHRoZSBsYXN0IHVwZGF0ZSBpcyBvbGRlciB0aGFuIGEgY2VydGFpbiB0aW1lLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIGF0IGxlYXN0IGB0aW1lJyBtaWxsaXNlY29uZHMgaGF2ZSBlbGFwc2VkIHNpbmNlIGxhc3QgdXBkYXRlLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xhc3RVcGRhdGVBdExlYXN0VGhpc09sZChmaW5hbCBDb250ZXh0IGNvbnRleHQsIGZpbmFsIGxvbmcgdGltZSkgeworICAgICAgICBmaW5hbCBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBmaW5hbCBsb25nIGxhc3RVcGRhdGUgPSBNZXRhZGF0YURiSGVscGVyLmdldE9sZGVzdFVwZGF0ZVRpbWUoY29udGV4dCk7CisgICAgICAgIFByaXZhdGVMb2cubG9nKCJMYXN0IHVwZGF0ZSB3YXMgIiArIGxhc3RVcGRhdGUsIGNvbnRleHQpOworICAgICAgICByZXR1cm4gbGFzdFVwZGF0ZSArIHRpbWUgPCBub3c7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVmcmVzaGVzIGRhdGEgaWYgaXQgaGFzbid0IGJlZW4gcmVmcmVzaGVkIGluIGEgdmVyeSBsb25nIHRpbWUuCisgICAgICoKKyAgICAgKiBUaGlzIHdpbGwgY2hlY2sgdGhlIGxhc3QgdXBkYXRlIHRpbWUsIGFuZCBpZiBpdCdzIGJlZW4gbW9yZSB0aGFuIFZFUllfTE9OR19USU1FLAorICAgICAqIHVwZGF0ZSBtZXRhZGF0YSBub3cgLSBhbmQgcG9zc2libHkgdGFrZSBzdWJzZXF1ZW50IHVwZGF0ZSBhY3Rpb25zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVOb3dJZk5vdFVwZGF0ZWRJbkFWZXJ5TG9uZ1RpbWUoZmluYWwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGlmICghaXNMYXN0VXBkYXRlQXRMZWFzdFRoaXNPbGQoY29udGV4dCwgVkVSWV9MT05HX1RJTUUpKSByZXR1cm47CisgICAgICAgIFVwZGF0ZUhhbmRsZXIudXBkYXRlKGNvbnRleHQsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaG93cyBhIHRvYXN0IGluZm9ybWluZyB0aGUgdXNlciB0aGF0IGFuIGF1dG9tYXRpYyBkaWN0aW9uYXJ5IGRvd25sb2FkIGlzIHN0YXJ0aW5nLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2hvd1N0YXJ0RG93bmxvYWRpbmdUb2FzdChmaW5hbCBDb250ZXh0IGNvbnRleHQsIGZpbmFsIExvY2FsZSBsb2NhbGUpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHRvYXN0VGV4dCA9IFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgY29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcudG9hc3RfZG93bmxvYWRpbmdfc3VnZ2VzdGlvbnMpLAorICAgICAgICAgICAgICAgIGxvY2FsZS5nZXREaXNwbGF5TmFtZSgpKTsKKyAgICAgICAgVG9hc3QubWFrZVRleHQoY29udGV4dCwgdG9hc3RUZXh0LCBUb2FzdC5MRU5HVEhfTE9ORykuc2hvdygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL0RpY3Rpb25hcnlTZXR0aW5nc0FjdGl2aXR5LmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9EaWN0aW9uYXJ5U2V0dGluZ3NBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NDE2NTIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9EaWN0aW9uYXJ5U2V0dGluZ3NBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5CisgKiBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuZGljdGlvbmFyeXBhY2s7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlQWN0aXZpdHk7CisKKy8qKgorICogUHJlZmVyZW5jZSBzY3JlZW4uCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBEaWN0aW9uYXJ5U2V0dGluZ3NBY3Rpdml0eSBleHRlbmRzIFByZWZlcmVuY2VBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoZmluYWwgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJbnRlbnQgZ2V0SW50ZW50KCkgeworICAgICAgICBmaW5hbCBJbnRlbnQgbW9kSW50ZW50ID0gbmV3IEludGVudChzdXBlci5nZXRJbnRlbnQoKSk7CisgICAgICAgIG1vZEludGVudC5wdXRFeHRyYShFWFRSQV9TSE9XX0ZSQUdNRU5ULCBEaWN0aW9uYXJ5U2V0dGluZ3NGcmFnbWVudC5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICBtb2RJbnRlbnQucHV0RXh0cmEoRVhUUkFfTk9fSEVBREVSUywgdHJ1ZSk7CisgICAgICAgIC8vIEltcG9ydGFudCBub3RlIDogdGhlIG9yaWdpbmFsIGludGVudCBzaG91bGQgY29udGFpbiBhIFN0cmluZyBleHRyYSB3aXRoIHRoZSBrZXkKKyAgICAgICAgLy8gRGljdGlvbmFyeVNldHRpbmdzRnJhZ21lbnQuRElDVF9TRVRUSU5HU19GUkFHTUVOVF9DTElFTlRfSURfQVJHVU1FTlQgc28gdGhhdCB0aGUKKyAgICAgICAgLy8gZnJhZ21lbnQgY2FuIGtub3cgd2hvIHRoZSBjbGllbnQgaXMuCisgICAgICAgIHJldHVybiBtb2RJbnRlbnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svRGljdGlvbmFyeVNldHRpbmdzRnJhZ21lbnQuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL0RpY3Rpb25hcnlTZXR0aW5nc0ZyYWdtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UyYTZiYgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL0RpY3Rpb25hcnlTZXR0aW5nc0ZyYWdtZW50LmphdmEKQEAgLTAsMCArMSwzNjYgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5CisgKiBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuZGljdGlvbmFyeXBhY2s7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5uZXQuQ29ubmVjdGl2aXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2U7CitpbXBvcnQgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VGcmFnbWVudDsKK2ltcG9ydCBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUdyb3VwOworaW1wb3J0IGFuZHJvaWQudGV4dC5mb3JtYXQuRGF0ZVV0aWxzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25VdGlsczsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmxhdGluLlI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CisKKy8qKgorICogUHJlZmVyZW5jZSBzY3JlZW4uCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBEaWN0aW9uYXJ5U2V0dGluZ3NGcmFnbWVudCBleHRlbmRzIFByZWZlcmVuY2VGcmFnbWVudAorICAgICAgICBpbXBsZW1lbnRzIFVwZGF0ZUhhbmRsZXIuVXBkYXRlRXZlbnRMaXN0ZW5lciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IERpY3Rpb25hcnlTZXR0aW5nc0ZyYWdtZW50LmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKworICAgIHN0YXRpYyBmaW5hbCBwcml2YXRlIFN0cmluZyBESUNUX0xJU1RfSUQgPSAibGlzdCI7CisgICAgc3RhdGljIGZpbmFsIHB1YmxpYyBTdHJpbmcgRElDVF9TRVRUSU5HU19GUkFHTUVOVF9DTElFTlRfSURfQVJHVU1FTlQgPSAiY2xpZW50SWQiOworCisgICAgc3RhdGljIGZpbmFsIHByaXZhdGUgaW50IE1FTlVfVVBEQVRFX05PVyA9IE1lbnUuRklSU1Q7CisKKyAgICBwcml2YXRlIFZpZXcgbUxvYWRpbmdWaWV3OworICAgIHByaXZhdGUgU3RyaW5nIG1DbGllbnRJZDsKKyAgICBwcml2YXRlIENvbm5lY3Rpdml0eU1hbmFnZXIgbUNvbm5lY3Rpdml0eU1hbmFnZXI7CisgICAgcHJpdmF0ZSBNZW51SXRlbSBtVXBkYXRlTm93TWVudTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUNoYW5nZWRTZXR0aW5nczsKKworICAgIHByaXZhdGUgZmluYWwgQnJvYWRjYXN0UmVjZWl2ZXIgbUNvbm5lY3Rpdml0eUNoYW5nZWRSZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKGZpbmFsIENvbnRleHQgY29udGV4dCwgZmluYWwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgICAgIHJlZnJlc2hOZXR3b3JrU3RhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgIC8qKgorICAgICAqIEVtcHR5IGNvbnN0cnVjdG9yIGZvciBmcmFnbWVudCBnZW5lcmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBEaWN0aW9uYXJ5U2V0dGluZ3NGcmFnbWVudCgpIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoZmluYWwgTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIsIGZpbmFsIFZpZXdHcm91cCBjb250YWluZXIsCisgICAgICAgICAgICBmaW5hbCBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIGZpbmFsIFZpZXcgdiA9IGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQubG9hZGluZ19wYWdlLCBjb250YWluZXIsIHRydWUpOworICAgICAgICBtTG9hZGluZ1ZpZXcgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmxvYWRpbmdfY29udGFpbmVyKTsKKyAgICAgICAgcmV0dXJuIHN1cGVyLm9uQ3JlYXRlVmlldyhpbmZsYXRlciwgY29udGFpbmVyLCBzYXZlZEluc3RhbmNlU3RhdGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQWN0aXZpdHlDcmVhdGVkKGZpbmFsIEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25BY3Rpdml0eUNyZWF0ZWQoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgZmluYWwgQWN0aXZpdHkgYWN0aXZpdHkgPSBnZXRBY3Rpdml0eSgpOworICAgICAgICBtQ2xpZW50SWQgPSBhY3Rpdml0eS5nZXRJbnRlbnQoKS5nZXRTdHJpbmdFeHRyYShESUNUX1NFVFRJTkdTX0ZSQUdNRU5UX0NMSUVOVF9JRF9BUkdVTUVOVCk7CisgICAgICAgIG1Db25uZWN0aXZpdHlNYW5hZ2VyID0KKyAgICAgICAgICAgICAgICAoQ29ubmVjdGl2aXR5TWFuYWdlcilhY3Rpdml0eS5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ09OTkVDVElWSVRZX1NFUlZJQ0UpOworICAgICAgICBhZGRQcmVmZXJlbmNlc0Zyb21SZXNvdXJjZShSLnhtbC5kaWN0aW9uYXJ5X3NldHRpbmdzKTsKKyAgICAgICAgcmVmcmVzaEludGVyZmFjZSgpOworICAgICAgICBzZXRIYXNPcHRpb25zTWVudSh0cnVlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZU9wdGlvbnNNZW51KGZpbmFsIE1lbnUgbWVudSwgZmluYWwgTWVudUluZmxhdGVyIGluZmxhdGVyKSB7CisgICAgICAgIG1VcGRhdGVOb3dNZW51ID0gbWVudS5hZGQoTWVudS5OT05FLCBNRU5VX1VQREFURV9OT1csIDAsIFIuc3RyaW5nLmNoZWNrX2Zvcl91cGRhdGVzX25vdyk7CisgICAgICAgIG1VcGRhdGVOb3dNZW51LnNldFNob3dBc0FjdGlvbihNZW51SXRlbS5TSE9XX0FTX0FDVElPTl9JRl9ST09NKTsKKyAgICAgICAgcmVmcmVzaE5ldHdvcmtTdGF0ZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworICAgICAgICBtQ2hhbmdlZFNldHRpbmdzID0gZmFsc2U7CisgICAgICAgIFVwZGF0ZUhhbmRsZXIucmVnaXN0ZXJVcGRhdGVFdmVudExpc3RlbmVyKHRoaXMpOworICAgICAgICBmaW5hbCBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKENvbm5lY3Rpdml0eU1hbmFnZXIuQ09OTkVDVElWSVRZX0FDVElPTik7CisgICAgICAgIGdldEFjdGl2aXR5KCkucmVnaXN0ZXJSZWNlaXZlcihtQ29ubmVjdGl2aXR5Q2hhbmdlZFJlY2VpdmVyLCBmaWx0ZXIpOworICAgICAgICByZWZyZXNoTmV0d29ya1N0YXRlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25QYXVzZSgpIHsKKyAgICAgICAgc3VwZXIub25QYXVzZSgpOworICAgICAgICBmaW5hbCBBY3Rpdml0eSBhY3Rpdml0eSA9IGdldEFjdGl2aXR5KCk7CisgICAgICAgIFVwZGF0ZUhhbmRsZXIudW5yZWdpc3RlclVwZGF0ZUV2ZW50TGlzdGVuZXIodGhpcyk7CisgICAgICAgIGFjdGl2aXR5LnVucmVnaXN0ZXJSZWNlaXZlcihtQ29ubmVjdGl2aXR5Q2hhbmdlZFJlY2VpdmVyKTsKKyAgICAgICAgaWYgKG1DaGFuZ2VkU2V0dGluZ3MpIHsKKyAgICAgICAgICAgIGZpbmFsIEludGVudCBuZXdEaWN0QnJvYWRjYXN0ID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IEludGVudChEaWN0aW9uYXJ5UGFja0NvbnN0YW50cy5ORVdfRElDVElPTkFSWV9JTlRFTlRfQUNUSU9OKTsKKyAgICAgICAgICAgIGFjdGl2aXR5LnNlbmRCcm9hZGNhc3QobmV3RGljdEJyb2FkY2FzdCk7CisgICAgICAgICAgICBtQ2hhbmdlZFNldHRpbmdzID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkb3dubG9hZGVkTWV0YWRhdGEoZmluYWwgYm9vbGVhbiBzdWNjZWVkZWQpIHsKKyAgICAgICAgc3RvcExvYWRpbmdBbmltYXRpb24oKTsKKyAgICAgICAgaWYgKCFzdWNjZWVkZWQpIHJldHVybjsgLy8gSWYgdGhlIGRvd25sb2FkIGZhaWxlZCBub3RoaW5nIGNoYW5nZWQsIHNvIG5vIG5lZWQgdG8gcmVmcmVzaAorICAgICAgICBuZXcgVGhyZWFkKCJyZWZyZXNoSW50ZXJmYWNlIikgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgcmVmcmVzaEludGVyZmFjZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9LnN0YXJ0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd29yZExpc3REb3dubG9hZEZpbmlzaGVkKGZpbmFsIFN0cmluZyB3b3JkTGlzdElkLCBmaW5hbCBib29sZWFuIHN1Y2NlZWRlZCkgeworICAgICAgICBmaW5hbCBXb3JkTGlzdFByZWZlcmVuY2UgcHJlZiA9IGZpbmRXb3JkTGlzdFByZWZlcmVuY2Uod29yZExpc3RJZCk7CisgICAgICAgIGlmIChudWxsID09IHByZWYpIHJldHVybjsKKyAgICAgICAgLy8gVE9ETzogUmVwb3J0IHRvIHRoZSB1c2VyIGlmICFzdWNjZWVkZWQKKyAgICAgICAgZmluYWwgQWN0aXZpdHkgYWN0aXZpdHkgPSBnZXRBY3Rpdml0eSgpOworICAgICAgICBpZiAobnVsbCA9PSBhY3Rpdml0eSkgcmV0dXJuOworICAgICAgICBhY3Rpdml0eS5ydW5PblVpVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gcmUtcmVhZCB0aGUgZGIgaW4gY2FzZSB0aGUgZGVzY3JpcHRpb24gaGFzIGNoYW5nZWQsIGFuZCB0bworICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIG91dCB3aGF0IHN0YXRlIGl0IGVuZGVkIHVwIGlmIHRoZSBkb3dubG9hZCB3YXNuJ3Qgc3VjY2Vzc2Z1bAorICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBkb24ndCByZWRvIGV2ZXJ5dGhpbmcsIG9ubHkgcmUtcmVhZCBhbmQgc2V0IHRoaXMgd29yZCBsaXN0IHN0YXR1cworICAgICAgICAgICAgICAgICAgICByZWZyZXNoSW50ZXJmYWNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBXb3JkTGlzdFByZWZlcmVuY2UgZmluZFdvcmRMaXN0UHJlZmVyZW5jZShmaW5hbCBTdHJpbmcgaWQpIHsKKyAgICAgICAgZmluYWwgUHJlZmVyZW5jZUdyb3VwIHByZWZTY3JlZW4gPSBnZXRQcmVmZXJlbmNlU2NyZWVuKCk7CisgICAgICAgIGlmIChudWxsID09IHByZWZTY3JlZW4pIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkIG5vdCBmaW5kIHRoZSBwcmVmZXJlbmNlIGdyb3VwIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gcHJlZlNjcmVlbi5nZXRQcmVmZXJlbmNlQ291bnQoKSAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgICAgICBmaW5hbCBQcmVmZXJlbmNlIHByZWYgPSBwcmVmU2NyZWVuLmdldFByZWZlcmVuY2UoaSk7CisgICAgICAgICAgICBpZiAocHJlZiBpbnN0YW5jZW9mIFdvcmRMaXN0UHJlZmVyZW5jZSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFdvcmRMaXN0UHJlZmVyZW5jZSB3bFByZWYgPSAoV29yZExpc3RQcmVmZXJlbmNlKXByZWY7CisgICAgICAgICAgICAgICAgaWYgKGlkLmVxdWFscyh3bFByZWYubVdvcmRsaXN0SWQpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB3bFByZWY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIExvZy5lKFRBRywgIkNvdWxkIG5vdCBmaW5kIHRoZSBwcmVmZXJlbmNlIGZvciBhIHdvcmQgbGlzdCBpZCAiICsgaWQpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVDeWNsZUNvbXBsZXRlZCgpIHt9CisKKyAgICBwcml2YXRlIHZvaWQgcmVmcmVzaE5ldHdvcmtTdGF0ZSgpIHsKKyAgICAgICAgTmV0d29ya0luZm8gaW5mbyA9IG1Db25uZWN0aXZpdHlNYW5hZ2VyLmdldEFjdGl2ZU5ldHdvcmtJbmZvKCk7CisgICAgICAgIGJvb2xlYW4gaXNDb25uZWN0ZWQgPSBudWxsID09IGluZm8gPyBmYWxzZSA6IGluZm8uaXNDb25uZWN0ZWQoKTsKKyAgICAgICAgaWYgKG51bGwgIT0gbVVwZGF0ZU5vd01lbnUpIG1VcGRhdGVOb3dNZW51LnNldEVuYWJsZWQoaXNDb25uZWN0ZWQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWZyZXNoSW50ZXJmYWNlKCkgeworICAgICAgICBmaW5hbCBBY3Rpdml0eSBhY3Rpdml0eSA9IGdldEFjdGl2aXR5KCk7CisgICAgICAgIGlmIChudWxsID09IGFjdGl2aXR5KSByZXR1cm47CisgICAgICAgIGZpbmFsIGxvbmcgbGFzdFVwZGF0ZURhdGUgPQorICAgICAgICAgICAgICAgIE1ldGFkYXRhRGJIZWxwZXIuZ2V0TGFzdFVwZGF0ZURhdGVGb3JDbGllbnQoZ2V0QWN0aXZpdHkoKSwgbUNsaWVudElkKTsKKyAgICAgICAgZmluYWwgUHJlZmVyZW5jZUdyb3VwIHByZWZTY3JlZW4gPSBnZXRQcmVmZXJlbmNlU2NyZWVuKCk7CisgICAgICAgIGZpbmFsIENvbGxlY3Rpb248PyBleHRlbmRzIFByZWZlcmVuY2U+IHByZWZMaXN0ID0KKyAgICAgICAgICAgICAgICBjcmVhdGVJbnN0YWxsZWREaWN0U2V0dGluZ3NDb2xsZWN0aW9uKG1DbGllbnRJZCk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHVwZGF0ZU5vd1N1bW1hcnkgPSBnZXRTdHJpbmcoUi5zdHJpbmcubGFzdF91cGRhdGUpICsgIiAiCisgICAgICAgICAgICAgICAgKyBEYXRlVXRpbHMuZm9ybWF0RGF0ZVRpbWUoYWN0aXZpdHksIGxhc3RVcGRhdGVEYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZVV0aWxzLkZPUk1BVF9TSE9XX0RBVEUgfCBEYXRlVXRpbHMuRk9STUFUX1NIT1dfVElNRSk7CisKKyAgICAgICAgYWN0aXZpdHkucnVuT25VaVRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBkaXNwbGF5IHRoaXMgc29tZXdoZXJlCisgICAgICAgICAgICAgICAgICAgIC8vIGlmICgwICE9IGxhc3RVcGRhdGUpIG1VcGRhdGVOb3dQcmVmZXJlbmNlLnNldFN1bW1hcnkodXBkYXRlTm93U3VtbWFyeSk7CisgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hOZXR3b3JrU3RhdGUoKTsKKworICAgICAgICAgICAgICAgICAgICByZW1vdmVBbnlEaWN0U2V0dGluZ3MocHJlZlNjcmVlbik7CisgICAgICAgICAgICAgICAgICAgIGZvciAoUHJlZmVyZW5jZSBwcmVmZXJlbmNlIDogcHJlZkxpc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWZTY3JlZW4uYWRkUHJlZmVyZW5jZShwcmVmZXJlbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgUHJlZmVyZW5jZSBjcmVhdGVFcnJvck1lc3NhZ2UoZmluYWwgQWN0aXZpdHkgYWN0aXZpdHksIGZpbmFsIGludCBtZXNzYWdlUmVzb3VyY2UpIHsKKyAgICAgICAgZmluYWwgUHJlZmVyZW5jZSBtZXNzYWdlID0gbmV3IFByZWZlcmVuY2UoYWN0aXZpdHkpOworICAgICAgICBtZXNzYWdlLnNldFRpdGxlKG1lc3NhZ2VSZXNvdXJjZSk7CisgICAgICAgIG1lc3NhZ2Uuc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgIHJldHVybiBtZXNzYWdlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZW1vdmVBbnlEaWN0U2V0dGluZ3MoZmluYWwgUHJlZmVyZW5jZUdyb3VwIHByZWZHcm91cCkgeworICAgICAgICBmb3IgKGludCBpID0gcHJlZkdyb3VwLmdldFByZWZlcmVuY2VDb3VudCgpIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgICAgIHByZWZHcm91cC5yZW1vdmVQcmVmZXJlbmNlKHByZWZHcm91cC5nZXRQcmVmZXJlbmNlKGkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBXb3JkTGlzdFByZWZlcmVuY2UgbGlzdCB0byBiZSBhZGRlZCB0byB0aGUgc2NyZWVuLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2Qgb25seSBjcmVhdGVzIHRoZSBwcmVmZXJlbmNlcyBidXQgZG9lcyBub3QgYWRkIHRoZW0uCisgICAgICogVGh1cywgaXQgY2FuIGJlIGNhbGxlZCBvbiBhbm90aGVyIHRocmVhZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGllbnRJZCB0aGUgaWQgb2YgdGhlIGNsaWVudCBmb3Igd2hpY2ggd2Ugd2FudCB0byBkaXNwbGF5IHRoZSBkaWN0aW9uYXJ5IGxpc3QKKyAgICAgKiBAcmV0dXJuIEEgY29sbGVjdGlvbiBvZiBwcmVmZXJlbmNlcyByZWFkeSB0byBhZGQgdG8gdGhlIGludGVyZmFjZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIENvbGxlY3Rpb248PyBleHRlbmRzIFByZWZlcmVuY2U+IGNyZWF0ZUluc3RhbGxlZERpY3RTZXR0aW5nc0NvbGxlY3Rpb24oCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2xpZW50SWQpIHsKKyAgICAgICAgLy8gVGhpcyB3aWxsIGRpcmVjdGx5IGNvbnRhY3QgdGhlIERpY3Rpb25hcnlQcm92aWRlciBhbmQgcmVxdWVzdCB0aGUgbGlzdCBleGFjdGx5IGxpa2UKKyAgICAgICAgLy8gYW55IHJlZ3VsYXIgY2xpZW50IHdvdWxkIGRvLgorICAgICAgICAvLyBDb25zaWRlcmluZyB0aGUgcmVzcGVjdGl2ZSB2YWx1ZSBvZiB0aGUgcmVzcGVjdGl2ZSBjb25zdGFudHMgdXNlZCBoZXJlIGZvciBlYWNoIHBhdGgsCisgICAgICAgIC8vIHNlZ21lbnQsIHRoZSB1cmwgZ2VuZXJhdGVkIGJ5IHRoaXMgaXMgb2YgdGhlIGZvcm0gKGFzc3VtaW5nICJjbGllbnRJZCIgYXMgYSBjbGllbnRJZCkKKyAgICAgICAgLy8gY29udGVudDovL2NvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmxhdGluLmRpY3Rpb25hcnlwYWNrL2NsaWVudElkL2xpc3Q/cHJvY290b2w9MgorICAgICAgICBmaW5hbCBVcmkgY29udGVudFVyaSA9IG5ldyBVcmkuQnVpbGRlcigpLnNjaGVtZShDb250ZW50UmVzb2x2ZXIuU0NIRU1FX0NPTlRFTlQpCisgICAgICAgICAgICAgICAgLmF1dGhvcml0eShnZXRTdHJpbmcoUi5zdHJpbmcuYXV0aG9yaXR5KSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kUGF0aChjbGllbnRJZCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kUGF0aChESUNUX0xJU1RfSUQpCisgICAgICAgICAgICAgICAgLy8gTmVlZCB0byB1c2UgdmVyc2lvbiAyIHRvIGdldCB0aGlzIGNsaWVudCdzIGxpc3QKKyAgICAgICAgICAgICAgICAuYXBwZW5kUXVlcnlQYXJhbWV0ZXIoRGljdGlvbmFyeVByb3ZpZGVyLlFVRVJZX1BBUkFNRVRFUl9QUk9UT0NPTF9WRVJTSU9OLCAiMiIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIGZpbmFsIEFjdGl2aXR5IGFjdGl2aXR5ID0gZ2V0QWN0aXZpdHkoKTsKKyAgICAgICAgZmluYWwgQ3Vyc29yIGN1cnNvciA9IG51bGwgPT0gYWN0aXZpdHkgPyBudWxsCisgICAgICAgICAgICAgICAgOiBhY3Rpdml0eS5nZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeShjb250ZW50VXJpLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKKworICAgICAgICBpZiAobnVsbCA9PSBjdXJzb3IpIHsKKyAgICAgICAgICAgIGZpbmFsIEFycmF5TGlzdDxQcmVmZXJlbmNlPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFByZWZlcmVuY2U+KCk7CisgICAgICAgICAgICByZXN1bHQuYWRkKGNyZWF0ZUVycm9yTWVzc2FnZShhY3Rpdml0eSwgUi5zdHJpbmcuY2Fubm90X2Nvbm5lY3RfdG9fZGljdF9zZXJ2aWNlKSk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9IGVsc2UgaWYgKCFjdXJzb3IubW92ZVRvRmlyc3QoKSkgeworICAgICAgICAgICAgZmluYWwgQXJyYXlMaXN0PFByZWZlcmVuY2U+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8UHJlZmVyZW5jZT4oKTsKKyAgICAgICAgICAgIHJlc3VsdC5hZGQoY3JlYXRlRXJyb3JNZXNzYWdlKGFjdGl2aXR5LCBSLnN0cmluZy5ub19kaWN0aW9uYXJpZXNfYXZhaWxhYmxlKSk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHN5c3RlbUxvY2FsZVN0cmluZyA9IExvY2FsZS5nZXREZWZhdWx0KCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGZpbmFsIFRyZWVNYXA8U3RyaW5nLCBXb3JkTGlzdFByZWZlcmVuY2U+IHByZWZMaXN0ID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFRyZWVNYXA8U3RyaW5nLCBXb3JkTGlzdFByZWZlcmVuY2U+KCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgaWRJbmRleCA9IGN1cnNvci5nZXRDb2x1bW5JbmRleChNZXRhZGF0YURiSGVscGVyLldPUkRMSVNUSURfQ09MVU1OKTsKKyAgICAgICAgICAgIGZpbmFsIGludCB2ZXJzaW9uSW5kZXggPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXgoTWV0YWRhdGFEYkhlbHBlci5WRVJTSU9OX0NPTFVNTik7CisgICAgICAgICAgICBmaW5hbCBpbnQgbG9jYWxlSW5kZXggPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXgoTWV0YWRhdGFEYkhlbHBlci5MT0NBTEVfQ09MVU1OKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBkZXNjcmlwdGlvbkluZGV4ID0gY3Vyc29yLmdldENvbHVtbkluZGV4KE1ldGFkYXRhRGJIZWxwZXIuREVTQ1JJUFRJT05fQ09MVU1OKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBzdGF0dXNJbmRleCA9IGN1cnNvci5nZXRDb2x1bW5JbmRleChNZXRhZGF0YURiSGVscGVyLlNUQVRVU19DT0xVTU4pOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB3b3JkbGlzdElkID0gY3Vyc29yLmdldFN0cmluZyhpZEluZGV4KTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdmVyc2lvbiA9IGN1cnNvci5nZXRJbnQodmVyc2lvbkluZGV4KTsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYWxlU3RyaW5nID0gY3Vyc29yLmdldFN0cmluZyhsb2NhbGVJbmRleCk7CisgICAgICAgICAgICAgICAgZmluYWwgTG9jYWxlIGxvY2FsZSA9IG5ldyBMb2NhbGUobG9jYWxlU3RyaW5nKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24gPSBjdXJzb3IuZ2V0U3RyaW5nKGRlc2NyaXB0aW9uSW5kZXgpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBzdGF0dXMgPSBjdXJzb3IuZ2V0SW50KHN0YXR1c0luZGV4KTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbWF0Y2hMZXZlbCA9IExvY2FsZVV0aWxzLmdldE1hdGNoTGV2ZWwoc3lzdGVtTG9jYWxlU3RyaW5nLCBsb2NhbGVTdHJpbmcpOworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtYXRjaExldmVsU3RyaW5nID0gTG9jYWxlVXRpbHMuZ2V0TWF0Y2hMZXZlbFNvcnRlZFN0cmluZyhtYXRjaExldmVsKTsKKyAgICAgICAgICAgICAgICAvLyBUaGUga2V5IGlzIHNvcnRlZCBpbiBsZXhpY29ncmFwaGljIG9yZGVyLCBhY2NvcmRpbmcgdG8gdGhlIG1hdGNoIGxldmVsLCB0aGVuCisgICAgICAgICAgICAgICAgLy8gdGhlIGRlc2NyaXB0aW9uLgorICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBrZXkgPSBtYXRjaExldmVsU3RyaW5nICsgIi4iICsgZGVzY3JpcHRpb24gKyAiLiIgKyB3b3JkbGlzdElkOworICAgICAgICAgICAgICAgIGZpbmFsIFdvcmRMaXN0UHJlZmVyZW5jZSBleGlzdGluZ1ByZWYgPSBwcmVmTGlzdC5nZXQoa2V5KTsKKyAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSBleGlzdGluZ1ByZWYgfHwgaGFzUHJpb3JpdHkoc3RhdHVzLCBleGlzdGluZ1ByZWYubVN0YXR1cykpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgV29yZExpc3RQcmVmZXJlbmNlIHByZWYgPSBuZXcgV29yZExpc3RQcmVmZXJlbmNlKGFjdGl2aXR5LCBtQ2xpZW50SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZGxpc3RJZCwgdmVyc2lvbiwgbG9jYWxlLCBkZXNjcmlwdGlvbiwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgcHJlZkxpc3QucHV0KGtleSwgcHJlZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAoY3Vyc29yLm1vdmVUb05leHQoKSk7CisgICAgICAgICAgICByZXR1cm4gcHJlZkxpc3QudmFsdWVzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kcyBvdXQgaWYgYSBnaXZlbiBzdGF0dXMgaGFzIHByaW9yaXR5IG92ZXIgYW5vdGhlciBmb3IgZGlzcGxheSBvcmRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuZXdTdGF0dXMKKyAgICAgKiBAcGFyYW0gb2xkU3RhdHVzCisgICAgICogQHJldHVybiB3aGV0aGVyIG5ld1N0YXR1cyBoYXMgcHJpb3JpdHkgb3ZlciBvbGRTdGF0dXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBoYXNQcmlvcml0eShmaW5hbCBpbnQgbmV3U3RhdHVzLCBmaW5hbCBpbnQgb2xkU3RhdHVzKSB7CisgICAgICAgIC8vIEJvdGggb2YgdGhlc2Ugc2hvdWxkIGJlIG9uZSBvZiBNZXRhZGF0YURiSGVscGVyLlNUQVRVU18qCisgICAgICAgIHJldHVybiBuZXdTdGF0dXMgPiBvbGRTdGF0dXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25PcHRpb25zSXRlbVNlbGVjdGVkKGZpbmFsIE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgc3dpdGNoIChpdGVtLmdldEl0ZW1JZCgpKSB7CisgICAgICAgIGNhc2UgTUVOVV9VUERBVEVfTk9XOgorICAgICAgICAgICAgaWYgKFZpZXcuR09ORSA9PSBtTG9hZGluZ1ZpZXcuZ2V0VmlzaWJpbGl0eSgpKSB7CisgICAgICAgICAgICAgICAgc3RhcnRSZWZyZXNoKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNhbmNlbFJlZnJlc2goKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RhcnRSZWZyZXNoKCkgeworICAgICAgICBzdGFydExvYWRpbmdBbmltYXRpb24oKTsKKyAgICAgICAgbUNoYW5nZWRTZXR0aW5ncyA9IHRydWU7CisgICAgICAgIFVwZGF0ZUhhbmRsZXIucmVnaXN0ZXJVcGRhdGVFdmVudExpc3RlbmVyKHRoaXMpOworICAgICAgICBmaW5hbCBBY3Rpdml0eSBhY3Rpdml0eSA9IGdldEFjdGl2aXR5KCk7CisgICAgICAgIG5ldyBUaHJlYWQoInVwZGF0ZUJ5SGFuZCIpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIFVwZGF0ZUhhbmRsZXIudXBkYXRlKGFjdGl2aXR5LCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfS5zdGFydCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjYW5jZWxSZWZyZXNoKCkgeworICAgICAgICBVcGRhdGVIYW5kbGVyLnVucmVnaXN0ZXJVcGRhdGVFdmVudExpc3RlbmVyKHRoaXMpOworICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBnZXRBY3Rpdml0eSgpOworICAgICAgICBVcGRhdGVIYW5kbGVyLmNhbmNlbFVwZGF0ZShjb250ZXh0LAorICAgICAgICAgICAgICAgIE1ldGFkYXRhRGJIZWxwZXIuZ2V0TWV0YWRhdGFVcmlBc1N0cmluZyhjb250ZXh0LCBtQ2xpZW50SWQpKTsKKyAgICAgICAgc3RvcExvYWRpbmdBbmltYXRpb24oKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RhcnRMb2FkaW5nQW5pbWF0aW9uKCkgeworICAgICAgICBtTG9hZGluZ1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICBnZXRWaWV3KCkuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICBtVXBkYXRlTm93TWVudS5zZXRUaXRsZShSLnN0cmluZy5jYW5jZWwpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdG9wTG9hZGluZ0FuaW1hdGlvbigpIHsKKyAgICAgICAgZmluYWwgVmlldyBwcmVmZXJlbmNlVmlldyA9IGdldFZpZXcoKTsKKyAgICAgICAgZmluYWwgQWN0aXZpdHkgYWN0aXZpdHkgPSBnZXRBY3Rpdml0eSgpOworICAgICAgICBpZiAobnVsbCA9PSBhY3Rpdml0eSkgcmV0dXJuOworICAgICAgICBhY3Rpdml0eS5ydW5PblVpVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2FkaW5nVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICAgICAgICAgIHByZWZlcmVuY2VWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgbUxvYWRpbmdWaWV3LnN0YXJ0QW5pbWF0aW9uKEFuaW1hdGlvblV0aWxzLmxvYWRBbmltYXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QWN0aXZpdHkoKSwgYW5kcm9pZC5SLmFuaW0uZmFkZV9vdXQpKTsKKyAgICAgICAgICAgICAgICAgICAgcHJlZmVyZW5jZVZpZXcuc3RhcnRBbmltYXRpb24oQW5pbWF0aW9uVXRpbHMubG9hZEFuaW1hdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eSgpLCBhbmRyb2lkLlIuYW5pbS5mYWRlX2luKSk7CisgICAgICAgICAgICAgICAgICAgIG1VcGRhdGVOb3dNZW51LnNldFRpdGxlKFIuc3RyaW5nLmNoZWNrX2Zvcl91cGRhdGVzX25vdyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svRG93bmxvYWRPdmVyTWV0ZXJlZERpYWxvZy5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svRG93bmxvYWRPdmVyTWV0ZXJlZERpYWxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzYzBhOTEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9Eb3dubG9hZE92ZXJNZXRlcmVkRGlhbG9nLmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorICogdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmRpY3Rpb25hcnlwYWNrOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuSHRtbDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi5SOworCitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworLyoqCisgKiBUaGlzIGltcGxlbWVudHMgdGhlIGRpYWxvZyBmb3IgYXNraW5nIHRoZSB1c2VyIHdoZXRoZXIgaXQncyBva2F5IHRvIGRvd25sb2FkIGRpY3Rpb25hcmllcyBvdmVyCisgKiBhIG1ldGVyZWQgY29ubmVjdGlvbiBvciBub3QgKGUuZy4gdGhlaXIgbW9iaWxlIGRhdGEgcGxhbikuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBEb3dubG9hZE92ZXJNZXRlcmVkRGlhbG9nIGV4dGVuZHMgQWN0aXZpdHkgeworICAgIGZpbmFsIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENMSUVOVF9JRF9LRVkgPSAiY2xpZW50X2lkIjsKKyAgICBmaW5hbCBwdWJsaWMgc3RhdGljIFN0cmluZyBXT1JETElTVF9UT19ET1dOTE9BRF9LRVkgPSAid29yZGxpc3RfdG9fZG93bmxvYWQiOworICAgIGZpbmFsIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNJWkVfS0VZID0gInNpemUiOworICAgIGZpbmFsIHB1YmxpYyBzdGF0aWMgU3RyaW5nIExPQ0FMRV9LRVkgPSAibG9jYWxlIjsKKyAgICBwcml2YXRlIFN0cmluZyBtQ2xpZW50SWQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgbVdvcmRMaXN0VG9Eb3dubG9hZDsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKGZpbmFsIEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IGdldEludGVudCgpOworICAgICAgICBtQ2xpZW50SWQgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoQ0xJRU5UX0lEX0tFWSk7CisgICAgICAgIG1Xb3JkTGlzdFRvRG93bmxvYWQgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoV09SRExJU1RfVE9fRE9XTkxPQURfS0VZKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGxvY2FsZVN0cmluZyA9IGludGVudC5nZXRTdHJpbmdFeHRyYShMT0NBTEVfS0VZKTsKKyAgICAgICAgZmluYWwgbG9uZyBzaXplID0gaW50ZW50LmdldEludEV4dHJhKFNJWkVfS0VZLCAwKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuZG93bmxvYWRfb3Zlcl9tZXRlcmVkKTsKKyAgICAgICAgc2V0VGV4dHMobG9jYWxlU3RyaW5nLCBzaXplKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0VGV4dHMoZmluYWwgU3RyaW5nIGxvY2FsZVN0cmluZywgZmluYWwgbG9uZyBzaXplKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBwcm9tcHRGb3JtYXQgPSBnZXRTdHJpbmcoUi5zdHJpbmcuc2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQpOworICAgICAgICBmaW5hbCBTdHJpbmcgYWxsb3dCdXR0b25Gb3JtYXQgPSBnZXRTdHJpbmcoUi5zdHJpbmcuZG93bmxvYWRfb3Zlcl9tZXRlcmVkKTsKKyAgICAgICAgZmluYWwgTG9jYWxlIGxvY2FsZSA9IExvY2FsZVV0aWxzLmNvbnN0cnVjdExvY2FsZUZyb21TdHJpbmcobG9jYWxlU3RyaW5nKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGxhbmd1YWdlID0gKG51bGwgPT0gbG9jYWxlID8gIiIgOiBsb2NhbGUuZ2V0RGlzcGxheUxhbmd1YWdlKCkpOworICAgICAgICBmaW5hbCBUZXh0VmlldyBwcm9tcHQgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQuZG93bmxvYWRfb3Zlcl9tZXRlcmVkX3Byb21wdCk7CisgICAgICAgIHByb21wdC5zZXRUZXh0KEh0bWwuZnJvbUh0bWwoU3RyaW5nLmZvcm1hdChwcm9tcHRGb3JtYXQsIGxhbmd1YWdlKSkpOworICAgICAgICBmaW5hbCBCdXR0b24gYWxsb3dCdXR0b24gPSAoQnV0dG9uKWZpbmRWaWV3QnlJZChSLmlkLmFsbG93X2J1dHRvbik7CisgICAgICAgIGFsbG93QnV0dG9uLnNldFRleHQoU3RyaW5nLmZvcm1hdChhbGxvd0J1dHRvbkZvcm1hdCwgKChmbG9hdClzaXplKS8oMTAyNCoxMDI0KSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2tEZW55KGZpbmFsIFZpZXcgdikgeworICAgICAgICBVcGRhdGVIYW5kbGVyLnNldERvd25sb2FkT3Zlck1ldGVyZWRTZXR0aW5nKHRoaXMsIGZhbHNlKTsKKyAgICAgICAgZmluaXNoKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25DbGlja0FsbG93KGZpbmFsIFZpZXcgdikgeworICAgICAgICBVcGRhdGVIYW5kbGVyLnNldERvd25sb2FkT3Zlck1ldGVyZWRTZXR0aW5nKHRoaXMsIHRydWUpOworICAgICAgICBVcGRhdGVIYW5kbGVyLmluc3RhbGxJZk5ldmVyUmVxdWVzdGVkKHRoaXMsIG1DbGllbnRJZCwgbVdvcmRMaXN0VG9Eb3dubG9hZCwKKyAgICAgICAgICAgICAgICBmYWxzZSAvKiBtYXlQcm9tcHQgKi8pOworICAgICAgICBmaW5pc2goKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9Eb3dubG9hZFJlY29yZC5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svRG93bmxvYWRSZWNvcmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjYyOTkwCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svRG93bmxvYWRSZWNvcmQuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5kaWN0aW9uYXJ5cGFjazsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOworCisvKioKKyAqIFN0cnVjdCBjbGFzcyB0byBlbmNhcHN1bGF0ZSBhIGNsaWVudCBJRCB3aXRoIGNvbnRlbnQgdmFsdWVzIGFib3V0IGEgZG93bmxvYWQuCisgKi8KK3B1YmxpYyBjbGFzcyBEb3dubG9hZFJlY29yZCB7CisgICAgcHVibGljIGZpbmFsIFN0cmluZyBtQ2xpZW50SWQ7CisgICAgLy8gT25seSB3b3JkIGxpc3RzIGhhdmUgYXR0cmlidXRlcywgYW5kIHRoZSBDb250ZW50VmFsdWVzIHNob3VsZCBjb250YWluIHRoZSBzYW1lCisgICAgLy8ga2V5cyBhcyB0aGV5IGRvIGZvciBhbGwgTWV0YWRhdGFEYkhlbHBlciBmdW5jdGlvbnMuIFNpbmNlIG9ubHkgd29yZCBsaXN0cyBoYXZlCisgICAgLy8gYXR0cmlidXRlcywgYSBudWxsIHBvaW50ZXIgaGVyZSBtZWFucyB0aGlzIHJlY29yZCByZXByZXNlbnRzIG1ldGFkYXRhLgorICAgIHB1YmxpYyBmaW5hbCBDb250ZW50VmFsdWVzIG1BdHRyaWJ1dGVzOworICAgIHB1YmxpYyBEb3dubG9hZFJlY29yZChmaW5hbCBTdHJpbmcgY2xpZW50SWQsIGZpbmFsIENvbnRlbnRWYWx1ZXMgYXR0cmlidXRlcykgeworICAgICAgICBtQ2xpZW50SWQgPSBjbGllbnRJZDsKKyAgICAgICAgbUF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzOworICAgIH0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc01ldGFkYXRhKCkgeworICAgICAgICByZXR1cm4gbnVsbCA9PSBtQXR0cmlidXRlczsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svRXZlbnRIYW5kbGVyLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9FdmVudEhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmM0YTgzCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svRXZlbnRIYW5kbGVyLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorICogdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmRpY3Rpb25hcnlwYWNrOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uTGF0aW5JTUU7CitpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uUjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBFdmVudEhhbmRsZXIgZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IEV2ZW50SGFuZGxlci5jbGFzcy5nZXROYW1lKCk7CisKKyAgICAvKioKKyAgICAgKiBSZWNlaXZlcyBhIGludGVudCBicm9hZGNhc3QuCisgICAgICoKKyAgICAgKiBXZSByZWNlaXZlIGV2ZXJ5IGRheSBhIGJyb2FkY2FzdCBpbmRpY2F0aW5nIHRoYXQgZGF0ZSBjaGFuZ2VkLgorICAgICAqIFRoZW4gd2Ugd2FpdCBhIHJhbmRvbSBhbW91bnQgb2YgdGltZSBiZWZvcmUgYWN0dWFsbHkgcmVnaXN0ZXJpbmcKKyAgICAgKiB0aGUgZG93bmxvYWQsIHRvIGF2b2lkIGNvbmNlbnRyYXRpbmcgdG9vIG1hbnkgYWNjZXNzZXMgYXJvdW5kCisgICAgICogbWlkbmlnaHQgaW4gbW9yZSBwb3B1bGF0ZWQgdGltZXpvbmVzLgorICAgICAqIFdlIHJlY2VpdmUgYWxsIGJyb2FkY2FzdHMgaGVyZSwgc28gdGhpcyBjYW4gYmUgZWl0aGVyIHRoZSBEQVRFX0NIQU5HRUQgYnJvYWRjYXN0LCB0aGUKKyAgICAgKiBVUERBVEVfTk9XIHByaXZhdGUgYnJvYWRjYXN0IHRoYXQgd2UgcmVjZWl2ZSB3aGVuIHRoZSB0aW1lLXJhbmRvbWl6aW5nIGFsYXJtIHRyaWdnZXJzCisgICAgICogZm9yIHJlZ3VsYXIgdXBkYXRlIG9yIGZyb20gYXBwbGljYXRpb25zIHRoYXQgd2FudCB0byB0ZXN0IHRoZSBkaWN0aW9uYXJ5IHBhY2ssIG9yIGEKKyAgICAgKiBicm9hZGNhc3QgZnJvbSBEb3dubG9hZE1hbmFnZXIgdGVsbGluZyB0aGF0IGEgZG93bmxvYWQgaGFzIGZpbmlzaGVkLgorICAgICAqIFNlZSBpbnNpZGUgb2YgQW5kcm9pZE1hbmlmZXN0LnhtbCB0byBzZWUgd2hpY2ggZXZlbnRzIGFyZSBjYXVnaHQuCisgICAgICogQWxzbyBAc2VlIHtAbGluayBCcm9hZGNhc3RSZWNlaXZlciNvblJlY2VpdmUoQ29udGV4dCwgSW50ZW50KX0KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0IG9mIHRoZSBhcHBsaWNhdGlvbi4KKyAgICAgKiBAcGFyYW0gaW50ZW50IHRoZSBpbnRlbnQgdGhhdCB3YXMgYnJvYWRjYXN0LgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShmaW5hbCBDb250ZXh0IGNvbnRleHQsIGZpbmFsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgaW50ZW50LnNldENsYXNzKGNvbnRleHQsIERpY3Rpb25hcnlTZXJ2aWNlLmNsYXNzKTsKKyAgICAgICAgY29udGV4dC5zdGFydFNlcnZpY2UoaW50ZW50KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9Mb2NhbGVVdGlscy5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svTG9jYWxlVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGU4NDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svTG9jYWxlVXRpbHMuamF2YQpAQCAtMCwwICsxLDIwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorICogdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmRpY3Rpb25hcnlwYWNrOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworCisvKioKKyAqIEEgY2xhc3MgdG8gaGVscCB3aXRoIGhhbmRsaW5nIExvY2FsZXMgaW4gc3RyaW5nIGZvcm0uCisgKgorICogVGhpcyBmaWxlIGhhcyB0aGUgc2FtZSBtZWFuaW5nIGFuZCBmZWF0dXJlcyAoYW5kIHNoYXJlcyBhbGwgb2YgaXRzIGNvZGUpIHdpdGggdGhlIG9uZSB3aXRoIHRoZQorICogc2FtZSBuYW1lIGluIExhdGluIElNRS4gVGhleSBuZWVkIHRvIGJlIGtlcHQgc3luY2hyb25pemVkOyBmb3IgYW55IHVwZGF0ZS9idWdmaXggdG8KKyAqIHRoaXMgZmlsZSwgY29uc2lkZXIgYWxzbyB1cGRhdGluZy9maXhpbmcgdGhlIHZlcnNpb24gaW4gTGF0aW4gSU1FLgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTG9jYWxlVXRpbHMgeworICAgIHByaXZhdGUgTG9jYWxlVXRpbHMoKSB7CisgICAgICAgIC8vIEludGVudGlvbmFsIGVtcHR5IGNvbnN0cnVjdG9yIGZvciB1dGlsaXR5IGNsYXNzLgorICAgIH0KKworICAgIC8vIExvY2FsZSBtYXRjaCBsZXZlbCBjb25zdGFudHMuCisgICAgLy8gQSBoaWdoZXIgbGV2ZWwgb2YgbWF0Y2ggaXMgZ3VhcmFudGVlZCB0byBoYXZlIGEgaGlnaGVyIG51bWVyaWNhbCB2YWx1ZS4KKyAgICAvLyBTb21lIHJvb20gaXMgbGVmdCB3aXRoaW4gY29uc3RhbnRzIHRvIGFkZCBtYXRjaCBjYXNlcyB0aGF0IG1heSBhcmlzZSBuZWNlc3NhcnkKKyAgICAvLyBpbiB0aGUgZnV0dXJlLCBmb3IgZXhhbXBsZSBkaWZmZXJlbnRpYXRpbmcgYmV0d2VlbiB0aGUgY2FzZSB3aGVyZSB0aGUgY291bnRyaWVzCisgICAgLy8gYXJlIGJvdGggcHJlc2VudCBhbmQgZGlmZmVyZW50LCBhbmQgdGhlIGNhc2Ugd2hlcmUgb25lIG9mIHRoZSBsb2NhbGVzIGRvZXMgbm90CisgICAgLy8gc3BlY2lmeSB0aGUgY291bnRyaWVzLiBUaGlzIGRpZmZlcmVuY2UgaXMgbm90IG5lZWRlZCBub3cuCisKKyAgICAvLyBOb3RoaW5nIG1hdGNoZXMuCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DQUxFX05PX01BVENIID0gMDsKKyAgICAvLyBUaGUgbGFuZ3VhZ2VzIG1hdGNoZXMsIGJ1dCB0aGUgY291bnRyeSBhcmUgZGlmZmVyZW50LiBPciwgdGhlIHJlZmVyZW5jZSBsb2NhbGUgcmVxdWlyZXMgYQorICAgIC8vIGNvdW50cnkgYW5kIHRoZSB0ZXN0ZWQgbG9jYWxlIGRvZXMgbm90IGhhdmUgb25lLgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ0FMRV9MQU5HVUFHRV9NQVRDSF9DT1VOVFJZX0RJRkZFUiA9IDM7CisgICAgLy8gVGhlIGxhbmd1YWdlcyBhbmQgY291bnRyeSBtYXRjaCwgYnV0IHRoZSB2YXJpYW50cyBhcmUgZGlmZmVyZW50LiBPciwgdGhlIHJlZmVyZW5jZSBsb2NhbGUKKyAgICAvLyByZXF1aXJlcyBhIHZhcmlhbnQgYW5kIHRoZSB0ZXN0ZWQgbG9jYWxlIGRvZXMgbm90IGhhdmUgb25lLgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ0FMRV9MQU5HVUFHRV9BTkRfQ09VTlRSWV9NQVRDSF9WQVJJQU5UX0RJRkZFUiA9IDY7CisgICAgLy8gVGhlIHJlcXVpcmVkIGxvY2FsZSBpcyBudWxsIG9yIGVtcHR5IHNvIGl0IHdpbGwgYWNjZXB0IGFueXRoaW5nLCBhbmQgdGhlIHRlc3RlZCBsb2NhbGUKKyAgICAvLyBpcyBub24tbnVsbCBhbmQgbm9uLWVtcHR5LgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ0FMRV9BTllfTUFUQ0ggPSAxMDsKKyAgICAvLyBUaGUgbGFuZ3VhZ2UgbWF0Y2hlcywgYW5kIHRoZSB0ZXN0ZWQgbG9jYWxlIHNwZWNpZmllcyBhIGNvdW50cnkgYnV0IHRoZSByZWZlcmVuY2UgbG9jYWxlCisgICAgLy8gZG9lcyBub3QgcmVxdWlyZSBvbmUuCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DQUxFX0xBTkdVQUdFX01BVENIID0gMTU7CisgICAgLy8gVGhlIGxhbmd1YWdlIGFuZCB0aGUgY291bnRyeSBtYXRjaCwgYW5kIHRoZSB0ZXN0ZWQgbG9jYWxlIHNwZWNpZmllcyBhIHZhcmlhbnQgYnV0IHRoZQorICAgIC8vIHJlZmVyZW5jZSBsb2NhbGUgZG9lcyBub3QgcmVxdWlyZSBvbmUuCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DQUxFX0xBTkdVQUdFX0FORF9DT1VOVFJZX01BVENIID0gMjA7CisgICAgLy8gVGhlIGNvbXBhcmVkIGxvY2FsZXMgYXJlIGZ1bGx5IGlkZW50aWNhbC4gVGhpcyBpcyB0aGUgYmVzdCBtYXRjaCBsZXZlbC4KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NBTEVfRlVMTF9NQVRDSCA9IDMwOworCisgICAgLy8gVGhlIGxldmVsIGF0IHdoaWNoIGEgbWF0Y2ggaXMgIm5vcm1hbGx5IiBjb25zaWRlcmVkIGEgbG9jYWxlIG1hdGNoIHdpdGggc3RhbmRhcmQgYWxnb3JpdGhtcy4KKyAgICAvLyBEb24ndCB1c2UgdGhpcyBkaXJlY3RseSwgdXNlICNpc01hdGNoIHRvIHRlc3QuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExPQ0FMRV9NQVRDSCA9IExPQ0FMRV9BTllfTUFUQ0g7CisKKyAgICAvLyBNYWtlIHRoaXMgbWF0Y2ggdGhlIG1heGltdW0gbWF0Y2ggbGV2ZWwuIElmIHRoaXMgZXZvbHZlcyB0byBoYXZlIG1vcmUgdGhhbiAyIGRpZ2l0cworICAgIC8vIHdoZW4gd3JpdHRlbiBpbiBiYXNlIDEwLCBhbHNvIGFkanVzdCB0aGUgZ2V0TWF0Y2hMZXZlbFNvcnRlZFN0cmluZyBtZXRob2QuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BVENIX0xFVkVMX01BWCA9IDMwOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGhvdyB3ZWxsIGEgdGVzdGVkIGxvY2FsZSBtYXRjaGVzIGEgcmVmZXJlbmNlIGxvY2FsZS4KKyAgICAgKgorICAgICAqIFRoaXMgd2lsbCBjaGVjayB0aGUgdGVzdGVkIGxvY2FsZSBhZ2FpbnN0IHRoZSByZWZlcmVuY2UgbG9jYWxlIGFuZCByZXR1cm4gYSBtZWFzdXJlIG9mIGhvdworICAgICAqIGEgd2VsbCBpdCBtYXRjaGVzIHRoZSByZWZlcmVuY2UuIFRoZSBnZW5lcmFsIGlkZWEgaXMgdGhhdCB0aGUgdGVzdGVkIGxvY2FsZSBoYXMgdG8gbWF0Y2gKKyAgICAgKiBldmVyeSBzcGVjaWZpZWQgcGFydCBvZiB0aGUgcmVxdWlyZWQgbG9jYWxlLiBBIGZ1bGwgbWF0Y2ggb2NjdXIgd2hlbiB0aGV5IGFyZSBlcXVhbCwgYQorICAgICAqIHBhcnRpYWwgbWF0Y2ggd2hlbiB0aGUgdGVzdGVkIGxvY2FsZSBhZ3JlZXMgd2l0aCB0aGUgcmVmZXJlbmNlIGxvY2FsZSBidXQgaXMgbW9yZSBzcGVjaWZpYywKKyAgICAgKiBhbmQgYSBkaWZmZXJlbmNlIHdoZW4gdGhlIHRlc3RlZCBsb2NhbGUgZG9lcyBub3QgY29tcGx5IHdpdGggYWxsIHJlcXVpcmVtZW50cyBmcm9tIHRoZQorICAgICAqIHJlZmVyZW5jZSBsb2NhbGUuCisgICAgICogSW4gbW9yZSBkZXRhaWwsIGlmIHRoZSByZWZlcmVuY2UgbG9jYWxlIHNwZWNpZmllcyBhdCBsZWFzdCBhIGxhbmd1YWdlIGFuZCB0aGUgdGVzdGVkTG9jYWxlCisgICAgICogZG9lcyBub3Qgc3BlY2lmeSBvbmUsIG9yIHNwZWNpZmllcyBhIGRpZmZlcmVudCBvbmUsIExPQ0FMRV9OT19NQVRDSCBpcyByZXR1cm5lZC4gSWYgdGhlCisgICAgICogcmVmZXJlbmNlIGxvY2FsZSBpcyBlbXB0eSBvciBudWxsLCBpdCB3aWxsIG1hdGNoIGFueXRoaW5nIC0gaW4gdGhlIGZvcm0gb2YgTE9DQUxFX0ZVTExfTUFUQ0gKKyAgICAgKiBpZiB0aGUgdGVzdGVkIGxvY2FsZSBpcyBlbXB0eSBvciBudWxsLCBhbmQgTE9DQUxFX0FOWV9NQVRDSCBvdGhlcndpc2UuIElmIHRoZSByZWZlcmVuY2UgYW5kCisgICAgICogdGVzdGVkIGxvY2FsZSBhZ3JlZSBvbiB0aGUgbGFuZ3VhZ2UsIGJ1dCBub3Qgb24gdGhlIGNvdW50cnksCisgICAgICogTE9DQUxFX0xBTkdVQUdFX01BVENIX0NPVU5UUllfRElGRkVSIGlzIHJldHVybmVkIGlmIHRoZSByZWZlcmVuY2UgbG9jYWxlIHNwZWNpZmllcyBhIGNvdW50cnksCisgICAgICogYW5kIExPQ0FMRV9MQU5HVUFHRV9NQVRDSCBvdGhlcndpc2UuCisgICAgICogSWYgdGhleSBhZ3JlZSBvbiBib3RoIHRoZSBsYW5ndWFnZSBhbmQgdGhlIGNvdW50cnksIGJ1dCBub3Qgb24gdGhlIHZhcmlhbnQsCisgICAgICogTE9DQUxFX0xBTkdVQUdFX0FORF9DT1VOVFJZX01BVENIX1ZBUklBTlRfRElGRkVSIGlzIHJldHVybmVkIGlmIHRoZSByZWZlcmVuY2UgbG9jYWxlCisgICAgICogc3BlY2lmaWVzIGEgdmFyaWFudCwgYW5kIExPQ0FMRV9MQU5HVUFHRV9BTkRfQ09VTlRSWV9NQVRDSCBvdGhlcndpc2UuIElmIGV2ZXJ5dGhpbmcgbWF0Y2hlcywKKyAgICAgKiBMT0NBTEVfRlVMTF9NQVRDSCBpcyByZXR1cm5lZC4KKyAgICAgKiBFeGFtcGxlczoKKyAgICAgKiBlbiA8PT4gZW5fVVMgID0+IExPQ0FMRV9MQU5HVUFHRV9NQVRDSAorICAgICAqIGVuX1VTIDw9PiBlbiA9PiBMT0NBTEVfTEFOR1VBR0VfTUFUQ0hfQ09VTlRSWV9ESUZGRVIKKyAgICAgKiBlbl9VU19QT1NJWCA8PT4gZW5fVVNfQW5kcm9pZCAgPT4gIExPQ0FMRV9MQU5HVUFHRV9BTkRfQ09VTlRSWV9NQVRDSF9WQVJJQU5UX0RJRkZFUgorICAgICAqIGVuX1VTIDw9PiBlbl9VU19BbmRyb2lkID0+IExPQ0FMRV9MQU5HVUFHRV9BTkRfQ09VTlRSWV9NQVRDSAorICAgICAqIHNwX1VTIDw9PiBlbl9VUyAgPT4gIExPQ0FMRV9OT19NQVRDSAorICAgICAqIGRlIDw9PiBkZSAgPT4gTE9DQUxFX0ZVTExfTUFUQ0gKKyAgICAgKiBlbl9VUyA8PT4gZW5fVVMgPT4gTE9DQUxFX0ZVTExfTUFUQ0gKKyAgICAgKiAiIiA8PT4gZW5fVVMgPT4gTE9DQUxFX0FOWV9NQVRDSAorICAgICAqCisgICAgICogQHBhcmFtIHJlZmVyZW5jZUxvY2FsZSB0aGUgcmVmZXJlbmNlIGxvY2FsZSB0byB0ZXN0IGFnYWluc3QuCisgICAgICogQHBhcmFtIHRlc3RlZExvY2FsZSB0aGUgbG9jYWxlIHRvIHRlc3QuCisgICAgICogQHJldHVybiBhIGNvbnN0YW50IHRoYXQgbWVhc3VyZXMgaG93IHdlbGwgdGhlIHRlc3RlZCBsb2NhbGUgbWF0Y2hlcyB0aGUgcmVmZXJlbmNlIGxvY2FsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRNYXRjaExldmVsKGZpbmFsIFN0cmluZyByZWZlcmVuY2VMb2NhbGUsIGZpbmFsIFN0cmluZyB0ZXN0ZWRMb2NhbGUpIHsKKyAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHJlZmVyZW5jZUxvY2FsZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBUZXh0VXRpbHMuaXNFbXB0eSh0ZXN0ZWRMb2NhbGUpID8gTE9DQUxFX0ZVTExfTUFUQ0ggOiBMT0NBTEVfQU5ZX01BVENIOworICAgICAgICB9CisgICAgICAgIGlmIChudWxsID09IHRlc3RlZExvY2FsZSkgcmV0dXJuIExPQ0FMRV9OT19NQVRDSDsKKyAgICAgICAgZmluYWwgU3RyaW5nW10gcmVmZXJlbmNlUGFyYW1zID0gcmVmZXJlbmNlTG9jYWxlLnNwbGl0KCJfIiwgMyk7CisgICAgICAgIGZpbmFsIFN0cmluZ1tdIHRlc3RlZFBhcmFtcyA9IHRlc3RlZExvY2FsZS5zcGxpdCgiXyIsIDMpOworICAgICAgICAvLyBCeSBzcGVjIG9mIFN0cmluZyNzcGxpdCwgWzBdIGNhbm5vdCBiZSBudWxsIGFuZCBsZW5ndGggY2Fubm90IGJlIDAuCisgICAgICAgIGlmICghcmVmZXJlbmNlUGFyYW1zWzBdLmVxdWFscyh0ZXN0ZWRQYXJhbXNbMF0pKSByZXR1cm4gTE9DQUxFX05PX01BVENIOworICAgICAgICBzd2l0Y2ggKHJlZmVyZW5jZVBhcmFtcy5sZW5ndGgpIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgcmV0dXJuIDEgPT0gdGVzdGVkUGFyYW1zLmxlbmd0aCA/IExPQ0FMRV9GVUxMX01BVENIIDogTE9DQUxFX0xBTkdVQUdFX01BVENIOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBpZiAoMSA9PSB0ZXN0ZWRQYXJhbXMubGVuZ3RoKSByZXR1cm4gTE9DQUxFX0xBTkdVQUdFX01BVENIX0NPVU5UUllfRElGRkVSOworICAgICAgICAgICAgaWYgKCFyZWZlcmVuY2VQYXJhbXNbMV0uZXF1YWxzKHRlc3RlZFBhcmFtc1sxXSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIExPQ0FMRV9MQU5HVUFHRV9NQVRDSF9DT1VOVFJZX0RJRkZFUjsKKyAgICAgICAgICAgIGlmICgzID09IHRlc3RlZFBhcmFtcy5sZW5ndGgpIHJldHVybiBMT0NBTEVfTEFOR1VBR0VfQU5EX0NPVU5UUllfTUFUQ0g7CisgICAgICAgICAgICByZXR1cm4gTE9DQUxFX0ZVTExfTUFUQ0g7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIGlmICgxID09IHRlc3RlZFBhcmFtcy5sZW5ndGgpIHJldHVybiBMT0NBTEVfTEFOR1VBR0VfTUFUQ0hfQ09VTlRSWV9ESUZGRVI7CisgICAgICAgICAgICBpZiAoIXJlZmVyZW5jZVBhcmFtc1sxXS5lcXVhbHModGVzdGVkUGFyYW1zWzFdKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTE9DQUxFX0xBTkdVQUdFX01BVENIX0NPVU5UUllfRElGRkVSOworICAgICAgICAgICAgaWYgKDIgPT0gdGVzdGVkUGFyYW1zLmxlbmd0aCkgcmV0dXJuIExPQ0FMRV9MQU5HVUFHRV9BTkRfQ09VTlRSWV9NQVRDSF9WQVJJQU5UX0RJRkZFUjsKKyAgICAgICAgICAgIGlmICghcmVmZXJlbmNlUGFyYW1zWzJdLmVxdWFscyh0ZXN0ZWRQYXJhbXNbMl0pKQorICAgICAgICAgICAgICAgIHJldHVybiBMT0NBTEVfTEFOR1VBR0VfQU5EX0NPVU5UUllfTUFUQ0hfVkFSSUFOVF9ESUZGRVI7CisgICAgICAgICAgICByZXR1cm4gTE9DQUxFX0ZVTExfTUFUQ0g7CisgICAgICAgIH0KKyAgICAgICAgLy8gSXQgc2hvdWxkIGJlIGltcG9zc2libGUgdG8gY29tZSBoZXJlCisgICAgICAgIHJldHVybiBMT0NBTEVfTk9fTUFUQ0g7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgc3RyaW5nIHRoYXQgcmVwcmVzZW50cyB0aGlzIG1hdGNoIGxldmVsLCB3aXRoIGJldHRlciBtYXRjaGVzIGZpcnN0LgorICAgICAqCisgICAgICogVGhlIHN0cmluZ3MgYXJlIHNvcnRlZCBpbiBsZXhpY29ncmFwaGljIG9yZGVyOiBhIGJldHRlciBtYXRjaCB3aWxsIGFsd2F5cyBiZSBsZXNzIHRoYW4KKyAgICAgKiBhIHdvcnNlIG1hdGNoIHdoZW4gY29tcGFyZWQgdG9nZXRoZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWF0Y2hMZXZlbFNvcnRlZFN0cmluZyhmaW5hbCBpbnQgbWF0Y2hMZXZlbCkgeworICAgICAgICAvLyBUaGlzIHdvcmtzIGJlY2F1c2UgdGhlIG1hdGNoIGxldmVscyBhcmUgMH45OSAoYWN0dWFsbHkgMH4zMCkKKyAgICAgICAgLy8gSWRlYWxseSB0aGlzIHNob3VsZCB1c2UgYSBudW1iZXIgb2YgZGlnaXRzIGVxdWFscyB0byB0aGUgMW9nMTAgb2YgdGhlIGdyZWF0ZXIgbWF0Y2hMZXZlbAorICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJTAyZCIsIE1BVENIX0xFVkVMX01BWCAtIG1hdGNoTGV2ZWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgb3V0IHdoZXRoZXIgYSBtYXRjaCBsZXZlbCBzaG91bGQgYmUgY29uc2lkZXJlZCBhIG1hdGNoLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgdGFrZXMgYSBtYXRjaCBsZXZlbCBhcyByZXR1cm5lZCBieSB0aGUgI2dldE1hdGNoTGV2ZWwgbWV0aG9kLCBhbmQgcmV0dXJucyB3aGV0aGVyCisgICAgICogaXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBtYXRjaCBpbiB0aGUgdXN1YWwgc2Vuc2Ugd2l0aCBzdGFuZGFyZCBMb2NhbGUgZnVuY3Rpb25zLgorICAgICAqCisgICAgICogQHBhcmFtIGxldmVsIHRoZSBtYXRjaCBsZXZlbCwgYXMgcmV0dXJuZWQgYnkgZ2V0TWF0Y2hMZXZlbC4KKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBpcyBhIG1hdGNoIG9yIG5vdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNYXRjaChmaW5hbCBpbnQgbGV2ZWwpIHsKKyAgICAgICAgcmV0dXJuIExPQ0FMRV9NQVRDSCA8PSBsZXZlbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBzeXN0ZW0gbG9jYWxlIGZvciB0aGlzIHByb2Nlc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzIHRoZSByZXNvdXJjZXMgdG8gdXNlLiBQYXNzIGN1cnJlbnQgcmVzb3VyY2VzLgorICAgICAqIEBwYXJhbSBuZXdMb2NhbGUgdGhlIGxvY2FsZSB0byBjaGFuZ2UgdG8uCisgICAgICogQHJldHVybiB0aGUgb2xkIGxvY2FsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExvY2FsZSBzZXRTeXN0ZW1Mb2NhbGUoZmluYWwgUmVzb3VyY2VzIHJlcywgZmluYWwgTG9jYWxlIG5ld0xvY2FsZSkgeworICAgICAgICBmaW5hbCBDb25maWd1cmF0aW9uIGNvbmYgPSByZXMuZ2V0Q29uZmlndXJhdGlvbigpOworICAgICAgICBmaW5hbCBMb2NhbGUgc2F2ZUxvY2FsZSA9IGNvbmYubG9jYWxlOworICAgICAgICBjb25mLmxvY2FsZSA9IG5ld0xvY2FsZTsKKyAgICAgICAgcmVzLnVwZGF0ZUNvbmZpZ3VyYXRpb24oY29uZiwgcmVzLmdldERpc3BsYXlNZXRyaWNzKCkpOworICAgICAgICByZXR1cm4gc2F2ZUxvY2FsZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPFN0cmluZywgTG9jYWxlPiBzTG9jYWxlQ2FjaGUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExvY2FsZT4oKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBsb2NhbGUgZnJvbSBhIHN0cmluZyBzcGVjaWZpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxlIGNvbnN0cnVjdExvY2FsZUZyb21TdHJpbmcoZmluYWwgU3RyaW5nIGxvY2FsZVN0cikgeworICAgICAgICBpZiAobG9jYWxlU3RyID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgc3luY2hyb25pemVkIChzTG9jYWxlQ2FjaGUpIHsKKyAgICAgICAgICAgIGlmIChzTG9jYWxlQ2FjaGUuY29udGFpbnNLZXkobG9jYWxlU3RyKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gc0xvY2FsZUNhY2hlLmdldChsb2NhbGVTdHIpOworICAgICAgICAgICAgTG9jYWxlIHJldHZhbCA9IG51bGw7CisgICAgICAgICAgICBTdHJpbmdbXSBsb2NhbGVQYXJhbXMgPSBsb2NhbGVTdHIuc3BsaXQoIl8iLCAzKTsKKyAgICAgICAgICAgIGlmIChsb2NhbGVQYXJhbXMubGVuZ3RoID09IDEpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSBuZXcgTG9jYWxlKGxvY2FsZVBhcmFtc1swXSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGxvY2FsZVBhcmFtcy5sZW5ndGggPT0gMikgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IG5ldyBMb2NhbGUobG9jYWxlUGFyYW1zWzBdLCBsb2NhbGVQYXJhbXNbMV0pOworICAgICAgICAgICAgfSBlbHNlIGlmIChsb2NhbGVQYXJhbXMubGVuZ3RoID09IDMpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSBuZXcgTG9jYWxlKGxvY2FsZVBhcmFtc1swXSwgbG9jYWxlUGFyYW1zWzFdLCBsb2NhbGVQYXJhbXNbMl0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJldHZhbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc0xvY2FsZUNhY2hlLnB1dChsb2NhbGVTdHIsIHJldHZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svTG9nUHJvYmxlbVJlcG9ydGVyLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9Mb2dQcm9ibGVtUmVwb3J0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTI3YWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svTG9nUHJvYmxlbVJlcG9ydGVyLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorICogdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmRpY3Rpb25hcnlwYWNrOworCitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworLyoqCisgKiBBIHZlcnkgc2ltcGxlIHByb2JsZW0gcmVwb3J0ZXIuCisgKi8KK2ZpbmFsIGNsYXNzIExvZ1Byb2JsZW1SZXBvcnRlciBpbXBsZW1lbnRzIFByb2JsZW1SZXBvcnRlciB7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVEFHOworCisgICAgcHVibGljIExvZ1Byb2JsZW1SZXBvcnRlcihmaW5hbCBTdHJpbmcgdGFnKSB7CisgICAgICAgIFRBRyA9IHRhZzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZXBvcnQoZmluYWwgRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgTG9nLmUoVEFHLCAiUmVwb3J0aW5nIHByb2JsZW0gOiAiICsgZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svTUQ1Q2FsY3VsYXRvci5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svTUQ1Q2FsY3VsYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0N2U4NmUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9NRDVDYWxjdWxhdG9yLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAqIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5kaWN0aW9uYXJ5cGFjazsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7CisKK2ZpbmFsIGNsYXNzIE1ENUNhbGN1bGF0b3IgeworICAgIHByaXZhdGUgTUQ1Q2FsY3VsYXRvcigpIHt9IC8vIFRoaXMgaGVscGVyIGNsYXNzIGlzIG5vdCBpbnN0YW50aWFibGUKKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrc3VtKGZpbmFsIElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBUaGlzIGNvZGUgZnJvbSB0aGUgQW5kcm9pZCBkb2N1bWVudGF0aW9uIGZvciBNZXNzYWdlRGlnZXN0LiBOZWFybHkgdmVyYmF0aW0uCisgICAgICAgIE1lc3NhZ2VEaWdlc3QgZGlnZXN0ZXI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkaWdlc3RlciA9IE1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoIk1ENSIpOworICAgICAgICB9IGNhdGNoIChqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gUGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydCBNRDUgOiBjYW4ndCBjaGVjaywgc28gcmV0dXJuIG51bGwKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVs4MTkyXTsKKyAgICAgICAgaW50IGJ5dGVDb3VudDsKKyAgICAgICAgd2hpbGUgKChieXRlQ291bnQgPSBpbi5yZWFkKGJ5dGVzKSkgPiAwKSB7CisgICAgICAgICAgICBkaWdlc3Rlci51cGRhdGUoYnl0ZXMsIDAsIGJ5dGVDb3VudCk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgYnl0ZVtdIGRpZ2VzdCA9IGRpZ2VzdGVyLmRpZ2VzdCgpOworICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHMgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpZ2VzdC5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgcy5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiJTEkMDJ4IiwgZGlnZXN0W2ldKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHMudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9NZXRhZGF0YURiSGVscGVyLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9NZXRhZGF0YURiSGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVmNTQ1YQotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL01ldGFkYXRhRGJIZWxwZXIuamF2YQpAQCAtMCwwICsxLDk3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorICogdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmRpY3Rpb25hcnlwYWNrOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZTsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVPcGVuSGVscGVyOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uUjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOworCisvKioKKyAqIFZhcmlvdXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIHN0YXRlIGRhdGFiYXNlCisgKi8KK3B1YmxpYyBjbGFzcyBNZXRhZGF0YURiSGVscGVyIGV4dGVuZHMgU1FMaXRlT3BlbkhlbHBlciB7CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gTWV0YWRhdGFEYkhlbHBlci5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CisKKyAgICAvLyBUaGlzIHdhcyB0aGUgaW5pdGlhbCByZWxlYXNlIHZlcnNpb24gb2YgdGhlIGRhdGFiYXNlLiBJdCBzaG91bGQgbmV2ZXIgYmUKKyAgICAvLyBjaGFuZ2VkIGdvaW5nIGZvcndhcmQuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FVEFEQVRBX0RBVEFCQVNFX0lOSVRJQUxfVkVSU0lPTiA9IDM7CisgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgcmVsZWFzZWQgdmVyc2lvbiBvZiB0aGUgZGF0YWJhc2UgdGhhdCBpbXBsZW1lbnRzIENMSUVOVElELiBJdCBpcworICAgIC8vIHVzZWQgdG8gaWRlbnRpZnkgdGhlIHZlcnNpb25zIGZvciB1cGdyYWRlcy4gVGhpcyBzaG91bGQgbmV2ZXIgY2hhbmdlIGdvaW5nIGZvcndhcmQuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FVEFEQVRBX0RBVEFCQVNFX1ZFUlNJT05fV0lUSF9DTElFTlRJRCA9IDU7CisgICAgLy8gVGhpcyBpcyB0aGUgY3VycmVudCBkYXRhYmFzZSB2ZXJzaW9uLiBJdCBzaG91bGQgYmUgdXBkYXRlZCB3aGVuIHRoZSBkYXRhYmFzZSBzY2hlbWEKKyAgICAvLyBnZXRzIHVwZGF0ZWQuIEl0IGlzIHBhc3NlZCB0byB0aGUgZnJhbWV3b3JrIGNvbnN0cnVjdG9yIG9mIFNRTGl0ZU9wZW5IZWxwZXIsIHNvCisgICAgLy8gdGhhdCdzIHdoYXQgdGhlIGZyYW1ld29yayB1c2VzIHRvIHRyYWNrIG91ciBkYXRhYmFzZSB2ZXJzaW9uLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVRBREFUQV9EQVRBQkFTRV9WRVJTSU9OID0gNTsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGxvbmcgTk9UX0FfRE9XTkxPQURfSUQgPSAtMTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX1RBQkxFX05BTUUgPSAicGVuZGluZ1VwZGF0ZXMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTElFTlRfVEFCTEVfTkFNRSA9ICJjbGllbnRzIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRU5ESU5HSURfQ09MVU1OID0gInBlbmRpbmdpZCI7IC8vIERvd25sb2FkIE1hbmFnZXIgSUQKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0NPTFVNTiA9ICJ0eXBlIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFUVVNfQ09MVU1OID0gInN0YXR1cyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQUxFX0NPTFVNTiA9ICJsb2NhbGUiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUkRMSVNUSURfQ09MVU1OID0gImlkIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9DT0xVTU4gPSAiZGVzY3JpcHRpb24iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMX0ZJTEVOQU1FX0NPTFVNTiA9ICJmaWxlbmFtZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1RFX0ZJTEVOQU1FX0NPTFVNTiA9ICJ1cmwiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEVfQ09MVU1OID0gImRhdGUiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIRUNLU1VNX0NPTFVNTiA9ICJjaGVja3N1bSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRVNJWkVfQ09MVU1OID0gImZpbGVzaXplIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX0NPTFVNTiA9ICJ2ZXJzaW9uIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRWRVJTSU9OX0NPTFVNTiA9ICJmb3JtYXR2ZXJzaW9uIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHU19DT0xVTU4gPSAiZmxhZ3MiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9DT1VOVCA9IDEzOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMSUVOVF9DTElFTlRfSURfQ09MVU1OID0gImNsaWVudGlkIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJRU5UX01FVEFEQVRBX1VSSV9DT0xVTU4gPSAidXJpIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJRU5UX0xBU1RfVVBEQVRFX0RBVEVfQ09MVU1OID0gImxhc3R1cGRhdGUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTElFTlRfUEVORElOR0lEX0NPTFVNTiA9ICJwZW5kaW5naWQiOyAvLyBEb3dubG9hZCBNYW5hZ2VyIElECisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBREFUQV9EQVRBQkFTRV9OQU1FX1NURU0gPSAicGVuZGluZ1VwZGF0ZXMiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX1VQREFURV9ERVNDUklQVElPTiA9ICJtZXRhZGF0YSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUNUSU9OQVJJRVNfQVNTRVRTX1BBVEggPSAiZGljdGlvbmFyaWVzIjsKKworICAgIC8vIFN0YXR1c2VzLCBmb3Igc3RvcmluZyBpbiB0aGUgU1RBVFVTX0NPTFVNTgorICAgIC8vIElNUE9SVEFOVDogVGhlIGZvbGxvd2luZyBhcmUgdXNlZCBhcyBpbmRleCBhcnJheXMgaW4gLi4vV29yZExpc3RQcmVmZXJlbmNlCisgICAgLy8gRG8gbm90IGNoYW5nZSB0aGVpciB2YWx1ZXMgd2l0aG91dCB1cGRhdGluZyB0aGUgbWF0Y2hlZCBjb2RlLgorICAgIC8vIFVua25vd24gc3RhdHVzOiB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4uCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX1VOS05PV04gPSAwOworICAgIC8vIEF2YWlsYWJsZTogdGhpcyB3b3JkIGxpc3QgaXMgYXZhaWxhYmxlLCBidXQgaXQgaXMgbm90IGRvd25sb2FkZWQgKG5vdCBkb3dubG9hZGluZyksIGJlY2F1c2UKKyAgICAvLyBpdCBpcyBzZXQgbm90IHRvIGJlIHVzZWQuCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0FWQUlMQUJMRSA9IDE7CisgICAgLy8gRG93bmxvYWRpbmc6IHRoaXMgd29yZCBsaXN0IGlzIGJlaW5nIGRvd25sb2FkZWQuCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0RPV05MT0FESU5HID0gMjsKKyAgICAvLyBJbnN0YWxsZWQ6IHRoaXMgd29yZCBsaXN0IGlzIGluc3RhbGxlZCBhbmQgdXNhYmxlLgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19JTlNUQUxMRUQgPSAzOworICAgIC8vIERpc2FibGVkOiB0aGlzIHdvcmQgbGlzdCBpcyBpbnN0YWxsZWQsIGJ1dCBoYXMgYmVlbiBkaXNhYmxlZCBieSB0aGUgdXNlci4KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfRElTQUJMRUQgPSA0OworICAgIC8vIERlbGV0aW5nOiB0aGUgdXNlciBtYXJrZWQgdGhpcyB3b3JkIGxpc3QgdG8gYmUgZGVsZXRlZCwgYnV0IGl0IGhhcyBub3QgYmVlbiB5ZXQgYmVjYXVzZQorICAgIC8vIExhdGluIElNRSBpcyBub3QgdXAgeWV0LgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19ERUxFVElORyA9IDU7CisKKyAgICAvLyBUeXBlcywgZm9yIHN0b3JpbmcgaW4gdGhlIFRZUEVfQ09MVU1OCisgICAgLy8gVGhpcyBpcyBtZXRhZGF0YSBhYm91dCB3aGF0IGlzIGF2YWlsYWJsZS4KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX01FVEFEQVRBID0gMTsKKyAgICAvLyBUaGlzIGlzIGEgYnVsayBmaWxlLiBJdCBzaG91bGQgcmVwbGFjZSBvbGRlciBmaWxlcy4KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0JVTEsgPSAyOworICAgIC8vIFRoaXMgaXMgYW4gaW5jcmVtZW50YWwgdXBkYXRlLCBleHBlY3RlZCB0byBiZSBzbWFsbCwgYW5kIG1lYW5pbmdsZXNzIG9uIGl0cyBvd24uCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9VUERBVEUgPSAzOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX1RBQkxFX0NSRUFURSA9CisgICAgICAgICAgICAiQ1JFQVRFIFRBQkxFICIgKyBNRVRBREFUQV9UQUJMRV9OQU1FICsgIiAoIgorICAgICAgICAgICAgKyBQRU5ESU5HSURfQ09MVU1OICsgIiBJTlRFR0VSLCAiCisgICAgICAgICAgICArIFRZUEVfQ09MVU1OICsgIiBJTlRFR0VSLCAiCisgICAgICAgICAgICArIFNUQVRVU19DT0xVTU4gKyAiIElOVEVHRVIsICIKKyAgICAgICAgICAgICsgV09SRExJU1RJRF9DT0xVTU4gKyAiIFRFWFQsICIKKyAgICAgICAgICAgICsgTE9DQUxFX0NPTFVNTiArICIgVEVYVCwgIgorICAgICAgICAgICAgKyBERVNDUklQVElPTl9DT0xVTU4gKyAiIFRFWFQsICIKKyAgICAgICAgICAgICsgTE9DQUxfRklMRU5BTUVfQ09MVU1OICsgIiBURVhULCAiCisgICAgICAgICAgICArIFJFTU9URV9GSUxFTkFNRV9DT0xVTU4gKyAiIFRFWFQsICIKKyAgICAgICAgICAgICsgREFURV9DT0xVTU4gKyAiIElOVEVHRVIsICIKKyAgICAgICAgICAgICsgQ0hFQ0tTVU1fQ09MVU1OICsgIiBURVhULCAiCisgICAgICAgICAgICArIEZJTEVTSVpFX0NPTFVNTiArICIgSU5URUdFUiwgIgorICAgICAgICAgICAgKyBWRVJTSU9OX0NPTFVNTiArICIgSU5URUdFUiwiCisgICAgICAgICAgICArIEZPUk1BVFZFUlNJT05fQ09MVU1OICsgIiBJTlRFR0VSLCIKKyAgICAgICAgICAgICsgRkxBR1NfQ09MVU1OICsgIiBJTlRFR0VSLCIKKyAgICAgICAgICAgICsgIlBSSU1BUlkgS0VZICgiICsgV09SRExJU1RJRF9DT0xVTU4gKyAiLCIgKyBWRVJTSU9OX0NPTFVNTiArICIpKTsiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBREFUQV9DUkVBVEVfQ0xJRU5UX1RBQkxFID0KKyAgICAgICAgICAgICJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyAiICsgQ0xJRU5UX1RBQkxFX05BTUUgKyAiICgiCisgICAgICAgICAgICArIENMSUVOVF9DTElFTlRfSURfQ09MVU1OICsgIiBURVhULCAiCisgICAgICAgICAgICArIENMSUVOVF9NRVRBREFUQV9VUklfQ09MVU1OICsgIiBURVhULCAiCisgICAgICAgICAgICArIENMSUVOVF9MQVNUX1VQREFURV9EQVRFX0NPTFVNTiArICIgSU5URUdFUiBOT1QgTlVMTCBERUZBVUxUIDAsICIKKyAgICAgICAgICAgICsgQ0xJRU5UX1BFTkRJTkdJRF9DT0xVTU4gKyAiIElOVEVHRVIsICIKKyAgICAgICAgICAgICsgRkxBR1NfQ09MVU1OICsgIiBJTlRFR0VSLCAiCisgICAgICAgICAgICArICJQUklNQVJZIEtFWSAoIiArIENMSUVOVF9DTElFTlRfSURfQ09MVU1OICsgIikpOyI7CisKKyAgICAvLyBMaXN0IG9mIGFsbCBtZXRhZGF0YSB0YWJsZSBjb2x1bW5zLgorICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBNRVRBREFUQV9UQUJMRV9DT0xVTU5TID0geyBQRU5ESU5HSURfQ09MVU1OLCBUWVBFX0NPTFVNTiwKKyAgICAgICAgICAgIFNUQVRVU19DT0xVTU4sIFdPUkRMSVNUSURfQ09MVU1OLCBMT0NBTEVfQ09MVU1OLCBERVNDUklQVElPTl9DT0xVTU4sCisgICAgICAgICAgICBMT0NBTF9GSUxFTkFNRV9DT0xVTU4sIFJFTU9URV9GSUxFTkFNRV9DT0xVTU4sIERBVEVfQ09MVU1OLCBDSEVDS1NVTV9DT0xVTU4sCisgICAgICAgICAgICBGSUxFU0laRV9DT0xVTU4sIFZFUlNJT05fQ09MVU1OLCBGT1JNQVRWRVJTSU9OX0NPTFVNTiwgRkxBR1NfQ09MVU1OIH07CisgICAgLy8gTGlzdCBvZiBhbGwgY2xpZW50IHRhYmxlIGNvbHVtbnMuCisgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENMSUVOVF9UQUJMRV9DT0xVTU5TID0geyBDTElFTlRfQ0xJRU5UX0lEX0NPTFVNTiwKKyAgICAgICAgICAgIENMSUVOVF9NRVRBREFUQV9VUklfQ09MVU1OLCBDTElFTlRfUEVORElOR0lEX0NPTFVNTiwgRkxBR1NfQ09MVU1OIH07CisgICAgLy8gTGlzdCBvZiBwdWJsaWMgY29sdW1ucyByZXR1cm5lZCB0byBjbGllbnRzLiBFdmVyeXRoaW5nIHRoYXQgaXMgbm90IGluIHRoaXMgbGlzdCBpcworICAgIC8vIHByaXZhdGUgYW5kIGltcGxlbWVudGF0aW9uLWRlcGVuZGVudC4KKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gRElDVElPTkFSSUVTX0xJU1RfUFVCTElDX0NPTFVNTlMgPSB7IFNUQVRVU19DT0xVTU4sIFdPUkRMSVNUSURfQ09MVU1OLAorICAgICAgICAgICAgTE9DQUxFX0NPTFVNTiwgREVTQ1JJUFRJT05fQ09MVU1OLCBEQVRFX0NPTFVNTiwgRklMRVNJWkVfQ09MVU1OLCBWRVJTSU9OX0NPTFVNTiB9OworCisgICAgLy8gVGhpcyBjbGFzcyBleGhpYml0cyBhIHNpbmdsZXRvbi1saWtlIGJlaGF2aW9yIGJ5IGNsaWVudCBJRCwgc28gaXQgaXMgZ2V0SW5zdGFuY2UnZAorICAgIC8vIGFuZCBoYXMgYSBwcml2YXRlIGMndG9yLgorICAgIHByaXZhdGUgc3RhdGljIFRyZWVNYXA8U3RyaW5nLCBNZXRhZGF0YURiSGVscGVyPiBzSW5zdGFuY2VNYXAgPSBudWxsOworICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIE1ldGFkYXRhRGJIZWxwZXIgZ2V0SW5zdGFuY2UoZmluYWwgQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNsaWVudElkT3JOdWxsKSB7CisgICAgICAgIC8vIEFzIGEgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBmZWF0dXJlLCBudWxsIGNhbiBiZSBwYXNzZWQgaGVyZSB0byByZXRyaWV2ZSB0aGUgImRlZmF1bHQiCisgICAgICAgIC8vIGRhdGFiYXNlLiBCZWZvcmUgbXVsdGktY2xpZW50IHN1cHBvcnQsIHRoZSBkaWN0aW9uYXJ5IHBhY2tlZCB1c2VkIG9ubHkgb25lIGRhdGFiYXNlCisgICAgICAgIC8vIGFuZCB3b3VsZCBub3QgYmUgYWJsZSB0byBoYW5kbGUgc2V2ZXJhbCBkaWN0aW9uYXJ5IHNldHMuIFBhc3NpbmcgbnVsbCBoZXJlIHJldHJpZXZlcworICAgICAgICAvLyB0aGlzIGxlZ2FjeSBkYXRhYmFzZS4gTmV3IGNsaWVudHMgc2hvdWxkIG1ha2Ugc3VyZSB0byBhbHdheXMgcGFzcyBhIGNsaWVudCBJRCBzbyBhcworICAgICAgICAvLyB0byBhdm9pZCBjb25mbGljdHMuCisgICAgICAgIGZpbmFsIFN0cmluZyBjbGllbnRJZCA9IG51bGwgIT0gY2xpZW50SWRPck51bGwgPyBjbGllbnRJZE9yTnVsbCA6ICIiOworICAgICAgICBpZiAobnVsbCA9PSBzSW5zdGFuY2VNYXApIHNJbnN0YW5jZU1hcCA9IG5ldyBUcmVlTWFwPFN0cmluZywgTWV0YWRhdGFEYkhlbHBlcj4oKTsKKyAgICAgICAgTWV0YWRhdGFEYkhlbHBlciBoZWxwZXIgPSBzSW5zdGFuY2VNYXAuZ2V0KGNsaWVudElkKTsKKyAgICAgICAgaWYgKG51bGwgPT0gaGVscGVyKSB7CisgICAgICAgICAgICBoZWxwZXIgPSBuZXcgTWV0YWRhdGFEYkhlbHBlcihjb250ZXh0LCBjbGllbnRJZCk7CisgICAgICAgICAgICBzSW5zdGFuY2VNYXAucHV0KGNsaWVudElkLCBoZWxwZXIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBoZWxwZXI7CisgICAgfQorICAgIHByaXZhdGUgTWV0YWRhdGFEYkhlbHBlcihmaW5hbCBDb250ZXh0IGNvbnRleHQsIGZpbmFsIFN0cmluZyBjbGllbnRJZCkgeworICAgICAgICBzdXBlcihjb250ZXh0LAorICAgICAgICAgICAgICAgIE1FVEFEQVRBX0RBVEFCQVNFX05BTUVfU1RFTSArIChUZXh0VXRpbHMuaXNFbXB0eShjbGllbnRJZCkgPyAiIiA6ICIuIiArIGNsaWVudElkKSwKKyAgICAgICAgICAgICAgICBudWxsLCBNRVRBREFUQV9EQVRBQkFTRV9WRVJTSU9OKTsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICBtQ2xpZW50SWQgPSBjbGllbnRJZDsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUNsaWVudElkOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBkYXRhYmFzZSBpdHNlbGYuIFRoaXMgYWx3YXlzIHJldHVybnMgdGhlIHNhbWUgb2JqZWN0IGZvciBhbnkgY2xpZW50IElELiBJZiB0aGUKKyAgICAgKiBjbGllbnQgSUQgaXMgbnVsbCwgYSBkZWZhdWx0IGRhdGFiYXNlIGlzIHJldHVybmVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiBEb24ndAorICAgICAqIHBhc3MgbnVsbCBmb3IgbmV3IGNhbGxzLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgdGhlIGNvbnRleHQgdG8gY3JlYXRlIHRoZSBkYXRhYmFzZSBmcm9tLiBUaGlzIGlzIGlnbm9yZWQgYWZ0ZXIgdGhlIGZpcnN0IGNhbGwuCisgICAgICogQHBhcmFtIGNsaWVudElkIHRoZSBjbGllbnQgaWQgdG8gcmV0cmlldmUgdGhlIGRhdGFiYXNlIG9mLiBudWxsIGZvciBkZWZhdWx0IChkZXByZWNhdGVkKQorICAgICAqIEByZXR1cm4gdGhlIGRhdGFiYXNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU1FMaXRlRGF0YWJhc2UgZ2V0RGIoZmluYWwgQ29udGV4dCBjb250ZXh0LCBmaW5hbCBTdHJpbmcgY2xpZW50SWQpIHsKKyAgICAgICAgcmV0dXJuIGdldEluc3RhbmNlKGNvbnRleHQsIGNsaWVudElkKS5nZXRXcml0YWJsZURhdGFiYXNlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUNsaWVudFRhYmxlKGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiKSB7CisgICAgICAgIC8vIFRoZSBjbGllbnRzIHRhYmxlIG9ubHkgZXhpc3RzIGluIHRoZSBwcmltYXJ5IGRiLCB0aGUgb25lIHRoYXQgaGFzIGFuIGVtcHR5IGNsaWVudCBpZAorICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KG1DbGllbnRJZCkpIHJldHVybjsKKyAgICAgICAgZGIuZXhlY1NRTChNRVRBREFUQV9DUkVBVEVfQ0xJRU5UX1RBQkxFKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlZmF1bHRNZXRhZGF0YVVyaSA9IG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5kZWZhdWx0X21ldGFkYXRhX3VyaSk7CisgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoZGVmYXVsdE1ldGFkYXRhVXJpKSkgeworICAgICAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyBkZWZhdWx0TWV0YWRhdGFWYWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOworICAgICAgICAgICAgZGVmYXVsdE1ldGFkYXRhVmFsdWVzLnB1dChDTElFTlRfQ0xJRU5UX0lEX0NPTFVNTiwgIiIpOworICAgICAgICAgICAgZGVmYXVsdE1ldGFkYXRhVmFsdWVzLnB1dChDTElFTlRfTUVUQURBVEFfVVJJX0NPTFVNTiwgZGVmYXVsdE1ldGFkYXRhVXJpKTsKKyAgICAgICAgICAgIGRiLmluc2VydChDTElFTlRfVEFCTEVfTkFNRSwgbnVsbCwgZGVmYXVsdE1ldGFkYXRhVmFsdWVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSB0aGUgdGFibGUgYW5kIHBvcHVsYXRlIGl0IHdpdGggdGhlIHJlc291cmNlcyBmb3VuZCBpbnNpZGUgdGhlIGFway4KKyAgICAgKgorICAgICAqIEBzZWUgU1FMaXRlT3BlbkhlbHBlciNvbkNyZWF0ZShTUUxpdGVEYXRhYmFzZSkKKyAgICAgKgorICAgICAqIEBwYXJhbSBkYiB0aGUgZGF0YWJhc2UgdG8gY3JlYXRlIGFuZCBwb3B1bGF0ZS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShmaW5hbCBTUUxpdGVEYXRhYmFzZSBkYikgeworICAgICAgICBkYi5leGVjU1FMKE1FVEFEQVRBX1RBQkxFX0NSRUFURSk7CisgICAgICAgIGNyZWF0ZUNsaWVudFRhYmxlKGRiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVcGdyYWRlIHRoZSBkYXRhYmFzZS4gVXBncmFkZSBmcm9tIHZlcnNpb24gMyBpcyBzdXBwb3J0ZWQuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25VcGdyYWRlKGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiLCBmaW5hbCBpbnQgb2xkVmVyc2lvbiwgZmluYWwgaW50IG5ld1ZlcnNpb24pIHsKKyAgICAgICAgaWYgKE1FVEFEQVRBX0RBVEFCQVNFX0lOSVRJQUxfVkVSU0lPTiA9PSBvbGRWZXJzaW9uCisgICAgICAgICAgICAgICAgJiYgTUVUQURBVEFfREFUQUJBU0VfVkVSU0lPTl9XSVRIX0NMSUVOVElEID09IG5ld1ZlcnNpb24pIHsKKyAgICAgICAgICAgIC8vIFVwZ3JhZGUgZnJvbSB2ZXJzaW9uIE1FVEFEQVRBX0RBVEFCQVNFX0lOSVRJQUxfVkVSU0lPTiB0byB2ZXJzaW9uCisgICAgICAgICAgICAvLyBNRVRBREFUQV9EQVRBQkFTRV9WRVJTSU9OX1dJVEhfQ0xJRU5UX0lECisgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkobUNsaWVudElkKSkgeworICAgICAgICAgICAgICAgIC8vIE9ubHkgdGhlIGRlZmF1bHQgZGF0YWJhc2Ugc2hvdWxkIGNvbnRhaW4gdGhlIGNsaWVudCB0YWJsZS4KKyAgICAgICAgICAgICAgICAvLyBBbnl3YXkgaW4gdmVyc2lvbiAzIG9ubHkgdGhlIGRlZmF1bHQgdGFibGUgZXhpc3RlZCBzbyB0aGUgZW1wdHluZXNzCisgICAgICAgICAgICAgICAgLy8gdGVzdCBzaG91bGQgYWx3YXlzIGJlIHRydWUsIGJ1dCBiZXR0ZXIgY2hlY2sgdG8gYmUgc3VyZS4KKyAgICAgICAgICAgICAgICBjcmVhdGVDbGllbnRUYWJsZShkYik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBWZXJzaW9uIDMgd2FzIHRoZSBlYXJsaWVzdCB2ZXJzaW9uLCBzbyB3ZSBzaG91bGQgbmV2ZXIgY29tZSBoZXJlLiBJZiB3ZSBkbywgd2UKKyAgICAgICAgICAgIC8vIGhhdmUgbm8gaWRlYSB3aGF0IHRoaXMgZGF0YWJhc2UgaXMsIHNvIHdlJ2QgYmV0dGVyIHdpcGUgaXQgb2ZmLgorICAgICAgICAgICAgZGIuZXhlY1NRTCgiRFJPUCBUQUJMRSBJRiBFWElTVFMgIiArIE1FVEFEQVRBX1RBQkxFX05BTUUpOworICAgICAgICAgICAgZGIuZXhlY1NRTCgiRFJPUCBUQUJMRSBJRiBFWElTVFMgIiArIENMSUVOVF9UQUJMRV9OQU1FKTsKKyAgICAgICAgICAgIG9uQ3JlYXRlKGRiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERvd25ncmFkZSB0aGUgZGF0YWJhc2UuIFRoaXMgZHJvcHMgYW5kIHJlY3JlYXRlcyB0aGUgdGFibGUgaW4gYWxsIGNhc2VzLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRG93bmdyYWRlKGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiLCBmaW5hbCBpbnQgb2xkVmVyc2lvbiwgZmluYWwgaW50IG5ld1ZlcnNpb24pIHsKKyAgICAgICAgLy8gTm8gbWF0dGVyIHdoYXQgdGhlIG51bWVyaWNhbCB2YWx1ZXMgb2Ygb2xkVmVyc2lvbiBhbmQgbmV3VmVyc2lvbiBhcmUsIHdlIGtub3cgdGhpcworICAgICAgICAvLyBpcyBhIGRvd25ncmFkZSAobmV3VmVyc2lvbiA8IG9sZFZlcnNpb24pLiBUaGVyZSBpcyBubyB3YXkgdG8ga25vdyB3aGF0IHRoZSBmdXR1cmUKKyAgICAgICAgLy8gZGF0YWJhc2VzIHdpbGwgbG9vayBsaWtlLCBidXQgd2Uga25vdyBpdCdzIGV4dHJlbWVseSBsaWtlbHkgdGhhdCBpdCdzIG9rYXkgdG8ganVzdAorICAgICAgICAvLyBkcm9wIHRoZSB0YWJsZXMgYW5kIHN0YXJ0IGZyb20gc2NyYXRjaC4gSGVuY2UsIHdlIGlnbm9yZSB0aGUgdmVyc2lvbnMgYW5kIGp1c3Qgd2lwZQorICAgICAgICAvLyBldmVyeXRoaW5nIHdlIHdhbnQgdG8gdXNlLgorICAgICAgICBpZiAob2xkVmVyc2lvbiA8PSBuZXdWZXJzaW9uKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJvbkRvd25ncmFkZSBkYXRhYmFzZSBidXQgbmV3IHZlcnNpb24gaXMgaGlnaGVyPyAiICsgb2xkVmVyc2lvbiArICIgPD0gIgorICAgICAgICAgICAgICAgICAgICArIG5ld1ZlcnNpb24pOworICAgICAgICB9CisgICAgICAgIGRiLmV4ZWNTUUwoIkRST1AgVEFCTEUgSUYgRVhJU1RTICIgKyBNRVRBREFUQV9UQUJMRV9OQU1FKTsKKyAgICAgICAgZGIuZXhlY1NRTCgiRFJPUCBUQUJMRSBJRiBFWElTVFMgIiArIENMSUVOVF9UQUJMRV9OQU1FKTsKKyAgICAgICAgb25DcmVhdGUoZGIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdpdmVuIGEgY2xpZW50IElELCByZXR1cm5zIHdoZXRoZXIgdGhpcyBjbGllbnQgZXhpc3RzLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgYSBjb250ZXh0IHRvIG9wZW4gdGhlIGRhdGFiYXNlCisgICAgICogQHBhcmFtIGNsaWVudElkIHRoZSBjbGllbnQgSUQgdG8gY2hlY2sKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNsaWVudCBpcyBrbm93biwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ2xpZW50S25vd24oZmluYWwgQ29udGV4dCBjb250ZXh0LCBmaW5hbCBTdHJpbmcgY2xpZW50SWQpIHsKKyAgICAgICAgLy8gSWYgdGhlIGNsaWVudCBpcyBrbm93biwgdGhleSdsbCBoYXZlIGEgbm9uLW51bGwgbWV0YWRhdGEgVVJJLiBBbiBlbXB0eSBzdHJpbmcgaXMKKyAgICAgICAgLy8gYWxsb3dlZCBhcyBhIG1ldGFkYXRhIFVSSSwgaWYgdGhlIGNsaWVudCBkb2Vzbid0IHdhbnQgYW55IHVwZGF0ZXMgdG8gaGFwcGVuLgorICAgICAgICByZXR1cm4gbnVsbCAhPSBnZXRNZXRhZGF0YVVyaUFzU3RyaW5nKGNvbnRleHQsIGNsaWVudElkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtZXRhZGF0YSBVUkkgYXMgYSBzdHJpbmcuCisgICAgICoKKyAgICAgKiBJZiB0aGUgY2xpZW50IGlzIG5vdCBrbm93biwgdGhpcyB3aWxsIHJldHVybiBudWxsLiBJZiBpdCBpcyBrbm93biwgaXQgd2lsbCByZXR1cm4KKyAgICAgKiB0aGUgVVJJIGFzIGEgc3RyaW5nLiBOb3RlIHRoYXQgdGhlIGVtcHR5IHN0cmluZyBpcyBhIHZhbGlkIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgYSBjb250ZXh0IGluc3RhbmNlIHRvIG9wZW4gdGhlIGRhdGFiYXNlIG9uCisgICAgICogQHBhcmFtIGNsaWVudElkIHRoZSBJRCBvZiB0aGUgY2xpZW50IHdlIHdhbnQgdGhlIG1ldGFkYXRhIFVSSSBvZgorICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgVVJJCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWV0YWRhdGFVcmlBc1N0cmluZyhmaW5hbCBDb250ZXh0IGNvbnRleHQsIGZpbmFsIFN0cmluZyBjbGllbnRJZCkgeworICAgICAgICBTUUxpdGVEYXRhYmFzZSBkZWZhdWx0RGIgPSBnZXREYihjb250ZXh0LCBudWxsKTsKKyAgICAgICAgZmluYWwgQ3Vyc29yIGN1cnNvciA9IGRlZmF1bHREYi5xdWVyeShDTElFTlRfVEFCTEVfTkFNRSwKKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBDTElFTlRfTUVUQURBVEFfVVJJX0NPTFVNTiB9LAorICAgICAgICAgICAgICAgIENMSUVOVF9DTElFTlRfSURfQ09MVU1OICsgIiA9ID8iLCBuZXcgU3RyaW5nW10geyBjbGllbnRJZCB9LAorICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKCFjdXJzb3IubW92ZVRvRmlyc3QoKSkgcmV0dXJuIG51bGw7CisgICAgICAgICAgICByZXR1cm4gY3Vyc29yLmdldFN0cmluZygwKTsgLy8gT25seSBvbmUgY29sdW1uLCByZXR1cm4gaXQKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGN1cnNvci5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXBkYXRlIHRoZSBsYXN0IG1ldGFkYXRhIHVwZGF0ZSB0aW1lIGZvciBhbGwgY2xpZW50cyB1c2luZyBhIHBhcnRpY3VsYXIgVVJJLgorICAgICAqCisgICAgICogQWxsIGNsaWVudHMgdXNpbmcgdGhpcyBtZXRhZGF0YSBVUkkgd2lsbCBiZSBpbmRpY2F0ZWQgYXMgaGF2aW5nIGJlZW4gdXBkYXRlZCBub3cuCisgICAgICogVGhlIGN1cnJlbnQgdGltZSBpcyB1c2VkIGFzIHRoZSBsYXRlc3QgdXBkYXRlIHRpbWUuIFRoaXMgc2F2ZWQgZGF0ZSB3aWxsIGJlIHdoYXQKKyAgICAgKiBpcyByZXR1cm5lZCBoZW5jZWZvcnRoIGJ5IHtAbGluayAjZ2V0TGFzdFVwZGF0ZURhdGVGb3JDbGllbnQoQ29udGV4dCwgU3RyaW5nKX0sCisgICAgICogdW50aWwgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGFnYWluLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgYSBjb250ZXh0IGluc3RhbmNlIHRvIG9wZW4gdGhlIGRhdGFiYXNlIG9uCisgICAgICogQHBhcmFtIHVyaSB0aGUgbWV0YWRhdGEgVVJJIHdlIGp1c3QgZG93bmxvYWRlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlTGFzdFVwZGF0ZVRpbWVPZlVyaShmaW5hbCBDb250ZXh0IGNvbnRleHQsIGZpbmFsIFN0cmluZyB1cmkpIHsKKyAgICAgICAgUHJpdmF0ZUxvZy5sb2coIlNhdmUgbGFzdCB1cGRhdGUgdGltZSBvZiBVUkkgOiAiICsgdXJpICsgIiAiICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCksCisgICAgICAgICAgICAgICAgY29udGV4dCk7CisgICAgICAgIGZpbmFsIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKKyAgICAgICAgdmFsdWVzLnB1dChDTElFTlRfTEFTVF9VUERBVEVfREFURV9DT0xVTU4sIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICAgICAgZmluYWwgU1FMaXRlRGF0YWJhc2UgZGVmYXVsdERiID0gZ2V0RGIoY29udGV4dCwgbnVsbCk7CisgICAgICAgIGRlZmF1bHREYi51cGRhdGUoQ0xJRU5UX1RBQkxFX05BTUUsIHZhbHVlcywKKyAgICAgICAgICAgICAgICBDTElFTlRfTUVUQURBVEFfVVJJX0NPTFVNTiArICIgPSA/IiwgbmV3IFN0cmluZ1tdIHsgdXJpIH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgbGFzdCBkYXRlIGF0IHdoaWNoIHdlIHVwZGF0ZWQgdGhlIG1ldGFkYXRhIGZvciB0aGlzIGNsaWVudC4KKyAgICAgKgorICAgICAqIFRoZSByZXR1cm5lZCBkYXRlIGlzIGluIG1pbGxpc2Vjb25kcyBmcm9tIHRoZSBFUE9DSDsgdGhpcyBpcyB0aGUgc2FtZSB1bml0IGFzCisgICAgICogcmV0dXJuZWQgYnkge0BsaW5rIFN5c3RlbSNjdXJyZW50VGltZU1pbGxpcygpfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IGEgY29udGV4dCBpbnN0YW5jZSB0byBvcGVuIHRoZSBkYXRhYmFzZSBvbgorICAgICAqIEBwYXJhbSBjbGllbnRJZCB0aGUgY2xpZW50IElEIHRvIGdldCB0aGUgbGF0ZXN0IHVwZGF0ZSBkYXRlIG9mCisgICAgICogQHJldHVybiB0aGUgbGFzdCBkYXRlIGF0IHdoaWNoIHRoaXMgY2xpZW50IHdhcyB1cGRhdGVkLCBhcyBhIGxvbmcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBsb25nIGdldExhc3RVcGRhdGVEYXRlRm9yQ2xpZW50KGZpbmFsIENvbnRleHQgY29udGV4dCwgZmluYWwgU3RyaW5nIGNsaWVudElkKSB7CisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRlZmF1bHREYiA9IGdldERiKGNvbnRleHQsIG51bGwpOworICAgICAgICBmaW5hbCBDdXJzb3IgY3Vyc29yID0gZGVmYXVsdERiLnF1ZXJ5KENMSUVOVF9UQUJMRV9OQU1FLAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IENMSUVOVF9MQVNUX1VQREFURV9EQVRFX0NPTFVNTiB9LAorICAgICAgICAgICAgICAgIENMSUVOVF9DTElFTlRfSURfQ09MVU1OICsgIiA9ID8iLAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IG51bGwgPT0gY2xpZW50SWQgPyAiIiA6IGNsaWVudElkIH0sCisgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoIWN1cnNvci5tb3ZlVG9GaXJzdCgpKSByZXR1cm4gMDsKKyAgICAgICAgICAgIHJldHVybiBjdXJzb3IuZ2V0TG9uZygwKTsgLy8gT25seSBvbmUgY29sdW1uLCByZXR1cm4gaXQKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGN1cnNvci5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBtZXRhZGF0YSBkb3dubG9hZCBJRCBmb3IgYSBjbGllbnQgSUQuCisgICAgICoKKyAgICAgKiBUaGlzIHdpbGwgcmV0cmlldmUgdGhlIGRvd25sb2FkIElEIGZvciB0aGUgbWV0YWRhdGEgZmlsZSBhc3NvY2lhdGVkIHdpdGggYSBjbGllbnQgSUQuCisgICAgICogSWYgdGhlcmUgaXMgbm8gbWV0YWRhdGEgZG93bmxvYWQgaW4gcHJvZ3Jlc3MgZm9yIHRoaXMgY2xpZW50LCBpdCB3aWxsIHJldHVybiBOT1RfQU5fSUQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBhIGNvbnRleHQgaW5zdGFuY2UgdG8gb3BlbiB0aGUgZGF0YWJhc2Ugb24KKyAgICAgKiBAcGFyYW0gY2xpZW50SWQgdGhlIGNsaWVudCBJRCB0byByZXRyaWV2ZSB0aGUgbWV0YWRhdGEgZG93bmxvYWQgSUQgb2YKKyAgICAgKiBAcmV0dXJuIHRoZSBtZXRhZGF0YSBkb3dubG9hZCBJRCwgb3IgTk9UX0FOX0lEIGlmIG5vIGRvd25sb2FkIGlzIGluIHByb2dyZXNzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBsb25nIGdldE1ldGFkYXRhRG93bmxvYWRJZEZvckNsaWVudChmaW5hbCBDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2xpZW50SWQpIHsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGVmYXVsdERiID0gZ2V0RGIoY29udGV4dCwgbnVsbCk7CisgICAgICAgIGZpbmFsIEN1cnNvciBjdXJzb3IgPSBkZWZhdWx0RGIucXVlcnkoQ0xJRU5UX1RBQkxFX05BTUUsCisgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgQ0xJRU5UX1BFTkRJTkdJRF9DT0xVTU4gfSwKKyAgICAgICAgICAgICAgICBDTElFTlRfQ0xJRU5UX0lEX0NPTFVNTiArICIgPSA/IiwgbmV3IFN0cmluZ1tdIHsgY2xpZW50SWQgfSwKKyAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICghY3Vyc29yLm1vdmVUb0ZpcnN0KCkpIHJldHVybiBVcGRhdGVIYW5kbGVyLk5PVF9BTl9JRDsKKyAgICAgICAgICAgIHJldHVybiBjdXJzb3IuZ2V0SW50KDApOyAvLyBPbmx5IG9uZSBjb2x1bW4sIHJldHVybiBpdAorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgY3Vyc29yLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0T2xkZXN0VXBkYXRlVGltZShmaW5hbCBDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGVmYXVsdERiID0gZ2V0RGIoY29udGV4dCwgbnVsbCk7CisgICAgICAgIGZpbmFsIEN1cnNvciBjdXJzb3IgPSBkZWZhdWx0RGIucXVlcnkoQ0xJRU5UX1RBQkxFX05BTUUsCisgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgQ0xJRU5UX0xBU1RfVVBEQVRFX0RBVEVfQ09MVU1OIH0sCisgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoIWN1cnNvci5tb3ZlVG9GaXJzdCgpKSByZXR1cm4gMDsKKyAgICAgICAgICAgIGZpbmFsIGludCBjb2x1bW5JbmRleCA9IDA7IC8vIE9ubHkgb25lIGNvbHVtbiBxdWVyaWVkCisgICAgICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBlYXJsaWVzdFRpbWUgdG8gdGhlIGxhcmdlc3QgcG9zc2libGUgdmFsdWUuCisgICAgICAgICAgICBsb25nIGVhcmxpZXN0VGltZSA9IExvbmcuTUFYX1ZBTFVFOyAvLyBBbG1vc3QgMzAwIG1pbGxpb24geWVhcnMgaW4gdGhlIGZ1dHVyZQorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgdGhpc1RpbWUgPSBjdXJzb3IuZ2V0TG9uZyhjb2x1bW5JbmRleCk7CisgICAgICAgICAgICAgICAgZWFybGllc3RUaW1lID0gTWF0aC5taW4odGhpc1RpbWUsIGVhcmxpZXN0VGltZSk7CisgICAgICAgICAgICB9IHdoaWxlIChjdXJzb3IubW92ZVRvTmV4dCgpKTsKKyAgICAgICAgICAgIHJldHVybiBlYXJsaWVzdFRpbWU7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBjdXJzb3IuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEhlbHBlciBtZXRob2QgdG8gbWFrZSBjb250ZW50IHZhbHVlcyB0byB3cml0ZSBpbnRvIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAcmV0dXJuIGNvbnRlbnQgdmFsdWVzIHdpdGggYWxsIHRoZSBhcmd1bWVudHMgcHV0IHdpdGggdGhlIHJpZ2h0IGNvbHVtbiBuYW1lcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENvbnRlbnRWYWx1ZXMgbWFrZUNvbnRlbnRWYWx1ZXMoZmluYWwgaW50IHBlbmRpbmdJZCwgZmluYWwgaW50IHR5cGUsCisgICAgICAgICAgICBmaW5hbCBpbnQgc3RhdHVzLCBmaW5hbCBTdHJpbmcgd29yZGxpc3RJZCwgZmluYWwgU3RyaW5nIGxvY2FsZSwKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbiwgZmluYWwgU3RyaW5nIGZpbGVuYW1lLCBmaW5hbCBTdHJpbmcgdXJsLCBmaW5hbCBsb25nIGRhdGUsCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2hlY2tzdW0sIGZpbmFsIGxvbmcgZmlsZXNpemUsIGZpbmFsIGludCB2ZXJzaW9uLAorICAgICAgICAgICAgZmluYWwgaW50IGZvcm1hdFZlcnNpb24pIHsKKyAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyByZXN1bHQgPSBuZXcgQ29udGVudFZhbHVlcyhDT0xVTU5fQ09VTlQpOworICAgICAgICByZXN1bHQucHV0KFBFTkRJTkdJRF9DT0xVTU4sIHBlbmRpbmdJZCk7CisgICAgICAgIHJlc3VsdC5wdXQoVFlQRV9DT0xVTU4sIHR5cGUpOworICAgICAgICByZXN1bHQucHV0KFdPUkRMSVNUSURfQ09MVU1OLCB3b3JkbGlzdElkKTsKKyAgICAgICAgcmVzdWx0LnB1dChTVEFUVVNfQ09MVU1OLCBzdGF0dXMpOworICAgICAgICByZXN1bHQucHV0KExPQ0FMRV9DT0xVTU4sIGxvY2FsZSk7CisgICAgICAgIHJlc3VsdC5wdXQoREVTQ1JJUFRJT05fQ09MVU1OLCBkZXNjcmlwdGlvbik7CisgICAgICAgIHJlc3VsdC5wdXQoTE9DQUxfRklMRU5BTUVfQ09MVU1OLCBmaWxlbmFtZSk7CisgICAgICAgIHJlc3VsdC5wdXQoUkVNT1RFX0ZJTEVOQU1FX0NPTFVNTiwgdXJsKTsKKyAgICAgICAgcmVzdWx0LnB1dChEQVRFX0NPTFVNTiwgZGF0ZSk7CisgICAgICAgIHJlc3VsdC5wdXQoQ0hFQ0tTVU1fQ09MVU1OLCBjaGVja3N1bSk7CisgICAgICAgIHJlc3VsdC5wdXQoRklMRVNJWkVfQ09MVU1OLCBmaWxlc2l6ZSk7CisgICAgICAgIHJlc3VsdC5wdXQoVkVSU0lPTl9DT0xVTU4sIHZlcnNpb24pOworICAgICAgICByZXN1bHQucHV0KEZPUk1BVFZFUlNJT05fQ09MVU1OLCBmb3JtYXRWZXJzaW9uKTsKKyAgICAgICAgcmVzdWx0LnB1dChGTEFHU19DT0xVTU4sIDApOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEhlbHBlciBtZXRob2QgdG8gZmlsbCBpbiBhbiBpbmNvbXBsZXRlIENvbnRlbnRWYWx1ZXMgd2l0aCBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKiBBIHdvcmRsaXN0IElEIGFuZCBhIGxvY2FsZSBhcmUgcmVxdWlyZWQsIG90aGVyd2lzZSBCYWRGb3JtYXRFeGNlcHRpb24gaXMgdGhyb3duLgorICAgICAqIEByZXR1cm4gdGhlIHNhbWUgb2JqZWN0IHRoYXQgd2FzIHBhc3NlZCBpbiwgY29tcGxldGVkIHdpdGggZGVmYXVsdCB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDb250ZW50VmFsdWVzIGNvbXBsZXRlV2l0aERlZmF1bHRWYWx1ZXMoZmluYWwgQ29udGVudFZhbHVlcyByZXN1bHQpCisgICAgICAgICAgICB0aHJvd3MgQmFkRm9ybWF0RXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFyZXN1bHQuY29udGFpbnNLZXkoV09SRExJU1RJRF9DT0xVTU4pIHx8ICFyZXN1bHQuY29udGFpbnNLZXkoTE9DQUxFX0NPTFVNTikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCYWRGb3JtYXRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICAvLyAwIGZvciB0aGUgcGVuZGluZyBpZCwgYmVjYXVzZSB0aGVyZSBpcyBub25lCisgICAgICAgIGlmICghcmVzdWx0LmNvbnRhaW5zS2V5KFBFTkRJTkdJRF9DT0xVTU4pKSByZXN1bHQucHV0KFBFTkRJTkdJRF9DT0xVTU4sIDApOworICAgICAgICAvLyBUaGlzIGlzIGEgYmluYXJ5IGJsb2Igb2YgYSBkaWN0aW9uYXJ5CisgICAgICAgIGlmICghcmVzdWx0LmNvbnRhaW5zS2V5KFRZUEVfQ09MVU1OKSkgcmVzdWx0LnB1dChUWVBFX0NPTFVNTiwgVFlQRV9CVUxLKTsKKyAgICAgICAgLy8gVGhpcyB3b3JkIGxpc3QgaXMgdW5rbm93biwgYnV0IGl0J3MgcHJlc2VudCwgZWxzZSB3ZSB3b3VsZG4ndCBiZSBoZXJlLCBzbyBJTlNUQUxMRUQKKyAgICAgICAgaWYgKCFyZXN1bHQuY29udGFpbnNLZXkoU1RBVFVTX0NPTFVNTikpIHJlc3VsdC5wdXQoU1RBVFVTX0NPTFVNTiwgU1RBVFVTX0lOU1RBTExFRCk7CisgICAgICAgIC8vIE5vIGRlc2NyaXB0aW9uIHVubGVzcyBzcGVjaWZpZWQsIGJlY2F1c2Ugd2UgY2FuJ3QgZ3Vlc3MgaXQKKyAgICAgICAgaWYgKCFyZXN1bHQuY29udGFpbnNLZXkoREVTQ1JJUFRJT05fQ09MVU1OKSkgcmVzdWx0LnB1dChERVNDUklQVElPTl9DT0xVTU4sICIiKTsKKyAgICAgICAgLy8gRmlsZSBuYW1lIC0gdGhpcyBpcyBhbiBhc3NldCwgc28gaXQgd29ya3MgYXMgYW4gYWxyZWFkeSBkZWxldGVkIGZpbGUuCisgICAgICAgIC8vICAgICBoZW5jZSwgd2UgbmVlZCB0byBzdXBwbHkgYSBub24tZXhpc3RlbnQgZmlsZSBuYW1lLiBBbnl0aGluZyB3aWxsCisgICAgICAgIC8vICAgICBkbyBhcyBsb25nIGFzIGl0IHJldHVybnMgZmFsc2Ugd2hlbiB0ZXN0ZWQgd2l0aCBGaWxlI2V4aXN0KCksIGFuZAorICAgICAgICAvLyAgICAgdGhlIGVtcHR5IHN0cmluZyBkb2VzIG5vdCwgc28gaXQncyBzZXQgdG8gIl8iLgorICAgICAgICBpZiAoIXJlc3VsdC5jb250YWluc0tleShMT0NBTF9GSUxFTkFNRV9DT0xVTU4pKSByZXN1bHQucHV0KExPQ0FMX0ZJTEVOQU1FX0NPTFVNTiwgIl8iKTsKKyAgICAgICAgLy8gTm8gcmVtb3RlIGZpbGUgbmFtZSA6IHRoaXMgY2FuJ3QgYmUgZG93bmxvYWRlZC4gVW5sZXNzIHNwZWNpZmllZC4KKyAgICAgICAgaWYgKCFyZXN1bHQuY29udGFpbnNLZXkoUkVNT1RFX0ZJTEVOQU1FX0NPTFVNTikpIHJlc3VsdC5wdXQoUkVNT1RFX0ZJTEVOQU1FX0NPTFVNTiwgIiIpOworICAgICAgICAvLyAwIGZvciB0aGUgdXBkYXRlIGRhdGUgOiAxOTcwLzEvMS4gVW5sZXNzIHNwZWNpZmllZC4KKyAgICAgICAgaWYgKCFyZXN1bHQuY29udGFpbnNLZXkoREFURV9DT0xVTU4pKSByZXN1bHQucHV0KERBVEVfQ09MVU1OLCAwKTsKKyAgICAgICAgLy8gQ2hlY2tzdW0gdW5rbm93biB1bmxlc3Mgc3BlY2lmaWVkCisgICAgICAgIGlmICghcmVzdWx0LmNvbnRhaW5zS2V5KENIRUNLU1VNX0NPTFVNTikpIHJlc3VsdC5wdXQoQ0hFQ0tTVU1fQ09MVU1OLCAiIik7CisgICAgICAgIC8vIE5vIGZpbGVzaXplIHVubGVzcyBzcGVjaWZpZWQKKyAgICAgICAgaWYgKCFyZXN1bHQuY29udGFpbnNLZXkoRklMRVNJWkVfQ09MVU1OKSkgcmVzdWx0LnB1dChGSUxFU0laRV9DT0xVTU4sIDApOworICAgICAgICAvLyBTbWFsbGVzdCBwb3NzaWJsZSB2ZXJzaW9uIHVubGVzcyBzcGVjaWZpZWQKKyAgICAgICAgaWYgKCFyZXN1bHQuY29udGFpbnNLZXkoVkVSU0lPTl9DT0xVTU4pKSByZXN1bHQucHV0KFZFUlNJT05fQ09MVU1OLCAxKTsKKyAgICAgICAgLy8gQXNzdW1lIGN1cnJlbnQgZm9ybWF0IHVubGVzcyBzcGVjaWZpZWQKKyAgICAgICAgaWYgKCFyZXN1bHQuY29udGFpbnNLZXkoRk9STUFUVkVSU0lPTl9DT0xVTU4pKQorICAgICAgICAgICAgcmVzdWx0LnB1dChGT1JNQVRWRVJTSU9OX0NPTFVNTiwgVXBkYXRlSGFuZGxlci5NQVhJTVVNX1NVUFBPUlRFRF9GT1JNQVRfVkVSU0lPTik7CisgICAgICAgIC8vIE5vIGZsYWdzIHVubGVzcyBzcGVjaWZpZWQKKyAgICAgICAgaWYgKCFyZXN1bHQuY29udGFpbnNLZXkoRkxBR1NfQ09MVU1OKSkgcmVzdWx0LnB1dChGTEFHU19DT0xVTU4sIDApOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIGEgY29sdW1uIGluIGEgQ3Vyc29yIGFzIGEgU3RyaW5nIGFuZCBzdG9yZXMgaXQgaW4gYSBDb250ZW50VmFsdWVzIG9iamVjdC4KKyAgICAgKiBAcGFyYW0gcmVzdWx0IHRoZSBDb250ZW50VmFsdWVzIG9iamVjdCB0byBzdG9yZSB0aGUgcmVzdWx0IGluLgorICAgICAqIEBwYXJhbSBjdXJzb3IgdGhlIEN1cnNvciB0byByZWFkIHRoZSBjb2x1bW4gZnJvbS4KKyAgICAgKiBAcGFyYW0gY29sdW1uSWQgdGhlIGNvbHVtbiBJRCB0byByZWFkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHV0U3RyaW5nUmVzdWx0KENvbnRlbnRWYWx1ZXMgcmVzdWx0LCBDdXJzb3IgY3Vyc29yLCBTdHJpbmcgY29sdW1uSWQpIHsKKyAgICAgICAgcmVzdWx0LnB1dChjb2x1bW5JZCwgY3Vyc29yLmdldFN0cmluZyhjdXJzb3IuZ2V0Q29sdW1uSW5kZXgoY29sdW1uSWQpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgYSBjb2x1bW4gaW4gYSBDdXJzb3IgYXMgYW4gaW50IGFuZCBzdG9yZXMgaXQgaW4gYSBDb250ZW50VmFsdWVzIG9iamVjdC4KKyAgICAgKiBAcGFyYW0gcmVzdWx0IHRoZSBDb250ZW50VmFsdWVzIG9iamVjdCB0byBzdG9yZSB0aGUgcmVzdWx0IGluLgorICAgICAqIEBwYXJhbSBjdXJzb3IgdGhlIEN1cnNvciB0byByZWFkIHRoZSBjb2x1bW4gZnJvbS4KKyAgICAgKiBAcGFyYW0gY29sdW1uSWQgdGhlIGNvbHVtbiBJRCB0byByZWFkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHV0SW50UmVzdWx0KENvbnRlbnRWYWx1ZXMgcmVzdWx0LCBDdXJzb3IgY3Vyc29yLCBTdHJpbmcgY29sdW1uSWQpIHsKKyAgICAgICAgcmVzdWx0LnB1dChjb2x1bW5JZCwgY3Vyc29yLmdldEludChjdXJzb3IuZ2V0Q29sdW1uSW5kZXgoY29sdW1uSWQpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQ29udGVudFZhbHVlcyBnZXRGaXJzdExpbmVBc0NvbnRlbnRWYWx1ZXMoZmluYWwgQ3Vyc29yIGN1cnNvcikgeworICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIHJlc3VsdDsKKyAgICAgICAgaWYgKGN1cnNvci5tb3ZlVG9GaXJzdCgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuZXcgQ29udGVudFZhbHVlcyhDT0xVTU5fQ09VTlQpOworICAgICAgICAgICAgcHV0SW50UmVzdWx0KHJlc3VsdCwgY3Vyc29yLCBQRU5ESU5HSURfQ09MVU1OKTsKKyAgICAgICAgICAgIHB1dEludFJlc3VsdChyZXN1bHQsIGN1cnNvciwgVFlQRV9DT0xVTU4pOworICAgICAgICAgICAgcHV0SW50UmVzdWx0KHJlc3VsdCwgY3Vyc29yLCBTVEFUVVNfQ09MVU1OKTsKKyAgICAgICAgICAgIHB1dFN0cmluZ1Jlc3VsdChyZXN1bHQsIGN1cnNvciwgV09SRExJU1RJRF9DT0xVTU4pOworICAgICAgICAgICAgcHV0U3RyaW5nUmVzdWx0KHJlc3VsdCwgY3Vyc29yLCBMT0NBTEVfQ09MVU1OKTsKKyAgICAgICAgICAgIHB1dFN0cmluZ1Jlc3VsdChyZXN1bHQsIGN1cnNvciwgREVTQ1JJUFRJT05fQ09MVU1OKTsKKyAgICAgICAgICAgIHB1dFN0cmluZ1Jlc3VsdChyZXN1bHQsIGN1cnNvciwgTE9DQUxfRklMRU5BTUVfQ09MVU1OKTsKKyAgICAgICAgICAgIHB1dFN0cmluZ1Jlc3VsdChyZXN1bHQsIGN1cnNvciwgUkVNT1RFX0ZJTEVOQU1FX0NPTFVNTik7CisgICAgICAgICAgICBwdXRJbnRSZXN1bHQocmVzdWx0LCBjdXJzb3IsIERBVEVfQ09MVU1OKTsKKyAgICAgICAgICAgIHB1dFN0cmluZ1Jlc3VsdChyZXN1bHQsIGN1cnNvciwgQ0hFQ0tTVU1fQ09MVU1OKTsKKyAgICAgICAgICAgIHB1dEludFJlc3VsdChyZXN1bHQsIGN1cnNvciwgRklMRVNJWkVfQ09MVU1OKTsKKyAgICAgICAgICAgIHB1dEludFJlc3VsdChyZXN1bHQsIGN1cnNvciwgVkVSU0lPTl9DT0xVTU4pOworICAgICAgICAgICAgcHV0SW50UmVzdWx0KHJlc3VsdCwgY3Vyc29yLCBGT1JNQVRWRVJTSU9OX0NPTFVNTik7CisgICAgICAgICAgICBwdXRJbnRSZXN1bHQocmVzdWx0LCBjdXJzb3IsIEZMQUdTX0NPTFVNTik7CisgICAgICAgICAgICBpZiAoY3Vyc29yLm1vdmVUb05leHQoKSkgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IHByaW50IHRoZSBzZWNvbmQgbGV2ZWwgb2YgdGhlIHN0YWNrIHRvIHRoZSBsb2cgc28gdGhhdCB3ZSBrbm93CisgICAgICAgICAgICAgICAgLy8gaW4gd2hpY2ggY29kZSBwYXRoIHRoZSBlcnJvciBoYXBwZW5lZAorICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlNldmVyYWwgU1FMIHJlc3VsdHMgd2hlbiB3ZSBleHBlY3RlZCBvbmx5IG9uZSEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBpbmZvIGFib3V0IGFzIHNwZWNpZmljIGRvd25sb2FkLCBpbmRleGVkIGJ5IGl0cyBEb3dubG9hZE1hbmFnZXIgSUQuCisgICAgICogQHBhcmFtIGRiIHRoZSBkYXRhYmFzZSB0byBnZXQgdGhlIGluZm9ybWF0aW9uIGZyb20uCisgICAgICogQHBhcmFtIGlkIHRoZSBEb3dubG9hZE1hbmFnZXIgaWQuCisgICAgICogQHJldHVybiBtZXRhZGF0YSBhYm91dCB0aGlzIGRvd25sb2FkLiBUaGlzIHJldHVybnMgYWxsIGNvbHVtbnMgaW4gdGhlIGRhdGFiYXNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ29udGVudFZhbHVlcyBnZXRDb250ZW50VmFsdWVzQnlQZW5kaW5nSWQoZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIsCisgICAgICAgICAgICBmaW5hbCBsb25nIGlkKSB7CisgICAgICAgIGZpbmFsIEN1cnNvciBjdXJzb3IgPSBkYi5xdWVyeShNRVRBREFUQV9UQUJMRV9OQU1FLAorICAgICAgICAgICAgICAgIE1FVEFEQVRBX1RBQkxFX0NPTFVNTlMsCisgICAgICAgICAgICAgICAgUEVORElOR0lEX0NPTFVNTiArICI9ID8iLAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IExvbmcudG9TdHJpbmcoaWQpIH0sCisgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgIC8vIFRoZXJlIHNob3VsZCBuZXZlciBiZSBtb3JlIHRoYW4gb25lIHJlc3VsdC4gSWYgYmVjYXVzZSBvZiBzb21lIGJ1ZyB0aGVyZSBhcmUsIHJldHVybmluZworICAgICAgICAvLyBvbmx5IG9uZSByZXN1bHQgaXMgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvLCBiZWNhdXNlIHdlIGNvdWxkbid0IGhhbmRsZSBzZXZlcmFsIGFueXdheQorICAgICAgICAvLyBhbmQgd2Ugc2hvdWxkIHN0aWxsIGhhbmRsZSBvbmUuCisgICAgICAgIGZpbmFsIENvbnRlbnRWYWx1ZXMgcmVzdWx0ID0gZ2V0Rmlyc3RMaW5lQXNDb250ZW50VmFsdWVzKGN1cnNvcik7CisgICAgICAgIGN1cnNvci5jbG9zZSgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGluZm8gYWJvdXQgYW4gaW5zdGFsbGVkIE9SIGRlbGV0aW5nIHdvcmQgbGlzdCB3aXRoIGEgc3BlY2lmaWVkIGlkLgorICAgICAqCisgICAgICogQmFzaWNhbGx5LCB0aGlzIGlzIHRoZSB3b3JkIGxpc3QgdGhhdCB3ZSB3YW50IHRvIHJldHVybiB0byBBbmRyb2lkIEtleWJvYXJkIHdoZW4KKyAgICAgKiBpdCBhc2tzIGZvciBhIHNwZWNpZmljIGlkLgorICAgICAqCisgICAgICogQHBhcmFtIGRiIHRoZSBkYXRhYmFzZSB0byBnZXQgdGhlIGluZm9ybWF0aW9uIGZyb20uCisgICAgICogQHBhcmFtIGlkIHRoZSB3b3JkIGxpc3QgSUQuCisgICAgICogQHJldHVybiB0aGUgbWV0YWRhdGEgYWJvdXQgdGhpcyB3b3JkIGxpc3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDb250ZW50VmFsdWVzIGdldEluc3RhbGxlZE9yRGVsZXRpbmdXb3JkTGlzdENvbnRlbnRWYWx1ZXNCeVdvcmRMaXN0SWQoCisgICAgICAgICAgICBmaW5hbCBTUUxpdGVEYXRhYmFzZSBkYiwgZmluYWwgU3RyaW5nIGlkKSB7CisgICAgICAgIGZpbmFsIEN1cnNvciBjdXJzb3IgPSBkYi5xdWVyeShNRVRBREFUQV9UQUJMRV9OQU1FLAorICAgICAgICAgICAgICAgIE1FVEFEQVRBX1RBQkxFX0NPTFVNTlMsCisgICAgICAgICAgICAgICAgV09SRExJU1RJRF9DT0xVTU4gKyAiPT8gQU5EICgiICsgU1RBVFVTX0NPTFVNTiArICI9PyBPUiAiICsgU1RBVFVTX0NPTFVNTiArICI9PykiLAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IGlkLCBJbnRlZ2VyLnRvU3RyaW5nKFNUQVRVU19JTlNUQUxMRUQpLAorICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhTVEFUVVNfREVMRVRJTkcpIH0sCisgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgIC8vIFRoZXJlIHNob3VsZCBvbmx5IGJlIG9uZSByZXN1bHQsIGJ1dCBpZiB0aGVyZSBhcmUgc2V2ZXJhbCwgd2UgY2FuJ3QgdGVsbCB3aGljaAorICAgICAgICAvLyBpcyB0aGUgYmVzdCwgc28gd2UganVzdCByZXR1cm4gdGhlIGZpcnN0IG9uZS4KKyAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyByZXN1bHQgPSBnZXRGaXJzdExpbmVBc0NvbnRlbnRWYWx1ZXMoY3Vyc29yKTsKKyAgICAgICAgY3Vyc29yLmNsb3NlKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2l2ZW4gYSBzcGVjaWZpYyBkb3dubG9hZCBJRCwgcmV0dXJuIHJlY29yZHMgZm9yIGFsbCBwZW5kaW5nIGRvd25sb2FkcyBhY3Jvc3MgYWxsIGNsaWVudHMuCisgICAgICoKKyAgICAgKiBJZiBzZXZlcmFsIGNsaWVudHMgdXNlIHRoZSBzYW1lIG1ldGFkYXRhIFVSTCwgd2Uga25vdyB0byBvbmx5IGRvd25sb2FkIGl0IG9uY2UsIGFuZAorICAgICAqIGRpc3BhdGNoIHRoZSB1cGRhdGUgcHJvY2VzcyBhY3Jvc3MgYWxsIHJlbGV2YW50IGNsaWVudHMgd2hlbiB0aGUgZG93bmxvYWQgZW5kcy4gVGhpcyBtZWFucworICAgICAqIHNldmVyYWwgY2xpZW50cyBtYXkgc2hhcmUgYSBzaW5nbGUgZG93bmxvYWQgSUQgaWYgdGhleSBzaGFyZSBhIG1ldGFkYXRhIFVSSS4KKyAgICAgKiBUaGUgZGlzcGF0Y2hpbmcgaXMgZG9uZSBpbiB7QGxpbmsgVXBkYXRlSGFuZGxlciNkb3dubG9hZEZpbmlzaGVkKENvbnRleHQsIEludGVudCl9LCB3aGljaAorICAgICAqIGZpbmRzIG91dCBhYm91dCB0aGUgbGlzdCBvZiByZWxldmFudCBjbGllbnRzIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBhIGNvbnRleHQgaW5zdGFuY2UgdG8gb3BlbiB0aGUgZGF0YWJhc2VzCisgICAgICogQHBhcmFtIGRvd25sb2FkSWQgdGhlIGRvd25sb2FkIElEIHRvIHF1ZXJ5IGFib3V0CisgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiByZWNvcmRzLiBOZXZlciBudWxsLCBidXQgbWF5IGJlIGVtcHR5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQXJyYXlMaXN0PERvd25sb2FkUmVjb3JkPiBnZXREb3dubG9hZFJlY29yZHNGb3JEb3dubG9hZElkKGZpbmFsIENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgZG93bmxvYWRJZCkgeworICAgICAgICBmaW5hbCBTUUxpdGVEYXRhYmFzZSBkZWZhdWx0RGIgPSBnZXREYihjb250ZXh0LCAiIik7CisgICAgICAgIGZpbmFsIEFycmF5TGlzdDxEb3dubG9hZFJlY29yZD4gcmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8RG93bmxvYWRSZWNvcmQ+KCk7CisgICAgICAgIGZpbmFsIEN1cnNvciBjdXJzb3IgPSBkZWZhdWx0RGIucXVlcnkoQ0xJRU5UX1RBQkxFX05BTUUsIENMSUVOVF9UQUJMRV9DT0xVTU5TLAorICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKCFjdXJzb3IubW92ZVRvRmlyc3QoKSkgcmV0dXJuIHJlc3VsdHM7CisgICAgICAgICAgICBmaW5hbCBpbnQgY2xpZW50SWRJbmRleCA9IGN1cnNvci5nZXRDb2x1bW5JbmRleChDTElFTlRfQ0xJRU5UX0lEX0NPTFVNTik7CisgICAgICAgICAgICBmaW5hbCBpbnQgcGVuZGluZ0lkQ29sdW1uID0gY3Vyc29yLmdldENvbHVtbkluZGV4KENMSUVOVF9QRU5ESU5HSURfQ09MVU1OKTsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBsb25nIHBlbmRpbmdJZCA9IGN1cnNvci5nZXRJbnQocGVuZGluZ0lkQ29sdW1uKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2xpZW50SWQgPSBjdXJzb3IuZ2V0U3RyaW5nKGNsaWVudElkSW5kZXgpOworICAgICAgICAgICAgICAgIGlmIChwZW5kaW5nSWQgPT0gZG93bmxvYWRJZCkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChuZXcgRG93bmxvYWRSZWNvcmQoY2xpZW50SWQsIG51bGwpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyB2YWx1ZXNGb3JUaGlzQ2xpZW50ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRlbnRWYWx1ZXNCeVBlbmRpbmdJZChnZXREYihjb250ZXh0LCBjbGllbnRJZCksIGRvd25sb2FkSWQpOworICAgICAgICAgICAgICAgIGlmIChudWxsICE9IHZhbHVlc0ZvclRoaXNDbGllbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQobmV3IERvd25sb2FkUmVjb3JkKGNsaWVudElkLCB2YWx1ZXNGb3JUaGlzQ2xpZW50KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAoY3Vyc29yLm1vdmVUb05leHQoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBjdXJzb3IuY2xvc2UoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBpbmZvIGFib3V0IGEgc3BlY2lmaWMgd29yZCBsaXN0LgorICAgICAqCisgICAgICogQHBhcmFtIGRiIHRoZSBkYXRhYmFzZSB0byBnZXQgdGhlIGluZm9ybWF0aW9uIGZyb20uCisgICAgICogQHBhcmFtIGlkIHRoZSB3b3JkIGxpc3QgSUQuCisgICAgICogQHBhcmFtIHZlcnNpb24gdGhlIHdvcmQgbGlzdCB2ZXJzaW9uLgorICAgICAqIEByZXR1cm4gdGhlIG1ldGFkYXRhIGFib3V0IHRoaXMgd29yZCBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ29udGVudFZhbHVlcyBnZXRDb250ZW50VmFsdWVzQnlXb3JkTGlzdElkKGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiLAorICAgICAgICAgICAgZmluYWwgU3RyaW5nIGlkLCBmaW5hbCBpbnQgdmVyc2lvbikgeworICAgICAgICBmaW5hbCBDdXJzb3IgY3Vyc29yID0gZGIucXVlcnkoTUVUQURBVEFfVEFCTEVfTkFNRSwKKyAgICAgICAgICAgICAgICBNRVRBREFUQV9UQUJMRV9DT0xVTU5TLAorICAgICAgICAgICAgICAgIFdPUkRMSVNUSURfQ09MVU1OICsgIj0gPyBBTkQgIiArIFZFUlNJT05fQ09MVU1OICsgIj0gPyIsCisgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgaWQsIEludGVnZXIudG9TdHJpbmcodmVyc2lvbikgfSwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgIC8vIFRoaXMgaXMgYSBsb29rdXAgYnkgcHJpbWFyeSBrZXksIHNvIHRoZXJlIGNhbid0IGJlIG1vcmUgdGhhbiBvbmUgcmVzdWx0LgorICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIHJlc3VsdCA9IGdldEZpcnN0TGluZUFzQ29udGVudFZhbHVlcyhjdXJzb3IpOworICAgICAgICBjdXJzb3IuY2xvc2UoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBpbmZvIGFib3V0IHRoZSBsYXRlc3Qgd29yZCBsaXN0IHdpdGggYW4gaWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGIgdGhlIGRhdGFiYXNlIHRvIGdldCB0aGUgaW5mb3JtYXRpb24gZnJvbS4KKyAgICAgKiBAcGFyYW0gaWQgdGhlIHdvcmQgbGlzdCBJRC4KKyAgICAgKiBAcmV0dXJuIHRoZSBtZXRhZGF0YSBhYm91dCB0aGUgd29yZCBsaXN0IHdpdGggdGhpcyBpZCBhbmQgdGhlIGxhdGVzdCB2ZXJzaW9uIG51bWJlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENvbnRlbnRWYWx1ZXMgZ2V0Q29udGVudFZhbHVlc09mTGF0ZXN0QXZhaWxhYmxlV29yZGxpc3RCeUlkKAorICAgICAgICAgICAgZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIsIGZpbmFsIFN0cmluZyBpZCkgeworICAgICAgICBmaW5hbCBDdXJzb3IgY3Vyc29yID0gZGIucXVlcnkoTUVUQURBVEFfVEFCTEVfTkFNRSwKKyAgICAgICAgICAgICAgICBNRVRBREFUQV9UQUJMRV9DT0xVTU5TLAorICAgICAgICAgICAgICAgIFdPUkRMSVNUSURfQ09MVU1OICsgIj0gPyIsCisgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgaWQgfSwgbnVsbCwgbnVsbCwgVkVSU0lPTl9DT0xVTU4gKyAiIERFU0MiLCAiMSIpOworICAgICAgICAvLyBUaGlzIGlzIGEgbG9va3VwIGJ5IHByaW1hcnkga2V5LCBzbyB0aGVyZSBjYW4ndCBiZSBtb3JlIHRoYW4gb25lIHJlc3VsdC4KKyAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyByZXN1bHQgPSBnZXRGaXJzdExpbmVBc0NvbnRlbnRWYWx1ZXMoY3Vyc29yKTsKKyAgICAgICAgY3Vyc29yLmNsb3NlKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgY3VycmVudCBtZXRhZGF0YSBhYm91dCBJTlNUQUxMRUQsIEFWQUlMQUJMRSBvciBERUxFVElORyBkaWN0aW9uYXJpZXMuCisgICAgICoKKyAgICAgKiBUaGlzIG9kZCBtZXRob2QgaXMgdGFpbG9yZWQgdG8gdGhlIG5lZWRzIG9mCisgICAgICogRGljdGlvbmFyeVByb3ZpZGVyI2dldERpY3Rpb25hcnlXb3JkTGlzdHNGb3JDb250ZW50VXJpLCB3aGljaCBuZWVkcyB0aGUgd29yZCBsaXN0IGlmCisgICAgICogaXQgaXM6CisgICAgICogLSBJTlNUQUxMRUQ6IHRoaXMgc2hvdWxkIGJlIHJldHVybmVkIHRvIExhdGluSU1FIGlmIHRoZSBmaWxlIGlzIHN0aWxsIGluc2lkZSB0aGUgZGljdGlvbmFyeQorICAgICAqIHBhY2ssIHNvIHRoYXQgaXQgY2FuIGJlIGNvcGllZC4gSWYgdGhlIGZpbGUgaXMgbm90IHRoZXJlLCBpdCdzIGJlZW4gY29waWVkIGFscmVhZHkgYW5kIHNob3VsZAorICAgICAqIG5vdCBiZSByZXR1cm5lZCwgc28gZ2V0RGljdGlvbmFyeVdvcmRMaXN0c0ZvckNvbnRlbnRVcmkgdGFrZXMgY2FyZSBvZiB0aGlzLgorICAgICAqIC0gREVMRVRJTkc6IHRoaXMgc2hvdWxkIGJlIHJldHVybmVkIHRvIExhdGluSU1FIHNvIHRoYXQgaXQgY2FuIGFjdHVhbGx5IGRlbGV0ZSB0aGUgZmlsZS4KKyAgICAgKiAtIEFWQUlMQUJMRTogdGhpcyBzaG91bGQgbm90IGJlIHJldHVybmVkLCBidXQgc2hvdWxkIGJlIGNoZWNrZWQgZm9yIGF1dG8taW5zdGFsbGF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgdGhlIGNvbnRleHQgZm9yIGdldHRpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBwYXJhbSBjbGllbnRJZCB0aGUgY2xpZW50IGlkIGZvciByZXRyaWV2aW5nIHRoZSBkYXRhYmFzZS4gbnVsbCBmb3IgZGVmYXVsdCAoZGVwcmVjYXRlZCkKKyAgICAgKiBAcmV0dXJuIGEgY3Vyc29yIHdpdGggbWV0YWRhdGEgYWJvdXQgdXNhYmxlIGRpY3Rpb25hcmllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEN1cnNvciBxdWVyeUluc3RhbGxlZE9yRGVsZXRpbmdPckF2YWlsYWJsZURpY3Rpb25hcnlNZXRhZGF0YSgKKyAgICAgICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCwgZmluYWwgU3RyaW5nIGNsaWVudElkKSB7CisgICAgICAgIC8vIElmIGNsaWVudElkIGlzIG51bGwsIHdlIGdldCB0aGUgZGVmYXV0IERCIChzZWUgI2dldEluc3RhbmNlKCkgZm9yIG1vcmUgYWJvdXQgdGhpcykKKyAgICAgICAgZmluYWwgQ3Vyc29yIHJlc3VsdHMgPSBnZXREYihjb250ZXh0LCBjbGllbnRJZCkucXVlcnkoTUVUQURBVEFfVEFCTEVfTkFNRSwKKyAgICAgICAgICAgICAgICBNRVRBREFUQV9UQUJMRV9DT0xVTU5TLAorICAgICAgICAgICAgICAgIFNUQVRVU19DT0xVTU4gKyAiID0gPyBPUiAiICsgU1RBVFVTX0NPTFVNTiArICIgPSA/IE9SICIgKyBTVEFUVVNfQ09MVU1OICsgIiA9ID8iLAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IEludGVnZXIudG9TdHJpbmcoU1RBVFVTX0lOU1RBTExFRCksCisgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKFNUQVRVU19ERUxFVElORyksCisgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKFNUQVRVU19BVkFJTEFCTEUpIH0sCisgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgTE9DQUxFX0NPTFVNTik7CisgICAgICAgIHJldHVybiByZXN1bHRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGN1cnJlbnQgbWV0YWRhdGEgYWJvdXQgYWxsIGRpY3Rpb25hcmllcy4KKyAgICAgKgorICAgICAqIFRoaXMgd2lsbCByZXRyaWV2ZSB0aGUgbWV0YWRhdGEgYWJvdXQgYWxsIGRpY3Rpb25hcmllcywgaW5jbHVkaW5nCisgICAgICogb2xkZXIgZmlsZXMsIG9yIGZpbGVzIG5vdCB5ZXQgZG93bmxvYWRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0IGZvciBnZXR0aW5nIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAcGFyYW0gY2xpZW50SWQgdGhlIGNsaWVudCBpZCBmb3IgcmV0cmlldmluZyB0aGUgZGF0YWJhc2UuIG51bGwgZm9yIGRlZmF1bHQgKGRlcHJlY2F0ZWQpCisgICAgICogQHJldHVybiBhIGN1cnNvciB3aXRoIG1ldGFkYXRhIGFib3V0IHVzYWJsZSBkaWN0aW9uYXJpZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDdXJzb3IgcXVlcnlDdXJyZW50TWV0YWRhdGEoZmluYWwgQ29udGV4dCBjb250ZXh0LCBmaW5hbCBTdHJpbmcgY2xpZW50SWQpIHsKKyAgICAgICAgLy8gSWYgY2xpZW50SWQgaXMgbnVsbCwgd2UgZ2V0IHRoZSBkZWZhdXQgREIgKHNlZSAjZ2V0SW5zdGFuY2UoKSBmb3IgbW9yZSBhYm91dCB0aGlzKQorICAgICAgICBmaW5hbCBDdXJzb3IgcmVzdWx0cyA9IGdldERiKGNvbnRleHQsIGNsaWVudElkKS5xdWVyeShNRVRBREFUQV9UQUJMRV9OQU1FLAorICAgICAgICAgICAgICAgIE1FVEFEQVRBX1RBQkxFX0NPTFVNTlMsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIExPQ0FMRV9DT0xVTU4pOworICAgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIGFsbCBkaWN0aW9uYXJpZXMga25vd24gdG8gdGhlIGRpY3Rpb25hcnkgcHJvdmlkZXIsIHdpdGggb25seSBwdWJsaWMgY29sdW1ucy4KKyAgICAgKgorICAgICAqIFRoaXMgd2lsbCByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBhbGwga25vd24gZGljdGlvbmFyaWVzLCBhbmQgdGhlaXIgc3RhdHVzLiBBcyBzdWNoLAorICAgICAqIGl0IHdpbGwgYWxzbyByZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgZGljdGlvbmFyaWVzIG9uIHRoZSBzZXJ2ZXIgdGhhdCBoYXZlIG5vdCBiZWVuCisgICAgICogZG93bmxvYWRlZCB5ZXQsIGJ1dCBtYXkgYmUgcmVxdWVzdGVkLgorICAgICAqIFRoaXMgb25seSByZXR1cm5zIHB1YmxpYyBjb2x1bW5zLiBJdCBkb2VzIG5vdCBwb3B1bGF0ZSBpbnRlcm5hbCBjb2x1bW5zIGluIHRoZSByZXR1cm5lZAorICAgICAqIGN1cnNvci4KKyAgICAgKiBUaGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgdG8gYmUgZ29vZCB0byBiZSByZXR1cm5lZCBkaXJlY3RseSBmb3IgYQorICAgICAqIHJlcXVlc3Qgb2YgdGhlIGxpc3Qgb2YgZGljdGlvbmFyaWVzIGJ5IGEgY2xpZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgdGhlIGNvbnRleHQgdG8gcmVhZCB0aGUgZGF0YWJhc2UgZnJvbS4KKyAgICAgKiBAcGFyYW0gY2xpZW50SWQgdGhlIGNsaWVudCBpZCBmb3IgcmV0cmlldmluZyB0aGUgZGF0YWJhc2UuIG51bGwgZm9yIGRlZmF1bHQgKGRlcHJlY2F0ZWQpCisgICAgICogQHJldHVybiBhIGN1cnNvciB0aGF0IGxpc3RzIGFsbCBhdmFpbGFibGUgZGljdGlvbmFyaWVzIGFuZCB0aGVpciBtZXRhZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEN1cnNvciBxdWVyeURpY3Rpb25hcmllcyhmaW5hbCBDb250ZXh0IGNvbnRleHQsIGZpbmFsIFN0cmluZyBjbGllbnRJZCkgeworICAgICAgICAvLyBJZiBjbGllbnRJZCBpcyBudWxsLCB3ZSBnZXQgdGhlIGRlZmF1dCBEQiAoc2VlICNnZXRJbnN0YW5jZSgpIGZvciBtb3JlIGFib3V0IHRoaXMpCisgICAgICAgIGZpbmFsIEN1cnNvciByZXN1bHRzID0gZ2V0RGIoY29udGV4dCwgY2xpZW50SWQpLnF1ZXJ5KE1FVEFEQVRBX1RBQkxFX05BTUUsCisgICAgICAgICAgICAgICAgRElDVElPTkFSSUVTX0xJU1RfUFVCTElDX0NPTFVNTlMsCisgICAgICAgICAgICAgICAgLy8gRmlsdGVyIG91dCBlbXB0eSBsb2NhbGVzIHNvIGFzIG5vdCB0byByZXR1cm4gYXV4aWxpYXJ5IGRhdGEsIGxpa2UgYQorICAgICAgICAgICAgICAgIC8vIGRhdGEgbGluZSBmb3IgZG93bmxvYWRpbmcgbWV0YWRhdGE6CisgICAgICAgICAgICAgICAgTWV0YWRhdGFEYkhlbHBlci5MT0NBTEVfQ09MVU1OICsgIiAhPSA/IiwgbmV3IFN0cmluZ1tdIHsiIn0sCisgICAgICAgICAgICAgICAgLy8gVE9ETzogUmVpbnN0YXRlIHRoZSBmb2xsb3dpbmcgY29kZSBmb3IgYnVsaywgdGhlbiBpbXBsZW1lbnQgcGFydGlhbCB1cGRhdGVzCisgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgTWV0YWRhdGFEYkhlbHBlci5UWVBFX0NPTFVNTiArICIgPSA/IiwKKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBJbnRlZ2VyLnRvU3RyaW5nKE1ldGFkYXRhRGJIZWxwZXIuVFlQRV9CVUxLKSB9LCAqLworICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIExPQ0FMRV9DT0xVTU4pOworICAgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWxldGVzIGFsbCBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhIGNsaWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0IGZvciBvcGVuaW5nIHRoZSBkYXRhYmFzZQorICAgICAqIEBwYXJhbSBjbGllbnRJZCB0aGUgSUQgb2YgdGhlIGNsaWVudCB0byBkZWxldGUuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjbGllbnQgd2FzIHN1Y2Nlc3NmdWxseSBkZWxldGVkLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGRlbGV0ZUNsaWVudChmaW5hbCBDb250ZXh0IGNvbnRleHQsIGZpbmFsIFN0cmluZyBjbGllbnRJZCkgeworICAgICAgICAvLyBSZW1vdmUgYWxsIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNsaWVudAorICAgICAgICBmaW5hbCBTUUxpdGVEYXRhYmFzZSBkYiA9IGdldERiKGNvbnRleHQsIGNsaWVudElkKTsKKyAgICAgICAgZGIuZXhlY1NRTCgiRFJPUCBUQUJMRSBJRiBFWElTVFMgIiArIE1FVEFEQVRBX1RBQkxFX05BTUUpOworICAgICAgICBkYi5leGVjU1FMKE1FVEFEQVRBX1RBQkxFX0NSRUFURSk7CisgICAgICAgIC8vIFJlbW92ZSB0aGlzIGNsaWVudCdzIGVudHJ5IGluIHRoZSBjbGllbnRzIHRhYmxlCisgICAgICAgIGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRlZmF1bHREYiA9IGdldERiKGNvbnRleHQsICIiKTsKKyAgICAgICAgaWYgKDAgPT0gZGVmYXVsdERiLmRlbGV0ZShDTElFTlRfVEFCTEVfTkFNRSwKKyAgICAgICAgICAgICAgICBDTElFTlRfQ0xJRU5UX0lEX0NPTFVNTiArICIgPSA/IiwgbmV3IFN0cmluZ1tdIHsgY2xpZW50SWQgfSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGVzIGluZm9ybWF0aW9uIHJlbGF0aXZlIHRvIGEgc3BlY2lmaWMgY2xpZW50LgorICAgICAqCisgICAgICogVXBkYXRhYmxlIGluZm9ybWF0aW9uIGluY2x1ZGVzIG9ubHkgdGhlIG1ldGFkYXRhIFVSSSwgYnV0IG1heSBiZSBleHBhbmRlZCBpbiB0aGUgZnV0dXJlLgorICAgICAqIFRoZSBwYXNzZWQgdmFsdWVzIG11c3QgaW5jbHVkZSBhIGNsaWVudCBJRCBpbiB0aGUga2V5IENMSUVOVF9DTElFTlRfSURfQ09MVU1OLCBhbmQgaXQgbXVzdAorICAgICAqIGJlIGVxdWFsIHRvIHRoZSBzdHJpbmcgcGFzc2VkIGFzIGFuIGFyZ3VtZW50IGZvciBjbGllbnRJZC4KKyAgICAgKiBUaGUgcGFzc2VkIHZhbHVlcyBtdXN0IGFsc28gaW5jbHVkZSBhIG5vbi1lbXB0eSBtZXRhZGF0YSBVUkkgaW4gdGhlCisgICAgICogQ0xJRU5UX01FVEFEQVRBX1VSSV9DT0xVTU4gY29sdW1uLgorICAgICAqIElmIGFueSBvZiB0aGUgYWJvdmUgaXMgbm90IGNvbXBsaWVkIHdpdGgsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB3aXRob3V0IHVwZGF0aW5nIGRhdGEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dCwgdG8gb3BlbiB0aGUgZGF0YWJhc2UKKyAgICAgKiBAcGFyYW0gY2xpZW50SWQgdGhlIElEIG9mIHRoZSBjbGllbnQgdG8gdXBkYXRlCisgICAgICogQHBhcmFtIHZhbHVlcyB0aGUgdmFsdWVzIHRvIHVwZGF0ZS4gTXVzdCBjb25mb3JtIHRvIHRoZSBwcm90b2NvbCAoc2VlIGFib3ZlKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVDbGllbnRJbmZvKGZpbmFsIENvbnRleHQgY29udGV4dCwgZmluYWwgU3RyaW5nIGNsaWVudElkLAorICAgICAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyB2YWx1ZXMpIHsKKyAgICAgICAgLy8gU2FuaXR5IGNoZWNrIHRoZSBjb250ZW50IHZhbHVlcworICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWVzQ2xpZW50SWQgPSB2YWx1ZXMuZ2V0QXNTdHJpbmcoQ0xJRU5UX0NMSUVOVF9JRF9DT0xVTU4pOworICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWVzTWV0YWRhdGFVcmkgPSB2YWx1ZXMuZ2V0QXNTdHJpbmcoQ0xJRU5UX01FVEFEQVRBX1VSSV9DT0xVTU4pOworICAgICAgICAvLyBFbXB0eSBzdHJpbmcgaXMgYSB2YWxpZCBjbGllbnQgSUQsIGJ1dCBleHRlcm5hbCBhcHBzIG1heSBub3QgY29uZmlndXJlIGl0LgorICAgICAgICAvLyBFbXB0eSBzdHJpbmcgaXMgYSB2YWxpZCBtZXRhZGF0YSBVUkkgaWYgdGhlIGNsaWVudCBkb2VzIG5vdCB3YW50IHVwZGF0ZXMuCisgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZXNDbGllbnRJZCkgfHwgbnVsbCA9PSB2YWx1ZXNNZXRhZGF0YVVyaSkgeworICAgICAgICAgICAgLy8gV2UgbmVlZCBib3RoIHRoZXNlIGNvbHVtbnMgdG8gYmUgZmlsbGVkIGluCisgICAgICAgICAgICBVdGlscy5sKCJNaXNzaW5nIHBhcmFtZXRlciBmb3IgdXBkYXRlQ2xpZW50SW5mbyIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghY2xpZW50SWQuZXF1YWxzKHZhbHVlc0NsaWVudElkKSkgeworICAgICAgICAgICAgLy8gTWlzbWF0Y2ghIFRoZSBjbGllbnQgdmlvbGF0ZXMgdGhlIHByb3RvY29sLgorICAgICAgICAgICAgVXRpbHMubCgiUmVjZWl2ZWQgYW4gdXBkYXRlQ2xpZW50SW5mbyByZXF1ZXN0IGZvciAiLCBjbGllbnRJZCwgIiBidXQgdGhlIHZhbHVlcyAiCisgICAgICAgICAgICAgICAgICAgICsgImNvbnRhaW4gYSBkaWZmZXJlbnQgSUQgOiAiLCB2YWx1ZXNDbGllbnRJZCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgU1FMaXRlRGF0YWJhc2UgZGVmYXVsdERiID0gZ2V0RGIoY29udGV4dCwgIiIpOworICAgICAgICBpZiAoLTEgPT0gZGVmYXVsdERiLmluc2VydChDTElFTlRfVEFCTEVfTkFNRSwgbnVsbCwgdmFsdWVzKSkgeworICAgICAgICAgICAgZGVmYXVsdERiLnVwZGF0ZShDTElFTlRfVEFCTEVfTkFNRSwgdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICBDTElFTlRfQ0xJRU5UX0lEX0NPTFVNTiArICIgPSA/IiwgbmV3IFN0cmluZ1tdIHsgY2xpZW50SWQgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGxpc3Qgb2YgZXhpc3RpbmcgY2xpZW50IElEcy4KKyAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dCB0byBvcGVuIHRoZSBkYXRhYmFzZQorICAgICAqIEByZXR1cm4gYSBjdXJzb3IgY29udGFpbmluZyBvbmx5IG9uZSBjb2x1bW4sIGFuZCBvbmUgY2xpZW50IElEIHBlciBsaW5lLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ3Vyc29yIHF1ZXJ5Q2xpZW50SWRzKGZpbmFsIENvbnRleHQgY29udGV4dCkgeworICAgICAgICByZXR1cm4gZ2V0RGIoY29udGV4dCwgbnVsbCkucXVlcnkoQ0xJRU5UX1RBQkxFX05BTUUsCisgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgQ0xJRU5UX0NMSUVOVF9JRF9DT0xVTU4gfSwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgYSBkb3dubG9hZCBJRCBmb3IgYSBzcGVjaWZpYyBtZXRhZGF0YSBVUkkuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHdoZW4gYSBkb3dubG9hZCBmb3IgYSBtZXRhZGF0YSBVUkkgaXMgc3RhcnRpbmcuIEl0IHdpbGwKKyAgICAgKiByZWdpc3RlciB0aGUgZG93bmxvYWQgSUQgZm9yIGFsbCBjbGllbnRzIHVzaW5nIHRoaXMgbWV0YWRhdGEgVVJJIGludG8gdGhlIGRhdGFiYXNlCisgICAgICogZm9yIGxhdGVyIHJldHJpZXZhbCBieSB7QGxpbmsgI2dldERvd25sb2FkUmVjb3Jkc0ZvckRvd25sb2FkSWQoQ29udGV4dCwgbG9uZyl9LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgYSBjb250ZXh0IGZvciBvcGVuaW5nIGRhdGFiYXNlcworICAgICAqIEBwYXJhbSB1cmkgdGhlIG1ldGFkYXRhIFVSSQorICAgICAqIEBwYXJhbSBkb3dubG9hZElkIHRoZSBkb3dubG9hZCBJRAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3Rlck1ldGFkYXRhRG93bmxvYWRJZChmaW5hbCBDb250ZXh0IGNvbnRleHQsIGZpbmFsIFN0cmluZyB1cmksCisgICAgICAgICAgICBmaW5hbCBsb25nIGRvd25sb2FkSWQpIHsKKyAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOworICAgICAgICB2YWx1ZXMucHV0KENMSUVOVF9QRU5ESU5HSURfQ09MVU1OLCBkb3dubG9hZElkKTsKKyAgICAgICAgZmluYWwgU1FMaXRlRGF0YWJhc2UgZGVmYXVsdERiID0gZ2V0RGIoY29udGV4dCwgIiIpOworICAgICAgICBkZWZhdWx0RGIudXBkYXRlKENMSUVOVF9UQUJMRV9OQU1FLCB2YWx1ZXMsCisgICAgICAgICAgICAgICAgQ0xJRU5UX01FVEFEQVRBX1VSSV9DT0xVTU4gKyAiID0gPyIsIG5ldyBTdHJpbmdbXSB7IHVyaSB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXJrcyBhIGRvd25sb2FkaW5nIGVudHJ5IGFzIGhhdmluZyBzdWNjZXNzZnVsbHkgZG93bmxvYWRlZCBhbmQgYmVpbmcgaW5zdGFsbGVkLgorICAgICAqCisgICAgICogVGhlIG1ldGFkYXRhIGRhdGFiYXNlIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IG9uZ29pbmcgcHJvY2Vzc2VzLCB0eXBpY2FsbHkgb25nb2luZworICAgICAqIGRvd25sb2Fkcy4gVGhpcyBtYXJrcyBzdWNoIGFuIGVudHJ5IGFzIGhhdmluZyBmaW5pc2hlZCBhbmQgaGF2aW5nIGluc3RhbGxlZCBzdWNjZXNzZnVsbHksCisgICAgICogc28gaXQgYmVjb21lcyBJTlNUQUxMRUQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGIgdGhlIG1ldGFkYXRhIGRhdGFiYXNlLgorICAgICAqIEBwYXJhbSByIGNvbnRlbnQgdmFsdWVzIGFib3V0IHRoZSBlbnRyeSB0byBtYXJrIGFzIHByb2Nlc3NlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFya0VudHJ5QXNGaW5pc2hlZERvd25sb2FkaW5nQW5kSW5zdGFsbGVkKGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiLAorICAgICAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyByKSB7CisgICAgICAgIHN3aXRjaCAoci5nZXRBc0ludGVnZXIoVFlQRV9DT0xVTU4pKSB7CisgICAgICAgICAgICBjYXNlIFRZUEVfQlVMSzoKKyAgICAgICAgICAgICAgICBVdGlscy5sKCJFbmRlZCBwcm9jZXNzaW5nIGEgd29yZGxpc3QiKTsKKyAgICAgICAgICAgICAgICAvLyBVcGRhdGluZyBhIGJ1bGsgd29yZCBsaXN0IGlzIGEgdGhyZWUtc3RlcCBvcGVyYXRpb246CisgICAgICAgICAgICAgICAgLy8gLSBBZGQgdGhlIG5ldyBlbnRyeSB0byB0aGUgdGFibGUKKyAgICAgICAgICAgICAgICAvLyAtIFJlbW92ZSB0aGUgb2xkIGVudHJ5IGZyb20gdGhlIHRhYmxlCisgICAgICAgICAgICAgICAgLy8gLSBFcmFzZSB0aGUgb2xkIGZpbGUKKyAgICAgICAgICAgICAgICAvLyBXZSBzdGFydCBieSBnYXRoZXJpbmcgdGhlIG5hbWVzIG9mIHRoZSBmaWxlcyB3ZSBzaG91bGQgZGVsZXRlLgorICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBmaWxlbmFtZXMgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7CisgICAgICAgICAgICAgICAgZmluYWwgQ3Vyc29yIGMgPSBkYi5xdWVyeShNRVRBREFUQV9UQUJMRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgTE9DQUxfRklMRU5BTUVfQ09MVU1OIH0sCisgICAgICAgICAgICAgICAgICAgICAgICBMT0NBTEVfQ09MVU1OICsgIiA9ID8gQU5EICIgKworICAgICAgICAgICAgICAgICAgICAgICAgV09SRExJU1RJRF9DT0xVTU4gKyAiID0gPyBBTkQgIiArIFNUQVRVU19DT0xVTU4gKyAiID0gPyIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyByLmdldEFzU3RyaW5nKExPQ0FMRV9DT0xVTU4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmdldEFzU3RyaW5nKFdPUkRMSVNUSURfQ09MVU1OKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhTVEFUVVNfSU5TVEFMTEVEKSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICAgICAgaWYgKGMubW92ZVRvRmlyc3QoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSBzaG91bGQgbmV2ZXIgYmUgbW9yZSB0aGFuIG9uZSBmaWxlLCBidXQgaWYgdGhlcmUgYXJlLCBpdCdzIGEgYnVnCisgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB3ZSBzaG91bGQgcmVtb3ZlIHRoZW0gYWxsLiBJIHRoaW5rIGl0IG1pZ2h0IGhhcHBlbiBpZiB0aGUgcG93ZXIgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIHBob25lIGlzIHN1ZGRlbmx5IGN1dCBkdXJpbmcgYW4gdXBkYXRlLgorICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZmlsZW5hbWVJbmRleCA9IGMuZ2V0Q29sdW1uSW5kZXgoTE9DQUxfRklMRU5BTUVfQ09MVU1OKTsKKyAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMubCgiU2V0dGluZyBmb3IgcmVtb3ZhbCIsIGMuZ2V0U3RyaW5nKGZpbGVuYW1lSW5kZXgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lcy5hZGQoYy5nZXRTdHJpbmcoZmlsZW5hbWVJbmRleCkpOworICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChjLm1vdmVUb05leHQoKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgci5wdXQoU1RBVFVTX0NPTFVNTiwgU1RBVFVTX0lOU1RBTExFRCk7CisgICAgICAgICAgICAgICAgZGIuYmVnaW5UcmFuc2FjdGlvbk5vbkV4Y2x1c2l2ZSgpOworICAgICAgICAgICAgICAgIC8vIERlbGV0ZSBhbGwgb2xkIGVudHJpZXMuIFRoZXJlIHNob3VsZCBuZXZlciBiZSBhbnkgc3RhbGxlZCBlbnRyaWVzLCBidXQgaWYKKyAgICAgICAgICAgICAgICAvLyB0aGVyZSBhcmUsIHRoaXMgZGVsZXRlcyB0aGVtLgorICAgICAgICAgICAgICAgIGRiLmRlbGV0ZShNRVRBREFUQV9UQUJMRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgV09SRExJU1RJRF9DT0xVTU4gKyAiID0gPyIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyByLmdldEFzU3RyaW5nKFdPUkRMSVNUSURfQ09MVU1OKSB9KTsKKyAgICAgICAgICAgICAgICBkYi5pbnNlcnQoTUVUQURBVEFfVEFCTEVfTkFNRSwgbnVsbCwgcik7CisgICAgICAgICAgICAgICAgZGIuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICAgICAgICAgICAgZGIuZW5kVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBmaWxlbmFtZSA6IGZpbGVuYW1lcykgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsZSBmID0gbmV3IEZpbGUoZmlsZW5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgZi5kZWxldGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gcGVybWlzc2lvbnMgdG8gZGVsZXRlLiBVbS4gQ2FuJ3QgZG8gYW55dGhpbmcuCisgICAgICAgICAgICAgICAgICAgIH0gLy8gSSBkb24ndCB0aGluayBhbnl0aGluZyBlbHNlIGNhbiBiZSB0aHJvd24KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIC8vIFVua25vd24gdHlwZTogZG8gbm90aGluZy4KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGEgZG93bmxvYWRpbmcgZW50cnkgZnJvbSB0aGUgZGF0YWJhc2UuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIGludm9rZWQgd2hlbiBhIGRvd25sb2FkIGZhaWxzLiBFaXRoZXIgd2UgdHJpZWQgdG8gZG93bmxvYWQsIGJ1dAorICAgICAqIHdlIHJlY2VpdmVkIGEgcGVybWFuZW50IGZhaWx1cmUgYW5kIHdlIHNob3VsZCByZW1vdmUgaXQsIG9yIHdlIGdvdCBtYW51YWxseQorICAgICAqIGNhbmNlbGxlZCBhbmQgd2Ugc2hvdWxkIGxlYXZlIGl0IGF0IHRoYXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGIgdGhlIG1ldGFkYXRhIGRhdGFiYXNlLgorICAgICAqIEBwYXJhbSBpZCB0aGUgRG93bmxvYWRNYW5hZ2VyIGlkIG9mIHRoZSBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVEb3dubG9hZGluZ0VudHJ5KGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiLCBmaW5hbCBsb25nIGlkKSB7CisgICAgICAgIGRiLmRlbGV0ZShNRVRBREFUQV9UQUJMRV9OQU1FLCBQRU5ESU5HSURfQ09MVU1OICsgIiA9ID8gQU5EICIgKyBTVEFUVVNfQ09MVU1OICsgIiA9ID8iLAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IExvbmcudG9TdHJpbmcoaWQpLCBJbnRlZ2VyLnRvU3RyaW5nKFNUQVRVU19ET1dOTE9BRElORykgfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9yY2VmdWxseSByZW1vdmVzIGFuIGVudHJ5IGZyb20gdGhlIGRhdGFiYXNlLgorICAgICAqCisgICAgICogVGhpcyBpcyBpbnZva2VkIHdoZW4gYSBmaWxlIGlzIGJyb2tlbi4gVGhlIGZpbGUgaGFzIGJlZW4gZG93bmxvYWRlZCwgYnV0IEFuZHJvaWQKKyAgICAgKiBLZXlib2FyZCBpcyB0ZWxsaW5nIHVzIGl0IGNvdWxkIG5vdCBvcGVuIGl0LgorICAgICAqCisgICAgICogQHBhcmFtIGRiIHRoZSBtZXRhZGF0YSBkYXRhYmFzZS4KKyAgICAgKiBAcGFyYW0gaWQgdGhlIGlkIG9mIHRoZSB3b3JkIGxpc3QuCisgICAgICogQHBhcmFtIHZlcnNpb24gdGhlIHZlcnNpb24gb2YgdGhlIHdvcmQgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlRW50cnkoZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIsIGZpbmFsIFN0cmluZyBpZCwgZmluYWwgaW50IHZlcnNpb24pIHsKKyAgICAgICAgZGIuZGVsZXRlKE1FVEFEQVRBX1RBQkxFX05BTUUsIFdPUkRMSVNUSURfQ09MVU1OICsgIiA9ID8gQU5EICIgKyBWRVJTSU9OX0NPTFVNTiArICIgPSA/IiwKKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBpZCwgSW50ZWdlci50b1N0cmluZyh2ZXJzaW9uKSB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBtZXRob2QgdGhhdCBzZXRzIHRoZSBjdXJyZW50IHN0YXR1cyBvZiBhbiBlbnRyeSBvZiB0aGUgZGF0YWJhc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGIgdGhlIG1ldGFkYXRhIGRhdGFiYXNlLgorICAgICAqIEBwYXJhbSBpZCB0aGUgaWQgb2YgdGhlIHdvcmQgbGlzdC4KKyAgICAgKiBAcGFyYW0gdmVyc2lvbiB0aGUgdmVyc2lvbiBvZiB0aGUgd29yZCBsaXN0LgorICAgICAqIEBwYXJhbSBzdGF0dXMgdGhlIHN0YXR1cyB0byBzZXQgdGhlIHdvcmQgbGlzdCB0by4KKyAgICAgKiBAcGFyYW0gZG93bmxvYWRJZCBhbiBvcHRpb25hbCBkb3dubG9hZCBpZCB0byB3cml0ZSwgb3IgTk9UX0FfRE9XTkxPQURfSUQKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIG1hcmtFbnRyeUFzKGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiLCBmaW5hbCBTdHJpbmcgaWQsCisgICAgICAgICAgICBmaW5hbCBpbnQgdmVyc2lvbiwgZmluYWwgaW50IHN0YXR1cywgZmluYWwgbG9uZyBkb3dubG9hZElkKSB7CisgICAgICAgIGZpbmFsIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gTWV0YWRhdGFEYkhlbHBlci5nZXRDb250ZW50VmFsdWVzQnlXb3JkTGlzdElkKGRiLCBpZCwgdmVyc2lvbik7CisgICAgICAgIHZhbHVlcy5wdXQoU1RBVFVTX0NPTFVNTiwgc3RhdHVzKTsKKyAgICAgICAgaWYgKE5PVF9BX0RPV05MT0FEX0lEICE9IGRvd25sb2FkSWQpIHsKKyAgICAgICAgICAgIHZhbHVlcy5wdXQoTWV0YWRhdGFEYkhlbHBlci5QRU5ESU5HSURfQ09MVU1OLCBkb3dubG9hZElkKTsKKyAgICAgICAgfQorICAgICAgICBkYi51cGRhdGUoTUVUQURBVEFfVEFCTEVfTkFNRSwgdmFsdWVzLAorICAgICAgICAgICAgICAgIFdPUkRMSVNUSURfQ09MVU1OICsgIiA9ID8gQU5EICIgKyBWRVJTSU9OX0NPTFVNTiArICIgPSA/IiwKKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBpZCwgSW50ZWdlci50b1N0cmluZyh2ZXJzaW9uKSB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIHN0YXR1cyBjb2x1bW4gZm9yIHRoZSB3b3JkbGlzdCB3aXRoIHRoaXMgaWQgYXMgZW5hYmxlZC4gVHlwaWNhbGx5IHRoaXMKKyAgICAgKiBtZWFucyB0aGUgd29yZCBsaXN0IGlzIGN1cnJlbnRseSBkaXNhYmxlZCBhbmQgd2Ugd2FudCB0byBzZXQgaXRzIHN0YXR1cyB0byBJTlNUQUxMRUQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGIgdGhlIG1ldGFkYXRhIGRhdGFiYXNlLgorICAgICAqIEBwYXJhbSBpZCB0aGUgaWQgb2YgdGhlIHdvcmQgbGlzdC4KKyAgICAgKiBAcGFyYW0gdmVyc2lvbiB0aGUgdmVyc2lvbiBvZiB0aGUgd29yZCBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYXJrRW50cnlBc0VuYWJsZWQoZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIsIGZpbmFsIFN0cmluZyBpZCwKKyAgICAgICAgICAgIGZpbmFsIGludCB2ZXJzaW9uKSB7CisgICAgICAgIG1hcmtFbnRyeUFzKGRiLCBpZCwgdmVyc2lvbiwgU1RBVFVTX0lOU1RBTExFRCwgTk9UX0FfRE9XTkxPQURfSUQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgc3RhdHVzIGNvbHVtbiBmb3IgdGhlIHdvcmRsaXN0IHdpdGggdGhpcyBpZCBhcyBkaXNhYmxlZC4gVHlwaWNhbGx5IHRoaXMKKyAgICAgKiBtZWFucyB0aGUgd29yZCBsaXN0IGlzIGN1cnJlbnRseSBpbnN0YWxsZWQgYW5kIHdlIHdhbnQgdG8gc2V0IGl0cyBzdGF0dXMgdG8gRElTQUJMRUQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGIgdGhlIG1ldGFkYXRhIGRhdGFiYXNlLgorICAgICAqIEBwYXJhbSBpZCB0aGUgaWQgb2YgdGhlIHdvcmQgbGlzdC4KKyAgICAgKiBAcGFyYW0gdmVyc2lvbiB0aGUgdmVyc2lvbiBvZiB0aGUgd29yZCBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYXJrRW50cnlBc0Rpc2FibGVkKGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiLCBmaW5hbCBTdHJpbmcgaWQsCisgICAgICAgICAgICBmaW5hbCBpbnQgdmVyc2lvbikgeworICAgICAgICBtYXJrRW50cnlBcyhkYiwgaWQsIHZlcnNpb24sIFNUQVRVU19ESVNBQkxFRCwgTk9UX0FfRE9XTkxPQURfSUQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgc3RhdHVzIGNvbHVtbiBmb3IgdGhlIHdvcmRsaXN0IHdpdGggdGhpcyBpZCBhcyBhdmFpbGFibGUuIFRoaXMgaGFwcGVucyBmb3IKKyAgICAgKiBleGFtcGxlIHdoZW4gYSB3b3JkIGxpc3QgaGFzIGJlZW4gZGVsZXRlZCBidXQgY2FuIGJlIGRvd25sb2FkZWQgYWdhaW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGIgdGhlIG1ldGFkYXRhIGRhdGFiYXNlLgorICAgICAqIEBwYXJhbSBpZCB0aGUgaWQgb2YgdGhlIHdvcmQgbGlzdC4KKyAgICAgKiBAcGFyYW0gdmVyc2lvbiB0aGUgdmVyc2lvbiBvZiB0aGUgd29yZCBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYXJrRW50cnlBc0F2YWlsYWJsZShmaW5hbCBTUUxpdGVEYXRhYmFzZSBkYiwgZmluYWwgU3RyaW5nIGlkLAorICAgICAgICAgICAgZmluYWwgaW50IHZlcnNpb24pIHsKKyAgICAgICAgbWFya0VudHJ5QXMoZGIsIGlkLCB2ZXJzaW9uLCBTVEFUVVNfQVZBSUxBQkxFLCBOT1RfQV9ET1dOTE9BRF9JRCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBkZXNpZ25hdGVkIHdvcmQgbGlzdCBhcyBkb3dubG9hZGFibGUsIGFsb25nc2lkZSB3aXRoIGl0cyBkb3dubG9hZCBpZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYiB0aGUgbWV0YWRhdGEgZGF0YWJhc2UuCisgICAgICogQHBhcmFtIGlkIHRoZSBpZCBvZiB0aGUgd29yZCBsaXN0LgorICAgICAqIEBwYXJhbSB2ZXJzaW9uIHRoZSB2ZXJzaW9uIG9mIHRoZSB3b3JkIGxpc3QuCisgICAgICogQHBhcmFtIGRvd25sb2FkSWQgdGhlIGRvd25sb2FkIGlkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYXJrRW50cnlBc0Rvd25sb2FkaW5nKGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiLCBmaW5hbCBTdHJpbmcgaWQsCisgICAgICAgICAgICBmaW5hbCBpbnQgdmVyc2lvbiwgZmluYWwgbG9uZyBkb3dubG9hZElkKSB7CisgICAgICAgIG1hcmtFbnRyeUFzKGRiLCBpZCwgdmVyc2lvbiwgU1RBVFVTX0RPV05MT0FESU5HLCBkb3dubG9hZElkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIGRlc2lnbmF0ZWQgd29yZCBsaXN0IGFzIGRlbGV0aW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGRiIHRoZSBtZXRhZGF0YSBkYXRhYmFzZS4KKyAgICAgKiBAcGFyYW0gaWQgdGhlIGlkIG9mIHRoZSB3b3JkIGxpc3QuCisgICAgICogQHBhcmFtIHZlcnNpb24gdGhlIHZlcnNpb24gb2YgdGhlIHdvcmQgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFya0VudHJ5QXNEZWxldGluZyhmaW5hbCBTUUxpdGVEYXRhYmFzZSBkYiwgZmluYWwgU3RyaW5nIGlkLAorICAgICAgICAgICAgZmluYWwgaW50IHZlcnNpb24pIHsKKyAgICAgICAgbWFya0VudHJ5QXMoZGIsIGlkLCB2ZXJzaW9uLCBTVEFUVVNfREVMRVRJTkcsIE5PVF9BX0RPV05MT0FEX0lEKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9NZXRhZGF0YUhhbmRsZXIuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL01ldGFkYXRhSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMTQ3YjYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9NZXRhZGF0YUhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorICogdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmRpY3Rpb25hcnlwYWNrOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogSGVscGVyIGNsYXNzIHRvIGVhc3kgdXAgbWFuaXB1bGF0aW9uIG9mIGRpY3Rpb25hcnkgcGFjayBtZXRhZGF0YS4KKyAqLworcHVibGljIGNsYXNzIE1ldGFkYXRhSGFuZGxlciB7CisgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJEaWN0aW9uYXJ5UHJvdmlkZXI6IiArIE1ldGFkYXRhSGFuZGxlci5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CisKKyAgICAvLyBUaGUgY2Fub25pY2FsIGZpbGUgbmFtZSBmb3IgbWV0YWRhdGEuIFRoaXMgaXMgbm90IHRoZSBuYW1lIG9mIGEgcmVhbCBmaWxlIG9uIHRoZQorICAgIC8vIGRldmljZSwgYnV0IGEgc3ltYm9saWMgbmFtZSB1c2VkIGluIHRoZSBkYXRhYmFzZSBhbmQgaW4gbWV0YWRhdGEgaGFuZGxpbmcuIEl0IGlzIG5ldmVyCisgICAgLy8gdGVzdGVkIGFnYWluc3QsIG9ubHkgdXNlZCBmb3IgaHVtYW4tcmVhZGFiaWxpdHkgYXMgdGhlIGZpbGUgbmFtZSBmb3IgdGhlIG1ldGFkYXRhLgorICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1FVEFEQVRBX0ZJTEVOQU1FID0gIm1ldGFkYXRhLmpzb24iOworCisgICAgLyoqCisgICAgICogUmVhZHMgdGhlIGRhdGEgZnJvbSB0aGUgY3Vyc29yIGFuZCBzdG9yZSBpdCBpbiBtZXRhZGF0YSBvYmplY3RzLgorICAgICAqIEBwYXJhbSByZXN1bHRzIHRoZSBjdXJzb3IgdG8gcmVhZCBkYXRhIGZyb20uCisgICAgICogQHJldHVybiB0aGUgY29uc3RydWN0ZWQgbGlzdCBvZiB3b3JkbGlzdCBtZXRhZGF0YS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFdvcmRMaXN0TWV0YWRhdGE+IG1ha2VNZXRhZGF0YU9iamVjdChmaW5hbCBDdXJzb3IgcmVzdWx0cykgeworICAgICAgICBmaW5hbCBBcnJheUxpc3Q8V29yZExpc3RNZXRhZGF0YT4gYnVpbGRpbmdNZXRhZGF0YSA9IG5ldyBBcnJheUxpc3Q8V29yZExpc3RNZXRhZGF0YT4oKTsKKworICAgICAgICBpZiAocmVzdWx0cy5tb3ZlVG9GaXJzdCgpKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgbG9jYWxlQ29sdW1uID0gcmVzdWx0cy5nZXRDb2x1bW5JbmRleChNZXRhZGF0YURiSGVscGVyLkxPQ0FMRV9DT0xVTU4pOworICAgICAgICAgICAgZmluYWwgaW50IHR5cGVDb2x1bW4gPSByZXN1bHRzLmdldENvbHVtbkluZGV4KE1ldGFkYXRhRGJIZWxwZXIuVFlQRV9DT0xVTU4pOworICAgICAgICAgICAgZmluYWwgaW50IGRlc2NyaXB0aW9uQ29sdW1uID0KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5nZXRDb2x1bW5JbmRleChNZXRhZGF0YURiSGVscGVyLkRFU0NSSVBUSU9OX0NPTFVNTik7CisgICAgICAgICAgICBmaW5hbCBpbnQgaWRJbmRleCA9IHJlc3VsdHMuZ2V0Q29sdW1uSW5kZXgoTWV0YWRhdGFEYkhlbHBlci5XT1JETElTVElEX0NPTFVNTik7CisgICAgICAgICAgICBmaW5hbCBpbnQgdXBkYXRlSW5kZXggPSByZXN1bHRzLmdldENvbHVtbkluZGV4KE1ldGFkYXRhRGJIZWxwZXIuREFURV9DT0xVTU4pOworICAgICAgICAgICAgZmluYWwgaW50IGZpbGVTaXplSW5kZXggPSByZXN1bHRzLmdldENvbHVtbkluZGV4KE1ldGFkYXRhRGJIZWxwZXIuRklMRVNJWkVfQ09MVU1OKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBjaGVja3N1bUluZGV4ID0gcmVzdWx0cy5nZXRDb2x1bW5JbmRleChNZXRhZGF0YURiSGVscGVyLkNIRUNLU1VNX0NPTFVNTik7CisgICAgICAgICAgICBmaW5hbCBpbnQgbG9jYWxGaWxlbmFtZUluZGV4ID0KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5nZXRDb2x1bW5JbmRleChNZXRhZGF0YURiSGVscGVyLkxPQ0FMX0ZJTEVOQU1FX0NPTFVNTik7CisgICAgICAgICAgICBmaW5hbCBpbnQgcmVtb3RlRmlsZW5hbWVJbmRleCA9CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuZ2V0Q29sdW1uSW5kZXgoTWV0YWRhdGFEYkhlbHBlci5SRU1PVEVfRklMRU5BTUVfQ09MVU1OKTsKKyAgICAgICAgICAgIGZpbmFsIGludCB2ZXJzaW9uSW5kZXggPSByZXN1bHRzLmdldENvbHVtbkluZGV4KE1ldGFkYXRhRGJIZWxwZXIuVkVSU0lPTl9DT0xVTU4pOworICAgICAgICAgICAgZmluYWwgaW50IGZvcm1hdFZlcnNpb25JbmRleCA9CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuZ2V0Q29sdW1uSW5kZXgoTWV0YWRhdGFEYkhlbHBlci5GT1JNQVRWRVJTSU9OX0NPTFVNTik7CisKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBidWlsZGluZ01ldGFkYXRhLmFkZChuZXcgV29yZExpc3RNZXRhZGF0YShyZXN1bHRzLmdldFN0cmluZyhpZEluZGV4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuZ2V0SW50KHR5cGVDb2x1bW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5nZXRTdHJpbmcoZGVzY3JpcHRpb25Db2x1bW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5nZXRMb25nKHVwZGF0ZUluZGV4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuZ2V0TG9uZyhmaWxlU2l6ZUluZGV4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuZ2V0U3RyaW5nKGNoZWNrc3VtSW5kZXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5nZXRTdHJpbmcobG9jYWxGaWxlbmFtZUluZGV4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuZ2V0U3RyaW5nKHJlbW90ZUZpbGVuYW1lSW5kZXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5nZXRJbnQodmVyc2lvbkluZGV4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuZ2V0SW50KGZvcm1hdFZlcnNpb25JbmRleCksCisgICAgICAgICAgICAgICAgICAgICAgICAwLCByZXN1bHRzLmdldFN0cmluZyhsb2NhbGVDb2x1bW4pKSk7CisgICAgICAgICAgICB9IHdoaWxlIChyZXN1bHRzLm1vdmVUb05leHQoKSk7CisKKyAgICAgICAgICAgIHJlc3VsdHMuY2xvc2UoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChidWlsZGluZ01ldGFkYXRhKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB3aG9sZSBtZXRhZGF0YSwgZm9yIGluc3RhbGxlZCBhbmQgbm90IGluc3RhbGxlZCBkaWN0aW9uYXJpZXMuCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gb3BlbiBmaWxlcyBvdmVyLgorICAgICAqIEBwYXJhbSBjbGllbnRJZCB0aGUgY2xpZW50IGlkIGZvciByZXRyaWV2aW5nIHRoZSBkYXRhYmFzZS4gbnVsbCBmb3IgZGVmYXVsdCAoZGVwcmVjYXRlZCkKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IG1ldGFkYXRhLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxXb3JkTGlzdE1ldGFkYXRhPiBnZXRDdXJyZW50TWV0YWRhdGEoZmluYWwgQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNsaWVudElkKSB7CisgICAgICAgIC8vIElmIGNsaWVudElkIGlzIG51bGwsIHdlIGdldCBhIGN1cnNvciBvbiB0aGUgZGVmYXVsdCBkYXRhYmFzZSAoc2VlCisgICAgICAgIC8vIE1ldGFkYXRhRGJIZWxwZXIjZ2V0SW5zdGFuY2UoKSBmb3IgbW9yZSBvbiB0aGlzKQorICAgICAgICBmaW5hbCBDdXJzb3IgcmVzdWx0cyA9IE1ldGFkYXRhRGJIZWxwZXIucXVlcnlDdXJyZW50TWV0YWRhdGEoY29udGV4dCwgY2xpZW50SWQpOworICAgICAgICBmaW5hbCBMaXN0PFdvcmRMaXN0TWV0YWRhdGE+IHJlc3VsdExpc3QgPSBtYWtlTWV0YWRhdGFPYmplY3QocmVzdWx0cyk7CisgICAgICAgIHJlc3VsdHMuY2xvc2UoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdExpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBtZXRhZGF0YSBmcm9tIGEgc3RyZWFtLgorICAgICAqIEBwYXJhbSBpbnB1dCBUaGUgc3RyZWFtIHRvIHJlYWQgZnJvbS4KKyAgICAgKiBAcmV0dXJuIFRoZSByZWFkIG1ldGFkYXRhLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIGlucHV0IHN0cmVhbSBjYW5ub3QgYmUgcmVhZAorICAgICAqIEB0aHJvd3MgQmFkRm9ybWF0RXhjZXB0aW9uIGlmIHRoZSBzdHJlYW0gaXMgbm90IGluIGEga25vd24gZm9ybWF0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0PFdvcmRMaXN0TWV0YWRhdGE+IHJlYWRNZXRhZGF0YShmaW5hbCBJbnB1dFN0cmVhbVJlYWRlciBpbnB1dCkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQmFkRm9ybWF0RXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIE1ldGFkYXRhUGFyc2VyLnBhcnNlTWV0YWRhdGEoaW5wdXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmRzIGEgc2luZ2xlIFdvcmRMaXN0TWV0YWRhdGEgaW5zaWRlIGEgd2hvbGUgbWV0YWRhdGEgY2h1bmsuCisgICAgICoKKyAgICAgKiBTZWFyY2hlcyB0aHJvdWdoIHRoZSB3aG9sZSBwYXNzZWQgbWV0YWRhdGEgZm9yIHRoZSBmaXJzdCBXb3JkTGlzdE1ldGFkYXRhIGFzc29jaWF0ZWQKKyAgICAgKiB3aXRoIHRoZSBwYXNzZWQgSUQuIElmIHNldmVyYWwgbWV0YWRhdGEgY2h1bmtzIHdpdGggdGhlIHNhbWUgaWQgYXJlIGZvdW5kLCBpdCB3aWxsCisgICAgICogYWx3YXlzIHJldHVybiB0aGUgb25lIHdpdGggdGhlIGJpZ2dlciBGb3JtYXRWZXJzaW9uIHRoYXQgaXMgbGVzcyBvciBlcXVhbCB0aGFuIHRoZQorICAgICAqIG1heGltdW0gc3VwcG9ydGVkIGZvcm1hdCB2ZXJzaW9uIChhcyBsaXN0ZWQgaW4gVXBkYXRlSGFuZGxlcikuCisgICAgICogVGhpcyB3aWxsIE5FVkVSIHJldHVybiB0aGUgbWV0YWRhdGEgd2l0aCBhIEZvcm1hdFZlcnNpb24gYmlnZ2VyIHRoYW4gd2hhdCBpcyBzdXBwb3J0ZWQsCisgICAgICogZXZlbiBpZiBpdCBpcyB0aGUgb25seSB3b3JkIGxpc3Qgd2l0aCB0aGlzIElELgorICAgICAqCisgICAgICogQHBhcmFtIG1ldGFkYXRhIHRoZSBtZXRhZGF0YSB0byBzZWFyY2ggaW50by4KKyAgICAgKiBAcGFyYW0gaWQgdGhlIHdvcmQgbGlzdCBJRCBvZiB0aGUgbWV0YWRhdGEgdG8gZmluZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBhc3NvY2lhdGVkIG1ldGFkYXRhLCBvciBudWxsIGlmIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFdvcmRMaXN0TWV0YWRhdGEgZmluZFdvcmRMaXN0QnlJZChmaW5hbCBMaXN0PFdvcmRMaXN0TWV0YWRhdGE+IG1ldGFkYXRhLAorICAgICAgICAgICAgZmluYWwgU3RyaW5nIGlkKSB7CisgICAgICAgIFdvcmRMaXN0TWV0YWRhdGEgYmVzdFdvcmRMaXN0ID0gbnVsbDsKKyAgICAgICAgaW50IGJlc3RGb3JtYXRWZXJzaW9uID0gSW50ZWdlci5NSU5fVkFMVUU7IC8vIFRvIGJlIHN1cmUgd2UgY2FuJ3QgYmUgaW5hZHZlcnRlbnRseSBzbWFsbGVyCisgICAgICAgIGZvciAoV29yZExpc3RNZXRhZGF0YSB3b3JkTGlzdCA6IG1ldGFkYXRhKSB7CisgICAgICAgICAgICBpZiAoaWQuZXF1YWxzKHdvcmRMaXN0Lm1JZCkKKyAgICAgICAgICAgICAgICAgICAgJiYgd29yZExpc3QubUZvcm1hdFZlcnNpb24gPD0gVXBkYXRlSGFuZGxlci5NQVhJTVVNX1NVUFBPUlRFRF9GT1JNQVRfVkVSU0lPTgorICAgICAgICAgICAgICAgICAgICAmJiB3b3JkTGlzdC5tRm9ybWF0VmVyc2lvbiA+IGJlc3RGb3JtYXRWZXJzaW9uKSB7CisgICAgICAgICAgICAgICAgYmVzdFdvcmRMaXN0ID0gd29yZExpc3Q7CisgICAgICAgICAgICAgICAgYmVzdEZvcm1hdFZlcnNpb24gPSB3b3JkTGlzdC5tRm9ybWF0VmVyc2lvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBJZiB3ZSBkaWRuJ3QgZmluZCBhbnkgbWF0Y2ggd2UnbGwgcmV0dXJuIG51bGwuCisgICAgICAgIHJldHVybiBiZXN0V29yZExpc3Q7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svTWV0YWRhdGFQYXJzZXIuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL01ldGFkYXRhUGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc2NzBmZAotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL01ldGFkYXRhUGFyc2VyLmphdmEKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAqIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5kaWN0aW9uYXJ5cGFjazsKKworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkpzb25SZWFkZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CisKKy8qKgorICogSGVscGVyIGNsYXNzIGNvbnRhaW5pbmcgZnVuY3Rpb25zIHRvIHBhcnNlIHRoZSBkaWN0aW9uYXJ5IG1ldGFkYXRhLgorICovCitwdWJsaWMgY2xhc3MgTWV0YWRhdGFQYXJzZXIgeworCisgICAgLy8gTmFtZSBvZiB0aGUgZmllbGRzIGluIHRoZSBKU09OLWZvcm1hdHRlZCBmaWxlLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9GSUVMRF9OQU1FID0gTWV0YWRhdGFEYkhlbHBlci5XT1JETElTVElEX0NPTFVNTjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQUxFX0ZJRUxEX05BTUUgPSAibG9jYWxlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fRklFTERfTkFNRSA9IE1ldGFkYXRhRGJIZWxwZXIuREVTQ1JJUFRJT05fQ09MVU1OOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUERBVEVfRklFTERfTkFNRSA9ICJ1cGRhdGUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFU0laRV9GSUVMRF9OQU1FID0gTWV0YWRhdGFEYkhlbHBlci5GSUxFU0laRV9DT0xVTU47CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENIRUNLU1VNX0ZJRUxEX05BTUUgPSBNZXRhZGF0YURiSGVscGVyLkNIRUNLU1VNX0NPTFVNTjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1RFX0ZJTEVOQU1FX0ZJRUxEX05BTUUgPQorICAgICAgICAgICAgTWV0YWRhdGFEYkhlbHBlci5SRU1PVEVfRklMRU5BTUVfQ09MVU1OOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX0ZJRUxEX05BTUUgPSBNZXRhZGF0YURiSGVscGVyLlZFUlNJT05fQ09MVU1OOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRWRVJTSU9OX0ZJRUxEX05BTUUgPSBNZXRhZGF0YURiSGVscGVyLkZPUk1BVFZFUlNJT05fQ09MVU1OOworCisgICAgLyoqCisgICAgICogUGFyc2Ugb25lIEpTT04tZm9ybWF0dGVkIHdvcmQgbGlzdCBtZXRhZGF0YS4KKyAgICAgKiBAcGFyYW0gcmVhZGVyIHRoZSByZWFkZXIgY29udGFpbmluZyB0aGUgZGF0YS4KKyAgICAgKiBAcmV0dXJuIGEgV29yZExpc3RNZXRhZGF0YSBvYmplY3QgZnJvbSB0aGUgcGFyc2VkIGRhdGEuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgdW5kZXJseWluZyByZWFkZXIgdGhyb3dzIElPRXhjZXB0aW9uIGR1cmluZyByZWFkaW5nLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFdvcmRMaXN0TWV0YWRhdGEgcGFyc2VPbmVXb3JkTGlzdChmaW5hbCBKc29uUmVhZGVyIHJlYWRlcikKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQmFkRm9ybWF0RXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4gYXJndW1lbnRzID0gbmV3IFRyZWVNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICB3aGlsZSAocmVhZGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSByZWFkZXIubmV4dE5hbWUoKTsKKyAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobmFtZSkpIHsKKyAgICAgICAgICAgICAgICBhcmd1bWVudHMucHV0KG5hbWUsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJlYWRlci5lbmRPYmplY3QoKTsKKyAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGFyZ3VtZW50cy5nZXQoSURfRklFTERfTkFNRSkpCisgICAgICAgICAgICAgICAgfHwgVGV4dFV0aWxzLmlzRW1wdHkoYXJndW1lbnRzLmdldChMT0NBTEVfRklFTERfTkFNRSkpCisgICAgICAgICAgICAgICAgfHwgVGV4dFV0aWxzLmlzRW1wdHkoYXJndW1lbnRzLmdldChERVNDUklQVElPTl9GSUVMRF9OQU1FKSkKKyAgICAgICAgICAgICAgICB8fCBUZXh0VXRpbHMuaXNFbXB0eShhcmd1bWVudHMuZ2V0KFVQREFURV9GSUVMRF9OQU1FKSkKKyAgICAgICAgICAgICAgICB8fCBUZXh0VXRpbHMuaXNFbXB0eShhcmd1bWVudHMuZ2V0KEZJTEVTSVpFX0ZJRUxEX05BTUUpKQorICAgICAgICAgICAgICAgIHx8IFRleHRVdGlscy5pc0VtcHR5KGFyZ3VtZW50cy5nZXQoQ0hFQ0tTVU1fRklFTERfTkFNRSkpCisgICAgICAgICAgICAgICAgfHwgVGV4dFV0aWxzLmlzRW1wdHkoYXJndW1lbnRzLmdldChSRU1PVEVfRklMRU5BTUVfRklFTERfTkFNRSkpCisgICAgICAgICAgICAgICAgfHwgVGV4dFV0aWxzLmlzRW1wdHkoYXJndW1lbnRzLmdldChWRVJTSU9OX0ZJRUxEX05BTUUpKQorICAgICAgICAgICAgICAgIHx8IFRleHRVdGlscy5pc0VtcHR5KGFyZ3VtZW50cy5nZXQoRk9STUFUVkVSU0lPTl9GSUVMRF9OQU1FKSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCYWRGb3JtYXRFeGNlcHRpb24oYXJndW1lbnRzLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIC8vIFRPRE86IG5lZWQgdG8gZmluZCBvdXQgd2hldGhlciBpdCdzIGJ1bGsgb3IgdXBkYXRlCisgICAgICAgIC8vIFRoZSBudWxsIGFyZ3VtZW50IGlzIHRoZSBsb2NhbCBmaWxlIG5hbWUsIHdoaWNoIGlzIG5vdCBrbm93biBhdCB0aGlzIHRpbWUgYW5kIHdpbGwKKyAgICAgICAgLy8gYmUgZGVjaWRlZCBsYXRlci4KKyAgICAgICAgcmV0dXJuIG5ldyBXb3JkTGlzdE1ldGFkYXRhKAorICAgICAgICAgICAgICAgIGFyZ3VtZW50cy5nZXQoSURfRklFTERfTkFNRSksCisgICAgICAgICAgICAgICAgTWV0YWRhdGFEYkhlbHBlci5UWVBFX0JVTEssCisgICAgICAgICAgICAgICAgYXJndW1lbnRzLmdldChERVNDUklQVElPTl9GSUVMRF9OQU1FKSwKKyAgICAgICAgICAgICAgICBMb25nLnBhcnNlTG9uZyhhcmd1bWVudHMuZ2V0KFVQREFURV9GSUVMRF9OQU1FKSksCisgICAgICAgICAgICAgICAgTG9uZy5wYXJzZUxvbmcoYXJndW1lbnRzLmdldChGSUxFU0laRV9GSUVMRF9OQU1FKSksCisgICAgICAgICAgICAgICAgYXJndW1lbnRzLmdldChDSEVDS1NVTV9GSUVMRF9OQU1FKSwKKyAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgIGFyZ3VtZW50cy5nZXQoUkVNT1RFX0ZJTEVOQU1FX0ZJRUxEX05BTUUpLAorICAgICAgICAgICAgICAgIEludGVnZXIucGFyc2VJbnQoYXJndW1lbnRzLmdldChWRVJTSU9OX0ZJRUxEX05BTUUpKSwKKyAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KGFyZ3VtZW50cy5nZXQoRk9STUFUVkVSU0lPTl9GSUVMRF9OQU1FKSksCisgICAgICAgICAgICAgICAgMCwgYXJndW1lbnRzLmdldChMT0NBTEVfRklFTERfTkFNRSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlcyBtZXRhZGF0YSBpbiB0aGUgSlNPTiBmb3JtYXQuCisgICAgICogQHBhcmFtIGlucHV0IGEgc3RyZWFtIHJlYWRlciBleHBlY3RlZCB0byBjb250YWluIEpTT04gZm9ybWF0dGVkIG1ldGFkYXRhLgorICAgICAqIEByZXR1cm4gZGljdGlvbmFyeSBtZXRhZGF0YSwgYXMgYW4gYXJyYXkgb2YgV29yZExpc3RNZXRhZGF0YSBvYmplY3RzLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIHVuZGVybHlpbmcgcmVhZGVyIHRocm93cyBJT0V4Y2VwdGlvbiBkdXJpbmcgcmVhZGluZy4KKyAgICAgKiBAdGhyb3dzIEJhZEZvcm1hdEV4Y2VwdGlvbiBpZiB0aGUgZGF0YSB3YXMgbm90IGluIHRoZSBleHBlY3RlZCBmb3JtYXQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0PFdvcmRMaXN0TWV0YWRhdGE+IHBhcnNlTWV0YWRhdGEoZmluYWwgSW5wdXRTdHJlYW1SZWFkZXIgaW5wdXQpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEJhZEZvcm1hdEV4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIoaW5wdXQpOworICAgICAgICBmaW5hbCBBcnJheUxpc3Q8V29yZExpc3RNZXRhZGF0YT4gcmVhZEluZm8gPSBuZXcgQXJyYXlMaXN0PFdvcmRMaXN0TWV0YWRhdGE+KCk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIHdoaWxlIChyZWFkZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBmaW5hbCBXb3JkTGlzdE1ldGFkYXRhIHRoaXNNZXRhZGF0YSA9IHBhcnNlT25lV29yZExpc3QocmVhZGVyKTsKKyAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodGhpc01ldGFkYXRhLm1Mb2NhbGUpKQorICAgICAgICAgICAgICAgIHJlYWRJbmZvLmFkZCh0aGlzTWV0YWRhdGEpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHJlYWRJbmZvKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL1ByaXZhdGVMb2cuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL1ByaXZhdGVMb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTkzYzFjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svUHJpdmF0ZUxvZy5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgKiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuZGljdGlvbmFyeXBhY2s7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZU9wZW5IZWxwZXI7CisKK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKKworLyoqCisgKiBDbGFzcyB0byBrZWVwIGxvbmctdGVybSBsb2cuIFRoaXMgaXMgaW5hY3RpdmUgaW4gcHJvZHVjdGlvbiwgYW5kIGlzIG9ubHkgZm9yIGRlYnVnIHB1cnBvc2VzLgorICovCitwdWJsaWMgY2xhc3MgUHJpdmF0ZUxvZyB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBEaWN0aW9uYXJ5UHJvdmlkZXIuREVCVUc7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX0RBVEFCQVNFX05BTUUgPSAibG9nIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBQkxFX05BTUUgPSAibG9nIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTE9HX0RBVEFCQVNFX1ZFUlNJT04gPSAxOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9EQVRFID0gImRhdGUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fRVZFTlQgPSAiZXZlbnQiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUJMRV9DUkVBVEUgPSAiQ1JFQVRFIFRBQkxFICIgKyBMT0dfVEFCTEVfTkFNRSArICIgKCIKKyAgICAgICAgICAgICsgQ09MVU1OX0RBVEUgKyAiIFRFWFQsIgorICAgICAgICAgICAgKyBDT0xVTU5fRVZFTlQgKyAiIFRFWFQpOyI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTaW1wbGVEYXRlRm9ybWF0IHNEYXRlRm9ybWF0ID0KKyAgICAgICAgICAgIG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5L01NL2RkIEhIOm1tOnNzIik7CisKKyAgICBwcml2YXRlIHN0YXRpYyBQcml2YXRlTG9nIHNJbnN0YW5jZSA9IG5ldyBQcml2YXRlTG9nKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgRGVidWdIZWxwZXIgbURlYnVnSGVscGVyID0gbnVsbDsKKworICAgIHByaXZhdGUgUHJpdmF0ZUxvZygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBQcml2YXRlTG9nIGdldEluc3RhbmNlKGZpbmFsIENvbnRleHQgY29udGV4dCkgeworICAgICAgICBpZiAoIURFQlVHKSByZXR1cm4gc0luc3RhbmNlOworICAgICAgICBzeW5jaHJvbml6ZWQoUHJpdmF0ZUxvZy5jbGFzcykgeworICAgICAgICAgICAgaWYgKHNJbnN0YW5jZS5tRGVidWdIZWxwZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNJbnN0YW5jZS5tRGVidWdIZWxwZXIgPSBuZXcgRGVidWdIZWxwZXIoY29udGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc0luc3RhbmNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGVidWdIZWxwZXIgZXh0ZW5kcyBTUUxpdGVPcGVuSGVscGVyIHsKKworICAgICAgICBwcml2YXRlIERlYnVnSGVscGVyKGZpbmFsIENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgTE9HX0RBVEFCQVNFX05BTUUsIG51bGwsIExPR19EQVRBQkFTRV9WRVJTSU9OKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShTUUxpdGVEYXRhYmFzZSBkYikgeworICAgICAgICAgICAgaWYgKCFERUJVRykgcmV0dXJuOworICAgICAgICAgICAgZGIuZXhlY1NRTChMT0dfVEFCTEVfQ1JFQVRFKTsKKyAgICAgICAgICAgIGluc2VydChkYiwgIkNyZWF0ZWQgdGFibGUiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblVwZ3JhZGUoU1FMaXRlRGF0YWJhc2UgZGIsIGludCBvbGRWZXJzaW9uLCBpbnQgbmV3VmVyc2lvbikgeworICAgICAgICAgICAgaWYgKCFERUJVRykgcmV0dXJuOworICAgICAgICAgICAgLy8gUmVtb3ZlIGFsbCBkYXRhLgorICAgICAgICAgICAgZGIuZXhlY1NRTCgiRFJPUCBUQUJMRSBJRiBFWElTVFMgIiArIExPR19UQUJMRV9OQU1FKTsKKyAgICAgICAgICAgIG9uQ3JlYXRlKGRiKTsKKyAgICAgICAgICAgIGluc2VydChkYiwgIlVwZ3JhZGUgZmluaXNoZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgaW5zZXJ0KFNRTGl0ZURhdGFiYXNlIGRiLCBTdHJpbmcgZXZlbnQpIHsKKyAgICAgICAgICAgIGlmICghREVCVUcpIHJldHVybjsKKyAgICAgICAgICAgIGZpbmFsIENvbnRlbnRWYWx1ZXMgYyA9IG5ldyBDb250ZW50VmFsdWVzKDIpOworICAgICAgICAgICAgYy5wdXQoQ09MVU1OX0RBVEUsIHNEYXRlRm9ybWF0LmZvcm1hdChuZXcgRGF0ZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkpKTsKKyAgICAgICAgICAgIGMucHV0KENPTFVNTl9FVkVOVCwgZXZlbnQpOworICAgICAgICAgICAgZGIuaW5zZXJ0KExPR19UQUJMRV9OQU1FLCBudWxsLCBjKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgZXZlbnQsIENvbnRleHQgY29udGV4dCkgeworICAgICAgICBpZiAoIURFQlVHKSByZXR1cm47CisgICAgICAgIGZpbmFsIFNRTGl0ZURhdGFiYXNlIGwgPSBnZXRJbnN0YW5jZShjb250ZXh0KS5tRGVidWdIZWxwZXIuZ2V0V3JpdGFibGVEYXRhYmFzZSgpOworICAgICAgICBtRGVidWdIZWxwZXIuaW5zZXJ0KGwsIGV2ZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBldmVudCwgQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyKSB7CisgICAgICAgIGlmICghREVCVUcpIHJldHVybjsKKyAgICAgICAgZmluYWwgU1FMaXRlRGF0YWJhc2UgbCA9CisgICAgICAgICAgICAgICAgZ2V0SW5zdGFuY2UocHJvdmlkZXIuZ2V0Q29udGV4dCgpKS5tRGVidWdIZWxwZXIuZ2V0V3JpdGFibGVEYXRhYmFzZSgpOworICAgICAgICBtRGVidWdIZWxwZXIuaW5zZXJ0KGwsIGV2ZW50KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9Qcm9ibGVtUmVwb3J0ZXIuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL1Byb2JsZW1SZXBvcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMjgxOWEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9Qcm9ibGVtUmVwb3J0ZXIuamF2YQpAQCAtMCwwICsxLDI0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgKiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuZGljdGlvbmFyeXBhY2s7CisKKy8qKgorICogQSBzaW1wbGUgaW50ZXJmYWNlIHRvIHJlcG9ydCBwcm9ibGVtcy4KKyAqLworcHVibGljIGludGVyZmFjZSBQcm9ibGVtUmVwb3J0ZXIgeworICAgIHB1YmxpYyB2b2lkIHJlcG9ydChFeGNlcHRpb24gZSk7Cit9CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9VcGRhdGVIYW5kbGVyLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9VcGRhdGVIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ3Mjc1MAotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL1VwZGF0ZUhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDEwODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAqIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5kaWN0aW9uYXJ5cGFjazsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkRvd25sb2FkTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5Eb3dubG9hZE1hbmFnZXIuUXVlcnk7CitpbXBvcnQgYW5kcm9pZC5hcHAuRG93bmxvYWRNYW5hZ2VyLlJlcXVlc3Q7CitpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uOworaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbk1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmNvbXBhdC5Db25uZWN0aXZpdHlNYW5hZ2VyQ29tcGF0VXRpbHM7CitpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuY29tcGF0LkRvd25sb2FkTWFuYWdlckNvbXBhdFV0aWxzOworaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmxhdGluLlI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKKworLyoqCisgKiBIYW5kbGVyIGZvciB0aGUgdXBkYXRlIHByb2Nlc3MuCisgKgorICogVGhpcyBjbGFzcyBpcyBpbiBjaGFyZ2Ugb2YgY29vcmRpbmF0aW5nIHRoZSB1cGRhdGUgcHJvY2VzcyBmb3IgdGhlIHZhcmlvdXMgZGljdGlvbmFyaWVzCisgKiBzdG9yZWQgaW4gdGhlIGRpY3Rpb25hcnkgcGFjay4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFVwZGF0ZUhhbmRsZXIgeworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkRpY3Rpb25hcnlQcm92aWRlcjoiICsgVXBkYXRlSGFuZGxlci5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IERpY3Rpb25hcnlQcm92aWRlci5ERUJVRzsKKworICAgIC8vIFVzZWQgdG8gcHJldmVudCB0cnlpbmcgdG8gcmVhZCB0aGUgaWQgb2YgdGhlIGRvd25sb2FkZWQgZmlsZSBiZWZvcmUgaXQgaXMgd3JpdHRlbgorICAgIHN0YXRpYyBmaW5hbCBPYmplY3Qgc1NoYXJlZElkUHJvdGVjdG9yID0gbmV3IE9iamVjdCgpOworCisgICAgLy8gVmFsdWUgdXNlZCB0byBtZWFuIHRoaXMgaXMgbm90IGEgcmVhbCBEb3dubG9hZE1hbmFnZXIgZG93bmxvYWRlZCBmaWxlIGlkCisgICAgLy8gRG93bmxvYWRNYW5hZ2VyIHVzZXMgYXMgYW4gSUQgbnVtYmVycyByZXR1cm5lZCBvdXQgb2YgYW4gQVVUT0lOQ1JFTUVOVCBjb2x1bW4KKyAgICAvLyBpbiBTUUxpdGUsIHNvIGl0IHNob3VsZCBuZXZlciByZXR1cm4gYW55dGhpbmcgPCAwLgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PVF9BTl9JRCA9IC0xOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWElNVU1fU1VQUE9SVEVEX0ZPUk1BVF9WRVJTSU9OID0gMjsKKworICAgIC8vIEFyYml0cmFyeS4gUHJvYmFibHkgZ29vZCBpZiBpdCdzIGEgcG93ZXIgb2YgMiwgYW5kIGEgY291cGxlIHRob3VzYW5kIGJ5dGVzIGxvbmcuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJTEVfQ09QWV9CVUZGRVJfU0laRSA9IDgxOTI7CisKKyAgICAvLyBUYWJsZSBmaXhlZCB2YWx1ZXMgZm9yIG1ldGFkYXRhIC8gZG93bmxvYWRzCisgICAgZmluYWwgc3RhdGljIFN0cmluZyBNRVRBREFUQV9OQU1FID0gIm1ldGFkYXRhIjsKKyAgICBmaW5hbCBzdGF0aWMgaW50IE1FVEFEQVRBX1RZUEUgPSAwOworICAgIGZpbmFsIHN0YXRpYyBpbnQgV09SRExJU1RfVFlQRSA9IDE7CisKKyAgICAvLyBTdWZmaXggZm9yIGdlbmVyYXRlZCBkaWN0aW9uYXJ5IGZpbGVzCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJQ1RfRklMRV9TVUZGSVggPSAiLmRpY3QiOworICAgIC8vIE5hbWUgb2YgdGhlIGNhdGVnb3J5IGZvciB0aGUgbWFpbiBkaWN0aW9uYXJ5CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFJTl9ESUNUSU9OQVJZX0NBVEVHT1JZID0gIm1haW4iOworCisgICAgLy8gVGhlIGlkIGZvciB0aGUgImRpY3Rpb25hcnkgYXZhaWxhYmxlIiBub3RpZmljYXRpb24uCisgICAgc3RhdGljIGZpbmFsIGludCBESUNUX0FWQUlMQUJMRV9OT1RJRklDQVRJT05fSUQgPSAxOworCisgICAgLyoqCisgICAgICogQW4gaW50ZXJmYWNlIGZvciBVSXMgb3Igc2VydmljZXMgdGhhdCB3YW50IHRvIGtub3cgd2hlbiBzb21ldGhpbmcgaGFwcGVuZWQuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIGNoaWVmbHkgdXNlZCBieSB0aGUgZGljdGlvbmFyeSBtYW5hZ2VyIFVJLgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgVXBkYXRlRXZlbnRMaXN0ZW5lciB7CisgICAgICAgIHB1YmxpYyB2b2lkIGRvd25sb2FkZWRNZXRhZGF0YShib29sZWFuIHN1Y2NlZWRlZCk7CisgICAgICAgIHB1YmxpYyB2b2lkIHdvcmRMaXN0RG93bmxvYWRGaW5pc2hlZChTdHJpbmcgd29yZExpc3RJZCwgYm9vbGVhbiBzdWNjZWVkZWQpOworICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVDeWNsZUNvbXBsZXRlZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBsaXN0IG9mIGN1cnJlbnRseSByZWdpc3RlcmVkIGxpc3RlbmVycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFVwZGF0ZUV2ZW50TGlzdGVuZXI+IHNVcGRhdGVFdmVudExpc3RlbmVycworICAgICAgICAgICAgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRMaXN0KG5ldyBMaW5rZWRMaXN0PFVwZGF0ZUV2ZW50TGlzdGVuZXI+KCkpOworCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgYSBuZXcgbGlzdGVuZXIgdG8gYmUgbm90aWZpZWQgb2YgdXBkYXRlcy4KKyAgICAgKgorICAgICAqIERvbid0IGZvcmdldCB0byBjYWxsIHVucmVnaXN0ZXJVcGRhdGVFdmVudExpc3RlbmVyIHdoZW4gZG9uZSB3aXRoIGl0LCBvcgorICAgICAqIGl0IHdpbGwgbGVhayB0aGUgcmVnaXN0ZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyVXBkYXRlRXZlbnRMaXN0ZW5lcihmaW5hbCBVcGRhdGVFdmVudExpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIHNVcGRhdGVFdmVudExpc3RlbmVycy5hZGQobGlzdGVuZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVucmVnaXN0ZXIgYSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgbGlzdGVuZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHVucmVnaXN0ZXJVcGRhdGVFdmVudExpc3RlbmVyKGZpbmFsIFVwZGF0ZUV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgc1VwZGF0ZUV2ZW50TGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPV05MT0FEX09WRVJfTUVURVJFRF9TRVRUSU5HX1BSRUZTX0tFWSA9ICJkb3dubG9hZE92ZXJNZXRlcmVkIjsKKworICAgIC8qKgorICAgICAqIFdyaXRlIHRoZSBEb3dubG9hZE1hbmFnZXIgSUQgb2YgdGhlIGN1cnJlbnRseSBkb3dubG9hZGluZyBtZXRhZGF0YSB0byBwZXJtYW5lbnQgc3RvcmFnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IHRvIG9wZW4gc2hhcmVkIHByZWZzCisgICAgICogQHBhcmFtIHVyaSB0aGUgdXJpIG9mIHRoZSBtZXRhZGF0YQorICAgICAqIEBwYXJhbSBkb3dubG9hZElkIHRoZSBpZCByZXR1cm5lZCBieSBEb3dubG9hZE1hbmFnZXIKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlTWV0YWRhdGFEb3dubG9hZElkKGZpbmFsIENvbnRleHQgY29udGV4dCwgZmluYWwgU3RyaW5nIHVyaSwKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgZG93bmxvYWRJZCkgeworICAgICAgICBNZXRhZGF0YURiSGVscGVyLnJlZ2lzdGVyTWV0YWRhdGFEb3dubG9hZElkKGNvbnRleHQsIHVyaSwgZG93bmxvYWRJZCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRE9XTkxPQURfT1ZFUl9NRVRFUkVEX1NFVFRJTkdfVU5LTk9XTiA9IDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRE9XTkxPQURfT1ZFUl9NRVRFUkVEX0FMTE9XRUQgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERPV05MT0FEX09WRVJfTUVURVJFRF9ESVNBTExPV0VEID0gMjsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHNldHRpbmcgdGhhdCB0ZWxscyB1cyB3aGV0aGVyIHdlIG1heSBkb3dubG9hZCBvdmVyIGEgbWV0ZXJlZCBjb25uZWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXREb3dubG9hZE92ZXJNZXRlcmVkU2V0dGluZyhmaW5hbCBDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICBmaW5hbCBib29sZWFuIHNob3VsZERvd25sb2FkT3Zlck1ldGVyZWQpIHsKKyAgICAgICAgZmluYWwgU2hhcmVkUHJlZmVyZW5jZXMgcHJlZnMgPSBDb21tb25QcmVmZXJlbmNlcy5nZXRDb21tb25QcmVmZXJlbmNlcyhjb250ZXh0KTsKKyAgICAgICAgZmluYWwgU2hhcmVkUHJlZmVyZW5jZXMuRWRpdG9yIGVkaXRvciA9IHByZWZzLmVkaXQoKTsKKyAgICAgICAgZWRpdG9yLnB1dEludChET1dOTE9BRF9PVkVSX01FVEVSRURfU0VUVElOR19QUkVGU19LRVksIHNob3VsZERvd25sb2FkT3Zlck1ldGVyZWQKKyAgICAgICAgICAgICAgICA/IERPV05MT0FEX09WRVJfTUVURVJFRF9BTExPV0VEIDogRE9XTkxPQURfT1ZFUl9NRVRFUkVEX0RJU0FMTE9XRUQpOworICAgICAgICBlZGl0b3IuYXBwbHkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBzZXR0aW5nIHRoYXQgdGVsbHMgdXMgd2hldGhlciB3ZSBtYXkgZG93bmxvYWQgb3ZlciBhIG1ldGVyZWQgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIFRoaXMgcmV0dXJucyBvbmUgb2YgdGhlIGNvbnN0YW50cyBhYm92ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXREb3dubG9hZE92ZXJNZXRlcmVkU2V0dGluZyhmaW5hbCBDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgZmluYWwgU2hhcmVkUHJlZmVyZW5jZXMgcHJlZnMgPSBDb21tb25QcmVmZXJlbmNlcy5nZXRDb21tb25QcmVmZXJlbmNlcyhjb250ZXh0KTsKKyAgICAgICAgZmluYWwgaW50IHNldHRpbmcgPSBwcmVmcy5nZXRJbnQoRE9XTkxPQURfT1ZFUl9NRVRFUkVEX1NFVFRJTkdfUFJFRlNfS0VZLAorICAgICAgICAgICAgICAgIERPV05MT0FEX09WRVJfTUVURVJFRF9TRVRUSU5HX1VOS05PV04pOworICAgICAgICByZXR1cm4gc2V0dGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEb3dubG9hZCBsYXRlc3QgbWV0YWRhdGEgZnJvbSB0aGUgc2VydmVyIHRocm91Z2ggRG93bmxvYWRNYW5hZ2VyIGZvciBhbGwga25vd24gY2xpZW50cworICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IGZvciByZXRyaWV2aW5nIHJlc291cmNlcworICAgICAqIEBwYXJhbSB1cGRhdGVOb3cgV2hldGhlciB3ZSBzaG91bGQgdXBkYXRlIE5PVywgb3IgcmVzcGVjdCBiYW5kd2lkdGggcG9saWNpZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlKGZpbmFsIENvbnRleHQgY29udGV4dCwgZmluYWwgYm9vbGVhbiB1cGRhdGVOb3cpIHsKKyAgICAgICAgLy8gVE9ETzogbG9vcCB0aHJvdWdoIGFsbCBjbGllbnRzIGluc3RlYWQgb2Ygb25seSBkb2luZyB0aGUgZGVmYXVsdCBvbmUuCisgICAgICAgIGZpbmFsIFRyZWVTZXQ8U3RyaW5nPiB1cmlzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOworICAgICAgICBmaW5hbCBDdXJzb3IgY3Vyc29yID0gTWV0YWRhdGFEYkhlbHBlci5xdWVyeUNsaWVudElkcyhjb250ZXh0KTsKKyAgICAgICAgaWYgKG51bGwgPT0gY3Vyc29yKSByZXR1cm47CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoIWN1cnNvci5tb3ZlVG9GaXJzdCgpKSByZXR1cm47CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNsaWVudElkID0gY3Vyc29yLmdldFN0cmluZygwKTsKKyAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoY2xpZW50SWQpKSBjb250aW51ZTsgLy8gVGhpcyBwcm9iYWJseSBjYW4ndCBoYXBwZW4KKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWV0YWRhdGFVcmkgPQorICAgICAgICAgICAgICAgICAgICAgICAgTWV0YWRhdGFEYkhlbHBlci5nZXRNZXRhZGF0YVVyaUFzU3RyaW5nKGNvbnRleHQsIGNsaWVudElkKTsKKyAgICAgICAgICAgICAgICBQcml2YXRlTG9nLmxvZygiVXBkYXRlIGZvciBjbGllbnRJZCAiICsgVXRpbHMucyhjbGllbnRJZCksIGNvbnRleHQpOworICAgICAgICAgICAgICAgIFV0aWxzLmwoIlVwZGF0ZSBmb3IgY2xpZW50SWQiLCBjbGllbnRJZCwgIiB3aGljaCB1c2VzIFVSSSAiLCBtZXRhZGF0YVVyaSk7CisgICAgICAgICAgICAgICAgdXJpcy5hZGQobWV0YWRhdGFVcmkpOworICAgICAgICAgICAgfSB3aGlsZSAoY3Vyc29yLm1vdmVUb05leHQoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBjdXJzb3IuY2xvc2UoKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBtZXRhZGF0YVVyaSA6IHVyaXMpIHsKKyAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobWV0YWRhdGFVcmkpKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIG1ldGFkYXRhIFVSSSBpcyBlbXB0eSwgdGhhdCBtZWFucyB3ZSBzaG91bGQgbmV2ZXIgdXBkYXRlIGl0IGF0IGFsbC4KKyAgICAgICAgICAgICAgICAvLyBJdCBzaG91bGQgbm90IGJlIHBvc3NpYmxlIHRvIGNvbWUgaGVyZSB3aXRoIGEgbnVsbCBtZXRhZGF0YSBVUkksIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAvLyBpdCBzaG91bGQgaGF2ZSBiZWVuIHJlamVjdGVkIGF0IHRoZSB0aW1lIG9mIGNsaWVudCByZWdpc3RyYXRpb247IGlmIHRoZXJlCisgICAgICAgICAgICAgICAgLy8gaXMgYSBidWcgYW5kIGl0IGhhcHBlbnMgYW55d2F5LCBkb2luZyBub3RoaW5nIGlzIHRoZSByaWdodCB0aGluZyB0byBkby4KKyAgICAgICAgICAgICAgICAvLyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwge0BzZWUgRGljdGlvbmFyeVByb3ZpZGVyI2luc2VydChVcmksIENvbnRlbnRWYWx1ZXMpfS4KKyAgICAgICAgICAgICAgICB1cGRhdGVDbGllbnRzV2l0aE1ldGFkYXRhVXJpKGNvbnRleHQsIHVwZGF0ZU5vdywgbWV0YWRhdGFVcmkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRG93bmxvYWQgbGF0ZXN0IG1ldGFkYXRhIGZyb20gdGhlIHNlcnZlciB0aHJvdWdoIERvd25sb2FkTWFuYWdlciBmb3IgYWxsIHJlbGV2YW50IGNsaWVudHMKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IGZvciByZXRyaWV2aW5nIHJlc291cmNlcworICAgICAqIEBwYXJhbSB1cGRhdGVOb3cgV2hldGhlciB3ZSBzaG91bGQgdXBkYXRlIE5PVywgb3IgcmVzcGVjdCBiYW5kd2lkdGggcG9saWNpZXMKKyAgICAgKiBAcGFyYW0gbWV0YWRhdGFVcmkgVGhlIGNsaWVudCB0byB1cGRhdGUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHVwZGF0ZUNsaWVudHNXaXRoTWV0YWRhdGFVcmkoZmluYWwgQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgZmluYWwgYm9vbGVhbiB1cGRhdGVOb3csIGZpbmFsIFN0cmluZyBtZXRhZGF0YVVyaSkgeworICAgICAgICBQcml2YXRlTG9nLmxvZygiVXBkYXRlIGZvciBtZXRhZGF0YSBVUkkgIiArIFV0aWxzLnMobWV0YWRhdGFVcmkpLCBjb250ZXh0KTsKKyAgICAgICAgZmluYWwgUmVxdWVzdCBtZXRhZGF0YVJlcXVlc3QgPSBuZXcgUmVxdWVzdChVcmkucGFyc2UobWV0YWRhdGFVcmkpKTsKKyAgICAgICAgVXRpbHMubCgiUmVxdWVzdCA9IiwgbWV0YWRhdGFSZXF1ZXN0KTsKKworICAgICAgICBmaW5hbCBSZXNvdXJjZXMgcmVzID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKTsKKyAgICAgICAgLy8gQnkgZGVmYXVsdCwgZG93bmxvYWQgb3ZlciByb2FtaW5nIGlzIGFsbG93ZWQgYW5kIGFsbCBuZXR3b3JrIHR5cGVzIGFyZSBhbGxvd2VkIHRvby4KKyAgICAgICAgaWYgKCF1cGRhdGVOb3cpIHsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYWxsb3dlZE92ZXJNZXRlcmVkID0gcmVzLmdldEJvb2xlYW4oUi5ib29sLmFsbG93X292ZXJfbWV0ZXJlZCk7CisgICAgICAgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIHRvIHVwZGF0ZSBOT1csIHRoZW4gb25seSBkbyBpdCBvdmVyIG5vbi1tZXRlcmVkIGNvbm5lY3Rpb25zLgorICAgICAgICAgICAgaWYgKERvd25sb2FkTWFuYWdlckNvbXBhdFV0aWxzLmhhc1NldEFsbG93ZWRPdmVyTWV0ZXJlZCgpKSB7CisgICAgICAgICAgICAgICAgRG93bmxvYWRNYW5hZ2VyQ29tcGF0VXRpbHMuc2V0QWxsb3dlZE92ZXJNZXRlcmVkKG1ldGFkYXRhUmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRPdmVyTWV0ZXJlZCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFhbGxvd2VkT3Zlck1ldGVyZWQpIHsKKyAgICAgICAgICAgICAgICBtZXRhZGF0YVJlcXVlc3Quc2V0QWxsb3dlZE5ldHdvcmtUeXBlcyhSZXF1ZXN0Lk5FVFdPUktfV0lGSSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZXRhZGF0YVJlcXVlc3Quc2V0QWxsb3dlZE92ZXJSb2FtaW5nKHJlcy5nZXRCb29sZWFuKFIuYm9vbC5hbGxvd19vdmVyX3JvYW1pbmcpKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBib29sZWFuIG5vdGlmaWNhdGlvblZpc2libGUgPSB1cGRhdGVOb3cKKyAgICAgICAgICAgICAgICA/IHJlcy5nZXRCb29sZWFuKFIuYm9vbC5kaXNwbGF5X25vdGlmaWNhdGlvbl9mb3JfdXNlcl9yZXF1ZXN0ZWRfdXBkYXRlKQorICAgICAgICAgICAgICAgIDogcmVzLmdldEJvb2xlYW4oUi5ib29sLmRpc3BsYXlfbm90aWZpY2F0aW9uX2Zvcl9hdXRvX3VwZGF0ZSk7CisKKyAgICAgICAgbWV0YWRhdGFSZXF1ZXN0LnNldFRpdGxlKHJlcy5nZXRTdHJpbmcoUi5zdHJpbmcuZG93bmxvYWRfZGVzY3JpcHRpb24pKTsKKyAgICAgICAgbWV0YWRhdGFSZXF1ZXN0LnNldE5vdGlmaWNhdGlvblZpc2liaWxpdHkobm90aWZpY2F0aW9uVmlzaWJsZQorICAgICAgICAgICAgICAgID8gUmVxdWVzdC5WSVNJQklMSVRZX1ZJU0lCTEUgOiBSZXF1ZXN0LlZJU0lCSUxJVFlfSElEREVOKTsKKyAgICAgICAgbWV0YWRhdGFSZXF1ZXN0LnNldFZpc2libGVJbkRvd25sb2Fkc1VpKAorICAgICAgICAgICAgICAgIHJlcy5nZXRCb29sZWFuKFIuYm9vbC5tZXRhZGF0YV9kb3dubG9hZHNfdmlzaWJsZV9pbl9kb3dubG9hZF9VSSkpOworCisgICAgICAgIGZpbmFsIERvd25sb2FkTWFuYWdlciBtYW5hZ2VyID0KKyAgICAgICAgICAgICAgICAoRG93bmxvYWRNYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5ET1dOTE9BRF9TRVJWSUNFKTsKKyAgICAgICAgaWYgKG51bGwgPT0gbWFuYWdlcikgeworICAgICAgICAgICAgLy8gRG93bmxvYWQgbWFuYWdlciBpcyBub3QgaW5zdGFsbGVkIG9yIGRpc2FibGVkLgorICAgICAgICAgICAgLy8gVE9ETzogZmFsbCBiYWNrIHRvIHNlbGYtbWFuYWdlZCBkb3dubG9hZD8KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjYW5jZWxVcGRhdGVXaXRoRG93bmxvYWRNYW5hZ2VyKGNvbnRleHQsIG1ldGFkYXRhVXJpLCBtYW5hZ2VyKTsKKyAgICAgICAgZmluYWwgbG9uZyBkb3dubG9hZElkOworICAgICAgICBzeW5jaHJvbml6ZWQgKHNTaGFyZWRJZFByb3RlY3RvcikgeworICAgICAgICAgICAgZG93bmxvYWRJZCA9IG1hbmFnZXIuZW5xdWV1ZShtZXRhZGF0YVJlcXVlc3QpOworICAgICAgICAgICAgVXRpbHMubCgiTWV0YWRhdGEgZG93bmxvYWQgcmVxdWVzdGVkIHdpdGggaWQiLCBkb3dubG9hZElkKTsKKyAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGFscmVhZHkgYSBkb3dubG9hZCBpbiBwcm9ncmVzcywgaXQncyBiZWVuIHRoZXJlIGZvciBhIHdoaWxlIGFuZAorICAgICAgICAgICAgLy8gdGhlcmUgaXMgcHJvYmFibHkgc29tZXRoaW5nIHdyb25nIHdpdGggZG93bmxvYWQgbWFuYWdlci4gSXQncyBiZXN0IHRvIGp1c3QKKyAgICAgICAgICAgIC8vIG92ZXJ3cml0ZSB0aGUgaWQgYW5kIHJlcXVlc3QgaXQgYWdhaW4uIElmIHRoZSBvbGQgb25lIGhhcHBlbnMgdG8gZmluaXNoCisgICAgICAgICAgICAvLyBhbnl3YXksIHdlIGRvbid0IGtub3cgYWJvdXQgaXRzIElEIGFueSBtb3JlLCBzbyB0aGUgZG93bmxvYWRGaW5pc2hlZAorICAgICAgICAgICAgLy8gbWV0aG9kIHdpbGwgaWdub3JlIGl0LgorICAgICAgICAgICAgd3JpdGVNZXRhZGF0YURvd25sb2FkSWQoY29udGV4dCwgbWV0YWRhdGFVcmksIGRvd25sb2FkSWQpOworICAgICAgICB9CisgICAgICAgIFByaXZhdGVMb2cubG9nKCJSZXF1ZXN0ZWQgZG93bmxvYWQgd2l0aCBpZCAiICsgZG93bmxvYWRJZCwgY29udGV4dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FuY2VscyBhIHBlbmRpbmcgdXBkYXRlLCBpZiB0aGVyZSBpcyBvbmUuCisgICAgICoKKyAgICAgKiBJZiBub25lLCB0aGlzIGlzIGEgbm8tb3AuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dCB0byBvcGVuIHRoZSBkYXRhYmFzZSBvbgorICAgICAqIEBwYXJhbSBjbGllbnRJZCB0aGUgaWQgb2YgdGhlIGNsaWVudAorICAgICAqIEBwYXJhbSBtYW5hZ2VyIGFuIGluc3RhbmNlIG9mIERvd25sb2FkTWFuYWdlcgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2FuY2VsVXBkYXRlV2l0aERvd25sb2FkTWFuYWdlcihmaW5hbCBDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2xpZW50SWQsIGZpbmFsIERvd25sb2FkTWFuYWdlciBtYW5hZ2VyKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAoc1NoYXJlZElkUHJvdGVjdG9yKSB7CisgICAgICAgICAgICBmaW5hbCBsb25nIG1ldGFkYXRhRG93bmxvYWRJZCA9CisgICAgICAgICAgICAgICAgICAgIE1ldGFkYXRhRGJIZWxwZXIuZ2V0TWV0YWRhdGFEb3dubG9hZElkRm9yQ2xpZW50KGNvbnRleHQsIGNsaWVudElkKTsKKyAgICAgICAgICAgIGlmIChOT1RfQU5fSUQgPT0gbWV0YWRhdGFEb3dubG9hZElkKSByZXR1cm47CisgICAgICAgICAgICBtYW5hZ2VyLnJlbW92ZShtZXRhZGF0YURvd25sb2FkSWQpOworICAgICAgICAgICAgd3JpdGVNZXRhZGF0YURvd25sb2FkSWQoY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgTWV0YWRhdGFEYkhlbHBlci5nZXRNZXRhZGF0YVVyaUFzU3RyaW5nKGNvbnRleHQsIGNsaWVudElkKSwgTk9UX0FOX0lEKTsKKyAgICAgICAgfQorICAgICAgICAvLyBDb25zaWRlciBhIGNhbmNlbGxhdGlvbiBhcyBhIGZhaWx1cmUuIEFzIHN1Y2gsIGluZm9ybSBsaXN0ZW5lcnMgdGhhdCB0aGUgZG93bmxvYWQKKyAgICAgICAgLy8gaGFzIGZhaWxlZC4KKyAgICAgICAgZm9yIChVcGRhdGVFdmVudExpc3RlbmVyIGxpc3RlbmVyIDogbGlua2VkQ29weU9mTGlzdChzVXBkYXRlRXZlbnRMaXN0ZW5lcnMpKSB7CisgICAgICAgICAgICBsaXN0ZW5lci5kb3dubG9hZGVkTWV0YWRhdGEoZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FuY2VscyBhIHBlbmRpbmcgdXBkYXRlLCBpZiB0aGVyZSBpcyBvbmUuCisgICAgICoKKyAgICAgKiBJZiB0aGVyZSBpcyBub25lLCB0aGlzIGlzIGEgbm8tb3AuIFRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kIHRoYXQgZ2V0cyB0aGUKKyAgICAgKiBkb3dubG9hZCBtYW5hZ2VyIHNlcnZpY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dCwgdG8gZ2V0IGFuIGluc3RhbmNlIG9mIERvd25sb2FkTWFuYWdlcgorICAgICAqIEBwYXJhbSBjbGllbnRJZCB0aGUgSUQgb2YgdGhlIGNsaWVudCB3ZSB3YW50IHRvIGNhbmNlbCB0aGUgdXBkYXRlIG9mCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNhbmNlbFVwZGF0ZShmaW5hbCBDb250ZXh0IGNvbnRleHQsIGZpbmFsIFN0cmluZyBjbGllbnRJZCkgeworICAgICAgICBmaW5hbCBEb3dubG9hZE1hbmFnZXIgbWFuYWdlciA9CisgICAgICAgICAgICAgICAgICAgIChEb3dubG9hZE1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkRPV05MT0FEX1NFUlZJQ0UpOworICAgICAgICBpZiAobnVsbCAhPSBtYW5hZ2VyKSBjYW5jZWxVcGRhdGVXaXRoRG93bmxvYWRNYW5hZ2VyKGNvbnRleHQsIGNsaWVudElkLCBtYW5hZ2VyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgYSBkb3dubG9hZCByZXF1ZXN0IGFuZCBmbGFncyBpdCBhcyBkb3dubG9hZGluZyBpbiB0aGUgbWV0YWRhdGEgdGFibGUuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIGEgaGVscGVyIG1ldGhvZCB0aGF0IGV4aXN0cyB0byBhdm9pZCByYWNlIGNvbmRpdGlvbnMgd2hlcmUgRG93bmxvYWRNYW5hZ2VyIG1pZ2h0CisgICAgICogZmluaXNoIGRvd25sb2FkaW5nIHRoZSBmaWxlIGJlZm9yZSB0aGUgZGF0YSBpcyBjb21taXR0ZWQgdG8gdGhlIGRhdGFiYXNlLgorICAgICAqIEl0IHJlZ2lzdGVycyB0aGUgcmVxdWVzdCB3aXRoIHRoZSBEb3dubG9hZE1hbmFnZXIgc2VydmljZSBhbmQgYWxzbyB1cGRhdGVzIHRoZSBtZXRhZGF0YQorICAgICAqIGRhdGFiYXNlIGRpcmVjdGx5IHdpdGhpbiBhIHN5bmNocm9uaXplZCBzZWN0aW9uLgorICAgICAqIFRoaXMgbWV0aG9kIGhhcyBubyBpbnRlbGxpZ2VuY2UgYWJvdXQgdGhlIGRhdGEgaXQgY29tbWl0cyB0byB0aGUgZGF0YWJhc2UgYXNpZGUgZnJvbSB0aGUKKyAgICAgKiBkb3dubG9hZCByZXF1ZXN0IGlkLCB3aGljaCBpcyBub3Qga25vd24gYmVmb3JlIHN1Ym1pdHRpbmcgdGhlIHJlcXVlc3QgdG8gdGhlIGRvd25sb2FkCisgICAgICogbWFuYWdlci4gSGVuY2UsIGl0IG9ubHkgdXBkYXRlcyB0aGUgcmVsZXZhbnQgbGluZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYW5hZ2VyIHRoZSBkb3dubG9hZCBtYW5hZ2VyIHNlcnZpY2UgdG8gcmVnaXN0ZXIgdGhlIHJlcXVlc3Qgd2l0aC4KKyAgICAgKiBAcGFyYW0gcmVxdWVzdCB0aGUgcmVxdWVzdCB0byByZWdpc3Rlci4KKyAgICAgKiBAcGFyYW0gZGIgdGhlIG1ldGFkYXRhIGRhdGFiYXNlLgorICAgICAqIEBwYXJhbSBpZCB0aGUgaWQgb2YgdGhlIHdvcmQgbGlzdC4KKyAgICAgKiBAcGFyYW0gdmVyc2lvbiB0aGUgdmVyc2lvbiBvZiB0aGUgd29yZCBsaXN0LgorICAgICAqIEByZXR1cm4gdGhlIGRvd25sb2FkIGlkIHJldHVybmVkIGJ5IHRoZSBkb3dubG9hZCBtYW5hZ2VyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgbG9uZyByZWdpc3RlckRvd25sb2FkUmVxdWVzdChmaW5hbCBEb3dubG9hZE1hbmFnZXIgbWFuYWdlciwgZmluYWwgUmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIsIGZpbmFsIFN0cmluZyBpZCwgZmluYWwgaW50IHZlcnNpb24pIHsKKyAgICAgICAgVXRpbHMubCgiUmVnaXN0ZXJEb3dubG9hZFJlcXVlc3QgZm9yIHdvcmQgbGlzdCBpZCA6ICIsIGlkLCAiLCB2ZXJzaW9uICIsIHZlcnNpb24pOworICAgICAgICBmaW5hbCBsb25nIGRvd25sb2FkSWQ7CisgICAgICAgIHN5bmNocm9uaXplZCAoc1NoYXJlZElkUHJvdGVjdG9yKSB7CisgICAgICAgICAgICBkb3dubG9hZElkID0gbWFuYWdlci5lbnF1ZXVlKHJlcXVlc3QpOworICAgICAgICAgICAgVXRpbHMubCgiRG93bmxvYWQgcmVxdWVzdGVkIHdpdGggaWQiLCBkb3dubG9hZElkKTsKKyAgICAgICAgICAgIE1ldGFkYXRhRGJIZWxwZXIubWFya0VudHJ5QXNEb3dubG9hZGluZyhkYiwgaWQsIHZlcnNpb24sIGRvd25sb2FkSWQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkb3dubG9hZElkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IGEgc3BlY2lmaWMgZG93bmxvYWQgZnJvbSBEb3dubG9hZE1hbmFnZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQ29tcGxldGVkRG93bmxvYWRJbmZvIGdldENvbXBsZXRlZERvd25sb2FkSW5mbyhmaW5hbCBEb3dubG9hZE1hbmFnZXIgbWFuYWdlciwKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgZG93bmxvYWRJZCkgeworICAgICAgICBmaW5hbCBRdWVyeSBxdWVyeSA9IG5ldyBRdWVyeSgpLnNldEZpbHRlckJ5SWQoZG93bmxvYWRJZCk7CisgICAgICAgIGZpbmFsIEN1cnNvciBjdXJzb3IgPSBtYW5hZ2VyLnF1ZXJ5KHF1ZXJ5KTsKKworICAgICAgICBpZiAobnVsbCA9PSBjdXJzb3IpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxldGVkRG93bmxvYWRJbmZvKG51bGwsIGRvd25sb2FkSWQsIERvd25sb2FkTWFuYWdlci5TVEFUVVNfRkFJTEVEKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHVyaTsKKyAgICAgICAgICAgIGZpbmFsIGludCBzdGF0dXM7CisgICAgICAgICAgICBpZiAoY3Vyc29yLm1vdmVUb05leHQoKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb2x1bW5TdGF0dXMgPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXgoRG93bmxvYWRNYW5hZ2VyLkNPTFVNTl9TVEFUVVMpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb2x1bW5FcnJvciA9IGN1cnNvci5nZXRDb2x1bW5JbmRleChEb3dubG9hZE1hbmFnZXIuQ09MVU1OX1JFQVNPTik7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGNvbHVtblVyaSA9IGN1cnNvci5nZXRDb2x1bW5JbmRleChEb3dubG9hZE1hbmFnZXIuQ09MVU1OX1VSSSk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGVycm9yID0gY3Vyc29yLmdldEludChjb2x1bW5FcnJvcik7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gY3Vyc29yLmdldEludChjb2x1bW5TdGF0dXMpOworICAgICAgICAgICAgICAgIHVyaSA9IGN1cnNvci5nZXRTdHJpbmcoY29sdW1uVXJpKTsKKyAgICAgICAgICAgICAgICBpZiAoRG93bmxvYWRNYW5hZ2VyLlNUQVRVU19TVUNDRVNTRlVMICE9IHN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJQZXJtYW5lbnQgZmFpbHVyZSBvZiBkb3dubG9hZCAiICsgZG93bmxvYWRJZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB3aXRoIGVycm9yIGNvZGU6ICIgKyBlcnJvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1cmkgPSBudWxsOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IERvd25sb2FkTWFuYWdlci5TVEFUVVNfRkFJTEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV0ZWREb3dubG9hZEluZm8odXJpLCBkb3dubG9hZElkLCBzdGF0dXMpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgY3Vyc29yLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBBcnJheUxpc3Q8RG93bmxvYWRSZWNvcmQ+IGdldERvd25sb2FkUmVjb3Jkc0ZvckNvbXBsZXRlZERvd25sb2FkSW5mbygKKyAgICAgICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCwgZmluYWwgQ29tcGxldGVkRG93bmxvYWRJbmZvIGRvd25sb2FkSW5mbykgeworICAgICAgICAvLyBHZXQgYW5kIGNoZWNrIHRoZSBJRCBvZiB0aGUgZmlsZSB3ZSBhcmUgd2FpdGluZyBmb3IsIGNvbXBhcmUgdGhlbSB0byBkb3dubG9hZGVkIG9uZXMKKyAgICAgICAgc3luY2hyb25pemVkKHNTaGFyZWRJZFByb3RlY3RvcikgeworICAgICAgICAgICAgZmluYWwgQXJyYXlMaXN0PERvd25sb2FkUmVjb3JkPiBkb3dubG9hZFJlY29yZHMgPQorICAgICAgICAgICAgICAgICAgICBNZXRhZGF0YURiSGVscGVyLmdldERvd25sb2FkUmVjb3Jkc0ZvckRvd25sb2FkSWQoY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZEluZm8ubURvd25sb2FkSWQpOworICAgICAgICAgICAgLy8gSWYgYW55IG9mIHRoZXNlIGlzIG1ldGFkYXRhLCB3ZSBzaG91bGQgdXBkYXRlIHRoZSBEQgorICAgICAgICAgICAgYm9vbGVhbiBoYXNNZXRhZGF0YSA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChEb3dubG9hZFJlY29yZCByZWNvcmQgOiBkb3dubG9hZFJlY29yZHMpIHsKKyAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSByZWNvcmQubUF0dHJpYnV0ZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgaGFzTWV0YWRhdGEgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaGFzTWV0YWRhdGEpIHsKKyAgICAgICAgICAgICAgICB3cml0ZU1ldGFkYXRhRG93bmxvYWRJZChjb250ZXh0LCBkb3dubG9hZEluZm8ubVVyaSwgTk9UX0FOX0lEKTsKKyAgICAgICAgICAgICAgICBNZXRhZGF0YURiSGVscGVyLnNhdmVMYXN0VXBkYXRlVGltZU9mVXJpKGNvbnRleHQsIGRvd25sb2FkSW5mby5tVXJpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBkb3dubG9hZFJlY29yZHM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUYWtlIGFwcHJvcHJpYXRlIGFjdGlvbiBhZnRlciBhIGRvd25sb2FkIGZpbmlzaGVkLCBpbiBzdWNjZXNzIG9yIGluIGVycm9yLgorICAgICAqCisgICAgICogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIHN5c3RlbSB1cG9uIGJyb2FkY2FzdCBmcm9tIHRoZSBEb3dubG9hZE1hbmFnZXIgdGhhdCBhIGZpbGUKKyAgICAgKiBoYXMgYmVlbiBkb3dubG9hZGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiBBZnRlciBhIHNpbXBsZSBjaGVjayB0aGF0IHRoaXMgaXMgYWN0dWFsbHkgdGhlIGZpbGUgd2UgYXJlIHdhaXRpbmcgZm9yLCB0aGlzCisgICAgICogbWV0aG9kIGJhc2ljYWxseSBjb29yZGluYXRlcyB0aGUgcGFyc2luZyBhbmQgY29tcGFyaXNvbiBvZiBtZXRhZGF0YSwgYW5kIGZpcmVzCisgICAgICogdGhlIGNvbXB1dGF0aW9uIG9mIHRoZSBsaXN0IG9mIGFjdGlvbnMgdGhhdCBzaG91bGQgYmUgdGFrZW4gdGhlbiBleGVjdXRlcyB0aGVtLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgZm9yIHRoaXMgYWN0aW9uLgorICAgICAqIEBwYXJhbSBpbnRlbnQgVGhlIGludGVudCBmcm9tIHRoZSBEb3dubG9hZE1hbmFnZXIgY29udGFpbmluZyBkZXRhaWxzIGFib3V0IHRoZSBkb3dubG9hZC4KKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyB2b2lkIGRvd25sb2FkRmluaXNoZWQoZmluYWwgQ29udGV4dCBjb250ZXh0LCBmaW5hbCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIC8vIEdldCBhbmQgY2hlY2sgdGhlIElEIG9mIHRoZSBmaWxlIHRoYXQgd2FzIGRvd25sb2FkZWQKKyAgICAgICAgZmluYWwgbG9uZyBmaWxlSWQgPSBpbnRlbnQuZ2V0TG9uZ0V4dHJhKERvd25sb2FkTWFuYWdlci5FWFRSQV9ET1dOTE9BRF9JRCwgTk9UX0FOX0lEKTsKKyAgICAgICAgUHJpdmF0ZUxvZy5sb2coIkRvd25sb2FkIGZpbmlzaGVkIHdpdGggaWQgIiArIGZpbGVJZCwgY29udGV4dCk7CisgICAgICAgIFV0aWxzLmwoIkRvd25sb2FkRmluaXNoZWQgd2l0aCBpZCIsIGZpbGVJZCk7CisgICAgICAgIGlmIChOT1RfQU5fSUQgPT0gZmlsZUlkKSByZXR1cm47IC8vIFNwdXJpb3VzIHdha2UtdXA6IGlnbm9yZQorCisgICAgICAgIGZpbmFsIERvd25sb2FkTWFuYWdlciBtYW5hZ2VyID0KKyAgICAgICAgICAgICAgICAoRG93bmxvYWRNYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5ET1dOTE9BRF9TRVJWSUNFKTsKKyAgICAgICAgZmluYWwgQ29tcGxldGVkRG93bmxvYWRJbmZvIGRvd25sb2FkSW5mbyA9IGdldENvbXBsZXRlZERvd25sb2FkSW5mbyhtYW5hZ2VyLCBmaWxlSWQpOworCisgICAgICAgIGZpbmFsIEFycmF5TGlzdDxEb3dubG9hZFJlY29yZD4gcmVjb3JkTGlzdCA9CisgICAgICAgICAgICAgICAgZ2V0RG93bmxvYWRSZWNvcmRzRm9yQ29tcGxldGVkRG93bmxvYWRJbmZvKGNvbnRleHQsIGRvd25sb2FkSW5mbyk7CisgICAgICAgIGlmIChudWxsID09IHJlY29yZExpc3QpIHJldHVybjsgLy8gSXQgd2FzIHNvbWVvbmUgZWxzZSdzIGRvd25sb2FkLgorICAgICAgICBVdGlscy5sKCJSZWNlaXZlZCByZXN1bHQgZm9yIGRvd25sb2FkICIsIGZpbGVJZCk7CisKKyAgICAgICAgLy8gVE9ETzogaGFuZGxlIGdyYWNlZnVsbHkgYSBudWxsIHBvaW50ZXIgaGVyZS4gVGhpcyBpcyBwcmFjdGljYWxseSBpbXBvc3NpYmxlIGJlY2F1c2UKKyAgICAgICAgLy8gd2UgY29tZSBoZXJlIG9ubHkgd2hlbiBEb3dubG9hZE1hbmFnZXIgZXhwbGljaXRseSBjYWxsZWQgdXMgd2hlbiBpdCBlbmRlZCBhCisgICAgICAgIC8vIGRvd25sb2FkLCBzbyB3ZSBhcmUgcHJldHR5IHN1cmUgaXQncyBhbGl2ZS4gSXQncyB0aGVvcmV0aWNhbGx5IHBvc3NpYmxlIHRoYXQgaXQncworICAgICAgICAvLyBkaXNhYmxlZCByaWdodCBpbmJldHdlZW4gdGhlIGZpcmluZyBvZiB0aGUgaW50ZW50IGFuZCB0aGUgY29udHJvbCByZWFjaGluZyBoZXJlLgorCisgICAgICAgIGZvciAoZmluYWwgRG93bmxvYWRSZWNvcmQgcmVjb3JkIDogcmVjb3JkTGlzdCkgeworICAgICAgICAgICAgLy8gZG93bmxvYWRTdWNjZXNzZnVsIGlzIG5vdCBmaW5hbCBiZWNhdXNlIHdlIG1heSBzdGlsbCBoYXZlIGV4Y2VwdGlvbnMgZnJvbSBub3cgb24KKyAgICAgICAgICAgIGJvb2xlYW4gZG93bmxvYWRTdWNjZXNzZnVsID0gZmFsc2U7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChkb3dubG9hZEluZm8ud2FzU3VjY2Vzc2Z1bCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkU3VjY2Vzc2Z1bCA9IGhhbmRsZURvd25sb2FkZWRGaWxlKGNvbnRleHQsIHJlY29yZCwgbWFuYWdlciwgZmlsZUlkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChyZWNvcmQuaXNNZXRhZGF0YSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hVcGRhdGVNZXRhZGF0YUNvbXBsZXRlZChjb250ZXh0LCBkb3dubG9hZFN1Y2Nlc3NmdWwpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiID0gTWV0YWRhdGFEYkhlbHBlci5nZXREYihjb250ZXh0LCByZWNvcmQubUNsaWVudElkKTsKKyAgICAgICAgICAgICAgICAgICAgcHVibGlzaFVwZGF0ZVdvcmRMaXN0Q29tcGxldGVkKGNvbnRleHQsIGRvd25sb2FkU3VjY2Vzc2Z1bCwgZmlsZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiLCByZWNvcmQubUF0dHJpYnV0ZXMsIHJlY29yZC5tQ2xpZW50SWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBOb3cgdGhhdCB3ZSdyZSBkb25lIHVzaW5nIGl0LCB3ZSBjYW4gcmVtb3ZlIHRoaXMgZG93bmxvYWQgZnJvbSBETE1hbmFnZXIKKyAgICAgICAgbWFuYWdlci5yZW1vdmUoZmlsZUlkKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHB1Ymxpc2hVcGRhdGVNZXRhZGF0YUNvbXBsZXRlZChmaW5hbCBDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGRvd25sb2FkU3VjY2Vzc2Z1bCkgeworICAgICAgICAvLyBXZSBuZWVkIHRvIHdhcm4gYWxsIGxpc3RlbmVycyBvZiB3aGF0IGhhcHBlbmVkLiBCdXQgc29tZSBsaXN0ZW5lcnMgbWF5IHdhbnQgdG8KKyAgICAgICAgLy8gcmVtb3ZlIHRoZW1zZWx2ZXMgb3IgcmUtcmVnaXN0ZXIgc29tZXRoaW5nIGluIHJlc3BvbnNlLiBIZW5jZSB3ZSBzaG91bGQgdGFrZSBhCisgICAgICAgIC8vIHNuYXBzaG90IG9mIHRoZSBsaXN0ZW5lciBsaXN0IGFuZCB3YXJuIHRoZW0gYWxsLiBUaGlzIGFsc28gcHJldmVudHMgYW55CisgICAgICAgIC8vIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIHByb2JsZW0gb2YgdGhlIHN0YXRpYyBsaXN0LgorICAgICAgICBmb3IgKFVwZGF0ZUV2ZW50TGlzdGVuZXIgbGlzdGVuZXIgOiBsaW5rZWRDb3B5T2ZMaXN0KHNVcGRhdGVFdmVudExpc3RlbmVycykpIHsKKyAgICAgICAgICAgIGxpc3RlbmVyLmRvd25sb2FkZWRNZXRhZGF0YShkb3dubG9hZFN1Y2Nlc3NmdWwpOworICAgICAgICB9CisgICAgICAgIHB1Ymxpc2hVcGRhdGVDeWNsZUNvbXBsZXRlZEV2ZW50KGNvbnRleHQpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHVibGlzaFVwZGF0ZVdvcmRMaXN0Q29tcGxldGVkKGZpbmFsIENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gZG93bmxvYWRTdWNjZXNzZnVsLCBmaW5hbCBsb25nIGZpbGVJZCwKKyAgICAgICAgICAgIGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiLCBmaW5hbCBDb250ZW50VmFsdWVzIGRvd25sb2FkZWRGaWxlUmVjb3JkLAorICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNsaWVudElkKSB7CisgICAgICAgIHN5bmNocm9uaXplZChzU2hhcmVkSWRQcm90ZWN0b3IpIHsKKyAgICAgICAgICAgIGlmIChkb3dubG9hZFN1Y2Nlc3NmdWwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBBY3Rpb25CYXRjaCBhY3Rpb25zID0gbmV3IEFjdGlvbkJhdGNoKCk7CisgICAgICAgICAgICAgICAgYWN0aW9ucy5hZGQobmV3IEFjdGlvbkJhdGNoLkluc3RhbGxBZnRlckRvd25sb2FkQWN0aW9uKGNsaWVudElkLAorICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRlZEZpbGVSZWNvcmQpKTsKKyAgICAgICAgICAgICAgICBhY3Rpb25zLmV4ZWN1dGUoY29udGV4dCwgbmV3IExvZ1Byb2JsZW1SZXBvcnRlcihUQUcpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTWV0YWRhdGFEYkhlbHBlci5kZWxldGVEb3dubG9hZGluZ0VudHJ5KGRiLCBmaWxlSWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIFNlZSBjb21tZW50IGFib3ZlIGFib3V0ICNsaW5rZWRDb3B5T2ZMaXN0cworICAgICAgICBmb3IgKFVwZGF0ZUV2ZW50TGlzdGVuZXIgbGlzdGVuZXIgOiBsaW5rZWRDb3B5T2ZMaXN0KHNVcGRhdGVFdmVudExpc3RlbmVycykpIHsKKyAgICAgICAgICAgIGxpc3RlbmVyLndvcmRMaXN0RG93bmxvYWRGaW5pc2hlZChkb3dubG9hZGVkRmlsZVJlY29yZC5nZXRBc1N0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhZGF0YURiSGVscGVyLldPUkRMSVNUSURfQ09MVU1OKSwgZG93bmxvYWRTdWNjZXNzZnVsKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaXNoVXBkYXRlQ3ljbGVDb21wbGV0ZWRFdmVudChjb250ZXh0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHB1Ymxpc2hVcGRhdGVDeWNsZUNvbXBsZXRlZEV2ZW50KGZpbmFsIENvbnRleHQgY29udGV4dCkgeworICAgICAgICAvLyBFdmVuIGlmIHRoaXMgaXMgbm90IHN1Y2Nlc3NmdWwsIHdlIGhhdmUgdG8gcHVibGlzaCB0aGUgbmV3IHN0YXRlLgorICAgICAgICBQcml2YXRlTG9nLmxvZygiUHVibGlzaGluZyB1cGRhdGUgY3ljbGUgY29tcGxldGVkIGV2ZW50IiwgY29udGV4dCk7CisgICAgICAgIFV0aWxzLmwoIlB1Ymxpc2hpbmcgdXBkYXRlIGN5Y2xlIGNvbXBsZXRlZCBldmVudCIpOworICAgICAgICBmb3IgKFVwZGF0ZUV2ZW50TGlzdGVuZXIgbGlzdGVuZXIgOiBsaW5rZWRDb3B5T2ZMaXN0KHNVcGRhdGVFdmVudExpc3RlbmVycykpIHsKKyAgICAgICAgICAgIGxpc3RlbmVyLnVwZGF0ZUN5Y2xlQ29tcGxldGVkKCk7CisgICAgICAgIH0KKyAgICAgICAgc2lnbmFsTmV3RGljdGlvbmFyeVN0YXRlKGNvbnRleHQpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGFuZGxlRG93bmxvYWRlZEZpbGUoZmluYWwgQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgZmluYWwgRG93bmxvYWRSZWNvcmQgZG93bmxvYWRSZWNvcmQsIGZpbmFsIERvd25sb2FkTWFuYWdlciBtYW5hZ2VyLAorICAgICAgICAgICAgZmluYWwgbG9uZyBmaWxlSWQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIHtAbGluayBoYW5kbGVXb3JkTGlzdChDb250ZXh0LElucHV0U3RyZWFtLENvbnRlbnRWYWx1ZXMpfS4KKyAgICAgICAgICAgIC8vIEhhbmRsZSB0aGUgZG93bmxvYWRlZCBmaWxlIGFjY29yZGluZyB0byBpdHMgdHlwZQorICAgICAgICAgICAgaWYgKGRvd25sb2FkUmVjb3JkLmlzTWV0YWRhdGEoKSkgeworICAgICAgICAgICAgICAgIFV0aWxzLmwoIkRhdGEgRC9MJ2QgaXMgbWV0YWRhdGEgZm9yIiwgZG93bmxvYWRSZWNvcmQubUNsaWVudElkKTsKKyAgICAgICAgICAgICAgICAvLyAjaGFuZGxlTWV0YWRhdGEoKSBjbG9zZXMgaXRzIElucHV0U3RyZWFtIGFyZ3VtZW50CisgICAgICAgICAgICAgICAgaGFuZGxlTWV0YWRhdGEoY29udGV4dCwgbmV3IFBhcmNlbEZpbGVEZXNjcmlwdG9yLkF1dG9DbG9zZUlucHV0U3RyZWFtKAorICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlci5vcGVuRG93bmxvYWRlZEZpbGUoZmlsZUlkKSksIGRvd25sb2FkUmVjb3JkLm1DbGllbnRJZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFV0aWxzLmwoIkRhdGEgRC9MJ2QgaXMgYSB3b3JkIGxpc3QiKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgd29yZExpc3RTdGF0dXMgPSBkb3dubG9hZFJlY29yZC5tQXR0cmlidXRlcy5nZXRBc0ludGVnZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBNZXRhZGF0YURiSGVscGVyLlNUQVRVU19DT0xVTU4pOworICAgICAgICAgICAgICAgIGlmIChNZXRhZGF0YURiSGVscGVyLlNUQVRVU19ET1dOTE9BRElORyA9PSB3b3JkTGlzdFN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICAvLyAjaGFuZGxlV29yZExpc3QoKSBjbG9zZXMgaXRzIElucHV0U3RyZWFtIGFyZ3VtZW50CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZVdvcmRMaXN0KGNvbnRleHQsIG5ldyBQYXJjZWxGaWxlRGVzY3JpcHRvci5BdXRvQ2xvc2VJbnB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLm9wZW5Eb3dubG9hZGVkRmlsZShmaWxlSWQpKSwgZG93bmxvYWRSZWNvcmQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlNwdXJpb3VzIGRvd25sb2FkIGVuZGVkLiBNYXliZSBhIGNhbmNlbGxlZCBkb3dubG9hZD8iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkEgZmlsZSB3YXMgZG93bmxvYWRlZCBidXQgaXQgY2FuJ3QgYmUgb3BlbmVkIiwgZSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIENhbid0IHJlYWQgdGhlIGZpbGUuLi4gZGlzayBkYW1hZ2U/CisgICAgICAgICAgICBMb2cuZShUQUcsICJDYW4ndCByZWFkIGEgZmlsZSIsIGUpOworICAgICAgICAgICAgLy8gVE9ETzogQ2hlY2sgd2l0aCBVWCBob3cgd2Ugc2hvdWxkIHdhcm4gdGhlIHVzZXIuCisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBUaGUgZm9ybWF0IG9mIHRoZSBkb3dubG9hZGVkIGZpbGUgaXMgaW5jb3JyZWN0LiBXZSBzaG91bGQgbWF5YmUgcmVwb3J0IHVwc3RyZWFtPworICAgICAgICAgICAgTG9nLmUoVEFHLCAiSW5jb3JyZWN0IGRhdGEgcmVjZWl2ZWQiLCBlKTsKKyAgICAgICAgfSBjYXRjaCAoQmFkRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIFRoZSBmb3JtYXQgb2YgdGhlIGRvd25sb2FkZWQgZmlsZSBpcyBpbmNvcnJlY3QuIFdlIHNob3VsZCBtYXliZSByZXBvcnQgdXBzdHJlYW0/CisgICAgICAgICAgICBMb2cuZShUQUcsICJJbmNvcnJlY3QgZGF0YSByZWNlaXZlZCIsIGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGUgc3BlY2lmaWVkIGxpc3QsIHdpdGggYWxsIGVsZW1lbnRzIGNvcGllZC4KKyAgICAgKgorICAgICAqIFRoaXMgcmV0dXJucyBhIGxpbmtlZCBsaXN0LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIDxUPiBMaXN0PFQ+IGxpbmtlZENvcHlPZkxpc3QoZmluYWwgTGlzdDxUPiBzcmMpIHsKKyAgICAgICAgLy8gSW5zdGFudGlhdGlvbiBvZiBhIHBhcmFtZXRlcml6ZWQgdHlwZSBpcyBub3QgcG9zc2libGUgaW4gSmF2YSwgc28gaXQncyBub3QgcG9zc2libGUgdG8KKyAgICAgICAgLy8gcmV0dXJuIHRoZSBzYW1lIHR5cGUgb2YgbGlzdCB0aGF0IHdhcyBwYXNzZWQgLSBwcm9iYWJseSB0aGUgc2FtZSByZWFzb24gd2h5IENvbGxlY3Rpb25zCisgICAgICAgIC8vIGRvZXMgbm90IGRvIGl0LiBTbyB3ZSBuZWVkIHRvIGRlY2lkZSBzdGF0aWNhbGx5IHdoaWNoIGNvbmNyZXRlIHR5cGUgdG8gcmV0dXJuLgorICAgICAgICByZXR1cm4gbmV3IExpbmtlZExpc3Q8VD4oc3JjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXYXJuIEFuZHJvaWQgS2V5Ym9hcmQgdGhhdCB0aGUgc3RhdGUgb2YgZGljdGlvbmFyaWVzIGNoYW5nZWQgYW5kIGl0IHNob3VsZCByZWZyZXNoIGl0cyBkYXRhLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2lnbmFsTmV3RGljdGlvbmFyeVN0YXRlKGZpbmFsIENvbnRleHQgY29udGV4dCkgeworICAgICAgICBmaW5hbCBJbnRlbnQgbmV3RGljdEJyb2FkY2FzdCA9CisgICAgICAgICAgICAgICAgbmV3IEludGVudChEaWN0aW9uYXJ5UGFja0NvbnN0YW50cy5ORVdfRElDVElPTkFSWV9JTlRFTlRfQUNUSU9OKTsKKyAgICAgICAgY29udGV4dC5zZW5kQnJvYWRjYXN0KG5ld0RpY3RCcm9hZGNhc3QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIG1ldGFkYXRhIGFuZCB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbiAodGhhdCBpcywgdXBncmFkZSBkaWN0aW9uYXJpZXMpLgorICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0IHRvIHJlYWQgc2V0dGluZ3MuCisgICAgICogQHBhcmFtIHN0cmVhbSBhbiBpbnB1dCBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIGRvd25sb2FkZWQgZGF0YS4gTWF5IG5vdCBiZSBudWxsLgorICAgICAqICBXaWxsIGJlIGNsb3NlZCB1cG9uIGZpbmlzaGluZy4KKyAgICAgKiBAcGFyYW0gY2xpZW50SWQgdGhlIElEIG9mIHRoZSBjbGllbnQgdG8gdXBkYXRlCisgICAgICogQHRocm93cyBCYWRGb3JtYXRFeGNlcHRpb24gaWYgdGhlIG1ldGFkYXRhIGlzIG5vdCBpbiBhIGtub3duIGZvcm1hdC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBkb3dubG9hZGVkIGZpbGUgY2FuJ3QgYmUgcmVhZCBmcm9tIHRoZSBkaXNrCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBoYW5kbGVNZXRhZGF0YShmaW5hbCBDb250ZXh0IGNvbnRleHQsIGZpbmFsIElucHV0U3RyZWFtIHN0cmVhbSwKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjbGllbnRJZCkgdGhyb3dzIElPRXhjZXB0aW9uLCBCYWRGb3JtYXRFeGNlcHRpb24geworICAgICAgICBVdGlscy5sKCJFbnRlcmluZyBoYW5kbGVNZXRhZGF0YSIpOworICAgICAgICBmaW5hbCBMaXN0PFdvcmRMaXN0TWV0YWRhdGE+IG5ld01ldGFkYXRhOworICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbVJlYWRlciByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoc3RyZWFtKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEFjY29yZGluZyB0byB0aGUgZG9jIElucHV0U3RyZWFtUmVhZGVyIGJ1ZmZlcnMsIHNvIG5vIG5lZWQgdG8gYWRkIGEgYnVmZmVyaW5nIGxheWVyCisgICAgICAgICAgICBuZXdNZXRhZGF0YSA9IE1ldGFkYXRhSGFuZGxlci5yZWFkTWV0YWRhdGEocmVhZGVyKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgVXRpbHMubCgiRG93bmxvYWRlZCBtZXRhZGF0YSA6IiwgbmV3TWV0YWRhdGEpOworICAgICAgICBQcml2YXRlTG9nLmxvZygiRG93bmxvYWRlZCBtZXRhZGF0YVxuIiArIG5ld01ldGFkYXRhLCBjb250ZXh0KTsKKworICAgICAgICBmaW5hbCBBY3Rpb25CYXRjaCBhY3Rpb25zID0gY29tcHV0ZVVwZ3JhZGVUbyhjb250ZXh0LCBjbGllbnRJZCwgbmV3TWV0YWRhdGEpOworICAgICAgICAvLyBUT0RPOiBDaGVjayB3aXRoIFVYIGhvdyB3ZSBzaG91bGQgcmVwb3J0IHRvIHRoZSB1c2VyCisgICAgICAgIC8vIFRPRE86IGFkZCBhbiBhY3Rpb24gdG8gY2xvc2UgdGhlIGRhdGFiYXNlCisgICAgICAgIGFjdGlvbnMuZXhlY3V0ZShjb250ZXh0LCBuZXcgTG9nUHJvYmxlbVJlcG9ydGVyKFRBRykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhhbmRsZSBhIHdvcmQgbGlzdDogcHV0IGl0IGluIGl0cyByaWdodCBwbGFjZSwgYW5kIHVwZGF0ZSB0aGUgcGFzc2VkIGNvbnRlbnQgdmFsdWVzLgorICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0IGZvciBvcGVuaW5nIGZpbGVzLgorICAgICAqIEBwYXJhbSBpbnB1dFN0cmVhbSBhbiBpbnB1dCBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIGRvd25sb2FkZWQgZGF0YS4gTWF5IG5vdCBiZSBudWxsLgorICAgICAqICBXaWxsIGJlIGNsb3NlZCB1cG9uIGZpbmlzaGluZy4KKyAgICAgKiBAcGFyYW0gZG93bmxvYWRSZWNvcmQgdGhlIGNvbnRlbnQgdmFsdWVzIHRvIGZpbGwgdGhlIGZpbGUgbmFtZSBpbi4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGZpbGVzIGNhbid0IGJlIHJlYWQgb3Igd3JpdHRlbi4KKyAgICAgKiBAdGhyb3dzIEJhZEZvcm1hdEV4Y2VwdGlvbiBpZiB0aGUgbWQ1IGNoZWNrc3VtIGRvZXNuJ3QgbWF0Y2ggdGhlIG1ldGFkYXRhLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgaGFuZGxlV29yZExpc3QoZmluYWwgQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIGZpbmFsIERvd25sb2FkUmVjb3JkIGRvd25sb2FkUmVjb3JkKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBCYWRGb3JtYXRFeGNlcHRpb24geworCisgICAgICAgIC8vIERvd25sb2FkTWFuYWdlciBkb2VzIG5vdCBoYXZlIHRoZSBhYmlsaXR5IHRvIHB1dCB0aGUgZmlsZSBkaXJlY3RseSB3aGVyZSB3ZSB3YW50CisgICAgICAgIC8vIGl0LCBzbyB3ZSBoYWQgaXQgZG93bmxvYWQgdG8gYSB0ZW1wb3JhcnkgcGxhY2UuIE5vdyB3ZSBtb3ZlIGl0LiBJdCB3aWxsIGJlIGRlbGV0ZWQKKyAgICAgICAgLy8gYXV0b21hdGljYWxseSBieSBEb3dubG9hZE1hbmFnZXIuCisgICAgICAgIFV0aWxzLmwoIkRvd25sb2FkZWQgYSBuZXcgd29yZCBsaXN0IDoiLCBkb3dubG9hZFJlY29yZC5tQXR0cmlidXRlcy5nZXRBc1N0cmluZygKKyAgICAgICAgICAgICAgICBNZXRhZGF0YURiSGVscGVyLkRFU0NSSVBUSU9OX0NPTFVNTiksICJmb3IiLCBkb3dubG9hZFJlY29yZC5tQ2xpZW50SWQpOworICAgICAgICBQcml2YXRlTG9nLmxvZygiRG93bmxvYWRlZCBhIG5ldyB3b3JkIGxpc3Qgd2l0aCBkZXNjcmlwdGlvbiA6ICIKKyAgICAgICAgICAgICAgICArIGRvd25sb2FkUmVjb3JkLm1BdHRyaWJ1dGVzLmdldEFzU3RyaW5nKE1ldGFkYXRhRGJIZWxwZXIuREVTQ1JJUFRJT05fQ09MVU1OKQorICAgICAgICAgICAgICAgICsgIiBmb3IgIiArIGRvd25sb2FkUmVjb3JkLm1DbGllbnRJZCwgY29udGV4dCk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGxvY2FsZSA9CisgICAgICAgICAgICAgICAgZG93bmxvYWRSZWNvcmQubUF0dHJpYnV0ZXMuZ2V0QXNTdHJpbmcoTWV0YWRhdGFEYkhlbHBlci5MT0NBTEVfQ09MVU1OKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc3RpbmF0aW9uRmlsZSA9IGdldFRlbXBGaWxlTmFtZShjb250ZXh0LCBsb2NhbGUpOworICAgICAgICBkb3dubG9hZFJlY29yZC5tQXR0cmlidXRlcy5wdXQoTWV0YWRhdGFEYkhlbHBlci5MT0NBTF9GSUxFTkFNRV9DT0xVTU4sIGRlc3RpbmF0aW9uRmlsZSk7CisKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gY29udGV4dC5vcGVuRmlsZU91dHB1dChkZXN0aW5hdGlvbkZpbGUsIENvbnRleHQuTU9ERV9QUklWQVRFKTsKKyAgICAgICAgICAgIGNvcHlGaWxlKGlucHV0U3RyZWFtLCBvdXRwdXRTdHJlYW0pOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaW5wdXRTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgIGlmIChvdXRwdXRTdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETzogQ29uc29saWRhdGUgdGhpcyBNRDUgY2FsY3VsYXRpb24gd2l0aCBmaWxlIGNvcHlpbmcgYWJvdmUuCisgICAgICAgIC8vIFdlIG5lZWQgdG8gcmVvcGVuIHRoZSBmaWxlIGJlY2F1c2UgdGhlIGlucHV0c3RyZWFtIGJ5dGVzIGhhdmUgYmVlbiBjb25zdW1lZCwgYW5kIHRoZXJlCisgICAgICAgIC8vIGlzIG5vdGhpbmcgaW4gSW5wdXRTdHJlYW0gdG8gcmVvcGVuIG9yIHJld2luZCB0aGUgc3RyZWFtCisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBjb3BpZWRGaWxlID0gbnVsbDsKKyAgICAgICAgZmluYWwgU3RyaW5nIG1kNXN1bTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvcGllZEZpbGUgPSBjb250ZXh0Lm9wZW5GaWxlSW5wdXQoZGVzdGluYXRpb25GaWxlKTsKKyAgICAgICAgICAgIG1kNXN1bSA9IE1ENUNhbGN1bGF0b3IuY2hlY2tzdW0oY29waWVkRmlsZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoY29waWVkRmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29waWVkRmlsZS5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShtZDVzdW0pKSB7CisgICAgICAgICAgICByZXR1cm47IC8vIFdlIGNhbid0IGNvbXB1dGUgdGhlIGNoZWNrc3VtIGFueXdheSwgc28gcmV0dXJuIGFuZCBob3BlIGZvciB0aGUgYmVzdAorICAgICAgICB9CisgICAgICAgIGlmICghbWQ1c3VtLmVxdWFscyhkb3dubG9hZFJlY29yZC5tQXR0cmlidXRlcy5nZXRBc1N0cmluZygKKyAgICAgICAgICAgICAgICBNZXRhZGF0YURiSGVscGVyLkNIRUNLU1VNX0NPTFVNTikpKSB7CisgICAgICAgICAgICBjb250ZXh0LmRlbGV0ZUZpbGUoZGVzdGluYXRpb25GaWxlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCYWRGb3JtYXRFeGNlcHRpb24oIk1ENSBjaGVja3N1bSBjaGVjayBmYWlsZWQgOiBcIiIgKyBtZDVzdW0gKyAiXCIgPD4gXCIiCisgICAgICAgICAgICAgICAgICAgICsgZG93bmxvYWRSZWNvcmQubUF0dHJpYnV0ZXMuZ2V0QXNTdHJpbmcoTWV0YWRhdGFEYkhlbHBlci5DSEVDS1NVTV9DT0xVTU4pCisgICAgICAgICAgICAgICAgICAgICsgIlwiIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb3BpZXMgaW4gdG8gb3V0IHVzaW5nIEZpbGVDaGFubmVscy4KKyAgICAgKgorICAgICAqIFRoaXMgdHJpZXMgdG8gdXNlIGNoYW5uZWxzIGZvciBmYXN0IGNvcHlpbmcuIElmIGl0IGRvZXNuJ3Qgd29yaywgZmFsbCBiYWNrIHRvCisgICAgICogY29weUZpbGVGYWxsQmFjayBiZWxvdy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbiB0aGUgc3RyZWFtIHRvIGNvcHkgZnJvbS4KKyAgICAgKiBAcGFyYW0gb3V0IHRoZSBzdHJlYW0gdG8gY29weSB0by4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGJvdGggdGhlIG5vcm1hbCBhbmQgZmFsbGJhY2sgbWV0aG9kcyByYWlzZSBleGNlcHRpb25zLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY29weUZpbGUoZmluYWwgSW5wdXRTdHJlYW0gaW4sIGZpbmFsIE91dHB1dFN0cmVhbSBvdXQpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBVdGlscy5sKCJDb3B5aW5nIGZpbGVzIik7CisgICAgICAgIGlmICghKGluIGluc3RhbmNlb2YgRmlsZUlucHV0U3RyZWFtKSB8fCAhKG91dCBpbnN0YW5jZW9mIEZpbGVPdXRwdXRTdHJlYW0pKSB7CisgICAgICAgICAgICBVdGlscy5sKCJOb3QgdGhlIHJpZ2h0IHR5cGVzIik7CisgICAgICAgICAgICBjb3B5RmlsZUZhbGxiYWNrKGluLCBvdXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmaW5hbCBGaWxlQ2hhbm5lbCBzb3VyY2VDaGFubmVsID0gKChGaWxlSW5wdXRTdHJlYW0pIGluKS5nZXRDaGFubmVsKCk7CisgICAgICAgICAgICAgICAgZmluYWwgRmlsZUNoYW5uZWwgZGVzdGluYXRpb25DaGFubmVsID0gKChGaWxlT3V0cHV0U3RyZWFtKSBvdXQpLmdldENoYW5uZWwoKTsKKyAgICAgICAgICAgICAgICBzb3VyY2VDaGFubmVsLnRyYW5zZmVyVG8oMCwgSW50ZWdlci5NQVhfVkFMVUUsIGRlc3RpbmF0aW9uQ2hhbm5lbCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gQ2FuJ3Qgd29yayB3aXRoIGNoYW5uZWxzLCBvciBzb21ldGhpbmcgd2VudCB3cm9uZy4gQ29weSBieSBoYW5kLgorICAgICAgICAgICAgICAgIFV0aWxzLmwoIldvbid0IHdvcmsiKTsKKyAgICAgICAgICAgICAgICBjb3B5RmlsZUZhbGxiYWNrKGluLCBvdXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29waWVzIGluIHRvIG91dCB3aXRoIHJlYWQvd3JpdGUgbWV0aG9kcywgbm90IEZpbGVDaGFubmVscy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbiB0aGUgc3RyZWFtIHRvIGNvcHkgZnJvbS4KKyAgICAgKiBAcGFyYW0gb3V0IHRoZSBzdHJlYW0gdG8gY29weSB0by4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGEgcmVhZCBvciBhIHdyaXRlIGZhaWxzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY29weUZpbGVGYWxsYmFjayhmaW5hbCBJbnB1dFN0cmVhbSBpbiwgZmluYWwgT3V0cHV0U3RyZWFtIG91dCkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFV0aWxzLmwoIkZhbGxpbmcgYmFjayB0byBzbG93IGNvcHkiKTsKKyAgICAgICAgZmluYWwgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW0ZJTEVfQ09QWV9CVUZGRVJfU0laRV07CisgICAgICAgIGZvciAoaW50IHJlYWRCeXRlcyA9IGluLnJlYWQoYnVmZmVyKTsgcmVhZEJ5dGVzID49IDA7IHJlYWRCeXRlcyA9IGluLnJlYWQoYnVmZmVyKSkKKyAgICAgICAgICAgIG91dC53cml0ZShidWZmZXIsIDAsIHJlYWRCeXRlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBmaWxlIHRvIHN0b3JlIGEgZGljdGlvbmFyeQorICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0IHRvIHVzZSB0byBvcGVuIHRoZSBmaWxlLgorICAgICAqIEBwYXJhbSBsb2NhbGUgdGhlIGxvY2FsZSBmb3IgdGhpcyBkaWN0aW9uYXJ5LCB0byBtYWtlIHRoZSBmaWxlIG5hbWUgbW9yZSByZWFkYWJsZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBmaWxlIG5hbWUsIG9yIHRocm93IGFuIGV4Y2VwdGlvbi4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBmaWxlIGNhbm5vdCBiZSBjcmVhdGVkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRUZW1wRmlsZU5hbWUoZmluYWwgQ29udGV4dCBjb250ZXh0LCBmaW5hbCBTdHJpbmcgbG9jYWxlKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgVXRpbHMubCgiRW50ZXJpbmcgb3BlblRlbXBGaWxlT3V0cHV0Iik7CisgICAgICAgIGZpbmFsIEZpbGUgZGlyID0gY29udGV4dC5nZXRGaWxlc0RpcigpOworICAgICAgICBmaW5hbCBGaWxlIGYgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKGxvY2FsZSArICJfX18iLCBESUNUX0ZJTEVfU1VGRklYLCBkaXIpOworICAgICAgICBVdGlscy5sKCJGaWxlIG5hbWUgaXMiLCBmLmdldE5hbWUoKSk7CisgICAgICAgIHJldHVybiBmLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlIG1ldGFkYXRhIChjb2xsZWN0aW9ucyBvZiB3b3JkIGxpc3RzKS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIHRha2VzIHdob2xlIG1ldGFkYXRhIHNldHMgZGlyZWN0bHkgYW5kIGNvbXBhcmVzIHRoZW0sIG1hdGNoaW5nIHRoZSB3b3JkbGlzdHMgaW4KKyAgICAgKiBlYWNoIG9mIHRoZW0gb24gdGhlIGlkLiBJdCBjcmVhdGVzIGFuIEFjdGlvbkJhdGNoIG9iamVjdCB0aGF0IGNhbiBiZSAuZXhlY3V0ZSgpJ2QgdG8gcGVyZm9ybQorICAgICAqIHRoZSBhY3R1YWwgdXBncmFkZSBmcm9tIGBmcm9tJyB0byBgdG8nLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgdGhlIGNvbnRleHQgdG8gb3BlbiBkYXRhYmFzZXMgb24uCisgICAgICogQHBhcmFtIGNsaWVudElkIHRoZSBpZCBvZiB0aGUgY2xpZW50LgorICAgICAqIEBwYXJhbSBmcm9tIHRoZSBkaWN0aW9uYXJ5IGRlc2NyaXB0b3IgKGFzIGEgbGlzdCBvZiB3b3JkbGlzdHMpIHRvIHVwZ3JhZGUgZnJvbS4KKyAgICAgKiBAcGFyYW0gdG8gdGhlIGRpY3Rpb25hcnkgZGVzY3JpcHRvciAoYXMgYSBsaXN0IG9mIHdvcmRsaXN0cykgdG8gdXBncmFkZSB0by4KKyAgICAgKiBAcmV0dXJuIGFuIG9yZGVyZWQgbGlzdCBvZiBydW5uYWJsZXMgdG8gYmUgY2FsbGVkIHRvIHVwZ3JhZGUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQWN0aW9uQmF0Y2ggY29tcGFyZU1ldGFkYXRhRm9yVXBncmFkZShmaW5hbCBDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2xpZW50SWQsIExpc3Q8V29yZExpc3RNZXRhZGF0YT4gZnJvbSwgTGlzdDxXb3JkTGlzdE1ldGFkYXRhPiB0bykgeworICAgICAgICBmaW5hbCBBY3Rpb25CYXRjaCBhY3Rpb25zID0gbmV3IEFjdGlvbkJhdGNoKCk7CisgICAgICAgIC8vIFVwZ3JhZGUgZXhpc3Rpbmcgd29yZCBsaXN0cworICAgICAgICBVdGlscy5sKCJDb21wYXJpbmcgZGljdGlvbmFyaWVzIik7CisgICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IHdvcmRMaXN0SWRzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOworICAgICAgICAvLyBUT0RPOiBDYW4gdGhlc2UgYmUgbnVsbD8KKyAgICAgICAgaWYgKG51bGwgPT0gZnJvbSkgZnJvbSA9IG5ldyBBcnJheUxpc3Q8V29yZExpc3RNZXRhZGF0YT4oKTsKKyAgICAgICAgaWYgKG51bGwgPT0gdG8pIHRvID0gbmV3IEFycmF5TGlzdDxXb3JkTGlzdE1ldGFkYXRhPigpOworICAgICAgICBmb3IgKFdvcmRMaXN0TWV0YWRhdGEgd2xEYXRhIDogZnJvbSkgd29yZExpc3RJZHMuYWRkKHdsRGF0YS5tSWQpOworICAgICAgICBmb3IgKFdvcmRMaXN0TWV0YWRhdGEgd2xEYXRhIDogdG8pIHdvcmRMaXN0SWRzLmFkZCh3bERhdGEubUlkKTsKKyAgICAgICAgZm9yIChTdHJpbmcgaWQgOiB3b3JkTGlzdElkcykgeworICAgICAgICAgICAgZmluYWwgV29yZExpc3RNZXRhZGF0YSBjdXJyZW50SW5mbyA9IE1ldGFkYXRhSGFuZGxlci5maW5kV29yZExpc3RCeUlkKGZyb20sIGlkKTsKKyAgICAgICAgICAgIGZpbmFsIFdvcmRMaXN0TWV0YWRhdGEgbWV0YWRhdGFJbmZvID0gTWV0YWRhdGFIYW5kbGVyLmZpbmRXb3JkTGlzdEJ5SWQodG8sIGlkKTsKKyAgICAgICAgICAgIC8vIFRPRE86IFJlbW92ZSB0aGUgZm9sbG93aW5nIHVubmVjZXNzYXJ5IGNoZWNrLCBzaW5jZSB3ZSBhcmUgbm93IGRvaW5nIHRoZSBmaWx0ZXJpbmcKKyAgICAgICAgICAgIC8vIGluc2lkZSBmaW5kV29yZExpc3RCeUlkLgorICAgICAgICAgICAgZmluYWwgV29yZExpc3RNZXRhZGF0YSBuZXdJbmZvID0gbnVsbCA9PSBtZXRhZGF0YUluZm8KKyAgICAgICAgICAgICAgICAgICAgfHwgbWV0YWRhdGFJbmZvLm1Gb3JtYXRWZXJzaW9uID4gTUFYSU1VTV9TVVBQT1JURURfRk9STUFUX1ZFUlNJT04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG51bGwgOiBtZXRhZGF0YUluZm87CisgICAgICAgICAgICBVdGlscy5sKCJDb25zaWRlcmluZyB1cGRhdGluZyAiLCBpZCwgImN1cnJlbnRJbmZvID0iLCBjdXJyZW50SW5mbyk7CisKKyAgICAgICAgICAgIGlmIChudWxsID09IGN1cnJlbnRJbmZvICYmIG51bGwgPT0gbmV3SW5mbykgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgbWF5IGhhcHBlbiBpZiBhIG5ldyB3b3JkIGxpc3QgYXBwZWFyZWQgdGhhdCB3ZSBjYW4ndCBoYW5kbGUuCisgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gbWV0YWRhdGFJbmZvKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdoYXQgaGFwcGVuZWQ/IEJ1ZyBpbiBTZXQ8Pj8KKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiR290IGFuIGlkIGZvciBhIHdvcmRsaXN0IHRoYXQgaXMgbmVpdGhlciBpbiBmcm9tIG5vciBpbiB0byIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIG1heSBjb21lIGhlcmUgaWYgdGhlcmUgaXMgYSBuZXcgd29yZCBsaXN0IHRoYXQgd2UgY2FuJ3QgaGFuZGxlLgorICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJDYW4ndCBoYW5kbGUgd29yZCBsaXN0IHdpdGggaWQgJyIgKyBpZCArICInIGJlY2F1c2UgaXQgaGFzIGZvcm1hdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdmVyc2lvbiAiICsgbWV0YWRhdGFJbmZvLm1Gb3JtYXRWZXJzaW9uICsgIiBhbmQgdGhlIG1heGltdW0gdmVyc2lvbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJ3ZSBjYW4gaGFuZGxlIGlzICIgKyBNQVhJTVVNX1NVUFBPUlRFRF9GT1JNQVRfVkVSU0lPTik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChudWxsID09IGN1cnJlbnRJbmZvKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgY2FzZSB3aGVyZSBhIG5ldyBsaXN0IHRoYXQgd2UgZGlkIG5vdCBrbm93IG9mIHBvcHBlZCBvbiB0aGUgc2VydmVyLgorICAgICAgICAgICAgICAgIC8vIE1ha2UgaXQgYXZhaWxhYmxlLgorICAgICAgICAgICAgICAgIGFjdGlvbnMuYWRkKG5ldyBBY3Rpb25CYXRjaC5NYWtlQXZhaWxhYmxlQWN0aW9uKGNsaWVudElkLCBuZXdJbmZvKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG51bGwgPT0gbmV3SW5mbykgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGNhc2Ugd2hlcmUgYW4gb2xkIGxpc3Qgd2UgaGFkIGlzIG5vdCBpbiB0aGUgc2VydmVyIGRhdGEgYW55IG1vcmUuCisgICAgICAgICAgICAgICAgLy8gUGFzcyBmYWxzZSB0byBGb3JnZXRBY3Rpb246IHRoaXMgbWF5IGJlIGluc3RhbGxlZCBhbmQgd2Ugc3RpbGwgd2FudCB0byBhcHBseQorICAgICAgICAgICAgICAgIC8vIGEgZm9yZ2V0LWxpa2UgYWN0aW9uIChyZW1vdmUgdGhlIFVSTCkgaWYgaXQgaXMsIHNvIHdlIHdhbnQgdG8gdHVybiBvZmYgdGhlCisgICAgICAgICAgICAgICAgLy8gc3RhdHVzID09IEFWQUlMQUJMRSBjaGVjay4gSWYgaXQncyBERUxFVElORywgdGhpcyBpcyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8sCisgICAgICAgICAgICAgICAgLy8gYXMgd2Ugd2FudCB0byBsZWF2ZSB0aGUgcmVjb3JkIGFzIGxvbmcgYXMgQW5kcm9pZCBLZXlib2FyZCBoYXMgbm90IGRlbGV0ZWQgaXQgOworICAgICAgICAgICAgICAgIC8vIHRoZSByZWNvcmQgd2lsbCBiZSByZW1vdmVkIHdoZW4gdGhlIGZpbGUgaXMgYWN0dWFsbHkgZGVsZXRlZC4KKyAgICAgICAgICAgICAgICBhY3Rpb25zLmFkZChuZXcgQWN0aW9uQmF0Y2guRm9yZ2V0QWN0aW9uKGNsaWVudElkLCBjdXJyZW50SW5mbywgZmFsc2UpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIgPSBNZXRhZGF0YURiSGVscGVyLmdldERiKGNvbnRleHQsIGNsaWVudElkKTsKKyAgICAgICAgICAgICAgICBpZiAobmV3SW5mby5tVmVyc2lvbiA9PSBjdXJyZW50SW5mby5tVmVyc2lvbikgeworICAgICAgICAgICAgICAgICAgICAvLyBJZiBpdCdzIHRoZSBzYW1lIGlkL3ZlcnNpb24sIHdlIHVwZGF0ZSB0aGUgREIgd2l0aCB0aGUgbmV3IHZhbHVlcy4KKyAgICAgICAgICAgICAgICAgICAgLy8gSXQgZG9lc24ndCBtYXR0ZXIgdG9vIG11Y2ggaWYgdGhleSBkaWRuJ3QgY2hhbmdlLgorICAgICAgICAgICAgICAgICAgICBhY3Rpb25zLmFkZChuZXcgQWN0aW9uQmF0Y2guVXBkYXRlRGF0YUFjdGlvbihjbGllbnRJZCwgbmV3SW5mbykpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3SW5mby5tVmVyc2lvbiA+IGN1cnJlbnRJbmZvLm1WZXJzaW9uKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIGl0J3MgYSBuZXcgdmVyc2lvbiwgaXQncyBhIGRpZmZlcmVudCBlbnRyeSBpbiB0aGUgZGF0YWJhc2UuIE1ha2UgaXQKKyAgICAgICAgICAgICAgICAgICAgLy8gYXZhaWxhYmxlLCBhbmQgaWYgaXQncyBpbnN0YWxsZWQsIGFsc28gc3RhcnQgdGhlIGRvd25sb2FkLgorICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIHZhbHVlcyA9IE1ldGFkYXRhRGJIZWxwZXIuZ2V0Q29udGVudFZhbHVlc0J5V29yZExpc3RJZChkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW5mby5tSWQsIGN1cnJlbnRJbmZvLm1WZXJzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHN0YXR1cyA9IHZhbHVlcy5nZXRBc0ludGVnZXIoTWV0YWRhdGFEYkhlbHBlci5TVEFUVVNfQ09MVU1OKTsKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9ucy5hZGQobmV3IEFjdGlvbkJhdGNoLk1ha2VBdmFpbGFibGVBY3Rpb24oY2xpZW50SWQsIG5ld0luZm8pKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBNZXRhZGF0YURiSGVscGVyLlNUQVRVU19JTlNUQUxMRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBzdGF0dXMgPT0gTWV0YWRhdGFEYkhlbHBlci5TVEFUVVNfRElTQUJMRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnMuYWRkKG5ldyBBY3Rpb25CYXRjaC5TdGFydERvd25sb2FkQWN0aW9uKGNsaWVudElkLCBuZXdJbmZvLCBmYWxzZSkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGFzcyB0cnVlIHRvIEZvcmdldEFjdGlvbjogdGhpcyBpcyBpbmRlZWQgYW4gdXBkYXRlIHRvIGEgbm9uLWluc3RhbGxlZAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29yZCBsaXN0LCBzbyBhY3RpdmF0ZSBzdGF0dXMgPT0gQVZBSUxBQkxFIGNoZWNrCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIHRoZSBzdGF0dXMgaXMgREVMRVRJTkcsIHRoaXMgaXMgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvLiBJdCB3aWxsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBsZWF2ZSB0aGUgZW50cnkgYXMgREVMRVRJTkcgYW5kIHJlbW92ZSBpdHMgVVJMIHNvIHRoYXQgQW5kcm9pZCBLZXlib2FyZAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuIGRlbGV0ZSBpdCB0aGUgbmV4dCB0aW1lIGl0IHN0YXJ0cyB1cC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnMuYWRkKG5ldyBBY3Rpb25CYXRjaC5Gb3JnZXRBY3Rpb24oY2xpZW50SWQsIGN1cnJlbnRJbmZvLCB0cnVlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIk5vdCB1cGRhdGluZyB3b3JkIGxpc3QgIiArIGlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIDogY3VycmVudCBsaXN0IHRpbWVzdGFtcCBpcyAiICsgY3VycmVudEluZm8ubUxhc3RVcGRhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiA7IG5ldyBsaXN0IHRpbWVzdGFtcCBpcyAiICsgbmV3SW5mby5tTGFzdFVwZGF0ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBhY3Rpb25zOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXB1dGVzIGFuIHVwZ3JhZGUgZnJvbSB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgZGljdGlvbmFyaWVzIHRvIHNvbWUgZGVzaXJlZCBzdGF0ZS4KKyAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dCBmb3IgcmVhZGluZyBzZXR0aW5ncyBhbmQgZmlsZXMuCisgICAgICogQHBhcmFtIGNsaWVudElkIHRoZSBpZCBvZiB0aGUgY2xpZW50LgorICAgICAqIEBwYXJhbSBuZXdNZXRhZGF0YSB0aGUgc3RhdGUgd2Ugd2FudCB0byB1cGdyYWRlIHRvLgorICAgICAqIEByZXR1cm4gdGhlIHVwZ3JhZGUgZnJvbSB0aGUgY3VycmVudCBzdGF0ZSB0byB0aGUgZGVzaXJlZCBzdGF0ZSwgcmVhZHkgdG8gYmUgZXhlY3V0ZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBBY3Rpb25CYXRjaCBjb21wdXRlVXBncmFkZVRvKGZpbmFsIENvbnRleHQgY29udGV4dCwgZmluYWwgU3RyaW5nIGNsaWVudElkLAorICAgICAgICAgICAgZmluYWwgTGlzdDxXb3JkTGlzdE1ldGFkYXRhPiBuZXdNZXRhZGF0YSkgeworICAgICAgICBmaW5hbCBMaXN0PFdvcmRMaXN0TWV0YWRhdGE+IGN1cnJlbnRNZXRhZGF0YSA9CisgICAgICAgICAgICAgICAgTWV0YWRhdGFIYW5kbGVyLmdldEN1cnJlbnRNZXRhZGF0YShjb250ZXh0LCBjbGllbnRJZCk7CisgICAgICAgIHJldHVybiBjb21wYXJlTWV0YWRhdGFGb3JVcGdyYWRlKGNvbnRleHQsIGNsaWVudElkLCBjdXJyZW50TWV0YWRhdGEsIG5ld01ldGFkYXRhKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaG93cyB0aGUgbm90aWZpY2F0aW9uIHRoYXQgaW5mb3JtcyB0aGUgdXNlciBhIGRpY3Rpb25hcnkgaXMgYXZhaWxhYmxlLgorICAgICAqCisgICAgICogV2hlbiB0aGlzIG5vdGlmaWNhdGlvbiBpcyBjbGlja2VkLCB0aGUgZGlhbG9nIGZvciBkb3dubG9hZGluZyB0aGUgZGljdGlvbmFyeQorICAgICAqIG92ZXIgYSBtZXRlcmVkIGNvbm5lY3Rpb24gaXMgc2hvd24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzaG93RGljdGlvbmFyeUF2YWlsYWJsZU5vdGlmaWNhdGlvbihmaW5hbCBDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2xpZW50SWQsIGZpbmFsIENvbnRlbnRWYWx1ZXMgaW5zdGFsbENhbmRpZGF0ZSkgeworICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYWxlU3RyaW5nID0gaW5zdGFsbENhbmRpZGF0ZS5nZXRBc1N0cmluZyhNZXRhZGF0YURiSGVscGVyLkxPQ0FMRV9DT0xVTU4pOworICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOworICAgICAgICBpbnRlbnQuc2V0Q2xhc3MoY29udGV4dCwgRG93bmxvYWRPdmVyTWV0ZXJlZERpYWxvZy5jbGFzcyk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShEb3dubG9hZE92ZXJNZXRlcmVkRGlhbG9nLkNMSUVOVF9JRF9LRVksIGNsaWVudElkKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKERvd25sb2FkT3Zlck1ldGVyZWREaWFsb2cuV09SRExJU1RfVE9fRE9XTkxPQURfS0VZLAorICAgICAgICAgICAgICAgIGluc3RhbGxDYW5kaWRhdGUuZ2V0QXNTdHJpbmcoTWV0YWRhdGFEYkhlbHBlci5XT1JETElTVElEX0NPTFVNTikpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoRG93bmxvYWRPdmVyTWV0ZXJlZERpYWxvZy5TSVpFX0tFWSwKKyAgICAgICAgICAgICAgICBpbnN0YWxsQ2FuZGlkYXRlLmdldEFzSW50ZWdlcihNZXRhZGF0YURiSGVscGVyLkZJTEVTSVpFX0NPTFVNTikpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoRG93bmxvYWRPdmVyTWV0ZXJlZERpYWxvZy5MT0NBTEVfS0VZLCBsb2NhbGVTdHJpbmcpOworICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0sgfCBJbnRlbnQuRkxBR19BQ1RJVklUWV9FWENMVURFX0ZST01fUkVDRU5UUyk7CisgICAgICAgIGZpbmFsIFBlbmRpbmdJbnRlbnQgbm90aWZpY2F0aW9uSW50ZW50ID0gUGVuZGluZ0ludGVudC5nZXRBY3Rpdml0eShjb250ZXh0LAorICAgICAgICAgICAgICAgIDAgLyogcmVxdWVzdENvZGUgKi8sIGludGVudCwKKyAgICAgICAgICAgICAgICBQZW5kaW5nSW50ZW50LkZMQUdfVVBEQVRFX0NVUlJFTlQgfCBQZW5kaW5nSW50ZW50LkZMQUdfT05FX1NIT1QpOworICAgICAgICBmaW5hbCBOb3RpZmljYXRpb25NYW5hZ2VyIG5vdGlmaWNhdGlvbk1hbmFnZXIgPQorICAgICAgICAgICAgICAgIChOb3RpZmljYXRpb25NYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5OT1RJRklDQVRJT05fU0VSVklDRSk7CisgICAgICAgIC8vIE5vbmUgb2YgdGhvc2UgYXJlIGV4cGVjdGVkIHRvIGhhcHBlbiwgYnV0IGp1c3QgaW4gY2FzZS4uLgorICAgICAgICBpZiAobnVsbCA9PSBub3RpZmljYXRpb25JbnRlbnQgfHwgbnVsbCA9PSBub3RpZmljYXRpb25NYW5hZ2VyKSByZXR1cm47CisKKyAgICAgICAgZmluYWwgTG9jYWxlIGxvY2FsZSA9IExvY2FsZVV0aWxzLmNvbnN0cnVjdExvY2FsZUZyb21TdHJpbmcobG9jYWxlU3RyaW5nKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGxhbmd1YWdlID0gKG51bGwgPT0gbG9jYWxlID8gIiIgOiBsb2NhbGUuZ2V0RGlzcGxheUxhbmd1YWdlKCkpOworICAgICAgICBmaW5hbCBTdHJpbmcgdGl0bGVGb3JtYXQgPSBjb250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5kaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fdGl0bGUpOworICAgICAgICBmaW5hbCBTdHJpbmcgbm90aWZpY2F0aW9uVGl0bGUgPSBTdHJpbmcuZm9ybWF0KHRpdGxlRm9ybWF0LCBsYW5ndWFnZSk7CisgICAgICAgIGZpbmFsIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24gPSBuZXcgTm90aWZpY2F0aW9uLkJ1aWxkZXIoY29udGV4dCkKKyAgICAgICAgICAgICAgICAuc2V0QXV0b0NhbmNlbCh0cnVlKQorICAgICAgICAgICAgICAgIC5zZXRDb250ZW50SW50ZW50KG5vdGlmaWNhdGlvbkludGVudCkKKyAgICAgICAgICAgICAgICAuc2V0Q29udGVudFRpdGxlKG5vdGlmaWNhdGlvblRpdGxlKQorICAgICAgICAgICAgICAgIC5zZXRDb250ZW50VGV4dChjb250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5kaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24pKQorICAgICAgICAgICAgICAgIC5zZXRUaWNrZXIobm90aWZpY2F0aW9uVGl0bGUpCisgICAgICAgICAgICAgICAgLnNldE9uZ29pbmcoZmFsc2UpCisgICAgICAgICAgICAgICAgLnNldE9ubHlBbGVydE9uY2UodHJ1ZSkKKyAgICAgICAgICAgICAgICAuc2V0U21hbGxJY29uKFIuZHJhd2FibGUuaWNfbm90aWZ5X2RpY3Rpb25hcnkpCisgICAgICAgICAgICAgICAgLmdldE5vdGlmaWNhdGlvbigpOworICAgICAgICBub3RpZmljYXRpb25NYW5hZ2VyLm5vdGlmeShESUNUX0FWQUlMQUJMRV9OT1RJRklDQVRJT05fSUQsIG5vdGlmaWNhdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5zdGFsbHMgYSB3b3JkIGxpc3QgaWYgaXQgaGFzIG5ldmVyIGJlZW4gcmVxdWVzdGVkLgorICAgICAqCisgICAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiBhIHdvcmQgbGlzdCBpcyByZXF1ZXN0ZWQsIGFuZCBpcyBhdmFpbGFibGUgYnV0IG5vdCBpbnN0YWxsZWQuIEl0IGNoZWNrcworICAgICAqIHRoZSBjb25kaXRpb25zIGZvciBhdXRvLWluc3RhbGxhdGlvbjogaWYgdGhlIGRpY3Rpb25hcnkgaXMgYSBtYWluIGRpY3Rpb25hcnkgZm9yIHRoaXMKKyAgICAgKiBsYW5ndWFnZSwgYW5kIGl0IGhhcyBuZXZlciBiZWVuIG9wdGVkIG91dCB0aHJvdWdoIHRoZSBkaWN0aW9uYXJ5IGludGVyZmFjZSwgdGhlbiB3ZSBzdGFydAorICAgICAqIGluc3RhbGxpbmcgaXQuIEZvciB0aGUgdXNlciB3aG8gZW5hYmxlcyBhIGxhbmd1YWdlIGFuZCB1c2VzIGl0IGZvciB0aGUgZmlyc3QgdGltZSwgdGhlCisgICAgICogZGljdGlvbmFyeSBzaG91bGQgbWFnaWNhbGx5IHN0YXJ0IGJlaW5nIHVzZWQgYSBzaG9ydCB0aW1lIGFmdGVyIHRoZXkgc3RhcnQgdHlwaW5nLgorICAgICAqIFRoZSBtYXlQcm9tcHQgYXJndW1lbnQgaW5kaWNhdGVzIHdoZXRoZXIgd2Ugc2hvdWxkIHByb21wdCB0aGUgdXNlciBmb3IgYSBkZWNpc2lvbiB0bworICAgICAqIGRvd25sb2FkIG9yIG5vdCwgaW4gY2FzZSB3ZSBkZWNpZGUgd2UgYXJlIGluIHRoZSBjYXNlIHdoZXJlIHdlIHNob3VsZCBkb3dubG9hZCAtIHRoaXMKKyAgICAgKiByb3VnaGx5IGhhcHBlbnMgd2hlbiB0aGUgY3VycmVudCBjb25uZWN0aXZpdHkgaXMgM0cuIFNlZQorICAgICAqIERpY3Rpb25hcnlQcm92aWRlciNnZXREaWN0aW9uYXJ5V29yZExpc3RzRm9yQ29udGVudFVyaSBmb3IgZGV0YWlscy4KKyAgICAgKi8KKyAgICAvLyBBcyBvcHBvc2VkIHRvIG1hbnkgb3RoZXIgbWV0aG9kcywgdGhpcyBtZXRob2QgZG9lcyBub3QgbmVlZCB0aGUgdmVyc2lvbiBvZiB0aGUgd29yZAorICAgIC8vIGxpc3QgYmVjYXVzZSBpdCBtYXkgb25seSBpbnN0YWxsIHRoZSBsYXRlc3QgdmVyc2lvbiB3ZSBrbm93IGFib3V0IGZvciB0aGlzIHNwZWNpZmljCisgICAgLy8gd29yZCBsaXN0IElEIC8gY2xpZW50IElEIGNvbWJpbmF0aW9uLgorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbnN0YWxsSWZOZXZlclJlcXVlc3RlZChmaW5hbCBDb250ZXh0IGNvbnRleHQsIGZpbmFsIFN0cmluZyBjbGllbnRJZCwKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB3b3JkbGlzdElkLCBmaW5hbCBib29sZWFuIG1heVByb21wdCkgeworICAgICAgICBmaW5hbCBTdHJpbmdbXSBpZEFycmF5ID0gd29yZGxpc3RJZC5zcGxpdChEaWN0aW9uYXJ5UHJvdmlkZXIuSURfQ0FURUdPUllfU0VQQVJBVE9SKTsKKyAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIG5ldy1mb3JtYXQgZGljdGlvbmFyeSBpZCAoY2F0ZWdvcnk6bWFudWFsX2lkKSwgdGhlbiB1c2UgdGhlCisgICAgICAgIC8vIHNwZWNpZmllZCBjYXRlZ29yeS4gT3RoZXJ3aXNlLCBpdCBpcyBhIG1haW4gZGljdGlvbmFyeSwgc28gZm9yY2UgdGhlCisgICAgICAgIC8vIE1BSU4gY2F0ZWdvcnkgdXBvbiBpdC4KKyAgICAgICAgZmluYWwgU3RyaW5nIGNhdGVnb3J5ID0gMiA9PSBpZEFycmF5Lmxlbmd0aCA/IGlkQXJyYXlbMF0gOiBNQUlOX0RJQ1RJT05BUllfQ0FURUdPUlk7CisgICAgICAgIGlmICghTUFJTl9ESUNUSU9OQVJZX0NBVEVHT1JZLmVxdWFscyhjYXRlZ29yeSkpIHsKKyAgICAgICAgICAgIC8vIE5vdCBhIG1haW4gZGljdGlvbmFyeS4gV2Ugb25seSBhdXRvLWluc3RhbGwgbWFpbiBkaWN0aW9uYXJpZXMsIHNvIHdlIGNhbiByZXR1cm4gbm93LgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChDb21tb25QcmVmZXJlbmNlcy5nZXRDb21tb25QcmVmZXJlbmNlcyhjb250ZXh0KS5jb250YWlucyh3b3JkbGlzdElkKSkgeworICAgICAgICAgICAgLy8gSWYgc29tZSBraW5kIG9mIHNldHRpbmdzIGhhcyBiZWVuIGRvbmUgaW4gdGhlIHBhc3QgZm9yIHRoaXMgc3BlY2lmaWMgaWQsIHRoZW4KKyAgICAgICAgICAgIC8vIHRoaXMgaXMgbm90IGEgY2FuZGlkYXRlIGZvciBhdXRvLWluc3RhbGwuIEJlY2F1c2UgaXQgYWxyZWFkeSBpcyBlaXRoZXIgdHJ1ZSwKKyAgICAgICAgICAgIC8vIGluIHdoaWNoIGNhc2UgaXQgbWF5IGJlIGluc3RhbGxlZCBvciBkb3dubG9hZGluZyBvciB3aGF0ZXZlciwgYW5kIHdlIGRvbid0CisgICAgICAgICAgICAvLyBuZWVkIHRvIGNhcmUgYWJvdXQgaXQgYmVjYXVzZSBpdCdzIGFscmVhZHkgaGFuZGxlZCBvciBiZWluZyBoYW5kbGVkLCBvciBpdCdzIGZhbHNlCisgICAgICAgICAgICAvLyBpbiB3aGljaCBjYXNlIGl0IG1lYW5zIHRoZSB1c2VyIGV4cGxpY2l0ZWx5IHR1cm5lZCBpdCBvZmYgYW5kIGRvbid0IHdhbnQgdG8gaGF2ZQorICAgICAgICAgICAgLy8gaXQgaW5zdGFsbGVkLiBTbyB3ZSBxdWl0IHJpZ2h0IGF3YXkuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBTUUxpdGVEYXRhYmFzZSBkYiA9IE1ldGFkYXRhRGJIZWxwZXIuZ2V0RGIoY29udGV4dCwgY2xpZW50SWQpOworICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIGluc3RhbGxDYW5kaWRhdGUgPQorICAgICAgICAgICAgICAgIE1ldGFkYXRhRGJIZWxwZXIuZ2V0Q29udGVudFZhbHVlc09mTGF0ZXN0QXZhaWxhYmxlV29yZGxpc3RCeUlkKGRiLCB3b3JkbGlzdElkKTsKKyAgICAgICAgaWYgKE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0FWQUlMQUJMRQorICAgICAgICAgICAgICAgICE9IGluc3RhbGxDYW5kaWRhdGUuZ2V0QXNJbnRlZ2VyKE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0NPTFVNTikpIHsKKyAgICAgICAgICAgIC8vIElmIGl0J3Mgbm90ICJBVkFJTEFCTEUiLCB3ZSB3YW50IHRvIHN0b3Agbm93LiBCZWNhdXNlIGNhbmRpZGF0ZXMgZm9yIGF1dG8taW5zdGFsbAorICAgICAgICAgICAgLy8gYXJlIGxpc3RzIHRoYXQgd2Uga25vdyBhcmUgYXZhaWxhYmxlLCBidXQgd2UgYWxzbyBrbm93IGhhdmUgbmV2ZXIgYmVlbiBpbnN0YWxsZWQuCisgICAgICAgICAgICAvLyBJdCBkb2VzIG9idmlvdXNseSBub3QgY29uY2VybiBhbHJlYWR5IGluc3RhbGxlZCBsaXN0cywgb3IgZG93bmxvYWRpbmcgbGlzdHMsCisgICAgICAgICAgICAvLyBvciB0aG9zZSB0aGF0IGhhdmUgYmVlbiBkaXNhYmxlZCwgZmxhZ2dlZCBhcyBkZWxldGluZy4uLiBTbyBhbnl0aGluZyBlbHNlIHRoYW4KKyAgICAgICAgICAgIC8vIEFWQUlMQUJMRSBtZWFucyB3ZSBkb24ndCBhdXRvLWluc3RhbGwuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAobWF5UHJvbXB0CisgICAgICAgICAgICAgICAgJiYgRE9XTkxPQURfT1ZFUl9NRVRFUkVEX1NFVFRJTkdfVU5LTk9XTgorICAgICAgICAgICAgICAgICAgICAgICAgPT0gZ2V0RG93bmxvYWRPdmVyTWV0ZXJlZFNldHRpbmcoY29udGV4dCkpIHsKKyAgICAgICAgICAgIGZpbmFsIENvbm5lY3Rpdml0eU1hbmFnZXIgY20gPQorICAgICAgICAgICAgICAgICAgICAoQ29ubmVjdGl2aXR5TWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ09OTkVDVElWSVRZX1NFUlZJQ0UpOworICAgICAgICAgICAgaWYgKENvbm5lY3Rpdml0eU1hbmFnZXJDb21wYXRVdGlscy5pc0FjdGl2ZU5ldHdvcmtNZXRlcmVkKGNtKSkgeworICAgICAgICAgICAgICAgIHNob3dEaWN0aW9uYXJ5QXZhaWxhYmxlTm90aWZpY2F0aW9uKGNvbnRleHQsIGNsaWVudElkLCBpbnN0YWxsQ2FuZGlkYXRlKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBXZSBkZWNpZGVkIGFnYWluc3QgcHJvbXB0aW5nIHRoZSB1c2VyIGZvciBhIGRlY2lzaW9uLiBUaGlzIG1heSBiZSBiZWNhdXNlIHdlIHdlcmUKKyAgICAgICAgLy8gZXhwbGljaXRseSBhc2tlZCBub3QgdG8sIG9yIGJlY2F1c2Ugd2UgYXJlIGN1cnJlbnRseSBvbiB3aS1maSBhbnl3YXksIG9yIGJlY2F1c2Ugd2UKKyAgICAgICAgLy8gYWxyZWFkeSBrbm93IHRoZSBhbnN3ZXIgdG8gdGhlIHF1ZXN0aW9uLiBXZSdsbCBlbnF1ZXVlIGEgcmVxdWVzdCA7IFN0YXJ0RG93bmxvYWRBY3Rpb24KKyAgICAgICAgLy8ga25vd3MgdG8gdXNlIHRoZSBjb3JyZWN0IHR5cGUgb2YgbmV0d29yayBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgc2V0dGluZ3MuCisKKyAgICAgICAgLy8gQWxzbyBub3RlIHRoYXQgb25jZSBpdCdzIGF1dG8taW5zdGFsbGVkLCBhIHdvcmQgbGlzdCB3aWxsIGJlIG1hcmtlZCBhcyBJTlNUQUxMRUQuIEl0IHdpbGwKKyAgICAgICAgLy8gdGh1cyByZWNlaXZlIGF1dG9tYXRpYyB1cGRhdGVzIGlmIHRoZXJlIGFyZSBhbnksIHdoaWNoIGlzIHdoYXQgd2Ugd2FudC4gSWYgdGhlIHVzZXIgZG9lcworICAgICAgICAvLyBub3Qgd2FudCB0aGlzIHdvcmQgbGlzdCwgdGhleSB3aWxsIGhhdmUgdG8gZ28gdG8gdGhlIHNldHRpbmdzIGFuZCBjaGFuZ2UgdGhlbSwgd2hpY2ggd2lsbAorICAgICAgICAvLyBjaGFuZ2UgdGhlIHNoYXJlZCBwcmVmZXJlbmNlcy4gU28gdGhlcmUgaXMgbm8gd2F5IGZvciBhIHdvcmQgbGlzdCB0aGF0IGhhcyBiZWVuCisgICAgICAgIC8vIGF1dG8taW5zdGFsbGVkIG9uY2UgdG8gZ2V0IGF1dG8taW5zdGFsbGVkIGFnYWluLCBhbmQgdGhhdCdzIHdoYXQgd2Ugd2FudC4KKyAgICAgICAgZmluYWwgQWN0aW9uQmF0Y2ggYWN0aW9ucyA9IG5ldyBBY3Rpb25CYXRjaCgpOworICAgICAgICBhY3Rpb25zLmFkZChuZXcgQWN0aW9uQmF0Y2guU3RhcnREb3dubG9hZEFjdGlvbihjbGllbnRJZCwKKyAgICAgICAgICAgICAgICBXb3JkTGlzdE1ldGFkYXRhLmNyZWF0ZUZyb21Db250ZW50VmFsdWVzKGluc3RhbGxDYW5kaWRhdGUpLCBmYWxzZSkpOworICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYWxlU3RyaW5nID0gaW5zdGFsbENhbmRpZGF0ZS5nZXRBc1N0cmluZyhNZXRhZGF0YURiSGVscGVyLkxPQ0FMRV9DT0xVTU4pOworICAgICAgICAvLyBXZSBhcmUgaW4gYSBjb250ZW50IHByb3ZpZGVyOiB3ZSBjYW4ndCBkbyBhbnkgVUkgYXQgYWxsLiBXZSBoYXZlIHRvIGRlZmVyIHRoZSBkaXNwbGF5aW5nCisgICAgICAgIC8vIGl0c2VsZiB0byB0aGUgc2VydmljZS4gQWxzbywgd2Ugb25seSBkaXNwbGF5IHRoaXMgd2hlbiB0aGUgdXNlciBkb2VzIG5vdCBoYXZlIGEKKyAgICAgICAgLy8gZGljdGlvbmFyeSBmb3IgdGhpcyBsYW5ndWFnZSBhbHJlYWR5OiB3ZSBrbm93IHRoYXQgZnJvbSB0aGUgbWF5UHJvbXB0IGFyZ3VtZW50LgorICAgICAgICBpZiAobWF5UHJvbXB0KSB7CisgICAgICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOworICAgICAgICAgICAgaW50ZW50LnNldENsYXNzKGNvbnRleHQsIERpY3Rpb25hcnlTZXJ2aWNlLmNsYXNzKTsKKyAgICAgICAgICAgIGludGVudC5zZXRBY3Rpb24oRGljdGlvbmFyeVNlcnZpY2UuU0hPV19ET1dOTE9BRF9UT0FTVF9JTlRFTlRfQUNUSU9OKTsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShEaWN0aW9uYXJ5U2VydmljZS5MT0NBTEVfSU5URU5UX0FSR1VNRU5ULCBsb2NhbGVTdHJpbmcpOworICAgICAgICAgICAgY29udGV4dC5zdGFydFNlcnZpY2UoaW50ZW50KTsKKyAgICAgICAgfQorICAgICAgICBhY3Rpb25zLmV4ZWN1dGUoY29udGV4dCwgbmV3IExvZ1Byb2JsZW1SZXBvcnRlcihUQUcpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXJrcyB0aGUgd29yZCBsaXN0IHdpdGggdGhlIHBhc3NlZCBpZCBhcyB1c2VkLgorICAgICAqCisgICAgICogVGhpcyB3aWxsIGRvd25sb2FkL2luc3RhbGwgdGhlIGxpc3QgYXMgcmVxdWlyZWQuIFRoZSBhY3Rpb24gd2lsbCBzZWUgdGhhdCB0aGUgZGVzdGluYXRpb24KKyAgICAgKiB3b3JkIGxpc3QgaXMgYSB2YWxpZCBsaXN0LCBhbmQgdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gLSBpbiB0aGlzIGNhc2UsIG1hcmsgaXQgYXMgdXNlZC4KKyAgICAgKiBAc2VlIEFjdGlvbkJhdGNoLkFjdGlvbiNleGVjdXRlCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dCBmb3IgdXNpbmcgYWN0aW9uIGJhdGNoZXMuCisgICAgICogQHBhcmFtIGNsaWVudElkIHRoZSBpZCBvZiB0aGUgY2xpZW50LgorICAgICAqIEBwYXJhbSB3b3JkbGlzdElkIHRoZSBpZCBvZiB0aGUgd29yZCBsaXN0IHRvIG1hcmsgYXMgaW5zdGFsbGVkLgorICAgICAqIEBwYXJhbSB2ZXJzaW9uIHRoZSB2ZXJzaW9uIG9mIHRoZSB3b3JkIGxpc3QgdG8gbWFyayBhcyBpbnN0YWxsZWQuCisgICAgICogQHBhcmFtIHN0YXR1cyB0aGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIHdvcmQgbGlzdC4KKyAgICAgKiBAcGFyYW0gYWxsb3dEb3dubG9hZE9uTWV0ZXJlZERhdGEgd2hldGhlciB0byBkb3dubG9hZCBldmVuIG9uIG1ldGVyZWQgZGF0YSBjb25uZWN0aW9uCisgICAgICovCisgICAgLy8gVGhlIHZlcnNpb24gYXJndW1lbnQgaXMgbm90IHVzZWQgeWV0LCBiZWNhdXNlIHdlIGRvbid0IG5lZWQgaXQgdG8gcmV0cmlldmUgdGhlIGluZm9ybWF0aW9uCisgICAgLy8gd2UgbmVlZC4gSG93ZXZlciwgdGhlIHBhaXIgKGlkLCB2ZXJzaW9uKSBiZWluZyB0aGUgcHJpbWFyeSBrZXkgdG8gYSB3b3JkIGxpc3QgaW4gdGhlIGRhdGFiYXNlCisgICAgLy8gaXQgZmVlbHMgYmV0dGVyIGZvciBjb25zaXN0ZW5jeSB0byBwYXNzIGl0LCBhbmQgc29tZSBtZXRob2RzIHJldHJpZXZpbmcgaW5mb3JtYXRpb24gYWJvdXQgYQorICAgIC8vIHdvcmQgbGlzdCBuZWVkIGl0IHNvIHdlIG1heSBuZWVkIGl0IGluIHRoZSBmdXR1cmUuCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1hcmtBc1VzZWQoZmluYWwgQ29udGV4dCBjb250ZXh0LCBmaW5hbCBTdHJpbmcgY2xpZW50SWQsCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgd29yZGxpc3RJZCwgZmluYWwgaW50IHZlcnNpb24sCisgICAgICAgICAgICBmaW5hbCBpbnQgc3RhdHVzLCBmaW5hbCBib29sZWFuIGFsbG93RG93bmxvYWRPbk1ldGVyZWREYXRhKSB7CisgICAgICAgIGZpbmFsIExpc3Q8V29yZExpc3RNZXRhZGF0YT4gY3VycmVudE1ldGFkYXRhID0KKyAgICAgICAgICAgICAgICBNZXRhZGF0YUhhbmRsZXIuZ2V0Q3VycmVudE1ldGFkYXRhKGNvbnRleHQsIGNsaWVudElkKTsKKyAgICAgICAgV29yZExpc3RNZXRhZGF0YSB3b3JkTGlzdCA9IE1ldGFkYXRhSGFuZGxlci5maW5kV29yZExpc3RCeUlkKGN1cnJlbnRNZXRhZGF0YSwgd29yZGxpc3RJZCk7CisgICAgICAgIGlmIChudWxsID09IHdvcmRMaXN0KSByZXR1cm47CisgICAgICAgIGZpbmFsIEFjdGlvbkJhdGNoIGFjdGlvbnMgPSBuZXcgQWN0aW9uQmF0Y2goKTsKKyAgICAgICAgaWYgKE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0RJU0FCTEVEID09IHN0YXR1cworICAgICAgICAgICAgICAgIHx8IE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0RFTEVUSU5HID09IHN0YXR1cykgeworICAgICAgICAgICAgYWN0aW9ucy5hZGQobmV3IEFjdGlvbkJhdGNoLkVuYWJsZUFjdGlvbihjbGllbnRJZCwgd29yZExpc3QpKTsKKyAgICAgICAgfSBlbHNlIGlmIChNZXRhZGF0YURiSGVscGVyLlNUQVRVU19BVkFJTEFCTEUgPT0gc3RhdHVzKSB7CisgICAgICAgICAgICBhY3Rpb25zLmFkZChuZXcgQWN0aW9uQmF0Y2guU3RhcnREb3dubG9hZEFjdGlvbihjbGllbnRJZCwgd29yZExpc3QsCisgICAgICAgICAgICAgICAgICAgIGFsbG93RG93bmxvYWRPbk1ldGVyZWREYXRhKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJVbmV4cGVjdGVkIHN0YXRlIG9mIHRoZSB3b3JkIGxpc3QgZm9yIG1hcmtBc1VzZWQgOiAiICsgc3RhdHVzKTsKKyAgICAgICAgfQorICAgICAgICBhY3Rpb25zLmV4ZWN1dGUoY29udGV4dCwgbmV3IExvZ1Byb2JsZW1SZXBvcnRlcihUQUcpKTsKKyAgICAgICAgc2lnbmFsTmV3RGljdGlvbmFyeVN0YXRlKGNvbnRleHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1hcmtzIHRoZSB3b3JkIGxpc3Qgd2l0aCB0aGUgcGFzc2VkIGlkIGFzIHVudXNlZC4KKyAgICAgKgorICAgICAqIFRoaXMgbGVhdmVzIHRoZSBmaWxlIG9uIHRoZSBkaXNrIGZvciB1bHRlcmlvciB1c2UuIFRoZSBhY3Rpb24gd2lsbCBzZWUgdGhhdCB0aGUgZGVzdGluYXRpb24KKyAgICAgKiB3b3JkIGxpc3QgaXMgbnVsbCwgYW5kIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIC0gaW4gdGhpcyBjYXNlLCBtYXJrIGl0IGFzIHVudXNlZC4KKyAgICAgKiBAc2VlIEFjdGlvbkJhdGNoLkFjdGlvbiNleGVjdXRlCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dCBmb3IgdXNpbmcgYWN0aW9uIGJhdGNoZXMuCisgICAgICogQHBhcmFtIGNsaWVudElkIHRoZSBpZCBvZiB0aGUgY2xpZW50LgorICAgICAqIEBwYXJhbSB3b3JkbGlzdElkIHRoZSBpZCBvZiB0aGUgd29yZCBsaXN0IHRvIG1hcmsgYXMgaW5zdGFsbGVkLgorICAgICAqIEBwYXJhbSB2ZXJzaW9uIHRoZSB2ZXJzaW9uIG9mIHRoZSB3b3JkIGxpc3QgdG8gbWFyayBhcyBpbnN0YWxsZWQuCisgICAgICogQHBhcmFtIHN0YXR1cyB0aGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIHdvcmQgbGlzdC4KKyAgICAgKi8KKyAgICAvLyBUaGUgdmVyc2lvbiBhbmQgc3RhdHVzIGFyZ3VtZW50cyBhcmUgbm90IHVzZWQgeWV0LCBidXQgdGhpcyBtZXRob2QgbWF0Y2hlcyBpdHMgaW50ZXJmYWNlIHRvCisgICAgLy8gbWFya0FzVXNlZCBmb3IgY29uc2lzdGVuY3kuCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1hcmtBc1VudXNlZChmaW5hbCBDb250ZXh0IGNvbnRleHQsIGZpbmFsIFN0cmluZyBjbGllbnRJZCwKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB3b3JkbGlzdElkLCBmaW5hbCBpbnQgdmVyc2lvbiwgZmluYWwgaW50IHN0YXR1cykgeworICAgICAgICBmaW5hbCBMaXN0PFdvcmRMaXN0TWV0YWRhdGE+IGN1cnJlbnRNZXRhZGF0YSA9CisgICAgICAgICAgICAgICAgTWV0YWRhdGFIYW5kbGVyLmdldEN1cnJlbnRNZXRhZGF0YShjb250ZXh0LCBjbGllbnRJZCk7CisgICAgICAgIGZpbmFsIFdvcmRMaXN0TWV0YWRhdGEgd29yZExpc3QgPQorICAgICAgICAgICAgICAgIE1ldGFkYXRhSGFuZGxlci5maW5kV29yZExpc3RCeUlkKGN1cnJlbnRNZXRhZGF0YSwgd29yZGxpc3RJZCk7CisgICAgICAgIGlmIChudWxsID09IHdvcmRMaXN0KSByZXR1cm47CisgICAgICAgIGZpbmFsIEFjdGlvbkJhdGNoIGFjdGlvbnMgPSBuZXcgQWN0aW9uQmF0Y2goKTsKKyAgICAgICAgYWN0aW9ucy5hZGQobmV3IEFjdGlvbkJhdGNoLkRpc2FibGVBY3Rpb24oY2xpZW50SWQsIHdvcmRMaXN0KSk7CisgICAgICAgIGFjdGlvbnMuZXhlY3V0ZShjb250ZXh0LCBuZXcgTG9nUHJvYmxlbVJlcG9ydGVyKFRBRykpOworICAgICAgICBzaWduYWxOZXdEaWN0aW9uYXJ5U3RhdGUoY29udGV4dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFya3MgdGhlIHdvcmQgbGlzdCB3aXRoIHRoZSBwYXNzZWQgaWQgYXMgZGVsZXRpbmcuCisgICAgICoKKyAgICAgKiBUaGlzIGJhc2ljYWxseSBtZWFucyB0aGF0IG9uIHRoZSBuZXh0IGNoYW5jZSB0aGVyZSBpcyAocmlnaHQgYXdheSBpZiBBbmRyb2lkIEtleWJvYXJkCisgICAgICogaGFwcGVucyB0byBiZSB1cCwgb3IgdGhlIG5leHQgdGltZSBpdCBnZXRzIHVwIG90aGVyd2lzZSkgdGhlIGRpY3Rpb25hcnkgcGFjayB3aWxsCisgICAgICogc3VwcGx5IGFuIGVtcHR5IGRpY3Rpb25hcnkgdG8gaXQgdGhhdCB3aWxsIHJlcGxhY2Ugd2hhdGV2ZXIgZGljdGlvbmFyeSBpcyBpbnN0YWxsZWQuCisgICAgICogVGhpcyBhbGxvd3MgdG8gcmVsZWFzZSB0aGUgc3BhY2UgdGFrZW4gYnkgYSBkaWN0aW9uYXJ5IChleGNlcHQgZm9yIHRoZSBmZXcgYnl0ZXMgdGhlCisgICAgICogZW1wdHkgZGljdGlvbmFyeSB0YWtlcyB1cCksIGFuZCBvdmVycmlkZSBhIGJ1aWx0LWluIGRlZmF1bHQgZGljdGlvbmFyeSBzbyB0aGF0IHdlCisgICAgICogY2FuIGZha2UgZGVsZXRlIGEgYnVpbHQtaW4gZGljdGlvbmFyeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0IHRvIG9wZW4gdGhlIGRhdGFiYXNlIG9uLgorICAgICAqIEBwYXJhbSBjbGllbnRJZCB0aGUgaWQgb2YgdGhlIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gd29yZGxpc3RJZCB0aGUgaWQgb2YgdGhlIHdvcmQgbGlzdCB0byBtYXJrIGFzIGRlbGV0ZWQuCisgICAgICogQHBhcmFtIHZlcnNpb24gdGhlIHZlcnNpb24gb2YgdGhlIHdvcmQgbGlzdCB0byBtYXJrIGFzIGRlbGV0ZWQuCisgICAgICogQHBhcmFtIHN0YXR1cyB0aGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIHdvcmQgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFya0FzRGVsZXRpbmcoZmluYWwgQ29udGV4dCBjb250ZXh0LCBmaW5hbCBTdHJpbmcgY2xpZW50SWQsCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgd29yZGxpc3RJZCwgZmluYWwgaW50IHZlcnNpb24sIGZpbmFsIGludCBzdGF0dXMpIHsKKyAgICAgICAgZmluYWwgTGlzdDxXb3JkTGlzdE1ldGFkYXRhPiBjdXJyZW50TWV0YWRhdGEgPQorICAgICAgICAgICAgICAgIE1ldGFkYXRhSGFuZGxlci5nZXRDdXJyZW50TWV0YWRhdGEoY29udGV4dCwgY2xpZW50SWQpOworICAgICAgICBmaW5hbCBXb3JkTGlzdE1ldGFkYXRhIHdvcmRMaXN0ID0KKyAgICAgICAgICAgICAgICBNZXRhZGF0YUhhbmRsZXIuZmluZFdvcmRMaXN0QnlJZChjdXJyZW50TWV0YWRhdGEsIHdvcmRsaXN0SWQpOworICAgICAgICBpZiAobnVsbCA9PSB3b3JkTGlzdCkgcmV0dXJuOworICAgICAgICBmaW5hbCBBY3Rpb25CYXRjaCBhY3Rpb25zID0gbmV3IEFjdGlvbkJhdGNoKCk7CisgICAgICAgIGFjdGlvbnMuYWRkKG5ldyBBY3Rpb25CYXRjaC5EaXNhYmxlQWN0aW9uKGNsaWVudElkLCB3b3JkTGlzdCkpOworICAgICAgICBhY3Rpb25zLmFkZChuZXcgQWN0aW9uQmF0Y2guU3RhcnREZWxldGVBY3Rpb24oY2xpZW50SWQsIHdvcmRMaXN0KSk7CisgICAgICAgIGFjdGlvbnMuZXhlY3V0ZShjb250ZXh0LCBuZXcgTG9nUHJvYmxlbVJlcG9ydGVyKFRBRykpOworICAgICAgICBzaWduYWxOZXdEaWN0aW9uYXJ5U3RhdGUoY29udGV4dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFya3MgdGhlIHdvcmQgbGlzdCB3aXRoIHRoZSBwYXNzZWQgaWQgYXMgYWN0dWFsbHkgZGVsZXRlZC4KKyAgICAgKgorICAgICAqIFRoaXMgcmV2ZXJ0cyB0byBhdmFpbGFibGUgc3RhdHVzIG9yIGRlbGV0ZXMgdGhlIHJvdyBhcyBhcHByb3ByaWF0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0IHRvIG9wZW4gdGhlIGRhdGFiYXNlIG9uLgorICAgICAqIEBwYXJhbSBjbGllbnRJZCB0aGUgaWQgb2YgdGhlIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gd29yZGxpc3RJZCB0aGUgaWQgb2YgdGhlIHdvcmQgbGlzdCB0byBtYXJrIGFzIGRlbGV0ZWQuCisgICAgICogQHBhcmFtIHZlcnNpb24gdGhlIHZlcnNpb24gb2YgdGhlIHdvcmQgbGlzdCB0byBtYXJrIGFzIGRlbGV0ZWQuCisgICAgICogQHBhcmFtIHN0YXR1cyB0aGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIHdvcmQgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFya0FzRGVsZXRlZChmaW5hbCBDb250ZXh0IGNvbnRleHQsIGZpbmFsIFN0cmluZyBjbGllbnRJZCwKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB3b3JkbGlzdElkLCBmaW5hbCBpbnQgdmVyc2lvbiwgZmluYWwgaW50IHN0YXR1cykgeworICAgICAgICBmaW5hbCBMaXN0PFdvcmRMaXN0TWV0YWRhdGE+IGN1cnJlbnRNZXRhZGF0YSA9CisgICAgICAgICAgICAgICAgTWV0YWRhdGFIYW5kbGVyLmdldEN1cnJlbnRNZXRhZGF0YShjb250ZXh0LCBjbGllbnRJZCk7CisgICAgICAgIGZpbmFsIFdvcmRMaXN0TWV0YWRhdGEgd29yZExpc3QgPQorICAgICAgICAgICAgICAgIE1ldGFkYXRhSGFuZGxlci5maW5kV29yZExpc3RCeUlkKGN1cnJlbnRNZXRhZGF0YSwgd29yZGxpc3RJZCk7CisgICAgICAgIGlmIChudWxsID09IHdvcmRMaXN0KSByZXR1cm47CisgICAgICAgIGZpbmFsIEFjdGlvbkJhdGNoIGFjdGlvbnMgPSBuZXcgQWN0aW9uQmF0Y2goKTsKKyAgICAgICAgYWN0aW9ucy5hZGQobmV3IEFjdGlvbkJhdGNoLkZpbmlzaERlbGV0ZUFjdGlvbihjbGllbnRJZCwgd29yZExpc3QpKTsKKyAgICAgICAgYWN0aW9ucy5leGVjdXRlKGNvbnRleHQsIG5ldyBMb2dQcm9ibGVtUmVwb3J0ZXIoVEFHKSk7CisgICAgICAgIHNpZ25hbE5ld0RpY3Rpb25hcnlTdGF0ZShjb250ZXh0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXJrcyB0aGUgd29yZCBsaXN0IHdpdGggdGhlIHBhc3NlZCBpZCBhcyBicm9rZW4uCisgICAgICoKKyAgICAgKiBUaGlzIGVmZmVjdGl2ZWx5IGRlbGV0ZXMgdGhlIGVudHJ5IGZyb20gdGhlIG1ldGFkYXRhLiBJdCBkb2Vzbid0IHByZXZlbnQgdGhlIHNhbWUKKyAgICAgKiB3b3JkIGxpc3QgdG8gYmUgZG93bmxvYWRlZCBhZ2FpbiBhdCBhIGxhdGVyIHRpbWUgaWYgdGhlIHNhbWUgb3IgYSBuZXcgdmVyc2lvbiBpcworICAgICAqIGF2YWlsYWJsZSB0aGUgbmV4dCB0aW1lIHdlIGRvd25sb2FkIHRoZSBtZXRhZGF0YS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0IHRvIG9wZW4gdGhlIGRhdGFiYXNlIG9uLgorICAgICAqIEBwYXJhbSBjbGllbnRJZCB0aGUgaWQgb2YgdGhlIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gd29yZGxpc3RJZCB0aGUgaWQgb2YgdGhlIHdvcmQgbGlzdCB0byBtYXJrIGFzIGJyb2tlbi4KKyAgICAgKiBAcGFyYW0gdmVyc2lvbiB0aGUgdmVyc2lvbiBvZiB0aGUgd29yZCBsaXN0IHRvIG1hcmsgYXMgZGVsZXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFya0FzQnJva2VuKGZpbmFsIENvbnRleHQgY29udGV4dCwgZmluYWwgU3RyaW5nIGNsaWVudElkLAorICAgICAgICAgICAgZmluYWwgU3RyaW5nIHdvcmRsaXN0SWQsIGZpbmFsIGludCB2ZXJzaW9uKSB7CisgICAgICAgIC8vIFRPRE86IGRvIHRoaXMgb24gYW5vdGhlciB0aHJlYWQgdG8gYXZvaWQgYmxvY2tpbmcgdGhlIFVJLgorICAgICAgICBNZXRhZGF0YURiSGVscGVyLmRlbGV0ZUVudHJ5KE1ldGFkYXRhRGJIZWxwZXIuZ2V0RGIoY29udGV4dCwgY2xpZW50SWQpLAorICAgICAgICAgICAgICAgIHdvcmRsaXN0SWQsIHZlcnNpb24pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL1V0aWxzLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9VdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YTQyZGIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9VdGlscy5qYXZhCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgKiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuZGljdGlvbmFyeXBhY2s7CisKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisvKioKKyAqIEEgY2xhc3MgZm9yIHZhcmlvdXMgdXRpbGl0eSBtZXRob2RzLCBlc3BlY2lhbGx5IGRlYnVnZ2luZy4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFV0aWxzIHsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHID0gVXRpbHMuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgIjpERUJVRyAtLSI7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBERUJVRyA9IERpY3Rpb25hcnlQcm92aWRlci5ERUJVRzsKKworICAgIC8qKgorICAgICAqIENhbGxzIC50b1N0cmluZygpIG9uIGl0cyBub24tbnVsbCBhcmd1bWVudCBvciByZXR1cm5zICJudWxsIgorICAgICAqIEBwYXJhbSBvIHRoZSBvYmplY3QgdG8gY29udmVydCB0byBhIHN0cmluZworICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiAudG9TdHJpbmcoKSBvciBudWxsCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcyhmaW5hbCBPYmplY3QgbykgeworICAgICAgICByZXR1cm4gbnVsbCA9PSBvID8gIm51bGwiIDogby50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjdXJyZW50IHN0YWNrIHRyYWNlLCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgorICAgICAqIEByZXR1cm4gYSByZWFkYWJsZSwgY2FycmlhZ2UtcmV0dXJuLXNlcGFyYXRlZCBzdHJpbmcgZm9yIHRoZSBjdXJyZW50IHN0YWNrIHRyYWNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0YWNrVHJhY2UoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTdGFja1RyYWNlRWxlbWVudFtdIGZyYW1lcyA9IGUuZ2V0U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgLy8gU3RhcnQgYXQgMSBiZWNhdXNlIHRoZSBmaXJzdCBmcmFtZSBpcyBoZXJlIGFuZCB3ZSBkb24ndCBjYXJlIGFib3V0IGl0CisgICAgICAgICAgICBmb3IgKGludCBqID0gMTsgaiA8IGZyYW1lcy5sZW5ndGg7ICsraikgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChmcmFtZXNbal0udG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgc3RhY2sgdHJhY2UgY29udGFpbmVkIGluIGFuIGV4Y2VwdGlvbiBhcyBhIGh1bWFuLXJlYWRhYmxlIHN0cmluZy4KKyAgICAgKiBAcGFyYW0gZSB0aGUgZXhjZXB0aW9uCisgICAgICogQHJldHVybiB0aGUgaHVtYW4tcmVhZGFibGUgc3RhY2sgdHJhY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdGFja1RyYWNlKGZpbmFsIEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBmaW5hbCBTdGFja1RyYWNlRWxlbWVudFtdIGZyYW1lcyA9IGUuZ2V0U3RhY2tUcmFjZSgpOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGZyYW1lcy5sZW5ndGg7ICsraikgeworICAgICAgICAgICAgc2IuYXBwZW5kKGZyYW1lc1tqXS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSGVscGVyIGxvZyBtZXRob2QgdG8gZWFzZSBudWxsLWNoZWNrcyBhbmQgYWRkaW5nIHNwYWNlcy4KKyAgICAgKgorICAgICAqIFRoaXMgc2VuZHMgYWxsIGFyZ3VtZW50cyB0byB0aGUgbG9nLCBzZXBhcmF0ZWQgYnkgc3BhY2VzLiBBbnkgbnVsbCBhcmd1bWVudCBpcyBjb252ZXJ0ZWQKKyAgICAgKiB0byB0aGUgIm51bGwiIHN0cmluZy4gSXQgdXNlcyBhIHZlcnkgdmlzaWJsZSB0YWcgYW5kIGxvZyBsZXZlbCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgorICAgICAqCisgICAgICogQHBhcmFtIGFyZ3MgdGhlIHN0dWZmIHRvIHNlbmQgdG8gdGhlIGxvZworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsKGZpbmFsIE9iamVjdC4uLiBhcmdzKSB7CisgICAgICAgIGlmICghREVCVUcpIHJldHVybjsKKyAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGZvciAoZmluYWwgT2JqZWN0IG8gOiBhcmdzKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQocyhvKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICIpOworICAgICAgICB9CisgICAgICAgIExvZy5lKFRBRywgc2IudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSGVscGVyIGxvZyBtZXRob2QgdG8gcHV0IHN0dWZmIGluIHJlZC4KKyAgICAgKgorICAgICAqIFRoaXMgZG9lcyB0aGUgc2FtZSBhcyAjbCBidXQgcHJpbnRzIGluIHJlZAorICAgICAqCisgICAgICogQHBhcmFtIGFyZ3MgdGhlIHN0dWZmIHRvIHNlbmQgdG8gdGhlIGxvZworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByKGZpbmFsIE9iamVjdC4uLiBhcmdzKSB7CisgICAgICAgIGlmICghREVCVUcpIHJldHVybjsKKyAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJcdTAwMUJbMzFtIik7CisgICAgICAgIGZvciAoZmluYWwgT2JqZWN0IG8gOiBhcmdzKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQocyhvKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICIpOworICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCgiXHUwMDFCWzBtIik7CisgICAgICAgIExvZy5lKFRBRywgc2IudG9TdHJpbmcoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svV29yZExpc3RNZXRhZGF0YS5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svV29yZExpc3RNZXRhZGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YmZmOTUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9Xb3JkTGlzdE1ldGFkYXRhLmphdmEKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAqIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5kaWN0aW9uYXJ5cGFjazsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOworCisvKioKKyAqIFRoZSBtZXRhZGF0YSBmb3IgYSBzaW5nbGUgd29yZCBsaXN0LgorICoKKyAqIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGFyZSBhbHdheXMgaW1tdXRhYmxlLgorICovCitwdWJsaWMgY2xhc3MgV29yZExpc3RNZXRhZGF0YSB7CisKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIG1JZDsKKyAgICBwdWJsaWMgZmluYWwgaW50IG1UeXBlOyAvLyBUeXBlLCBhcyBvZiBNZXRhZGF0YURiSGVscGVyI1RZUEVfKgorICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbURlc2NyaXB0aW9uOworICAgIHB1YmxpYyBmaW5hbCBsb25nIG1MYXN0VXBkYXRlOworICAgIHB1YmxpYyBmaW5hbCBsb25nIG1GaWxlU2l6ZTsKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIG1DaGVja3N1bTsKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIG1Mb2NhbEZpbGVuYW1lOworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbVJlbW90ZUZpbGVuYW1lOworICAgIHB1YmxpYyBmaW5hbCBpbnQgbVZlcnNpb247IC8vIHZlcnNpb24gb2YgdGhpcyB3b3JkIGxpc3QKKyAgICBwdWJsaWMgZmluYWwgaW50IG1GbGFnczsgLy8gQWx3YXlzIDAgaW4gdGhpcyB2ZXJzaW9uLCByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZQorCisgICAgLy8gVGhlIGxvY2FsZSBpcyBtYXRjaGVkIGFnYWluc3QgdGhlIGxvY2FsZSByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC4gVGhlIG1hdGNoaW5nIGFsZ29yaXRobQorICAgIC8vIGlzIGEgc3RhbmRhcmQgbG9jYWxlIG1hdGNoaW5nIHdpdGggZmFsbGJhY2s7IGl0IGlzIGltcGxlbWVudGVkIGluCisgICAgLy8gRGljdGlvbmFyeVByb3ZpZGVyI2dldERpY3Rpb25hcnlGaWxlRm9yQ29udGVudFVyaS4KKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIG1Mb2NhbGU7CisKKworICAgIC8vIFZlcnNpb24gbnVtYmVyIG9mIHRoZSBmb3JtYXQuCisgICAgLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRGljdGlvbmFyeURhdGFTZXJ2aWNlIGtub3dzIGhvdyB0byBoYW5kbGUgZm9ybWF0IDEgb25seS4KKyAgICAvLyBUaGlzIGlzIG9ubHkgZm9yIGZvcndhcmQgY29tcGF0aWJpbGl0eSwgdG8gYmUgYWJsZSB0byB1cGdyYWRlIHRoZSBmb3JtYXQgd2l0aG91dAorICAgIC8vIGJyZWFraW5nIG9sZCBpbXBsZW1lbnRhdGlvbnMuCisgICAgcHVibGljIGZpbmFsIGludCBtRm9ybWF0VmVyc2lvbjsKKworICAgIHB1YmxpYyBXb3JkTGlzdE1ldGFkYXRhKGZpbmFsIFN0cmluZyBpZCwgZmluYWwgaW50IHR5cGUsCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24sIGZpbmFsIGxvbmcgbGFzdFVwZGF0ZSwgZmluYWwgbG9uZyBmaWxlU2l6ZSwKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjaGVja3N1bSwgZmluYWwgU3RyaW5nIGxvY2FsRmlsZW5hbWUsIGZpbmFsIFN0cmluZyByZW1vdGVGaWxlbmFtZSwKKyAgICAgICAgICAgIGZpbmFsIGludCB2ZXJzaW9uLCBmaW5hbCBpbnQgZm9ybWF0VmVyc2lvbiwgZmluYWwgaW50IGZsYWdzLCBmaW5hbCBTdHJpbmcgbG9jYWxlKSB7CisgICAgICAgIG1JZCA9IGlkOworICAgICAgICBtVHlwZSA9IHR5cGU7CisgICAgICAgIG1EZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworICAgICAgICBtTGFzdFVwZGF0ZSA9IGxhc3RVcGRhdGU7IC8vIEluIG1pbGxpc2Vjb25kcworICAgICAgICBtRmlsZVNpemUgPSBmaWxlU2l6ZTsKKyAgICAgICAgbUNoZWNrc3VtID0gY2hlY2tzdW07CisgICAgICAgIG1Mb2NhbEZpbGVuYW1lID0gbG9jYWxGaWxlbmFtZTsKKyAgICAgICAgbVJlbW90ZUZpbGVuYW1lID0gcmVtb3RlRmlsZW5hbWU7CisgICAgICAgIG1WZXJzaW9uID0gdmVyc2lvbjsKKyAgICAgICAgbUZvcm1hdFZlcnNpb24gPSBmb3JtYXRWZXJzaW9uOworICAgICAgICBtRmxhZ3MgPSBmbGFnczsKKyAgICAgICAgbUxvY2FsZSA9IGxvY2FsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBXb3JkTGlzdE1ldGFkYXRhIGZyb20gdGhlIGNvbnRlbnRzIG9mIGEgQ29udGVudFZhbHVlcy4KKyAgICAgKgorICAgICAqIElmIHRoaXMgbGFja3MgYW55IHJlcXVpcmVkIGZpZWxkLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgV29yZExpc3RNZXRhZGF0YSBjcmVhdGVGcm9tQ29udGVudFZhbHVlcyhmaW5hbCBDb250ZW50VmFsdWVzIHZhbHVlcykgeworICAgICAgICBmaW5hbCBTdHJpbmcgaWQgPSB2YWx1ZXMuZ2V0QXNTdHJpbmcoTWV0YWRhdGFEYkhlbHBlci5XT1JETElTVElEX0NPTFVNTik7CisgICAgICAgIGZpbmFsIEludGVnZXIgdHlwZSA9IHZhbHVlcy5nZXRBc0ludGVnZXIoTWV0YWRhdGFEYkhlbHBlci5UWVBFX0NPTFVNTik7CisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbiA9IHZhbHVlcy5nZXRBc1N0cmluZyhNZXRhZGF0YURiSGVscGVyLkRFU0NSSVBUSU9OX0NPTFVNTik7CisgICAgICAgIGZpbmFsIExvbmcgbGFzdFVwZGF0ZSA9IHZhbHVlcy5nZXRBc0xvbmcoTWV0YWRhdGFEYkhlbHBlci5EQVRFX0NPTFVNTik7CisgICAgICAgIGZpbmFsIExvbmcgZmlsZVNpemUgPSB2YWx1ZXMuZ2V0QXNMb25nKE1ldGFkYXRhRGJIZWxwZXIuRklMRVNJWkVfQ09MVU1OKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGNoZWNrc3VtID0gdmFsdWVzLmdldEFzU3RyaW5nKE1ldGFkYXRhRGJIZWxwZXIuQ0hFQ0tTVU1fQ09MVU1OKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGxvY2FsRmlsZW5hbWUgPSB2YWx1ZXMuZ2V0QXNTdHJpbmcoTWV0YWRhdGFEYkhlbHBlci5MT0NBTF9GSUxFTkFNRV9DT0xVTU4pOworICAgICAgICBmaW5hbCBTdHJpbmcgcmVtb3RlRmlsZW5hbWUgPSB2YWx1ZXMuZ2V0QXNTdHJpbmcoTWV0YWRhdGFEYkhlbHBlci5SRU1PVEVfRklMRU5BTUVfQ09MVU1OKTsKKyAgICAgICAgZmluYWwgSW50ZWdlciB2ZXJzaW9uID0gdmFsdWVzLmdldEFzSW50ZWdlcihNZXRhZGF0YURiSGVscGVyLlZFUlNJT05fQ09MVU1OKTsKKyAgICAgICAgZmluYWwgSW50ZWdlciBmb3JtYXRWZXJzaW9uID0gdmFsdWVzLmdldEFzSW50ZWdlcihNZXRhZGF0YURiSGVscGVyLkZPUk1BVFZFUlNJT05fQ09MVU1OKTsKKyAgICAgICAgZmluYWwgSW50ZWdlciBmbGFncyA9IHZhbHVlcy5nZXRBc0ludGVnZXIoTWV0YWRhdGFEYkhlbHBlci5GTEFHU19DT0xVTU4pOworICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYWxlID0gdmFsdWVzLmdldEFzU3RyaW5nKE1ldGFkYXRhRGJIZWxwZXIuTE9DQUxFX0NPTFVNTik7CisgICAgICAgIGlmIChudWxsID09IGlkCisgICAgICAgICAgICAgICAgfHwgbnVsbCA9PSB0eXBlCisgICAgICAgICAgICAgICAgfHwgbnVsbCA9PSBkZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgIHx8IG51bGwgPT0gbGFzdFVwZGF0ZQorICAgICAgICAgICAgICAgIHx8IG51bGwgPT0gZmlsZVNpemUKKyAgICAgICAgICAgICAgICB8fCBudWxsID09IGNoZWNrc3VtCisgICAgICAgICAgICAgICAgfHwgbnVsbCA9PSBsb2NhbEZpbGVuYW1lCisgICAgICAgICAgICAgICAgfHwgbnVsbCA9PSByZW1vdGVGaWxlbmFtZQorICAgICAgICAgICAgICAgIHx8IG51bGwgPT0gdmVyc2lvbgorICAgICAgICAgICAgICAgIHx8IG51bGwgPT0gZm9ybWF0VmVyc2lvbgorICAgICAgICAgICAgICAgIHx8IG51bGwgPT0gZmxhZ3MKKyAgICAgICAgICAgICAgICB8fCBudWxsID09IGxvY2FsZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgV29yZExpc3RNZXRhZGF0YShpZCwgdHlwZSwgZGVzY3JpcHRpb24sIGxhc3RVcGRhdGUsIGZpbGVTaXplLCBjaGVja3N1bSwKKyAgICAgICAgICAgICAgICBsb2NhbEZpbGVuYW1lLCByZW1vdGVGaWxlbmFtZSwgdmVyc2lvbiwgZm9ybWF0VmVyc2lvbiwgZmxhZ3MsIGxvY2FsZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKFdvcmRMaXN0TWV0YWRhdGEuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsKKyAgICAgICAgc2IuYXBwZW5kKCIgOiAiKS5hcHBlbmQobUlkKTsKKyAgICAgICAgc2IuYXBwZW5kKCJcblR5cGUgOiAiKS5hcHBlbmQobVR5cGUpOworICAgICAgICBzYi5hcHBlbmQoIlxuRGVzY3JpcHRpb24gOiAiKS5hcHBlbmQobURlc2NyaXB0aW9uKTsKKyAgICAgICAgc2IuYXBwZW5kKCJcbkxhc3RVcGRhdGUgOiAiKS5hcHBlbmQobUxhc3RVcGRhdGUpOworICAgICAgICBzYi5hcHBlbmQoIlxuRmlsZVNpemUgOiAiKS5hcHBlbmQobUZpbGVTaXplKTsKKyAgICAgICAgc2IuYXBwZW5kKCJcbkNoZWNrc3VtIDogIikuYXBwZW5kKG1DaGVja3N1bSk7CisgICAgICAgIHNiLmFwcGVuZCgiXG5Mb2NhbEZpbGVuYW1lIDogIikuYXBwZW5kKG1Mb2NhbEZpbGVuYW1lKTsKKyAgICAgICAgc2IuYXBwZW5kKCJcblJlbW90ZUZpbGVuYW1lIDogIikuYXBwZW5kKG1SZW1vdGVGaWxlbmFtZSk7CisgICAgICAgIHNiLmFwcGVuZCgiXG5WZXJzaW9uIDogIikuYXBwZW5kKG1WZXJzaW9uKTsKKyAgICAgICAgc2IuYXBwZW5kKCJcbkZvcm1hdFZlcnNpb24gOiAiKS5hcHBlbmQobUZvcm1hdFZlcnNpb24pOworICAgICAgICBzYi5hcHBlbmQoIlxuRmxhZ3MgOiAiKS5hcHBlbmQobUZsYWdzKTsKKyAgICAgICAgc2IuYXBwZW5kKCJcbkxvY2FsZSA6ICIpLmFwcGVuZChtTG9jYWxlKTsKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svV29yZExpc3RQcmVmZXJlbmNlLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9Xb3JkTGlzdFByZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDkyM2FlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svV29yZExpc3RQcmVmZXJlbmNlLmphdmEKQEAgLTAsMCArMSwyNDggQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5CisgKiBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuZGljdGlvbmFyeXBhY2s7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOworaW1wb3J0IGFuZHJvaWQucHJlZmVyZW5jZS5EaWFsb2dQcmVmZXJlbmNlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi5SOworCitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworLyoqCisgKiBBIHByZWZlcmVuY2UgZm9yIG9uZSB3b3JkIGxpc3QuCisgKgorICogVGhpcyBwcmVmZXJlbmNlIHJlZmVycyB0byBhIHNpbmdsZSB3b3JkIGxpc3QsIGFzIGF2YWlsYWJsZSBpbiB0aGUgZGljdGlvbmFyeQorICogcGFjay4gVXBvbiBiZWluZyBwcmVzc2VkLCBpdCBkaXNwbGF5cyBhIG1lbnUgdG8gYWxsb3cgdGhlIHVzZXIgdG8gaW5zdGFsbCwgZGlzYWJsZSwKKyAqIGVuYWJsZSBvciBkZWxldGUgaXQgYXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB3b3JkIGxpc3QuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBXb3JkTGlzdFByZWZlcmVuY2UgZXh0ZW5kcyBEaWFsb2dQcmVmZXJlbmNlIHsKKyAgICBzdGF0aWMgZmluYWwgcHJpdmF0ZSBTdHJpbmcgVEFHID0gV29yZExpc3RQcmVmZXJlbmNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKworICAgIC8vIFdoYXQgdG8gZGlzcGxheSBpbiB0aGUgInN0YXR1cyIgZmllbGQgd2hlbiB3ZSByZWNlaXZlIHVua25vd24gZGF0YSBhcyBhIHN0YXR1cyBmcm9tCisgICAgLy8gdGhlIGNvbnRlbnQgcHJvdmlkZXIuIEVtcHR5IHN0cmluZyBzb3VuZHMgc2Vuc2libGUuCisgICAgc3RhdGljIGZpbmFsIHByaXZhdGUgU3RyaW5nIE5PX1NUQVRVU19NRVNTQUdFID0gIiI7CisKKyAgICAvLy8gQWN0aW9ucworICAgIHN0YXRpYyBmaW5hbCBwcml2YXRlIGludCBBQ1RJT05fVU5LTk9XTiA9IDA7CisgICAgc3RhdGljIGZpbmFsIHByaXZhdGUgaW50IEFDVElPTl9FTkFCTEVfRElDVCA9IDE7CisgICAgc3RhdGljIGZpbmFsIHByaXZhdGUgaW50IEFDVElPTl9ESVNBQkxFX0RJQ1QgPSAyOworICAgIHN0YXRpYyBmaW5hbCBwcml2YXRlIGludCBBQ1RJT05fREVMRVRFX0RJQ1QgPSAzOworCisgICAgLy8gTWVtYmVycworICAgIC8vIFRoZSBjb250ZXh0IHRvIGdldCByZXNvdXJjZXMKKyAgICBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworICAgIC8vIFRoZSBpZCBvZiB0aGUgY2xpZW50IGZvciB3aGljaCB0aGlzIHByZWZlcmVuY2UgaXMuCisgICAgZmluYWwgU3RyaW5nIG1DbGllbnRJZDsKKyAgICAvLyBUaGUgbWV0YWRhdGEgd29yZCBsaXN0IGlkIGFuZCB2ZXJzaW9uIG9mIHRoaXMgd29yZCBsaXN0LgorICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbVdvcmRsaXN0SWQ7CisgICAgcHVibGljIGZpbmFsIGludCBtVmVyc2lvbjsKKyAgICAvLyBUaGUgc3RhdHVzCisgICAgcHVibGljIGludCBtU3RhdHVzOworCisgICAgLy8gQW5pbWF0aW9uIGRpcmVjdGlvbnMKKyAgICBzdGF0aWMgZmluYWwgcHJpdmF0ZSBpbnQgQU5JTUFUSU9OX0lOID0gMTsKKyAgICBzdGF0aWMgZmluYWwgcHJpdmF0ZSBpbnQgQU5JTUFUSU9OX09VVCA9IDI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBCdXR0b24gc0xhc3RDbGlja2VkQWN0aW9uQnV0dG9uID0gbnVsbDsKKyAgICBwcml2YXRlIGZpbmFsIE9uV29yZExpc3RQcmVmZXJlbmNlQ2xpY2sgbVByZWZlcmVuY2VDbGlja0hhbmRsZXIgPQorICAgICAgICAgICAgbmV3IE9uV29yZExpc3RQcmVmZXJlbmNlQ2xpY2soKTsKKyAgICBwcml2YXRlIGZpbmFsIE9uQWN0aW9uQnV0dG9uQ2xpY2sgbUFjdGlvbkJ1dHRvbkNsaWNrSGFuZGxlciA9CisgICAgICAgICAgICBuZXcgT25BY3Rpb25CdXR0b25DbGljaygpOworCisgICAgcHVibGljIFdvcmRMaXN0UHJlZmVyZW5jZShmaW5hbCBDb250ZXh0IGNvbnRleHQsIGZpbmFsIFN0cmluZyBjbGllbnRJZCwgZmluYWwgU3RyaW5nIHdvcmRsaXN0SWQsCisgICAgICAgICAgICBmaW5hbCBpbnQgdmVyc2lvbiwgZmluYWwgTG9jYWxlIGxvY2FsZSwgZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uLCBmaW5hbCBpbnQgc3RhdHVzKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIG51bGwpOworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIG1DbGllbnRJZCA9IGNsaWVudElkOworICAgICAgICBtVmVyc2lvbiA9IHZlcnNpb247CisgICAgICAgIG1Xb3JkbGlzdElkID0gd29yZGxpc3RJZDsKKworICAgICAgICBzZXRMYXlvdXRSZXNvdXJjZShSLmxheW91dC5kaWN0aW9uYXJ5X2xpbmUpOworCisgICAgICAgIHNldFRpdGxlKGRlc2NyaXB0aW9uKTsKKyAgICAgICAgc2V0U3RhdHVzKHN0YXR1cyk7CisgICAgICAgIHNldEtleSh3b3JkbGlzdElkKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0U3RhdHVzKGZpbmFsIGludCBzdGF0dXMpIHsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBtU3RhdHVzKSByZXR1cm47CisgICAgICAgIG1TdGF0dXMgPSBzdGF0dXM7CisgICAgICAgIHNldFN1bW1hcnkoZ2V0U3VtbWFyeShzdGF0dXMpKTsKKyAgICAgICAgLy8gSWYgd2UgYXJlIGN1cnJlbnRseSBkaXNwbGF5aW5nIHRoZSBkaWFsb2csIHdlIHNob3VsZCB1cGRhdGUgaXQsIG9yIGF0IGxlYXN0CisgICAgICAgIC8vIGRpc21pc3MgaXQuCisgICAgICAgIGZpbmFsIERpYWxvZyBkaWFsb2cgPSBnZXREaWFsb2coKTsKKyAgICAgICAgaWYgKG51bGwgIT0gZGlhbG9nKSB7CisgICAgICAgICAgICBkaWFsb2cuZGlzbWlzcygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U3VtbWFyeShmaW5hbCBpbnQgc3RhdHVzKSB7CisgICAgICAgIHN3aXRjaCAoc3RhdHVzKSB7CisgICAgICAgICAgICAvLyBJZiB3ZSBhcmUgZGVsZXRpbmcgdGhlIHdvcmQgbGlzdCwgZm9yIHRoZSB1c2VyIGl0J3MgbGlrZSBpdCdzIGFscmVhZHkgZGVsZXRlZC4KKyAgICAgICAgICAgIC8vIEl0IHNob3VsZCBiZSByZWluc3RhbGxhYmxlLiBFeHBvc2luZyB0byB0aGUgdXNlciB0aGUgd2hvbGUgY29tcGxleGl0eSBvZgorICAgICAgICAgICAgLy8gdGhlIGRlbGF5ZWQgZGVsZXRpb24gcHJvY2VzcyBiZXR3ZWVuIHRoZSBkaWN0aW9uYXJ5IHBhY2sgYW5kIEFuZHJvaWQgS2V5Ym9hcmQKKyAgICAgICAgICAgIC8vIHdvdWxkIG9ubHkgYmUgY29uZnVzaW5nLgorICAgICAgICAgICAgY2FzZSBNZXRhZGF0YURiSGVscGVyLlNUQVRVU19ERUxFVElORzoKKyAgICAgICAgICAgIGNhc2UgTWV0YWRhdGFEYkhlbHBlci5TVEFUVVNfQVZBSUxBQkxFOgorICAgICAgICAgICAgICAgIHJldHVybiBtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcuZGljdGlvbmFyeV9hdmFpbGFibGUpOworICAgICAgICAgICAgY2FzZSBNZXRhZGF0YURiSGVscGVyLlNUQVRVU19ET1dOTE9BRElORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gbUNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLmRpY3Rpb25hcnlfZG93bmxvYWRpbmcpOworICAgICAgICAgICAgY2FzZSBNZXRhZGF0YURiSGVscGVyLlNUQVRVU19JTlNUQUxMRUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5kaWN0aW9uYXJ5X2luc3RhbGxlZCk7CisgICAgICAgICAgICBjYXNlIE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0RJU0FCTEVEOgorICAgICAgICAgICAgICAgIHJldHVybiBtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcuZGljdGlvbmFyeV9kaXNhYmxlZCk7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBOT19TVEFUVVNfTUVTU0FHRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBzU3RhdHVzQWN0aW9uTGlzdFtdW10gPSB7CisgICAgICAgIC8vIE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX1VOS05PV04KKyAgICAgICAge30sCisgICAgICAgIC8vIE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0FWQUlMQUJMRQorICAgICAgICB7IFIuc3RyaW5nLmluc3RhbGxfZGljdCwgQUNUSU9OX0VOQUJMRV9ESUNUIH0sCisgICAgICAgIC8vIE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0RPV05MT0FESU5HCisgICAgICAgIHsgUi5zdHJpbmcuY2FuY2VsX2Rvd25sb2FkX2RpY3QsIEFDVElPTl9ESVNBQkxFX0RJQ1QgfSwKKyAgICAgICAgLy8gTWV0YWRhdGFEYkhlbHBlci5TVEFUVVNfSU5TVEFMTEVECisgICAgICAgIHsgUi5zdHJpbmcuZGVsZXRlX2RpY3QsIEFDVElPTl9ERUxFVEVfRElDVCB9LAorICAgICAgICAvLyBNZXRhZGF0YURiSGVscGVyLlNUQVRVU19ESVNBQkxFRAorICAgICAgICB7IFIuc3RyaW5nLmRlbGV0ZV9kaWN0LCBBQ1RJT05fREVMRVRFX0RJQ1QgfSwKKyAgICAgICAgLy8gTWV0YWRhdGFEYkhlbHBlci5TVEFUVVNfREVMRVRJTkcKKyAgICAgICAgLy8gV2Ugc2hvdyAnaW5zdGFsbCcgYmVjYXVzZSB0aGUgZmlsZSBpcyBzdXBwb3NlZCB0byBiZSBkZWxldGVkLgorICAgICAgICAvLyBUaGUgdXNlciBtYXkgcmVpbnN0YWxsIGl0LgorICAgICAgICB7IFIuc3RyaW5nLmluc3RhbGxfZGljdCwgQUNUSU9OX0VOQUJMRV9ESUNUIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgZ2V0QnV0dG9uTGFiZWwoZmluYWwgaW50IHN0YXR1cykgeworICAgICAgICBpZiAoc3RhdHVzID49IHNTdGF0dXNBY3Rpb25MaXN0Lmxlbmd0aCkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5rbm93biBzdGF0dXMgIiArIHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1Db250ZXh0LmdldFN0cmluZyhzU3RhdHVzQWN0aW9uTGlzdFtzdGF0dXNdWzBdKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0QWN0aW9uSWRGcm9tU3RhdHVzQW5kTWVudUVudHJ5KGZpbmFsIGludCBzdGF0dXMpIHsKKyAgICAgICAgaWYgKHN0YXR1cyA+PSBzU3RhdHVzQWN0aW9uTGlzdC5sZW5ndGgpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIlVua25vd24gc3RhdHVzICIgKyBzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIEFDVElPTl9VTktOT1dOOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzU3RhdHVzQWN0aW9uTGlzdFtzdGF0dXNdWzFdOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkaXNhYmxlRGljdCgpIHsKKyAgICAgICAgU2hhcmVkUHJlZmVyZW5jZXMgcHJlZnMgPSBDb21tb25QcmVmZXJlbmNlcy5nZXRDb21tb25QcmVmZXJlbmNlcyhtQ29udGV4dCk7CisgICAgICAgIENvbW1vblByZWZlcmVuY2VzLmRpc2FibGUocHJlZnMsIG1Xb3JkbGlzdElkKTsKKyAgICAgICAgVXBkYXRlSGFuZGxlci5tYXJrQXNVbnVzZWQobUNvbnRleHQsIG1DbGllbnRJZCwgbVdvcmRsaXN0SWQsIG1WZXJzaW9uLCBtU3RhdHVzKTsKKyAgICAgICAgaWYgKE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0RPV05MT0FESU5HID09IG1TdGF0dXMpIHsKKyAgICAgICAgICAgIHNldFN0YXR1cyhNZXRhZGF0YURiSGVscGVyLlNUQVRVU19BVkFJTEFCTEUpOworICAgICAgICB9IGVsc2UgaWYgKE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0lOU1RBTExFRCA9PSBtU3RhdHVzKSB7CisgICAgICAgICAgICAvLyBJbnRlcmZhY2Utd2lzZSwgd2Ugc2hvdWxkIG5vIGxvbmdlciBiZSBhYmxlIHRvIGNvbWUgaGVyZS4gSG93ZXZlciwgdGhpcyBpcyBzdGlsbAorICAgICAgICAgICAgLy8gdGhlIHJpZ2h0IHRoaW5nIHRvIGRvIGlmIHdlIGRvIGNvbWUgaGVyZS4KKyAgICAgICAgICAgIHNldFN0YXR1cyhNZXRhZGF0YURiSGVscGVyLlNUQVRVU19ESVNBQkxFRCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJVbmV4cGVjdGVkIHN0YXRlIG9mIHRoZSB3b3JkIGxpc3QgZm9yIGRpc2FibGluZyAiICsgbVN0YXR1cyk7CisgICAgICAgIH0KKyAgICB9CisgICAgcHJpdmF0ZSB2b2lkIGVuYWJsZURpY3QoKSB7CisgICAgICAgIFNoYXJlZFByZWZlcmVuY2VzIHByZWZzID0gQ29tbW9uUHJlZmVyZW5jZXMuZ2V0Q29tbW9uUHJlZmVyZW5jZXMobUNvbnRleHQpOworICAgICAgICBDb21tb25QcmVmZXJlbmNlcy5lbmFibGUocHJlZnMsIG1Xb3JkbGlzdElkKTsKKyAgICAgICAgLy8gRXhwbGljaXQgZW5hYmxpbmcgYnkgdGhlIHVzZXIgOiBhbGxvdyBkb3dubG9hZGluZyBvbiBtZXRlcmVkIGRhdGEgY29ubmVjdGlvbi4KKyAgICAgICAgVXBkYXRlSGFuZGxlci5tYXJrQXNVc2VkKG1Db250ZXh0LCBtQ2xpZW50SWQsIG1Xb3JkbGlzdElkLCBtVmVyc2lvbiwgbVN0YXR1cywgdHJ1ZSk7CisgICAgICAgIGlmIChNZXRhZGF0YURiSGVscGVyLlNUQVRVU19BVkFJTEFCTEUgPT0gbVN0YXR1cykgeworICAgICAgICAgICAgc2V0U3RhdHVzKE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0RPV05MT0FESU5HKTsKKyAgICAgICAgfSBlbHNlIGlmIChNZXRhZGF0YURiSGVscGVyLlNUQVRVU19ESVNBQkxFRCA9PSBtU3RhdHVzCisgICAgICAgICAgICAgICAgfHwgTWV0YWRhdGFEYkhlbHBlci5TVEFUVVNfREVMRVRJTkcgPT0gbVN0YXR1cykgeworICAgICAgICAgICAgLy8gSWYgdGhlIHN0YXR1cyBpcyBERUxFVElORywgaXQgbWVhbnMgQW5kcm9pZCBLZXlib2FyZAorICAgICAgICAgICAgLy8gaGFzIG5vdCBkZWxldGVkIHRoZSB3b3JkIGxpc3QgeWV0LCBzbyB3ZSBjYW4gc2FmZWx5CisgICAgICAgICAgICAvLyB0dXJuIGl0IHRvICdpbnN0YWxsZWQnLiBUaGUgc3RhdHVzIERJU0FCTEVEIGlzIHN0aWxsIHN1cHBvcnRlZCBpbnRlcm5hbGx5IHRvCisgICAgICAgICAgICAvLyBhdm9pZCBicmVha2luZyBvbGRlciBpbnN0YWxsYXRpb25zIGFuZCBhbGwgYnV0IHRoZXJlIHNob3VsZCBub3QgYmUgYSB3YXkgdG8KKyAgICAgICAgICAgIC8vIGRpc2FibGUgYSB3b3JkIGxpc3QgdGhyb3VnaCB0aGUgaW50ZXJmYWNlIGFueSBtb3JlLgorICAgICAgICAgICAgc2V0U3RhdHVzKE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0lOU1RBTExFRCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJVbmV4cGVjdGVkIHN0YXRlIG9mIHRoZSB3b3JkIGxpc3QgZm9yIGVuYWJsaW5nICIgKyBtU3RhdHVzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwcml2YXRlIHZvaWQgZGVsZXRlRGljdCgpIHsKKyAgICAgICAgU2hhcmVkUHJlZmVyZW5jZXMgcHJlZnMgPSBDb21tb25QcmVmZXJlbmNlcy5nZXRDb21tb25QcmVmZXJlbmNlcyhtQ29udGV4dCk7CisgICAgICAgIENvbW1vblByZWZlcmVuY2VzLmRpc2FibGUocHJlZnMsIG1Xb3JkbGlzdElkKTsKKyAgICAgICAgc2V0U3RhdHVzKE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0RFTEVUSU5HKTsKKyAgICAgICAgVXBkYXRlSGFuZGxlci5tYXJrQXNEZWxldGluZyhtQ29udGV4dCwgbUNsaWVudElkLCBtV29yZGxpc3RJZCwgbVZlcnNpb24sIG1TdGF0dXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQmluZFZpZXcoZmluYWwgVmlldyB2aWV3KSB7CisgICAgICAgIHN1cGVyLm9uQmluZFZpZXcodmlldyk7CisgICAgICAgICgoVmlld0dyb3VwKXZpZXcpLnNldExheW91dFRyYW5zaXRpb24obnVsbCk7CisgICAgICAgIGZpbmFsIEJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKXZpZXcuZmluZFZpZXdCeUlkKFIuaWQud29yZGxpc3RfYnV0dG9uKTsKKyAgICAgICAgYnV0dG9uLnNldFRleHQoZ2V0QnV0dG9uTGFiZWwobVN0YXR1cykpOworICAgICAgICBidXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7CisgICAgICAgIGJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobUFjdGlvbkJ1dHRvbkNsaWNrSGFuZGxlcik7CisgICAgICAgIHZpZXcuc2V0T25DbGlja0xpc3RlbmVyKG1QcmVmZXJlbmNlQ2xpY2tIYW5kbGVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIE9uV29yZExpc3RQcmVmZXJlbmNlQ2xpY2sgaW1wbGVtZW50cyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKGZpbmFsIFZpZXcgdikgeworICAgICAgICAgICAgZmluYWwgQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pdi5maW5kVmlld0J5SWQoUi5pZC53b3JkbGlzdF9idXR0b24pOworICAgICAgICAgICAgaWYgKG51bGwgIT0gc0xhc3RDbGlja2VkQWN0aW9uQnV0dG9uKSB7CisgICAgICAgICAgICAgICAgYW5pbWF0ZUJ1dHRvbihzTGFzdENsaWNrZWRBY3Rpb25CdXR0b24sIEFOSU1BVElPTl9PVVQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYW5pbWF0ZUJ1dHRvbihidXR0b24sIEFOSU1BVElPTl9JTik7CisgICAgICAgICAgICBzTGFzdENsaWNrZWRBY3Rpb25CdXR0b24gPSBidXR0b247CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYW5pbWF0ZUJ1dHRvbihmaW5hbCBCdXR0b24gYnV0dG9uLCBmaW5hbCBpbnQgZGlyZWN0aW9uKSB7CisgICAgICAgIGZpbmFsIGZsb2F0IG91dGVyWCA9ICgoVmlldylidXR0b24uZ2V0UGFyZW50KCkpLmdldFdpZHRoKCk7CisgICAgICAgIGZpbmFsIGZsb2F0IGlubmVyWCA9IGJ1dHRvbi5nZXRYKCkgLSBidXR0b24uZ2V0VHJhbnNsYXRpb25YKCk7CisgICAgICAgIGlmIChWaWV3LklOVklTSUJMRSA9PSBidXR0b24uZ2V0VmlzaWJpbGl0eSgpKSB7CisgICAgICAgICAgICBidXR0b24uc2V0VHJhbnNsYXRpb25YKG91dGVyWCAtIGlubmVyWCk7CisgICAgICAgICAgICBidXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICB9CisgICAgICAgIGlmIChBTklNQVRJT05fSU4gPT0gZGlyZWN0aW9uKSB7CisgICAgICAgICAgICBidXR0b24uYW5pbWF0ZSgpLnRyYW5zbGF0aW9uWCgwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1dHRvbi5hbmltYXRlKCkudHJhbnNsYXRpb25YKG91dGVyWCAtIGlubmVyWCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIE9uQWN0aW9uQnV0dG9uQ2xpY2sgaW1wbGVtZW50cyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKGZpbmFsIFZpZXcgdikgeworICAgICAgICAgICAgc3dpdGNoIChnZXRBY3Rpb25JZEZyb21TdGF0dXNBbmRNZW51RW50cnkobVN0YXR1cykpIHsKKyAgICAgICAgICAgIGNhc2UgQUNUSU9OX0VOQUJMRV9ESUNUOgorICAgICAgICAgICAgICAgIGVuYWJsZURpY3QoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQUNUSU9OX0RJU0FCTEVfRElDVDoKKyAgICAgICAgICAgICAgICBkaXNhYmxlRGljdCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBQ1RJT05fREVMRVRFX0RJQ1Q6CisgICAgICAgICAgICAgICAgZGVsZXRlRGljdCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJVbmtub3duIG1lbnUgaXRlbSBwcmVzc2VkIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9rZXlib2FyZC9LZXlib2FyZFZpZXcuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL0tleWJvYXJkVmlldy5qYXZhCmluZGV4IDM1MGRjNjkuLjQzZDI4YmUgMTAwNjQ0Ci0tLSBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL0tleWJvYXJkVmlldy5qYXZhCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL0tleWJvYXJkVmlldy5qYXZhCkBAIC0yODcsMTAgKzI4NywxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLy8gUmVzZWFyY2hMb2dnaW5nIGluZGljYXRvci4KKyAgICAgICAgLy8gUmVzZWFyY2ggTG9nZ2luZyAoRGV2ZWxvcG1lbnQgT25seSBEaWFnbm9zdGljcykgaW5kaWNhdG9yLgogICAgICAgICAvLyBUT0RPOiBSZWltcGxlbWVudCB1c2luZyBhIGtleWJvYXJkIGJhY2tncm91bmQgaW1hZ2Ugc3BlY2lmaWMgdG8gdGhlIFJlc2VhcmNoTG9nZ2VyLAogICAgICAgICAvLyBhbmQgcmVtb3ZlIHRoaXMgY2FsbC4KLSAgICAgICAgaWYgKFByb2R1Y3Rpb25GbGFnLklTX0VYUEVSSU1FTlRBTCkgeworICAgICAgICBpZiAoUHJvZHVjdGlvbkZsYWcuVVNFU19ERVZFTE9QTUVOVF9PTkxZX0RJQUdOT1NUSUNTKSB7CiAgICAgICAgICAgICBSZXNlYXJjaExvZ2dlci5nZXRJbnN0YW5jZSgpLnBhaW50SW5kaWNhdG9yKHRoaXMsIHBhaW50LCBjYW52YXMsIHdpZHRoLCBoZWlnaHQpOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL01haW5LZXlib2FyZFZpZXcuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL01haW5LZXlib2FyZFZpZXcuamF2YQppbmRleCBkMzdiNjliLi5mMGNhOWMxIDEwMDY0NAotLS0gYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9rZXlib2FyZC9NYWluS2V5Ym9hcmRWaWV3LmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2Qva2V5Ym9hcmQvTWFpbktleWJvYXJkVmlldy5qYXZhCkBAIC02NjIsNyArNjYyLDcgQEAKICAgICAgICAgICAgICAgICA/IG1TcGFjZUtleS5nZXRJY29uKGtleWJvYXJkLm1JY29uc1NldCwgQ29uc3RhbnRzLkNvbG9yLkFMUEhBX09QQVFVRSkgOiBudWxsOwogICAgICAgICBmaW5hbCBpbnQga2V5SGVpZ2h0ID0ga2V5Ym9hcmQubU1vc3RDb21tb25LZXlIZWlnaHQgLSBrZXlib2FyZC5tVmVydGljYWxHYXA7CiAgICAgICAgIG1TcGFjZWJhclRleHRTaXplID0ga2V5SGVpZ2h0ICogbVNwYWNlYmFyVGV4dFJhdGlvOwotICAgICAgICBpZiAoUHJvZHVjdGlvbkZsYWcuSVNfRVhQRVJJTUVOVEFMKSB7CisgICAgICAgIGlmIChQcm9kdWN0aW9uRmxhZy5VU0VTX0RFVkVMT1BNRU5UX09OTFlfRElBR05PU1RJQ1MpIHsKICAgICAgICAgICAgIFJlc2VhcmNoTG9nZ2VyLm1haW5LZXlib2FyZFZpZXdfc2V0S2V5Ym9hcmQoa2V5Ym9hcmQpOwogICAgICAgICB9CiAKQEAgLTkyNSwxMCArOTI1LDEwIEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCkgewogICAgICAgICBzdXBlci5vbkF0dGFjaGVkVG9XaW5kb3coKTsKLSAgICAgICAgLy8gTm90aWZ5IHRoZSByZXNlYXJjaCBsb2dnZXIgdGhhdCB0aGUga2V5Ym9hcmQgdmlldyBoYXMgYmVlbiBhdHRhY2hlZC4gIFRoaXMgaXMgbmVlZGVkCi0gICAgICAgIC8vIHRvIHByb3Blcmx5IHNob3cgdGhlIHNwbGFzaCBzY3JlZW4sIHdoaWNoIHJlcXVpcmVzIHRoYXQgdGhlIHdpbmRvdyB0b2tlbiBvZiB0aGUKLSAgICAgICAgLy8gS2V5Ym9hcmRWaWV3IGJlIG5vbi1udWxsLgotICAgICAgICBpZiAoUHJvZHVjdGlvbkZsYWcuSVNfRVhQRVJJTUVOVEFMKSB7CisgICAgICAgIC8vIE5vdGlmeSB0aGUgUmVzZWFyY2hMb2dnZXIgKGRldmVsb3BtZW50IG9ubHkgZGlhZ25vc3RpY3MpIHRoYXQgdGhlIGtleWJvYXJkIHZpZXcgaGFzCisgICAgICAgIC8vIGJlZW4gYXR0YWNoZWQuICBUaGlzIGlzIG5lZWRlZCB0byBwcm9wZXJseSBzaG93IHRoZSBzcGxhc2ggc2NyZWVuLCB3aGljaCByZXF1aXJlcyB0aGF0CisgICAgICAgIC8vIHRoZSB3aW5kb3cgdG9rZW4gb2YgdGhlIEtleWJvYXJkVmlldyBiZSBub24tbnVsbC4KKyAgICAgICAgaWYgKFByb2R1Y3Rpb25GbGFnLlVTRVNfREVWRUxPUE1FTlRfT05MWV9ESUFHTk9TVElDUykgewogICAgICAgICAgICAgUmVzZWFyY2hMb2dnZXIuZ2V0SW5zdGFuY2UoKS5tYWluS2V5Ym9hcmRWaWV3X29uQXR0YWNoZWRUb1dpbmRvdyh0aGlzKTsKICAgICAgICAgfQogICAgIH0KQEAgLTkzNyw5ICs5MzcsMTAgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKICAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3coKTsKICAgICAgICAgbVByZXZpZXdQbGFjZXJWaWV3LnJlbW92ZUFsbFZpZXdzKCk7Ci0gICAgICAgIC8vIE5vdGlmeSB0aGUgcmVzZWFyY2ggbG9nZ2VyIHRoYXQgdGhlIGtleWJvYXJkIHZpZXcgaGFzIGJlZW4gZGV0YWNoZWQuICBUaGlzIGlzIG5lZWRlZAotICAgICAgICAvLyB0byBpbnZhbGlkYXRlIHRoZSByZWZlcmVuY2Ugb2Yge0BsaW5rIE1haW5LZXlib2FyZFZpZXd9IHRvIG51bGwuCi0gICAgICAgIGlmIChQcm9kdWN0aW9uRmxhZy5JU19FWFBFUklNRU5UQUwpIHsKKyAgICAgICAgLy8gTm90aWZ5IHRoZSBSZXNlYXJjaExvZ2dlciAoZGV2ZWxvcG1lbnQgb25seSBkaWFnbm9zdGljcykgdGhhdCB0aGUga2V5Ym9hcmQgdmlldyBoYXMKKyAgICAgICAgLy8gYmVlbiBkZXRhY2hlZC4gIFRoaXMgaXMgbmVlZGVkIHRvIGludmFsaWRhdGUgdGhlIHJlZmVyZW5jZSBvZiB7QGxpbmsgTWFpbktleWJvYXJkVmlld30KKyAgICAgICAgLy8gdG8gbnVsbC4KKyAgICAgICAgaWYgKFByb2R1Y3Rpb25GbGFnLlVTRVNfREVWRUxPUE1FTlRfT05MWV9ESUFHTk9TVElDUykgewogICAgICAgICAgICAgUmVzZWFyY2hMb2dnZXIuZ2V0SW5zdGFuY2UoKS5tYWluS2V5Ym9hcmRWaWV3X29uRGV0YWNoZWRGcm9tV2luZG93KCk7CiAgICAgICAgIH0KICAgICB9CkBAIC05NzcsNyArOTc4LDcgQEAKICAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKFByb2R1Y3Rpb25GbGFnLklTX0VYUEVSSU1FTlRBTCkgeworICAgICAgICBpZiAoUHJvZHVjdGlvbkZsYWcuVVNFU19ERVZFTE9QTUVOVF9PTkxZX0RJQUdOT1NUSUNTKSB7CiAgICAgICAgICAgICBSZXNlYXJjaExvZ2dlci5tYWluS2V5Ym9hcmRWaWV3X29uTG9uZ1ByZXNzKCk7CiAgICAgICAgIH0KICAgICAgICAgZmluYWwgaW50IGNvZGUgPSBrZXkubUNvZGU7CkBAIC0xMTI1LDcgKzExMjYsNyBAQAogICAgICAgICB9CiAgICAgICAgIC8vIFRPRE86IFRoaXMgc2hvdWxkIGJlIG1vdmVkIHRvIHRoZSB0cmFja2VyLnByb2Nlc3NNb3Rpb25FdmVudCgpIGNhbGwgYmVsb3cuCiAgICAgICAgIC8vIEN1cnJlbnRseSB0aGUgc2FtZSAibW92ZSIgZXZlbnQgaXMgYmVpbmcgbG9nZ2VkIHR3aWNlLgotICAgICAgICBpZiAoUHJvZHVjdGlvbkZsYWcuSVNfRVhQRVJJTUVOVEFMKSB7CisgICAgICAgIGlmIChQcm9kdWN0aW9uRmxhZy5VU0VTX0RFVkVMT1BNRU5UX09OTFlfRElBR05PU1RJQ1MpIHsKICAgICAgICAgICAgIFJlc2VhcmNoTG9nZ2VyLm1haW5LZXlib2FyZFZpZXdfcHJvY2Vzc01vdGlvbkV2ZW50KAogICAgICAgICAgICAgICAgICAgICBtZSwgYWN0aW9uLCBldmVudFRpbWUsIGluZGV4LCBpZCwgeCwgeSk7CiAgICAgICAgIH0KQEAgLTExODUsNyArMTE4Niw3IEBACiAgICAgICAgICAgICAgICAgaWYgKEVOQUJMRV9VU0FCSUxJVFlfU1RVRFlfTE9HKSB7CiAgICAgICAgICAgICAgICAgICAgIHdyaXRlVXNhYmlsaXR5U3R1ZHlMb2cobWUsIGFjdGlvbiwgZXZlbnRUaW1lLCBpLCBwb2ludGVySWQsIHB4LCBweSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChQcm9kdWN0aW9uRmxhZy5JU19FWFBFUklNRU5UQUwpIHsKKyAgICAgICAgICAgICAgICBpZiAoUHJvZHVjdGlvbkZsYWcuVVNFU19ERVZFTE9QTUVOVF9PTkxZX0RJQUdOT1NUSUNTKSB7CiAgICAgICAgICAgICAgICAgICAgIFJlc2VhcmNoTG9nZ2VyLm1haW5LZXlib2FyZFZpZXdfcHJvY2Vzc01vdGlvbkV2ZW50KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lLCBhY3Rpb24sIGV2ZW50VGltZSwgaSwgcG9pbnRlcklkLCBweCwgcHkpOwogICAgICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL1BvaW50ZXJUcmFja2VyLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9rZXlib2FyZC9Qb2ludGVyVHJhY2tlci5qYXZhCmluZGV4IGQ1NGI5OGMuLmRjZmFlNzMgMTAwNjQ0Ci0tLSBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL1BvaW50ZXJUcmFja2VyLmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2Qva2V5Ym9hcmQvUG9pbnRlclRyYWNrZXIuamF2YQpAQCAtNDc4LDcgKzQ3OCw3IEBACiAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwgaWdub3JlTW9kaWZpZXJLZXkgPyAiIGlnbm9yZU1vZGlmaWVyIiA6ICIiLAogICAgICAgICAgICAgICAgICAgICBhbHRlcnNDb2RlID8gIiBhbHRlcnNDb2RlIiA6ICIiLCBrZXkuaXNFbmFibGVkKCkgPyAiIiA6ICIgZGlzYWJsZWQiKSk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKFByb2R1Y3Rpb25GbGFnLklTX0VYUEVSSU1FTlRBTCkgeworICAgICAgICBpZiAoUHJvZHVjdGlvbkZsYWcuVVNFU19ERVZFTE9QTUVOVF9PTkxZX0RJQUdOT1NUSUNTKSB7CiAgICAgICAgICAgICBSZXNlYXJjaExvZ2dlci5wb2ludGVyVHJhY2tlcl9jYWxsTGlzdGVuZXJPbkNvZGVJbnB1dChrZXksIHgsIHksIGlnbm9yZU1vZGlmaWVyS2V5LAogICAgICAgICAgICAgICAgICAgICBhbHRlcnNDb2RlLCBjb2RlKTsKICAgICAgICAgfQpAQCAtNTEwLDcgKzUxMCw3IEBACiAgICAgICAgICAgICAgICAgICAgIHdpdGhTbGlkaW5nID8gIiBzbGlkaW5nIiA6ICIiLCBpZ25vcmVNb2RpZmllcktleSA/ICIgaWdub3JlTW9kaWZpZXIiIDogIiIsCiAgICAgICAgICAgICAgICAgICAgIGtleS5pc0VuYWJsZWQoKSA/ICAiIjogIiBkaXNhYmxlZCIpKTsKICAgICAgICAgfQotICAgICAgICBpZiAoUHJvZHVjdGlvbkZsYWcuSVNfRVhQRVJJTUVOVEFMKSB7CisgICAgICAgIGlmIChQcm9kdWN0aW9uRmxhZy5VU0VTX0RFVkVMT1BNRU5UX09OTFlfRElBR05PU1RJQ1MpIHsKICAgICAgICAgICAgIFJlc2VhcmNoTG9nZ2VyLnBvaW50ZXJUcmFja2VyX2NhbGxMaXN0ZW5lck9uUmVsZWFzZShrZXksIHByaW1hcnlDb2RlLCB3aXRoU2xpZGluZywKICAgICAgICAgICAgICAgICAgICAgaWdub3JlTW9kaWZpZXJLZXkpOwogICAgICAgICB9CkBAIC01MjYsNyArNTI2LDcgQEAKICAgICAgICAgaWYgKERFQlVHX0xJU1RFTkVSKSB7CiAgICAgICAgICAgICBMb2cuZChUQUcsIFN0cmluZy5mb3JtYXQoIlslZF0gb25DYW5jZWxJbnB1dCIsIG1Qb2ludGVySWQpKTsKICAgICAgICAgfQotICAgICAgICBpZiAoUHJvZHVjdGlvbkZsYWcuSVNfRVhQRVJJTUVOVEFMKSB7CisgICAgICAgIGlmIChQcm9kdWN0aW9uRmxhZy5VU0VTX0RFVkVMT1BNRU5UX09OTFlfRElBR05PU1RJQ1MpIHsKICAgICAgICAgICAgIFJlc2VhcmNoTG9nZ2VyLnBvaW50ZXJUcmFja2VyX2NhbGxMaXN0ZW5lck9uQ2FuY2VsSW5wdXQoKTsKICAgICAgICAgfQogICAgICAgICBtTGlzdGVuZXIub25DYW5jZWxJbnB1dCgpOwpAQCAtODQzLDcgKzg0Myw3IEBACiAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgU3RyaW5nLmZvcm1hdCgiWyVkXSBvbkRvd25FdmVudDoiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGlnbm9yZSBwb3RlbnRpYWwgbm9pc2U6IHRpbWU9JWQgZGlzdGFuY2U9JWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qb2ludGVySWQsIGRlbHRhVCwgZGlzdGFuY2UpKTsKLSAgICAgICAgICAgICAgICBpZiAoUHJvZHVjdGlvbkZsYWcuSVNfRVhQRVJJTUVOVEFMKSB7CisgICAgICAgICAgICAgICAgaWYgKFByb2R1Y3Rpb25GbGFnLlVTRVNfREVWRUxPUE1FTlRfT05MWV9ESUFHTk9TVElDUykgewogICAgICAgICAgICAgICAgICAgICBSZXNlYXJjaExvZ2dlci5wb2ludGVyVHJhY2tlcl9vbkRvd25FdmVudChkZWx0YVQsIGRpc3RhbmNlICogZGlzdGFuY2UpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYW5jZWxUcmFja2luZygpOwpAQCAtMTAwMCw3ICsxMDAwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgeCwgeSwgQ29uc3RhbnRzLnByaW50YWJsZUNvZGUoa2V5Lm1Db2RlKSkpOwogICAgICAgICB9CiAgICAgICAgIC8vIFRPRE86IFRoaXMgc2hvdWxkIGJlIG1vdmVkIHRvIG91dHNpZGUgb2YgdGhpcyBuZXN0ZWQgaWYtY2xhdXNlPwotICAgICAgICBpZiAoUHJvZHVjdGlvbkZsYWcuSVNfRVhQRVJJTUVOVEFMKSB7CisgICAgICAgIGlmIChQcm9kdWN0aW9uRmxhZy5VU0VTX0RFVkVMT1BNRU5UX09OTFlfRElBR05PU1RJQ1MpIHsKICAgICAgICAgICAgIFJlc2VhcmNoTG9nZ2VyLnBvaW50ZXJUcmFja2VyX29uTW92ZUV2ZW50KHgsIHksIGxhc3RYLCBsYXN0WSk7CiAgICAgICAgIH0KICAgICAgICAgb25VcEV2ZW50SW50ZXJuYWwoeCwgeSwgZXZlbnRUaW1lKTsKZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL2ludGVybmFsL1RvdWNoU2NyZWVuUmVndWxhdG9yLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9rZXlib2FyZC9pbnRlcm5hbC9Ub3VjaFNjcmVlblJlZ3VsYXRvci5qYXZhCmluZGV4IGFjODNmZjguLmQ2YjFjYzYgMTAwNjQ0Ci0tLSBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL2ludGVybmFsL1RvdWNoU2NyZWVuUmVndWxhdG9yLmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2Qva2V5Ym9hcmQvaW50ZXJuYWwvVG91Y2hTY3JlZW5SZWd1bGF0b3IuamF2YQpAQCAtMTQ1LDcgKzE0NSw3IEBACiAgICAgICAgIGlmIChoYW5kbGVTdWRkZW5KdW1waW5nKG1lKSkgewogICAgICAgICAgICAgaWYgKERFQlVHX01PREUpCiAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAib25Ub3VjaEV2ZW50OiBpZ25vcmUgc3VkZGVuIGp1bXAgIiArIG1lKTsKLSAgICAgICAgICAgIGlmIChQcm9kdWN0aW9uRmxhZy5JU19FWFBFUklNRU5UQUwpIHsKKyAgICAgICAgICAgIGlmIChQcm9kdWN0aW9uRmxhZy5VU0VTX0RFVkVMT1BNRU5UX09OTFlfRElBR05PU1RJQ1MpIHsKICAgICAgICAgICAgICAgICBSZXNlYXJjaExvZ2dlci5zdWRkZW5KdW1waW5nVG91Y2hFdmVudEhhbmRsZXJfb25Ub3VjaEV2ZW50KG1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vQmluYXJ5RGljdGlvbmFyeS5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vQmluYXJ5RGljdGlvbmFyeS5qYXZhCmluZGV4IGFiMmExMmYuLjE4ZTcxMjIgMTAwNjQ0Ci0tLSBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL0JpbmFyeURpY3Rpb25hcnkuamF2YQorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9CaW5hcnlEaWN0aW9uYXJ5LmphdmEKQEAgLTMxLDggKzMxLDYgQEAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeURpY3Rpb25hcnkgZXh0ZW5kcyBEaWN0aW9uYXJ5IHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gQmluYXJ5RGljdGlvbmFyeS5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElDVElPTkFSWV9QQUNLX0FVVEhPUklUWSA9Ci0gICAgICAgICAgICAiY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uZGljdGlvbmFyeXBhY2siOwogCiAgICAgLy8gTXVzdCBiZSBlcXVhbCB0byBNQVhfV09SRF9MRU5HVEggaW4gbmF0aXZlL2puaS9zcmMvZGVmaW5lcy5oCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9XT1JEX0xFTkdUSCA9IENvbnN0YW50cy5EaWN0aW9uYXJ5Lk1BWF9XT1JEX0xFTkdUSDsKQEAgLTkxLDcgKzg5LDcgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBsb25nIG9wZW5OYXRpdmUoU3RyaW5nIHNvdXJjZURpciwgbG9uZyBkaWN0T2Zmc2V0LCBsb25nIGRpY3RTaXplKTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBjbG9zZU5hdGl2ZShsb25nIGRpY3QpOwotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgZ2V0RnJlcXVlbmN5TmF0aXZlKGxvbmcgZGljdCwgaW50W10gd29yZCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBnZXRQcm9iYWJpbGl0eU5hdGl2ZShsb25nIGRpY3QsIGludFtdIHdvcmQpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIGlzVmFsaWRCaWdyYW1OYXRpdmUobG9uZyBkaWN0LCBpbnRbXSB3b3JkMSwgaW50W10gd29yZDIpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgZ2V0U3VnZ2VzdGlvbnNOYXRpdmUobG9uZyBkaWN0LCBsb25nIHByb3hpbWl0eUluZm8sCiAgICAgICAgICAgICBsb25nIHRyYXZlcnNlU2Vzc2lvbiwgaW50W10geENvb3JkaW5hdGVzLCBpbnRbXSB5Q29vcmRpbmF0ZXMsIGludFtdIHRpbWVzLApAQCAtMTg2LDcgKzE4NCw3IEBACiAgICAgcHVibGljIGludCBnZXRGcmVxdWVuY3koZmluYWwgU3RyaW5nIHdvcmQpIHsKICAgICAgICAgaWYgKHdvcmQgPT0gbnVsbCkgcmV0dXJuIC0xOwogICAgICAgICBpbnRbXSBjb2RlUG9pbnRzID0gU3RyaW5nVXRpbHMudG9Db2RlUG9pbnRBcnJheSh3b3JkKTsKLSAgICAgICAgcmV0dXJuIGdldEZyZXF1ZW5jeU5hdGl2ZShtTmF0aXZlRGljdCwgY29kZVBvaW50cyk7CisgICAgICAgIHJldHVybiBnZXRQcm9iYWJpbGl0eU5hdGl2ZShtTmF0aXZlRGljdCwgY29kZVBvaW50cyk7CiAgICAgfQogCiAgICAgLy8gVE9ETzogQWRkIGEgYmF0Y2ggcHJvY2VzcyB2ZXJzaW9uIChpc1ZhbGlkQmlncmFtTXVsdGlwbGU/KSB0byBhdm9pZCBleGNlc3NpdmUgbnVtYmVycyBvZiBqbmkKZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL0JpbmFyeURpY3Rpb25hcnlGaWxlRHVtcGVyLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9CaW5hcnlEaWN0aW9uYXJ5RmlsZUR1bXBlci5qYXZhCmluZGV4IDBkMGNlNTcuLjRiZWM5OWMgMTAwNjQ0Ci0tLSBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL0JpbmFyeURpY3Rpb25hcnlGaWxlRHVtcGVyLmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vQmluYXJ5RGljdGlvbmFyeUZpbGVEdW1wZXIuamF2YQpAQCAtMjcsNiArMjcsNyBAQAogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmRpY3Rpb25hcnlwYWNrLkRpY3Rpb25hcnlQYWNrQ29uc3RhbnRzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmxhdGluLkRpY3Rpb25hcnlJbmZvVXRpbHMuRGljdGlvbmFyeUluZm87CiAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CkBAIC05Myw4ICs5NCw3IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgVXJpLkJ1aWxkZXIgZ2V0UHJvdmlkZXJVcmlCdWlsZGVyKGZpbmFsIFN0cmluZyBwYXRoKSB7CiAgICAgICAgIHJldHVybiBuZXcgVXJpLkJ1aWxkZXIoKS5zY2hlbWUoQ29udGVudFJlc29sdmVyLlNDSEVNRV9DT05URU5UKQotICAgICAgICAgICAgICAgIC5hdXRob3JpdHkoQmluYXJ5RGljdGlvbmFyeS5ESUNUSU9OQVJZX1BBQ0tfQVVUSE9SSVRZKS5hcHBlbmRQYXRoKAotICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCk7CisgICAgICAgICAgICAgICAgLmF1dGhvcml0eShEaWN0aW9uYXJ5UGFja0NvbnN0YW50cy5BVVRIT1JJVFkpLmFwcGVuZFBhdGgocGF0aCk7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9CaW5hcnlEaWN0aW9uYXJ5R2V0dGVyLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9CaW5hcnlEaWN0aW9uYXJ5R2V0dGVyLmphdmEKaW5kZXggZTkxM2YyOC4uMjk0MzEyOCAxMDA2NDQKLS0tIGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vQmluYXJ5RGljdGlvbmFyeUdldHRlci5qYXZhCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL0JpbmFyeURpY3Rpb25hcnlHZXR0ZXIuamF2YQpAQCAtMjIsNiArMjIsNyBAQAogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRGaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwpAQCAtOTUsMTggKzk2LDggQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBEaWN0UGFja1NldHRpbmdzIHsKICAgICAgICAgZmluYWwgU2hhcmVkUHJlZmVyZW5jZXMgbURpY3RQcmVmZXJlbmNlczsKICAgICAgICAgcHVibGljIERpY3RQYWNrU2V0dGluZ3MoZmluYWwgQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBDb250ZXh0IGRpY3RQYWNrQ29udGV4dCA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBkaWN0UGFja05hbWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcuZGljdGlvbmFyeV9wYWNrX3BhY2thZ2VfbmFtZSk7Ci0gICAgICAgICAgICAgICAgZGljdFBhY2tDb250ZXh0ID0gY29udGV4dC5jcmVhdGVQYWNrYWdlQ29udGV4dChkaWN0UGFja05hbWUsIDApOwotICAgICAgICAgICAgfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgZGljdGlvbmFyeSBwYWNrIGlzIG5vdCBpbnN0YWxsZWQuLi4KLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBmYWxsYmFjayBvbiB0aGUgYnVpbHQtaW4gZGljdCwgc2VlIHRoZSBUT0RPIGFib3ZlCi0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGQgbm90IGZpbmQgYSBkaWN0aW9uYXJ5IHBhY2siKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1EaWN0UHJlZmVyZW5jZXMgPSBudWxsID09IGRpY3RQYWNrQ29udGV4dCA/IG51bGwKLSAgICAgICAgICAgICAgICAgICAgOiBkaWN0UGFja0NvbnRleHQuZ2V0U2hhcmVkUHJlZmVyZW5jZXMoQ09NTU9OX1BSRUZFUkVOQ0VTX05BTUUsCisgICAgICAgICAgICBtRGljdFByZWZlcmVuY2VzID0gbnVsbCA9PSBjb250ZXh0ID8gbnVsbAorICAgICAgICAgICAgICAgICAgICA6IGNvbnRleHQuZ2V0U2hhcmVkUHJlZmVyZW5jZXMoQ09NTU9OX1BSRUZFUkVOQ0VTX05BTUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dC5NT0RFX1dPUkxEX1JFQURBQkxFIHwgQ29udGV4dC5NT0RFX01VTFRJX1BST0NFU1MpOwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV29yZExpc3RBY3RpdmUoZmluYWwgU3RyaW5nIGRpY3RJZCkgewpAQCAtMjg4LDEwICsyNzksMTYgQEAKICAgICAgICAgLy8gY2FjaGVXb3JkTGlzdHNGcm9tQ29udGVudFByb3ZpZGVyIHJldHVybnMgdGhlIGxpc3Qgb2YgZmlsZXMgaXQgY29waWVkIHRvIGxvY2FsCiAgICAgICAgIC8vIHN0b3JhZ2UsIGJ1dCB3ZSBkb24ndCByZWFsbHkgY2FyZSBhYm91dCB3aGF0IHdhcyBjb3BpZWQgTk9XOiB3aGF0IHdlIHdhbnQgaXMgdGhlCiAgICAgICAgIC8vIGxpc3Qgb2YgZXZlcnl0aGluZyB3ZSBldmVyIGNhY2hlZCwgc28gd2UgaWdub3JlIHRoZSByZXR1cm4gdmFsdWUuCi0gICAgICAgIC8vIFRPRE86IFRoZSBleHBlcmltZW50YWwgdmVyc2lvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBEaWN0aW9uYXJ5IFBhY2sgU2VydmljZSB5ZXQKLSAgICAgICAgaWYgKCFQcm9kdWN0aW9uRmxhZy5JU19FWFBFUklNRU5UQUwpIHsKLSAgICAgICAgICAgIEJpbmFyeURpY3Rpb25hcnlGaWxlRHVtcGVyLmNhY2hlV29yZExpc3RzRnJvbUNvbnRlbnRQcm92aWRlcihsb2NhbGUsIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIGhhc0RlZmF1bHRXb3JkTGlzdCk7CisgICAgICAgIC8vIFRPRE86IFRoZSBkZXZlbG9wbWVudC1vbmx5LWRpYWdub3N0aWMgdmVyc2lvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBEaWN0aW9uYXJ5IFBhY2sKKyAgICAgICAgLy8gU2VydmljZSB5ZXQKKyAgICAgICAgaWYgKCFQcm9kdWN0aW9uRmxhZy5VU0VTX0RFVkVMT1BNRU5UX09OTFlfRElBR05PU1RJQ1MpIHsKKyAgICAgICAgICAgIC8vIFdlIG5lZWQgaW50ZXJuZXQgYWNjZXNzIHRvIGRvIHRoZSBmb2xsb3dpbmcuIE9ubHkgZG8gdGhpcyBpZiB0aGUgcGFja2FnZSBhY3R1YWxseQorICAgICAgICAgICAgLy8gaGFzIHRoZSBwZXJtaXNzaW9uLgorICAgICAgICAgICAgaWYgKGNvbnRleHQuY2hlY2tDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uSU5URVJORVQpCisgICAgICAgICAgICAgICAgICAgID09IFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRCkgeworICAgICAgICAgICAgICAgIEJpbmFyeURpY3Rpb25hcnlGaWxlRHVtcGVyLmNhY2hlV29yZExpc3RzRnJvbUNvbnRlbnRQcm92aWRlcihsb2NhbGUsIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICBoYXNEZWZhdWx0V29yZExpc3QpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGZpbmFsIEZpbGVbXSBjYWNoZWRXb3JkTGlzdHMgPSBnZXRDYWNoZWRXb3JkTGlzdHMobG9jYWxlLnRvU3RyaW5nKCksIGNvbnRleHQpOwogICAgICAgICBmaW5hbCBTdHJpbmcgbWFpbkRpY3RJZCA9IERpY3Rpb25hcnlJbmZvVXRpbHMuZ2V0TWFpbkRpY3RJZChsb2NhbGUpOwpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vRGVidWdTZXR0aW5nc0FjdGl2aXR5LmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9EZWJ1Z1NldHRpbmdzQWN0aXZpdHkuamF2YQppbmRleCAyYTUwMWE2Li5lMWI1YTgwIDEwMDY0NAotLS0gYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9EZWJ1Z1NldHRpbmdzQWN0aXZpdHkuamF2YQorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9EZWJ1Z1NldHRpbmdzQWN0aXZpdHkuamF2YQpAQCAtMjEsMTUgKzIxLDE4IEBACiBpbXBvcnQgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VBY3Rpdml0eTsKIAogcHVibGljIGZpbmFsIGNsYXNzIERlYnVnU2V0dGluZ3NBY3Rpdml0eSBleHRlbmRzIFByZWZlcmVuY2VBY3Rpdml0eSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRlJBR01FTlQgPSBEZWJ1Z1NldHRpbmdzLmNsYXNzLmdldE5hbWUoKTsKKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBJbnRlbnQgZ2V0SW50ZW50KCkgewotICAgICAgICBmaW5hbCBJbnRlbnQgbW9kSW50ZW50ID0gbmV3IEludGVudChzdXBlci5nZXRJbnRlbnQoKSk7Ci0gICAgICAgIG1vZEludGVudC5wdXRFeHRyYShFWFRSQV9TSE9XX0ZSQUdNRU5ULCBEZWJ1Z1NldHRpbmdzLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIHJldHVybiBtb2RJbnRlbnQ7CisgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBzdXBlci5nZXRJbnRlbnQoKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKEVYVFJBX1NIT1dfRlJBR01FTlQsIERFRkFVTFRfRlJBR01FTlQpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoRVhUUkFfTk9fSEVBREVSUywgdHJ1ZSk7CisgICAgICAgIHJldHVybiBpbnRlbnQ7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKGZpbmFsIEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKICAgICAgICAgc2V0VGl0bGUoUi5zdHJpbmcuZW5nbGlzaF9pbWVfZGVidWdfc2V0dGluZ3MpOwogICAgIH0KZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL0RpY3Rpb25hcnlQYWNrSW5zdGFsbEJyb2FkY2FzdFJlY2VpdmVyLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9EaWN0aW9uYXJ5UGFja0luc3RhbGxCcm9hZGNhc3RSZWNlaXZlci5qYXZhCmluZGV4IGE4NTEzZmYuLjM1ZjMxMTkgMTAwNjQ0Ci0tLSBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL0RpY3Rpb25hcnlQYWNrSW5zdGFsbEJyb2FkY2FzdFJlY2VpdmVyLmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vRGljdGlvbmFyeVBhY2tJbnN0YWxsQnJvYWRjYXN0UmVjZWl2ZXIuamF2YQpAQCAtMTYsNiArMTYsOCBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmxhdGluOwogCitpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuZGljdGlvbmFyeXBhY2suRGljdGlvbmFyeVBhY2tDb25zdGFudHM7CisKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKQEAgLTMwLDExICszMiw2IEBACiBwdWJsaWMgZmluYWwgY2xhc3MgRGljdGlvbmFyeVBhY2tJbnN0YWxsQnJvYWRjYXN0UmVjZWl2ZXIgZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlciB7CiAKICAgICBmaW5hbCBMYXRpbklNRSBtU2VydmljZTsKLSAgICAvKioKLSAgICAgKiBUaGUgYWN0aW9uIG9mIHRoZSBpbnRlbnQgZm9yIHB1Ymxpc2hpbmcgdGhhdCBuZXcgZGljdGlvbmFyeSBkYXRhIGlzIGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0RJQ1RJT05BUllfSU5URU5UX0FDVElPTiA9Ci0gICAgICAgICAgICAiY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uZGljdGlvbmFyeXBhY2submV3ZGljdCI7CiAKICAgICBwdWJsaWMgRGljdGlvbmFyeVBhY2tJbnN0YWxsQnJvYWRjYXN0UmVjZWl2ZXIoZmluYWwgTGF0aW5JTUUgc2VydmljZSkgewogICAgICAgICBtU2VydmljZSA9IHNlcnZpY2U7CkBAIC02NCw3ICs2MSw3IEBACiAKICAgICAgICAgICAgIC8vIFNlYXJjaCBmb3Igc29tZSBkaWN0aW9uYXJ5IHBhY2sgaW4gdGhlIGp1c3QtaW5zdGFsbGVkIHBhY2thZ2UuIElmIGZvdW5kLCByZXJlYWQuCiAgICAgICAgICAgICBmb3IgKFByb3ZpZGVySW5mbyBpbmZvIDogcHJvdmlkZXJzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKEJpbmFyeURpY3Rpb25hcnkuRElDVElPTkFSWV9QQUNLX0FVVEhPUklUWS5lcXVhbHMoaW5mby5hdXRob3JpdHkpKSB7CisgICAgICAgICAgICAgICAgaWYgKERpY3Rpb25hcnlQYWNrQ29uc3RhbnRzLkFVVEhPUklUWS5lcXVhbHMoaW5mby5hdXRob3JpdHkpKSB7CiAgICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnJlc2V0U3VnZ2VzdE1haW5EaWN0KCk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CkBAIC04NCw3ICs4MSw3IEBACiAgICAgICAgICAgICAvLyBUT0RPOiBPbmx5IHJlbG9hZCBkaWN0aW9uYXJ5IG9uIFJFTU9WRUQgd2hlbiB0aGUgcmVtb3ZlZCBwYWNrYWdlIGlzIHRoZSBvbmUgd2UKICAgICAgICAgICAgIC8vIHJlYWQgZGljdGlvbmFyeSBmcm9tPwogICAgICAgICAgICAgbVNlcnZpY2UucmVzZXRTdWdnZXN0TWFpbkRpY3QoKTsKLSAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKE5FV19ESUNUSU9OQVJZX0lOVEVOVF9BQ1RJT04pKSB7CisgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhEaWN0aW9uYXJ5UGFja0NvbnN0YW50cy5ORVdfRElDVElPTkFSWV9JTlRFTlRfQUNUSU9OKSkgewogICAgICAgICAgICAgbVNlcnZpY2UucmVzZXRTdWdnZXN0TWFpbkRpY3QoKTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL0ZlZWRiYWNrVXRpbHMuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL0ZlZWRiYWNrVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTUyNjBlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vRmVlZGJhY2tVdGlscy5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmxhdGluOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CisKK3B1YmxpYyBjbGFzcyBGZWVkYmFja1V0aWxzIHsKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGZWVkYmFja0Zvcm1TdXBwb3J0ZWQoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2hvd0ZlZWRiYWNrRm9ybShDb250ZXh0IGNvbnRleHQpIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9MYXRpbklNRS5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vTGF0aW5JTUUuamF2YQppbmRleCAyNTJmYjAyLi5lMzY1MGQ5IDEwMDY0NAotLS0gYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9MYXRpbklNRS5qYXZhCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL0xhdGluSU1FLmphdmEKQEAgLTY0LDYgKzY0LDcgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5hbm5vdGF0aW9ucy5Vc2VkRm9yVGVzdGluZzsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5jb21wYXQuSW5wdXRNZXRob2RTZXJ2aWNlQ29tcGF0VXRpbHM7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuY29tcGF0LlN1Z2dlc3Rpb25TcGFuVXRpbHM7CitpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuZGljdGlvbmFyeXBhY2suRGljdGlvbmFyeVBhY2tDb25zdGFudHM7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuZXZlbnQuRXZlbnRJbnRlcnByZXRlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5rZXlib2FyZC5LZXlEZXRlY3RvcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5rZXlib2FyZC5LZXlib2FyZDsKQEAgLTE3Myw5ICsxNzQsMTAgQEAKICAgICBwcml2YXRlIGludCBtRGlzcGxheU9yaWVudGF0aW9uOwogCiAgICAgLy8gT2JqZWN0IGZvciByZWFjdGluZyB0byBhZGRpbmcvcmVtb3ZpbmcgYSBkaWN0aW9uYXJ5IHBhY2suCi0gICAgLy8gVE9ETzogVGhlIGV4cGVyaW1lbnRhbCB2ZXJzaW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIERpY3Rpb25hcnkgUGFjayBTZXJ2aWNlIHlldC4KKyAgICAvLyBUT0RPOiBUaGUgZGV2ZWxvcG1lbnQtb25seS1kaWFnbm9zdGljIHZlcnNpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgRGljdGlvbmFyeSBQYWNrCisgICAgLy8gU2VydmljZSB5ZXQuCiAgICAgcHJpdmF0ZSBCcm9hZGNhc3RSZWNlaXZlciBtRGljdGlvbmFyeVBhY2tJbnN0YWxsUmVjZWl2ZXIgPQotICAgICAgICAgICAgUHJvZHVjdGlvbkZsYWcuSVNfRVhQRVJJTUVOVEFMCisgICAgICAgICAgICBQcm9kdWN0aW9uRmxhZy5VU0VTX0RFVkVMT1BNRU5UX09OTFlfRElBR05PU1RJQ1MKICAgICAgICAgICAgICAgICAgICAgPyBudWxsIDogbmV3IERpY3Rpb25hcnlQYWNrSW5zdGFsbEJyb2FkY2FzdFJlY2VpdmVyKHRoaXMpOwogCiAgICAgLy8gS2VlcHMgdHJhY2sgb2YgbW9zdCByZWNlbnRseSBpbnNlcnRlZCB0ZXh0IChtdWx0aS1jaGFyYWN0ZXIga2V5KSBmb3IgcmV2ZXJ0aW5nCkBAIC00MjcsNyArNDI5LDcgQEAKICAgICAgICAgbG9hZFNldHRpbmdzKCk7CiAgICAgICAgIGluaXRTdWdnZXN0KCk7CiAKLSAgICAgICAgaWYgKFByb2R1Y3Rpb25GbGFnLklTX0VYUEVSSU1FTlRBTCkgeworICAgICAgICBpZiAoUHJvZHVjdGlvbkZsYWcuVVNFU19ERVZFTE9QTUVOVF9PTkxZX0RJQUdOT1NUSUNTKSB7CiAgICAgICAgICAgICBSZXNlYXJjaExvZ2dlci5nZXRJbnN0YW5jZSgpLmluaXQodGhpcywgbUtleWJvYXJkU3dpdGNoZXIsIG1TdWdnZXN0KTsKICAgICAgICAgfQogICAgICAgICBtRGlzcGxheU9yaWVudGF0aW9uID0gZ2V0UmVzb3VyY2VzKCkuZ2V0Q29uZmlndXJhdGlvbigpLm9yaWVudGF0aW9uOwpAQCAtNDM5LDggKzQ0MSw5IEBACiAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQXVkaW9NYW5hZ2VyLlJJTkdFUl9NT0RFX0NIQU5HRURfQUNUSU9OKTsKICAgICAgICAgcmVnaXN0ZXJSZWNlaXZlcihtUmVjZWl2ZXIsIGZpbHRlcik7CiAKLSAgICAgICAgLy8gVE9ETzogVGhlIGV4cGVyaW1lbnRhbCB2ZXJzaW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIERpY3Rpb25hcnkgUGFjayBTZXJ2aWNlIHlldC4KLSAgICAgICAgaWYgKCFQcm9kdWN0aW9uRmxhZy5JU19FWFBFUklNRU5UQUwpIHsKKyAgICAgICAgLy8gVE9ETzogVGhlIGRldmVsb3BtZW50LW9ubHktZGlhZ25vc3RpYyB2ZXJzaW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIERpY3Rpb25hcnkgUGFjaworICAgICAgICAvLyBTZXJ2aWNlIHlldC4KKyAgICAgICAgaWYgKCFQcm9kdWN0aW9uRmxhZy5VU0VTX0RFVkVMT1BNRU5UX09OTFlfRElBR05PU1RJQ1MpIHsKICAgICAgICAgICAgIGZpbmFsIEludGVudEZpbHRlciBwYWNrYWdlRmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOwogICAgICAgICAgICAgcGFja2FnZUZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9QQUNLQUdFX0FEREVEKTsKICAgICAgICAgICAgIHBhY2thZ2VGaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fUEFDS0FHRV9SRU1PVkVEKTsKQEAgLTQ0OCw4ICs0NTEsNyBAQAogICAgICAgICAgICAgcmVnaXN0ZXJSZWNlaXZlcihtRGljdGlvbmFyeVBhY2tJbnN0YWxsUmVjZWl2ZXIsIHBhY2thZ2VGaWx0ZXIpOwogCiAgICAgICAgICAgICBmaW5hbCBJbnRlbnRGaWx0ZXIgbmV3RGljdEZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKLSAgICAgICAgICAgIG5ld0RpY3RGaWx0ZXIuYWRkQWN0aW9uKAotICAgICAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5UGFja0luc3RhbGxCcm9hZGNhc3RSZWNlaXZlci5ORVdfRElDVElPTkFSWV9JTlRFTlRfQUNUSU9OKTsKKyAgICAgICAgICAgIG5ld0RpY3RGaWx0ZXIuYWRkQWN0aW9uKERpY3Rpb25hcnlQYWNrQ29uc3RhbnRzLk5FV19ESUNUSU9OQVJZX0lOVEVOVF9BQ1RJT04pOwogICAgICAgICAgICAgcmVnaXN0ZXJSZWNlaXZlcihtRGljdGlvbmFyeVBhY2tJbnN0YWxsUmVjZWl2ZXIsIG5ld0RpY3RGaWx0ZXIpOwogICAgICAgICB9CiAgICAgfQpAQCAtNDkyLDcgKzQ5NCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBtSXNNYWluRGljdGlvbmFyeUF2YWlsYWJsZSA9IERpY3Rpb25hcnlGYWN0b3J5LmlzRGljdGlvbmFyeUF2YWlsYWJsZSh0aGlzLCBzdWJ0eXBlTG9jYWxlKTsKLSAgICAgICAgaWYgKFByb2R1Y3Rpb25GbGFnLklTX0VYUEVSSU1FTlRBTCkgeworICAgICAgICBpZiAoUHJvZHVjdGlvbkZsYWcuVVNFU19ERVZFTE9QTUVOVF9PTkxZX0RJQUdOT1NUSUNTKSB7CiAgICAgICAgICAgICBSZXNlYXJjaExvZ2dlci5nZXRJbnN0YW5jZSgpLmluaXRTdWdnZXN0KG1TdWdnZXN0KTsKICAgICAgICAgfQogCkBAIC01NjMsMTEgKzU2NSwxMiBAQAogICAgICAgICB9CiAgICAgICAgIG1TZXR0aW5ncy5vbkRlc3Ryb3koKTsKICAgICAgICAgdW5yZWdpc3RlclJlY2VpdmVyKG1SZWNlaXZlcik7Ci0gICAgICAgIGlmIChQcm9kdWN0aW9uRmxhZy5JU19FWFBFUklNRU5UQUwpIHsKKyAgICAgICAgaWYgKFByb2R1Y3Rpb25GbGFnLlVTRVNfREVWRUxPUE1FTlRfT05MWV9ESUFHTk9TVElDUykgewogICAgICAgICAgICAgUmVzZWFyY2hMb2dnZXIuZ2V0SW5zdGFuY2UoKS5vbkRlc3Ryb3koKTsKICAgICAgICAgfQotICAgICAgICAvLyBUT0RPOiBUaGUgZXhwZXJpbWVudGFsIHZlcnNpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgRGljdGlvbmFyeSBQYWNrIFNlcnZpY2UgeWV0LgotICAgICAgICBpZiAoIVByb2R1Y3Rpb25GbGFnLklTX0VYUEVSSU1FTlRBTCkgeworICAgICAgICAvLyBUT0RPOiBUaGUgZGV2ZWxvcG1lbnQtb25seS1kaWFnbm9zdGljIHZlcnNpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgRGljdGlvbmFyeSBQYWNrCisgICAgICAgIC8vIFNlcnZpY2UgeWV0LgorICAgICAgICBpZiAoIVByb2R1Y3Rpb25GbGFnLlVTRVNfREVWRUxPUE1FTlRfT05MWV9ESUFHTk9TVElDUykgewogICAgICAgICAgICAgdW5yZWdpc3RlclJlY2VpdmVyKG1EaWN0aW9uYXJ5UGFja0luc3RhbGxSZWNlaXZlcik7CiAgICAgICAgIH0KICAgICAgICAgTGF0aW5JbWVMb2dnZXIuY29tbWl0KCk7CkBAIC02NzUsNyArNjc4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgKyAiLCB3b3JkIGNhcHMgPSAiCiAgICAgICAgICAgICAgICAgICAgICsgKChlZGl0b3JJbmZvLmlucHV0VHlwZSAmIElucHV0VHlwZS5UWVBFX1RFWFRfRkxBR19DQVBfV09SRFMpICE9IDApKTsKICAgICAgICAgfQotICAgICAgICBpZiAoUHJvZHVjdGlvbkZsYWcuSVNfRVhQRVJJTUVOVEFMKSB7CisgICAgICAgIGlmIChQcm9kdWN0aW9uRmxhZy5VU0VTX0RFVkVMT1BNRU5UX09OTFlfRElBR05PU1RJQ1MpIHsKICAgICAgICAgICAgIGZpbmFsIFNoYXJlZFByZWZlcmVuY2VzIHByZWZzID0gUHJlZmVyZW5jZU1hbmFnZXIuZ2V0RGVmYXVsdFNoYXJlZFByZWZlcmVuY2VzKHRoaXMpOwogICAgICAgICAgICAgUmVzZWFyY2hMb2dnZXIubGF0aW5JTUVfb25TdGFydElucHV0Vmlld0ludGVybmFsKGVkaXRvckluZm8sIHByZWZzKTsKICAgICAgICAgfQpAQCAtODAwLDcgKzgwMyw3IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBvbldpbmRvd0hpZGRlbigpIHsKLSAgICAgICAgaWYgKFByb2R1Y3Rpb25GbGFnLklTX0VYUEVSSU1FTlRBTCkgeworICAgICAgICBpZiAoUHJvZHVjdGlvbkZsYWcuVVNFU19ERVZFTE9QTUVOVF9PTkxZX0RJQUdOT1NUSUNTKSB7CiAgICAgICAgICAgICBSZXNlYXJjaExvZ2dlci5sYXRpbklNRV9vbldpbmRvd0hpZGRlbihtTGFzdFNlbGVjdGlvblN0YXJ0LCBtTGFzdFNlbGVjdGlvbkVuZCwKICAgICAgICAgICAgICAgICAgICAgZ2V0Q3VycmVudElucHV0Q29ubmVjdGlvbigpKTsKICAgICAgICAgfQpAQCAtODMxLDcgKzgzNCw3IEBACiAgICAgICAgIC8vIFJlbW92ZSBwZW5kaW5nIG1lc3NhZ2VzIHJlbGF0ZWQgdG8gdXBkYXRlIHN1Z2dlc3Rpb25zCiAgICAgICAgIG1IYW5kbGVyLmNhbmNlbFVwZGF0ZVN1Z2dlc3Rpb25TdHJpcCgpOwogICAgICAgICByZXNldENvbXBvc2luZ1N0YXRlKHRydWUgLyogYWxzb1Jlc2V0TGFzdENvbXBvc2VkV29yZCAqLyk7Ci0gICAgICAgIGlmIChQcm9kdWN0aW9uRmxhZy5JU19FWFBFUklNRU5UQUwpIHsKKyAgICAgICAgaWYgKFByb2R1Y3Rpb25GbGFnLlVTRVNfREVWRUxPUE1FTlRfT05MWV9ESUFHTk9TVElDUykgewogICAgICAgICAgICAgUmVzZWFyY2hMb2dnZXIuZ2V0SW5zdGFuY2UoKS5sYXRpbklNRV9vbkZpbmlzaElucHV0Vmlld0ludGVybmFsKCk7CiAgICAgICAgIH0KICAgICB9CkBAIC04NTIsNyArODU1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgKyAiLCBjcz0iICsgY29tcG9zaW5nU3BhblN0YXJ0CiAgICAgICAgICAgICAgICAgICAgICsgIiwgY2U9IiArIGNvbXBvc2luZ1NwYW5FbmQpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChQcm9kdWN0aW9uRmxhZy5JU19FWFBFUklNRU5UQUwpIHsKKyAgICAgICAgaWYgKFByb2R1Y3Rpb25GbGFnLlVTRVNfREVWRUxPUE1FTlRfT05MWV9ESUFHTk9TVElDUykgewogICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBleHBlY3RpbmdVcGRhdGVTZWxlY3Rpb25Gcm9tTG9nZ2VyID0KICAgICAgICAgICAgICAgICAgICAgUmVzZWFyY2hMb2dnZXIuZ2V0QW5kQ2xlYXJMYXRpbklNRUV4cGVjdGluZ1VwZGF0ZVNlbGVjdGlvbigpOwogICAgICAgICAgICAgUmVzZWFyY2hMb2dnZXIubGF0aW5JTUVfb25VcGRhdGVTZWxlY3Rpb24obUxhc3RTZWxlY3Rpb25TdGFydCwgbUxhc3RTZWxlY3Rpb25FbmQsCkBAIC05ODQsNyArOTg3LDcgQEAKICAgICAgICAgbUFwcGxpY2F0aW9uU3BlY2lmaWVkQ29tcGxldGlvbnMgPSBhcHBsaWNhdGlvblNwZWNpZmllZENvbXBsZXRpb25zOwogICAgICAgICBpZiAoYXBwbGljYXRpb25TcGVjaWZpZWRDb21wbGV0aW9ucyA9PSBudWxsKSB7CiAgICAgICAgICAgICBjbGVhclN1Z2dlc3Rpb25TdHJpcCgpOwotICAgICAgICAgICAgaWYgKFByb2R1Y3Rpb25GbGFnLklTX0VYUEVSSU1FTlRBTCkgeworICAgICAgICAgICAgaWYgKFByb2R1Y3Rpb25GbGFnLlVTRVNfREVWRUxPUE1FTlRfT05MWV9ESUFHTk9TVElDUykgewogICAgICAgICAgICAgICAgIFJlc2VhcmNoTG9nZ2VyLmxhdGluSU1FX29uRGlzcGxheUNvbXBsZXRpb25zKG51bGwpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuOwpAQCAtMTAwNSw3ICsxMDA4LDcgQEAKICAgICAgICAgc2V0U3VnZ2VzdGVkV29yZHMoc3VnZ2VzdGVkV29yZHMsIGlzQXV0b0NvcnJlY3Rpb24pOwogICAgICAgICBzZXRBdXRvQ29ycmVjdGlvbkluZGljYXRvcihpc0F1dG9Db3JyZWN0aW9uKTsKICAgICAgICAgc2V0U3VnZ2VzdGlvblN0cmlwU2hvd24odHJ1ZSk7Ci0gICAgICAgIGlmIChQcm9kdWN0aW9uRmxhZy5JU19FWFBFUklNRU5UQUwpIHsKKyAgICAgICAgaWYgKFByb2R1Y3Rpb25GbGFnLlVTRVNfREVWRUxPUE1FTlRfT05MWV9ESUFHTk9TVElDUykgewogICAgICAgICAgICAgUmVzZWFyY2hMb2dnZXIubGF0aW5JTUVfb25EaXNwbGF5Q29tcGxldGlvbnMoYXBwbGljYXRpb25TcGVjaWZpZWRDb21wbGV0aW9ucyk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMTQ0LDcgKzExNDcsNyBAQAogICAgICAgICBpZiAodHlwZWRXb3JkLmxlbmd0aCgpID4gMCkgewogICAgICAgICAgICAgY29tbWl0Q2hvc2VuV29yZCh0eXBlZFdvcmQsIExhc3RDb21wb3NlZFdvcmQuQ09NTUlUX1RZUEVfVVNFUl9UWVBFRF9XT1JELAogICAgICAgICAgICAgICAgICAgICBzZXBhcmF0b3JTdHJpbmcpOwotICAgICAgICAgICAgaWYgKFByb2R1Y3Rpb25GbGFnLklTX0VYUEVSSU1FTlRBTCkgeworICAgICAgICAgICAgaWYgKFByb2R1Y3Rpb25GbGFnLlVTRVNfREVWRUxPUE1FTlRfT05MWV9ESUFHTk9TVElDUykgewogICAgICAgICAgICAgICAgIFJlc2VhcmNoTG9nZ2VyLmdldEluc3RhbmNlKCkub25Xb3JkRmluaXNoZWQodHlwZWRXb3JkLCBtV29yZENvbXBvc2VyLmlzQmF0Y2hNb2RlKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xMTg0LDcgKzExODcsNyBAQAogICAgICAgICAgICAgbUNvbm5lY3Rpb24uZGVsZXRlU3Vycm91bmRpbmdUZXh0KDIsIDApOwogICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRleHQgPSBsYXN0VHdvLmNoYXJBdCgxKSArICIgIjsKICAgICAgICAgICAgIG1Db25uZWN0aW9uLmNvbW1pdFRleHQodGV4dCwgMSk7Ci0gICAgICAgICAgICBpZiAoUHJvZHVjdGlvbkZsYWcuSVNfRVhQRVJJTUVOVEFMKSB7CisgICAgICAgICAgICBpZiAoUHJvZHVjdGlvbkZsYWcuVVNFU19ERVZFTE9QTUVOVF9PTkxZX0RJQUdOT1NUSUNTKSB7CiAgICAgICAgICAgICAgICAgUmVzZWFyY2hMb2dnZXIubGF0aW5JTUVfc3dhcFN3YXBwZXJBbmRTcGFjZShsYXN0VHdvLCB0ZXh0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1LZXlib2FyZFN3aXRjaGVyLnVwZGF0ZVNoaWZ0U3RhdGUoKTsKQEAgLTEyMDQsNyArMTIwNyw3IEBACiAgICAgICAgICAgICBtQ29ubmVjdGlvbi5kZWxldGVTdXJyb3VuZGluZ1RleHQoMiwgMCk7CiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdGV4dFRvSW5zZXJ0ID0gIi4gIjsKICAgICAgICAgICAgIG1Db25uZWN0aW9uLmNvbW1pdFRleHQodGV4dFRvSW5zZXJ0LCAxKTsKLSAgICAgICAgICAgIGlmIChQcm9kdWN0aW9uRmxhZy5JU19FWFBFUklNRU5UQUwpIHsKKyAgICAgICAgICAgIGlmIChQcm9kdWN0aW9uRmxhZy5VU0VTX0RFVkVMT1BNRU5UX09OTFlfRElBR05PU1RJQ1MpIHsKICAgICAgICAgICAgICAgICBSZXNlYXJjaExvZ2dlci5sYXRpbklNRV9tYXliZURvdWJsZVNwYWNlUGVyaW9kKHRleHRUb0luc2VydCwKICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGlzQmF0Y2hNb2RlICovKTsKICAgICAgICAgICAgIH0KQEAgLTEzMTksNyArMTMyMiw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHNlbmRLZXlDb2RlUG9pbnQoZmluYWwgaW50IGNvZGUpIHsKLSAgICAgICAgaWYgKFByb2R1Y3Rpb25GbGFnLklTX0VYUEVSSU1FTlRBTCkgeworICAgICAgICBpZiAoUHJvZHVjdGlvbkZsYWcuVVNFU19ERVZFTE9QTUVOVF9PTkxZX0RJQUdOT1NUSUNTKSB7CiAgICAgICAgICAgICBSZXNlYXJjaExvZ2dlci5sYXRpbklNRV9zZW5kS2V5Q29kZVBvaW50KGNvZGUpOwogICAgICAgICB9CiAgICAgICAgIC8vIFRPRE86IFJlbW92ZSB0aGlzIHNwZWNpYWwgaGFuZGxpbmcgb2YgZGlnaXQgbGV0dGVycy4KQEAgLTEzNDUsNyArMTM0OCw3IEBACiAgICAgLy8gSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIEtleWJvYXJkQWN0aW9uTGlzdGVuZXJ9LgogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uQ29kZUlucHV0KGZpbmFsIGludCBwcmltYXJ5Q29kZSwgZmluYWwgaW50IHgsIGZpbmFsIGludCB5KSB7Ci0gICAgICAgIGlmIChQcm9kdWN0aW9uRmxhZy5JU19FWFBFUklNRU5UQUwpIHsKKyAgICAgICAgaWYgKFByb2R1Y3Rpb25GbGFnLlVTRVNfREVWRUxPUE1FTlRfT05MWV9ESUFHTk9TVElDUykgewogICAgICAgICAgICAgUmVzZWFyY2hMb2dnZXIubGF0aW5JTUVfb25Db2RlSW5wdXQocHJpbWFyeUNvZGUsIHgsIHkpOwogICAgICAgICB9CiAgICAgICAgIGZpbmFsIGxvbmcgd2hlbiA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwpAQCAtMTM5Nyw3ICsxNDAwLDcgQEAKICAgICAgICAgICAgIGhhbmRsZUxhbmd1YWdlU3dpdGNoS2V5KCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBDb25zdGFudHMuQ09ERV9SRVNFQVJDSDoKLSAgICAgICAgICAgIGlmIChQcm9kdWN0aW9uRmxhZy5JU19FWFBFUklNRU5UQUwpIHsKKyAgICAgICAgICAgIGlmIChQcm9kdWN0aW9uRmxhZy5VU0VTX0RFVkVMT1BNRU5UX09OTFlfRElBR05PU1RJQ1MpIHsKICAgICAgICAgICAgICAgICBSZXNlYXJjaExvZ2dlci5nZXRJbnN0YW5jZSgpLm9uUmVzZWFyY2hLZXlTZWxlY3RlZCh0aGlzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTQ1MSw3ICsxNDU0LDcgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGRpZEF1dG9Db3JyZWN0ID0gZmFsc2U7CiAgICAgICAgICAgICBpZiAoU1BBQ0VfU1RBVEVfUEhBTlRPTSA9PSBzcGFjZVN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKFByb2R1Y3Rpb25GbGFnLklTX0lOVEVSTkFMKSB7CisgICAgICAgICAgICAgICAgaWYgKG1TZXR0aW5ncy5pc0ludGVybmFsKCkpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1Xb3JkQ29tcG9zZXIuaXNDb21wb3NpbmdXb3JkKCkgJiYgbVdvcmRDb21wb3Nlci5pc0JhdGNoTW9kZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0cy5vbkF1dG9Db3JyZWN0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgbVdvcmRDb21wb3Nlci5nZXRUeXBlZFdvcmQoKSwgIiAiLCBtV29yZENvbXBvc2VyKTsKQEAgLTE0ODksNyArMTQ5Miw3IEBACiAgICAgICAgICAgICBwcm9tb3RlUGhhbnRvbVNwYWNlKCk7CiAgICAgICAgIH0KICAgICAgICAgbUNvbm5lY3Rpb24uY29tbWl0VGV4dCh0ZXh0LCAxKTsKLSAgICAgICAgaWYgKFByb2R1Y3Rpb25GbGFnLklTX0VYUEVSSU1FTlRBTCkgeworICAgICAgICBpZiAoUHJvZHVjdGlvbkZsYWcuVVNFU19ERVZFTE9QTUVOVF9PTkxZX0RJQUdOT1NUSUNTKSB7CiAgICAgICAgICAgICBSZXNlYXJjaExvZ2dlci5sYXRpbklNRV9vblRleHRJbnB1dCh0ZXh0LCBmYWxzZSAvKiBpc0JhdGNoTW9kZSAqLyk7CiAgICAgICAgIH0KICAgICAgICAgbUNvbm5lY3Rpb24uZW5kQmF0Y2hFZGl0KCk7CkBAIC0xNTA2LDcgKzE1MDksNyBAQAogICAgICAgICBtSGFuZGxlci5jYW5jZWxVcGRhdGVTdWdnZXN0aW9uU3RyaXAoKTsKICAgICAgICAgbUNvbm5lY3Rpb24uYmVnaW5CYXRjaEVkaXQoKTsKICAgICAgICAgaWYgKG1Xb3JkQ29tcG9zZXIuaXNDb21wb3NpbmdXb3JkKCkpIHsKLSAgICAgICAgICAgIGlmIChQcm9kdWN0aW9uRmxhZy5JU19JTlRFUk5BTCkgeworICAgICAgICAgICAgaWYgKG1TZXR0aW5ncy5pc0ludGVybmFsKCkpIHsKICAgICAgICAgICAgICAgICBpZiAobVdvcmRDb21wb3Nlci5pc0JhdGNoTW9kZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIFN0YXRzLm9uQXV0b0NvcnJlY3Rpb24oIiIsIG1Xb3JkQ29tcG9zZXIuZ2V0VHlwZWRXb3JkKCksICIgIiwgbVdvcmRDb21wb3Nlcik7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTY3MCw3ICsxNjczLDcgQEAKICAgICAgICAgbUNvbm5lY3Rpb24uc2V0Q29tcG9zaW5nVGV4dChiYXRjaElucHV0VGV4dCwgMSk7CiAgICAgICAgIG1FeHBlY3RpbmdVcGRhdGVTZWxlY3Rpb24gPSB0cnVlOwogICAgICAgICBtQ29ubmVjdGlvbi5lbmRCYXRjaEVkaXQoKTsKLSAgICAgICAgaWYgKFByb2R1Y3Rpb25GbGFnLklTX0VYUEVSSU1FTlRBTCkgeworICAgICAgICBpZiAoUHJvZHVjdGlvbkZsYWcuVVNFU19ERVZFTE9QTUVOVF9PTkxZX0RJQUdOT1NUSUNTKSB7CiAgICAgICAgICAgICBSZXNlYXJjaExvZ2dlci5sYXRpbklNRV9vbkVuZEJhdGNoSW5wdXQoYmF0Y2hJbnB1dFRleHQsIDAsIHN1Z2dlc3RlZFdvcmRzKTsKICAgICAgICAgfQogICAgICAgICAvLyBTcGFjZSBzdGF0ZSBtdXN0IGJlIHVwZGF0ZWQgYmVmb3JlIGNhbGxpbmcgdXBkYXRlU2hpZnRTdGF0ZQpAQCAtMTcxOSw3ICsxNzIyLDcgQEAKICAgICAgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBtV29yZENvbXBvc2VyLnNpemUoKTsKICAgICAgICAgICAgIGlmIChsZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1Xb3JkQ29tcG9zZXIuaXNCYXRjaE1vZGUoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoUHJvZHVjdGlvbkZsYWcuSVNfRVhQRVJJTUVOVEFMKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChQcm9kdWN0aW9uRmxhZy5VU0VTX0RFVkVMT1BNRU5UX09OTFlfRElBR05PU1RJQ1MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB3b3JkID0gbVdvcmRDb21wb3Nlci5nZXRUeXBlZFdvcmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VhcmNoTG9nZ2VyLmxhdGluSU1FX2hhbmRsZUJhY2tzcGFjZV9iYXRjaCh3b3JkLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VhcmNoTG9nZ2VyLmdldEluc3RhbmNlKCkudW5jb21taXRDdXJyZW50TG9nVW5pdCgKQEAgLTE3MzYsNyArMTczOSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAobUxhc3RDb21wb3NlZFdvcmQuY2FuUmV2ZXJ0Q29tbWl0KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoUHJvZHVjdGlvbkZsYWcuSVNfSU5URVJOQUwpIHsKKyAgICAgICAgICAgICAgICBpZiAobVNldHRpbmdzLmlzSW50ZXJuYWwoKSkgewogICAgICAgICAgICAgICAgICAgICBTdGF0cy5vbkF1dG9Db3JyZWN0aW9uQ2FuY2VsbGF0aW9uKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldmVydENvbW1pdCgpOwpAQCAtMTc4MCw3ICsxNzgzLDcgQEAKICAgICAgICAgICAgICAgICAvLyBsYXRlciAodHlwaWNhbGx5LCBpbiBhIHN1YnNlcXVlbnQgcHJlc3Mgb24gYmFja3NwYWNlKS4KICAgICAgICAgICAgICAgICBtTGFzdFNlbGVjdGlvbkVuZCA9IG1MYXN0U2VsZWN0aW9uU3RhcnQ7CiAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb24uZGVsZXRlU3Vycm91bmRpbmdUZXh0KG51bUNoYXJzRGVsZXRlZCwgMCk7Ci0gICAgICAgICAgICAgICAgaWYgKFByb2R1Y3Rpb25GbGFnLklTX0VYUEVSSU1FTlRBTCkgeworICAgICAgICAgICAgICAgIGlmIChQcm9kdWN0aW9uRmxhZy5VU0VTX0RFVkVMT1BNRU5UX09OTFlfRElBR05PU1RJQ1MpIHsKICAgICAgICAgICAgICAgICAgICAgUmVzZWFyY2hMb2dnZXIubGF0aW5JTUVfaGFuZGxlQmFja3NwYWNlKG51bUNoYXJzRGVsZXRlZCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTE3OTksMTIgKzE4MDIsMTIgQEAKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbi5kZWxldGVTdXJyb3VuZGluZ1RleHQoMSwgMCk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChQcm9kdWN0aW9uRmxhZy5JU19FWFBFUklNRU5UQUwpIHsKKyAgICAgICAgICAgICAgICBpZiAoUHJvZHVjdGlvbkZsYWcuVVNFU19ERVZFTE9QTUVOVF9PTkxZX0RJQUdOT1NUSUNTKSB7CiAgICAgICAgICAgICAgICAgICAgIFJlc2VhcmNoTG9nZ2VyLmxhdGluSU1FX2hhbmRsZUJhY2tzcGFjZSgxKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKG1EZWxldGVDb3VudCA+IERFTEVURV9BQ0NFTEVSQVRFX0FUKSB7CiAgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uLmRlbGV0ZVN1cnJvdW5kaW5nVGV4dCgxLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFByb2R1Y3Rpb25GbGFnLklTX0VYUEVSSU1FTlRBTCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoUHJvZHVjdGlvbkZsYWcuVVNFU19ERVZFTE9QTUVOVF9PTkxZX0RJQUdOT1NUSUNTKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlYXJjaExvZ2dlci5sYXRpbklNRV9oYW5kbGVCYWNrc3BhY2UoMSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC0xODk1LDcgKzE4OTgsNyBAQAogICAgICAgICAgICAgaWYgKG51bGwgIT0gbVN1Z2dlc3Rpb25TdHJpcFZpZXcpIG1TdWdnZXN0aW9uU3RyaXBWaWV3LmRpc21pc3NBZGRUb0RpY3Rpb25hcnlIaW50KCk7CiAgICAgICAgIH0KICAgICAgICAgbUhhbmRsZXIucG9zdFVwZGF0ZVN1Z2dlc3Rpb25TdHJpcCgpOwotICAgICAgICBpZiAoUHJvZHVjdGlvbkZsYWcuSVNfSU5URVJOQUwpIHsKKyAgICAgICAgaWYgKG1TZXR0aW5ncy5pc0ludGVybmFsKCkpIHsKICAgICAgICAgICAgIFV0aWxzLlN0YXRzLm9uTm9uU2VwYXJhdG9yKChjaGFyKXByaW1hcnlDb2RlLCB4LCB5KTsKICAgICAgICAgfQogICAgIH0KQEAgLTE5MDMsNyArMTkwNiw3IEBACiAgICAgLy8gUmV0dXJucyB0cnVlIGlmIHdlIGRpZCBhbiBhdXRvY29ycmVjdGlvbiwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgIHByaXZhdGUgYm9vbGVhbiBoYW5kbGVTZXBhcmF0b3IoZmluYWwgaW50IHByaW1hcnlDb2RlLCBmaW5hbCBpbnQgeCwgZmluYWwgaW50IHksCiAgICAgICAgICAgICBmaW5hbCBpbnQgc3BhY2VTdGF0ZSkgewotICAgICAgICBpZiAoUHJvZHVjdGlvbkZsYWcuSVNfRVhQRVJJTUVOVEFMKSB7CisgICAgICAgIGlmIChQcm9kdWN0aW9uRmxhZy5VU0VTX0RFVkVMT1BNRU5UX09OTFlfRElBR05PU1RJQ1MpIHsKICAgICAgICAgICAgIFJlc2VhcmNoTG9nZ2VyLnJlY29yZFRpbWVGb3JMb2dVbml0U3BsaXQoKTsKICAgICAgICAgICAgIFJlc2VhcmNoTG9nZ2VyLmxhdGluSU1FX2hhbmRsZVNlcGFyYXRvcihwcmltYXJ5Q29kZSwgbVdvcmRDb21wb3Nlci5pc0NvbXBvc2luZ1dvcmQoKSk7CiAgICAgICAgIH0KQEAgLTE5NjIsNyArMTk2NSw3IEBACiAgICAgICAgICAgICAvLyBhbHJlYWR5IGRpc3BsYXllZCBvciBub3QsIHNvIGl0J3Mgb2theS4KICAgICAgICAgICAgIHNldFB1bmN0dWF0aW9uU3VnZ2VzdGlvbnMoKTsKICAgICAgICAgfQotICAgICAgICBpZiAoUHJvZHVjdGlvbkZsYWcuSVNfSU5URVJOQUwpIHsKKyAgICAgICAgaWYgKG1TZXR0aW5ncy5pc0ludGVybmFsKCkpIHsKICAgICAgICAgICAgIFV0aWxzLlN0YXRzLm9uU2VwYXJhdG9yKChjaGFyKXByaW1hcnlDb2RlLCB4LCB5KTsKICAgICAgICAgfQogCkBAIC0yMTQ1LDEwICsyMTQ4LDEwIEBACiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIldlIGhhdmUgYW4gYXV0by1jb3JyZWN0aW9uIGJ1dCB0aGUgdHlwZWQgd29yZCAiCiAgICAgICAgICAgICAgICAgICAgICAgICArICJpcyBlbXB0eT8gSW1wb3NzaWJsZSEgSSBtdXN0IGNvbW1pdCBzdWljaWRlLiIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKFByb2R1Y3Rpb25GbGFnLklTX0lOVEVSTkFMKSB7CisgICAgICAgICAgICBpZiAobVNldHRpbmdzLmlzSW50ZXJuYWwoKSkgewogICAgICAgICAgICAgICAgIFN0YXRzLm9uQXV0b0NvcnJlY3Rpb24odHlwZWRXb3JkLCBhdXRvQ29ycmVjdGlvbiwgc2VwYXJhdG9yU3RyaW5nLCBtV29yZENvbXBvc2VyKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChQcm9kdWN0aW9uRmxhZy5JU19FWFBFUklNRU5UQUwpIHsKKyAgICAgICAgICAgIGlmIChQcm9kdWN0aW9uRmxhZy5VU0VTX0RFVkVMT1BNRU5UX09OTFlfRElBR05PU1RJQ1MpIHsKICAgICAgICAgICAgICAgICBmaW5hbCBTdWdnZXN0ZWRXb3JkcyBzdWdnZXN0ZWRXb3JkcyA9IG1TdWdnZXN0ZWRXb3JkczsKICAgICAgICAgICAgICAgICBSZXNlYXJjaExvZ2dlci5sYXRpbkltZV9jb21taXRDdXJyZW50QXV0b0NvcnJlY3Rpb24odHlwZWRXb3JkLCBhdXRvQ29ycmVjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgIHNlcGFyYXRvclN0cmluZywgbVdvcmRDb21wb3Nlci5pc0JhdGNoTW9kZSgpLCBzdWdnZXN0ZWRXb3Jkcyk7CkBAIC0yMTg0LDcgKzIxODcsNyBAQAogICAgICAgICAgICAgZmluYWwgaW50IHByaW1hcnlDb2RlID0gc3VnZ2VzdGlvbi5jaGFyQXQoMCk7CiAgICAgICAgICAgICBvbkNvZGVJbnB1dChwcmltYXJ5Q29kZSwKICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlNVR0dFU1RJT05fU1RSSVBfQ09PUkRJTkFURSwgQ29uc3RhbnRzLlNVR0dFU1RJT05fU1RSSVBfQ09PUkRJTkFURSk7Ci0gICAgICAgICAgICBpZiAoUHJvZHVjdGlvbkZsYWcuSVNfRVhQRVJJTUVOVEFMKSB7CisgICAgICAgICAgICBpZiAoUHJvZHVjdGlvbkZsYWcuVVNFU19ERVZFTE9QTUVOVF9PTkxZX0RJQUdOT1NUSUNTKSB7CiAgICAgICAgICAgICAgICAgUmVzZWFyY2hMb2dnZXIubGF0aW5JTUVfcHVuY3R1YXRpb25TdWdnZXN0aW9uKGluZGV4LCBzdWdnZXN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogaXNCYXRjaE1vZGUgKi8sIHN1Z2dlc3RlZFdvcmRzLm1Jc1ByZWRpY3Rpb24pOwogICAgICAgICAgICAgfQpAQCAtMjIyNSw3ICsyMjI4LDcgQEAKICAgICAgICAgbUV4cGVjdGluZ1VwZGF0ZVNlbGVjdGlvbiA9IHRydWU7CiAgICAgICAgIGNvbW1pdENob3NlbldvcmQoc3VnZ2VzdGlvbiwgTGFzdENvbXBvc2VkV29yZC5DT01NSVRfVFlQRV9NQU5VQUxfUElDSywKICAgICAgICAgICAgICAgICBMYXN0Q29tcG9zZWRXb3JkLk5PVF9BX1NFUEFSQVRPUik7Ci0gICAgICAgIGlmIChQcm9kdWN0aW9uRmxhZy5JU19FWFBFUklNRU5UQUwpIHsKKyAgICAgICAgaWYgKFByb2R1Y3Rpb25GbGFnLlVTRVNfREVWRUxPUE1FTlRfT05MWV9ESUFHTk9TVElDUykgewogICAgICAgICAgICAgUmVzZWFyY2hMb2dnZXIubGF0aW5JTUVfcGlja1N1Z2dlc3Rpb25NYW51YWxseShyZXBsYWNlZFdvcmQsIGluZGV4LCBzdWdnZXN0aW9uLAogICAgICAgICAgICAgICAgICAgICBtV29yZENvbXBvc2VyLmlzQmF0Y2hNb2RlKCkpOwogICAgICAgICB9CkBAIC0yMjQ0LDcgKzIyNDcsNyBAQAogICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzdWdnZXN0aW9uIGlzIG5vdCBpbiB0aGUgZGljdGlvbmFyeSwgdGhlIGhpbnQgc2hvdWxkIGJlIHNob3duLgogICAgICAgICAgICAgICAgICYmICFBdXRvQ29ycmVjdGlvbi5pc1ZhbGlkV29yZChtU3VnZ2VzdC5nZXRVbmlncmFtRGljdGlvbmFyaWVzKCksIHN1Z2dlc3Rpb24sIHRydWUpOwogCi0gICAgICAgIGlmIChQcm9kdWN0aW9uRmxhZy5JU19JTlRFUk5BTCkgeworICAgICAgICBpZiAobVNldHRpbmdzLmlzSW50ZXJuYWwoKSkgewogICAgICAgICAgICAgU3RhdHMub25TZXBhcmF0b3IoKGNoYXIpQ29uc3RhbnRzLkNPREVfU1BBQ0UsCiAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5OT1RfQV9DT09SRElOQVRFLCBDb25zdGFudHMuTk9UX0FfQ09PUkRJTkFURSk7CiAgICAgICAgIH0KQEAgLTIzMjYsNyArMjMyOSw3IEBACiAgICAgICAgICAgICByZXN0YXJ0U3VnZ2VzdGlvbnNPbldvcmRCZWZvcmVDdXJzb3Iod29yZCk7CiAgICAgICAgICAgICAvLyBUT0RPOiBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIHVzZXIgbWFudWFsbHkgbW92ZXMgdGhlIGN1cnNvciBhbmQgdGhlbiBiYWNrcyB1cCBvdmVyCiAgICAgICAgICAgICAvLyBhIHNlcGFyYXRvci4gIEluIHRoYXQgY2FzZSwgdGhlIGN1cnJlbnQgbG9nIHVuaXQgc2hvdWxkIG5vdCBiZSB1bmNvbW1pdHRlZC4KLSAgICAgICAgICAgIGlmIChQcm9kdWN0aW9uRmxhZy5JU19FWFBFUklNRU5UQUwpIHsKKyAgICAgICAgICAgIGlmIChQcm9kdWN0aW9uRmxhZy5VU0VTX0RFVkVMT1BNRU5UX09OTFlfRElBR05PU1RJQ1MpIHsKICAgICAgICAgICAgICAgICBSZXNlYXJjaExvZ2dlci5nZXRJbnN0YW5jZSgpLnVuY29tbWl0Q3VycmVudExvZ1VuaXQod29yZC50b1N0cmluZygpLAogICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBkdW1wQ3VycmVudExvZ1VuaXQgKi8pOwogICAgICAgICAgICAgfQpAQCAtMjM2OCwxMSArMjM3MSwxMSBAQAogICAgICAgICAgICAgbVVzZXJIaXN0b3J5RGljdGlvbmFyeS5jYW5jZWxBZGRpbmdVc2VySGlzdG9yeShwcmV2aW91c1dvcmQsIGNvbW1pdHRlZFdvcmQpOwogICAgICAgICB9CiAgICAgICAgIG1Db25uZWN0aW9uLmNvbW1pdFRleHQob3JpZ2luYWxseVR5cGVkV29yZCArIG1MYXN0Q29tcG9zZWRXb3JkLm1TZXBhcmF0b3JTdHJpbmcsIDEpOwotICAgICAgICBpZiAoUHJvZHVjdGlvbkZsYWcuSVNfSU5URVJOQUwpIHsKKyAgICAgICAgaWYgKG1TZXR0aW5ncy5pc0ludGVybmFsKCkpIHsKICAgICAgICAgICAgIFN0YXRzLm9uU2VwYXJhdG9yKG1MYXN0Q29tcG9zZWRXb3JkLm1TZXBhcmF0b3JTdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5OT1RfQV9DT09SRElOQVRFLCBDb25zdGFudHMuTk9UX0FfQ09PUkRJTkFURSk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKFByb2R1Y3Rpb25GbGFnLklTX0VYUEVSSU1FTlRBTCkgeworICAgICAgICBpZiAoUHJvZHVjdGlvbkZsYWcuVVNFU19ERVZFTE9QTUVOVF9PTkxZX0RJQUdOT1NUSUNTKSB7CiAgICAgICAgICAgICBSZXNlYXJjaExvZ2dlci5sYXRpbklNRV9yZXZlcnRDb21taXQoY29tbWl0dGVkV29yZCwgb3JpZ2luYWxseVR5cGVkV29yZCwKICAgICAgICAgICAgICAgICAgICAgbVdvcmRDb21wb3Nlci5pc0JhdGNoTW9kZSgpLCBtTGFzdENvbXBvc2VkV29yZC5tU2VwYXJhdG9yU3RyaW5nKTsKICAgICAgICAgICAgIFJlc2VhcmNoTG9nZ2VyLmdldEluc3RhbmNlKCkudW5jb21taXRDdXJyZW50TG9nVW5pdChjb21taXR0ZWRXb3JkLApAQCAtMjM4OSw3ICsyMzkyLDcgQEAKICAgICBwdWJsaWMgdm9pZCBwcm9tb3RlUGhhbnRvbVNwYWNlKCkgewogICAgICAgICBpZiAobVNldHRpbmdzLmdldEN1cnJlbnQoKS5zaG91bGRJbnNlcnRTcGFjZXNBdXRvbWF0aWNhbGx5KCkpIHsKICAgICAgICAgICAgIHNlbmRLZXlDb2RlUG9pbnQoQ29uc3RhbnRzLkNPREVfU1BBQ0UpOwotICAgICAgICAgICAgaWYgKFByb2R1Y3Rpb25GbGFnLklTX0VYUEVSSU1FTlRBTCkgeworICAgICAgICAgICAgaWYgKFByb2R1Y3Rpb25GbGFnLlVTRVNfREVWRUxPUE1FTlRfT05MWV9ESUFHTk9TVElDUykgewogICAgICAgICAgICAgICAgIFJlc2VhcmNoTG9nZ2VyLmxhdGluSU1FX3Byb21vdGVQaGFudG9tU3BhY2UoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjUwMiwxMiArMjUwNSw2IEBACiAgICAgICAgIGxhdW5jaFN1YkFjdGl2aXR5KFNldHRpbmdzQWN0aXZpdHkuY2xhc3MpOwogICAgIH0KIAotICAgIC8vIENhbGxlZCBmcm9tIGRlYnVnIGNvZGUgb25seQotICAgIHB1YmxpYyB2b2lkIGxhdW5jaERlYnVnU2V0dGluZ3MoKSB7Ci0gICAgICAgIGhhbmRsZUNsb3NlKCk7Ci0gICAgICAgIGxhdW5jaFN1YkFjdGl2aXR5KERlYnVnU2V0dGluZ3NBY3Rpdml0eS5jbGFzcyk7Ci0gICAgfQotCiAgICAgcHVibGljIHZvaWQgbGF1bmNoS2V5Ym9hcmRlZERpYWxvZ0FjdGl2aXR5KGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBBY3Rpdml0eT4gYWN0aXZpdHlDbGFzcykgewogICAgICAgICAvLyBQdXQgdGhlIHRleHQgaW4gdGhlIGF0dGFjaGVkIEVkaXRUZXh0IGludG8gYSBzYWZlLCBzYXZlZCBzdGF0ZSBiZWZvcmUgc3dpdGNoaW5nIHRvIGEKICAgICAgICAgLy8gbmV3IGFjdGl2aXR5IHRoYXQgd2lsbCBhbHNvIHVzZSB0aGUgc29mdCBrZXlib2FyZC4KZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL1JpY2hJbnB1dENvbm5lY3Rpb24uamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL1JpY2hJbnB1dENvbm5lY3Rpb24uamF2YQppbmRleCA3MzAwZGJkLi44YTdhZGU0IDEwMDY0NAotLS0gYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9SaWNoSW5wdXRDb25uZWN0aW9uLmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vUmljaElucHV0Q29ubmVjdGlvbi5qYXZhCkBAIC0xNDIsNyArMTQyLDcgQEAKICAgICAgICAgaWYgKG51bGwgIT0gdGV4dEJlZm9yZUN1cnNvcikgbUNvbW1pdHRlZFRleHRCZWZvcmVDb21wb3NpbmdUZXh0LmFwcGVuZCh0ZXh0QmVmb3JlQ3Vyc29yKTsKICAgICAgICAgaWYgKG51bGwgIT0gbUlDKSB7CiAgICAgICAgICAgICBtSUMuZmluaXNoQ29tcG9zaW5nVGV4dCgpOwotICAgICAgICAgICAgaWYgKFByb2R1Y3Rpb25GbGFnLklTX0VYUEVSSU1FTlRBTCkgeworICAgICAgICAgICAgaWYgKFByb2R1Y3Rpb25GbGFnLlVTRVNfREVWRUxPUE1FTlRfT05MWV9ESUFHTk9TVElDUykgewogICAgICAgICAgICAgICAgIFJlc2VhcmNoTG9nZ2VyLnJpY2hJbnB1dENvbm5lY3Rpb25fZmluaXNoQ29tcG9zaW5nVGV4dCgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xNjQsNyArMTY0LDcgQEAKICAgICAgICAgbUNvbXBvc2luZ1RleHQuc2V0TGVuZ3RoKDApOwogICAgICAgICBpZiAobnVsbCAhPSBtSUMpIHsKICAgICAgICAgICAgIG1JQy5maW5pc2hDb21wb3NpbmdUZXh0KCk7Ci0gICAgICAgICAgICBpZiAoUHJvZHVjdGlvbkZsYWcuSVNfRVhQRVJJTUVOVEFMKSB7CisgICAgICAgICAgICBpZiAoUHJvZHVjdGlvbkZsYWcuVVNFU19ERVZFTE9QTUVOVF9PTkxZX0RJQUdOT1NUSUNTKSB7CiAgICAgICAgICAgICAgICAgUmVzZWFyY2hMb2dnZXIucmljaElucHV0Q29ubmVjdGlvbl9maW5pc2hDb21wb3NpbmdUZXh0KCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTI2Myw3ICsyNjMsNyBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChudWxsICE9IG1JQykgewogICAgICAgICAgICAgbUlDLmRlbGV0ZVN1cnJvdW5kaW5nVGV4dChpLCBqKTsKLSAgICAgICAgICAgIGlmIChQcm9kdWN0aW9uRmxhZy5JU19FWFBFUklNRU5UQUwpIHsKKyAgICAgICAgICAgIGlmIChQcm9kdWN0aW9uRmxhZy5VU0VTX0RFVkVMT1BNRU5UX09OTFlfRElBR05PU1RJQ1MpIHsKICAgICAgICAgICAgICAgICBSZXNlYXJjaExvZ2dlci5yaWNoSW5wdXRDb25uZWN0aW9uX2RlbGV0ZVN1cnJvdW5kaW5nVGV4dChpLCBqKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjc0LDcgKzI3NCw3IEBACiAgICAgICAgIG1JQyA9IG1QYXJlbnQuZ2V0Q3VycmVudElucHV0Q29ubmVjdGlvbigpOwogICAgICAgICBpZiAobnVsbCAhPSBtSUMpIHsKICAgICAgICAgICAgIG1JQy5wZXJmb3JtRWRpdG9yQWN0aW9uKGFjdGlvbklkKTsKLSAgICAgICAgICAgIGlmIChQcm9kdWN0aW9uRmxhZy5JU19FWFBFUklNRU5UQUwpIHsKKyAgICAgICAgICAgIGlmIChQcm9kdWN0aW9uRmxhZy5VU0VTX0RFVkVMT1BNRU5UX09OTFlfRElBR05PU1RJQ1MpIHsKICAgICAgICAgICAgICAgICBSZXNlYXJjaExvZ2dlci5yaWNoSW5wdXRDb25uZWN0aW9uX3BlcmZvcm1FZGl0b3JBY3Rpb24oYWN0aW9uSWQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0zMjIsNyArMzIyLDcgQEAKICAgICAgICAgfQogICAgICAgICBpZiAobnVsbCAhPSBtSUMpIHsKICAgICAgICAgICAgIG1JQy5zZW5kS2V5RXZlbnQoa2V5RXZlbnQpOwotICAgICAgICAgICAgaWYgKFByb2R1Y3Rpb25GbGFnLklTX0VYUEVSSU1FTlRBTCkgeworICAgICAgICAgICAgaWYgKFByb2R1Y3Rpb25GbGFnLlVTRVNfREVWRUxPUE1FTlRfT05MWV9ESUFHTk9TVElDUykgewogICAgICAgICAgICAgICAgIFJlc2VhcmNoTG9nZ2VyLnJpY2hJbnB1dENvbm5lY3Rpb25fc2VuZEtleUV2ZW50KGtleUV2ZW50KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMzU1LDcgKzM1NSw3IEBACiAgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgdmFsdWVzIG9mIGkgIT0gMS4gQXQgdGhpcyB0aW1lLCB0aGlzIGlzIG5ldmVyIGNhbGxlZCB3aXRoIGkgIT0gMS4KICAgICAgICAgaWYgKG51bGwgIT0gbUlDKSB7CiAgICAgICAgICAgICBtSUMuc2V0Q29tcG9zaW5nVGV4dCh0ZXh0LCBpKTsKLSAgICAgICAgICAgIGlmIChQcm9kdWN0aW9uRmxhZy5JU19FWFBFUklNRU5UQUwpIHsKKyAgICAgICAgICAgIGlmIChQcm9kdWN0aW9uRmxhZy5VU0VTX0RFVkVMT1BNRU5UX09OTFlfRElBR05PU1RJQ1MpIHsKICAgICAgICAgICAgICAgICBSZXNlYXJjaExvZ2dlci5yaWNoSW5wdXRDb25uZWN0aW9uX3NldENvbXBvc2luZ1RleHQodGV4dCwgaSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTM2Nyw3ICszNjcsNyBAQAogICAgICAgICBpZiAoREVCVUdfUFJFVklPVVNfVEVYVCkgY2hlY2tDb25zaXN0ZW5jeUZvckRlYnVnKCk7CiAgICAgICAgIGlmIChudWxsICE9IG1JQykgewogICAgICAgICAgICAgbUlDLnNldFNlbGVjdGlvbihmcm9tLCB0byk7Ci0gICAgICAgICAgICBpZiAoUHJvZHVjdGlvbkZsYWcuSVNfRVhQRVJJTUVOVEFMKSB7CisgICAgICAgICAgICBpZiAoUHJvZHVjdGlvbkZsYWcuVVNFU19ERVZFTE9QTUVOVF9PTkxZX0RJQUdOT1NUSUNTKSB7CiAgICAgICAgICAgICAgICAgUmVzZWFyY2hMb2dnZXIucmljaElucHV0Q29ubmVjdGlvbl9zZXRTZWxlY3Rpb24oZnJvbSwgdG8pOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0zOTYsNyArMzk2LDcgQEAKICAgICAgICAgbUNvbXBvc2luZ1RleHQuc2V0TGVuZ3RoKDApOwogICAgICAgICBpZiAobnVsbCAhPSBtSUMpIHsKICAgICAgICAgICAgIG1JQy5jb21taXRDb21wbGV0aW9uKGNvbXBsZXRpb25JbmZvKTsKLSAgICAgICAgICAgIGlmIChQcm9kdWN0aW9uRmxhZy5JU19FWFBFUklNRU5UQUwpIHsKKyAgICAgICAgICAgIGlmIChQcm9kdWN0aW9uRmxhZy5VU0VTX0RFVkVMT1BNRU5UX09OTFlfRElBR05PU1RJQ1MpIHsKICAgICAgICAgICAgICAgICBSZXNlYXJjaExvZ2dlci5yaWNoSW5wdXRDb25uZWN0aW9uX2NvbW1pdENvbXBsZXRpb24oY29tcGxldGlvbkluZm8pOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC02NTcsNyArNjU3LDcgQEAKICAgICAgICAgZGVsZXRlU3Vycm91bmRpbmdUZXh0KDIsIDApOwogICAgICAgICBmaW5hbCBTdHJpbmcgZG91YmxlU3BhY2UgPSAiICAiOwogICAgICAgICBjb21taXRUZXh0KGRvdWJsZVNwYWNlLCAxKTsKLSAgICAgICAgaWYgKFByb2R1Y3Rpb25GbGFnLklTX0VYUEVSSU1FTlRBTCkgeworICAgICAgICBpZiAoUHJvZHVjdGlvbkZsYWcuVVNFU19ERVZFTE9QTUVOVF9PTkxZX0RJQUdOT1NUSUNTKSB7CiAgICAgICAgICAgICBSZXNlYXJjaExvZ2dlci5yaWNoSW5wdXRDb25uZWN0aW9uX3JldmVydERvdWJsZVNwYWNlUGVyaW9kKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC02ODIsNyArNjgyLDcgQEAKICAgICAgICAgZGVsZXRlU3Vycm91bmRpbmdUZXh0KDIsIDApOwogICAgICAgICBmaW5hbCBTdHJpbmcgdGV4dCA9ICIgIiArIHRleHRCZWZvcmVDdXJzb3Iuc3ViU2VxdWVuY2UoMCwgMSk7CiAgICAgICAgIGNvbW1pdFRleHQodGV4dCwgMSk7Ci0gICAgICAgIGlmIChQcm9kdWN0aW9uRmxhZy5JU19FWFBFUklNRU5UQUwpIHsKKyAgICAgICAgaWYgKFByb2R1Y3Rpb25GbGFnLlVTRVNfREVWRUxPUE1FTlRfT05MWV9ESUFHTk9TVElDUykgewogICAgICAgICAgICAgUmVzZWFyY2hMb2dnZXIucmljaElucHV0Q29ubmVjdGlvbl9yZXZlcnRTd2FwUHVuY3R1YXRpb24oKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL1NldHRpbmdzLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9TZXR0aW5ncy5qYXZhCmluZGV4IDQzNTA3NGIuLmNlNjU5YmYgMTAwNjQ0Ci0tLSBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL1NldHRpbmdzLmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vU2V0dGluZ3MuamF2YQpAQCAtNzAsMTIgKzcwLDE1IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9JTlBVVF9MQU5HVUFHRSA9ICJpbnB1dF9sYW5ndWFnZSI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9TRUxFQ1RFRF9MQU5HVUFHRVMgPSAic2VsZWN0ZWRfbGFuZ3VhZ2VzIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0RFQlVHX1NFVFRJTkdTID0gImRlYnVnX3NldHRpbmdzIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0tFWV9JU19JTlRFUk5BTCA9ICJwcmVmX2tleV9pc19pbnRlcm5hbCI7CiAKICAgICAvLyBUaGlzIHByZWZlcmVuY2Uga2V5IGlzIGRlcHJlY2F0ZWQuIFVzZSB7QGxpbmsgI1BSRUZfU0hPV19MQU5HVUFHRV9TV0lUQ0hfS0VZfSBpbnN0ZWFkLgogICAgIC8vIFRoaXMgaXMgYmVpbmcgdXNlZCBvbmx5IGZvciB0aGUgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9TVVBQUkVTU19MQU5HVUFHRV9TV0lUQ0hfS0VZID0KICAgICAgICAgICAgICJwcmVmX3N1cHByZXNzX2xhbmd1YWdlX3N3aXRjaF9rZXkiOwogCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9TRU5EX0ZFRURCQUNLID0gInNlbmRfZmVlZGJhY2siOworCiAgICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlczsKICAgICBwcml2YXRlIFNoYXJlZFByZWZlcmVuY2VzIG1QcmVmczsKICAgICBwcml2YXRlIExvY2FsZSBtQ3VycmVudExvY2FsZTsKQEAgLTEyNyw2ICsxMzAsMTAgQEAKICAgICAgICAgcmV0dXJuIG1TZXR0aW5nc1ZhbHVlczsKICAgICB9CiAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ludGVybmFsKCkgeworICAgICAgICByZXR1cm4gbVNldHRpbmdzVmFsdWVzLm1Jc0ludGVybmFsOworICAgIH0KKwogICAgIC8vIEFjY2Vzc2VkIGZyb20gdGhlIHNldHRpbmdzIGludGVyZmFjZSwgaGVuY2UgcHVibGljCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHJlYWRLZXlwcmVzc1NvdW5kRW5hYmxlZChmaW5hbCBTaGFyZWRQcmVmZXJlbmNlcyBwcmVmcywKICAgICAgICAgICAgIGZpbmFsIFJlc291cmNlcyByZXMpIHsKQEAgLTI3NCw0ICsyODEsOCBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBwcmVmcy5nZXRCb29sZWFuKFNldHRpbmdzLlBSRUZfU0hPV19TRVRVUF9XSVpBUkRfSUNPTiwgZmFsc2UpOwogICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ludGVybmFsKGZpbmFsIFNoYXJlZFByZWZlcmVuY2VzIHByZWZzKSB7CisgICAgICAgIHJldHVybiBwcmVmcy5nZXRCb29sZWFuKFNldHRpbmdzLlBSRUZfS0VZX0lTX0lOVEVSTkFMLCBmYWxzZSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vU2V0dGluZ3NBY3Rpdml0eS5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vU2V0dGluZ3NBY3Rpdml0eS5qYXZhCmluZGV4IGVkOGNmNmQuLjk5YjU3MmUgMTAwNjQ0Ci0tLSBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL1NldHRpbmdzQWN0aXZpdHkuamF2YQorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9TZXR0aW5nc0FjdGl2aXR5LmphdmEKQEAgLTI1LDkgKzI1LDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgSW50ZW50IGdldEludGVudCgpIHsKICAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IHN1cGVyLmdldEludGVudCgpOwotICAgICAgICBpZiAoIWludGVudC5oYXNFeHRyYShFWFRSQV9TSE9XX0ZSQUdNRU5UKSkgewotICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKEVYVFJBX1NIT1dfRlJBR01FTlQsIERFRkFVTFRfRlJBR01FTlQpOwotICAgICAgICB9CisgICAgICAgIGludGVudC5wdXRFeHRyYShFWFRSQV9TSE9XX0ZSQUdNRU5ULCBERUZBVUxUX0ZSQUdNRU5UKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKEVYVFJBX05PX0hFQURFUlMsIHRydWUpOwogICAgICAgICByZXR1cm4gaW50ZW50OwogICAgIH0KZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL1NldHRpbmdzRnJhZ21lbnQuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL1NldHRpbmdzRnJhZ21lbnQuamF2YQppbmRleCA0YzkwZTQ4Li40ZmRkODM5IDEwMDY0NAotLS0gYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9TZXR0aW5nc0ZyYWdtZW50LmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vU2V0dGluZ3NGcmFnbWVudC5qYXZhCkBAIC0xNiw2ICsxNiw3IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW47CiAKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLmFwcC5iYWNrdXAuQmFja3VwTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwpAQCAtMjYsMTAgKzI3LDEyIEBACiBpbXBvcnQgYW5kcm9pZC5wcmVmZXJlbmNlLkNoZWNrQm94UHJlZmVyZW5jZTsKIGltcG9ydCBhbmRyb2lkLnByZWZlcmVuY2UuTGlzdFByZWZlcmVuY2U7CiBpbXBvcnQgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2U7CitpbXBvcnQgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2UuT25QcmVmZXJlbmNlQ2xpY2tMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUdyb3VwOwogaW1wb3J0IGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlU2NyZWVuOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dE1ldGhvZFN1YnR5cGU7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5kaWN0aW9uYXJ5cGFjay5EaWN0aW9uYXJ5U2V0dGluZ3NBY3Rpdml0eTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi5kZWZpbmUuUHJvZHVjdGlvbkZsYWc7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uc2V0dXAuTGF1bmNoZXJJY29uVmlzaWJpbGl0eU1hbmFnZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2Rjb21tb24uSW5wdXRNZXRob2RTZXR0aW5nc0ZyYWdtZW50OwpAQCAtOTIsNyArOTUsNyBAQAogCiAgICAgICAgIGZpbmFsIFByZWZlcmVuY2UgZGVidWdTZXR0aW5ncyA9IGZpbmRQcmVmZXJlbmNlKFNldHRpbmdzLlBSRUZfREVCVUdfU0VUVElOR1MpOwogICAgICAgICBpZiAoZGVidWdTZXR0aW5ncyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoUHJvZHVjdGlvbkZsYWcuSVNfSU5URVJOQUwpIHsKKyAgICAgICAgICAgIGlmIChTZXR0aW5ncy5pc0ludGVybmFsKHByZWZzKSkgewogICAgICAgICAgICAgICAgIGZpbmFsIEludGVudCBkZWJ1Z1NldHRpbmdzSW50ZW50ID0gbmV3IEludGVudChJbnRlbnQuQUNUSU9OX01BSU4pOwogICAgICAgICAgICAgICAgIGRlYnVnU2V0dGluZ3NJbnRlbnQuc2V0Q2xhc3NOYW1lKAogICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRQYWNrYWdlTmFtZSgpLCBEZWJ1Z1NldHRpbmdzQWN0aXZpdHkuY2xhc3MuZ2V0TmFtZSgpKTsKQEAgLTEwMiw2ICsxMDUsMjUgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIGZpbmFsIFByZWZlcmVuY2UgZmVlZGJhY2tTZXR0aW5ncyA9IGZpbmRQcmVmZXJlbmNlKFNldHRpbmdzLlBSRUZfU0VORF9GRUVEQkFDSyk7CisgICAgICAgIGlmIChmZWVkYmFja1NldHRpbmdzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChGZWVkYmFja1V0aWxzLmlzRmVlZGJhY2tGb3JtU3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgICAgICBmZWVkYmFja1NldHRpbmdzLnNldE9uUHJlZmVyZW5jZUNsaWNrTGlzdGVuZXIobmV3IE9uUHJlZmVyZW5jZUNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblByZWZlcmVuY2VDbGljayhQcmVmZXJlbmNlIGFyZzApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5IGFjdGl2aXR5ID0gZ2V0QWN0aXZpdHkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZlZWRiYWNrVXRpbHMuc2hvd0ZlZWRiYWNrRm9ybShhY3Rpdml0eSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFjdGl2aXR5LmlzRmluaXNoaW5nKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eS5maW5pc2goKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1pc2NTZXR0aW5ncy5yZW1vdmVQcmVmZXJlbmNlKGZlZWRiYWNrU2V0dGluZ3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgZmluYWwgYm9vbGVhbiBzaG93Vm9pY2VLZXlPcHRpb24gPSByZXMuZ2V0Qm9vbGVhbigKICAgICAgICAgICAgICAgICBSLmJvb2wuY29uZmlnX2VuYWJsZV9zaG93X3ZvaWNlX2tleV9vcHRpb24pOwogICAgICAgICBpZiAoIXNob3dWb2ljZUtleU9wdGlvbikgewpAQCAtMTQ2LDkgKzE2OCwxMSBAQAogICAgICAgICBmaW5hbCBQcmVmZXJlbmNlU2NyZWVuIGRpY3Rpb25hcnlMaW5rID0KICAgICAgICAgICAgICAgICAoUHJlZmVyZW5jZVNjcmVlbikgZmluZFByZWZlcmVuY2UoU2V0dGluZ3MuUFJFRl9DT05GSUdVUkVfRElDVElPTkFSSUVTX0tFWSk7CiAgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBkaWN0aW9uYXJ5TGluay5nZXRJbnRlbnQoKTsKKyAgICAgICAgaW50ZW50LnNldENsYXNzTmFtZShjb250ZXh0LmdldFBhY2thZ2VOYW1lKCksIERpY3Rpb25hcnlTZXR0aW5nc0FjdGl2aXR5LmNsYXNzLmdldE5hbWUoKSk7CiAgICAgICAgIGZpbmFsIGludCBudW1iZXIgPSBjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCkucXVlcnlJbnRlbnRBY3Rpdml0aWVzKGludGVudCwgMCkuc2l6ZSgpOwotICAgICAgICAvLyBUT0RPOiBUaGUgZXhwZXJpbWVudGFsIHZlcnNpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgRGljdGlvbmFyeSBQYWNrIFNlcnZpY2UgeWV0Ci0gICAgICAgIGlmIChQcm9kdWN0aW9uRmxhZy5JU19FWFBFUklNRU5UQUwgfHwgMCA+PSBudW1iZXIpIHsKKyAgICAgICAgLy8gVE9ETzogVGhlIGRldmVsb3BtZW50LW9ubHktZGlhZ25vc3RpYyB2ZXJzaW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIERpY3Rpb25hcnkgUGFjaworICAgICAgICAvLyBTZXJ2aWNlIHlldAorICAgICAgICBpZiAoUHJvZHVjdGlvbkZsYWcuVVNFU19ERVZFTE9QTUVOVF9PTkxZX0RJQUdOT1NUSUNTIHx8IDAgPj0gbnVtYmVyKSB7CiAgICAgICAgICAgICB0ZXh0Q29ycmVjdGlvbkdyb3VwLnJlbW92ZVByZWZlcmVuY2UoZGljdGlvbmFyeUxpbmspOwogICAgICAgICB9CiAKQEAgLTE1NiwxMCArMTgwLDYgQEAKICAgICAgICAgICAgIHJlbW92ZVByZWZlcmVuY2UoU2V0dGluZ3MuUFJFRl9HRVNUVVJFX1NFVFRJTkdTLCBnZXRQcmVmZXJlbmNlU2NyZWVuKCkpOwogICAgICAgICB9CiAKLSAgICAgICAgZmluYWwgQ2hlY2tCb3hQcmVmZXJlbmNlIHNob3dTZXR1cFdpemFyZEljb24gPQotICAgICAgICAgICAgICAgIChDaGVja0JveFByZWZlcmVuY2UpZmluZFByZWZlcmVuY2UoU2V0dGluZ3MuUFJFRl9TSE9XX1NFVFVQX1dJWkFSRF9JQ09OKTsKLSAgICAgICAgc2hvd1NldHVwV2l6YXJkSWNvbi5zZXRDaGVja2VkKFNldHRpbmdzLnJlYWRTaG93U2V0dXBXaXphcmRJY29uKHByZWZzLCBjb250ZXh0KSk7Ci0KICAgICAgICAgc2V0dXBLZXlMb25ncHJlc3NUaW1lb3V0U2V0dGluZ3MocHJlZnMsIHJlcyk7CiAgICAgICAgIHNldHVwS2V5cHJlc3NWaWJyYXRpb25EdXJhdGlvblNldHRpbmdzKHByZWZzLCByZXMpOwogICAgICAgICBzZXR1cEtleXByZXNzU291bmRWb2x1bWVTZXR0aW5ncyhwcmVmcywgcmVzKTsKQEAgLTE3NSw2ICsxOTUsMTAgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGdldFByZWZlcmVuY2VTY3JlZW4oKS5yZW1vdmVQcmVmZXJlbmNlKG1Wb2ljZVByZWZlcmVuY2UpOwogICAgICAgICB9CisgICAgICAgIGZpbmFsIFNoYXJlZFByZWZlcmVuY2VzIHByZWZzID0gZ2V0UHJlZmVyZW5jZU1hbmFnZXIoKS5nZXRTaGFyZWRQcmVmZXJlbmNlcygpOworICAgICAgICBmaW5hbCBDaGVja0JveFByZWZlcmVuY2Ugc2hvd1NldHVwV2l6YXJkSWNvbiA9CisgICAgICAgICAgICAgICAgKENoZWNrQm94UHJlZmVyZW5jZSlmaW5kUHJlZmVyZW5jZShTZXR0aW5ncy5QUkVGX1NIT1dfU0VUVVBfV0laQVJEX0lDT04pOworICAgICAgICBzaG93U2V0dXBXaXphcmRJY29uLnNldENoZWNrZWQoU2V0dGluZ3MucmVhZFNob3dTZXR1cFdpemFyZEljb24ocHJlZnMsIGdldEFjdGl2aXR5KCkpKTsKICAgICAgICAgdXBkYXRlU2hvd0NvcnJlY3Rpb25TdWdnZXN0aW9uc1N1bW1hcnkoKTsKICAgICAgICAgdXBkYXRlS2V5UHJldmlld1BvcHVwRGVsYXlTdW1tYXJ5KCk7CiAgICAgICAgIHVwZGF0ZUN1c3RvbUlucHV0U3R5bGVzU3VtbWFyeSgpOwpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vU2V0dGluZ3NWYWx1ZXMuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL1NldHRpbmdzVmFsdWVzLmphdmEKaW5kZXggZDA1ODY4MC4uZjc3YTkyOCAxMDA2NDQKLS0tIGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vU2V0dGluZ3NWYWx1ZXMuamF2YQorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9TZXR0aW5nc1ZhbHVlcy5qYXZhCkBAIC03Niw2ICs3Niw5IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Wb2ljZUtleUVuYWJsZWQ7CiAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Wb2ljZUtleU9uTWFpbjsKIAorICAgIC8vIERlYnVnIHNldHRpbmdzCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gbUlzSW50ZXJuYWw7CisKICAgICBwdWJsaWMgU2V0dGluZ3NWYWx1ZXMoZmluYWwgU2hhcmVkUHJlZmVyZW5jZXMgcHJlZnMsIGZpbmFsIFJlc291cmNlcyByZXMsCiAgICAgICAgICAgICBmaW5hbCBJbnB1dEF0dHJpYnV0ZXMgaW5wdXRBdHRyaWJ1dGVzKSB7CiAgICAgICAgIC8vIEdldCB0aGUgcmVzb3VyY2VzCkBAIC0xNDEsNiArMTQ0LDcgQEAKICAgICAgICAgICAgICAgICBTZXR0aW5ncy5QUkVGX1NIT1dfU1VHR0VTVElPTlNfU0VUVElORywKICAgICAgICAgICAgICAgICByZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLnByZWZzX3N1Z2dlc3Rpb25fdmlzaWJpbGl0eV9kZWZhdWx0X3ZhbHVlKSk7CiAgICAgICAgIG1TdWdnZXN0aW9uVmlzaWJpbGl0eSA9IGNyZWF0ZVN1Z2dlc3Rpb25WaXNpYmlsaXR5KHJlcywgc2hvd1N1Z2dlc3Rpb25zU2V0dGluZyk7CisgICAgICAgIG1Jc0ludGVybmFsID0gU2V0dGluZ3MuaXNJbnRlcm5hbChwcmVmcyk7CiAgICAgfQogCiAgICAgcHVibGljIGJvb2xlYW4gaXNBcHBsaWNhdGlvblNwZWNpZmllZENvbXBsZXRpb25zT24oKSB7CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9TdGF0aWNJbm5lckhhbmRsZXJXcmFwcGVyLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9TdGF0aWNJbm5lckhhbmRsZXJXcmFwcGVyLmphdmEKaW5kZXggODlkOWVhOC4uZTUwYWY0ZCAxMDA2NDQKLS0tIGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vU3RhdGljSW5uZXJIYW5kbGVyV3JhcHBlci5qYXZhCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL1N0YXRpY0lubmVySGFuZGxlcldyYXBwZXIuamF2YQpAQCAtMjIsMTcgKzIyLDE3IEBACiBpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwogCiBwdWJsaWMgY2xhc3MgU3RhdGljSW5uZXJIYW5kbGVyV3JhcHBlcjxUPiBleHRlbmRzIEhhbmRsZXIgewotICAgIGZpbmFsIHByaXZhdGUgV2Vha1JlZmVyZW5jZTxUPiBtT3V0ZXJJbnN0YW5jZVJlZjsKKyAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8VD4gbU91dGVySW5zdGFuY2VSZWY7CiAKLSAgICBwdWJsaWMgU3RhdGljSW5uZXJIYW5kbGVyV3JhcHBlcihUIG91dGVySW5zdGFuY2UpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgaWYgKG91dGVySW5zdGFuY2UgPT0gbnVsbCkgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJvdXRlckluc3RhbmNlIGlzIG51bGwiKTsKLSAgICAgICAgbU91dGVySW5zdGFuY2VSZWYgPSBuZXcgV2Vha1JlZmVyZW5jZTxUPihvdXRlckluc3RhbmNlKTsKKyAgICBwdWJsaWMgU3RhdGljSW5uZXJIYW5kbGVyV3JhcHBlcihmaW5hbCBUIG91dGVySW5zdGFuY2UpIHsKKyAgICAgICAgdGhpcyhvdXRlckluc3RhbmNlLCBMb29wZXIubXlMb29wZXIoKSk7CiAgICAgfQogCi0gICAgcHVibGljIFN0YXRpY0lubmVySGFuZGxlcldyYXBwZXIoVCBvdXRlckluc3RhbmNlLCBMb29wZXIgbG9vcGVyKSB7CisgICAgcHVibGljIFN0YXRpY0lubmVySGFuZGxlcldyYXBwZXIoZmluYWwgVCBvdXRlckluc3RhbmNlLCBmaW5hbCBMb29wZXIgbG9vcGVyKSB7CiAgICAgICAgIHN1cGVyKGxvb3Blcik7Ci0gICAgICAgIGlmIChvdXRlckluc3RhbmNlID09IG51bGwpIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigib3V0ZXJJbnN0YW5jZSBpcyBudWxsIik7CisgICAgICAgIGlmIChvdXRlckluc3RhbmNlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigib3V0ZXJJbnN0YW5jZSBpcyBudWxsIik7CisgICAgICAgIH0KICAgICAgICAgbU91dGVySW5zdGFuY2VSZWYgPSBuZXcgV2Vha1JlZmVyZW5jZTxUPihvdXRlckluc3RhbmNlKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL2RlZmluZS9Qcm9kdWN0aW9uRmxhZy5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vZGVmaW5lL1Byb2R1Y3Rpb25GbGFnLmphdmEKaW5kZXggZmU5YmUxNi4uNjk5ZTQ3YiAxMDA2NDQKLS0tIGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vZGVmaW5lL1Byb2R1Y3Rpb25GbGFnLmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vZGVmaW5lL1Byb2R1Y3Rpb25GbGFnLmphdmEKQEAgLTIxLDEzICsyMSwxMiBAQAogICAgICAgICAvLyBUaGlzIGNsYXNzIGlzIG5vdCBwdWJsaWNseSBpbnN0YW50aWFibGUuCiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX0VYUEVSSU1FTlRBTCA9IGZhbHNlOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19JTlRFUk5BTCA9IGZhbHNlOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBVU0VTX0RFVkVMT1BNRU5UX09OTFlfRElBR05PU1RJQ1MgPSBmYWxzZTsKIAotICAgIC8vIFdoZW4gZmFsc2UsIElTX0VYUEVSSU1FTlRBTF9ERUJVRyBzdWdnZXN0cyB0aGF0IGFsbCBndWFyZGVkIGNsYXNzLXByaXZhdGUgREVCVUcgZmxhZ3Mgc2hvdWxkCi0gICAgLy8gYmUgZmFsc2UsIGFuZCBhbnkgcHJpdmFjeSBjb250cm9scyBzaG91bGQgYmUgZW5mb3JjZWQuICBJU19FWFBFUklNRU5UQUxfREVCVUcgc2hvdWxkIGJlIGZhbHNlCi0gICAgLy8gZm9yIGFueSByZWxlYXNlZCBidWlsZC4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gSVNfRVhQRVJJTUVOVEFMX0RFQlVHID0gZmFsc2U7CisgICAgLy8gV2hlbiBmYWxzZSwgVVNFU19ERVZFTE9QTUVOVF9PTkxZX0RJQUdOT1NUSUNTX0RFQlVHIHN1Z2dlc3RzIHRoYXQgYWxsIGd1YXJkZWQKKyAgICAvLyBjbGFzcy1wcml2YXRlIERFQlVHIGZsYWdzIHNob3VsZCBiZSBmYWxzZSwgYW5kIGFueSBwcml2YWN5IGNvbnRyb2xzIHNob3VsZCBiZSBlbmZvcmNlZC4KKyAgICAvLyBVU0VTX0RFVkVMT1BNRU5UX09OTFlfRElBR05PU1RJQ1MgbXVzdCBiZSBmYWxzZSBmb3IgYW55IHByb2R1Y3Rpb24gYnVpbGQuCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIFVTRVNfREVWRUxPUE1FTlRfT05MWV9ESUFHTk9TVElDU19ERUJVRyA9IGZhbHNlOwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX0hBUkRXQVJFX0tFWUJPQVJEX1NVUFBPUlRFRCA9IHRydWU7CiB9CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9zZXR1cC9TZXR1cEFjdGl2aXR5LmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9zZXR1cC9TZXR1cEFjdGl2aXR5LmphdmEKaW5kZXggZTAwOWZiYy4uN2Y2NmM2ZCAxMDA2NDQKLS0tIGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vc2V0dXAvU2V0dXBBY3Rpdml0eS5qYXZhCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL3NldHVwL1NldHVwQWN0aXZpdHkuamF2YQpAQCAtNjIsNiArNjIsOSBAQAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShmaW5hbCBNZXNzYWdlIG1zZykgewogICAgICAgICAgICAgZmluYWwgU2V0dXBBY3Rpdml0eSBzZXR1cEFjdGl2aXR5ID0gZ2V0T3V0ZXJJbnN0YW5jZSgpOworICAgICAgICAgICAgaWYgKHNldHVwQWN0aXZpdHkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKICAgICAgICAgICAgIGNhc2UgTVNHX1BPTExJTkdfSU1FX1NFVFRJTkdTOgogICAgICAgICAgICAgICAgIGlmIChTZXR1cEFjdGl2aXR5LmlzVGhpc0ltZUVuYWJsZWQoc2V0dXBBY3Rpdml0eSkpIHsKZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL3NwZWxsY2hlY2svQW5kcm9pZFNwZWxsQ2hlY2tlclNlc3Npb24uamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL3NwZWxsY2hlY2svQW5kcm9pZFNwZWxsQ2hlY2tlclNlc3Npb24uamF2YQppbmRleCA2M2Y0NmI3Li45YTExMTRmIDEwMDY0NAotLS0gYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9zcGVsbGNoZWNrL0FuZHJvaWRTcGVsbENoZWNrZXJTZXNzaW9uLmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vc3BlbGxjaGVjay9BbmRyb2lkU3BlbGxDaGVja2VyU2Vzc2lvbi5qYXZhCkBAIC0xNiw2ICsxNiw3IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uc3BlbGxjaGVjazsKIAoraW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcudGV4dHNlcnZpY2UuU2VudGVuY2VTdWdnZXN0aW9uc0luZm87CkBAIC0xMzMsMjIgKzEzNCwyNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdWdnZXN0aW9uc0luZm9bXSBvbkdldFN1Z2dlc3Rpb25zTXVsdGlwbGUoVGV4dEluZm9bXSB0ZXh0SW5mb3MsCiAgICAgICAgICAgICBpbnQgc3VnZ2VzdGlvbnNMaW1pdCwgYm9vbGVhbiBzZXF1ZW50aWFsV29yZHMpIHsKLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHRleHRJbmZvcy5sZW5ndGg7Ci0gICAgICAgIGZpbmFsIFN1Z2dlc3Rpb25zSW5mb1tdIHJldHZhbCA9IG5ldyBTdWdnZXN0aW9uc0luZm9bbGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByZXZXb3JkOwotICAgICAgICAgICAgaWYgKHNlcXVlbnRpYWxXb3JkcyAmJiBpID4gMCkgeworICAgICAgICBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gdGV4dEluZm9zLmxlbmd0aDsKKyAgICAgICAgICAgIGZpbmFsIFN1Z2dlc3Rpb25zSW5mb1tdIHJldHZhbCA9IG5ldyBTdWdnZXN0aW9uc0luZm9bbGVuZ3RoXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJldldvcmQ7CisgICAgICAgICAgICAgICAgaWYgKHNlcXVlbnRpYWxXb3JkcyAmJiBpID4gMCkgewogICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcmV2V29yZENhbmRpZGF0ZSA9IHRleHRJbmZvc1tpIC0gMV0uZ2V0VGV4dCgpOwogICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBhbiBlbXB0eSBzdHJpbmcgd291bGQgYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGUgaW5pdGlhbCB3b3JkCiAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIGZ1dHVyZS4KICAgICAgICAgICAgICAgICBwcmV2V29yZCA9IFRleHRVdGlscy5pc0VtcHR5KHByZXZXb3JkQ2FuZGlkYXRlKSA/IG51bGwgOiBwcmV2V29yZENhbmRpZGF0ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcHJldldvcmQgPSBudWxsOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHByZXZXb3JkID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dmFsW2ldID0gb25HZXRTdWdnZXN0aW9uc0ludGVybmFsKHRleHRJbmZvc1tpXSwgcHJldldvcmQsIHN1Z2dlc3Rpb25zTGltaXQpOworICAgICAgICAgICAgICAgIHJldHZhbFtpXS5zZXRDb29raWVBbmRTZXF1ZW5jZSh0ZXh0SW5mb3NbaV0uZ2V0Q29va2llKCksCisgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0SW5mb3NbaV0uZ2V0U2VxdWVuY2UoKSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR2YWxbaV0gPSBvbkdldFN1Z2dlc3Rpb25zKHRleHRJbmZvc1tpXSwgcHJldldvcmQsIHN1Z2dlc3Rpb25zTGltaXQpOwotICAgICAgICAgICAgcmV0dmFsW2ldLnNldENvb2tpZUFuZFNlcXVlbmNlKHRleHRJbmZvc1tpXS5nZXRDb29raWUoKSwKLSAgICAgICAgICAgICAgICAgICAgdGV4dEluZm9zW2ldLmdldFNlcXVlbmNlKCkpOworICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50KTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0dmFsOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL3NwZWxsY2hlY2svQW5kcm9pZFdvcmRMZXZlbFNwZWxsQ2hlY2tlclNlc3Npb24uamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL3NwZWxsY2hlY2svQW5kcm9pZFdvcmRMZXZlbFNwZWxsQ2hlY2tlclNlc3Npb24uamF2YQppbmRleCBjZDNmOWU0Li40Zjg2YTMxIDEwMDY0NAotLS0gYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9zcGVsbGNoZWNrL0FuZHJvaWRXb3JkTGV2ZWxTcGVsbENoZWNrZXJTZXNzaW9uLmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vc3BlbGxjaGVjay9BbmRyb2lkV29yZExldmVsU3BlbGxDaGVja2VyU2Vzc2lvbi5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOworaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuVXNlckRpY3Rpb25hcnkuV29yZHM7CiBpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLnRleHRzZXJ2aWNlLlNwZWxsQ2hlY2tlclNlcnZpY2UuU2Vzc2lvbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwpAQCAtMjM0LDEzICsyMzUsMTIgQEAKICAgICAgKiBjb3JyZWN0aW9ucyBmb3IgdGhlIHRleHQgcGFzc2VkIGFzIGFuIGFyZ3VtZW50LiBJdCBtYXkgc3BsaXQgb3IgZ3JvdXAgd29yZHMsIGFuZAogICAgICAqIGV2ZW4gcGVyZm9ybSBncmFtbWF0aWNhbCBhbmFseXNpcy4KICAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3VnZ2VzdGlvbnNJbmZvIG9uR2V0U3VnZ2VzdGlvbnMoZmluYWwgVGV4dEluZm8gdGV4dEluZm8sCisgICAgcHJpdmF0ZSBTdWdnZXN0aW9uc0luZm8gb25HZXRTdWdnZXN0aW9uc0ludGVybmFsKGZpbmFsIFRleHRJbmZvIHRleHRJbmZvLAogICAgICAgICAgICAgZmluYWwgaW50IHN1Z2dlc3Rpb25zTGltaXQpIHsKLSAgICAgICAgcmV0dXJuIG9uR2V0U3VnZ2VzdGlvbnModGV4dEluZm8sIG51bGwsIHN1Z2dlc3Rpb25zTGltaXQpOworICAgICAgICByZXR1cm4gb25HZXRTdWdnZXN0aW9uc0ludGVybmFsKHRleHRJbmZvLCBudWxsLCBzdWdnZXN0aW9uc0xpbWl0KTsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgU3VnZ2VzdGlvbnNJbmZvIG9uR2V0U3VnZ2VzdGlvbnMoCisgICAgcHJvdGVjdGVkIFN1Z2dlc3Rpb25zSW5mbyBvbkdldFN1Z2dlc3Rpb25zSW50ZXJuYWwoCiAgICAgICAgICAgICBmaW5hbCBUZXh0SW5mbyB0ZXh0SW5mbywgZmluYWwgU3RyaW5nIHByZXZXb3JkLCBmaW5hbCBpbnQgc3VnZ2VzdGlvbnNMaW1pdCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgZmluYWwgU3RyaW5nIGluVGV4dCA9IHRleHRJbmZvLmdldFRleHQoKTsKQEAgLTM1Nyw0ICszNTcsMjIgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KKworICAgIC8qCisgICAgICogVGhlIHNwZWxsIGNoZWNrZXIgYWN0cyBvbiBpdHMgb3duIGJlaGFsZi4gVGhhdCBpcyBuZWVkZWQsIGluIHBhcnRpY3VsYXIsIHRvIGJlIGFibGUgdG8KKyAgICAgKiBhY2Nlc3MgdGhlIGRpY3Rpb25hcnkgZmlsZXMsIHdoaWNoIHRoZSBwcm92aWRlciByZXN0cmljdHMgdG8gdGhlIGlkZW50aXR5IG9mIExhdGluIElNRS4KKyAgICAgKiBTaW5jZSBpdCdzIGNhbGxlZCBleHRlcm5hbGx5IGJ5IHRoZSBhcHBsaWNhdGlvbiwgdGhlIHNwZWxsIGNoZWNrZXIgaXMgdXNpbmcgdGhlIGlkZW50aXR5CisgICAgICogb2YgdGhlIGFwcGxpY2F0aW9uIGJ5IGRlZmF1bHQgdW5sZXNzIHdlIGNsZWFyQ2FsbGluZ0lkZW50aXR5LgorICAgICAqIFRoYXQncyB3aGF0IHRoZSBmb2xsb3dpbmcgbWV0aG9kIGRvZXMuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN1Z2dlc3Rpb25zSW5mbyBvbkdldFN1Z2dlc3Rpb25zKGZpbmFsIFRleHRJbmZvIHRleHRJbmZvLAorICAgICAgICAgICAgZmluYWwgaW50IHN1Z2dlc3Rpb25zTGltaXQpIHsKKyAgICAgICAgbG9uZyBpZGVudCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG9uR2V0U3VnZ2VzdGlvbnNJbnRlcm5hbCh0ZXh0SW5mbywgc3VnZ2VzdGlvbnNMaW1pdCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBCaW5kZXIucmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudCk7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9zdWdnZXN0aW9ucy9TdWdnZXN0aW9uU3RyaXBWaWV3LmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9zdWdnZXN0aW9ucy9TdWdnZXN0aW9uU3RyaXBWaWV3LmphdmEKaW5kZXggNWEyOWVlZS4uOGMzZDNiMCAxMDA2NDQKLS0tIGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vc3VnZ2VzdGlvbnMvU3VnZ2VzdGlvblN0cmlwVmlldy5qYXZhCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL3N1Z2dlc3Rpb25zL1N1Z2dlc3Rpb25TdHJpcFZpZXcuamF2YQpAQCAtNjE3LDcgKzYxNyw3IEBACiAgICAgICAgIGNsZWFyKCk7CiAgICAgICAgIG1TdWdnZXN0ZWRXb3JkcyA9IHN1Z2dlc3RlZFdvcmRzOwogICAgICAgICBtUGFyYW1zLmxheW91dChtU3VnZ2VzdGVkV29yZHMsIG1TdWdnZXN0aW9uc1N0cmlwLCB0aGlzLCBnZXRXaWR0aCgpKTsKLSAgICAgICAgaWYgKFByb2R1Y3Rpb25GbGFnLklTX0VYUEVSSU1FTlRBTCkgeworICAgICAgICBpZiAoUHJvZHVjdGlvbkZsYWcuVVNFU19ERVZFTE9QTUVOVF9PTkxZX0RJQUdOT1NUSUNTKSB7CiAgICAgICAgICAgICBSZXNlYXJjaExvZ2dlci5zdWdnZXN0aW9uU3RyaXBWaWV3X3NldFN1Z2dlc3Rpb25zKG1TdWdnZXN0ZWRXb3Jkcyk7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9yZXNlYXJjaC9Mb2dTdGF0ZW1lbnQuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL3Jlc2VhcmNoL0xvZ1N0YXRlbWVudC5qYXZhCmluZGV4IDA5YjEyZmMuLjA2YjkxOGEgMTAwNjQ0Ci0tLSBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL3Jlc2VhcmNoL0xvZ1N0YXRlbWVudC5qYXZhCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL3Jlc2VhcmNoL0xvZ1N0YXRlbWVudC5qYXZhCkBAIC0zNyw3ICszNyw4IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBMb2dTdGF0ZW1lbnQgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBMb2dTdGF0ZW1lbnQuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZSAmJiBQcm9kdWN0aW9uRmxhZy5JU19FWFBFUklNRU5UQUxfREVCVUc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlCisgICAgICAgICAgICAmJiBQcm9kdWN0aW9uRmxhZy5VU0VTX0RFVkVMT1BNRU5UX09OTFlfRElBR05PU1RJQ1NfREVCVUc7CiAKICAgICAvLyBDb25zdGFudHMgZm9yIHBhcnRpY3VsYXIgc3RhdGVtZW50cwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfUE9JTlRFUl9UUkFDS0VSX0NBTExfTElTVEVORVJfT05fQ09ERV9JTlBVVCA9CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9yZXNlYXJjaC9Mb2dVbml0LmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9yZXNlYXJjaC9Mb2dVbml0LmphdmEKaW5kZXggODM5ZTJiNy4uMWMwMTY3NSAxMDA2NDQKLS0tIGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvcmVzZWFyY2gvTG9nVW5pdC5qYXZhCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL3Jlc2VhcmNoL0xvZ1VuaXQuamF2YQpAQCAtNDYsNyArNDYsOCBAQAogICovCiBwdWJsaWMgY2xhc3MgTG9nVW5pdCB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IExvZ1VuaXQuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZSAmJiBQcm9kdWN0aW9uRmxhZy5JU19FWFBFUklNRU5UQUxfREVCVUc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlCisgICAgICAgICAgICAmJiBQcm9kdWN0aW9uRmxhZy5VU0VTX0RFVkVMT1BNRU5UX09OTFlfRElBR05PU1RJQ1NfREVCVUc7CiAKICAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxMb2dTdGF0ZW1lbnQ+IG1Mb2dTdGF0ZW1lbnRMaXN0OwogICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PE9iamVjdFtdPiBtVmFsdWVzTGlzdDsKQEAgLTExOSwyMiArMTIwLDYgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcHVibGlzaFRvKGZpbmFsIFJlc2VhcmNoTG9nIHJlc2VhcmNoTG9nLAogICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBjYW5JbmNsdWRlUHJpdmF0ZURhdGEpIHsKLSAgICAgICAgLy8gUHJlcGFyZSBkZWJ1Z2dpbmcgb3V0cHV0IGlmIG5lY2Vzc2FyeQotICAgICAgICBmaW5hbCBTdHJpbmdXcml0ZXIgZGVidWdTdHJpbmdXcml0ZXI7Ci0gICAgICAgIGZpbmFsIEpzb25Xcml0ZXIgZGVidWdKc29uV3JpdGVyOwotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIGRlYnVnU3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICAgICAgZGVidWdKc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoZGVidWdTdHJpbmdXcml0ZXIpOwotICAgICAgICAgICAgZGVidWdKc29uV3JpdGVyLnNldEluZGVudCgiICAiKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZGVidWdKc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZCBub3Qgb3BlbiBhcnJheSBpbiBKc29uV3JpdGVyIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkZWJ1Z1N0cmluZ1dyaXRlciA9IG51bGw7Ci0gICAgICAgICAgICBkZWJ1Z0pzb25Xcml0ZXIgPSBudWxsOwotICAgICAgICB9CiAgICAgICAgIC8vIFdyaXRlIG91dCBhbnkgbG9nU3RhdGVtZW50IHRoYXQgcGFzc2VzIHRoZSBwcml2YWN5IGZpbHRlci4KICAgICAgICAgZmluYWwgaW50IHNpemUgPSBtTG9nU3RhdGVtZW50TGlzdC5zaXplKCk7CiAgICAgICAgIGlmIChzaXplICE9IDApIHsKQEAgLTE1NywyOSArMTQyLDEyIEBACiAgICAgICAgICAgICAgICAgICAgIG91dHB1dExvZ1VuaXRTdGFydChqc29uV3JpdGVyLCBjYW5JbmNsdWRlUHJpdmF0ZURhdGEpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBsb2dTdGF0ZW1lbnQub3V0cHV0VG9Mb2NrZWQoanNvbldyaXRlciwgbVRpbWVMaXN0LmdldChpKSwgbVZhbHVlc0xpc3QuZ2V0KGkpKTsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nU3RhdGVtZW50Lm91dHB1dFRvTG9ja2VkKGRlYnVnSnNvbldyaXRlciwgbVRpbWVMaXN0LmdldChpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmFsdWVzTGlzdC5nZXQoaSkpOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChqc29uV3JpdGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAvLyBXZSBtdXN0IGhhdmUgY2FsbGVkIGxvZ1VuaXRTdGFydCBlYXJsaWVyLCBzbyBlbWl0IGEgbG9nVW5pdFN0b3AuCiAgICAgICAgICAgICAgICAgb3V0cHV0TG9nVW5pdFN0b3AoanNvbldyaXRlcik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGRlYnVnSnNvbldyaXRlci5lbmRBcnJheSgpOwotICAgICAgICAgICAgICAgIGRlYnVnSnNvbldyaXRlci5mbHVzaCgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkIG5vdCBjbG9zZSBhcnJheSBpbiBKc29uV3JpdGVyIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgYmlnU3RyaW5nID0gZGVidWdTdHJpbmdXcml0ZXIuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIGxpbmVzID0gYmlnU3RyaW5nLnNwbGl0KCJcbiIpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgbGluZSA6IGxpbmVzKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBsaW5lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JEX0tFWSA9ICJfd28iOwpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvcmVzZWFyY2gvTWFpbkxvZ0J1ZmZlci5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvcmVzZWFyY2gvTWFpbkxvZ0J1ZmZlci5qYXZhCmluZGV4IDlhYTYwZjguLjMzMDNkMmIgMTAwNjQ0Ci0tLSBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL3Jlc2VhcmNoL01haW5Mb2dCdWZmZXIuamF2YQorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9yZXNlYXJjaC9NYWluTG9nQnVmZmVyLmphdmEKQEAgLTYwLDcgKzYwLDggQEAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIE1haW5Mb2dCdWZmZXIgZXh0ZW5kcyBGaXhlZExvZ0J1ZmZlciB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IE1haW5Mb2dCdWZmZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZSAmJiBQcm9kdWN0aW9uRmxhZy5JU19FWFBFUklNRU5UQUxfREVCVUc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlCisgICAgICAgICAgICAmJiBQcm9kdWN0aW9uRmxhZy5VU0VTX0RFVkVMT1BNRU5UX09OTFlfRElBR05PU1RJQ1NfREVCVUc7CiAKICAgICAvLyBUaGUgc2l6ZSBvZiB0aGUgbi1ncmFtcyBsb2dnZWQuICBFLmcuIE5fR1JBTV9TSVpFID0gMiBtZWFucyB0byBzYW1wbGUgYmlncmFtcy4KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOX0dSQU1fU0laRSA9IDI7CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9yZXNlYXJjaC9Nb3Rpb25FdmVudFJlYWRlci5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvcmVzZWFyY2gvTW90aW9uRXZlbnRSZWFkZXIuamF2YQppbmRleCBlNTlhZGZhLi5lMWNjMmRhIDEwMDY0NAotLS0gYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9yZXNlYXJjaC9Nb3Rpb25FdmVudFJlYWRlci5qYXZhCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL3Jlc2VhcmNoL01vdGlvbkV2ZW50UmVhZGVyLmphdmEKQEAgLTM0LDcgKzM0LDggQEAKIAogcHVibGljIGNsYXNzIE1vdGlvbkV2ZW50UmVhZGVyIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gTW90aW9uRXZlbnRSZWFkZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZSAmJiBQcm9kdWN0aW9uRmxhZy5JU19FWFBFUklNRU5UQUxfREVCVUc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlCisgICAgICAgICAgICAmJiBQcm9kdWN0aW9uRmxhZy5VU0VTX0RFVkVMT1BNRU5UX09OTFlfRElBR05PU1RJQ1NfREVCVUc7CiAgICAgLy8gQXNzdW1lcyB0aGF0IE1vdGlvbkV2ZW50LkFDVElPTl9NQVNLIGRvZXMgbm90IGhhdmUgYWxsIGJpdHMgc2V0LmAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVU5JTklUSUFMSVpFRF9BQ1RJT04gPSB+TW90aW9uRXZlbnQuQUNUSU9OX01BU0s7CiAgICAgLy8gTm8gbGVnaXRpbWF0ZSBpbnQgaXMgbmVnYXRpdmUKZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL3Jlc2VhcmNoL1JlcGxheWVyLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9yZXNlYXJjaC9SZXBsYXllci5qYXZhCmluZGV4IGE5YjdhOWQuLjkwMzg3NWYgMTAwNjQ0Ci0tLSBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL3Jlc2VhcmNoL1JlcGxheWVyLmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvcmVzZWFyY2gvUmVwbGF5ZXIuamF2YQpAQCAtMzcsNyArMzcsOCBAQAogICovCiBwdWJsaWMgY2xhc3MgUmVwbGF5ZXIgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBSZXBsYXllci5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlICYmIFByb2R1Y3Rpb25GbGFnLklTX0VYUEVSSU1FTlRBTF9ERUJVRzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2UKKyAgICAgICAgICAgICYmIFByb2R1Y3Rpb25GbGFnLlVTRVNfREVWRUxPUE1FTlRfT05MWV9ESUFHTk9TVElDU19ERUJVRzsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFNUQVJUX1RJTUVfREVMQVlfTVMgPSA1MDA7CiAKICAgICBwcml2YXRlIGJvb2xlYW4gbUlzUmVwbGF5aW5nID0gZmFsc2U7CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9yZXNlYXJjaC9SZXNlYXJjaExvZy5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvcmVzZWFyY2gvUmVzZWFyY2hMb2cuamF2YQppbmRleCA5MDE2ZTIzLi4zNWE0OTFmIDEwMDY0NAotLS0gYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9yZXNlYXJjaC9SZXNlYXJjaExvZy5qYXZhCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL3Jlc2VhcmNoL1Jlc2VhcmNoTG9nLmphdmEKQEAgLTIwLDExICsyMCwxMSBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5Kc29uV3JpdGVyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5hbm5vdGF0aW9ucy5Vc2VkRm9yVGVzdGluZzsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi5kZWZpbmUuUHJvZHVjdGlvbkZsYWc7CiAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKQEAgLTQ3LDE0ICs0NywxNSBAQAogICogdHJpZXMgdG8gYXZvaWQgY3JlYXRpbmcgdW5uZWNlc3NhcnkgZmlsZXMgaWYgdGhlcmUgaXMgbm90aGluZyB0byB3cml0ZS4gIEl0IGFsc28gaGFuZGxlcwogICogZmx1c2hpbmcsIG1ha2luZyBzdXJlIGl0IGhhcHBlbnMsIGJ1dCBub3QgdG9vIGZyZXF1ZW50bHkuCiAgKgotICogVGhpcyBmdW5jdGlvbmFsaXR5IGlzIG9mZiBieSBkZWZhdWx0LiBTZWUge0BsaW5rIFByb2R1Y3Rpb25GbGFnI0lTX0VYUEVSSU1FTlRBTH0uCisgKiBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgb2ZmIGJ5IGRlZmF1bHQuIFNlZQorICoge0BsaW5rIFByb2R1Y3Rpb25GbGFnI1VTRVNfREVWRUxPUE1FTlRfT05MWV9ESUFHTk9TVElDU30uCiAgKi8KIHB1YmxpYyBjbGFzcyBSZXNlYXJjaExvZyB7CiAgICAgLy8gVE9ETzogQXV0b21hdGljYWxseSBpbml0aWFsaXplIHRoZSBKc29uV3JpdGVyIHJhdGhlciB0aGFuIHJlcXVpcmluZyB0aGUgY2FsbGVyIHRvIG1hbmFnZSBpdC4KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gUmVzZWFyY2hMb2cuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZSAmJiBQcm9kdWN0aW9uRmxhZy5JU19FWFBFUklNRU5UQUxfREVCVUc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlCisgICAgICAgICAgICAmJiBQcm9kdWN0aW9uRmxhZy5VU0VTX0RFVkVMT1BNRU5UX09OTFlfRElBR05PU1RJQ1NfREVCVUc7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBGTFVTSF9ERUxBWV9JTl9NUyA9IDEwMDAgKiA1OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBQk9SVF9USU1FT1VUX0lOX01TID0gMTAwMCAqIDQ7CiAKICAgICAvKiBwYWNrYWdlICovIGZpbmFsIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSBtRXhlY3V0b3I7CiAgICAgLyogcGFja2FnZSAqLyBmaW5hbCBGaWxlIG1GaWxlOwpAQCAtOTksOCArMTAwLDEwIEBACiAgICAgICogb3V0cHV0LgogICAgICAqCiAgICAgICogU2VlIGNsYXNzIGNvbW1lbnQgZm9yIGRldGFpbHMgYWJvdXQge0Bjb2RlIEpzb25Xcml0ZXJ9IGNvbnN0cnVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvbkNsb3NlZCBydW4gYWZ0ZXIgdGhlIGNsb3NlKCkgb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQgYXN5bmNocm9ub3VzbHkKICAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xvc2UoZmluYWwgUnVubmFibGUgb25DbG9zZWQpIHsKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlKGZpbmFsIFJ1bm5hYmxlIG9uQ2xvc2VkKSB7CiAgICAgICAgIG1FeGVjdXRvci5zdWJtaXQobmV3IENhbGxhYmxlPE9iamVjdD4oKSB7CiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgY2FsbCgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMTE3LDYgKzEyMCw4IEBACiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZXJyb3Igd2hlbiBjbG9zaW5nIFJlc2VhcmNoTG9nOiIsIGUpOwogICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE1hcmtpbmcgdGhlIGZpbGUgYXMgcmVhZC1vbmx5IHNpZ25hbHMgdGhhdCB0aGlzIGxvZyBmaWxlIGlzIHJlYWR5IHRvIGJlCisgICAgICAgICAgICAgICAgICAgIC8vIHVwbG9hZGVkLgogICAgICAgICAgICAgICAgICAgICBpZiAobUZpbGUgIT0gbnVsbCAmJiBtRmlsZS5leGlzdHMoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgbUZpbGUuc2V0V3JpdGFibGUoZmFsc2UsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTMxLDE1ICsxMzYsMjQgQEAKICAgICAgICAgbUV4ZWN1dG9yLnNodXRkb3duKCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc0Fib3J0U3VjY2Vzc2Z1bDsKKyAgICAvKioKKyAgICAgKiBCbG9jayB1bnRpbCB0aGUgcmVzZWFyY2ggbG9nIGhhcyBzaHV0IGRvd24gYW5kIHNwb29sZWQgb3V0IGFsbCBvdXRwdXQgb3Ige0Bjb2RlIHRpbWVvdXR9CisgICAgICogb2NjdXJzLgorICAgICAqCisgICAgICogQHBhcmFtIHRpbWVvdXQgdGltZSB0byB3YWl0IGZvciBjbG9zZSBpbiBtaWxsaXNlY29uZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBibG9ja2luZ0Nsb3NlKGZpbmFsIGxvbmcgdGltZW91dCkgeworICAgICAgICBjbG9zZShudWxsKTsKKyAgICAgICAgYXdhaXRUZXJtaW5hdGlvbih0aW1lb3V0LCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgIH0KIAogICAgIC8qKgotICAgICAqIFdhaXRzIGZvciBwdWJsaWNhdGlvbiByZXF1ZXN0cyB0byBmaW5pc2gsIGNsb3NlcyB0aGUge0BsaW5rIEpzb25Xcml0ZXJ9LCBidXQgdGhlbiBkZWxldGVzIHRoZQotICAgICAqIGJhY2tpbmcgZmlsZSB1c2VkIGZvciBvdXRwdXQuCisgICAgICogV2FpdHMgZm9yIHB1YmxpY2F0aW9uIHJlcXVlc3RzIHRvIGZpbmlzaCwgY2xvc2VzIHRoZSBKc29uV3JpdGVyLCBidXQgdGhlbiBkZWxldGVzIHRoZSBiYWNraW5nCisgICAgICogb3V0cHV0IGZpbGUuCiAgICAgICoKLSAgICAgKiBTZWUgY2xhc3MgY29tbWVudCBmb3IgZGV0YWlscyBhYm91dCB7QGNvZGUgSnNvbldyaXRlcn0gY29uc3RydWN0aW9uLgorICAgICAqIEBwYXJhbSBvbkFib3J0IHJ1biBhZnRlciB0aGUgYWJvcnQoKSBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZCBhc3luY2hyb25vdXNseQogICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhYm9ydCgpIHsKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFib3J0KGZpbmFsIFJ1bm5hYmxlIG9uQWJvcnQpIHsKICAgICAgICAgbUV4ZWN1dG9yLnN1Ym1pdChuZXcgQ2FsbGFibGU8T2JqZWN0PigpIHsKICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIE9iamVjdCBjYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0xNTEsNyArMTY1LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICBpZiAobUZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUlzQWJvcnRTdWNjZXNzZnVsID0gbUZpbGUuZGVsZXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtRmlsZS5kZWxldGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAob25BYm9ydCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvbkFib3J0LnJ1bigpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwpAQCAtMTYxLDE0ICsxNzgsMjUgQEAKICAgICAgICAgbUV4ZWN1dG9yLnNodXRkb3duKCk7CiAgICAgfQogCi0gICAgcHVibGljIGJvb2xlYW4gYmxvY2tpbmdBYm9ydCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFib3J0KCk7Ci0gICAgICAgIG1FeGVjdXRvci5hd2FpdFRlcm1pbmF0aW9uKEFCT1JUX1RJTUVPVVRfSU5fTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7Ci0gICAgICAgIHJldHVybiBtSXNBYm9ydFN1Y2Nlc3NmdWw7CisgICAgLyoqCisgICAgICogQmxvY2sgdW50aWwgdGhlIHJlc2VhcmNoIGxvZyBoYXMgYWJvcnRlZCBvciB7QGNvZGUgdGltZW91dH0gb2NjdXJzLgorICAgICAqCisgICAgICogQHBhcmFtIHRpbWVvdXQgdGltZSB0byB3YWl0IGZvciBjbG9zZSBpbiBtaWxsaXNlY29uZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBibG9ja2luZ0Fib3J0KGZpbmFsIGxvbmcgdGltZW91dCkgeworICAgICAgICBhYm9ydChudWxsKTsKKyAgICAgICAgYXdhaXRUZXJtaW5hdGlvbih0aW1lb3V0LCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIGF3YWl0VGVybWluYXRpb24oaW50IGRlbGF5LCBUaW1lVW5pdCB0aW1lVW5pdCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgbUV4ZWN1dG9yLmF3YWl0VGVybWluYXRpb24oZGVsYXksIHRpbWVVbml0KTsKKyAgICBAVXNlZEZvclRlc3RpbmcKKyAgICBwdWJsaWMgdm9pZCBhd2FpdFRlcm1pbmF0aW9uKGZpbmFsIGxvbmcgZGVsYXksIGZpbmFsIFRpbWVVbml0IHRpbWVVbml0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoIW1FeGVjdXRvci5hd2FpdFRlcm1pbmF0aW9uKGRlbGF5LCB0aW1lVW5pdCkpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJSZXNlYXJjaExvZyBleGVjdXRvciB0aW1lZCBvdXQgd2hpbGUgYXdhaXRpbmcgdGVybWluYWlvbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChmaW5hbCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJSZXNlYXJjaExvZyBleGVjdXRvciBpbnRlcnJ1cHRlZCB3aGlsZSBhd2FpdGluZyB0ZXJtaW5haW9uIiwgZSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKiBwYWNrYWdlICovIHN5bmNocm9uaXplZCB2b2lkIGZsdXNoKCkgewpAQCAtMjE0LDEwICsyNDIsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlamVjdGVkRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgLy8gVE9ETzogQWRkIGNvZGUgdG8gcmVjb3JkIGxvc3Mgb2YgZGF0YSwgYW5kIHJlcG9ydC4KICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJlc2VhcmNoTG9nLnB1Ymxpc2goKSByZWplY3Rpbmcgc2NoZWR1bGVkIGV4ZWN1dGlvbiIpOworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJlc2VhcmNoTG9nLnB1Ymxpc2goKSByZWplY3Rpbmcgc2NoZWR1bGVkIGV4ZWN1dGlvbiIsIGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvcmVzZWFyY2gvUmVzZWFyY2hMb2dEaXJlY3RvcnkuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL3Jlc2VhcmNoL1Jlc2VhcmNoTG9nRGlyZWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkxZGVhNQotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL3Jlc2VhcmNoL1Jlc2VhcmNoTG9nRGlyZWN0b3J5LmphdmEKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLnJlc2VhcmNoOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7CisKKy8qKgorICogTWFuYWdlcyBsb2cgZmlsZXMuCisgKgorICogVGhpcyBjbGFzcyBoYW5kbGVzIGFsbCBhc3BlY3RzIHdoZXJlIGFuZCBob3cgcmVzZWFyY2ggbG9nIGRhdGEgaXMgc3RvcmVkLiAgVGhpcyBpbmNsdWRlcworICogZ2VuZXJhdGluZyBsb2cgZmlsZW5hbWVzIGluIHRoZSBjb3JyZWN0IHBsYWNlIHdpdGggdGhlIGNvcnJlY3QgbmFtZXMsIGFuZCBjbGVhbmluZyB1cCBsb2cgZmlsZXMKKyAqIHVuZGVyIHRoaXMgZGlyZWN0b3J5LgorICovCitwdWJsaWMgY2xhc3MgUmVzZWFyY2hMb2dEaXJlY3RvcnkgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IFJlc2VhcmNoTG9nRGlyZWN0b3J5LmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX0ZJTEVOQU1FX1BSRUZJWCA9ICJyZXNlYXJjaExvZyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVOQU1FX1NVRkZJWCA9ICIudHh0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9SRUNPUkRJTkdfRklMRU5BTUVfUFJFRklYID0gInJlY29yZGluZyI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZWFkT25seUxvZ0ZpbGVGaWx0ZXIgc1VwbG9hZGFibGVMb2dGaWxlRmlsdGVyID0KKyAgICAgICAgICAgIG5ldyBSZWFkT25seUxvZ0ZpbGVGaWx0ZXIoKTsKKworICAgIHByaXZhdGUgZmluYWwgRmlsZSBtRmlsZXNEaXI7CisKKyAgICBzdGF0aWMgY2xhc3MgUmVhZE9ubHlMb2dGaWxlRmlsdGVyIGltcGxlbWVudHMgRmlsZUZpbHRlciB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoZmluYWwgRmlsZSBwYXRobmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIHBhdGhuYW1lLmdldE5hbWUoKS5zdGFydHNXaXRoKFJlc2VhcmNoTG9nRGlyZWN0b3J5LkxPR19GSUxFTkFNRV9QUkVGSVgpCisgICAgICAgICAgICAgICAgICAgICYmICFwYXRobmFtZS5jYW5Xcml0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBSZXNlYXJjaExvZ0RpcmVjdG9yeSwgY3JlYXRpbmcgdGhlIHN0b3JhZ2UgZGlyZWN0b3J5IGlmIGl0IGRvZXMgbm90IGV4aXN0LgorICAgICAqLworICAgIHB1YmxpYyBSZXNlYXJjaExvZ0RpcmVjdG9yeShmaW5hbCBDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgbUZpbGVzRGlyID0gZ2V0TG9nZ2luZ0RpcmVjdG9yeShjb250ZXh0KTsKKyAgICAgICAgaWYgKG1GaWxlc0RpciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIk5vIGZpbGVzIGRpcmVjdG9yeSBzcGVjaWZpZWQiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1GaWxlc0Rpci5leGlzdHMoKSkgeworICAgICAgICAgICAgbUZpbGVzRGlyLm1rZGlycygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBGaWxlIGdldExvZ2dpbmdEaXJlY3RvcnkoZmluYWwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIC8vIFRPRE86IFN3aXRjaCB0byB1c2luZyBhIHN1YmRpcmVjdG9yeSBvZiBnZXRGaWxlc0RpcigpLgorICAgICAgICByZXR1cm4gY29udGV4dC5nZXRGaWxlc0RpcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhbiBhcnJheSBvZiBsb2cgZmlsZXMgdGhhdCBhcmUgcmVhZHkgZm9yIHVwbG9hZGluZy4KKyAgICAgKgorICAgICAqIEEgZmlsZSBpcyByZWFkeSBmb3IgdXBsb2FkaW5nIGlmIGl0IGlzIG1hcmtlZCBhcyByZWFkLW9ubHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiB1cGxvYWRhYmxlIGZpbGVzCisgICAgICovCisgICAgcHVibGljIEZpbGVbXSBnZXRVcGxvYWRhYmxlTG9nRmlsZXMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbUZpbGVzRGlyLmxpc3RGaWxlcyhzVXBsb2FkYWJsZUxvZ0ZpbGVGaWx0ZXIpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZCBub3QgY2xlYW51cCBsb2cgZGlyZWN0b3J5LCBwZXJtaXNzaW9uIGRlbmllZCIsIGUpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlWzBdOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYW51cExvZ0ZpbGVzT2xkZXJUaGFuKGZpbmFsIGxvbmcgdGltZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZm9yIChmaW5hbCBGaWxlIGZpbGUgOiBtRmlsZXNEaXIubGlzdEZpbGVzKCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZmlsZW5hbWUgPSBmaWxlLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoKGZpbGVuYW1lLnN0YXJ0c1dpdGgoTE9HX0ZJTEVOQU1FX1BSRUZJWCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGZpbGVuYW1lLnN0YXJ0c1dpdGgoVVNFUl9SRUNPUkRJTkdfRklMRU5BTUVfUFJFRklYKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIChmaWxlLmxhc3RNb2RpZmllZCgpIDwgdGltZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmlsZS5kZWxldGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkIG5vdCBjbGVhbnVwIGxvZyBkaXJlY3RvcnksIHBlcm1pc3Npb24gZGVuaWVkIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgRmlsZSBnZXRMb2dGaWxlUGF0aChmaW5hbCBsb25nIHRpbWUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlKG1GaWxlc0RpciwgZ2V0VW5pcXVlRmlsZW5hbWUoTE9HX0ZJTEVOQU1FX1BSRUZJWCwgdGltZSkpOworICAgIH0KKworICAgIHB1YmxpYyBGaWxlIGdldFVzZXJSZWNvcmRpbmdGaWxlUGF0aChmaW5hbCBsb25nIHRpbWUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlKG1GaWxlc0RpciwgZ2V0VW5pcXVlRmlsZW5hbWUoVVNFUl9SRUNPUkRJTkdfRklMRU5BTUVfUFJFRklYLCB0aW1lKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFVuaXF1ZUZpbGVuYW1lKGZpbmFsIFN0cmluZyBwcmVmaXgsIGZpbmFsIGxvbmcgdGltZSkgeworICAgICAgICByZXR1cm4gcHJlZml4ICsgIi0iICsgdGltZSArIEZJTEVOQU1FX1NVRkZJWDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9yZXNlYXJjaC9SZXNlYXJjaExvZ2dlci5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvcmVzZWFyY2gvUmVzZWFyY2hMb2dnZXIuamF2YQppbmRleCBlNzA1ZGRkLi5hMzhhMjI2IDEwMDY0NAotLS0gYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9yZXNlYXJjaC9SZXNlYXJjaExvZ2dlci5qYXZhCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL3Jlc2VhcmNoL1Jlc2VhcmNoTG9nZ2VyLmphdmEKQEAgLTk3LDcgKzk3LDggQEAKICAqIFRoaXMgY2xhc3MgbG9ncyBvcGVyYXRpb25zIG9uIHRoZSBJTUUga2V5Ym9hcmQsIGluY2x1ZGluZyB3aGF0IHRoZSB1c2VyIGhhcyB0eXBlZC4KICAqIERhdGEgaXMgc3RvcmVkIGxvY2FsbHkgaW4gYSBmaWxlIGluIGFwcC1zcGVjaWZpYyBzdG9yYWdlLgogICoKLSAqIFRoaXMgZnVuY3Rpb25hbGl0eSBpcyBvZmYgYnkgZGVmYXVsdC4gU2VlIHtAbGluayBQcm9kdWN0aW9uRmxhZyNJU19FWFBFUklNRU5UQUx9LgorICogVGhpcyBmdW5jdGlvbmFsaXR5IGlzIG9mZiBieSBkZWZhdWx0LiBTZWUKKyAqIHtAbGluayBQcm9kdWN0aW9uRmxhZyNVU0VTX0RFVkVMT1BNRU5UX09OTFlfRElBR05PU1RJQ1N9LgogICovCiBwdWJsaWMgY2xhc3MgUmVzZWFyY2hMb2dnZXIgaW1wbGVtZW50cyBTaGFyZWRQcmVmZXJlbmNlcy5PblNoYXJlZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciB7CiAgICAgLy8gVE9ETzogVGhpcyBjbGFzcyBoYXMgZ3Jvd24gcXVpdGUgbGFyZ2UgYW5kIGNvbWJpbmVzIHNldmVyYWwgY29uY2VybnMgdGhhdCBzaG91bGQgYmUKQEAgLTEwOSwxMyArMTEwLDE0IEBACiAgICAgLy8gVE9ETzogUmVmYWN0b3IuICBNb3ZlIGxvZ2dpbmcgaW52b2NhdGlvbnMgaW50byB0aGVpciBvd24gY2xhc3MuCiAgICAgLy8gVE9ETzogUmVmYWN0b3IuICBNb3ZlIGN1cnJlbnRMb2dVbml0IG1hbmFnZW1lbnQgaW50byBzZXBhcmF0ZSBjbGFzcy4KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gUmVzZWFyY2hMb2dnZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZSAmJiBQcm9kdWN0aW9uRmxhZy5JU19FWFBFUklNRU5UQUxfREVCVUc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlCisgICAgICAgICAgICAmJiBQcm9kdWN0aW9uRmxhZy5VU0VTX0RFVkVMT1BNRU5UX09OTFlfRElBR05PU1RJQ1NfREVCVUc7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19SRVBMQVlfQUZURVJfRkVFREJBQ0sgPSBmYWxzZQotICAgICAgICAgICAgJiYgUHJvZHVjdGlvbkZsYWcuSVNfRVhQRVJJTUVOVEFMX0RFQlVHOworICAgICAgICAgICAgJiYgUHJvZHVjdGlvbkZsYWcuVVNFU19ERVZFTE9QTUVOVF9PTkxZX0RJQUdOT1NUSUNTX0RFQlVHOwogICAgIC8vIFdoZXRoZXIgdGhlIFRleHRWaWV3IGNvbnRlbnRzIGFyZSBsb2dnZWQgYXQgdGhlIGVuZCBvZiB0aGUgc2Vzc2lvbi4gIHRydWUgd2lsbCBkaXNjbG9zZQogICAgIC8vIHByaXZhdGUgaW5mby4KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIExPR19GVUxMX1RFWFRWSUVXX0NPTlRFTlRTID0gZmFsc2UKLSAgICAgICAgICAgICYmIFByb2R1Y3Rpb25GbGFnLklTX0VYUEVSSU1FTlRBTF9ERUJVRzsKKyAgICAgICAgICAgICYmIFByb2R1Y3Rpb25GbGFnLlVTRVNfREVWRUxPUE1FTlRfT05MWV9ESUFHTk9TVElDU19ERUJVRzsKICAgICAvLyBXaGV0aGVyIHRoZSBmZWVkYmFjayBkaWFsb2cgcHJlc2VydmVzIHRoZSBlZGl0YWJsZSB0ZXh0IGFjcm9zcyBpbnZvY2F0aW9ucy4gIFNob3VsZCBiZSBmYWxzZQogICAgIC8vIGZvciBub3JtYWwgcmVzZWFyY2ggYnVpbGRzIHNvIHVzZXJzIGRvIG5vdCBoYXZlIHRvIGRlbGV0ZSB0aGUgc2FtZSBmZWVkYmFjayBzdHJpbmcgdGhleQogICAgIC8vIGVudGVyZWQgZWFybGllci4gIFNob3VsZCBiZSB0cnVlIGZvciBidWlsZHMgaW50ZXJuYWwgdG8gYSBkZXZlbG9wbWVudCB0ZWFtIHNvIHdoZW4gdGhlIHRleHQKQEAgLTEyNSwxNiArMTI3LDEwIEBACiAgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgYm9vbGVhbiBzSXNMb2dnaW5nID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9VVFBVVF9GT1JNQVRfVkVSU0lPTiA9IDU7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfVVNBQklMSVRZX1NUVURZX01PREUgPSAidXNhYmlsaXR5X3N0dWR5X21vZGUiOwotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfRklMRU5BTUVfUFJFRklYID0gInJlc2VhcmNoTG9nIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX0ZJTEVOQU1FX1NVRkZJWCA9ICIudHh0IjsKLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9SRUNPUkRJTkdfRklMRU5BTUVfUFJFRklYID0gInJlY29yZGluZyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfUkVDT1JESU5HX0ZJTEVOQU1FX1NVRkZJWCA9ICIudHh0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTaW1wbGVEYXRlRm9ybWF0IFRJTUVTVEFNUF9EQVRFRk9STUFUID0KLSAgICAgICAgICAgIG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5TU1kZEhIbW1zc1MiLCBMb2NhbGUuVVMpOwogICAgIC8vIFdoZXRoZXIgYWxsIHdvcmRzIHNob3VsZCBiZSByZWNvcmRlZCwgbGVhdmluZyB1bnNhbXBsZWQgd29yZCBiZXR3ZWVuIGJpZ3JhbXMuICBVc2VmdWwgZm9yCiAgICAgLy8gdGVzdGluZy4KICAgICAvKiBwYWNrYWdlIGZvciB0ZXN0ICovIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX0xPR0dJTkdfRVZFUllUSElORyA9IGZhbHNlCi0gICAgICAgICAgICAmJiBQcm9kdWN0aW9uRmxhZy5JU19FWFBFUklNRU5UQUxfREVCVUc7CisgICAgICAgICAgICAmJiBQcm9kdWN0aW9uRmxhZy5VU0VTX0RFVkVMT1BNRU5UX09OTFlfRElBR05PU1RJQ1NfREVCVUc7CiAgICAgLy8gVGhlIG51bWJlciBvZiB3b3JkcyBiZXR3ZWVuIG4tZ3JhbXMgdG8gb21pdCBmcm9tIHRoZSBsb2cuCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTUJFUl9PRl9XT1JEU19CRVRXRUVOX1NBTVBMRVMgPQogICAgICAgICAgICAgSVNfTE9HR0lOR19FVkVSWVRISU5HID8gMCA6IChERUJVRyA/IDIgOiAxOCk7CkBAIC0xNDUsNyArMTQxLDcgQEAKICAgICAvLyBDaGFuZ2UgdGhlIGRlZmF1bHQgaW5kaWNhdG9yIHRvIHNvbWV0aGluZyB2ZXJ5IHZpc2libGUuICBDdXJyZW50bHkgdHdvIHJlZCB2ZXJ0aWNhbCBiYXJzIG9uCiAgICAgLy8gZWl0aGVyIHNpZGUgb2YgdGhleSBrZXlib2FyZC4KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX1NIT1dJTkdfSU5ESUNBVE9SX0NMRUFSTFkgPSBmYWxzZSB8fAotICAgICAgICAgICAgKElTX0xPR0dJTkdfRVZFUllUSElORyAmJiBQcm9kdWN0aW9uRmxhZy5JU19FWFBFUklNRU5UQUxfREVCVUcpOworICAgICAgICAgICAgKElTX0xPR0dJTkdfRVZFUllUSElORyAmJiBQcm9kdWN0aW9uRmxhZy5VU0VTX0RFVkVMT1BNRU5UX09OTFlfRElBR05PU1RJQ1NfREVCVUcpOwogICAgIC8vIEZFRURCQUNLX1dPUkRfQlVGRkVSX1NJWkUgc2hvdWxkIGFkZCAxIGJlY2F1c2UgaXQgbXVzdCBhbHNvIGhvbGQgdGhlIGZlZWRiYWNrIExvZ1VuaXQgaXRzZWxmLgogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZFRURCQUNLX1dPUkRfQlVGRkVSX1NJWkUgPSAoSW50ZWdlci5NQVhfVkFMVUUgLSAxKSArIDE7CiAKQEAgLTE1NCwxMSArMTUwLDE0IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9JTlBVVFZJRVdfTEVOR1RIX1RPX0NBUFRVUkUgPSA4MTkyOyAvLyBtdXN0IGJlID49MQogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1JFU0VBUkNIX1NBVkVEX0NIQU5ORUwgPSAicHJlZl9yZXNlYXJjaF9zYXZlZF9jaGFubmVsIjsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgUkVTRUFSQ0hMT0dfQ0xPU0VfVElNRU9VVF9JTl9NUyA9IDUgKiAxMDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgUkVTRUFSQ0hMT0dfQUJPUlRfVElNRU9VVF9JTl9NUyA9IDUgKiAxMDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgRFVSQVRJT05fQkVUV0VFTl9ESVJfQ0xFQU5VUF9JTl9NUyA9IERhdGVVdGlscy5EQVlfSU5fTUlMTElTOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTUFYX0xPR0ZJTEVfQUdFX0lOX01TID0gNCAqIERhdGVVdGlscy5EQVlfSU5fTUlMTElTOworCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzZWFyY2hMb2dnZXIgc0luc3RhbmNlID0gbmV3IFJlc2VhcmNoTG9nZ2VyKCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNBY2NvdW50VHlwZSA9IG51bGw7CiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNBbGxvd2VkQWNjb3VudERvbWFpbiA9IG51bGw7Ci0gICAgLy8gdG8gd3JpdGUgdG8gYSBkaWZmZXJlbnQgZmlsZW5hbWUsIGUuZy4sIGZvciB0ZXN0aW5nLCBzZXQgbUZpbGUgYmVmb3JlIGNhbGxpbmcgc3RhcnQoKQotICAgIC8qIHBhY2thZ2UgKi8gRmlsZSBtRmlsZXNEaXI7CiAgICAgLyogcGFja2FnZSAqLyBSZXNlYXJjaExvZyBtTWFpblJlc2VhcmNoTG9nOwogICAgIC8vIG1GZWVkYmFja0xvZyByZWNvcmRzIGFsbCBldmVudHMgZm9yIHRoZSBzZXNzaW9uLCBwcml2YXRlIG9yIG5vdCAoZXhjZXB0aW5nCiAgICAgLy8gcGFzc3dvcmRzKS4gIEl0IGlzIHdyaXR0ZW4gdG8gcGVybWFuZW50IHN0b3JhZ2Ugb25seSBpZiB0aGUgdXNlciBleHBsaWNpdGx5IGNvbW1hbmRzCkBAIC0xODQsOSArMTgzLDYgQEAKICAgICAgICAgICAgIENoYXJhY3Rlci5jb2RlUG9pbnRBdCgiXHVFMDAwIiwgMCk7ICAvLyBVK0UwMDAgaXMgaW4gdGhlICJwcml2YXRlLXVzZSBhcmVhIgogICAgIC8vIFUrRTAwMSBpcyBpbiB0aGUgInByaXZhdGUtdXNlIGFyZWEiCiAgICAgLyogcGFja2FnZSBmb3IgdGVzdCAqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUkRfUkVQTEFDRU1FTlRfU1RSSU5HID0gIlx1RTAwMSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfTEFTVF9DTEVBTlVQX1RJTUUgPSAicHJlZl9sYXN0X2NsZWFudXBfdGltZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBEVVJBVElPTl9CRVRXRUVOX0RJUl9DTEVBTlVQX0lOX01TID0gRGF0ZVV0aWxzLkRBWV9JTl9NSUxMSVM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBNQVhfTE9HRklMRV9BR0VfSU5fTVMgPSA0ICogRGF0ZVV0aWxzLkRBWV9JTl9NSUxMSVM7CiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU1VTUEVORF9EVVJBVElPTl9JTl9NSU5VVEVTID0gMTsKICAgICAvLyBzZXQgd2hlbiBMYXRpbklNRSBzaG91bGQgaWdub3JlIGFuIG9uVXBkYXRlU2VsZWN0aW9uKCkgY2FsbGJhY2sgdGhhdAogICAgIC8vIGFyaXNlcyBmcm9tIG9wZXJhdGlvbnMgaW4gdGhpcyBjbGFzcwpAQCAtMjAwLDYgKzE5Niw3IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBTdGF0aXN0aWNzIG1TdGF0aXN0aWNzOwogICAgIHByaXZhdGUgZmluYWwgTW90aW9uRXZlbnRSZWFkZXIgbU1vdGlvbkV2ZW50UmVhZGVyID0gbmV3IE1vdGlvbkV2ZW50UmVhZGVyKCk7CiAgICAgcHJpdmF0ZSBmaW5hbCBSZXBsYXllciBtUmVwbGF5ZXIgPSBSZXBsYXllci5nZXRJbnN0YW5jZSgpOworICAgIHByaXZhdGUgUmVzZWFyY2hMb2dEaXJlY3RvcnkgbVJlc2VhcmNoTG9nRGlyZWN0b3J5OwogCiAgICAgcHJpdmF0ZSBJbnRlbnQgbVVwbG9hZEludGVudDsKICAgICBwcml2YXRlIEludGVudCBtVXBsb2FkTm93SW50ZW50OwpAQCAtMjM3LDExICsyMzQsNiBAQAogICAgICAgICAgICAgZmluYWwgU3VnZ2VzdCBzdWdnZXN0KSB7CiAgICAgICAgIGFzc2VydCBsYXRpbklNRSAhPSBudWxsOwogICAgICAgICBtTGF0aW5JTUUgPSBsYXRpbklNRTsKLSAgICAgICAgbUZpbGVzRGlyID0gbGF0aW5JTUUuZ2V0RmlsZXNEaXIoKTsKLSAgICAgICAgaWYgKG1GaWxlc0RpciA9PSBudWxsIHx8ICFtRmlsZXNEaXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIklNRSBzdG9yYWdlIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC4gIENhbm5vdCBzdGFydCBsb2dnaW5nLiIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9CiAgICAgICAgIG1QcmVmcyA9IFByZWZlcmVuY2VNYW5hZ2VyLmdldERlZmF1bHRTaGFyZWRQcmVmZXJlbmNlcyhsYXRpbklNRSk7CiAgICAgICAgIG1QcmVmcy5yZWdpc3Rlck9uU2hhcmVkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwogCkBAIC0yNTMsMjYgKzI0NSwyOSBAQAogICAgICAgICBzQWNjb3VudFR5cGUgPSByZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLnJlc2VhcmNoX2FjY291bnRfdHlwZSk7CiAgICAgICAgIHNBbGxvd2VkQWNjb3VudERvbWFpbiA9IHJlcy5nZXRTdHJpbmcoUi5zdHJpbmcucmVzZWFyY2hfYWxsb3dlZF9hY2NvdW50X2RvbWFpbik7CiAKLSAgICAgICAgLy8gQ2xlYW51cCBsb2dnaW5nIGRpcmVjdG9yeQotICAgICAgICAvLyBUT0RPOiBNb3ZlIHRoaXMgYW5kIG90aGVyIGZpbGUtcmVsYXRlZCBjb21wb25lbnRzIHRvIHNlcGFyYXRlIGZpbGUuCi0gICAgICAgIGZpbmFsIGxvbmcgbGFzdENsZWFudXBUaW1lID0gbVByZWZzLmdldExvbmcoUFJFRl9MQVNUX0NMRUFOVVBfVElNRSwgMEwpOwotICAgICAgICBmaW5hbCBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICBpZiAobm93IC0gbGFzdENsZWFudXBUaW1lID4gRFVSQVRJT05fQkVUV0VFTl9ESVJfQ0xFQU5VUF9JTl9NUykgewotICAgICAgICAgICAgZmluYWwgbG9uZyB0aW1lSG9yaXpvbiA9IG5vdyAtIE1BWF9MT0dGSUxFX0FHRV9JTl9NUzsKLSAgICAgICAgICAgIGNsZWFudXBMb2dnaW5nRGlyKG1GaWxlc0RpciwgdGltZUhvcml6b24pOwotICAgICAgICAgICAgbVByZWZzLmVkaXQoKS5wdXRMb25nKFBSRUZfTEFTVF9DTEVBTlVQX1RJTUUsIG5vdykuYXBwbHkoKTsKLSAgICAgICAgfQorICAgICAgICAvLyBJbml0aWFsaXplIGRpcmVjdG9yeSBtYW5hZ2VyCisgICAgICAgIG1SZXNlYXJjaExvZ0RpcmVjdG9yeSA9IG5ldyBSZXNlYXJjaExvZ0RpcmVjdG9yeShtTGF0aW5JTUUpOworICAgICAgICBjbGVhbkxvZ0RpcmVjdG9yeUlmTmVlZGVkKG1SZXNlYXJjaExvZ0RpcmVjdG9yeSwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwogCiAgICAgICAgIC8vIEluaXRpYWxpemUgZXh0ZXJuYWwgc2VydmljZXMKICAgICAgICAgbVVwbG9hZEludGVudCA9IG5ldyBJbnRlbnQobUxhdGluSU1FLCBVcGxvYWRlclNlcnZpY2UuY2xhc3MpOwogICAgICAgICBtVXBsb2FkTm93SW50ZW50ID0gbmV3IEludGVudChtTGF0aW5JTUUsIFVwbG9hZGVyU2VydmljZS5jbGFzcyk7CiAgICAgICAgIG1VcGxvYWROb3dJbnRlbnQucHV0RXh0cmEoVXBsb2FkZXJTZXJ2aWNlLkVYVFJBX1VQTE9BRF9VTkNPTkRJVElPTkFMTFksIHRydWUpOwotICAgICAgICBpZiAoUHJvZHVjdGlvbkZsYWcuSVNfRVhQRVJJTUVOVEFMKSB7CisgICAgICAgIGlmIChQcm9kdWN0aW9uRmxhZy5VU0VTX0RFVkVMT1BNRU5UX09OTFlfRElBR05PU1RJQ1MpIHsKICAgICAgICAgICAgIHNjaGVkdWxlVXBsb2FkaW5nU2VydmljZShtTGF0aW5JTUUpOwogICAgICAgICB9CiAgICAgICAgIG1SZXBsYXllci5zZXRLZXlib2FyZFN3aXRjaGVyKGtleWJvYXJkU3dpdGNoZXIpOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBjbGVhbkxvZ0RpcmVjdG9yeUlmTmVlZGVkKGZpbmFsIFJlc2VhcmNoTG9nRGlyZWN0b3J5IHJlc2VhcmNoTG9nRGlyZWN0b3J5LAorICAgICAgICAgICAgZmluYWwgbG9uZyBub3cpIHsKKyAgICAgICAgZmluYWwgbG9uZyBsYXN0Q2xlYW51cFRpbWUgPSBSZXNlYXJjaFNldHRpbmdzLnJlYWRSZXNlYXJjaExhc3REaXJDbGVhbnVwVGltZShtUHJlZnMpOworICAgICAgICBpZiAobm93IC0gbGFzdENsZWFudXBUaW1lIDwgRFVSQVRJT05fQkVUV0VFTl9ESVJfQ0xFQU5VUF9JTl9NUykgcmV0dXJuOworICAgICAgICBmaW5hbCBsb25nIG9sZGVzdEFsbG93ZWRGaWxlVGltZSA9IG5vdyAtIE1BWF9MT0dGSUxFX0FHRV9JTl9NUzsKKyAgICAgICAgbVJlc2VhcmNoTG9nRGlyZWN0b3J5LmNsZWFudXBMb2dGaWxlc09sZGVyVGhhbihvbGRlc3RBbGxvd2VkRmlsZVRpbWUpOworICAgICAgICBSZXNlYXJjaFNldHRpbmdzLndyaXRlUmVzZWFyY2hMYXN0RGlyQ2xlYW51cFRpbWUobVByZWZzLCBub3cpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIEFycmFuZ2UgZm9yIHRoZSBVcGxvYWRlclNlcnZpY2UgdG8gYmUgcnVuIG9uIGEgcmVndWxhciBiYXNpcy4KICAgICAgKgpAQCAtMjkyLDE3ICsyODcsNiBAQAogICAgICAgICAgICAgICAgIFVwbG9hZGVyU2VydmljZS5SVU5fSU5URVJWQUwsIFVwbG9hZGVyU2VydmljZS5SVU5fSU5URVJWQUwsIHBlbmRpbmdJbnRlbnQpOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBjbGVhbnVwTG9nZ2luZ0RpcihmaW5hbCBGaWxlIGRpciwgZmluYWwgbG9uZyB0aW1lKSB7Ci0gICAgICAgIGZvciAoRmlsZSBmaWxlIDogZGlyLmxpc3RGaWxlcygpKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZmlsZW5hbWUgPSBmaWxlLmdldE5hbWUoKTsKLSAgICAgICAgICAgIGlmICgoZmlsZW5hbWUuc3RhcnRzV2l0aChSZXNlYXJjaExvZ2dlci5MT0dfRklMRU5BTUVfUFJFRklYKQotICAgICAgICAgICAgICAgICAgICB8fCBmaWxlbmFtZS5zdGFydHNXaXRoKFJlc2VhcmNoTG9nZ2VyLlVTRVJfUkVDT1JESU5HX0ZJTEVOQU1FX1BSRUZJWCkpCi0gICAgICAgICAgICAgICAgICAgICYmIGZpbGUubGFzdE1vZGlmaWVkKCkgPCB0aW1lKSB7Ci0gICAgICAgICAgICAgICAgZmlsZS5kZWxldGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQogICAgIHB1YmxpYyB2b2lkIG1haW5LZXlib2FyZFZpZXdfb25BdHRhY2hlZFRvV2luZG93KGZpbmFsIE1haW5LZXlib2FyZFZpZXcgbWFpbktleWJvYXJkVmlldykgewogICAgICAgICBtTWFpbktleWJvYXJkVmlldyA9IG1haW5LZXlib2FyZFZpZXc7CiAgICAgICAgIG1heWJlU2hvd1NwbGFzaFNjcmVlbigpOwpAQCAtMzg0LDM1ICszNjgsMTAgQEAKICAgICAgICAgcmVzdGFydCgpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIGludCBzTG9nRmlsZUNvdW50ZXIgPSAwOwotCi0gICAgcHJpdmF0ZSBGaWxlIGNyZWF0ZUxvZ0ZpbGUoZmluYWwgRmlsZSBmaWxlc0RpcikgewotICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgc2IuYXBwZW5kKExPR19GSUxFTkFNRV9QUkVGSVgpLmFwcGVuZCgnLScpOwotICAgICAgICBmaW5hbCBTdHJpbmcgdXVpZCA9IFJlc2VhcmNoU2V0dGluZ3MucmVhZFJlc2VhcmNoTG9nZ2VyVXVpZChtUHJlZnMpOwotICAgICAgICBzYi5hcHBlbmQodXVpZCkuYXBwZW5kKCctJyk7Ci0gICAgICAgIHNiLmFwcGVuZChUSU1FU1RBTVBfREFURUZPUk1BVC5mb3JtYXQobmV3IERhdGUoKSkpLmFwcGVuZCgnLScpOwotICAgICAgICAvLyBTb21ldGltZXMgbG9nRmlsZXMgYXJlIGNyZWF0ZWQgd2l0aGluIG1pbGxpc2Vjb25kcyBvZiBlYWNoIG90aGVyLiAgQXBwZW5kIGEgY291bnRlciB0bwotICAgICAgICAvLyBzZXBhcmF0ZSB0aGVzZS4KLSAgICAgICAgaWYgKHNMb2dGaWxlQ291bnRlciA8IEludGVnZXIuTUFYX1ZBTFVFKSB7Ci0gICAgICAgICAgICBzTG9nRmlsZUNvdW50ZXIrKzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFdyYXAgdGhlIGNvdW50ZXIsIGluIHRoZSB1bmxpa2VseSBldmVudCBvZiBvdmVyZmxvdy4KLSAgICAgICAgICAgIHNMb2dGaWxlQ291bnRlciA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgc2IuYXBwZW5kKHNMb2dGaWxlQ291bnRlcik7Ci0gICAgICAgIHNiLmFwcGVuZChMT0dfRklMRU5BTUVfU1VGRklYKTsKLSAgICAgICAgcmV0dXJuIG5ldyBGaWxlKGZpbGVzRGlyLCBzYi50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEZpbGUgY3JlYXRlVXNlclJlY29yZGluZ0ZpbGUoZmluYWwgRmlsZSBmaWxlc0RpcikgewotICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgc2IuYXBwZW5kKFVTRVJfUkVDT1JESU5HX0ZJTEVOQU1FX1BSRUZJWCkuYXBwZW5kKCctJyk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyB1dWlkID0gUmVzZWFyY2hTZXR0aW5ncy5yZWFkUmVzZWFyY2hMb2dnZXJVdWlkKG1QcmVmcyk7Ci0gICAgICAgIHNiLmFwcGVuZCh1dWlkKS5hcHBlbmQoJy0nKTsKLSAgICAgICAgc2IuYXBwZW5kKFRJTUVTVEFNUF9EQVRFRk9STUFULmZvcm1hdChuZXcgRGF0ZSgpKSk7Ci0gICAgICAgIHNiLmFwcGVuZChVU0VSX1JFQ09SRElOR19GSUxFTkFNRV9TVUZGSVgpOwotICAgICAgICByZXR1cm4gbmV3IEZpbGUoZmlsZXNEaXIsIHNiLnRvU3RyaW5nKCkpOworICAgIHByaXZhdGUgdm9pZCBzZXRMb2dnaW5nQWxsb3dlZChmaW5hbCBib29sZWFuIGVuYWJsZUxvZ2dpbmcpIHsKKyAgICAgICAgaWYgKG1QcmVmcyA9PSBudWxsKSByZXR1cm47CisgICAgICAgIHNJc0xvZ2dpbmcgPSBlbmFibGVMb2dnaW5nOworICAgICAgICBSZXNlYXJjaFNldHRpbmdzLndyaXRlUmVzZWFyY2hMb2dnZXJFbmFibGVkRmxhZyhtUHJlZnMsIGVuYWJsZUxvZ2dpbmcpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBjaGVja0ZvckVtcHR5RWRpdG9yKCkgewpAQCAtNDUyLDcgKzQxMSw4IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1NYWluTG9nQnVmZmVyID09IG51bGwpIHsKLSAgICAgICAgICAgIG1NYWluUmVzZWFyY2hMb2cgPSBuZXcgUmVzZWFyY2hMb2coY3JlYXRlTG9nRmlsZShtRmlsZXNEaXIpLCBtTGF0aW5JTUUpOworICAgICAgICAgICAgbU1haW5SZXNlYXJjaExvZyA9IG5ldyBSZXNlYXJjaExvZyhtUmVzZWFyY2hMb2dEaXJlY3RvcnkuZ2V0TG9nRmlsZVBhdGgoCisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSwgbUxhdGluSU1FKTsKICAgICAgICAgICAgIGZpbmFsIGludCBudW1Xb3Jkc1RvSWdub3JlID0gbmV3IFJhbmRvbSgpLm5leHRJbnQoTlVNQkVSX09GX1dPUkRTX0JFVFdFRU5fU0FNUExFUyArIDEpOwogICAgICAgICAgICAgbU1haW5Mb2dCdWZmZXIgPSBuZXcgTWFpbkxvZ0J1ZmZlcihOVU1CRVJfT0ZfV09SRFNfQkVUV0VFTl9TQU1QTEVTLCBudW1Xb3Jkc1RvSWdub3JlLAogICAgICAgICAgICAgICAgICAgICBtU3VnZ2VzdCkgewpAQCAtNDg1LDcgKzQ0NSw4IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHJlc2V0RmVlZGJhY2tMb2dnaW5nKCkgewotICAgICAgICBtRmVlZGJhY2tMb2cgPSBuZXcgUmVzZWFyY2hMb2coY3JlYXRlTG9nRmlsZShtRmlsZXNEaXIpLCBtTGF0aW5JTUUpOworICAgICAgICBtRmVlZGJhY2tMb2cgPSBuZXcgUmVzZWFyY2hMb2cobVJlc2VhcmNoTG9nRGlyZWN0b3J5LmdldExvZ0ZpbGVQYXRoKAorICAgICAgICAgICAgICAgIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSwgbUxhdGluSU1FKTsKICAgICAgICAgbUZlZWRiYWNrTG9nQnVmZmVyID0gbmV3IEZpeGVkTG9nQnVmZmVyKEZFRURCQUNLX1dPUkRfQlVGRkVSX1NJWkUpOwogICAgIH0KIApAQCAtNTAyLDQyICs0NjMsMjkgQEAKICAgICAgICAgICAgIGNvbW1pdEN1cnJlbnRMb2dVbml0KCk7CiAgICAgICAgICAgICBtTWFpbkxvZ0J1ZmZlci5zZXRJc1N0b3BwaW5nKCk7CiAgICAgICAgICAgICBtTWFpbkxvZ0J1ZmZlci5zaGlmdEFuZFB1Ymxpc2hBbGwoKTsKLSAgICAgICAgICAgIG1NYWluUmVzZWFyY2hMb2cuY2xvc2UobnVsbCAvKiBjYWxsYmFjayAqLyk7CisgICAgICAgICAgICBtTWFpblJlc2VhcmNoTG9nLmJsb2NraW5nQ2xvc2UoUkVTRUFSQ0hMT0dfQ0xPU0VfVElNRU9VVF9JTl9NUyk7CiAgICAgICAgICAgICBtTWFpbkxvZ0J1ZmZlciA9IG51bGw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1GZWVkYmFja0xvZ0J1ZmZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRmVlZGJhY2tMb2cuY2xvc2UobnVsbCAvKiBjYWxsYmFjayAqLyk7CisgICAgICAgICAgICBtRmVlZGJhY2tMb2cuYmxvY2tpbmdDbG9zZShSRVNFQVJDSExPR19DTE9TRV9USU1FT1VUX0lOX01TKTsKICAgICAgICAgICAgIG1GZWVkYmFja0xvZ0J1ZmZlciA9IG51bGw7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiBhYm9ydCgpIHsKKyAgICBwdWJsaWMgdm9pZCBhYm9ydCgpIHsKICAgICAgICAgaWYgKERFQlVHKSB7CiAgICAgICAgICAgICBMb2cuZChUQUcsICJhYm9ydCBjYWxsZWQiKTsKICAgICAgICAgfQotICAgICAgICBib29sZWFuIGRpZEFib3J0TWFpbkxvZyA9IGZhbHNlOwogICAgICAgICBpZiAobU1haW5Mb2dCdWZmZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgbU1haW5Mb2dCdWZmZXIuY2xlYXIoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZGlkQWJvcnRNYWluTG9nID0gbU1haW5SZXNlYXJjaExvZy5ibG9ja2luZ0Fib3J0KCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gRG9uJ3Qga25vdyB3aGV0aGVyIHRoaXMgc3VjY2VlZGVkIG9yIG5vdC4gIFdlIGFzc3VtZSBub3Q7IHRoaXMgaXMgcmVwb3J0ZWQKLSAgICAgICAgICAgICAgICAvLyB0byB0aGUgY2FsbGVyLgotICAgICAgICAgICAgfQorICAgICAgICAgICAgbU1haW5SZXNlYXJjaExvZy5ibG9ja2luZ0Fib3J0KFJFU0VBUkNITE9HX0FCT1JUX1RJTUVPVVRfSU5fTVMpOwogICAgICAgICAgICAgbU1haW5Mb2dCdWZmZXIgPSBudWxsOwogICAgICAgICB9Ci0gICAgICAgIGJvb2xlYW4gZGlkQWJvcnRGZWVkYmFja0xvZyA9IGZhbHNlOwogICAgICAgICBpZiAobUZlZWRiYWNrTG9nQnVmZmVyICE9IG51bGwpIHsKICAgICAgICAgICAgIG1GZWVkYmFja0xvZ0J1ZmZlci5jbGVhcigpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBkaWRBYm9ydEZlZWRiYWNrTG9nID0gbUZlZWRiYWNrTG9nLmJsb2NraW5nQWJvcnQoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBEb24ndCBrbm93IHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQgb3Igbm90LiAgV2UgYXNzdW1lIG5vdDsgdGhpcyBpcyByZXBvcnRlZAotICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBjYWxsZXIuCi0gICAgICAgICAgICB9CisgICAgICAgICAgICBtRmVlZGJhY2tMb2cuYmxvY2tpbmdBYm9ydChSRVNFQVJDSExPR19BQk9SVF9USU1FT1VUX0lOX01TKTsKICAgICAgICAgICAgIG1GZWVkYmFja0xvZ0J1ZmZlciA9IG51bGw7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRpZEFib3J0TWFpbkxvZyAmJiBkaWRBYm9ydEZlZWRiYWNrTG9nOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCByZXN0YXJ0KCkgewpAQCAtNjIwLDkgKzU2OCwxMCBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0UmVjb3JkaW5nSW50ZXJuYWwoKSB7CiAgICAgICAgIGlmIChtVXNlclJlY29yZGluZ0xvZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtVXNlclJlY29yZGluZ0xvZy5hYm9ydCgpOworICAgICAgICAgICAgbVVzZXJSZWNvcmRpbmdMb2cuYmxvY2tpbmdBYm9ydChSRVNFQVJDSExPR19BQk9SVF9USU1FT1VUX0lOX01TKTsKICAgICAgICAgfQotICAgICAgICBtVXNlclJlY29yZGluZ0ZpbGUgPSBjcmVhdGVVc2VyUmVjb3JkaW5nRmlsZShtRmlsZXNEaXIpOworICAgICAgICBtVXNlclJlY29yZGluZ0ZpbGUgPSBtUmVzZWFyY2hMb2dEaXJlY3RvcnkuZ2V0VXNlclJlY29yZGluZ0ZpbGVQYXRoKAorICAgICAgICAgICAgICAgIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKICAgICAgICAgbVVzZXJSZWNvcmRpbmdMb2cgPSBuZXcgUmVzZWFyY2hMb2cobVVzZXJSZWNvcmRpbmdGaWxlLCBtTGF0aW5JTUUpOwogICAgICAgICBtVXNlclJlY29yZGluZ0xvZ0J1ZmZlciA9IG5ldyBMb2dCdWZmZXIoKTsKICAgICAgICAgcmVzZXRSZWNvcmRpbmdUaW1lcigpOwpAQCAtNjU4LDcgKzYwNyw3IEBACiAKICAgICBwcml2YXRlIHZvaWQgY2FuY2VsUmVjb3JkaW5nKCkgewogICAgICAgICBpZiAobVVzZXJSZWNvcmRpbmdMb2cgIT0gbnVsbCkgewotICAgICAgICAgICAgbVVzZXJSZWNvcmRpbmdMb2cuYWJvcnQoKTsKKyAgICAgICAgICAgIG1Vc2VyUmVjb3JkaW5nTG9nLmJsb2NraW5nQWJvcnQoUkVTRUFSQ0hMT0dfQUJPUlRfVElNRU9VVF9JTl9NUyk7CiAgICAgICAgIH0KICAgICAgICAgbVVzZXJSZWNvcmRpbmdMb2cgPSBudWxsOwogICAgICAgICBtVXNlclJlY29yZGluZ0xvZ0J1ZmZlciA9IG51bGw7CkBAIC02NzAsNyArNjE5LDcgQEAKICAgICBwcml2YXRlIHZvaWQgc2F2ZVJlY29yZGluZygpIHsKICAgICAgICAgY29tbWl0Q3VycmVudExvZ1VuaXQoKTsKICAgICAgICAgcHVibGlzaExvZ0J1ZmZlcihtVXNlclJlY29yZGluZ0xvZ0J1ZmZlciwgbVVzZXJSZWNvcmRpbmdMb2csIHRydWUpOwotICAgICAgICBtVXNlclJlY29yZGluZ0xvZy5jbG9zZShudWxsKTsKKyAgICAgICAgbVVzZXJSZWNvcmRpbmdMb2cuYmxvY2tpbmdDbG9zZShSRVNFQVJDSExPR19DTE9TRV9USU1FT1VUX0lOX01TKTsKICAgICAgICAgbVVzZXJSZWNvcmRpbmdMb2cgPSBudWxsOwogICAgICAgICBtVXNlclJlY29yZGluZ0xvZ0J1ZmZlciA9IG51bGw7CiAKQEAgLTc4MiwxMiArNzMxLDggQEAKICAgICAgICAgICAgICAgICBmZWVkYmFja0NvbnRlbnRzLCBhY2NvdW50TmFtZSwgcmVjb3JkaW5nKTsKICAgICAgICAgbUZlZWRiYWNrTG9nQnVmZmVyLnNoaWZ0SW4oZmVlZGJhY2tMb2dVbml0KTsKICAgICAgICAgcHVibGlzaExvZ0J1ZmZlcihtRmVlZGJhY2tMb2dCdWZmZXIsIG1TYXZlZEZlZWRiYWNrTG9nLCB0cnVlIC8qIGlzSW5jbHVkaW5nUHJpdmF0ZURhdGEgKi8pOwotICAgICAgICBtU2F2ZWRGZWVkYmFja0xvZy5jbG9zZShuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICB1cGxvYWROb3coKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7CisgICAgICAgIG1TYXZlZEZlZWRiYWNrTG9nLmJsb2NraW5nQ2xvc2UoUkVTRUFSQ0hMT0dfQ0xPU0VfVElNRU9VVF9JTl9NUyk7CisgICAgICAgIHVwbG9hZE5vdygpOwogCiAgICAgICAgIGlmIChpc0luY2x1ZGluZ1JlY29yZGluZyAmJiBERUJVR19SRVBMQVlfQUZURVJfRkVFREJBQ0spIHsKICAgICAgICAgICAgIGZpbmFsIEhhbmRsZXIgaGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7CkBAIC0xMTQ4LDcgKzEwOTMsNyBAQAogICAgICAgICAgICAgbmV3IExvZ1N0YXRlbWVudCgiTGF0aW5JbWVPblN0YXJ0SW5wdXRWaWV3SW50ZXJuYWwiLCBmYWxzZSwgZmFsc2UsICJ1dWlkIiwKICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2VOYW1lIiwgImlucHV0VHlwZSIsICJpbWVPcHRpb25zIiwgImZpZWxkSWQiLCAiZGlzcGxheSIsICJtb2RlbCIsCiAgICAgICAgICAgICAgICAgICAgICJwcmVmcyIsICJ2ZXJzaW9uQ29kZSIsICJ2ZXJzaW9uTmFtZSIsICJvdXRwdXRGb3JtYXRWZXJzaW9uIiwgImxvZ0V2ZXJ5dGhpbmciLAotICAgICAgICAgICAgICAgICAgICAiaXNFeHBlcmltZW50YWxEZWJ1ZyIpOworICAgICAgICAgICAgICAgICAgICAiaXNVc2luZ0RldmVsb3BtZW50T25seURpYWdub3N0aWNzRGVidWciKTsKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbGF0aW5JTUVfb25TdGFydElucHV0Vmlld0ludGVybmFsKGZpbmFsIEVkaXRvckluZm8gZWRpdG9ySW5mbywKICAgICAgICAgICAgIGZpbmFsIFNoYXJlZFByZWZlcmVuY2VzIHByZWZzKSB7CiAgICAgICAgIGZpbmFsIFJlc2VhcmNoTG9nZ2VyIHJlc2VhcmNoTG9nZ2VyID0gZ2V0SW5zdGFuY2UoKTsKQEAgLTExNzAsNyArMTExNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvSGV4U3RyaW5nKGVkaXRvckluZm8uaW1lT3B0aW9ucyksIGVkaXRvckluZm8uZmllbGRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWxkLkRJU1BMQVksIEJ1aWxkLk1PREVMLCBwcmVmcywgdmVyc2lvbkNvZGUsIHZlcnNpb25OYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgT1VUUFVUX0ZPUk1BVF9WRVJTSU9OLCBJU19MT0dHSU5HX0VWRVJZVEhJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICBQcm9kdWN0aW9uRmxhZy5JU19FWFBFUklNRU5UQUxfREVCVUcpOworICAgICAgICAgICAgICAgICAgICAgICAgUHJvZHVjdGlvbkZsYWcuVVNFU19ERVZFTE9QTUVOVF9PTkxZX0RJQUdOT1NUSUNTX0RFQlVHKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL3Jlc2VhcmNoL1Jlc2VhcmNoU2V0dGluZ3MuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL3Jlc2VhcmNoL1Jlc2VhcmNoU2V0dGluZ3MuamF2YQppbmRleCAxMWU5YWM3Li5jMGJjMDNmIDEwMDY0NAotLS0gYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9yZXNlYXJjaC9SZXNlYXJjaFNldHRpbmdzLmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvcmVzZWFyY2gvUmVzZWFyY2hTZXR0aW5ncy5qYXZhCkBAIC0yNiw2ICsyNiw4IEBACiAgICAgICAgICAgICAicHJlZl9yZXNlYXJjaF9sb2dnZXJfZW5hYmxlZF9mbGFnIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1JFU0VBUkNIX0xPR0dFUl9IQVNfU0VFTl9TUExBU0ggPQogICAgICAgICAgICAgInByZWZfcmVzZWFyY2hfbG9nZ2VyX2hhc19zZWVuX3NwbGFzaCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9SRVNFQVJDSF9MQVNUX0RJUl9DTEVBTlVQX1RJTUUgPQorICAgICAgICAgICAgInByZWZfcmVzZWFyY2hfbGFzdF9kaXJfY2xlYW51cF90aW1lIjsKIAogICAgIHByaXZhdGUgUmVzZWFyY2hTZXR0aW5ncygpIHsKICAgICAgICAgLy8gSW50ZW50aW9uYWwgZW1wdHkgY29uc3RydWN0b3IgZm9yIHNpbmdsZXRvbi4KQEAgLTU4LDQgKzYwLDEzIEBACiAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGhhc1NlZW5TcGxhc2gpIHsKICAgICAgICAgcHJlZnMuZWRpdCgpLnB1dEJvb2xlYW4oUFJFRl9SRVNFQVJDSF9MT0dHRVJfSEFTX1NFRU5fU1BMQVNILCBoYXNTZWVuU3BsYXNoKS5hcHBseSgpOwogICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgbG9uZyByZWFkUmVzZWFyY2hMYXN0RGlyQ2xlYW51cFRpbWUoZmluYWwgU2hhcmVkUHJlZmVyZW5jZXMgcHJlZnMpIHsKKyAgICAgICAgcmV0dXJuIHByZWZzLmdldExvbmcoUFJFRl9SRVNFQVJDSF9MQVNUX0RJUl9DTEVBTlVQX1RJTUUsIDBMKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVSZXNlYXJjaExhc3REaXJDbGVhbnVwVGltZShmaW5hbCBTaGFyZWRQcmVmZXJlbmNlcyBwcmVmcywKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgbGFzdERpckNsZWFudXBUaW1lKSB7CisgICAgICAgIHByZWZzLmVkaXQoKS5wdXRMb25nKFBSRUZfUkVTRUFSQ0hfTEFTVF9ESVJfQ0xFQU5VUF9USU1FLCBsYXN0RGlyQ2xlYW51cFRpbWUpLmFwcGx5KCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvcmVzZWFyY2gvU3RhdGlzdGljcy5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvcmVzZWFyY2gvU3RhdGlzdGljcy5qYXZhCmluZGV4IDUwZTJiN2YuLjdmNmM4NTEgMTAwNjQ0Ci0tLSBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL3Jlc2VhcmNoL1N0YXRpc3RpY3MuamF2YQorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9yZXNlYXJjaC9TdGF0aXN0aWNzLmphdmEKQEAgLTIzLDcgKzIzLDggQEAKIAogcHVibGljIGNsYXNzIFN0YXRpc3RpY3MgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBTdGF0aXN0aWNzLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2UgJiYgUHJvZHVjdGlvbkZsYWcuSVNfRVhQRVJJTUVOVEFMX0RFQlVHOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZQorICAgICAgICAgICAgJiYgUHJvZHVjdGlvbkZsYWcuVVNFU19ERVZFTE9QTUVOVF9PTkxZX0RJQUdOT1NUSUNTX0RFQlVHOwogCiAgICAgLy8gVE9ETzogQ2xlYW51cCBjb21tZW50cyB0byBvbmx5IGluY2x1ZGluZyB0aG9zZSBnaXZpbmcgbWVhbmluZ2Z1bCBpbmZvcm1hdGlvbi4KICAgICAvLyBOdW1iZXIgb2YgY2hhcmFjdGVycyBlbnRlcmVkIGR1cmluZyBhIHR5cGluZyBzZXNzaW9uCmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9yZXNlYXJjaC9VcGxvYWRlci5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvcmVzZWFyY2gvVXBsb2FkZXIuamF2YQppbmRleCBkZjQ5NWE4Li5iYTA1ZWMxIDEwMDY0NAotLS0gYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9yZXNlYXJjaC9VcGxvYWRlci5qYXZhCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL3Jlc2VhcmNoL1VwbG9hZGVyLmphdmEKQEAgLTE3LDcgKzE3LDYgQEAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QucmVzZWFyY2g7CiAKIGltcG9ydCBhbmRyb2lkLk1hbmlmZXN0OwotaW1wb3J0IGFuZHJvaWQuYXBwLkFsYXJtTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CkBAIC0zMyw3ICszMiw2IEBACiAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7CiBpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwpAQCAtNDgsMTkgKzQ2LDIwIEBACiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBVcGxvYWRlciB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IFVwbG9hZGVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2UgJiYgUHJvZHVjdGlvbkZsYWcuSVNfRVhQRVJJTUVOVEFMX0RFQlVHOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZQorICAgICAgICAgICAgJiYgUHJvZHVjdGlvbkZsYWcuVVNFU19ERVZFTE9QTUVOVF9PTkxZX0RJQUdOT1NUSUNTX0RFQlVHOwogICAgIC8vIFNldCBJU19JTkhJQklUSU5HX0FVVE9fVVBMT0FEIHRvIHRydWUgZm9yIGxvY2FsIHRlc3RpbmcKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX0lOSElCSVRJTkdfQVVUT19VUExPQUQgPSBmYWxzZQotICAgICAgICAgICAgJiYgUHJvZHVjdGlvbkZsYWcuSVNfRVhQRVJJTUVOVEFMX0RFQlVHOyAgLy8gRm9yY2UgZmFsc2UgZm9yIG5vbi1kZWJ1ZyBidWlsZHMKKyAgICAgICAgICAgICYmIFByb2R1Y3Rpb25GbGFnLlVTRVNfREVWRUxPUE1FTlRfT05MWV9ESUFHTk9TVElDU19ERUJVRzsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGX1NJWkUgPSAxMDI0ICogODsKIAogICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIGZpbmFsIEZpbGUgbUZpbGVzRGlyOworICAgIHByaXZhdGUgZmluYWwgUmVzZWFyY2hMb2dEaXJlY3RvcnkgbVJlc2VhcmNoTG9nRGlyZWN0b3J5OwogICAgIHByaXZhdGUgZmluYWwgVVJMIG1Vcmw7CiAKICAgICBwdWJsaWMgVXBsb2FkZXIoZmluYWwgQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgbUZpbGVzRGlyID0gY29udGV4dC5nZXRGaWxlc0RpcigpOworICAgICAgICBtUmVzZWFyY2hMb2dEaXJlY3RvcnkgPSBuZXcgUmVzZWFyY2hMb2dEaXJlY3RvcnkoY29udGV4dCk7CiAKICAgICAgICAgZmluYWwgU3RyaW5nIHVybFN0cmluZyA9IGNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLnJlc2VhcmNoX2xvZ2dlcl91cGxvYWRfdXJsKTsKICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHVybFN0cmluZykpIHsKQEAgLTEwNiwxNiArMTA1LDggQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBkb1VwbG9hZCgpIHsKLSAgICAgICAgaWYgKG1GaWxlc0RpciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgRmlsZVtdIGZpbGVzID0gbUZpbGVzRGlyLmxpc3RGaWxlcyhuZXcgRmlsZUZpbHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KGZpbmFsIEZpbGUgcGF0aG5hbWUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcGF0aG5hbWUuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoUmVzZWFyY2hMb2dnZXIuTE9HX0ZJTEVOQU1FX1BSRUZJWCkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmICFwYXRobmFtZS5jYW5Xcml0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKKyAgICAgICAgZmluYWwgRmlsZVtdIGZpbGVzID0gbVJlc2VhcmNoTG9nRGlyZWN0b3J5LmdldFVwbG9hZGFibGVMb2dGaWxlcygpOworICAgICAgICBpZiAoZmlsZXMgPT0gbnVsbCkgcmV0dXJuOwogICAgICAgICBmb3IgKGZpbmFsIEZpbGUgZmlsZSA6IGZpbGVzKSB7CiAgICAgICAgICAgICB1cGxvYWRGaWxlKGZpbGUpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9yZXNlYXJjaC9VcGxvYWRlclNlcnZpY2UuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL3Jlc2VhcmNoL1VwbG9hZGVyU2VydmljZS5qYXZhCmluZGV4IDI2YjY1MTAuLjZhOWY1YzEgMTAwNjQ0Ci0tLSBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL3Jlc2VhcmNoL1VwbG9hZGVyU2VydmljZS5qYXZhCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL3Jlc2VhcmNoL1VwbG9hZGVyU2VydmljZS5qYXZhCkBAIC0zMCw3ICszMCw4IEBACiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBVcGxvYWRlclNlcnZpY2UgZXh0ZW5kcyBJbnRlbnRTZXJ2aWNlIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gVXBsb2FkZXJTZXJ2aWNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2UgJiYgUHJvZHVjdGlvbkZsYWcuSVNfRVhQRVJJTUVOVEFMX0RFQlVHOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZQorICAgICAgICAgICAgJiYgUHJvZHVjdGlvbkZsYWcuVVNFU19ERVZFTE9QTUVOVF9PTkxZX0RJQUdOT1NUSUNTX0RFQlVHOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBSVU5fSU5URVJWQUwgPSBBbGFybU1hbmFnZXIuSU5URVJWQUxfSE9VUjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9VUExPQURfVU5DT05ESVRJT05BTExZID0gVXBsb2FkZXJTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKQogICAgICAgICAgICAgKyAiLmV4dHJhLlVQTE9BRF9VTkNPTkRJVElPTkFMTFkiOwpkaWZmIC0tZ2l0IGEvbmF0aXZlL2puaS9jb21fYW5kcm9pZF9pbnB1dG1ldGhvZF9sYXRpbl9CaW5hcnlEaWN0aW9uYXJ5LmNwcCBiL25hdGl2ZS9qbmkvY29tX2FuZHJvaWRfaW5wdXRtZXRob2RfbGF0aW5fQmluYXJ5RGljdGlvbmFyeS5jcHAKaW5kZXggY2EzOGIwZC4uOTMyMWM0YiAxMDA2NDQKLS0tIGEvbmF0aXZlL2puaS9jb21fYW5kcm9pZF9pbnB1dG1ldGhvZF9sYXRpbl9CaW5hcnlEaWN0aW9uYXJ5LmNwcAorKysgYi9uYXRpdmUvam5pL2NvbV9hbmRyb2lkX2lucHV0bWV0aG9kX2xhdGluX0JpbmFyeURpY3Rpb25hcnkuY3BwCkBAIC0yMDMsMTQgKzIwMywxNCBAQAogICAgIHJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIGppbnQgbGF0aW5pbWVfQmluYXJ5RGljdGlvbmFyeV9nZXRGcmVxdWVuY3koSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgamxvbmcgZGljdCwKK3N0YXRpYyBqaW50IGxhdGluaW1lX0JpbmFyeURpY3Rpb25hcnlfZ2V0UHJvYmFiaWxpdHkoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgamxvbmcgZGljdCwKICAgICAgICAgamludEFycmF5IHdvcmRBcnJheSkgewogICAgIERpY3Rpb25hcnkgKmRpY3Rpb25hcnkgPSByZWludGVycHJldF9jYXN0PERpY3Rpb25hcnkgKj4oZGljdCk7CiAgICAgaWYgKCFkaWN0aW9uYXJ5KSByZXR1cm4gMDsKICAgICBjb25zdCBqc2l6ZSBjb2RlUG9pbnRMZW5ndGggPSBlbnYtPkdldEFycmF5TGVuZ3RoKHdvcmRBcnJheSk7CiAgICAgaW50IGNvZGVQb2ludHNbY29kZVBvaW50TGVuZ3RoXTsKICAgICBlbnYtPkdldEludEFycmF5UmVnaW9uKHdvcmRBcnJheSwgMCwgY29kZVBvaW50TGVuZ3RoLCBjb2RlUG9pbnRzKTsKLSAgICByZXR1cm4gZGljdGlvbmFyeS0+Z2V0RnJlcXVlbmN5KGNvZGVQb2ludHMsIGNvZGVQb2ludExlbmd0aCk7CisgICAgcmV0dXJuIGRpY3Rpb25hcnktPmdldFByb2JhYmlsaXR5KGNvZGVQb2ludHMsIGNvZGVQb2ludExlbmd0aCk7CiB9CiAKIHN0YXRpYyBqYm9vbGVhbiBsYXRpbmltZV9CaW5hcnlEaWN0aW9uYXJ5X2lzVmFsaWRCaWdyYW0oSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgamxvbmcgZGljdCwKQEAgLTI4NSw4ICsyODUsOCBAQAogICAgIHsiY2xvc2VOYXRpdmUiLCAiKEopViIsIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqPihsYXRpbmltZV9CaW5hcnlEaWN0aW9uYXJ5X2Nsb3NlKX0sCiAgICAgeyJnZXRTdWdnZXN0aW9uc05hdGl2ZSIsICIoSkpKW0lbSVtJW0lbSUlJWltJWltJW0lbSVtJKUkiLAogICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkICo+KGxhdGluaW1lX0JpbmFyeURpY3Rpb25hcnlfZ2V0U3VnZ2VzdGlvbnMpfSwKLSAgICB7ImdldEZyZXF1ZW5jeU5hdGl2ZSIsICIoSltJKUkiLAotICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkICo+KGxhdGluaW1lX0JpbmFyeURpY3Rpb25hcnlfZ2V0RnJlcXVlbmN5KX0sCisgICAgeyJnZXRQcm9iYWJpbGl0eU5hdGl2ZSIsICIoSltJKUkiLAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkICo+KGxhdGluaW1lX0JpbmFyeURpY3Rpb25hcnlfZ2V0UHJvYmFiaWxpdHkpfSwKICAgICB7ImlzVmFsaWRCaWdyYW1OYXRpdmUiLCAiKEpbSVtJKVoiLAogICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkICo+KGxhdGluaW1lX0JpbmFyeURpY3Rpb25hcnlfaXNWYWxpZEJpZ3JhbSl9LAogICAgIHsiY2FsY05vcm1hbGl6ZWRTY29yZU5hdGl2ZSIsICIoW0lbSUkpRiIsCmRpZmYgLS1naXQgYS9uYXRpdmUvam5pL3NyYy9iaWdyYW1fZGljdGlvbmFyeS5jcHAgYi9uYXRpdmUvam5pL3NyYy9iaWdyYW1fZGljdGlvbmFyeS5jcHAKaW5kZXggZWYwNDM0Yy4uNDNlNTlhMiAxMDA2NDQKLS0tIGEvbmF0aXZlL2puaS9zcmMvYmlncmFtX2RpY3Rpb25hcnkuY3BwCisrKyBiL25hdGl2ZS9qbmkvc3JjL2JpZ3JhbV9kaWN0aW9uYXJ5LmNwcApAQCAtMzYsMjEgKzM2LDIxIEBACiBCaWdyYW1EaWN0aW9uYXJ5Ojp+QmlncmFtRGljdGlvbmFyeSgpIHsKIH0KIAotdm9pZCBCaWdyYW1EaWN0aW9uYXJ5OjphZGRXb3JkQmlncmFtKGludCAqd29yZCwgaW50IGxlbmd0aCwgaW50IGZyZXF1ZW5jeSwgaW50ICpiaWdyYW1GcmVxLAordm9pZCBCaWdyYW1EaWN0aW9uYXJ5OjphZGRXb3JkQmlncmFtKGludCAqd29yZCwgaW50IGxlbmd0aCwgaW50IHByb2JhYmlsaXR5LCBpbnQgKmJpZ3JhbVByb2JhYmlsaXR5LAogICAgICAgICBpbnQgKmJpZ3JhbUNvZGVQb2ludHMsIGludCAqb3V0cHV0VHlwZXMpIGNvbnN0IHsKICAgICB3b3JkW2xlbmd0aF0gPSAwOwogICAgIGlmIChERUJVR19ESUNUKSB7CiAjaWZkZWYgRkxBR19EQkcKICAgICAgICAgY2hhciBzW2xlbmd0aCArIDFdOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBsZW5ndGg7IGkrKykgc1tpXSA9IHN0YXRpY19jYXN0PGNoYXI+KHdvcmRbaV0pOwotICAgICAgICBBS0xPR0koIkJpZ3JhbTogRm91bmQgd29yZCA9ICVzLCBmcmVxID0gJWQgOiIsIHMsIGZyZXF1ZW5jeSk7CisgICAgICAgIEFLTE9HSSgiQmlncmFtOiBGb3VuZCB3b3JkID0gJXMsIGZyZXEgPSAlZCA6IiwgcywgcHJvYmFiaWxpdHkpOwogI2VuZGlmCiAgICAgfQogCiAgICAgLy8gRmluZCB0aGUgcmlnaHQgaW5zZXJ0aW9uIHBvaW50CiAgICAgaW50IGluc2VydEF0ID0gMDsKICAgICB3aGlsZSAoaW5zZXJ0QXQgPCBNQVhfUkVTVUxUUykgewotICAgICAgICBpZiAoZnJlcXVlbmN5ID4gYmlncmFtRnJlcVtpbnNlcnRBdF0gfHwgKGJpZ3JhbUZyZXFbaW5zZXJ0QXRdID09IGZyZXF1ZW5jeQorICAgICAgICBpZiAocHJvYmFiaWxpdHkgPiBiaWdyYW1Qcm9iYWJpbGl0eVtpbnNlcnRBdF0gfHwgKGJpZ3JhbVByb2JhYmlsaXR5W2luc2VydEF0XSA9PSBwcm9iYWJpbGl0eQogICAgICAgICAgICAgICAgICYmIGxlbmd0aCA8IGdldENvZGVQb2ludENvdW50KE1BWF9XT1JEX0xFTkdUSCwKICAgICAgICAgICAgICAgICAgICAgICAgIGJpZ3JhbUNvZGVQb2ludHMgKyBpbnNlcnRBdCAqIE1BWF9XT1JEX0xFTkdUSCkpKSB7CiAgICAgICAgICAgICBicmVhazsKQEAgLTYzLDEwICs2MywxMCBAQAogICAgIGlmIChpbnNlcnRBdCA+PSBNQVhfUkVTVUxUUykgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIG1lbW1vdmUoYmlncmFtRnJlcSArIChpbnNlcnRBdCArIDEpLAotICAgICAgICAgICAgYmlncmFtRnJlcSArIGluc2VydEF0LAotICAgICAgICAgICAgKE1BWF9SRVNVTFRTIC0gaW5zZXJ0QXQgLSAxKSAqIHNpemVvZihiaWdyYW1GcmVxWzBdKSk7Ci0gICAgYmlncmFtRnJlcVtpbnNlcnRBdF0gPSBmcmVxdWVuY3k7CisgICAgbWVtbW92ZShiaWdyYW1Qcm9iYWJpbGl0eSArIChpbnNlcnRBdCArIDEpLAorICAgICAgICAgICAgYmlncmFtUHJvYmFiaWxpdHkgKyBpbnNlcnRBdCwKKyAgICAgICAgICAgIChNQVhfUkVTVUxUUyAtIGluc2VydEF0IC0gMSkgKiBzaXplb2YoYmlncmFtUHJvYmFiaWxpdHlbMF0pKTsKKyAgICBiaWdyYW1Qcm9iYWJpbGl0eVtpbnNlcnRBdF0gPSBwcm9iYWJpbGl0eTsKICAgICBvdXRwdXRUeXBlc1tpbnNlcnRBdF0gPSBEaWN0aW9uYXJ5OjpLSU5EX1BSRURJQ1RJT047CiAgICAgbWVtbW92ZShiaWdyYW1Db2RlUG9pbnRzICsgKGluc2VydEF0ICsgMSkgKiBNQVhfV09SRF9MRU5HVEgsCiAgICAgICAgICAgICBiaWdyYW1Db2RlUG9pbnRzICsgaW5zZXJ0QXQgKiBNQVhfV09SRF9MRU5HVEgsCkBAIC04Nyw3ICs4Nyw3IEBACiAgKiBpbnB1dENvZGVQb2ludHM6IHdoYXQgdXNlciB0eXBlZCwgaW4gdGhlIHNhbWUgZm9ybWF0IGFzIGZvciBVbmlncmFtRGljdGlvbmFyeTo6Z2V0U3VnZ2VzdGlvbnMuCiAgKiBpbnB1dFNpemU6IHRoZSBzaXplIG9mIHRoZSBjb2RlcyBhcnJheS4KICAqIGJpZ3JhbUNvZGVQb2ludHM6IGFuIGFycmF5IGZvciBvdXRwdXQsIGF0IHRoZSBzYW1lIGZvcm1hdCBhcyBvdXR3b3JkcyBmb3IgZ2V0U3VnZ2VzdGlvbnMuCi0gKiBiaWdyYW1GcmVxOiBhbiBhcnJheSB0byBvdXRwdXQgZnJlcXVlbmNpZXMuCisgKiBiaWdyYW1Qcm9iYWJpbGl0eTogYW4gYXJyYXkgdG8gb3V0cHV0IGZyZXF1ZW5jaWVzLgogICogb3V0cHV0VHlwZXM6IGFuIGFycmF5IHRvIG91dHB1dCB0eXBlcy4KICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG51bWJlciBvZiBiaWdyYW1zIHRoaXMgd29yZCBoYXMsIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgogICogTm90ZTogdGhpcyBpcyBub3QgdGhlIG51bWJlciBvZiBiaWdyYW1zIG91dHB1dCBpbiB0aGUgYXJyYXksIHdoaWNoIGlzIHRoZSBudW1iZXIgb2YKQEAgLTk4LDcgKzk4LDcgQEAKICAqIHJlZHVjZSB0aGVpciBzY29wZSB0byB0aGUgb25lcyB0aGF0IG1hdGNoIHRoZSBmaXJzdCBsZXR0ZXIuCiAgKi8KIGludCBCaWdyYW1EaWN0aW9uYXJ5OjpnZXRCaWdyYW1zKGNvbnN0IGludCAqcHJldldvcmQsIGludCBwcmV2V29yZExlbmd0aCwgaW50ICppbnB1dENvZGVQb2ludHMsCi0gICAgICAgIGludCBpbnB1dFNpemUsIGludCAqYmlncmFtQ29kZVBvaW50cywgaW50ICpiaWdyYW1GcmVxLCBpbnQgKm91dHB1dFR5cGVzKSBjb25zdCB7CisgICAgICAgIGludCBpbnB1dFNpemUsIGludCAqYmlncmFtQ29kZVBvaW50cywgaW50ICpiaWdyYW1Qcm9iYWJpbGl0eSwgaW50ICpvdXRwdXRUeXBlcykgY29uc3QgewogICAgIC8vIFRPRE86IHJlbW92ZSB1bnVzZWQgYXJndW1lbnRzLCBhbmQgcmVmcmFpbiBmcm9tIHN0b3Jpbmcgc3R1ZmYgaW4gbWVtYmVycyBvZiB0aGlzIGNsYXNzCiAgICAgLy8gVE9ETzogaGF2ZSAiaW4iIGFyZ3VtZW50cyBiZWZvcmUgIm91dCIgb25lcywgYW5kIG1ha2Ugb3V0IGFyZ3MgZXhwbGljaXQgaW4gdGhlIG5hbWUKIApAQCAtMTE4LDIzICsxMTgsMjQgQEAKICAgICBkbyB7CiAgICAgICAgIGJpZ3JhbUZsYWdzID0gQmluYXJ5Rm9ybWF0OjpnZXRGbGFnc0FuZEZvcndhcmRQb2ludGVyKHJvb3QsICZwb3MpOwogICAgICAgICBpbnQgYmlncmFtQnVmZmVyW01BWF9XT1JEX0xFTkdUSF07Ci0gICAgICAgIGludCB1bmlncmFtRnJlcSA9IDA7CisgICAgICAgIGludCB1bmlncmFtUHJvYmFiaWxpdHkgPSAwOwogICAgICAgICBjb25zdCBpbnQgYmlncmFtUG9zID0gQmluYXJ5Rm9ybWF0OjpnZXRBdHRyaWJ1dGVBZGRyZXNzQW5kRm9yd2FyZFBvaW50ZXIocm9vdCwgYmlncmFtRmxhZ3MsCiAgICAgICAgICAgICAgICAgJnBvcyk7CiAgICAgICAgIGNvbnN0IGludCBsZW5ndGggPSBCaW5hcnlGb3JtYXQ6OmdldFdvcmRBdEFkZHJlc3Mocm9vdCwgYmlncmFtUG9zLCBNQVhfV09SRF9MRU5HVEgsCi0gICAgICAgICAgICAgICAgYmlncmFtQnVmZmVyLCAmdW5pZ3JhbUZyZXEpOworICAgICAgICAgICAgICAgIGJpZ3JhbUJ1ZmZlciwgJnVuaWdyYW1Qcm9iYWJpbGl0eSk7CiAKICAgICAgICAgLy8gaW5wdXRTaXplID09IDAgbWVhbnMgd2UgYXJlIHRyeWluZyB0byBmaW5kIGJpZ3JhbSBwcmVkaWN0aW9ucy4KICAgICAgICAgaWYgKGlucHV0U2l6ZSA8IDEgfHwgY2hlY2tGaXJzdENoYXJhY3RlcihiaWdyYW1CdWZmZXIsIGlucHV0Q29kZVBvaW50cykpIHsKLSAgICAgICAgICAgIGNvbnN0IGludCBiaWdyYW1GcmVxVGVtcCA9IEJpbmFyeUZvcm1hdDo6TUFTS19BVFRSSUJVVEVfRlJFUVVFTkNZICYgYmlncmFtRmxhZ3M7Ci0gICAgICAgICAgICAvLyBEdWUgdG8gc3BhY2UgY29uc3RyYWludHMsIHRoZSBmcmVxdWVuY3kgZm9yIGJpZ3JhbXMgaXMgYXBwcm94aW1hdGUgLSB0aGUgbG93ZXIgdGhlCi0gICAgICAgICAgICAvLyB1bmlncmFtIGZyZXF1ZW5jeSwgdGhlIHdvcnNlIHRoZSBwcmVjaXNpb24uIFRoZSB0aGVvcml0aWNhbCBtYXhpbXVtIGVycm9yIGluCi0gICAgICAgICAgICAvLyByZXN1bHRpbmcgZnJlcXVlbmN5IGlzIDggLSBhbHRob3VnaCBpbiB0aGUgcHJhY3RpY2UgaXQncyBuZXZlciBiaWdnZXIgdGhhbiAzIG9yIDQKKyAgICAgICAgICAgIGNvbnN0IGludCBiaWdyYW1Qcm9iYWJpbGl0eVRlbXAgPQorICAgICAgICAgICAgICAgICAgICBCaW5hcnlGb3JtYXQ6Ok1BU0tfQVRUUklCVVRFX1BST0JBQklMSVRZICYgYmlncmFtRmxhZ3M7CisgICAgICAgICAgICAvLyBEdWUgdG8gc3BhY2UgY29uc3RyYWludHMsIHRoZSBwcm9iYWJpbGl0eSBmb3IgYmlncmFtcyBpcyBhcHByb3hpbWF0ZSAtIHRoZSBsb3dlciB0aGUKKyAgICAgICAgICAgIC8vIHVuaWdyYW0gcHJvYmFiaWxpdHksIHRoZSB3b3JzZSB0aGUgcHJlY2lzaW9uLiBUaGUgdGhlb3JpdGljYWwgbWF4aW11bSBlcnJvciBpbgorICAgICAgICAgICAgLy8gcmVzdWx0aW5nIHByb2JhYmlsaXR5IGlzIDggLSBhbHRob3VnaCBpbiB0aGUgcHJhY3RpY2UgaXQncyBuZXZlciBiaWdnZXIgdGhhbiAzIG9yIDQKICAgICAgICAgICAgIC8vIGluIHZlcnkgYmFkIGNhc2VzLiBUaGlzIG1lYW5zIHRoYXQgc29tZXRpbWVzLCB3ZSdsbCBzZWUgc29tZSBiaWdyYW1zIGludGVydmVydGVkCiAgICAgICAgICAgICAvLyBoZXJlLCBidXQgaXQgY2FuJ3QgZ2V0IHRvbyBiYWQuCi0gICAgICAgICAgICBjb25zdCBpbnQgZnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICAgICAgQmluYXJ5Rm9ybWF0Ojpjb21wdXRlRnJlcXVlbmN5Rm9yQmlncmFtKHVuaWdyYW1GcmVxLCBiaWdyYW1GcmVxVGVtcCk7Ci0gICAgICAgICAgICBhZGRXb3JkQmlncmFtKGJpZ3JhbUJ1ZmZlciwgbGVuZ3RoLCBmcmVxdWVuY3ksIGJpZ3JhbUZyZXEsIGJpZ3JhbUNvZGVQb2ludHMsCisgICAgICAgICAgICBjb25zdCBpbnQgcHJvYmFiaWxpdHkgPSBCaW5hcnlGb3JtYXQ6OmNvbXB1dGVQcm9iYWJpbGl0eUZvckJpZ3JhbSgKKyAgICAgICAgICAgICAgICAgICAgdW5pZ3JhbVByb2JhYmlsaXR5LCBiaWdyYW1Qcm9iYWJpbGl0eVRlbXApOworICAgICAgICAgICAgYWRkV29yZEJpZ3JhbShiaWdyYW1CdWZmZXIsIGxlbmd0aCwgcHJvYmFiaWxpdHksIGJpZ3JhbVByb2JhYmlsaXR5LCBiaWdyYW1Db2RlUG9pbnRzLAogICAgICAgICAgICAgICAgICAgICBvdXRwdXRUeXBlcyk7CiAgICAgICAgICAgICArK2JpZ3JhbUNvdW50OwogICAgICAgICB9CkBAIC0xNTksMTMgKzE2MCwxMyBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIHBvcyA9IEJpbmFyeUZvcm1hdDo6c2tpcE90aGVyQ2hhcmFjdGVycyhyb290LCBwb3MpOwogICAgIH0KLSAgICBwb3MgPSBCaW5hcnlGb3JtYXQ6OnNraXBGcmVxdWVuY3koZmxhZ3MsIHBvcyk7CisgICAgcG9zID0gQmluYXJ5Rm9ybWF0Ojpza2lwUHJvYmFiaWxpdHkoZmxhZ3MsIHBvcyk7CiAgICAgcG9zID0gQmluYXJ5Rm9ybWF0Ojpza2lwQ2hpbGRyZW5Qb3NpdGlvbihmbGFncywgcG9zKTsKICAgICBwb3MgPSBCaW5hcnlGb3JtYXQ6OnNraXBTaG9ydGN1dHMocm9vdCwgZmxhZ3MsIHBvcyk7CiAgICAgcmV0dXJuIHBvczsKIH0KIAotdm9pZCBCaWdyYW1EaWN0aW9uYXJ5OjpmaWxsQmlncmFtQWRkcmVzc1RvRnJlcXVlbmN5TWFwQW5kRmlsdGVyKGNvbnN0IGludCAqcHJldldvcmQsCit2b2lkIEJpZ3JhbURpY3Rpb25hcnk6OmZpbGxCaWdyYW1BZGRyZXNzVG9Qcm9iYWJpbGl0eU1hcEFuZEZpbHRlcihjb25zdCBpbnQgKnByZXZXb3JkLAogICAgICAgICBjb25zdCBpbnQgcHJldldvcmRMZW5ndGgsIHN0ZDo6bWFwPGludCwgaW50PiAqbWFwLCB1aW50OF90ICpmaWx0ZXIpIGNvbnN0IHsKICAgICBtZW1zZXQoZmlsdGVyLCAwLCBCSUdSQU1fRklMVEVSX0JZVEVfU0laRSk7CiAgICAgY29uc3QgdWludDhfdCAqY29uc3Qgcm9vdCA9IERJQ1RfUk9PVDsKQEAgLTE4MSwxMCArMTgyLDEwIEBACiAgICAgdWludDhfdCBiaWdyYW1GbGFnczsKICAgICBkbyB7CiAgICAgICAgIGJpZ3JhbUZsYWdzID0gQmluYXJ5Rm9ybWF0OjpnZXRGbGFnc0FuZEZvcndhcmRQb2ludGVyKHJvb3QsICZwb3MpOwotICAgICAgICBjb25zdCBpbnQgZnJlcXVlbmN5ID0gQmluYXJ5Rm9ybWF0OjpNQVNLX0FUVFJJQlVURV9GUkVRVUVOQ1kgJiBiaWdyYW1GbGFnczsKKyAgICAgICAgY29uc3QgaW50IHByb2JhYmlsaXR5ID0gQmluYXJ5Rm9ybWF0OjpNQVNLX0FUVFJJQlVURV9QUk9CQUJJTElUWSAmIGJpZ3JhbUZsYWdzOwogICAgICAgICBjb25zdCBpbnQgYmlncmFtUG9zID0gQmluYXJ5Rm9ybWF0OjpnZXRBdHRyaWJ1dGVBZGRyZXNzQW5kRm9yd2FyZFBvaW50ZXIocm9vdCwgYmlncmFtRmxhZ3MsCiAgICAgICAgICAgICAgICAgJnBvcyk7Ci0gICAgICAgICgqbWFwKVtiaWdyYW1Qb3NdID0gZnJlcXVlbmN5OworICAgICAgICAoKm1hcClbYmlncmFtUG9zXSA9IHByb2JhYmlsaXR5OwogICAgICAgICBzZXRJbkZpbHRlcihmaWx0ZXIsIGJpZ3JhbVBvcyk7CiAgICAgfSB3aGlsZSAoMCAhPSAoQmluYXJ5Rm9ybWF0OjpGTEFHX0FUVFJJQlVURV9IQVNfTkVYVCAmIGJpZ3JhbUZsYWdzKSk7CiB9CmRpZmYgLS1naXQgYS9uYXRpdmUvam5pL3NyYy9iaWdyYW1fZGljdGlvbmFyeS5oIGIvbmF0aXZlL2puaS9zcmMvYmlncmFtX2RpY3Rpb25hcnkuaAppbmRleCAyY2U2YzFkLi5iODZlNTY0IDEwMDY0NAotLS0gYS9uYXRpdmUvam5pL3NyYy9iaWdyYW1fZGljdGlvbmFyeS5oCisrKyBiL25hdGl2ZS9qbmkvc3JjL2JpZ3JhbV9kaWN0aW9uYXJ5LmgKQEAgLTI5LDE0ICsyOSwxNCBAQAogICAgIEJpZ3JhbURpY3Rpb25hcnkoY29uc3QgdWludDhfdCAqY29uc3Qgc3RyZWFtU3RhcnQpOwogICAgIGludCBnZXRCaWdyYW1zKGNvbnN0IGludCAqd29yZCwgaW50IGxlbmd0aCwgaW50ICppbnB1dENvZGVQb2ludHMsIGludCBpbnB1dFNpemUsIGludCAqb3V0V29yZHMsCiAgICAgICAgICAgICBpbnQgKmZyZXF1ZW5jaWVzLCBpbnQgKm91dHB1dFR5cGVzKSBjb25zdDsKLSAgICB2b2lkIGZpbGxCaWdyYW1BZGRyZXNzVG9GcmVxdWVuY3lNYXBBbmRGaWx0ZXIoY29uc3QgaW50ICpwcmV2V29yZCwgY29uc3QgaW50IHByZXZXb3JkTGVuZ3RoLAorICAgIHZvaWQgZmlsbEJpZ3JhbUFkZHJlc3NUb1Byb2JhYmlsaXR5TWFwQW5kRmlsdGVyKGNvbnN0IGludCAqcHJldldvcmQsIGNvbnN0IGludCBwcmV2V29yZExlbmd0aCwKICAgICAgICAgICAgIHN0ZDo6bWFwPGludCwgaW50PiAqbWFwLCB1aW50OF90ICpmaWx0ZXIpIGNvbnN0OwogICAgIGJvb2wgaXNWYWxpZEJpZ3JhbShjb25zdCBpbnQgKndvcmQxLCBpbnQgbGVuZ3RoMSwgY29uc3QgaW50ICp3b3JkMiwgaW50IGxlbmd0aDIpIGNvbnN0OwogICAgIH5CaWdyYW1EaWN0aW9uYXJ5KCk7CiAgcHJpdmF0ZToKICAgICBESVNBTExPV19JTVBMSUNJVF9DT05TVFJVQ1RPUlMoQmlncmFtRGljdGlvbmFyeSk7Ci0gICAgdm9pZCBhZGRXb3JkQmlncmFtKGludCAqd29yZCwgaW50IGxlbmd0aCwgaW50IGZyZXF1ZW5jeSwgaW50ICpiaWdyYW1GcmVxLCBpbnQgKmJpZ3JhbUNvZGVQb2ludHMsCi0gICAgICAgICAgICBpbnQgKm91dHB1dFR5cGVzKSBjb25zdDsKKyAgICB2b2lkIGFkZFdvcmRCaWdyYW0oaW50ICp3b3JkLCBpbnQgbGVuZ3RoLCBpbnQgcHJvYmFiaWxpdHksIGludCAqYmlncmFtUHJvYmFiaWxpdHksCisgICAgICAgICAgICBpbnQgKmJpZ3JhbUNvZGVQb2ludHMsIGludCAqb3V0cHV0VHlwZXMpIGNvbnN0OwogICAgIGJvb2wgY2hlY2tGaXJzdENoYXJhY3RlcihpbnQgKndvcmQsIGludCAqaW5wdXRDb2RlUG9pbnRzKSBjb25zdDsKICAgICBpbnQgZ2V0QmlncmFtTGlzdFBvc2l0aW9uRm9yV29yZChjb25zdCBpbnQgKnByZXZXb3JkLCBjb25zdCBpbnQgcHJldldvcmRMZW5ndGgsCiAgICAgICAgICAgICBjb25zdCBib29sIGZvcmNlTG93ZXJDYXNlU2VhcmNoKSBjb25zdDsKZGlmZiAtLWdpdCBhL25hdGl2ZS9qbmkvc3JjL2JpbmFyeV9mb3JtYXQuaCBiL25hdGl2ZS9qbmkvc3JjL2JpbmFyeV9mb3JtYXQuaAppbmRleCAyZDdjNGI0Li4xYzQwNjFmIDEwMDY0NAotLS0gYS9uYXRpdmUvam5pL3NyYy9iaW5hcnlfZm9ybWF0LmgKKysrIGIvbmF0aXZlL2puaS9zcmMvYmluYXJ5X2Zvcm1hdC5oCkBAIC01MiwxMCArNTIsMTAgQEAKICAgICAvLyBGbGFnIGZvciBzaWduIG9mIG9mZnNldC4gSWYgdGhpcyBmbGFnIGlzIHNldCwgdGhlIG9mZnNldCB2YWx1ZSBtdXN0IGJlIG5lZ2F0ZWQuCiAgICAgc3RhdGljIGNvbnN0IGludCBGTEFHX0FUVFJJQlVURV9PRkZTRVRfTkVHQVRJVkUgPSAweDQwOwogCi0gICAgLy8gTWFzayBmb3IgYXR0cmlidXRlIGZyZXF1ZW5jeSwgc3RvcmVkIG9uIDQgYml0cyBpbnNpZGUgdGhlIGZsYWdzIGJ5dGUuCi0gICAgc3RhdGljIGNvbnN0IGludCBNQVNLX0FUVFJJQlVURV9GUkVRVUVOQ1kgPSAweDBGOwotICAgIC8vIFRoZSBudW1lcmljIHZhbHVlIG9mIHRoZSBzaG9ydGN1dCBmcmVxdWVuY3kgdGhhdCBtZWFucyAnd2hpdGVsaXN0Jy4KLSAgICBzdGF0aWMgY29uc3QgaW50IFdISVRFTElTVF9TSE9SVENVVF9GUkVRVUVOQ1kgPSAxNTsKKyAgICAvLyBNYXNrIGZvciBhdHRyaWJ1dGUgcHJvYmFiaWxpdHksIHN0b3JlZCBvbiA0IGJpdHMgaW5zaWRlIHRoZSBmbGFncyBieXRlLgorICAgIHN0YXRpYyBjb25zdCBpbnQgTUFTS19BVFRSSUJVVEVfUFJPQkFCSUxJVFkgPSAweDBGOworICAgIC8vIFRoZSBudW1lcmljIHZhbHVlIG9mIHRoZSBzaG9ydGN1dCBwcm9iYWJpbGl0eSB0aGF0IG1lYW5zICd3aGl0ZWxpc3QnLgorICAgIHN0YXRpYyBjb25zdCBpbnQgV0hJVEVMSVNUX1NIT1JUQ1VUX1BST0JBQklMSVRZID0gMTU7CiAKICAgICAvLyBNYXNrIGFuZCBmbGFncyBmb3IgYXR0cmlidXRlIGFkZHJlc3MgdHlwZSBzZWxlY3Rpb24uCiAgICAgc3RhdGljIGNvbnN0IGludCBNQVNLX0FUVFJJQlVURV9BRERSRVNTX1RZUEUgPSAweDMwOwpAQCAtNzIsMTAgKzcyLDEwIEBACiAgICAgc3RhdGljIGludCBnZXRHcm91cENvdW50QW5kRm9yd2FyZFBvaW50ZXIoY29uc3QgdWludDhfdCAqY29uc3QgZGljdCwgaW50ICpwb3MpOwogICAgIHN0YXRpYyB1aW50OF90IGdldEZsYWdzQW5kRm9yd2FyZFBvaW50ZXIoY29uc3QgdWludDhfdCAqY29uc3QgZGljdCwgaW50ICpwb3MpOwogICAgIHN0YXRpYyBpbnQgZ2V0Q29kZVBvaW50QW5kRm9yd2FyZFBvaW50ZXIoY29uc3QgdWludDhfdCAqY29uc3QgZGljdCwgaW50ICpwb3MpOwotICAgIHN0YXRpYyBpbnQgcmVhZEZyZXF1ZW5jeVdpdGhvdXRNb3ZpbmdQb2ludGVyKGNvbnN0IHVpbnQ4X3QgKmNvbnN0IGRpY3QsIGNvbnN0IGludCBwb3MpOworICAgIHN0YXRpYyBpbnQgcmVhZFByb2JhYmlsaXR5V2l0aG91dE1vdmluZ1BvaW50ZXIoY29uc3QgdWludDhfdCAqY29uc3QgZGljdCwgY29uc3QgaW50IHBvcyk7CiAgICAgc3RhdGljIGludCBza2lwT3RoZXJDaGFyYWN0ZXJzKGNvbnN0IHVpbnQ4X3QgKmNvbnN0IGRpY3QsIGNvbnN0IGludCBwb3MpOwogICAgIHN0YXRpYyBpbnQgc2tpcENoaWxkcmVuUG9zaXRpb24oY29uc3QgdWludDhfdCBmbGFncywgY29uc3QgaW50IHBvcyk7Ci0gICAgc3RhdGljIGludCBza2lwRnJlcXVlbmN5KGNvbnN0IHVpbnQ4X3QgZmxhZ3MsIGNvbnN0IGludCBwb3MpOworICAgIHN0YXRpYyBpbnQgc2tpcFByb2JhYmlsaXR5KGNvbnN0IHVpbnQ4X3QgZmxhZ3MsIGNvbnN0IGludCBwb3MpOwogICAgIHN0YXRpYyBpbnQgc2tpcFNob3J0Y3V0cyhjb25zdCB1aW50OF90ICpjb25zdCBkaWN0LCBjb25zdCB1aW50OF90IGZsYWdzLCBjb25zdCBpbnQgcG9zKTsKICAgICBzdGF0aWMgaW50IHNraXBDaGlsZHJlblBvc0FuZEF0dHJpYnV0ZXMoY29uc3QgdWludDhfdCAqY29uc3QgZGljdCwgY29uc3QgdWludDhfdCBmbGFncywKICAgICAgICAgICAgIGNvbnN0IGludCBwb3MpOwpAQCAtODMsMTQgKzgzLDE1IEBACiAgICAgc3RhdGljIGJvb2wgaGFzQ2hpbGRyZW5JbkZsYWdzKGNvbnN0IHVpbnQ4X3QgZmxhZ3MpOwogICAgIHN0YXRpYyBpbnQgZ2V0QXR0cmlidXRlQWRkcmVzc0FuZEZvcndhcmRQb2ludGVyKGNvbnN0IHVpbnQ4X3QgKmNvbnN0IGRpY3QsIGNvbnN0IHVpbnQ4X3QgZmxhZ3MsCiAgICAgICAgICAgICBpbnQgKnBvcyk7Ci0gICAgc3RhdGljIGludCBnZXRBdHRyaWJ1dGVGcmVxdWVuY3lGcm9tRmxhZ3MoY29uc3QgaW50IGZsYWdzKTsKKyAgICBzdGF0aWMgaW50IGdldEF0dHJpYnV0ZVByb2JhYmlsaXR5RnJvbUZsYWdzKGNvbnN0IGludCBmbGFncyk7CiAgICAgc3RhdGljIGludCBnZXRUZXJtaW5hbFBvc2l0aW9uKGNvbnN0IHVpbnQ4X3QgKmNvbnN0IHJvb3QsIGNvbnN0IGludCAqY29uc3QgaW5Xb3JkLAogICAgICAgICAgICAgY29uc3QgaW50IGxlbmd0aCwgY29uc3QgYm9vbCBmb3JjZUxvd2VyQ2FzZVNlYXJjaCk7CiAgICAgc3RhdGljIGludCBnZXRXb3JkQXRBZGRyZXNzKGNvbnN0IHVpbnQ4X3QgKmNvbnN0IHJvb3QsIGNvbnN0IGludCBhZGRyZXNzLCBjb25zdCBpbnQgbWF4RGVwdGgsCi0gICAgICAgICAgICBpbnQgKm91dFdvcmQsIGludCAqb3V0VW5pZ3JhbUZyZXF1ZW5jeSk7Ci0gICAgc3RhdGljIGludCBjb21wdXRlRnJlcXVlbmN5Rm9yQmlncmFtKGNvbnN0IGludCB1bmlncmFtRnJlcSwgY29uc3QgaW50IGJpZ3JhbUZyZXEpOworICAgICAgICAgICAgaW50ICpvdXRXb3JkLCBpbnQgKm91dFVuaWdyYW1Qcm9iYWJpbGl0eSk7CisgICAgc3RhdGljIGludCBjb21wdXRlUHJvYmFiaWxpdHlGb3JCaWdyYW0oCisgICAgICAgICAgICBjb25zdCBpbnQgdW5pZ3JhbVByb2JhYmlsaXR5LCBjb25zdCBpbnQgYmlncmFtUHJvYmFiaWxpdHkpOwogICAgIHN0YXRpYyBpbnQgZ2V0UHJvYmFiaWxpdHkoY29uc3QgaW50IHBvc2l0aW9uLCBjb25zdCBzdGQ6Om1hcDxpbnQsIGludD4gKmJpZ3JhbU1hcCwKLSAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJpZ3JhbUZpbHRlciwgY29uc3QgaW50IHVuaWdyYW1GcmVxKTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJpZ3JhbUZpbHRlciwgY29uc3QgaW50IHVuaWdyYW1Qcm9iYWJpbGl0eSk7CiAKICAgICAvLyBGbGFncyBmb3Igc3BlY2lhbCBwcm9jZXNzaW5nCiAgICAgLy8gVGhvc2UgKm11c3QqIG1hdGNoIHRoZSBmbGFncyBpbiBtYWtlZGljdCAoQmluYXJ5RGljdElucHV0T3V0cHV0IypfUFJPQ0VTU0lOR19GTEFHKSBvcgpAQCAtMjY0LDcgKzI2NSw3IEBACiAgICAgfQogfQogCi1pbmxpbmUgaW50IEJpbmFyeUZvcm1hdDo6cmVhZEZyZXF1ZW5jeVdpdGhvdXRNb3ZpbmdQb2ludGVyKGNvbnN0IHVpbnQ4X3QgKmNvbnN0IGRpY3QsCitpbmxpbmUgaW50IEJpbmFyeUZvcm1hdDo6cmVhZFByb2JhYmlsaXR5V2l0aG91dE1vdmluZ1BvaW50ZXIoY29uc3QgdWludDhfdCAqY29uc3QgZGljdCwKICAgICAgICAgY29uc3QgaW50IHBvcykgewogICAgIHJldHVybiBkaWN0W3Bvc107CiB9CkBAIC0zMjAsNyArMzIxLDcgQEAKICAgICByZXR1cm4gcG9zICsgY2hpbGRyZW5BZGRyZXNzU2l6ZShmbGFncyk7CiB9CiAKLWlubGluZSBpbnQgQmluYXJ5Rm9ybWF0Ojpza2lwRnJlcXVlbmN5KGNvbnN0IHVpbnQ4X3QgZmxhZ3MsIGNvbnN0IGludCBwb3MpIHsKK2lubGluZSBpbnQgQmluYXJ5Rm9ybWF0Ojpza2lwUHJvYmFiaWxpdHkoY29uc3QgdWludDhfdCBmbGFncywgY29uc3QgaW50IHBvcykgewogICAgIHJldHVybiBGTEFHX0lTX1RFUk1JTkFMICYgZmxhZ3MgPyBwb3MgKyAxIDogcG9zOwogfQogCkBAIC00MTUsOCArNDE2LDggQEAKICAgICB9CiB9CiAKLWlubGluZSBpbnQgQmluYXJ5Rm9ybWF0OjpnZXRBdHRyaWJ1dGVGcmVxdWVuY3lGcm9tRmxhZ3MoY29uc3QgaW50IGZsYWdzKSB7Ci0gICAgcmV0dXJuIGZsYWdzICYgTUFTS19BVFRSSUJVVEVfRlJFUVVFTkNZOworaW5saW5lIGludCBCaW5hcnlGb3JtYXQ6OmdldEF0dHJpYnV0ZVByb2JhYmlsaXR5RnJvbUZsYWdzKGNvbnN0IGludCBmbGFncykgeworICAgIHJldHVybiBmbGFncyAmIE1BU0tfQVRUUklCVVRFX1BST0JBQklMSVRZOwogfQogCiAvLyBUaGlzIGZ1bmN0aW9uIGdldHMgdGhlIGJ5dGUgcG9zaXRpb24gb2YgdGhlIGxhc3QgY2hhcmdyb3VwIG9mIHRoZSBleGFjdCBtYXRjaGluZyB3b3JkIGluIHRoZQpAQCAtNDY2LDcgKzQ2Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgIGlmICh3b3JkUG9zID09IGxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoYXJHcm91cFBvczsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwb3MgPSBCaW5hcnlGb3JtYXQ6OnNraXBGcmVxdWVuY3koRkxBR19JU19URVJNSU5BTCwgcG9zKTsKKyAgICAgICAgICAgICAgICAgICAgcG9zID0gQmluYXJ5Rm9ybWF0Ojpza2lwUHJvYmFiaWxpdHkoRkxBR19JU19URVJNSU5BTCwgcG9zKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKEZMQUdfR1JPVVBfQUREUkVTU19UWVBFX05PQUREUkVTUyA9PSAoTUFTS19HUk9VUF9BRERSRVNTX1RZUEUgJiBmbGFncykpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9WQUxJRF9XT1JEOwpAQCAtNDgxLDcgKzQ4Miw3IEBACiAgICAgICAgICAgICAgICAgaWYgKEZMQUdfSEFTX01VTFRJUExFX0NIQVJTICYgZmxhZ3MpIHsKICAgICAgICAgICAgICAgICAgICAgcG9zID0gQmluYXJ5Rm9ybWF0Ojpza2lwT3RoZXJDaGFyYWN0ZXJzKHJvb3QsIHBvcyk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBvcyA9IEJpbmFyeUZvcm1hdDo6c2tpcEZyZXF1ZW5jeShmbGFncywgcG9zKTsKKyAgICAgICAgICAgICAgICBwb3MgPSBCaW5hcnlGb3JtYXQ6OnNraXBQcm9iYWJpbGl0eShmbGFncywgcG9zKTsKICAgICAgICAgICAgICAgICBwb3MgPSBCaW5hcnlGb3JtYXQ6OnNraXBDaGlsZHJlblBvc0FuZEF0dHJpYnV0ZXMocm9vdCwgZmxhZ3MsIHBvcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAtLWNoYXJHcm91cENvdW50OwpAQCAtNTA0LDExICs1MDUsMTEgQEAKICAqIGFkZHJlc3M6IHRoZSBieXRlIHBvc2l0aW9uIG9mIHRoZSBsYXN0IGNoYXJncm91cCBvZiB0aGUgd29yZCB3ZSBhcmUgc2VhcmNoaW5nIGZvciAodGhpcyBpcwogICogICB3aGF0IGlzIHN0b3JlZCBhcyB0aGUgImJpZ3JhbSBhZGRyZXNzIiBpbiBlYWNoIGJpZ3JhbSkKICAqIG91dHdvcmQ6IGFuIGFycmF5IHRvIHdyaXRlIHRoZSBmb3VuZCB3b3JkLCB3aXRoIE1BWF9XT1JEX0xFTkdUSCBzaXplLgotICogb3V0VW5pZ3JhbUZyZXF1ZW5jeTogYSBwb2ludGVyIHRvIGFuIGludCB0byB3cml0ZSB0aGUgZnJlcXVlbmN5IGludG8uCisgKiBvdXRVbmlncmFtUHJvYmFiaWxpdHk6IGEgcG9pbnRlciB0byBhbiBpbnQgdG8gd3JpdGUgdGhlIHByb2JhYmlsaXR5IGludG8uCiAgKiBSZXR1cm4gdmFsdWUgOiB0aGUgbGVuZ3RoIG9mIHRoZSB3b3JkLCBvZiAwIGlmIHRoZSB3b3JkIHdhcyBub3QgZm91bmQuCiAgKi8KIEFLX0ZPUkNFX0lOTElORSBpbnQgQmluYXJ5Rm9ybWF0OjpnZXRXb3JkQXRBZGRyZXNzKGNvbnN0IHVpbnQ4X3QgKmNvbnN0IHJvb3QsIGNvbnN0IGludCBhZGRyZXNzLAotICAgICAgICBjb25zdCBpbnQgbWF4RGVwdGgsIGludCAqb3V0V29yZCwgaW50ICpvdXRVbmlncmFtRnJlcXVlbmN5KSB7CisgICAgICAgIGNvbnN0IGludCBtYXhEZXB0aCwgaW50ICpvdXRXb3JkLCBpbnQgKm91dFVuaWdyYW1Qcm9iYWJpbGl0eSkgewogICAgIGludCBwb3MgPSAwOwogICAgIGludCB3b3JkUG9zID0gMDsKIApAQCAtNTQxLDE1ICs1NDIsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRDaGFyID0gZ2V0Q29kZVBvaW50QW5kRm9yd2FyZFBvaW50ZXIocm9vdCwgJnBvcyk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKm91dFVuaWdyYW1GcmVxdWVuY3kgPSByZWFkRnJlcXVlbmN5V2l0aG91dE1vdmluZ1BvaW50ZXIocm9vdCwgcG9zKTsKKyAgICAgICAgICAgICAgICAqb3V0VW5pZ3JhbVByb2JhYmlsaXR5ID0gcmVhZFByb2JhYmlsaXR5V2l0aG91dE1vdmluZ1BvaW50ZXIocm9vdCwgcG9zKTsKICAgICAgICAgICAgICAgICByZXR1cm4gKyt3b3JkUG9zOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBza2lwIHBhc3QgdGhpcyBjaGFyIGdyb3VwLCBzbyBza2lwIGFueSByZW1haW5pbmcgY2hhcnMgYWZ0ZXIgdGhlCi0gICAgICAgICAgICAvLyBmaXJzdCBhbmQgcG9zc2libHkgdGhlIGZyZXF1ZW5jeS4KKyAgICAgICAgICAgIC8vIGZpcnN0IGFuZCBwb3NzaWJseSB0aGUgcHJvYmFiaWxpdHkuCiAgICAgICAgICAgICBpZiAoRkxBR19IQVNfTVVMVElQTEVfQ0hBUlMgJiBmbGFncykgewogICAgICAgICAgICAgICAgIHBvcyA9IHNraXBPdGhlckNoYXJhY3RlcnMocm9vdCwgcG9zKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBvcyA9IHNraXBGcmVxdWVuY3koZmxhZ3MsIHBvcyk7CisgICAgICAgICAgICBwb3MgPSBza2lwUHJvYmFiaWxpdHkoZmxhZ3MsIHBvcyk7CiAKICAgICAgICAgICAgIC8vIFRoZSBmYWN0IHRoYXQgdGhpcyBncm91cCBoYXMgY2hpbGRyZW4gaXMgdmVyeSBpbXBvcnRhbnQuIFNpbmNlIHdlIGFscmVhZHkga25vdwogICAgICAgICAgICAgLy8gdGhhdCB0aGlzIGdyb3VwIGRvZXMgbm90IG1hdGNoLCBpZiBpdCBoYXMgbm8gY2hpbGRyZW4gd2Uga25vdyBpdCBpcyBpcnJlbGV2YW50CkBAIC02MDQsOSArNjA1LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICArK3dvcmRQb3M7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE5vdyB3ZSBvbmx5IG5lZWQgdG8gYnJhbmNoIHRvIHRoZSBjaGlsZHJlbiBhZGRyZXNzLiBTa2lwIHRoZSBmcmVxdWVuY3kgaWYKKyAgICAgICAgICAgICAgICAgICAgLy8gTm93IHdlIG9ubHkgbmVlZCB0byBicmFuY2ggdG8gdGhlIGNoaWxkcmVuIGFkZHJlc3MuIFNraXAgdGhlIHByb2JhYmlsaXR5IGlmCiAgICAgICAgICAgICAgICAgICAgIC8vIGl0J3MgdGhlcmUsIHJlYWQgcG9zLCBhbmQgYnJlYWsgdG8gcmVzdW1lIHRoZSBzZWFyY2ggYXQgcG9zLgotICAgICAgICAgICAgICAgICAgICBsYXN0Q2FuZGlkYXRlR3JvdXBQb3MgPSBza2lwRnJlcXVlbmN5KGxhc3RGbGFncywgbGFzdENhbmRpZGF0ZUdyb3VwUG9zKTsKKyAgICAgICAgICAgICAgICAgICAgbGFzdENhbmRpZGF0ZUdyb3VwUG9zID0gc2tpcFByb2JhYmlsaXR5KGxhc3RGbGFncywgbGFzdENhbmRpZGF0ZUdyb3VwUG9zKTsKICAgICAgICAgICAgICAgICAgICAgcG9zID0gcmVhZENoaWxkcmVuUG9zaXRpb24ocm9vdCwgbGFzdEZsYWdzLCBsYXN0Q2FuZGlkYXRlR3JvdXBQb3MpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNjM1LDM2ICs2MzYsMzkgQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgYmFja29mZihjb25zdCBpbnQgdW5pZ3JhbUZyZXEpIHsKLSAgICByZXR1cm4gdW5pZ3JhbUZyZXE7CitzdGF0aWMgaW5saW5lIGludCBiYWNrb2ZmKGNvbnN0IGludCB1bmlncmFtUHJvYmFiaWxpdHkpIHsKKyAgICByZXR1cm4gdW5pZ3JhbVByb2JhYmlsaXR5OwogICAgIC8vIEZvciBzb21lIHJlYXNvbiwgYXBwbHlpbmcgdGhlIGJhY2tvZmYgd2VpZ2h0IGdpdmVzIGJhZCByZXN1bHRzIGluIHRlc3RzLiBUbyBhcHBseSB0aGUKICAgICAvLyBiYWNrb2ZmIHdlaWdodCwgd2UgZGl2aWRlIHRoZSBwcm9iYWJpbGl0eSBieSAyLCB3aGljaCBpbiBvdXIgc3RvcmluZyBmb3JtYXQgbWVhbnMKICAgICAvLyBkZWNyZWFzaW5nIHRoZSBzY29yZSBieSA4LgogICAgIC8vIFRPRE86IGZpZ3VyZSBvdXQgd2hhdCdzIHdyb25nIHdpdGggdGhpcy4KLSAgICAvLyByZXR1cm4gdW5pZ3JhbUZyZXEgPiA4ID8gdW5pZ3JhbUZyZXEgLSA4IDogKDAgPT0gdW5pZ3JhbUZyZXEgPyAwIDogOCk7CisgICAgLy8gcmV0dXJuIHVuaWdyYW1Qcm9iYWJpbGl0eSA+IDggPyB1bmlncmFtUHJvYmFiaWxpdHkgLSA4IDogKDAgPT0gdW5pZ3JhbVByb2JhYmlsaXR5ID8gMCA6IDgpOwogfQogCi1pbmxpbmUgaW50IEJpbmFyeUZvcm1hdDo6Y29tcHV0ZUZyZXF1ZW5jeUZvckJpZ3JhbShjb25zdCBpbnQgdW5pZ3JhbUZyZXEsIGNvbnN0IGludCBiaWdyYW1GcmVxKSB7Ci0gICAgLy8gV2UgZGl2aWRlIHRoZSByYW5nZSBbdW5pZ3JhbUZyZXEuLjI1NV0gaW4gMTYuNSBzdGVwcyAtIGluIG90aGVyIHdvcmRzLCB3ZSB3YW50IHRoZQotICAgIC8vIHVuaWdyYW0gZnJlcXVlbmN5IHRvIGJlIHRoZSBtZWRpYW4gdmFsdWUgb2YgdGhlIDE3dGggc3RlcCBmcm9tIHRoZSB0b3AuIEEgdmFsdWUgb2YKLSAgICAvLyAwIGZvciB0aGUgYmlncmFtIGZyZXF1ZW5jeSByZXByZXNlbnRzIHRoZSBtaWRkbGUgb2YgdGhlIDE2dGggc3RlcCBmcm9tIHRoZSB0b3AsCitpbmxpbmUgaW50IEJpbmFyeUZvcm1hdDo6Y29tcHV0ZVByb2JhYmlsaXR5Rm9yQmlncmFtKAorICAgICAgICBjb25zdCBpbnQgdW5pZ3JhbVByb2JhYmlsaXR5LCBjb25zdCBpbnQgYmlncmFtUHJvYmFiaWxpdHkpIHsKKyAgICAvLyBXZSBkaXZpZGUgdGhlIHJhbmdlIFt1bmlncmFtUHJvYmFiaWxpdHkuLjI1NV0gaW4gMTYuNSBzdGVwcyAtIGluIG90aGVyIHdvcmRzLCB3ZSB3YW50IHRoZQorICAgIC8vIHVuaWdyYW0gcHJvYmFiaWxpdHkgdG8gYmUgdGhlIG1lZGlhbiB2YWx1ZSBvZiB0aGUgMTd0aCBzdGVwIGZyb20gdGhlIHRvcC4gQSB2YWx1ZSBvZgorICAgIC8vIDAgZm9yIHRoZSBiaWdyYW0gcHJvYmFiaWxpdHkgcmVwcmVzZW50cyB0aGUgbWlkZGxlIG9mIHRoZSAxNnRoIHN0ZXAgZnJvbSB0aGUgdG9wLAogICAgIC8vIHdoaWxlIGEgdmFsdWUgb2YgMTUgcmVwcmVzZW50cyB0aGUgbWlkZGxlIG9mIHRoZSB0b3Agc3RlcC4KICAgICAvLyBTZWUgbWFrZWRpY3QuQmluYXJ5RGljdElucHV0T3V0cHV0IGZvciBkZXRhaWxzLgotICAgIGNvbnN0IGZsb2F0IHN0ZXBTaXplID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KE1BWF9GUkVRIC0gdW5pZ3JhbUZyZXEpIC8gKDEuNWYgKyBNQVhfQklHUkFNX0ZSRVEpOwotICAgIHJldHVybiB1bmlncmFtRnJlcSArIHN0YXRpY19jYXN0PGludD4oc3RhdGljX2Nhc3Q8ZmxvYXQ+KGJpZ3JhbUZyZXEgKyAxKSAqIHN0ZXBTaXplKTsKKyAgICBjb25zdCBmbG9hdCBzdGVwU2l6ZSA9IHN0YXRpY19jYXN0PGZsb2F0PihNQVhfUFJPQkFCSUxJVFkgLSB1bmlncmFtUHJvYmFiaWxpdHkpCisgICAgICAgICAgICAvICgxLjVmICsgTUFYX0JJR1JBTV9FTkNPREVEX1BST0JBQklMSVRZKTsKKyAgICByZXR1cm4gdW5pZ3JhbVByb2JhYmlsaXR5CisgICAgICAgICAgICArIHN0YXRpY19jYXN0PGludD4oc3RhdGljX2Nhc3Q8ZmxvYXQ+KGJpZ3JhbVByb2JhYmlsaXR5ICsgMSkgKiBzdGVwU2l6ZSk7CiB9CiAKIC8vIFRoaXMgcmV0dXJucyBhIHByb2JhYmlsaXR5IGluIGxvZyBzcGFjZS4KIGlubGluZSBpbnQgQmluYXJ5Rm9ybWF0OjpnZXRQcm9iYWJpbGl0eShjb25zdCBpbnQgcG9zaXRpb24sIGNvbnN0IHN0ZDo6bWFwPGludCwgaW50PiAqYmlncmFtTWFwLAotICAgICAgICBjb25zdCB1aW50OF90ICpiaWdyYW1GaWx0ZXIsIGNvbnN0IGludCB1bmlncmFtRnJlcSkgewotICAgIGlmICghYmlncmFtTWFwIHx8ICFiaWdyYW1GaWx0ZXIpIHJldHVybiBiYWNrb2ZmKHVuaWdyYW1GcmVxKTsKLSAgICBpZiAoIWlzSW5GaWx0ZXIoYmlncmFtRmlsdGVyLCBwb3NpdGlvbikpIHJldHVybiBiYWNrb2ZmKHVuaWdyYW1GcmVxKTsKLSAgICBjb25zdCBzdGQ6Om1hcDxpbnQsIGludD46OmNvbnN0X2l0ZXJhdG9yIGJpZ3JhbUZyZXFJdCA9IGJpZ3JhbU1hcC0+ZmluZChwb3NpdGlvbik7Ci0gICAgaWYgKGJpZ3JhbUZyZXFJdCAhPSBiaWdyYW1NYXAtPmVuZCgpKSB7Ci0gICAgICAgIGNvbnN0IGludCBiaWdyYW1GcmVxID0gYmlncmFtRnJlcUl0LT5zZWNvbmQ7Ci0gICAgICAgIHJldHVybiBjb21wdXRlRnJlcXVlbmN5Rm9yQmlncmFtKHVuaWdyYW1GcmVxLCBiaWdyYW1GcmVxKTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqYmlncmFtRmlsdGVyLCBjb25zdCBpbnQgdW5pZ3JhbVByb2JhYmlsaXR5KSB7CisgICAgaWYgKCFiaWdyYW1NYXAgfHwgIWJpZ3JhbUZpbHRlcikgcmV0dXJuIGJhY2tvZmYodW5pZ3JhbVByb2JhYmlsaXR5KTsKKyAgICBpZiAoIWlzSW5GaWx0ZXIoYmlncmFtRmlsdGVyLCBwb3NpdGlvbikpIHJldHVybiBiYWNrb2ZmKHVuaWdyYW1Qcm9iYWJpbGl0eSk7CisgICAgY29uc3Qgc3RkOjptYXA8aW50LCBpbnQ+Ojpjb25zdF9pdGVyYXRvciBiaWdyYW1Qcm9iYWJpbGl0eUl0ID0gYmlncmFtTWFwLT5maW5kKHBvc2l0aW9uKTsKKyAgICBpZiAoYmlncmFtUHJvYmFiaWxpdHlJdCAhPSBiaWdyYW1NYXAtPmVuZCgpKSB7CisgICAgICAgIGNvbnN0IGludCBiaWdyYW1Qcm9iYWJpbGl0eSA9IGJpZ3JhbVByb2JhYmlsaXR5SXQtPnNlY29uZDsKKyAgICAgICAgcmV0dXJuIGNvbXB1dGVQcm9iYWJpbGl0eUZvckJpZ3JhbSh1bmlncmFtUHJvYmFiaWxpdHksIGJpZ3JhbVByb2JhYmlsaXR5KTsKICAgICB9Ci0gICAgcmV0dXJuIGJhY2tvZmYodW5pZ3JhbUZyZXEpOworICAgIHJldHVybiBiYWNrb2ZmKHVuaWdyYW1Qcm9iYWJpbGl0eSk7CiB9CiB9IC8vIG5hbWVzcGFjZSBsYXRpbmltZQogI2VuZGlmIC8vIExBVElOSU1FX0JJTkFSWV9GT1JNQVRfSApkaWZmIC0tZ2l0IGEvbmF0aXZlL2puaS9zcmMvY2hhcl91dGlscy5oIGIvbmF0aXZlL2puaS9zcmMvY2hhcl91dGlscy5oCmluZGV4IDdhNDM4NGQuLjU4ZDM4OGQgMTAwNjQ0Ci0tLSBhL25hdGl2ZS9qbmkvc3JjL2NoYXJfdXRpbHMuaAorKysgYi9uYXRpdmUvam5pL3NyYy9jaGFyX3V0aWxzLmgKQEAgLTY4LDcgKzY4LDcgQEAKICAgICByZXR1cm4gdG9Mb3dlckNhc2UodG9CYXNlQ29kZVBvaW50KGMpKTsKIH0KIAotaW5saW5lIHN0YXRpYyBib29sIGlzU2tpcHBhYmxlQ29kZVBvaW50KGNvbnN0IGludCBjb2RlUG9pbnQpIHsKK2lubGluZSBzdGF0aWMgYm9vbCBpc0ludGVudGlvbmFsT21pc3Npb25Db2RlUG9pbnQoY29uc3QgaW50IGNvZGVQb2ludCkgewogICAgIC8vIFRPRE86IERvIG5vdCBoYXJkY29kZSBoZXJlCiAgICAgcmV0dXJuIGNvZGVQb2ludCA9PSBLRVlDT0RFX1NJTkdMRV9RVU9URSB8fCBjb2RlUG9pbnQgPT0gS0VZQ09ERV9IWVBIRU5fTUlOVVM7CiB9CmRpZmYgLS1naXQgYS9uYXRpdmUvam5pL3NyYy9jb3JyZWN0aW9uLmNwcCBiL25hdGl2ZS9qbmkvc3JjL2NvcnJlY3Rpb24uY3BwCmluZGV4IDBhZTAyZDUuLjY3MTUwN2UgMTAwNjQ0Ci0tLSBhL25hdGl2ZS9qbmkvc3JjL2NvcnJlY3Rpb24uY3BwCisrKyBiL25hdGl2ZS9qbmkvc3JjL2NvcnJlY3Rpb24uY3BwCkBAIC04NDEsNyArODQxLDcgQEAKICAgICAgICAgICAgIGNvbnN0IGludCBmcmVxID0gZnJlcUFycmF5W2ldOwogICAgICAgICAgICAgLy8gRGVtb3RlIHRvbyBzaG9ydCB3ZWFrIHdvcmRzCiAgICAgICAgICAgICBpZiAod29yZExlbmd0aCA8PSA0ICYmIGZyZXEgPD0gU1VQUFJFU1NfU0hPUlRfTVVMVElQTEVfV09SRFNfVEhSRVNIT0xEX0ZSRVEpIHsKLSAgICAgICAgICAgICAgICBtdWx0aXBseVJhdGUoMTAwICogZnJlcSAvIE1BWF9GUkVRLCAmdG90YWxGcmVxKTsKKyAgICAgICAgICAgICAgICBtdWx0aXBseVJhdGUoMTAwICogZnJlcSAvIE1BWF9QUk9CQUJJTElUWSwgJnRvdGFsRnJlcSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAod29yZExlbmd0aCA9PSAxKSB7CiAgICAgICAgICAgICAgICAgKytvbmVMZW5ndGhDb3VudGVyOwpkaWZmIC0tZ2l0IGEvbmF0aXZlL2puaS9zcmMvZGVmaW5lcy5oIGIvbmF0aXZlL2puaS9zcmMvZGVmaW5lcy5oCmluZGV4IDBhZWRjMjguLjZlMDk4MTUgMTAwNjQ0Ci0tLSBhL25hdGl2ZS9qbmkvc3JjL2RlZmluZXMuaAorKysgYi9uYXRpdmUvam5pL3NyYy9kZWZpbmVzLmgKQEAgLTcyLDExICs3MiwxMSBAQAogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgZHVtcFdvcmRJbmZvKGNvbnN0IGludCAqd29yZCwgY29uc3QgaW50IGxlbmd0aCwgY29uc3QgaW50IHJhbmssCi0gICAgICAgIGNvbnN0IGludCBmcmVxdWVuY3kpIHsKKyAgICAgICAgY29uc3QgaW50IHByb2JhYmlsaXR5KSB7CiAgICAgc3RhdGljIGNoYXIgY2hhckJ1Zls1MF07CiAgICAgY29uc3QgaW50IE4gPSBpbnRBcnJheVRvQ2hhckFycmF5KHdvcmQsIGxlbmd0aCwgY2hhckJ1Zik7CiAgICAgaWYgKE4gPiAxKSB7Ci0gICAgICAgIEFLTE9HSSgiJTJkIFsgJXMgXSAoJWQpIiwgcmFuaywgY2hhckJ1ZiwgZnJlcXVlbmN5KTsKKyAgICAgICAgQUtMT0dJKCIlMmQgWyAlcyBdICglZCkiLCByYW5rLCBjaGFyQnVmLCBwcm9iYWJpbGl0eSk7CiAgICAgfQogfQogCkBAIC0zMTIsOCArMzEyLDggQEAKICNkZWZpbmUgWkVST19ESVNUQU5DRV9QUk9NT1RJT05fUkFURSAxMTAuMGYKICNkZWZpbmUgTkVVVFJBTF9TQ09SRV9TUVVBUkVEX1JBRElVUyA4LjBmCiAjZGVmaW5lIEhBTEZfU0NPUkVfU1FVQVJFRF9SQURJVVMgMzIuMGYKLSNkZWZpbmUgTUFYX0ZSRVEgMjU1Ci0jZGVmaW5lIE1BWF9CSUdSQU1fRlJFUSAxNQorI2RlZmluZSBNQVhfUFJPQkFCSUxJVFkgMjU1CisjZGVmaW5lIE1BWF9CSUdSQU1fRU5DT0RFRF9QUk9CQUJJTElUWSAxNQogCiAvLyBBc3N1bWluZyBsb2NhbGUgc3RyaW5ncyBzdWNoIGFzIGVuX1VTLCBzci1MYXRuIGV0Yy4KICNkZWZpbmUgTUFYX0xPQ0FMRV9TVFJJTkdfTEVOR1RIIDEwCkBAIC0zMzUsOCArMzM1LDggQEAKIAogI2RlZmluZSBUV09fV09SRFNfQ09SUkVDVElPTl9XSVRIX09USEVSX0VSUk9SX1RIUkVTSE9MRCAwLjM1ZgogI2RlZmluZSBTVEFSVF9UV09fV09SRFNfQ09SUkVDVElPTl9USFJFU0hPTEQgMC4xODVmCi0vKiBoZXVyaXN0aWMuLi4gVGhpcyBzaG91bGQgYmUgY2hhbmdlZCBpZiB3ZSBjaGFuZ2UgdGhlIHVuaXQgb2YgdGhlIGZyZXF1ZW5jeS4gKi8KLSNkZWZpbmUgU1VQUFJFU1NfU0hPUlRfTVVMVElQTEVfV09SRFNfVEhSRVNIT0xEX0ZSRVEgKE1BWF9GUkVRICogNTggLyAxMDApCisvKiBoZXVyaXN0aWMuLi4gVGhpcyBzaG91bGQgYmUgY2hhbmdlZCBpZiB3ZSBjaGFuZ2UgdGhlIHVuaXQgb2YgdGhlIHByb2JhYmlsaXR5LiAqLworI2RlZmluZSBTVVBQUkVTU19TSE9SVF9NVUxUSVBMRV9XT1JEU19USFJFU0hPTERfRlJFUSAoTUFYX1BST0JBQklMSVRZICogNTggLyAxMDApCiAKICNkZWZpbmUgTUFYX0RFUFRIX01VTFRJUExJRVIgMwogI2RlZmluZSBGSVJTVF9XT1JEX0lOREVYIDAKZGlmZiAtLWdpdCBhL25hdGl2ZS9qbmkvc3JjL2RpY3Rpb25hcnkuY3BwIGIvbmF0aXZlL2puaS9zcmMvZGljdGlvbmFyeS5jcHAKaW5kZXggMmJlMWY0Zi4uNmRlYWIzNiAxMDA2NDQKLS0tIGEvbmF0aXZlL2puaS9zcmMvZGljdGlvbmFyeS5jcHAKKysrIGIvbmF0aXZlL2puaS9zcmMvZGljdGlvbmFyeS5jcHAKQEAgLTYyLDcgKzYyLDcgQEAKICAgICB9IGVsc2UgewogICAgICAgICBzdGQ6Om1hcDxpbnQsIGludD4gYmlncmFtTWFwOwogICAgICAgICB1aW50OF90IGJpZ3JhbUZpbHRlcltCSUdSQU1fRklMVEVSX0JZVEVfU0laRV07Ci0gICAgICAgIG1CaWdyYW1EaWN0aW9uYXJ5LT5maWxsQmlncmFtQWRkcmVzc1RvRnJlcXVlbmN5TWFwQW5kRmlsdGVyKHByZXZXb3JkQ29kZVBvaW50cywKKyAgICAgICAgbUJpZ3JhbURpY3Rpb25hcnktPmZpbGxCaWdyYW1BZGRyZXNzVG9Qcm9iYWJpbGl0eU1hcEFuZEZpbHRlcihwcmV2V29yZENvZGVQb2ludHMsCiAgICAgICAgICAgICAgICAgcHJldldvcmRMZW5ndGgsICZiaWdyYW1NYXAsIGJpZ3JhbUZpbHRlcik7CiAgICAgICAgIHJlc3VsdCA9IG1VbmlncmFtRGljdGlvbmFyeS0+Z2V0U3VnZ2VzdGlvbnMocHJveGltaXR5SW5mbywgeGNvb3JkaW5hdGVzLCB5Y29vcmRpbmF0ZXMsCiAgICAgICAgICAgICAgICAgaW5wdXRDb2RlUG9pbnRzLCBpbnB1dFNpemUsICZiaWdyYW1NYXAsIGJpZ3JhbUZpbHRlciwgdXNlRnVsbEVkaXREaXN0YW5jZSwgb3V0V29yZHMsCkBAIC03OCw4ICs3OCw4IEBACiAgICAgICAgICAgICBmcmVxdWVuY2llcywgb3V0cHV0VHlwZXMpOwogfQogCi1pbnQgRGljdGlvbmFyeTo6Z2V0RnJlcXVlbmN5KGNvbnN0IGludCAqd29yZCwgaW50IGxlbmd0aCkgY29uc3QgewotICAgIHJldHVybiBtVW5pZ3JhbURpY3Rpb25hcnktPmdldEZyZXF1ZW5jeSh3b3JkLCBsZW5ndGgpOworaW50IERpY3Rpb25hcnk6OmdldFByb2JhYmlsaXR5KGNvbnN0IGludCAqd29yZCwgaW50IGxlbmd0aCkgY29uc3QgeworICAgIHJldHVybiBtVW5pZ3JhbURpY3Rpb25hcnktPmdldFByb2JhYmlsaXR5KHdvcmQsIGxlbmd0aCk7CiB9CiAKIGJvb2wgRGljdGlvbmFyeTo6aXNWYWxpZEJpZ3JhbShjb25zdCBpbnQgKndvcmQxLCBpbnQgbGVuZ3RoMSwgY29uc3QgaW50ICp3b3JkMiwgaW50IGxlbmd0aDIpIGNvbnN0IHsKZGlmZiAtLWdpdCBhL25hdGl2ZS9qbmkvc3JjL2RpY3Rpb25hcnkuaCBiL25hdGl2ZS9qbmkvc3JjL2RpY3Rpb25hcnkuaAppbmRleCBlY2RkZGQ3Li40NDliOTVhIDEwMDY0NAotLS0gYS9uYXRpdmUvam5pL3NyYy9kaWN0aW9uYXJ5LmgKKysrIGIvbmF0aXZlL2puaS9zcmMvZGljdGlvbmFyeS5oCkBAIC01Miw3ICs1Miw3IEBACiAgICAgaW50IGdldEJpZ3JhbXMoY29uc3QgaW50ICp3b3JkLCBpbnQgbGVuZ3RoLCBpbnQgKmlucHV0Q29kZVBvaW50cywgaW50IGlucHV0U2l6ZSwgaW50ICpvdXRXb3JkcywKICAgICAgICAgICAgIGludCAqZnJlcXVlbmNpZXMsIGludCAqb3V0cHV0VHlwZXMpIGNvbnN0OwogCi0gICAgaW50IGdldEZyZXF1ZW5jeShjb25zdCBpbnQgKndvcmQsIGludCBsZW5ndGgpIGNvbnN0OworICAgIGludCBnZXRQcm9iYWJpbGl0eShjb25zdCBpbnQgKndvcmQsIGludCBsZW5ndGgpIGNvbnN0OwogICAgIGJvb2wgaXNWYWxpZEJpZ3JhbShjb25zdCBpbnQgKndvcmQxLCBpbnQgbGVuZ3RoMSwgY29uc3QgaW50ICp3b3JkMiwgaW50IGxlbmd0aDIpIGNvbnN0OwogICAgIGNvbnN0IHVpbnQ4X3QgKmdldERpY3QoKSBjb25zdCB7IC8vIHJlcXVpcmVkIHRvIHJlbGVhc2UgZGljdGlvbmFyeSBidWZmZXIKICAgICAgICAgcmV0dXJuIG1EaWN0OwpkaWZmIC0tZ2l0IGEvbmF0aXZlL2puaS9zcmMvcHJveGltaXR5X2luZm9fc3RhdGUuY3BwIGIvbmF0aXZlL2puaS9zcmMvcHJveGltaXR5X2luZm9fc3RhdGUuY3BwCmluZGV4IGZlMWM0MzMuLjdmY2ZkNWQgMTAwNjQ0Ci0tLSBhL25hdGl2ZS9qbmkvc3JjL3Byb3hpbWl0eV9pbmZvX3N0YXRlLmNwcAorKysgYi9uYXRpdmUvam5pL3NyYy9wcm94aW1pdHlfaW5mb19zdGF0ZS5jcHAKQEAgLTE2NSw3ICsxNjUsNyBAQAogICAgICAgICBjb25zdCBpbnQgaW5kZXggPSBpbnB1dEluZGV4ICogbVByb3hpbWl0eUluZm8tPmdldEtleUNvdW50KCkgKyBrZXlJZDsKICAgICAgICAgcmV0dXJuIG1pbihtU2FtcGxlZERpc3RhbmNlQ2FjaGVfR1tpbmRleF0sIG1NYXhQb2ludFRvS2V5TGVuZ3RoKTsKICAgICB9Ci0gICAgaWYgKGlzU2tpcHBhYmxlQ29kZVBvaW50KGNvZGVQb2ludCkpIHsKKyAgICBpZiAoaXNJbnRlbnRpb25hbE9taXNzaW9uQ29kZVBvaW50KGNvZGVQb2ludCkpIHsKICAgICAgICAgcmV0dXJuIDAuMGY7CiAgICAgfQogICAgIC8vIElmIHRoZSBjaGFyIGlzIG5vdCBhIGtleSBvbiB0aGUga2V5Ym9hcmQgdGhlbiByZXR1cm4gdGhlIG1heCBsZW5ndGguCmRpZmYgLS1naXQgYS9uYXRpdmUvam5pL3NyYy90ZXJtaW5hbF9hdHRyaWJ1dGVzLmggYi9uYXRpdmUvam5pL3NyYy90ZXJtaW5hbF9hdHRyaWJ1dGVzLmgKaW5kZXggYThjYzAzYi4uMTQ0YWUxNCAxMDA2NDQKLS0tIGEvbmF0aXZlL2puaS9zcmMvdGVybWluYWxfYXR0cmlidXRlcy5oCisrKyBiL25hdGl2ZS9qbmkvc3JjL3Rlcm1pbmFsX2F0dHJpYnV0ZXMuaApAQCAtNTEsNyArNTEsNyBAQAogICAgICAgICAgICAgICAgIGlmIChOT1RfQV9DT0RFX1BPSU5UID09IGNvZGVQb2ludCkgYnJlYWs7CiAgICAgICAgICAgICAgICAgb3V0V29yZFtpXSA9IGNvZGVQb2ludDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICpvdXRGcmVxID0gQmluYXJ5Rm9ybWF0OjpnZXRBdHRyaWJ1dGVGcmVxdWVuY3lGcm9tRmxhZ3Moc2hvcnRjdXRGbGFncyk7CisgICAgICAgICAgICAqb3V0RnJlcSA9IEJpbmFyeUZvcm1hdDo6Z2V0QXR0cmlidXRlUHJvYmFiaWxpdHlGcm9tRmxhZ3Moc2hvcnRjdXRGbGFncyk7CiAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9uYXRpdmUvam5pL3NyYy91bmlncmFtX2RpY3Rpb25hcnkuY3BwIGIvbmF0aXZlL2puaS9zcmMvdW5pZ3JhbV9kaWN0aW9uYXJ5LmNwcAppbmRleCAwYjE4ZTc4Li44MGJhNDEyIDEwMDY0NAotLS0gYS9uYXRpdmUvam5pL3NyYy91bmlncmFtX2RpY3Rpb25hcnkuY3BwCisrKyBiL25hdGl2ZS9qbmkvc3JjL3VuaWdyYW1fZGljdGlvbmFyeS5jcHAKQEAgLTUyLDggKzUyLDggQEAKIH0KIAogLy8gVE9ETzogVGhpcyBuZWVkcyB0byB0YWtlIGEgY29uc3QgaW50KiBhbmQgbm90IHRpbmtlciB3aXRoIGl0cyBjb250ZW50cwotc3RhdGljIHZvaWQgYWRkV29yZChpbnQgKndvcmQsIGludCBsZW5ndGgsIGludCBmcmVxdWVuY3ksIFdvcmRzUHJpb3JpdHlRdWV1ZSAqcXVldWUsIGludCB0eXBlKSB7Ci0gICAgcXVldWUtPnB1c2goZnJlcXVlbmN5LCB3b3JkLCBsZW5ndGgsIHR5cGUpOworc3RhdGljIHZvaWQgYWRkV29yZChpbnQgKndvcmQsIGludCBsZW5ndGgsIGludCBwcm9iYWJpbGl0eSwgV29yZHNQcmlvcml0eVF1ZXVlICpxdWV1ZSwgaW50IHR5cGUpIHsKKyAgICBxdWV1ZS0+cHVzaChwcm9iYWJpbGl0eSwgd29yZCwgbGVuZ3RoLCB0eXBlKTsKIH0KIAogLy8gUmV0dXJuIHRoZSByZXBsYWNlbWVudCBjb2RlIHBvaW50IGZvciBhIGRpZ3JhcGgsIG9yIDAgaWYgbm9uZS4KQEAgLTE1OCw3ICsxNTgsNyBAQAogICAgICAgICAgICAgcXVldWVQb29sKTsKIH0KIAotLy8gYmlncmFtTWFwIGNvbnRhaW5zIHRoZSBhc3NvY2lhdGlvbiA8YmlncmFtIGFkZHJlc3M+IC0+IDxiaWdyYW0gZnJlcXVlbmN5PgorLy8gYmlncmFtTWFwIGNvbnRhaW5zIHRoZSBhc3NvY2lhdGlvbiA8YmlncmFtIGFkZHJlc3M+IC0+IDxiaWdyYW0gcHJvYmFiaWxpdHk+CiAvLyBiaWdyYW1GaWx0ZXIgaXMgYSBibG9vbSBmaWx0ZXIgZm9yIGZhc3QgcmVqZWN0aW9uOiBzZWUgZnVuY3Rpb25zIHNldEluRmlsdGVyIGFuZCBpc0luRmlsdGVyCiAvLyBpbiBiaWdyYW1fZGljdGlvbmFyeS5jcHAKIGludCBVbmlncmFtRGljdGlvbmFyeTo6Z2V0U3VnZ2VzdGlvbnMoUHJveGltaXR5SW5mbyAqcHJveGltaXR5SW5mbywgY29uc3QgaW50ICp4Y29vcmRpbmF0ZXMsCkBAIC0zOTksNyArMzk5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgTUFYX1dPUkRfTEVOR1RILCBzaG9ydGN1dFRhcmdldCwgJnNob3J0Y3V0RnJlcXVlbmN5KTsKICAgICAgICAgICAgIGludCBzaG9ydGN1dFNjb3JlOwogICAgICAgICAgICAgaW50IGtpbmQ7Ci0gICAgICAgICAgICBpZiAoc2hvcnRjdXRGcmVxdWVuY3kgPT0gQmluYXJ5Rm9ybWF0OjpXSElURUxJU1RfU0hPUlRDVVRfRlJFUVVFTkNZCisgICAgICAgICAgICBpZiAoc2hvcnRjdXRGcmVxdWVuY3kgPT0gQmluYXJ5Rm9ybWF0OjpXSElURUxJU1RfU0hPUlRDVVRfUFJPQkFCSUxJVFkKICAgICAgICAgICAgICAgICAgICAgJiYgY29ycmVjdGlvbi0+c2FtZUFzVHlwZWQoKSkgewogICAgICAgICAgICAgICAgIHNob3J0Y3V0U2NvcmUgPSBTX0lOVF9NQVg7CiAgICAgICAgICAgICAgICAga2luZCA9IERpY3Rpb25hcnk6OktJTkRfV0hJVEVMSVNUOwpAQCAtNDgzLDcgKzQ4Myw3IEBACiAgICAgICAgICAgICBpbnB1dFNpemUsIGNvcnJlY3Rpb24pOwogCiAgICAgaW50IHdvcmRbTUFYX1dPUkRfTEVOR1RIXTsKLSAgICBpbnQgZnJlcSA9IGdldE1vc3RGcmVxdWVudFdvcmRMaWtlKAorICAgIGludCBmcmVxID0gZ2V0TW9zdFByb2JhYmxlV29yZExpa2UoCiAgICAgICAgICAgICBpbnB1dFdvcmRTdGFydFBvcywgaW5wdXRXb3JkTGVuZ3RoLCBjb3JyZWN0aW9uLCB3b3JkKTsKICAgICBpZiAoZnJlcSA+IDApIHsKICAgICAgICAgbmV4dFdvcmRMZW5ndGggPSBpbnB1dFdvcmRMZW5ndGg7CkBAIC02NzksMTUgKzY3OSwxNSBAQAogICAgICAgICAgICAgb3V0cHV0V29yZCk7CiB9CiAKLS8vIFdyYXBwZXIgZm9yIGdldE1vc3RGcmVxdWVudFdvcmRMaWtlSW5uZXIsIHdoaWNoIG1hdGNoZXMgaXQgdG8gdGhlIHByZXZpb3VzCisvLyBXcmFwcGVyIGZvciBnZXRNb3N0UHJvYmFibGVXb3JkTGlrZUlubmVyLCB3aGljaCBtYXRjaGVzIGl0IHRvIHRoZSBwcmV2aW91cwogLy8gaW50ZXJmYWNlLgotaW50IFVuaWdyYW1EaWN0aW9uYXJ5OjpnZXRNb3N0RnJlcXVlbnRXb3JkTGlrZShjb25zdCBpbnQgc3RhcnRJbnB1dEluZGV4LCBjb25zdCBpbnQgaW5wdXRTaXplLAoraW50IFVuaWdyYW1EaWN0aW9uYXJ5OjpnZXRNb3N0UHJvYmFibGVXb3JkTGlrZShjb25zdCBpbnQgc3RhcnRJbnB1dEluZGV4LCBjb25zdCBpbnQgaW5wdXRTaXplLAogICAgICAgICBDb3JyZWN0aW9uICpjb3JyZWN0aW9uLCBpbnQgKndvcmQpIGNvbnN0IHsKICAgICBpbnQgaW5Xb3JkW2lucHV0U2l6ZV07CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnB1dFNpemU7ICsraSkgewogICAgICAgICBpbldvcmRbaV0gPSBjb3JyZWN0aW9uLT5nZXRQcmltYXJ5Q29kZVBvaW50QXQoc3RhcnRJbnB1dEluZGV4ICsgaSk7CiAgICAgfQotICAgIHJldHVybiBnZXRNb3N0RnJlcXVlbnRXb3JkTGlrZUlubmVyKGluV29yZCwgaW5wdXRTaXplLCB3b3JkKTsKKyAgICByZXR1cm4gZ2V0TW9zdFByb2JhYmxlV29yZExpa2VJbm5lcihpbldvcmQsIGlucHV0U2l6ZSwgd29yZCk7CiB9CiAKIC8vIFRoaXMgZnVuY3Rpb24gd2lsbCB0YWtlIHRoZSBwb3NpdGlvbiBvZiBhIGNoYXJhY3RlciBhcnJheSB3aXRoaW4gYSBDaGFyR3JvdXAsCkBAIC03MzgsOSArNzM4LDkgQEAKIH0KIAogLy8gVGhpcyBmdW5jdGlvbiBpcyBpbnZva2VkIHdoZW4gYSB3b3JkIGxpa2UgdGhlIHdvcmQgc2VhcmNoZWQgZm9yIGlzIGZvdW5kLgotLy8gSXQgd2lsbCBjb21wYXJlIHRoZSBmcmVxdWVuY3kgdG8gdGhlIG1heCBmcmVxdWVuY3ksIGFuZCBpZiBncmVhdGVyLCB3aWxsCisvLyBJdCB3aWxsIGNvbXBhcmUgdGhlIHByb2JhYmlsaXR5IHRvIHRoZSBtYXggcHJvYmFiaWxpdHksIGFuZCBpZiBncmVhdGVyLCB3aWxsCiAvLyBjb3B5IHRoZSB3b3JkIGludG8gdGhlIG91dHB1dCBidWZmZXIuIEluIG91dHB1dCB2YWx1ZSBtYXhGcmVxLCBpdCB3aWxsCi0vLyB3cml0ZSB0aGUgbmV3IG1heGltdW0gZnJlcXVlbmN5IGlmIGl0IGNoYW5nZWQuCisvLyB3cml0ZSB0aGUgbmV3IG1heGltdW0gcHJvYmFiaWxpdHkgaWYgaXQgY2hhbmdlZC4KIHN0YXRpYyBpbmxpbmUgdm9pZCBvblRlcm1pbmFsV29yZExpa2UoY29uc3QgaW50IGZyZXEsIGludCAqbmV3V29yZCwgY29uc3QgaW50IGxlbmd0aCwgaW50ICpvdXRXb3JkLAogICAgICAgICBpbnQgKm1heEZyZXEpIHsKICAgICBpZiAoZnJlcSA+ICptYXhGcmVxKSB7CkBAIC03NTIsOSArNzUyLDkgQEAKICAgICB9CiB9CiAKLS8vIFdpbGwgZmluZCB0aGUgaGlnaGVzdCBmcmVxdWVuY3kgb2YgdGhlIHdvcmRzIGxpa2UgdGhlIG9uZSBwYXNzZWQgYXMgYW4gYXJndW1lbnQsCisvLyBXaWxsIGZpbmQgdGhlIGhpZ2hlc3QgcHJvYmFiaWxpdHkgb2YgdGhlIHdvcmRzIGxpa2UgdGhlIG9uZSBwYXNzZWQgYXMgYW4gYXJndW1lbnQsCiAvLyB0aGF0IGlzLCBldmVyeXRoaW5nIHRoYXQgb25seSBkaWZmZXJzIGJ5IGNhc2UvYWNjZW50cy4KLWludCBVbmlncmFtRGljdGlvbmFyeTo6Z2V0TW9zdEZyZXF1ZW50V29yZExpa2VJbm5lcihjb25zdCBpbnQgKmNvbnN0IGluV29yZCwgY29uc3QgaW50IGlucHV0U2l6ZSwKK2ludCBVbmlncmFtRGljdGlvbmFyeTo6Z2V0TW9zdFByb2JhYmxlV29yZExpa2VJbm5lcihjb25zdCBpbnQgKmNvbnN0IGluV29yZCwgY29uc3QgaW50IGlucHV0U2l6ZSwKICAgICAgICAgaW50ICpvdXRXb3JkKSBjb25zdCB7CiAgICAgaW50IG5ld1dvcmRbTUFYX1dPUkRfTEVOR1RIXTsKICAgICBpbnQgZGVwdGggPSAwOwpAQCAtNzc1LDE3ICs3NzUsMTggQEAKICAgICAgICAgICAgIGludCBpbnB1dEluZGV4ID0gc3RhY2tJbnB1dEluZGV4W2RlcHRoXTsKICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgZmxhZ3MgPSBCaW5hcnlGb3JtYXQ6OmdldEZsYWdzQW5kRm9yd2FyZFBvaW50ZXIocm9vdCwgJnBvcyk7CiAgICAgICAgICAgICAvLyBUZXN0IHdoZXRoZXIgYWxsIGNoYXJzIGluIHRoaXMgZ3JvdXAgbWF0Y2ggd2l0aCB0aGUgd29yZCB3ZSBhcmUgc2VhcmNoaW5nIGZvci4gSWYgc28sCi0gICAgICAgICAgICAvLyB3ZSB3YW50IHRvIHRyYXZlcnNlIGl0cyBjaGlsZHJlbiAob3IgaWYgdGhlIGlucHV0U2l6ZSBtYXRjaCwgZXZhbHVhdGUgaXRzIGZyZXF1ZW5jeSkuCi0gICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiB3aWxsIG91dHB1dCB0aGUgcG9zaXRpb24gcmVnYXJkbGVzcywgYnV0IHdpbGwgb25seSB3cml0ZQotICAgICAgICAgICAgLy8gaW50byBpbnB1dEluZGV4IGlmIHRoZXJlIGlzIGEgbWF0Y2guCisgICAgICAgICAgICAvLyB3ZSB3YW50IHRvIHRyYXZlcnNlIGl0cyBjaGlsZHJlbiAob3IgaWYgdGhlIGlucHV0U2l6ZSBtYXRjaCwgZXZhbHVhdGUgaXRzCisgICAgICAgICAgICAvLyBwcm9iYWJpbGl0eSkuIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIHdpbGwgb3V0cHV0IHRoZSBwb3NpdGlvbiByZWdhcmRsZXNzLCBidXQgd2lsbAorICAgICAgICAgICAgLy8gb25seSB3cml0ZSBpbnRvIGlucHV0SW5kZXggaWYgdGhlcmUgaXMgYSBtYXRjaC4KICAgICAgICAgICAgIGNvbnN0IGJvb2wgaXNBbGlrZSA9IHRlc3RDaGFyR3JvdXBGb3JDb250aW51ZWRMaWtlbmVzcyhmbGFncywgcm9vdCwgcG9zLCBpbldvcmQsCiAgICAgICAgICAgICAgICAgICAgIGlucHV0SW5kZXgsIGlucHV0U2l6ZSwgbmV3V29yZCwgJmlucHV0SW5kZXgsICZwb3MpOwogICAgICAgICAgICAgaWYgKGlzQWxpa2UgJiYgKCEoQmluYXJ5Rm9ybWF0OjpGTEFHX0lTX05PVF9BX1dPUkQgJiBmbGFncykpCiAgICAgICAgICAgICAgICAgICAgICYmIChCaW5hcnlGb3JtYXQ6OkZMQUdfSVNfVEVSTUlOQUwgJiBmbGFncykgJiYgKGlucHV0SW5kZXggPT0gaW5wdXRTaXplKSkgewotICAgICAgICAgICAgICAgIGNvbnN0IGludCBmcmVxdWVuY3kgPSBCaW5hcnlGb3JtYXQ6OnJlYWRGcmVxdWVuY3lXaXRob3V0TW92aW5nUG9pbnRlcihyb290LCBwb3MpOwotICAgICAgICAgICAgICAgIG9uVGVybWluYWxXb3JkTGlrZShmcmVxdWVuY3ksIG5ld1dvcmQsIGlucHV0SW5kZXgsIG91dFdvcmQsICZtYXhGcmVxKTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgcHJvYmFiaWxpdHkgPQorICAgICAgICAgICAgICAgICAgICAgICAgQmluYXJ5Rm9ybWF0OjpyZWFkUHJvYmFiaWxpdHlXaXRob3V0TW92aW5nUG9pbnRlcihyb290LCBwb3MpOworICAgICAgICAgICAgICAgIG9uVGVybWluYWxXb3JkTGlrZShwcm9iYWJpbGl0eSwgbmV3V29yZCwgaW5wdXRJbmRleCwgb3V0V29yZCwgJm1heEZyZXEpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcG9zID0gQmluYXJ5Rm9ybWF0Ojpza2lwRnJlcXVlbmN5KGZsYWdzLCBwb3MpOworICAgICAgICAgICAgcG9zID0gQmluYXJ5Rm9ybWF0Ojpza2lwUHJvYmFiaWxpdHkoZmxhZ3MsIHBvcyk7CiAgICAgICAgICAgICBjb25zdCBpbnQgc2libGluZ1BvcyA9IEJpbmFyeUZvcm1hdDo6c2tpcENoaWxkcmVuUG9zQW5kQXR0cmlidXRlcyhyb290LCBmbGFncywgcG9zKTsKICAgICAgICAgICAgIGNvbnN0IGludCBjaGlsZHJlbk5vZGVQb3MgPSBCaW5hcnlGb3JtYXQ6OnJlYWRDaGlsZHJlblBvc2l0aW9uKHJvb3QsIGZsYWdzLCBwb3MpOwogICAgICAgICAgICAgLy8gSWYgd2UgaGFkIGEgbWF0Y2ggYW5kIHRoZSB3b3JkIGhhcyBjaGlsZHJlbiwgd2Ugd2FudCB0byB0cmF2ZXJzZSB0aGVtLiBXZSBkb24ndCBoYXZlCkBAIC04MTYsNyArODE3LDcgQEAKICAgICByZXR1cm4gbWF4RnJlcTsKIH0KIAotaW50IFVuaWdyYW1EaWN0aW9uYXJ5OjpnZXRGcmVxdWVuY3koY29uc3QgaW50ICpjb25zdCBpbldvcmQsIGNvbnN0IGludCBsZW5ndGgpIGNvbnN0IHsKK2ludCBVbmlncmFtRGljdGlvbmFyeTo6Z2V0UHJvYmFiaWxpdHkoY29uc3QgaW50ICpjb25zdCBpbldvcmQsIGNvbnN0IGludCBsZW5ndGgpIGNvbnN0IHsKICAgICBjb25zdCB1aW50OF90ICpjb25zdCByb290ID0gRElDVF9ST09UOwogICAgIGludCBwb3MgPSBCaW5hcnlGb3JtYXQ6OmdldFRlcm1pbmFsUG9zaXRpb24ocm9vdCwgaW5Xb3JkLCBsZW5ndGgsCiAgICAgICAgICAgICBmYWxzZSAvKiBmb3JjZUxvd2VyQ2FzZVNlYXJjaCAqLyk7CkBAIC04MjYsNyArODI3LDcgQEAKICAgICBjb25zdCB1aW50OF90IGZsYWdzID0gQmluYXJ5Rm9ybWF0OjpnZXRGbGFnc0FuZEZvcndhcmRQb2ludGVyKHJvb3QsICZwb3MpOwogICAgIGlmIChmbGFncyAmIChCaW5hcnlGb3JtYXQ6OkZMQUdfSVNfQkxBQ0tMSVNURUQgfCBCaW5hcnlGb3JtYXQ6OkZMQUdfSVNfTk9UX0FfV09SRCkpIHsKICAgICAgICAgLy8gSWYgdGhpcyBpcyBub3QgYSB3b3JkLCBvciBpZiBpdCdzIGEgYmxhY2tsaXN0ZWQgZW50cnksIGl0IHNob3VsZCBiZWhhdmUgYXMKLSAgICAgICAgLy8gaGF2aW5nIG5vIGZyZXF1ZW5jeSBvdXRzaWRlIG9mIHRoZSBzdWdnZXN0aW9uIHByb2Nlc3MgKHdoZXJlIGl0IHNob3VsZCBiZSB1c2VkCisgICAgICAgIC8vIGhhdmluZyBubyBwcm9iYWJpbGl0eSBvdXRzaWRlIG9mIHRoZSBzdWdnZXN0aW9uIHByb2Nlc3MgKHdoZXJlIGl0IHNob3VsZCBiZSB1c2VkCiAgICAgICAgIC8vIGZvciBzaG9ydGN1dHMpLgogICAgICAgICByZXR1cm4gTk9UX0FfUFJPQkFCSUxJVFk7CiAgICAgfQpAQCAtODM2LDggKzgzNyw4IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgQmluYXJ5Rm9ybWF0OjpnZXRDb2RlUG9pbnRBbmRGb3J3YXJkUG9pbnRlcihESUNUX1JPT1QsICZwb3MpOwogICAgIH0KLSAgICBjb25zdCBpbnQgdW5pZ3JhbUZyZXEgPSBCaW5hcnlGb3JtYXQ6OnJlYWRGcmVxdWVuY3lXaXRob3V0TW92aW5nUG9pbnRlcihyb290LCBwb3MpOwotICAgIHJldHVybiB1bmlncmFtRnJlcTsKKyAgICBjb25zdCBpbnQgdW5pZ3JhbVByb2JhYmlsaXR5ID0gQmluYXJ5Rm9ybWF0OjpyZWFkUHJvYmFiaWxpdHlXaXRob3V0TW92aW5nUG9pbnRlcihyb290LCBwb3MpOworICAgIHJldHVybiB1bmlncmFtUHJvYmFiaWxpdHk7CiB9CiAKIC8vIFRPRE86IHJlbW92ZSB0aGlzIGZ1bmN0aW9uLgpAQCAtODg0LDcgKzg4NSw3IEBACiAKICAgICAvLyBUaGlzIGdldHMgb25seSBPTkUgY2hhcmFjdGVyIGZyb20gdGhlIHN0cmVhbS4gTmV4dCB0aGVyZSB3aWxsIGJlOgogICAgIC8vIGlmIEZMQUdfSEFTX01VTFRJUExFIENIQVJTOiB0aGUgb3RoZXIgY2hhcmFjdGVycyBvZiB0aGUgc2FtZSBub2RlCi0gICAgLy8gZWxzZSBpZiBGTEFHX0lTX1RFUk1JTkFMOiB0aGUgZnJlcXVlbmN5CisgICAgLy8gZWxzZSBpZiBGTEFHX0lTX1RFUk1JTkFMOiB0aGUgcHJvYmFiaWxpdHkKICAgICAvLyBlbHNlIGlmIE1BU0tfR1JPVVBfQUREUkVTU19UWVBFIGlzIG5vdCBOT05FOiB0aGUgY2hpbGRyZW4gYWRkcmVzcwogICAgIC8vIE5vdGUgdGhhdCB5b3UgY2FuJ3QgaGF2ZSBhIG5vZGUgdGhhdCBib3RoIGlzIG5vdCBhIHRlcm1pbmFsIGFuZCBoYXMgbm8gY2hpbGRyZW4uCiAgICAgaW50IGMgPSBCaW5hcnlGb3JtYXQ6OmdldENvZGVQb2ludEFuZEZvcndhcmRQb2ludGVyKERJQ1RfUk9PVCwgJnBvcyk7CkBAIC05MTcsMTQgKzkxOCwxNCBAQAogICAgICAgICAgICAgLy8gV2UgZm91bmQgdGhhdCB0aGlzIGlzIGFuIHVucmVsYXRlZCBjaGFyYWN0ZXIsIHNvIHdlIHNob3VsZCBnaXZlIHVwIHRyYXZlcnNpbmcKICAgICAgICAgICAgIC8vIHRoaXMgbm9kZSBhbmQgaXRzIGNoaWxkcmVuIGVudGlyZWx5LgogICAgICAgICAgICAgLy8gSG93ZXZlciB3ZSBtYXkgbm90IGJlIG9uIHRoZSBsYXN0IHZpcnR1YWwgbm9kZSB5ZXQgc28gd2Ugc2tpcCB0aGUgcmVtYWluaW5nCi0gICAgICAgICAgICAvLyBjaGFyYWN0ZXJzIGluIHRoaXMgbm9kZSwgdGhlIGZyZXF1ZW5jeSBpZiBpdCdzIHRoZXJlLCByZWFkIHRoZSBuZXh0IHNpYmxpbmcKKyAgICAgICAgICAgIC8vIGNoYXJhY3RlcnMgaW4gdGhpcyBub2RlLCB0aGUgcHJvYmFiaWxpdHkgaWYgaXQncyB0aGVyZSwgcmVhZCB0aGUgbmV4dCBzaWJsaW5nCiAgICAgICAgICAgICAvLyBwb3NpdGlvbiB0byBvdXRwdXQgaXQsIHRoZW4gcmV0dXJuIGZhbHNlLgogICAgICAgICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSB0byBvdXRwdXQgb3RoZXIgdmFsdWVzIGJlY2F1c2Ugd2UgcmV0dXJuIGZhbHNlLCBhcyBpbgogICAgICAgICAgICAgLy8gImRvbid0IHRyYXZlcnNlIGNoaWxkcmVuIi4KICAgICAgICAgICAgIGlmICghaXNMYXN0Q2hhcikgewogICAgICAgICAgICAgICAgIHBvcyA9IEJpbmFyeUZvcm1hdDo6c2tpcE90aGVyQ2hhcmFjdGVycyhESUNUX1JPT1QsIHBvcyk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBwb3MgPSBCaW5hcnlGb3JtYXQ6OnNraXBGcmVxdWVuY3koZmxhZ3MsIHBvcyk7CisgICAgICAgICAgICBwb3MgPSBCaW5hcnlGb3JtYXQ6OnNraXBQcm9iYWJpbGl0eShmbGFncywgcG9zKTsKICAgICAgICAgICAgICpuZXh0U2libGluZ1Bvc2l0aW9uID0KICAgICAgICAgICAgICAgICAgICAgQmluYXJ5Rm9ybWF0Ojpza2lwQ2hpbGRyZW5Qb3NBbmRBdHRyaWJ1dGVzKERJQ1RfUk9PVCwgZmxhZ3MsIHBvcyk7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC05MzcsMTYgKzkzOCwxNyBAQAogICAgIH0gd2hpbGUgKE5PVF9BX0NPREVfUE9JTlQgIT0gYyk7CiAKICAgICBpZiAoaXNUZXJtaW5hbE5vZGUpIHsKLSAgICAgICAgLy8gVGhlIGZyZXF1ZW5jeSBzaG91bGQgYmUgaGVyZSwgYmVjYXVzZSB3ZSBjb21lIGhlcmUgb25seSBpZiB0aGlzIGlzIGFjdHVhbGx5CisgICAgICAgIC8vIFRoZSBwcm9iYWJpbGl0eSBzaG91bGQgYmUgaGVyZSwgYmVjYXVzZSB3ZSBjb21lIGhlcmUgb25seSBpZiB0aGlzIGlzIGFjdHVhbGx5CiAgICAgICAgIC8vIGEgdGVybWluYWwgbm9kZSwgYW5kIHdlIGFyZSBvbiBpdHMgbGFzdCBjaGFyLgotICAgICAgICBjb25zdCBpbnQgdW5pZ3JhbUZyZXEgPSBCaW5hcnlGb3JtYXQ6OnJlYWRGcmVxdWVuY3lXaXRob3V0TW92aW5nUG9pbnRlcihESUNUX1JPT1QsIHBvcyk7Ci0gICAgICAgIGNvbnN0IGludCBjaGlsZHJlbkFkZHJlc3NQb3MgPSBCaW5hcnlGb3JtYXQ6OnNraXBGcmVxdWVuY3koZmxhZ3MsIHBvcyk7CisgICAgICAgIGNvbnN0IGludCB1bmlncmFtUHJvYmFiaWxpdHkgPQorICAgICAgICAgICAgICAgIEJpbmFyeUZvcm1hdDo6cmVhZFByb2JhYmlsaXR5V2l0aG91dE1vdmluZ1BvaW50ZXIoRElDVF9ST09ULCBwb3MpOworICAgICAgICBjb25zdCBpbnQgY2hpbGRyZW5BZGRyZXNzUG9zID0gQmluYXJ5Rm9ybWF0Ojpza2lwUHJvYmFiaWxpdHkoZmxhZ3MsIHBvcyk7CiAgICAgICAgIGNvbnN0IGludCBhdHRyaWJ1dGVzUG9zID0gQmluYXJ5Rm9ybWF0Ojpza2lwQ2hpbGRyZW5Qb3NpdGlvbihmbGFncywgY2hpbGRyZW5BZGRyZXNzUG9zKTsKICAgICAgICAgVGVybWluYWxBdHRyaWJ1dGVzIHRlcm1pbmFsQXR0cmlidXRlcyhESUNUX1JPT1QsIGZsYWdzLCBhdHRyaWJ1dGVzUG9zKTsKICAgICAgICAgLy8gYmlncmFtTWFwIGNvbnRhaW5zIHRoZSBiaWdyYW0gZnJlcXVlbmNpZXMgaW5kZXhlZCBieSBhZGRyZXNzZXMgZm9yIGZhc3QgbG9va3VwLgogICAgICAgICAvLyBiaWdyYW1GaWx0ZXIgaXMgYSBibG9vbSBmaWx0ZXIgb2Ygc2FpZCBmcmVxdWVuY2llcyBmb3IgZXZlbiBmYXN0ZXIgcmVqZWN0aW9uLgogICAgICAgICBjb25zdCBpbnQgcHJvYmFiaWxpdHkgPSBCaW5hcnlGb3JtYXQ6OmdldFByb2JhYmlsaXR5KGluaXRpYWxQb3MsIGJpZ3JhbU1hcCwgYmlncmFtRmlsdGVyLAotICAgICAgICAgICAgICAgIHVuaWdyYW1GcmVxKTsKKyAgICAgICAgICAgICAgICB1bmlncmFtUHJvYmFiaWxpdHkpOwogICAgICAgICBvblRlcm1pbmFsKHByb2JhYmlsaXR5LCB0ZXJtaW5hbEF0dHJpYnV0ZXMsIGNvcnJlY3Rpb24sIHF1ZXVlUG9vbCwgbmVlZHNUb0ludm9rZU9uVGVybWluYWwsCiAgICAgICAgICAgICAgICAgY3VycmVudFdvcmRJbmRleCk7CiAKQEAgLTk2MSw3ICs5NjMsNyBAQAogICAgICAgICAvLyBOb3RlIHRoYXQgIWhhc0NoaWxkcmVuIGltcGxpZXMgaXNMYXN0Q2hhciwgc28gd2Uga25vdyB3ZSBkb24ndCBoYXZlIHRvIHNraXAgYW55CiAgICAgICAgIC8vIHJlbWFpbmluZyBjaGFyIGluIHRoaXMgZ3JvdXAgZm9yIHRoZXJlIGNhbid0IGJlIGFueS4KICAgICAgICAgaWYgKCFoYXNDaGlsZHJlbikgewotICAgICAgICAgICAgcG9zID0gQmluYXJ5Rm9ybWF0Ojpza2lwRnJlcXVlbmN5KGZsYWdzLCBwb3MpOworICAgICAgICAgICAgcG9zID0gQmluYXJ5Rm9ybWF0Ojpza2lwUHJvYmFiaWxpdHkoZmxhZ3MsIHBvcyk7CiAgICAgICAgICAgICAqbmV4dFNpYmxpbmdQb3NpdGlvbiA9CiAgICAgICAgICAgICAgICAgICAgIEJpbmFyeUZvcm1hdDo6c2tpcENoaWxkcmVuUG9zQW5kQXR0cmlidXRlcyhESUNUX1JPT1QsIGZsYWdzLCBwb3MpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtOTY5LDcgKzk3MSw3IEBACiAKICAgICAgICAgLy8gT3B0aW1pemF0aW9uOiBQcnVuZSBvdXQgd29yZHMgdGhhdCBhcmUgdG9vIGxvbmcgY29tcGFyZWQgdG8gaG93IG11Y2ggd2FzIHR5cGVkLgogICAgICAgICBpZiAoY29ycmVjdGlvbi0+bmVlZHNUb1BydW5lKCkpIHsKLSAgICAgICAgICAgIHBvcyA9IEJpbmFyeUZvcm1hdDo6c2tpcEZyZXF1ZW5jeShmbGFncywgcG9zKTsKKyAgICAgICAgICAgIHBvcyA9IEJpbmFyeUZvcm1hdDo6c2tpcFByb2JhYmlsaXR5KGZsYWdzLCBwb3MpOwogICAgICAgICAgICAgKm5leHRTaWJsaW5nUG9zaXRpb24gPQogICAgICAgICAgICAgICAgICAgICBCaW5hcnlGb3JtYXQ6OnNraXBDaGlsZHJlblBvc0FuZEF0dHJpYnV0ZXMoRElDVF9ST09ULCBmbGFncywgcG9zKTsKICAgICAgICAgICAgIGlmIChERUJVR19ESUNUX0ZVTEwpIHsKQEAgLTk4MywxMyArOTg1LDEzIEBACiAgICAgLy8gY2hpbGRyZW4sIHdlIGNhbid0IGNvbWUgaGVyZS4KICAgICBBU1NFUlQoQmluYXJ5Rm9ybWF0OjpoYXNDaGlsZHJlbkluRmxhZ3MoZmxhZ3MpKTsKIAotICAgIC8vIElmIHRoaXMgbm9kZSB3YXMgYSB0ZXJtaW5hbCBpdCBzdGlsbCBoYXMgdGhlIGZyZXF1ZW5jeSB1bmRlciB0aGUgcG9pbnRlciAoaXQgbWF5IGhhdmUgYmVlbgotICAgIC8vIHJlYWQsIGJ1dCBub3Qgc2tpcHBlZCAtIHNlZSByZWFkRnJlcXVlbmN5V2l0aG91dE1vdmluZ1BvaW50ZXIpLgorICAgIC8vIElmIHRoaXMgbm9kZSB3YXMgYSB0ZXJtaW5hbCBpdCBzdGlsbCBoYXMgdGhlIHByb2JhYmlsaXR5IHVuZGVyIHRoZSBwb2ludGVyIChpdCBtYXkgaGF2ZSBiZWVuCisgICAgLy8gcmVhZCwgYnV0IG5vdCBza2lwcGVkIC0gc2VlIHJlYWRQcm9iYWJpbGl0eVdpdGhvdXRNb3ZpbmdQb2ludGVyKS4KICAgICAvLyBOZXh0IGNvbWUgdGhlIGNoaWxkcmVuIHBvc2l0aW9uLCB0aGVuIHBvc3NpYmx5IGF0dHJpYnV0ZXMgKGF0dHJpYnV0ZXMgYXJlIGJpZ3JhbXMgb25seSBmb3IKICAgICAvLyBub3csIG1heWJlIHNvbWV0aGluZyByZWxhdGVkIHRvIHNob3J0Y3V0cyBpbiB0aGUgZnV0dXJlKS4KICAgICAvLyBPbmNlIHRoaXMgaXMgcmVhZCwgd2Ugc3RpbGwgbmVlZCB0byBvdXRwdXQgdGhlIG51bWJlciBvZiBub2RlcyBpbiB0aGUgaW1tZWRpYXRlIGNoaWxkcmVuIG9mCiAgICAgLy8gdGhpcyBub2RlLCBzbyB3ZSByZWFkIGFuZCBvdXRwdXQgaXQgYmVmb3JlIHJldHVybmluZyB0cnVlLCBhcyBpbiAicGxlYXNlIHRyYXZlcnNlIGNoaWxkcmVuIi4KLSAgICBwb3MgPSBCaW5hcnlGb3JtYXQ6OnNraXBGcmVxdWVuY3koZmxhZ3MsIHBvcyk7CisgICAgcG9zID0gQmluYXJ5Rm9ybWF0Ojpza2lwUHJvYmFiaWxpdHkoZmxhZ3MsIHBvcyk7CiAgICAgaW50IGNoaWxkcmVuUG9zID0gQmluYXJ5Rm9ybWF0OjpyZWFkQ2hpbGRyZW5Qb3NpdGlvbihESUNUX1JPT1QsIGZsYWdzLCBwb3MpOwogICAgICpuZXh0U2libGluZ1Bvc2l0aW9uID0gQmluYXJ5Rm9ybWF0Ojpza2lwQ2hpbGRyZW5Qb3NBbmRBdHRyaWJ1dGVzKERJQ1RfUk9PVCwgZmxhZ3MsIHBvcyk7CiAgICAgKm5ld0NvdW50ID0gQmluYXJ5Rm9ybWF0OjpnZXRHcm91cENvdW50QW5kRm9yd2FyZFBvaW50ZXIoRElDVF9ST09ULCAmY2hpbGRyZW5Qb3MpOwpkaWZmIC0tZ2l0IGEvbmF0aXZlL2puaS9zcmMvdW5pZ3JhbV9kaWN0aW9uYXJ5LmggYi9uYXRpdmUvam5pL3NyYy91bmlncmFtX2RpY3Rpb25hcnkuaAppbmRleCA1MDJiZjQ3Li5jMTk1NWU4IDEwMDY0NAotLS0gYS9uYXRpdmUvam5pL3NyYy91bmlncmFtX2RpY3Rpb25hcnkuaAorKysgYi9uYXRpdmUvam5pL3NyYy91bmlncmFtX2RpY3Rpb25hcnkuaApAQCAtNDAsNyArNDAsNyBAQAogICAgIHN0YXRpYyBjb25zdCBpbnQgRkxBR19NVUxUSVBMRV9TVUdHRVNUX1NLSVAgPSAxOwogICAgIHN0YXRpYyBjb25zdCBpbnQgRkxBR19NVUxUSVBMRV9TVUdHRVNUX0NPTlRJTlVFID0gMjsKICAgICBVbmlncmFtRGljdGlvbmFyeShjb25zdCB1aW50OF90ICpjb25zdCBzdHJlYW1TdGFydCwgY29uc3QgdW5zaWduZWQgaW50IGZsYWdzKTsKLSAgICBpbnQgZ2V0RnJlcXVlbmN5KGNvbnN0IGludCAqY29uc3QgaW5Xb3JkLCBjb25zdCBpbnQgbGVuZ3RoKSBjb25zdDsKKyAgICBpbnQgZ2V0UHJvYmFiaWxpdHkoY29uc3QgaW50ICpjb25zdCBpbldvcmQsIGNvbnN0IGludCBsZW5ndGgpIGNvbnN0OwogICAgIGludCBnZXRCaWdyYW1Qb3NpdGlvbihpbnQgcG9zLCBpbnQgKndvcmQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIGNvbnN0OwogICAgIGludCBnZXRTdWdnZXN0aW9ucyhQcm94aW1pdHlJbmZvICpwcm94aW1pdHlJbmZvLCBjb25zdCBpbnQgKnhjb29yZGluYXRlcywKICAgICAgICAgICAgIGNvbnN0IGludCAqeWNvb3JkaW5hdGVzLCBjb25zdCBpbnQgKmlucHV0Q29kZVBvaW50cywgY29uc3QgaW50IGlucHV0U2l6ZSwKQEAgLTg5LDkgKzg5LDkgQEAKICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJpZ3JhbUZpbHRlciwgQ29ycmVjdGlvbiAqY29ycmVjdGlvbiwgaW50ICpuZXdDb3VudCwKICAgICAgICAgICAgIGludCAqbmV3Q2hpbGRQb3NpdGlvbiwgaW50ICpuZXh0U2libGluZ1Bvc2l0aW9uLCBXb3Jkc1ByaW9yaXR5UXVldWVQb29sICpxdWV1ZVBvb2wsCiAgICAgICAgICAgICBjb25zdCBpbnQgY3VycmVudFdvcmRJbmRleCkgY29uc3Q7Ci0gICAgaW50IGdldE1vc3RGcmVxdWVudFdvcmRMaWtlKGNvbnN0IGludCBzdGFydElucHV0SW5kZXgsIGNvbnN0IGludCBpbnB1dFNpemUsCisgICAgaW50IGdldE1vc3RQcm9iYWJsZVdvcmRMaWtlKGNvbnN0IGludCBzdGFydElucHV0SW5kZXgsIGNvbnN0IGludCBpbnB1dFNpemUsCiAgICAgICAgICAgICBDb3JyZWN0aW9uICpjb3JyZWN0aW9uLCBpbnQgKndvcmQpIGNvbnN0OwotICAgIGludCBnZXRNb3N0RnJlcXVlbnRXb3JkTGlrZUlubmVyKGNvbnN0IGludCAqY29uc3QgaW5Xb3JkLCBjb25zdCBpbnQgaW5wdXRTaXplLAorICAgIGludCBnZXRNb3N0UHJvYmFibGVXb3JkTGlrZUlubmVyKGNvbnN0IGludCAqY29uc3QgaW5Xb3JkLCBjb25zdCBpbnQgaW5wdXRTaXplLAogICAgICAgICAgICAgaW50ICpvdXRXb3JkKSBjb25zdDsKICAgICBpbnQgZ2V0U3ViU3RyaW5nU3VnZ2VzdGlvbihQcm94aW1pdHlJbmZvICpwcm94aW1pdHlJbmZvLCBjb25zdCBpbnQgKnhjb29yZGluYXRlcywKICAgICAgICAgICAgIGNvbnN0IGludCAqeWNvb3JkaW5hdGVzLCBjb25zdCBpbnQgKmNvZGVzLCBjb25zdCBib29sIHVzZUZ1bGxFZGl0RGlzdGFuY2UsCg==