LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKgogKiBDb250cmlidXRvcnM6CiAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsOwoKaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CmltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwppbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CmltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKaW1wb3J0IGphdmEudXRpbC5NYXA7CgppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CmltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLio7CmltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLmh0dHAuUmVzZW5kSFRUUFJlcXVlc3Q7Ci8qKgogKiAKICovCnB1YmxpYyBjbGFzcyBNb25pdG9yTWFuYWdlciB7Cglwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUREID0gMDsKCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDSEFOR0UgPSAxOwoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFTU9WRSA9IDI7CgoJLy8gbW9uaXRvcnMKCXByb3RlY3RlZCBMaXN0IG1vbml0b3JzOwoJcHJvdGVjdGVkIE1hcCB0aHJlYWRzID0gbmV3IEhhc2hNYXAoKTsKCQoJcHJvdGVjdGVkIExpc3QgbW9uaXRvckxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKCglwcml2YXRlIFByZWZlcmVuY2VzLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHBjbDsKCXByb3RlY3RlZCBib29sZWFuIGlnbm9yZVByZWZlcmVuY2VDaGFuZ2VzID0gZmFsc2U7CgkKCXByb3RlY3RlZCBNYXAgcmVzZW5kTWFwID0gbmV3IEhhc2hNYXAoKTsKCQoJcHJvdGVjdGVkIHN0YXRpYyBNb25pdG9yTWFuYWdlciBpbnN0YW5jZTsKCQoJc3RhdGljIHsKCQlNb25pdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZXhlY3V0ZVN0YXJ0dXBzKCk7Cgl9CgkKCS8qKgoJICogUmV0dXJuIGEgc3RhdGljIGluc3RhbmNlLgoJICogCgkgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZQoJICovCglwdWJsaWMgc3RhdGljIE1vbml0b3JNYW5hZ2VyIGdldEluc3RhbmNlKCkgewoJCWlmIChpbnN0YW5jZSA9PSBudWxsKQoJCQlpbnN0YW5jZSA9IG5ldyBNb25pdG9yTWFuYWdlcigpOwoJCgkJcmV0dXJuIGluc3RhbmNlOwoJfQoJCglwcml2YXRlIE1vbml0b3JNYW5hZ2VyKCkgewoJCWxvYWRNb25pdG9ycygpOwoJCQoJCXBjbCA9IG5ldyBQcmVmZXJlbmNlcy5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJlZmVyZW5jZXMuUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewoJCQkJaWYgKGlnbm9yZVByZWZlcmVuY2VDaGFuZ2VzKQoJCQkJCXJldHVybjsKCQkJCVN0cmluZyBwcm9wZXJ0eSA9IGV2ZW50LmdldFByb3BlcnR5KCk7CgkJCQlpZiAocHJvcGVydHkuZXF1YWxzKCJtb25pdG9ycyIpKSB7CgkJCQkJbG9hZE1vbml0b3JzKCk7CgkJCQl9CgkJCX0KCQl9OwoJCQoJCU1vbml0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocGNsKTsKCX0KCQoJcHJvdGVjdGVkIHZvaWQgZGlzcG9zZSgpIHsKCQlNb25pdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHBjbCk7Cgl9CgkKCS8qKgoJICogQ3JlYXRlIGEgbmV3IG1vbml0b3IuCgkgKiAKCSAqIEByZXR1cm4gdGhlIG5ldyBtb25pdG9yCgkgKi8KCXB1YmxpYyBJTW9uaXRvcldvcmtpbmdDb3B5IGNyZWF0ZU1vbml0b3IoKSB7CgkJcmV0dXJuIG5ldyBNb25pdG9yV29ya2luZ0NvcHkoKTsKCX0KCQoJLyoqCgkgKiBSZXR1cm4gdGhlIGxpc3Qgb2YgbW9uaXRvcnMuCgkgKiAKCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgbW9uaXRvcnMKCSAqLwoJcHVibGljIExpc3QgZ2V0TW9uaXRvcnMoKSB7CgkJcmV0dXJuIG5ldyBBcnJheUxpc3QobW9uaXRvcnMpOwoJfQoKCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBhZGRNb25pdG9yKElNb25pdG9yIG1vbml0b3IpIHsKCQlpZiAoIW1vbml0b3JzLmNvbnRhaW5zKG1vbml0b3IpKQoJCQltb25pdG9ycy5hZGQobW9uaXRvcik7CgkJZmlyZU1vbml0b3JFdmVudChtb25pdG9yLCBBREQpOwoJCXNhdmVNb25pdG9ycygpOwoJfQoJCglwcm90ZWN0ZWQgYm9vbGVhbiBpc1J1bm5pbmcoSU1vbml0b3IgbW9uaXRvcikgewoJCXJldHVybiAodGhyZWFkcy5nZXQobW9uaXRvcikgIT0gbnVsbCk7Cgl9CgoJLyoqCgkgKiBTdGFydCBhIG1vbml0b3IuCgkgKiAKCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBtb25pdG9yCgkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KCSAqLwoJcHVibGljIHZvaWQgc3RhcnRNb25pdG9yKElNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKCQlpZiAoIW1vbml0b3JzLmNvbnRhaW5zKG1vbml0b3IpKQoJCQlyZXR1cm47CgkJCgkJaWYgKEFjY2VwdFRocmVhZC5pc1BvcnRJblVzZShtb25pdG9yLmdldExvY2FsUG9ydCgpKSkKCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBNb25pdG9yUGx1Z2luLlBMVUdJTl9JRCwgMCwgTW9uaXRvclBsdWdpbi5nZXRSZXNvdXJjZSgiJWVycm9yUG9ydEluVXNlIiwgbW9uaXRvci5nZXRMb2NhbFBvcnQoKSArICIiKSwgbnVsbCkpOwoJCQoJCUFjY2VwdFRocmVhZCB0aHJlYWQgPSBuZXcgQWNjZXB0VGhyZWFkKG1vbml0b3IpOwoJCXRocmVhZC5zdGFydFNlcnZlcigpOwoJCXRocmVhZHMucHV0KG1vbml0b3IsIHRocmVhZCk7Cgl9CgkKCS8qKgoJICogU3RvcCBhIG1vbml0b3IuCgkgKiAKCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBtb25pdG9yCgkgKi8KCXB1YmxpYyB2b2lkIHN0b3BNb25pdG9yKElNb25pdG9yIG1vbml0b3IpIHsKCQlpZiAoIW1vbml0b3JzLmNvbnRhaW5zKG1vbml0b3IpKQoJCQlyZXR1cm47CgkJCgkJQWNjZXB0VGhyZWFkIHRocmVhZCA9IChBY2NlcHRUaHJlYWQpIHRocmVhZHMuZ2V0KG1vbml0b3IpOwoJCWlmICh0aHJlYWQgIT0gbnVsbCkgewoJCQl0aHJlYWQuc3RvcFNlcnZlcigpOwoJCQl0aHJlYWRzLnJlbW92ZShtb25pdG9yKTsKCQl9Cgl9CgkKCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVNb25pdG9yKElNb25pdG9yIG1vbml0b3IpIHsKCQlpZiAobW9uaXRvci5pc1J1bm5pbmcoKSkKCQkJc3RvcE1vbml0b3IobW9uaXRvcik7CgkJbW9uaXRvcnMucmVtb3ZlKG1vbml0b3IpOwoJCWZpcmVNb25pdG9yRXZlbnQobW9uaXRvciwgUkVNT1ZFKTsKCQlzYXZlTW9uaXRvcnMoKTsKCX0KCQoJcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIG1vbml0b3JDaGFuZ2VkKElNb25pdG9yIG1vbml0b3IpIHsKCQlmaXJlTW9uaXRvckV2ZW50KG1vbml0b3IsIENIQU5HRSk7CgkJc2F2ZU1vbml0b3JzKCk7Cgl9CgkKCXByb3RlY3RlZCBib29sZWFuIGV4aXN0cyhJTW9uaXRvciBtb25pdG9yKSB7CgkJcmV0dXJuIChtb25pdG9ycy5jb250YWlucyhtb25pdG9yKSk7Cgl9CgkKCS8qKgoJICogQWRkIG1vbml0b3IgbGlzdGVuZXIuCgkgKiAKCSAqIEBwYXJhbSBsaXN0ZW5lcgoJICovCglwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkTW9uaXRvckxpc3RlbmVyKElNb25pdG9yTGlzdGVuZXIgbGlzdGVuZXIpIHsKCQlpZiAoIW1vbml0b3JMaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKQoJCQltb25pdG9yTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Cgl9CgoJLyoqCgkgKiBSZW1vdmUgbW9uaXRvciBsaXN0ZW5lci4KCSAqIAoJICogQHBhcmFtIGxpc3RlbmVyCgkgKi8KCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVNb25pdG9yTGlzdGVuZXIoSU1vbml0b3JMaXN0ZW5lciBsaXN0ZW5lcikgewoJCWlmIChtb25pdG9yTGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkKCQkJbW9uaXRvckxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwoJfQoJCgkvKioKCSAqIEZpcmUgYSBtb25pdG9yIGV2ZW50LgoJICogCgkgKiBAcGFyYW0gbW9uaXRvciB0aGUgbW9uaXRvcgoJICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgZXZlbnQKCSAqLwoJcHJvdGVjdGVkIHZvaWQgZmlyZU1vbml0b3JFdmVudChJTW9uaXRvciBtb25pdG9yLCBpbnQgdHlwZSkgewoJCU9iamVjdFtdIG9iaiA9IG1vbml0b3JMaXN0ZW5lcnMudG9BcnJheSgpOwoJCQoJCWludCBzaXplID0gb2JqLmxlbmd0aDsKCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewoJCQlJTW9uaXRvckxpc3RlbmVyIGxpc3RlbmVyID0gKElNb25pdG9yTGlzdGVuZXIpIG9ialtpXTsKCQkJaWYgKHR5cGUgPT0gQUREKQoJCQkJbGlzdGVuZXIubW9uaXRvckFkZGVkKG1vbml0b3IpOwoJCQllbHNlIGlmICh0eXBlID09IENIQU5HRSkKCQkJCWxpc3RlbmVyLm1vbml0b3JDaGFuZ2VkKG1vbml0b3IpOwoJCQllbHNlIGlmICh0eXBlID09IFJFTU9WRSkKCQkJCWxpc3RlbmVyLm1vbml0b3JSZW1vdmVkKG1vbml0b3IpOwoJCX0KCX0KCglwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgbG9hZE1vbml0b3JzKCkgewoJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkxvYWRpbmcgbW9uaXRvcnMiKTsKCQkKCQltb25pdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKCQlQcmVmZXJlbmNlcyBwcmVmcyA9IE1vbml0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwoJCVN0cmluZyB4bWxTdHJpbmcgPSBwcmVmcy5nZXRTdHJpbmcoIm1vbml0b3JzIik7CgkJaWYgKHhtbFN0cmluZyAhPSBudWxsICYmIHhtbFN0cmluZy5sZW5ndGgoKSA+IDApIHsKCQkJdHJ5IHsKCQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHhtbFN0cmluZy5nZXRCeXRlcygiVVRGLTgiKSk7CgkJCQlJTWVtZW50byBtZW1lbnRvID0gWE1MTWVtZW50by5sb2FkTWVtZW50byhpbik7CgkJCgkJCQlJTWVtZW50b1tdIGNoaWxkcmVuID0gbWVtZW50by5nZXRDaGlsZHJlbigibW9uaXRvciIpOwoJCQkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKCQkJCQlpbnQgc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDsKCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewoJCQkJCQlNb25pdG9yIG1vbml0b3IgPSBuZXcgTW9uaXRvcigpOwoJCQkJCQltb25pdG9yLmxvYWQoY2hpbGRyZW5baV0pOwoJCQkJCQltb25pdG9ycy5hZGQobW9uaXRvcik7CgkJCQkJfQoJCQkJfQoJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBsb2FkIG1vbml0b3JzOiAiICsgZS5nZXRNZXNzYWdlKCkpOwoJCQl9CgkJfQoJfQoJCglwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgc2F2ZU1vbml0b3JzKCkgewoJCXRyeSB7CgkJCWlnbm9yZVByZWZlcmVuY2VDaGFuZ2VzID0gdHJ1ZTsKCQkJWE1MTWVtZW50byBtZW1lbnRvID0gWE1MTWVtZW50by5jcmVhdGVXcml0ZVJvb3QoIm1vbml0b3JzIik7CgoJCQlJdGVyYXRvciBpdGVyYXRvciA9IG1vbml0b3JzLml0ZXJhdG9yKCk7CgkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKCQkJCU1vbml0b3IgbW9uaXRvciA9IChNb25pdG9yKSBpdGVyYXRvci5uZXh0KCk7CgkJCQlJTWVtZW50byBjaGlsZCA9IG1lbWVudG8uY3JlYXRlQ2hpbGQoIm1vbml0b3IiKTsKCQkJCW1vbml0b3Iuc2F2ZShjaGlsZCk7CgkJCX0KCQkJCgkJCVN0cmluZyB4bWxTdHJpbmcgPSBtZW1lbnRvLnNhdmVUb1N0cmluZygpOwoJCQlQcmVmZXJlbmNlcyBwcmVmcyA9IE1vbml0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwoJCQlwcmVmcy5zZXRWYWx1ZSgibW9uaXRvcnMiLCB4bWxTdHJpbmcpOwoJCQlNb25pdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IHNhdmUgYnJvd3NlcnMiLCBlKTsKCQl9CgkJaWdub3JlUHJlZmVyZW5jZUNoYW5nZXMgPSBmYWxzZTsKCX0KCQoJLyoqCgkgKiBDcmVhdGVzIGEgbmV3IHJlc2VuZCByZXF1ZXN0IGZyb20gdGhlIGdpdmVuIHJlcXVlc3QuCgkgKiAKCSAqIEBwYXJhbSByZXF1ZXN0IHRoZSByZXF1ZXN0IHRoYXQgaXMgdG8gYmUgcmVzZW50OyBtYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+CgkgKiBAcmV0dXJuIGEgbmV3IHJlc2VuZCByZXF1ZXN0CgkgKi8KCXB1YmxpYyBzdGF0aWMgUmVzZW5kSFRUUFJlcXVlc3QgY3JlYXRlUmVzZW5kUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKCQlpZiAocmVxdWVzdCA9PSBudWxsKQoJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CgkJcmV0dXJuIG5ldyBSZXNlbmRIVFRQUmVxdWVzdCgoTW9uaXRvcilyZXF1ZXN0LmdldE1vbml0b3IoKSwgcmVxdWVzdCk7Cgl9CgoJLyoqCgkgKiBBZGRzIGEgcmVzZW5kIHJlcXVlc3QgdG8gdGhpcyByZXF1ZXN0LgoJICogCgkgKiBAcGFyYW0gcmVxdWVzdCB0aGUgcmVzZW5kIHJlcXVlc3QgdG8gYWRkCgkgKiBAcGFyYW0gcmVzZW5kUmVxIHRoZSByZXNlbmQgcmVxdWVzdAoJICovCglwdWJsaWMgdm9pZCBhZGRSZXNlbmRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCwgUmVzZW5kSFRUUFJlcXVlc3QgcmVzZW5kUmVxKSB7CgkJaWYgKHJlcXVlc3QgPT0gbnVsbCB8fCByZXNlbmRSZXEgPT0gbnVsbCkKCQkJcmV0dXJuOwoJCQoJCUxpc3QgbGlzdCA9IG51bGw7CgkJdHJ5IHsKCQkJbGlzdCA9IChMaXN0KSByZXNlbmRNYXAuZ2V0KHJlcXVlc3QpOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCS8vIGlnbm9yZQoJCX0KCQkKCQlpZiAobGlzdCA9PSBudWxsKSB7CgkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CgkJCXJlc2VuZE1hcC5wdXQocmVxdWVzdCwgbGlzdCk7CgkJfQoJCWxpc3QuYWRkKHJlc2VuZFJlcSk7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHJlc2VuZCByZXF1ZXN0cyBiYXNlZCBvbiB0aGlzIHJlcXVlc3QuIAoJICogCgkgKiBAcGFyYW0gcmVxdWVzdCBhIHJlcXVlc3QKCSAqIEByZXR1cm4gdGhlIGFycmF5IG9mIHJlc2VuZCByZXF1ZXN0cyBiYXNlZCBvbiB0aGlzIHJlcXVlc3QKCSAqLwoJcHVibGljIFJlc2VuZEhUVFBSZXF1ZXN0W10gZ2V0UmVzZW5kUmVxdWVzdHMoUmVxdWVzdCByZXF1ZXN0KSB7CgkJdHJ5IHsKCQkJTGlzdCBsaXN0ID0gKExpc3QpIHJlc2VuZE1hcC5nZXQocmVxdWVzdCk7CgkJCVJlc2VuZEhUVFBSZXF1ZXN0W10gcnIgPSBuZXcgUmVzZW5kSFRUUFJlcXVlc3RbbGlzdC5zaXplKCldOwoJCQlsaXN0LnRvQXJyYXkocnIpOwoJCQlyZXR1cm4gcnI7CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJcmV0dXJuIG5ldyBSZXNlbmRIVFRQUmVxdWVzdFswXTsKCQl9Cgl9Cn0=