memoscan
← all memos

Memo 0x394a5ce5…427800 on Ethereum

AgICAgIHRoaXMuc3RhdGUucGxheWJhY2suaXNQbGF5aW5nID0gZmFsc2U7CiAgICAgICAgICAgIExvZ2dlci5pbmZvKCdBVURJTycsICdXaGl0ZSBub2lzZSBzdG9wcGVkJyk7CiAgICAgICAgICAgIAogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgIExvZ2dlci5lcnJvcignQVVESU8nLCAnRmFpbGVkIHRvIHN0b3Agd2hpdGUgbm9pc2U6JywgZXJyb3IpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBVcGRhdGUgdm9sdW1lCiAgICAgKiBAcGFyYW0ge251bWJlcn0gdm9sdW1lIC0gVm9sdW1lIGxldmVsICgwLTEpCiAgICAgKi8KICAgIHNldFZvbHVtZSh2b2x1bWUpIHsKICAgICAgICBpZiAoIXRoaXMuc3RhdGUucGxheWJhY2suaXNJbml0aWFsaXplZCkgcmV0dXJuOwogICAgICAgIAogICAgICAgIHZvbHVtZSA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHZvbHVtZSkpOwogICAgICAgIHRoaXMuc3RhdGUucGFyYW1ldGVycy52b2x1bWUgPSB2b2x1bWU7CiAgICAgICAgCiAgICAgICAgaWYgKHRoaXMuc3RhdGUubm9kZXMuZ2Fpbk5vZGUpIHsKICAgICAgICAgICAgLy8gU21vb3RoIHJhbXAgdG8gYXZvaWQgY2xpY2tzCiAgICAgICAgICAgIGNvbnN0IG5vdyA9IHRoaXMuc3RhdGUuYXVkaW9Db250ZXh0LmN1cnJlbnRUaW1lOwogICAgICAgICAgICB0aGlzLnN0YXRlLm5vZGVzLmdhaW5Ob2RlLmdhaW4uc2V0VGFyZ2V0QXRUaW1lKHZvbHVtZSwgbm93LCAwLjAxKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8qKgogICAgICogVXBkYXRlIGxvdy1wYXNzIGZpbHRlciBmcmVxdWVuY3kgKFBoYXNlIEUgLSBZLWF4aXMgY29udHJvbCkKICAgICAqIEBwYXJhbSB7bnVtYmVyfSBmcmVxdWVuY3kgLSBDdXRvZmYgZnJlcXVlbmN5IGluIEh6ICgyMC0yMDAwMCkKICAgICAqLwogICAgc2V0RmlsdGVyRnJlcXVlbmN5KGZyZXF1ZW5jeSkgewogICAgICAgIGlmICghdGhpcy5zdGF0ZS5wbGF5YmFjay5pc0luaXRpYWxpemVkKSByZXR1cm47CiAgICAgICAgCiAgICAgICAgZnJlcXVlbmN5ID0gTWF0aC5tYXgoMjAsIE1hdGgubWluKDIwMDAwLCBmcmVxdWVuY3kpKTsKICAgICAgICB0aGlzLnN0YXRlLnBhcmFtZXRlcnMuZmlsdGVyRnJlcXVlbmN5ID0gZnJlcXVlbmN5OwogICAgICAgIAogICAgICAgIGlmICh0aGlzLnN0YXRlLm5vZGVzLmZpbHRlck5vZGUpIHsKICAgICAgICAgICAgY29uc3Qgbm93ID0gdGhpcy5zdGF0ZS5hdWRpb0NvbnRleHQuY3VycmVudFRpbWU7CiAgICAgICAgICAgIHRoaXMuc3RhdGUubm9kZXMuZmlsdGVyTm9kZS5mcmVxdWVuY3kuc2V0VGFyZ2V0QXRUaW1lKGZyZXF1ZW5jeSwgbm93LCAwLjAxKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8qKgogICAgICogVXBkYXRlIGZpbHRlciBiYXNlZCBvbiBpbnRlcmFjdGlvbiBZIHBhcmFtZXRlciAoMC0xKQogICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBOb3JtYWxpemVkIFkgcG9zaXRpb24gKDAtMSkKICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNBY3RpdmUgLSBXaGV0aGVyIGludGVyYWN0aW9uIGlzIGFjdGl2ZQogICAgICovCiAgICB1cGRhdGVGaWx0ZXJGcm9tSW50ZXJhY3Rpb24oeSwgaXNBY3RpdmUpIHsKICAgICAgICBpZiAoIXRoaXMuc3RhdGUucGxheWJhY2suaXNJbml0aWFsaXplZCkgcmV0dXJuOwogICAgICAgIAogICAgICAgIC8vIFVwZGF0ZSBpbnRlcmFjdGlvbiBzdGF0ZSBmb3IgZHJvbmUgY29udHJvbAogICAgICAgIHRoaXMuc3RhdGUuZHJvbmVNb2RlLmlzSW50ZXJhY3RpbmcgPSBpc0FjdGl2ZTsKICAgICAgICB0aGlzLnVwZGF0ZURyb25lR2FpbigpOwogICAgICAgIAogICAgICAgIGlmICghaXNBY3RpdmUpIHsKICAgICAgICAgICAgLy8gTm8gaW50ZXJhY3Rpb24gLSBieXBhc3MgZmlsdGVyIChzZXQgdG8gdmVyeSBoaWdoIGZyZXF1ZW5jeSkKICAgICAgICAgICAgdGhpcy5zZXRGaWx0ZXJGcmVxdWVuY3koNDkwMDApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIE1hcCBZIHBhcmFtZXRlciB0byBmaWx0ZXIgZnJlcXVlbmN5IHJhbmdlIHVzaW5nIExPR0FSSVRITUlDIHNjYWxpbmcKICAgICAgICAvLyBUaGlzIG1hdGNoZXMgaHVtYW4gcGVyY2VwdGlvbiBvZiBmcmVxdWVuY3kgKG9jdGF2ZXMgc291bmQgZXZlbikKICAgICAgICAvLyBZPTAgKGJvdHRvbSkgPSBtaW5GcmVxdWVuY3kgKG11ZmZsZWQpCiAgICAgICAgLy8gWT0xICh0b3ApID0gbWF4RnJlcXVlbmN5IChicmlnaHQpCiAgICAgICAgCiAgICAgICAgY29uc3QgbWluRnJlcSA9IHRoaXMuY29uZmlnLmZpbHRlci5taW5GcmVxdWVuY3k7CiAgICAgICAgY29uc3QgbWF4RnJlcSA9IHRoaXMuY29uZmlnLmZpbHRlci5tYXhGcmVxdWVuY3k7CiAgICAgICAgCiAgICAgICAgLy8gTG9nYXJpdGhtaWMgaW50ZXJwb2xhdGlvbjogZnJlcSA9IG1pbkZyZXEgKiAobWF4RnJlcS9taW5GcmVxKV55CiAgICAgICAgY29uc3QgZnJlcXVlbmN5ID0gbWluRnJlcSAqIE1hdGgucG93KG1heEZyZXEgLyBtaW5GcmVxLCB5KTsKICAgICAgICAKICAgICAgICB0aGlzLnNldEZpbHRlckZyZXF1ZW5jeShmcmVxdWVuY3kpOwogICAgfQogICAgCiAgICAvKioKICAgICAqIFNjaGVkdWxlIGEgc2luZ2xlIHB1bHNlIChBRFNSIGVudmVsb3BlKQogICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0VGltZSAtIFdoZW4gdG8gc3RhcnQgdGhlIHB1bHNlIChBdWRpb0NvbnRleHQgdGltZSkKICAgICAqLwogICAgc2NoZWR1bGVQdWxzZShzdGFydFRpbWUpIHsKICAgICAgICBpZiAoIXRoaXMuc3RhdGUucGxheWJhY2suaXNJbml0aWFsaXplZCB8fCAhdGhpcy5zdGF0ZS5ub2Rlcy5yaHl0aG1HYWluKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgZ2FpbiA9IHRoaXMuc3RhdGUubm9kZXMucmh5dGhtR2Fpbi5nYWluOwogICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnLnJoeXRobTsKICAgICAgICAKICAgICAgICAvLyBDYW5jZWwgYW55IHNjaGVkdWxlZCB2YWx1ZXMgYWZ0ZXIgc3RhcnRUaW1lCiAgICAgICAgZ2Fpbi5jYW5jZWxTY2hlZHVsZWRWYWx1ZXMoc3RhcnRUaW1lKTsKICAgICAgICAKICAgICAgICAvLyBBRFNSIEVudmVsb3BlCiAgICAgICAgY29uc3QgYXR0YWNrRW5kID0gc3RhcnRUaW1lICsgY29uZmlnLmF0dGFjazsKICAgICAgICBjb25zdCBkZWNheUVuZCA9IGF0dGFja0VuZCArIGNvbmZpZy5kZWNheTsKICAgICAgICBjb25zdCByZWxlYXNlU3RhcnQgPSBkZWNheUVuZDsgLy8gUmVsZWFzZSBzdGFydHMgaW1tZWRpYXRlbHkgYWZ0ZXIgZGVjYXkgKG5vIGhvbGQgcGhhc2UpCiAgICAgICAgY29uc3QgcmVsZWFzZUVuZCA9IHJlbGVhc2VTdGFydCArIGNvbmZpZy5yZWxlYXNlOwogICAgICAgIAogICAgICAgIC8vIEF0dGFjazogMCDihpIgMQogICAgICAgIGdhaW4uc2V0VmFsdWVBdFRpbWUoMCwgc3RhcnRUaW1lKTsKICAgICAgICBnYWluLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKDEuMCwgYXR0YWNrRW5kKTsKICAgICAgICAKICAgICAgICAvLyBEZWNheTogMSDihpIgc3VzdGFpbiBsZXZlbAogICAgICAgIGdhaW4ubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoY29uZmlnLnN1c3RhaW4sIGRlY2F5RW5kKTsKICAgICAgICAKICAgICAgICAvLyBSZWxlYXNlOiBzdXN0YWluIOKGkiAwCiAgICAgICAgZ2Fpbi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSgwLCByZWxlYXNlRW5kKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTdGFydCByaHl0aG0gc2NoZWR1bGluZyBsb29wCiAgICAgKi8KICAgIHN0YXJ0Umh5dGhtU2NoZWR1bGVyKCkgewogICAgICAgIGlmICh0aGlzLnN0YXRlLnJoeXRobS5zY2hlZHVsZXJUaW1lcikgewogICAgICAgICAgICByZXR1cm47IC8vIEFscmVhZHkgcnVubmluZwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyBTY2hlZHVsZSBwdWxzZXMgcmVndWxhcmx5CiAgICAgICAgdGhpcy5zdGF0ZS5yaHl0aG0uc2NoZWR1bGVyVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVVcGNvbWluZ1B1bHNlcygpOwogICAgICAgIH0sIDUwKTsgLy8gQ2hlY2sgZXZlcnkgNTBtcwogICAgICAgIAogICAgICAgIExvZ2dlci5kZWJ1ZygnQVVESU8nLCAnUmh5dGhtIHNjaGVkdWxlciBzdGFydGVkJyk7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU3RvcCByaHl0aG0gc2NoZWR1bGluZyBsb29wCiAgICAgKi8KICAgIHN0b3BSaHl0aG1TY2hlZHVsZXIoKSB7CiAgICAgICAgaWYgKHRoaXMuc3RhdGUucmh5dGhtLnNjaGVkdWxlclRpbWVyKSB7CiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5zdGF0ZS5yaHl0aG0uc2NoZWR1bGVyVGltZXIpOwogICAgICAgICAgICB0aGlzLnN0YXRlLnJoeXRobS5zY2hlZHVsZXJUaW1lciA9IG51bGw7CiAgICAgICAgICAgIExvZ2dlci5kZWJ1ZygnQVVESU8nLCAnUmh5dGhtIHNjaGVkdWxlciBzdG9wcGVkJyk7CiAgICAgICAgfQogICAgfQogICAgCiAgICAvKioKICAgICAqIFNjaGVkdWxlIHVwY29taW5nIHB1bHNlcyBiYXNlZCBvbiBjdXJyZW50IHJoeXRobSByYXRlCiAgICAgKi8KICAgIHNjaGVkdWxlVXBjb21pbmdQdWxzZXMoKSB7CiAgICAgICAgaWYgKCF0aGlzLnN0YXRlLnBsYXliYWNrLmlzSW5pdGlhbGl6ZWQgfHwgIXRoaXMuc3RhdGUucmh5dGhtLmlzQWN0aXZlKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5zdGF0ZS5hdWRpb0NvbnRleHQ7CiAgICAgICAgY29uc3QgY3VycmVudFRpbWUgPSBjdHguY3VycmVudFRpbWU7CiAgICAgICAgY29uc3QgcmF0ZSA9IHRoaXMuc3RhdGUucmh5dGhtLmN1cnJlbnRSYXRlOwogICAgICAgIAogICAgICAgIGlmIChyYXRlIDw9IDApIHJldHVybjsKICAgICAgICAKICAgICAgICBjb25zdCBpbnRlcnZhbCA9IDEuMCAvIHJhdGU7IC8vIFRpbWUgYmV0d2VlbiBwdWxzZXMKICAgICAgICBjb25zdCBzY2hlZHVsZUFoZWFkID0gdGhpcy5jb25maWcucmh5dGhtLnNjaGVkdWxlQWhlYWQ7CiAgICAgICAgCiAgICAgICAgLy8gU2NoZWR1bGUgcHVsc2VzIHVwIHRvIHNjaGVkdWxlQWhlYWQgdGltZSBpbiB0aGUgZnV0dXJlCiAgICAgICAgd2hpbGUgKHRoaXMuc3RhdGUucmh5dGhtLm5leHRQdWxzZVRpbWUgPCBjdXJyZW50VGltZSArIHNjaGVkdWxlQWhlYWQpIHsKICAgICAgICAgICAgdGhpcy5zY2hlZHVsZVB1bHNlKHRoaXMuc3RhdGUucmh5dGhtLm5leHRQdWxzZVRpbWUpOwogICAgICAgICAgICB0aGlzLnN0YXRlLnJoeXRobS5uZXh0UHVsc2VUaW1lICs9IGludGVydmFsOwogICAgICAgIH0KICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBVcGRhdGUgcmh5dGhtIGJhc2VkIG9uIGludGVyYWN0aW9uIFggcGFyYW1ldGVyICgwLTEpCiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIE5vcm1hbGl6ZWQgWCBwb3NpdGlvbiAoMC0xKQogICAgICogQHBhcmFtIHtib29sZWFufSBpc0FjdGl2ZSAtIFdoZXRoZXIgaW50ZXJhY3Rpb24gaXMgYWN0aXZlCiAgICAgKi8KICAgIHVwZGF0ZVJoeXRobUZyb21JbnRlcmFjdGlvbih4LCBpc0FjdGl2ZSkgewogICAgICAgIGlmICghdGhpcy5zdGF0ZS5wbGF5YmFjay5pc0luaXRpYWxpemVkKSByZXR1cm47CiAgICAgICAgCiAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5zdGF0ZS5hdWRpb0NvbnRleHQ7CiAgICAgICAgY29uc3Qgbm93ID0gY3R4LmN1cnJlbnRUaW1lOwogICAgICAgIAogICAgICAgIGlmICghaXNBY3RpdmUpIHsKICAgICAgICAgICAgLy8gTm8gaW50ZXJhY3Rpb24gLSBjb250aW51b3VzIGRyb25lIChubyByaHl0aG0pCiAgICAgICAgICAgIHRoaXMuc3RvcFJoeXRobSgpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIFg9MCAobGVmdCkgPSBjb250aW51b3VzIGRyb25lIChubyByaHl0aG0pCiAgICAgICAgLy8gWD4wID0gcmh5dGhtaWMgcHVsc2VzIGF0IGluY3JlYXNpbmcgcmF0ZXMKICAgICAgICAKICAgICAgICBjb25zdCBtaW5SYXRlID0gdGhpcy5jb25maWcucmh5dGhtLm1pblJhdGU7CiAgICAgICAgY29uc3QgbWF4UmF0ZSA9IHRoaXMuY29uZmlnLnJoeXRobS5tYXhSYXRlOwogICAgICAgIAogICAgICAgIGlmICh4IDw9IDAuMDEpIHsKICAgICAgICAgICAgLy8gVmVyeSBjbG9zZSB0byBsZWZ0IGVkZ2UgLSBjb250aW51b3VzIGRyb25lCiAgICAgICAgICAgIHRoaXMuc3RvcFJoeXRobSgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSByYXRlIHVzaW5nIGV4cG9uZW50aWFsIHNjYWxpbmcgKGZlZWxzIG1vcmUgbmF0dXJhbCkKICAgICAgICAgICAgLy8geD0wLjAxIOKGkiBtaW5SYXRlLCB4PTEuMCDihpIgbWF4UmF0ZQogICAgICAgICAgICBjb25zdCBub3JtYWxpemVkWCA9ICh4IC0gMC4wMSkgLyAoMS4wIC0gMC4wMSk7IC8vIE5vcm1hbGl6ZSB0byAwLTEgYWZ0ZXIgdGhyZXNob2xkCiAgICAgICAgICAgIGNvbnN0IHJhdGUgPSBtaW5SYXRlICogTWF0aC5wb3cobWF4UmF0ZSAvIG1pblJhdGUsIG5vcm1hbGl6ZWRYKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHRoaXMuc3RhcnRSaHl0aG0ocmF0ZSwgbm93KTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU3RhcnQgb3IgdXBkYXRlIHJoeXRobSBhdCBzcGVjaWZpZWQgcmF0ZQogICAgICogQHBhcmFtIHtudW1iZXJ9IHJhdGUgLSBQdWxzZSByYXRlIGluIEh6CiAgICAgKiBAcGFyYW0ge251bWJlcn0gY3VycmVudFRpbWUgLSBDdXJyZW50IGF1ZGlvIGNvbnRleHQgdGltZQogICAgICovCiAgICBzdGFydFJoeXRobShyYXRlLCBjdXJyZW50VGltZSkgewogICAgICAgIHRoaXMuc3RhdGUucGFyYW1ldGVycy5yaHl0aG1SYXRlID0gcmF0ZTsKICAgICAgICAKICAgICAgICBjb25zdCB3YXNBY3RpdmUgPSB0aGlzLnN0YXRlLnJoeXRobS5pc0FjdGl2ZTsKICAgICAgICBjb25zdCByYXRlQ2hhbmdlZCA9IE1hdGguYWJzKHRoaXMuc3RhdGUucmh5dGhtLmN1cnJlbnRSYXRlIC0gcmF0ZSkgPiAwLjE7CiAgICAgICAgCiAgICAgICAgdGhpcy5zdGF0ZS5yaHl0aG0uaXNBY3RpdmUgPSB0cnVlOwogICAgICAgIHRoaXMuc3RhdGUucmh5dGhtLmN1cnJlbnRSYXRlID0gcmF0ZTsKICAgICAgICAKICAgICAgICBpZiAoIXdhc0FjdGl2ZSkgewogICAgICAgICAgICAvLyBTdGFydGluZyByaHl0aG0gZm9yIHRoZSBmaXJzdCB0aW1lCiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRHYWluID0gdGhpcy5zdGF0ZS5ub2Rlcy5yaHl0aG1HYWluPy5nYWluLnZhbHVlIHx8IDA7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoY3VycmVudEdhaW4gPiAwLjEpIHsKICAgICAgICAgICAgICAgIC8vIENvbWluZyBmcm9tIGNvbnRpbnVvdXMgZHJvbmUgbW9kZSAtIG5lZWQgdG8gcmFtcCBkb3duCiAgICAgICAgICAgICAgICAvLyBTbW9vdGhseSByYW1wIGRvd24gcmh5dGhtIGdhaW4gdG8gMCBiZWZvcmUgZmlyc3QgcHVsc2UKICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXRlLm5vZGVzLnJoeXRobUdhaW4pIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBnYWluID0gdGhpcy5zdGF0ZS5ub2Rlcy5yaHl0aG1HYWluLmdhaW47CiAgICAgICAgICAgICAgICAgICAgZ2Fpbi5jYW5jZWxTY2hlZHVsZWRWYWx1ZXMoY3VycmVudFRpbWUpOwogICAgICAgICAgICAgICAgICAgIGdhaW4uc2V0VmFsdWVBdFRpbWUoY3VycmVudEdhaW4sIGN1cnJlbnRUaW1lKTsKICAgICAgICAgICAgICAgICAgICBnYWluLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKDAsIGN1cnJlbnRUaW1lICsgMC4wMDUpOyAvLyA1bXMgcmFtcCBkb3duCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBTY2hlZHVsZSBmaXJzdCBwdWxzZSBhZnRlciByYW1wIGNvbXBsZXRlcwogICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5yaHl0aG0ubmV4dFB1bHNlVGltZSA9IGN1cnJlbnRUaW1lICsgMC4wMDY7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBBbHJlYWR5IGF0IDAgKGZyb20gZHJvbmUgbW9kZSBPRkYpCiAgICAgICAgICAgICAgICAvLyBEZWxheSBmaXJzdCBwdWxzZSB0byBzdGFydCBBRlRFUiBkcm9uZSBnYWluIHJhbXAgY29tcGxldGVzICgzbXMpCiAgICAgICAgICAgICAgICAvLyBUaGlzIHdheSB0aGUgYXR0YWNrIGhhcHBlbnMgYXQgZnVsbCB2b2x1bWUgaW5zdGVhZCBvZiBmYWRpbmcgaW4KICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUucmh5dGhtLm5leHRQdWxzZVRpbWUgPSBjdXJyZW50VGltZSArIDAuMDAzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICB0aGlzLnN0YXJ0Umh5dGhtU2NoZWR1bGVyKCk7CiAgICAgICAgICAgIExvZ2dlci5kZWJ1ZygnQVVESU8nLCBgUmh5dGhtIHN0YXJ0ZWQgYXQgJHtyYXRlLnRvRml4ZWQoMil9IEh6YCk7CiAgICAgICAgfSBlbHNlIGlmIChyYXRlQ2hhbmdlZCkgewogICAgICAgICAgICAvLyBSYXRlIGNoYW5nZWQgc2lnbmlmaWNhbnRseSAtIHJlc3luYyBwdWxzZSB0aW1pbmcKICAgICAgICAgICAgY29uc3QgaW50ZXJ2YWwgPSAxLjAgLyByYXRlOwogICAgICAgICAgICAvLyBBbGlnbiBuZXh0IHB1bHNlIHRvIG5ldyBpbnRlcnZhbAogICAgICAgICAgICB0aGlzLnN0YXRlLnJoeXRobS5uZXh0UHVsc2VUaW1lID0gY3VycmVudFRpbWUgKyBpbnRlcnZhbDsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU3RvcCByaHl0aG0gKHJldHVybiB0byBjb250aW51b3VzIGRyb25lIG9yIHNpbGVuY2UpCiAgICAgKi8KICAgIHN0b3BSaHl0aG0oKSB7CiAgICAgICAgaWYgKCF0aGlzLnN0YXRlLnJoeXRobS5pc0FjdGl2ZSkgcmV0dXJuOwogICAgICAgIAogICAgICAgIHRoaXMuc3RhdGUucmh5dGhtLmlzQWN0aXZlID0gZmFsc2U7CiAgICAgICAgdGhpcy5zdGF0ZS5yaHl0aG0uY3VycmVudFJhdGUgPSAwOwogICAgICAgIHRoaXMuc3RhdGUucGFyYW1ldGVycy5yaHl0aG1SYXRlID0gMDsKICAgICAgICB0aGlzLnN0b3BSaHl0aG1TY2hlZHVsZXIoKTsKICAgICAgICAKICAgICAgICAvLyBTZXQgcmh5dGhtIGdhaW4gYmFzZWQgb24gaW50ZXJhY3Rpb24gc3RhdGUgYW5kIGRyb25lIG1vZGUKICAgICAgICAvLyBJZiBjdXJyZW50bHkgaW50ZXJhY3RpbmcgKGRyYWdnaW5nKTogYWx3YXlzIDEuMCAoY29udGludW91cyBkcm9uZSB3aGlsZSBob2xkaW5nKQogICAgICAgIC8vIElmIG5vdCBpbnRlcmFjdGluZzogZGVwZW5kcyBvbiBkcm9uZSBtb2RlICgxLjAgaWYgT04sIDAuMCBpZiBPRkYpCiAgICAgICAgaWYgKHRoaXMuc3RhdGUubm9kZXMucmh5dGhtR2FpbikgewogICAgICAgICAgICBjb25zdCBnYWluID0gdGhpcy5zdGF0ZS5ub2Rlcy5yaHl0aG1HYWluLmdhaW47CiAgICAgICAgICAgIGNvbnN0IG5vdyA9IHRoaXMuc3RhdGUuYXVkaW9Db250ZXh0LmN1cnJlbnRUaW1lOwogICAgICAgICAgICBnYWluLmNhbmNlbFNjaGVkdWxlZFZhbHVlcyhub3cpOwogICAgICAgICAgICAKICAgICAgICAgICAgY29uc3QgdGFyZ2V0R2FpbiA9IHRoaXMuc3RhdGUuZHJvbmVNb2RlLmlzSW50ZXJhY3RpbmcgPyAxLjAgOiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuc3RhdGUuZHJvbmVNb2RlLmVuYWJsZWQgPyAxLjAgOiAwLjApOwogICAgICAgICAgICBnYWluLnNldFRhcmdldEF0VGltZSh0YXJnZXRHYWluLCBub3csIDAuMDEpOyAvLyBTbW9vdGggdHJhbnNpdGlvbgogICAgICAgIH0KICAgICAgICAKICAgICAgICBMb2dnZXIuZGVidWcoJ0FVRElPJywgJ1JoeXRobSBzdG9wcGVkIChjb250aW51b3VzIGRyb25lKScpOwogICAgfQogICAgCiAgICAvKioKICAgICAqIFVwZGF0ZSBkcm9uZSBnYWluIGJhc2VkIG9uIGludGVyYWN0aW9uIHN0YXRlIGFuZCBkcm9uZSBtb2RlCiAgICAgKi8KICAgIHVwZGF0ZURyb25lR2FpbigpIHsKICAgICAgICBpZiAoIXRoaXMuc3RhdGUucGxheWJhY2suaXNJbml0aWFsaXplZCB8fCAhdGhpcy5zdGF0ZS5ub2Rlcy5kcm9uZUdhaW4pIHJldHVybjsKICAgICAgICAKICAgICAgICBjb25zdCBjdHggPSB0aGlzLnN0YXRlLmF1ZGlvQ29udGV4dDsKICAgICAgICBjb25zdCBub3cgPSBjdHguY3VycmVudFRpbWU7CiAgICAgICAgY29uc3QgZ2FpbiA9IHRoaXMuc3RhdGUubm9kZXMuZHJvbmVHYWluLmdhaW47CiAgICAgICAgCiAgICAgICAgLy8gV2hlbiBpbnRlcmFjdGluZzogYWx3YXlzIGZ1bGwgdm9sdW1lICgxLjApCiAgICAgICAgLy8gV2hlbiBub3QgaW50ZXJhY3Rpbmc6IGRlcGVuZHMgb24gZHJvbmUgbW9kZSAoMS4wIGlmIE9OLCAwLjAgaWYgT0ZGKQogICAgICAgIGNvbnN0IGN1cnJlbnRHYWluID0gZ2Fpbi52YWx1ZTsKICAgICAgICBjb25zdCB0YXJnZXRHYWluID0gdGhpcy5zdGF0ZS5kcm9uZU1vZGUuaXNJbnRlcmFjdGluZyA/IDEuMCA6IAogICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLnN0YXRlLmRyb25lTW9kZS5lbmFibGVkID8gMS4wIDogMC4wKTsKICAgICAgICAKICAgICAgICAvLyBDYW5jZWwgYW55IHNjaGVkdWxlZCBjaGFuZ2VzCiAgICAgICAgZ2Fpbi5jYW5jZWxTY2hlZHVsZWRWYWx1ZXMobm93KTsKICAgICAgICAKICAgICAgICAvLyBVc2Ugc2hvcnQgZmFkZS1pbiB3aGVuIGdvaW5nIGZyb20gc2lsZW5jZSB0byBzb3VuZCAoMCDihpIgMSkKICAgICAgICAvLyBUaGlzIHByZXZlbnRzIGNsaWNrL3BvcCB3aGVuIHN0YXJ0aW5nIGludGVyYWN0aW9uIGluIGRyb25lIG1vZGUgT0ZGCiAgICAgICAgaWYgKGN1cnJlbnRHYWluID09PSAwLjAgJiYgdGFyZ2V0R2FpbiA9PT0gMS4wKSB7CiAgICAgICAgICAgIC8vIEZhc3QgM21zIGZhZGUtaW4gZm9yIHJlc3BvbnNpdmUgZmVlbAogICAgICAgICAgICAvLyBSaHl0aG0gZ2FpbiBpcyBhbHJlYWR5IGF0IDAgKG5vIHJhbXAgbmVlZGVkKSwgc28gd2UgY2FuIGJlIHF1aWNrCiAgICAgICAgICAgIGdhaW4uc2V0VmFsdWVBdFRpbWUoMC4wLCBub3cpOwogICAgICAgICAgICBnYWluLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKDEuMCwgbm93ICsgMC4wMDMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIEltbWVkaWF0ZSBjaGFuZ2UgZm9yIGFsbCBvdGhlciB0cmFuc2l0aW9ucyAoaGFyZCBjdXQpCiAgICAgICAgICAgIC8vIFRoaXMgaW5jbHVkZXM6IDHihpIwIChzdG9wcGluZyksIDDihpIwIChzdGF5aW5nIHNpbGVudCksIDHihpIxIChzdGF5aW5nIGF1ZGlibGUpCiAgICAgICAgICAgIGdhaW4uc2V0VmFsdWVBdFRpbWUodGFyZ2V0R2Fpbiwgbm93KTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBUb2dnbGUgZHJvbmUgbW9kZSAoc3BhY2UgYmFyKQogICAgICovCiAgICB0b2dnbGVEcm9uZU1vZGUoKSB7CiAgICAgICAgaWYgKCF0aGlzLnN0YXRlLnBsYXliYWNrLmlzSW5pdGlhbGl6ZWQpIHJldHVybjsKICAgICAgICAKICAgICAgICAvLyBUb2dnbGUgdGhlIG1vZGUKICAgICAgICB0aGlzLnN0YXRlLmRyb25lTW9kZS5lbmFibGVkID0gIXRoaXMuc3RhdGUuZHJvbmVNb2RlLmVuYWJsZWQ7CiAgICAgICAgCiAgICAgICAgLy8gVXBkYXRlIGRyb25lIGdhaW4gaW1tZWRpYXRlbHkKICAgICAgICB0aGlzLnVwZGF0ZURyb25lR2FpbigpOwogICAgICAgIAogICAgICAgIC8vIElmIG5vdCBjdXJyZW50bHkgaW50ZXJhY3RpbmcsIHVwZGF0ZSByaHl0aG0gZ2FpbiB0b28KICAgICAgICAvLyBEcm9uZSBPTjogcmh5dGhtIGdhaW4gc2hvdWxkIGJlIDEuMCAoY29udGludW91cykKICAgICAgICAvLyBEcm9uZSBPRkY6IHJoeXRobSBnYWluIHNob3VsZCBiZSAwLjAgKHJlYWR5IGZvciBpbnN0YW50IGZpcnN0IG5vdGUpCiAgICAgICAgaWYgKCF0aGlzLnN0YXRlLmRyb25lTW9kZS5pc0ludGVyYWN0aW5nICYmICF0aGlzLnN0YXRlLnJoeXRobS5pc0FjdGl2ZSkgewogICAgICAgICAgICBpZiAodGhpcy5zdGF0ZS5ub2Rlcy5yaHl0aG1HYWluKSB7CiAgICAgICAgICAgICAgICBjb25zdCBnYWluID0gdGhpcy5zdGF0ZS5ub2Rlcy5yaHl0aG1HYWluLmdhaW47CiAgICAgICAgICAgICAgICBjb25zdCBub3cgPSB0aGlzLnN0YXRlLmF1ZGlvQ29udGV4dC5jdXJyZW50VGltZTsKICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldEdhaW4gPSB0aGlzLnN0YXRlLmRyb25lTW9kZS5lbmFibGVkID8gMS4wIDogMC4wOwogICAgICAgICAgICAgICAgZ2Fpbi5jYW5jZWxTY2hlZHVsZWRWYWx1ZXMobm93KTsKICAgICAgICAgICAgICAgIGdhaW4uc2V0VGFyZ2V0QXRUaW1lKHRhcmdldEdhaW4sIG5vdywgMC4wMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgTG9nZ2VyLmluZm8oJ0FVRElPJywgYERyb25lIG1vZGU6ICR7dGhpcy5zdGF0ZS5kcm9uZU1vZGUuZW5hYmxlZCA/ICdPTicgOiAnT0ZGJ31gKTsKICAgIH0KCiAgICAvKioKICAgICAqIEhhbmRsZSBmaXJzdCB1c2VyIGludGVyYWN0aW9uIChzdGFydCBhdWRpbykKICAgICAqLwogICAgYXN5bmMgaGFuZGxlRmlyc3RJbnRlcmFjdGlvbigpIHsKICAgICAgICBpZiAoIXRoaXMuc3RhdGUucGxheWJhY2suaXNJbml0aWFsaXplZCkgewogICAgICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgdGhpcy5pbml0aWFsaXplKCk7CiAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAvLyBGb3JjZSByZXN1bWUgb24gQW5kcm9pZCAoZXh0cmEgYWdncmVzc2l2ZSB1bmxvY2spCiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0ZS5hdWRpb0NvbnRleHQuc3RhdGUgPT09ICdzdXNwZW5kZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmluZm8oJ0FVRElPJywgJ0ZvcmNpbmcgQXVkaW9Db250ZXh0IHJlc3VtZSBvbiBmaXJzdCBpbnRlcmFjdGlvbi4uLicpOwogICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RhdGUuYXVkaW9Db250ZXh0LnJlc3VtZSgpOwogICAgICAgICAgICAgICAgICAgIExvZ2dlci5pbmZvKCdBVURJTycsIGBBdWRpb0NvbnRleHQgc3RhdGUgYWZ0ZXIgcmVzdW1lOiAke3RoaXMuc3RhdGUuYXVkaW9Db250ZXh0LnN0YXRlfWApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zdGFydFdoaXRlTm9pc2UoKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuc3RhdGUucGxheWJhY2suaXNQbGF5aW5nKSB7CiAgICAgICAgICAgIC8vIEZvcmNlIHJlc3VtZSBvbiBBbmRyb2lkIChleHRyYSBhZ2dyZXNzaXZlIHVubG9jaykKICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGUuYXVkaW9Db250ZXh0LnN0YXRlID09PSAnc3VzcGVuZGVkJykgewogICAgICAgICAgICAgICAgTG9nZ2VyLmluZm8oJ0FVRElPJywgJ0ZvcmNpbmcgQXVkaW9Db250ZXh0IHJlc3VtZS4uLicpOwogICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zdGF0ZS5hdWRpb0NvbnRleHQucmVzdW1lKCk7CiAgICAgICAgICAgICAgICBMb2dnZXIuaW5mbygnQVVESU8nLCBgQXVkaW9Db250ZXh0IHN0YXRlIGFmdGVyIHJlc3VtZTogJHt0aGlzLnN0YXRlLmF1ZGlvQ29udGV4dC5zdGF0ZX1gKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhd2FpdCB0aGlzLnN0YXJ0V2hpdGVOb2lzZSgpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBHZXQgYXVkaW8gY29udHJvbGxlciBzdGF0ZSBmb3IgZGVidWdnaW5nCiAgICAgKi8KICAgIGdldFN0YXRlKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGlzSW5pdGlhbGl6ZWQ6IHRoaXMuc3RhdGUucGxheWJhY2suaXNJbml0aWFsaXplZCwKICAgICAgICAgICAgaXNQbGF5aW5nOiB0aGlzLnN0YXRlLnBsYXliYWNrLmlzUGxheWluZywKICAgICAgICAgICAgYXVkaW9Db250ZXh0U3RhdGU6IHRoaXMuc3RhdGUuYXVkaW9Db250ZXh0Py5zdGF0ZSB8fCAnbm90IGNyZWF0ZWQnLAogICAgICAgICAgICBwYXJhbWV0ZXJzOiB7IC4uLnRoaXMuc3RhdGUucGFyYW1ldGVycyB9LAogICAgICAgICAgICByaHl0aG06IHsKICAgICAgICAgICAgICAgIGlzQWN0aXZlOiB0aGlzLnN0YXRlLnJoeXRobS5pc0FjdGl2ZSwKICAgICAgICAgICAgICAgIGN1cnJlbnRSYXRlOiB0aGlzLnN0YXRlLnJoeXRobS5jdXJyZW50UmF0ZQogICAgICAgICAgICB9LAogICAgICAgICAgICBkcm9uZU1vZGU6IHsKICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRoaXMuc3RhdGUuZHJvbmVNb2RlLmVuYWJsZWQsCiAgICAgICAgICAgICAgICBpc0ludGVyYWN0aW5nOiB0aGlzLnN0YXRlLmRyb25lTW9kZS5pc0ludGVyYWN0aW5nCiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfQogICAgCiAgICAvKioKICAgICAqIENsZWFuIHVwIGF1ZGlvIHJlc291cmNlcwogICAgICovCiAgICBkZXN0cm95KCkgewogICAgICAgIHRoaXMuc3RvcFJoeXRobVNjaGVkdWxlcigpOwogICAgICAgIHRoaXMuc3RvcFdoaXRlTm9pc2UoKTsKICAgICAgICAKICAgICAgICBpZiAodGhpcy5zdGF0ZS5hdWRpb0NvbnRleHQpIHsKICAgICAgICAgICAgdGhpcy5zdGF0ZS5hdWRpb0NvbnRleHQuY2xvc2UoKTsKICAgICAgICAgICAgdGhpcy5zdGF0ZS5hdWRpb0NvbnRleHQgPSBudWxsOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBMb2dnZXIuaW5mbygnQVVESU8nLCAnQXVkaW9Db250cm9sbGVyIGRlc3Ryb3llZCcpOwogICAgfQp9CgpBdWRpb0NvbnRyb2xsZXI7CgoKLy8gSW5wdXRDb250cm9sbGVyIC0gTW91c2UgYW5kIHRvdWNoIGludGVyYWN0aW9uIGZvciBlZmZlY3QgcGFyYW1ldGVycwovLyBQaGFzZSBDOiBZLWF4aXMgcGl4ZWxpemF0aW9uIGNvbnRyb2wKLy8gQmFzZWQgb24gd2ViX0dQVV9taXhlciBYWVBhZENvbnRyb2xsZXIsIHNpbXBsaWZpZWQgZm9yIG91ciBuZWVkcwoKY2xhc3MgSW5wdXRDb250cm9sbGVyIHsKICAgIGNvbnN0cnVjdG9yKGNhbnZhcywgZWZmZWN0TWFuYWdlciwgYXVkaW9Db250cm9sbGVyID0gbnVsbCwgYXBwID0gbnVsbCkgewogICAgICAgIC8vIFZhbGlkYXRlIGRlcGVuZGVuY2llcwogICAgICAgIGlmICghY2FudmFzKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW5wdXRDb250cm9sbGVyIHJlcXVpcmVzIGNhbnZhcyBlbGVtZW50Jyk7CiAgICAgICAgfQogICAgICAgIGlmICghZWZmZWN0TWFuYWdlcikgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0lucHV0Q29udHJvbGxlciByZXF1aXJlcyBFZmZlY3RNYW5hZ2VyIGluc3RhbmNlJyk7CiAgICAgICAgfQoKICAgICAgICB0aGlzLmNhbnZhcyA9IGNhbnZhczsKICAgICAgICB0aGlzLmVmZmVjdE1hbmFnZXIgPSBlZmZlY3RNYW5hZ2VyOwogICAgICAgIHRoaXMuYXVkaW9Db250cm9sbGVyID0gYXVkaW9Db250cm9sbGVyOyAvLyBPcHRpb25hbCBhdWRpbyBjb250cm9sbGVyIChQaGFzZSBEKQogICAgICAgIHRoaXMuYXBwID0gYXBwOyAvLyBPcHRpb25hbCBhcHAgcmVmZXJlbmNlIGZvciBvcmllbnRhdGlvbiBsb2NrIChQaGFzZSBGKQogICAgICAgIAogICAgICAgIC8vIFN0cnVjdHVyZWQgc3RhdGUKICAgICAgICB0aGlzLnN0YXRlID0gewogICAgICAgICAgICAvLyBJbnRlcmFjdGlvbiBzdGF0ZQogICAgICAgICAgICBpbnRlcmFjdGlvbjogewogICAgICAgICAgICAgICAgaXNBY3RpdmU6IGZhbHNlLAogICAgICAgICAgICAgICAgdHlwZTogbnVsbCwgICAgICAgICAgICAgICAvLyAnbW91c2UnIG9yICd0b3VjaCcKICAgICAgICAgICAgICAgIHBvc2l0aW9uOiB7IHg6IDAuNSwgeTogMC41IH0sCiAgICAgICAgICAgICAgICB0b3VjaElkOiBudWxsICAgICAgICAgICAgIC8vIFRyYWNrIGZpcnN0IHRvdWNoIGZvciBtdWx0aS10b3VjaCBoYW5kbGluZwogICAgICAgICAgICB9LAogICAgICAgICAgICAKICAgICAgICAgICAgLy8gRHJvbmUgbW9kZSB0b2dnbGUgc3RhdGUgKHNwYWNlIGJhciBhbmQgMy1maW5nZXIgZ2VzdHVyZSkKICAgICAgICAgICAgZHJvbmVUb2dnbGU6IHsKICAgICAgICAgICAgICAgIHBlbmRpbmdUb2dnbGU6IGZhbHNlLCAgICAgLy8gUXVldWUgdG9nZ2xlIGlmIHNwYWNlIHByZXNzZWQgZHVyaW5nIGludGVyYWN0aW9uCiAgICAgICAgICAgICAgICB0aHJlZUZpbmdlckFjdGl2ZTogZmFsc2UgIC8vIFRyYWNrIGlmIDMtZmluZ2VyIGdlc3R1cmUgaXMgY3VycmVudGx5IGFjdGl2ZQogICAgICAgICAgICB9LAogICAgICAgICAgICAKICAgICAgICAgICAgLy8gQ29uZmlndXJhdGlvbgogICAgICAgICAgICBjb25maWc6IHsKICAgICAgICAgICAgICAgIGludmVydFk6IHRydWUsICAgICAgICAgICAgLy8gSW52ZXJ0IFkgYXhpcyAoc2NyZWVuIFkgaW5jcmVhc2VzIGRvd24sIHBhcmFtZXRlciBZIHNob3VsZCBpbmNyZWFzZSB1cCkKICAgICAgICAgICAgICAgIGVuYWJsZUxvZ2dpbmc6IGZhbHNlICAgICAgLy8gRW5hYmxlIGRldGFpbGVkIGxvZ2dpbmcgZm9yIGRlYnVnZ2luZwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgLy8gQmluZCBldmVudCBoYW5kbGVycyB0byBtYWludGFpbiAndGhpcycgY29udGV4dAogICAgICAgIHRoaXMuaGFuZGxlTW91c2VEb3duID0gdGhpcy5oYW5kbGVNb3VzZURvd24uYmluZCh0aGlzKTsKICAgICAgICB0aGlzLmhhbmRsZU1vdXNlTW92ZSA9IHRoaXMuaGFuZGxlTW91c2VNb3ZlLmJpbmQodGhpcyk7CiAgICAgICAgdGhpcy5oYW5kbGVNb3VzZVVwID0gdGhpcy5oYW5kbGVNb3VzZVVwLmJpbmQodGhpcyk7CiAgICAgICAgCiAgICAgICAgdGhpcy5oYW5kbGVUb3VjaFN0YXJ0ID0gdGhpcy5oYW5kbGVUb3VjaFN0YXJ0LmJpbmQodGhpcyk7CiAgICAgICAgdGhpcy5oYW5kbGVUb3VjaE1vdmUgPSB0aGlzLmhhbmRsZVRvdWNoTW92ZS5iaW5kKHRoaXMpOwogICAgICAgIHRoaXMuaGFuZGxlVG91Y2hFbmQgPSB0aGlzLmhhbmRsZVRvdWNoRW5kLmJpbmQodGhpcyk7CiAgICAgICAgdGhpcy5oYW5kbGVUb3VjaENhbmNlbCA9IHRoaXMuaGFuZGxlVG91Y2hDYW5jZWwuYmluZCh0aGlzKTsKICAgICAgICAKICAgICAgICB0aGlzLmhhbmRsZUtleURvd24gPSB0aGlzLmhhbmRsZUtleURvd24uYmluZCh0aGlzKTsKCiAgICAgICAgdGhpcy5zZXR1cEV2ZW50TGlzdGVuZXJzKCk7CiAgICAgICAgCiAgICAgICAgTG9nZ2VyLmluZm8oJ0lOUFVUJywgJ0lucHV0Q29udHJvbGxlciBjcmVhdGVkJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgdXAgbW91c2UgYW5kIHRvdWNoIGV2ZW50IGxpc3RlbmVycyBvbiB0aGUgY2FudmFzCiAgICAgKi8KICAgIHNldHVwRXZlbnRMaXN0ZW5lcnMoKSB7CiAgICAgICAgLy8gTW91c2UgZXZlbnRzCiAgICAgICAgLy8gbW91c2Vkb3duIG9ubHkgb24gY2FudmFzICh0byBpbml0aWF0ZSBpbnRlcmFjdGlvbikKICAgICAgICB0aGlzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLmhhbmRsZU1vdXNlRG93biwgeyBwYXNzaXZlOiBmYWxzZSB9KTsKICAgICAgICAvLyBtb3VzZW1vdmUgYW5kIG1vdXNldXAgb24gd2luZG93ICh0byB0cmFjayBldmVuIHdoZW4gZHJhZ2dpbmcgb3V0c2lkZSBjYW52YXMpCiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuaGFuZGxlTW91c2VNb3ZlLCB7IHBhc3NpdmU6IGZhbHNlIH0pOwogICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5oYW5kbGVNb3VzZVVwLCB7IHBhc3NpdmU6IGZhbHNlIH0pOwogICAgICAgIAogICAgICAgIC8vIFRvdWNoIGV2ZW50cyAobW9iaWxlKQogICAgICAgIHRoaXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLmhhbmRsZVRvdWNoU3RhcnQsIHsgcGFzc2l2ZTogZmFsc2UgfSk7CiAgICAgICAgdGhpcy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5oYW5kbGVUb3VjaE1vdmUsIHsgcGFzc2l2ZTogZmFsc2UgfSk7CiAgICAgICAgdGhpcy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLmhhbmRsZVRvdWNoRW5kLCB7IHBhc3NpdmU6IGZhbHNlIH0pOwogICAgICAgIHRoaXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJywgdGhpcy5oYW5kbGVUb3VjaENhbmNlbCwgeyBwYXNzaXZlOiBmYWxzZSB9KTsKICAgICAgICAKICAgICAgICAvLyBLZXlib2FyZCBldmVudHMgKHNwYWNlIGJhciBmb3IgZHJvbmUgdG9nZ2xlKQogICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5oYW5kbGVLZXlEb3duLCB7IHBhc3NpdmU6IGZhbHNlIH0pOwogICAgICAgIAogICAgICAgIC8vIFByZXZlbnQgY29udGV4dCBtZW51IG9uIHJpZ2h0IGNsaWNrCiAgICAgICAgdGhpcy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCAoZSkgPT4gZS5wcmV2ZW50RGVmYXVsdCgpLCB7IHBhc3NpdmU6IGZhbHNlIH0pOwogICAgICAgIAogICAgICAgIExvZ2dlci5kZWJ1ZygnSU5QVVQnLCAnRXZlbnQgbGlzdGVuZ