LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAogKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgogKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIAogKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKiAKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICogdW5kZXIgdGhlIExpY2Vuc2UuCiAqIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgoKI2lmbmRlZiBfU0dGQlJBTV9IWFgKI2RlZmluZSBfU0dGQlJBTV9IWFgKCiNpbmNsdWRlIDx0b29scy9zb2xhci5oPgoKI2RlZmluZSBTZ2ZCaXRJbWFnMCAgIDEgLyogQml0bWFwICAgICAgICAgICAgICAgICAgICAgICovCiNkZWZpbmUgU2dmQml0SW1hZzEgICA0IC8qIEJpdG1hcCAgICAgICAgICAgICAgICAgICAgICAqLwojZGVmaW5lIFNnZkJpdEltYWcyICAgNSAvKiBCaXRtYXAgICAgICAgICAgICAgICAgICAgICAgKi8KI2RlZmluZSBTZ2ZCaXRJbWdNbyAgIDYgLyogTW9ub2Nocm9tZSBCaXRtYXAgICAgICAgICAgICovCiNkZWZpbmUgU2dmU2ltcFZlY3QgICAyIC8qIEVpbmZhY2hlcyBWZWN0b3Jmb3JtYXQgICAgICAqLwojZGVmaW5lIFNnZlBvc3RTY3JwICAgMyAvKiBQb3N0c2NyaXB0IGZpbGUgICAgICAgICAgICAgKi8KI2RlZmluZSBTZ2ZTdGFyRHJhdyAgIDcgLyogU3RhckRyYXcgU0dWLURhdGVpICAgICAgICAgICovCiNkZWZpbmUgU2dmRG9udEtub3cgMjU1IC8qIFVuYmVrYW5udCBvZGVyIGtlaW4gU0dGL1NHViAqLwoKLy8gS29uc3RhbnRlbiBmgXIgU2dmSGVhZGVyLlN3R3JDb2wKI2RlZmluZSBTZ2ZCbGNrV2hpdCAxIC8qIFNjaHdhcnovV2VpP0JpbGQgICAgICAgICAgICAgICAgICDEvyBTaW1wVmVjdG9yLCAgKi8KI2RlZmluZSBTZ2ZHcmF5c2NhbCAyIC8qIEJpbGQgbWl0IEdyYXVzdHVmZW4gICAgICAgICAgICAgICAgID9TdGFyRHJhdyB1bmQgKi8KI2RlZmluZSBTZ2YxNkNvbG9ycyAzIC8qIEZhcmJiaWxkICgxNiBGYXJiZW4pICAgICAgICAgICAgICAgxNkgQml0IEltYWdlICAgICovCiNkZWZpbmUgU2dmVmVjdEZhcmIgNCAvKiBGYXJiZW4gZoFyIExpbmllbiB2ZXJ3ZW5kZW4gICAgICAgIMS/ICAgICAgICAgICAgICAqLwojZGVmaW5lIFNnZlZlY3RHcmF5IDUgLyogR3JhdXN0dWZlbiBmgXIgTGluaWVuIHZlcndlbmRlbiAgICAgP051ciBmgXIgICAgICAqLwojZGVmaW5lIFNnZlZlY3RXZHRoIDYgLyogU3RyaWNoc3SEcmtlbiBmgXIgTGluaWVuIHZlcndlbmRlbiDE2SBTaW1wVmVjdG9yICAgKi8KCgojZGVmaW5lIFNnZkhlYWRlclNpemUgNDIKY2xhc3MgU2dmSGVhZGVyCnsKcHVibGljOgoJc2FsX3VJbnQxNiBNYWdpYzsKCXNhbF91SW50MTYgVmVyc2lvbjsKCXNhbF91SW50MTYgVHlwOwoJc2FsX3VJbnQxNiBYc2l6ZTsKCXNhbF91SW50MTYgWXNpemU7CglzYWxfSW50MTYgIFhvZmZzOwoJc2FsX0ludDE2ICBZb2ZmczsKCXNhbF91SW50MTYgUGxhbmVzOyAgICAvLyBMYXllcgoJc2FsX3VJbnQxNiBTd0dyQ29sOwoJY2hhciAgIEF1dG9yWzEwXTsKCWNoYXIgICBQcm9ncmFtbVsxMF07CglzYWxfdUludDE2IE9mc0xvLE9mc0hpOyAvLyBEV29yZC1BbGxpZ25tZW50IGlzdCBub3R3ZW5kaWcgKDM4IG1vZCA0ID0yKSAhCgoJc2FsX3VJbnQzMiBHZXRPZmZzZXQoKTsKCWZyaWVuZCBTdlN0cmVhbSYgb3BlcmF0b3I+PihTdlN0cmVhbSYgcklTdHJlYW0sIFNnZkhlYWRlciYgckhlYWQpOwoJc2FsX0Jvb2wgICBDaGtNYWdpYygpOwp9OwoKI2RlZmluZSBTZ2ZFbnRyeVNpemUgMjIKY2xhc3MgU2dmRW50cnkKewpwdWJsaWM6CglzYWxfdUludDE2IFR5cDsKCXNhbF91SW50MTYgaUZyZWk7CglzYWxfdUludDE2IGxGcmVpTG8sbEZyZWlIaTsKCWNoYXIgICBjRnJlaVsxMF07CglzYWxfdUludDE2IE9mc0xvLE9mc0hpOyAvLyBEV29yZC1BbGxpZ25tZW50IGlzdCBub3R3ZW5kaWcgKDE4IG1vZCA0ID0yKSAhCgoJc2FsX3VJbnQzMiBHZXRPZmZzZXQoKTsKCWZyaWVuZCBTdlN0cmVhbSYgb3BlcmF0b3I+PihTdlN0cmVhbSYgcklTdHJlYW0sIFNnZkVudHJ5JiByRW50cik7Cn07CgojZGVmaW5lIFNnZlZlY3RvclNpemUgMTAKY2xhc3MgU2dmVmVjdG9yCnsKcHVibGljOgoJc2FsX3VJbnQxNiBGbGFnOwoJc2FsX0ludDE2IHg7CglzYWxfSW50MTYgeTsKCXNhbF91SW50MTYgT2ZzTG8sT2ZzSGk7IC8vIERXb3JkLUFsbGlnbm1lbnQgaXN0IG5vdHdlbmRpZyAoNiBtb2QgNCA9MikgIQoKCWZyaWVuZCBTdlN0cmVhbSYgb3BlcmF0b3I+PihTdlN0cmVhbSYgcklTdHJlYW0sIFNnZlZlY3RvciYgckVudHIpOwp9OwoKZXh0ZXJuIGxvbmcgU2dmVmVjdFhvZnM7CmV4dGVybiBsb25nIFNnZlZlY3RZb2ZzOwpleHRlcm4gbG9uZyBTZ2ZWZWN0WG11bDsKZXh0ZXJuIGxvbmcgU2dmVmVjdFltdWw7CmV4dGVybiBsb25nIFNnZlZlY3RYZGl2OwpleHRlcm4gbG9uZyBTZ2ZWZWN0WWRpdjsKZXh0ZXJuIHNhbF9Cb29sIFNnZlZlY3RTY2FsOwoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyBXaW5kb3dzIEJNUCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiNkZWZpbmUgQm1wRmlsZUhlYWRlclNpemUgMTQKY2xhc3MgQm1wRmlsZUhlYWRlcgp7CnB1YmxpYzoKCXNhbF91SW50MTYgVHlwOyAgICAgICAgICAgIC8vID0gIkJNIgoJc2FsX3VJbnQxNiBTaXplTG8sU2l6ZUhpOyAgLy8gRmlsZXNpemUgaW4gQnl0ZXMKCXNhbF91SW50MTYgUmVzZXJ2ZTE7ICAgICAgIC8vIFJlc2VydmllcnQKCXNhbF91SW50MTYgUmVzZXJ2ZTI7ICAgICAgIC8vIFJlc2VydmllcnQKCXNhbF91SW50MTYgT2ZzTG8sT2ZzSGk7ICAgIC8vIE9mZnNldD8KCgl2b2lkICAgU2V0U2l6ZShzYWxfdUludDMyIFNpemUpOwoJdm9pZCAgIFNldE9mcyhzYWxfdUludDMyIFNpemUpOwoJc2FsX3VJbnQzMiBHZXRPZnMoKTsKCWZyaWVuZCBTdlN0cmVhbSYgb3BlcmF0b3I8PChTdlN0cmVhbSYgck9TdHJlYW0sIEJtcEZpbGVIZWFkZXImIHJIZWFkKTsKfTsKCiNkZWZpbmUgQm1wSW5mb0hlYWRlclNpemUgNDAKY2xhc3MgQm1wSW5mb0hlYWRlcgp7CnB1YmxpYzoKCXNhbF91SW50MzIgU2l6ZTsgICAgICAgLy8gR3KU4WUgZGVzIEJtcEluZm9IZWFkZXJzCglzYWxfSW50MzIgIFdpZHRoOyAgICAgIC8vIEJyZWl0ZSBpbiBQaXhlbAoJc2FsX0ludDMyICBIaWdodDsgICAgICAvLyBIlGhlIGluIFBpeGVsCglzYWxfdUludDE2IFBsYW5lczsgICAgIC8vIEFuemFobCBkZXIgUGxhbmVzIChpbW1lciAxKQoJc2FsX3VJbnQxNiBQaXhCaXRzOyAgICAvLyBBbnphaGwgZGVyIEJpdCBqZSBQaXhlbCAoMSw0LDgsb2RlciAyNCkKCXNhbF91SW50MzIgQ29tcHJlc3M7ICAgLy8gRGF0ZW5rb21wcmVzc2lvbgoJc2FsX3VJbnQzMiBJbWdTaXplOyAgICAvLyBHcpThZSBkZXIgSW1hZ2VzIGluIEJ5dGVzLiBPaG5lIEtvbXByZXNzaW9uIGlzdCBhdWNoIDAgZXJsYXVidC4KCXNhbF9JbnQzMiAgeERwbW07ICAgICAgLy8gRG90IHBlciBNZXRlciAoMCBpc3QgZXJsYXVidCkKCXNhbF9JbnQzMiAgeURwbW07ICAgICAgLy8gRG90IHBlciBNZXRlciAoMCBpc3QgZXJsYXVidCkKCXNhbF91SW50MzIgQ29sVXNlZDsgICAgLy8gQW56YWhsIGRlciB2ZXJ3ZW5kZXRlbiBGYXJiZW4gKDA9YWxsZSkKCXNhbF91SW50MzIgQ29sTXVzdDsgICAgLy8gQW56YWhsIGRlciB3aWNodGlnZW4gRmFyYmVuICgwPWFsbGUpCgoJZnJpZW5kIFN2U3RyZWFtJiBvcGVyYXRvcjw8KFN2U3RyZWFtJiByT1N0cmVhbSwgQm1wSW5mb0hlYWRlciYgckhlYWQpOwp9OwoKI2RlZmluZSBSR0JRdWFkU2l6ZSA0CmNsYXNzIFJHQlF1YWQgewpwcml2YXRlOgoJc2FsX3VJbnQ4IFJlZDsKCXNhbF91SW50OCBHcm47CglzYWxfdUludDggQmx1OwoJc2FsX3VJbnQ4IEZpbDsKcHVibGljOgoJUkdCUXVhZChzYWxfdUludDggUiwgc2FsX3VJbnQ4IEcsIHNhbF91SW50OCBCKSB7IFJlZD1SOyBHcm49RzsgQmx1PUI7IEZpbD0wOyB9Cn07CgojZW5kaWYgLy9fU0dGQlJBTV9IWFgK