LyoKICogU3RhcnQKICogTm9yd2VnaWFuIEJva23lbCBMYW5ndWFnZSBTdXBwb3J0CiAqCiAqIENvcHlyaWdodCAyMDA1IEFsZXhhbmRlciBOLiBT+HJuZXMgPGFsZXhAdGhlaGFuZG9mYWdvbnkuY29tPgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgpMQU5HVUFHRSBMQU5HX05PUldFR0lBTiwgU1VCTEFOR19OT1JXRUdJQU5fQk9LTUFMCgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRSBMQU5HVUFHRSBMQU5HX05PUldFR0lBTiwgU1VCTEFOR19OT1JXRUdJQU5fQk9LTUFMCnsKU1RSSU5HX1VTQUdFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0YXJ0ZSBldCBwcm9ncmFtLCBlbGxlciDlcG5lIGV0IGRva3VtZW50IGkgcHJvZ3JhbW1ldCBzb20gZXIgdGlsa255dHRldCBmaWxlciBtZWQgZGV0IGV0dGVybmF2bmV0LiBcblwKQnJ1azogXG5cCnN0YXJ0IFt2YWxnXSBwcm9ncmFtX2ZpbG5hdm4gWy4uLl0gXG5cCnN0YXJ0IFt2YWxnXSBkb2t1bWVudF9maWxuYXZuIFxuXAogXG5cClZhbGc6IFxuXAovTVtpbmltaXplZF0gU3RhcnQgcHJvZ3JhbW1ldCBtaW5pbWVydC4gXG5cCi9NQVhbaW1pemVkXSBTdGFydCBwcm9ncmFtbWV0IG1ha3NpbWVydC4gXG5cCi9SW2VzdG9yZWRdICBTdGFydCBwcm9ncmFtbWV0IG5vcm1hbHQgKGh2ZXJrZW4gbWluaW1lcnQgZWxsZXIgbWFrc2ltZXJ0KS4gXG5cCi9XW2FpdF0gICAgICBWZW50IHRpbCBwcm9ncmFtbWV0IGF2c2x1dHRlciwgb2cgYXZzbHV0dCBtZWQgcHJvZ3JhbW1ldHMgXG5cICAgICAgICAgICAgIGF2c2x1dHRpbmdza29kZS4gXG5cCi9MICAgICAgICAgICBWaXMgc2x1dHRicnVrZXItbGlzZW5zZW4uIFxuXAogXG5cCnN0YXJ0LmV4ZSB2ZXJzam9uIDAuMiBLb3BpcmV0dCBmb3IgMjAwMyB0aWxo+HJlciBEYW4gS2VnZWwgXG5cCk92ZXJzYXR0IGF2IEFsZXhhbmRlciBOLiBT+HJuZXMgXG5cClN0YXJ0IGtvbW1lciBVVEVOIEVOSFZFUiBGT1JNIEZPUiBHQVJBTlRJOyBravhyIG1lZCAvTC12YWxnZXQgZm9yIGRldGFsamVyLiBcblwKRGV0dGUgZXIgZnJpIHByb2dyYW12YXJlLCBvZyBkdSBrYW4gcmVkaXN0cmlidWVyZSBkZXQgdW5kZXIgdmlzc2Ugdmlsa+VyOyBravhyICdzdGFydCAvTCcgZm9yIGRldGFsamVyLiBcblwKIgoKU1RSSU5HX0xJQ0VOU0UsICJzdGFydC5leGUgdmVyc2pvbiAwLjIgS29waXJldHQgZm9yIDIwMDMgdGlsaPhyZXIgRGFuIEtlZ2VsIFxuXApPdmVyc2F0dCBhdiBBbGV4YW5kZXIgTi4gU/hybmVzIFxuXApEZXR0ZSBwcm9ncmFtbWV0IGVyIGZyaSBwcm9ncmFtdmFyZTsgZHUga2FuIHJlZGlzdHJpYnVlcmUgZGV0IFxuXApvZy9lbGxlciBlbmRyZSBkZXQgaSBoZW5ob2xkIHRpbCB2aWxr5XJlbmUgaSAnR05VIExlc3NlciBQdWJsaWMgXG5cCkxpY2Vuc2UnIHNvbSB1dGdpdHQgYXYgJ3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24nOyBlbnRlbiBcblwKdmVyc2pvbiAyLjEgYXYgTGlzZW5zZW4sIGVsbGVyIChodmlzIGR1IPhuc2tlciBkZXQpIGVuIG55ZXJlIHZlcnNqb24uIFxuXAogXG5cCkRldHRlIHByb2dyYW1tZXQgZXIgZGlzdHJpYnVlcnQgbWVkIGRldCBo5XAgYXQgZGV0IGVyIG55dHRpZywgXG5cCm1lbiBVVEVOIEVOSFZFUiBGT1JNIEZPUiBHQVJBTlRJOyBpa2tlIGVuZ2FuZyBkZW4gYW50eWRldGUgZ2FyYW50aWVuIFxuXApmb3IgSEFOREVMU0RZS1RJR0hFVCBlbGxlciBFR05FVEhFVCBGT1IgRVQgQkVTVEVNVCBGT1JNxUwuIFNlIFxuXAonR05VIExlc3NlciBQdWJsaWMgTGljZW5zZScgZm9yIGZsZXJlIGRldGFsamVyLiBcblwKIFxuXApEdSBza2FsIGhhIG1vdHRhdHQgZW4ga29waSBhdiAnR05VIExlc3NlciBQdWJsaWMgTGljZW5zZSBzYW1tZW4gXG5cCm1lZCBkZXR0ZSBwcm9ncmFtbWV0OyBodmlzIGlra2UsIHNrcml2IHRpbCAndGhlIEZyZWUgU29mdHdhcmUgXG5cCkZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBcblwKTUEgMDIxMTEtMTMwNywgVVNBLicgXG5cCiBcblwKU2UgZmlsZW4gJ0NPUFlJTkcuTElCJyBmb3IgbGlzZW5zaW5mb3JtYXNqb24uIFxuXAoiCgpTVFJJTkdfRVhFQ0ZBSUwgIkt1bm5lIGlra2Ugc3RhcnRlIHByb2dyYW1tZXQsIGVsbGVyIGludGV0IHByb2dyYW0gZXIgdGlsa255dHRldCBkZW4gb3BwZ2l0dGUgZmlsZW4uXG4nU2hlbGxFeGVjdXRlRXgnIGZlaWxldCIKfQo=