ZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9wb20ueG1sIGIvZ2l0aWxlcy1zZXJ2bGV0L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUzNzY5MwotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9wb20ueG1sCkBAIC0wLDAgKzEsMTE1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5naXRpbGVzPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmdpdGlsZXMtcGFyZW50PC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+Z2l0aWxlcy1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICA8bmFtZT5HaXRpbGVzIC0gU2VydmxldDwvbmFtZT4KKworICA8ZGVzY3JpcHRpb24+CisgICAgR2l0aWxlcyBzZXJ2bGV0IGltcGxlbWVudGF0aW9uCisgIDwvZGVzY3JpcHRpb24+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZ3VhdmE8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5ndWF2YTwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbS5nb29nbGUudGVtcGxhdGU8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5zb3k8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdDwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQuanVuaXQ8L2FydGlmYWN0SWQ+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgPC9leGNsdXNpb25zPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS50b21jYXQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLnNsZjRqPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+c2xmNGotYXBpPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+am9kYS10aW1lPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+am9kYS10aW1lPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5jb2RlLmdzb248L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5nc29uPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jb21tb25zPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sYW5nMzwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorCisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0Fic3RyYWN0SHR0cEZpbHRlci5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0Fic3RyYWN0SHR0cEZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MmUxMmQKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvQWJzdHJhY3RIdHRwRmlsdGVyLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDaGFpbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlckNvbmZpZzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCithYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEh0dHBGaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXIgeworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgZG9GaWx0ZXIoU2VydmxldFJlcXVlc3QgcmVxLCBTZXJ2bGV0UmVzcG9uc2UgcmVzLCBGaWx0ZXJDaGFpbiBjaGFpbikKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgZG9GaWx0ZXIoKEh0dHBTZXJ2bGV0UmVxdWVzdCkgcmVxLCAoSHR0cFNlcnZsZXRSZXNwb25zZSkgcmVzLCBjaGFpbik7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIC8vIEFsbG93IHN1YmNsYXNzZXMgdG8gdGhyb3cgU2VydmxldEV4Y2VwdGlvbi4KKyAgcHVibGljIHZvaWQgaW5pdChGaWx0ZXJDb25maWcgY29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgLy8gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuCisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKKyAgICAvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4KKyAgfQorCisgIC8qKiBAc2VlICNkb0ZpbHRlcihTZXJ2bGV0UmVxdWVzdCwgU2VydmxldFJlc3BvbnNlLCBGaWx0ZXJDaGFpbikgKi8KKyAgcHVibGljIGFic3RyYWN0IHZvaWQgZG9GaWx0ZXIoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsIEZpbHRlckNoYWluIGNoYWluKQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0Jhc2VTZXJ2bGV0LmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvQmFzZVNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGRjMTRlCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0Jhc2VTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSwxMTkgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgc3RhdGljIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlLlNDX05PVF9GT1VORDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuQ2hhcnNldHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLm5ldC5IdHRwSGVhZGVyczsKKworaW1wb3J0IG9yZy5qb2RhLnRpbWUuSW5zdGFudDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCisvKiogQmFzZSBzZXJ2bGV0IGNsYXNzIGZvciBHaXRpbGVzIHNlcnZsZXRzIHRoYXQgc2VydmUgU295IHRlbXBsYXRlcy4gKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlU2VydmxldCBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfQVRUUklCVVRFID0gQmFzZVNlcnZsZXQuY2xhc3MuZ2V0TmFtZSgpICsgIi9EYXRhIjsKKworICBzdGF0aWMgdm9pZCBzZXROb3RDYWNoZWFibGUoSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpIHsKKyAgICByZXMuc2V0SGVhZGVyKEh0dHBIZWFkZXJzLkNBQ0hFX0NPTlRST0wsICJuby1jYWNoZSwgbm8tc3RvcmUsIG1heC1hZ2U9MCwgbXVzdC1yZXZhbGlkYXRlIik7CisgICAgcmVzLnNldEhlYWRlcihIdHRwSGVhZGVycy5QUkFHTUEsICJuby1jYWNoZSIpOworICAgIHJlcy5zZXRIZWFkZXIoSHR0cEhlYWRlcnMuRVhQSVJFUywgIkZyaSwgMDEgSmFuIDE5OTAgMDA6MDA6MDAgR01UIik7CisgICAgcmVzLnNldERhdGVIZWFkZXIoSHR0cEhlYWRlcnMuREFURSwgbmV3IEluc3RhbnQoKS5nZXRNaWxsaXMoKSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIEJhc2VTZXJ2bGV0IG5vdEZvdW5kU2VydmxldCgpIHsKKyAgICByZXR1cm4gbmV3IEJhc2VTZXJ2bGV0KG51bGwpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgc2VydmljZShIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykgeworICAgICAgICByZXMuc2V0U3RhdHVzKFNDX05PVF9GT1VORCk7CisgICAgICB9CisgICAgfTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBtZW51RW50cnkoU3RyaW5nIHRleHQsIFN0cmluZyB1cmwpIHsKKyAgICBpZiAodXJsICE9IG51bGwpIHsKKyAgICAgIHJldHVybiBJbW11dGFibGVNYXAub2YoInRleHQiLCB0ZXh0LCAidXJsIiwgdXJsKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIEltbXV0YWJsZU1hcC5vZigidGV4dCIsIHRleHQpOworICAgIH0KKyAgfQorCisgIHByb3RlY3RlZCBzdGF0aWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXREYXRhKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGRhdGEgPSAoTWFwPFN0cmluZywgT2JqZWN0PikgcmVxLmdldEF0dHJpYnV0ZShEQVRBX0FUVFJJQlVURSk7CisgICAgaWYgKGRhdGEgPT0gbnVsbCkgeworICAgICAgZGF0YSA9IE1hcHMubmV3SGFzaE1hcCgpOworICAgICAgcmVxLnNldEF0dHJpYnV0ZShEQVRBX0FUVFJJQlVURSwgZGF0YSk7CisgICAgfQorICAgIHJldHVybiBkYXRhOworICB9CisKKyAgcHJvdGVjdGVkIGZpbmFsIFJlbmRlcmVyIHJlbmRlcmVyOworCisgIHByb3RlY3RlZCBCYXNlU2VydmxldChSZW5kZXJlciByZW5kZXJlcikgeworICAgIHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjsKKyAgfQorCisgIC8qKgorICAgKiBQdXQgYSB2YWx1ZSBpbnRvIGEgcmVxdWVzdCdzIFNveSBkYXRhIG1hcC4KKyAgICogPHA+CisgICAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIHRvIHN1cHBvcnQgYSBjb21wb3NpdGlvbiBwYXR0ZXJuIHdoZXJlYnkgYQorICAgKiB7QGxpbmsgQmFzZVNlcnZsZXR9IGlzIHdyYXBwZWQgaW4gYSBkaWZmZXJlbnQge0BsaW5rIEh0dHBTZXJ2bGV0fSB0aGF0IGNhbgorICAgKiB1cGRhdGUgaXRzIGRhdGEgbWFwLgorICAgKgorICAgKiBAcGFyYW0gcmVxIGluLXByb2dyZXNzIHJlcXVlc3QuCisgICAqIEBwYXJhbSBrZXkga2V5LgorICAgKiBAcGFyYW0gdmFsdWUgU295IGRhdGEgdmFsdWUuCisgICAqLworICBwdWJsaWMgdm9pZCBwdXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7CisgICAgZ2V0RGF0YShyZXEpLnB1dChrZXksIHZhbHVlKTsKKyAgfQorCisgIHByb3RlY3RlZCB2b2lkIHJlbmRlcihIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcywgU3RyaW5nIHRlbXBsYXRlTmFtZSwKKyAgICAgIE1hcDxTdHJpbmcsID8+IHNveURhdGEpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHJlcy5zZXRDb250ZW50VHlwZShGb3JtYXRUeXBlLkhUTUwuZ2V0TWltZVR5cGUoKSk7CisgICAgICByZXMuc2V0Q2hhcmFjdGVyRW5jb2RpbmcoQ2hhcnNldHMuVVRGXzgubmFtZSgpKTsKKyAgICAgIHNldENhY2hlSGVhZGVycyhyZXEsIHJlcyk7CisKKyAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gYWxsRGF0YSA9IGdldERhdGEocmVxKTsKKyAgICAgIGFsbERhdGEucHV0QWxsKHNveURhdGEpOworICAgICAgR2l0aWxlc1ZpZXcgdmlldyA9IFZpZXdGaWx0ZXIuZ2V0VmlldyhyZXEpOworICAgICAgaWYgKCFhbGxEYXRhLmNvbnRhaW5zS2V5KCJyZXBvc2l0b3J5TmFtZSIpICYmIHZpZXcuZ2V0UmVwb3NpdG9yeU5hbWUoKSAhPSBudWxsKSB7CisgICAgICAgIGFsbERhdGEucHV0KCJyZXBvc2l0b3J5TmFtZSIsIHZpZXcuZ2V0UmVwb3NpdG9yeU5hbWUoKSk7CisgICAgICB9CisgICAgICBpZiAoIWFsbERhdGEuY29udGFpbnNLZXkoImJyZWFkY3J1bWJzIikpIHsKKyAgICAgICAgYWxsRGF0YS5wdXQoImJyZWFkY3J1bWJzIiwgdmlldy5nZXRCcmVhZGNydW1icygpKTsKKyAgICAgIH0KKworICAgICAgcmVzLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX09LKTsKKyAgICAgIHJlbmRlcmVyLnJlbmRlcihyZXMsIHRlbXBsYXRlTmFtZSwgYWxsRGF0YSk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIHJlcS5yZW1vdmVBdHRyaWJ1dGUoREFUQV9BVFRSSUJVVEUpOworICAgIH0KKyAgfQorCisgIHByb3RlY3RlZCB2b2lkIHNldENhY2hlSGVhZGVycyhIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykgeworICAgIHNldE5vdENhY2hlYWJsZShyZXMpOworICB9Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvQmxvYlNveURhdGEuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9CbG9iU295RGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNTdjYmMKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvQmxvYlNveURhdGEuamF2YQpAQCAtMCwwICsxLDEwOSBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLk9CSl9DT01NSVQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpZmYuUmF3VGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5MYXJnZU9iamVjdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5NaXNzaW5nT2JqZWN0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RMb2FkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldldhbGs7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlJhd1BhcnNlVXRpbHM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKiBTb3kgZGF0YSBjb252ZXJ0ZXIgZm9yIGdpdCBibG9icy4gKi8KK3B1YmxpYyBjbGFzcyBCbG9iU295RGF0YSB7CisgIC8qKgorICAgKiBNYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBsb2FkIGZyb20gYSBzdXBwb3NlZCB0ZXh0IGZpbGUgZm9yIGRpc3BsYXkuCisgICAqIEZpbGVzIGxhcmdlciB0aGFuIHRoaXMgd2lsbCBiZSBkaXNwbGF5ZWQgYXMgYmluYXJ5IGZpbGVzLCBldmVuIGlmIHRoZQorICAgKiBjb250ZW50cyB3YXMgdGV4dC4gRm9yIGV4YW1wbGUgcmVhbGx5IGJpZyBYTUwgZmlsZXMgbWF5IGJlIGFib3ZlIHRoaXMgbGltaXQKKyAgICogYW5kIHdpbGwgZ2V0IGRpc3BsYXllZCBhcyBiaW5hcnkuCisgICAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0ZJTEVfU0laRSA9IDEwIDw8IDIwOworCisgIHByaXZhdGUgZmluYWwgR2l0aWxlc1ZpZXcgdmlldzsKKyAgcHJpdmF0ZSBmaW5hbCBSZXZXYWxrIHdhbGs7CisKKyAgcHVibGljIEJsb2JTb3lEYXRhKFJldldhbGsgd2FsaywgR2l0aWxlc1ZpZXcgdmlldykgeworICAgIHRoaXMudmlldyA9IHZpZXc7CisgICAgdGhpcy53YWxrID0gd2FsazsKKyAgfQorCisgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IHRvU295RGF0YShPYmplY3RJZCBibG9iSWQpCisgICAgICB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIHJldHVybiB0b1NveURhdGEobnVsbCwgYmxvYklkKTsKKyAgfQorCisgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IHRvU295RGF0YShTdHJpbmcgcGF0aCwgT2JqZWN0SWQgYmxvYklkKQorICAgICAgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGRhdGEgPSBNYXBzLm5ld0hhc2hNYXBXaXRoRXhwZWN0ZWRTaXplKDQpOworICAgIGRhdGEucHV0KCJzaGEiLCBPYmplY3RJZC50b1N0cmluZyhibG9iSWQpKTsKKworICAgIE9iamVjdExvYWRlciBsb2FkZXIgPSB3YWxrLmdldE9iamVjdFJlYWRlcigpLm9wZW4oYmxvYklkLCBDb25zdGFudHMuT0JKX0JMT0IpOworICAgIFN0cmluZyBjb250ZW50OworICAgIHRyeSB7CisgICAgICBieXRlW10gcmF3ID0gbG9hZGVyLmdldENhY2hlZEJ5dGVzKE1BWF9GSUxFX1NJWkUpOworICAgICAgY29udGVudCA9ICFSYXdUZXh0LmlzQmluYXJ5KHJhdykgPyBSYXdQYXJzZVV0aWxzLmRlY29kZShyYXcpIDogbnVsbDsKKyAgICB9IGNhdGNoIChMYXJnZU9iamVjdEV4Y2VwdGlvbi5PdXRPZk1lbW9yeSBlKSB7CisgICAgICB0aHJvdyBlOworICAgIH0gY2F0Y2ggKExhcmdlT2JqZWN0RXhjZXB0aW9uIGUpIHsKKyAgICAgIGNvbnRlbnQgPSBudWxsOworICAgIH0KKworICAgIGRhdGEucHV0KCJkYXRhIiwgY29udGVudCk7CisgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkgeworICAgICAgZGF0YS5wdXQoImxhbmciLCBndWVzc1ByZXR0aWZ5TGFuZyhwYXRoLCBjb250ZW50KSk7CisgICAgfSBlbHNlIGlmIChjb250ZW50ID09IG51bGwpIHsKKyAgICAgIGRhdGEucHV0KCJzaXplIiwgTG9uZy50b1N0cmluZyhsb2FkZXIuZ2V0U2l6ZSgpKSk7CisgICAgfQorICAgIGlmIChwYXRoICE9IG51bGwgJiYgdmlldy5nZXRSZXZpc2lvbigpLmdldFBlZWxlZFR5cGUoKSA9PSBPQkpfQ09NTUlUKSB7CisgICAgICBkYXRhLnB1dCgibG9nVXJsIiwgR2l0aWxlc1ZpZXcubG9nKCkuY29weUZyb20odmlldykudG9VcmwoKSk7CisgICAgfQorICAgIHJldHVybiBkYXRhOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGd1ZXNzUHJldHRpZnlMYW5nKFN0cmluZyBwYXRoLCBTdHJpbmcgY29udGVudCkgeworICAgIGlmIChjb250ZW50LnN0YXJ0c1dpdGgoIiMhL2Jpbi9zaCIpIHx8IGNvbnRlbnQuc3RhcnRzV2l0aCgiIyEvYmluL2Jhc2giKSkgeworICAgICAgcmV0dXJuICJzaCI7CisgICAgfSBlbHNlIGlmIChjb250ZW50LnN0YXJ0c1dpdGgoIiMhL3Vzci9iaW4vcGVybCIpKSB7CisgICAgICByZXR1cm4gInBlcmwiOworICAgIH0gZWxzZSBpZiAoY29udGVudC5zdGFydHNXaXRoKCIjIS91c3IvYmluL3B5dGhvbiIpKSB7CisgICAgICByZXR1cm4gInB5IjsKKyAgICB9IGVsc2UgaWYgKHBhdGggPT0gbnVsbCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgaW50IHNsYXNoID0gcGF0aC5sYXN0SW5kZXhPZignLycpOworICAgIGludCBkb3QgPSBwYXRoLmxhc3RJbmRleE9mKCcuJyk7CisgICAgU3RyaW5nIGxhbmcgPSAoKDAgPCBkb3QpICYmIChzbGFzaCA8IGRvdCkpID8gcGF0aC5zdWJzdHJpbmcoZG90ICsgMSkgOiBudWxsOworICAgIGlmICgidHh0Ii5lcXVhbHNJZ25vcmVDYXNlKGxhbmcpKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9IGVsc2UgaWYgKCJtayIuZXF1YWxzSWdub3JlQ2FzZShsYW5nKSkgeworICAgICAgcmV0dXJuICJzaCI7CisgICAgfSBlbHNlIGlmICgiTWFrZWZpbGUiLmVxdWFsc0lnbm9yZUNhc2UocGF0aCkKKyAgICAgICAgfHwgKCgwIDwgc2xhc2gpICYmICJNYWtlZmlsZSIuZXF1YWxzSWdub3JlQ2FzZShwYXRoLnN1YnN0cmluZyhzbGFzaCArIDEpKSkpIHsKKyAgICAgIHJldHVybiAic2giOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gbGFuZzsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9Db21taXRTb3lEYXRhLmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvQ29tbWl0U295RGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmOGE5N2QKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvQ29tbWl0U295RGF0YS5qYXZhCkBAIC0wLDAgKzEsMjg3IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tTdGF0ZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKK2ltcG9ydCBjb20uZ29vZ2xlLnRlbXBsYXRlLnNveS5kYXRhLnJlc3RyaWN0ZWQuTnVsbERhdGE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpZmYuRGlmZkVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlmZi5EaWZmRW50cnkuQ2hhbmdlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpZmYuRGlmZkZvcm1hdHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5BbnlPYmplY3RJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0UmVhZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlBlcnNvbklkZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZDb21taXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldldhbGs7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLkNhbm9uaWNhbFRyZWVQYXJzZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5FbXB0eVRyZWVJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuR2l0RGF0ZUZvcm1hdHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuR2l0RGF0ZUZvcm1hdHRlci5Gb3JtYXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlJlbGF0aXZlRGF0ZUZvcm1hdHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW8uTnVsbE91dHB1dFN0cmVhbTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKKworLyoqIFNveSBkYXRhIGNvbnZlcnRlciBmb3IgZ2l0IGNvbW1pdHMuICovCitwdWJsaWMgY2xhc3MgQ29tbWl0U295RGF0YSB7CisgIC8qKiBWYWxpZCBzZXRzIG9mIGtleXMgdG8gaW5jbHVkZSBpbiBTb3kgZGF0YSBmb3IgY29tbWl0cy4gKi8KKyAgcHVibGljIHN0YXRpYyBlbnVtIEtleVNldCB7CisgICAgREVUQUlMKCJhdXRob3IiLCAiY29tbWl0dGVyIiwgInNoYSIsICJ0cmVlIiwgInRyZWVVcmwiLCAicGFyZW50cyIsICJtZXNzYWdlIiwgImxvZ1VybCIpLAorICAgIERFVEFJTF9ESUZGX1RSRUUoREVUQUlMLCAiZGlmZlRyZWUiKSwKKyAgICBTSE9SVExPRygiYWJicmV2U2hhIiwgInVybCIsICJzaG9ydE1lc3NhZ2UiLCAiYXV0aG9yIiwgImJyYW5jaGVzIiwgInRhZ3MiKSwKKyAgICBERUZBVUxUKERFVEFJTCk7CisKKyAgICBwcml2YXRlIGZpbmFsIFNldDxTdHJpbmc+IGtleXM7CisKKyAgICBwcml2YXRlIEtleVNldChTdHJpbmcuLi4ga2V5cykgeworICAgICAgdGhpcy5rZXlzID0gSW1tdXRhYmxlU2V0LmNvcHlPZihrZXlzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEtleVNldChLZXlTZXQgb3RoZXIsIFN0cmluZy4uLiBrZXlzKSB7CisgICAgICB0aGlzLmtleXMgPSBJbW11dGFibGVTZXQuPFN0cmluZz4gYnVpbGRlcigpLmFkZEFsbChvdGhlci5rZXlzKS5hZGQoa2V5cykuYnVpbGQoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIGZpbmFsIExpbmtpZmllciBsaW5raWZpZXI7CisgIHByaXZhdGUgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcTsKKyAgcHJpdmF0ZSBmaW5hbCBSZXBvc2l0b3J5IHJlcG87CisgIHByaXZhdGUgZmluYWwgUmV2V2FsayB3YWxrOworICBwcml2YXRlIGZpbmFsIEdpdGlsZXNWaWV3IHZpZXc7CisgIHByaXZhdGUgZmluYWwgTWFwPEFueU9iamVjdElkLCBTZXQ8UmVmPj4gcmVmc0J5SWQ7CisgIHByaXZhdGUgZmluYWwgR2l0RGF0ZUZvcm1hdHRlciBkYXRlRm9ybWF0dGVyOworCisgIC8vIFRPRE8oZGJvcm93aXR6KTogVGhpcyBjb25zdHJ1Y3RvciBpcyBnZXR0aW5nIGEgYml0IHJpZGljdWxvdXMuCisgIHB1YmxpYyBDb21taXRTb3lEYXRhKEBOdWxsYWJsZSBMaW5raWZpZXIgbGlua2lmaWVyLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBSZXBvc2l0b3J5IHJlcG8sCisgICAgICBSZXZXYWxrIHdhbGssIEdpdGlsZXNWaWV3IHZpZXcpIHsKKyAgICB0aGlzKGxpbmtpZmllciwgcmVxLCByZXBvLCB3YWxrLCB2aWV3LCBudWxsKTsKKyAgfQorCisgIHB1YmxpYyBDb21taXRTb3lEYXRhKEBOdWxsYWJsZSBMaW5raWZpZXIgbGlua2lmaWVyLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBSZXBvc2l0b3J5IHJlcG8sCisgICAgICBSZXZXYWxrIHdhbGssIEdpdGlsZXNWaWV3IHZpZXcsIEBOdWxsYWJsZSBNYXA8QW55T2JqZWN0SWQsIFNldDxSZWY+PiByZWZzQnlJZCkgeworICAgIHRoaXMubGlua2lmaWVyID0gbGlua2lmaWVyOworICAgIHRoaXMucmVxID0gcmVxOworICAgIHRoaXMucmVwbyA9IHJlcG87CisgICAgdGhpcy53YWxrID0gd2FsazsKKyAgICB0aGlzLnZpZXcgPSB2aWV3OworICAgIHRoaXMucmVmc0J5SWQgPSByZWZzQnlJZDsKKyAgICB0aGlzLmRhdGVGb3JtYXR0ZXIgPSBuZXcgR2l0RGF0ZUZvcm1hdHRlcihGb3JtYXQuREVGQVVMVCk7CisgIH0KKworICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiB0b1NveURhdGEoUmV2Q29tbWl0IGNvbW1pdCwgS2V5U2V0IGtleXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgTWFwPFN0cmluZywgT2JqZWN0PiBkYXRhID0gTWFwcy5uZXdIYXNoTWFwV2l0aEV4cGVjdGVkU2l6ZShLZXlTZXQuREVGQVVMVC5rZXlzLnNpemUoKSk7CisgICAgaWYgKGtleXMua2V5cy5jb250YWlucygiYXV0aG9yIikpIHsKKyAgICAgIGRhdGEucHV0KCJhdXRob3IiLCB0b1NveURhdGEoY29tbWl0LmdldEF1dGhvcklkZW50KCksIGRhdGVGb3JtYXR0ZXIpKTsKKyAgICB9CisgICAgaWYgKGtleXMua2V5cy5jb250YWlucygiY29tbWl0dGVyIikpIHsKKyAgICAgIGRhdGEucHV0KCJjb21taXR0ZXIiLCB0b1NveURhdGEoY29tbWl0LmdldENvbW1pdHRlcklkZW50KCksIGRhdGVGb3JtYXR0ZXIpKTsKKyAgICB9CisgICAgaWYgKGtleXMua2V5cy5jb250YWlucygic2hhIikpIHsKKyAgICAgIGRhdGEucHV0KCJzaGEiLCBPYmplY3RJZC50b1N0cmluZyhjb21taXQpKTsKKyAgICB9CisgICAgaWYgKGtleXMua2V5cy5jb250YWlucygiYWJicmV2U2hhIikpIHsKKyAgICAgIE9iamVjdFJlYWRlciByZWFkZXIgPSByZXBvLmdldE9iamVjdERhdGFiYXNlKCkubmV3UmVhZGVyKCk7CisgICAgICB0cnkgeworICAgICAgICBkYXRhLnB1dCgiYWJicmV2U2hhIiwgcmVhZGVyLmFiYnJldmlhdGUoY29tbWl0KS5uYW1lKCkpOworICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgcmVhZGVyLnJlbGVhc2UoKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGtleXMua2V5cy5jb250YWlucygidXJsIikpIHsKKyAgICAgIGRhdGEucHV0KCJ1cmwiLCBHaXRpbGVzVmlldy5yZXZpc2lvbigpCisgICAgICAgICAgLmNvcHlGcm9tKHZpZXcpCisgICAgICAgICAgLnNldFJldmlzaW9uKGNvbW1pdCkKKyAgICAgICAgICAudG9VcmwoKSk7CisgICAgfQorICAgIGlmIChrZXlzLmtleXMuY29udGFpbnMoImxvZ1VybCIpKSB7CisgICAgICBSZXZpc2lvbiByZXYgPSB2aWV3LmdldFJldmlzaW9uKCk7CisgICAgICBHaXRpbGVzVmlldy5CdWlsZGVyIGxvZ1ZpZXcgPSBHaXRpbGVzVmlldy5sb2coKQorICAgICAgICAgIC5jb3B5RnJvbSh2aWV3KQorICAgICAgICAgIC5zZXRSZXZpc2lvbihyZXYuZ2V0SWQoKS5lcXVhbHMoY29tbWl0KSA/IHJldi5nZXROYW1lKCkgOiBjb21taXQubmFtZSgpLCBjb21taXQpCisgICAgICAgICAgLnNldE9sZFJldmlzaW9uKFJldmlzaW9uLk5VTEwpCisgICAgICAgICAgLnNldFRyZWVQYXRoKG51bGwpOworICAgICAgZGF0YS5wdXQoImxvZ1VybCIsIGxvZ1ZpZXcudG9VcmwoKSk7CisgICAgfQorICAgIGlmIChrZXlzLmtleXMuY29udGFpbnMoInRyZWUiKSkgeworICAgICAgZGF0YS5wdXQoInRyZWUiLCBPYmplY3RJZC50b1N0cmluZyhjb21taXQuZ2V0VHJlZSgpKSk7CisgICAgfQorICAgIGlmIChrZXlzLmtleXMuY29udGFpbnMoInRyZWVVcmwiKSkgeworICAgICAgZGF0YS5wdXQoInRyZWVVcmwiLCBHaXRpbGVzVmlldy5wYXRoKCkuY29weUZyb20odmlldykuc2V0VHJlZVBhdGgoIi8iKS50b1VybCgpKTsKKyAgICB9CisgICAgaWYgKGtleXMua2V5cy5jb250YWlucygicGFyZW50cyIpKSB7CisgICAgICBkYXRhLnB1dCgicGFyZW50cyIsIHRvU295RGF0YSh2aWV3LCBjb21taXQuZ2V0UGFyZW50cygpKSk7CisgICAgfQorICAgIGlmIChrZXlzLmtleXMuY29udGFpbnMoInNob3J0TWVzc2FnZSIpKSB7CisgICAgICBkYXRhLnB1dCgic2hvcnRNZXNzYWdlIiwgY29tbWl0LmdldFNob3J0TWVzc2FnZSgpKTsKKyAgICB9CisgICAgaWYgKGtleXMua2V5cy5jb250YWlucygiYnJhbmNoZXMiKSkgeworICAgICAgZGF0YS5wdXQoImJyYW5jaGVzIiwgZ2V0UmVmc0J5SWQoY29tbWl0LCBDb25zdGFudHMuUl9IRUFEUykpOworICAgIH0KKyAgICBpZiAoa2V5cy5rZXlzLmNvbnRhaW5zKCJ0YWdzIikpIHsKKyAgICAgIGRhdGEucHV0KCJ0YWdzIiwgZ2V0UmVmc0J5SWQoY29tbWl0LCBDb25zdGFudHMuUl9UQUdTKSk7CisgICAgfQorICAgIGlmIChrZXlzLmtleXMuY29udGFpbnMoIm1lc3NhZ2UiKSkgeworICAgICAgaWYgKGxpbmtpZmllciAhPSBudWxsKSB7CisgICAgICAgIGRhdGEucHV0KCJtZXNzYWdlIiwgbGlua2lmaWVyLmxpbmtpZnkocmVxLCBjb21taXQuZ2V0RnVsbE1lc3NhZ2UoKSkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZGF0YS5wdXQoIm1lc3NhZ2UiLCBjb21taXQuZ2V0RnVsbE1lc3NhZ2UoKSk7CisgICAgICB9CisgICAgfQorICAgIGlmIChrZXlzLmtleXMuY29udGFpbnMoImRpZmZUcmVlIikpIHsKKyAgICAgIGRhdGEucHV0KCJkaWZmVHJlZSIsIGNvbXB1dGVEaWZmVHJlZShjb21taXQpKTsKKyAgICB9CisgICAgY2hlY2tTdGF0ZShrZXlzLmtleXMuc2l6ZSgpID09IGRhdGEuc2l6ZSgpLCAiYmFkIGNvbW1pdCBkYXRhIGtleXM6ICVzICE9ICVzIiwga2V5cy5rZXlzLAorICAgICAgICBkYXRhLmtleVNldCgpKTsKKyAgICByZXR1cm4gSW1tdXRhYmxlTWFwLmNvcHlPZihkYXRhKTsKKyAgfQorCisgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IHRvU295RGF0YShSZXZDb21taXQgY29tbWl0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiB0b1NveURhdGEoY29tbWl0LCBLZXlTZXQuREVGQVVMVCk7CisgIH0KKworICAvLyBUT0RPKGRib3Jvd2l0eik6IEV4dHJhY3QgdGhpcy4KKyAgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gdG9Tb3lEYXRhKFBlcnNvbklkZW50IGlkZW50LCBHaXREYXRlRm9ybWF0dGVyIGRhdGVGb3JtYXR0ZXIpIHsKKyAgICByZXR1cm4gSW1tdXRhYmxlTWFwLm9mKAorICAgICAgICAibmFtZSIsIGlkZW50LmdldE5hbWUoKSwKKyAgICAgICAgImVtYWlsIiwgaWRlbnQuZ2V0RW1haWxBZGRyZXNzKCksCisgICAgICAgICJ0aW1lIiwgZGF0ZUZvcm1hdHRlci5mb3JtYXREYXRlKGlkZW50KSwKKyAgICAgICAgLy8gVE9ETyhkYm9yb3dpdHopOiBTd2l0Y2ggZnJvbSByZWxhdGl2ZSB0byBhYnNvbHV0ZSBhdCBzb21lIHRocmVzaG9sZC4KKyAgICAgICAgInJlbGF0aXZlVGltZSIsIFJlbGF0aXZlRGF0ZUZvcm1hdHRlci5mb3JtYXQoaWRlbnQuZ2V0V2hlbigpKSk7CisgIH0KKworICBwcml2YXRlIExpc3Q8TWFwPFN0cmluZywgU3RyaW5nPj4gdG9Tb3lEYXRhKEdpdGlsZXNWaWV3IHZpZXcsIFJldkNvbW1pdFtdIHBhcmVudHMpIHsKKyAgICBMaXN0PE1hcDxTdHJpbmcsIFN0cmluZz4+IHJlc3VsdCA9IExpc3RzLm5ld0FycmF5TGlzdFdpdGhDYXBhY2l0eShwYXJlbnRzLmxlbmd0aCk7CisgICAgaW50IGkgPSAxOworICAgIC8vIFRPRE8oZGJvcm93aXR6KTogUmVuZGVyIHNvbWV0aGluZyBzbGlnaHRseSBkaWZmZXJlbnQgd2hlbiB3ZSdyZSBhY3RpdmVseQorICAgIC8vIHZpZXdpbmcgYSBkaWZmIGFnYWluc3Qgb25lIG9mIHRoZSBwYXJlbnRzLgorICAgIGZvciAoUmV2Q29tbWl0IHBhcmVudCA6IHBhcmVudHMpIHsKKyAgICAgIFN0cmluZyBuYW1lID0gcGFyZW50Lm5hbWUoKTsKKyAgICAgIEdpdGlsZXNWaWV3LkJ1aWxkZXIgZGlmZiA9IEdpdGlsZXNWaWV3LmRpZmYoKS5jb3B5RnJvbSh2aWV3KS5zZXRUcmVlUGF0aCgiIik7CisgICAgICBTdHJpbmcgcGFyZW50TmFtZTsKKyAgICAgIGlmIChwYXJlbnRzLmxlbmd0aCA9PSAxKSB7CisgICAgICAgIHBhcmVudE5hbWUgPSB2aWV3LmdldFJldmlzaW9uKCkuZ2V0TmFtZSgpICsgIl4iOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcGFyZW50TmFtZSA9IHZpZXcuZ2V0UmV2aXNpb24oKS5nZXROYW1lKCkgKyAiXiIgKyAoaSsrKTsKKyAgICAgIH0KKyAgICAgIHJlc3VsdC5hZGQoSW1tdXRhYmxlTWFwLm9mKAorICAgICAgICAgICJzaGEiLCBuYW1lLAorICAgICAgICAgICJ1cmwiLCBHaXRpbGVzVmlldy5yZXZpc2lvbigpCisgICAgICAgICAgICAgIC5jb3B5RnJvbSh2aWV3KQorICAgICAgICAgICAgICAuc2V0UmV2aXNpb24ocGFyZW50TmFtZSwgcGFyZW50KQorICAgICAgICAgICAgICAudG9VcmwoKSwKKyAgICAgICAgICAiZGlmZlVybCIsIGRpZmYuc2V0T2xkUmV2aXNpb24ocGFyZW50TmFtZSwgcGFyZW50KS50b1VybCgpKSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwcml2YXRlIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGdldFRyZWVJdGVyYXRvcihSZXZXYWxrIHdhbGssIFJldkNvbW1pdCBjb21taXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgQ2Fub25pY2FsVHJlZVBhcnNlciBwID0gbmV3IENhbm9uaWNhbFRyZWVQYXJzZXIoKTsKKyAgICBwLnJlc2V0KHdhbGsuZ2V0T2JqZWN0UmVhZGVyKCksIHdhbGsucGFyc2VUcmVlKHdhbGsucGFyc2VDb21taXQoY29tbWl0KS5nZXRUcmVlKCkpKTsKKyAgICByZXR1cm4gcDsKKyAgfQorCisgIHByaXZhdGUgT2JqZWN0IGNvbXB1dGVEaWZmVHJlZShSZXZDb21taXQgY29tbWl0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIEFic3RyYWN0VHJlZUl0ZXJhdG9yIG9sZFRyZWU7CisgICAgR2l0aWxlc1ZpZXcuQnVpbGRlciBkaWZmVXJsID0gR2l0aWxlc1ZpZXcuZGlmZigpLmNvcHlGcm9tKHZpZXcpCisgICAgICAgIC5zZXRUcmVlUGF0aCgiIik7CisgICAgc3dpdGNoIChjb21taXQuZ2V0UGFyZW50Q291bnQoKSkgeworICAgICAgY2FzZSAwOgorICAgICAgICBvbGRUcmVlID0gbmV3IEVtcHR5VHJlZUl0ZXJhdG9yKCk7CisgICAgICAgIGRpZmZVcmwuc2V0T2xkUmV2aXNpb24oUmV2aXNpb24uTlVMTCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxOgorICAgICAgICBvbGRUcmVlID0gZ2V0VHJlZUl0ZXJhdG9yKHdhbGssIGNvbW1pdC5nZXRQYXJlbnQoMCkpOworICAgICAgICBkaWZmVXJsLnNldE9sZFJldmlzaW9uKHZpZXcuZ2V0UmV2aXNpb24oKS5nZXROYW1lKCkgKyAiXiIsIGNvbW1pdC5nZXRQYXJlbnQoMCkpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIC8vIFRPRE8oZGJvcm93aXR6KTogaGFuZGxlIG1lcmdlcworICAgICAgICByZXR1cm4gTnVsbERhdGEuSU5TVEFOQ0U7CisgICAgfQorICAgIEFic3RyYWN0VHJlZUl0ZXJhdG9yIG5ld1RyZWUgPSBnZXRUcmVlSXRlcmF0b3Iod2FsaywgY29tbWl0KTsKKworICAgIERpZmZGb3JtYXR0ZXIgZGlmZiA9IG5ldyBEaWZmRm9ybWF0dGVyKE51bGxPdXRwdXRTdHJlYW0uSU5TVEFOQ0UpOworICAgIHRyeSB7CisgICAgICBkaWZmLnNldFJlcG9zaXRvcnkocmVwbyk7CisgICAgICBkaWZmLnNldERldGVjdFJlbmFtZXModHJ1ZSk7CisKKyAgICAgIExpc3Q8T2JqZWN0PiByZXN1bHQgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICAgIGZvciAoRGlmZkVudHJ5IGUgOiBkaWZmLnNjYW4ob2xkVHJlZSwgbmV3VHJlZSkpIHsKKyAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBlbnRyeSA9IE1hcHMubmV3SGFzaE1hcFdpdGhFeHBlY3RlZFNpemUoNSk7CisgICAgICAgIGVudHJ5LnB1dCgicGF0aCIsIGUuZ2V0TmV3UGF0aCgpKTsKKyAgICAgICAgZW50cnkucHV0KCJ1cmwiLCBHaXRpbGVzVmlldy5wYXRoKCkKKyAgICAgICAgICAgIC5jb3B5RnJvbSh2aWV3KQorICAgICAgICAgICAgLnNldFRyZWVQYXRoKGUuZ2V0TmV3UGF0aCgpKQorICAgICAgICAgICAgLnRvVXJsKCkpOworICAgICAgICBlbnRyeS5wdXQoImRpZmZVcmwiLCBkaWZmVXJsLnNldEFuY2hvcigiRiIgKyByZXN1bHQuc2l6ZSgpKS50b1VybCgpKTsKKyAgICAgICAgZW50cnkucHV0KCJjaGFuZ2VUeXBlIiwgZS5nZXRDaGFuZ2VUeXBlKCkudG9TdHJpbmcoKSk7CisgICAgICAgIGlmIChlLmdldENoYW5nZVR5cGUoKSA9PSBDaGFuZ2VUeXBlLkNPUFkgfHwgZS5nZXRDaGFuZ2VUeXBlKCkgPT0gQ2hhbmdlVHlwZS5SRU5BTUUpIHsKKyAgICAgICAgICBlbnRyeS5wdXQoIm9sZFBhdGgiLCBlLmdldE9sZFBhdGgoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0LmFkZChlbnRyeSk7CisgICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0gZmluYWxseSB7CisgICAgICBkaWZmLnJlbGVhc2UoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPE1hcDxTdHJpbmcsIFN0cmluZz4+IE5BTUVfQ09NUEFSQVRPUiA9CisgICAgICBuZXcgQ29tcGFyYXRvcjxNYXA8U3RyaW5nLCBTdHJpbmc+PigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShNYXA8U3RyaW5nLCBTdHJpbmc+IG8xLCBNYXA8U3RyaW5nLCBTdHJpbmc+IG8yKSB7CisgICAgICAgICAgcmV0dXJuIG8xLmdldCgibmFtZSIpLmNvbXBhcmVUbyhvMi5nZXQoIm5hbWUiKSk7CisgICAgICAgIH0KKyAgICAgIH07CisKKyAgcHJpdmF0ZSBMaXN0PE1hcDxTdHJpbmcsIFN0cmluZz4+IGdldFJlZnNCeUlkKE9iamVjdElkIGlkLCBTdHJpbmcgcHJlZml4KSB7CisgICAgY2hlY2tOb3ROdWxsKHJlZnNCeUlkLCAibXVzdCBwYXNzIGluIElEIHRvIHJlZiBtYXAgdG8gbG9vayB1cCByZWZzIGJ5IElEIik7CisgICAgU2V0PFJlZj4gcmVmcyA9IHJlZnNCeUlkLmdldChpZCk7CisgICAgaWYgKHJlZnMgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIEltbXV0YWJsZUxpc3Qub2YoKTsKKyAgICB9CisgICAgTGlzdDxNYXA8U3RyaW5nLCBTdHJpbmc+PiByZXN1bHQgPSBMaXN0cy5uZXdBcnJheUxpc3RXaXRoQ2FwYWNpdHkocmVmcy5zaXplKCkpOworICAgIGZvciAoUmVmIHJlZiA6IHJlZnMpIHsKKyAgICAgIGlmIChyZWYuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgocHJlZml4KSkgeworICAgICAgICByZXN1bHQuYWRkKEltbXV0YWJsZU1hcC5vZigKKyAgICAgICAgICAibmFtZSIsIHJlZi5nZXROYW1lKCkuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgoKSksCisgICAgICAgICAgInVybCIsIEdpdGlsZXNWaWV3LnJldmlzaW9uKCkKKyAgICAgICAgICAgICAgLmNvcHlGcm9tKHZpZXcpCisgICAgICAgICAgICAgIC5zZXRSZXZpc2lvbihSZXZpc2lvbi51bnBlZWxlZChyZWYuZ2V0TmFtZSgpLCByZWYuZ2V0T2JqZWN0SWQoKSkpCisgICAgICAgICAgICAgIC50b1VybCgpKSk7CisgICAgICB9CisgICAgfQorICAgIENvbGxlY3Rpb25zLnNvcnQocmVzdWx0LCBOQU1FX0NPTVBBUkFUT1IpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9Db25maWdVdGlsLmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvQ29uZmlnVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmODczM2IKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvQ29uZmlnVXRpbC5qYXZhCkBAIC0wLDAgKzEsMTQxIEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlZGljYXRlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jYWNoZS5DYWNoZUJ1aWxkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnOworaW1wb3J0IG9yZy5qb2RhLnRpbWUuRHVyYXRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworLyoqIFV0aWxpdGllcyBmb3Igd29ya2luZyB3aXRoIHtAbGluayBDb25maWd9IG9iamVjdHMuICovCitwdWJsaWMgY2xhc3MgQ29uZmlnVXRpbCB7CisgIC8qKgorICAgKiBSZWFkIGEgZHVyYXRpb24gdmFsdWUgZnJvbSB0aGUgY29uZmlndXJhdGlvbi4KKyAgICogPHA+CisgICAqIER1cmF0aW9ucyBjYW4gYmUgd3JpdHRlbiBhcyBleHByZXNzaW9ucywgZm9yIGV4YW1wbGUge0Bjb2RlICIxIHMifSBvcgorICAgKiB7QGNvZGUgIjUgZGF5cyJ9LiBJZiB1bml0cyBhcmUgbm90IHNwZWNpZmllZCwgbWlsbGlzZWNvbmRzIGFyZSBhc3N1bWVkLgorICAgKgorICAgKiBAcGFyYW0gY29uZmlnIEpHaXQgY29uZmlnIG9iamVjdC4KKyAgICogQHBhcmFtIHNlY3Rpb24gc2VjdGlvbiB0byByZWFkLCBlLmcuICJnb29nbGUiCisgICAqIEBwYXJhbSBzdWJzZWN0aW9uIHN1YnNlY3Rpb24gdG8gcmVhZCwgZS5nLiAiYmlndGFibGUiCisgICAqIEBwYXJhbSBuYW1lIHZhcmlhYmxlIHRvIHJlYWQsIGUuZy4gImRlYWRsaW5lIi4KKyAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB2YWx1ZSB0byB1c2Ugd2hlbiB0aGUgdmFsdWUgaXMgbm90IGFzc2lnbmVkLgorICAgKiBAcmV0dXJuIGEgc3RhbmRhcmQgZHVyYXRpb24gcmVwcmVzZW50aW5nIHRoZSB0aW1lIHJlYWQsIG9yIGRlZmF1bHRWYWx1ZS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgRHVyYXRpb24gZ2V0RHVyYXRpb24oQ29uZmlnIGNvbmZpZywgU3RyaW5nIHNlY3Rpb24sIFN0cmluZyBzdWJzZWN0aW9uLCBTdHJpbmcgbmFtZSwKKyAgICAgIER1cmF0aW9uIGRlZmF1bHRWYWx1ZSkgeworICAgIFN0cmluZyB2YWxTdHIgPSBjb25maWcuZ2V0U3RyaW5nKHNlY3Rpb24sIHN1YnNlY3Rpb24sIG5hbWUpOworICAgIGlmICh2YWxTdHIgPT0gbnVsbCkgeworICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgIH0KKworICAgIHZhbFN0ciA9IHZhbFN0ci50cmltKCk7CisgICAgaWYgKHZhbFN0ci5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgfQorCisgICAgTWF0Y2hlciBtID0gbWF0Y2hlcigiXihbMS05XVswLTldKig/OlxcLlswLTldKik/KVxccyooLiopJCIsIHZhbFN0cik7CisgICAgaWYgKCFtLm1hdGNoZXMoKSkgeworICAgICAgU3RyaW5nIGtleSA9IHNlY3Rpb24gKyAoc3Vic2VjdGlvbiAhPSBudWxsID8gIi4iICsgc3Vic2VjdGlvbiA6ICIiKSArICIuIiArIG5hbWU7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJOb3QgdGltZSB1bml0OiAiICsga2V5ICsgIiA9ICIgKyB2YWxTdHIpOworICAgIH0KKworICAgIFN0cmluZyBkaWdpdHMgPSBtLmdyb3VwKDEpOworICAgIFN0cmluZyB1bml0TmFtZSA9IG0uZ3JvdXAoMikudHJpbSgpOworCisgICAgVGltZVVuaXQgdW5pdDsKKyAgICBpZiAoIiIuZXF1YWxzKHVuaXROYW1lKSkgeworICAgICAgdW5pdCA9IFRpbWVVbml0Lk1JTExJU0VDT05EUzsKKyAgICB9IGVsc2UgaWYgKGFueU9mKHVuaXROYW1lLCAibXMiLCAibWlsbGlzIiwgIm1pbGxpc2Vjb25kIiwgIm1pbGxpc2Vjb25kcyIpKSB7CisgICAgICB1bml0ID0gVGltZVVuaXQuTUlMTElTRUNPTkRTOworICAgIH0gZWxzZSBpZiAoYW55T2YodW5pdE5hbWUsICJzIiwgInNlYyIsICJzZWNvbmQiLCAic2Vjb25kcyIpKSB7CisgICAgICB1bml0ID0gVGltZVVuaXQuU0VDT05EUzsKKyAgICB9IGVsc2UgaWYgKGFueU9mKHVuaXROYW1lLCAibSIsICJtaW4iLCAibWludXRlIiwgIm1pbnV0ZXMiKSkgeworICAgICAgdW5pdCA9IFRpbWVVbml0Lk1JTlVURVM7CisgICAgfSBlbHNlIGlmIChhbnlPZih1bml0TmFtZSwgImgiLCAiaHIiLCAiaG91ciIsICJob3VycyIpKSB7CisgICAgICB1bml0ID0gVGltZVVuaXQuSE9VUlM7CisgICAgfSBlbHNlIGlmIChhbnlPZih1bml0TmFtZSwgImQiLCAiZGF5IiwgImRheXMiKSkgeworICAgICAgdW5pdCA9IFRpbWVVbml0LkRBWVM7CisgICAgfSBlbHNlIHsKKyAgICAgIFN0cmluZyBrZXkgPSBzZWN0aW9uICsgKHN1YnNlY3Rpb24gIT0gbnVsbCA/ICIuIiArIHN1YnNlY3Rpb24gOiAiIikgKyAiLiIgKyBuYW1lOworICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm90IHRpbWUgdW5pdDogIiArIGtleSArICIgPSAiICsgdmFsU3RyKTsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgaWYgKGRpZ2l0cy5pbmRleE9mKCcuJykgPT0gLTEpIHsKKyAgICAgICAgbG9uZyB2YWwgPSBMb25nLnBhcnNlTG9uZyhkaWdpdHMpOworICAgICAgICByZXR1cm4gbmV3IER1cmF0aW9uKHZhbCAqIFRpbWVVbml0Lk1JTExJU0VDT05EUy5jb252ZXJ0KDEsIHVuaXQpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRvdWJsZSB2YWwgPSBEb3VibGUucGFyc2VEb3VibGUoZGlnaXRzKTsKKyAgICAgICAgcmV0dXJuIG5ldyBEdXJhdGlvbigobG9uZykgKHZhbCAqIFRpbWVVbml0Lk1JTExJU0VDT05EUy5jb252ZXJ0KDEsIHVuaXQpKSk7CisgICAgICB9CisgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgeworICAgICAgU3RyaW5nIGtleSA9IHNlY3Rpb24gKyAoc3Vic2VjdGlvbiAhPSBudWxsID8gIi4iICsgc3Vic2VjdGlvbiA6ICIiKSArICIuIiArIG5hbWU7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJOb3QgdGltZSB1bml0OiAiICsga2V5ICsgIiA9ICIgKyB2YWxTdHIsIG5mZSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEdldCBhIHtAbGluayBDYWNoZUJ1aWxkZXJ9IGZyb20gYSBjb25maWcuCisgICAqCisgICAqIEBwYXJhbSBjb25maWcgSkdpdCBjb25maWcgb2JqZWN0LgorICAgKiBAcGFyYW0gbmFtZSBuYW1lIG9mIHRoZSBjYWNoZSBzdWJzZWN0aW9uIHVuZGVyIHRoZSAiY2FjaGUiIHNlY3Rpb24uCisgICAqIEByZXR1cm4gYSBuZXcgY2FjaGUgYnVpbGRlci4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgQ2FjaGVCdWlsZGVyPE9iamVjdCwgT2JqZWN0PiBnZXRDYWNoZUJ1aWxkZXIoQ29uZmlnIGNvbmZpZywgU3RyaW5nIG5hbWUpIHsKKyAgICBDYWNoZUJ1aWxkZXI8T2JqZWN0LCBPYmplY3Q+IGIgPSBDYWNoZUJ1aWxkZXIubmV3QnVpbGRlcigpOworICAgIHRyeSB7CisgICAgICBpZiAoY29uZmlnLmdldFN0cmluZygiY2FjaGUiLCBuYW1lLCAibWF4aW11bVdlaWdodCIpICE9IG51bGwpIHsKKyAgICAgICAgYi5tYXhpbXVtV2VpZ2h0KGNvbmZpZy5nZXRMb25nKCJjYWNoZSIsIG5hbWUsICJtYXhpbXVtV2VpZ2h0IiwgMjAgPDwgMjApKTsKKyAgICAgIH0KKyAgICAgIGlmIChjb25maWcuZ2V0U3RyaW5nKCJjYWNoZSIsIG5hbWUsICJtYXhpbXVtU2l6ZSIpICE9IG51bGwpIHsKKyAgICAgICAgYi5tYXhpbXVtU2l6ZShjb25maWcuZ2V0TG9uZygiY2FjaGUiLCBuYW1lLCAibWF4aW11bVNpemUiLCAxNjM4NCkpOworICAgICAgfQorICAgICAgRHVyYXRpb24gZXhwaXJlQWZ0ZXJXcml0ZSA9IGdldER1cmF0aW9uKGNvbmZpZywgImNhY2hlIiwgbmFtZSwgImV4cGlyZUFmdGVyV3JpdGUiLCBudWxsKTsKKyAgICAgIGlmIChleHBpcmVBZnRlcldyaXRlICE9IG51bGwpIHsKKyAgICAgICAgYi5leHBpcmVBZnRlcldyaXRlKGV4cGlyZUFmdGVyV3JpdGUuZ2V0TWlsbGlzKCksIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICB9CisgICAgICBEdXJhdGlvbiBleHBpcmVBZnRlckFjY2VzcyA9IGdldER1cmF0aW9uKGNvbmZpZywgImNhY2hlIiwgbmFtZSwgImV4cGlyZUFmdGVyQWNjZXNzIiwgbnVsbCk7CisgICAgICBpZiAoZXhwaXJlQWZ0ZXJBY2Nlc3MgIT0gbnVsbCkgeworICAgICAgICBiLmV4cGlyZUFmdGVyQWNjZXNzKGV4cGlyZUFmdGVyQWNjZXNzLmdldE1pbGxpcygpLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgfQorICAgICAgLy8gQWRkIG90aGVyIG1ldGhvZHMgYXMgbmVlZGVkLgorICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFcnJvciBnZXR0aW5nIENhY2hlQnVpbGRlciBmb3IgIiArIG5hbWUsIGUpOworICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFcnJvciBnZXR0aW5nIENhY2hlQnVpbGRlciBmb3IgIiArIG5hbWUsIGUpOworICAgIH0KKyAgICByZXR1cm4gYjsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIE1hdGNoZXIgbWF0Y2hlcihTdHJpbmcgcGF0dGVybiwgU3RyaW5nIHZhbFN0cikgeworICAgICAgcmV0dXJuIFBhdHRlcm4uY29tcGlsZShwYXR0ZXJuKS5tYXRjaGVyKHZhbFN0cik7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGFueU9mKFN0cmluZyBhLCBTdHJpbmcuLi4gY2FzZXMpIHsKKyAgICByZXR1cm4gSXRlcmFibGVzLmFueShJbW11dGFibGVMaXN0LmNvcHlPZihjYXNlcyksCisgICAgICAgIFByZWRpY2F0ZXMuZXF1YWxUbyhhLnRvTG93ZXJDYXNlKCkpKTsKKyAgfQorCisgIHByaXZhdGUgQ29uZmlnVXRpbCgpIHsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0RlYnVnUmVuZGVyZXIuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9EZWJ1Z1JlbmRlcmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU2NTE4YQotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9EZWJ1Z1JlbmRlcmVyLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrU3RhdGU7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkZ1bmN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOworaW1wb3J0IGNvbS5nb29nbGUudGVtcGxhdGUuc295LlNveUZpbGVTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS50ZW1wbGF0ZS5zb3kudG9mdS5Tb3lUb2Z1OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKKy8qKiBSZW5kZXJlciB0aGF0IHJlbG9hZHMgU295IHRlbXBsYXRlcyBmcm9tIHRoZSBmaWxlc3lzdGVtIG9uIGV2ZXJ5IHJlcXVlc3QuICovCitwdWJsaWMgY2xhc3MgRGVidWdSZW5kZXJlciBleHRlbmRzIFJlbmRlcmVyIHsKKyAgcHVibGljIERlYnVnUmVuZGVyZXIoU3RyaW5nIHN0YXRpY1ByZWZpeCwgU3RyaW5nIGN1c3RvbVRlbXBsYXRlc0ZpbGVuYW1lLAorICAgICAgZmluYWwgU3RyaW5nIHNveVRlbXBsYXRlc1Jvb3QpIHsKKyAgICBzdXBlcigKKyAgICAgICAgbmV3IEZ1bmN0aW9uPFN0cmluZywgVVJMPigpIHsKKyAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICBwdWJsaWMgVVJMIGFwcGx5KFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICByZXR1cm4gdG9GaWxlVVJMKHNveVRlbXBsYXRlc1Jvb3QgKyBGaWxlLnNlcGFyYXRvciArIG5hbWUpOworICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgSW1tdXRhYmxlTWFwLjxTdHJpbmcsIFN0cmluZz4gb2YoKSwgc3RhdGljUHJlZml4LAorICAgICAgICB0b0ZpbGVVUkwoY3VzdG9tVGVtcGxhdGVzRmlsZW5hbWUpKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgU295VG9mdSBnZXRUb2Z1KCkgeworICAgIFNveUZpbGVTZXQuQnVpbGRlciBidWlsZGVyID0gbmV3IFNveUZpbGVTZXQuQnVpbGRlcigpCisgICAgICAgIC5zZXRDb21waWxlVGltZUdsb2JhbHMoZ2xvYmFscyk7CisgICAgZm9yIChVUkwgdGVtcGxhdGUgOiB0ZW1wbGF0ZXMpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGNoZWNrU3RhdGUobmV3IEZpbGUodGVtcGxhdGUudG9VUkkoKSkuZXhpc3RzKCksICJNaXNzaW5nIFNveSB0ZW1wbGF0ZSAlcyIsIHRlbXBsYXRlKTsKKyAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZSk7CisgICAgICB9CisgICAgICBidWlsZGVyLmFkZCh0ZW1wbGF0ZSk7CisgICAgfQorICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCkuY29tcGlsZVRvVG9mdSgpOworICB9Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvRGVmYXVsdEFjY2Vzcy5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0RlZmF1bHRBY2Nlc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjZkODIyCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0RlZmF1bHRBY2Nlc3MuamF2YQpAQCAtMCwwICsxLDIzOSBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuUXVldWVzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuQ29uZmlnSW52YWxpZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5SZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci5TZXJ2bGV0VXRpbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuU3RvcmVkQ29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyLkZpbGVSZXNvbHZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlci5TZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuSU87CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5RdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKKworLyoqCisgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBHaXRpbGVzQWNjZXNzfSB3aXRoIGxvY2FsIHJlcG9zaXRvcmllcy4KKyAqIDxwPgorICogUmVwb3NpdG9yaWVzIGFyZSBzY2FubmVkIG9uLWRlbWFuZCB1bmRlciB0aGUgZ2l2ZW4gcGF0aCwgY29uZmlndXJlZCBieQorICogZGVmYXVsdCBmcm9tIHtAY29kZSBnaXRpbGVzLmJhc2VQYXRofS4gVGhlcmUgaXMgbm8gYWNjZXNzIGNvbnRyb2wgYmV5b25kIHdoYXQKKyAqIHVzZXIgdGhlIEpWTSBpcyBydW5uaW5nIHVuZGVyLgorICovCitwdWJsaWMgY2xhc3MgRGVmYXVsdEFjY2VzcyBpbXBsZW1lbnRzIEdpdGlsZXNBY2Nlc3MgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5PTllNT1VTX1VTRVJfS0VZID0gImFub255bW91cyB1c2VyIjsKKworICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3RvcnkgaW1wbGVtZW50cyBHaXRpbGVzQWNjZXNzLkZhY3RvcnkgeworICAgIHByaXZhdGUgZmluYWwgRmlsZSBiYXNlUGF0aDsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBjYW5vbmljYWxCYXNlUGF0aDsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBiYXNlR2l0VXJsOworICAgIHByaXZhdGUgZmluYWwgRmlsZVJlc29sdmVyPEh0dHBTZXJ2bGV0UmVxdWVzdD4gcmVzb2x2ZXI7CisKKyAgICBGYWN0b3J5KEZpbGUgYmFzZVBhdGgsIFN0cmluZyBiYXNlR2l0VXJsLCBGaWxlUmVzb2x2ZXI8SHR0cFNlcnZsZXRSZXF1ZXN0PiByZXNvbHZlcikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIHRoaXMuYmFzZVBhdGggPSBjaGVja05vdE51bGwoYmFzZVBhdGgsICJiYXNlUGF0aCIpOworICAgICAgdGhpcy5iYXNlR2l0VXJsID0gY2hlY2tOb3ROdWxsKGJhc2VHaXRVcmwsICJiYXNlR2l0VXJsIik7CisgICAgICB0aGlzLnJlc29sdmVyID0gY2hlY2tOb3ROdWxsKHJlc29sdmVyLCAicmVzb2x2ZXIiKTsKKyAgICAgIHRoaXMuY2Fub25pY2FsQmFzZVBhdGggPSBiYXNlUGF0aC5nZXRDYW5vbmljYWxQYXRoKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEdpdGlsZXNBY2Nlc3MgZm9yUmVxdWVzdChIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisgICAgICBTdHJpbmcgcGF0aCA9IHJlcS5nZXRQYXRoSW5mbygpOworICAgICAgU3RyaW5nIHJlcG9zaXRvcnlQYXRoOworICAgICAgaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoID09ICIvIikgeworICAgICAgICByZXBvc2l0b3J5UGF0aCA9IG51bGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnQgc2xhc2hQbHVzID0gcGF0aC5pbmRleE9mKCIvKy8iKTsKKyAgICAgICAgaWYgKHNsYXNoUGx1cyA+PSAwKSB7CisgICAgICAgICAgcmVwb3NpdG9yeVBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBzbGFzaFBsdXMpOworICAgICAgICB9IGVsc2UgaWYgKHBhdGguZW5kc1dpdGgoIi8rIikpIHsKKyAgICAgICAgICByZXBvc2l0b3J5UGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoKCkgLSAyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXBvc2l0b3J5UGF0aCA9IHBhdGg7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBuZXdBY2Nlc3MoYmFzZVBhdGgsIGNhbm9uaWNhbEJhc2VQYXRoLCBiYXNlR2l0VXJsLCByZXNvbHZlciwgcmVxKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgRGVmYXVsdEFjY2VzcyBuZXdBY2Nlc3MoRmlsZSBiYXNlUGF0aCwgU3RyaW5nIGNhbm9uaWNhbEJhc2VQYXRoLCBTdHJpbmcgYmFzZUdpdFVybCwKKyAgICAgICAgRmlsZVJlc29sdmVyPEh0dHBTZXJ2bGV0UmVxdWVzdD4gcmVzb2x2ZXIsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKyAgICAgIHJldHVybiBuZXcgRGVmYXVsdEFjY2VzcyhiYXNlUGF0aCwgY2Fub25pY2FsQmFzZVBhdGgsIGJhc2VHaXRVcmwsIHJlc29sdmVyLCByZXEpOworICAgIH0KKyAgfQorCisgIHByb3RlY3RlZCBmaW5hbCBGaWxlIGJhc2VQYXRoOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGNhbm9uaWNhbEJhc2VQYXRoOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGJhc2VHaXRVcmw7CisgIHByb3RlY3RlZCBmaW5hbCBGaWxlUmVzb2x2ZXI8SHR0cFNlcnZsZXRSZXF1ZXN0PiByZXNvbHZlcjsKKyAgcHJvdGVjdGVkIGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXE7CisKKyAgcHJvdGVjdGVkIERlZmF1bHRBY2Nlc3MoRmlsZSBiYXNlUGF0aCwgU3RyaW5nIGNhbm9uaWNhbEJhc2VQYXRoLCBTdHJpbmcgYmFzZUdpdFVybCwKKyAgICAgIEZpbGVSZXNvbHZlcjxIdHRwU2VydmxldFJlcXVlc3Q+IHJlc29sdmVyLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisgICAgdGhpcy5iYXNlUGF0aCA9IGNoZWNrTm90TnVsbChiYXNlUGF0aCwgImJhc2VQYXRoIik7CisgICAgdGhpcy5jYW5vbmljYWxCYXNlUGF0aCA9IGNoZWNrTm90TnVsbChjYW5vbmljYWxCYXNlUGF0aCwgImNhbm9uaWNhbEJhc2VQYXRoIik7CisgICAgdGhpcy5iYXNlR2l0VXJsID0gY2hlY2tOb3ROdWxsKGJhc2VHaXRVcmwsICJiYXNlR2l0VXJsIik7CisgICAgdGhpcy5yZXNvbHZlciA9IGNoZWNrTm90TnVsbChyZXNvbHZlciwgInJlc29sdmVyIik7CisgICAgdGhpcy5yZXEgPSBjaGVja05vdE51bGwocmVxLCAicmVxIik7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIE1hcDxTdHJpbmcsIFJlcG9zaXRvcnlEZXNjcmlwdGlvbj4gbGlzdFJlcG9zaXRvcmllcyhTZXQ8U3RyaW5nPiBicmFuY2hlcykKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgTWFwPFN0cmluZywgUmVwb3NpdG9yeURlc2NyaXB0aW9uPiByZXBvcyA9IE1hcHMubmV3VHJlZU1hcCgpOworICAgIGZvciAoUmVwb3NpdG9yeSByZXBvIDogc2NhblJlcG9zaXRvcmllcyhiYXNlUGF0aCwgcmVxKSkgeworICAgICAgcmVwb3MucHV0KGdldFJlcG9zaXRvcnlOYW1lKHJlcG8pLCBidWlsZERlc2NyaXB0aW9uKHJlcG8sIGJyYW5jaGVzKSk7CisgICAgICByZXBvLmNsb3NlKCk7CisgICAgfQorICAgIHJldHVybiByZXBvczsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgT2JqZWN0IGdldFVzZXJLZXkoKSB7CisgICAgLy8gQWx3YXlzIHJldHVybiB0aGUgc2FtZSBhbm9ueW1vdXMgdXNlciBrZXkgKGVmZmVjdGl2ZWx5IHJ1bm5pbmcgd2l0aCB0aGUKKyAgICAvLyBzYW1lIHVzZXIgcGVybWlzc2lvbnMgYXMgdGhlIEpWTSkuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgYmVoYXZpb3IuCisgICAgcmV0dXJuIEFOT05ZTU9VU19VU0VSX0tFWTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldFJlcG9zaXRvcnlOYW1lKCkgeworICAgIHJldHVybiBnZXRSZXBvc2l0b3J5TmFtZShTZXJ2bGV0VXRpbHMuZ2V0UmVwb3NpdG9yeShyZXEpKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgUmVwb3NpdG9yeURlc2NyaXB0aW9uIGdldFJlcG9zaXRvcnlEZXNjcmlwdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGJ1aWxkRGVzY3JpcHRpb24oU2VydmxldFV0aWxzLmdldFJlcG9zaXRvcnkocmVxKSwgQ29sbGVjdGlvbnMuPFN0cmluZz4gZW1wdHlTZXQoKSk7CisgIH0KKworICBwcml2YXRlIFN0cmluZyBnZXRSZXBvc2l0b3J5TmFtZShSZXBvc2l0b3J5IHJlcG8pIHsKKyAgICBTdHJpbmcgcGF0aCA9IGdldFJlbGF0aXZlUGF0aChyZXBvKTsKKyAgICBpZiAocmVwby5pc0JhcmUoKSAmJiBwYXRoLmVuZHNXaXRoKCIuZ2l0IikpIHsKKyAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxlbmd0aCgpIC0gNCk7CisgICAgfQorICAgIHJldHVybiBwYXRoOworICB9CisKKyAgcHJpdmF0ZSBTdHJpbmcgZ2V0UmVsYXRpdmVQYXRoKFJlcG9zaXRvcnkgcmVwbykgeworICAgIFN0cmluZyBwYXRoID0gcmVwby5pc0JhcmUoKSA/IHJlcG8uZ2V0RGlyZWN0b3J5KCkuZ2V0UGF0aCgpIDogcmVwby5nZXREaXJlY3RvcnkoKS5nZXRQYXJlbnQoKTsKKyAgICBpZiAocmVwby5pc0JhcmUoKSkgeworICAgICAgcGF0aCA9IHJlcG8uZ2V0RGlyZWN0b3J5KCkuZ2V0UGF0aCgpOworICAgICAgaWYgKHBhdGguZW5kc1dpdGgoIi5naXQiKSkgeworICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sZW5ndGgoKSAtIDQpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBwYXRoID0gcmVwby5nZXREaXJlY3RvcnkoKS5nZXRQYXJlbnQoKTsKKyAgICB9CisgICAgcmV0dXJuIGdldFJlbGF0aXZlUGF0aChwYXRoKTsKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIGdldFJlbGF0aXZlUGF0aChTdHJpbmcgcGF0aCkgeworICAgIFN0cmluZyBiYXNlID0gYmFzZVBhdGguZ2V0UGF0aCgpOworICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoYmFzZSkpIHsKKyAgICAgIHJldHVybiBwYXRoLnN1YnN0cmluZyhiYXNlLmxlbmd0aCgpICsgMSk7CisgICAgfQorICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoY2Fub25pY2FsQmFzZVBhdGgpKSB7CisgICAgICByZXR1cm4gcGF0aC5zdWJzdHJpbmcoY2Fub25pY2FsQmFzZVBhdGgubGVuZ3RoKCkgKyAxKTsKKyAgICB9CisgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICJSZXBvc2l0b3J5IHBhdGggJXMgaXMgb3V0c2lkZSBiYXNlIHBhdGggJXMiLCBwYXRoLCBiYXNlKSk7CisgIH0KKworICBwcml2YXRlIFN0cmluZyBsb2FkRGVzY3JpcHRpb25UZXh0KFJlcG9zaXRvcnkgcmVwbykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgZGVzYyA9IG51bGw7CisgICAgU3RvcmVkQ29uZmlnIGNvbmZpZyA9IHJlcG8uZ2V0Q29uZmlnKCk7CisgICAgSU9FeGNlcHRpb24gY29uZmlnRXJyb3IgPSBudWxsOworICAgIHRyeSB7CisgICAgICBjb25maWcubG9hZCgpOworICAgICAgZGVzYyA9IGNvbmZpZy5nZXRTdHJpbmcoImdpdHdlYiIsIG51bGwsICJkZXNjcmlwdGlvbiIpOworICAgIH0gY2F0Y2ggKENvbmZpZ0ludmFsaWRFeGNlcHRpb24gZSkgeworICAgICAgY29uZmlnRXJyb3IgPSBuZXcgSU9FeGNlcHRpb24oZSk7CisgICAgfQorICAgIGlmIChkZXNjID09IG51bGwpIHsKKyAgICAgIEZpbGUgZGVzY0ZpbGUgPSBuZXcgRmlsZShyZXBvLmdldERpcmVjdG9yeSgpLCAiZGVzY3JpcHRpb24iKTsKKyAgICAgIGlmIChkZXNjRmlsZS5leGlzdHMoKSkgeworICAgICAgICBkZXNjID0gbmV3IFN0cmluZyhJTy5yZWFkRnVsbHkoZGVzY0ZpbGUpKTsKKyAgICAgIH0gZWxzZSBpZiAoY29uZmlnRXJyb3IgIT0gbnVsbCkgeworICAgICAgICB0aHJvdyBjb25maWdFcnJvcjsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRlc2M7CisgIH0KKworICBwcml2YXRlIFJlcG9zaXRvcnlEZXNjcmlwdGlvbiBidWlsZERlc2NyaXB0aW9uKFJlcG9zaXRvcnkgcmVwbywgU2V0PFN0cmluZz4gYnJhbmNoZXMpCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIFJlcG9zaXRvcnlEZXNjcmlwdGlvbiBkZXNjID0gbmV3IFJlcG9zaXRvcnlEZXNjcmlwdGlvbigpOworICAgIGRlc2MubmFtZSA9IGdldFJlcG9zaXRvcnlOYW1lKHJlcG8pOworICAgIGRlc2MuY2xvbmVVcmwgPSBiYXNlR2l0VXJsICsgZ2V0UmVsYXRpdmVQYXRoKHJlcG8pOworICAgIGRlc2MuZGVzY3JpcHRpb24gPSBsb2FkRGVzY3JpcHRpb25UZXh0KHJlcG8pOworICAgIGlmICghYnJhbmNoZXMuaXNFbXB0eSgpKSB7CisgICAgICBkZXNjLmJyYW5jaGVzID0gTWFwcy5uZXdMaW5rZWRIYXNoTWFwKCk7CisgICAgICBmb3IgKFN0cmluZyBuYW1lIDogYnJhbmNoZXMpIHsKKyAgICAgICAgUmVmIHJlZiA9IHJlcG8uZ2V0UmVmKG5vcm1hbGl6ZVJlZk5hbWUobmFtZSkpOworICAgICAgICBpZiAoKHJlZiAhPSBudWxsKSAmJiAocmVmLmdldE9iamVjdElkKCkgIT0gbnVsbCkpIHsKKyAgICAgICAgICBkZXNjLmJyYW5jaGVzLnB1dChuYW1lLCByZWYuZ2V0T2JqZWN0SWQoKS5uYW1lKCkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBkZXNjOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG5vcm1hbGl6ZVJlZk5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICBpZiAobmFtZS5zdGFydHNXaXRoKCJyZWZzLyIpKSB7CisgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisgICAgcmV0dXJuICJyZWZzL2hlYWRzLyIgKyBuYW1lOworICB9CisKKyAgcHJpdmF0ZSBDb2xsZWN0aW9uPFJlcG9zaXRvcnk+IHNjYW5SZXBvc2l0b3JpZXMoZmluYWwgRmlsZSBiYXNlUGF0aCwgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBMaXN0PFJlcG9zaXRvcnk+IHJlcG9zID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgUXVldWU8RmlsZT4gdG9kbyA9IFF1ZXVlcy5uZXdBcnJheURlcXVlKCk7CisgICAgRmlsZVtdIGJhc2VGaWxlcyA9IGJhc2VQYXRoLmxpc3RGaWxlcygpOworICAgIGlmIChiYXNlRmlsZXMgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJiYXNlIHBhdGggaXMgbm90IGEgZGlyZWN0b3J5OiAiICsgYmFzZVBhdGguZ2V0UGF0aCgpKTsKKyAgICB9CisgICAgdG9kby5hZGRBbGwoQXJyYXlzLmFzTGlzdChiYXNlRmlsZXMpKTsKKyAgICB3aGlsZSAoIXRvZG8uaXNFbXB0eSgpKSB7CisgICAgICBGaWxlIGZpbGUgPSB0b2RvLnJlbW92ZSgpOworICAgICAgdHJ5IHsKKyAgICAgICAgcmVwb3MuYWRkKHJlc29sdmVyLm9wZW4ocmVxLCBnZXRSZWxhdGl2ZVBhdGgoZmlsZS5nZXRQYXRoKCkpKSk7CisgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICBGaWxlW10gY2hpbGRyZW4gPSBmaWxlLmxpc3RGaWxlcygpOworICAgICAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCkgeworICAgICAgICAgIHRvZG8uYWRkQWxsKEFycmF5cy5hc0xpc3QoY2hpbGRyZW4pKTsKKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoU2VydmljZU5vdEVuYWJsZWRFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oZSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXBvczsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0RlZmF1bHRSZW5kZXJlci5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0RlZmF1bHRSZW5kZXJlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YmQxZmIKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvRGVmYXVsdFJlbmRlcmVyLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkZ1bmN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmlvLlJlc291cmNlczsKK2ltcG9ydCBjb20uZ29vZ2xlLnRlbXBsYXRlLnNveS5Tb3lGaWxlU2V0OworaW1wb3J0IGNvbS5nb29nbGUudGVtcGxhdGUuc295LnRvZnUuU295VG9mdTsKKworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKiogUmVuZGVyZXIgdGhhdCBwcmVjb21waWxlcyBTb3kgYW5kIHVzZXMgc3RhdGljIHByZWNvbXBpbGVkIENTUy4gKi8KK3B1YmxpYyBjbGFzcyBEZWZhdWx0UmVuZGVyZXIgZXh0ZW5kcyBSZW5kZXJlciB7CisgIHByaXZhdGUgZmluYWwgU295VG9mdSB0b2Z1OworCisgIERlZmF1bHRSZW5kZXJlcigpIHsKKyAgICB0aGlzKCIiLCBudWxsKTsKKyAgfQorCisgIHB1YmxpYyBEZWZhdWx0UmVuZGVyZXIoU3RyaW5nIHN0YXRpY1ByZWZpeCwgVVJMIGN1c3RvbVRlbXBsYXRlcykgeworICAgIHRoaXMoSW1tdXRhYmxlTWFwLjxTdHJpbmcsIFN0cmluZz4gb2YoKSwgc3RhdGljUHJlZml4LCBjdXN0b21UZW1wbGF0ZXMpOworICB9CisKKyAgcHVibGljIERlZmF1bHRSZW5kZXJlcihNYXA8U3RyaW5nLCBTdHJpbmc+IGdsb2JhbHMsIFN0cmluZyBzdGF0aWNQcmVmaXgsIFVSTCBjdXN0b21UZW1wbGF0ZXMpIHsKKyAgICBzdXBlcigKKyAgICAgICAgbmV3IEZ1bmN0aW9uPFN0cmluZywgVVJMPigpIHsKKyAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICBwdWJsaWMgVVJMIGFwcGx5KFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzb3VyY2VzLmdldFJlc291cmNlKFJlbmRlcmVyLmNsYXNzLCAidGVtcGxhdGVzLyIgKyBuYW1lKTsKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIGdsb2JhbHMsIHN0YXRpY1ByZWZpeCwgY3VzdG9tVGVtcGxhdGVzKTsKKyAgICBTb3lGaWxlU2V0LkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTb3lGaWxlU2V0LkJ1aWxkZXIoKQorICAgICAgICAuc2V0Q29tcGlsZVRpbWVHbG9iYWxzKHRoaXMuZ2xvYmFscyk7CisgICAgZm9yIChVUkwgdGVtcGxhdGUgOiB0ZW1wbGF0ZXMpIHsKKyAgICAgIGJ1aWxkZXIuYWRkKHRlbXBsYXRlKTsKKyAgICB9CisgICAgdG9mdSA9IGJ1aWxkZXIuYnVpbGQoKS5jb21waWxlVG9Ub2Z1KCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIFNveVRvZnUgZ2V0VG9mdSgpIHsKKyAgICByZXR1cm4gdG9mdTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0RlZmF1bHRVcmxzLmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvRGVmYXVsdFVybHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDk1YjVkCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0RlZmF1bHRVcmxzLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKKworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKKworLyoqCisgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBHaXRpbGVzVXJsc30uCisgKiA8cD4KKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyBzdGF0aWNhbGx5LWNvbmZpZ3VyZWQgZGVmYXVsdHMsIGFuZCB0aHVzIGFzc3VtZXMKKyAqIHRoYXQgdGhlIHNlcnZsZXQgaXMgcnVubmluZyBhIHNpbmdsZSB2aXJ0dWFsIGhvc3QuCisgKi8KK2NsYXNzIERlZmF1bHRVcmxzIGltcGxlbWVudHMgR2l0aWxlc1VybHMgeworICBwcml2YXRlIGZpbmFsIFN0cmluZyBjYW5vbmljYWxIb3N0TmFtZTsKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYmFzZUdpdFVybDsKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYmFzZUdlcnJpdFVybDsKKworICBEZWZhdWx0VXJscyhTdHJpbmcgY2Fub25pY2FsSG9zdE5hbWUsIFN0cmluZyBiYXNlR2l0VXJsLCBTdHJpbmcgYmFzZUdlcnJpdFVybCkKKyAgICAgIHRocm93cyBVbmtub3duSG9zdEV4Y2VwdGlvbiB7CisgICAgaWYgKGNhbm9uaWNhbEhvc3ROYW1lICE9IG51bGwpIHsKKyAgICAgIHRoaXMuY2Fub25pY2FsSG9zdE5hbWUgPSBjYW5vbmljYWxIb3N0TmFtZTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5jYW5vbmljYWxIb3N0TmFtZSA9IEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLmdldENhbm9uaWNhbEhvc3ROYW1lKCk7CisgICAgfQorICAgIHRoaXMuYmFzZUdpdFVybCA9IGNoZWNrTm90TnVsbChiYXNlR2l0VXJsLCAiYmFzZUdpdFVybCIpOworICAgIHRoaXMuYmFzZUdlcnJpdFVybCA9IGNoZWNrTm90TnVsbChiYXNlR2Vycml0VXJsLCAiYmFzZUdlcnJpdFVybCIpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0SG9zdE5hbWUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworICAgIHJldHVybiBjYW5vbmljYWxIb3N0TmFtZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldEJhc2VHaXRVcmwoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworICAgIHJldHVybiBiYXNlR2l0VXJsOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0QmFzZUdlcnJpdFVybChIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisgICAgcmV0dXJuIGJhc2VHZXJyaXRVcmw7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9EaWZmU2VydmxldC5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0RpZmZTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQwOGNkNwotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9EaWZmU2VydmxldC5qYXZhCkBAIC0wLDAgKzEsMTYyIEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworaW1wb3J0IHN0YXRpYyBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19OT1RfRk9VTkQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkNoYXJzZXRzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5kaWZmLkRpZmZGb3JtYXR0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5NaXNzaW5nT2JqZWN0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuU2VydmxldFV0aWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2V2FsazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLkFic3RyYWN0VHJlZUl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuQ2Fub25pY2FsVHJlZVBhcnNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLkVtcHR5VHJlZUl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyLlBhdGhGaWx0ZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKKy8qKiBTZXJ2ZXMgYW4gSFRNTCBwYWdlIHdpdGggYWxsIHRoZSBkaWZmcyBmb3IgYSBjb21taXQuICovCitwdWJsaWMgY2xhc3MgRGlmZlNlcnZsZXQgZXh0ZW5kcyBCYXNlU2VydmxldCB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTEFDRUhPTERFUiA9ICJpZD1cIkRJRkZfT1VUUFVUX0JMT0NLXCIiOworCisgIHByaXZhdGUgZmluYWwgTGlua2lmaWVyIGxpbmtpZmllcjsKKworICBwdWJsaWMgRGlmZlNlcnZsZXQoUmVuZGVyZXIgcmVuZGVyZXIsIExpbmtpZmllciBsaW5raWZpZXIpIHsKKyAgICBzdXBlcihyZW5kZXJlcik7CisgICAgdGhpcy5saW5raWZpZXIgPSBjaGVja05vdE51bGwobGlua2lmaWVyLCAibGlua2lmaWVyIik7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgR2l0aWxlc1ZpZXcgdmlldyA9IFZpZXdGaWx0ZXIuZ2V0VmlldyhyZXEpOworICAgIFJlcG9zaXRvcnkgcmVwbyA9IFNlcnZsZXRVdGlscy5nZXRSZXBvc2l0b3J5KHJlcSk7CisKKyAgICBSZXZXYWxrIHdhbGsgPSBuZXcgUmV2V2FsayhyZXBvKTsKKyAgICB0cnkgeworICAgICAgYm9vbGVhbiBzaG93Q29tbWl0OworICAgICAgQWJzdHJhY3RUcmVlSXRlcmF0b3Igb2xkVHJlZTsKKyAgICAgIEFic3RyYWN0VHJlZUl0ZXJhdG9yIG5ld1RyZWU7CisgICAgICB0cnkgeworICAgICAgICAvLyBJZiB3ZSBhcmUgdmlld2luZyB0aGUgZGlmZiBiZXR3ZWVuIGEgY29tbWl0IGFuZCBvbmUgb2YgaXRzIHBhcmVudHMsCisgICAgICAgIC8vIGluY2x1ZGUgdGhlIGNvbW1pdCBkZXRhaWwgaW4gdGhlIHJlbmRlcmVkIHBhZ2UuCisgICAgICAgIHNob3dDb21taXQgPSBpc1BhcmVudE9mKHdhbGssIHZpZXcuZ2V0T2xkUmV2aXNpb24oKSwgdmlldy5nZXRSZXZpc2lvbigpKTsKKyAgICAgICAgb2xkVHJlZSA9IGdldFRyZWVJdGVyYXRvcih3YWxrLCB2aWV3LmdldE9sZFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgICAgIG5ld1RyZWUgPSBnZXRUcmVlSXRlcmF0b3Iod2Fsaywgdmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkpOworICAgICAgfSBjYXRjaCAoTWlzc2luZ09iamVjdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHJlcy5zZXRTdGF0dXMoU0NfTk9UX0ZPVU5EKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfSBjYXRjaCAoSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHJlcy5zZXRTdGF0dXMoU0NfTk9UX0ZPVU5EKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGRhdGEgPSBnZXREYXRhKHJlcSk7CisgICAgICBkYXRhLnB1dCgidGl0bGUiLCAiRGlmZiAtICIgKyB2aWV3LmdldFJldmlzaW9uUmFuZ2UoKSk7CisgICAgICBpZiAoc2hvd0NvbW1pdCkgeworICAgICAgICBkYXRhLnB1dCgiY29tbWl0IiwgbmV3IENvbW1pdFNveURhdGEobGlua2lmaWVyLCByZXEsIHJlcG8sIHdhbGssIHZpZXcpCisgICAgICAgICAgICAudG9Tb3lEYXRhKHdhbGsucGFyc2VDb21taXQodmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkpKSk7CisgICAgICB9CisgICAgICBpZiAoIWRhdGEuY29udGFpbnNLZXkoInJlcG9zaXRvcnlOYW1lIikgJiYgKHZpZXcuZ2V0UmVwb3NpdG9yeU5hbWUoKSAhPSBudWxsKSkgeworICAgICAgICBkYXRhLnB1dCgicmVwb3NpdG9yeU5hbWUiLCB2aWV3LmdldFJlcG9zaXRvcnlOYW1lKCkpOworICAgICAgfQorICAgICAgaWYgKCFkYXRhLmNvbnRhaW5zS2V5KCJicmVhZGNydW1icyIpKSB7CisgICAgICAgIGRhdGEucHV0KCJicmVhZGNydW1icyIsIHZpZXcuZ2V0QnJlYWRjcnVtYnMoKSk7CisgICAgICB9CisKKyAgICAgIFN0cmluZ1tdIGh0bWwgPSByZW5kZXJBbmRTcGxpdChkYXRhKTsKKyAgICAgIHJlcy5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19PSyk7CisgICAgICByZXMuc2V0Q29udGVudFR5cGUoRm9ybWF0VHlwZS5IVE1MLmdldE1pbWVUeXBlKCkpOworICAgICAgcmVzLnNldENoYXJhY3RlckVuY29kaW5nKENoYXJzZXRzLlVURl84Lm5hbWUoKSk7CisgICAgICBzZXRDYWNoZUhlYWRlcnMocmVxLCByZXMpOworCisgICAgICBPdXRwdXRTdHJlYW0gb3V0ID0gcmVzLmdldE91dHB1dFN0cmVhbSgpOworICAgICAgdHJ5IHsKKyAgICAgICAgb3V0LndyaXRlKGh0bWxbMF0uZ2V0Qnl0ZXMoQ2hhcnNldHMuVVRGXzgpKTsKKyAgICAgICAgZm9ybWF0SHRtbERpZmYob3V0LCByZXBvLCB3YWxrLCBvbGRUcmVlLCBuZXdUcmVlLCB2aWV3LmdldFRyZWVQYXRoKCkpOworICAgICAgICBvdXQud3JpdGUoaHRtbFsxXS5nZXRCeXRlcyhDaGFyc2V0cy5VVEZfOCkpOworICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgICB9CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIHdhbGsucmVsZWFzZSgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNQYXJlbnRPZihSZXZXYWxrIHdhbGssIFJldmlzaW9uIG9sZFJldmlzaW9uLCBSZXZpc2lvbiBuZXdSZXZpc2lvbikKKyAgICAgIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgUmV2Q29tbWl0IG5ld0NvbW1pdCA9IHdhbGsucGFyc2VDb21taXQobmV3UmV2aXNpb24uZ2V0SWQoKSk7CisgICAgaWYgKG5ld0NvbW1pdC5nZXRQYXJlbnRDb3VudCgpID4gMCkgeworICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3Q29tbWl0LmdldFBhcmVudHMoKSkuY29udGFpbnMob2xkUmV2aXNpb24uZ2V0SWQoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBvbGRSZXZpc2lvbiA9PSBSZXZpc2lvbi5OVUxMOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgU3RyaW5nW10gcmVuZGVyQW5kU3BsaXQoTWFwPFN0cmluZywgT2JqZWN0PiBkYXRhKSB7CisgICAgU3RyaW5nIGh0bWwgPSByZW5kZXJlci5uZXdSZW5kZXJlcigiZ2l0aWxlcy5kaWZmRGV0YWlsIikKKyAgICAgICAgLnNldERhdGEoZGF0YSkKKyAgICAgICAgLnJlbmRlcigpOworICAgIGludCBpZCA9IGh0bWwuaW5kZXhPZihQTEFDRUhPTERFUik7CisgICAgaWYgKGlkIDwgMCkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGVtcGxhdGUgbXVzdCBjb250YWluICIgKyBQTEFDRUhPTERFUik7CisgICAgfQorCisgICAgaW50IGx0ID0gaHRtbC5sYXN0SW5kZXhPZignPCcsIGlkKTsKKyAgICBpbnQgZ3QgPSBodG1sLmluZGV4T2YoJz4nLCBpZCArIFBMQUNFSE9MREVSLmxlbmd0aCgpKTsKKyAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHtodG1sLnN1YnN0cmluZygwLCBsdCksIGh0bWwuc3Vic3RyaW5nKGd0ICsgMSl9OworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGZvcm1hdEh0bWxEaWZmKE91dHB1dFN0cmVhbSBvdXQsCisgICAgICBSZXBvc2l0b3J5IHJlcG8sIFJldldhbGsgd2FsaywKKyAgICAgIEFic3RyYWN0VHJlZUl0ZXJhdG9yIG9sZFRyZWUsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIG5ld1RyZWUsCisgICAgICBTdHJpbmcgcGF0aCkKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgRGlmZkZvcm1hdHRlciBkaWZmID0gbmV3IEh0bWxEaWZmRm9ybWF0dGVyKHJlbmRlcmVyLCBvdXQpOworICAgIHRyeSB7CisgICAgICBpZiAoIXBhdGguZXF1YWxzKCIiKSkgeworICAgICAgICBkaWZmLnNldFBhdGhGaWx0ZXIoUGF0aEZpbHRlci5jcmVhdGUocGF0aCkpOworICAgICAgfQorICAgICAgZGlmZi5zZXRSZXBvc2l0b3J5KHJlcG8pOworICAgICAgZGlmZi5zZXREZXRlY3RSZW5hbWVzKHRydWUpOworICAgICAgZGlmZi5mb3JtYXQob2xkVHJlZSwgbmV3VHJlZSk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGRpZmYucmVsZWFzZSgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGdldFRyZWVJdGVyYXRvcihSZXZXYWxrIHdhbGssIE9iamVjdElkIGlkKQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpZiAoIWlkLmVxdWFscyhPYmplY3RJZC56ZXJvSWQoKSkpIHsKKyAgICAgIENhbm9uaWNhbFRyZWVQYXJzZXIgcCA9IG5ldyBDYW5vbmljYWxUcmVlUGFyc2VyKCk7CisgICAgICBwLnJlc2V0KHdhbGsuZ2V0T2JqZWN0UmVhZGVyKCksIHdhbGsucGFyc2VUcmVlKGlkKSk7CisgICAgICByZXR1cm4gcDsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG5ldyBFbXB0eVRyZWVJdGVyYXRvcigpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0Zvcm1hdFR5cGUuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9Gb3JtYXRUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQxN2E0YwotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9Gb3JtYXRUeXBlLmphdmEKQEAgLTAsMCArMSw3NiBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24ubmV0Lkh0dHBIZWFkZXJzOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKKworLyoqIFR5cGUgb2YgZm9ybWF0dGluZyB0byB1c2UgaW4gdGhlIHJlc3BvbnNlIHRvIHRoZSBjbGllbnQuICovCitwdWJsaWMgZW51bSBGb3JtYXRUeXBlIHsKKyAgSFRNTCgidGV4dC9odG1sIiksCisgIFRFWFQoInRleHQvcGxhaW4iKSwKKyAgSlNPTigiYXBwbGljYXRpb24vanNvbiIpLAorICBERUZBVUxUKCIqLyoiKTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUX1RZUEVfQVRUUklCVVRFID0gRm9ybWF0VHlwZS5jbGFzcy5nZXROYW1lKCk7CisKKyAgcHVibGljIHN0YXRpYyBGb3JtYXRUeXBlIGdldEZvcm1hdFR5cGUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworICAgIEZvcm1hdFR5cGUgcmVzdWx0ID0gKEZvcm1hdFR5cGUpIHJlcS5nZXRBdHRyaWJ1dGUoRk9STUFUX1RZUEVfQVRUUklCVVRFKTsKKyAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgU3RyaW5nIGZvcm1hdCA9IHJlcS5nZXRQYXJhbWV0ZXIoImZvcm1hdCIpOworICAgIGlmIChmb3JtYXQgIT0gbnVsbCkgeworICAgICAgZm9yIChGb3JtYXRUeXBlIHR5cGUgOiBGb3JtYXRUeXBlLnZhbHVlcygpKSB7CisgICAgICAgIGlmIChmb3JtYXQuZXF1YWxzSWdub3JlQ2FzZSh0eXBlLm5hbWUoKSkpIHsKKyAgICAgICAgICByZXR1cm4gc2V0KHJlcSwgdHlwZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgZm9ybWF0ICIgKyBmb3JtYXQpOworICAgIH0KKworICAgIFN0cmluZyBhY2NlcHQgPSByZXEuZ2V0SGVhZGVyKEh0dHBIZWFkZXJzLkFDQ0VQVCk7CisgICAgaWYgKFN0cmluZ3MuaXNOdWxsT3JFbXB0eShhY2NlcHQpKSB7CisgICAgICByZXR1cm4gc2V0KHJlcSwgREVGQVVMVCk7CisgICAgfQorCisgICAgZm9yIChTdHJpbmcgcCA6IGFjY2VwdC5zcGxpdCgiWyAsO11bICw7XSoiKSkgeworICAgICAgZm9yIChGb3JtYXRUeXBlIHR5cGUgOiBGb3JtYXRUeXBlLnZhbHVlcygpKSB7CisgICAgICAgIGlmIChwLmVxdWFscyh0eXBlLm1pbWVUeXBlKSkgeworICAgICAgICAgIHJldHVybiBzZXQocmVxLCB0eXBlICE9IEhUTUwgPyB0eXBlIDogREVGQVVMVCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNldChyZXEsIERFRkFVTFQpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgRm9ybWF0VHlwZSBzZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgRm9ybWF0VHlwZSBmb3JtYXQpIHsKKyAgICByZXEuc2V0QXR0cmlidXRlKEZPUk1BVF9UWVBFX0FUVFJJQlVURSwgZm9ybWF0KTsKKyAgICByZXR1cm4gZm9ybWF0OworICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbWltZVR5cGU7CisKKyAgcHJpdmF0ZSBGb3JtYXRUeXBlKFN0cmluZyBtaW1lVHlwZSkgeworICAgIHRoaXMubWltZVR5cGUgPSBtaW1lVHlwZTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0TWltZVR5cGUoKSB7CisgICAgcmV0dXJuIG1pbWVUeXBlOworICB9Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvR2l0aWxlc0FjY2Vzcy5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0dpdGlsZXNBY2Nlc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDhkNzA5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0dpdGlsZXNBY2Nlc3MuamF2YQpAQCAtMCwwICsxLDY4IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyLlNlcnZpY2VOb3RBdXRob3JpemVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyLlNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworCisvKioKKyAqIEdpdCBzdG9yYWdlIGludGVyZmFjZSBmb3IgR2l0aWxlcy4KKyAqIDxwPgorICogRWFjaCBpbnN0YW5jZSBpcyBhc3NvY2lhdGVkIHdpdGggYSBzaW5nbGUgZW5kLXVzZXIgcmVxdWVzdCwgd2hpY2ggaW1wbGljaXRseQorICogaW5jbHVkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGhvc3QgYW5kIHJlcG9zaXRvcnkuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgR2l0aWxlc0FjY2VzcyB7CisgIC8qKiBGYWN0b3J5IGZvciBwZXItcmVxdWVzdCBhY2Nlc3MuICovCisgIHB1YmxpYyBpbnRlcmZhY2UgRmFjdG9yeSB7CisgICAgcHVibGljIEdpdGlsZXNBY2Nlc3MgZm9yUmVxdWVzdChIdHRwU2VydmxldFJlcXVlc3QgcmVxKTsKKyAgfQorCisgIC8qKgorICAgKiBMaXN0IHJlcG9zaXRvcmllcyBvbiB0aGUgaG9zdC4KKyAgICoKKyAgICogQHBhcmFtIGJyYW5jaGVzIGJyYW5jaGVzIHRvIGxpc3QgYWxvbmcgd2l0aCBlYWNoIHJlcG9zaXRvcnkuCisgICAqIEByZXR1cm4gbWFwIG9mIHJlcG9zaXRvcnkgbmFtZXMgdG8gZGVzY3JpcHRpb25zLgorICAgKiBAdGhyb3dzIFNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uIHRvIHRyaWdnZXIgYW4gSFRUUCA0MDMgRm9yYmlkZGVuCisgICAqICAgICAobWF0Y2hpbmcgYmVoYXZpb3IgaW4ge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuUmVwb3NpdG9yeUZpbHRlcn0pLgorICAgKiBAdGhyb3dzIFNlcnZpY2VOb3RBdXRob3JpemVkRXhjZXB0aW9uIHRvIHRyaWdnZXIgYW4gSFRUUCA0MDEgVW5hdXRob3JpemVkCisgICAqICAgICAobWF0Y2hpbmcgYmVoYXZpb3IgaW4ge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuUmVwb3NpdG9yeUZpbHRlcn0pLgorICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICAgKi8KKyAgcHVibGljIE1hcDxTdHJpbmcsIFJlcG9zaXRvcnlEZXNjcmlwdGlvbj4gbGlzdFJlcG9zaXRvcmllcyhTZXQ8U3RyaW5nPiBicmFuY2hlcykKKyAgICAgIHRocm93cyBTZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbiwgU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uOworCisgIC8qKgorICAgKiBAcmV0dXJuIGFuIG9wYXF1ZSBvYmplY3QgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBlbmQtdXNlciBtYWtpbmcgdGhlCisgICAqICAgICByZXF1ZXN0LCBhbmQgc3VwcG9ydHMge0BsaW5rICNlcXVhbHMoT2JqZWN0KX0gYW5kIHtAbGluayAjaGFzaENvZGUoKX0uCisgICAqICAgICBOZXZlciBudWxsLgorICAgKi8KKyAgcHVibGljIE9iamVjdCBnZXRVc2VyS2V5KCk7CisKKyAgLyoqIEByZXR1cm4gdGhlIHJlcG9zaXRvcnkgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVlc3QuICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0UmVwb3NpdG9yeU5hbWUoKTsKKworICAvKioKKyAgICogQHJldHVybiB0aGUgZGVzY3JpcHRpb24gYXR0YWNoZWQgdG8gdGhlIHJlcG9zaXRvcnkgb2YgdGhpcyByZXF1ZXN0LgorICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGFuIGVycm9yIG9jY3VycmVkIHJlYWRpbmcgdGhlIGRlc2NyaXB0aW9uIHN0cmluZyBmcm9tCisgICAqICAgICAgICAgdGhlIHJlcG9zaXRvcnkuCisgICAqLworICBwdWJsaWMgUmVwb3NpdG9yeURlc2NyaXB0aW9uIGdldFJlcG9zaXRvcnlEZXNjcmlwdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9HaXRpbGVzRmlsdGVyLmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvR2l0aWxlc0ZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyY2Y5ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvR2l0aWxlc0ZpbHRlci5qYXZhCkBAIC0wLDAgKzEsMzYyIEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tTdGF0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5naXRpbGVzLkdpdGlsZXNTZXJ2bGV0LlNUQVRJQ19QUkVGSVg7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2l0aWxlcy5WaWV3RmlsdGVyLmdldFJlZ2V4R3JvdXA7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkpvaW5lcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkxpbmtlZExpc3RNdWx0aW1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RNdWx0aW1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Db25maWdJbnZhbGlkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLlJlcG9zaXRvcnlGaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci5nbHVlLk1ldGFGaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGUuRmlsZUJhc2VkQ29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlNlcnZpY2VNYXlOb3RDb250aW51ZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlci5GaWxlUmVzb2x2ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXIuUmVwb3NpdG9yeVJlc29sdmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyLlNlcnZpY2VOb3RBdXRob3JpemVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyLlNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GUzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDaGFpbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlckNvbmZpZzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworLyoqCisgKiBNZXRhRmlsdGVyIHRvIHNlcnZlIEdpdGlsZXMuCisgKiA8cD4KKyAqIERvIG5vdCB1c2UgZGlyZWN0bHk7IHVzZSB7QGxpbmsgR2l0aWxlc1NlcnZsZXR9LgorICovCitjbGFzcyBHaXRpbGVzRmlsdGVyIGV4dGVuZHMgTWV0YUZpbHRlciB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfUEFUSF9QQVJBTSA9ICJjb25maWdQYXRoIjsKKworICAvLyBUaGUgZm9sbG93aW5nIHJlZ2V4ZXMgaGF2ZSB0aGUgZm9sbG93aW5nIGNhcHR1cmUgZ3JvdXBzOgorICAvLyAxLiBUaGUgd2hvbGUgc3RyaW5nLCB3aGljaCBjYXVzZXMgUmVnZXhQaXBlbGluZSB0byBzZXQgUkVHRVhfR1JPVVBTIGJ1dAorICAvLyAgICBub3Qgb3RoZXJ3aXNlIG1vZGlmeSB0aGUgb3JpZ2luYWwgcmVxdWVzdC4KKyAgLy8gMi4gVGhlIHJlcG9zaXRvcnkgbmFtZSBwYXJ0LCBiZWZvcmUgLzxDTUQ+LgorICAvLyAzLiBUaGUgY29tbWFuZCwgPENNRD4sIHdpdGggbm8gc2xhc2hlcyBhbmQgYmVnaW5uaW5nIHdpdGggKy4gQ29tbWFuZHMgaGF2ZQorICAvLyAgICBuYW1lcyBhbmFsb2dvdXMgdG8gKGJ1dCBub3QgZXhhY3RseSB0aGUgc2FtZSBhcykgZ2l0IGNvbW1hbmQgbmFtZXMsIHN1Y2gKKyAgLy8gICAgYXMgIitsb2ciIGFuZCAiK3Nob3ciLiBUaGUgYmFyZSBjb21tYW5kICIrIiBtYXBzIHRvIG9uZSBvZiB0aGUgb3RoZXIKKyAgLy8gICAgY29tbWFuZHMgYmFzZWQgb24gdGhlIHJldmlzaW9uL3BhdGgsIGFuZCBtYXkgY2hhbmdlIG92ZXIgdGltZS4KKyAgLy8gNC4gVGhlIHJldmlzaW9uL3BhdGggcGFydCwgYWZ0ZXIgLzxDTUQ+IChjYWxsZWQganVzdCAicGF0aCIgYmVsb3cpLiBUaGlzIGlzCisgIC8vICAgIHNwbGl0IGludG8gYSByZXZpc2lvbiBhbmQgYSBwYXRoIGJ5IFJldmlzaW9uUGFyc2VyLgorCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTUQgPSAiXFwrW2EtejAtOS1dKiI7CisKKyAgQFZpc2libGVGb3JUZXN0aW5nCisgIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIFJPT1RfUkVHRVggPSBQYXR0ZXJuLmNvbXBpbGUoIiIKKyAgICAgICsgIl4oICAgICAgIiAvLyAxLiBFdmVyeXRoaW5nCisgICAgICArICIgIC8qICAgICIgLy8gRXhjZXNzIHNsYXNoZXMKKyAgICAgICsgIiAgKC8pICAgIiAvLyAyLiBSZXBvIG5hbWUgKGp1c3Qgc2xhc2gpCisgICAgICArICIgICgpICAgICIgLy8gMy4gQ29tbWFuZAorICAgICAgKyAiICAoKSAgICAiIC8vIDQuIFBhdGgKKyAgICAgICsgIikkICAgICAgIiwKKyAgICAgIFBhdHRlcm4uQ09NTUVOVFMpOworCisgIEBWaXNpYmxlRm9yVGVzdGluZworICBzdGF0aWMgZmluYWwgUGF0dGVybiBSRVBPX1JFR0VYID0gUGF0dGVybi5jb21waWxlKCIiCisgICAgICArICJeKCAgICAgICAgICAgICAgICAgICAgICIgLy8gMS4gRXZlcnl0aGluZworICAgICAgKyAiICAvKiAgICAgICAgICAgICAgICAgICAiIC8vIEV4Y2VzcyBzbGFzaGVzCisgICAgICArICIgICggICAgICAgICAgICAgICAgICAgICIgLy8gMi4gUmVwbyBuYW1lCisgICAgICArICIgICAvICAgICAgICAgICAgICAgICAgICIgLy8gTGVhZGluZyBzbGFzaAorICAgICAgKyAiICAgKD86Lig/ISAgICAgICAgICAgICAiIC8vIEFueXRoaW5nLCBhcyBsb25nIGFzIGl0J3Mgbm90IGZvbGxvd2VkIGJ5Li4uCisgICAgICArICIgICAgICAgIC8iICsgQ01EICsgIi8gICIgLy8gdGhlIHNwZWNpYWwgIi88Q01EPi8iIHNlcGFyYXRvciwKKyAgICAgICsgIiAgICAgICAgfC8iICsgQ01EICsgIiQgIiAvLyBvciAiLzxDTUQ+IiBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcKKyAgICAgICsgIiAgICAgICAgKSkqPyAgICAgICAgICAgIgorICAgICAgKyAiICApICAgICAgICAgICAgICAgICAgICAiCisgICAgICArICIgIC8qICAgICAgICAgICAgICAgICAgICIgLy8gVHJhaWxpbmcgc2xhc2hlcworICAgICAgKyAiICAoKSAgICAgICAgICAgICAgICAgICAiIC8vIDMuIENvbW1hbmQKKyAgICAgICsgIiAgKCkgICAgICAgICAgICAgICAgICAgIiAvLyA0LiBQYXRoCisgICAgICArICIpJCAgICAgICAgICAgICAgICAgICAgICIsCisgICAgICBQYXR0ZXJuLkNPTU1FTlRTKTsKKworICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgc3RhdGljIGZpbmFsIFBhdHRlcm4gUkVQT19QQVRIX1JFR0VYID0gUGF0dGVybi5jb21waWxlKCIiCisgICAgICArICJeKCAgICAgICAgICAgICAgIiAvLyAxLiBFdmVyeXRoaW5nCisgICAgICArICIgIC8qICAgICAgICAgICAgIiAvLyBFeGNlc3Mgc2xhc2hlcworICAgICAgKyAiICAoICAgICAgICAgICAgICIgLy8gMi4gUmVwbyBuYW1lCisgICAgICArICIgICAvICAgICAgICAgICAgIiAvLyBMZWFkaW5nIHNsYXNoCisgICAgICArICIgICAuKj8gICAgICAgICAgIiAvLyBBbnl0aGluZywgbm9uLWdyZWVkeQorICAgICAgKyAiICApICAgICAgICAgICAgICIKKyAgICAgICsgIiAgLygiICsgQ01EICsgIikiIC8vIDMuIENvbW1hbmQKKyAgICAgICsgIiAgKCAgICAgICAgICAgICAiIC8vIDQuIFBhdGgKKyAgICAgICsgIiAgICg/Oi8uKik/ICAgICAiIC8vIFNsYXNoIHBhdGgsIG9yIG5vdGhpbmcuCisgICAgICArICIgICkgICAgICAgICAgICAgIgorICAgICAgKyAiKSQgICAgICAgICAgICAgICIsCisgICAgICBQYXR0ZXJuLkNPTU1FTlRTKTsKKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEaXNwYXRjaEZpbHRlciBleHRlbmRzIEFic3RyYWN0SHR0cEZpbHRlciB7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0TXVsdGltYXA8R2l0aWxlc1ZpZXcuVHlwZSwgRmlsdGVyPiBmaWx0ZXJzOworICAgIHByaXZhdGUgZmluYWwgTWFwPEdpdGlsZXNWaWV3LlR5cGUsIEh0dHBTZXJ2bGV0PiBzZXJ2bGV0czsKKworICAgIHByaXZhdGUgRGlzcGF0Y2hGaWx0ZXIoTGlzdE11bHRpbWFwPEdpdGlsZXNWaWV3LlR5cGUsIEZpbHRlcj4gZmlsdGVycywKKyAgICAgICAgTWFwPEdpdGlsZXNWaWV3LlR5cGUsIEh0dHBTZXJ2bGV0PiBzZXJ2bGV0cykgeworICAgICAgdGhpcy5maWx0ZXJzID0gTGlua2VkTGlzdE11bHRpbWFwLmNyZWF0ZShmaWx0ZXJzKTsKKyAgICAgIHRoaXMuc2VydmxldHMgPSBJbW11dGFibGVNYXAuY29weU9mKHNlcnZsZXRzKTsKKyAgICAgIGZvciAoR2l0aWxlc1ZpZXcuVHlwZSB0eXBlIDogR2l0aWxlc1ZpZXcuVHlwZS52YWx1ZXMoKSkgeworICAgICAgICBjaGVja1N0YXRlKHNlcnZsZXRzLmNvbnRhaW5zS2V5KHR5cGUpLCAiTWlzc2luZyBoYW5kbGVyIGZvciB2aWV3ICVzIiwgdHlwZSk7CisgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZG9GaWx0ZXIoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsIEZpbHRlckNoYWluIGNoYWluKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgR2l0aWxlc1ZpZXcgdmlldyA9IGNoZWNrTm90TnVsbChWaWV3RmlsdGVyLmdldFZpZXcocmVxKSk7CisgICAgICBmaW5hbCBJdGVyYXRvcjxGaWx0ZXI+IGl0ciA9IGZpbHRlcnMuZ2V0KHZpZXcuZ2V0VHlwZSgpKS5pdGVyYXRvcigpOworICAgICAgZmluYWwgSHR0cFNlcnZsZXQgc2VydmxldCA9IHNlcnZsZXRzLmdldCh2aWV3LmdldFR5cGUoKSk7CisgICAgICBuZXcgRmlsdGVyQ2hhaW4oKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBkb0ZpbHRlcihTZXJ2bGV0UmVxdWVzdCByZXEsIFNlcnZsZXRSZXNwb25zZSByZXMpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICAgIGlmIChpdHIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBpdHIubmV4dCgpLmRvRmlsdGVyKHJlcSwgcmVzLCB0aGlzKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VydmxldC5zZXJ2aWNlKHJlcSwgcmVzKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0uZG9GaWx0ZXIocmVxLCByZXMpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgZmluYWwgTGlzdE11bHRpbWFwPEdpdGlsZXNWaWV3LlR5cGUsIEZpbHRlcj4gZmlsdGVycyA9IExpbmtlZExpc3RNdWx0aW1hcC5jcmVhdGUoKTsKKyAgcHJpdmF0ZSBmaW5hbCBNYXA8R2l0aWxlc1ZpZXcuVHlwZSwgSHR0cFNlcnZsZXQ+IHNlcnZsZXRzID0gTWFwcy5uZXdIYXNoTWFwKCk7CisKKyAgcHJpdmF0ZSBSZW5kZXJlciByZW5kZXJlcjsKKyAgcHJpdmF0ZSBHaXRpbGVzVXJscyB1cmxzOworICBwcml2YXRlIExpbmtpZmllciBsaW5raWZpZXI7CisgIHByaXZhdGUgR2l0aWxlc0FjY2Vzcy5GYWN0b3J5IGFjY2Vzc0ZhY3Rvcnk7CisgIHByaXZhdGUgUmVwb3NpdG9yeVJlc29sdmVyPEh0dHBTZXJ2bGV0UmVxdWVzdD4gcmVzb2x2ZXI7CisgIHByaXZhdGUgVmlzaWJpbGl0eUNhY2hlIHZpc2liaWxpdHlDYWNoZTsKKyAgcHJpdmF0ZSBib29sZWFuIGluaXRpYWxpemVkOworCisgIEdpdGlsZXNGaWx0ZXIoKSB7CisgIH0KKworICBHaXRpbGVzRmlsdGVyKAorICAgICAgUmVuZGVyZXIgcmVuZGVyZXIsCisgICAgICBHaXRpbGVzVXJscyB1cmxzLAorICAgICAgR2l0aWxlc0FjY2Vzcy5GYWN0b3J5IGFjY2Vzc0ZhY3RvcnksCisgICAgICBmaW5hbCBSZXBvc2l0b3J5UmVzb2x2ZXI8SHR0cFNlcnZsZXRSZXF1ZXN0PiByZXNvbHZlciwKKyAgICAgIFZpc2liaWxpdHlDYWNoZSB2aXNpYmlsaXR5Q2FjaGUpIHsKKyAgICB0aGlzLnJlbmRlcmVyID0gY2hlY2tOb3ROdWxsKHJlbmRlcmVyLCAicmVuZGVyZXIiKTsKKyAgICB0aGlzLnVybHMgPSBjaGVja05vdE51bGwodXJscywgInVybHMiKTsKKyAgICB0aGlzLmFjY2Vzc0ZhY3RvcnkgPSBjaGVja05vdE51bGwoYWNjZXNzRmFjdG9yeSwgImFjY2Vzc0ZhY3RvcnkiKTsKKyAgICB0aGlzLnZpc2liaWxpdHlDYWNoZSA9IGNoZWNrTm90TnVsbCh2aXNpYmlsaXR5Q2FjaGUsICJ2aXNpYmlsaXR5Q2FjaGUiKTsKKyAgICB0aGlzLmxpbmtpZmllciA9IG5ldyBMaW5raWZpZXIodXJscyk7CisgICAgdGhpcy5yZXNvbHZlciA9IHdyYXBSZXNvbHZlcihyZXNvbHZlcik7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGluaXQoRmlsdGVyQ29uZmlnIGNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworICAgIHN1cGVyLmluaXQoY29uZmlnKTsKKyAgICBzZXREZWZhdWx0RmllbGRzKGNvbmZpZyk7CisKKyAgICBmb3IgKEdpdGlsZXNWaWV3LlR5cGUgdHlwZSA6IEdpdGlsZXNWaWV3LlR5cGUudmFsdWVzKCkpIHsKKyAgICAgIGlmICghc2VydmxldHMuY29udGFpbnNLZXkodHlwZSkpIHsKKyAgICAgICAgc2VydmxldHMucHV0KHR5cGUsIGdldERlZmF1bHRIYW5kbGVyKHR5cGUpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBGaWx0ZXIgcmVwb3NpdG9yeUZpbHRlciA9IG5ldyBSZXBvc2l0b3J5RmlsdGVyKHJlc29sdmVyKTsKKyAgICBGaWx0ZXIgdmlld0ZpbHRlciA9IG5ldyBWaWV3RmlsdGVyKGFjY2Vzc0ZhY3RvcnksIHVybHMsIHZpc2liaWxpdHlDYWNoZSk7CisgICAgRmlsdGVyIGRpc3BhdGNoRmlsdGVyID0gbmV3IERpc3BhdGNoRmlsdGVyKGZpbHRlcnMsIHNlcnZsZXRzKTsKKyAgICBTdHJpbmcgYnJvd3NlckNzc05hbWU7CisgICAgU3RyaW5nIHByZXR0aWZ5Q3NzTmFtZTsKKyAgICBTdHJpbmcgcHJldHRpZnlKc05hbWU7CisKKyAgICBzZXJ2ZVJlZ2V4KFJPT1RfUkVHRVgpCisgICAgICAgIC50aHJvdWdoKHZpZXdGaWx0ZXIpCisgICAgICAgIC50aHJvdWdoKGRpc3BhdGNoRmlsdGVyKTsKKworICAgIHNlcnZlUmVnZXgoUkVQT19SRUdFWCkKKyAgICAgICAgLnRocm91Z2gocmVwb3NpdG9yeUZpbHRlcikKKyAgICAgICAgLnRocm91Z2godmlld0ZpbHRlcikKKyAgICAgICAgLnRocm91Z2goZGlzcGF0Y2hGaWx0ZXIpOworCisgICAgc2VydmVSZWdleChSRVBPX1BBVEhfUkVHRVgpCisgICAgICAgIC50aHJvdWdoKHJlcG9zaXRvcnlGaWx0ZXIpCisgICAgICAgIC50aHJvdWdoKHZpZXdGaWx0ZXIpCisgICAgICAgIC50aHJvdWdoKGRpc3BhdGNoRmlsdGVyKTsKKworICAgIGluaXRpYWxpemVkID0gdHJ1ZTsKKyAgfQorCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgQmFzZVNlcnZsZXQgZ2V0RGVmYXVsdEhhbmRsZXIoR2l0aWxlc1ZpZXcuVHlwZSB2aWV3KSB7CisgICAgY2hlY2tOb3RJbml0aWFsaXplZCgpOworICAgIHN3aXRjaCAodmlldykgeworICAgICAgY2FzZSBIT1NUX0lOREVYOgorICAgICAgICByZXR1cm4gbmV3IEhvc3RJbmRleFNlcnZsZXQocmVuZGVyZXIsIHVybHMsIGFjY2Vzc0ZhY3RvcnkpOworICAgICAgY2FzZSBSRVBPU0lUT1JZX0lOREVYOgorICAgICAgICByZXR1cm4gbmV3IFJlcG9zaXRvcnlJbmRleFNlcnZsZXQocmVuZGVyZXIsIGFjY2Vzc0ZhY3RvcnkpOworICAgICAgY2FzZSBSRVZJU0lPTjoKKyAgICAgICAgcmV0dXJuIG5ldyBSZXZpc2lvblNlcnZsZXQocmVuZGVyZXIsIGxpbmtpZmllcik7CisgICAgICBjYXNlIFBBVEg6CisgICAgICAgIHJldHVybiBuZXcgUGF0aFNlcnZsZXQocmVuZGVyZXIpOworICAgICAgY2FzZSBESUZGOgorICAgICAgICByZXR1cm4gbmV3IERpZmZTZXJ2bGV0KHJlbmRlcmVyLCBsaW5raWZpZXIpOworICAgICAgY2FzZSBMT0c6CisgICAgICAgIHJldHVybiBuZXcgTG9nU2VydmxldChyZW5kZXJlciwgbGlua2lmaWVyKTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgdmlldyB0eXBlOiAiICsgdmlldyk7CisgICAgfQorICB9CisKKyAgc3luY2hyb25pemVkIHZvaWQgYWRkRmlsdGVyKEdpdGlsZXNWaWV3LlR5cGUgdmlldywgRmlsdGVyIGZpbHRlcikgeworICAgIGNoZWNrTm90SW5pdGlhbGl6ZWQoKTsKKyAgICBmaWx0ZXJzLnB1dChjaGVja05vdE51bGwodmlldywgInZpZXciKSwgY2hlY2tOb3ROdWxsKGZpbHRlciwgImZpbHRlciBmb3IgJXMiLCB2aWV3KSk7CisgIH0KKworICBzeW5jaHJvbml6ZWQgdm9pZCBzZXRIYW5kbGVyKEdpdGlsZXNWaWV3LlR5cGUgdmlldywgSHR0cFNlcnZsZXQgaGFuZGxlcikgeworICAgIGNoZWNrTm90SW5pdGlhbGl6ZWQoKTsKKyAgICBzZXJ2bGV0cy5wdXQoY2hlY2tOb3ROdWxsKHZpZXcsICJ2aWV3IiksCisgICAgICAgIGNoZWNrTm90TnVsbChoYW5kbGVyLCAiaGFuZGxlciBmb3IgJXMiLCB2aWV3KSk7CisgIH0KKworICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGNoZWNrTm90SW5pdGlhbGl6ZWQoKSB7CisgICAgY2hlY2tTdGF0ZSghaW5pdGlhbGl6ZWQsICJHaXRpbGVzIGFscmVhZHkgaW5pdGlhbGl6ZWQiKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFJlcG9zaXRvcnlSZXNvbHZlcjxIdHRwU2VydmxldFJlcXVlc3Q+IHdyYXBSZXNvbHZlcigKKyAgICAgIGZpbmFsIFJlcG9zaXRvcnlSZXNvbHZlcjxIdHRwU2VydmxldFJlcXVlc3Q+IHJlc29sdmVyKSB7CisgICAgY2hlY2tOb3ROdWxsKHJlc29sdmVyLCAicmVzb2x2ZXIiKTsKKyAgICByZXR1cm4gbmV3IFJlcG9zaXRvcnlSZXNvbHZlcjxIdHRwU2VydmxldFJlcXVlc3Q+KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgUmVwb3NpdG9yeSBvcGVuKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIFN0cmluZyBuYW1lKQorICAgICAgICAgIHRocm93cyBSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24sIFNlcnZpY2VOb3RBdXRob3JpemVkRXhjZXB0aW9uLAorICAgICAgICAgIFNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uLCBTZXJ2aWNlTWF5Tm90Q29udGludWVFeGNlcHRpb24geworICAgICAgICByZXR1cm4gcmVzb2x2ZXIub3BlbihyZXEsIFZpZXdGaWx0ZXIudHJpbUxlYWRpbmdTbGFzaChnZXRSZWdleEdyb3VwKHJlcSwgMSkpKTsKKyAgICAgIH0KKyAgICB9OworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRGaWVsZHMoRmlsdGVyQ29uZmlnIGNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworICAgIGlmIChyZW5kZXJlciAhPSBudWxsICYmIHVybHMgIT0gbnVsbCAmJiBhY2Nlc3NGYWN0b3J5ICE9IG51bGwgJiYgcmVzb2x2ZXIgIT0gbnVsbAorICAgICAgICAmJiB2aXNpYmlsaXR5Q2FjaGUgIT0gbnVsbCkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBTdHJpbmcgY29uZmlnUGF0aCA9IGNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKENPTkZJR19QQVRIX1BBUkFNKTsKKyAgICBpZiAoY29uZmlnUGF0aCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbigiTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgIiArIGNvbmZpZ1BhdGgpOworICAgIH0KKyAgICBGaWxlQmFzZWRDb25maWcgamdpdENvbmZpZyA9IG5ldyBGaWxlQmFzZWRDb25maWcobmV3IEZpbGUoY29uZmlnUGF0aCksIEZTLkRFVEVDVEVEKTsKKyAgICB0cnkgeworICAgICAgamdpdENvbmZpZy5sb2FkKCk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oZSk7CisgICAgfSBjYXRjaCAoQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbihlKTsKKyAgICB9CisKKyAgICBpZiAocmVuZGVyZXIgPT0gbnVsbCkgeworICAgICAgU3RyaW5nIHN0YXRpY1ByZWZpeCA9IGNvbmZpZy5nZXRTZXJ2bGV0Q29udGV4dCgpLmdldENvbnRleHRQYXRoKCkgKyBTVEFUSUNfUFJFRklYOworICAgICAgU3RyaW5nIGN1c3RvbVRlbXBsYXRlcyA9IGpnaXRDb25maWcuZ2V0U3RyaW5nKCJnaXRpbGVzIiwgbnVsbCwgImN1c3RvbVRlbXBsYXRlcyIpOworICAgICAgLy8gVE9ETyhkYm9yb3dpdHopOiBBdXRvbWF0aWNhbGx5IHNldCB0byB0cnVlIHdoZW4gcnVuIHdpdGggbXZuIGpldHR5OnJ1bi4KKyAgICAgIGlmIChqZ2l0Q29uZmlnLmdldEJvb2xlYW4oImdpdGlsZXMiLCBudWxsLCAicmVsb2FkVGVtcGxhdGVzIiwgZmFsc2UpKSB7CisgICAgICAgIHJlbmRlcmVyID0gbmV3IERlYnVnUmVuZGVyZXIoc3RhdGljUHJlZml4LCBjdXN0b21UZW1wbGF0ZXMsCisgICAgICAgICAgICBKb2luZXIub24oRmlsZS5zZXBhcmF0b3JDaGFyKS5qb2luKFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSwKKyAgICAgICAgICAgICAgICAiZ2l0aWxlcy1zZXJ2bGV0IiwgInNyYyIsICJtYWluIiwgInJlc291cmNlcyIsCisgICAgICAgICAgICAgICAgImNvbSIsICJnb29nbGUiLCAiZ2l0aWxlcyIsICJ0ZW1wbGF0ZXMiKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZW5kZXJlciA9IG5ldyBEZWZhdWx0UmVuZGVyZXIoc3RhdGljUHJlZml4LCBSZW5kZXJlci50b0ZpbGVVUkwoY3VzdG9tVGVtcGxhdGVzKSk7CisgICAgICB9CisgICAgfQorICAgIGlmICh1cmxzID09IG51bGwpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHVybHMgPSBuZXcgRGVmYXVsdFVybHMoCisgICAgICAgICAgICBqZ2l0Q29uZmlnLmdldFN0cmluZygiZ2l0aWxlcyIsIG51bGwsICJjYW5vbmljYWxIb3N0TmFtZSIpLAorICAgICAgICAgICAgZ2V0QmFzZUdpdFVybChqZ2l0Q29uZmlnKSwKKyAgICAgICAgICAgIGdldEdlcnJpdFVybChqZ2l0Q29uZmlnKSk7CisgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKGUpOworICAgICAgfQorICAgIH0KKyAgICBsaW5raWZpZXIgPSBuZXcgTGlua2lmaWVyKHVybHMpOworICAgIGlmIChhY2Nlc3NGYWN0b3J5ID09IG51bGwgfHwgcmVzb2x2ZXIgPT0gbnVsbCkgeworICAgICAgU3RyaW5nIGJhc2VQYXRoID0gamdpdENvbmZpZy5nZXRTdHJpbmcoImdpdGlsZXMiLCBudWxsLCAiYmFzZVBhdGgiKTsKKyAgICAgIGlmIChiYXNlUGF0aCA9PSBudWxsKSB7CisgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKCJnaXRpbGVzLmJhc2VQYXRoIG5vdCBzZXQiKTsKKyAgICAgIH0KKyAgICAgIGJvb2xlYW4gZXhwb3J0QWxsID0gamdpdENvbmZpZy5nZXRCb29sZWFuKCJnaXRpbGVzIiwgbnVsbCwgImV4cG9ydEFsbCIsIGZhbHNlKTsKKworICAgICAgRmlsZVJlc29sdmVyPEh0dHBTZXJ2bGV0UmVxdWVzdD4gZmlsZVJlc29sdmVyOworICAgICAgaWYgKHJlc29sdmVyID09IG51bGwpIHsKKyAgICAgICAgZmlsZVJlc29sdmVyID0gbmV3IEZpbGVSZXNvbHZlcjxIdHRwU2VydmxldFJlcXVlc3Q+KG5ldyBGaWxlKGJhc2VQYXRoKSwgZXhwb3J0QWxsKTsKKyAgICAgICAgcmVzb2x2ZXIgPSB3cmFwUmVzb2x2ZXIoZmlsZVJlc29sdmVyKTsKKyAgICAgIH0gZWxzZSBpZiAocmVzb2x2ZXIgaW5zdGFuY2VvZiBGaWxlUmVzb2x2ZXIpIHsKKyAgICAgICAgZmlsZVJlc29sdmVyID0gKEZpbGVSZXNvbHZlcjxIdHRwU2VydmxldFJlcXVlc3Q+KSByZXNvbHZlcjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZpbGVSZXNvbHZlciA9IG51bGw7CisgICAgICB9CisgICAgICBpZiAoYWNjZXNzRmFjdG9yeSA9PSBudWxsKSB7CisgICAgICAgIGNoZWNrU3RhdGUoZmlsZVJlc29sdmVyICE9IG51bGwsICJuZWVkIGEgRmlsZVJlc29sdmVyIHdoZW4gR2l0aWxlc0FjY2Vzcy5GYWN0b3J5IG5vdCBzZXQiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgYWNjZXNzRmFjdG9yeSA9IG5ldyBEZWZhdWx0QWNjZXNzLkZhY3RvcnkoCisgICAgICAgICAgICBuZXcgRmlsZShiYXNlUGF0aCksCisgICAgICAgICAgICBnZXRCYXNlR2l0VXJsKGpnaXRDb25maWcpLAorICAgICAgICAgICAgZmlsZVJlc29sdmVyKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmICh2aXNpYmlsaXR5Q2FjaGUgPT0gbnVsbCkgeworICAgICAgaWYgKGpnaXRDb25maWcuZ2V0U3Vic2VjdGlvbnMoImNhY2hlIikuY29udGFpbnMoInZpc2liaWxpdHkiKSkgeworICAgICAgICB2aXNpYmlsaXR5Q2FjaGUgPQorICAgICAgICAgICAgbmV3IFZpc2liaWxpdHlDYWNoZShmYWxzZSwgQ29uZmlnVXRpbC5nZXRDYWNoZUJ1aWxkZXIoamdpdENvbmZpZywgInZpc2liaWxpdHkiKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB2aXNpYmlsaXR5Q2FjaGUgPSBuZXcgVmlzaWJpbGl0eUNhY2hlKGZhbHNlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QmFzZUdpdFVybChDb25maWcgY29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgU3RyaW5nIGJhc2VHaXRVcmwgPSBjb25maWcuZ2V0U3RyaW5nKCJnaXRpbGVzIiwgbnVsbCwgImJhc2VHaXRVcmwiKTsKKyAgICBpZiAoYmFzZUdpdFVybCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbigiZ2l0aWxlcy5iYXNlR2l0VXJsIG5vdCBzZXQiKTsKKyAgICB9CisgICAgcmV0dXJuIGJhc2VHaXRVcmw7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0R2Vycml0VXJsKENvbmZpZyBjb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgZ2Vycml0VXJsID0gY29uZmlnLmdldFN0cmluZygiZ2l0aWxlcyIsIG51bGwsICJnZXJyaXRVcmwiKTsKKyAgICBpZiAoZ2Vycml0VXJsID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKCJnaXRpbGVzLmdlcnJpdFVybCBub3Qgc2V0Iik7CisgICAgfQorICAgIHJldHVybiBnZXJyaXRVcmw7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9HaXRpbGVzU2VydmxldC5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0dpdGlsZXNTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNkYmMwMgotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9HaXRpbGVzU2VydmxldC5qYXZhCkBAIC0wLDAgKzEsMTEzIEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuZ2x1ZS5NZXRhU2VydmxldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlci5SZXBvc2l0b3J5UmVzb2x2ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlckNvbmZpZzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb25maWc7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CisKKy8qKgorICogU2VydmxldCB0byBzZXJ2ZSBHaXRpbGVzLgorICogPHA+CisgKiBUaGlzIHNlcnZsZXQgY2FuIGVpdGhlciBiZSBjb25zdHJ1Y3RlZCBtYW51YWxseSB3aXRoIGl0cyBkZXBlbmRlbmNpZXMsIG9yCisgKiBjb25maWd1cmVkIHRvIHVzZSBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBmb3IgdGhlIEdpdGlsZXMgaW50ZXJmYWNlcy4gVG8KKyAqIGNvbmZpZ3VyZSB0aGUgZGVmYXVsdHMsIHlvdSBtdXN0IHByb3ZpZGUgYSBzaW5nbGUgaW5pdCBwYXJhbWV0ZXIKKyAqICJjb25maWdQYXRoIiwgd2hpY2ggaXMgdGhlIHBhdGggdG8gYSBnaXQgY29uZmlnIGZpbGUgY29udGFpbmluZyBhZGRpdGlvbmFsCisgKiBjb25maWd1cmF0aW9uLgorICovCitwdWJsaWMgY2xhc3MgR2l0aWxlc1NlcnZsZXQgZXh0ZW5kcyBNZXRhU2VydmxldCB7CisgIC8qKiBUaGUgcHJlZml4IGZyb20gd2hpY2ggc3RhdGljIHJlc291cmNlcyBhcmUgc2VydmVkLiAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFUSUNfUFJFRklYID0gIi8rc3RhdGljLyI7CisKKyAgcHVibGljIEdpdGlsZXNTZXJ2bGV0KFJlbmRlcmVyIHJlbmRlcmVyLAorICAgICAgR2l0aWxlc1VybHMgdXJscywKKyAgICAgIEdpdGlsZXNBY2Nlc3MuRmFjdG9yeSBhY2Nlc3NGYWN0b3J5LAorICAgICAgUmVwb3NpdG9yeVJlc29sdmVyPEh0dHBTZXJ2bGV0UmVxdWVzdD4gcmVzb2x2ZXIsCisgICAgICBWaXNpYmlsaXR5Q2FjaGUgdmlzaWJpbGl0eUNhY2hlKSB7CisgICAgc3VwZXIobmV3IEdpdGlsZXNGaWx0ZXIocmVuZGVyZXIsIHVybHMsIGFjY2Vzc0ZhY3RvcnksIHJlc29sdmVyLCB2aXNpYmlsaXR5Q2FjaGUpKTsKKyAgfQorCisgIHB1YmxpYyBHaXRpbGVzU2VydmxldCgpIHsKKyAgICBzdXBlcihuZXcgR2l0aWxlc0ZpbHRlcigpKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgR2l0aWxlc0ZpbHRlciBnZXREZWxlZ2F0ZUZpbHRlcigpIHsKKyAgICByZXR1cm4gKEdpdGlsZXNGaWx0ZXIpIHN1cGVyLmdldERlbGVnYXRlRmlsdGVyKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgaW5pdChmaW5hbCBTZXJ2bGV0Q29uZmlnIGNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworICAgIGdldERlbGVnYXRlRmlsdGVyKCkuaW5pdChuZXcgRmlsdGVyQ29uZmlnKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgU3RyaW5nIGdldEZpbHRlck5hbWUoKSB7CisgICAgICAgIHJldHVybiBnZXREZWxlZ2F0ZUZpbHRlcigpLmdldENsYXNzKCkuZ2V0TmFtZSgpOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5pdFBhcmFtZXRlcihTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gY29uZmlnLmdldEluaXRQYXJhbWV0ZXIobmFtZSk7CisgICAgICB9CisKKyAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRJbml0UGFyYW1ldGVyTmFtZXMoKSB7CisgICAgICAgIHJldHVybiBjb25maWcuZ2V0SW5pdFBhcmFtZXRlck5hbWVzKCk7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFNlcnZsZXRDb250ZXh0IGdldFNlcnZsZXRDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gY29uZmlnLmdldFNlcnZsZXRDb250ZXh0KCk7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICAvKioKKyAgICogQWRkIGEgY3VzdG9tIGZpbHRlciBmb3IgYSB2aWV3LgorICAgKiA8cD4KKyAgICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIGluaXRpYWxpemluZyB0aGUgc2VydmxldC4KKyAgICoKKyAgICogQHBhcmFtIHZpZXcgdmlldyB0eXBlLgorICAgKiBAcGFyYW0gZmlsdGVyIGZpbHRlci4KKyAgICovCisgIHB1YmxpYyB2b2lkIGFkZEZpbHRlcihHaXRpbGVzVmlldy5UeXBlIHZpZXcsIEZpbHRlciBmaWx0ZXIpIHsKKyAgICBnZXREZWxlZ2F0ZUZpbHRlcigpLmFkZEZpbHRlcih2aWV3LCBmaWx0ZXIpOworICB9CisKKyAgLyoqCisgICAqIFNldCBhIGN1c3RvbSBoYW5kbGVyIGZvciBhIHZpZXcuCisgICAqIDxwPgorICAgKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgaW5pdGlhbGl6aW5nIHRoZSBzZXJ2bGV0LgorICAgKgorICAgKiBAcGFyYW0gdmlldyB2aWV3IHR5cGUuCisgICAqIEBwYXJhbSBoYW5kbGVyIGhhbmRsZXIuCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRIYW5kbGVyKEdpdGlsZXNWaWV3LlR5cGUgdmlldywgSHR0cFNlcnZsZXQgaGFuZGxlcikgeworICAgIGdldERlbGVnYXRlRmlsdGVyKCkuc2V0SGFuZGxlcih2aWV3LCBoYW5kbGVyKTsKKyAgfQorCisgIHB1YmxpYyBCYXNlU2VydmxldCBnZXREZWZhdWx0SGFuZGxlcihHaXRpbGVzVmlldy5UeXBlIHZpZXcpIHsKKyAgICByZXR1cm4gZ2V0RGVsZWdhdGVGaWx0ZXIoKS5nZXREZWZhdWx0SGFuZGxlcih2aWV3KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0dpdGlsZXNVcmxzLmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvR2l0aWxlc1VybHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjdmZjNiCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0dpdGlsZXNVcmxzLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkNoYXJzZXRzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuRnVuY3Rpb247CisKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CisKKy8qKiBJbnRlcmZhY2UgZm9yIFVSTHMgZGlzcGxheWVkIG9uIHNvdXJjZSBicm93c2luZyBwYWdlcy4gKi8KK3B1YmxpYyBpbnRlcmZhY2UgR2l0aWxlc1VybHMgeworICAvKioKKyAgICogRXNjYXBlcyByZXBvc2l0b3J5IG9yIHBhdGggbmFtZXMgdG8gYmUgc2FmZWx5IGVtYmVkZGVkIGludG8gYSBVUkwuCisgICAqIDxwPgorICAgKiBUaGlzIGVzY2FwZSBpbXBsZW1lbnRhdGlvbiBlc2NhcGVzIGEgcmVwb3NpdG9yeSBvciBwYXRoIG5hbWUgc3VjaCBhcworICAgKiAiZm9vL2JhcjwvY2hpbGQiIHRvIGFwcGVhciBhcyAiZm9vL2JhciUzQy9jaGlsZCIuIFNwYWNlcyBhcmUgZXNjYXBlZCBhcworICAgKiAiJTIwIi4gSXRzIHB1cnBvc2UgaXMgdG8gZXNjYXBlIGEgcmVwb3NpdG9yeSBuYW1lIHRvIGJlIHNhZmUgZm9yIGluY2x1c2lvbgorICAgKiBpbiB0aGUgcGF0aCBjb21wb25lbnQgb2YgdGhlIFVSTCwgd2hlcmUgIi8iIGlzIGEgdmFsaWQgY2hhcmFjdGVyIHRoYXQKKyAgICogc2hvdWxkIG5vdCBiZSBlbmNvZGVkLCB3aGlsZSBhbG1vc3QgYW55IG90aGVyIG5vbi1hbHBoYSwgbm9uLW51bWVyaWMKKyAgICogY2hhcmFjdGVyIHdpbGwgYmUgZW5jb2RlZCB1c2luZyBVUkwgc3R5bGUgZW5jb2RpbmcuCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIEZ1bmN0aW9uPFN0cmluZywgU3RyaW5nPiBOQU1FX0VTQ0FQRVIgPSBuZXcgRnVuY3Rpb248U3RyaW5nLCBTdHJpbmc+KCkgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgYXBwbHkoU3RyaW5nIHMpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHJldHVybiBVUkxFbmNvZGVyLmVuY29kZShzLCBDaGFyc2V0cy5VVEZfOC5uYW1lKCkpCisgICAgICAgICAgICAucmVwbGFjZSgiJTJGIiwgIi8iKQorICAgICAgICAgICAgLnJlcGxhY2UoIiUyZiIsICIvIikKKyAgICAgICAgICAgIC5yZXBsYWNlKCIrIiwgIiUyMCIpCisgICAgICAgICAgICAucmVwbGFjZSgiJTJCIiwgIisiKQorICAgICAgICAgICAgLnJlcGxhY2UoIiUyYiIsICIrIik7CisgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlKTsKKyAgICAgIH0KKyAgICB9CisgIH07CisKKyAgLyoqCisgICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgaG9zdCBmcm9tIHRoZSByZXF1ZXN0LgorICAgKgorICAgKiBVc2VkIGluIHZhcmlvdXMgdXNlci12aXNpYmxlIHRleHQsIGxpa2UgIk15SG9zdCBHaXQgUmVwb3NpdG9yaWVzIi4KKyAgICoKKyAgICogQHBhcmFtIHJlcSByZXF1ZXN0LgorICAgKiBAcmV0dXJuIGhvc3QgbmFtZTsgbWF5IGJlIG51bGwuCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldEhvc3ROYW1lKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpOworCisgIC8qKgorICAgKiBSZXR1cm4gdGhlIGJhc2UgVVJMIGZvciBnaXQgcmVwb3NpdG9yaWVzIG9uIHRoaXMgaG9zdC4KKyAgICoKKyAgICogQHBhcmFtIHJlcSByZXF1ZXN0LgorICAgKiBAcmV0dXJuIGJhc2UgVVJMIGZvciBnaXQgcmVwb3NpdG9yaWVzLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRCYXNlR2l0VXJsKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpOworCisgIC8qKgorICAgKiBSZXR1cm4gdGhlIGJhc2UgVVJMIGZvciBHZXJyaXQgcHJvamVjdHMgb24gdGhpcyBob3N0LgorICAgKgorICAgKiBAcGFyYW0gcmVxIHJlcXVlc3QuCisgICAqIEByZXR1cm4gYmFzZSBVUkwgZm9yIEdlcnJpdCBDb2RlIFJldmlldywgb3IgbnVsbCBpZiBHZXJyaXQgaXMgbm90CisgICAqICAgICBjb25maWd1cmVkLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRCYXNlR2Vycml0VXJsKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpOworfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0dpdGlsZXNWaWV3LmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvR2l0aWxlc1ZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDY4NWM0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0dpdGlsZXNWaWV3LmphdmEKQEAgLTAsMCArMSw1NjMgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja1N0YXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdpdGlsZXMuR2l0aWxlc1VybHMuTkFNRV9FU0NBUEVSOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5DaGFyc2V0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9iamVjdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkxpbmtlZExpc3RNdWx0aW1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RNdWx0aW1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk11bHRpbWFwczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZPYmplY3Q7CisKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKKworLyoqCisgKiBJbmZvcm1hdGlvbiBhYm91dCBhIHZpZXcgaW4gR2l0aWxlcy4KKyAqIDxwPgorICogVmlld3MgYXJlIHVuaXF1ZWx5IGlkZW50aWZpZWQgYnkgYSB0eXBlLCBhbmQgZGlzcGF0Y2hlZCB0byBzZXJ2bGV0IHR5cGVzIGJ5CisgKiB7QGxpbmsgR2l0aWxlc1NlcnZsZXR9LiBUaGlzIGNsYXNzIGNvbnRhaW5zIHRoZSBsaXN0IG9mIGFsbCB0eXBlcywgYXMKKyAqIHdlbGwgYXMgc29tZSBtZXRob2RzIGNvbnRhaW5pbmcgYmFzaWMgaW5mb3JtYXRpb24gcGFyc2VkIGZyb20gdGhlIFVSTC4KKyAqIENvbnN0cnVjdGlvbiBoYXBwZW5zIGluIHtAbGluayBWaWV3RmlsdGVyfS4KKyAqLworcHVibGljIGNsYXNzIEdpdGlsZXNWaWV3IHsKKyAgLyoqIEFsbCB0aGUgcG9zc2libGUgdmlldyB0eXBlcyBzdXBwb3J0ZWQgaW4gdGhlIGFwcGxpY2F0aW9uLiAqLworICBwdWJsaWMgc3RhdGljIGVudW0gVHlwZSB7CisgICAgSE9TVF9JTkRFWCwKKyAgICBSRVBPU0lUT1JZX0lOREVYLAorICAgIFJFVklTSU9OLAorICAgIFBBVEgsCisgICAgRElGRiwKKyAgICBMT0c7CisgIH0KKworICAvKiogQnVpbGRlciBmb3Igdmlld3MuICovCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlciB7CisgICAgcHJpdmF0ZSBmaW5hbCBUeXBlIHR5cGU7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0TXVsdGltYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtcyA9IExpbmtlZExpc3RNdWx0aW1hcC5jcmVhdGUoKTsKKworICAgIHByaXZhdGUgU3RyaW5nIGhvc3ROYW1lOworICAgIHByaXZhdGUgU3RyaW5nIHNlcnZsZXRQYXRoOworICAgIHByaXZhdGUgU3RyaW5nIHJlcG9zaXRvcnlOYW1lOworICAgIHByaXZhdGUgUmV2aXNpb24gcmV2aXNpb24gPSBSZXZpc2lvbi5OVUxMOworICAgIHByaXZhdGUgUmV2aXNpb24gb2xkUmV2aXNpb24gPSBSZXZpc2lvbi5OVUxMOworICAgIHByaXZhdGUgU3RyaW5nIHBhdGg7CisgICAgcHJpdmF0ZSBTdHJpbmcgYW5jaG9yOworCisgICAgcHJpdmF0ZSBCdWlsZGVyKFR5cGUgdHlwZSkgeworICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlciBjb3B5RnJvbShHaXRpbGVzVmlldyBvdGhlcikgeworICAgICAgaG9zdE5hbWUgPSBvdGhlci5ob3N0TmFtZTsKKyAgICAgIHNlcnZsZXRQYXRoID0gb3RoZXIuc2VydmxldFBhdGg7CisgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBMT0c6CisgICAgICAgIGNhc2UgRElGRjoKKyAgICAgICAgICBvbGRSZXZpc2lvbiA9IG90aGVyLm9sZFJldmlzaW9uOworICAgICAgICAgIC8vIEZhbGx0aHJvdWdoLgorICAgICAgICBjYXNlIFBBVEg6CisgICAgICAgICAgcGF0aCA9IG90aGVyLnBhdGg7CisgICAgICAgICAgLy8gRmFsbHRocm91Z2guCisgICAgICAgIGNhc2UgUkVWSVNJT046CisgICAgICAgICAgcmV2aXNpb24gPSBvdGhlci5yZXZpc2lvbjsKKyAgICAgICAgICAvLyBGYWxsdGhyb3VnaC4KKyAgICAgICAgY2FzZSBSRVBPU0lUT1JZX0lOREVYOgorICAgICAgICAgIHJlcG9zaXRvcnlOYW1lID0gb3RoZXIucmVwb3NpdG9yeU5hbWU7CisgICAgICB9CisgICAgICAvLyBEb24ndCBjb3B5IHBhcmFtcy4KKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyIGNvcHlGcm9tKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKyAgICAgIHJldHVybiBjb3B5RnJvbShWaWV3RmlsdGVyLmdldFZpZXcocmVxKSk7CisgICAgfQorCisgICAgcHVibGljIEJ1aWxkZXIgc2V0SG9zdE5hbWUoU3RyaW5nIGhvc3ROYW1lKSB7CisgICAgICB0aGlzLmhvc3ROYW1lID0gY2hlY2tOb3ROdWxsKGhvc3ROYW1lKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SG9zdE5hbWUoKSB7CisgICAgICByZXR1cm4gaG9zdE5hbWU7CisgICAgfQorCisgICAgcHVibGljIEJ1aWxkZXIgc2V0U2VydmxldFBhdGgoU3RyaW5nIHNlcnZsZXRQYXRoKSB7CisgICAgICB0aGlzLnNlcnZsZXRQYXRoID0gY2hlY2tOb3ROdWxsKHNlcnZsZXRQYXRoKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmxldFBhdGgoKSB7CisgICAgICByZXR1cm4gc2VydmxldFBhdGg7CisgICAgfQorCisgICAgcHVibGljIEJ1aWxkZXIgc2V0UmVwb3NpdG9yeU5hbWUoU3RyaW5nIHJlcG9zaXRvcnlOYW1lKSB7CisgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBIT1NUX0lOREVYOgorICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgImNhbm5vdCBzZXQgcmVwb3NpdG9yeSBuYW1lIG9uICVzIHZpZXciLCB0eXBlKSk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhpcy5yZXBvc2l0b3J5TmFtZSA9IGNoZWNrTm90TnVsbChyZXBvc2l0b3J5TmFtZSk7CisgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRSZXBvc2l0b3J5TmFtZSgpIHsKKyAgICAgIHJldHVybiByZXBvc2l0b3J5TmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlciBzZXRSZXZpc2lvbihSZXZpc2lvbiByZXZpc2lvbikgeworICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgSE9TVF9JTkRFWDoKKyAgICAgICAgY2FzZSBSRVBPU0lUT1JZX0lOREVYOgorICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiY2Fubm90IHNldCByZXZpc2lvbiBvbiAlcyB2aWV3IiwgdHlwZSkpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHRoaXMucmV2aXNpb24gPSBjaGVja05vdE51bGwocmV2aXNpb24pOworICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyIHNldFJldmlzaW9uKFN0cmluZyBuYW1lKSB7CisgICAgICByZXR1cm4gc2V0UmV2aXNpb24oUmV2aXNpb24ubmFtZWQobmFtZSkpOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyIHNldFJldmlzaW9uKFJldk9iamVjdCBvYmopIHsKKyAgICAgIHJldHVybiBzZXRSZXZpc2lvbihSZXZpc2lvbi5wZWVsZWQob2JqLm5hbWUoKSwgb2JqKSk7CisgICAgfQorCisgICAgcHVibGljIEJ1aWxkZXIgc2V0UmV2aXNpb24oU3RyaW5nIG5hbWUsIFJldk9iamVjdCBvYmopIHsKKyAgICAgIHJldHVybiBzZXRSZXZpc2lvbihSZXZpc2lvbi5wZWVsZWQobmFtZSwgb2JqKSk7CisgICAgfQorCisgICAgcHVibGljIFJldmlzaW9uIGdldFJldmlzaW9uKCkgeworICAgICAgcmV0dXJuIHJldmlzaW9uOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyIHNldE9sZFJldmlzaW9uKFJldmlzaW9uIHJldmlzaW9uKSB7CisgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBESUZGOgorICAgICAgICBjYXNlIExPRzoKKyAgICAgICAgICB0aGlzLm9sZFJldmlzaW9uID0gY2hlY2tOb3ROdWxsKHJldmlzaW9uKTsKKyAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJjYW5ub3Qgc2V0IG9sZCByZXZpc2lvbiBvbiAlcyB2aWV3IiwgdHlwZSkpOworICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyIHNldE9sZFJldmlzaW9uKFJldk9iamVjdCBvYmopIHsKKyAgICAgIHJldHVybiBzZXRPbGRSZXZpc2lvbihSZXZpc2lvbi5wZWVsZWQob2JqLm5hbWUoKSwgb2JqKSk7CisgICAgfQorCisgICAgcHVibGljIEJ1aWxkZXIgc2V0T2xkUmV2aXNpb24oU3RyaW5nIG5hbWUsIFJldk9iamVjdCBvYmopIHsKKyAgICAgIHJldHVybiBzZXRPbGRSZXZpc2lvbihSZXZpc2lvbi5wZWVsZWQobmFtZSwgb2JqKSk7CisgICAgfQorCisgICAgcHVibGljIFJldmlzaW9uIGdldE9sZFJldmlzaW9uKCkgeworICAgICAgcmV0dXJuIHJldmlzaW9uOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyIHNldFRyZWVQYXRoKFN0cmluZyBwYXRoKSB7CisgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBQQVRIOgorICAgICAgICBjYXNlIERJRkY6CisgICAgICAgICAgdGhpcy5wYXRoID0gbWF5YmVUcmltTGVhZGluZ0FuZFRyYWlsaW5nU2xhc2goY2hlY2tOb3ROdWxsKHBhdGgpKTsKKyAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgY2FzZSBMT0c6CisgICAgICAgICAgdGhpcy5wYXRoID0gcGF0aCAhPSBudWxsID8gbWF5YmVUcmltTGVhZGluZ0FuZFRyYWlsaW5nU2xhc2gocGF0aCkgOiBudWxsOworICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiY2Fubm90IHNldCBwYXRoIG9uICVzIHZpZXciLCB0eXBlKSk7CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUcmVlUGF0aCgpIHsKKyAgICAgIHJldHVybiBwYXRoOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyIHB1dFBhcmFtKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgeworICAgICAgcGFyYW1zLnB1dChrZXksIHZhbHVlKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyIHJlcGxhY2VQYXJhbShTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgIHBhcmFtcy5yZXBsYWNlVmFsdWVzKGtleSwgSW1tdXRhYmxlTGlzdC5vZih2YWx1ZSkpOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEJ1aWxkZXIgcHV0QWxsUGFyYW1zKE1hcDxTdHJpbmcsIFN0cmluZ1tdPiBwYXJhbXMpIHsKKyAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nW10+IGUgOiBwYXJhbXMuZW50cnlTZXQoKSkgeworICAgICAgICBmb3IgKFN0cmluZyB2IDogZS5nZXRWYWx1ZSgpKSB7CisgICAgICAgICAgdGhpcy5wYXJhbXMucHV0KGUuZ2V0S2V5KCksIHYpOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdE11bHRpbWFwPFN0cmluZywgU3RyaW5nPiBnZXRQYXJhbXMoKSB7CisgICAgICByZXR1cm4gcGFyYW1zOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyIHNldEFuY2hvcihTdHJpbmcgYW5jaG9yKSB7CisgICAgICB0aGlzLmFuY2hvciA9IGFuY2hvcjsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5jaG9yKCkgeworICAgICAgcmV0dXJuIGFuY2hvcjsKKyAgICB9CisKKyAgICBwdWJsaWMgR2l0aWxlc1ZpZXcgYnVpbGQoKSB7CisgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBIT1NUX0lOREVYOgorICAgICAgICAgIGNoZWNrSG9zdEluZGV4KCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVQT1NJVE9SWV9JTkRFWDoKKyAgICAgICAgICBjaGVja1JlcG9zaXRvcnlJbmRleCgpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFVklTSU9OOgorICAgICAgICAgIGNoZWNrUmV2aXNpb24oKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQQVRIOgorICAgICAgICAgIGNoZWNrUGF0aCgpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERJRkY6CisgICAgICAgICAgY2hlY2tEaWZmKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTE9HOgorICAgICAgICAgIGNoZWNrTG9nKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICByZXR1cm4gbmV3IEdpdGlsZXNWaWV3KHR5cGUsIGhvc3ROYW1lLCBzZXJ2bGV0UGF0aCwgcmVwb3NpdG9yeU5hbWUsIHJldmlzaW9uLAorICAgICAgICAgIG9sZFJldmlzaW9uLCBwYXRoLCBwYXJhbXMsIGFuY2hvcik7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1VybCgpIHsKKyAgICAgIHJldHVybiBidWlsZCgpLnRvVXJsKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrSG9zdEluZGV4KCkgeworICAgICAgY2hlY2tTdGF0ZShob3N0TmFtZSAhPSBudWxsLCAibWlzc2luZyBob3N0TmFtZSBvbiAlcyB2aWV3IiwgdHlwZSk7CisgICAgICBjaGVja1N0YXRlKHNlcnZsZXRQYXRoICE9IG51bGwsICJtaXNzaW5nIGhvc3ROYW1lIG9uICVzIHZpZXciLCB0eXBlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tSZXBvc2l0b3J5SW5kZXgoKSB7CisgICAgICBjaGVja1N0YXRlKHJlcG9zaXRvcnlOYW1lICE9IG51bGwsICJtaXNzaW5nIHJlcG9zaXRvcnkgbmFtZSBvbiAlcyB2aWV3IiwgdHlwZSk7CisgICAgICBjaGVja0hvc3RJbmRleCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja1JldmlzaW9uKCkgeworICAgICAgY2hlY2tTdGF0ZShyZXZpc2lvbiAhPSBSZXZpc2lvbi5OVUxMLCAibWlzc2luZyByZXZpc2lvbiBvbiAlcyB2aWV3IiwgdHlwZSk7CisgICAgICBjaGVja1JlcG9zaXRvcnlJbmRleCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja0RpZmYoKSB7CisgICAgICBjaGVja1BhdGgoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tMb2coKSB7CisgICAgICBjaGVja1JldmlzaW9uKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrUGF0aCgpIHsKKyAgICAgIGNoZWNrU3RhdGUocGF0aCAhPSBudWxsLCAibWlzc2luZyBwYXRoIG9uICVzIHZpZXciLCB0eXBlKTsKKyAgICAgIGNoZWNrUmV2aXNpb24oKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgaG9zdEluZGV4KCkgeworICAgIHJldHVybiBuZXcgQnVpbGRlcihUeXBlLkhPU1RfSU5ERVgpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBCdWlsZGVyIHJlcG9zaXRvcnlJbmRleCgpIHsKKyAgICByZXR1cm4gbmV3IEJ1aWxkZXIoVHlwZS5SRVBPU0lUT1JZX0lOREVYKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciByZXZpc2lvbigpIHsKKyAgICByZXR1cm4gbmV3IEJ1aWxkZXIoVHlwZS5SRVZJU0lPTik7CisgIH0KKworICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgcGF0aCgpIHsKKyAgICByZXR1cm4gbmV3IEJ1aWxkZXIoVHlwZS5QQVRIKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBkaWZmKCkgeworICAgIHJldHVybiBuZXcgQnVpbGRlcihUeXBlLkRJRkYpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBCdWlsZGVyIGxvZygpIHsKKyAgICByZXR1cm4gbmV3IEJ1aWxkZXIoVHlwZS5MT0cpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1heWJlVHJpbUxlYWRpbmdBbmRUcmFpbGluZ1NsYXNoKFN0cmluZyBzdHIpIHsKKyAgICBpZiAoc3RyLnN0YXJ0c1dpdGgoIi8iKSkgeworICAgICAgc3RyID0gc3RyLnN1YnN0cmluZygxKTsKKyAgICB9CisgICAgcmV0dXJuICFzdHIuaXNFbXB0eSgpICYmIHN0ci5lbmRzV2l0aCgiLyIpID8gc3RyLnN1YnN0cmluZygwLCBzdHIubGVuZ3RoKCkgLSAxKSA6IHN0cjsKKyAgfQorCisgIHByaXZhdGUgZmluYWwgVHlwZSB0eXBlOworICBwcml2YXRlIGZpbmFsIFN0cmluZyBob3N0TmFtZTsKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc2VydmxldFBhdGg7CisgIHByaXZhdGUgZmluYWwgU3RyaW5nIHJlcG9zaXRvcnlOYW1lOworICBwcml2YXRlIGZpbmFsIFJldmlzaW9uIHJldmlzaW9uOworICBwcml2YXRlIGZpbmFsIFJldmlzaW9uIG9sZFJldmlzaW9uOworICBwcml2YXRlIGZpbmFsIFN0cmluZyBwYXRoOworICBwcml2YXRlIGZpbmFsIExpc3RNdWx0aW1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zOworICBwcml2YXRlIGZpbmFsIFN0cmluZyBhbmNob3I7CisKKyAgcHJpdmF0ZSBHaXRpbGVzVmlldyhUeXBlIHR5cGUsCisgICAgICBTdHJpbmcgaG9zdE5hbWUsCisgICAgICBTdHJpbmcgc2VydmxldFBhdGgsCisgICAgICBTdHJpbmcgcmVwb3NpdG9yeU5hbWUsCisgICAgICBSZXZpc2lvbiByZXZpc2lvbiwKKyAgICAgIFJldmlzaW9uIG9sZFJldmlzaW9uLAorICAgICAgU3RyaW5nIHBhdGgsCisgICAgICBMaXN0TXVsdGltYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtcywKKyAgICAgIFN0cmluZyBhbmNob3IpIHsKKyAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgIHRoaXMuaG9zdE5hbWUgPSBob3N0TmFtZTsKKyAgICB0aGlzLnNlcnZsZXRQYXRoID0gc2VydmxldFBhdGg7CisgICAgdGhpcy5yZXBvc2l0b3J5TmFtZSA9IHJlcG9zaXRvcnlOYW1lOworICAgIHRoaXMucmV2aXNpb24gPSBPYmplY3RzLmZpcnN0Tm9uTnVsbChyZXZpc2lvbiwgUmV2aXNpb24uTlVMTCk7CisgICAgdGhpcy5vbGRSZXZpc2lvbiA9IE9iamVjdHMuZmlyc3ROb25OdWxsKG9sZFJldmlzaW9uLCBSZXZpc2lvbi5OVUxMKTsKKyAgICB0aGlzLnBhdGggPSBwYXRoOworICAgIHRoaXMucGFyYW1zID0gTXVsdGltYXBzLnVubW9kaWZpYWJsZUxpc3RNdWx0aW1hcChwYXJhbXMpOworICAgIHRoaXMuYW5jaG9yID0gYW5jaG9yOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRIb3N0TmFtZSgpIHsKKyAgICByZXR1cm4gaG9zdE5hbWU7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldFNlcnZsZXRQYXRoKCkgeworICAgIHJldHVybiBzZXJ2bGV0UGF0aDsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0UmVwb3NpdG9yeU5hbWUoKSB7CisgICAgcmV0dXJuIHJlcG9zaXRvcnlOYW1lOworICB9CisKKyAgcHVibGljIFJldmlzaW9uIGdldFJldmlzaW9uKCkgeworICAgIHJldHVybiByZXZpc2lvbjsKKyAgfQorCisgIHB1YmxpYyBSZXZpc2lvbiBnZXRPbGRSZXZpc2lvbigpIHsKKyAgICByZXR1cm4gb2xkUmV2aXNpb247CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldFJldmlzaW9uUmFuZ2UoKSB7CisgICAgaWYgKG9sZFJldmlzaW9uID09IFJldmlzaW9uLk5VTEwpIHsKKyAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIExPRzoKKyAgICAgICAgY2FzZSBESUZGOgorICAgICAgICAgIC8vIEZvciB0eXBlcyB0aGF0IHJlcXVpcmUgdHdvIHJldmlzaW9ucywgTlVMTCBpbmRpY2F0ZXMgdGhlIGVtcHR5CisgICAgICAgICAgLy8gdHJlZS9jb21taXQuCisgICAgICAgICAgcmV0dXJuIHJldmlzaW9uLmdldE5hbWUoKSArICJeISI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgLy8gRm9yIGV2ZXJ5dGhpbmcgZWxzZSBOVUxMIGluZGljYXRlcyBpdCBpcyBub3QgYSByYW5nZSwganVzdCBhIHNpbmdsZQorICAgICAgICAgIC8vIHJldmlzaW9uLgorICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZSA9PSBUeXBlLkRJRkYgJiYgaXNGaXJzdFBhcmVudChyZXZpc2lvbiwgb2xkUmV2aXNpb24pKSB7CisgICAgICByZXR1cm4gcmV2aXNpb24uZ2V0TmFtZSgpICsgIl4hIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG9sZFJldmlzaW9uLmdldE5hbWUoKSArICIuLiIgKyByZXZpc2lvbi5nZXROYW1lKCk7CisgICAgfQorICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRUcmVlUGF0aCgpIHsKKyAgICByZXR1cm4gcGF0aDsKKyAgfQorCisgIHB1YmxpYyBMaXN0TXVsdGltYXA8U3RyaW5nLCBTdHJpbmc+IGdldFBhcmFtZXRlcnMoKSB7CisgICAgcmV0dXJuIHBhcmFtczsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0QW5jaG9yKCkgeworICAgIHJldHVybiBhbmNob3I7CisgIH0KKworICBwdWJsaWMgVHlwZSBnZXRUeXBlKCkgeworICAgIHJldHVybiB0eXBlOworICB9CisKKyAgLyoqIEByZXR1cm4gYW4gZXNjYXBlZCwgcmVsYXRpdmUgVVJMIHJlcHJlc2VudGluZyB0aGlzIHZpZXcuICovCisgIHB1YmxpYyBTdHJpbmcgdG9VcmwoKSB7CisgICAgU3RyaW5nQnVpbGRlciB1cmwgPSBuZXcgU3RyaW5nQnVpbGRlcihzZXJ2bGV0UGF0aCkuYXBwZW5kKCcvJyk7CisgICAgTGlzdE11bHRpbWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbXMgPSB0aGlzLnBhcmFtczsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgIGNhc2UgSE9TVF9JTkRFWDoKKyAgICAgICAgcGFyYW1zID0gTGlua2VkTGlzdE11bHRpbWFwLmNyZWF0ZSgpOworICAgICAgICBpZiAoIXRoaXMucGFyYW1zLmNvbnRhaW5zS2V5KCJmb3JtYXQiKSkgeworICAgICAgICAgIHBhcmFtcy5wdXQoImZvcm1hdCIsIEZvcm1hdFR5cGUuSFRNTC50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBwYXJhbXMucHV0QWxsKHRoaXMucGFyYW1zKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFJFUE9TSVRPUllfSU5ERVg6CisgICAgICAgIHVybC5hcHBlbmQocmVwb3NpdG9yeU5hbWUpLmFwcGVuZCgnLycpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUkVWSVNJT046CisgICAgICAgIHVybC5hcHBlbmQocmVwb3NpdG9yeU5hbWUpLmFwcGVuZCgiLysiKTsKKyAgICAgICAgaWYgKCFnZXRSZXZpc2lvbigpLm5hbWVJc0lkKCkpIHsKKyAgICAgICAgICB1cmwuYXBwZW5kKCJzaG93Iik7IC8vIERlZmF1bHQgZm9yIC8rL21hc3RlciBpcyArbG9nLgorICAgICAgICB9CisgICAgICAgIHVybC5hcHBlbmQoJy8nKS5hcHBlbmQocmV2aXNpb24uZ2V0TmFtZSgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBBVEg6CisgICAgICAgIHVybC5hcHBlbmQocmVwb3NpdG9yeU5hbWUpLmFwcGVuZCgiLysvIikuYXBwZW5kKHJldmlzaW9uLmdldE5hbWUoKSkuYXBwZW5kKCcvJykKKyAgICAgICAgICAgIC5hcHBlbmQocGF0aCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBESUZGOgorICAgICAgICB1cmwuYXBwZW5kKHJlcG9zaXRvcnlOYW1lKS5hcHBlbmQoIi8rLyIpOworICAgICAgICBpZiAoaXNGaXJzdFBhcmVudChyZXZpc2lvbiwgb2xkUmV2aXNpb24pKSB7CisgICAgICAgICAgdXJsLmFwcGVuZChyZXZpc2lvbi5nZXROYW1lKCkpLmFwcGVuZCgiXiEiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB1cmwuYXBwZW5kKG9sZFJldmlzaW9uLmdldE5hbWUoKSkuYXBwZW5kKCIuLiIpLmFwcGVuZChyZXZpc2lvbi5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIHVybC5hcHBlbmQoJy8nKS5hcHBlbmQocGF0aCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBMT0c6CisgICAgICAgIHVybC5hcHBlbmQocmVwb3NpdG9yeU5hbWUpLmFwcGVuZCgiLysiKTsKKyAgICAgICAgaWYgKGdldFJldmlzaW9uKCkubmFtZUlzSWQoKSB8fCBvbGRSZXZpc2lvbiAhPSBSZXZpc2lvbi5OVUxMIHx8IHBhdGggIT0gbnVsbCkgeworICAgICAgICAgLy8gRGVmYXVsdCBmb3IgLysvYzBmZmVlLyguLi4pIGlzICtzaG93LgorICAgICAgICAgLy8gRGVmYXVsdCBmb3IgLysvYzBmZmVlLi5kZWFkYmVlZigvLi4uKSBpcyArZGlmZi4KKyAgICAgICAgICB1cmwuYXBwZW5kKCJsb2ciKTsKKyAgICAgICAgfQorICAgICAgICB1cmwuYXBwZW5kKCcvJyk7CisgICAgICAgIGlmIChvbGRSZXZpc2lvbiAhPSBSZXZpc2lvbi5OVUxMKSB7CisgICAgICAgICAgdXJsLmFwcGVuZChvbGRSZXZpc2lvbi5nZXROYW1lKCkpLmFwcGVuZCgiLi4iKTsKKyAgICAgICAgfQorICAgICAgICB1cmwuYXBwZW5kKHJldmlzaW9uLmdldE5hbWUoKSk7CisgICAgICAgIGlmIChwYXRoICE9IG51bGwpIHsKKyAgICAgICAgICB1cmwuYXBwZW5kKCcvJykuYXBwZW5kKHBhdGgpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5rbm93biB2aWV3IHR5cGU6ICIgKyB0eXBlKTsKKyAgICB9CisgICAgU3RyaW5nIGJhc2VVcmwgPSBOQU1FX0VTQ0FQRVIuYXBwbHkodXJsLnRvU3RyaW5nKCkpOworICAgIHVybCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgaWYgKCFwYXJhbXMuaXNFbXB0eSgpKSB7CisgICAgICB1cmwuYXBwZW5kKCc/JykuYXBwZW5kKHBhcmFtc1RvU3RyaW5nKHBhcmFtcykpOworICAgIH0KKyAgICBpZiAoIVN0cmluZ3MuaXNOdWxsT3JFbXB0eShhbmNob3IpKSB7CisgICAgICB1cmwuYXBwZW5kKCcjJykuYXBwZW5kKE5BTUVfRVNDQVBFUi5hcHBseShhbmNob3IpKTsKKyAgICB9CisgICAgcmV0dXJuIGJhc2VVcmwgKyB1cmwudG9TdHJpbmcoKTsKKyAgfQorCisgIHB1YmxpYyBMaXN0PE1hcDxTdHJpbmcsIFN0cmluZz4+IGdldEJyZWFkY3J1bWJzKCkgeworICAgIFN0cmluZyBwYXRoID0gdGhpcy5wYXRoOworICAgIEltbXV0YWJsZUxpc3QuQnVpbGRlcjxNYXA8U3RyaW5nLCBTdHJpbmc+PiBicmVhZGNydW1icyA9IEltbXV0YWJsZUxpc3QuYnVpbGRlcigpOworICAgIGJyZWFkY3J1bWJzLmFkZChicmVhZGNydW1iKGhvc3ROYW1lLCBob3N0SW5kZXgoKS5jb3B5RnJvbSh0aGlzKSkpOworICAgIGlmIChyZXBvc2l0b3J5TmFtZSAhPSBudWxsKSB7CisgICAgICBicmVhZGNydW1icy5hZGQoYnJlYWRjcnVtYihyZXBvc2l0b3J5TmFtZSwgcmVwb3NpdG9yeUluZGV4KCkuY29weUZyb20odGhpcykpKTsKKyAgICB9CisgICAgaWYgKHR5cGUgPT0gVHlwZS5ESUZGKSB7CisgICAgICAvLyBUT0RPKGRib3Jvd2l0eik6IFR3ZWFrIHRoZSBicmVhZGNydW1icyB0ZW1wbGF0ZSB0byBhbGxvdyB1cyB0byByZW5kZXIKKyAgICAgIC8vIHNlcGFyYXRlIGxpbmtzIGluICJvbGQuLm5ldyIuCisgICAgICBicmVhZGNydW1icy5hZGQoYnJlYWRjcnVtYihnZXRSZXZpc2lvblJhbmdlKCksIGRpZmYoKS5jb3B5RnJvbSh0aGlzKS5zZXRUcmVlUGF0aCgiIikpKTsKKyAgICB9IGVsc2UgaWYgKHR5cGUgPT0gVHlwZS5MT0cpIHsKKyAgICAgIC8vIFRPRE8oZGJvcm93aXR6KTogQWRkIHNvbWV0aGluZyBpbiB0aGUgbmF2aWdhdGlvbiBhcmVhIChwcm9iYWJseSBub3QKKyAgICAgIC8vIGEgYnJlYWRjcnVtYikgdG8gYWxsb3cgc3dpdGNoaW5nIGJldHdlZW4gLytsb2cvIGFuZCAvKy8uCisgICAgICBpZiAob2xkUmV2aXNpb24gPT0gUmV2aXNpb24uTlVMTCkgeworICAgICAgICBicmVhZGNydW1icy5hZGQoYnJlYWRjcnVtYihyZXZpc2lvbi5nZXROYW1lKCksIGxvZygpLmNvcHlGcm9tKHRoaXMpLnNldFRyZWVQYXRoKG51bGwpKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBicmVhZGNydW1icy5hZGQoYnJlYWRjcnVtYihnZXRSZXZpc2lvblJhbmdlKCksIGxvZygpLmNvcHlGcm9tKHRoaXMpLnNldFRyZWVQYXRoKG51bGwpKSk7CisgICAgICB9CisgICAgICBwYXRoID0gU3RyaW5ncy5lbXB0eVRvTnVsbChwYXRoKTsKKyAgICB9IGVsc2UgaWYgKHJldmlzaW9uICE9IFJldmlzaW9uLk5VTEwpIHsKKyAgICAgIGJyZWFkY3J1bWJzLmFkZChicmVhZGNydW1iKHJldmlzaW9uLmdldE5hbWUoKSwgcmV2aXNpb24oKS5jb3B5RnJvbSh0aGlzKSkpOworICAgIH0KKyAgICBpZiAocGF0aCAhPSBudWxsKSB7CisgICAgICBpZiAodHlwZSAhPSBUeXBlLkxPRykgeyAvLyBUaGUgIi4iIGJyZWFkY3J1bWIgd291bGQgYmUgbm8gZGlmZmVyZW50IGZvciBMT0cuCisgICAgICAgIGJyZWFkY3J1bWJzLmFkZChicmVhZGNydW1iKCIuIiwgY29weVdpdGhQYXRoKCkuc2V0VHJlZVBhdGgoIiIpKSk7CisgICAgICB9CisgICAgICBTdHJpbmdCdWlsZGVyIGN1ciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKyAgICAgIGZvciAoU3RyaW5nIHBhcnQgOiBSZXZpc2lvblBhcnNlci5QQVRIX1NQTElUVEVSLm9taXRFbXB0eVN0cmluZ3MoKS5zcGxpdChwYXRoKSkgeworICAgICAgICBpZiAoIWZpcnN0KSB7CisgICAgICAgICAgY3VyLmFwcGVuZCgnLycpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgY3VyLmFwcGVuZChwYXJ0KTsKKyAgICAgICAgYnJlYWRjcnVtYnMuYWRkKGJyZWFkY3J1bWIocGFydCwgY29weVdpdGhQYXRoKCkuc2V0VHJlZVBhdGgoY3VyLnRvU3RyaW5nKCkpKSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBicmVhZGNydW1icy5idWlsZCgpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBicmVhZGNydW1iKFN0cmluZyB0ZXh0LCBCdWlsZGVyIHVybCkgeworICAgIHJldHVybiBJbW11dGFibGVNYXAub2YoInRleHQiLCB0ZXh0LCAidXJsIiwgdXJsLnRvVXJsKCkpOworICB9CisKKyAgcHJpdmF0ZSBCdWlsZGVyIGNvcHlXaXRoUGF0aCgpIHsKKyAgICBCdWlsZGVyIGNvcHk7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICBjYXNlIERJRkY6CisgICAgICAgIGNvcHkgPSBkaWZmKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBMT0c6CisgICAgICAgIGNvcHkgPSBsb2coKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBjb3B5ID0gcGF0aCgpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGNvcHkuY29weUZyb20odGhpcyk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRmlyc3RQYXJlbnQoUmV2aXNpb24gcmV2MSwgUmV2aXNpb24gcmV2MikgeworICAgIHJldHVybiByZXYyID09IFJldmlzaW9uLk5VTEwKKyAgICAgICAgfHwgcmV2Mi5nZXROYW1lKCkuZXF1YWxzKHJldjEuZ2V0TmFtZSgpICsgIl4iKQorICAgICAgICB8fCByZXYyLmdldE5hbWUoKS5lcXVhbHMocmV2MS5nZXROYW1lKCkgKyAifjEiKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBwYXJhbXNUb1N0cmluZyhMaXN0TXVsdGltYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtcykgeworICAgIHRyeSB7CisgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGUgOiBwYXJhbXMuZW50cmllcygpKSB7CisgICAgICBpZiAoIWZpcnN0KSB7CisgICAgICAgIHNiLmFwcGVuZCgnJicpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0KKyAgICAgIHNiLmFwcGVuZChVUkxFbmNvZGVyLmVuY29kZShlLmdldEtleSgpLCBDaGFyc2V0cy5VVEZfOC5uYW1lKCkpKTsKKyAgICAgIGlmICghIiIuZXF1YWxzKGUuZ2V0VmFsdWUoKSkpIHsKKyAgICAgICAgc2IuYXBwZW5kKCc9JykKKyAgICAgICAgICAgIC5hcHBlbmQoVVJMRW5jb2Rlci5lbmNvZGUoZS5nZXRWYWx1ZSgpLCBDaGFyc2V0cy5VVEZfOC5uYW1lKCkpKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGUpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0hvc3RJbmRleFNlcnZsZXQuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9Ib3N0SW5kZXhTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY5ZmZkMQotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9Ib3N0SW5kZXhTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSwxOTkgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2l0aWxlcy5Gb3JtYXRUeXBlLkpTT047CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2l0aWxlcy5Gb3JtYXRUeXBlLlRFWFQ7CitpbXBvcnQgc3RhdGljIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNUOworaW1wb3J0IHN0YXRpYyBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19GT1JCSURERU47CitpbXBvcnQgc3RhdGljIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlLlNDX05PVF9GT1VORDsKK2ltcG9ydCBzdGF0aWMgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfU0VSVklDRV9VTkFWQUlMQUJMRTsKK2ltcG9ydCBzdGF0aWMgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfVU5BVVRIT1JJWkVEOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5uZXQuSHR0cEhlYWRlcnM7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkZpZWxkTmFtaW5nUG9saWN5OworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uQnVpbGRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24ucmVmbGVjdC5UeXBlVG9rZW47CitpbXBvcnQgY29tLmdvb2dsZS50ZW1wbGF0ZS5zb3kuZGF0YS5Tb3lMaXN0RGF0YTsKK2ltcG9ydCBjb20uZ29vZ2xlLnRlbXBsYXRlLnNveS5kYXRhLlNveU1hcERhdGE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5SZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuU2VydmljZU1heU5vdENvbnRpbnVlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyLlNlcnZpY2VOb3RBdXRob3JpemVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyLlNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCisvKiogU2VydmVzIHRoZSB0b3AgbGV2ZWwgaW5kZXggcGFnZSBmb3IgYSBHaXRpbGVzIGhvc3QuICovCitwdWJsaWMgY2xhc3MgSG9zdEluZGV4U2VydmxldCBleHRlbmRzIEJhc2VTZXJ2bGV0IHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEhvc3RJbmRleFNlcnZsZXQuY2xhc3MpOworCisgIHByb3RlY3RlZCBmaW5hbCBHaXRpbGVzVXJscyB1cmxzOworICBwcml2YXRlIGZpbmFsIEdpdGlsZXNBY2Nlc3MuRmFjdG9yeSBhY2Nlc3NGYWN0b3J5OworCisgIHB1YmxpYyBIb3N0SW5kZXhTZXJ2bGV0KFJlbmRlcmVyIHJlbmRlcmVyLCBHaXRpbGVzVXJscyB1cmxzLAorICAgICAgR2l0aWxlc0FjY2Vzcy5GYWN0b3J5IGFjY2Vzc0ZhY3RvcnkpIHsKKyAgICBzdXBlcihyZW5kZXJlcik7CisgICAgdGhpcy51cmxzID0gY2hlY2tOb3ROdWxsKHVybHMsICJ1cmxzIik7CisgICAgdGhpcy5hY2Nlc3NGYWN0b3J5ID0gY2hlY2tOb3ROdWxsKGFjY2Vzc0ZhY3RvcnksICJhY2Nlc3NGYWN0b3J5Iik7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgRm9ybWF0VHlwZSBmb3JtYXQ7CisgICAgdHJ5IHsKKyAgICAgIGZvcm1hdCA9IEZvcm1hdFR5cGUuZ2V0Rm9ybWF0VHlwZShyZXEpOworICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlcnIpIHsKKyAgICAgIHJlcy5zZW5kRXJyb3IoU0NfQkFEX1JFUVVFU1QpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFNldDxTdHJpbmc+IGJyYW5jaGVzID0gcGFyc2VTaG93QnJhbmNoKHJlcSk7CisgICAgTWFwPFN0cmluZywgUmVwb3NpdG9yeURlc2NyaXB0aW9uPiBkZXNjczsKKyAgICB0cnkgeworICAgICAgZGVzY3MgPSBhY2Nlc3NGYWN0b3J5LmZvclJlcXVlc3QocmVxKS5saXN0UmVwb3NpdG9yaWVzKGJyYW5jaGVzKTsKKyAgICB9IGNhdGNoIChSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgcmVzLnNlbmRFcnJvcihTQ19OT1RfRk9VTkQpOworICAgICAgcmV0dXJuOworICAgIH0gY2F0Y2ggKFNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgIHJlcy5zZW5kRXJyb3IoU0NfRk9SQklEREVOKTsKKyAgICAgIHJldHVybjsKKyAgICB9IGNhdGNoIChTZXJ2aWNlTm90QXV0aG9yaXplZEV4Y2VwdGlvbiBlKSB7CisgICAgICByZXMuc2VuZEVycm9yKFNDX1VOQVVUSE9SSVpFRCk7CisgICAgICByZXR1cm47CisgICAgfSBjYXRjaCAoU2VydmljZU1heU5vdENvbnRpbnVlRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIFRPRE8oZGJvcm93aXR6KTogU2hvdyB0aGUgZXJyb3IgbWVzc2FnZSB0byB0aGUgdXNlci4KKyAgICAgIHJlcy5zZW5kRXJyb3IoU0NfRk9SQklEREVOKTsKKyAgICAgIHJldHVybjsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlcnIpIHsKKyAgICAgIFN0cmluZyBuYW1lID0gdXJscy5nZXRIb3N0TmFtZShyZXEpOworICAgICAgbG9nLndhcm4oIkNhbm5vdCBzY2FuIHJlcG9zaXRvcmllcyIgKyAobmFtZSAhPSBudWxsID8gImZvciAiICsgbmFtZSA6ICIiKSwgZXJyKTsKKyAgICAgIHJlcy5zZW5kRXJyb3IoU0NfU0VSVklDRV9VTkFWQUlMQUJMRSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgIGNhc2UgSFRNTDoKKyAgICAgIGNhc2UgREVGQVVMVDoKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGRpc3BsYXlIdG1sKHJlcSwgcmVzLCBkZXNjcyk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFRFWFQ6CisgICAgICAgIGRpc3BsYXlUZXh0KHJlcSwgcmVzLCBicmFuY2hlcywgZGVzY3MpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBKU09OOgorICAgICAgICBkaXNwbGF5SnNvbihyZXEsIHJlcywgZGVzY3MpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBwcml2YXRlIFNveU1hcERhdGEgdG9Tb3lNYXBEYXRhKFJlcG9zaXRvcnlEZXNjcmlwdGlvbiBkZXNjLCBHaXRpbGVzVmlldyB2aWV3KSB7CisgICAgcmV0dXJuIG5ldyBTb3lNYXBEYXRhKAorICAgICAgICAibmFtZSIsIGRlc2MubmFtZSwKKyAgICAgICAgImRlc2NyaXB0aW9uIiwgU3RyaW5ncy5udWxsVG9FbXB0eShkZXNjLmRlc2NyaXB0aW9uKSwKKyAgICAgICAgInVybCIsIEdpdGlsZXNWaWV3LnJlcG9zaXRvcnlJbmRleCgpCisgICAgICAgICAgICAuY29weUZyb20odmlldykKKyAgICAgICAgICAgIC5zZXRSZXBvc2l0b3J5TmFtZShkZXNjLm5hbWUpCisgICAgICAgICAgICAudG9VcmwoKSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgZGlzcGxheUh0bWwoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsCisgICAgICBNYXA8U3RyaW5nLCBSZXBvc2l0b3J5RGVzY3JpcHRpb24+IGRlc2NzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIFNveUxpc3REYXRhIHJlcG9zID0gbmV3IFNveUxpc3REYXRhKCk7CisgICAgZm9yIChSZXBvc2l0b3J5RGVzY3JpcHRpb24gZGVzYyA6IGRlc2NzLnZhbHVlcygpKSB7CisgICAgICByZXBvcy5hZGQodG9Tb3lNYXBEYXRhKGRlc2MsIFZpZXdGaWx0ZXIuZ2V0VmlldyhyZXEpKSk7CisgICAgfQorCisgICAgcmVuZGVyKHJlcSwgcmVzLCAiZ2l0aWxlcy5ob3N0SW5kZXgiLCBJbW11dGFibGVNYXAub2YoCisgICAgICAgICJob3N0TmFtZSIsIHVybHMuZ2V0SG9zdE5hbWUocmVxKSwKKyAgICAgICAgImJhc2VVcmwiLCB1cmxzLmdldEJhc2VHaXRVcmwocmVxKSwKKyAgICAgICAgInJlcG9zaXRvcmllcyIsIHJlcG9zKSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgZGlzcGxheVRleHQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsCisgICAgICBTZXQ8U3RyaW5nPiBicmFuY2hlcywgTWFwPFN0cmluZywgUmVwb3NpdG9yeURlc2NyaXB0aW9uPiBkZXNjcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXMuc2V0Q29udGVudFR5cGUoVEVYVC5nZXRNaW1lVHlwZSgpKTsKKyAgICByZXMuc2V0Q2hhcmFjdGVyRW5jb2RpbmcoIlVURi04Iik7CisgICAgcmVzLnNldEhlYWRlcihIdHRwSGVhZGVycy5DT05URU5UX0RJU1BPU0lUSU9OLCAiYXR0YWNobWVudCIpOworICAgIHNldE5vdENhY2hlYWJsZShyZXMpOworCisgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzLmdldFdyaXRlcigpOworICAgIGZvciAoUmVwb3NpdG9yeURlc2NyaXB0aW9uIHJlcG8gOiBkZXNjcy52YWx1ZXMoKSkgeworICAgICAgZm9yIChTdHJpbmcgbmFtZSA6IGJyYW5jaGVzKSB7CisgICAgICAgIFN0cmluZyByZWYgPSByZXBvLmJyYW5jaGVzLmdldChuYW1lKTsKKyAgICAgICAgaWYgKHJlZiA9PSBudWxsKSB7CisgICAgICAgICAgLy8gUHJpbnQgc3R1YiAoZm9ydHkgJy0nIHN5bWJvbHMpCisgICAgICAgICAgcmVmID0gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iOworICAgICAgICB9CisgICAgICAgIHdyaXRlci5wcmludChyZWYpOworICAgICAgICB3cml0ZXIucHJpbnQoJyAnKTsKKyAgICAgIH0KKyAgICAgIHdyaXRlci5wcmludChHaXRpbGVzVXJscy5OQU1FX0VTQ0FQRVIuYXBwbHkocmVwby5uYW1lKSk7CisgICAgICB3cml0ZXIucHJpbnQoJ1xuJyk7CisgICAgfQorICAgIHdyaXRlci5mbHVzaCgpOworICAgIHdyaXRlci5jbG9zZSgpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGRpc3BsYXlKc29uKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzLAorICAgICAgTWFwPFN0cmluZywgUmVwb3NpdG9yeURlc2NyaXB0aW9uPiBkZXNjcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXMuc2V0Q29udGVudFR5cGUoSlNPTi5nZXRNaW1lVHlwZSgpKTsKKyAgICByZXMuc2V0Q2hhcmFjdGVyRW5jb2RpbmcoIlVURi04Iik7CisgICAgcmVzLnNldEhlYWRlcihIdHRwSGVhZGVycy5DT05URU5UX0RJU1BPU0lUSU9OLCAiYXR0YWNobWVudCIpOworICAgIHNldE5vdENhY2hlYWJsZShyZXMpOworCisgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzLmdldFdyaXRlcigpOworICAgIG5ldyBHc29uQnVpbGRlcigpCisgICAgICAgIC5zZXRGaWVsZE5hbWluZ1BvbGljeShGaWVsZE5hbWluZ1BvbGljeS5MT1dFUl9DQVNFX1dJVEhfVU5ERVJTQ09SRVMpCisgICAgICAgIC5zZXRQcmV0dHlQcmludGluZygpCisgICAgICAgIC5nZW5lcmF0ZU5vbkV4ZWN1dGFibGVKc29uKCkKKyAgICAgICAgLmNyZWF0ZSgpCisgICAgICAgIC50b0pzb24oZGVzY3MsCisgICAgICAgICAgbmV3IFR5cGVUb2tlbjxNYXA8U3RyaW5nLCBSZXBvc2l0b3J5RGVzY3JpcHRpb24+PigpIHt9LmdldFR5cGUoKSwKKyAgICAgICAgICB3cml0ZXIpOworICAgIHdyaXRlci5wcmludCgnXG4nKTsKKyAgICB3cml0ZXIuY2xvc2UoKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFNldDxTdHJpbmc+IHBhcnNlU2hvd0JyYW5jaChIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisgICAgLy8gUm91Z2hseSBtYXRjaCBHZXJyaXQgQ29kZSBSZXZpZXcncyAvcHJvamVjdHMvIEFQSSBieSBzdXBwb3J0aW5nCisgICAgLy8gYm90aCBzaG93LWJyYW5jaCBhbmQgYiBhcyBxdWVyeSBwYXJhbWV0ZXJzLgorICAgIFNldDxTdHJpbmc+IGJyYW5jaGVzID0gU2V0cy5uZXdMaW5rZWRIYXNoU2V0KCk7CisgICAgU3RyaW5nW10gdmFsdWVzID0gcmVxLmdldFBhcmFtZXRlclZhbHVlcygic2hvdy1icmFuY2giKTsKKyAgICBpZiAodmFsdWVzICE9IG51bGwpIHsKKyAgICAgIGJyYW5jaGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KHZhbHVlcykpOworICAgIH0KKyAgICB2YWx1ZXMgPSByZXEuZ2V0UGFyYW1ldGVyVmFsdWVzKCJiIik7CisgICAgaWYgKHZhbHVlcyAhPSBudWxsKSB7CisgICAgICBicmFuY2hlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdCh2YWx1ZXMpKTsKKyAgICB9CisgICAgcmV0dXJuIGJyYW5jaGVzOworICB9Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvSHRtbERpZmZGb3JtYXR0ZXIuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9IdG1sRGlmZkZvcm1hdHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYjFlYjgKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvSHRtbERpZmZGb3JtYXR0ZXIuamF2YQpAQCAtMCwwICsxLDEyOCBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuQ2hhcnNldHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuU3RyaW5nRXNjYXBlVXRpbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5kaWZmLkRpZmZFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpZmYuRGlmZkZvcm1hdHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpZmYuUmF3VGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnBhdGNoLkZpbGVIZWFkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5wYXRjaC5GaWxlSGVhZGVyLlBhdGNoVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuUmF3UGFyc2VVdGlsczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKiBGb3JtYXRzIGEgdW5pZmllZCBmb3JtYXQgcGF0Y2ggYXMgVVRGLTggZW5jb2RlZCBIVE1MLiAqLworZmluYWwgY2xhc3MgSHRtbERpZmZGb3JtYXR0ZXIgZXh0ZW5kcyBEaWZmRm9ybWF0dGVyIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIERJRkZfQkVHSU4gPSAiPHByZSBjbGFzcz1cImRpZmYtdW5pZmllZFwiPiIuZ2V0Qnl0ZXMoQ2hhcnNldHMuVVRGXzgpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gRElGRl9FTkQgPSAiPC9wcmU+Ii5nZXRCeXRlcyhDaGFyc2V0cy5VVEZfOCk7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIEhVTktfQkVHSU4gPSAiPHNwYW4gY2xhc3M9XCJoXCI+Ii5nZXRCeXRlcyhDaGFyc2V0cy5VVEZfOCk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBIVU5LX0VORCA9ICI8L3NwYW4+Ii5nZXRCeXRlcyhDaGFyc2V0cy5VVEZfOCk7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIExJTkVfSU5TRVJUX0JFR0lOID0gIjxzcGFuIGNsYXNzPVwiaVwiPiIuZ2V0Qnl0ZXMoQ2hhcnNldHMuVVRGXzgpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gTElORV9ERUxFVEVfQkVHSU4gPSAiPHNwYW4gY2xhc3M9XCJkXCI+Ii5nZXRCeXRlcyhDaGFyc2V0cy5VVEZfOCk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBMSU5FX0NIQU5HRV9CRUdJTiA9ICI8c3BhbiBjbGFzcz1cImNcIj4iLmdldEJ5dGVzKENoYXJzZXRzLlVURl84KTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIExJTkVfRU5EID0gIjwvc3Bhbj5cbiIuZ2V0Qnl0ZXMoQ2hhcnNldHMuVVRGXzgpOworCisgIHByaXZhdGUgZmluYWwgUmVuZGVyZXIgcmVuZGVyZXI7CisgIHByaXZhdGUgaW50IGZpbGVJbmRleDsKKworICBIdG1sRGlmZkZvcm1hdHRlcihSZW5kZXJlciByZW5kZXJlciwgT3V0cHV0U3RyZWFtIG91dCkgeworICAgIHN1cGVyKG91dCk7CisgICAgdGhpcy5yZW5kZXJlciA9IGNoZWNrTm90TnVsbChyZW5kZXJlciwgInJlbmRlcmVyIik7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgZm9ybWF0KExpc3Q8PyBleHRlbmRzIERpZmZFbnRyeT4gZW50cmllcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmb3IgKGZpbGVJbmRleCA9IDA7IGZpbGVJbmRleCA8IGVudHJpZXMuc2l6ZSgpOyBmaWxlSW5kZXgrKykgeworICAgICAgZm9ybWF0KGVudHJpZXMuZ2V0KGZpbGVJbmRleCkpOworICAgIH0KKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBmb3JtYXQoRmlsZUhlYWRlciBoZHIsIFJhd1RleHQgYSwgUmF3VGV4dCBiKQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpbnQgc3RhcnQgPSBoZHIuZ2V0U3RhcnRPZmZzZXQoKTsKKyAgICBpbnQgZW5kID0gaGRyLmdldEVuZE9mZnNldCgpOworICAgIGlmICghaGRyLmdldEh1bmtzKCkuaXNFbXB0eSgpKSB7CisgICAgICBlbmQgPSBoZHIuZ2V0SHVua3MoKS5nZXQoMCkuZ2V0U3RhcnRPZmZzZXQoKTsKKyAgICB9CisgICAgcmVuZGVySGVhZGVyKFJhd1BhcnNlVXRpbHMuZGVjb2RlKGhkci5nZXRCdWZmZXIoKSwgc3RhcnQsIGVuZCkpOworCisgICAgaWYgKGhkci5nZXRQYXRjaFR5cGUoKSA9PSBQYXRjaFR5cGUuVU5JRklFRCkgeworICAgICAgZ2V0T3V0cHV0U3RyZWFtKCkud3JpdGUoRElGRl9CRUdJTik7CisgICAgICBmb3JtYXQoaGRyLnRvRWRpdExpc3QoKSwgYSwgYik7CisgICAgICBnZXRPdXRwdXRTdHJlYW0oKS53cml0ZShESUZGX0VORCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJlbmRlckhlYWRlcihTdHJpbmcgaGVhZGVyKQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpbnQgbGYgPSBoZWFkZXIuaW5kZXhPZignXG4nKTsKKyAgICBTdHJpbmcgZmlyc3Q7CisgICAgU3RyaW5nIHJlc3Q7CisgICAgaWYgKDAgPD0gbGYpIHsKKyAgICAgIGZpcnN0ID0gaGVhZGVyLnN1YnN0cmluZygwLCBsZik7CisgICAgICByZXN0ID0gaGVhZGVyLnN1YnN0cmluZyhsZiArIDEpOworICAgIH0gZWxzZSB7CisgICAgICBmaXJzdCA9IGhlYWRlcjsKKyAgICAgIHJlc3QgPSAiIjsKKyAgICB9CisgICAgZ2V0T3V0cHV0U3RyZWFtKCkud3JpdGUocmVuZGVyZXIubmV3UmVuZGVyZXIoImdpdGlsZXMuZGlmZkhlYWRlciIpCisgICAgICAgIC5zZXREYXRhKEltbXV0YWJsZU1hcC5vZigiZmlyc3QiLCBmaXJzdCwgInJlc3QiLCByZXN0LCAiZmlsZUluZGV4IiwgZmlsZUluZGV4KSkKKyAgICAgICAgLnJlbmRlcigpCisgICAgICAgIC5nZXRCeXRlcyhDaGFyc2V0cy5VVEZfOCkpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIHdyaXRlSHVua0hlYWRlcihpbnQgYVN0YXJ0TGluZSwgaW50IGFFbmRMaW5lLAorICAgICAgaW50IGJTdGFydExpbmUsIGludCBiRW5kTGluZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBnZXRPdXRwdXRTdHJlYW0oKS53cml0ZShIVU5LX0JFR0lOKTsKKyAgICAvLyBUT0RPKHNvcCk6IElmIGh1bmsgaGVhZGVyIHN0YXJ0cyBpbmNsdWRpbmcgbWV0aG9kIG5hbWVzLCBlc2NhcGUgaXQuCisgICAgc3VwZXIud3JpdGVIdW5rSGVhZGVyKGFTdGFydExpbmUsIGFFbmRMaW5lLCBiU3RhcnRMaW5lLCBiRW5kTGluZSk7CisgICAgZ2V0T3V0cHV0U3RyZWFtKCkud3JpdGUoSFVOS19FTkQpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIHdyaXRlTGluZShjaGFyIHByZWZpeCwgUmF3VGV4dCB0ZXh0LCBpbnQgY3VyKQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAvLyBNYW51YWxseSByZW5kZXIgZWFjaCBsaW5lLCByYXRoZXIgdGhhbiBpbnZva2UgYSBTb3kgdGVtcGxhdGUuIFRoaXMgbWV0aG9kCisgICAgLy8gY2FuIGJlIGNhbGxlZCB0aG91c2FuZHMgb2YgdGltZXMgaW4gYSBzaW5nbGUgcmVxdWVzdC4gQXZvaWQgdW5uZWNlc3NhcnkKKyAgICAvLyBvdmVyaGVhZHMgYnkgZm9ybWF0dGluZyBhcy1pcy4KKyAgICBPdXRwdXRTdHJlYW0gb3V0ID0gZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgc3dpdGNoIChwcmVmaXgpIHsKKyAgICAgIGNhc2UgJysnOgorICAgICAgICBvdXQud3JpdGUoTElORV9JTlNFUlRfQkVHSU4pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJy0nOgorICAgICAgICBvdXQud3JpdGUoTElORV9ERUxFVEVfQkVHSU4pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJyAnOgorICAgICAgZGVmYXVsdDoKKyAgICAgICAgb3V0LndyaXRlKExJTkVfQ0hBTkdFX0JFR0lOKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIG91dC53cml0ZShTdHJpbmdFc2NhcGVVdGlscy5lc2NhcGVIdG1sNCh0ZXh0LmdldFN0cmluZyhjdXIpKS5nZXRCeXRlcyhDaGFyc2V0cy5VVEZfOCkpOworICAgIG91dC53cml0ZShMSU5FX0VORCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9MaW5raWZpZXIuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9MaW5raWZpZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzVlNmY1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0xpbmtpZmllci5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkpvaW5lcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CisKKy8qKiBMaW5raWZpZXIgZm9yIGJsb2NrcyBvZiB0ZXh0IHN1Y2ggYXMgY29tbWl0IG1lc3NhZ2UgZGVzY3JpcHRpb25zLiAqLworcHVibGljIGNsYXNzIExpbmtpZmllciB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gTElOS19QQVRURVJOOworCisgIHN0YXRpYyB7CisgICAgLy8gSFRUUCBVUkwgcmVnZXggYWRhcHRlZCBmcm9tIGNvbS5nb29nbGUuZ3d0ZXhwdWkuc2FmZWh0bWwuY2xpZW50LlNhZmVIdG1sLgorICAgIFN0cmluZyBwYXJ0ID0gIlthLXpBLVowLTkkXy4rISonLCU7OkA9PyMvfjw+LV0iOworICAgIFN0cmluZyBodHRwVXJsID0gImh0dHBzPzovLyIgKworICAgICAgICBwYXJ0ICsgInsyLH0iICsKKyAgICAgICAgIig/OlsoXSIgKyBwYXJ0ICsgIioiICsgIlspXSkqIiArCisgICAgICAgIHBhcnQgKyAiKiI7CisgICAgU3RyaW5nIGNoYW5nZUlkID0gIlxcYklbMC05YS1mXXs4LDQwfVxcYiI7CisgICAgTElOS19QQVRURVJOID0gUGF0dGVybi5jb21waWxlKEpvaW5lci5vbigifCIpLmpvaW4oCisgICAgICAgICIoIiArIGh0dHBVcmwgKyAiKSIsCisgICAgICAgICIoIiArIGNoYW5nZUlkICsgIikiKSk7CisgIH0KKworICBwcml2YXRlIGZpbmFsIEdpdGlsZXNVcmxzIHVybHM7CisKKyAgcHVibGljIExpbmtpZmllcihHaXRpbGVzVXJscyB1cmxzKSB7CisgICAgdGhpcy51cmxzID0gY2hlY2tOb3ROdWxsKHVybHMsICJ1cmxzIik7CisgIH0KKworICBwdWJsaWMgTGlzdDxNYXA8U3RyaW5nLCBTdHJpbmc+PiBsaW5raWZ5KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgU3RyaW5nIGJhc2VHZXJyaXRVcmwgPSB1cmxzLmdldEJhc2VHZXJyaXRVcmwocmVxKTsKKyAgICBMaXN0PE1hcDxTdHJpbmcsIFN0cmluZz4+IHBhcnNlZCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIE1hdGNoZXIgbSA9IExJTktfUEFUVEVSTi5tYXRjaGVyKG1lc3NhZ2UpOworICAgIGludCBsYXN0ID0gMDsKKyAgICB3aGlsZSAobS5maW5kKCkpIHsKKyAgICAgIGFkZFRleHQocGFyc2VkLCBtZXNzYWdlLnN1YnN0cmluZyhsYXN0LCBtLnN0YXJ0KCkpKTsKKyAgICAgIGlmIChtLmdyb3VwKDEpICE9IG51bGwpIHsKKyAgICAgICAgLy8gQmFyZSBVUkwuCisgICAgICAgIHBhcnNlZC5hZGQobGluayhtLmdyb3VwKDEpLCBtLmdyb3VwKDEpKSk7CisgICAgICB9IGVsc2UgaWYgKG0uZ3JvdXAoMikgIT0gbnVsbCkgeworICAgICAgICBpZiAoYmFzZUdlcnJpdFVybCAhPSBudWxsKSB7CisgICAgICAgICAgLy8gR2Vycml0IENoYW5nZS1JZC4KKyAgICAgICAgICBwYXJzZWQuYWRkKGxpbmsobS5ncm91cCgyKSwgYmFzZUdlcnJpdFVybCArICIjL3EvIiArIG0uZ3JvdXAoMikgKyAiLG4seiIpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBhZGRUZXh0KHBhcnNlZCwgbS5ncm91cCgyKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGxhc3QgPSBtLmVuZCgpOworICAgIH0KKyAgICBhZGRUZXh0KHBhcnNlZCwgbWVzc2FnZS5zdWJzdHJpbmcobGFzdCkpOworICAgIHJldHVybiBwYXJzZWQ7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGxpbmsoU3RyaW5nIHRleHQsIFN0cmluZyB1cmwpIHsKKyAgICByZXR1cm4gSW1tdXRhYmxlTWFwLm9mKCJ0ZXh0IiwgdGV4dCwgInVybCIsIHVybCk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFRleHQoTGlzdDxNYXA8U3RyaW5nLCBTdHJpbmc+PiBwYXJ0cywgU3RyaW5nIHRleHQpIHsKKyAgICBpZiAodGV4dC5pc0VtcHR5KCkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHBhcnRzLmlzRW1wdHkoKSkgeworICAgICAgcGFydHMuYWRkKEltbXV0YWJsZU1hcC5vZigidGV4dCIsIHRleHQpKTsKKyAgICB9IGVsc2UgeworICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBvbGQgPSBwYXJ0cy5nZXQocGFydHMuc2l6ZSgpIC0gMSk7CisgICAgICBpZiAoIW9sZC5jb250YWluc0tleSgidXJsIikpIHsKKyAgICAgICAgcGFydHMuc2V0KHBhcnRzLnNpemUoKSAtIDEsIEltbXV0YWJsZU1hcC5vZigidGV4dCIsIG9sZC5nZXQoInRleHQiKSArIHRleHQpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBhcnRzLmFkZChJbW11dGFibGVNYXAub2YoInRleHQiLCB0ZXh0KSk7CisgICAgICB9CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvTG9nU2VydmxldC5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0xvZ1NlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzk3N2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0xvZ1NlcnZsZXQuamF2YQpAQCAtMCwwICsxLDE5MyBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQ7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CitpbXBvcnQgc3RhdGljIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKK2ltcG9ydCBzdGF0aWMgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTk9UX0ZPVU5EOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PcHRpb25hbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0TXVsdGltYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CitpbXBvcnQgY29tLmdvb2dsZS5naXRpbGVzLkNvbW1pdFNveURhdGEuS2V5U2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5NaXNzaW5nT2JqZWN0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlJldldhbGtFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci5TZXJ2bGV0VXRpbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQWJicmV2aWF0ZWRPYmplY3RJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5BbnlPYmplY3RJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RSZWFkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLkZvbGxvd0ZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2Q29tbWl0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldlRhZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2V2FsazsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCisvKiogU2VydmVzIGFuIEhUTUwgcGFnZSB3aXRoIGEgc2hvcnRsb2cgZm9yIGNvbW1pdHMgYW5kIHBhdGhzLiAqLworcHVibGljIGNsYXNzIExvZ1NlcnZsZXQgZXh0ZW5kcyBCYXNlU2VydmxldCB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihMb2dTZXJ2bGV0LmNsYXNzKTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfUEFSQU0gPSAicyI7CisKKyAgcHJpdmF0ZSBmaW5hbCBMaW5raWZpZXIgbGlua2lmaWVyOworICBwcml2YXRlIGZpbmFsIGludCBsaW1pdDsKKworICBwdWJsaWMgTG9nU2VydmxldChSZW5kZXJlciByZW5kZXJlciwgTGlua2lmaWVyIGxpbmtpZmllcikgeworICAgIHRoaXMocmVuZGVyZXIsIGxpbmtpZmllciwgMTAwKTsKKyAgfQorCisgIHByaXZhdGUgTG9nU2VydmxldChSZW5kZXJlciByZW5kZXJlciwgTGlua2lmaWVyIGxpbmtpZmllciwgaW50IGxpbWl0KSB7CisgICAgc3VwZXIocmVuZGVyZXIpOworICAgIHRoaXMubGlua2lmaWVyID0gY2hlY2tOb3ROdWxsKGxpbmtpZmllciwgImxpbmtpZmllciIpOworICAgIGNoZWNrQXJndW1lbnQobGltaXQgPj0gMCwgImxpbWl0IG11c3QgYmUgcG9zaXRpdmU6ICVzIiwgbGltaXQpOworICAgIHRoaXMubGltaXQgPSBsaW1pdDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBHaXRpbGVzVmlldyB2aWV3ID0gVmlld0ZpbHRlci5nZXRWaWV3KHJlcSk7CisgICAgUmVwb3NpdG9yeSByZXBvID0gU2VydmxldFV0aWxzLmdldFJlcG9zaXRvcnkocmVxKTsKKyAgICBSZXZXYWxrIHdhbGsgPSBudWxsOworICAgIHRyeSB7CisgICAgICB0cnkgeworICAgICAgICB3YWxrID0gbmV3V2FsayhyZXBvLCB2aWV3KTsKKyAgICAgIH0gY2F0Y2ggKEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24gZSkgeworICAgICAgICByZXMuc2V0U3RhdHVzKFNDX05PVF9GT1VORCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgT3B0aW9uYWw8T2JqZWN0SWQ+IHN0YXJ0ID0gZ2V0U3RhcnQodmlldy5nZXRQYXJhbWV0ZXJzKCksIHdhbGsuZ2V0T2JqZWN0UmVhZGVyKCkpOworICAgICAgaWYgKHN0YXJ0ID09IG51bGwpIHsKKyAgICAgICAgcmVzLnNldFN0YXR1cyhTQ19OT1RfRk9VTkQpOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gZGF0YSA9IE1hcHMubmV3SGFzaE1hcFdpdGhFeHBlY3RlZFNpemUoNSk7CisKKyAgICAgIGlmICghdmlldy5nZXRSZXZpc2lvbigpLm5hbWVJc0lkKCkpIHsKKyAgICAgICAgTGlzdDxNYXA8U3RyaW5nLCBPYmplY3Q+PiB0YWdzID0gTGlzdHMubmV3QXJyYXlMaXN0V2l0aEV4cGVjdGVkU2l6ZSgxKTsKKyAgICAgICAgZm9yIChSZXZPYmplY3QgbyA6IFJldmlzaW9uU2VydmxldC5saXN0T2JqZWN0cyh3YWxrLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKSkpIHsKKyAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFJldlRhZykgeworICAgICAgICAgICAgdGFncy5hZGQobmV3IFRhZ1NveURhdGEobGlua2lmaWVyLCByZXEpLnRvU295RGF0YSgoUmV2VGFnKSBvKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghdGFncy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICBkYXRhLnB1dCgidGFncyIsIHRhZ3MpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIFBhZ2luYXRvciBwYWdpbmF0b3IgPSBuZXcgUGFnaW5hdG9yKHdhbGssIGxpbWl0LCBzdGFydC5vck51bGwoKSk7CisgICAgICBNYXA8QW55T2JqZWN0SWQsIFNldDxSZWY+PiByZWZzQnlJZCA9IHJlcG8uZ2V0QWxsUmVmc0J5UGVlbGVkT2JqZWN0SWQoKTsKKyAgICAgIExpc3Q8TWFwPFN0cmluZywgT2JqZWN0Pj4gZW50cmllcyA9IExpc3RzLm5ld0FycmF5TGlzdFdpdGhDYXBhY2l0eShsaW1pdCk7CisgICAgICBmb3IgKFJldkNvbW1pdCBjIDogcGFnaW5hdG9yKSB7CisgICAgICAgIGVudHJpZXMuYWRkKG5ldyBDb21taXRTb3lEYXRhKG51bGwsIHJlcSwgcmVwbywgd2FsaywgdmlldywgcmVmc0J5SWQpCisgICAgICAgICAgICAudG9Tb3lEYXRhKGMsIEtleVNldC5TSE9SVExPRykpOworICAgICAgfQorCisgICAgICBTdHJpbmcgdGl0bGUgPSAiTG9nIC0gIjsKKyAgICAgIGlmICh2aWV3LmdldE9sZFJldmlzaW9uKCkgIT0gUmV2aXNpb24uTlVMTCkgeworICAgICAgICB0aXRsZSArPSB2aWV3LmdldFJldmlzaW9uUmFuZ2UoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRpdGxlICs9IHZpZXcuZ2V0UmV2aXNpb24oKS5nZXROYW1lKCk7CisgICAgICB9CisKKyAgICAgIGRhdGEucHV0KCJ0aXRsZSIsIHRpdGxlKTsKKyAgICAgIGRhdGEucHV0KCJlbnRyaWVzIiwgZW50cmllcyk7CisgICAgICBPYmplY3RJZCBuZXh0ID0gcGFnaW5hdG9yLmdldE5leHRTdGFydCgpOworICAgICAgaWYgKG5leHQgIT0gbnVsbCkgeworICAgICAgICBkYXRhLnB1dCgibmV4dFVybCIsIGNvcHlBbmRDYW5vbmljYWxpemUodmlldykKKyAgICAgICAgICAgIC5yZXBsYWNlUGFyYW0oU1RBUlRfUEFSQU0sIG5leHQubmFtZSgpKQorICAgICAgICAgICAgLnRvVXJsKCkpOworICAgICAgfQorICAgICAgT2JqZWN0SWQgcHJldiA9IHBhZ2luYXRvci5nZXRQcmV2aW91c1N0YXJ0KCk7CisgICAgICBpZiAocHJldiAhPSBudWxsKSB7CisgICAgICAgIEdpdGlsZXNWaWV3LkJ1aWxkZXIgcHJldlZpZXcgPSBjb3B5QW5kQ2Fub25pY2FsaXplKHZpZXcpOworICAgICAgICBpZiAoIXByZXZWaWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKS5lcXVhbHMocHJldikpIHsKKyAgICAgICAgICBwcmV2Vmlldy5yZXBsYWNlUGFyYW0oU1RBUlRfUEFSQU0sIHByZXYubmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBkYXRhLnB1dCgicHJldmlvdXNVcmwiLCBwcmV2Vmlldy50b1VybCgpKTsKKyAgICAgIH0KKworICAgICAgcmVuZGVyKHJlcSwgcmVzLCAiZ2l0aWxlcy5sb2dEZXRhaWwiLCBkYXRhKTsKKyAgICB9IGNhdGNoIChSZXZXYWxrRXhjZXB0aW9uIGUpIHsKKyAgICAgIGxvZy53YXJuKCJFcnJvciBpbiByZXYgd2FsayIsIGUpOworICAgICAgcmVzLnNldFN0YXR1cyhTQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IpOworICAgICAgcmV0dXJuOworICAgIH0gZmluYWxseSB7CisgICAgICBpZiAod2FsayAhPSBudWxsKSB7CisgICAgICAgIHdhbGsucmVsZWFzZSgpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIEdpdGlsZXNWaWV3LkJ1aWxkZXIgY29weUFuZENhbm9uaWNhbGl6ZShHaXRpbGVzVmlldyB2aWV3KSB7CisgICAgLy8gQ2Fub25pY2FsaXplIHRoZSB2aWV3IGJ5IHVzaW5nIGZ1bGwgU0hBcy4KKyAgICBHaXRpbGVzVmlldy5CdWlsZGVyIGNvcHkgPSBHaXRpbGVzVmlldy5sb2coKS5jb3B5RnJvbSh2aWV3KQorICAgICAgICAuc2V0UmV2aXNpb24odmlldy5nZXRSZXZpc2lvbigpKTsKKyAgICBpZiAodmlldy5nZXRPbGRSZXZpc2lvbigpICE9IFJldmlzaW9uLk5VTEwpIHsKKyAgICAgIGNvcHkuc2V0T2xkUmV2aXNpb24odmlldy5nZXRPbGRSZXZpc2lvbigpKTsKKyAgICB9CisgICAgcmV0dXJuIGNvcHk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBPcHRpb25hbDxPYmplY3RJZD4gZ2V0U3RhcnQoTGlzdE11bHRpbWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbXMsCisgICAgICBPYmplY3RSZWFkZXIgcmVhZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIExpc3Q8U3RyaW5nPiB2YWx1ZXMgPSBwYXJhbXMuZ2V0KFNUQVJUX1BBUkFNKTsKKyAgICBzd2l0Y2ggKHZhbHVlcy5zaXplKCkpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmFic2VudCgpOworICAgICAgY2FzZSAxOgorICAgICAgICBDb2xsZWN0aW9uPE9iamVjdElkPiBpZHMgPSByZWFkZXIucmVzb2x2ZShBYmJyZXZpYXRlZE9iamVjdElkLmZyb21TdHJpbmcodmFsdWVzLmdldCgwKSkpOworICAgICAgICBpZiAoaWRzLnNpemUoKSAhPSAxKSB7CisgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKEl0ZXJhYmxlcy5nZXRPbmx5RWxlbWVudChpZHMpKTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFJldldhbGsgbmV3V2FsayhSZXBvc2l0b3J5IHJlcG8sIEdpdGlsZXNWaWV3IHZpZXcpCisgICAgICB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIFJldldhbGsgd2FsayA9IG5ldyBSZXZXYWxrKHJlcG8pOworICAgIHdhbGsubWFya1N0YXJ0KHdhbGsucGFyc2VDb21taXQodmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkpKTsKKyAgICBpZiAodmlldy5nZXRPbGRSZXZpc2lvbigpICE9IFJldmlzaW9uLk5VTEwpIHsKKyAgICAgIHdhbGsubWFya1VuaW50ZXJlc3Rpbmcod2Fsay5wYXJzZUNvbW1pdCh2aWV3LmdldE9sZFJldmlzaW9uKCkuZ2V0SWQoKSkpOworICAgIH0KKyAgICBpZiAoIVN0cmluZ3MuaXNOdWxsT3JFbXB0eSh2aWV3LmdldFRyZWVQYXRoKCkpKSB7CisgICAgICB3YWxrLnNldFRyZWVGaWx0ZXIoRm9sbG93RmlsdGVyLmNyZWF0ZSh2aWV3LmdldFRyZWVQYXRoKCkpKTsKKyAgICB9CisgICAgcmV0dXJuIHdhbGs7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9QYWdpbmF0b3IuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9QYWdpbmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDU0NTU2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1BhZ2luYXRvci5qYXZhCkBAIC0wLDAgKzEsMTc2IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrU3RhdGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5JbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLk1pc3NpbmdPYmplY3RFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuUmV2V2Fsa0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2Q29tbWl0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZXYWxrOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlEZXF1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuRGVxdWU7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKKworLyoqCisgKiBXcmFwcGVyIGFyb3VuZCB7QGxpbmsgUmV2V2Fsa30gdGhhdCBwYWdpbmF0ZXMgZm9yIEdpdGlsZXMuCisgKgorICogQSBzaW5nbGUgcGFnZSBvZiBhIHNob3J0bG9nIGlzIGRlZmluZWQgYnkgYSByZXZpc2lvbiByYW5nZSwgc3VjaCBhcyAibWFzdGVyIgorICogb3IgIm1hc3Rlci4ubmV4dCIsIGEgcGFnZSBzaXplLCBhbmQgYSBzdGFydCBjb21taXQsIHN1Y2ggYXMgImMwZmZlZSIuIFRoZQorICogZGlzdGFuY2UgYmV0d2VlbiB0aGUgZmlyc3QgY29tbWl0IGluIHRoZSB3YWxrICgibmV4dCIpIGFuZCB0aGUgZmlyc3QgY29tbWl0CisgKiBpbiB0aGUgcGFnZSBtYXkgYmUgYXJiaXRyYXJpbHkgbG9uZywgYnV0IGluIG9yZGVyIHRvIHByZXNlbnQgdGhlIGNvbW1pdCBsaXN0CisgKiBpbiBhIHN0YWJsZSB3YXksIHdlIG11c3QgYWx3YXlzIHN0YXJ0IGZyb20gdGhlIGZpcnN0IGNvbW1pdCBpbiB0aGUgd2Fsay4gVGhpcworICogaXMgYmVjYXVzZSB0aGVyZSBtYXkgYmUgYXJiaXRyYXJ5IG1lcmdlIGNvbW1pdHMgYmV0d2VlbiAiYzBmZmVlIiBhbmQgIm5leHQiCisgKiB0aGF0IGVmZmVjdGl2ZWx5IGluc2VydCBhcmJpdHJhcnkgY29tbWl0cyBpbnRvIHRoZSBoaXN0b3J5IHN0YXJ0aW5nIGZyb20KKyAqICJjMGZmZWUiLgorICovCitjbGFzcyBQYWdpbmF0b3IgaW1wbGVtZW50cyBJdGVyYWJsZTxSZXZDb21taXQ+IHsKKyAgcHJpdmF0ZSBmaW5hbCBSZXZXYWxrIHdhbGs7CisgIHByaXZhdGUgZmluYWwgT2JqZWN0SWQgc3RhcnQ7CisgIHByaXZhdGUgZmluYWwgaW50IGxpbWl0OworICBwcml2YXRlIGZpbmFsIERlcXVlPE9iamVjdElkPiBwcmV2QnVmZmVyOworCisgIHByaXZhdGUgYm9vbGVhbiBkb25lOworICBwcml2YXRlIGludCBpOworICBwcml2YXRlIGludCBuOworICBwcml2YXRlIGludCBmb3VuZEluZGV4OworICBwcml2YXRlIE9iamVjdElkIG5leHRTdGFydDsKKworICAvKioKKyAgICogQHBhcmFtIHdhbGsgcmV2aXNpb24gd2Fsay4KKyAgICogQHBhcmFtIGxpbWl0IHBhZ2Ugc2l6ZS4KKyAgICogQHBhcmFtIHN0YXJ0IGNvbW1pdCBhdCB3aGljaCB0byBzdGFydCB0aGUgd2Fsaywgb3IgbnVsbCB0byBzdGFydCBhdCB0aGUKKyAgICogICAgIGJlZ2lubmluZy4KKyAgICovCisgIFBhZ2luYXRvcihSZXZXYWxrIHdhbGssIGludCBsaW1pdCwgQE51bGxhYmxlIE9iamVjdElkIHN0YXJ0KSB7CisgICAgdGhpcy53YWxrID0gY2hlY2tOb3ROdWxsKHdhbGssICJ3YWxrIik7CisgICAgdGhpcy5zdGFydCA9IHN0YXJ0OworICAgIGNoZWNrQXJndW1lbnQobGltaXQgPiAwLCAibGltaXQgbXVzdCBiZSBwb3NpdGl2ZTogJXMiLCBsaW1pdCk7CisgICAgdGhpcy5saW1pdCA9IGxpbWl0OworICAgIHByZXZCdWZmZXIgPSBuZXcgQXJyYXlEZXF1ZTxPYmplY3RJZD4oc3RhcnQgIT0gbnVsbCA/IGxpbWl0IDogMCk7CisgICAgaSA9IC0xOworICAgIGZvdW5kSW5kZXggPSAtMTsKKyAgfQorCisgIC8qKgorICAgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBpbiB0aGlzIHBhZ2Ugb2YgdGhlIHdhbGsuCisgICAqCisgICAqIEByZXR1cm4gdGhlIG5leHQgZWxlbWVudCwgb3IgbnVsbCBpZiB0aGUgd2FsayBpcyBmaW5pc2hlZC4KKyAgICoKKyAgICogQHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uIFNlZSB7QGxpbmsgUmV2V2FsayNuZXh0KCl9LgorICAgKiBAdGhyb3dzIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24gU2VlIHtAbGluayBSZXZXYWxrI25leHQoKX0uCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2VlIHtAbGluayBSZXZXYWxrI25leHQoKX0uCisgICAqLworICBwdWJsaWMgUmV2Q29tbWl0IG5leHQoKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKKyAgICAgIElPRXhjZXB0aW9uIHsKKyAgICBSZXZDb21taXQgY29tbWl0OworICAgIGlmIChmb3VuZEluZGV4IDwgMCkgeworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgY29tbWl0ID0gd2Fsay5uZXh0KCk7CisgICAgICAgIGlmIChjb21taXQgPT0gbnVsbCkgeworICAgICAgICAgIGRvbmUgPSB0cnVlOworICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGkrKzsKKyAgICAgICAgaWYgKHN0YXJ0ID09IG51bGwgfHwgc3RhcnQuZXF1YWxzKGNvbW1pdCkpIHsKKyAgICAgICAgICBmb3VuZEluZGV4ID0gaTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJldkJ1ZmZlci5zaXplKCkgPT0gbGltaXQpIHsKKyAgICAgICAgICBwcmV2QnVmZmVyLnJlbW92ZSgpOworICAgICAgICB9CisgICAgICAgIHByZXZCdWZmZXIuYWRkKGNvbW1pdCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbW1pdCA9IHdhbGsubmV4dCgpOworICAgIH0KKworICAgIGlmICgrK24gPT0gbGltaXQpIHsKKyAgICAgIGRvbmUgPSB0cnVlOworICAgIH0gZWxzZSBpZiAobiA9PSBsaW1pdCArIDEgfHwgY29tbWl0ID09IG51bGwpIHsKKyAgICAgIG5leHRTdGFydCA9IGNvbW1pdDsKKyAgICAgIGRvbmUgPSB0cnVlOworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIHJldHVybiBjb21taXQ7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgSUQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBwYWdlIG9mIHJlc3VsdHMgcHJlY2VkaW5nIHRoaXMgb25lLCBvcgorICAgKiAgICAgbnVsbCBpZiB0aGlzIGlzIHRoZSBmaXJzdCBwYWdlLgorICAgKi8KKyAgcHVibGljIE9iamVjdElkIGdldFByZXZpb3VzU3RhcnQoKSB7CisgICAgY2hlY2tTdGF0ZShkb25lLCAiZ2V0UHJldmlvdXNTdGFydCgpIGludmFsaWQgYmVmb3JlIHdhbGsgZG9uZSIpOworICAgIHJldHVybiBwcmV2QnVmZmVyLnBvbGxGaXJzdCgpOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIElEIGF0IHRoZSBzdGFydCBvZiB0aGUgcGFnZSBvZiByZXN1bHRzIGFmdGVyIHRoaXMgb25lLCBvciBudWxsCisgICAqICAgICBpZiB0aGlzIGlzIHRoZSBsYXN0IHBhZ2UuCisgICAqLworICBwdWJsaWMgT2JqZWN0SWQgZ2V0TmV4dFN0YXJ0KCkgeworICAgIGNoZWNrU3RhdGUoZG9uZSwgImdldE5leHRTdGFydCgpIGludmFsaWQgYmVmb3JlIHdhbGsgZG9uZSIpOworICAgIHJldHVybiBuZXh0U3RhcnQ7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSBjb21taXRzIGluIHRoaXMgd2Fsay4KKyAgICogQHRocm93cyBSZXZXYWxrRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycmVkLCB3cmFwcGluZyB0aGUgY2hlY2tlZAorICAgKiAgICAgZXhjZXB0aW9uIGZyb20ge0BsaW5rICNuZXh0KCl9LgorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBJdGVyYXRvcjxSZXZDb21taXQ+IGl0ZXJhdG9yKCkgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3I8UmV2Q29tbWl0PigpIHsKKyAgICAgIFJldkNvbW1pdCBuZXh0ID0gbmV4dFVuY2hlY2tlZCgpOworCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgIHJldHVybiBuZXh0ICE9IG51bGw7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFJldkNvbW1pdCBuZXh0KCkgeworICAgICAgICBSZXZDb21taXQgciA9IG5leHQ7CisgICAgICAgIG5leHQgPSBuZXh0VW5jaGVja2VkKCk7CisgICAgICAgIHJldHVybiByOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICB9CisgICAgfTsKKyAgfQorCisgIHByaXZhdGUgUmV2Q29tbWl0IG5leHRVbmNoZWNrZWQoKSB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBuZXh0KCk7CisgICAgfSBjYXRjaCAoTWlzc2luZ09iamVjdEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUmV2V2Fsa0V4Y2VwdGlvbihlKTsKKyAgICB9IGNhdGNoIChJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBSZXZXYWxrRXhjZXB0aW9uKGUpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBSZXZXYWxrRXhjZXB0aW9uKGUpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1BhdGhTZXJ2bGV0LmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvUGF0aFNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjI4MjAyCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1BhdGhTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSwyNzYgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2l0aWxlcy5UcmVlU295RGF0YS5yZXNvbHZlVGFyZ2V0VXJsOworaW1wb3J0IHN0YXRpYyBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1I7CitpbXBvcnQgc3RhdGljIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlLlNDX05PVF9GT1VORDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLk9CSl9CTE9COworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKX0NPTU1JVDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLk9CSl9UUkVFOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5Kb2luZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuQ29uZmlnSW52YWxpZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5MYXJnZU9iamVjdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLlNlcnZsZXRVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5GaWxlTW9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RMb2FkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2Q29tbWl0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldlRyZWU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldldhbGs7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5zdWJtb2R1bGUuU3VibW9kdWxlV2FsazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLlRyZWVXYWxrOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5SYXdQYXJzZVV0aWxzOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCisvKiogU2VydmVzIGFuIEhUTUwgcGFnZSB3aXRoIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IGEgcGF0aCB3aXRoaW4gYSB0cmVlLiAqLworLy8gVE9ETyhkYm9yb3dpdHopOiBIYW5kbGUgbm9uLVVURi04IG5hbWVzLgorcHVibGljIGNsYXNzIFBhdGhTZXJ2bGV0IGV4dGVuZHMgQmFzZVNlcnZsZXQgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUGF0aFNlcnZsZXQuY2xhc3MpOworCisgIC8qKgorICAgKiBTdWJtb2R1bGUgVVJMcyB3aGVyZSB3ZSBrbm93IHRoZXJlIGlzIGEgd2ViIHBhZ2UgaWYgdGhlIHVzZXIgdmlzaXRzIHRoZQorICAgKiByZXBvc2l0b3J5IFVSTCB2ZXJiYXRpbSBpbiBhIHdlYiBicm93c2VyLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBWRVJCQVRJTV9TVUJNT0RVTEVfVVJMX1BBVFRFUk4gPQorICAgICAgUGF0dGVybi5jb21waWxlKCJeKCIgKyBKb2luZXIub24oJ3wnKS5qb2luKAorICAgICAgICAgICJodHRwcz86Ly9bXi5dKy5nb29nbGVzb3VyY2UuY29tLy4qIiwKKyAgICAgICAgICAiaHR0cHM/Oi8vW14uXSsuZ29vZ2xlY29kZS5jb20vLioiLAorICAgICAgICAgICJodHRwcz86Ly9jb2RlLmdvb2dsZS5jb20vcC8uKiIsCisgICAgICAgICAgImh0dHBzPzovL2dpdGh1Yi5jb20vLioiKSArICIpJCIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSk7CisKKyAgc3RhdGljIGVudW0gRmlsZVR5cGUgeworICAgIFRSRUUoRmlsZU1vZGUuVFJFRSksCisgICAgU1lNTElOSyhGaWxlTW9kZS5TWU1MSU5LKSwKKyAgICBSRUdVTEFSX0ZJTEUoRmlsZU1vZGUuUkVHVUxBUl9GSUxFKSwKKyAgICBFWEVDVVRBQkxFX0ZJTEUoRmlsZU1vZGUuRVhFQ1VUQUJMRV9GSUxFKSwKKyAgICBHSVRMSU5LKEZpbGVNb2RlLkdJVExJTkspOworCisgICAgcHJpdmF0ZSBmaW5hbCBGaWxlTW9kZSBtb2RlOworCisgICAgcHJpdmF0ZSBGaWxlVHlwZShGaWxlTW9kZSBtb2RlKSB7CisgICAgICB0aGlzLm1vZGUgPSBtb2RlOworICAgIH0KKworICAgIHN0YXRpYyBGaWxlVHlwZSBmb3JFbnRyeShUcmVlV2FsayB0dykgeworICAgICAgaW50IG1vZGUgPSB0dy5nZXRSYXdNb2RlKDApOworICAgICAgZm9yIChGaWxlVHlwZSB0eXBlIDogdmFsdWVzKCkpIHsKKyAgICAgICAgaWYgKHR5cGUubW9kZS5lcXVhbHMobW9kZSkpIHsKKyAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICB9CisKKyAgcHVibGljIFBhdGhTZXJ2bGV0KFJlbmRlcmVyIHJlbmRlcmVyKSB7CisgICAgc3VwZXIocmVuZGVyZXIpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIEdpdGlsZXNWaWV3IHZpZXcgPSBWaWV3RmlsdGVyLmdldFZpZXcocmVxKTsKKyAgICBSZXBvc2l0b3J5IHJlcG8gPSBTZXJ2bGV0VXRpbHMuZ2V0UmVwb3NpdG9yeShyZXEpOworCisgICAgUmV2V2FsayBydyA9IG5ldyBSZXZXYWxrKHJlcG8pOworICAgIHRyeSB7CisgICAgICBSZXZPYmplY3Qgb2JqID0gcncucGVlbChydy5wYXJzZUFueSh2aWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKSkpOworICAgICAgUmV2VHJlZSByb290OworCisgICAgICBzd2l0Y2ggKG9iai5nZXRUeXBlKCkpIHsKKyAgICAgICAgY2FzZSBPQkpfQ09NTUlUOgorICAgICAgICAgIHJvb3QgPSAoKFJldkNvbW1pdCkgb2JqKS5nZXRUcmVlKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0JKX1RSRUU6CisgICAgICAgICAgcm9vdCA9IChSZXZUcmVlKSBvYmo7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmVzLnNldFN0YXR1cyhTQ19OT1RfRk9VTkQpOworICAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgVHJlZVdhbGsgdHc7CisgICAgICBGaWxlVHlwZSB0eXBlOworICAgICAgU3RyaW5nIHBhdGggPSB2aWV3LmdldFRyZWVQYXRoKCk7CisgICAgICBpZiAocGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgdHcgPSBuZXcgVHJlZVdhbGsocncuZ2V0T2JqZWN0UmVhZGVyKCkpOworICAgICAgICB0dy5hZGRUcmVlKHJvb3QpOworICAgICAgICB0dy5zZXRSZWN1cnNpdmUoZmFsc2UpOworICAgICAgICB0eXBlID0gRmlsZVR5cGUuVFJFRTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHR3ID0gVHJlZVdhbGsuZm9yUGF0aChydy5nZXRPYmplY3RSZWFkZXIoKSwgcGF0aCwgcm9vdCk7CisgICAgICAgIGlmICh0dyA9PSBudWxsKSB7CisgICAgICAgICAgcmVzLnNldFN0YXR1cyhTQ19OT1RfRk9VTkQpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0eXBlID0gRmlsZVR5cGUuZm9yRW50cnkodHcpOworICAgICAgICBpZiAodHlwZSA9PSBGaWxlVHlwZS5UUkVFKSB7CisgICAgICAgICAgdHcuZW50ZXJTdWJ0cmVlKCk7CisgICAgICAgICAgdHcuc2V0UmVjdXJzaXZlKGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBUUkVFOgorICAgICAgICAgIHNob3dUcmVlKHJlcSwgcmVzLCBydywgdHcsIG9iaik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1lNTElOSzoKKyAgICAgICAgICBzaG93U3ltbGluayhyZXEsIHJlcywgcncsIHR3KTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRUdVTEFSX0ZJTEU6CisgICAgICAgIGNhc2UgRVhFQ1VUQUJMRV9GSUxFOgorICAgICAgICAgIHNob3dGaWxlKHJlcSwgcmVzLCBydywgdHcpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdJVExJTks6CisgICAgICAgICAgc2hvd0dpdGxpbmsocmVxLCByZXMsIHJ3LCB0dywgcm9vdCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgbG9nLmVycm9yKCJCYWQgZmlsZSB0eXBlOiAlcyIsIHR5cGUpOworICAgICAgICAgIHJlcy5zZXRTdGF0dXMoU0NfTk9UX0ZPVU5EKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChMYXJnZU9iamVjdEV4Y2VwdGlvbiBlKSB7CisgICAgICByZXMuc2V0U3RhdHVzKFNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIHJ3LnJlbGVhc2UoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgc2hvd1RyZWUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsIFJldldhbGsgcncsIFRyZWVXYWxrIHR3LAorICAgICAgT2JqZWN0SWQgaWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgR2l0aWxlc1ZpZXcgdmlldyA9IFZpZXdGaWx0ZXIuZ2V0VmlldyhyZXEpOworICAgIC8vIFRPRE8oc29wKTogQWxsb3cgY2FjaGluZyB0cmVlcyBieSBTSEEtMSB3aGVuIG5vIFMgY29va2llIGlzIHNlbnQuCisgICAgcmVuZGVyKHJlcSwgcmVzLCAiZ2l0aWxlcy5wYXRoRGV0YWlsIiwgSW1tdXRhYmxlTWFwLm9mKAorICAgICAgICAidGl0bGUiLCAhdmlldy5nZXRUcmVlUGF0aCgpLmlzRW1wdHkoKSA/IHZpZXcuZ2V0VHJlZVBhdGgoKSA6ICIvIiwKKyAgICAgICAgInR5cGUiLCBGaWxlVHlwZS5UUkVFLnRvU3RyaW5nKCksCisgICAgICAgICJkYXRhIiwgbmV3IFRyZWVTb3lEYXRhKHJ3LCB2aWV3KS50b1NveURhdGEoaWQsIHR3KSkpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHNob3dGaWxlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzLCBSZXZXYWxrIHJ3LCBUcmVlV2FsayB0dykKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgR2l0aWxlc1ZpZXcgdmlldyA9IFZpZXdGaWx0ZXIuZ2V0VmlldyhyZXEpOworICAgIC8vIFRPRE8oc29wKTogQWxsb3cgY2FjaGluZyBmaWxlcyBieSBTSEEtMSB3aGVuIG5vIFMgY29va2llIGlzIHNlbnQuCisgICAgcmVuZGVyKHJlcSwgcmVzLCAiZ2l0aWxlcy5wYXRoRGV0YWlsIiwgSW1tdXRhYmxlTWFwLm9mKAorICAgICAgICAidGl0bGUiLCBWaWV3RmlsdGVyLmdldFZpZXcocmVxKS5nZXRUcmVlUGF0aCgpLAorICAgICAgICAidHlwZSIsIEZpbGVUeXBlLmZvckVudHJ5KHR3KS50b1N0cmluZygpLAorICAgICAgICAiZGF0YSIsIG5ldyBCbG9iU295RGF0YShydywgdmlldykudG9Tb3lEYXRhKHR3LmdldFBhdGhTdHJpbmcoKSwgdHcuZ2V0T2JqZWN0SWQoMCkpKSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgc2hvd1N5bWxpbmsoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsIFJldldhbGsgcncsCisgICAgICBUcmVlV2FsayB0dykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBHaXRpbGVzVmlldyB2aWV3ID0gVmlld0ZpbHRlci5nZXRWaWV3KHJlcSk7CisgICAgT2JqZWN0SWQgaWQgPSB0dy5nZXRPYmplY3RJZCgwKTsKKyAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGRhdGEgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKworICAgIE9iamVjdExvYWRlciBsb2FkZXIgPSBydy5nZXRPYmplY3RSZWFkZXIoKS5vcGVuKGlkLCBPQkpfQkxPQik7CisgICAgU3RyaW5nIHRhcmdldDsKKyAgICB0cnkgeworICAgICAgdGFyZ2V0ID0gUmF3UGFyc2VVdGlscy5kZWNvZGUobG9hZGVyLmdldENhY2hlZEJ5dGVzKFRyZWVTb3lEYXRhLk1BWF9TWU1MSU5LX1NJWkUpKTsKKyAgICB9IGNhdGNoIChMYXJnZU9iamVjdEV4Y2VwdGlvbi5PdXRPZk1lbW9yeSBlKSB7CisgICAgICB0aHJvdyBlOworICAgIH0gY2F0Y2ggKExhcmdlT2JqZWN0RXhjZXB0aW9uIGUpIHsKKyAgICAgIGRhdGEucHV0KCJzaGEiLCBPYmplY3RJZC50b1N0cmluZyhpZCkpOworICAgICAgZGF0YS5wdXQoImRhdGEiLCBudWxsKTsKKyAgICAgIGRhdGEucHV0KCJzaXplIiwgTG9uZy50b1N0cmluZyhsb2FkZXIuZ2V0U2l6ZSgpKSk7CisgICAgICByZW5kZXIocmVxLCByZXMsICJnaXRpbGVzLnBhdGhEZXRhaWwiLCBJbW11dGFibGVNYXAub2YoCisgICAgICAgICAgInRpdGxlIiwgVmlld0ZpbHRlci5nZXRWaWV3KHJlcSkuZ2V0VHJlZVBhdGgoKSwKKyAgICAgICAgICAidHlwZSIsIEZpbGVUeXBlLlJFR1VMQVJfRklMRS50b1N0cmluZygpLAorICAgICAgICAgICJkYXRhIiwgZGF0YSkpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFN0cmluZyB1cmwgPSByZXNvbHZlVGFyZ2V0VXJsKAorICAgICAgICBHaXRpbGVzVmlldy5wYXRoKCkKKyAgICAgICAgICAgIC5jb3B5RnJvbSh2aWV3KQorICAgICAgICAgICAgLnNldFRyZWVQYXRoKGRpcm5hbWUodmlldy5nZXRUcmVlUGF0aCgpKSkKKyAgICAgICAgICAgIC5idWlsZCgpLAorICAgICAgICB0YXJnZXQpOworICAgIGRhdGEucHV0KCJ0aXRsZSIsIHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisgICAgZGF0YS5wdXQoInRhcmdldCIsIHRhcmdldCk7CisgICAgaWYgKHVybCAhPSBudWxsKSB7CisgICAgICBkYXRhLnB1dCgidGFyZ2V0VXJsIiwgdXJsKTsKKyAgICB9CisKKyAgICAvLyBUT0RPKHNvcCk6IEFsbG93IGNhY2hpbmcgZmlsZXMgYnkgU0hBLTEgd2hlbiBubyBTIGNvb2tpZSBpcyBzZW50LgorICAgIHJlbmRlcihyZXEsIHJlcywgImdpdGlsZXMucGF0aERldGFpbCIsIEltbXV0YWJsZU1hcC5vZigKKyAgICAgICAgInRpdGxlIiwgVmlld0ZpbHRlci5nZXRWaWV3KHJlcSkuZ2V0VHJlZVBhdGgoKSwKKyAgICAgICAgInR5cGUiLCBGaWxlVHlwZS5TWU1MSU5LLnRvU3RyaW5nKCksCisgICAgICAgICJkYXRhIiwgZGF0YSkpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRpcm5hbWUoU3RyaW5nIHBhdGgpIHsKKyAgICB3aGlsZSAocGF0aC5jaGFyQXQocGF0aC5sZW5ndGgoKSAtIDEpID09ICcvJykgeworICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoKCkgLSAxKTsKKyAgICB9CisgICAgaW50IGxhc3RTbGFzaCA9IHBhdGgubGFzdEluZGV4T2YoJy8nKTsKKyAgICBpZiAobGFzdFNsYXNoID4gMCkgeworICAgICAgcmV0dXJuIHBhdGguc3Vic3RyaW5nKDAsIGxhc3RTbGFzaCAtIDEpOworICAgIH0gZWxzZSBpZiAobGFzdFNsYXNoID09IDApIHsKKyAgICAgIHJldHVybiAiLyI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiLiI7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHNob3dHaXRsaW5rKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzLCBSZXZXYWxrIHJ3LAorICAgICAgVHJlZVdhbGsgdHcsIFJldlRyZWUgcm9vdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBHaXRpbGVzVmlldyB2aWV3ID0gVmlld0ZpbHRlci5nZXRWaWV3KHJlcSk7CisgICAgU3VibW9kdWxlV2FsayBzdyA9IFN1Ym1vZHVsZVdhbGsuZm9yUGF0aChTZXJ2bGV0VXRpbHMuZ2V0UmVwb3NpdG9yeShyZXEpLCByb290LAorICAgICAgICB2aWV3LmdldFRyZWVQYXRoKCkpOworCisgICAgU3RyaW5nIHJlbW90ZVVybDsKKyAgICB0cnkgeworICAgICAgcmVtb3RlVXJsID0gc3cuZ2V0UmVtb3RlVXJsKCk7CisgICAgfSBjYXRjaCAoQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oZSk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIHN3LnJlbGVhc2UoKTsKKyAgICB9CisKKyAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGRhdGEgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKyAgICBkYXRhLnB1dCgic2hhIiwgT2JqZWN0SWQudG9TdHJpbmcodHcuZ2V0T2JqZWN0SWQoMCkpKTsKKyAgICBkYXRhLnB1dCgicmVtb3RlVXJsIiwgcmVtb3RlVXJsKTsKKworICAgICAgLy8gVE9ETyhkYm9yb3dpdHopOiBHdWVzcyB3aGVuIHdlIGNhbiBwdXQgY29tbWl0IFNIQXMgaW4gdGhlIFVSTC4KKyAgICAgIFN0cmluZyBodHRwVXJsID0gcmVzb2x2ZUh0dHBVcmwocmVtb3RlVXJsKTsKKyAgICAgIGlmIChodHRwVXJsICE9IG51bGwpIHsKKyAgICAgICAgZGF0YS5wdXQoImh0dHBVcmwiLCBodHRwVXJsKTsKKyAgICAgIH0KKworICAgICAgLy8gVE9ETyhzb3ApOiBBbGxvdyBjYWNoaW5nIGxpbmtzIGJ5IFNIQS0xIHdoZW4gbm8gUyBjb29raWUgaXMgc2VudC4KKyAgICAgIHJlbmRlcihyZXEsIHJlcywgImdpdGlsZXMucGF0aERldGFpbCIsIEltbXV0YWJsZU1hcC5vZigKKyAgICAgICAgICAidGl0bGUiLCB2aWV3LmdldFRyZWVQYXRoKCksCisgICAgICAgICAgInR5cGUiLCBGaWxlVHlwZS5HSVRMSU5LLnRvU3RyaW5nKCksCisgICAgICAgICAgImRhdGEiLCBkYXRhKSk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVzb2x2ZUh0dHBVcmwoU3RyaW5nIHJlbW90ZVVybCkgeworICAgIHJldHVybiBWRVJCQVRJTV9TVUJNT0RVTEVfVVJMX1BBVFRFUk4ubWF0Y2hlcihyZW1vdGVVcmwpLm1hdGNoZXMoKSA/IHJlbW90ZVVybCA6IG51bGw7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9SZW5kZXJlci5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1JlbmRlcmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJjZTYzNQotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9SZW5kZXJlci5qYXZhCkBAIC0wLDAgKzEsMTA3IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5DaGFyc2V0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkZ1bmN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKK2ltcG9ydCBjb20uZ29vZ2xlLnRlbXBsYXRlLnNveS50b2Z1LlNveVRvZnU7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworLyoqIFJlbmRlcmVyIGZvciBTb3kgdGVtcGxhdGVzIHVzZWQgYnkgR2l0aWxlcy4gKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZW5kZXJlciB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8U3RyaW5nPiBTT1lfRklMRU5BTUVTID0gSW1tdXRhYmxlTGlzdC5vZigKKyAgICAgICJDb21tb24uc295IiwKKyAgICAgICJEaWZmRGV0YWlsLnNveSIsCisgICAgICAiSG9zdEluZGV4LnNveSIsCisgICAgICAiTG9nRGV0YWlsLnNveSIsCisgICAgICAiT2JqZWN0RGV0YWlsLnNveSIsCisgICAgICAiUGF0aERldGFpbC5zb3kiLAorICAgICAgIlJldmlzaW9uRGV0YWlsLnNveSIsCisgICAgICAiUmVwb3NpdG9yeUluZGV4LnNveSIpOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBTVEFUSUNfVVJMX0dMT0JBTFMgPSBJbW11dGFibGVNYXAub2YoCisgICAgICAiZ2l0aWxlcy5DU1NfVVJMIiwgImdpdGlsZXMuY3NzIiwKKyAgICAgICJnaXRpbGVzLlBSRVRUSUZZX0NTU19VUkwiLCAicHJldHRpZnkvcHJldHRpZnkuY3NzIiwKKyAgICAgICJnaXRpbGVzLlBSRVRUSUZZX0pTX1VSTCIsICJwcmV0dGlmeS9wcmV0dGlmeS5qcyIpOworCisgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgVVJMIHRvRmlsZVVSTChTdHJpbmcgZmlsZW5hbWUpIHsKKyAgICBpZiAoZmlsZW5hbWUgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIHRyeSB7CisgICAgICByZXR1cm4gbmV3IEZpbGUoZmlsZW5hbWUpLnRvVVJJKCkudG9VUkwoKTsKKyAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihlKTsKKyAgICB9CisgIH0KKworICBwcm90ZWN0ZWQgSW1tdXRhYmxlTGlzdDxVUkw+IHRlbXBsYXRlczsKKyAgcHJvdGVjdGVkIEltbXV0YWJsZU1hcDxTdHJpbmcsIFN0cmluZz4gZ2xvYmFsczsKKworICBwcm90ZWN0ZWQgUmVuZGVyZXIoRnVuY3Rpb248U3RyaW5nLCBVUkw+IHJlc291cmNlTWFwcGVyLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGdsb2JhbHMsCisgICAgICBTdHJpbmcgc3RhdGljUHJlZml4LCBVUkwgY3VzdG9tVGVtcGxhdGVzKSB7CisgICAgY2hlY2tOb3ROdWxsKHN0YXRpY1ByZWZpeCwgInN0YXRpY1ByZWZpeCIpOworICAgIExpc3Q8VVJMPiBhbGxUZW1wbGF0ZXMgPSBMaXN0cy5uZXdBcnJheUxpc3RXaXRoQ2FwYWNpdHkoU09ZX0ZJTEVOQU1FUy5zaXplKCkgKyAxKTsKKyAgICBmb3IgKFN0cmluZyBmaWxlbmFtZSA6IFNPWV9GSUxFTkFNRVMpIHsKKyAgICAgIGFsbFRlbXBsYXRlcy5hZGQocmVzb3VyY2VNYXBwZXIuYXBwbHkoZmlsZW5hbWUpKTsKKyAgICB9CisgICAgaWYgKGN1c3RvbVRlbXBsYXRlcyAhPSBudWxsKSB7CisgICAgICBhbGxUZW1wbGF0ZXMuYWRkKGN1c3RvbVRlbXBsYXRlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgIGFsbFRlbXBsYXRlcy5hZGQocmVzb3VyY2VNYXBwZXIuYXBwbHkoIkRlZmF1bHRDdXN0b21UZW1wbGF0ZXMuc295IikpOworICAgIH0KKyAgICB0ZW1wbGF0ZXMgPSBJbW11dGFibGVMaXN0LmNvcHlPZihhbGxUZW1wbGF0ZXMpOworCisgICAgTWFwPFN0cmluZywgU3RyaW5nPiBhbGxHbG9iYWxzID0gTWFwcy5uZXdIYXNoTWFwKCk7CisgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGUgOiBTVEFUSUNfVVJMX0dMT0JBTFMuZW50cnlTZXQoKSkgeworICAgICAgYWxsR2xvYmFscy5wdXQoZS5nZXRLZXkoKSwgc3RhdGljUHJlZml4ICsgZS5nZXRWYWx1ZSgpKTsKKyAgICB9CisgICAgYWxsR2xvYmFscy5wdXRBbGwoZ2xvYmFscyk7CisgICAgdGhpcy5nbG9iYWxzID0gSW1tdXRhYmxlTWFwLmNvcHlPZihhbGxHbG9iYWxzKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHJlbmRlcihIdHRwU2VydmxldFJlc3BvbnNlIHJlcywgU3RyaW5nIHRlbXBsYXRlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZW5kZXIocmVzLCB0ZW1wbGF0ZU5hbWUsIEltbXV0YWJsZU1hcC48U3RyaW5nLCBPYmplY3Q+IG9mKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgcmVuZGVyKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzLCBTdHJpbmcgdGVtcGxhdGVOYW1lLCBNYXA8U3RyaW5nLCA/PiBzb3lEYXRhKQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXMuc2V0Q29udGVudFR5cGUoInRleHQvaHRtbCIpOworICAgIHJlcy5zZXRDaGFyYWN0ZXJFbmNvZGluZygiVVRGLTgiKTsKKyAgICBieXRlW10gZGF0YSA9IG5ld1JlbmRlcmVyKHRlbXBsYXRlTmFtZSkuc2V0RGF0YShzb3lEYXRhKS5yZW5kZXIoKS5nZXRCeXRlcyhDaGFyc2V0cy5VVEZfOCk7CisgICAgcmVzLnNldENvbnRlbnRMZW5ndGgoZGF0YS5sZW5ndGgpOworICAgIHJlcy5nZXRPdXRwdXRTdHJlYW0oKS53cml0ZShkYXRhKTsKKyAgfQorCisgIFNveVRvZnUuUmVuZGVyZXIgbmV3UmVuZGVyZXIoU3RyaW5nIHRlbXBsYXRlTmFtZSkgeworICAgIHJldHVybiBnZXRUb2Z1KCkubmV3UmVuZGVyZXIodGVtcGxhdGVOYW1lKTsKKyAgfQorCisgIHByb3RlY3RlZCBhYnN0cmFjdCBTb3lUb2Z1IGdldFRvZnUoKTsKK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9SZXBvc2l0b3J5RGVzY3JpcHRpb24uamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9SZXBvc2l0b3J5RGVzY3JpcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmVlNGRhCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1JlcG9zaXRvcnlEZXNjcmlwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqIERlc2NyaWJlcyBhIHJlcG9zaXRvcnkgaW4gdGhlIHtAbGluayBIb3N0SW5kZXhTZXJ2bGV0fSBKU09OIG91dHB1dC4gKi8KK3B1YmxpYyBjbGFzcyBSZXBvc2l0b3J5RGVzY3JpcHRpb24geworICBwdWJsaWMgU3RyaW5nIG5hbWU7CisgIHB1YmxpYyBTdHJpbmcgY2xvbmVVcmw7CisgIHB1YmxpYyBTdHJpbmcgZGVzY3JpcHRpb247CisgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGJyYW5jaGVzOworfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1JlcG9zaXRvcnlJbmRleFNlcnZsZXQuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9SZXBvc2l0b3J5SW5kZXhTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI1MDY4YQotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9SZXBvc2l0b3J5SW5kZXhTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSw4MCBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci5TZXJ2bGV0VXRpbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZDb21wYXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZkRhdGFiYXNlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworLyoqIFNlcnZlcyB0aGUgaW5kZXggcGFnZSBmb3IgYSByZXBvc2l0b3J5LCBpZiBhY2Nlc3NlZCBkaXJlY3RseSBieSBhIGJyb3dzZXIuICovCitwdWJsaWMgY2xhc3MgUmVwb3NpdG9yeUluZGV4U2VydmxldCBleHRlbmRzIEJhc2VTZXJ2bGV0IHsKKyAgcHJpdmF0ZSBmaW5hbCBHaXRpbGVzQWNjZXNzLkZhY3RvcnkgYWNjZXNzRmFjdG9yeTsKKworICBwdWJsaWMgUmVwb3NpdG9yeUluZGV4U2VydmxldChSZW5kZXJlciByZW5kZXJlciwgR2l0aWxlc0FjY2Vzcy5GYWN0b3J5IGFjY2Vzc0ZhY3RvcnkpIHsKKyAgICBzdXBlcihyZW5kZXJlcik7CisgICAgdGhpcy5hY2Nlc3NGYWN0b3J5ID0gY2hlY2tOb3ROdWxsKGFjY2Vzc0ZhY3RvcnksICJhY2Nlc3NGYWN0b3J5Iik7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmVuZGVyKHJlcSwgcmVzLCAiZ2l0aWxlcy5yZXBvc2l0b3J5SW5kZXgiLCBidWlsZERhdGEocmVxKSk7CisgIH0KKworICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgTWFwPFN0cmluZywgPz4gYnVpbGREYXRhKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgUmVwb3NpdG9yeURlc2NyaXB0aW9uIGRlc2MgPSBhY2Nlc3NGYWN0b3J5LmZvclJlcXVlc3QocmVxKS5nZXRSZXBvc2l0b3J5RGVzY3JpcHRpb24oKTsKKyAgICByZXR1cm4gSW1tdXRhYmxlTWFwLm9mKAorICAgICAgICAiY2xvbmVVcmwiLCBkZXNjLmNsb25lVXJsLAorICAgICAgICAiZGVzY3JpcHRpb24iLCBTdHJpbmdzLm51bGxUb0VtcHR5KGRlc2MuZGVzY3JpcHRpb24pLAorICAgICAgICAiYnJhbmNoZXMiLCBnZXRSZWZzKHJlcSwgQ29uc3RhbnRzLlJfSEVBRFMpLAorICAgICAgICAidGFncyIsIGdldFJlZnMocmVxLCBDb25zdGFudHMuUl9UQUdTKSk7CisgIH0KKworICBwcml2YXRlIExpc3Q8TWFwPFN0cmluZywgU3RyaW5nPj4gZ2V0UmVmcyhIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBTdHJpbmcgcHJlZml4KQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBSZWZEYXRhYmFzZSByZWZkYiA9IFNlcnZsZXRVdGlscy5nZXRSZXBvc2l0b3J5KHJlcSkuZ2V0UmVmRGF0YWJhc2UoKTsKKyAgICBTdHJpbmcgcmVwb05hbWUgPSBWaWV3RmlsdGVyLmdldFZpZXcocmVxKS5nZXRSZXBvc2l0b3J5TmFtZSgpOworICAgIENvbGxlY3Rpb248UmVmPiByZWZzID0gUmVmQ29tcGFyYXRvci5zb3J0KHJlZmRiLmdldFJlZnMocHJlZml4KS52YWx1ZXMoKSk7CisgICAgTGlzdDxNYXA8U3RyaW5nLCBTdHJpbmc+PiByZXN1bHQgPSBMaXN0cy5uZXdBcnJheUxpc3RXaXRoQ2FwYWNpdHkocmVmcy5zaXplKCkpOworCisgICAgZm9yIChSZWYgcmVmIDogcmVmcykgeworICAgICAgU3RyaW5nIG5hbWUgPSByZWYuZ2V0TmFtZSgpLnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKCkpOworICAgICAgYm9vbGVhbiBuZWVkUHJlZml4ID0gIXJlZi5nZXROYW1lKCkuZXF1YWxzKHJlZmRiLmdldFJlZihuYW1lKS5nZXROYW1lKCkpOworICAgICAgcmVzdWx0LmFkZChJbW11dGFibGVNYXAub2YoCisgICAgICAgICAgInVybCIsIEdpdGlsZXNWaWV3LmxvZygpLmNvcHlGcm9tKHJlcSkuc2V0UmV2aXNpb24oCisgICAgICAgICAgICAgIFJldmlzaW9uLnVucGVlbGVkKG5lZWRQcmVmaXggPyByZWYuZ2V0TmFtZSgpIDogbmFtZSwgcmVmLmdldE9iamVjdElkKCkpKS50b1VybCgpLAorICAgICAgICAgICJuYW1lIiwgbmFtZSkpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9SZXZpc2lvbi5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1JldmlzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU3NzhlMAotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9SZXZpc2lvbi5qYXZhCkBAIC0wLDAgKzEsMTM4IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLk9CSl9CQUQ7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5PQkpfVEFHOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTWlzc2luZ09iamVjdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5BYmJyZXZpYXRlZE9iamVjdElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldldhbGs7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqIE9iamVjdCBlbmNhcHN1bGF0aW5nIGEgc2luZ2xlIHJldmlzaW9uIGFzIHNlZW4gYnkgR2l0aWxlcy4KKyAqIDxwPgorICogQSBzaW5nbGUgcmV2aXNpb24gY29uc2lzdHMgb2YgYSBuYW1lLCBhbiBJRCwgYW5kIGEgdHlwZS4gTmFtZSBwYXJzaW5nIGlzIGRvbmUKKyAqIG9uY2UgcGVyIHJlcXVlc3QgYnkge0BsaW5rIFJldmlzaW9uUGFyc2VyfS4KKyAqLworcHVibGljIGNsYXNzIFJldmlzaW9uIHsKKyAgLyoqIFNlbnRpbmVsIGluZGljYXRpbmcgYSBtaXNzaW5nIG9yIGVtcHR5IHJldmlzaW9uLiAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIFJldmlzaW9uIE5VTEwgPSBwZWVsZWQoIiIsIE9iamVjdElkLnplcm9JZCgpLCBPQkpfQkFEKTsKKworICAvKiogQ29tbW9uIGRlZmF1bHQgYnJhbmNoIGdpdmVuIHRvIGNsaWVudHMuICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgUmV2aXNpb24gSEVBRCA9IG5hbWVkKCJIRUFEIik7CisKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKyAgcHJpdmF0ZSBmaW5hbCBPYmplY3RJZCBpZDsKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgdHlwZTsKKyAgcHJpdmF0ZSBmaW5hbCBPYmplY3RJZCBwZWVsZWRJZDsKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgcGVlbGVkVHlwZTsKKworICBwdWJsaWMgc3RhdGljIFJldmlzaW9uIHBlZWxlZChTdHJpbmcgbmFtZSwgUmV2T2JqZWN0IG9iaikgeworICAgIHJldHVybiBwZWVsZWQobmFtZSwgb2JqLCBvYmouZ2V0VHlwZSgpKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgUmV2aXNpb24gdW5wZWVsZWQoU3RyaW5nIG5hbWUsIE9iamVjdElkIGlkKSB7CisgICAgcmV0dXJuIHBlZWxlZChuYW1lLCBpZCwgT0JKX0JBRCk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFJldmlzaW9uIG5hbWVkKFN0cmluZyBuYW1lKSB7CisgICAgcmV0dXJuIHBlZWxlZChuYW1lLCBudWxsLCBPQkpfQkFEKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgUmV2aXNpb24gcGVlbChTdHJpbmcgbmFtZSwgT2JqZWN0SWQgaWQsIFJldldhbGsgd2FsaykKKyAgICAgIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgUmV2T2JqZWN0IG9iaiA9IHdhbGsucGFyc2VBbnkoaWQpOworICAgIFJldk9iamVjdCBwZWVsZWQgPSB3YWxrLnBlZWwob2JqKTsKKyAgICByZXR1cm4gbmV3IFJldmlzaW9uKG5hbWUsIG9iaiwgb2JqLmdldFR5cGUoKSwgcGVlbGVkLCBwZWVsZWQuZ2V0VHlwZSgpKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFJldmlzaW9uIHBlZWxlZChTdHJpbmcgbmFtZSwgT2JqZWN0SWQgaWQsIGludCB0eXBlKSB7CisgICAgY2hlY2tBcmd1bWVudCh0eXBlICE9IE9CSl9UQUcsICJleHBlY3RlZCBub24tdGFnIGZvciAlcy8lcyIsIG5hbWUsIGlkKTsKKyAgICByZXR1cm4gbmV3IFJldmlzaW9uKG5hbWUsIGlkLCB0eXBlLCBpZCwgdHlwZSk7CisgIH0KKworICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgUmV2aXNpb24oU3RyaW5nIG5hbWUsIE9iamVjdElkIGlkLCBpbnQgdHlwZSwgT2JqZWN0SWQgcGVlbGVkSWQsIGludCBwZWVsZWRUeXBlKSB7CisgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB0aGlzLmlkID0gaWQ7CisgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICB0aGlzLnBlZWxlZElkID0gcGVlbGVkSWQ7CisgICAgdGhpcy5wZWVsZWRUeXBlID0gcGVlbGVkVHlwZTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICByZXR1cm4gbmFtZTsKKyAgfQorCisgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKKyAgICByZXR1cm4gdHlwZTsKKyAgfQorCisgIHB1YmxpYyBPYmplY3RJZCBnZXRJZCgpIHsKKyAgICByZXR1cm4gaWQ7CisgIH0KKworICBwdWJsaWMgT2JqZWN0SWQgZ2V0UGVlbGVkSWQoKSB7CisgICAgcmV0dXJuIHBlZWxlZElkOworICB9CisKKyAgcHVibGljIGludCBnZXRQZWVsZWRUeXBlKCkgeworICAgIHJldHVybiBwZWVsZWRUeXBlOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gbmFtZUlzSWQoKSB7CisgICAgcmV0dXJuIEFiYnJldmlhdGVkT2JqZWN0SWQuaXNJZChuYW1lKQorICAgICAgICAmJiAoQWJicmV2aWF0ZWRPYmplY3RJZC5mcm9tU3RyaW5nKG5hbWUpLnByZWZpeENvbXBhcmUoaWQpID09IDApOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgIGlmIChvIGluc3RhbmNlb2YgUmV2aXNpb24pIHsKKyAgICAgIFJldmlzaW9uIHIgPSAoUmV2aXNpb24pIG87CisgICAgICByZXR1cm4gT2JqZWN0cy5lcXVhbChuYW1lLCByLm5hbWUpCisgICAgICAgICAgJiYgT2JqZWN0cy5lcXVhbChpZCwgci5pZCkKKyAgICAgICAgICAmJiBPYmplY3RzLmVxdWFsKHR5cGUsIHIudHlwZSkKKyAgICAgICAgICAmJiBPYmplY3RzLmVxdWFsKHBlZWxlZElkLCByLnBlZWxlZElkKQorICAgICAgICAgICYmIE9iamVjdHMuZXF1YWwocGVlbGVkVHlwZSwgci5wZWVsZWRUeXBlKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgcmV0dXJuIE9iamVjdHMuaGFzaENvZGUobmFtZSwgaWQsIHR5cGUsIHBlZWxlZElkLCBwZWVsZWRUeXBlKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiBPYmplY3RzLnRvU3RyaW5nSGVscGVyKHRoaXMpCisgICAgICAgIC5vbWl0TnVsbFZhbHVlcygpCisgICAgICAgIC5hZGQoIm5hbWUiLCBuYW1lKQorICAgICAgICAuYWRkKCJpZCIsIGlkKQorICAgICAgICAuYWRkKCJ0eXBlIiwgdHlwZSkKKyAgICAgICAgLmFkZCgicGVlbGVkSWQiLCBwZWVsZWRJZCkKKyAgICAgICAgLmFkZCgicGVlbGVkVHlwZSIsIHBlZWxlZFR5cGUpCisgICAgICAgIC50b1N0cmluZygpOworICB9Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvUmV2aXNpb25QYXJzZXIuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9SZXZpc2lvblBhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMGFjZmEKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvUmV2aXNpb25QYXJzZXIuamF2YQpAQCAtMCwwICsxLDIxNCBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuQ2hhck1hdGNoZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3BsaXR0ZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5JbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2V2FsazsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKiBPYmplY3QgdG8gcGFyc2UgcmV2aXNpb25zIG91dCBvZiBHaXRpbGVzIHBhdGhzLiAqLworY2xhc3MgUmV2aXNpb25QYXJzZXIgeworICBzdGF0aWMgZmluYWwgU3BsaXR0ZXIgUEFUSF9TUExJVFRFUiA9IFNwbGl0dGVyLm9uKCcvJyk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNwbGl0dGVyIE9QRVJBVE9SX1NQTElUVEVSID0gU3BsaXR0ZXIub24oQ2hhck1hdGNoZXIuYW55T2YoIl5+IikpOworCisgIHN0YXRpYyBjbGFzcyBSZXN1bHQgeworICAgIHByaXZhdGUgZmluYWwgUmV2aXNpb24gcmV2aXNpb247CisgICAgcHJpdmF0ZSBmaW5hbCBSZXZpc2lvbiBvbGRSZXZpc2lvbjsKKyAgICBwcml2YXRlIGZpbmFsIGludCBwYXRoU3RhcnQ7CisKKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBSZXN1bHQoUmV2aXNpb24gcmV2aXNpb24pIHsKKyAgICAgIHRoaXMocmV2aXNpb24sIG51bGwsIHJldmlzaW9uLmdldE5hbWUoKS5sZW5ndGgoKSk7CisgICAgfQorCisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgUmVzdWx0KFJldmlzaW9uIHJldmlzaW9uLCBSZXZpc2lvbiBvbGRSZXZpc2lvbiwgaW50IHBhdGhTdGFydCkgeworICAgICAgdGhpcy5yZXZpc2lvbiA9IHJldmlzaW9uOworICAgICAgdGhpcy5vbGRSZXZpc2lvbiA9IG9sZFJldmlzaW9uOworICAgICAgdGhpcy5wYXRoU3RhcnQgPSBwYXRoU3RhcnQ7CisgICAgfQorCisgICAgcHVibGljIFJldmlzaW9uIGdldFJldmlzaW9uKCkgeworICAgICAgcmV0dXJuIHJldmlzaW9uOworICAgIH0KKworICAgIHB1YmxpYyBSZXZpc2lvbiBnZXRPbGRSZXZpc2lvbigpIHsKKyAgICAgIHJldHVybiBvbGRSZXZpc2lvbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgUmVzdWx0KSB7CisgICAgICAgIFJlc3VsdCByID0gKFJlc3VsdCkgbzsKKyAgICAgICAgcmV0dXJuIE9iamVjdHMuZXF1YWwocmV2aXNpb24sIHIucmV2aXNpb24pCisgICAgICAgICAgICAmJiBPYmplY3RzLmVxdWFsKG9sZFJldmlzaW9uLCByLm9sZFJldmlzaW9uKQorICAgICAgICAgICAgJiYgT2JqZWN0cy5lcXVhbChwYXRoU3RhcnQsIHIucGF0aFN0YXJ0KTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgcmV0dXJuIE9iamVjdHMuaGFzaENvZGUocmV2aXNpb24sIG9sZFJldmlzaW9uLCBwYXRoU3RhcnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICByZXR1cm4gT2JqZWN0cy50b1N0cmluZ0hlbHBlcih0aGlzKQorICAgICAgICAgIC5vbWl0TnVsbFZhbHVlcygpCisgICAgICAgICAgLmFkZCgicmV2aXNpb24iLCByZXZpc2lvbikKKyAgICAgICAgICAuYWRkKCJvbGRSZXZpc2lvbiIsIG9sZFJldmlzaW9uKQorICAgICAgICAgIC5hZGQoInBhdGhTdGFydCIsIHBhdGhTdGFydCkKKyAgICAgICAgICAudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBpbnQgZ2V0UGF0aFN0YXJ0KCkgeworICAgICAgcmV0dXJuIHBhdGhTdGFydDsKKyAgICB9CisgIH0KKworICBwcml2YXRlIGZpbmFsIFJlcG9zaXRvcnkgcmVwbzsKKyAgcHJpdmF0ZSBmaW5hbCBHaXRpbGVzQWNjZXNzIGFjY2VzczsKKyAgcHJpdmF0ZSBmaW5hbCBWaXNpYmlsaXR5Q2FjaGUgY2FjaGU7CisKKyAgUmV2aXNpb25QYXJzZXIoUmVwb3NpdG9yeSByZXBvLCBHaXRpbGVzQWNjZXNzIGFjY2VzcywgVmlzaWJpbGl0eUNhY2hlIGNhY2hlKSB7CisgICAgdGhpcy5yZXBvID0gY2hlY2tOb3ROdWxsKHJlcG8sICJyZXBvIik7CisgICAgdGhpcy5hY2Nlc3MgPSBjaGVja05vdE51bGwoYWNjZXNzLCAiYWNjZXNzIik7CisgICAgdGhpcy5jYWNoZSA9IGNoZWNrTm90TnVsbChjYWNoZSwgImNhY2hlIik7CisgIH0KKworICBSZXN1bHQgcGFyc2UoU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgUmV2V2FsayB3YWxrID0gbmV3IFJldldhbGsocmVwbyk7CisgICAgdHJ5IHsKKyAgICAgIFJldmlzaW9uIG9sZFJldmlzaW9uID0gbnVsbDsKKworICAgICAgU3RyaW5nQnVpbGRlciBiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworICAgICAgZm9yIChTdHJpbmcgcGFydCA6IFBBVEhfU1BMSVRURVIuc3BsaXQocGF0aCkpIHsKKyAgICAgICAgaWYgKHBhcnQuaXNFbXB0eSgpKSB7CisgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIE5vIHZhbGlkIHJldmlzaW9uIGNvbnRhaW5zIGVtcHR5IHNlZ21lbnRzLgorICAgICAgICB9CisgICAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgICBiLmFwcGVuZCgnLycpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG9sZFJldmlzaW9uID09IG51bGwpIHsKKyAgICAgICAgICBpbnQgZG90cyA9IHBhcnQuaW5kZXhPZigiLi4iKTsKKyAgICAgICAgICBpbnQgZmlyc3RQYXJlbnQgPSBwYXJ0LmluZGV4T2YoIl4hIik7CisgICAgICAgICAgaWYgKGRvdHMgPT0gMCB8fCBmaXJzdFBhcmVudCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICB9IGVsc2UgaWYgKGRvdHMgPiAwKSB7CisgICAgICAgICAgICBiLmFwcGVuZChwYXJ0LnN1YnN0cmluZygwLCBkb3RzKSk7CisgICAgICAgICAgICBTdHJpbmcgb2xkTmFtZSA9IGIudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGlmICghaXNWYWxpZFJldmlzaW9uKG9sZE5hbWUpKSB7CisgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgT2JqZWN0SWQgb2xkID0gcmVwby5yZXNvbHZlKG9sZE5hbWUpOworICAgICAgICAgICAgICBpZiAob2xkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBvbGRSZXZpc2lvbiA9IFJldmlzaW9uLnBlZWwob2xkTmFtZSwgb2xkLCB3YWxrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhcnQgPSBwYXJ0LnN1YnN0cmluZyhkb3RzICsgMik7CisgICAgICAgICAgICBiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGZpcnN0UGFyZW50ID4gMCkgeworICAgICAgICAgICAgaWYgKGZpcnN0UGFyZW50ICE9IHBhcnQubGVuZ3RoKCkgLSAyKSB7CisgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYi5hcHBlbmQocGFydC5zdWJzdHJpbmcoMCwgcGFydC5sZW5ndGgoKSAtIDIpKTsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gYi50b1N0cmluZygpOworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkUmV2aXNpb24obmFtZSkpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBPYmplY3RJZCBpZCA9IHJlcG8ucmVzb2x2ZShuYW1lKTsKKyAgICAgICAgICAgIGlmIChpZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUmV2Q29tbWl0IGM7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICBjID0gd2Fsay5wYXJzZUNvbW1pdChpZCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIE5vdCBhIGNvbW1pdCwgXiEgaXMgaW52YWxpZC4KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjLmdldFBhcmVudENvdW50KCkgPiAwKSB7CisgICAgICAgICAgICAgIG9sZFJldmlzaW9uID0gUmV2aXNpb24ucGVlbGVkKG5hbWUgKyAiXiIsIGMuZ2V0UGFyZW50KDApKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIG9sZFJldmlzaW9uID0gUmV2aXNpb24uTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFJlc3VsdCByZXN1bHQgPSBuZXcgUmVzdWx0KFJldmlzaW9uLnBlZWxlZChuYW1lLCBjKSwgb2xkUmV2aXNpb24sIG5hbWUubGVuZ3RoKCkgKyAyKTsKKyAgICAgICAgICAgIHJldHVybiBpc1Zpc2libGUod2FsaywgcmVzdWx0KSA/IHJlc3VsdCA6IG51bGw7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGIuYXBwZW5kKHBhcnQpOworCisgICAgICAgIFN0cmluZyBuYW1lID0gYi50b1N0cmluZygpOworICAgICAgICBpZiAoIWlzVmFsaWRSZXZpc2lvbihuYW1lKSkgeworICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIE9iamVjdElkIGlkID0gcmVwby5yZXNvbHZlKG5hbWUpOworICAgICAgICBpZiAoaWQgIT0gbnVsbCkgeworICAgICAgICAgIGludCBwYXRoU3RhcnQ7CisgICAgICAgICAgaWYgKG9sZFJldmlzaW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIHBhdGhTdGFydCA9IG5hbWUubGVuZ3RoKCk7IC8vIGZvbworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBmb28uLmJhciAoZm9vIG1heSBiZSBlbXB0eSkKKyAgICAgICAgICAgIHBhdGhTdGFydCA9IG9sZFJldmlzaW9uLmdldE5hbWUoKS5sZW5ndGgoKSArIDIgKyBuYW1lLmxlbmd0aCgpOworICAgICAgICAgIH0KKyAgICAgICAgICBSZXN1bHQgcmVzdWx0ID0gbmV3IFJlc3VsdChSZXZpc2lvbi5wZWVsKG5hbWUsIGlkLCB3YWxrKSwgb2xkUmV2aXNpb24sIHBhdGhTdGFydCk7CisgICAgICAgICAgcmV0dXJuIGlzVmlzaWJsZSh3YWxrLCByZXN1bHQpID8gcmVzdWx0IDogbnVsbDsKKyAgICAgICAgfQorICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfQorICAgICAgcmV0dXJuIG51bGw7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIHdhbGsucmVsZWFzZSgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFJldmlzaW9uKFN0cmluZyByZXZpc2lvbikgeworICAgIC8vIERpc2FsbG93IHNvbWUgdW5jb21tb24gYnV0IHZhbGlkIHJldmlzaW9uIGV4cHJlc3Npb25zIHRoYXQgZWl0aGVyIHdlCisgICAgLy8gZG9uJ3Qgc3VwcG9ydCBvciB3ZSByZXByZXNlbnQgZGlmZmVyZW50bHkgaW4gb3VyIFVSTHMuCisgICAgcmV0dXJuIHJldmlzaW9uLmluZGV4T2YoJzonKSA8IDAKKyAgICAgICAgJiYgcmV2aXNpb24uaW5kZXhPZigiXnsiKSA8IDAKKyAgICAgICAgJiYgcmV2aXNpb24uaW5kZXhPZignQCcpIDwgMDsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBpc1Zpc2libGUoUmV2V2FsayB3YWxrLCBSZXN1bHQgcmVzdWx0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIFN0cmluZyBtYXliZVJlZiA9IE9QRVJBVE9SX1NQTElUVEVSLnNwbGl0KHJlc3VsdC5nZXRSZXZpc2lvbigpLmdldE5hbWUoKSkuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgaWYgKHJlcG8uZ2V0UmVmKG1heWJlUmVmKSAhPSBudWxsKSB7CisgICAgICAvLyBOYW1lIGNvbnRhaW5zIGEgdmlzaWJsZSByZWY7IHNraXAgZXhwZW5zaXZlIHJlYWNoYWJpbGl0eSBjaGVjay4KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoIWNhY2hlLmlzVmlzaWJsZShyZXBvLCB3YWxrLCBhY2Nlc3MsIHJlc3VsdC5nZXRSZXZpc2lvbigpLmdldElkKCkpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChyZXN1bHQuZ2V0T2xkUmV2aXNpb24oKSAhPSBudWxsICYmIHJlc3VsdC5nZXRPbGRSZXZpc2lvbigpICE9IFJldmlzaW9uLk5VTEwpIHsKKyAgICAgIHJldHVybiBjYWNoZS5pc1Zpc2libGUocmVwbywgd2FsaywgYWNjZXNzLCByZXN1bHQuZ2V0T2xkUmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvUmV2aXNpb25TZXJ2bGV0LmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvUmV2aXNpb25TZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZhNzA4NgotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9SZXZpc2lvblNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDEzNiBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTk9UX0ZPVU5EOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKX0JMT0I7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5PQkpfQ09NTUlUOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKX1RBRzsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLk9CSl9UUkVFOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdpdGlsZXMuQ29tbWl0U295RGF0YS5LZXlTZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5JbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLk1pc3NpbmdPYmplY3RFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci5TZXJ2bGV0VXRpbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2T2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZUYWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldldhbGs7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKKy8qKiBTZXJ2ZXMgYW4gSFRNTCBwYWdlIHdpdGggZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgYSByZWYuICovCitwdWJsaWMgY2xhc3MgUmV2aXNpb25TZXJ2bGV0IGV4dGVuZHMgQmFzZVNlcnZsZXQgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUmV2aXNpb25TZXJ2bGV0LmNsYXNzKTsKKworICBwcml2YXRlIGZpbmFsIExpbmtpZmllciBsaW5raWZpZXI7CisKKyAgcHVibGljIFJldmlzaW9uU2VydmxldChSZW5kZXJlciByZW5kZXJlciwgTGlua2lmaWVyIGxpbmtpZmllcikgeworICAgIHN1cGVyKHJlbmRlcmVyKTsKKyAgICB0aGlzLmxpbmtpZmllciA9IGNoZWNrTm90TnVsbChsaW5raWZpZXIsICJsaW5raWZpZXIiKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBHaXRpbGVzVmlldyB2aWV3ID0gVmlld0ZpbHRlci5nZXRWaWV3KHJlcSk7CisgICAgUmVwb3NpdG9yeSByZXBvID0gU2VydmxldFV0aWxzLmdldFJlcG9zaXRvcnkocmVxKTsKKworICAgIFJldldhbGsgd2FsayA9IG5ldyBSZXZXYWxrKHJlcG8pOworICAgIHRyeSB7CisgICAgICBMaXN0PFJldk9iamVjdD4gb2JqZWN0cyA9IGxpc3RPYmplY3RzKHdhbGssIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICAgIExpc3Q8TWFwPFN0cmluZywgPz4+IHNveU9iamVjdHMgPSBMaXN0cy5uZXdBcnJheUxpc3RXaXRoQ2FwYWNpdHkob2JqZWN0cy5zaXplKCkpOworICAgICAgYm9vbGVhbiBoYXNCbG9iID0gZmFsc2U7CisKKyAgICAgIC8vIFRPRE8oc29wKTogQWxsb3cgY2FjaGluZyBjb21taXRzIGJ5IFNIQS0xIHdoZW4gbm8gUyBjb29raWUgaXMgc2VudC4KKyAgICAgIGZvciAoUmV2T2JqZWN0IG9iaiA6IG9iamVjdHMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBzd2l0Y2ggKG9iai5nZXRUeXBlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgT0JKX0NPTU1JVDoKKyAgICAgICAgICAgICAgc295T2JqZWN0cy5hZGQoSW1tdXRhYmxlTWFwLm9mKAorICAgICAgICAgICAgICAgICAgInR5cGUiLCBDb25zdGFudHMuVFlQRV9DT01NSVQsCisgICAgICAgICAgICAgICAgICAiZGF0YSIsIG5ldyBDb21taXRTb3lEYXRhKGxpbmtpZmllciwgcmVxLCByZXBvLCB3YWxrLCB2aWV3KQorICAgICAgICAgICAgICAgICAgICAgIC50b1NveURhdGEoKFJldkNvbW1pdCkgb2JqLCBLZXlTZXQuREVUQUlMX0RJRkZfVFJFRSkpKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSl9UUkVFOgorICAgICAgICAgICAgICBzb3lPYmplY3RzLmFkZChJbW11dGFibGVNYXAub2YoCisgICAgICAgICAgICAgICAgICAidHlwZSIsIENvbnN0YW50cy5UWVBFX1RSRUUsCisgICAgICAgICAgICAgICAgICAiZGF0YSIsIG5ldyBUcmVlU295RGF0YSh3YWxrLCB2aWV3KS50b1NveURhdGEob2JqKSkpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKX0JMT0I6CisgICAgICAgICAgICAgIHNveU9iamVjdHMuYWRkKEltbXV0YWJsZU1hcC5vZigKKyAgICAgICAgICAgICAgICAgICJ0eXBlIiwgQ29uc3RhbnRzLlRZUEVfQkxPQiwKKyAgICAgICAgICAgICAgICAgICJkYXRhIiwgbmV3IEJsb2JTb3lEYXRhKHdhbGssIHZpZXcpLnRvU295RGF0YShvYmopKSk7CisgICAgICAgICAgICAgIGhhc0Jsb2IgPSB0cnVlOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKX1RBRzoKKyAgICAgICAgICAgICAgc295T2JqZWN0cy5hZGQoSW1tdXRhYmxlTWFwLm9mKAorICAgICAgICAgICAgICAgICAgInR5cGUiLCBDb25zdGFudHMuVFlQRV9UQUcsCisgICAgICAgICAgICAgICAgICAiZGF0YSIsIG5ldyBUYWdTb3lEYXRhKGxpbmtpZmllciwgcmVxKS50b1NveURhdGEoKFJldlRhZykgb2JqKSkpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIGxvZy53YXJuKCJCYWQgb2JqZWN0IHR5cGUgZm9yICVzOiAlcyIsIE9iamVjdElkLnRvU3RyaW5nKG9iai5nZXRJZCgpKSwgb2JqLmdldFR5cGUoKSk7CisgICAgICAgICAgICAgIHJlcy5zZXRTdGF0dXMoU0NfTk9UX0ZPVU5EKTsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoTWlzc2luZ09iamVjdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgbG9nLndhcm4oIk1pc3Npbmcgb2JqZWN0ICIgKyBPYmplY3RJZC50b1N0cmluZyhvYmouZ2V0SWQoKSksIGUpOworICAgICAgICAgIHJlcy5zZXRTdGF0dXMoU0NfTk9UX0ZPVU5EKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gY2F0Y2ggKEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24gZSkgeworICAgICAgICAgIGxvZy53YXJuKCJJbmNvcnJlY3Qgb2JqZWN0IHR5cGUgZm9yICIgKyBPYmplY3RJZC50b1N0cmluZyhvYmouZ2V0SWQoKSksIGUpOworICAgICAgICAgIHJlcy5zZXRTdGF0dXMoU0NfTk9UX0ZPVU5EKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmVuZGVyKHJlcSwgcmVzLCAiZ2l0aWxlcy5yZXZpc2lvbkRldGFpbCIsIEltbXV0YWJsZU1hcC5vZigKKyAgICAgICAgICAidGl0bGUiLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0TmFtZSgpLAorICAgICAgICAgICJvYmplY3RzIiwgc295T2JqZWN0cywKKyAgICAgICAgICAiaGFzQmxvYiIsIGhhc0Jsb2IpKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgd2Fsay5yZWxlYXNlKCk7CisgICAgfQorICB9CisKKyAgLy8gVE9ETyhkYm9yb3dpdHopOiBFeHRyYWN0IHRoaXMuCisgIHN0YXRpYyBMaXN0PFJldk9iamVjdD4gbGlzdE9iamVjdHMoUmV2V2FsayB3YWxrLCBPYmplY3RJZCBpZCkKKyAgICAgIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgTGlzdDxSZXZPYmplY3Q+IG9iamVjdHMgPSBMaXN0cy5uZXdBcnJheUxpc3RXaXRoRXhwZWN0ZWRTaXplKDEpOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBSZXZPYmplY3QgY3VyID0gd2Fsay5wYXJzZUFueShpZCk7CisgICAgICBvYmplY3RzLmFkZChjdXIpOworICAgICAgaWYgKGN1ci5nZXRUeXBlKCkgPT0gQ29uc3RhbnRzLk9CSl9UQUcpIHsKKyAgICAgICAgaWQgPSAoKFJldlRhZykgY3VyKS5nZXRPYmplY3QoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gb2JqZWN0czsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1RhZ1NveURhdGEuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9UYWdTb3lEYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRkZjFlNQotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9UYWdTb3lEYXRhLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2VGFnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5HaXREYXRlRm9ybWF0dGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5HaXREYXRlRm9ybWF0dGVyLkZvcm1hdDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworCisvKiogU295IGRhdGEgY29udmVydGVyIGZvciBnaXQgdGFncy4gKi8KK3B1YmxpYyBjbGFzcyBUYWdTb3lEYXRhIHsKKyAgcHJpdmF0ZSBmaW5hbCBMaW5raWZpZXIgbGlua2lmaWVyOworICBwcml2YXRlIGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXE7CisgIHByaXZhdGUgZmluYWwgR2l0RGF0ZUZvcm1hdHRlciBkYXRlRm9ybWF0dGVyOworCisgIHB1YmxpYyBUYWdTb3lEYXRhKExpbmtpZmllciBsaW5raWZpZXIsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKyAgICB0aGlzLmxpbmtpZmllciA9IGxpbmtpZmllcjsKKyAgICB0aGlzLnJlcSA9IHJlcTsKKyAgICB0aGlzLmRhdGVGb3JtYXR0ZXIgPSBuZXcgR2l0RGF0ZUZvcm1hdHRlcihGb3JtYXQuREVGQVVMVCk7CisgIH0KKworICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiB0b1NveURhdGEoUmV2VGFnIHRhZykgeworICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gZGF0YSA9IE1hcHMubmV3SGFzaE1hcFdpdGhFeHBlY3RlZFNpemUoNCk7CisgICAgZGF0YS5wdXQoInNoYSIsIE9iamVjdElkLnRvU3RyaW5nKHRhZykpOworICAgIGlmICh0YWcuZ2V0VGFnZ2VySWRlbnQoKSAhPSBudWxsKSB7CisgICAgICBkYXRhLnB1dCgidGFnZ2VyIiwgQ29tbWl0U295RGF0YS50b1NveURhdGEodGFnLmdldFRhZ2dlcklkZW50KCksIGRhdGVGb3JtYXR0ZXIpKTsKKyAgICB9CisgICAgZGF0YS5wdXQoIm9iamVjdCIsIE9iamVjdElkLnRvU3RyaW5nKHRhZy5nZXRPYmplY3QoKSkpOworICAgIGRhdGEucHV0KCJtZXNzYWdlIiwgbGlua2lmaWVyLmxpbmtpZnkocmVxLCB0YWcuZ2V0RnVsbE1lc3NhZ2UoKSkpOworICAgIHJldHVybiBkYXRhOworICB9Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvVHJlZVNveURhdGEuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9UcmVlU295RGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYmY1NDEKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvVHJlZVNveURhdGEuamF2YQpAQCAtMCwwICsxLDE2MCBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5naXRpbGVzLlJldmlzaW9uUGFyc2VyLlBBVEhfU1BMSVRURVI7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5PQkpfQ09NTUlUOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5DaGFyc2V0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5pby5GaWxlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdpdGlsZXMuUGF0aFNlcnZsZXQuRmlsZVR5cGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5NaXNzaW5nT2JqZWN0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZXYWxrOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuVHJlZVdhbGs7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKKworLyoqIFNveSBkYXRhIGNvbnZlcnRlciBmb3IgZ2l0IHRyZWVzLiAqLworcHVibGljIGNsYXNzIFRyZWVTb3lEYXRhIHsKKyAgLyoqCisgICAqIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGRpc3BsYXkgZm9yIGEgc3ltbGluayB0YXJnZXQuIFRhcmdldHMgbG9uZ2VyIHRoYW4KKyAgICogdGhpcyBhcmUgYWJicmV2aWF0ZWQgZm9yIGRpc3BsYXkgaW4gYSB0cmVlIGxpc3RpbmcuCisgICAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1NZTUxJTktfVEFSR0VUX0xFTkdUSCA9IDcyOworCisgIC8qKgorICAgKiBNYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBsb2FkIGZyb20gYSBibG9iIHRoYXQgY2xhaW1zIHRvIGJlIGEgc3ltbGluay4gSWYKKyAgICogdGhlIGJsb2IgaXMgbGFyZ2VyIHRoYW4gdGhpcyBieXRlIGxpbWl0IGl0IHdpbGwgYmUgZGlzcGxheWVkIGFzIGEgYmluYXJ5CisgICAqIGZpbGUgaW5zdGVhZCBvZiBhcyBhIHN5bWxpbmsuCisgICAqLworICBzdGF0aWMgZmluYWwgaW50IE1BWF9TWU1MSU5LX1NJWkUgPSAxNiA8PCAxMDsKKworICBzdGF0aWMgU3RyaW5nIHJlc29sdmVUYXJnZXRVcmwoR2l0aWxlc1ZpZXcgdmlldywgU3RyaW5nIHRhcmdldCkgeworICAgIGlmICh0YXJnZXQuc3RhcnRzV2l0aCgiLyIpKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvLyBzaW1wbGlmeVBhdGgoKSBub3JtYWxpemVzICJhLy4uLy4uLyIgdG8gImEiLCBzbyBtYW51YWxseSBjaGVjayB3aGV0aGVyCisgICAgLy8gdGhlIHBhdGggbGVhZHMgYWJvdmUgdGhlIGdpdCByb290LgorICAgIGludCBkZXB0aCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmlldy5nZXRUcmVlUGF0aCgpLCAiLyIpLmNvdW50VG9rZW5zKCk7CisgICAgZm9yIChTdHJpbmcgcGFydCA6IFBBVEhfU1BMSVRURVIuc3BsaXQodGFyZ2V0KSkgeworICAgICAgaWYgKHBhcnQuZXF1YWxzKCIuLiIpKSB7CisgICAgICAgIGRlcHRoLS07CisgICAgICAgIGlmIChkZXB0aCA8IDApIHsKKyAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmICghcGFydC5pc0VtcHR5KCkgJiYgIXBhcnQuZXF1YWxzKCIuIikpIHsKKyAgICAgICAgZGVwdGgrKzsKKyAgICAgIH0KKyAgICB9CisKKyAgICBTdHJpbmcgcGF0aCA9IEZpbGVzLnNpbXBsaWZ5UGF0aCh2aWV3LmdldFRyZWVQYXRoKCkgKyAiLyIgKyB0YXJnZXQpOworICAgIHJldHVybiBHaXRpbGVzVmlldy5wYXRoKCkKKyAgICAgICAgLmNvcHlGcm9tKHZpZXcpCisgICAgICAgIC5zZXRUcmVlUGF0aCghcGF0aC5lcXVhbHMoIi4iKSA/IHBhdGggOiAiIikKKyAgICAgICAgLnRvVXJsKCk7CisgIH0KKworICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgc3RhdGljIFN0cmluZyBnZXRUYXJnZXREaXNwbGF5TmFtZShTdHJpbmcgdGFyZ2V0KSB7CisgICAgaWYgKHRhcmdldC5sZW5ndGgoKSA8PSBNQVhfU1lNTElOS19UQVJHRVRfTEVOR1RIKSB7CisgICAgICByZXR1cm4gdGFyZ2V0OworICAgIH0gZWxzZSB7CisgICAgICBpbnQgbGFzdFNsYXNoID0gdGFyZ2V0Lmxhc3RJbmRleE9mKCcvJyk7CisgICAgICAvLyBUT0RPKGRib3Jvd2l0eik6IERvZXNuJ3QgYWJicmV2aWF0ZSBhIGxvbmcgbGFzdCBwYXRoIGNvbXBvbmVudC4KKyAgICAgIHJldHVybiBsYXN0U2xhc2ggPj0gMCA/ICIuLi4iICsgdGFyZ2V0LnN1YnN0cmluZyhsYXN0U2xhc2gpIDogdGFyZ2V0OworICAgIH0KKyAgfQorCisgIHByaXZhdGUgZmluYWwgUmV2V2FsayBydzsKKyAgcHJpdmF0ZSBmaW5hbCBHaXRpbGVzVmlldyB2aWV3OworCisgIHB1YmxpYyBUcmVlU295RGF0YShSZXZXYWxrIHJ3LCBHaXRpbGVzVmlldyB2aWV3KSB7CisgICAgdGhpcy5ydyA9IHJ3OworICAgIHRoaXMudmlldyA9IHZpZXc7CisgIH0KKworICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiB0b1NveURhdGEoT2JqZWN0SWQgdHJlZUlkLCBUcmVlV2FsayB0dykgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCisgICAgICAgICBJT0V4Y2VwdGlvbiB7CisgICAgTGlzdDxPYmplY3Q+IGVudHJpZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBHaXRpbGVzVmlldy5CdWlsZGVyIHVybEJ1aWxkZXIgPSBHaXRpbGVzVmlldy5wYXRoKCkuY29weUZyb20odmlldyk7CisgICAgd2hpbGUgKHR3Lm5leHQoKSkgeworICAgICAgRmlsZVR5cGUgdHlwZSA9IEZpbGVUeXBlLmZvckVudHJ5KHR3KTsKKyAgICAgIFN0cmluZyBuYW1lID0gdHcuZ2V0TmFtZVN0cmluZygpOworCisgICAgICBzd2l0Y2ggKHZpZXcuZ2V0VHlwZSgpKSB7CisgICAgICAgIGNhc2UgUEFUSDoKKyAgICAgICAgICB1cmxCdWlsZGVyLnNldFRyZWVQYXRoKHZpZXcuZ2V0VHJlZVBhdGgoKSArICIvIiArIG5hbWUpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFVklTSU9OOgorICAgICAgICAgIC8vIEdvdCBoZXJlIGZyb20gYSB0YWcgcG9pbnRpbmcgYXQgYSB0cmVlLgorICAgICAgICAgIHVybEJ1aWxkZXIuc2V0VHJlZVBhdGgobmFtZSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAiQ2Fubm90IHJlbmRlciBUcmVlU295RGF0YSBmcm9tICVzIHZpZXciLCB2aWV3LmdldFR5cGUoKSkpOworICAgICAgfQorCisgICAgICBTdHJpbmcgdXJsID0gdXJsQnVpbGRlci50b1VybCgpOworICAgICAgaWYgKHR5cGUgPT0gRmlsZVR5cGUuVFJFRSkgeworICAgICAgICBuYW1lICs9ICIvIjsKKyAgICAgICAgdXJsICs9ICIvIjsKKyAgICAgIH0KKyAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gZW50cnkgPSBNYXBzLm5ld0hhc2hNYXBXaXRoRXhwZWN0ZWRTaXplKDQpOworICAgICAgZW50cnkucHV0KCJ0eXBlIiwgdHlwZS50b1N0cmluZygpKTsKKyAgICAgIGVudHJ5LnB1dCgibmFtZSIsIG5hbWUpOworICAgICAgZW50cnkucHV0KCJ1cmwiLCB1cmwpOworICAgICAgaWYgKHR5cGUgPT0gRmlsZVR5cGUuU1lNTElOSykgeworICAgICAgICBTdHJpbmcgdGFyZ2V0ID0gbmV3IFN0cmluZygKKyAgICAgICAgICAgIHJ3LmdldE9iamVjdFJlYWRlcigpLm9wZW4odHcuZ2V0T2JqZWN0SWQoMCkpLmdldENhY2hlZEJ5dGVzKCksCisgICAgICAgICAgICBDaGFyc2V0cy5VVEZfOCk7CisgICAgICAgIC8vIFRPRE8oZGJvcm93aXR6KTogTWVyZ2UgU2hhd24ncyBjaGFuZ2VzIGJlZm9yZSBjb3B5aW5nIHRoZXNlIG1ldGhvZHMKKyAgICAgICAgLy8gaW4uCisgICAgICAgIGVudHJ5LnB1dCgidGFyZ2V0TmFtZSIsIGdldFRhcmdldERpc3BsYXlOYW1lKHRhcmdldCkpOworICAgICAgICBTdHJpbmcgdGFyZ2V0VXJsID0gcmVzb2x2ZVRhcmdldFVybCh2aWV3LCB0YXJnZXQpOworICAgICAgICBpZiAodGFyZ2V0VXJsICE9IG51bGwpIHsKKyAgICAgICAgICBlbnRyeS5wdXQoInRhcmdldFVybCIsIHRhcmdldFVybCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVudHJpZXMuYWRkKGVudHJ5KTsKKyAgICB9CisKKyAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGRhdGEgPSBNYXBzLm5ld0hhc2hNYXBXaXRoRXhwZWN0ZWRTaXplKDMpOworICAgIGRhdGEucHV0KCJzaGEiLCB0cmVlSWQubmFtZSgpKTsKKyAgICBkYXRhLnB1dCgiZW50cmllcyIsIGVudHJpZXMpOworCisgICAgaWYgKHZpZXcuZ2V0VHlwZSgpID09IEdpdGlsZXNWaWV3LlR5cGUuUEFUSAorICAgICAgICAmJiB2aWV3LmdldFJldmlzaW9uKCkuZ2V0UGVlbGVkVHlwZSgpID09IE9CSl9DT01NSVQpIHsKKyAgICAgIGRhdGEucHV0KCJsb2dVcmwiLCBHaXRpbGVzVmlldy5sb2coKS5jb3B5RnJvbSh2aWV3KS50b1VybCgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gZGF0YTsKKyAgfQorCisgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IHRvU295RGF0YShPYmplY3RJZCB0cmVlSWQpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsocncuZ2V0T2JqZWN0UmVhZGVyKCkpOworICAgIHR3LmFkZFRyZWUodHJlZUlkKTsKKyAgICB0dy5zZXRSZWN1cnNpdmUoZmFsc2UpOworICAgIHJldHVybiB0b1NveURhdGEodHJlZUlkLCB0dyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9WaWV3RmlsdGVyLmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvVmlld0ZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NzRiMWQKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvVmlld0ZpbHRlci5qYXZhCkBAIC0wLDAgKzEsMTYwIEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTk9UX0ZPVU5EOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci5TZXJ2bGV0VXRpbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci5nbHVlLldyYXBwZWRSZXF1ZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ2hhaW47CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKKy8qKiBGaWx0ZXIgdG8gcGFyc2UgVVJMcyBhbmQgY29udmVydCB0aGVtIHRvIHtAbGluayBHaXRpbGVzVmlld31zLiAqLworcHVibGljIGNsYXNzIFZpZXdGaWx0ZXIgZXh0ZW5kcyBBYnN0cmFjdEh0dHBGaWx0ZXIgeworICAvLyBUT0RPKGRib3Jvd2l0eik6IE1ha2UgdGhpcyBwdWJsaWMgaW4gSkdpdCAob3IgaW1wbGVtZW50IGdldFJlZ2V4R3JvdXAKKyAgLy8gdXBzdHJlYW0pLgorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVHRVhfR1JPVVBTX0FUVFJJQlVURSA9CisgICAgICAib3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci5nbHVlLk1ldGFTZXJ2bGV0LnNlcnZlUmVnZXgiOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXX0FUVElSQlVURSA9IFZpZXdGaWx0ZXIuY2xhc3MuZ2V0TmFtZSgpICsgIi9WaWV3IjsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ01EX0FVVE8gPSAiKyI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTURfRElGRiA9ICIrZGlmZiI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTURfTE9HID0gIitsb2ciOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ01EX1NIT1cgPSAiK3Nob3ciOworCisgIHB1YmxpYyBzdGF0aWMgR2l0aWxlc1ZpZXcgZ2V0VmlldyhIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisgICAgcmV0dXJuIChHaXRpbGVzVmlldykgcmVxLmdldEF0dHJpYnV0ZShWSUVXX0FUVElSQlVURSk7CisgIH0KKworICBzdGF0aWMgU3RyaW5nIGdldFJlZ2V4R3JvdXAoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgaW50IGdyb3VwSWQpIHsKKyAgICBXcmFwcGVkUmVxdWVzdFtdIGdyb3VwcyA9IChXcmFwcGVkUmVxdWVzdFtdKSByZXEuZ2V0QXR0cmlidXRlKFJFR0VYX0dST1VQU19BVFRSSUJVVEUpOworICAgIHJldHVybiBjaGVja05vdE51bGwoZ3JvdXBzKVtncm91cElkXS5nZXRQYXRoSW5mbygpOworICB9CisKKyAgc3RhdGljIHZvaWQgc2V0VmlldyhIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBHaXRpbGVzVmlldyB2aWV3KSB7CisgICAgcmVxLnNldEF0dHJpYnV0ZShWSUVXX0FUVElSQlVURSwgdmlldyk7CisgIH0KKworICBzdGF0aWMgU3RyaW5nIHRyaW1MZWFkaW5nU2xhc2goU3RyaW5nIHN0cikgeworICAgIGNoZWNrQXJndW1lbnQoc3RyLnN0YXJ0c1dpdGgoIi8iKSwgImV4cGVjdGVkIHN0cmluZyBzdGFydGluZyB3aXRoIGEgc2xhc2g6ICVzIiwgc3RyKTsKKyAgICByZXR1cm4gc3RyLnN1YnN0cmluZygxKTsKKyAgfQorCisgIHByaXZhdGUgZmluYWwgR2l0aWxlc1VybHMgdXJsczsKKyAgcHJpdmF0ZSBmaW5hbCBHaXRpbGVzQWNjZXNzLkZhY3RvcnkgYWNjZXNzRmFjdG9yeTsKKyAgcHJpdmF0ZSBmaW5hbCBWaXNpYmlsaXR5Q2FjaGUgdmlzaWJpbGl0eUNhY2hlOworCisgIHB1YmxpYyBWaWV3RmlsdGVyKEdpdGlsZXNBY2Nlc3MuRmFjdG9yeSBhY2Nlc3NGYWN0b3J5LCBHaXRpbGVzVXJscyB1cmxzLAorICAgICAgVmlzaWJpbGl0eUNhY2hlIHZpc2liaWxpdHlDYWNoZSkgeworICAgIHRoaXMudXJscyA9IGNoZWNrTm90TnVsbCh1cmxzLCAidXJscyIpOworICAgIHRoaXMuYWNjZXNzRmFjdG9yeSA9IGNoZWNrTm90TnVsbChhY2Nlc3NGYWN0b3J5LCAiYWNjZXNzRmFjdG9yeSIpOworICAgIHRoaXMudmlzaWJpbGl0eUNhY2hlID0gY2hlY2tOb3ROdWxsKHZpc2liaWxpdHlDYWNoZSwgInZpc2liaWxpdHlDYWNoZSIpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGRvRmlsdGVyKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzLCBGaWx0ZXJDaGFpbiBjaGFpbikKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgR2l0aWxlc1ZpZXcuQnVpbGRlciB2aWV3ID0gcGFyc2UocmVxKTsKKyAgICBpZiAodmlldyA9PSBudWxsKSB7CisgICAgICByZXMuc2V0U3RhdHVzKFNDX05PVF9GT1VORCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIE1hcDxTdHJpbmcsIFN0cmluZ1tdPiBwYXJhbXMgPSByZXEuZ2V0UGFyYW1ldGVyTWFwKCk7CisgICAgdmlldy5zZXRIb3N0TmFtZSh1cmxzLmdldEhvc3ROYW1lKHJlcSkpCisgICAgICAgIC5zZXRTZXJ2bGV0UGF0aChyZXEuZ2V0Q29udGV4dFBhdGgoKSArIHJlcS5nZXRTZXJ2bGV0UGF0aCgpKQorICAgICAgICAucHV0QWxsUGFyYW1zKHBhcmFtcyk7CisgICAgc2V0VmlldyhyZXEsIHZpZXcuYnVpbGQoKSk7CisgICAgdHJ5IHsKKyAgICAgIGNoYWluLmRvRmlsdGVyKHJlcSwgcmVzKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgcmVxLnJlbW92ZUF0dHJpYnV0ZShWSUVXX0FUVElSQlVURSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBHaXRpbGVzVmlldy5CdWlsZGVyIHBhcnNlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgU3RyaW5nIHJlcG9OYW1lID0gdHJpbUxlYWRpbmdTbGFzaChnZXRSZWdleEdyb3VwKHJlcSwgMSkpOworICAgIFN0cmluZyBjb21tYW5kID0gZ2V0UmVnZXhHcm91cChyZXEsIDIpOworICAgIFN0cmluZyBwYXRoID0gZ2V0UmVnZXhHcm91cChyZXEsIDMpOworCisgICAgLy8gTm9uLXBhdGggY2FzZXMuCisgICAgaWYgKHJlcG9OYW1lLmlzRW1wdHkoKSkgeworICAgICAgcmV0dXJuIEdpdGlsZXNWaWV3Lmhvc3RJbmRleCgpOworICAgIH0gZWxzZSBpZiAoY29tbWFuZC5pc0VtcHR5KCkpIHsKKyAgICAgIHJldHVybiBHaXRpbGVzVmlldy5yZXBvc2l0b3J5SW5kZXgoKS5zZXRSZXBvc2l0b3J5TmFtZShyZXBvTmFtZSk7CisgICAgfSBlbHNlIGlmIChwYXRoLmlzRW1wdHkoKSkgeworICAgICAgcmV0dXJuIG51bGw7IC8vIENvbW1hbmQgYnV0IG5vIHBhdGguCisgICAgfQorCisgICAgcGF0aCA9IHRyaW1MZWFkaW5nU2xhc2gocGF0aCk7CisgICAgUmV2aXNpb25QYXJzZXIgcmV2UGFyc2VyID0gbmV3IFJldmlzaW9uUGFyc2VyKAorICAgICAgICBTZXJ2bGV0VXRpbHMuZ2V0UmVwb3NpdG9yeShyZXEpLCBhY2Nlc3NGYWN0b3J5LmZvclJlcXVlc3QocmVxKSwgdmlzaWJpbGl0eUNhY2hlKTsKKyAgICBSZXZpc2lvblBhcnNlci5SZXN1bHQgcmVzdWx0ID0gcmV2UGFyc2VyLnBhcnNlKHBhdGgpOworICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZyhyZXN1bHQuZ2V0UGF0aFN0YXJ0KCkpOworCisgICAgY29tbWFuZCA9IGdldENvbW1hbmQoY29tbWFuZCwgcmVzdWx0LCBwYXRoKTsKKyAgICBHaXRpbGVzVmlldy5CdWlsZGVyIHZpZXc7CisgICAgaWYgKENNRF9MT0cuZXF1YWxzKGNvbW1hbmQpKSB7CisgICAgICB2aWV3ID0gR2l0aWxlc1ZpZXcubG9nKCkuc2V0VHJlZVBhdGgocGF0aCk7CisgICAgfSBlbHNlIGlmIChDTURfU0hPVy5lcXVhbHMoY29tbWFuZCkpIHsKKyAgICAgIGlmIChwYXRoLmlzRW1wdHkoKSkgeworICAgICAgICB2aWV3ID0gR2l0aWxlc1ZpZXcucmV2aXNpb24oKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZpZXcgPSBHaXRpbGVzVmlldy5wYXRoKCkuc2V0VHJlZVBhdGgocGF0aCk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChDTURfRElGRi5lcXVhbHMoY29tbWFuZCkpIHsKKyAgICAgIHZpZXcgPSBHaXRpbGVzVmlldy5kaWZmKCkuc2V0VHJlZVBhdGgocGF0aCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBudWxsOyAvLyBCYWQgY29tbWFuZC4KKyAgICB9CisgICAgaWYgKHJlc3VsdC5nZXRPbGRSZXZpc2lvbigpICE9IG51bGwpIHsgLy8gTWF5IGJlIE5VTEwuCisgICAgICB2aWV3LnNldE9sZFJldmlzaW9uKHJlc3VsdC5nZXRPbGRSZXZpc2lvbigpKTsKKyAgICB9CisgICAgdmlldy5zZXRSZXBvc2l0b3J5TmFtZShyZXBvTmFtZSkKKyAgICAgICAgLnNldFJldmlzaW9uKHJlc3VsdC5nZXRSZXZpc2lvbigpKTsKKyAgICByZXR1cm4gdmlldzsKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIGdldENvbW1hbmQoU3RyaW5nIGNvbW1hbmQsIFJldmlzaW9uUGFyc2VyLlJlc3VsdCByZXN1bHQsIFN0cmluZyBwYXRoKSB7CisgICAgLy8gTm90ZTogaWYgeW91IGNoYW5nZSB0aGUgbWFwcGluZyBmb3IgKywgbWFrZSBzdXJlIHRvIGNoYW5nZQorICAgIC8vIEdpdGlsZXNWaWV3LnRvVXJsKCkgY29ycmVzcG9uZGluZ2x5LgorICAgIGlmICghQ01EX0FVVE8uZXF1YWxzKGNvbW1hbmQpKSB7CisgICAgICByZXR1cm4gY29tbWFuZDsKKyAgICB9IGVsc2UgaWYgKHJlc3VsdC5nZXRPbGRSZXZpc2lvbigpICE9IG51bGwpIHsKKyAgICAgIHJldHVybiBDTURfRElGRjsKKyAgICB9CisgICAgUmV2aXNpb24gcmV2ID0gcmVzdWx0LmdldFJldmlzaW9uKCk7CisgICAgaWYgKHJldi5nZXRQZWVsZWRUeXBlKCkgIT0gQ29uc3RhbnRzLk9CSl9DT01NSVQKKyAgICAgICAgfHwgIXBhdGguaXNFbXB0eSgpCisgICAgICAgIHx8IHJlc3VsdC5nZXRSZXZpc2lvbigpLm5hbWVJc0lkKCkpIHsKKyAgICAgIHJldHVybiBDTURfU0hPVzsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIENNRF9MT0c7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvVmlzaWJpbGl0eUNhY2hlLmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvVmlzaWJpbGl0eUNhY2hlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI5NjlkMQotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9WaXNpYmlsaXR5Q2FjaGUuamF2YQpAQCAtMCwwICsxLDE4OSBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVkaWNhdGVzLm5vdDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5Db2xsZWN0aW9uczIuZmlsdGVyOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlZGljYXRlOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuVGhyb3dhYmxlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jYWNoZS5DYWNoZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jYWNoZS5DYWNoZUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5JbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLk1pc3NpbmdPYmplY3RFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZEYXRhYmFzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZDb21taXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldlNvcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldldhbGs7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworLyoqIENhY2hlIG9mIHBlci11c2VyIG9iamVjdCB2aXNpYmlsaXR5LiAqLworcHVibGljIGNsYXNzIFZpc2liaWxpdHlDYWNoZSB7CisgIHByaXZhdGUgc3RhdGljIGNsYXNzIEtleSB7CisgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgdXNlcjsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyByZXBvc2l0b3J5TmFtZTsKKyAgICBwcml2YXRlIGZpbmFsIE9iamVjdElkIG9iamVjdElkOworCisgICAgcHJpdmF0ZSBLZXkoT2JqZWN0IHVzZXIsIFN0cmluZyByZXBvc2l0b3J5TmFtZSwgT2JqZWN0SWQgb2JqZWN0SWQpIHsKKyAgICAgIHRoaXMudXNlciA9IGNoZWNrTm90TnVsbCh1c2VyLCAidXNlciIpOworICAgICAgdGhpcy5yZXBvc2l0b3J5TmFtZSA9IGNoZWNrTm90TnVsbChyZXBvc2l0b3J5TmFtZSwgInJlcG9zaXRvcnlOYW1lIik7CisgICAgICB0aGlzLm9iamVjdElkID0gY2hlY2tOb3ROdWxsKG9iamVjdElkLCAib2JqZWN0SWQiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgS2V5KSB7CisgICAgICAgIEtleSBrID0gKEtleSkgbzsKKyAgICAgICAgcmV0dXJuIE9iamVjdHMuZXF1YWwodXNlciwgay51c2VyKQorICAgICAgICAgICAgJiYgT2JqZWN0cy5lcXVhbChyZXBvc2l0b3J5TmFtZSwgay5yZXBvc2l0b3J5TmFtZSkKKyAgICAgICAgICAgICYmIE9iamVjdHMuZXF1YWwob2JqZWN0SWQsIGsub2JqZWN0SWQpOworICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICByZXR1cm4gT2JqZWN0cy5oYXNoQ29kZSh1c2VyLCByZXBvc2l0b3J5TmFtZSwgb2JqZWN0SWQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICByZXR1cm4gT2JqZWN0cy50b1N0cmluZ0hlbHBlcih0aGlzKQorICAgICAgICAuYWRkKCJ1c2VyIiwgdXNlcikKKyAgICAgICAgLmFkZCgicmVwb3NpdG9yeU5hbWUiLCByZXBvc2l0b3J5TmFtZSkKKyAgICAgICAgLmFkZCgib2JqZWN0SWQiLCBvYmplY3RJZCkKKyAgICAgICAgLnRvU3RyaW5nKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBDYWNoZTxLZXksIEJvb2xlYW4+IGNhY2hlOworICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gdG9wb1NvcnQ7CisKKyAgcHVibGljIHN0YXRpYyBDYWNoZUJ1aWxkZXI8T2JqZWN0LCBPYmplY3Q+IG5ld0J1aWxkZXIoKSB7CisgICAgcmV0dXJuIENhY2hlQnVpbGRlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgLm1heGltdW1TaXplKDEgPDwgMTApCisgICAgICAgIC5leHBpcmVBZnRlcldyaXRlKDMwLCBUaW1lVW5pdC5NSU5VVEVTKTsKKyAgfQorCisgIHB1YmxpYyBWaXNpYmlsaXR5Q2FjaGUoYm9vbGVhbiB0b3BvU29ydCkgeworICAgIHRoaXModG9wb1NvcnQsIG5ld0J1aWxkZXIoKSk7CisgIH0KKworICBwdWJsaWMgVmlzaWJpbGl0eUNhY2hlKGJvb2xlYW4gdG9wb1NvcnQsIENhY2hlQnVpbGRlcjxPYmplY3QsIE9iamVjdD4gYnVpbGRlcikgeworICAgIHRoaXMuY2FjaGUgPSBidWlsZGVyLmJ1aWxkKCk7CisgICAgdGhpcy50b3BvU29ydCA9IHRvcG9Tb3J0OworICB9CisKKyAgcHVibGljIENhY2hlPD8sIEJvb2xlYW4+IGdldENhY2hlKCkgeworICAgIHJldHVybiBjYWNoZTsKKyAgfQorCisgIGJvb2xlYW4gaXNWaXNpYmxlKGZpbmFsIFJlcG9zaXRvcnkgcmVwbywgZmluYWwgUmV2V2FsayB3YWxrLCBHaXRpbGVzQWNjZXNzIGFjY2VzcywKKyAgICAgIGZpbmFsIE9iamVjdElkIGlkKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICByZXR1cm4gY2FjaGUuZ2V0KAorICAgICAgICAgIG5ldyBLZXkoYWNjZXNzLmdldFVzZXJLZXkoKSwgYWNjZXNzLmdldFJlcG9zaXRvcnlOYW1lKCksIGlkKSwKKyAgICAgICAgICBuZXcgQ2FsbGFibGU8Qm9vbGVhbj4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBCb29sZWFuIGNhbGwoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICByZXR1cm4gaXNWaXNpYmxlKHJlcG8sIHdhbGssIGlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9KTsKKyAgICB9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgeworICAgICAgVGhyb3dhYmxlcy5wcm9wYWdhdGVJZkluc3RhbmNlT2YoZS5nZXRDYXVzZSgpLCBJT0V4Y2VwdGlvbi5jbGFzcyk7CisgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oZSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGlzVmlzaWJsZShSZXBvc2l0b3J5IHJlcG8sIFJldldhbGsgd2FsaywgT2JqZWN0SWQgaWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgUmV2Q29tbWl0IGNvbW1pdDsKKyAgICB0cnkgeworICAgICAgY29tbWl0ID0gd2Fsay5wYXJzZUNvbW1pdChpZCk7CisgICAgfSBjYXRjaCAoSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiBlKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gSWYgYW55IHJlZmVyZW5jZSBkaXJlY3RseSBwb2ludHMgYXQgdGhlIHJlcXVlc3RlZCBvYmplY3QsIHBlcm1pdCBkaXNwbGF5LgorICAgIC8vIENvbW1vbiBmb3IgZGlzcGxheXMgb2YgcGVuZGluZyBwYXRjaCBzZXRzIGluIEdlcnJpdCBDb2RlIFJldmlldywgb3IKKyAgICAvLyBib29rbWFya3MgdG8gdGhlIGNvbW1pdCBhIHRhZyBwb2ludHMgYXQuCisgICAgQ29sbGVjdGlvbjxSZWY+IGFsbFJlZnMgPSByZXBvLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcyhSZWZEYXRhYmFzZS5BTEwpLnZhbHVlcygpOworICAgIGZvciAoUmVmIHJlZiA6IGFsbFJlZnMpIHsKKyAgICAgIHJlZiA9IHJlcG8uZ2V0UmVmRGF0YWJhc2UoKS5wZWVsKHJlZik7CisgICAgICBpZiAoaWQuZXF1YWxzKHJlZi5nZXRPYmplY3RJZCgpKSB8fCBpZC5lcXVhbHMocmVmLmdldFBlZWxlZE9iamVjdElkKCkpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKworICAgIC8vIENoZWNrIGhlYWRzIGZpcnN0IHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgbW9zdCByZXF1ZXN0cyBhcmUgZm9yIHJlZnMKKyAgICAvLyBjbG9zZSB0byBhIGhlYWQuIFRhZ3MgdGVuZCB0byBiZSBtdWNoIGZ1cnRoZXIgYmFjayBpbiBoaXN0b3J5IGFuZCBqdXN0CisgICAgLy8gY2x1dHRlciB1cCB0aGUgcHJpb3JpdHkgcXVldWUgaW4gdGhlIGNvbW1vbiBjYXNlLgorICAgIHJldHVybiBpc1JlYWNoYWJsZUZyb20od2FsaywgY29tbWl0LCBmaWx0ZXIoYWxsUmVmcywgcmVmU3RhcnRzV2l0aChDb25zdGFudHMuUl9IRUFEUykpKQorICAgICAgICB8fCBpc1JlYWNoYWJsZUZyb20od2FsaywgY29tbWl0LCBmaWx0ZXIoYWxsUmVmcywgcmVmU3RhcnRzV2l0aChDb25zdGFudHMuUl9UQUdTKSkpCisgICAgICAgIHx8IGlzUmVhY2hhYmxlRnJvbSh3YWxrLCBjb21taXQsIGZpbHRlcihhbGxSZWZzLCBub3QocmVmU3RhcnRzV2l0aCgicmVmcy9jaGFuZ2VzLyIpKSkpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgUHJlZGljYXRlPFJlZj4gcmVmU3RhcnRzV2l0aChmaW5hbCBTdHJpbmcgcHJlZml4KSB7CisgICAgcmV0dXJuIG5ldyBQcmVkaWNhdGU8UmVmPigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIGJvb2xlYW4gYXBwbHkoUmVmIHJlZikgeworICAgICAgICByZXR1cm4gcmVmLmdldE5hbWUoKS5zdGFydHNXaXRoKHByZWZpeCk7CisgICAgICB9CisgICAgfTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBpc1JlYWNoYWJsZUZyb20oUmV2V2FsayB3YWxrLCBSZXZDb21taXQgY29tbWl0LCBDb2xsZWN0aW9uPFJlZj4gcmVmcykKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgd2Fsay5yZXNldCgpOworICAgIGlmICh0b3BvU29ydCkgeworICAgICAgd2Fsay5zb3J0KFJldlNvcnQuVE9QTyk7CisgICAgfQorICAgIHdhbGsubWFya1N0YXJ0KGNvbW1pdCk7CisgICAgZm9yIChSZWYgcmVmIDogcmVmcykgeworICAgICAgaWYgKHJlZi5nZXRQZWVsZWRPYmplY3RJZCgpICE9IG51bGwpIHsKKyAgICAgICAgbWFya1VuaW50ZXJlc3Rpbmcod2FsaywgcmVmLmdldFBlZWxlZE9iamVjdElkKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWFya1VuaW50ZXJlc3Rpbmcod2FsaywgcmVmLmdldE9iamVjdElkKCkpOworICAgICAgfQorICAgIH0KKyAgICAvLyBJZiB0aGUgY29tbWl0IGlzIHJlYWNoYWJsZSBmcm9tIGFueSBicmFuY2ggaGVhZCwgaXQgd2lsbCBhcHBlYXIgdG8gYmUKKyAgICAvLyB1bmludGVyZXN0aW5nIHRvIHRoZSBSZXZXYWxrIGFuZCBubyBvdXRwdXQgd2lsbCBiZSBwcm9kdWNlZC4KKyAgICByZXR1cm4gd2Fsay5uZXh0KCkgPT0gbnVsbDsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgbWFya1VuaW50ZXJlc3RpbmcoUmV2V2FsayB3YWxrLCBPYmplY3RJZCBpZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpZiAoaWQgPT0gbnVsbCkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICB0cnkgeworICAgICAgd2Fsay5tYXJrVW5pbnRlcmVzdGluZyh3YWxrLnBhcnNlQ29tbWl0KGlkKSk7CisgICAgfSBjYXRjaCAoSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBEbyBub3RoaW5nLCBkb2Vzbid0IGFmZmVjdCByZWFjaGFiaWxpdHkuCisgICAgfSBjYXRjaCAoTWlzc2luZ09iamVjdEV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBEbyBub3RoaW5nLCBkb2Vzbid0IGFmZmVjdCByZWFjaGFiaWxpdHkuCisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvZ2l0aWxlcy5jc3MgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvZ2l0aWxlcy5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM1NzUxOQotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9naXRpbGVzLmNzcwpAQCAtMCwwICsxLDMxOSBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qIENvbW1vbiBzdHlsZXMgYW5kIGRlZmluaXRpb25zLiAqLworCitoMSB7CisgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgdG9wOiAwOworICB3aGl0ZS1zcGFjZTogbm93cmFwOworICBtYXJnaW4tdG9wOiA1cHg7Cit9CisubWVudSB7CisgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgdG9wOiAwOworICByaWdodDogMDsKKyAgZm9udC1zaXplOiAxMHB0OworICB3aGl0ZS1zcGFjZTogbm93cmFwOworICB0ZXh0LWFsaWduOiByaWdodDsKKyAgbWFyZ2luLXRvcDogNXB4OworICBtYXJnaW4tcmlnaHQ6IDVweDsKK30KKy5tZW51IC5lbnRyeSB7CisgIHBhZGRpbmctcmlnaHQ6IDVweDsKKyAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgYmxhY2s7CisgIG1hcmdpbi1yaWdodDogMDsKK30KK2gyIHsKKyAgbWFyZ2luLXRvcDogM2VtOworfQorLmJyZWFkY3J1bWJzIHsKKyAgbWFyZ2luLXRvcDogM2VtOworICBmb250LXNpemU6IDE1MCU7CisgIGJvcmRlci1ib3R0b206ICNkZGQgc29saWQgMXB4OyAvKiBCT1JERVIgKi8KK30KK3RhYmxlLmxpc3QgeworICBtYXJnaW4tdG9wOiAxZW07CisgIHdpZHRoOiA5MCU7Cit9Cit0YWJsZS5saXN0IHRyLm5vLWhvdmVyOmhvdmVyIHsKKyAgYmFja2dyb3VuZDogI2ZmZjsKK30KK3RhYmxlLmxpc3QgdHI6aG92ZXIsIG9sLmxpc3QgbGk6aG92ZXIsIHByZS5wcmV0dHlwcmludCBsaTpob3ZlciB7CisgIGJhY2tncm91bmQ6ICNlZWU7IC8qIEhPVkVSX0JBQ0tHUk9VTkQgKi8KK30KK3RhYmxlLmxpc3QgdGQgeworICB3aGl0ZS1zcGFjZTogbm93cmFwOworICBwYWRkaW5nLXRvcDogMC4yNWVtOworICBwYWRkaW5nLWJvdHRvbTogMC4yNWVtOworfQorLmxvZy1saW5rIHsKKyAgbWFyZ2luLWxlZnQ6IDAuNWVtCit9CisKKworLyogU3R5bGVzIGZvciB0aGUgaG9zdCBpbmRleCBwYWdlLiAqLworCisuaW5zdHJ1Y3Rpb25zIHsKKyAgd2lkdGg6IDQ1ZW07CisgIG1hcmdpbi1sZWZ0OiAxZW07CisgIG1hcmdpbi1yaWdodDogMWVtOworICBib3JkZXItdG9wOiAxcHggc29saWQgIzU1NTsKKyAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM1NTU7CisgIGNvbG9yOiAjNTU1OworfQorLmluc3RydWN0aW9ucyBwcmUgeworICBkaXNwbGF5OiBibG9jazsKKyAgbWFyZ2luLWxlZnQ6IDFlbTsKKyAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjMDYwOworICBwYWRkaW5nLWxlZnQ6IDFlbTsKKyAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKK30KKy5mb290ZXIgeworICB0ZXh0LWFsaWduOiByaWdodDsKKyAgYmFja2dyb3VuZDogI2VlZTsKKyAgcGFkZGluZy1yaWdodDogMWVtOworICB3aWR0aDogOTAlOworfQorLmZvb3RlciBhIHsKKyAgY29sb3I6IGJsYWNrOworICBmb250LXdlaWdodDogYm9sZDsKKyAgZm9udC1zaXplOiA3MCU7Cit9CisKKworLyogU3R5bGVzIGZvciB0aGUgcmVwb3NpdG9yeSBpbmRleCBwYWdlLiAqLworCisucmVwb3NpdG9yeS1kZXNjcmlwdGlvbiB7CisgIGJvcmRlci1ib3R0b206ICNkZGQgc29saWQgMXB4OyAvKiBCT1JERVIgKi8KKyAgcGFkZGluZy1ib3R0b206IDVweDsgLyogVlBBRERJTkcgKi8KK30KKy5yZXBvc2l0b3J5LXJlZnMgeworICB3aWR0aDogNDUwcHg7Cit9CisucmVwb3NpdG9yeS1icmFuY2hlcyB7CisgIGZsb2F0OiBsZWZ0OworICB3aWR0aDogMjAwcHg7Cit9CisucmVwb3NpdG9yeS10YWdzIHsKKyAgZmxvYXQ6IHJpZ2h0OworICB3aWR0aDogMjUwcHg7Cit9CisuY2xvbmUtbGluZSB7CisgIGJhY2tncm91bmQtY29sb3I6ICNlNWVjZjk7IC8qIEJPWF9CQUNLR1JPVU5EICovCisgIGJvcmRlcjogbm9uZTsKKyAgbWFyZ2luOiA1cHggLyogVlBBRERJTkcgKi8gMCAwIDA7CisgIHBhZGRpbmc6IDVweCAyZW07IC8qIFBBRERJTkcgKi8KKyAgZm9udC1zaXplOiA5cHQ7Cit9CisKKworLyogU3R5bGVzIGZvciB0aGUgb2JqZWN0IGRldGFpbCB0ZW1wbGF0ZXMuICovCisKKy5zaGExIHsKKyAgY29sb3I6ICM2NjY7CisgIGZvbnQtc2l6ZTogOXB0OworfQorZGl2LnNoYTEgeworICBwYWRkaW5nLXRvcDogNXB4OyAvKiBWUEFERElORyAqLworfQorCisuZ2l0LWNvbW1pdCwgLmdpdC10YWcgeworICBmb250LXNpemU6IDlwdDsKKyAgYm9yZGVyLWJvdHRvbTogI2RkZCBzb2xpZCAxcHg7IC8qIEJPUkRFUiAqLworICBwYWRkaW5nOiA1cHggMmVtOyAvKiBQQURESU5HICovCit9CisuZ2l0LWNvbW1pdCB0YWJsZSwgLmdpdC10YWcgdGFibGUgeworICBtYXJnaW46IDA7Cit9CisuZ2l0LWNvbW1pdCB0YWJsZSB0aCwgLmdpdC10YWcgdGFibGUgdGggeworICB0ZXh0LWFsaWduOiByaWdodDsKK30KK3ByZS5jb21taXQtbWVzc2FnZSwgcHJlLnRhZy1tZXNzYWdlIHsKKyAgYm9yZGVyLWJvdHRvbTogI2RkZCBzb2xpZCAxcHg7IC8qIEJPUkRFUiAqLworICBwYWRkaW5nOiA1cHggMmVtOyAvKiBQQURESU5HICovCisgIGNvbG9yOiAjMDAwOworICBmb250LXNpemU6IDlwdDsKKyAgbWFyZ2luOiAwOworfQorCit1bC5kaWZmLXRyZWUgeworICBmb250LXNpemU6IDlwdDsKKyAgbGlzdC1zdHlsZS10eXBlOiBub25lOworICBtYXJnaW46IDA7CisgIHBhZGRpbmc6IDVweCAyZW07IC8qIFBBRERJTkcgKi8KK30KK3VsLmRpZmYtdHJlZSAuYWRkIHsKKyAgY29sb3I6ICMwNjA7Cit9Cit1bC5kaWZmLXRyZWUgLmRlbGV0ZSB7CisgIGNvbG9yOiAjNjAwOworfQordWwuZGlmZi10cmVlIC5yZW5hbWUsIHVsLmRpZmYtdHJlZSAuY29weSB7CisgIGNvbG9yOiAjMDA2OworfQorc3Bhbi5kaWZmLWxpbmssIHVsLmRpZmYtdHJlZSAuYWRkLCB1bC5kaWZmLXRyZWUgLm1vZGlmeSwgdWwuZGlmZi10cmVlIC5kZWxldGUsCisgICAgdWwuZGlmZi10cmVlIC5yZW5hbWUsIHVsLmRpZmYtdHJlZSAuY29weSB7CisgIG1hcmdpbi1sZWZ0OiAwLjVlbTsKK30KKy5kaWZmLXN1bW1hcnkgeworICBmb250LXNpemU6IDlwdDsKKyAgZm9udC1zdHlsZTogaXRhbGljOworICBwYWRkaW5nOiA1cHggMmVtOyAvKiBQQURESU5HICovCisgIGJvcmRlci1ib3R0b206ICNkZGQgc29saWQgMXB4OyAvKiBCT1JERVIgKi8KK30KKworb2wuZmlsZXMgeworICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7CisgIG1hcmdpbi1sZWZ0OiAxZW07CisgIGZvbnQtc2l6ZTogMTBwdDsKKyAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKK30KKworLyogVHJlZSBpY29ucyBhcmUgdGFrZW4gZnJvbSB0aGUgcHVibGljIGRvbWFpbiBBcGFjaGUgc3RhbmRhcmQgaWNvbnM6CisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvaWNvbnMvICovCitvbC5maWxlcyBsaS5naXQtdHJlZXsKKyAgLyogc21hbGwvZm9sZGVyLnBuZyAqLworICBsaXN0LXN0eWxlLWltYWdlOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4LzloQUFBQUJtSkxSMFFBQUFBQUFBRDVRN3QvQUFBQUNYQklXWE1BQUFCSUFBQUFTQUJHeVdzK0FBQUFDWFp3UVdjQUFBQVFBQUFBRUFCY3hxM0RBQUFBK2tsRVFWUTR5NjNUTVd2Q1FCakc4ZjhyK1JvdVJTZTdPTmNodUNUUXNaUzZGTkxCU1FyZGkxUG1GaGNuaHdwT1Vqb0szaUl2UldjZG5QMHExNkZjU09TaWpmU1pqaHQrUE55OXI2Z3FBR0VZV2dCVkZTcEVBTnRxMW5sN1RRQ0lrNVE4ZEE0T0FQWm14SFgwQXNCeU9pdzBXazZIUkowMjB2QkRBbGg3K01vdUhPUWF1VVNkTm1hOUpVN1NBaEljVjlxYmtSY3k2NjMzRFFKS1VnYjlHVGlHNU9vdWU1OThhdWNBQVBPOUErRGpjM1VaY0NyL0EvU2UzN09hbFFGVmxmbGlRNXlrRjBFMStKMnVLdENnLzJqZHVmQ04rZm1mTHpZODNON3dkTjh0UmNhVG1Yam53QWVWUmR3Nm40cGJMSUJXc3c3QWVESVRnQi9PVEhFZkYzRzZvQUFBQUFCSlJVNUVya0pnZ2c9PSk7Cit9CitvbC5maWxlcyBsaS5zeW1saW5reworICAvKiBzbWFsbC9mb3J3YXJkLnBuZyAqLworICBsaXN0LXN0eWxlLWltYWdlOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FRQUFBQzEramZxQUFBQUFtSkxSMFFBQUtxTkl6SUFBQUFKY0VoWmN3QUFBRWdBQUFCSUFFYkphejRBQUFBSmRuQkJad0FBQUJBQUFBQVFBRnpHcmNNQUFBQ3RTVVJCVkNqUGZaR3hFWU13REVXZmZOVHN3QXBjR3MrUlk0S1V0RFNaZ0liV0pSTndXU0huamliSEN0a2hDeWlGRFlZRStLcmsvMC9TOXhkUFFxNGY0UWZadXVrcEZDNnlJM2pwSXo0VWV4UHV5aUZNcnNNSkRlYkpPY3dieDVXU01sNFFUc3lYcVZrQk5GaWc1QWFnd1UrMWRURUNJNDQ2dW5CTTJnYTduWEpRVmowZVBQV3B4RUFsSGZiUWhmZ2xnMEVueGhWbGFTVUs1cWhnL3BVbTBodEJra0ZQSmFzVi8wakJmd0hzZGtvOWtVQ29Nd0FBQUFCSlJVNUVya0pnZ2c9PSk7Cit9CitvbC5maWxlcyBsaS5yZWd1bGFyLWZpbGV7CisgIC8qIHNtYWxsL3RleHQucG5nICovCisgIGxpc3Qtc3R5bGUtaW1hZ2U6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVFBQUFDMStqZnFBQUFBQW1KTFIwUUFBS3FOSXpJQUFBQUpjRWhaY3dBQUFFZ0FBQUJJQUViSmF6NEFBQUFKZG5CQlp3QUFBQkFBQUFBUUFGekdyY01BQUFDRFNVUkJWQ2pQWXp6QWdCOHdvUXVjK1kvS1p6ejMzeENKZTU1QmttRXBnd2tqSGhNa0dLSlJUTUZRY0o3aE9ZTUpJMElKQ3dNREE0TVZYUG9ZaFAyZmdjRUVXY0U2SkJPT01SeGtaR0JZaldwQ0VKSTBBNFA5L3hkSUd0Qk1lTUhBd0NEQklJR3VJSWdCRlJ6RGJRSW1vSmNKeC9DWjhJbXg5Lzk5RE9GekRLRlFGZ0JqNnlHd2h0RXpPd0FBQUFCSlJVNUVya0pnZ2c9PSkKK30KK29sLmZpbGVzIGxpLmV4ZWN1dGFibGUtZmlsZXsKKyAgLyogc21hbGwvcGF0Y2gucG5nICovCisgIGxpc3Qtc3R5bGUtaW1hZ2U6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVFBQUFDMStqZnFBQUFBQW1KTFIwUUEvNGVQekw4QUFBQUpjRWhaY3dBQUFFZ0FBQUJJQUViSmF6NEFBQUFKZG5CQlp3QUFBQkFBQUFBUUFGekdyY01BQUFDRFNVUkJWQ2pQbFkreERZTXdFRVcvSTRhZ1pZUlFzZ29qa0M0WkF6cDJvak1qdVBRWWp3SkVjdmdTS1YreXpyS2VudjlKLzJiazhoRDVUQ1Jqa2R2VlVLczNsZ0pZbGZVS2J5UkU3Z2JvanJrRXR3T0FKQTE4L1VLQzdIV1lqck1YTFlCSlNRK2xFeW1BcCt4MERIWTZoa2F6R3NmZ3JBbndjMDJicWcwanFmU2V0dzJqN2xjaDdUWnZmUUFBQUNSMFJWaDBZMjl0YldWdWRBQmllU0JOWVhKMGFXNHVTM0poWlcxbGNrQk5ZMmd1VTA1SkxrUmxhQ1BGNlFBQUFBQkpSVTVFcmtKZ2dnPT0pOworfQorb2wuZmlsZXMgbGkuZ2l0bGlua3sKKyAgLyogc21hbGwvY29udGludWVkLnBuZyAqLworICBsaXN0LXN0eWxlLWltYWdlOnVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVFBQUFDMStqZnFBQUFBQW1KTFIwUUFBS3FOSXpJQUFBQUpjRWhaY3dBQUFFZ0FBQUJJQUViSmF6NEFBQUFKZG5CQlp3QUFBQkFBQUFBUUFGekdyY01BQUFDUFNVUkJWQ2pQemRDeGJjTkFGSVBoN3dRdmtUSWpCRWpqMWlzY1hHVVNUWkRHTGpWQ0t1RldDSzVMYy9BS0dvVXBwTnExV2YxOElCNElsdTY1Smk4U21ET3kyem56UWVPZ2lUbUxab1ExVmJXR2tXWXhoMm1rK3ZCZEdoNitYRHpRTE41VUl5YzJkOXZ4K0FkLzRCZE5wVHRIenJtbHUwVWN0Ris3MHJIbTNXZUJOVnpMWG5KekxmYkFLeXo1VFAvcmVrR0s1UHJaZmdBQUFBQkpSVTVFcmtKZ2dnPT0pOworfQorCisKKy8qIFN0eWxlcyBmb3IgdGhlIHBhdGggZGV0YWlsIHBhZ2UuICovCisKKy5zeW1saW5rLWRldGFpbCwgLmdpdGxpbmstZGV0YWlsIHsKKyAgbWFyZ2luLWxlZnQ6IDFlbTsKKyAgY29sb3I6ICM2NjY7CisgIGZvbnQtc3R5bGU6IGl0YWxpYzsKKyAgZm9udC1zaXplOiAxMHB0OworfQorCisKKy8qIFN0eWxlcyBmb3IgdGhlIGxvZyBkZXRhaWwgcGFnZS4gKi8KKworb2wuc2hvcnRsb2cgeworICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7CisgIG1hcmdpbjogMDsKKyAgcGFkZGluZzogNXB4IDJlbTsgLyogUEFERElORyAqLworfQorb2wuc2hvcnRsb2cgbGkgeworICBib3JkZXItYm90dG9tOiAjZGRkIHNvbGlkIDFweDsgLyogQk9SREVSICovCisgIHBhZGRpbmctdG9wOiAycHg7CisgIHBhZGRpbmctYm90dG9tOiAycHg7Cit9CitvbC5zaG9ydGxvZyBsaS5maXJzdCB7CisgIGJvcmRlci10b3A6ICNkZGQgc29saWQgMXB4OyAvKiBCT1JERVIgKi8KK30KK29sLnNob3J0bG9nIGxpOmhvdmVyIHsKKyAgYmFja2dyb3VuZDogI2VlZTsgLyogSE9WRVJfQkFDS0dST1VORCAqLworfQorb2wuc2hvcnRsb2cgLnNoYTEgeworICBmb250LWZhbWlseTogbW9ub3NwYWNlOworfQorLmxvZy1uYXYgeworICBtYXJnaW4tdG9wOiA1cHg7CisgIHRleHQtYWxpZ246IGNlbnRlcjsKK30KKy5hdXRob3IgeworICBwYWRkaW5nLWxlZnQ6IDNweDsKK30KKy50aW1lIHsKKyAgZm9udC1zaXplOiA5cHQ7IC8qIFNIT1JUTE9HX1NNQUxMX0ZPTlRfU0laRSAqLworICBmb250LXN0eWxlOiBpdGFsaWM7Cit9CisuYnJhbmNoLWxhYmVsLCAudGFnLWxhYmVsIHsKKyAgZm9udC1zaXplOiA5cHQ7IC8qIFNIT1JUTE9HX1NNQUxMX0ZPTlRfU0laRSAqLworICBtYXJnaW4tbGVmdDogM3B4OworfQorYS5icmFuY2gtbGFiZWwgeworICBjb2xvcjogI2RkNGIzOTsKK30KK2EudGFnLWxhYmVsIHsKKyAgY29sb3I6ICMwMDk5MzM7Cit9CisKKworLyogU3R5bGVzIGZvciB0aGUgZGlmZiBkZXRhaWwgdGVtcGxhdGUuICovCisKKy5kaWZmLWhlYWRlciB7Cit9CisuZGlmZi1naXQgeworICBjb2xvcjogIzQ0NDsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CithLmRpZmYtZ2l0OmhvdmVyIHsKKyAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorLmRpZmYtaGVhZGVyLCAuZGlmZi11bmlmaWVkIHsKKyAgY29sb3I6ICMwMDA7CisgIGZvbnQtc2l6ZTogOXB0OworICBtYXJnaW46IDA7CisgIHBhZGRpbmctbGVmdDogMmVtOworfQorLmRpZmYtdW5pZmllZCB7CisgIGJvcmRlci1ib3R0b206ICNkZGQgc29saWQgMXB4OyAvKiBCT1JERVIgKi8KK30KKy5kaWZmLXVuaWZpZWQgLmggeworICBjb2xvcjogZGFya2JsdWU7Cit9CisuZGlmZi11bmlmaWVkIC5kIHsKKyAgY29sb3I6IGRhcmtyZWQ7Cit9CisuZGlmZi11bmlmaWVkIC5pIHsKKyAgY29sb3I6IGRhcmtncmVlbjsKK30KKworCisvKiBPdmVycmlkZSBzb21lIHN0eWxlcyBmcm9tIHRoZSBkZWZhdWx0IHByZXR0aWZ5LmNzcy4gKi8KKworLyogTGluZSBudW1iZXJzIG9uIGFsbCBsaW5lcy4gKi8KK2xpLkwwLCBsaS5MMSwgbGkuTDIsIGxpLkwzLCBsaS5MNCwgbGkuTDUsIGxpLkw2LCBsaS5MNywgbGkuTDgsIGxpLkw5IHsKKyAgbGlzdC1zdHlsZS10eXBlOiBkZWNpbWFsOworfQorCisvKiBEaXNhYmxlIGFsdGVybmF0aW5nIGxpbmUgYmFja2dyb3VuZCBjb2xvci4gKi8KK2xpLkwwLCBsaS5MMSwgbGkuTDIsIGxpLkwzLCBsaS5MNCwgbGkuTDUsIGxpLkw2LCBsaS5MNywgbGkuTDgsIGxpLkw5IHsKKyAgYmFja2dyb3VuZDogI2ZmZjsKK30KKworcHJlLmdpdC1ibG9iIHsKKyAgYm9yZGVyLXRvcDogI2RkZCBzb2xpZCAxcHg7IC8qIEJPUkRFUiAqLworICBib3JkZXItYm90dG9tOiAjZGRkIHNvbGlkIDFweDsgLyogQk9SREVSICovCisgIGJvcmRlci1sZWZ0OiBub25lOworICBib3JkZXItcmlnaHQ6IG5vbmU7CisgIHBhZGRpbmctbGVmdDogMWVtOworICBwYWRkaW5nLWJvdHRvbTogNXB4OworICBmb250LWZhbWlseTogbW9ub3NwYWNlOworICBmb250LXNpemU6IDhwdDsKK30KK3ByZS5wcmV0dHlwcmludCBvbCB7CisgIGNvbG9yOiBncmV5OworfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L0NPUFlJTkcgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvQ09QWUlORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2E0MWMwCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L0NPUFlJTkcKQEAgLTAsMCArMSwyMTQgQEAKK2dvb2dsZS1jb2RlLXByZXR0aWZ5IGRvd25sb2FkZWQgZnJvbToKK2h0dHA6Ly9nb29nbGUtY29kZS1wcmV0dGlmeS5nb29nbGVjb2RlLmNvbS9maWxlcy9wcmV0dGlmeS1zbWFsbC0xLUp1bi0yMDExLnRhci5iejIKKworQWxsIGZpbGVzIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgd2l0aCB0aGUgZm9sbG93aW5nIGNvcHlyaWdodHM6CitwcmV0dGlmeS5qczogQ29weXJpZ2h0IChDKSAyMDA2IEdvb2dsZSBJbmMuCitsYW5nLWFwb2xsby5qczogQ29weXJpZ2h0IChDKSAyMDA5IE9ubm8gSG9tbWVzLgorbGFuZy1jbGouanM6ICogQGxpY2Vuc2UgQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuCitsYW5nLWNzcy5qczogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuCitsYW5nLWdvLmpzOiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4KK2xhbmctaHMuanM6IENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLgorbGFuZy1saXNwLmpzOiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlIEluYy4KK2xhbmctbHVhLmpzOiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlIEluYy4KK2xhbmctbWwuanM6IENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUgSW5jLgorbGFuZy1uLmpzOiBDb3B5cmlnaHQgKEMpIDIwMTEgWmltaW4gQS5WLgorbGFuZy1wcm90by5qczogQ29weXJpZ2h0IChDKSAyMDA2IEdvb2dsZSBJbmMuCitsYW5nLXNjYWxhLmpzOiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4KK2xhbmctc3FsLmpzOiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlIEluYy4KK2xhbmctdGV4LmpzOiBDb3B5cmlnaHQgKEMpIDIwMTEgTWFydGluIFMuCitsYW5nLXZiLmpzOiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4KK2xhbmctd2lraS5qczogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuCitsYW5nLXhxLmpzOiBDb3B5cmlnaHQgKEMpIDIwMTEgUGF0cmljayBXaWVkCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKKyAgIENvcHlyaWdodCAyMDExIE1pa2UgU2FtdWVsIGV0IGFsCisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy1hcG9sbG8uanMgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy1hcG9sbG8uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA5OGJhZgotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLWFwb2xsby5qcwpAQCAtMCwwICsxLDIgQEAKK1BSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1siY29tIiwvXiNbXlxuXHJdKi8sbnVsbCwiIyJdLFsicGxuIiwvXltcdFxuXHIgXHhhMF0rLyxudWxsLCJcdFxuXHIgwlx4YTAiXSxbInN0ciIsL14iKD86W14iXFxdfFxcW1xTXHNdKSooPzoifCQpLyxudWxsLCciJ11dLFtbImt3ZCIsL14oPzpBRFN8QUR8QVVHfEJaRnxCWk1GfENBRXxDQUZ8Q0F8Q0NTfENPTXxDU3xEQVN8RENBfERDT018RENTfERET1VCTHxESU18RE9VQkxFfERUQ0J8RFRDRnxEVnxEWENIfEVEUlVQVHxFWFRFTkR8SU5DUnxJTkRFWHxORFh8SU5ISU5UfExYQ0h8TUFTS3xNU0t8TVB8TVNVfE5PT1B8T1ZTS3xRWENIfFJBTkR8UkVBRHxSRUxJTlR8UkVTVU1FfFJFVFVSTnxST1J8UlhPUnxTUVVBUkV8U1V8VENSfFRDQUF8T1ZTS3xUQ0Z8VEN8VFN8V0FORHxXT1J8V1JJVEV8WENIfFhMUXxYWEFMUXxaTHxaUXxBRER8QURafFNVQnxTVVp8TVBZfE1QUnxNUFp8RFZQfENPTXxBQlN8Q0xBfENMWnxMRFF8U1RPfFNUUXxBTFN8TExTfExSU3xUUkF8VFNRfFRNSXxUT1Z8QVhUfFRJWHxETFl8SU5QfE9VVClccy8sCitudWxsXSxbInR5cCIsL14oPzotP0dFTkFEUnw9TUlOVVN8MkJDQURSfFZOfEJPRnxNTXwtPzJDQURSfC0/WzEtNl1ETkFEUnxBRFJFU3xCQkNPTnxbRVNdP0JBTks9P3xCTE9DS3xCTktTVU18RT9DQURSfENPVU5UXCo/fDI/REVDXCo/fC0/RE5DSEFOfC0/RE5QVFJ8RVFVQUxTfEVSQVNFfE1FTU9SWXwyP09DVHxSRU1BRFJ8U0VUTE9DfFNVQlJPfE9SR3xCU1N8QkVTfFNZTnxFUVV8REVGSU5FfEVORClccy8sbnVsbF0sWyJsaXQiLC9eJyg/Oi0qKD86XHd8XFxbIS1+XSkoPzpbXHctXSp8XFxbIS1+XSlbIT0/XT8pPy9dLFsicGxuIiwvXi0qKD86WyEtel18XFxbIS1+XSkoPzpbXHctXSp8XFxbIS1+XSlbIT0/XT8vXSxbInB1biIsL15bXlx3XHRcblxyICInLSk7XFxceGEwXSsvXV0pLFsiYXBvbGxvIiwiYWdjIiwiYWVhIl0pOwpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctY2xqLmpzIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctY2xqLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MmEyMjAKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy1jbGouanMKQEAgLTAsMCArMSwxOCBAQAorLyoKKyBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4KKworIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3ZhciBhPW51bGw7CitQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtbIm9wbiIsL15bKFt7XSsvLGEsIihbeyJdLFsiY2xvIiwvXlspXF19XSsvLGEsIildfSJdLFsiY29tIiwvXjtbXlxuXHJdKi8sYSwiOyJdLFsicGxuIiwvXltcdFxuXHIgXHhhMF0rLyxhLCJcdFxuXHIgXHhhMCJdLFsic3RyIiwvXiIoPzpbXiJcXF18XFxbXFNcc10pKig/OiJ8JCkvLGEsJyInXV0sW1sia3dkIiwvXig/OmRlZnxpZnxkb3xsZXR8cXVvdGV8dmFyfGZufGxvb3B8cmVjdXJ8dGhyb3d8dHJ5fG1vbml0b3ItZW50ZXJ8bW9uaXRvci1leGl0fGRlZm1hY3JvfGRlZm58ZGVmbi18bWFjcm9leHBhbmR8bWFjcm9leHBhbmQtMXxmb3J8ZG9zZXF8ZG9zeW5jfGRvdGltZXN8YW5kfG9yfHdoZW58bm90fGFzc2VydHxkb3RvfHByb3h5fGRlZnN0cnVjdHxmaXJzdHxyZXN0fGNvbnN8ZGVmcHJvdG9jb2x8ZGVmdHlwZXxkZWZyZWNvcmR8cmVpZnl8ZGVmbXVsdGl8ZGVmbWV0aG9kfG1ldGF8d2l0aC1tZXRhfG5zfGluLW5zfGNyZWF0ZS1uc3xpbXBvcnR8aW50ZXJufHJlZmVyfGFsaWFzfG5hbWVzcGFjZXxyZXNvbHZlfHJlZnxkZXJlZnxyZWZzZXR8bmV3fHNldCF8bWVtZm58dG8tYXJyYXl8aW50by1hcnJheXxhc2V0fGdlbi1jbGFzc3xyZWR1Y2V8bWFwfGZpbHRlcnxmaW5kfG5pbD98ZW1wdHk/fGhhc2gtbWFwfGhhc2gtc2V0fHZlY3x2ZWN0b3J8c2VxfGZsYXR0ZW58cmV2ZXJzZXxhc3NvY3xkaXNzb2N8bGlzdHxsaXN0P3xkaXNqfGdldHx1bmlvbnxkaWZmZXJlbmNlfGludGVyc2VjdGlvbnxleHRlbmR8ZXh0ZW5kLXR5cGV8ZXh0ZW5kLXByb3RvY29sfHBybilcYi8sYV0sCitbInR5cCIsL146W1xkQS1aYS16LV0rL11dKSxbImNsaiJdKTsKZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLWNzcy5qcyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLWNzcy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDFlMWY1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctY3NzLmpzCkBAIC0wLDAgKzEsMiBAQAorUFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5jcmVhdGVTaW1wbGVMZXhlcihbWyJwbG4iLC9eW1x0XG5cZlxyIF0rLyxudWxsLCIgXHRcclxuDCJdXSxbWyJzdHIiLC9eIig/OlteXG5cZlxyIlxcXXxcXCg/OlxyXG4/fFxufFxmKXxcXFtcU1xzXSkqIi8sbnVsbF0sWyJzdHIiLC9eJyg/OlteXG5cZlxyJ1xcXXxcXCg/OlxyXG4/fFxufFxmKXxcXFtcU1xzXSkqJy8sbnVsbF0sWyJsYW5nLWNzcy1zdHIiLC9edXJsXCgoW14iJyldKilcKS9pXSxbImt3ZCIsL14oPzp1cmx8cmdifCFpbXBvcnRhbnR8QGltcG9ydHxAcGFnZXxAbWVkaWF8QGNoYXJzZXR8aW5oZXJpdCkoPz1bXlx3LV18JCkvaSxudWxsXSxbImxhbmctY3NzLWt3IiwvXigtPyg/OltfYS16XXxcXFtcZGEtZl0rID8pKD86W1x3LV18XFxcXFtcZGEtZl0rID8pKilccyo6L2ldLFsiY29tIiwvXlwvXCpbXipdKlwqKyg/OlteKi9dW14qXSpcKispKlwvL10sWyJjb20iLAorL14oPzo8XCEtLXwtLVw+KS9dLFsibGl0IiwvXig/OlxkK3xcZCpcLlxkKykoPzolfFthLXpdKyk/L2ldLFsibGl0IiwvXiNbXGRhLWZdezMsNn0vaV0sWyJwbG4iLC9eLT8oPzpbX2Etel18XFxbXGRhLWZdKyA/KSg/Oltcdy1dfFxcXFxbXGRhLWZdKyA/KSovaV0sWyJwdW4iLC9eW15cc1x3IiddKy9dXSksWyJjc3MiXSk7UFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5jcmVhdGVTaW1wbGVMZXhlcihbXSxbWyJrd2QiLC9eLT8oPzpbX2Etel18XFxbXGRhLWZdKyA/KSg/Oltcdy1dfFxcXFxbXGRhLWZdKyA/KSovaV1dKSxbImNzcy1rdyJdKTtQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtdLFtbInN0ciIsL15bXiInKV0rL11dKSxbImNzcy1zdHIiXSk7CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy1nby5qcyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLWdvLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMThkYzAKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy1nby5qcwpAQCAtMCwwICsxIEBACitQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtbInBsbiIsL15bXHRcblxyIFx4YTBdKy8sbnVsbCwiXHRcblxyIMJceGEwIl0sWyJwbG4iLC9eKD86Iig/OlteIlxcXXxcXFtcU1xzXSkqKD86InwkKXwnKD86W14nXFxdfFxcW1xTXHNdKSsoPzonfCQpfGBbXmBdKig/OmB8JCkpLyxudWxsLCJcIiciXV0sW1siY29tIiwvXig/OlwvXC9bXlxuXHJdKnxcL1wqW1xTXHNdKj9cKlwvKS9dLFsicGxuIiwvXig/OlteIicvYF18XC8oPyFbKi9dKSkrL11dKSxbImdvIl0pOwpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctaHMuanMgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy1ocy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDc3YjA4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctaHMuanMKQEAgLTAsMCArMSwyIEBACitQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtbInBsbiIsL15bXHQtXHIgXSsvLG51bGwsIlx0XG4LDFxyICJdLFsic3RyIiwvXiIoPzpbXlxuXGZcciJcXF18XFxbXFNcc10pKig/OiJ8JCkvLG51bGwsJyInXSxbInN0ciIsL14nKD86W15cblxmXHInXFxdfFxcW14mXSknPy8sbnVsbCwiJyJdLFsibGl0IiwvXig/OjBvWzAtN10rfDB4W1xkYS1mXSt8XGQrKD86XC5cZCspPyg/OmVbKy1dP1xkKyk/KS9pLG51bGwsIjAxMjM0NTY3ODkiXV0sW1siY29tIiwvXig/Oi0tK1teXG5cZlxyXSp8ey0oPzpbXi1dfC0rW159LV0pKi19KS9dLFsia3dkIiwvXig/OmNhc2V8Y2xhc3N8ZGF0YXxkZWZhdWx0fGRlcml2aW5nfGRvfGVsc2V8aWZ8aW1wb3J0fGlufGluZml4fGluZml4bHxpbmZpeHJ8aW5zdGFuY2V8bGV0fG1vZHVsZXxuZXd0eXBlfG9mfHRoZW58dHlwZXx3aGVyZXxfKSg/PVteXGQnQS1aYS16XXwkKS8sCitudWxsXSxbInBsbiIsL14oPzpbQS1aXVtcdyddKlwuKSpbQS1aYS16XVtcdyddKi9dLFsicHVuIiwvXlteXGRcdC1cciAiJ0EtWmEtel0rL11dKSxbImhzIl0pOwpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctbGlzcC5qcyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLWxpc3AuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJhMzBlOAotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLWxpc3AuanMKQEAgLTAsMCArMSwzIEBACit2YXIgYT1udWxsOworUFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5jcmVhdGVTaW1wbGVMZXhlcihbWyJvcG4iLC9eXCgrLyxhLCIoIl0sWyJjbG8iLC9eXCkrLyxhLCIpIl0sWyJjb20iLC9eO1teXG5ccl0qLyxhLCI7Il0sWyJwbG4iLC9eW1x0XG5cciBceGEwXSsvLGEsIlx0XG5cciBceGEwIl0sWyJzdHIiLC9eIig/OlteIlxcXXxcXFtcU1xzXSkqKD86InwkKS8sYSwnIiddXSxbWyJrd2QiLC9eKD86YmxvY2t8Y1thZF0rcnxjYXRjaHxjb25bZHNdfGRlZig/OmluZXx1bil8ZG98ZXF8ZXFsfGVxdWFsfGVxdWFscHxldmFsLXdoZW58ZmxldHxmb3JtYXR8Z298aWZ8bGFiZWxzfGxhbWJkYXxsZXR8bG9hZC10aW1lLXZhbHVlfGxvY2FsbHl8bWFjcm9sZXR8bXVsdGlwbGUtdmFsdWUtY2FsbHxuaWx8cHJvZ258cHJvZ3Z8cXVvdGV8cmVxdWlyZXxyZXR1cm4tZnJvbXxzZXRxfHN5bWJvbC1tYWNyb2xldHx0fHRhZ2JvZHl8dGhlfHRocm93fHVud2luZClcYi8sYV0sCitbImxpdCIsL15bKy1dPyg/OlsjMF14W1xkYS1mXSt8XGQrXC9cZCt8KD86XC5cZCt8XGQrKD86XC5cZCopPykoPzpbZGVdWystXT9cZCspPykvaV0sWyJsaXQiLC9eJyg/Oi0qKD86XHd8XFxbIS1+XSkoPzpbXHctXSp8XFxbIS1+XSlbIT0/XT8pPy9dLFsicGxuIiwvXi0qKD86W19hLXpdfFxcWyEtfl0pKD86W1x3LV0qfFxcWyEtfl0pWyE9P10/L2ldLFsicHVuIiwvXlteXHdcdFxuXHIgIictKTtcXFx4YTBdKy9dXSksWyJjbCIsImVsIiwibGlzcCIsInNjbSJdKTsKZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLWx1YS5qcyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLWx1YS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODNhM2M0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctbHVhLmpzCkBAIC0wLDAgKzEsMiBAQAorUFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5jcmVhdGVTaW1wbGVMZXhlcihbWyJwbG4iLC9eW1x0XG5cciBceGEwXSsvLG51bGwsIlx0XG5cciDCXHhhMCJdLFsic3RyIiwvXig/OiIoPzpbXiJcXF18XFxbXFNcc10pKig/OiJ8JCl8Jyg/OlteJ1xcXXxcXFtcU1xzXSkqKD86J3wkKSkvLG51bGwsIlwiJyJdXSxbWyJjb20iLC9eLS0oPzpcWyg9KilcW1tcU1xzXSo/KD86XVwxXXwkKXxbXlxuXHJdKikvXSxbInN0ciIsL15cWyg9KilcW1tcU1xzXSo/KD86XVwxXXwkKS9dLFsia3dkIiwvXig/OmFuZHxicmVha3xkb3xlbHNlfGVsc2VpZnxlbmR8ZmFsc2V8Zm9yfGZ1bmN0aW9ufGlmfGlufGxvY2FsfG5pbHxub3R8b3J8cmVwZWF0fHJldHVybnx0aGVufHRydWV8dW50aWx8d2hpbGUpXGIvLG51bGxdLFsibGl0IiwvXlsrLV0/KD86MHhbXGRhLWZdK3woPzpcLlxkK3xcZCsoPzpcLlxkKik/KSg/OmVbKy1dP1xkKyk/KS9pXSwKK1sicGxuIiwvXltfYS16XVx3Ki9pXSxbInB1biIsL15bXlx3XHRcblxyIFx4YTBdW15cd1x0XG5cciAiJys9XHhhMC1dKi9dXSksWyJsdWEiXSk7CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy1tbC5qcyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLW1sLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZjAyZDcKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy1tbC5qcwpAQCAtMCwwICsxLDIgQEAKK1BSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1sicGxuIiwvXltcdFxuXHIgXHhhMF0rLyxudWxsLCJcdFxuXHIgwlx4YTAiXSxbImNvbSIsL14jKD86aWZbXHRcblxyIFx4YTBdKyg/OlskX2Etel1bXHcnXSp8YGBbXlx0XG5ccmBdKig/OmBgfCQpKXxlbHNlfGVuZGlmfGxpZ2h0KS9pLG51bGwsIiMiXSxbInN0ciIsL14oPzoiKD86W14iXFxdfFxcW1xTXHNdKSooPzoifCQpfCcoPzpbXidcXF18XFxbXFNcc10pKD86J3wkKSkvLG51bGwsIlwiJyJdXSxbWyJjb20iLC9eKD86XC9cL1teXG5ccl0qfFwoXCpbXFNcc10qP1wqXCkpL10sWyJrd2QiLC9eKD86YWJzdHJhY3R8YW5kfGFzfGFzc2VydHxiZWdpbnxjbGFzc3xkZWZhdWx0fGRlbGVnYXRlfGRvfGRvbmV8ZG93bmNhc3R8ZG93bnRvfGVsaWZ8ZWxzZXxlbmR8ZXhjZXB0aW9ufGV4dGVybnxmYWxzZXxmaW5hbGx5fGZvcnxmdW58ZnVuY3Rpb258aWZ8aW58aW5oZXJpdHxpbmxpbmV8aW50ZXJmYWNlfGludGVybmFsfGxhenl8bGV0fG1hdGNofG1lbWJlcnxtb2R1bGV8bXV0YWJsZXxuYW1lc3BhY2V8bmV3fG51bGx8b2Z8b3BlbnxvcnxvdmVycmlkZXxwcml2YXRlfHB1YmxpY3xyZWN8cmV0dXJufHN0YXRpY3xzdHJ1Y3R8dGhlbnx0b3x0cnVlfHRyeXx0eXBlfHVwY2FzdHx1c2V8dmFsfHZvaWR8d2hlbnx3aGlsZXx3aXRofHlpZWxkfGFzcnxsYW5kfGxvcnxsc2x8bHNyfGx4b3J8bW9kfHNpZ3xhdG9taWN8YnJlYWt8Y2hlY2tlZHxjb21wb25lbnR8Y29uc3R8Y29uc3RyYWludHxjb25zdHJ1Y3Rvcnxjb250aW51ZXxlYWdlcnxldmVudHxleHRlcm5hbHxmaXhlZHxmdW5jdG9yfGdsb2JhbHxpbmNsdWRlfG1ldGhvZHxtaXhpbnxvYmplY3R8cGFyYWxsZWx8cHJvY2Vzc3xwcm90ZWN0ZWR8cHVyZXxzZWFsZWR8dHJhaXR8dmlydHVhbHx2b2xhdGlsZSlcYi9dLAorWyJsaXQiLC9eWystXT8oPzoweFtcZGEtZl0rfCg/OlwuXGQrfFxkKyg/OlwuXGQqKT8pKD86ZVsrLV0/XGQrKT8pL2ldLFsicGxuIiwvXig/OltfYS16XVtcdyddKlshIz9dP3xgYFteXHRcblxyYF0qKD86YGB8JCkpL2ldLFsicHVuIiwvXlteXHdcdFxuXHIgIidceGEwXSsvXV0pLFsiZnMiLCJtbCJdKTsKZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLW4uanMgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy1uLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMmU4NWIKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy1uLmpzCkBAIC0wLDAgKzEsNCBAQAordmFyIGE9bnVsbDsKK1BSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1sic3RyIiwvXig/OicoPzpbXlxuXHInXFxdfFxcLikqJ3wiKD86W15cblxyIlxcXXxcXC4pKig/OiJ8JCkpLyxhLCciJ10sWyJjb20iLC9eIyg/Oig/OmRlZmluZXxlbGlmfGVsc2V8ZW5kaWZ8ZXJyb3J8aWZkZWZ8aW5jbHVkZXxpZm5kZWZ8bGluZXxwcmFnbWF8dW5kZWZ8d2FybmluZylcYnxbXlxuXHJdKikvLGEsIiMiXSxbInBsbiIsL15ccysvLGEsIiBcclxuXHRceGEwIl1dLFtbInN0ciIsL15AIig/OlteIl18IiIpKig/OiJ8JCkvLGFdLFsic3RyIiwvXjwjW14jPl0qKD86Iz58JCkvLGFdLFsic3RyIiwvXjwoPzooPzooPzpcLlwuXC8pKnxcLz8pKD86W1x3LV0rKD86XC9bXHctXSspKyk/W1x3LV0rXC5ofFthLXpdXHcqKT4vLGFdLFsiY29tIiwvXlwvXC9bXlxuXHJdKi8sYV0sWyJjb20iLC9eXC9cKltcU1xzXSo/KD86XCpcL3wkKS8sCithXSxbImt3ZCIsL14oPzphYnN0cmFjdHxhbmR8YXN8YmFzZXxjYXRjaHxjbGFzc3xkZWZ8ZGVsZWdhdGV8ZW51bXxldmVudHxleHRlcm58ZmFsc2V8ZmluYWxseXxmdW58aW1wbGVtZW50c3xpbnRlcmZhY2V8aW50ZXJuYWx8aXN8bWFjcm98bWF0Y2h8bWF0Y2hlc3xtb2R1bGV8bXV0YWJsZXxuYW1lc3BhY2V8bmV3fG51bGx8b3V0fG92ZXJyaWRlfHBhcmFtc3xwYXJ0aWFsfHByaXZhdGV8cHJvdGVjdGVkfHB1YmxpY3xyZWZ8c2VhbGVkfHN0YXRpY3xzdHJ1Y3R8c3ludGF4fHRoaXN8dGhyb3d8dHJ1ZXx0cnl8dHlwZXx0eXBlb2Z8dXNpbmd8dmFyaWFudHx2aXJ0dWFsfHZvbGF0aWxlfHdoZW58d2hlcmV8d2l0aHxhc3NlcnR8YXNzZXJ0Mnxhc3luY3xicmVha3xjaGVja2VkfGNvbnRpbnVlfGRvfGVsc2V8ZW5zdXJlc3xmb3J8Zm9yZWFjaHxpZnxsYXRlfGxvY2t8bmV3fG5vbGF0ZXxvdGhlcndpc2V8cmVnZXhwfHJlcGVhdHxyZXF1aXJlc3xyZXR1cm58c3Vycm91bmR3aXRofHVuY2hlY2tlZHx1bmxlc3N8dXNpbmd8d2hpbGV8eWllbGQpXGIvLAorYV0sWyJ0eXAiLC9eKD86YXJyYXl8Ym9vbHxieXRlfGNoYXJ8ZGVjaW1hbHxkb3VibGV8ZmxvYXR8aW50fGxpc3R8bG9uZ3xvYmplY3R8c2J5dGV8c2hvcnR8c3RyaW5nfHVsb25nfHVpbnR8dWZsb2F0fHVsb25nfHVzaG9ydHx2b2lkKVxiLyxhXSxbImxpdCIsL15AWyRfYS16XVtcdyRAXSovaSxhXSxbInR5cCIsL15AW0EtWl0rW2Etel1bXHckQF0qLyxhXSxbInBsbiIsL14nP1skX2Etel1bXHckQF0qL2ksYV0sWyJsaXQiLC9eKD86MHhbXGRhLWZdK3woPzpcZCg/Ol9cZCspKlxkKig/OlwuXGQqKT98XC5cZFwrKSg/OmVbKy1dP1xkKyk/KVthLXpdKi9pLGEsIjAxMjM0NTY3ODkiXSxbInB1biIsL14uW15cc1x3Ii0kJy4vQGBdKi8sYV1dKSxbIm4iLCJuZW1lcmxlIl0pOwpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctcHJvdG8uanMgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy1wcm90by5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDA2YWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctcHJvdG8uanMKQEAgLTAsMCArMSBAQAorUFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5zb3VyY2VEZWNvcmF0b3Ioe2tleXdvcmRzOiJieXRlcyxkZWZhdWx0LGRvdWJsZSxlbnVtLGV4dGVuZCxleHRlbnNpb25zLGZhbHNlLGdyb3VwLGltcG9ydCxtYXgsbWVzc2FnZSxvcHRpb24sb3B0aW9uYWwscGFja2FnZSxyZXBlYXRlZCxyZXF1aXJlZCxyZXR1cm5zLHJwYyxzZXJ2aWNlLHN5bnRheCx0byx0cnVlIix0eXBlczovXihib29sfChkb3VibGV8cz9maXhlZHxbc3VdP2ludCkoMzJ8NjQpfGZsb2F0fHN0cmluZylcYi8sY1N0eWxlQ29tbWVudHM6ITB9KSxbInByb3RvIl0pOwpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctc2NhbGEuanMgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy1zY2FsYS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGQwMzRkCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctc2NhbGEuanMKQEAgLTAsMCArMSwyIEBACitQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtbInBsbiIsL15bXHRcblxyIFx4YTBdKy8sbnVsbCwiXHRcblxyIMJceGEwIl0sWyJzdHIiLC9eIig/OiIiKD86IiI/KD8hIil8W14iXFxdfFxcLikqInswLDN9fCg/OlteXG5cciJcXF18XFwuKSoiPykvLG51bGwsJyInXSxbImxpdCIsL15gKD86W15cblxyXFxgXXxcXC4pKmA/LyxudWxsLCJgIl0sWyJwdW4iLC9eWyEjJSYoLS06LUBbLV57LX5dKy8sbnVsbCwiISMlJigpKissLTo7PD0+P0BbXFxdXnt8fX4iXV0sW1sic3RyIiwvXicoPzpbXlxuXHInXFxdfFxcKD86J3xbXlxuXHInXSspKScvXSxbImxpdCIsL14nWyRBLVpfYS16XVtcdyRdKig/IVtcdyQnXSkvXSxbImt3ZCIsL14oPzphYnN0cmFjdHxjYXNlfGNhdGNofGNsYXNzfGRlZnxkb3xlbHNlfGV4dGVuZHN8ZmluYWx8ZmluYWxseXxmb3J8Zm9yU29tZXxpZnxpbXBsaWNpdHxpbXBvcnR8bGF6eXxtYXRjaHxuZXd8b2JqZWN0fG92ZXJyaWRlfHBhY2thZ2V8cHJpdmF0ZXxwcm90ZWN0ZWR8cmVxdWlyZXN8cmV0dXJufHNlYWxlZHxzdXBlcnx0aHJvd3x0cmFpdHx0cnl8dHlwZXx2YWx8dmFyfHdoaWxlfHdpdGh8eWllbGQpXGIvXSwKK1sibGl0IiwvXig/OnRydWV8ZmFsc2V8bnVsbHx0aGlzKVxiL10sWyJsaXQiLC9eKD86MCg/OlswLTddK3x4W1xkYS1mXSspbD98KD86MHxbMS05XVxkKikoPzooPzpcLlxkKyk/KD86ZVsrLV0/XGQrKT9mP3xsPyl8XFwuXGQrKD86ZVsrLV0/XGQrKT9mPykvaV0sWyJ0eXAiLC9eWyRfXSpbQS1aXVtcZCRBLVpfXSpbYS16XVtcdyRdKi9dLFsicGxuIiwvXlskQS1aX2Etel1bXHckXSovXSxbImNvbSIsL15cLyg/OlwvLip8XCooPzpcL3xcKipbXiovXSkqKD86XCorXC8/KT8pL10sWyJwdW4iLC9eKD86XC4rfFwvKS9dXSksWyJzY2FsYSJdKTsKZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLXNxbC5qcyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLXNxbC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTcwNWIwCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctc3FsLmpzCkBAIC0wLDAgKzEsMiBAQAorUFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5jcmVhdGVTaW1wbGVMZXhlcihbWyJwbG4iLC9eW1x0XG5cciBceGEwXSsvLG51bGwsIlx0XG5cciDCXHhhMCJdLFsic3RyIiwvXig/OiIoPzpbXiJcXF18XFwuKSoifCcoPzpbXidcXF18XFwuKSonKS8sbnVsbCwiXCInIl1dLFtbImNvbSIsL14oPzotLVteXG5ccl0qfFwvXCpbXFNcc10qPyg/OlwqXC98JCkpL10sWyJrd2QiLC9eKD86YWRkfGFsbHxhbHRlcnxhbmR8YW55fGFzfGFzY3xhdXRob3JpemF0aW9ufGJhY2t1cHxiZWdpbnxiZXR3ZWVufGJyZWFrfGJyb3dzZXxidWxrfGJ5fGNhc2NhZGV8Y2FzZXxjaGVja3xjaGVja3BvaW50fGNsb3NlfGNsdXN0ZXJlZHxjb2FsZXNjZXxjb2xsYXRlfGNvbHVtbnxjb21taXR8Y29tcHV0ZXxjb25zdHJhaW50fGNvbnRhaW5zfGNvbnRhaW5zdGFibGV8Y29udGludWV8Y29udmVydHxjcmVhdGV8Y3Jvc3N8Y3VycmVudHxjdXJyZW50X2RhdGV8Y3VycmVudF90aW1lfGN1cnJlbnRfdGltZXN0YW1wfGN1cnJlbnRfdXNlcnxjdXJzb3J8ZGF0YWJhc2V8ZGJjY3xkZWFsbG9jYXRlfGRlY2xhcmV8ZGVmYXVsdHxkZWxldGV8ZGVueXxkZXNjfGRpc2t8ZGlzdGluY3R8ZGlzdHJpYnV0ZWR8ZG91YmxlfGRyb3B8ZHVtbXl8ZHVtcHxlbHNlfGVuZHxlcnJsdmx8ZXNjYXBlfGV4Y2VwdHxleGVjfGV4ZWN1dGV8ZXhpc3RzfGV4aXR8ZmV0Y2h8ZmlsZXxmaWxsZmFjdG9yfGZvcnxmb3JlaWdufGZyZWV0ZXh0fGZyZWV0ZXh0dGFibGV8ZnJvbXxmdWxsfGZ1bmN0aW9ufGdvdG98Z3JhbnR8Z3JvdXB8aGF2aW5nfGhvbGRsb2NrfGlkZW50aXR5fGlkZW50aXR5Y29sfGlkZW50aXR5X2luc2VydHxpZnxpbnxpbmRleHxpbm5lcnxpbnNlcnR8aW50ZXJzZWN0fGludG98aXN8am9pbnxrZXl8a2lsbHxsZWZ0fGxpa2V8bGluZW5vfGxvYWR8bWF0Y2h8bWVyZ2V8bmF0aW9uYWx8bm9jaGVja3xub25jbHVzdGVyZWR8bm90fG51bGx8bnVsbGlmfG9mfG9mZnxvZmZzZXRzfG9ufG9wZW58b3BlbmRhdGFzb3VyY2V8b3BlbnF1ZXJ5fG9wZW5yb3dzZXR8b3BlbnhtbHxvcHRpb258b3J8b3JkZXJ8b3V0ZXJ8b3ZlcnxwZXJjZW50fHBsYW58cHJlY2lzaW9ufHByaW1hcnl8cHJpbnR8cHJvY3xwcm9jZWR1cmV8cHVibGljfHJhaXNlcnJvcnxyZWFkfHJlYWR0ZXh0fHJlY29uZmlndXJlfHJlZmVyZW5jZXN8cmVwbGljYXRpb258cmVzdG9yZXxyZXN0cmljdHxyZXR1cm58cmV2b2tlfHJpZ2h0fHJvbGxiYWNrfHJvd2NvdW50fHJvd2d1aWRjb2x8cnVsZXxzYXZlfHNjaGVtYXxzZWxlY3R8c2Vzc2lvbl91c2VyfHNldHxzZXR1c2VyfHNodXRkb3dufHNvbWV8c3RhdGlzdGljc3xzeXN0ZW1fdXNlcnx0YWJsZXx0ZXh0c2l6ZXx0aGVufHRvfHRvcHx0cmFufHRyYW5zYWN0aW9ufHRyaWdnZXJ8dHJ1bmNhdGV8dHNlcXVhbHx1bmlvbnx1bmlxdWV8dXBkYXRlfHVwZGF0ZXRleHR8dXNlfHVzZXJ8dXNpbmd8dmFsdWVzfHZhcnlpbmd8dmlld3x3YWl0Zm9yfHdoZW58d2hlcmV8d2hpbGV8d2l0aHx3cml0ZXRleHQpKD89W15cdy1dfCQpL2ksCitudWxsXSxbImxpdCIsL15bKy1dPyg/OjB4W1xkYS1mXSt8KD86XC5cZCt8XGQrKD86XC5cZCopPykoPzplWystXT9cZCspPykvaV0sWyJwbG4iLC9eW19hLXpdW1x3LV0qL2ldLFsicHVuIiwvXlteXHdcdFxuXHIgIidceGEwXVteXHdcdFxuXHIgIicrXHhhMC1dKi9dXSksWyJzcWwiXSk7CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy10ZXguanMgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy10ZXguanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U5NmZiYgotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLXRleC5qcwpAQCAtMCwwICsxIEBACitQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtbInBsbiIsL15bXHRcblxyIFx4YTBdKy8sbnVsbCwiXHRcblxyIMJceGEwIl0sWyJjb20iLC9eJVteXG5ccl0qLyxudWxsLCIlIl1dLFtbImt3ZCIsL15cXFtALVphLXpdKy9dLFsia3dkIiwvXlxcLi9dLFsidHlwIiwvXlskJl0vXSxbImxpdCIsL1srLV0/KD86XC5cZCt8XGQrKD86XC5cZCopPykoY218ZW18ZXh8aW58cGN8cHR8YnB8bW0pL2ldLFsicHVuIiwvXlsoKT1bXF17fV0rL11dKSxbImxhdGV4IiwidGV4Il0pOwpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctdmIuanMgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy12Yi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzUwNmIwCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctdmIuanMKQEAgLTAsMCArMSwyIEBACitQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtbInBsbiIsL15bXHRcblxyIFx4YTBcdTIwMjhcdTIwMjldKy8sbnVsbCwiXHRcblxyIMJceGEw4oCo4oCpIl0sWyJzdHIiLC9eKD86WyJcdTIwMWNcdTIwMWRdKD86W14iXHUyMDFjXHUyMDFkXXxbIlx1MjAxY1x1MjAxZF17Mn0pKD86WyJcdTIwMWNcdTIwMWRdY3wkKXxbIlx1MjAxY1x1MjAxZF0oPzpbXiJcdTIwMWNcdTIwMWRdfFsiXHUyMDFjXHUyMDFkXXsyfSkqKD86WyJcdTIwMWNcdTIwMWRdfCQpKS9pLG51bGwsJyLigJzigJ0nXSxbImNvbSIsL15bJ1x1MjAxOFx1MjAxOV0uKi8sbnVsbCwiJ+KAmOKAmSJdXSxbWyJrd2QiLC9eKD86YWRkaGFuZGxlcnxhZGRyZXNzb2Z8YWxpYXN8YW5kfGFuZGFsc298YW5zaXxhc3xhc3NlbWJseXxhdXRvfGJvb2xlYW58YnlyZWZ8Ynl0ZXxieXZhbHxjYWxsfGNhc2V8Y2F0Y2h8Y2Jvb2x8Y2J5dGV8Y2NoYXJ8Y2RhdGV8Y2RibHxjZGVjfGNoYXJ8Y2ludHxjbGFzc3xjbG5nfGNvYmp8Y29uc3R8Y3Nob3J0fGNzbmd8Y3N0cnxjdHlwZXxkYXRlfGRlY2ltYWx8ZGVjbGFyZXxkZWZhdWx0fGRlbGVnYXRlfGRpbXxkaXJlY3RjYXN0fGRvfGRvdWJsZXxlYWNofGVsc2V8ZWxzZWlmfGVuZHxlbmRpZnxlbnVtfGVyYXNlfGVycm9yfGV2ZW50fGV4aXR8ZmluYWxseXxmb3J8ZnJpZW5kfGZ1bmN0aW9ufGdldHxnZXR0eXBlfGdvc3VifGdvdG98aGFuZGxlc3xpZnxpbXBsZW1lbnRzfGltcG9ydHN8aW58aW5oZXJpdHN8aW50ZWdlcnxpbnRlcmZhY2V8aXN8bGV0fGxpYnxsaWtlfGxvbmd8bG9vcHxtZXxtb2R8bW9kdWxlfG11c3Rpbmhlcml0fG11c3RvdmVycmlkZXxteWJhc2V8bXljbGFzc3xuYW1lc3BhY2V8bmV3fG5leHR8bm90fG5vdGluaGVyaXRhYmxlfG5vdG92ZXJyaWRhYmxlfG9iamVjdHxvbnxvcHRpb258b3B0aW9uYWx8b3J8b3JlbHNlfG92ZXJsb2Fkc3xvdmVycmlkYWJsZXxvdmVycmlkZXN8cGFyYW1hcnJheXxwcmVzZXJ2ZXxwcml2YXRlfHByb3BlcnR5fHByb3RlY3RlZHxwdWJsaWN8cmFpc2VldmVudHxyZWFkb25seXxyZWRpbXxyZW1vdmVoYW5kbGVyfHJlc3VtZXxyZXR1cm58c2VsZWN0fHNldHxzaGFkb3dzfHNoYXJlZHxzaG9ydHxzaW5nbGV8c3RhdGljfHN0ZXB8c3RvcHxzdHJpbmd8c3RydWN0dXJlfHN1YnxzeW5jbG9ja3x0aGVufHRocm93fHRvfHRyeXx0eXBlb2Z8dW5pY29kZXx1bnRpbHx2YXJpYW50fHdlbmR8d2hlbnx3aGlsZXx3aXRofHdpdGhldmVudHN8d3JpdGVvbmx5fHhvcnxlbmRpZnxnb3N1YnxsZXR8dmFyaWFudHx3ZW5kKVxiL2ksCitudWxsXSxbImNvbSIsL15yZW0uKi9pXSxbImxpdCIsL14oPzp0cnVlXGJ8ZmFsc2VcYnxub3RoaW5nXGJ8XGQrKD86ZVsrLV0/XGQrW2Rmcl0/fFtkZmlscnNdKT98KD86JmhbXGRhLWZdK3wmb1swLTddKylbaWxzXT98XGQqXC5cZCsoPzplWystXT9cZCspP1tkZnJdP3wjXHMrKD86XGQrWy8tXVxkK1svLV1cZCsoPzpccytcZCs6XGQrKD86OlxkKyk/KFxzKig/OmFtfHBtKSk/KT98XGQrOlxkKyg/OjpcZCspPyhccyooPzphbXxwbSkpPylccysjKS9pXSxbInBsbiIsL14oPzooPzpbYS16XXxfXHcpXHcqfFxbKD86W2Etel18X1x3KVx3Kl0pL2ldLFsicHVuIiwvXlteXHdcdFxuXHIgIidbXF1ceGEwXHUyMDE4XHUyMDE5XHUyMDFjXHUyMDFkXHUyMDI4XHUyMDI5XSsvXSxbInB1biIsL14oPzpcW3xdKS9dXSksWyJ2YiIsInZicyJdKTsKZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLXZoZGwuanMgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy12aGRsLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyOGI1YjYKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy12aGRsLmpzCkBAIC0wLDAgKzEsMyBAQAorUFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5jcmVhdGVTaW1wbGVMZXhlcihbWyJwbG4iLC9eW1x0XG5cciBceGEwXSsvLG51bGwsIlx0XG5cciDCXHhhMCJdXSxbWyJzdHIiLC9eKD86W2JveF0/Iig/OlteIl18IiIpKiJ8Jy4nKS9pXSxbImNvbSIsL14tLVteXG5ccl0qL10sWyJrd2QiLC9eKD86YWJzfGFjY2Vzc3xhZnRlcnxhbGlhc3xhbGx8YW5kfGFyY2hpdGVjdHVyZXxhcnJheXxhc3NlcnR8YXR0cmlidXRlfGJlZ2lufGJsb2NrfGJvZHl8YnVmZmVyfGJ1c3xjYXNlfGNvbXBvbmVudHxjb25maWd1cmF0aW9ufGNvbnN0YW50fGRpc2Nvbm5lY3R8ZG93bnRvfGVsc2V8ZWxzaWZ8ZW5kfGVudGl0eXxleGl0fGZpbGV8Zm9yfGZ1bmN0aW9ufGdlbmVyYXRlfGdlbmVyaWN8Z3JvdXB8Z3VhcmRlZHxpZnxpbXB1cmV8aW58aW5lcnRpYWx8aW5vdXR8aXN8bGFiZWx8bGlicmFyeXxsaW5rYWdlfGxpdGVyYWx8bG9vcHxtYXB8bW9kfG5hbmR8bmV3fG5leHR8bm9yfG5vdHxudWxsfG9mfG9ufG9wZW58b3J8b3RoZXJzfG91dHxwYWNrYWdlfHBvcnR8cG9zdHBvbmVkfHByb2NlZHVyZXxwcm9jZXNzfHB1cmV8cmFuZ2V8cmVjb3JkfHJlZ2lzdGVyfHJlamVjdHxyZW18cmVwb3J0fHJldHVybnxyb2x8cm9yfHNlbGVjdHxzZXZlcml0eXxzaGFyZWR8c2lnbmFsfHNsYXxzbGx8c3JhfHNybHxzdWJ0eXBlfHRoZW58dG98dHJhbnNwb3J0fHR5cGV8dW5hZmZlY3RlZHx1bml0c3x1bnRpbHx1c2V8dmFyaWFibGV8d2FpdHx3aGVufHdoaWxlfHdpdGh8eG5vcnx4b3IpKD89W15cdy1dfCQpL2ksCitudWxsXSxbInR5cCIsL14oPzpiaXR8Yml0X3ZlY3RvcnxjaGFyYWN0ZXJ8Ym9vbGVhbnxpbnRlZ2VyfHJlYWx8dGltZXxzdHJpbmd8c2V2ZXJpdHlfbGV2ZWx8cG9zaXRpdmV8bmF0dXJhbHxzaWduZWR8dW5zaWduZWR8bGluZXx0ZXh0fHN0ZF91P2xvZ2ljKD86X3ZlY3Rvcik/KSg/PVteXHctXXwkKS9pLG51bGxdLFsidHlwIiwvXicoPzphY3RpdmV8YXNjZW5kaW5nfGJhc2V8ZGVsYXllZHxkcml2aW5nfGRyaXZpbmdfdmFsdWV8ZXZlbnR8aGlnaHxpbWFnZXxpbnN0YW5jZV9uYW1lfGxhc3RfYWN0aXZlfGxhc3RfZXZlbnR8bGFzdF92YWx1ZXxsZWZ0fGxlZnRvZnxsZW5ndGh8bG93fHBhdGhfbmFtZXxwb3N8cHJlZHxxdWlldHxyYW5nZXxyZXZlcnNlX3JhbmdlfHJpZ2h0fHJpZ2h0b2Z8c2ltcGxlX25hbWV8c3RhYmxlfHN1Y2N8dHJhbnNhY3Rpb258dmFsfHZhbHVlKSg/PVteXHctXXwkKS9pLG51bGxdLFsibGl0IiwvXlxkKyg/Ol9cZCspKig/OiNbXHcuXFxdKyMoPzpbKy1dP1xkKyg/Ol9cZCspKik/fCg/OlwuXGQrKD86X1xkKykqKT8oPzplWystXT9cZCsoPzpfXGQrKSopPykvaV0sCitbInBsbiIsL14oPzpbYS16XVx3KnxcXFteXFxdKlxcKS9pXSxbInB1biIsL15bXlx3XHRcblxyICInXHhhMF1bXlx3XHRcblxyICInXHhhMC1dKi9dXSksWyJ2aGRsIiwidmhkIl0pOwpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctd2lraS5qcyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLXdpa2kuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIwYjQ0OAotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLXdpa2kuanMKQEAgLTAsMCArMSwyIEBACitQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtbInBsbiIsL15bXGRcdCBhLWdpLXpceGEwXSsvLG51bGwsIlx0IMJceGEwYWJjZGVmZ2lqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkiXSxbInB1biIsL15bKj1bXF1efl0rLyxudWxsLCI9Kn5eW10iXV0sW1sibGFuZy13aWtpLm1ldGEiLC8oPzpeXnxcclxuP3xcbikoI1thLXpdKylcYi9dLFsibGl0IiwvXltBLVpdW2Etel1bXGRhLXpdK1tBLVpdW2Etel1bXlxXX10rXGIvXSxbImxhbmctIiwvXnt7eyhbXFNcc10rPyl9fX0vXSxbImxhbmctIiwvXmAoW15cblxyYF0rKWAvXSxbInN0ciIsL15odHRwcz86XC9cL1teXHMjLz9dKig/OlwvW15ccyM/XSopPyg/Olw/W15ccyNdKik/KD86I1xTKik/L2ldLFsicGxuIiwvXig/OlxyXG58W1xTXHNdKVteXG5cciMqPUEtW15gaHt+XSovXV0pLFsid2lraSJdKTsKK1BSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1sia3dkIiwvXiNbYS16XSsvaSxudWxsLCIjIl1dLFtdKSxbIndpa2kubWV0YSJdKTsKZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLXhxLmpzIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmcteHEuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMyM2FlMwotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLXhxLmpzCkBAIC0wLDAgKzEsMyBAQAorUFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5jcmVhdGVTaW1wbGVMZXhlcihbWyJ2YXIgcGxuIiwvXlwkW1x3LV0rLyxudWxsLCIkIl1dLFtbInBsbiIsL15bXHM9XVs8Pl1bXHM9XS9dLFsibGl0IiwvXkBbXHctXSsvXSxbInRhZyIsL148XC8/W2Etel0oPzpbXHctLjpdKlx3KT98XC8/PiQvaV0sWyJjb20iLC9eXCg6W1xTXHNdKj86XCkvXSxbInBsbiIsL15bKCksLztbXF17fV0kL10sWyJzdHIiLC9eKD86Iig/OlteIlxce118XFxbXFNcc10pKig/OiJ8JCl8Jyg/OlteJ1xce118XFxbXFNcc10pKig/Oid8JCkpLyxudWxsLCJcIiciXSxbImt3ZCIsL14oPzp4cXVlcnl8d2hlcmV8dmVyc2lvbnx2YXJpYWJsZXx1bmlvbnx0eXBlc3dpdGNofHRyZWF0fHRvfHRoZW58dGV4dHxzdGFibGV8c29ydGJ5fHNvbWV8c2VsZnxzY2hlbWF8c2F0aXNmaWVzfHJldHVybnN8cmV0dXJufHJlZnxwcm9jZXNzaW5nLWluc3RydWN0aW9ufHByZWNlZGluZy1zaWJsaW5nfHByZWNlZGluZ3xwcmVjZWRlc3xwYXJlbnR8b25seXxvZnxub2RlfG5hbWVzcGFjZXxtb2R1bGV8bGV0fGl0ZW18aW50ZXJzZWN0fGluc3RhbmNlfGlufGltcG9ydHxpZnxmdW5jdGlvbnxmb3J8Zm9sbG93c3xmb2xsb3dpbmctc2libGluZ3xmb2xsb3dpbmd8ZXh0ZXJuYWx8ZXhjZXB0fGV2ZXJ5fGVsc2V8ZWxlbWVudHxkZXNjZW5kaW5nfGRlc2NlbmRhbnQtb3Itc2VsZnxkZXNjZW5kYW50fGRlZmluZXxkZWZhdWx0fGRlY2xhcmV8Y29tbWVudHxjaGlsZHxjYXN0fGNhc2V8YmVmb3JlfGF0dHJpYnV0ZXxhc3NlcnR8YXNjZW5kaW5nfGFzfGFuY2VzdG9yLW9yLXNlbGZ8YW5jZXN0b3J8YWZ0ZXJ8ZXF8b3JkZXJ8Ynl8b3J8YW5kfHNjaGVtYS1lbGVtZW50fGRvY3VtZW50LW5vZGV8bm9kZXxhdClcYi9dLAorWyJ0eXAiLC9eKD86eHM6eWVhck1vbnRoRHVyYXRpb258eHM6dW5zaWduZWRMb25nfHhzOnRpbWV8eHM6c3RyaW5nfHhzOnNob3J0fHhzOlFOYW1lfHhzOk5hbWV8eHM6bG9uZ3x4czppbnRlZ2VyfHhzOmludHx4czpnWWVhck1vbnRofHhzOmdZZWFyfHhzOmdNb250aERheXx4czpnRGF5fHhzOmZsb2F0fHhzOmR1cmF0aW9ufHhzOmRvdWJsZXx4czpkZWNpbWFsfHhzOmRheVRpbWVEdXJhdGlvbnx4czpkYXRlVGltZXx4czpkYXRlfHhzOmJ5dGV8eHM6Ym9vbGVhbnx4czphbnlVUkl8eGY6eWVhck1vbnRoRHVyYXRpb24pXGIvLG51bGxdLFsiZnVuIHBsbiIsL14oPzp4cDpkZXJlZmVyZW5jZXx4aW5jOm5vZGUtZXhwYW5kfHhpbmM6bGluay1yZWZlcmVuY2VzfHhpbmM6bGluay1leHBhbmR8eGh0bWw6cmVzdHJ1Y3R1cmV8eGh0bWw6Y2xlYW58eGh0bWw6YWRkLWxpc3RzfHhkbXA6emlwLW1hbmlmZXN0fHhkbXA6emlwLWdldHx4ZG1wOnppcC1jcmVhdGV8eGRtcDp4cXVlcnktdmVyc2lvbnx4ZG1wOndvcmQtY29udmVydHx4ZG1wOndpdGgtbmFtZXNwYWNlc3x4ZG1wOnZlcnNpb258eGRtcDp2YWx1ZXx4ZG1wOnVzZXItcm9sZXN8eGRtcDp1c2VyLWxhc3QtbG9naW58eGRtcDp1c2VyfHhkbXA6dXJsLWVuY29kZXx4ZG1wOnVybC1kZWNvZGV8eGRtcDp1cmktaXMtZmlsZXx4ZG1wOnVyaS1mb3JtYXR8eGRtcDp1cmktY29udGVudC10eXBlfHhkbXA6dW5xdW90ZXx4ZG1wOnVucGF0aHx4ZG1wOnRyaWdnZXJzLWRhdGFiYXNlfHhkbXA6dHJhY2V8eGRtcDp0by1qc29ufHhkbXA6dGlkeXx4ZG1wOnN1YmJpbmFyeXx4ZG1wOnN0cmZ0aW1lfHhkbXA6c3Bhd24taW58eGRtcDpzcGF3bnx4ZG1wOnNsZWVwfHhkbXA6c2h1dGRvd258eGRtcDpzZXQtc2Vzc2lvbi1maWVsZHx4ZG1wOnNldC1yZXNwb25zZS1lbmNvZGluZ3x4ZG1wOnNldC1yZXNwb25zZS1jb250ZW50LXR5cGV8eGRtcDpzZXQtcmVzcG9uc2UtY29kZXx4ZG1wOnNldC1yZXF1ZXN0LXRpbWUtbGltaXR8eGRtcDpzZXR8eGRtcDpzZXJ2ZXJzfHhkbXA6c2VydmVyLXN0YXR1c3x4ZG1wOnNlcnZlci1uYW1lfHhkbXA6c2VydmVyfHhkbXA6c2VjdXJpdHktZGF0YWJhc2V8eGRtcDpzZWN1cml0eS1hc3NlcnR8eGRtcDpzY2hlbWEtZGF0YWJhc2V8eGRtcDpzYXZlfHhkbXA6cm9sZS1yb2xlc3x4ZG1wOnJvbGV8eGRtcDpyZXRocm93fHhkbXA6cmVzdGFydHx4ZG1wOnJlcXVlc3QtdGltZXN0YW1wfHhkbXA6cmVxdWVzdC1zdGF0dXN8eGRtcDpyZXF1ZXN0LWNhbmNlbHx4ZG1wOnJlcXVlc3R8eGRtcDpyZWRpcmVjdC1yZXNwb25zZXx4ZG1wOnJhbmRvbXx4ZG1wOnF1b3RlfHhkbXA6cXVlcnktdHJhY2V8eGRtcDpxdWVyeS1tZXRlcnN8eGRtcDpwcm9kdWN0LWVkaXRpb258eGRtcDpwcml2aWxlZ2Utcm9sZXN8eGRtcDpwcml2aWxlZ2V8eGRtcDpwcmV0dHktcHJpbnR8eGRtcDpwb3dlcnBvaW50LWNvbnZlcnR8eGRtcDpwbGF0Zm9ybXx4ZG1wOnBlcm1pc3Npb258eGRtcDpwZGYtY29udmVydHx4ZG1wOnBhdGh8eGRtcDpvY3RhbC10by1pbnRlZ2VyfHhkbXA6bm9kZS11cml8eGRtcDpub2RlLXJlcGxhY2V8eGRtcDpub2RlLWtpbmR8eGRtcDpub2RlLWluc2VydC1jaGlsZHx4ZG1wOm5vZGUtaW5zZXJ0LWJlZm9yZXx4ZG1wOm5vZGUtaW5zZXJ0LWFmdGVyfHhkbXA6bm9kZS1kZWxldGV8eGRtcDpub2RlLWRhdGFiYXNlfHhkbXA6bXVsNjR8eGRtcDptb2R1bGVzLXJvb3R8eGRtcDptb2R1bGVzLWRhdGFiYXNlfHhkbXA6bWVyZ2luZ3x4ZG1wOm1lcmdlLWNhbmNlbHx4ZG1wOm1lcmdlfHhkbXA6bWQ1fHhkbXA6bG9nb3V0fHhkbXA6bG9naW58eGRtcDpsb2ctbGV2ZWx8eGRtcDpsb2d8eGRtcDpsb2NrLXJlbGVhc2V8eGRtcDpsb2NrLWFjcXVpcmV8eGRtcDpsb2FkfHhkbXA6aW52b2tlLWlufHhkbXA6aW52b2tlfHhkbXA6aW50ZWdlci10by1vY3RhbHx4ZG1wOmludGVnZXItdG8taGV4fHhkbXA6aHR0cC1wdXR8eGRtcDpodHRwLXBvc3R8eGRtcDpodHRwLW9wdGlvbnN8eGRtcDpodHRwLWhlYWR8eGRtcDpodHRwLWdldHx4ZG1wOmh0dHAtZGVsZXRlfHhkbXA6aG9zdHN8eGRtcDpob3N0LXN0YXR1c3x4ZG1wOmhvc3QtbmFtZXx4ZG1wOmhvc3R8eGRtcDpoZXgtdG8taW50ZWdlcnx4ZG1wOmhhc2g2NHx4ZG1wOmhhc2gzMnx4ZG1wOmhhcy1wcml2aWxlZ2V8eGRtcDpncm91cHN8eGRtcDpncm91cC1zZXJ2ZXN8eGRtcDpncm91cC1zZXJ2ZXJzfHhkbXA6Z3JvdXAtbmFtZXx4ZG1wOmdyb3VwLWhvc3RzfHhkbXA6Z3JvdXB8eGRtcDpnZXQtc2Vzc2lvbi1maWVsZC1uYW1lc3x4ZG1wOmdldC1zZXNzaW9uLWZpZWxkfHhkbXA6Z2V0LXJlc3BvbnNlLWVuY29kaW5nfHhkbXA6Z2V0LXJlc3BvbnNlLWNvZGV8eGRtcDpnZXQtcmVxdWVzdC11c2VybmFtZXx4ZG1wOmdldC1yZXF1ZXN0LXVzZXJ8eGRtcDpnZXQtcmVxdWVzdC11cmx8eGRtcDpnZXQtcmVxdWVzdC1wcm90b2NvbHx4ZG1wOmdldC1yZXF1ZXN0LXBhdGh8eGRtcDpnZXQtcmVxdWVzdC1tZXRob2R8eGRtcDpnZXQtcmVxdWVzdC1oZWFkZXItbmFtZXN8eGRtcDpnZXQtcmVxdWVzdC1oZWFkZXJ8eGRtcDpnZXQtcmVxdWVzdC1maWVsZC1uYW1lc3x4ZG1wOmdldC1yZXF1ZXN0LWZpZWxkLWZpbGVuYW1lfHhkbXA6Z2V0LXJlcXVlc3QtZmllbGQtY29udGVudC10eXBlfHhkbXA6Z2V0LXJlcXVlc3QtZmllbGR8eGRtcDpnZXQtcmVxdWVzdC1jbGllbnQtY2VydGlmaWNhdGV8eGRtcDpnZXQtcmVxdWVzdC1jbGllbnQtYWRkcmVzc3x4ZG1wOmdldC1yZXF1ZXN0LWJvZHl8eGRtcDpnZXQtY3VycmVudC11c2VyfHhkbXA6Z2V0LWN1cnJlbnQtcm9sZXN8eGRtcDpnZXR8eGRtcDpmdW5jdGlvbi1uYW1lfHhkbXA6ZnVuY3Rpb24tbW9kdWxlfHhkbXA6ZnVuY3Rpb258eGRtcDpmcm9tLWpzb258eGRtcDpmb3Jlc3RzfHhkbXA6Zm9yZXN0LXN0YXR1c3x4ZG1wOmZvcmVzdC1yZXN0b3JlfHhkbXA6Zm9yZXN0LXJlc3RhcnR8eGRtcDpmb3Jlc3QtbmFtZXx4ZG1wOmZvcmVzdC1kZWxldGV8eGRtcDpmb3Jlc3QtZGF0YWJhc2VzfHhkbXA6Zm9yZXN0LWNvdW50c3x4ZG1wOmZvcmVzdC1jbGVhcnx4ZG1wOmZvcmVzdC1iYWNrdXB8eGRtcDpmb3Jlc3R8eGRtcDpmaWxlc3lzdGVtLWZpbGV8eGRtcDpmaWxlc3lzdGVtLWRpcmVjdG9yeXx4ZG1wOmV4aXN0c3x4ZG1wOmV4Y2VsLWNvbnZlcnR8eGRtcDpldmFsLWlufHhkbXA6ZXZhbHx4ZG1wOmVzdGltYXRlfHhkbXA6ZW1haWx8eGRtcDplbGVtZW50LWNvbnRlbnQtdHlwZXx4ZG1wOmVsYXBzZWQtdGltZXx4ZG1wOmRvY3VtZW50LXNldC1xdWFsaXR5fHhkbXA6ZG9jdW1lbnQtc2V0LXByb3BlcnR5fHhkbXA6ZG9jdW1lbnQtc2V0LXByb3BlcnRpZXN8eGRtcDpkb2N1bWVudC1zZXQtcGVybWlzc2lvbnN8eGRtcDpkb2N1bWVudC1zZXQtY29sbGVjdGlvbnN8eGRtcDpkb2N1bWVudC1yZW1vdmUtcHJvcGVydGllc3x4ZG1wOmRvY3VtZW50LXJlbW92ZS1wZXJtaXNzaW9uc3x4ZG1wOmRvY3VtZW50LXJlbW92ZS1jb2xsZWN0aW9uc3x4ZG1wOmRvY3VtZW50LXByb3BlcnRpZXN8eGRtcDpkb2N1bWVudC1sb2Nrc3x4ZG1wOmRvY3VtZW50LWxvYWR8eGRtcDpkb2N1bWVudC1pbnNlcnR8eGRtcDpkb2N1bWVudC1nZXQtcXVhbGl0eXx4ZG1wOmRvY3VtZW50LWdldC1wcm9wZXJ0aWVzfHhkbXA6ZG9jdW1lbnQtZ2V0LXBlcm1pc3Npb25zfHhkbXA6ZG9jdW1lbnQtZ2V0LWNvbGxlY3Rpb25zfHhkbXA6ZG9jdW1lbnQtZ2V0fHhkbXA6ZG9jdW1lbnQtZm9yZXN0fHhkbXA6ZG9jdW1lbnQtZGVsZXRlfHhkbXA6ZG9jdW1lbnQtYWRkLXByb3BlcnRpZXN8eGRtcDpkb2N1bWVudC1hZGQtcGVybWlzc2lvbnN8eGRtcDpkb2N1bWVudC1hZGQtY29sbGVjdGlvbnN8eGRtcDpkaXJlY3RvcnktcHJvcGVydGllc3x4ZG1wOmRpcmVjdG9yeS1sb2Nrc3x4ZG1wOmRpcmVjdG9yeS1kZWxldGV8eGRtcDpkaXJlY3RvcnktY3JlYXRlfHhkbXA6ZGlyZWN0b3J5fHhkbXA6ZGlhY3JpdGljLWxlc3N8eGRtcDpkZXNjcmliZXx4ZG1wOmRlZmF1bHQtcGVybWlzc2lvbnN8eGRtcDpkZWZhdWx0LWNvbGxlY3Rpb25zfHhkbXA6ZGF0YWJhc2VzfHhkbXA6ZGF0YWJhc2UtcmVzdG9yZS12YWxpZGF0ZXx4ZG1wOmRhdGFiYXNlLXJlc3RvcmUtc3RhdHVzfHhkbXA6ZGF0YWJhc2UtcmVzdG9yZS1jYW5jZWx8eGRtcDpkYXRhYmFzZS1yZXN0b3JlfHhkbXA6ZGF0YWJhc2UtbmFtZXx4ZG1wOmRhdGFiYXNlLWZvcmVzdHN8eGRtcDpkYXRhYmFzZS1iYWNrdXAtdmFsaWRhdGV8eGRtcDpkYXRhYmFzZS1iYWNrdXAtc3RhdHVzfHhkbXA6ZGF0YWJhc2UtYmFja3VwLXB1cmdlfHhkbXA6ZGF0YWJhc2UtYmFja3VwLWNhbmNlbHx4ZG1wOmRhdGFiYXNlLWJhY2t1cHx4ZG1wOmRhdGFiYXNlfHhkbXA6Y29sbGVjdGlvbi1wcm9wZXJ0aWVzfHhkbXA6Y29sbGVjdGlvbi1sb2Nrc3x4ZG1wOmNvbGxlY3Rpb24tZGVsZXRlfHhkbXA6Y29sbGF0aW9uLWNhbm9uaWNhbC11cml8eGRtcDpjYXN0YWJsZS1hc3x4ZG1wOmNhbi1ncmFudC1yb2xlc3x4ZG1wOmJhc2U2NC1lbmNvZGV8eGRtcDpiYXNlNjQtZGVjb2RlfHhkbXA6YXJjaGl0ZWN0dXJlfHhkbXA6YXBwbHl8eGRtcDphbXAtcm9sZXN8eGRtcDphbXB8eGRtcDphZGQ2NHx4ZG1wOmFkZC1yZXNwb25zZS1oZWFkZXJ8eGRtcDphY2Nlc3N8dHJncjp0cmlnZ2VyLXNldC1yZWN1cnNpdmV8dHJncjp0cmlnZ2VyLXNldC1wZXJtaXNzaW9uc3x0cmdyOnRyaWdnZXItc2V0LW5hbWV8dHJncjp0cmlnZ2VyLXNldC1tb2R1bGV8dHJncjp0cmlnZ2VyLXNldC1ldmVudHx0cmdyOnRyaWdnZXItc2V0LWRlc2NyaXB0aW9ufHRyZ3I6dHJpZ2dlci1yZW1vdmUtcGVybWlzc2lvbnN8dHJncjp0cmlnZ2VyLW1vZHVsZXx0cmdyOnRyaWdnZXItZ2V0LXBlcm1pc3Npb25zfHRyZ3I6dHJpZ2dlci1lbmFibGV8dHJncjp0cmlnZ2VyLWRpc2FibGV8dHJncjp0cmlnZ2VyLWRhdGFiYXNlLW9ubGluZS1ldmVudHx0cmdyOnRyaWdnZXItZGF0YS1ldmVudHx0cmdyOnRyaWdnZXItYWRkLXBlcm1pc3Npb25zfHRyZ3I6cmVtb3ZlLXRyaWdnZXJ8dHJncjpwcm9wZXJ0eS1jb250ZW50fHRyZ3I6cHJlLWNvbW1pdHx0cmdyOnBvc3QtY29tbWl0fHRyZ3I6Z2V0LXRyaWdnZXItYnktaWR8dHJncjpnZXQtdHJpZ2dlcnx0cmdyOmRvY3VtZW50LXNjb3BlfHRyZ3I6ZG9jdW1lbnQtY29udGVudHx0cmdyOmRpcmVjdG9yeS1zY29wZXx0cmdyOmNyZWF0ZS10cmlnZ2VyfHRyZ3I6Y29sbGVjdGlvbi1zY29wZXx0cmdyOmFueS1wcm9wZXJ0eS1jb250ZW50fHRoc3I6c2V0LWVudHJ5fHRoc3I6cmVtb3ZlLXRlcm18dGhzcjpyZW1vdmUtc3lub255bXx0aHNyOnJlbW92ZS1lbnRyeXx0aHNyOnF1ZXJ5LWxvb2t1cHx0aHNyOmxvb2t1cHx0aHNyOmxvYWR8dGhzcjppbnNlcnR8dGhzcjpleHBhbmR8dGhzcjphZGQtc3lub255bXxzcGVsbDpzdWdnZXN0LWRldGFpbGVkfHNwZWxsOnN1Z2dlc3R8c3BlbGw6cmVtb3ZlLXdvcmR8c3BlbGw6bWFrZS1kaWN0aW9uYXJ5fHNwZWxsOmxvYWR8c3BlbGw6bGV2ZW5zaHRlaW4tZGlzdGFuY2V8c3BlbGw6aXMtY29ycmVjdHxzcGVsbDppbnNlcnR8c3BlbGw6ZG91YmxlLW1ldGFwaG9uZXxzcGVsbDphZGQtd29yZHxzZWM6dXNlcnMtY29sbGVjdGlvbnxzZWM6dXNlci1zZXQtcm9sZXN8c2VjOnVzZXItc2V0LXBhc3N3b3JkfHNlYzp1c2VyLXNldC1uYW1lfHNlYzp1c2VyLXNldC1kZXNjcmlwdGlvbnxzZWM6dXNlci1zZXQtZGVmYXVsdC1wZXJtaXNzaW9uc3xzZWM6dXNlci1zZXQtZGVmYXVsdC1jb2xsZWN0aW9uc3xzZWM6dXNlci1yZW1vdmUtcm9sZXN8c2VjOnVzZXItcHJpdmlsZWdlc3xzZWM6dXNlci1nZXQtcm9sZXN8c2VjOnVzZXItZ2V0LWRlc2NyaXB0aW9ufHNlYzp1c2VyLWdldC1kZWZhdWx0LXBlcm1pc3Npb25zfHNlYzp1c2VyLWdldC1kZWZhdWx0LWNvbGxlY3Rpb25zfHNlYzp1c2VyLWRvYy1wZXJtaXNzaW9uc3xzZWM6dXNlci1kb2MtY29sbGVjdGlvbnN8c2VjOnVzZXItYWRkLXJvbGVzfHNlYzp1bnByb3RlY3QtY29sbGVjdGlvbnxzZWM6dWlkLWZvci1uYW1lfHNlYzpzZXQtcmVhbG18c2VjOnNlY3VyaXR5LXZlcnNpb258c2VjOnNlY3VyaXR5LW5hbWVzcGFjZXxzZWM6c2VjdXJpdHktaW5zdGFsbGVkfHNlYzpzZWN1cml0eS1jb2xsZWN0aW9ufHNlYzpyb2xlcy1jb2xsZWN0aW9ufHNlYzpyb2xlLXNldC1yb2xlc3xzZWM6cm9sZS1zZXQtbmFtZXxzZWM6cm9sZS1zZXQtZGVzY3JpcHRpb258c2VjOnJvbGUtc2V0LWRlZmF1bHQtcGVybWlzc2lvbnN8c2VjOnJvbGUtc2V0LWRlZmF1bHQtY29sbGVjdGlvbnN8c2VjOnJvbGUtcmVtb3ZlLXJvbGVzfHNlYzpyb2xlLXByaXZpbGVnZXN8c2VjOnJvbGUtZ2V0LXJvbGVzfHNlYzpyb2xlLWdldC1kZXNjcmlwdGlvbnxzZWM6cm9sZS1nZXQtZGVmYXVsdC1wZXJtaXNzaW9uc3xzZWM6cm9sZS1nZXQtZGVmYXVsdC1jb2xsZWN0aW9uc3xzZWM6cm9sZS1kb2MtcGVybWlzc2lvbnN8c2VjOnJvbGUtZG9jLWNvbGxlY3Rpb25zfHNlYzpyb2xlLWFkZC1yb2xlc3xzZWM6cmVtb3ZlLXVzZXJ8c2VjOnJlbW92ZS1yb2xlLWZyb20tdXNlcnN8c2VjOnJlbW92ZS1yb2xlLWZyb20tcm9sZXxzZWM6cmVtb3ZlLXJvbGUtZnJvbS1wcml2aWxlZ2VzfHNlYzpyZW1vdmUtcm9sZS1mcm9tLWFtcHN8c2VjOnJlbW92ZS1yb2xlfHNlYzpyZW1vdmUtcHJpdmlsZWdlfHNlYzpyZW1vdmUtYW1wfHNlYzpwcm90ZWN0LWNvbGxlY3Rpb258c2VjOnByaXZpbGVnZXMtY29sbGVjdGlvbnxzZWM6cHJpdmlsZWdlLXNldC1yb2xlc3xzZWM6cHJpdmlsZWdlLXNldC1uYW1lfHNlYzpwcml2aWxlZ2UtcmVtb3ZlLXJvbGVzfHNlYzpwcml2aWxlZ2UtZ2V0LXJvbGVzfHNlYzpwcml2aWxlZ2UtYWRkLXJvbGVzfHNlYzpwcml2LWRvYy1wZXJtaXNzaW9uc3xzZWM6cHJpdi1kb2MtY29sbGVjdGlvbnN8c2VjOmdldC11c2VyLW5hbWVzfHNlYzpnZXQtdW5pcXVlLWVsZW0taWR8c2VjOmdldC1yb2xlLW5hbWVzfHNlYzpnZXQtcm9sZS1pZHN8c2VjOmdldC1wcml2aWxlZ2V8c2VjOmdldC1kaXN0aW5jdC1wZXJtaXNzaW9uc3xzZWM6Z2V0LWNvbGxlY3Rpb258c2VjOmdldC1hbXB8c2VjOmNyZWF0ZS11c2VyLXdpdGgtcm9sZXxzZWM6Y3JlYXRlLXVzZXJ8c2VjOmNyZWF0ZS1yb2xlfHNlYzpjcmVhdGUtcHJpdmlsZWdlfHNlYzpjcmVhdGUtYW1wfHNlYzpjb2xsZWN0aW9ucy1jb2xsZWN0aW9ufHNlYzpjb2xsZWN0aW9uLXNldC1wZXJtaXNzaW9uc3xzZWM6Y29sbGVjdGlvbi1yZW1vdmUtcGVybWlzc2lvbnN8c2VjOmNvbGxlY3Rpb24tZ2V0LXBlcm1pc3Npb25zfHNlYzpjb2xsZWN0aW9uLWFkZC1wZXJtaXNzaW9uc3xzZWM6Y2hlY2stYWRtaW58c2VjOmFtcHMtY29sbGVjdGlvbnxzZWM6YW1wLXNldC1yb2xlc3xzZWM6YW1wLXJlbW92ZS1yb2xlc3xzZWM6YW1wLWdldC1yb2xlc3xzZWM6YW1wLWRvYy1wZXJtaXNzaW9uc3xzZWM6YW1wLWRvYy1jb2xsZWN0aW9uc3xzZWM6YW1wLWFkZC1yb2xlc3xzZWFyY2g6dW5wYXJzZXxzZWFyY2g6c3VnZ2VzdHxzZWFyY2g6c25pcHBldHxzZWFyY2g6c2VhcmNofHNlYXJjaDpyZXNvbHZlLW5vZGVzfHNlYXJjaDpyZXNvbHZlfHNlYXJjaDpyZW1vdmUtY29uc3RyYWludHxzZWFyY2g6cGFyc2V8c2VhcmNoOmdldC1kZWZhdWx0LW9wdGlvbnN8c2VhcmNoOmVzdGltYXRlfHNlYXJjaDpjaGVjay1vcHRpb25zfHByb2Y6dmFsdWV8cHJvZjpyZXNldHxwcm9mOnJlcG9ydHxwcm9mOmludm9rZXxwcm9mOmV2YWx8cHJvZjplbmFibGV8cHJvZjpkaXNhYmxlfHByb2Y6YWxsb3dlZHxwcHQ6Y2xlYW58cGtpOnRlbXBsYXRlLXNldC1yZXF1ZXN0fHBraTp0ZW1wbGF0ZS1zZXQtbmFtZXxwa2k6dGVtcGxhdGUtc2V0LWtleS10eXBlfHBraTp0ZW1wbGF0ZS1zZXQta2V5LW9wdGlvbnN8cGtpOnRlbXBsYXRlLXNldC1kZXNjcmlwdGlvbnxwa2k6dGVtcGxhdGUtaW4tdXNlfHBraTp0ZW1wbGF0ZS1nZXQtdmVyc2lvbnxwa2k6dGVtcGxhdGUtZ2V0LXJlcXVlc3R8cGtpOnRlbXBsYXRlLWdldC1uYW1lfHBraTp0ZW1wbGF0ZS1nZXQta2V5LXR5cGV8cGtpOnRlbXBsYXRlLWdldC1rZXktb3B0aW9uc3xwa2k6dGVtcGxhdGUtZ2V0LWlkfHBraTp0ZW1wbGF0ZS1nZXQtZGVzY3JpcHRpb258cGtpOm5lZWQtY2VydGlmaWNhdGV8cGtpOmlzLXRlbXBvcmFyeXxwa2k6aW5zZXJ0LXRydXN0ZWQtY2VydGlmaWNhdGVzfHBraTppbnNlcnQtdGVtcGxhdGV8cGtpOmluc2VydC1zaWduZWQtY2VydGlmaWNhdGVzfHBraTppbnNlcnQtY2VydGlmaWNhdGUtcmV2b2NhdGlvbi1saXN0fHBraTpnZXQtdHJ1c3RlZC1jZXJ0aWZpY2F0ZS1pZHN8cGtpOmdldC10ZW1wbGF0ZS1pZHN8cGtpOmdldC10ZW1wbGF0ZS1jZXJ0aWZpY2F0ZS1hdXRob3JpdHl8cGtpOmdldC10ZW1wbGF0ZS1ieS1uYW1lfHBraTpnZXQtdGVtcGxhdGV8cGtpOmdldC1wZW5kaW5nLWNlcnRpZmljYXRlLXJlcXVlc3RzLXhtbHxwa2k6Z2V0LXBlbmRpbmctY2VydGlmaWNhdGUtcmVxdWVzdHMtcGVtfHBraTpnZXQtcGVuZGluZy1jZXJ0aWZpY2F0ZS1yZXF1ZXN0fHBraTpnZXQtY2VydGlmaWNhdGVzLWZvci10ZW1wbGF0ZS14bWx8cGtpOmdldC1jZXJ0aWZpY2F0ZXMtZm9yLXRlbXBsYXRlfHBraTpnZXQtY2VydGlmaWNhdGVzfHBraTpnZXQtY2VydGlmaWNhdGUteG1sfHBraTpnZXQtY2VydGlmaWNhdGUtcGVtfHBraTpnZXQtY2VydGlmaWNhdGV8cGtpOmdlbmVyYXRlLXRlbXBvcmFyeS1jZXJ0aWZpY2F0ZS1pZi1uZWNlc3Nhcnl8cGtpOmdlbmVyYXRlLXRlbXBvcmFyeS1jZXJ0aWZpY2F0ZXxwa2k6Z2VuZXJhdGUtdGVtcGxhdGUtY2VydGlmaWNhdGUtYXV0aG9yaXR5fHBraTpnZW5lcmF0ZS1jZXJ0aWZpY2F0ZS1yZXF1ZXN0fHBraTpkZWxldGUtdGVtcGxhdGV8cGtpOmRlbGV0ZS1jZXJ0aWZpY2F0ZXxwa2k6Y3JlYXRlLXRlbXBsYXRlfHBkZjptYWtlLXRvY3xwZGY6aW5zZXJ0LXRvYy1oZWFkZXJzfHBkZjpnZXQtdG9jfHBkZjpjbGVhbnxwOnN0YXR1cy10cmFuc2l0aW9ufHA6c3RhdGUtdHJhbnNpdGlvbnxwOnJlbW92ZXxwOnBpcGVsaW5lc3xwOmluc2VydHxwOmdldC1ieS1pZHxwOmdldHxwOmV4ZWN1dGV8cDpjcmVhdGV8cDpjb25kaXRpb258cDpjb2xsZWN0aW9ufHA6YWN0aW9ufG9veG1sOnJ1bnMtbWVyZ2V8b294bWw6cGFja2FnZS11cmlzfG9veG1sOnBhY2thZ2UtcGFydHMtaW5zZXJ0fG9veG1sOnBhY2thZ2UtcGFydHN8bXN3b3JkOmNsZWFufG1jZ206cG9seWdvbnxtY2dtOnBvaW50fG1jZ206Z2Vvc3BhdGlhbC1xdWVyeS1mcm9tLWVsZW1lbnRzfG1jZ206Z2Vvc3BhdGlhbC1xdWVyeXxtY2dtOmNpcmNsZXxtYXRoOnRhbmh8bWF0aDp0YW58bWF0aDpzcXJ0fG1hdGg6c2luaHxtYXRoOnNpbnxtYXRoOnBvd3xtYXRoOm1vZGZ8bWF0aDpsb2cxMHxtYXRoOmxvZ3xtYXRoOmxkZXhwfG1hdGg6ZnJleHB8bWF0aDpmbW9kfG1hdGg6Zmxvb3J8bWF0aDpmYWJzfG1hdGg6ZXhwfG1hdGg6Y29zaHxtYXRoOmNvc3xtYXRoOmNlaWx8bWF0aDphdGFuMnxtYXRoOmF0YW58bWF0aDphc2lufG1hdGg6YWNvc3xtYXA6cHV0fG1hcDptYXB8bWFwOmtleXN8bWFwOmdldHxtYXA6ZGVsZXRlfG1hcDpjb3VudHxtYXA6Y2xlYXJ8bG5rOnRvfGxuazpyZW1vdmV8bG5rOmluc2VydHxsbms6Z2V0fGxuazpmcm9tfGxuazpjcmVhdGV8a21sOnBvbHlnb258a21sOnBvaW50fGttbDppbnRlcmlvci1wb2x5Z29ufGttbDpnZW9zcGF0aWFsLXF1ZXJ5LWZyb20tZWxlbWVudHN8a21sOmdlb3NwYXRpYWwtcXVlcnl8a21sOmNpcmNsZXxrbWw6Ym94fGdtbDpwb2x5Z29ufGdtbDpwb2ludHxnbWw6aW50ZXJpb3ItcG9seWdvbnxnbWw6Z2Vvc3BhdGlhbC1xdWVyeS1mcm9tLWVsZW1lbnRzfGdtbDpnZW9zcGF0aWFsLXF1ZXJ5fGdtbDpjaXJjbGV8Z21sOmJveHxnZW9yc3M6cG9pbnR8Z2VvcnNzOmdlb3NwYXRpYWwtcXVlcnl8Z2VvcnNzOmNpcmNsZXxnZW86cG9seWdvbnxnZW86cG9pbnR8Z2VvOmludGVyaW9yLXBvbHlnb258Z2VvOmdlb3NwYXRpYWwtcXVlcnktZnJvbS1lbGVtZW50c3xnZW86Z2Vvc3BhdGlhbC1xdWVyeXxnZW86Y2lyY2xlfGdlbzpib3h8Zm46emVyby1vci1vbmV8Zm46eWVhcnMtZnJvbS1kdXJhdGlvbnxmbjp5ZWFyLWZyb20tZGF0ZVRpbWV8Zm46eWVhci1mcm9tLWRhdGV8Zm46dXBwZXItY2FzZXxmbjp1bm9yZGVyZWR8Zm46dHJ1ZXxmbjp0cmFuc2xhdGV8Zm46dHJhY2V8Zm46dG9rZW5pemV8Zm46dGltZXpvbmUtZnJvbS10aW1lfGZuOnRpbWV6b25lLWZyb20tZGF0ZVRpbWV8Zm46dGltZXpvbmUtZnJvbS1kYXRlfGZuOnN1bXxmbjpzdWJ0cmFjdC1kYXRlVGltZXMteWllbGRpbmcteWVhck1vbnRoRHVyYXRpb258Zm46c3VidHJhY3QtZGF0ZVRpbWVzLXlpZWxkaW5nLWRheVRpbWVEdXJhdGlvbnxmbjpzdWJzdHJpbmctYmVmb3JlfGZuOnN1YnN0cmluZy1hZnRlcnxmbjpzdWJzdHJpbmd8Zm46c3Vic2VxdWVuY2V8Zm46c3RyaW5nLXRvLWNvZGVwb2ludHN8Zm46c3RyaW5nLXBhZHxmbjpzdHJpbmctbGVuZ3RofGZuOnN0cmluZy1qb2lufGZuOnN0cmluZ3xmbjpzdGF0aWMtYmFzZS11cml8Zm46c3RhcnRzLXdpdGh8Zm46c2Vjb25kcy1mcm9tLXRpbWV8Zm46c2Vjb25kcy1mcm9tLWR1cmF0aW9ufGZuOnNlY29uZHMtZnJvbS1kYXRlVGltZXxmbjpyb3VuZC1oYWxmLXRvLWV2ZW58Zm46cm91bmR8Zm46cm9vdHxmbjpyZXZlcnNlfGZuOnJlc29sdmUtdXJpfGZuOnJlc29sdmUtUU5hbWV8Zm46cmVwbGFjZXxmbjpyZW1vdmV8Zm46UU5hbWV8Zm46cHJlZml4LWZyb20tUU5hbWV8Zm46cG9zaXRpb258Zm46b25lLW9yLW1vcmV8Zm46bnVtYmVyfGZuOm5vdHxmbjpub3JtYWxpemUtdW5pY29kZXxmbjpub3JtYWxpemUtc3BhY2V8Zm46bm9kZS1uYW1lfGZuOm5vZGUta2luZHxmbjpuaWxsZWR8Zm46bmFtZXNwYWNlLXVyaS1mcm9tLVFOYW1lfGZuOm5hbWVzcGFjZS11cmktZm9yLXByZWZpeHxmbjpuYW1lc3BhY2UtdXJpfGZuOm5hbWV8Zm46bW9udGhzLWZyb20tZHVyYXRpb258Zm46bW9udGgtZnJvbS1kYXRlVGltZXxmbjptb250aC1mcm9tLWRhdGV8Zm46bWludXRlcy1mcm9tLXRpbWV8Zm46bWludXRlcy1mcm9tLWR1cmF0aW9ufGZuOm1pbnV0ZXMtZnJvbS1kYXRlVGltZXxmbjptaW58Zm46bWF4fGZuOm1hdGNoZXN8Zm46bG93ZXItY2FzZXxmbjpsb2NhbC1uYW1lLWZyb20tUU5hbWV8Zm46bG9jYWwtbmFtZXxmbjpsYXN0fGZuOmxhbmd8Zm46aXJpLXRvLXVyaXxmbjppbnNlcnQtYmVmb3JlfGZuOmluZGV4LW9mfGZuOmluLXNjb3BlLXByZWZpeGVzfGZuOmltcGxpY2l0LXRpbWV6b25lfGZuOmlkcmVmfGZuOmlkfGZuOmhvdXJzLWZyb20tdGltZXxmbjpob3Vycy1mcm9tLWR1cmF0aW9ufGZuOmhvdXJzLWZyb20tZGF0ZVRpbWV8Zm46Zmxvb3J8Zm46ZmFsc2V8Zm46ZXhwYW5kZWQtUU5hbWV8Zm46ZXhpc3RzfGZuOmV4YWN0bHktb25lfGZuOmVzY2FwZS11cml8Zm46ZXNjYXBlLWh0bWwtdXJpfGZuOmVycm9yfGZuOmVuZHMtd2l0aHxmbjplbmNvZGUtZm9yLXVyaXxmbjplbXB0eXxmbjpkb2N1bWVudC11cml8Zm46ZG9jLWF2YWlsYWJsZXxmbjpkb2N8Zm46ZGlzdGluY3QtdmFsdWVzfGZuOmRpc3RpbmN0LW5vZGVzfGZuOmRlZmF1bHQtY29sbGF0aW9ufGZuOmRlZXAtZXF1YWx8Zm46ZGF5cy1mcm9tLWR1cmF0aW9ufGZuOmRheS1mcm9tLWRhdGVUaW1lfGZuOmRheS1mcm9tLWRhdGV8Zm46ZGF0YXxmbjpjdXJyZW50LXRpbWV8Zm46Y3VycmVudC1kYXRlVGltZXxmbjpjdXJyZW50LWRhdGV8Zm46Y291bnR8Zm46Y29udGFpbnN8Zm46Y29uY2F0fGZuOmNvbXBhcmV8Zm46Y29sbGVjdGlvbnxmbjpjb2RlcG9pbnRzLXRvLXN0cmluZ3xmbjpjb2RlcG9pbnQtZXF1YWx8Zm46Y2VpbGluZ3xmbjpib29sZWFufGZuOmJhc2UtdXJpfGZuOmF2Z3xmbjphZGp1c3QtdGltZS10by10aW1lem9uZXxmbjphZGp1c3QtZGF0ZVRpbWUtdG8tdGltZXpvbmV8Zm46YWRqdXN0LWRhdGUtdG8tdGltZXpvbmV8Zm46YWJzfGZlZWQ6dW5zdWJzY3JpYmV8ZmVlZDpzdWJzY3JpcHRpb258ZmVlZDpzdWJzY3JpYmV8ZmVlZDpyZXF1ZXN0fGZlZWQ6aXRlbXxmZWVkOmRlc2NyaXB0aW9ufGV4Y2VsOmNsZWFufGVudGl0eTplbnJpY2h8ZG9tOnNldC1waXBlbGluZXN8ZG9tOnNldC1wZXJtaXNzaW9uc3xkb206c2V0LW5hbWV8ZG9tOnNldC1ldmFsdWF0aW9uLWNvbnRleHR8ZG9tOnNldC1kb21haW4tc2NvcGV8ZG9tOnNldC1kZXNjcmlwdGlvbnxkb206cmVtb3ZlLXBpcGVsaW5lfGRvbTpyZW1vdmUtcGVybWlzc2lvbnN8ZG9tOnJlbW92ZXxkb206Z2V0fGRvbTpldmFsdWF0aW9uLWNvbnRleHR8ZG9tOmRvbWFpbnN8ZG9tOmRvbWFpbi1zY29wZXxkb206Y3JlYXRlfGRvbTpjb25maWd1cmF0aW9uLXNldC1yZXN0YXJ0LXVzZXJ8ZG9tOmNvbmZpZ3VyYXRpb24tc2V0LXBlcm1pc3Npb25zfGRvbTpjb25maWd1cmF0aW9uLXNldC1ldmFsdWF0aW9uLWNvbnRleHR8ZG9tOmNvbmZpZ3VyYXRpb24tc2V0LWRlZmF1bHQtZG9tYWlufGRvbTpjb25maWd1cmF0aW9uLWdldHxkb206Y29uZmlndXJhdGlvbi1jcmVhdGV8ZG9tOmNvbGxlY3Rpb258ZG9tOmFkZC1waXBlbGluZXxkb206YWRkLXBlcm1pc3Npb25zfGRsczpyZXRlbnRpb24tcnVsZXN8ZGxzOnJldGVudGlvbi1ydWxlLXJlbW92ZXxkbHM6cmV0ZW50aW9uLXJ1bGUtaW5zZXJ0fGRsczpyZXRlbnRpb24tcnVsZXxkbHM6cHVyZ2V8ZGxzOm5vZGUtZXhwYW5kfGRsczpsaW5rLXJlZmVyZW5jZXN8ZGxzOmxpbmstZXhwYW5kfGRsczpkb2N1bWVudHMtcXVlcnl8ZGxzOmRvY3VtZW50LXZlcnNpb25zLXF1ZXJ5fGRsczpkb2N1bWVudC12ZXJzaW9uLXVyaXxkbHM6ZG9jdW1lbnQtdmVyc2lvbi1xdWVyeXxkbHM6ZG9jdW1lbnQtdmVyc2lvbi1kZWxldGV8ZGxzOmRvY3VtZW50LXZlcnNpb24tYXMtb2Z8ZGxzOmRvY3VtZW50LXZlcnNpb258ZGxzOmRvY3VtZW50LXVwZGF0ZXxkbHM6ZG9jdW1lbnQtdW5tYW5hZ2V8ZGxzOmRvY3VtZW50LXNldC1xdWFsaXR5fGRsczpkb2N1bWVudC1zZXQtcHJvcGVydHl8ZGxzOmRvY3VtZW50LXNldC1wcm9wZXJ0aWVzfGRsczpkb2N1bWVudC1zZXQtcGVybWlzc2lvbnN8ZGxzOmRvY3VtZW50LXNldC1jb2xsZWN0aW9uc3xkbHM6ZG9jdW1lbnQtcmV0ZW50aW9uLXJ1bGVzfGRsczpkb2N1bWVudC1yZW1vdmUtcHJvcGVydGllc3xkbHM6ZG9jdW1lbnQtcmVtb3ZlLXBlcm1pc3Npb25zfGRsczpkb2N1bWVudC1yZW1vdmUtY29sbGVjdGlvbnN8ZGxzOmRvY3VtZW50LXB1cmdlfGRsczpkb2N1bWVudC1tYW5hZ2V8ZGxzOmRvY3VtZW50LWlzLW1hbmFnZWR8ZGxzOmRvY3VtZW50LWluc2VydC1hbmQtbWFuYWdlfGRsczpkb2N1bWVudC1pbmNsdWRlLXF1ZXJ5fGRsczpkb2N1bWVudC1oaXN0b3J5fGRsczpkb2N1bWVudC1nZXQtcGVybWlzc2lvbnN8ZGxzOmRvY3VtZW50LWV4dHJhY3QtcGFydHxkbHM6ZG9jdW1lbnQtZGVsZXRlfGRsczpkb2N1bWVudC1jaGVja291dC1zdGF0dXN8ZGxzOmRvY3VtZW50LWNoZWNrb3V0fGRsczpkb2N1bWVudC1jaGVja2lufGRsczpkb2N1bWVudC1hZGQtcHJvcGVydGllc3xkbHM6ZG9jdW1lbnQtYWRkLXBlcm1pc3Npb25zfGRsczpkb2N1bWVudC1hZGQtY29sbGVjdGlvbnN8ZGxzOmJyZWFrLWNoZWNrb3V0fGRsczphdXRob3ItcXVlcnl8ZGxzOmFzLW9mLXF1ZXJ5fGRiazpjb252ZXJ0fGRiZzp3YWl0fGRiZzp2YWx1ZXxkYmc6c3RvcHBlZHxkYmc6c3RvcHxkYmc6c3RlcHxkYmc6c3RhdHVzfGRiZzpzdGFja3xkYmc6b3V0fGRiZzpuZXh0fGRiZzpsaW5lfGRiZzppbnZva2V8ZGJnOmZ1bmN0aW9ufGRiZzpmaW5pc2h8ZGJnOmV4cHJ8ZGJnOmV2YWx8ZGJnOmRpc2Nvbm5lY3R8ZGJnOmRldGFjaHxkYmc6Y29udGludWV8ZGJnOmNvbm5lY3R8ZGJnOmNsZWFyfGRiZzpicmVha3BvaW50c3xkYmc6YnJlYWt8ZGJnOmF0dGFjaGVkfGRiZzphdHRhY2h8Y3Z0OnNhdmUtY29udmVydGVkLWRvY3VtZW50c3xjdnQ6cGFydC11cml8Y3Z0OmRlc3RpbmF0aW9uLXVyaXxjdnQ6YmFzZXBhdGh8Y3Z0OmJhc2VuYW1lfGN0czp3b3Jkc3xjdHM6d29yZC1xdWVyeS13ZWlnaHR8Y3RzOndvcmQtcXVlcnktdGV4dHxjdHM6d29yZC1xdWVyeS1vcHRpb25zfGN0czp3b3JkLXF1ZXJ5fGN0czp3b3JkLW1hdGNofGN0czp3YWxrfGN0czp1cmlzfGN0czp1cmktbWF0Y2h8Y3RzOnRyYWlufGN0czp0b2tlbml6ZXxjdHM6dGhyZXNob2xkc3xjdHM6c3RlbXxjdHM6c2ltaWxhci1xdWVyeS13ZWlnaHR8Y3RzOnNpbWlsYXItcXVlcnktbm9kZXN8Y3RzOnNpbWlsYXItcXVlcnl8Y3RzOnNob3J0ZXN0LWRpc3RhbmNlfGN0czpzZWFyY2h8Y3RzOnNjb3JlfGN0czpyZXZlcnNlLXF1ZXJ5LXdlaWdodHxjdHM6cmV2ZXJzZS1xdWVyeS1ub2Rlc3xjdHM6cmV2ZXJzZS1xdWVyeXxjdHM6cmVtYWluZGVyfGN0czpyZWdpc3RlcmVkLXF1ZXJ5LXdlaWdodHxjdHM6cmVnaXN0ZXJlZC1xdWVyeS1vcHRpb25zfGN0czpyZWdpc3RlcmVkLXF1ZXJ5LWlkc3xjdHM6cmVnaXN0ZXJlZC1xdWVyeXxjdHM6cmVnaXN0ZXJ8Y3RzOnF1ZXJ5fGN0czpxdWFsaXR5fGN0czpwcm9wZXJ0aWVzLXF1ZXJ5LXF1ZXJ5fGN0czpwcm9wZXJ0aWVzLXF1ZXJ5fGN0czpwb2x5Z29uLXZlcnRpY2VzfGN0czpwb2x5Z29ufGN0czpwb2ludC1sb25naXR1ZGV8Y3RzOnBvaW50LWxhdGl0dWRlfGN0czpwb2ludHxjdHM6b3ItcXVlcnktcXVlcmllc3xjdHM6b3ItcXVlcnl8Y3RzOm5vdC1xdWVyeS13ZWlnaHR8Y3RzOm5vdC1xdWVyeS1xdWVyeXxjdHM6bm90LXF1ZXJ5fGN0czpuZWFyLXF1ZXJ5LXdlaWdodHxjdHM6bmVhci1xdWVyeS1xdWVyaWVzfGN0czpuZWFyLXF1ZXJ5LW9wdGlvbnN8Y3RzOm5lYXItcXVlcnktZGlzdGFuY2V8Y3RzOm5lYXItcXVlcnl8Y3RzOmhpZ2hsaWdodHxjdHM6Z2Vvc3BhdGlhbC1jby1vY2N1cnJlbmNlc3xjdHM6ZnJlcXVlbmN5fGN0czpmaXRuZXNzfGN0czpmaWVsZC13b3Jkc3xjdHM6ZmllbGQtd29yZC1xdWVyeS13ZWlnaHR8Y3RzOmZpZWxkLXdvcmQtcXVlcnktdGV4dHxjdHM6ZmllbGQtd29yZC1xdWVyeS1vcHRpb25zfGN0czpmaWVsZC13b3JkLXF1ZXJ5LWZpZWxkLW5hbWV8Y3RzOmZpZWxkLXdvcmQtcXVlcnl8Y3RzOmZpZWxkLXdvcmQtbWF0Y2h8Y3RzOmVudGl0eS1oaWdobGlnaHR8Y3RzOmVsZW1lbnQtd29yZHN8Y3RzOmVsZW1lbnQtd29yZC1xdWVyeS13ZWlnaHR8Y3RzOmVsZW1lbnQtd29yZC1xdWVyeS10ZXh0fGN0czplbGVtZW50LXdvcmQtcXVlcnktb3B0aW9uc3xjdHM6ZWxlbWVudC13b3JkLXF1ZXJ5LWVsZW1lbnQtbmFtZXxjdHM6ZWxlbWVudC13b3JkLXF1ZXJ5fGN0czplbGVtZW50LXdvcmQtbWF0Y2h8Y3RzOmVsZW1lbnQtdmFsdWVzfGN0czplbGVtZW50LXZhbHVlLXJhbmdlc3xjdHM6ZWxlbWVudC12YWx1ZS1xdWVyeS13ZWlnaHR8Y3RzOmVsZW1lbnQtdmFsdWUtcXVlcnktdGV4dHxjdHM6ZWxlbWVudC12YWx1ZS1xdWVyeS1vcHRpb25zfGN0czplbGVtZW50LXZhbHVlLXF1ZXJ5LWVsZW1lbnQtbmFtZXxjdHM6ZWxlbWVudC12YWx1ZS1xdWVyeXxjdHM6ZWxlbWVudC12YWx1ZS1tYXRjaHxjdHM6ZWxlbWVudC12YWx1ZS1nZW9zcGF0aWFsLWNvLW9jY3VycmVuY2VzfGN0czplbGVtZW50LXZhbHVlLWNvLW9jY3VycmVuY2VzfGN0czplbGVtZW50LXJhbmdlLXF1ZXJ5LXdlaWdodHxjdHM6ZWxlbWVudC1yYW5nZS1xdWVyeS12YWx1ZXxjdHM6ZWxlbWVudC1yYW5nZS1xdWVyeS1vcHRpb25zfGN0czplbGVtZW50LXJhbmdlLXF1ZXJ5LW9wZXJhdG9yfGN0czplbGVtZW50LXJhbmdlLXF1ZXJ5LWVsZW1lbnQtbmFtZXxjdHM6ZWxlbWVudC1yYW5nZS1xdWVyeXxjdHM6ZWxlbWVudC1xdWVyeS1xdWVyeXxjdHM6ZWxlbWVudC1xdWVyeS1lbGVtZW50LW5hbWV8Y3RzOmVsZW1lbnQtcXVlcnl8Y3RzOmVsZW1lbnQtcGFpci1nZW9zcGF0aWFsLXZhbHVlc3xjdHM6ZWxlbWVudC1wYWlyLWdlb3NwYXRpYWwtdmFsdWUtbWF0Y2h8Y3RzOmVsZW1lbnQtcGFpci1nZW9zcGF0aWFsLXF1ZXJ5LXdlaWdodHxjdHM6ZWxlbWVudC1wYWlyLWdlb3NwYXRpYWwtcXVlcnktcmVnaW9ufGN0czplbGVtZW50LXBhaXItZ2Vvc3BhdGlhbC1xdWVyeS1vcHRpb25zfGN0czplbGVtZW50LXBhaXItZ2Vvc3BhdGlhbC1xdWVyeS1sb25naXR1ZGUtbmFtZXxjdHM6ZWxlbWVudC1wYWlyLWdlb3NwYXRpYWwtcXVlcnktbGF0aXR1ZGUtbmFtZXxjdHM6ZWxlbWVudC1wYWlyLWdlb3NwYXRpYWwtcXVlcnktZWxlbWVudC1uYW1lfGN0czplbGVtZW50LXBhaXItZ2Vvc3BhdGlhbC1xdWVyeXxjdHM6ZWxlbWVudC1wYWlyLWdlb3NwYXRpYWwtYm94ZXN8Y3RzOmVsZW1lbnQtZ2Vvc3BhdGlhbC12YWx1ZXN8Y3RzOmVsZW1lbnQtZ2Vvc3BhdGlhbC12YWx1ZS1tYXRjaHxjdHM6ZWxlbWVudC1nZW9zcGF0aWFsLXF1ZXJ5LXdlaWdodHxjdHM6ZWxlbWVudC1nZW9zcGF0aWFsLXF1ZXJ5LXJlZ2lvbnxjdHM6ZWxlbWVudC1nZW9zcGF0aWFsLXF1ZXJ5LW9wdGlvbnN8Y3RzOmVsZW1lbnQtZ2Vvc3BhdGlhbC1xdWVyeS1lbGVtZW50LW5hbWV8Y3RzOmVsZW1lbnQtZ2Vvc3BhdGlhbC1xdWVyeXxjdHM6ZWxlbWVudC1nZW9zcGF0aWFsLWJveGVzfGN0czplbGVtZW50LWNoaWxkLWdlb3NwYXRpYWwtdmFsdWVzfGN0czplbGVtZW50LWNoaWxkLWdlb3NwYXRpYWwtdmFsdWUtbWF0Y2h8Y3RzOmVsZW1lbnQtY2hpbGQtZ2Vvc3BhdGlhbC1xdWVyeS13ZWlnaHR8Y3RzOmVsZW1lbnQtY2hpbGQtZ2Vvc3BhdGlhbC1xdWVyeS1yZWdpb258Y3RzOmVsZW1lbnQtY2hpbGQtZ2Vvc3BhdGlhbC1xdWVyeS1vcHRpb25zfGN0czplbGVtZW50LWNoaWxkLWdlb3NwYXRpYWwtcXVlcnktZWxlbWVudC1uYW1lfGN0czplbGVtZW50LWNoaWxkLWdlb3NwYXRpYWwtcXVlcnktY2hpbGQtbmFtZXxjdHM6ZWxlbWVudC1jaGlsZC1nZW9zcGF0aWFsLXF1ZXJ5fGN0czplbGVtZW50LWNoaWxkLWdlb3NwYXRpYWwtYm94ZXN8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXdvcmRzfGN0czplbGVtZW50LWF0dHJpYnV0ZS13b3JkLXF1ZXJ5LXdlaWdodHxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtd29yZC1xdWVyeS10ZXh0fGN0czplbGVtZW50LWF0dHJpYnV0ZS13b3JkLXF1ZXJ5LW9wdGlvbnN8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXdvcmQtcXVlcnktZWxlbWVudC1uYW1lfGN0czplbGVtZW50LWF0dHJpYnV0ZS13b3JkLXF1ZXJ5LWF0dHJpYnV0ZS1uYW1lfGN0czplbGVtZW50LWF0dHJpYnV0ZS13b3JkLXF1ZXJ5fGN0czplbGVtZW50LWF0dHJpYnV0ZS13b3JkLW1hdGNofGN0czplbGVtZW50LWF0dHJpYnV0ZS12YWx1ZXN8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXZhbHVlLXJhbmdlc3xjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtdmFsdWUtcXVlcnktd2VpZ2h0fGN0czplbGVtZW50LWF0dHJpYnV0ZS12YWx1ZS1xdWVyeS10ZXh0fGN0czplbGVtZW50LWF0dHJpYnV0ZS12YWx1ZS1xdWVyeS1vcHRpb25zfGN0czplbGVtZW50LWF0dHJpYnV0ZS12YWx1ZS1xdWVyeS1lbGVtZW50LW5hbWV8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXZhbHVlLXF1ZXJ5LWF0dHJpYnV0ZS1uYW1lfGN0czplbGVtZW50LWF0dHJpYnV0ZS12YWx1ZS1xdWVyeXxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtdmFsdWUtbWF0Y2h8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXZhbHVlLWdlb3NwYXRpYWwtY28tb2NjdXJyZW5jZXN8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXZhbHVlLWNvLW9jY3VycmVuY2VzfGN0czplbGVtZW50LWF0dHJpYnV0ZS1yYW5nZS1xdWVyeS13ZWlnaHR8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXJhbmdlLXF1ZXJ5LXZhbHVlfGN0czplbGVtZW50LWF0dHJpYnV0ZS1yYW5nZS1xdWVyeS1vcHRpb25zfGN0czplbGVtZW50LWF0dHJpYnV0ZS1yYW5nZS1xdWVyeS1vcGVyYXRvcnxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtcmFuZ2UtcXVlcnktZWxlbWVudC1uYW1lfGN0czplbGVtZW50LWF0dHJpYnV0ZS1yYW5nZS1xdWVyeS1hdHRyaWJ1dGUtbmFtZXxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtcmFuZ2UtcXVlcnl8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXBhaXItZ2Vvc3BhdGlhbC12YWx1ZXN8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXBhaXItZ2Vvc3BhdGlhbC12YWx1ZS1tYXRjaHxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtcGFpci1nZW9zcGF0aWFsLXF1ZXJ5LXdlaWdodHxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtcGFpci1nZW9zcGF0aWFsLXF1ZXJ5LXJlZ2lvbnxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtcGFpci1nZW9zcGF0aWFsLXF1ZXJ5LW9wdGlvbnN8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXBhaXItZ2Vvc3BhdGlhbC1xdWVyeS1sb25naXR1ZGUtbmFtZXxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtcGFpci1nZW9zcGF0aWFsLXF1ZXJ5LWxhdGl0dWRlLW5hbWV8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXBhaXItZ2Vvc3BhdGlhbC1xdWVyeS1lbGVtZW50LW5hbWV8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXBhaXItZ2Vvc3BhdGlhbC1xdWVyeXxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtcGFpci1nZW9zcGF0aWFsLWJveGVzfGN0czpkb2N1bWVudC1xdWVyeS11cmlzfGN0czpkb2N1bWVudC1xdWVyeXxjdHM6ZGlzdGFuY2V8Y3RzOmRpcmVjdG9yeS1xdWVyeS11cmlzfGN0czpkaXJlY3RvcnktcXVlcnktZGVwdGh8Y3RzOmRpcmVjdG9yeS1xdWVyeXxjdHM6ZGVzdGluYXRpb258Y3RzOmRlcmVnaXN0ZXJ8Y3RzOmNvbnRhaW5zfGN0czpjb25maWRlbmNlfGN0czpjb2xsZWN0aW9uc3xjdHM6Y29sbGVjdGlvbi1xdWVyeS11cmlzfGN0czpjb2xsZWN0aW9uLXF1ZXJ5fGN0czpjb2xsZWN0aW9uLW1hdGNofGN0czpjbGFzc2lmeXxjdHM6Y2lyY2xlLXJhZGl1c3xjdHM6Y2lyY2xlLWNlbnRlcnxjdHM6Y2lyY2xlfGN0czpib3gtd2VzdHxjdHM6Ym94LXNvdXRofGN0czpib3gtbm9ydGh8Y3RzOmJveC1lYXN0fGN0czpib3h8Y3RzOmJlYXJpbmd8Y3RzOmFyYy1pbnRlcnNlY3Rpb258Y3RzOmFuZC1xdWVyeS1xdWVyaWVzfGN0czphbmQtcXVlcnktb3B0aW9uc3xjdHM6YW5kLXF1ZXJ5fGN0czphbmQtbm90LXF1ZXJ5LXBvc2l0aXZlLXF1ZXJ5fGN0czphbmQtbm90LXF1ZXJ5LW5lZ2F0aXZlLXF1ZXJ5fGN0czphbmQtbm90LXF1ZXJ5fGNzczpnZXR8Y3NzOmNvbnZlcnR8Y3BmOnN1Y2Nlc3N8Y3BmOmZhaWx1cmV8Y3BmOmRvY3VtZW50LXNldC1zdGF0ZXxjcGY6ZG9jdW1lbnQtc2V0LXByb2Nlc3Npbmctc3RhdHVzfGNwZjpkb2N1bWVudC1zZXQtbGFzdC11cGRhdGVkfGNwZjpkb2N1bWVudC1zZXQtZXJyb3J8Y3BmOmRvY3VtZW50LWdldC1zdGF0ZXxjcGY6ZG9jdW1lbnQtZ2V0LXByb2Nlc3Npbmctc3RhdHVzfGNwZjpkb2N1bWVudC1nZXQtbGFzdC11cGRhdGVkfGNwZjpkb2N1bWVudC1nZXQtZXJyb3J8Y3BmOmNoZWNrLXRyYW5zaXRpb258YWxlcnQ6c3Bhd24tbWF0Y2hpbmctYWN0aW9uc3xhbGVydDpydWxlLXVzZXItaWQtcXVlcnl8YWxlcnQ6cnVsZS1zZXQtdXNlci1pZHxhbGVydDpydWxlLXNldC1xdWVyeXxhbGVydDpydWxlLXNldC1vcHRpb25zfGFsZXJ0OnJ1bGUtc2V0LW5hbWV8YWxlcnQ6cnVsZS1zZXQtZGVzY3JpcHRpb258YWxlcnQ6cnVsZS1zZXQtYWN0aW9ufGFsZXJ0OnJ1bGUtcmVtb3ZlfGFsZXJ0OnJ1bGUtbmFtZS1xdWVyeXxhbGVydDpydWxlLWluc2VydHxhbGVydDpydWxlLWlkLXF1ZXJ5fGFsZXJ0OnJ1bGUtZ2V0LXVzZXItaWR8YWxlcnQ6cnVsZS1nZXQtcXVlcnl8YWxlcnQ6cnVsZS1nZXQtb3B0aW9uc3xhbGVydDpydWxlLWdldC1uYW1lfGFsZXJ0OnJ1bGUtZ2V0LWlkfGFsZXJ0OnJ1bGUtZ2V0LWRlc2NyaXB0aW9ufGFsZXJ0OnJ1bGUtZ2V0LWFjdGlvbnxhbGVydDpydWxlLWFjdGlvbi1xdWVyeXxhbGVydDpyZW1vdmUtdHJpZ2dlcnN8YWxlcnQ6bWFrZS1ydWxlfGFsZXJ0Om1ha2UtbG9nLWFjdGlvbnxhbGVydDptYWtlLWNvbmZpZ3xhbGVydDptYWtlLWFjdGlvbnxhbGVydDppbnZva2UtbWF0Y2hpbmctYWN0aW9uc3xhbGVydDpnZXQtbXktcnVsZXN8YWxlcnQ6Z2V0LWFsbC1ydWxlc3xhbGVydDpnZXQtYWN0aW9uc3xhbGVydDpmaW5kLW1hdGNoaW5nLXJ1bGVzfGFsZXJ0OmNyZWF0ZS10cmlnZ2Vyc3xhbGVydDpjb25maWctc2V0LXVyaXxhbGVydDpjb25maWctc2V0LXRyaWdnZXItaWRzfGFsZXJ0OmNvbmZpZy1zZXQtb3B0aW9uc3xhbGVydDpjb25maWctc2V0LW5hbWV8YWxlcnQ6Y29uZmlnLXNldC1kZXNjcmlwdGlvbnxhbGVydDpjb25maWctc2V0LWNwZi1kb21haW4tbmFtZXN8YWxlcnQ6Y29uZmlnLXNldC1jcGYtZG9tYWluLWlkc3xhbGVydDpjb25maWctaW5zZXJ0fGFsZXJ0OmNvbmZpZy1nZXQtdXJpfGFsZXJ0OmNvbmZpZy1nZXQtdHJpZ2dlci1pZHN8YWxlcnQ6Y29uZmlnLWdldC1vcHRpb25zfGFsZXJ0OmNvbmZpZy1nZXQtbmFtZXxhbGVydDpjb25maWctZ2V0LWlkfGFsZXJ0OmNvbmZpZy1nZXQtZGVzY3JpcHRpb258YWxlcnQ6Y29uZmlnLWdldC1jcGYtZG9tYWluLW5hbWVzfGFsZXJ0OmNvbmZpZy1nZXQtY3BmLWRvbWFpbi1pZHN8YWxlcnQ6Y29uZmlnLWdldHxhbGVydDpjb25maWctZGVsZXRlfGFsZXJ0OmFjdGlvbi1zZXQtb3B0aW9uc3xhbGVydDphY3Rpb24tc2V0LW5hbWV8YWxlcnQ6YWN0aW9uLXNldC1tb2R1bGUtcm9vdHxhbGVydDphY3Rpb24tc2V0LW1vZHVsZS1kYnxhbGVydDphY3Rpb24tc2V0LW1vZHVsZXxhbGVydDphY3Rpb24tc2V0LWRlc2NyaXB0aW9ufGFsZXJ0OmFjdGlvbi1yZW1vdmV8YWxlcnQ6YWN0aW9uLWluc2VydHxhbGVydDphY3Rpb24tZ2V0LW9wdGlvbnN8YWxlcnQ6YWN0aW9uLWdldC1uYW1lfGFsZXJ0OmFjdGlvbi1nZXQtbW9kdWxlLXJvb3R8YWxlcnQ6YWN0aW9uLWdldC1tb2R1bGUtZGJ8YWxlcnQ6YWN0aW9uLWdldC1tb2R1bGV8YWxlcnQ6YWN0aW9uLWdldC1kZXNjcmlwdGlvbnx6ZXJvLW9yLW9uZXx5ZWFycy1mcm9tLWR1cmF0aW9ufHllYXItZnJvbS1kYXRlVGltZXx5ZWFyLWZyb20tZGF0ZXx1cHBlci1jYXNlfHVub3JkZXJlZHx0cnVlfHRyYW5zbGF0ZXx0cmFjZXx0b2tlbml6ZXx0aW1lem9uZS1mcm9tLXRpbWV8dGltZXpvbmUtZnJvbS1kYXRlVGltZXx0aW1lem9uZS1mcm9tLWRhdGV8c3VtfHN1YnRyYWN0LWRhdGVUaW1lcy15aWVsZGluZy15ZWFyTW9udGhEdXJhdGlvbnxzdWJ0cmFjdC1kYXRlVGltZXMteWllbGRpbmctZGF5VGltZUR1cmF0aW9ufHN1YnN0cmluZy1iZWZvcmV8c3Vic3RyaW5nLWFmdGVyfHN1YnN0cmluZ3xzdWJzZXF1ZW5jZXxzdHJpbmctdG8tY29kZXBvaW50c3xzdHJpbmctcGFkfHN0cmluZy1sZW5ndGh8c3RyaW5nLWpvaW58c3RyaW5nfHN0YXRpYy1iYXNlLXVyaXxzdGFydHMtd2l0aHxzZWNvbmRzLWZyb20tdGltZXxzZWNvbmRzLWZyb20tZHVyYXRpb258c2Vjb25kcy1mcm9tLWRhdGVUaW1lfHJvdW5kLWhhbGYtdG8tZXZlbnxyb3VuZHxyb290fHJldmVyc2V8cmVzb2x2ZS11cml8cmVzb2x2ZS1RTmFtZXxyZXBsYWNlfHJlbW92ZXxRTmFtZXxwcmVmaXgtZnJvbS1RTmFtZXxwb3NpdGlvbnxvbmUtb3ItbW9yZXxudW1iZXJ8bm90fG5vcm1hbGl6ZS11bmljb2RlfG5vcm1hbGl6ZS1zcGFjZXxub2RlLW5hbWV8bm9kZS1raW5kfG5pbGxlZHxuYW1lc3BhY2UtdXJpLWZyb20tUU5hbWV8bmFtZXNwYWNlLXVyaS1mb3ItcHJlZml4fG5hbWVzcGFjZS11cml8bmFtZXxtb250aHMtZnJvbS1kdXJhdGlvbnxtb250aC1mcm9tLWRhdGVUaW1lfG1vbnRoLWZyb20tZGF0ZXxtaW51dGVzLWZyb20tdGltZXxtaW51dGVzLWZyb20tZHVyYXRpb258bWludXRlcy1mcm9tLWRhdGVUaW1lfG1pbnxtYXh8bWF0Y2hlc3xsb3dlci1jYXNlfGxvY2FsLW5hbWUtZnJvbS1RTmFtZXxsb2NhbC1uYW1lfGxhc3R8bGFuZ3xpcmktdG8tdXJpfGluc2VydC1iZWZvcmV8aW5kZXgtb2Z8aW4tc2NvcGUtcHJlZml4ZXN8aW1wbGljaXQtdGltZXpvbmV8aWRyZWZ8aWR8aG91cnMtZnJvbS10aW1lfGhvdXJzLWZyb20tZHVyYXRpb258aG91cnMtZnJvbS1kYXRlVGltZXxmbG9vcnxmYWxzZXxleHBhbmRlZC1RTmFtZXxleGlzdHN8ZXhhY3RseS1vbmV8ZXNjYXBlLXVyaXxlc2NhcGUtaHRtbC11cml8ZXJyb3J8ZW5kcy13aXRofGVuY29kZS1mb3ItdXJpfGVtcHR5fGRvY3VtZW50LXVyaXxkb2MtYXZhaWxhYmxlfGRvY3xkaXN0aW5jdC12YWx1ZXN8ZGlzdGluY3Qtbm9kZXN8ZGVmYXVsdC1jb2xsYXRpb258ZGVlcC1lcXVhbHxkYXlzLWZyb20tZHVyYXRpb258ZGF5LWZyb20tZGF0ZVRpbWV8ZGF5LWZyb20tZGF0ZXxkYXRhfGN1cnJlbnQtdGltZXxjdXJyZW50LWRhdGVUaW1lfGN1cnJlbnQtZGF0ZXxjb3VudHxjb250YWluc3xjb25jYXR8Y29tcGFyZXxjb2xsZWN0aW9ufGNvZGVwb2ludHMtdG8tc3RyaW5nfGNvZGVwb2ludC1lcXVhbHxjZWlsaW5nfGJvb2xlYW58YmFzZS11cml8YXZnfGFkanVzdC10aW1lLXRvLXRpbWV6b25lfGFkanVzdC1kYXRlVGltZS10by10aW1lem9uZXxhZGp1c3QtZGF0ZS10by10aW1lem9uZXxhYnMpXGIvXSwKK1sicGxuIiwvXltcdzotXSsvXSxbInBsbiIsL15bXHRcblxyIFx4YTBdKy9dXSksWyJ4cSIsInhxdWVyeSJdKTsKZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLXlhbWwuanMgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy15YW1sLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzODcyOWIKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy15YW1sLmpzCkBAIC0wLDAgKzEsMiBAQAordmFyIGE9bnVsbDsKK1BSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1sicHVuIiwvXls6Pj98XSsvLGEsIjp8Pj8iXSxbImRlYyIsL14lKD86WUFNTHxUQUcpW15cblxyI10rLyxhLCIlIl0sWyJ0eXAiLC9eJlxTKy8sYSwiJiJdLFsidHlwIiwvXiFcUyovLGEsIiEiXSxbInN0ciIsL14iKD86W14iXFxdfFxcLikqKD86InwkKS8sYSwnIiddLFsic3RyIiwvXicoPzpbXiddfCcnKSooPzonfCQpLyxhLCInIl0sWyJjb20iLC9eI1teXG5ccl0qLyxhLCIjIl0sWyJwbG4iLC9eXHMrLyxhLCIgXHRcclxuIl1dLFtbImRlYyIsL14oPzotLS18XC5cLlwuKSg/OltcblxyXXwkKS9dLFsicHVuIiwvXi0vXSxbImt3ZCIsL15cdys6W1xuXHIgXS9dLFsicGxuIiwvXlx3Ky9dXSksWyJ5YW1sIiwieW1sIl0pOwpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L3ByZXR0aWZ5LmNzcyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9wcmV0dGlmeS5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ0YjNhMgotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9wcmV0dGlmeS5jc3MKQEAgLTAsMCArMSBAQAorLnBsbntjb2xvcjojMDAwfUBtZWRpYSBzY3JlZW57LnN0cntjb2xvcjojMDgwfS5rd2R7Y29sb3I6IzAwOH0uY29te2NvbG9yOiM4MDB9LnR5cHtjb2xvcjojNjA2fS5saXR7Y29sb3I6IzA2Nn0ucHVuLC5vcG4sLmNsb3tjb2xvcjojNjYwfS50YWd7Y29sb3I6IzAwOH0uYXRue2NvbG9yOiM2MDZ9LmF0dntjb2xvcjojMDgwfS5kZWMsLnZhcntjb2xvcjojNjA2fS5mdW57Y29sb3I6cmVkfX1AbWVkaWEgcHJpbnQscHJvamVjdGlvbnsuc3Rye2NvbG9yOiMwNjB9Lmt3ZHtjb2xvcjojMDA2O2ZvbnQtd2VpZ2h0OmJvbGR9LmNvbXtjb2xvcjojNjAwO2ZvbnQtc3R5bGU6aXRhbGljfS50eXB7Y29sb3I6IzQwNDtmb250LXdlaWdodDpib2xkfS5saXR7Y29sb3I6IzA0NH0ucHVuLC5vcG4sLmNsb3tjb2xvcjojNDQwfS50YWd7Y29sb3I6IzAwNjtmb250LXdlaWdodDpib2xkfS5hdG57Y29sb3I6IzQwNH0uYXR2e2NvbG9yOiMwNjB9fXByZS5wcmV0dHlwcmludHtwYWRkaW5nOjJweDtib3JkZXI6MXB4IHNvbGlkICM4ODh9b2wubGluZW51bXN7bWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206MH1saS5MMCxsaS5MMSxsaS5MMixsaS5MMyxsaS5MNSxsaS5MNixsaS5MNyxsaS5MOHtsaXN0LXN0eWxlLXR5cGU6bm9uZX1saS5MMSxsaS5MMyxsaS5MNSxsaS5MNyxsaS5MOXtiYWNrZ3JvdW5kOiNlZWV9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L3ByZXR0aWZ5LmpzIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L3ByZXR0aWZ5LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZjVhZDcKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvcHJldHRpZnkuanMKQEAgLTAsMCArMSwyOCBAQAordmFyIHE9bnVsbDt3aW5kb3cuUFJfU0hPVUxEX1VTRV9DT05USU5VQVRJT049ITA7CisoZnVuY3Rpb24oKXtmdW5jdGlvbiBMKGEpe2Z1bmN0aW9uIG0oYSl7dmFyIGY9YS5jaGFyQ29kZUF0KDApO2lmKGYhPT05MilyZXR1cm4gZjt2YXIgYj1hLmNoYXJBdCgxKTtyZXR1cm4oZj1yW2JdKT9mOiIwIjw9YiYmYjw9IjciP3BhcnNlSW50KGEuc3Vic3RyaW5nKDEpLDgpOmI9PT0idSJ8fGI9PT0ieCI/cGFyc2VJbnQoYS5zdWJzdHJpbmcoMiksMTYpOmEuY2hhckNvZGVBdCgxKX1mdW5jdGlvbiBlKGEpe2lmKGE8MzIpcmV0dXJuKGE8MTY/IlxceDAiOiJcXHgiKSthLnRvU3RyaW5nKDE2KTthPVN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoYT09PSJcXCJ8fGE9PT0iLSJ8fGE9PT0iWyJ8fGE9PT0iXSIpYT0iXFwiK2E7cmV0dXJuIGF9ZnVuY3Rpb24gaChhKXtmb3IodmFyIGY9YS5zdWJzdHJpbmcoMSxhLmxlbmd0aC0xKS5tYXRjaCgvXFx1W1xkQS1GYS1mXXs0fXxcXHhbXGRBLUZhLWZdezJ9fFxcWzAtM11bMC03XXswLDJ9fFxcWzAtN117MSwyfXxcXFtcU1xzXXxbXlxcXS9nKSxhPQorW10sYj1bXSxvPWZbMF09PT0iXiIsYz1vPzE6MCxpPWYubGVuZ3RoO2M8aTsrK2Mpe3ZhciBqPWZbY107aWYoL1xcW2Jkc3ddL2kudGVzdChqKSlhLnB1c2goaik7ZWxzZXt2YXIgaj1tKGopLGQ7YysyPGkmJiItIj09PWZbYysxXT8oZD1tKGZbYysyXSksYys9Mik6ZD1qO2IucHVzaChbaixkXSk7ZDw2NXx8aj4xMjJ8fChkPDY1fHxqPjkwfHxiLnB1c2goW01hdGgubWF4KDY1LGopfDMyLE1hdGgubWluKGQsOTApfDMyXSksZDw5N3x8aj4xMjJ8fGIucHVzaChbTWF0aC5tYXgoOTcsaikmLTMzLE1hdGgubWluKGQsMTIyKSYtMzNdKSl9fWIuc29ydChmdW5jdGlvbihhLGYpe3JldHVybiBhWzBdLWZbMF18fGZbMV0tYVsxXX0pO2Y9W107aj1bTmFOLE5hTl07Zm9yKGM9MDtjPGIubGVuZ3RoOysrYylpPWJbY10saVswXTw9alsxXSsxP2pbMV09TWF0aC5tYXgoalsxXSxpWzFdKTpmLnB1c2goaj1pKTtiPVsiWyJdO28mJmIucHVzaCgiXiIpO2IucHVzaC5hcHBseShiLGEpO2ZvcihjPTA7YzwKK2YubGVuZ3RoOysrYylpPWZbY10sYi5wdXNoKGUoaVswXSkpLGlbMV0+aVswXSYmKGlbMV0rMT5pWzBdJiZiLnB1c2goIi0iKSxiLnB1c2goZShpWzFdKSkpO2IucHVzaCgiXSIpO3JldHVybiBiLmpvaW4oIiIpfWZ1bmN0aW9uIHkoYSl7Zm9yKHZhciBmPWEuc291cmNlLm1hdGNoKC9cWyg/OlteXFxcXV18XFxbXFNcc10pKl18XFx1W1xkQS1GYS1mXXs0fXxcXHhbXGRBLUZhLWZdezJ9fFxcXGQrfFxcW15cZHV4XXxcKFw/WyE6PV18WygpXl18W14oKVtcXF5dKy9nKSxiPWYubGVuZ3RoLGQ9W10sYz0wLGk9MDtjPGI7KytjKXt2YXIgaj1mW2NdO2o9PT0iKCI/KytpOiJcXCI9PT1qLmNoYXJBdCgwKSYmKGo9K2ouc3Vic3RyaW5nKDEpKSYmajw9aSYmKGRbal09LTEpfWZvcihjPTE7YzxkLmxlbmd0aDsrK2MpLTE9PT1kW2NdJiYoZFtjXT0rK3QpO2ZvcihpPWM9MDtjPGI7KytjKWo9ZltjXSxqPT09IigiPygrK2ksZFtpXT09PXZvaWQgMCYmKGZbY109Iig/OiIpKToiXFwiPT09ai5jaGFyQXQoMCkmJgorKGo9K2ouc3Vic3RyaW5nKDEpKSYmajw9aSYmKGZbY109IlxcIitkW2ldKTtmb3IoaT1jPTA7YzxiOysrYykiXiI9PT1mW2NdJiYiXiIhPT1mW2MrMV0mJihmW2NdPSIiKTtpZihhLmlnbm9yZUNhc2UmJnMpZm9yKGM9MDtjPGI7KytjKWo9ZltjXSxhPWouY2hhckF0KDApLGoubGVuZ3RoPj0yJiZhPT09IlsiP2ZbY109aChqKTphIT09IlxcIiYmKGZbY109ai5yZXBsYWNlKC9bQS1aYS16XS9nLGZ1bmN0aW9uKGEpe2E9YS5jaGFyQ29kZUF0KDApO3JldHVybiJbIitTdHJpbmcuZnJvbUNoYXJDb2RlKGEmLTMzLGF8MzIpKyJdIn0pKTtyZXR1cm4gZi5qb2luKCIiKX1mb3IodmFyIHQ9MCxzPSExLGw9ITEscD0wLGQ9YS5sZW5ndGg7cDxkOysrcCl7dmFyIGc9YVtwXTtpZihnLmlnbm9yZUNhc2UpbD0hMDtlbHNlIGlmKC9bYS16XS9pLnRlc3QoZy5zb3VyY2UucmVwbGFjZSgvXFx1W1xkYS1mXXs0fXxcXHhbXGRhLWZdezJ9fFxcW15VWHV4XS9naSwiIikpKXtzPSEwO2w9ITE7YnJlYWt9fWZvcih2YXIgcj0KK3tiOjgsdDo5LG46MTAsdjoxMSxmOjEyLHI6MTN9LG49W10scD0wLGQ9YS5sZW5ndGg7cDxkOysrcCl7Zz1hW3BdO2lmKGcuZ2xvYmFsfHxnLm11bHRpbGluZSl0aHJvdyBFcnJvcigiIitnKTtuLnB1c2goIig/OiIreShnKSsiKSIpfXJldHVybiBSZWdFeHAobi5qb2luKCJ8IiksbD8iZ2kiOiJnIil9ZnVuY3Rpb24gTShhKXtmdW5jdGlvbiBtKGEpe3N3aXRjaChhLm5vZGVUeXBlKXtjYXNlIDE6aWYoZS50ZXN0KGEuY2xhc3NOYW1lKSlicmVhaztmb3IodmFyIGc9YS5maXJzdENoaWxkO2c7Zz1nLm5leHRTaWJsaW5nKW0oZyk7Zz1hLm5vZGVOYW1lO2lmKCJCUiI9PT1nfHwiTEkiPT09ZyloW3NdPSJcbiIsdFtzPDwxXT15KyssdFtzKys8PDF8MV09YTticmVhaztjYXNlIDM6Y2FzZSA0Omc9YS5ub2RlVmFsdWUsZy5sZW5ndGgmJihnPXA/Zy5yZXBsYWNlKC9cclxuPy9nLCJcbiIpOmcucmVwbGFjZSgvW1x0XG5cciBdKy9nLCIgIiksaFtzXT1nLHRbczw8MV09eSx5Kz1nLmxlbmd0aCwKK3RbcysrPDwxfDFdPWEpfX12YXIgZT0vKD86Xnxccylub2NvZGUoPzpcc3wkKS8saD1bXSx5PTAsdD1bXSxzPTAsbDthLmN1cnJlbnRTdHlsZT9sPWEuY3VycmVudFN0eWxlLndoaXRlU3BhY2U6d2luZG93LmdldENvbXB1dGVkU3R5bGUmJihsPWRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoYSxxKS5nZXRQcm9wZXJ0eVZhbHVlKCJ3aGl0ZS1zcGFjZSIpKTt2YXIgcD1sJiYicHJlIj09PWwuc3Vic3RyaW5nKDAsMyk7bShhKTtyZXR1cm57YTpoLmpvaW4oIiIpLnJlcGxhY2UoL1xuJC8sIiIpLGM6dH19ZnVuY3Rpb24gQihhLG0sZSxoKXttJiYoYT17YTptLGQ6YX0sZShhKSxoLnB1c2guYXBwbHkoaCxhLmUpKX1mdW5jdGlvbiB4KGEsbSl7ZnVuY3Rpb24gZShhKXtmb3IodmFyIGw9YS5kLHA9W2wsInBsbiJdLGQ9MCxnPWEuYS5tYXRjaCh5KXx8W10scj17fSxuPTAsej1nLmxlbmd0aDtuPHo7KytuKXt2YXIgZj1nW25dLGI9cltmXSxvPXZvaWQgMCxjO2lmKHR5cGVvZiBiPT09Cisic3RyaW5nIiljPSExO2Vsc2V7dmFyIGk9aFtmLmNoYXJBdCgwKV07aWYoaSlvPWYubWF0Y2goaVsxXSksYj1pWzBdO2Vsc2V7Zm9yKGM9MDtjPHQ7KytjKWlmKGk9bVtjXSxvPWYubWF0Y2goaVsxXSkpe2I9aVswXTticmVha31vfHwoYj0icGxuIil9aWYoKGM9Yi5sZW5ndGg+PTUmJiJsYW5nLSI9PT1iLnN1YnN0cmluZygwLDUpKSYmIShvJiZ0eXBlb2Ygb1sxXT09PSJzdHJpbmciKSljPSExLGI9InNyYyI7Y3x8KHJbZl09Yil9aT1kO2QrPWYubGVuZ3RoO2lmKGMpe2M9b1sxXTt2YXIgaj1mLmluZGV4T2YoYyksaz1qK2MubGVuZ3RoO29bMl0mJihrPWYubGVuZ3RoLW9bMl0ubGVuZ3RoLGo9ay1jLmxlbmd0aCk7Yj1iLnN1YnN0cmluZyg1KTtCKGwraSxmLnN1YnN0cmluZygwLGopLGUscCk7QihsK2kraixjLEMoYixjKSxwKTtCKGwraStrLGYuc3Vic3RyaW5nKGspLGUscCl9ZWxzZSBwLnB1c2gobCtpLGIpfWEuZT1wfXZhciBoPXt9LHk7KGZ1bmN0aW9uKCl7Zm9yKHZhciBlPWEuY29uY2F0KG0pLAorbD1bXSxwPXt9LGQ9MCxnPWUubGVuZ3RoO2Q8ZzsrK2Qpe3ZhciByPWVbZF0sbj1yWzNdO2lmKG4pZm9yKHZhciBrPW4ubGVuZ3RoOy0taz49MDspaFtuLmNoYXJBdChrKV09cjtyPXJbMV07bj0iIityO3AuaGFzT3duUHJvcGVydHkobil8fChsLnB1c2gocikscFtuXT1xKX1sLnB1c2goL1tcU1xzXS8pO3k9TChsKX0pKCk7dmFyIHQ9bS5sZW5ndGg7cmV0dXJuIGV9ZnVuY3Rpb24gdShhKXt2YXIgbT1bXSxlPVtdO2EudHJpcGxlUXVvdGVkU3RyaW5ncz9tLnB1c2goWyJzdHIiLC9eKD86JycnKD86W14nXFxdfFxcW1xTXHNdfCcnPyg/PVteJ10pKSooPzonJyd8JCl8IiIiKD86W14iXFxdfFxcW1xTXHNdfCIiPyg/PVteIl0pKSooPzoiIiJ8JCl8Jyg/OlteJ1xcXXxcXFtcU1xzXSkqKD86J3wkKXwiKD86W14iXFxdfFxcW1xTXHNdKSooPzoifCQpKS8scSwiJ1wiIl0pOmEubXVsdGlMaW5lU3RyaW5ncz9tLnB1c2goWyJzdHIiLC9eKD86Jyg/OlteJ1xcXXxcXFtcU1xzXSkqKD86J3wkKXwiKD86W14iXFxdfFxcW1xTXHNdKSooPzoifCQpfGAoPzpbXlxcYF18XFxbXFNcc10pKig/OmB8JCkpLywKK3EsIidcImAiXSk6bS5wdXNoKFsic3RyIiwvXig/OicoPzpbXlxuXHInXFxdfFxcLikqKD86J3wkKXwiKD86W15cblxyIlxcXXxcXC4pKig/OiJ8JCkpLyxxLCJcIiciXSk7YS52ZXJiYXRpbVN0cmluZ3MmJmUucHVzaChbInN0ciIsL15AIig/OlteIl18IiIpKig/OiJ8JCkvLHFdKTt2YXIgaD1hLmhhc2hDb21tZW50cztoJiYoYS5jU3R5bGVDb21tZW50cz8oaD4xP20ucHVzaChbImNvbSIsL14jKD86IyMoPzpbXiNdfCMoPyEjIykpKig/OiMjI3wkKXwuKikvLHEsIiMiXSk6bS5wdXNoKFsiY29tIiwvXiMoPzooPzpkZWZpbmV8ZWxpZnxlbHNlfGVuZGlmfGVycm9yfGlmZGVmfGluY2x1ZGV8aWZuZGVmfGxpbmV8cHJhZ21hfHVuZGVmfHdhcm5pbmcpXGJ8W15cblxyXSopLyxxLCIjIl0pLGUucHVzaChbInN0ciIsL148KD86KD86KD86XC5cLlwvKSp8XC8/KSg/Oltcdy1dKyg/OlwvW1x3LV0rKSspP1tcdy1dK1wuaHxbYS16XVx3Kik+LyxxXSkpOm0ucHVzaChbImNvbSIsL14jW15cblxyXSovLAorcSwiIyJdKSk7YS5jU3R5bGVDb21tZW50cyYmKGUucHVzaChbImNvbSIsL15cL1wvW15cblxyXSovLHFdKSxlLnB1c2goWyJjb20iLC9eXC9cKltcU1xzXSo/KD86XCpcL3wkKS8scV0pKTthLnJlZ2V4TGl0ZXJhbHMmJmUucHVzaChbImxhbmctcmVnZXgiLC9eKD86Xl5cLj98WyErLV18IT18IT09fCN8JXwlPXwmfCYmfCYmPXwmPXxcKHxcKnxcKj18XCs9fCx8LT18LT58XC98XC89fDp8Ojp8O3w8fDw8fDw8PXw8PXw9fD09fD09PXw+fD49fD4+fD4+PXw+Pj58Pj4+PXxbP0BbXl18XF49fFxeXF58XF5cXj18e3xcfHxcfD18XHxcfHxcfFx8PXx+fGJyZWFrfGNhc2V8Y29udGludWV8ZGVsZXRlfGRvfGVsc2V8ZmluYWxseXxpbnN0YW5jZW9mfHJldHVybnx0aHJvd3x0cnl8dHlwZW9mKVxzKihcLyg/PVteKi9dKSg/OlteL1tcXF18XFxbXFNcc118XFsoPzpbXlxcXF1dfFxcW1xTXHNdKSooPzpdfCQpKStcLykvXSk7KGg9YS50eXBlcykmJmUucHVzaChbInR5cCIsaF0pO2E9KCIiK2Eua2V5d29yZHMpLnJlcGxhY2UoL14gfCAkL2csCisiIik7YS5sZW5ndGgmJmUucHVzaChbImt3ZCIsUmVnRXhwKCJeKD86IithLnJlcGxhY2UoL1tccyxdKy9nLCJ8IikrIilcXGIiKSxxXSk7bS5wdXNoKFsicGxuIiwvXlxzKy8scSwiIFxyXG5cdFx4YTAiXSk7ZS5wdXNoKFsibGl0IiwvXkBbJF9hLXpdW1x3JEBdKi9pLHFdLFsidHlwIiwvXig/OltAX10/W0EtWl0rW2Etel1bXHckQF0qfFx3K190XGIpLyxxXSxbInBsbiIsL15bJF9hLXpdW1x3JEBdKi9pLHFdLFsibGl0IiwvXig/OjB4W1xkYS1mXSt8KD86XGQoPzpfXGQrKSpcZCooPzpcLlxkKik/fFwuXGRcKykoPzplWystXT9cZCspPylbYS16XSovaSxxLCIwMTIzNDU2Nzg5Il0sWyJwbG4iLC9eXFxbXFNcc10/LyxxXSxbInB1biIsL14uW15cc1x3Ii0kJy4vQFxcYF0qLyxxXSk7cmV0dXJuIHgobSxlKX1mdW5jdGlvbiBEKGEsbSl7ZnVuY3Rpb24gZShhKXtzd2l0Y2goYS5ub2RlVHlwZSl7Y2FzZSAxOmlmKGsudGVzdChhLmNsYXNzTmFtZSkpYnJlYWs7aWYoIkJSIj09PWEubm9kZU5hbWUpaChhKSwKK2EucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGEpO2Vsc2UgZm9yKGE9YS5maXJzdENoaWxkO2E7YT1hLm5leHRTaWJsaW5nKWUoYSk7YnJlYWs7Y2FzZSAzOmNhc2UgNDppZihwKXt2YXIgYj1hLm5vZGVWYWx1ZSxkPWIubWF0Y2godCk7aWYoZCl7dmFyIGM9Yi5zdWJzdHJpbmcoMCxkLmluZGV4KTthLm5vZGVWYWx1ZT1jOyhiPWIuc3Vic3RyaW5nKGQuaW5kZXgrZFswXS5sZW5ndGgpKSYmYS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzLmNyZWF0ZVRleHROb2RlKGIpLGEubmV4dFNpYmxpbmcpO2goYSk7Y3x8YS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGEpfX19fWZ1bmN0aW9uIGgoYSl7ZnVuY3Rpb24gYihhLGQpe3ZhciBlPWQ/YS5jbG9uZU5vZGUoITEpOmEsZj1hLnBhcmVudE5vZGU7aWYoZil7dmFyIGY9YihmLDEpLGc9YS5uZXh0U2libGluZztmLmFwcGVuZENoaWxkKGUpO2Zvcih2YXIgaD1nO2g7aD1nKWc9aC5uZXh0U2libGluZyxmLmFwcGVuZENoaWxkKGgpfXJldHVybiBlfQorZm9yKDshYS5uZXh0U2libGluZzspaWYoYT1hLnBhcmVudE5vZGUsIWEpcmV0dXJuO2Zvcih2YXIgYT1iKGEubmV4dFNpYmxpbmcsMCksZTsoZT1hLnBhcmVudE5vZGUpJiZlLm5vZGVUeXBlPT09MTspYT1lO2QucHVzaChhKX12YXIgaz0vKD86Xnxccylub2NvZGUoPzpcc3wkKS8sdD0vXHJcbj98XG4vLHM9YS5vd25lckRvY3VtZW50LGw7YS5jdXJyZW50U3R5bGU/bD1hLmN1cnJlbnRTdHlsZS53aGl0ZVNwYWNlOndpbmRvdy5nZXRDb21wdXRlZFN0eWxlJiYobD1zLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoYSxxKS5nZXRQcm9wZXJ0eVZhbHVlKCJ3aGl0ZS1zcGFjZSIpKTt2YXIgcD1sJiYicHJlIj09PWwuc3Vic3RyaW5nKDAsMyk7Zm9yKGw9cy5jcmVhdGVFbGVtZW50KCJMSSIpO2EuZmlyc3RDaGlsZDspbC5hcHBlbmRDaGlsZChhLmZpcnN0Q2hpbGQpO2Zvcih2YXIgZD1bbF0sZz0wO2c8ZC5sZW5ndGg7KytnKWUoZFtnXSk7bT09PShtfDApJiZkWzBdLnNldEF0dHJpYnV0ZSgidmFsdWUiLAorbSk7dmFyIHI9cy5jcmVhdGVFbGVtZW50KCJPTCIpO3IuY2xhc3NOYW1lPSJsaW5lbnVtcyI7Zm9yKHZhciBuPU1hdGgubWF4KDAsbS0xfDApfHwwLGc9MCx6PWQubGVuZ3RoO2c8ejsrK2cpbD1kW2ddLGwuY2xhc3NOYW1lPSJMIisoZytuKSUxMCxsLmZpcnN0Q2hpbGR8fGwuYXBwZW5kQ2hpbGQocy5jcmVhdGVUZXh0Tm9kZSgiXHhhMCIpKSxyLmFwcGVuZENoaWxkKGwpO2EuYXBwZW5kQ2hpbGQocil9ZnVuY3Rpb24gayhhLG0pe2Zvcih2YXIgZT1tLmxlbmd0aDstLWU+PTA7KXt2YXIgaD1tW2VdO0EuaGFzT3duUHJvcGVydHkoaCk/d2luZG93LmNvbnNvbGUmJmNvbnNvbGUud2FybigiY2Fubm90IG92ZXJyaWRlIGxhbmd1YWdlIGhhbmRsZXIgJXMiLGgpOkFbaF09YX19ZnVuY3Rpb24gQyhhLG0pe2lmKCFhfHwhQS5oYXNPd25Qcm9wZXJ0eShhKSlhPS9eXHMqPC8udGVzdChtKT8iZGVmYXVsdC1tYXJrdXAiOiJkZWZhdWx0LWNvZGUiO3JldHVybiBBW2FdfWZ1bmN0aW9uIEUoYSl7dmFyIG09CithLmc7dHJ5e3ZhciBlPU0oYS5oKSxoPWUuYTthLmE9aDthLmM9ZS5jO2EuZD0wO0MobSxoKShhKTt2YXIgaz0vXGJNU0lFXGIvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksbT0vXG4vZyx0PWEuYSxzPXQubGVuZ3RoLGU9MCxsPWEuYyxwPWwubGVuZ3RoLGg9MCxkPWEuZSxnPWQubGVuZ3RoLGE9MDtkW2ddPXM7dmFyIHIsbjtmb3Iobj1yPTA7bjxnOylkW25dIT09ZFtuKzJdPyhkW3IrK109ZFtuKytdLGRbcisrXT1kW24rK10pOm4rPTI7Zz1yO2ZvcihuPXI9MDtuPGc7KXtmb3IodmFyIHo9ZFtuXSxmPWRbbisxXSxiPW4rMjtiKzI8PWcmJmRbYisxXT09PWY7KWIrPTI7ZFtyKytdPXo7ZFtyKytdPWY7bj1ifWZvcihkLmxlbmd0aD1yO2g8cDspe3ZhciBvPWxbaCsyXXx8cyxjPWRbYSsyXXx8cyxiPU1hdGgubWluKG8sYyksaT1sW2grMV0sajtpZihpLm5vZGVUeXBlIT09MSYmKGo9dC5zdWJzdHJpbmcoZSxiKSkpe2smJihqPWoucmVwbGFjZShtLCJcciIpKTtpLm5vZGVWYWx1ZT0KK2o7dmFyIHU9aS5vd25lckRvY3VtZW50LHY9dS5jcmVhdGVFbGVtZW50KCJTUEFOIik7di5jbGFzc05hbWU9ZFthKzFdO3ZhciB4PWkucGFyZW50Tm9kZTt4LnJlcGxhY2VDaGlsZCh2LGkpO3YuYXBwZW5kQ2hpbGQoaSk7ZTxvJiYobFtoKzFdPWk9dS5jcmVhdGVUZXh0Tm9kZSh0LnN1YnN0cmluZyhiLG8pKSx4Lmluc2VydEJlZm9yZShpLHYubmV4dFNpYmxpbmcpKX1lPWI7ZT49byYmKGgrPTIpO2U+PWMmJihhKz0yKX19Y2F0Y2godyl7ImNvbnNvbGUiaW4gd2luZG93JiZjb25zb2xlLmxvZyh3JiZ3LnN0YWNrP3cuc3RhY2s6dyl9fXZhciB2PVsiYnJlYWssY29udGludWUsZG8sZWxzZSxmb3IsaWYscmV0dXJuLHdoaWxlIl0sdz1bW3YsImF1dG8sY2FzZSxjaGFyLGNvbnN0LGRlZmF1bHQsZG91YmxlLGVudW0sZXh0ZXJuLGZsb2F0LGdvdG8saW50LGxvbmcscmVnaXN0ZXIsc2hvcnQsc2lnbmVkLHNpemVvZixzdGF0aWMsc3RydWN0LHN3aXRjaCx0eXBlZGVmLHVuaW9uLHVuc2lnbmVkLHZvaWQsdm9sYXRpbGUiXSwKKyJjYXRjaCxjbGFzcyxkZWxldGUsZmFsc2UsaW1wb3J0LG5ldyxvcGVyYXRvcixwcml2YXRlLHByb3RlY3RlZCxwdWJsaWMsdGhpcyx0aHJvdyx0cnVlLHRyeSx0eXBlb2YiXSxGPVt3LCJhbGlnbm9mLGFsaWduX3VuaW9uLGFzbSxheGlvbSxib29sLGNvbmNlcHQsY29uY2VwdF9tYXAsY29uc3RfY2FzdCxjb25zdGV4cHIsZGVjbHR5cGUsZHluYW1pY19jYXN0LGV4cGxpY2l0LGV4cG9ydCxmcmllbmQsaW5saW5lLGxhdGVfY2hlY2ssbXV0YWJsZSxuYW1lc3BhY2UsbnVsbHB0cixyZWludGVycHJldF9jYXN0LHN0YXRpY19hc3NlcnQsc3RhdGljX2Nhc3QsdGVtcGxhdGUsdHlwZWlkLHR5cGVuYW1lLHVzaW5nLHZpcnR1YWwsd2hlcmUiXSxHPVt3LCJhYnN0cmFjdCxib29sZWFuLGJ5dGUsZXh0ZW5kcyxmaW5hbCxmaW5hbGx5LGltcGxlbWVudHMsaW1wb3J0LGluc3RhbmNlb2YsbnVsbCxuYXRpdmUscGFja2FnZSxzdHJpY3RmcCxzdXBlcixzeW5jaHJvbml6ZWQsdGhyb3dzLHRyYW5zaWVudCJdLAorSD1bRywiYXMsYmFzZSxieSxjaGVja2VkLGRlY2ltYWwsZGVsZWdhdGUsZGVzY2VuZGluZyxkeW5hbWljLGV2ZW50LGZpeGVkLGZvcmVhY2gsZnJvbSxncm91cCxpbXBsaWNpdCxpbixpbnRlcmZhY2UsaW50ZXJuYWwsaW50byxpcyxsb2NrLG9iamVjdCxvdXQsb3ZlcnJpZGUsb3JkZXJieSxwYXJhbXMscGFydGlhbCxyZWFkb25seSxyZWYsc2J5dGUsc2VhbGVkLHN0YWNrYWxsb2Msc3RyaW5nLHNlbGVjdCx1aW50LHVsb25nLHVuY2hlY2tlZCx1bnNhZmUsdXNob3J0LHZhciJdLHc9W3csImRlYnVnZ2VyLGV2YWwsZXhwb3J0LGZ1bmN0aW9uLGdldCxudWxsLHNldCx1bmRlZmluZWQsdmFyLHdpdGgsSW5maW5pdHksTmFOIl0sST1bdiwiYW5kLGFzLGFzc2VydCxjbGFzcyxkZWYsZGVsLGVsaWYsZXhjZXB0LGV4ZWMsZmluYWxseSxmcm9tLGdsb2JhbCxpbXBvcnQsaW4saXMsbGFtYmRhLG5vbmxvY2FsLG5vdCxvcixwYXNzLHByaW50LHJhaXNlLHRyeSx3aXRoLHlpZWxkLEZhbHNlLFRydWUsTm9uZSJdLAorSj1bdiwiYWxpYXMsYW5kLGJlZ2luLGNhc2UsY2xhc3MsZGVmLGRlZmluZWQsZWxzaWYsZW5kLGVuc3VyZSxmYWxzZSxpbixtb2R1bGUsbmV4dCxuaWwsbm90LG9yLHJlZG8scmVzY3VlLHJldHJ5LHNlbGYsc3VwZXIsdGhlbix0cnVlLHVuZGVmLHVubGVzcyx1bnRpbCx3aGVuLHlpZWxkLEJFR0lOLEVORCJdLHY9W3YsImNhc2UsZG9uZSxlbGlmLGVzYWMsZXZhbCxmaSxmdW5jdGlvbixpbixsb2NhbCxzZXQsdGhlbix1bnRpbCJdLEs9L14oRElSfEZJTEV8dmVjdG9yfChkZXxwcmlvcml0eV8pP3F1ZXVlfGxpc3R8c3RhY2t8KGNvbnN0Xyk/aXRlcmF0b3J8KG11bHRpKT8oc2V0fG1hcCl8Yml0c2V0fHU/KGludHxmbG9hdClcZCopLyxOPS9cUy8sTz11KHtrZXl3b3JkczpbRixILHcsImNhbGxlcixkZWxldGUsZGllLGRvLGR1bXAsZWxzaWYsZXZhbCxleGl0LGZvcmVhY2gsZm9yLGdvdG8saWYsaW1wb3J0LGxhc3QsbG9jYWwsbXksbmV4dCxubyxvdXIscHJpbnQscGFja2FnZSxyZWRvLHJlcXVpcmUsc3ViLHVuZGVmLHVubGVzcyx1bnRpbCx1c2Usd2FudGFycmF5LHdoaWxlLEJFR0lOLEVORCIrCitJLEosdl0saGFzaENvbW1lbnRzOiEwLGNTdHlsZUNvbW1lbnRzOiEwLG11bHRpTGluZVN0cmluZ3M6ITAscmVnZXhMaXRlcmFsczohMH0pLEE9e307ayhPLFsiZGVmYXVsdC1jb2RlIl0pO2soeChbXSxbWyJwbG4iLC9eW148P10rL10sWyJkZWMiLC9ePCFcd1tePl0qKD86PnwkKS9dLFsiY29tIiwvXjxcIS0tW1xTXHNdKj8oPzotLVw+fCQpL10sWyJsYW5nLSIsL148XD8oW1xTXHNdKz8pKD86XD8+fCQpL10sWyJsYW5nLSIsL148JShbXFNcc10rPykoPzolPnwkKS9dLFsicHVuIiwvXig/OjxbJT9dfFslP10+KS9dLFsibGFuZy0iLC9ePHhtcFxiW14+XSo+KFtcU1xzXSs/KTxcL3htcFxiW14+XSo+L2ldLFsibGFuZy1qcyIsL148c2NyaXB0XGJbXj5dKj4oW1xTXHNdKj8pKDxcL3NjcmlwdFxiW14+XSo+KS9pXSxbImxhbmctY3NzIiwvXjxzdHlsZVxiW14+XSo+KFtcU1xzXSo/KSg8XC9zdHlsZVxiW14+XSo+KS9pXSxbImxhbmctaW4udGFnIiwvXig8XC8/W2Etel1bXjw+XSo+KS9pXV0pLAorWyJkZWZhdWx0LW1hcmt1cCIsImh0bSIsImh0bWwiLCJteG1sIiwieGh0bWwiLCJ4bWwiLCJ4c2wiXSk7ayh4KFtbInBsbiIsL15ccysvLHEsIiBcdFxyXG4iXSxbImF0diIsL14oPzoiW14iXSoiP3wnW14nXSonPykvLHEsIlwiJyJdXSxbWyJ0YWciLC9eXjxcLz9bYS16XSg/Oltcdy0uOl0qXHcpP3xcLz8+JC9pXSxbImF0biIsL14oPyFzdHlsZVtccz1dfG9uKVthLXpdKD86W1x3Oi1dKlx3KT8vaV0sWyJsYW5nLXVxLnZhbCIsL149XHMqKFteXHMiJz5dKig/OlteXHMiJy8+XXxcLyg/PVxzKSkpL10sWyJwdW4iLC9eWy88LT5dKy9dLFsibGFuZy1qcyIsL15vblx3K1xzKj1ccyoiKFteIl0rKSIvaV0sWyJsYW5nLWpzIiwvXm9uXHcrXHMqPVxzKicoW14nXSspJy9pXSxbImxhbmctanMiLC9eb25cdytccyo9XHMqKFteXHMiJz5dKykvaV0sWyJsYW5nLWNzcyIsL15zdHlsZVxzKj1ccyoiKFteIl0rKSIvaV0sWyJsYW5nLWNzcyIsL15zdHlsZVxzKj1ccyonKFteJ10rKScvaV0sWyJsYW5nLWNzcyIsCisvXnN0eWxlXHMqPVxzKihbXlxzIic+XSspL2ldXSksWyJpbi50YWciXSk7ayh4KFtdLFtbImF0diIsL15bXFNcc10rL11dKSxbInVxLnZhbCJdKTtrKHUoe2tleXdvcmRzOkYsaGFzaENvbW1lbnRzOiEwLGNTdHlsZUNvbW1lbnRzOiEwLHR5cGVzOkt9KSxbImMiLCJjYyIsImNwcCIsImN4eCIsImN5YyIsIm0iXSk7ayh1KHtrZXl3b3JkczoibnVsbCx0cnVlLGZhbHNlIn0pLFsianNvbiJdKTtrKHUoe2tleXdvcmRzOkgsaGFzaENvbW1lbnRzOiEwLGNTdHlsZUNvbW1lbnRzOiEwLHZlcmJhdGltU3RyaW5nczohMCx0eXBlczpLfSksWyJjcyJdKTtrKHUoe2tleXdvcmRzOkcsY1N0eWxlQ29tbWVudHM6ITB9KSxbImphdmEiXSk7ayh1KHtrZXl3b3Jkczp2LGhhc2hDb21tZW50czohMCxtdWx0aUxpbmVTdHJpbmdzOiEwfSksWyJic2giLCJjc2giLCJzaCJdKTtrKHUoe2tleXdvcmRzOkksaGFzaENvbW1lbnRzOiEwLG11bHRpTGluZVN0cmluZ3M6ITAsdHJpcGxlUXVvdGVkU3RyaW5nczohMH0pLAorWyJjdiIsInB5Il0pO2sodSh7a2V5d29yZHM6ImNhbGxlcixkZWxldGUsZGllLGRvLGR1bXAsZWxzaWYsZXZhbCxleGl0LGZvcmVhY2gsZm9yLGdvdG8saWYsaW1wb3J0LGxhc3QsbG9jYWwsbXksbmV4dCxubyxvdXIscHJpbnQscGFja2FnZSxyZWRvLHJlcXVpcmUsc3ViLHVuZGVmLHVubGVzcyx1bnRpbCx1c2Usd2FudGFycmF5LHdoaWxlLEJFR0lOLEVORCIsaGFzaENvbW1lbnRzOiEwLG11bHRpTGluZVN0cmluZ3M6ITAscmVnZXhMaXRlcmFsczohMH0pLFsicGVybCIsInBsIiwicG0iXSk7ayh1KHtrZXl3b3JkczpKLGhhc2hDb21tZW50czohMCxtdWx0aUxpbmVTdHJpbmdzOiEwLHJlZ2V4TGl0ZXJhbHM6ITB9KSxbInJiIl0pO2sodSh7a2V5d29yZHM6dyxjU3R5bGVDb21tZW50czohMCxyZWdleExpdGVyYWxzOiEwfSksWyJqcyJdKTtrKHUoe2tleXdvcmRzOiJhbGwsYW5kLGJ5LGNhdGNoLGNsYXNzLGVsc2UsZXh0ZW5kcyxmYWxzZSxmaW5hbGx5LGZvcixpZixpbixpcyxpc250LGxvb3AsbmV3LG5vLG5vdCxudWxsLG9mLG9mZixvbixvcixyZXR1cm4sc3VwZXIsdGhlbix0cnVlLHRyeSx1bmxlc3MsdW50aWwsd2hlbix3aGlsZSx5ZXMiLAoraGFzaENvbW1lbnRzOjMsY1N0eWxlQ29tbWVudHM6ITAsbXVsdGlsaW5lU3RyaW5nczohMCx0cmlwbGVRdW90ZWRTdHJpbmdzOiEwLHJlZ2V4TGl0ZXJhbHM6ITB9KSxbImNvZmZlZSJdKTtrKHgoW10sW1sic3RyIiwvXltcU1xzXSsvXV0pLFsicmVnZXgiXSk7d2luZG93LnByZXR0eVByaW50T25lPWZ1bmN0aW9uKGEsbSxlKXt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJQUkUiKTtoLmlubmVySFRNTD1hO2UmJkQoaCxlKTtFKHtnOm0saTplLGg6aH0pO3JldHVybiBoLmlubmVySFRNTH07d2luZG93LnByZXR0eVByaW50PWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIG0oKXtmb3IodmFyIGU9d2luZG93LlBSX1NIT1VMRF9VU0VfQ09OVElOVUFUSU9OP2wubm93KCkrMjUwOkluZmluaXR5O3A8aC5sZW5ndGgmJmwubm93KCk8ZTtwKyspe3ZhciBuPWhbcF0saz1uLmNsYXNzTmFtZTtpZihrLmluZGV4T2YoInByZXR0eXByaW50Iik+PTApe3ZhciBrPWsubWF0Y2goZyksZixiO2lmKGI9Cishayl7Yj1uO2Zvcih2YXIgbz12b2lkIDAsYz1iLmZpcnN0Q2hpbGQ7YztjPWMubmV4dFNpYmxpbmcpdmFyIGk9Yy5ub2RlVHlwZSxvPWk9PT0xP28/YjpjOmk9PT0zP04udGVzdChjLm5vZGVWYWx1ZSk/YjpvOm87Yj0oZj1vPT09Yj92b2lkIDA6bykmJiJDT0RFIj09PWYudGFnTmFtZX1iJiYoaz1mLmNsYXNzTmFtZS5tYXRjaChnKSk7ayYmKGs9a1sxXSk7Yj0hMTtmb3Iobz1uLnBhcmVudE5vZGU7bztvPW8ucGFyZW50Tm9kZSlpZigoby50YWdOYW1lPT09InByZSJ8fG8udGFnTmFtZT09PSJjb2RlInx8by50YWdOYW1lPT09InhtcCIpJiZvLmNsYXNzTmFtZSYmby5jbGFzc05hbWUuaW5kZXhPZigicHJldHR5cHJpbnQiKT49MCl7Yj0hMDticmVha31ifHwoKGI9KGI9bi5jbGFzc05hbWUubWF0Y2goL1xibGluZW51bXNcYig/OjooXGQrKSk/LykpP2JbMV0mJmJbMV0ubGVuZ3RoPytiWzFdOiEwOiExKSYmRChuLGIpLGQ9e2c6ayxoOm4saTpifSxFKGQpKX19cDxoLmxlbmd0aD9zZXRUaW1lb3V0KG0sCisyNTApOmEmJmEoKX1mb3IodmFyIGU9W2RvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwcmUiKSxkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiY29kZSIpLGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ4bXAiKV0saD1bXSxrPTA7azxlLmxlbmd0aDsrK2spZm9yKHZhciB0PTAscz1lW2tdLmxlbmd0aDt0PHM7Kyt0KWgucHVzaChlW2tdW3RdKTt2YXIgZT1xLGw9RGF0ZTtsLm5vd3x8KGw9e25vdzpmdW5jdGlvbigpe3JldHVybituZXcgRGF0ZX19KTt2YXIgcD0wLGQsZz0vXGJsYW5nKD86dWFnZSk/LShbXHcuXSspKD8hXFMpLzttKCl9O3dpbmRvdy5QUj17Y3JlYXRlU2ltcGxlTGV4ZXI6eCxyZWdpc3RlckxhbmdIYW5kbGVyOmssc291cmNlRGVjb3JhdG9yOnUsUFJfQVRUUklCX05BTUU6ImF0biIsUFJfQVRUUklCX1ZBTFVFOiJhdHYiLFBSX0NPTU1FTlQ6ImNvbSIsUFJfREVDTEFSQVRJT046ImRlYyIsUFJfS0VZV09SRDoia3dkIixQUl9MSVRFUkFMOiJsaXQiLAorUFJfTk9DT0RFOiJub2NvZGUiLFBSX1BMQUlOOiJwbG4iLFBSX1BVTkNUVUFUSU9OOiJwdW4iLFBSX1NPVVJDRToic3JjIixQUl9TVFJJTkc6InN0ciIsUFJfVEFHOiJ0YWciLFBSX1RZUEU6InR5cCJ9fSkoKTsKZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3RlbXBsYXRlcy9Db21tb24uc295IGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvdGVtcGxhdGVzL0NvbW1vbi5zb3kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI5N2QzMQotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3RlbXBsYXRlcy9Db21tb24uc295CkBAIC0wLDAgKzEsOTUgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCit7bmFtZXNwYWNlIGdpdGlsZXMgYXV0b2VzY2FwZT0iY29udGV4dHVhbCJ9CisKKy8qKgorICogQ29tbW9uIGhlYWRlciBmb3IgR2l0aWxlcy4KKyAqCisgKiBAcGFyYW0gdGl0bGUgdGl0bGUgZm9yIHRoaXMgcGFnZS4gQWx3YXlzIHN1ZmZpeGVkIHdpdGggcmVwb3NpdG9yeSBuYW1lIGFuZCBhCisgKiAgICAgc2l0ZXdpZGUgdGl0bGUuCisgKiBAcGFyYW0/IHJlcG9zaXRvcnlOYW1lIHJlcG9zaXRvcnkgbmFtZSBmb3IgdGhpcyBwYWdlLCBpZiBhcHBsaWNhYmxlLgorICogQHBhcmFtPyBtZW51RW50cmllcyBvcHRpb25hbCBsaXN0IG9mIG1lbnUgZW50cmllcyB3aXRoICJ0ZXh0IiBhbmQgb3B0aW9uYWwKKyAqICAgICAidXJsIiBrZXlzLgorICogQHBhcmFtIGJyZWFkY3J1bWJzIG5hdmlnYXRpb24gYnJlYWRjcnVtYnMgZm9yIHRoaXMgcGFnZS4KKyAqIEBwYXJhbT8gY3NzIG9wdGlvbmFsIGxpc3Qgb2YgQ1NTIFVSTHMgdG8gaW5jbHVkZS4KKyAqIEBwYXJhbT8ganMgb3B0aW9uYWwgbGlzdCBvZiBKYXZhc2NyaXB0IFVSTHMgdG8gaW5jbHVkZS4KKyAqIEBwYXJhbT8gb25Mb2FkIG9wdGlvbmFsIEphdmFzY3JpcHQgdG8gZXhlY3V0ZSBpbiB0aGUgYm9keSdzIG9uTG9hZCBoYW5kbGVyLgorICogICAgIFdhcm5pbmc6IG5vdCBhdXRvZXNjYXBlZC4KKyAqLwore3RlbXBsYXRlIC5oZWFkZXJ9Cis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9zdHJpY3QuZHRkIj4KKzxodG1sPgorPGhlYWQ+CisgIDx0aXRsZT4KKyAgICB7JHRpdGxlfQorICAgIHtpZiAkcmVwb3NpdG9yeU5hbWV9CisgICAgICB7c3B9LSB7JHJlcG9zaXRvcnlOYW1lfQorICAgIHsvaWZ9CisgICAge3NwfS0ge21zZyBkZXNjPSJuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiJ9R2l0IGF0IEdvb2dsZXsvbXNnfQorICA8L3RpdGxlPgorICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIvL3d3dy5nb29nbGUuY29tL2Nzcy9nby5jc3MiIC8+CisKKyAge2lmICRjc3MgYW5kIGxlbmd0aCgkY3NzKX0KKyAgICB7Zm9yZWFjaCAkdXJsIGluICRjc3N9CisgICAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJ7JHVybH0iIC8+CisgICAgey9mb3JlYWNofQorICB7L2lmfQorICAvLyBJbmNsdWRlIGRlZmF1bHQgQ1NTIGFmdGVyIGN1c3RvbSBDU1Mgc28gaXQgY2FuIG92ZXJyaWRlIGRlZmF1bHRzIGluIHRoaXJkLQorICAvLyBwYXJ0eSBzdHlsZXNoZWV0cyAoZS5nLiBwcmV0dGlmeSkuCisgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IntnaXRpbGVzLkNTU19VUkx9IiAvPgorCisgIHtpZiAkanMgYW5kIGxlbmd0aCgkanMpfQorICAgIHtmb3JlYWNoICR1cmwgaW4gJGpzfQorICAgICAgPHNjcmlwdCBzcmM9InskdXJsfSIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KKyAgICB7L2ZvcmVhY2h9CisgIHsvaWZ9Cis8L2hlYWQ+Cis8Ym9keSB7aWYgJG9uTG9hZH1vbmxvYWQ9Inskb25Mb2FkfGlkfSJ7L2lmfT4KKyAge2NhbGwgLmN1c3RvbUhlYWRlciAvfQorCisgIHtpZiAkbWVudUVudHJpZXMgYW5kIGxlbmd0aCgkbWVudUVudHJpZXMpfQorICAgIDxkaXYgY2xhc3M9Im1lbnUiPgorICAgIHtmb3JlYWNoICRlbnRyeSBpbiAkbWVudUVudHJpZXN9CisgICAgICB7c3B9CisgICAgICB7aWYgJGVudHJ5LnVybH0KKyAgICAgICAgPGEgaHJlZj0ieyRlbnRyeS51cmx9IntpZiBub3QgaXNMYXN0KCRlbnRyeSl9IGNsYXNzPSJlbnRyeSJ7L2lmfT57JGVudHJ5LnRleHR9PC9hPgorICAgICAge2Vsc2V9CisgICAgICAgIDxzcGFue2lmIG5vdCBpc0xhc3QoJGVudHJ5KX0gY2xhc3M9ImVudHJ5InsvaWZ9PnskZW50cnkudGV4dH08L3NwYW4+CisgICAgICB7L2lmfQorICAgIHsvZm9yZWFjaH0KKyAgICB7c3B9CisgICAgPC9kaXY+CisgIHsvaWZ9CisKKyAge2lmICRicmVhZGNydW1icyBhbmQgbGVuZ3RoKCRicmVhZGNydW1icyl9CisgICAgPGRpdiBjbGFzcz0iYnJlYWRjcnVtYnMiPgorICAgICAge2ZvcmVhY2ggJGVudHJ5IGluICRicmVhZGNydW1ic30KKyAgICAgICAge2lmIG5vdCBpc0ZpcnN0KCRlbnRyeSl9e3NwfS97c3B9ey9pZn0KKyAgICAgICAge2lmIG5vdCBpc0xhc3QoJGVudHJ5KX0KKyAgICAgICAgICA8YSBocmVmPSJ7JGVudHJ5LnVybH0iPnskZW50cnkudGV4dH08L2E+CisgICAgICAgIHtlbHNlfQorICAgICAgICAgIHskZW50cnkudGV4dH0KKyAgICAgICAgey9pZn0KKyAgICAgIHsvZm9yZWFjaH0KKyAgICA8L2Rpdj4KKyAgey9pZn0KK3svdGVtcGxhdGV9CisKKy8qKgorICogU3RhbmRhcmQgZm9vdGVyLgorICovCit7dGVtcGxhdGUgLmZvb3Rlcn0KKzwvYm9keT4KKzwvaHRtbD4KK3svdGVtcGxhdGV9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy90ZW1wbGF0ZXMvRGVmYXVsdEN1c3RvbVRlbXBsYXRlcy5zb3kgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy90ZW1wbGF0ZXMvRGVmYXVsdEN1c3RvbVRlbXBsYXRlcy5zb3kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFmNWQ5ZQotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3RlbXBsYXRlcy9EZWZhdWx0Q3VzdG9tVGVtcGxhdGVzLnNveQpAQCAtMCwwICsxLDIxIEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgore25hbWVzcGFjZSBnaXRpbGVzIGF1dG9lc2NhcGU9ImNvbnRleHR1YWwifQorCisvKioKKyAqIERlZmF1bHQgY3VzdG9tIGhlYWRlciBpbXBsZW1lbnRhdGlvbiBmb3IgR2l0aWxlcy4KKyAqLwore3RlbXBsYXRlIC5jdXN0b21IZWFkZXJ9Cis8aDE+e21zZyBkZXNjPSJzaG9ydCBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiJ9R2l0aWxlc3svbXNnfTwvaDE+Cit7L3RlbXBsYXRlfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvdGVtcGxhdGVzL0RpZmZEZXRhaWwuc295IGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvdGVtcGxhdGVzL0RpZmZEZXRhaWwuc295Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZDhhZjIKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy90ZW1wbGF0ZXMvRGlmZkRldGFpbC5zb3kKQEAgLTAsMCArMSw0OSBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KK3tuYW1lc3BhY2UgZ2l0aWxlcyBhdXRvZXNjYXBlPSJjb250ZXh0dWFsIn0KKworLyoqCisgKiBEZXRhaWwgcGFnZSBzaG93aW5nIGRpZmZzIGZvciBhIHNpbmdsZSBjb21taXQuCisgKgorICogQHBhcmFtIHRpdGxlIGh1bWFuLXJlYWRhYmxlIHJldmlzaW9uIG5hbWUuCisgKiBAcGFyYW0gcmVwb3NpdG9yeU5hbWUgbmFtZSBvZiB0aGlzIHJlcG9zaXRvcnkuCisgKiBAcGFyYW0/IG1lbnVFbnRyaWVzIG1lbnUgZW50cmllcy4KKyAqIEBwYXJhbSBicmVhZGNydW1icyBicmVhZGNydW1icyBmb3IgdGhpcyBwYWdlLgorICogQHBhcmFtPyBjb21taXQgb3B0aW9uYWwgY29tbWl0IGZvciB3aGljaCBkaWZmcyBhcmUgZGlzcGxheWVkLCB3aXRoIGtleXMKKyAqICAgICBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXRpbGVzLmNvbW1pdERldGFpbCB0ZW1wbGF0ZSAobWludXMgImRpZmZUcmVlIikuCisgKi8KK3t0ZW1wbGF0ZSAuZGlmZkRldGFpbH0KK3tjYWxsIC5oZWFkZXIgZGF0YT0iYWxsIiAvfQorCit7aWYgJGNvbW1pdH0KKyAge2NhbGwgLmNvbW1pdERldGFpbCBkYXRhPSIkY29tbWl0IiAvfQorey9pZn0KKzxkaXYgaWQ9IkRJRkZfT1VUUFVUX0JMT0NLIiAvPgorCit7Y2FsbCAuZm9vdGVyIC99Cit7L3RlbXBsYXRlfQorCisvKioKKyAqIEZpbGUgaGVhZGVyIGZvciBhIHNpbmdsZSB1bmlmaWVkIGRpZmYgcGF0Y2guCisgKgorICogQHBhcmFtIGZpcnN0IHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBoZWFkZXIsIHdpdGggbm8gdHJhaWxpbmcgTEYuCisgKiBAcGFyYW0gcmVzdCByZW1haW5pbmcgbGluZXMgb2YgdGhlIGhlYWRlciwgaWYgYW55LgorICogQHBhcmFtIGZpbGVJbmRleCBwb3NpdGlvbiBvZiB0aGUgZmlsZSB3aXRoaW4gdGhlIGRpZmZlcmVuY2UuCisgKi8KK3t0ZW1wbGF0ZSAuZGlmZkhlYWRlcn0KKzxwcmUgY2xhc3M9ImRpZmYtaGVhZGVyIj4KKzxhIG5hbWU9IkZ7JGZpbGVJbmRleH0iIGNsYXNzPSJkaWZmLWdpdCI+eyRmaXJzdH08L2E+e1xufQoreyRyZXN0fQorPC9wcmU+Cit7L3RlbXBsYXRlfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvdGVtcGxhdGVzL0hvc3RJbmRleC5zb3kgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy90ZW1wbGF0ZXMvSG9zdEluZGV4LnNveQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWU5NjE2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvdGVtcGxhdGVzL0hvc3RJbmRleC5zb3kKQEAgLTAsMCArMSw3NyBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KK3tuYW1lc3BhY2UgZ2l0aWxlcyBhdXRvZXNjYXBlPSJjb250ZXh0dWFsIn0KKworLyoqCisgKiBIVE1MIHBhZ2UgZm9yIC8uCisgKgorICogQHBhcmFtIGhvc3ROYW1lIGhvc3QgbmFtZS4KKyAqIEBwYXJhbT8gbWVudUVudHJpZXMgbWVudSBlbnRyaWVzLgorICogQHBhcmFtIGJhc2VVcmwgYmFzZSBVUkwgZm9yIHJlcG9zaXRvcmllcy4KKyAqIEBwYXJhbSByZXBvc2l0b3JpZXMgbGlzdCBvZiByZXBvc2l0b3J5IGRlc2NyaXB0aW9uIG1hcHMgd2l0aCBuYW1lLCBjbG9uZVVybCwKKyAqICAgICBhbmQgb3B0aW9uYWwgZGVzY3JpcHRpb24gdmFsdWVzLgorICovCit7dGVtcGxhdGUgLmhvc3RJbmRleH0KK3tjYWxsIC5oZWFkZXJ9CisgIHtwYXJhbSB0aXRsZTogJGhvc3ROYW1lID8gJGhvc3ROYW1lICsgJyBHaXQgcmVwb3NpdG9yaWVzJyA6ICdHaXQgcmVwb3NpdG9yaWVzJyAvfQorICB7cGFyYW0gbWVudUVudHJpZXM6ICRtZW51RW50cmllcyAvfQorICB7cGFyYW0gYnJlYWRjcnVtYnM6IG51bGwgL30KK3svY2FsbH0KKwore2lmIGxlbmd0aCgkcmVwb3NpdG9yaWVzKX0KKworICA8aDI+CisgICAge21zZyBkZXNjPSJHaXQgcmVwb3NpdG9yaWVzIGF2YWlsYWJsZSBvbiB0aGUgaG9zdCJ9CisgICAgICB7JGhvc3ROYW1lfSBHaXQgcmVwb3NpdG9yaWVzCisgICAgey9tc2d9CisgIDwvaDI+CisKKyAgPGRpdiBjbGFzcz0iaW5zdHJ1Y3Rpb25zIj4KKyAgICB7bXNnIGRlc2M9ImRlc2NyaXB0aW9uIG9uIGhvdyB0byB1c2UgdGhpcyByZXBvc2l0b3J5In0KKyAgICBUbyBjbG9uZSBvbmUgb2YgdGhlc2UgcmVwb3NpdG9yaWVzLCBpbnN0YWxse3NwfQorICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ2l0LXNjbS5jb20vIj5naXQ8L2E+LCBhbmQgcnVuOgorICAgIDxwcmU+Z2l0IGNsb25lIHskYmFzZVVybH08ZW0+bmFtZTwvZW0+PC9wcmU+CisgICAgey9tc2d9CisgIDwvZGl2PgorCisgIDx0YWJsZSBjbGFzcz0ibGlzdCI+CisgICAgPHRyIGNsYXNzPSJuby1ob3ZlciI+CisgICAgICA8dGggd2lkdGg9IjI1JSI+CisgICAgICAgIHttc2cgZGVzYz0iY29sdW1uIGhlYWRlciBmb3IgcmVwb3NpdG9yeSBuYW1lIn0KKyAgICAgICAgICBOYW1lCisgICAgICAgIHsvbXNnfQorICAgICAgPC90aD4KKyAgICAgIDx0aD4KKyAgICAgICAge21zZyBkZXNjPSJjb2x1bW4gaGVhZGVyIGZvciByZXBvc2l0b3J5IGRlc2NyaXB0aW9uIn0KKyAgICAgICAgICBEZXNjcmlwdGlvbgorICAgICAgICB7L21zZ30KKyAgICAgIDwvdGg+CisgICAgPC90cj4KKyAgICB7Zm9yZWFjaCAkcmVwbyBpbiAkcmVwb3NpdG9yaWVzfQorICAgICAgPHRyPgorICAgICAgICA8dGQ+CisgICAgICAgICAgPGEgaHJlZj0ieyRyZXBvLnVybH0iPnskcmVwby5uYW1lfTwvYT4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkPnskcmVwby5kZXNjcmlwdGlvbn08L3RkPgorICAgICAgPC90cj4KKyAgICB7L2ZvcmVhY2h9CisgIDwvdGFibGU+CisgIDxkaXYgY2xhc3M9ImZvb3RlciI+CisgICAgPGEgaHJlZj0iP2Zvcm1hdD1URVhUIj57bXNnIGRlc2M9InRleHQgZm9ybWF0In1UWFR7L21zZ308L2E+CisgICAge3NwfQorICAgIDxhIGhyZWY9Ij9mb3JtYXQ9SlNPTiI+e21zZyBkZXNjPSJKU09OIGZvcm1hdCJ9SlNPTnsvbXNnfTwvYT4KKyAgPC9kaXY+Cit7L2lmfQore2NhbGwgLmZvb3RlciAvfQorey90ZW1wbGF0ZX0KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3RlbXBsYXRlcy9Mb2dEZXRhaWwuc295IGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvdGVtcGxhdGVzL0xvZ0RldGFpbC5zb3kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlhZTljNwotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3RlbXBsYXRlcy9Mb2dEZXRhaWwuc295CkBAIC0wLDAgKzEsOTUgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCit7bmFtZXNwYWNlIGdpdGlsZXMgYXV0b2VzY2FwZT0iY29udGV4dHVhbCJ9CisKKy8qKgorICogRGV0YWlsIHBhZ2Ugc2hvd2luZyBhIHNob3J0bG9nIGZvciBhIGNvbW1pdC4KKyAqCisgKiBAcGFyYW0gdGl0bGUgaHVtYW4tcmVhZGFibGUgcmV2aXNpb24gbmFtZS4KKyAqIEBwYXJhbSByZXBvc2l0b3J5TmFtZSBuYW1lIG9mIHRoaXMgcmVwb3NpdG9yeS4KKyAqIEBwYXJhbT8gbWVudUVudHJpZXMgbWVudSBlbnRyaWVzLgorICogQHBhcmFtIGJyZWFkY3J1bWJzIGJyZWFkY3J1bWJzIGZvciB0aGlzIHBhZ2UuCisgKiBAcGFyYW0/IHRhZ3Mgb3B0aW9uYWwgbGlzdCBvZiB0YWdzIGVuY291bnRlcmVkIHdoZW4gcGVlbGluZyB0aGlzIG9iamVjdCwgd2l0aAorICogICAgIGtleXMgY29ycmVzcG9uZGluZyB0byBnaXRpbGVzLnRhZ0RldGFpbC4KKyAqIEBwYXJhbSBlbnRyaWVzIGxpc3Qgb2YgbG9nIGVudHJpZXM7IHNlZSAubG9nRW50cnkuCisgKiBAcGFyYW0/IG5leHRVcmwgVVJMIGZvciB0aGUgbmV4dCBwYWdlIG9mIHJlc3VsdHMuCisgKiBAcGFyYW0/IHByZXZpb3VzVXJsIFVSTCBmb3IgdGhlIHByZXZpb3VzIHBhZ2Ugb2YgcmVzdWx0cy4KKyAqLwore3RlbXBsYXRlIC5sb2dEZXRhaWx9Cit7Y2FsbCAuaGVhZGVyIGRhdGE9ImFsbCIgL30KKwore2lmICR0YWdzfQorICB7Zm9yZWFjaCAkdGFnIGluICR0YWdzfQorICAgIHtjYWxsIGdpdGlsZXMudGFnRGV0YWlsIGRhdGE9IiR0YWciIC99CisgIHsvZm9yZWFjaH0KK3svaWZ9CisKK3tpZiAkcHJldmlvdXNVcmx9CisgIDxkaXYgY2xhc3M9ImxvZy1uYXYiPgorICAgIDxhIGhyZWY9InskcHJldmlvdXNVcmx9Ij57bXNnIGRlc2M9InRleHQgZm9yIHByZXZpb3VzIFVSTCJ9JmxhcXVvOyBQcmV2aW91c3svbXNnfTwvYT4KKyAgPC9kaXY+Cit7L2lmfQorCit7aWYgbGVuZ3RoKCRlbnRyaWVzKX0KKyAgPG9sIGNsYXNzPSJzaG9ydGxvZyI+CisgICAge2ZvcmVhY2ggJGVudHJ5IGluICRlbnRyaWVzfQorICAgICAgPGxpe2lmICRwcmV2aW91c1VybCBhbmQgaXNGaXJzdCgkZW50cnkpfSBjbGFzcz0iZmlyc3Qiey9pZn0+CisgICAgICAgIHtjYWxsIC5sb2dFbnRyeSBkYXRhPSIkZW50cnkiIC99CisgICAgICA8L2xpPgorICAgIHsvZm9yZWFjaH0KKyAgPC9vbD4KK3tlbHNlfQorICA8cD57bXNnIGRlc2M9ImluZm9ybWF0aW9uYWwgdGV4dCBmb3Igd2hlbiB0aGUgbG9nIGlzIGVtcHR5In1ObyBjb21taXRzLnsvbXNnfTwvcD4KK3svaWZ9CisKK3tpZiAkbmV4dFVybH0KKyAgPGRpdiBjbGFzcz0ibG9nLW5hdiI+CisgICAgPGEgaHJlZj0ieyRuZXh0VXJsfSI+e21zZyBkZXNjPSJ0ZXh0IGZvciBuZXh0IFVSTCJ9TmV4dCAmcmFxdW87ey9tc2d9PC9hPgorICA8L2Rpdj4KK3svaWZ9CisKK3tjYWxsIC5mb290ZXIgL30KK3svdGVtcGxhdGV9CisKKy8qKgorICogU2luZ2xlIHNob3J0bG9nIGVudHJ5LgorICoKKyAqIEBwYXJhbSBhYmJyZXZTaGEgYWJicmV2aWF0ZWQgU0hBLTEuCisgKiBAcGFyYW0gdXJsIFVSTCB0byBjb21taXQgZGV0YWlsIHBhZ2UuCisgKiBAcGFyYW0gc2hvcnRNZXNzYWdlIHNob3J0IGNvbW1pdCBtZXNzYWdlLgorICogQHBhcmFtIGF1dGhvciBhdXRob3IgaW5mb3JtYXRpb24gd2l0aCBhdCBsZWFzdCAibmFtZSIgYW5kICJyZWxhdGl2ZVRpbWUiIGtleXMuCisgKiBAcGFyYW0gYnJhbmNoZXMgbGlzdCBvZiBicmFuY2hlcyBmb3IgdGhpcyBlbnRyeSwgd2l0aCAibmFtZSIgYW5kICJ1cmwiIGtleXMuCisgKiBAcGFyYW0gdGFncyBsaXN0IG9mIHRhZ3MgZm9yIHRoaXMgZW50cnksIHdpdGggIm5hbWUiIGFuZCAidXJsIiBrZXlzLgorICovCit7dGVtcGxhdGUgLmxvZ0VudHJ5fQorPGEgaHJlZj0ieyR1cmx9Ij4KKyAgPHNwYW4gY2xhc3M9InNoYTEiPnskYWJicmV2U2hhfTwvc3Bhbj4KKyAgLy8gbmJzcCBpbnN0YWQgb2YgQ1NTIHBhZGRpbmcvbWFyZ2luIGJlY2F1c2UgdGhvc2UgY2F1c2UgYSBicmVhayBpbiB0aGUKKyAgLy8gdW5kZXJsaW5lLgorICAmbmJzcDsKKyAge3NwfTxzcGFuIGNsYXNzPSJjb21taXQtbWVzc2FnZSI+eyRzaG9ydE1lc3NhZ2V9PC9zcGFuPgorPC9hPgore3NwfTxzcGFuIGNsYXNzPSJhdXRob3IiPnttc2cgZGVzYz0iY29tbWl0IGF1dGhvciBuYW1lIn1ieSB7JGF1dGhvci5uYW1lfXsvbXNnfTwvc3Bhbj4KK3tzcH08c3BhbiBjbGFzcz0idGltZSI+LSB7JGF1dGhvci5yZWxhdGl2ZVRpbWV9PC9zcGFuPgore2lmIGxlbmd0aCgkYnJhbmNoZXMpfQorICB7Zm9yZWFjaCAkYnJhbmNoIGluICRicmFuY2hlc30KKyAgICB7c3B9PGEgaHJlZj0ieyRicmFuY2gudXJsfSIgY2xhc3M9ImJyYW5jaC1sYWJlbCI+eyRicmFuY2gubmFtZX08L2E+CisgIHsvZm9yZWFjaH0KK3svaWZ9Cit7aWYgbGVuZ3RoKCR0YWdzKX0KKyAge2ZvcmVhY2ggJHRhZyBpbiAkdGFnc30KKyAgICB7c3B9PGEgaHJlZj0ieyR0YWcudXJsfSIgY2xhc3M9InRhZy1sYWJlbCI+eyR0YWcubmFtZX08L2E+CisgIHsvZm9yZWFjaH0KK3svaWZ9Cit7L3RlbXBsYXRlfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvdGVtcGxhdGVzL09iamVjdERldGFpbC5zb3kgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy90ZW1wbGF0ZXMvT2JqZWN0RGV0YWlsLnNveQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWRmNDNjCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvdGVtcGxhdGVzL09iamVjdERldGFpbC5zb3kKQEAgLTAsMCArMSwyOTQgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCit7bmFtZXNwYWNlIGdpdGlsZXMgYXV0b2VzY2FwZT0iY29udGV4dHVhbCJ9CisKKy8qKgorICogRGV0YWlsZWQgbGlzdGluZyBvZiBhIGNvbW1pdC4KKyAqCisgKiBAcGFyYW0gYXV0aG9yIG1hcCB3aXRoICJuYW1lIiwgImVtYWlsIiwgYW5kICJ0aW1lIiBrZXlzIGZvciB0aGUgY29tbWl0IGF1dGhvci4KKyAqIEBwYXJhbSBjb21taXR0ZXIgbWFwIHdpdGggIm5hbWUiLCAiZW1haWwiLCBhbmQgInRpbWUiIGtleXMgZm9yIHRoZSBjb21taXR0ZXIuCisgKiBAcGFyYW0gc2hhIGNvbW1pdCBTSEEtMS4KKyAqIEBwYXJhbSB0cmVlIHRyZWUgU0hBLTEuCisgKiBAcGFyYW0gdHJlZVVybCB0cmVlIFVSTC4KKyAqIEBwYXJhbSBwYXJlbnRzIGxpc3Qgb2YgcGFyZW50IG9iamVjdHMgd2l0aCB0aGUgZm9sbG93aW5nIGtleXM6CisgKiAgICAgc2hhOiBTSEEtMS4KKyAqICAgICB1cmw6IFVSTCB0byB2aWV3IHRoZSBwYXJlbnQgY29tbWl0LgorICogICAgIGRpZmZVcmw6IFVSTCB0byBkaXNwbGF5IGRpZmZzIHJlbGF0aXZlIHRvIHRoaXMgcGFyZW50LgorICogQHBhcmFtIG1lc3NhZ2UgbGlzdCBvZiBjb21taXQgbWVzc2FnZSBwYXJ0cywgd2hlcmUgZWFjaCBwYXJ0IGNvbnRhaW5zOgorICogICAgIHRleHQ6IHJhdyB0ZXh0IG9mIHRoZSBwYXJ0LgorICogICAgIHVybDogb3B0aW9uYWwgVVJMIHRoYXQgc2hvdWxkIGJlIGxpbmtlZCB0byBmcm9tIHRoZSBwYXJ0LgorICogQHBhcmFtIGRpZmZUcmVlIGxpc3Qgb2YgY2hhbmdlZCB0cmVlIGVudHJpZXMgd2l0aCB0aGUgZm9sbG93aW5nIGtleXM6CisgKiAgICAgY2hhbmdlVHlwZTogc3RyaW5nIG1hdGNoaW5nIGFuIG9yZy5lY2xpcHNlLmpnaXQuZGlmZi5EaWZmRW50cnkuQ2hhbmdlVHlwZQorICogICAgICAgICBjb25zdGFudC4KKyAqICAgICBwYXRoOiAobmV3KSBwYXRoIG9mIHRoZSB0cmVlIGVudHJ5LgorICogICAgIG9sZFBhdGg6IG9sZCBwYXRoLCBvbmx5IGZvciByZW5hbWVzIGFuZCBjb3BpZXMuCisgKiAgICAgdXJsOiBVUkwgdG8gYSBkZXRhaWwgcGFnZSBmb3IgdGhlIHRyZWUgZW50cnkuCisgKiAgICAgZGlmZlVybDogVVJMIHRvIGEgZGlmZiBwYWdlIGZvciB0aGUgdHJlZSBlbnRyeSdzIGRpZmYgaW4gdGhpcyBjb21taXQuCisgKiBAcGFyYW0gbG9nVXJsIFVSTCB0byBhIGxvZyBwYWdlIHN0YXJ0aW5nIGF0IHRoaXMgY29tbWl0LgorICovCit7dGVtcGxhdGUgLmNvbW1pdERldGFpbH0KKzxkaXYgY2xhc3M9ImdpdC1jb21taXQiPgorICA8dGFibGU+CisgICAgPHRyPgorICAgICAgPHRoPnttc2cgZGVzYz0iSGVhZGVyIGZvciBjb21taXQgU0hBIGVudHJ5In1jb21taXR7L21zZ308L3RoPgorICAgICAgPHRkIGNsYXNzPSJzaGEiPgorICAgICAgICB7JHNoYX0KKyAgICAgICAgPHNwYW4gY2xhc3M9ImxvZy1saW5rIj4KKyAgICAgICAgICBbPGEgaHJlZj0ieyRsb2dVcmx9Ij57bXNnIGRlc2M9InRleHQgZm9yIHRoZSBsb2cgbGluayJ9bG9ney9tc2d9PC9hPl0KKyAgICAgICAgPC9zcGFuPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZD57c3B9PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0aD57bXNnIGRlc2M9IkhlYWRlciBmb3IgY29tbWl0IGF1dGhvciJ9YXV0aG9yey9tc2d9PC90aD4KKyAgICAgIDx0ZD57Y2FsbCAucGVyc29uXyBkYXRhPSIkYXV0aG9yIiAvfTwvdGQ+CisgICAgICA8dGQ+eyRhdXRob3IudGltZX08L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRoPnttc2cgZGVzYz0iSGVhZGVyIGZvciBjb21taXR0ZXIifWNvbW1pdHRlcnsvbXNnfTwvdGg+CisgICAgICA8dGQ+e2NhbGwgLnBlcnNvbl8gZGF0YT0iJGNvbW1pdHRlciIgL308L3RkPgorICAgICAgPHRkPnskY29tbWl0dGVyLnRpbWV9PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0aD57bXNnIGRlc2M9IkhlYWRlciBmb3IgdHJlZSBTSEEgZW50cnkifXRyZWV7L21zZ308L3RoPgorICAgICAgPHRkIGNsYXNzPSJzaGEiPjxhIGhyZWY9InskdHJlZVVybH0iPnskdHJlZX08L2E+PC90ZD4KKyAgICA8L3RyPgorICAgIHtmb3JlYWNoICRwYXJlbnQgaW4gJHBhcmVudHN9CisgICAgICA8dHI+CisgICAgICAgIDx0aD57bXNnIGRlc2M9IkhlYWRlciBmb3IgcGFyZW50IFNIQSJ9cGFyZW50ey9tc2d9PC90aD4KKyAgICAgICAgPHRkPgorICAgICAgICAgIDxhIGhyZWY9InskcGFyZW50LnVybH0iPnskcGFyZW50LnNoYX08L2E+CisgICAgICAgICAgPHNwYW4gY2xhc3M9ImRpZmYtbGluayI+CisgICAgICAgICAgICBbPGEgaHJlZj0ieyRwYXJlbnQuZGlmZlVybH0iPnttc2cgZGVzYz0idGV4dCBmb3IgdGhlIHBhcmVudCBkaWZmIGxpbmsifWRpZmZ7L21zZ308L2E+XQorICAgICAgICAgIDwvc3Bhbj4KKyAgICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgey9mb3JlYWNofQorICA8L3RhYmxlPgorPC9kaXY+Cit7Y2FsbCAubWVzc2FnZV99CisgIHtwYXJhbSBjbGFzc05hbWU6ICdjb21taXQtbWVzc2FnZScgL30KKyAge3BhcmFtIG1lc3NhZ2U6ICRtZXNzYWdlIC99Cit7L2NhbGx9CisKK3tpZiAkZGlmZlRyZWUgYW5kIGxlbmd0aCgkZGlmZlRyZWUpfQorICA8dWwgY2xhc3M9ImRpZmYtdHJlZSI+CisgICAge2ZvcmVhY2ggJGVudHJ5IGluICRkaWZmVHJlZX0KKyAgICAgIDxsaT4KKyAgICAgICAgPGEgaHJlZj0ieyRlbnRyeS51cmx9Ij57JGVudHJ5LnBhdGh9PC9hPgorICAgICAgICB7c3dpdGNoICRlbnRyeS5jaGFuZ2VUeXBlfQorICAgICAgICAgIHtjYXNlICdBREQnfQorICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImFkZCI+CisgICAgICAgICAgICAgIHttc2cgZGVzYz0iVGV4dCBmb3IgYSBuZXcgdHJlZSBlbnRyeSJ9CisgICAgICAgICAgICAgICAgW0FkZGVkIC0gPGEgaHJlZj0ieyRlbnRyeS5kaWZmVXJsfSI+ZGlmZjwvYT5dCisgICAgICAgICAgICAgIHsvbXNnfQorICAgICAgICAgICAgPC9zcGFuPgorICAgICAgICAgIHtjYXNlICdNT0RJRlknfQorICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im1vZGlmeSI+CisgICAgICAgICAgICAgIHttc2cgZGVzYz0iVGV4dCBmb3IgYSBtb2RpZmllZCB0cmVlIGVudHJ5In0KKyAgICAgICAgICAgICAgICBbPGEgaHJlZj0ieyRlbnRyeS5kaWZmVXJsfSI+ZGlmZjwvYT5dCisgICAgICAgICAgICAgIHsvbXNnfQorICAgICAgICAgICAgPC9zcGFuPgorICAgICAgICAgIHtjYXNlICdERUxFVEUnfQorICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImRlbGV0ZSI+CisgICAgICAgICAgICAgIHttc2cgZGVzYz0iVGV4dCBmb3IgYSBkZWxldGVkIHRyZWUgZW50cnkifQorICAgICAgICAgICAgICAgIFtEZWxldGVkIC0gPGEgaHJlZj0ieyRlbnRyeS5kaWZmVXJsfSI+ZGlmZjwvYT5dCisgICAgICAgICAgICAgIHsvbXNnfQorICAgICAgICAgICAgPC9zcGFuPgorICAgICAgICAgIHtjYXNlICdSRU5BTUUnfQorICAgICAgICAgICAgPHNwYW4gY2xhc3M9InJlbmFtZSI+CisgICAgICAgICAgICAgIHttc2cgZGVzYz0iVGV4dCBmb3IgYSByZW5hbWVkIHRyZWUgZW50cnkifQorICAgICAgICAgICAgICAgIFtSZW5hbWVkIGZyb20geyRlbnRyeS5vbGRQYXRofSAtIDxhIGhyZWY9InskZW50cnkuZGlmZlVybH0iPmRpZmY8L2E+XQorICAgICAgICAgICAgICB7L21zZ30KKyAgICAgICAgICAgIDwvc3Bhbj4KKyAgICAgICAgICB7Y2FzZSAnQ09QWSd9CisgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29weSI+CisgICAgICAgICAgICAgIHttc2cgZGVzYz0iVGV4dCBmb3IgYSBjb3BpZWQgdHJlZSBlbnRyeSJ9CisgICAgICAgICAgICAgICAgW0NvcGllZCBmcm9tIHskZW50cnkub2xkUGF0aH0gLSA8YSBocmVmPSJ7JGVudHJ5LmRpZmZVcmx9Ij5kaWZmPC9hPl0KKyAgICAgICAgICAgICAgey9tc2d9CisgICAgICAgICAgICA8L3NwYW4+CisgICAgICAgICAge2RlZmF1bHR9CisgICAgICAgIHsvc3dpdGNofQorICAgICAgPC9saT4KKyAgICB7L2ZvcmVhY2h9CisgIDwvdWw+CisgIDxkaXYgY2xhc3M9ImRpZmYtc3VtbWFyeSI+CisgICAge2lmIGxlbmd0aCgkZGlmZlRyZWUpID09IDF9CisgICAgICB7bXNnIGRlc2M9IjEgZmlsZSBjaGFuZ2VkIn0xIGZpbGUgY2hhbmdlZHsvbXNnfQorICAgIHtlbHNlfQorICAgICAge21zZyBkZXNjPSJudW1iZXIgb2YgZmlsZXMgY2hhbmdlZCJ9e2xlbmd0aCgkZGlmZlRyZWUpfSBmaWxlcyBjaGFuZ2Vkey9tc2d9CisgICAgey9pZn0KKyAgPC9kaXY+Cit7L2lmfQorCit7L3RlbXBsYXRlfQorCisvKioKKyAqIERldGFpbGVkIGxpc3Rpbmcgb2YgYSB0cmVlLgorICoKKyAqIEBwYXJhbSBzaGEgU0hBIG9mIHRoaXMgcGF0aCdzIHRyZWUuCisgKiBAcGFyYW0/IGxvZ1VybCBvcHRpb25hbCBVUkwgdG8gYSBsb2cgZm9yIHRoaXMgcGF0aC4KKyAqIEBwYXJhbSBlbnRyaWVzIGxpc3Qgb2YgZW50cmllcyB3aXRoIHRoZSBmb2xsb3dpbmcga2V5czoKKyAqICAgICB0eXBlOiBlbnRyeSB0eXBlLCBtYXRjaGluZyBvbmUgb2YgdGhlIGNvbnN0YW50IG5hbWVzIGRlZmluZWQgaW4KKyAqICAgICAgICAgb3JnLmVjbGlwc2UuamdpdC5saWIuRmlsZU1vZGUuCisgKiAgICAgbmFtZTogdHJlZSBlbnRyeSBuYW1lLgorICogICAgIHVybDogVVJMIHRvIGxpbmsgdG8uCisgKiAgICAgdGFyZ2V0TmFtZTogbmFtZSBvZiBhIHN5bWxpbmsgdGFyZ2V0LCByZXF1aXJlZCBvbmx5IGlmIHR5cGUgPT0gJ1NZTUxJTksnLgorICogICAgIHRhcmdldFVybDogb3B0aW9uYWwgdXJsIG9mIGEgc3ltbGluayB0YXJnZXQsIHJlcXVpcmVkIG9ubHkgaWYKKyAqICAgICAgICAgdHlwZSA9PSAnU1lNTElOSycuCisgKi8KK3t0ZW1wbGF0ZSAudHJlZURldGFpbH0KKzxkaXYgY2xhc3M9InNoYTEiPgorICB7bXNnIGRlc2M9IlNIQS0xIGZvciB0aGUgcGF0aCdzIHRyZWUifXRyZWU6IHskc2hhfXsvbXNnfQorICB7aWYgJGxvZ1VybH17c3B9WzxhIGhyZWY9InskbG9nVXJsfSI+e21zZyBkZXNjPSJoaXN0b3J5IGZvciBhIHBhdGgifXBhdGggaGlzdG9yeXsvbXNnfTwvYT5dey9pZn0KKzwvZGl2PgorCit7aWYgbGVuZ3RoKCRlbnRyaWVzKX0KKyAgPG9sIGNsYXNzPSJsaXN0IGZpbGVzIj4KKyAgICB7Zm9yZWFjaCAkZW50cnkgaW4gJGVudHJpZXN9CisgICAgICA8bGkgY2xhc3M9IgorICAgICAgICAgICAge3N3aXRjaCAkZW50cnkudHlwZX0KKyAgICAgICAgICAgICAge2Nhc2UgJ1RSRUUnfWdpdC10cmVlCisgICAgICAgICAgICAgIHtjYXNlICdTWU1MSU5LJ31zeW1saW5rCisgICAgICAgICAgICAgIHtjYXNlICdSRUdVTEFSX0ZJTEUnfXJlZ3VsYXItZmlsZQorICAgICAgICAgICAgICB7Y2FzZSAnRVhFQ1VUQUJMRV9GSUxFJ31leGVjdXRhYmxlLWZpbGUKKyAgICAgICAgICAgICAge2Nhc2UgJ0dJVExJTksnfWdpdGxpbmsKKyAgICAgICAgICAgICAge2RlZmF1bHR9cmVndWxhci1maWxlCisgICAgICAgICAgICB7L3N3aXRjaH0KKyAgICAgICAgICAgICIgdGl0bGU9IgorICAgICAgICAgICAge3N3aXRjaCAkZW50cnkudHlwZX0KKyAgICAgICAgICAgICAge2Nhc2UgJ1RSRUUnfXttc2cgZGVzYz0iQWx0IHRleHQgZm9yIHRyZWUgaWNvbiJ9VHJlZXsvbXNnfQorICAgICAgICAgICAgICB7Y2FzZSAnU1lNTElOSyd9e21zZyBkZXNjPSJBbHQgdGV4dCBmb3Igc3ltbGluayBpY29uIn1TeW1saW5rey9tc2d9CisgICAgICAgICAgICAgIHtjYXNlICdSRUdVTEFSX0ZJTEUnfXttc2cgZGVzYz0iQWx0IHRleHQgZm9yIHJlZ3VsYXIgZmlsZSBpY29uIn1SZWd1bGFyIGZpbGV7L21zZ30KKyAgICAgICAgICAgICAge2Nhc2UgJ0VYRUNVVEFCTEVfRklMRSd9CisgICAgICAgICAgICAgICAge21zZyBkZXNjPSJBbHQgdGV4dCBmb3IgZXhlY3V0YWJsZSBmaWxlIGljb24ifUV4ZWN1dGFibGUgZmlsZXsvbXNnfQorICAgICAgICAgICAgICB7Y2FzZSAnR0lUTElOSyd9CisgICAgICAgICAgICAgICAge21zZyBkZXNjPSJBbHQgdGV4dCBmb3IgZ2l0IHN1Ym1vZHVsZSBsaW5rIGljb24ifUdpdCBzdWJtb2R1bGUgbGlua3svbXNnfQorICAgICAgICAgICAgICB7ZGVmYXVsdH17bXNnIGRlc2M9IkFsdCB0ZXh0IGZvciBvdGhlciBmaWxlIGljb24ifU90aGVyey9tc2d9CisgICAgICAgICAgICB7L3N3aXRjaH0KKyAgICAgICAgICAgIC0geyRlbnRyeS5uYW1lfSI+CisgICAgICAgIDxhIGhyZWY9InskZW50cnkudXJsfSI+eyRlbnRyeS5uYW1lfTwvYT4KKyAgICAgICAge2lmICRlbnRyeS50eXBlID09ICdTWU1MSU5LJ30KKyAgICAgICAgICB7c3B9JiN4MjFlODt7c3B9CisgICAgICAgICAge2lmICRlbnRyeS50YXJnZXRVcmx9CisgICAgICAgICAgICA8YSBocmVmPSJ7JGVudHJ5LnRhcmdldFVybH0iPnskZW50cnkudGFyZ2V0TmFtZX08L2E+CisgICAgICAgICAge2Vsc2V9CisgICAgICAgICAgICB7JGVudHJ5LnRhcmdldE5hbWV9CisgICAgICAgICAgey9pZn0KKyAgICAgICAgey9pZn0KKyAgICAgICAgLy8gVE9ETyhkYm9yb3dpdHopOiBTb21ldGhpbmcgcmVhc29uYWJsZSBmb3IgZ2l0bGlua3MuCisgICAgICA8L2xpPgorICAgIHsvZm9yZWFjaH0KKyAgPC90YWJsZT4KK3tlbHNlfQorICA8cD57bXNnIGRlc2M9IkluZm9ybWF0aW9uYWwgdGV4dCBmb3Igd2hlbiBhIHRyZWUgaXMgZW1wdHkifVRoaXMgdHJlZSBpcyBlbXB0eS57L21zZ308L3A+Cit7L2lmfQorey90ZW1wbGF0ZX0KKworLyoqCisgKiBEZXRhaWxlZCBsaXN0aW5nIG9mIGEgYmxvYi4KKyAqCisgKiBAcGFyYW0gc2hhIFNIQSBvZiB0aGlzIGZpbGUncyBibG9iLgorICogQHBhcmFtPyBsb2dVcmwgb3B0aW9uYWwgVVJMIHRvIGEgbG9nIGZvciB0aGlzIGZpbGUuCisgKiBAcGFyYW0gZGF0YSBmaWxlIGRhdGEgKG1heSBiZSBlbXB0eSksIG9yIG51bGwgZm9yIGEgYmluYXJ5IGZpbGUuCisgKiBAcGFyYW0/IGxhbmcgcHJldHR5cHJpbnQgbGFuZ3VhZ2UgZXh0ZW5zaW9uIGZvciB0ZXh0IGZpbGUuCisgKiBAcGFyYW0/IHNpemUgZm9yIGJpbmFyeSBmaWxlcyBvbmx5LCBzaXplIGluIGJ5dGVzLgorICovCit7dGVtcGxhdGUgLmJsb2JEZXRhaWx9Cis8ZGl2IGNsYXNzPSJzaGExIj4KKyAge21zZyBkZXNjPSJTSEEtMSBmb3IgdGhlIGZpbGUncyBibG9iIn1ibG9iOiB7JHNoYX17L21zZ30KKyAge2lmICRsb2dVcmx9e3NwfVs8YSBocmVmPSJ7JGxvZ1VybH0iPnttc2cgZGVzYz0iaGlzdG9yeSBmb3IgYSBmaWxlIn1maWxlIGhpc3Rvcnl7L21zZ308L2E+XXsvaWZ9Cis8L2Rpdj4KKwore2lmICRkYXRhICE9IG51bGx9CisgIHtpZiAkZGF0YX0KKyAgICB7aWYgJGxhbmcgIT0gbnVsbH0KKyAgICAgIDxwcmUgY2xhc3M9ImdpdC1ibG9iIHByZXR0eXByaW50IGxpbmVudW1zIGxhbmcteyRsYW5nfSI+eyRkYXRhfTwvcHJlPgorICAgIHtlbHNlfQorICAgICAgPHByZSBjbGFzcz0iZ2l0LWJsb2IiPnskZGF0YX08L3ByZT4KKyAgICB7L2lmfQorICB7ZWxzZX0KKyAgICA8ZGl2IGNsYXNzPSJmaWxlLWVtcHR5Ij5FbXB0eSBmaWxlPC9kaXY+CisgIHsvaWZ9Cit7ZWxzZX0KKyAgPGRpdiBjbGFzcz0iZmlsZS1iaW5hcnkiPgorICAgIHttc2cgZGVzYz0ic2l6ZSBvZiBiaW5hcnkgZmlsZSBpbiBieXRlcyJ9eyRzaXplfS1ieXRlIGJpbmFyeSBmaWxley9tc2d9CisgIDwvZGl2Pgorey9pZn0KK3svdGVtcGxhdGV9CisKKy8qKgorICogRGV0YWlsZWQgbGlzdGluZyBvZiBhbiBhbm5vdGF0ZWQgdGFnLgorICoKKyAqIEBwYXJhbSBzaGEgU0hBIG9mIHRoaXMgdGFnLgorICogQHBhcmFtPyB0YWdnZXIgb3B0aW9uYWwgbWFwIHdpdGggIm5hbWUiLCAiZW1haWwiLCBhbmQgInRpbWUiIGtleXMgZm9yIHRoZQorICogICAgIHRhZ2dlci4KKyAqIEBwYXJhbSBvYmplY3QgU0hBIG9mIHRoZSBvYmplY3QgdGhpcyB0YWcgcG9pbnRzIHRvLgorICogQHBhcmFtIG1lc3NhZ2UgdGFnIG1lc3NhZ2UuCisgKi8KK3t0ZW1wbGF0ZSAudGFnRGV0YWlsfQorPGRpdiBjbGFzcz0iZ2l0LXRhZyI+CisgIDx0YWJsZT4KKyAgICA8dHI+CisgICAgICA8dGg+e21zZyBkZXNjPSJIZWFkZXIgZm9yIHRhZyBTSEEgZW50cnkifXRhZ3svbXNnfTwvdGg+CisgICAgICA8dGQgY2xhc3M9InNoYSI+eyRzaGF9PC90ZD4KKyAgICAgIDx0ZD57c3B9PC90ZD4KKyAgICA8L3RyPgorICAgIHtpZiAkdGFnZ2VyfQorICAgICAgPHRyPgorICAgICAgICA8dGg+e21zZyBkZXNjPSJIZWFkZXIgZm9yIHRhZ2dlciJ9dGFnZ2Vyey9tc2d9PC90aD4KKyAgICAgICAgPHRkPntjYWxsIC5wZXJzb25fIGRhdGE9IiR0YWdnZXIiIC99PC90ZD4KKyAgICAgICAgPHRkPnskdGFnZ2VyLnRpbWV9PC90ZD4KKyAgICAgIDwvdHI+CisgICAgey9pZn0KKyAgICA8dHI+CisgICAgICA8dGg+e21zZyBkZXNjPSJIZWFkZXIgZm9yIHRhZ2dlZCBvYmplY3QgU0hBIn1vYmplY3R7L21zZ308L3RoPgorICAgICAgPHRkIGNsYXNzPSJzaGEiPnskb2JqZWN0fTwvdGQ+CisgICAgICA8dGQ+e3NwfTwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKzwvZGl2Pgore2lmICRtZXNzYWdlIGFuZCBsZW5ndGgoJG1lc3NhZ2UpfQorICB7Y2FsbCAubWVzc2FnZV99CisgICAge3BhcmFtIGNsYXNzTmFtZTogJ3RhZy1tZXNzYWdlJyAvfQorICAgIHtwYXJhbSBtZXNzYWdlOiAkbWVzc2FnZSAvfQorICB7L2NhbGx9Cit7L2lmfQorey90ZW1wbGF0ZX0KKworLyoqCisgKiBMaW5lIGFib3V0IGEgZ2l0IHBlcnNvbiBpZGVudGl0eS4KKyAqCisgKiBAcGFyYW0gbmFtZSBuYW1lLgorICogQHBhcmFtIGVtYWlsIGVtYWlsLgorICovCit7dGVtcGxhdGUgLnBlcnNvbl8gcHJpdmF0ZT0idHJ1ZSJ9Cit7JG5hbWV9e2lmICRlbWFpbH0gJmx0O3skZW1haWx9Jmd0O3svaWZ9Cit7L3RlbXBsYXRlfQorCisvKioKKyAqIFByZWZvcm1hdHRlZCBtZXNzYWdlLCBwb3NzaWJseSBjb250YWluaW5nIGh5cGVybGlua3MuCisgKgorICogQHBhcmFtIGNsYXNzTmFtZSBDU1MgY2xhc3MgbmFtZSBmb3IgPHByZT4gYmxvY2suCisgKiBAcGFyYW0gbWVzc2FnZSBsaXN0IG9mIG1lc3NhZ2UgcGFydHMsIHdoZXJlIGVhY2ggcGFydCBjb250YWluczoKKyAqICAgICB0ZXh0OiByYXcgdGV4dCBvZiB0aGUgcGFydC4KKyAqICAgICB1cmw6IG9wdGlvbmFsIFVSTCB0aGF0IHNob3VsZCBiZSBsaW5rZWQgdG8gZnJvbSB0aGUgcGFydC4KKyAqLwore3RlbXBsYXRlIC5tZXNzYWdlXyBwcml2YXRlPSJ0cnVlIn0KKzxwcmUgY2xhc3M9InskY2xhc3NOYW1lfGlkfSI+CisgIHtmb3JlYWNoICRwYXJ0IGluICRtZXNzYWdlfQorICAgIHtpZiAkcGFydC51cmx9PGEgaHJlZj0ieyRwYXJ0LnVybH0iPnskcGFydC50ZXh0fTwvYT57ZWxzZX17JHBhcnQudGV4dH17L2lmfQorICB7L2ZvcmVhY2h9Cis8L3ByZT4KK3svdGVtcGxhdGV9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy90ZW1wbGF0ZXMvUGF0aERldGFpbC5zb3kgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy90ZW1wbGF0ZXMvUGF0aERldGFpbC5zb3kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNkMzhhMgotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3RlbXBsYXRlcy9QYXRoRGV0YWlsLnNveQpAQCAtMCwwICsxLDg0IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgore25hbWVzcGFjZSBnaXRpbGVzIGF1dG9lc2NhcGU9ImNvbnRleHR1YWwifQorCisvKioKKyAqIERldGFpbCBwYWdlIGZvciBhIHBhdGggd2l0aGluIGEgdHJlZS4KKyAqCisgKiBAcGFyYW0gdGl0bGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGlzIHBhdGguCisgKiBAcGFyYW0gcmVwb3NpdG9yeU5hbWUgbmFtZSBvZiB0aGlzIHJlcG9zaXRvcnkuCisgKiBAcGFyYW0/IG1lbnVFbnRyaWVzIG1lbnUgZW50cmllcy4KKyAqIEBwYXJhbSBicmVhZGNydW1icyBicmVhZGNydW1icyBmb3IgdGhpcyBwYWdlLgorICogQHBhcmFtIHR5cGUgcGF0aCB0eXBlLCBtYXRjaGluZyBvbmUgb2YgdGhlIGNvbnN0YW50IG5hbWVzIGRlZmluZWQgaW4KKyAqICAgICAgICAgb3JnLmVjbGlwc2UuamdpdC5saWIuRmlsZU1vZGUuCisgKiBAcGFyYW0gZGF0YSBwYXRoIGRhdGEsIG1hdGNoaW5nIHRoZSBwYXJhbXMgZm9yIG9uZSBvZiAudHJlZURldGFpbCwKKyAqICAgICAuYmxvYkRldGFpbCwgLnN5bWxpbmtEZXRhaWwsIG9yIC5naXRsaW5rRGV0YWlsIGFzIGFwcHJvcHJpYXRlLgorICovCit7dGVtcGxhdGUgLnBhdGhEZXRhaWx9Cit7aWYgJHR5cGUgPT0gJ1JFR1VMQVJfRklMRScgb3IgJHR5cGUgPT0gJ0VYRUNVVEFCTEVfRklMRSd9CisgIHtjYWxsIC5oZWFkZXJ9CisgICAge3BhcmFtIHRpdGxlOiAkdGl0bGUgL30KKyAgICB7cGFyYW0gcmVwb3NpdG9yeU5hbWU6ICRyZXBvc2l0b3J5TmFtZSAvfQorICAgIHtwYXJhbSBtZW51RW50cmllczogJG1lbnVFbnRyaWVzIC99CisgICAge3BhcmFtIGJyZWFkY3J1bWJzOiAkYnJlYWRjcnVtYnMgL30KKyAgICB7cGFyYW0gY3NzOiBbZ2l0aWxlcy5QUkVUVElGWV9DU1NfVVJMXSAvfQorICAgIHtwYXJhbSBqczogW2dpdGlsZXMuUFJFVFRJRllfSlNfVVJMXSAvfQorICAgIHtwYXJhbSBvbkxvYWQ6ICdwcmV0dHlQcmludCgpJyAvfQorICB7L2NhbGx9Cit7ZWxzZX0KKyAge2NhbGwgLmhlYWRlciBkYXRhPSJhbGwiIC99Cit7L2lmfQorCit7c3dpdGNoICR0eXBlfQorICB7Y2FzZSAnVFJFRSd9e2NhbGwgLnRyZWVEZXRhaWwgZGF0YT0iJGRhdGEiIC99CisgIHtjYXNlICdTWU1MSU5LJ317Y2FsbCAuc3ltbGlua0RldGFpbCBkYXRhPSIkZGF0YSIgL30KKyAge2Nhc2UgJ1JFR1VMQVJfRklMRSd9e2NhbGwgLmJsb2JEZXRhaWwgZGF0YT0iJGRhdGEiIC99CisgIHtjYXNlICdFWEVDVVRBQkxFX0ZJTEUnfXtjYWxsIC5ibG9iRGV0YWlsIGRhdGE9IiRkYXRhIiAvfQorICB7Y2FzZSAnR0lUTElOSyd9e2NhbGwgLmdpdGxpbmtEZXRhaWwgZGF0YT0iJGRhdGEiIC99CisgIHtkZWZhdWx0fQorICAgIDxkaXYgY2xhc3M9ImVycm9yIj4KKyAgICAgIHttc2cgZGVzYz0iRXJyb3IgbWVzc2FnZSBmb3IgYW4gdW5rbm93biBvYmplY3QgdHlwZSJ9T2JqZWN0IGhhcyB1bmtub3duIHR5cGUuey9tc2d9CisgICAgPC9kaXY+Cit7L3N3aXRjaH0KKwore2NhbGwgLmZvb3RlciAvfQorey90ZW1wbGF0ZX0KKworLyoqCisgKiBEZXRhaWwgZm9yIGEgc3ltYm9saWMgbGluay4KKyAqCisgKiBAcGFyYW0gdGFyZ2V0IHRhcmdldCBvZiB0aGlzIHN5bWxpbmsuCisgKiBAcGFyYW0/IHRhcmdldFVybCBvcHRpb25hbCBVUkwgZm9yIHRoZSB0YXJnZXQsIGlmIGl0IGlzIHdpdGhpbiB0aGlzIHJlcG8uCisgKi8KK3t0ZW1wbGF0ZSAuc3ltbGlua0RldGFpbH0KKzxkaXYgY2xhc3M9InN5bWxpbmstZGV0YWlsIj4KKyAge21zZyBkZXNjPSJMZWFkLWluIHRleHQgZm9yIHRoZSBzeW1ib2xpYyBsaW5rIHRhcmdldC4ifVN5bWJvbGljIGxpbmsgdG97L21zZ30KKyAge3NwfXtpZiAkdGFyZ2V0VXJsfTxhIGhyZWY9InskdGFyZ2V0VXJsfSI+eyR0YXJnZXR9PC9hPntlbHNlfXskdGFyZ2V0fXsvaWZ9Cis8L2Rpdj4KK3svdGVtcGxhdGV9CisKKy8qKgorICogRGV0YWlsIGZvciBhIGdpdCBzdWJtb2R1bGUgbGluay4KKyAqCisgKiBAcGFyYW0gc2hhIHN1Ym1vZHVsZSBjb21taXQgU0hBLgorICogQHBhcmFtIHJlbW90ZVVybCBVUkwgb2YgdGhlIHJlbW90ZSByZXBvc2l0b3J5LgorICogQHBhcmFtPyBodHRwVXJsIG9wdGlvbmFsIEhUVFAgVVJMIHBvaW50aW5nIHRvIGEgd2ViLWJyb3dzZXItY29tcGF0aWJsZSBVUkwgb2YKKyAqICAgICB0aGUgcmVtb3RlIHJlcG9zaXRvcnkuCisgKi8KK3t0ZW1wbGF0ZSAuZ2l0bGlua0RldGFpbH0KKzxkaXYgY2xhc3M9ImdpdGxpbmstZGV0YWlsIj4KKyAge21zZyBkZXNjPSJMZWFkLWluIHRleHQgZm9yIHRoZSBnaXQgbGluayBVUkwifVN1Ym1vZHVsZSBsaW5rIHRvIHskc2hhfSBvZnsvbXNnfQorICB7c3B9e2lmICRodHRwVXJsfTxhIGhyZWY9InskaHR0cFVybH0iPnskcmVtb3RlVXJsfTwvYT57ZWxzZX17JHJlbW90ZVVybH17L2lmfQorPC9kaXY+Cit7L3RlbXBsYXRlfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvdGVtcGxhdGVzL1JlcG9zaXRvcnlJbmRleC5zb3kgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy90ZW1wbGF0ZXMvUmVwb3NpdG9yeUluZGV4LnNveQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmJiNGRhCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvdGVtcGxhdGVzL1JlcG9zaXRvcnlJbmRleC5zb3kKQEAgLTAsMCArMSw3OSBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KK3tuYW1lc3BhY2UgZ2l0aWxlcyBhdXRvZXNjYXBlPSJjb250ZXh0dWFsIn0KKworLyoqCisgKiBJbmRleCBwYWdlIGZvciBhIHJlcG9zaXRvcnkuCisgKgorICogQHBhcmFtIHJlcG9zaXRvcnlOYW1lIG5hbWUgb2YgdGhpcyByZXBvc2l0b3J5LgorICogQHBhcmFtPyBtZW51RW50cmllcyBtZW51IGVudHJpZXMuCisgKiBAcGFyYW0gYnJlYWRjcnVtYnMgYnJlYWRjcnVtYnMgZm9yIHRoaXMgcGFnZS4KKyAqIEBwYXJhbSBjbG9uZVVybCBjbG9uZSBVUkwgZm9yIHRoaXMgcmVwb3NpdG9yeS4KKyAqIEBwYXJhbSBkZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiB0ZXh0IG9mIHRoZSByZXBvc2l0b3J5LgorICogQHBhcmFtPyBicmFuY2hlcyBsaXN0IG9mIGJyYW5jaCBvYmplY3RzIHdpdGggdXJsIGFuZCBuYW1lIGtleXMuCisgKiBAcGFyYW0/IHRhZ3MgbGlzdCBvZiB0YWcgb2JqZWN0cyB3aXRoIHVybCBhbmQgbmFtZSBrZXlzLgorICovCit7dGVtcGxhdGUgLnJlcG9zaXRvcnlJbmRleH0KK3tjYWxsIC5oZWFkZXJ9CisgIHtwYXJhbSB0aXRsZTogJHJlcG9zaXRvcnlOYW1lIC99CisgIHtwYXJhbSByZXBvc2l0b3J5TmFtZTogbnVsbCAvfQorICB7cGFyYW0gbWVudUVudHJpZXM6ICRtZW51RW50cmllcyAvfQorICB7cGFyYW0gYnJlYWRjcnVtYnM6ICRicmVhZGNydW1icyAvfQorey9jYWxsfQorCit7aWYgJGRlc2NyaXB0aW9ufQorICA8ZGl2IGNsYXNzPSJyZXBvc2l0b3J5LWRlc2NyaXB0aW9uIj57JGRlc2NyaXB0aW9ufTwvZGl2Pgorey9pZn0KKworPHRleHRhcmVhIHJvd3M9IjEiIGNvbHM9IjE1MCIgY2xhc3M9ImNsb25lLWxpbmUiCisgIG9uY2xpY2s9InRoaXMuZm9jdXMoKTt0aGlzLnNlbGVjdCgpOyIKKyAgcmVhZG9ubHk9InJlYWRvbmx5Ij4KKyAgICBnaXQgY2xvbmUgeyRjbG9uZVVybH0KKzwvdGV4dGFyZWE+CisKKzxkaXYgY2xhc3M9InJlcG9zaXRvcnktcmVmcyI+CisgIHtpZiAkYnJhbmNoZXMgYW5kIGxlbmd0aCgkYnJhbmNoZXMpfQorICAgIDxkaXYgY2xhc3M9InJlcG9zaXRvcnktYnJhbmNoZXMiPgorICAgICAgPGgzPkJyYW5jaGVzPC9oMz4KKyAgICAgIDx1bCBjbGFzcz0iYnJhbmNoLWxpc3QiPgorICAgICAge2ZvcmVhY2ggJGJyYW5jaCBpbiAkYnJhbmNoZXN9CisgICAgICAgIHtjYWxsIC5yZWZfIGRhdGE9IiRicmFuY2giIC99CisgICAgICB7L2ZvcmVhY2h9CisgICAgICA8L3VsPgorICAgIDwvZGl2PgorICB7L2lmfQorCisgIHtpZiAkdGFncyBhbmQgbGVuZ3RoKCR0YWdzKX0KKyAgICA8ZGl2IGNsYXNzPSJyZXBvc2l0b3J5LXRhZ3MiPgorICAgICAgPGgzPlRhZ3M8L2gzPgorICAgICAgPHVsIGNsYXNzPSJicmFuY2gtbGlzdCI+CisgICAgICB7Zm9yZWFjaCAkdGFnIGluICR0YWdzfQorICAgICAgICB7Y2FsbCAucmVmXyBkYXRhPSIkdGFnIiAvfQorICAgICAgey9mb3JlYWNofQorICAgICAgPC91bD4KKyAgICA8L2Rpdj4KKyAgey9pZn0KKzwvZGl2Pgore2NhbGwgLmZvb3RlciAvfQorey90ZW1wbGF0ZX0KKworLyoqCisgKiBEZXRhaWwgZm9yIGEgc2luZ2xlIHJlZi4KKyAqCisgKiBAcGFyYW0gdXJsIFVSTCBmb3IgcmVmIGRldGFpbCBwYWdlLgorICogQHBhcmFtIG5hbWUgcmVmIG5hbWUuCisgKi8KK3t0ZW1wbGF0ZSAucmVmX30KKzxsaT48YSBocmVmPSJ7JHVybH0iPnskbmFtZX08L2E+PC9saT4KK3svdGVtcGxhdGV9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy90ZW1wbGF0ZXMvUmV2aXNpb25EZXRhaWwuc295IGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvdGVtcGxhdGVzL1JldmlzaW9uRGV0YWlsLnNveQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWJlZDZiCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvdGVtcGxhdGVzL1JldmlzaW9uRGV0YWlsLnNveQpAQCAtMCwwICsxLDYzIEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgore25hbWVzcGFjZSBnaXRpbGVzIGF1dG9lc2NhcGU9ImNvbnRleHR1YWwifQorCisvKioKKyAqIERldGFpbCBwYWdlIGFib3V0IGEgc2luZ2xlIHJldmlzaW9uLgorICoKKyAqIEBwYXJhbSB0aXRsZSBodW1hbi1yZWFkYWJsZSByZXZpc2lvbiBuYW1lLgorICogQHBhcmFtIHJlcG9zaXRvcnlOYW1lIG5hbWUgb2YgdGhpcyByZXBvc2l0b3J5LgorICogQHBhcmFtPyBtZW51RW50cmllcyBtZW51IGVudHJpZXMuCisgKiBAcGFyYW0gYnJlYWRjcnVtYnMgYnJlYWRjcnVtYnMgZm9yIHRoaXMgcGFnZS4KKyAqIEBwYXJhbT8gaGFzQmxvYiBzZXQgdG8gdHJ1ZSBpZiB0aGUgcmV2aXNpb24gb3IgaXRzIHBlZWxlZCB2YWx1ZSBpcyBhIGJsb2IuCisgKiBAcGFyYW0gb2JqZWN0cyBsaXN0IG9mIG9iamVjdHMgZW5jb3VudGVyZWQgd2hlbiBwZWVsaW5nIHRoaXMgb2JqZWN0LiBFYWNoCisgKiAgICAgb2JqZWN0IGhhcyBhICJ0eXBlIiBrZXkgd2l0aCBvbmUgb2YgdGhlCisgKiAgICAgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29udGFudHMuVFlQRV8qIGNvbnN0YW50IHN0cmluZ3MsIGFuZCBhICJkYXRhIiBrZXkKKyAqICAgICB3aXRoIGFuIG9iamVjdCB3aG9zZSBrZXlzIGNvcnJlc3BvbmQgdG8gdGhlIGFwcHJvcHJpYXRlIG9iamVjdCBkZXRhaWwKKyAqICAgICB0ZW1wbGF0ZSBmcm9tIE9iamVjdERldGFpbC5zb3kuCisgKi8KK3t0ZW1wbGF0ZSAucmV2aXNpb25EZXRhaWx9Cit7aWYgJGhhc0Jsb2J9CisgIHtjYWxsIC5oZWFkZXJ9CisgICAge3BhcmFtIHRpdGxlOiAkdGl0bGUgL30KKyAgICB7cGFyYW0gcmVwb3NpdG9yeU5hbWU6ICRyZXBvc2l0b3J5TmFtZSAvfQorICAgIHtwYXJhbSBtZW51RW50cmllczogJG1lbnVFbnRyaWVzIC99CisgICAge3BhcmFtIGJyZWFkY3J1bWJzOiAkYnJlYWRjcnVtYnMgL30KKyAgICB7cGFyYW0gY3NzOiBbZ2l0aWxlcy5QUkVUVElGWV9DU1NfVVJMXSAvfQorICAgIHtwYXJhbSBqczogW2dpdGlsZXMuUFJFVFRJRllfSlNfVVJMXSAvfQorICAgIHtwYXJhbSBvbkxvYWQ6ICdwcmV0dHlQcmludCgpJyAvfQorICB7L2NhbGx9Cit7ZWxzZX0KKyAge2NhbGwgLmhlYWRlciBkYXRhPSJhbGwiIC99Cit7L2lmfQorCit7Zm9yZWFjaCAkb2JqZWN0IGluICRvYmplY3RzfQorICB7c3dpdGNoICRvYmplY3QudHlwZX0KKyAgICB7Y2FzZSAnY29tbWl0J30KKyAgICAgIHtjYWxsIC5jb21taXREZXRhaWwgZGF0YT0iJG9iamVjdC5kYXRhIiAvfQorICAgIHtjYXNlICd0cmVlJ30KKyAgICAgIHtjYWxsIC50cmVlRGV0YWlsIGRhdGE9IiRvYmplY3QuZGF0YSIgL30KKyAgICB7Y2FzZSAnYmxvYid9CisgICAgICB7Y2FsbCAuYmxvYkRldGFpbCBkYXRhPSIkb2JqZWN0LmRhdGEiIC99CisgICAge2Nhc2UgJ3RhZyd9CisgICAgICB7Y2FsbCAudGFnRGV0YWlsIGRhdGE9IiRvYmplY3QuZGF0YSIgL30KKyAgICB7ZGVmYXVsdH0KKyAgICAgIDxkaXYgY2xhc3M9ImVycm9yIj4KKyAgICAgICAge21zZyBkZXNjPSJFcnJvciBtZXNzYWdlIGZvciBhbiB1bmtub3duIG9iamVjdCB0eXBlIn1PYmplY3QgaGFzIHVua25vd24gdHlwZS57L21zZ30KKyAgICAgIDwvZGl2PgorICB7L3N3aXRjaH0KK3svZm9yZWFjaH0KKwore2NhbGwgLmZvb3RlciAvfQorey90ZW1wbGF0ZX0KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9Db25maWdVdGlsVGVzdC5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0NvbmZpZ1V0aWxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY0MzljMgotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9Db25maWdVdGlsVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2l0aWxlcy5Db25maWdVdGlsLmdldER1cmF0aW9uOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnOworaW1wb3J0IG9yZy5qb2RhLnRpbWUuRHVyYXRpb247CisKKy8qKiBUZXN0cyBmb3IgY29uZmlndXJhdGlvbiB1dGlsaXRpZXMuICovCitwdWJsaWMgY2xhc3MgQ29uZmlnVXRpbFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgIHB1YmxpYyB2b2lkIHRlc3RHZXREdXJhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgIER1cmF0aW9uIGRlZiA9IER1cmF0aW9uLnN0YW5kYXJkU2Vjb25kcygyKTsKKyAgICBDb25maWcgY29uZmlnID0gbmV3IENvbmZpZygpOworICAgIER1cmF0aW9uIHQ7CisKKyAgICBjb25maWcuc2V0U3RyaW5nKCJjb3JlIiwgImRodCIsICJ0aW1lb3V0IiwgIjUwMCBtcyIpOworICAgIHQgPSBnZXREdXJhdGlvbihjb25maWcsICJjb3JlIiwgImRodCIsICJ0aW1lb3V0IiwgZGVmKTsKKyAgICBhc3NlcnRFcXVhbHMoNTAwLCB0LmdldE1pbGxpcygpKTsKKworICAgIGNvbmZpZy5zZXRTdHJpbmcoImNvcmUiLCAiZGh0IiwgInRpbWVvdXQiLCAiNS4yIHNlYyIpOworICAgIHQgPSBnZXREdXJhdGlvbihjb25maWcsICJjb3JlIiwgImRodCIsICJ0aW1lb3V0IiwgZGVmKTsKKyAgICBhc3NlcnRFcXVhbHMoNTIwMCwgdC5nZXRNaWxsaXMoKSk7CisKKyAgICBjb25maWcuc2V0U3RyaW5nKCJjb3JlIiwgImRodCIsICJ0aW1lb3V0IiwgIjEgbWluIik7CisgICAgdCA9IGdldER1cmF0aW9uKGNvbmZpZywgImNvcmUiLCAiZGh0IiwgInRpbWVvdXQiLCBkZWYpOworICAgIGFzc2VydEVxdWFscyg2MDAwMCwgdC5nZXRNaWxsaXMoKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9GYWtlSHR0cFNlcnZsZXRSZXF1ZXN0LmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvRmFrZUh0dHBTZXJ2bGV0UmVxdWVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYWZhNzQKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvRmFrZUh0dHBTZXJ2bGV0UmVxdWVzdC5qYXZhCkBAIC0wLDAgKzEsMzg5IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkNoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5naXRpbGVzLlRlc3RHaXRpbGVzVXJscy5VUkxTOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5GdW5jdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlNwbGl0dGVyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkxpbmtlZExpc3RNdWx0aW1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RNdWx0aW1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLlNlcnZsZXRVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZGZzLkRmc1JlcG9zaXRvcnk7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXguc2VydmxldC5SZXF1ZXN0RGlzcGF0Y2hlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuQ29va2llOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworCisvKiogU2ltcGxlIGZha2UgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIEh0dHBTZXJ2bGV0UmVxdWVzdH0uICovCitwdWJsaWMgY2xhc3MgRmFrZUh0dHBTZXJ2bGV0UmVxdWVzdCBpbXBsZW1lbnRzIEh0dHBTZXJ2bGV0UmVxdWVzdCB7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZMRVRfUEFUSCA9ICIvYiI7CisKKyAgcHVibGljIHN0YXRpYyBGYWtlSHR0cFNlcnZsZXRSZXF1ZXN0IG5ld1JlcXVlc3QoKSB7CisgICAgcmV0dXJuIG5ldyBGYWtlSHR0cFNlcnZsZXRSZXF1ZXN0KAorICAgICAgICBVUkxTLmdldEhvc3ROYW1lKG51bGwpLAorICAgICAgICA4MCwKKyAgICAgICAgIiIsCisgICAgICAgIFNFUlZMRVRfUEFUSCwKKyAgICAgICAgIiIpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBGYWtlSHR0cFNlcnZsZXRSZXF1ZXN0IG5ld1JlcXVlc3QoRGZzUmVwb3NpdG9yeSByZXBvKSB7CisgICAgRmFrZUh0dHBTZXJ2bGV0UmVxdWVzdCByZXEgPSBuZXdSZXF1ZXN0KCk7CisgICAgcmVxLnNldEF0dHJpYnV0ZShTZXJ2bGV0VXRpbHMuQVRUUklCVVRFX1JFUE9TSVRPUlksIHJlcG8pOworICAgIHJldHVybiByZXE7CisgIH0KKworICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gYXR0cmlidXRlczsKKyAgcHJpdmF0ZSBmaW5hbCBMaXN0TXVsdGltYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnM7CisKKyAgcHJpdmF0ZSBMaXN0TXVsdGltYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnM7CisgIHByaXZhdGUgU3RyaW5nIGhvc3ROYW1lOworICBwcml2YXRlIGludCBwb3J0OworICBwcml2YXRlIFN0cmluZyBjb250ZXh0UGF0aDsKKyAgcHJpdmF0ZSBTdHJpbmcgc2VydmxldFBhdGg7CisgIHByaXZhdGUgU3RyaW5nIHBhdGg7CisKKyAgcHJpdmF0ZSBGYWtlSHR0cFNlcnZsZXRSZXF1ZXN0KFN0cmluZyBob3N0TmFtZSwgaW50IHBvcnQsIFN0cmluZyBjb250ZXh0UGF0aCwgU3RyaW5nIHNlcnZsZXRQYXRoLAorICAgICAgU3RyaW5nIHBhdGgpIHsKKyAgICB0aGlzLmhvc3ROYW1lID0gY2hlY2tOb3ROdWxsKGhvc3ROYW1lLCAiaG9zdE5hbWUiKTsKKyAgICBjaGVja0FyZ3VtZW50KHBvcnQgPiAwKTsKKyAgICB0aGlzLnBvcnQgPSBwb3J0OworICAgIHRoaXMuY29udGV4dFBhdGggPSBjaGVja05vdE51bGwoY29udGV4dFBhdGgsICJjb250ZXh0UGF0aCIpOworICAgIHRoaXMuc2VydmxldFBhdGggPSBjaGVja05vdE51bGwoc2VydmxldFBhdGgsICJzZXJ2bGV0UGF0aCIpOworICAgIGF0dHJpYnV0ZXMgPSBNYXBzLm5ld0NvbmN1cnJlbnRNYXAoKTsKKyAgICBwYXJhbWV0ZXJzID0gTGlua2VkTGlzdE11bHRpbWFwLmNyZWF0ZSgpOworICAgIGhlYWRlcnMgPSBMaW5rZWRMaXN0TXVsdGltYXAuY3JlYXRlKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKKyAgICByZXR1cm4gYXR0cmlidXRlcy5nZXQobmFtZSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIEVudW1lcmF0aW9uPFN0cmluZz4gZ2V0QXR0cmlidXRlTmFtZXMoKSB7CisgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVudW1lcmF0aW9uKGF0dHJpYnV0ZXMua2V5U2V0KCkpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKSB7CisgICAgcmV0dXJuIFVURl84Lm5hbWUoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGdldENvbnRlbnRMZW5ndGgoKSB7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFNlcnZsZXRJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldExvY2FsQWRkcigpIHsKKyAgICByZXR1cm4gIjEuMi4zLjQiOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCkgeworICAgIHJldHVybiBob3N0TmFtZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGdldExvY2FsUG9ydCgpIHsKKyAgICByZXR1cm4gcG9ydDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgTG9jYWxlIGdldExvY2FsZSgpIHsKKyAgICByZXR1cm4gTG9jYWxlLlVTOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBFbnVtZXJhdGlvbjxMb2NhbGU+IGdldExvY2FsZXMoKSB7CisgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVudW1lcmF0aW9uKENvbGxlY3Rpb25zLnNpbmdsZXRvbihMb2NhbGUuVVMpKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtZXRlcihTdHJpbmcgbmFtZSkgeworICAgIHJldHVybiBJdGVyYWJsZXMuZ2V0Rmlyc3QocGFyYW1ldGVycy5nZXQobmFtZSksIG51bGwpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRnVuY3Rpb248Q29sbGVjdGlvbjxTdHJpbmc+LCBTdHJpbmdbXT4gU1RSSU5HX0NPTExFQ1RJT05fVE9fQVJSQVkgPQorICAgICAgbmV3IEZ1bmN0aW9uPENvbGxlY3Rpb248U3RyaW5nPiwgU3RyaW5nW10+KCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGFwcGx5KENvbGxlY3Rpb248U3RyaW5nPiB2YWx1ZXMpIHsKKyAgICAgICAgICByZXR1cm4gdmFsdWVzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7CisgICAgICAgIH0KKyAgICAgIH07CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmdbXT4gZ2V0UGFyYW1ldGVyTWFwKCkgeworICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAoCisgICAgICAgIE1hcHMudHJhbnNmb3JtVmFsdWVzKHBhcmFtZXRlcnMuYXNNYXAoKSwgU1RSSU5HX0NPTExFQ1RJT05fVE9fQVJSQVkpKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgRW51bWVyYXRpb248U3RyaW5nPiBnZXRQYXJhbWV0ZXJOYW1lcygpIHsKKyAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW51bWVyYXRpb24ocGFyYW1ldGVycy5rZXlTZXQoKSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZ1tdIGdldFBhcmFtZXRlclZhbHVlcyhTdHJpbmcgbmFtZSkgeworICAgIHJldHVybiBTVFJJTkdfQ09MTEVDVElPTl9UT19BUlJBWS5hcHBseShwYXJhbWV0ZXJzLmdldChuYW1lKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRRdWVyeVN0cmluZyhTdHJpbmcgcXMpIHsKKyAgICBMaXN0TXVsdGltYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtcyA9IExpbmtlZExpc3RNdWx0aW1hcC5jcmVhdGUoKTsKKyAgICBmb3IgKFN0cmluZyBlbnRyeSA6IFNwbGl0dGVyLm9uKCcmJykuc3BsaXQocXMpKSB7CisgICAgICBMaXN0PFN0cmluZz4ga3YgPSBJbW11dGFibGVMaXN0LmNvcHlPZihTcGxpdHRlci5vbignPScpLmxpbWl0KDIpLnNwbGl0KGVudHJ5KSk7CisgICAgICB0cnkgeworICAgICAgICBwYXJhbXMucHV0KFVSTERlY29kZXIuZGVjb2RlKGt2LmdldCgwKSwgVVRGXzgubmFtZSgpKSwKKyAgICAgICAgICAgIGt2LnNpemUoKSA9PSAyID8gVVJMRGVjb2Rlci5kZWNvZGUoa3YuZ2V0KDEpLCBVVEZfOC5uYW1lKCkpIDogIiIpOworICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZSk7CisgICAgICB9CisgICAgfQorICAgIHBhcmFtZXRlcnMgPSBwYXJhbXM7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRQcm90b2NvbCgpIHsKKyAgICByZXR1cm4gIkhUVFAvMS4xIjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgQnVmZmVyZWRSZWFkZXIgZ2V0UmVhZGVyKCkgeworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIEBEZXByZWNhdGVkCisgIHB1YmxpYyBTdHJpbmcgZ2V0UmVhbFBhdGgoU3RyaW5nIHBhdGgpIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldFJlbW90ZUFkZHIoKSB7CisgICAgcmV0dXJuICI1LjYuNy44IjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldFJlbW90ZUhvc3QoKSB7CisgICAgcmV0dXJuICJyZW1vdGVob3N0IjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGdldFJlbW90ZVBvcnQoKSB7CisgICAgcmV0dXJuIDEyMzQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFJlcXVlc3REaXNwYXRjaGVyIGdldFJlcXVlc3REaXNwYXRjaGVyKFN0cmluZyBwYXRoKSB7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRTY2hlbWUoKSB7CisgICAgcmV0dXJuIHBvcnQgPT0gNDQzID8gImh0dHBzIiA6ICJodHRwIjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlck5hbWUoKSB7CisgICAgcmV0dXJuIGhvc3ROYW1lOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgZ2V0U2VydmVyUG9ydCgpIHsKKyAgICByZXR1cm4gcG9ydDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpc1NlY3VyZSgpIHsKKyAgICByZXR1cm4gcG9ydCA9PSA0NDM7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisgICAgYXR0cmlidXRlcy5yZW1vdmUobmFtZSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKyAgICBhdHRyaWJ1dGVzLnB1dChuYW1lLCB2YWx1ZSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc2V0Q2hhcmFjdGVyRW5jb2RpbmcoU3RyaW5nIGVudikgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldEF1dGhUeXBlKCkgeworICAgIHJldHVybiBudWxsOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dFBhdGgoKSB7CisgICAgcmV0dXJuIGNvbnRleHRQYXRoOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBDb29raWVbXSBnZXRDb29raWVzKCkgeworICAgIHJldHVybiBuZXcgQ29va2llWzBdOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBsb25nIGdldERhdGVIZWFkZXIoU3RyaW5nIG5hbWUpIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldEhlYWRlcihTdHJpbmcgbmFtZSkgeworICAgIHJldHVybiBJdGVyYWJsZXMuZ2V0Rmlyc3QoaGVhZGVycy5nZXQobmFtZSksIG51bGwpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBFbnVtZXJhdGlvbjxTdHJpbmc+IGdldEhlYWRlck5hbWVzKCkgeworICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbnVtZXJhdGlvbihoZWFkZXJzLmtleVNldCgpKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgRW51bWVyYXRpb248U3RyaW5nPiBnZXRIZWFkZXJzKFN0cmluZyBuYW1lKSB7CisgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVudW1lcmF0aW9uKGhlYWRlcnMuZ2V0KG5hbWUpKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGdldEludEhlYWRlcihTdHJpbmcgbmFtZSkgeworICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KGdldEhlYWRlcihuYW1lKSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRNZXRob2QoKSB7CisgICAgcmV0dXJuICJHRVQiOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aEluZm8oKSB7CisgICAgcmV0dXJuIHBhdGg7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRQYXRoSW5mbyhTdHJpbmcgcGF0aCkgeworICAgIHRoaXMucGF0aCA9IGNoZWNrTm90TnVsbChwYXRoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldFBhdGhUcmFuc2xhdGVkKCkgeworICAgIHJldHVybiBwYXRoOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0UXVlcnlTdHJpbmcoKSB7CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRSZW1vdGVVc2VyKCkgeworICAgIHJldHVybiBudWxsOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdFVSSSgpIHsKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nQnVmZmVyIGdldFJlcXVlc3RVUkwoKSB7CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRSZXF1ZXN0ZWRTZXNzaW9uSWQoKSB7CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0UGF0aCgpIHsKKyAgICByZXR1cm4gc2VydmxldFBhdGg7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIEh0dHBTZXNzaW9uIGdldFNlc3Npb24oKSB7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIEh0dHBTZXNzaW9uIGdldFNlc3Npb24oYm9vbGVhbiBjcmVhdGUpIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgUHJpbmNpcGFsIGdldFVzZXJQcmluY2lwYWwoKSB7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaXNSZXF1ZXN0ZWRTZXNzaW9uSWRGcm9tQ29va2llKCkgeworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbVVSTCgpIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBARGVwcmVjYXRlZAorICBwdWJsaWMgYm9vbGVhbiBpc1JlcXVlc3RlZFNlc3Npb25JZEZyb21VcmwoKSB7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaXNSZXF1ZXN0ZWRTZXNzaW9uSWRWYWxpZCgpIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpc1VzZXJJblJvbGUoU3RyaW5nIHJvbGUpIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0Zha2VIdHRwU2VydmxldFJlc3BvbnNlLmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvRmFrZUh0dHBTZXJ2bGV0UmVzcG9uc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2EwMDk5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0Zha2VIdHRwU2VydmxldFJlc3BvbnNlLmphdmEKQEAgLTAsMCArMSwyMDEgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuQ2hhcnNldHMuVVRGXzg7CisKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkNvb2tpZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworLyoqIFNpbXBsZSBmYWtlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBIdHRwU2VydmxldFJlc3BvbnNlfS4gKi8KK3B1YmxpYyBjbGFzcyBGYWtlSHR0cFNlcnZsZXRSZXNwb25zZSBpbXBsZW1lbnRzIEh0dHBTZXJ2bGV0UmVzcG9uc2UgeworCisgIHByaXZhdGUgdm9sYXRpbGUgaW50IHN0YXR1czsKKworICBwdWJsaWMgRmFrZUh0dHBTZXJ2bGV0UmVzcG9uc2UoKSB7CisgICAgc3RhdHVzID0gMjAwOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGZsdXNoQnVmZmVyKCkgeworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgZ2V0QnVmZmVyU2l6ZSgpIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldENoYXJhY3RlckVuY29kaW5nKCkgeworICAgIHJldHVybiBVVEZfOC5uYW1lKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgTG9jYWxlIGdldExvY2FsZSgpIHsKKyAgICByZXR1cm4gTG9jYWxlLlVTOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTZXJ2bGV0T3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgUHJpbnRXcml0ZXIgZ2V0V3JpdGVyKCkgeworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzQ29tbWl0dGVkKCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZXNldEJ1ZmZlcigpIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZXRCdWZmZXJTaXplKGludCBzeikgeworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNldENoYXJhY3RlckVuY29kaW5nKFN0cmluZyBuYW1lKSB7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc2V0Q29udGVudExlbmd0aChpbnQgbGVuZ3RoKSB7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc2V0Q29udGVudFR5cGUoU3RyaW5nIHR5cGUpIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZXRMb2NhbGUoTG9jYWxlIGxvY2FsZSkgeworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGFkZENvb2tpZShDb29raWUgY29va2llKSB7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgYWRkRGF0ZUhlYWRlcihTdHJpbmcgbmFtZSwgbG9uZyB2YWx1ZSkgeworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGFkZEhlYWRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgYWRkSW50SGVhZGVyKFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0hlYWRlcihTdHJpbmcgbmFtZSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGVuY29kZVJlZGlyZWN0VVJMKFN0cmluZyB1cmwpIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBARGVwcmVjYXRlZAorICBwdWJsaWMgU3RyaW5nIGVuY29kZVJlZGlyZWN0VXJsKFN0cmluZyB1cmwpIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGVuY29kZVVSTChTdHJpbmcgdXJsKSB7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgQERlcHJlY2F0ZWQKKyAgcHVibGljIFN0cmluZyBlbmNvZGVVcmwoU3RyaW5nIHVybCkgeworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNlbmRFcnJvcihpbnQgc2MpIHsKKyAgICBzdGF0dXMgPSBzYzsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZW5kRXJyb3IoaW50IHNjLCBTdHJpbmcgbXNnKSB7CisgICAgc3RhdHVzID0gc2M7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc2VuZFJlZGlyZWN0KFN0cmluZyBtc2cpIHsKKyAgICBzdGF0dXMgPSBTQ19GT1VORDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZXREYXRlSGVhZGVyKFN0cmluZyBuYW1lLCBsb25nIHZhbHVlKSB7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc2V0SGVhZGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZXRJbnRIZWFkZXIoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkgeworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhpbnQgc2MpIHsKKyAgICBzdGF0dXMgPSBzYzsKKyAgfQorCisgIEBPdmVycmlkZQorICBARGVwcmVjYXRlZAorICBwdWJsaWMgdm9pZCBzZXRTdGF0dXMoaW50IHNjLCBTdHJpbmcgbXNnKSB7CisgICAgc3RhdHVzID0gc2M7CisgIH0KKworICBwdWJsaWMgaW50IGdldFN0YXR1cygpIHsKKyAgICByZXR1cm4gc3RhdHVzOworICB9Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvR2l0aWxlc0ZpbHRlclRlc3QuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9HaXRpbGVzRmlsdGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMzJkZDQKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvR2l0aWxlc0ZpbHRlclRlc3QuamF2YQpAQCAtMCwwICsxLDE3MSBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5naXRpbGVzLkdpdGlsZXNGaWx0ZXIuUkVQT19QQVRIX1JFR0VYOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdpdGlsZXMuR2l0aWxlc0ZpbHRlci5SRVBPX1JFR0VYOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdpdGlsZXMuR2l0aWxlc0ZpbHRlci5ST09UX1JFR0VYOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CisKKy8qKiBUZXN0cyBmb3IgdGhlIEdpdGlsZXMgZmlsdGVyLiAqLworcHVibGljIGNsYXNzIEdpdGlsZXNGaWx0ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICBwdWJsaWMgdm9pZCB0ZXN0Um9vdFVybHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBhc3NlcnRGYWxzZShST09UX1JFR0VYLm1hdGNoZXIoIiIpLm1hdGNoZXMoKSk7CisgICAgYXNzZXJ0RmFsc2UoUk9PVF9SRUdFWC5tYXRjaGVyKCIvZm9vIikubWF0Y2hlcygpKTsKKyAgICBhc3NlcnRGYWxzZShST09UX1JFR0VYLm1hdGNoZXIoIi9mb28vIikubWF0Y2hlcygpKTsKKyAgICBhc3NlcnRGYWxzZShST09UX1JFR0VYLm1hdGNoZXIoIi9mb28vICIpLm1hdGNoZXMoKSk7CisgICAgYXNzZXJ0RmFsc2UoUk9PVF9SRUdFWC5tYXRjaGVyKCIvZm9vLysiKS5tYXRjaGVzKCkpOworICAgIGFzc2VydEZhbHNlKFJPT1RfUkVHRVgubWF0Y2hlcigiL2Zvby8rIikubWF0Y2hlcygpKTsKKyAgICBhc3NlcnRGYWxzZShST09UX1JFR0VYLm1hdGNoZXIoIi9mb28vIC8iKS5tYXRjaGVzKCkpOworICAgIGFzc2VydEZhbHNlKFJPT1RfUkVHRVgubWF0Y2hlcigiL2Zvby8rLyIpLm1hdGNoZXMoKSk7CisgICAgYXNzZXJ0RmFsc2UoUk9PVF9SRUdFWC5tYXRjaGVyKCIvZm9vLysvYmFyIikubWF0Y2hlcygpKTsKKyAgICBNYXRjaGVyIG07CisKKyAgICBtID0gUk9PVF9SRUdFWC5tYXRjaGVyKCIvIik7CisgICAgYXNzZXJ0VHJ1ZShtLm1hdGNoZXMoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIvIiwgbS5ncm91cCgwKSk7CisgICAgYXNzZXJ0RXF1YWxzKG0uZ3JvdXAoMCksIG0uZ3JvdXAoMSkpOworICAgIGFzc2VydEVxdWFscygiLyIsIG0uZ3JvdXAoMikpOworICAgIGFzc2VydEVxdWFscygiIiwgbS5ncm91cCgzKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIiLCBtLmdyb3VwKDQpKTsKKworICAgIG0gPSBST09UX1JFR0VYLm1hdGNoZXIoIi8vIik7CisgICAgYXNzZXJ0VHJ1ZShtLm1hdGNoZXMoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIvLyIsIG0uZ3JvdXAoMCkpOworICAgIGFzc2VydEVxdWFscyhtLmdyb3VwKDApLCBtLmdyb3VwKDEpKTsKKyAgICBhc3NlcnRFcXVhbHMoIi8iLCBtLmdyb3VwKDIpKTsKKyAgICBhc3NlcnRFcXVhbHMoIiIsIG0uZ3JvdXAoMykpOworICAgIGFzc2VydEVxdWFscygiIiwgbS5ncm91cCg0KSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UmVwb1VybHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBhc3NlcnRGYWxzZShSRVBPX1JFR0VYLm1hdGNoZXIoIiIpLm1hdGNoZXMoKSk7CisKKyAgICAvLyBUaGVzZSBtYXRjaCB0aGUgcmVnZXggYnV0IGFyZSBzZXJ2ZWQgYnkgdGhlIHJvb3QgcmVnZXggYmluZGVyLCB3aGljaCBpcworICAgIC8vIG1hdGNoZWQgZmlyc3QuCisgICAgYXNzZXJ0VHJ1ZShSRVBPX1JFR0VYLm1hdGNoZXIoIi8iKS5tYXRjaGVzKCkpOworICAgIGFzc2VydFRydWUoUkVQT19SRUdFWC5tYXRjaGVyKCIvLyIpLm1hdGNoZXMoKSk7CisKKyAgICBhc3NlcnRGYWxzZShSRVBPX1JFR0VYLm1hdGNoZXIoIi9mb28vKyIpLm1hdGNoZXMoKSk7CisgICAgYXNzZXJ0RmFsc2UoUkVQT19SRUdFWC5tYXRjaGVyKCIvZm9vL2Jhci8rIikubWF0Y2hlcygpKTsKKyAgICBhc3NlcnRGYWxzZShSRVBPX1JFR0VYLm1hdGNoZXIoIi9mb28vYmFyLysvIikubWF0Y2hlcygpKTsKKyAgICBhc3NlcnRGYWxzZShSRVBPX1JFR0VYLm1hdGNoZXIoIi9mb28vYmFyLysvYmF6IikubWF0Y2hlcygpKTsKKyAgICBNYXRjaGVyIG07CisKKyAgICBtID0gUkVQT19SRUdFWC5tYXRjaGVyKCIvZm9vIik7CisgICAgYXNzZXJ0VHJ1ZShtLm1hdGNoZXMoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIvZm9vIiwgbS5ncm91cCgwKSk7CisgICAgYXNzZXJ0RXF1YWxzKG0uZ3JvdXAoMCksIG0uZ3JvdXAoMSkpOworICAgIGFzc2VydEVxdWFscygiL2ZvbyIsIG0uZ3JvdXAoMikpOworICAgIGFzc2VydEVxdWFscygiIiwgbS5ncm91cCgzKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIiLCBtLmdyb3VwKDQpKTsKKworICAgIG0gPSBSRVBPX1JFR0VYLm1hdGNoZXIoIi9mb28vIik7CisgICAgYXNzZXJ0VHJ1ZShtLm1hdGNoZXMoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIvZm9vLyIsIG0uZ3JvdXAoMCkpOworICAgIGFzc2VydEVxdWFscyhtLmdyb3VwKDApLCBtLmdyb3VwKDEpKTsKKyAgICBhc3NlcnRFcXVhbHMoIi9mb28iLCBtLmdyb3VwKDIpKTsKKyAgICBhc3NlcnRFcXVhbHMoIiIsIG0uZ3JvdXAoMykpOworICAgIGFzc2VydEVxdWFscygiIiwgbS5ncm91cCg0KSk7CisKKyAgICBtID0gUkVQT19SRUdFWC5tYXRjaGVyKCIvZm9vL2JhciIpOworICAgIGFzc2VydFRydWUobS5tYXRjaGVzKCkpOworICAgIGFzc2VydEVxdWFscygiL2Zvby9iYXIiLCBtLmdyb3VwKDApKTsKKyAgICBhc3NlcnRFcXVhbHMobS5ncm91cCgwKSwgbS5ncm91cCgxKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIvZm9vL2JhciIsIG0uZ3JvdXAoMikpOworICAgIGFzc2VydEVxdWFscygiIiwgbS5ncm91cCgzKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIiLCBtLmdyb3VwKDQpKTsKKworICAgIG0gPSBSRVBPX1JFR0VYLm1hdGNoZXIoIi9mb28vYmFyK2JheiIpOworICAgIGFzc2VydFRydWUobS5tYXRjaGVzKCkpOworICAgIGFzc2VydEVxdWFscygiL2Zvby9iYXIrYmF6IiwgbS5ncm91cCgwKSk7CisgICAgYXNzZXJ0RXF1YWxzKG0uZ3JvdXAoMCksIG0uZ3JvdXAoMSkpOworICAgIGFzc2VydEVxdWFscygiL2Zvby9iYXIrYmF6IiwgbS5ncm91cCgyKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIiLCBtLmdyb3VwKDMpKTsKKyAgICBhc3NlcnRFcXVhbHMoIiIsIG0uZ3JvdXAoNCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFJlcG9QYXRoVXJscygpIHRocm93cyBFeGNlcHRpb24geworICAgIGFzc2VydEZhbHNlKFJFUE9fUEFUSF9SRUdFWC5tYXRjaGVyKCIiKS5tYXRjaGVzKCkpOworICAgIGFzc2VydEZhbHNlKFJFUE9fUEFUSF9SRUdFWC5tYXRjaGVyKCIvIikubWF0Y2hlcygpKTsKKyAgICBhc3NlcnRGYWxzZShSRVBPX1BBVEhfUkVHRVgubWF0Y2hlcigiLy8iKS5tYXRjaGVzKCkpOworICAgIGFzc2VydEZhbHNlKFJFUE9fUEFUSF9SRUdFWC5tYXRjaGVyKCIvZm9vIikubWF0Y2hlcygpKTsKKyAgICBhc3NlcnRGYWxzZShSRVBPX1BBVEhfUkVHRVgubWF0Y2hlcigiL2Zvby8gIikubWF0Y2hlcygpKTsKKyAgICBhc3NlcnRGYWxzZShSRVBPX1BBVEhfUkVHRVgubWF0Y2hlcigiL2Zvby8gLyIpLm1hdGNoZXMoKSk7CisgICAgYXNzZXJ0RmFsc2UoUkVQT19QQVRIX1JFR0VYLm1hdGNoZXIoIi9mb28vIC9iYXIiKS5tYXRjaGVzKCkpOworICAgIGFzc2VydEZhbHNlKFJFUE9fUEFUSF9SRUdFWC5tYXRjaGVyKCIvZm9vL2JhciIpLm1hdGNoZXMoKSk7CisgICAgYXNzZXJ0RmFsc2UoUkVQT19QQVRIX1JFR0VYLm1hdGNoZXIoIi9mb28vYmFyK2JheiIpLm1hdGNoZXMoKSk7CisgICAgTWF0Y2hlciBtOworCisgICAgbSA9IFJFUE9fUEFUSF9SRUdFWC5tYXRjaGVyKCIvZm9vLysiKTsKKyAgICBhc3NlcnRUcnVlKG0ubWF0Y2hlcygpKTsKKyAgICBhc3NlcnRFcXVhbHMoIi9mb28vKyIsIG0uZ3JvdXAoMCkpOworICAgIGFzc2VydEVxdWFscyhtLmdyb3VwKDApLCBtLmdyb3VwKDEpKTsKKyAgICBhc3NlcnRFcXVhbHMoIi9mb28iLCBtLmdyb3VwKDIpKTsKKyAgICBhc3NlcnRFcXVhbHMoIisiLCBtLmdyb3VwKDMpKTsKKyAgICBhc3NlcnRFcXVhbHMoIiIsIG0uZ3JvdXAoNCkpOworCisgICAgbSA9IFJFUE9fUEFUSF9SRUdFWC5tYXRjaGVyKCIvZm9vLysvIik7CisgICAgYXNzZXJ0VHJ1ZShtLm1hdGNoZXMoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIvZm9vLysvIiwgbS5ncm91cCgwKSk7CisgICAgYXNzZXJ0RXF1YWxzKG0uZ3JvdXAoMCksIG0uZ3JvdXAoMSkpOworICAgIGFzc2VydEVxdWFscygiL2ZvbyIsIG0uZ3JvdXAoMikpOworICAgIGFzc2VydEVxdWFscygiKyIsIG0uZ3JvdXAoMykpOworICAgIGFzc2VydEVxdWFscygiLyIsIG0uZ3JvdXAoNCkpOworCisgICAgbSA9IFJFUE9fUEFUSF9SRUdFWC5tYXRjaGVyKCIvZm9vLysvYmFyL2JheiIpOworICAgIGFzc2VydFRydWUobS5tYXRjaGVzKCkpOworICAgIGFzc2VydEVxdWFscygiL2Zvby8rL2Jhci9iYXoiLCBtLmdyb3VwKDApKTsKKyAgICBhc3NlcnRFcXVhbHMobS5ncm91cCgwKSwgbS5ncm91cCgxKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIvZm9vIiwgbS5ncm91cCgyKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIrIiwgbS5ncm91cCgzKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIvYmFyL2JheiIsIG0uZ3JvdXAoNCkpOworCisgICAgbSA9IFJFUE9fUEFUSF9SRUdFWC5tYXRjaGVyKCIvZm9vLysvYmFyL2Jhei8iKTsKKyAgICBhc3NlcnRUcnVlKG0ubWF0Y2hlcygpKTsKKyAgICBhc3NlcnRFcXVhbHMoIi9mb28vKy9iYXIvYmF6LyIsIG0uZ3JvdXAoMCkpOworICAgIGFzc2VydEVxdWFscyhtLmdyb3VwKDApLCBtLmdyb3VwKDEpKTsKKyAgICBhc3NlcnRFcXVhbHMoIi9mb28iLCBtLmdyb3VwKDIpKTsKKyAgICBhc3NlcnRFcXVhbHMoIisiLCBtLmdyb3VwKDMpKTsKKyAgICBhc3NlcnRFcXVhbHMoIi9iYXIvYmF6LyIsIG0uZ3JvdXAoNCkpOworCisgICAgbSA9IFJFUE9fUEFUSF9SRUdFWC5tYXRjaGVyKCIvZm9vLysvYmFyIGJheiIpOworICAgIGFzc2VydFRydWUobS5tYXRjaGVzKCkpOworICAgIGFzc2VydEVxdWFscygiL2Zvby8rL2JhciBiYXoiLCBtLmdyb3VwKDApKTsKKyAgICBhc3NlcnRFcXVhbHMobS5ncm91cCgwKSwgbS5ncm91cCgxKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIvZm9vIiwgbS5ncm91cCgyKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIrIiwgbS5ncm91cCgzKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIvYmFyIGJheiIsIG0uZ3JvdXAoNCkpOworCisgICAgbSA9IFJFUE9fUEFUSF9SRUdFWC5tYXRjaGVyKCIvZm9vLysvYmFyLysvYmF6Iik7CisgICAgYXNzZXJ0VHJ1ZShtLm1hdGNoZXMoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIvZm9vLysvYmFyLysvYmF6IiwgbS5ncm91cCgwKSk7CisgICAgYXNzZXJ0RXF1YWxzKG0uZ3JvdXAoMCksIG0uZ3JvdXAoMSkpOworICAgIGFzc2VydEVxdWFscygiL2ZvbyIsIG0uZ3JvdXAoMikpOworICAgIGFzc2VydEVxdWFscygiKyIsIG0uZ3JvdXAoMykpOworICAgIGFzc2VydEVxdWFscygiL2Jhci8rL2JheiIsIG0uZ3JvdXAoNCkpOworCisgICAgbSA9IFJFUE9fUEFUSF9SRUdFWC5tYXRjaGVyKCIvZm9vLytiYXIvYmF6Iik7CisgICAgYXNzZXJ0VHJ1ZShtLm1hdGNoZXMoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIvZm9vLytiYXIvYmF6IiwgbS5ncm91cCgwKSk7CisgICAgYXNzZXJ0RXF1YWxzKG0uZ3JvdXAoMCksIG0uZ3JvdXAoMSkpOworICAgIGFzc2VydEVxdWFscygiL2ZvbyIsIG0uZ3JvdXAoMikpOworICAgIGFzc2VydEVxdWFscygiK2JhciIsIG0uZ3JvdXAoMykpOworICAgIGFzc2VydEVxdWFscygiL2JheiIsIG0uZ3JvdXAoNCkpOworICB9Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvR2l0aWxlc1VybHNUZXN0LmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvR2l0aWxlc1VybHNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMyZmY4YgotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9HaXRpbGVzVXJsc1Rlc3QuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdpdGlsZXMuR2l0aWxlc1VybHMuTkFNRV9FU0NBUEVSOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKiogVW5pdCB0ZXN0cyBmb3Ige0BsaW5rIEdpdGlsZXNVcmxzfS4gKi8KK3B1YmxpYyBjbGFzcyBHaXRpbGVzVXJsc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgIHB1YmxpYyB2b2lkIHRlc3ROYW1lRXNjYXBlckVzY2FwZXNBcHByb3ByaWF0ZVNwZWNpYWxDaGFyYWN0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgYXNzZXJ0RXF1YWxzKCJmb29fYmFyIiwgTkFNRV9FU0NBUEVSLmFwcGx5KCJmb29fYmFyIikpOworICAgIGFzc2VydEVxdWFscygiZm9vLWJhciIsIE5BTUVfRVNDQVBFUi5hcHBseSgiZm9vLWJhciIpKTsKKyAgICBhc3NlcnRFcXVhbHMoImZvbyUyNWJhciIsIE5BTUVfRVNDQVBFUi5hcHBseSgiZm9vJWJhciIpKTsKKyAgICBhc3NlcnRFcXVhbHMoImZvbyUyNmJhciIsIE5BTUVfRVNDQVBFUi5hcHBseSgiZm9vJmJhciIpKTsKKyAgICBhc3NlcnRFcXVhbHMoImZvbyUyOGJhciIsIE5BTUVfRVNDQVBFUi5hcHBseSgiZm9vKGJhciIpKTsKKyAgICBhc3NlcnRFcXVhbHMoImZvbyUyOWJhciIsIE5BTUVfRVNDQVBFUi5hcHBseSgiZm9vKWJhciIpKTsKKyAgICBhc3NlcnRFcXVhbHMoImZvbyUzQWJhciIsIE5BTUVfRVNDQVBFUi5hcHBseSgiZm9vOmJhciIpKTsKKyAgICBhc3NlcnRFcXVhbHMoImZvbyUzQmJhciIsIE5BTUVfRVNDQVBFUi5hcHBseSgiZm9vO2JhciIpKTsKKyAgICBhc3NlcnRFcXVhbHMoImZvbyUzRGJhciIsIE5BTUVfRVNDQVBFUi5hcHBseSgiZm9vPWJhciIpKTsKKyAgICBhc3NlcnRFcXVhbHMoImZvbyUzRmJhciIsIE5BTUVfRVNDQVBFUi5hcHBseSgiZm9vP2JhciIpKTsKKyAgICBhc3NlcnRFcXVhbHMoImZvbyU1QmJhciIsIE5BTUVfRVNDQVBFUi5hcHBseSgiZm9vW2JhciIpKTsKKyAgICBhc3NlcnRFcXVhbHMoImZvbyU1RGJhciIsIE5BTUVfRVNDQVBFUi5hcHBseSgiZm9vXWJhciIpKTsKKyAgICBhc3NlcnRFcXVhbHMoImZvbyU3QmJhciIsIE5BTUVfRVNDQVBFUi5hcHBseSgiZm9ve2JhciIpKTsKKyAgICBhc3NlcnRFcXVhbHMoImZvbyU3RGJhciIsIE5BTUVfRVNDQVBFUi5hcHBseSgiZm9vfWJhciIpKTsKKyAgfQorICBwdWJsaWMgdm9pZCB0ZXN0TmFtZUVzY2FwZXJEb2VzTm90RXNjYXBlU2xhc2hlcygpIHRocm93cyBFeGNlcHRpb24geworICAgIGFzc2VydEVxdWFscygiZm9vL2JhciIsIE5BTUVfRVNDQVBFUi5hcHBseSgiZm9vL2JhciIpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3ROYW1lRXNjYXBlckVzY2FwZXNTcGFjZXNXaXRoUGVyY2VudEluc3RlYWRPZlBsdXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBhc3NlcnRFcXVhbHMoImZvbytiYXIiLCBOQU1FX0VTQ0FQRVIuYXBwbHkoImZvbytiYXIiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJmb28lMjBiYXIiLCBOQU1FX0VTQ0FQRVIuYXBwbHkoImZvbyBiYXIiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJmb28lMjUyMGJhciIsIE5BTUVfRVNDQVBFUi5hcHBseSgiZm9vJTIwYmFyIikpOworICB9Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvR2l0aWxlc1ZpZXdUZXN0LmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvR2l0aWxlc1ZpZXdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThhNWM0ZgotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9HaXRpbGVzVmlld1Rlc3QuamF2YQpAQCAtMCwwICsxLDUwNCBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0TXVsdGltYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5naXRpbGVzLkdpdGlsZXNWaWV3LlR5cGU7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKKworLyoqIFRlc3RzIGZvciBHaXRpbGVzIHZpZXdzLiAqLworcHVibGljIGNsYXNzIEdpdGlsZXNWaWV3VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgR2l0aWxlc1ZpZXcgSE9TVCA9IEdpdGlsZXNWaWV3Lmhvc3RJbmRleCgpCisgICAgICAuc2V0U2VydmxldFBhdGgoIi9iIikKKyAgICAgIC5zZXRIb3N0TmFtZSgiaG9zdCIpCisgICAgICAuYnVpbGQoKTsKKworICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlTZXJ2bGV0UGF0aCgpIHRocm93cyBFeGNlcHRpb24geworICAgIEdpdGlsZXNWaWV3IHZpZXcgPSBHaXRpbGVzVmlldy5ob3N0SW5kZXgoKQorICAgICAgICAuc2V0U2VydmxldFBhdGgoIiIpCisgICAgICAgIC5zZXRIb3N0TmFtZSgiaG9zdCIpCisgICAgICAgIC5idWlsZCgpOworICAgIGFzc2VydEVxdWFscygiIiwgdmlldy5nZXRTZXJ2bGV0UGF0aCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5IT1NUX0lOREVYLCB2aWV3LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJob3N0Iiwgdmlldy5nZXRIb3N0TmFtZSgpKTsKKyAgICBhc3NlcnROdWxsKHZpZXcuZ2V0UmVwb3NpdG9yeU5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFJldmlzaW9uLk5VTEwsIHZpZXcuZ2V0UmV2aXNpb24oKSk7CisgICAgYXNzZXJ0TnVsbCh2aWV3LmdldFRyZWVQYXRoKCkpOworICAgIGFzc2VydFRydWUoSE9TVC5nZXRQYXJhbWV0ZXJzKCkuaXNFbXB0eSgpKTsKKworICAgIGFzc2VydEVxdWFscygiLz9mb3JtYXQ9SFRNTCIsIHZpZXcudG9VcmwoKSk7CisgICAgYXNzZXJ0RXF1YWxzKEltbXV0YWJsZUxpc3Qub2YoSW1tdXRhYmxlTWFwLm9mKCJ0ZXh0IiwgImhvc3QiLCAidXJsIiwgIi8/Zm9ybWF0PUhUTUwiKSksCisgICAgICAgIHZpZXcuZ2V0QnJlYWRjcnVtYnMoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0SG9zdEluZGV4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgYXNzZXJ0RXF1YWxzKCIvYiIsIEhPU1QuZ2V0U2VydmxldFBhdGgoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuSE9TVF9JTkRFWCwgSE9TVC5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscygiaG9zdCIsIEhPU1QuZ2V0SG9zdE5hbWUoKSk7CisgICAgYXNzZXJ0TnVsbChIT1NULmdldFJlcG9zaXRvcnlOYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhSZXZpc2lvbi5OVUxMLCBIT1NULmdldFJldmlzaW9uKCkpOworICAgIGFzc2VydE51bGwoSE9TVC5nZXRUcmVlUGF0aCgpKTsKKyAgICBhc3NlcnRUcnVlKEhPU1QuZ2V0UGFyYW1ldGVycygpLmlzRW1wdHkoKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoIi9iLz9mb3JtYXQ9SFRNTCIsIEhPU1QudG9VcmwoKSk7CisgICAgYXNzZXJ0RXF1YWxzKEltbXV0YWJsZUxpc3Qub2YoSW1tdXRhYmxlTWFwLm9mKCJ0ZXh0IiwgImhvc3QiLCAidXJsIiwgIi9iLz9mb3JtYXQ9SFRNTCIpKSwKKyAgICAgICAgSE9TVC5nZXRCcmVhZGNydW1icygpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RRdWVyeVBhcmFtcygpIHRocm93cyBFeGNlcHRpb24geworICAgIEdpdGlsZXNWaWV3IHZpZXcgPSBHaXRpbGVzVmlldy5ob3N0SW5kZXgoKS5jb3B5RnJvbShIT1NUKQorICAgICAgICAucHV0UGFyYW0oImZvbyIsICJmb292YWx1ZSIpCisgICAgICAgIC5wdXRQYXJhbSgiYmFyIiwgImJhcnZhbHVlIikKKyAgICAgICAgLmJ1aWxkKCk7CisKKyAgICBhc3NlcnRFcXVhbHMoIi9iIiwgdmlldy5nZXRTZXJ2bGV0UGF0aCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5IT1NUX0lOREVYLCB2aWV3LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJob3N0Iiwgdmlldy5nZXRIb3N0TmFtZSgpKTsKKyAgICBhc3NlcnROdWxsKHZpZXcuZ2V0UmVwb3NpdG9yeU5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFJldmlzaW9uLk5VTEwsIHZpZXcuZ2V0UmV2aXNpb24oKSk7CisgICAgYXNzZXJ0TnVsbCh2aWV3LmdldFRyZWVQYXRoKCkpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgSW1tdXRhYmxlTGlzdE11bHRpbWFwLm9mKAorICAgICAgICAgICAgImZvbyIsICJmb292YWx1ZSIsCisgICAgICAgICAgICAiYmFyIiwgImJhcnZhbHVlIiksCisgICAgICAgIHZpZXcuZ2V0UGFyYW1ldGVycygpKTsKKworICAgIGFzc2VydEVxdWFscygiL2IvP2Zvcm1hdD1IVE1MJmZvbz1mb292YWx1ZSZiYXI9YmFydmFsdWUiLCB2aWV3LnRvVXJsKCkpOworICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVMaXN0Lm9mKEltbXV0YWJsZU1hcC5vZigidGV4dCIsICJob3N0IiwgInVybCIsICIvYi8/Zm9ybWF0PUhUTUwiKSksCisgICAgICAgIHZpZXcuZ2V0QnJlYWRjcnVtYnMoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UXVlcnlQYXJhbXNOb3RDb3BpZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBHaXRpbGVzVmlldyB2aWV3ID0gR2l0aWxlc1ZpZXcuaG9zdEluZGV4KCkuY29weUZyb20oSE9TVCkKKyAgICAgICAgLnB1dFBhcmFtKCJmb28iLCAiZm9vdmFsdWUiKQorICAgICAgICAucHV0UGFyYW0oImJhciIsICJiYXJ2YWx1ZSIpCisgICAgICAgIC5idWlsZCgpOworICAgIEdpdGlsZXNWaWV3IGNvcHkgPSBHaXRpbGVzVmlldy5ob3N0SW5kZXgoKS5jb3B5RnJvbSh2aWV3KS5idWlsZCgpOworICAgIGFzc2VydEZhbHNlKHZpZXcuZ2V0UGFyYW1ldGVycygpLmlzRW1wdHkoKSk7CisgICAgYXNzZXJ0VHJ1ZShjb3B5LmdldFBhcmFtZXRlcnMoKS5pc0VtcHR5KCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFJlcG9zaXRvcnlJbmRleCgpIHRocm93cyBFeGNlcHRpb24geworICAgIEdpdGlsZXNWaWV3IHZpZXcgPSBHaXRpbGVzVmlldy5yZXBvc2l0b3J5SW5kZXgoKQorICAgICAgICAuY29weUZyb20oSE9TVCkKKyAgICAgICAgLnNldFJlcG9zaXRvcnlOYW1lKCJmb28vYmFyIikKKyAgICAgICAgLmJ1aWxkKCk7CisKKyAgICBhc3NlcnRFcXVhbHMoIi9iIiwgdmlldy5nZXRTZXJ2bGV0UGF0aCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5SRVBPU0lUT1JZX0lOREVYLCB2aWV3LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJob3N0Iiwgdmlldy5nZXRIb3N0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImZvby9iYXIiLCB2aWV3LmdldFJlcG9zaXRvcnlOYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhSZXZpc2lvbi5OVUxMLCB2aWV3LmdldFJldmlzaW9uKCkpOworICAgIGFzc2VydE51bGwodmlldy5nZXRUcmVlUGF0aCgpKTsKKyAgICBhc3NlcnRUcnVlKEhPU1QuZ2V0UGFyYW1ldGVycygpLmlzRW1wdHkoKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoIi9iL2Zvby9iYXIvIiwgdmlldy50b1VybCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAgICAgICBicmVhZGNydW1iKCJob3N0IiwgIi9iLz9mb3JtYXQ9SFRNTCIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigiZm9vL2JhciIsICIvYi9mb28vYmFyLyIpKSwKKyAgICAgICAgdmlldy5nZXRCcmVhZGNydW1icygpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RSZWZXaXRoUmV2aXNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBPYmplY3RJZCBpZCA9IE9iamVjdElkLmZyb21TdHJpbmcoImFiY2QxMjM0YWJjZDEyMzRhYmNkMTIzNGFiY2QxMjM0YWJjZDEyMzQiKTsKKyAgICBHaXRpbGVzVmlldyB2aWV3ID0gR2l0aWxlc1ZpZXcucmV2aXNpb24oKQorICAgICAgICAuY29weUZyb20oSE9TVCkKKyAgICAgICAgLnNldFJlcG9zaXRvcnlOYW1lKCJmb28vYmFyIikKKyAgICAgICAgLnNldFJldmlzaW9uKFJldmlzaW9uLnVucGVlbGVkKCJtYXN0ZXIiLCBpZCkpCisgICAgICAgIC5idWlsZCgpOworCisgICAgYXNzZXJ0RXF1YWxzKCIvYiIsIHZpZXcuZ2V0U2VydmxldFBhdGgoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuUkVWSVNJT04sIHZpZXcuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImhvc3QiLCB2aWV3LmdldEhvc3ROYW1lKCkpOworICAgIGFzc2VydEVxdWFscygiZm9vL2JhciIsIHZpZXcuZ2V0UmVwb3NpdG9yeU5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGlkLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJtYXN0ZXIiLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnROdWxsKHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisgICAgYXNzZXJ0VHJ1ZShIT1NULmdldFBhcmFtZXRlcnMoKS5pc0VtcHR5KCkpOworCisgICAgYXNzZXJ0RXF1YWxzKCIvYi9mb28vYmFyLytzaG93L21hc3RlciIsIHZpZXcudG9VcmwoKSk7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBJbW11dGFibGVMaXN0Lm9mKAorICAgICAgICAgICAgYnJlYWRjcnVtYigiaG9zdCIsICIvYi8/Zm9ybWF0PUhUTUwiKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoImZvby9iYXIiLCAiL2IvZm9vL2Jhci8iKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoIm1hc3RlciIsICIvYi9mb28vYmFyLytzaG93L21hc3RlciIpKSwKKyAgICAgICAgdmlldy5nZXRCcmVhZGNydW1icygpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3ROb1BhdGhDb21wb25lbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgT2JqZWN0SWQgaWQgPSBPYmplY3RJZC5mcm9tU3RyaW5nKCJhYmNkMTIzNGFiY2QxMjM0YWJjZDEyMzRhYmNkMTIzNGFiY2QxMjM0Iik7CisgICAgR2l0aWxlc1ZpZXcgdmlldyA9IEdpdGlsZXNWaWV3LnBhdGgoKQorICAgICAgICAuY29weUZyb20oSE9TVCkKKyAgICAgICAgLnNldFJlcG9zaXRvcnlOYW1lKCJmb28vYmFyIikKKyAgICAgICAgLnNldFJldmlzaW9uKFJldmlzaW9uLnVucGVlbGVkKCJtYXN0ZXIiLCBpZCkpCisgICAgICAgIC5zZXRUcmVlUGF0aCgiLyIpCisgICAgICAgIC5idWlsZCgpOworCisgICAgYXNzZXJ0RXF1YWxzKCIvYiIsIHZpZXcuZ2V0U2VydmxldFBhdGgoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuUEFUSCwgdmlldy5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscygiaG9zdCIsIHZpZXcuZ2V0SG9zdE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJmb28vYmFyIiwgdmlldy5nZXRSZXBvc2l0b3J5TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoaWQsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIm1hc3RlciIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscygiIiwgdmlldy5nZXRUcmVlUGF0aCgpKTsKKyAgICBhc3NlcnRUcnVlKEhPU1QuZ2V0UGFyYW1ldGVycygpLmlzRW1wdHkoKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoIi9iL2Zvby9iYXIvKy9tYXN0ZXIvIiwgdmlldy50b1VybCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAgICAgICBicmVhZGNydW1iKCJob3N0IiwgIi9iLz9mb3JtYXQ9SFRNTCIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigiZm9vL2JhciIsICIvYi9mb28vYmFyLyIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigibWFzdGVyIiwgIi9iL2Zvby9iYXIvK3Nob3cvbWFzdGVyIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCIuIiwgIi9iL2Zvby9iYXIvKy9tYXN0ZXIvIikpLAorICAgICAgICB2aWV3LmdldEJyZWFkY3J1bWJzKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE9uZVBhdGhDb21wb25lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBPYmplY3RJZCBpZCA9IE9iamVjdElkLmZyb21TdHJpbmcoImFiY2QxMjM0YWJjZDEyMzRhYmNkMTIzNGFiY2QxMjM0YWJjZDEyMzQiKTsKKyAgICBHaXRpbGVzVmlldyB2aWV3ID0gR2l0aWxlc1ZpZXcucGF0aCgpCisgICAgICAgIC5jb3B5RnJvbShIT1NUKQorICAgICAgICAuc2V0UmVwb3NpdG9yeU5hbWUoImZvby9iYXIiKQorICAgICAgICAuc2V0UmV2aXNpb24oUmV2aXNpb24udW5wZWVsZWQoIm1hc3RlciIsIGlkKSkKKyAgICAgICAgLnNldFRyZWVQYXRoKCIvZmlsZSIpCisgICAgICAgIC5idWlsZCgpOworCisgICAgYXNzZXJ0RXF1YWxzKCIvYiIsIHZpZXcuZ2V0U2VydmxldFBhdGgoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuUEFUSCwgdmlldy5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscygiaG9zdCIsIHZpZXcuZ2V0SG9zdE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJmb28vYmFyIiwgdmlldy5nZXRSZXBvc2l0b3J5TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoaWQsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIm1hc3RlciIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscygiZmlsZSIsIHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisgICAgYXNzZXJ0VHJ1ZShIT1NULmdldFBhcmFtZXRlcnMoKS5pc0VtcHR5KCkpOworCisgICAgYXNzZXJ0RXF1YWxzKCIvYi9mb28vYmFyLysvbWFzdGVyL2ZpbGUiLCB2aWV3LnRvVXJsKCkpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgSW1tdXRhYmxlTGlzdC5vZigKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoImhvc3QiLCAiL2IvP2Zvcm1hdD1IVE1MIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJmb28vYmFyIiwgIi9iL2Zvby9iYXIvIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJtYXN0ZXIiLCAiL2IvZm9vL2Jhci8rc2hvdy9tYXN0ZXIiKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoIi4iLCAiL2IvZm9vL2Jhci8rL21hc3Rlci8iKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoImZpbGUiLCAiL2IvZm9vL2Jhci8rL21hc3Rlci9maWxlIikpLAorICAgICAgICB2aWV3LmdldEJyZWFkY3J1bWJzKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlUGF0aENvbXBvbmVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBPYmplY3RJZCBpZCA9IE9iamVjdElkLmZyb21TdHJpbmcoImFiY2QxMjM0YWJjZDEyMzRhYmNkMTIzNGFiY2QxMjM0YWJjZDEyMzQiKTsKKyAgICBHaXRpbGVzVmlldyB2aWV3ID0gR2l0aWxlc1ZpZXcucGF0aCgpCisgICAgICAgIC5jb3B5RnJvbShIT1NUKQorICAgICAgICAuc2V0UmVwb3NpdG9yeU5hbWUoImZvby9iYXIiKQorICAgICAgICAuc2V0UmV2aXNpb24oUmV2aXNpb24udW5wZWVsZWQoIm1hc3RlciIsIGlkKSkKKyAgICAgICAgLnNldFRyZWVQYXRoKCIvcGF0aC90by9hL2ZpbGUiKQorICAgICAgICAuYnVpbGQoKTsKKworICAgIGFzc2VydEVxdWFscygiL2IiLCB2aWV3LmdldFNlcnZsZXRQYXRoKCkpOworICAgIGFzc2VydEVxdWFscyhUeXBlLlBBVEgsIHZpZXcuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImhvc3QiLCB2aWV3LmdldEhvc3ROYW1lKCkpOworICAgIGFzc2VydEVxdWFscygiZm9vL2JhciIsIHZpZXcuZ2V0UmVwb3NpdG9yeU5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGlkLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJtYXN0ZXIiLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoInBhdGgvdG8vYS9maWxlIiwgdmlldy5nZXRUcmVlUGF0aCgpKTsKKyAgICBhc3NlcnRUcnVlKEhPU1QuZ2V0UGFyYW1ldGVycygpLmlzRW1wdHkoKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoIi9iL2Zvby9iYXIvKy9tYXN0ZXIvcGF0aC90by9hL2ZpbGUiLCB2aWV3LnRvVXJsKCkpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgSW1tdXRhYmxlTGlzdC5vZigKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoImhvc3QiLCAiL2IvP2Zvcm1hdD1IVE1MIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJmb28vYmFyIiwgIi9iL2Zvby9iYXIvIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJtYXN0ZXIiLCAiL2IvZm9vL2Jhci8rc2hvdy9tYXN0ZXIiKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoIi4iLCAiL2IvZm9vL2Jhci8rL21hc3Rlci8iKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoInBhdGgiLCAiL2IvZm9vL2Jhci8rL21hc3Rlci9wYXRoIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJ0byIsICIvYi9mb28vYmFyLysvbWFzdGVyL3BhdGgvdG8iKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoImEiLCAiL2IvZm9vL2Jhci8rL21hc3Rlci9wYXRoL3RvL2EiKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoImZpbGUiLCAiL2IvZm9vL2Jhci8rL21hc3Rlci9wYXRoL3RvL2EvZmlsZSIpKSwKKyAgICAgICAgdmlldy5nZXRCcmVhZGNydW1icygpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3REaWZmQWdhaW5zdEZpcnN0UGFyZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgT2JqZWN0SWQgaWQgPSBPYmplY3RJZC5mcm9tU3RyaW5nKCJhYmNkMTIzNGFiY2QxMjM0YWJjZDEyMzRhYmNkMTIzNGFiY2QxMjM0Iik7CisgICAgT2JqZWN0SWQgcGFyZW50ID0gT2JqZWN0SWQuZnJvbVN0cmluZygiZWZhYjU2NzhlZmFiNTY3OGVmYWI1Njc4ZWZhYjU2NzhlZmFiNTY3OCIpOworICAgIEdpdGlsZXNWaWV3IHZpZXcgPSBHaXRpbGVzVmlldy5kaWZmKCkKKyAgICAgICAgLmNvcHlGcm9tKEhPU1QpCisgICAgICAgIC5zZXRSZXBvc2l0b3J5TmFtZSgiZm9vL2JhciIpCisgICAgICAgIC5zZXRSZXZpc2lvbihSZXZpc2lvbi51bnBlZWxlZCgibWFzdGVyIiwgaWQpKQorICAgICAgICAuc2V0T2xkUmV2aXNpb24oUmV2aXNpb24udW5wZWVsZWQoIm1hc3Rlcl4iLCBwYXJlbnQpKQorICAgICAgICAuc2V0VHJlZVBhdGgoIi9wYXRoL3RvL2EvZmlsZSIpCisgICAgICAgIC5idWlsZCgpOworCisgICAgYXNzZXJ0RXF1YWxzKCIvYiIsIHZpZXcuZ2V0U2VydmxldFBhdGgoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuRElGRiwgdmlldy5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscygiaG9zdCIsIHZpZXcuZ2V0SG9zdE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJmb28vYmFyIiwgdmlldy5nZXRSZXBvc2l0b3J5TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoaWQsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIm1hc3RlciIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscygibWFzdGVyXiIsIHZpZXcuZ2V0T2xkUmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscygicGF0aC90by9hL2ZpbGUiLCB2aWV3LmdldFRyZWVQYXRoKCkpOworICAgIGFzc2VydFRydWUoSE9TVC5nZXRQYXJhbWV0ZXJzKCkuaXNFbXB0eSgpKTsKKworICAgIGFzc2VydEVxdWFscygiL2IvZm9vL2Jhci8rL21hc3RlciU1RSUyMS9wYXRoL3RvL2EvZmlsZSIsIHZpZXcudG9VcmwoKSk7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBJbW11dGFibGVMaXN0Lm9mKAorICAgICAgICAgICAgYnJlYWRjcnVtYigiaG9zdCIsICIvYi8/Zm9ybWF0PUhUTUwiKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoImZvby9iYXIiLCAiL2IvZm9vL2Jhci8iKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoIm1hc3Rlcl4hIiwgIi9iL2Zvby9iYXIvKy9tYXN0ZXIlNUUlMjEvIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCIuIiwgIi9iL2Zvby9iYXIvKy9tYXN0ZXIlNUUlMjEvIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJwYXRoIiwgIi9iL2Zvby9iYXIvKy9tYXN0ZXIlNUUlMjEvcGF0aCIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigidG8iLCAiL2IvZm9vL2Jhci8rL21hc3RlciU1RSUyMS9wYXRoL3RvIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJhIiwgIi9iL2Zvby9iYXIvKy9tYXN0ZXIlNUUlMjEvcGF0aC90by9hIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJmaWxlIiwgIi9iL2Zvby9iYXIvKy9tYXN0ZXIlNUUlMjEvcGF0aC90by9hL2ZpbGUiKSksCisgICAgICAgIHZpZXcuZ2V0QnJlYWRjcnVtYnMoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RGlmZkFnYWluc3RFbXB0eVJldmlzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgT2JqZWN0SWQgaWQgPSBPYmplY3RJZC5mcm9tU3RyaW5nKCJhYmNkMTIzNGFiY2QxMjM0YWJjZDEyMzRhYmNkMTIzNGFiY2QxMjM0Iik7CisgICAgR2l0aWxlc1ZpZXcgdmlldyA9IEdpdGlsZXNWaWV3LmRpZmYoKQorICAgICAgICAuY29weUZyb20oSE9TVCkKKyAgICAgICAgLnNldFJlcG9zaXRvcnlOYW1lKCJmb28vYmFyIikKKyAgICAgICAgLnNldFJldmlzaW9uKFJldmlzaW9uLnVucGVlbGVkKCJtYXN0ZXIiLCBpZCkpCisgICAgICAgIC5zZXRUcmVlUGF0aCgiL3BhdGgvdG8vYS9maWxlIikKKyAgICAgICAgLmJ1aWxkKCk7CisKKyAgICBhc3NlcnRFcXVhbHMoIi9iIiwgdmlldy5nZXRTZXJ2bGV0UGF0aCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5ESUZGLCB2aWV3LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJob3N0Iiwgdmlldy5nZXRIb3N0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImZvby9iYXIiLCB2aWV3LmdldFJlcG9zaXRvcnlOYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhpZCwgdmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydEVxdWFscygibWFzdGVyIiwgdmlldy5nZXRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFJldmlzaW9uLk5VTEwsIHZpZXcuZ2V0T2xkUmV2aXNpb24oKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJwYXRoL3RvL2EvZmlsZSIsIHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisgICAgYXNzZXJ0VHJ1ZShIT1NULmdldFBhcmFtZXRlcnMoKS5pc0VtcHR5KCkpOworCisgICAgYXNzZXJ0RXF1YWxzKCIvYi9mb28vYmFyLysvbWFzdGVyJTVFJTIxL3BhdGgvdG8vYS9maWxlIiwgdmlldy50b1VybCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAgICAgICBicmVhZGNydW1iKCJob3N0IiwgIi9iLz9mb3JtYXQ9SFRNTCIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigiZm9vL2JhciIsICIvYi9mb28vYmFyLyIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigibWFzdGVyXiEiLCAiL2IvZm9vL2Jhci8rL21hc3RlciU1RSUyMS8iKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoIi4iLCAiL2IvZm9vL2Jhci8rL21hc3RlciU1RSUyMS8iKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoInBhdGgiLCAiL2IvZm9vL2Jhci8rL21hc3RlciU1RSUyMS9wYXRoIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJ0byIsICIvYi9mb28vYmFyLysvbWFzdGVyJTVFJTIxL3BhdGgvdG8iKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoImEiLCAiL2IvZm9vL2Jhci8rL21hc3RlciU1RSUyMS9wYXRoL3RvL2EiKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoImZpbGUiLCAiL2IvZm9vL2Jhci8rL21hc3RlciU1RSUyMS9wYXRoL3RvL2EvZmlsZSIpKSwKKyAgICAgICAgdmlldy5nZXRCcmVhZGNydW1icygpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3REaWZmQWdhaW5zdE90aGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgT2JqZWN0SWQgaWQgPSBPYmplY3RJZC5mcm9tU3RyaW5nKCJhYmNkMTIzNGFiY2QxMjM0YWJjZDEyMzRhYmNkMTIzNGFiY2QxMjM0Iik7CisgICAgT2JqZWN0SWQgb3RoZXIgPSBPYmplY3RJZC5mcm9tU3RyaW5nKCJlZmFiNTY3OGVmYWI1Njc4ZWZhYjU2NzhlZmFiNTY3OGVmYWI1Njc4Iik7CisgICAgR2l0aWxlc1ZpZXcgdmlldyA9IEdpdGlsZXNWaWV3LmRpZmYoKQorICAgICAgICAuY29weUZyb20oSE9TVCkKKyAgICAgICAgLnNldFJlcG9zaXRvcnlOYW1lKCJmb28vYmFyIikKKyAgICAgICAgLnNldFJldmlzaW9uKFJldmlzaW9uLnVucGVlbGVkKCJtYXN0ZXIiLCBpZCkpCisgICAgICAgIC5zZXRPbGRSZXZpc2lvbihSZXZpc2lvbi51bnBlZWxlZCgiZWZhYjU2NzgiLCBvdGhlcikpCisgICAgICAgIC5zZXRUcmVlUGF0aCgiL3BhdGgvdG8vYS9maWxlIikKKyAgICAgICAgLmJ1aWxkKCk7CisKKyAgICBhc3NlcnRFcXVhbHMoIi9iIiwgdmlldy5nZXRTZXJ2bGV0UGF0aCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5ESUZGLCB2aWV3LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJob3N0Iiwgdmlldy5nZXRIb3N0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImZvby9iYXIiLCB2aWV3LmdldFJlcG9zaXRvcnlOYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhpZCwgdmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydEVxdWFscygibWFzdGVyIiwgdmlldy5nZXRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJlZmFiNTY3OCIsIHZpZXcuZ2V0T2xkUmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscygicGF0aC90by9hL2ZpbGUiLCB2aWV3LmdldFRyZWVQYXRoKCkpOworICAgIGFzc2VydFRydWUoSE9TVC5nZXRQYXJhbWV0ZXJzKCkuaXNFbXB0eSgpKTsKKworICAgIGFzc2VydEVxdWFscygiL2IvZm9vL2Jhci8rL2VmYWI1Njc4Li5tYXN0ZXIvcGF0aC90by9hL2ZpbGUiLCB2aWV3LnRvVXJsKCkpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgSW1tdXRhYmxlTGlzdC5vZigKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoImhvc3QiLCAiL2IvP2Zvcm1hdD1IVE1MIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJmb28vYmFyIiwgIi9iL2Zvby9iYXIvIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJlZmFiNTY3OC4ubWFzdGVyIiwgIi9iL2Zvby9iYXIvKy9lZmFiNTY3OC4ubWFzdGVyLyIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigiLiIsICIvYi9mb28vYmFyLysvZWZhYjU2NzguLm1hc3Rlci8iKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoInBhdGgiLCAiL2IvZm9vL2Jhci8rL2VmYWI1Njc4Li5tYXN0ZXIvcGF0aCIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigidG8iLCAiL2IvZm9vL2Jhci8rL2VmYWI1Njc4Li5tYXN0ZXIvcGF0aC90byIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigiYSIsICIvYi9mb28vYmFyLysvZWZhYjU2NzguLm1hc3Rlci9wYXRoL3RvL2EiKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoImZpbGUiLCAiL2IvZm9vL2Jhci8rL2VmYWI1Njc4Li5tYXN0ZXIvcGF0aC90by9hL2ZpbGUiKSksCisgICAgICAgIHZpZXcuZ2V0QnJlYWRjcnVtYnMoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0QnJhbmNoTG9nV2l0aG91dFBhdGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBPYmplY3RJZCBpZCA9IE9iamVjdElkLmZyb21TdHJpbmcoImFiY2QxMjM0YWJjZDEyMzRhYmNkMTIzNGFiY2QxMjM0YWJjZDEyMzQiKTsKKyAgICBHaXRpbGVzVmlldyB2aWV3ID0gR2l0aWxlc1ZpZXcubG9nKCkKKyAgICAgICAgLmNvcHlGcm9tKEhPU1QpCisgICAgICAgIC5zZXRSZXBvc2l0b3J5TmFtZSgiZm9vL2JhciIpCisgICAgICAgIC5zZXRSZXZpc2lvbihSZXZpc2lvbi51bnBlZWxlZCgibWFzdGVyIiwgaWQpKQorICAgICAgICAuYnVpbGQoKTsKKworICAgIGFzc2VydEVxdWFscygiL2IiLCB2aWV3LmdldFNlcnZsZXRQYXRoKCkpOworICAgIGFzc2VydEVxdWFscyhUeXBlLkxPRywgdmlldy5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscygiaG9zdCIsIHZpZXcuZ2V0SG9zdE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJmb28vYmFyIiwgdmlldy5nZXRSZXBvc2l0b3J5TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoaWQsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIm1hc3RlciIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhSZXZpc2lvbi5OVUxMLCB2aWV3LmdldE9sZFJldmlzaW9uKCkpOworICAgIGFzc2VydE51bGwodmlldy5nZXRUcmVlUGF0aCgpKTsKKyAgICBhc3NlcnRUcnVlKEhPU1QuZ2V0UGFyYW1ldGVycygpLmlzRW1wdHkoKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoIi9iL2Zvby9iYXIvKy9tYXN0ZXIiLCB2aWV3LnRvVXJsKCkpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgSW1tdXRhYmxlTGlzdC5vZigKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoImhvc3QiLCAiL2IvP2Zvcm1hdD1IVE1MIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJmb28vYmFyIiwgIi9iL2Zvby9iYXIvIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJtYXN0ZXIiLCAiL2IvZm9vL2Jhci8rL21hc3RlciIpKSwKKyAgICAgICAgdmlldy5nZXRCcmVhZGNydW1icygpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RJZExvZ1dpdGhvdXRQYXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgT2JqZWN0SWQgaWQgPSBPYmplY3RJZC5mcm9tU3RyaW5nKCJhYmNkMTIzNGFiY2QxMjM0YWJjZDEyMzRhYmNkMTIzNGFiY2QxMjM0Iik7CisgICAgR2l0aWxlc1ZpZXcgdmlldyA9IEdpdGlsZXNWaWV3LmxvZygpCisgICAgICAgIC5jb3B5RnJvbShIT1NUKQorICAgICAgICAuc2V0UmVwb3NpdG9yeU5hbWUoImZvby9iYXIiKQorICAgICAgICAuc2V0UmV2aXNpb24oUmV2aXNpb24udW5wZWVsZWQoImFiY2QxMjM0IiwgaWQpKQorICAgICAgICAuYnVpbGQoKTsKKworICAgIGFzc2VydEVxdWFscygiL2IiLCB2aWV3LmdldFNlcnZsZXRQYXRoKCkpOworICAgIGFzc2VydEVxdWFscyhUeXBlLkxPRywgdmlldy5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscygiaG9zdCIsIHZpZXcuZ2V0SG9zdE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJmb28vYmFyIiwgdmlldy5nZXRSZXBvc2l0b3J5TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoaWQsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImFiY2QxMjM0Iiwgdmlldy5nZXRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFJldmlzaW9uLk5VTEwsIHZpZXcuZ2V0T2xkUmV2aXNpb24oKSk7CisgICAgYXNzZXJ0TnVsbCh2aWV3LmdldFRyZWVQYXRoKCkpOworICAgIGFzc2VydFRydWUoSE9TVC5nZXRQYXJhbWV0ZXJzKCkuaXNFbXB0eSgpKTsKKworICAgIGFzc2VydEVxdWFscygiL2IvZm9vL2Jhci8rbG9nL2FiY2QxMjM0Iiwgdmlldy50b1VybCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAgICAgICBicmVhZGNydW1iKCJob3N0IiwgIi9iLz9mb3JtYXQ9SFRNTCIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigiZm9vL2JhciIsICIvYi9mb28vYmFyLyIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigiYWJjZDEyMzQiLCAiL2IvZm9vL2Jhci8rbG9nL2FiY2QxMjM0IikpLAorICAgICAgICB2aWV3LmdldEJyZWFkY3J1bWJzKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdExvZ1dpdGhvdXRPbGRSZXZpc2lvbigpIHRocm93cyBFeGNlcHRpb24geworICAgIE9iamVjdElkIGlkID0gT2JqZWN0SWQuZnJvbVN0cmluZygiYWJjZDEyMzRhYmNkMTIzNGFiY2QxMjM0YWJjZDEyMzRhYmNkMTIzNCIpOworICAgIEdpdGlsZXNWaWV3IHZpZXcgPSBHaXRpbGVzVmlldy5sb2coKQorICAgICAgICAuY29weUZyb20oSE9TVCkKKyAgICAgICAgLnNldFJlcG9zaXRvcnlOYW1lKCJmb28vYmFyIikKKyAgICAgICAgLnNldFJldmlzaW9uKFJldmlzaW9uLnVucGVlbGVkKCJtYXN0ZXIiLCBpZCkpCisgICAgICAgIC5zZXRUcmVlUGF0aCgiL3BhdGgvdG8vYS9maWxlIikKKyAgICAgICAgLmJ1aWxkKCk7CisKKyAgICBhc3NlcnRFcXVhbHMoIi9iIiwgdmlldy5nZXRTZXJ2bGV0UGF0aCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5MT0csIHZpZXcuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImhvc3QiLCB2aWV3LmdldEhvc3ROYW1lKCkpOworICAgIGFzc2VydEVxdWFscygiZm9vL2JhciIsIHZpZXcuZ2V0UmVwb3NpdG9yeU5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGlkLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJtYXN0ZXIiLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoUmV2aXNpb24uTlVMTCwgdmlldy5nZXRPbGRSZXZpc2lvbigpKTsKKyAgICBhc3NlcnRFcXVhbHMoInBhdGgvdG8vYS9maWxlIiwgdmlldy5nZXRUcmVlUGF0aCgpKTsKKyAgICBhc3NlcnRUcnVlKEhPU1QuZ2V0UGFyYW1ldGVycygpLmlzRW1wdHkoKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoIi9iL2Zvby9iYXIvK2xvZy9tYXN0ZXIvcGF0aC90by9hL2ZpbGUiLCB2aWV3LnRvVXJsKCkpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgSW1tdXRhYmxlTGlzdC5vZigKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoImhvc3QiLCAiL2IvP2Zvcm1hdD1IVE1MIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJmb28vYmFyIiwgIi9iL2Zvby9iYXIvIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJtYXN0ZXIiLCAiL2IvZm9vL2Jhci8rL21hc3RlciIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigicGF0aCIsICIvYi9mb28vYmFyLytsb2cvbWFzdGVyL3BhdGgiKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoInRvIiwgIi9iL2Zvby9iYXIvK2xvZy9tYXN0ZXIvcGF0aC90byIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigiYSIsICIvYi9mb28vYmFyLytsb2cvbWFzdGVyL3BhdGgvdG8vYSIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigiZmlsZSIsICIvYi9mb28vYmFyLytsb2cvbWFzdGVyL3BhdGgvdG8vYS9maWxlIikpLAorICAgICAgICB2aWV3LmdldEJyZWFkY3J1bWJzKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdExvZ1dpdGhPbGRSZXZpc2lvbigpIHRocm93cyBFeGNlcHRpb24geworICAgIE9iamVjdElkIGlkID0gT2JqZWN0SWQuZnJvbVN0cmluZygiYWJjZDEyMzRhYmNkMTIzNGFiY2QxMjM0YWJjZDEyMzRhYmNkMTIzNCIpOworICAgIE9iamVjdElkIHBhcmVudCA9IE9iamVjdElkLmZyb21TdHJpbmcoImVmYWI1Njc4ZWZhYjU2NzhlZmFiNTY3OGVmYWI1Njc4ZWZhYjU2NzgiKTsKKyAgICBHaXRpbGVzVmlldyB2aWV3ID0gR2l0aWxlc1ZpZXcubG9nKCkKKyAgICAgICAgLmNvcHlGcm9tKEhPU1QpCisgICAgICAgIC5zZXRSZXBvc2l0b3J5TmFtZSgiZm9vL2JhciIpCisgICAgICAgIC5zZXRSZXZpc2lvbihSZXZpc2lvbi51bnBlZWxlZCgibWFzdGVyIiwgaWQpKQorICAgICAgICAuc2V0T2xkUmV2aXNpb24oUmV2aXNpb24udW5wZWVsZWQoIm1hc3Rlcl4iLCBwYXJlbnQpKQorICAgICAgICAuc2V0VHJlZVBhdGgoIi9wYXRoL3RvL2EvZmlsZSIpCisgICAgICAgIC5idWlsZCgpOworCisgICAgYXNzZXJ0RXF1YWxzKCIvYiIsIHZpZXcuZ2V0U2VydmxldFBhdGgoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuTE9HLCB2aWV3LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJob3N0Iiwgdmlldy5nZXRIb3N0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImZvby9iYXIiLCB2aWV3LmdldFJlcG9zaXRvcnlOYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhpZCwgdmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydEVxdWFscygibWFzdGVyIiwgdmlldy5nZXRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJtYXN0ZXJeIiwgdmlldy5nZXRPbGRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJwYXRoL3RvL2EvZmlsZSIsIHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisgICAgYXNzZXJ0VHJ1ZShIT1NULmdldFBhcmFtZXRlcnMoKS5pc0VtcHR5KCkpOworCisgICAgYXNzZXJ0RXF1YWxzKCIvYi9mb28vYmFyLytsb2cvbWFzdGVyJTVFLi5tYXN0ZXIvcGF0aC90by9hL2ZpbGUiLCB2aWV3LnRvVXJsKCkpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgSW1tdXRhYmxlTGlzdC5vZigKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoImhvc3QiLCAiL2IvP2Zvcm1hdD1IVE1MIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJmb28vYmFyIiwgIi9iL2Zvby9iYXIvIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJtYXN0ZXJeLi5tYXN0ZXIiLCAiL2IvZm9vL2Jhci8rbG9nL21hc3RlciU1RS4ubWFzdGVyIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJwYXRoIiwgIi9iL2Zvby9iYXIvK2xvZy9tYXN0ZXIlNUUuLm1hc3Rlci9wYXRoIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJ0byIsICIvYi9mb28vYmFyLytsb2cvbWFzdGVyJTVFLi5tYXN0ZXIvcGF0aC90byIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigiYSIsICIvYi9mb28vYmFyLytsb2cvbWFzdGVyJTVFLi5tYXN0ZXIvcGF0aC90by9hIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJmaWxlIiwgIi9iL2Zvby9iYXIvK2xvZy9tYXN0ZXIlNUUuLm1hc3Rlci9wYXRoL3RvL2EvZmlsZSIpKSwKKyAgICAgICAgdmlldy5nZXRCcmVhZGNydW1icygpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RFc2NhcGluZygpIHRocm93cyBFeGNlcHRpb24geworICAgIE9iamVjdElkIGlkID0gT2JqZWN0SWQuZnJvbVN0cmluZygiYWJjZDEyMzRhYmNkMTIzNGFiY2QxMjM0YWJjZDEyMzRhYmNkMTIzNCIpOworICAgIE9iamVjdElkIHBhcmVudCA9IE9iamVjdElkLmZyb21TdHJpbmcoImVmYWI1Njc4ZWZhYjU2NzhlZmFiNTY3OGVmYWI1Njc4ZWZhYjU2NzgiKTsKKyAgICAvLyBTb21lIG9mIHRoZXNlIHZhbHVlcyBhcmUgbm90IHZhbGlkIGZvciBHaXQsIGJ1dCBjaGVjayB0aGVtIGFueXdheS4KKyAgICBHaXRpbGVzVmlldyB2aWV3ID0gR2l0aWxlc1ZpZXcubG9nKCkKKyAgICAgICAgLmNvcHlGcm9tKEhPU1QpCisgICAgICAgIC5zZXRSZXBvc2l0b3J5TmFtZSgiZm9vP2JhciIpCisgICAgICAgIC5zZXRSZXZpc2lvbihSZXZpc2lvbi51bnBlZWxlZCgiYmEvZCNuYW1lIiwgaWQpKQorICAgICAgICAuc2V0T2xkUmV2aXNpb24oUmV2aXNpb24udW5wZWVsZWQoIm90aGVyXCJuYS9tZSIsIHBhcmVudCkpCisgICAgICAgIC5zZXRUcmVlUGF0aCgid2UgaXJkL3BhJ3RoL25hbWUiKQorICAgICAgICAucHV0UGFyYW0oImsgZSB5IiwgInZhbC91ZSIpCisgICAgICAgIC5zZXRBbmNob3IoImFuYyNob3IiKQorICAgICAgICAuYnVpbGQoKTsKKworICAgIC8vIEZpZWxkcyByZXR1cm5lZCBieSBnZXR0ZXJzIGFyZSBub3QgZXNjYXBlZC4KKyAgICBhc3NlcnRFcXVhbHMoIi9iIiwgdmlldy5nZXRTZXJ2bGV0UGF0aCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5MT0csIHZpZXcuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImhvc3QiLCB2aWV3LmdldEhvc3ROYW1lKCkpOworICAgIGFzc2VydEVxdWFscygiZm9vP2JhciIsIHZpZXcuZ2V0UmVwb3NpdG9yeU5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGlkLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJiYS9kI25hbWUiLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMocGFyZW50LCB2aWV3LmdldE9sZFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJvdGhlclwibmEvbWUiLCB2aWV3LmdldE9sZFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIndlIGlyZC9wYSd0aC9uYW1lIiwgdmlldy5nZXRUcmVlUGF0aCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoSW1tdXRhYmxlTGlzdE11bHRpbWFwLjxTdHJpbmcsIFN0cmluZz4gb2YoImsgZSB5IiwgInZhbC91ZSIpLAorICAgICAgICB2aWV3LmdldFBhcmFtZXRlcnMoKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICIvYi9mb28lM0ZiYXIvK2xvZy9vdGhlciUyMm5hL21lLi5iYS9kJTIzbmFtZS93ZSUyMGlyZC9wYSUyN3RoL25hbWUiCisgICAgICAgICsgIj9rK2UreT12YWwlMkZ1ZSNhbmMlMjNob3IiLCB2aWV3LnRvVXJsKCkpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgSW1tdXRhYmxlTGlzdC5vZigKKyAgICAgICAgICAgIC8vIE5hbWVzIGFyZSBub3QgZXNjYXBlZCAoYXV0by1lc2NhcGVkIGJ5IFNveSkgYnV0IHZhbHVlcyBhcmUuCisgICAgICAgICAgICBicmVhZGNydW1iKCJob3N0IiwgIi9iLz9mb3JtYXQ9SFRNTCIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigiZm9vP2JhciIsICIvYi9mb28lM0ZiYXIvIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJvdGhlclwibmEvbWUuLmJhL2QjbmFtZSIsICIvYi9mb28lM0ZiYXIvK2xvZy9vdGhlciUyMm5hL21lLi5iYS9kJTIzbmFtZSIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigid2UgaXJkIiwgIi9iL2ZvbyUzRmJhci8rbG9nL290aGVyJTIybmEvbWUuLmJhL2QlMjNuYW1lL3dlJTIwaXJkIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJwYSd0aCIsICIvYi9mb28lM0ZiYXIvK2xvZy9vdGhlciUyMm5hL21lLi5iYS9kJTIzbmFtZS93ZSUyMGlyZC9wYSUyN3RoIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJuYW1lIiwKKyAgICAgICAgICAgICAgIi9iL2ZvbyUzRmJhci8rbG9nL290aGVyJTIybmEvbWUuLmJhL2QlMjNuYW1lL3dlJTIwaXJkL3BhJTI3dGgvbmFtZSIpKSwKKyAgICAgICAgdmlldy5nZXRCcmVhZGNydW1icygpKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIEltbXV0YWJsZU1hcDxTdHJpbmcsIFN0cmluZz4gYnJlYWRjcnVtYihTdHJpbmcgdGV4dCwgU3RyaW5nIHVybCkgeworICAgIHJldHVybiBJbW11dGFibGVNYXAub2YoInRleHQiLCB0ZXh0LCAidXJsIiwgdXJsKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0xpbmtpZmllclRlc3QuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9MaW5raWZpZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY2Y2FmMgotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9MaW5raWZpZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMTMgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKKworLyoqIFRlc3RzIGZvciB7QGxpbmsgTGlua2lmaWVyfS4gKi8KK3B1YmxpYyBjbGFzcyBMaW5raWZpZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgUkVRID0gRmFrZUh0dHBTZXJ2bGV0UmVxdWVzdC5uZXdSZXF1ZXN0KCk7CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0bGlua2lmeU1lc3NhZ2VOb01hdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgTGlua2lmaWVyIGwgPSBuZXcgTGlua2lmaWVyKFRlc3RHaXRpbGVzVXJscy5VUkxTKTsKKyAgICBhc3NlcnRFcXVhbHMoSW1tdXRhYmxlTGlzdC5vZihJbW11dGFibGVNYXAub2YoInRleHQiLCAic29tZSBtZXNzYWdlIHRleHQiKSksCisgICAgICAgIGwubGlua2lmeShGYWtlSHR0cFNlcnZsZXRSZXF1ZXN0Lm5ld1JlcXVlc3QoKSwgInNvbWUgbWVzc2FnZSB0ZXh0IikpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdGxpbmtpZnlNZXNzYWdlVXJsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgTGlua2lmaWVyIGwgPSBuZXcgTGlua2lmaWVyKFRlc3RHaXRpbGVzVXJscy5VUkxTKTsKKyAgICBhc3NlcnRFcXVhbHMoSW1tdXRhYmxlTGlzdC5vZigKKyAgICAgICAgSW1tdXRhYmxlTWFwLm9mKCJ0ZXh0IiwgImh0dHA6Ly9teS91cmwiLCAidXJsIiwgImh0dHA6Ly9teS91cmwiKSksCisgICAgICAgIGwubGlua2lmeShSRVEsICJodHRwOi8vbXkvdXJsIikpOworICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVMaXN0Lm9mKAorICAgICAgICBJbW11dGFibGVNYXAub2YoInRleHQiLCAiaHR0cHM6Ly9teS91cmwiLCAidXJsIiwgImh0dHBzOi8vbXkvdXJsIikpLAorICAgICAgICBsLmxpbmtpZnkoUkVRLCAiaHR0cHM6Ly9teS91cmwiKSk7CisgICAgYXNzZXJ0RXF1YWxzKEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAgIEltbXV0YWJsZU1hcC5vZigidGV4dCIsICJmb28gIiksCisgICAgICAgIEltbXV0YWJsZU1hcC5vZigidGV4dCIsICJodHRwOi8vbXkvdXJsIiwgInVybCIsICJodHRwOi8vbXkvdXJsIiksCisgICAgICAgIEltbXV0YWJsZU1hcC5vZigidGV4dCIsICIgYmFyIikpLAorICAgICAgICBsLmxpbmtpZnkoUkVRLCAiZm9vIGh0dHA6Ly9teS91cmwgYmFyIikpOworICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVMaXN0Lm9mKAorICAgICAgICBJbW11dGFibGVNYXAub2YoInRleHQiLCAiZm9vICIpLAorICAgICAgICBJbW11dGFibGVNYXAub2YoInRleHQiLCAiaHR0cDovL215L3VybCIsICJ1cmwiLCAiaHR0cDovL215L3VybCIpLAorICAgICAgICBJbW11dGFibGVNYXAub2YoInRleHQiLCAiIGJhciAiKSwKKyAgICAgICAgSW1tdXRhYmxlTWFwLm9mKCJ0ZXh0IiwgImh0dHA6Ly9teS9vdGhlci91cmwiLCAidXJsIiwgImh0dHA6Ly9teS9vdGhlci91cmwiKSwKKyAgICAgICAgSW1tdXRhYmxlTWFwLm9mKCJ0ZXh0IiwgIiBiYXoiKSksCisgICAgICAgIGwubGlua2lmeShSRVEsICJmb28gaHR0cDovL215L3VybCBiYXIgaHR0cDovL215L290aGVyL3VybCBiYXoiKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0bGlua2lmeU1lc3NhZ2VDaGFuZ2VJZE5vR2Vycml0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgTGlua2lmaWVyIGwgPSBuZXcgTGlua2lmaWVyKG5ldyBHaXRpbGVzVXJscygpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFN0cmluZyBnZXRCYXNlR2Vycml0VXJsKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFN0cmluZyBnZXRIb3N0TmFtZShIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmFzZUdpdFVybChIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgfQorICAgIH0pOworICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVMaXN0Lm9mKEltbXV0YWJsZU1hcC5vZigidGV4dCIsICJJMDEyMzQ1Njc4OSIpKSwKKyAgICAgICAgbC5saW5raWZ5KFJFUSwgIkkwMTIzNDU2Nzg5IikpOworICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVMaXN0Lm9mKEltbXV0YWJsZU1hcC5vZigidGV4dCIsICJDaGFuZ2UtSWQ6IEkwMTIzNDU2Nzg5IikpLAorICAgICAgICBsLmxpbmtpZnkoUkVRLCAiQ2hhbmdlLUlkOiBJMDEyMzQ1Njc4OSIpKTsKKyAgICBhc3NlcnRFcXVhbHMoSW1tdXRhYmxlTGlzdC5vZihJbW11dGFibGVNYXAub2YoInRleHQiLCAiQ2hhbmdlLUlkOiBJMDEyMzQ1Njc4OSBkb2VzIG5vdCBleGlzdCIpKSwKKyAgICAgICAgbC5saW5raWZ5KFJFUSwgIkNoYW5nZS1JZDogSTAxMjM0NTY3ODkgZG9lcyBub3QgZXhpc3QiKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0bGlua2lmeU1lc3NhZ2VDaGFuZ2VJZCgpIHRocm93cyBFeGNlcHRpb24geworICAgIExpbmtpZmllciBsID0gbmV3IExpbmtpZmllcihUZXN0R2l0aWxlc1VybHMuVVJMUyk7CisgICAgYXNzZXJ0RXF1YWxzKEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAgIEltbXV0YWJsZU1hcC5vZigidGV4dCIsICJJMDEyMzQ1Njc4OSIsCisgICAgICAgICAgInVybCIsICJodHRwOi8vdGVzdC1ob3N0LXJldmlldy9mb28vIy9xL0kwMTIzNDU2Nzg5LG4seiIpKSwKKyAgICAgICAgbC5saW5raWZ5KFJFUSwgIkkwMTIzNDU2Nzg5IikpOworICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVMaXN0Lm9mKAorICAgICAgICBJbW11dGFibGVNYXAub2YoInRleHQiLCAiQ2hhbmdlLUlkOiAiKSwKKyAgICAgICAgSW1tdXRhYmxlTWFwLm9mKCJ0ZXh0IiwgIkkwMTIzNDU2Nzg5IiwKKyAgICAgICAgICAidXJsIiwgImh0dHA6Ly90ZXN0LWhvc3QtcmV2aWV3L2Zvby8jL3EvSTAxMjM0NTY3ODksbix6IikpLAorICAgICAgICBsLmxpbmtpZnkoUkVRLCAiQ2hhbmdlLUlkOiBJMDEyMzQ1Njc4OSIpKTsKKyAgICBhc3NlcnRFcXVhbHMoSW1tdXRhYmxlTGlzdC5vZigKKyAgICAgICAgSW1tdXRhYmxlTWFwLm9mKCJ0ZXh0IiwgIkNoYW5nZS1JZDogIiksCisgICAgICAgIEltbXV0YWJsZU1hcC5vZigidGV4dCIsICJJMDEyMzQ1Njc4OSIsCisgICAgICAgICAgInVybCIsICJodHRwOi8vdGVzdC1ob3N0LXJldmlldy9mb28vIy9xL0kwMTIzNDU2Nzg5LG4seiIpLAorICAgICAgICBJbW11dGFibGVNYXAub2YoInRleHQiLCAiIGV4aXN0cyIpKSwKKyAgICAgICAgbC5saW5raWZ5KFJFUSwgIkNoYW5nZS1JZDogSTAxMjM0NTY3ODkgZXhpc3RzIikpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdGxpbmtpZnlNZXNzYWdlVXJsQW5kQ2hhbmdlSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBMaW5raWZpZXIgbCA9IG5ldyBMaW5raWZpZXIoVGVzdEdpdGlsZXNVcmxzLlVSTFMpOworICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVMaXN0Lm9mKAorICAgICAgICBJbW11dGFibGVNYXAub2YoInRleHQiLCAiaHR0cDovL215L3VybC9JMDEyMzQ1Njc4OSIsICJ1cmwiLCAiaHR0cDovL215L3VybC9JMDEyMzQ1Njc4OSIpLAorICAgICAgICBJbW11dGFibGVNYXAub2YoInRleHQiLCAiIGlzIG5vdCBjaGFuZ2UgIiksCisgICAgICAgIEltbXV0YWJsZU1hcC5vZigidGV4dCIsICJJMDEyMzQ1Njc4OSIsCisgICAgICAgICAgInVybCIsICJodHRwOi8vdGVzdC1ob3N0LXJldmlldy9mb28vIy9xL0kwMTIzNDU2Nzg5LG4seiIpKSwKKyAgICAgICAgbC5saW5raWZ5KFJFUSwgImh0dHA6Ly9teS91cmwvSTAxMjM0NTY3ODkgaXMgbm90IGNoYW5nZSBJMDEyMzQ1Njc4OSIpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1BhZ2luYXRvclRlc3QuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9QYWdpbmF0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk2NjFmMgotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9QYWdpbmF0b3JUZXN0LmphdmEKQEAgLTAsMCArMSwxNTUgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LlRlc3RSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZDb21taXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldldhbGs7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmRmcy5EZnNSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5kZnMuRGZzUmVwb3NpdG9yeURlc2NyaXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5kZnMuSW5NZW1vcnlSZXBvc2l0b3J5OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKiBVbml0IHRlc3RzIGZvciB7QGxpbmsgTG9nU2VydmxldH0uICovCitwdWJsaWMgY2xhc3MgUGFnaW5hdG9yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgcHJpdmF0ZSBUZXN0UmVwb3NpdG9yeTxEZnNSZXBvc2l0b3J5PiByZXBvOworICBwcml2YXRlIFJldldhbGsgd2FsazsKKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICByZXBvID0gbmV3IFRlc3RSZXBvc2l0b3J5PERmc1JlcG9zaXRvcnk+KAorICAgICAgICBuZXcgSW5NZW1vcnlSZXBvc2l0b3J5KG5ldyBEZnNSZXBvc2l0b3J5RGVzY3JpcHRpb24oInRlc3QiKSkpOworICAgIHdhbGsgPSBuZXcgUmV2V2FsayhyZXBvLmdldFJlcG9zaXRvcnkoKSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICB3YWxrLnJlbGVhc2UoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RTdGFydCgpIHRocm93cyBFeGNlcHRpb24geworICAgIExpc3Q8UmV2Q29tbWl0PiBjb21taXRzID0gbGluZWFyQ29tbWl0cygxMCk7CisgICAgd2Fsay5tYXJrU3RhcnQoY29tbWl0cy5nZXQoOSkpOworICAgIFBhZ2luYXRvciBwID0gbmV3IFBhZ2luYXRvcih3YWxrLCAzLCBjb21taXRzLmdldCg5KSk7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBJbW11dGFibGVMaXN0Lm9mKAorICAgICAgICAgICAgY29tbWl0cy5nZXQoOSksCisgICAgICAgICAgICBjb21taXRzLmdldCg4KSwKKyAgICAgICAgICAgIGNvbW1pdHMuZ2V0KDcpKSwKKyAgICAgICAgSW1tdXRhYmxlTGlzdC5jb3B5T2YocCkpOworICAgIGFzc2VydE51bGwocC5nZXRQcmV2aW91c1N0YXJ0KCkpOworICAgIGFzc2VydEVxdWFscyhjb21taXRzLmdldCg2KSwgcC5nZXROZXh0U3RhcnQoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Tm9TdGFydENvbW1pdCgpIHRocm93cyBFeGNlcHRpb24geworICAgIExpc3Q8UmV2Q29tbWl0PiBjb21taXRzID0gbGluZWFyQ29tbWl0cygxMCk7CisgICAgd2Fsay5tYXJrU3RhcnQoY29tbWl0cy5nZXQoOSkpOworICAgIFBhZ2luYXRvciBwID0gbmV3IFBhZ2luYXRvcih3YWxrLCAzLCBudWxsKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAgICAgICBjb21taXRzLmdldCg5KSwKKyAgICAgICAgICAgIGNvbW1pdHMuZ2V0KDgpLAorICAgICAgICAgICAgY29tbWl0cy5nZXQoNykpLAorICAgICAgICBJbW11dGFibGVMaXN0LmNvcHlPZihwKSk7CisgICAgYXNzZXJ0TnVsbChwLmdldFByZXZpb3VzU3RhcnQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGNvbW1pdHMuZ2V0KDYpLCBwLmdldE5leHRTdGFydCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RMZXNzVGhhbk9uZVBhZ2VJbigpIHRocm93cyBFeGNlcHRpb24geworICAgIExpc3Q8UmV2Q29tbWl0PiBjb21taXRzID0gbGluZWFyQ29tbWl0cygxMCk7CisgICAgd2Fsay5tYXJrU3RhcnQoY29tbWl0cy5nZXQoOSkpOworICAgIFBhZ2luYXRvciBwID0gbmV3IFBhZ2luYXRvcih3YWxrLCAzLCBjb21taXRzLmdldCg4KSk7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBJbW11dGFibGVMaXN0Lm9mKAorICAgICAgICAgICAgY29tbWl0cy5nZXQoOCksCisgICAgICAgICAgICBjb21taXRzLmdldCg3KSwKKyAgICAgICAgICAgIGNvbW1pdHMuZ2V0KDYpKSwKKyAgICAgICAgSW1tdXRhYmxlTGlzdC5jb3B5T2YocCkpOworICAgIGFzc2VydEVxdWFscyhjb21taXRzLmdldCg5KSwgcC5nZXRQcmV2aW91c1N0YXJ0KCkpOworICAgIGFzc2VydEVxdWFscyhjb21taXRzLmdldCg1KSwgcC5nZXROZXh0U3RhcnQoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0QXRMZWFzdE9uZVBhZ2VJbigpIHRocm93cyBFeGNlcHRpb24geworICAgIExpc3Q8UmV2Q29tbWl0PiBjb21taXRzID0gbGluZWFyQ29tbWl0cygxMCk7CisgICAgd2Fsay5tYXJrU3RhcnQoY29tbWl0cy5nZXQoOSkpOworICAgIFBhZ2luYXRvciBwID0gbmV3IFBhZ2luYXRvcih3YWxrLCAzLCBjb21taXRzLmdldCg3KSk7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBJbW11dGFibGVMaXN0Lm9mKAorICAgICAgICAgICAgY29tbWl0cy5nZXQoNyksCisgICAgICAgICAgICBjb21taXRzLmdldCg2KSwKKyAgICAgICAgICAgIGNvbW1pdHMuZ2V0KDUpKSwKKyAgICAgICAgSW1tdXRhYmxlTGlzdC5jb3B5T2YocCkpOworICAgIGFzc2VydEVxdWFscyhjb21taXRzLmdldCg5KSwgcC5nZXRQcmV2aW91c1N0YXJ0KCkpOworICAgIGFzc2VydEVxdWFscyhjb21taXRzLmdldCg0KSwgcC5nZXROZXh0U3RhcnQoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgTGlzdDxSZXZDb21taXQ+IGNvbW1pdHMgPSBsaW5lYXJDb21taXRzKDEwKTsKKyAgICB3YWxrLm1hcmtTdGFydChjb21taXRzLmdldCg5KSk7CisgICAgUGFnaW5hdG9yIHAgPSBuZXcgUGFnaW5hdG9yKHdhbGssIDMsIGNvbW1pdHMuZ2V0KDIpKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAgICAgICBjb21taXRzLmdldCgyKSwKKyAgICAgICAgICAgIGNvbW1pdHMuZ2V0KDEpLAorICAgICAgICAgICAgY29tbWl0cy5nZXQoMCkpLAorICAgICAgICBJbW11dGFibGVMaXN0LmNvcHlPZihwKSk7CisgICAgYXNzZXJ0RXF1YWxzKGNvbW1pdHMuZ2V0KDUpLCBwLmdldFByZXZpb3VzU3RhcnQoKSk7CisgICAgYXNzZXJ0TnVsbChwLmdldE5leHRTdGFydCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RPbmVQYXN0RW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgTGlzdDxSZXZDb21taXQ+IGNvbW1pdHMgPSBsaW5lYXJDb21taXRzKDEwKTsKKyAgICB3YWxrLm1hcmtTdGFydChjb21taXRzLmdldCg5KSk7CisgICAgUGFnaW5hdG9yIHAgPSBuZXcgUGFnaW5hdG9yKHdhbGssIDMsIGNvbW1pdHMuZ2V0KDEpKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAgICAgICBjb21taXRzLmdldCgxKSwKKyAgICAgICAgICAgIGNvbW1pdHMuZ2V0KDApKSwKKyAgICAgICAgSW1tdXRhYmxlTGlzdC5jb3B5T2YocCkpOworICAgIGFzc2VydEVxdWFscyhjb21taXRzLmdldCg0KSwgcC5nZXRQcmV2aW91c1N0YXJ0KCkpOworICAgIGFzc2VydE51bGwocC5nZXROZXh0U3RhcnQoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0TWFueVBhc3RFbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBMaXN0PFJldkNvbW1pdD4gY29tbWl0cyA9IGxpbmVhckNvbW1pdHMoMTApOworICAgIHdhbGsubWFya1N0YXJ0KGNvbW1pdHMuZ2V0KDkpKTsKKyAgICBQYWdpbmF0b3IgcCA9IG5ldyBQYWdpbmF0b3Iod2FsaywgNSwgY29tbWl0cy5nZXQoMSkpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgSW1tdXRhYmxlTGlzdC5vZigKKyAgICAgICAgICAgIGNvbW1pdHMuZ2V0KDEpLAorICAgICAgICAgICAgY29tbWl0cy5nZXQoMCkpLAorICAgICAgICBJbW11dGFibGVMaXN0LmNvcHlPZihwKSk7CisgICAgYXNzZXJ0RXF1YWxzKGNvbW1pdHMuZ2V0KDYpLCBwLmdldFByZXZpb3VzU3RhcnQoKSk7CisgICAgYXNzZXJ0TnVsbChwLmdldE5leHRTdGFydCgpKTsKKyAgfQorCisgIHByaXZhdGUgTGlzdDxSZXZDb21taXQ+IGxpbmVhckNvbW1pdHMoaW50IG4pIHRocm93cyBFeGNlcHRpb24geworICAgIGNoZWNrQXJndW1lbnQobiA+IDApOworICAgIExpc3Q8UmV2Q29tbWl0PiBjb21taXRzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgY29tbWl0cy5hZGQocmVwby5jb21taXQoKS5jcmVhdGUoKSk7CisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCAxMDsgaSsrKSB7CisgICAgICBjb21taXRzLmFkZChyZXBvLmNvbW1pdCgpLnBhcmVudChjb21taXRzLmdldChjb21taXRzLnNpemUoKSAtIDEpKS5jcmVhdGUoKSk7CisgICAgfQorICAgIHJldHVybiBjb21taXRzOworICB9Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvUmVwb3NpdG9yeUluZGV4U2VydmxldFRlc3QuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9SZXBvc2l0b3J5SW5kZXhTZXJ2bGV0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNzFmNzAKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvUmVwb3NpdG9yeUluZGV4U2VydmxldFRlc3QuamF2YQpAQCAtMCwwICsxLDEzMiBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5naXRpbGVzLlRlc3RHaXRpbGVzVXJscy5VUkxTOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5UZXN0UmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZGZzLkRmc1JlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmRmcy5EZnNSZXBvc2l0b3J5RGVzY3JpcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmRmcy5Jbk1lbW9yeVJlcG9zaXRvcnk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworCisvKiogVGVzdHMgZm9yIHtAbGluayBSZXBvc2l0b3J5SW5kZXhTZXJ2bGV0fS4gKi8KK3B1YmxpYyBjbGFzcyBSZXBvc2l0b3J5SW5kZXhTZXJ2bGV0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgcHJpdmF0ZSBUZXN0UmVwb3NpdG9yeTxEZnNSZXBvc2l0b3J5PiByZXBvOworICBwcml2YXRlIFJlcG9zaXRvcnlJbmRleFNlcnZsZXQgc2VydmxldDsKKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICByZXBvID0gbmV3IFRlc3RSZXBvc2l0b3J5PERmc1JlcG9zaXRvcnk+KAorICAgICAgICBuZXcgSW5NZW1vcnlSZXBvc2l0b3J5KG5ldyBEZnNSZXBvc2l0b3J5RGVzY3JpcHRpb24oInRlc3QiKSkpOworICAgIHNlcnZsZXQgPSBuZXcgUmVwb3NpdG9yeUluZGV4U2VydmxldCgKKyAgICAgICAgbmV3IERlZmF1bHRSZW5kZXJlcigpLAorICAgICAgICBuZXcgVGVzdEdpdGlsZXNBY2Nlc3MocmVwby5nZXRSZXBvc2l0b3J5KCkpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgIE1hcDxTdHJpbmcsID8+IGRhdGEgPSBidWlsZERhdGEoKTsKKyAgICBhc3NlcnRFcXVhbHMoSW1tdXRhYmxlTGlzdC5vZigpLCBkYXRhLmdldCgiYnJhbmNoZXMiKSk7CisgICAgYXNzZXJ0RXF1YWxzKEltbXV0YWJsZUxpc3Qub2YoKSwgZGF0YS5nZXQoInRhZ3MiKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0QnJhbmNoZXNBbmRUYWdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcmVwby5icmFuY2goInJlZnMvaGVhZHMvZm9vIikuY29tbWl0KCkuY3JlYXRlKCk7CisgICAgcmVwby5icmFuY2goInJlZnMvaGVhZHMvYmFyIikuY29tbWl0KCkuY3JlYXRlKCk7CisgICAgcmVwby5icmFuY2goInJlZnMvdGFncy9iYXoiKS5jb21taXQoKS5jcmVhdGUoKTsKKyAgICByZXBvLmJyYW5jaCgicmVmcy9ub3BlL3F1dXgiKS5jb21taXQoKS5jcmVhdGUoKTsKKyAgICBNYXA8U3RyaW5nLCA/PiBkYXRhID0gYnVpbGREYXRhKCk7CisKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAgICAgICByZWYoIi9iL3Rlc3QvKy9iYXIiLCAiYmFyIiksCisgICAgICAgICAgICByZWYoIi9iL3Rlc3QvKy9mb28iLCAiZm9vIikpLAorICAgICAgICBkYXRhLmdldCgiYnJhbmNoZXMiKSk7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBJbW11dGFibGVMaXN0Lm9mKAorICAgICAgICAgICAgcmVmKCIvYi90ZXN0LysvYmF6IiwgImJheiIpKSwKKyAgICAgICAgZGF0YS5nZXQoInRhZ3MiKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0QW1iaWd1b3VzQnJhbmNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcmVwby5icmFuY2goInJlZnMvaGVhZHMvZm9vIikuY29tbWl0KCkuY3JlYXRlKCk7CisgICAgcmVwby5icmFuY2goInJlZnMvaGVhZHMvYmFyIikuY29tbWl0KCkuY3JlYXRlKCk7CisgICAgcmVwby5icmFuY2goInJlZnMvdGFncy9mb28iKS5jb21taXQoKS5jcmVhdGUoKTsKKyAgICBNYXA8U3RyaW5nLCA/PiBkYXRhID0gYnVpbGREYXRhKCk7CisKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAgICAgICByZWYoIi9iL3Rlc3QvKy9iYXIiLCAiYmFyIiksCisgICAgICAgICAgICByZWYoIi9iL3Rlc3QvKy9yZWZzL2hlYWRzL2ZvbyIsICJmb28iKSksCisgICAgICAgIGRhdGEuZ2V0KCJicmFuY2hlcyIpKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAgICAgICAvLyByZWZzL3RhZ3MvIGlzIHNlYXJjaGVkIGJlZm9yZSByZWZzL2hlYWRzLywgc28gdGhpcyBkb2VzIG5vdAorICAgICAgICAgICAgLy8gYXBwZWFyIGFtYmlndW91cy4KKyAgICAgICAgICAgIHJlZigiL2IvdGVzdC8rL2ZvbyIsICJmb28iKSksCisgICAgICAgIGRhdGEuZ2V0KCJ0YWdzIikpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEFtYmlndW91c1JlbGF0aXZlVG9Ob25CcmFuY2hPclRhZygpIHRocm93cyBFeGNlcHRpb24geworICAgIHJlcG8uYnJhbmNoKCJyZWZzL2ZvbyIpLmNvbW1pdCgpLmNyZWF0ZSgpOworICAgIHJlcG8uYnJhbmNoKCJyZWZzL2hlYWRzL2ZvbyIpLmNvbW1pdCgpLmNyZWF0ZSgpOworICAgIHJlcG8uYnJhbmNoKCJyZWZzL3RhZ3MvZm9vIikuY29tbWl0KCkuY3JlYXRlKCk7CisgICAgTWFwPFN0cmluZywgPz4gZGF0YSA9IGJ1aWxkRGF0YSgpOworCisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBJbW11dGFibGVMaXN0Lm9mKAorICAgICAgICAgICAgcmVmKCIvYi90ZXN0LysvcmVmcy9oZWFkcy9mb28iLCAiZm9vIikpLAorICAgICAgICBkYXRhLmdldCgiYnJhbmNoZXMiKSk7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBJbW11dGFibGVMaXN0Lm9mKAorICAgICAgICAgICAgcmVmKCIvYi90ZXN0LysvcmVmcy90YWdzL2ZvbyIsICJmb28iKSksCisgICAgICAgIGRhdGEuZ2V0KCJ0YWdzIikpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFJlZnNIZWFkcygpIHRocm93cyBFeGNlcHRpb24geworICAgIHJlcG8uYnJhbmNoKCJyZWZzL2hlYWRzL2ZvbyIpLmNvbW1pdCgpLmNyZWF0ZSgpOworICAgIHJlcG8uYnJhbmNoKCJyZWZzL2hlYWRzL3JlZnMvaGVhZHMvZm9vIikuY29tbWl0KCkuY3JlYXRlKCk7CisgICAgTWFwPFN0cmluZywgPz4gZGF0YSA9IGJ1aWxkRGF0YSgpOworCisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBJbW11dGFibGVMaXN0Lm9mKAorICAgICAgICAgICAgcmVmKCIvYi90ZXN0LysvZm9vIiwgImZvbyIpLAorICAgICAgICAgICAgcmVmKCIvYi90ZXN0LysvcmVmcy9oZWFkcy9yZWZzL2hlYWRzL2ZvbyIsICJyZWZzL2hlYWRzL2ZvbyIpKSwKKyAgICAgICAgZGF0YS5nZXQoImJyYW5jaGVzIikpOworICB9CisKKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLCA/PiBidWlsZERhdGEoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEgPSBGYWtlSHR0cFNlcnZsZXRSZXF1ZXN0Lm5ld1JlcXVlc3QocmVwby5nZXRSZXBvc2l0b3J5KCkpOworICAgIFZpZXdGaWx0ZXIuc2V0VmlldyhyZXEsIEdpdGlsZXNWaWV3LnJlcG9zaXRvcnlJbmRleCgpCisgICAgICAgIC5zZXRIb3N0TmFtZShVUkxTLmdldEhvc3ROYW1lKHJlcSkpCisgICAgICAgIC5zZXRTZXJ2bGV0UGF0aChyZXEuZ2V0U2VydmxldFBhdGgoKSkKKyAgICAgICAgLnNldFJlcG9zaXRvcnlOYW1lKCJ0ZXN0IikKKyAgICAgICAgLmJ1aWxkKCkpOworICAgIHJldHVybiBzZXJ2bGV0LmJ1aWxkRGF0YShyZXEpOworICB9CisKKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHJlZihTdHJpbmcgdXJsLCBTdHJpbmcgbmFtZSkgeworICAgIHJldHVybiBJbW11dGFibGVNYXAub2YoInVybCIsIHVybCwgIm5hbWUiLCBuYW1lKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1JldmlzaW9uUGFyc2VyVGVzdC5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1JldmlzaW9uUGFyc2VyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMDMzZTAKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvUmV2aXNpb25QYXJzZXJUZXN0LmphdmEKQEAgLTAsMCArMSwyNzMgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5PQkpfQkxPQjsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLk9CSl9DT01NSVQ7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5PQkpfVEFHOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY2FjaGUuQ2FjaGVCdWlsZGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2l0aWxlcy5SZXZpc2lvblBhcnNlci5SZXN1bHQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LlRlc3RSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZCbG9iOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZDb21taXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldlRhZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZGZzLkRmc1JlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmRmcy5EZnNSZXBvc2l0b3J5RGVzY3JpcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmRmcy5Jbk1lbW9yeVJlcG9zaXRvcnk7CisKKy8qKiBUZXN0cyBmb3IgdGhlIHJldmlzaW9uIHBhcnNlci4gKi8KK3B1YmxpYyBjbGFzcyBSZXZpc2lvblBhcnNlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgIHByaXZhdGUgVGVzdFJlcG9zaXRvcnk8RGZzUmVwb3NpdG9yeT4gcmVwbzsKKyAgcHJpdmF0ZSBSZXZpc2lvblBhcnNlciBwYXJzZXI7CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcmVwbyA9IG5ldyBUZXN0UmVwb3NpdG9yeTxEZnNSZXBvc2l0b3J5PigKKyAgICAgICAgbmV3IEluTWVtb3J5UmVwb3NpdG9yeShuZXcgRGZzUmVwb3NpdG9yeURlc2NyaXB0aW9uKCJ0ZXN0IikpKTsKKyAgICBwYXJzZXIgPSBuZXcgUmV2aXNpb25QYXJzZXIoCisgICAgICAgIHJlcG8uZ2V0UmVwb3NpdG9yeSgpLAorICAgICAgICBuZXcgVGVzdEdpdGlsZXNBY2Nlc3MocmVwby5nZXRSZXBvc2l0b3J5KCkpLmZvclJlcXVlc3QobnVsbCksCisgICAgICAgIG5ldyBWaXNpYmlsaXR5Q2FjaGUoZmFsc2UsIENhY2hlQnVpbGRlci5uZXdCdWlsZGVyKCkubWF4aW11bVNpemUoMCkpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZVJlZigpIHRocm93cyBFeGNlcHRpb24geworICAgIFJldkNvbW1pdCBtYXN0ZXIgPSByZXBvLmJyYW5jaCgicmVmcy9oZWFkcy9tYXN0ZXIiKS5jb21taXQoKS5jcmVhdGUoKTsKKyAgICBhc3NlcnRFcXVhbHMobmV3IFJlc3VsdChSZXZpc2lvbi5wZWVsZWQoIm1hc3RlciIsIG1hc3RlcikpLAorICAgICAgICBwYXJzZXIucGFyc2UoIm1hc3RlciIpKTsKKyAgICBhc3NlcnRFcXVhbHMobmV3IFJlc3VsdChSZXZpc2lvbi5wZWVsZWQoInJlZnMvaGVhZHMvbWFzdGVyIiwgbWFzdGVyKSksCisgICAgICAgIHBhcnNlci5wYXJzZSgicmVmcy9oZWFkcy9tYXN0ZXIiKSk7CisgICAgYXNzZXJ0TnVsbChwYXJzZXIucGFyc2UoInJlZnMvL2hlYWRzLy9tYXN0ZXIiKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VSZWZQYXJlbnRFeHByZXNzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgUmV2Q29tbWl0IHJvb3QgPSByZXBvLmNvbW1pdCgpLmNyZWF0ZSgpOworICAgIFJldkNvbW1pdCBwYXJlbnQxID0gcmVwby5jb21taXQoKS5wYXJlbnQocm9vdCkuY3JlYXRlKCk7CisgICAgUmV2Q29tbWl0IHBhcmVudDIgPSByZXBvLmNvbW1pdCgpLnBhcmVudChyb290KS5jcmVhdGUoKTsKKyAgICBSZXZDb21taXQgbWVyZ2UgPSByZXBvLmJyYW5jaCgibWFzdGVyIikuY29tbWl0KCkKKyAgICAgICAgLnBhcmVudChwYXJlbnQxKQorICAgICAgICAucGFyZW50KHBhcmVudDIpCisgICAgICAgIC5jcmVhdGUoKTsKKyAgICBhc3NlcnRFcXVhbHMobmV3IFJlc3VsdChSZXZpc2lvbi5wZWVsZWQoIm1hc3RlciIsIG1lcmdlKSksIHBhcnNlci5wYXJzZSgibWFzdGVyIikpOworICAgIGFzc2VydEVxdWFscyhuZXcgUmVzdWx0KFJldmlzaW9uLnBlZWxlZCgibWFzdGVyXiIsIHBhcmVudDEpKSwgcGFyc2VyLnBhcnNlKCJtYXN0ZXJeIikpOworICAgIGFzc2VydEVxdWFscyhuZXcgUmVzdWx0KFJldmlzaW9uLnBlZWxlZCgibWFzdGVyfjEiLCBwYXJlbnQxKSksIHBhcnNlci5wYXJzZSgibWFzdGVyfjEiKSk7CisgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZXN1bHQoUmV2aXNpb24ucGVlbGVkKCJtYXN0ZXJeMiIsIHBhcmVudDIpKSwgcGFyc2VyLnBhcnNlKCJtYXN0ZXJeMiIpKTsKKyAgICBhc3NlcnRFcXVhbHMobmV3IFJlc3VsdChSZXZpc2lvbi5wZWVsZWQoIm1hc3Rlcn4yIiwgcm9vdCkpLCBwYXJzZXIucGFyc2UoIm1hc3Rlcn4yIikpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFBhcnNlQ29tbWl0U2hhVmlzaWJsZUZyb21IZWFkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgUmV2Q29tbWl0IHBhcmVudCA9IHJlcG8uY29tbWl0KCkuY3JlYXRlKCk7CisgICAgUmV2Q29tbWl0IGNvbW1pdCA9IHJlcG8uYnJhbmNoKCJtYXN0ZXIiKS5jb21taXQoKS5wYXJlbnQocGFyZW50KS5jcmVhdGUoKTsKKyAgICBhc3NlcnRFcXVhbHMobmV3IFJlc3VsdChSZXZpc2lvbi5wZWVsZWQoY29tbWl0Lm5hbWUoKSwgY29tbWl0KSksIHBhcnNlci5wYXJzZShjb21taXQubmFtZSgpKSk7CisgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZXN1bHQoUmV2aXNpb24ucGVlbGVkKHBhcmVudC5uYW1lKCksIHBhcmVudCkpLCBwYXJzZXIucGFyc2UocGFyZW50Lm5hbWUoKSkpOworCisgICAgU3RyaW5nIGFiYnJldiA9IGNvbW1pdC5uYW1lKCkuc3Vic3RyaW5nKDAsIDYpOworICAgIGFzc2VydEVxdWFscyhuZXcgUmVzdWx0KFJldmlzaW9uLnBlZWxlZChhYmJyZXYsIGNvbW1pdCkpLCBwYXJzZXIucGFyc2UoYWJicmV2KSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VDb21taXRTaGFWaXNpYmxlRnJvbVRhZygpIHRocm93cyBFeGNlcHRpb24geworICAgIFJldkNvbW1pdCBwYXJlbnQgPSByZXBvLmNvbW1pdCgpLmNyZWF0ZSgpOworICAgIFJldkNvbW1pdCBjb21taXQgPSByZXBvLmNvbW1pdCgpLnBhcmVudChwYXJlbnQpLmNyZWF0ZSgpOworICAgIHJlcG8uYnJhbmNoKCJtYXN0ZXIiKS5jb21taXQoKS5jcmVhdGUoKTsKKyAgICByZXBvLnVwZGF0ZSgicmVmcy90YWdzL3RhZyIsIHJlcG8udGFnKCJ0YWciLCBjb21taXQpKTsKKworICAgIGFzc2VydEVxdWFscyhuZXcgUmVzdWx0KFJldmlzaW9uLnBlZWxlZChjb21taXQubmFtZSgpLCBjb21taXQpKSwgcGFyc2VyLnBhcnNlKGNvbW1pdC5uYW1lKCkpKTsKKyAgICBhc3NlcnRFcXVhbHMobmV3IFJlc3VsdChSZXZpc2lvbi5wZWVsZWQocGFyZW50Lm5hbWUoKSwgcGFyZW50KSksIHBhcnNlci5wYXJzZShwYXJlbnQubmFtZSgpKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VDb21taXRTaGFWaXNpYmxlRnJvbU90aGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgUmV2Q29tbWl0IHBhcmVudCA9IHJlcG8uY29tbWl0KCkuY3JlYXRlKCk7CisgICAgUmV2Q29tbWl0IGNvbW1pdCA9IHJlcG8uY29tbWl0KCkucGFyZW50KHBhcmVudCkuY3JlYXRlKCk7CisgICAgcmVwby5icmFuY2goIm1hc3RlciIpLmNvbW1pdCgpLmNyZWF0ZSgpOworICAgIHJlcG8udXBkYXRlKCJyZWZzL3RhZ3MvdGFnIiwgcmVwby50YWcoInRhZyIsIHJlcG8uY29tbWl0KCkuY3JlYXRlKCkpKTsKKyAgICByZXBvLnVwZGF0ZSgicmVmcy9tZXRhL2NvbmZpZyIsIGNvbW1pdCk7CisKKyAgICBhc3NlcnRFcXVhbHMobmV3IFJlc3VsdChSZXZpc2lvbi5wZWVsZWQoY29tbWl0Lm5hbWUoKSwgY29tbWl0KSksIHBhcnNlci5wYXJzZShjb21taXQubmFtZSgpKSk7CisgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZXN1bHQoUmV2aXNpb24ucGVlbGVkKHBhcmVudC5uYW1lKCksIHBhcmVudCkpLCBwYXJzZXIucGFyc2UocGFyZW50Lm5hbWUoKSkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFBhcnNlQ29tbWl0U2hhVmlzaWJsZUZyb21DaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBSZXZDb21taXQgcGFyZW50ID0gcmVwby5jb21taXQoKS5jcmVhdGUoKTsKKyAgICBSZXZDb21taXQgY29tbWl0ID0gcmVwby5jb21taXQoKS5wYXJlbnQocGFyZW50KS5jcmVhdGUoKTsKKyAgICByZXBvLmJyYW5jaCgibWFzdGVyIikuY29tbWl0KCkuY3JlYXRlKCk7CisgICAgcmVwby51cGRhdGUoInJlZnMvY2hhbmdlcy8wMS8wMDAxIiwgY29tbWl0KTsKKworICAgIC8vIE1hdGNoZXMgZXhhY3RseS4KKyAgICBhc3NlcnRFcXVhbHMobmV3IFJlc3VsdChSZXZpc2lvbi5wZWVsZWQoY29tbWl0Lm5hbWUoKSwgY29tbWl0KSksIHBhcnNlci5wYXJzZShjb21taXQubmFtZSgpKSk7CisgICAgLy8gcmVmcy9jaGFuZ2VzLyogaXMgZXhjbHVkZWQgZnJvbSBhbmNlc3RyeSBzZWFyY2guCisgICAgYXNzZXJ0RXF1YWxzKG51bGwsIHBhcnNlci5wYXJzZShwYXJlbnQubmFtZSgpKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VOb25WaXNpYmxlQ29tbWl0U2hhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgUmV2Q29tbWl0IG90aGVyID0gcmVwby5jb21taXQoKS5jcmVhdGUoKTsKKyAgICBSZXZDb21taXQgbWFzdGVyID0gcmVwby5icmFuY2goIm1hc3RlciIpLmNvbW1pdCgpLmNyZWF0ZSgpOworICAgIGFzc2VydEVxdWFscyhudWxsLCBwYXJzZXIucGFyc2Uob3RoZXIubmFtZSgpKSk7CisKKyAgICByZXBvLmJyYW5jaCgib3RoZXIiKS51cGRhdGUob3RoZXIpOworICAgIGFzc2VydEVxdWFscyhuZXcgUmVzdWx0KFJldmlzaW9uLnBlZWxlZChvdGhlci5uYW1lKCksIG90aGVyKSksIHBhcnNlci5wYXJzZShvdGhlci5uYW1lKCkpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZURpZmZSZXZpc2lvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBSZXZDb21taXQgcGFyZW50ID0gcmVwby5jb21taXQoKS5jcmVhdGUoKTsKKyAgICBSZXZDb21taXQgY29tbWl0ID0gcmVwby5icmFuY2goIm1hc3RlciIpLmNvbW1pdCgpLnBhcmVudChwYXJlbnQpLmNyZWF0ZSgpOworICAgIFJldkNvbW1pdCBvdGhlciA9IHJlcG8uYnJhbmNoKCJvdGhlciIpLmNvbW1pdCgpLmNyZWF0ZSgpOworCisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBuZXcgUmVzdWx0KAorICAgICAgICAgICAgUmV2aXNpb24ucGVlbGVkKCJtYXN0ZXIiLCBjb21taXQpLAorICAgICAgICAgICAgUmV2aXNpb24ucGVlbGVkKCJtYXN0ZXJeIiwgcGFyZW50KSwKKyAgICAgICAgICAgIDE1KSwKKyAgICAgICAgcGFyc2VyLnBhcnNlKCJtYXN0ZXJeLi5tYXN0ZXIiKSk7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBuZXcgUmVzdWx0KAorICAgICAgICAgICAgUmV2aXNpb24ucGVlbGVkKCJtYXN0ZXIiLCBjb21taXQpLAorICAgICAgICAgICAgUmV2aXNpb24ucGVlbGVkKCJtYXN0ZXJeIiwgcGFyZW50KSwKKyAgICAgICAgICAgIDE1KSwKKyAgICAgICAgcGFyc2VyLnBhcnNlKCJtYXN0ZXJeLi5tYXN0ZXIvIikpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgbmV3IFJlc3VsdCgKKyAgICAgICAgICAgIFJldmlzaW9uLnBlZWxlZCgibWFzdGVyIiwgY29tbWl0KSwKKyAgICAgICAgICAgIFJldmlzaW9uLnBlZWxlZCgibWFzdGVyXiIsIHBhcmVudCksCisgICAgICAgICAgICAxNSksCisgICAgICAgIHBhcnNlci5wYXJzZSgibWFzdGVyXi4ubWFzdGVyL3BhdGgvdG8vYS9maWxlIikpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgbmV3IFJlc3VsdCgKKyAgICAgICAgICAgIFJldmlzaW9uLnBlZWxlZCgibWFzdGVyIiwgY29tbWl0KSwKKyAgICAgICAgICAgIFJldmlzaW9uLnBlZWxlZCgibWFzdGVyXiIsIHBhcmVudCksCisgICAgICAgICAgICAxNSksCisgICAgICAgIHBhcnNlci5wYXJzZSgibWFzdGVyXi4ubWFzdGVyL3BhdGgvdG8vYS8uLmZpbGUiKSk7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBuZXcgUmVzdWx0KAorICAgICAgICAgICAgUmV2aXNpb24ucGVlbGVkKCJyZWZzL2hlYWRzL21hc3RlciIsIGNvbW1pdCksCisgICAgICAgICAgICBSZXZpc2lvbi5wZWVsZWQoInJlZnMvaGVhZHMvbWFzdGVyXiIsIHBhcmVudCksCisgICAgICAgICAgICAzNyksCisgICAgICBwYXJzZXIucGFyc2UoInJlZnMvaGVhZHMvbWFzdGVyXi4ucmVmcy9oZWFkcy9tYXN0ZXIiKSk7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBuZXcgUmVzdWx0KAorICAgICAgICAgICAgUmV2aXNpb24ucGVlbGVkKCJtYXN0ZXIiLCBjb21taXQpLAorICAgICAgICAgICAgUmV2aXNpb24ucGVlbGVkKCJtYXN0ZXJ+MSIsIHBhcmVudCksCisgICAgICAgICAgICAxNiksCisgICAgICAgIHBhcnNlci5wYXJzZSgibWFzdGVyfjEuLm1hc3RlciIpKTsKKyAgICAvLyBUT0RPKGRib3Jvd2l0eik6IDJhMjM2MmZiYiBpbiBKR2l0IGNhdXNlcyBtYXN0ZXJ+MiB0byByZXNvbHZlIHRvIG1hc3RlcgorICAgIC8vIHJhdGhlciB0aGFuIG51bGwuIFVuY29tbWVudCB3aGVuIHVwc3RyZWFtIHJlZ3Jlc3Npb24gaXMgZml4ZWQuCisgICAgLy9hc3NlcnROdWxsKHBhcnNlci5wYXJzZSgibWFzdGVyfjIuLm1hc3RlciIpKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIG5ldyBSZXN1bHQoCisgICAgICAgICAgICBSZXZpc2lvbi5wZWVsZWQoIm1hc3RlciIsIGNvbW1pdCksCisgICAgICAgICAgICBSZXZpc2lvbi5wZWVsZWQoIm90aGVyIiwgb3RoZXIpLAorICAgICAgICAgICAgMTMpLAorICAgICAgICBwYXJzZXIucGFyc2UoIm90aGVyLi5tYXN0ZXIiKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VGaXJzdFBhcmVudEV4cHJlc3Npb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBSZXZDb21taXQgcGFyZW50ID0gcmVwby5jb21taXQoKS5jcmVhdGUoKTsKKyAgICBSZXZDb21taXQgY29tbWl0ID0gcmVwby5icmFuY2goIm1hc3RlciIpLmNvbW1pdCgpLnBhcmVudChwYXJlbnQpLmNyZWF0ZSgpOworCisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBuZXcgUmVzdWx0KAorICAgICAgICAgICAgUmV2aXNpb24ucGVlbGVkKCJtYXN0ZXIiLCBjb21taXQpLAorICAgICAgICAgICAgUmV2aXNpb24ucGVlbGVkKCJtYXN0ZXJeIiwgcGFyZW50KSwKKyAgICAgICAgICAgIDgpLAorICAgICAgICBwYXJzZXIucGFyc2UoIm1hc3Rlcl4hIikpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgbmV3IFJlc3VsdCgKKyAgICAgICAgICAgIFJldmlzaW9uLnBlZWxlZCgibWFzdGVyXiIsIHBhcmVudCksCisgICAgICAgICAgICBSZXZpc2lvbi5OVUxMLAorICAgICAgICAgICAgOSksCisgICAgICAgIHBhcnNlci5wYXJzZSgibWFzdGVyXl4hIikpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgbmV3IFJlc3VsdCgKKyAgICAgICAgICAgIFJldmlzaW9uLnBlZWxlZChwYXJlbnQubmFtZSgpLCBwYXJlbnQpLAorICAgICAgICAgICAgUmV2aXNpb24uTlVMTCwKKyAgICAgICAgICAgIDQyKSwKKyAgICAgICAgcGFyc2VyLnBhcnNlKHBhcmVudC5uYW1lKCkgKyAiXiEiKSk7CisKKyAgICBSZXZUYWcgdGFnID0gcmVwby51cGRhdGUoInJlZnMvdGFncy90YWciLCByZXBvLnRhZygidGFnIiwgY29tbWl0KSk7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBuZXcgUmVzdWx0KAorICAgICAgICAgICAgUmV2aXNpb24ucGVlbGVkKCJ0YWciLCBjb21taXQpLAorICAgICAgICAgICAgUmV2aXNpb24ucGVlbGVkKCJ0YWdeIiwgcGFyZW50KSwKKyAgICAgICAgICAgIDUpLAorICAgICAgICBwYXJzZXIucGFyc2UoInRhZ14hIikpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgbmV3IFJlc3VsdCgKKyAgICAgICAgICAgIFJldmlzaW9uLnBlZWxlZCgidGFnXiIsIHBhcmVudCksCisgICAgICAgICAgICBSZXZpc2lvbi5OVUxMLAorICAgICAgICAgICAgNiksCisgICAgICAgIHBhcnNlci5wYXJzZSgidGFnXl4hIikpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE5vblZpc2libGVEaWZmU2hhcygpIHRocm93cyBFeGNlcHRpb24geworICAgIFJldkNvbW1pdCBvdGhlciA9IHJlcG8uY29tbWl0KCkuY3JlYXRlKCk7CisgICAgUmV2Q29tbWl0IG1hc3RlciA9IHJlcG8uYnJhbmNoKCJtYXN0ZXIiKS5jb21taXQoKS5jcmVhdGUoKTsKKyAgICBhc3NlcnRFcXVhbHMobnVsbCwgcGFyc2VyLnBhcnNlKCJvdGhlci4ubWFzdGVyIikpOworICAgIGFzc2VydEVxdWFscyhudWxsLCBwYXJzZXIucGFyc2UoIm1hc3Rlci4ub3RoZXIiKSk7CisKKyAgICByZXBvLmJyYW5jaCgib3RoZXIiKS51cGRhdGUob3RoZXIpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgbmV3IFJlc3VsdCgKKyAgICAgICAgICAgIFJldmlzaW9uLnBlZWxlZCgibWFzdGVyIiwgbWFzdGVyKSwKKyAgICAgICAgICAgIFJldmlzaW9uLnBlZWxlZCgib3RoZXIiLCBvdGhlciksCisgICAgICAgICAgICAxMyksCisgICAgICAgIHBhcnNlci5wYXJzZSgib3RoZXIuLm1hc3RlciIpKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIG5ldyBSZXN1bHQoCisgICAgICAgICAgICBSZXZpc2lvbi5wZWVsZWQoIm90aGVyIiwgb3RoZXIpLAorICAgICAgICAgICAgUmV2aXNpb24ucGVlbGVkKCJtYXN0ZXIiLCBtYXN0ZXIpLAorICAgICAgICAgICAgMTMpLAorICAgICAgICBwYXJzZXIucGFyc2UoIm1hc3Rlci4ub3RoZXIiKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VUYWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBSZXZDb21taXQgbWFzdGVyID0gcmVwby5icmFuY2goIm1hc3RlciIpLmNvbW1pdCgpLmNyZWF0ZSgpOworICAgIFJldlRhZyBtYXN0ZXJUYWcgPSByZXBvLnVwZGF0ZSgicmVmcy90YWdzL21hc3Rlci10YWciLCByZXBvLnRhZygibWFzdGVyLXRhZyIsIG1hc3RlcikpOworICAgIFJldlRhZyBtYXN0ZXJUYWdUYWcgPSByZXBvLnVwZGF0ZSgicmVmcy90YWdzL21hc3Rlci10YWctdGFnIiwKKyAgICAgICAgcmVwby50YWcoIm1hc3Rlci10YWctdGFnIiwgbWFzdGVyKSk7CisKKyAgICBhc3NlcnRFcXVhbHMobmV3IFJlc3VsdCgKKyAgICAgICAgICAgIG5ldyBSZXZpc2lvbigibWFzdGVyLXRhZyIsIG1hc3RlclRhZywgT0JKX1RBRywgbWFzdGVyLCBPQkpfQ09NTUlUKSksCisgICAgICAgIHBhcnNlci5wYXJzZSgibWFzdGVyLXRhZyIpKTsKKyAgICBhc3NlcnRFcXVhbHMobmV3IFJlc3VsdCgKKyAgICAgICAgICAgIG5ldyBSZXZpc2lvbigibWFzdGVyLXRhZy10YWciLCBtYXN0ZXJUYWdUYWcsIE9CSl9UQUcsIG1hc3RlciwgT0JKX0NPTU1JVCkpLAorICAgICAgICBwYXJzZXIucGFyc2UoIm1hc3Rlci10YWctdGFnIikpOworCisgICAgUmV2QmxvYiBibG9iID0gcmVwby51cGRhdGUoInJlZnMvdGFncy9ibG9iIiwgcmVwby5ibG9iKCJibG9iIikpOworICAgIFJldlRhZyBibG9iVGFnID0gcmVwby51cGRhdGUoInJlZnMvdGFncy9ibG9iLXRhZyIsIHJlcG8udGFnKCJibG9iLXRhZyIsIGJsb2IpKTsKKyAgICBhc3NlcnRFcXVhbHMobmV3IFJlc3VsdChSZXZpc2lvbi5wZWVsZWQoImJsb2IiLCBibG9iKSksIHBhcnNlci5wYXJzZSgiYmxvYiIpKTsKKyAgICBhc3NlcnRFcXVhbHMobmV3IFJlc3VsdChuZXcgUmV2aXNpb24oImJsb2ItdGFnIiwgYmxvYlRhZywgT0JKX1RBRywgYmxvYiwgT0JKX0JMT0IpKSwKKyAgICAgICAgcGFyc2VyLnBhcnNlKCJibG9iLXRhZyIpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZVVuc3VwcG9ydGVkUmV2aXNpb25FeHByZXNzaW9ucygpIHRocm93cyBFeGNlcHRpb24geworICAgIFJldkJsb2IgYmxvYiA9IHJlcG8uYmxvYigiYmxvYiBjb250ZW50cyIpOworICAgIFJldkNvbW1pdCBtYXN0ZXIgPSByZXBvLmJyYW5jaCgibWFzdGVyIikuY29tbWl0KCkuYWRkKCJibG9iIiwgYmxvYikuY3JlYXRlKCk7CisKKyAgICBhc3NlcnRFcXVhbHMobWFzdGVyLCByZXBvLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJtYXN0ZXJee30iKSk7CisgICAgYXNzZXJ0RXF1YWxzKG51bGwsIHBhcnNlci5wYXJzZSgibWFzdGVyXnt9IikpOworCisgICAgYXNzZXJ0RXF1YWxzKG1hc3RlciwgcmVwby5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgibWFzdGVyXntjb21taXR9IikpOworICAgIGFzc2VydEVxdWFscyhudWxsLCBwYXJzZXIucGFyc2UoIm1hc3Rlcl57Y29tbWl0fSIpKTsKKworICAgIGFzc2VydEVxdWFscyhibG9iLCByZXBvLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJtYXN0ZXI6YmxvYiIpKTsKKyAgICBhc3NlcnRFcXVhbHMobnVsbCwgcGFyc2VyLnBhcnNlKCJtYXN0ZXI6YmxvYiIpKTsKKworICAgIC8vIFRlc3RSZXBvc2l0b3J5IGhhcyBubyBzaW1wbGUgd2F5IG9mIHNldHRpbmcgdGhlIHJlZmxvZy4KKyAgICAvL2Fzc2VydEVxdWFscyhudWxsLCByZXBvLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJtYXN0ZXJAezB9IikpOworICAgIGFzc2VydEVxdWFscyhudWxsLCBwYXJzZXIucGFyc2UoIm1hc3RlckB7MH0iKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9UZXN0R2l0aWxlc0FjY2Vzcy5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1Rlc3RHaXRpbGVzQWNjZXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIzMWUyNAotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9UZXN0R2l0aWxlc0FjY2Vzcy5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZGZzLkRmc1JlcG9zaXRvcnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworCisvKiogR2l0aWxlcyBhY2Nlc3MgZm9yIHRlc3RpbmcuICovCitwdWJsaWMgY2xhc3MgVGVzdEdpdGlsZXNBY2Nlc3MgaW1wbGVtZW50cyBHaXRpbGVzQWNjZXNzLkZhY3RvcnkgeworICBwcml2YXRlIGZpbmFsIERmc1JlcG9zaXRvcnkgcmVwbzsKKworICBwdWJsaWMgVGVzdEdpdGlsZXNBY2Nlc3MoRGZzUmVwb3NpdG9yeSByZXBvKSB7CisgICAgdGhpcy5yZXBvID0gY2hlY2tOb3ROdWxsKHJlcG8pOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBHaXRpbGVzQWNjZXNzIGZvclJlcXVlc3QoZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworICAgIHJldHVybiBuZXcgR2l0aWxlc0FjY2VzcygpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIE1hcDxTdHJpbmcsIFJlcG9zaXRvcnlEZXNjcmlwdGlvbj4gbGlzdFJlcG9zaXRvcmllcyhTZXQ8U3RyaW5nPiBicmFuY2hlcykgeworICAgICAgICAvLyBUT0RPKGRib3Jvd2l0eik6IEltcGxlbWVudCB0aGlzLCB1c2luZyB0aGUgRGZzUmVwb3NpdG9yeURlc2NyaXB0aW9ucyB0bworICAgICAgICAvLyBnZXQgdGhlIHJlcG9zaXRvcnkgbmFtZXMuCisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBPYmplY3QgZ2V0VXNlcktleSgpIHsKKyAgICAgICAgcmV0dXJuICJhIHVzZXIiOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVwb3NpdG9yeU5hbWUoKSB7CisgICAgICAgIHJldHVybiByZXBvLmdldERlc2NyaXB0aW9uKCkuZ2V0UmVwb3NpdG9yeU5hbWUoKTsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgUmVwb3NpdG9yeURlc2NyaXB0aW9uIGdldFJlcG9zaXRvcnlEZXNjcmlwdGlvbigpIHsKKyAgICAgICAgUmVwb3NpdG9yeURlc2NyaXB0aW9uIGQgPSBuZXcgUmVwb3NpdG9yeURlc2NyaXB0aW9uKCk7CisgICAgICAgIGQubmFtZSA9IGdldFJlcG9zaXRvcnlOYW1lKCk7CisgICAgICAgIGQuZGVzY3JpcHRpb24gPSAiYSB0ZXN0IGRhdGEgc2V0IjsKKyAgICAgICAgZC5jbG9uZVVybCA9IFRlc3RHaXRpbGVzVXJscy5VUkxTLmdldEJhc2VHaXRVcmwocmVxKSArICIvIiArIGQubmFtZTsKKyAgICAgICAgcmV0dXJuIGQ7CisgICAgICB9CisgICAgfTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1Rlc3RHaXRpbGVzVXJscy5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1Rlc3RHaXRpbGVzVXJscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YTA4ODMKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvVGVzdEdpdGlsZXNVcmxzLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworCisvKioge0BsaW5rIEdpdGlsZXNVcmxzfSBmb3IgdGVzdGluZy4gKi8KK3B1YmxpYyBjbGFzcyBUZXN0R2l0aWxlc1VybHMgaW1wbGVtZW50cyBHaXRpbGVzVXJscyB7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgR2l0aWxlc1VybHMgVVJMUyA9IG5ldyBUZXN0R2l0aWxlc1VybHMoKTsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRIb3N0TmFtZShIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisgICAgcmV0dXJuICJ0ZXN0LWhvc3QiOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0QmFzZUdpdFVybChIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisgICAgcmV0dXJuICJnaXQ6Ly90ZXN0LWhvc3QvZm9vIjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldEJhc2VHZXJyaXRVcmwoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworICAgIHJldHVybiAiaHR0cDovL3Rlc3QtaG9zdC1yZXZpZXcvZm9vLyI7CisgIH0KKworICBwcml2YXRlIFRlc3RHaXRpbGVzVXJscygpIHsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1RyZWVTb3lEYXRhVGVzdC5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1RyZWVTb3lEYXRhVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NDIzZDkKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvVHJlZVNveURhdGFUZXN0LmphdmEKQEAgLTAsMCArMSw2MSBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5naXRpbGVzLlRyZWVTb3lEYXRhLmdldFRhcmdldERpc3BsYXlOYW1lOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdpdGlsZXMuVHJlZVNveURhdGEucmVzb2x2ZVRhcmdldFVybDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOworCisvKiogVGVzdHMgZm9yIHtAbGluayBUcmVlU295RGF0YX0uICovCitwdWJsaWMgY2xhc3MgVHJlZVNveURhdGFUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICBwdWJsaWMgdm9pZCB0ZXN0R2V0VGFyZ2V0RGlzcGxheU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBhc3NlcnRFcXVhbHMoImZvbyIsIGdldFRhcmdldERpc3BsYXlOYW1lKCJmb28iKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJmb28vYmFyIiwgZ2V0VGFyZ2V0RGlzcGxheU5hbWUoImZvby9iYXIiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJhL2EvYS9hL2EvYS9hL2EvYS9hL2JhciIsCisgICAgICAgIGdldFRhcmdldERpc3BsYXlOYW1lKFN0cmluZ3MucmVwZWF0KCJhLyIsIDEwKSArICJiYXIiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJhL2EvYS9hL2EvYS9hL2EvYS9hL2EvYS9hL2EvYS9hL2EvYS9hL2EvYS9hL2EvYS9hL2EvYS9hL2EvYS9hL2EvYS9hL2JhciIsCisgICAgICAgIGdldFRhcmdldERpc3BsYXlOYW1lKFN0cmluZ3MucmVwZWF0KCJhLyIsIDM0KSArICJiYXIiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIuLi4vYmFyIiwgZ2V0VGFyZ2V0RGlzcGxheU5hbWUoU3RyaW5ncy5yZXBlYXQoImEvIiwgMzUpICsgImJhciIpKTsKKyAgICBhc3NlcnRFcXVhbHMoIi4uLi9iYXIiLCBnZXRUYXJnZXREaXNwbGF5TmFtZShTdHJpbmdzLnJlcGVhdCgiYS8iLCAxMDApICsgImJhciIpKTsKKyAgICBhc3NlcnRFcXVhbHMoImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhIiwKKyAgICAgICAgZ2V0VGFyZ2V0RGlzcGxheU5hbWUoU3RyaW5ncy5yZXBlYXQoImEiLCA4MCkpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlVGFyZ2V0VXJsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgT2JqZWN0SWQgaWQgPSBPYmplY3RJZC5mcm9tU3RyaW5nKCJhYmNkMTIzNGFiY2QxMjM0YWJjZDEyMzRhYmNkMTIzNGFiY2QxMjM0Iik7CisgICAgR2l0aWxlc1ZpZXcgdmlldyA9IEdpdGlsZXNWaWV3LnBhdGgoKQorICAgICAgICAuc2V0U2VydmxldFBhdGgoIi94IikKKyAgICAgICAgLnNldEhvc3ROYW1lKCJob3N0IikKKyAgICAgICAgLnNldFJlcG9zaXRvcnlOYW1lKCJyZXBvIikKKyAgICAgICAgLnNldFJldmlzaW9uKFJldmlzaW9uLnVucGVlbGVkKCJtIiwgaWQpKQorICAgICAgICAuc2V0VHJlZVBhdGgoImEvYi9jIikKKyAgICAgICAgLmJ1aWxkKCk7CisgICAgYXNzZXJ0TnVsbChyZXNvbHZlVGFyZ2V0VXJsKHZpZXcsICIvZm9vIikpOworICAgIGFzc2VydEVxdWFscygiL3gvcmVwby8rL20vYSIsIHJlc29sdmVUYXJnZXRVcmwodmlldywgIi4uLy4uLyIpKTsKKyAgICBhc3NlcnRFcXVhbHMoIi94L3JlcG8vKy9tL2EiLCByZXNvbHZlVGFyZ2V0VXJsKHZpZXcsICIuLi8uLy4uLyIpKTsKKyAgICBhc3NlcnRFcXVhbHMoIi94L3JlcG8vKy9tL2EiLCByZXNvbHZlVGFyZ2V0VXJsKHZpZXcsICIuLi8vLi4vIikpOworICAgIGFzc2VydEVxdWFscygiL3gvcmVwby8rL20vYS9kIiwgcmVzb2x2ZVRhcmdldFVybCh2aWV3LCAiLi4vLi4vZCIpKTsKKyAgICBhc3NlcnRFcXVhbHMoIi94L3JlcG8vKy9tLyIsIHJlc29sdmVUYXJnZXRVcmwodmlldywgIi4uLy4uLy4uIikpOworICAgIGFzc2VydEVxdWFscygiL3gvcmVwby8rL20vYS9kL2UiLCByZXNvbHZlVGFyZ2V0VXJsKHZpZXcsICIuLi8uLi9kL2UiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIveC9yZXBvLysvbS9hL2IiLCByZXNvbHZlVGFyZ2V0VXJsKHZpZXcsICIuLi9kLy4uL2UvLi4vIikpOworICAgIGFzc2VydE51bGwocmVzb2x2ZVRhcmdldFVybCh2aWV3LCAiLi4vLi4vLi4vLi4vIikpOworICAgIGFzc2VydE51bGwocmVzb2x2ZVRhcmdldFVybCh2aWV3LCAiLi4vLi4vYS8uLi8uLi8uLiIpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1ZpZXdGaWx0ZXJUZXN0LmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvVmlld0ZpbHRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDI3YjllCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1ZpZXdGaWx0ZXJUZXN0LmphdmEKQEAgLTAsMCArMSwzNDYgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2l0aWxlcy5GYWtlSHR0cFNlcnZsZXRSZXF1ZXN0Lm5ld1JlcXVlc3Q7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2l0aWxlcy5HaXRpbGVzRmlsdGVyLlJFUE9fUEFUSF9SRUdFWDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5naXRpbGVzLkdpdGlsZXNGaWx0ZXIuUkVQT19SRUdFWDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5naXRpbGVzLkdpdGlsZXNGaWx0ZXIuUk9PVF9SRUdFWDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQXRvbWljczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdpdGlsZXMuR2l0aWxlc1ZpZXcuVHlwZTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuZ2x1ZS5NZXRhRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuZ2x1ZS5NZXRhU2VydmxldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LlRlc3RSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZDb21taXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmRmcy5EZnNSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5kZnMuRGZzUmVwb3NpdG9yeURlc2NyaXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5kZnMuSW5NZW1vcnlSZXBvc2l0b3J5OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCisvKiogVGVzdHMgZm9yIHRoZSB2aWV3IGZpbHRlci4gKi8KK3B1YmxpYyBjbGFzcyBWaWV3RmlsdGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgcHJpdmF0ZSBUZXN0UmVwb3NpdG9yeTxEZnNSZXBvc2l0b3J5PiByZXBvOworCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHJlcG8gPSBuZXcgVGVzdFJlcG9zaXRvcnk8RGZzUmVwb3NpdG9yeT4oCisgICAgICAgIG5ldyBJbk1lbW9yeVJlcG9zaXRvcnkobmV3IERmc1JlcG9zaXRvcnlEZXNjcmlwdGlvbigidGVzdCIpKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Tm9Db21tYW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuSE9TVF9JTkRFWCwgZ2V0VmlldygiLyIpLmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuUkVQT1NJVE9SWV9JTkRFWCwgZ2V0VmlldygiL3JlcG8iKS5nZXRUeXBlKCkpOworICAgIGFzc2VydE51bGwoZ2V0VmlldygiL3JlcG8vKyIpKTsKKyAgICBhc3NlcnROdWxsKGdldFZpZXcoIi9yZXBvLysvIikpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEF1dG9Db21tYW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgUmV2Q29tbWl0IHBhcmVudCA9IHJlcG8uY29tbWl0KCkuY3JlYXRlKCk7CisgICAgUmV2Q29tbWl0IG1hc3RlciA9IHJlcG8uYnJhbmNoKCJyZWZzL2hlYWRzL21hc3RlciIpLmNvbW1pdCgpLnBhcmVudChwYXJlbnQpLmNyZWF0ZSgpOworICAgIFN0cmluZyBoZXggPSBtYXN0ZXIubmFtZSgpOworICAgIFN0cmluZyBoZXhCcmFuY2ggPSBoZXguc3Vic3RyaW5nKDAsIDEwKTsKKyAgICBSZXZDb21taXQgaGV4Q29tbWl0ID0gcmVwby5icmFuY2goaGV4QnJhbmNoKS5jb21taXQoKS5jcmVhdGUoKTsKKworICAgIGFzc2VydEVxdWFscyhUeXBlLkxPRywgZ2V0VmlldygiL3JlcG8vKy9tYXN0ZXIiKS5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscyhUeXBlLkxPRywgZ2V0VmlldygiL3JlcG8vKy8iICsgaGV4QnJhbmNoKS5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscyhUeXBlLlJFVklTSU9OLCBnZXRWaWV3KCIvcmVwby8rLyIgKyBoZXgpLmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuUkVWSVNJT04sIGdldFZpZXcoIi9yZXBvLysvIiArIGhleC5zdWJzdHJpbmcoMCwgNykpLmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuUEFUSCwgZ2V0VmlldygiL3JlcG8vKy9tYXN0ZXIvIikuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5QQVRILCBnZXRWaWV3KCIvcmVwby8rLyIgKyBoZXggKyAiLyIpLmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuRElGRiwgZ2V0VmlldygiL3JlcG8vKy9tYXN0ZXJeLi5tYXN0ZXIiKS5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscyhUeXBlLkRJRkYsIGdldFZpZXcoIi9yZXBvLysvbWFzdGVyXi4ubWFzdGVyLyIpLmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuRElGRiwgZ2V0VmlldygiL3JlcG8vKy8iICsgcGFyZW50Lm5hbWUoKSArICIuLiIgKyBoZXggKyAiLyIpLmdldFR5cGUoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0SG9zdEluZGV4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgR2l0aWxlc1ZpZXcgdmlldyA9IGdldFZpZXcoIi8iKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5IT1NUX0lOREVYLCB2aWV3LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0LWhvc3QiLCB2aWV3LmdldEhvc3ROYW1lKCkpOworICAgIGFzc2VydE51bGwodmlldy5nZXRSZXBvc2l0b3J5TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoUmV2aXNpb24uTlVMTCwgdmlldy5nZXRSZXZpc2lvbigpKTsKKyAgICBhc3NlcnRFcXVhbHMoUmV2aXNpb24uTlVMTCwgdmlldy5nZXRPbGRSZXZpc2lvbigpKTsKKyAgICBhc3NlcnROdWxsKHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UmVwb3NpdG9yeUluZGV4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgR2l0aWxlc1ZpZXcgdmlldyA9IGdldFZpZXcoIi9yZXBvIik7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuUkVQT1NJVE9SWV9JTkRFWCwgdmlldy5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscygicmVwbyIsIHZpZXcuZ2V0UmVwb3NpdG9yeU5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFJldmlzaW9uLk5VTEwsIHZpZXcuZ2V0UmV2aXNpb24oKSk7CisgICAgYXNzZXJ0RXF1YWxzKFJldmlzaW9uLk5VTEwsIHZpZXcuZ2V0T2xkUmV2aXNpb24oKSk7CisgICAgYXNzZXJ0TnVsbCh2aWV3LmdldFRyZWVQYXRoKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEJyYW5jaGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgUmV2Q29tbWl0IG1hc3RlciA9IHJlcG8uYnJhbmNoKCJyZWZzL2hlYWRzL21hc3RlciIpLmNvbW1pdCgpLmNyZWF0ZSgpOworICAgIFJldkNvbW1pdCBzdGFibGUgPSByZXBvLmJyYW5jaCgicmVmcy9oZWFkcy9zdGFibGUiKS5jb21taXQoKS5jcmVhdGUoKTsKKyAgICBHaXRpbGVzVmlldyB2aWV3OworCisgICAgdmlldyA9IGdldFZpZXcoIi9yZXBvLytzaG93L21hc3RlciIpOworICAgIGFzc2VydEVxdWFscyhUeXBlLlJFVklTSU9OLCB2aWV3LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJtYXN0ZXIiLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMobWFzdGVyLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0TnVsbCh2aWV3LmdldFRyZWVQYXRoKCkpOworCisgICAgdmlldyA9IGdldFZpZXcoIi9yZXBvLytzaG93L2hlYWRzL21hc3RlciIpOworICAgIGFzc2VydEVxdWFscyhUeXBlLlJFVklTSU9OLCB2aWV3LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJoZWFkcy9tYXN0ZXIiLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMobWFzdGVyLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0TnVsbCh2aWV3LmdldFRyZWVQYXRoKCkpOworCisgICAgdmlldyA9IGdldFZpZXcoIi9yZXBvLytzaG93L3JlZnMvaGVhZHMvbWFzdGVyIik7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuUkVWSVNJT04sIHZpZXcuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoInJlZnMvaGVhZHMvbWFzdGVyIiwgdmlldy5nZXRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKG1hc3Rlciwgdmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydE51bGwodmlldy5nZXRUcmVlUGF0aCgpKTsKKworICAgIHZpZXcgPSBnZXRWaWV3KCIvcmVwby8rc2hvdy9zdGFibGUiKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5SRVZJU0lPTiwgdmlldy5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscygic3RhYmxlIiwgdmlldy5nZXRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKHN0YWJsZSwgdmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydE51bGwodmlldy5nZXRUcmVlUGF0aCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RBbWJpZ3VvdXNCcmFuY2hBbmRUYWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBSZXZDb21taXQgYnJhbmNoID0gcmVwby5icmFuY2goInJlZnMvaGVhZHMvbmFtZSIpLmNvbW1pdCgpLmNyZWF0ZSgpOworICAgIFJldkNvbW1pdCB0YWcgPSByZXBvLmJyYW5jaCgicmVmcy90YWdzL25hbWUiKS5jb21taXQoKS5jcmVhdGUoKTsKKyAgICBHaXRpbGVzVmlldyB2aWV3OworCisgICAgdmlldyA9IGdldFZpZXcoIi9yZXBvLytzaG93L25hbWUiKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5SRVZJU0lPTiwgdmlldy5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscygibmFtZSIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscyh0YWcsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnROdWxsKHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisKKyAgICB2aWV3ID0gZ2V0VmlldygiL3JlcG8vK3Nob3cvaGVhZHMvbmFtZSIpOworICAgIGFzc2VydEVxdWFscyhUeXBlLlJFVklTSU9OLCB2aWV3LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJoZWFkcy9uYW1lIiwgdmlldy5nZXRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGJyYW5jaCwgdmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydE51bGwodmlldy5nZXRUcmVlUGF0aCgpKTsKKworICAgIHZpZXcgPSBnZXRWaWV3KCIvcmVwby8rc2hvdy9yZWZzL2hlYWRzL25hbWUiKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5SRVZJU0lPTiwgdmlldy5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscygicmVmcy9oZWFkcy9uYW1lIiwgdmlldy5nZXRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGJyYW5jaCwgdmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydE51bGwodmlldy5nZXRUcmVlUGF0aCgpKTsKKworICAgIHZpZXcgPSBnZXRWaWV3KCIvcmVwby8rc2hvdy90YWdzL25hbWUiKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5SRVZJU0lPTiwgdmlldy5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscygidGFncy9uYW1lIiwgdmlldy5nZXRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKHRhZywgdmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydE51bGwodmlldy5nZXRUcmVlUGF0aCgpKTsKKworICAgIHZpZXcgPSBnZXRWaWV3KCIvcmVwby8rc2hvdy9yZWZzL3RhZ3MvbmFtZSIpOworICAgIGFzc2VydEVxdWFscyhUeXBlLlJFVklTSU9OLCB2aWV3LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJyZWZzL3RhZ3MvbmFtZSIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscyh0YWcsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnROdWxsKHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGF0aCgpIHRocm93cyBFeGNlcHRpb24geworICAgIFJldkNvbW1pdCBtYXN0ZXIgPSByZXBvLmJyYW5jaCgicmVmcy9oZWFkcy9tYXN0ZXIiKS5jb21taXQoKS5jcmVhdGUoKTsKKyAgICBHaXRpbGVzVmlldyB2aWV3OworCisgICAgdmlldyA9IGdldFZpZXcoIi9yZXBvLytzaG93L21hc3Rlci8iKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5QQVRILCB2aWV3LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKG1hc3Rlciwgdmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydEVxdWFscygiIiwgdmlldy5nZXRUcmVlUGF0aCgpKTsKKworICAgIHZpZXcgPSBnZXRWaWV3KCIvcmVwby8rc2hvdy9tYXN0ZXIvZm9vIik7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuUEFUSCwgdmlldy5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscyhtYXN0ZXIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImZvbyIsIHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisKKyAgICB2aWV3ID0gZ2V0VmlldygiL3JlcG8vK3Nob3cvbWFzdGVyL2Zvby8iKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5QQVRILCB2aWV3LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKG1hc3Rlciwgdmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydEVxdWFscygiZm9vIiwgdmlldy5nZXRUcmVlUGF0aCgpKTsKKworICAgIHZpZXcgPSBnZXRWaWV3KCIvcmVwby8rc2hvdy9tYXN0ZXIvZm9vL2JhciIpOworICAgIGFzc2VydEVxdWFscyhUeXBlLlBBVEgsIHZpZXcuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMobWFzdGVyLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJmb28vYmFyIiwgdmlldy5nZXRUcmVlUGF0aCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZVNsYXNoZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBSZXZDb21taXQgbWFzdGVyID0gcmVwby5icmFuY2goInJlZnMvaGVhZHMvbWFzdGVyIikuY29tbWl0KCkuY3JlYXRlKCk7CisgICAgR2l0aWxlc1ZpZXcgdmlldzsKKworICAgIGFzc2VydEVxdWFscyhUeXBlLkhPU1RfSU5ERVgsIGdldFZpZXcoIi8vIikuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5SRVBPU0lUT1JZX0lOREVYLCBnZXRWaWV3KCIvL3JlcG8iKS5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscyhUeXBlLlJFUE9TSVRPUllfSU5ERVgsIGdldFZpZXcoIi8vcmVwby8vIikuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnROdWxsKGdldFZpZXcoIi9yZXBvLysvL21hc3RlciIpKTsKKyAgICBhc3NlcnROdWxsKGdldFZpZXcoIi9yZXBvLysvcmVmcy8vaGVhZHMvL21hc3RlciIpKTsKKyAgICBhc3NlcnROdWxsKGdldFZpZXcoIi9yZXBvLysvL21hc3Rlci8vIikpOworICAgIGFzc2VydE51bGwoZ2V0VmlldygiL3JlcG8vKy8vbWFzdGVyL2Zvby8vYmFyIikpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdERpZmYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBSZXZDb21taXQgcGFyZW50ID0gcmVwby5jb21taXQoKS5jcmVhdGUoKTsKKyAgICBSZXZDb21taXQgbWFzdGVyID0gcmVwby5icmFuY2goInJlZnMvaGVhZHMvbWFzdGVyIikuY29tbWl0KCkucGFyZW50KHBhcmVudCkuY3JlYXRlKCk7CisgICAgR2l0aWxlc1ZpZXcgdmlldzsKKworICAgIHZpZXcgPSBnZXRWaWV3KCIvcmVwby8rZGlmZi9tYXN0ZXJeLi5tYXN0ZXIiKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5ESUZGLCB2aWV3LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJtYXN0ZXIiLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMobWFzdGVyLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJtYXN0ZXJeIiwgdmlldy5nZXRPbGRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKHBhcmVudCwgdmlldy5nZXRPbGRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydEVxdWFscygiIiwgdmlldy5nZXRUcmVlUGF0aCgpKTsKKworICAgIHZpZXcgPSBnZXRWaWV3KCIvcmVwby8rZGlmZi9tYXN0ZXJeLi5tYXN0ZXIvIik7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuRElGRiwgdmlldy5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscygibWFzdGVyIiwgdmlldy5nZXRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKG1hc3Rlciwgdmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydEVxdWFscygibWFzdGVyXiIsIHZpZXcuZ2V0T2xkUmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhwYXJlbnQsIHZpZXcuZ2V0T2xkUmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIiIsIHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisKKyAgICB2aWV3ID0gZ2V0VmlldygiL3JlcG8vK2RpZmYvbWFzdGVyXi4ubWFzdGVyL2ZvbyIpOworICAgIGFzc2VydEVxdWFscyhUeXBlLkRJRkYsIHZpZXcuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIm1hc3RlciIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhtYXN0ZXIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIm1hc3Rlcl4iLCB2aWV3LmdldE9sZFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMocGFyZW50LCB2aWV3LmdldE9sZFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCB2aWV3LmdldFRyZWVQYXRoKCkpOworCisgICAgdmlldyA9IGdldFZpZXcoIi9yZXBvLytkaWZmL3JlZnMvaGVhZHMvbWFzdGVyXi4ucmVmcy9oZWFkcy9tYXN0ZXIiKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5ESUZGLCB2aWV3LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJyZWZzL2hlYWRzL21hc3RlciIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhtYXN0ZXIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoInJlZnMvaGVhZHMvbWFzdGVyXiIsIHZpZXcuZ2V0T2xkUmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhwYXJlbnQsIHZpZXcuZ2V0T2xkUmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIiIsIHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RGlmZkFnYWluc3RFbXB0eUNvbW1pdCgpIHRocm93cyBFeGNlcHRpb24geworICAgIFJldkNvbW1pdCBtYXN0ZXIgPSByZXBvLmJyYW5jaCgicmVmcy9oZWFkcy9tYXN0ZXIiKS5jb21taXQoKS5jcmVhdGUoKTsKKyAgICBHaXRpbGVzVmlldyB2aWV3ID0gZ2V0VmlldygiL3JlcG8vK2RpZmYvbWFzdGVyXiEiKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5ESUZGLCB2aWV3LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJtYXN0ZXIiLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMobWFzdGVyLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFJldmlzaW9uLk5VTEwsIHZpZXcuZ2V0T2xkUmV2aXNpb24oKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIiLCB2aWV3LmdldFRyZWVQYXRoKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdExvZygpIHRocm93cyBFeGNlcHRpb24geworICAgIFJldkNvbW1pdCBwYXJlbnQgPSByZXBvLmNvbW1pdCgpLmNyZWF0ZSgpOworICAgIFJldkNvbW1pdCBtYXN0ZXIgPSByZXBvLmJyYW5jaCgicmVmcy9oZWFkcy9tYXN0ZXIiKS5jb21taXQoKS5wYXJlbnQocGFyZW50KS5jcmVhdGUoKTsKKyAgICBHaXRpbGVzVmlldyB2aWV3OworCisgICAgYXNzZXJ0TnVsbChnZXRWaWV3KCIvcmVwby8rbG9nIikpOworICAgIGFzc2VydE51bGwoZ2V0VmlldygiL3JlcG8vK2xvZy8iKSk7CisKKyAgICB2aWV3ID0gZ2V0VmlldygiL3JlcG8vK2xvZy9tYXN0ZXIiKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5MT0csIHZpZXcuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIm1hc3RlciIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhtYXN0ZXIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoUmV2aXNpb24uTlVMTCwgdmlldy5nZXRPbGRSZXZpc2lvbigpKTsKKyAgICBhc3NlcnRFcXVhbHMoIiIsIHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisKKyAgICB2aWV3ID0gZ2V0VmlldygiL3JlcG8vK2xvZy9tYXN0ZXIvIik7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuTE9HLCB2aWV3LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJtYXN0ZXIiLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMobWFzdGVyLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFJldmlzaW9uLk5VTEwsIHZpZXcuZ2V0T2xkUmV2aXNpb24oKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIiLCB2aWV3LmdldFRyZWVQYXRoKCkpOworCisgICAgdmlldyA9IGdldFZpZXcoIi9yZXBvLytsb2cvbWFzdGVyL2ZvbyIpOworICAgIGFzc2VydEVxdWFscyhUeXBlLkxPRywgdmlldy5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscygibWFzdGVyIiwgdmlldy5nZXRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKG1hc3Rlciwgdmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydEVxdWFscyhSZXZpc2lvbi5OVUxMLCB2aWV3LmdldE9sZFJldmlzaW9uKCkpOworICAgIGFzc2VydEVxdWFscygiZm9vIiwgdmlldy5nZXRUcmVlUGF0aCgpKTsKKworICAgIHZpZXcgPSBnZXRWaWV3KCIvcmVwby8rbG9nL21hc3Rlcl4uLm1hc3RlciIpOworICAgIGFzc2VydEVxdWFscyhUeXBlLkxPRywgdmlldy5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscygibWFzdGVyIiwgdmlldy5nZXRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKG1hc3Rlciwgdmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydEVxdWFscygibWFzdGVyXiIsIHZpZXcuZ2V0T2xkUmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhwYXJlbnQsIHZpZXcuZ2V0T2xkUmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIiIsIHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisKKyAgICB2aWV3ID0gZ2V0VmlldygiL3JlcG8vK2xvZy9tYXN0ZXJeLi5tYXN0ZXIvIik7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuTE9HLCB2aWV3LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJtYXN0ZXIiLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMobWFzdGVyLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJtYXN0ZXJeIiwgdmlldy5nZXRPbGRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKHBhcmVudCwgdmlldy5nZXRPbGRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydEVxdWFscygiIiwgdmlldy5nZXRUcmVlUGF0aCgpKTsKKworICAgIHZpZXcgPSBnZXRWaWV3KCIvcmVwby8rbG9nL21hc3Rlcl4uLm1hc3Rlci9mb28iKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5MT0csIHZpZXcuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIm1hc3RlciIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhtYXN0ZXIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIm1hc3Rlcl4iLCB2aWV3LmdldE9sZFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMocGFyZW50LCB2aWV3LmdldE9sZFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCB2aWV3LmdldFRyZWVQYXRoKCkpOworCisgICAgdmlldyA9IGdldFZpZXcoIi9yZXBvLytsb2cvcmVmcy9oZWFkcy9tYXN0ZXJeLi5yZWZzL2hlYWRzL21hc3RlciIpOworICAgIGFzc2VydEVxdWFscyhUeXBlLkxPRywgdmlldy5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscygicmVmcy9oZWFkcy9tYXN0ZXIiLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMobWFzdGVyLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJyZWZzL2hlYWRzL21hc3Rlcl4iLCB2aWV3LmdldE9sZFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMocGFyZW50LCB2aWV3LmdldE9sZFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIiLCB2aWV3LmdldFRyZWVQYXRoKCkpOworICB9CisKKyAgcHJpdmF0ZSBHaXRpbGVzVmlldyBnZXRWaWV3KFN0cmluZyBwYXRoQW5kUXVlcnkpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgZmluYWwgQXRvbWljUmVmZXJlbmNlPEdpdGlsZXNWaWV3PiB2aWV3ID0gQXRvbWljcy5uZXdSZWZlcmVuY2UoKTsKKyAgICBIdHRwU2VydmxldCB0ZXN0U2VydmxldCA9IG5ldyBIdHRwU2VydmxldCgpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHJvdGVjdGVkIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpIHsKKyAgICAgICAgdmlldy5zZXQoVmlld0ZpbHRlci5nZXRWaWV3KHJlcSkpOworICAgICAgfQorICAgIH07CisKKyAgICBWaWV3RmlsdGVyIHZmID0gbmV3IFZpZXdGaWx0ZXIoCisgICAgICAgIG5ldyBUZXN0R2l0aWxlc0FjY2VzcyhyZXBvLmdldFJlcG9zaXRvcnkoKSksCisgICAgICAgIFRlc3RHaXRpbGVzVXJscy5VUkxTLAorICAgICAgICBuZXcgVmlzaWJpbGl0eUNhY2hlKGZhbHNlKSk7CisgICAgTWV0YUZpbHRlciBtZiA9IG5ldyBNZXRhRmlsdGVyKCk7CisKKyAgICBmb3IgKFBhdHRlcm4gcCA6IEltbXV0YWJsZUxpc3Qub2YoUk9PVF9SRUdFWCwgUkVQT19SRUdFWCwgUkVQT19QQVRIX1JFR0VYKSkgeworICAgICAgbWYuc2VydmVSZWdleChwKQorICAgICAgICAgIC50aHJvdWdoKHZmKQorICAgICAgICAgIC53aXRoKHRlc3RTZXJ2bGV0KTsKKyAgICB9CisKKyAgICBGYWtlSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSA9IG5ld1JlcXVlc3QocmVwby5nZXRSZXBvc2l0b3J5KCkpOworICAgIGludCBxID0gcGF0aEFuZFF1ZXJ5LmluZGV4T2YoJz8nKTsKKyAgICBpZiAocSA+IDApIHsKKyAgICAgIHJlcS5zZXRQYXRoSW5mbyhwYXRoQW5kUXVlcnkuc3Vic3RyaW5nKDAsIHEpKTsKKyAgICAgIHJlcS5zZXRRdWVyeVN0cmluZyhwYXRoQW5kUXVlcnkuc3Vic3RyaW5nKHEgKyAxKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlcS5zZXRQYXRoSW5mbyhwYXRoQW5kUXVlcnkpOworICAgIH0KKyAgICBuZXcgTWV0YVNlcnZsZXQobWYpe30uc2VydmljZShyZXEsIG5ldyBGYWtlSHR0cFNlcnZsZXRSZXNwb25zZSgpKTsKKworICAgIHJldHVybiB2aWV3LmdldCgpOworICB9Cit9Cg==