Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHLTQgSEUtQUFDIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uIExvaHdhc3NlcgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKioKICogXGZpbGUgICBhYWNlbmNfbGliLmgKICogXGJyaWVmICBGREsgQUFDIEVuY29kZXIgbGlicmFyeSBpbnRlcmZhY2UgaGVhZGVyIGZpbGUuCiAqClxtYWlucGFnZSAgSW50cm9kdWN0aW9uCgpcc2VjdGlvbiBTY29wZQoKVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGhpZ2gtbGV2ZWwgaW50ZXJmYWNlIGFuZCB1c2FnZSBvZiB0aGUgSVNPL01QRUctMi80IEFBQyBFbmNvZGVyCmxpYnJhcnkgZGV2ZWxvcGVkIGJ5IHRoZSBGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyAoSUlTKS4KClRoZSBsaWJyYXJ5IGltcGxlbWVudHMgZW5jb2Rpbmcgb24gdGhlIGJhc2lzIG9mIHRoZSBNUEVHLTIgYW5kIE1QRUctNCBBQUMgTG93LUNvbXBsZXhpdHkKc3RhbmRhcmQsIGFuZCBkZXBlbmRpbmcgb24gdGhlIGxpYnJhcnkncyBjb25maWd1cmF0aW9uLCBNUEVHLTQgSGlnaC1FZmZpY2llbmN5IEFBQyB2MiBhbmQvb3IgQUFDLUVMRCBzdGFuZGFyZC4KCkFsbCByZWZlcmVuY2VzIHRvIFNCUiAoU3BlY3RyYWwgQmFuZCBSZXBsaWNhdGlvbikgYXJlIG9ubHkgYXBwbGljYWJsZSB0byBIRS1BQUMgb3IgQUFDLUVMRCB2ZXJzaW9ucwpvZiB0aGUgbGlicmFyeS4gQWxsIHJlZmVyZW5jZXMgdG8gUFMgKFBhcmFtZXRyaWMgU3RlcmVvKSBhcmUgb25seSBhcHBsaWNhYmxlIHRvIEhFLUFBQyB2Mgp2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeS4KClxzZWN0aW9uIGVuY0Jhc2ljcyBFbmNvZGVyIEJhc2ljcwoKVGhpcyBkb2N1bWVudCBjYW4gb25seSBnaXZlIGEgcm91Z2ggb3ZlcnZpZXcgYWJvdXQgdGhlIElTTy9NUEVHLTIgYW5kIElTTy9NUEVHLTQgQUFDIGF1ZGlvIGNvZGluZwpzdGFuZGFyZC4gVG8gdW5kZXJzdGFuZCBhbGwgdGhlIHRlcm1zIGluIHRoaXMgZG9jdW1lbnQsIHlvdSBhcmUgZW5jb3VyYWdlZCB0byByZWFkIHRoZSBmb2xsb3dpbmcgZG9jdW1lbnRzLgoKLSBJU08vSUVDIDEzODE4LTcgKE1QRUctMiBBQUMpLCB3aGljaCBkZWZpbmVzIHRoZSBzeW50YXggb2YgTVBFRy0yIEFBQyBhdWRpbyBiaXRzdHJlYW1zLgotIElTTy9JRUMgMTQ0OTYtMyAoTVBFRy00IEFBQywgc3VicGFydHMgMSBhbmQgNCksIHdoaWNoIGRlZmluZXMgdGhlIHN5bnRheCBvZiBNUEVHLTQgQUFDIGF1ZGlvIGJpdHN0cmVhbXMuCi0gTHV0emt5LCBTY2h1bGxlciwgR2F5ZXIsIEtyJmF1bWw7bWVyLCBXYWJuaWssICJBIGd1aWRlbGluZSB0byBhdWRpbyBjb2RlYyBkZWxheSIsIDExNnRoIEFFUyBDb252ZW50aW9uLCBNYXkgOCwgMjAwNAoKTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgaXMgYmFzZWQgb24gYSB0aW1lLXRvLWZyZXF1ZW5jeSBtYXBwaW5nIG9mIHRoZSBzaWduYWwuIFRoZSBzaWduYWwgaXMKcGFydGl0aW9uZWQgaW50byBvdmVybGFwcGluZyBwb3J0aW9ucyBhbmQgdHJhbnNmb3JtZWQgaW50byBmcmVxdWVuY3kgZG9tYWluLiBUaGUgc3BlY3RyYWwgY29tcG9uZW50cwphcmUgdGhlbiBxdWFudGl6ZWQgYW5kIGNvZGVkLiBcbgpBbiBNUEVHLTIgb3IgTVBFRy00IEFBQyBhdWRpbyBiaXRzdHJlYW0gaXMgY29tcG9zZWQgb2YgZnJhbWVzLiBDb250cmFyeSB0byBNUEVHLTEvMiBMYXllci0zIChtcDMpLCB0aGUKbGVuZ3RoIG9mIGluZGl2aWR1YWwgZnJhbWVzIGlzIG5vdCByZXN0cmljdGVkIHRvIGEgZml4ZWQgbnVtYmVyIG9mIGJ5dGVzLCBidXQgY2FuIHRha2Ugb24gYW55IGxlbmd0aApiZXR3ZWVuIDEgYW5kIDc2OCBieXRlcy4KCgpccGFnZSBMSUJVU0UgTGlicmFyeSBVc2FnZQoKXHNlY3Rpb24gSW50ZXJmYWNlRGVzY3JpcHRpb24gQVBJIEZpbGVzCgpBbGwgQVBJIGhlYWRlciBmaWxlcyBhcmUgbG9jYXRlZCBpbiB0aGUgZm9sZGVyIC9pbmNsdWRlIG9mIHRoZSByZWxlYXNlIHBhY2thZ2UuIEFsbCBoZWFkZXIgZmlsZXMKYXJlIHByb3ZpZGVkIGZvciB1c2FnZSBpbiBDL0MrKyBwcm9ncmFtcy4gVGhlIEFBQyBlbmNvZGVyIGxpYnJhcnkgQVBJIGZ1bmN0aW9ucyBhcmUgbG9jYXRlZCBhdAphYWNlbmNfbGliLmguCgpJbiBiaW5hcnkgcmVsZWFzZXMgdGhlIGVuY29kZXIgY29yZSByZXNpZGVzIGluIHN0YXRpY2FsbHkgbGlua2FibGUgbGlicmFyaWVzIGNhbGxlZCBmb3IgZXhhbXBsZQpsaWJBQUNlbmMuYS9saWJGREsuYSAoTElOVVgpIG9yIEZES19mYXN0YWFjbGliLmxpYiAoTVMgVmlzdWFsIEMrKykgZm9yIHRoZSBwbGFpbiBBQUMtTEMgY29yZSBlbmNvZGVyCmFuZCBsaWJTQlJlbmMuYSAoTElOVVgpIG9yIEZES19zYnJFbmNMaWIubGliIChNUyBWaXN1YWwgQysrKSBmb3IgdGhlIFNCUiAoU3BlY3RyYWwgQmFuZApSZXBsaWNhdGlvbikgYW5kIFBTIChQYXJhbWV0cmljIFN0ZXJlbykgbW9kdWxlcy4KClxzZWN0aW9uIENhbGxpbmdTZXF1ZW5jZSBDYWxsaW5nIFNlcXVlbmNlCgpGb3IgZW5jb2Rpbmcgb2YgSVNPL01QRUctMi80IEFBQyBiaXRzdHJlYW1zIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2UgaXMgbWFuZGF0b3J5LiBJbnB1dCByZWFkIGFuZCBvdXRwdXQKd3JpdGUgZnVuY3Rpb25zIGFzIHdlbGwgYXMgdGhlIGNvcnJlc3BvbmRpbmcgb3BlbiBhbmQgY2xvc2UgZnVuY3Rpb25zIGFyZSBsZWZ0IG91dCwgc2luY2UgdGhleSBtYXkgYmUKaW1wbGVtZW50ZWQgZGlmZmVyZW50bHkgYWNjb3JkaW5nIHRvIHRoZSB1c2VyJ3Mgc3BlY2lmaWMgcmVxdWlyZW1lbnRzLiBUaGUgZXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBpbgptYWluLmNwcCB1c2VzIGZpbGUtYmFzZWQgaW5wdXQvb3V0cHV0LgoKLSMgQ2FsbCBhYWNFbmNPcGVuKCkgdG8gYWxsb2NhdGUgZW5jb2RlciBpbnN0YW5jZSB3aXRoIHJlcXVpcmVkIFxyZWYgZW5jT3BlbiAiY29uZmlndXJhdGlvbiIuXG4KXGRvbnRpbmNsdWRlIG1haW4uY3BwClxza2lwbGluZSBoQWFjRW5jb2RlciA9Clxza2lwbGluZSBhYWNFbmNPcGVuCi0jIENhbGwgYWFjRW5jb2Rlcl9TZXRQYXJhbSgpIGZvciBlYWNoIHBhcmFtZXRlciB0byBiZSBzZXQuIEFPVCwgc2FtcGxpbmdyYXRlLCBjaGFubmVsTW9kZSwgYml0cmF0ZSBhbmQgdHJhbnNwb3J0IHR5cGUgYXJlIFxyZWYgZW5jUGFyYW1zICJtYW5kYXRvcnkiLgpcY29kZQogICAgRXJyb3JTdGF0dXMgPSBhYWNFbmNvZGVyX1NldFBhcmFtKGhBYWNFbmNvZGVyLCBwYXJhbWV0ZXIsIHZhbHVlKTsKXGVuZGNvZGUKLSMgQ2FsbCBhYWNFbmNFbmNvZGUoKSB3aXRoIE5VTEwgcGFyYW1ldGVycyB0byBccmVmIGVuY1JlY29uZiAiaW5pdGlhbGl6ZSIgZW5jb2RlciBpbnN0YW5jZSB3aXRoIHByZXNlbnQgcGFyYW1ldGVyIHNldC4KXHNraXBsaW5lIGFhY0VuY0VuY29kZQotIyBDYWxsIGFhY0VuY0luZm8oKSB0byByZXRyaWV2ZSBhIGNvbmZpZ3VyYXRpb24gZGF0YSBibG9jayB0byBiZSB0cmFuc21pdHRlZCBvdXQgb2YgYmFuZC4gVGhpcyBpcyByZXF1aXJlZCB3aGVuIHVzaW5nIFJGQzM2NDAgb3IgUkZDMzAxNiBsaWtlIHRyYW5zcG9ydC4KXGRvbnRpbmNsdWRlIG1haW4uY3BwClxza2lwbGluZSBlbmNJbmZvClxza2lwbGluZSBhYWNFbmNJbmZvCi0jIEVuY29kZSBpbnB1dCBhdWRpbyBkYXRhIGluIGxvb3AuClxza2lwIEVuY29kZSBhcyBsb25nIGFzClxza2lwbGluZSBkbwpcdW50aWwgewpGZWVkIFxyZWYgZmVlZEluQnVmICJpbnB1dCBidWZmZXIiIHdpdGggbmV3IGF1ZGlvIGRhdGEgYW5kIHByb3ZpZGUgaW5wdXQvb3V0cHV0IFxyZWYgYnVmRGVzICJhcmd1bWVudHMiIHRvIGFhY0VuY0VuY29kZSgpLgpcc2tpcGxpbmUgYWFjRW5jRW5jb2RlClx1bnRpbCA7CldyaXRlIFxyZWYgd3JpdGVPdXREYXRhICJvdXRwdXQgZGF0YSIgdG8gZmlsZSBvciBhdWRpbyBkZXZpY2UuIFxza2lwbGluZSB3aGlsZQotIyBDYWxsIGFhY0VuY0Nsb3NlKCkgYW5kIGRlc3Ryb3kgZW5jb2RlciBpbnN0YW5jZS4KXHNraXBsaW5lIGFhY0VuY0Nsb3NlCgpcc2VjdGlvbiBlbmNPcGVuIEVuY29kZXIgSW5zdGFuY2UgQWxsb2NhdGlvbgoKVGhlIGFzc2lnbm1lbnQgb2YgdGhlIGFhY0VuY09wZW4oKSBmdW5jdGlvbiBpcyB2ZXJ5IGZsZXhpYmxlIGFuZCBjYW4gYmUgdXNlZCBpbiB0aGUgZm9sbG93aW5nIHdheS4KLSBJZiB0aGUgYW1vdW50IG9mIG1lbW9yeSBjb25zdW1wdGlvbiBpcyBub3QgYW4gaXNzdWUsIHRoZSBlbmNvZGVyIGluc3RhbmNlIGNhbiBiZSBhbGxvY2F0ZWQKZm9yIHRoZSBtYXhpbXVtIG51bWJlciBvZiBwb3NzaWJsZSBhdWRpbyBjaGFubmVscyAoZm9yIGV4YW1wbGUgNiBvciA4KSB3aXRoIHRoZSBmdWxsIGZ1bmN0aW9uYWwgcmFuZ2Ugc3VwcG9ydGVkIGJ5IHRoZSBsaWJyYXJ5LgpUaGlzIGlzIHRoZSBkZWZhdWx0IG9wZW4gcHJvY2VkdXJlIGZvciB0aGUgQUFDIGVuY29kZXIgaWYgbWVtb3J5IGNvbnN1bXB0aW9uIGRvZXMgbm90IG5lZWQgdG8gYmUgbWluaW1pemVkLgpcY29kZSBhYWNFbmNPcGVuKCZoQWFjRW5jb2RlciwwLDApIFxlbmRjb2RlCi0gSWYgdGhlIHJlcXVpcmVkIE1QRUctNCBBT1RzIGRvIG5vdCBjYWxsIGZvciB0aGUgZnVsbCBmdW5jdGlvbmFsIHJhbmdlIG9mIHRoZSBsaWJyYXJ5LCBlbmNvZGVyIG1vZHVsZXMgY2FuIGJlIGFsbG9jYXRlZCBzZWxlY3RpdmVseS4KXHZlcmJhdGltCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogQUFDIHwgU0JSIHwgIFBTIHwgTUQgfCAgICAgICAgIEZMQUdTICAgICAgICAgfCB2YWx1ZQotLS0tLSstLS0tLSstLS0tLSstLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0KICBYICB8ICAtICB8ICAtICB8ICAtIHwgKDB4MDEpICAgICAgICAgICAgICAgIHwgIDB4MDEKICBYICB8ICBYICB8ICAtICB8ICAtIHwgKDB4MDF8MHgwMikgICAgICAgICAgIHwgIDB4MDMKICBYICB8ICBYICB8ICBYICB8ICAtIHwgKDB4MDF8MHgwMnwweDA0KSAgICAgIHwgIDB4MDcKICBYICB8ICAtICB8ICAtICB8ICBYIHwgKDB4MDEgICAgICAgICAgfDB4MTApIHwgIDB4MTEKICBYICB8ICBYICB8ICAtICB8ICBYIHwgKDB4MDF8MHgwMiAgICAgfDB4MTApIHwgIDB4MTMKICBYICB8ICBYICB8ICBYICB8ICBYIHwgKDB4MDF8MHgwMnwweDA0fDB4MTApIHwgIDB4MTcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAtIEFBQzogQWxsb2NhdGUgQUFDIENvcmUgRW5jb2RlciBtb2R1bGUuCiAtIFNCUjogQWxsb2NhdGUgU3BlY3RyYWwgQmFuZCBSZXBsaWNhdGlvbiBtb2R1bGUuCiAtIFBTOiBBbGxvY2F0ZSBQYXJhbWV0cmljIFN0ZXJlbyBtb2R1bGUuCiAtIE1EOiBBbGxvY2F0ZSBNZXRhIERhdGEgbW9kdWxlIHdpdGhpbiBBQUMgZW5jb2Rlci4KXGVuZHZlcmJhdGltClxjb2RlIGFhY0VuY09wZW4oJmhBYWNFbmNvZGVyLHZhbHVlLDApIFxlbmRjb2RlCi0gU3BlY2lmeWluZyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhbm5lbHMgdG8gYmUgc3VwcG9ydGVkIGluIHRoZSBlbmNvZGVyIGluc3RhbmNlIGNhbiBiZSBkb25lIGFzIGZvbGxvd3MuCiAtIEZvciBleGFtcGxlIGFsbG9jYXRlIGFuIGVuY29kZXIgaW5zdGFuY2Ugd2hpY2ggc3VwcG9ydHMgMiBjaGFubmVscyBmb3IgYWxsIHN1cHBvcnRlZCBBT1RzLgogICBUaGUgbGlicmFyeSBpdHNlbGYgbWF5IGJlIGNhcGFibGUgb2YgZW5jb2RpbmcgdXAgdG8gNiBvciA4IGNoYW5uZWxzIGJ1dCBpbiB0aGlzIGV4YW1wbGUgb25seSAyIGNoYW5uZWwgZW5jb2RpbmcgaXMgcmVxdWlyZWQgYW5kIHRodXMgb25seSBidWZmZXJzIGZvciAyIGNoYW5uZWxzIGFyZSBhbGxvY2F0ZWQgdG8gc2F2ZSBkYXRhIG1lbW9yeS4KXGNvZGUgYWFjRW5jT3BlbigmaEFhY0VuY29kZXIsMCwyKSBcZW5kY29kZQogLSBBZGRpdGlvbmFsbHkgdGhlIG1heGltdW0gbnVtYmVyIG9mIHN1cHBvcnRlZCBjaGFubmVscyBpbiB0aGUgU0JSIG1vZHVsZSBjYW4gYmUgZGVub3RlZCBzZXBhcmF0ZWx5LlxuCiAgIEluIHRoaXMgZXhhbXBsZSB0aGUgZW5jb2RlciBpbnN0YW5jZSBwcm92aWRlcyBhIG1heGltdW0gb2YgNiBjaGFubmVscyBvdXQgb2Ygd2hpY2ggdXAgdG8gMiBjaGFubmVscyBzdXBwb3J0IFNCUi4KICAgVGhpcyBlbmNvZGVyIGluc3RhbmNlIGNhbiBwcm9kdWNlIGZvciBleGFtcGxlIDUuMSBjaGFubmVsIEFBQy1MQyBzdHJlYW1zIG9yIHN0ZXJlbyBIRS1BQUMgKHYyKSBzdHJlYW1zLgogICBIRS1BQUMgNS4xIG11bHRpIGNoYW5uZWwgaXMgbm90IHBvc3NpYmxlIHNpbmNlIG9ubHkgMiBvdXQgb2YgNiBjaGFubmVscyBzdXBwb3J0IFNCUiwgd2hpY2ggc2F2ZXMgZGF0YSBtZW1vcnkuClxjb2RlIGFhY0VuY09wZW4oJmhBYWNFbmNvZGVyLDAsNnwoMjw8OCkpIFxlbmRjb2RlClxuCgpcc2VjdGlvbiBidWZEZXMgSW5wdXQvT3V0cHV0IEFyZ3VtZW50cwoKXHN1YnNlY3Rpb24gYWxsb2NJT0J1ZnMgUHJvdmlkZSBCdWZmZXIgRGVzY3JpcHRvcnMKSW4gdGhlIHByZXNlbnQgZW5jb2RlciBBUEksIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgYXJlIGRlc2NyaWJlZCB3aXRoIFxyZWYgQUFDRU5DX0J1ZkRlc2MgImJ1ZmZlciBkZXNjcmlwdG9ycyIuIFRoaXMgbWVjaGFuaXNtIGFsbG93cyBhIGZsZXhpYmxlIGhhbmRsaW5nCm9mIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyB3aXRob3V0IGltcGFjdCB0byB0aGUgYWN0dWFsIGVuY29kaW5nIGNhbGwuIE9wdGlvbmFsIGJ1ZmZlcnMgYXJlIG5lY2Vzc2FyeSBlLmcuIGZvciBhbmNpbGxhcnkgZGF0YSwgbWV0YSBkYXRhIGlucHV0IG9yIGFkZGl0aW9uYWwgb3V0cHV0CmJ1ZmZlcnMgZGVzY3JpYmluZyBzdXBlcmZyYW1pbmcgZGF0YSBpbiBEQUIrIG9yIERSTSsuXG4KQXQgbGVhc3Qgb25lIGlucHV0IGJ1ZmZlciBmb3IgYXVkaW8gaW5wdXQgZGF0YSBhbmQgb25lIG91dHB1dCBidWZmZXIgZm9yIGJpdHN0cmVhbSBkYXRhIG11c3QgYmUgYWxsb2NhdGVkLiBUaGUgaW5wdXQgYnVmZmVyIHNpemUgY2FuIGJlIGEgdXNlciBkZWZpbmVkIG11bHRpcGxlCm9mIHRoZSBudW1iZXIgb2YgaW5wdXQgY2hhbm5lbHMuIFBDTSBpbnB1dCBkYXRhIHdpbGwgYmUgY29waWVkIGZyb20gdGhlIHVzZXIgZGVmaW5lZCBQQ00gYnVmZmVyIHRvIGFuIGludGVybmFsIGlucHV0IGJ1ZmZlciBhbmQgc28gaW5wdXQgZGF0YSBjYW4gYmUgbGVzcyB0aGFuIG9uZSBBQUMgYXVkaW8gZnJhbWUuClRoZSBvdXRwdXQgYnVmZmVyIHNpemUgc2hvdWxkIGJlIDYxNDQgYml0cyBwZXIgY2hhbm5lbCBleGNsdWRpbmcgdGhlIExGRSBjaGFubmVsLgpJZiB0aGUgb3V0cHV0IGRhdGEgZG9lcyBub3QgZml0IGludG8gdGhlIHByb3ZpZGVkIGJ1ZmZlciwgYW4gQUFDRU5DX0VSUk9SIHdpbGwgYmUgcmV0dXJuZWQgYnkgYWFjRW5jRW5jb2RlKCkuClxkb250aW5jbHVkZSBtYWluLmNwcApcc2tpcGxpbmUgaW5wdXRCdWZmZXIKXHVudGlsIG91dHB1dEJ1ZmZlcgpBbGwgaW5wdXQgYW5kIG91dHB1dCBidWZmZXIgbXVzdCBiZSBjbHVzdGVyZWQgaW4gaW5wdXQgYW5kIG91dHB1dCBidWZmZXIgYXJyYXlzLgpcc2tpcGxpbmUgaW5CdWZmZXIKXHVudGlsIG91dEJ1ZmZlckVsU2l6ZQpBbGxvY2F0ZSBidWZmZXIgZGVzY3JpcHRvcnMKXHNraXBsaW5lIEFBQ0VOQ19CdWZEZXNjClxza2lwbGluZSBBQUNFTkNfQnVmRGVzYwpJbml0aWFsaXplIGlucHV0IGJ1ZmZlciBkZXNjcmlwdG9yClxza2lwbGluZSBpbkJ1ZkRlc2MKXHVudGlsIGJ1ZkVsU2l6ZXMKSW5pdGlhbGl6ZSBvdXRwdXQgYnVmZmVyIGRlc2NyaXB0b3IKXHNraXBsaW5lIG91dEJ1ZkRlc2MKXHVudGlsIGJ1ZkVsU2l6ZXMKClxzdWJzZWN0aW9uIGFyZ0xpc3RzIFByb3ZpZGUgSW5wdXQvT3V0cHV0IEFyZ3VtZW50IExpc3RzClRoZSBpbnB1dCBhbmQgb3V0cHV0IGFyZ3VtZW50cyBvZiBhbiBhYWNFbmNFbmNvZGUoKSBjYWxsIGFyZSBkZXNjcmliZWQgaW4gYXJndW1lbnQgc3RydWN0dXJlcy4KXGRvbnRpbmNsdWRlIG1haW4uY3BwClxza2lwbGluZSBBQUNFTkNfSW5BcmdzClxza2lwbGluZSBBQUNFTkNfT3V0QXJncwoKXHNlY3Rpb24gZmVlZEluQnVmIEZlZWQgSW5wdXQgQnVmZmVyClRoZSBpbnB1dCBidWZmZXIgc2hvdWxkIGJlIGhhbmRsZWQgYXMgYSBtb2R1bG8gYnVmZmVyLiBOZXcgYXVkaW8gZGF0YSBpbiB0aGUgZm9ybSBvZiBwdWxzZS1jb2RlLQptb2R1bGF0ZWQgc2FtcGxlcyAoUENNKSBtdXN0IGJlIHJlYWQgZnJvbSBleHRlcm5hbCBhbmQgYmUgZmVkIHRvIHRoZSBpbnB1dCBidWZmZXIgZGVwZW5kaW5nIG9uIGl0cwpmaWxsIGxldmVsLiBUaGUgcmVxdWlyZWQgc2FtcGxlIGJpdHJhdGUgKHJlcHJlc2VudGVkIGJ5IHRoZSBkYXRhIHR5cGUgSU5UX1BDTSB3aGljaCBpcyAxNiwgMjQgb3IgMzIKYml0cyB3aWRlKSBpcyBmaXhlZCBhbmQgZGVwZW5kcyBvbiBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24gKHVzdWFsbHkgMTYgYml0KS4KClxkb250aW5jbHVkZSBtYWluLmNwcApcc2tpcGxpbmUgV0FWX0lucHV0UmVhZApcdW50aWwgOwpBZnRlciB0aGUgZW5jb2RlcidzIGludGVybmFsIGJ1ZmZlciBpcyBmZWQgd2l0aCBpbmNvbWluZyBhdWRpbyBzYW1wbGVzLCBhbmQgYWFjRW5jRW5jb2RlKCkKcHJvY2Vzc2VkIHRoZSBuZXcgaW5wdXQgZGF0YSwgdXBkYXRlL21vdmUgcmVtYWluaW5nIHNhbXBsZXMgaW4gaW5wdXQgYnVmZmVyLCBzaW11bGF0aW5nIGEgbW9kdWxvIGJ1ZmZlcjoKXHNraXBsaW5lIG91dGFyZ3MubnVtSW5TYW1wbGVzPjAKXHVudGlsIH0KClxzZWN0aW9uIHdyaXRlT3V0RGF0YSBPdXRwdXQgQml0c3RyZWFtIERhdGEKSWYgYW55IEFBQyBiaXRzdHJlYW0gZGF0YSBpcyBhdmFpbGFibGUsIHdyaXRlIGl0IHRvIG91dHB1dCBmaWxlIG9yIGRldmljZS4gVGhpcyBjYW4gYmUgZG9uZSBvbmNlIHRoZQpmb2xsb3dpbmcgY29uZGl0aW9uIGlzIHRydWU6Clxkb250aW5jbHVkZSBtYWluLmNwcApcc2tpcCBWYWxpZCBiaXRzdHJlYW0gYXZhaWxhYmxlClxza2lwbGluZSBvdXRhcmdzCgpcc2tpcGxpbmUgb3V0Qnl0ZXM+MAoKSWYgeW91IHVzZSBmaWxlIEkvTyB0aGVuIGZvciBleGFtcGxlIGNhbGwgbXBlZ0ZpbGVXcml0ZV9Xcml0ZSgpIGZyb20gdGhlIGxpYnJhcnkgbGliTXBlZ0ZpbGVXcml0ZQoKXGRvbnRpbmNsdWRlIG1haW4uY3BwClxza2lwbGluZSBtcGVnRmlsZVdyaXRlX1dyaXRlCgpcc2VjdGlvbiBjZmdNZXRhRGF0YSBNZXRhIERhdGEgQ29uZmlndXJhdGlvbgoKSWYgdGhlIHByZXNlbnQgbGlicmFyeSBpcyBjb25maWd1cmVkIHdpdGggTWV0YWRhdGEgc3VwcG9ydCwgaXQgaXMgcG9zc2libGUgdG8gaW5zZXJ0IG1ldGEgZGF0YSBzaWRlIGluZm8gaW50byB0aGUgZ2VuZXJhdGVkCmF1ZGlvIGJpdHN0cmVhbSB3aGlsZSBlbmNvZGluZy4KClRvIHdvcmsgd2l0aCBtZXRhIGRhdGEgdGhlIGVuY29kZXIgaW5zdGFuY2UgaGFzIHRvIGJlIFxyZWYgZW5jT3BlbiAiYWxsb2NhdGVkIiB3aXRoIG1ldGEgZGF0YSBzdXBwb3J0LiBUaGUgbWV0YSBkYXRhIG1vZGUgbXVzdCBiZSBiZSBjb25maWd1cmVkIHdpdGgKdGhlIDo6QUFDRU5DX01FVEFEQVRBX01PREUgcGFyYW1ldGVyIGFuZCBhYWNFbmNvZGVyX1NldFBhcmFtKCkgZnVuY3Rpb24uClxjb2RlIGFhY0VuY29kZXJfU2V0UGFyYW0oaEFhY0VuY29kZXIsIEFBQ0VOQ19NRVRBREFUQV9NT0RFLCAwLTIpOyBcZW5kY29kZQoKVGhpcyBjb25maWd1cmF0aW9uIGluZGljYXRlcyBob3cgdG8gZW1iZWQgbWV0YSBkYXRhIGludG8gYml0c3RyZW0uIEVpdGhlciBubyBpbnNlcnRpb24sIE1QRUcgb3IgRVRTSSBzdHlsZS4KVGhlIG1ldGEgZGF0YSBpdHNlbGYgbXVzdCBiZSBzcGVjaWZpZWQgd2l0aGluIHRoZSBtZXRhIGRhdGEgc2V0dXAgc3RydWN0dXJlIEFBQ0VOQ19NZXRhRGF0YS4KCkNoYW5naW5nIG9uZSBvZiB0aGUgQUFDRU5DX01ldGFEYXRhIHNldHVwIHBhcmFtZXRlcnMgY2FuIGJlIGFjaGlldmVkIGZyb20gb3V0c2lkZSB0aGUgbGlicmFyeSB3aXRoaW4gOjpJTl9NRVRBREFUQV9TRVRVUCBpbnB1dApidWZmZXIuIFRoZXJlIGlzIG5vIG5lZWQgdG8gc3VwcGx5IG1ldGEgZGF0YSBzZXR1cCBzdHJ1Y3R1cmUgZXZlcnkgZnJhbWUuIElmIHRoZXJlIGlzIG5vIG5ldyBtZXRhIHNldHVwIGRhdGEgYXZhaWxhYmxlLCB0aGUKZW5jb2RlciB1c2VzIHRoZSBwcmV2aW91cyBzZXR1cCBvciB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGluIGluaXRpYWwgc3RhdGUuCgpJbiBnZW5lcmFsIHRoZSBhdWRpbyBjb21wcmVzc29yIGFuZCBsaW1pdGVyIHdpdGhpbiB0aGUgZW5jb2RlciBsaWJyYXJ5IGNhbiBiZSBjb25maWd1cmVkIHdpdGggdGhlIDo6QUFDRU5DX01FVEFEQVRBX0RSQ19QUk9GSUxFIHBhcmFtZXRlcgpBQUNFTkNfTWV0YURhdGE6OmRyY19wcm9maWxlIGFuZCBhbmQgQUFDRU5DX01ldGFEYXRhOjpjb21wX3Byb2ZpbGUuClxuCgpcc2VjdGlvbiBlbmNSZWNvbmYgRW5jb2RlciBSZWNvbmZpZ3VyYXRpb24KClRoZSBlbmNvZGVyIGxpYnJhcnkgYWxsb3dzIHJlY29uZmlndXJhdGlvbiBvZiB0aGUgZW5jb2RlciBpbnN0YW5jZSB3aXRoIG5ldyBzZXR0aW5ncwpjb250aW51b3VzbHkgYmV0d2VlbiBlbmNvZGluZyBmcmFtZXMuIEVhY2ggcGFyYW1ldGVyIHRvIGJlIGNoYW5nZWQgbXVzdCBiZSBzZXQgd2l0aAphIHNpbmdsZSBhYWNFbmNvZGVyX1NldFBhcmFtKCkgY2FsbC4gVGhlIGludGVybmFsIHN0YXR1cyBvZiBlYWNoIHBhcmFtZXRlciBjYW4gYmUKcmV0cmlldmVkIHdpdGggYW4gYWFjRW5jb2Rlcl9HZXRQYXJhbSgpIGNhbGwuXG4KVGhlcmUgaXMgbm8gc3RhbmQtYWxvbmUgcmVjb25maWd1cmF0aW9uIGZ1bmN0aW9uIGF2YWlsYWJsZS4gV2hlbiBwYXJhbWV0ZXJzIHdlcmUKbW9kaWZpZWQgZnJvbSBvdXRzaWRlIHRoZSBsaWJyYXJ5LCBhbiBpbnRlcm5hbCBjb250cm9sIG1lY2hhbmlzbSB0cmlnZ2VycyB0aGUgbmVjZXNzYXJ5CnJlY29uZmlndXJhdGlvbiBwcm9jZXNzIHdoaWNoIHdpbGwgYmUgYXBwbGllZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmb2xsb3dpbmcKYWFjRW5jRW5jb2RlKCkgY2FsbC4gVGhpcyBzdGF0ZSBjYW4gYmUgb2JzZXJ2ZWQgZnJvbSBleHRlcm5hbCB2aWEgdGhlIEFBQ0VOQ19JTklUX1NUQVRVUwphbmQgYWFjRW5jb2Rlcl9HZXRQYXJhbSgpIGZ1bmN0aW9uLiBUaGUgcmVjb25maWd1cmF0aW9uIHByb2Nlc3MgY2FuIGFsc28gYmUgYXBwbGllZAppbW1lZGlhdGVseSB3aGVuIGFsbCBwYXJhbWV0ZXJzIG9mIGFuIGFhY0VuY0VuY29kZSgpIGNhbGwgYXJlIE5VTEwgd2l0aCBhIHZhbGlkIGVuY29kZXIKaGFuZGxlLlxuXG4KVGhlIGludGVybmFsIHJlY29uZmlndXJhdGlvbiBwcm9jZXNzIGNhbiBiZSBjb250cm9sbGVkIGZyb20gZXh0ZXJuIHdpdGggdGhlIGZvbGxvd2luZyBhY2Nlc3MuClxjb2RlIGFhY0VuY29kZXJfU2V0UGFyYW0oaEFhY0VuY29kZXIsIEFBQ0VOQ19DT05UUk9MX1NUQVRFLCBBQUNFTkNfQ1RSTEZMQUdTKTsgXGVuZGNvZGUKCgpcc2VjdGlvbiBlbmNQYXJhbXMgRW5jb2RlciBQYXJhbWV0cml6YXRpb24KCkFsbCBwYXJhbWV0ZXJlcyBsaXN0ZWQgaW4gOjpBQUNFTkNfUEFSQU0gY2FuIGJlIG1vZGlmaWVkIHdpdGhpbiBhbiBlbmNvZGVyIGluc3RhbmNlLgoKXHN1YnNlY3Rpb24gZW5jTWFuZGF0b3J5IE1hbmRhdG9yeSBFbmNvZGVyIFBhcmFtZXRlcnMKVGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdGhlIGVuY29kZXIgaW5zdGFuY2UgaXMgaW5pdGlhbGl6ZWQuClxjb2RlCmFhY0VuY29kZXJfU2V0UGFyYW0oaEFhY0VuY29kZXIsIEFBQ0VOQ19BT1QsIHZhbHVlKTsKYWFjRW5jb2Rlcl9TZXRQYXJhbShoQWFjRW5jb2RlciwgQUFDRU5DX0JJVFJBVEUsIHZhbHVlKTsKYWFjRW5jb2Rlcl9TZXRQYXJhbShoQWFjRW5jb2RlciwgQUFDRU5DX1NBTVBMRVJBVEUsIHZhbHVlKTsKYWFjRW5jb2Rlcl9TZXRQYXJhbShoQWFjRW5jb2RlciwgQUFDRU5DX0NIQU5ORUxNT0RFLCB2YWx1ZSk7ClxlbmRjb2RlCkJleW9uZCB0aGF0IGlzIGFuIGludGVybmFsIGF1dG8gbW9kZSB3aGljaCBwcmVpbml0aXppYWxpemVzIHRoZSA6OkFBQ0VOQ19CSVRSQVRFIHBhcmFtZXRlcgppZiB0aGUgcGFyYW1ldGVyIHdhcyBub3Qgc2V0IGZyb20gZXh0ZXJuLiBUaGUgYml0cmF0ZSBkZXBlbmRzIG9uIHRoZSBudW1iZXIgb2YgZWZmZWN0aXZlCmNoYW5uZWxzIGFuZCBzYW1wbGluZyByYXRlIGFuZCBpcyBkZXRlcm1pbmVkIGFzIGZvbGxvd3MuClxjb2RlCkFBQy1MQyAoQU9UX0FBQ19MQyk6IDEuNSBiaXRzIHBlciBzYW1wbGUKSEUtQUFDIChBT1RfU0JSKTogMC42MjUgYml0cyBwZXIgc2FtcGxlIChkdWFscmF0ZSBzYnIpCkhFLUFBQyAoQU9UX1NCUik6IDEuMTI1IGJpdHMgcGVyIHNhbXBsZSAoZG93bnNhbXBsZWQgc2JyKQpIRS1BQUMgdjIgKEFPVF9QUyk6IDAuNSBiaXRzIHBlciBzYW1wbGUKXGVuZGNvZGUKClxzdWJzZWN0aW9uIGNoYW5uZWxNb2RlIENoYW5uZWwgTW9kZSBDb25maWd1cmF0aW9uClRoZSBpbnB1dCBhdWRpbyBkYXRhIGlzIGRlc2NyaWJlZCB3aXRoIHRoZSA6OkFBQ0VOQ19DSEFOTkVMTU9ERSBwYXJhbWV0ZXIgaW4gdGhlCmFhY0VuY29kZXJfU2V0UGFyYW0oKSBjYWxsLiBJdCBpcyBub3QgcG9zc2libGUgdG8gdXNlIHRoZSBlbmNvZGVyIGluc3RhbmNlIHdpdGggYSAnbnVtYmVyIG9mCmlucHV0IGNoYW5uZWxzJyBhcmd1bWVudC4gSW5zdGVhZCwgdGhlIGNoYW5uZWxNb2RlIG11c3QgYmUgc2V0IGFzIGZvbGxvd3MuClxjb2RlIGFhY0VuY29kZXJfU2V0UGFyYW0oaEFhY0VuY29kZXIsIEFBQ0VOQ19DSEFOTkVMTU9ERSwgdmFsdWUpOyBcZW5kY29kZQpUaGUgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCBpbiA6OkNIQU5ORUxfTU9ERSBhbmQgY2FuIGJlIG1hcHBlZCBmcm9tIHRoZSBudW1iZXIgb2YgaW5wdXQgY2hhbm5lbHMKaW4gdGhlIGZvbGxvd2luZyB3YXkuClxkb250aW5jbHVkZSBtYWluLmNwcApcc2tpcCBDSEFOTkVMX01PREUgY2hNb2RlID0gTU9ERV9JTlZBTElEOwpcdW50aWwgcmV0dXJuCgpcc3Vic2VjdGlvbiBlbmNRdWFsIEF1ZGlvIFF1YWxpdHkgQ29uc2lkZXJhdGlvbnMKVGhlIGRlZmF1bHQgZW5jb2RlciBjb25maWd1cmF0aW9uIGlzIHN1Z2dlc3RlZCB0byBiZSB1c2VkLiBFbmNvZGVyIHRvb2xzIHN1Y2ggYXMgVE5TIGFuZCBQTlMKYXJlIGFjdGl2YXRlZCBieSBkZWZhdWx0IGFuZCBhcmUgaW50ZXJuYWxseSBjb250cm9sbGVkIChzZWUgXHJlZiBCRUhBVklPVVJfVE9PTFMpLgoKVGhlcmUgaXMgYW4gYWRkaXRpb25hbCBxdWFsaXR5IHBhcmFtZXRlciBjYWxsZWQgOjpBQUNFTkNfQUZURVJCVVJORVIuIEluIHRoZSBkZWZhdWx0CmNvbmZpZ3VyYXRpb24gdGhpcyBxdWFsaXR5IHN3aXRjaCBpcyBkZWFjdGl2YXRlZCBiZWNhdXNlIGl0IHdvdWxkIGNhdXNlIGEgd29ya2xvYWQKaW5jcmVhc2Ugd2hpY2ggbWlnaHQgYmUgc2lnbmlmaWNhbnQuIElmIHdvcmtsb2FkIGlzIG5vdCBhbiBpc3N1ZSBpbiB0aGUgYXBwbGljYXRpb24Kd2UgcmVjb21tZW5kZWQgdG8gYWN0aXZhdGUgdGhpcyBmZWF0dXJlLgpcY29kZSBhYWNFbmNvZGVyX1NldFBhcmFtKGhBYWNFbmNvZGVyLCBBQUNFTkNfQUZURVJCVVJORVIsIDEpOyBcZW5kY29kZQoKClxzZWN0aW9uIGF1ZGlvY2hDZmcgQXVkaW8gQ2hhbm5lbCBDb25maWd1cmF0aW9uClRoZSBNUEVHIHN0YW5kYXJkIHJlZmVycyBvZnRlbiB0byB0aGUgc28tY2FsbGVkIENoYW5uZWwgQ29uZmlndXJhdGlvbi4gVGhpcyBDaGFubmVsIENvbmZpZ3VyYXRpb24gaXMgdXNlZCBmb3IgYSBmaXhlZCBDaGFubmVsCk1hcHBpbmcuIFRoZSBjb25maWd1cmF0aW9ucyAxLTcgYXJlIHByZWRlZmluZWQgaW4gTVBFRyBzdGFuZGFyZCBhbmQgdXNlZCBmb3IgaW1wbGljaXQgc2lnbmFsbGluZyB3aXRoaW4gdGhlIGVuY29kZWQgYml0c3RyZWFtLgpGb3IgdXNlciBkZWZpbmVkIENvbmZpZ3VyYXRpb25zIHRoZSBDaGFubmVsIENvbmZpZ3VyYXRpb24gaXMgc2V0IHRvIDAgYW5kIHRoZSBDaGFubmVsIE1hcHBpbmcgbXVzdCBiZSBleHBsZWNpdGx5IGRlc2NyaWJlZCB3aXRoIGFuIGFwcHJvcHJpYXRlClByb2dyYW0gQ29uZmlnIEVsZW1lbnQuIFRoZSBwcmVzZW50IEVuY29kZXIgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgYWxsb3cgdGhlIHVzZXIgdG8gY29uZmlndXJlIHRoaXMgQ2hhbm5lbCBDb25maWd1cmF0aW9uIGZyb20KZXh0ZXJuLiBUaGUgRW5jb2RlciBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBmaXhlZCBDaGFubmVsIE1vZGVzIHdoaWNoIGFyZSBtYXBwZWQgdG8gQ2hhbm5lbCBDb25maWd1cmF0aW9uIGFzIGZvbGxvdy4KXHZlcmJhdGltCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBDaGFubmVsTW9kZSAgICAgfCBDaENmZyAgfCBmcm9udF9FbCB8IHNpZGVfRWwgIHwgYmFja19FbCAgfCBsZmVfRWwKLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0KTU9ERV8xICAgICAgICAgICB8ICAgICAgMSB8IFNDRSAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8Ck1PREVfMiAgICAgICAgICAgfCAgICAgIDIgfCBDUEUgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfApNT0RFXzFfMiAgICAgICAgIHwgICAgICAzIHwgU0NFLCBDUEUgfCAgICAgICAgICB8ICAgICAgICAgIHwKTU9ERV8xXzJfMSAgICAgICB8ICAgICAgNCB8IFNDRSwgQ1BFIHwgICAgICAgICAgfCBTQ0UgICAgICB8Ck1PREVfMV8yXzIgICAgICAgfCAgICAgIDUgfCBTQ0UsIENQRSB8ICAgICAgICAgIHwgQ1BFICAgICAgfApNT0RFXzFfMl8yXzEgICAgIHwgICAgICA2IHwgU0NFLCBDUEUgfCAgICAgICAgICB8IENQRSAgICAgIHwgTEZFCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAtIFNDRTogU2luZ2xlIENoYW5uZWwgRWxlbWVudC4KIC0gQ1BFOiBDaGFubmVsIFBhaXIuCiAtIFNDRTogTG93IEZyZXF1ZW5jeSBFbGVtZW50LgpcZW5kdmVyYmF0aW0KCk1vcmVvdmVyLCB0aGUgVGFibGUgZGVzY3JpYmVzIGFsbCBmaXhlZCBDaGFubmVsIEVsZW1lbnRzIGZvciBlYWNoIENoYW5uZWwgTW9kZSB3aGljaCBhcmUgYXNzaWduZWQgdG8gYSBzcGVha2VyIGFycmFuZ2VtZW50LiBUaGUKYXJyYW5nZW1lbnQgaW5jbHVkZXMgZnJvbnQsIHNpZGUsIGJhY2sgYW5kIGxmZSBBdWRpbyBDaGFubmVsIEVsZW1lbnRzLlxuClRoaXMgbWFwcGluZyBvZiBBdWRpbyBDaGFubmVsIEVsZW1lbnRzIGlzIGRlZmluZWQgaW4gTVBFRyBzdGFuZGFyZCBmb3IgQ2hhbm5lbCBDb25maWcgMS03LiBUaGUgQ2hhbm5lbCBhc3NpZ25tZW50IGZvciBNT0RFXzFfMSwKTU9ERV8yXzIgYW5kIE1PREVfMl8xIGlzIHVzZWQgZnJvbSB0aGUgQVJJQiBzdGFuZGFyZC4gQWxsIG90aGVyIGNvbmZpZ3VyYXRpb25zIGFyZSBkZWZpbmVkIGFzIHN1Z2dlc3RlZCBpbiBNUEVHLlxuCkluIGNhc2Ugb2YgQ2hhbm5lbCBDb25maWcgMCBvciB3cml0aW5nIG1hdHJpeCBtaXhkb3duIGNvZWZmaWNpZW50cywgdGhlIGVuY29kZXIgZW5hYmxlcyB0aGUgd3JpdGluZyBvZiBQcm9ncmFtIENvbmZpZyBFbGVtZW50Cml0c2VsZiBhcyBkZXNjcmliZWQgaW4gXHJlZiBlbmNQQ0UuIFRoZSBjb25maWd1cmF0aW9uIHVzZWQgaW4gUHJvZ3JhbSBDb25maWcgRWxlbWVudCByZWZlcnMgdG8gdGhlIGRlbm90ZWQgVGFibGUuXG4KQmVzaWRlIHRoZSBDaGFubmVsIEVsZW1lbnQgYXNzaWdubWVudCB0aGUgQ2hhbm5lbCBNb2RlcyBhcmUgcmVzcG9zaWJsZSBmb3IgYXVkaW8gaW5wdXQgZGF0YSBjaGFubmVsIG1hcHBpbmcuIFRoZSBDaGFubmVsIE1hcHBpbmcKb2YgdGhlIGF1ZGlvIGRhdGEgZGVwZW5kcyBvbiB0aGUgc2VsZWN0ZWQgOjpBQUNFTkNfQ0hBTk5FTE9SREVSIHdoaWNoIGNhbiBiZSBNUEVHIG9yIFdBViBsaWtlIG9yZGVyLlxuCkZvbGxvd2luZyBUYWJsZSBkZXNjcmliZXMgdGhlIGNvbXBsZXRlIGNoYW5uZWwgbWFwcGluZyBmb3IgYm90aCBDaGFubmVsIE9yZGVyIGNvbmZpZ3VyYXRpb25zLgpcdmVyYmF0aW0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkNoYW5uZWxNb2RlICAgICAgfCAgTVBFRy1DaGFubmVsb3JkZXIgICAgICAgICAgICB8ICBXQVYtQ2hhbm5lbG9yZGVyCi0tLS0tLS0tLS0tLS0tLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLQpNT0RFXzEgICAgICAgICAgIHwgMCB8ICAgfCAgIHwgICB8ICAgfCAgIHwgICB8ICAgfCAwIHwgICB8ICAgfCAgIHwgICB8ICAgfCAgIHwKTU9ERV8yICAgICAgICAgICB8IDAgfCAxIHwgICB8ICAgfCAgIHwgICB8ICAgfCAgIHwgMCB8IDEgfCAgIHwgICB8ICAgfCAgIHwgICB8Ck1PREVfMV8yICAgICAgICAgfCAwIHwgMSB8IDIgfCAgIHwgICB8ICAgfCAgIHwgICB8IDIgfCAwIHwgMSB8ICAgfCAgIHwgICB8ICAgfApNT0RFXzFfMl8xICAgICAgIHwgMCB8IDEgfCAyIHwgMyB8ICAgfCAgIHwgICB8ICAgfCAyIHwgMCB8IDEgfCAzIHwgICB8ICAgfCAgIHwKTU9ERV8xXzJfMiAgICAgICB8IDAgfCAxIHwgMiB8IDMgfCA0IHwgICB8ICAgfCAgIHwgMiB8IDAgfCAxIHwgMyB8IDQgfCAgIHwgICB8Ck1PREVfMV8yXzJfMSAgICAgfCAwIHwgMSB8IDIgfCAzIHwgNCB8IDUgfCAgIHwgICB8IDIgfCAwIHwgMSB8IDQgfCA1IHwgMyB8ICAgfAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXGVuZHZlcmJhdGltCgpUaGUgZGVub3RlZCBtYXBwaW5nIGlzIGltcG9ydGFudCBmb3IgY29ycmVjdCBhdWRpbyBjaGFubmVsIGFzc2lnbm1lbnQgd2hlbiB1c2luZyBNUEVHIG9yIFdBViBvcmRlcmluZy4gVGhlIGluY29taW5nIGF1ZGlvCmNoYW5uZWxzIGFyZSBkaXN0cmlidXRlZCBNUEVHIGxpa2Ugc3RhcnRpbmcgYXQgdGhlIGZyb250IGNoYW5uZWxzIGFuZCBlbmRpbmcgYXQgdGhlIGJhY2sgY2hhbm5lbHMuIFRoZSBkaXN0cmlidXRpb24gaXMgdXNlZCBhcwpkZXNjcmliZWQgaW4gVGFibGUgY29uY2VyaW5nIENoYW5uZWwgQ29uZmlnIGFuZCBmaXggY2hhbm5lbCBlbGVtZW50cy4gUGxlYXNlIHNlZSB0aGUgZm9sbG93aW5nIGV4YW1wbGUgZm9yIGNsYXJpZmljYXRpb24uCgpcdmVyYmF0aW0KRXhhbXBsZTogTU9ERV8xXzJfMl8xIC0gV0FWLUNoYW5uZWxvcmRlciA1LjEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBJbnB1dCBDaGFubmVsICAgICAgfCBDb2RlciBDaGFubmVsCi0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQogMiAoZnJvbnQgY2VudGVyKSAgIHwgMCAoU0NFIGNoYW5uZWwpCiAwIChsZWZ0IGNlbnRlcikgICAgfCAxICgxc3Qgb2YgMXN0IENQRSkKIDEgKHJpZ2h0IGNlbnRlcikgICB8IDIgKDJuZCBvZiAxc3QgQ1BFKQogNCAobGVmdCBzdXJyb3VuZCkgIHwgMyAoMXN0IG9mIDJuZCBDUEUpCiA1IChyaWdodCBzdXJyb3VuZCkgfCA0ICgybmQgb2YgMm5kIENQRSkKIDMgKExGRSkgICAgICAgICAgICB8IDUgKExGRSkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClxlbmR2ZXJiYXRpbQoKClxzZWN0aW9uIHN1cHBCaXRyYXRlcyBTdXBwb3J0ZWQgQml0cmF0ZXMKClRoZSBGREsgQUFDIEVuY29kZXIgcHJvdmlkZXMgYSB3aWRlIHJhbmdlIG9mIHN1cHBvcnRlZCBiaXRyYXRlcy4KVGhlIG1pbmltdW0gYW5kIG1heGltdW0gYWxsb3dlZCBiaXRyYXRlIGRlcGVuZHMgb24gdGhlIEF1ZGlvIE9iamVjdCBUeXBlLiBGb3IgQUFDLUxDIHRoZSBtaW5pbXVtCmJpdHJhdGUgaXMgdGhlIGJpdHJhdGUgdGhhdCBpcyByZXF1aXJlZCB0byB3cml0ZSB0aGUgbW9zdCBiYXNpYyBhbmQgbWluaW1hbCB2YWxpZCBiaXRzdHJlYW0uCkl0IGNvbnNpc3RzIG9mIHRoZSBiaXRzdHJlYW0gZm9ybWF0IGhlYWRlciBpbmZvcm1hdGlvbiBhbmQgb3RoZXIgc3RhdGljL21hbmRhdG9yeSBpbmZvcm1hdGlvbgp3aXRoaW4gdGhlIEFBQyBwYXlsb2FkLiBUaGUgbWF4aW11bSBBQUMgZnJhbWVzaXplIGFsbG93ZWQgYnkgdGhlIE1QRUctNCBzdGFuZGFyZApkZXRlcm1pbmVzIHRoZSBtYXhpbXVtIGFsbG93ZWQgYml0cmF0ZSBmb3IgQUFDLUxDLiBGb3IgSEUtQUFDIGFuZCBIRS1BQUMgdjIgYSBsaWJyYXJ5IGludGVybmFsCmxvb2stdXAgdGFibGUgaXMgdXNlZC4KCkEgZ29vZCB3b3JraW5nIHBvaW50IGluIHRlcm1zIG9mIGF1ZGlvIHF1YWxpdHksIHNhbXBsaW5nIHJhdGUgYW5kIGJpdHJhdGUsIGlzIGF0IDEgdG8gMS41CmJpdHMvYXVkaW8gc2FtcGxlIGZvciBBQUMtTEMsIDAuNjI1IGJpdHMvYXVkaW8gc2FtcGxlIGZvciBkdWFscmF0ZSBIRS1BQUMsIDEuMTI1IGJpdHMvYXVkaW8gc2FtcGxlCmZvciBkb3duc2FtcGxlZCBIRS1BQUMgYW5kIDAuNSBiaXRzL2F1ZGlvIHNhbXBsZSBmb3IgSEUtQUFDIHYyLgpGb3IgZXhhbXBsZSBmb3Igb25lIGNoYW5uZWwgd2l0aCBhIHNhbXBsaW5nIGZyZXF1ZW5jeSBvZiA0OCBrSHosIHRoZSByYW5nZSBmcm9tCjQ4IGtiaXQvcyB0byA3MiBrYml0L3MgYWNoaWV2ZXMgcmVhc29uYWJsZSBhdWRpbyBxdWFsaXR5IGZvciBBQUMtTEMuCgpGb3IgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdGhlIGxvd2VzdCBwb3NzaWJsZSBhdWRpbyBpbnB1dCBzYW1wbGluZyBmcmVxdWVuY3kgaXMgMTYga0h6IGJlY2F1c2UgdGhlbiB0aGUKQUFDLUxDIGNvcmUgZW5jb2RlciBvcGVyYXRlcyBpbiBkdWFsIHJhdGUgbW9kZSBhdCBpdHMgbG93ZXN0IHBvc3NpYmxlIHNhbXBsaW5nIGZyZXF1ZW5jeSwgd2hpY2ggaXMgOCBrSHouCkhFLUFBQyB2MiByZXF1aXJlcyBzdGVyZW8gaW5wdXQgYXVkaW8gZGF0YS4KClBsZWFzZSBub3RlIHRoYXQgaW4gSEUtQUFDIG9yIEhFLUFBQyB2MiBtb2RlIHRoZSBlbmNvZGVyIHN1cHBvcnRzIG11Y2ggaGlnaGVyIGJpdHJhdGVzIHRoYW4gYXJlCmFwcHJvcHJpYXRlIGZvciBIRS1BQUMgb3IgSEUtQUFDIHYyLiBGb3IgZXhhbXBsZSwgYXQgYSBiaXRyYXRlIG9mIG1vcmUgdGhhbiA2NCBrYml0L3MgZm9yIGEgc3RlcmVvCmF1ZGlvIHNpZ25hbCBhdCA0NC4xIGtIeiBpdCB1c3VhbGx5IG1ha2VzIHNlbnNlIHRvIHVzZSBBQUMtTEMsIHdoaWNoIHdpbGwgcHJvZHVjZSBiZXR0ZXIgYXVkaW8KcXVhbGl0eSBhdCB0aGF0IGJpdHJhdGUgdGhhbiBIRS1BQUMgb3IgSEUtQUFDIHYyLgoKXHNlY3Rpb24gcmVvbW1lbmRlZENvbmZpZyBSZWNvbW1lbmRlZCBTYW1wbGluZyBSYXRlIGFuZCBCaXRyYXRlIENvbWJpbmF0aW9ucwoKVGhlIGZvbGxvd2luZyB0YWJsZSBwcm92aWRlcyBhbiBvdmVydmlldyBvZiByZWNvbW1lbmRlZCBlbmNvZGVyIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycwp3aGljaCB3ZSBkZXRlcm1pbmVkIGJ5IHZpcnR1ZSBvZiBudW1lcm91cyBsaXN0ZW5pbmcgdGVzdHMuCgpcc3Vic2VjdGlvbiByZW9tbWVuZGVkQ29uZmlnTEMgQUFDLUxDLCBIRS1BQUMsIEhFLUFBQ3YyIGluIER1YWxyYXRlIFNCUiBtb2RlLgpcdmVyYmF0aW0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQXVkaW8gT2JqZWN0IFR5cGUgIHwgIEJpdCBSYXRlIFJhbmdlICB8ICAgICAgICAgICAgU3VwcG9ydGVkICB8IFByZWZlcnJlZCAgfCBOby4gb2YKICAgICAgICAgICAgICAgICAgIHwgICAgICAgICBbYml0L3NdICB8ICAgICAgIFNhbXBsaW5nIFJhdGVzICB8ICAgIFNhbXBsLiAgfCAgQ2hhbi4KICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtrSHpdICB8ICAgICAgUmF0ZSAgfAogICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIFtrSHpdICB8Ci0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCkFBQyBMQyArIFNCUiArIFBTICB8ICAgODAwMCAtICAxMTk5OSAgfCAgICAgICAgIDIyLjA1LCAyNC4wMCAgfCAgICAgMjQuMDAgIHwgICAgICAyCkFBQyBMQyArIFNCUiArIFBTICB8ICAxMjAwMCAtICAxNzk5OSAgfCAgICAgICAgICAgICAgICAzMi4wMCAgfCAgICAgMzIuMDAgIHwgICAgICAyCkFBQyBMQyArIFNCUiArIFBTICB8ICAxODAwMCAtICAzOTk5OSAgfCAgMzIuMDAsIDQ0LjEwLCA0OC4wMCAgfCAgICAgNDQuMTAgIHwgICAgICAyCkFBQyBMQyArIFNCUiArIFBTICB8ICA0MDAwMCAtICA1NjAwMCAgfCAgMzIuMDAsIDQ0LjEwLCA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICAyCi0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCkFBQyBMQyArIFNCUiAgICAgICB8ICAgODAwMCAtICAxMTk5OSAgfCAgICAgICAgIDIyLjA1LCAyNC4wMCAgfCAgICAgMjQuMDAgIHwgICAgICAxCkFBQyBMQyArIFNCUiAgICAgICB8ICAxMjAwMCAtICAxNzk5OSAgfCAgICAgICAgICAgICAgICAzMi4wMCAgfCAgICAgMzIuMDAgIHwgICAgICAxCkFBQyBMQyArIFNCUiAgICAgICB8ICAxODAwMCAtICAzOTk5OSAgfCAgMzIuMDAsIDQ0LjEwLCA0OC4wMCAgfCAgICAgNDQuMTAgIHwgICAgICAxCkFBQyBMQyArIFNCUiAgICAgICB8ICA0MDAwMCAtICA1NjAwMCAgfCAgMzIuMDAsIDQ0LjEwLCA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICAxCkFBQyBMQyArIFNCUiAgICAgICB8ICAxNjAwMCAtICAyNzk5OSAgfCAgMzIuMDAsIDQ0LjEwLCA0OC4wMCAgfCAgICAgMzIuMDAgIHwgICAgICAyCkFBQyBMQyArIFNCUiAgICAgICB8ICAyODAwMCAtICA2Mzk5OSAgfCAgMzIuMDAsIDQ0LjEwLCA0OC4wMCAgfCAgICAgNDQuMTAgIHwgICAgICAyCkFBQyBMQyArIFNCUiAgICAgICB8ICA2NDAwMCAtIDEyODAwMCAgfCAgMzIuMDAsIDQ0LjEwLCA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICAyCi0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCkFBQyBMQyArIFNCUiAgICAgICB8ICA2NDAwMCAtICA2OTk5OSAgfCAgMzIuMDAsIDQ0LjEwLCA0OC4wMCAgfCAgICAgMzIuMDAgIHwgNSwgNS4xCkFBQyBMQyArIFNCUiAgICAgICB8ICA3MDAwMCAtIDE1OTk5OSAgfCAgMzIuMDAsIDQ0LjEwLCA0OC4wMCAgfCAgICAgNDQuMTAgIHwgNSwgNS4xCkFBQyBMQyArIFNCUiAgICAgICB8IDE2MDAwMCAtIDI0NTk5OSAgfCAgMzIuMDAsIDQ0LjEwLCA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICA1CkFBQyBMQyArIFNCUiAgICAgICB8IDE2MDAwMCAtIDI2NTk5OSAgfCAgMzIuMDAsIDQ0LjEwLCA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgNS4xCi0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCkFBQyBMQyAgICAgICAgICAgICB8ICAgODAwMCAtICAxNTk5OSAgfCAxMS4wMjUsIDEyLjAwLCAxNi4wMCAgfCAgICAgMTIuMDAgIHwgICAgICAxCkFBQyBMQyAgICAgICAgICAgICB8ICAxNjAwMCAtICAyMzk5OSAgfCAgICAgICAgICAgICAgICAxNi4wMCAgfCAgICAgMTYuMDAgIHwgICAgICAxCkFBQyBMQyAgICAgICAgICAgICB8ICAyNDAwMCAtICAzMTk5OSAgfCAgMTYuMDAsIDIyLjA1LCAyNC4wMCAgfCAgICAgMjQuMDAgIHwgICAgICAxCkFBQyBMQyAgICAgICAgICAgICB8ICAzMjAwMCAtICA1NTk5OSAgfCAgICAgICAgICAgICAgICAzMi4wMCAgfCAgICAgMzIuMDAgIHwgICAgICAxCkFBQyBMQyAgICAgICAgICAgICB8ICA1NjAwMCAtIDE2MDAwMCAgfCAgMzIuMDAsIDQ0LjEwLCA0OC4wMCAgfCAgICAgNDQuMTAgIHwgICAgICAxCkFBQyBMQyAgICAgICAgICAgICB8IDE2MDAwMSAtIDI4ODAwMCAgfCAgICAgICAgICAgICAgICA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICAxCi0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCkFBQyBMQyAgICAgICAgICAgICB8ICAxNjAwMCAtICAyMzk5OSAgfCAxMS4wMjUsIDEyLjAwLCAxNi4wMCAgfCAgICAgMTIuMDAgIHwgICAgICAyCkFBQyBMQyAgICAgICAgICAgICB8ICAyNDAwMCAtICAzMTk5OSAgfCAgICAgICAgICAgICAgICAxNi4wMCAgfCAgICAgMTYuMDAgIHwgICAgICAyCkFBQyBMQyAgICAgICAgICAgICB8ICAzMjAwMCAtICAzOTk5OSAgfCAgMTYuMDAsIDIyLjA1LCAyNC4wMCAgfCAgICAgMjIuMDUgIHwgICAgICAyCkFBQyBMQyAgICAgICAgICAgICB8ICA0MDAwMCAtICA5NTk5OSAgfCAgICAgICAgICAgICAgICAzMi4wMCAgfCAgICAgMzIuMDAgIHwgICAgICAyCkFBQyBMQyAgICAgICAgICAgICB8ICA5NjAwMCAtIDExMTk5OSAgfCAgMzIuMDAsIDQ0LjEwLCA0OC4wMCAgfCAgICAgMzIuMDAgIHwgICAgICAyCkFBQyBMQyAgICAgICAgICAgICB8IDExMjAwMCAtIDMyMDAwMSAgfCAgMzIuMDAsIDQ0LjEwLCA0OC4wMCAgfCAgICAgNDQuMTAgIHwgICAgICAyCkFBQyBMQyAgICAgICAgICAgICB8IDMyMDAwMiAtIDU3NjAwMCAgfCAgICAgICAgICAgICAgICA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICAyCi0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCkFBQyBMQyAgICAgICAgICAgICB8IDE2MDAwMCAtIDIzOTk5OSAgfCAgICAgICAgICAgICAgICAzMi4wMCAgfCAgICAgMzIuMDAgIHwgNSwgNS4xCkFBQyBMQyAgICAgICAgICAgICB8IDI0MDAwMCAtIDI3OTk5OSAgfCAgMzIuMDAsIDQ0LjEwLCA0OC4wMCAgfCAgICAgMzIuMDAgIHwgNSwgNS4xCkFBQyBMQyAgICAgICAgICAgICB8IDI4MDAwMCAtIDgwMDAwMCAgfCAgMzIuMDAsIDQ0LjEwLCA0OC4wMCAgfCAgICAgNDQuMTAgIHwgNSwgNS4xCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClxlbmR2ZXJiYXRpbSBcbgoKXHN1YnNlY3Rpb24gcmVvbW1lbmRlZENvbmZpZ0xEIEFBQy1MRCwgQUFDLUVMRCwgQUFDLUVMRCB3aXRoIFNCUiBpbiBEdWFscmF0ZSBTQlIgbW9kZS4KXHZlcmJhdGltCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkF1ZGlvIE9iamVjdCBUeXBlICB8ICBCaXQgUmF0ZSBSYW5nZSAgfCAgICAgICAgICAgIFN1cHBvcnRlZCAgfCBQcmVmZXJyZWQgIHwgTm8uIG9mCiAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgW2JpdC9zXSAgfCAgICAgICBTYW1wbGluZyBSYXRlcyAgfCAgICBTYW1wbC4gIHwgIENoYW4uCiAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICBba0h6XSAgfCAgICAgIFJhdGUgIHwKICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8ICAgICBba0h6XSAgfAotLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLQpFTEQgKyBTQlIgICAgICAgICAgfCAgMTgwMDAgLSAgMjQ5OTkgIHwgICAgICAgIDMyLjAwIC0gNDQuMTAgIHwgICAgIDMyLjAwICB8ICAgICAgMQpFTEQgKyBTQlIgICAgICAgICAgfCAgMjUwMDAgLSAgMzE5OTkgIHwgICAgICAgIDMyLjAwIC0gNDguMDAgIHwgICAgIDMyLjAwICB8ICAgICAgMQpFTEQgKyBTQlIgICAgICAgICAgfCAgMzIwMDAgLSAgNjQwMDAgIHwgICAgICAgIDMyLjAwIC0gNDguMDAgIHwgICAgIDQ4LjAwICB8ICAgICAgMQotLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLQpFTEQgKyBTQlIgICAgICAgICAgfCAgMzIwMDAgLSAgNTE5OTkgIHwgICAgICAgIDMyLjAwIC0gNDguMDAgIHwgICAgIDQ0LjEwICB8ICAgICAgMgpFTEQgKyBTQlIgICAgICAgICAgfCAgNTIwMDAgLSAxMjgwMDAgIHwgICAgICAgIDMyLjAwIC0gNDguMDAgIHwgICAgIDQ4LjAwICB8ICAgICAgMgotLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLQpFTEQgKyBTQlIgICAgICAgICAgfCAgNzIwMDAgLSAxNjAwMDAgIHwgICAgICAgIDQ0LjEwIC0gNDguMDAgIHwgICAgIDQ4LjAwICB8ICAgICAgMwotLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLQpFTEQgKyBTQlIgICAgICAgICAgfCAgOTYwMDAgLSAyMTIwMDAgIHwgICAgICAgIDQ0LjEwIC0gNDguMDAgIHwgICAgIDQ4LjAwICB8ICAgICAgNAotLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLQpFTEQgKyBTQlIgICAgICAgICAgfCAxMjAwMDAgLSAyNDYwMDAgIHwgICAgICAgIDQ0LjEwIC0gNDguMDAgIHwgICAgIDQ4LjAwICB8ICAgICAgNQotLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLQpFTEQgKyBTQlIgICAgICAgICAgfCAxMjAwMDAgLSAyNjYwMDAgIHwgICAgICAgIDQ0LjEwIC0gNDguMDAgIHwgICAgIDQ4LjAwICB8ICAgIDUuMQotLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLQpMRCwgRUxEICAgICAgICAgICAgfCAgMTYwMDAgLSAgMTk5OTkgIHwgICAgICAgIDE2LjAwIC0gMjQuMDAgIHwgICAgIDE2LjAwICB8ICAgICAgMQpMRCwgRUxEICAgICAgICAgICAgfCAgMjAwMDAgLSAgMzk5OTkgIHwgICAgICAgIDE2LjAwIC0gMzIuMDAgIHwgICAgIDI0LjAwICB8ICAgICAgMQpMRCwgRUxEICAgICAgICAgICAgfCAgNDAwMDAgLSAgNDk5OTkgIHwgICAgICAgIDIyLjA1IC0gMzIuMDAgIHwgICAgIDMyLjAwICB8ICAgICAgMQpMRCwgRUxEICAgICAgICAgICAgfCAgNTAwMDAgLSAgNjE5OTkgIHwgICAgICAgIDI0LjAwIC0gNDQuMTAgIHwgICAgIDMyLjAwICB8ICAgICAgMQpMRCwgRUxEICAgICAgICAgICAgfCAgNjIwMDAgLSAgODQ5OTkgIHwgICAgICAgIDMyLjAwIC0gNDguMDAgIHwgICAgIDQ0LjEwICB8ICAgICAgMQpMRCwgRUxEICAgICAgICAgICAgfCAgODUwMDAgLSAxOTIwMDAgIHwgICAgICAgIDQ0LjEwIC0gNDguMDAgIHwgICAgIDQ4LjAwICB8ICAgICAgMQotLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLQpMRCwgRUxEICAgICAgICAgICAgfCAgNjQwMDAgLSAgNzU5OTkgIHwgICAgICAgIDI0LjAwIC0gMzIuMDAgIHwgICAgIDMyLjAwICB8ICAgICAgMgpMRCwgRUxEICAgICAgICAgICAgfCAgNzYwMDAgLSAgOTc5OTkgIHwgICAgICAgIDI0LjAwIC0gNDQuMTAgIHwgICAgIDMyLjAwICB8ICAgICAgMgpMRCwgRUxEICAgICAgICAgICAgfCAgOTgwMDAgLSAxMzU5OTkgIHwgICAgICAgIDMyLjAwIC0gNDguMDAgIHwgICAgIDQ0LjEwICB8ICAgICAgMgpMRCwgRUxEICAgICAgICAgICAgfCAxMzYwMDAgLSAzODQwMDAgIHwgICAgICAgIDQ0LjEwIC0gNDguMDAgIHwgICAgIDQ4LjAwICB8ICAgICAgMgotLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLQpMRCwgRUxEICAgICAgICAgICAgfCAgOTYwMDAgLSAxMTM5OTkgIHwgICAgICAgIDI0LjAwIC0gMzIuMDAgIHwgICAgIDMyLjAwICB8ICAgICAgMwpMRCwgRUxEICAgICAgICAgICAgfCAxMTQwMDAgLSAxNDY5OTkgIHwgICAgICAgIDI0LjAwIC0gNDQuMTAgIHwgICAgIDMyLjAwICB8ICAgICAgMwpMRCwgRUxEICAgICAgICAgICAgfCAxNDcwMDAgLSAyMDM5OTkgIHwgICAgICAgIDMyLjAwIC0gNDguMDAgIHwgICAgIDQ0LjEwICB8ICAgICAgMwpMRCwgRUxEICAgICAgICAgICAgfCAyMDQwMDAgLSA1NzYwMDAgIHwgICAgICAgIDQ0LjEwIC0gNDguMDAgIHwgICAgIDQ4LjAwICB8ICAgICAgMwotLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLQpMRCwgRUxEICAgICAgICAgICAgfCAxMjgwMDAgLSAxNTE5OTkgIHwgICAgICAgIDI0LjAwIC0gMzIuMDAgIHwgICAgIDMyLjAwICB8ICAgICAgNApMRCwgRUxEICAgICAgICAgICAgfCAxNTIwMDAgLSAxOTU5OTkgIHwgICAgICAgIDI0LjAwIC0gNDQuMTAgIHwgICAgIDMyLjAwICB8ICAgICAgNApMRCwgRUxEICAgICAgICAgICAgfCAxOTYwMDAgLSAyNzE5OTkgIHwgICAgICAgIDMyLjAwIC0gNDguMDAgIHwgICAgIDQ0LjEwICB8ICAgICAgNApMRCwgRUxEICAgICAgICAgICAgfCAyNzIwMDAgLSA3NjgwMDAgIHwgICAgICAgIDQ0LjEwIC0gNDguMDAgIHwgICAgIDQ4LjAwICB8ICAgICAgNAotLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLQpMRCwgRUxEICAgICAgICAgICAgfCAxNjAwMDAgLSAxODk5OTkgIHwgICAgICAgIDI0LjAwIC0gMzIuMDAgIHwgICAgIDMyLjAwICB8ICAgICAgNQpMRCwgRUxEICAgICAgICAgICAgfCAxOTAwMDAgLSAyNDQ5OTkgIHwgICAgICAgIDI0LjAwIC0gNDQuMTAgIHwgICAgIDMyLjAwICB8ICAgICAgNQpMRCwgRUxEICAgICAgICAgICAgfCAyNDUwMDAgLSAzMzk5OTkgIHwgICAgICAgIDMyLjAwIC0gNDguMDAgIHwgICAgIDQ0LjEwICB8ICAgICAgNQpMRCwgRUxEICAgICAgICAgICAgfCAzNDAwMDAgLSA5NjAwMDAgIHwgICAgICAgIDQ0LjEwIC0gNDguMDAgIHwgICAgIDQ4LjAwICB8ICAgICAgNQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcZW5kdmVyYmF0aW0gXG4KClxzdWJzZWN0aW9uIHJlb21tZW5kZWRDb25maWdFTEQgQUFDLUVMRCB3aXRoIFNCUiBpbiBEb3duc2FtcGxlZCBTQlIgbW9kZS4KXHZlcmJhdGltCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkF1ZGlvIE9iamVjdCBUeXBlICB8ICBCaXQgUmF0ZSBSYW5nZSAgfCAgICAgICAgICAgIFN1cHBvcnRlZCAgfCBQcmVmZXJyZWQgIHwgTm8uIG9mCiAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgW2JpdC9zXSAgfCAgICAgICBTYW1wbGluZyBSYXRlcyAgfCAgICBTYW1wbC4gIHwgIENoYW4uCiAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICBba0h6XSAgfCAgICAgIFJhdGUgIHwKICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8ICAgICBba0h6XSAgfAotLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLQpFTEQgKyBTQlIgICAgICAgICAgfCAgMTgwMDAgLSAgMjQ5OTkgIHwgICAgICAgIDE2LjAwIC0gMjIuMDUgIHwgICAgIDIyLjA1ICB8ICAgICAgMQooZG93bnNhbXBsZWQgU0JSKSAgfCAgMjUwMDAgLSAgMzU5OTkgIHwgICAgICAgIDIyLjA1IC0gMzIuMDAgIHwgICAgIDI0LjAwICB8ICAgICAgMQogICAgICAgICAgICAgICAgICAgfCAgMzYwMDAgLSAgNjQwMDAgIHwgICAgICAgIDMyLjAwIC0gNDguMDAgIHwgICAgIDMyLjAwICB8ICAgICAgMQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcZW5kdmVyYmF0aW0gXG4KCgpccGFnZSBFTkNPREVSQkVIQVZJT1VSIEVuY29kZXIgQmVoYXZpb3VyCgpcc2VjdGlvbiBCRUhBVklPVVJfQkFORFdJRFRIIEJhbmR3aWR0aAoKVGhlIEZESyBBQUMgZW5jb2RlciB1c3VhbGx5IGRvZXMgbm90IHVzZSB0aGUgZnVsbCBmcmVxdWVuY3kgcmFuZ2Ugb2YgdGhlIGlucHV0IHNpZ25hbCwgYnV0IHJlc3RyaWN0cyB0aGUgYmFuZHdpZHRoCmFjY29yZGluZyB0byBjZXJ0YWluIGxpYnJhcnktaW50ZXJuYWwgc2V0dGluZ3MuIFRoZXkgY2FuIGJlIGNoYW5nZWQgaW4gdGhlIHRhYmxlICJiYW5kV2lkdGhUYWJsZSIgaW4gdGhlCmZpbGUgYmFuZHdpZHRoLmNwcCAoaWYgYXZhaWxhYmxlKS4KClRoZSBlbmNvZGVyIEFQSSBwcm92aWRlcyB0aGUgOjpBQUNFTkNfQkFORFdJRFRIIHBhcmFtZXRlciB0byBhZGp1c3QgdGhlIGJhbmR3aWR0aCBleHBsaWNpdGx5LgpcY29kZQphYWNFbmNvZGVyX1NldFBhcmFtKGhBYWNFbmNvZGVyLCBBQUNFTkNfQkFORFdJRFRILCB2YWx1ZSk7ClxlbmRjb2RlCgpIb3dldmVyIGl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBjaGFuZ2UgdGhlc2Ugc2V0dGluZ3MsIGJlY2F1c2UgdGhleSBhcmUgYmFzZWQgb24gbnVtZXJpb3VzIGxpc3RlbmluZwp0ZXN0cyBhbmQgY2FyZWZ1bCB0d2Vha3MgdG8gZW5zdXJlIHRoZSBiZXN0IG92ZXJhbGwgZW5jb2RpbmcgcXVhbGl0eS4KClRoZW9yZXRpY2FsbHkgYSBzaWduYWwgb2YgZm9yIGV4YW1wbGUgNDgga0h6IGNhbiBjb250YWluIGZyZXF1ZW5jaWVzIHVwIHRvIDI0IGtIeiwgYnV0IHRvIHVzZSB0aGlzIGZ1bGwgcmFuZ2UKaW4gYW4gYXVkaW8gZW5jb2RlciB1c3VhbGx5IGRvZXMgbm90IG1ha2Ugc2Vuc2UuIFVzdWFsbHkgdGhlIGVuY29kZXIgaGFzIGEgdmVyeSBsaW1pdGVkIGFtb3VudCBvZgpiaXRzIHRvIHNwZW5kICh0eXBpY2FsbHkgMTI4IGtiaXQvcyBmb3Igc3RlcmVvIDQ4IGtIeiBjb250ZW50KSBhbmQgdG8gYWxsb3cgZnVsbCByYW5nZSBiYW5kd2lkdGggd291bGQKd2FzdGUgYSBsb3Qgb2YgdGhlc2UgYml0cyBmb3IgZnJlcXVlbmNpZXMgdGhlIGh1bWFuIGVhciBpcyBoYXJkbHkgYWJsZSB0byBwZXJjZWl2ZSBhbnl3YXksIGlmIGF0IGFsbC4gSGVuY2UgaXQKaXMgd2lzZSB0byB1c2UgdGhlIGF2YWlsYWJsZSBiaXRzIGZvciB0aGUgcmVhbGx5IGltcG9ydGFudCBmcmVxdWVuY3kgcmFuZ2UgYW5kIGp1c3Qgc2tpcCB0aGUgcmVzdC4KQXQgbG93ZXIgYml0cmF0ZXMgKGUuIGcuIDw9IDgwIGtiaXQvcyBmb3Igc3RlcmVvIDQ4IGtIeiBjb250ZW50KSB0aGUgZW5jb2RlciB3aWxsIGNob29zZSBhbiBldmVuIHNtYWxsZXIKYmFuZHdpZHRoLCBiZWNhdXNlIGFuIGVuY29kZWQgc2lnbmFsIHdpdGggc21hbGxlciBiYW5kd2lkdGggYW5kIGhlbmNlIGxlc3MgYXJ0aWZhY3RzIHNvdW5kcyBiZXR0ZXIgdGhhbiBhIHNpZ25hbAp3aXRoIGhpZ2hlciBiYW5kd2lkdGggYnV0IHRoZW4gbW9yZSBjb2RpbmcgYXJ0ZWZhY3RzIGFjcm9zcyBhbGwgZnJlcXVlbmNpZXMuIFRoZXNlIGFydGVmYWN0cyB3b3VsZCBvY2N1ciBpZgpzbWFsbCBiaXRyYXRlcyBhbmQgaGlnaCBiYW5kd2lkdGhzIGFyZSBjaG9zZW4gYmVjYXVzZSB0aGUgYXZhaWxhYmxlIGJpdHMgYXJlIGp1c3Qgbm90IGVub3VnaCB0byBlbmNvZGUgYWxsCmZyZXF1ZW5jaWVzIHdlbGwuCgpVbmZvcnR1bmF0ZWx5IHNvbWUgcGVvcGxlIGV2YWx1YXRlIGVuY29kaW5nIHF1YWxpdHkgYmFzZWQgb24gcG9zc2libGUgYmFuZHdpZHRoIGFzIHdlbGwsIGJ1dCBpdCBpcyBhIHR3by1zaWRlZApzd29yZCBjb25zaWRlcmluZyB0aGUgdHJhZGUtb2ZmIGRlc2NyaWJlZCBhYm92ZS4KCkFub3RoZXIgYXNwZWN0IGlzIHdvcmtsb2FkIGNvbnN1bXB0aW9uLiBUaGUgaGlnaGVyIHRoZSBhbGxvd2VkIGJhbmR3aWR0aCwgdGhlIG1vcmUgZnJlcXVlbmN5IGxpbmVzIGhhdmUgdG8gYmUKcHJvY2Vzc2VkLCB3aGljaCBpbiB0dXJuIGluY3JlYXNlcyB0aGUgd29ya2xvYWQuCgpcc2VjdGlvbiBGUkFNRVNJWkVTX0FORF9CSVRfUkVTRVJWT0lSIEZyYW1lIFNpemVzICYgQml0IFJlc2Vydm9pcgoKRm9yIEFBQyB0aGVyZSBpcyBhIGRpZmZlcmVuY2UgYmV0d2VlbiBjb25zdGFudCBiaXQgcmF0ZSBhbmQgY29uc3RhbnQgZnJhbWUKbGVuZ3RoIGR1ZSB0byB0aGUgc28tY2FsbGVkIGJpdCByZXNlcnZvaXIgdGVjaG5pcXVlLCB3aGljaCBhbGxvd3MgdGhlIGVuY29kZXIgdG8gdXNlIGxlc3MKYml0cyBpbiBhbiBBQUMgZnJhbWUgZm9yIHRob3NlIGF1ZGlvIHNpZ25hbCBzZWN0aW9ucyB3aGljaCBhcmUgZWFzeSB0byBlbmNvZGUsCmFuZCB0aGVuIHNwZW5kIHRoZW0gYXQgYSBsYXRlciBwb2ludCBpbgp0aW1lIGZvciBtb3JlIGNvbXBsZXggYXVkaW8gc2VjdGlvbnMuIFRoZSBleHRlbnQgdG8gd2hpY2ggdGhpcyAiYml0IGV4Y2hhbmdlIgppcyBkb25lIGlzIGxpbWl0ZWQgdG8gYWxsb3cgZm9yIHJlbGlhYmxlIGFuZCByZWxhdGl2ZWx5IGxvdyBkZWxheSByZWFsIHRpbWUKc3RyZWFtaW5nLgpPdmVyIGEgbG9uZ2VyIHBlcmlvZCBpbiB0aW1lIHRoZSBiaXRyYXRlIHdpbGwgYmUgY29uc3RhbnQgaW4gdGhlIEFBQyBjb25zdGFudApiaXRyYXRlIG1vZGUsIGUuZy4gZm9yIElTRE4gdHJhbnNtaXNzaW9uLiBUaGlzIG1lYW5zIHRoYXQgaW4gQUFDIGVhY2ggYml0c3RyZWFtCmZyYW1lIHdpbGwgaW4gZ2VuZXJhbCBoYXZlIGEgZGlmZmVyZW50IGxlbmd0aCBpbiBieXRlcyBidXQgb3ZlciB0aW1lIGl0CndpbGwgcmVhY2ggdGhlIHRhcmdldCBiaXRyYXRlLiBPbmUgY291bGQgYWxzbyBtYWtlIGFuIE1QRUcgY29tcGxpYW50CkFBQyBlbmNvZGVyIHdoaWNoIGFsd2F5cyBwcm9kdWNlcyBjb25zdGFudCBsZW5ndGggcGFja2FnZXMgZm9yIGVhY2ggQUFDIGZyYW1lLApidXQgdGhlIGF1ZGlvIHF1YWxpdHkgd291bGQgYmUgY29uc2lkZXJhYmx5IHdvcnNlIHNpbmNlIHRoZSBiaXQgcmVzZXJ2b2lyCnRlY2huaXF1ZSB3b3VsZCBoYXZlIHRvIGJlIHN3aXRjaGVkIG9mZiBjb21wbGV0ZWx5LiBBIGhpZ2hlciBiaXQgcmF0ZSB3b3VsZCBoYXZlCnRvIGJlIHVzZWQgdG8gZ2V0IHRoZSBzYW1lIGF1ZGlvIHF1YWxpdHkgYXMgd2l0aCBhbiBlbmFibGVkIGJpdCByZXNlcnZvaXIuCgpUaGUgbWF4aW11bSBBQUMgZnJhbWUgbGVuZ3RoLCByZWdhcmRsZXNzIG9mIHRoZSBhdmFpbGFibGUgYml0IHJlc2Vydm9pciwgaXMgZGVmaW5lZAphcyA2MTQ0IGJpdHMgcGVyIGNoYW5uZWwuCgpGb3IgbXAzIGJ5IHRoZSB3YXksIHRoZSBzYW1lIGJpdCByZXNlcnZvaXIgdGVjaG5pcXVlIGV4aXN0cywgYnV0IHRoZXJlIGVhY2ggYml0CnN0cmVhbSBmcmFtZSBoYXMgYSBjb25zdGFudCBsZW5ndGggZm9yIGEgZ2l2ZW4gYml0IHJhdGUgKGlnbm9yaW5nIHRoZQpwYWRkaW5nIGJ5dGUpLiBJbiBtcDMgdGhlcmUgaXMgYSBzby1jYWxsZWQgImJhY2sgcG9pbnRlciIgd2hpY2ggdGVsbHMKdGhlIGRlY29kZXIgd2hpY2ggYml0cyBiZWxvbmcgdG8gdGhlIGN1cnJlbnQgbXAzIGZyYW1lIC0gYW5kIGluIGdlbmVyYWwgc29tZSBvcgptYW55IGJpdHMgaGF2ZSBiZWVuIHRyYW5zbWl0dGVkIGluIGFuIGVhcmxpZXIgbXAzIGZyYW1lLiBCYXNpY2FsbHkgdGhpcyBsZWFkcyB0bwp0aGUgc2FtZSAiYml0IGV4Y2hhbmdlIGJldHdlZW4gbXAzIGZyYW1lcyIgYXMgaW4gQUFDIGJ1dCB3aXRoIHZpcnR1YWxseSBjb25zdGFudApsZW5ndGggZnJhbWVzLgoKVGhpcyB2YXJpYWJsZSBmcmFtZSBsZW5ndGggYXQgImNvbnN0YW50IGJpdCByYXRlIiBpcyBub3Qgc29tZXRoaW5nIHNwZWNpYWwKaW4gdGhpcyBGcmF1bmhvZmVyIElJUyBBQUMgZW5jb2Rlci4gQUFDIGhhcyBiZWVuIGRlc2lnbmVkIGluIHRoYXQgd2F5LgoKXHN1YnNlY3Rpb24gQkVIQVZJT1VSX0VTVElNX0FWR19GUkFNRVNJWkVTIEVzdGltYXRpbmcgQXZlcmFnZSBGcmFtZSBTaXplcwoKQSBIRS1BQUMgdjEgb3IgdjIgYXVkaW8gZnJhbWUgY29udGFpbnMgMjA0OCBQQ00gc2FtcGxlcyBwZXIgY2hhbm5lbCAodGhlcmUgaXMKYWxzbyBvbmUgbW9kZSB3aXRoIDE5MjAgc2FtcGxlcyBwZXIgY2hhbm5lbCBidXQgdGhpcyBpcyBvbmx5IGZvciBzcGVjaWFsIHB1cnBvc2VzCnN1Y2ggYXMgREFCKyBkaWdpdGFsIHJhZGlvKS4KClRoZSBudW1iZXIgb2YgSEUtQUFDIGZyYW1lcyBcZiROXF9GUkFNRVNcZiQgcGVyIHNlY29uZCBhdCA0NC4xIGtIeiBpczoKClxmWwpOXF9GUkFNRVMgPSA0NDEwMCAvIDIwNDggPSAyMS41MzMyClxmXQoKQXQgYSBiaXQgcmF0ZSBvZiA4IGticHMgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGJpdHMgcGVyIGZyYW1lIFxmJE5cX0JJVFNcX1BFUlxfRlJBTUVcZiQgaXM6CgpcZlsKTlxfQklUU1xfUEVSXF9GUkFNRSA9IDgwMDAgLyAyMS41MzMyID0gMzcxLjUyClxmXQoKd2hpY2ggaXMgYWJvdXQgNDYuNDQgYnl0ZXMgcGVyIGVuY29kZWQgZnJhbWUuCgpBdCBhIGJpdCByYXRlIG9mIDMyIGticHMsIHdoaWNoIGlzIHF1aXRlIGhpZ2ggZm9yIHNpbmdsZSBjaGFubmVsIEhFLUFBQyB2MSwgaXQgaXM6CgpcZlsKTlxfQklUU1xfUEVSXF9GUkFNRSA9IDMyMDAwIC8gMjEuNTMzMiA9IDE0ODYKXGZdCgp3aGljaCBpcyBhYm91dCAxODUuNzYgYnl0ZXMgcGVyIGVuY29kZWQgZnJhbWUuCgpUaGVzZSBiaXRzL2ZyYW1lIGZpZ3VyZXMgYXJlIGF2ZXJhZ2UgZmlndXJlcyB3aGVyZSBlYWNoIEFBQyBmcmFtZSBnZW5lcmFsbHkgaGFzIGEgZGlmZmVyZW50CnNpemUgaW4gYnl0ZXMuIFRvIGNhbGN1bGF0ZSB0aGUgc2FtZSBmb3IgQUFDLUxDIGp1c3QgdXNlIDEwMjQgaW5zdGVhZCBvZiAyMDQ4IFBDTSBzYW1wbGVzIHBlcgpmcmFtZSBhbmQgY2hhbm5lbC4KRm9yIEFBQy1MRC9FTEQgaXQgaXMgZWl0aGVyIDQ4MCBvciA1MTIgUENNIHNhbXBsZXMgcGVyIGZyYW1lIGFuZCBjaGFubmVsLgoKClxzZWN0aW9uIEJFSEFWSU9VUl9UT09MUyBFbmNvZGVyIFRvb2xzCgpUaGUgQUFDIGVuY29kZXIgc3VwcG9ydHMgVE5TLCBQTlMsIE1TLCBJbnRlbnNpdHkgYW5kIGFjdGl2YXRlcyB0aGVzZSB0b29scyBkZXBlbmRpbmcgb24gdGhlIGF1ZGlvIHNpZ25hbCBhbmQKdGhlIGVuY29kZXIgY29uZmlndXJhdGlvbiAoaS5lLiBiaXRyYXRlIG9yIEFPVCkuIEl0IGlzIG5vdCByZXF1aXJlZCB0byBjb25maWd1cmUgdGhlc2UgdG9vbHMgbWFudWFsbHkuCgpQTlMgaW1wcm92ZXMgZW5jb2RpbmcgcXVhbGl0eSBvbmx5IGZvciBjZXJ0YWluIGJpdHJhdGVzLiBUaGVyZWZvcmUgaXQgbWFrZXMgc2Vuc2UgdG8gYWN0aXZhdGUgUE5TIG9ubHkgZm9yCnRoZXNlIGJpdHJhdGVzIGFuZCBzYXZlIHRoZSBwcm9jZXNzaW5nIHBvd2VyIHJlcXVpcmVkIGZvciBQTlMgKGFib3V0IDEwICUgb2YgdGhlIGVuY29kZXIpIHdoZW4gdXNpbmcgb3RoZXIKYml0cmF0ZXMuIFRoaXMgaXMgZG9uZSBhdXRvbWF0aWNhbGx5IGluc2lkZSB0aGUgZW5jb2RlciBsaWJyYXJ5LiBQTlMgaXMgZGlzYWJsZWQgaW5zaWRlIHRoZSBlbmNvZGVyIGxpYnJhcnkgaWYKYW4gTVBFRy0yIEFPVCBpcyBjaG9vc2VuIHNpbmNlIFBOUyBpcyBhbiBNUEVHLTQgQUFDIGZlYXR1cmUuCgpJZiBTQlIgaXMgYWN0aXZhdGVkLCB0aGUgZW5jb2RlciBhdXRvbWF0aWNhbGx5IGRlYWN0aXZhdGVzIFBOUyBpbnRlcm5hbGx5LiBJZiBUTlMgaXMgZGlzYWJsZWQgYnV0IFBOUyBpcyBhbGxvd2VkLAp0aGUgZW5jb2RlciBkZWFjdGl2YXRlcyBQTlMgY2FsY3VsYXRpb24gaW50ZXJuYWxseS4KCiovCgojaWZuZGVmIF9BQUNfRU5DX0xJQl9IXwojZGVmaW5lIF9BQUNfRU5DX0xJQl9IXwoKI2luY2x1ZGUgIm1hY2hpbmVfdHlwZS5oIgojaW5jbHVkZSAiRkRLX2F1ZGlvLmgiCgoKLyoqCiAqICBBQUMgZW5jb2RlciBlcnJvciBjb2Rlcy4KICovCnR5cGVkZWYgZW51bSB7CiAgICBBQUNFTkNfT0sgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMCwgIC8qITwgTm8gZXJyb3IgaGFwcGVuZWQuIEFsbCBmaW5lLiAqLwoKICAgIEFBQ0VOQ19JTlZBTElEX0hBTkRMRSAgICAgICAgID0gMHgwMDIwLCAgLyohPCBIYW5kbGUgcGFzc2VkIHRvIGZ1bmN0aW9uIGNhbGwgd2FzIGludmFsaWQuICovCiAgICBBQUNFTkNfTUVNT1JZX0VSUk9SICAgICAgICAgICA9IDB4MDAyMSwgIC8qITwgTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLiAqLwogICAgQUFDRU5DX1VOU1VQUE9SVEVEX1BBUkFNRVRFUiAgPSAweDAwMjIsICAvKiE8IFBhcmFtZXRlciBub3QgYXZhaWxhYmxlLiAqLwogICAgQUFDRU5DX0lOVkFMSURfQ09ORklHICAgICAgICAgPSAweDAwMjMsICAvKiE8IENvbmZpZ3VyYXRpb24gbm90IHByb3ZpZGVkLiAqLwoKICAgIEFBQ0VOQ19JTklUX0VSUk9SICAgICAgICAgICAgID0gMHgwMDQwLCAgLyohPCBHZW5lcmFsIGluaXRpYWxpemF0aW9uIGVycm9yLiAqLwogICAgQUFDRU5DX0lOSVRfQUFDX0VSUk9SICAgICAgICAgPSAweDAwNDEsICAvKiE8IEFBQyBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIGVycm9yLiAqLwogICAgQUFDRU5DX0lOSVRfU0JSX0VSUk9SICAgICAgICAgPSAweDAwNDIsICAvKiE8IFNCUiBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIGVycm9yLiAqLwogICAgQUFDRU5DX0lOSVRfVFBfRVJST1IgICAgICAgICAgPSAweDAwNDMsICAvKiE8IFRyYW5zcG9ydCBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIGVycm9yLiAqLwogICAgQUFDRU5DX0lOSVRfTUVUQV9FUlJPUiAgICAgICAgPSAweDAwNDQsICAvKiE8IE1ldGEgZGF0YSBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIGVycm9yLiAqLwoKICAgIEFBQ0VOQ19FTkNPREVfRVJST1IgICAgICAgICAgID0gMHgwMDYwLCAgLyohPCBUaGUgZW5jb2RpbmcgcHJvY2VzcyB3YXMgaW50ZXJydXB0ZWQgYnkgYW4gdW5leHBlY3RlZCBlcnJvci4gKi8KCiAgICBBQUNFTkNfRU5DT0RFX0VPRiAgICAgICAgICAgICA9IDB4MDA4MCAgIC8qITwgRW5kIG9mIGZpbGUgcmVhY2hlZC4gKi8KCn0gQUFDRU5DX0VSUk9SOwoKCi8qKgogKiAgQUFDIGVuY29kZXIgYnVmZmVyIGRlc2NyaXB0b3JzIGlkZW50aWZpZXIuCiAqICBUaGlzIGlkZW50aWZpZXIgYXJlIHVzZWQgd2l0aGluIGJ1ZmZlciBkZXNjcmlwdG9ycyBBQUNFTkNfQnVmRGVzYzo6YnVmZmVySWRlbnRpZmllcnMuCiAqLwp0eXBlZGVmIGVudW0gewogICAgLyogSW5wdXQgYnVmZmVyIGlkZW50aWZpZXIuICovCiAgICBJTl9BVURJT19EQVRBICAgICAgPSAwLCAgICAgICAgICAgICAgICAgIC8qITwgQXVkaW8gaW5wdXQgYnVmZmVyLCBpbnRlcmxlYXZlZCBJTlRfUENNIHNhbXBsZXMuICovCiAgICBJTl9BTkNJTExSWV9EQVRBICAgPSAxLCAgICAgICAgICAgICAgICAgIC8qITwgQW5jaWxsYXJ5IGRhdGEgdG8gYmUgZW1iZWRkZWQgaW50byBiaXRzdHJlYW0uICovCiAgICBJTl9NRVRBREFUQV9TRVRVUCAgPSAyLCAgICAgICAgICAgICAgICAgIC8qITwgU2V0dXAgc3RydWN0dXJlIGZvciBlbWJlZGRpbmcgbWV0YSBkYXRhLiAqLwoKICAgIC8qIE91dHB1dCBidWZmZXIgaWRlbnRpZmllci4gKi8KICAgIE9VVF9CSVRTVFJFQU1fREFUQSA9IDMsICAgICAgICAgICAgICAgICAgLyohPCBCdWZmZXIgaG9sZHMgYml0c3RyZWFtIG91dHB1dCBkYXRhLiAqLwogICAgT1VUX0FVX1NJWkVTICAgICAgID0gNCAgICAgICAgICAgICAgICAgICAvKiE8IEJ1ZmZlciBjb250YWlucyBzaXplcyBvZiBlYWNoIGFjY2VzcyB1bml0LiBUaGlzIGluZm9ybWF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbmVjZXNzYXJ5IGZvciBzdXBlcmZyYW1pbmcuICovCgp9IEFBQ0VOQ19CdWZmZXJJZGVudGlmaWVyOwoKCi8qKgogKiAgQUFDIGVuY29kZXIgaGFuZGxlLgogKi8KdHlwZWRlZiBzdHJ1Y3QgQUFDRU5DT0RFUiAqSEFORExFX0FBQ0VOQ09ERVI7CgoKLyoqCiAqICBQcm92aWRlcyBzb21lIGluZm8gYWJvdXQgdGhlIGVuY29kZXIgY29uZmlndXJhdGlvbi4KICovCnR5cGVkZWYgc3RydWN0IHsKCiAgICBVSU5UICAgICAgICAgICAgICAgIG1heE91dEJ1ZkJ5dGVzOyAgICAgIC8qITwgTWF4aW11bSBudW1iZXIgb2YgZW5jb2RlciBiaXRzdHJlYW0gYnl0ZXMgd2l0aGluIG9uZSBmcmFtZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaXplIGRlcGVuZHMgb24gbWF4aW11bSBudW1iZXIgb2Ygc3VwcG9ydGVkIGNoYW5uZWxzIGluIGVuY29kZXIgaW5zdGFuY2UuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIHN1cGVyZnJhbWluZyAoYXMgdXNlZCBmb3IgZXhhbXBsZSBpbiBEQUIrKSwgc2l6ZSBoYXMgdG8gYmUgYSBtdWx0aXBsZSBhY2NvcmRpbmdseS4gKi8KCiAgICBVSU5UICAgICAgICAgICAgICAgIG1heEFuY0J5dGVzOyAgICAgICAgIC8qITwgTWF4aW11bSBudW1iZXIgb2YgYW5jaWxsYXJ5IGRhdGEgYnl0ZXMgd2hpY2ggY2FuIGJlIGluc2VydGVkIGludG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0gd2l0aGluIG9uZSBmcmFtZS4gKi8KCiAgICBVSU5UICAgICAgICAgICAgICAgIGluQnVmRmlsbExldmVsOyAgICAgIC8qITwgSW50ZXJuYWwgaW5wdXQgYnVmZmVyIGZpbGwgbGV2ZWwgaW4gc2FtcGxlcyBwZXIgY2hhbm5lbC4gVGhpcyBwYXJhbWV0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgY2xlYXJlZCBpZiBzYW1wbGluZ3JhdGUgb3IgY2hhbm5lbChNb2RlL09yZGVyKSBjaGFuZ2VzLiAqLwoKICAgIFVJTlQgICAgICAgICAgICAgICAgaW5wdXRDaGFubmVsczsgICAgICAgLyohPCBOdW1iZXIgb2YgaW5wdXQgY2hhbm5lbHMgZXhwZWN0ZWQgaW4gZW5jb2RpbmcgcHJvY2Vzcy4gKi8KCiAgICBVSU5UICAgICAgICAgICAgICAgIGZyYW1lTGVuZ3RoOyAgICAgICAgIC8qITwgQW1vdW50IG9mIGlucHV0IGF1ZGlvIHNhbXBsZXMgY29uc3VtZWQgZWFjaCBmcmFtZSBwZXIgY2hhbm5lbCwgZGVwZW5kaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gYXVkaW8gb2JqZWN0IHR5cGUgY29uZmlndXJhdGlvbi4gKi8KCiAgICBVSU5UICAgICAgICAgICAgICAgIGVuY29kZXJEZWxheTsgICAgICAgIC8qITwgQ29kZWMgZGVsYXkgaW4gUENNIHNhbXBsZXMvY2hhbm5lbC4gRGVwZW5kcyBvbiBmcmFtZWxlbmd0aCBhbmQgQU9ULiBEb2VzIG5vdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgZnJhbWluZyBkZWxheSBmb3IgZmlsbGluZyB1cCBlbmNvZGVyIFBDTSBpbnB1dCBidWZmZXIuICovCgogICAgVUNIQVIgICAgICAgICAgICAgICBjb25mQnVmWzY0XTsgICAgICAgICAvKiE8IENvbmZpZ3VyYXRpb24gYnVmZmVyIGluIGJpbmFyeSBmb3JtYXQgYXMgYW4gQXVkaW9TcGVjaWZpY0NvbmZpZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIFN0cmVhbU11eENvbmZpZyBhY2NvcmRpbmcgdG8gdGhlIHNlbGVjdGVkIHRyYW5zcG9ydCB0eXBlLiAqLwoKICAgIFVJTlQgICAgICAgICAgICAgICAgY29uZlNpemU7ICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgdmFsaWQgYnl0ZXMgaW4gY29uZkJ1Zi4gKi8KCn0gQUFDRU5DX0luZm9TdHJ1Y3Q7CgoKLyoqCiAqICBEZXNjcmliZXMgdGhlIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBmb3IgYW4gYWFjRW5jRW5jb2RlKCkgY2FsbC4KICovCnR5cGVkZWYgc3RydWN0IHsKICAgIElOVCAgICAgICAgICAgICAgICAgbnVtQnVmczsgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgYnVmZmVycy4gKi8KICAgIHZvaWQgICAgICAgICAgICAgICoqYnVmczsgICAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIHZlY3RvciBjb250YWluaW5nIGJ1ZmZlciBhZGRyZXNzZXMuICovCiAgICBJTlQgICAgICAgICAgICAgICAgKmJ1ZmZlcklkZW50aWZpZXJzOyAgIC8qITwgSWRlbnRpZmllciBvZiBlYWNoIGJ1ZmZlciBlbGVtZW50LiBTZWUgOjpBQUNFTkNfQnVmZmVySWRlbnRpZmllci4gKi8KICAgIElOVCAgICAgICAgICAgICAgICAqYnVmU2l6ZXM7ICAgICAgICAgICAgLyohPCBTaXplIG9mIGVhY2ggYnVmZmVyIGluIDgtYml0IGJ5dGVzLiAqLwogICAgSU5UICAgICAgICAgICAgICAgICpidWZFbFNpemVzOyAgICAgICAgICAvKiE8IFNpemUgb2YgZWFjaCBidWZmZXIgZWxlbWVudCBpbiBieXRlcy4gKi8KCn0gQUFDRU5DX0J1ZkRlc2M7CgoKLyoqCiAqICBEZWZpbmVzIHRoZSBpbnB1dCBhcmd1bWVudHMgZm9yIGFuIGFhY0VuY0VuY29kZSgpIGNhbGwuCiAqLwp0eXBlZGVmIHN0cnVjdCB7CiAgICBJTlQgICAgICAgICAgICAgICAgIG51bUluU2FtcGxlczsgICAgICAgIC8qITwgTnVtYmVyIG9mIHZhbGlkIGlucHV0IGF1ZGlvIHNhbXBsZXMgKG11bHRpcGxlIG9mIGlucHV0IGNoYW5uZWxzKS4gKi8KICAgIElOVCAgICAgICAgICAgICAgICAgbnVtQW5jQnl0ZXM7ICAgICAgICAgLyohPCBOdW1iZXIgb2YgYW5jaWxsYXJ5IGRhdGEgYnl0ZXMgdG8gYmUgZW5jb2RlZC4gKi8KCn0gQUFDRU5DX0luQXJnczsKCgovKioKICogIERlZmluZXMgdGhlIG91dHB1dCBhcmd1bWVudHMgZm9yIGFuIGFhY0VuY0VuY29kZSgpIGNhbGwuCiAqLwp0eXBlZGVmIHN0cnVjdCB7CiAgICBJTlQgICAgICAgICAgICAgICAgIG51bU91dEJ5dGVzOyAgICAgICAgIC8qITwgTnVtYmVyIG9mIHZhbGlkIGJpdHN0cmVhbSBieXRlcyBnZW5lcmF0ZWQgZHVyaW5nIGFhY0VuY0VuY29kZSgpLiAqLwogICAgSU5UICAgICAgICAgICAgICAgICBudW1JblNhbXBsZXM7ICAgICAgICAvKiE8IE51bWJlciBvZiBpbnB1dCBhdWRpbyBzYW1wbGVzIGNvbnN1bWVkIGJ5IHRoZSBlbmNvZGVyLiAqLwogICAgSU5UICAgICAgICAgICAgICAgICBudW1BbmNCeXRlczsgICAgICAgICAvKiE8IE51bWJlciBvZiBhbmNpbGxhcnkgZGF0YSBieXRlcyBjb25zdW1lZCBieSB0aGUgZW5jb2Rlci4gKi8KCn0gQUFDRU5DX091dEFyZ3M7CgoKLyoqCiAqICBNZXRhIERhdGEgQ29tcHJlc3Npb24gUHJvZmlsZXMuCiAqLwp0eXBlZGVmIGVudW0gewogICAgQUFDRU5DX01FVEFEQVRBX0RSQ19OT05FICAgICAgICAgID0gMCwgICAvKiE8IE5vbmUuICovCiAgICBBQUNFTkNfTUVUQURBVEFfRFJDX0ZJTE1TVEFOREFSRCAgPSAxLCAgIC8qITwgRmlsbSBzdGFuZGFyZC4gKi8KICAgIEFBQ0VOQ19NRVRBREFUQV9EUkNfRklMTUxJR0hUICAgICA9IDIsICAgLyohPCBGaWxtIGxpZ2h0LiAqLwogICAgQUFDRU5DX01FVEFEQVRBX0RSQ19NVVNJQ1NUQU5EQVJEID0gMywgICAvKiE8IE11c2ljIHN0YW5kYXJkLiAqLwogICAgQUFDRU5DX01FVEFEQVRBX0RSQ19NVVNJQ0xJR0hUICAgID0gNCwgICAvKiE8IE11c2ljIGxpZ2h0LiAqLwogICAgQUFDRU5DX01FVEFEQVRBX0RSQ19TUEVFQ0ggICAgICAgID0gNSAgICAvKiE8IFNwZWVjaC4gKi8KCn0gQUFDRU5DX01FVEFEQVRBX0RSQ19QUk9GSUxFOwoKCi8qKgogKiAgTWV0YSBEYXRhIHNldHVwIHN0cnVjdHVyZS4KICovCnR5cGVkZWYgc3RydWN0IHsKCiAgQUFDRU5DX01FVEFEQVRBX0RSQ19QUk9GSUxFIGRyY19wcm9maWxlOyAgICAgICAgICAgICAvKiE8IE1QRUcgRFJDIGNvbXByZXNzaW9uIHByb2ZpbGUuIFNlZSA6OkFBQ0VOQ19NRVRBREFUQV9EUkNfUFJPRklMRS4gKi8KICBBQUNFTkNfTUVUQURBVEFfRFJDX1BST0ZJTEUgY29tcF9wcm9maWxlOyAgICAgICAgICAgIC8qITwgRVRTSSBoZWF2eSBjb21wcmVzc2lvbiBwcm9maWxlLiBTZWUgOjpBQUNFTkNfTUVUQURBVEFfRFJDX1BST0ZJTEUuICovCgogIElOVCAgICAgICAgICAgICAgICAgICAgICAgICBkcmNfVGFyZ2V0UmVmTGV2ZWw7ICAgICAgLyohPCBVc2VkIHRvIGRlZmluZSBleHBlY3RlZCBsZXZlbCB0bzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NhbGVkIHdpdGggMTYgYml0LiB4KjJeMTYuICovCiAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBfVGFyZ2V0UmVmTGV2ZWw7ICAgICAvKiE8IEFkanVzdCBsaW1pdGVyIHRvIGF2b2lkIG92ZXJsb2FkLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2FsZWQgd2l0aCAxNiBiaXQuIHgqMl4xNi4gKi8KCiAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dfcmVmX2xldmVsX3ByZXNlbnQ7ICAvKiE8IEZsYWcsIGlmIHByb2dfcmVmX2xldmVsIGlzIHByZXNlbnQgKi8KICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ19yZWZfbGV2ZWw7ICAgICAgICAgIC8qITwgUHJvZ3JhbW1lIFJlZmVyZW5jZSBMZXZlbCA9IERpYWxvZ3VlIExldmVsOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMzEuNzVkQiAuLiAwIGRCIDsgc3RlcHNpemU6IDAuMjVkQgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2FsZWQgd2l0aCAxNiBiaXQuIHgqMl4xNi4qLwoKICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgUENFX21peGRvd25faWR4X3ByZXNlbnQ7IC8qITwgRmxhZywgaWYgZG14LWlkeCBzaG91bGQgYmUgd3JpdHRlbiBpbiBwcm9ncmFtbWUgY29uZmlnIGVsZW1lbnQgKi8KICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgRVRTSV9EbXhMdmxfcHJlc2VudDsgICAgIC8qITwgRmxhZywgaWYgZG14LWx2bCBzaG91bGQgYmUgd3JpdHRlbiBpbiBFVFNJLWFuY0RhdGEgKi8KCiAgU0NIQVIgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlck1peExldmVsOyAgICAgICAgICAvKiE8IENlbnRlciBkb3dubWl4IGxldmVsICgwLi4uNywgYWNjb3JkaW5nIHRvIHRhYmxlKSAqLwogIFNDSEFSICAgICAgICAgICAgICAgICAgICAgICBzdXJyb3VuZE1peExldmVsOyAgICAgICAgLyohPCBTdXJyb3VuZCBkb3dubWl4IGxldmVsICgwLi4uNywgYWNjb3JkaW5nIHRvIHRhYmxlKSAqLwoKICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgZG9sYnlTdXJyb3VuZE1vZGU7ICAgICAgIC8qITwgSW5kaWNhdGlvbiBmb3IgRG9sYnkgU3Vycm91bmQgRW5jb2RpbmcgTW9kZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwOiBEb2xieSBTdXJyb3VuZCBtb2RlIG5vdCBpbmRpY2F0ZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxOiAyLWNoIGF1ZGlvIHBhcnQgaXMgbm90IERvbGJ5IHN1cnJvdW5kIGVuY29kZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAyOiAyLWNoIGF1ZGlvIHBhcnQgaXMgRG9sYnkgc3Vycm91bmQgZW5jb2RlZCAqLwp9IEFBQ0VOQ19NZXRhRGF0YTsKCgovKioKICogQUFDIGVuY29kZXIgY29udHJvbCBmbGFncy4KICoKICogSW4gaW50ZXJhY3Rpb24gd2l0aCB0aGUgOjpBQUNFTkNfQ09OVFJPTF9TVEFURSBwYXJhbWV0ZXIgaXQgaXMgcG9zc2libGUgdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBpbnRlcm5hbAogKiBpbml0aWFsaXphdGlvbiBwcm9jZXNzLiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIG92ZXJ3cml0ZSB0aGUgaW50ZXJuYWwgc3RhdGUgZnJvbSBleHRlcm4gd2hlbiBuZWNlc3NhcnkuCiAqLwp0eXBlZGVmIGVudW0KewogICAgQUFDRU5DX0lOSVRfTk9ORSAgICAgICAgICAgICAgPSAweDAwMDAsICAvKiE8IERvIG5vdCB0cmlnZ2VyIGluaXRpYWxpemF0aW9uLiAqLwogICAgQUFDRU5DX0lOSVRfQ09ORklHICAgICAgICAgICAgPSAweDAwMDEsICAvKiE8IEluaXRpYWxpemUgYWxsIGVuY29kZXIgbW9kdWxlcyBjb25maWd1cmF0aW9uLiAqLwogICAgQUFDRU5DX0lOSVRfU1RBVEVTICAgICAgICAgICAgPSAweDAwMDIsICAvKiE8IFJlc2V0IGFsbCBlbmNvZGVyIG1vZHVsZXMgaGlzdG9yeSBidWZmZXIuICovCiAgICBBQUNFTkNfSU5JVF9UUkFOU1BPUlQgICAgICAgICA9IDB4MTAwMCwgIC8qITwgSW5pdGlhbGl6ZSB0cmFuc3BvcnQgbGliIHdpdGggbmV3IHBhcmFtZXRlcnMuICovCiAgICBBQUNFTkNfUkVTRVRfSU5CVUZGRVIgICAgICAgICA9IDB4MjAwMCwgIC8qITwgUmVzZXQgZmlsbCBsZXZlbCBvZiBpbnRlcm5hbCBpbnB1dCBidWZmZXIuICovCiAgICBBQUNFTkNfSU5JVF9BTEwgICAgICAgICAgICAgICA9IDB4RkZGRiAgIC8qITwgSW5pdGlhbGl6ZSBhbGwuICovCn0KQUFDRU5DX0NUUkxGTEFHUzsKCgovKioKICogXGJyaWVmICBBQUMgZW5jb2RlciBzZXR0aW5nIHBhcmFtZXRlcnMuCiAqCiAqIFVzZSBhYWNFbmNvZGVyX1NldFBhcmFtKCkgZnVuY3Rpb24gdG8gY29uZmlndXJlLCBvciB1c2UgYWFjRW5jb2Rlcl9HZXRQYXJhbSgpIGZ1bmN0aW9uIHRvIHJlYWQKICogdGhlIGludGVybmFsIHN0YXR1cyBvZiB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMuCiAqLwp0eXBlZGVmIGVudW0KewogIEFBQ0VOQ19BT1QgICAgICAgICAgICAgICAgICAgICAgPSAweDAxMDAsICAvKiE8IEF1ZGlvIG9iamVjdCB0eXBlLiBTZWUgOjpBVURJT19PQkpFQ1RfVFlQRSBpbiBGREtfYXVkaW8uaC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDI6IE1QRUctNCBBQUMgTG93IENvbXBsZXhpdHkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSA1OiBNUEVHLTQgQUFDIExvdyBDb21wbGV4aXR5IHdpdGggU3BlY3RyYWwgQmFuZCBSZXBsaWNhdGlvbiAoSEUtQUFDKS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDI5OiBNUEVHLTQgQUFDIExvdyBDb21wbGV4aXR5IHdpdGggU3BlY3RyYWwgQmFuZCBSZXBsaWNhdGlvbiBhbmQgUGFyYW1ldHJpYyBTdGVyZW8gKEhFLUFBQyB2MikuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBjb25maWd1cmF0aW9uIGNhbiBiZSB1c2VkIG9ubHkgd2l0aCBzdGVyZW8gaW5wdXQgYXVkaW8gZGF0YS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDIzOiBNUEVHLTQgQUFDIExvdy1EZWxheS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDM5OiBNUEVHLTQgQUFDIEVuaGFuY2VkIExvdy1EZWxheS4gU2luY2UgdGhlcmUgaXMgbm8gOjpBVURJT19PQkpFQ1RfVFlQRSBmb3IgRUxEIGluCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tYmluYXRpb24gd2l0aCBTQlIgZGVmaW5lZCwgZW5hYmxlIFNCUiBleHBsaWNpdGVseSBieSA6OkFBQ0VOQ19TQlJfTU9ERSBwYXJhbWV0ZXIuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxMjk6IE1QRUctMiBBQUMgTG93IENvbXBsZXhpdHkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxMzI6IE1QRUctMiBBQUMgTG93IENvbXBsZXhpdHkgd2l0aCBTcGVjdHJhbCBCYW5kIFJlcGxpY2F0aW9uIChIRS1BQUMpLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMTU2OiBNUEVHLTIgQUFDIExvdyBDb21wbGV4aXR5IHdpdGggU3BlY3RyYWwgQmFuZCBSZXBsaWNhdGlvbiBhbmQgUGFyYW1ldHJpYyBTdGVyZW8gKEhFLUFBQyB2MikuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgY29uZmlndXJhdGlvbiBjYW4gYmUgdXNlZCBvbmx5IHdpdGggc3RlcmVvIGlucHV0IGF1ZGlvIGRhdGEuICovCgogIEFBQ0VOQ19CSVRSQVRFICAgICAgICAgICAgICAgICAgPSAweDAxMDEsICAvKiE8IFRvdGFsIGVuY29kZXIgYml0cmF0ZS4gVGhpcyBwYXJhbWV0ZXIgaXMgbWFuZGF0b3J5IGFuZCBpbnRlcmFjdHMgd2l0aCA6OkFBQ0VOQ19CSVRSQVRFTU9ERS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIENCUjogQml0cmF0ZSBpbiBiaXRzL3NlY29uZC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZSBccmVmIHN1cHBCaXRyYXRlcyBmb3IgZGV0YWlscy4gKi8KCiAgQUFDRU5DX0JJVFJBVEVNT0RFICAgICAgICAgICAgICA9IDB4MDEwMiwgIC8qITwgQml0cmF0ZSBtb2RlLiBDb25maWd1cmF0aW9uIGNhbiBiZSBkaWZmZXJlbnQga2luZCBvZiBiaXRyYXRlIGNvbmZpZ3VyYXRpb25zOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMDogQ29uc3RhbnQgYml0cmF0ZSwgdXNlIGJpdHJhdGUgYWNjb3JkaW5nIHRvIDo6QUFDRU5DX0JJVFJBVEUuIChkZWZhdWx0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2l0aGluIG5vbmUgTEQvRUxEIDo6QVVESU9fT0JKRUNUX1RZUEUsIHRoZSBDQlIgbW9kZSBtYWtlcyB1c2Ugb2YgZnVsbCBhbGxvd2VkIGJpdHJlc2Vydm9pci4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluIGNvbnRyYXN0LCBhdCBMb3ctRGVsYXkgOjpBVURJT19PQkpFQ1RfVFlQRSB0aGUgYml0cmVzZXJ2b2lyIGlzIGtlcHQgdmVyeSBzbWFsbC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDg6IExEL0VMRCBmdWxsIGJpdHJlc2Vydm9pciBmb3IgcGFja2V0IGJhc2VkIHRyYW5zbWlzc2lvbi4gKi8KCiAgQUFDRU5DX1NBTVBMRVJBVEUgICAgICAgICAgICAgICA9IDB4MDEwMywgIC8qITwgQXVkaW8gaW5wdXQgZGF0YSBzYW1wbGluZyByYXRlLiBFbmNvZGVyIHN1cHBvcnRzIGZvbGxvd2luZyBzYW1wbGluZyByYXRlczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MDAwLCAxMTAyNSwgMTIwMDAsIDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAsIDY0MDAwLCA4ODIwMCwgOTYwMDAgKi8KCiAgQUFDRU5DX1NCUl9NT0RFICAgICAgICAgICAgICAgICA9IDB4MDEwNCwgIC8qITwgQ29uZmlndXJlIFNCUiBpbmRlcGVuZGVudGx5IG9mIHRoZSBjaG9zZW4gQXVkaW8gT2JqZWN0IFR5cGUgOjpBVURJT19PQkpFQ1RfVFlQRTouCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgaXMgb25seSBhdmFpbGFibGUgZm9yIEVMRC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDA6IERpc2FibGUgU3BlY3RyYWwgQmFuZCBSZXBsaWNhdGlvbi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDE6IEVuYWJsZSBTcGVjdHJhbCBCYW5kIFJlcGxpY2F0aW9uLiAqLwoKICBBQUNFTkNfR1JBTlVMRV9MRU5HVEggICAgICAgICAgID0gMHgwMTA1LCAgLyohPCBDb3JlIGVuY29kZXIgKEFBQykgYXVkaW8gZnJhbWUgbGVuZ3RoIGluIHNhbXBsZXM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxMDI0OiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSA1MTI6IERlZmF1bHQgTEQvRUxEIGNvbmZpZ3VyYXRpb24uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSA0ODA6IE9wdGlvbmFsIGxlbmd0aCBpbiBMRC9FTEQgY29uZmlndXJhdGlvbi4gKi8KCiAgQUFDRU5DX0NIQU5ORUxNT0RFICAgICAgICAgICAgICA9IDB4MDEwNiwgIC8qITwgU2V0IGV4cGxpY2l0IGNoYW5uZWwgbW9kZS4gQ2hhbm5lbCBtb2RlIG11c3QgbWF0Y2ggd2l0aCBudW1iZXIgb2YgaW5wdXQgY2hhbm5lbHMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxLTY6IE1QRUcgY2hhbm5lbCBtb2RlcyBzdXBwb3J0ZWQsIHNlZSA6OkNIQU5ORUxfTU9ERSBpbiBGREtfYXVkaW8uaC4gKi8KCiAgQUFDRU5DX0NIQU5ORUxPUkRFUiAgICAgICAgICAgICA9IDB4MDEwNywgIC8qITwgSW5wdXQgYXVkaW8gZGF0YSBjaGFubmVsIG9yZGVyaW5nIHNjaGVtZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDA6IE1QRUcgY2hhbm5lbCBvcmRlcmluZyAoZS4gZy4gNS4xOiBDLCBMLCBSLCBTTCwgU1IsIExGRSkuIChkZWZhdWx0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMTogV0FWRSBmaWxlIGZvcm1hdCBjaGFubmVsIG9yZGVyaW5nIChlLiBnLiA1LjE6IEwsIFIsIEMsIExGRSwgU0wsIFNSKS4gKi8KCiAgQUFDRU5DX1NCUl9SQVRJTyAgICAgICAgICAgICAgICA9IDB4MDEwOCwgIC8qITwgIENvbnRyb2xzIGFjdGl2YXRpb24gb2YgZG93bnNhbXBsZWQgU0JSLiBXaXRoIGRvd25zYW1wbGVkIFNCUiwgdGhlIGRlbGF5IHdpbGwgYmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRlci4gT24gdGhlIG90aGVyIGhhbmQsIGZvciBhY2hpZXZpbmcgdGhlIHNhbWUgcXVhbGl0eSBsZXZlbCwgZG93bnNhbXBsZWQgU0JSCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRzIG1vcmUgYml0cyB0aGFuIGR1YWwtcmF0ZSBTQlIuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpdGggZG93bnNhbXBsZWQgU0JSLCB0aGUgQUFDIGVuY29kZXIgd2lsbCB3b3JrIGF0IHRoZSBzYW1lIHNhbXBsaW5nIHJhdGUgYXMgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCUiBlbmNvZGVyIChzaW5nbGUgcmF0ZSkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvd25zYW1wbGVkIFNCUiBpcyBzdXBwb3J0ZWQgZm9yIEFBQy1FTEQgYW5kIEhFLUFBQ3YxLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDE6IERvd25zYW1wbGVkIFNCUiAoZGVmYXVsdCBmb3IgRUxEKS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAyOiBEdWFsLXJhdGUgU0JSICAgKGRlZmF1bHQgZm9yIEhFLUFBQykuICovCgogIEFBQ0VOQ19BRlRFUkJVUk5FUiAgICAgICAgICAgICAgPSAweDAyMDAsICAvKiE8IFRoaXMgcGFyYW1ldGVyIGNvbnRyb2xzIHRoZSB1c2Ugb2YgdGhlIGFmdGVyYnVybmVyIGZlYXR1cmUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGFmdGVyYnVybmVyIGlzIGEgdHlwZSBvZiBhbmFseXNpcyBieSBzeW50aGVzaXMgYWxnb3JpdGhtIHdoaWNoIGluY3JlYXNlcyB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyBxdWFsaXR5IGJ1dCBhbHNvIHRoZSByZXF1aXJlZCBwcm9jZXNzaW5nIHBvd2VyLiBJdCBpcyByZWNvbW1lbmRlZCB0byBhbHdheXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmF0ZSB0aGlzIGlmIGFkZGl0aW9uYWwgbWVtb3J5IGNvbnN1bXB0aW9uIGFuZCBwcm9jZXNzaW5nIHBvd2VyIGNvbnN1bXB0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IGEgcHJvYmxlbS4gSWYgaW5jcmVhc2VkIE1IeiBhbmQgbWVtb3J5IGNvbnN1bXB0aW9uIGFyZSBhbiBpc3N1ZSB0aGVuIHRoZSBNSHoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgbWVtb3J5IGNvc3Qgb2YgdGhpcyBvcHRpb25hbCBtb2R1bGUgbmVlZCB0byBiZSBldmFsdWF0ZWQgYWdhaW5zdCB0aGUgaW1wcm92ZW1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBhdWRpbyBxdWFsaXR5IG9uIGEgY2FzZSBieSBjYXNlIGJhc2lzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMDogRGlzYWJsZSBhZnRlcmJ1cm5lciAoZGVmYXVsdCkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxOiBFbmFibGUgYWZ0ZXJidXJuZXIuICovCgogIEFBQ0VOQ19CQU5EV0lEVEggICAgICAgICAgICAgICAgPSAweDAyMDMsICAvKiE8IENvcmUgZW5jb2RlciBhdWRpbyBiYW5kd2lkdGg6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwOiBEZXRlcm1pbmUgYmFuZHdpZHRoIGludGVybmFsbHkgKGRlZmF1bHQsIHNlZSBjaGFwdGVyIFxyZWYgQkVIQVZJT1VSX0JBTkRXSURUSCkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxIHRvIGZzLzI6IEZyZXF1ZW5jeSBiYW5kd2lkdGggaW4gSGVydHouIChFeHBlcnRzIG9ubHksIGJldHRlciBkbyBub3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG91Y2ggdGhpcyB2YWx1ZSB0byBhdm9pZCBkZWdyYWRlZCBhdWRpbyBxdWFsaXR5KSAqLwoKICBBQUNFTkNfVFJBTlNNVVggICAgICAgICAgICAgICAgID0gMHgwMzAwLCAgLyohPCBUcmFuc3BvcnQgdHlwZSB0byBiZSB1c2VkLiBTZWUgOjpUUkFOU1BPUlRfVFlQRSBpbiBGREtfYXVkaW8uaC4gRm9sbG93aW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZXMgY2FuIGJlIGNvbmZpZ3VyZWQgaW4gZW5jb2RlciBsaWJyYXJ5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMDogcmF3IGFjY2VzcyB1bml0cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMTogQURJRiBiaXRzdHJlYW0gZm9ybWF0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAyOiBBRFRTIGJpdHN0cmVhbSBmb3JtYXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDY6IEF1ZGlvIE11eCBFbGVtZW50cyAoTEFUTSkgd2l0aCBtdXhDb25maWdQcmVzZW50ID0gMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gNzogQXVkaW8gTXV4IEVsZW1lbnRzIChMQVRNKSB3aXRoIG11eENvbmZpZ1ByZXNlbnQgPSAwLCBvdXQgb2YgYmFuZCBTdHJlYW1NdXhDb25maWcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDEwOiBBdWRpbyBTeW5jIFN0cmVhbSAoTE9BUykgKi8KCiAgQUFDRU5DX0hFQURFUl9QRVJJT0QgICAgICAgICAgICA9IDB4MDMwMSwgIC8qITwgRnJhbWUgY291bnQgcGVyaW9kIGZvciBzZW5kaW5nIGluLWJhbmQgY29uZmlndXJhdGlvbiBidWZmZXJzIHdpdGhpbiBMQVRNL0xPQVMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQgbGF5ZXIuIEFkZGl0aW9uYWxseSB0aGlzIHBhcmFtZXRlciBjb25maWd1cmVzIHRoZSBQQ0UgcmVwZXRpdGlvbiBwZXJpb2QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiByYXdfZGF0YV9ibG9jaygpLiBTZWUgXHJlZiBlbmNQQ0UuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAweEZGOiBhdXRvLW1vZGUgZGVmYXVsdCAxMCBmb3IgVFRfTVA0X0FEVFMsIFRUX01QNF9MT0FTIGFuZCBUVF9NUDRfTEFUTV9NQ1AxLCBvdGhlcndpc2UgMC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG46IEZyYW1lIGNvdW50IHBlcmlvZC4gKi8KCiAgQUFDRU5DX1NJR05BTElOR19NT0RFICAgICAgICAgICA9IDB4MDMwMiwgIC8qITwgU2lnbmFsaW5nIG1vZGUgb2YgdGhlIGV4dGVuc2lvbiBBT1Q6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwOiBJbXBsaWNpdCBiYWNrd2FyZCBjb21wYXRpYmxlIHNpZ25hbGluZyAoZGVmYXVsdCBmb3Igbm9uLU1QRUctNCBiYXNlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU9UJ3MgYW5kIGZvciB0aGUgdHJhbnNwb3J0IGZvcm1hdHMgQURJRiBhbmQgQURUUykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gQSBzdHJlYW0gdGhhdCB1c2VzIGltcGxpY2l0IHNpZ25hbGluZyBjYW4gYmUgZGVjb2RlZCBieSBldmVyeSBBQUMgZGVjb2RlciwgZXZlbiBBQUMtTEMtb25seSBkZWNvZGVycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBBbiBBQUMtTEMtb25seSBkZWNvZGVyIHdpbGwgb25seSBkZWNvZGUgdGhlIGxvdy1mcmVxdWVuY3kgcGFydCBvZiB0aGUgc3RyZWFtLCByZXN1bHRpbmcgaW4gYSBiYW5kLWxpbWl0ZWQgb3V0cHV0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFRoaXMgbWV0aG9kIHdvcmtzIHdpdGggYWxsIHRyYW5zcG9ydCBmb3JtYXRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFRoaXMgbWV0aG9kIGRvZXMgbm90IHdvcmsgd2l0aCBkb3duc2FtcGxlZCBTQlIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDE6IEV4cGxpY2l0IGJhY2t3YXJkIGNvbXBhdGlibGUgc2lnbmFsaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIEEgc3RyZWFtIHRoYXQgdXNlcyBleHBsaWNpdCBiYWNrd2FyZCBjb21wYXRpYmxlIHNpZ25hbGluZyBjYW4gYmUgZGVjb2RlZCBieSBldmVyeSBBQUMgZGVjb2RlciwgZXZlbiBBQUMtTEMtb25seSBkZWNvZGVycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBBbiBBQUMtTEMtb25seSBkZWNvZGVyIHdpbGwgb25seSBkZWNvZGUgdGhlIGxvdy1mcmVxdWVuY3kgcGFydCBvZiB0aGUgc3RyZWFtLCByZXN1bHRpbmcgaW4gYSBiYW5kLWxpbWl0ZWQgb3V0cHV0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIEEgZGVjb2RlciBub3QgY2FwYWJsZSBvZiBkZWNvZGluZyBQUyB3aWxsIG9ubHkgZGVjb2RlIHRoZSBBQUMtTEMrU0JSIHBhcnQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBzdHJlYW0gY29udGFpbmVkIFBTLCB0aGUgcmVzdWx0IHdpbGwgYmUgYSBhIGRlY29kZWQgbW9ubyBkb3dubWl4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFRoaXMgbWV0aG9kIGRvZXMgbm90IHdvcmsgd2l0aCBBRElGIG9yIEFEVFMuIEZvciBMT0FTL0xBVE0sIGl0IG9ubHkgd29ya3Mgd2l0aCBBdWRpb011eFZlcnNpb249PTEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gVGhpcyBtZXRob2QgZG9lcyB3b3JrIHdpdGggZG93bnNhbXBsZWQgU0JSCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAyOiBFeHBsaWNpdCBoaWVyYXJjaGljYWwgc2lnbmFsaW5nIChkZWZhdWx0IGZvciBNUEVHLTQgYmFzZWQgQU9UJ3MgYW5kIGZvciBhbGwgdHJhbnNwb3J0IGZvcm1hdHMgZXhjbHVkaW5nIEFESUYgYW5kIEFEVFMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIEEgc3RyZWFtIHRoYXQgdXNlcyBleHBsaWNpdCBoaWVyYXJjaGljYWwgc2lnbmFsaW5nIGNhbiBiZSBkZWNvZGVkIG9ubHkgYnkgSEUtQUFDIGRlY29kZXJzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIEFuIEFBQy1MQy1vbmx5IGRlY29kZXIgd2lsbCBub3QgZGVjb2RlIGEgc3RyZWFtIHRoYXQgdXNlcyBleHBsaWNpdCBoaWVyYXJjaGljYWwgc2lnbmFsaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIEEgZGVjb2RlciBub3QgY2FwYWJsZSBvZiBkZWNvZGluZyBQUyB3aWxsIG5vdCBkZWNvZGUgdGhlIHN0cmVhbSBhdCBhbGwgaWYgaXQgY29udGFpbmVkIFBTCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFRoaXMgbWV0aG9kIGRvZXMgbm90IHdvcmsgd2l0aCBBRElGIG9yIEFEVFMuIEl0IHdvcmtzIHdpdGggTE9BUy9MQVRNIGFuZCB0aGUgTVBFRy00IEZpbGUgZm9ybWF0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFRoaXMgbWV0aG9kIGRvZXMgd29yayB3aXRoIGRvd25zYW1wbGVkIFNCUgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIG1ha2luZyBzdXJlIHRoYXQgdGhlIGxpc3RlbmVyIGFsd2F5cyBleHBlcmllbmNlcyB0aGUgYmVzdCBhdWRpbyBxdWFsaXR5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBsaWNpdCBoaWVyYXJjaGljYWwgc2lnbmFsaW5nIHNob3VsZCBiZSB1c2VkLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG1ha2VzIHN1cmUgdGhhdCBvbmx5IGEgZnVsbCBIRS1BQUMtY2FwYWJsZSBkZWNvZGVyIHdpbGwgZGVjb2RlIHRob3NlIHN0cmVhbXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBhdWRpbyBpcyBwbGF5ZWQgYXQgZnVsbCBiYW5kd2lkdGguCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBiZXN0IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBpdCBpcyByZWNvbW1lbmRlZCB0byBlbmNvZGUgd2l0aCBpbXBsaWNpdCBTQlIgc2lnbmFsaW5nLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBIGRlY29kZXIgY2FwYWJsZSBvZiBBQUMtTEMgb25seSB3aWxsIHRoZW4gb25seSBkZWNvZGUgdGhlIEFBQyBwYXJ0LCB3aGljaCBtZWFucyB0aGUgZGVjb2RlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyB3aWxsIHNvdW5kIGJhbmQtbGltaXRlZC4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBNUEVHLTIgdHJhbnNwb3J0IHR5cGVzIChBRFRTLEFESUYpLCBvbmx5IGltcGxpY2l0IHNpZ25hbGluZyBpcyBwb3NzaWJsZS4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBMT0FTIGFuZCBMQVRNLCBleHBsaWNpdCBiYWNrd2FyZHMgY29tcGF0aWJsZSBzaWduYWxpbmcgb25seSB3b3JrcyB0b2dldGhlciB3aXRoIEF1ZGlvTXV4VmVyc2lvbj09MS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJlYXNvbiBpcyB0aGF0LCBmb3IgZXhwbGljaXQgYmFja3dhcmRzIGNvbXBhdGlibGUgc2lnbmFsaW5nLCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIEFTQy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSBkZWNvZGVyIHRoYXQgaXMgb25seSBjYXBhYmxlIG9mIGRlY29kaW5nIEFBQy1MQyB3aWxsIHNraXAgdGhpcyBwYXJ0LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXZlcnRoZWxlc3MsIGZvciBqdW1waW5nIHRvIHRoZSBlbmQgb2YgdGhlIEFTQywgaXQgbmVlZHMgdG8ga25vdyB0aGUgQVNDIGxlbmd0aC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNtaXR0aW5nIHRoZSBsZW5ndGggb2YgdGhlIEFTQyBpcyBhIGZlYXR1cmUgb2YgQXVkaW9NdXhWZXJzaW9uPT0xLCBpdCBpcyBub3QgcG9zc2libGUgdG8gdHJhbnNtaXQgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCBvZiB0aGUgQVNDIHdpdGggQXVkaW9NdXhWZXJzaW9uPT0wLCB0aGVyZWZvcmUgYW4gQUFDLUxDLW9ubHkgZGVjb2RlciB3aWxsIG5vdCBiZSBhYmxlIHRvIHBhcnNlIGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9BUy9MQVRNIHN0cmVhbSB0aGF0IHdhcyBiZWluZyBlbmNvZGVkIHdpdGggQXVkaW9NdXhWZXJzaW9uPT0wLgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIGRvd25zYW1wbGVkIFNCUiwgZXhwbGljaXQgc2lnbmFsaW5nIGlzIG1hbmRhdG9yeS4gVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0IHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24gc2FtcGxpbmcgZnJlcXVlbmN5ICh3aGljaCBpcyBpbiBjYXNlIG9mIFNCUiB0aGUgc2FtcGxpbmcgZnJlcXVxbmN5IG9mIHRoZSBTQlIgcGFydCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuIG9ubHkgYmUgc2lnbmFsZWQgaW4gZXhwbGljaXQgbW9kZS4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBBQUMtRUxELCB0aGUgU0JSIGluZm9ybWF0aW9uIGlzIHRyYW5zbWl0dGVkIGluIHRoZSBFTERTcGVjaWZpYyBDb25maWcsIHdoaWNoIGlzIHBhcnQgb2YgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3BlY2lmaWNDb25maWcuIFRoZXJlZm9yZSwgdGhlIHNldHRpbmdzIGhlcmUgd2lsbCBoYXZlIG5vIGVmZmVjdCBvbiBBQUMtRUxELiovCgogIEFBQ0VOQ19UUFNVQkZSQU1FUyAgICAgICAgICAgICAgPSAweDAzMDMsICAvKiE8IE51bWJlciBvZiBzdWIgZnJhbWVzIGluIGEgdHJhbnNwb3J0IGZyYW1lIGZvciBMT0FTL0xBVE0gb3IgQURUUyAoZGVmYXVsdCAxKS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIEFEVFM6IE1heGltdW0gbnVtYmVyIG9mIHN1YiBmcmFtZXMgcmVzdHJpY3RlZCB0byA0LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gTE9BUy9MQVRNOiBNYXhpbXVtIG51bWJlciBvZiBzdWIgZnJhbWVzIHJlc3RyaWN0ZWQgdG8gMi4qLwoKICBBQUNFTkNfUFJPVEVDVElPTiAgICAgICAgICAgICAgID0gMHgwMzA2LCAgLyohPCBDb25maWd1cmUgcHJvdGVjdGlvbiBpbiB0cmFucHNvcnQgbGF5ZXI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwOiBObyBwcm90ZWN0aW9uLiAoZGVmYXVsdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDE6IENSQyBhY3RpdmUgZm9yIEFEVFMgYml0c3RyZWFtIGZvcm1hdC4gKi8KCiAgQUFDRU5DX0FOQ0lMTEFSWV9CSVRSQVRFICAgICAgICA9IDB4MDUwMCwgIC8qITwgQ29uc3RhbnQgYW5jaWxsYXJ5IGRhdGEgYml0cmF0ZSBpbiBiaXRzL3NlY29uZC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDA6IEVpdGhlciBubyBhbmNpbGxhcnkgZGF0YSBvciBpbnNlcnQgZXhhY3QgbnVtYmVyIG9mIGJ5dGVzLCBkZW5vdGVkIHZpYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgcGFyYW1ldGVyLCBudW1BbmNCeXRlcyBpbiBBQUNFTkNfSW5BcmdzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gZWxzZTogSW5zZXJ0IGFuY2lsbGFyeSBkYXRhIHdpdGggc3BlY2lmaWVkIGJpdHJhdGUuICovCgogIEFBQ0VOQ19NRVRBREFUQV9NT0RFICAgICAgICAgICAgPSAweDA2MDAsICAvKiE8IENvbmZpZ3VyZSBNZXRhIERhdGEuIFNlZSA6OkFBQ0VOQ19NZXRhRGF0YSBmb3IgZnVydGhlciBkZXRhaWxzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMDogRG8gbm90IGVtYmVkIGFueSBtZXRhZGF0YS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDE6IEVtYmVkIE1QRUcgZGVmaW5lZCBtZXRhZGF0YSBvbmx5LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMjogRW1iZWQgYWxsIG1ldGFkYXRhLiAqLwoKICBBQUNFTkNfQ09OVFJPTF9TVEFURSAgICAgICAgICAgID0gMHhGRjAwLCAgLyohPCBUaGVyZSBpcyBhbiBhdXRvbWF0aWMgcHJvY2VzcyB3aGljaCBpbnRlcm5hbGx5IHJlY29uZmlndXJlcyB0aGUgZW5jb2RlciBpbnN0YW5jZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gYSBjb25maWd1cmF0aW9uIHBhcmFtZXRlciBjaGFuZ2VkIG9yIGFuIGVycm9yIG9jY3VyZWQuIFRoaXMgcGFyYW1lcnRlciBhbGxvd3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyd3JpdGluZyBvciBnZXR0aW5nIHRoZSBjb250cm9sIHN0YXR1cyBvZiB0aGlzIHByb2Nlc3MuIFNlZSA6OkFBQ0VOQ19DVFJMRkxBR1MuICovCgogIEFBQ0VOQ19OT05FICAgICAgICAgICAgICAgICAgICAgPSAweEZGRkYgICAvKiE8IC0tLS0tLSAqLwoKfSBBQUNFTkNfUEFSQU07CgoKI2lmZGVmIF9fY3BsdXNwbHVzCmV4dGVybiAiQyIgewojZW5kaWYKCi8qKgogKiBcYnJpZWYgIE9wZW4gYW4gaW5zdGFuY2Ugb2YgdGhlIGVuY29kZXIuCiAqCiAqIEFsbG9jYXRlIG1lbW9yeSBmb3IgYW4gZW5jb2RlciBpbnN0YW5jZSB3aXRoIGEgZnVuY3Rpb25hbCByYW5nZSBkZW5vdGVkIGJ5IHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzLgogKiBQcmVpbml0aWFsaXplIGVuY29kZXIgaW5zdGFuY2Ugd2l0aCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uCiAqCiAqIFxwYXJhbSBwaEFhY0VuY29kZXIgIEEgcG9pbnRlciB0byBhbiBlbmNvZGVyIGhhbmRsZS4gSW5pdGlhbGl6ZWQgb24gcmV0dXJuLgogKiBccGFyYW0gZW5jTW9kdWxlcyAgICBTcGVjaWZ5IGVuY29kZXIgbW9kdWxlcyB0byBiZSBzdXBwb3J0ZWQgaW4gdGhpcyBlbmNvZGVyIGluc3RhbmNlOgogKiAgICAgICAgICAgICAgICAgICAgICAtIDB4MDogQWxsb2NhdGUgbWVtb3J5IGZvciBhbGwgYXZhaWxhYmxlIGVuY29kZXIgbW9kdWxlcy4KICogICAgICAgICAgICAgICAgICAgICAgLSBlbHNlOiBTZWxlY3QgbWVtb3J5IGFsbG9jYXRpb24gcmVnYXJkaW5nIGVuY29kZXIgbW9kdWxlcy4gRm9sbG93aW5nIGZsYWdzIGFyZSBwb3NzaWJsZSBhbmQgY2FuIGJlIGNvbWJpbmVkLgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMHgwMTogQUFDIG1vZHVsZS4KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDB4MDI6IFNCUiBtb2R1bGUuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAweDA0OiBQUyBtb2R1bGUuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAweDEwOiBNZXRhZGF0YSBtb2R1bGUuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBleGFtcGxlOiAoMHgwMXwweDAyfDB4MDR8MHgxMCkgYWxsb2NhdGVzIGFsbCBtb2R1bGVzIGFuZCBpcyBlcXVpdmFsZW50IHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiBkZW5vdGV0IGJ5IDB4MC4KICogXHBhcmFtIG1heENoYW5uZWxzICAgTnVtYmVyIG9mIGNoYW5uZWxzIHRvIGJlIGFsbG9jYXRlZC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgaW4gZGlmZmVyZW50IHdheXM6CiAqICAgICAgICAgICAgICAgICAgICAgIC0gMDogQWxsb2NhdGUgbWF4aW11bSBudW1iZXIgb2YgQUFDIGFuZCBTQlIgY2hhbm5lbHMgYXMgc3VwcG9ydGVkIGJ5IHRoZSBsaWJyYXJ5LgogKiAgICAgICAgICAgICAgICAgICAgICAtIG5DaGFubmVsczogVXNlIHNhbWUgbWF4aW11bSBudW1iZXIgb2YgY2hhbm5lbHMgZm9yIGFsbG9jYXRpbmcgbWVtb3J5IGluIEFBQyBhbmQgU0JSIG1vZHVsZS4KICogICAgICAgICAgICAgICAgICAgICAgLSBuQ2hhbm5lbHMgfCAoblNickNoPDw4KTogTnVtYmVyIG9mIFNCUiBjaGFubmVscyBjYW4gYmUgZGlmZmVyZW50IHRvIEFBQyBjaGFubmVscyB0byBzYXZlIGRhdGEgbWVtb3J5LgogKgogKiBccmV0dXJuCiAqICAgICAgICAgIC0gQUFDRU5DX09LLCBvbiBzdWNjZXMuCiAqICAgICAgICAgIC0gQUFDRU5DX0lOVkFMSURfSEFORExFLCBBQUNFTkNfTUVNT1JZX0VSUk9SLCBBQUNFTkNfSU5WQUxJRF9DT05GSUcsIG9uIGZhaWx1cmUuCiAqLwpBQUNFTkNfRVJST1IgYWFjRW5jT3BlbigKICAgICAgICBIQU5ETEVfQUFDRU5DT0RFUiAgICAgICAgKnBoQWFjRW5jb2RlciwKICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgICAgIGVuY01vZHVsZXMsCiAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICAgICBtYXhDaGFubmVscwogICAgICAgICk7CgoKLyoqCiAqIFxicmllZiAgQ2xvc2UgdGhlIGVuY29kZXIgaW5zdGFuY2UuCiAqCiAqIERlYWxsb2NhdGUgZW5jb2RlciBpbnN0YW5jZSBhbmQgZnJlZSB3aG9sZSBtZW1vcnkuCiAqCiAqIFxwYXJhbSBwaEFhY0VuY29kZXIgIFBvaW50ZXIgdG8gdGhlIGVuY29kZXIgaGFuZGxlIHRvIGJlIGRlYWxsb2NhdGVkLgogKgogKiBccmV0dXJuCiAqICAgICAgICAgIC0gQUFDRU5DX09LLCBvbiBzdWNjZXNzLgogKiAgICAgICAgICAtIEFBQ0VOQ19JTlZBTElEX0hBTkRMRSwgb24gZmFpbHVyZS4KICovCkFBQ0VOQ19FUlJPUiBhYWNFbmNDbG9zZSgKICAgICAgICBIQU5ETEVfQUFDRU5DT0RFUiAgICAgICAgKnBoQWFjRW5jb2RlcgogICAgICAgICk7CgoKLyoqCiAqIFxicmllZiBFbmNvZGUgYXVkaW8gZGF0YS4KICoKICogVGhpcyBmdW5jdGlvbiBpcyBtYWlubHkgZm9yIGVuY29kaW5nIGF1ZGlvIGRhdGEuIEluIGFkZGl0aW9uIHRoZSBmdW5jdGlvbiBjYW4gYmUgdXNlZCBmb3IgYW4gZW5jb2RlciAocmUpY29uZmlndXJhdGlvbgogKiBwcm9jZXNzLgogKiAtIFBDTSBpbnB1dCBkYXRhIHdpbGwgYmUgcmV0cmlldmVkIGZyb20gZXh0ZXJuYWwgaW5wdXQgYnVmZmVyIHVudGlsIHRoZSBmaWxsIGxldmVsIGFsbG93cyBlbmNvZGluZyBhIHNpbmdsZSBmcmFtZS4KICogICBUaGlzIGZ1bmN0aW9uYWxpdHkgYWxsb3dzIGFuIGV4dGVybmFsIGJ1ZmZlciB3aXRoIHJlZHVjZWQgc2l6ZSBpbiBjb21wYXJpc29uIHRvIHRoZSBBQUMgb3IgSEUtQUFDIGF1ZGlvIGZyYW1lIGxlbmd0aC4KICogLSBJZiB0aGUgdmFsdWUgb2YgdGhlIGlucHV0IHNhbXBsZXMgYXJndW1lbnQgaXMgemVybywganVzdCBpbnRlcm5hbCByZWluaXRpYWxpemF0aW9uIHdpbGwgYmUgYXBwbGllZCBpZiBpdCBpcwogKiAgIHJlcXVlc3RlZC4KICogLSBBdCB0aGUgZW5kIG9mIGEgZmlsZSB0aGUgZmx1c2hpbmcgcHJvY2VzcyBjYW4gYmUgdHJpZ2dlcmQgdmlhIHNldHRpbmcgdGhlIHZhbHVlIG9mIHRoZSBpbnB1dCBzYW1wbGVzIGFyZ3VtZW50IHRvIC0xLgogKiAgIFRoZSBlbmNvZGVyIGRlbGF5IGxpbmVzIGFyZSBmdWxseSBmbHVzaGVkIHdoZW4gdGhlIGVuY29kZXIgcmV0dXJucyBubyB2YWxpZCBiaXRzdHJlYW0gZGF0YSBBQUNFTkNfT3V0QXJnczo6bnVtT3V0Qnl0ZXMuCiAqICAgRnVydGhlcm1vcmUgdGhlIGVuZCBvZiBmaWxlIGlzIHNpZ25hbGVkIGJ5IHRoZSByZXR1cm4gdmFsdWUgQUFDRU5DX0VOQ09ERV9FT0YuCiAqIC0gSWYgYW4gZXJyb3Igb2NjdXJlZCBpbiB0aGUgcHJldmlvdXMgZnJhbWUgb3IgYW55IG9mIHRoZSBlbmNvZGVyIHBhcmFtZXRlcnMgY2hhbmdlZCwgYW4gaW50ZXJuYWwgcmVpbml0aWFsaXphdGlvbgogKiAgIHByb2Nlc3Mgd2lsbCBiZSBhcHBsaWVkIGJlZm9yZSBlbmNvZGluZyB0aGUgaW5jb21pbmcgYXVkaW8gc2FtcGxlcy4KICogLSBUaGUgZnVuY3Rpb24gY2FuIGFsc28gYmUgdXNlZCBmb3IgYW4gaW5kZXBlbmRlbnQgcmVjb25maWd1cmF0aW9uIHByb2Nlc3Mgd2l0aG91dCBlbmNvZGluZy4gVGhlIGZpcnN0IHBhcmFtZXRlciBoYXMgdG8gYmUgYQogKiAgIHZhbGlkIGVuY29kZXIgaGFuZGxlIGFuZCBhbGwgb3RoZXIgcGFyYW1ldGVycyBjYW4gYmUgc2V0IHRvIE5VTEwuCiAqIC0gSWYgdGhlIHNpemUgb2YgdGhlIGV4dGVybmFsIGJpdGJ1ZmZlciBpbiBvdXRCdWZEZXNjIGlzIG5vdCBzdWZmaWNpZW50IGZvciB3cml0aW5nIHRoZSB3aG9sZSBiaXRzdHJlYW0sIGFuIGludGVybmFsCiAqICAgZXJyb3Igd2lsbCBiZSB0aGUgcmV0dXJuIHZhbHVlIGFuZCBhIHJlY29uZmlndXJhdGlvbiB3aWxsIGJlIHRyaWdnZXJlZC4KICoKICogXHBhcmFtIGhBYWNFbmNvZGVyICAgICAgICAgICBBIHZhbGlkIEFBQyBlbmNvZGVyIGhhbmRsZS4KICogXHBhcmFtIGluQnVmRGVzYyAgICAgICAgICAgICBJbnB1dCBidWZmZXIgZGVzY3JpcHRvciwgc2VlIEFBQ0VOQ19CdWZEZXNjOgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gQXQgbGVhc3Qgb25lIGlucHV0IGJ1ZmZlciB3aXRoIGF1ZGlvIGRhdGEgaXMgZXhwZWN0ZWQuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBPcHRpb25hbGx5IGEgc2Vjb25kIGlucHV0IGJ1ZmZlciB3aXRoIGFuY2lsbGFyeSBkYXRhIGNhbiBiZSBmZWQuCiAqIFxwYXJhbSBvdXRCdWZEZXNjICAgICAgICAgICAgT3V0cHV0IGJ1ZmZlciBkZXNjcmlwdG9yLCBzZWUgQUFDRU5DX0J1ZkRlc2M6CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBQcm92aWRlIG9uZSBvdXRwdXQgYnVmZmVyIGZvciB0aGUgZW5jb2RlZCBiaXRzdHJlYW0uCiAqIFxwYXJhbSBpbmFyZ3MgICAgICAgICAgICAgICAgSW5wdXQgYXJndW1lbnRzLCBzZWUgQUFDRU5DX0luQXJncy4KICogXHBhcmFtIG91dGFyZ3MgICAgICAgICAgICAgICBPdXRwdXQgYXJndW1lbnRzLCBBQUNFTkNfT3V0QXJncy4KICoKICogXHJldHVybgogKiAgICAgICAgICAtIEFBQ0VOQ19PSywgb24gc3VjY2Vzcy4KICogICAgICAgICAgLSBBQUNFTkNfSU5WQUxJRF9IQU5ETEUsIEFBQ0VOQ19FTkNPREVfRVJST1IsIG9uIGZhaWx1cmUgaW4gZW5jb2RpbmcgcHJvY2Vzcy4KICogICAgICAgICAgLSBBQUNFTkNfSU5WQUxJRF9DT05GSUcsIEFBQ0VOQ19JTklUX0VSUk9SLCBBQUNFTkNfSU5JVF9BQUNfRVJST1IsIEFBQ0VOQ19JTklUX1NCUl9FUlJPUiwgQUFDRU5DX0lOSVRfVFBfRVJST1IsCiAqICAgICAgICAgICAgQUFDRU5DX0lOSVRfTUVUQV9FUlJPUiwgb24gZmFpbHVyZSBpbiBlbmNvZGVyIGluaXRpYWxpemF0aW9uLgogKiAgICAgICAgICAtIEFBQ0VOQ19FTkNPREVfRU9GLCB3aGVuIGZsdXNoaW5nIGZ1bGx5IGNvbmNsdWRlZC4KICovCkFBQ0VOQ19FUlJPUiBhYWNFbmNFbmNvZGUoCiAgICAgICAgY29uc3QgSEFORExFX0FBQ0VOQ09ERVIgICBoQWFjRW5jb2RlciwKICAgICAgICBjb25zdCBBQUNFTkNfQnVmRGVzYyAgICAgKmluQnVmRGVzYywKICAgICAgICBjb25zdCBBQUNFTkNfQnVmRGVzYyAgICAgKm91dEJ1ZkRlc2MsCiAgICAgICAgY29uc3QgQUFDRU5DX0luQXJncyAgICAgICppbmFyZ3MsCiAgICAgICAgQUFDRU5DX091dEFyZ3MgICAgICAgICAgICpvdXRhcmdzCiAgICAgICAgKTsKCgovKioKICogXGJyaWVmICBBY3F1aXJlIGluZm8gYWJvdXQgcHJlc2VudCBlbmNvZGVyIGluc3RhbmNlLgogKgogKiBUaGlzIGZ1bmN0aW9uIHJldHJpZXZlcyBpbmZvcm1hdGlvbiBvZiB0aGUgZW5jb2RlciBjb25maWd1cmF0aW9uLiBJbiBhZGRpdGlvbiB0byBpbmZvcm1hdGl2ZSBpbnRlcm5hbCBzdGF0ZXMsCiAqIGEgY29uZmlndXJhdGlvbiBkYXRhIGJsb2NrIG9mIHRoZSBjdXJyZW50IGVuY29kZXIgc2V0dGluZ3Mgd2lsbCBiZSByZXR1cm5lZC4gVGhlIGZvcm1hdCBpcyBlaXRoZXIgQXVkaW8gU3BlY2lmaWMgQ29uZmlnCiAqIGluIGNhc2Ugb2YgUmF3IFBhY2tldHMgdHJhbnNwb3J0IGZvcm1hdCBvciBTdHJlYW1NdXhDb25maWcgaW4gY2FzZSBvZiBMT0FTL0xBVE0gdHJhbnNwb3J0IGZvcm1hdC4gVGhlIGNvbmZpZ3VyYXRpb24KICogZGF0YSBibG9jayBpcyBiaW5hcnkgY29kZWQgYXMgc3BlY2lmaWVkIGluIElTTy9JRUMgMTQ0OTYtMyAoTVBFRy00IGF1ZGlvKSwgdG8gYmUgdXNlZCBkaXJlY3RseSBmb3IgTVBFRy00IEZpbGUgRm9ybWF0CiAqIG9yIFJGQzMwMTYgb3IgUkZDMzY0MCBhcHBsaWNhdGlvbnMuCiAqCiAqIFxwYXJhbSBoQWFjRW5jb2RlciAgICAgICAgICAgQSB2YWxpZCBBQUMgZW5jb2RlciBoYW5kbGUuCiAqIFxwYXJhbSBwSW5mbyAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBBQUNFTkNfSW5mb1N0cnVjdC4gRmlsbGVkIG9uIHJldHVybi4KICoKICogXHJldHVybgogKiAgICAgICAgICAtIEFBQ0VOQ19PSywgb24gc3VjY2VzLgogKiAgICAgICAgICAtIEFBQ0VOQ19JTklUX0VSUk9SLCBvbiBmYWlsdXJlLgogKi8KQUFDRU5DX0VSUk9SIGFhY0VuY0luZm8oCiAgICAgICAgY29uc3QgSEFORExFX0FBQ0VOQ09ERVIgICBoQWFjRW5jb2RlciwKICAgICAgICBBQUNFTkNfSW5mb1N0cnVjdCAgICAgICAgKnBJbmZvCiAgICAgICAgKTsKCgovKioKICogXGJyaWVmICBTZXQgb25lIHNpbmdsZSBBQUMgZW5jb2RlciBwYXJhbWV0ZXIuCiAqCiAqIFRoaXMgZnVuY3Rpb24gYWxsb3dzIGNvbmZpZ3VyYXRpb24gb2YgYWxsIGVuY29kZXIgcGFyYW1ldGVycyBzcGVjaWZpZWQgaW4gOjpBQUNFTkNfUEFSQU0uIEVhY2ggcGFyYW1ldGVyIG11c3QgYmUKICogc2V0IHdpdGggYSBzZXBhcmF0ZSBmdW5jdGlvbiBjYWxsLiBBbiBpbnRlcm5hbCB2YWxpZGF0aW9uIG9mIHRoZSBjb25maWd1cmF0aW9uIHZhbHVlIHJhbmdlIHdpbGwgYmUgZG9uZSBhbmQgYW4KICogaW50ZXJuYWwgcmVjb25maWd1cmF0aW9uIHdpbGwgYmUgc2lnbmFsZWQuIFRoZSBhY3R1YWwgY29uZmlndXJhdGlvbiBhZG9wdGlvbiBpcyBwYXJ0IG9mIHRoZSBzdWJzZXF1ZW50IGFhY0VuY0VuY29kZSgpIGNhbGwuCiAqCiAqIFxwYXJhbSBoQWFjRW5jb2RlciAgICAgICAgICAgQSB2YWxpZCBBQUMgZW5jb2RlciBoYW5kbGUuCiAqIFxwYXJhbSBwYXJhbSAgICAgICAgICAgICAgICAgUGFyYW1ldGVyIHRvIGJlIHNldC4gU2VlIDo6QUFDRU5DX1BBUkFNLgogKiBccGFyYW0gdmFsdWUgICAgICAgICAgICAgICAgIFBhcmFtZXRlciB2YWx1ZS4gU2VlIHBhcmFtZXRlciBkZXNjcmlwdGlvbiBpbiA6OkFBQ0VOQ19QQVJBTS4KICoKICogXHJldHVybgogKiAgICAgICAgICAtIEFBQ0VOQ19PSywgb24gc3VjY2Vzcy4KICogICAgICAgICAgLSBBQUNFTkNfSU5WQUxJRF9IQU5ETEUsIEFBQ0VOQ19VTlNVUFBPUlRFRF9QQVJBTUVURVIsIEFBQ0VOQ19JTlZBTElEX0NPTkZJRywgb24gZmFpbHVyZS4KICovCkFBQ0VOQ19FUlJPUiBhYWNFbmNvZGVyX1NldFBhcmFtKAogICAgICAgIGNvbnN0IEhBTkRMRV9BQUNFTkNPREVSICAgaEFhY0VuY29kZXIsCiAgICAgICAgY29uc3QgQUFDRU5DX1BBUkFNICAgICAgICBwYXJhbSwKICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgICAgIHZhbHVlCiAgICAgICAgKTsKCgovKioKICogXGJyaWVmICBHZXQgb25lIHNpbmdsZSBBQUMgZW5jb2RlciBwYXJhbWV0ZXIuCiAqCiAqIFRoaXMgZnVuY3Rpb24gaXMgdGhlIGNvbXBsZW1lbnQgdG8gYWFjRW5jb2Rlcl9TZXRQYXJhbSgpLiBBZnRlciBlbmNvZGVyIHJlaW5pdGlhbGl6YXRpb24gd2l0aCB1c2VyIGRlZmluZWQgc2V0dGluZ3MsCiAqIHRoZSBpbnRlcm5hbCBzdGF0dXMgY2FuIGJlIG9idGFpbmVkIG9mIGVhY2ggcGFyYW1ldGVyLCBzcGVjaWZpZWQgd2l0aCA6OkFBQ0VOQ19QQVJBTS4KICoKICogXHBhcmFtIGhBYWNFbmNvZGVyICAgICAgICAgICBBIHZhbGlkIEFBQyBlbmNvZGVyIGhhbmRsZS4KICogXHBhcmFtIHBhcmFtICAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgdG8gYmUgcmV0dXJuZWQuIFNlZSA6OkFBQ0VOQ19QQVJBTS4KICoKICogXHJldHVybiAgSW50ZXJuYWwgY29uZmlndXJhdGlvbiB2YWx1ZSBvZiBzcGVjaWZlZCBwYXJhbWV0ZXIgOjpBQUNFTkNfUEFSQU0uCiAqLwpVSU5UIGFhY0VuY29kZXJfR2V0UGFyYW0oCiAgICAgICAgY29uc3QgSEFORExFX0FBQ0VOQ09ERVIgICBoQWFjRW5jb2RlciwKICAgICAgICBjb25zdCBBQUNFTkNfUEFSQU0gICAgICAgIHBhcmFtCiAgICAgICAgKTsKCgovKioKICogXGJyaWVmICBHZXQgaW5mb3JtYXRpb24gYWJvdXQgZW5jb2RlciBsaWJyYXJ5IGJ1aWxkLgogKgogKiBGaWxsIGEgZ2l2ZW4gTElCX0lORk8gc3RydWN0dXJlIHdpdGggbGlicmFyeSB2ZXJzaW9uIGluZm9ybWF0aW9uLgogKgogKiBccGFyYW0gaW5mbyAgUG9pbnRlciB0byBhbiBhbGxvY2F0ZWQgTElCX0lORk8gc3RydWN0LgogKgogKiBccmV0dXJuCiAqICAgICAgICAgIC0gQUFDRU5DX09LLCBvbiBzdWNjZXNzLgogKiAgICAgICAgICAtIEFBQ0VOQ19JTlZBTElEX0hBTkRMRSwgQUFDRU5DX0lOSVRfRVJST1IsIG9uIGZhaWx1cmUuCiAqLwpBQUNFTkNfRVJST1IgYWFjRW5jR2V0TGliSW5mbygKICAgICAgICBMSUJfSU5GTyAgICAgICAgICAgICAgICAgKmluZm8KICAgICAgICApOwoKCiNpZmRlZiBfX2NwbHVzcGx1cwp9CiNlbmRpZgoKI2VuZGlmICAgLyogX0FBQ19FTkNfTElCX0hfICovCg==