LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAogKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgogKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIAogKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKiAKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICogdW5kZXIgdGhlIExpY2Vuc2UuCiAqIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgoKLy8gTUFSS0VSKHVwZGF0ZV9wcmVjb21wLnB5KTogYXV0b2dlbiBpbmNsdWRlIHN0YXRlbWVudCwgZG8gbm90IHJlbW92ZQojaW5jbHVkZSAicHJlY29tcGlsZWRfdG9vbHMuaHh4IgoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDx0b29scy9zdHJlYW0uaHh4PgojaW5jbHVkZSA8dG9vbHMvZnN5cy5oeHg+CgojaW5jbHVkZSAidG9vbHMvaXBhcnNlci5oeHgiCiNpbmNsdWRlICJ0b29scy9nZW5pbmZvLmh4eCIKCgoKLy8KLy8gY2xhc3MgSW5mb3JtYXRpb25QYXJzZXIKLy8KCiNkZWZpbmUgY0tleUxldmVsQ2hhciAnXHQnCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkluZm9ybWF0aW9uUGFyc2VyOjpJbmZvcm1hdGlvblBhcnNlciggc2FsX0Jvb2wgYlJlcGxhY2UgKQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgkJCQk6IGJSZWNvdmVyKCBzYWxfRmFsc2UgKSwKCQkJCXNPbGRMaW5lKCAiIiApLAoJCQkJYlJlcGxhY2VWYXJpYWJsZXMoIGJSZXBsYWNlICksCgkJCQluTGV2ZWwoIDAgKSwKCQkJCXNVUEQoICIiICksCgkJCQlzVmVyc2lvbiggIiIgKSwKCQkJCXBBY3RTdHJlYW0oIE5VTEwgKSwKCQkJCW5FcnJvckNvZGUoIDAgKSwKCQkJCW5FcnJvckxpbmUoIDAgKSwKCQkJCXNFcnJvclRleHQoICIiICksCgkJCQluQWN0TGluZSggMCApCnsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpJbmZvcm1hdGlvblBhcnNlcjo6fkluZm9ybWF0aW9uUGFyc2VyKCkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQnl0ZVN0cmluZyAmSW5mb3JtYXRpb25QYXJzZXI6OlJlYWRMaW5lKCkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp7CglCeXRlU3RyaW5nIHNMaW5lOwoKCWlmICggYlJlY292ZXIgKSB7CgkJYlJlY292ZXIgPSBzYWxfRmFsc2U7Cgl9CgllbHNlIHsKCQkgaWYgKCAhcEFjdFN0cmVhbS0+SXNFb2YoKSkgewoJCQlwQWN0U3RyZWFtLT5SZWFkTGluZSggc0xpbmUgKTsKICAgICAgICAgICAgeHViX1N0ckxlbiBuU3RhcnQgPSAwOwogICAgICAgICAgICB4dWJfU3RyTGVuIG5FbmQgPSBzTGluZS5MZW4oKTsKICAgICAgICAgICAgc2FsX0Jvb2wgYkNvcHkgPSBzYWxfRmFsc2U7CiAgICAgICAgICAgIHdoaWxlICggblN0YXJ0IDwgbkVuZCAmJiAoIHNMaW5lLkdldENoYXIoIG5TdGFydCApID09ICcgJyB8fCBzTGluZS5HZXRDaGFyKCBuU3RhcnQgKSA9PSAweDA5ICkgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBuU3RhcnQrKzsKICAgICAgICAgICAgICAgIGJDb3B5ID0gc2FsX1RydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHdoaWxlICggblN0YXJ0IDwgbkVuZCAmJiAoIHNMaW5lLkdldENoYXIoIG5FbmQtMSApID09ICcgJyB8fCBzTGluZS5HZXRDaGFyKCBuRW5kLTEgKSA9PSAweDA5ICkgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBuRW5kLS07CiAgICAgICAgICAgICAgICBiQ29weSA9IHNhbF9UcnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIGJDb3B5ICkKICAgICAgICAgICAgICAgIHNMaW5lID0gc0xpbmUuQ29weSggblN0YXJ0LCBuRW5kIC0gblN0YXJ0ICk7CgoJCQlpZiAoKCBzTGluZS5HZXRDaGFyKCAwICkgPT0gJyMnICkgfHwgKCAhc0xpbmUuTGVuKCkpKSB7CgkJCQlpZiAoIHNDdXJyZW50Q29tbWVudC5MZW4oKSkKCQkJCQlzQ3VycmVudENvbW1lbnQgKz0gIlxuIjsKCQkJCXNDdXJyZW50Q29tbWVudCArPSBzTGluZTsKCQkJCXJldHVybiBSZWFkTGluZSgpOwoJCQl9CgkJCWVsc2UgewoJCQkJaWYgKCBiUmVwbGFjZVZhcmlhYmxlcyApIHsKCQkJCQlzTGluZS5TZWFyY2hBbmRSZXBsYWNlQWxsKCAiJVVQRCIsIHNVUEQgKTsKCQkJCQlzTGluZS5TZWFyY2hBbmRSZXBsYWNlQWxsKCAiJVZFUlNJT04iLCBzVmVyc2lvbiApOwoJCQkJfQoJCQl9CgkJfQogICAgICAgIGVsc2UgewoJCQlpZiAoIG5MZXZlbCApIHsKICAgICAgICAgICAgCXNMaW5lID0gIn0iOwoJICAgICAgICAgICAgZnByaW50Ziggc3Rkb3V0LCAiUmVhY2hlZCBFT0YgcGFyc2luZyAlcy4gU3VwbHlpbmcgZXh0cmEgJ30nXG4iLEJ5dGVTdHJpbmcoIHNTdHJlYW1OYW1lLCBnc2xfZ2V0U3lzdGVtVGV4dEVuY29kaW5nKCkpLkdldEJ1ZmZlcigpICk7CgkvLwkgICAgICAgIG5FcnJvckNvZGUgPSBJUF9VTkVYUEVDVEVEX0VPRjsKCS8vCSAgICAgICAgbkVycm9yTGluZSA9IG5BY3RMaW5lOwoJCQl9CgkJCWVsc2UKCQkJCXNMaW5lID0gIiI7CiAgICAgICAgfQoKCQlzT2xkTGluZSA9IHNMaW5lOwoJCW5BY3RMaW5lKys7Cgl9CgoJcmV0dXJuIHNPbGRMaW5lOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdlbmVyaWNJbmZvcm1hdGlvbiAqSW5mb3JtYXRpb25QYXJzZXI6OlJlYWRLZXkoCgkJCQkJCQkJCUdlbmVyaWNJbmZvcm1hdGlvbkxpc3QgKnBFeGlzdGluZ0xpc3QgKQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsKCS8vIHRoaXMgbWV0aG9kIGhhcyBubyBlcnJvciBoYW5kbGluZyB5ZXQsIGJ1dCBpdCB3b3JrcyB2ZXJ5IGZhc3QuCgkvLyBpdCBpcyB1c2VkIHRvIGNyZWF0ZSB3aG9sZSBpbmZvcm1hdGlvbnMgYW5kIHN1YiBpbmZvcm1hdGlvbnMgaW4KCS8vIGEgc2ltcGxlIGRhdGEgZm9ybWF0IGluIG1lbW9yeSwgcmVhZGVkIGluIGEgY29uZmlndXJhdGlvbiBmaWxlIHdpdGgKCS8vIGZvbGxvd2luZyBmb3JtYXQ6CgoJLyoKCglrZXkgW3ZhbHVlXQoJewoJCWtleSBbdmFsdWVdCgkJa2V5IFt2YWx1ZV0KCQl7CgkJCWtleSBbdmFsdWVdCgkJCS4uLgoJCQkuLi4KCQl9Cgl9CglrZXkgW3ZhbHVlXQoJLi4uCgkuLi4KCgkqLwoKCUdlbmVyaWNJbmZvcm1hdGlvbiAqcEluZm8gPSBOVUxMOwoKCUJ5dGVTdHJpbmcgc0xpbmUoIFJlYWRMaW5lKCkpOwoJQnl0ZVN0cmluZyBzS2V5OwoJQnl0ZVN0cmluZyBzVmFsdWU7CglCeXRlU3RyaW5nIHNDb21tZW50KCBzQ3VycmVudENvbW1lbnQgKTsKCXNDdXJyZW50Q29tbWVudCA9ICIiOwoKCS8vIGtleSBzZXBhcmF0ZWQgZnJvbSB2YWx1ZSBieSB0YWI/CglzYWxfdUludDE2IG5XU1BvcyA9IHNMaW5lLlNlYXJjaCggJyAnICk7CglpZiAoIHNMaW5lLlNlYXJjaCggJ1x0JyApIDwgbldTUG9zICkgewoJCW5XU1BvcyA9IHNMaW5lLlNlYXJjaCggJ1x0JyApOwoJCXNMaW5lLlNlYXJjaEFuZFJlcGxhY2UoICJcdCIsICIgIiApOwoJfQoKCWlmICggc0xpbmUuR2V0VG9rZW5Db3VudCggJyAnICkgPiAxICkgewoJCXNLZXkgPSBzTGluZS5HZXRUb2tlbiggMCwgJyAnICk7CgkJc1ZhbHVlID0gc0xpbmUuQ29weSggc0tleS5MZW4oKSArIDEgKTsKCQl3aGlsZSAoKCBzVmFsdWUuU2VhcmNoKCAnICcgKSA9PSAwICkgfHwgKCBzVmFsdWUuU2VhcmNoKCAnXHQnICkgPT0gMCApKSB7CgkJCXNWYWx1ZS5FcmFzZSggMCwgMSApOwoJCX0KCX0KCWVsc2UKCQlzS2V5PXNMaW5lOwoKCWlmICggYlJlcGxhY2VWYXJpYWJsZXMgJiYgIW5MZXZlbCApIHsKCQlzVVBEID0gc0tleS5Db3B5KCBzS2V5LkxlbigpIC0gMyApOwoJCXNWZXJzaW9uID0gc0tleTsKCX0KCglpZiAoIFJlYWRMaW5lKCkgPT0gInsiICkgewoJCW5MZXZlbCsrOwoJCUdlbmVyaWNJbmZvcm1hdGlvbkxpc3QgKnBTdWJMaXN0ID0gbmV3IEdlbmVyaWNJbmZvcm1hdGlvbkxpc3QoKTsKCQl3aGlsZSAoIFJlYWRMaW5lKCkgIT0gIn0iICkgewoJCQlSZWNvdmVyKCk7CgkJCVJlYWRLZXkoIHBTdWJMaXN0ICk7CgkJfQoJCW5MZXZlbC0tOwoJCXBJbmZvID0gbmV3IEdlbmVyaWNJbmZvcm1hdGlvbiggc0tleSwgc1ZhbHVlLAoJCQkJCQlwRXhpc3RpbmdMaXN0LCBwU3ViTGlzdCApOwoJCXBJbmZvLT5TZXRDb21tZW50KCBzQ29tbWVudCApOwoJfQoJZWxzZSB7CgkJUmVjb3ZlcigpOwogICAgICAgIGlmICggIXNLZXkuRXF1YWxzKCAifSIgKSAmJiAhc0tleS5FcXVhbHMoICJ7IiApICkKICAgICAgICB7CgkJICAgIHBJbmZvID0gbmV3IEdlbmVyaWNJbmZvcm1hdGlvbiggc0tleSwgc1ZhbHVlLCBwRXhpc3RpbmdMaXN0ICk7CgkJICAgIHBJbmZvLT5TZXRDb21tZW50KCBzQ29tbWVudCApOwogICAgICAgIH0KCX0KCglyZXR1cm4gcEluZm87Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCBJbmZvcm1hdGlvblBhcnNlcjo6UmVjb3ZlcigpCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewoJYlJlY292ZXIgPSBzYWxfVHJ1ZTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzYWxfQm9vbCBJbmZvcm1hdGlvblBhcnNlcjo6U2F2ZSggU3ZTdHJlYW0gJnJPdXRTdHJlYW0sCgkJCSAgICAgIGNvbnN0IEdlbmVyaWNJbmZvcm1hdGlvbkxpc3QgKnBTYXZlTGlzdCwKCQkJICAgICAgc2FsX3VJbnQxNiBsZXZlbCwgc2FsX0Jvb2wgYlN0cmlwcGVkICkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp7CglzYWxfdUludDE2IGk7CglzYWxfdUludFB0ciBuSW5mb0xpc3RDb3VudDsKCUJ5dGVTdHJpbmcgc1RtcFN0cjsKCUdlbmVyaWNJbmZvcm1hdGlvbiAqcEdlbmVyaWNJbmZvOwoJR2VuZXJpY0luZm9ybWF0aW9uTGlzdCAqcEdlbmVyaWNJbmZvTGlzdDsKCiAJc3RhdGljIEJ5dGVTdHJpbmcgYUtleUxldmVsOwogICAgYUtleUxldmVsLkV4cGFuZCggbGV2ZWwsIGNLZXlMZXZlbENoYXIgKTsKCglmb3IgKCBuSW5mb0xpc3RDb3VudCA9IDA7IG5JbmZvTGlzdENvdW50IDwgcFNhdmVMaXN0LT5Db3VudCgpOyBuSW5mb0xpc3RDb3VudCsrKSB7CgkgICAgLy8gS2V5LVZhbHVlIFBhYXJlIHNjaHJlaWJlbgogICAgCXBHZW5lcmljSW5mbyA9IHBTYXZlTGlzdC0+R2V0T2JqZWN0KCBuSW5mb0xpc3RDb3VudCApOwogICAgCXNUbXBTdHIgPSAiIjsKICAgICAgICBpZiAoICFiU3RyaXBwZWQgJiYgbGV2ZWwgKQogICAgICAgIAlzVG1wU3RyLkFwcGVuZCggYUtleUxldmVsLkdldEJ1ZmZlcigpLCBsZXZlbCApOwoKICAgICAgICBpZiAoICFiU3RyaXBwZWQgKQoJCSAgICBmb3IgKCBpID0gMDsgaSA8IHBHZW5lcmljSW5mby0+R2V0Q29tbWVudCgpLkdldFRva2VuQ291bnQoICdcbicgKTsgaSsrICkgewoJCQkgICAgc1RtcFN0ciArPSBwR2VuZXJpY0luZm8tPkdldENvbW1lbnQoKS5HZXRUb2tlbiggaSwgJ1xuJyApOwoJCQkgICAgc1RtcFN0ciArPSAiXG4iOwogICAgICAgICAgICAgICAgaWYgKCBsZXZlbCApCiAgICAgICAgCSAgICAgICAgc1RtcFN0ci5BcHBlbmQoIGFLZXlMZXZlbC5HZXRCdWZmZXIoKSwgbGV2ZWwgKTsKCQkgICAgfQoKICAgIAlzVG1wU3RyICs9IHBHZW5lcmljSW5mby0+R2V0QnVmZmVyKCk7CiAgICAJc1RtcFN0ciArPSAnICc7CiAgICAJc1RtcFN0ciArPSBwR2VuZXJpY0luZm8tPkdldFZhbHVlKCk7CiAgICAJaWYgKCAhck91dFN0cmVhbS5Xcml0ZUxpbmUoIHNUbXBTdHIgKSApCiAgICAgIAkJcmV0dXJuIHNhbF9GYWxzZTsKCiAgICAJLy8gd2VubiB2b3JoYW5kZW4sIGJlYXJiZWl0ZSByZWN1cnNpdmUgZGllIFN1Ymxpc3RlbgogICAgCWlmICgoIHBHZW5lcmljSW5mb0xpc3QgPSBwR2VuZXJpY0luZm8tPkdldFN1Ykxpc3QoKSApICE9IE5VTEwgKSB7CiAgICAgIAkJLy8gb2VmZm5lbmRlIEtsYW1tZXIKICAgICAgCQlzVG1wU3RyID0gIiI7CiAgICAgICAgICAgIGlmICggIWJTdHJpcHBlZCAmJiBsZXZlbCApCiAgICAgICAgCSAgICBzVG1wU3RyLkFwcGVuZCggYUtleUxldmVsLkdldEJ1ZmZlcigpLCBsZXZlbCApOwogICAgICAJCXNUbXBTdHIgKz0gJ3snOwogICAgICAJCWlmICggIXJPdXRTdHJlYW0uV3JpdGVMaW5lKCBzVG1wU3RyICkgKQoJCQkJcmV0dXJuIHNhbF9GYWxzZTsKICAgICAgCQkvLyByZWN1cnNpdiBkaWUgc3VibGlzdCBhYmFyYmVpdGVuCiAgICAgIAkJaWYgKCAhU2F2ZSggck91dFN0cmVhbSwgcEdlbmVyaWNJbmZvTGlzdCwgbGV2ZWwrMSwgYlN0cmlwcGVkICkgKQogICAgCQkJcmV0dXJuIHNhbF9GYWxzZTsKICAgICAgCQkJLy8gc2NobGllc3NlbmRlIEtsYW1tZXIKICAgICAgCQlzVG1wU3RyID0gIiI7CiAgICAgICAgICAgIGlmICggIWJTdHJpcHBlZCAmJiBsZXZlbCApCiAgICAgICAgCSAgICBzVG1wU3RyLkFwcGVuZCggYUtleUxldmVsLkdldEJ1ZmZlcigpLCBsZXZlbCApOwogICAgICAJCXNUbXBTdHIgKz0gJ30nOwogICAgICAJCWlmICggIXJPdXRTdHJlYW0uV3JpdGVMaW5lKCBzVG1wU3RyICkgKQoJCQkJcmV0dXJuIHNhbF9GYWxzZTsKICAgIAl9CiAgCX0KICAJcmV0dXJuIHNhbF9UcnVlOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdlbmVyaWNJbmZvcm1hdGlvbkxpc3QgKkluZm9ybWF0aW9uUGFyc2VyOjpFeGVjdXRlKAoJCQkJCQkJCVN2U3RyZWFtICZyU291cmNlU3RyZWFtLAoJCQkJCQkJCUdlbmVyaWNJbmZvcm1hdGlvbkxpc3QgKnBFeGlzdGluZ0xpc3QgKQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsKCUdlbmVyaWNJbmZvcm1hdGlvbkxpc3QgKnBMaXN0OwoJaWYgKCBwRXhpc3RpbmdMaXN0ICkKCQlwTGlzdCA9IHBFeGlzdGluZ0xpc3Q7CgllbHNlCgkJcExpc3QgPSBuZXcgR2VuZXJpY0luZm9ybWF0aW9uTGlzdCgpOwoKCXBBY3RTdHJlYW0gPSAmclNvdXJjZVN0cmVhbTsKCgkvLyByZWFkIGFsbCBpbmZvcyBvdXQgb2YgY3VycmVudCBmaWxlCgl3aGlsZSggIXJTb3VyY2VTdHJlYW0uSXNFb2YoKSkgewoJCW5MZXZlbCA9IDA7CgkJUmVhZEtleSggcExpc3QgKTsKCX0KCglyZXR1cm4gcExpc3Q7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR2VuZXJpY0luZm9ybWF0aW9uTGlzdCAqSW5mb3JtYXRpb25QYXJzZXI6OkV4ZWN1dGUoIFN2TWVtb3J5U3RyZWFtICZyU291cmNlU3RyZWFtLAoJCQkJCQkgICAgR2VuZXJpY0luZm9ybWF0aW9uTGlzdCAqcEV4aXN0aW5nTGlzdCApCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewogIAlzU3RyZWFtTmFtZSA9IFVuaVN0cmluZyggIk1lbW9yeSIsIGdzbF9nZXRTeXN0ZW1UZXh0RW5jb2RpbmcoKSk7CiAgCXJldHVybiBFeGVjdXRlKCAoU3ZTdHJlYW0gJilyU291cmNlU3RyZWFtLCBwRXhpc3RpbmdMaXN0ICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR2VuZXJpY0luZm9ybWF0aW9uTGlzdCAqSW5mb3JtYXRpb25QYXJzZXI6OkV4ZWN1dGUoCgkJCQkJCQkJU3ZGaWxlU3RyZWFtICZyU291cmNlU3RyZWFtLAoJCQkJCQkJCUdlbmVyaWNJbmZvcm1hdGlvbkxpc3QgKnBFeGlzdGluZ0xpc3QgKQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsKCWlmICggIXJTb3VyY2VTdHJlYW0uSXNPcGVuKCkpCgkJcmV0dXJuIE5VTEw7CglzU3RyZWFtTmFtZSA9IHJTb3VyY2VTdHJlYW0uR2V0RmlsZU5hbWUoKTsKCXJldHVybiBFeGVjdXRlKCAoU3ZTdHJlYW0gJilyU291cmNlU3RyZWFtLCBwRXhpc3RpbmdMaXN0ICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR2VuZXJpY0luZm9ybWF0aW9uTGlzdCAqSW5mb3JtYXRpb25QYXJzZXI6OkV4ZWN1dGUoIFVuaVN0cmluZyAmclNvdXJjZUZpbGUsCgkJCQkJCQkJR2VuZXJpY0luZm9ybWF0aW9uTGlzdCAqcEV4aXN0aW5nTGlzdCApCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewoJRGlyRW50cnkgYURpckVudHJ5KCByU291cmNlRmlsZSApOwoJaWYgKCAhYURpckVudHJ5LkV4aXN0cygpKQoJCXJldHVybiBOVUxMOwoKCUdlbmVyaWNJbmZvcm1hdGlvbkxpc3QgKnBMaXN0OwoJaWYgKCBwRXhpc3RpbmdMaXN0ICkKCQlwTGlzdCA9IHBFeGlzdGluZ0xpc3Q7CgllbHNlCgkJcExpc3QgPSBuZXcgR2VuZXJpY0luZm9ybWF0aW9uTGlzdCgpOwoKCS8vIHJlc2V0IHN0YXR1cwoJbkVycm9yQ29kZSA9IDA7CgluRXJyb3JMaW5lID0gMDsKCW5BY3RMaW5lID0gMDsKCglTdkZpbGVTdHJlYW0gYUFjdFN0cmVhbTsKCWFBY3RTdHJlYW0uT3BlbiggclNvdXJjZUZpbGUsIFNUUkVBTV9SRUFEICk7CglpZiggYUFjdFN0cmVhbS5HZXRFcnJvcigpKQoJCXJldHVybiBOVUxMOwoKCXBBY3RTdHJlYW0gPSAmYUFjdFN0cmVhbTsKCWlmICggIUV4ZWN1dGUoIGFBY3RTdHJlYW0sIHBMaXN0ICkpIHsKCQlkZWxldGUgcExpc3Q7CgkJcExpc3QgPSBOVUxMOwoJfQoKCS8vIGNsb3NlIHRoZSBzdHJlYW0KCWFBY3RTdHJlYW0uQ2xvc2UoKTsKIAlwQWN0U3RyZWFtID0gTlVMTDsKCglpZiAoICFuRXJyb3JDb2RlICkKCQlyZXR1cm4gcExpc3Q7CgoJcmV0dXJuIE5VTEw7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR2VuZXJpY0luZm9ybWF0aW9uTGlzdCAqSW5mb3JtYXRpb25QYXJzZXI6OkV4ZWN1dGUoIERpciAmckRpciwKCQkJCQkJCQlHZW5lcmljSW5mb3JtYXRpb25MaXN0ICpwRXhpc3RpbmdMaXN0ICkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp7CglHZW5lcmljSW5mb3JtYXRpb25MaXN0ICpwTGlzdDsKCglpZiAoIHBFeGlzdGluZ0xpc3QgKQoJCXBMaXN0ID0gcEV4aXN0aW5nTGlzdDsKCWVsc2UKCQlwTGlzdCA9IG5ldyBHZW5lcmljSW5mb3JtYXRpb25MaXN0KCk7CgoJZm9yICggc2FsX3VJbnQxNiBpID0gMDsgaSA8IHJEaXIuQ291bnQoKTsgaSsrICkgewoKCQkvLyBleGVjdXRlIHRoaXMgZGlyCgkJVW5pU3RyaW5nIHNOZXh0RmlsZSggckRpcltpXS5HZXRGdWxsKCkpOwoJCUdlbmVyaWNJbmZvcm1hdGlvbkxpc3QgKnBTdWJMaXN0ID0gRXhlY3V0ZSggc05leHRGaWxlICk7CgoJCWlmICggIXBTdWJMaXN0ICkgewoJCQkvLyBhbnkgZXJyb3JzID8KCQkJZGVsZXRlIHBMaXN0OwoJCQlyZXR1cm4gTlVMTDsKCQl9CgoJCS8vIGNyZWF0ZSBuZXcgaW5mbyBhbmQgaW5zZXJ0IGl0IGludG8gbGlzdAoJCUJ5dGVTdHJpbmcgc0ZpbGVLZXkoIHJEaXJbaV0uR2V0TmFtZSgpLCBSVExfVEVYVEVOQ09ESU5HX1VURjggKTsKCQluZXcgR2VuZXJpY0luZm9ybWF0aW9uKAoJCQkJCQkJCQkJCXNGaWxlS2V5LAoJCQkJCQkJCQkJCUJ5dGVTdHJpbmcoICIiICksCgkJCQkJCQkJCQkJcExpc3QsIHBTdWJMaXN0ICk7Cgl9CgoJcmV0dXJuIHBMaXN0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnNhbF9Cb29sIEluZm9ybWF0aW9uUGFyc2VyOjpTYXZlKCBTdkZpbGVTdHJlYW0gJnJTb3VyY2VTdHJlYW0sCgkJCSAgICAgIGNvbnN0IEdlbmVyaWNJbmZvcm1hdGlvbkxpc3QgKnBTYXZlTGlzdCApCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewoJaWYgKCAhclNvdXJjZVN0cmVhbS5Jc09wZW4oKSB8fCAhU2F2ZSggKFN2U3RyZWFtICYpclNvdXJjZVN0cmVhbSwgcFNhdmVMaXN0LCAwLCBzYWxfRmFsc2UgKSkKICAgIHsKICAgICAgICBwcmludGYoICJFUlJPUiBzYXZpbmcgZmlsZSBcIiVzXCJcbiIsQnl0ZVN0cmluZyggclNvdXJjZVN0cmVhbS5HZXRGaWxlTmFtZSgpLCBnc2xfZ2V0U3lzdGVtVGV4dEVuY29kaW5nKCkpLkdldEJ1ZmZlcigpICk7CgkJcmV0dXJuIHNhbF9GYWxzZTsKICAgIH0KCglyZXR1cm4gc2FsX1RydWU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc2FsX0Jvb2wgSW5mb3JtYXRpb25QYXJzZXI6OlNhdmUoIFN2TWVtb3J5U3RyZWFtICZyU291cmNlU3RyZWFtLAoJCQkgICAgICBjb25zdCBHZW5lcmljSW5mb3JtYXRpb25MaXN0ICpwU2F2ZUxpc3QgKQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsKICAgIFRpbWUgYTsKICAgIHNhbF9Cb29sIGJSZXQgPSBTYXZlKCAoU3ZTdHJlYW0gJilyU291cmNlU3RyZWFtLCBwU2F2ZUxpc3QsIDAsIHNhbF9UcnVlICk7CiAgICBUaW1lIGI7CiAgICBiID0gYiAtIGE7CiAgICByZXR1cm4gYlJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzYWxfQm9vbCBJbmZvcm1hdGlvblBhcnNlcjo6U2F2ZSggY29uc3QgVW5pU3RyaW5nICZyU291cmNlRmlsZSwKCQkJICAgICAgY29uc3QgR2VuZXJpY0luZm9ybWF0aW9uTGlzdCAqcFNhdmVMaXN0ICkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp7CiAgU3ZGaWxlU3RyZWFtICpwT3V0RmlsZSA9IG5ldyBTdkZpbGVTdHJlYW0oIHJTb3VyY2VGaWxlLCBTVFJFQU1fU1REX1dSSVRFIHwgU1RSRUFNX1RSVU5DICk7CgogIGlmICggIVNhdmUoICpwT3V0RmlsZSwgcFNhdmVMaXN0ICkpIHsKICAgIGRlbGV0ZSBwT3V0RmlsZTsKICAgIHJldHVybiBzYWxfRmFsc2U7CiAgfQogIGRlbGV0ZSBwT3V0RmlsZTsKICByZXR1cm4gc2FsX1RydWU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc2FsX3VJbnQxNiBJbmZvcm1hdGlvblBhcnNlcjo6R2V0RXJyb3JDb2RlKCkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp7CglyZXR1cm4gbkVycm9yQ29kZTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpCeXRlU3RyaW5nICZJbmZvcm1hdGlvblBhcnNlcjo6R2V0RXJyb3JUZXh0KCkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp7CiAgLy8Jc0Vycm9yVGV4dCA9IHBBY3RTdHJlYW0tPkdldEZpbGVOYW1lKCk7CiAgICBzRXJyb3JUZXh0ID0gQnl0ZVN0cmluZyggc1N0cmVhbU5hbWUsIGdzbF9nZXRTeXN0ZW1UZXh0RW5jb2RpbmcoKSk7CglzRXJyb3JUZXh0ICs9IEJ5dGVTdHJpbmcoICIgKCIgKTsKCXNFcnJvclRleHQgKz0gQnl0ZVN0cmluZzo6Q3JlYXRlRnJvbUludDY0KG5FcnJvckxpbmUpOwoJc0Vycm9yVGV4dCArPSBCeXRlU3RyaW5nKCAiKTogIiApOwoKCXN3aXRjaCAoIG5FcnJvckNvZGUgKSB7CgljYXNlIElQX05PX0VSUk9SOgoJCXNFcnJvclRleHQgKz0gQnl0ZVN0cmluZyggIktlaW5lIEZlaGxlciBhdWZnZXRlcmV0ZW4iICk7CgkJYnJlYWs7CgljYXNlIElQX1VORVhQRUNURURfRU9GOgoJCXNFcnJvclRleHQgKz0gQnl0ZVN0cmluZyggIlVuZ/xsdGlnZXMgRGF0ZWllbmRlISIgKTsKCQlicmVhazsKCX0KCglyZXR1cm4gc0Vycm9yVGV4dDsKfQoKCg==