UEsDBBQACAAIAFVeCj8AAAAAAAAAAAAAAAAUAAQATUVUQS1JTkYvTUFOSUZFU1QuTUb+ygAAjZNNT8MwDIbvlfofqknc1qgrX1InDoB6QRuaGOLuZWYE2qQk7rTy63GXqWysQ1wiRfbz2o7fTEGrV3QUv6B1yugsGokkDO5qvSwwfsLPWllc5huUNXE412tljS5RUxY9pPM8HonLLn3elAtTKPkIJWaRsSuBslCVQ/FeayOI67ixU3pVIHGpG7I1hkHuc+IJfDVzAsvKPrBTvZWk1kDGnpIUz3x2WWGw6zr2/CEljUVha02qxPHCF1j70W8G5+JKJIOhzw+DyCOtmjYbUaXiHWxljUTnjD2i+eFEmnS8h0GzDm3L9pRLfwCoQL61+dQjfC1GA9Y5UN5rq1c95XZ+NbNFWMdTJRIsgeDfpMcsVsYpMqxjm79YXpA6HuaCh04G3XL3bNeinzUU6lUhbzHfVMZSPAP5AauTdhqesARvahvjLvvC2yFOsez0wnUd3hfg3AzoLYt4QfJjAo2pqS0wFHtj6GVr0LOD+28L86Cz9n80WVSw2buw/y9ne7cuNN39z+6d0jAIg29QSwcIA9koWYgBAAC2AwAAUEsDBAoAAAAAAJcByz76XTgYtgwAALYMAAAMAAAAcnVuVGVzdHMueG1sPHByb2plY3QKICAgIG5hbWU9IlNpbVJlbCBUZXN0cyIKICAgIGJhc2VkaXI9Ii4iCiAgICBkZWZhdWx0PSJydW5UZXN0cyI+CgogICAgPHByb3BlcnR5CiAgICAgICAgZW52aXJvbm1lbnQ9ImVudiIvPgoJPCEtLQoJICAgICAgICBUaGlzIHByb3BlcnR5IGZpbGUgbmFtZSBpcyBpdHNlbGYgYSBwcm9wZXJ0eSwgc28gaXQgY2FuIGJlIG92ZXJyaWRkZW4KCSAgICAgICAgb24gb25lIG1hY2hpbmUgdmVyc3VzIGFub3RoZXIuIFdlIGRvIGl0IHRoaXMgd2F5LCBpbnN0ZWFkIG9mIGp1c3Qgc3BlY2lmeWluZwoJICAgICAgICAtcHJvcGVydHlGaWxlIG9uIGNvbW1hbmQgbGluZSwgc28gdGhhdCB0aGUgcHJvcGVydHkgdmFsdWVzIGNhbiBiZSAibmVzdGVkIgoJICAgICAgICBpbiBvdGhlciBwcm9wZXJ0eSB2YWx1ZXMgYW5kIGV2YWx1YXRlZCBsYXppbHkuCgkgICAgLS0+CgogICAgPHByb3BlcnR5CiAgICAgICAgbmFtZT0iYWdnclByb3BlcnR5RmlsZSIKICAgICAgICB2YWx1ZT0iYWdnci5wcm9wZXJ0aWVzIi8+CgogICAgPHByb3BlcnR5CiAgICAgICAgZmlsZT0iJHthZ2dyUHJvcGVydHlGaWxlfSIvPgoKCTwhLS0gQnkgZGVmYXVsdCwgd2UnbGwgcHV0IHRlc3Qgb3V0cHV0IGZpbGVzIGluICJzdGFnaW5nIiBzbyB0aGUgaW5kZXguaHRtbCBmaWxlICAgLS0+CiAgICA8cHJvcGVydHkKICAgICAgICBuYW1lPSJvdXRwdXREaXJlY3RvcnkiCiAgICAgICAgdmFsdWU9IiR7VEVTVF9SRVNVTFRTfSIvPgoKICAgIDx0YXJnZXQKICAgICAgICBuYW1lPSJydW5UZXN0cyI+CiAgICAgICAgPGVjaG8KICAgICAgICAgICAgbWVzc2FnZT0iQ3JlYXRpbmcgUmVwb3J0cyIvPgoKICAgICAgICA8ZWNob3Byb3BlcnRpZXMvPgoKICAgICAgICA8bWtkaXIKICAgICAgICAgICAgZGlyPSIke291dHB1dERpcmVjdG9yeX0iLz4KCiAgICAJPCEtLSBOT1RFOiB3ZSBzdHJvbmdseSBhc3N1bWUgJ291dHB1dERpcmVjdG9yeScgaXMgZGVkaWNhdGVkIGNvbXBsZXRlbHkgZm9yIG91ciB1c2UhIC0tPgogICAgICAgIDxkZWxldGU+CiAgICAgICAgICAgIDxmaWxlc2V0CiAgICAgICAgICAgICAgICBkaXI9IiR7b3V0cHV0RGlyZWN0b3J5fSI+CiAgICAgICAgICAgIDwvZmlsZXNldD4KICAgICAgICA8L2RlbGV0ZT4KICAgICAgIDxta2RpcgogICAgICAgICAgIGRpcj0iJHtvdXRwdXREaXJlY3Rvcnl9L3JlcG9ydHMiLz4KCiAgICAgICAgPGNvcHkKICAgICAgICAgICAgdG9maWxlPSIke291dHB1dERpcmVjdG9yeX0vaW5kZXguaHRtbCIKICAgICAgICAgICAgZmlsZT0iJHtCVUlMRF9URVNUU19ESVJ9L3RlbXBsYXRlRmlsZXMvaW5kZXhQZW5kaW5nLmh0bWwiCiAgICAgICAgICAgIG92ZXJ3cml0ZT0idHJ1ZSIvPgoKICAgICAgICA8Z2VuZXJhdGVSZXBvc2l0b3J5UmVwb3J0cwogICAgICAgICAgICB0ZW1wV29ya2luZ0Rpcj0iL3RtcC90ZW1wV29ya2luZ0xvY2F0aW9uIgogICAgICAgICAgICBkaXJlY3RvcnlUb0NoZWNrPSIke3Rlc3RSZXBvRGlyZWN0b3J5fSIKICAgICAgICAgICAgb3V0cHV0UmVzdWx0c0RpcmVjdG9yeT0iJHtvdXRwdXREaXJlY3Rvcnl9L3JlcG9ydHMiCiAgICAgICAgICAgIGZhaWx1cmVzb2NjdXJyZWQ9ImZhaWx1cmVzb2NjdXJyZWQiLz4KCiAgICAgICAgPGNvcHkKICAgICAgICAgICAgdG9maWxlPSIke291dHB1dERpcmVjdG9yeX0vaW5kZXguaHRtbCIKICAgICAgICAgICAgZmlsZT0iJHtCVUlMRF9URVNUU19ESVJ9L3RlbXBsYXRlRmlsZXMvaW5kZXhtYWlucHJlc2lnbi5odG1sIgogICAgICAgICAgICBvdmVyd3JpdGU9InRydWUiLz4KCiAgICAgICAgPGV4ZWMKICAgICAgICAgICAgZXhlY3V0YWJsZT0iJHtCVUlMRF9URVNUU19ESVJ9L3ZlcmlmeWRpci5zaCI+CiAgICAgICAgICAgIDxhcmcKICAgICAgICAgICAgICAgIHZhbHVlPSIke3Rlc3RSZXBvRGlyZWN0b3J5fSIvPgogICAgICAgICAgICA8YXJnCiAgICAgICAgICAgICAgICB2YWx1ZT0iJHtvdXRwdXREaXJlY3Rvcnl9L3JlcG9ydHMiLz4KCQogICAgICAgIAk8IS0tIHdlJ2xsIGNoZWNrIGphcnMgb25seSwgdG8gc2F2ZSB0aW1lIC4uLiBhc3N1bWUgcGFjay5neiBmaWxlcyB3b3VsZCBiZSBjb3JyZWN0IHRvbyAgCiAgICAgICAgICAgPGFyZwogICAgICAgICAgICAgICAgdmFsdWU9Ii4qXChcLmphciRcfFwuamFyXC5wYWNrXC5neiRcKSIvPiAtLT4KICAgICAgICAJCiAgICAgICAgCTwhLS0gcmVzdHJpY3RpbmcgdG8gJ2NvbW1vbicganVzdCBmb3IgdGVzdGluZyAuLi4gc28gZmluaXNoZXMgcmVsYXRpdmVseSBxdWlja2x5IAogICAgICAgICAgICA8YXJnCiAgICAgICAgICAgICAgICB2YWx1ZT0iLipjb21tb24uKlwuamFyJCIvPgogICAgICAgICAgICAgICAgLS0+CiAgICAgICAgICAgIDxhcmcKICAgICAgICAgICAgICAgICB2YWx1ZT0iLipcLmphciQiLz4KICAgICAgICA8L2V4ZWM+CgogICAgICAgIDxjb3B5CiAgICAgICAgICAgIHRvZmlsZT0iJHtvdXRwdXREaXJlY3Rvcnl9L2luZGV4Lmh0bWwiCiAgICAgICAgICAgIGZpbGU9IiR7QlVJTERfVEVTVFNfRElSfS90ZW1wbGF0ZUZpbGVzL2luZGV4bWFpbi5odG1sIgogICAgICAgICAgICBvdmVyd3JpdGU9InRydWUiLz4KCgkJPCEtLQogICAgICAgIDxta2RpcgogICAgICAgICAgICBkaXI9IiR7b3V0cHV0RGlyZWN0b3J5fS9vdXRwdXQtZWNsaXBzZSIvPgogICAgICAgIDx0ZXN0TGF5b3V0dGFzawogICAgICAgICAgICB0ZW1wV29ya2luZ0Rpcj0iL3RtcC90ZW1wV29ya2luZ0xvY2F0aW9uIgogICAgICAgICAgICBkaXJlY3RvcnlUb0NoZWNrPSIvaG9tZS9kYXRhL2h0dHBkL2Rvd25sb2FkLmVjbGlwc2Uub3JnL2VjbGlwc2UvdXBkYXRlcy8zLjdtaWxlc3RvbmVzL1MtMy43UkMzLUkyMDExMDUyNjE3MDgvIgogICAgICAgICAgICBvdXRwdXRSZXN1bHRzRGlyZWN0b3J5PSIke291dHB1dERpcmVjdG9yeX0vb3V0cHV0LWVjbGlwc2UiCiAgICAgICAgICAgIGZhaWx1cmVzb2NjdXJyZWQ9ImZhaWx1cmVzb2NjdXJyZWQiLz4KLS0+CgoJCTwhLS0gVE9ETzogdXNlIHRtcCBvbiBzdGFnaW5nIGRpcmVjdG9yeSB0byBhdm9pZCBmaWxsaW5nIHVwIC90bXA/IC0tPgogICAgICAgIDxkZWxldGUKICAgICAgICAgICAgZGlyPSIvdG1wL3RlbXBXb3JraW5nTG9jYXRpb24iLz4KCgkJPCEtLSBjdXJyZW50bHksIHdlIG5ldmVyICJmYWlsIiAuLi4gYnV0LCB3aWxsIGluIGZ1dHVyZSAtLT4KICAgICAgICA8ZmFpbAogICAgICAgICAgICBpZj0iZmFpbHVyZXNvY2N1cnJlZCIvPgogICAgPC90YXJnZXQ+CjwvcHJvamVjdD5QSwMECgAAAAAARQHLPltDgXxiBgAAYgYAAAwAAAB2ZXJpZnlkaXIuc2gjIS91c3IvYmluL2VudiBiYXNoCgojIHdlIG1ha2UgdGhlIGFzc3VtcHRpb24gdGhhdCAndmVyaWZ5LnNoJyBpcyBpbiBzYW1lIGRpcmVjdG9yeSBhcyAndmVyaWZ5ZGlyLnNoJyAKIyBzbyB0aGUgY29ycmVjdCAndmVyaWZ5LnNoJyBmaWxlIGNvbW1hbmQgY2FuIGJlIHVzZWQ7IHRoZSBvbmUgdGhhdCAiZ29lcyB3aXRoIiB0aGUgdmVyaWZ5ZGlyLnNoIHNjcmlwdCAKIyB3ZSBhcmUgY3VycmVudGx5IGV4ZWN1dGluZy4gU28sIHdlIHN0b3JlIHRoZSBwYXRoIHRvIHZlcmlmeWRpci5zaCBpbiBFWEVDRElSLiAgCkVYRUNESVI9JHswJS8qfQoKZWNobyAiMTogIiAkMQplY2hvICIyOiAiICQyCmVjaG8gIjM6ICIgJDMKCmlmIFsgLXogJDEgXQp0aGVuCiAgICBsb2M9Li8KZWxzZQogICAgbG9jPSR7MX0KZmkKCmlmIFsgLXogJDIgXQp0aGVuCiAgICBleHBvcnQgVkVSSUZZT1VURElSPSIke0hPTUV9Ii92ZXJpZnlkaXJvdXRwdXQKZWxzZQogICAgZXhwb3J0IFZFUklGWU9VVERJUj0iJHsyfSIvdmVyaWZ5ZGlyb3V0cHV0CmZpCgppZiBbIC16ICQzIF0KdGhlbgogICAgcGF0PSIuKlwoXC5qYXIkXHxcLmphclwucGFja1wuZ3okXCkiCmVsc2UKICAgIHBhdD0iJHszfSIKZmkKCiMgVkVSSUZZT1VURElSIGlzIHVzZWQgaW4gJ3ZlcmlmeS5zaCcgYW5kIG11c3QgYmUgY2xlYW4gYmVmb3JlCiMgYmVnaW5uaW5nIHRoZSBvdmVyYWxsIGNoZWNrCgojIG1ha2UsIGluIGNhc2UgZG9lc24ndCBleGlzdApta2RpciAtcCAiJHtWRVJJRllPVVRESVJ9IgoKIyBldmVuIHRob3VnaCB3ZSBqdXN0IHNldCBpdCBhYm92ZSwgaW5jbHVkZSB0aGUgaWYgY2hlY2sgCiMgaGVyZSB0byBnYXVyZCBhZ2FpbnN0IGZ1dHVyZSBlcnJvcnMsIHNpbmNlIGlmICd2ZXJmaXlvdXRkaXInIGlzIAojIG5vdCBkZWZpbmVkLCB0aGUgcmVtb3ZlIHdvdWxkIGJlIGZvciB0aGUgcm9vdCBkaXJlY3RvcnkhISAKaWYgW1sgLW4gIiR7VkVSSUZZT1VURElSfSIgXV0KdGhlbiAKICAgICAgIHJtIC1mciAiJHtWRVJJRllPVVRESVJ9Ii8qCmZpCgplY2hvICIgICB2ZXJpZnkgZGlyZWN0b3J5OiAke2xvY30iCmVjaG8gIiAgIGZvciBmaWxlIHBhdHRlcm46ICR7cGF0fSIKZWNobyAiICAgcmVzdWx0IGxpc3QgZmlsZXMgd2lsbCBiZSBpbiAiICIke1ZFUklGWU9VVERJUn0iICIoYW5kIGFueSBleGlzdGluZyBmaWxlcyB0aGVyZSByZW1vdmVkKS4iCgpmaW5kICIke2xvY30iIC1yZWdleCAiJHtwYXR9IiAtZXhlYyAke0VYRUNESVJ9L3ZlcmlmeS5zaCAne30nIFw7CgojIGlmIGNlcnRhaW4gZmlsZXMgd2VyZSBub3QgY3JlYXRlZCBkdXJpbmcgc2lnbmluZyBjaGVja3MsIGNyZWF0ZSBhICJwbGFpbiIgb25lIGF0IGV4cGVjdGVkIGxvY2F0aW9uLCAKIyB0byBhdm9pZCA0MDQgZXJyb3JzIGZyb20gc3RhbmRhcmQgaW5kZXguaHRtbC4gRm9yIGV4YW1wbGUsIGFsbCBqYXJzIGFyZSBzaWduZWQsIHRoZXJlIHdpbGwgYmUgbm8gdW5zaWduZWQudHh0IGZpbGVzLgppZiBbICEgLWUgIiR7VkVSSUZZT1VURElSfSIvdW5zaWduZWQudHh0IF0KdGhlbgogICAgZWNobyAgIlRoZXJlIHdlcmUgbm8gdW5zaWduZWQgamFycyBpbiB0aGUgZGlyZWN0b3JpZXMgY2hlY2tlZC4gIiA+ICIke1ZFUklGWU9VVERJUn0iL3Vuc2lnbmVkLnR4dApmaSAKClBLAwQKAAAAAAA3arw+dA+nmFcFAABXBQAAFgAAAGNsZWFudXBCdWlsZFJlc3VsdHMuc2gjIS91c3IvYmluL2VudiBiYXNoCgojIHNtYWxsIHV0aWxpdHkgdG8gcmVtb3ZlIG9sZCAodGVtcG9yYXJ5KSBidWlsZHMgZnJvbSB3b3JrIGFyZWEKCiMgZmluZHMgZmlsZSBvbiB1c2VycyBwYXRoLCBiZWZvcmUgY3VycmVudCBkaXJlY3RvcnkKIyBoZW5jZSwgbm9uLXByb2R1Y3Rpb24gdXNlcnMgY2FuIHNldCB0aGVpciBvd24gdmFsdWVzIGZvciB0ZXN0IG1hY2hpbmVzCnNvdXJjZSBhZ2dyX3Byb3BlcnRpZXMuc2hzb3VyY2UKCiMgcmVtb3ZlIGFydGlmYWN0cyBvdmVyIG4gZGF5cyBvbGQKIyAod2hlcmUgaG91cnMgPSAyNCArIChuICogMjQpLCBiYXNpY2FsbHksIHNvIHRoYXQKIyBldmVuIG49MCBtZWFucyAiMSBkYXkiKQoKIyBzZXQgYXQgMTAgZGF5cywgdW5kZXIgYXNzdW1wdGlvbiB0aGF0IGJlZm9yZSB0aGF0IHRpbWUsCiMgYXJ0aWZhY3RzIHdpbGwgYmUgInNhdmVkIiBlbHNld2hlcmUsIGlmIG5lZWRlZC4KIyBpZiBtb3JlIGNsZWFudXAgaXMgbmVlZGVkLCB3ZSBzaG91bGQgdGFrZSB0aW1lLCBhbmQKIyBleGlzdGVuY2Ugb2YgbW9yZSByZWNlbnQgYnVpbGRzIGludG8gYWNjb3VudCwgc28gd2UgbmV2ZXIKIyBkZWxldGUgdGhlIGxhc3QgZXhpc3RpbmcgYnVpbGQgKGV2ZW4gaWYgIm9sZCIpLgoKbmRheXM9MTsKYXJ0aWZhY3RzRGlyPSR7QlVJTERfUkVTVUxUU307CgplY2hvOwplY2hvICIgICAgUmVtb3ZpbmcgYXJ0aWZhY3QgZGlyZWN0b3JpZXMgb2xkZXIgdGhhbiAke25kYXlzfSBkYXlzIjsKZWNobyAiICAgICAgICAoZnJvbSAke2FydGlmYWN0c0Rpcn0pIjsKYmVmb3JlPWBmaW5kICR7YXJ0aWZhY3RzRGlyfSAtbWluZGVwdGggMSAtbWF4ZGVwdGggMSB8IHdjIC1sYDsKZWNobyAiICAgICAgICAgICAgbnVtYmVyIG9mIGRpcmVjdG9yaWVzIGJlZm9yZSBjbGVhbmluZzogJHtiZWZvcmV9IjsKCiMgZW1wdHkgZGlyZWN0b3JpZXMgb2Z0ZW4gcmVzdWx0IGZyb20gImJhZCBidWlsZHMiLiBXZSByZW1vdmUgdGhvc2Ugbm8gbWF0dGVyIGhvdyBvbGQKZmluZCAke2FydGlmYWN0c0Rpcn0gLW1pbmRlcHRoIDEgLW1heGRlcHRoIDIgLXR5cGUgZCAtZW1wdHkgLWV4ZWMgcm0gLWZyICd7fScgXDsKIyBub3cgcmVtb3ZlIG9sZCBvbmVzCmZpbmQgJHthcnRpZmFjdHNEaXJ9IC1taW5kZXB0aCAxIC1tYXhkZXB0aCAxIC10eXBlIGQgLWN0aW1lICskbmRheXMgLWV4ZWNkaXIgJHtCVUlMRF9IT01FfSR7UkVMRU5HX1RPT0xTfS9yZW1vdmVJZi5zaCAne30nIFw7CgphZnRlcj1gZmluZCAke2FydGlmYWN0c0Rpcn0gLW1pbmRlcHRoIDEgLW1heGRlcHRoIDEgfCB3YyAtbGA7CmVjaG8gIiAgICAgICAgICAgIG51bWJlciBvZiBkaXJlY3RvcmllcyBhZnRlciBjbGVhbmluZzogJHthZnRlcn0iOwplY2hvClBLAwQKAAAAAABvWAo/kRaNozILAAAyCwAAKgAAAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvVGVzdEFjdGl2YXRvci5jbGFzc8r+ur4AAAAxAH8HAAIBACRvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL1Rlc3RBY3RpdmF0b3IHAAQBABBqYXZhL2xhbmcvT2JqZWN0BwAGAQAib3JnL29zZ2kvZnJhbWV3b3JrL0J1bmRsZUFjdGl2YXRvcgEADVBJX1BST1ZfVEVTVFMBABJMamF2YS9sYW5nL1N0cmluZzsBAA1Db25zdGFudFZhbHVlCAALAQAbb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0AQAHY29udGV4dAEAIkxvcmcvb3NnaS9mcmFtZXdvcmsvQnVuZGxlQ29udGV4dDsBAAxwYWNrYWdlQWRtaW4BACxMb3JnL29zZ2kvc2VydmljZS9wYWNrYWdlYWRtaW4vUGFja2FnZUFkbWluOwEAD3BhY2thZ2VBZG1pblJlZgEAJUxvcmcvb3NnaS9mcmFtZXdvcmsvU2VydmljZVJlZmVyZW5jZTsBAA5URVNUX0RBVEFfUEFUSAEACDxjbGluaXQ+AQADKClWAQAEQ29kZQkAAQAXDAAOAA8JAAEAGQwAEAARCAAbAQAIdGVzdERhdGEJAAEAHQwAEgAIAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAGPGluaXQ+CgADACIMACAAFAEABHRoaXMBACZMb3JnL2VjbGlwc2UvanVuby90ZXN0cy9UZXN0QWN0aXZhdG9yOwEACmdldENvbnRleHQBACQoKUxvcmcvb3NnaS9mcmFtZXdvcmsvQnVuZGxlQ29udGV4dDsJAAEAKAwADAANAQAKZ2V0TG9nRmlsZQEAECgpTGphdmEvaW8vRmlsZTsHACwBACtvcmcvZWNsaXBzZS9vc2dpL2ZyYW1ld29yay9sb2cvRnJhbWV3b3JrTG9nCgAuADAHAC8BAA9qYXZhL2xhbmcvQ2xhc3MMADEAMgEAB2dldE5hbWUBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwoANAA2BwA1AQA6b3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9jb3JlL2hlbHBlcnMvU2VydmljZUhlbHBlcgwANwA4AQAKZ2V0U2VydmljZQEASChMb3JnL29zZ2kvZnJhbWV3b3JrL0J1bmRsZUNvbnRleHQ7TGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvT2JqZWN0OwsAKwA6DAA7ACoBAAdnZXRGaWxlAQADbG9nAQAtTG9yZy9lY2xpcHNlL29zZ2kvZnJhbWV3b3JrL2xvZy9GcmFtZXdvcmtMb2c7AQAFc3RhcnQBACUoTG9yZy9vc2dpL2ZyYW1ld29yay9CdW5kbGVDb250ZXh0OylWAQAKRXhjZXB0aW9ucwcAQgEAE2phdmEvbGFuZy9FeGNlcHRpb24HAEQBACpvcmcvb3NnaS9zZXJ2aWNlL3BhY2thZ2VhZG1pbi9QYWNrYWdlQWRtaW4LAEYASAcARwEAIG9yZy9vc2dpL2ZyYW1ld29yay9CdW5kbGVDb250ZXh0DABJAEoBABNnZXRTZXJ2aWNlUmVmZXJlbmNlAQA5KExqYXZhL2xhbmcvU3RyaW5nOylMb3JnL29zZ2kvZnJhbWV3b3JrL1NlcnZpY2VSZWZlcmVuY2U7CwBGAEwMADcATQEAOShMb3JnL29zZ2kvZnJhbWV3b3JrL1NlcnZpY2VSZWZlcmVuY2U7KUxqYXZhL2xhbmcvT2JqZWN0OwEABHN0b3ABABFnZXRUZXN0RGF0YUZvbGRlcgsARgBRDABSAFMBAAlnZXRCdW5kbGUBAB0oKUxvcmcvb3NnaS9mcmFtZXdvcmsvQnVuZGxlOwsAVQBXBwBWAQAZb3JnL29zZ2kvZnJhbWV3b3JrL0J1bmRsZQwAWABZAQAIZ2V0RW50cnkBACIoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL25ldC9VUkw7BwBbAQAMamF2YS9pby9GaWxlCgBdAF8HAF4BACRvcmcvZWNsaXBzZS9jb3JlL3J1bnRpbWUvRmlsZUxvY2F0b3IMAGAAYQEAB3Jlc29sdmUBAB4oTGphdmEvbmV0L1VSTDspTGphdmEvbmV0L1VSTDsKAGMAZQcAZAEADGphdmEvbmV0L1VSTAwAOwAyCgBaAGcMACAAaAEAFShMamF2YS9sYW5nL1N0cmluZzspVgcAagEAE2phdmEvaW8vSU9FeGNlcHRpb24BAAN1cmwBAA5MamF2YS9uZXQvVVJMOwEAAWUBABVMamF2YS9pby9JT0V4Y2VwdGlvbjsBAC8oTGphdmEvbGFuZy9TdHJpbmc7KUxvcmcvb3NnaS9mcmFtZXdvcmsvQnVuZGxlOwsAQwBxDAByAHMBAApnZXRCdW5kbGVzAQBCKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylbTG9yZy9vc2dpL2ZyYW1ld29yay9CdW5kbGU7CwBVAHUMAHYAdwEACGdldFN0YXRlAQADKClJAQAMc3ltYm9saWNOYW1lAQAHYnVuZGxlcwEAHFtMb3JnL29zZ2kvZnJhbWV3b3JrL0J1bmRsZTsBAAFpAQABSQEAClNvdXJjZUZpbGUBABJUZXN0QWN0aXZhdG9yLmphdmEAIQABAAMAAQAFAAUAGQAHAAgAAQAJAAAAAgAKAAkADAANAAAACgAOAA8AAAAKABAAEQAAAAkAEgAIAAAACAAIABMAFAABABUAAAA6AAEAAAAAAA4BswAWAbMAGBIaswAcsQAAAAIAHgAAABIABAAAAB0ABAAeAAgAHwANABoAHwAAAAIAAAABACAAFAABABUAAAAvAAEAAQAAAAUqtwAhsQAAAAIAHgAAAAYAAQAAABoAHwAAAAwAAQAAAAUAIwAkAAAACQAlACYAAQAVAAAAJAABAAAAAAAEsgAnsAAAAAIAHgAAAAYAAQAAACIAHwAAAAIAAAAJACkAKgABABUAAABMAAIAAQAAAB6yACcSK7YALbgAM8AAK0sqxwAHAacACSq5ADkBALAAAAACAB4AAAAKAAIAAAApAA8AKgAfAAAADAABAA8ADwA8AD0AAAABAD4APwACAEAAAAAEAAEAQQAVAAAAYgACAAIAAAAiK7MAJysSQ7YALbkARQIAswAYK7IAGLkASwIAwABDswAWsQAAAAIAHgAAABIABAAAAC4ABAAvABIAMAAhADEAHwAAABYAAgAAACIAIwAkAAAAAAAiAAwADQABAAEATgA/AAIAQAAAAAQAAQBBABUAAAA9AAEAAgAAAAUBswAnsQAAAAIAHgAAAAoAAgAAADQABAA1AB8AAAAWAAIAAAAFACMAJAAAAAAABQAMAA0AAQAJAE8AKgABABUAAABrAAMAAQAAACOyACe5AFABALIAHLkAVAIAS7sAWlkquABctgBitwBmsEsBsAABAAAAHwAgAGkAAgAeAAAAEgAEAAAAOQARADoAIAA8ACEAPQAfAAAAFgACABEADwBrAGwAAAAhAAIAbQBuAAAACQBSAG8AAQAVAAAAnAADAAMAAAA6sgAWxwAFAbCyABYqAbkAcAMATCvHAAUBsAM9pwAXKxwyuQB0AQAGfpoAByscMrCEAgEcK76h/+kBsAAAAAIAHgAAACoACgAAAEIABgBDAAgARQATAEYAFwBHABkASgAeAEsAKwBMAC8ASgA4AE8AHwAAACAAAwAAADoAeAAIAAAAEwAnAHkAegABABsAHQB7AHwAAgABAH0AAAACAH5QSwMECgAAAAAAfJ8JP+HSSBLwCwAA8AsAACkAAABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL1Rlc3RBY3RpdmF0b3IuamF2YS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAogKiAKICogIENvbnRyaWJ1dG9yczoKICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS5qdW5vLnRlc3RzOwoKaW1wb3J0IGphdmEuaW8uRmlsZTsKaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmltcG9ydCBqYXZhLm5ldC5VUkw7CgppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwppbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuU2VydmljZUhlbHBlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuZnJhbWV3b3JrLmxvZy5GcmFtZXdvcmtMb2c7CmltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwppbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvcjsKaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwppbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlNlcnZpY2VSZWZlcmVuY2U7CmltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnBhY2thZ2VhZG1pbi5QYWNrYWdlQWRtaW47CgpwdWJsaWMgY2xhc3MgVGVzdEFjdGl2YXRvciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7CiAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyAgICAgIFBJX1BST1ZfVEVTVFMgICA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3QiOwogICAgcHVibGljIHN0YXRpYyBCdW5kbGVDb250ZXh0ICAgICBjb250ZXh0OwogICAgcHJpdmF0ZSBzdGF0aWMgUGFja2FnZUFkbWluICAgICBwYWNrYWdlQWRtaW4gICAgPSBudWxsOwogICAgcHJpdmF0ZSBzdGF0aWMgU2VydmljZVJlZmVyZW5jZSBwYWNrYWdlQWRtaW5SZWYgPSBudWxsOwogICAgcHVibGljIHN0YXRpYyBTdHJpbmcgICAgICAgICAgICBURVNUX0RBVEFfUEFUSCAgPSAidGVzdERhdGEiOyAgICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkCgogICAgcHVibGljIHN0YXRpYyBCdW5kbGVDb250ZXh0IGdldENvbnRleHQoKSB7CiAgICAgICAgcmV0dXJuIGNvbnRleHQ7CiAgICB9CgogICAgLyoKICAgICAqIFJldHVybiBhIGZpbGUgaGFuZGxlIHRvIHRoZSBmcmFtZXdvcmsgbG9nIGZpbGUsIG9yIG51bGwgaWYgaXQgaXMgbm90IGF2YWlsYWJsZS4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBGaWxlIGdldExvZ0ZpbGUoKSB7CiAgICAgICAgRnJhbWV3b3JrTG9nIGxvZyA9IChGcmFtZXdvcmtMb2cpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShjb250ZXh0LCBGcmFtZXdvcmtMb2cuY2xhc3MuZ2V0TmFtZSgpKTsKICAgICAgICByZXR1cm4gbG9nID09IG51bGwgPyBudWxsIDogbG9nLmdldEZpbGUoKTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIFRlc3RBY3RpdmF0b3IuY29udGV4dCA9IGNvbnRleHQ7CiAgICAgICAgcGFja2FnZUFkbWluUmVmID0gY29udGV4dC5nZXRTZXJ2aWNlUmVmZXJlbmNlKFBhY2thZ2VBZG1pbi5jbGFzcy5nZXROYW1lKCkpOwogICAgICAgIHBhY2thZ2VBZG1pbiA9IChQYWNrYWdlQWRtaW4pIGNvbnRleHQuZ2V0U2VydmljZShwYWNrYWdlQWRtaW5SZWYpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBUZXN0QWN0aXZhdG9yLmNvbnRleHQgPSBudWxsOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgRmlsZSBnZXRUZXN0RGF0YUZvbGRlcigpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBVUkwgdXJsID0gY29udGV4dC5nZXRCdW5kbGUoKS5nZXRFbnRyeShUZXN0QWN0aXZhdG9yLlRFU1RfREFUQV9QQVRIKTsKICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlKEZpbGVMb2NhdG9yLnJlc29sdmUodXJsKS5nZXRGaWxlKCkpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBCdW5kbGUgZ2V0QnVuZGxlKFN0cmluZyBzeW1ib2xpY05hbWUpIHsKICAgICAgICBpZiAocGFja2FnZUFkbWluID09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIEJ1bmRsZVtdIGJ1bmRsZXMgPSBwYWNrYWdlQWRtaW4uZ2V0QnVuZGxlcyhzeW1ib2xpY05hbWUsIG51bGwpOwogICAgICAgIGlmIChidW5kbGVzID09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIC8vUmV0dXJuIHRoZSBmaXJzdCBidW5kbGUgdGhhdCBpcyBub3QgaW5zdGFsbGVkIG9yIHVuaW5zdGFsbGVkCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidW5kbGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmICgoYnVuZGxlc1tpXS5nZXRTdGF0ZSgpICYgKEJ1bmRsZS5JTlNUQUxMRUQgfCBCdW5kbGUuVU5JTlNUQUxMRUQpKSA9PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYnVuZGxlc1tpXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCn0KUEsDBAoAAAAAAG9YCj9ZNrP+gBMAAIATAAAxAAAAb3JnL2VjbGlwc2UvanVuby90ZXN0cy9SdW5BbGxSZXBvcnRzQW50VGFzay5jbGFzc8r+ur4AAAAxANAHAAIBACtvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL1J1bkFsbFJlcG9ydHNBbnRUYXNrBwAEAQAZb3JnL2FwYWNoZS90b29scy9hbnQvVGFzawEAEGRpcmVjdG9yeVRvQ2hlY2sBABJMamF2YS9sYW5nL1N0cmluZzsBAA50ZW1wV29ya2luZ0RpcgEAFm91dHB1dFJlc3VsdHNEaXJlY3RvcnkBABBmYWlsdXJlc09jY3VycmVkAQABWgEABjxpbml0PgEAAygpVgEABENvZGUKAAMADwwACwAMCQABABEMAAkACgEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBAC1Mb3JnL2VjbGlwc2UvanVuby90ZXN0cy9SdW5BbGxSZXBvcnRzQW50VGFzazsBAAdleGVjdXRlAQAKRXhjZXB0aW9ucwcAGQEAI29yZy9hcGFjaGUvdG9vbHMvYW50L0J1aWxkRXhjZXB0aW9uBwAbAQAXamF2YS9sYW5nL1N0cmluZ0J1aWxkZXIIAB0BAAdmaWxlOi8vCgAaAB8MAAsAIAEAFShMamF2YS9sYW5nL1N0cmluZzspVgoAAQAiDAAjACQBABNnZXREaXJlY3RvcnlUb0NoZWNrAQAUKClMamF2YS9sYW5nL1N0cmluZzsKABoAJgwAJwAoAQAGYXBwZW5kAQAtKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CgAaACoMACsAJAEACHRvU3RyaW5nBwAtAQAsb3JnL2VjbGlwc2UvanVuby90ZXN0cy9yZXBvcy9WZXJzaW9uQ2hlY2tpbmcKACwADwoALAAwDAAxACABABBzZXRSZXBvVVJMVG9UZXN0CgABADMMADQAJAEAGWdldE91dHB1dFJlc3VsdHNEaXJlY3RvcnkKACwANgwANwAgAQASc2V0T3V0cHV0RGlyZWN0b3J5CgAsADkMADoAOwEAE3Rlc3RWZXJzaW9uVW5pcW5lc3MBAAMoKVoKAAEAPQwAPgA/AQATc2V0RmFpbHVyZXNPY2N1cnJlZAEABChaKVYHAEEBACpvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3JlcG9zL0lVTmFtZUNoZWNrZXIKAEAADwoAQAAwCgBAADYKAEAARgwARwA7AQAQdGVzdEZlYXR1cmVOYW1lcwoAQABJDABKADsBAA90ZXN0QnVuZGxlTmFtZXMHAEwBADBvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3JlcG9zL1Byb3ZpZGVyTmFtZUNoZWNrZXIKAEsADwoASwAwCgBLADYKAEsAUQwAUgA7AQARdGVzdFByb3ZpZGVyTmFtZXMHAFQBADpvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3JlcG9zL0ZlYXR1cmVEaXNwbGF5YWJsZURhdGFDaGVja2VyCgBTAA8KAFMAMAoAUwA2CgBTAFkMAFoAOwEAE3Rlc3REaXNwbGF5YWJsZURhdGEHAFwBAC9vcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3JlcG9zL0ZlYXR1cmVOYW1lTGVuZ3RocwoAWwAPCgBbADAKAFsANgoAWwBhDABiAGMBABp0ZXN0RmVhdHVyZURpcmVjdG9yeUxlbmd0aAEAAygpSQoAGABlDAALAGYBABgoTGphdmEvbGFuZy9UaHJvd2FibGU7KVYHAGgBACJvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvRVNUZXN0CgBnAA8KAGcAawwAbAAgAQATc2V0RGlyZWN0b3J5VG9DaGVjawoAAQBuDABvACQBABFnZXRUZW1wV29ya2luZ0RpcgoAZwBxDAByACABABFzZXRUZW1wV29ya2luZ0RpcgoAZwA2CgBnAHUMAHYAOwEAEXRlc3RFU1NldHRpbmdSdWxlBwB4AQAkb3JnL2VjbGlwc2UvanVuby90ZXN0cy9qYXJzL0JSRUVUZXN0CgB3AA8KAHcAawoAdwBxCgB3ADYKAHcAfgwAfwA7AQATdGVzdEJSRUVTZXR0aW5nUnVsZQcAgQEAJ29yZy9lY2xpcHNlL2p1bm8vdGVzdHMvamFycy9QYWNrMjAwVGVzdAoAgAAPCgCAAGsKAIAANgoAgACGDACHADsBAA50ZXN0QnVuZGxlUGFjawcAiQEAJ29yZy9lY2xpcHNlL2p1bm8vdGVzdHMvamFycy9WZXJzaW9uVGVzdAoAiAAPCgCIAGsKAIgANgoAiACODACPADsBABR0ZXN0VmVyc2lvbnNQYXR0ZXJucwcAkQEAKm9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvamFycy9UZXN0TGF5b3V0VGVzdAoAkAAPCgCQAGsKAJAAcQoAkAA2CgCQAJcMAJgAOwEACnRlc3RMYXlvdXQHAJoBAC5vcmcvZWNsaXBzZS9lcXVpbm94L3AyL2NvcmUvUHJvdmlzaW9uRXhjZXB0aW9uBwCcAQAzb3JnL2VjbGlwc2UvY29yZS9ydW50aW1lL09wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uBwCeAQAbamF2YS9uZXQvVVJJU3ludGF4RXhjZXB0aW9uBwCgAQATamF2YS9pby9JT0V4Y2VwdGlvbgEACnJlcG9Ub1Rlc3QBAA91bmlxdWVuZXNzQ2hlY2sBABNmZWF0dXJlTmFtZUZhaWx1cmVzAQASYnVuZGxlTmFtZUZhaWx1cmVzAQAUcHJvdmlkZXJOYW1lc0ZhaWx1cmUBABlsaWNlbnNlQ29uc2lzdGVuY3lGYWlsdXJlAQARdW5pcXVlbmVzc0NoZWNrZXIBAC5Mb3JnL2VjbGlwc2UvanVuby90ZXN0cy9yZXBvcy9WZXJzaW9uQ2hlY2tpbmc7AQAHaXVOYW1lcwEALExvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3JlcG9zL0lVTmFtZUNoZWNrZXI7AQATcHJvdmlkZXJOYW1lQ2hlY2tlcgEAMkxvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3JlcG9zL1Byb3ZpZGVyTmFtZUNoZWNrZXI7AQAObGljZW5zZUNoZWNrZXIBADxMb3JnL2VjbGlwc2UvanVuby90ZXN0cy9yZXBvcy9GZWF0dXJlRGlzcGxheWFibGVEYXRhQ2hlY2tlcjsBABJmZWF0dXJlTmFtZUxlbmd0aHMBADFMb3JnL2VjbGlwc2UvanVuby90ZXN0cy9yZXBvcy9GZWF0dXJlTmFtZUxlbmd0aHM7AQABZQEAMExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL2NvcmUvUHJvdmlzaW9uRXhjZXB0aW9uOwEANUxvcmcvZWNsaXBzZS9jb3JlL3J1bnRpbWUvT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247AQAdTGphdmEvbmV0L1VSSVN5bnRheEV4Y2VwdGlvbjsBAAZlc1Rlc3QBACRMb3JnL2VjbGlwc2UvanVuby90ZXN0cy9qYXJzL0VTVGVzdDsBAAplc0ZhaWx1cmVzAQAIYnJlZVRlc3QBACZMb3JnL2VjbGlwc2UvanVuby90ZXN0cy9qYXJzL0JSRUVUZXN0OwEADGJyZWVGYWlsdXJlcwEACHBhY2tUZXN0AQApTG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvamFycy9QYWNrMjAwVGVzdDsBAAxwYWNrRmFpbHVyZXMBAAt2ZXJzaW9uVGVzdAEAKUxvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvVmVyc2lvblRlc3Q7AQAMdmVyc2lvbkNoZWNrAQAEdGVzdAEALExvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvVGVzdExheW91dFRlc3Q7AQAObGF5b3V0RmFpbHVyZXMBABVMamF2YS9pby9JT0V4Y2VwdGlvbjsJAAEAxgwABQAGAQAQYnVuZGxlRGlyVG9DaGVjawkAAQDJDAAHAAYBABJpc0ZhaWx1cmVzT2NjdXJyZWQJAAEAzAwACAAGAQAZc2V0T3V0cHV0UmVzdWx0c0RpcmVjdG9yeQEAClNvdXJjZUZpbGUBABlSdW5BbGxSZXBvcnRzQW50VGFzay5qYXZhACEAAQADAAAABAACAAUABgAAAAIABwAGAAAAAgAIAAYAAAACAAkACgAAAAoAAQAL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oAk/6heqqQ4ZAAAOGQAAMAAAAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvUnVuQWxsUmVwb3J0c0FudFRhc2suamF2YXBhY2thZ2Ugb3JnLmVjbGlwc2UuanVuby50ZXN0czsKCmltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwppbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwoKaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwppbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247CmltcG9ydCBvcmcuZWNsaXBzZS5qdW5vLnRlc3RzLmphcnMuQlJFRVRlc3Q7CmltcG9ydCBvcmcuZWNsaXBzZS5qdW5vLnRlc3RzLmphcnMuRVNUZXN0OwppbXBvcnQgb3JnLmVjbGlwc2UuanVuby50ZXN0cy5qYXJzLlBhY2syMDBUZXN0OwppbXBvcnQgb3JnLmVjbGlwc2UuanVuby50ZXN0cy5qYXJzLlRlc3RMYXlvdXRUZXN0OwppbXBvcnQgb3JnLmVjbGlwc2UuanVuby50ZXN0cy5qYXJzLlZlcnNpb25UZXN0OwppbXBvcnQgb3JnLmVjbGlwc2UuanVuby50ZXN0cy5yZXBvcy5GZWF0dXJlRGlzcGxheWFibGVEYXRhQ2hlY2tlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmp1bm8udGVzdHMucmVwb3MuRmVhdHVyZU5hbWVMZW5ndGhzOwppbXBvcnQgb3JnLmVjbGlwc2UuanVuby50ZXN0cy5yZXBvcy5JVU5hbWVDaGVja2VyOwppbXBvcnQgb3JnLmVjbGlwc2UuanVuby50ZXN0cy5yZXBvcy5Qcm92aWRlck5hbWVDaGVja2VyOwppbXBvcnQgb3JnLmVjbGlwc2UuanVuby50ZXN0cy5yZXBvcy5WZXJzaW9uQ2hlY2tpbmc7CgpwdWJsaWMgY2xhc3MgUnVuQWxsUmVwb3J0c0FudFRhc2sgZXh0ZW5kcyBUYXNrIHsKCiAgICBwcml2YXRlIFN0cmluZyAgZGlyZWN0b3J5VG9DaGVjazsKICAgIHByaXZhdGUgU3RyaW5nICB0ZW1wV29ya2luZ0RpcjsKICAgIHByaXZhdGUgU3RyaW5nICBvdXRwdXRSZXN1bHRzRGlyZWN0b3J5OwogICAgcHJpdmF0ZSBib29sZWFuIGZhaWx1cmVzT2NjdXJyZWQgPSBmYWxzZTsKCiAgICBAT3ZlcnJpZGUKICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewoKICAgICAgICB0cnkgewoKCiAgICAgICAgICAgIFN0cmluZyByZXBvVG9UZXN0ID0gImZpbGU6Ly8iICsgZ2V0RGlyZWN0b3J5VG9DaGVjaygpOwoKICAgICAgICAgICAgYm9vbGVhbiB1bmlxdWVuZXNzQ2hlY2sgPSBmYWxzZTsKICAgICAgICAgICAgYm9vbGVhbiBmZWF0dXJlTmFtZUZhaWx1cmVzID0gZmFsc2U7CiAgICAgICAgICAgIGJvb2xlYW4gYnVuZGxlTmFtZUZhaWx1cmVzID0gZmFsc2U7CiAgICAgICAgICAgIGJvb2xlYW4gcHJvdmlkZXJOYW1lc0ZhaWx1cmUgPSBmYWxzZTsKICAgICAgICAgICAgYm9vbGVhbiBsaWNlbnNlQ29uc2lzdGVuY3lGYWlsdXJlID0gZmFsc2U7CiAgICAgICAgICAgIHRyeSB7CgogICAgICAgICAgICAgICAgVmVyc2lvbkNoZWNraW5nIHVuaXF1ZW5lc3NDaGVja2VyID0gbmV3IFZlcnNpb25DaGVja2luZygpOwogICAgICAgICAgICAgICAgdW5pcXVlbmVzc0NoZWNrZXIuc2V0UmVwb1VSTFRvVGVzdChyZXBvVG9UZXN0KTsKICAgICAgICAgICAgICAgIHVuaXF1ZW5lc3NDaGVja2VyLnNldE91dHB1dERpcmVjdG9yeShnZXRPdXRwdXRSZXN1bHRzRGlyZWN0b3J5KCkpOwogICAgICAgICAgICAgICAgdW5pcXVlbmVzc0NoZWNrID0gdW5pcXVlbmVzc0NoZWNrZXIudGVzdFZlcnNpb25VbmlxbmVzcygpOwogICAgICAgICAgICAgICAgaWYgKHVuaXF1ZW5lc3NDaGVjaykgewogICAgICAgICAgICAgICAgICAgIHNldEZhaWx1cmVzT2NjdXJyZWQodHJ1ZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgSVVOYW1lQ2hlY2tlciBpdU5hbWVzID0gbmV3IElVTmFtZUNoZWNrZXIoKTsKICAgICAgICAgICAgICAgIGl1TmFtZXMuc2V0UmVwb1VSTFRvVGVzdChyZXBvVG9UZXN0KTsKICAgICAgICAgICAgICAgIGl1TmFtZXMuc2V0T3V0cHV0RGlyZWN0b3J5KGdldE91dHB1dFJlc3VsdHNEaXJlY3RvcnkoKSk7CiAgICAgICAgICAgICAgICBmZWF0dXJlTmFtZUZhaWx1cmVzID0gaXVOYW1lcy50ZXN0RmVhdHVyZU5hbWVzKCk7CiAgICAgICAgICAgICAgICBidW5kbGVOYW1lRmFpbHVyZXMgPSBpdU5hbWVzLnRlc3RCdW5kbGVOYW1lcygpOwoKICAgICAgICAgICAgICAgIFByb3ZpZGVyTmFtZUNoZWNrZXIgcHJvdmlkZXJOYW1lQ2hlY2tlciA9IG5ldyBQcm92aWRlck5hbWVDaGVja2VyKCk7CiAgICAgICAgICAgICAgICBwcm92aWRlck5hbWVDaGVja2VyLnNldFJlcG9VUkxUb1Rlc3QocmVwb1RvVGVzdCk7CiAgICAgICAgICAgICAgICBwcm92aWRlck5hbWVDaGVja2VyLnNldE91dHB1dERpcmVjdG9yeShnZXRPdXRwdXRSZXN1bHRzRGlyZWN0b3J5KCkpOwogICAgICAgICAgICAgICAgcHJvdmlkZXJOYW1lc0ZhaWx1cmUgPSBwcm92aWRlck5hbWVDaGVja2VyLnRlc3RQcm92aWRlck5hbWVzKCk7CgogICAgICAgICAgICAgICAgRmVhdHVyZURpc3BsYXlhYmxlRGF0YUNoZWNrZXIgbGljZW5zZUNoZWNrZXIgPSBuZXcgRmVhdHVyZURpc3BsYXlhYmxlRGF0YUNoZWNrZXIoKTsKICAgICAgICAgICAgICAgIGxpY2Vuc2VDaGVja2VyLnNldFJlcG9VUkxUb1Rlc3QocmVwb1RvVGVzdCk7CiAgICAgICAgICAgICAgICBsaWNlbnNlQ2hlY2tlci5zZXRPdXRwdXREaXJlY3RvcnkoZ2V0T3V0cHV0UmVzdWx0c0RpcmVjdG9yeSgpKTsKICAgICAgICAgICAgICAgIGxpY2Vuc2VDb25zaXN0ZW5jeUZhaWx1cmUgPSBsaWNlbnNlQ2hlY2tlci50ZXN0RGlzcGxheWFibGVEYXRhKCk7CgogICAgICAgICAgICAgICAgRmVhdHVyZU5hbWVMZW5ndGhzIGZlYXR1cmVOYW1lTGVuZ3RocyA9IG5ldyBGZWF0dXJlTmFtZUxlbmd0aHMoKTsKICAgICAgICAgICAgICAgIGZlYXR1cmVOYW1lTGVuZ3Rocy5zZXRSZXBvVVJMVG9UZXN0KHJlcG9Ub1Rlc3QpOwogICAgICAgICAgICAgICAgZmVhdHVyZU5hbWVMZW5ndGhzLnNldE91dHB1dERpcmVjdG9yeShnZXRPdXRwdXRSZXN1bHRzRGlyZWN0b3J5KCkpOwogICAgICAgICAgICAgICAgZmVhdHVyZU5hbWVMZW5ndGhzLnRlc3RGZWF0dXJlRGlyZWN0b3J5TGVuZ3RoKCk7CgogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChmZWF0dXJlTmFtZUZhaWx1cmVzIHx8IGJ1bmRsZU5hbWVGYWlsdXJlcyB8fCBwcm92aWRlck5hbWVzRmFpbHVyZSB8fCBsaWNlbnNlQ29uc2lzdGVuY3lGYWlsdXJlKSB7CiAgICAgICAgICAgICAgICBzZXRGYWlsdXJlc09jY3VycmVkKHRydWUpOwogICAgICAgICAgICB9CgoKICAgICAgICAgICAgRVNUZXN0IGVzVGVzdCA9IG5ldyBFU1Rlc3QoKTsKICAgICAgICAgICAgZXNUZXN0LnNldERpcmVjdG9yeVRvQ2hlY2soZ2V0RGlyZWN0b3J5VG9DaGVjaygpKTsKICAgICAgICAgICAgZXNUZXN0LnNldFRlbXBXb3JraW5nRGlyKGdldFRlbXBXb3JraW5nRGlyKCkpOwogICAgICAgICAgICBlc1Rlc3Quc2V0T3V0cHV0RGlyZWN0b3J5KGdldE91dHB1dFJlc3VsdHNEaXJlY3RvcnkoKSk7CgogICAgICAgICAgICBib29sZWFuIGVzRmFpbHVyZXMgPSBlc1Rlc3QudGVzdEVTU2V0dGluZ1J1bGUoKTsKCiAgICAgICAgICAgIGlmIChlc0ZhaWx1cmVzKSB7CiAgICAgICAgICAgICAgICBzZXRGYWlsdXJlc09jY3VycmVkKHRydWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBCUkVFVGVzdCBicmVlVGVzdCA9IG5ldyBCUkVFVGVzdCgpOwogICAgICAgICAgICBicmVlVGVzdC5zZXREaXJlY3RvcnlUb0NoZWNrKGdldERpcmVjdG9yeVRvQ2hlY2soKSk7CiAgICAgICAgICAgIGJyZWVUZXN0LnNldFRlbXBXb3JraW5nRGlyKGdldFRlbXBXb3JraW5nRGlyKCkpOwogICAgICAgICAgICBicmVlVGVzdC5zZXRPdXRwdXREaXJlY3RvcnkoZ2V0T3V0cHV0UmVzdWx0c0RpcmVjdG9yeSgpKTsKCiAgICAgICAgICAgIGJvb2xlYW4gYnJlZUZhaWx1cmVzID0gYnJlZVRlc3QudGVzdEJSRUVTZXR0aW5nUnVsZSgpOwoKICAgICAgICAgICAgaWYgKGJyZWVGYWlsdXJlcykgewogICAgICAgICAgICAgICAgc2V0RmFpbHVyZXNPY2N1cnJlZCh0cnVlKTsKICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIFBhY2syMDBUZXN0IHBhY2tUZXN0ID0gbmV3IFBhY2syMDBUZXN0KCk7CiAgICAgICAgICAgIHBhY2tUZXN0LnNldERpcmVjdG9yeVRvQ2hlY2soZ2V0RGlyZWN0b3J5VG9DaGVjaygpKTsKICAgICAgICAgICAgcGFja1Rlc3Quc2V0T3V0cHV0RGlyZWN0b3J5KGdldE91dHB1dFJlc3VsdHNEaXJlY3RvcnkoKSk7CiAgICAgICAgICAgIGJvb2xlYW4gcGFja0ZhaWx1cmVzID0gcGFja1Rlc3QudGVzdEJ1bmRsZVBhY2soKTsKICAgICAgICAgICAgaWYgKHBhY2tGYWlsdXJlcykgewogICAgICAgICAgICAgICAgc2V0RmFpbHVyZXNPY2N1cnJlZCh0cnVlKTsKICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIFZlcnNpb25UZXN0IHZlcnNpb25UZXN0ID0gbmV3IFZlcnNpb25UZXN0KCk7CiAgICAgICAgICAgIHZlcnNpb25UZXN0LnNldERpcmVjdG9yeVRvQ2hlY2soZ2V0RGlyZWN0b3J5VG9DaGVjaygpKTsKICAgICAgICAgICAgdmVyc2lvblRlc3Quc2V0T3V0cHV0RGlyZWN0b3J5KGdldE91dHB1dFJlc3VsdHNEaXJlY3RvcnkoKSk7CiAgICAgICAgICAgIGJvb2xlYW4gdmVyc2lvbkNoZWNrID0gdmVyc2lvblRlc3QudGVzdFZlcnNpb25zUGF0dGVybnMoKTsKICAgICAgICAgICAgaWYgKHZlcnNpb25DaGVjaykgewogICAgICAgICAgICAgICAgc2V0RmFpbHVyZXNPY2N1cnJlZCh0cnVlKTsKICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIFRlc3RMYXlvdXRUZXN0IHRlc3QgPSBuZXcgVGVzdExheW91dFRlc3QoKTsKICAgICAgICAgICAgdGVzdC5zZXREaXJlY3RvcnlUb0NoZWNrKGdldERpcmVjdG9yeVRvQ2hlY2soKSk7CiAgICAgICAgICAgIHRlc3Quc2V0VGVtcFdvcmtpbmdEaXIoZ2V0VGVtcFdvcmtpbmdEaXIoKSk7CiAgICAgICAgICAgIHRlc3Quc2V0T3V0cHV0RGlyZWN0b3J5KGdldE91dHB1dFJlc3VsdHNEaXJlY3RvcnkoKSk7CiAgICAgICAgICAgIGJvb2xlYW4gbGF5b3V0RmFpbHVyZXMgPSB0ZXN0LnRlc3RMYXlvdXQoKTsKICAgICAgICAgICAgaWYgKGxheW91dEZhaWx1cmVzKSB7CiAgICAgICAgICAgICAgICBzZXRGYWlsdXJlc09jY3VycmVkKHRydWUpOwogICAgICAgICAgICB9CgogICAgICAgIH0KICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7CiAgICAgICAgfQogICAgfQoKICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlyZWN0b3J5VG9DaGVjaygpIHsKICAgICAgICByZXR1cm4gZGlyZWN0b3J5VG9DaGVjazsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBzZXREaXJlY3RvcnlUb0NoZWNrKFN0cmluZyBidW5kbGVEaXJUb0NoZWNrKSB7CiAgICAgICAgdGhpcy5kaXJlY3RvcnlUb0NoZWNrID0gYnVuZGxlRGlyVG9DaGVjazsKICAgIH0KCiAgICBwdWJsaWMgU3RyaW5nIGdldFRlbXBXb3JraW5nRGlyKCkgewogICAgICAgIHJldHVybiB0ZW1wV29ya2luZ0RpcjsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBzZXRUZW1wV29ya2luZ0RpcihTdHJpbmcgdGVtcFdvcmtpbmdEaXIpIHsKICAgICAgICB0aGlzLnRlbXBXb3JraW5nRGlyID0gdGVtcFdvcmtpbmdEaXI7CiAgICB9CgogICAgcHVibGljIGJvb2xlYW4gaXNGYWlsdXJlc09jY3VycmVkKCkgewogICAgICAgIHJldHVybiBmYWlsdXJlc09jY3VycmVkOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHNldEZhaWx1cmVzT2NjdXJyZWQoYm9vbGVhbiBmYWlsdXJlc09jY3VycmVkKSB7CiAgICAgICAgdGhpcy5mYWlsdXJlc09jY3VycmVkID0gZmFpbHVyZXNPY2N1cnJlZDsKICAgIH0KCiAgICBwdWJsaWMgU3RyaW5nIGdldE91dHB1dFJlc3VsdHNEaXJlY3RvcnkoKSB7CiAgICAgICAgcmV0dXJuIG91dHB1dFJlc3VsdHNEaXJlY3Rvcnk7CiAgICB9CgogICAgcHVibGljIHZvaWQgc2V0T3V0cHV0UmVzdWx0c0RpcmVjdG9yeShTdHJpbmcgb3V0cHV0UmVzdWx0c0RpcmVjdG9yeSkgewogICAgICAgIHRoaXMub3V0cHV0UmVzdWx0c0RpcmVjdG9yeSA9IG91dHB1dFJlc3VsdHNEaXJlY3Rvcnk7CiAgICB9Cgp9ClBLAwQKAAAAAABFXgo/hMYnj2EDAABhAwAANwAAAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvamFycy9CUkVFVGVzdCRCUkVFRmlsZURhdGEuY2xhc3PK/rq+AAAAMQApBwACAQAxb3JnL2VjbGlwc2UvanVuby90ZXN0cy9qYXJzL0JSRUVUZXN0JEJSRUVGaWxlRGF0YQcABAEAEGphdmEvbGFuZy9PYmplY3QHAAYBABRqYXZhL2xhbmcvQ29tcGFyYWJsZQEACGZpbGVuYW1lAQASTGphdmEvbGFuZy9TdHJpbmc7AQAJYnJlZVZhbHVlAQAGPGluaXQ+AQAnKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylWAQAEQ29kZQoAAwAODAAKAA8BAAMoKVYJAAEAEQwABwAICQABABMMAAkACAEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBADNMb3JnL2VjbGlwc2UvanVuby90ZXN0cy9qYXJzL0JSRUVUZXN0JEJSRUVGaWxlRGF0YTsBAAljb21wYXJlVG8BABUoTGphdmEvbGFuZy9PYmplY3Q7KUkKABsAHQcAHAEAEGphdmEvbGFuZy9TdHJpbmcMABgAHgEAFShMamF2YS9sYW5nL1N0cmluZzspSQEAAW8BABJMamF2YS9sYW5nL09iamVjdDsBAAZyZXN1bHQBAAFJAQAKU291cmNlRmlsZQEADUJSRUVUZXN0LmphdmEBAAxJbm5lckNsYXNzZXMHACcBACRvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvQlJFRVRlc3QBAAxCUkVFRmlsZURhdGEAIAABAAMAAQAFAAIAAAAHAAgAAAAAAAkACAAAAAIAAQAKAAsAAQAMAAAAWQACAAMAAAAPKrcADSortQAQKiy1ABKxAAAAAgAUAAAAEgAEAAAAMQAEADIACQAzAA4ANAAVAAAAIAADAAAADwAWABcAAAAAAA8ABwAIAAEAAAAPAAkACAACAAEAGAAZAAEADAAAAG4AAgADAAAAJCq0ABIrwAABtAAStgAaPRyaABIqtAAQK8AAAbQAELYAGj0crAAAAAIAFAAAABIABAAAADgADwA5ABMAOgAiADwAFQAAACAAAwAAACQAFgAXAAAAAAAkAB8AIAABAA8AFQAhACIAAgACACMAAAACACQAJQAAAAoAAQABACYAKAAIUEsDBAoAAAAAAEVeCj/i7pZUmywAAJssAAAqAAAAb3JnL2VjbGlwc2UvanVuby90ZXN0cy9qYXJzL0JSRUVUZXN0LmNsYXNzyv66vgAAADEB5wcAAgEAJG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvamFycy9CUkVFVGVzdAcABAEAJG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvamFycy9UZXN0SmFycwEADm91dHB1dEZpbGVuYW1lAQASTGphdmEvbGFuZy9TdHJpbmc7AQANQ29uc3RhbnRWYWx1ZQgACQEADGJyZWVkYXRhLnR4dAEALlBST1BFUlRZX0JVTkRMRV9SRVFVSVJFRF9FWEVDVVRJT05fRU5WSVJPTk1FTlQIAAwBACNCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudAEACm5hbWVQYXJzZXIBADBMb3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9GdWxsSmFyTmFtZVBhcnNlcjsBAAg8Y2xpbml0PgEAAygpVgEABENvZGUHABMBAC5vcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL0Z1bGxKYXJOYW1lUGFyc2VyCgASABUMABYAEAEABjxpbml0PgkAAQAYDAANAA4BAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUKAAMAFQEABHRoaXMBACZMb3JnL2VjbGlwc2UvanVuby90ZXN0cy9qYXJzL0JSRUVUZXN0OwEABG1haW4BABYoW0xqYXZhL2xhbmcvU3RyaW5nOylWCgABABUIACIBABcvaG9tZS9maWxlcy90ZXN0U0RLUmVwbwoAAQAkDAAlACYBABNzZXREaXJlY3RvcnlUb0NoZWNrAQAVKExqYXZhL2xhbmcvU3RyaW5nOylWCgABACgMACkAKgEAE3Rlc3RCUkVFU2V0dGluZ1J1bGUBAAMoKVoKACwALgcALQEAE2phdmEvaW8vSU9FeGNlcHRpb24MAC8AEAEAD3ByaW50U3RhY2tUcmFjZQEABGFyZ3MBABNbTGphdmEvbGFuZy9TdHJpbmc7AQAKdGVzdGxheW91dAEAAWUBABVMamF2YS9pby9JT0V4Y2VwdGlvbjsBAApFeGNlcHRpb25zCgABADcMADgAOQEAE2dldERpcmVjdG9yeVRvQ2hlY2sBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwcAOwEAI29yZy9hcGFjaGUvdG9vbHMvYW50L0J1aWxkRXhjZXB0aW9uCAA9AQAtTmVlZCB0byBzZXQgaW5wdXQgZGlyZWN0b3J5IHRvIGNoZWNrIGFnYWluc3QuCgA6AD8MABYAJgcAQQEADGphdmEvaW8vRmlsZQoAAQBDDABEADkBABJnZXRCdW5kbGVEaXJlY3RvcnkKAEAAPwoAQABHDABIACoBAAZleGlzdHMKAEAASgwASwAqAQALaXNEaXJlY3RvcnkHAE0BABdqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcggATwEAEmJ1bmRsZSBkaXJlY3RvcnkgKAoATAA/CgBMAFIMAFMAVAEABmFwcGVuZAEALShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwgAVgEAICkgbXVzdCBiZSBhbiBleGlzdGluZyBkaXJlY3RvcnkuCgBMAFgMAFkAOQEACHRvU3RyaW5nCgABAFsMAFwAXQEAD2NoZWNrQnVuZGxlQlJFRQEAEShMamF2YS9pby9GaWxlOylaAQAIcHJvcGVydHkBAAhpbnB1dGRpcgEADkxqYXZhL2lvL0ZpbGU7AQAPZmFpbHVyZXNPY2N1cmVkAQABWgoAZABmBwBlAQAQamF2YS9sYW5nL09iamVjdAwAZwBoAQAIZ2V0Q2xhc3MBABMoKUxqYXZhL2xhbmcvQ2xhc3M7CABqAQAVZXhjZXB0aW9ucy5wcm9wZXJ0aWVzCgBsAG4HAG0BAA9qYXZhL2xhbmcvQ2xhc3MMAG8AcAEAE2dldFJlc291cmNlQXNTdHJlYW0BACkoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2lvL0lucHV0U3RyZWFtOwcAcgEAFGphdmEvdXRpbC9Qcm9wZXJ0aWVzCgBxABUIAHUBAAAKAHEAdwwAeAB5AQAEbG9hZAEAGChMamF2YS9pby9JbnB1dFN0cmVhbTspVggAewEADmJyZWVFeGNlcHRpb25zCgBxAH0MAH4AfwEAC2dldFByb3BlcnR5AQAmKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZzsKAIEAgwcAggEAE2phdmEvaW8vSW5wdXRTdHJlYW0MAIQAEAEABWNsb3NlBwCGAQARamF2YS91dGlsL0hhc2hNYXAKAIUAFQcAiQEAE2phdmEvdXRpbC9BcnJheUxpc3QKAIgAFQcAjAEALm9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvSkFSRmlsZU5hbWVGaWx0ZXIKAIsAFQoAQACPDACQAJEBAAlsaXN0RmlsZXMBACkoTGphdmEvaW8vRmlsZW5hbWVGaWx0ZXI7KVtMamF2YS9pby9GaWxlOwoAQACTDACUADkBAAdnZXROYW1lCgABAJYMAJcAfwEADWdldEJ1bmRsZU5hbWUKAJkAmwcAmgEAEGphdmEvbGFuZy9TdHJpbmcMAJwAnQEACGNvbnRhaW5zAQAbKExqYXZhL2xhbmcvQ2hhclNlcXVlbmNlOylaCgABAJ8MAKAAoQEADmdldEJSRUVGcm9tSkFSAQAiKExqYXZhL2lvL0ZpbGU7KUxqYXZhL2xhbmcvU3RyaW5nOwoAmQCjDACkAKUBAAZsZW5ndGgBAAMoKUkKAAEApwwAqABdAQAMY29udGFpbnNKYXZhCgABAKoMAKsArAEAD2luY3JlbWVudENvdW50cwEAJChMamF2YS91dGlsL01hcDtMamF2YS9sYW5nL1N0cmluZzspVgoAAQCuDACvALABABR0cmFja0ZhbHNlSW5jbHVzaW9ucwEAMyhMamF2YS91dGlsL0xpc3Q7TGphdmEvaW8vRmlsZTtMamF2YS9sYW5nL1N0cmluZzspVgoAAQCyDACzALQBAA50cmFja09taXNzaW9ucwEAIShMamF2YS91dGlsL0xpc3Q7TGphdmEvaW8vRmlsZTspVgoAAQC2DAC3ALgBAAtwcmludHJlcG9ydAEANShMamF2YS91dGlsL01hcDtMamF2YS91dGlsL0xpc3Q7TGphdmEvdXRpbC9MaXN0O0lJSSlWAQAOcHJvcGVydHlTdHJlYW0BABVMamF2YS9pby9JbnB1dFN0cmVhbTsBABdicmVlRXhjZXB0aW9uUHJvcGVydGllcwEAFkxqYXZhL3V0aWwvUHJvcGVydGllczsBAAxqYXZhV2l0aEJyZWUBAA9MamF2YS91dGlsL01hcDsBAA9ub25qYXZhV2l0aEJyZWUBABBMamF2YS91dGlsL0xpc3Q7AQAPamF2YVdpdGhvdXRCcmVlAQANbm9uSmF2YU5vQlJFRQEAAUkBAAhjaGlsZHJlbgEAD1tMamF2YS9pby9GaWxlOwEACXRvdGFsc2l6ZQEAB2NoZWNrZWQBAAFpAQAFY2hpbGQBAARuYW1lAQAKYnVuZGxlTmFtZQEABGJyZWUHAM4BAClvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL1JlcG9ydFdyaXRlcgoAAQDQDADRADkBABJnZXRPdXRwdXREaXJlY3RvcnkKAM0A0wwAFgDUAQAnKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylWCgDNANYMANcAEAEAB3dyaXRlbG4IANkBABYgICBEaXJlY3RvcnkgY2hlY2tlZDogCgDNANsMANcAJggA3QEACyAgIENoZWNrZWQgCgBMAN8MAFMA4AEAHChJKUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsIAOIBAAQgb2YgCADkAQAGIGphcnMuCADmAQBNICBCdW5kbGVzIHdpdGggYXBwcm9wcmlhdGUgdXNlIG9mIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50IChCUkVFKToIAOgBABMgICBKYXZhIHdpdGggQlJFRTogCgABAOoMAOsA7AEACnRvdGFsQ291bnQBABIoTGphdmEvdXRpbC9NYXA7KUkIAO4BABkgICBOb24gSmF2YSB3aXRob3V0IEJSRUU6CADwAQApICAgRGlzdHJpYnV0aW9uIG9mIEJSRUVzIGluIEphdmEgQnVuZGxlcyALAPIA9AcA8wEADWphdmEvdXRpbC9NYXAMAPUA9gEABmtleVNldAEAESgpTGphdmEvdXRpbC9TZXQ7CgCIAPgMABYA+QEAGShMamF2YS91dGlsL0NvbGxlY3Rpb247KVYKAPsA/QcA/AEAFWphdmEvdXRpbC9Db2xsZWN0aW9ucwwA/gD/AQAEc29ydAEAEyhMamF2YS91dGlsL0xpc3Q7KVYLAQEBAwcBAgEADmphdmEvdXRpbC9MaXN0DAEEAQUBAAhpdGVyYXRvcgEAFigpTGphdmEvdXRpbC9JdGVyYXRvcjsLAQcBCQcBCAEAEmphdmEvdXRpbC9JdGVyYXRvcgwBCgELAQAEbmV4dAEAFCgpTGphdmEvbGFuZy9PYmplY3Q7CwDyAQ0MAQ4BDwEAA2dldAEAJihMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7BwERAQARamF2YS9sYW5nL0ludGVnZXIIARMBAAkJCSU1ZAklcwoKARABFQwBFgClAQAIaW50VmFsdWUKARABGAwBGQEaAQAHdmFsdWVPZgEAFihJKUxqYXZhL2xhbmcvSW50ZWdlcjsKAM0BHAwBHQEeAQAGcHJpbnRmAQAoKExqYXZhL2xhbmcvU3RyaW5nO1tMamF2YS9sYW5nL09iamVjdDspVgsBBwEgDAEhACoBAAdoYXNOZXh0CAEjAQA3ICBCdW5kbGVzIHdpdGggcXVlc3Rpb25hYmxlIGFic2VuY2Ugb3IgcHJlc2VuY2Ugb2YgQlJFRQgBJQEAISAgICBKYXZhIEJ1bmRsZXMgd2l0aG91dCBhIEJSRUU6IAsBAQEnDAEoAKUBAARzaXplCAEqAQAHICAgICAgIAoATAEsDABTAS0BAC0oTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsIAS8BACIgICAgTm9uIEphdmEgQnVuZGxlcyB3aXRoIGEgQlJFRTogBwExAQAxb3JnL2VjbGlwc2UvanVuby90ZXN0cy9qYXJzL0JSRUVUZXN0JEJSRUVGaWxlRGF0YQgBMwEACCUyNHMJJXMKCQEwATUMATYABgEACWJyZWVWYWx1ZQkBMAE4DAE5AAYBAAhmaWxlbmFtZQcBOwEAD2phdmEvbGFuZy9FcnJvcggBPQEAElByb2dyYW1taW5nIGVycm9yLgoBOgA/CgDNAIMBAAxyZXBvcnRXcml0ZXIBACtMb3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9SZXBvcnRXcml0ZXI7AQAIYWxsQlJFRXMBAA9MamF2YS91dGlsL1NldDsBAAthbGxCUkVFTGlzdAEABm9iamVjdAEAEkxqYXZhL2xhbmcvT2JqZWN0OwEABWNvdW50AQATTGphdmEvbGFuZy9JbnRlZ2VyOwEAFExqYXZhL3V0aWwvSXRlcmF0b3I7AQAMYnJlZWZpbGVkYXRhAQAzTG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvamFycy9CUkVFVGVzdCRCUkVFRmlsZURhdGE7CwDyAU0MAU4BTwEABnZhbHVlcwEAGCgpTGphdmEvdXRpbC9Db2xsZWN0aW9uOwsBUQEDBwFSAQAUamF2YS91dGlsL0NvbGxlY3Rpb24BAAlhbGxDb3VudHMBABZMamF2YS91dGlsL0NvbGxlY3Rpb247AQAFdG90YWwLAQEBVwwBWAFZAQADYWRkAQAVKExqYXZhL2xhbmcvT2JqZWN0OylaCgEwANMBAARsaXN0CgEQAV0MABYBXgEABChJKVYLAPIBYAwBYQFiAQADcHV0AQA4KExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsKAAEBZAwBZQFmAQAJaW5jcmVtZW50AQAoKExqYXZhL2xhbmcvSW50ZWdlcjspTGphdmEvbGFuZy9JbnRlZ2VyOwEAB2JyZWVNYXAHAWkBABVqYXZhL3V0aWwvamFyL0phckZpbGUKAWgBawwAFgFsAQATKExqYXZhL2lvL0ZpbGU7WkkpVgoBaAFuDAFvAXABAAdlbnRyaWVzAQAZKClMamF2YS91dGlsL0VudW1lcmF0aW9uOwsBcgF0BwFzAQAVamF2YS91dGlsL0VudW1lcmF0aW9uDAF1AQsBAAtuZXh0RWxlbWVudAcBdwEAFmphdmEvdXRpbC9qYXIvSmFyRW50cnkKAXYAkwgBegEABi5jbGFzcwoAmQF8DAF9AX4BAAhlbmRzV2l0aAEAFShMamF2YS9sYW5nL1N0cmluZzspWggBgAEABC5qYXIKAWgBggwBgwGEAQAOZ2V0SW5wdXRTdHJlYW0BAC8oTGphdmEvdXRpbC96aXAvWmlwRW50cnk7KUxqYXZhL2lvL0lucHV0U3RyZWFtOwoAAQGGDACoAYcBABgoTGphdmEvaW8vSW5wdXRTdHJlYW07KVoLAXIBiQwBigAqAQAPaGFzTW9yZUVsZW1lbnRzCQGMAY4HAY0BABBqYXZhL2xhbmcvU3lzdGVtDAGPAZABAANvdXQBABVMamF2YS9pby9QcmludFN0cmVhbTsKACwBkgwBkwA5AQAKZ2V0TWVzc2FnZQoBlQGXBwGWAQATamF2YS9pby9QcmludFN0cmVhbQwBmAAmAQAHcHJpbnRsbgoBaACDAQAHamFyZmlsZQEAA2phcgEAF0xqYXZhL3V0aWwvamFyL0phckZpbGU7AQAXTGphdmEvdXRpbC9FbnVtZXJhdGlvbjsBAAVlbnRyeQEAGExqYXZhL3V0aWwvamFyL0phckVudHJ5OwEABWlucHV0AQAWTG9jYWxWYXJpYWJsZVR5cGVUYWJsZQEAMUxqYXZhL3V0aWwvRW51bWVyYXRpb248TGphdmEvdXRpbC9qYXIvSmFyRW50cnk7PjsHAaQBABxqYXZhL3V0aWwvamFyL0phcklucHV0U3RyZWFtCgGjAaYMABYAeQoBowGoDAGpAaoBAAxnZXROZXh0RW50cnkBABooKUxqYXZhL3V0aWwvemlwL1ppcEVudHJ5OwoBrACTBwGtAQAWamF2YS91dGlsL3ppcC9aaXBFbnRyeQoBowGvDAGwAKUBAAlhdmFpbGFibGUBAA5qYXJJbnB1dFN0cmVhbQEAHkxqYXZhL3V0aWwvamFyL0phcklucHV0U3RyZWFtOwEAGExqYXZhL3V0aWwvemlwL1ppcEVudHJ5OwoAEgG1DAG2AX4BAAVwYXJzZQoAEgG4DAG5ADkBABBnZXRQcm9qZWN0U3RyaW5nAQAIZnVsbG5hbWUBAAZyZXN1bHQBAAhwYXJzYWJsZQEAE2dldEJSRUVGcm9tTWFuaWZlc3QBADsoTGphdmEvaW8vSW5wdXRTdHJlYW07TGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwoBwAHCBwHBAQAlb3JnL2VjbGlwc2Uvb3NnaS91dGlsL01hbmlmZXN0RWxlbWVudAwBwwHEAQATcGFyc2VCdW5kbGVNYW5pZmVzdAEANShMamF2YS9pby9JbnB1dFN0cmVh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AAAAAgHkAeUAAAAKAAEBMAABAeYACFBLAwQKAAAAAABFXgo/s9UgGes7AADrOwAAKQAAAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvamFycy9CUkVFVGVzdC5qYXZhLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCiAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCiAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAogKiAKICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICogVGhpcyBmaWxlIG9yaWdpbmFsbHkgY2FtZSBmcm9tICdFY2xpcHNlIE9yYml0JyBwcm9qZWN0IHRoZW4gYWRhcHRlZCB0byB1c2UgCiAqIGluIFdUUCBhbmQgaW1wcm92ZWQgdG8gdXNlICdNYW5pZmVzdCcgdG8gcmVhZCBtYW5pZmVzdC5tZiwgaW5zdGVhZCBvZiByZWFkaW5nIAogKiBpdCBhcyBhIHByb3BlcnRpZXMgZmlsZS4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS5qdW5vLnRlc3RzLmphcnM7CgppbXBvcnQgamF2YS5pby5GaWxlOwppbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CmltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwppbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CmltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CmltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CmltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKaW1wb3J0IGphdmEudXRpbC5MaXN0OwppbXBvcnQgamF2YS51dGlsLk1hcDsKaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwppbXBvcnQgamF2YS51dGlsLlNldDsKaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7CmltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7CmltcG9ydCBqYXZhLnV0aWwuamFyLkphcklucHV0U3RyZWFtOwppbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKCmltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmp1bm8udGVzdHMudXRpbHMuRnVsbEphck5hbWVQYXJzZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5qdW5vLnRlc3RzLnV0aWxzLkpBUkZpbGVOYW1lRmlsdGVyOwppbXBvcnQgb3JnLmVjbGlwc2UuanVuby50ZXN0cy51dGlscy5SZXBvcnRXcml0ZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTWFuaWZlc3RFbGVtZW50OwppbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUV4Y2VwdGlvbjsKCi8qKgogKiBAc2luY2UgMy4zCiAqLwpwdWJsaWMgY2xhc3MgQlJFRVRlc3QgZXh0ZW5kcyBUZXN0SmFycyB7CgogICAgc3RhdGljIGNsYXNzIEJSRUVGaWxlRGF0YSBpbXBsZW1lbnRzIENvbXBhcmFibGUgewogICAgICAgIFN0cmluZyBmaWxlbmFtZTsKICAgICAgICBTdHJpbmcgYnJlZVZhbHVlOwoKICAgICAgICBwdWJsaWMgQlJFRUZpbGVEYXRhKFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIGJyZWVWYWx1ZSkgewogICAgICAgICAgICB0aGlzLmZpbGVuYW1lID0gZmlsZW5hbWU7CiAgICAgICAgICAgIHRoaXMuYnJlZVZhbHVlID0gYnJlZVZhbHVlOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG8pIHsKICAgICAgICAgICAgLy8gZmlyc3Qgc29ydCBvbiBicmVlIG5hbWUsIHRoZW4gb24gZmlsZS9idW5kbGUgbmFtZQogICAgICAgICAgICBpbnQgcmVzdWx0ID0gYnJlZVZhbHVlLmNvbXBhcmVUbygoKEJSRUVGaWxlRGF0YSkgbykuYnJlZVZhbHVlKTsKICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAwKSB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSBmaWxlbmFtZS5jb21wYXJlVG8oKChCUkVFRmlsZURhdGEpIG8pLmZpbGVuYW1lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KCiAgICB9CgogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nICAgICAgICAgICAgb3V0cHV0RmlsZW5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICJicmVlZGF0YS50eHQiOwogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nICAgICAgICAgICAgUFJPUEVSVFlfQlVORExFX1JFUVVJUkVEX0VYRUNVVElPTl9FTlZJUk9OTUVOVCA9ICJCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudCI7CiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGdWxsSmFyTmFtZVBhcnNlciBuYW1lUGFyc2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbmV3IEZ1bGxKYXJOYW1lUGFyc2VyKCk7CgogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewoKICAgICAgICBCUkVFVGVzdCB0ZXN0bGF5b3V0ID0gbmV3IEJSRUVUZXN0KCk7CiAgICAgICAgdGVzdGxheW91dC5zZXREaXJlY3RvcnlUb0NoZWNrKCIvaG9tZS9maWxlcy90ZXN0U0RLUmVwbyIpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHRlc3RsYXlvdXQudGVzdEJSRUVTZXR0aW5nUnVsZSgpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgIH0KCiAgICB9CgogICAgcHVibGljIGJvb2xlYW4gdGVzdEJSRUVTZXR0aW5nUnVsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CgogICAgICAgIFN0cmluZyBwcm9wZXJ0eSA9IGdldERpcmVjdG9yeVRvQ2hlY2soKTsKICAgICAgICBpZiAocHJvcGVydHkgPT0gbnVsbCkgewogICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5lZWQgdG8gc2V0IGlucHV0IGRpcmVjdG9yeSB0byBjaGVjayBhZ2FpbnN0LiIpOwogICAgICAgIH0KCiAgICAgICAgRmlsZSBpbnB1dGRpciA9IG5ldyBGaWxlKGdldEJ1bmRsZURpcmVjdG9yeSgpKTsKICAgICAgICBpZiAoIShpbnB1dGRpci5leGlzdHMoKSAmJiBpbnB1dGRpci5pc0RpcmVjdG9yeSgpKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImJ1bmRsZSBkaXJlY3RvcnkgKCIgKyBnZXRCdW5kbGVEaXJlY3RvcnkoKSArICIpIG11c3QgYmUgYW4gZXhpc3RpbmcgZGlyZWN0b3J5LiIpOwogICAgICAgIH0KCiAgICAgICAgYm9vbGVhbiBmYWlsdXJlc09jY3VyZWQ7CgogICAgICAgIGZhaWx1cmVzT2NjdXJlZCA9IGNoZWNrQnVuZGxlQlJFRShpbnB1dGRpcik7CgogICAgICAgIHJldHVybiBmYWlsdXJlc09jY3VyZWQ7CiAgICB9CgogICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrQnVuZGxlQlJFRShGaWxlIGlucHV0ZGlyKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgIC8vIHJlc2V0L2luaXRpYWxpemUgZXJyb3JzCiAgICAgICAgSW5wdXRTdHJlYW0gcHJvcGVydHlTdHJlYW0gPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiZXhjZXB0aW9ucy5wcm9wZXJ0aWVzIik7CiAgICAgICAgUHJvcGVydGllcyBicmVlRXhjZXB0aW9uUHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CiAgICAgICAgU3RyaW5nIGJyZWVFeGNlcHRpb25zID0gIiI7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgYnJlZUV4Y2VwdGlvblByb3BlcnRpZXMubG9hZChwcm9wZXJ0eVN0cmVhbSk7CiAgICAgICAgICAgIGJyZWVFeGNlcHRpb25zID0gYnJlZUV4Y2VwdGlvblByb3BlcnRpZXMuZ2V0UHJvcGVydHkoImJyZWVFeGNlcHRpb25zIik7CiAgICAgICAgICAgIGlmIChicmVlRXhjZXB0aW9ucyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBicmVlRXhjZXB0aW9ucyA9ICIiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICBpZiAocHJvcGVydHlTdHJlYW0gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVN0cmVhbS5jbG9zZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyB3b3VsZCBiZSB1bnVzdWFsIHRvIGdldCBoZXJlPwogICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9Ci8vIExpc3QgZXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwogICAgICAgIE1hcCBqYXZhV2l0aEJyZWUgPSBuZXcgSGFzaE1hcCgpOwogICAgICAgIExpc3Qgbm9uamF2YVdpdGhCcmVlID0gbmV3IEFycmF5TGlzdCgpOwogICAgICAgIExpc3QgamF2YVdpdGhvdXRCcmVlID0gbmV3IEFycmF5TGlzdCgpOwogICAgICAgIGludCBub25KYXZhTm9CUkVFID0gMDsKICAgICAgICBib29sZWFuIGZhaWx1cmVzT2NjdXJlZCA9IGZhbHNlOwogICAgICAgIEZpbGVbXSBjaGlsZHJlbiA9IGlucHV0ZGlyLmxpc3RGaWxlcyhuZXcgSkFSRmlsZU5hbWVGaWx0ZXIoKSk7CiAgICAgICAgaW50IHRvdGFsc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDsKICAgICAgICBpbnQgY2hlY2tlZCA9IDA7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbHNpemU7IGkrKykgewogICAgICAgICAgICBGaWxlIGNoaWxkID0gY2hpbGRyZW5baV07CiAgICAgICAgICAgIFN0cmluZyBuYW1lID0gY2hpbGQuZ2V0TmFtZSgpOwogICAgICAgICAgICAvLyB3aXRoIEp1bm8sIHNpbmNlIHdlIGhhdmUgYWxsIGphcnMgb24gZmlsZSBzeXN0ZW0sIGluIGFkZGl0aW9uIHRvIHBhY2suZ3ogZmlsZXMsCiAgICAgICAgICAgIC8vIHdlIGRvIG5vdCBuZWVkIHRvIGNoZWNrIHRoZSBwYWNrLmd6IG9uZXMuIFdlIGNhbiBhc3N1bWUgdGhleSBhcmUgaWRlbnRpYWwgdG8gdGhlaXIgLmphciB2ZXJzaW9uLgovLyBpZiAoY2hpbGQuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoRVhURU5TSU9OX1BBQ0VLRF9KQVIpKSB7Ci8vIGNoaWxkID0gZ2V0RmlsZUZyb21QQUNLRURKQVIoY2hpbGQpOwovLyB9Ci8vIGlmIChjaGlsZCAhPSBudWxsKSB7CgogICAgICAgICAgICBTdHJpbmcgYnVuZGxlTmFtZSA9IGdldEJ1bmRsZU5hbWUobmFtZSk7CiAgICAgICAgICAgIGlmICgoYnVuZGxlTmFtZSAhPSBudWxsKSAmJiAhYnJlZUV4Y2VwdGlvbnMuY29udGFpbnMoYnVuZGxlTmFtZSkpIHsKICAgICAgICAgICAgICAgIGNoZWNrZWQrKzsKICAgICAgICAgICAgICAgIFN0cmluZyBicmVlID0gZ2V0QlJFRUZyb21KQVIoY2hpbGQpOwogICAgICAgICAgICAgICAgaWYgKChicmVlICE9IG51bGwpICYmIChicmVlLmxlbmd0aCgpID4gMCkpIHsKICAgICAgICAgICAgICAgICAgICAvLyBoYXMgQlJFRSwgY29uZmlybSBpcyBqYXZhIGZpbGUKICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbnNKYXZhKGNoaWxkKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnRDb3VudHMoamF2YVdpdGhCcmVlLCBicmVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrRmFsc2VJbmNsdXNpb25zKG5vbmphdmFXaXRoQnJlZSwgY2hpbGQsIGJyZWUpOwogICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlc09jY3VyZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIG5vIEJSRUUsIGNvbmZpcm0gaXMgbm9uLWphdmEKICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbnNKYXZhKGNoaWxkKSkgewogICAgICAgICAgICAgICAgICAgICAgICB0cmFja09taXNzaW9ucyhqYXZhV2l0aG91dEJyZWUsIGNoaWxkKTsKICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZXNPY2N1cmVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5vbkphdmFOb0JSRUUrKzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgICAgIHByaW50cmVwb3J0KGphdmFXaXRoQnJlZSwgbm9uamF2YVdpdGhCcmVlLCBqYXZhV2l0aG91dEJyZWUsIG5vbkphdmFOb0JSRUUsIHRvdGFsc2l6ZSwgY2hlY2tlZCk7CgogICAgICAgIHJldHVybiBmYWlsdXJlc09jY3VyZWQ7CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIHByaW50cmVwb3J0KE1hcCBqYXZhV2l0aEJyZWUsIExpc3Qgbm9uamF2YVdpdGhCcmVlLCBMaXN0IGphdmFXaXRob3V0QnJlZSwgaW50IG5vbkphdmFOb0JSRUUsIGludCB0b3RhbHNpemUsIGludCBjaGVja2VkKSB0aHJvd3MgSU9FeGNlcHRpb24gewoKCiAgICAgICAgUmVwb3J0V3JpdGVyIHJlcG9ydFdyaXRlciA9IG5ldyBSZXBvcnRXcml0ZXIoZ2V0T3V0cHV0RGlyZWN0b3J5KCksIG91dHB1dEZpbGVuYW1lKTsKICAgICAgICB0cnkgewogICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigpOwogICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigiICAgRGlyZWN0b3J5IGNoZWNrZWQ6ICIgKyBnZXREaXJlY3RvcnlUb0NoZWNrKCkpOwogICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigpOwogICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigiICAgQ2hlY2tlZCAiICsgY2hlY2tlZCArICIgb2YgIiArIHRvdGFsc2l6ZSArICIgamFycy4iKTsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oKTsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oIiAgQnVuZGxlcyB3aXRoIGFwcHJvcHJpYXRlIHVzZSBvZiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudCAoQlJFRSk6Iik7CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCIgICBKYXZhIHdpdGggQlJFRTogIiArIHRvdGFsQ291bnQoamF2YVdpdGhCcmVlKSk7CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCIgICBOb24gSmF2YSB3aXRob3V0IEJSRUU6IiArIG5vbkphdmFOb0JSRUUpOwogICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigpOwogICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigiICAgRGlzdHJpYnV0aW9uIG9mIEJSRUVzIGluIEphdmEgQnVuZGxlcyAiKTsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oKTsKICAgICAgICAgICAgU2V0IGFsbEJSRUVzID0gamF2YVdpdGhCcmVlLmtleVNldCgpOwogICAgICAgICAgICBMaXN0IGFsbEJSRUVMaXN0ID0gbmV3IEFycmF5TGlzdChhbGxCUkVFcyk7CiAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoYWxsQlJFRUxpc3QpOwogICAgICAgICAgICBmb3IgKE9iamVjdCBvYmplY3QgOiBhbGxCUkVFTGlzdCkgewogICAgICAgICAgICAgICAgSW50ZWdlciBjb3VudCA9IChJbnRlZ2VyKSBqYXZhV2l0aEJyZWUuZ2V0KG9iamVjdCk7CiAgICAgICAgICAgICAgICByZXBvcnRXcml0ZXIucHJpbnRmKCJcdFx0JTVkXHQlc1xuIiwgY291bnQuaW50VmFsdWUoKSwgb2JqZWN0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigpOwogICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigiICBCdW5kbGVzIHdpdGggcXVlc3Rpb25hYmxlIGFic2VuY2Ugb3IgcHJlc2VuY2Ugb2YgQlJFRSIpOwogICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigpOwogICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigiICAgIEphdmEgQnVuZGxlcyB3aXRob3V0IGEgQlJFRTogIiArIGphdmFXaXRob3V0QnJlZS5zaXplKCkpOwogICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigpOwogICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGphdmFXaXRob3V0QnJlZSk7CiAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBqYXZhV2l0aG91dEJyZWUuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewogICAgICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGl0ZXJhdG9yLm5leHQoKTsKICAgICAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCIgICAgICAgIiArIG9iamVjdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oKTsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oIiAgICBOb24gSmF2YSBCdW5kbGVzIHdpdGggYSBCUkVFOiAiICsgbm9uamF2YVdpdGhCcmVlLnNpemUoKSk7CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCk7CiAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQobm9uamF2YVdpdGhCcmVlKTsKICAgICAgICAgICAgQlJFRUZpbGVEYXRhIGJyZWVmaWxlZGF0YSA9IG51bGw7CiAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBub25qYXZhV2l0aEJyZWUuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewogICAgICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGl0ZXJhdG9yLm5leHQoKTsKICAgICAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBCUkVFRmlsZURhdGEpIHsKICAgICAgICAgICAgICAgICAgICBicmVlZmlsZWRhdGEgPSAoQlJFRUZpbGVEYXRhKSBvYmplY3Q7CiAgICAgICAgICAgICAgICAgICAgcmVwb3J0V3JpdGVyLnByaW50ZigiJTI0c1x0JXNcbiIsIGJyZWVmaWxlZGF0YS5icmVlVmFsdWUsIGJyZWVmaWxlZGF0YS5maWxlbmFtZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlByb2dyYW1taW5nIGVycm9yLiIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICByZXBvcnRXcml0ZXIuY2xvc2UoKTsKICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSBpbnQgdG90YWxDb3VudChNYXAgamF2YVdpdGhCcmVlKSB7CgogICAgICAgIENvbGxlY3Rpb24gYWxsQ291bnRzID0gamF2YVdpdGhCcmVlLnZhbHVlcygpOwogICAgICAgIGludCB0b3RhbCA9IDA7CiAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGFsbENvdW50cy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7CiAgICAgICAgICAgIEludGVnZXIgY291bnQgPSAoSW50ZWdlcikgaXRlcmF0b3IubmV4dCgpOwogICAgICAgICAgICB0b3RhbCA9IHRvdGFsICsgY291bnQuaW50VmFsdWUoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRvdGFsOwogICAgfQoKICAgIHByaXZhdGUgdm9pZCB0cmFja09taXNzaW9ucyhMaXN0IGphdmFXaXRob3V0QnJlZSwgRmlsZSBjaGlsZCkgewogICAgICAgIGphdmFXaXRob3V0QnJlZS5hZGQoY2hpbGQuZ2V0TmFtZSgpKTsKCiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIHRyYWNrRmFsc2VJbmNsdXNpb25zKExpc3QgbGlzdCwgRmlsZSBjaGlsZCwgU3RyaW5nIGJyZWUpIHsKICAgICAgICBsaXN0LmFkZChuZXcgQlJFRUZpbGVEYXRhKGNoaWxkLmdldE5hbWUoKSwgYnJlZSkpOwoKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgaW5jcmVtZW50Q291bnRzKE1hcCBicmVlTWFwLCBTdHJpbmcgYnJlZSkgewogICAgICAgIEludGVnZXIgY291bnQgPSAoSW50ZWdlcikgYnJlZU1hcC5nZXQoYnJlZSk7CiAgICAgICAgaWYgKGNvdW50ID09IG51bGwpIHsKICAgICAgICAgICAgYnJlZU1hcC5wdXQoYnJlZSwgbmV3IEludGVnZXIoMSkpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgYnJlZU1hcC5wdXQoYnJlZSwgaW5jcmVtZW50KGNvdW50KSk7CiAgICAgICAgfQoKICAgIH0KCiAgICBwcml2YXRlIEludGVnZXIgaW5jcmVtZW50KEludGVnZXIgY291bnQpIHsKICAgICAgICByZXR1cm4gbmV3IEludGVnZXIoY291bnQuaW50VmFsdWUoKSArIDEpOwogICAgfQoKICAgIHByaXZhdGUgYm9vbGVhbiBjb250YWluc0phdmEoRmlsZSBqYXJmaWxlKSB7CiAgICAgICAgLy8gV2UgYXNzdW1lIHRoZSBmaWxlIGlzIGEgJ2phcicgZmlsZS4KICAgICAgICBib29sZWFuIGNvbnRhaW5zSmF2YSA9IGZhbHNlOwogICAgICAgIEphckZpbGUgamFyID0gbnVsbDsKICAgICAgICB0cnkgewogICAgICAgICAgICBqYXIgPSBuZXcgSmFyRmlsZShqYXJmaWxlLCBmYWxzZSwgWmlwRmlsZS5PUEVOX1JFQUQpOwogICAgICAgICAgICBFbnVtZXJhdGlvbjxKYXJFbnRyeT4gZW50cmllcyA9IGphci5lbnRyaWVzKCk7CiAgICAgICAgICAgIHdoaWxlIChlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKSB7CiAgICAgICAgICAgICAgICBKYXJFbnRyeSBlbnRyeSA9IGVudHJpZXMubmV4dEVsZW1lbnQoKTsKICAgICAgICAgICAgICAgIGlmIChlbnRyeS5nZXROYW1lKCkuZW5kc1dpdGgoIi5jbGFzcyIpKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGFpbnNKYXZhID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVudHJ5LmdldE5hbWUoKS5lbmRzV2l0aCgiLmphciIpKSB7CiAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXQgPSBqYXIuZ2V0SW5wdXRTdHJlYW0oZW50cnkpOwogICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluc0phdmEoaW5wdXQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zSmF2YSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIGlmIChqYXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBqYXIuY2xvc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNvbnRhaW5zSmF2YTsKICAgIH0KCiAgICBwcml2YXRlIGJvb2xlYW4gY29udGFpbnNKYXZhKElucHV0U3RyZWFtIGlucHV0KSB7CiAgICAgICAgLy8gV2UgYXNzdW1lIHRoZSBmaWxlIGlzIGEgJ2phcicgZmlsZS4KICAgICAgICBib29sZWFuIGNvbnRhaW5zSmF2YSA9IGZhbHNlOwoKICAgICAgICB0cnkgewogICAgICAgICAgICBKYXJJbnB1dFN0cmVhbSBqYXJJbnB1dFN0cmVhbSA9IG5ldyBKYXJJbnB1dFN0cmVhbShpbnB1dCk7CiAgICAgICAgICAgIHdoaWxlIChqYXJJbnB1dFN0cmVhbS5hdmFpbGFibGUoKSA+IDApIHsKICAgICAgICAgICAgICAgIFppcEVudHJ5IGVudHJ5ID0gamFySW5wdXRTdHJlYW0uZ2V0TmV4dEVudHJ5KCk7CiAgICAgICAgICAgICAgICBpZiAoZW50cnkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeS5nZXROYW1lKCkuZW5kc1dpdGgoIi5jbGFzcyIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zSmF2YSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlucHV0LmNsb3NlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBjb250YWluc0phdmE7CiAgICB9CgogICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QnVuZGxlTmFtZShTdHJpbmcgZnVsbG5hbWUpIHsKICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKICAgICAgICBib29sZWFuIHBhcnNhYmxlID0gbmFtZVBhcnNlci5wYXJzZShmdWxsbmFtZSk7CiAgICAgICAgaWYgKHBhcnNhYmxlKSB7CiAgICAgICAgICAgIHJlc3VsdCA9IG5hbWVQYXJzZXIuZ2V0UHJvamVjdFN0cmluZygpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIC8qCiAgICAgKiBSZXR1cm4gdGhlIGJ1bmRsZSBpZCBmcm9tIHRoZSBtYW5pZmVzdCBwb2ludGVkIHRvIGJ5IHRoZSBnaXZlbiBpbnB1dAogICAgICogc3RyZWFtLgogICAgICovCiAgICBwcml2YXRlIFN0cmluZyBnZXRCUkVFRnJvbU1hbmlmZXN0KElucHV0U3RyZWFtIGlucHV0LCBTdHJpbmcgcGF0aCkgewogICAgICAgIFN0cmluZyBicmVlID0gbnVsbDsKICAgICAgICB0cnkgewogICAgICAgICAgICBNYXAgYXR0cmlidXRlcyA9IE1hbmlmZXN0RWxlbWVudC5wYXJzZUJ1bmRsZU1hbmlmZXN0KGlucHV0LCBudWxsKTsKICAgICAgICAgICAgYnJlZSA9IChTdHJpbmcpIGF0dHJpYnV0ZXMuZ2V0KFBST1BFUlRZX0JVTkRMRV9SRVFVSVJFRF9FWEVDVVRJT05fRU5WSVJPTk1FTlQpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlucHV0LmNsb3NlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gYnJlZTsKICAgIH0KCgogICAgLyoKICAgICAqIFRoZSBnaXZlbiBmaWxlIHBvaW50cyB0byBhIGJ1bmRsZSBjb250YWluZWQgaW4gYW4gYXJjaGl2ZS4gTG9vayBpbnRvCiAgICAgKiB0aGUgYnVuZGxlIG1hbmlmZXN0IGZpbGUgdG8gZmluZCB0aGUgYnVuZGxlIGlkZW50aWZpZXIuCiAgICAgKi8KICAgIHByaXZhdGUgU3RyaW5nIGdldEJSRUVGcm9tSkFSKEZpbGUgZmlsZSkgewogICAgICAgIElucHV0U3RyZWFtIGlucHV0ID0gbnVsbDsKICAgICAgICBKYXJGaWxlIGphciA9IG51bGw7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgamFyID0gbmV3IEphckZpbGUoZmlsZSwgZmFsc2UsIFppcEZpbGUuT1BFTl9SRUFEKTsKICAgICAgICAgICAgSmFyRW50cnkgZW50cnkgPSBqYXIuZ2V0SmFyRW50cnkoSmFyRmlsZS5NQU5JRkVTVF9OQU1FKTsKICAgICAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHsKICAgICAgICAgICAgICAgIC8vIGFkZEVycm9yKCJCdW5kbGUgZG9lcyBub3QgY29udGFpbiBhIE1BTklGRVNULk1GIGZpbGU6ICIgKwogICAgICAgICAgICAgICAgLy8gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpbnB1dCA9IGphci5nZXRJbnB1dFN0cmVhbShlbnRyeSk7CiAgICAgICAgICAgIHJldHVybiBnZXRCUkVFRnJvbU1hbmlmZXN0KGlucHV0LCBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICAgICAgLy8gYWRkRXJyb3IoZS5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlucHV0LmNsb3NlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChqYXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBqYXIuY2xvc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QnVuZGxlRGlyZWN0b3J5KCkgewogICAgICAgIGlmIChidW5kbGVEaXJlY3RvcnkgPT0gbnVsbCkgewogICAgICAgICAgICBTdHJpbmcgcHJvcGVydHkgPSBnZXREaXJlY3RvcnlUb0NoZWNrKCk7CiAgICAgICAgICAgIGlmIChwcm9wZXJ0eSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5lZWQgdG8gc2V0IGlucHV0IGRpcmVjdG9yeSB0byBjaGVjayBhZ2FpbnN0LiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5lbmRzV2l0aCgiLyIpKSB7CiAgICAgICAgICAgICAgICBidW5kbGVEaXJlY3RvcnkgPSBwcm9wZXJ0eSArICJhZ2dyZWdhdGUvcGx1Z2lucyI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBidW5kbGVEaXJlY3RvcnkgPSBwcm9wZXJ0eSArICIvYWdncmVnYXRlL3BsdWdpbnMiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBidW5kbGVEaXJlY3Rvcnk7CiAgICB9Cn0KUEsDBAoAAAAAAG9YCj/8vHBKiiMAAIojAAAoAAAAb3JnL2VjbGlwc2UvanVuby90ZXN0cy9qYXJzL0VTVGVzdC5jbGFzc8r+ur4AAAAxAZ4HAAIBACJvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvRVNUZXN0BwAEAQAkb3JnL2VjbGlwc2UvanVuby90ZXN0cy9qYXJzL1Rlc3RKYXJzAQAhUFJPUEVSVFlfRUNMSVBTRV9TT1VSQ0VSRUZFUkVOQ0VTAQASTGphdmEvbGFuZy9PYmplY3Q7AQAKbmFtZVBhcnNlcgEAMExvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL0Z1bGxKYXJOYW1lUGFyc2VyOwEADm91dHB1dEZpbGVuYW1lAQASTGphdmEvbGFuZy9TdHJpbmc7AQANQ29uc3RhbnRWYWx1ZQgADQEACmVzZGF0YS50eHQBAA9idW5kbGVEaXJlY3RvcnkBAAg8Y2xpbml0PgEAAygpVgEABENvZGUIABMBABhFY2xpcHNlLVNvdXJjZVJlZmVyZW5jZXMJAAEAFQwABQAGBwAXAQAub3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9GdWxsSmFyTmFtZVBhcnNlcgoAFgAZDAAaABABAAY8aW5pdD4JAAEAHAwABwAIAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlCgADABkJAAEAIQwADgAKAQAEdGhpcwEAJExvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvRVNUZXN0OwEABG1haW4BABYoW0xqYXZhL2xhbmcvU3RyaW5nOylWCgABABkIACgBACkvaG9tZS9maWxlcy9idWlsZHppcHMvanVub1JDMi9lY2xpcHNlSkVFLwoAAQAqDAArACwBABNzZXREaXJlY3RvcnlUb0NoZWNrAQAVKExqYXZhL2xhbmcvU3RyaW5nOylWCgABAC4MAC8AMAEAEXRlc3RFU1NldHRpbmdSdWxlAQADKClaCgAyADQHADMBABNqYXZhL2lvL0lPRXhjZXB0aW9uDAA1ABABAA9wcmludFN0YWNrVHJhY2UBAARhcmdzAQATW0xqYXZhL2xhbmcvU3RyaW5nOwEACnRlc3RsYXlvdXQBAAFlAQAVTGphdmEvaW8vSU9FeGNlcHRpb247AQAKRXhjZXB0aW9ucwcAPQEADGphdmEvaW8vRmlsZQoAAQA/DABAAEEBABJnZXRCdW5kbGVEaXJlY3RvcnkBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwoAPABDDAAaACwKADwARQwARgAwAQAGZXhpc3RzCgA8AEgMAEkAMAEAC2lzRGlyZWN0b3J5BwBLAQAjb3JnL2FwYWNoZS90b29scy9hbnQvQnVpbGRFeGNlcHRpb24HAE0BABdqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcggATwEAEmJ1bmRsZSBkaXJlY290cnkgKAoATABDCgBMAFIMAFMAVAEABmFwcGVuZAEALShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwgAVgEAICkgbXVzdCBiZSBhbiBleGlzdGluZyBkaXJlY3RvcnkuCgBMAFgMAFkAQQEACHRvU3RyaW5nCgBKAEMKAAEAXAwAXQBeAQANY2hlY2tCdW5kbGVFUwEAEShMamF2YS9pby9GaWxlOylaAQAIaW5wdXRkaXIBAA5MamF2YS9pby9GaWxlOwEAD2ZhaWx1cmVzT2NjdXJlZAEAAVoKAGQAZgcAZQEAEGphdmEvbGFuZy9PYmplY3QMAGcAaAEACGdldENsYXNzAQATKClMamF2YS9sYW5nL0NsYXNzOwgAagEAFWV4Y2VwdGlvbnMucHJvcGVydGllcwoAbABuBwBtAQAPamF2YS9sYW5nL0NsYXNzDABvAHABABNnZXRSZXNvdXJjZUFzU3RyZWFtAQApKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9pby9JbnB1dFN0cmVhbTsHAHIBABRqYXZhL3V0aWwvUHJvcGVydGllcwoAcQAZCAB1AQAACgBxAHcMAHgAeQEABGxvYWQBABgoTGphdmEvaW8vSW5wdXRTdHJlYW07KVYIAHsBAAxlc0V4Y2VwdGlvbnMKAHEAfQwAfgB/AQALZ2V0UHJvcGVydHkBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwoAgQCDBwCCAQATamF2YS9pby9JbnB1dFN0cmVhbQwAhAAQAQAFY2xvc2UHAIYBABFqYXZhL3V0aWwvSGFzaE1hcAoAhQAZBwCJAQATamF2YS91dGlsL0FycmF5TGlzdAoAiAAZBwCMAQAub3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9KQVJGaWxlTmFtZUZpbHRlcgoAiwAZCgA8AI8MAJAAkQEACWxpc3RGaWxlcwEAKShMamF2YS9pby9GaWxlbmFtZUZpbHRlcjspW0xqYXZhL2lvL0ZpbGU7CgA8AJMMAJQAQQEAB2dldE5hbWUKAAEAlgwAlwB/AQANZ2V0QnVuZGxlTmFtZQoAmQCbBwCaAQAQamF2YS9sYW5nL1N0cmluZwwAnACdAQAIY29udGFpbnMBABsoTGphdmEvbGFuZy9DaGFyU2VxdWVuY2U7KVoKAAEAnwwAoAChAQAMZ2V0RVNGcm9tSkFSAQAiKExqYXZhL2lvL0ZpbGU7KUxqYXZhL2xhbmcvU3RyaW5nOwgAowEACHByb2plY3Q9CgCZAKUMAKYApwEABmxlbmd0aAEAAygpSQoAAQCpDACqAKsBAA9pbmNyZW1lbnRDb3VudHMBACQoTGphdmEvdXRpbC9NYXA7TGphdmEvbGFuZy9TdHJpbmc7KVYKAAEArQwArgCvAQAOdHJhY2tPbWlzc2lvbnMBACEoTGphdmEvdXRpbC9MaXN0O0xqYXZhL2lvL0ZpbGU7KVYKAAEAsQwAsgCzAQALcHJpbnRyZXBvcnQBACUoTGphdmEvdXRpbC9NYXA7TGphdmEvdXRpbC9MaXN0O0lJSSlWAQAOcHJvcGVydHlTdHJlYW0BABVMamF2YS9pby9JbnB1dFN0cmVhbTsBABVlc0V4Y2VwdGlvblByb3BlcnRpZXMBABZMamF2YS91dGlsL1Byb3BlcnRpZXM7AQAGd2l0aEVzAQAPTGphdmEvdXRpbC9NYXA7AQAJd2l0aG91dEVzAQAQTGphdmEvdXRpbC9MaXN0OwEACGNoaWxkcmVuAQAPW0xqYXZhL2lvL0ZpbGU7AQAJdG90YWxzaXplAQABSQEAB2NoZWNrZWQBAAxuUHJvamVjdFRhZ3MBAAFpAQAFY2hpbGQBAARuYW1lAQAKYnVuZGxlTmFtZQEAAmVzBwDIAQApb3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9SZXBvcnRXcml0ZXIKAAEAygwAywBBAQASZ2V0T3V0cHV0RGlyZWN0b3J5CgDHAM0MABoAzgEAJyhMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspVgoAxwDQDADRABABAAd3cml0ZWxuCADTAQAWICAgRGlyZWN0b3J5IGNoZWNrZWQ6IAoAxwDVDADRACwIANcBAAsgICBDaGVja2VkIAoATADZDABTANoBABwoSSlMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CADcAQAEIG9mIAgA3gEABiBqYXJzLggA4AEANyAgIE51bWJlciBvZiBidW5kbGVzIHdpdGggYW4gRWNsaXBzZS1Tb3VyY2VSZWZlcmVuY2VzOiAKAAEA4gwA4wDkAQAKdG90YWxDb3VudAEAEihMamF2YS91dGlsL01hcDspSQgA5gEAKSAgICAgICAgTnVtYmVyIG9mIHRob3NlIHdpdGggJ3Byb2plY3Q9JzogCADoAQALIGF0dHJpYnV0ZS4IAOoBADogICBOdW1iZXIgb2YgYnVuZGxlcyB3aXRob3V0IGFuIEVjbGlwc2UtU291cmNlUmVmZXJlbmNlczogCwDsAO4HAO0BAA5qYXZhL3V0aWwvTGlzdAwA7wCnAQAEc2l6ZQgA8QEAMCAgQnVuZGxlcyB3aXRoIEVjbGlwc2UtU291cmNlUmVmZXJlbmNlcyAodG90YWw6IAgA8wEAASkLAPUA9wcA9gEADWphdmEvdXRpbC9NYXAMAPgA+QEABmtleVNldAEAESgpTGphdmEvdXRpbC9TZXQ7CgCIAPsMABoA/AEAGShMamF2YS91dGlsL0NvbGxlY3Rpb247KVYKAP4BAAcA/wEAFWphdmEvdXRpbC9Db2xsZWN0aW9ucwwBAQECAQAEc29ydAEAEyhMamF2YS91dGlsL0xpc3Q7KVYLAOwBBAwBBQEGAQAIaXRlcmF0b3IBABYoKUxqYXZhL3V0aWwvSXRlcmF0b3I7CwEIAQoHAQkBABJqYXZhL3V0aWwvSXRlcmF0b3IMAQsBDAEABG5leHQBABQoKUxqYXZhL2xhbmcvT2JqZWN0OwgBDgEAAyAgIAoATAEQDABTAREBAC0oTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsLAQgBEwwBFAAwAQAHaGFzTmV4dAgBFgEAOCAgICBCdW5kbGVzIHdpdGhvdXQgYW4gRWNsaXBzZS1Tb3VyY2VSZWZlcmVuY2VzICh0b3RhbDogCAEYAQAHICAgICAgIAoAxwCDAQAKd2l0aG91dEVTcwEADHJlcG9ydFdyaXRlcgEAK0xvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL1JlcG9ydFdyaXRlcjsBAAZhbGxFU3MBABZMamF2YS91dGlsL0NvbGxlY3Rpb247AQAJYWxsRVNMaXN0AQAGb2JqZWN0CwD1ASIMASMBJAEABnZhbHVlcwEAGCgpTGphdmEvdXRpbC9Db2xsZWN0aW9uOwsBJgEEBwEnAQAUamF2YS91dGlsL0NvbGxlY3Rpb24HASkBABFqYXZhL2xhbmcvSW50ZWdlcgoBKAErDAEsAKcBAAhpbnRWYWx1ZQEADWJ1bmRsZXNXaXRoRXMBAAlhbGxDb3VudHMBAAV0b3RhbAEAFExqYXZhL3V0aWwvSXRlcmF0b3I7AQAFY291bnQBABNMamF2YS9sYW5nL0ludGVnZXI7CwDsATQMATUBNgEAA2FkZAEAFShMamF2YS9sYW5nL09iamVjdDspWgEAEGJ1bmRsZXNXaXRob3V0RXMLAPUBOQwBOgE7AQADZ2V0AQAmKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsKASgBPQwAGgE+AQAEKEkpVgsA9QFADAFBAUIBAANwdXQBADgoTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwoAAQFEDAFFAUYBAAlpbmNyZW1lbnQBACgoTGphdmEvbGFuZy9JbnRlZ2VyOylMamF2YS9sYW5nL0ludGVnZXI7AQAFZXNNYXAKABYBSQwBSgFLAQAFcGFyc2UBABUoTGphdmEvbGFuZy9TdHJpbmc7KVoKABYBTQwBTgBBAQAQZ2V0UHJvamVjdFN0cmluZwEACGZ1bGxuYW1lAQAGcmVzdWx0AQAIcGFyc2FibGUBABFnZXRFU0Zyb21NYW5pZmVzdAEAOyhMamF2YS9pby9JbnB1dFN0cmVhbTtMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmc7CgFVAVcHAVYBACVvcmcvZWNsaXBzZS9vc2dpL3V0aWwvTWFuaWZlc3RFbGVtZW50DAFYAVkBABNwYXJzZUJ1bmRsZU1hbmlmZXN0AQA1KExqYXZhL2lvL0lucHV0U3RyZWFtO0xqYXZhL3V0aWwvTWFwOylMamF2YS91dGlsL01hcDsKAVsANAcBXAEAIm9yZy9vc2dpL2ZyYW1ld29yay9CdW5kbGVFeGNlcHRpb24BAAVpbnB1dAEABHBhdGgBAAphdHRyaWJ1dGVzAQAkTG9yZy9vc2dpL2ZyYW1ld29yay9CdW5kbGVFeGNlcHRpb247BwFiAQAVamF2YS91dGlsL2phci9KYXJGaWxlCgFhAWQMABoBZQEAEyhMamF2YS9pby9GaWxlO1pJKVYIAWcBABRNRVRBLUlORi9NQU5JRkVTVC5NRgoBYQFpDAFqAWsBAAtnZXRKYXJFbnRyeQEALChMamF2YS9sYW5nL1N0cmluZzspTGphdmEvdXRpbC9qYXIvSmFyRW50cnk7CgFhAIMKAWEBbgwBbwFwAQAOZ2V0SW5wdXRTdHJlYW0BAC8oTGphdmEvdXRpbC96aXAvWmlwRW50cnk7KUxqYXZhL2lvL0lucHV0U3RyZWFtOwoAPAFyDAFzAEEBAA9nZXRBYnNvbHV0ZVBhdGgKAAEBdQwBUgFTCQF3AXkHAXgBABBqYXZhL2xhbmcvU3lzdGVtDAF6AXsBAANvdXQBABVMamF2YS9pby9QcmludFN0cmVhbTsKADIBfQwBfgBBAQAKZ2V0TWVzc2FnZQoBgAGCBwGBAQATamF2YS9pby9QcmludFN0cmVhbQwBgwAsAQAHcHJpbnRsbgEABGZpbGUBAANqYXIBABdMamF2YS91dGlsL2phci9KYXJGaWxlOwEABWVudHJ5AQAYTGphdmEvdXRpbC9qYXIvSmFyRW50cnk7CgABAYoMAYsAQQEAE2dldERpcmVjdG9yeVRvQ2hlY2sIAY0BAC1OZWVkIHRvIHNldCBpbnB1dCBkaXJlY3RvcnkgdG8gY2hlY2sgYWdh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Z2Ugb3JnLmVjbGlwc2UuanVuby50ZXN0cy5qYXJzOwoKaW1wb3J0IGphdmEuaW8uRmlsZTsKaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwppbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwppbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CmltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKaW1wb3J0IGphdmEudXRpbC5NYXA7CmltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7CmltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7CmltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7CgppbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CmltcG9ydCBvcmcuZWNsaXBzZS5qdW5vLnRlc3RzLmphcnMuRVNUZXN0OwppbXBvcnQgb3JnLmVjbGlwc2UuanVuby50ZXN0cy5qYXJzLlRlc3RKYXJzOwppbXBvcnQgb3JnLmVjbGlwc2UuanVuby50ZXN0cy51dGlscy5GdWxsSmFyTmFtZVBhcnNlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmp1bm8udGVzdHMudXRpbHMuSkFSRmlsZU5hbWVGaWx0ZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5qdW5vLnRlc3RzLnV0aWxzLlJlcG9ydFdyaXRlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5NYW5pZmVzdEVsZW1lbnQ7CmltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlRXhjZXB0aW9uOwoKLyoqCiAqIFRlc3QgdG8gY2hlY2sgTUFOSUZFU1QuTUYgZmlsZXMgaW4gamFycyBpbiBhIHJlcG9zaXRvcnkgZm9yIHByZXNlbmNlIG9mCiAqIEVjbGlwc2UtU291cmNlUmVmZXJlbmNlcy4KICogCiAqIEBzaW5jZSAzLjcKICovCnB1YmxpYyBjbGFzcyBFU1Rlc3QgZXh0ZW5kcyBUZXN0SmFycyB7CgogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0ICAgICAgICAgICAgUFJPUEVSVFlfRUNMSVBTRV9TT1VSQ0VSRUZFUkVOQ0VTID0gIkVjbGlwc2UtU291cmNlUmVmZXJlbmNlcyI7CiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGdWxsSmFyTmFtZVBhcnNlciBuYW1lUGFyc2VyICAgICAgICAgICAgICAgICAgICAgICAgPSBuZXcgRnVsbEphck5hbWVQYXJzZXIoKTsKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyAgICAgICAgICAgIG91dHB1dEZpbGVuYW1lICAgICAgICAgICAgICAgICAgICA9ICJlc2RhdGEudHh0IjsKICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZURpcmVjdG9yeSAgICAgICAgICAgICAgICAgICA9IG51bGw7CgogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewoKICAgICAgICBFU1Rlc3QgdGVzdGxheW91dCA9IG5ldyBFU1Rlc3QoKTsKICAgICAgICB0ZXN0bGF5b3V0LnNldERpcmVjdG9yeVRvQ2hlY2soIi9ob21lL2ZpbGVzL2J1aWxkemlwcy9qdW5vUkMyL2VjbGlwc2VKRUUvIik7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdGVzdGxheW91dC50ZXN0RVNTZXR0aW5nUnVsZSgpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgIH0KCiAgICB9CgoKCiAgICBwdWJsaWMgYm9vbGVhbiB0ZXN0RVNTZXR0aW5nUnVsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CgogICAgICAgIEZpbGUgaW5wdXRkaXIgPSBuZXcgRmlsZShnZXRCdW5kbGVEaXJlY3RvcnkoKSk7CiAgICAgICAgaWYgKCEoaW5wdXRkaXIuZXhpc3RzKCkgJiYgaW5wdXRkaXIuaXNEaXJlY3RvcnkoKSkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJidW5kbGUgZGlyZWNvdHJ5ICgiICsgZ2V0QnVuZGxlRGlyZWN0b3J5KCkgKyAiKSBtdXN0IGJlIGFuIGV4aXN0aW5nIGRpcmVjdG9yeS4iKTsKICAgICAgICB9CgogICAgICAgIGJvb2xlYW4gZmFpbHVyZXNPY2N1cmVkOwoKICAgICAgICBmYWlsdXJlc09jY3VyZWQgPSBjaGVja0J1bmRsZUVTKGlucHV0ZGlyKTsKCiAgICAgICAgcmV0dXJuIGZhaWx1cmVzT2NjdXJlZDsKICAgIH0KCiAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tCdW5kbGVFUyhGaWxlIGlucHV0ZGlyKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgIC8vIHJlc2V0L2luaXRpYWxpemUgZXJyb3JzCiAgICAgICAgSW5wdXRTdHJlYW0gcHJvcGVydHlTdHJlYW0gPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiZXhjZXB0aW9ucy5wcm9wZXJ0aWVzIik7CiAgICAgICAgUHJvcGVydGllcyBlc0V4Y2VwdGlvblByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwogICAgICAgIFN0cmluZyBlc0V4Y2VwdGlvbnMgPSAiIjsKICAgICAgICB0cnkgewogICAgICAgICAgICBlc0V4Y2VwdGlvblByb3BlcnRpZXMubG9hZChwcm9wZXJ0eVN0cmVhbSk7CiAgICAgICAgICAgIGVzRXhjZXB0aW9ucyA9IGVzRXhjZXB0aW9uUHJvcGVydGllcy5nZXRQcm9wZXJ0eSgiZXNFeGNlcHRpb25zIik7CiAgICAgICAgICAgIGlmIChlc0V4Y2VwdGlvbnMgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgZXNFeGNlcHRpb25zID0gIiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIGlmIChwcm9wZXJ0eVN0cmVhbSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHByb3BlcnR5U3RyZWFtLmNsb3NlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgIC8vIHdvdWxkIGJlIHVudXN1YWwgdG8gZ2V0IGhlcmU/CiAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgTWFwIHdpdGhFcyA9IG5ldyBIYXNoTWFwKCk7CiAgICAgICAgTGlzdCB3aXRob3V0RXMgPSBuZXcgQXJyYXlMaXN0KCk7CiAgICAgICAgYm9vbGVhbiBmYWlsdXJlc09jY3VyZWQgPSBmYWxzZTsKICAgICAgICBGaWxlW10gY2hpbGRyZW4gPSBpbnB1dGRpci5saXN0RmlsZXMobmV3IEpBUkZpbGVOYW1lRmlsdGVyKCkpOwogICAgICAgIGludCB0b3RhbHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7CiAgICAgICAgaW50IGNoZWNrZWQgPSAwOwogICAgICAgIGludCBuUHJvamVjdFRhZ3MgPSAwOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWxzaXplOyBpKyspIHsKICAgICAgICAgICAgRmlsZSBjaGlsZCA9IGNoaWxkcmVuW2ldOwogICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGNoaWxkLmdldE5hbWUoKTsKCiAgICAgICAgICAgIFN0cmluZyBidW5kbGVOYW1lID0gZ2V0QnVuZGxlTmFtZShuYW1lKTsKICAgICAgICAgICAgaWYgKChidW5kbGVOYW1lICE9IG51bGwpICYmICFlc0V4Y2VwdGlvbnMuY29udGFpbnMoYnVuZGxlTmFtZSkpIHsKICAgICAgICAgICAgICAgIGNoZWNrZWQrKzsKICAgICAgICAgICAgICAgIFN0cmluZyBlcyA9IGdldEVTRnJvbUpBUihjaGlsZCk7CiAgICAgICAgICAgICAgICBpZiAoKGVzICE9IG51bGwpICYmIGVzLmNvbnRhaW5zKCJwcm9qZWN0PSIpKSB7CiAgICAgICAgICAgICAgICAgICAgblByb2plY3RUYWdzKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoKGVzICE9IG51bGwpICYmIChlcy5sZW5ndGgoKSA+IDApKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaGFzIEVTCiAgICAgICAgICAgICAgICAgICAgaW5jcmVtZW50Q291bnRzKHdpdGhFcywgZXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gbm8gRVMKICAgICAgICAgICAgICAgICAgICB0cmFja09taXNzaW9ucyh3aXRob3V0RXMsIGNoaWxkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBwcmludHJlcG9ydCh3aXRoRXMsIHdpdGhvdXRFcywgdG90YWxzaXplLCBjaGVja2VkLCBuUHJvamVjdFRhZ3MpOwoKICAgICAgICByZXR1cm4gZmFpbHVyZXNPY2N1cmVkOwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBwcmludHJlcG9ydChNYXAgd2l0aEVzLCBMaXN0IHdpdGhvdXRFU3MsIGludCB0b3RhbHNpemUsIGludCBjaGVja2VkLCBpbnQgblByb2plY3RUYWdzKSB0aHJvd3MgSU9FeGNlcHRpb24gewoKCiAgICAgICAgUmVwb3J0V3JpdGVyIHJlcG9ydFdyaXRlciA9IG5ldyBSZXBvcnRXcml0ZXIoZ2V0T3V0cHV0RGlyZWN0b3J5KCksIG91dHB1dEZpbGVuYW1lKTsKICAgICAgICB0cnkgewogICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigpOwogICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigiICAgRGlyZWN0b3J5IGNoZWNrZWQ6ICIgKyBnZXRCdW5kbGVEaXJlY3RvcnkoKSk7CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCIgICBDaGVja2VkICIgKyBjaGVja2VkICsgIiBvZiAiICsgdG90YWxzaXplICsgIiBqYXJzLiIpOwogICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigpOwogICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigpOwogICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigiICAgTnVtYmVyIG9mIGJ1bmRsZXMgd2l0aCBhbiBFY2xpcHNlLVNvdXJjZVJlZmVyZW5jZXM6ICIgKyB0b3RhbENvdW50KHdpdGhFcykpOwogICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigiICAgICAgICBOdW1iZXIgb2YgdGhvc2Ugd2l0aCAncHJvamVjdD0nOiAiICsgblByb2plY3RUYWdzICsgIiBhdHRyaWJ1dGUuIik7CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCIgICBOdW1iZXIgb2YgYnVuZGxlcyB3aXRob3V0IGFuIEVjbGlwc2UtU291cmNlUmVmZXJlbmNlczogIiArIHdpdGhvdXRFU3Muc2l6ZSgpKTsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oKTsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oKTsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oIiAgQnVuZGxlcyB3aXRoIEVjbGlwc2UtU291cmNlUmVmZXJlbmNlcyAodG90YWw6ICIgKyB0b3RhbENvdW50KHdpdGhFcykgKyAiKSIpOwogICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigpOwogICAgICAgICAgICBDb2xsZWN0aW9uIGFsbEVTcyA9IHdpdGhFcy5rZXlTZXQoKTsKICAgICAgICAgICAgTGlzdCBhbGxFU0xpc3QgPSBuZXcgQXJyYXlMaXN0KGFsbEVTcyk7CiAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoYWxsRVNMaXN0KTsKICAgICAgICAgICAgZm9yIChPYmplY3Qgb2JqZWN0IDogYWxsRVNMaXN0KSB7CiAgICAgICAgICAgICAgICAvL0ludGVnZXIgY291bnQgPSAoSW50ZWdlcikgd2l0aEVzLmdldChvYmplY3QpOwogICAgICAgICAgICAgICAgLy9yZXBvcnRXcml0ZXIud3JpdGVsbigiICAgIiArIGNvdW50LmludFZhbHVlKCkgKyAiICAiICsgb2JqZWN0KTsKICAgICAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCIgICAiICsgb2JqZWN0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigpOwogICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigpOwogICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigiICAgIEJ1bmRsZXMgd2l0aG91dCBhbiBFY2xpcHNlLVNvdXJjZVJlZmVyZW5jZXMgKHRvdGFsOiAiICsgd2l0aG91dEVTcy5zaXplKCkgKyAiKSIpOwogICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHdpdGhvdXRFU3MpOwogICAgICAgICAgICBmb3IgKE9iamVjdCBvYmplY3QgOiB3aXRob3V0RVNzKSB7CiAgICAgICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigiICAgICAgICIgKyBvYmplY3QpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCk7CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICByZXBvcnRXcml0ZXIuY2xvc2UoKTsKICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSBpbnQgdG90YWxDb3VudChNYXAgYnVuZGxlc1dpdGhFcykgewoKICAgICAgICBDb2xsZWN0aW9uIGFsbENvdW50cyA9IGJ1bmRsZXNXaXRoRXMudmFsdWVzKCk7CiAgICAgICAgaW50IHRvdGFsID0gMDsKICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWxsQ291bnRzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKICAgICAgICAgICAgSW50ZWdlciBjb3VudCA9IChJbnRlZ2VyKSBpdGVyYXRvci5uZXh0KCk7CiAgICAgICAgICAgIHRvdGFsID0gdG90YWwgKyBjb3VudC5pbnRWYWx1ZSgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdG90YWw7CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIHRyYWNrT21pc3Npb25zKExpc3QgYnVuZGxlc1dpdGhvdXRFcywgRmlsZSBjaGlsZCkgewogICAgICAgIGJ1bmRsZXNXaXRob3V0RXMuYWRkKGNoaWxkLmdldE5hbWUoKSk7CgogICAgfQoKCiAgICBwcml2YXRlIHZvaWQgaW5jcmVtZW50Q291bnRzKE1hcCBlc01hcCwgU3RyaW5nIGVzKSB7CiAgICAgICAgSW50ZWdlciBjb3VudCA9IChJbnRlZ2VyKSBlc01hcC5nZXQoZXMpOwogICAgICAgIGlmIChjb3VudCA9PSBudWxsKSB7CiAgICAgICAgICAgIGVzTWFwLnB1dChlcywgbmV3IEludGVnZXIoMSkpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZXNNYXAucHV0KGVzLCBpbmNyZW1lbnQoY291bnQpKTsKICAgICAgICB9CgogICAgfQoKICAgIHByaXZhdGUgSW50ZWdlciBpbmNyZW1lbnQoSW50ZWdlciBjb3VudCkgewogICAgICAgIHJldHVybiBuZXcgSW50ZWdlcihjb3VudC5pbnRWYWx1ZSgpICsgMSk7CiAgICB9CgoKCiAgICBwcml2YXRlIFN0cmluZyBnZXRCdW5kbGVOYW1lKFN0cmluZyBmdWxsbmFtZSkgewogICAgICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwogICAgICAgIGJvb2xlYW4gcGFyc2FibGUgPSBuYW1lUGFyc2VyLnBhcnNlKGZ1bGxuYW1lKTsKICAgICAgICBpZiAocGFyc2FibGUpIHsKICAgICAgICAgICAgcmVzdWx0ID0gbmFtZVBhcnNlci5nZXRQcm9qZWN0U3RyaW5nKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgLyoKICAgICAqIFJldHVybiB0aGUgYnVuZGxlIGlkIGZyb20gdGhlIG1hbmlmZXN0IHBvaW50ZWQgdG8gYnkgdGhlIGdpdmVuIGlucHV0CiAgICAgKiBzdHJlYW0uCiAgICAgKi8KICAgIHByaXZhdGUgU3RyaW5nIGdldEVTRnJvbU1hbmlmZXN0KElucHV0U3RyZWFtIGlucHV0LCBTdHJpbmcgcGF0aCkgewogICAgICAgIFN0cmluZyBlcyA9IG51bGw7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgTWFwIGF0dHJpYnV0ZXMgPSBNYW5pZmVzdEVsZW1lbnQucGFyc2VCdW5kbGVNYW5pZmVzdChpbnB1dCwgbnVsbCk7CiAgICAgICAgICAgIGVzID0gKFN0cmluZykgYXR0cmlidXRlcy5nZXQoUFJPUEVSVFlfRUNMSVBTRV9TT1VSQ0VSRUZFUkVOQ0VTKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBpbnB1dC5jbG9zZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGVzOwogICAgfQoKICAgIC8qCiAgICAgKiBUaGUgZ2l2ZW4gZmlsZSBwb2ludHMgdG8gYSBidW5kbGUgY29udGFpbmVkIGluIGFuIGFyY2hpdmUuIExvb2sgaW50bwogICAgICogdGhlIGJ1bmRsZSBtYW5pZmVzdCBmaWxlIHRvIGZpbmQgdGhlIGJ1bmRsZSBpZGVudGlmaWVyLgogICAgICovCiAgICBwcml2YXRlIFN0cmluZyBnZXRFU0Zyb21KQVIoRmlsZSBmaWxlKSB7CiAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXQgPSBudWxsOwogICAgICAgIEphckZpbGUgamFyID0gbnVsbDsKICAgICAgICB0cnkgewogICAgICAgICAgICBqYXIgPSBuZXcgSmFyRmlsZShmaWxlLCBmYWxzZSwgWmlwRmlsZS5PUEVOX1JFQUQpOwogICAgICAgICAgICBKYXJFbnRyeSBlbnRyeSA9IGphci5nZXRKYXJFbnRyeShKYXJGaWxlLk1BTklGRVNUX05BTUUpOwogICAgICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgLy8gYWRkRXJyb3IoIkJ1bmRsZSBkb2VzIG5vdCBjb250YWluIGEgTUFOSUZFU1QuTUYgZmlsZTogIiArCiAgICAgICAgICAgICAgICAvLyBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlucHV0ID0gamFyLmdldElucHV0U3RyZWFtKGVudHJ5KTsKICAgICAgICAgICAgcmV0dXJuIGdldEVTRnJvbU1hbmlmZXN0KGlucHV0LCBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICAgICAgLy8gYWRkRXJyb3IoZS5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlucHV0LmNsb3NlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChqYXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBqYXIuY2xvc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QnVuZGxlRGlyZWN0b3J5KCkgewogICAgICAgIGlmIChidW5kbGVEaXJlY3RvcnkgPT0gbnVsbCkgewogICAgICAgICAgICBTdHJpbmcgcHJvcGVydHkgPSBnZXREaXJlY3RvcnlUb0NoZWNrKCk7CiAgICAgICAgICAgIGlmIChwcm9wZXJ0eSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5lZWQgdG8gc2V0IGlucHV0IGRpcmVjdG9yeSB0byBjaGVjayBhZ2FpbnN0LiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5lbmRzV2l0aCgiLyIpKSB7CiAgICAgICAgICAgICAgICBidW5kbGVEaXJlY3RvcnkgPSBwcm9wZXJ0eSArICJhZ2dyZWdhdGUvcGx1Z2lucyI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBidW5kbGVEaXJlY3RvcnkgPSBwcm9wZXJ0eSArICIvYWdncmVnYXRlL3BsdWdpbnMiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBidW5kbGVEaXJlY3Rvcnk7CiAgICB9Cgp9ClBLAwQKAAAAAABvWAo/+C37mAhJAAAISQAAMAAAAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvamFycy9UZXN0TGF5b3V0VGVzdC5jbGFzc8r+ur4AAAAxArIHAAIBACpvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvVGVzdExheW91dFRlc3QHAAQBABBqYXZhL2xhbmcvT2JqZWN0AQANRVhURU5TSU9OX0pBUgEAEkxqYXZhL2xhbmcvU3RyaW5nOwEADUNvbnN0YW50VmFsdWUIAAkBAAQuamFyAQAURVhURU5TSU9OX1BBQ0VLRF9KQVIIAAwBAAgucGFjay5negEADUVYVEVOU0lPTl9aSVAIAA8BAAQuemlwAQASUFJPUEVSVFlfQlVORExFX0lECAASAQATQnVuZGxlLVN5bWJvbGljTmFtZQEADmNvbmZpZ0ZpbGVuYW1lAQAPS0VZX0RGVF9CSU5fSkFSCAAWAQASZGVmYXVsdC5iaW5hcnkuamFyAQAPS0VZX0RGVF9TUkNfSkFSCAAZAQASZGVmYXVsdC5zb3VyY2UuamFyAQAPS0VZX0RGVF9GRUFUVVJFCAAcAQAPZGVmYXVsdC5mZWF0dXJlAQAGY29uZmlnAQAWTGphdmEvdXRpbC9Qcm9wZXJ0aWVzOwEABmVycm9ycwEAEExqYXZhL3V0aWwvTGlzdDsBABBkaXJlY3RvcnlUb0NoZWNrAQAOdGVtcFdvcmtpbmdEaXIBAA9vdXRwdXREaXJlY3RvcnkBAAxyZXBvcnRXcml0ZXIBACtMb3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9SZXBvcnRXcml0ZXI7AQAGPGluaXQ+AQADKClWAQAEQ29kZQoAAwAqDAAmACcIACwBABFjb25maWcucHJvcGVydGllcwkAAQAuDAATAAYHADABABNqYXZhL3V0aWwvQXJyYXlMaXN0CgAvACoJAAEAMwwAHwAgAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAEdGhpcwEALExvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvVGVzdExheW91dFRlc3Q7AQAEbWFpbgEAFihbTGphdmEvbGFuZy9TdHJpbmc7KVYKAAEAKggAPAEAC0Q6XHRlbXB0ZXN0CgABAD4MAD8AQAEAE3NldERpcmVjdG9yeVRvQ2hlY2sBABUoTGphdmEvbGFuZy9TdHJpbmc7KVYIAEIBAAdEOi90ZW1wCgABAEQMAEUAQAEAEXNldFRlbXBXb3JraW5nRGlyCgABAEcMAEgASQEACnRlc3RMYXlvdXQBAAMoKVoKAEsATQcATAEAE2phdmEvaW8vSU9FeGNlcHRpb24MAE4AJwEAD3ByaW50U3RhY2tUcmFjZQEABGFyZ3MBABNbTGphdmEvbGFuZy9TdHJpbmc7AQAKdGVzdGxheW91dAEAAWUBABVMamF2YS9pby9JT0V4Y2VwdGlvbjsBAAhhZGRFcnJvcgsAVgBYBwBXAQAOamF2YS91dGlsL0xpc3QMAFkAWgEAA2FkZAEAFShMamF2YS9sYW5nL09iamVjdDspWgEAB21lc3NhZ2UBAApFeGNlcHRpb25zCgABAF4MAF8AYAEAD2dldFJlcG9ydFdyaXRlcgEALSgpTG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvUmVwb3J0V3JpdGVyOwgAYgEAL0NoZWNrIGZpbGVzIGFuZCBsYXlvdXQgaW4gYnVuZGxlcyBhbmQgZmVhdHVyZXMuCgBkAGYHAGUBAClvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL1JlcG9ydFdyaXRlcgwAZwBAAQAHd3JpdGVsbgoAAQBpDABqAEkBABF0ZXN0RmVhdHVyZUxheW91dAoAAQBsDABtAEkBABB0ZXN0QnVuZGxlTGF5b3V0CgBkAG8MAHAAJwEABWNsb3NlAQAGcmVzdWx0AQABWgEAD2ZlYXR1cmVGYWlsdXJlcwEADmJ1bmRsZUZhaWx1cmVzCgABAHYMAHcAeAEAE2dldERpcmVjdG9yeVRvQ2hlY2sBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwcAegEAI29yZy9hcGFjaGUvdG9vbHMvYW50L0J1aWxkRXhjZXB0aW9uCAB8AQAtTmVlZCB0byBzZXQgaW5wdXQgZGlyZWN0b3J5IHRvIGNoZWNrIGFnYWluc3QuCgB5AH4MACYAQAgAgAEAAS8KAIIAhAcAgwEAEGphdmEvbGFuZy9TdHJpbmcMAIUAhgEACGVuZHNXaXRoAQAVKExqYXZhL2xhbmcvU3RyaW5nOylaBwCIAQAXamF2YS9sYW5nL1N0cmluZ0J1aWxkZXIKAIIAigwAiwCMAQAHdmFsdWVPZgEAJihMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9TdHJpbmc7CgCHAH4IAI8BABFhZ2dyZWdhdGUvcGx1Z2lucwoAhwCRDACSAJMBAAZhcHBlbmQBAC0oTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsKAIcAlQwAlgB4AQAIdG9TdHJpbmcIAJgBABIvYWdncmVnYXRlL3BsdWdpbnMHAJoBAAxqYXZhL2lvL0ZpbGUKAJkAfgoAmQCdDACeAEkBAAZleGlzdHMKAJkAoAwAoQBJAQALaXNEaXJlY3RvcnkIAKMBABJidW5kbGUgZGlyZWNvdHJ5ICgIAKUBACApIG11c3QgYmUgYW4gZXhpc3RpbmcgZGlyZWN0b3J5LgcApwEALm9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvSkFSRmlsZU5hbWVGaWx0ZXIKAKYAKgoAmQCqDACrAKwBAAlsaXN0RmlsZXMBACkoTGphdmEvaW8vRmlsZW5hbWVGaWx0ZXI7KVtMamF2YS9pby9GaWxlOwoAAQCuDACvALABAAtnZXRCdW5kbGVJZAEAIihMamF2YS9pby9GaWxlOylMamF2YS9sYW5nL1N0cmluZzsIALIBAAcuc291cmNlCAC0AQAILmluZm9wb3AIALYBAAkuZG9jLnVzZXIIALgBAAQuZG9jCAC6AQAILmRvYy5pc3YIALwBAAguZG9jLmRldggAvgEACC5kb2MuYXBpCADAAQAQc3RhbmRhcmQuc2NoZW1hcwgAwgEACS5icmFuZGluZwoAAQDEDADFAMYBAAtnZXRFeHBlY3RlZAEAJChMamF2YS9sYW5nL1N0cmluZztaKUxqYXZhL3V0aWwvU2V0OwoAAQDIDADJAMoBAA1wcm9jZXNzQnVuZGxlAQAgKExqYXZhL2lvL0ZpbGU7TGphdmEvdXRpbC9TZXQ7KVYKAGQAzAwAZwAnCADOAQANICAgQ2hlY2tpbmc6IAgA0AEACyAgIENoZWNrZWQgCgCHANIMAJIA0wEAHChJKUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsIANUBAAQgb2YgCADXAQABLggA2QEAESAgIEVycm9ycyBmb3VuZDogCwBWANsMANwA3QEABHNpemUBAAMoKUkKAN8A4QcA4AEAFWphdmEvdXRpbC9Db2xsZWN0aW9ucwwA4gDjAQAEc29ydAEAEyhMamF2YS91dGlsL0xpc3Q7KVYLAFYA5QwA5gDnAQAIaXRlcmF0b3IBABYoKUxqYXZhL3V0aWwvSXRlcmF0b3I7CwDpAOsHAOoBABJqYXZhL3V0aWwvSXRlcmF0b3IMAOwA7QEABG5leHQBABQoKUxqYXZhL2xhbmcvT2JqZWN0OwoAZADvDABnAPABABUoTGphdmEvbGFuZy9PYmplY3Q7KVYLAOkA8gwA8wBJAQAHaGFzTmV4dAEAD2ZhaWx1cmVzT2NjdXJlZAEACHByb3BlcnR5AQAPYnVuZGxlRGlyZWN0b3J5AQAIaW5wdXRkaXIBAA5MamF2YS9pby9GaWxlOwEACGNoaWxkcmVuAQAPW0xqYXZhL2lvL0ZpbGU7AQAJdG90YWxzaXplAQABSQEAB2NoZWNrZWQBAAFpAQAFY2hpbGQBAAJpZAEABGl0ZXIBABRMamF2YS91dGlsL0l0ZXJhdG9yOwkAAQEEDAAdAB4KAAEBBgwBBwAnAQAJZ2V0Q29uZmlnCgEJAQsHAQoBABRqYXZhL3V0aWwvUHJvcGVydGllcwwBDAENAQALZ2V0UHJvcGVydHkBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwgBDwEAHVVuYWJsZSB0byBsb2FkIHNldHRpbmdzIGZvcjogBwERAQARamF2YS91dGlsL0hhc2hTZXQKARAAKgcBFAEAGWphdmEvdXRpbC9TdHJpbmdUb2tlbml6ZXIIARYBAAEsCgETARgMACYBGQEAJyhMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspVgoBEwEbDAEcAHgBAAluZXh0VG9rZW4KAIIBHgwBHwB4AQAEdHJpbQsBIQBYBwEiAQANamF2YS91dGlsL1NldAoBEwEkDAElAEkBAA1oYXNNb3JlVG9rZW5zAQAGc291cmNlAQAEbGluZQEAD0xqYXZhL3V0aWwvU2V0OwEACXRva2VuaXplcgEAG0xqYXZhL3V0aWwvU3RyaW5nVG9rZW5pemVyOwEAEmdldEZlYXR1cmVFeHBlY3RlZAEAJShMamF2YS9sYW5nL1N0cmluZztaWilMamF2YS91dGlsL1NldDsBAAN6aXAKAQkAKgoAAQEwDAExAHgBABFnZXRDb25maWdGaWxlbmFtZQcBMwEAF2phdmEvaW8vRmlsZUlucHV0U3RyZWFtCgEyATUMACYBNgEAEShMamF2YS9pby9GaWxlOylWCgADATgMATkBOgEACGdldENsYXNzAQATKClMamF2YS9sYW5nL0NsYXNzOwoBPAE+BwE9AQAPamF2YS9sYW5nL0NsYXNzDAE/AUABABNnZXRSZXNvdXJjZUFzU3RyZWFtAQApKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9pby9JbnB1dFN0cmVhbTsIAUIBACJVbmFibGUgdG8gbG9hZCBjb25maWd1cmF0aW9uIGZpbGUuCgEJAUQMAUUBRgEABGxvYWQBABgoTGphdmEvaW8vSW5wdXRTdHJlYW07KVYKAUgAbwcBSQEAE2phdmEvaW8vSW5wdXRTdHJlYW0BAAVpbnB1dAEAFUxqYXZhL2lvL0lucHV0U3RyZWFtOwEACmNvbmZpZ0ZpbGULASEA2wsBIQFPDAFQAVEBAAd0b0FycmF5AQAoKFtMamF2YS9sYW5nL09iamVjdDspW0xqYXZhL2xhbmcvT2JqZWN0OwcAUAgBVAEAAAoAAQFWDAFXAVgBAApwcm9jZXNzRGlyAQA2KExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2lvL0ZpbGU7W0xqYXZhL2xhbmcvU3RyaW5nOylWCAFaAQAITWlzc2luZyAIAVwBAAkgaW4gZGlyOiAKAJkBXgwBXwB4AQAPZ2V0QWJzb2x1dGVQYXRoCgABAWEMAFQAQAoAAQFjDAFkAWUBAA5wcm9jZXNzQXJjaGl2ZQEAJChMamF2YS9pby9GaWxlO1tMamF2YS9sYW5nL1N0cmluZzspVgEABGZpbGUBAAhleHBlY3RlZAEABWFycmF5AQAOcHJvY2Vzc0ZlYXR1cmUHAWsBABVqYXZhL3V0aWwvemlwL1ppcEZpbGUKAWoBbQwAJgFuAQASKExqYXZhL2lvL0ZpbGU7SSlWCgFqAXAMAXEBcgEAB2VudHJpZXMBABkoKUxqYXZhL3V0aWwvRW51bWVyYXRpb247CwF0AXYHAXUBABVqYXZhL3V0aWwvRW51bWVyYXRpb24MAXcA7QEAC25leHRFbGVtZW50BwF5AQAWamF2YS91dGlsL3ppcC9aaXBFbnRyeQoBeAF7DAF8AHgBAAdnZXROYW1lCgCCAX4MAX8AhgEAB21hdGNoZXMKAYEATQcBggEAJmphdmEvdXRpbC9yZWdleC9QYXR0ZXJuU3ludGF4RXhjZXB0aW9uCwF0AYQMAYUASQEAD2hhc01vcmVFbGVtZW50cwgBhwEACiBpbiBmaWxlOiAKAJkBewoBagBvAQAXTGphdmEvdXRpbC96aXAvWmlwRmlsZTsBABdMamF2YS91dGlsL0VudW1lcmF0aW9uOwEABWVudHJ5AQAYTGphdmEvdXRpbC96aXAvWmlwRW50cnk7AQAEbmFtZQEAB3BhdHRlcm4BAAJleAEAKExqYXZhL3V0aWwvcmVnZXgvUGF0dGVyblN5bnRheEV4Y2VwdGlvbjsKAJkBkwwAqwGUAQARKClbTGphdmEvaW8vRmlsZTsKAIIBlgwBlwDdAQAGbGVuZ3RoCgCHAZkMAJIBmgEAHChDKUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsKAYEBnAwBnQB4AQAKZ2V0TWVzc2FnZQEABHJvb3QBAANkaXIBAAVpbmRleAEAF2dldEJ1bmRsZUlkRnJvbU1hbmlmZXN0AQA7KExqYXZhL2lvL0lucHV0U3RyZWFtO0xqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZzsKAaQBpgcBpQEAJW9yZy9lY2xpcHNlL29zZ2kvdXRpbC9NYW5pZmVzdEVsZW1lbnQMAacBqAEAE3BhcnNlQnVuZGxlTWFuaWZlc3QBADUoTGphdmEvaW8vSW5wdXRTdHJlYW07TGphdmEvdXRpbC9NYXA7KUxqYXZhL3V0aWwvTWFwOwsBqgGsBwGrAQANamF2YS91dGlsL01hcAwBrQGuAQADZ2V0AQAmKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsIAbABADpCdW5kbGVTeW1ib2xpY05hbWUgaGVhZGVyIG5vdCBzZXQgaW4gbWFuaWZlc3QgZm9yIGJ1bmRsZTogCgCCAbIMAbMBtAEAB2luZGV4T2YBAAQoSSlJCgCCAbYMAbcBuAEACXN1YnN0cmluZwEAFihJSSlMamF2YS9sYW5nL1N0cmluZzsKAboBnAcBuwEAIm9yZy9vc2dpL2ZyYW1ld29yay9CdW5kbGVFeGNlcHRpb24KAEsBnAEABHBhdGgBAAphdHRyaWJ1dGVzAQAPTGphdmEvdXRpbC9NYXA7AQADcG9zAQAkTG9yZy9vc2dpL2ZyYW1ld29yay9CdW5kbGVFeGNlcHRpb247CgABAcMMAcQAsAEAEmdldEJ1bmRsZUlkRnJvbURpcgoAggHGDAHHAHgBAAt0b0xvd2VyQ2FzZQoAAQHJDAHKALABABJnZXRCdW5kbGVJZEZyb21aSVAKAAEBzAwBzQCwAQASZ2V0QnVuZGxlSWRGcm9tSkFSCgFqATUIAdABABheLiovTUVUQS1JTkYvTUFOSUZFU1QuTUYKAWoB0gwB0wHUAQAOZ2V0SW5wdXRTdHJlYW0BAC8oTGphdmEvdXRpbC96aXAvWmlwRW50cnk7KUxqYXZhL2lvL0lucHV0U3RyZWFtOwoAAQHWDAGhAaIIAdgBADNCdW5kbGUgbWFuaWZlc3QgKE1BTklGRVNULk1GKSBub3QgZm91bmQgaW4gYnVuZGxlOiAIAdoBABRNRVRBLUlORi9NQU5JRkVTVC5NRgoAmQHcDAAmAd0BACMoTGphdmEvaW8vRmlsZTtMamF2YS9sYW5nL1N0cmluZzspVgoAmQHfDAHgAEkBAAZpc0ZpbGUIAeIBACxCdW5kbGUgbWFuaWZlc3QgKE1BTklGRVNULk1GKSBub3QgZm91bmQgYXQ6IAoB5AGcBwHlAQAdamF2YS9pby9GaWxlTm90Rm91bmRFeGNlcHRpb24BAAxtYW5pZmVzdEZpbGUBAB9MamF2YS9pby9GaWxlTm90Rm91bmRFeGNlcHRpb247AQAUZ2V0RmlsZUZyb21QQUNLRURKQVIBAB4oTGphdmEvaW8vRmlsZTspTGphdmEvaW8vRmlsZTsKAesB7QcB7AEARW9yZy9lY2xpcHNlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2VxdWlub3gvcDIvamFycHJvY2Vzc29yL0phclByb2Nlc3NvcgwB7gHvAQASZ2V0VW5wYWNrUHJvY2Vzc29yAQBfKExqYXZhL3V0aWwvUHJvcGVydGllczspTG9yZy9lY2xpcHNlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2VxdWlub3gvcDIvamFycHJvY2Vzc29yL0phclByb2Nlc3NvcjsKAAEB8QwB8gB4AQARZ2V0VGVtcFdvcmtpbmdEaXIKAesB9AwB9QBAAQATc2V0V29ya2luZ0RpcmVjdG9yeQoB6wH3DAH4AekBAApwcm9jZXNzSmFyAQAGdG1wamFyAQAMamFycHJvY2Vzc29yAQBHTG9yZy9lY2xpcHNlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2VxdWlub3gvcDIvamFycHJvY2Vzc29yL0phclByb2Nlc3NvcjsJAAEB/QwAIQAGAQAQYnVuZGxlRGlyVG9DaGVjawEAEXNldENvbmZpZ0ZpbGVuYW1lBwIBAQAVamF2YS91dGlsL2phci9KYXJGaWxlCgIAAgMMACYCBAEAEyhMamF2YS9pby9GaWxlO1pJKVYKAgACBgwCBwIIAQALZ2V0SmFyRW50cnkBACwoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL3V0aWwvamFyL0phckVudHJ5OwgCCgEALEJ1bmRsZSBkb2VzIG5vdCBjb250YWluIGEgTUFOSUZFU1QuTUYgZmlsZTogCgIAAG8KAgAB0gEAA2phcgEAF0xqYXZhL3V0aWwvamFyL0phckZpbGU7AQAYTGphdmEvdXRpbC9qYXIvSmFyRW50cnk7CQABAhEMACIABggCEwEAEmFnZ3JlZ2F0ZS9mZWF0dXJlcwgCFQEAEy9hZ2dyZWdhdGUvZmVhdHVyZXMIAhcBABNmZWF0dXJlIGRpcmVjb3RyeSAoCgABAhkMAegB6QoAAQIbDAIcALABAAxnZXRGZWF0dXJlSWQKAAECHgwBKwEsCgABAiAMAWkAygEAEGZhaWx1cmVzT2NjdXJyZWQBABBmZWF0dXJlRGlyZWN0b3J5CgABAiQMAiUAsAEAE2dldEZlYXR1cmVJZEZyb21EaXIKAAECJwwCKACwAQATZ2V0RmVhdHVyZUlkRnJvbUpBUggCKgEAC2ZlYXR1cmUueG1sCAIsAQAxRmVhdHVyZSBqYXIgZG9lcyBub3QgY29udGFpbiBhIGZlYXR1cmUueG1sIGZpbGU6IAoAAQIuDAIvAjABABhnZXRGZWF0dXJlRnJvbUZlYXR1cmVYTUwBACkoTGphdmEvaW8vSW5wdXRTdHJlYW07KUxqYXZhL2xhbmcvU3RyaW5nOwoCMgGcBwIzAQAuamF2YXgveG1sL3BhcnNlcnMvUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgoCNQGcBwI2AQAYb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uAQAwTGphdmF4L3htbC9wYXJzZXJzL1BhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247AQAaTG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsIAjoBABpGZWF0dXJlLnhtbCBub3QgZm91bmQgYXQ6IAoAAQI8DAIvALABAAtmZWF0dXJlRmlsZQoAAQI/DAJAAkEBAAZnZXRET00BACYoTGphdmEvaW8vRmlsZTspTG9yZy93M2MvZG9tL0RvY3VtZW50OwoAAQJDDAJEAkUBABNnZXRGZWF0dXJlSWRGcm9tRE9NAQAqKExvcmcvdzNjL2RvbS9Eb2N1bWVudDspTGphdmEvbGFuZy9TdHJpbmc7AQAIZG9jdW1lbnQBABZMb3JnL3czYy9kb20vRG9jdW1lbnQ7CAJJAQAHZmVhdHVyZQsCSwJNBwJMAQAUb3JnL3czYy9kb20vRG9jdW1lbnQMAk4CTwEAFGdldEVsZW1lbnRzQnlUYWdOYW1lAQAqKExqYXZhL2xhbmcvU3RyaW5nOylMb3JnL3czYy9kb20vTm9kZUxpc3Q7CwJRAlMHAlIBABRvcmcvdzNjL2RvbS9Ob2RlTGlzdAwCVADdAQAJZ2V0TGVuZ3RoCwJRAlYMAlcCWAEABGl0ZW0BABUoSSlMb3JnL3czYy9kb20vTm9kZTsHAloBABNvcmcvdzNjL2RvbS9FbGVtZW50CwJZAlwMAl0CXgEADWdldEF0dHJpYnV0ZXMBABwoKUxvcmcvdzNjL2RvbS9OYW1lZE5vZGVNYXA7CAEACwJhAmMHAmIBABhvcmcvdzNjL2RvbS9OYW1lZE5vZGVNYXAMAmQCZQEADGdldE5hbWVkSXRlbQEAJihMamF2YS9sYW5nL1N0cmluZzspTG9yZy93M2MvZG9tL05vZGU7CwJnAmkHAmgBABBvcmcvdzNjL2RvbS9Ob2RlDAJqAHgBAAxnZXROb2RlVmFsdWUBAA9mZWF0dXJlRWxlbWVudHMBABZMb3JnL3czYy9kb20vTm9kZUxpc3Q7AQAOZmVhdHVyZUVsZW1lbnQBABVMb3JnL3czYy9kb20vRWxlbWVudDsBAAtmZWF0dXJlTm9kZQEAEkxvcmcvdzNjL2RvbS9Ob2RlOwEADWFOYW1lZE5vZGVNYXABABpMb3JnL3czYy9kb20vTmFtZWROb2RlTWFwOwEAC2lkQXR0cmlidXRlCgABAnUMAkACdgEALShMamF2YS9pby9JbnB1dFN0cmVhbTspTG9yZy93M2MvZG9tL0RvY3VtZW50OwEABnN0cmVhbQcCeQEAFmphdmEvaW8vQnVmZmVyZWRSZWFkZXIHAnsBABJqYXZhL2lvL0ZpbGVSZWFkZXIKAnoBNQoCeAJ+DAAmAn8BABMoTGphdmEvaW8vUmVhZGVyOylWBwKBAQAXb3JnL3htbC9zYXgvSW5wdXRTb3VyY2UKAoACfgoChAKGBwKFAQAoamF2YXgveG1sL3BhcnNlcnMvRG9jdW1lbnRCdWlsZGVyRmFjdG9yeQwChwKIAQALbmV3SW5zdGFuY2UBACwoKUxqYXZheC94bWwvcGFyc2Vycy9Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwoChAKKDAKLAowBABJuZXdEb2N1bWVudEJ1aWxkZXIBACUoKUxqYXZheC94bWwvcGFyc2Vycy9Eb2N1bWVudEJ1aWxkZXI7CgKOApAHAo8BACFqYXZheC94bWwvcGFyc2Vycy9Eb2N1bWVudEJ1aWxkZXIMApECkgEABXBhcnNlAQAxKExvcmcveG1sL3NheC9JbnB1dFNvdXJjZTspTG9yZy93M2MvZG9tL0RvY3VtZW50OwoCNQBNCgJ4AG8KAjIATQgClwEALkVycm9yOiBjb3VsZCBub3QgcGFyc2UgeG1sIGluIGNsYXNzcGF0aCBmaWxlOiABAAlhRG9jdW1lbnQBAAZyZWFkZXIBABhMamF2YS9pby9CdWZmZXJlZFJlYWRlcjsBAAtpbnB1dFNvdXJjZQEAGUxvcmcveG1sL3NheC9JbnB1dFNvdXJjZTsBAAdmYWN0b3J5AQAqTGphdmF4L3htbC9wYXJzZXJzL0RvY3VtZW50QnVpbGRlckZhY3Rvcnk7AQAHYnVpbGRlcgEAI0xqYXZh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AlkBeQJaAYcCWwGVAloBnwJdAaECXwA1AAAAegAMAAABowA2ADcAAAANAZYCIQByAAEAEgGRAPUABgACACIBgQIiAAYAAwBiAUEA9wD4AAQAngEFAPkA+gAFAKMBAAD7APwABgCmAP0A/QD8AAcAqQBZAP4A/AAIALMARAD/APgACQDYAB8BAAAGAAoBhAAbAQEBAgAIAAICHACwAAEAKAAAAHsAAgADAAAAKQFNK7YAn5kADCortwIjTacAGCu2AYi2AcUSCLYAgZkACSortwImTSywAAAAAgA0AAAAGgAGAAACZAACAmUACQJmABICaAAhAmkAJwJrADUAAAAgAAMAAAApADYANwAAAAAAKQFmAPgAAQACACcBAAAGAAIAAgIoALAAAQAoAAACswAFAAgAAAD9AU0BTgE6BLsCAFkrAwS3AgJOLRMCKbYCBToFGQXHABsquwCHWRMCK7cAjSu2AV22AJC2AJS3AWAtGQW2AgxNKiy3Ai06BKcAmjoFKhkFtgG8twFgLMYADCy2AUenAAU6By3GAJgttgILpwCROgenAIw6BSoZBbYCMbcBYCzGAAwstgFHpwAFOgctxgBwLbYCC6cAaToHpwBkOgUqGQW2AjS3AWAsxgAMLLYBR6cABToHLcYASC22AgunAEE6B6cAPDoGLMYADCy2AUenAAU6By3GAAwttgILpwAFOgcZBr8sxgAMLLYBR6cABToHLcYADC22AgunAAU6BxkEsAAQAAcARgBJAEsAWABcAF8ASwBlAGkAbABLAAcARgBxAjIAgACEAIcASwCNAJEAlABLAAcARgCZAjUAqACsAK8ASwC1ALkAvABLAAcAVADBAAAAcQB8AMEAAACZAKQAwQAAAMcAywDOAEsA1ADYANsASwDkAOgA6wBLAPEA9QD4AEsAAgA0AAAAwgAwAAACbwACAnAABAJxAAcCcwASAnQAGwJ1ACACdgA4AngAPwJ5AEkCewBLAn0AVAKGAFgCiABfAooAYQKOAGUCkABsApIAcQJ/AHMCgAB8AoYAgAKIAIcCigCJAo4AjQKQAJQCkgCZAoIAmwKDAKQChgCoAogArwKKALECjgC1ApAAvAKSAMEChQDDAoYAxwKIAM4CigDQAo4A1AKQANsCkgDdApYA4AKGAOQCiADrAooA7QKOAPECkAD4ApIA+gKXADUAAABc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KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCiAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCiAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAogKiAKICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICogVGhpcyBmaWxlIG9yaWdpbmFsbHkgY2FtZSBmcm9tICdFY2xpcHNlIE9yYml0JyBwcm9qZWN0IHRoZW4gYWRhcHRlZCB0byB1c2UgCiAqIGluIFdUUCBhbmQgaW1wcm92ZWQgdG8gdXNlICdNYW5pZmVzdCcgdG8gcmVhZCBtYW5pZmVzdC5tZiwgaW5zdGVhZCBvZiByZWFkaW5nIAogKiBpdCBhcyBhIHByb3BlcnRpZXMgZmlsZS4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS5qdW5vLnRlc3RzLmphcnM7CgppbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKaW1wb3J0IGphdmEuaW8uRmlsZTsKaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwppbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CmltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CmltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwppbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CmltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CmltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKaW1wb3J0IGphdmEudXRpbC5MaXN0OwppbXBvcnQgamF2YS51dGlsLk1hcDsKaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwppbXBvcnQgamF2YS51dGlsLlNldDsKaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CmltcG9ydCBqYXZhLnV0aWwuamFyLkphckVudHJ5OwppbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOwppbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm5TeW50YXhFeGNlcHRpb247CmltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwppbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwoKaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7CmltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwoKaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwppbXBvcnQgb3JnLmVjbGlwc2UuanVuby50ZXN0cy5qYXJzLlRlc3RMYXlvdXRUZXN0OwppbXBvcnQgb3JnLmVjbGlwc2UuanVuby50ZXN0cy51dGlscy5KQVJGaWxlTmFtZUZpbHRlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmp1bm8udGVzdHMudXRpbHMuUmVwb3J0V3JpdGVyOwppbXBvcnQgb3JnLmVjbGlwc2UuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3IuSmFyUHJvY2Vzc29yOwppbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk1hbmlmZXN0RWxlbWVudDsKaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247CmltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CmltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7CmltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwppbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7CmltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKCi8qKgogKiBAc2luY2UgMy4zCiAqLwpwdWJsaWMgY2xhc3MgVGVzdExheW91dFRlc3QgewoKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fSkFSICAgICAgICA9ICIuamFyIjsKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUEFDRUtEX0pBUiA9ICIucGFjay5neiI7CiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1pJUCAgICAgICAgPSAiLnppcCI7CiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQlVORExFX0lEICAgPSAiQnVuZGxlLVN5bWJvbGljTmFtZSI7CiAgICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICAgY29uZmlnRmlsZW5hbWUgICAgICAgPSAiY29uZmlnLnByb3BlcnRpZXMiOwogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ERlRfQklOX0pBUiAgICAgID0gImRlZmF1bHQuYmluYXJ5LmphciI7CiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RGVF9TUkNfSkFSICAgICAgPSAiZGVmYXVsdC5zb3VyY2UuamFyIjsKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfREZUX0ZFQVRVUkUgICAgICA9ICJkZWZhdWx0LmZlYXR1cmUiOwogICAgcHJpdmF0ZSBQcm9wZXJ0aWVzICAgICAgICAgIGNvbmZpZzsKICAgIHByaXZhdGUgTGlzdCAgICAgICAgICAgICAgICBlcnJvcnMgICAgICAgICAgICAgICA9IG5ldyBBcnJheUxpc3QoKTsKICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICBkaXJlY3RvcnlUb0NoZWNrOwogICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgIHRlbXBXb3JraW5nRGlyOwogICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgIG91dHB1dERpcmVjdG9yeTsKICAgIHByaXZhdGUgUmVwb3J0V3JpdGVyICAgICAgICByZXBvcnRXcml0ZXI7CgogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewoKICAgICAgICBUZXN0TGF5b3V0VGVzdCB0ZXN0bGF5b3V0ID0gbmV3IFRlc3RMYXlvdXRUZXN0KCk7CiAgICAgICAgdGVzdGxheW91dC5zZXREaXJlY3RvcnlUb0NoZWNrKCJEOlxcdGVtcHRlc3QiKTsKICAgICAgICB0ZXN0bGF5b3V0LnNldFRlbXBXb3JraW5nRGlyKCJEOi90ZW1wIik7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdGVzdGxheW91dC50ZXN0TGF5b3V0KCk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgfQoKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgYWRkRXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHsKICAgICAgICBlcnJvcnMuYWRkKG1lc3NhZ2UpOwogICAgfQoKICAgIHB1YmxpYyBib29sZWFuIHRlc3RMYXlvdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgZ2V0UmVwb3J0V3JpdGVyKCkud3JpdGVsbigiQ2hlY2sgZmlsZXMgYW5kIGxheW91dCBpbiBidW5kbGVzIGFuZCBmZWF0dXJlcy4iKTsKICAgICAgICAgICAgYm9vbGVhbiBmZWF0dXJlRmFpbHVyZXMgPSB0ZXN0RmVhdHVyZUxheW91dCgpOwogICAgICAgICAgICBib29sZWFuIGJ1bmRsZUZhaWx1cmVzID0gdGVzdEJ1bmRsZUxheW91dCgpOwogICAgICAgICAgICByZXN1bHQgPSBmZWF0dXJlRmFpbHVyZXMgfHwgYnVuZGxlRmFpbHVyZXM7CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICBnZXRSZXBvcnRXcml0ZXIoKS5jbG9zZSgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIHByaXZhdGUgYm9vbGVhbiB0ZXN0QnVuZGxlTGF5b3V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKCiAgICAgICAgZXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwogICAgICAgIGJvb2xlYW4gZmFpbHVyZXNPY2N1cmVkID0gZmFsc2U7CiAgICAgICAgU3RyaW5nIHByb3BlcnR5ID0gZ2V0RGlyZWN0b3J5VG9DaGVjaygpOwogICAgICAgIGlmIChwcm9wZXJ0eSA9PSBudWxsKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTmVlZCB0byBzZXQgaW5wdXQgZGlyZWN0b3J5IHRvIGNoZWNrIGFnYWluc3QuIik7CiAgICAgICAgfQogICAgICAgIFN0cmluZyBidW5kbGVEaXJlY3RvcnkgPSBudWxsOwogICAgICAgIGlmIChwcm9wZXJ0eS5lbmRzV2l0aCgiLyIpKSB7CiAgICAgICAgICAgIGJ1bmRsZURpcmVjdG9yeSA9IHByb3BlcnR5ICsgImFnZ3JlZ2F0ZS9wbHVnaW5zIjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGJ1bmRsZURpcmVjdG9yeSA9IHByb3BlcnR5ICsgIi9hZ2dyZWdhdGUvcGx1Z2lucyI7CiAgICAgICAgfQogICAgICAgIEZpbGUgaW5wdXRkaXIgPSBuZXcgRmlsZShidW5kbGVEaXJlY3RvcnkpOwogICAgICAgIGlmICghKGlucHV0ZGlyLmV4aXN0cygpICYmIGlucHV0ZGlyLmlzRGlyZWN0b3J5KCkpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiYnVuZGxlIGRpcmVjb3RyeSAoIiArIGJ1bmRsZURpcmVjdG9yeSArICIpIG11c3QgYmUgYW4gZXhpc3RpbmcgZGlyZWN0b3J5LiIpOwogICAgICAgIH0KICAgICAgICBGaWxlW10gY2hpbGRyZW4gPSBpbnB1dGRpci5saXN0RmlsZXMobmV3IEpBUkZpbGVOYW1lRmlsdGVyKCkpOwogICAgICAgIGludCB0b3RhbHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7CiAgICAgICAgaW50IGNoZWNrZWQgPSAwOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgRmlsZSBjaGlsZCA9IGNoaWxkcmVuW2ldOwogICAgICAgICAgICBTdHJpbmcgaWQgPSBnZXRCdW5kbGVJZChjaGlsZCk7CiAgICAgICAgICAgIGlmIChpZCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBpZiAoaWQuZW5kc1dpdGgoIi5zb3VyY2UiKSB8fCBpZC5lbmRzV2l0aCgiLmluZm9wb3AiKSB8fCBpZC5lbmRzV2l0aCgiLmRvYy51c2VyIikgfHwgaWQuZW5kc1dpdGgoIi5kb2MiKSB8fCBpZC5lbmRzV2l0aCgiLmRvYy5pc3YiKSB8fCBpZC5lbmRzV2l0aCgiLmRvYy5kZXYiKSB8fCBpZC5lbmRzV2l0aCgiLmRvYy5hcGkiKSB8fCBpZC5lbmRzV2l0aCgic3RhbmRhcmQuc2NoZW1hcyIpIHx8IGlkLmVuZHNXaXRoKCIuYnJhbmRpbmciKSkgewogICAgICAgICAgICAgICAgICAgIHByb2Nlc3NCdW5kbGUoY2hpbGQsIGdldEV4cGVjdGVkKGlkLCB0cnVlKSk7CiAgICAgICAgICAgICAgICAgICAgY2hlY2tlZCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0J1bmRsZShjaGlsZCwgZ2V0RXhwZWN0ZWQoaWQsIGZhbHNlKSk7CiAgICAgICAgICAgICAgICAgICAgY2hlY2tlZCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0KICAgICAgICBnZXRSZXBvcnRXcml0ZXIoKS53cml0ZWxuKCk7CiAgICAgICAgZ2V0UmVwb3J0V3JpdGVyKCkud3JpdGVsbigiICAgQ2hlY2tpbmc6ICIgKyBidW5kbGVEaXJlY3RvcnkpOwogICAgICAgIGdldFJlcG9ydFdyaXRlcigpLndyaXRlbG4oIiAgIENoZWNrZWQgIiArIGNoZWNrZWQgKyAiIG9mICIgKyB0b3RhbHNpemUgKyAiLiIpOwogICAgICAgIGdldFJlcG9ydFdyaXRlcigpLndyaXRlbG4oIiAgIEVycm9ycyBmb3VuZDogIiArIGVycm9ycy5zaXplKCkpOwoKICAgICAgICBpZiAoZXJyb3JzLnNpemUoKSA+IDApIHsKICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChlcnJvcnMpOwogICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlcnJvcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CiAgICAgICAgICAgICAgICBnZXRSZXBvcnRXcml0ZXIoKS53cml0ZWxuKGl0ZXIubmV4dCgpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmYWlsdXJlc09jY3VyZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFpbHVyZXNPY2N1cmVkOwogICAgfQoKICAgIC8qCiAgICAgKiBDaGVjayB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGFuZCByZXR1cm4gYSBzZXQgb2YgcmVndWxhciBleHByZXNzaW9ucwogICAgICogd2hpY2ggbWF0Y2ggdGhlIGxpc3Qgb2YgZmlsZXMgdGhhdCBhcmUgZXhwZWN0ZWQgdG8gYmUgaW4gdGhlIGJ1bmRsZS4KICAgICAqLwogICAgcHJpdmF0ZSBTZXQgZ2V0RXhwZWN0ZWQoU3RyaW5nIGlkLCBib29sZWFuIHNvdXJjZSkgewogICAgICAgIC8vIGlzIHRoZSBjb25maWcgY2FjaGVkPwogICAgICAgIGlmIChjb25maWcgPT0gbnVsbCkgewogICAgICAgICAgICBnZXRDb25maWcoKTsKICAgICAgICB9CiAgICAgICAgU3RyaW5nIGxpbmUgPSBjb25maWcuZ2V0UHJvcGVydHkoaWQpOwogICAgICAgIGlmIChsaW5lID09IG51bGwpIHsKICAgICAgICAgICAgaWYgKHNvdXJjZSkgewogICAgICAgICAgICAgICAgbGluZSA9IGNvbmZpZy5nZXRQcm9wZXJ0eShLRVlfREZUX1NSQ19KQVIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbGluZSA9IGNvbmZpZy5nZXRQcm9wZXJ0eShLRVlfREZUX0JJTl9KQVIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChsaW5lID09IG51bGwpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gbG9hZCBzZXR0aW5ncyBmb3I6ICIgKyBpZCk7CiAgICAgICAgfQogICAgICAgIFNldCByZXN1bHQgPSBuZXcgSGFzaFNldCgpOwogICAgICAgIGZvciAoU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobGluZSwgIiwiKTsgdG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKTspIHsKICAgICAgICAgICAgcmVzdWx0LmFkZCh0b2tlbml6ZXIubmV4dFRva2VuKCkudHJpbSgpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICBwcml2YXRlIFNldCBnZXRGZWF0dXJlRXhwZWN0ZWQoU3RyaW5nIGlkLCBib29sZWFuIHNvdXJjZSwgYm9vbGVhbiB6aXApIHsKICAgICAgICAvLyBpcyB0aGUgY29uZmlnIGNhY2hlZD8KICAgICAgICBpZiAoY29uZmlnID09IG51bGwpIHsKICAgICAgICAgICAgZ2V0Q29uZmlnKCk7CiAgICAgICAgfQogICAgICAgIFN0cmluZyBsaW5lID0gY29uZmlnLmdldFByb3BlcnR5KGlkKTsKICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7CiAgICAgICAgICAgIGxpbmUgPSBjb25maWcuZ2V0UHJvcGVydHkoS0VZX0RGVF9GRUFUVVJFKTsKICAgICAgICB9CiAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCkgewogICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuYWJsZSB0byBsb2FkIHNldHRpbmdzIGZvcjogIiArIGlkKTsKICAgICAgICB9CiAgICAgICAgU2V0IHJlc3VsdCA9IG5ldyBIYXNoU2V0KCk7CiAgICAgICAgZm9yIChTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihsaW5lLCAiLCIpOyB0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpOykgewogICAgICAgICAgICByZXN1bHQuYWRkKHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBnZXRDb25maWcoKSB7CiAgICAgICAgY29uZmlnID0gbmV3IFByb3BlcnRpZXMoKTsKICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dCA9IG51bGw7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgLy8gaWYgd2UgY2FuIHJlYWQgdGhpcyBmaWxlLCBpdCdzIGJlZW4gc2V0IGJ5IGNhbGxlcgogICAgICAgICAgICBGaWxlIGNvbmZpZ0ZpbGUgPSBuZXcgRmlsZShnZXRDb25maWdGaWxlbmFtZSgpKTsKICAgICAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuZXhpc3RzKCkpIHsKICAgICAgICAgICAgICAgIGlucHV0ID0gbmV3IEZpbGVJbnB1dFN0cmVhbShjb25maWdGaWxlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIGVsc2UsIHVzZSB0aGUgZGVmYXVsdCB3ZSAic2hpcCIKICAgICAgICAgICAgICAgIGlucHV0ID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oZ2V0Q29uZmlnRmlsZW5hbWUoKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChpbnB1dCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuYWJsZSB0byBsb2FkIGNvbmZpZ3VyYXRpb24gZmlsZS4iKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25maWcubG9hZChpbnB1dCk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBpbnB1dC5jbG9zZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAvLyBpZ25vcmUKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKgogICAgICogUHJvY2VzcyB0aGUgYnVuZGxlIGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24sIHdpdGggdGhlIGdpdmVuIHNldCBvZgogICAgICogZXhwZWN0ZWQgcmVzdWx0cy4KICAgICAqLwogICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NCdW5kbGUoRmlsZSBmaWxlLCBTZXQgZXhwZWN0ZWQpIHsKICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7CiAgICAgICAgICAgIFN0cmluZ1tdIGFycmF5ID0gKFN0cmluZ1tdKSBleHBlY3RlZC50b0FycmF5KG5ldyBTdHJpbmdbZXhwZWN0ZWQuc2l6ZSgpXSk7CiAgICAgICAgICAgIHByb2Nlc3NEaXIoIiIsIGZpbGUsIGFycmF5KTsKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKGFycmF5W2ldICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBhZGRFcnJvcigiTWlzc2luZyAiICsgYXJyYXlbaV0gKyAiIGluIGRpcjogIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBwcm9jZXNzQXJjaGl2ZShmaWxlLCAoU3RyaW5nW10pIGV4cGVjdGVkLnRvQXJyYXkobmV3IFN0cmluZ1tleHBlY3RlZC5zaXplKCldKSk7CiAgICAgICAgfQogICAgfQoKICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzRmVhdHVyZShGaWxlIGZpbGUsIFNldCBleHBlY3RlZCkgewogICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKICAgICAgICAgICAgU3RyaW5nW10gYXJyYXkgPSAoU3RyaW5nW10pIGV4cGVjdGVkLnRvQXJyYXkobmV3IFN0cmluZ1tleHBlY3RlZC5zaXplKCldKTsKICAgICAgICAgICAgcHJvY2Vzc0RpcigiIiwgZmlsZSwgYXJyYXkpOwogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAoYXJyYXlbaV0gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGFkZEVycm9yKCJNaXNzaW5nICIgKyBhcnJheVtpXSArICIgaW4gZGlyOiAiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHByb2Nlc3NBcmNoaXZlKGZpbGUsIChTdHJpbmdbXSkgZXhwZWN0ZWQudG9BcnJheShuZXcgU3RyaW5nW2V4cGVjdGVkLnNpemUoKV0pKTsKICAgICAgICB9CiAgICB9CgogICAgLyoKICAgICAqIFRoZSBidW5kbGUgaXMgYW4gYXJjaGl2ZS4gTWFrZSBzdXJlIGl0IGhhcyB0aGUgcmlnaHQgY29udGVudHMuCiAgICAgKi8KICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQXJjaGl2ZShGaWxlIGZpbGUsIFN0cmluZ1tdIGV4cGVjdGVkKSB7CiAgICAgICAgWmlwRmlsZSB6aXAgPSBudWxsOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHppcCA9IG5ldyBaaXBGaWxlKGZpbGUsIFppcEZpbGUuT1BFTl9SRUFEKTsKICAgICAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gemlwLmVudHJpZXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKICAgICAgICAgICAgICAgIFppcEVudHJ5IGVudHJ5ID0gKFppcEVudHJ5KSBlLm5leHRFbGVtZW50KCk7CiAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGVudHJ5LmdldE5hbWUoKTsKICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0dGVybiA9IGV4cGVjdGVkW2ldOwogICAgICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLm1hdGNoZXMocGF0dGVybikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkW2ldID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXRjaCAoUGF0dGVyblN5bnRheEV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkW2ldICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBhZGRFcnJvcigiTWlzc2luZyAiICsgZXhwZWN0ZWRbaV0gKyAiIGluIGZpbGU6ICIgKyBmaWxlLmdldE5hbWUoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIGlmICh6aXAgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICB6aXAuY2xvc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgoKICAgIC8qCiAgICAgKiBUaGUgYnVuZGxlIGlzIGluIGEgZGlyZWN0b3J5LgogICAgICovCiAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0RpcihTdHJpbmcgcm9vdCwgRmlsZSBkaXIsIFN0cmluZ1tdIGV4cGVjdGVkKSB7CiAgICAgICAgRmlsZVtdIGNoaWxkcmVuID0gZGlyLmxpc3RGaWxlcygpOwogICAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBjaGlsZHJlbi5sZW5ndGg7IGluZGV4KyspIHsKICAgICAgICAgICAgRmlsZSBjaGlsZCA9IGNoaWxkcmVuW2luZGV4XTsKICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSByb290Lmxlbmd0aCgpID09IDAgPyBjaGlsZC5nZXROYW1lKCkgOiByb290ICsgJy8nICsgY2hpbGQuZ2V0TmFtZSgpOwogICAgICAgICAgICBpZiAoY2hpbGQuaXNEaXJlY3RvcnkoKSkgewogICAgICAgICAgICAgICAgcHJvY2Vzc0RpcihuYW1lLCBjaGlsZCwgZXhwZWN0ZWQpOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgU3RyaW5nIHBhdHRlcm4gPSBleHBlY3RlZFtpXTsKICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUubWF0Y2hlcyhwYXR0ZXJuKSkgewogICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFtpXSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKFBhdHRlcm5TeW50YXhFeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgICAgICAgICAvLyBleC5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICAgICAgICAgICAgICBhZGRFcnJvcihleC5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qCiAgICAgKiBSZXR1cm4gdGhlIGJ1bmRsZSBpZCBmcm9tIHRoZSBtYW5pZmVzdCBwb2ludGVkIHRvIGJ5IHRoZSBnaXZlbiBpbnB1dAogICAgICogc3RyZWFtLgogICAgICovCiAgICBwcml2YXRlIFN0cmluZyBnZXRCdW5kbGVJZEZyb21NYW5pZmVzdChJbnB1dFN0cmVhbSBpbnB1dCwgU3RyaW5nIHBhdGgpIHsKICAgICAgICBTdHJpbmcgaWQgPSBudWxsOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIE1hcCBhdHRyaWJ1dGVzID0gTWFuaWZlc3RFbGVtZW50LnBhcnNlQnVuZGxlTWFuaWZlc3QoaW5wdXQsIG51bGwpOwogICAgICAgICAgICBpZCA9IChTdHJpbmcpIGF0dHJpYnV0ZXMuZ2V0KFBST1BFUlRZX0JVTkRMRV9JRCk7CiAgICAgICAgICAgIGlmICgoaWQgPT0gbnVsbCkgfHwgKGlkLmxlbmd0aCgpID09IDApKSB7CiAgICAgICAgICAgICAgICBhZGRFcnJvcigiQnVuZGxlU3ltYm9saWNOYW1lIGhlYWRlciBub3Qgc2V0IGluIG1hbmlmZXN0IGZvciBidW5kbGU6ICIgKyBwYXRoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIGlkZW50aWZpZXIgY2FuIGJlIGZvbGxvd2VkIGJ5IGF0dHJpYnV0ZXMgc3VjaCBhcwogICAgICAgICAgICAgICAgLy8gJ3NpbmdsZXRvbicKICAgICAgICAgICAgICAgIGludCBwb3MgPSBpZC5pbmRleE9mKCc7Jyk7CiAgICAgICAgICAgICAgICBpZiAocG9zID4gMCkgewogICAgICAgICAgICAgICAgICAgIGlkID0gaWQuc3Vic3RyaW5nKDAsIHBvcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgICAgIGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAvLyBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgICBhZGRFcnJvcihlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIC8vIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgICAgIGFkZEVycm9yKGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlucHV0LmNsb3NlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gaWQ7CiAgICB9CgogICAgLyoKICAgICAqIFJldHVybiB0aGUgYnVuZGxlIGlkZW50aWZpZXIgZm9yIHRoZSBidW5kbGUgY29udGFpbmVkIGluIHRoZSBnaXZlbgogICAgICogYXJjaGl2ZS9kaXJlY3RvcnkuCiAgICAgKi8KICAgIHByaXZhdGUgU3RyaW5nIGdldEJ1bmRsZUlkKEZpbGUgZmlsZSkgewogICAgICAgIFN0cmluZyBpZCA9IG51bGw7CiAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewogICAgICAgICAgICBpZCA9IGdldEJ1bmRsZUlkRnJvbURpcihmaWxlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZmlsZS5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChFWFRFTlNJT05fWklQKSkgewogICAgICAgICAgICBpZCA9IGdldEJ1bmRsZUlkRnJvbVpJUChmaWxlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZmlsZS5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChFWFRFTlNJT05fSkFSKSkgewogICAgICAgICAgICBpZCA9IGdldEJ1bmRsZUlkRnJvbUpBUihmaWxlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGlkOwogICAgfQoKICAgIHByaXZhdGUgU3RyaW5nIGdldEJ1bmRsZUlkRnJvbVpJUChGaWxlIGZpbGUpIHsKICAgICAgICBaaXBGaWxlIHppcCA9IG51bGw7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgemlwID0gbmV3IFppcEZpbGUoZmlsZSk7CiAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IHppcC5lbnRyaWVzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CiAgICAgICAgICAgICAgICBaaXBFbnRyeSBlbnRyeSA9IChaaXBFbnRyeSkgZS5uZXh0RWxlbWVudCgpOwogICAgICAgICAgICAgICAgaWYgKGVudHJ5LmdldE5hbWUoKS5tYXRjaGVzKCJeLiovIiArIEphckZpbGUuTUFOSUZFU1RfTkFNRSkpIHsKICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dCA9IHppcC5nZXRJbnB1dFN0cmVhbShlbnRyeSk7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEJ1bmRsZUlkRnJvbU1hbmlmZXN0KGlucHV0LCBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgIC8vIGV4LnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgICBhZGRFcnJvcihleC5nZXRNZXNzYWdlKCkpOwogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGlmICh6aXAgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHppcC5jbG9zZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgICAgLy8gaWdub3JlCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYWRkRXJyb3IoIkJ1bmRsZSBtYW5pZmVzdCAoTUFOSUZFU1QuTUYpIG5vdCBmb3VuZCBpbiBidW5kbGU6ICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICAvKgogICAgICogVGhlIGdpdmVuIGZpbGUgcG9pbnRzIHRvIGFuIGV4cGFuZGVkIGJ1bmRsZSBvbiBkaXNjLiBMb29rIGludG8gdGhlCiAgICAgKiBidW5kbGUgbWFuaWZlc3QgZmlsZSB0byBmaW5kIHRoZSBidW5kbGUgaWRlbnRpZmllci4KICAgICAqLwogICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QnVuZGxlSWRGcm9tRGlyKEZpbGUgZGlyKSB7CiAgICAgICAgU3RyaW5nIGlkID0gbnVsbDsKICAgICAgICBGaWxlIG1hbmlmZXN0RmlsZSA9IG5ldyBGaWxlKGRpciwgSmFyRmlsZS5NQU5JRkVTVF9OQU1FKTsKICAgICAgICBpZiAoIW1hbmlmZXN0RmlsZS5leGlzdHMoKSB8fCAhbWFuaWZlc3RGaWxlLmlzRmlsZSgpKSB7CiAgICAgICAgICAgIGFkZEVycm9yKCJCdW5kbGUgbWFuaWZlc3QgKE1BTklGRVNULk1GKSBub3QgZm91bmQgYXQ6ICIgKyBtYW5pZmVzdEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGlkID0gZ2V0QnVuZGxlSWRGcm9tTWFuaWZlc3QobmV3IEZpbGVJbnB1dFN0cmVhbShtYW5pZmVzdEZpbGUpLCBtYW5pZmVzdEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgLy8gZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICAgICAgICAgIGFkZEVycm9yKGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gaWQ7CiAgICB9CgogICAgLyoKICAgICAqIFRoZSBnaXZlbiBmaWxlIHBvaW50cyB0byBhIGJ1bmRsZSBjb250YWluZWQgaW4gYW4gYXJjaGl2ZS4gTG9vayBpbnRvCiAgICAgKiB0aGUgYnVuZGxlIG1hbmlmZXN0IGZpbGUgdG8gZmluZCB0aGUgYnVuZGxlIGlkZW50aWZpZXIuCiAgICAgKi8KICAgIHByaXZhdGUgRmlsZSBnZXRGaWxlRnJvbVBBQ0tFREpBUihGaWxlIGZpbGUpIHsKCiAgICAgICAgRmlsZSB0bXBqYXIgPSBudWxsOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIEphclByb2Nlc3NvciBqYXJwcm9jZXNzb3IgPSBKYXJQcm9jZXNzb3IuZ2V0VW5wYWNrUHJvY2Vzc29yKG51bGwpOwogICAgICAgICAgICBqYXJwcm9jZXNzb3Iuc2V0V29ya2luZ0RpcmVjdG9yeShnZXRUZW1wV29ya2luZ0RpcigpKTsKICAgICAgICAgICAgdG1wamFyID0gamFycHJvY2Vzc29yLnByb2Nlc3NKYXIoZmlsZSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIGFkZEVycm9yKGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRtcGphcjsKICAgIH0KCiAgICBwdWJsaWMgU3RyaW5nIGdldERpcmVjdG9yeVRvQ2hlY2soKSB7CiAgICAgICAgcmV0dXJuIGRpcmVjdG9yeVRvQ2hlY2s7CiAgICB9CgogICAgcHVibGljIHZvaWQgc2V0RGlyZWN0b3J5VG9DaGVjayhTdHJpbmcgYnVuZGxlRGlyVG9DaGVjaykgewogICAgICAgIHRoaXMuZGlyZWN0b3J5VG9DaGVjayA9IGJ1bmRsZURpclRvQ2hlY2s7CiAgICB9CgogICAgcHVibGljIFN0cmluZyBnZXRDb25maWdGaWxlbmFtZSgpIHsKICAgICAgICByZXR1cm4gY29uZmlnRmlsZW5hbWU7CiAgICB9CgogICAgcHVibGljIHZvaWQgc2V0Q29uZmlnRmlsZW5hbWUoU3RyaW5nIGNvbmZpZ0ZpbGVuYW1lKSB7CiAgICAgICAgdGhpcy5jb25maWdGaWxlbmFtZSA9IGNvbmZpZ0ZpbGVuYW1lOwogICAgfQoKICAgIC8qCiAgICAgKiBUaGUgZ2l2ZW4gZmlsZSBwb2ludHMgdG8gYSBidW5kbGUgY29udGFpbmVkIGluIGFuIGFyY2hpdmUuIExvb2sgaW50bwogICAgICogdGhlIGJ1bmRsZSBtYW5pZmVzdCBmaWxlIHRvIGZpbmQgdGhlIGJ1bmRsZSBpZGVudGlmaWVyLgogICAgICovCiAgICBwcml2YXRlIFN0cmluZyBnZXRCdW5kbGVJZEZyb21KQVIoRmlsZSBmaWxlKSB7CiAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXQgPSBudWxsOwogICAgICAgIEphckZpbGUgamFyID0gbnVsbDsKICAgICAgICB0cnkgewogICAgICAgICAgICBqYXIgPSBuZXcgSmFyRmlsZShmaWxlLCBmYWxzZSwgWmlwRmlsZS5PUEVOX1JFQUQpOwogICAgICAgICAgICBKYXJFbnRyeSBlbnRyeSA9IGphci5nZXRKYXJFbnRyeShKYXJGaWxlLk1BTklGRVNUX05BTUUpOwogICAgICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgYWRkRXJyb3IoIkJ1bmRsZSBkb2VzIG5vdCBjb250YWluIGEgTUFOSUZFU1QuTUYgZmlsZTogIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW5wdXQgPSBqYXIuZ2V0SW5wdXRTdHJlYW0oZW50cnkpOwogICAgICAgICAgICByZXR1cm4gZ2V0QnVuZGxlSWRGcm9tTWFuaWZlc3QoaW5wdXQsIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAvLyBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgICBhZGRFcnJvcihlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXQuY2xvc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGphciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGphci5jbG9zZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgU3RyaW5nIGdldFRlbXBXb3JraW5nRGlyKCkgewogICAgICAgIHJldHVybiB0ZW1wV29ya2luZ0RpcjsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBzZXRUZW1wV29ya2luZ0RpcihTdHJpbmcgdGVtcFdvcmtpbmdEaXIpIHsKICAgICAgICB0aGlzLnRlbXBXb3JraW5nRGlyID0gdGVtcFdvcmtpbmdEaXI7CiAgICB9CgogICAgcHJpdmF0ZSBib29sZWFuIHRlc3RGZWF0dXJlTGF5b3V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKCiAgICAgICAgZXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwogICAgICAgIGJvb2xlYW4gZmFpbHVyZXNPY2N1cnJlZCA9IGZhbHNlOwogICAgICAgIFN0cmluZyBwcm9wZXJ0eSA9IGdldERpcmVjdG9yeVRvQ2hlY2soKTsKICAgICAgICBpZiAocHJvcGVydHkgPT0gbnVsbCkgewogICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5lZWQgdG8gc2V0IGlucHV0IGRpcmVjdG9yeSB0byBjaGVjayBhZ2FpbnN0LiIpOwogICAgICAgIH0KICAgICAgICBTdHJpbmcgZmVhdHVyZURpcmVjdG9yeSA9IG51bGw7CiAgICAgICAgaWYgKHByb3BlcnR5LmVuZHNXaXRoKCIvIikpIHsKICAgICAgICAgICAgZmVhdHVyZURpcmVjdG9yeSA9IHByb3BlcnR5ICsgImFnZ3JlZ2F0ZS9mZWF0dXJlcyI7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBmZWF0dXJlRGlyZWN0b3J5ID0gcHJvcGVydHkgKyAiL2FnZ3JlZ2F0ZS9mZWF0dXJlcyI7CiAgICAgICAgfQogICAgICAgIEZpbGUgaW5wdXRkaXIgPSBuZXcgRmlsZShmZWF0dXJlRGlyZWN0b3J5KTsKICAgICAgICBpZiAoIShpbnB1dGRpci5leGlzdHMoKSAmJiBpbnB1dGRpci5pc0RpcmVjdG9yeSgpKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImZlYXR1cmUgZGlyZWNvdHJ5ICgiICsgZmVhdHVyZURpcmVjdG9yeSArICIpIG11c3QgYmUgYW4gZXhpc3RpbmcgZGlyZWN0b3J5LiIpOwogICAgICAgIH0KICAgICAgICBGaWxlW10gY2hpbGRyZW4gPSBpbnB1dGRpci5saXN0RmlsZXMobmV3IEpBUkZpbGVOYW1lRmlsdGVyKCkpOwogICAgICAgIGludCB0b3RhbHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7CiAgICAgICAgaW50IGNoZWNrZWQgPSAwOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgRmlsZSBjaGlsZCA9IGNoaWxkcmVuW2ldOwogICAgICAgICAgICBpZiAoY2hpbGQuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoRVhURU5TSU9OX1BBQ0VLRF9KQVIpKSB7CiAgICAgICAgICAgICAgICBjaGlsZCA9IGdldEZpbGVGcm9tUEFDS0VESkFSKGNoaWxkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2hpbGQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgU3RyaW5nIGlkID0gZ2V0RmVhdHVyZUlkKGNoaWxkKTsKICAgICAgICAgICAgICAgIGlmIChpZCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0ZlYXR1cmUoY2hpbGQsIGdldEZlYXR1cmVFeHBlY3RlZChpZCwgdHJ1ZSwgY2hpbGQuZ2V0TmFtZSgpLmVuZHNXaXRoKEVYVEVOU0lPTl9aSVApKSk7CiAgICAgICAgICAgICAgICAgICAgY2hlY2tlZCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGdldFJlcG9ydFdyaXRlcigpLndyaXRlbG4oKTsKICAgICAgICBnZXRSZXBvcnRXcml0ZXIoKS53cml0ZWxuKCIgICBDaGVja2luZzogIiArIGZlYXR1cmVEaXJlY3RvcnkpOwogICAgICAgIGdldFJlcG9ydFdyaXRlcigpLndyaXRlbG4oIiAgIENoZWNrZWQgIiArIGNoZWNrZWQgKyAiIG9mICIgKyB0b3RhbHNpemUgKyAiLiIpOwogICAgICAgIGdldFJlcG9ydFdyaXRlcigpLndyaXRlbG4oIiAgIEVycm9ycyBmb3VuZDogIiArIGVycm9ycy5zaXplKCkpOwogICAgICAgIGlmIChlcnJvcnMuc2l6ZSgpID4gMCkgewogICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGVycm9ycyk7CiAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGVycm9ycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKICAgICAgICAgICAgICAgIGdldFJlcG9ydFdyaXRlcigpLndyaXRlbG4oaXRlci5uZXh0KCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZhaWx1cmVzT2NjdXJyZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFpbHVyZXNPY2N1cnJlZDsKCiAgICB9CgogICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RmVhdHVyZUlkKEZpbGUgZmlsZSkgewogICAgICAgIFN0cmluZyBpZCA9IG51bGw7CiAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewogICAgICAgICAgICBpZCA9IGdldEZlYXR1cmVJZEZyb21EaXIoZmlsZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGZpbGUuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoRVhURU5TSU9OX0pBUikpIHsKICAgICAgICAgICAgaWQgPSBnZXRGZWF0dXJlSWRGcm9tSkFSKGZpbGUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaWQ7CiAgICB9CgogICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RmVhdHVyZUlkRnJvbUpBUihGaWxlIGZpbGUpIHsKICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dCA9IG51bGw7CiAgICAgICAgSmFyRmlsZSBqYXIgPSBudWxsOwogICAgICAgIFN0cmluZyBpZCA9IG51bGw7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgamFyID0gbmV3IEphckZpbGUoZmlsZSwgZmFsc2UsIFppcEZpbGUuT1BFTl9SRUFEKTsKICAgICAgICAgICAgSmFyRW50cnkgZW50cnkgPSBqYXIuZ2V0SmFyRW50cnkoImZlYXR1cmUueG1sIik7CiAgICAgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBhZGRFcnJvcigiRmVhdHVyZSBqYXIgZG9lcyBub3QgY29udGFpbiBhIGZlYXR1cmUueG1sIGZpbGU6ICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpbnB1dCA9IGphci5nZXRJbnB1dFN0cmVhbShlbnRyeSk7CiAgICAgICAgICAgIGlkID0gZ2V0RmVhdHVyZUZyb21GZWF0dXJlWE1MKGlucHV0KTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgLy8gZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICAgICAgYWRkRXJyb3IoZS5nZXRNZXNzYWdlKCkpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIGFkZEVycm9yKGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIGFkZEVycm9yKGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlucHV0LmNsb3NlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChqYXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBqYXIuY2xvc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGlkOwogICAgfQoKICAgIHByaXZhdGUgU3RyaW5nIGdldEZlYXR1cmVJZEZyb21EaXIoRmlsZSBkaXIpIHsKICAgICAgICBTdHJpbmcgaWQgPSBudWxsOwogICAgICAgIEZpbGUgZmVhdHVyZUZpbGUgPSBuZXcgRmlsZShkaXIsICJmZWF0dXJlLnhtbCIpOwogICAgICAgIGlmICghZmVhdHVyZUZpbGUuZXhpc3RzKCkgfHwgIWZlYXR1cmVGaWxlLmlzRmlsZSgpKSB7CiAgICAgICAgICAgIGFkZEVycm9yKCJGZWF0dXJlLnhtbCBub3QgZm91bmQgYXQ6ICIgKyBmZWF0dXJlRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBpZCA9IGdldEZlYXR1cmVGcm9tRmVhdHVyZVhNTChmZWF0dXJlRmlsZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpZDsKICAgIH0KCiAgICBwcml2YXRlIFN0cmluZyBnZXRGZWF0dXJlRnJvbUZlYXR1cmVYTUwoRmlsZSBmaWxlKSB7CiAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXRET00oZmlsZSk7CiAgICAgICAgcmV0dXJuIGdldEZlYXR1cmVJZEZyb21ET00oZG9jdW1lbnQpOwogICAgfQoKICAgIHByaXZhdGUgU3RyaW5nIGdldEZlYXR1cmVJZEZyb21ET00oRG9jdW1lbnQgZG9jdW1lbnQpIHsKICAgICAgICBTdHJpbmcgaWQgPSBudWxsOwogICAgICAgIGlmIChkb2N1bWVudCAhPSBudWxsKSB7CiAgICAgICAgICAgIE5vZGVMaXN0IGZlYXR1cmVFbGVtZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJmZWF0dXJlIik7CiAgICAgICAgICAgIEVsZW1lbnQgZmVhdHVyZUVsZW1lbnQgPSBudWxsOwogICAgICAgICAgICBpZiAoZmVhdHVyZUVsZW1lbnRzLmdldExlbmd0aCgpID4gMCkgewogICAgICAgICAgICAgICAgTm9kZSBmZWF0dXJlTm9kZSA9IGZlYXR1cmVFbGVtZW50cy5pdGVtKDApOwogICAgICAgICAgICAgICAgaWYgKGZlYXR1cmVOb2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewogICAgICAgICAgICAgICAgICAgIGZlYXR1cmVFbGVtZW50ID0gKEVsZW1lbnQpIGZlYXR1cmVOb2RlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChmZWF0dXJlRWxlbWVudCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBOYW1lZE5vZGVNYXAgYU5hbWVkTm9kZU1hcCA9IGZlYXR1cmVFbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKICAgICAgICAgICAgICAgIE5vZGUgaWRBdHRyaWJ1dGUgPSBhTmFtZWROb2RlTWFwLmdldE5hbWVkSXRlbSgiaWQiKTsKICAgICAgICAgICAgICAgIGlkID0gaWRBdHRyaWJ1dGUuZ2V0Tm9kZVZhbHVlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGlkOwogICAgfQoKICAgIHByaXZhdGUgU3RyaW5nIGdldEZlYXR1cmVGcm9tRmVhdHVyZVhNTChJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IGdldERPTShzdHJlYW0pOwogICAgICAgIHJldHVybiBnZXRGZWF0dXJlSWRGcm9tRE9NKGRvY3VtZW50KTsKICAgIH0KCiAgICBwcml2YXRlIERvY3VtZW50IGdldERPTShGaWxlIGZpbGUpIHsKCiAgICAgICAgRG9jdW1lbnQgYURvY3VtZW50ID0gbnVsbDsKICAgICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBudWxsOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihmaWxlKSk7CiAgICAgICAgICAgIElucHV0U291cmNlIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKHJlYWRlcik7CiAgICAgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwogICAgICAgICAgICBhRG9jdW1lbnQgPSBidWlsZGVyLnBhcnNlKGlucHV0U291cmNlKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIGlmIChyZWFkZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIHRoaXMgb25lCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChhRG9jdW1lbnQgPT0gbnVsbCkgewogICAgICAgICAgICBTdHJpbmcgbXNnID0gIkVycm9yOiBjb3VsZCBub3QgcGFyc2UgeG1sIGluIGNsYXNzcGF0aCBmaWxlOiAiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhRG9jdW1lbnQ7CgogICAgfQoKICAgIHByaXZhdGUgRG9jdW1lbnQgZ2V0RE9NKElucHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewoKICAgICAgICBEb2N1bWVudCBhRG9jdW1lbnQgPSBudWxsOwogICAgICAgIElucHV0U291cmNlIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKHN0cmVhbSk7CiAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwogICAgICAgIERvY3VtZW50QnVpbGRlciBidWlsZGVyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKICAgICAgICBhRG9jdW1lbnQgPSBidWlsZGVyLnBhcnNlKGlucHV0U291cmNlKTsKCiAgICAgICAgcmV0dXJuIGFEb2N1bWVudDsKCiAgICB9CgogICAgcHVibGljIFN0cmluZyBnZXRPdXRwdXREaXJlY3RvcnkoKSB7CiAgICAgICAgcmV0dXJuIG91dHB1dERpcmVjdG9yeTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXREaXJlY3RvcnkoU3RyaW5nIG91dHB1dERpcmVjdG9yeSkgewogICAgICAgIHRoaXMub3V0cHV0RGlyZWN0b3J5ID0gb3V0cHV0RGlyZWN0b3J5OwogICAgfQoKICAgIHB1YmxpYyBSZXBvcnRXcml0ZXIgZ2V0UmVwb3J0V3JpdGVyKCkgewogICAgICAgIGlmIChyZXBvcnRXcml0ZXIgPT0gbnVsbCkgewogICAgICAgICAgICBTdHJpbmcgb3V0cHV0RmlsZW5hbWUgPSAibGF5b3V0Q2hlY2sudHh0IjsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyID0gbmV3IFJlcG9ydFdyaXRlcihnZXRPdXRwdXREaXJlY3RvcnkoKSwgb3V0cHV0RmlsZW5hbWUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVwb3J0V3JpdGVyOwogICAgfQp9ClBLAwQKAAAAAABvWAo/bHglAogeAACIHgAALQAAAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvamFycy9QYWNrMjAwVGVzdC5jbGFzc8r+ur4AAAAxAVsHAAIBACdvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvUGFjazIwMFRlc3QHAAQBABBqYXZhL2xhbmcvT2JqZWN0AQANRVhURU5TSU9OX0pBUgEAEkxqYXZhL2xhbmcvU3RyaW5nOwEADUNvbnN0YW50VmFsdWUIAAkBAAQuamFyAQAURVhURU5TSU9OX1BBQ0VLRF9KQVIIAAwBAAwuamFyLnBhY2suZ3oBAApuYW1lUGFyc2VyAQAwTG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvRnVsbEphck5hbWVQYXJzZXI7AQAOb3V0cHV0RmlsZW5hbWUBAA9vdXRwdXREaXJlY3RvcnkBABBkaXJlY3RvcnlUb0NoZWNrAQAPYnVuZGxlRGlyZWN0b3J5AQAIPGNsaW5pdD4BAAMoKVYBAARDb2RlBwAXAQAub3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9GdWxsSmFyTmFtZVBhcnNlcgoAFgAZDAAaABQBAAY8aW5pdD4JAAEAHAwADQAOCAAeAQAPcGFjazIwMGRhdGEudHh0CQABACAMAA8ABgEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQoAAwAZAQAEdGhpcwEAKUxvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvUGFjazIwMFRlc3Q7AQAEbWFpbgEAFihbTGphdmEvbGFuZy9TdHJpbmc7KVYKAAEAGQgAKgEAGUQ6XHRlbXBcc3RhZ2luZ1xhZ2dyZWdhdGUKAAEALAwALQAuAQATc2V0RGlyZWN0b3J5VG9DaGVjawEAFShMamF2YS9sYW5nL1N0cmluZzspVgoAAQAwDAAxADIBAA50ZXN0QnVuZGxlUGFjawEAAygpWgoANAA2BwA1AQATamF2YS9pby9JT0V4Y2VwdGlvbgwANwAUAQAPcHJpbnRTdGFja1RyYWNlAQAEYXJncwEAE1tMamF2YS9sYW5nL1N0cmluZzsBAAp0ZXN0bGF5b3V0AQABZQEAFUxqYXZhL2lvL0lPRXhjZXB0aW9uOwEAE2dldERpcmVjdG9yeVRvQ2hlY2sBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwkAAQBADAARAAYBABBidW5kbGVEaXJUb0NoZWNrAQAKRXhjZXB0aW9ucwoAAQBEDAA9AD4HAEYBACNvcmcvYXBhY2hlL3Rvb2xzL2FudC9CdWlsZEV4Y2VwdGlvbggASAEALU5lZWQgdG8gc2V0IGlucHV0IGRpcmVjdG9yeSB0byBjaGVjayBhZ2FpbnN0LgoARQBKDAAaAC4HAEwBAAxqYXZhL2lvL0ZpbGUKAAEATgwATwA+AQASZ2V0QnVuZGxlRGlyZWN0b3J5CgBLAEoKAEsAUgwAUwAyAQAGZXhpc3RzCgBLAFUMAFYAMgEAC2lzRGlyZWN0b3J5BwBYAQAXamF2YS9sYW5nL1N0cmluZ0J1aWxkZXIIAFoBABJidW5kbGUgZGlyZWNvdHJ5ICgKAFcASgoAVwBdDABeAF8BAAZhcHBlbmQBAC0oTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsIAGEBACApIG11c3QgYmUgYW4gZXhpc3RpbmcgZGlyZWN0b3J5LgoAVwBjDABkAD4BAAh0b1N0cmluZwoAAQBmDABnAGgBABBjaGVja0ZpbGVzUGFja2VkAQARKExqYXZhL2lvL0ZpbGU7KVoBAAhwcm9wZXJ0eQEACGlucHV0ZGlyAQAOTGphdmEvaW8vRmlsZTsBAA9mYWlsdXJlc09jY3VyZWQBAAFaBwBvAQATamF2YS91dGlsL0FycmF5TGlzdAoAbgAZBwByAQAub3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9KQVJGaWxlTmFtZUZpbHRlcgoAcQAZCgBLAHUMAHYAdwEACWxpc3RGaWxlcwEAKShMamF2YS9pby9GaWxlbmFtZUZpbHRlcjspW0xqYXZhL2lvL0ZpbGU7BwB5AQAxb3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9QYWNrR3pGaWxlTmFtZUZpbHRlcgoAeAAZCgABAHwMAH0AfgEADG5vcGFja2VkRmlsZQEALyhbTGphdmEvaW8vRmlsZTtbTGphdmEvaW8vRmlsZTspW0xqYXZhL2lvL0ZpbGU7CgBLAIAMAIEAPgEAB2dldE5hbWUKAEsAgwwAhAAyAQAGaXNGaWxlCgABAIYMAIcAiAEADGdldEJhc2ljTmFtZQEAOChMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmc7CgAWAIoMAIsAjAEABXBhcnNlAQAVKExqYXZhL2xhbmcvU3RyaW5nOylaCgCOAJAHAI8BABBqYXZhL2xhbmcvU3RyaW5nDACRAJIBAAd2YWx1ZU9mAQAmKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL1N0cmluZzsIAJQBADEgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIHZlcnNpb24gKGl0IGlzIHVucGFyc2FibGUpCwCWAJgHAJcBAA5qYXZhL3V0aWwvTGlzdAwAmQCaAQADYWRkAQAVKExqYXZhL2xhbmcvT2JqZWN0OylaCgABAJwMAJ0AaAEADGNvbnRhaW5zSmF2YQgAnwEAICBjb250YWlucyBqYXZhIGJ1dCBpcyBub3QgcGFja2VkCgABAKEMAKIAowEADHByaW50U3VtbWFyeQEAMyhMamF2YS91dGlsL0xpc3Q7W0xqYXZhL2lvL0ZpbGU7W0xqYXZhL2lvL0ZpbGU7SUkpVgsAlgClDACmAKcBAARzaXplAQADKClJAQAGZXJyb3JzAQAQTGphdmEvdXRpbC9MaXN0OwEAC2phcmNoaWxkcmVuAQAPW0xqYXZhL2lvL0ZpbGU7AQAOcGFja2VkY2hpbGRyZW4BAAl0b3RhbHNpemUBAAFJAQAHY2hlY2tlZAEAAWkBAAVjaGlsZAEABG5hbWUBAAliYXNpY05hbWUBAAV2YWxpZAcAtgEAKW9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvUmVwb3J0V3JpdGVyCgABALgMALkAPgEAEmdldE91dHB1dERpcmVjdG9yeQoAtQC7DAAaALwBACcoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KVYKALUAvgwAvwAUAQAHd3JpdGVsbggAwQEAFiAgIERpcmVjdG9yeSBjaGVja2VkOiAKALUAwwwAvwAuCADFAQAoIENoZWNrIG9mIHBhY2tlZCBhbmQgbm90IHBhY2tlZCBidW5kbGVzLggAxwEAFyAgIE51bWJlciBvZiBqYXIgZmlsZXMgCgBXAMkMAF4AygEAHChJKUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsIAMwBABsgICBOdW1iZXIgb2YgcGFjay5neiBmaWxlcyAIAM4BAC0gICBEaWZmZXJlbmNlLCBudW1iZXIgb2YgamFyIGZpbGVzIHRvIGNoZWNrOiAIANABAAsgICBDaGVja2VkIAgA0gEABCBvZiAIANQBAAEuCADWAQARICAgRXJyb3JzIGZvdW5kOiAKANgA2gcA2QEAFWphdmEvdXRpbC9Db2xsZWN0aW9ucwwA2wDcAQAEc29ydAEAEyhMamF2YS91dGlsL0xpc3Q7KVYLAJYA3gwA3wDgAQAIaXRlcmF0b3IBABYoKUxqYXZhL3V0aWwvSXRlcmF0b3I7CwDiAOQHAOMBABJqYXZhL3V0aWwvSXRlcmF0b3IMAOUA5gEABG5leHQBABQoKUxqYXZhL2xhbmcvT2JqZWN0OwoAtQDoDAC/AOkBABUoTGphdmEvbGFuZy9PYmplY3Q7KVYLAOIA6wwA7AAyAQAHaGFzTmV4dAoAtQDuDADvABQBAAVjbG9zZQEADHJlcG9ydFdyaXRlcgEAK0xvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL1JlcG9ydFdyaXRlcjsBAARpdGVyAQAUTGphdmEvdXRpbC9JdGVyYXRvcjsKAAEA9QwA9gD3AQAIY29udGFpbnMBACAoW0xqYXZhL2lvL0ZpbGU7TGphdmEvaW8vRmlsZTspWgoAbgCYCgBuAKUKAG4A3gEAB3Jlc3VsdHMBABVMamF2YS91dGlsL0FycmF5TGlzdDsBAARmaWxlAQAJZmlsZUFycmF5CgCOAQAMAQEAmgEABmVxdWFscwEABnJlc3VsdAcBBAEAFWphdmEvdXRpbC9qYXIvSmFyRmlsZQoBAwEGDAAaAQcBABMoTGphdmEvaW8vRmlsZTtaSSlWCgEDAQkMAQoBCwEAB2VudHJpZXMBABkoKUxqYXZhL3V0aWwvRW51bWVyYXRpb247CwENAQ8HAQ4BABVqYXZhL3V0aWwvRW51bWVyYXRpb24MARAA5gEAC25leHRFbGVtZW50BwESAQAWamF2YS91dGlsL2phci9KYXJFbnRyeQoBEQCACAEVAQAGLmNsYXNzCgCOARcMARgAjAEACGVuZHNXaXRoCgEDARoMARsBHAEADmdldElucHV0U3RyZWFtAQAvKExqYXZhL3V0aWwvemlwL1ppcEVudHJ5OylMamF2YS9pby9JbnB1dFN0cmVhbTsKAAEBHgwAnQEfAQAYKExqYXZhL2lvL0lucHV0U3RyZWFtOylaCwENASEMASIAMgEAD2hhc01vcmVFbGVtZW50cwoBAwDuAQAHamFyZmlsZQEAA2phcgEAF0xqYXZhL3V0aWwvamFyL0phckZpbGU7AQAXTGphdmEvdXRpbC9FbnVtZXJhdGlvbjsBAAVlbnRyeQEAGExqYXZhL3V0aWwvamFyL0phckVudHJ5OwEABWlucHV0AQAVTGphdmEvaW8vSW5wdXRTdHJlYW07AQAWTG9jYWxWYXJpYWJsZVR5cGVUYWJsZQEAMUxqYXZhL3V0aWwvRW51bWVyYXRpb248TGphdmEvdXRpbC9qYXIvSmFyRW50cnk7PjsHAS8BABxqYXZhL3V0aWwvamFyL0phcklucHV0U3RyZWFtCgEuATEMABoBMgEAGChMamF2YS9pby9JbnB1dFN0cmVhbTspVgoBLgE0DAE1ATYBAAxnZXROZXh0RW50cnkBABooKUxqYXZhL3V0aWwvemlwL1ppcEVudHJ5OwoBOACABwE5AQAWamF2YS91dGlsL3ppcC9aaXBFbnRyeQoBLgE7DAE8AKcBAAlhdmFpbGFibGUKAT4A7gcBPwEAE2phdmEvaW8vSW5wdXRTdHJlYW0BAA5qYXJJbnB1dFN0cmVhbQEAHkxqYXZhL3V0aWwvamFyL0phcklucHV0U3RyZWFtOwEAGExqYXZhL3V0aWwvemlwL1ppcEVudHJ5OwoAjgFEDAFFAUYBAAts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AAwASwBpAAYAAQABAVkAAAACAVpQSwMECgAAAAAAMaAJP1k1m5HQJgAA0CYAACwAAABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvUGFjazIwMFRlc3QuamF2YS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwogKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwogKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKICogCiAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqIFRoaXMgZmlsZSBvcmlnaW5hbGx5IGNhbWUgZnJvbSAnRWNsaXBzZSBPcmJpdCcgcHJvamVjdCB0aGVuIGFkYXB0ZWQgdG8gdXNlIAogKiBpbiBXVFAgYW5kIGltcHJvdmVkIHRvIHVzZSAnTWFuaWZlc3QnIHRvIHJlYWQgbWFuaWZlc3QubWYsIGluc3RlYWQgb2YgcmVhZGluZyAKICogaXQgYXMgYSBwcm9wZXJ0aWVzIGZpbGUuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnBhY2thZ2Ugb3JnLmVjbGlwc2UuanVuby50ZXN0cy5qYXJzOwoKaW1wb3J0IGphdmEuaW8uRmlsZTsKaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKaW1wb3J0IGphdmEudXRpbC5MaXN0OwppbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsKaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRmlsZTsKaW1wb3J0IGphdmEudXRpbC5qYXIuSmFySW5wdXRTdHJlYW07CmltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwppbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwoKaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwppbXBvcnQgb3JnLmVjbGlwc2UuanVuby50ZXN0cy5qYXJzLlBhY2syMDBUZXN0OwppbXBvcnQgb3JnLmVjbGlwc2UuanVuby50ZXN0cy51dGlscy5GdWxsSmFyTmFtZVBhcnNlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmp1bm8udGVzdHMudXRpbHMuSkFSRmlsZU5hbWVGaWx0ZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5qdW5vLnRlc3RzLnV0aWxzLlBhY2tHekZpbGVOYW1lRmlsdGVyOwppbXBvcnQgb3JnLmVjbGlwc2UuanVuby50ZXN0cy51dGlscy5SZXBvcnRXcml0ZXI7CgovKioKICogQHNpbmNlIDMuMwogKi8KcHVibGljIGNsYXNzIFBhY2syMDBUZXN0IHsKCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgICAgICBFWFRFTlNJT05fSkFSICAgICAgICA9ICIuamFyIjsKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyAgICAgIEVYVEVOU0lPTl9QQUNFS0RfSkFSID0gIi5qYXIucGFjay5neiI7CiAgICBwcml2YXRlIHN0YXRpYyBGdWxsSmFyTmFtZVBhcnNlciBuYW1lUGFyc2VyICAgICAgICAgICA9IG5ldyBGdWxsSmFyTmFtZVBhcnNlcigpOwogICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nICAgICAgICAgICAgb3V0cHV0RmlsZW5hbWUgICAgICAgPSAicGFjazIwMGRhdGEudHh0IjsKICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICAgICAgIG91dHB1dERpcmVjdG9yeTsKICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeVRvQ2hlY2s7CiAgICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICAgICAgICBidW5kbGVEaXJlY3Rvcnk7CgoKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKCiAgICAgICAgUGFjazIwMFRlc3QgdGVzdGxheW91dCA9IG5ldyBQYWNrMjAwVGVzdCgpOwogICAgICAgIHRlc3RsYXlvdXQuc2V0RGlyZWN0b3J5VG9DaGVjaygiRDpcXHRlbXBcXHN0YWdpbmdcXGFnZ3JlZ2F0ZSIpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHRlc3RsYXlvdXQudGVzdEJ1bmRsZVBhY2soKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICB9CgogICAgfQoKCiAgICBwdWJsaWMgU3RyaW5nIGdldERpcmVjdG9yeVRvQ2hlY2soKSB7CiAgICAgICAgcmV0dXJuIGRpcmVjdG9yeVRvQ2hlY2s7CiAgICB9CgogICAgcHVibGljIHZvaWQgc2V0RGlyZWN0b3J5VG9DaGVjayhTdHJpbmcgYnVuZGxlRGlyVG9DaGVjaykgewogICAgICAgIHRoaXMuZGlyZWN0b3J5VG9DaGVjayA9IGJ1bmRsZURpclRvQ2hlY2s7CiAgICB9CgogICAgcHVibGljIGJvb2xlYW4gdGVzdEJ1bmRsZVBhY2soKSB0aHJvd3MgSU9FeGNlcHRpb24gewoKICAgICAgICBTdHJpbmcgcHJvcGVydHkgPSBnZXREaXJlY3RvcnlUb0NoZWNrKCk7CiAgICAgICAgaWYgKHByb3BlcnR5ID09IG51bGwpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJOZWVkIHRvIHNldCBpbnB1dCBkaXJlY3RvcnkgdG8gY2hlY2sgYWdhaW5zdC4iKTsKICAgICAgICB9CgogICAgICAgIEZpbGUgaW5wdXRkaXIgPSBuZXcgRmlsZShnZXRCdW5kbGVEaXJlY3RvcnkoKSk7CiAgICAgICAgaWYgKCEoaW5wdXRkaXIuZXhpc3RzKCkgJiYgaW5wdXRkaXIuaXNEaXJlY3RvcnkoKSkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJidW5kbGUgZGlyZWNvdHJ5ICgiICsgZ2V0QnVuZGxlRGlyZWN0b3J5KCkgKyAiKSBtdXN0IGJlIGFuIGV4aXN0aW5nIGRpcmVjdG9yeS4iKTsKICAgICAgICB9CiAgICAgICAgYm9vbGVhbiBmYWlsdXJlc09jY3VyZWQgPSBjaGVja0ZpbGVzUGFja2VkKGlucHV0ZGlyKTsKICAgICAgICByZXR1cm4gZmFpbHVyZXNPY2N1cmVkOwogICAgfQoKICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja0ZpbGVzUGFja2VkKEZpbGUgaW5wdXRkaXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgLy8gcmVzZXQvaW5pdGlhbGl6ZSBlcnJvcnMKICAgICAgICBMaXN0IGVycm9ycyA9IG5ldyBBcnJheUxpc3QoKTsKICAgICAgICBib29sZWFuIGZhaWx1cmVzT2NjdXJlZCA9IGZhbHNlOwogICAgICAgIEZpbGVbXSBqYXJjaGlsZHJlbiA9IGlucHV0ZGlyLmxpc3RGaWxlcyhuZXcgSkFSRmlsZU5hbWVGaWx0ZXIoKSk7CiAgICAgICAgRmlsZVtdIHBhY2tlZGNoaWxkcmVuID0gaW5wdXRkaXIubGlzdEZpbGVzKG5ldyBQYWNrR3pGaWxlTmFtZUZpbHRlcigpKTsKICAgICAgICBGaWxlW10gbm9wYWNrZWRGaWxlID0gbm9wYWNrZWRGaWxlKGphcmNoaWxkcmVuLCBwYWNrZWRjaGlsZHJlbik7CiAgICAgICAgaW50IHRvdGFsc2l6ZSA9IG5vcGFja2VkRmlsZS5sZW5ndGg7CiAgICAgICAgaW50IGNoZWNrZWQgPSAwOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWxzaXplOyBpKyspIHsKICAgICAgICAgICAgRmlsZSBjaGlsZCA9IG5vcGFja2VkRmlsZVtpXTsKICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBjaGlsZC5nZXROYW1lKCk7CiAgICAgICAgICAgIC8vIGFzc3VtZSBkaXJlY3RvcnkgaWYgbm90IGZpbGUKICAgICAgICAgICAgaWYgKGNoaWxkLmlzRmlsZSgpKSB7CiAgICAgICAgICAgICAgICBjaGVja2VkKys7CgogICAgICAgICAgICAgICAgU3RyaW5nIGJhc2ljTmFtZSA9IGdldEJhc2ljTmFtZShuYW1lLCBFWFRFTlNJT05fSkFSKTsKICAgICAgICAgICAgICAgIGJvb2xlYW4gdmFsaWQgPSBuYW1lUGFyc2VyLnBhcnNlKGJhc2ljTmFtZSk7Ci8vIFN0cmluZyBidW5kbGVuYW1lID0gYmFzaWNOYW1lOwogICAgICAgICAgICAgICAgaWYgKCF2YWxpZCkgewogICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQobmFtZSArICIgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIHZlcnNpb24gKGl0IGlzIHVucGFyc2FibGUpIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbnNKYXZhKGNoaWxkKSkgewovLyBidW5kbGVuYW1lID0gbmFtZVBhcnNlci5nZXRQcm9qZWN0U3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQobmFtZSArICIgY29udGFpbnMgamF2YSBidXQgaXMgbm90IHBhY2tlZCIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgICAgIHByaW50U3VtbWFyeShlcnJvcnMsIGphcmNoaWxkcmVuLCBwYWNrZWRjaGlsZHJlbiwgdG90YWxzaXplLCBjaGVja2VkKTsKICAgICAgICBpZiAoZXJyb3JzLnNpemUoKSA+IDApIHsKICAgICAgICAgICAgZmFpbHVyZXNPY2N1cmVkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhaWx1cmVzT2NjdXJlZDsKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgcHJpbnRTdW1tYXJ5KExpc3QgZXJyb3JzLCBGaWxlW10gamFyY2hpbGRyZW4sIEZpbGVbXSBwYWNrZWRjaGlsZHJlbiwgaW50IHRvdGFsc2l6ZSwgaW50IGNoZWNrZWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CgoKICAgICAgICBSZXBvcnRXcml0ZXIgcmVwb3J0V3JpdGVyID0gbmV3IFJlcG9ydFdyaXRlcihnZXRPdXRwdXREaXJlY3RvcnkoKSwgb3V0cHV0RmlsZW5hbWUpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCk7CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCIgICBEaXJlY3RvcnkgY2hlY2tlZDogIiArIGdldEJ1bmRsZURpcmVjdG9yeSgpKTsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oKTsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oIiBDaGVjayBvZiBwYWNrZWQgYW5kIG5vdCBwYWNrZWQgYnVuZGxlcy4iKTsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oIiAgIE51bWJlciBvZiBqYXIgZmlsZXMgIiArIGphcmNoaWxkcmVuLmxlbmd0aCk7CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCIgICBOdW1iZXIgb2YgcGFjay5neiBmaWxlcyAiICsgcGFja2VkY2hpbGRyZW4ubGVuZ3RoKTsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oIiAgIERpZmZlcmVuY2UsIG51bWJlciBvZiBqYXIgZmlsZXMgdG8gY2hlY2s6ICIgKyAoamFyY2hpbGRyZW4ubGVuZ3RoIC0gcGFja2VkY2hpbGRyZW4ubGVuZ3RoKSk7CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCIgICBDaGVja2VkICIgKyBjaGVja2VkICsgIiBvZiAiICsgdG90YWxzaXplICsgIi4iKTsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oIiAgIEVycm9ycyBmb3VuZDogIiArIGVycm9ycy5zaXplKCkpOwoKICAgICAgICAgICAgaWYgKGVycm9ycy5zaXplKCkgPiAwKSB7CiAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGVycm9ycyk7CiAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlcnJvcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CiAgICAgICAgICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oaXRlci5uZXh0KCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICByZXBvcnRXcml0ZXIuY2xvc2UoKTsKICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSBGaWxlW10gbm9wYWNrZWRGaWxlKEZpbGVbXSBqYXJjaGlsZHJlbiwgRmlsZVtdIHBhY2tlZGNoaWxkcmVuKSB7CiAgICAgICAgQXJyYXlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqYXJjaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBGaWxlIGZpbGUgPSBqYXJjaGlsZHJlbltpXTsKICAgICAgICAgICAgaWYgKCFjb250YWlucyhwYWNrZWRjaGlsZHJlbiwgZmlsZSkpIHsKICAgICAgICAgICAgICAgIHJlc3VsdHMuYWRkKGZpbGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIEZpbGVbXSBmaWxlQXJyYXkgPSBuZXcgRmlsZVtyZXN1bHRzLnNpemUoKV07CiAgICAgICAgaW50IGkgPSAwOwogICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSByZXN1bHRzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKICAgICAgICAgICAgZmlsZUFycmF5W2krK10gPSAoRmlsZSkgaXRlcmF0b3IubmV4dCgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmlsZUFycmF5OwogICAgfQoKICAgIHByaXZhdGUgYm9vbGVhbiBjb250YWlucyhGaWxlW10gcGFja2VkY2hpbGRyZW4sIEZpbGUgZmlsZSkgewogICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWNrZWRjaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBpZiAoZ2V0QmFzaWNOYW1lKHBhY2tlZGNoaWxkcmVuW2ldLmdldE5hbWUoKSwgRVhURU5TSU9OX1BBQ0VLRF9KQVIpLmVxdWFscyhnZXRCYXNpY05hbWUoZmlsZS5nZXROYW1lKCksIEVYVEVOU0lPTl9KQVIpKSkgewogICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zSmF2YShGaWxlIGphcmZpbGUpIHsKICAgICAgICAvLyBXZSBhc3N1bWUgdGhlIGZpbGUgaXMgYSAnamFyJyBmaWxlLgogICAgICAgIGJvb2xlYW4gY29udGFpbnNKYXZhID0gZmFsc2U7CiAgICAgICAgSmFyRmlsZSBqYXIgPSBudWxsOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGphciA9IG5ldyBKYXJGaWxlKGphcmZpbGUsIGZhbHNlLCBaaXBGaWxlLk9QRU5fUkVBRCk7CiAgICAgICAgICAgIEVudW1lcmF0aW9uPEphckVudHJ5PiBlbnRyaWVzID0gamFyLmVudHJpZXMoKTsKICAgICAgICAgICAgd2hpbGUgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKICAgICAgICAgICAgICAgIEphckVudHJ5IGVudHJ5ID0gZW50cmllcy5uZXh0RWxlbWVudCgpOwogICAgICAgICAgICAgICAgaWYgKGVudHJ5LmdldE5hbWUoKS5lbmRzV2l0aCgiLmNsYXNzIikpIHsKICAgICAgICAgICAgICAgICAgICBjb250YWluc0phdmEgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoZW50cnkuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuamFyIikpIHsKICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dCA9IGphci5nZXRJbnB1dFN0cmVhbShlbnRyeSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5zSmF2YShpbnB1dCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnNKYXZhID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0KICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgaWYgKGphciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGphci5jbG9zZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gY29udGFpbnNKYXZhOwogICAgfQoKICAgIHByaXZhdGUgYm9vbGVhbiBjb250YWluc0phdmEoSW5wdXRTdHJlYW0gaW5wdXQpIHsKICAgICAgICAvLyBXZSBhc3N1bWUgdGhlIGZpbGUgaXMgYSAnamFyJyBmaWxlLgogICAgICAgIGJvb2xlYW4gY29udGFpbnNKYXZhID0gZmFsc2U7CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIEphcklucHV0U3RyZWFtIGphcklucHV0U3RyZWFtID0gbmV3IEphcklucHV0U3RyZWFtKGlucHV0KTsKICAgICAgICAgICAgd2hpbGUgKGphcklucHV0U3RyZWFtLmF2YWlsYWJsZSgpID4gMCkgewogICAgICAgICAgICAgICAgWmlwRW50cnkgZW50cnkgPSBqYXJJbnB1dFN0cmVhbS5nZXROZXh0RW50cnkoKTsKICAgICAgICAgICAgICAgIGlmIChlbnRyeSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmdldE5hbWUoKS5lbmRzV2l0aCgiLmNsYXNzIikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnNKYXZhID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0KICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXQuY2xvc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNvbnRhaW5zSmF2YTsKICAgIH0KCiAgICBwcml2YXRlIFN0cmluZyBnZXRCYXNpY05hbWUoU3RyaW5nIGZ1bGxuYW1lLCBTdHJpbmcgZXh0ZW5zaW9uKSB7CiAgICAgICAgU3RyaW5nIHJlc3VsdCA9IGZ1bGxuYW1lOwogICAgICAgIGludCBwb3MgPSBmdWxsbmFtZS5sYXN0SW5kZXhPZihleHRlbnNpb24pOwogICAgICAgIGlmIChwb3MgPj0gMCkgewogICAgICAgICAgICByZXN1bHQgPSBmdWxsbmFtZS5zdWJzdHJpbmcoMCwgcG9zKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICBwdWJsaWMgU3RyaW5nIGdldE91dHB1dERpcmVjdG9yeSgpIHsKICAgICAgICByZXR1cm4gb3V0cHV0RGlyZWN0b3J5OwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dERpcmVjdG9yeShTdHJpbmcgb3V0cHV0RGlyZWN0b3J5KSB7CiAgICAgICAgdGhpcy5vdXRwdXREaXJlY3RvcnkgPSBvdXRwdXREaXJlY3Rvcnk7CiAgICB9CgogICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QnVuZGxlRGlyZWN0b3J5KCkgewogICAgICAgIGlmIChidW5kbGVEaXJlY3RvcnkgPT0gbnVsbCkgewogICAgICAgICAgICBTdHJpbmcgcHJvcGVydHkgPSBnZXREaXJlY3RvcnlUb0NoZWNrKCk7CiAgICAgICAgICAgIGlmIChwcm9wZXJ0eSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5lZWQgdG8gc2V0IGlucHV0IGRpcmVjdG9yeSB0byBjaGVjayBhZ2FpbnN0LiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5lbmRzV2l0aCgiLyIpKSB7CiAgICAgICAgICAgICAgICBidW5kbGVEaXJlY3RvcnkgPSBwcm9wZXJ0eSArICJhZ2dyZWdhdGUvcGx1Z2lucyI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBidW5kbGVEaXJlY3RvcnkgPSBwcm9wZXJ0eSArICIvYWdncmVnYXRlLy9wbHVnaW5zIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gYnVuZGxlRGlyZWN0b3J5OwogICAgfQp9ClBLAwQKAAAAAABvWAo/o81XZFYYAABWGAAALQAAAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvamFycy9WZXJzaW9uVGVzdC5jbGFzc8r+ur4AAAAxAS0HAAIBACdvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvVmVyc2lvblRlc3QHAAQBABBqYXZhL2xhbmcvT2JqZWN0AQANRVhURU5TSU9OX0pBUgEAEkxqYXZhL2xhbmcvU3RyaW5nOwEADUNvbnN0YW50VmFsdWUIAAkBAAQuamFyAQAURVhURU5TSU9OX1BBQ0VLRF9KQVIIAAwBAAwuamFyLnBhY2suZ3oBAA1FWFRFTlNJT05fWklQCAAPAQAELnppcAEACm5hbWVQYXJzZXIBADBMb3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9GdWxsSmFyTmFtZVBhcnNlcjsBAAlCQUNLU0xBU0gBAA5MSVRFUkFMX1BFUklPRAEAA0FOWQEACXRocmVlZG90cwEAGUxqYXZhL3V0aWwvcmVnZXgvUGF0dGVybjsBAA9vdXRwdXREaXJlY3RvcnkBAAxyZXBvcnRXcml0ZXIBACtMb3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9SZXBvcnRXcml0ZXI7AQAQZGlyZWN0b3J5VG9DaGVjawEABjxpbml0PgEAAygpVgEABENvZGUKAAMAHwwAGwAcBwAhAQAub3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9GdWxsSmFyTmFtZVBhcnNlcgoAIAAfCQABACQMABAAEQgAJgEAAVwJAAEAKAwAEgAGBwAqAQAXamF2YS9sYW5nL1N0cmluZ0J1aWxkZXIKACwALgcALQEAEGphdmEvbGFuZy9TdHJpbmcMAC8AMAEAB3ZhbHVlT2YBACYoTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvU3RyaW5nOwoAKQAyDAAbADMBABUoTGphdmEvbGFuZy9TdHJpbmc7KVYIADUBAAEuCgApADcMADgAOQEABmFwcGVuZAEALShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwoAKQA7DAA8AD0BAAh0b1N0cmluZwEAFCgpTGphdmEvbGFuZy9TdHJpbmc7CQABAD8MABMABggAQQEAAi4qCQABAEMMABQABgoARQBHBwBGAQAXamF2YS91dGlsL3JlZ2V4L1BhdHRlcm4MAEgASQEAB2NvbXBpbGUBAC0oTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL3V0aWwvcmVnZXgvUGF0dGVybjsJAAEASwwAFQAWAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAEdGhpcwEAKUxvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvVmVyc2lvblRlc3Q7AQAEbWFpbgEAFihbTGphdmEvbGFuZy9TdHJpbmc7KVYKAAEAHwgAVAEAGUQ6XHRlbXBcc3RhZ2luZ1xhZ2dyZWdhdGUKAAEAVgwAVwAzAQATc2V0RGlyZWN0b3J5VG9DaGVjawoAAQBZDABaAFsBABN0ZXN0RmVhdHVyZVZlcnNpb25zAQADKClaCgABAF0MAF4AWwEAEnRlc3RCdW5kbGVWZXJzaW9ucwoAYABiBwBhAQATamF2YS9pby9JT0V4Y2VwdGlvbgwAYwAcAQAPcHJpbnRTdGFja1RyYWNlAQAEYXJncwEAE1tMamF2YS9sYW5nL1N0cmluZzsBAAp0ZXN0bGF5b3V0AQABZQEAFUxqYXZhL2lvL0lPRXhjZXB0aW9uOwEAE2dldERpcmVjdG9yeVRvQ2hlY2sJAAEAawwAGgAGAQAQYnVuZGxlRGlyVG9DaGVjawEACkV4Y2VwdGlvbnMKAAEAbwwAaQA9BwBxAQAjb3JnL2FwYWNoZS90b29scy9hbnQvQnVpbGRFeGNlcHRpb24IAHMBAC1OZWVkIHRvIHNldCBpbnB1dCBkaXJlY3RvcnkgdG8gY2hlY2sgYWdhaW5zdC4KAHAAMggAdgEAAS8KACwAeAwAeQB6AQAIZW5kc1dpdGgBABUoTGphdmEvbGFuZy9TdHJpbmc7KVoIAHwBABFhZ2dyZWdhdGUvcGx1Z2lucwgAfgEAEi9hZ2dyZWdhdGUvcGx1Z2lucwcAgAEADGphdmEvaW8vRmlsZQoAfwAyCgB/AIMMAIQAWwEABmV4aXN0cwoAfwCGDACHAFsBAAtpc0RpcmVjdG9yeQgAiQEAEmJ1bmRsZSBkaXJlY290cnkgKAgAiwEAICkgbXVzdCBiZSBhbiBleGlzdGluZyBkaXJlY3RvcnkuCgABAI0MAI4AjwEAD2dldFJlcG9ydFdyaXRlcgEALSgpTG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvUmVwb3J0V3JpdGVyOwgAkQEAJSBDaGVjayBmb3IgNC1wYXJ0IHZlcnNpb25zIGluIEJ1bmRsZXMKAJMAlQcAlAEAKW9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvUmVwb3J0V3JpdGVyDACWADMBAAd3cml0ZWxuCgABAJgMAJkAmgEAEmNoZWNrRmlsZXNWZXJzaW9ucwEAEShMamF2YS9pby9GaWxlOylaAQAIcHJvcGVydHkBAA9idW5kbGVEaXJlY3RvcnkBAAhpbnB1dGRpcgEADkxqYXZhL2lvL0ZpbGU7AQAPZmFpbHVyZXNPY2N1cmVkAQABWgcAogEAE2phdmEvdXRpbC9BcnJheUxpc3QKAKEAHwcApQEALm9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvSkFSRmlsZU5hbWVGaWx0ZXIKAKQAHwoAfwCoDACpAKoBAAlsaXN0RmlsZXMBACkoTGphdmEvaW8vRmlsZW5hbWVGaWx0ZXI7KVtMamF2YS9pby9GaWxlOwoAfwCsDACtAD0BAAdnZXROYW1lCgB/AK8MALAAWwEABmlzRmlsZQoAAQCyDACzALQBAAxnZXRCYXNpY05hbWUBADgoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwoAIAC2DAC3AHoBAAVwYXJzZQgAuQEAMSBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgdmVyc2lvbiAoaXQgaXMgdW5wYXJzYWJsZSkLALsAvQcAvAEADmphdmEvdXRpbC9MaXN0DAC+AL8BAANhZGQBABUoTGphdmEvbGFuZy9PYmplY3Q7KVoKACAAwQwAwgA9AQAQZ2V0VmVyc2lvblN0cmluZwoARQDEDADFAMYBAAdtYXRjaGVyAQAzKExqYXZhL2xhbmcvQ2hhclNlcXVlbmNlOylMamF2YS91dGlsL3JlZ2V4L01hdGNoZXI7CgDIAMoHAMkBABdqYXZhL3V0aWwvcmVnZXgvTWF0Y2hlcgwAywBbAQAHbWF0Y2hlcwgAzQEAGSBkb2VzIG5vdCBjb250YWluIDQgcGFydHMIAM8BAAsgICBDaGVja2VkIAoAKQDRDAA4ANIBABwoSSlMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CADUAQAEIG9mIAgA1gEAESAgIEVycm9ycyBmb3VuZDogCwC7ANgMANkA2gEABHNpemUBAAMoKUkKANwA3gcA3QEAFWphdmEvdXRpbC9Db2xsZWN0aW9ucwwA3wDgAQAEc29ydAEAEyhMamF2YS91dGlsL0xpc3Q7KVYLALsA4gwA4wDkAQAIaXRlcmF0b3IBABYoKUxqYXZhL3V0aWwvSXRlcmF0b3I7CwDmAOgHAOcBABJqYXZhL3V0aWwvSXRlcmF0b3IMAOkA6gEABG5leHQBABQoKUxqYXZhL2xhbmcvT2JqZWN0OwoAkwDsDACWAO0BABUoTGphdmEvbGFuZy9PYmplY3Q7KVYLAOYA7wwA8ABbAQAHaGFzTmV4dAEABmVycm9ycwEAEExqYXZhL3V0aWwvTGlzdDsBAAhjaGlsZHJlbgEAD1tMamF2YS9pby9GaWxlOwEACXRvdGFsc2l6ZQEAAUkBAAdjaGVja2VkAQABaQEABWNoaWxkAQAEbmFtZQEABXZhbGlkAQAHdmVyc2lvbgEAGUxqYXZhL3V0aWwvcmVnZXgvTWF0Y2hlcjsBAARpdGVyAQAUTGphdmEvdXRpbC9JdGVyYXRvcjsKACwBAQwBAgEDAQALbGFzdEluZGV4T2YBABUoTGphdmEvbGFuZy9TdHJpbmc7KUkKACwBBQwBBgEHAQAJc3Vic3RyaW5nAQAWKElJKUxqYXZhL2xhbmcvU3RyaW5nOwEACGZ1bGxuYW1lAQAJZXh0ZW5zaW9uAQAGcmVzdWx0AQADcG9zAQAUdGVzdFZlcnNpb25zUGF0dGVybnMIAQ4BAB1DaGVjayA0LXBhcnQgdmVyc2lvbiBwYXR0ZXJucwoAkwEQDAERABwBAAVjbG9zZQEAD2ZlYXR1cmVGYWlsdXJl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KioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLmp1bm8udGVzdHMuamFyczsKCmltcG9ydCBqYXZhLmlvLkZpbGU7CmltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKaW1wb3J0IGphdmEudXRpbC5MaXN0OwppbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CmltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKCmltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmp1bm8udGVzdHMuamFycy5WZXJzaW9uVGVzdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmp1bm8udGVzdHMudXRpbHMuRnVsbEphck5hbWVQYXJzZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5qdW5vLnRlc3RzLnV0aWxzLkpBUkZpbGVOYW1lRmlsdGVyOwppbXBvcnQgb3JnLmVjbGlwc2UuanVuby50ZXN0cy51dGlscy5SZXBvcnRXcml0ZXI7CgovKioKICogQHNpbmNlIDMuMwogKi8KcHVibGljIGNsYXNzIFZlcnNpb25UZXN0IHsKCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX0pBUiAgICAgICAgPSAiLmphciI7CiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BBQ0VLRF9KQVIgPSAiLmphci5wYWNrLmd6IjsKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fWklQICAgICAgICA9ICIuemlwIjsKICAgIHByaXZhdGUgRnVsbEphck5hbWVQYXJzZXIgICBuYW1lUGFyc2VyICAgICAgICAgICA9IG5ldyBGdWxsSmFyTmFtZVBhcnNlcigpOwogICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgIEJBQ0tTTEFTSCAgICAgICAgICAgID0gIlxcIjsKICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICBMSVRFUkFMX1BFUklPRCAgICAgICA9IEJBQ0tTTEFTSCArICIuIjsKICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICBBTlkgICAgICAgICAgICAgICAgICA9ICIuKiI7CiAgICBwcml2YXRlIFBhdHRlcm4gICAgICAgICAgICAgdGhyZWVkb3RzICAgICAgICAgICAgPSBQYXR0ZXJuLmNvbXBpbGUoQU5ZICsgTElURVJBTF9QRVJJT0QgKyBBTlkgKyBMSVRFUkFMX1BFUklPRCArIEFOWSArIExJVEVSQUxfUEVSSU9EICsgQU5ZKTsKICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICBvdXRwdXREaXJlY3Rvcnk7CiAgICBwcml2YXRlIFJlcG9ydFdyaXRlciAgICAgICAgcmVwb3J0V3JpdGVyOwoKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKCiAgICAgICAgVmVyc2lvblRlc3QgdGVzdGxheW91dCA9IG5ldyBWZXJzaW9uVGVzdCgpOwogICAgICAgIHRlc3RsYXlvdXQuc2V0RGlyZWN0b3J5VG9DaGVjaygiRDpcXHRlbXBcXHN0YWdpbmdcXGFnZ3JlZ2F0ZSIpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHRlc3RsYXlvdXQudGVzdEZlYXR1cmVWZXJzaW9ucygpOwogICAgICAgICAgICB0ZXN0bGF5b3V0LnRlc3RCdW5kbGVWZXJzaW9ucygpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgIH0KCiAgICB9CgogICAgcHJpdmF0ZSBTdHJpbmcgZGlyZWN0b3J5VG9DaGVjazsKCgogICAgcHVibGljIFN0cmluZyBnZXREaXJlY3RvcnlUb0NoZWNrKCkgewogICAgICAgIHJldHVybiBkaXJlY3RvcnlUb0NoZWNrOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHNldERpcmVjdG9yeVRvQ2hlY2soU3RyaW5nIGJ1bmRsZURpclRvQ2hlY2spIHsKICAgICAgICB0aGlzLmRpcmVjdG9yeVRvQ2hlY2sgPSBidW5kbGVEaXJUb0NoZWNrOwogICAgfQoKICAgIHByaXZhdGUgYm9vbGVhbiB0ZXN0QnVuZGxlVmVyc2lvbnMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewoKICAgICAgICBTdHJpbmcgcHJvcGVydHkgPSBnZXREaXJlY3RvcnlUb0NoZWNrKCk7CiAgICAgICAgaWYgKHByb3BlcnR5ID09IG51bGwpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJOZWVkIHRvIHNldCBpbnB1dCBkaXJlY3RvcnkgdG8gY2hlY2sgYWdhaW5zdC4iKTsKICAgICAgICB9CiAgICAgICAgU3RyaW5nIGJ1bmRsZURpcmVjdG9yeSA9IG51bGw7CiAgICAgICAgaWYgKHByb3BlcnR5LmVuZHNXaXRoKCIvIikpIHsKICAgICAgICAgICAgYnVuZGxlRGlyZWN0b3J5ID0gcHJvcGVydHkgKyAiYWdncmVnYXRlL3BsdWdpbnMiOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgYnVuZGxlRGlyZWN0b3J5ID0gcHJvcGVydHkgKyAiL2FnZ3JlZ2F0ZS9wbHVnaW5zIjsKICAgICAgICB9CiAgICAgICAgRmlsZSBpbnB1dGRpciA9IG5ldyBGaWxlKGJ1bmRsZURpcmVjdG9yeSk7CiAgICAgICAgaWYgKCEoaW5wdXRkaXIuZXhpc3RzKCkgJiYgaW5wdXRkaXIuaXNEaXJlY3RvcnkoKSkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJidW5kbGUgZGlyZWNvdHJ5ICgiICsgYnVuZGxlRGlyZWN0b3J5ICsgIikgbXVzdCBiZSBhbiBleGlzdGluZyBkaXJlY3RvcnkuIik7CiAgICAgICAgfQogICAgICAgIGdldFJlcG9ydFdyaXRlcigpLndyaXRlbG4oIiBDaGVjayBmb3IgNC1wYXJ0IHZlcnNpb25zIGluIEJ1bmRsZXMiKTsKICAgICAgICBib29sZWFuIGZhaWx1cmVzT2NjdXJlZCA9IGNoZWNrRmlsZXNWZXJzaW9ucyhpbnB1dGRpcik7CiAgICAgICAgLy8gYXNzZXJ0RmFsc2UoIlNvbWUgYnVuZGxlcyBkaWQgbm90IGhhdmUgNCBwYXJ0IHZlcnNpb24gbnVtYmVycyIsIGZhaWx1cmVzT2NjdXJlZCk7CiAgICAgICAgcmV0dXJuIGZhaWx1cmVzT2NjdXJlZDsKICAgIH0KCiAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tGaWxlc1ZlcnNpb25zKEZpbGUgaW5wdXRkaXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgLy8gcmVzZXQvaW5pdGlhbGl6ZSBlcnJvcnMKICAgICAgICBMaXN0IGVycm9ycyA9IG5ldyBBcnJheUxpc3QoKTsKICAgICAgICBib29sZWFuIGZhaWx1cmVzT2NjdXJlZCA9IGZhbHNlOwogICAgICAgIEZpbGVbXSBjaGlsZHJlbiA9IGlucHV0ZGlyLmxpc3RGaWxlcyhuZXcgSkFSRmlsZU5hbWVGaWx0ZXIoKSk7CiAgICAgICAgaW50IHRvdGFsc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDsKICAgICAgICBpbnQgY2hlY2tlZCA9IDA7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBGaWxlIGNoaWxkID0gY2hpbGRyZW5baV07CiAgICAgICAgICAgIFN0cmluZyBuYW1lID0gY2hpbGQuZ2V0TmFtZSgpOwogICAgICAgICAgICAvLyBhc3N1bWUgZGlyZWN0b3J5IGlmIG5vdCBmaWxlCiAgICAgICAgICAgIGlmIChjaGlsZC5pc0ZpbGUoKSkgewogICAgICAgICAgICAgICAgaWYgKG5hbWUuZW5kc1dpdGgoRVhURU5TSU9OX1BBQ0VLRF9KQVIpKSB7CiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGdldEJhc2ljTmFtZShuYW1lLCBFWFRFTlNJT05fUEFDRUtEX0pBUik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChuYW1lLmVuZHNXaXRoKEVYVEVOU0lPTl9KQVIpKSB7CiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGdldEJhc2ljTmFtZShuYW1lLCBFWFRFTlNJT05fSkFSKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5hbWUuZW5kc1dpdGgoRVhURU5TSU9OX1pJUCkpIHsKICAgICAgICAgICAgICAgICAgICBuYW1lID0gZ2V0QmFzaWNOYW1lKG5hbWUsIEVYVEVOU0lPTl9aSVApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNoZWNrZWQrKzsKICAgICAgICAgICAgYm9vbGVhbiB2YWxpZCA9IG5hbWVQYXJzZXIucGFyc2UobmFtZSk7CiAgICAgICAgICAgIGlmICghdmFsaWQpIHsKICAgICAgICAgICAgICAgIGVycm9ycy5hZGQobmFtZSArICIgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIHZlcnNpb24gKGl0IGlzIHVucGFyc2FibGUpIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBTdHJpbmcgdmVyc2lvbiA9IG5hbWVQYXJzZXIuZ2V0VmVyc2lvblN0cmluZygpOwogICAgICAgICAgICAgICAgTWF0Y2hlciBtYXRjaGVyID0gdGhyZWVkb3RzLm1hdGNoZXIodmVyc2lvbik7CgogICAgICAgICAgICAgICAgaWYgKCFtYXRjaGVyLm1hdGNoZXMoKSkgewogICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQobmFtZSArICIgZG9lcyBub3QgY29udGFpbiA0IHBhcnRzIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZ2V0UmVwb3J0V3JpdGVyKCkud3JpdGVsbigiICAgQ2hlY2tlZCAiICsgY2hlY2tlZCArICIgb2YgIiArIHRvdGFsc2l6ZSArICIuIik7CiAgICAgICAgZ2V0UmVwb3J0V3JpdGVyKCkud3JpdGVsbigiICAgRXJyb3JzIGZvdW5kOiAiICsgZXJyb3JzLnNpemUoKSk7CgogICAgICAgIGlmIChlcnJvcnMuc2l6ZSgpID4gMCkgewogICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGVycm9ycyk7CiAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGVycm9ycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKICAgICAgICAgICAgICAgIGdldFJlcG9ydFdyaXRlcigpLndyaXRlbG4oaXRlci5uZXh0KCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZhaWx1cmVzT2NjdXJlZCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWlsdXJlc09jY3VyZWQ7CiAgICB9CgogICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QmFzaWNOYW1lKFN0cmluZyBmdWxsbmFtZSwgU3RyaW5nIGV4dGVuc2lvbikgewogICAgICAgIFN0cmluZyByZXN1bHQgPSBmdWxsbmFtZTsKICAgICAgICBpbnQgcG9zID0gZnVsbG5hbWUubGFzdEluZGV4T2YoZXh0ZW5zaW9uKTsKICAgICAgICBpZiAocG9zID49IDApIHsKICAgICAgICAgICAgcmVzdWx0ID0gZnVsbG5hbWUuc3Vic3RyaW5nKDAsIHBvcyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgcHVibGljIGJvb2xlYW4gdGVzdFZlcnNpb25zUGF0dGVybnMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgZ2V0UmVwb3J0V3JpdGVyKCkud3JpdGVsbigiQ2hlY2sgNC1wYXJ0IHZlcnNpb24gcGF0dGVybnMiKTsKICAgICAgICAgICAgYm9vbGVhbiBmZWF0dXJlRmFpbHVyZXMgPSB0ZXN0RmVhdHVyZVZlcnNpb25zKCk7CiAgICAgICAgICAgIGJvb2xlYW4gYnVuZGxlRmFpbHVyZXMgPSB0ZXN0QnVuZGxlVmVyc2lvbnMoKTsKICAgICAgICAgICAgcmVzdWx0ID0gZmVhdHVyZUZhaWx1cmVzIHx8IGJ1bmRsZUZhaWx1cmVzOwogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgZ2V0UmVwb3J0V3JpdGVyKCkuY2xvc2UoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICBwcml2YXRlIGJvb2xlYW4gdGVzdEZlYXR1cmVWZXJzaW9ucygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CgogICAgICAgIFN0cmluZyBwcm9wZXJ0eSA9IGdldERpcmVjdG9yeVRvQ2hlY2soKTsKICAgICAgICBpZiAocHJvcGVydHkgPT0gbnVsbCkgewogICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5lZWQgdG8gc2V0IGlucHV0IGRpcmVjdG9yeSB0byBjaGVjayBhZ2FpbnN0LiIpOwogICAgICAgIH0KICAgICAgICBTdHJpbmcgZmVhdHVyZURpcmVjdG9yeSA9IG51bGw7CiAgICAgICAgaWYgKHByb3BlcnR5LmVuZHNXaXRoKCIvIikpIHsKICAgICAgICAgICAgZmVhdHVyZURpcmVjdG9yeSA9IHByb3BlcnR5ICsgImFnZ3JlZ2F0ZS9mZWF0dXJlcyI7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBmZWF0dXJlRGlyZWN0b3J5ID0gcHJvcGVydHkgKyAiL2FnZ3JlZ2F0ZS9mZWF0dXJlcyI7CiAgICAgICAgfQogICAgICAgIEZpbGUgaW5wdXRkaXIgPSBuZXcgRmlsZShmZWF0dXJlRGlyZWN0b3J5KTsKICAgICAgICBpZiAoIShpbnB1dGRpci5leGlzdHMoKSAmJiBpbnB1dGRpci5pc0RpcmVjdG9yeSgpKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImZlYXR1cmUgZGlyZWNvdHJ5ICgiICsgZmVhdHVyZURpcmVjdG9yeSArICIpIG11c3QgYmUgYW4gZXhpc3RpbmcgZGlyZWN0b3J5LiIpOwogICAgICAgIH0KICAgICAgICBnZXRSZXBvcnRXcml0ZXIoKS53cml0ZWxuKCIgQ2hlY2sgZm9yIDQtcGFydCB2ZXJzaW9ucyBpbiBGZWF0dXJlcyIpOwogICAgICAgIGJvb2xlYW4gZmFpbHVyZXNPY2N1cmVkID0gY2hlY2tGaWxlc1ZlcnNpb25zKGlucHV0ZGlyKTsKICAgICAgICAvLyBhc3NlcnRGYWxzZSgiU29tZSBmZWF0dXJlcyBkaWQgbm90IGhhdmUgNCBwYXJ0IHZlcnNpb24gbnVtYmVycyIsIGZhaWx1cmVzT2NjdXJlZCk7CiAgICAgICAgcmV0dXJuIGZhaWx1cmVzT2NjdXJlZDsKCiAgICB9CgogICAgcHVibGljIFN0cmluZyBnZXRPdXRwdXREaXJlY3RvcnkoKSB7CiAgICAgICAgcmV0dXJuIG91dHB1dERpcmVjdG9yeTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXREaXJlY3RvcnkoU3RyaW5nIG91dHB1dERpcmVjdG9yeSkgewogICAgICAgIHRoaXMub3V0cHV0RGlyZWN0b3J5ID0gb3V0cHV0RGlyZWN0b3J5OwogICAgfQoKICAgIHB1YmxpYyBSZXBvcnRXcml0ZXIgZ2V0UmVwb3J0V3JpdGVyKCkgewogICAgICAgIGlmIChyZXBvcnRXcml0ZXIgPT0gbnVsbCkgewogICAgICAgICAgICBTdHJpbmcgb3V0cHV0RmlsZW5hbWUgPSAidmVyc2lvblBhdHRlcm5DaGVjay50eHQiOwogICAgICAgICAgICByZXBvcnRXcml0ZXIgPSBuZXcgUmVwb3J0V3JpdGVyKGdldE91dHB1dERpcmVjdG9yeSgpLCBvdXRwdXRGaWxlbmFtZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXBvcnRXcml0ZXI7CiAgICB9Cn0KUEsDBAoAAAAAAG9YCj8jWuopuwQAALsEAAAqAAAAb3JnL2VjbGlwc2UvanVuby90ZXN0cy9qYXJzL1Rlc3RKYXJzLmNsYXNzyv66vgAAADEALgcAAgEAJG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvamFycy9UZXN0SmFycwcABAEAEGphdmEvbGFuZy9PYmplY3QBAA9idW5kbGVEaXJlY3RvcnkBABJMamF2YS9sYW5nL1N0cmluZzsBABBkaXJlY3RvcnlUb0NoZWNrAQAOdGVtcFdvcmtpbmdEaXIBAA9vdXRwdXREaXJlY3RvcnkBAAY8aW5pdD4BAAMoKVYBAARDb2RlCgADAA4MAAoACwkAAQAQDAAFAAYBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQAmTG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvamFycy9UZXN0SmFyczsBABNnZXREaXJlY3RvcnlUb0NoZWNrAQAUKClMamF2YS9sYW5nL1N0cmluZzsJAAEAGAwABwAGAQATc2V0RGlyZWN0b3J5VG9DaGVjawEAFShMamF2YS9sYW5nL1N0cmluZzspVgEAEGJ1bmRsZURpclRvQ2hlY2sBABJnZXRPdXRwdXREaXJlY3RvcnkJAAEAHgwACQAGCAAgAQAIdXNlci5kaXIKACIAJAcAIwEAEGphdmEvbGFuZy9TeXN0ZW0MACUAJgEAC2dldFByb3BlcnR5AQAmKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZzsBABFnZXRUZW1wV29ya2luZ0RpcgkAAQApDAAIAAYBABFzZXRUZW1wV29ya2luZ0RpcgEAEnNldE91dHB1dERpcmVjdG9yeQEAClNvdXJjZUZpbGUBAA1UZXN0SmFycy5qYXZhBCEAAQADAAAABAAEAAUABgAAAAIABwAGAAAAAgAIAAYAAAACAAkABgAAAAcAAQAKAAsAAQAMAAAAPAACAAEAAAAKKrcADSoBtQAPsQAAAAIAEQAAAA4AAwAAAAMABAAGAAkAAwASAAAADAABAAAACgATABQAAAABABUAFgABAAwAAAAvAAEAAQAAAAUqtAAXsAAAAAIAEQAAAAYAAQAAAAwAEgAAAAwAAQAAAAUAEwAUAAAAAQAZABoAAQAMAAAAPgACAAIAAAAGKiu1ABexAAAAAgARAAAACgACAAAAEAAFABEAEgAAABYAAgAAAAYAEwAUAAAAAAAGABsABgABAAEAHAAWAAEADAAAAEcAAgABAAAAFSq0AB3HAAwqEh+4ACG1AB0qtAAdsAAAAAIAEQAAAA4AAwAAABQABwAVABAAFwASAAAADAABAAAAFQATABQAAAABACcAFgABAAwAAAAvAAEAAQAAAAUqtAAosAAAAAIAEQAAAAYAAQAAABsAEgAAAAwAAQAAAAUAEwAUAAAAAQAqABoAAQAMAAAAPgACAAIAAAAGKiu1ACixAAAAAgARAAAACgACAAAAHwAFACAAEgAAABYAAgAAAAYAEwAUAAAAAAAGAAgABgABAAEAKwAaAAEADAAAAD4AAgACAAAABiortQAdsQAAAAIAEQAAAAoAAgAAACMABQAkABIAAAAWAAIAAAAGABMAFAAAAAAABgAJAAYAAQABACwAAAACAC1QSwMECgAAAAAA/J4JP8Gvi9KmAwAApgMAACkAAABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvVGVzdEphcnMuamF2YXBhY2thZ2Ugb3JnLmVjbGlwc2UuanVuby50ZXN0cy5qYXJzOwoKcHVibGljIGFic3RyYWN0IGNsYXNzIFRlc3RKYXJzIHsKCgogICAgcHJvdGVjdGVkIFN0cmluZyBidW5kbGVEaXJlY3RvcnkgPSBudWxsOwogICAgcHJpdmF0ZSBTdHJpbmcgICBkaXJlY3RvcnlUb0NoZWNrOwogICAgcHJpdmF0ZSBTdHJpbmcgICB0ZW1wV29ya2luZ0RpcjsKICAgIHByaXZhdGUgU3RyaW5nICAgb3V0cHV0RGlyZWN0b3J5OwoKICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlyZWN0b3J5VG9DaGVjaygpIHsKICAgICAgICByZXR1cm4gZGlyZWN0b3J5VG9DaGVjazsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBzZXREaXJlY3RvcnlUb0NoZWNrKFN0cmluZyBidW5kbGVEaXJUb0NoZWNrKSB7CiAgICAgICAgdGhpcy5kaXJlY3RvcnlUb0NoZWNrID0gYnVuZGxlRGlyVG9DaGVjazsKICAgIH0KCiAgICBwdWJsaWMgU3RyaW5nIGdldE91dHB1dERpcmVjdG9yeSgpIHsKICAgICAgICBpZiAob3V0cHV0RGlyZWN0b3J5ID09IG51bGwpIHsKICAgICAgICAgICAgb3V0cHV0RGlyZWN0b3J5ID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gb3V0cHV0RGlyZWN0b3J5OwogICAgfQoKICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGVtcFdvcmtpbmdEaXIoKSB7CiAgICAgICAgcmV0dXJuIHRlbXBXb3JraW5nRGlyOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHNldFRlbXBXb3JraW5nRGlyKFN0cmluZyB0ZW1wV29ya2luZ0RpcikgewogICAgICAgIHRoaXMudGVtcFdvcmtpbmdEaXIgPSB0ZW1wV29ya2luZ0RpcjsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXREaXJlY3RvcnkoU3RyaW5nIG91dHB1dERpcmVjdG9yeSkgewogICAgICAgIHRoaXMub3V0cHV0RGlyZWN0b3J5ID0gb3V0cHV0RGlyZWN0b3J5OwogICAgfQoKfQpQSwMECgAAAAAAABnJPscv7m7/AwAA/wMAAC0AAABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvY29uZmlnLnByb3BlcnRpZXMjIGRlZmF1bHQgbGF5b3V0IGZvciBhIHNvdXJjZSBidW5kbGUuIGNvbnRhaW5zIGEgbWFuaWZlc3QsCiMgYWJvdXQgZmlsZSwgcGx1Z2luLnhtbCBhbmQgcGx1Z2luLnByb3BlcnRpZXMgZm9yIHRyYW5zbGF0aW9uLAojIGFzIHdlbGwgYXMgYSB6aXAgZmlsZSB3aXRoIHNvdXJjZSBhbmQgYW4gYWJvdXQuCmRlZmF1bHQuc291cmNlLmphciA9IE1FVEEtSU5GL01BTklGRVNUXC5NRiwgXAoJCWFib3V0XC5odG1sCgojIGRlZmF1bHQgbGF5b3V0IGZvciBhIGJpbmFyeSBidW5kbGUuIGNvbnRhaW5zIGEgbWFuaWZlc3QsIAojIGFib3V0IGZpbGUsIGFuZCBhdCBsZWFzdCBvbmUgY2xhc3MgZmlsZSBvciBKQVIKZGVmYXVsdC5iaW5hcnkuamFyID0gTUVUQS1JTkYvTUFOSUZFU1RcLk1GLCBcCgkJYWJvdXRcLmh0bWwKCiMgZGVmYXVsdCBsYXlvdXQgZm9yIGEgc291cmNlIGJ1bmRsZS4gY29udGFpbnMgYSBtYW5pZmVzdCwKIyBhYm91dCBmaWxlLCBwbHVnaW4ueG1sIGFuZCBwbHVnaW4ucHJvcGVydGllcyBmb3IgdHJhbnNsYXRpb24sCiMgYXMgd2VsbCBhcyBhIHppcCBmaWxlIHdpdGggc291cmNlIGFuZCBhbiBhYm91dC4gTm90ZSB0aGUKIyBleHRyYSBkaXJlY3RvcnkgZW50cnkgYXQgdGhlIGJlZ2lubmluZwpkZWZhdWx0LnNvdXJjZS56aXAgPSBeLiovTUVUQS1JTkYvTUFOSUZFU1RcLk1GLCBcCgkJXi4qL2Fib3V0XC5odG1sCgojIGRlZmF1bHQgbGF5b3V0IGZvciBhIGJpbmFyeSBidW5kbGUuIGNvbnRhaW5zIGEgbWFuaWZlc3QsIAojIGFib3V0IGZpbGUsIGFuZCBhdCBsZWFzdCBvbmUgY2xhc3MgZmlsZSBvciBKQVIuIE5vdGUgdGhlCiMgZXh0cmEgZGlyZWN0b3J5IGVudHJ5IGF0IHRoZSBiZWdpbm5pbmcKZGVmYXVsdC5iaW5hcnkuemlwID0gXi4qL01FVEEtSU5GL01BTklGRVNUXC5NRiwgXAoJCV4uKi9hYm91dFwuaHRtbAoKCiMgZGVmYXVsdCBsYXlvdXQgZm9yIGEgZmVhdHVyZQpkZWZhdWx0LmZlYXR1cmUgPSBsaWNlbnNlXC5odG1sLCBcCgkJKGVkbC12MTBcLmh0bWx8ZXBsLXYxMFwuaHRtbClQSwMECgAAAAAAymIKO06BelF0BwAAdAcAADEAAABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvY29uZmlnSE9MRC5wcm9wZXJ0aWVzIyBkZWZhdWx0IGxheW91dCBmb3IgYSBzb3VyY2UgYnVuZGxlLiBjb250YWlucyBhIG1hbmlmZXN0LAojIGFib3V0IGZpbGUsIHBsdWdpbi54bWwgYW5kIHBsdWdpbi5wcm9wZXJ0aWVzIGZvciB0cmFuc2xhdGlvbiwKIyBhcyB3ZWxsIGFzIGEgemlwIGZpbGUgd2l0aCBzb3VyY2UgYW5kIGFuIGFib3V0LgpkZWZhdWx0LnNvdXJjZS5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVFwuTUYsIFwKCQlhYm91dFwuaHRtbCwgXAoJCS4qKHBsdWdpbnxidW5kbGUpXC5wcm9wZXJ0aWVzCgojIGRlZmF1bHQgbGF5b3V0IGZvciBhIGJpbmFyeSBidW5kbGUuIGNvbnRhaW5zIGEgbWFuaWZlc3QsIAojIGFib3V0IGZpbGUsIGFuZCBhdCBsZWFzdCBvbmUgY2xhc3MgZmlsZSBvciBKQVIKZGVmYXVsdC5iaW5hcnkuamFyID0gTUVUQS1JTkYvTUFOSUZFU1RcLk1GLCBcCgkJYWJvdXRcLmh0bWwsIFwKCQkuKihwbHVnaW58YnVuZGxlKVwucHJvcGVydGllcywgXAoJCS4qXC4oY2xhc3N8amFyKSQKCiMgZGVmYXVsdCBsYXlvdXQgZm9yIGEgc291cmNlIGJ1bmRsZS4gY29udGFpbnMgYSBtYW5pZmVzdCwKIyBhYm91dCBmaWxlLCBwbHVnaW4ueG1sIGFuZCBwbHVnaW4ucHJvcGVydGllcyBmb3IgdHJhbnNsYXRpb24sCiMgYXMgd2VsbCBhcyBhIHppcCBmaWxlIHdpdGggc291cmNlIGFuZCBhbiBhYm91dC4gTm90ZSB0aGUKIyBleHRyYSBkaXJlY3RvcnkgZW50cnkgYXQgdGhlIGJlZ2lubmluZwpkZWZhdWx0LnNvdXJjZS56aXAgPSBeLiovTUVUQS1JTkYvTUFOSUZFU1RcLk1GLCBcCgkJXi4qL2Fib3V0XC5odG1sLCBcCgkJXi4qLyhwbHVnaW58YnVuZGxlKVwucHJvcGVydGllcwoKIyBkZWZhdWx0IGxheW91dCBmb3IgYSBiaW5hcnkgYnVuZGxlLiBjb250YWlucyBhIG1hbmlmZXN0LCAKIyBhYm91dCBmaWxlLCBhbmQgYXQgbGVhc3Qgb25lIGNsYXNzIGZpbGUgb3IgSkFSLiBOb3RlIHRoZQojIGV4dHJhIGRpcmVjdG9yeSBlbnRyeSBhdCB0aGUgYmVnaW5uaW5nCmRlZmF1bHQuYmluYXJ5LnppcCA9IF4uKi9NRVRBLUlORi9NQU5JRkVTVFwuTUYsIFwKCQleLiovYWJvdXRcLmh0bWwsIFwKCQleLiovKHBsdWdpbnxidW5kbGUpXC5wcm9wZXJ0aWVzLCBcCgkJLipcLihjbGFzc3xqYXIpJAoKIyBzcGVjaWFsIGNhc2Ugb2YgYSBjb2RlIGJ1bmRsZSBub3QgY29udGFpbmluZyBjb2RlID8Kb3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbj0gTUVUQS1JTkYvTUFOSUZFU1RcLk1GLCBcCgkJYWJvdXRcLmh0bWwsIFwKCQkuKihwbHVnaW58YnVuZGxlKVwucHJvcGVydGllcyAKCQkKIyBzcGVjaWFsIGNhc2Ugd2l0aCBubyBjb2RlOiBicmFuZGluZyBidW5kbGUKb3JnLmVjbGlwc2Uud3N0LnhzbD0gTUVUQS1JTkYvTUFOSUZFU1RcLk1GLCBcCgkJYWJvdXRcLmh0bWwsIFwKCQkuKihwbHVnaW58YnVuZGxlKVwucHJvcGVydGllcyAKCQkKIyBzcGVjaWFsIGNhc2Ugd2l0aCBubyBjb2RlOiBicmFuZGluZyBidW5kbGUJCm9yZy5lY2xpcHNlLndzdC5jb21tb24uZnByb2ouc2RrPSBNRVRBLUlORi9NQU5JRkVTVFwuTUYsIFwKCQlhYm91dFwuaHRtbCwgXAoJCS4qKHBsdWdpbnxidW5kbGUpXC5wcm9wZXJ0aWVzIAkKCiMgc3BlY2lhbCBjYXNlIHdpdGggbm8gY29kZTogYnJhbmRpbmcgYnVuZGxlCQkJCm9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnByb2ouZW5hYmxlbWVudC5qZHQuc2RrPSBNRVRBLUlORi9NQU5JRkVTVFwuTUYsIFwKCQlhYm91dFwuaHRtbCwgXAoJCS4qKHBsdWdpbnxidW5kbGUpXC5wcm9wZXJ0aWVzIAkKCQkKIyBzcGVjaWFsIGNhc2Ugb2YgYSBidW5kbGUgd2l0aCBubyBjb2RlCQkKb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLmVqYi51aT0gTUVUQS1JTkYvTUFOSUZFU1RcLk1GLCBcCgkJYWJvdXRcLmh0bWwsIFwKCQkuKihwbHVnaW58YnVuZGxlKVwucHJvcGVydGllcyAJCgkJCQkJUEsDBAoAAAAAAMpiCjvtt5302AMAANgDAAAxAAAAb3JnL2VjbGlwc2UvanVuby90ZXN0cy9qYXJzL2V4Y2VwdGlvbnMucHJvcGVydGllc2JyZWVFeGNlcHRpb25zPW9yZy5lY2xpcHNlLnN3dCwgXAogb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwsIFwKIG9yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMsIFwKIG9yZy5lY2xpcHNlLnNkay5leGFtcGxlcywgXAogb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MsIFwKIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLCBcCiBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMsIFwKIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlciwgXAogb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMsIFwKIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIsIFwKIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludCwgXAogb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLCBcCiBvcmcuZWNsaXBzZS50ZWFtLmV4YW1wbGVzLmZpbGVzeXN0ZW0sIFwKIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmphdmFlZGl0b3IsIFwKIG9yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sLCBcCiBvcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLCBcCiBvcmcuZWNsaXBzZS5zZGsuZXhhbXBsZXMsIFwKIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLCBcCiBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3NlciwgXAogb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzLCBcCiBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIsIFwKIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzLCBcCiBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyLCBcCiBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQsIFwKIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcywgXAogb3JnLmVjbGlwc2UudGVhbS5leGFtcGxlcy5maWxlc3lzdGVtLCBcCiBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qYXZhZWRpdG9yLCBcClBLAwQKAAAAAABvWAo/FV9MNiQkAAAkJAAAMgAAAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvcmVwb3MvVmVyc2lvbkNoZWNraW5nLmNsYXNzyv66vgAAADEBcAcAAgEALG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvcmVwb3MvVmVyc2lvbkNoZWNraW5nBwAEAQAlb3JnL2VjbGlwc2UvanVuby90ZXN0cy9yZXBvcy9UZXN0UmVwbwEABkVRVUFMUwEAEkxqYXZhL2xhbmcvU3RyaW5nOwEADUNvbnN0YW50VmFsdWUIAAkBAAZlcXVhbHMBAAtTVEFSVFNfV0lUSAgADAEACnN0YXJ0c1dpdGgBABZTVEFSVFdJVEhfTUFUQ0hfTEVOR1RIAQABSQMAAAAFAQAGPGluaXQ+AQADKClWAQAEQ29kZQoAAwAUDAAQABEBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQAuTG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvcmVwb3MvVmVyc2lvbkNoZWNraW5nOwEABXN1aXRlAQAYKClManVuaXQvZnJhbWV3b3JrL1Rlc3Q7CQAcAB4HAB0BABBqYXZhL2xhbmcvU3lzdGVtDAAfACABAANvdXQBABVMamF2YS9pby9QcmludFN0cmVhbTsIACIBABV0ZXN0IHZlcnNpb24gY2hlY2tpbmcKACQAJgcAJQEAE2phdmEvaW8vUHJpbnRTdHJlYW0MACcAKAEAB3ByaW50bG4BABUoTGphdmEvbGFuZy9TdHJpbmc7KVYKAAEAFAgAKwEAE3Rlc3RWZXJzaW9uVW5pcW5lc3MKAAEALQwALgAoAQAHc2V0TmFtZQgAMAEALGZpbGU6Ly8vaG9tZS9zaGFyZWQvd2VidG9vbHMvdGVzdFN0YWdpbmdSZXBvCgABADIMADMAKAEAEHNldFJlcG9VUkxUb1Rlc3QIADUBABEvaG9tZS9kYXZpZHcvdGVtcAoAAQA3DAA4ACgBABJzZXRPdXRwdXREaXJlY3RvcnkBAAR0ZXN0AQADKClaAQAKRXhjZXB0aW9ucwcAPQEAG2phdmEvbmV0L1VSSVN5bnRheEV4Y2VwdGlvbgcAPwEALm9yZy9lY2xpcHNlL2VxdWlub3gvcDIvY29yZS9Qcm92aXNpb25FeGNlcHRpb24HAEEBADNvcmcvZWNsaXBzZS9jb3JlL3J1bnRpbWUvT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24HAEMBABNqYXZhL2lvL0lPRXhjZXB0aW9uCgABAEUMAEYARwEACWdldEFsbElVcwEALSgpTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcXVlcnkvSVF1ZXJ5UmVzdWx0OwoAAQBJDABKAEsBABZhbmFseXplVmVyc2lvblBhdHRlcm5zAQAuKExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdDspVgoAAQBNDABOAE8BABhhbmFseXplTm9uVW5pcXVlVmVyc2lvbnMBAC4oTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcXVlcnkvSVF1ZXJ5UmVzdWx0OylaAQAGYWxsSVVzAQArTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcXVlcnkvSVF1ZXJ5UmVzdWx0OwEAFkxvY2FsVmFyaWFibGVUeXBlVGFibGUBAF9Mb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ8TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDs+OwEACVNpZ25hdHVyZQEAYihMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ8TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDs+OylWCgABAFcMAFgAWQEAEmdldE91dHB1dERpcmVjdG9yeQEAFCgpTGphdmEvbGFuZy9TdHJpbmc7BwBbAQAMamF2YS9pby9GaWxlCABdAQATdmVyc2lvblBhdHRlcm5zLnR4dAoAWgBfDAAQAGABACcoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KVYHAGIBABJqYXZhL2lvL0ZpbGVXcml0ZXIKAGEAZAwAEABlAQARKExqYXZhL2lvL0ZpbGU7KVYHAGcBABdqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcggAaQEACG91dHB1dDogCgBmAGsMABAAKAoAWgBtDABuAFkBAA9nZXRBYnNvbHV0ZVBhdGgKAGYAcAwAcQByAQAGYXBwZW5kAQAtKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CgBmAHQMAHUAWQEACHRvU3RyaW5nCAB3AQAsVmVyc2lvbiBxdWFsaWZlciBwYXR0ZXJucyB1c2VkIGluIHJlcG9zaXRvcnkJAAEAeQwAegAGAQADRU9MCgBhAHwMAH0AKAEABXdyaXRlCAB/AQAeUmVwb3NpdG9yeSAoJ3JlcG9VUkxUb1Rlc3QnKTogCgABAIEMAIIAWQEAEGdldFJlcG9VUkxUb1Rlc3QIAIQBAE8oRXhwbG9yYXRvcnkgcmVwb3J0IC4uLiBtYXliZSBldmVudHVhbGx5IHVzZWQgdG8gZmluZCB0eXBvcywgc3VjaCBhcyAncXVhbGZlcicpCgABAIYMAIcAiAEAEWNvbGxlY3RRdWFsaWZpZXJzAQBRKExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdDtMamF2YS9pby9GaWxlV3JpdGVyOylMamF2YS91dGlsL0xpc3Q7CgABAIoMAIsAjAEAGGNvbGxhcHNlU29ydGVkUXVhbGlmaWVycwEAJyhMamF2YS9pby9GaWxlV3JpdGVyO0xqYXZhL3V0aWwvTGlzdDspVgoAYQCODACPABEBAAVjbG9zZQoAQgCRDACSABEBAA9wcmludFN0YWNrVHJhY2UBAA1vdXRmaWxlV3JpdGVyAQAUTGphdmEvaW8vRmlsZVdyaXRlcjsBAAdvdXRmaWxlAQAOTGphdmEvaW8vRmlsZTsBAAt0ZXN0RGlyTmFtZQEADWFsbFF1YWxpZmllcnMBABBMamF2YS91dGlsL0xpc3Q7AQABZQEAFUxqYXZhL2lvL0lPRXhjZXB0aW9uOwEAJExqYXZhL3V0aWwvTGlzdDxMamF2YS9sYW5nL1N0cmluZzs+OwcAngEAD2phdmEvbGFuZy9FcnJvcgEAOyhMamF2YS9pby9GaWxlV3JpdGVyO0xqYXZhL3V0aWwvTGlzdDxMamF2YS9sYW5nL1N0cmluZzs+OylWCgChAKMHAKIBABVqYXZhL3V0aWwvQ29sbGVjdGlvbnMMAKQApQEABHNvcnQBABMoTGphdmEvdXRpbC9MaXN0OylWCgCnAKkHAKgBABBqYXZhL2xhbmcvU3RyaW5nDACqAKsBAAd2YWx1ZU9mAQAmKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL1N0cmluZzsIAK0BACpDb3VudCBvZiAoc29ydGVkKSBwYXR0ZXJucyBtYXRjaGluZyB1cCB0byAKAGYArwwAcQCwAQAcKEkpTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwgAsgEADCBjaGFyYWN0ZXJzLgsAtAC2BwC1AQAOamF2YS91dGlsL0xpc3QMALcAuAEACGl0ZXJhdG9yAQAWKClMamF2YS91dGlsL0l0ZXJhdG9yOwsAugC8BwC7AQASamF2YS91dGlsL0l0ZXJhdG9yDAC9AL4BAARuZXh0AQAUKClMamF2YS9sYW5nL09iamVjdDsKAKcAwAwACQDBAQAVKExqYXZhL2xhbmcvT2JqZWN0OylaCgCnAMMMAMQAxQEABmxlbmd0aAEAAygpSQgAxwEADltlbXB0eSBzdHJpbmddCgCnAMkMAKoAygEAFShJKUxqYXZhL2xhbmcvU3RyaW5nOwgAzAEAAQkIAM4BAAMJCQkKAAEA0AwA0QDSAQANc3RhcnRzU2ltaWxhcgEAJyhMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspWggA1AEAAgkJCgABANYMANcA2AEACnN1YnNlY3Rpb24BACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwoAnQAUCwC6ANsMANwAOgEAB2hhc05leHQBAAlyZWZlcmVuY2UBAAhyZWZDb3VudAEABHR5cGUBAAFxAQCZKExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdDxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47TGphdmEvaW8vRmlsZVdyaXRlcjspTGphdmEvdXRpbC9MaXN0PExqYXZhL2xhbmcvU3RyaW5nOz47BwDjAQATamF2YS91dGlsL0FycmF5TGlzdAoA4gAUCwDmAOgHAOcBAClvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdAwA6QDqAQARdG9Vbm1vZGlmaWFibGVTZXQBABEoKUxqYXZhL3V0aWwvU2V0OwsA7AC2BwDtAQANamF2YS91dGlsL1NldAcA7wEAMG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdAgA8QEABHRydWUIAPMBACRvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnR5cGUuY2F0ZWdvcnkLAO4A9QwA9gDYAQALZ2V0UHJvcGVydHkKAAEA+AwA+QD6AQAJaXNTcGVjaWFsAQA1KExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7KVoLAO4A/AwA/QD+AQAKZ2V0VmVyc2lvbgEAKygpTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvVmVyc2lvbjsKAQABAgcBAQEAJ29yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvVmVyc2lvbgwBAwA6AQAQaXNPU0dpQ29tcGF0aWJsZQoBAAEFDAEGAMUBAA9nZXRTZWdtZW50Q291bnQKAQABCAwBCQEKAQAKZ2V0U2VnbWVudAEAGShJKUxqYXZhL2xhbmcvQ29tcGFyYWJsZTsIAQwBABl6ZXJvIGxlbmd0aCA0dGggc2VnbWVudDogCwDuAQ4MAQ8AWQEABWdldElkCwC0AREMARIAwQEAA2FkZAgBFAEADVByb2dyYW0gRXJyb3IKAJ0AawgBFwEAJ051bWJlciBvZiBub25PU0dpIGNvbXBhdGlibGUgdmVyc2lvbnM6IAgBGQEAIk51bWJlciB3aXRoIG1vcmUgdGhhbiA0IHNlZ21lbnRzOiAIARsBACJOdW1iZXIgd3RpaCBsZXNzIHRoYW4gNCBzZWdtZW50czogAQARbm9uT1NHaUNvbXBhdGlibGUBAA1uTGVzc1RoYW5Gb3VyAQANbk1vcmVUaGFuRm91cgEAAml1AQAyTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDsBAAppc0NhdGVnb3J5AQABWgEADWJ1bmRsZVZlcnNpb24BAClMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9WZXJzaW9uOwEACXF1YWxpZmllcgEAFkxqYXZhL2xhbmcvQ29tcGFyYWJsZTsBAAdxU3RyaW5nCgCnASkMAAwBKgEAFShMamF2YS9sYW5nL1N0cmluZzspWgoApwEsDAEtAS4BAAlzdWJzdHJpbmcBABYoSUkpTGphdmEvbGFuZy9TdHJpbmc7AQAGcmVzdWx0AQBiKExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdDxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47KVoKAAEBMgwBMwE0AQAUdGFidWxhdGVOb25VbmlxdWVJRHMBADwoTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcXVlcnkvSVF1ZXJ5UmVzdWx0OylMamF2YS91dGlsL01hcDsIATYBABVub25VbmlxdWVWZXJzaW9ucy50eHQIATgBACZOb24gVW5pcXVlIFZlcnNpb25zIHVzZWQgaW4gcmVwb3NpdG9yeQsBOgE8BwE7AQANamF2YS91dGlsL01hcAwBPQDqAQAGa2V5U2V0CwE6AT8MAUABQQEAA2dldAEAJihMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7CwDsAUMMAUQAxQEABHNpemUKAAEBRgwBRwFIAQAHcHJpbnRJZAEAKShMamF2YS9pby9GaWxlV3JpdGVyO0xqYXZhL2xhbmcvT2JqZWN0OylWCgABAUoMAUsBSAEADHByaW50VmVyc2lvbggBTQEAHU51bWJlciBvZiB1bmlxdWUgaWQtdmVyc2lvbnMgAQAHYnVuZGxlcwEAD0xqYXZhL3V0aWwvTWFwOwEAB25VbmlxdWUBAAhidW5kbGVJZAEAEkxqYXZhL2xhbmcvT2JqZWN0OwEACnZlcnNpb25TZXQBAA9MamF2YS91dGlsL1NldDsBAAd2ZXJzaW9uAQBwKExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdDxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47KUxqYXZhL3V0aWwvTWFwOwcBWAEAEWphdmEvdXRpbC9IYXNoTWFwCgFXABQLAToBWwwBXADBAQALY29udGFpbnNLZXkLAOwBEQcBXwEAEWphdmEvdXRp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AEcAQwEjASQABwBfAA0BUwFUAAgAdQAVAVMBVAAIAI8ABQCaAWgABQBSAAAADAABAAAAoABQAFMAAQACAUcBSAACADsAAAAEAAEAQgASAAAAWwADAAMAAAAZK7sAZlm3AWkstgFqsgB4tgBvtgBztgB7sQAAAAIAFQAAAAoAAgAAASUAGAEmABYAAAAgAAMAAAAZABcAGAAAAAAAGQAfAJQAAQAAABkBbQFSAAIAAgFLAUgAAgA7AAAABAABAEIAEgAAAF0ABAADAAAAGyu7AGZZEsu3AGostgFqsgB4tgBvtgBztgB7sQAAAAIAFQAAAAoAAgAAASkAGgEqABYAAAAgAAMAAAAbABcAGAAAAAAAGwAfAJQAAQAAABsBVQFSAAIAAQFuAAAAAgFvUEsDBAoAAAAAADGgCT9eYizRpS0AAKUtAAAxAAAAb3JnL2VjbGlwc2UvanVuby90ZXN0cy9yZXBvcy9WZXJzaW9uQ2hlY2tpbmcuamF2YXBhY2thZ2Ugb3JnLmVjbGlwc2UuanVuby50ZXN0cy5yZXBvczsKCmltcG9ydCBqYXZhLmlvLkZpbGU7CmltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CmltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwppbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwppbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKaW1wb3J0IGphdmEudXRpbC5NYXA7CmltcG9ydCBqYXZhLnV0aWwuU2V0OwoKaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwoKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247CmltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7CmltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLlZlcnNpb247CmltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnF1ZXJ5LklRdWVyeVJlc3VsdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmp1bm8udGVzdHMucmVwb3MuVGVzdFJlcG87CmltcG9ydCBvcmcuZWNsaXBzZS5qdW5vLnRlc3RzLnJlcG9zLlZlcnNpb25DaGVja2luZzsKCnB1YmxpYyBjbGFzcyBWZXJzaW9uQ2hlY2tpbmcgZXh0ZW5kcyBUZXN0UmVwbyB7CgoKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFUVVBTFMgICAgICAgICAgICAgICAgID0gImVxdWFscyI7CiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRTX1dJVEggICAgICAgICAgICA9ICJzdGFydHNXaXRoIjsKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCAgICBTVEFSVFdJVEhfTUFUQ0hfTEVOR1RIID0gNTsKCiAgICAvKioKICAgICAqIFRoZSB0ZXN0IHNldHVwIGluIHRoaXMgc3VpdGUgbWV0aG9kIGlzIGF0eXBpY2FsLCBidXQgaGFuZHkgZG8gdG8gbG9jYWwKICAgICAqIHRlc3RpbmcgZnJvbSB3b3JrYmVuY2guIEZvciBwcm9kdWN0aW9uIHdvcmssIGN1cnJlbnRseSwgdGhlIHZhbHVlcyBhcmUKICAgICAqIHNldCBpbiBhbnQgZXhlY3V0ZSBtZXRob2QuIElmL3doZW4gY29udmVydGVkIHRvIHRydWUgSlVuaXQgdGVzdHMsIHRoaXMKICAgICAqIHN1aXRlIG1ldGhvZCB3aWxsIG5lZWQgdG8gYmUgY2hhYW5nZWQgdG8gYSBtb3JlIHR5cGljYWwgZm9ybSwgYW5kIG5vCiAgICAgKiB2YWx1ZSBoYXJkIGNvZGVkLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0IHZlcnNpb24gY2hlY2tpbmciKTsKICAgICAgICBWZXJzaW9uQ2hlY2tpbmcgdGVzdCA9IG5ldyBWZXJzaW9uQ2hlY2tpbmcoKTsKICAgICAgICB0ZXN0LnNldE5hbWUoInRlc3RWZXJzaW9uVW5pcW5lc3MiKTsKICAgICAgICB0ZXN0LnNldFJlcG9VUkxUb1Rlc3QoImZpbGU6Ly8vaG9tZS9zaGFyZWQvd2VidG9vbHMvdGVzdFN0YWdpbmdSZXBvIik7CiAgICAgICAgdGVzdC5zZXRPdXRwdXREaXJlY3RvcnkoIi9ob21lL2Rhdmlkdy90ZW1wIik7CiAgICAgICAgcmV0dXJuIHRlc3Q7CiAgICB9CgogICAgcHVibGljIGJvb2xlYW4gdGVzdFZlcnNpb25VbmlxbmVzcygpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24sIFByb3Zpc2lvbkV4Y2VwdGlvbiwgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKICAgICAgICBJUXVlcnlSZXN1bHQ8SUluc3RhbGxhYmxlVW5pdD4gYWxsSVVzID0gZ2V0QWxsSVVzKCk7CiAgICAgICAgYW5hbHl6ZVZlcnNpb25QYXR0ZXJucyhhbGxJVXMpOwogICAgICAgIHJldHVybiBhbmFseXplTm9uVW5pcXVlVmVyc2lvbnMoYWxsSVVzKTsKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgYW5hbHl6ZVZlcnNpb25QYXR0ZXJucyhJUXVlcnlSZXN1bHQ8SUluc3RhbGxhYmxlVW5pdD4gYWxsSVVzKSB0aHJvd3MgSU9FeGNlcHRpb24gewoKCgogICAgICAgIEZpbGVXcml0ZXIgb3V0ZmlsZVdyaXRlciA9IG51bGw7CiAgICAgICAgRmlsZSBvdXRmaWxlID0gbnVsbDsKICAgICAgICBTdHJpbmcgdGVzdERpck5hbWUgPSBnZXRPdXRwdXREaXJlY3RvcnkoKTsKICAgICAgICB0cnkgewogICAgICAgICAgICBvdXRmaWxlID0gbmV3IEZpbGUodGVzdERpck5hbWUsICJ2ZXJzaW9uUGF0dGVybnMudHh0Iik7CiAgICAgICAgICAgIG91dGZpbGVXcml0ZXIgPSBuZXcgRmlsZVdyaXRlcihvdXRmaWxlKTsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJvdXRwdXQ6ICIgKyBvdXRmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKCgogICAgICAgICAgICBvdXRmaWxlV3JpdGVyLndyaXRlKCJWZXJzaW9uIHF1YWxpZmVyIHBhdHRlcm5zIHVzZWQgaW4gcmVwb3NpdG9yeSIgKyBFT0wgKyBFT0wpOwogICAgICAgICAgICBvdXRmaWxlV3JpdGVyLndyaXRlKCJSZXBvc2l0b3J5ICgncmVwb1VSTFRvVGVzdCcpOiAiICsgZ2V0UmVwb1VSTFRvVGVzdCgpICsgRU9MICsgRU9MKTsKICAgICAgICAgICAgb3V0ZmlsZVdyaXRlci53cml0ZSgiKEV4cGxvcmF0b3J5IHJlcG9ydCAuLi4gbWF5YmUgZXZlbnR1YWxseSB1c2VkIHRvIGZpbmQgdHlwb3MsIHN1Y2ggYXMgJ3F1YWxmZXInKSIgKyBFT0wgKyBFT0wpOwoKICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGFsbFF1YWxpZmllcnMgPSBjb2xsZWN0UXVhbGlmaWVycyhhbGxJVXMsIG91dGZpbGVXcml0ZXIpOwoKCgogICAgICAgICAgICBjb2xsYXBzZVNvcnRlZFF1YWxpZmllcnMob3V0ZmlsZVdyaXRlciwgYWxsUXVhbGlmaWVycyk7CgoKICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIGlmIChvdXRmaWxlV3JpdGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgb3V0ZmlsZVdyaXRlci5jbG9zZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyB3b3VsZCBiZSB3ZWlyZAogICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIGNvbGxhcHNlU29ydGVkUXVhbGlmaWVycyhGaWxlV3JpdGVyIG91dGZpbGVXcml0ZXIsIExpc3Q8U3RyaW5nPiBhbGxRdWFsaWZpZXJzKSB0aHJvd3MgSU9FeGNlcHRpb24sIEVycm9yIHsKICAgICAgICBTdHJpbmcgcmVmZXJlbmNlID0gbnVsbDsKICAgICAgICBpbnQgcmVmQ291bnQgPSAwOwogICAgICAgIFN0cmluZyB0eXBlID0gRVFVQUxTOwogICAgICAgIENvbGxlY3Rpb25zLnNvcnQoYWxsUXVhbGlmaWVycyk7CgogICAgICAgIG91dGZpbGVXcml0ZXIud3JpdGUoRU9MICsgIkNvdW50IG9mIChzb3J0ZWQpIHBhdHRlcm5zIG1hdGNoaW5nIHVwIHRvICIgKyBTVEFSVFdJVEhfTUFUQ0hfTEVOR1RIICsgIiBjaGFyYWN0ZXJzLiIgKyBFT0wgKyBFT0wpOwoKICAgICAgICBmb3IgKFN0cmluZyBxIDogYWxsUXVhbGlmaWVycykgewogICAgICAgICAgICBpZiAocmVmZXJlbmNlID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJlZmVyZW5jZSA9IHE7CiAgICAgICAgICAgICAgICByZWZDb3VudCA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAocmVmZXJlbmNlLmVxdWFscyhxKSkgewogICAgICAgICAgICAgICAgICAgIHJlZkNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IEVRVUFMUzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmIChyZWZlcmVuY2UubGVuZ3RoKCkgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2UgPSAiW2VtcHR5IHN0cmluZ10iOwogICAgICAgICAgICAgICAgICAgICAgICBvdXRmaWxlV3JpdGVyLndyaXRlKHJlZkNvdW50ICsgIlx0IiArIHR5cGUgKyAiXHRcdFx0IiArIHJlZmVyZW5jZSArIEVPTCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZSA9IHE7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvdW50ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IEVRVUFMUzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RhcnRzU2ltaWxhcihyZWZlcmVuY2UsIHEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBTVEFSVFNfV0lUSDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTVEFSVFNfV0lUSC5lcXVhbHModHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGZpbGVXcml0ZXIud3JpdGUocmVmQ291bnQgKyAiXHQiICsgdHlwZSArICJcdFx0IiArIHN1YnNlY3Rpb24ocmVmZXJlbmNlKSArIEVPTCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoRVFVQUxTLmVxdWFscyh0eXBlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZmlsZVdyaXRlci53cml0ZShyZWZDb3VudCArICJcdCIgKyB0eXBlICsgIlx0XHRcdCIgKyByZWZlcmVuY2UgKyBFT0wpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlID0gcTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ291bnQgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gRVFVQUxTOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gY29sbGVjdFF1YWxpZmllcnMoSVF1ZXJ5UmVzdWx0PElJbnN0YWxsYWJsZVVuaXQ+IGFsbElVcywgRmlsZVdyaXRlciBvdXRmaWxlV3JpdGVyKSB0aHJvd3MgSU9FeGNlcHRpb24sIEVycm9yIHsKICAgICAgICBMaXN0PFN0cmluZz4gYWxsUXVhbGlmaWVycyA9IG5ldyBBcnJheUxpc3QoKTsKICAgICAgICBpbnQgbm9uT1NHaUNvbXBhdGlibGUgPSAwOwogICAgICAgIGludCBuTGVzc1RoYW5Gb3VyID0gMDsKICAgICAgICBpbnQgbk1vcmVUaGFuRm91ciA9IDA7CiAgICAgICAgZm9yIChJSW5zdGFsbGFibGVVbml0IGl1IDogYWxsSVVzLnRvVW5tb2RpZmlhYmxlU2V0KCkpIHsKCiAgICAgICAgICAgIC8vIGV4Y2x1ZGUgY2F0ZWdvcmllcywgc2luY2UgdGhleSBhcmUgKG9mdGVuKSBpbnRlbmRlZCB0byB3b3JrIHdpdGggc2FtZSBJRCwgbXVsdGlwbGUgdmVyc2lvbnMKICAgICAgICAgICAgYm9vbGVhbiBpc0NhdGVnb3J5ID0gInRydWUiLmVxdWFscyhpdS5nZXRQcm9wZXJ0eSgib3JnLmVjbGlwc2UuZXF1aW5veC5wMi50eXBlLmNhdGVnb3J5IikpOwoKICAgICAgICAgICAgLy8gd2UgZXhjbHVkZSB0aGVzZSB0aGluZ3MgaW4gc29tZSBvdGhlciByZXBvIHJlcG9ydHMgLi4uIHRvIGltcHJvdmUgZm9jdXMgLi4uIGJ1dCBzdXNwZWN0IG5vdCBuZWVkZWQgaGVyZS4KICAgICAgICAgICAgLy8gYm9vbGVhbiBpc0ZyYWdtZW50ID0gInRydWUiLmVxdWFscyhpdS5nZXRQcm9wZXJ0eSgib3JnLmVjbGlwc2UuZXF1aW5veC5wMi50eXBlLmZyYWdtZW50IikpOwogICAgICAgICAgICAvLyAhaXNGcmFnbWVudCAmJiAhaXNGZWF0dXJlR3JvdXAoaXUpCiAgICAgICAgICAgIGlmICghaXNDYXRlZ29yeSAmJiAhaXNTcGVjaWFsKGl1KSkgewogICAgICAgICAgICAgICAgLy9TdHJpbmcgYnVuZGxlSWQgPSBpdS5nZXRJZCgpOwogICAgICAgICAgICAgICAgVmVyc2lvbiBidW5kbGVWZXJzaW9uID0gaXUuZ2V0VmVyc2lvbigpOwogICAgICAgICAgICAgICAgaWYgKGJ1bmRsZVZlcnNpb24uaXNPU0dpQ29tcGF0aWJsZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGJ1bmRsZVZlcnNpb24uZ2V0U2VnbWVudENvdW50KCkgPT0gNCkgewogICAgICAgICAgICAgICAgICAgICAgICBDb21wYXJhYmxlIHF1YWxpZmllciA9IGJ1bmRsZVZlcnNpb24uZ2V0U2VnbWVudCgzKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1YWxpZmllciBpbnN0YW5jZW9mIFN0cmluZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHFTdHJpbmcgPSAoU3RyaW5nKSBxdWFsaWZpZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocVN0cmluZy5sZW5ndGgoKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZmlsZVdyaXRlci53cml0ZSgiemVybyBsZW5ndGggNHRoIHNlZ21lbnQ6ICIgKyBpdS5nZXRJZCgpICsgRU9MKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbFF1YWxpZmllcnMuYWRkKHFTdHJpbmcpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJQcm9ncmFtIEVycm9yIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYnVuZGxlVmVyc2lvbi5nZXRTZWdtZW50Q291bnQoKSA8IDQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbkxlc3NUaGFuRm91cisrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidW5kbGVWZXJzaW9uLmdldFNlZ21lbnRDb3VudCgpID4gNCkgewogICAgICAgICAgICAgICAgICAgICAgICBuTW9yZVRoYW5Gb3VyKys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgbm9uT1NHaUNvbXBhdGlibGUrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKCiAgICAgICAgfQoKICAgICAgICBvdXRmaWxlV3JpdGVyLndyaXRlKEVPTCArICJOdW1iZXIgb2Ygbm9uT1NHaSBjb21wYXRpYmxlIHZlcnNpb25zOiAiICsgbm9uT1NHaUNvbXBhdGlibGUgKyBFT0wpOwogICAgICAgIG91dGZpbGVXcml0ZXIud3JpdGUoRU9MICsgIk51bWJlciB3aXRoIG1vcmUgdGhhbiA0IHNlZ21lbnRzOiAiICsgbk1vcmVUaGFuRm91ciArIEVPTCk7CiAgICAgICAgb3V0ZmlsZVdyaXRlci53cml0ZShFT0wgKyAiTnVtYmVyIHd0aWggbGVzcyB0aGFuIDQgc2VnbWVudHM6ICIgKyBuTGVzc1RoYW5Gb3VyICsgRU9MICsgRU9MKTsKICAgICAgICByZXR1cm4gYWxsUXVhbGlmaWVyczsKICAgIH0KCiAgICBwcml2YXRlIGJvb2xlYW4gc3RhcnRzU2ltaWxhcihTdHJpbmcgcmVmZXJlbmNlLCBTdHJpbmcgcSkgewogICAgICAgIHJldHVybiAocS5zdGFydHNXaXRoKHN1YnNlY3Rpb24ocmVmZXJlbmNlKSkpOwogICAgfQoKICAgIHByaXZhdGUgU3RyaW5nIHN1YnNlY3Rpb24oU3RyaW5nIHJlZmVyZW5jZSkgewogICAgICAgIC8vIGxlbmd0aCA9IGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0OwoKICAgICAgICBTdHJpbmcgcmVzdWx0ID0gcmVmZXJlbmNlOwogICAgICAgIGlmIChyZWZlcmVuY2UubGVuZ3RoKCkgPj0gU1RBUlRXSVRIX01BVENIX0xFTkdUSCkgewogICAgICAgICAgICByZXN1bHQgPSAocmVmZXJlbmNlLnN1YnN0cmluZygwLCBTVEFSVFdJVEhfTUFUQ0hfTEVOR1RIKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CgogICAgfQoKICAgIHByaXZhdGUgYm9vbGVhbiBhbmFseXplTm9uVW5pcXVlVmVyc2lvbnMoSVF1ZXJ5UmVzdWx0PElJbnN0YWxsYWJsZVVuaXQ+IGFsbElVcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICBNYXAgYnVuZGxlcyA9IHRhYnVsYXRlTm9uVW5pcXVlSURzKGFsbElVcyk7CiAgICAgICAgRmlsZVdyaXRlciBvdXRmaWxlV3JpdGVyID0gbnVsbDsKICAgICAgICBGaWxlIG91dGZpbGUgPSBudWxsOwogICAgICAgIFN0cmluZyB0ZXN0RGlyTmFtZSA9IGdldE91dHB1dERpcmVjdG9yeSgpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIG91dGZpbGUgPSBuZXcgRmlsZSh0ZXN0RGlyTmFtZSwgIm5vblVuaXF1ZVZlcnNpb25zLnR4dCIpOwogICAgICAgICAgICBvdXRmaWxlV3JpdGVyID0gbmV3IEZpbGVXcml0ZXIob3V0ZmlsZSk7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigib3V0cHV0OiAiICsgb3V0ZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CgoKICAgICAgICAgICAgb3V0ZmlsZVdyaXRlci53cml0ZSgiTm9uIFVuaXF1ZSBWZXJzaW9ucyB1c2VkIGluIHJlcG9zaXRvcnkiICsgRU9MICsgRU9MKTsKICAgICAgICAgICAgb3V0ZmlsZVdyaXRlci53cml0ZSgiUmVwb3NpdG9yeSAoJ3JlcG9VUkxUb1Rlc3QnKTogIiArIGdldFJlcG9VUkxUb1Rlc3QoKSArIEVPTCArIEVPTCk7CgogICAgICAgICAgICBpbnQgblVuaXF1ZSA9IDA7CiAgICAgICAgICAgIGZvciAoT2JqZWN0IGJ1bmRsZUlkIDogYnVuZGxlcy5rZXlTZXQoKSkgewogICAgICAgICAgICAgICAgU2V0IHZlcnNpb25TZXQgPSAoU2V0KSBidW5kbGVzLmdldChidW5kbGVJZCk7CiAgICAgICAgICAgICAgICBpZiAodmVyc2lvblNldC5zaXplKCkgPT0gMSkgewogICAgICAgICAgICAgICAgICAgIG5VbmlxdWUrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHByaW50SWQob3V0ZmlsZVdyaXRlciwgYnVuZGxlSWQpOwogICAgICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IHZlcnNpb24gOiB2ZXJzaW9uU2V0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50VmVyc2lvbihvdXRmaWxlV3JpdGVyLCB2ZXJzaW9uKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG91dGZpbGVXcml0ZXIud3JpdGUoRU9MICsgIk51bWJlciBvZiB1bmlxdWUgaWQtdmVyc2lvbnMgIiArIG5VbmlxdWUgKyBFT0wpOwoKICAgICAgICAgICAgLy8gYWx3YXlzIHJldHVybiBmYWxzZSAobm8gZXJyb3IpLCBmb3Igbm93IC4uLiBldmVudHVhbGx5IG1heSBiZSBhYmxlIHRvIAogICAgICAgICAgICAvLyBmaWd1cmUgb3V0IHNvbWUgaGV1cmlzdGljIHRvIHJldHVybiAiZXJyb3IiLCBzdWNoIGFzIGlmIG5ldywgbm9uLWV4cGVjdGVkIG11bHRpcGxlIHZlcnNpb25zCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIGlmIChvdXRmaWxlV3JpdGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgb3V0ZmlsZVdyaXRlci5jbG9zZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyB3b3VsZCBiZSB3ZWlyZAogICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgoKICAgIHByaXZhdGUgTWFwIHRhYnVsYXRlTm9uVW5pcXVlSURzKElRdWVyeVJlc3VsdDxJSW5zdGFsbGFibGVVbml0PiBhbGxJVXMpIHsKICAgICAgICBNYXAgYnVuZGxlcyA9IG5ldyBIYXNoTWFwKCk7CiAgICAgICAgZm9yIChJSW5zdGFsbGFibGVVbml0IGl1IDogYWxsSVVzLnRvVW5tb2RpZmlhYmxlU2V0KCkpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIC8vIGV4Y2x1ZGUgY2F0ZWdvcmllcywgc2luY2UgdGhleSBhcmUgKG9mdGVuKSBpbnRlbmRlZCB0byB3b3JrIHdpdGggc2FtZSBJRCwgbXVsdGlwbGUgdmVyc2lvbnMKICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNDYXRlZ29yeSA9ICJ0cnVlIi5lcXVhbHMoaXUuZ2V0UHJvcGVydHkoIm9yZy5lY2xpcHNlLmVxdWlub3gucDIudHlwZS5jYXRlZ29yeSIpKTsKCiAgICAgICAgICAgICAgICAvLyB3ZSBleGNsdWRlIHRoZXNlIHRoaW5ncyBpbiBzb21lIG90aGVyIHJlcG8gcmVwb3J0cyAuLi4gdG8gaW1wcm92ZSBmb2N1cyAuLi4gYnV0IHN1c3BlY3Qgbm90IG5lZWRlZCBoZXJlLgogICAgICAgICAgICAgICAgLy9ib29sZWFuIGlzRnJhZ21lbnQgPSAidHJ1ZSIuZXF1YWxzKGl1LmdldFByb3BlcnR5KCJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnR5cGUuZnJhZ21lbnQiKSk7CiAgICAgICAgICAgICAgICAvLyAmJiAhaXNTcGVjaWFsKGl1KSAmJiAhaXNGcmFnbWVudCAmJiAhaXNGZWF0dXJlR3JvdXAoaXUpCiAgICAgICAgICAgICAgICBpZiAoIWlzQ2F0ZWdvcnkpIHsKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYnVuZGxlSWQgPSBpdS5nZXRJZCgpOwogICAgICAgICAgICAgICAgICAgIFZlcnNpb24gYnVuZGxlVmVyc2lvbiA9IGl1LmdldFZlcnNpb24oKTsKICAgICAgICAgICAgICAgICAgICAvLyBpZiBidW5kbGUgSUQgaXMgYWxyZWFkeSBpbiBtYXAsIHdlIG11c3QgaGF2ZSBhbHJlYWR5IGZvdW5kIGF0IGxlYXN0IG9uZQogICAgICAgICAgICAgICAgICAgIGlmIChidW5kbGVzLmNvbnRhaW5zS2V5KGJ1bmRsZUlkKSkgewogICAgICAgICAgICAgICAgICAgICAgICBTZXQgdmVyc2lvblNldCA9IChTZXQpIGJ1bmRsZXMuZ2V0KGJ1bmRsZUlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvblNldC5hZGQoYnVuZGxlVmVyc2lvbik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBoYXZlbid0IGZvdW5kIG9uZSB5ZXQsIHNvIGFkZCBpdCwgd2l0aCBpbml0aWFsIHNldCBvZiBpdHMgKG9uZSkgdmVyc2lvbgogICAgICAgICAgICAgICAgICAgICAgICBTZXQgdmVyc2lvblNldCA9IG5ldyBIYXNoU2V0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb25TZXQuYWRkKGJ1bmRsZVZlcnNpb24pOwogICAgICAgICAgICAgICAgICAgICAgICBidW5kbGVzLnB1dChidW5kbGVJZCwgdmVyc2lvblNldCk7CiAgICAgICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGJ1bmRsZXM7CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIHByaW50SWQoRmlsZVdyaXRlciBvdXQsIE9iamVjdCBpZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICBvdXQud3JpdGUoaWQgKyBFT0wpOwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBwcmludFZlcnNpb24oRmlsZVdyaXRlciBvdXQsIE9iamVjdCB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgIG91dC53cml0ZSgiXHQiICsgdmVyc2lvbiArIEVPTCk7CiAgICB9Cgp9ClBLAwQKAAAAAABvWAo/vlVfhVYZAABWGQAAMAAAAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvcmVwb3MvSVVOYW1lQ2hlY2tlci5jbGFzc8r+ur4AAAAxAQgHAAIBACpvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3JlcG9zL0lVTmFtZUNoZWNrZXIHAAQBACVvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3JlcG9zL1Rlc3RSZXBvAQAGPGluaXQ+AQADKClWAQAEQ29kZQoAAwAJDAAFAAYBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQAsTG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvcmVwb3MvSVVOYW1lQ2hlY2tlcjsBAA90ZXN0QnVuZGxlTmFtZXMBAAMoKVoBAApFeGNlcHRpb25zBwASAQAbamF2YS9uZXQvVVJJU3ludGF4RXhjZXB0aW9uBwAUAQAub3JnL2VjbGlwc2UvZXF1aW5veC9wMi9jb3JlL1Byb3Zpc2lvbkV4Y2VwdGlvbgcAFgEAM29yZy9lY2xpcHNlL2NvcmUvcnVudGltZS9PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbgcAGAEAE2phdmEvaW8vSU9FeGNlcHRpb24KAAEAGgwAGwAcAQAJZ2V0QWxsSVVzAQAtKClMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ7CgABAB4MAB8AIAEAEGNoZWNrQnVuZGxlTmFtZXMBAC4oTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcXVlcnkvSVF1ZXJ5UmVzdWx0OylaAQAGYWxsSVVzAQArTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcXVlcnkvSVF1ZXJ5UmVzdWx0OwEAFkxvY2FsVmFyaWFibGVUeXBlVGFibGUBAF9Mb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ8TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDs+OwEAEHRlc3RGZWF0dXJlTmFtZXMKAAEAJwwAKAAcAQAOZ2V0QWxsR3JvdXBJVXMKAAEAKgwAKwAgAQARY2hlY2tGZWF0dXJlTmFtZXMBAAlTaWduYXR1cmUBAGIoTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcXVlcnkvSVF1ZXJ5UmVzdWx0PExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7PjspWgcALwEAE2phdmEvdXRpbC9BcnJheUxpc3QKAC4ACQoAAQAyDAAzADQBABJnZXRPdXRwdXREaXJlY3RvcnkBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwcANgEADGphdmEvaW8vRmlsZQgAOAEAEWZlYXR1cmVOYW1lcy5odG1sCgA1ADoMAAUAOwEAJyhMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspVgcAPQEAEmphdmEvaW8vRmlsZVdyaXRlcgoAPAA/DAAFAEABABEoTGphdmEvaW8vRmlsZTspVgkAQgBEBwBDAQAQamF2YS9sYW5nL1N5c3RlbQwARQBGAQADb3V0AQAVTGphdmEvaW8vUHJpbnRTdHJlYW07BwBIAQAXamF2YS9sYW5nL1N0cmluZ0J1aWxkZXIIAEoBAAhvdXRwdXQ6IAoARwBMDAAFAE0BABUoTGphdmEvbGFuZy9TdHJpbmc7KVYKADUATwwAUAA0AQAPZ2V0QWJzb2x1dGVQYXRoCgBHAFIMAFMAVAEABmFwcGVuZAEALShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwoARwBWDABXADQBAAh0b1N0cmluZwoAWQBbBwBaAQATamF2YS9pby9QcmludFN0cmVhbQwAXABNAQAHcHJpbnRsbgsAXgBgBwBfAQApb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQMAGEAYgEAEXRvVW5tb2RpZmlhYmxlU2V0AQARKClMamF2YS91dGlsL1NldDsLAGQAZgcAZQEADWphdmEvdXRpbC9TZXQMAGcAaAEACGl0ZXJhdG9yAQAWKClMamF2YS91dGlsL0l0ZXJhdG9yOwsAagBsBwBrAQASamF2YS91dGlsL0l0ZXJhdG9yDABtAG4BAARuZXh0AQAUKClMamF2YS9sYW5nL09iamVjdDsHAHABADBvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQIAHIBAAR0cnVlCAB0AQAkb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50eXBlLmNhdGVnb3J5CwBvAHYMAHcAeAEAC2dldFByb3BlcnR5AQAmKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZzsKAHoAfAcAewEAEGphdmEvbGFuZy9TdHJpbmcMAH0AfgEABmVxdWFscwEAFShMamF2YS9sYW5nL09iamVjdDspWggAgAEAJG9yZy5lY2xpcHNlLmVxdWlub3gucDIudHlwZS5mcmFnbWVudAoAAQCCDACDAIQBAA5pc0ZlYXR1cmVHcm91cAEANShMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0OylaCgABAIYMAIcAhAEACWlzU3BlY2lhbAgAiQEAG29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZQsAbwCLDAB3AIwBADgoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwsAjgCQBwCPAQAOamF2YS91dGlsL0xpc3QMAJEAfgEAA2FkZAgAkwEAASUKAHoAlQwAlgCXAQAKc3RhcnRzV2l0aAEAFShMamF2YS9sYW5nL1N0cmluZzspWggAmQEACEZlYXR1cmUtCACbAQAHQnVuZGxlLQgAnQEAB2ZlYXR1cmUIAJ8BAAZwbHVnaW4IAKEBAAtQbHVnaW4ubmFtZQgAowEACWZyYWdtZW50LggApQEAC0VjbGlwc2Uub3JnCACnAQAGYnVuZGxlCgCpAKsHAKoBABpqYXZhL2xhbmcvUnVudGltZUV4Y2VwdGlvbgwArAAGAQAPcHJpbnRTdGFja1RyYWNlCwBqAK4MAK8ADwEAB2hhc05leHQIALEBACk8aDE+RmVhdHVyZSBuYW1lcyB1c2VkIGluIHJlcG9zaXRvcnk8L2gxPgkAAQCzDAC0ALUBAANFT0wBABJMamF2YS9sYW5nL1N0cmluZzsKADwAtwwAuABNAQAFd3JpdGUIALoBACE8cD5SZXBvc2l0b3J5ICgncmVwb1VSTFRvVGVzdCcpOiAKAAEAvAwAvQA0AQAQZ2V0UmVwb1VSTFRvVGVzdAgAvwEABDwvcD4IAMEBADU8aDI+TWFqb3I6IG1pc3Npbmcgb3IgKHByb2JhYmx5KSBpbmNvcnJlY3QgbmFtZXM8L2gyPgoAAQDDDADEAMUBABRwcmludExpbmVzQnVuZGxlTmFtZQEAJyhMamF2YS9pby9GaWxlV3JpdGVyO0xqYXZhL3V0aWwvTGlzdDspVggAxwEAHzxoMj5Qcm9iYWJseSBjb3JyZWN0IG5hbWVzPC9oMj4LAI4AyQwAygDLAQAEc2l6ZQEAAygpSQoAPADNDADOAAYBAAVjbG9zZQoAFwCrAQANb3V0ZmlsZVdyaXRlcgEAFExqYXZhL2lvL0ZpbGVXcml0ZXI7AQAHb3V0ZmlsZQEADkxqYXZhL2lvL0ZpbGU7AQATaW5jb3JyZWN0QnVuZGxlTmFtZQEAEExqYXZhL3V0aWwvTGlzdDsBABlwcm9iYWJseUNvcnJlY3RCdW5kbGVOYW1lAQALdGVzdERpck5hbWUBAAJpdQEAMkxvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7AQAKaXNDYXRlZ29yeQEAAVoBAAppc0ZyYWdtZW50AQAKYnVuZGxlTmFtZQEAAWUBABxMamF2YS9sYW5nL1J1bnRpbWVFeGNlcHRpb247AQAVTGphdmEvaW8vSU9FeGNlcHRpb247AQBETGphdmEvdXRpbC9MaXN0PExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7PjsIAOMBABBidW5kbGVOYW1lcy5odG1sCADlAQAoPGgxPkJ1bmRsZSBuYW1lcyB1c2VkIGluIHJlcG9zaXRvcnk8L2gxPggA5wEAOzxoMj5NYWpvcjogbWlzc2luZyBvciAocHJvYmFibHkpIGluY29ycmVjdCBidW5kbGUgbmFtZTwvaDI+CADpAQAlPGgyPlByb2JhYmx5IGNvcnJlY3QgYnVuZGxlIG5hbWU8L2gyPgEAWyhMamF2YS9pby9GaWxlV3JpdGVyO0xqYXZhL3V0aWwvTGlzdDxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47KVYHAOwBACtvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL0lVSWRDb21wYXJhdG9yCgDrAAkKAO8A8QcA8AEAFWphdmEvdXRpbC9Db2xsZWN0aW9ucwwA8gDzAQAEc29ydAEAKShMamF2YS91dGlsL0xpc3Q7TGphdmEvdXRpbC9Db21wYXJhdG9yOylWCAD1AQAKPHA+Q291bnQ6IAoARwD3DABTAPgBABwoSSlMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CAD6AQAEPG9sPgsAjgBmCgABAP0MAP4A/wEAEXByaW50TGluZUxpc3RJdGVtAQBbKExqYXZhL2lvL0ZpbGVXcml0ZXI7TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDtMamF2YS9sYW5nL1N0cmluZzspVggBAQEABTwvb2w+AQAGaXVMaXN0AQAUY29tcGFyYXRvckJ1bmRsZU5hbWUBABZMamF2YS91dGlsL0NvbXBhcmF0b3I7AQBLTGphdmEvdXRpbC9Db21wYXJhdG9yPC1Mb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47AQAKU291cmNlRmlsZQEAEklVTmFtZUNoZWNrZXIuamF2YQAhAAEAAwAAAAAABgABAAUABgABAAcA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LkNvbGxlY3Rpb25zOwppbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247CmltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwppbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwppbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5xdWVyeS5JUXVlcnlSZXN1bHQ7CmltcG9ydCBvcmcuZWNsaXBzZS5qdW5vLnRlc3RzLnJlcG9zLlRlc3RSZXBvOwppbXBvcnQgb3JnLmVjbGlwc2UuanVuby50ZXN0cy51dGlscy5JVUlkQ29tcGFyYXRvcjsKCnB1YmxpYyBjbGFzcyBJVU5hbWVDaGVja2VyIGV4dGVuZHMgVGVzdFJlcG8gewoKCgogICAgcHVibGljIGJvb2xlYW4gdGVzdEJ1bmRsZU5hbWVzKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiwgUHJvdmlzaW9uRXhjZXB0aW9uLCBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogICAgICAgIElRdWVyeVJlc3VsdDxJSW5zdGFsbGFibGVVbml0PiBhbGxJVXMgPSBnZXRBbGxJVXMoKTsKICAgICAgICByZXR1cm4gY2hlY2tCdW5kbGVOYW1lcyhhbGxJVXMpOwogICAgfQoKICAgIHB1YmxpYyBib29sZWFuIHRlc3RGZWF0dXJlTmFtZXMoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uLCBQcm92aXNpb25FeGNlcHRpb24sIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAgICAgICAgSVF1ZXJ5UmVzdWx0PElJbnN0YWxsYWJsZVVuaXQ+IGFsbElVcyA9IGdldEFsbEdyb3VwSVVzKCk7CiAgICAgICAgcmV0dXJuIGNoZWNrRmVhdHVyZU5hbWVzKGFsbElVcyk7CiAgICB9CgogICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrRmVhdHVyZU5hbWVzKElRdWVyeVJlc3VsdDxJSW5zdGFsbGFibGVVbml0PiBhbGxJVXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgRmlsZVdyaXRlciBvdXRmaWxlV3JpdGVyID0gbnVsbDsKICAgICAgICBGaWxlIG91dGZpbGUgPSBudWxsOwogICAgICAgIExpc3Q8SUluc3RhbGxhYmxlVW5pdD4gaW5jb3JyZWN0QnVuZGxlTmFtZSA9IG5ldyBBcnJheUxpc3Q8SUluc3RhbGxhYmxlVW5pdD4oKTsKICAgICAgICBMaXN0PElJbnN0YWxsYWJsZVVuaXQ+IHByb2JhYmx5Q29ycmVjdEJ1bmRsZU5hbWUgPSBuZXcgQXJyYXlMaXN0PElJbnN0YWxsYWJsZVVuaXQ+KCk7CiAgICAgICAgU3RyaW5nIHRlc3REaXJOYW1lID0gZ2V0T3V0cHV0RGlyZWN0b3J5KCk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgb3V0ZmlsZSA9IG5ldyBGaWxlKHRlc3REaXJOYW1lLCAiZmVhdHVyZU5hbWVzLmh0bWwiKTsKICAgICAgICAgICAgb3V0ZmlsZVdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKG91dGZpbGUpOwogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm91dHB1dDogIiArIG91dGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgICAgICBmb3IgKElJbnN0YWxsYWJsZVVuaXQgaXUgOiBhbGxJVXMudG9Vbm1vZGlmaWFibGVTZXQoKSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgY2F0ZWdvcmllcwogICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNDYXRlZ29yeSA9ICJ0cnVlIi5lcXVhbHMoaXUuZ2V0UHJvcGVydHkoIm9yZy5lY2xpcHNlLmVxdWlub3gucDIudHlwZS5jYXRlZ29yeSIpKTsKICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgd2UgZXhjbHVkZSBmcmFnbWVudHM/CiAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0ZyYWdtZW50ID0gInRydWUiLmVxdWFscyhpdS5nZXRQcm9wZXJ0eSgib3JnLmVjbGlwc2UuZXF1aW5veC5wMi50eXBlLmZyYWdtZW50IikpOwoKICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBwcm9iYWJseSBkbyBub3QgbmVlZCB0byBleGNsdWRlIGFsbCBvZiB0aGVzZT8gU2luY2Ugd2UgYXJlIHNwZWNpZmljYWxseSBzZWxlY3RpbmcgImdyb3VwcyI/IAogICAgICAgICAgICAgICAgICAgIGlmICgoaXNGZWF0dXJlR3JvdXAoaXUpICYmICFpc0NhdGVnb3J5KSAmJiAhaXNTcGVjaWFsKGl1KSAmJiAhaXNGcmFnbWVudCkgewogICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYnVuZGxlTmFtZSA9IGl1LmdldFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQuUFJPUF9OQU1FLCBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IHN1cmUgZmkgY2FuIGV2ZXIgYmUgbnVsbCAuLi4gYnV0LCBqdXN0IGluIGNhc2UKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1bmRsZU5hbWUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb3JyZWN0QnVuZGxlTmFtZS5hZGQoaXUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChidW5kbGVOYW1lLnN0YXJ0c1dpdGgoIiUiKSB8fCBidW5kbGVOYW1lLnN0YXJ0c1dpdGgoIkZlYXR1cmUtIikgfHwgYnVuZGxlTmFtZS5zdGFydHNXaXRoKCJCdW5kbGUtIikgfHwgYnVuZGxlTmFtZS5zdGFydHNXaXRoKCJmZWF0dXJlIikgfHwgYnVuZGxlTmFtZS5zdGFydHNXaXRoKCJwbHVnaW4iKSB8fCBidW5kbGVOYW1lLnN0YXJ0c1dpdGgoIlBsdWdpbi5uYW1lIikgfHwgYnVuZGxlTmFtZS5zdGFydHNXaXRoKCJmcmFnbWVudC4iKSB8fCBidW5kbGVOYW1lLnN0YXJ0c1dpdGgoIkVjbGlwc2Uub3JnIikgfHwgYnVuZGxlTmFtZS5zdGFydHNXaXRoKCJidW5kbGUiKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29ycmVjdEJ1bmRsZU5hbWUuYWRkKGl1KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JhYmx5Q29ycmVjdEJ1bmRsZU5hbWUuYWRkKGl1KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlcmltZW50IHRvIGZpbmQgY29uZmlncyBhbmQgY2F0ZWdvcmllcwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidW5kbGVOYW1lID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludEFsbFByb3BlcnRpZXMob3V0ZmlsZVdyaXRlciwgaXUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBvdXRmaWxlV3JpdGVyLndyaXRlKCI8aDE+RmVhdHVyZSBuYW1lcyB1c2VkIGluIHJlcG9zaXRvcnk8L2gxPiIgKyBFT0wpOwogICAgICAgICAgICBvdXRmaWxlV3JpdGVyLndyaXRlKCI8cD5SZXBvc2l0b3J5ICgncmVwb1VSTFRvVGVzdCcpOiAiICsgZ2V0UmVwb1VSTFRvVGVzdCgpICsgIjwvcD4iICsgRU9MKTsKICAgICAgICAgICAgb3V0ZmlsZVdyaXRlci53cml0ZSgiPGgyPk1ham9yOiBtaXNzaW5nIG9yIChwcm9iYWJseSkgaW5jb3JyZWN0IG5hbWVzPC9oMj4iICsgRU9MKTsKICAgICAgICAgICAgcHJpbnRMaW5lc0J1bmRsZU5hbWUob3V0ZmlsZVdyaXRlciwgaW5jb3JyZWN0QnVuZGxlTmFtZSk7CiAgICAgICAgICAgIG91dGZpbGVXcml0ZXIud3JpdGUoIjxoMj5Qcm9iYWJseSBjb3JyZWN0IG5hbWVzPC9oMj4iICsgRU9MKTsKICAgICAgICAgICAgcHJpbnRMaW5lc0J1bmRsZU5hbWUob3V0ZmlsZVdyaXRlciwgcHJvYmFibHlDb3JyZWN0QnVuZGxlTmFtZSk7CgogICAgICAgICAgICAvLyAgICAgICAgICAgIGlmIChpbmNvcnJlY3RCdW5kbGVOYW1lLnNpemUoKSA+IDApIHsKICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgZmFpbCgiRXJyb3JzIGluIG5hbWluZyBvciBsb2NhbGl6YXRpb24uIEZvciBsaXN0LCBzZWUgIiArIG91dGZpbGUuZ2V0TmFtZSgpKTsKICAgICAgICAgICAgLy8gICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBpbmNvcnJlY3RCdW5kbGVOYW1lLnNpemUoKSA+IDA7CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICBpZiAob3V0ZmlsZVdyaXRlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIG91dGZpbGVXcml0ZXIuY2xvc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gd291bGQgYmUgd2VpcmQKICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja0J1bmRsZU5hbWVzKElRdWVyeVJlc3VsdDxJSW5zdGFsbGFibGVVbml0PiBhbGxJVXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgRmlsZVdyaXRlciBvdXRmaWxlV3JpdGVyID0gbnVsbDsKICAgICAgICBGaWxlIG91dGZpbGUgPSBudWxsOwogICAgICAgIExpc3Q8SUluc3RhbGxhYmxlVW5pdD4gaW5jb3JyZWN0QnVuZGxlTmFtZSA9IG5ldyBBcnJheUxpc3Q8SUluc3RhbGxhYmxlVW5pdD4oKTsKICAgICAgICBMaXN0PElJbnN0YWxsYWJsZVVuaXQ+IHByb2JhYmx5Q29ycmVjdEJ1bmRsZU5hbWUgPSBuZXcgQXJyYXlMaXN0PElJbnN0YWxsYWJsZVVuaXQ+KCk7CiAgICAgICAgU3RyaW5nIHRlc3REaXJOYW1lID0gZ2V0T3V0cHV0RGlyZWN0b3J5KCk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgb3V0ZmlsZSA9IG5ldyBGaWxlKHRlc3REaXJOYW1lLCAiYnVuZGxlTmFtZXMuaHRtbCIpOwogICAgICAgICAgICBvdXRmaWxlV3JpdGVyID0gbmV3IEZpbGVXcml0ZXIob3V0ZmlsZSk7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigib3V0cHV0OiAiICsgb3V0ZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgICAgIGZvciAoSUluc3RhbGxhYmxlVW5pdCBpdSA6IGFsbElVcy50b1VubW9kaWZpYWJsZVNldCgpKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBjYXRlZ29yaWVzCiAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0NhdGVnb3J5ID0gInRydWUiLmVxdWFscyhpdS5nZXRQcm9wZXJ0eSgib3JnLmVjbGlwc2UuZXF1aW5veC5wMi50eXBlLmNhdGVnb3J5IikpOwogICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBleGNsdWRlIGZyYWdtZW50cz8KICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzRnJhZ21lbnQgPSAidHJ1ZSIuZXF1YWxzKGl1LmdldFByb3BlcnR5KCJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnR5cGUuZnJhZ21lbnQiKSk7CgoKICAgICAgICAgICAgICAgICAgICAvLyB3ZSBleGNsdWRlIGZlYXR1cmUgZ3JvdXBzIGhlcmUsIHNvIHRoZXkgY2FuIGJlIGluIHRoZWlyIG93biBsaXN0LCBmb3IgYmV0dGVyIGZvY3VzCiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0NhdGVnb3J5ICYmICFpc1NwZWNpYWwoaXUpICYmICFpc0ZyYWdtZW50ICYmICFpc0ZlYXR1cmVHcm91cChpdSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGJ1bmRsZU5hbWUgPSBpdS5nZXRQcm9wZXJ0eShJSW5zdGFsbGFibGVVbml0LlBST1BfTkFNRSwgbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBzdXJlIGZpIGNhbiBldmVyIGJlIG51bGwgLi4uIGJ1dCwganVzdCBpbiBjYXNlCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidW5kbGVOYW1lID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29ycmVjdEJ1bmRsZU5hbWUuYWRkKGl1KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgoYnVuZGxlTmFtZS5zdGFydHNXaXRoKCIlIikgfHwgYnVuZGxlTmFtZS5zdGFydHNXaXRoKCJCdW5kbGUtIikgfHwgYnVuZGxlTmFtZS5zdGFydHNXaXRoKCJwbHVnaW4iKSB8fCBidW5kbGVOYW1lLnN0YXJ0c1dpdGgoIlBsdWdpbi5uYW1lIikgfHwgYnVuZGxlTmFtZS5zdGFydHNXaXRoKCJmcmFnbWVudC4iKSB8fCBidW5kbGVOYW1lLnN0YXJ0c1dpdGgoIkVjbGlwc2Uub3JnIikgfHwgYnVuZGxlTmFtZS5zdGFydHNXaXRoKCJidW5kbGUiKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29ycmVjdEJ1bmRsZU5hbWUuYWRkKGl1KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JhYmx5Q29ycmVjdEJ1bmRsZU5hbWUuYWRkKGl1KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlcmltZW50IHRvIGZpbmQgY29uZmlncyBhbmQgY2F0ZWdvcmllcwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidW5kbGVOYW1lID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludEFsbFByb3BlcnRpZXMob3V0ZmlsZVdyaXRlciwgaXUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBvdXRmaWxlV3JpdGVyLndyaXRlKCI8aDE+QnVuZGxlIG5hbWVzIHVzZWQgaW4gcmVwb3NpdG9yeTwvaDE+IiArIEVPTCk7CiAgICAgICAgICAgIG91dGZpbGVXcml0ZXIud3JpdGUoIjxwPlJlcG9zaXRvcnkgKCdyZXBvVVJMVG9UZXN0Jyk6ICIgKyBnZXRSZXBvVVJMVG9UZXN0KCkgKyAiPC9wPiIgKyBFT0wpOwogICAgICAgICAgICAvL291dGZpbGVXcml0ZXIud3JpdGUoIjxwPk5vdGUsIHRoZXJlIGFyZSBzZXZlcmFsIHByb2JsZW1zIHdpdGggdGhpcyB0ZXN0LCBlLmcuIHNlZSA8YSBocmVmPVwiaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwOTU2NlwiPmJ1ZyAzMDk1NjY8L2E+LiBTbyBwcm92aWRlZCBoZXJlIGFzIEZZSSBmb3Igbm93LjwvcD4iICsgRU9MKTsKICAgICAgICAgICAgb3V0ZmlsZVdyaXRlci53cml0ZSgiPGgyPk1ham9yOiBtaXNzaW5nIG9yIChwcm9iYWJseSkgaW5jb3JyZWN0IGJ1bmRsZSBuYW1lPC9oMj4iICsgRU9MKTsKICAgICAgICAgICAgcHJpbnRMaW5lc0J1bmRsZU5hbWUob3V0ZmlsZVdyaXRlciwgaW5jb3JyZWN0QnVuZGxlTmFtZSk7CiAgICAgICAgICAgIG91dGZpbGVXcml0ZXIud3JpdGUoIjxoMj5Qcm9iYWJseSBjb3JyZWN0IGJ1bmRsZSBuYW1lPC9oMj4iICsgRU9MKTsKICAgICAgICAgICAgcHJpbnRMaW5lc0J1bmRsZU5hbWUob3V0ZmlsZVdyaXRlciwgcHJvYmFibHlDb3JyZWN0QnVuZGxlTmFtZSk7CgogICAgICAgICAgICAvLyAgICAgICAgICAgIGlmIChpbmNvcnJlY3RCdW5kbGVOYW1lLnNpemUoKSA+IDApIHsKICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgZmFpbCgiRXJyb3JzIGluIG5hbWluZyBvciBsb2NhbGl6YXRpb24uIEZvciBsaXN0LCBzZWUgIiArIG91dGZpbGUuZ2V0TmFtZSgpKTsKICAgICAgICAgICAgLy8gICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBpbmNvcnJlY3RCdW5kbGVOYW1lLnNpemUoKSA+IDA7CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICBpZiAob3V0ZmlsZVdyaXRlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIG91dGZpbGVXcml0ZXIuY2xvc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gd291bGQgYmUgd2VpcmQKICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHByaXZhdGUgdm9pZCBwcmludExpbmVzQnVuZGxlTmFtZShGaWxlV3JpdGVyIG91dCwgTGlzdDxJSW5zdGFsbGFibGVVbml0PiBpdUxpc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgLy9Db21wYXJhdG9yPD8gc3VwZXIgSUluc3RhbGxhYmxlVW5pdD4gY29tcGFyYXRvckJ1bmRsZU5hbWUgPSBuZXcgSVVOYW1lQW5kSWRDb21wYXJhdG9yKCk7CiAgICAgICAgQ29tcGFyYXRvcjw/IHN1cGVyIElJbnN0YWxsYWJsZVVuaXQ+IGNvbXBhcmF0b3JCdW5kbGVOYW1lID0gbmV3IElVSWRDb21wYXJhdG9yKCk7CiAgICAgICAgQ29sbGVjdGlvbnMuc29ydChpdUxpc3QsIGNvbXBhcmF0b3JCdW5kbGVOYW1lKTsKICAgICAgICBvdXQud3JpdGUoIjxwPkNvdW50OiAiICsgaXVMaXN0LnNpemUoKSArIEVPTCk7CiAgICAgICAgb3V0LndyaXRlKCI8b2w+IiArIEVPTCk7CgogICAgICAgIGZvciAoSUluc3RhbGxhYmxlVW5pdCBpdSA6IGl1TGlzdCkgewogICAgICAgICAgICBwcmludExpbmVMaXN0SXRlbShvdXQsIGl1LCBJSW5zdGFsbGFibGVVbml0LlBST1BfTkFNRSk7CiAgICAgICAgfQogICAgICAgIG91dC53cml0ZSgiPC9vbD4iICsgRU9MKTsKICAgIH0KCn0KUEsDBAoAAAAAAG9YCj87DNcuQhsAAEIbAAA1AAAAb3JnL2VjbGlwc2UvanVuby90ZXN0cy9yZXBvcy9GZWF0dXJlTmFtZUxlbmd0aHMuY2xhc3PK/rq+AAAAMQFBBwACAQAvb3JnL2VjbGlwc2UvanVuby90ZXN0cy9yZXBvcy9GZWF0dXJlTmFtZUxlbmd0aHMHAAQBACVvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3JlcG9zL1Rlc3RSZXBvAQAMZGlzdHJpYnV0aW9uAQAPTGphdmEvdXRpbC9NYXA7AQALbWF4Q3JpdGVyaWEBAAFJAQAMbG9uZ2VzdE5hbWVzAQAQTGphdmEvdXRpbC9MaXN0OwEABjxpbml0PgEAAygpVgEABENvZGUKAAMADwwACwAMCQABABEMAAUABgkAAQATDAAHAAgHABUBABNqYXZhL3V0aWwvQXJyYXlMaXN0CgAUAA8JAAEAGAwACQAKAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAEdGhpcwEAMUxvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3JlcG9zL0ZlYXR1cmVOYW1lTGVuZ3RoczsBAAxhc1NvcnRlZExpc3QBACgoTGphdmEvdXRpbC9Db2xsZWN0aW9uOylMamF2YS91dGlsL0xpc3Q7AQAJU2lnbmF0dXJlAQBTPFQ6OkxqYXZhL2xhbmcvQ29tcGFyYWJsZTwtVFQ7Pjs+KExqYXZhL3V0aWwvQ29sbGVjdGlvbjxUVDs+OylMamF2YS91dGlsL0xpc3Q8VFQ7PjsKABQAIgwACwAjAQAZKExqYXZhL3V0aWwvQ29sbGVjdGlvbjspVgoAJQAnBwAmAQAVamF2YS91dGlsL0NvbGxlY3Rpb25zDAAoACkBAARzb3J0AQATKExqYXZhL3V0aWwvTGlzdDspVgEAAWMBABZMamF2YS91dGlsL0NvbGxlY3Rpb247AQAEbGlzdAEAFkxvY2FsVmFyaWFibGVUeXBlVGFibGUBABtMamF2YS91dGlsL0NvbGxlY3Rpb248VFQ7PjsBABVMamF2YS91dGlsL0xpc3Q8VFQ7PjsBAAVzdWl0ZQEAGCgpTGp1bml0L2ZyYW1ld29yay9UZXN0OwkAMwA1BwA0AQAQamF2YS9sYW5nL1N5c3RlbQwANgA3AQADb3V0AQAVTGphdmEvaW8vUHJpbnRTdHJlYW07CAA5AQAedGVzdCBmZWF0dXJlIGRpcmVjdG9yeSBsZW5ndGhzCgA7AD0HADwBABNqYXZhL2lvL1ByaW50U3RyZWFtDAA+AD8BAAdwcmludGxuAQAVKExqYXZhL2xhbmcvU3RyaW5nOylWCgABAA8IAEIBABp0ZXN0RmVhdHVyZURpcmVjdG9yeUxlbmd0aAoAAQBEDABFAD8BAAdzZXROYW1lCABHAQAtZmlsZTovLy9ob21lL2ZpbGVzL2J1aWxkemlwcy9qdW5vUkMzL3d0cC1yZXBvCgABAEkMAEoAPwEAEHNldFJlcG9VUkxUb1Rlc3QIAEwBABEvaG9tZS9kYXZpZHcvdGVtcAoAAQBODABPAD8BABJzZXRPdXRwdXREaXJlY3RvcnkBABJmZWF0dXJlTmFtZUxlbmd0aHMBAARtYWluAQAWKFtMamF2YS9sYW5nL1N0cmluZzspVggAVAEAJi9ob21lL2ZpbGVzL2J1aWxkemlwcy9qdW5vUkMzL3d0cC1yZXBvCABWAQAFL3RlbXAKAAEAWAwAQgBZAQADKClJCgBbAF0HAFwBAC5vcmcvZWNsaXBzZS9lcXVpbm94L3AyL2NvcmUvUHJvdmlzaW9uRXhjZXB0aW9uDABeAAwBAA9wcmludFN0YWNrVHJhY2UKAGAAXQcAYQEAG2phdmEvbmV0L1VSSVN5bnRheEV4Y2VwdGlvbgoAYwBdBwBkAQATamF2YS9pby9JT0V4Y2VwdGlvbgEABGFyZ3MBABNbTGphdmEvbGFuZy9TdHJpbmc7AQABZQEAMExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL2NvcmUvUHJvdmlzaW9uRXhjZXB0aW9uOwEAHUxqYXZhL25ldC9VUklTeW50YXhFeGNlcHRpb247AQAVTGphdmEvaW8vSU9FeGNlcHRpb247AQAHYW5hbHl6ZQEALihMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ7KVYBAGIoTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcXVlcnkvSVF1ZXJ5UmVzdWx0PExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7PjspVgcAbwEAEWphdmEvdXRpbC9IYXNoTWFwCgBuAA8LAHIAdAcAcwEAKW9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcXVlcnkvSVF1ZXJ5UmVzdWx0DAB1AHYBABF0b1VubW9kaWZpYWJsZVNldAEAESgpTGphdmEvdXRpbC9TZXQ7CwB4AHoHAHkBAA1qYXZhL3V0aWwvU2V0DAB7AHwBAAhpdGVyYXRvcgEAFigpTGphdmEvdXRpbC9JdGVyYXRvcjsLAH4AgAcAfwEAEmphdmEvdXRpbC9JdGVyYXRvcgwAgQCCAQAEbmV4dAEAFCgpTGphdmEvbGFuZy9PYmplY3Q7BwCEAQAwb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0CwCDAIYMAIcAiAEABWdldElkAQAUKClMamF2YS9sYW5nL1N0cmluZzsIAIoBAA4uZmVhdHVyZS5ncm91cAoAjACOBwCNAQAQamF2YS9sYW5nL1N0cmluZwwAjwBZAQAGbGVuZ3RoCgCMAJEMAJIAkwEACGVuZHNXaXRoAQAVKExqYXZhL2xhbmcvU3RyaW5nOylaCgCMAJUMAJYAlwEACXN1YnN0cmluZwEAFihJSSlMamF2YS9sYW5nL1N0cmluZzsHAJkBABdqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcgoAjACbDACcAJ0BAAd2YWx1ZU9mAQAmKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL1N0cmluZzsKAJgAnwwACwA/CAChAQABXwoAmACjDACkAKUBAAZhcHBlbmQBAC0oTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsLAIMApwwAqACpAQAKZ2V0VmVyc2lvbgEAKygpTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvVmVyc2lvbjsKAJgAqwwApACsAQAtKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CgCYAK4MAK8AiAEACHRvU3RyaW5nCgABALEMALIAswEACHRhYnVsYXRlAQAEKEkpVgsAtQC3BwC2AQAOamF2YS91dGlsL0xpc3QMALgAuQEAA2FkZAEAFShMamF2YS9sYW5nL09iamVjdDspWgsAfgC7DAC8AL0BAAdoYXNOZXh0AQADKClaAQAGYWxsSVVzAQArTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcXVlcnkvSVF1ZXJ5UmVzdWx0OwEAAml1AQAyTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDsBAAtmZWF0dXJlTmFtZQEAEkxqYXZhL2xhbmcvU3RyaW5nOwEADGZlYXR1cmVHcm91cAEAEmZlYXR1cmVHcm91cExlbmd0aAEABGxpbmUBAF9Mb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ8TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDs+OwEAC3ByaW50UmVwb3J0AQAKRXhjZXB0aW9ucwgAywEAHTxiciAvPj09PT09PT09PT09PT09PT09PT09PT09CgABAM0MAM4AiAEAEmdldE91dHB1dERpcmVjdG9yeQcA0AEADGphdmEvaW8vRmlsZQgA0gEAHGZlYXR1cmVEaXJlY3RvcnlMZW5ndGhzLmh0bWwKAM8A1AwACwDVAQAnKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylWBwDXAQASamF2YS9pby9GaWxlV3JpdGVyCgDWANkMAAsA2gEAEShMamF2YS9pby9GaWxlOylWCADcAQAhPHA+UmVwb3NpdG9yeSAoJ3JlcG9VUkxUb1Rlc3QnKTogCgABAN4MAN8AiAEAEGdldFJlcG9VUkxUb1Rlc3QIAOEBAAQ8L3A+CQABAOMMAOQAwwEAA0VPTAoAAQDmDAA+AOcBACkoTGphdmEvaW8vRmlsZVdyaXRlcjtMamF2YS9sYW5nL1N0cmluZzspVggA6QEANjxiciAvPjxiciAvPkRpc3RyaWJ1dGlvbiBvZiBGZWF0dXJlIERpcmVjdG9yeSBMZW5ndGhzOgcA6wEAEWphdmEvbGFuZy9JbnRlZ2VyCgDqAO0MAAsAswsA7wDxBwDwAQANamF2YS91dGlsL01hcAwA8gB2AQAGa2V5U2V0CgABAPQMAB0AHgsAtQB6CwDvAPcMAPgA+QEAA2dldAEAJihMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7CAD7AQAIICZuYnNwOyAKAOoA/QwA/gBZAQAIaW50VmFsdWUKAOoBAAwAnAEBAQAWKEkpTGphdmEvbGFuZy9JbnRlZ2VyOwgBAwEAFz09PT09PT09PT09PT09PT09PT09PT09CAEFAQAoICZuYnNwOyBUb3RhbCBmZWF0dXJlcyBkaXJlY3RvcnkgbmFtZXM6IAsAtQEHDAEIAFkBAARzaXplCAEKAQA0ICZuYnNwOyBGZWF0dXJlcyBkaXJlY3RvcnkgbmFtZXMgd2l0aCBsZW5ndGhzIGFib3ZlIAoAmAEMDACkAQ0BABwoSSlMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7BwEPAQAzb3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9TdHJpbmdMZW5ndGhDb21wYXJhdG9yCgEOAA8KACUBEgwAKAETAQApKExqYXZhL3V0aWwvTGlzdDtMamF2YS91dGlsL0NvbXBhcmF0b3I7KVYLALUBFQwA+AEWAQAVKEkpTGphdmEvbGFuZy9PYmplY3Q7CgCMARgMAJwBGQEAFShJKUxqYXZhL2xhbmcvU3RyaW5nOwgBGwEATiAmbmJzcDsgIE5vIGZlYXR1cmUgZGlyZWN0b3J5IG5hbWVzIGxlbmd0aHMgd2VyZSBsb25nZXIgdGhhbiB0aGUgbWF4Q3JpdGVyaWEsIAoA1gEdDAEeAAwBAAVjbG9zZQEABlNQQUNFUgEADW91dGZpbGVXcml0ZXIBABRMamF2YS9pby9GaWxlV3JpdGVyOwEAB291dGZpbGUBAA5MamF2YS9pby9GaWxlOwEAC3Rlc3REaXJOYW1lAQAFdG90YWwBABNMamF2YS9sYW5nL0ludGVnZXI7AQAEa2V5cwEAD0xqYXZhL3V0aWwvU2V0OwEAFExqYXZhL3V0aWwvSXRlcmF0b3I7AQAIY2F0ZWdvcnkBAAVjb3VudAEAAWkBACVMamF2YS91dGlsL0xpc3Q8TGphdmEvbGFuZy9JbnRlZ2VyOz47CwDvAS8MATABMQEAA3B1dAEAOChMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7CgABATMMATQBNQEADmdldEFsbEdyb3VwSVVzAQAtKClMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ7CgABATcMATgB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Lm5ldC5VUklTeW50YXhFeGNlcHRpb247CmltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwppbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CmltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CmltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKaW1wb3J0IGphdmEudXRpbC5MaXN0OwppbXBvcnQgamF2YS51dGlsLk1hcDsKaW1wb3J0IGphdmEudXRpbC5TZXQ7CgppbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CgppbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIucXVlcnkuSVF1ZXJ5UmVzdWx0OwppbXBvcnQgb3JnLmVjbGlwc2UuanVuby50ZXN0cy5yZXBvcy5GZWF0dXJlTmFtZUxlbmd0aHM7CmltcG9ydCBvcmcuZWNsaXBzZS5qdW5vLnRlc3RzLnJlcG9zLlRlc3RSZXBvOwppbXBvcnQgb3JnLmVjbGlwc2UuanVuby50ZXN0cy51dGlscy5TdHJpbmdMZW5ndGhDb21wYXJhdG9yOwoKcHVibGljIGNsYXNzIEZlYXR1cmVOYW1lTGVuZ3RocyBleHRlbmRzIFRlc3RSZXBvIHsKCiAgICBwcml2YXRlIE1hcCAgZGlzdHJpYnV0aW9uID0gbnVsbDsKICAgIHByaXZhdGUgaW50ICBtYXhDcml0ZXJpYSAgPSAxMDA7CiAgICBwcml2YXRlIExpc3QgbG9uZ2VzdE5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwoKICAgIHB1YmxpYyBzdGF0aWMgPFQgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgVD4+IExpc3Q8VD4gYXNTb3J0ZWRMaXN0KENvbGxlY3Rpb248VD4gYykgewogICAgICAgIExpc3Q8VD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8VD4oYyk7CiAgICAgICAgamF2YS51dGlsLkNvbGxlY3Rpb25zLnNvcnQobGlzdCk7CiAgICAgICAgcmV0dXJuIGxpc3Q7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdCBmZWF0dXJlIGRpcmVjdG9yeSBsZW5ndGhzIik7CiAgICAgICAgRmVhdHVyZU5hbWVMZW5ndGhzIGZlYXR1cmVOYW1lTGVuZ3RocyA9IG5ldyBGZWF0dXJlTmFtZUxlbmd0aHMoKTsKICAgICAgICBmZWF0dXJlTmFtZUxlbmd0aHMuc2V0TmFtZSgidGVzdEZlYXR1cmVEaXJlY3RvcnlMZW5ndGgiKTsKICAgICAgICBmZWF0dXJlTmFtZUxlbmd0aHMuc2V0UmVwb1VSTFRvVGVzdCgiZmlsZTovLy9ob21lL2ZpbGVzL2J1aWxkemlwcy9qdW5vUkMzL3d0cC1yZXBvIik7CiAgICAgICAgZmVhdHVyZU5hbWVMZW5ndGhzLnNldE91dHB1dERpcmVjdG9yeSgiL2hvbWUvZGF2aWR3L3RlbXAiKTsKICAgICAgICByZXR1cm4gZmVhdHVyZU5hbWVMZW5ndGhzOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICBGZWF0dXJlTmFtZUxlbmd0aHMgZmVhdHVyZU5hbWVMZW5ndGhzID0gbmV3IEZlYXR1cmVOYW1lTGVuZ3RocygpOwogICAgICAgIGZlYXR1cmVOYW1lTGVuZ3Rocy5zZXRSZXBvVVJMVG9UZXN0KCIvaG9tZS9maWxlcy9idWlsZHppcHMvanVub1JDMy93dHAtcmVwbyIpOwogICAgICAgIGZlYXR1cmVOYW1lTGVuZ3Rocy5zZXRPdXRwdXREaXJlY3RvcnkoIi90ZW1wIik7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgZmVhdHVyZU5hbWVMZW5ndGhzLnRlc3RGZWF0dXJlRGlyZWN0b3J5TGVuZ3RoKCk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewogICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIGFuYWx5emUoSVF1ZXJ5UmVzdWx0PElJbnN0YWxsYWJsZVVuaXQ+IGFsbElVcykgewogICAgICAgIGRpc3RyaWJ1dGlvbiA9IG5ldyBIYXNoTWFwPEludGVnZXIsIEludGVnZXI+KCk7CiAgICAgICAgZm9yIChJSW5zdGFsbGFibGVVbml0IGl1IDogYWxsSVVzLnRvVW5tb2RpZmlhYmxlU2V0KCkpIHsKICAgICAgICAgICAgLy8gc2ltdWxhdGUgd2hhdCBkaXJlY3RvcnkgbmFtZSB3b3VsZCBiZSwgd2hlbiBpbnN0YWxsZWQKICAgICAgICAgICAgU3RyaW5nIGZlYXR1cmVOYW1lID0gaXUuZ2V0SWQoKTsKICAgICAgICAgICAgU3RyaW5nIGZlYXR1cmVHcm91cCA9ICIuZmVhdHVyZS5ncm91cCI7CiAgICAgICAgICAgIGludCBmZWF0dXJlR3JvdXBMZW5ndGggPSBmZWF0dXJlR3JvdXAubGVuZ3RoKCk7CiAgICAgICAgICAgIGlmIChmZWF0dXJlTmFtZS5lbmRzV2l0aChmZWF0dXJlR3JvdXApKSB7CiAgICAgICAgICAgICAgICBmZWF0dXJlTmFtZSA9IGZlYXR1cmVOYW1lLnN1YnN0cmluZygwLCBmZWF0dXJlTmFtZS5sZW5ndGgoKSAtIGZlYXR1cmVHcm91cExlbmd0aCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFN0cmluZyBsaW5lID0gZmVhdHVyZU5hbWUgKyAiXyIgKyBpdS5nZXRWZXJzaW9uKCk7CiAgICAgICAgICAgIHRhYnVsYXRlKGxpbmUubGVuZ3RoKCkpOwogICAgICAgICAgICBpZiAobGluZS5sZW5ndGgoKSA+IG1heENyaXRlcmlhKSB7CiAgICAgICAgICAgICAgICBsb25nZXN0TmFtZXMuYWRkKGxpbmUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHByaXZhdGUgdm9pZCBwcmludFJlcG9ydCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgU3RyaW5nIFNQQUNFUiA9ICI8YnIgLz49PT09PT09PT09PT09PT09PT09PT09PSI7CiAgICAgICAgRmlsZVdyaXRlciBvdXRmaWxlV3JpdGVyID0gbnVsbDsKICAgICAgICBGaWxlIG91dGZpbGUgPSBudWxsOwogICAgICAgIFN0cmluZyB0ZXN0RGlyTmFtZSA9IGdldE91dHB1dERpcmVjdG9yeSgpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIG91dGZpbGUgPSBuZXcgRmlsZSh0ZXN0RGlyTmFtZSwgImZlYXR1cmVEaXJlY3RvcnlMZW5ndGhzLmh0bWwiKTsKICAgICAgICAgICAgb3V0ZmlsZVdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKG91dGZpbGUpOwoKICAgICAgICAgICAgcHJpbnRsbihvdXRmaWxlV3JpdGVyLCAiPHA+UmVwb3NpdG9yeSAoJ3JlcG9VUkxUb1Rlc3QnKTogIiArIGdldFJlcG9VUkxUb1Rlc3QoKSArICI8L3A+IiArIEVPTCk7CiAgICAgICAgICAgIHByaW50bG4ob3V0ZmlsZVdyaXRlciwgIjxiciAvPjxiciAvPkRpc3RyaWJ1dGlvbiBvZiBGZWF0dXJlIERpcmVjdG9yeSBMZW5ndGhzOiIgKyBTUEFDRVIpOwoKICAgICAgICAgICAgSW50ZWdlciB0b3RhbCA9IG5ldyBJbnRlZ2VyKDApOwogICAgICAgICAgICBTZXQga2V5cyA9IGRpc3RyaWJ1dGlvbi5rZXlTZXQoKTsKICAgICAgICAgICAgTGlzdDxJbnRlZ2VyPiBsaXN0ID0gYXNTb3J0ZWRMaXN0KGtleXMpOwogICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7CiAgICAgICAgICAgICAgICBJbnRlZ2VyIGNhdGVnb3J5ID0gKEludGVnZXIpIGl0ZXJhdG9yLm5leHQoKTsKICAgICAgICAgICAgICAgIEludGVnZXIgY291bnQgPSAoSW50ZWdlcikgZGlzdHJpYnV0aW9uLmdldChjYXRlZ29yeSk7CiAgICAgICAgICAgICAgICBwcmludGxuKG91dGZpbGVXcml0ZXIsIE5CU1AgKyBjYXRlZ29yeSArIE5CU1AgKyBjb3VudCk7CiAgICAgICAgICAgICAgICB0b3RhbCA9IHRvdGFsICsgY291bnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJpbnRsbihvdXRmaWxlV3JpdGVyLCAiPT09PT09PT09PT09PT09PT09PT09PT0iICsgRU9MKTsKICAgICAgICAgICAgcHJpbnRsbihvdXRmaWxlV3JpdGVyLCBOQlNQICsgIlRvdGFsIGZlYXR1cmVzIGRpcmVjdG9yeSBuYW1lczogIiArIHRvdGFsICsgRU9MKTsKICAgICAgICAgICAgcHJpbnRsbihvdXRmaWxlV3JpdGVyLCAiPT09PT09PT09PT09PT09PT09PT09PT0iICsgRU9MKTsKICAgICAgICAgICAgaWYgKGxvbmdlc3ROYW1lcy5zaXplKCkgPiAwKSB7CgogICAgICAgICAgICAgICAgcHJpbnRsbihvdXRmaWxlV3JpdGVyLCBOQlNQICsgIkZlYXR1cmVzIGRpcmVjdG9yeSBuYW1lcyB3aXRoIGxlbmd0aHMgYWJvdmUgIiArIG1heENyaXRlcmlhICsgRU9MKTsKICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQobG9uZ2VzdE5hbWVzLCBuZXcgU3RyaW5nTGVuZ3RoQ29tcGFyYXRvcigpKTsKICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbG9uZ2VzdE5hbWVzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSAoU3RyaW5nKSBsb25nZXN0TmFtZXMuZ2V0KGkpOwogICAgICAgICAgICAgICAgICAgIHByaW50bG4ob3V0ZmlsZVdyaXRlciwgbGluZS5sZW5ndGgoKSArIE5CU1AgKyBsaW5lICsgRU9MKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHByaW50bG4ob3V0ZmlsZVdyaXRlciwgTkJTUCArICIgTm8gZmVhdHVyZSBkaXJlY3RvcnkgbmFtZXMgbGVuZ3RocyB3ZXJlIGxvbmdlciB0aGFuIHRoZSBtYXhDcml0ZXJpYSwgIiArIG1heENyaXRlcmlhICsgRU9MKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgaWYgKG91dGZpbGVXcml0ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBvdXRmaWxlV3JpdGVyLmNsb3NlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgIC8vIHdvdWxkIGJlIHdlaXJkCiAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIHRhYnVsYXRlKGludCBsZW5ndGgpIHsKICAgICAgICBJbnRlZ2VyIGNhdGVnb3J5ID0gbmV3IEludGVnZXIobGVuZ3RoKTsKICAgICAgICBJbnRlZ2VyIGNvdW50ID0gKEludGVnZXIpIGRpc3RyaWJ1dGlvbi5nZXQoY2F0ZWdvcnkpOwogICAgICAgIGlmIChjb3VudCA9PSBudWxsKSB7CiAgICAgICAgICAgIC8vIG91ciBmaXJzdCBvY2N1cmFuY2UKICAgICAgICAgICAgY291bnQgPSBuZXcgSW50ZWdlcigxKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyAxOwogICAgICAgIH0KICAgICAgICBkaXN0cmlidXRpb24ucHV0KGNhdGVnb3J5LCBjb3VudCk7CiAgICB9CgogICAgcHVibGljIGludCB0ZXN0RmVhdHVyZURpcmVjdG9yeUxlbmd0aCgpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24sIFVSSVN5bnRheEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogICAgICAgIElRdWVyeVJlc3VsdDxJSW5zdGFsbGFibGVVbml0PiBhbGxJVXMgPSBnZXRBbGxHcm91cElVcygpOwogICAgICAgIHJldHVybiBjaGVja0ZlYXR1cmVEaXJMZW50aHMoYWxsSVVzKTsKICAgIH0KCiAgICBwcml2YXRlIGludCBjaGVja0ZlYXR1cmVEaXJMZW50aHMoSVF1ZXJ5UmVzdWx0PElJbnN0YWxsYWJsZVVuaXQ+IGFsbElVcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICBhbmFseXplKGFsbElVcyk7CiAgICAgICAgcHJpbnRSZXBvcnQoKTsKICAgICAgICByZXR1cm4gbG9uZ2VzdE5hbWVzLnNpemUoKTsKICAgIH0KfQpQSwMECgAAAAAAb1gKP+A/214EGwAABBsAADYAAABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3JlcG9zL1Byb3ZpZGVyTmFtZUNoZWNrZXIuY2xhc3PK/rq+AAAAMQFGBwACAQAwb3JnL2VjbGlwc2UvanVuby90ZXN0cy9yZXBvcy9Qcm92aWRlck5hbWVDaGVja2VyBwAEAQAlb3JnL2VjbGlwc2UvanVuby90ZXN0cy9yZXBvcy9UZXN0UmVwbwEAEU9MRF9QUk9WSURFUl9OQU1FAQASTGphdmEvbGFuZy9TdHJpbmc7AQANQ29uc3RhbnRWYWx1ZQgACQEAC0VjbGlwc2Uub3JnAQAXRVhQRUNURURfUFJPVklERVJfTkFNRVMBABNbTGphdmEvbGFuZy9TdHJpbmc7AQAGPGluaXQ+AQADKClWAQAEQ29kZQoAAwAQDAAMAA0HABIBABBqYXZhL2xhbmcvU3RyaW5nCAAUAQAXRWNsaXBzZSBFcXVpbm94IFByb2plY3QIABYBAAtFY2xpcHNlIFBUUAgAGAEADUVjbGlwc2UgT3JiaXQIABoBABpFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQgAHAEAC0VjbGlwc2UgQ0RUCAAeAQAfRWNsaXBzZSBBZ2VudCBNb2RlbGluZyBQbGF0Zm9ybQgAIAEAFEVjbGlwc2UgQklSVCBQcm9qZWN0CAAiAQAbRWNsaXBzZSBEYXRhIFRvb2xzIFBsYXRmb3JtCAAkAQAYRWNsaXBzZSBNb2RlbGluZyBQcm9qZWN0CAAmAQANRWNsaXBzZSBNeWx5bggAKAEAF0VjbGlwc2UgTWVtb3J5IEFuYWx5emVyCAAqAQATRWNsaXBzZSBMaW51eCBUb29scwgALAEADkVjbGlwc2UgSnVidWxhCAAuAQAVRWNsaXBzZSBKZXR0eSBQcm9qZWN0CAAwAQANRWNsaXBzZSBHeXJleAgAMgEADEVjbGlwc2UgRUdpdAgANAEADEVjbGlwc2UgSkdpdAgANgEAHkVjbGlwc2UgQWdlbnQgTW9kZWxpbmcgUHJvamVjdAgAOAEAGUVjbGlwc2UgUGFja2FnaW5nIFByb2plY3QIADoBABVFY2xpcHNlIFNjb3V0IFByb2plY3QIADwBABBFY2xpcHNlIFNlcXVveWFoCAA+AQASRWNsaXBzZSBUTSBQcm9qZWN0CQABAEAMAAoACwEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBADJMb3JnL2VjbGlwc2UvanVuby90ZXN0cy9yZXBvcy9Qcm92aWRlck5hbWVDaGVja2VyOwEAEmNoZWNrUHJvdmlkZXJOYW1lcwEALihMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ7KVoBAApFeGNlcHRpb25zBwBJAQATamF2YS9pby9JT0V4Y2VwdGlvbgEACVNpZ25hdHVyZQEAYihMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ8TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDs+OylaBwBNAQATamF2YS91dGlsL0FycmF5TGlzdAoATAAQCgABAFAMAFEAUgEAEmdldE91dHB1dERpcmVjdG9yeQEAFCgpTGphdmEvbGFuZy9TdHJpbmc7BwBUAQAMamF2YS9pby9GaWxlCABWAQAScHJvdmlkZXJOYW1lcy5odG1sCgBTAFgMAAwAWQEAJyhMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspVgcAWwEAEmphdmEvaW8vRmlsZVdyaXRlcgoAWgBdDAAMAF4BABEoTGphdmEvaW8vRmlsZTspVgkAYABiBwBhAQAQamF2YS9sYW5nL1N5c3RlbQwAYwBkAQADb3V0AQAVTGphdmEvaW8vUHJpbnRTdHJlYW07BwBmAQAXamF2YS9sYW5nL1N0cmluZ0J1aWxkZXIIAGgBAAhvdXRwdXQ6IAoAZQBqDAAMAGsBABUoTGphdmEvbGFuZy9TdHJpbmc7KVYKAFMAbQwAbgBSAQAPZ2V0QWJzb2x1dGVQYXRoCgBlAHAMAHEAcgEABmFwcGVuZAEALShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwoAZQB0DAB1AFIBAAh0b1N0cmluZwoAdwB5BwB4AQATamF2YS9pby9QcmludFN0cmVhbQwAegBrAQAHcHJpbnRsbgsAfAB+BwB9AQApb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQMAH8AgAEAEXRvVW5tb2RpZmlhYmxlU2V0AQARKClMamF2YS91dGlsL1NldDsLAIIAhAcAgwEADWphdmEvdXRpbC9TZXQMAIUAhgEACGl0ZXJhdG9yAQAWKClMamF2YS91dGlsL0l0ZXJhdG9yOwsAiACKBwCJAQASamF2YS91dGlsL0l0ZXJhdG9yDACLAIwBAARuZXh0AQAUKClMamF2YS9sYW5nL09iamVjdDsHAI4BADBvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQIAJABAAR0cnVlCACSAQAkb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50eXBlLmNhdGVnb3J5CwCNAJQMAJUAlgEAC2dldFByb3BlcnR5AQAmKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZzsKABEAmAwAmQCaAQAGZXF1YWxzAQAVKExqYXZhL2xhbmcvT2JqZWN0OylaCACcAQAkb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50eXBlLmZyYWdtZW50CgABAJ4MAJ8AoAEACWlzU3BlY2lhbAEANShMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0OylaCACiAQAfb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcgsAjQCkDACVAKUBADgoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwsApwCpBwCoAQAOamF2YS91dGlsL0xpc3QMAKoAmgEAA2FkZAgArAEAASUKABEArgwArwCwAQAKc3RhcnRzV2l0aAEAFShMamF2YS9sYW5nL1N0cmluZzspWggAsgEAB0VjbGlwc2UIALQBAAtlY2xpcHNlLm9yZwgAtgEAC1RIQUxFU0dST1VQCAC4AQAFSU5SSUEIALoBAAtFbmdpbmVlcmluZwgAvAEAD29yZy5lY2xpcHNlLmp3dAoAEQC+DAC/AMABAAhjb250YWlucwEAGyhMamF2YS9sYW5nL0NoYXJTZXF1ZW5jZTspWggAwgEAD3d3dy5leGFtcGxlLm9yZwgAxAEAD3d3dy5lY2xpcHNlLm9yZwgAxgEACFByb3ZpZGVyCADIAQAIcHJvdmlkZXIIAMoBAAdCdW5kbGUtCADMAQAEYnVuZAgAzgEAB0VjbGlzcGUIANABAA5FY2xpcHNlLm9yZyAtIAoAAQDSDADTALABABRpbkxpc3RPZkV4cGVjdGVkTmFtZQoA1QDXBwDWAQAaamF2YS9sYW5nL1J1bnRpbWVFeGNlcHRpb24MANgADQEAD3ByaW50U3RhY2tUcmFjZQsAiADaDADbANwBAAdoYXNOZXh0AQADKClaCADeAQAqPGgxPlByb3ZpZGVyIG5hbWVzIHVzZWQgaW4gcmVwb3NpdG9yeTwvaDE+CQABAOAMAOEABgEAA0VPTAoAWgDjDADkAGsBAAV3cml0ZQgA5gEAITxwPlJlcG9zaXRvcnkgKCdyZXBvVVJMVG9UZXN0Jyk6IAoAAQDoDADpAFIBABBnZXRSZXBvVVJMVG9UZXN0CADrAQAEPC9wPggA7QEAPTxoMj5NYWpvcjogbWlzc2luZyBvciAocHJvYmFibHkpIGluY29ycmVjdCBwcm92aWRlciBuYW1lPC9oMj4KAAEA7wwA8ADxAQAScHJpbnRMaW5lc1Byb3ZpZGVyAQAnKExqYXZhL2lvL0ZpbGVXcml0ZXI7TGphdmEvdXRpbC9MaXN0OylWCADzAQBEPGgyPkluZGV0ZXJtaW5hdGU6IG1heWJlIGNvcnJlY3QsIG1heWJlIGluY29ycmVjdCBwcm92aWRlciBuYW1lPC9oMj4IAPUBADc8aDI+TWlub3IgcHJvYmxlbSBvZiB1c2luZyBvbGQgc3R5bGUgcHJvdmlkZXIgbmFtZTwvaDI+CAD3AQAtPGgyPlByb2JhYmx5IHVzaW5nIGNvcnJlY3QgcHJvdmlkZXIgbmFtZTwvaDI+CwCnAPkMAPoA+wEABHNpemUBAAMoKUkKAFoA/QwA/gANAQAFY2xvc2UKAEgA1wEABmFsbElVcwEAK0xvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdDsBAA1vdXRmaWxlV3JpdGVyAQAUTGphdmEvaW8vRmlsZVdyaXRlcjsBAAdvdXRmaWxlAQAOTGphdmEvaW8vRmlsZTsBABVpbmNvcnJlY3RQcm92aWRlck5hbWUBABBMamF2YS91dGlsL0xpc3Q7AQATY29ycmVjdFByb3ZpZGVyTmFtZQEAGGluY29ycmVjdE9sZFByb3ZpZGVyTmFtZQEAE3Vua25vd25Qcm92aWRlck5hbWUBAAt0ZXN0RGlyTmFtZQEAAml1AQAyTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDsBAAppc0NhdGVnb3J5AQABWgEACmlzRnJhZ21lbnQBAAxwcm92aWRlck5hbWUBAAFlAQAcTGphdmEvbGFuZy9SdW50aW1lRXhjZXB0aW9uOwEAFUxqYXZhL2lvL0lPRXhjZXB0aW9uOwEAFkxvY2FsVmFyaWFibGVUeXBlVGFibGUBAF9Mb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ8TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDs+OwEARExqYXZhL3V0aWwvTGlzdDxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47AQARdGVzdFByb3ZpZGVyTmFtZXMHARoBABtqYXZhL25ldC9VUklTeW50YXhFeGNlcHRpb24HARwBAC5vcmcvZWNsaXBzZS9lcXVpbm94L3AyL2NvcmUvUHJvdmlzaW9uRXhjZXB0aW9uBwEeAQAzb3JnL2VjbGlwc2UvY29yZS9ydW50aW1lL09wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uCgABASAMASEBIgEACWdldEFsbElVcwEALSgpTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcXVlcnkvSVF1ZXJ5UmVzdWx0OwoAAQEkDABFAEYBAAZyZXN1bHQBAAFpAQABSQEAWyhMamF2YS9pby9GaWxlV3JpdGVyO0xqYXZhL3V0aWwvTGlzdDxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47KVYHASoBACtvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL0lVSWRDb21wYXJhdG9yCgEpABAKAS0BLwcBLgEAFWphdmEvdXRpbC9Db2xsZWN0aW9ucwwBMAExAQAEc29ydAEAKShMamF2YS91dGlsL0xpc3Q7TGphdmEvdXRpbC9Db21wYXJhdG9yOylWCAEzAQAKPHA+Q291bnQ6IAoAZQE1DABxATYBABwoSSlMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CAE4AQAEPG9sPgsApwCECgABATsMATwBPQEAEXByaW50TGluZUxpc3RJdGVtAQBbKExqYXZhL2lvL0ZpbGVXcml0ZXI7TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDtMamF2YS9sYW5nL1N0cmluZzspVggBPwEABTwvb2w+AQAGaXVMaXN0AQAWY29tcGFyYXRvclByb3ZpZGVyTmFtZQEAFkxqYXZhL3V0aWwvQ29tcGFyYXRvcjsBAEtMamF2YS91dGlsL0NvbXBhcmF0b3I8LUxvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7PjsBAApTb3VyY2VGaWxlAQAYUHJvdmlkZXJOYW1lQ2hlY2tlci5qYXZhACEA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ALYBNLIA37YAb7YAc7YA4iu7AGVZEwE3twBpsgDftgBvtgBztgDiLLkBOQEAOgWnABgZBbkAhwEAwACNOgQqKxkEEqG2AToZBbkA2QEAmv/kK7sAZVkTAT63AGmyAN+2AG+2AHO2AOKxAAAAAwBBAAAAJgAJAAAAhAAIAIUADQCGAC0AhwBEAIkAWwCKAGQAiQBuAIwAhQCNAEIAAAA0AAUAAACGAEMARAAAAAAAhgBjAQMAAQAAAIYBQAEHAAIACAB+AUEBQgADAFsACQEMAQ0ABAEVAAAAFgACAAAAhgFAARcAAgAIAH4BQQFDAAMAAQFEAAAAAgFFUEsDBAoAAAAAADGgCT/5W+CrvR0AAL0dAAA1AAAAb3JnL2VjbGlwc2UvanVuby90ZXN0cy9yZXBvcy9Qcm92aWRlck5hbWVDaGVja2VyLmphdmFwYWNrYWdlIG9yZy5lY2xpcHNlLmp1bm8udGVzdHMucmVwb3M7CgppbXBvcnQgamF2YS5pby5GaWxlOwppbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwppbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CmltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKaW1wb3J0IGphdmEudXRpbC5MaXN0OwoKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247CmltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7CmltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnF1ZXJ5LklRdWVyeVJlc3VsdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmp1bm8udGVzdHMucmVwb3MuVGVzdFJlcG87CmltcG9ydCBvcmcuZWNsaXBzZS5qdW5vLnRlc3RzLnV0aWxzLklVSWRDb21wYXJhdG9yOwoKcHVibGljIGNsYXNzIFByb3ZpZGVyTmFtZUNoZWNrZXIgZXh0ZW5kcyBUZXN0UmVwbyB7CiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0xEX1BST1ZJREVSX05BTUUgICAgICAgPSAiRWNsaXBzZS5vcmciOwogICAgcHJpdmF0ZSBTdHJpbmdbXSAgICAgICAgICAgIEVYUEVDVEVEX1BST1ZJREVSX05BTUVTID0geyJFY2xpcHNlIEVxdWlub3ggUHJvamVjdCIsICJFY2xpcHNlIFBUUCIsICJFY2xpcHNlIE9yYml0IiwgIkVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIiwgIkVjbGlwc2UgQ0RUIiwgIkVjbGlwc2UgQWdlbnQgTW9kZWxpbmcgUGxhdGZvcm0iLCAiRWNsaXBzZSBCSVJUIFByb2plY3QiLCAiRWNsaXBzZSBEYXRhIFRvb2xzIFBsYXRmb3JtIiwgIkVjbGlwc2UgTW9kZWxpbmcgUHJvamVjdCIsICJFY2xpcHNlIE15bHluIiwgIkVjbGlwc2UgTWVtb3J5IEFuYWx5emVyIiwgIkVjbGlwc2UgTGludXggVG9vbHMiLCAiRWNsaXBzZSBKdWJ1bGEiLCAiRWNsaXBzZSBKZXR0eSBQcm9qZWN0IiwgIkVjbGlwc2UgR3lyZXgiLCAiRWNsaXBzZSBFR2l0IiwgIkVjbGlwc2UgSkdpdCIsICJFY2xpcHNlIEFnZW50IE1vZGVsaW5nIFByb2plY3QiLCAiRWNsaXBzZSBQYWNrYWdpbmcgUHJvamVjdCIsICJFY2xpcHNlIFNjb3V0IFByb2plY3QiLCAiRWNsaXBzZSBTZXF1b3lhaCIsICJFY2xpcHNlIFRNIFByb2plY3QifTsKCiAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tQcm92aWRlck5hbWVzKElRdWVyeVJlc3VsdDxJSW5zdGFsbGFibGVVbml0PiBhbGxJVXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgRmlsZVdyaXRlciBvdXRmaWxlV3JpdGVyID0gbnVsbDsKICAgICAgICBGaWxlIG91dGZpbGUgPSBudWxsOwogICAgICAgIExpc3Q8SUluc3RhbGxhYmxlVW5pdD4gaW5jb3JyZWN0UHJvdmlkZXJOYW1lID0gbmV3IEFycmF5TGlzdDxJSW5zdGFsbGFibGVVbml0PigpOwogICAgICAgIExpc3Q8SUluc3RhbGxhYmxlVW5pdD4gY29ycmVjdFByb3ZpZGVyTmFtZSA9IG5ldyBBcnJheUxpc3Q8SUluc3RhbGxhYmxlVW5pdD4oKTsKICAgICAgICBMaXN0PElJbnN0YWxsYWJsZVVuaXQ+IGluY29ycmVjdE9sZFByb3ZpZGVyTmFtZSA9IG5ldyBBcnJheUxpc3Q8SUluc3RhbGxhYmxlVW5pdD4oKTsKICAgICAgICBMaXN0PElJbnN0YWxsYWJsZVVuaXQ+IHVua25vd25Qcm92aWRlck5hbWUgPSBuZXcgQXJyYXlMaXN0PElJbnN0YWxsYWJsZVVuaXQ+KCk7CiAgICAgICAgU3RyaW5nIHRlc3REaXJOYW1lID0gZ2V0T3V0cHV0RGlyZWN0b3J5KCk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgb3V0ZmlsZSA9IG5ldyBGaWxlKHRlc3REaXJOYW1lLCAicHJvdmlkZXJOYW1lcy5odG1sIik7CiAgICAgICAgICAgIG91dGZpbGVXcml0ZXIgPSBuZXcgRmlsZVdyaXRlcihvdXRmaWxlKTsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJvdXRwdXQ6ICIgKyBvdXRmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKICAgICAgICAgICAgZm9yIChJSW5zdGFsbGFibGVVbml0IGl1IDogYWxsSVVzLnRvVW5tb2RpZmlhYmxlU2V0KCkpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGNhdGVnb3JpZXMKICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQ2F0ZWdvcnkgPSAidHJ1ZSIuZXF1YWxzKGl1LmdldFByb3BlcnR5KCJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnR5cGUuY2F0ZWdvcnkiKSk7CiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIGV4Y2x1ZGUgZnJhZ21lbnRzPwogICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNGcmFnbWVudCA9ICJ0cnVlIi5lcXVhbHMoaXUuZ2V0UHJvcGVydHkoIm9yZy5lY2xpcHNlLmVxdWlub3gucDIudHlwZS5mcmFnbWVudCIpKTsKCgogICAgICAgICAgICAgICAgICAgIC8vfHwgaXUuZ2V0SWQoKS5lbmRzV2l0aCgiZmVhdHVyZS5ncm91cCIpCiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0NhdGVnb3J5ICYmICFpc1NwZWNpYWwoaXUpICYmICFpc0ZyYWdtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm92aWRlck5hbWUgPSBpdS5nZXRQcm9wZXJ0eShJSW5zdGFsbGFibGVVbml0LlBST1BfUFJPVklERVIsIG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvdmlkZXJOYW1lID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29ycmVjdFByb3ZpZGVyTmFtZS5hZGQoaXUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbW1vbiBlcnJvcnMgYW5kIG1pc3NwZWxsaW5ncwogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwcm92aWRlck5hbWUuc3RhcnRzV2l0aCgiJSIpIHx8IHByb3ZpZGVyTmFtZS5lcXVhbHMoIkVjbGlwc2UiKSB8fCBwcm92aWRlck5hbWUuc3RhcnRzV2l0aCgiZWNsaXBzZS5vcmciKSB8fCBwcm92aWRlck5hbWUuc3RhcnRzV2l0aCgiVEhBTEVTR1JPVVAiKSB8fCBwcm92aWRlck5hbWUuc3RhcnRzV2l0aCgiSU5SSUEiKSB8fCBwcm92aWRlck5hbWUuc3RhcnRzV2l0aCgiRW5naW5lZXJpbmciKSB8fCBwcm92aWRlck5hbWUuY29udGFpbnMoIm9yZy5lY2xpcHNlLmp3dCIpIHx8IHByb3ZpZGVyTmFtZS5jb250YWlucygid3d3LmV4YW1wbGUub3JnIikgfHwgcHJvdmlkZXJOYW1lLmNvbnRhaW5zKCJ3d3cuZWNsaXBzZS5vcmciKSB8fCBwcm92aWRlck5hbWUuY29udGFpbnMoIlByb3ZpZGVyIikgfHwgcHJvdmlkZXJOYW1lLmNvbnRhaW5zKCJwcm92aWRlciIpIHx8IHByb3ZpZGVyTmFtZS5zdGFydHNXaXRoKCJCdW5kbGUtIikgfHwgcHJvdmlkZXJOYW1lLnN0YXJ0c1dpdGgoImJ1bmQiKSB8fCBwcm92aWRlck5hbWUuc3RhcnRzV2l0aCgiRWNsaXNwZSIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvcnJlY3RQcm92aWRlck5hbWUuYWRkKGl1KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwcm92aWRlck5hbWUuc3RhcnRzV2l0aCgiRWNsaXBzZS5vcmcgLSAiKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVjdFByb3ZpZGVyTmFtZS5hZGQoaXUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGluTGlzdE9mRXhwZWN0ZWROYW1lKHByb3ZpZGVyTmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlY3RQcm92aWRlck5hbWUuYWRkKGl1KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChPTERfUFJPVklERVJfTkFNRS5lcXVhbHMocHJvdmlkZXJOYW1lKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb3JyZWN0T2xkUHJvdmlkZXJOYW1lLmFkZChpdSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3JkZXIgaXMgaW1wb3J0YW50LCBzdGFydHMgd2l0aCBFY2xpcHNlLCBidXQgbm90IG9uZSBvZiB0aGUgYWJvdmUgZS5nLiAiRWNsaXBzZSBPcmJpdCIgb3IgIkVjbGlwc2Uub3JnIj8gCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGV2ZW50dWFsbHkgcHV0IGluIHdpdGggImluY29ycmVjdD8iCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHByb3ZpZGVyTmFtZS5zdGFydHNXaXRoKCJFY2xpcHNlIikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd25Qcm92aWRlck5hbWUuYWRkKGl1KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd25Qcm92aWRlck5hbWUuYWRkKGl1KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlcmltZW50IHRvIGZpbmQgY29uZmlncyBhbmQgY2F0ZWdvcmllcwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm92aWRlck5hbWUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50QWxsUHJvcGVydGllcyhvdXRmaWxlV3JpdGVyLCBpdSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG91dGZpbGVXcml0ZXIud3JpdGUoIjxoMT5Qcm92aWRlciBuYW1lcyB1c2VkIGluIHJlcG9zaXRvcnk8L2gxPiIgKyBFT0wpOwogICAgICAgICAgICBvdXRmaWxlV3JpdGVyLndyaXRlKCI8cD5SZXBvc2l0b3J5ICgncmVwb1VSTFRvVGVzdCcpOiAiICsgZ2V0UmVwb1VSTFRvVGVzdCgpICsgIjwvcD4iICsgRU9MKTsKICAgICAgICAgICAgb3V0ZmlsZVdyaXRlci53cml0ZSgiPGgyPk1ham9yOiBtaXNzaW5nIG9yIChwcm9iYWJseSkgaW5jb3JyZWN0IHByb3ZpZGVyIG5hbWU8L2gyPiIgKyBFT0wpOwogICAgICAgICAgICBwcmludExpbmVzUHJvdmlkZXIob3V0ZmlsZVdyaXRlciwgaW5jb3JyZWN0UHJvdmlkZXJOYW1lKTsKICAgICAgICAgICAgb3V0ZmlsZVdyaXRlci53cml0ZSgiPGgyPkluZGV0ZXJtaW5hdGU6IG1heWJlIGNvcnJlY3QsIG1heWJlIGluY29ycmVjdCBwcm92aWRlciBuYW1lPC9oMj4iICsgRU9MKTsKICAgICAgICAgICAgcHJpbnRMaW5lc1Byb3ZpZGVyKG91dGZpbGVXcml0ZXIsIHVua25vd25Qcm92aWRlck5hbWUpOwogICAgICAgICAgICBvdXRmaWxlV3JpdGVyLndyaXRlKCI8aDI+TWlub3IgcHJvYmxlbSBvZiB1c2luZyBvbGQgc3R5bGUgcHJvdmlkZXIgbmFtZTwvaDI+IiArIEVPTCk7CiAgICAgICAgICAgIHByaW50TGluZXNQcm92aWRlcihvdXRmaWxlV3JpdGVyLCBpbmNvcnJlY3RPbGRQcm92aWRlck5hbWUpOwogICAgICAgICAgICBvdXRmaWxlV3JpdGVyLndyaXRlKCI8aDI+UHJvYmFibHkgdXNpbmcgY29ycmVjdCBwcm92aWRlciBuYW1lPC9oMj4iICsgRU9MKTsKICAgICAgICAgICAgcHJpbnRMaW5lc1Byb3ZpZGVyKG91dGZpbGVXcml0ZXIsIGNvcnJlY3RQcm92aWRlck5hbWUpOwoKICAgICAgICAgICAgLy8gICAgICAgICAgICBpZiAoaW5jb3JyZWN0UHJvdmlkZXJOYW1lLnNpemUoKSA+IDApIHsKICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgZmFpbCgiRXJyb3JzIGluIG5hbWluZyBvciBsb2NhbGl6YXRpb24uIEZvciBsaXN0LCBzZWUgIiArIG91dGZpbGUuZ2V0TmFtZSgpKTsKICAgICAgICAgICAgLy8gICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBpbmNvcnJlY3RQcm92aWRlck5hbWUuc2l6ZSgpID4gMDsKICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIGlmIChvdXRmaWxlV3JpdGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgb3V0ZmlsZVdyaXRlci5jbG9zZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyB3b3VsZCBiZSB3ZWlyZAogICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcHVibGljIGJvb2xlYW4gdGVzdFByb3ZpZGVyTmFtZXMoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uLCBQcm92aXNpb25FeGNlcHRpb24sIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAgICAgICAgSVF1ZXJ5UmVzdWx0PElJbnN0YWxsYWJsZVVuaXQ+IGFsbElVcyA9IGdldEFsbElVcygpOwogICAgICAgIHJldHVybiBjaGVja1Byb3ZpZGVyTmFtZXMoYWxsSVVzKTsKICAgIH0KCiAgICBwcml2YXRlIGJvb2xlYW4gaW5MaXN0T2ZFeHBlY3RlZE5hbWUoU3RyaW5nIHByb3ZpZGVyTmFtZSkgewogICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBFWFBFQ1RFRF9QUk9WSURFUl9OQU1FUy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBpZiAoRVhQRUNURURfUFJPVklERVJfTkFNRVNbaV0uZXF1YWxzKHByb3ZpZGVyTmFtZSkpIHsKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwoKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgcHJpbnRMaW5lc1Byb3ZpZGVyKEZpbGVXcml0ZXIgb3V0LCBMaXN0PElJbnN0YWxsYWJsZVVuaXQ+IGl1TGlzdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAvLyBDb21wYXJhdG9yPD8gc3VwZXIgSUluc3RhbGxhYmxlVW5pdD4gY29tcGFyYXRvclByb3ZpZGVyTmFtZSA9IG5ldyBJVVByb3ZpZGVyQW5kSWRDb21wYXJhdG9yKCk7CiAgICAgICAgQ29tcGFyYXRvcjw/IHN1cGVyIElJbnN0YWxsYWJsZVVuaXQ+IGNvbXBhcmF0b3JQcm92aWRlck5hbWUgPSBuZXcgSVVJZENvbXBhcmF0b3IoKTsKICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGl1TGlzdCwgY29tcGFyYXRvclByb3ZpZGVyTmFtZSk7CiAgICAgICAgb3V0LndyaXRlKCI8cD5Db3VudDogIiArIGl1TGlzdC5zaXplKCkgKyBFT0wpOwogICAgICAgIG91dC53cml0ZSgiPG9sPiIgKyBFT0wpOwoKICAgICAgICBmb3IgKElJbnN0YWxsYWJsZVVuaXQgaXUgOiBpdUxpc3QpIHsKICAgICAgICAgICAgcHJpbnRMaW5lTGlzdEl0ZW0ob3V0LCBpdSwgSUluc3RhbGxhYmxlVW5pdC5QUk9QX1BST1ZJREVSKTsKICAgICAgICB9CiAgICAgICAgb3V0LndyaXRlKCI8L29sPiIgKyBFT0wpOwogICAgfQp9ClBLAwQKAAAAAABvWAo/BZWfvpM2AACTNgAAQAAAAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvcmVwb3MvRmVhdHVyZURpc3BsYXlhYmxlRGF0YUNoZWNrZXIuY2xhc3PK/rq+AAAAMQGiBwACAQA6b3JnL2VjbGlwc2UvanVuby90ZXN0cy9yZXBvcy9GZWF0dXJlRGlzcGxheWFibGVEYXRhQ2hlY2tlcgcABAEAJW9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvcmVwb3MvVGVzdFJlcG8BACFTVEFOREFSRF9MSUNFTlNFU19QUk9QRVJUSUVTX0ZJTEUBABJMamF2YS9sYW5nL1N0cmluZzsBAAg8Y2xpbml0PgEAAygpVgEABENvZGUIAAsBABtzdGFuZGFyZExpY2Vuc2VzLnByb3BlcnRpZXMJAAEADQwABQAGAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAGPGluaXQ+CgADABIMABAACAEABHRoaXMBADxMb3JnL2VjbGlwc2UvanVuby90ZXN0cy9yZXBvcy9GZWF0dXJlRGlzcGxheWFibGVEYXRhQ2hlY2tlcjsBABdjaGVja0xpY2Vuc2VDb25zaXN0ZW5jeQEALihMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ7KVoBAApFeGNlcHRpb25zBwAZAQATamF2YS9pby9JT0V4Y2VwdGlvbgEACVNpZ25hdHVyZQEAYihMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ8TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDs+OylaBwAdAQAUamF2YS91dGlsL1Byb3BlcnRpZXMKABwAEgoAIAAiBwAhAQAQamF2YS9sYW5nL09iamVjdAwAIwAkAQAIZ2V0Q2xhc3MBABMoKUxqYXZhL2xhbmcvQ2xhc3M7CgAmACgHACcBAA9qYXZhL2xhbmcvQ2xhc3MMACkAKgEAE2dldFJlc291cmNlQXNTdHJlYW0BACkoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2lvL0lucHV0U3RyZWFtOwoAHAAsDAAtAC4BAARsb2FkAQAYKExqYXZhL2lvL0lucHV0U3RyZWFtOylWCAAwAQALbGljZW5zZTIwMTEKABwAMgwAMwA0AQALZ2V0UHJvcGVydHkBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwgANgEAC2xpY2Vuc2UyMDEwBwA4AQAwb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9MaWNlbnNlCgA3ADoMABAAOwEANShMamF2YS9uZXQvVVJJO0xqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylWBwA9AQATamF2YS91dGlsL0FycmF5TGlzdAoAPAASCgABAEAMAEEAQgEADWNoZWNrTGljZW5zZXMBANIoTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUxpY2Vuc2U7TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUxpY2Vuc2U7TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcXVlcnkvSVF1ZXJ5UmVzdWx0O0xqYXZhL3V0aWwvTGlzdDtMamF2YS91dGlsL0xpc3Q7TGphdmEvdXRpbC9MaXN0O0xqYXZhL3V0aWwvTGlzdDtMamF2YS91dGlsL0xpc3Q7KVYKAAEARAwARQBGAQAScHJpbnRSZXBvcnRMaWNlbnNlAQBTKExqYXZhL3V0aWwvTGlzdDtMamF2YS91dGlsL0xpc3Q7TGphdmEvdXRpbC9MaXN0O0xqYXZhL3V0aWwvTGlzdDtMamF2YS91dGlsL0xpc3Q7KVYLAEgASgcASQEADmphdmEvdXRpbC9MaXN0DABLAEwBAARzaXplAQADKClJAQALYWxsRmVhdHVyZXMBACtMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ7AQAGcmVzdWx0AQABWgEACnByb3BlcnRpZXMBABZMamF2YS91dGlsL1Byb3BlcnRpZXM7AQAIaW5TdHJlYW0BABVMamF2YS9pby9JbnB1dFN0cmVhbTsBAAhib2R5MjAxMQEACGJvZHkyMDEwAQATc3RhbmRhcmRMaWNlbnNlMjAxMQEAKkxvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lMaWNlbnNlOwEAE3N0YW5kYXJkTGljZW5zZTIwMTABAAlub0xpY2Vuc2UBABBMamF2YS91dGlsL0xpc3Q7AQAMZXh0cmFMaWNlbnNlAQALZ29vZExpY2Vuc2UBAApvbGRMaWNlbnNlAQAKYmFkTGljZW5zZQEAFkxvY2FsVmFyaWFibGVUeXBlVGFibGUBAF9Mb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ8TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDs+OwEARExqYXZhL3V0aWwvTGlzdDxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47AQIKKExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lMaWNlbnNlO0xvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lMaWNlbnNlO0xvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdDxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47TGphdmEvdXRpbC9MaXN0PExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7PjtMamF2YS91dGlsL0xpc3Q8TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDs+O0xqYXZhL3V0aWwvTGlzdDxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47TGphdmEvdXRpbC9MaXN0PExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7PjtMamF2YS91dGlsL0xpc3Q8TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDs+OylWCQBlAGcHAGYBABBqYXZhL2xhbmcvU3lzdGVtDABoAGkBAANvdXQBABVMamF2YS9pby9QcmludFN0cmVhbTsHAGsBABdqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcggAbQEAJE51bWJlciBvZiBJVXMgZHVyaW5nIGxpY2Vuc2UgY2hlY2s6IAoAagBvDAAQAHABABUoTGphdmEvbGFuZy9TdHJpbmc7KVYLAHIAdAcAcwEAKW9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcXVlcnkvSVF1ZXJ5UmVzdWx0DAB1AHYBABF0b1VubW9kaWZpYWJsZVNldAEAESgpTGphdmEvdXRpbC9TZXQ7CwB4AEoHAHkBAA1qYXZhL3V0aWwvU2V0CgBqAHsMAHwAfQEABmFwcGVuZAEAHChJKUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsKAGoAfwwAgACBAQAIdG9TdHJpbmcBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwoAgwCFBwCEAQATamF2YS9pby9QcmludFN0cmVhbQwAhgBwAQAHcHJpbnRsbgsAeACIDACJAIoBAAhpdGVyYXRvcgEAFigpTGphdmEvdXRpbC9JdGVyYXRvcjsLAIwAjgcAjQEAEmphdmEvdXRpbC9JdGVyYXRvcgwAjwCQAQAEbmV4dAEAFCgpTGphdmEvbGFuZy9PYmplY3Q7BwCSAQAwb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0CwCRAJQMAJUAgQEABWdldElkCACXAQAOLmZlYXR1cmUuZ3JvdXAKAJkAmwcAmgEAEGphdmEvbGFuZy9TdHJpbmcMAJwAnQEACGVuZHNXaXRoAQAVKExqYXZhL2xhbmcvU3RyaW5nOylaCwCRAJ8MAKAAoQEAC2dldExpY2Vuc2VzAQAqKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS91dGlsL0NvbGxlY3Rpb247CwCjAKUHAKQBABRqYXZhL3V0aWwvQ29sbGVjdGlvbgwApgCnAQAHaXNFbXB0eQEAAygpWgsASACpDACqAKsBAANhZGQBABUoTGphdmEvbGFuZy9PYmplY3Q7KVoLAKMASgsAowCIBwCvAQAob3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JTGljZW5zZQsArgCxDACyAIEBAAdnZXRVVUlECgCZALQMALUAqwEABmVxdWFscwsAjAC3DAC4AKcBAAdoYXNOZXh0CAC6AQAmTnVtYmVyIGZlYXR1cmVzIGR1cmluZyBsaWNlbnNlIGNoZWNrOiAIALwBAClOdW1iZXIgbm9uLWZlYXR1ZXMgZHVyaW5nIGxpY2Vuc2UgY2hlY2s6IAEAE3BsYXRmb3JtTGljZW5zZTIwMTEBABNwbGF0Zm9ybUxpY2Vuc2UyMDEwAQAJbkZlYXR1cmVzAQABSQEADG5Ob25GZWF0dXJlcwEAB2ZlYXR1cmUBADJMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0OwEACGxpY2Vuc2VzAQAWTGphdmEvdXRpbC9Db2xsZWN0aW9uOwEADmZlYXR1cmVMaWNlbnNlAQBCTGphdmEvdXRpbC9Db2xsZWN0aW9uPExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lMaWNlbnNlOz47AQFXKExqYXZhL3V0aWwvTGlzdDxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47TGphdmEvdXRpbC9MaXN0PExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7PjtMamF2YS91dGlsL0xpc3Q8TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDs+O0xqYXZhL3V0aWwvTGlzdDxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47TGphdmEvdXRpbC9MaXN0PExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7PjspVggAygEAHTxiciAvPj09PT09PT09PT09PT09PT09PT09PT09CgABAMwMAM0AgQEAEmdldE91dHB1dERpcmVjdG9yeQcAzwEADGphdmEvaW8vRmlsZQgA0QEAF2xpY2Vuc2VDb25zaXN0ZW5jeS5odG1sCgDOANMMABAA1AEAJyhMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspVgcA1gEAEmphdmEvaW8vRmlsZVdyaXRlcgoA1QDYDAAQANkBABEoTGphdmEvaW8vRmlsZTspVggA2wEACG91dHB1dDogCgDOAN0MAN4AgQEAD2dldEFic29sdXRlUGF0aAoAagDgDAB8AOEBAC0oTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsIAOMBACE8cD5SZXBvc2l0b3J5ICgncmVwb1VSTFRvVGVzdCcpOiAKAAEA5QwA5gCBAQAQZ2V0UmVwb1VSTFRvVGVzdAgA6AEABDwvcD4JAAEA6gwA6wAGAQADRU9MCgABAO0MAIYA7gEAKShMamF2YS9pby9GaWxlV3JpdGVyO0xqYXZhL2xhbmcvU3RyaW5nOylWCADwAQAoPGJyIC8+PGJyIC8+TGljZW5zZSBDb25zaXN0ZW5jeSBTdW1tYXJ5OggA8gEAKUZlYXR1cmVzIHdpdGggY29uZm9ybWluZyAoMjAxMSkgbGljZW5zZTogCAD0AQAiRmVhdHVyZXMgd2l0aCBvbGQgKDIwMTApIGxpY2Vuc2U6IAgA9gEAIUZlYXR1cmVzIHdpdGggZGlmZmVyZW50IGxpY2Vuc2U6IAgA+AEAGkZlYXR1cmVzIHdpdGggbm8gbGljZW5zZTogCAD6AQAeRmVhdHVyZXMgd2l0aCBleHRyYSBsaWNlbnNlczogCAD8AQAXPT09PT09PT09PT09PT09PT09PT09PT0IAP4BABQ8YnIgLz48YnIgLz5EZXRhaWxzOggBAAEAGUZlYXR1cmVzIHdpdGggbm8gbGljZW5zZToHAQIBACtvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL0lVSWRDb21wYXJhdG9yCgEBABIKAQUBBwcBBgEAFWphdmEvdXRpbC9Db2xsZWN0aW9ucwwBCAEJAQAEc29ydAEAKShMamF2YS91dGlsL0xpc3Q7TGphdmEvdXRpbC9Db21wYXJhdG9yOylWCwBIAIgIAQwBACw8YnIgLz48YnIgLz5GZWF0dXJlcyB3aXRoIGRpZmZlcmVudCBsaWNlbnNlOggBDgEALTxiciAvPjxiciAvPkZlYXR1cmVzIHdpdGggb2xkICgyMDEwKSBsaWNlbnNlOggBEAEAMjxiciAvPjxiciAvPkZlYXR1cmVzIHdpdGggbWF0Y2hpbmcgKDIwMTEpIGxpY2Vuc2U6CgAYARIMARMACAEAD3ByaW50U3RhY2tUcmFjZQoA1QEVDAEWAAgBAAVjbG9zZQEABlNQQUNFUgEADW91dGZpbGVXcml0ZXIBABRMamF2YS9pby9GaWxlV3JpdGVyOwEAB291dGZpbGUBAA5MamF2YS9pby9GaWxlOwEAC3Rlc3REaXJOYW1lAQAEdW5pdAEAAWUBABVMamF2YS9pby9JT0V4Y2VwdGlvbjsBABN0ZXN0RGlzcGxheWFibGVEYXRhBwEiAQAbamF2YS9uZXQvVVJJU3ludGF4RXhjZXB0aW9uBwEkAQAub3JnL2VjbGlwc2UvZXF1aW5veC9wMi9jb3JlL1Byb3Zpc2lvbkV4Y2VwdGlvbgcBJgEAM29yZy9lY2xpcHNlL2NvcmUvcnVudGltZS9PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbgoAAQEoDAEpASoBAA5nZXRBbGxHcm91cElVcwEALSgpTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcXVlcnkvSVF1ZXJ5UmVzdWx0OwoAAQEsDAAVABYKAAEBLgwBLwAWAQAPY2hlY2tDb3B5cmlnaHRzCgABATEMATIAFgEAEWNoZWNrRGVzY3JpcHRpb25zAQAGYWxsSVVzCwCRATUMATYBNwEADGdldENvcHlyaWdodAEAQChMamF2YS9sYW5nL1N0cmluZzspTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUNvcHlyaWdodDsLATkBOwcBOgEAKm9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUNvcHlyaWdodAwBPACBAQAHZ2V0Qm9keQoAmQE+DAE/AEwBAAZsZW5ndGgIAUEBAAElCgCZAUMMAUQAnQEACnN0YXJ0c1dpdGgIAUYBAAFbCAFIAQAJQ29weXJpZ2h0CAFKAQANKGMpIENvcHlyaWdodAoAmQFMDAFNAU4BAAhjb250YWlucwEAGyhMamF2YS9sYW5nL0NoYXJTZXF1ZW5jZTspWggBUAEACWNvcHlyaWdodAoAAQFSDAFTAVQBABVwcmludFJlcG9ydENvcHlyaWdodHMBADMoTGphdmEvdXRpbC9MaXN0O0xqYXZhL3V0aWwvTGlzdDtMamF2YS91dGlsL0xpc3Q7KVYBABBub09yQmFkQ29weXJpZ2h0AQALb2tDb3B5cmlnaHQBABZpbmRldGVybWluYXRlQ29weXJpZ2h0AQAsTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUNvcHlyaWdodDsBAARib2R5CAFbAQAib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kZXNjcmlwdGlvbgsAkQFdDAAzAV4BADgoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwoAAQFgDAFhAWIBABZwcmludFJlcG9ydERlc2NyaXB0aW9uAQAjKExqYXZhL3V0aWwvTGlzdDtMamF2YS91dGlsL0xpc3Q7KVYBAAlub25lT3JCYWQBAAJvawEAC2Rlc2NyaXB0aW9uAQCLKExqYXZhL3V0aWwvTGlzdDxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47TGphdmEvdXRpbC9MaXN0PExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7PjspVggBaAEAEWRlc2NyaXB0aW9ucy5odG1sCAFqAQAfPGJyIC8+PGJyIC8+RGVzY3JpcHRpb24gUmVwb3J0OggBbAEALkZlYXR1cmVzIHdyb25nIG9yIHVuZXhwbGFpbmFibGUgZGVzY3JpcHRpb25zOiAIAW4BABtGZWF0dXJlcyBwcm9iYWJseSBjb3JyZWN0OiAIAXABAChGZWF0dXJlcyB3aXRoIG5vIG9yIGR1YmlvdXMgZGVzY3JpcGl0b246CgABAXIMAXMBdAEAFHByaW50TGluZURlc2NyaXB0aW9uAQBJKExqYXZhL2lvL0ZpbGVXcml0ZXI7TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDspVggBdgEAJzxiciAvPjxiciAvPkZlYXR1cmVzIHdpdGggZGVzY3JpcGl0b25zOgEAzyhMamF2YS91dGlsL0xpc3Q8TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDs+O0xqYXZhL3V0aWwvTGlzdDxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47TGphdmEvdXRpbC9MaXN0PExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7PjspVggBeQEAD2NvcHlyaWdodHMuaHRtbAgBewEAHTxiciAvPjxiciAvPkNvcHlyaWdodCBSZXBvcnQ6CAF9AQAsRmVhdHVyZXMgd3Jvbmcgb3IgdW5leHBsYWluYWJsZSBjb3B5cmlnaHRzOiAIAX8BADBGZWF0dXJlcyBtYXliZSB3cm9uZywgbWF5YmUgY29ycmVjdCBjb3B5cmlnaHRzOiAIAYEBADtGZWF0dXJlcyB3aXRoIG5vIG9yIHByb2JhYmx5IGluY29ycmVjdCBjb3B5cmlnaHQgc3RhdGVtZW50OgoAAQGDDAGEAXQBABJwcmludExpbmVDb3B5cmlnaHQIAYYBAGc8YnIgLz48YnIgLz5JbmRldGVybWluYW50OiBmZWF0dXJlJ3MgY29weXJpZ2h0IHRleHQgY29udGFpbnMgdGhlIHdvcmQgJ2NvcHlyaWdodCcgYnV0IG5vdCBhdCBiZWdpbm5pbmc6CAGIAQBYPGJyIC8+PGJyIC8+RmVhdHVyZXMgd2l0aCBjb3B5cmlnaHRzIHRoYXQgYXJlIHByb2JhYmx5IG9rIChpLmUuIHN0YXJ0IHdpdGggJ0NvcHlyaWdodCcpOgEABGdvb2QBAANiYWQBAAVtYXliZQsAkQGNDAGOAY8BAApnZXRWZXJzaW9uAQArKClMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9WZXJzaW9uOwoBkQB/BwGSAQAnb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9WZXJzaW9uCgCZAZQMAZUBlgEAB3ZhbHVlT2YBACYoTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvU3RyaW5nOwgBmAEACCAmbmJzcDsgCQABAZoMAZsABgEAAkJSAQACaXUBAAtjb3B5cmlnaHRJdQEABGl1SWQBAAlpdVZlcnNpb24BAApTb3VyY2VGaWxlAQAiRmVhdHVyZURpc3BsYXlhYmxlRGF0YUNoZWNrZXIuamF2YQAhAAEAAwAAAAEACgAFAAYAAAAMAAgABwAIAAEACQAAACoAAQAAAAAABhIKswAMsQAAAAIADgAAAAoAAgAAABkABQAYAA8AAAACAAAAAQAQAAgAAQAJAAAALwABAAEAAAAFKrcAEbEAAAACAA4AAAAGAAEAAAAYAA8AAAAMAAEAAAAFABMAFAAAAAIAFQAWAAMAFwAAAAQAAQAYABoAAAACABsA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LmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEuTGljZW5zZTsKaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247CmltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLklDb3B5cmlnaHQ7CmltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7CmltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLklMaWNlbnNlOwppbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5xdWVyeS5JUXVlcnlSZXN1bHQ7CmltcG9ydCBvcmcuZWNsaXBzZS5qdW5vLnRlc3RzLnJlcG9zLlRlc3RSZXBvOwppbXBvcnQgb3JnLmVjbGlwc2UuanVuby50ZXN0cy51dGlscy5JVUlkQ29tcGFyYXRvcjsKCnB1YmxpYyBjbGFzcyBGZWF0dXJlRGlzcGxheWFibGVEYXRhQ2hlY2tlciBleHRlbmRzIFRlc3RSZXBvIHsKICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBTVEFOREFSRF9MSUNFTlNFU19QUk9QRVJUSUVTX0ZJTEUgPSAic3RhbmRhcmRMaWNlbnNlcy5wcm9wZXJ0aWVzIjsKCiAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tMaWNlbnNlQ29uc2lzdGVuY3koSVF1ZXJ5UmVzdWx0PElJbnN0YWxsYWJsZVVuaXQ+IGFsbEZlYXR1cmVzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CiAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKCiAgICAgICAgSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShTVEFOREFSRF9MSUNFTlNFU19QUk9QRVJUSUVTX0ZJTEUpOwogICAgICAgIHByb3BlcnRpZXMubG9hZChpblN0cmVhbSk7CiAgICAgICAgU3RyaW5nIGJvZHkyMDExID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0eSgibGljZW5zZTIwMTEiKTsKICAgICAgICBTdHJpbmcgYm9keTIwMTAgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KCJsaWNlbnNlMjAxMCIpOwogICAgICAgIElMaWNlbnNlIHN0YW5kYXJkTGljZW5zZTIwMTEgPSBuZXcgTGljZW5zZShudWxsLCBib2R5MjAxMSwgbnVsbCk7CiAgICAgICAgSUxpY2Vuc2Ugc3RhbmRhcmRMaWNlbnNlMjAxMCA9IG5ldyBMaWNlbnNlKG51bGwsIGJvZHkyMDEwLCBudWxsKTsKCiAgICAgICAgTGlzdDxJSW5zdGFsbGFibGVVbml0PiBub0xpY2Vuc2UgPSBuZXcgQXJyYXlMaXN0PElJbnN0YWxsYWJsZVVuaXQ+KCk7CiAgICAgICAgTGlzdDxJSW5zdGFsbGFibGVVbml0PiBleHRyYUxpY2Vuc2UgPSBuZXcgQXJyYXlMaXN0PElJbnN0YWxsYWJsZVVuaXQ+KCk7CiAgICAgICAgTGlzdDxJSW5zdGFsbGFibGVVbml0PiBnb29kTGljZW5zZSA9IG5ldyBBcnJheUxpc3Q8SUluc3RhbGxhYmxlVW5pdD4oKTsKICAgICAgICBMaXN0PElJbnN0YWxsYWJsZVVuaXQ+IG9sZExpY2Vuc2UgPSBuZXcgQXJyYXlMaXN0PElJbnN0YWxsYWJsZVVuaXQ+KCk7CiAgICAgICAgTGlzdDxJSW5zdGFsbGFibGVVbml0PiBiYWRMaWNlbnNlID0gbmV3IEFycmF5TGlzdDxJSW5zdGFsbGFibGVVbml0PigpOwogICAgICAgIGNoZWNrTGljZW5zZXMoc3RhbmRhcmRMaWNlbnNlMjAxMSwgc3RhbmRhcmRMaWNlbnNlMjAxMCwgYWxsRmVhdHVyZXMsIGdvb2RMaWNlbnNlLCBvbGRMaWNlbnNlLCBiYWRMaWNlbnNlLCBub0xpY2Vuc2UsIGV4dHJhTGljZW5zZSk7CgogICAgICAgIHByaW50UmVwb3J0TGljZW5zZShnb29kTGljZW5zZSwgb2xkTGljZW5zZSwgYmFkTGljZW5zZSwgbm9MaWNlbnNlLCBleHRyYUxpY2Vuc2UpOwogICAgICAgIHJlc3VsdCA9ICgoYmFkTGljZW5zZS5zaXplKCkgPiAwKSB8fCAoZXh0cmFMaWNlbnNlLnNpemUoKSA+IDApIHx8IChub0xpY2Vuc2Uuc2l6ZSgpID4gMCkpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIGNoZWNrTGljZW5zZXMoSUxpY2Vuc2UgcGxhdGZvcm1MaWNlbnNlMjAxMSwgSUxpY2Vuc2UgcGxhdGZvcm1MaWNlbnNlMjAxMCwgSVF1ZXJ5UmVzdWx0PElJbnN0YWxsYWJsZVVuaXQ+IGFsbEZlYXR1cmVzLCBMaXN0PElJbnN0YWxsYWJsZVVuaXQ+IGdvb2RMaWNlbnNlLCBMaXN0PElJbnN0YWxsYWJsZVVuaXQ+IG9sZExpY2Vuc2UsIExpc3Q8SUluc3RhbGxhYmxlVW5pdD4gYmFkTGljZW5zZSwgTGlzdDxJSW5zdGFsbGFibGVVbml0PiBub0xpY2Vuc2UsIExpc3Q8SUluc3RhbGxhYmxlVW5pdD4gZXh0cmFMaWNlbnNlKSB7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJOdW1iZXIgb2YgSVVzIGR1cmluZyBsaWNlbnNlIGNoZWNrOiAiICsgYWxsRmVhdHVyZXMudG9Vbm1vZGlmaWFibGVTZXQoKS5zaXplKCkpOwogICAgICAgIGludCBuRmVhdHVyZXMgPSAwOwogICAgICAgIGludCBuTm9uRmVhdHVyZXMgPSAwOwogICAgICAgIGZvciAoSUluc3RhbGxhYmxlVW5pdCBmZWF0dXJlIDogYWxsRmVhdHVyZXMudG9Vbm1vZGlmaWFibGVTZXQoKSkgewogICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkZlYXR1cmUgSUQ6ICIgKyBmZWF0dXJlLmdldElkKCkpOwogICAgICAgICAgICAvLyBpZ25vcmUgSVVzIHRoYXQgYXJlIG5vdCBmZWF0dXJlcwogICAgICAgICAgICAvLyBUT0RPOiBidXQsIHdlIGdldCAiZ3JvdXBzIiAuLi4gd2hhdCBraW5kIG9mIGdyb3VwcyBhcmUgbm90IGZlYXR1cmUgZ3JvdXBzPyAKICAgICAgICAgICAgaWYgKGZlYXR1cmUuZ2V0SWQoKS5lbmRzV2l0aCgiLmZlYXR1cmUuZ3JvdXAiKSkgewogICAgICAgICAgICAgICAgbkZlYXR1cmVzKys7CiAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPElMaWNlbnNlPiBsaWNlbnNlcyA9IGZlYXR1cmUuZ2V0TGljZW5zZXMobnVsbCk7CiAgICAgICAgICAgICAgICBpZiAobGljZW5zZXMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgbm9MaWNlbnNlLmFkZChmZWF0dXJlKTsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChsaWNlbnNlcy5zaXplKCkgIT0gMSkgewogICAgICAgICAgICAgICAgICAgIGV4dHJhTGljZW5zZS5hZGQoZmVhdHVyZSk7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBJTGljZW5zZSBmZWF0dXJlTGljZW5zZSA9IGxpY2Vuc2VzLml0ZXJhdG9yKCkubmV4dCgpOwogICAgICAgICAgICAgICAgaWYgKHBsYXRmb3JtTGljZW5zZTIwMTAuZ2V0VVVJRCgpLmVxdWFscyhmZWF0dXJlTGljZW5zZS5nZXRVVUlEKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgb2xkTGljZW5zZS5hZGQoZmVhdHVyZSk7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAocGxhdGZvcm1MaWNlbnNlMjAxMS5nZXRVVUlEKCkuZXF1YWxzKGZlYXR1cmVMaWNlbnNlLmdldFVVSUQoKSkpIHsKICAgICAgICAgICAgICAgICAgICBnb29kTGljZW5zZS5hZGQoZmVhdHVyZSk7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBiYWRMaWNlbnNlLmFkZChmZWF0dXJlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG5Ob25GZWF0dXJlcysrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTnVtYmVyIGZlYXR1cmVzIGR1cmluZyBsaWNlbnNlIGNoZWNrOiAiICsgbkZlYXR1cmVzKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk51bWJlciBub24tZmVhdHVlcyBkdXJpbmcgbGljZW5zZSBjaGVjazogIiArIG5Ob25GZWF0dXJlcyk7CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIHByaW50UmVwb3J0TGljZW5zZShMaXN0PElJbnN0YWxsYWJsZVVuaXQ+IGdvb2RMaWNlbnNlLCBMaXN0PElJbnN0YWxsYWJsZVVuaXQ+IG9sZExpY2Vuc2UsIExpc3Q8SUluc3RhbGxhYmxlVW5pdD4gYmFkTGljZW5zZSwgTGlzdDxJSW5zdGFsbGFibGVVbml0PiBub0xpY2Vuc2UsIExpc3Q8SUluc3RhbGxhYmxlVW5pdD4gZXh0cmFMaWNlbnNlKSB7CiAgICAgICAgU3RyaW5nIFNQQUNFUiA9ICI8YnIgLz49PT09PT09PT09PT09PT09PT09PT09PSI7CgogICAgICAgIEZpbGVXcml0ZXIgb3V0ZmlsZVdyaXRlciA9IG51bGw7CiAgICAgICAgRmlsZSBvdXRmaWxlID0gbnVsbDsKICAgICAgICBTdHJpbmcgdGVzdERpck5hbWUgPSBnZXRPdXRwdXREaXJlY3RvcnkoKTsKICAgICAgICB0cnkgewogICAgICAgICAgICBvdXRmaWxlID0gbmV3IEZpbGUodGVzdERpck5hbWUsICJsaWNlbnNlQ29uc2lzdGVuY3kuaHRtbCIpOwogICAgICAgICAgICBvdXRmaWxlV3JpdGVyID0gbmV3IEZpbGVXcml0ZXIob3V0ZmlsZSk7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigib3V0cHV0OiAiICsgb3V0ZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgICAgIHByaW50bG4ob3V0ZmlsZVdyaXRlciwgIjxwPlJlcG9zaXRvcnkgKCdyZXBvVVJMVG9UZXN0Jyk6ICIgKyBnZXRSZXBvVVJMVG9UZXN0KCkgKyAiPC9wPiIgKyBFT0wpOwogICAgICAgICAgICBwcmludGxuKG91dGZpbGVXcml0ZXIsICI8YnIgLz48YnIgLz5MaWNlbnNlIENvbnNpc3RlbmN5IFN1bW1hcnk6IiArIFNQQUNFUik7CiAgICAgICAgICAgIHByaW50bG4ob3V0ZmlsZVdyaXRlciwgIkZlYXR1cmVzIHdpdGggY29uZm9ybWluZyAoMjAxMSkgbGljZW5zZTogIiArIGdvb2RMaWNlbnNlLnNpemUoKSk7CiAgICAgICAgICAgIHByaW50bG4ob3V0ZmlsZVdyaXRlciwgIkZlYXR1cmVzIHdpdGggb2xkICgyMDEwKSBsaWNlbnNlOiAiICsgb2xkTGljZW5zZS5zaXplKCkpOwogICAgICAgICAgICBwcmludGxuKG91dGZpbGVXcml0ZXIsICJGZWF0dXJlcyB3aXRoIGRpZmZlcmVudCBsaWNlbnNlOiAiICsgYmFkTGljZW5zZS5zaXplKCkpOwogICAgICAgICAgICBwcmludGxuKG91dGZpbGVXcml0ZXIsICJGZWF0dXJlcyB3aXRoIG5vIGxpY2Vuc2U6ICIgKyBub0xpY2Vuc2Uuc2l6ZSgpKTsKICAgICAgICAgICAgcHJpbnRsbihvdXRmaWxlV3JpdGVyLCAiRmVhdHVyZXMgd2l0aCBleHRyYSBsaWNlbnNlczogIiArIGV4dHJhTGljZW5zZS5zaXplKCkpOwogICAgICAgICAgICBwcmludGxuKG91dGZpbGVXcml0ZXIsICI9PT09PT09PT09PT09PT09PT09PT09PSIpOwoKICAgICAgICAgICAgcHJpbnRsbihvdXRmaWxlV3JpdGVyLCAiPGJyIC8+PGJyIC8+RGV0YWlsczoiICsgU1BBQ0VSKTsKCiAgICAgICAgICAgIHByaW50bG4ob3V0ZmlsZVdyaXRlciwgIkZlYXR1cmVzIHdpdGggbm8gbGljZW5zZToiICsgU1BBQ0VSKTsKICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChub0xpY2Vuc2UsIG5ldyBJVUlkQ29tcGFyYXRvcigpKTsKICAgICAgICAgICAgZm9yIChJSW5zdGFsbGFibGVVbml0IHVuaXQgOiBub0xpY2Vuc2UpIHsKICAgICAgICAgICAgICAgIHByaW50bG4ob3V0ZmlsZVdyaXRlciwgdW5pdC5nZXRJZCgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHJpbnRsbihvdXRmaWxlV3JpdGVyLCAiPGJyIC8+PGJyIC8+RmVhdHVyZXMgd2l0aCBkaWZmZXJlbnQgbGljZW5zZToiICsgU1BBQ0VSKTsKICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChiYWRMaWNlbnNlLCBuZXcgSVVJZENvbXBhcmF0b3IoKSk7CiAgICAgICAgICAgIGZvciAoSUluc3RhbGxhYmxlVW5pdCB1bml0IDogYmFkTGljZW5zZSkgewogICAgICAgICAgICAgICAgcHJpbnRsbihvdXRmaWxlV3JpdGVyLCB1bml0LmdldElkKCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHByaW50bG4ob3V0ZmlsZVdyaXRlciwgIjxiciAvPjxiciAvPkZlYXR1cmVzIHdpdGggb2xkICgyMDEwKSBsaWNlbnNlOiIgKyBTUEFDRVIpOwogICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KG9sZExpY2Vuc2UsIG5ldyBJVUlkQ29tcGFyYXRvcigpKTsKICAgICAgICAgICAgZm9yIChJSW5zdGFsbGFibGVVbml0IHVuaXQgOiBvbGRMaWNlbnNlKSB7CiAgICAgICAgICAgICAgICBwcmludGxuKG91dGZpbGVXcml0ZXIsIHVuaXQuZ2V0SWQoKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJpbnRsbihvdXRmaWxlV3JpdGVyLCAiPGJyIC8+PGJyIC8+RmVhdHVyZXMgd2l0aCBtYXRjaGluZyAoMjAxMSkgbGljZW5zZToiICsgU1BBQ0VSKTsKICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChnb29kTGljZW5zZSwgbmV3IElVSWRDb21wYXJhdG9yKCkpOwogICAgICAgICAgICBmb3IgKElJbnN0YWxsYWJsZVVuaXQgdW5pdCA6IGdvb2RMaWNlbnNlKSB7CiAgICAgICAgICAgICAgICBwcmludGxuKG91dGZpbGVXcml0ZXIsIHVuaXQuZ2V0SWQoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIGlmIChvdXRmaWxlV3JpdGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgb3V0ZmlsZVdyaXRlci5jbG9zZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyB3ZWlyZG5lc3MKICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vICAgICAgICBpZiAoKGJhZExpY2Vuc2Uuc2l6ZSgpID4gMCkgfHwgKGV4dHJhTGljZW5zZS5zaXplKCkgPiAwKSB8fCAobm9MaWNlbnNlLnNpemUoKSA+IDApKSB7CiAgICAgICAgLy8gICAgICAgICAgICBmYWlsKCJFcnJvcnMgaW4gbGljZW5zZSBjb25zaXN0ZW5jeS4gRm9yIGxpc3QsIHNlZSAiICsgb3V0ZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgLy8gICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgYm9vbGVhbiB0ZXN0RGlzcGxheWFibGVEYXRhKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiwgUHJvdmlzaW9uRXhjZXB0aW9uLCBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CiAgICAgICAgSVF1ZXJ5UmVzdWx0PElJbnN0YWxsYWJsZVVuaXQ+IGFsbElVcyA9IGdldEFsbEdyb3VwSVVzKCk7CiAgICAgICAgcmVzdWx0ID0gY2hlY2tMaWNlbnNlQ29uc2lzdGVuY3koYWxsSVVzKTsKICAgICAgICByZXN1bHQgPSByZXN1bHQgfCBjaGVja0NvcHlyaWdodHMoYWxsSVVzKTsKICAgICAgICByZXN1bHQgPSByZXN1bHQgfCBjaGVja0Rlc2NyaXB0aW9ucyhhbGxJVXMpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrQ29weXJpZ2h0cyhJUXVlcnlSZXN1bHQ8SUluc3RhbGxhYmxlVW5pdD4gYWxsRmVhdHVyZXMpIHsKICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwoKICAgICAgICBMaXN0PElJbnN0YWxsYWJsZVVuaXQ+IG5vT3JCYWRDb3B5cmlnaHQgPSBuZXcgQXJyYXlMaXN0PElJbnN0YWxsYWJsZVVuaXQ+KCk7CiAgICAgICAgTGlzdDxJSW5zdGFsbGFibGVVbml0PiBva0NvcHlyaWdodCA9IG5ldyBBcnJheUxpc3Q8SUluc3RhbGxhYmxlVW5pdD4oKTsKICAgICAgICBMaXN0PElJbnN0YWxsYWJsZVVuaXQ+IGluZGV0ZXJtaW5hdGVDb3B5cmlnaHQgPSBuZXcgQXJyYXlMaXN0PElJbnN0YWxsYWJsZVVuaXQ+KCk7CgogICAgICAgIGZvciAoSUluc3RhbGxhYmxlVW5pdCBmZWF0dXJlIDogYWxsRmVhdHVyZXMudG9Vbm1vZGlmaWFibGVTZXQoKSkgewogICAgICAgICAgICBpZiAoZmVhdHVyZS5nZXRJZCgpLmVuZHNXaXRoKCIuZmVhdHVyZS5ncm91cCIpKSB7CiAgICAgICAgICAgICAgICBJQ29weXJpZ2h0IGNvcHlyaWdodCA9IGZlYXR1cmUuZ2V0Q29weXJpZ2h0KG51bGwpOwogICAgICAgICAgICAgICAgaWYgKGNvcHlyaWdodCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgbm9PckJhZENvcHlyaWdodC5hZGQoZmVhdHVyZSk7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBTdHJpbmcgYm9keSA9IGNvcHlyaWdodC5nZXRCb2R5KCk7CiAgICAgICAgICAgICAgICBpZiAoKGJvZHkgPT0gbnVsbCkgfHwgKGJvZHkubGVuZ3RoKCkgPT0gMCkgfHwgYm9keS5zdGFydHNXaXRoKCIlIikgfHwgYm9keS5zdGFydHNXaXRoKCJbIikpIHsKICAgICAgICAgICAgICAgICAgICBub09yQmFkQ29weXJpZ2h0LmFkZChmZWF0dXJlKTsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoYm9keS5zdGFydHNXaXRoKCJDb3B5cmlnaHQiKSB8fCBib2R5LnN0YXJ0c1dpdGgoIihjKSBDb3B5cmlnaHQiKSkgewogICAgICAgICAgICAgICAgICAgIG9rQ29weXJpZ2h0LmFkZChmZWF0dXJlKTsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIHRoZSBvcmRlciBvZiB0aGVzZSB0ZXN0cyBjbGF1c2VzIG1hdHRlciwgb2J2b3VzbHkuIChDb21wYXJlIHdpdGggYWJvdmUgJ3N0YXJ0c1dpdGgnLikKICAgICAgICAgICAgICAgIGlmIChib2R5LmNvbnRhaW5zKCJDb3B5cmlnaHQiKSB8fCBib2R5LmNvbnRhaW5zKCJjb3B5cmlnaHQiKSkgewogICAgICAgICAgICAgICAgICAgIGluZGV0ZXJtaW5hdGVDb3B5cmlnaHQuYWRkKGZlYXR1cmUpOwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gZmFsbHRocm91Z2ggYXNzdW1lZCAiYmFkIgogICAgICAgICAgICAgICAgbm9PckJhZENvcHlyaWdodC5hZGQoZmVhdHVyZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgfQoKICAgICAgICBwcmludFJlcG9ydENvcHlyaWdodHMob2tDb3B5cmlnaHQsIG5vT3JCYWRDb3B5cmlnaHQsIGluZGV0ZXJtaW5hdGVDb3B5cmlnaHQpOwogICAgICAgIHJlc3VsdCA9ICgobm9PckJhZENvcHlyaWdodC5zaXplKCkgPiAwKSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tEZXNjcmlwdGlvbnMoSVF1ZXJ5UmVzdWx0PElJbnN0YWxsYWJsZVVuaXQ+IGFsbEZlYXR1cmVzKSB7CiAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKCiAgICAgICAgTGlzdDxJSW5zdGFsbGFibGVVbml0PiBub25lT3JCYWQgPSBuZXcgQXJyYXlMaXN0PElJbnN0YWxsYWJsZVVuaXQ+KCk7CiAgICAgICAgTGlzdDxJSW5zdGFsbGFibGVVbml0PiBvayA9IG5ldyBBcnJheUxpc3Q8SUluc3RhbGxhYmxlVW5pdD4oKTsKCiAgICAgICAgZm9yIChJSW5zdGFsbGFibGVVbml0IGZlYXR1cmUgOiBhbGxGZWF0dXJlcy50b1VubW9kaWZpYWJsZVNldCgpKSB7CiAgICAgICAgICAgIGlmIChmZWF0dXJlLmdldElkKCkuZW5kc1dpdGgoIi5mZWF0dXJlLmdyb3VwIikpIHsKICAgICAgICAgICAgICAgIFN0cmluZyBkZXNjcmlwdGlvbiA9IGZlYXR1cmUuZ2V0UHJvcGVydHkoSUluc3RhbGxhYmxlVW5pdC5QUk9QX0RFU0NSSVBUSU9OLCBudWxsKTsKICAgICAgICAgICAgICAgIGlmICgoZGVzY3JpcHRpb24gPT0gbnVsbCkgfHwgKGRlc2NyaXB0aW9uLmxlbmd0aCgpIDw9IDApIHx8IGRlc2NyaXB0aW9uLnN0YXJ0c1dpdGgoIiUiKSkgewogICAgICAgICAgICAgICAgICAgIG5vbmVPckJhZC5hZGQoZmVhdHVyZSk7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgb2suYWRkKGZlYXR1cmUpOwogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgcHJpbnRSZXBvcnREZXNjcmlwdGlvbihvaywgbm9uZU9yQmFkKTsKICAgICAgICByZXN1bHQgPSAoKG5vbmVPckJhZC5zaXplKCkgPiAwKSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgcHJpbnRSZXBvcnREZXNjcmlwdGlvbihMaXN0PElJbnN0YWxsYWJsZVVuaXQ+IG9rLCBMaXN0PElJbnN0YWxsYWJsZVVuaXQ+IG5vbmVPckJhZCkgewogICAgICAgIFN0cmluZyBTUEFDRVIgPSAiPGJyIC8+PT09PT09PT09PT09PT09PT09PT09PT0iOwoKICAgICAgICBGaWxlV3JpdGVyIG91dGZpbGVXcml0ZXIgPSBudWxsOwogICAgICAgIEZpbGUgb3V0ZmlsZSA9IG51bGw7CiAgICAgICAgU3RyaW5nIHRlc3REaXJOYW1lID0gZ2V0T3V0cHV0RGlyZWN0b3J5KCk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgb3V0ZmlsZSA9IG5ldyBGaWxlKHRlc3REaXJOYW1lLCAiZGVzY3JpcHRpb25zLmh0bWwiKTsKICAgICAgICAgICAgb3V0ZmlsZVdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKG91dGZpbGUpOwogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm91dHB1dDogIiArIG91dGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgICAgICBwcmludGxuKG91dGZpbGVXcml0ZXIsICI8cD5SZXBvc2l0b3J5ICgncmVwb1VSTFRvVGVzdCcpOiAiICsgZ2V0UmVwb1VSTFRvVGVzdCgpICsgIjwvcD4iICsgRU9MKTsKICAgICAgICAgICAgcHJpbnRsbihvdXRmaWxlV3JpdGVyLCAiPGJyIC8+PGJyIC8+RGVzY3JpcHRpb24gUmVwb3J0OiIgKyBTUEFDRVIpOwogICAgICAgICAgICBwcmludGxuKG91dGZpbGVXcml0ZXIsICJGZWF0dXJlcyB3cm9uZyBvciB1bmV4cGxhaW5hYmxlIGRlc2NyaXB0aW9uczogIiArIG5vbmVPckJhZC5zaXplKCkpOwogICAgICAgICAgICBwcmludGxuKG91dGZpbGVXcml0ZXIsICJGZWF0dXJlcyBwcm9iYWJseSBjb3JyZWN0OiAiICsgb2suc2l6ZSgpKTsKICAgICAgICAgICAgcHJpbnRsbihvdXRmaWxlV3JpdGVyLCAiPT09PT09PT09PT09PT09PT09PT09PT0iKTsKCiAgICAgICAgICAgIHByaW50bG4ob3V0ZmlsZVdyaXRlciwgIjxiciAvPjxiciAvPkRldGFpbHM6IiArIFNQQUNFUik7CgogICAgICAgICAgICBwcmludGxuKG91dGZpbGVXcml0ZXIsICJGZWF0dXJlcyB3aXRoIG5vIG9yIGR1YmlvdXMgZGVzY3JpcGl0b246IiArIFNQQUNFUik7CiAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQobm9uZU9yQmFkLCBuZXcgSVVJZENvbXBhcmF0b3IoKSk7CiAgICAgICAgICAgIGZvciAoSUluc3RhbGxhYmxlVW5pdCB1bml0IDogbm9uZU9yQmFkKSB7CiAgICAgICAgICAgICAgICBwcmludExpbmVEZXNjcmlwdGlvbihvdXRmaWxlV3JpdGVyLCB1bml0KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHJpbnRsbihvdXRmaWxlV3JpdGVyLCAiPGJyIC8+PGJyIC8+RmVhdHVyZXMgd2l0aCBkZXNjcmlwaXRvbnM6IiArIFNQQUNFUik7CiAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQob2ssIG5ldyBJVUlkQ29tcGFyYXRvcigpKTsKICAgICAgICAgICAgZm9yIChJSW5zdGFsbGFibGVVbml0IHVuaXQgOiBvaykgewogICAgICAgICAgICAgICAgcHJpbnRMaW5lRGVzY3JpcHRpb24ob3V0ZmlsZVdyaXRlciwgdW5pdCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICBpZiAob3V0ZmlsZVdyaXRlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIG91dGZpbGVXcml0ZXIuY2xvc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gd2VpcmRuZXNzCiAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyAgICAgICAgaWYgKChiYWRMaWNlbnNlLnNpemUoKSA+IDApIHx8IChleHRyYUxpY2Vuc2Uuc2l6ZSgpID4gMCkgfHwgKG5vTGljZW5zZS5zaXplKCkgPiAwKSkgewogICAgICAgIC8vICAgICAgICAgICAgZmFpbCgiRXJyb3JzIGluIGxpY2Vuc2UgY29uc2lzdGVuY3kuIEZvciBsaXN0LCBzZWUgIiArIG91dGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgIC8vICAgICAgICB9CiAgICB9CgoKCiAgICBwcml2YXRlIHZvaWQgcHJpbnRSZXBvcnRDb3B5cmlnaHRzKExpc3Q8SUluc3RhbGxhYmxlVW5pdD4gZ29vZCwgTGlzdDxJSW5zdGFsbGFibGVVbml0PiBiYWQsIExpc3Q8SUluc3RhbGxhYmxlVW5pdD4gbWF5YmUpIHsKICAgICAgICBTdHJpbmcgU1BBQ0VSID0gIjxiciAvPj09PT09PT09PT09PT09PT09PT09PT09IjsKCiAgICAgICAgRmlsZVdyaXRlciBvdXRmaWxlV3JpdGVyID0gbnVsbDsKICAgICAgICBGaWxlIG91dGZpbGUgPSBudWxsOwogICAgICAgIFN0cmluZyB0ZXN0RGlyTmFtZSA9IGdldE91dHB1dERpcmVjdG9yeSgpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIG91dGZpbGUgPSBuZXcgRmlsZSh0ZXN0RGlyTmFtZSwgImNvcHlyaWdodHMuaHRtbCIpOwogICAgICAgICAgICBvdXRmaWxlV3JpdGVyID0gbmV3IEZpbGVXcml0ZXIob3V0ZmlsZSk7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigib3V0cHV0OiAiICsgb3V0ZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgICAgIHByaW50bG4ob3V0ZmlsZVdyaXRlciwgIjxwPlJlcG9zaXRvcnkgKCdyZXBvVVJMVG9UZXN0Jyk6ICIgKyBnZXRSZXBvVVJMVG9UZXN0KCkgKyAiPC9wPiIgKyBFT0wpOwogICAgICAgICAgICBwcmludGxuKG91dGZpbGVXcml0ZXIsICI8YnIgLz48YnIgLz5Db3B5cmlnaHQgUmVwb3J0OiIgKyBTUEFDRVIpOwogICAgICAgICAgICBwcmludGxuKG91dGZpbGVXcml0ZXIsICJGZWF0dXJlcyB3cm9uZyBvciB1bmV4cGxhaW5hYmxlIGNvcHlyaWdodHM6ICIgKyBiYWQuc2l6ZSgpKTsKICAgICAgICAgICAgcHJpbnRsbihvdXRmaWxlV3JpdGVyLCAiRmVhdHVyZXMgbWF5YmUgd3JvbmcsIG1heWJlIGNvcnJlY3QgY29weXJpZ2h0czogIiArIG1heWJlLnNpemUoKSk7CiAgICAgICAgICAgIHByaW50bG4ob3V0ZmlsZVdyaXRlciwgIkZlYXR1cmVzIHByb2JhYmx5IGNvcnJlY3Q6ICIgKyBnb29kLnNpemUoKSk7CiAgICAgICAgICAgIHByaW50bG4ob3V0ZmlsZVdyaXRlciwgIj09PT09PT09PT09PT09PT09PT09PT09Iik7CgogICAgICAgICAgICBwcmludGxuKG91dGZpbGVXcml0ZXIsICI8YnIgLz48YnIgLz5EZXRhaWxzOiIgKyBTUEFDRVIpOwoKICAgICAgICAgICAgcHJpbnRsbihvdXRmaWxlV3JpdGVyLCAiRmVhdHVyZXMgd2l0aCBubyBvciBwcm9iYWJseSBpbmNvcnJlY3QgY29weXJpZ2h0IHN0YXRlbWVudDoiICsgU1BBQ0VSKTsKICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChiYWQsIG5ldyBJVUlkQ29tcGFyYXRvcigpKTsKICAgICAgICAgICAgZm9yIChJSW5zdGFsbGFibGVVbml0IHVuaXQgOiBiYWQpIHsKICAgICAgICAgICAgICAgIHByaW50TGluZUNvcHlyaWdodChvdXRmaWxlV3JpdGVyLCB1bml0KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHJpbnRsbihvdXRmaWxlV3JpdGVyLCAiPGJyIC8+PGJyIC8+SW5kZXRlcm1pbmFudDogZmVhdHVyZSdzIGNvcHlyaWdodCB0ZXh0IGNvbnRhaW5zIHRoZSB3b3JkICdjb3B5cmlnaHQnIGJ1dCBub3QgYXQgYmVnaW5uaW5nOiIgKyBTUEFDRVIpOwogICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KG1heWJlLCBuZXcgSVVJZENvbXBhcmF0b3IoKSk7CiAgICAgICAgICAgIGZvciAoSUluc3RhbGxhYmxlVW5pdCB1bml0IDogbWF5YmUpIHsKICAgICAgICAgICAgICAgIHByaW50TGluZUNvcHlyaWdodChvdXRmaWxlV3JpdGVyLCB1bml0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcmludGxuKG91dGZpbGVXcml0ZXIsICI8YnIgLz48YnIgLz5GZWF0dXJlcyB3aXRoIGNvcHlyaWdodHMgdGhhdCBhcmUgcHJvYmFibHkgb2sgKGkuZS4gc3RhcnQgd2l0aCAnQ29weXJpZ2h0Jyk6IiArIFNQQUNFUik7CiAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoZ29vZCwgbmV3IElVSWRDb21wYXJhdG9yKCkpOwogICAgICAgICAgICBmb3IgKElJbnN0YWxsYWJsZVVuaXQgdW5pdCA6IGdvb2QpIHsKICAgICAgICAgICAgICAgIHByaW50TGluZUNvcHlyaWdodChvdXRmaWxlV3JpdGVyLCB1bml0KTsKICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIGlmIChvdXRmaWxlV3JpdGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgb3V0ZmlsZVdyaXRlci5jbG9zZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyB3ZWlyZG5lc3MKICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vICAgICAgICBpZiAoKGJhZExpY2Vuc2Uuc2l6ZSgpID4gMCkgfHwgKGV4dHJhTGljZW5zZS5zaXplKCkgPiAwKSB8fCAobm9MaWNlbnNlLnNpemUoKSA+IDApKSB7CiAgICAgICAgLy8gICAgICAgICAgICBmYWlsKCJFcnJvcnMgaW4gbGljZW5zZSBjb25zaXN0ZW5jeS4gRm9yIGxpc3QsIHNlZSAiICsgb3V0ZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgLy8gICAgICAgIH0KICAgIH0KCiAgICBwcml2YXRlIHZvaWQgcHJpbnRMaW5lQ29weXJpZ2h0KEZpbGVXcml0ZXIgb3V0ZmlsZVdyaXRlciwgSUluc3RhbGxhYmxlVW5pdCBpdSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKCiAgICAgICAgU3RyaW5nIGNvcHlyaWdodCA9IG51bGw7CiAgICAgICAgSUNvcHlyaWdodCBjb3B5cmlnaHRJdSA9IGl1LmdldENvcHlyaWdodChudWxsKTsKICAgICAgICBpZiAoY29weXJpZ2h0SXUgIT0gbnVsbCkgewogICAgICAgICAgICBjb3B5cmlnaHQgPSBjb3B5cmlnaHRJdS5nZXRCb2R5KCk7CiAgICAgICAgfQogICAgICAgIFN0cmluZyBpdUlkID0gaXUuZ2V0SWQoKTsKICAgICAgICBTdHJpbmcgaXVWZXJzaW9uID0gaXUuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCk7CiAgICAgICAgcHJpbnRsbihvdXRmaWxlV3JpdGVyLCBpdUlkICsgTkJTUCArIGl1VmVyc2lvbiArIEJSICsgTkJTUCArIGNvcHlyaWdodCk7CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIHByaW50TGluZURlc2NyaXB0aW9uKEZpbGVXcml0ZXIgb3V0ZmlsZVdyaXRlciwgSUluc3RhbGxhYmxlVW5pdCBpdSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKCgogICAgICAgIFN0cmluZyBkZXNjcmlwdGlvbiA9IGl1LmdldFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQuUFJPUF9ERVNDUklQVElPTiwgbnVsbCk7CiAgICAgICAgU3RyaW5nIGl1SWQgPSBpdS5nZXRJZCgpOwogICAgICAgIFN0cmluZyBpdVZlcnNpb24gPSBpdS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKTsKICAgICAgICBwcmludGxuKG91dGZpbGVXcml0ZXIsIGl1SWQgKyBOQlNQICsgaXVWZXJzaW9uICsgQlIgKyBOQlNQICsgZGVzY3JpcHRpb24pOwogICAgfQp9ClBLAwQKAAAAAABvWAo/ZPc8Cm8bAABvGwAAKwAAAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvcmVwb3MvVGVzdFJlcG8uY2xhc3PK/rq+AAAAMQEvBwACAQAlb3JnL2VjbGlwc2UvanVuby90ZXN0cy9yZXBvcy9UZXN0UmVwbwcABAEAGGp1bml0L2ZyYW1ld29yay9UZXN0Q2FzZQEABURFQlVHAQABWgEADUNvbnN0YW50VmFsdWUDAAAAAAEAA0VPTAEAEkxqYXZhL2xhbmcvU3RyaW5nOwEABE5CU1AIAA0BAAggJm5ic3A7IAEAAkJSAQATSlVOSVRfUkVQT1JUX09VVFBVVAgAEQEAE2p1bml0LXJlcG9ydC1vdXRwdXQBAA1yZXBvVVJMVG9UZXN0AQAPb3V0cHV0RGlyZWN0b3J5AQAIPGNsaW5pdD4BAAMoKVYBAARDb2RlCAAYAQAObGluZS5zZXBhcmF0b3IIABoBAAEKCgAcAB4HAB0BABBqYXZhL2xhbmcvU3lzdGVtDAAfACABAAtnZXRQcm9wZXJ0eQEAOChMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmc7CQABACIMAAkACgcAJAEAF2phdmEvbGFuZy9TdHJpbmdCdWlsZGVyCAAmAQAFPGJyLz4KACMAKAwAKQAqAQAGPGluaXQ+AQAVKExqYXZhL2xhbmcvU3RyaW5nOylWCgAjACwMAC0ALgEABmFwcGVuZAEALShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwoAIwAwDAAxADIBAAh0b1N0cmluZwEAFCgpTGphdmEvbGFuZy9TdHJpbmc7CQABADQMAA4ACgEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQoAAwA4DAApABUBAAR0aGlzAQAnTG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvcmVwb3MvVGVzdFJlcG87AQAFc3VpdGUBABgoKUxqdW5pdC9mcmFtZXdvcmsvVGVzdDsJABwAPgwAPwBAAQADb3V0AQAVTGphdmEvaW8vUHJpbnRTdHJlYW07CABCAQAQc3VpdGUgZm9yIGxheW91dAoARABGBwBFAQATamF2YS9pby9QcmludFN0cmVhbQwARwAqAQAHcHJpbnRsbgcASQEAGWp1bml0L2ZyYW1ld29yay9UZXN0U3VpdGUKAEgASwwAKQBMAQAUKExqYXZhL2xhbmcvQ2xhc3M7KVYBACkoTGphdmEvaW8vRmlsZVdyaXRlcjtMamF2YS9sYW5nL1N0cmluZzspVgEACkV4Y2VwdGlvbnMHAFABABNqYXZhL2lvL0lPRXhjZXB0aW9uCABSAQAEPGxpPggAVAEABTwvbGk+CgBWAFgHAFcBABJqYXZhL2lvL0ZpbGVXcml0ZXIMAFkAKgEABXdyaXRlAQAUTGphdmEvaW8vRmlsZVdyaXRlcjsBAAl3aG9sZUxpbmUBAAlpc1NwZWNpYWwBADUoTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDspWgsAXwBhBwBgAQAwb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0DABiADIBAAVnZXRJZAgAZAEABWEuanJlCgBmAGgHAGcBABBqYXZhL2xhbmcvU3RyaW5nDABpAGoBAApzdGFydHNXaXRoAQAVKExqYXZhL2xhbmcvU3RyaW5nOylaCABsAQAMY29uZmlnLmEuanJlCABuAQAjb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlX3Jvb3QIAHABACJvcmcuZWNsaXBzZS5yY3AuY29uZmlndXJhdGlvbl9yb290CAByAQASdG9vbGluZ29yZy5lY2xpcHNlCAB0AQAIdG9vbGluZy4BAAJpdQEAMkxvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7AQAEaXVJZAEADmlzRmVhdHVyZUdyb3VwCAB6AQANZmVhdHVyZS5ncm91cAoAZgB8DAB9AGoBAAhlbmRzV2l0aAEAEXByaW50TGluZUxpc3RJdGVtAQBbKExqYXZhL2lvL0ZpbGVXcml0ZXI7TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDtMamF2YS9sYW5nL1N0cmluZzspVgsAXwAeCwBfAIIMAIMAhAEACmdldFZlcnNpb24BACsoKUxvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL1ZlcnNpb247CgCGADAHAIcBACdvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL1ZlcnNpb24KAGYAiQwAigCLAQAHdmFsdWVPZgEAJihMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9TdHJpbmc7CgABAI0MAEcATQEADW91dGZpbGVXcml0ZXIBAAppdXByb3BlcnR5AQAPaXVwcm9wZXJ0eVZhbHVlAQAJaXVWZXJzaW9uAQAScHJpbnRBbGxQcm9wZXJ0aWVzAQBJKExqYXZhL2lvL0ZpbGVXcml0ZXI7TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDspVgsAXwCVDACWAJcBAA1nZXRQcm9wZXJ0aWVzAQARKClMamF2YS91dGlsL01hcDsLAJkAmwcAmgEADWphdmEvdXRpbC9NYXAMAJwAnQEABmtleVNldAEAESgpTGphdmEvdXRpbC9TZXQ7CwCfAKEHAKABAA1qYXZhL3V0aWwvU2V0DACiAKMBAAhpdGVyYXRvcgEAFigpTGphdmEvdXRpbC9JdGVyYXRvcjsLAKUApwcApgEAEmphdmEvdXRpbC9JdGVyYXRvcgwAqACpAQAEbmV4dAEAFCgpTGphdmEvbGFuZy9PYmplY3Q7CwCZAKsMAKwArQEAA2dldAEAJihMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7CgAjADgKACMAsAwALQCxAQAtKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CACzAQADIDogCwClALUMALYAtwEAB2hhc05leHQBAAMoKVoBAA1vdXRGaWxlV3JpdGVyAQAKcHJvcGVydGllcwEAD0xqYXZhL3V0aWwvTWFwOwEABGtleXMBAA9MamF2YS91dGlsL1NldDsBAANrZXkBABJMamF2YS9sYW5nL09iamVjdDsBAAV2YWx1ZQEAFkxvY2FsVmFyaWFibGVUeXBlVGFibGUBADVMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzs+OwEACWdldEFsbElVcwEALSgpTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcXVlcnkvSVF1ZXJ5UmVzdWx0OwcAxQEAG2phdmEvbmV0L1VSSVN5bnRheEV4Y2VwdGlvbgcAxwEALm9yZy9lY2xpcHNlL2VxdWlub3gvcDIvY29yZS9Qcm92aXNpb25FeGNlcHRpb24BAAlTaWduYXR1cmUBAGEoKUxvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdDxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47CgABAMsMAMwAMgEAEGdldFJlcG9VUkxUb1Rlc3QHAM4BAAxqYXZhL25ldC9VUkkKAM0AKAoAAQDRDADSANMBABxnZXRNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyAQBJKClMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9yZXBvc2l0b3J5L21ldGFkYXRhL0lNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyOwsA1QDXBwDWAQBFb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9yZXBvc2l0b3J5L21ldGFkYXRhL0lNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyDADYANkBAA5sb2FkUmVwb3NpdG9yeQEAeyhMamF2YS9uZXQvVVJJO0xvcmcvZWNsaXBzZS9jb3JlL3J1bnRpbWUvSVByb2dyZXNzTW9uaXRvcjspTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcmVwb3NpdG9yeS9tZXRhZGF0YS9JTWV0YWRhdGFSZXBvc2l0b3J5OwgA2wEAF25vIHJlcG9zaXRvcnkgZm91bmQgYXQgCgDNADAKAAEA3gwA3wDgAQANYXNzZXJ0Tm90TnVsbAEAJyhMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL09iamVjdDspVgoA4gDkBwDjAQAmb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9RdWVyeVV0aWwMAOUA5gEAEGNyZWF0ZUlVQW55UXVlcnkBACcoKUxvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeTsLAOgA6gcA6QEAPm9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcmVwb3NpdG9yeS9tZXRhZGF0YS9JTWV0YWRhdGFSZXBvc2l0b3J5DADrAOwBAAVxdWVyeQEAfShMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnk7TG9yZy9lY2xpcHNlL2NvcmUvcnVudGltZS9JUHJvZ3Jlc3NNb25pdG9yOylMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ7CwDuAPAHAO8BAClvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdAwA8QC3AQAHaXNFbXB0eQoAAQDzDAD0APUBAAthc3NlcnRGYWxzZQEABChaKVYBAAdyZXBvVVJMAQAMcmVwb0xvY2F0aW9uAQAOTGphdmEvbmV0L1VSSTsBAARyZXBvAQBATG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcmVwb3NpdG9yeS9tZXRhZGF0YS9JTWV0YWRhdGFSZXBvc2l0b3J5OwEABmFsbElVcwEAK0xvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdDsBAF9Mb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ8TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDs+OwEADmdldEFsbEdyb3VwSVVzCgDiAQAMAQEA5gEAEmNyZWF0ZUlVR3JvdXBRdWVyeQoAAQEDDAEEAQUBAAhnZXRBZ2VudAEAMigpTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvY29yZS9JUHJvdmlzaW9uaW5nQWdlbnQ7CQDVAQcMAQgACgEADFNFUlZJQ0VfTkFNRQsBCgEMBwELAQAub3JnL2VjbGlwc2UvZXF1aW5veC9wMi9jb3JlL0lQcm92aXNpb25pbmdBZ2VudAwBDQEOAQAKZ2V0U2VydmljZQEAJihMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9PYmplY3Q7CgEQARIHAREBACRvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL1Rlc3RBY3RpdmF0b3IMARMBFAEACmdldENvbnRleHQBACQoKUxvcmcvb3NnaS9mcmFtZXdvcmsvQnVuZGxlQ29udGV4dDsJAQoBBwoBFwEZBwEYAQA6b3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9jb3JlL2hlbHBlcnMvU2VydmljZUhlbHBlcgwBDQEaAQBIKExvcmcvb3NnaS9mcmFtZXdvcmsvQnVuZGxlQ29udGV4dDtMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9PYmplY3Q7CQABARwMABIACggAEgoAHAEfDAAfASABACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwcBIgEAI29yZy9hcGFjaGUvdG9vbHMvYW50L0J1aWxkRXhjZXB0aW9uCAEkAQAodGhlICdyZXBvVVJMVG9UZXN0JyBwcm9wZXJ0eSB3YXMgbm90IHNldAoBIQAoCAEnAQAPcmVwb1VSTFRvVGVzdDogAQAQc2V0UmVwb1VSTFRvVGVzdAEAEmdldE91dHB1dERpcmVjdG9yeQkAAQErDAATAAoBABJzZXRPdXRwdXREaXJlY3RvcnkBAApTb3VyY2VGaWxlAQANVGVzdFJlcG8uamF2YQAhAAEAAwAAAAcAHAAFAAYAAQAHAAAAAgAIABwACQAKAAAAHAALAAoAAQAHAAAAAgAMABwADgAKAAAAGgAPAAoAAQAHAAAAAgAQ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c2UuanVuby50ZXN0cy5yZXBvczsKCmltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CmltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwppbXBvcnQgamF2YS5uZXQuVVJJOwppbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwppbXBvcnQgamF2YS51dGlsLk1hcDsKaW1wb3J0IGphdmEudXRpbC5TZXQ7CgppbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CmltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CmltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwoKaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwppbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuU2VydmljZUhlbHBlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS5JUHJvdmlzaW9uaW5nQWdlbnQ7CmltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwppbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwppbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5xdWVyeS5JUXVlcnlSZXN1bHQ7CmltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnF1ZXJ5LlF1ZXJ5VXRpbDsKaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIucmVwb3NpdG9yeS5tZXRhZGF0YS5JTWV0YWRhdGFSZXBvc2l0b3J5OwppbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZXBvc2l0b3J5Lm1ldGFkYXRhLklNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyOwppbXBvcnQgb3JnLmVjbGlwc2UuanVuby50ZXN0cy5UZXN0QWN0aXZhdG9yOwppbXBvcnQgb3JnLmVjbGlwc2UuanVuby50ZXN0cy5yZXBvcy5UZXN0UmVwbzsKCi8qKgogKiBUZXN0cyB0aGF0IGxpY2Vuc2VzIGluIHRoZSByZXBvc2l0b3J5IGFyZSBjb25zaXN0ZW50IHdpdGggdGhlIHBsYXRmb3JtCiAqIGZlYXR1cmUgbGljZW5zZS4KICogCiAqIFRoaXMgd2FzIGJhc2VkIG9uIHRlc3QgY29kZSBvcmlnaW5hbGx5IGF0dGFjaGVkIHRvIGJ1ZyAzMDY2MjcKICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNjYyNwogKi8KcHVibGljIGNsYXNzIFRlc3RSZXBvIGV4dGVuZHMgVGVzdENhc2UgewogICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHICAgICAgICAgICAgICAgPSBmYWxzZTsKICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nICBFT0wgICAgICAgICAgICAgICAgID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIsICJcbiIpOwogICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgIE5CU1AgICAgICAgICAgICAgICAgPSAiICZuYnNwOyAiOwogICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgIEJSICAgICAgICAgICAgICAgICAgPSAiPGJyLz4iICsgRU9MOwogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nICAgIEpVTklUX1JFUE9SVF9PVVRQVVQgPSAianVuaXQtcmVwb3J0LW91dHB1dCI7CgogICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigic3VpdGUgZm9yIGxheW91dCIpOwogICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFRlc3RSZXBvLmNsYXNzKTsKICAgIH0KCgogICAgcHJpdmF0ZSBTdHJpbmcgcmVwb1VSTFRvVGVzdDsKICAgIHByaXZhdGUgU3RyaW5nIG91dHB1dERpcmVjdG9yeTsKCiAgICBwcm90ZWN0ZWQgdm9pZCBwcmludGxuKEZpbGVXcml0ZXIgb3V0LCBTdHJpbmcgd2hvbGVMaW5lKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgIG91dC53cml0ZSgiPGxpPiIgKyB3aG9sZUxpbmUgKyAiPC9saT4iICsgRU9MKTsKCiAgICB9CgogICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNTcGVjaWFsKElJbnN0YWxsYWJsZVVuaXQgaXUpIHsKCgogICAgICAgIC8vIFRPRE86IEkgYXNzdW1lICdleGVjdXRhYmxlIHJvb3RzJywgZXRjLiBoYXZlIG5vIHJlYWRhYmxlIG5hbWU/IAogICAgICAgIC8qCiAgICAgICAgICogVE9ETzogd2hhdCBhcmUgdGhlc2Ugc3BlY2lhbCB0aGluZ3M/IFdoYXQgZXZlciB0aGV5CiAgICAgICAgICogYXJlLCB0aGV5IGhhdmUgbm8gcHJvdmlkZXIgbmFtZS4gY29uZmlnLmEuanJlIGlzCiAgICAgICAgICogaWRlbnRpZmllZCBhcyBhIGZyYWdtZW50CiAgICAgICAgICogKG9yZy5lY2xpcHNlLmVxdWlub3gucDIudHlwZS5mcmFnbWVudCkuIGEuanJlIGhhcyBubwogICAgICAgICAqIHByb3BlcnRpZXMuCiAgICAgICAgICovCiAgICAgICAgU3RyaW5nIGl1SWQgPSBpdS5nZXRJZCgpOwogICAgICAgIGJvb2xlYW4gaXNTcGVjaWFsID0gaXVJZC5zdGFydHNXaXRoKCJhLmpyZSIpIHx8IGl1SWQuc3RhcnRzV2l0aCgiY29uZmlnLmEuanJlIikgfHwgaXVJZC5zdGFydHNXaXRoKCJvcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGVfcm9vdCIpIHx8IGl1SWQuc3RhcnRzV2l0aCgib3JnLmVjbGlwc2UucmNwLmNvbmZpZ3VyYXRpb25fcm9vdCIpIHx8IGl1SWQuc3RhcnRzV2l0aCgidG9vbGluZ29yZy5lY2xpcHNlIikgfHwgaXVJZC5zdGFydHNXaXRoKCJ0b29saW5nLiIpOwogICAgICAgIHJldHVybiBpc1NwZWNpYWw7CiAgICB9CgogICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNGZWF0dXJlR3JvdXAoSUluc3RhbGxhYmxlVW5pdCBpdSkgewoKICAgICAgICBTdHJpbmcgaXVJZCA9IGl1LmdldElkKCk7CiAgICAgICAgYm9vbGVhbiBpc0ZlYXR1cmVHcm91cCA9IGl1SWQuZW5kc1dpdGgoImZlYXR1cmUuZ3JvdXAiKTsKICAgICAgICByZXR1cm4gaXNGZWF0dXJlR3JvdXA7CiAgICB9CgoKCiAgICBwcm90ZWN0ZWQgdm9pZCBwcmludExpbmVMaXN0SXRlbShGaWxlV3JpdGVyIG91dGZpbGVXcml0ZXIsIElJbnN0YWxsYWJsZVVuaXQgaXUsIFN0cmluZyBpdXByb3BlcnR5KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgIFN0cmluZyBpdXByb3BlcnR5VmFsdWUgPSBpdS5nZXRQcm9wZXJ0eShpdXByb3BlcnR5LCBudWxsKTsKICAgICAgICBTdHJpbmcgaXVJZCA9IGl1LmdldElkKCk7CiAgICAgICAgU3RyaW5nIGl1VmVyc2lvbiA9IGl1LmdldFZlcnNpb24oKS50b1N0cmluZygpOwogICAgICAgIHByaW50bG4ob3V0ZmlsZVdyaXRlciwgaXVJZCArIE5CU1AgKyBpdVZlcnNpb24gKyBOQlNQICsgQlIgKyBpdXByb3BlcnR5VmFsdWUpOwogICAgfQoKICAgIC8qKgogICAgICogVXNlIGZvciBkZWJ1Z2dpbmcgYW5kIGV4cGxvcmF0aW9uCiAgICAgKiAKICAgICAqIEBwYXJhbSBvdXRGaWxlV3JpdGVyCiAgICAgKiBAcGFyYW0gaXUKICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAqLwogICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRBbGxQcm9wZXJ0aWVzKEZpbGVXcml0ZXIgb3V0RmlsZVdyaXRlciwgSUluc3RhbGxhYmxlVW5pdCBpdSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnRpZXMgPSBpdS5nZXRQcm9wZXJ0aWVzKCk7CiAgICAgICAgU2V0IGtleXMgPSBwcm9wZXJ0aWVzLmtleVNldCgpOwogICAgICAgIGZvciAoT2JqZWN0IGtleSA6IGtleXMpIHsKICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gcHJvcGVydGllcy5nZXQoa2V5KTsKICAgICAgICAgICAgcHJpbnRsbihvdXRGaWxlV3JpdGVyLCBrZXkgKyAiIDogIiArIHZhbHVlKTsKICAgICAgICB9CgogICAgfQoKICAgIHByb3RlY3RlZCBJUXVlcnlSZXN1bHQ8SUluc3RhbGxhYmxlVW5pdD4gZ2V0QWxsSVVzKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiwgUHJvdmlzaW9uRXhjZXB0aW9uIHsKICAgICAgICBTdHJpbmcgcmVwb1VSTCA9IGdldFJlcG9VUkxUb1Rlc3QoKTsKICAgICAgICBVUkkgcmVwb0xvY2F0aW9uID0gbmV3IFVSSShyZXBvVVJMKTsKICAgICAgICBJTWV0YWRhdGFSZXBvc2l0b3J5IHJlcG8gPSBnZXRNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyKCkubG9hZFJlcG9zaXRvcnkocmVwb0xvY2F0aW9uLCBudWxsKTsKICAgICAgICBhc3NlcnROb3ROdWxsKCJubyByZXBvc2l0b3J5IGZvdW5kIGF0ICIgKyByZXBvTG9jYXRpb24udG9TdHJpbmcoKSwgcmVwbyk7CiAgICAgICAgSVF1ZXJ5UmVzdWx0PElJbnN0YWxsYWJsZVVuaXQ+IGFsbElVcyA9IHJlcG8ucXVlcnkoUXVlcnlVdGlsLmNyZWF0ZUlVQW55UXVlcnkoKSwgbnVsbCk7CiAgICAgICAgYXNzZXJ0RmFsc2UoYWxsSVVzLmlzRW1wdHkoKSk7CiAgICAgICAgcmV0dXJuIGFsbElVczsKICAgIH0KCiAgICBwcm90ZWN0ZWQgSVF1ZXJ5UmVzdWx0PElJbnN0YWxsYWJsZVVuaXQ+IGdldEFsbEdyb3VwSVVzKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiwgUHJvdmlzaW9uRXhjZXB0aW9uIHsKICAgICAgICBTdHJpbmcgcmVwb1VSTCA9IGdldFJlcG9VUkxUb1Rlc3QoKTsKICAgICAgICBVUkkgcmVwb0xvY2F0aW9uID0gbmV3IFVSSShyZXBvVVJMKTsKICAgICAgICBJTWV0YWRhdGFSZXBvc2l0b3J5IHJlcG8gPSBnZXRNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyKCkubG9hZFJlcG9zaXRvcnkocmVwb0xvY2F0aW9uLCBudWxsKTsKICAgICAgICBhc3NlcnROb3ROdWxsKCJubyByZXBvc2l0b3J5IGZvdW5kIGF0ICIgKyByZXBvTG9jYXRpb24udG9TdHJpbmcoKSwgcmVwbyk7CiAgICAgICAgSVF1ZXJ5UmVzdWx0PElJbnN0YWxsYWJsZVVuaXQ+IGFsbElVcyA9IHJlcG8ucXVlcnkoUXVlcnlVdGlsLmNyZWF0ZUlVR3JvdXBRdWVyeSgpLCBudWxsKTsKICAgICAgICBhc3NlcnRGYWxzZShhbGxJVXMuaXNFbXB0eSgpKTsKICAgICAgICByZXR1cm4gYWxsSVVzOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIgZ2V0TWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcigpIHsKICAgICAgICByZXR1cm4gKElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyKSBnZXRBZ2VudCgpLmdldFNlcnZpY2UoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuU0VSVklDRV9OQU1FKTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljIElQcm92aXNpb25pbmdBZ2VudCBnZXRBZ2VudCgpIHsKICAgICAgICAvLyBnZXQgdGhlIGdsb2JhbCBhZ2VudCBmb3IgdGhlIGN1cnJlbnRseSBydW5uaW5nIHN5c3RlbQogICAgICAgIHJldHVybiAoSVByb3Zpc2lvbmluZ0FnZW50KSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElQcm92aXNpb25pbmdBZ2VudC5TRVJWSUNFX05BTUUpOwogICAgfQoKICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVwb1VSTFRvVGVzdCgpIHsKICAgICAgICBpZiAocmVwb1VSTFRvVGVzdCA9PSBudWxsKSB7CiAgICAgICAgICAgIHJlcG9VUkxUb1Rlc3QgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInJlcG9VUkxUb1Rlc3QiKTsKCiAgICAgICAgICAgIGlmIChyZXBvVVJMVG9UZXN0ID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigidGhlICdyZXBvVVJMVG9UZXN0JyBwcm9wZXJ0eSB3YXMgbm90IHNldCIpOwogICAgICAgICAgICB9CgogICAgICAgIH0KICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInJlcG9VUkxUb1Rlc3Q6ICIgKyByZXBvVVJMVG9UZXN0KTsKICAgICAgICByZXR1cm4gcmVwb1VSTFRvVGVzdDsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBzZXRSZXBvVVJMVG9UZXN0KFN0cmluZyByZXBvVVJMVG9UZXN0KSB7CiAgICAgICAgdGhpcy5yZXBvVVJMVG9UZXN0ID0gcmVwb1VSTFRvVGVzdDsKICAgIH0KCiAgICBwdWJsaWMgU3RyaW5nIGdldE91dHB1dERpcmVjdG9yeSgpIHsKICAgICAgICBpZiAob3V0cHV0RGlyZWN0b3J5ID09IG51bGwpIHsKICAgICAgICAgICAgb3V0cHV0RGlyZWN0b3J5ID0gU3lzdGVtLmdldFByb3BlcnR5KEpVTklUX1JFUE9SVF9PVVRQVVQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gb3V0cHV0RGlyZWN0b3J5OwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dERpcmVjdG9yeShTdHJpbmcgb3V0cHV0RGlyZWN0b3J5KSB7CiAgICAgICAgdGhpcy5vdXRwdXREaXJlY3RvcnkgPSBvdXRwdXREaXJlY3Rvcnk7CiAgICB9Cn0KUEsDBAoAAAAAAHq0vT7IZZi4hz8AAIc/AAA4AAAAb3JnL2VjbGlwc2UvanVuby90ZXN0cy9yZXBvcy9zdGFuZGFyZExpY2Vuc2VzLnByb3BlcnRpZXNsaWNlbnNlMjAxMT1cCkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXApGZWJydWFyeSAxLCAyMDExXG5cClxuXApVc2FnZSBPZiBDb250ZW50XG5cClxuXApUSEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCk9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXApVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCk5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCkFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cClRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXApcblwKQXBwbGljYWJsZSBMaWNlbnNlc1xuXApcblwKVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZVxuXApFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuXAp0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpc1xuXApwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCkZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXApcblwKQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCmRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZVxuXApyZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCmFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXApcblwKICAgICAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKICAgICAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAogICAgICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAogICAgICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEoVE0pIEFSY2hpdmUpXG5cCiAgICAgICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKICAgICAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCiAgICAgICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCiAgICAgICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAogICAgICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCiAgICAgICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAogICAgICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKXG5cClRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCmNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCmluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAppbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKXG5cCiAgICAgICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAogICAgICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAogICAgICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCiAgICAgICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKICAgICAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXApcblwKTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXApQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgXG5cClVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKeW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAp0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuXG5cClN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGVcblwKdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdFxuXApnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKXG5cClRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cClNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKXG5cCiAgICAgICAtIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWwpXG5cCiAgICAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAogICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAogICAgICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKICAgICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKXG5cCklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCmlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCmdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKXG5cClxuXFVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXApcblwKVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLFxuXApidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvclxuXAp0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3JcblwKb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoXG5cCnRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLlxuXApJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwgKCJTcGVjaWZpY2F0aW9uIikuXG5cClxuXApZb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCllvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZVxuXApJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAppbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kXG5cCm1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCmFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzpcblwKXG5cCiAgICAgICAxLiBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlXG5cCiAgICAgICAgICB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZyxcblwKICAgICAgICAgIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCiAgICAgICAyLiBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5XG5cCiAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKICAgICAgIDMuIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0XG5cCiAgICAgICAgICBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaFxuXAogICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2VcblwKICAgICAgICAgIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZVxuXAogICAgICAgICAgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieVxuXAogICAgICAgICAgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoXG5cCiAgICAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uXG5cCiAgICAgICAgICBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cClxuXApDcnlwdG9ncmFwaHlcblwKXG5cCkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXApjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCmFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCnJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kXG5cCnJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cClxuXApKYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCgpsaWNlbnNlMjAxMD1cCkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXApBcHJpbCAxNCwgMjAxMFxuXApcblwKVXNhZ2UgT2YgQ29udGVudFxuXApcblwKVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXApPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCkFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXApOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXApBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCkFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCk9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXApURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCk9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCkJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKXG5cCkFwcGxpY2FibGUgTGljZW5zZXNcblwKXG5cClVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGVcblwKRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcblwKdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXNcblwKcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXApGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKXG5cCkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXApkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGVcblwKcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAphcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKXG5cCiAgICAgICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCiAgICAgICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKICAgICAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKICAgICAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhKFRNKSBBUmNoaXZlKVxuXAogICAgICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCiAgICAgICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAogICAgICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAogICAgICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKICAgICAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAogICAgICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKICAgICAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cClxuXApUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCmNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXApjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAppbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCkxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cClxuXAogICAgICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKICAgICAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKICAgICAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAogICAgICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCiAgICAgICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKXG5cCk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFxuXApVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCkluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCndpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCnlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLlxuXApTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlXG5cCnRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXRcblwKZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cClxuXApUSEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cClRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXApTT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cClxuXAogICAgICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCiAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKICAgICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCiAgICAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cClxuXApJVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cClRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAppcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXApnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cClxuXApcblxVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKXG5cClRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSxcblwKYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3JcblwKdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yXG5cCm90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aFxuXAp0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy5cblwKSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXApodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sICgiU3BlY2lmaWNhdGlvbiIpLlxuXApcblwKWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXApZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGVcblwKSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZFxuXAptYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAphZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6XG5cClxuXAogICAgICAgMS4gQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZVxuXAogICAgICAgICAgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsXG5cCiAgICAgICAgICBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAogICAgICAgMi4gRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eVxuXAogICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCiAgICAgICAzLiBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdFxuXAogICAgICAgICAgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2hcblwKICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlXG5cCiAgICAgICAgICB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGVcblwKICAgICAgICAgIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnlcblwKICAgICAgICAgIHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaFxuXAogICAgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvblxuXAogICAgICAgICAgb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXApcblwKQ3J5cHRvZ3JhcGh5XG5cClxuXApDb250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAphbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCnVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXApyZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZFxuXApyZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXApcblwKSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgpQSwMECgAAAAAAblgKPzA2lDBSBQAAUgUAADgAAABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL0lVTmFtZUFuZElkQ29tcGFyYXRvci5jbGFzc8r+ur4AAAAxADUHAAIBADJvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL0lVTmFtZUFuZElkQ29tcGFyYXRvcgcABAEAEGphdmEvbGFuZy9PYmplY3QHAAYBABRqYXZhL3V0aWwvQ29tcGFyYXRvcgEABjxpbml0PgEAAygpVgEABENvZGUKAAMACwwABwAIAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAEdGhpcwEANExvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL0lVTmFtZUFuZElkQ29tcGFyYXRvcjsBAAdjb21wYXJlAQBnKExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDspSQgAEwEAG29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZQsAFQAXBwAWAQAwb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0DAAYABkBAAtnZXRQcm9wZXJ0eQEAOChMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmc7CAAbAQAEbnVsbAoAHQAfBwAeAQAQamF2YS9sYW5nL1N0cmluZwwAIAAhAQAJY29tcGFyZVRvAQAVKExqYXZhL2xhbmcvU3RyaW5nOylJCwAVACMMACQAJQEABWdldElkAQAUKClMamF2YS9sYW5nL1N0cmluZzsBAANpdTEBADJMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0OwEAA2l1MgEAAnAxAQASTGphdmEvbGFuZy9TdHJpbmc7AQACcDIBAAZyZXN1bHQBAAFJAQAnKExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvT2JqZWN0OylJCgABADAMABAAEQEAClNvdXJjZUZpbGUBABpJVU5hbWVBbmRJZENvbXBhcmF0b3IuamF2YQEACVNpZ25hdHVyZQEAXExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvQ29tcGFyYXRvcjxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47ACEAAQADAAEABQAAAAMAAQAHAAgAAQAJAAAALwABAAEAAAAFKrcACrEAAAACAAwAAAAGAAEAAAAHAA0AAAAMAAEAAAAFAA4ADwAAAAEAEAARAAEACQAAAOoAAwAGAAAAWivHAAksxwAFA6wrxgAHLMcABQSsKxISAbkAFAMATiwSEgG5ABQDADoELccABhIaThkExwAHEho6BC0ZBLYAHDYFFQWaABQruQAiAQAsuQAiAQC2ABw2BRUFrAAAAAIADAAAADoADgAAAAwACAANAAoADwASABAAFAATAB4AFAApABUALQAWADAAGAA1ABkAOQAbAEEAHABGAB8AVwAhAA0AAAA+AAYAAABaAA4ADwAAAAAAWgAmACcAAQAAAFoAKAAnAAIAHgA8ACkAKgADACkAMQArACoABABBABkALAAtAAUQQQAQAC4AAQAJAAAALQADAAMAAAANKivAABUswAAVtgAvrAAAAAIADAAAAAYAAQAAAAEADQAAAAIAAAACADEAAAACADIAMwAAAAIANFBLAwQKAAAAAAD8ngk/5yWsk1IEAABSBAAANwAAAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvSVVOYW1lQW5kSWRDb21wYXJhdG9yLmphdmFwYWNrYWdlIG9yZy5lY2xpcHNlLmp1bm8udGVzdHMudXRpbHM7CgppbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CgppbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwoKcHVibGljIGNsYXNzIElVTmFtZUFuZElkQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3I8SUluc3RhbGxhYmxlVW5pdD4gewoKCiAgICBwdWJsaWMgaW50IGNvbXBhcmUoSUluc3RhbGxhYmxlVW5pdCBpdTEsIElJbnN0YWxsYWJsZVVuaXQgaXUyKSB7CiAgICAgICAgLy8gbmVpdGhlciBpdSBzaG91bGQgYmUgbnVsbCAuLi4gYnV0LCBqdXN0IHRvIGNvdmVyIGFsbCBjYXNlcwogICAgICAgIGlmICgoaXUxID09IG51bGwpICYmIChpdTIgPT0gbnVsbCkpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKChpdTEgPT0gbnVsbCkgfHwgKGl1MiA9PSBudWxsKSkgewogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIFN0cmluZyBwMSA9IGl1MS5nZXRQcm9wZXJ0eShJSW5zdGFsbGFibGVVbml0LlBST1BfTkFNRSwgbnVsbCk7CiAgICAgICAgICAgIFN0cmluZyBwMiA9IGl1Mi5nZXRQcm9wZXJ0eShJSW5zdGFsbGFibGVVbml0LlBST1BfTkFNRSwgbnVsbCk7CiAgICAgICAgICAgIGlmIChwMSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBwMSA9ICJudWxsIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocDIgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcDIgPSAibnVsbCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW50IHJlc3VsdCA9IHAxLmNvbXBhcmVUbyhwMik7CiAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gMCkgewogICAgICAgICAgICAgICAgLy8gaWYgcHJvdmlkZXIgbmFtZXMgYXJlIGVxdWFsLCB1c2UgaWQgYXMgc2Vjb25kYXJ5CiAgICAgICAgICAgICAgICAvLyBzb3J0IGtleQogICAgICAgICAgICAgICAgcmVzdWx0ID0gaXUxLmdldElkKCkuY29tcGFyZVRvKGl1Mi5nZXRJZCgpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgIH0KfVBLAwQKAAAAAABuWAo/TYjsbvQDAAD0AwAAOQAAAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvU3RyaW5nTGVuZ3RoQ29tcGFyYXRvci5jbGFzc8r+ur4AAAAxAC4HAAIBADNvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL1N0cmluZ0xlbmd0aENvbXBhcmF0b3IHAAQBABBqYXZhL2xhbmcvT2JqZWN0BwAGAQAUamF2YS91dGlsL0NvbXBhcmF0b3IBAAY8aW5pdD4BAAMoKVYBAARDb2RlCgADAAsMAAcACAEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBADVMb3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9TdHJpbmdMZW5ndGhDb21wYXJhdG9yOwEAB2NvbXBhcmUBACcoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KUkHABMBABFqYXZhL2xhbmcvSW50ZWdlcgoAFQAXBwAWAQAQamF2YS9sYW5nL1N0cmluZwwAGAAZAQAGbGVuZ3RoAQADKClJCgASABsMAAcAHAEABChJKVYKABIAHgwAHwAgAQAJY29tcGFyZVRvAQAWKExqYXZhL2xhbmcvSW50ZWdlcjspSQEAB3N0cmluZzEBABJMamF2YS9sYW5nL1N0cmluZzsBAAdzdHJpbmcyAQAHbGVuZ3RoMQEAE0xqYXZhL2xhbmcvSW50ZWdlcjsBAAdsZW5ndGgyAQAnKExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvT2JqZWN0OylJCgABACkMABAAEQEAClNvdXJjZUZpbGUBABtTdHJpbmdMZW5ndGhDb21wYXJhdG9yLmphdmEBAAlTaWduYXR1cmUBADxMamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL0NvbXBhcmF0b3I8TGphdmEvbGFuZy9TdHJpbmc7PjsAIQABAAMAAQAFAAAAAwABAAcACAABAAkAAAAvAAEAAQAAAAUqtwAKsQAAAAIADAAAAAYAAQAAAAUADQAAAAwAAQAAAAUADgAPAAAAAQAQABEAAQAJAAAAngADAAUAAAA0K8cACSzHAAUDrCvGAAcsxwAFBKy7ABJZK7YAFLcAGk67ABJZLLYAFLcAGjoELRkEtgAdrAAAAAIADAAAAB4ABwAAAAkACAAKAAoADAASAA0AFAAQACAAEQAtABIADQAAADQABQAAADQADgAPAAAAAAA0ACEAIgABAAAANAAjACIAAgAgABQAJAAlAAMALQAHACYAJQAEEEEAEAAnAAEACQAAAC0AAwADAAAADSorwAAVLMAAFbYAKKwAAAACAAwAAAAGAAEAAAABAA0AAAACAAAAAgAqAAAAAgArACwAAAACAC1QSwMECgAAAAAA/J4JPzC+6ZU+AgAAPgIAADgAAABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL1N0cmluZ0xlbmd0aENvbXBhcmF0b3IuamF2YXBhY2thZ2Ugb3JnLmVjbGlwc2UuanVuby50ZXN0cy51dGlsczsKCmltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKCnB1YmxpYyBjbGFzcyBTdHJpbmdMZW5ndGhDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvcjxTdHJpbmc+IHsKCgogICAgcHVibGljIGludCBjb21wYXJlKFN0cmluZyBzdHJpbmcxLCBTdHJpbmcgc3RyaW5nMikgewogICAgICAgIGlmICgoc3RyaW5nMSA9PSBudWxsKSAmJiAoc3RyaW5nMiA9PSBudWxsKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoKHN0cmluZzEgPT0gbnVsbCkgfHwgKHN0cmluZzIgPT0gbnVsbCkpIHsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBJbnRlZ2VyIGxlbmd0aDEgPSBuZXcgSW50ZWdlcihzdHJpbmcxLmxlbmd0aCgpKTsKICAgICAgICAgICAgSW50ZWdlciBsZW5ndGgyID0gbmV3IEludGVnZXIoc3RyaW5nMi5sZW5ndGgoKSk7CiAgICAgICAgICAgIHJldHVybiBsZW5ndGgxLmNvbXBhcmVUbyhsZW5ndGgyKTsKICAgICAgICB9CiAgICB9Cn1QSwMECgAAAAAAblgKPz5hQdgbBAAAGwQAADEAAABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL0lVSWRDb21wYXJhdG9yLmNsYXNzyv66vgAAADEAKAcAAgEAK29yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvSVVJZENvbXBhcmF0b3IHAAQBABBqYXZhL2xhbmcvT2JqZWN0BwAGAQAUamF2YS91dGlsL0NvbXBhcmF0b3IBAAY8aW5pdD4BAAMoKVYBAARDb2RlCgADAAsMAAcACAEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBAC1Mb3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9JVUlkQ29tcGFyYXRvcjsBAAdjb21wYXJlAQBnKExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDspSQsAEwAVBwAUAQAwb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0DAAWABcBAAVnZXRJZAEAFCgpTGphdmEvbGFuZy9TdHJpbmc7CgAZABsHABoBABBqYXZhL2xhbmcvU3RyaW5nDAAcAB0BAAljb21wYXJlVG8BABUoTGphdmEvbGFuZy9TdHJpbmc7KUkBAANpdTEBADJMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0OwEAA2l1MgEAJyhMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL09iamVjdDspSQoAAQAjDAAQABEBAApTb3VyY2VGaWxlAQATSVVJZENvbXBhcmF0b3IuamF2YQEACVNpZ25hdHVyZQEAXExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvQ29tcGFyYXRvcjxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47ACEAAQADAAEABQAAAAMAAQAHAAgAAQAJAAAALwABAAEAAAAFKrcACrEAAAACAAwAAAAGAAEAAAAHAA0AAAAMAAEAAAAFAA4ADwAAAAEAEAARAAEACQAAAHIAAgADAAAAJCvHAAksxwAFA6wrxgAHLMcABQSsK7kAEgEALLkAEgEAtgAYrAAAAAIADAAAABYABQAAAAwACAANAAoADwASABAAFAATAA0AAAAgAAMAAAAkAA4ADwAAAAAAJAAeAB8AAQAAACQAIAAfAAIQQQAQACEAAQAJAAAALQADAAMAAAANKivAABMswAATtgAirAAAAAIADAAAAAYAAQAAAAEADQAAAAIAAAACACQAAAACACUAJgAAAAIAJ1BLAwQKAAAAAAD8ngk/3uxJgUoCAABKAgAAMAAAAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvSVVJZENvbXBhcmF0b3IuamF2YXBhY2thZ2Ugb3JnLmVjbGlwc2UuanVuby50ZXN0cy51dGlsczsKCmltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKCmltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7CgpwdWJsaWMgY2xhc3MgSVVJZENvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yPElJbnN0YWxsYWJsZVVuaXQ+IHsKCgogICAgcHVibGljIGludCBjb21wYXJlKElJbnN0YWxsYWJsZVVuaXQgaXUxLCBJSW5zdGFsbGFibGVVbml0IGl1MikgewogICAgICAgIC8vIG5laXRoZXIgaXUgc2hvdWxkIGJlIG51bGwgLi4uIGJ1dCwganVzdCB0byBjb3ZlciBhbGwgY2FzZXMKICAgICAgICBpZiAoKGl1MSA9PSBudWxsKSAmJiAoaXUyID09IG51bGwpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICgoaXUxID09IG51bGwpIHx8IChpdTIgPT0gbnVsbCkpIHsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gaXUxLmdldElkKCkuY29tcGFyZVRvKGl1Mi5nZXRJZCgpKTsKICAgICAgICB9CiAgICB9Cn1QSwMECgAAAAAAblgKP3XLlES2AgAAtgIAADcAAABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL1BhY2tHekZpbGVOYW1lRmlsdGVyLmNsYXNzyv66vgAAADEAIgcAAgEAMW9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvUGFja0d6RmlsZU5hbWVGaWx0ZXIHAAQBABBqYXZhL2xhbmcvT2JqZWN0BwAGAQAWamF2YS9pby9GaWxlbmFtZUZpbHRlcgEAFEVYVEVOU0lPTl9QQUNFS0RfSkFSAQASTGphdmEvbGFuZy9TdHJpbmc7AQANQ29uc3RhbnRWYWx1ZQgACwEADC5qYXIucGFjay5negEABjxpbml0PgEAAygpVgEABENvZGUKAAMAEAwADAANAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAEdGhpcwEAM0xvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL1BhY2tHekZpbGVOYW1lRmlsdGVyOwEABmFjY2VwdAEAIyhMamF2YS9pby9GaWxlO0xqYXZhL2xhbmcvU3RyaW5nOylaCgAYABoHABkBABBqYXZhL2xhbmcvU3RyaW5nDAAbABwBAAhlbmRzV2l0aAEAFShMamF2YS9sYW5nL1N0cmluZzspWgEAA2RpcgEADkxqYXZhL2lvL0ZpbGU7AQAEbmFtZQEAClNvdXJjZUZpbGUBABlQYWNrR3pGaWxlTmFtZUZpbHRlci5qYXZhACEAAQADAAEABQABABoABwAIAAEACQAAAAIACgACAAEADAANAAEADgAAAC8AAQABAAAABSq3AA+xAAAAAgARAAAABgABAAAABgASAAAADAABAAAABQATABQAAAABABUAFgABAA4AAABFAAIAAwAAAAcsEgq2ABesAAAAAgARAAAABgABAAAACgASAAAAIAADAAAABwATABQAAAAAAAcAHQAeAAEAAAAHAB8ACAACAAEAIAAAAAIAIVBLAwQKAAAAAAD8ngk/js/0QVEBAABRAQAANgAAAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvUGFja0d6RmlsZU5hbWVGaWx0ZXIuamF2YXBhY2thZ2Ugb3JnLmVjbGlwc2UuanVuby50ZXN0cy51dGlsczsKCmltcG9ydCBqYXZhLmlvLkZpbGU7CmltcG9ydCBqYXZhLmlvLkZpbGVuYW1lRmlsdGVyOwoKcHVibGljIGNsYXNzIFBhY2tHekZpbGVOYW1lRmlsdGVyIGltcGxlbWVudHMgRmlsZW5hbWVGaWx0ZXIgewogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QQUNFS0RfSkFSID0gIi5qYXIucGFjay5neiI7CgogICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyLCBTdHJpbmcgbmFtZSkgewogICAgICAgIHJldHVybiBuYW1lLmVuZHNXaXRoKEVYVEVOU0lPTl9QQUNFS0RfSkFSKTsKICAgIH0KfQpQSwMECgAAAAAAblgKP306SRZeBQAAXgUAADwAAABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL0lVUHJvdmlkZXJBbmRJZENvbXBhcmF0b3IuY2xhc3PK/rq+AAAAMQA1BwACAQA2b3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9JVVByb3ZpZGVyQW5kSWRDb21wYXJhdG9yBwAEAQAQamF2YS9sYW5nL09iamVjdAcABgEAFGphdmEvdXRpbC9Db21wYXJhdG9yAQAGPGluaXQ+AQADKClWAQAEQ29kZQoAAwALDAAHAAgBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQA4TG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvSVVQcm92aWRlckFuZElkQ29tcGFyYXRvcjsBAAdjb21wYXJlAQBnKExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDspSQgAEwEAG29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZQsAFQAXBwAWAQAwb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0DAAYABkBAAtnZXRQcm9wZXJ0eQEAOChMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmc7CAAbAQAEbnVsbAoAHQAfBwAeAQAQamF2YS9sYW5nL1N0cmluZwwAIAAhAQAJY29tcGFyZVRvAQAVKExqYXZhL2xhbmcvU3RyaW5nOylJCwAVACMMACQAJQEABWdldElkAQAUKClMamF2YS9sYW5nL1N0cmluZzsBAANpdTEBADJMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0OwEAA2l1MgEAAnAxAQASTGphdmEvbGFuZy9TdHJpbmc7AQACcDIBAAZyZXN1bHQBAAFJAQAnKExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvT2JqZWN0OylJCgABADAMABAAEQEAClNvdXJjZUZpbGUBAB5JVVByb3ZpZGVyQW5kSWRDb21wYXJhdG9yLmphdmEBAAlTaWduYXR1cmUBAFxMamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL0NvbXBhcmF0b3I8TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDs+OwAhAAEAAwABAAUAAAADAAEABwAIAAEACQAAAC8AAQABAAAABSq3AAqxAAAAAgAMAAAABgABAAAABwANAAAADAABAAAABQAOAA8AAAABABAAEQABAAkAAADqAAMABgAAAForxwAJLMcABQOsK8YAByzHAAUErCsSEgG5ABQDAE4sEhIBuQAUAwA6BC3HAAYSGk4ZBMcABxIaOgQtGQS2ABw2BRUFmgAUK7kAIgEALLkAIgEAtgAcNgUVBawAAAACAAwAAAA6AA4AAAAMAAgADQAKAA8AEgAQABQAEwAeABQAKQAVAC0AFgAwABgANQAZADkAGwBBABwARgAfAFcAIQANAAAAPgAGAAAAWgAOAA8AAAAAAFoAJgAnAAEAAABaACgAJwACAB4APAApACoAAwApADEAKwAqAAQAQQAZACwALQAFEEEAEAAuAAEACQAAAC0AAwADAAAADSorwAAVLMAAFbYAL6wAAAACAAwAAAAGAAEAAAABAA0AAAACAAAAAgAxAAAAAgAyADMAAAACADRQSwMECgAAAAAA/J4JP6qjd7JWBAAAVgQAADsAAABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL0lVUHJvdmlkZXJBbmRJZENvbXBhcmF0b3IuamF2YXBhY2thZ2Ugb3JnLmVjbGlwc2UuanVuby50ZXN0cy51dGlsczsKCmltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKCmltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7CgpwdWJsaWMgY2xhc3MgSVVQcm92aWRlckFuZElkQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3I8SUluc3RhbGxhYmxlVW5pdD4gewoKCiAgICBwdWJsaWMgaW50IGNvbXBhcmUoSUluc3RhbGxhYmxlVW5pdCBpdTEsIElJbnN0YWxsYWJsZVVuaXQgaXUyKSB7CiAgICAgICAgLy8gbmVpdGhlciBpdSBzaG91bGQgYmUgbnVsbCAuLi4gYnV0LCBqdXN0IHRvIGNvdmVyIGFsbCBjYXNlcwogICAgICAgIGlmICgoaXUxID09IG51bGwpICYmIChpdTIgPT0gbnVsbCkpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKChpdTEgPT0gbnVsbCkgfHwgKGl1MiA9PSBudWxsKSkgewogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIFN0cmluZyBwMSA9IGl1MS5nZXRQcm9wZXJ0eShJSW5zdGFsbGFibGVVbml0LlBST1BfTkFNRSwgbnVsbCk7CiAgICAgICAgICAgIFN0cmluZyBwMiA9IGl1Mi5nZXRQcm9wZXJ0eShJSW5zdGFsbGFibGVVbml0LlBST1BfTkFNRSwgbnVsbCk7CiAgICAgICAgICAgIGlmIChwMSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBwMSA9ICJudWxsIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocDIgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcDIgPSAibnVsbCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW50IHJlc3VsdCA9IHAxLmNvbXBhcmVUbyhwMik7CiAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gMCkgewogICAgICAgICAgICAgICAgLy8gaWYgcHJvdmlkZXIgbmFtZXMgYXJlIGVxdWFsLCB1c2UgaWQgYXMgc2Vjb25kYXJ5CiAgICAgICAgICAgICAgICAvLyBzb3J0IGtleQogICAgICAgICAgICAgICAgcmVzdWx0ID0gaXUxLmdldElkKCkuY29tcGFyZVRvKGl1Mi5nZXRJZCgpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgIH0KfVBLAwQKAAAAAABuWAo/+pijVZ4CAACeAgAANAAAAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvSkFSRmlsZU5hbWVGaWx0ZXIuY2xhc3PK/rq+AAAAMQAiBwACAQAub3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9KQVJGaWxlTmFtZUZpbHRlcgcABAEAEGphdmEvbGFuZy9PYmplY3QHAAYBABZqYXZhL2lvL0ZpbGVuYW1lRmlsdGVyAQANRVhURU5TSU9OX0pBUgEAEkxqYXZhL2xhbmcvU3RyaW5nOwEADUNvbnN0YW50VmFsdWUIAAsBAAQuamFyAQAGPGluaXQ+AQADKClWAQAEQ29kZQoAAwAQDAAMAA0BAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQAwTG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvSkFSRmlsZU5hbWVGaWx0ZXI7AQAGYWNjZXB0AQAjKExqYXZhL2lvL0ZpbGU7TGphdmEvbGFuZy9TdHJpbmc7KVoKABgAGgcAGQEAEGphdmEvbGFuZy9TdHJpbmcMABsAHAEACGVuZHNXaXRoAQAVKExqYXZhL2xhbmcvU3RyaW5nOylaAQADZGlyAQAOTGphdmEvaW8vRmlsZTsBAARuYW1lAQAKU291cmNlRmlsZQEAFkpBUkZpbGVOYW1lRmlsdGVyLmphdmEAIQABAAMAAQAFAAEAGgAHAAgAAQAJAAAAAgAKAAIAAQAMAA0AAQAOAAAALwABAAEAAAAFKrcAD7EAAAACABEAAAAGAAEAAAAGABIAAAAMAAEAAAAFABMAFAAAAAEAFQAWAAEADgAAAEUAAgADAAAABywSCrYAF6wAAAACABEAAAAGAAEAAAAKABIAAAAgAAMAAAAHABMAFAAAAAAABwAdAB4AAQAAAAcAHwAIAAIAAQAgAAAAAgAhUEsDBAoAAAAAAPyeCT8a+RLZOAEAADgBAAAzAAAAb3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9KQVJGaWxlTmFtZUZpbHRlci5qYXZhcGFja2FnZSBvcmcuZWNsaXBzZS5qdW5vLnRlc3RzLnV0aWxzOwoKaW1wb3J0IGphdmEuaW8uRmlsZTsKaW1wb3J0IGphdmEuaW8uRmlsZW5hbWVGaWx0ZXI7CgpwdWJsaWMgY2xhc3MgSkFSRmlsZU5hbWVGaWx0ZXIgaW1wbGVtZW50cyBGaWxlbmFtZUZpbHRlciB7CiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX0pBUiA9ICIuamFyIjsKCiAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBkaXIsIFN0cmluZyBuYW1lKSB7CiAgICAgICAgcmV0dXJuIG5hbWUuZW5kc1dpdGgoRVhURU5TSU9OX0pBUik7CiAgICB9Cn0KUEsDBAoAAAAAAG5YCj8IwjCY1AkAANQJAAAvAAAAb3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9SZXBvcnRXcml0ZXIuY2xhc3PK/rq+AAAAMQBvBwACAQApb3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9SZXBvcnRXcml0ZXIHAAQBABBqYXZhL2xhbmcvT2JqZWN0AQADRU9MAQASTGphdmEvbGFuZy9TdHJpbmc7AQAOb3V0cHV0RmlsZW5hbWUBAA9vdXRwdXREaXJlY3RvcnkBAA1vdXRmaWxld3JpdGVyAQAVTGphdmEvaW8vUHJpbnRXcml0ZXI7AQAIPGNsaW5pdD4BAAMoKVYBAARDb2RlCAAPAQAObGluZS5zZXBhcmF0b3IIABEBAAEKCgATABUHABQBABBqYXZhL2xhbmcvU3lzdGVtDAAWABcBAAtnZXRQcm9wZXJ0eQEAOChMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmc7CQABABkMAAUABgEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABjxpbml0PgEAJyhMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspVgoAAwAfDAAcAAwJAAEAIQwACAAGCQABACMMAAcABgEABHRoaXMBACtMb3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9SZXBvcnRXcml0ZXI7AQARZ2V0T3V0cHV0RmlsZW5hbWUBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwEAEXNldE91dHB1dEZpbGVuYW1lAQAVKExqYXZhL2xhbmcvU3RyaW5nOylWAQASZ2V0T3V0cHV0RGlyZWN0b3J5AQASc2V0T3V0cHV0RGlyZWN0b3J5AQAJZ2V0V3JpdGVyAQAXKClMamF2YS9pby9QcmludFdyaXRlcjsBAApFeGNlcHRpb25zBwAwAQAdamF2YS9pby9GaWxlTm90Rm91bmRFeGNlcHRpb24JAAEAMgwACQAKBwA0AQAMamF2YS9pby9GaWxlCgABADYMACoAJwoAAQA4DAAmACcKADMAOgwAHAAdBwA8AQATamF2YS9pby9QcmludFdyaXRlcgoAOwA+DAAcAD8BABEoTGphdmEvaW8vRmlsZTspVgEAB291dGZpbGUBAA5MamF2YS9pby9GaWxlOwEAB3dyaXRlbG4HAEQBABNqYXZhL2lvL0lPRXhjZXB0aW9uCgABAEYMACwALQcASAEAF2phdmEvbGFuZy9TdHJpbmdCdWlsZGVyCgBKAEwHAEsBABBqYXZhL2xhbmcvU3RyaW5nDABNAE4BAAd2YWx1ZU9mAQAmKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL1N0cmluZzsKAEcAUAwAHAApCgBHAFIMAFMAVAEABmFwcGVuZAEALShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwoARwBWDABXACcBAAh0b1N0cmluZwoAOwBZDABaACkBAAV3cml0ZQEABHRleHQBAAVjbG9zZQoAOwBeDABcAAwBABUoTGphdmEvbGFuZy9PYmplY3Q7KVYKAAMAVgoAAQBiDABCACkBAAZvYmplY3QBABJMamF2YS9sYW5nL09iamVjdDsBAAZwcmludGYBACgoTGphdmEvbGFuZy9TdHJpbmc7W0xqYXZhL2xhbmcvT2JqZWN0OylWCgA7AGgMAGUAaQEAPChMamF2YS9sYW5nL1N0cmluZztbTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2lvL1ByaW50V3JpdGVyOwEABmZvcm1hdAEABGFyZ3MBABNbTGphdmEvbGFuZy9PYmplY3Q7AQAKU291cmNlRmlsZQEAEVJlcG9ydFdyaXRlci5qYXZhACEAAQADAAAABAAaAAUABgAAAAIABwAGAAAAAgAIAAYAAAACAAkACgAAAAwACAALAAwAAQANAAAALwACAAAAAAALEg4SELgAErMAGLEAAAACABoAAAAKAAIAAAAPAAoACAAbAAAAAgAAAAEAHAAdAAEADQAAAFkAAgADAAAADyq3AB4qK7UAICostQAisQAAAAIAGgAAABIABAAAAAoABAALAAkADAAOAA0AGwAAACAAAwAAAA8AJAAlAAAAAAAPAAgABgABAAAADwAHAAYAAgABACYAJwABAA0AAAAvAAEAAQAAAAUqtAAisAAAAAIAGgAAAAYAAQAAABYAGwAAAAwAAQAAAAUAJAAlAAAAAQAoACkAAQANAAAAPgACAAIAAAAGKiu1ACKxAAAAAgAaAAAACgACAAAAGgAFABsAGwAAABYAAgAAAAYAJAAlAAAAAAAGAAcABgABAAEAKgAnAAEADQAAAC8AAQABAAAABSq0ACCwAAAAAgAaAAAABgABAAAAHgAbAAAADAABAAAABQAkACUAAAABACsAKQABAA0AAAA+AAIAAgAAAAYqK7UAILEAAAACABoAAAAKAAIAAAAiAAUAIwAbAAAAFgACAAAABgAkACUAAAAAAAYACAAGAAEAAgAsAC0AAgAuAAAABAABAC8ADQAAAGgABAACAAAAKCq0ADHHAB+7ADNZKrYANSq2ADe3ADlMKrsAO1krtwA9tQAxKrQAMbAAAAACABoAAAASAAQAAAAmAAcAJwAXACgAIwAqABsAAAAWAAIAAAAoACQAJQAAABcADABAAEEAAQABAEIAKQACAC4AAAAEAAEAQwANAAAAVAAEAAIAAAAcKrcARbsAR1kruABJtwBPsgAYtgBRtgBVtgBYsQAAAAIAGgAAAAoAAgAAAC4AGwAvABsAAAAWAAIAAAAcACQAJQAAAAAAHABbAAYAAQABAEIADAACAC4AAAAEAAEAQwANAAAAOQACAAEAAAALKrcARbIAGLYAWLEAAAACABoAAAAKAAIAAAAyAAoAMwAbAAAADAABAAAACwAkACUAAAABAFwADAABAA0AAABBAAEAAQAAAA8qtAAxxgAKKrQAMbYAXbEAAAACABoAAAAOAAMAAAA2AAcANwAOADkAGwAAAAwAAQAAAA8AJAAlAAAAAQBCAF8AAgAuAAAABAABAEMADQAAAEEAAgACAAAACSortgBgtgBhsQAAAAIAGgAAAAoAAgAAADwACAA9ABsAAAAWAAIAAAAJACQAJQAAAAAACQBjAGQAAQCBAGUAZgACAC4AAAAEAAEAQwANAAAATQADAAMAAAALKrcARSsstgBnV7EAAAACABoAAAAKAAIAAABAAAoAQQAbAAAAIAADAAAACwAkACUAAAAAAAsAagAGAAEAAAALAGsAbAACAAEAbQAAAAIAblBLAwQKAAAAAAD8ngk/+ykAaA4HAAAOBwAALgAAAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvUmVwb3J0V3JpdGVyLmphdmFwYWNrYWdlIG9yZy5lY2xpcHNlLmp1bm8udGVzdHMudXRpbHM7CgppbXBvcnQgamF2YS5pby5GaWxlOwppbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CmltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwppbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKCnB1YmxpYyBjbGFzcyBSZXBvcnRXcml0ZXIgewogICAgcHVibGljIFJlcG9ydFdyaXRlcihTdHJpbmcgb3V0cHV0RGlyZWN0b3J5LCBTdHJpbmcgb3V0cHV0RmlsZW5hbWUpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMub3V0cHV0RGlyZWN0b3J5ID0gb3V0cHV0RGlyZWN0b3J5OwogICAgICAgIHRoaXMub3V0cHV0RmlsZW5hbWUgPSBvdXRwdXRGaWxlbmFtZTsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU9MID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIsICJcbiIpOwogICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgIG91dHB1dEZpbGVuYW1lOwogICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgIG91dHB1dERpcmVjdG9yeTsKCiAgICBwcml2YXRlIFByaW50V3JpdGVyICAgICAgICAgb3V0ZmlsZXdyaXRlcjsKCiAgICBwdWJsaWMgU3RyaW5nIGdldE91dHB1dEZpbGVuYW1lKCkgewogICAgICAgIHJldHVybiBvdXRwdXRGaWxlbmFtZTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRGaWxlbmFtZShTdHJpbmcgb3V0cHV0RmlsZW5hbWUpIHsKICAgICAgICB0aGlzLm91dHB1dEZpbGVuYW1lID0gb3V0cHV0RmlsZW5hbWU7CiAgICB9CgogICAgcHVibGljIFN0cmluZyBnZXRPdXRwdXREaXJlY3RvcnkoKSB7CiAgICAgICAgcmV0dXJuIG91dHB1dERpcmVjdG9yeTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXREaXJlY3RvcnkoU3RyaW5nIG91dHB1dERpcmVjdG9yeSkgewogICAgICAgIHRoaXMub3V0cHV0RGlyZWN0b3J5ID0gb3V0cHV0RGlyZWN0b3J5OwogICAgfQoKICAgIHByaXZhdGUgUHJpbnRXcml0ZXIgZ2V0V3JpdGVyKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CiAgICAgICAgaWYgKG91dGZpbGV3cml0ZXIgPT0gbnVsbCkgewogICAgICAgICAgICBGaWxlIG91dGZpbGUgPSBuZXcgRmlsZShnZXRPdXRwdXREaXJlY3RvcnkoKSwgZ2V0T3V0cHV0RmlsZW5hbWUoKSk7CiAgICAgICAgICAgIG91dGZpbGV3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIob3V0ZmlsZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBvdXRmaWxld3JpdGVyOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHdyaXRlbG4oU3RyaW5nIHRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgZ2V0V3JpdGVyKCkud3JpdGUodGV4dCArIEVPTCk7CiAgICB9CgogICAgcHVibGljIHZvaWQgd3JpdGVsbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgZ2V0V3JpdGVyKCkud3JpdGUoRU9MKTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKICAgICAgICBpZiAob3V0ZmlsZXdyaXRlciAhPSBudWxsKSB7CiAgICAgICAgICAgIG91dGZpbGV3cml0ZXIuY2xvc2UoKTsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIHZvaWQgd3JpdGVsbihPYmplY3Qgb2JqZWN0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgIHdyaXRlbG4ob2JqZWN0LnRvU3RyaW5nKCkpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHByaW50ZihTdHJpbmcgZm9ybWF0LCBPYmplY3QuLi4gYXJncykgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICBnZXRXcml0ZXIoKS5wcmludGYoZm9ybWF0LCBhcmdzKTsKICAgIH0KfQpQSwMECgAAAAAAblgKPw/WOKD6BwAA+gcAADQAAABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL0Z1bGxKYXJOYW1lUGFyc2VyLmNsYXNzyv66vgAAADEAdgcAAgEALm9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvRnVsbEphck5hbWVQYXJzZXIHAAQBABBqYXZhL2xhbmcvT2JqZWN0AQAFREVCVUcBAAFaAQANQ29uc3RhbnRWYWx1ZQMAAAAAAQALU1RBUlRfR1JPVVABABJMamF2YS9sYW5nL1N0cmluZzsBAAlFTkRfR1JPVVABAApVTkRFUlNDT1JFAQAJQkFDS1NMQVNIAQAOTElURVJBTF9QRVJJT0QBAAlBTllESUdJVFMBAANBTlkBAAdwYXR0ZXJuAQAZTGphdmEvdXRpbC9yZWdleC9QYXR0ZXJuOwEADXByb2plY3RTdHJpbmcBAA12ZXJzaW9uU3RyaW5nAQAGPGluaXQ+AQADKClWAQAEQ29kZQoAAwAZDAAVABYIABsBAAEoCQABAB0MAAkACggAHwEAASkJAAEAIQwACwAKCAAjAQABXwkAAQAlDAAMAAoIACcBAAFcCQABACkMAA0ACgcAKwEAF2phdmEvbGFuZy9TdHJpbmdCdWlsZGVyCgAtAC8HAC4BABBqYXZhL2xhbmcvU3RyaW5nDAAwADEBAAd2YWx1ZU9mAQAmKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL1N0cmluZzsKACoAMwwAFQA0AQAVKExqYXZhL2xhbmcvU3RyaW5nOylWCAA2AQABLgoAKgA4DAA5ADoBAAZhcHBlbmQBAC0oTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsKACoAPAwAPQA+AQAIdG9TdHJpbmcBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwkAAQBADAAOAAoIAEIBAAFkCABEAQABKgkAAQBGDAAPAAoIAEgBAAIuKgkAAQBKDAAQAAoIAEwBAAE/CgBOAFAHAE8BABdqYXZhL3V0aWwvcmVnZXgvUGF0dGVybgwAUQBSAQAHY29tcGlsZQEALShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvdXRpbC9yZWdleC9QYXR0ZXJuOwkAAQBUDAARABIBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQAwTG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvRnVsbEphck5hbWVQYXJzZXI7AQAFcGFyc2UBABUoTGphdmEvbGFuZy9TdHJpbmc7KVoIAFwBAAAJAAEAXgwAEwAKCQABAGAMABQACgoATgBiDABjAGQBAAdtYXRjaGVyAQAzKExqYXZhL2xhbmcvQ2hhclNlcXVlbmNlOylMamF2YS91dGlsL3JlZ2V4L01hdGNoZXI7CgBmAGgHAGcBABdqYXZhL3V0aWwvcmVnZXgvTWF0Y2hlcgwAaQBqAQAHbWF0Y2hlcwEAAygpWgoAZgBsDABtAG4BAAVncm91cAEAFShJKUxqYXZhL2xhbmcvU3RyaW5nOwEABGxpbmUBAAZyZXN1bHQBABlMamF2YS91dGlsL3JlZ2V4L01hdGNoZXI7AQAQZ2V0UHJvamVjdFN0cmluZwEAEGdldFZlcnNpb25TdHJpbmcBAApTb3VyY2VGaWxlAQAWRnVsbEphck5hbWVQYXJzZXIuamF2YQAhAAEAAwAAAAsAGgAFAAYAAQAHAAAAAgAIAAIACQAKAAAAAgALAAoAAAACAAwACgAAAAIADQAKAAAAAgAOAAoAAAACAA8ACgAAAAIAEAAKAAAAAgARABIAAAACABMACgAAAAIAFAAKAAAABAABABUAFgABABcAAAFTAAQAAQAAAQUqtwAYKhIatQAcKhIetQAgKhIitQAkKhImtQAoKrsAKlkqtAAouAAstwAyEjW2ADe2ADu1AD8quwAqWSq0ACi4ACy3ADISQbYANxJDtgA3tgA7tQBFKhJHtQBJKrsAKlkqtAAcuAAstwAyKrQASbYANyq0ACC2ADcqtAAktgA3KrQAHLYANyq0ABy2ADcqtABFtgA3KrQAILYANyq0AD+2ADcqtAActgA3KrQARbYANyq0ACC2ADcqtAA/tgA3KrQAHLYANyq0AEW2ADcqtAAgtgA3KrQAHLYANyq0AD+2ADcqtABJtgA3KrQAILYANxJLtgA3KrQAILYAN7YAO7gATbUAU7EAAAACAFUAAAAqAAoAAAASAAQAFgAKABcAEAAYABYAGQAcABoANgAbAFUAHABbAB0BBAASAFYAAAAMAAEAAAEFAFcAWAAAAAEAWQBaAAEAFwAAAKUAAwAEAAAAOQM9KhJbtQBdKhJbtQBfKrQAUyu2AGFOLbYAZZoACAM9pwAXKi0EtgBrtQBdKi0FtgBrtQBfBD0crAAAAAIAVQAAACoACgAAACQAAgAlAAgAJgAOACcAFwApAB4AKgAjADMALAA0ADUANQA3ADwAVgAAACoABAAAADkAVwBYAAAAAAA5AG8ACgABAAIANwBwAAYAAgAXACIAYwBxAAMAAQByAD4AAQAXAAAALwABAAEAAAAFKrQAXbAAAAACAFUAAAAGAAEAAABBAFYAAAAMAAEAAAAFAFcAWAAAAAEAcwA+AAEAFwAAAC8AAQABAAAABSq0AF+wAAAAAgBVAAAABgABAAAARwBWAAAADAABAAAABQBXAFgAAAABAHQAAAACAHVQSwMECgAAAAAA/J4JPwmcdG5kCgAAZAoAADMAAABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL0Z1bGxKYXJOYW1lUGFyc2VyLmphdmEvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCiAqIAogKiBDb250cmlidXRvcnM6CiAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICogICAgIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnBhY2thZ2Ugb3JnLmVjbGlwc2UuanVuby50ZXN0cy51dGlsczsKCmltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwoKcHVibGljIGNsYXNzIEZ1bGxKYXJOYW1lUGFyc2VyIHsKCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHICAgICAgICAgID0gZmFsc2U7CiAgICAvLyBzaW1wbGlmaWVkIHBhdHRlcm46IChJRCkgJ18nIChOICcuJyBNICcuJyBPICcuJyBTKSAnLmphcicKICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICAgU1RBUlRfR1JPVVAgICAgPSAiKCI7CiAgICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICAgIEVORF9HUk9VUCAgICAgID0gIikiOwogICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgICBVTkRFUlNDT1JFICAgICA9ICJfIjsKICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICAgQkFDS1NMQVNIICAgICAgPSAiXFwiOwogICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgICBMSVRFUkFMX1BFUklPRCA9IEJBQ0tTTEFTSCArICIuIjsKICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICAgQU5ZRElHSVRTICAgICAgPSBCQUNLU0xBU0ggKyAiZCIgKyAiKiI7CiAgICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICAgIEFOWSAgICAgICAgICAgID0gIi4qIjsKICAgIHByaXZhdGUgUGF0dGVybiAgICAgICAgICAgICAgcGF0dGVybiAgICAgICAgPSBQYXR0ZXJuLmNvbXBpbGUoU1RBUlRfR1JPVVAgKyBBTlkgKyBFTkRfR1JPVVAgKyBVTkRFUlNDT1JFICsgU1RBUlRfR1JPVVAgKyBTVEFSVF9HUk9VUCArIEFOWURJR0lUUyArIEVORF9HUk9VUCArIExJVEVSQUxfUEVSSU9EICsgU1RBUlRfR1JPVVAgKyBBTllESUdJVFMgKyBFTkRfR1JPVVAgKyBMSVRFUkFMX1BFUklPRCArIFNUQVJUX0dST1VQICsgQU5ZRElHSVRTICsgRU5EX0dST1VQICsgU1RBUlRfR1JPVVAgKyBMSVRFUkFMX1BFUklPRCArIEFOWSArIEVORF9HUk9VUCArICI/IiArIEVORF9HUk9VUCk7CgogICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgICBwcm9qZWN0U3RyaW5nOwogICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgICB2ZXJzaW9uU3RyaW5nOwoKCiAgICBwdWJsaWMgYm9vbGVhbiBwYXJzZShTdHJpbmcgbGluZSkgewogICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CiAgICAgICAgcHJvamVjdFN0cmluZyA9ICIiOwogICAgICAgIHZlcnNpb25TdHJpbmcgPSAiIjsKICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBwYXR0ZXJuLm1hdGNoZXIobGluZSk7CgogICAgICAgIGlmICghbWF0Y2hlci5tYXRjaGVzKCkpIHsKICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7CiAgICAgICAgICAgIGlmIChERUJVRykgewogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CiAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlx0dGhlIGxpbmUgZGlkIG5vdCBtYXRjaCBwYXJzZSBydWxlOiAiKTsKICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXHQiICsgbGluZSk7CiAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcHJvamVjdFN0cmluZyA9IG1hdGNoZXIuZ3JvdXAoMSk7CiAgICAgICAgICAgIHZlcnNpb25TdHJpbmcgPSBtYXRjaGVyLmdyb3VwKDIpOwogICAgICAgICAgICByZXN1bHQgPSB0cnVlOwogICAgICAgICAgICBpZiAoREVCVUcpIHsKICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihwcm9qZWN0U3RyaW5nKTsKICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih2ZXJzaW9uU3RyaW5nKTsKICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgoKICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvamVjdFN0cmluZygpIHsKICAgICAgICByZXR1cm4gcHJvamVjdFN0cmluZzsKICAgIH0KCgoKICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvblN0cmluZygpIHsKICAgICAgICByZXR1cm4gdmVyc2lvblN0cmluZzsKICAgIH0KfVBLAwQKAAAAAAA3arw+9hNBXWMAAABjAAAABgAAAGFudC5zaCMhL2Jpbi9zaAoKc291cmNlIGFnZ3JfcHJvcGVydGllcy5zaHNvdXJjZQoKQU5UX0NNRD0iJHtBTlRfSE9NRX0vYmluL2FudCIKJHtBTlRfSE9NRX0vYmluL2FudCAiJEAiClBLAwQKAAAAAAD9ngk/64RjcUwBAABMAQAACgAAAHBsdWdpbi54bWw8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pgo8P2VjbGlwc2UgdmVyc2lvbj0iMy41Ij8+CjxwbHVnaW4+CiAgIDxleHRlbnNpb24KICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmFudC5jb3JlLmFudFRhc2tzIj4KICAgICAgICAgPGFudFRhc2sKICAgICAgICAgbGlicmFyeT0iY2hlY2tMYXlvdXQuamFyIgogICAgICAgICBuYW1lPSJnZW5lcmF0ZVJlcG9zaXRvcnlSZXBvcnRzIgogICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanVuby50ZXN0cy5SdW5BbGxSZXBvcnRzQW50VGFzayIgLz4KICAgICAgICAgCiAgIDwvZXh0ZW5zaW9uPgoKPC9wbHVnaW4+ClBLAwQKAAAAAACFWQo/0hs65gIFAAACBQAAFgAAAHJ1bkVjbGlwc2VBbnRSdW5uZXIuc2gjIS91c3IvYmluL2VudiBiYXNoCgojIE9uIHByb2R1Y3Rpb24gbWFjaGluZSwgaXQgaXMgbm9ybWFsIHRvICJub3QgZmluZCIgdGhpcyBmaWxlIHdoZW4gcnVubmluZy4gCiMgQWxsIHZhcmlhYmxlcyB0aGF0IG1pZ2h0IGJlIGRlZmluZWQgaW4gaXQgaGF2ZSBjb3JyZWN0IHZhbHVlcyBzZXQgZm9yIHRoZSBwcm9kdWN0aW9uIAojIG1hY2hpbmUuIEl0cyBwdXJwb3NlIGlzIGlmL3doZW4gcnVubmluZyBvbiBhIHRlc3QgbWFjaGluZSwgdGhlIHZhcmlhYmxlcyBjYW4gYmUgb3ZlciByaWRkZW4KIyBlYXNpbHkgaW4gdGhhdCBvbmUgZmlsZSwgYW5kIGxlYXZlIG9yaWdpbmFsIHNjcmlwdHMgYWxvbmUuIApzb3VyY2UgYWdncl9wcm9wZXJ0aWVzLnNoc291cmNlCgojIFRoZXNlIGZpcnN0IGZldyB2YXJpYWJsZXMgY29tbW9ubHkgbmVlZCB0byBvdmVycmlkZGVuIG9uIHRlc3QgbWFjaGluZXMsIHRoZXkgCiMgYXJlIHZlcnkgc3BlY2lmaWMgcGVyIG1hY2hpbmUuIAojIHRoZSB0b3AgZGlyZWN0b3J5IG9mIGJ1aWxkLXJlbGF0ZWQgZGlyZWN0b3JpZXMKZXhwb3J0IEJVSUxEX0hPTUU9JHtCVUlMRF9IT01FOi0vc2hhcmVkL2p1bm99CmV4cG9ydCBKQVZBX0hPTUU9JHtKQVZBX0hPTUU6LS9zaGFyZWQvd2VidG9vbHMvYXBwcy9pYm0tamF2YS1zZGstNi4wLTguMS1saW51eC1pMzg2fQoKIyBUaGVzZSByZW1haW5pbmcgdmFyaWFibGUgc2hvdWxkIG5vdCBuZWVkIHRvIGJlIG92ZXJyaWRkZW50LCBhcyB0aGV5IAojIGFyZSByZWxhdGl2ZWx5IGNvbnN0YW50LCBvciBjb21wdXRlZCBmcm9tIG90aGVycy4gCmV4cG9ydCBSRUxFTkdfVEVTVFM9JHtSRUxFTkdfVEVTVFM6LW9yZy5lY2xpcHNlLmp1bm8udGVzdHN9CmV4cG9ydCBKQVZBX0VYRUNfRElSPSR7SkFWQV9FWEVDX0RJUjotJHtKQVZBX0hPTUV9L2pyZS9iaW59CmV4cG9ydCBCVUlMRF9URVNUU19ESVI9JHtCVUlMRF9URVNUU19ESVI6LSR7QlVJTERfSE9NRX0vJHtSRUxFTkdfVEVTVFN9fQpleHBvcnQgRUNMSVBTRV9IT01FX1RFU1Q9JHtFQ0xJUFNFX0hPTUVfVEVTVDotJHtCVUlMRF9IT01FfS90ZXN0SW5zdGFuY2V9CgoiJHtFQ0xJUFNFX0hPTUVfVEVTVH0iL2VjbGlwc2UvZWNsaXBzZSAtY29uc29sZWxvZyAtZGF0YSAuL2VjbGlwc2VXb3Jrc3BhY2UgLW5vc3BsYXNoIC0tbGF1bmNoZXIuc3VwcHJlc3NFcnJvcnMgLXZtICIke0pBVkFfRVhFQ19ESVJ9IiAtYXBwbGljYXRpb24gb3JnLmVjbGlwc2UuYW50LmNvcmUuYW50UnVubmVyIC1mICAke0JVSUxEX1RFU1RTX0RJUn0vcnVuVGVzdHMueG1sICIkQCIKUEsDBAoAAAAAAFiiCT8ulHfe+QEAAPkBAAATAAAAaW52b2tlQW50UnVubmVyLnhtbDxwcm9qZWN0IG5hbWU9Imp1bm9BbnRSdW5uZXIiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9Imludm9rZUFudCI+CgkgICAgPHByb3BlcnR5CgkgICAgICAgIGVudmlyb25tZW50PSJlbnYiIC8+CgkgICAgICAgIAkKCTx0YXJnZXQgbmFtZT0iaW52b2tlQW50Ij4KCgkJPGVjaG8gbWVzc2FnZT0iaW52b2tlIGFudCBydW5uZXIsIGZyb20gYW50IiAvPgoJCTxleGVjIGV4ZWN1dGFibGU9IiR7ZW52LkVDTElQU0VfSE9NRX0vZWNsaXBzZSIgCgkJCWZhaWxvbmVycm9yPSJmYWxzZSIgCgkJCWFwcGVuZD0idHJ1ZSI+CgkJCTxhcmcgbGluZT0iLWNvbnNvbGVsb2cgLWRhdGEgLi9ydW5FY2xpcHNlV29ya3NwYWNlIC1kZWJ1ZyAtbm9zcGxhc2ggLS1sYXVuY2hlci5zdXBwcmVzc0Vycm9ycyAtdm0gJHtlbnYuSkFWQV9FWEVDX0RJUn0gLWFwcGxpY2F0aW9uIG9yZy5lY2xpcHNlLmFudC5jb3JlLmFudFJ1bm5lciAtZiBydW5UZXN0cy54bWwiIC8+CgkJPC9leGVjPgoJPC90YXJnZXQ+CjwvcHJvamVjdD5QSwMECgAAAAAAyWIKO43P6VGWBQAAlgUAAAoAAABhYm91dC5odG1sPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgo8aGVhZD4KPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgo8dGl0bGU+QWJvdXQ8L3RpdGxlPgo8L2hlYWQ+Cjxib2R5IGxhbmc9IkVOLVVTIj4KPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+CiAKPFA+SnVuZSwgMjAwODwvUD4JCjxoMz5MaWNlbnNlPC9oMz4KCjxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAppbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCkVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCmF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCkZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Cgo8cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIApiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5CmFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCmluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50CmFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Cgo8L2JvZHk+CjwvaHRtbD5QSwMECgAAAAAAWlkKP/OzuNaVDAAAlQwAABEAAABnZXRSZWxlbmdUZXN0cy5zaCMhL3Vzci9iaW4vZW52IGJhc2gKCiMgaXQgaXMgYXNzdW1lZCB3ZSBhcmUgZXhlY3V0aW5nIHRoaXMgaW4gUkVMRU5HX1RFU1RTIG9yIHRoZSBwYXJlbnQgb2YgUkVMRU5HX1RFU1RTCgojIE5vdGU6IGZvciBkZXBsb3ltZW50IG9uIHByb2R1Y3Rpb24gbWFjaGluZSwgbm8gImN1c3RvbSIgcHJvcGVydGllcyBuZWVkIHRvIGJlIHNldCBpbiBhZ2dyX3Byb3BlcnRpZXMuc2hzb3VyY2UsIAojIGFzc3VtaW5nIHRoZSAiaHVkc29uIGJ1aWxkIHNjcmlwdCIgaGFzIGJlZW4gc2V0IHVwIGFwcHJvcHJpYXRlbHkuIAojIDEuIG5lZWQgdG8gc2V0ICJ1c2UgY3VzdG9tIHdvcmtzcGFjZSIgc28gc29tZSBvZiB0aGUgcmVsYXRpdmUgZGlyZWN0b3J5IGFzc3VtcHRpb25zIGFyZSB0cnVlIC4uLiBzdWNoIGFzIGZvciBKdW5vLCBzZXQgCiMgICAgL3NoYXJlZC9qdW5vL29yZy5lY2xpcHNlLmp1bm8udGVzdHMKIyAyLiBjb3B5ICJieSBoYW5kIiAob3Igc2NwKSB0aGlzIGdldFJlbGVuZ1Rlc3RzLnNoIGZpbGUgdG8gL3NoYXJlZC9qdW5vIGFuZCBydW4gZnJvbSBodWRzb24gZnJvbSB0aGVyZSwgdGhlIHBhcmVudCBvZiAKIyAgICBvLmUuaS50ZXN0cywgbmFtZWx5ICJydW4gc2hlbGwgc2NyaXB0IiAvc2hhcmVkL2p1bm8vZ2V0UmVsZW5nVGVzdHMuc2gKIyAzLiBXZSBjdXJyZW50bHkgYXNzdW1lICJ0ZXN0SW5zdGFuY2UiIGFscmVhZHkgZXhpc3RzLCBhcyBhIGNoaWxkIG9mIC9zaGFyZWQvanVubywgYW5kIGNvbnRhaW5zIGFuIGluc3RhbmNlIG9mIGVjbGlwc2UgU0RLICgzLjcpLiAKCgojIGZpbmRzIGZpbGUgb24gdXNlcnMgcGF0aCwgYmVmb3JlIGN1cnJlbnQgZGlyZWN0b3J5CiMgaGVuY2UsIG5vbi1wcm9kdWN0aW9uIHVzZXJzIGNhbiBzZXQgdGhlaXIgb3duIHZhbHVlcyBmb3IgdGVzdCBtYWNoaW5lcwpzb3VyY2UgYWdncl9wcm9wZXJ0aWVzLnNoc291cmNlCgppZiBbIC16ICR7UkVMRU5HX1RFU1RTfSBdIDsgdGhlbgoKICAgIFJFTEVOR19URVNUUz1vcmcuZWNsaXBzZS5qdW5vLnRlc3RzCiAgICBlY2hvICJSRUxFTkdfVEVTVFMgc2V0IGZyb20gc2NyaXB0OiAiICRSRUxFTkdfVEVTVFMKZWxzZQogICAgZWNobyAiUkVMRU5HX1RFU1RTIHNldCBmcm9tIGFnZ3JfcHJvcGVydGllcy5zaHNvdXJjZTogIiAkUkVMRU5HX1RFU1RTCgpmaQoKIyBUaGlzIHNjcmlwdCBmaWxlIGlzIHRvIGhlbHAgZ2V0IGJ1aWxkcyBzdGFydGVkICJmcmVzaCIsIHdoZW4KIyB0aGUgJHtSRUxFTkdfVEVTVFN9IGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cyBvbiBsb2NhbCBmaWxlIHN5c3RlbS4KIyBXaGlsZSBpdCBpcyBpbiB0aGUgY3ZzIHJlcG9zaXRvcnkgaW4gJHtSRUxFTkdfVEVTVFN9LCBpdCBpcwojIG1lYW50IHRvIGJlIGV4ZWN1dGVkIGZyb20gdGhlIHBhcmVudCBkaXJlY3RvcnkKIyBvZiAke1JFTEVOR19URVNUU30gb24gdGhlIGZpbGUgc3lzdGVtLgoKIyBleHBvcnQgaXMgdXNlZCwgaW5zdGVhZCBvZiBjaGVja291dCwganVzdCB0byBhdm9pZCB0aGUgQ1ZTIGRpcmVjdG9yaWVzIGFuZCBzaW5jZSB0aGlzIGNvZGUKIyBmb3IgYSBsb2NhbCBidWlsZCwgdGhlcmUgc2hvdWxkIG5ldmVyIGJlIGEgbmVlZCB0byBjaGVjayBpdCBiYWNrIGluIHRvIENWUy4KCiMgSWYgdGhlcmUgaXMgbm8gc3ViZGlyZWN0b3J5LCB0cnkgZ29pbmcgdXAgb25lIGRpcmVjdG9yeSBhbmQgbG9va2luZyBhZ2FpbiAoaW4gY2FzZSB3ZSBhcmUgaW4gaXQpLgppZiBbICEgLWUgJHtSRUxFTkdfVEVTVFN9IF0KdGhlbgogICAgY2QgLi4KICAgIGlmIFsgISAtZSAke1JFTEVOR19URVNUU30gXQogICAgdGhlbiAgICAgICAgCiAgICAgICAgZWNobyAiJHtSRUxFTkdfVEVTVFN9IGRvZXMgbm90IGV4aXN0IGFzIHN1YiBkaXJlY3RvcnkiOwogICAgICAgIGV4aXQgMTsKICAgIGZpCmZpCgoKIyBtYWtlIHN1cmUgUkVMRU5HX1RFU1RTIGhhcyBiZWVuIGRlZmluZWQgYW5kIGlzIG5vIHplcm8gbGVuZ3RoLCBvciAKIyBlbHNlIGZvbGxvd2luZyB3aWxsIGV2YWwgdG8gInJtIC1mciAvKiIgLi4uIHBvdGVudGlhbGx5IGNhdGFzdHJvcGhpYwppZiBbIC16ICIke1JFTEVOR19URVNUU30iIF0KdGhlbgogICAgZWNobyAiVGhlIHZhcmlhYmxlIFJFTEVOR19URVNUUyBtdXN0IGJlIGRlZmluZWQgdG8gcnVuIHRoaXMgc2NyaXB0IgogICAgZXhpdCAxOwpmaQplY2hvICIgICAgcmVtb3ZpbmcgYWxsIG9mICR7UkVMRU5HX1RFU1RTfSAuLi4iCnJtIC1mciAiJHtSRUxFTkdfVEVTVFN9Ii8qCnJtIC1mciAiJHtSRUxFTkdfVEVTVFN9Ii8ucHJvamVjdApybSAtZnIgIiR7UkVMRU5HX1RFU1RTfSIvLnNldHRpbmdzCnJtIC1mciAiJHtSRUxFTkdfVEVTVFN9Ii8uY2xhc3NwYXRoCm1rZGlyIC1wICIke1JFTEVOR19URVNUU30iCgojY29udHJvbHRhZz1kYXZpZF93aWxsaWFtc190ZW1wQnJhbmNoMwpjb250cm9sdGFnPUhFQUQKZWNobyAiICAgIGNoZWNraW5nIG91dCAkY29udHJvbHRhZyBvZiAke1JFTEVOR19URVNUU30gZnJvbSBjdnMgLi4uIgoKZXhwb3J0IENWU19SU0g9c3NoCmlmIFsgLXogJHtDVlNfSU5GT30gXSA7IHRoZW4KICAgIENWU19JTkZPPTpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6CmZpCgplY2hvICJDVlNfSU5GTzogIiAkQ1ZTX0lORk8KCmN2cyAtUSAtZiAtZCAke0NWU19JTkZPfS9jdnNyb290L2NhbGxpc3RvICBleHBvcnQgLWQgJHtSRUxFTkdfVEVTVFN9IC1yICRjb250cm9sdGFnICR7UkVMRU5HX1RFU1RTfQpyZXR1cm5jb2RlPSQ/CmlmIFsgJHJldHVybmNvZGUgLW5lIDAgXSAKdGhlbgogICAgZWNobyAibm9uIHplcm8gZnJvbSBjdnMgY2hlY2tvdXQ6ICIkcmV0dXJuY29kZQogICAgZXhpdCAkcmV0dXJuY29kZQpmaSAKZWNobyAiICAgIG1ha2luZyBzdXJlIHJlbGVuZyBjb250cm9sIGZpbGVzIGFyZSBleGVjdXRhYmxlIGFuZCBoYXZlIHByb3BlciBFT0wgLi4uIgpkb3MydW5peCAke1JFTEVOR19URVNUU30vKi5zaCogJHtSRUxFTkdfVEVTVFN9LyoucHJvcGVydGllcyAke1JFTEVOR19URVNUU30vKi54bWwgPi9kZXYvbnVsbCAyPj4vZGV2L251bGwKY2htb2QgK3ggJHtSRUxFTkdfVEVTVFN9Lyouc2ggPiAvZGV2L251bGwKZWNobwoKIyBUT0RPIC4uLiBhIGJpdCBxdWlya3kgLi4uIG5lZWQgdG8gaW5zdGFsbCByZWxlbmcgdGVzdHMgYXMgYWJvdmUsIGJ1dCB0aGVuIAojIGFsc28gcnVuICJpbnN0YWxsVGVzdHMiIHRhcmdldCBmcm9tIHJlbGVuZyB0b29scyBidWlsZC54bWwgZmlsZS4gCgoKUEsDBAoAAAAAAOOhCT/GXz3YdgAAAHYAAAAfAAAAT1NHSS1JTkYvbDEwbi9idW5kbGUucHJvcGVydGllcyNQcm9wZXJ0aWVzIGZpbGUgZm9yIG9yZy5lY2xpcHNlLmp1bm8udGVzdHMKQnVuZGxlLU5hbWUgPSBSZWxlbmcgVGVzdHMgZm9yIEp1bm8gUmVsZWFzZQpCdW5kbGUtVmVuZG9yID0gRWNsaXBzZSBTaW1SZWxQSwMECgAAAAAA46EJPy166thxDwAAcQ8AAAkAAAB2ZXJpZnkuc2gjIS91c3IvYmluL2VudiBiYXNoCgppZiBbWyAkIyAhPSAxIF1dIAp0aGVuCiAgICBwcmludGYgIlx0RVJST1I6IHRoaXMgc2NyaXB0LCAiJHswIyMqL30iLCByZXF1aXJlcyBleGFjdGx5IG9uZSBhcmd1bWVudDsgdGhlIG5hbWUgb3IgcGF0aCBvZiBqYXIgb3IgamFyLnBhY2suZ3ogZmlsZS5cbiIgPiYyCiAgICBleGl0IDEKZmkKCmlmIFtbIC16ICRWRVJJRllPVVRESVIgXV0gCnRoZW4KICAgIHByaW50ZiAiXHRFUlJPUjogdGhpcyBzY3JpcHQsICIkezAjIyovfSIsIHJlcXVpcmVzIFZFUklGWU9VVERJUiB0byBiZSBkZWZpbmVkLlxuIiA+JjIKICAgIGV4aXQgMQpmaQoKCgpmaWxlbmFtZT0iJHsxfSIKCmlmIFsgISAtZSAiJHtmaWxlbmFtZX0iIF0KdGhlbgogICAgcHJpbnRmICJcdEVSUk9SOiBmaWxlIGRvZXMgbm90IGV4aXN0OiIgIiR7ZmlsZW5hbWV9XG4iID4mMgogICAgZXhpdCAxCmZpCgpqYXJuYW1lPSQoYmFzZW5hbWUgIiR7ZmlsZW5hbWV9IikKCiMgbW9zdCB1c2VycyBuZWVkIG9ubHkgb25lLCBKYXZhIDUgb3IgSmF2YSA2LCBidXQgc29tZXRpbWVzIG1heSB3YW50IHRvIAojIGNoYW5nZSBKQVZBX0hPTUUsIGJlbG93LCB0byBzd2l0Y2ggYmFjayBhbmQgZm9ydGguCiMgVXNlIEpBVkEgNSB0byBlbnN1cmUgcGFjay5neiBmaWxlcyBjYW4gYmUgdW5wYWNrZWQgKGluc3RhbGxlZCkgd2l0aCBKQVZBIDUuIAojIFNvbWUgcGFjay5neiBmaWxlcyBjYW4gbm90IGJlIHVucGFja2VkIHdpdGggSmF2YSA2IChpbiBKdW5vIHJlcG9zaXRvcmllcyksIAojIHNvIHVzZSBKQVZBIDYgaWYgeW91IGRvIG5vdCBjYXJlIChpLmUuIHlvdXIgdXNlIGNhc2VzIGFsbCB1c2UgSkFWQSA2KQojIHRvIGF2b2lkIHRoZSBlcnJvciBtZXNzYWdlcy4KI0pBVkFfNV9IT01FPS9ob21lL3NoYXJlZC93ZWJ0b29scy9hcHBzL2libS1qYXZhMi1pMzg2LTUwMTEKI0pBVkFfNV9IT01FPS9zaGFyZWQvY29tbW9uL2pkay0xLjUuMC0yMi54ODZfNjQvCiNKQVZBXzZfSE9NRT0vaG9tZS9zaGFyZWQvd2VidG9vbHMvYXBwcy9pYm0tamF2YS1pMzg2LTYwOAojSkFWQV82X0hPTUU9L3NoYXJlZC9jb21tb24vamRrLTEuNi54ODZfNjQvCgojIFdlIGFsd2F5cyBzZXQgSkFWQV9IT01FIGV4cGxpY2l0bHkgdG8gd2hhdCB3ZSB3YW50LCBzaW5jZSBvbiBtYW55IHN5c3RlbXMsIAojIGlzIGl0IHNldCB0byBzb21lIEpSRSB0aGF0IHdvdWxkIG5vdCBzdWZmaWNlLiAKI0pBVkFfSE9NRT0ke0pBVkFfNl9IT01FfQoKaWYgWyAhIC1lICIke0pBVkFfSE9NRX0iIF0KdGhlbgogICAgcHJpbnRmICJcdEVSUk9SOiB0aGlzIHNjcmlwdCwgIiR7MCMjKi99IiwgcmVxdWlyZXMgSkFWQV9IT01FIHRvIGJlIGRlZmluZWQgYW5kIGV4aXN0LlxuIiA+JjIKICAgIGV4aXQgMQpmaQoKVU5QQUNLMjAwX0VYRT0kSkFWQV9IT01FL2pyZS9iaW4vdW5wYWNrMjAwClZFUklGWV9FWEU9JEpBVkFfSE9NRS9iaW4vamFyc2lnbmVyCgogICAgVkVSSUZJRURfT1VURklMRT0iJHtWRVJJRllPVVRESVJ9Ii92ZXJpZmllZC50eHQKICAgIEtOT1dOX0VYQ0VQVElPTj0iJHtWRVJJRllPVVRESVJ9Ii9rbm93bnVuc2lnbmVkLnR4dAogICAgVU5TSUdORURfT1VURklMRT0iJHtWRVJJRllPVVRESVJ9Ii91bnNpZ25lZC50eHQKICAgIE5PTUFOSUZFU1Q9IiR7VkVSSUZZT1VURElSfSIvbm9tYW5pZmVzdC50eHQKICAgIEVSUk9SX0VYSVRfRklMRT0iJHtWRVJJRllPVVRESVJ9Ii9lcnJvci50eHQKClBQQVRfUEFDS0daPSIoLiopLnBhY2suZ3okIgppZiBbWyAiJGphcm5hbWUiID1+ICAkUFBBVF9QQUNLR1ogXV0KdGhlbiAKICAgIGJhc2VqYXJuYW1lPSR7QkFTSF9SRU1BVENIWzFdfQogICAgI2VjaG8gLWUgIlxuIGJhc2VqYXJuYW1lOiAiICRiYXNlamFybmFtZSAiXG4iCiAgICAiJHtVTlBBQ0syMDBfRVhFfSIgJGZpbGVuYW1lIC90bXAvJGJhc2VqYXJuYW1lCiAgICB2cmVzdWx0PWAiJHtWRVJJRllfRVhFfSIgLXZlcmlmeSAvdG1wLyRiYXNlamFybmFtZWAKICAgIGV4aXRjb2RlPSQ/CiAgICBybSAvdG1wLyRiYXNlamFybmFtZQplbHNlCiAgICB2cmVzdWx0PWAiJHtWRVJJRllfRVhFfSIgLXZlcmlmeSAkZmlsZW5hbWVgCiAgICBleGl0Y29kZT0kPwpmaQoKIyBqYXJzaWduZXIgc29tZXRpbWVzIHJldHVybnMgb25lIGxpbmUsIHNvbWV0aW1lcyB0d28gLi4uIHdlIHRha2UgCiMgb3V0IEVPTHMgdG8gcHJpbnQgY29tcGFjdGx5CnZyZXN1bHQ9YGVjaG8gIiR7dnJlc3VsdH0iIHwgdHIgJ1xuJyAnICdgCgojIGtub3duIHJlc3BvbnNlIHBhdHRlcm5zIGZyb20gamFyc2lnbmVyClBQQVRfVkVSSUZJRUQ9Il5qYXJcIHZlcmlmaWVkLioiCiMgbm8gbWFuaWZlc3QgaXMgbm90IHNpZ25lZCBmb3Igb3VyIHB1cnBvc2VzIC4uLiBvY2N1cnMgYSBsb3QgZm9yIHVuc2lnbmVkIGZlYXR1cmUgamFycwpQUEFUX1VOU0lHTkVEX09SX05PTUFOSUZFU1Q9Il4oamFyIGlzIHVuc2lnbmVkKXwobm8gbWFuaWZlc3QpLioiCiMgZG8gbm90IGN1cnJlbnRseSB1c2UgdW5zaWduZWQgb3Igbm8gbWFuaWZlc3QgKGJ5IHRoZW1zZWx2ZXMpIAojIG5vciAiY29weSBtb2RlIiAuLi4gY29weSBtb2RlIHByaW50ZWQgdG8gc3Rkb3V0IGJ5IHVucGFjazIwMAojUFBBVF9VTlNJR05FRD0iXmphciBpcyB1bnNpZ25lZC4qIgojUFBBVF9OT01BTklGRVNUPSJebm8gbWFuaWZlc3QuKiIKI1BQQVRfQ09QWU1PREU9Il5Db3B5LW1vZGVcLi4qIgoKaWYgW1sgIiR7dnJlc3VsdH0iID1+ICRQUEFUX1ZFUklGSUVEIF1dCnRoZW4KICAgIHByaW50ZiAnJS04MHMgXHRcdCcgIiAgICR7amFybmFtZX06ICIgPj4gIiR7VkVSSUZJRURfT1VURklMRX0iIAogICAgcHJpbnRmICclc1xuJyAiICR7dnJlc3VsdH0gIiA+PiAiJHtWRVJJRklFRF9PVVRGSUxFfSIKZWxpZiBbWyAiJHt2cmVzdWx0fSIgPX4gJFBQQVRfVU5TSUdORURfT1JfTk9NQU5JRkVTVCBdXQp0aGVuCgogICAgIyBsaXN0ICJrbm93biBjYXNlcyIsIHRoYXQgY2FuIG5vdCBiZSBzaWduZWQsIAogICAgIyBpbiB0aGVpciBvd24gImtub3duIGV4Y2VwdGlvbiBmaWxlIiwgZWxzZSBsaXN0IGluICJ1bnNpZ25lZCIgZmlsZS4KCiAgICBQUEFUX0tOT1dOX1VOU0lHTkVEPScoY29tbW9ualwuc2RvLiopfChhcnRpZmFjdHNcLmphcil8KGNvbnRlbnRcLmphcil8KGNvbXBvc2l0ZUFydGlmYWN0cy5qYXIpfChjb21wb3NpdGVDb250ZW50LmphciknCiAgICBpZiAgW1sgJHtqYXJuYW1lfSA9fiAkUFBBVF9LTk9XTl9VTlNJR05FRCBdXSAgICAgICAKICAgIHRoZW4KICAgICAgICBwcmludGYgJyUtMTAwcyBcdFx0JyAiICAgJHtqYXJuYW1lfTogIiAgPj4gIiR7S05PV05fRVhDRVBUSU9OfSIKICAgICAgICBwcmludGYgJyVzXG4nICIgJHt2cmVzdWx0fSAiICA+PiAiJHtLTk9XTl9FWENFUFRJT059IgoKICAgIGVsc2UKICAgICAgICAjIHB1cnBvc2VseSBubyBsaW5lIGRlbGltaXRlciwgc28gb3V0cHV0IG9mIGphcnNpZ25lciBpcyBvbiBzYW1lIGxpbmUKICAgICAgICBwcmludGYgJyUtMTAwcyBcdFx0JyAiICAgJHtqYXJuYW1lfTogIiAgPj4gIiR7VU5TSUdORURfT1VURklMRX0iIAogICAgICAgIHByaW50ZiAnJXNcbicgIiAke3ZyZXN1bHR9ICIgID4+ICIke1VOU0lHTkVEX09VVEZJTEV9IgogICAgZmkgCgplbHNlIAogIyBmYWxsIHRocm91Z2ggaWYgdW5leHBlY3RlZCByZXN1bHQuIFdpbGwgaGFwcGVuIGlmIGNhbiBub3QgdW5wYWNrMjAwIGEgZmlsZQogICAgcHJpbnRmICclLTEwMHMgXHRcdCcgIiAgICR7amFybmFtZX06ICIgID4+ICIke0VSUk9SX0VYSVRfRklMRX0iIAogICAgcHJpbnRmICclc1xuJyAiICR7dnJlc3VsdH0gIiAgPj4gIiR7RVJST1JfRVhJVF9GSUxFfSIgCmZpCgppZiBbWyAkZXhpdGNvZGUgLWd0IDAgXV0KdGhlbgoKICAgIGVjaG8gLWUgIlxuIGV4aXRjb2RlOiAiICRleGl0Y29kZTogJChiYXNlbmFtZSAkZmlsZW5hbWUpIiBcbiIgID4+ICIke0VSUk9SX0VYSVRfRklMRX0iICAKZmkKClBLAQIUABQACAAIAFVeCj8D2ShZiAEAALYDAAAUAAQAAAAAAAAAAAAAAAAAAABNRVRBLUlORi9NQU5JRkVTVC5NRv7KAABQSwECCgAKAAAAAACXAcs++l04GLYMAAC2DAAADAAAAAAAAAAAAAAAAADOAQAAcnVuVGVzdHMueG1sUEsBAgoACgAAAAAARQHLPltDgXxiBgAAYgYAAAwAAAAAAAAAAAAAAAAArg4AAHZlcmlmeWRpci5zaFBLAQIKAAoAAAAAADdqvD50D6eYVwUAAFcFAAAWAAAAAAAAAAAAAAAAADoVAABjbGVhbnVwQnVpbGRSZXN1bHRzLnNoUEsBAgoACgAAAAAAb1gKP5EWjaMyCwAAMgsAACoAAAAAAAAAAAAAAAAAxRoAAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvVGVzdEFjdGl2YXRvci5jbGFzc1BLAQIKAAoAAAAAAHyfCT/h0kgS8AsAAPALAAApAAAAAAAAAAAAAAAAAD8mAABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL1Rlc3RBY3RpdmF0b3IuamF2YVBLAQIKAAoAAAAAAG9YCj9ZNrP+gBMAAIATAAAxAAAAAAAAAAAAAAAAAHYyAABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL1J1bkFsbFJlcG9ydHNBbnRUYXNrLmNsYXNzUEsBAgoACgAAAAAAMaAJP+oXqqkOGQAADhkAADAAAAAAAAAAAAAAAAAARUYAAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvUnVuQWxsUmVwb3J0c0FudFRhc2suamF2YVBLAQIKAAoAAAAAAEVeCj+ExiePYQMAAGEDAAA3AAAAAAAAAAAAAAAAAKFfAABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvQlJFRVRlc3QkQlJFRUZpbGVEYXRhLmNsYXNzUEsBAgoACgAAAAAARV4KP+LullSbLAAAmywAACoAAAAAAAAAAAAAAAAAV2MAAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvamFycy9CUkVFVGVzdC5jbGFzc1BLAQIKAAoAAAAAAEVeCj+z1SAZ6zsAAOs7AAApAAAAAAAAAAAAAAAAADqQAABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvQlJFRVRlc3QuamF2YVBLAQIKAAoAAAAAAG9YCj/8vHBKiiMAAIojAAAoAAAAAAAAAAAAAAAAAGzMAABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvRVNUZXN0LmNsYXNzUEsBAgoACgAAAAAAqKEJP8+I1HfqKAAA6igAACcAAAAAAAAAAAAAAAAAPPAAAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvamFycy9FU1Rlc3QuamF2YVBLAQIKAAoAAAAAAG9YCj/4LfuYCEkAAAhJAAAwAAAAAAAAAAAAAAAAAGsZAQBvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvVGVzdExheW91dFRlc3QuY2xhc3NQSwECCgAKAAAAAAAxoAk/0DwxQN9mAADfZgAALwAAAAAAAAAAAAAAAADBYgEAb3JnL2VjbGlwc2UvanVuby90ZXN0cy9qYXJzL1Rlc3RMYXlvdXRUZXN0LmphdmFQSwECCgAKAAAAAABvWAo/bHglAogeAACIHgAALQAAAAAAAAAAAAAAAADtyQEAb3JnL2VjbGlwc2UvanVuby90ZXN0cy9qYXJzL1BhY2syMDBUZXN0LmNsYXNzUEsBAgoACgAAAAAAMaAJP1k1m5HQJgAA0CYAACwAAAAAAAAAAAAAAAAAwOgBAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvamFycy9QYWNrMjAwVGVzdC5qYXZhUEsBAgoACgAAAAAAb1gKP6PNV2RWGAAAVhgAAC0AAAAAAAAAAAAAAAAA2g8CAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvamFycy9WZXJzaW9uVGVzdC5jbGFzc1BLAQIKAAoAAAAAADGgCT+D8PJWKx4AACseAAAsAAAAAAAAAAAAAAAAAHsoAgBvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvVmVyc2lvblRlc3QuamF2YVBLAQIKAAoAAAAAAG9YCj8jWuopuwQAALsEAAAqAAAAAAAAAAAAAAAAAPBGAgBvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvVGVzdEphcnMuY2xhc3NQSwECCgAKAAAAAAD8ngk/wa+L0qYDAACmAwAAKQAAAAAAAAAAAAAAAADzSwIAb3JnL2VjbGlwc2UvanVuby90ZXN0cy9qYXJzL1Rlc3RKYXJzLmphdmFQSwECCgAKAAAAAAAAGck+xy/ubv8DAAD/AwAALQAAAAAAAAAAAAAAAADgTwIAb3JnL2VjbGlwc2UvanVuby90ZXN0cy9qYXJzL2NvbmZpZy5wcm9wZXJ0aWVzUEsBAgoACgAAAAAAymIKO06BelF0BwAAdAcAADEAAAAAAAAAAAAAAAAAKlQCAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvamFycy9jb25maWdIT0xELnByb3BlcnRpZXNQSwECCgAKAAAAAADKYgo77bed9NgDAADYAwAAMQAAAAAAAAAAAAAAAADtWwIAb3JnL2VjbGlwc2UvanVuby90ZXN0cy9qYXJzL2V4Y2VwdGlvbnMucHJvcGVydGllc1BLAQIKAAoAAAAAAG9YCj8VX0w2JCQAACQkAAAyAAAAAAAAAAAAAAAAABRgAgBvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3JlcG9zL1ZlcnNpb25DaGVja2luZy5jbGFzc1BLAQIKAAoAAAAAADGgCT9eYizRpS0AAKUtAAAxAAAAAAAAAAAAAAAAAIiEAgBvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3JlcG9zL1ZlcnNpb25DaGVja2luZy5qYXZhUEsBAgoACgAAAAAAb1gKP75VX4VWGQAAVhkAADAAAAAAAAAAAAAAAAAAfLICAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvcmVwb3MvSVVOYW1lQ2hlY2tlci5jbGFzc1BLAQIKAAoAAAAAADGgCT9Kpp9mpiMAAKYjAAAvAAAAAAAAAAAAAAAAACDMAgBvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3JlcG9zL0lVTmFtZUNoZWNrZXIuamF2YVBLAQIKAAoAAAAAAG9YCj87DNcuQhsAAEIbAAA1AAAAAAAAAAAAAAAAABPwAgBvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3JlcG9zL0ZlYXR1cmVOYW1lTGVuZ3Rocy5jbGFzc1BLAQIKAAoAAAAAAKihCT9g0KAfVxcAAFcXAAA0AAAAAAAAAAAAAAAAAKgLAwBvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3JlcG9zL0ZlYXR1cmVOYW1lTGVuZ3Rocy5qYXZhUEsBAgoACgAAAAAAb1gKP+A/214EGwAABBsAADYAAAAAAAAAAAAAAAAAUSMDAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvcmVwb3MvUHJvdmlkZXJOYW1lQ2hlY2tlci5jbGFzc1BLAQIKAAoAAAAAADGgCT/5W+CrvR0AAL0dAAA1AAAAAAAAAAAAAAAAAKk+AwBvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3JlcG9zL1Byb3ZpZGVyTmFtZUNoZWNrZXIuamF2YVBLAQIKAAoAAAAAAG9YCj8FlZ++kzYAAJM2AABAAAAAAAAAAAAAAAAAALlcAwBvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3JlcG9zL0ZlYXR1cmVEaXNwbGF5YWJsZURhdGFDaGVja2VyLmNsYXNzUEsBAgoACgAAAAAAMaAJP7FvTKjMPgAAzD4AAD8AAAAAAAAAAAAAAAAAqpMDAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvcmVwb3MvRmVhdHVyZURpc3BsYXlhYmxlRGF0YUNoZWNrZXIuamF2YVBLAQIKAAoAAAAAAG9YCj9k9zwKbxsAAG8bAAArAAAAAAAAAAAAAAAAANPSAwBvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3JlcG9zL1Rlc3RSZXBvLmNsYXNzUEsBAgoACgAAAAAAMaAJP0j1STrkGQAA5BkAACoAAAAAAAAAAAAAAAAAi+4DAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvcmVwb3MvVGVzdFJlcG8uamF2YVBLAQIKAAoAAAAAAHq0vT7IZZi4hz8AAIc/AAA4AAAAAAAAAAAAAAAAALcIBABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3JlcG9zL3N0YW5kYXJkTGljZW5zZXMucHJvcGVydGllc1BLAQIKAAoAAAAAAG5YCj8wNpQwUgUAAFIFAAA4AAAAAAAAAAAAAAAAAJRIBABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL0lVTmFtZUFuZElkQ29tcGFyYXRvci5jbGFzc1BLAQIKAAoAAAAAAPyeCT/nJayTUgQAAFIEAAA3AAAAAAAAAAAAAAAAADxOBABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL0lVTmFtZUFuZElkQ29tcGFyYXRvci5qYXZhUEsBAgoACgAAAAAAblgKP02I7G70AwAA9AMAADkAAAAAAAAAAAAAAAAA41IEAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvU3RyaW5nTGVuZ3RoQ29tcGFyYXRvci5jbGFzc1BLAQIKAAoAAAAAAPyeCT8wvumVPgIAAD4CAAA4AAAAAAAAAAAAAAAAAC5XBABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL1N0cmluZ0xlbmd0aENvbXBhcmF0b3IuamF2YVBLAQIKAAoAAAAAAG5YCj8+YUHYGwQAABsEAAAxAAAAAAAAAAAAAAAAAMJZBABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL0lVSWRDb21wYXJhdG9yLmNsYXNzUEsBAgoACgAAAAAA/J4JP97sSYFKAgAASgIAADAAAAAAAAAAAAAAAAAALF4EAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvSVVJZENvbXBhcmF0b3IuamF2YVBLAQIKAAoAAAAAAG5YCj91y5REtgIAALYCAAA3AAAAAAAAAAAAAAAAAMRgBABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL1BhY2tHekZpbGVOYW1lRmlsdGVyLmNsYXNzUEsBAgoACgAAAAAA/J4JP47P9EFRAQAAUQEAADYAAAAAAAAAAAAAAAAAz2MEAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvUGFja0d6RmlsZU5hbWVGaWx0ZXIuamF2YVBLAQIKAAoAAAAAAG5YCj99OkkWXgUAAF4FAAA8AAAAAAAAAAAAAAAAAHRlBABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL0lVUHJvdmlkZXJBbmRJZENvbXBhcmF0b3IuY2xhc3NQSwECCgAKAAAAAAD8ngk/qqN3slYEAABWBAAAOwAAAAAAAAAAAAAAAAAsawQAb3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9JVVByb3ZpZGVyQW5kSWRDb21wYXJhdG9yLmphdmFQSwECCgAKAAAAAABuWAo/+pijVZ4CAACeAgAANAAAAAAAAAAAAAAAAADbbwQAb3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9KQVJGaWxlTmFtZUZpbHRlci5jbGFzc1BLAQIKAAoAAAAAAPyeCT8a+RLZOAEAADgBAAAzAAAAAAAAAAAAAAAAAMtyBABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL0pBUkZpbGVOYW1lRmlsdGVyLmphdmFQSwECCgAKAAAAAABuWAo/CMIwmNQJAADUCQAALwAAAAAAAAAAAAAAAABUdAQAb3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9SZXBvcnRXcml0ZXIuY2xhc3NQSwECCgAKAAAAAAD8ngk/+ykAaA4HAAAOBwAALgAAAAAAAAAAAAAAAAB1fgQAb3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9SZXBvcnRXcml0ZXIuamF2YVBLAQIKAAoAAAAAAG5YCj8P1jig+gcAAPoHAAA0AAAAAAAAAAAAAAAAAM+FBABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL0Z1bGxKYXJOYW1lUGFyc2VyLmNsYXNzUEsBAgoACgAAAAAA/J4JPwmcdG5kCgAAZAoAADMAAAAAAAAAAAAAAAAAG44EAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvRnVsbEphck5hbWVQYXJzZXIuamF2YVBLAQIKAAoAAAAAADdqvD72E0FdYwAAAGMAAAAGAAAAAAAAAAAAAAAAANCYBABhbnQuc2hQSwECCgAKAAAAAAD9ngk/64RjcUwBAABMAQAACgAAAAAAAAAAAAAAAABXmQQAcGx1Z2luLnhtbFBLAQIKAAoAAAAAAIVZCj/SGzrmAgUAAAIFAAAWAAAAAAAAAAAAAAAAAMuaBABydW5FY2xpcHNlQW50UnVubmVyLnNoUEsBAgoACgAAAAAAWKIJPy6Ud975AQAA+QEAABMAAAAAAAAAAAAAAAAAAaAEAGludm9rZUFudFJ1bm5lci54bWxQSwECCgAKAAAAAADJYgo7jc/pUZYFAACWBQAACgAAAAAAAAAAAAAAAAArogQAYWJvdXQuaHRtbFBLAQIKAAoAAAAAAFpZCj/zs7jWlQwAAJUMAAARAAAAAAAAAAAAAAAAAOmnBABnZXRSZWxlbmdUZXN0cy5zaFBLAQIKAAoAAAAAAOOhCT/GXz3YdgAAAHYAAAAfAAAAAAAAAAAAAAAAAK20BABPU0dJLUlORi9sMTBuL2J1bmRsZS5wcm9wZXJ0aWVzUEsBAgoACgAAAAAA46EJPy166thxDwAAcQ8AAAkAAAAAAAAAAAAAAAAAYLUEAHZlcmlmeS5zaFBLBQYAAAAAPQA9ACoVAAD4xAQAAAA=