LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAogKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgogKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIAogKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKiAKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICogdW5kZXIgdGhlIExpY2Vuc2UuCiAqIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgogLy8gaW5jbHVkZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KI2luY2x1ZGUgPGN1aXJlcy5ocmM+CiNpbmNsdWRlICJoZWxwaWQuaHJjIgojaW5jbHVkZSAibnVtZm10LmhyYyIKI2luY2x1ZGUgPHN2eC9kaWFsb2dzLmhyYz4KCiAvLyBSSURfU1ZYUEFHRV9OVU1CRVJGT1JNQVQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpUYWJQYWdlIFJJRF9TVlhQQUdFX05VTUJFUkZPUk1BVAp7CglIZWxwSWQgPSBISURfTlVNQkVSRk9STUFUIDsKCUhpZGUgPSBUUlVFIDsKCVRleHQgWyBlbi1VUyBdID0gIk51bWJlciBGb3JtYXQiIDsKCVNpemUgPSBNQVBfQVBQRk9OVCAoIDI2MCAsIDE4NSApIDsKCUZpeGVkVGV4dCBGVF9DQVRFR09SWQoJewoJCVBvcyA9IE1BUF9BUFBGT05UICggNiAsIDMgKSA7CgkJU2l6ZSA9IE1BUF9BUFBGT05UICggNzAgLCA4ICkgOwoJCVRleHQgWyBlbi1VUyBdID0gIn5DYXRlZ29yeSIgOwoJfTsKCUxpc3RCb3ggTEJfQ0FURUdPUlkKCXsKCSAgICBIZWxwSUQgPSAiY3VpOkxpc3RCb3g6UklEX1NWWFBBR0VfTlVNQkVSRk9STUFUOkxCX0NBVEVHT1JZIjsKCQlCb3JkZXIgPSBUUlVFIDsKICAgICAgICBQb3MgPSBNQVBfQVBQRk9OVCAoIDYgLCAxNCApIDsKICAgICAgICBTaXplID0gTUFQX0FQUEZPTlQgKCA3MCAsIDcxICkgOwoJCUF1dG9IU2Nyb2xsID0gVFJVRSA7CgkJU3RyaW5nTGlzdCBbIGVuLVVTIF0gPQoJCXsKCQkJPCAiQWxsIiA7IERlZmF1bHQgOyA+IDsKCQkJPCAiVXNlci1kZWZpbmVkIiA7IERlZmF1bHQgOyA+IDsKCQkJPCAiTnVtYmVyIiA7IERlZmF1bHQgOyA+IDsKCQkJPCAiUGVyY2VudCIgOyBEZWZhdWx0IDsgPiA7CgkJCTwgIkN1cnJlbmN5IiA7IERlZmF1bHQgOyA+IDsKCQkJPCAiRGF0ZSIgOyBEZWZhdWx0IDsgPiA7CgkJCTwgIlRpbWUiIDsgRGVmYXVsdCA7ID4gOwoJCQk8ICJTY2llbnRpZmljIiA7IERlZmF1bHQgOyA+IDsKCQkJPCAiRnJhY3Rpb24iIDsgRGVmYXVsdCA7ID4gOwoJCQk8ICJCb29sZWFuIFZhbHVlIiA7IERlZmF1bHQgOyA+IDsKCQkJPCAiVGV4dCIgOyBEZWZhdWx0IDsgPiA7CgkJfTsKCX07CglGaXhlZFRleHQgRlRfRURGT1JNQVQKCXsKICAgICAgICBQb3MgPSBNQVBfQVBQRk9OVCAoIDYgLCAxMzYgKSA7CiAgICAgICAgU2l6ZSA9IE1BUF9BUFBGT05UICggMjQ4ICwgOCApIDsKCQlUZXh0IFsgZW4tVVMgXSA9ICJ+Rm9ybWF0IGNvZGUiIDsKCX07CglFZGl0IEVEX0ZPUk1BVAoJewoJICAgIEhlbHBJRCA9ICJjdWk6RWRpdDpSSURfU1ZYUEFHRV9OVU1CRVJGT1JNQVQ6RURfRk9STUFUIjsKCQlCb3JkZXIgPSBUUlVFIDsKICAgICAgICBQb3MgPSBNQVBfQVBQRk9OVCAoIDYgLCAxNDcgKSA7CiAgICAgICAgU2l6ZSA9IE1BUF9BUFBGT05UICggMjAwICwgMTIgKSA7Cgl9OwoJRml4ZWRUZXh0IEZUX0NPTU1FTlQKCXsKICAgICAgICBQb3MgPSBNQVBfQVBQRk9OVCAoIDYgLCAxNjMgKSA7CgkJU2l6ZSA9IE1BUF9BUFBGT05UICggMjQ4ICwgMTYgKSA7CgkJV29yZEJyZWFrID0gVFJVRSA7CgkJTm9MYWJlbCA9IFRSVUUgOwoJfTsKCUVkaXQgRURfQ09NTUVOVAoJewoJICAgIEhlbHBJRCA9ICJjdWk6RWRpdDpSSURfU1ZYUEFHRV9OVU1CRVJGT1JNQVQ6RURfQ09NTUVOVCI7CgkJSGlkZSA9IFRSVUUgOwoJCUJvcmRlciA9IFRSVUUgOwogICAgICAgIFBvcyA9IE1BUF9BUFBGT05UICggNiAsIDE2MyApIDsKCQlTaXplID0gTUFQX0FQUEZPTlQgKCAyNDggLCAxMiApIDsKCX07CglGaXhlZFRleHQgRlRfRk9STUFUCgl7CgkJUG9zID0gTUFQX0FQUEZPTlQgKCA4MiAsIDMgKSA7CiAgICAgICAgU2l6ZSA9IE1BUF9BUFBGT05UICggOTAgLCA4ICkgOwoJCVRleHQgWyBlbi1VUyBdID0gIkZ+b3JtYXQiIDsKCX07CgogICAgTGlzdEJveCBMQl9DVVJSRU5DWQoJewogICAgICAgIEhlbHBJRCA9ICJjdWk6TGlzdEJveDpSSURfU1ZYUEFHRV9OVU1CRVJGT1JNQVQ6TEJfQ1VSUkVOQ1kiOwoJCUJvcmRlciA9IFRSVUUgOwogICAgICAgIFBvcyA9IE1BUF9BUFBGT05UICggODIgLCAxNCApIDsKCQlTaXplID0gTUFQX0FQUEZPTlQgKCA5MCAsIDcxICkgOwoJCURyb3BEb3duID0gVFJVRSA7CgkJVGFiU3RvcCA9IFRSVUUgOwogICAgICAgIFN0cmluZ0xpc3QgWyBlbi1VUyBdID0KICAgICAgICB7CiAgICAgICAgICAgICAgICA8ICJBdXRvbWF0aWNhbGx5IiA7IERlZmF1bHQgOyA+IDsKICAgICAgICB9OwoJfTsKCglDb250cm9sIExCX0ZPUk1BVAoJewoJCUhlbHBJZCA9IEhJRF9OVU1CRVJGT1JNQVRfTEJfRk9STUFUIDsKCQlCb3JkZXIgPSBUUlVFIDsKICAgICAgICBQb3MgPSBNQVBfQVBQRk9OVCAoIDgyICwgMjcgKSA7CiAgICAgICAgU2l6ZSA9IE1BUF9BUFBGT05UICggOTAgLCA1OCApIDsKCQlUYWJTdG9wID0gVFJVRSA7Cgl9OwoKCUZpeGVkVGV4dCBGVF9ERUNJTUFMUwoJewogICAgICAgIFBvcyA9IE1BUF9BUFBGT05UICggMTIgLCAxMDQgKSA7CgkJU2l6ZSA9IE1BUF9BUFBGT05UICggNjkgLCA4ICkgOwoJCVRleHQgWyBlbi1VUyBdID0gIn5EZWNpbWFsIHBsYWNlcyIgOwoJfTsKCU51bWVyaWNGaWVsZCBFRF9ERUNJTUFMUwoJewoJICAgIEhlbHBJRCA9ICJjdWk6TnVtZXJpY0ZpZWxkOlJJRF9TVlhQQUdFX05VTUJFUkZPUk1BVDpFRF9ERUNJTUFMUyI7CgkJQm9yZGVyID0gVFJVRSA7CiAgICAgICAgUG9zID0gTUFQX0FQUEZPTlQgKCA4NCAsIDEwMiApIDsKCQlTaXplID0gTUFQX0FQUEZPTlQgKCAyNCAsIDEyICkgOwoJCVNwaW4gPSBUUlVFIDsKCQlNYXhpbXVtID0gMjAgOwoJCUxhc3QgPSAxNSA7CgkJRmlyc3QgPSAwIDsKCQlTdHJpY3RGb3JtYXQgPSBUUlVFIDsKCQlTcGluU2l6ZSA9IDEgOwoJCVJlcGVhdCA9IFRSVUUgOwoJfTsKCUZpeGVkVGV4dCBGVF9MRUFEWkVST0VTCgl7CiAgICAgICAgUG9zID0gTUFQX0FQUEZPTlQgKCAxMiAsIDEyMCApIDsKCQlTaXplID0gTUFQX0FQUEZPTlQgKCA2OSAsIDggKSA7CgkJLyogIyMjIEFDSFRVTkc6IE5ldWVyIFRleHQgaW4gUmVzb3VyY2U/IEb8aHJlbmRlIH5OdWxsZW4gOiBGs2hyZW5kZSB+TnVsbGVuICovCgkJVGV4dCBbIGVuLVVTIF0gPSAiTGVhZGluZyB+emVyb2VzIiA7Cgl9OwoJTnVtZXJpY0ZpZWxkIEVEX0xFQURaRVJPRVMKCXsKCSAgICBIZWxwSUQgPSAiY3VpOk51bWVyaWNGaWVsZDpSSURfU1ZYUEFHRV9OVU1CRVJGT1JNQVQ6RURfTEVBRFpFUk9FUyI7CgkJQm9yZGVyID0gVFJVRSA7CiAgICAgICAgUG9zID0gTUFQX0FQUEZPTlQgKCA4NCAsIDExOCApIDsKCQlTaXplID0gTUFQX0FQUEZPTlQgKCAyNCAsIDEyICkgOwoJCVNwaW4gPSBUUlVFIDsKCQlNYXhpbXVtID0gMjAgOwoJCUxhc3QgPSAxNSA7CgkJRmlyc3QgPSAwIDsKCQlTdHJpY3RGb3JtYXQgPSBUUlVFIDsKCQlTcGluU2l6ZSA9IDEgOwoJCVJlcGVhdCA9IFRSVUUgOwoJfTsKCUNoZWNrQm94IEJUTl9ORUdSRUQKCXsKCSAgICBIZWxwSUQgPSAiY3VpOkNoZWNrQm94OlJJRF9TVlhQQUdFX05VTUJFUkZPUk1BVDpCVE5fTkVHUkVEIjsKICAgICAgICBQb3MgPSBNQVBfQVBQRk9OVCAoIDEzMyAsIDEwNCApIDsKCQlTaXplID0gTUFQX0FQUEZPTlQgKCAxMDAgLCAxMCApIDsKCQlUZXh0IFsgZW4tVVMgXSA9ICJ+TmVnYXRpdmUgbnVtYmVycyByZWQiIDsKCX07CglDaGVja0JveCBCVE5fVEhPVVNBTkQKCXsKCSAgICBIZWxwSUQgPSAiY3VpOkNoZWNrQm94OlJJRF9TVlhQQUdFX05VTUJFUkZPUk1BVDpCVE5fVEhPVVNBTkQiOwogICAgICAgIFBvcyA9IE1BUF9BUFBGT05UICggMTMzICwgMTIwICkgOwoJCVNpemUgPSBNQVBfQVBQRk9OVCAoIDEwMCAsIDEwICkgOwoJCVRleHQgWyBlbi1VUyBdID0gIn5UaG91c2FuZHMgc2VwYXJhdG9yIiA7Cgl9OwogICAgRml4ZWRMaW5lIEZMX09QVElPTlMKCXsKICAgICAgICBQb3MgPSBNQVBfQVBQRk9OVCAoIDYgLCA5MSApIDsKICAgICAgICBTaXplID0gTUFQX0FQUEZPTlQgKCAyNDggLCA4ICkgOwoJCVRleHQgWyBlbi1VUyBdID0gIk9wdGlvbnMiIDsKCX07CglGaXhlZFRleHQgRlRfTEFOR1VBR0UKCXsKICAgICAgICBQb3MgPSBNQVBfQVBQRk9OVCAoIDE3OCAsIDMgKSA7CiAgICAgICAgU2l6ZSA9IE1BUF9BUFBGT05UICggNzYgLCA4ICkgOwoJCVRleHQgWyBlbi1VUyBdID0gIn5MYW5ndWFnZSIgOwoJfTsKCUxpc3RCb3ggTEJfTEFOR1VBR0UKCXsKCSAgICBIZWxwSUQgPSAiY3VpOkxpc3RCb3g6UklEX1NWWFBBR0VfTlVNQkVSRk9STUFUOkxCX0xBTkdVQUdFIjsKCQlCb3JkZXIgPSBUUlVFIDsKCQlTb3J0ID0gVFJVRSA7CiAgICAgICAgUG9zID0gTUFQX0FQUEZPTlQgKCAxNzggLCAxNCApIDsKICAgICAgICBTaXplID0gTUFQX0FQUEZPTlQgKCA3NiAsIDcxICkgOwoJCURyb3BEb3duID0gVFJVRSA7Cgl9OwogICAgQ2hlY2tCb3ggQ0JfU09VUkNFRk9STUFUCgl7CiAgICAgICAgSGVscElEID0gImN1aTpDaGVja0JveDpSSURfU1ZYUEFHRV9OVU1CRVJGT1JNQVQ6Q0JfU09VUkNFRk9STUFUIjsKICAgICAgICBQb3MgPSBNQVBfQVBQRk9OVCAoIDE3OCAsIDQyICkgOwogICAgICAgIFNpemUgPSBNQVBfQVBQRk9OVCAoIDc2ICwgMTAgKSA7CiAgICAgICAgVGV4dCBbIGVuLVVTIF0gPSAiU29+dXJjZSBmb3JtYXQiIDsKCX07CglXaW5kb3cgV05EX05VTUJFUl9QUkVWSUVXCgl7CiAgICAgICAgQm9yZGVyID0gVFJVRSA7CgkJU1ZMb29rID0gVFJVRSA7CiAgICAgICAgUG9zID0gTUFQX0FQUEZPTlQgKCAxNzggLCA2NyApIDsKCQlTaXplID0gTUFQX0FQUEZPTlQgKCA3NiAsIDE4ICkgOwoJCUhlbHBJZCA9IEhJRF9OVU1CRVJGT1JNQVRfV05EX05VTUJFUl9QUkVWSUVXIDsKCX07CglJbWFnZUJ1dHRvbiBJQl9BREQKCXsKCQlTVkxvb2sgPSBUUlVFIDsKICAgICAgICBQb3MgPSBNQVBfQVBQRk9OVCAoIDIwOCAsIDE0NiApIDsKICAgICAgICBTaXplID0gTUFQX0FQUEZPTlQgKCAxNCAsIDE0ICkgOwoJCUhlbHBJZCA9IEhJRF9OVU1CRVJGT1JNQVRfVEJJX0FERCA7CgkJUXVpY2tIZWxwVGV4dCBbIGVuLVVTIF0gPSAiQWRkIiA7Cgl9OwoJSW1hZ2VCdXR0b24gSUJfUkVNT1ZFCgl7CgkJU1ZMb29rID0gVFJVRSA7CiAgICAgICAgUG9zID0gTUFQX0FQUEZPTlQgKCAyNDAgLCAxNDYgKSA7CiAgICAgICAgU2l6ZSA9IE1BUF9BUFBGT05UICggMTQgLCAxNCApIDsKCQlIZWxwSWQgPSBISURfTlVNQkVSRk9STUFUX1RCSV9SRU1PVkUgOwoJCVF1aWNrSGVscFRleHQgWyBlbi1VUyBdID0gIlJlbW92ZSIgOwoJfTsKCUltYWdlQnV0dG9uIElCX0lORk8KCXsKCQlTVkxvb2sgPSBUUlVFIDsKICAgICAgICBQb3MgPSBNQVBfQVBQRk9OVCAoIDIyNCAsIDE0NiApIDsKICAgICAgICBTaXplID0gTUFQX0FQUEZPTlQgKCAxNCAsIDE0ICkgOwoJCUhlbHBJZCA9IEhJRF9OVU1CRVJGT1JNQVRfVEJJX0lORk8gOwoJCVF1aWNrSGVscFRleHQgWyBlbi1VUyBdID0gIkVkaXQgQ29tbWVudCIgOwoJfTsKCUltYWdlTGlzdCBJTF9JQ09OCgl7CiAgICAgICAgUHJlZml4ID0gIm51IjsKCQlNYXNrQ29sb3IgPSBDb2xvciB7IFJlZCA9IDB4RkZGRiA7IEdyZWVuID0gMHgwMDAwIDsgQmx1ZSA9IDB4RkZGRiA7IH07CgkJSWRMaXN0ID0KCQl7CgkJCUlJRF9BREQgOwoJCQlJSURfUkVNT1ZFIDsKCQkJSUlEX0lORk8gOwoJCX07CgkJSWRDb3VudCA9IHsgMyA7IH07Cgl9OwoJSW1hZ2VMaXN0IElMX0lDT05fSEMKCXsKICAgICAgICBQcmVmaXggPSAibnVoIjsKCQlNYXNrQ29sb3IgPSBDb2xvciB7IFJlZCA9IDB4RkZGRiA7IEdyZWVuID0gMHgwMDAwIDsgQmx1ZSA9IDB4RkZGRiA7IH07CgkJSWRMaXN0ID0KCQl7CgkJCUlJRF9BREQgOwoJCQlJSURfUkVNT1ZFIDsKCQkJSUlEX0lORk8gOwoJCX07CgkJSWRDb3VudCA9IHsgMyA7IH07Cgl9OwoKICAgIFN0cmluZyBTVFJfQVVUT19FTlRSWQogICAgewogICAgICAgIFRleHQgWyBlbi1VUyBdID0gIkF1dG9tYXRpYyI7Cgl9OwoKfTsKIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRU9GCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK