rO0ABXNyADBvcmcuZWNsaXBzZS5saW51eHRvb2xzLmNkdC5saWJob3Zlci5MaWJIb3ZlckluZm8AAAAAAAAAAQIAA0wAB2NsYXNzZXN0ABNMamF2YS91dGlsL0hhc2hNYXA7TAAJZnVuY3Rpb25zdAATTGphdmEvdXRpbC9UcmVlTWFwO0wACHR5cGVkZWZzcQB+AAF4cHNyABFqYXZhLnV0aWwuSGFzaE1hcAUH2sHDFmDRAwACRgAKbG9hZEZhY3RvckkACXRocmVzaG9sZHhwP0AAAAAAAAB3CAAAABAAAAAAeHNyABFqYXZhLnV0aWwuVHJlZU1hcAzB9j4tJWrmAwABTAAKY29tcGFyYXRvcnQAFkxqYXZhL3V0aWwvQ29tcGFyYXRvcjt4cHB3BAAABKt0ABMwLVJFUVVJUkVELVNFQ1RJT05Tc3IAMG9yZy5lY2xpcHNlLmxpbnV4dG9vbHMuY2R0LmxpYmhvdmVyLkZ1bmN0aW9uSW5mbwAAAAAAAAABAgAFTAAEZGVzY3QAEkxqYXZhL2xhbmcvU3RyaW5nO0wAB2hlYWRlcnN0ABVMamF2YS91dGlsL0FycmF5TGlzdDtMAARuYW1lcQB+AAtMAAlwcm90b3R5cGVxAH4AC0wACnJldHVyblR5cGVxAH4AC3hwdMioClRoZSBHTlUgQyBMaWJyYXJ5IChFY2xpcHNlIExpYmhvdmVyIFZlcnNpb24pCgpCYXNlZCBvbiBUaGUgR05VIEMgTGlicmFyeQpFRElUSU9OIDAuMTIKVkVSU0lPTiAyLjgKVVBEQVRFRCAyMDA3LTEwLTI3CklTQk4gMS04ODIxMTQtNTUtOAoKVGhpcyBmaWxlIGRvY3VtZW50cyB0aGUgR05VIEMgbGlicmFyeS4KClRoaXMgaXMgYmFzZWQgb24gRWRpdGlvbiAwLjEyLCBsYXN0IHVwZGF0ZWQgMjAwNy0xMC0yNwpvZiBUaGUgR05VIEMgTGlicmFyeSBSZWZlcmVuY2UgTWFudWFsLCBmb3IgdmVyc2lvbiAyLjguCgpDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDEsIDIwMDIsCjIwMDMsIDIwMDcsIDIwMDgsIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCgpQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoaXMgZG9jdW1lbnQKdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgRnJlZSBEb2N1bWVudGF0aW9uIExpY2Vuc2UsIFZlcnNpb24gMS4zIG9yCmFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3aXRoIHRoZQpJbnZhcmlhbnQgU2VjdGlvbnMgYmVpbmcgYGBGcmVlIFNvZnR3YXJlIE5lZWRzIEZyZWUgRG9jdW1lbnRhdGlvbicnCmFuZCBgYEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZScnLCB0aGUgRnJvbnQtQ292ZXIgdGV4dHMgYmVpbmcKYGBBIEdOVSBNYW51YWwnJywgYW5kIHdpdGggdGhlIEJhY2stQ292ZXIgVGV4dHMgYXMgaW4gKGEpIGJlbG93LiAgQQpjb3B5IG9mIHRoZSBsaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoZSBzZWN0aW9uIGVudGl0bGVkICJHTlUgRnJlZQpEb2N1bWVudGF0aW9uIExpY2Vuc2UiLgoKKGEpIFRoZSBGU0YncyBCYWNrLUNvdmVyIFRleHQgaXM6IGBgWW91IGhhdmUgdGhlIGZyZWVkb20gdG8KY29weSBhbmQgbW9kaWZ5IHRoaXMgR05VIG1hbnVhbC4gIEJ1eWluZyBjb3BpZXMgZnJvbSB0aGUgRlNGCnN1cHBvcnRzIGl0IGluIGRldmVsb3BpbmcgR05VIGFuZCBwcm9tb3Rpbmcgc29mdHdhcmUgZnJlZWRvbS4nJwoKQXV0aG9ycwpTYW5kcmEgTG9vc2Vtb3JlCndpdGgKUmljaGFyZCBNLiBTdGFsbG1hbiwgUm9sYW5kIE1jR3JhdGgsIEFuZHJldyBPcmFtLCBhbmQgVWxyaWNoIERyZXBwZXIKRWRpdGlvbiAwLjEyCmxhc3QgdXBkYXRlZCAyMDA3LTEwLTI3CmZvciB2ZXJzaW9uIDIuOAoKTW9kaWZpZWQgZm9yIHVzZSB3aXRoIEVjbGlwc2UgbGliaG92ZXIgcGx1Zy1pbiBieSBKZWZmIEpvaG5zdG9uLgoKTW9kaWZpZWQgZG9jdW1lbnRhdGlvbiBwdWJsaXNoZWQgYnkgRWNsaXBzZSBMaW51eCBUb29scyBwcm9qZWN0CgpDb3ZlciBhcnQgZm9yIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24ncyBwcmludGVkIGVkaXRpb24KYnkgRXRpZW5uZSBTdXZhc2EuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKRnJlZSBTb2Z0d2FyZSBOZWVkcyBGcmVlIERvY3VtZW50YXRpb24KClRoZSBiaWdnZXN0IGRlZmljaWVuY3kgaW4gdGhlIGZyZWUgc29mdHdhcmUgY29tbXVuaXR5IHRvZGF5IGlzIG5vdCBpbgp0aGUgc29mdHdhcmUtLS1pdCBpcyB0aGUgbGFjayBvZiBnb29kIGZyZWUgZG9jdW1lbnRhdGlvbiB0aGF0IHdlIGNhbgppbmNsdWRlIHdpdGggdGhlIGZyZWUgc29mdHdhcmUuICBNYW55IG9mIG91ciBtb3N0IGltcG9ydGFudApwcm9ncmFtcyBkbyBub3QgY29tZSB3aXRoIGZyZWUgcmVmZXJlbmNlIG1hbnVhbHMgYW5kIGZyZWUgaW50cm9kdWN0b3J5CnRleHRzLiAgRG9jdW1lbnRhdGlvbiBpcyBhbiBlc3NlbnRpYWwgcGFydCBvZiBhbnkgc29mdHdhcmUgcGFja2FnZTsKd2hlbiBhbiBpbXBvcnRhbnQgZnJlZSBzb2Z0d2FyZSBwYWNrYWdlIGRvZXMgbm90IGNvbWUgd2l0aCBhIGZyZWUKbWFudWFsIGFuZCBhIGZyZWUgdHV0b3JpYWwsIHRoYXQgaXMgYSBtYWpvciBnYXAuICBXZSBoYXZlIG1hbnkgc3VjaApnYXBzIHRvZGF5LgoKQ29uc2lkZXIgUGVybCwgZm9yIGluc3RhbmNlLiAgVGhlIHR1dG9yaWFsIG1hbnVhbHMgdGhhdCBwZW9wbGUKbm9ybWFsbHkgdXNlIGFyZSBub24tZnJlZS4gIEhvdyBkaWQgdGhpcyBjb21lIGFib3V0PyAgQmVjYXVzZSB0aGUKYXV0aG9ycyBvZiB0aG9zZSBtYW51YWxzIHB1Ymxpc2hlZCB0aGVtIHdpdGggcmVzdHJpY3RpdmUgdGVybXMtLS1ubwpjb3B5aW5nLCBubyBtb2RpZmljYXRpb24sIHNvdXJjZSBmaWxlcyBub3QgYXZhaWxhYmxlLS0td2hpY2ggZXhjbHVkZQp0aGVtIGZyb20gdGhlIGZyZWUgc29mdHdhcmUgd29ybGQuCgpUaGF0IHdhc24ndCB0aGUgZmlyc3QgdGltZSB0aGlzIHNvcnQgb2YgdGhpbmcgaGFwcGVuZWQsIGFuZCBpdCB3YXMgZmFyCmZyb20gdGhlIGxhc3QuICBNYW55IHRpbWVzIHdlIGhhdmUgaGVhcmQgYSBHTlUgdXNlciBlYWdlcmx5IGRlc2NyaWJlIGEKbWFudWFsIHRoYXQgaGUgaXMgd3JpdGluZywgaGlzIGludGVuZGVkIGNvbnRyaWJ1dGlvbiB0byB0aGUgY29tbXVuaXR5LApvbmx5IHRvIGxlYXJuIHRoYXQgaGUgaGFkIHJ1aW5lZCBldmVyeXRoaW5nIGJ5IHNpZ25pbmcgYSBwdWJsaWNhdGlvbgpjb250cmFjdCB0byBtYWtlIGl0IG5vbi1mcmVlLgoKRnJlZSBkb2N1bWVudGF0aW9uLCBsaWtlIGZyZWUgc29mdHdhcmUsIGlzIGEgbWF0dGVyIG9mIGZyZWVkb20sIG5vdApwcmljZS4gIFRoZSBwcm9ibGVtIHdpdGggdGhlIG5vbi1mcmVlIG1hbnVhbCBpcyBub3QgdGhhdCBwdWJsaXNoZXJzCmNoYXJnZSBhIHByaWNlIGZvciBwcmludGVkIGNvcGllcy0tLXRoYXQgaW4gaXRzZWxmIGlzIGZpbmUuICAoVGhlIEZyZWUKU29mdHdhcmUgRm91bmRhdGlvbiBzZWxscyBwcmludGVkIGNvcGllcyBvZiBtYW51YWxzLCB0b28uKSAgVGhlCnByb2JsZW0gaXMgdGhlIHJlc3RyaWN0aW9ucyBvbiB0aGUgdXNlIG9mIHRoZSBtYW51YWwuICBGcmVlIG1hbnVhbHMKYXJlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtLCBhbmQgZ2l2ZSB5b3UgcGVybWlzc2lvbiB0byBjb3B5IGFuZAptb2RpZnkuICBOb24tZnJlZSBtYW51YWxzIGRvIG5vdCBhbGxvdyB0aGlzLgoKVGhlIGNyaXRlcmlhIG9mIGZyZWVkb20gZm9yIGEgZnJlZSBtYW51YWwgYXJlIHJvdWdobHkgdGhlIHNhbWUgYXMgZm9yCmZyZWUgc29mdHdhcmUuICBSZWRpc3RyaWJ1dGlvbiAoaW5jbHVkaW5nIHRoZSBub3JtYWwga2luZHMgb2YKY29tbWVyY2lhbCByZWRpc3RyaWJ1dGlvbikgbXVzdCBiZSBwZXJtaXR0ZWQsIHNvIHRoYXQgdGhlIG1hbnVhbCBjYW4KYWNjb21wYW55IGV2ZXJ5IGNvcHkgb2YgdGhlIHByb2dyYW0sIGJvdGggb24tbGluZSBhbmQgb24gcGFwZXIuCgpQZXJtaXNzaW9uIGZvciBtb2RpZmljYXRpb24gb2YgdGhlIHRlY2huaWNhbCBjb250ZW50IGlzIGNydWNpYWwgdG9vLgpXaGVuIHBlb3BsZSBtb2RpZnkgdGhlIHNvZnR3YXJlLCBhZGRpbmcgb3IgY2hhbmdpbmcgZmVhdHVyZXMsIGlmIHRoZXkKYXJlIGNvbnNjaWVudGlvdXMgdGhleSB3aWxsIGNoYW5nZSB0aGUgbWFudWFsIHRvby0tLXNvIHRoZXkgY2FuCnByb3ZpZGUgYWNjdXJhdGUgYW5kIGNsZWFyIGRvY3VtZW50YXRpb24gZm9yIHRoZSBtb2RpZmllZCBwcm9ncmFtLiAgQQptYW51YWwgdGhhdCBsZWF2ZXMgeW91IG5vIGNob2ljZSBidXQgdG8gd3JpdGUgYSBuZXcgbWFudWFsIHRvIGRvY3VtZW50CmEgY2hhbmdlZCB2ZXJzaW9uIG9mIHRoZSBwcm9ncmFtIGlzIG5vdCByZWFsbHkgYXZhaWxhYmxlIHRvIG91cgpjb21tdW5pdHkuCgpTb21lIGtpbmRzIG9mIGxpbWl0cyBvbiB0aGUgd2F5IG1vZGlmaWNhdGlvbiBpcyBoYW5kbGVkIGFyZQphY2NlcHRhYmxlLiAgRm9yIGV4YW1wbGUsIHJlcXVpcmVtZW50cyB0byBwcmVzZXJ2ZSB0aGUgb3JpZ2luYWwKYXV0aG9yJ3MgY29weXJpZ2h0IG5vdGljZSwgdGhlIGRpc3RyaWJ1dGlvbiB0ZXJtcywgb3IgdGhlIGxpc3Qgb2YKYXV0aG9ycywgYXJlIG9rLiAgSXQgaXMgYWxzbyBubyBwcm9ibGVtIHRvIHJlcXVpcmUgbW9kaWZpZWQgdmVyc2lvbnMKdG8gaW5jbHVkZSBub3RpY2UgdGhhdCB0aGV5IHdlcmUgbW9kaWZpZWQuICBFdmVuIGVudGlyZSBzZWN0aW9ucyB0aGF0Cm1heSBub3QgYmUgZGVsZXRlZCBvciBjaGFuZ2VkIGFyZSBhY2NlcHRhYmxlLCBhcyBsb25nIGFzIHRoZXkgZGVhbAp3aXRoIG5vbnRlY2huaWNhbCB0b3BpY3MgKGxpa2UgdGhpcyBvbmUpLiAgVGhlc2Uga2luZHMgb2YgcmVzdHJpY3Rpb25zCmFyZSBhY2NlcHRhYmxlIGJlY2F1c2UgdGhleSBkb24ndCBvYnN0cnVjdCB0aGUgY29tbXVuaXR5J3Mgbm9ybWFsIHVzZQpvZiB0aGUgbWFudWFsLgoKSG93ZXZlciwgaXQgbXVzdCBiZSBwb3NzaWJsZSB0byBtb2RpZnkgYWxsIHRoZSBAZW1waHt0ZWNobmljYWx9CmNvbnRlbnQgb2YgdGhlIG1hbnVhbCwgYW5kIHRoZW4gZGlzdHJpYnV0ZSB0aGUgcmVzdWx0IGluIGFsbCB0aGUgdXN1YWwKbWVkaWEsIHRocm91Z2ggYWxsIHRoZSB1c3VhbCBjaGFubmVscy4gIE90aGVyd2lzZSwgdGhlIHJlc3RyaWN0aW9ucwpvYnN0cnVjdCB0aGUgdXNlIG9mIHRoZSBtYW51YWwsIGl0IGlzIG5vdCBmcmVlLCBhbmQgd2UgbmVlZCBhbm90aGVyCm1hbnVhbCB0byByZXBsYWNlIGl0LgoKUGxlYXNlIHNwcmVhZCB0aGUgd29yZCBhYm91dCB0aGlzIGlzc3VlLiAgT3VyIGNvbW11bml0eSBjb250aW51ZXMgdG8KbG9zZSBtYW51YWxzIHRvIHByb3ByaWV0YXJ5IHB1Ymxpc2hpbmcuICBJZiB3ZSBzcHJlYWQgdGhlIHdvcmQgdGhhdApmcmVlIHNvZnR3YXJlIG5lZWRzIGZyZWUgcmVmZXJlbmNlIG1hbnVhbHMgYW5kIGZyZWUgdHV0b3JpYWxzLCBwZXJoYXBzCnRoZSBuZXh0IHBlcnNvbiB3aG8gd2FudHMgdG8gY29udHJpYnV0ZSBieSB3cml0aW5nIGRvY3VtZW50YXRpb24gd2lsbApyZWFsaXplLCBiZWZvcmUgaXQgaXMgdG9vIGxhdGUsIHRoYXQgb25seSBmcmVlIG1hbnVhbHMgY29udHJpYnV0ZSB0bwp0aGUgZnJlZSBzb2Z0d2FyZSBjb21tdW5pdHkuCgpJZiB5b3UgYXJlIHdyaXRpbmcgZG9jdW1lbnRhdGlvbiwgcGxlYXNlIGluc2lzdCBvbiBwdWJsaXNoaW5nIGl0IHVuZGVyCnRoZSBHTlUgRnJlZSBEb2N1bWVudGF0aW9uIExpY2Vuc2Ugb3IgYW5vdGhlciBmcmVlIGRvY3VtZW50YXRpb24KbGljZW5zZS4gIFJlbWVtYmVyIHRoYXQgdGhpcyBkZWNpc2lvbiByZXF1aXJlcyB5b3VyIGFwcHJvdmFsLS0teW91CmRvbid0IGhhdmUgdG8gbGV0IHRoZSBwdWJsaXNoZXIgZGVjaWRlLiAgU29tZSBjb21tZXJjaWFsIHB1Ymxpc2hlcnMKd2lsbCB1c2UgYSBmcmVlIGxpY2Vuc2UgaWYgeW91IGluc2lzdCwgYnV0IHRoZXkgd2lsbCBub3QgcHJvcG9zZSB0aGUKb3B0aW9uOyBpdCBpcyB1cCB0byB5b3UgdG8gcmFpc2UgdGhlIGlzc3VlIGFuZCBzYXkgZmlybWx5IHRoYXQgdGhpcyBpcwp3aGF0IHlvdSB3YW50LiAgSWYgdGhlIHB1Ymxpc2hlciB5b3UgYXJlIGRlYWxpbmcgd2l0aCByZWZ1c2VzLCBwbGVhc2UKdHJ5IG90aGVyIHB1Ymxpc2hlcnMuICBJZiB5b3UncmUgbm90IHN1cmUgd2hldGhlciBhIHByb3Bvc2VkIGxpY2Vuc2UKaXMgZnJlZSwgd3JpdGUgdG8gQGVtYWlse2xpY2Vuc2luZ0BAZ251Lm9yZ30uCgpZb3UgY2FuIGVuY291cmFnZSBjb21tZXJjaWFsIHB1Ymxpc2hlcnMgdG8gc2VsbCBtb3JlIGZyZWUsIGNvcHlsZWZ0ZWQKbWFudWFscyBhbmQgdHV0b3JpYWxzIGJ5IGJ1eWluZyB0aGVtLCBhbmQgcGFydGljdWxhcmx5IGJ5IGJ1eWluZwpjb3BpZXMgZnJvbSB0aGUgcHVibGlzaGVycyB0aGF0IHBhaWQgZm9yIHRoZWlyIHdyaXRpbmcgb3IgZm9yIG1ham9yCmltcHJvdmVtZW50cy4gIE1lYW53aGlsZSwgdHJ5IHRvIGF2b2lkIGJ1eWluZyBub24tZnJlZSBkb2N1bWVudGF0aW9uCmF0IGFsbC4gIENoZWNrIHRoZSBkaXN0cmlidXRpb24gdGVybXMgb2YgYSBtYW51YWwgYmVmb3JlIHlvdSBidXkgaXQsCmFuZCBpbnNpc3QgdGhhdCB3aG9ldmVyIHNlZWtzIHlvdXIgYnVzaW5lc3MgbXVzdCByZXNwZWN0IHlvdXIgZnJlZWRvbS4KQ2hlY2sgdGhlIGhpc3Rvcnkgb2YgdGhlIGJvb2ssIGFuZCB0cnkgcmV3YXJkIHRoZSBwdWJsaXNoZXJzIHRoYXQgaGF2ZQpwYWlkIG9yIHBheSB0aGUgYXV0aG9ycyB0byB3b3JrIG9uIGl0LgoKVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYWludGFpbnMgYSBsaXN0IG9mIGZyZWUgZG9jdW1lbnRhdGlvbgpwdWJsaXNoZWQgYnkgb3RoZXIgcHVibGlzaGVycywgYXQKaHR0cDovL3d3dy5mc2Yub3JnL2RvYy9vdGhlci1mcmVlLWJvb2tzLmh0bWwuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKClZlcnNpb24gMi4xLCBGZWJydWFyeSAxOTk5CgpDb3B5cmlnaHQgQGNvcHlyaWdodHt9IDE5OTEsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCjU5IFRlbXBsZSBQbGFjZSAtLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCgpFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCgpbVGhpcyBpcyB0aGUgZmlyc3QgcmVsZWFzZWQgdmVyc2lvbiBvZiB0aGUgTGVzc2VyIEdQTC4gIEl0IGFsc28gY291bnRzCmFzIHRoZSBzdWNjZXNzb3Igb2YgdGhlIEdOVSBMaWJyYXJ5IFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIGhlbmNlIHRoZQp2ZXJzaW9uIG51bWJlciAyLjEuXQoKUHJlYW1ibGUKCiAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgpmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwpMaWNlbnNlcyBhcmUgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlCmZyZWUgc29mdHdhcmUtLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuCgogIFRoaXMgbGljZW5zZSwgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhcHBsaWVzIHRvIHNvbWUKc3BlY2lhbGx5IGRlc2lnbmF0ZWQgc29mdHdhcmUtLS10eXBpY2FsbHkgbGlicmFyaWVzLS0tb2YgdGhlIEZyZWUKU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgb3RoZXIgYXV0aG9ycyB3aG8gZGVjaWRlIHRvIHVzZSBpdC4gIFlvdSBjYW4gdXNlCml0IHRvbywgYnV0IHdlIHN1Z2dlc3QgeW91IGZpcnN0IHRoaW5rIGNhcmVmdWxseSBhYm91dCB3aGV0aGVyIHRoaXMKbGljZW5zZSBvciB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyB0aGUgYmV0dGVyIHN0cmF0ZWd5IHRvCnVzZSBpbiBhbnkgcGFydGljdWxhciBjYXNlLCBiYXNlZCBvbiB0aGUgZXhwbGFuYXRpb25zIGJlbG93LgoKICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSBvZiB1c2UsCm5vdCBwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQKeW91IGhhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZQpmb3IgdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKTsgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0Cml0IGlmIHlvdSB3YW50IGl0OyB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBhbmQgdXNlIHBpZWNlcyBvZiBpdAppbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGFyZSBpbmZvcm1lZCB0aGF0IHlvdSBjYW4gZG8gdGhlc2UKdGhpbmdzLgoKICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCmRpc3RyaWJ1dG9ycyB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlc2UKcmlnaHRzLiAgVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yCnlvdSBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIGxpYnJhcnkgb3IgaWYgeW91IG1vZGlmeSBpdC4KCiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSwgd2hldGhlciBncmF0aXMKb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQgd2UgZ2F2ZQp5b3UuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUgc291cmNlCmNvZGUuICBJZiB5b3UgbGluayBvdGhlciBjb2RlIHdpdGggdGhlIGxpYnJhcnksIHlvdSBtdXN0IHByb3ZpZGUKY29tcGxldGUgb2JqZWN0IGZpbGVzIHRvIHRoZSByZWNpcGllbnRzLCBzbyB0aGF0IHRoZXkgY2FuIHJlbGluayB0aGVtCndpdGggdGhlIGxpYnJhcnkgYWZ0ZXIgbWFraW5nIGNoYW5nZXMgdG8gdGhlIGxpYnJhcnkgYW5kIHJlY29tcGlsaW5nCml0LiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIgcmlnaHRzLgoKICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggYSB0d28tc3RlcCBtZXRob2Q6ICgxKSB3ZSBjb3B5cmlnaHQgdGhlCmxpYnJhcnksIGFuZCAoMikgd2Ugb2ZmZXIgeW91IHRoaXMgbGljZW5zZSwgd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsCnBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBsaWJyYXJ5LgoKICBUbyBwcm90ZWN0IGVhY2ggZGlzdHJpYnV0b3IsIHdlIHdhbnQgdG8gbWFrZSBpdCB2ZXJ5IGNsZWFyIHRoYXQKdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoZSBmcmVlIGxpYnJhcnkuICBBbHNvLCBpZiB0aGUgbGlicmFyeSBpcwptb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgdGhlIHJlY2lwaWVudHMgc2hvdWxkIGtub3cKdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsIHZlcnNpb24sIHNvIHRoYXQgdGhlIG9yaWdpbmFsCmF1dGhvcidzIHJlcHV0YXRpb24gd2lsbCBub3QgYmUgYWZmZWN0ZWQgYnkgcHJvYmxlbXMgdGhhdCBtaWdodCBiZQppbnRyb2R1Y2VkIGJ5IG90aGVycy4KCiAgRmluYWxseSwgc29mdHdhcmUgcGF0ZW50cyBwb3NlIGEgY29uc3RhbnQgdGhyZWF0IHRvIHRoZSBleGlzdGVuY2Ugb2YKYW55IGZyZWUgcHJvZ3JhbS4gIFdlIHdpc2ggdG8gbWFrZSBzdXJlIHRoYXQgYSBjb21wYW55IGNhbm5vdAplZmZlY3RpdmVseSByZXN0cmljdCB0aGUgdXNlcnMgb2YgYSBmcmVlIHByb2dyYW0gYnkgb2J0YWluaW5nIGEKcmVzdHJpY3RpdmUgbGljZW5zZSBmcm9tIGEgcGF0ZW50IGhvbGRlci4gIFRoZXJlZm9yZSwgd2UgaW5zaXN0IHRoYXQKYW55IHBhdGVudCBsaWNlbnNlIG9idGFpbmVkIGZvciBhIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgbXVzdCBiZQpjb25zaXN0ZW50IHdpdGggdGhlIGZ1bGwgZnJlZWRvbSBvZiB1c2Ugc3BlY2lmaWVkIGluIHRoaXMgbGljZW5zZS4KCiAgTW9zdCBHTlUgc29mdHdhcmUsIGluY2x1ZGluZyBzb21lIGxpYnJhcmllcywgaXMgY292ZXJlZCBieSB0aGUKb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGlzIGxpY2Vuc2UsIHRoZSBHTlUgTGVzc2VyCkdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFwcGxpZXMgdG8gY2VydGFpbiBkZXNpZ25hdGVkIGxpYnJhcmllcywgYW5kCmlzIHF1aXRlIGRpZmZlcmVudCBmcm9tIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgV2UgdXNlCnRoaXMgbGljZW5zZSBmb3IgY2VydGFpbiBsaWJyYXJpZXMgaW4gb3JkZXIgdG8gcGVybWl0IGxpbmtpbmcgdGhvc2UKbGlicmFyaWVzIGludG8gbm9uLWZyZWUgcHJvZ3JhbXMuCgogIFdoZW4gYSBwcm9ncmFtIGlzIGxpbmtlZCB3aXRoIGEgbGlicmFyeSwgd2hldGhlciBzdGF0aWNhbGx5IG9yIHVzaW5nCmEgc2hhcmVkIGxpYnJhcnksIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgdHdvIGlzIGxlZ2FsbHkgc3BlYWtpbmcgYQpjb21iaW5lZCB3b3JrLCBhIGRlcml2YXRpdmUgb2YgdGhlIG9yaWdpbmFsIGxpYnJhcnkuICBUaGUgb3JkaW5hcnkKR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB0aGVyZWZvcmUgcGVybWl0cyBzdWNoIGxpbmtpbmcgb25seSBpZiB0aGUKZW50aXJlIGNvbWJpbmF0aW9uIGZpdHMgaXRzIGNyaXRlcmlhIG9mIGZyZWVkb20uICBUaGUgTGVzc2VyIEdlbmVyYWwKUHVibGljIExpY2Vuc2UgcGVybWl0cyBtb3JlIGxheCBjcml0ZXJpYSBmb3IgbGlua2luZyBvdGhlciBjb2RlIHdpdGgKdGhlIGxpYnJhcnkuCgogIFdlIGNhbGwgdGhpcyBsaWNlbnNlIHRoZSBAZGZue0xlc3Nlcn0gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBiZWNhdXNlIGl0CmRvZXMgQGVtcGh7TGVzc30gdG8gcHJvdGVjdCB0aGUgdXNlcidzIGZyZWVkb20gdGhhbiB0aGUgb3JkaW5hcnkgR2VuZXJhbApQdWJsaWMgTGljZW5zZS4gIEl0IGFsc28gcHJvdmlkZXMgb3RoZXIgZnJlZSBzb2Z0d2FyZSBkZXZlbG9wZXJzIExlc3MKb2YgYW4gYWR2YW50YWdlIG92ZXIgY29tcGV0aW5nIG5vbi1mcmVlIHByb2dyYW1zLiAgVGhlc2UgZGlzYWR2YW50YWdlcwphcmUgdGhlIHJlYXNvbiB3ZSB1c2UgdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1hbnkKbGlicmFyaWVzLiAgSG93ZXZlciwgdGhlIExlc3NlciBsaWNlbnNlIHByb3ZpZGVzIGFkdmFudGFnZXMgaW4gY2VydGFpbgpzcGVjaWFsIGNpcmN1bXN0YW5jZXMuCgogIEZvciBleGFtcGxlLCBvbiByYXJlIG9jY2FzaW9ucywgdGhlcmUgbWF5IGJlIGEgc3BlY2lhbCBuZWVkIHRvCmVuY291cmFnZSB0aGUgd2lkZXN0IHBvc3NpYmxlIHVzZSBvZiBhIGNlcnRhaW4gbGlicmFyeSwgc28gdGhhdCBpdCBiZWNvbWVzCmEgZGUtZmFjdG8gc3RhbmRhcmQuICBUbyBhY2hpZXZlIHRoaXMsIG5vbi1mcmVlIHByb2dyYW1zIG11c3QgYmUKYWxsb3dlZCB0byB1c2UgdGhlIGxpYnJhcnkuICBBIG1vcmUgZnJlcXVlbnQgY2FzZSBpcyB0aGF0IGEgZnJlZQpsaWJyYXJ5IGRvZXMgdGhlIHNhbWUgam9iIGFzIHdpZGVseSB1c2VkIG5vbi1mcmVlIGxpYnJhcmllcy4gIEluIHRoaXMKY2FzZSwgdGhlcmUgaXMgbGl0dGxlIHRvIGdhaW4gYnkgbGltaXRpbmcgdGhlIGZyZWUgbGlicmFyeSB0byBmcmVlCnNvZnR3YXJlIG9ubHksIHNvIHdlIHVzZSB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCgogIEluIG90aGVyIGNhc2VzLCBwZXJtaXNzaW9uIHRvIHVzZSBhIHBhcnRpY3VsYXIgbGlicmFyeSBpbiBub24tZnJlZQpwcm9ncmFtcyBlbmFibGVzIGEgZ3JlYXRlciBudW1iZXIgb2YgcGVvcGxlIHRvIHVzZSBhIGxhcmdlIGJvZHkgb2YKZnJlZSBzb2Z0d2FyZS4gIEZvciBleGFtcGxlLCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgR05VIEMgTGlicmFyeSBpbgpub24tZnJlZSBwcm9ncmFtcyBlbmFibGVzIG1hbnkgbW9yZSBwZW9wbGUgdG8gdXNlIHRoZSB3aG9sZSBHTlUKb3BlcmF0aW5nIHN5c3RlbSwgYXMgd2VsbCBhcyBpdHMgdmFyaWFudCwgdGhlIEdOVS9MaW51eCBvcGVyYXRpbmcKc3lzdGVtLgoKICBBbHRob3VnaCB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgTGVzcyBwcm90ZWN0aXZlIG9mIHRoZQp1c2VycycgZnJlZWRvbSwgaXQgZG9lcyBlbnN1cmUgdGhhdCB0aGUgdXNlciBvZiBhIHByb2dyYW0gdGhhdCBpcwpsaW5rZWQgd2l0aCB0aGUgTGlicmFyeSBoYXMgdGhlIGZyZWVkb20gYW5kIHRoZSB3aGVyZXdpdGhhbCB0byBydW4KdGhhdCBwcm9ncmFtIHVzaW5nIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeS4KCiAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKbW9kaWZpY2F0aW9uIGZvbGxvdy4gIFBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhCmBgd29yayBiYXNlZCBvbiB0aGUgbGlicmFyeScnIGFuZCBhIGBgd29yayB0aGF0IHVzZXMgdGhlIGxpYnJhcnknJy4gIFRoZQpmb3JtZXIgY29udGFpbnMgY29kZSBkZXJpdmVkIGZyb20gdGhlIGxpYnJhcnksIHdoZXJlYXMgdGhlIGxhdHRlciBtdXN0CmJlIGNvbWJpbmVkIHdpdGggdGhlIGxpYnJhcnkgaW4gb3JkZXIgdG8gcnVuLgoKVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCgowLgpUaGlzIExpY2Vuc2UgQWdyZWVtZW50IGFwcGxpZXMgdG8gYW55IHNvZnR3YXJlIGxpYnJhcnkgb3Igb3RoZXIgcHJvZ3JhbQp3aGljaCBjb250YWlucyBhIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgb3Igb3RoZXIKYXV0aG9yaXplZCBwYXJ0eSBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzCkxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChhbHNvIGNhbGxlZCBgYHRoaXMgTGljZW5zZScnKS4gIEVhY2gKbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzIGBgeW91JycuCgogIEEgYGBsaWJyYXJ5JycgbWVhbnMgYSBjb2xsZWN0aW9uIG9mIHNvZnR3YXJlIGZ1bmN0aW9ucyBhbmQvb3IgZGF0YQpwcmVwYXJlZCBzbyBhcyB0byBiZSBjb252ZW5pZW50bHkgbGlua2VkIHdpdGggYXBwbGljYXRpb24gcHJvZ3JhbXMKKHdoaWNoIHVzZSBzb21lIG9mIHRob3NlIGZ1bmN0aW9ucyBhbmQgZGF0YSkgdG8gZm9ybSBleGVjdXRhYmxlcy4KCiAgVGhlIGBgTGlicmFyeScnLCBiZWxvdywgcmVmZXJzIHRvIGFueSBzdWNoIHNvZnR3YXJlIGxpYnJhcnkgb3Igd29yawp3aGljaCBoYXMgYmVlbiBkaXN0cmlidXRlZCB1bmRlciB0aGVzZSB0ZXJtcy4gIEEgYGB3b3JrIGJhc2VkIG9uIHRoZQpMaWJyYXJ5JycgbWVhbnMgZWl0aGVyIHRoZSBMaWJyYXJ5IG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIKY29weXJpZ2h0IGxhdzogdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBMaWJyYXJ5IG9yIGEKcG9ydGlvbiBvZiBpdCwgZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZApzdHJhaWdodGZvcndhcmRseSBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzCmluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbiB0aGUgdGVybSBgYG1vZGlmaWNhdGlvbicnLikKCiAgYGBTb3VyY2UgY29kZScnIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgptYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhIGxpYnJhcnksIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG1lYW5zCmFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueSBhc3NvY2lhdGVkCmludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8gY29udHJvbCBjb21waWxhdGlvbgphbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBsaWJyYXJ5LgoKICBBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdApjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCnJ1bm5pbmcgYSBwcm9ncmFtIHVzaW5nIHRoZSBMaWJyYXJ5IGlzIG5vdCByZXN0cmljdGVkLCBhbmQgb3V0cHV0IGZyb20Kc3VjaCBhIHByb2dyYW0gaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZApvbiB0aGUgTGlicmFyeSAoaW5kZXBlbmRlbnQgb2YgdGhlIHVzZSBvZiB0aGUgTGlicmFyeSBpbiBhIHRvb2wgZm9yCndyaXRpbmcgaXQpLiAgV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBMaWJyYXJ5IGRvZXMKYW5kIHdoYXQgdGhlIHByb2dyYW0gdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IGRvZXMuCgoxLgpZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBMaWJyYXJ5J3MKY29tcGxldGUgc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQKeW91IGNvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4KYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QKYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkKd2FycmFudHk7IGFuZCBkaXN0cmlidXRlIGEgY29weSBvZiB0aGlzIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUKTGlicmFyeS4KCiAgWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwKYW5kIHlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYQpmZWUuCgoyLgpZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBMaWJyYXJ5IG9yIGFueSBwb3J0aW9uCm9mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgY29weSBhbmQKZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCmFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CgphLiBUaGUgbW9kaWZpZWQgd29yayBtdXN0IGl0c2VsZiBiZSBhIHNvZnR3YXJlIGxpYnJhcnkuCgpiLiBZb3UgbXVzdCBjYXVzZSB0aGUgZmlsZXMgbW9kaWZpZWQgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KCmMuIFlvdSBtdXN0IGNhdXNlIHRoZSB3aG9sZSBvZiB0aGUgd29yayB0byBiZSBsaWNlbnNlZCBhdCBubwpjaGFyZ2UgdG8gYWxsIHRoaXJkIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KCmQuIElmIGEgZmFjaWxpdHkgaW4gdGhlIG1vZGlmaWVkIExpYnJhcnkgcmVmZXJzIHRvIGEgZnVuY3Rpb24gb3IgYQp0YWJsZSBvZiBkYXRhIHRvIGJlIHN1cHBsaWVkIGJ5IGFuIGFwcGxpY2F0aW9uIHByb2dyYW0gdGhhdCB1c2VzCnRoZSBmYWNpbGl0eSwgb3RoZXIgdGhhbiBhcyBhbiBhcmd1bWVudCBwYXNzZWQgd2hlbiB0aGUgZmFjaWxpdHkKaXMgaW52b2tlZCwgdGhlbiB5b3UgbXVzdCBtYWtlIGEgZ29vZCBmYWl0aCBlZmZvcnQgdG8gZW5zdXJlIHRoYXQsCmluIHRoZSBldmVudCBhbiBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgc3VjaCBmdW5jdGlvbiBvcgp0YWJsZSwgdGhlIGZhY2lsaXR5IHN0aWxsIG9wZXJhdGVzLCBhbmQgcGVyZm9ybXMgd2hhdGV2ZXIgcGFydCBvZgppdHMgcHVycG9zZSByZW1haW5zIG1lYW5pbmdmdWwuCgooRm9yIGV4YW1wbGUsIGEgZnVuY3Rpb24gaW4gYSBsaWJyYXJ5IHRvIGNvbXB1dGUgc3F1YXJlIHJvb3RzIGhhcwphIHB1cnBvc2UgdGhhdCBpcyBlbnRpcmVseSB3ZWxsLWRlZmluZWQgaW5kZXBlbmRlbnQgb2YgdGhlCmFwcGxpY2F0aW9uLiAgVGhlcmVmb3JlLCBTdWJzZWN0aW9uIDJkIHJlcXVpcmVzIHRoYXQgYW55CmFwcGxpY2F0aW9uLXN1cHBsaWVkIGZ1bmN0aW9uIG9yIHRhYmxlIHVzZWQgYnkgdGhpcyBmdW5jdGlvbiBtdXN0CmJlIG9wdGlvbmFsOiBpZiB0aGUgYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IGl0LCB0aGUgc3F1YXJlCnJvb3QgZnVuY3Rpb24gbXVzdCBzdGlsbCBjb21wdXRlIHNxdWFyZSByb290cy4pCkBlbmQgZW51bWVyYXRlCgpUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCmlkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIExpYnJhcnksCmFuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgp0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCnNlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQpkaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKb24gdGhlIExpYnJhcnksIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCnRoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCmVudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZQppdC4KClRodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAp5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCmNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIExpYnJhcnkuCgpJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBMaWJyYXJ5CndpdGggdGhlIExpYnJhcnkgKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5KSBvbiBhIHZvbHVtZSBvZgphIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgp0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgoKMy4KWW91IG1heSBvcHQgdG8gYXBwbHkgdGhlIHRlcm1zIG9mIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMKTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZSB0byBhIGdpdmVuIGNvcHkgb2YgdGhlIExpYnJhcnkuICBUbyBkbwp0aGlzLCB5b3UgbXVzdCBhbHRlciBhbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UsIHNvCnRoYXQgdGhleSByZWZlciB0byB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwKaW5zdGVhZCBvZiB0byB0aGlzIExpY2Vuc2UuICAoSWYgYSBuZXdlciB2ZXJzaW9uIHRoYW4gdmVyc2lvbiAyIG9mIHRoZQpvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBoYXMgYXBwZWFyZWQsIHRoZW4geW91IGNhbiBzcGVjaWZ5CnRoYXQgdmVyc2lvbiBpbnN0ZWFkIGlmIHlvdSB3aXNoLikgIERvIG5vdCBtYWtlIGFueSBvdGhlciBjaGFuZ2UgaW4KdGhlc2Ugbm90aWNlcy4KCiAgT25jZSB0aGlzIGNoYW5nZSBpcyBtYWRlIGluIGEgZ2l2ZW4gY29weSwgaXQgaXMgaXJyZXZlcnNpYmxlIGZvcgp0aGF0IGNvcHksIHNvIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIGFsbApzdWJzZXF1ZW50IGNvcGllcyBhbmQgZGVyaXZhdGl2ZSB3b3JrcyBtYWRlIGZyb20gdGhhdCBjb3B5LgoKICBUaGlzIG9wdGlvbiBpcyB1c2VmdWwgd2hlbiB5b3Ugd2lzaCB0byBjb3B5IHBhcnQgb2YgdGhlIGNvZGUgb2YKdGhlIExpYnJhcnkgaW50byBhIHByb2dyYW0gdGhhdCBpcyBub3QgYSBsaWJyYXJ5LgoKNC4KWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IChvciBhIHBvcnRpb24gb3IKZGVyaXZhdGl2ZSBvZiBpdCwgdW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0KdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWNjb21wYW55Cml0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSwgd2hpY2gKbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhCm1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZS4KCiAgSWYgZGlzdHJpYnV0aW9uIG9mIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIHRvIGNvcHkKZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUKc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBzYXRpc2ZpZXMgdGhlIHJlcXVpcmVtZW50IHRvCmRpc3RyaWJ1dGUgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KCjUuCkEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIG5vIGRlcml2YXRpdmUgb2YgYW55IHBvcnRpb24gb2YgdGhlCkxpYnJhcnksIGJ1dCBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGggdGhlIExpYnJhcnkgYnkgYmVpbmcgY29tcGlsZWQgb3IKbGlua2VkIHdpdGggaXQsIGlzIGNhbGxlZCBhIGBgd29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnknJy4gIFN1Y2ggYQp3b3JrLCBpbiBpc29sYXRpb24sIGlzIG5vdCBhIGRlcml2YXRpdmUgd29yayBvZiB0aGUgTGlicmFyeSwgYW5kCnRoZXJlZm9yZSBmYWxscyBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCgogIEhvd2V2ZXIsIGxpbmtpbmcgYSBgYHdvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5Jycgd2l0aCB0aGUgTGlicmFyeQpjcmVhdGVzIGFuIGV4ZWN1dGFibGUgdGhhdCBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIExpYnJhcnkgKGJlY2F1c2UgaXQKY29udGFpbnMgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnkpLCByYXRoZXIgdGhhbiBhIGBgd29yayB0aGF0IHVzZXMgdGhlCmxpYnJhcnknJy4gIFRoZSBleGVjdXRhYmxlIGlzIHRoZXJlZm9yZSBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZS4KU2VjdGlvbiA2IHN0YXRlcyB0ZXJtcyBmb3IgZGlzdHJpYnV0aW9uIG9mIHN1Y2ggZXhlY3V0YWJsZXMuCgogIFdoZW4gYSBgYHdvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5JycgdXNlcyBtYXRlcmlhbCBmcm9tIGEgaGVhZGVyIGZpbGUKdGhhdCBpcyBwYXJ0IG9mIHRoZSBMaWJyYXJ5LCB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIG1heSBiZSBhCmRlcml2YXRpdmUgd29yayBvZiB0aGUgTGlicmFyeSBldmVuIHRob3VnaCB0aGUgc291cmNlIGNvZGUgaXMgbm90LgpXaGV0aGVyIHRoaXMgaXMgdHJ1ZSBpcyBlc3BlY2lhbGx5IHNpZ25pZmljYW50IGlmIHRoZSB3b3JrIGNhbiBiZQpsaW5rZWQgd2l0aG91dCB0aGUgTGlicmFyeSwgb3IgaWYgdGhlIHdvcmsgaXMgaXRzZWxmIGEgbGlicmFyeS4gIFRoZQp0aHJlc2hvbGQgZm9yIHRoaXMgdG8gYmUgdHJ1ZSBpcyBub3QgcHJlY2lzZWx5IGRlZmluZWQgYnkgbGF3LgoKICBJZiBzdWNoIGFuIG9iamVjdCBmaWxlIHVzZXMgb25seSBudW1lcmljYWwgcGFyYW1ldGVycywgZGF0YQpzdHJ1Y3R1cmUgbGF5b3V0cyBhbmQgYWNjZXNzb3JzLCBhbmQgc21hbGwgbWFjcm9zIGFuZCBzbWFsbCBpbmxpbmUKZnVuY3Rpb25zICh0ZW4gbGluZXMgb3IgbGVzcyBpbiBsZW5ndGgpLCB0aGVuIHRoZSB1c2Ugb2YgdGhlIG9iamVjdApmaWxlIGlzIHVucmVzdHJpY3RlZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIGxlZ2FsbHkgYSBkZXJpdmF0aXZlCndvcmsuICAoRXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGlzIG9iamVjdCBjb2RlIHBsdXMgcG9ydGlvbnMgb2YgdGhlCkxpYnJhcnkgd2lsbCBzdGlsbCBmYWxsIHVuZGVyIFNlY3Rpb24gNi4pCgogIE90aGVyd2lzZSwgaWYgdGhlIHdvcmsgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5LCB5b3UgbWF5CmRpc3RyaWJ1dGUgdGhlIG9iamVjdCBjb2RlIGZvciB0aGUgd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiA2LgpBbnkgZXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGF0IHdvcmsgYWxzbyBmYWxsIHVuZGVyIFNlY3Rpb24gNiwKd2hldGhlciBvciBub3QgdGhleSBhcmUgbGlua2VkIGRpcmVjdGx5IHdpdGggdGhlIExpYnJhcnkgaXRzZWxmLgoKNi4KQXMgYW4gZXhjZXB0aW9uIHRvIHRoZSBTZWN0aW9ucyBhYm92ZSwgeW91IG1heSBhbHNvIGNvbWJpbmUgb3IKbGluayBhIGBgd29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnknJyB3aXRoIHRoZSBMaWJyYXJ5IHRvIHByb2R1Y2UgYQp3b3JrIGNvbnRhaW5pbmcgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnksIGFuZCBkaXN0cmlidXRlIHRoYXQgd29yawp1bmRlciB0ZXJtcyBvZiB5b3VyIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB0aGUgdGVybXMgcGVybWl0Cm1vZGlmaWNhdGlvbiBvZiB0aGUgd29yayBmb3IgdGhlIGN1c3RvbWVyJ3Mgb3duIHVzZSBhbmQgcmV2ZXJzZQplbmdpbmVlcmluZyBmb3IgZGVidWdnaW5nIHN1Y2ggbW9kaWZpY2F0aW9ucy4KCiAgWW91IG11c3QgZ2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggZWFjaCBjb3B5IG9mIHRoZSB3b3JrIHRoYXQgdGhlCkxpYnJhcnkgaXMgdXNlZCBpbiBpdCBhbmQgdGhhdCB0aGUgTGlicmFyeSBhbmQgaXRzIHVzZSBhcmUgY292ZXJlZCBieQp0aGlzIExpY2Vuc2UuICBZb3UgbXVzdCBzdXBwbHkgYSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIElmIHRoZSB3b3JrCmR1cmluZyBleGVjdXRpb24gZGlzcGxheXMgY29weXJpZ2h0IG5vdGljZXMsIHlvdSBtdXN0IGluY2x1ZGUgdGhlCmNvcHlyaWdodCBub3RpY2UgZm9yIHRoZSBMaWJyYXJ5IGFtb25nIHRoZW0sIGFzIHdlbGwgYXMgYSByZWZlcmVuY2UKZGlyZWN0aW5nIHRoZSB1c2VyIHRvIHRoZSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIEFsc28sIHlvdSBtdXN0IGRvIG9uZQpvZiB0aGVzZSB0aGluZ3M6CgphLiBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZwptYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlIGZvciB0aGUgTGlicmFyeSBpbmNsdWRpbmcgd2hhdGV2ZXIKY2hhbmdlcyB3ZXJlIHVzZWQgaW4gdGhlIHdvcmsgKHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIKU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSk7IGFuZCwgaWYgdGhlIHdvcmsgaXMgYW4gZXhlY3V0YWJsZSBsaW5rZWQKd2l0aCB0aGUgTGlicmFyeSwgd2l0aCB0aGUgY29tcGxldGUgbWFjaGluZS1yZWFkYWJsZSBgYHdvcmsgdGhhdAp1c2VzIHRoZSBMaWJyYXJ5JycsIGFzIG9iamVjdCBjb2RlIGFuZC9vciBzb3VyY2UgY29kZSwgc28gdGhhdCB0aGUKdXNlciBjYW4gbW9kaWZ5IHRoZSBMaWJyYXJ5IGFuZCB0aGVuIHJlbGluayB0byBwcm9kdWNlIGEgbW9kaWZpZWQKZXhlY3V0YWJsZSBjb250YWluaW5nIHRoZSBtb2RpZmllZCBMaWJyYXJ5LiAgKEl0IGlzIHVuZGVyc3Rvb2QKdGhhdCB0aGUgdXNlciB3aG8gY2hhbmdlcyB0aGUgY29udGVudHMgb2YgZGVmaW5pdGlvbnMgZmlsZXMgaW4gdGhlCkxpYnJhcnkgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUgYWJsZSB0byByZWNvbXBpbGUgdGhlIGFwcGxpY2F0aW9uCnRvIHVzZSB0aGUgbW9kaWZpZWQgZGVmaW5pdGlvbnMuKQoKYi4gVXNlIGEgc3VpdGFibGUgc2hhcmVkIGxpYnJhcnkgbWVjaGFuaXNtIGZvciBsaW5raW5nIHdpdGggdGhlIExpYnJhcnkuICBBCnN1aXRhYmxlIG1lY2hhbmlzbSBpcyBvbmUgdGhhdCAoMSkgdXNlcyBhdCBydW4gdGltZSBhIGNvcHkgb2YgdGhlCmxpYnJhcnkgYWxyZWFkeSBwcmVzZW50IG9uIHRoZSB1c2VyJ3MgY29tcHV0ZXIgc3lzdGVtLCByYXRoZXIgdGhhbgpjb3B5aW5nIGxpYnJhcnkgZnVuY3Rpb25zIGludG8gdGhlIGV4ZWN1dGFibGUsIGFuZCAoMikgd2lsbCBvcGVyYXRlCnByb3Blcmx5IHdpdGggYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCBpZiB0aGUgdXNlciBpbnN0YWxscwpvbmUsIGFzIGxvbmcgYXMgdGhlIG1vZGlmaWVkIHZlcnNpb24gaXMgaW50ZXJmYWNlLWNvbXBhdGlibGUgd2l0aCB0aGUKdmVyc2lvbiB0aGF0IHRoZSB3b3JrIHdhcyBtYWRlIHdpdGguCgpjLiBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdApsZWFzdCB0aHJlZSB5ZWFycywgdG8gZ2l2ZSB0aGUgc2FtZSB1c2VyIHRoZSBtYXRlcmlhbHMKc3BlY2lmaWVkIGluIFN1YnNlY3Rpb24gNmEsIGFib3ZlLCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZQp0aGFuIHRoZSBjb3N0IG9mIHBlcmZvcm1pbmcgdGhpcyBkaXN0cmlidXRpb24uCgpkLiBJZiBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQpmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgb2ZmZXIgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUgYWJvdmUKc3BlY2lmaWVkIG1hdGVyaWFscyBmcm9tIHRoZSBzYW1lIHBsYWNlLgoKZS4gVmVyaWZ5IHRoYXQgdGhlIHVzZXIgaGFzIGFscmVhZHkgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZXNlCm1hdGVyaWFscyBvciB0aGF0IHlvdSBoYXZlIGFscmVhZHkgc2VudCB0aGlzIHVzZXIgYSBjb3B5LgpAZW5kIGVudW1lcmF0ZQoKICBGb3IgYW4gZXhlY3V0YWJsZSwgdGhlIHJlcXVpcmVkIGZvcm0gb2YgdGhlIGBgd29yayB0aGF0IHVzZXMgdGhlCkxpYnJhcnknJyBtdXN0IGluY2x1ZGUgYW55IGRhdGEgYW5kIHV0aWxpdHkgcHJvZ3JhbXMgbmVlZGVkIGZvcgpyZXByb2R1Y2luZyB0aGUgZXhlY3V0YWJsZSBmcm9tIGl0LiAgSG93ZXZlciwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwKdGhlIG1hdGVyaWFscyB0byBiZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlIGFueXRoaW5nIHRoYXQgaXMKbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5IGZvcm0pIHdpdGggdGhlIG1ham9yCmNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gb24Kd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50IGl0c2VsZiBhY2NvbXBhbmllcyB0aGUKZXhlY3V0YWJsZS4KCiAgSXQgbWF5IGhhcHBlbiB0aGF0IHRoaXMgcmVxdWlyZW1lbnQgY29udHJhZGljdHMgdGhlIGxpY2Vuc2UKcmVzdHJpY3Rpb25zIG9mIG90aGVyIHByb3ByaWV0YXJ5IGxpYnJhcmllcyB0aGF0IGRvIG5vdCBub3JtYWxseQphY2NvbXBhbnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0uICBTdWNoIGEgY29udHJhZGljdGlvbiBtZWFucyB5b3UgY2Fubm90CnVzZSBib3RoIHRoZW0gYW5kIHRoZSBMaWJyYXJ5IHRvZ2V0aGVyIGluIGFuIGV4ZWN1dGFibGUgdGhhdCB5b3UKZGlzdHJpYnV0ZS4KCjcuCllvdSBtYXkgcGxhY2UgbGlicmFyeSBmYWNpbGl0aWVzIHRoYXQgYXJlIGEgd29yayBiYXNlZCBvbiB0aGUKTGlicmFyeSBzaWRlLWJ5LXNpZGUgaW4gYSBzaW5nbGUgbGlicmFyeSB0b2dldGhlciB3aXRoIG90aGVyIGxpYnJhcnkKZmFjaWxpdGllcyBub3QgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHN1Y2ggYSBjb21iaW5lZApsaWJyYXJ5LCBwcm92aWRlZCB0aGF0IHRoZSBzZXBhcmF0ZSBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgYmFzZWQgb24KdGhlIExpYnJhcnkgYW5kIG9mIHRoZSBvdGhlciBsaWJyYXJ5IGZhY2lsaXRpZXMgaXMgb3RoZXJ3aXNlCnBlcm1pdHRlZCwgYW5kIHByb3ZpZGVkIHRoYXQgeW91IGRvIHRoZXNlIHR3byB0aGluZ3M6CgphLiBBY2NvbXBhbnkgdGhlIGNvbWJpbmVkIGxpYnJhcnkgd2l0aCBhIGNvcHkgb2YgdGhlIHNhbWUgd29yawpiYXNlZCBvbiB0aGUgTGlicmFyeSwgdW5jb21iaW5lZCB3aXRoIGFueSBvdGhlciBsaWJyYXJ5CmZhY2lsaXRpZXMuICBUaGlzIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQpTZWN0aW9ucyBhYm92ZS4KCmIuIEdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIHRoZSBjb21iaW5lZCBsaWJyYXJ5IG9mIHRoZSBmYWN0CnRoYXQgcGFydCBvZiBpdCBpcyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBleHBsYWluaW5nCndoZXJlIHRvIGZpbmQgdGhlIGFjY29tcGFueWluZyB1bmNvbWJpbmVkIGZvcm0gb2YgdGhlIHNhbWUgd29yay4KCjguCllvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvciBkaXN0cmlidXRlCnRoZSBMaWJyYXJ5IGV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55CmF0dGVtcHQgb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvcgpkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGlzIHZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIKcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4gIEhvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLApvciByaWdodHMsIGZyb20geW91IHVuZGVyIHRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzCnRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoIHBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KCjkuCllvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdApzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgpkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQptb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKTGlicmFyeSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwp0aGUgTGlicmFyeSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KCjEwLgpFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCkxpYnJhcnkpLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCm9yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUsIGxpbmsgd2l0aCBvciBtb2RpZnkgdGhlIExpYnJhcnkKc3ViamVjdCB0byB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgpyZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCllvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHdpdGgKdGhpcyBMaWNlbnNlLgoKMTEuCklmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKaW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgpvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CmV4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90CmRpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQptYXkgbm90IGRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50CmxpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIExpYnJhcnkgYnkKYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCnRoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeS4KCklmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhbnkKcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvIGFwcGx5LAphbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlciBjaXJjdW1zdGFuY2VzLgoKSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQpwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQpzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCmludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtIHdoaWNoIGlzCmltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQpnZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCnRocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0CnN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKdG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90CmltcG9zZSB0aGF0IGNob2ljZS4KClRoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bwpiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KCjEyLgpJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIExpYnJhcnkgaXMgcmVzdHJpY3RlZCBpbgpjZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBMaWJyYXJ5IHVuZGVyIHRoaXMgTGljZW5zZSBtYXkgYWRkCmFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcgdGhvc2UgY291bnRyaWVzLApzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZyBjb3VudHJpZXMgbm90IHRodXMKZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMgdGhlIGxpbWl0YXRpb24gYXMgaWYKd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCgoxMy4KVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcKdmVyc2lvbnMgb2YgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLgpTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsIGJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sCmJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0byBhZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KCkVhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIExpYnJhcnkKc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kCmBgYW55IGxhdGVyIHZlcnNpb24nJywgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZApjb25kaXRpb25zIGVpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5CnRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgTGlicmFyeSBkb2VzIG5vdCBzcGVjaWZ5IGEKbGljZW5zZSB2ZXJzaW9uIG51bWJlciwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkKdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KCjE0LgpJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgTGlicmFyeSBpbnRvIG90aGVyIGZyZWUKcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGluY29tcGF0aWJsZSB3aXRoIHRoZXNlLAp3cml0ZSB0byB0aGUgYXV0aG9yIHRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcwpjb3B5cmlnaHRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZQpTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMgbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyCmRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMgb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMKb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZCBvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcKYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KCk5PIFdBUlJBTlRZCgoxNS4KQkVDQVVTRSBUSEUgTElCUkFSWSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8KV0FSUkFOVFkgRk9SIFRIRSBMSUJSQVJZLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4KRVhDRVBUIFdIRU4gT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IKT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRSBMSUJSQVJZIGBgQVMgSVMnJyBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWQpLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSClBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRQpMSUJSQVJZIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRSBMSUJSQVJZIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRQpUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCgoxNi4KSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTgpXUklUSU5HIFdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWQpBTkQvT1IgUkVESVNUUklCVVRFIFRIRSBMSUJSQVJZIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVQpGT1IgREFNQUdFUywgSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SCkNPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFCkxJQlJBUlkgKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcKUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZIFlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEKRkFJTFVSRSBPRiBUSEUgTElCUkFSWSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSIFNPRlRXQVJFKSwgRVZFTiBJRgpTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICkRBTUFHRVMuCgpFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKCkhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBMaWJyYXJpZXMKCiAgSWYgeW91IGRldmVsb3AgYSBuZXcgbGlicmFyeSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdApwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgd2UgcmVjb21tZW5kIG1ha2luZyBpdCBmcmVlIHNvZnR3YXJlIHRoYXQKZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlLiAgWW91IGNhbiBkbyBzbyBieSBwZXJtaXR0aW5nCnJlZGlzdHJpYnV0aW9uIHVuZGVyIHRoZXNlIHRlcm1zIChvciwgYWx0ZXJuYXRpdmVseSwgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQpvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlKS4KCiAgVG8gYXBwbHkgdGhlc2UgdGVybXMsIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIGxpYnJhcnkuICBJdCBpcwpzYWZlc3QgdG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQpjb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdCB0aGUKYGBjb3B5cmlnaHQnJyBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgoKICAgIG9uZSBsaW5lIHRvIGdpdmUgdGhlIGxpYnJhcnkncyBuYW1lIGFuZCBhbiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4KICAgIENvcHlyaWdodCAoQykgeWVhciBuYW1lIG9mIGF1dGhvcgoKICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CiAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAogICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKICAgIFVTQS4KCkFsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgoKWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSBgYGNvcHlyaWdodCBkaXNjbGFpbWVyJycgZm9yIHRoZSBsaWJyYXJ5LCBpZgpuZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6CgogICAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUgbGlicmFyeQogICAgYEZyb2InIChhIGxpYnJhcnkgZm9yIHR3ZWFraW5nIGtub2JzKSB3cml0dGVuIGJ5IEphbWVzIFJhbmRvbSBIYWNrZXIuCgogICAgc2lnbmF0dXJlIG9mIFR5IENvb24sIDEgQXByaWwgMTk5MAogICAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKClRoYXQncyBhbGwgdGhlcmUgaXMgdG8gaXQhCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpHTlUgRnJlZSBEb2N1bWVudGF0aW9uIExpY2Vuc2UKClZlcnNpb24gMS4xLCBNYXJjaCAyMDAwCgpDb3B5cmlnaHQgQGNvcHlyaWdodHt9IDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCjU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EKCkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwpvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KQGVuZCBkaXNwbGF5CgowLgpQUkVBTUJMRQoKVGhlIHB1cnBvc2Ugb2YgdGhpcyBMaWNlbnNlIGlzIHRvIG1ha2UgYSBtYW51YWwsIHRleHRib29rLCBvciBvdGhlcgp3cml0dGVuIGRvY3VtZW50IEBkZm57ZnJlZX0gaW4gdGhlIHNlbnNlIG9mIGZyZWVkb206IHRvIGFzc3VyZSBldmVyeW9uZQp0aGUgZWZmZWN0aXZlIGZyZWVkb20gdG8gY29weSBhbmQgcmVkaXN0cmlidXRlIGl0LCB3aXRoIG9yIHdpdGhvdXQKbW9kaWZ5aW5nIGl0LCBlaXRoZXIgY29tbWVyY2lhbGx5IG9yIG5vbmNvbW1lcmNpYWxseS4gIFNlY29uZGFyaWx5LAp0aGlzIExpY2Vuc2UgcHJlc2VydmVzIGZvciB0aGUgYXV0aG9yIGFuZCBwdWJsaXNoZXIgYSB3YXkgdG8gZ2V0CmNyZWRpdCBmb3IgdGhlaXIgd29yaywgd2hpbGUgbm90IGJlaW5nIGNvbnNpZGVyZWQgcmVzcG9uc2libGUgZm9yCm1vZGlmaWNhdGlvbnMgbWFkZSBieSBvdGhlcnMuCgpUaGlzIExpY2Vuc2UgaXMgYSBraW5kIG9mIGBgY29weWxlZnQnJywgd2hpY2ggbWVhbnMgdGhhdCBkZXJpdmF0aXZlCndvcmtzIG9mIHRoZSBkb2N1bWVudCBtdXN0IHRoZW1zZWx2ZXMgYmUgZnJlZSBpbiB0aGUgc2FtZSBzZW5zZS4gIEl0CmNvbXBsZW1lbnRzIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgd2hpY2ggaXMgYSBjb3B5bGVmdApsaWNlbnNlIGRlc2lnbmVkIGZvciBmcmVlIHNvZnR3YXJlLgoKV2UgaGF2ZSBkZXNpZ25lZCB0aGlzIExpY2Vuc2UgaW4gb3JkZXIgdG8gdXNlIGl0IGZvciBtYW51YWxzIGZvciBmcmVlCnNvZnR3YXJlLCBiZWNhdXNlIGZyZWUgc29mdHdhcmUgbmVlZHMgZnJlZSBkb2N1bWVudGF0aW9uOiBhIGZyZWUKcHJvZ3JhbSBzaG91bGQgY29tZSB3aXRoIG1hbnVhbHMgcHJvdmlkaW5nIHRoZSBzYW1lIGZyZWVkb21zIHRoYXQgdGhlCnNvZnR3YXJlIGRvZXMuICBCdXQgdGhpcyBMaWNlbnNlIGlzIG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIG1hbnVhbHM7Cml0IGNhbiBiZSB1c2VkIGZvciBhbnkgdGV4dHVhbCB3b3JrLCByZWdhcmRsZXNzIG9mIHN1YmplY3QgbWF0dGVyIG9yCndoZXRoZXIgaXQgaXMgcHVibGlzaGVkIGFzIGEgcHJpbnRlZCBib29rLiAgV2UgcmVjb21tZW5kIHRoaXMgTGljZW5zZQpwcmluY2lwYWxseSBmb3Igd29ya3Mgd2hvc2UgcHVycG9zZSBpcyBpbnN0cnVjdGlvbiBvciByZWZlcmVuY2UuCgoxLgpBUFBMSUNBQklMSVRZIEFORCBERUZJTklUSU9OUwoKVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IG1hbnVhbCBvciBvdGhlciB3b3JrIHRoYXQgY29udGFpbnMgYQpub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBjYW4gYmUgZGlzdHJpYnV0ZWQKdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4gIFRoZSBgYERvY3VtZW50JycsIGJlbG93LCByZWZlcnMgdG8gYW55CnN1Y2ggbWFudWFsIG9yIHdvcmsuICBBbnkgbWVtYmVyIG9mIHRoZSBwdWJsaWMgaXMgYSBsaWNlbnNlZSwgYW5kIGlzCmFkZHJlc3NlZCBhcyBgYHlvdScnLgoKQSBgYE1vZGlmaWVkIFZlcnNpb24nJyBvZiB0aGUgRG9jdW1lbnQgbWVhbnMgYW55IHdvcmsgY29udGFpbmluZyB0aGUKRG9jdW1lbnQgb3IgYSBwb3J0aW9uIG9mIGl0LCBlaXRoZXIgY29waWVkIHZlcmJhdGltLCBvciB3aXRoCm1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyIGxhbmd1YWdlLgoKQSBgYFNlY29uZGFyeSBTZWN0aW9uJycgaXMgYSBuYW1lZCBhcHBlbmRpeCBvciBhIGZyb250LW1hdHRlciBzZWN0aW9uIG9mCnRoZSBEb2N1bWVudCB0aGF0IGRlYWxzIGV4Y2x1c2l2ZWx5IHdpdGggdGhlIHJlbGF0aW9uc2hpcCBvZiB0aGUKcHVibGlzaGVycyBvciBhdXRob3JzIG9mIHRoZSBEb2N1bWVudCB0byB0aGUgRG9jdW1lbnQncyBvdmVyYWxsIHN1YmplY3QKKG9yIHRvIHJlbGF0ZWQgbWF0dGVycykgYW5kIGNvbnRhaW5zIG5vdGhpbmcgdGhhdCBjb3VsZCBmYWxsIGRpcmVjdGx5CndpdGhpbiB0aGF0IG92ZXJhbGwgc3ViamVjdC4gIChGb3IgZXhhbXBsZSwgaWYgdGhlIERvY3VtZW50IGlzIGluIHBhcnQgYQp0ZXh0Ym9vayBvZiBtYXRoZW1hdGljcywgYSBTZWNvbmRhcnkgU2VjdGlvbiBtYXkgbm90IGV4cGxhaW4gYW55Cm1hdGhlbWF0aWNzLikgIFRoZSByZWxhdGlvbnNoaXAgY291bGQgYmUgYSBtYXR0ZXIgb2YgaGlzdG9yaWNhbApjb25uZWN0aW9uIHdpdGggdGhlIHN1YmplY3Qgb3Igd2l0aCByZWxhdGVkIG1hdHRlcnMsIG9yIG9mIGxlZ2FsLApjb21tZXJjaWFsLCBwaGlsb3NvcGhpY2FsLCBldGhpY2FsIG9yIHBvbGl0aWNhbCBwb3NpdGlvbiByZWdhcmRpbmcKdGhlbS4KClRoZSBgYEludmFyaWFudCBTZWN0aW9ucycnIGFyZSBjZXJ0YWluIFNlY29uZGFyeSBTZWN0aW9ucyB3aG9zZSB0aXRsZXMKYXJlIGRlc2lnbmF0ZWQsIGFzIGJlaW5nIHRob3NlIG9mIEludmFyaWFudCBTZWN0aW9ucywgaW4gdGhlIG5vdGljZQp0aGF0IHNheXMgdGhhdCB0aGUgRG9jdW1lbnQgaXMgcmVsZWFzZWQgdW5kZXIgdGhpcyBMaWNlbnNlLgoKVGhlIGBgQ292ZXIgVGV4dHMnJyBhcmUgY2VydGFpbiBzaG9ydCBwYXNzYWdlcyBvZiB0ZXh0IHRoYXQgYXJlIGxpc3RlZCwKYXMgRnJvbnQtQ292ZXIgVGV4dHMgb3IgQmFjay1Db3ZlciBUZXh0cywgaW4gdGhlIG5vdGljZSB0aGF0IHNheXMgdGhhdAp0aGUgRG9jdW1lbnQgaXMgcmVsZWFzZWQgdW5kZXIgdGhpcyBMaWNlbnNlLgoKQSBgYFRyYW5zcGFyZW50JycgY29weSBvZiB0aGUgRG9jdW1lbnQgbWVhbnMgYSBtYWNoaW5lLXJlYWRhYmxlIGNvcHksCnJlcHJlc2VudGVkIGluIGEgZm9ybWF0IHdob3NlIHNwZWNpZmljYXRpb24gaXMgYXZhaWxhYmxlIHRvIHRoZQpnZW5lcmFsIHB1YmxpYywgd2hvc2UgY29udGVudHMgY2FuIGJlIHZpZXdlZCBhbmQgZWRpdGVkIGRpcmVjdGx5IGFuZApzdHJhaWdodGZvcndhcmRseSB3aXRoIGdlbmVyaWMgdGV4dCBlZGl0b3JzIG9yIChmb3IgaW1hZ2VzIGNvbXBvc2VkIG9mCnBpeGVscykgZ2VuZXJpYyBwYWludCBwcm9ncmFtcyBvciAoZm9yIGRyYXdpbmdzKSBzb21lIHdpZGVseSBhdmFpbGFibGUKZHJhd2luZyBlZGl0b3IsIGFuZCB0aGF0IGlzIHN1aXRhYmxlIGZvciBpbnB1dCB0byB0ZXh0IGZvcm1hdHRlcnMgb3IKZm9yIGF1dG9tYXRpYyB0cmFuc2xhdGlvbiB0byBhIHZhcmlldHkgb2YgZm9ybWF0cyBzdWl0YWJsZSBmb3IgaW5wdXQKdG8gdGV4dCBmb3JtYXR0ZXJzLiAgQSBjb3B5IG1hZGUgaW4gYW4gb3RoZXJ3aXNlIFRyYW5zcGFyZW50IGZpbGUKZm9ybWF0IHdob3NlIG1hcmt1cCBoYXMgYmVlbiBkZXNpZ25lZCB0byB0aHdhcnQgb3IgZGlzY291cmFnZQpzdWJzZXF1ZW50IG1vZGlmaWNhdGlvbiBieSByZWFkZXJzIGlzIG5vdCBUcmFuc3BhcmVudC4gIEEgY29weSB0aGF0IGlzCm5vdCBgYFRyYW5zcGFyZW50JycgaXMgY2FsbGVkIGBgT3BhcXVlJycuCgpFeGFtcGxlcyBvZiBzdWl0YWJsZSBmb3JtYXRzIGZvciBUcmFuc3BhcmVudCBjb3BpZXMgaW5jbHVkZSBwbGFpbgpAc2N7YXNjaWl9IHdpdGhvdXQgbWFya3VwLCBUZXhpbmZvIGlucHV0IGZvcm1hdCwgTGFAVGVYe30gaW5wdXQgZm9ybWF0LApAYWNyb255bXtTR01MfSBvciBAYWNyb255bXtYTUx9IHVzaW5nIGEgcHVibGljbHkgYXZhaWxhYmxlCkBhY3Jvbnlte0RURH0sIGFuZCBzdGFuZGFyZC1jb25mb3JtaW5nIHNpbXBsZSBAYWNyb255bXtIVE1MfSBkZXNpZ25lZApmb3IgaHVtYW4gbW9kaWZpY2F0aW9uLiAgT3BhcXVlIGZvcm1hdHMgaW5jbHVkZSBQb3N0U2NyaXB0LApAYWNyb255bXtQREZ9LCBwcm9wcmlldGFyeSBmb3JtYXRzIHRoYXQgY2FuIGJlIHJlYWQgYW5kIGVkaXRlZCBvbmx5IGJ5CnByb3ByaWV0YXJ5IHdvcmQgcHJvY2Vzc29ycywgQGFjcm9ueW17U0dNTH0gb3IgQGFjcm9ueW17WE1MfSBmb3Igd2hpY2gKdGhlIEBhY3Jvbnlte0RURH0gYW5kL29yIHByb2Nlc3NpbmcgdG9vbHMgYXJlIG5vdCBnZW5lcmFsbHkgYXZhaWxhYmxlLAphbmQgdGhlIG1hY2hpbmUtZ2VuZXJhdGVkIEBhY3Jvbnlte0hUTUx9IHByb2R1Y2VkIGJ5IHNvbWUgd29yZApwcm9jZXNzb3JzIGZvciBvdXRwdXQgcHVycG9zZXMgb25seS4KClRoZSBgYFRpdGxlIFBhZ2UnJyBtZWFucywgZm9yIGEgcHJpbnRlZCBib29rLCB0aGUgdGl0bGUgcGFnZSBpdHNlbGYsCnBsdXMgc3VjaCBmb2xsb3dpbmcgcGFnZXMgYXMgYXJlIG5lZWRlZCB0byBob2xkLCBsZWdpYmx5LCB0aGUgbWF0ZXJpYWwKdGhpcyBMaWNlbnNlIHJlcXVpcmVzIHRvIGFwcGVhciBpbiB0aGUgdGl0bGUgcGFnZS4gIEZvciB3b3JrcyBpbgpmb3JtYXRzIHdoaWNoIGRvIG5vdCBoYXZlIGFueSB0aXRsZSBwYWdlIGFzIHN1Y2gsIGBgVGl0bGUgUGFnZScnIG1lYW5zCnRoZSB0ZXh0IG5lYXIgdGhlIG1vc3QgcHJvbWluZW50IGFwcGVhcmFuY2Ugb2YgdGhlIHdvcmsncyB0aXRsZSwKcHJlY2VkaW5nIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJvZHkgb2YgdGhlIHRleHQuCgoyLgpWRVJCQVRJTSBDT1BZSU5HCgpZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIERvY3VtZW50IGluIGFueSBtZWRpdW0sIGVpdGhlcgpjb21tZXJjaWFsbHkgb3Igbm9uY29tbWVyY2lhbGx5LCBwcm92aWRlZCB0aGF0IHRoaXMgTGljZW5zZSwgdGhlCmNvcHlyaWdodCBub3RpY2VzLCBhbmQgdGhlIGxpY2Vuc2Ugbm90aWNlIHNheWluZyB0aGlzIExpY2Vuc2UgYXBwbGllcwp0byB0aGUgRG9jdW1lbnQgYXJlIHJlcHJvZHVjZWQgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgeW91IGFkZCBubyBvdGhlcgpjb25kaXRpb25zIHdoYXRzb2V2ZXIgdG8gdGhvc2Ugb2YgdGhpcyBMaWNlbnNlLiAgWW91IG1heSBub3QgdXNlCnRlY2huaWNhbCBtZWFzdXJlcyB0byBvYnN0cnVjdCBvciBjb250cm9sIHRoZSByZWFkaW5nIG9yIGZ1cnRoZXIKY29weWluZyBvZiB0aGUgY29waWVzIHlvdSBtYWtlIG9yIGRpc3RyaWJ1dGUuICBIb3dldmVyLCB5b3UgbWF5IGFjY2VwdApjb21wZW5zYXRpb24gaW4gZXhjaGFuZ2UgZm9yIGNvcGllcy4gIElmIHlvdSBkaXN0cmlidXRlIGEgbGFyZ2UgZW5vdWdoCm51bWJlciBvZiBjb3BpZXMgeW91IG11c3QgYWxzbyBmb2xsb3cgdGhlIGNvbmRpdGlvbnMgaW4gc2VjdGlvbiAzLgoKWW91IG1heSBhbHNvIGxlbmQgY29waWVzLCB1bmRlciB0aGUgc2FtZSBjb25kaXRpb25zIHN0YXRlZCBhYm92ZSwgYW5kCnlvdSBtYXkgcHVibGljbHkgZGlzcGxheSBjb3BpZXMuCgozLgpDT1BZSU5HIElOIFFVQU5USVRZCgpJZiB5b3UgcHVibGlzaCBwcmludGVkIGNvcGllcyBvZiB0aGUgRG9jdW1lbnQgbnVtYmVyaW5nIG1vcmUgdGhhbiAxMDAsCmFuZCB0aGUgRG9jdW1lbnQncyBsaWNlbnNlIG5vdGljZSByZXF1aXJlcyBDb3ZlciBUZXh0cywgeW91IG11c3QgZW5jbG9zZQp0aGUgY29waWVzIGluIGNvdmVycyB0aGF0IGNhcnJ5LCBjbGVhcmx5IGFuZCBsZWdpYmx5LCBhbGwgdGhlc2UgQ292ZXIKVGV4dHM6IEZyb250LUNvdmVyIFRleHRzIG9uIHRoZSBmcm9udCBjb3ZlciwgYW5kIEJhY2stQ292ZXIgVGV4dHMgb24KdGhlIGJhY2sgY292ZXIuICBCb3RoIGNvdmVycyBtdXN0IGFsc28gY2xlYXJseSBhbmQgbGVnaWJseSBpZGVudGlmeQp5b3UgYXMgdGhlIHB1Ymxpc2hlciBvZiB0aGVzZSBjb3BpZXMuICBUaGUgZnJvbnQgY292ZXIgbXVzdCBwcmVzZW50CnRoZSBmdWxsIHRpdGxlIHdpdGggYWxsIHdvcmRzIG9mIHRoZSB0aXRsZSBlcXVhbGx5IHByb21pbmVudCBhbmQKdmlzaWJsZS4gIFlvdSBtYXkgYWRkIG90aGVyIG1hdGVyaWFsIG9uIHRoZSBjb3ZlcnMgaW4gYWRkaXRpb24uCkNvcHlpbmcgd2l0aCBjaGFuZ2VzIGxpbWl0ZWQgdG8gdGhlIGNvdmVycywgYXMgbG9uZyBhcyB0aGV5IHByZXNlcnZlCnRoZSB0aXRsZSBvZiB0aGUgRG9jdW1lbnQgYW5kIHNhdGlzZnkgdGhlc2UgY29uZGl0aW9ucywgY2FuIGJlIHRyZWF0ZWQKYXMgdmVyYmF0aW0gY29weWluZyBpbiBvdGhlciByZXNwZWN0cy4KCklmIHRoZSByZXF1aXJlZCB0ZXh0cyBmb3IgZWl0aGVyIGNvdmVyIGFyZSB0b28gdm9sdW1pbm91cyB0byBmaXQKbGVnaWJseSwgeW91IHNob3VsZCBwdXQgdGhlIGZpcnN0IG9uZXMgbGlzdGVkIChhcyBtYW55IGFzIGZpdApyZWFzb25hYmx5KSBvbiB0aGUgYWN0dWFsIGNvdmVyLCBhbmQgY29udGludWUgdGhlIHJlc3Qgb250byBhZGphY2VudApwYWdlcy4KCklmIHlvdSBwdWJsaXNoIG9yIGRpc3RyaWJ1dGUgT3BhcXVlIGNvcGllcyBvZiB0aGUgRG9jdW1lbnQgbnVtYmVyaW5nCm1vcmUgdGhhbiAxMDAsIHlvdSBtdXN0IGVpdGhlciBpbmNsdWRlIGEgbWFjaGluZS1yZWFkYWJsZSBUcmFuc3BhcmVudApjb3B5IGFsb25nIHdpdGggZWFjaCBPcGFxdWUgY29weSwgb3Igc3RhdGUgaW4gb3Igd2l0aCBlYWNoIE9wYXF1ZSBjb3B5CmEgcHVibGljbHktYWNjZXNzaWJsZSBjb21wdXRlci1uZXR3b3JrIGxvY2F0aW9uIGNvbnRhaW5pbmcgYSBjb21wbGV0ZQpUcmFuc3BhcmVudCBjb3B5IG9mIHRoZSBEb2N1bWVudCwgZnJlZSBvZiBhZGRlZCBtYXRlcmlhbCwgd2hpY2ggdGhlCmdlbmVyYWwgbmV0d29yay11c2luZyBwdWJsaWMgaGFzIGFjY2VzcyB0byBkb3dubG9hZCBhbm9ueW1vdXNseSBhdCBubwpjaGFyZ2UgdXNpbmcgcHVibGljLXN0YW5kYXJkIG5ldHdvcmsgcHJvdG9jb2xzLiAgSWYgeW91IHVzZSB0aGUgbGF0dGVyCm9wdGlvbiwgeW91IG11c3QgdGFrZSByZWFzb25hYmx5IHBydWRlbnQgc3RlcHMsIHdoZW4geW91IGJlZ2luCmRpc3RyaWJ1dGlvbiBvZiBPcGFxdWUgY29waWVzIGluIHF1YW50aXR5LCB0byBlbnN1cmUgdGhhdCB0aGlzClRyYW5zcGFyZW50IGNvcHkgd2lsbCByZW1haW4gdGh1cyBhY2Nlc3NpYmxlIGF0IHRoZSBzdGF0ZWQgbG9jYXRpb24KdW50aWwgYXQgbGVhc3Qgb25lIHllYXIgYWZ0ZXIgdGhlIGxhc3QgdGltZSB5b3UgZGlzdHJpYnV0ZSBhbiBPcGFxdWUKY29weSAoZGlyZWN0bHkgb3IgdGhyb3VnaCB5b3VyIGFnZW50cyBvciByZXRhaWxlcnMpIG9mIHRoYXQgZWRpdGlvbiB0bwp0aGUgcHVibGljLgoKSXQgaXMgcmVxdWVzdGVkLCBidXQgbm90IHJlcXVpcmVkLCB0aGF0IHlvdSBjb250YWN0IHRoZSBhdXRob3JzIG9mIHRoZQpEb2N1bWVudCB3ZWxsIGJlZm9yZSByZWRpc3RyaWJ1dGluZyBhbnkgbGFyZ2UgbnVtYmVyIG9mIGNvcGllcywgdG8gZ2l2ZQp0aGVtIGEgY2hhbmNlIHRvIHByb3ZpZGUgeW91IHdpdGggYW4gdXBkYXRlZCB2ZXJzaW9uIG9mIHRoZSBEb2N1bWVudC4KCjQuCk1PRElGSUNBVElPTlMKCllvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSBhIE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIERvY3VtZW50IHVuZGVyCnRoZSBjb25kaXRpb25zIG9mIHNlY3Rpb25zIDIgYW5kIDMgYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IHJlbGVhc2UKdGhlIE1vZGlmaWVkIFZlcnNpb24gdW5kZXIgcHJlY2lzZWx5IHRoaXMgTGljZW5zZSwgd2l0aCB0aGUgTW9kaWZpZWQKVmVyc2lvbiBmaWxsaW5nIHRoZSByb2xlIG9mIHRoZSBEb2N1bWVudCwgdGh1cyBsaWNlbnNpbmcgZGlzdHJpYnV0aW9uCmFuZCBtb2RpZmljYXRpb24gb2YgdGhlIE1vZGlmaWVkIFZlcnNpb24gdG8gd2hvZXZlciBwb3NzZXNzZXMgYSBjb3B5Cm9mIGl0LiAgSW4gYWRkaXRpb24sIHlvdSBtdXN0IGRvIHRoZXNlIHRoaW5ncyBpbiB0aGUgTW9kaWZpZWQgVmVyc2lvbjoKCkEuClVzZSBpbiB0aGUgVGl0bGUgUGFnZSAoYW5kIG9uIHRoZSBjb3ZlcnMsIGlmIGFueSkgYSB0aXRsZSBkaXN0aW5jdApmcm9tIHRoYXQgb2YgdGhlIERvY3VtZW50LCBhbmQgZnJvbSB0aG9zZSBvZiBwcmV2aW91cyB2ZXJzaW9ucwood2hpY2ggc2hvdWxkLCBpZiB0aGVyZSB3ZXJlIGFueSwgYmUgbGlzdGVkIGluIHRoZSBIaXN0b3J5IHNlY3Rpb24Kb2YgdGhlIERvY3VtZW50KS4gIFlvdSBtYXkgdXNlIHRoZSBzYW1lIHRpdGxlIGFzIGEgcHJldmlvdXMgdmVyc2lvbgppZiB0aGUgb3JpZ2luYWwgcHVibGlzaGVyIG9mIHRoYXQgdmVyc2lvbiBnaXZlcyBwZXJtaXNzaW9uLgoKQi4KTGlzdCBvbiB0aGUgVGl0bGUgUGFnZSwgYXMgYXV0aG9ycywgb25lIG9yIG1vcmUgcGVyc29ucyBvciBlbnRpdGllcwpyZXNwb25zaWJsZSBmb3IgYXV0aG9yc2hpcCBvZiB0aGUgbW9kaWZpY2F0aW9ucyBpbiB0aGUgTW9kaWZpZWQKVmVyc2lvbiwgdG9nZXRoZXIgd2l0aCBhdCBsZWFzdCBmaXZlIG9mIHRoZSBwcmluY2lwYWwgYXV0aG9ycyBvZiB0aGUKRG9jdW1lbnQgKGFsbCBvZiBpdHMgcHJpbmNpcGFsIGF1dGhvcnMsIGlmIGl0IGhhcyBsZXNzIHRoYW4gZml2ZSkuCgpDLgpTdGF0ZSBvbiB0aGUgVGl0bGUgcGFnZSB0aGUgbmFtZSBvZiB0aGUgcHVibGlzaGVyIG9mIHRoZQpNb2RpZmllZCBWZXJzaW9uLCBhcyB0aGUgcHVibGlzaGVyLgoKRC4KUHJlc2VydmUgYWxsIHRoZSBjb3B5cmlnaHQgbm90aWNlcyBvZiB0aGUgRG9jdW1lbnQuCgpFLgpBZGQgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBmb3IgeW91ciBtb2RpZmljYXRpb25zCmFkamFjZW50IHRvIHRoZSBvdGhlciBjb3B5cmlnaHQgbm90aWNlcy4KCkYuCkluY2x1ZGUsIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjb3B5cmlnaHQgbm90aWNlcywgYSBsaWNlbnNlIG5vdGljZQpnaXZpbmcgdGhlIHB1YmxpYyBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgTW9kaWZpZWQgVmVyc2lvbiB1bmRlciB0aGUKdGVybXMgb2YgdGhpcyBMaWNlbnNlLCBpbiB0aGUgZm9ybSBzaG93biBpbiB0aGUgQWRkZW5kdW0gYmVsb3cuCgpHLgpQcmVzZXJ2ZSBpbiB0aGF0IGxpY2Vuc2Ugbm90aWNlIHRoZSBmdWxsIGxpc3RzIG9mIEludmFyaWFudCBTZWN0aW9ucwphbmQgcmVxdWlyZWQgQ292ZXIgVGV4dHMgZ2l2ZW4gaW4gdGhlIERvY3VtZW50J3MgbGljZW5zZSBub3RpY2UuCgpILgpJbmNsdWRlIGFuIHVuYWx0ZXJlZCBjb3B5IG9mIHRoaXMgTGljZW5zZS4KCkkuClByZXNlcnZlIHRoZSBzZWN0aW9uIGVudGl0bGVkIGBgSGlzdG9yeScnLCBhbmQgaXRzIHRpdGxlLCBhbmQgYWRkIHRvCml0IGFuIGl0ZW0gc3RhdGluZyBhdCBsZWFzdCB0aGUgdGl0bGUsIHllYXIsIG5ldyBhdXRob3JzLCBhbmQKcHVibGlzaGVyIG9mIHRoZSBNb2RpZmllZCBWZXJzaW9uIGFzIGdpdmVuIG9uIHRoZSBUaXRsZSBQYWdlLiAgSWYKdGhlcmUgaXMgbm8gc2VjdGlvbiBlbnRpdGxlZCBgYEhpc3RvcnknJyBpbiB0aGUgRG9jdW1lbnQsIGNyZWF0ZSBvbmUKc3RhdGluZyB0aGUgdGl0bGUsIHllYXIsIGF1dGhvcnMsIGFuZCBwdWJsaXNoZXIgb2YgdGhlIERvY3VtZW50IGFzCmdpdmVuIG9uIGl0cyBUaXRsZSBQYWdlLCB0aGVuIGFkZCBhbiBpdGVtIGRlc2NyaWJpbmcgdGhlIE1vZGlmaWVkClZlcnNpb24gYXMgc3RhdGVkIGluIHRoZSBwcmV2aW91cyBzZW50ZW5jZS4KCkouClByZXNlcnZlIHRoZSBuZXR3b3JrIGxvY2F0aW9uLCBpZiBhbnksIGdpdmVuIGluIHRoZSBEb2N1bWVudCBmb3IKcHVibGljIGFjY2VzcyB0byBhIFRyYW5zcGFyZW50IGNvcHkgb2YgdGhlIERvY3VtZW50LCBhbmQgbGlrZXdpc2UKdGhlIG5ldHdvcmsgbG9jYXRpb25zIGdpdmVuIGluIHRoZSBEb2N1bWVudCBmb3IgcHJldmlvdXMgdmVyc2lvbnMKaXQgd2FzIGJhc2VkIG9uLiAgVGhlc2UgbWF5IGJlIHBsYWNlZCBpbiB0aGUgYGBIaXN0b3J5Jycgc2VjdGlvbi4KWW91IG1heSBvbWl0IGEgbmV0d29yayBsb2NhdGlvbiBmb3IgYSB3b3JrIHRoYXQgd2FzIHB1Ymxpc2hlZCBhdApsZWFzdCBmb3VyIHllYXJzIGJlZm9yZSB0aGUgRG9jdW1lbnQgaXRzZWxmLCBvciBpZiB0aGUgb3JpZ2luYWwKcHVibGlzaGVyIG9mIHRoZSB2ZXJzaW9uIGl0IHJlZmVycyB0byBnaXZlcyBwZXJtaXNzaW9uLgoKSy4KSW4gYW55IHNlY3Rpb24gZW50aXRsZWQgYGBBY2tub3dsZWRnbWVudHMnJyBvciBgYERlZGljYXRpb25zJycsCnByZXNlcnZlIHRoZSBzZWN0aW9uJ3MgdGl0bGUsIGFuZCBwcmVzZXJ2ZSBpbiB0aGUgc2VjdGlvbiBhbGwgdGhlCnN1YnN0YW5jZSBhbmQgdG9uZSBvZiBlYWNoIG9mIHRoZSBjb250cmlidXRvciBhY2tub3dsZWRnbWVudHMKYW5kL29yIGRlZGljYXRpb25zIGdpdmVuIHRoZXJlaW4uCgpMLgpQcmVzZXJ2ZSBhbGwgdGhlIEludmFyaWFudCBTZWN0aW9ucyBvZiB0aGUgRG9jdW1lbnQsCnVuYWx0ZXJlZCBpbiB0aGVpciB0ZXh0IGFuZCBpbiB0aGVpciB0aXRsZXMuICBTZWN0aW9uIG51bWJlcnMKb3IgdGhlIGVxdWl2YWxlbnQgYXJlIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIHNlY3Rpb24gdGl0bGVzLgoKTS4KRGVsZXRlIGFueSBzZWN0aW9uIGVudGl0bGVkIGBgRW5kb3JzZW1lbnRzJycuICBTdWNoIGEgc2VjdGlvbgptYXkgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBNb2RpZmllZCBWZXJzaW9uLgoKTi4KRG8gbm90IHJldGl0bGUgYW55IGV4aXN0aW5nIHNlY3Rpb24gYXMgYGBFbmRvcnNlbWVudHMnJwpvciB0byBjb25mbGljdCBpbiB0aXRsZSB3aXRoIGFueSBJbnZhcmlhbnQgU2VjdGlvbi4KCklmIHRoZSBNb2RpZmllZCBWZXJzaW9uIGluY2x1ZGVzIG5ldyBmcm9udC1tYXR0ZXIgc2VjdGlvbnMgb3IKYXBwZW5kaWNlcyB0aGF0IHF1YWxpZnkgYXMgU2Vjb25kYXJ5IFNlY3Rpb25zIGFuZCBjb250YWluIG5vIG1hdGVyaWFsCmNvcGllZCBmcm9tIHRoZSBEb2N1bWVudCwgeW91IG1heSBhdCB5b3VyIG9wdGlvbiBkZXNpZ25hdGUgc29tZSBvciBhbGwKb2YgdGhlc2Ugc2VjdGlvbnMgYXMgaW52YXJpYW50LiAgVG8gZG8gdGhpcywgYWRkIHRoZWlyIHRpdGxlcyB0byB0aGUKbGlzdCBvZiBJbnZhcmlhbnQgU2VjdGlvbnMgaW4gdGhlIE1vZGlmaWVkIFZlcnNpb24ncyBsaWNlbnNlIG5vdGljZS4KVGhlc2UgdGl0bGVzIG11c3QgYmUgZGlzdGluY3QgZnJvbSBhbnkgb3RoZXIgc2VjdGlvbiB0aXRsZXMuCgpZb3UgbWF5IGFkZCBhIHNlY3Rpb24gZW50aXRsZWQgYGBFbmRvcnNlbWVudHMnJywgcHJvdmlkZWQgaXQgY29udGFpbnMKbm90aGluZyBidXQgZW5kb3JzZW1lbnRzIG9mIHlvdXIgTW9kaWZpZWQgVmVyc2lvbiBieSB2YXJpb3VzCnBhcnRpZXMtLS1mb3IgZXhhbXBsZSwgc3RhdGVtZW50cyBvZiBwZWVyIHJldmlldyBvciB0aGF0IHRoZSB0ZXh0IGhhcwpiZWVuIGFwcHJvdmVkIGJ5IGFuIG9yZ2FuaXphdGlvbiBhcyB0aGUgYXV0aG9yaXRhdGl2ZSBkZWZpbml0aW9uIG9mIGEKc3RhbmRhcmQuCgpZb3UgbWF5IGFkZCBhIHBhc3NhZ2Ugb2YgdXAgdG8gZml2ZSB3b3JkcyBhcyBhIEZyb250LUNvdmVyIFRleHQsIGFuZCBhCnBhc3NhZ2Ugb2YgdXAgdG8gMjUgd29yZHMgYXMgYSBCYWNrLUNvdmVyIFRleHQsIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QKb2YgQ292ZXIgVGV4dHMgaW4gdGhlIE1vZGlmaWVkIFZlcnNpb24uICBPbmx5IG9uZSBwYXNzYWdlIG9mCkZyb250LUNvdmVyIFRleHQgYW5kIG9uZSBvZiBCYWNrLUNvdmVyIFRleHQgbWF5IGJlIGFkZGVkIGJ5IChvcgp0aHJvdWdoIGFycmFuZ2VtZW50cyBtYWRlIGJ5KSBhbnkgb25lIGVudGl0eS4gIElmIHRoZSBEb2N1bWVudCBhbHJlYWR5CmluY2x1ZGVzIGEgY292ZXIgdGV4dCBmb3IgdGhlIHNhbWUgY292ZXIsIHByZXZpb3VzbHkgYWRkZWQgYnkgeW91IG9yCmJ5IGFycmFuZ2VtZW50IG1hZGUgYnkgdGhlIHNhbWUgZW50aXR5IHlvdSBhcmUgYWN0aW5nIG9uIGJlaGFsZiBvZiwKeW91IG1heSBub3QgYWRkIGFub3RoZXI7IGJ1dCB5b3UgbWF5IHJlcGxhY2UgdGhlIG9sZCBvbmUsIG9uIGV4cGxpY2l0CnBlcm1pc3Npb24gZnJvbSB0aGUgcHJldmlvdXMgcHVibGlzaGVyIHRoYXQgYWRkZWQgdGhlIG9sZCBvbmUuCgpUaGUgYXV0aG9yKHMpIGFuZCBwdWJsaXNoZXIocykgb2YgdGhlIERvY3VtZW50IGRvIG5vdCBieSB0aGlzIExpY2Vuc2UKZ2l2ZSBwZXJtaXNzaW9uIHRvIHVzZSB0aGVpciBuYW1lcyBmb3IgcHVibGljaXR5IGZvciBvciB0byBhc3NlcnQgb3IKaW1wbHkgZW5kb3JzZW1lbnQgb2YgYW55IE1vZGlmaWVkIFZlcnNpb24uCgo1LgpDT01CSU5JTkcgRE9DVU1FTlRTCgpZb3UgbWF5IGNvbWJpbmUgdGhlIERvY3VtZW50IHdpdGggb3RoZXIgZG9jdW1lbnRzIHJlbGVhc2VkIHVuZGVyIHRoaXMKTGljZW5zZSwgdW5kZXIgdGhlIHRlcm1zIGRlZmluZWQgaW4gc2VjdGlvbiA0IGFib3ZlIGZvciBtb2RpZmllZAp2ZXJzaW9ucywgcHJvdmlkZWQgdGhhdCB5b3UgaW5jbHVkZSBpbiB0aGUgY29tYmluYXRpb24gYWxsIG9mIHRoZQpJbnZhcmlhbnQgU2VjdGlvbnMgb2YgYWxsIG9mIHRoZSBvcmlnaW5hbCBkb2N1bWVudHMsIHVubW9kaWZpZWQsIGFuZApsaXN0IHRoZW0gYWxsIGFzIEludmFyaWFudCBTZWN0aW9ucyBvZiB5b3VyIGNvbWJpbmVkIHdvcmsgaW4gaXRzCmxpY2Vuc2Ugbm90aWNlLgoKVGhlIGNvbWJpbmVkIHdvcmsgbmVlZCBvbmx5IGNvbnRhaW4gb25lIGNvcHkgb2YgdGhpcyBMaWNlbnNlLCBhbmQKbXVsdGlwbGUgaWRlbnRpY2FsIEludmFyaWFudCBTZWN0aW9ucyBtYXkgYmUgcmVwbGFjZWQgd2l0aCBhIHNpbmdsZQpjb3B5LiAgSWYgdGhlcmUgYXJlIG11bHRpcGxlIEludmFyaWFudCBTZWN0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUgYnV0CmRpZmZlcmVudCBjb250ZW50cywgbWFrZSB0aGUgdGl0bGUgb2YgZWFjaCBzdWNoIHNlY3Rpb24gdW5pcXVlIGJ5CmFkZGluZyBhdCB0aGUgZW5kIG9mIGl0LCBpbiBwYXJlbnRoZXNlcywgdGhlIG5hbWUgb2YgdGhlIG9yaWdpbmFsCmF1dGhvciBvciBwdWJsaXNoZXIgb2YgdGhhdCBzZWN0aW9uIGlmIGtub3duLCBvciBlbHNlIGEgdW5pcXVlIG51bWJlci4KTWFrZSB0aGUgc2FtZSBhZGp1c3RtZW50IHRvIHRoZSBzZWN0aW9uIHRpdGxlcyBpbiB0aGUgbGlzdCBvZgpJbnZhcmlhbnQgU2VjdGlvbnMgaW4gdGhlIGxpY2Vuc2Ugbm90aWNlIG9mIHRoZSBjb21iaW5lZCB3b3JrLgoKSW4gdGhlIGNvbWJpbmF0aW9uLCB5b3UgbXVzdCBjb21iaW5lIGFueSBzZWN0aW9ucyBlbnRpdGxlZCBgYEhpc3RvcnknJwppbiB0aGUgdmFyaW91cyBvcmlnaW5hbCBkb2N1bWVudHMsIGZvcm1pbmcgb25lIHNlY3Rpb24gZW50aXRsZWQKYGBIaXN0b3J5Jyc7IGxpa2V3aXNlIGNvbWJpbmUgYW55IHNlY3Rpb25zIGVudGl0bGVkIGBgQWNrbm93bGVkZ21lbnRzJycsCmFuZCBhbnkgc2VjdGlvbnMgZW50aXRsZWQgYGBEZWRpY2F0aW9ucycnLiAgWW91IG11c3QgZGVsZXRlIGFsbCBzZWN0aW9ucwplbnRpdGxlZCBgYEVuZG9yc2VtZW50cy4nJwoKNi4KQ09MTEVDVElPTlMgT0YgRE9DVU1FTlRTCgpZb3UgbWF5IG1ha2UgYSBjb2xsZWN0aW9uIGNvbnNpc3Rpbmcgb2YgdGhlIERvY3VtZW50IGFuZCBvdGhlciBkb2N1bWVudHMKcmVsZWFzZWQgdW5kZXIgdGhpcyBMaWNlbnNlLCBhbmQgcmVwbGFjZSB0aGUgaW5kaXZpZHVhbCBjb3BpZXMgb2YgdGhpcwpMaWNlbnNlIGluIHRoZSB2YXJpb3VzIGRvY3VtZW50cyB3aXRoIGEgc2luZ2xlIGNvcHkgdGhhdCBpcyBpbmNsdWRlZCBpbgp0aGUgY29sbGVjdGlvbiwgcHJvdmlkZWQgdGhhdCB5b3UgZm9sbG93IHRoZSBydWxlcyBvZiB0aGlzIExpY2Vuc2UgZm9yCnZlcmJhdGltIGNvcHlpbmcgb2YgZWFjaCBvZiB0aGUgZG9jdW1lbnRzIGluIGFsbCBvdGhlciByZXNwZWN0cy4KCllvdSBtYXkgZXh0cmFjdCBhIHNpbmdsZSBkb2N1bWVudCBmcm9tIHN1Y2ggYSBjb2xsZWN0aW9uLCBhbmQgZGlzdHJpYnV0ZQppdCBpbmRpdmlkdWFsbHkgdW5kZXIgdGhpcyBMaWNlbnNlLCBwcm92aWRlZCB5b3UgaW5zZXJ0IGEgY29weSBvZiB0aGlzCkxpY2Vuc2UgaW50byB0aGUgZXh0cmFjdGVkIGRvY3VtZW50LCBhbmQgZm9sbG93IHRoaXMgTGljZW5zZSBpbiBhbGwKb3RoZXIgcmVzcGVjdHMgcmVnYXJkaW5nIHZlcmJhdGltIGNvcHlpbmcgb2YgdGhhdCBkb2N1bWVudC4KCjcuCkFHR1JFR0FUSU9OIFdJVEggSU5ERVBFTkRFTlQgV09SS1MKCkEgY29tcGlsYXRpb24gb2YgdGhlIERvY3VtZW50IG9yIGl0cyBkZXJpdmF0aXZlcyB3aXRoIG90aGVyIHNlcGFyYXRlCmFuZCBpbmRlcGVuZGVudCBkb2N1bWVudHMgb3Igd29ya3MsIGluIG9yIG9uIGEgdm9sdW1lIG9mIGEgc3RvcmFnZSBvcgpkaXN0cmlidXRpb24gbWVkaXVtLCBkb2VzIG5vdCBhcyBhIHdob2xlIGNvdW50IGFzIGEgTW9kaWZpZWQgVmVyc2lvbgpvZiB0aGUgRG9jdW1lbnQsIHByb3ZpZGVkIG5vIGNvbXBpbGF0aW9uIGNvcHlyaWdodCBpcyBjbGFpbWVkIGZvciB0aGUKY29tcGlsYXRpb24uICBTdWNoIGEgY29tcGlsYXRpb24gaXMgY2FsbGVkIGFuIGBgYWdncmVnYXRlJycsIGFuZCB0aGlzCkxpY2Vuc2UgZG9lcyBub3QgYXBwbHkgdG8gdGhlIG90aGVyIHNlbGYtY29udGFpbmVkIHdvcmtzIHRodXMgY29tcGlsZWQKd2l0aCB0aGUgRG9jdW1lbnQsIG9uIGFjY291bnQgb2YgdGhlaXIgYmVpbmcgdGh1cyBjb21waWxlZCwgaWYgdGhleQphcmUgbm90IHRoZW1zZWx2ZXMgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgRG9jdW1lbnQuCgpJZiB0aGUgQ292ZXIgVGV4dCByZXF1aXJlbWVudCBvZiBzZWN0aW9uIDMgaXMgYXBwbGljYWJsZSB0byB0aGVzZQpjb3BpZXMgb2YgdGhlIERvY3VtZW50LCB0aGVuIGlmIHRoZSBEb2N1bWVudCBpcyBsZXNzIHRoYW4gb25lIHF1YXJ0ZXIKb2YgdGhlIGVudGlyZSBhZ2dyZWdhdGUsIHRoZSBEb2N1bWVudCdzIENvdmVyIFRleHRzIG1heSBiZSBwbGFjZWQgb24KY292ZXJzIHRoYXQgc3Vycm91bmQgb25seSB0aGUgRG9jdW1lbnQgd2l0aGluIHRoZSBhZ2dyZWdhdGUuCk90aGVyd2lzZSB0aGV5IG11c3QgYXBwZWFyIG9uIGNvdmVycyBhcm91bmQgdGhlIHdob2xlIGFnZ3JlZ2F0ZS4KCjguClRSQU5TTEFUSU9OCgpUcmFuc2xhdGlvbiBpcyBjb25zaWRlcmVkIGEga2luZCBvZiBtb2RpZmljYXRpb24sIHNvIHlvdSBtYXkKZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhlIERvY3VtZW50IHVuZGVyIHRoZSB0ZXJtcyBvZiBzZWN0aW9uIDQuClJlcGxhY2luZyBJbnZhcmlhbnQgU2VjdGlvbnMgd2l0aCB0cmFuc2xhdGlvbnMgcmVxdWlyZXMgc3BlY2lhbApwZXJtaXNzaW9uIGZyb20gdGhlaXIgY29weXJpZ2h0IGhvbGRlcnMsIGJ1dCB5b3UgbWF5IGluY2x1ZGUKdHJhbnNsYXRpb25zIG9mIHNvbWUgb3IgYWxsIEludmFyaWFudCBTZWN0aW9ucyBpbiBhZGRpdGlvbiB0byB0aGUKb3JpZ2luYWwgdmVyc2lvbnMgb2YgdGhlc2UgSW52YXJpYW50IFNlY3Rpb25zLiAgWW91IG1heSBpbmNsdWRlIGEKdHJhbnNsYXRpb24gb2YgdGhpcyBMaWNlbnNlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gaW5jbHVkZSB0aGUKb3JpZ2luYWwgRW5nbGlzaCB2ZXJzaW9uIG9mIHRoaXMgTGljZW5zZS4gIEluIGNhc2Ugb2YgYSBkaXNhZ3JlZW1lbnQKYmV0d2VlbiB0aGUgdHJhbnNsYXRpb24gYW5kIHRoZSBvcmlnaW5hbCBFbmdsaXNoIHZlcnNpb24gb2YgdGhpcwpMaWNlbnNlLCB0aGUgb3JpZ2luYWwgRW5nbGlzaCB2ZXJzaW9uIHdpbGwgcHJldmFpbC4KCjkuClRFUk1JTkFUSU9OCgpZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIERvY3VtZW50IGV4Y2VwdAphcyBleHByZXNzbHkgcHJvdmlkZWQgZm9yIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBvdGhlciBhdHRlbXB0IHRvCmNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBEb2N1bWVudCBpcyB2b2lkLCBhbmQgd2lsbAphdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuICBIb3dldmVyLApwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlciB0aGlzCkxpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaApwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCgoxMC4KRlVUVVJFIFJFVklTSU9OUyBPRiBUSElTIExJQ0VOU0UKClRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggbmV3LCByZXZpc2VkIHZlcnNpb25zCm9mIHRoZSBHTlUgRnJlZSBEb2N1bWVudGF0aW9uIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldwp2ZXJzaW9ucyB3aWxsIGJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkKZGlmZmVyIGluIGRldGFpbCB0byBhZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4gIFNlZQpAdXJlZntodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvfS4KCkVhY2ggdmVyc2lvbiBvZiB0aGUgTGljZW5zZSBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLgpJZiB0aGUgRG9jdW1lbnQgc3BlY2lmaWVzIHRoYXQgYSBwYXJ0aWN1bGFyIG51bWJlcmVkIHZlcnNpb24gb2YgdGhpcwpMaWNlbnNlIGBgb3IgYW55IGxhdGVyIHZlcnNpb24nJyBhcHBsaWVzIHRvIGl0LCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mCmZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgc3BlY2lmaWVkIHZlcnNpb24gb3IKb2YgYW55IGxhdGVyIHZlcnNpb24gdGhhdCBoYXMgYmVlbiBwdWJsaXNoZWQgKG5vdCBhcyBhIGRyYWZ0KSBieSB0aGUKRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIERvY3VtZW50IGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uCm51bWJlciBvZiB0aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIChub3QKYXMgYSBkcmFmdCkgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KQGVuZCBlbnVtZXJhdGUKCkFEREVORFVNOiBIb3cgdG8gdXNlIHRoaXMgTGljZW5zZSBmb3IgeW91ciBkb2N1bWVudHMKClRvIHVzZSB0aGlzIExpY2Vuc2UgaW4gYSBkb2N1bWVudCB5b3UgaGF2ZSB3cml0dGVuLCBpbmNsdWRlIGEgY29weSBvZgp0aGUgTGljZW5zZSBpbiB0aGUgZG9jdW1lbnQgYW5kIHB1dCB0aGUgZm9sbG93aW5nIGNvcHlyaWdodCBhbmQKbGljZW5zZSBub3RpY2VzIGp1c3QgYWZ0ZXIgdGhlIHRpdGxlIHBhZ2U6CgogIENvcHlyaWdodCAoQykgIHllYXIgIHlvdXIgbmFtZS4KICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoaXMgZG9jdW1lbnQKICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZSwgVmVyc2lvbiAxLjEKICBvciBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsKICB3aXRoIHRoZSBJbnZhcmlhbnQgU2VjdGlvbnMgYmVpbmcgQHZhcntsaXN0IHRoZWlyIHRpdGxlc30sIHdpdGggdGhlCiAgRnJvbnQtQ292ZXIgVGV4dHMgYmVpbmcgQHZhcntsaXN0fSwgYW5kIHdpdGggdGhlIEJhY2stQ292ZXIgVGV4dHMgYmVpbmcgQHZhcntsaXN0fS4KICBBIGNvcHkgb2YgdGhlIGxpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhlIHNlY3Rpb24gZW50aXRsZWQgYGBHTlUKICBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZScnLgoKSWYgeW91IGhhdmUgbm8gSW52YXJpYW50IFNlY3Rpb25zLCB3cml0ZSBgYHdpdGggbm8gSW52YXJpYW50IFNlY3Rpb25zJycKaW5zdGVhZCBvZiBzYXlpbmcgd2hpY2ggb25lcyBhcmUgaW52YXJpYW50LiAgSWYgeW91IGhhdmUgbm8KRnJvbnQtQ292ZXIgVGV4dHMsIHdyaXRlIGBgbm8gRnJvbnQtQ292ZXIgVGV4dHMnJyBpbnN0ZWFkIG9mCmBgRnJvbnQtQ292ZXIgVGV4dHMgYmVpbmcgQHZhcntsaXN0fScnOyBsaWtld2lzZSBmb3IgQmFjay1Db3ZlciBUZXh0cy4KCklmIHlvdXIgZG9jdW1lbnQgY29udGFpbnMgbm9udHJpdmlhbCBleGFtcGxlcyBvZiBwcm9ncmFtIGNvZGUsIHdlCnJlY29tbWVuZCByZWxlYXNpbmcgdGhlc2UgZXhhbXBsZXMgaW4gcGFyYWxsZWwgdW5kZXIgeW91ciBjaG9pY2Ugb2YKZnJlZSBzb2Z0d2FyZSBsaWNlbnNlLCBzdWNoIGFzIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKdG8gcGVybWl0IHRoZWlyIHVzZSBpbiBmcmVlIHNvZnR3YXJlLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQSB0cmFuc3BhcmVudCBjb3B5IG9mIHRoaXMgbW9kaWZpZWQgZG9jdW1lbnQgY2FuIGJlIGZvdW5kIGFsb25nLXNpZGUgdGhlIGJpbmFyeSAubGliaG92ZXIgZmlsZQppbiB0aGUgb3JnLmVjbGlwc2UuY2R0LmxpYmhvdmVyLmdsaWJjIHBsdWctaW4gamFyIHVuZGVyIHRoZSBkYXRhIGRpcmVjdG9yeS4gIFRoZSBwbHVnLWluIGNhbiBiZQp1bnppcHBlZCB2aWEgInVuemlwIi4gIFRoZSBvcmlnaW5hbCB1bi1tb2RpZmllZCBkb2N1bWVudCBjYW4gYmUgZ2VuZXJhdGVkIGZyb20gdGhlIHNvdXJjZXMgd2hpY2gKY2FuIGJlIGZvdW5kIGF0OiBodHRwOi8vZnRwLmdudS5vcmcvZ251L2dsaWJjL2dsaWJjLTIuMTQudGFyLmd6CgogICAgICBzcgATamF2YS51dGlsLkFycmF5TGlzdHiB0h2Zx2GdAwABSQAEc2l6ZXhwAAAAAHcEAAAAAHhxAH4ACXB0AAR2b2lkdAAKREVTX0ZBSUxFRHNxAH4ACnQApAogICAgICAgIFRoaXMgbWFjcm8gcmV0dXJucyAxIGlmIDxWQVI+ZXJyPC9WQVI+IGlzIGEgYHN1Y2Nlc3MnIHJlc3VsdCBjb2RlIGZyb20KICAgICAgICAgPENPREU+ZWNiX2NyeXB0PC9DT0RFPiBvciA8Q09ERT5jYmNfY3J5cHQ8L0NPREU+LCBhbmQgMCBvdGhlcndpc2UuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAD3JwYy9kZXNfY3J5cHQuaHhxAH4AEnQAB2ludCBlcnJ0AANpbnR0AAVfRXhpdHNxAH4ACnQBiQogICAgICAgIFRoZSA8Q09ERT5fRXhpdDwvQ09ERT4gZnVuY3Rpb24gaXMgdGhlIElTTyBDIGVxdWl2YWxlbnQgdG8gPENPREU+X2V4aXQ8L0NPREU+LgogICAgICAgICBUaGUgSVNPIEMgY29tbWl0dGVlIG1lbWJlcnMgd2VyZSBub3Qgc3VyZSB3aGV0aGVyIHRoZSBkZWZpbml0aW9ucyBvZgogICAgICAgICA8Q09ERT5fZXhpdDwvQ09ERT4gYW5kIDxDT0RFPl9FeGl0PC9DT0RFPiB3ZXJlIGNvbXBhdGlibGUgc28gdGhleSBoYXZlIG5vdCB1c2VkIHRoZQogICAgICAgICBQT1NJWCBuYW1lLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIHdhcyBpbnRyb2R1Y2VkIGluIElTTyBDOTkgYW5kIGlzIGRlY2xhcmVkIGluCiAgICAgICAgIDxUVD5zdGRsaWIuaDwvVFQ+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAhzdGRsaWIuaHhxAH4AGXQACmludCBzdGF0dXN0AAR2b2lkdAAKX19mYnVmc2l6ZXNxAH4ACnQBEgogICAgICAgIFRoZSA8Q09ERT5fX2ZidWZzaXplPC9DT0RFPiBmdW5jdGlvbiByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBpbiB0aGUKICAgICAgICAgc3RyZWFtIDxWQVI+c3RyZWFtPC9WQVI+LiAgVGhpcyB2YWx1ZSBjYW4gYmUgdXNlZCB0byBvcHRpbWl6ZSB0aGUgdXNlIG9mIHRoZQogICAgICAgICBzdHJlYW0uCiAgICAgICAgIDxicj48YnI+IFRoaXMgZnVuY3Rpb24gaXMgZGVjbGFyZWQgaW4gdGhlIDxUVD5zdGRpb19leHQuaDwvVFQ+IGhlYWRlci4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAALc3RkaW9fZXh0Lmh4cQB+ACB0AAxGSUxFICpzdHJlYW10AAZzaXplX3R0AAZfX2ZsYmZzcQB+AAp0AQwKICAgICAgICBUaGUgPENPREU+X19mbGJmPC9DT0RFPiBmdW5jdGlvbiB3aWxsIHJldHVybiBhIG5vbnplcm8gdmFsdWUgaW4gY2FzZSB0aGUKICAgICAgICAgc3RyZWFtIDxWQVI+c3RyZWFtPC9WQVI+IGlzIGxpbmUgYnVmZmVyZWQuICBPdGhlcndpc2UgdGhlIHJldHVybiB2YWx1ZSBpcwogICAgICAgICB6ZXJvLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIGlzIGRlY2xhcmVkIGluIHRoZSA8VFQ+c3RkaW9fZXh0Lmg8L1RUPiBoZWFkZXIuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAC3N0ZGlvX2V4dC5oeHEAfgAndAAMRklMRSAqc3RyZWFtdAADaW50dAAKX19mcGVuZGluZ3NxAH4ACnQBRwogICAgICAgIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBjdXJyZW50bHkgaW4gdGhlIG91dHB1dCBidWZmZXIuCiAgICAgICAgIEZvciB3aWRlLW9yaWVudGVkIHN0cmVhbSB0aGUgbWVhc3VyaW5nIHVuaXQgaXMgd2lkZSBjaGFyYWN0ZXJzLiAgVGhpcwogICAgICAgICBmdW5jdGlvbiBzaG91bGQgbm90IGJlIHVzZWQgb24gYnVmZmVycyBpbiByZWFkIG1vZGUgb3Igb3BlbmVkIHJlYWQtb25seS4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiBpcyBkZWNsYXJlZCBpbiB0aGUgPFRUPnN0ZGlvX2V4dC5oPC9UVD4gaGVhZGVyLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAtzdGRpb19leHQuaHhxAH4ALnQADEZJTEUgKnN0cmVhbXQABnNpemVfdHQACF9fZnB1cmdlc3EAfgAKdAG9CiAgICAgICAgVGhlIDxDT0RFPl9fZnB1cmdlPC9DT0RFPiBmdW5jdGlvbiBjYXVzZXMgdGhlIGJ1ZmZlciBvZiB0aGUgc3RyZWFtCiAgICAgICAgIDxWQVI+c3RyZWFtPC9WQVI+IHRvIGJlIGVtcHRpZWQuICBJZiB0aGUgc3RyZWFtIGlzIGN1cnJlbnRseSBpbiByZWFkIG1vZGUgYWxsCiAgICAgICAgIGlucHV0IGluIHRoZSBidWZmZXIgaXMgbG9zdC4gIElmIHRoZSBzdHJlYW0gaXMgaW4gb3V0cHV0IG1vZGUgdGhlCiAgICAgICAgIGJ1ZmZlcmVkIG91dHB1dCBpcyBub3Qgd3JpdHRlbiB0byB0aGUgZGV2aWNlIChvciB3aGF0ZXZlciBvdGhlcgogICAgICAgICB1bmRlcmx5aW5nIHN0b3JhZ2UpIGFuZCB0aGUgYnVmZmVyIHRoZSBjbGVhcmVkLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIGlzIGRlY2xhcmVkIGluIDxUVD5zdGRpb19leHQuaDwvVFQ+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAtzdGRpb19leHQuaHhxAH4ANXQADEZJTEUgKnN0cmVhbXQABHZvaWR0AAtfX2ZyZWFkYWJsZXNxAH4ACnQBOQogICAgICAgIFRoZSA8Q09ERT5fX2ZyZWFkYWJsZTwvQ09ERT4gZnVuY3Rpb24gZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzdHJlYW0KICAgICAgICAgPFZBUj5zdHJlYW08L1ZBUj4gd2FzIG9wZW5lZCB0byBhbGxvdyByZWFkaW5nLiAgSW4gdGhpcyBjYXNlIHRoZSByZXR1cm4gdmFsdWUKICAgICAgICAgaXMgbm9uemVyby4gIEZvciB3cml0ZS1vbmx5IHN0cmVhbXMgdGhlIGZ1bmN0aW9uIHJldHVybnMgemVyby4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiBpcyBkZWNsYXJlZCBpbiA8VFQ+c3RkaW9fZXh0Lmg8L1RUPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAALc3RkaW9fZXh0Lmh4cQB+ADx0AAxGSUxFICpzdHJlYW10AANpbnR0AApfX2ZyZWFkaW5nc3EAfgAKdAH4CiAgICAgICAgVGhlIDxDT0RFPl9fZnJlYWRpbmc8L0NPREU+IGZ1bmN0aW9uIGRldGVybWluZXMgd2hldGhlciB0aGUgc3RyZWFtCiAgICAgICAgIDxWQVI+c3RyZWFtPC9WQVI+IHdhcyBsYXN0IHJlYWQgZnJvbSBvciB3aGV0aGVyIGl0IGlzIG9wZW5lZCByZWFkLW9ubHkuICBJbgogICAgICAgICB0aGlzIGNhc2UgdGhlIHJldHVybiB2YWx1ZSBpcyBub256ZXJvLCBvdGhlcndpc2UgaXQgaXMgemVyby4KICAgICAgICAgRGV0ZXJtaW5pbmcgd2hldGhlciBhIHN0cmVhbSBvcGVuZWQgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgd2FzIGxhc3QKICAgICAgICAgdXNlZCBmb3Igd3JpdGluZyBhbGxvd3MgdG8gZHJhdyBjb25jbHVzaW9ucyBhYm91dCB0aGUgY29udGVudCBhYm91dCB0aGUKICAgICAgICAgYnVmZmVyLCBhbW9uZyBvdGhlciB0aGluZ3MuCiAgICAgICAgIDxicj48YnI+IFRoaXMgZnVuY3Rpb24gaXMgZGVjbGFyZWQgaW4gPFRUPnN0ZGlvX2V4dC5oPC9UVD4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAC3N0ZGlvX2V4dC5oeHEAfgBDdAAMRklMRSAqc3RyZWFtdAADaW50dAANX19mc2V0bG9ja2luZ3NxAH4ACnQGdQogICAgICAgIDxicj48YnI+IFRoZSA8Q09ERT5fX2ZzZXRsb2NraW5nPC9DT0RFPiBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBzZWxlY3Qgd2hldGhlciB0aGUKICAgICAgICAgc3RyZWFtIG9wZXJhdGlvbnMgd2lsbCBpbXBsaWNpdGx5IGFjcXVpcmUgdGhlIGxvY2tpbmcgb2JqZWN0IG9mIHRoZQogICAgICAgICBzdHJlYW0gPFZBUj5zdHJlYW08L1ZBUj4uICBCeSBkZWZhdWx0IHRoaXMgaXMgZG9uZSBidXQgaXQgY2FuIGJlIGRpc2FibGVkIGFuZAogICAgICAgICByZWluc3RhdGVkIHVzaW5nIHRoaXMgZnVuY3Rpb24uICBUaGVyZSBhcmUgdGhyZWUgdmFsdWVzIGRlZmluZWQgZm9yIHRoZQogICAgICAgICA8VkFSPnR5cGU8L1ZBUj4gcGFyYW1ldGVyLgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8RFQ+PENPREU+RlNFVExPQ0tJTkdfSU5URVJOQUw8L0NPREU+CjxERD4KICAgICAgICAgVGhlIHN0cmVhbSA8Q09ERT5zdHJlYW08L0NPREU+IHdpbGwgZnJvbSBub3cgb24gdXNlIHRoZSBkZWZhdWx0IGludGVybmFsCiAgICAgICAgIGxvY2tpbmcuICBFdmVyeSBzdHJlYW0gb3BlcmF0aW9uIHdpdGggZXhjZXB0aW9uIG9mIHRoZSA8Q09ERT5fdW5sb2NrZWQ8L0NPREU+CiAgICAgICAgIHZhcmlhbnRzIHdpbGwgaW1wbGljaXRseSBsb2NrIHRoZSBzdHJlYW0uCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5GU0VUTE9DS0lOR19CWUNBTExFUjwvQ09ERT4KPEREPgogICAgICAgICBBZnRlciB0aGUgPENPREU+X19mc2V0bG9ja2luZzwvQ09ERT4gZnVuY3Rpb24gcmV0dXJucyB0aGUgdXNlciBpcyByZXNwb25zaWJsZQogICAgICAgICBmb3IgbG9ja2luZyB0aGUgc3RyZWFtLiAgTm9uZSBvZiB0aGUgc3RyZWFtIG9wZXJhdGlvbnMgd2lsbCBpbXBsaWNpdGx5CiAgICAgICAgIGRvIHRoaXMgYW55bW9yZSB1bnRpbCB0aGUgc3RhdGUgaXMgc2V0IGJhY2sgdG8KICAgICAgICAgPENPREU+RlNFVExPQ0tJTkdfSU5URVJOQUw8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+RlNFVExPQ0tJTkdfUVVFUlk8L0NPREU+CjxERD4KICAgICAgICAgPENPREU+X19mc2V0bG9ja2luZzwvQ09ERT4gb25seSBxdWVyaWVzIHRoZSBjdXJyZW50IGxvY2tpbmcgc3RhdGUgb2YgdGhlCiAgICAgICAgIHN0cmVhbS4gIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSA8Q09ERT5GU0VUTE9DS0lOR19JTlRFUk5BTDwvQ09ERT4gb3IKICAgICAgICAgPENPREU+RlNFVExPQ0tJTkdfQllDQUxMRVI8L0NPREU+IGRlcGVuZGluZyBvbiB0aGUgc3RhdGUuCiAgICAgICAgIDwvREw+CiAgICAgICAgIDxicj48YnI+IFRoZSByZXR1cm4gdmFsdWUgb2YgPENPREU+X19mc2V0bG9ja2luZzwvQ09ERT4gaXMgZWl0aGVyCiAgICAgICAgIDxDT0RFPkZTRVRMT0NLSU5HX0lOVEVSTkFMPC9DT0RFPiBvciA8Q09ERT5GU0VUTE9DS0lOR19CWUNBTExFUjwvQ09ERT4gZGVwZW5kaW5nIG9uCiAgICAgICAgIHRoZSBzdGF0ZSBvZiB0aGUgc3RyZWFtIGJlZm9yZSB0aGUgY2FsbC4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiBhbmQgdGhlIHZhbHVlcyBmb3IgdGhlIDxWQVI+dHlwZTwvVkFSPiBwYXJhbWV0ZXIgYXJlIGRlY2xhcmVkCiAgICAgICAgIGluIDxUVD5zdGRpb19leHQuaDwvVFQ+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAtzdGRpb19leHQuaHhxAH4ASnQAFkZJTEUgKnN0cmVhbSwgaW50IHR5cGV0AANpbnR0AAtfX2Z3cml0YWJsZXNxAH4ACnQBOAogICAgICAgIFRoZSA8Q09ERT5fX2Z3cml0YWJsZTwvQ09ERT4gZnVuY3Rpb24gZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzdHJlYW0KICAgICAgICAgPFZBUj5zdHJlYW08L1ZBUj4gd2FzIG9wZW5lZCB0byBhbGxvdyB3cml0aW5nLiAgSW4gdGhpcyBjYXNlIHRoZSByZXR1cm4gdmFsdWUKICAgICAgICAgaXMgbm9uemVyby4gIEZvciByZWFkLW9ubHkgc3RyZWFtcyB0aGUgZnVuY3Rpb24gcmV0dXJucyB6ZXJvLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIGlzIGRlY2xhcmVkIGluIDxUVD5zdGRpb19leHQuaDwvVFQ+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAtzdGRpb19leHQuaHhxAH4AUXQADEZJTEUgKnN0cmVhbXQAA2ludHQACl9fZndyaXRpbmdzcQB+AAp0ATYKICAgICAgICBUaGUgPENPREU+X19md3JpdGluZzwvQ09ERT4gZnVuY3Rpb24gZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzdHJlYW0KICAgICAgICAgPFZBUj5zdHJlYW08L1ZBUj4gd2FzIGxhc3Qgd3JpdHRlbiB0byBvciB3aGV0aGVyIGl0IGlzIG9wZW5lZCB3cml0ZS1vbmx5LiAgSW4KICAgICAgICAgdGhpcyBjYXNlIHRoZSByZXR1cm4gdmFsdWUgaXMgbm9uemVybywgb3RoZXJ3aXNlIGl0IGlzIHplcm8uCiAgICAgICAgIDxicj48YnI+IFRoaXMgZnVuY3Rpb24gaXMgZGVjbGFyZWQgaW4gPFRUPnN0ZGlvX2V4dC5oPC9UVD4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAC3N0ZGlvX2V4dC5oeHEAfgBYdAAMRklMRSAqc3RyZWFtdAADaW50dAAFX2V4aXRzcQB+AAp0ARYKICAgICAgICBUaGUgPENPREU+X2V4aXQ8L0NPREU+IGZ1bmN0aW9uIGlzIHRoZSBwcmltaXRpdmUgZm9yIGNhdXNpbmcgYSBwcm9jZXNzIHRvCiAgICAgICAgIHRlcm1pbmF0ZSB3aXRoIHN0YXR1cyA8VkFSPnN0YXR1czwvVkFSPi4gIENhbGxpbmcgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdAogICAgICAgICBleGVjdXRlIGNsZWFudXAgZnVuY3Rpb25zIHJlZ2lzdGVyZWQgd2l0aCA8Q09ERT5hdGV4aXQ8L0NPREU+IG9yCiAgICAgICAgIDxDT0RFPm9uX2V4aXQ8L0NPREU+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAh1bmlzdGQuaHhxAH4AX3QACmludCBzdGF0dXN0AAR2b2lkdAAJX2ZsdXNobGJmc3EAfgAKdADCCiAgICAgICAgVGhlIDxDT0RFPl9mbHVzaGxiZjwvQ09ERT4gZnVuY3Rpb24gZmx1c2hlcyBhbGwgbGluZSBidWZmZXJlZCBzdHJlYW1zCiAgICAgICAgIGN1cnJlbnRseSBvcGVuZWQuCiAgICAgICAgIDxicj48YnI+IFRoaXMgZnVuY3Rpb24gaXMgZGVjbGFyZWQgaW4gdGhlIDxUVD5zdGRpb19leHQuaDwvVFQ+IGhlYWRlci4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAALc3RkaW9fZXh0Lmh4cQB+AGZ0AAR2b2lkdAAEdm9pZHQACF90b2xvd2Vyc3EAfgAKdAB5CiAgICAgICAgVGhpcyBpcyBpZGVudGljYWwgdG8gPENPREU+dG9sb3dlcjwvQ09ERT4sIGFuZCBpcyBwcm92aWRlZCBmb3IgY29tcGF0aWJpbGl0eQogICAgICAgICB3aXRoIHRoZSBTVklELiAgLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAdjdHlwZS5oeHEAfgBtdAAFaW50IGN0AANpbnR0AAhfdG91cHBlcnNxAH4ACnQAdgogICAgICAgIFRoaXMgaXMgaWRlbnRpY2FsIHRvIDxDT0RFPnRvdXBwZXI8L0NPREU+LCBhbmQgaXMgcHJvdmlkZWQgZm9yIGNvbXBhdGliaWxpdHkKICAgICAgICAgd2l0aCB0aGUgU1ZJRC4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHY3R5cGUuaHhxAH4AdHQABWludCBjdAADaW50dAAEYTY0bHNxAH4ACnQCTgogICAgICAgIFRoZSBwYXJhbWV0ZXIgPFZBUj5zdHJpbmc8L1ZBUj4gc2hvdWxkIGNvbnRhaW4gYSBzdHJpbmcgd2hpY2ggd2FzIHByb2R1Y2VkIGJ5CiAgICAgICAgIGEgY2FsbCB0byA8Q09ERT5sNjRhPC9DT0RFPi4gIFRoZSBmdW5jdGlvbiBwcm9jZXNzZXMgYXQgbGVhc3QgNiBjaGFyYWN0ZXJzIG9mCiAgICAgICAgIHRoaXMgc3RyaW5nLCBhbmQgZGVjb2RlcyB0aGUgY2hhcmFjdGVycyBpdCBmaW5kcyBhY2NvcmRpbmcgdG8gdGhlIHRhYmxlCiAgICAgICAgIGJlbG93LiAgSXQgc3RvcHMgZGVjb2Rpbmcgd2hlbiBpdCBmaW5kcyBhIGNoYXJhY3RlciBub3QgaW4gdGhlIHRhYmxlLAogICAgICAgICByYXRoZXIgbGlrZSA8Q09ERT5hdG9pPC9DT0RFPjsgaWYgeW91IGhhdmUgYSBidWZmZXIgd2hpY2ggaGFzIGJlZW4gYnJva2VuIGludG8KICAgICAgICAgbGluZXMsIHlvdSBtdXN0IGJlIGNhcmVmdWwgdG8gc2tpcCBvdmVyIHRoZSBlbmQtb2YtbGluZSBjaGFyYWN0ZXJzLgogICAgICAgICA8YnI+PGJyPiBUaGUgZGVjb2RlZCBudW1iZXIgaXMgcmV0dXJuZWQgYXMgYSA8Q09ERT5sb25nIGludDwvQ09ERT4gdmFsdWUuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHN0ZGxpYi5oeHEAfgB7dAASY29uc3QgY2hhciAqc3RyaW5ndAAIbG9uZyBpbnR0AAVhYm9ydHNxAH4ACnQBoAogICAgICAgIFRoZSA8Q09ERT5hYm9ydDwvQ09ERT4gZnVuY3Rpb24gY2F1c2VzIGFibm9ybWFsIHByb2dyYW0gdGVybWluYXRpb24uICBUaGlzCiAgICAgICAgIGRvZXMgbm90IGV4ZWN1dGUgY2xlYW51cCBmdW5jdGlvbnMgcmVnaXN0ZXJlZCB3aXRoIDxDT0RFPmF0ZXhpdDwvQ09ERT4gb3IKICAgICAgICAgPENPREU+b25fZXhpdDwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IFRoaXMgZnVuY3Rpb24gYWN0dWFsbHkgdGVybWluYXRlcyB0aGUgcHJvY2VzcyBieSByYWlzaW5nIGEKICAgICAgICAgPENPREU+U0lHQUJSVDwvQ09ERT4gc2lnbmFsLCBhbmQgeW91ciBwcm9ncmFtIGNhbiBpbmNsdWRlIGEgaGFuZGxlciB0bwogICAgICAgICBpbnRlcmNlcHQgdGhpcyBzaWduYWw7IHNlZSBTaWduYWwgSGFuZGxpbmcuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHN0ZGxpYi5oeHEAfgCCdAAEdm9pZHQABHZvaWR0AANhYnNzcQB+AAp0AhAKICAgICAgICBUaGVzZSBmdW5jdGlvbnMgcmV0dXJuIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiA8VkFSPm51bWJlcjwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gTW9zdCBjb21wdXRlcnMgdXNlIGEgdHdvJ3MgY29tcGxlbWVudCBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uLCBpbiB3aGljaAogICAgICAgICB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgPENPREU+SU5UX01JTjwvQ09ERT4gKHRoZSBzbWFsbGVzdCBwb3NzaWJsZSA8Q09ERT5pbnQ8L0NPREU+KQogICAgICAgICBjYW5ub3QgYmUgcmVwcmVzZW50ZWQ7IHRodXMsIDxDT0RFPmFicyAoSU5UX01JTik8L0NPREU+IGlzIG5vdCBkZWZpbmVkLgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5sbGFiczwvQ09ERT4gYW5kIDxDT0RFPmltYXhkaXY8L0NPREU+IGFyZSBuZXcgdG8gSVNPIEM5OS4KICAgICAgICAgPGJyPjxicj4gU2VlIEludGVnZXJzIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSA8Q09ERT5pbnRtYXhfdDwvQ09ERT4gdHlwZS4KICAgICAgICAgPGJyPjxicj4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc3RkbGliLmh4cQB+AIl0AAppbnQgbnVtYmVydAADaW50dAAGYWNjZXB0c3EAfgAKdAi1CiAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFjY2VwdCBhIGNvbm5lY3Rpb24gcmVxdWVzdCBvbiB0aGUgc2VydmVyCiAgICAgICAgIHNvY2tldCA8VkFSPnNvY2tldDwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gVGhlIDxDT0RFPmFjY2VwdDwvQ09ERT4gZnVuY3Rpb24gd2FpdHMgaWYgdGhlcmUgYXJlIG5vIGNvbm5lY3Rpb25zIHBlbmRpbmcsCiAgICAgICAgIHVubGVzcyB0aGUgc29ja2V0IDxWQVI+c29ja2V0PC9WQVI+IGhhcyBub25ibG9ja2luZyBtb2RlIHNldC4gIChZb3UgY2FuIHVzZQogICAgICAgICA8Q09ERT5zZWxlY3Q8L0NPREU+IHRvIHdhaXQgZm9yIGEgcGVuZGluZyBjb25uZWN0aW9uLCB3aXRoIGEgbm9uYmxvY2tpbmcKICAgICAgICAgc29ja2V0LikgICwgZm9yIGluZm9ybWF0aW9uIGFib3V0IG5vbmJsb2NraW5nCiAgICAgICAgIG1vZGUuCiAgICAgICAgIDxicj48YnI+IFRoZSA8VkFSPmFkZHI8L1ZBUj4gYW5kIDxWQVI+bGVuZ3RoLXB0cjwvVkFSPiBhcmd1bWVudHMgYXJlIHVzZWQgdG8gcmV0dXJuCiAgICAgICAgIGluZm9ybWF0aW9uIGFib3V0IHRoZSBuYW1lIG9mIHRoZSBjbGllbnQgc29ja2V0IHRoYXQgaW5pdGlhdGVkIHRoZQogICAgICAgICBjb25uZWN0aW9uLiAgLCBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZvcm1hdAogICAgICAgICBvZiB0aGUgaW5mb3JtYXRpb24uCiAgICAgICAgIDxicj48YnI+IEFjY2VwdGluZyBhIGNvbm5lY3Rpb24gZG9lcyBub3QgbWFrZSA8VkFSPnNvY2tldDwvVkFSPiBwYXJ0IG9mIHRoZQogICAgICAgICBjb25uZWN0aW9uLiAgSW5zdGVhZCwgaXQgY3JlYXRlcyBhIG5ldyBzb2NrZXQgd2hpY2ggYmVjb21lcwogICAgICAgICBjb25uZWN0ZWQuICBUaGUgbm9ybWFsIHJldHVybiB2YWx1ZSBvZiA8Q09ERT5hY2NlcHQ8L0NPREU+IGlzIHRoZSBmaWxlCiAgICAgICAgIGRlc2NyaXB0b3IgZm9yIHRoZSBuZXcgc29ja2V0LgogICAgICAgICA8YnI+PGJyPiBBZnRlciA8Q09ERT5hY2NlcHQ8L0NPREU+LCB0aGUgb3JpZ2luYWwgc29ja2V0IDxWQVI+c29ja2V0PC9WQVI+IHJlbWFpbnMgb3BlbiBhbmQKICAgICAgICAgdW5jb25uZWN0ZWQsIGFuZCBjb250aW51ZXMgbGlzdGVuaW5nIHVudGlsIHlvdSBjbG9zZSBpdC4gIFlvdSBjYW4KICAgICAgICAgYWNjZXB0IGZ1cnRoZXIgY29ubmVjdGlvbnMgd2l0aCA8VkFSPnNvY2tldDwvVkFSPiBieSBjYWxsaW5nIDxDT0RFPmFjY2VwdDwvQ09ERT4KICAgICAgICAgYWdhaW4uCiAgICAgICAgIDxicj48YnI+IElmIGFuIGVycm9yIG9jY3VycywgPENPREU+YWNjZXB0PC9DT0RFPiByZXR1cm5zIDxDT0RFPi0xPC9DT0RFPi4gIFRoZSBmb2xsb3dpbmcKICAgICAgICAgPENPREU+ZXJybm88L0NPREU+IGVycm9yIGNvbmRpdGlvbnMgYXJlIGRlZmluZWQgZm9yIHRoaXMgZnVuY3Rpb246CiAgICAgICAgIDxicj48YnI+IDxETD4KCiAgICAgICAgIDxEVD48Q09ERT5FQkFERjwvQ09ERT4KPEREPgogICAgICAgICBUaGUgPFZBUj5zb2NrZXQ8L1ZBUj4gYXJndW1lbnQgaXMgbm90IGEgdmFsaWQgZmlsZSBkZXNjcmlwdG9yLgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVOT1RTT0NLCiAgICAgICAgIFRoZSBkZXNjcmlwdG9yIDxWQVI+c29ja2V0PC9WQVI+IGFyZ3VtZW50IGlzIG5vdCBhIHNvY2tldC4KICAgICAgICAgPGJyPjxicj4gPExJPiBFT1BOT1RTVVBQCiAgICAgICAgIFRoZSBkZXNjcmlwdG9yIDxWQVI+c29ja2V0PC9WQVI+IGRvZXMgbm90IHN1cHBvcnQgdGhpcyBvcGVyYXRpb24uCiAgICAgICAgIDxicj48YnI+IDxMST4gRVdPVUxEQkxPQ0sKICAgICAgICAgPFZBUj5zb2NrZXQ8L1ZBUj4gaGFzIG5vbmJsb2NraW5nIG1vZGUgc2V0LCBhbmQgdGhlcmUgYXJlIG5vIHBlbmRpbmcKICAgICAgICAgY29ubmVjdGlvbnMgaW1tZWRpYXRlbHkgYXZhaWxhYmxlLgoKICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiBpcyBkZWZpbmVkIGFzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGluIG11bHRpLXRocmVhZGVkCiAgICAgICAgIHByb2dyYW1zLCBzbyBvbmUgaGFzIHRvIGJlIHByZXBhcmVkIGZvciB0aGlzIGFuZCBtYWtlIHN1cmUgdGhhdAogICAgICAgICBhbGxvY2F0ZWQgcmVzb3VyY2VzIChsaWtlIG1lbW9yeSwgZmlsZXMgZGVzY3JpcHRvcnMsIHNlbWFwaG9yZXMgb3IKICAgICAgICAgd2hhdGV2ZXIpIGFyZSBmcmVlZCBldmVuIGlmIHRoZSB0aHJlYWQgaXMgY2FuY2VsZWQuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQADHN5cy9zb2NrZXQuaHhxAH4AkHQAOGludCBzb2NrZXQsIHN0cnVjdCBzb2NrYWRkciAqYWRkciwgc29ja2xlbl90ICpsZW5ndGhfcHRydAADaW50dAAGYWNjZXNzc3EAfgAKdAW4CiAgICAgICAgVGhlIDxDT0RFPmFjY2VzczwvQ09ERT4gZnVuY3Rpb24gY2hlY2tzIHRvIHNlZSB3aGV0aGVyIHRoZSBmaWxlIG5hbWVkIGJ5CiAgICAgICAgIDxWQVI+ZmlsZW5hbWU8L1ZBUj4gY2FuIGJlIGFjY2Vzc2VkIGluIHRoZSB3YXkgc3BlY2lmaWVkIGJ5IHRoZSA8VkFSPmhvdzwvVkFSPgogICAgICAgICBhcmd1bWVudC4gIFRoZSA8VkFSPmhvdzwvVkFSPiBhcmd1bWVudCBlaXRoZXIgY2FuIGJlIHRoZSBiaXR3aXNlIE9SIG9mIHRoZQogICAgICAgICBmbGFncyA8Q09ERT5SX09LPC9DT0RFPiwgPENPREU+V19PSzwvQ09ERT4sIDxDT0RFPlhfT0s8L0NPREU+LCBvciB0aGUgZXhpc3RlbmNlIHRlc3QKICAgICAgICAgPENPREU+Rl9PSzwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IFRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgPEVNPnJlYWw8L0VNPiB1c2VyIGFuZCBncm91cCBJRHMgb2YgdGhlIGNhbGxpbmcKICAgICAgICAgcHJvY2VzcywgcmF0aGVyIHRoYW4gdGhlIDxFTT5lZmZlY3RpdmU8L0VNPiBJRHMsIHRvIGNoZWNrIGZvciBhY2Nlc3MKICAgICAgICAgcGVybWlzc2lvbi4gIEFzIGEgcmVzdWx0LCBpZiB5b3UgdXNlIHRoZSBmdW5jdGlvbiBmcm9tIGEgPENPREU+c2V0dWlkPC9DT0RFPgogICAgICAgICBvciA8Q09ERT5zZXRnaWQ8L0NPREU+IHByb2dyYW0gLCBpdCBnaXZlcwogICAgICAgICBpbmZvcm1hdGlvbiByZWxhdGl2ZSB0byB0aGUgdXNlciB3aG8gYWN0dWFsbHkgcmFuIHRoZSBwcm9ncmFtLgogICAgICAgICA8YnI+PGJyPiBUaGUgcmV0dXJuIHZhbHVlIGlzIDxDT0RFPjA8L0NPREU+IGlmIHRoZSBhY2Nlc3MgaXMgcGVybWl0dGVkLCBhbmQgPENPREU+LTE8L0NPREU+CiAgICAgICAgIG90aGVyd2lzZS4gIChJbiBvdGhlciB3b3JkcywgdHJlYXRlZCBhcyBhIHByZWRpY2F0ZSBmdW5jdGlvbiwKICAgICAgICAgPENPREU+YWNjZXNzPC9DT0RFPiByZXR1cm5zIHRydWUgaWYgdGhlIHJlcXVlc3RlZCBhY2Nlc3MgaXMgPEVNPmRlbmllZDwvRU0+LikKICAgICAgICAgPGJy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bG9uZyBkb3VibGV0AAVhY29zbHNxAH4ACnQCLQogICAgICAgIFRoZXNlIGZ1bmN0aW9ucyBjb21wdXRlIHRoZSBhcmMgY29zaW5lIG9mIDxWQVI+eDwvVkFSPi0tLXRoYXQgaXMsIHRoZSB2YWx1ZQogICAgICAgICB3aG9zZSBjb3NpbmUgaXMgPFZBUj54PC9WQVI+LiAgVGhlIHZhbHVlIGlzIGluIHVuaXRzIG9mIHJhZGlhbnMuCiAgICAgICAgIE1hdGhlbWF0aWNhbGx5LCB0aGVyZSBhcmUgaW5maW5pdGVseSBtYW55IHN1Y2ggdmFsdWVzOyB0aGUgb25lIGFjdHVhbGx5CiAgICAgICAgIHJldHVybmVkIGlzIHRoZSBvbmUgYmV0d2VlbiA8Q09ERT4wPC9DT0RFPiBhbmQgPENPREU+cGk8L0NPREU+IChpbmNsdXNpdmUpLgogICAgICAgICA8YnI+PGJyPiBUaGUgYXJjIGNvc2luZSBmdW5jdGlvbiBpcyBkZWZpbmVkIG1hdGhlbWF0aWNhbGx5IG9ubHkKICAgICAgICAgb3ZlciB0aGUgZG9tYWluIDxDT0RFPi0xPC9DT0RFPiB0byA8Q09ERT4xPC9DT0RFPi4gIElmIDxWQVI+eDwvVkFSPiBpcyBvdXRzaWRlIHRoZQogICAgICAgICBkb21haW4sIDxDT0RFPmFjb3M8L0NPREU+IHNpZ25hbHMgYSBkb21haW4gZXJyb3IuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQABm1hdGguaHhxAH4AwXQADWxvbmcgZG91YmxlIHh0AAtsb25nIGRvdWJsZXQACWFkZG1udGVudHNxAH4ACnQELgogICAgICAgIFRoZSA8Q09ERT5hZGRtbnRlbnQ8L0NPREU+IGZ1bmN0aW9uIGFsbG93cyBhZGRpbmcgYSBuZXcgZW50cnkgdG8gdGhlIGZpbGUKICAgICAgICAgcHJldmlvdXNseSBvcGVuZWQgd2l0aCA8Q09ERT5zZXRtbnRlbnQ8L0NPREU+LiAgVGhlIG5ldyBlbnRyaWVzIGFyZSBhbHdheXMKICAgICAgICAgYXBwZW5kZWQuICBJLmUuLCBldmVuIGlmIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlsZSBkZXNjcmlwdG9yIGlzIG5vdCBhdAogICAgICAgICB0aGUgZW5kIG9mIHRoZSBmaWxlIHRoaXMgZnVuY3Rpb24gZG9lcyBub3Qgb3ZlcndyaXRlIGFuIGV4aXN0aW5nIGVudHJ5CiAgICAgICAgIGZvbGxvd2luZyB0aGUgY3VycmVudCBwb3NpdGlvbi4KICAgICAgICAgPGJyPjxicj4gVGhlIGltcGxpY2F0aW9uIG9mIHRoaXMgaXMgdGhhdCB0byByZW1vdmUgYW4gZW50cnkgZnJvbSBhIGZpbGUgb25lIGhhcwogICAgICAgICB0byBjcmVhdGUgYSBuZXcgZmlsZSB3aGlsZSBsZWF2aW5nIG91dCB0aGUgZW50cnkgdG8gYmUgcmVtb3ZlZCBhbmQgYWZ0ZXIKICAgICAgICAgY2xvc2luZyB0aGUgZmlsZSByZW1vdmUgdGhlIG9sZCBvbmUgYW5kIHJlbmFtZSB0aGUgbmV3IGZpbGUgdG8gdGhlCiAgICAgICAgIGNob3NlbiBuYW1lLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIHRha2VzIGNhcmUgb2Ygc3BhY2VzIGFuZCB0YWIgY2hhcmFjdGVycyBpbiB0aGUgbmFtZXMgdG8gYmUKICAgICAgICAgd3JpdHRlbiB0byB0aGUgZmlsZS4gIEl0IGNvbnZlcnRzIHRoZW0gYW5kIHRoZSBiYWNrc2xhc2ggY2hhcmFjdGVyIGludG8KICAgICAgICAgdGhlIGZvcm1hdCBkZXNjcmliZSBpbiB0aGUgPENPREU+Z2V0bW50ZW50PC9DT0RFPiBkZXNjcmlwdGlvbiBhYm92ZS4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIDAgaW4gY2FzZSB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLgogICAgICAgICBPdGhlcndpc2UgdGhlIHJldHVybiB2YWx1ZSBpcyAxIGFuZCA8Q09ERT5lcnJubzwvQ09ERT4gaXMgc2V0CiAgICAgICAgIGFwcHJvcHJpYXRlbHkuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACG1udGVudC5oeHEAfgDIdAAmRklMRSAqc3RyZWFtLCBjb25zdCBzdHJ1Y3QgbW50ZW50ICptbnR0AANpbnR0AAthZGRzZXZlcml0eXNxAH4ACnQFLwogICAgICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRoZSBpbnRyb2R1Y3Rpb24gb2YgbmV3IHNldmVyaXR5IGNsYXNzZXMgd2hpY2ggY2FuIGJlCiAgICAgICAgIGFkZHJlc3NlZCBieSB0aGUgPFZBUj5zZXZlcml0eTwvVkFSPiBwYXJhbWV0ZXIgb2YgdGhlIDxDT0RFPmZtdG1zZzwvQ09ERT4gZnVuY3Rpb24uCiAgICAgICAgIFRoZSA8VkFSPnNldmVyaXR5PC9WQVI+IHBhcmFtZXRlciBvZiA8Q09ERT5hZGRzZXZlcml0eTwvQ09ERT4gbXVzdCBtYXRjaCB0aGUgdmFsdWUKICAgICAgICAgZm9yIHRoZSBwYXJhbWV0ZXIgd2l0aCB0aGUgc2FtZSBuYW1lIG9mIDxDT0RFPmZtdG1zZzwvQ09ERT4sIGFuZCA8VkFSPnN0cmluZzwvVkFSPgogICAgICAgICBpcyB0aGUgc3RyaW5nIHByaW50ZWQgaW4gdGhlIGFjdHVhbCBtZXNzYWdlcyBpbnN0ZWFkIG9mIHRoZSBudW1lcmljCiAgICAgICAgIHZhbHVlLgogICAgICAgICA8YnI+PGJyPiBJZiA8VkFSPnN0cmluZzwvVkFSPiBpcyA8Q09ERT5OVUxMPC9DT0RFPiB0aGUgc2V2ZXJpdHkgY2xhc3Mgd2l0aCB0aGUgbnVtZXJpYyB2YWx1ZQogICAgICAgICBhY2NvcmRpbmcgdG8gPFZBUj5zZXZlcml0eTwvVkFSPiBpcyByZW1vdmVkLgogICAgICAgICA8YnI+PGJyPiBJdCBpcyBub3QgcG9zc2libGUgdG8gb3ZlcndyaXRlIG9yIHJlbW92ZSBvbmUgb2YgdGhlIGRlZmF1bHQgc2V2ZXJpdHkKICAgICAgICAgY2xhc3Nlcy4gIEFsbCBjYWxscyB0byA8Q09ERT5hZGRzZXZlcml0eTwvQ09ERT4gd2l0aCA8VkFSPnNldmVyaXR5PC9WQVI+IHNldCB0byBvbmUKICAgICAgICAgb2YgdGhlIHZhbHVlcyBmb3IgdGhlIGRlZmF1bHQgY2xhc3NlcyB3aWxsIGZhaWwuCiAgICAgICAgIDxicj48YnI+IFRoZSByZXR1cm4gdmFsdWUgaXMgPENPREU+TU1fT0s8L0NPREU+IGlmIHRoZSB0YXNrIHdhcyBzdWNjZXNzZnVsbHkgcGVyZm9ybWVkLgogICAgICAgICBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIDxDT0RFPk1NX05PVE9LPC9DT0RFPiBzb21ldGhpbmcgd2VudCB3cm9uZy4gIFRoaXMgY291bGQKICAgICAgICAgbWVhbiB0aGF0IG5vIG1vcmUgbWVtb3J5IGlzIGF2YWlsYWJsZSBvciBhIGNsYXNzIGlzIG5vdCBhdmFpbGFibGUgd2hlbgogICAgICAgICBpdCBoYXMgdG8gYmUgcmVtb3ZlZC4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBYL09wZW4gUG9ydGFiaWxpdHkgR3VpZGUgYWx0aG91Z2gKICAgICAgICAgdGhlIDxDT0RFPmZtdHNtZzwvQ09ERT4gZnVuY3Rpb24gaXMuICBJdCBpcyBhdmFpbGFibGUgb24gU3lzdGVtIFYgc3lzdGVtcy4KICAgICAgICBzcQB+AA8AAAAAdwQAAAAAeHEAfgDPdAAgaW50IHNldmVyaXR5LCBjb25zdCBjaGFyICpzdHJpbmd0AANpbnR0AAdhZGp0aW1lc3EAfgAKdAVwCiAgICAgICAgVGhpcyBmdW5jdGlvbiBzcGVlZHMgdXAgb3Igc2xvd3MgZG93biB0aGUgc3lzdGVtIGNsb2NrIGluIG9yZGVyIHRvIG1ha2UKICAgICAgICAgYSBncmFkdWFsIGFkanVzdG1lbnQuICBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgY2FsZW5kYXIgdGltZSByZXBvcnRlZCBieQogICAgICAgICB0aGUgc3lzdGVtIGNsb2NrIGlzIGFsd2F5cyBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcsIHdoaWNoIG1pZ2h0IG5vdAogICAgICAgICBoYXBwZW4gaWYgeW91IHNpbXBseSBzZXQgdGhlIGNsb2NrLgogICAgICAgICA8YnI+PGJyPiBUaGUgPFZBUj5kZWx0YTwvVkFSPiBhcmd1bWVudCBzcGVjaWZpZXMgYSByZWxhdGl2ZSBhZGp1c3RtZW50IHRvIGJlIG1hZGUgdG8KICAgICAgICAgdGhlIGNsb2NrIHRpbWUuICBJZiBuZWdhdGl2ZSwgdGhlIHN5c3RlbSBjbG9jayBpcyBzbG93ZWQgZG93biBmb3IgYQogICAgICAgICB3aGlsZSB1bnRpbCBpdCBoYXMgbG9zdCB0aGlzIG11Y2ggZWxhcHNlZCB0aW1lLiAgSWYgcG9zaXRpdmUsIHRoZSBzeXN0ZW0KICAgICAgICAgY2xvY2sgaXMgc3BlZWRlZCB1cCBmb3IgYSB3aGlsZS4KICAgICAgICAgPGJyPjxicj4gSWYgdGhlIDxWQVI+b2xkZGVsdGE8L1ZBUj4gYXJndW1lbnQgaXMgbm90IGEgbnVsbCBwb2ludGVyLCB0aGUgPENPREU+YWRqdGltZTwvQ09ERT4KICAgICAgICAgZnVuY3Rpb24gcmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCBhbnkgcHJldmlvdXMgdGltZSBhZGp1c3RtZW50IHRoYXQKICAgICAgICAgaGFzIG5vdCB5ZXQgY29tcGxldGVkLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIGlzIHR5cGljYWxseSB1c2VkIHRvIHN5bmNocm9uaXplIHRoZSBjbG9ja3Mgb2YgY29tcHV0ZXJzCiAgICAgICAgIGluIGEgbG9jYWwgbmV0d29yay4gIFlvdSBtdXN0IGJlIGEgcHJpdmlsZWdlZCB1c2VyIHRvIHVzZSBpdC4KICAgICAgICAgPGJyPjxicj4gV2l0aCBhIExpbnV4IGtlcm5lbCwgeW91IGNhbiB1c2UgdGhlIDxDT0RFPmFkanRpbWV4PC9DT0RFPiBmdW5jdGlvbiB0bwogICAgICAgICBwZXJtYW5lbnRseSBjaGFuZ2UgdGhlIGNsb2NrIHNwZWVkLgogICAgICAgICA8YnI+PGJyPiBUaGUgcmV0dXJuIHZhbHVlIGlzIDxDT0RFPjA8L0NPREU+IG9uIHN1Y2Nlc3MgYW5kIDxDT0RFPi0xPC9DT0RFPiBvbiBmYWlsdXJlLiAgVGhlCiAgICAgICAgIGZvbGxvd2luZyA8Q09ERT5lcnJubzwvQ09ERT4gZXJyb3IgY29uZGl0aW9uIGlzIGRlZmluZWQgZm9yIHRoaXMgZnVuY3Rpb246CiAgICAgICAgIDxicj48YnI+IDxETD4KCiAgICAgICAgIDxEVD48Q09ERT5FUEVSTTwvQ09ERT4KPEREPgogICAgICAgICBZb3UgZG8gbm90IGhhdmUgcHJpdmlsZWdlIHRvIHNldCB0aGUgdGltZS4KCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACnN5cy90aW1lLmh4cQB+ANV0ADVjb25zdCBzdHJ1Y3QgdGltZXZhbCAqZGVsdGEsIHN0cnVjdCB0aW1ldmFsICpvbGRkZWx0YXQAA2ludHQACGFkanRpbWV4c3EAfgAKdADJCiAgICAgICAgPGJyPjxicj4gPENPREU+YWRqdGltZXg8L0NPREU+IGlzIGZ1bmN0aW9uYWxseSBpZGVudGljYWwgdG8gPENPREU+bnRwX2FkanRpbWU8L0NPREU+LgogICAgICAgICAuCiAgICAgICAgIDxicj48YnI+IFRoaXMgZnVuY3Rpb24gaXMgcHJlc2VudCBvbmx5IHdpdGggYSBMaW51eCBrZXJuZWwuCiAgICAgICAgIDxicj48YnI+CiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAC3N5cy90aW1leC5oeHEAfgDcdAATc3RydWN0IHRpbWV4ICp0aW1leHQAA2ludHQACmFpb19jYW5jZWxzcQB+AAp0CisKICAgICAgICBUaGUgPENPREU+YWlvX2NhbmNlbDwvQ09ERT4gZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY2FuY2VsIG9uZSBvciBtb3JlCiAgICAgICAgIG91dHN0YW5kaW5nIHJlcXVlc3RzLiAgSWYgdGhlIDxWQVI+YWlvY2JwPC9WQVI+IHBhcmFtZXRlciBpcyA8Q09ERT5OVUxMPC9DT0RFPiwgdGhlCiAgICAgICAgIGZ1bmN0aW9uIHRyaWVzIHRvIGNhbmNlbCBhbGwgb2YgdGhlIG91dHN0YW5kaW5nIHJlcXVlc3RzIHdoaWNoIHdvdWxkIHByb2Nlc3MKICAgICAgICAgdGhlIGZpbGUgZGVzY3JpcHRvciA8VkFSPmZpbGRlczwvVkFSPiAoaS5lLiwgd2hvc2UgPENPREU+YWlvX2ZpbGRlczwvQ09ERT4gbWVtYmVyCiAgICAgICAgIGlzIDxWQVI+ZmlsZGVzPC9WQVI+KS4gIElmIDxWQVI+YWlvY2JwPC9WQVI+IGlzIG5vdCA8Q09ERT5OVUxMPC9DT0RFPiwgPENPREU+YWlvX2NhbmNlbDwvQ09ERT4KICAgICAgICAgYXR0ZW1wdHMgdG8gY2FuY2VsIHRoZSBzcGVjaWZpYyByZXF1ZXN0IHBvaW50ZWQgdG8gYnkgPFZBUj5haW9jYnA8L1ZBUj4uCiAgICAgICAgIDxicj48YnI+IEZvciByZXF1ZXN0cyB3aGljaCB3ZXJlIHN1Y2Nlc3NmdWxseSBjYW5jZWxlZCwgdGhlIG5vcm1hbCBub3RpZmljYXRpb24KICAgICAgICAgYWJvdXQgdGhlIHRlcm1pbmF0aW9uIG9mIHRoZSByZXF1ZXN0IHNob3VsZCB0YWtlIHBsYWNlLiAgSS5lLiwgZGVwZW5kaW5nCiAgICAgICAgIG9uIHRoZSA8Q09ERT5zdHJ1Y3Qgc2lnZXZlbnQ8L0NPREU+IG9iamVjdCB3aGljaCBjb250cm9scyB0aGlzLCBub3RoaW5nCiAgICAgICAgIGhhcHBlbnMsIGEgc2lnbmFsIGlzIHNlbnQgb3IgYSB0aHJlYWQgaXMgc3RhcnRlZC4gIElmIHRoZSByZXF1ZXN0IGNhbm5vdAogICAgICAgICBiZSBjYW5jZWxlZCwgaXQgdGVybWluYXRlcyB0aGUgdXN1YWwgd2F5IGFmdGVyIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbi4KICAgICAgICAgPGJyPjxicj4gQWZ0ZXIgYSByZXF1ZXN0IGlzIHN1Y2Nlc3NmdWxseSBjYW5jZWxlZCwgYSBjYWxsIHRvIDxDT0RFPmFpb19lcnJvcjwvQ09ERT4gd2l0aAogICAgICAgICBhIHJlZmVyZW5jZSB0byB0aGlzIHJlcXVlc3QgYXMgdGhlIHBhcmFtZXRlciB3aWxsIHJldHVybgogICAgICAgICA8Q09ERT5FQ0FOQ0VMRUQ8L0NPREU+IGFuZCBhIGNhbGwgdG8gPENPREU+YWlvX3JldHVybjwvQ09ERT4gd2lsbCByZXR1cm4gLTEuCiAgICAgICAgIElmIHRoZSByZXF1ZXN0IHdhc24ndCBjYW5jZWxlZCBhbmQgaXMgc3RpbGwgcnVubmluZyB0aGUgZXJyb3Igc3RhdHVzIGlzCiAgICAgICAgIHN0aWxsIDxDT0RFPkVJTlBST0dSRVNTPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24gaXMgPENPREU+QUlPX0NBTkNFTEVEPC9DT0RFPiBpZiB0aGVyZSB3ZXJlCiAgICAgICAgIHJlcXVlc3RzIHdoaWNoIGhhdmVuJ3QgdGVybWluYXRlZCBhbmQgd2hpY2ggd2VyZSBzdWNjZXNzZnVsbHkgY2FuY2VsZWQuCiAgICAgICAgIElmIHRoZXJlIGlzIG9uZSBvciBtb3JlIHJlcXVlc3RzIGxlZnQgd2hpY2ggY291bGRuJ3QgYmUgY2FuY2VsZWQsIHRoZQogICAgICAgICByZXR1cm4gdmFsdWUgaXMgPENPREU+QUlPX05PVENBTkNFTEVEPC9DT0RFPi4gIEluIHRoaXMgY2FzZSA8Q09ERT5haW9fZXJyb3I8L0NPREU+CiAgICAgICAgIG11c3QgYmUgdXNlZCB0byBmaW5kIG91dCB3aGljaCBvZiB0aGUsIHBlcmhhcHMgbXVsdGlwbGUsIHJlcXVlc3RzIChpbgogICAgICAgICA8VkFSPmFpb2NicDwvVkFSPiBpcyA8Q09ERT5OVUxMPC9DT0RFPikgd2VyZW4ndCBzdWNjZXNzZnVsbHkgY2FuY2VsZWQuICBJZiBhbGwKICAgICAgICAgcmVxdWVzdHMgYWxyZWFkeSB0ZXJtaW5hdGVkIGF0IHRoZSB0aW1lIDxDT0RFPmFpb19jYW5jZWw8L0NPREU+IGlzIGNhbGxlZCB0aGUKICAgICAgICAgcmV0dXJuIHZhbHVlIGlzIDxDT0RFPkFJT19BTExET05FPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gSWYgYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHRoZSBleGVjdXRpb24gb2YgPENPREU+YWlvX2NhbmNlbDwvQ09ERT4gdGhlCiAgICAgICAgIGZ1bmN0aW9uIHJldHVybnMgLTEgYW5kIHNldHMgPENPREU+ZXJybm88L0NPREU+IHRvIG9uZSBvZiB0aGUgZm9sbG93aW5nCiAgICAgICAgIHZhbHVlcy4KICAgICAgICAgPGJyPjxicj4gPERMPgoKICAgICAgICAgPERUPjxDT0RFPkVCQURGPC9DT0RFPgo8REQ+CiAgICAgICAgIFRoZSBmaWxlIGRlc2NyaXB0b3IgPFZBUj5maWxkZXM8L1ZBUj4gaXMgbm90IHZhbGlkLgogICAgICAgICA8TEk+IEVOT1NZUwogICAgICAgICA8Q09ERT5haW9fY2FuY2VsPC9DT0RFPiBpcyBub3QgaW1wbGVtZW50ZWQuCgogICAgICAgICA8YnI+PGJyPiBXaGVuIHRoZSBzb3VyY2VzIGFyZSBjb21waWxlZCB3aXRoIDxDT0RFPl9GSUxFX09GRlNFVF9CSVRTID09IDY0PC9DT0RFPiwgdGhpcwogICAgICAgICBmdW5jdGlvbiBpcyBpbiBmYWN0IDxDT0RFPmFpb19jYW5jZWw2NDwvQ09ERT4gc2luY2UgdGhlIExGUyBpbnRlcmZhY2UKICAgICAgICAgdHJhbnNwYXJlbnRseSByZXBsYWNlcyB0aGUgbm9ybWFsIGltcGxlbWVudGF0aW9uLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAVhaW8uaHhxAH4A43QAIGludCBmaWxkZXMsIHN0cnVjdCBhaW9jYiAqYWlvY2JwdAADaW50dAAMYWlvX2NhbmNlbDY0c3EAfgAKdAHMCiAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIDxDT0RFPmFpb19jYW5jZWw8L0NPREU+IHdpdGggdGhlIG9ubHkgZGlmZmVyZW5jZQogICAgICAgICB0aGF0IHRoZSBhcmd1bWVudCBpcyBhIHJlZmVyZW5jZSB0byBhIHZhcmlhYmxlIG9mIHR5cGUgPENPREU+c3RydWN0CiAgICAgICAgIGFpb2NiNjQ8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBXaGVuIHRoZSBzb3VyY2VzIGFyZSBjb21waWxlZCB3aXRoIDxDT0RFPl9GSUxFX09GRlNFVF9CSVRTID09IDY0PC9DT0RFPiwgdGhpcwogICAgICAgICBmdW5jdGlvbiBpcyBhdmFpbGFibGUgdW5kZXIgdGhlIG5hbWUgPENPREU+YWlvX2NhbmNlbDwvQ09ERT4gYW5kIHNvCiAgICAgICAgIHRyYW5zcGFyZW50bHkgcmVwbGFjZXMgdGhlIGludGVyZmFjZSBmb3Igc21hbGwgZmlsZXMgb24gMzIgYml0CiAgICAgICAgIG1hY2hpbmVzLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAVhaW8uaHhxAH4A6nQAImludCBmaWxkZXMsIHN0cnVjdCBhaW9jYjY0ICphaW9jYnB0AANpbnR0AAlhaW9fZXJyb3JzcQB+AAp0BGEKICAgICAgICBUaGlzIGZ1bmN0aW9uIGRldGVybWluZXMgdGhlIGVycm9yIHN0YXRlIG9mIHRoZSByZXF1ZXN0IGRlc2NyaWJlZCBieSB0aGUKICAgICAgICAgPENPREU+c3RydWN0IGFpb2NiPC9DT0RFPiB2YXJpYWJsZSBwb2ludGVkIHRvIGJ5IDxWQVI+YWlvY2JwPC9WQVI+LiAgSWYgdGhlCiAgICAgICAgIHJlcXVlc3QgaGFzIG5vdCB5ZXQgdGVybWluYXRlZCB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgYWx3YXlzCiAgICAgICAgIDxDT0RFPkVJTlBST0dSRVNTPC9DT0RFPi4gIE9uY2UgdGhlIHJlcXVlc3QgaGFzIHRlcm1pbmF0ZWQgdGhlIHZhbHVlCiAgICAgICAgIDxDT0RFPmFpb19lcnJvcjwvQ09ERT4gcmV0dXJucyBpcyBlaXRoZXIgMCBpZiB0aGUgcmVxdWVzdCBjb21wbGV0ZWQKICAgICAgICAgc3VjY2Vzc2Z1bGx5IG9yIGl0IHJldHVybnMgdGhlIHZhbHVlIHdoaWNoIHdvdWxkIGJlIHN0b3JlZCBpbiB0aGUKICAgICAgICAgPENPREU+ZXJybm88L0NPREU+IHZhcmlhYmxlIGlmIHRoZSByZXF1ZXN0IHdvdWxkIGhhdmUgYmVlbiBkb25lIHVzaW5nCiAgICAgICAgIDxDT0RFPnJlYWQ8L0NPREU+LCA8Q09ERT53cml0ZTwvQ09ERT4sIG9yIDxDT0RFPmZzeW5jPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gVGhlIGZ1bmN0aW9uIGNhbiByZXR1cm4gPENPREU+RU5PU1lTPC9DT0RFPiBpZiBpdCBpcyBub3QgaW1wbGVtZW50ZWQuICBJdAogICAgICAgICBjb3VsZCBhbHNvIHJldHVybiA8Q09ERT5FSU5WQUw8L0NPREU+IGlmIHRoZSA8VkFSPmFpb2NicDwvVkFSPiBwYXJhbWV0ZXIgZG9lcyBub3QKICAgICAgICAgcmVmZXIgdG8gYW4gYXN5bmNocm9ub3VzIG9wZXJhdGlvbiB3aG9zZSByZXR1cm4gc3RhdHVzIGlzIG5vdCB5ZXQga25vd24uCiAgICAgICAgIDxicj48YnI+IFdoZW4gdGhlIHNvdXJjZXMgYXJlIGNvbXBpbGVkIHdpdGggPENPREU+X0ZJTEVfT0ZGU0VUX0JJVFMgPT0gNjQ8L0NPREU+IHRoaXMKICAgICAgICAgZnVuY3Rpb24gaXMgaW4gZmFjdCA8Q09ERT5haW9fZXJyb3I2NDwvQ09ERT4gc2luY2UgdGhlIExGUyBpbnRlcmZhY2UKICAgICAgICAgdHJhbnNwYXJlbnRseSByZXBsYWNlcyB0aGUgbm9ybWFsIGltcGxlbWVudGF0aW9uLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAVhaW8uaHhxAH4A8XQAGmNvbnN0IHN0cnVjdCBhaW9jYiAqYWlvY2JwdAADaW50dAALYWlvX2Vycm9yNjRzcQB+AAp0AckKICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gPENPREU+YWlvX2Vycm9yPC9DT0RFPiB3aXRoIHRoZSBvbmx5IGRpZmZlcmVuY2UKICAgICAgICAgdGhhdCB0aGUgYXJndW1lbnQgaXMgYSByZWZlcmVuY2UgdG8gYSB2YXJpYWJsZSBvZiB0eXBlIDxDT0RFPnN0cnVjdAogICAgICAgICBhaW9jYjY0PC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gV2hlbiB0aGUgc291cmNlcyBhcmUgY29tcGlsZWQgd2l0aCA8Q09ERT5fRklMRV9PRkZTRVRfQklUUyA9PSA2NDwvQ09ERT4gdGhpcwogICAgICAgICBmdW5jdGlvbiBpcyBhdmFpbGFibGUgdW5kZXIgdGhlIG5hbWUgPENPREU+YWlvX2Vycm9yPC9DT0RFPiBhbmQgc28KICAgICAgICAgdHJhbnNwYXJlbnRseSByZXBsYWNlcyB0aGUgaW50ZXJmYWNlIGZvciBzbWFsbCBmaWxlcyBvbiAzMiBiaXQKICAgICAgICAgbWFjaGluZXMuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQABWFpby5oeHEAfgD4dAAcY29uc3Qgc3RydWN0IGFpb2NiNjQgKmFpb2NicHQAA2ludHQACWFpb19mc3luY3NxAH4ACnQJ8AogICAgICAgIENhbGxpbmcgdGhpcyBmdW5jdGlvbiBmb3JjZXMgYWxsIEkvTyBvcGVyYXRpb25zIG9wZXJhdGluZyBxdWV1ZWQgYXQgdGhlCiAgICAgICAgIHRpbWUgb2YgdGhlIGZ1bmN0aW9uIGNhbGwgb3BlcmF0aW5nIG9uIHRoZSBmaWxlIGRlc2NyaXB0b3IKICAgICAgICAgPENPREU+YWlvY2JwLT5haW9fZmlsZGVzPC9DT0RFPiBpbnRvIHRoZSBzeW5jaHJvbml6ZWQgSS9PIGNvbXBsZXRpb24gc3RhdGUKICAgICAgICAgLiAgVGhlIDxDT0RFPmFpb19mc3luYzwvQ09ERT4gZnVuY3Rpb24gcmV0dXJucwogICAgICAgICBpbW1lZGlhdGVseSBidXQgdGhlIG5vdGlmaWNhdGlvbiB0aHJvdWdoIHRoZSBtZXRob2QgZGVzY3JpYmVkIGluCiAgICAgICAgIDxDT0RFPmFpb2NicC0+YWlvX3NpZ2V2ZW50PC9DT0RFPiB3aWxsIGhhcHBlbiBvbmx5IGFmdGVyIGFsbCByZXF1ZXN0cyBmb3IgdGhpcwogICAgICAgICBmaWxlIGRlc2NyaXB0b3IgaGF2ZSB0ZXJtaW5hdGVkIGFuZCB0aGUgZmlsZSBpcyBzeW5jaHJvbml6ZWQuICBUaGlzIGFsc28KICAgICAgICAgbWVhbnMgdGhhdCByZXF1ZXN0cyBmb3IgdGhpcyB2ZXJ5IHNhbWUgZmlsZSBkZXNjcmlwdG9yIHdoaWNoIGFyZSBxdWV1ZWQKICAgICAgICAgYWZ0ZXIgdGhlIHN5bmNocm9uaXphdGlvbiByZXF1ZXN0IGFyZSBub3QgYWZmZWN0ZWQuCiAgICAgICAgIDxicj48YnI+IElmIDxWQVI+b3A8L1ZBUj4gaXMgPENPREU+T19EU1lOQzwvQ09ERT4gdGhlIHN5bmNocm9uaXphdGlvbiBoYXBwZW5zIGFzIHdpdGggYSBjYWxsCiAgICAgICAgIHRvIDxDT0RFPmZkYXRhc3luYzwvQ09ERT4uICBPdGhlcndpc2UgPFZBUj5vcDwvVkFSPiBzaG91bGQgYmUgPENPREU+T19TWU5DPC9DT0RFPiBhbmQKICAgICAgICAgdGhlIHN5bmNocm9uaXphdGlvbiBoYXBwZW5zIGFzIHdpdGggPENPREU+ZnN5bmM8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBBcyBsb25nIGFzIHRoZSBzeW5jaHJvbml6YXRpb24gaGFzIG5vdCBoYXBwZW5lZCwgYSBjYWxsIHRvCiAgICAgICAgIDxDT0RFPmFpb19lcnJvcjwvQ09ERT4gd2l0aCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgcG9pbnRlZCB0byBieQogICAgICAgICA8VkFSPmFpb2NicDwvVkFSPiByZXR1cm5zIDxDT0RFPkVJTlBST0dSRVNTPC9DT0RFPi4gIE9uY2UgdGhlIHN5bmNocm9uaXphdGlvbiBpcwogICAgICAgICBkb25lIDxDT0RFPmFpb19lcnJvcjwvQ09ERT4gcmV0dXJuIDAgaWYgdGhlIHN5bmNocm9uaXphdGlvbiB3YXMgbm90CiAgICAgICAgIHN1Y2Nlc3NmdWwuICBPdGhlcndpc2UgdGhlIHZhbHVlIHJldHVybmVkIGlzIHRoZSB2YWx1ZSB0byB3aGljaCB0aGUKICAgICAgICAgPENPREU+ZnN5bmM8L0NPREU+IG9yIDxDT0RFPmZkYXRhc3luYzwvQ09ERT4gZnVuY3Rpb24gd291bGQgaGF2ZSBzZXQgdGhlCiAgICAgICAgIDxDT0RFPmVycm5vPC9DT0RFPiB2YXJpYWJsZS4gIEluIHRoaXMgY2FzZSBub3RoaW5nIGNhbiBiZSBhc3N1bWVkIGFib3V0IHRoZQogICAgICAgICBjb25zaXN0ZW5jeSBmb3IgdGhlIGRhdGEgd3JpdHRlbiB0byB0aGlzIGZpbGUgZGVzY3JpcHRvci4KICAgICAgICAgPGJyPjxicj4gVGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIDAgaWYgdGhlIHJlcXVlc3Qgd2FzCiAgICAgICAgIHN1Y2Nlc3NmdWxseSBlbnF1ZXVlZC4gIE90aGVyd2lzZSB0aGUgcmV0dXJuIHZhbHVlIGlzIC0xIGFuZAogICAgICAgICA8Q09ERT5lcnJubzwvQ09ERT4gaXMgc2V0IHRvIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICAgICAgICAgPGJyPjxicj4gPERMPgoKICAgICAgICAgPERUPjxDT0RFPkVBR0FJTjwvQ09ERT4KPEREPgogICAgICAgICBUaGUgcmVxdWVzdCBjb3VsZCBub3QgYmUgZW5xdWV1ZWQgZHVlIHRvIHRlbXBvcmFyeSBsYWNrIG9mIHJlc291cmNlcy4KICAgICAgICAgPExJPiBFQkFERgogICAgICAgICBUaGUgZmlsZSBkZXNjcmlwdG9yIDxDT0RFPmFpb2NicC0+YWlvX2ZpbGRlczwvQ09ERT4gaXMgbm90IHZhbGlkIG9yIG5vdCBvcGVuCiAgICAgICAgIGZvciB3cml0aW5nLgogICAgICAgICA8TEk+IEVJTlZBTAogICAgICAgICBUaGUgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc3VwcG9ydCBJL08gc3luY2hyb25pemF0aW9uIG9yIHRoZSA8VkFSPm9wPC9WQVI+CiAgICAgICAgIHBhcmFtZXRlciBpcyBvdGhlciB0aGFuIDxDT0RFPk9fRFNZTkM8L0NPREU+IGFuZCA8Q09ERT5PX1NZTkM8L0NPREU+LgogICAgICAgICA8TEk+IEVOT1NZUwogICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4KCiAgICAgICAgIDxicj48YnI+IFdoZW4gdGhlIHNvdXJjZXMgYXJlIGNvbXBpbGVkIHdpdGggPENPREU+X0ZJTEVfT0ZGU0VUX0JJVFMgPT0gNjQ8L0NPREU+IHRoaXMKICAgICAgICAgZnVuY3Rpb24gaXMgaW4gZmFjdCA8Q09ERT5haW9fZnN5bmM2NDwvQ09ERT4gc2luY2UgdGhlIExGUyBpbnRlcmZhY2UKICAgICAgICAgdHJhbnNwYXJlbnRseSByZXBsYWNlcyB0aGUgbm9ybWFsIGltcGxlbWVudGF0aW9uLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAVhaW8uaHhxAH4A/3QAHGludCBvcCwgc3RydWN0IGFpb2NiICphaW9jYnB0AANpbnR0AAthaW9fZnN5bmM2NHNxAH4ACnQByQogICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byA8Q09ERT5haW9fZnN5bmM8L0NPREU+IHdpdGggdGhlIG9ubHkgZGlmZmVyZW5jZQogICAgICAgICB0aGF0IHRoZSBhcmd1bWVudCBpcyBhIHJlZmVyZW5jZSB0byBhIHZhcmlhYmxlIG9mIHR5cGUgPENPREU+c3RydWN0CiAgICAgICAgIGFpb2NiNjQ8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBXaGVuIHRoZSBzb3VyY2VzIGFyZSBjb21waWxlZCB3aXRoIDxDT0RFPl9GSUxFX09GRlNFVF9CSVRTID09IDY0PC9DT0RFPiB0aGlzCiAgICAgICAgIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSB1bmRlciB0aGUgbmFtZSA8Q09ERT5haW9fZnN5bmM8L0NPREU+IGFuZCBzbwogICAgICAgICB0cmFuc3BhcmVudGx5IHJlcGxhY2VzIHRoZSBpbnRlcmZhY2UgZm9yIHNtYWxsIGZpbGVzIG9uIDMyIGJpdAogICAgICAgICBtYWNoaW5lcy4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAFYWlvLmh4cQB+AQZ0AB5pbnQgb3AsIHN0cnVjdCBhaW9jYjY0ICphaW9jYnB0AANpbnR0AAhhaW9faW5pdHNxAH4ACnQC6wogICAgICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBvdGhlciBBSU8gZnVuY3Rpb24uICBDYWxsaW5nIGl0CiAgICAgICAgIGlzIGNvbXBsZXRlbHkgdm9sdW50YXJ5LCBhcyBpdCBpcyBvbmx5IG1lYW50IHRvIGhlbHAgdGhlIEFJTwogICAgICAgICBpbXBsZW1lbnRhdGlvbiBwZXJmb3JtIGJldHRlci4KICAgICAgICAgPGJyPjxicj4gQmVmb3JlIGNhbGxpbmcgdGhlIDxDT0RFPmFpb19pbml0PC9DT0RFPiwgZnVuY3Rpb24gdGhlIG1lbWJlcnMgb2YgYSB2YXJpYWJsZSBvZgogICAgICAgICB0eXBlIDxDT0RFPnN0cnVjdCBhaW9pbml0PC9DT0RFPiBtdXN0IGJlIGluaXRpYWxpemVkLiAgVGhlbiBhIHJlZmVyZW5jZSB0bwogICAgICAgICB0aGlzIHZhcmlhYmxlIGlzIHBhc3NlZCBhcyB0aGUgcGFyYW1ldGVyIHRvIDxDT0RFPmFpb19pbml0PC9DT0RFPiB3aGljaCBpdHNlbGYKICAgICAgICAgbWF5IG9yIG1heSBub3QgcGF5IGF0dGVudGlvbiB0byB0aGUgaGludHMuCiAgICAgICAgIDxicj48YnI+IFRoZSBmdW5jdGlvbiBoYXMgbm8gcmV0dXJuIHZhbHVlIGFuZCBubyBlcnJvciBjYXNlcyBhcmUgZGVmaW5lZC4gIEl0IGlzCiAgICAgICAgIGEgZXh0ZW5zaW9uIHdoaWNoIGZvbGxvd3MgYSBwcm9wb3NhbCBmcm9tIHRoZSBTR0kgaW1wbGVtZW50YXRpb24gaW4KICAgICAgICAgSXJpeCA2LiAgSXQgaXMgbm90IGNvdmVyZWQgYnkgUE9TSVguMWIgb3IgVW5peDk4LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAVhaW8uaHhxAH4BDXQAGmNvbnN0IHN0cnVjdCBhaW9pbml0ICppbml0dAAEdm9pZHQACGFpb19yZWFkc3EAfgAKdAyRCiAgICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWF0ZXMgYW4gYXN5bmNocm9ub3VzIHJlYWQgb3BlcmF0aW9uLiAgSXQKICAgICAgICAgaW1tZWRpYXRlbHkgcmV0dXJucyBhZnRlciB0aGUgb3BlcmF0aW9uIHdhcyBlbnF1ZXVlZCBvciB3aGVuIGFuCiAgICAgICAgIGVycm9yIHdhcyBlbmNvdW50ZXJlZC4KICAgICAgICAgPGJyPjxicj4gVGhlIGZpcnN0IDxDT0RFPmFpb2NicC0+YWlvX25ieXRlczwvQ09ERT4gYnl0ZXMgb2YgdGhlIGZpbGUgZm9yIHdoaWNoCiAgICAgICAgIDxDT0RFPmFpb2NicC0+YWlvX2ZpbGRlczwvQ09ERT4gaXMgYSBkZXNjcmlwdG9yIGFyZSB3cml0dGVuIHRvIHRoZSBidWZmZXIKICAgICAgICAgc3RhcnRpbmcgYXQgPENPREU+YWlvY2JwLT5haW9fYnVmPC9DT0RFPi4gIFJlYWRpbmcgc3RhcnRzIGF0IHRoZSBhYnNvbHV0ZQogICAgICAgICBwb3NpdGlvbiA8Q09ERT5haW9jYnAtPmFpb19vZmZzZXQ8L0NPREU+IGluIHRoZSBmaWxlLgogICAgICAgICA8YnI+PGJyPiBJZiBwcmlvcml0aXplZCBJL08gaXMgc3VwcG9ydGVkIGJ5IHRoZSBwbGF0Zm9ybSB0aGUKICAgICAgICAgPENPREU+YWlvY2JwLT5haW9fcmVxcHJpbzwvQ09ERT4gdmFsdWUgaXMgdXNlZCB0byBhZGp1c3QgdGhlIHByaW9yaXR5IGJlZm9yZQogICAgICAgICB0aGUgcmVxdWVzdCBpcyBhY3R1YWxseSBlbnF1ZXVlZC4KICAgICAgICAgPGJyPjxicj4gVGhlIGNhbGxpbmcgcHJvY2VzcyBpcyBub3RpZmllZCBhYm91dCB0aGUgdGVybWluYXRpb24gb2YgdGhlIHJlYWQKICAgICAgICAgcmVxdWVzdCBhY2NvcmRpbmcgdG8gdGhlIDxDT0RFPmFpb2NicC0+YWlvX3NpZ2V2ZW50PC9DT0RFPiB2YWx1ZS4KICAgICAgICAgPGJyPjxicj4gV2hlbiA8Q09ERT5haW9fcmVhZDwvQ09ERT4gcmV0dXJucywgdGhlIHJldHVybiB2YWx1ZSBpcyB6ZXJvIGlmIG5vIGVycm9yCiAgICAgICAgIG9jY3VycmVkIHRoYXQgY2FuIGJlIGZvdW5kIGJlZm9yZSB0aGUgcHJvY2VzcyBpcyBlbnF1ZXVlZC4gIElmIHN1Y2ggYW4KICAgICAgICAgZWFybHkgZXJyb3IgaXMgZm91bmQsIHRoZSBmdW5jdGlvbiByZXR1cm5zIC0xIGFuZCBzZXRzCiAgICAgICAgIDxDT0RFPmVycm5vPC9DT0RFPiB0byBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CiAgICAgICAgIDxicj48YnI+IDxETD4KCiAgICAgICAgIDxEVD48Q09ERT5FQUdBSU48L0NPREU+CjxERD4KICAgICAgICAgVGhlIHJlcXVlc3Qgd2FzIG5vdCBlbnF1ZXVlZCBkdWUgdG8gKHRlbXBvcmFyaWx5KSBleGNlZWRlZCByZXNvdXJjZQogICAgICAgICBsaW1pdGF0aW9ucy4KICAgICAgICAgPERUPjxDT0RFPkVOT1NZUzwvQ09ERT4KPEREPgogICAgICAgICBUaGUgPENPREU+YWlvX3JlYWQ8L0NPREU+IGZ1bmN0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4KICAgICAgICAgPExJPiBFQkFERgogICAgICAgICBUaGUgPENPREU+YWlvY2JwLT5haW9fZmlsZGVzPC9DT0RFPiBkZXNjcmlwdG9yIGlzIG5vdCB2YWxpZC4gIFRoaXMgY29uZGl0aW9uCiAgICAgICAgIG5lZWQgbm90IGJlIHJlY29nbml6ZWQgYmVmb3JlIGVucXVldWVpbmcgdGhlIHJlcXVlc3QgYW5kIHNvIHRoaXMgZXJyb3IKICAgICAgICAgbWlnaHQgYWxzbyBiZSBzaWduYWxlZCBhc3luY2hyb25vdXNseS4KICAgICAgICAgPExJPiBFSU5WQUwKICAgICAgICAgVGhlIDxDT0RFPmFpb2NicC0+YWlvX29mZnNldDwvQ09ERT4gb3IgPENPREU+YWlvY2JwLT5haW9fcmVxcGlybzwvQ09ERT4gdmFsdWUgaXMKICAgICAgICAgaW52YWxpZC4gIFRoaXMgY29uZGl0aW9uIG5lZWQgbm90IGJlIHJlY29nbml6ZWQgYmVmb3JlIGVucXVldWVpbmcgdGhlCiAgICAgICAgIHJlcXVlc3QgYW5kIHNvIHRoaXMgZXJyb3IgbWlnaHQgYWxzbyBiZSBzaWduYWxlZCBhc3luY2hyb25vdXNseS4KCiAgICAgICAgIDxicj48YnI+IElmIDxDT0RFPmFpb19yZWFkPC9DT0RFPiByZXR1cm5zIHplcm8sIHRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgcmVxdWVzdAogICAgICAgICBjYW4gYmUgcXVlcmllZCB1c2luZyA8Q09ERT5haW9fZXJyb3I8L0NPREU+IGFuZCA8Q09ERT5haW9fcmV0dXJuPC9DT0RFPiBmdW5jdGlvbnMuCiAgICAgICAgIEFzIGxvbmcgYXMgdGhlIHZhbHVlIHJldHVybmVkIGJ5IDxDT0RFPmFpb19lcnJvcjwvQ09ERT4gaXMgPENPREU+RUlOUFJPR1JFU1M8L0NPREU+CiAgICAgICAgIHRoZSBvcGVyYXRpb24gaGFzIG5vdCB5ZXQgY29tcGxldGVkLiAgSWYgPENPREU+YWlvX2Vycm9yPC9DT0RFPiByZXR1cm5zIHplcm8sCiAgICAgICAgIHRoZSBvcGVyYXRpb24gc3VjY2Vzc2Z1bGx5IHRlcm1pbmF0ZWQsIG90aGVyd2lzZSB0aGUgdmFsdWUgaXMgdG8gYmUKICAgICAgICAgaW50ZXJwcmV0ZWQgYXMgYW4gZXJyb3IgY29kZS4gIElmIHRoZSBmdW5jdGlvbiB0ZXJtaW5hdGVkLCB0aGUgcmVzdWx0IG9mCiAgICAgICAgIHRoZSBvcGVyYXRpb24gY2FuIGJlIG9idGFpbmVkIHVzaW5nIGEgY2FsbCB0byA8Q09ERT5haW9fcmV0dXJuPC9DT0RFPi4gIFRoZQogICAgICAgICByZXR1cm5lZCB2YWx1ZSBpcyB0aGUgc2FtZSBhcyBhbiBlcXVpdmFsZW50IGNhbGwgdG8gPENPREU+cmVhZDwvQ09ERT4gd291bGQKICAgICAgICAgaGF2ZSByZXR1cm5lZC4gIFBvc3NpYmxlIGVycm9yIGNvZGVzIHJldHVybmVkIGJ5IDxDT0RFPmFpb19lcnJvcjwvQ09ERT4gYXJlOgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8TEk+IEVCQURGCiAgICAgICAgIFRoZSA8Q09ERT5haW9jYnAtPmFpb19maWxkZXM8L0NPREU+IGRlc2NyaXB0b3IgaXMgbm90IHZhbGlkLgogICAgICAgICA8TEk+IEVDQU5DRUxFRAogICAgICAgICBUaGUgb3BlcmF0aW9uIHdhcyBjYW5jZWxlZCBiZWZvcmUgdGhlIG9wZXJhdGlvbiB3YXMgZmluaXNoZWQKCiAgICAgICAgIDxMST4gRUlOVkFMCiAgICAgICAgIFRoZSA8Q09ERT5haW9jYnAtPmFpb19vZmZzZXQ8L0NPREU+IHZhbHVlIGlzIGludmFsaWQuCgogICAgICAgICA8YnI+PGJyPiBXaGVuIHRoZSBzb3VyY2VzIGFyZSBjb21waWxlZCB3aXRoIDxDT0RFPl9GSUxFX09GRlNFVF9CSVRTID09IDY0PC9DT0RFPiB0aGlzCiAgICAgICAgIGZ1bmN0aW9uIGlzIGluIGZhY3QgPENPREU+YWlvX3JlYWQ2NDwvQ09ERT4gc2luY2UgdGhlIExGUyBpbnRlcmZhY2UgdHJhbnNwYXJlbnRseQogICAgICAgICByZXBsYWNlcyB0aGUgbm9ybWFsIGltcGxlbWVudGF0aW9uLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAVhaW8uaHhxAH4BFHQAFHN0cnVjdCBhaW9jYiAqYWlvY2JwdAADaW50dAAKYWlvX3JlYWQ2NHNxAH4ACnQCxQogICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byB0aGUgPENPREU+YWlvX3JlYWQ8L0NPREU+IGZ1bmN0aW9uLiAgVGhlIG9ubHkKICAgICAgICAgZGlmZmVyZW5jZSBpcyB0aGF0IG9uIDMyIGJpdCBtYWNoaW5lcywgdGhlIGZpbGUgZGVzY3JpcHRvciBzaG91bGQKICAgICAgICAgYmUgb3BlbmVkIGluIHRoZSBsYXJnZSBmaWxlIG1vZGUuICBJbnRlcm5hbGx5LCA8Q09ERT5haW9fcmVhZDY0PC9DT0RFPiB1c2VzCiAgICAgICAgIGZ1bmN0aW9uYWxpdHkgZXF1aXZhbGVudCB0byA8Q09ERT5sc2VlazY0PC9DT0RFPiAgdG8gcG9zaXRpb24gdGhlIGZpbGUgZGVzY3JpcHRvciBjb3JyZWN0bHkgZm9yIHRoZSByZWFkaW5nLAogICAgICAgICBhcyBvcHBvc2VkIHRvIDxDT0RFPmxzZWVrPC9DT0RFPiBmdW5jdGlvbmFsaXR5IHVzZWQgaW4gPENPREU+YWlvX3JlYWQ8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBXaGVuIHRoZSBzb3VyY2VzIGFyZSBjb21waWxlZCB3aXRoIDxDT0RFPl9GSUxFX09GRlNFVF9CSVRTID09IDY0PC9DT0RFPiwgdGhpcwogICAgICAgICBmdW5jdGlvbiBpcyBhdmFpbGFibGUgdW5kZXIgdGhlIG5hbWUgPENPREU+YWlvX3JlYWQ8L0NPREU+IGFuZCBzbyB0cmFuc3BhcmVudGx5CiAgICAgICAgIHJlcGxhY2VzIHRoZSBpbnRlcmZhY2UgZm9yIHNtYWxsIGZpbGVzIG9uIDMyIGJpdCBtYWNoaW5lcy4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAFYWlvLmh4cQB+ARt0ABRzdHJ1Y3QgYWlvY2IgKmFpb2NicHQAA2ludHQACmFpb19yZXR1cm5zcQB+AAp0BLAKICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIHRoZSByZXR1cm4gc3RhdHVzIG9mIHRoZSBvcGVyYXRpb24KICAgICAgICAgY2FycmllZCBvdXQgYnkgdGhlIHJlcXVlc3QgZGVzY3JpYmVkIGluIHRoZSB2YXJpYWJsZSBwb2ludGVkIHRvIGJ5CiAgICAgICAgIDxWQVI+YWlvY2JwPC9WQVI+LiAgQXMgbG9uZyBhcyB0aGUgZXJyb3Igc3RhdHVzIG9mIHRoaXMgcmVxdWVzdCBhcyByZXR1cm5lZAogICAgICAgICBieSA8Q09ERT5haW9fZXJyb3I8L0NPREU+IGlzIDxDT0RFPkVJTlBST0dSRVNTPC9DT0RFPiB0aGUgcmV0dXJuIG9mIHRoaXMgZnVuY3Rpb24gaXMKICAgICAgICAgdW5kZWZpbmVkLgogICAgICAgICA8YnI+PGJyPiBPbmNlIHRoZSByZXF1ZXN0IGlzIGZpbmlzaGVkIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgZXhhY3RseSBvbmNlIHRvCiAgICAgICAgIHJldHJpZXZlIHRoZSByZXR1cm4gdmFsdWUuICBGb2xsb3dpbmcgY2FsbHMgbWlnaHQgbGVhZCB0byB1bmRlZmluZWQKICAgICAgICAgYmVoYXZpb3IuICBUaGUgcmV0dXJuIHZhbHVlIGl0c2VsZiBpcyB0aGUgdmFsdWUgd2hpY2ggd291bGQgaGF2ZSBiZWVuCiAgICAgICAgIHJldHVybmVkIGJ5IHRoZSA8Q09ERT5yZWFkPC9DT0RFPiwgPENPREU+d3JpdGU8L0NPREU+LCBvciA8Q09ERT5mc3luYzwvQ09ERT4gY2FsbC4KICAgICAgICAgPGJyPjxicj4gVGhlIGZ1bmN0aW9uIGNhbiByZXR1cm4gPENPREU+RU5PU1lTPC9DT0RFPiBpZiBpdCBpcyBub3QgaW1wbGVtZW50ZWQuICBJdAogICAgICAgICBjb3VsZCBhbHNvIHJldHVybiA8Q09ERT5FSU5WQUw8L0NPREU+IGlmIHRoZSA8VkFSPmFpb2NicDwvVkFSPiBwYXJhbWV0ZXIgZG9lcyBub3QKICAgICAgICAgcmVmZXIgdG8gYW4gYXN5bmNocm9ub3VzIG9wZXJhdGlvbiB3aG9zZSByZXR1cm4gc3RhdHVzIGlzIG5vdCB5ZXQga25vd24uCiAgICAgICAgIDxicj48YnI+IFdoZW4gdGhlIHNvdXJjZXMgYXJlIGNvbXBpbGVkIHdpdGggPENPREU+X0ZJTEVfT0ZGU0VUX0JJVFMgPT0gNjQ8L0NPREU+IHRoaXMKICAgICAgICAgZnVuY3Rpb24gaXMgaW4gZmFjdCA8Q09ERT5haW9fcmV0dXJuNjQ8L0NPREU+IHNpbmNlIHRoZSBMRlMgaW50ZXJmYWNlCiAgICAgICAgIHRyYW5zcGFyZW50bHkgcmVwbGFjZXMgdGhlIG5vcm1hbCBpbXBsZW1lbnRhdGlvbi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAFYWlvLmh4cQB+ASJ0ABpjb25zdCBzdHJ1Y3QgYWlvY2IgKmFpb2NicHQAB3NzaXplX3R0AAxhaW9fcmV0dXJuNjRzcQB+AAp0AcsKICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gPENPREU+YWlvX3JldHVybjwvQ09ERT4gd2l0aCB0aGUgb25seSBkaWZmZXJlbmNlCiAgICAgICAgIHRoYXQgdGhlIGFyZ3VtZW50IGlzIGEgcmVmZXJlbmNlIHRvIGEgdmFyaWFibGUgb2YgdHlwZSA8Q09ERT5zdHJ1Y3QKICAgICAgICAgYWlvY2I2NDwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IFdoZW4gdGhlIHNvdXJjZXMgYXJlIGNvbXBpbGVkIHdpdGggPENPREU+X0ZJTEVfT0ZGU0VUX0JJVFMgPT0gNjQ8L0NPREU+IHRoaXMKICAgICAgICAgZnVuY3Rpb24gaXMgYXZhaWxhYmxlIHVuZGVyIHRoZSBuYW1lIDxDT0RFPmFpb19yZXR1cm48L0NPREU+IGFuZCBzbwogICAgICAgICB0cmFuc3BhcmVudGx5IHJlcGxhY2VzIHRoZSBpbnRlcmZhY2UgZm9yIHNtYWxsIGZpbGVzIG9uIDMyIGJpdAogICAgICAgICBtYWNoaW5lcy4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAFYWlvLmh4cQB+ASl0ABxjb25zdCBzdHJ1Y3QgYWlvY2I2NCAqYWlvY2JwdAADaW50dAALYWlvX3N1c3BlbmRzcQB+AAp0B7MKICAgICAgICBXaGVuIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiwgdGhlIGNhbGxpbmcgdGhyZWFkIGlzIHN1c3BlbmRlZCB1bnRpbCBhdAogICAgICAgICBsZWFzdCBvbmUgb2YgdGhlIHJlcXVlc3RzIHBvaW50ZWQgdG8gYnkgdGhlIDxWQVI+bmVudDwvVkFSPiBlbGVtZW50cyBvZiB0aGUKICAgICAgICAgYXJyYXkgPFZBUj5saXN0PC9WQVI+IGhhcyBjb21wbGV0ZWQuICBJZiBhbnkgb2YgdGhlIHJlcXVlc3RzIGhhcyBhbHJlYWR5CiAgICAgICAgIGNvbXBsZXRlZCBhdCB0aGUgdGltZSA8Q09ERT5haW9fc3VzcGVuZDwvQ09ERT4gaXMgY2FsbGVkLCB0aGUgZnVuY3Rpb24gcmV0dXJucwogICAgICAgICBpbW1lZGlhdGVseS4gIFdoZXRoZXIgYSByZXF1ZXN0IGhhcyB0ZXJtaW5hdGVkIG9yIG5vdCBpcyBkZXRlcm1pbmVkIGJ5CiAgICAgICAgIGNvbXBhcmluZyB0aGUgZXJyb3Igc3RhdHVzIG9mIHRoZSByZXF1ZXN0IHdpdGggPENPREU+RUlOUFJPR1JFU1M8L0NPREU+LiAgSWYKICAgICAgICAgYW4gZWxlbWVudCBvZiA8VkFSPmxpc3Q8L1ZBUj4gaXMgPENPREU+TlVMTDwvQ09ERT4sIHRoZSBlbnRyeSBpcyBzaW1wbHkgaWdub3JlZC4KICAgICAgICAgPGJyPjxicj4gSWYgbm8gcmVxdWVzdCBoYXMgZmluaXNoZWQsIHRoZSBjYWxsaW5nIHByb2Nlc3MgaXMgc3VzcGVuZGVkLiAgSWYKICAgICAgICAgPFZBUj50aW1lb3V0PC9WQVI+IGlzIDxDT0RFPk5VTEw8L0NPREU+LCB0aGUgcHJvY2VzcyBpcyBub3Qgd29rZW4gdW50aWwgYSByZXF1ZXN0CiAgICAgICAgIGhhcyBmaW5pc2hlZC4gIElmIDxWQVI+dGltZW91dDwvVkFSPiBpcyBub3QgPENPREU+TlVMTDwvQ09ERT4sIHRoZSBwcm9jZXNzIHJlbWFpbnMKICAgICAgICAgc3VzcGVuZGVkIGF0IGxlYXN0IGFzIGxvbmcgYXMgc3BlY2lmaWVkIGluIDxWQVI+dGltZW91dDwvVkFSPi4gIEluIHRoaXMgY2FzZSwKICAgICAgICAgPENPREU+YWlvX3N1c3BlbmQ8L0NPREU+IHJldHVybnMgd2l0aCBhbiBlcnJvci4KICAgICAgICAgPGJyPjxicj4gVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24gaXMgMCBpZiBvbmUgb3IgbW9yZSByZXF1ZXN0cwogICAgICAgICBmcm9tIHRoZSA8VkFSPmxpc3Q8L1ZBUj4gaGF2ZSB0ZXJtaW5hdGVkLiAgT3RoZXJ3aXNlIHRoZSBmdW5jdGlvbiByZXR1cm5zCiAgICAgICAgIC0xIGFuZCA8Q09ERT5lcnJubzwvQ09ERT4gaXMgc2V0IHRvIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICAgICAgICAgPGJyPjxicj4gPERMPgoKICAgICAgICAgPERUPjxDT0RFPkVBR0FJTjwvQ09ERT4KPEREPgogICAgICAgICBOb25lIG9mIHRoZSByZXF1ZXN0cyBmcm9tIHRoZSA8VkFSPmxpc3Q8L1ZBUj4gY29tcGxldGVkIGluIHRoZSB0aW1lIHNwZWNpZmllZAogICAgICAgICBieSA8VkFSPnRpbWVvdXQ8L1ZBUj4uCiAgICAgICAgIDxMST4gRUlOVFIKICAgICAgICAgQSBzaWduYWwgaW50ZXJydXB0ZWQgdGhlIDxDT0RFPmFpb19zdXNwZW5kPC9DT0RFPiBmdW5jdGlvbi4gIFRoaXMgc2lnbmFsIG1pZ2h0CiAgICAgICAgIGFsc28gYmUgc2VudCBieSB0aGUgQUlPIGltcGxlbWVudGF0aW9uIHdoaWxlIHNpZ25hbGxpbmcgdGhlIHRlcm1pbmF0aW9uCiAgICAgICAgIG9mIG9uZSBvZiB0aGUgcmVxdWVzdHMuCiAgICAgICAgIDxMST4gRU5PU1lTCiAgICAgICAgIFRoZSA8Q09ERT5haW9fc3VzcGVuZDwvQ09ERT4gZnVuY3Rpb24gaXMgbm90IGltcGxlbWVudGVkLgoKICAgICAgICAgPGJyPjxicj4gV2hlbiB0aGUgc291cmNlcyBhcmUgY29tcGlsZWQgd2l0aCA8Q09ERT5fRklMRV9PRkZTRVRfQklUUyA9PSA2NDwvQ09ERT4gdGhpcwogICAgICAgICBmdW5jdGlvbiBpcyBpbiBmYWN0IDxDT0RFPmFpb19zdXNwZW5kNjQ8L0NPREU+IHNpbmNlIHRoZSBMRlMgaW50ZXJmYWNlCiAgICAgICAgIHRyYW5zcGFyZW50bHkgcmVwbGFjZXMgdGhlIG5vcm1hbCBpbXBsZW1lbnRhdGlvbi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAFYWlvLmh4cQB+ATB0AEpjb25zdCBzdHJ1Y3QgYWlvY2IgKmNvbnN0IGxpc3RbXSwgaW50IG5lbnQsIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqdGltZW91dHQAA2ludHQADWFpb19zdXNwZW5kNjRzcQB+AAp0Ac0KICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gPENPREU+YWlvX3N1c3BlbmQ8L0NPREU+IHdpdGggdGhlIG9ubHkgZGlmZmVyZW5jZQogICAgICAgICB0aGF0IHRoZSBhcmd1bWVudCBpcyBhIHJlZmVyZW5jZSB0byBhIHZhcmlhYmxlIG9mIHR5cGUgPENPREU+c3RydWN0CiAgICAgICAgIGFpb2NiNjQ8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBXaGVuIHRoZSBzb3VyY2VzIGFyZSBjb21waWxlZCB3aXRoIDxDT0RFPl9GSUxFX09GRlNFVF9CSVRTID09IDY0PC9DT0RFPiB0aGlzCiAgICAgICAgIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSB1bmRlciB0aGUgbmFtZSA8Q09ERT5haW9fc3VzcGVuZDwvQ09ERT4gYW5kIHNvCiAgICAgICAgIHRyYW5zcGFyZW50bHkgcmVwbGFjZXMgdGhlIGludGVyZmFjZSBmb3Igc21hbGwgZmlsZXMgb24gMzIgYml0CiAgICAgICAgIG1hY2hpbmVzLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAVhaW8uaHhxAH4BN3QATGNvbnN0IHN0cnVjdCBhaW9jYjY0ICpjb25zdCBsaXN0W10sIGludCBuZW50LCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVvdXR0AANpbnR0AAlhaW9fd3JpdGVzcQB+AAp0DMIKICAgICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYXRlcyBhbiBhc3luY2hyb25vdXMgd3JpdGUgb3BlcmF0aW9uLiAgVGhlIGZ1bmN0aW9uCiAgICAgICAgIGNhbGwgaW1tZWRpYXRlbHkgcmV0dXJucyBhZnRlciB0aGUgb3BlcmF0aW9uIHdhcyBlbnF1ZXVlZCBvciBpZiBiZWZvcmUKICAgICAgICAgdGhpcyBoYXBwZW5zIGFuIGVycm9yIHdhcyBlbmNvdW50ZXJlZC4KICAgICAgICAgPGJyPjxicj4gVGhlIGZpcnN0IDxDT0RFPmFpb2NicC0+YWlvX25ieXRlczwvQ09ERT4gYnl0ZXMgZnJvbSB0aGUgYnVmZmVyIHN0YXJ0aW5nIGF0CiAgICAgICAgIDxDT0RFPmFpb2NicC0+YWlvX2J1ZjwvQ09ERT4gYXJlIHdyaXR0ZW4gdG8gdGhlIGZpbGUgZm9yIHdoaWNoCiAgICAgICAgIDxDT0RFPmFpb2NicC0+YWlvX2ZpbGRlczwvQ09ERT4gaXMgYW4gZGVzY3JpcHRvciwgc3RhcnRpbmcgYXQgdGhlIGFic29sdXRlCiAgICAgICAgIHBvc2l0aW9uIDxDT0RFPmFpb2NicC0+YWlvX29mZnNldDwvQ09ERT4gaW4gdGhlIGZpbGUuCiAgICAgICAgIDxicj48YnI+IElmIHByaW9yaXRpemVkIEkvTyBpcyBzdXBwb3J0ZWQgYnkgdGhlIHBsYXRmb3JtLCB0aGUKICAgICAgICAgPENPREU+YWlvY2JwLT5haW9fcmVxcHJpbzwvQ09ERT4gdmFsdWUgaXMgdXNlZCB0byBhZGp1c3QgdGhlIHByaW9yaXR5IGJlZm9yZQogICAgICAgICB0aGUgcmVxdWVzdCBpcyBhY3R1YWxseSBlbnF1ZXVlZC4KICAgICAgICAgPGJyPjxicj4gVGhlIGNhbGxpbmcgcHJvY2VzcyBpcyBub3RpZmllZCBhYm91dCB0aGUgdGVybWluYXRpb24gb2YgdGhlIHJlYWQKICAgICAgICAgcmVxdWVzdCBhY2NvcmRpbmcgdG8gdGhlIDxDT0RFPmFpb2NicC0+YWlvX3NpZ2V2ZW50PC9DT0RFPiB2YWx1ZS4KICAgICAgICAgPGJyPjxicj4gV2hlbiA8Q09ERT5haW9fd3JpdGU8L0NPREU+IHJldHVybnMsIHRoZSByZXR1cm4gdmFsdWUgaXMgemVybyBpZiBubyBlcnJvcgogICAgICAgICBvY2N1cnJlZCB0aGF0IGNhbiBiZSBmb3VuZCBiZWZvcmUgdGhlIHByb2Nlc3MgaXMgZW5xdWV1ZWQuICBJZiBzdWNoIGFuCiAgICAgICAgIGVhcmx5IGVycm9yIGlzIGZvdW5kIHRoZSBmdW5jdGlvbiByZXR1cm5zIC0xIGFuZCBzZXRzCiAgICAgICAgIDxDT0RFPmVycm5vPC9DT0RFPiB0byBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMuCiAgICAgICAgIDxicj48YnI+IDxETD4KCiAgICAgICAgIDxEVD48Q09ERT5FQUdBSU48L0NPREU+CjxERD4KICAgICAgICAgVGhlIHJlcXVlc3Qgd2FzIG5vdCBlbnF1ZXVlZCBkdWUgdG8gKHRlbXBvcmFyaWx5KSBleGNlZWRlZCByZXNvdXJjZQogICAgICAgICBsaW1pdGF0aW9ucy4KICAgICAgICAgPERUPjxDT0RFPkVOT1NZUzwvQ09ERT4KPEREPgogICAgICAgICBUaGUgPENPREU+YWlvX3dyaXRlPC9DT0RFPiBmdW5jdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuCiAgICAgICAgIDxMST4gRUJBREYKICAgICAgICAgVGhlIDxDT0RFPmFpb2NicC0+YWlvX2ZpbGRlczwvQ09ERT4gZGVzY3JpcHRvciBpcyBub3QgdmFsaWQuICBUaGlzIGNvbmRpdGlvbgogICAgICAgICBtYXkgbm90IGJlIHJlY29nbml6ZWQgYmVmb3JlIGVucXVldWVpbmcgdGhlIHJlcXVlc3QsIGFuZCBzbyB0aGlzIGVycm9yCiAgICAgICAgIG1pZ2h0IGFsc28gYmUgc2lnbmFsZWQgYXN5bmNocm9ub3VzbHkuCiAgICAgICAgIDxMST4gRUlOVkFMCiAgICAgICAgIFRoZSA8Q09ERT5haW9jYnAtPmFpb19vZmZzZXQ8L0NPREU+IG9yIDxDT0RFPmFpb2NicC0+YWlvX3JlcXByaW88L0NPREU+IHZhbHVlIGlzCiAgICAgICAgIGludmFsaWQuICBUaGlzIGNvbmRpdGlvbiBtYXkgbm90IGJlIHJlY29nbml6ZWQgYmVmb3JlIGVucXVldWVpbmcgdGhlCiAgICAgICAgIHJlcXVlc3QgYW5kIHNvIHRoaXMgZXJyb3IgbWlnaHQgYWxzbyBiZSBzaWduYWxlZCBhc3luY2hyb25vdXNseS4KCiAgICAgICAgIDxicj48YnI+IEluIHRoZSBjYXNlIDxDT0RFPmFpb193cml0ZTwvQ09ERT4gcmV0dXJucyB6ZXJvLCB0aGUgY3VycmVudCBzdGF0dXMgb2YgdGhlCiAgICAgICAgIHJlcXVlc3QgY2FuIGJlIHF1ZXJpZWQgdXNpbmcgPENPREU+YWlvX2Vycm9yPC9DT0RFPiBhbmQgPENPREU+YWlvX3JldHVybjwvQ09ERT4KICAgICAgICAgZnVuY3Rpb25zLiAgQXMgbG9uZyBhcyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgPENPREU+YWlvX2Vycm9yPC9DT0RFPiBpcwogICAgICAgICA8Q09ERT5FSU5QUk9HUkVTUzwvQ09ERT4gdGhlIG9wZXJhdGlvbiBoYXMgbm90IHlldCBjb21wbGV0ZWQuICBJZgogICAgICAgICA8Q09ERT5haW9fZXJyb3I8L0NPREU+IHJldHVybnMgemVybywgdGhlIG9wZXJhdGlvbiBzdWNjZXNzZnVsbHkgdGVybWluYXRlZCwKICAgICAgICAgb3RoZXJ3aXNlIHRoZSB2YWx1ZSBpcyB0byBiZSBpbnRlcnByZXRlZCBhcyBhbiBlcnJvciBjb2RlLiAgSWYgdGhlCiAgICAgICAgIGZ1bmN0aW9uIHRlcm1pbmF0ZWQsIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiBjYW4gYmUgZ2V0IHVzaW5nIGEgY2FsbAogICAgICAgICB0byA8Q09ERT5haW9fcmV0dXJuPC9DT0RFPi4gIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyB0aGUgc2FtZSBhcyBhbiBlcXVpdmFsZW50CiAgICAgICAgIGNhbGwgdG8gPENPREU+cmVhZDwvQ09ERT4gd291bGQgaGF2ZSByZXR1cm5lZC4gIFBvc3NpYmxlIGVycm9yIGNvZGVzIHJldHVybmVkCiAgICAgICAgIGJ5IDxDT0RFPmFpb19lcnJvcjwvQ09ERT4gYXJlOgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8TEk+IEVCQURGCiAgICAgICAgIFRoZSA8Q09ERT5haW9jYnAtPmFpb19maWxkZXM8L0NPREU+IGRlc2NyaXB0b3IgaXMgbm90IHZhbGlkLgogICAgICAgICA8TEk+IEVDQU5DRUxFRAogICAgICAgICBUaGUgb3BlcmF0aW9uIHdhcyBjYW5jZWxlZCBiZWZvcmUgdGhlIG9wZXJhdGlvbiB3YXMgZmluaXNoZWQuCgogICAgICAgICA8TEk+IEVJTlZBTAogICAgICAgICBUaGUgPENPREU+YWlvY2JwLT5haW9fb2Zmc2V0PC9DT0RFPiB2YWx1ZSBpcyBpbnZhbGlkLgoKICAgICAgICAgPGJyPjxicj4gV2hlbiB0aGUgc291cmNlcyBhcmUgY29tcGlsZWQgd2l0aCA8Q09ERT5fRklMRV9PRkZTRVRfQklUUyA9PSA2NDwvQ09ERT4sIHRoaXMKICAgICAgICAgZnVuY3Rpb24gaXMgaW4gZmFjdCA8Q09ERT5haW9fd3JpdGU2NDwvQ09ERT4gc2luY2UgdGhlIExGUyBpbnRlcmZhY2UgdHJhbnNwYXJlbnRseQogICAgICAgICByZXBsYWNlcyB0aGUgbm9ybWFsIGltcGxlbWVudGF0aW9uLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAVhaW8uaHhxAH4BPnQAFHN0cnVjdCBhaW9jYiAqYWlvY2JwdAADaW50dAALYWlvX3dyaXRlNjRzcQB+AAp0AscKICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gdGhlIDxDT0RFPmFpb193cml0ZTwvQ09ERT4gZnVuY3Rpb24uICBUaGUgb25seQogICAgICAgICBkaWZmZXJlbmNlIGlzIHRoYXQgb24gMzIgYml0IG1hY2hpbmVzIHRoZSBmaWxlIGRlc2NyaXB0b3Igc2hvdWxkCiAgICAgICAgIGJlIG9wZW5lZCBpbiB0aGUgbGFyZ2UgZmlsZSBtb2RlLiAgSW50ZXJuYWxseSA8Q09ERT5haW9fd3JpdGU2NDwvQ09ERT4gdXNlcwogICAgICAgICBmdW5jdGlvbmFsaXR5IGVxdWl2YWxlbnQgdG8gPENPREU+bHNlZWs2NDwvQ09ERT4gIHRvIHBvc2l0aW9uIHRoZSBmaWxlIGRlc2NyaXB0b3IgY29ycmVjdGx5IGZvciB0aGUgd3JpdGluZywKICAgICAgICAgYXMgb3Bwb3NlZCB0byA8Q09ERT5sc2VlazwvQ09ERT4gZnVuY3Rpb25hbGl0eSB1c2VkIGluIDxDT0RFPmFpb193cml0ZTwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IFdoZW4gdGhlIHNvdXJjZXMgYXJlIGNvbXBpbGVkIHdpdGggPENPREU+X0ZJTEVfT0ZGU0VUX0JJVFMgPT0gNjQ8L0NPREU+LCB0aGlzCiAgICAgICAgIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSB1bmRlciB0aGUgbmFtZSA8Q09ERT5haW9fd3JpdGU8L0NPREU+IGFuZCBzbyB0cmFuc3BhcmVudGx5CiAgICAgICAgIHJlcGxhY2VzIHRoZSBpbnRlcmZhY2UgZm9yIHNtYWxsIGZpbGVzIG9uIDMyIGJpdCBtYWNoaW5lcy4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAFYWlvLmh4cQB+AUV0ABRzdHJ1Y3QgYWlvY2IgKmFpb2NicHQAA2ludHQABWFsYXJtc3EAfgAKdAHbCiAgICAgICAgVGhlIDxDT0RFPmFsYXJtPC9DT0RFPiBmdW5jdGlvbiBzZXRzIHRoZSByZWFsLXRpbWUgdGltZXIgdG8gZXhwaXJlIGluCiAgICAgICAgIDxWQVI+c2Vjb25kczwvVkFSPiBzZWNvbmRzLiAgSWYgeW91IHdhbnQgdG8gY2FuY2VsIGFueSBleGlzdGluZyBhbGFybSwgeW91CiAgICAgICAgIGNhbiBkbyB0aGlzIGJ5IGNhbGxpbmcgPENPREU+YWxhcm08L0NPREU+IHdpdGggYSA8VkFSPnNlY29uZHM8L1ZBUj4gYXJndW1lbnQgb2YKICAgICAgICAgemVyby4KICAgICAgICAgPGJyPjxicj4gVGhlIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgaG93IG1hbnkgc2Vjb25kcyByZW1haW4gYmVmb3JlIHRoZSBwcmV2aW91cwogICAgICAgICBhbGFybSB3b3VsZCBoYXZlIGJlZW4gc2VudC4gIElmIHRoZXJlIGlzIG5vIHByZXZpb3VzIGFsYXJtLCA8Q09ERT5hbGFybTwvQ09ERT4KICAgICAgICAgcmV0dXJucyB6ZXJvLgogICAgICAgIHNxAH4ADwAAAAJ3BAAAAAJ0AApzeXMvdGltZS5odAAIdW5pc3RkLmh4cQB+AUx0ABR1bnNpZ25lZCBpbnQgc2Vjb25kc3QADHVuc2lnbmVkIGludHQABmFsbG9jYXNxAH4ACnQAtgogICAgICAgIFRoZSByZXR1cm4gdmFsdWUgb2YgPENPREU+YWxsb2NhPC9DT0RFPiBpcyB0aGUgYWRkcmVzcyBvZiBhIGJsb2NrIG9mIDxWQVI+c2l6ZTwvVkFSPgogICAgICAgICBieXRlcyBvZiBtZW1vcnksIGFsbG9jYXRlZCBpbiB0aGUgc3RhY2sgZnJhbWUgb2YgdGhlIGNhbGxpbmcgZnVuY3Rpb24uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHN0ZGxpYi5oeHEAfgFUdAALc2l6ZV90IHNpemV0AAZ2b2lkICp0AAlhbHBoYXNvcnRzcQB+AAp0AbcKICAgICAgICBUaGUgPENPREU+YWxwaGFzb3J0PC9DT0RFPiBmdW5jdGlvbiBiZWhhdmVzIGxpa2UgdGhlIDxDT0RFPnN0cmNvbGw8L0NPREU+IGZ1bmN0aW9uCiAgICAgICAgIC4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlIGFyZ3VtZW50cwogICAgICAgICBhcmUgbm90IHN0cmluZyBwb2ludGVycyBidXQgaW5zdGVhZCB0aGV5IGFyZSBvZiB0eXBlCiAgICAgICAgIDxDT0RFPnN0cnVjdCBkaXJlbnQgKio8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBUaGUgcmV0dXJuIHZhbHVlIG9mIDxDT0RFPmFscGhhc29ydDwvQ09ERT4gaXMgbGVzcyB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlcgogICAgICAgICB0aGFuIHplcm8gZGVwZW5kaW5nIG9uIHRoZSBvcmRlciBvZiB0aGUgdHdvIGVudHJpZXMgPFZBUj5hPC9WQVI+IGFuZCA8VkFSPmI8L1ZBUj4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACGRpcmVudC5oeHEAfgFbdAAcY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYnQAA2ludHQAC2FscGhhc29ydDY0c3EAfgAKdAG5CiAgICAgICAgVGhlIDxDT0RFPmFscGhhc29ydDY0PC9DT0RFPiBmdW5jdGlvbiBiZWhhdmVzIGxpa2UgdGhlIDxDT0RFPnN0cmNvbGw8L0NPREU+IGZ1bmN0aW9uCiAgICAgICAgIC4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlIGFyZ3VtZW50cwogICAgICAgICBhcmUgbm90IHN0cmluZyBwb2ludGVycyBidXQgaW5zdGVhZCB0aGV5IGFyZSBvZiB0eXBlCiAgICAgICAgIDxDT0RFPnN0cnVjdCBkaXJlbnQ2NCAqKjwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IFJldHVybiB2YWx1ZSBvZiA8Q09ERT5hbHBoYXNvcnQ2NDwvQ09ERT4gaXMgbGVzcyB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlcgogICAgICAgICB0aGFuIHplcm8gZGVwZW5kaW5nIG9uIHRoZSBvcmRlciBvZiB0aGUgdHdvIGVudHJpZXMgPFZBUj5hPC9WQVI+IGFuZCA8VkFSPmI8L1ZBUj4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACGRpcmVudC5oeHEAfgFidAAcY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYnQAA2ludHQACmFyZ3BfZXJyb3JzcQB+AAp0AT4KICAgICAgICBQcmludHMgdGhlIHByaW50ZiBmb3JtYXQgc3RyaW5nIDxWQVI+Zm10PC9WQVI+IGFuZCBmb2xsb3dpbmcgYXJncywgcHJlY2VkZWQKICAgICAgICAgYnkgdGhlIHByb2dyYW0gbmFtZSBhbmQgPHNhbXA+Ojwvc2FtcD4sIGFuZCBmb2xsb3dlZCBieSBhIDxzYW1wPlRyeSA8c21hbGw+Li4uPC9zbWFsbD4KICAgICAgICAgLS1oZWxwPC9zYW1wPiBtZXNzYWdlLCBhbmQgdGVybWluYXRlcyB0aGUgcHJvZ3JhbSB3aXRoIGFuIGV4aXQgc3RhdHVzIG9mCiAgICAgICAgIDxDT0RFPmFyZ3BfZXJyX2V4aXRfc3RhdHVzPC9DT0RFPi4gIC4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGYXJncC5oeHEAfgFpdAA0Y29uc3Qgc3RydWN0IGFyZ3Bfc3RhdGUgKnN0YXRlLCBjb25zdCBjaGFyICpmbXQsIC4uLnQABHZvaWR0AAxhcmdwX2ZhaWx1cmVzcQB+AAp0AzsKICAgICAgICBTaW1pbGFyIHRvIHRoZSBzdGFuZGFyZCBnbnUgZXJyb3ItcmVwb3J0aW5nIGZ1bmN0aW9uIDxDT0RFPmVycm9yPC9DT0RFPiwgdGhpcwogICAgICAgICBwcmludHMgdGhlIHByb2dyYW0gbmFtZSBhbmQgPHNhbXA+Ojwvc2FtcD4sIHRoZSBwcmludGYgZm9ybWF0IHN0cmluZwogICAgICAgICA8VkFSPmZtdDwvVkFSPiwgYW5kIHRoZSBhcHByb3ByaWF0ZSBmb2xsb3dpbmcgYXJncy4gIElmIGl0IGlzIG5vbi16ZXJvLCB0aGUKICAgICAgICAgc3RhbmRhcmQgdW5peCBlcnJvciB0ZXh0IGZvciA8VkFSPmVycm51bTwvVkFSPiBpcyBwcmludGVkLiAgSWYgPFZBUj5zdGF0dXM8L1ZBUj4gaXMKICAgICAgICAgbm9uLXplcm8sIGl0IHRlcm1pbmF0ZXMgdGhlIHByb2dyYW0gd2l0aCB0aGF0IHZhbHVlIGFzIGl0cyBleGl0IHN0YXR1cy4KICAgICAgICAgPGJyPjxicj4gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiA8Q09ERT5hcmdwX2ZhaWx1cmU8L0NPREU+IGFuZCA8Q09ERT5hcmdwX2Vycm9yPC9DT0RFPiBpcyB0aGF0CiAgICAgICAgIDxDT0RFPmFyZ3BfZXJyb3I8L0NPREU+IGlzIGZvciA8RU0+cGFyc2luZyBlcnJvcnM8L0VNPiwgd2hlcmVhcwogICAgICAgICA8Q09ERT5hcmdwX2ZhaWx1cmU8L0NPREU+IGlzIGZvciBvdGhlciBwcm9ibGVtcyB0aGF0IG9jY3VyIGR1cmluZyBwYXJzaW5nIGJ1dAogICAgICAgICBkb24ndCByZWZsZWN0IGEgc3ludGFjdGljIHByb2JsZW0gd2l0aCB0aGUgaW5wdXQsIHN1Y2ggYXMgaWxsZWdhbCB2YWx1ZXMKICAgICAgICAgZm9yIG9wdGlvbnMsIGJhZCBwaGFzZSBvZiB0aGUgbW9vbiwgZXRjLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZhcmdwLmh4cQB+AXB0AExjb25zdCBzdHJ1Y3QgYXJncF9zdGF0ZSAqc3RhdGUsIGludCBzdGF0dXMsIGludCBlcnJudW0sIGNvbnN0IGNoYXIgKmZtdCwgLi4udAAEdm9pZHQACWFyZ3BfaGVscHNxAH4ACnQB6QogICAgICAgIFRoaXMgb3V0cHV0cyBhIGhlbHAgbWVzc2FnZSBmb3IgdGhlIGFyZ3AgcGFyc2VyIDxWQVI+YXJncDwvVkFSPiB0bwogICAgICAgICA8VkFSPnN0cmVhbTwvVkFSPi4gIFRoZSB0eXBlIG9mIG1lc3NhZ2VzIHByaW50ZWQgd2lsbCBiZSBkZXRlcm1pbmVkIGJ5CiAgICAgICAgIDxWQVI+ZmxhZ3M8L1ZBUj4uCiAgICAgICAgIDxicj48YnI+IEFueSBvcHRpb25zIHN1Y2ggYXMgPHNhbXA+LS1oZWxwPC9zYW1wPiB0aGF0IGFyZSBpbXBsZW1lbnRlZCBhdXRvbWF0aWNhbGx5IGJ5CiAgICAgICAgIGFyZ3AgaXRzZWxmIHdpbGwgPEVNPm5vdDwvRU0+IGJlIHByZXNlbnQgaW4gdGhlIGhlbHAgb3V0cHV0OyBmb3IgdGhpcwogICAgICAgICByZWFzb24gaXQgaXMgYmVzdCB0byB1c2UgPENPREU+YXJncF9zdGF0ZV9oZWxwPC9DT0RFPiBpZiBjYWxsaW5nIGZyb20gd2l0aGluCiAgICAgICAgIGFuIGFyZ3AgcGFyc2VyIGZ1bmN0aW9uLiAgLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZhcmdwLmh4cQB+AXd0AEFjb25zdCBzdHJ1Y3QgYXJncCAqYXJncCwgRklMRSAqc3RyZWFtLCB1bnNpZ25lZCBmbGFncywgY2hhciAqbmFtZXQABHZvaWR0AAphcmdwX3BhcnNlc3EAfgAKdAXGCiAgICAgICAgVGhlIDxDT0RFPmFyZ3BfcGFyc2U8L0NPREU+IGZ1bmN0aW9uIHBhcnNlcyB0aGUgYXJndW1lbnRzIGluIDxWQVI+YXJndjwvVkFSPiwgb2YKICAgICAgICAgbGVuZ3RoIDxWQVI+YXJnYzwvVkFSPiwgdXNpbmcgdGhlIGFyZ3AgcGFyc2VyIDxWQVI+YXJncDwvVkFSPi4gIC4KICAgICAgICAgPGJyPjxicj4gQSB2YWx1ZSBvZiB6ZXJvIGlzIHRoZSBzYW1lIGFzIGEgPENPREU+c3RydWN0IGFyZ3A8L0NPREU+Y29udGFpbmluZyBhbGwKICAgICAgICAgemVyb3MuICA8VkFSPmZsYWdzPC9WQVI+IGlzIGEgc2V0IG9mIGZsYWcgYml0cyB0aGF0IG1vZGlmeSB0aGUgcGFyc2luZwogICAgICAgICBiZWhhdmlvci4gIC4gIDxWQVI+aW5wdXQ8L1ZBUj4gaXMgcGFzc2VkIHRocm91Z2ggdG8gdGhlIGFyZ3AKICAgICAgICAgcGFyc2VyIDxWQVI+YXJncDwvVkFSPiwgYW5kIGhhcyBtZWFuaW5nIGRlZmluZWQgYnkgPFZBUj5hcmdwPC9WQVI+LiAgQSB0eXBpY2FsCiAgICAgICAgIHVzYWdlIGlzIHRvIHBhc3MgYSBwb2ludGVyIHRvIGEgc3RydWN0dXJlIHdoaWNoIGlzIHVzZWQgZm9yIHNwZWNpZnlpbmcKICAgICAgICAgcGFyYW1ldGVycyB0byB0aGUgcGFyc2VyIGFuZCBwYXNzaW5nIGJhY2sgdGhlIHJlc3VsdHMuCiAgICAgICAgIDxicj48YnI+IFVubGVzcyB0aGUgPENPREU+QVJHUF9OT19FWElUPC9DT0RFPiBvciA8Q09ERT5BUkdQX05PX0hFTFA8L0NPREU+IGZsYWdzIGFyZSBpbmNsdWRlZAogICAgICAgICBpbiA8VkFSPmZsYWdzPC9WQVI+LCBjYWxsaW5nIDxDT0RFPmFyZ3BfcGFyc2U8L0NPREU+IG1heSByZXN1bHQgaW4gdGhlIHByb2dyYW0KICAgICAgICAgZXhpdGluZy4gIFRoaXMgYmVoYXZpb3IgaXMgdHJ1ZSBpZiBhbiBlcnJvciBpcyBkZXRlY3RlZCwgb3Igd2hlbiBhbgogICAgICAgICB1bmtub3duIG9wdGlvbiBpcyBlbmNvdW50ZXJlZC4gIC4KICAgICAgICAgPGJyPjxicj4gSWYgPFZBUj5hcmdfaW5kZXg8L1ZBUj4gaXMgbm9uLW51bGwsIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgdW5wYXJzZWQgb3B0aW9uCiAgICAgICAgIGluIDxWQVI+YXJndjwvVkFSPiBpcyByZXR1cm5lZCBhcyBhIHZhbHVlLgogICAgICAgICA8YnI+PGJyPiBUaGUgcmV0dXJuIHZhbHVlIGlzIHplcm8gZm9yIHN1Y2Nlc3NmdWwgcGFyc2luZywgb3IgYW4gZXJyb3IgY29kZQogICAgICAgICAgaWYgYW4gZXJyb3IgaXMgZGV0ZWN0ZWQuICBEaWZmZXJlbnQgYXJncCBwYXJzZXJzCiAgICAgICAgIG1heSByZXR1cm4gYXJiaXRyYXJ5IGVycm9yIGNvZGVzLCBidXQgdGhlIHN0YW5kYXJkIGVycm9yIGNvZGVzIGFyZToKICAgICAgICAgPENPREU+RU5PTUVNPC9DT0RFPiBpZiBhIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yIG9jY3VycmVkLCBvciA8Q09ERT5FSU5WQUw8L0NPREU+IGlmCiAgICAgICAgIGFuIHVua25vd24gb3B0aW9uIG9yIG9wdGlvbiBhcmd1bWVudCBpcyBlbmNvdW50ZXJlZC4KICAgICAgICBzcQB+AA8AAAACdwQAAAACdAAHZ2NvbnYuaHQABmFyZ3AuaHhxAH4BfnQAW2NvbnN0IHN0cnVjdCBhcmdwICphcmdwLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsIHVuc2lnbmVkIGZsYWdzLCBpbnQgKmFyZ19pbmRleCwgdm9pZCAqaW5wdXR0AAdlcnJvcl90dAAPYXJncF9zdGF0ZV9oZWxwc3EAfgAKdADZCiAgICAgICAgT3V0cHV0cyBhIGhlbHAgbWVzc2FnZSBmb3IgdGhlIGFyZ3AgcGFyc2VyIHJlZmVycmVkIHRvIGJ5IDxWQVI+c3RhdGU8L1ZBUj4sCiAgICAgICAgIHRvIDxWQVI+c3RyZWFtPC9WQVI+LiAgVGhlIDxWQVI+ZmxhZ3M8L1ZBUj4gYXJndW1lbnQgZGV0ZXJtaW5lcyB3aGF0IHNvcnQgb2YgaGVscAogICAgICAgICBtZXNzYWdlIGlzIHByb2R1Y2VkLiAgLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZhcmdwLmh4cQB+AYZ0ADxjb25zdCBzdHJ1Y3QgYXJncF9zdGF0ZSAqc3RhdGUsIEZJTEUgKnN0cmVhbSwgdW5zaWduZWQgZmxhZ3N0AAR2b2lkdAAKYXJncF91c2FnZXNxAH4ACnQA8wogICAgICAgIE91dHB1dHMgdGhlIHN0YW5kYXJkIHVzYWdlIG1lc3NhZ2UgZm9yIHRoZSBhcmdwIHBhcnNlciByZWZlcnJlZCB0byBieQogICAgICAgICA8VkFSPnN0YXRlPC9WQVI+IHRvIDxDT0RFPjxWQVI+c3RhdGU8L1ZBUj4tPmVycl9zdHJlYW08L0NPREU+IGFuZCB0ZXJtaW5hdGUgdGhlIHByb2dyYW0KICAgICAgICAgd2l0aCA8Q09ERT5leGl0IChhcmdwX2Vycl9leGl0X3N0YXR1cyk8L0NPREU+LiAgLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZhcmdwLmh4cQB+AY10AB5jb25zdCBzdHJ1Y3QgYXJncF9zdGF0ZSAqc3RhdGV0AAR2b2lkdAAIYXJnel9hZGRzcQB+AAp0AP8KICAgICAgICBUaGUgPENPREU+YXJnel9hZGQ8L0NPREU+IGZ1bmN0aW9uIGFkZHMgdGhlIHN0cmluZyA8VkFSPnN0cjwvVkFSPiB0byB0aGUgZW5kIG9mIHRoZQogICAgICAgICBhcmd6IHZlY3RvciA8Q09ERT4qPFZBUj5hcmd6PC9WQVI+PC9DT0RFPiwgYW5kIHVwZGF0ZXMgPENPREU+KjxWQVI+YXJnejwvVkFSPjwvQ09ERT4gYW5kCiAgICAgICAgIDxDT0RFPio8VkFSPmFyZ3pfbGVuPC9WQVI+PC9DT0RFPiBhY2NvcmRpbmdseS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGYXJnei5oeHEAfgGUdAAuY2hhciAqKmFyZ3osIHNpemVfdCAqYXJnel9sZW4sIGNvbnN0IGNoYXIgKnN0cnQAB2Vycm9yX3R0AAxhcmd6X2FkZF9zZXBzcQB+AAp0AZEKICAgICAgICBUaGUgPENPREU+YXJnel9hZGRfc2VwPC9DT0RFPiBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIDxDT0RFPmFyZ3pfYWRkPC9DT0RFPiwgYnV0CiAgICAgICAgIDxWQVI+c3RyPC9WQVI+IGlzIHNwbGl0IGludG8gc2VwYXJhdGUgZWxlbWVudHMgaW4gdGhlIHJlc3VsdCBhdCBvY2N1cnJlbmNlcyBvZgogICAgICAgICB0aGUgY2hhcmFjdGVyIDxWQVI+ZGVsaW08L1ZBUj4uICBUaGlzIGlzIHVzZWZ1bCwgZm9yIGluc3RhbmNlLCBmb3IKICAgICAgICAgYWRkaW5nIHRoZSBjb21wb25lbnRzIG9mIGEgVW5peCBzZWFyY2ggcGF0aCB0byBhbiBhcmd6IHZlY3RvciwgYnkgdXNpbmcKICAgICAgICAgYSB2YWx1ZSBvZiA8Q09ERT4nOic8L0NPREU+IGZvciA8VkFSPmRlbGltPC9WQVI+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZhcmd6Lmh4cQB+AZt0ADljaGFyICoqYXJneiwgc2l6ZV90ICphcmd6X2xlbiwgY29uc3QgY2hhciAqc3RyLCBpbnQgZGVsaW10AAdlcnJvcl90dAALYXJnel9hcHBlbmRzcQB+AAp0AUIKICAgICAgICBUaGUgPENPREU+YXJnel9hcHBlbmQ8L0NPREU+IGZ1bmN0aW9uIGFwcGVuZHMgPFZBUj5idWZfbGVuPC9WQVI+IGJ5dGVzIHN0YXJ0aW5nIGF0CiAgICAgICAgIDxWQVI+YnVmPC9WQVI+IHRvIHRoZSBhcmd6IHZlY3RvciA8Q09ERT4qPFZBUj5hcmd6PC9WQVI+PC9DT0RFPiwgcmVhbGxvY2F0aW5nCiAgICAgICAgIDxDT0RFPio8VkFSPmFyZ3o8L1ZBUj48L0NPREU+IHRvIGFjY29tbW9kYXRlIGl0LCBhbmQgYWRkaW5nIDxWQVI+YnVmX2xlbjwvVkFSPiB0bwogICAgICAgICA8Q09ERT4qPFZBUj5hcmd6X2xlbjwvVkFSPjwvQ09ERT4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQABmFyZ3ouaHhxAH4BonQAPmNoYXIgKiphcmd6LCBzaXplX3QgKmFyZ3pfbGVuLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBidWZfbGVudAAHZXJyb3JfdHQACmFyZ3pfY291bnRzcQB+AAp0AHUKICAgICAgICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGFyZ3ogdmVjdG9yIDxWQVI+YXJnejwvVkFSPiBhbmQKICAgICAgICAgPFZBUj5hcmd6X2xlbjwvVkFSPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGYXJnei5oeHEAfgGpdAAgY29uc3QgY2hhciAqYXJneiwgc2l6ZV90IGFyZ19sZW50AAZzaXplX3R0AAthcmd6X2NyZWF0ZXNxAH4ACnQBRwogICAgICAgIFRoZSA8Q09ERT5hcmd6X2NyZWF0ZTwvQ09ERT4gZnVuY3Rpb24gY29udmVydHMgdGhlIFVuaXgtc3R5bGUgYXJndW1lbnQgdmVjdG9yCiAgICAgICAgIDxWQVI+YXJndjwvVkFSPiAoYSB2ZWN0b3Igb2YgcG9pbnRlcnMgdG8gbm9ybWFsIEMgc3RyaW5ncywgdGVybWluYXRlZCBieQogICAgICAgICA8Q09ERT4oY2hhciAqKTA8L0NPREU+OyApIGludG8gYW4gYXJneiB2ZWN0b3Igd2l0aAogICAgICAgICB0aGUgc2FtZSBlbGVtZW50cywgd2hpY2ggaXMgcmV0dXJuZWQgaW4gPFZBUj5hcmd6PC9WQVI+IGFuZCA8VkFSPmFyZ3pfbGVuPC9WQVI+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZhcmd6Lmh4cQB+AbB0ADFjaGFyICpjb25zdCBhcmd2W10sIGNoYXIgKiphcmd6LCBzaXplX3QgKmFyZ3pfbGVudAAHZXJyb3JfdHQAD2FyZ3pfY3JlYXRlX3NlcHNxAH4ACnQBKQogICAgICAgIFRoZSA8Q09ERT5hcmd6X2NyZWF0ZV9zZXA8L0NPREU+IGZ1bmN0aW9uIGNvbnZlcnRzIHRoZSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nCiAgICAgICAgIDxWQVI+c3RyaW5nPC9WQVI+IGludG8gYW4gYXJneiB2ZWN0b3IgKHJldHVybmVkIGluIDxWQVI+YXJnejwvVkFSPiBhbmQKICAgICAgICAgPFZBUj5hcmd6X2xlbjwvVkFSPikgYnkgc3BsaXR0aW5nIGl0IGludG8gZWxlbWVudHMgYXQgZXZlcnkgb2NjdXJyZW5jZSBvZiB0aGUKICAgICAgICAgY2hhcmFjdGVyIDxWQVI+c2VwPC9WQVI+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZhcmd6Lmh4cQB+Abd0ADpjb25zdCBjaGFyICpzdHJpbmcsIGludCBzZXAsIGNoYXIgKiphcmd6LCBzaXplX3QgKmFyZ3pfbGVudAAHZXJyb3JfdHQAC2FyZ3pfZGVsZXRlc3EAfgAKdAIYCiAgICAgICAgSWYgPFZBUj5lbnRyeTwvVkFSPiBwb2ludHMgdG8gdGhlIGJlZ2lubmluZyBvZiBvbmUgb2YgdGhlIGVsZW1lbnRzIGluIHRoZQogICAgICAgICBhcmd6IHZlY3RvciA8Q09ERT4qPFZBUj5hcmd6PC9WQVI+PC9DT0RFPiwgdGhlIDxDT0RFPmFyZ3pfZGVsZXRlPC9DT0RFPiBmdW5jdGlvbiB3aWxsCiAgICAgICAgIHJlbW92ZSB0aGlzIGVudHJ5IGFuZCByZWFsbG9jYXRlIDxDT0RFPio8VkFSPmFyZ3o8L1ZBUj48L0NPREU+LCBtb2RpZnlpbmcKICAgICAgICAgPENPREU+KjxWQVI+YXJnejwvVkFSPjwvQ09ERT4gYW5kIDxDT0RFPio8VkFSPmFyZ3pfbGVuPC9WQVI+PC9DT0RFPiBhY2NvcmRpbmdseS4gIE5vdGUgdGhhdCBhcwogICAgICAgICBkZXN0cnVjdGl2ZSBhcmd6IGZ1bmN0aW9ucyB1c3VhbGx5IHJlYWxsb2NhdGUgdGhlaXIgYXJneiBhcmd1bWVudCwKICAgICAgICAgcG9pbnRlcnMgaW50byBhcmd6IHZlY3RvcnMgc3VjaCBhcyA8VkFSPmVudHJ5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dAAHYXNjdGltZXNxAH4ACnQD+wogICAgICAgIFRoZSA8Q09ERT5hc2N0aW1lPC9DT0RFPiBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgYnJva2VuLWRvd24gdGltZSB2YWx1ZSB0aGF0CiAgICAgICAgIDxWQVI+YnJva2VudGltZTwvVkFSPiBwb2ludHMgdG8gaW50byBhIHN0cmluZyBpbiBhIHN0YW5kYXJkIGZvcm1hdDoKICAgICAgICAgPGJyPjxicj4gPHByZT48YnI+CiAgICAgICAgICJUdWUgTWF5IDIxIDEzOjQ2OjIyIDE5OTFcbiI8YnI+CiAgICAgICAgIDwvcHJlPgogICAgICAgICA8YnI+PGJyPiBUaGUgYWJicmV2aWF0aW9ucyBmb3IgdGhlIGRheXMgb2Ygd2VlayBhcmU6IDxzYW1wPlN1bjwvc2FtcD4sIDxzYW1wPk1vbjwvc2FtcD4sCiAgICAgICAgIDxzYW1wPlR1ZTwvc2FtcD4sIDxzYW1wPldlZDwvc2FtcD4sIDxzYW1wPlRodTwvc2FtcD4sIDxzYW1wPkZyaTwvc2FtcD4sIGFuZCA8c2FtcD5TYXQ8L3NhbXA+LgogICAgICAgICA8YnI+PGJyPiBUaGUgYWJicmV2aWF0aW9ucyBmb3IgdGhlIG1vbnRocyBhcmU6IDxzYW1wPkphbjwvc2FtcD4sIDxzYW1wPkZlYjwvc2FtcD4sCiAgICAgICAgIDxzYW1wPk1hcjwvc2FtcD4sIDxzYW1wPkFwcjwvc2FtcD4sIDxzYW1wPk1heTwvc2FtcD4sIDxzYW1wPkp1bjwvc2FtcD4sIDxzYW1wPkp1bDwvc2FtcD4sIDxzYW1wPkF1Zzwvc2FtcD4sCiAgICAgICAgIDxzYW1wPlNlcDwvc2FtcD4sIDxzYW1wPk9jdDwvc2FtcD4sIDxzYW1wPk5vdjwvc2FtcD4sIGFuZCA8c2FtcD5EZWM8L3NhbXA+LgogICAgICAgICA8YnI+PGJyPiBUaGUgcmV0dXJuIHZhbHVlIHBvaW50cyB0byBhIHN0YXRpY2FsbHkgYWxsb2NhdGVkIHN0cmluZywgd2hpY2ggbWlnaHQgYmUKICAgICAgICAgb3ZlcndyaXR0ZW4gYnkgc3Vic2VxdWVudCBjYWxscyB0byA8Q09ERT5hc2N0aW1lPC9DT0RFPiBvciA8Q09ERT5jdGltZTwvQ09ERT4uCiAgICAgICAgIChCdXQgbm8gb3RoZXIgbGlicmFyeSBmdW5jdGlvbiBvdmVyd3JpdGVzIHRoZSBjb250ZW50cyBvZiB0aGlzCiAgICAgICAgIHN0cmluZy4pCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQABnRpbWUuaHhxAH4B53QAG2NvbnN0IHN0cnVjdCB0bSAqYnJva2VudGltZXQABmNoYXIgKnQACWFzY3RpbWVfcnNxAH4ACnQCBQogICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byA8Q09ERT5hc2N0aW1lPC9DT0RFPiBidXQgaW5zdGVhZCBvZiBwbGFjaW5nIHRoZQogICAgICAgICByZXN1bHQgaW4gYSBzdGF0aWMgYnVmZmVyIGl0IHdyaXRlcyB0aGUgc3RyaW5nIGluIHRoZSBidWZmZXIgcG9pbnRlZCB0bwogICAgICAgICBieSB0aGUgcGFyYW1ldGVyIDxWQVI+YnVmZmVyPC9WQVI+LiAgVGhpcyBidWZmZXIgc2hvdWxkIGhhdmUgcm9vbQogICAgICAgICBmb3IgYXQgbGVhc3QgMjYgYnl0ZXMsIGluY2x1ZGluZyB0aGUgdGVybWluYXRpbmcgbnVsbC4KICAgICAgICAgPGJyPjxicj4gSWYgbm8gZXJyb3Igb2NjdXJyZWQgdGhlIGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBzdHJpbmcgdGhlCiAgICAgICAgIHJlc3VsdCB3YXMgd3JpdHRlbiBpbnRvLCBpLmUuLCBpdCByZXR1cm5zIDxWQVI+YnVmZmVyPC9WQVI+LiAgT3RoZXJ3aXNlCiAgICAgICAgIHJldHVybiA8Q09ERT5OVUxMPC9DT0RFPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGdGltZS5oeHEAfgHudAApY29uc3Qgc3RydWN0IHRtICpicm9rZW50aW1lLCBjaGFyICpidWZmZXJ0AAZjaGFyICp0AARhc2luc3EAfgAKdAIuCiAgICAgICAgVGhlc2UgZnVuY3Rpb25zIGNvbXB1dGUgdGhlIGFyYyBzaW5lIG9mIDxWQVI+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bmcgZG91YmxlIHh0AAtsb25nIGRvdWJsZXQABWFzaW5sc3EAfgAKdAIuCiAgICAgICAgVGhlc2UgZnVuY3Rpb25zIGNvbXB1dGUgdGhlIGFyYyBzaW5lIG9mIDxWQVI+eDwvVkFSPi0tLXRoYXQgaXMsIHRoZSB2YWx1ZSB3aG9zZQogICAgICAgICBzaW5lIGlzIDxWQVI+eDwvVkFSPi4gIFRoZSB2YWx1ZSBpcyBpbiB1bml0cyBvZiByYWRpYW5zLiAgTWF0aGVtYXRpY2FsbHksCiAgICAgICAgIHRoZXJlIGFyZSBpbmZpbml0ZWx5IG1hbnkgc3VjaCB2YWx1ZXM7IHRoZSBvbmUgYWN0dWFsbHkgcmV0dXJuZWQgaXMgdGhlCiAgICAgICAgIG9uZSBiZXR3ZWVuIDxDT0RFPi1waS8yPC9DT0RFPiBhbmQgPENPREU+cGkvMjwvQ09ERT4gKGluY2x1c2l2ZSkuCiAgICAgICAgIDxicj48YnI+IFRoZSBhcmMgc2luZSBmdW5jdGlvbiBpcyBkZWZpbmVkIG1hdGhlbWF0aWNhbGx5IG9ubHkKICAgICAgICAgb3ZlciB0aGUgZG9tYWluIDxDT0RFPi0xPC9DT0RFPiB0byA8Q09ERT4xPC9DT0RFPi4gIElmIDxWQVI+eDwvVkFSPiBpcyBvdXRzaWRlIHRoZQogICAgICAgICBkb21haW4sIDxDT0RFPmFzaW48L0NPREU+IHNpZ25hbHMgYSBkb21haW4gZXJyb3IuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQABm1hdGguaHhxAH4CGHQADWxvbmcgZG91YmxlIHh0AAtsb25nIGRvdWJsZXQACGFzcHJpbnRmc3EAfgAKdAUOCiAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIDxDT0RFPnNwcmludGY8L0NPREU+LCBleGNlcHQgdGhhdCBpdCBkeW5hbWljYWxseQogICAgICAgICBhbGxvY2F0ZXMgYSBzdHJpbmcgKGFzIHdpdGggPENPREU+bWFsbG9jPC9DT0RFPjsgKSB0byBob2xkIHRoZSBvdXRwdXQsIGluc3RlYWQgb2YgcHV0dGluZyB0aGUgb3V0cHV0IGluIGEKICAgICAgICAgYnVmZmVyIHlvdSBhbGxvY2F0ZSBpbiBhZHZhbmNlLiAgVGhlIDxWQVI+cHRyPC9WQVI+IGFyZ3VtZW50IHNob3VsZCBiZSB0aGUKICAgICAgICAgYWRkcmVzcyBvZiBhIDxDT0RFPmNoYXIgKjwvQ09ERT4gb2JqZWN0LCBhbmQgYSBzdWNjZXNzZnVsIGNhbGwgdG8KICAgICAgICAgPENPREU+YXNwcmludGY8L0NPREU+IHN0b3JlcyBhIHBvaW50ZXIgdG8gdGhlIG5ld2x5IGFsbG9jYXRlZCBzdHJpbmcgYXQgdGhhdAogICAgICAgICBsb2NhdGlvbi4KICAgICAgICAgPGJyPjxicj4gVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgYWxsb2NhdGVkIGZvciB0aGUgYnVmZmVyLCBvcgogICAgICAgICBsZXNzIHRoYW4gemVybyBpZiBhbiBlcnJvciBvY2N1cnJlZC4gVXN1YWxseSB0aGlzIG1lYW5zIHRoYXQgdGhlIGJ1ZmZlcgogICAgICAgICBjb3VsZCBub3QgYmUgYWxsb2NhdGVkLgogICAgICAgICA8YnI+PGJyPiBIZXJlIGlzIGhvdyB0byB1c2UgPENPREU+YXNwcmludGY8L0NPREU+IHRvIGdldCB0aGUgc2FtZSByZXN1bHQgYXMgdGhlCiAgICAgICAgIDxDT0RFPnNucHJpbnRmPC9DT0RFPiBleGFtcGxlLCBidXQgbW9yZSBlYXNpbHk6CiAgICAgICAgIDxicj48YnI+IDxwcmU+PGJyPgogICAgICAgICAvKiBDb25zdHJ1Y3QgYSBtZXNzYWdlIGRlc2NyaWJpbmcgdGhlIHZhbHVlIG9mIGEgdmFyaWFibGU8YnI+CiAgICAgICAgICAgIHdob3NlIG5hbWUgaXMgPFZBUj5uYW1lPC9WQVI+IGFuZCB3aG9zZSB2YWx1ZSBpcyA8VkFSPnZhbHVlPC9WQVI+LiAqLzxicj4KICAgICAgICAgY2hhciAqPGJyPgogICAgICAgICBtYWtlX21lc3NhZ2UgKGNoYXIgKm5hbWUsIGNoYXIgKnZhbHVlKTxicj4KICAgICAgICAgezxicj4KICAgICAgICAgICBjaGFyICpyZXN1bHQ7PGJyPgog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dmFsdWVzOyB0aGUgb25lIGFjdHVhbGx5CiAgICAgICAgIHJldHVybmVkIGlzIHRoZSBvbmUgYmV0d2VlbiA8Q09ERT4tcGkvMjwvQ09ERT4gYW5kIDxDT0RFPnBpLzI8L0NPREU+IChpbmNsdXNpdmUpLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZtYXRoLmh4cQB+Al50AA1sb25nIGRvdWJsZSB4dAALbG9uZyBkb3VibGV0AAZhdGV4aXRzcQB+AAp0AVsKICAgICAgICBUaGUgPENPREU+YXRleGl0PC9DT0RFPiBmdW5jdGlvbiByZWdpc3RlcnMgdGhlIGZ1bmN0aW9uIDxWQVI+ZnVuY3Rpb248L1ZBUj4gdG8gYmUKICAgICAgICAgY2FsbGVkIGF0IG5vcm1hbCBwcm9ncmFtIHRlcm1pbmF0aW9uLiAgVGhlIDxWQVI+ZnVuY3Rpb248L1ZBUj4gaXMgY2FsbGVkIHdpdGgKICAgICAgICAgbm8gYXJndW1lbnRzLgogICAgICAgICA8YnI+PGJyPiBUaGUgcmV0dXJuIHZhbHVlIGZyb20gPENPREU+YXRleGl0PC9DT0RFPiBpcyB6ZXJvIG9uIHN1Y2Nlc3MgYW5kIG5vbnplcm8gaWYKICAgICAgICAgdGhlIGZ1bmN0aW9uIGNhbm5vdCBiZSByZWdpc3RlcmVkLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAhzdGRsaWIuaHhxAH4CZXQAF3ZvaWQgKCpmdW5jdGlvbikgKHZvaWQpdAADaW50dAAEYXRvZnNxAH4ACnQBKwogICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byB0aGUgPENPREU+c3RydG9kPC9DT0RFPiBmdW5jdGlvbiwgZXhjZXB0IHRoYXQgaXQKICAgICAgICAgbmVlZCBub3QgZGV0ZWN0IG92ZXJmbG93IGFuZCB1bmRlcmZsb3cgZXJyb3JzLiAgVGhlIDxDT0RFPmF0b2Y8L0NPREU+IGZ1bmN0aW9uCiAgICAgICAgIGlzIHByb3ZpZGVkIG1vc3RseSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIGNvZGU7IHVzaW5nCiAgICAgICAgIDxDT0RFPnN0cnRvZDwvQ09ERT4gaXMgbW9yZSByb2J1c3QuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHN0ZGxpYi5oeHEAfgJsdAASY29uc3QgY2hhciAqc3RyaW5ndAAGZG91YmxldAAEYXRvaXNxAH4ACnQA1QogICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSA8Q09ERT5hdG9sPC9DT0RFPiwgZXhjZXB0IHRoYXQgaXQgcmV0dXJucyBhbiA8Q09ERT5pbnQ8L0NPREU+LgogICAgICAgICBUaGUgPENPREU+YXRvaTwvQ09ERT4gZnVuY3Rpb24gaXMgYWxzbyBjb25zaWRlcmVkIG9ic29sZXRlOyB1c2UgPENPREU+c3RydG9sPC9DT0RFPgogICAgICAgICBpbnN0ZWFkLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAhzdGRsaWIuaHhxAH4Cc3QAEmNvbnN0IGNoYXIgKnN0cmluZ3QAA2ludHQABGF0b2xzcQB+AAp0AU8KICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gdGhlIDxDT0RFPnN0cnRvbDwvQ09ERT4gZnVuY3Rpb24gd2l0aCBhIDxWQVI+YmFzZTwvVkFSPgogICAgICAgICBhcmd1bWVudCBvZiA8Q09ERT4xMDwvQ09ERT4sIGV4Y2VwdCB0aGF0IGl0IG5lZWQgbm90IGRldGVjdCBvdmVyZmxvdyBlcnJvcnMuCiAgICAgICAgIFRoZSA8Q09ERT5hdG9sPC9DT0RFPiBmdW5jdGlvbiBpcyBwcm92aWRlZCBtb3N0bHkgZm9yIGNvbXBhdGliaWxpdHkgd2l0aAogICAgICAgICBleGlzdGluZyBjb2RlOyB1c2luZyA8Q09ERT5zdHJ0b2w8L0NPREU+IGlzIG1vcmUgcm9idXN0LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAhzdGRsaWIuaHhxAH4CenQAEmNvbnN0IGNoYXIgKnN0cmluZ3QACGxvbmcgaW50dAAFYXRvbGxzcQB+AAp0AScKICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gPENPREU+YXRvbDwvQ09ERT4sIGV4Y2VwdCBpdCByZXR1cm5zIGEgPENPREU+bG9uZwogICAgICAgICBsb25nIGludDwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IFRoZSA8Q09ERT5hdG9sbDwvQ09ERT4gZnVuY3Rpb24gd2FzIGludHJvZHVjZWQgaW4gSVNPIEM5OS4gIEl0IHRvbyBpcwogICAgICAgICBvYnNvbGV0ZSAoZGVzcGl0ZSBoYXZpbmcganVzdCBiZWVuIGFkZGVkKTsgdXNlIDxDT0RFPnN0cnRvbGw8L0NPREU+IGluc3RlYWQuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHN0ZGxpYi5oeHEAfgKBdAASY29uc3QgY2hhciAqc3RyaW5ndAANbG9uZyBsb25nIGludHQACWJhY2t0cmFjZXNxAH4ACnQD9QogICAgICAgIFRoZSA8Q09ERT5iYWNrdHJhY2U8L0NPREU+IGZ1bmN0aW9uIG9idGFpbnMgYSBiYWNrdHJhY2UgZm9yIHRoZSBjdXJyZW50CiAgICAgICAgIHRocmVhZCwgYXMgYSBsaXN0IG9mIHBvaW50ZXJzLCBhbmQgcGxhY2VzIHRoZSBpbmZvcm1hdGlvbiBpbnRvCiAgICAgICAgIDxWQVI+YnVmZmVyPC9WQVI+LiAgVGhlIGFyZ3VtZW50IDxWQVI+c2l6ZTwvVkFSPiBzaG91bGQgYmUgdGhlIG51bWJlciBvZgogICAgICAgICA8Q09ERT52b2lkICo8L0NPREU+IGVsZW1lbnRzIHRoYXQgd2lsbCBmaXQgaW50byA8VkFSPmJ1ZmZlcjwvVkFSPi4gIFRoZSByZXR1cm4KICAgICAgICAgdmFsdWUgaXMgdGhlIGFjdHVhbCBudW1iZXIgb2YgZW50cmllcyBvZiA8VkFSPmJ1ZmZlcjwvVkFSPiB0aGF0IGFyZSBvYnRhaW5lZCwKICAgICAgICAgYW5kIGlzIGF0IG1vc3QgPFZBUj5zaXplPC9WQVI+LgogICAgICAgICA8YnI+PGJyPiBUaGUgcG9pbnRlcnMgcGxhY2VkIGluIDxWQVI+YnVmZmVyPC9WQVI+IGFyZSBhY3R1YWxseSByZXR1cm4gYWRkcmVzc2VzCiAgICAgICAgIG9idGFpbmVkIGJ5IGluc3BlY3RpbmcgdGhlIHN0YWNrLCBvbmUgcmV0dXJuIGFkZHJlc3MgcGVyIHN0YWNrIGZyYW1lLgogICAgICAgICA8YnI+PGJyPiBOb3RlIHRoYXQgY2VydGFpbiBjb21waWxlciBvcHRpbWl6YXRpb25zIG1heSBpbnRlcmZlcmUgd2l0aCBvYnRhaW5pbmcgYQogICAgICAgICB2YWxpZCBiYWNrdHJhY2UuICBGdW5jdGlvbiBpbmxpbmluZyBjYXVzZXMgdGhlIGlubGluZWQgZnVuY3Rpb24gdG8gbm90CiAgICAgICAgIGhhdmUgYSBzdGFjayBmcmFtZTsgdGFpbCBjYWxsIG9wdGltaXphdGlvbiByZXBsYWNlcyBvbmUgc3RhY2sgZnJhbWUgd2l0aAogICAgICAgICBhbm90aGVyOyBmcmFtZSBwb2ludGVyIGVsaW1pbmF0aW9uIHdpbGwgc3RvcCA8Q09ERT5iYWNrdHJhY2U8L0NPREU+IGZyb20KICAgICAgICAgaW50ZXJwcmV0aW5nIHRoZSBzdGFjayBjb250ZW50cyBjb3JyZWN0bHkuCiAgICAgICAgc3EAfgAPAAAAAncEAAAAAnQACXdvcmRleHAuaHQACmV4ZWNpbmZvLmh4cQB+Aoh0ABd2b2lkICoqYnVmZmVyLCBpbnQgc2l6ZXQAA2ludHQAEWJhY2t0cmFjZV9zeW1ib2xzc3EAfgAKdAbQCiAgICAgICAgVGhlIDxDT0RFPmJhY2t0cmFjZV9zeW1ib2xzPC9DT0RFPiBmdW5jdGlvbiB0cmFuc2xhdGVzIHRoZSBpbmZvcm1hdGlvbgogICAgICAgICBvYnRhaW5lZCBmcm9tIHRoZSA8Q09ERT5iYWNrdHJhY2U8L0NPREU+IGZ1bmN0aW9uIGludG8gYW4gYXJyYXkgb2Ygc3RyaW5ncy4KICAgICAgICAgVGhlIGFyZ3VtZW50IDxWQVI+YnVmZmVyPC9WQVI+IHNob3VsZCBiZSBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgYWRkcmVzc2VzCiAgICAgICAgIG9idGFpbmVkIHZpYSB0aGUgPENPREU+YmFja3RyYWNlPC9DT0RFPiBmdW5jdGlvbiwgYW5kIDxWQVI+c2l6ZTwvVkFSPiBpcyB0aGUgbnVtYmVyCiAgICAgICAgIG9mIGVudHJpZXMgaW4gdGhhdCBhcnJheSAodGhlIHJldHVybiB2YWx1ZSBvZiA8Q09ERT5iYWNrdHJhY2U8L0NPREU+KS4KICAgICAgICAgPGJyPjxicj4gVGhlIHJldHVybiB2YWx1ZSBpcyBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2Ygc3RyaW5ncywgd2hpY2ggaGFzCiAgICAgICAgIDxWQVI+c2l6ZTwvVkFSPiBlbnRyaWVzIGp1c3QgbGlrZSB0aGUgYXJyYXkgPFZBUj5idWZmZXI8L1ZBUj4uICBFYWNoIHN0cmluZwogICAgICAgICBjb250YWlucyBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IG9mCiAgICAgICAgIDxWQVI+YnVmZmVyPC9WQVI+LiAgSXQgaW5jbHVkZXMgdGhlIGZ1bmN0aW9uIG5hbWUgKGlmIHRoaXMgY2FuIGJlCiAgICAgICAgIGRldGVybWluZWQpLCBhbiBvZmZzZXQgaW50byB0aGUgZnVuY3Rpb24sIGFuZCB0aGUgYWN0dWFsIHJldHVybiBhZGRyZXNzCiAgICAgICAgIChpbiBoZXhhZGVjaW1hbCkuCiAgICAgICAgIDxicj48YnI+IEN1cnJlbnRseSwgdGhlIGZ1bmN0aW9uIG5hbWUgYW5kIG9mZnNldCBvbmx5IGJlIG9idGFpbmVkIG9uIHN5c3RlbXMgdGhhdAogICAgICAgICB1c2UgdGhlIEVMRiBiaW5hcnkgZm9ybWF0IGZvciBwcm9ncmFtcyBhbmQgbGlicmFyaWVzLiAgT24gb3RoZXIgc3lzdGVtcywKICAgICAgICAgb25seSB0aGUgaGV4YWRlY2ltYWwgcmV0dXJuIGFkZHJlc3Mgd2lsbCBiZSBwcmVzZW50LiAgQWxzbywgeW91IG1heSBuZWVkCiAgICAgICAgIHRvIHBhc3MgYWRkaXRpb25hbCBmbGFncyB0byB0aGUgbGlua2VyIHRvIG1ha2UgdGhlIGZ1bmN0aW9uIG5hbWVzCiAgICAgICAgIGF2YWlsYWJsZSB0byB0aGUgcHJvZ3JhbS4gIChGb3IgZXhhbXBsZSwgb24gc3lzdGVtcyB1c2luZyBHTlUgbGQsIHlvdQogICAgICAgICBtdXN0IHBhc3MgKDxDT0RFPi1yZHluYW1pYzwvQ09ERT4uKQogICAgICAgICA8YnI+PGJyPiBUaGUgcmV0dXJuIHZhbHVlIG9mIDxDT0RFPmJhY2t0cmFjZV9zeW1ib2xzPC9DT0RFPiBpcyBhIHBvaW50ZXIgb2J0YWluZWQgdmlhCiAgICAgICAgIHRoZSA8Q09ERT5tYWxsb2M8L0NPREU+IGZ1bmN0aW9uLCBhbmQgaXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIKICAgICAgICAgdG8gPENPREU+ZnJlZTwvQ09ERT4gdGhhdCBwb2ludGVyLiAgTm90ZSB0aGF0IG9ubHkgdGhlIHJldHVybiB2YWx1ZSBuZWVkIGJlCiAgICAgICAgIGZyZWVkLCBub3QgdGhlIGluZGl2aWR1YWwgc3RyaW5ncy4KICAgICAgICAgPGJyPjxicj4gVGhlIHJldHVybiB2YWx1ZSBpcyA8Q09ERT5OVUxMPC9DT0RFPiBpZiBzdWZmaWNpZW50IG1lbW9yeSBmb3IgdGhlIHN0cmluZ3MKICAgICAgICAgY2Fubm90IGJlIG9idGFpbmVkLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AApleGVjaW5mby5oeHEAfgKQdAAddm9pZCAqY29uc3QgKmJ1ZmZlciwgaW50IHNpemV0AAdjaGFyICoqdAAUYmFja3RyYWNlX3N5bWJvbHNfZmRzcQB+AAp0AbEKICAgICAgICBUaGUgPENPREU+YmFja3RyYWNlX3N5bWJvbHNfZmQ8L0NPREU+IGZ1bmN0aW9uIHBlcmZvcm1zIHRoZSBzYW1lIHRyYW5zbGF0aW9uCiAgICAgICAgIGFzIHRoZSBmdW5jdGlvbiA8Q09ERT5iYWNrdHJhY2Vfc3ltYm9sczwvQ09ERT4gZnVuY3Rpb24uICBJbnN0ZWFkIG9mIHJldHVybmluZwogICAgICAgICB0aGUgc3RyaW5ncyB0byB0aGUgY2FsbGVyLCBpdCB3cml0ZXMgdGhlIHN0cmluZ3MgdG8gdGhlIGZpbGUgZGVzY3JpcHRvcgogICAgICAgICA8VkFSPmZkPC9WQVI+LCBvbmUgcGVyIGxpbmUuICBJdCBkb2VzIG5vdCB1c2UgdGhlIDxDT0RFPm1hbGxvYzwvQ09ERT4gZnVuY3Rpb24sIGFuZAogICAgICAgICBjYW4gdGhlcmVmb3JlIGJlIHVzZWQgaW4gc2l0dWF0aW9ucyB3aGVyZSB0aGF0IGZ1bmN0aW9uIG1pZ2h0IGZhaWwuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACmV4ZWNpbmZvLmh4cQB+Apd0ACV2b2lkICpjb25zdCAqYnVmZmVyLCBpbnQgc2l6ZSwgaW50IGZkdAAEdm9pZHQACGJhc2VuYW1lc3EAfgAKdAQnCiAgICAgICAgVGhpcyBpcyB0aGUgc3RhbmRhcmQgWFBHIGRlZmluZWQgPENPREU+YmFzZW5hbWU8L0NPREU+LiBJdCBpcyBzaW1pbGFyIGluCiAgICAgICAgIHNwaXJpdCB0byB0aGUgR05VIHZlcnNpb24sIGJ1dCBtYXkgbW9kaWZ5IHRoZSA8VkFSPnBhdGg8L1ZBUj4gYnkgcmVtb3ZpbmcKICAgICAgICAgdHJhaWxpbmcgJy8nIGNoYXJhY3RlcnMuICBJZiB0aGUgPFZBUj5wYXRoPC9WQVI+IGlzIG1hZGUgdXAgZW50aXJlbHkgb2YgJy8nCiAgICAgICAgIGNoYXJhY3RlcnMsIHRoZW4gIi8iIHdpbGwgYmUgcmV0dXJuZWQuICBBbHNvLCBpZiA8VkFSPnBhdGg8L1ZBUj4gaXMKICAgICAgICAgPENPREU+TlVMTDwvQ09ERT4gb3IgYW4gZW1wdHkgc3RyaW5nLCB0aGVuICIuIiBpcyByZXR1cm5lZC4gIFRoZSBwcm90b3R5cGUgZm9yCiAgICAgICAgIHRoZSBYUEcgdmVyc2lvbiBjYW4gYmUgZm91bmQgaW4gPFRUPmxpYmdlbi5oPC9UVD4uCiAgICAgICAgIDxicj48YnI+IEV4YW1wbGUgb2YgdXNpbmcgWFBHIDxDT0RFPmJhc2VuYW1lPC9DT0RFPjoKICAgICAgICAgPGJyPjxicj4gPHByZT48YnI+CiAgICAgICAgICNpbmNsdWRlIDxsaWJnZW4uaD48YnI+CiAgICAgICAgIDxicj48YnI+IGludDxicj4KICAgICAgICAgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSk8YnI+CiAgICAgICAgIHs8YnI+CiAgICAgICAgICAgY2hhciAqcHJvZzs8YnI+CiAgICAgICAgICAgY2hhciAqcGF0aCA9IHN0cmR1cGEgKGFyZ3ZbMF0pOzxicj4KICAgICAgICAgPGJyPjxicj4gICBwcm9nID0gYmFzZW5hbWUgKHBhdGgpOzxicj4KICAgICAgICAgPGJyPjxicj4gICBpZiAoYXJnYyA8IDIpPGJyPgogICAgICAgICAgICAgezxicj4KICAgICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiVXNhZ2UgJXMgPGFyZz5cbiIsIHByb2cpOzxicj4KICAgICAgICAgICAgICAgZXhpdCAoMSk7PGJyPgogICAgICAgICAgICAgfTxicj4KICAgICAgICAgPGJyPjxicj4gICA8c21hbGw+Li4uPC9zbWFsbD48YnI+CiAgICAgICAgIDxicj48YnI+IH08YnI+CiAgICAgICAgIDwvcHJlPgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAhsaWJnZW4uaHh0AAhiYXNlbmFtZXQACmNoYXIgKnBhdGh0AAZjaGFyICp0AARiY21wc3EAfgAKdABWCiAgICAgICAgVGhpcyBpcyBhbiBvYnNvbGV0ZSBhbGlhcyBmb3IgPENPREU+bWVtY21wPC9DT0RFPiwgZGVyaXZlZCBmcm9tIEJTRC4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc3RyaW5nLmh4cQB+AqZ0ACtjb25zdCB2b2lkICphMSwgY29uc3Qgdm9pZCAqYTIsIHNpemVfdCBzaXpldAADaW50dAAFYmNvcHlzcQB+AAp0AQUKICAgICAgICBUaGlzIGlzIGEgcGFydGlhbGx5IG9ic29sZXRlIGFsdGVybmF0aXZlIGZvciA8Q09ERT5tZW1tb3ZlPC9DT0RFPiwgZGVyaXZlZCBmcm9tCiAgICAgICAgIEJTRC4gIE5vdGUgdGhhdCBpdCBpcyBub3QgcXVpdGUgZXF1aXZhbGVudCB0byA8Q09ERT5tZW1tb3ZlPC9DT0RFPiwgYmVjYXVzZSB0aGUKICAgICAgICAgYXJndW1lbnRzIGFyZSBub3QgaW4gdGhlIHNhbWUgb3JkZXIgYW5kIHRoZXJlIGlzIG5vIHJldHVybiB2YWx1ZS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc3RyaW5nLmh4cQB+Aq10ACdjb25zdCB2b2lkICpmcm9tLCB2b2lkICp0bywgc2l6ZV90IHNpemV0AAR2b2lkdAAEYmluZHNxAH4ACnQGBgogICAgICAgIFRoZSA8Q09ERT5iaW5kPC9DT0RFPiBmdW5jdGlvbiBhc3NpZ25zIGFuIGFkZHJlc3MgdG8gdGhlIHNvY2tldAogICAgICAgICA8VkFSPnNvY2tldDwvVkFSPi4gIFRoZSA8VkFSPmFkZHI8L1ZBUj4gYW5kIDxWQVI+bGVuZ3RoPC9WQVI+IGFyZ3VtZW50cyBzcGVjaWZ5IHRoZQogICAgICAgICBhZGRyZXNzOyB0aGUgZGV0YWlsZWQgZm9ybWF0IG9mIHRoZSBhZGRyZXNzIGRlcGVuZHMgb24gdGhlIG5hbWVzcGFjZS4KICAgICAgICAgVGhlIGZpcnN0IHBhcnQgb2YgdGhlIGFkZHJlc3MgaXMgYWx3YXlzIHRoZSBmb3JtYXQgZGVzaWduYXRvciwgd2hpY2gKICAgICAgICAgc3BlY2lmaWVzIGEgbmFtZXNwYWNlLCBhbmQgc2F5cyB0aGF0IHRoZSBhZGRyZXNzIGlzIGluIHRoZSBmb3JtYXQgb2YKICAgICAgICAgdGhhdCBuYW1lc3BhY2UuCiAgICAgICAgIDxicj48YnI+IFRoZSByZXR1cm4gdmFsdWUgaXMgPENPREU+MDwvQ09ERT4gb24gc3VjY2VzcyBhbmQgPENPREU+LTE8L0NPREU+IG9uIGZhaWx1cmUuICBUaGUKICAgICAgICAgZm9sbG93aW5nIDxDT0RFPmVycm5vPC9DT0RFPiBlcnJvciBjb25kaXRpb25zIGFyZSBkZWZpbmVkIGZvciB0aGlzIGZ1bmN0aW9uOgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8RFQ+PENPREU+RUJBREY8L0NPREU+CjxERD4KICAgICAgICAgVGhlIDxWQVI+c29ja2V0PC9WQVI+IGFyZ3VtZW50IGlzIG5vdCBhIHZhbGlkIGZpbGUgZGVzY3JpcHRvci4KICAgICAgICAgPGJyPjxicj4gPExJPiBFTk9UU09DSwogICAgICAgICBUaGUgZGVzY3JpcHRvciA8VkFSPnNvY2tldDwvVkFSPiBpcyBub3QgYSBzb2NrZXQuCiAgICAgICAgIDxicj48YnI+IDxMST4gRUFERFJOT1RBVkFJTAogICAgICAgICBUaGUgc3BlY2lmaWVkIGFkZHJlc3MgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGlzIG1hY2hpbmUuCiAgICAgICAgIDxicj48YnI+IDxMST4gRUFERFJJTlVTRQogICAgICAgICBTb21lIG90aGVyIHNvY2tldCBpcyBhbHJlYWR5IHVzaW5nIHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4KICAgICAgICAgPGJyPjxicj4gPExJPiBFSU5WQUwKICAgICAgICAgVGhlIHNvY2tldCA8VkFSPnNvY2tldDwvVkFSPiBhbHJlYWR5IGhhcyBhbiBhZGRyZXNzLgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVBQ0NFUwogICAgICAgICBZb3UgZG8gbm90IGhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlIHJlcXVlc3RlZCBhZGRyZXNzLiAgKEluIHRoZQogICAgICAgICBJbnRlcm5ldCBkb21haW4sIG9ubHkgdGhlIHN1cGVyLXVzZXIgaXMgYWxsb3dlZCB0byBzcGVjaWZ5IGEgcG9ydCBudW1iZXIKICAgICAgICAgaW4gdGhlIHJhbmdlIDAgdGhyb3VnaCA8Q09ERT5JUFBPUlRfUkVTRVJWRUQ8L0NPREU+IG1pbnVzIG9uZTsgc2VlCiAgICAgICAgIFBvcnRzLikKCiAgICAgICAgIDxicj48YnI+IEFkZGl0aW9uYWwgY29uZGl0aW9ucyBtYXkgYmUgcG9zc2libGUgZGVwZW5kaW5nIG9uIHRoZSBwYXJ0aWN1bGFyIG5hbWVzcGFjZQogICAgICAgICBvZiB0aGUgc29ja2V0LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAxzeXMvc29ja2V0Lmh4cQB+ArR0ADNpbnQgc29ja2V0LCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIHNvY2tsZW5fdCBsZW5ndGh0AANpbnR0AA5iaW5kdGV4dGRvbWFpbnNxAH4ACnQIIgogICAgICAgIFRoZSA8Q09ERT5iaW5kdGV4dGRvbWFpbjwvQ09ERT4gZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZGlyZWN0b3J5CiAgICAgICAgIHdoaWNoIGNvbnRhaW5zIHRoZSBtZXNzYWdlIGNhdGFsb2dzIGZvciBkb21haW4gPFZBUj5kb21haW5uYW1lPC9WQVI+IGZvciB0aGUKICAgICAgICAgZGlmZmVyZW50IGxhbmd1YWdlcy4gIFRvIGJlIGNvcnJlY3QsIHRoaXMgaXMgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUKICAgICAgICAgaGllcmFyY2h5IG9mIGRpcmVjdG9yaWVzIGlzIGV4cGVjdGVkLiAgRGV0YWlscyBhcmUgZXhwbGFpbmVkIGJlbG93LgogICAgICAgICA8YnI+PGJyPiBGb3IgdGhlIHByb2dyYW1tZXIgaXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB0aGUgdHJhbnNsYXRpb25zIHdoaWNoCiAgICAgICAgIGNvbWUgd2l0aCB0aGUgcHJvZ3JhbSBoYXZlIGJlIHBsYWNlZCBpbiBhIGRpcmVjdG9yeSBoaWVyYXJjaHkgc3RhcnRpbmcKICAgICAgICAgYXQsIHNheSwgPFRUPi9mb28vYmFyPC9UVD4uICBUaGVuIHRoZSBwcm9ncmFtIHNob3VsZCBtYWtlIGEKICAgICAgICAgPENPREU+YmluZHRleHRkb21haW48L0NPREU+IGNhbGwgdG8gYmluZCB0aGUgZG9tYWluIGZvciB0aGUgY3VycmVudCBwcm9ncmFtIHRvCiAgICAgICAgIHRoaXMgZGlyZWN0b3J5LiAgU28gaXQgaXMgbWFkZSBzdXJlIHRoZSBjYXRhbG9ncyBhcmUgZm91bmQuICBBIGNvcnJlY3RseQogICAgICAgICBydW5uaW5nIHByb2dyYW0gZG9lcyBub3QgZGVwZW5kIG9uIHRoZSB1c2VyIHNldHRpbmcgYW4gZW52aXJvbm1lbnQKICAgICAgICAgdmFyaWFibGUuCiAgICAgICAgIDxicj48YnI+IFRoZSA8Q09ERT5iaW5kdGV4dGRvbWFpbjwvQ09ERT4gZnVuY3Rpb24gY2FuIGJlIHVzZWQgc2V2ZXJhbCB0aW1lcyBhbmQgaWYgdGhlCiAgICAgICAgIDxWQVI+ZG9tYWlubmFtZTwvVkFSPiBhcmd1bWVudCBpcyBkaWZmZXJlbnQgdGhlIHByZXZpb3VzbHkgYm91bmQgZG9tYWlucwogICAgICAgICB3aWxsIG5vdCBiZSBvdmVyd3JpdHRlbi4KICAgICAgICAgPGJyPjxicj4gSWYgdGhlIHByb2dyYW0gd2hpY2ggd2lzaCB0byB1c2UgPENPREU+YmluZHRleHRkb21haW48L0NPREU+IGF0IHNvbWUgcG9pbnQgb2YKICAgICAgICAgdGltZSB1c2UgdGhlIDxDT0RFPmNoZGlyPC9DT0RFPiBmdW5jdGlvbiB0byBjaGFuZ2UgdGhlIGN1cnJlbnQgd29ya2luZwogICAgICAgICBkaXJlY3RvcnkgaXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlIDxWQVI+ZGlybmFtZTwvVkFSPiBzdHJpbmdzIG91Z2h0IHRvIGJlIGFuCiAgICAgICAgIGFic29sdXRlIHBhdGhuYW1lLiAgT3RoZXJ3aXNlIHRoZSBhZGRyZXNzZWQgZGlyZWN0b3J5IG1pZ2h0IHZhcnkgd2l0aAogICAgICAgICB0aGUgdGltZS4KICAgICAgICAgPGJyPjxicj4gSWYgdGhlIDxWQVI+ZGlybmFtZTwvVkFSPiBwYXJhbWV0ZXIgaXMgdGhlIG51bGwgcG9pbnRlciA8Q09ERT5iaW5kdGV4dGRvbWFpbjwvQ09ERT4KICAgICAgICAgcmV0dXJucyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGRpcmVjdG9yeSBmb3IgdGhlIGRvbWFpbiB3aXRoIHRoZSBuYW1lCiAgICAgICAgIDxWQVI+ZG9tYWlubmFtZTwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gVGhlIDxDT0RFPmJpbmR0ZXh0ZG9tYWluPC9DT0RFPiBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byBhIHN0cmluZwogICAgICAgICBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSBzZWxlY3RlZCBkaXJlY3RvcnkgbmFtZS4gIFRoZSBzdHJpbmcgaXMKICAgICAgICAgYWxsb2NhdGVkIGludGVybmFsbHkgaW4gdGhlIGZ1bmN0aW9uIGFuZCBtdXN0IG5v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CiAgICAgICAgVGhlIDxDT0RFPmJzZWFyY2g8L0NPREU+IGZ1bmN0aW9uIHNlYXJjaGVzIHRoZSBzb3J0ZWQgYXJyYXkgPFZBUj5hcnJheTwvVkFSPiBmb3IgYW4gb2JqZWN0CiAgICAgICAgIHRoYXQgaXMgZXF1aXZhbGVudCB0byA8VkFSPmtleTwvVkFSPi4gIFRoZSBhcnJheSBjb250YWlucyA8VkFSPmNvdW50PC9WQVI+IGVsZW1lbnRzLAogICAgICAgICBlYWNoIG9mIHdoaWNoIGlzIG9mIHNpemUgPFZBUj5zaXplPC9WQVI+IGJ5dGVzLgogICAgICAgICA8YnI+PGJyPiBUaGUgPFZBUj5jb21wYXJlPC9WQVI+IGZ1bmN0aW9uIGlzIHVzZWQgdG8gcGVyZm9ybSB0aGUgY29tcGFyaXNvbi4gIFRoaXMKICAgICAgICAgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggdHdvIHBvaW50ZXIgYXJndW1lbnRzIGFuZCBzaG91bGQgcmV0dXJuIGFuCiAgICAgICAgIGludGVnZXIgbGVzcyB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHplcm8gY29ycmVzcG9uZGluZyB0bwogICAgICAgICB3aGV0aGVyIGl0cyBmaXJzdCBhcmd1bWVudCBpcyBjb25zaWRlcmVkIGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIKICAgICAgICAgdGhhbiBpdHMgc2Vjb25kIGFyZ3VtZW50LiAgVGhlIGVsZW1lbnRzIG9mIHRoZSA8VkFSPmFycmF5PC9WQVI+IG11c3QgYWxyZWFkeQogICAgICAgICBiZSBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyIGFjY29yZGluZyB0byB0aGlzIGNvbXBhcmlzb24gZnVuY3Rpb24uCiAgICAgICAgIDxicj48YnI+IFRoZSByZXR1cm4gdmFsdWUgaXMgYSBwb2ludGVyIHRvIHRoZSBtYXRjaGluZyBhcnJheSBlbGVtZW50LCBvciBhIG51bGwKICAgICAgICAgcG9pbnRlciBpZiBubyBtYXRjaCBpcyBmb3VuZC4gIElmIHRoZSBhcnJheSBjb250YWlucyBtb3JlIHRoYW4gb25lIGVsZW1lbnQKICAgICAgICAgdGhhdCBtYXRjaGVzLCB0aGUgb25lIHRoYXQgaXMgcmV0dXJuZWQgaXMgdW5zcGVjaWZpZWQuCiAgICAgICAgIDxicj48YnI+IFRoaXMgZnVuY3Rpb24gZGVyaXZlcyBpdHMgbmFtZSBmcm9tIHRoZSBmYWN0IHRoYXQgaXQgaXMgaW1wbGVtZW50ZWQKICAgICAgICAgdXNpbmcgdGhlIGJpbmFyeSBzZWFyY2ggYWxnb3JpdGhtLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAhzdGRsaWIuaHhxAH4CyXQAVmNvbnN0IHZvaWQgKmtleSwgY29uc3Qgdm9pZCAqYXJyYXksIHNpemVfdCBjb3VudCwgc2l6ZV90IHNpemUsIGNvbXBhcmlzb25fZm5fdCBjb21wYXJldAAGdm9pZCAqdAAFYnRvd2NzcQB+AAp0A6sKICAgICAgICBUaGUgPENPREU+YnRvd2M8L0NPREU+IGZ1bmN0aW9uIChgYGJ5dGUgdG8gd2lkZSBjaGFyYWN0ZXInJykgY29udmVydHMgYSB2YWxpZAogICAgICAgICBzaW5nbGUgYnl0ZSBjaGFyYWN0ZXIgPFZBUj5jPC9WQVI+IGluIHRoZSBpbml0aWFsIHNoaWZ0IHN0YXRlIGludG8gdGhlIHdpZGUKICAgICAgICAgY2hhcmFjdGVyIGVxdWl2YWxlbnQgdXNpbmcgdGhlIGNvbnZlcnNpb24gcnVsZXMgZnJvbSB0aGUgY3VycmVudGx5CiAgICAgICAgIHNlbGVjdGVkIGxvY2FsZSBvZiB0aGUgPENPREU+TENfQ1RZUEU8L0NPREU+IGNhdGVnb3J5LgogICAgICAgICA8YnI+PGJyPiBJZiA8Q09ERT4odW5zaWduZWQgY2hhcikgPFZBUj5jPC9WQVI+PC9DT0RFPiBpcyBubyB2YWxpZCBzaW5nbGUgYnl0ZSBtdWx0aWJ5dGUKICAgICAgICAgY2hhcmFjdGVyIG9yIGlmIDxWQVI+YzwvVkFSPiBpcyA8Q09ERT5FT0Y8L0NPREU+LCB0aGUgZnVuY3Rpb24gcmV0dXJucyA8Q09ERT5XRU9GPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gUGxlYXNlIG5vdGUg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ZXJzZSBjb21wbGV4IGh5cGVyYm9saWMgY29zaW5lIG9mCiAgICAgICAgIDxWQVI+ejwvVkFSPi0tLXRoZSB2YWx1ZSB3aG9zZSBjb21wbGV4IGh5cGVyYm9saWMgY29zaW5lIGlzIDxWQVI+ejwvVkFSPi4gIFVubGlrZQogICAgICAgICB0aGUgcmVhbC12YWx1ZWQgZnVuY3Rpb25zLCB0aGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIHRoZSB2YWx1ZSBvZiA8VkFSPno8L1ZBUj4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACWNvbXBsZXguaHhxAH4DAXQAEGNvbXBsZXggZG91YmxlIHp0AA5jb21wbGV4IGRvdWJsZXQAB2NhY29zaGZzcQB+AAp0AQgKICAgICAgICBUaGVzZSBmdW5jdGlvbnMgcmV0dXJuIHRoZSBpbnZlcnNlIGNvbXBsZXggaHlwZXJib2xpYyBjb3NpbmUgb2YKICAgICAgICAgPFZBUj56PC9WQVI+LS0tdGhlIHZhbHVlIHdob3NlIGNvbXBsZXggaHlwZXJib2xpYyBjb3NpbmUgaXMgPFZBUj56PC9WQVI+LiAgVW5saWtlCiAgICAgICAgIHRoZSByZWFsLXZhbHVlZCBmdW5jdGlvbnMsIHRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gdGhlIHZhbHVlIG9mIDxWQVI+ejwvVkFSPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAJY29tcGxleC5oeHEAfgMIdAAPY29tcGxleCBmbG9hdCB6dAANY29tcGxleCBmbG9hdHQAB2NhY29zaGxzcQB+AAp0AQgKICAgICAgICBUaGVzZSBmdW5jdGlvbnMgcmV0dXJuIHRoZSBpbnZlcnNlIGNvbXBsZXggaHlwZXJib2xpYyBjb3NpbmUgb2YKICAgICAgICAgPFZBUj56PC9WQVI+LS0tdGhlIHZhbHVlIHdob3NlIGNvbXBsZXggaHlwZXJib2xpYyBjb3NpbmUgaXMgPFZBUj56PC9WQVI+LiAgVW5saWtlCiAgICAgICAgIHRoZSByZWFsLXZhbHVlZCBmdW5jdGlvbnMsIHRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gdGhlIHZhbHVlIG9mIDxWQVI+ejwvVkFSPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAJY29tcGxleC5oeHEAfgMPdAAVY29tcGxleCBsb25nIGRvdWJsZSB6dAATY29tcGxleCBsb25nIGRvdWJsZXQABmNhY29zbHNxAH4ACnQBKgogICAgICAgIFRoZXNlIGZ1bmN0aW9ucyBjb21wdXRlIHRoZSBjb21wbGV4IGFyYyBjb3NpbmUgb2YgPFZBUj56PC9WQVI+LS0tdGhhdCBpcywgdGhlCiAgICAgICAgIHZhbHVlIHdob3NlIGNvc2luZSBpcyA8VkFSPno8L1ZBUj4uICBUaGUgdmFsdWUgcmV0dXJuZWQgaXMgaW4gcmFkaWFucy4KICAgICAgICAgPGJyPjxicj4gVW5saWtlIHRoZSByZWFsLXZhbHVlZCBmdW5jdGlvbnMsIDxDT0RFPmNhY29zPC9DT0RFPiBpcyBkZWZpbmVkIGZvciBhbGwKICAgICAgICAgdmFsdWVzIG9mIDxWQVI+ejwvVkFSPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAJY29tcGxleC5oeHEAfgMWdAAVY29tcGxleCBsb25nIGRvdWJsZSB6dAATY29tcGxleCBsb25nIGRvdWJsZXQABmNhbGxvY3NxAH4ACnQA6AogICAgICAgIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGEgYmxvY2sgbG9uZyBlbm91Z2ggdG8gY29udGFpbiBhIHZlY3RvciBvZgogICAgICAgICA8VkFSPmNvdW50PC9WQVI+IGVsZW1lbnRzLCBlYWNoIG9mIHNpemUgPFZBUj5lbHRzaXplPC9WQVI+LiAgSXRzIGNvbnRlbnRzIGFyZQogICAgICAgICBjbGVhcmVkIHRvIHplcm8gYmVmb3JlIDxDT0RFPmNhbGxvYzwvQ09ERT4gcmV0dXJucy4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc3RkbGliLmh4cQB+Ax10ABxzaXplX3QgY291bnQsIHNpemVfdCBlbHRzaXpldAAGdm9pZCAqdAAWY2Fub25pY2FsaXplX2ZpbGVfbmFtZXNxAH4ACnQFrgogICAgICAgIDxicj48YnI+IFRoZSA8Q09ERT5jYW5vbmljYWxpemVfZmlsZV9uYW1lPC9DT0RFPiBmdW5jdGlvbiByZXR1cm5zIHRoZSBhYnNvbHV0ZSBuYW1lIG9mCiAgICAgICAgIHRoZSBmaWxlIG5hbWVkIGJ5IDxWQVI+bmFtZTwvVkFSPiB3aGljaCBjb250YWlucyBubyA8Q09ERT4uPC9DT0RFPiwgPENPREU+Li48L0NPREU+CiAgICAgICAgIGNvbXBvbmVudHMgbm9yIGFueSByZXBlYXRlZCBwYXRoIHNlcGFyYXRvcnMgKDxDT0RFPi88L0NPREU+KSBvciBzeW1saW5rcy4gIFRoZQogICAgICAgICByZXN1bHQgaXMgcGFzc2VkIGJhY2sgYXMgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24gaW4gYSBibG9jayBvZgogICAgICAgICBtZW1vcnkgYWxsb2NhdGVkIHdpdGggPENPREU+bWFsbG9jPC9DT0RFPi4gIElmIHRoZSByZXN1bHQgaXMgbm90IHVzZWQgYW55bW9yZQogICAgICAgICB0aGUgbWVtb3J5IHNob3VsZCBiZSBmcmVlZCB3aXRoIGEgY2FsbCB0byA8Q09ERT5mcmVlPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gSWYgYW55IG9mIHRoZSBwYXRoIGNvbXBvbmVudHMgaXMgbWlzc2luZyB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIE5VTEwKICAgICAgICAgcG9pbnRlci4gIFRoaXMgaXMgYWxzbyB3aGF0IGlzIHJldHVybmVkIGlmIHRoZSBsZW5ndGggb2YgdGhlIHBhdGgKICAgICAgICAgcmVhY2hlcyBvciBleGNlZWRzIDxDT0RFPlBBVEhfTUFYPC9DT0RFPiBjaGFyYWN0ZXJzLiAgSW4gYW55IGNhc2UKICAgICAgICAgPENPREU+ZXJybm88L0NPREU+IGlzIHNldCBhY2NvcmRpbmdseS4KICAgICAgICAgPGJyPjxicj4gPERMPgoKICAgICAgICAgPERUPjxDT0RFPkVOQU1FVE9PTE9ORzwvQ09ERT4KPEREPgogICAgICAgICBUaGUgcmVzdWx0aW5nIHBhdGggaXMgdG9vIGxvbmcuICBUaGlzIGVycm9yIG9ubHkgb2NjdXJzIG9uIHN5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IGZsb2F0IHp0AA1jb21wbGV4IGZsb2F0dAAGY2F0YW5oc3EAfgAKdAETCiAgICAgICAgVGhlc2UgZnVuY3Rpb25zIHJldHVybiB0aGUgaW52ZXJzZSBjb21wbGV4IGh5cGVyYm9saWMgdGFuZ2VudCBvZgogICAgICAgICA8VkFSPno8L1ZBUj4tLS10aGUgdmFsdWUgd2hvc2UgY29tcGxleCBoeXBlcmJvbGljIHRhbmdlbnQgaXMgPFZBUj56PC9WQVI+LiAgVW5saWtlCiAgICAgICAgIHRoZSByZWFsLXZhbHVlZCBmdW5jdGlvbnMsIHRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gdGhlIHZhbHVlIG9mCiAgICAgICAgIDxWQVI+ejwvVkFSPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAJY29tcGxleC5oeHEAfgN4dAAQY29tcGxleCBkb3VibGUgenQADmNvbXBsZXggZG91YmxldAAHY2F0YW5oZnNxAH4ACnQBEwogICAgICAgIFRoZXNlIGZ1bmN0aW9ucyByZXR1cm4gdGhlIGludmVyc2UgY29tcGxleCBoeXBlcmJvbGljIHRhbmdlbnQgb2YKICAgICAgICAgPFZBUj56PC9WQVI+LS0tdGhlIHZhbHVlIHdob3NlIGNvbXBsZXggaHlwZXJib2xpYyB0YW5nZW50IGlzIDxWQVI+ejwvVkFSPi4gIFVubGlrZQogICAgICAgICB0aGUgcmVhbC12YWx1ZWQgZnVuY3Rpb25zLCB0aGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIHRoZSB2YWx1ZSBvZgogICAgICAgICA8VkFSPno8L1ZBUj4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACWNvbXBsZXguaHhxAH4Df3QAD2NvbXBsZXggZmxvYXQgenQADWNvbXBsZXggZmxvYXR0AAdjYXRhbmhsc3EAfgAKdAETCiAgICAgICAgVGhlc2UgZnVuY3Rpb25zIHJldHVybiB0aGUgaW52ZXJzZSBjb21wbGV4IGh5cGVyYm9saWMgdGFuZ2VudCBvZgogICAgICAgICA8VkFSPno8L1ZBUj4tLS10aGUgdmFsdWUgd2hvc2UgY29tcGxleCBoeXBlcmJvbGlj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bWJlciBub3IgdGhlCiAgICAgICAgIG1lc3NhZ2UgbnVtYmVyIG11c3QgYmUgY29uc2VjdXRpdmUuICBUaGV5IGNhbiBiZSBhcmJpdHJhcmlseSBjaG9zZW4uCiAgICAgICAgIEJ1dCBlYWNoIG1lc3NhZ2UgKHVubGVzcyBlcXVhbCB0byBhbm90aGVyIG9uZSkgbXVzdCBoYXZlIGl0cyBvd24gdW5pcXVlCiAgICAgICAgIHBhaXIgb2Ygc2V0IGFuZCBtZXNzYWdlIG51bWJlci4KICAgICAgICAgPGJyPjxicj4gU2luY2UgaXQgaXMgbm90IGd1YXJhbnRlZWQgdGhhdCB0aGUgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgbGFuZ3VhZ2UKICAgICAgICAgc2VsZWN0ZWQgYnkgdGhlIHVzZXIgZXhpc3RzIHRoZSBsYXN0IHBhcmFtZXRlciA8VkFSPnN0cmluZzwvVkFSPiBoZWxwcyB0bwogICAgICAgICBoYW5kbGUgdGhpcyBjYXNlIGdyYWNlZnVsbHkuICBJZiBubyBtYXRjaGluZyBzdHJpbmcgY2FuIGJlIGZvdW5kCiAgICAgICAgIDxWQVI+c3RyaW5nPC9WQVI+IGlzIHJldHVybmVkLiAgVGhpcyBtZWFucyBmb3IgdGhlIHByb2dyYW1tZXIgdGhhdAogICAgICAgICA8YnI+PGJyPiA8T0w+CiAgICAgICAgIDxMST4KICAgICAgICAgdGhlIDxWQVI+c3RyaW5nPC9WQVI+IHBhcmFtZXRlcnMgc2hvdWxkIGNvbnRhaW4gcmVhc29uYWJsZSB0ZXh0ICh0aGlzIGFsc28KICAgICAgICAgaGVscHMgdG8gdW5kZXJzdGFuZCB0aGUgcHJvZ3JhbSBzZWVtcyBvdGhlcndpc2UgdGhlcmUgd291bGQgYmUgbm8gaGludAogICAgICAgICBvbiB0aGUgc3RyaW5nIHdoaWNoIGlzIGV4cGVjdGVkIHRvIGJlIHJldHVybmVkLgogICAgICAgICA8TEk+CiAgICAgICAgIGFsbCA8VkFSPnN0cmluZzwvVkFSPiBhcmd1bWVudHMgc2hvdWxkIGJlIHdyaXR0ZW4gaW4gdGhlIHNhbWUgbGFuZ3VhZ2UuCiAgICAgICAgIDwvT0w+CiAgICAgICAgc3EAfgAPAAAAAHcEAAAAAHhxAH4DmnQAPm5sX2NhdGQgY2F0YWxvZ19kZXNjLCBpbnQgc2V0LCBpbnQgbWVzc2FnZSwgY29uc3QgY2hhciAqc3RyaW5ndAAGY2hhciAqdAAHY2F0b3BlbnNxAH4ACnQeZQogICAgICAgIFRoZSA8Q09ERT5jYXRnZXRzPC9DT0RFPiBmdW5jdGlvbiB0cmllcyB0byBsb2NhdGUgdGhlIG1lc3NhZ2UgZGF0YSBmaWxlIG5hbWVzCiAgICAgICAgIDxWQVI+Y2F0X25hbWU8L1ZBUj4gYW5kIGxvYWRzIGl0IHdoZW4gZm91bmQuICBUaGUgcmV0dXJuIHZhbHVlIGlzIG9mIGFuCiAgICAgICAgIG9wYXF1ZSB0eXBlIGFuZCBjYW4gYmUgdXNlZCBpbiBjYWxscyB0byB0aGUgb3RoZXIgZnVuY3Rpb25zIHRvIHJlZmVyIHRvCiAgICAgICAgIHRoaXMgbG9hZGVkIGNhdGFsb2cuCiAgICAgICAgIDxicj48YnI+IFRoZSByZXR1cm4gdmFsdWUgaXMgPENPREU+KG5sX2NhdGQpIC0xPC9DT0RFPiBpbiBjYXNlIHRoZSBmdW5jdGlvbiBmYWlsZWQgYW5kCiAgICAgICAgIG5vIGNhdGFsb2cgd2FzIGxvYWRlZC4gIFRoZSBnbG9iYWwgdmFyaWFibGUgPFZBUj5lcnJubzwvVkFSPiBjb250YWlucyBhIGNvZGUKICAgICAgICAgZm9yIHRoZSBlcnJvciBjYXVzaW5nIHRoZSBmYWlsdXJlLiAgQnV0IGV2ZW4gaWYgdGhlIGZ1bmN0aW9uIGNhbGwKICAgICAgICAgc3VjY2VlZGVkIHRoaXMgZG9lcyBub3QgbWVhbiB0aGF0IGFsbCBtZXNzYWdlcyBjYW4gYmUgdHJhbnNsYXRlZC4KICAgICAgICAgPGJyPjxicj4gTG9jYXRpbmcgdGhlIGNhdGFsb2cgZmlsZSBtdXN0IGhhcHBlbiBpbiBhIHdheSB3aGljaCBsZXRzIHRoZSB1c2VyIG9mCiAgICAgICAgIHRoZSBwcm9ncmFtIGluZmx1ZW5jZSB0aGUgZGVjaXNpb24uICBJdCBpcyB1cCB0byB0aGUgdXNlciB0byBkZWNpZGUKICAgICAgICAgYWJvdXQgdGhlIGxhbmd1YWdlIHRvIHVzZSBhbmQgc29tZXRpbWVzIGl0IGlzIHVzZWZ1bCB0byB1c2UgYWx0ZXJuYXRlCiAgICAgICAgIGNhdGFsb2cgZmlsZXMuICBBbGwgdGhpcyBjYW4gYmUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyIGJ5IHNldHRpbmcgc29tZQogICAgICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCiAgICAgICAgIDxicj48YnI+IFRoZSBmaXJzdCBwcm9ibGVtIGlzIHRvIGZpbmQgb3V0IHdoZXJlIGFsbCB0aGUgbWVzc2FnZSBjYXRhbG9ncyBhcmUKICAgICAgICAgc3RvcmVkLiAgRXZlcnkgcHJvZ3JhbSBjb3VsZCBoYXZlIGl0cyBvd24gcGxhY2UgdG8ga2VlcCBhbGwgdGhlCiAgICAgICAgIGRpZmZlcmVudCBmaWxlcyBidXQgdXN1YWxseSB0aGUgY2F0YWxvZyBmaWxlcyBhcmUgZ3JvdXBlZCBieSBsYW5ndWFnZXMKICAgICAgICAgYW5kIHRoZSBjYXRhbG9ncyBmb3IgYWxsIHByb2dyYW1zIGFyZSBrZXB0IGluIHRoZSBzYW1lIHBsYWNlLgogICAgICAgICA8YnI+PGJyPiAgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgICAgICAgVG8gdGVsbCB0aGUgPENPREU+Y2F0b3BlbjwvQ09ERT4gZnVuY3Rpb24gd2hlcmUgdGhlIGNhdGFsb2cgZm9yIHRoZSBwcm9ncmFtCiAgICAgICAgIGNhbiBiZSBmb3VuZCB0aGUgdXNlciBjYW4gc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSA8Q09ERT5OTFNQQVRIPC9DT0RFPiB0bwogICAgICAgICBhIHZhbHVlIHdoaWNoIGRlc2NyaWJlcyBoZXIvaGlzIGNob2ljZS4gIFNpbmNlIHRoaXMgdmFsdWUgbXVzdCBiZSB1c2FibGUKICAgICAgICAgZm9yIGRpZmZlcmVudCBsYW5ndWFnZXMgYW5kIGxvY2FsZXMgaXQgY2Fubm90IGJlIGEgc2ltcGxlIHN0cmluZy4KICAgICAgICAgSW5zdGVhZCBpdCBpcyBhIGZvcm1hdCBzdHJpbmcgKHNpbWlsYXIgdG8gPENPREU+cHJpbnRmPC9DT0RFPidzKS4gIEFuIGV4YW1wbGUKICAgICAgICAgaXMKICAgICAgICAgPGJyPjxicj4gPHByZT48YnI+CiAgICAgICAgIC91c3Ivc2hhcmUvbG9jYWxlLyVMLyVOOi91c3Ivc2hhcmUvbG9jYWxlLyVML0xDX01FU1NBR0VTLyVOPGJyPgogICAgICAgICA8L3ByZT48YnI+CiAgICAgICAgIDxicj48YnI+IEZpcnN0IG9uZSBjYW4gc2VlIHRoYXQgbW9yZSB0aGFuIG9uZSBkaXJlY3RvcnkgY2FuIGJlIHNwZWNpZmllZCAod2l0aDxicj4KICAgICAgICAgdGhlIHVzdWFsIHN5bnRheCBvZiBzZXBhcmF0aW5nIHRoZW0gYnkgY29sb25zKS4gIFRoZSBuZXh0IHRoaW5ncyB0bzxicj4KICAgICAgICAgb2JzZXJ2ZSBhcmUgdGhlIGZvcm1hdCBzdHJpbmcsIDxDT0RFPiVMPC9DT0RFPiBhbmQgPENPREU+JU48L0NPREU+IGluIHRoaXMgY2FzZS48YnI+CiAgICAgICAgIFRoZSA8Q09ERT5jYXRvcGVuPC9DT0RFPiBmdW5jdGlvbiBrbm93cyBhYm91dCBzZXZlcmFsIG9mIHRoZW0gYW5kIHRoZTxicj4KICAgICAgICAgcmVwbGFjZW1lbnQgZm9yIGFsbCBvZiB0aGVtIGlzIG9mIGNvdXJzZSBkaWZmZXJlbnQuPGJyPgogICAgICAgICA8YnI+PGJyPiA8REw+Cjxicj4KICAgICAgICAgPERUPjxDT0RFPiVOPGJyPjwvQ09ERT4KPEREPgogICAgICAgICBUaGlzIGZvcm1hdCBlbGVtZW50IGlzIHN1YnN0aXR1dGVkIHdpdGggdGhlIG5hbWUgb2YgdGhlIGNhdGFsb2cgZmlsZS48YnI+CiAgICAgICAgIFRoaXMgaXMgdGhlIHZhbHVlIG9mIHRoZSA8VkFSPmNhdF9uYW1lPC9WQVI+IGFyZ3VtZW50IGdpdmVuIHRvPGJyPgogICAgICAgICA8Q09ERT5jYXRnZXRzPC9DT0RFPi48YnI+CiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT4lTDxicj48L0NPREU+CjxERD4KICAgICAgICAgVGhpcyBmb3JtYXQgZWxlbWVudCBpcyBzdWJzdGl0dXRlZCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50bHk8YnI+CiAgICAgICAgIHNlbGVjdGVkIGxvY2FsZSBmb3IgdHJhbnNsYXRpbmcgbWVzc2FnZXMuICBIb3cgdGhpcyBpcyBkZXRlcm1pbmVkIGlzPGJyPgogICAgICAgICBleHBsYWluZWQgYmVsb3cuPGJyPgogICAgICAgICA8YnI+PGJyPiA8TEk+ICVsPGJyPgogICAgICAgICAoVGhpcyBpcyB0aGUgbG93ZXJjYXNlIGVsbC4pIFRoaXMgZm9ybWF0IGVsZW1lbnQgaXMgc3Vic3RpdHV0ZWQgd2l0aCB0aGU8YnI+CiAgICAgICAgIGxhbmd1YWdlIGVsZW1lbnQgb2YgdGhlIGxvY2FsZSBuYW1lLiAgVGhlIHN0cmluZyBkZXNjcmliaW5nIHRoZSBzZWxlY3RlZDxicj4KICAgICAgICAgbG9jYWxlIGlzIGV4cGVjdGVkIHRvIGhhdmUgdGhlIGZvcm08YnI+CiAgICAgICAgIDxDT0RFPjxWQVI+bGFuZzwvVkFSPltfPFZBUj50ZXJyPC9WQVI+Wy48VkFSPmNvZGVzZXQ8L1ZBUj5dXTwvQ09ERT4gYW5kIHRoaXMgZm9ybWF0IHVzZXMgdGhlPGJyPgogICAgICAgICBmaXJzdCBwYXJ0IDxWQVI+bGFuZzwvVkFSPi48YnI+CiAgICAgICAgIDxicj48YnI+IDxMST4gJXQ8YnI+CiAgICAgICAgIFRoaXMgZm9ybWF0IGVsZW1lbnQgaXMgc3Vic3RpdHV0ZWQgYnkgdGhlIHRlcnJpdG9yeSBwYXJ0IDxWQVI+dGVycjwvVkFSPiBvZjxicj4KICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBsb2NhbGUuICBTZWUgdGhlIGV4cGxhbmF0aW9uIG9mIHRoZTxicj4KICAgICAgICAgZm9ybWF0IGFib3ZlLjxicj4KICAgICAgICAgPGJyPjxicj4gPExJPiAlYzxicj4KICAgICAgICAgVGhpcyBmb3JtYXQgZWxlbWVudCBpcyBzdWJzdGl0dXRlZCBieSB0aGUgY29kZXNldCBwYXJ0IDxWQVI+Y29kZXNldDwvVkFSPiBvZjxicj4KICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBsb2NhbGUuICBTZWUgdGhlIGV4cGxhbmF0aW9uIG9mIHRoZTxicj4KICAgICAgICAgZm9ybWF0IGFib3ZlLjxicj4KICAgICAgICAgPGJyPjxicj4gPExJPiAlJTxicj4KICAgICAgICAgU2luY2UgPENPREU+JTwvQ09ERT4gaXMgdXNlZCBpbiBhIG1ldGEgY2hhcmFjdGVyIHRoZXJlIG11c3QgYmUgYSB3YXkgdG88YnI+CiAgICAgICAgIGV4cHJlc3MgdGhlIDxDT0RFPiU8L0NPREU+IGNoYXJhY3RlciBpbiB0aGUgcmVzdWx0IGl0c2VsZi4gIFVzaW5nIDxDT0RFPiUlPC9DT0RFPjxicj4KICAgICAgICAgZG9lcyB0aGlzIGp1c3QgbGlrZSBpdCB3b3JrcyBmb3IgPENPREU+cHJpbnRmPC9DT0RFPi48YnI+CiAgICAgICAgIDxicj4KICAgICAgICAgPGJyPjxicj4gPGJyPjxicj4gVXNpbmcgPENPREU+TkxTUEFUSDwvQ09ERT4gYWxsb3dzIGFyYml0cmFyeSBkaXJlY3RvcmllcyB0byBiZSBzZWFyY2hlZCBmb3I8YnI+CiAgICAgICAgIG1lc3NhZ2UgY2F0YWxvZ3Mgd2hpbGUgc3RpbGwgYWxsb3dpbmcgZGlmZmVyZW50IGxhbmd1YWdlcyB0byBiZSB1c2VkLjxicj4KICAgICAgICAgSWYgdGhlIDxDT0RFPk5MU1BBVEg8L0NPREU+IGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBzZXQsIHRoZSBkZWZhdWx0IHZhbHVlPGJyPgogICAgICAgICBpczxicj4KICAgICAgICAgPGJyPjxicj4gPHByZT48YnI+CiAgICAgICAgIDxWQVI+cHJlZml4PC9WQVI+L3NoYXJlL2xvY2FsZS8lTC8lTjo8VkFSPnByZWZpeDwvVkFSPi9zaGFyZS9sb2NhbGUvJUwvTENfTUVTU0FHRVMvJU48YnI+CiAgICAgICAgIDwvcHJlPjxicj4KICAgICAgICAgPGJyPjxicj4gPGJyPgogICAgICAgICB3aGVyZSA8VkFSPnByZWZpeDwvVkFSPiBpcyBnaXZlbiB0byA8Q09ERT5jb25maWd1cmU8L0NPREU+IHdoaWxlIGluc3RhbGxpbmcgdGhlIEdOVTxicj4KICAgICAgICAgQyBMaWJyYXJ5ICh0aGlzIHZhbHVlIGlzIGluIG1hbnkgY2FzZXMgPENPREU+L3VzcjwvQ09ERT4gb3IgdGhlIGVtcHR5IHN0cmluZykuPGJyPgogICAgICAgICA8YnI+PGJyPiBUaGUgcmVtYWluaW5nIHByb2JsZW0gaXMgdG8gZGVjaWRlIHdoaWNoIG11c3QgYmUgdXNlZC4gIFRoZSB2YWx1ZTxicj4KICAgICAgICAgZGVjaWRlcyBhYm91dCB0aGUgc3Vic3RpdHV0aW9uIG9mIHRoZSBmb3JtYXQgZWxlbWVudHMgbWVudGlvbmVkIGFib3ZlLjxicj4KICAgICAgICAgRmlyc3Qgb2YgYWxsIHRoZSB1c2VyIGNhbiBzcGVjaWZ5IGEgcGF0aCBpbiB0aGUgbWVzc2FnZSBjYXRhbG9nIG5hbWU8YnI+CiAgICAgICAgIChpLmUuLCB0aGUgbmFtZSBjb250YWlucyBhIHNsYXNoIGNoYXJhY3RlcikuICBJbiB0aGlzIHNpdHVhdGlvbiB0aGU8YnI+CiAgICAgICAgIDxDT0RFPk5MU1BBVEg8L0NPREU+IGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCB1c2VkLiAgVGhlIGNhdGFsb2cgbXVzdCBleGlzdDxicj4KICAgICAgICAgYXMgc3BlY2lmaWVkIGluIHRoZSBwcm9ncmFtLCBwZXJoYXBzIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmc8YnI+CiAgICAgICAgIGRpcmVjdG9yeS4gIFRoaXMgc2l0dWF0aW9uIGluIG5vdCBkZXNpcmFibGUgYW5kIGNhdGFsb2dzIG5hbWVzIG5ldmVyPGJyPgogICAgICAgICBzaG91bGQgYmUgd3JpdHRlbiB0aGlzIHdheS4gIEJlc2lkZSB0aGlzLCB0aGlzIGJlaGF2aW9yIGlzIG5vdCBwb3J0YWJsZTxicj4KICAgICAgICAgdG8gYWxsIG90aGVyIHBsYXRmb3JtcyBwcm92aWRpbmcgdGhlIDxDT0RFPmNhdGdldHM8L0NPREU+IGludGVyZmFjZS48YnI+CiAgICAgICAgIDxicj48YnI+ICBlbnZpcm9ubWVudCB2YXJpYWJsZTxicj4KICAgICAgICAgIGVudmlyb25tZW50IHZhcmlhYmxlPGJyPgogICAgICAgICAgZW52aXJvbm1lbnQgdmFyaWFibGU8YnI+CiAgICAgICAgIE90aGVyd2lzZSB0aGUgdmFsdWVzIG9mIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIHRoZSBzdGFuZGFyZDxicj4KICAgICAgICAgZW52aXJvbm1lbnQgYXJlIGV4YW1pbmVkLiBXaGljaDxicj4KICAgICAgICAgdmFyaWFibGVzIGFyZSBleGFtaW5lZCBpcyBkZWNpZGVkIGJ5IHRoZSA8VkFSPmZsYWc8L1ZBUj4gcGFyYW1ldGVyIG9mPGJyPgogICAgICAgICA8Q09ERT5jYXRvcGVuPC9DT0RFPi4gIElmIHRoZSB2YWx1ZSBpcyA8Q09ERT5OTF9DQVRfTE9DQUxFPC9DT0RFPiAod2hpY2ggaXMgZGVmaW5lZDxicj4KICAgICAgICAgaW4gPFRUPm5sX3R5cGVzLmg8L1RUPikgdGhlbiB0aGUgPENPREU+Y2F0b3BlbjwvQ09ERT4gZnVuY3Rpb24gdXNlIHRoZSBuYW1lIG9mPGJyPgogICAgICAgICB0aGUgbG9jYWxlIGN1cnJlbnRseSBzZWxlY3RlZCBmb3IgdGhlIDxDT0RFPkxDX01FU1NBR0VTPC9DT0RFPiBjYXRlZ29yeS48YnI+CiAgICAgICAgIDxicj48YnI+IElmIDxWQVI+ZmxhZzwvVkFSPiBpcyB6ZXJvIHRoZSA8Q09ERT5MQU5HPC9DT0RFPiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBleGFtaW5lZC48YnI+CiAgICAgICAgIFRoaXMgaXMgYSBsZWZ0LW92ZXIgZnJvbSB0aGUgZWFybHkgZGF5cyB3aGVyZSB0aGUgY29uY2VwdCBvZiB0aGUgbG9jYWxlczxicj4KICAgICAgICAgaGFkIG5vdCBldmVuIHJlYWNoZWQgdGhlIGxldmVsIG9mIFBPU0lYIGxvY2FsZXMuPGJyPgogICAgICAgICA8YnI+PGJyPiBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgYW5kIHRoZSBsb2NhbGUgbmFtZSBzaG91bGQgaGF2ZSBhIHZhbHVlIG9mIHRoZTxicj4KICAgICAgICAgZm9ybSA8Q09ERT48VkFSPmxhbmc8L1ZBUj5bXzxWQVI+dGVycjwvVkFSPlsuPFZBUj5jb2Rlc2V0PC9WQVI+XV08L0NPREU+IGFzIGV4cGxhaW5lZCBhYm92ZS48YnI+CiAgICAgICAgIElmIG5vIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldCB0aGUgPENPREU+IkMiPC9DT0RFPiBsb2NhbGUgaXMgdXNlZCB3aGljaDxicj4KICAgICAgICAgcHJldmVudHMgYW55IHRyYW5zbGF0aW9uLjxicj4KICAgICAgICAgPGJyPjxicj4gVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24gaXMgaW4gYW55IGNhc2UgYSB2YWxpZCBzdHJpbmcuICBFaXRoZXI8YnI+CiAgICAgICAgIGl0IGlzIGEgdHJhbnNsYXRpb24gZnJvbSBhIG1lc3NhZ2UgY2F0YWxvZyBvciBpdCBpcyB0aGUgc2FtZSBhcyB0aGU8YnI+CiAgICAgICAgIDxWQVI+c3RyaW5nPC9WQVI+IHBhcmFtZXRlci4gIFNvIGEgcGllY2Ugb2YgY29kZSB0byBkZWNpZGUgd2hldGhlciBhPGJyPgogICAgICAgICB0cmFuc2xhdGlvbiBhY3R1YWxseSBoYXBwZW5lZCBtdXN0IGxvb2sgbGlrZSB0aGlzOjxicj4KICAgICAgICAgPGJyPjxicj4gPHByZT48YnI+CiAgICAgICAgIHs8YnI+CiAgICAgICAgICAgY2hhciAqdHJhbnMgPSBjYXRnZXRzIChkZXNjLCBzZXQsIG1zZywgaW5wdXRfc3RyaW5nKTs8YnI+CiAgICAgICAgICAgaWYgKHRyYW5zID09IGlucHV0X3N0cmluZyk8YnI+CiAgICAgICAgICAgICB7PGJyPgogICAgICAgICAgICAgICAvKiBTb21ldGhpbmcgd2VudCB3cm9uZy4gICovPGJyPgogICAgICAgICAgICAgfTxicj4KICAgICAgICAgfTxicj4KICAgICAgICAgPC9wcmU+CiAgICAgICAgIDxicj48YnI+CiAgICAgICAgIFdoZW4gYW4gZXJyb3Igb2NjdXJyZWQgdGhlIGdsb2JhbCB2YXJpYWJsZSA8VkFSPmVycm5vPC9WQVI+IGlzIHNldCB0bwogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8TEk+IEVCQURGCiAgICAgICAgIFRoZSBjYXRhbG9nIGRvZXMgbm90IGV4aXN0LgogICAgICAgICA8TEk+IEVOT01TRwogICAgICAgICBUaGUgc2V0L21lc3NhZ2UgdHVwbGUgZG9lcyBub3QgbmFtZSBhbiBleGlzdGluZyBlbGVtZW50IGluIHRoZQogICAgICAgICBtZXNzYWdlIGNhdGFsb2cuCgogICAgICAgICA8YnI+PGJyPiBXaGlsZSBpdCBzb21ldGltZXMgY2FuIGJlIHVzZWZ1bCB0byB0ZXN0IGZvciBlcnJvcnMgcHJvZ3JhbXMgbm9ybWFsbHkKICAgICAgICAgd2lsbCBhdm9pZCBhbnkgdGVzdC4gIElmIHRoZSB0cmFuc2xhdGlvbiBpcyBub3QgYXZhaWxhYmxlIGl0IGlzIG5vIGJpZwogICAgICAgICBwcm9ibGVtIGlmIHRoZSBvcmlnaW5hbCwgdW50cmFuc2xhdGVkIG1lc3NhZ2UgaXMgcHJpbnRlZC4gIEVpdGhlciB0aGUKICAgICAgICAgdXNlciB1bmRlcnN0YW5kcyB0aGlzIGFzIHdlbGwgb3Igcy9oZSB3aWxsIGxvb2sgZm9yIHRoZSByZWFzb24gd2h5IHRoZQogICAgICAgICBtZXNzYWdlcyBhcmUgbm90IHRyYW5zbGF0ZWQuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACm5sX3R5cGVzLmh4cQB+A6B0AB5jb25zdCBjaGFyICpjYXRfbmFtZSwgaW50IGZsYWd0AAdubF9jYXRkdAAJY2JjX2NyeXB0c3EAfgAKdASyCiAgICAgICAgPGJyPjxicj4gVGhlIGZ1bmN0aW9uIDxDT0RFPmNiY19jcnlwdDwvQ09ERT4gZW5jcnlwdHMgb3IgZGVjcnlwdHMgb25lIG9yIG1vcmUgYmxvY2tzCiAgICAgICAgIHVzaW5nIERFUyBpbiBDaXBoZXIgQmxvY2sgQ2hhaW5pbmcgbW9kZS4KICAgICAgICAgPGJyPjxicj4gRm9yIGVuY3J5cHRpb24gaW4gQ0JDIG1vZGUsIGVhY2ggYmxvY2sgaXMgZXhjbHVzaXZlLW9yZWQgd2l0aCA8VkFSPml2ZWM8L1ZBUj4KICAgICAgICAgYmVmb3JlIGJlaW5nIGVuY3J5cHRlZCwgdGhlbiA8VkFSPml2ZWM8L1ZBUj4gaXMgcmVwbGFjZWQgd2l0aCB0aGUgcmVzdWx0IG9mCiAgICAgICAgIHRoZSBlbmNyeXB0aW9uLCB0aGVuIHRoZSBuZXh0IGJsb2NrIGlzIHByb2Nlc3NlZC4gIERlY3J5cHRpb24gaXMgdGhlCiAgICAgICAgIHJldmVyc2Ugb2YgdGhpcyBwcm9jZXNzLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGhhcyB0aGUgYWR2YW50YWdlIHRoYXQgYmxvY2tzIHdoaWNoIGFyZSB0aGUgc2FtZSBiZWZvcmUgYmVpbmcKICAgICAgICAgZW5jcnlwdGVkIGFyZSB2ZXJ5IHVubGlrZWx5IHRvIGJlIHRoZSBzYW1lIGFmdGVyIGJlaW5nIGVuY3J5cHRlZCwgbWFraW5nCiAgICAgICAgIGl0IG11Y2ggaGFyZGVyIHRvIGRldGVjdCBwYXR0ZXJucyBpbiB0aGUgZGF0YS4KICAgICAgICAgPGJyPjxicj4gVXN1YWxseSwgPFZBUj5pdmVjPC9WQVI+IGlzIHNldCB0byA4IHJhbmRvbSBieXRlcyBiZWZvcmUgZW5jcnlwdGlvbiBzdGFydHMuCiAgICAgICAgIFRoZW4gdGhlIDggcmFuZG9tIGJ5dGVzIGFyZSB0cmFuc21pdHRlZCBhbG9uZyB3aXRoIHRoZSBlbmNyeXB0ZWQgZGF0YQogICAgICAgICAod2l0aG91dCB0aGVtc2VsdmVzIGJlaW5nIGVuY3J5cHRlZCksIGFuZCBwYXNzZWQgYmFjayBpbiBhcyA8VkFSPml2ZWM8L1ZBUj4KICAgICAgICAgZm9yIGRlY3J5cHRpb24uICBBbm90aGVyIHBvc3NpYmlsaXR5IGlzIHRvIHNldCA8VkFSPml2ZWM8L1ZBUj4gdG8gOCB6ZXJvZXMKICAgICAgICAgaW5pdGlhbGx5LCBhbmQgaGF2ZSB0aGUgZmlyc3QgdGhlIGJsb2NrIGVuY3J5cHRlZCBjb25zaXN0IG9mIDggcmFuZG9tCiAgICAgICAgIGJ5dGVzLgogICAgICAgICA8YnI+PGJyPiBPdGhlcndpc2UsIGFsbCB0aGUgcGFyYW1ldGVycyBhcmUgc2ltaWxhciB0byB0aG9zZSBmb3IgPENPREU+ZWNiX2NyeXB0PC9DT0RFPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAPcnBjL2Rlc19jcnlwdC5oeHEAfgOndABAY2hhciAqa2V5LCBjaGFyICpibG9ja3MsIHVuc2lnbmVkIGxlbiwgdW5zaWduZWQgbW9kZSwgY2hhciAqaXZlY3QAA2ludHQABGNicnRzcQB+AAp0AKYKICAgICAgICBUaGVzZSBmdW5jdGlvbnMgcmV0dXJuIHRoZSBjdWJlIHJvb3Qgb2YgPFZBUj54PC9WQVI+LiAgVGhleSBjYW5ub3QKICAgICAgICAgZmFpbDsgZXZlcnkgcmVwcmVzZW50YWJsZSByZWFsIHZhbHVlIGhhcyBhIHJlcHJlc2VudGFibGUgcmVhbCBjdWJlIHJvb3QuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQABm1hdGguaHhxAH4DrnQACGRvdWJsZSB4dAAGZG91YmxldAAFY2JydGZzcQB+AAp0AKYKICAgICAgICBUaGVzZSBmdW5jdGlvbnMgcmV0dXJuIHRoZSBjdWJlIHJvb3Qgb2YgPFZBUj54PC9WQVI+LiAgVGhleSBjYW5ub3QKICAgICAgICAgZmFpbDsgZXZlcnkgcmVwcmVzZW50YWJsZSByZWFsIHZhbHVlIGhhcyBhIHJlcHJlc2VudGFibGUgcmVhbCBjdWJlIHJvb3QuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQABm1hdGguaHhxAH4DtXQAB2Zsb2F0IHh0AAVmbG9hdHQABWNicnRsc3EAfgAKdACmCiAgICAgICAgVGhlc2UgZnVuY3Rpb25zIHJldHVybiB0aGUgY3ViZSByb290IG9mIDxWQVI+eDwvVkFSPi4gIFRoZXkgY2Fubm90CiAgICAgICAgIGZhaWw7IGV2ZXJ5IHJl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biBzZXRzIHRoZSBhY2Nlc3MgcGVybWlzc2lvbiBiaXRzIGZvciB0aGUgZmlsZQogICAgICAgICBuYW1lZCBieSA8VkFSPmZpbGVuYW1lPC9WQVI+IHRvIDxWQVI+bW9kZTwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gSWYgPFZBUj5maWxlbmFtZTwvVkFSPiBpcyBhIHN5bWJvbGljIGxpbmssIDxDT0RFPmNobW9kPC9DT0RFPiBjaGFuZ2VzIHRoZQogICAgICAgICBwZXJtaXNzaW9ucyBvZiB0aGUgZmlsZSBwb2ludGVkIHRvIGJ5IHRoZSBsaW5rLCBub3QgdGhvc2Ugb2YgdGhlIGxpbmsKICAgICAgICAgaXRzZWxmLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgPENPREU+MDwvQ09ERT4gaWYgc3VjY2Vzc2Z1bCBhbmQgPENPREU+LTE8L0NPREU+IGlmIG5vdC4gIEluCiAgICAgICAgIGFkZGl0aW9uIHRvIHRoZSB1c3VhbCBmaWxlIG5hbWUgZXJyb3JzICwgdGhlIGZvbGxvd2luZyA8Q09ERT5lcnJubzwvQ09ERT4gZXJyb3IgY29uZGl0aW9ucyBhcmUgZGVmaW5lZCBmb3IKICAgICAgICAgdGhpcyBmdW5jdGlvbjoKICAgICAgICAgPGJyPjxicj4gPERMPgoKICAgICAgICAgPERUPjxDT0RFPkVOT0VOVDwvQ09ERT4KPEREPgogICAgICAgICBUaGUgbmFtZWQgZmlsZSBkb2Vzbid0IGV4aXN0LgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVQRVJNCiAgICAgICAgIFRoaXMgcHJvY2VzcyBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gY2hhbmdlIHRoZSBhY2Nlc3MgcGVybWlzc2lvbnMKICAgICAgICAgb2YgdGhpcyBmaWxlLiAgT25seSB0aGUgZmlsZSdzIG93bmVyIChhcyBqdWRnZWQgYnkgdGhlIGVmZmVjdGl2ZSB1c2VyIElECiAgICAgICAgIG9mIHRoZSBwcm9jZXNzKSBvciBhIHByaXZpbGVnZWQgdXNlciBjYW4gY2hhbmdlIHRoZW0uCiAgICAgICAgIDxicj48YnI+IDxMST4gRVJPRlMKICAgICAgICAgVGhlIGZpbGUgcmVzaWRlcyBvbiBhIHJlYWQtb25seSBmaWxlIHN5c3RlbS4KICAgICAgICAgPGJyPjxicj4gPExJPiBFRlRZUEUKICAgICAgICAgPFZBUj5tb2RlPC9WQVI+IGhhcyB0aGUgPENPREU+U19JU1ZUWDwvQ09ERT4gYml0ICh0aGUgYGBzdGlja3kgYml0JycpIHNldCwKICAgICAgICAgYW5kIHRoZSBuYW1lZCBmaWxlIGlzIG5vdCBhIGRpcmVjdG9yeS4gIFNvbWUgc3lzdGVtcyBkbyBub3QgYWxsb3cgc2V0dGluZyB0aGUKICAgICAgICAgc3RpY2t5IGJpdCBvbiBub24tZGlyZWN0b3J5IGZpbGVzLCBhbmQgc29tZSBkbyAoYW5kIG9ubHkgc29tZSBvZiB0aG9zZQogICAgICAgICBhc3NpZ24gYSB1c2VmdWwgbWVhbmluZyB0byB0aGUgYml0IGZvciBub24tZGlyZWN0b3J5IGZpbGVzKS4KICAgICAgICAgPGJyPjxicj4gWW91IG9ubHkgZ2V0IDxDT0RFPkVGVFlQRTwvQ09ERT4gb24gc3lzdGVtcyB3aGVyZSB0aGUgc3RpY2t5IGJpdCBoYXMgbm8gdXNlZnVsCiAgICAgICAgIG1lYW5pbmcgZm9yIG5vbi1kaXJlY3RvcnkgZmlsZXMsIHNvIGl0IGlzIGFsd2F5cyBzYWZlIHRvIGp1c3QgY2xlYXIgdGhlCiAgICAgICAgIGJpdCBpbiA8VkFSPm1vZGU8L1ZBUj4gYW5kIGNhbGwgPENPREU+Y2htb2Q8L0NPREU+IGFnYWluLiAgLAogICAgICAgICBmb3IgZnVsbCBkZXRhaWxzIG9uIHRoZSBzdGlja3kgYml0LgoKICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAKc3lzL3N0YXQuaHhxAH4ET3QAIWNvbnN0IGNoYXIgKmZpbGVuYW1lLCBtb2RlX3QgbW9kZXQAA2ludHQABWNob3duc3EAfgAKdAWhCiAgICAgICAgVGhlIDxDT0RFPmNob3duPC9DT0RFPiBmdW5jdGlvbiBjaGFuZ2VzIHRoZSBvd25lciBvZiB0aGUgZmlsZSA8VkFSPmZpbGVuYW1lPC9WQVI+IHRvCiAgICAgICAgIDxWQVI+b3duZXI8L1ZBUj4sIGFuZCBpdHMgZ3JvdXAgb3duZXIgdG8gPFZBUj5ncm91cDwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gQ2hhbmdpbmcgdGhlIG93bmVyIG9mIHRoZSBmaWxlIG9uIGNlcnRhaW4gc3lzdGVtcyBjbGVhcnMgdGhlIHNldC11c2VyLUlECiAgICAgICAgIGFuZCBzZXQtZ3JvdXAtSUQgcGVybWlzc2lvbiBiaXRzLiAgKFRoaXMgaXMgYmVjYXVzZSB0aG9zZSBiaXRzIG1heSBub3QKICAgICAgICAgYmUgYXBwcm9wcmlhdGUgZm9yIHRoZSBuZXcgb3duZXIuKSAgT3RoZXIgZmlsZSBwZXJtaXNzaW9uIGJpdHMgYXJlIG5vdAogICAgICAgICBjaGFuZ2VkLgogICAgICAgICA8YnI+PGJyPiBUaGUgcmV0dXJuIHZhbHVlIGlzIDxDT0RFPjA8L0NPREU+IG9uIHN1Y2Nlc3MgYW5kIDxDT0RFPi0xPC9DT0RFPiBvbiBmYWlsdXJlLgogICAgICAgICBJbiBhZGRpdGlvbiB0byB0aGUgdXN1YWwgZmlsZSBuYW1lIGVycm9ycyAsCiAgICAgICAgIHRoZSBmb2xsb3dpbmcgPENPREU+ZXJybm88L0NPREU+IGVycm9yIGNvbmRpdGlvbnMgYXJlIGRlZmluZWQgZm9yIHRoaXMgZnVuY3Rpb246CiAgICAgICAgIDxicj48YnI+IDxETD4KCiAgICAgICAgIDxEVD48Q09ERT5FUEVSTTwvQ09ERT4KPEREPgogICAgICAgICBUaGlzIHByb2Nlc3MgbGFja3MgcGVybWlzc2lvbiB0byBtYWtlIHRoZSByZXF1ZXN0ZWQgY2hhbmdlLgogICAgICAgICA8YnI+PGJyPiBPbmx5IHByaXZpbGVnZWQgdXNlcnMgb3IgdGhlIGZpbGUncyBvd25lciBjYW4gY2hhbmdlIHRoZSBmaWxlJ3MgZ3JvdXAuCiAgICAgICAgIE9uIG1vc3QgZmlsZSBzeXN0ZW1zLCBvbmx5IHByaXZpbGVnZWQgdXNlcnMgY2FuIGNoYW5nZSB0aGUgZmlsZSBvd25lcjsKICAgICAgICAgc29tZSBmaWxlIHN5c3RlbXMgYWxsb3cgeW91IHRvIGNoYW5nZSB0aGUgb3duZXIgaWYgeW91IGFyZSBjdXJyZW50bHkgdGhlCiAgICAgICAgIG93bmVyLiAgV2hlbiB5b3UgYWNjZXNzIGEgcmVtb3RlIGZpbGUgc3lzdGVtLCB0aGUgYmVoYXZpb3IgeW91IGVuY291bnRlcgogICAgICAgICBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBzeXN0ZW0gdGhhdCBhY3R1YWxseSBob2xkcyB0aGUgZmlsZSwgbm90IGJ5IHRoZQogICAgICAgICBzeXN0ZW0geW91ciBwcm9ncmFtIGlzIHJ1bm5pbmcgb24uCiAgICAgICAgIDxicj48YnI+ICwgZm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZQogICAgICAgICA8Q09ERT5fUE9TSVhfQ0hPV05fUkVTVFJJQ1RFRDwvQ09ERT4gbWFjcm8uCiAgICAgICAgIDxicj48YnI+IDxMST4gRVJPRlMKICAgICAgICAgVGhlIGZpbGUgaXMgb24gYSByZWFkLW9ubHkgZmlsZSBzeXN0ZW0uCgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAh1bmlzdGQuaHhxAH4EVnQALmNvbnN0IGNoYXIgKmZpbGVuYW1lLCB1aWRfdCBvd25lciwgZ2lkX3QgZ3JvdXB0AANpbnR0AAVjaW1hZ3NxAH4ACnQAXwogICAgICAgIFRoZXNlIGZ1bmN0aW9ucyByZXR1cm4gdGhlIGltYWdpbmFyeSBwYXJ0IG9mIHRoZSBjb21wbGV4IG51bWJlciA8VkFSPno8L1ZBUj4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACWNvbXBsZXguaHhxAH4EXXQAEGNvbXBsZXggZG91YmxlIHp0AAZkb3VibGV0AAZjaW1hZ2ZzcQB+AAp0AF8KICAgICAgICBUaGVzZSBmdW5jdGlvbnMgcmV0dXJuIHRoZSBpbWFnaW5hcnkgcGFydCBvZiB0aGUgY29tcGxleCBudW1iZXIgPFZBUj56PC9WQVI+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAljb21wbGV4Lmh4cQB+BGR0AA9jb21wbGV4IGZsb2F0IHp0AAVmbG9hdHQABmNpbWFnbHNxAH4ACnQAXwogICAgICAgIFRoZXNlIGZ1bmN0aW9ucyByZXR1cm4gdGhlIGltYWdpbmFyeSBwYXJ0IG9mIHRoZSBjb21wbGV4IG51bWJlciA8VkFSPno8L1ZBUj4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACWNvbXBsZXguaHhxAH4Ea3QAFWNvbXBsZXggbG9uZyBkb3VibGUgenQAC2xvbmcgZG91YmxldAAIY2xlYXJlbnZzcQB+AAp0AUQKICAgICAgICBUaGUgPENPREU+Y2xlYXJlbnY8L0NPREU+IGZ1bmN0aW9uIHJlbW92ZXMgYWxsIGVudHJpZXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuCiAgICAgICAgIFVzaW5nIDxDT0RFPnB1dGVudjwvQ09ERT4gYW5kIDxDT0RFPnNldGVudjwvQ09ERT4gbmV3IGVudHJpZXMgY2FuIGJlIGFkZGVkIGFnYWluCiAgICAgICAgIGxhdGVyLgogICAgICAgICA8YnI+PGJyPiBJZiB0aGUgZnVuY3Rpb24gaXMgc3VjY2Vzc2Z1bCBpdCByZXR1cm5zIDxDT0RFPjA8L0NPREU+LiAgT3RoZXJ3aXNlIHRoZSByZXR1cm4KICAgICAgICAgdmFsdWUgaXMgbm9uemVyby4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc3RkbGliLmh4cQB+BHJ0AAR2b2lkdAADaW50dAAIY2xlYXJlcnJzcQB+AAp0AOYKICAgICAgICBUaGlzIGZ1bmN0aW9uIGNsZWFycyB0aGUgZW5kLW9mLWZpbGUgYW5kIGVycm9yIGluZGljYXRvcnMgZm9yIHRoZQogICAgICAgICBzdHJlYW0gPFZBUj5zdHJlYW08L1ZBUj4uCiAgICAgICAgIDxicj48YnI+IFRoZSBmaWxlIHBvc2l0aW9uaW5nIGZ1bmN0aW9ucyAgYWxzbyBjbGVhciB0aGUKICAgICAgICAgZW5kLW9mLWZpbGUgaW5kaWNhdG9yIGZvciB0aGUgc3RyZWFtLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAdzdGRpby5oeHEAfgR5dAAMRklMRSAqc3RyZWFtdAAEdm9pZHQAEWNsZWFyZXJyX3VubG9ja2Vkc3EAfgAK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aXRoIGEgcGlwZSBvciBGSUZPIGhhdmUgYmVlbiBjbG9zZWQsCiAgICAgICAgIGFueSB1bnJlYWQgZGF0YSBpcyBkaXNjYXJkZWQuCiAgICAgICAgIDwvT0w+CiAgICAgICAgIDxicj48YnI+IFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgaW4gbXVsdGktdGhyZWFkZWQgcHJvZ3JhbXMuICBUaGlzCiAgICAgICAgIGlzIGEgcHJvYmxlbSBpZiB0aGUgdGhyZWFkIGFsbG9jYXRlcyBzb21lIHJlc291cmNlcyAobGlrZSBtZW1vcnksIGZpbGUKICAgICAgICAgZGVzY3JpcHRvcnMsIHNlbWFwaG9yZXMgb3Igd2hhdGV2ZXIpIGF0IHRoZSB0aW1lIDxDT0RFPmNsb3NlPC9DT0RFPiBpcwogICAgICAgICBjYWxsZWQuICBJZiB0aGUgdGhyZWFkIGdldHMgY2FuY2VsZWQgdGhlc2UgcmVzb3VyY2VzIHN0YXkgYWxsb2NhdGVkCiAgICAgICAgIHVudGlsIHRoZSBwcm9ncmFtIGVuZHMuICBUbyBhdm9pZCB0aGlzLCBjYWxscyB0byA8Q09ERT5jbG9zZTwvQ09ERT4gc2hvdWxkIGJlCiAgICAgICAgIHByb3RlY3RlZCB1c2luZyBjYW5jZWxsYXRpb24gaGFuZGxlcnMuCiAgICAgICAgIDxicj48YnI+IFRoZSBub3JtYWwgcmV0dXJuIHZhbHVlIGZyb20gPENPREU+Y2xvc2U8L0NPREU+IGlzIDA7IGEgdmFsdWUgb2YgLTEKICAgICAgICAgaXMgcmV0dXJuZWQgaW4gY2FzZSBvZiBmYWlsdXJlLiAgVGhlIGZvbGxvd2luZyA8Q09ERT5lcnJubzwvQ09ERT4gZXJyb3IKICAgICAgICAgY29uZGl0aW9ucyBhcmUgZGVmaW5lZCBmb3IgdGhpcyBmdW5jdGlvbjoKICAgICAgICAgPGJyPjxicj4gPERMPgoKICAgICAgICAgPERUPjxDT0RFPkVCQURGPC9DT0RFPgo8REQ+CiAgICAgICAgIFRoZSA8VkFSPmZpbGVkZXM8L1ZBUj4gYXJndW1lbnQgaXMgbm90IGEgdmFsaWQgZmlsZSBkZXNjcmlwdG9yLgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVJTlRSCiAgICAgICAgIFRoZSA8Q09ERT5jbG9zZTwvQ09ERT4gY2FsbCB3YXMgaW50ZXJydXB0ZWQgYnkgYSBzaWduYWwuCiAgICAgICAgIC4KICAgICAgICAgSGVyZSBpcyBhbiBleGFtcGxlIG9mIGhvdyB0byBoYW5kbGUgPENPREU+RUlOVFI8L0NPREU+IHByb3Blcmx5OgogICAgICAgICA8YnI+PGJyPiA8cHJlPjxicj4KICAgICAgICAgVEVNUF9GQUlMVVJFX1JFVFJZIChjbG9zZSAoZGVzYykpOzxicj4KICAgICAgICAgPC9wcmU+CiAgICAgICAgIDxicj48YnI+IDxMST4gRU5PU1BDCiAgICAgICAgIDxMST54IEVJTwogICAgICAgICA8TEk+eCBFRFFVT1QKICAgICAgICAgV2hlbiB0aGUgZmlsZSBpcyBhY2Nlc3NlZCBieSBORlMsIHRoZXNlIGVycm9ycyBmcm9tIDxDT0RFPndyaXRlPC9DT0RFPiBjYW4gc29tZXRpbWVzCiAgICAgICAgIG5vdCBiZSBkZXRlY3RlZCB1bnRpbCA8Q09ERT5jbG9zZTwvQ09ERT4uICAsIGZvciBkZXRhaWxzCiAgICAgICAgIG9uIHRoZWlyIG1lYW5pbmcuCgogICAgICAgICA8YnI+PGJyPiBQbGVhc2Ugbm90ZSB0aGF0IHRoZXJlIGlzIDxFTT5ubzwvRU0+IHNlcGFyYXRlIDxDT0RFPmNsb3NlNjQ8L0NPREU+IGZ1bmN0aW9uLgogICAgICAgICBUaGlzIGlzIG5vdCBuZWNlc3Nhcnkgc2luY2UgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBkZXRlcm1pbmUgbm9yIGRlcGVuZAogICAgICAgICBvbiB0aGUgbW9kZSBvZiB0aGUgZmlsZS4gIFRoZSBrZXJuZWwgd2hpY2ggcGVyZm9ybXMgdGhlIDxDT0RFPmNsb3NlPC9DT0RFPgogICAgICAgICBvcGVyYXRpb24ga25vd3Mgd2hpY2ggbW9kZSB0aGUgZGVzY3JpcHRvciBpcyB1c2VkIGZvciBhbmQgY2FuIGhhbmRsZQogICAgICAgICB0aGlzIHNpdHVhdGlvbi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIdW5pc3RkLmh4cQB+BLl0AAtpbnQgZmlsZWRlc3QAA2ludHQACGNsb3NlZGlyc3EAfgAKdAGDCiAgICAgICAgVGhpcyBmdW5jdGlvbiBjbG9zZXMgdGhlIGRpcmVjdG9yeSBzdHJlYW0gPFZBUj5kaXJzdHJlYW08L1ZBUj4uICBJdCByZXR1cm5zCiAgICAgICAgIDxDT0RFPjA8L0NPREU+IG9uIHN1Y2Nlc3MgYW5kIDxDT0RFPi0xPC9DT0RFPiBvbiBmYWlsdXJlLgogICAgICAgICA8YnI+PGJyPiBUaGUgZm9sbG93aW5nIDxDT0RFPmVycm5vPC9DT0RFPiBlcnJvciBjb25kaXRpb25zIGFyZSBkZWZpbmVkIGZvciB0aGlzCiAgICAgICAgIGZ1bmN0aW9uOgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8RFQ+PENPREU+RUJBREY8L0NPREU+CjxERD4KICAgICAgICAgVGhlIDxWQVI+ZGlyc3RyZWFtPC9WQVI+IGFyZ3VtZW50IGlzIG5vdCB2YWxpZC4KCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACGRpcmVudC5oeHEAfgTAdAAORElSICpkaXJzdHJlYW10AANpbnR0AAhjbG9zZWxvZ3NxAH4ACnQEWAogICAgICAgIDxicj48YnI+IDxDT0RFPmNsb3NlbG9nPC9DT0RFPiBjbG9zZXMgdGhlIGN1cnJlbnQgU3lzbG9nIGNvbm5lY3Rpb24sIGlmIHRoZXJlIGlzIG9uZS4KICAgICAgICAgVGhpcyBpbmNsdWRlcyBjbG9zaW5nIHRoZSA8VFQ+ZGV2L2xvZzwvVFQ+IHNvY2tldCwgaWYgaXQgaXMgb3Blbi4KICAgICAgICAgPENPREU+Y2xvc2Vsb2c8L0NPREU+IGFsc28gc2V0cyB0aGUgaWRlbnRpZmljYXRpb24gc3RyaW5nIGZvciBTeXNsb2cgbWVzc2FnZXMKICAgICAgICAgYmFjayB0byB0aGUgZGVmYXVsdCwgaWYgPENPREU+b3BlbmxvZzwvQ09ERT4gd2FzIGNhbGxlZCB3aXRoIGEgbm9uLU5VTEwgYXJndW1lbnQKICAgICAgICAgdG8gPFZBUj5pZGVudDwvVkFSPi4gIFRoZSBkZWZhdWx0IGlkZW50aWZpY2F0aW9uIHN0cmluZyBpcyB0aGUgcHJvZ3JhbSBuYW1lCiAgICAgICAgIHRha2VuIGZyb20gYXJndlswXS4KICAgICAgICAgPGJyPjxicj4gSWYgeW91IGFyZSB3cml0aW5nIHNoYXJlZCBsaWJyYXJ5IGNvZGUgdGhhdCB1c2VzIDxDT0RFPm9wZW5sb2c8L0NPREU+IHRvCiAgICAgICAgIGdlbmVyYXRlIGN1c3RvbSBzeXNsb2cgb3V0cHV0LCB5b3Ugc2hvdWxkIHVzZSA8Q09ERT5jbG9zZWxvZzwvQ09ERT4gdG8gZHJvcCB0aGUKICAgICAgICAgR05VIEMgbGlicmFyeSdzIGludGVybmFsIHJlZmVyZW5jZSB0byB0aGUgPFZBUj5pZGVudDwvVkFSPiBwb2ludGVyIHdoZW4geW91IGFyZQogICAgICAgICBkb25lLiAgUGxlYXNlIHJlYWQgdGhlIHNlY3Rpb24gb24gPENPREU+b3BlbmxvZzwvQ09ERT4gZm9yIG1vcmUgaW5mb3JtYXRpb246CiAgICAgICAgIC4KICAgICAgICAgPGJyPjxicj4gPENPREU+Y2xvc2Vsb2c8L0NPREU+IGRvZXMgbm90IGZsdXNoIGFueSBidWZmZXJzLiAgWW91IGRvIG5vdCBoYXZlIHRvIGNhbGwKICAgICAgICAgPENPREU+Y2xvc2Vsb2c8L0NPREU+IGJlZm9yZSByZS1vcGVuaW5nIGEgU3lzbG9nIGNvbm5lY3Rpb24gd2l0aCA8Q09ERT5pbml0bG9nPC9DT0RFPi4KICAgICAgICAgU3lzbG9nIGNvbm5lY3Rpb25zIGFyZSBhdXRvbWF0aWNhbGx5IGNsb3NlZCBvbiBleGVjIG9yIGV4aXQuCiAgICAgICAgIDxicj48YnI+CiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHN5c2xvZy5oeHEAfgTHdAAEdm9pZHQABHZvaWR0AAdjb25mc3Ryc3EAfgAKdATWCiAgICAgICAgVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgdmFsdWUgb2YgYSBzdHJpbmctdmFsdWVkIHN5c3RlbSBwYXJhbWV0ZXIsCiAgICAgICAgIHN0b3JpbmcgdGhlIHN0cmluZyBpbnRvIDxWQVI+bGVuPC9WQVI+IGJ5dGVzIG9mIG1lbW9yeSBzcGFjZSBzdGFydGluZyBhdAogICAgICAgICA8VkFSPmJ1ZjwvVkFSPi4gIFRoZSA8VkFSPnBhcmFtZXRlcjwvVkFSPiBhcmd1bWVudCBzaG91bGQgYmUgb25lIG9mIHRoZQogICAgICAgICA8c2FtcD5fQ1NfPC9zYW1wPiBzeW1ib2xzIGxpc3RlZCBiZWxvdy4KICAgICAgICAgPGJyPjxicj4gVGhlIG5vcm1hbCByZXR1cm4gdmFsdWUgZnJvbSA8Q09ERT5jb25mc3RyPC9DT0RFPiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcKICAgICAgICAgdmFsdWUgdGhhdCB5b3UgYXNrZWQgZm9yLiAgSWYgeW91IHN1cHBseSBhIG51bGwgcG9pbnRlciBmb3IgPFZBUj5idWY8L1ZBUj4sCiAgICAgICAgIHRoZW4gPENPREU+Y29uZnN0cjwvQ09ERT4gZG9lcyBub3QgdHJ5IHRvIHN0b3JlIHRoZSBzdHJpbmc7IGl0IGp1c3QgcmV0dXJucwogICAgICAgICBpdHMgbGVuZ3RoLiAgQSB2YWx1ZSBvZiA8Q09ERT4wPC9DT0RFPiBpbmRpY2F0ZXMgYW4gZXJyb3IuCiAgICAgICAgIDxicj48YnI+IElmIHRoZSBzdHJpbmcgeW91IGFza2VkIGZvciBpcyB0b28gbG9uZyBmb3IgdGhlIGJ1ZmZlciAodGhhdCBpcywgbG9uZ2VyCiAgICAgICAgIHRoYW4gPENPREU+PFZBUj5sZW48L1ZBUj4gLSAxPC9DT0RFPiksIHRoZW4gPENPREU+Y29uZnN0cjwvQ09ERT4gc3RvcmVzIGp1c3QgdGhhdCBtdWNoCiAgICAgICAgIChsZWF2aW5nIHJvb20gZm9yIHRoZSB0ZXJtaW5hdGluZyBudWxsIGNoYXJhY3RlcikuICBZb3UgY2FuIHRlbGwgdGhhdAogICAgICAgICB0aGlzIGhhcyBoYXBwZW5lZCBiZWNhdXNlIDxDT0RFPmNvbmZzdHI8L0NPREU+IHJldHVybnMgYSB2YWx1ZSBncmVhdGVyIHRoYW4gb3IKICAg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bWVudHMgYXJlIGludGVycHJldGVkLgogICAgICAgICA8YnI+PGJyPiBOb3JtYWxseSwgPENPREU+Y29ubmVjdDwvQ09ERT4gd2FpdHMgdW50aWwgdGhlIHNlcnZlciByZXNwb25kcyB0byB0aGUgcmVxdWVzdAogICAgICAgICBiZWZvcmUgaXQgcmV0dXJucy4gIFlvdSBjYW4gc2V0IG5vbmJsb2NraW5nIG1vZGUgb24gdGhlIHNvY2tldAogICAgICAgICA8VkFSPnNvY2tldDwvVkFSPiB0byBtYWtlIDxDT0RFPmNvbm5lY3Q8L0NPREU+IHJldHVybiBpbW1lZGlhdGVseSB3aXRob3V0IHdhaXRpbmcKICAgICAgICAgZm9yIHRoZSByZXNwb25zZS4gICwgZm9yIGluZm9ybWF0aW9uIGFib3V0CiAgICAgICAgIG5vbmJsb2NraW5nIG1vZGUuCiAgICAgICAgIDxicj48YnI+IFRoZSBub3JtYWwgcmV0dXJuIHZhbHVlIGZyb20gPENPREU+Y29ubmVjdDwvQ09ERT4gaXMgPENPREU+MDwvQ09ERT4uICBJZiBhbiBlcnJvcgogICAgICAgICBvY2N1cnMsIDxDT0RFPmNvbm5lY3Q8L0NPREU+IHJldHVybnMgPENPREU+LTE8L0NPREU+LiAgVGhlIGZvbGxvd2luZyA8Q09ERT5lcnJubzwvQ09ERT4KICAgICAgICAgZXJyb3IgY29uZGl0aW9ucyBhcmUgZGVmaW5lZCBmb3IgdGhpcyBmdW5jdGlvbjoKICAgICAgICAgPGJyPjxicj4gPERMPgoKICAgICAgICAgPERUPjxDT0RFPkVCQURGPC9DT0RFPgo8REQ+CiAgICAgICAgIFRoZSBzb2NrZXQgPFZBUj5zb2NrZXQ8L1ZBUj4gaXMgbm90IGEgdmFsaWQgZmlsZSBkZXNjcmlwdG9yLgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVOT1RTT0NLCiAgICAgICAgIEZpbGUgZGVzY3JpcHRvciA8VkFSPnNvY2tldDwvVkFSPiBpcyBub3QgYSBzb2NrZXQuCiAgICAgICAgIDxicj48YnI+IDxMST4gRUFERFJOT1RBVkFJTAogICAgICAgICBUaGUgc3BlY2lmaWVkIGFkZHJlc3MgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGUgcmVtb3RlIG1hY2hpbmUuCiAgICAgICAgIDxicj48YnI+IDxMST4gRUFGTk9TVVBQT1JUCiAgICAgICAgIFRoZSBuYW1lc3BhY2Ugb2YgdGhlIDxWQVI+YWRkcjwvVkFSPiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgc29ja2V0LgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVJU0NPTk4KICAgICAgICAgVGhlIHNvY2tldCA8VkFSPnNvY2tldDwvVkFSPiBpcyBhbHJlYWR5IGNvbm5lY3RlZC4KICAgICAgICAgPGJyPjxicj4gPExJPiBFVElNRURPVVQKICAgICAgICAgVGhlIGF0dGVtcHQgdG8gZXN0YWJsaXNoIHRoZSBjb25uZWN0aW9uIHRpbWVkIG91dC4KICAgICAgICAgPGJyPjxicj4gPExJPiBFQ09OTlJFRlVTRUQKICAgICAgICAgVGhlIHNlcnZlciBoYXMgYWN0aXZlbHkgcmVmdXNlZCB0byBlc3RhYmxpc2ggdGhlIGNvbm5lY3Rpb24uCiAgICAgICAgIDxicj48YnI+IDxMST4gRU5FVFVOUkVBQ0gKICAgICAgICAgVGhlIG5ldHdvcmsgb2YgdGhlIGdpdmVuIDxWQVI+YWRkcjwvVkFSPiBpc24ndCByZWFjaGFibGUgZnJvbSB0aGlzIGhvc3QuCiAgICAgICAgIDxicj48YnI+IDxMST4gRUFERFJJTlVTRQogICAgICAgICBUaGUgc29ja2V0IGFkZHJlc3Mgb2YgdGhlIGdpdmVuIDxWQVI+YWRkcjwvVkFSPiBpcyBhbHJlYWR5IGluIHVzZS4KICAgICAgICAgPGJyPjxicj4gPExJPiBFSU5QUk9HUkVTUwogICAgICAgICBUaGUgc29ja2V0IDxWQVI+c29ja2V0PC9WQVI+IGlzIG5vbi1ibG9ja2luZyBhbmQgdGhlIGNvbm5lY3Rpb24gY291bGQgbm90IGJlCiAgICAgICAgIGVzdGFibGlzaGVkIGltbWVkaWF0ZWx5LiAgWW91IGNhbiBkZXRlcm1pbmUgd2hlbiB0aGUgY29ubmVjdGlvbiBpcwogICAgICAgICBjb21wbGV0ZWx5IGVzdGFibGlzaGVkIHdpdGggPENPREU+c2VsZWN0PC9DT0RFPjsgLgogICAgICAgICBBbm90aGVyIDxDT0RFPmNvbm5lY3Q8L0NPREU+IGNhbGwgb24gdGhlIHNhbWUgc29ja2V0LCBiZWZvcmUgdGhlIGNvbm5lY3Rpb24gaXMKICAgICAgICAgY29tcGxldGVseSBlc3RhYmxpc2hlZCwgd2lsbCBmYWlsIHdpdGggPENPREU+RUFMUkVBRFk8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVBTFJFQURZCiAgICAgICAgIFRoZSBzb2NrZXQgPFZBUj5zb2NrZXQ8L1ZBUj4gaXMgbm9uLWJsb2NraW5nIGFuZCBhbHJlYWR5IGhhcyBhIHBlbmRpbmcKICAgICAgICAgY29ubmVjdGlvbiBpbiBwcm9ncmVzcyAoc2VlIDxDT0RFPkVJTlBST0dSRVNTPC9DT0RFPiBhYm92ZSkuCgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIGlzIGRlZmluZWQgYXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgaW4gbXVsdGktdGhyZWFkZWQKICAgICAgICAgcHJvZ3JhbXMsIHNvIG9uZSBoYXMgdG8gYmUgcHJlcGFyZWQgZm9yIHRoaXMgYW5kIG1ha2Ugc3VyZSB0aGF0CiAgICAgICAgIGFsbG9jYXRlZCByZXNvdXJjZXMgKGxpa2UgbWVtb3J5LCBmaWxlcyBkZXNjcmlwdG9ycywgc2VtYXBob3JlcyBvcgogICAgICAgICB3aGF0ZXZlcikgYXJlIGZyZWVkIGV2ZW4gaWYgdGhlIHRocmVhZCBpcyBjYW5jZWxlZC4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAMc3lzL3NvY2tldC5oeHEAfgTrdAAzaW50IHNvY2tldCwgc3RydWN0IHNvY2thZGRyICphZGRyLCBzb2NrbGVuX3QgbGVuZ3RodAADaW50dAAIY29weXNpZ25zcQB+AAp0AgwKICAgICAgICBUaGVzZSBmdW5jdGlvbnMgcmV0dXJuIDxWQVI+eDwvVkFSPiBidXQgd2l0aCB0aGUgc2lnbiBvZiA8VkFSPnk8L1ZBUj4uICBUaGV5IHdvcmsKICAgICAgICAgZXZl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eC5oeHEAfgUxdAApY29tcGxleCBkb3VibGUgYmFzZSwgY29tcGxleCBkb3VibGUgcG93ZXJ0AA5jb21wbGV4IGRvdWJsZXQABWNwb3dmc3EAfgAKdACiCiAgICAgICAgVGhlc2UgZnVuY3Rpb25zIHJldHVybiA8VkFSPmJhc2U8L1ZBUj4gcmFpc2VkIHRvIHRoZSBwb3dlciBvZgogICAgICAgICA8VkFSPnBvd2VyPC9WQVI+LiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIDxDT0RFPmNleHAgKHkgKiBjbG9nICh4KSk8L0NPREU+CiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACWNvbXBsZXguaHhxAH4FOHQAJ2NvbXBsZXggZmxvYXQgYmFzZSwgY29tcGxleCBmbG9hdCBwb3dlcnQADWNvbXBsZXggZmxvYXR0AAVjcG93bHNxAH4ACnQAogogICAgICAgIFRoZXNlIGZ1bmN0aW9ucyByZXR1cm4gPFZBUj5iYXNlPC9WQVI+IHJhaXNlZCB0byB0aGUgcG93ZXIgb2YKICAgICAgICAgPFZBUj5wb3dlcjwvVkFSPi4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byA8Q09ERT5jZXhwICh5ICogY2xvZyAoeCkpPC9DT0RFPgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAljb21wbGV4Lmh4cQB+BT90ADNjb21wbGV4IGxvbmcgZG91YmxlIGJhc2UsIGNvbXBsZXggbG9uZyBkb3VibGUgcG93ZXJ0ABNjb21wbGV4IGxvbmcgZG91YmxldAAFY3Byb2pzcQB+AAp0AaQKICAgICAgICBUaGVzZSBmdW5jdGlvbnMgcmV0dXJuIHRoZSBwcm9qZWN0aW9uIG9mIHRoZSBjb21wbGV4IHZhbHVlIDxWQVI+ejwvVkFSPiBvbnRvCiAgICAgICAgIHRoZSBSaWVtYW5uIHNwaGVyZS4gIFZhbHVlcyB3aXRoIGEgaW5maW5pdGUgaW1hZ2luYXJ5IHBhcnQgYXJlIHByb2plY3RlZAogICAgICAgICB0byBwb3NpdGl2ZSBpbmZpbml0eSBvbiB0aGUgcmVhbCBheGlzLCBldmVuIGlmIHRoZSByZWFsIHBhcnQgaXMgTmFOLiAgSWYKICAg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ICAgIDxicj48YnI+IFRoZSA8Q09ERT5jcnlwdDwvQ09ERT4gZnVuY3Rpb24gdGFrZXMgYSBwYXNzd29yZCwgPFZBUj5rZXk8L1ZBUj4sIGFzIGEgc3RyaW5nLCBhbmQKICAgICAgICAgYSA8VkFSPnNhbHQ8L1ZBUj4gY2hhcmFjdGVyIGFycmF5IHdoaWNoIGlzIGRlc2NyaWJlZCBiZWxvdywgYW5kIHJldHVybnMgYQogICAgICAgICBwcmludGFibGUgQVNDSUkgc3RyaW5nIHdoaWNoIHN0YXJ0cyB3aXRoIGFub3RoZXIgc2FsdC4gIEl0IGlzIGJlbGlldmVkCiAgICAgICAgIHRoYXQsIGdpdmVuIHRoZSBvdXRwdXQgb2YgdGhlIGZ1bmN0aW9uLCB0aGUgYmVzdCB3YXkgdG8gZmluZCBhIDxWQVI+a2V5PC9WQVI+CiAgICAgICAgIHRoYXQgd2lsbCBwcm9kdWNlIHRoYXQgb3V0cHV0IGlzIHRvIGd1ZXNzIHZhbHVlcyBvZiA8VkFSPmtleTwvVkFSPiB1bnRpbCB0aGUKICAgICAgICAgb3JpZ2luYWwgdmFsdWUgb2YgPFZBUj5rZXk8L1ZBUj4gaXMgZm91bmQuCiAgICAgICAgIDxicj48YnI+IFRoZSA8VkFSPnNhbHQ8L1ZBUj4gcGFyYW1ldGVyIGRvZXMgdHdvIHRoaW5ncy4gIEZpcnN0bHksIGl0IHNlbGVjdHMgd2hpY2gKICAgICAgICAgYWxnb3JpdGhtIGlzIHVzZWQsIHRoZSBNRDUtYmFzZWQgb25lIG9yIHRoZSBERVMtYmFzZWQgb25lLiAgU2Vjb25kbHksIGl0CiAgICAgICAgIG1ha2VzIGxpZmUgaGFyZGVyIGZvciBzb21lb25lIHRyeWluZyB0byBndWVzcyBwYXNzd29yZHMgYWdhaW5zdCBhIGZpbGUKICAgICAgICAgY29udGFpbmluZyBtYW55IHBhc3N3b3Jkczsgd2l0aG91dCBhIDxWQVI+c2FsdDwvVkFSPiwgYW4gaW50cnVkZXIgY2FuIG1ha2UgYQogICAgICAgICBndWVzcywgcnVuIDxDT0RFPmNyeXB0PC9DT0RFPiBvbiBpdCBvbmNlLCBhbmQgY29tcGFyZSB0aGUgcmVzdWx0IHdpdGggYWxsIHRoZQogICAgICAgICBwYXNzd29yZHMuICBXaXRoIGEgPFZBUj5zYWx0PC9WQVI+LCB0aGUgaW50cnVkZXIgbXVzdCBydW4gPENPREU+Y3J5cHQ8L0NPREU+IG9uY2UKICAgICAgICAgZm9yIGVhY2ggZGlmZmVyZW50IHNhbHQuCiAgICAgICAgIDxicj48YnI+IEZvciB0aGUgTUQ1LWJhc2VkIGFsZ29yaXRobSwgdGhlIDxWQVI+c2FsdDwvVkFSPiBzaG91bGQgY29uc2lzdCBvZiB0aGUgc3RyaW5nCiAgICAgICAgIDxDT0RFPiQxJDwvQ09ERT4sIGZvbGxvd2VkIGJ5IHVwIHRvIDggY2hhcmFjdGVycywgdGVybWluYXRlZCBieSBlaXRoZXIKICAgICAgICAgYW5vdGhlciA8Q09ERT4kPC9DT0RFPiBvciB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuICBUaGUgcmVzdWx0IG9mIDxDT0RFPmNyeXB0PC9DT0RFPgogICAgICAgICB3aWxsIGJlIHRoZSA8VkFSPnNhbHQ8L1ZBUj4sIGZvbGxvd2VkIGJ5IGEgPENPREU+JDwvQ09ERT4gaWYgdGhlIHNhbHQgZGlkbid0IGVuZAogICAgICAgICB3aXRoIG9uZSwgZm9sbG93ZWQgYnkgMjIgY2hhcmFjdGVycyBmcm9tIHRoZSBhbHBoYWJldAogICAgICAgICA8Q09ERT4uLzAtOUEtWmEtejwvQ09ERT4sIHVwIHRvIDM0IGNoYXJhY3RlcnMgdG90YWwuICBFdmVyeSBjaGFyYWN0ZXIgaW4gdGhlCiAgICAgICAgIDxWQVI+a2V5PC9WQVI+IGlzIHNpZ25pZmljYW50LgogICAgICAgICA8YnI+PGJyPiBGb3IgdGhlIERFUy1iYXNlZCBhbGdvcml0aG0sIHRoZSA8VkFSPnNhbHQ8L1ZBUj4gc2hvdWxkIGNvbnNpc3Qgb2YgdHdvCiAgICAgICAgIGNoYXJhY3RlcnMgZnJvbSB0aGUgYWxwaGFiZXQgPENPREU+Li8wLTlBLVphLXo8L0NPREU+LCBhbmQgdGhlIHJlc3VsdCBvZgogICAgICAgICA8Q09ERT5jcnlwdDwvQ09ERT4gd2lsbCBiZSB0aG9zZSB0d28g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bmluZyB0aGUgZmlsZSBuYW1lIG9mCiAgICAgICAgIHRoZSBjb250cm9sbGluZyB0ZXJtaW5hbCBmb3IgdGhlIGN1cnJlbnQgcHJvY2Vzcy4gIElmIDxWQVI+c3RyaW5nPC9WQVI+IGlzCiAgICAgICAgIG5vdCBhIG51bGwgcG9pbnRlciwgaXQgc2hvdWxkIGJlIGFuIGFycmF5IHRoYXQgY2FuIGhvbGQgYXQgbGVhc3QKICAgICAgICAgPENPREU+TF9jdGVybWlkPC9DT0RFPiBjaGFyYWN0ZXJzOyB0aGUgc3RyaW5nIGlzIHJldHVybmVkIGluIHRoaXMgYXJyYXkuCiAgICAgICAgIE90aGVyd2lzZSwgYSBwb2ludGVyIHRvIGEgc3RyaW5nIGluIGEgc3RhdGljIGFyZWEgaXMgcmV0dXJuZWQsIHdoaWNoCiAgICAgICAgIG1pZ2h0IGdldCBvdmVyd3JpdHRlbiBvbiBzdWJzZXF1ZW50IGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24uCiAgICAgICAgIDxicj48YnI+IEFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBpZiB0aGUgZmlsZSBuYW1lIGNhbm5vdCBiZSBkZXRlcm1pbmVkIGZvcgogICAgICAgICBhbnkgcmVhc29uLiAgRXZlbiBpZiBhIGZpbGUgbmFtZSBpcyByZXR1cm5lZCwgYWNjZXNzIHRvIHRoZSBmaWxlIGl0CiAgICAgICAgIHJlcHJlc2VudHMgaXMgbm90IGd1YXJhbnRlZWQuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3N0ZGlvLmh4cQB+Bed0AAxjaGFyICpzdHJpbmd0AAZjaGFyICp0AAVjdGltZXNxAH4ACnQB5wogICAgICAgIFRoZSA8Q09ERT5jdGltZTwvQ09ERT4gZnVuY3Rpb24gaXMgc2ltaWxhciB0byA8Q09ERT5hc2N0aW1lPC9DT0RFPiwgZXhjZXB0IHRoYXQgeW91CiAgICAgICAgIHNwZWNpZnkgdGhlIGNhbGVuZGFyIHRpbWUgYXJndW1lbnQgYXMgYSA8Q09ERT50aW1lX3Q8L0NPREU+IHNpbXBsZSB0aW1lIHZhbHVlCiAgICAgICAgIHJhdGhlciB0aGFuIGluIGJyb2tlbi1kb3duIGxvY2FsIHRpbWUgZm9ybWF0LiAgSXQgaXMgZXF1aXZhbGVudCB0bwogICAgICAgICA8YnI+PGJyPiA8cHJlPjxicj4KICAgICAgICAgYXNjdGltZSAobG9jYWx0aW1lICg8VkFSPnRpbWU8L1ZBUj4pKTxicj4KICAgICAgICAgPC9wcmU+CiAgICAgICAgIDxicj48YnI+IDxDT0RFPmN0aW1lPC9DT0RFPiBzZXRzIHRoZSB2YXJpYWJsZSA8Q09ERT50em5hbWU8L0NPREU+LCBiZWNhdXNlIDxDT0RFPmxvY2FsdGltZTwvQ09ERT4KICAgICAgICAgZG9lcyBzby4gIC4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGdGltZS5oeHEAfgXudAASY29uc3QgdGltZV90ICp0aW1ldAAGY2hhciAqdAAHY3RpbWVfcnNxAH4ACnQCEgogICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byA8Q09ERT5jdGltZTwvQ09ERT4sIGJ1dCBwbGFjZXMgdGhlIHJlc3VsdCBpbiB0aGUKICAgICAgICAgc3RyaW5nIHBvaW50ZWQgdG8gYnkgPFZBUj5idWZmZXI8L1ZBUj4uICBJdCBpcyBlcXVpdmFsZW50IHRvICh3cml0dGVuIHVzaW5nCiAgICAgICAgIGdjYyBleHRlbnNpb25zLCApOgogICAgICAgICA8YnI+PGJyPiA8cHJlPjxicj4KICAgICAgICAgKHsgc3RydWN0IHRtIHRtOyBhc2N0aW1lX3IgKGxvY2FsdGltZV9yICh0aW1lLCAmdG0pLCBidWYpOyB9KTxicj4KICAgICAgICAgPC9wcmU+CiAgICAgICAgIDxicj48YnI+IElmIG5vIGVycm9yIG9jY3VycmVkIHRoZSBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgc3RyaW5nIHRoZQogICAgICAgICByZXN1bHQgd2FzIHdyaXR0ZW4gaW50bywgaS5lLiwgaXQgcmV0dXJucyA8VkFSPmJ1ZmZlcjwvVkFSPi4gIE90aGVyd2lzZQogICAgICAgICByZXR1cm4gPENPREU+TlVMTDwvQ09ERT4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQABnRpbWUuaHhxAH4F9XQAIGNvbnN0IHRpbWVfdCAqdGltZSwgY2hhciAqYnVmZmVydAAGY2hhciAqdAAHY3VzZXJpZHNxAH4ACnQC5wogICAgICAgIFRoZSA8Q09ERT5jdXNlcmlkPC9DT0RFPiBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byBhIHN0cmluZyBjb250YWluaW5nIGEKICAgICAgICAgdXNlciBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgZWZmZWN0aXZlIElEIG9mIHRoZSBwcm9jZXNzLiAgSWYKICAgICAgICAgPFZBUj5zdHJpbmc8L1ZBUj4gaXMgbm90IGEgbnVsbCBwb2ludGVyLCBpdCBzaG91bGQgYmUgYW4gYXJyYXkgdGhhdCBjYW4gaG9sZAogICAgICAgICBhdCBsZWFzdCA8Q09ERT5MX2N1c2VyaWQ8L0NPREU+IGNoYXJhY3RlcnM7IHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQgaW4gdGhpcwogICAgICAgICBhcnJheS4gIE90aGVyd2lzZSwgYSBwb2ludGVyIHRvIGEgc3RyaW5nIGluIGEgc3RhdGljIGFyZWEgaXMgcmV0dXJuZWQuCiAgICAgICAgIFRoaXMgc3RyaW5nIGlzIHN0YXRpY2FsbHkgYWxsb2NhdGVkIGFuZCBtaWdodCBiZSBvdmVyd3JpdHRlbiBvbgogICAgICAgICBzdWJzZXF1ZW50IGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24gb3IgdG8gPENPREU+Z2V0bG9naW48L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBUaGUgdXNlIG9mIHRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCBzaW5jZSBpdCBpcyBtYXJrZWQgdG8gYmUKICAgICAgICAgd2l0aGRyYXduIGluIFhQRzQuMiBhbmQgaGFzIGFscmVhZHkgYmVlbiByZW1vdmVkIGZyb20gbmV3ZXIgcmV2aXNpb25zIG9mCiAgICAgICAgIFBPU0lYLjEuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3N0ZGlvLmh4cQB+Bfx0AAxjaGFyICpzdHJpbmd0AAZjaGFyICp0AAlkY2dldHRleHRzcQB+AAp0B5oKICAgICAgICBUaGUgPENPREU+ZGNnZXR0ZXh0PC9DT0RFPiBhZGRzIGFub3RoZXIgYXJndW1lbnQgdG8gdGhvc2Ugd2hpY2gKICAgICAgICAgPENPREU+ZGdldHRleHQ8L0NPREU+IHRha2VzLiAgVGhpcyBhcmd1bWVudCA8VkFSPmNhdGVnb3J5PC9WQVI+IHNwZWNpZmllcyB0aGUgbGFzdAogICAgICAgICBwaWVjZSBvZiBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gbG9jYWxpemUgdGhlIG1lc3NhZ2UgY2F0YWxvZy4gIEkuZS4sIHRoZQogICAgICAgICBkb21haW4gbmFtZSBhbmQgdGhlIGxvY2FsZSBjYXRlZ29yeSBleGFjdGx5IHNwZWNpZnkgd2hpY2ggbWVzc2FnZQogICAgICAgICBjYXRhbG9nIGhhcyB0byBiZSB1c2VkIChyZWxhdGl2ZSB0byBhIGdpdmVuIGRpcmVjdG9yeSwgc2VlIGJlbG93KS4KICAgICAgICAgPGJyPjxicj4gVGhlIDxDT0RFPmRnZXR0ZXh0PC9DT0RFPiBmdW5jdGlvbiBjYW4gYmUgZXhwcmVzc2VkIGluIHRlcm1zIG9mCiAgICAgICAgIDxDT0RFPmRjZ2V0dGV4dDwvQ09ERT4gYnkgdXNpbmcKICAgICAgICAgPGJyPjxicj4gPHByZT48YnI+CiAgICAgICAgIGRjZ2V0dGV4dCAoZG9tYWluLCBzdHJpbmcsIExDX01FU1NBR0VTKTxicj4KICAgICAgICAgPC9wcmU+PGJyPgogICAgICAgICA8YnI+PGJyPiA8YnI+CiAgICAgICAgIGluc3RlYWQgb2Y8YnI+CiAgICAgICAgIDxicj48YnI+IDxwcmU+PGJyPgogICAgICAgICBkZ2V0dGV4dCAoZG9tYWluLCBzdHJpbmcpPGJyPgogICAgICAgICA8L3ByZT4KICAgICAgICAgPGJyPjxicj4gVGhpcyBhbHNvIHNob3dzIHdoaWNoIHZhbHVlcyBhcmUgZXhwZWN0ZWQgZm9yIHRoZSB0aGlyZCBwYXJhbWV0ZXIuICBPbmUKICAgICAgICAgaGFzIHRvIHVzZSB0aGUgYXZhaWxhYmxlIHNlbGVjdG9ycyBmb3IgdGhlIGNhdGVnb3JpZXMgYXZhaWxhYmxlIGluCiAgICAgICAgIDxUVD5sb2NhbGUuaDwvVFQ+LiAgTm9ybWFsbHkgdGhlIGF2YWlsYWJsZSB2YWx1ZXMgYXJlIDxDT0RFPkxDX0NUWVBFPC9DT0RFPiwKICAgICAgICAgPENPREU+TENfQ09MTEFURTwvQ09ERT4sIDxDT0RFPkxDX01FU1NBR0VTPC9DT0RFPiwgPENPREU+TENfTU9ORVRBUlk8L0NPREU+LAogICAgICAgICA8Q09ERT5MQ19OVU1FUklDPC9DT0RFPiwgYW5kIDxDT0RFPkxDX1RJTUU8L0NPREU+LiAgUGxlYXNlIG5vdGUgdGhhdCA8Q09ERT5MQ19BTEw8L0NPREU+CiAgICAgICAgIG11c3Qgbm90IGJlIHVzZWQgYW5kIGV2ZW4gdGhvdWdoIHRoZSBuYW1lcyBtaWdodCBzdWdnZXN0IHRoaXMsIHRoZXJlIGlzCiAgICAgICAgIG5vIHJlbGF0aW9uIHRvIHRoZSBlbnZpcm9ubWVudHMgdmFyaWFibGVzIG9mIHRoaXMgbmFtZS4KICAgICAgICAgPGJyPjxicj4gVGhlIDxDT0RFPmRjZ2V0dGV4dDwvQ09ERT4gZnVuY3Rpb24gaXMgb25seSBpbXBsZW1lbnRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoCiAgICAgICAgIG90aGVyIHN5c3RlbXMgd2hpY2ggaGF2ZSA8Q09ERT5nZXR0ZXh0PC9DT0RFPiBmdW5jdGlvbnMuICBUaGVyZSBpcyBub3QgcmVhbGx5CiAgICAgICAgIGFueSBzaXR1YXRpb24gd2hlcmUgaXQgaXMgbmVjZXNzYXJ5IChvciB1c2VmdWwpIHRvIHVzZSBhIGRpZmZlcmVudCB2YWx1ZQogICAgICAgICBidXQgPENPREU+TENfTUVTU0FHRVM8L0NPREU+IGluIGZvciB0aGUgPFZBUj5jYXRlZ29yeTwvVkFSPiBwYXJhbWV0ZXIuICBXZSBhcmUKICAgICAgICAgZGVhbGluZyB3aXRoIG1lc3NhZ2VzIGhlcmUgYW5kIGFueSBvdGhlciBjaG9pY2UgY2FuIG9ubHkgYmUgaXJyaXRhdGluZy4KICAgICAgICAgPGJyPjxicj4gQXMgZm9yIDxDT0RFPmdldHRleHQ8L0NPREU+IHRoZSByZXR1cm4gdmFsdWUgdHlwZSBpcyA8Q09ERT5jaGFyICo8L0NPREU+IHdoaWNoIGlzIGFuCiAgICAgICAgIGFuYWNocm9uaXNtLiAgVGhlIHJldHVybmVkIHN0cmluZyBtdXN0IG5ldmVyIGJlIG1vZGlmaWVkLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAlsaWJpbnRsLmh4cQB+BgN0ADdjb25zdCBjaGFyICpkb21haW5uYW1lLCBjb25zdCBjaGFyICptc2dpZCwgaW50IGNhdGVnb3J5dAAGY2hhciAqdAAKZGNuZ2V0dGV4dHNxAH4ACnQBVQogICAgICAgIFRoZSA8Q09ERT5kY25nZXR0ZXh0PC9DT0RFPiBpcyBzaW1pbGFyIHRvIHRoZSA8Q09ERT5kY2dldHRleHQ8L0NPREU+IGZ1bmN0aW9uIGluIHRoZQogICAgICAgICB3YXkgdGhlIG1lc3NhZ2UgY2F0YWxvZyBpcyBzZWxlY3RlZC4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgaXQgdGFrZXMKICAgICAgICAgdHdvIGV4dHJhIHBhcmFtZXRlciB0byBwcm92aWRlIHRoZSBjb3JyZWN0IHBsdXJhbCBmb3JtLiAgVGhlc2UgdHdvCiAgICAgICAgIHBhcmFtZXRlcnMgYXJlIGhhbmRsZWQgaW4gdGhlIHNhbWUgd2F5IDxDT0RFPm5nZXR0ZXh0PC9DT0RFPiBoYW5kbGVzIHRoZW0uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACWxpYmludGwuaHhxAH4GCnQAXWNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqbXNnaWQxLCBjb25zdCBjaGFyICptc2dpZDIsIHVuc2lnbmVkIGxvbmcgaW50IG4sIGludCBjYXRlZ29yeXQABmNoYXIgKnQADWRlc19zZXRwYXJpdHlzcQB+AAp0AM8KICAgICAgICA8YnI+PGJyPiBUaGUgZnVuY3Rpb24gPENPREU+ZGVzX3NldHBhcml0eTwvQ09ERT4gY2hhbmdlcyB0aGUgNjQtYml0IDxWQVI+a2V5PC9WQVI+LCBzdG9yZWQKICAgICAgICAgcGFja2VkIGluIDgtYml0IGJ5dGVzLCB0byBoYXZlIG9kZCBwYXJpdHkgYnkgYWx0ZXJpbmcgdGhlIGxvdyBiaXRzIG9mCiAgICAgICAgIGVhY2ggYnl0ZS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAPcnBjL2Rlc19jcnlwdC5oeHEAfgYRdAAJY2hhciAqa2V5dAAEdm9pZHQACGRnZXR0ZXh0c3EAfgAKdAKdCiAgICAgICAgVGhlIDxDT0RFPmRnZXR0ZXh0PC9DT0RFPiBmdW5jdGlvbnMgYWN0cyBqdXN0IGxpa2UgdGhlIDxDT0RFPmdldHRleHQ8L0NPREU+CiAgICAgICAgIGZ1bmN0aW9uLiAgSXQgb25seSB0YWtlcyBhbiBhZGRpdGlvbmFsIGZpcnN0IGFyZ3VtZW50IDxWQVI+ZG9tYWlubmFtZTwvVkFSPgogICAgICAgICB3aGljaCBndWlkZXMgdGhlIHNlbGVjdGlvbiBvZiB0aGUgbWVzc2FnZSBjYXRhbG9ncyB3aGljaCBhcmUgc2VhcmNoZWQKICAgICAgICAgZm9yIHRoZSB0cmFuc2xhdGlvbi4gIElmIHRoZSA8VkFSPmRvbWFpbm5hbWU8L1ZBUj4gcGFyYW1ldGVyIGlzIHRoZSBudWxsCiAgICAgICAgIHBvaW50ZXIgdGhlIDxDT0RFPmRnZXR0ZXh0PC9DT0RFPiBmdW5jdGlvbiBpcyBleGFjdGx5IGVxdWl2YWxlbnQgdG8KICAgICAgICAgPENPREU+Z2V0dGV4dDwvQ09ERT4gc2luY2UgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBkb21haW4gbmFtZSBpcyB1c2VkLgogICAgICAgICA8YnI+PGJyPiBBcyBmb3IgPENPREU+Z2V0dGV4dDwvQ09ERT4gdGhlIHJldHVybiB2YWx1ZSB0eXBlIGlzIDxDT0RFPmNoYXIgKjwvQ09ERT4gd2hpY2ggaXMgYW4KICAgICAgICAgYW5hY2hyb25pc20uICBUaGUgcmV0dXJuZWQgc3RyaW5nIG11c3QgbmV2ZXIgYmUgbW9kaWZpZWQuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACWxpYmludGwuaHhxAH4GGHQAKWNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKm1zZ2lkdAAGY2hhciAqdAAIZGlmZnRpbWVzcQB+AAp0AicKICAgICAgICBUaGUgPENPREU+ZGlmZnRpbWU8L0NPREU+IGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBzZWNvbmRzIG9mIGVsYXBzZWQKICAgICAgICAgdGltZSBiZXR3ZWVuIGNhbGVuZGFyIHRpbWUgPFZBUj50aW1lMTwvVkFSPiBhbmQgY2FsZW5kYXIgdGltZSA8VkFSPnRpbWUwPC9WQVI+LCBhcwogICAgICAgICBhIHZhbHVlIG9mIHR5cGUgPENPREU+ZG91YmxlPC9DT0RFPi4gIFRoZSBkaWZmZXJlbmNlIGlnbm9yZXMgbGVhcCBzZWNvbmRzCiAgICAgICAgIHVubGVzcyBsZWFwIHNlY29uZCBzdXBwb3J0IGlzIGVuYWJsZWQuCiAgICAgICAgIDxicj48YnI+IEluIHRoZSBHTlUgc3lzdGVtLCB5b3UgY2FuIHNpbXBseSBzdWJ0cmFjdCA8Q09ERT50aW1lX3Q8L0NPREU+IHZhbHVlcy4gIEJ1dCBvbgogICAgICAgICBvdGhlciBzeXN0ZW1zLCB0aGUgPENPREU+dGltZV90PC9DT0RFPiBkYXRhIHR5cGUgbWlnaHQgdXNlIHNvbWUgb3RoZXIgZW5jb2RpbmcKICAgICAgICAgd2hlcmUgc3VidHJhY3Rpb24gZG9lc24ndCB3b3JrIGRpcmVjdGx5LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZ0aW1lLmh4cQB+Bh90ABp0aW1lX3QgdGltZTEsIHRpbWVfdCB0aW1lMHQABmRvdWJsZXQABWRpcmZkc3EAfgAKdAFuCiAgICAgICAgVGhlIGZ1bmN0aW9uIDxDT0RFPmRpcmZkPC9DT0RFPiByZXR1cm5zIHRoZSBmaWxlIGRlc2NyaXB0b3IgYXNzb2NpYXRlZCB3aXRoCiAgICAgICAgIHRoZSBkaXJlY3Rvcnkgc3RyZWFtIDxWQVI+ZGlyc3RyZWFtPC9WQVI+LiAgVGhpcyBkZXNjcmlwdG9yIGNhbiBiZSB1c2VkIHVudGlsCiAgICAgICAgIHRoZSBkaXJlY3RvcnkgaXMgY2xvc2VkIHdpdGggPENPREU+Y2xvc2Vk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aW50bC5oeHEAfgY7dABPY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICptc2dpZDEsIGNvbnN0IGNoYXIgKm1zZ2lkMiwgdW5zaWduZWQgbG9uZyBpbnQgbnQABmNoYXIgKnQAB2RyYW5kNDhzcQB+AAp0AikKICAgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSA8Q09ERT5kb3VibGU8L0NPREU+IHZhbHVlIGluIHRoZSByYW5nZSBvZiA8Q09ERT4wLjA8L0NPREU+CiAgICAgICAgIHRvIDxDT0RFPjEuMDwvQ09ERT4gKGV4Y2x1c2l2ZSkuICBUaGUgcmFuZG9tIGJpdHMgYXJlIGRldGVybWluZWQgYnkgdGhlIGdsb2JhbAogICAgICAgICBzdGF0ZSBvZiB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgaW4gdGhlIEMgbGlicmFyeS4KICAgICAgICAgPGJyPjxicj4gU2luY2UgdGhlIDxDT0RFPmRvdWJsZTwvQ09ERT4gdHlwZSBhY2NvcmRpbmcgdG8gSUVFRSA3NTQgaGFzIGEgNTItYml0CiAgICAgICAgIG1hbnRpc3NhIHRoaXMgbWVhbnMgNCBiaXRzIGFyZSBub3QgaW5pdGlhbGl6ZWQgYnkgdGhlIHJhbmRvbSBudW1iZXIKICAgICAgICAgZ2VuZXJhdG9yLiAgVGhlc2UgYXJlIChvZiBjb3Vyc2UpIGNob3NlbiB0byBiZSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQKICAgICAgICAgYml0cyBhbmQgdGhleSBhcmUgaW5pdGlhbGl6ZWQgdG8gPENPREU+MDwvQ09ERT4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHN0ZGxpYi5oeHEAfgZCdAAEdm9pZHQABmRvdWJsZXQACWRyYW5kNDhfcnNxAH4ACnQCvQogICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byB0aGUgPENPREU+ZHJhbmQ0ODwvQ09ERT4gZnVuY3Rpb24gd2l0aCB0aGUKICAgICAgICAgZGlmZmVyZW5jZSB0aGF0IGl0IGRvZXMgbm90IG1vZGlmeSB0aGUgZ2xvYmFsIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCiAgICAgICAgIHBhcmFtZXRlcnMgYnV0IGluc3RlYWQgdGhlIHBhcmFtZXRlcnMgaW4gdGhlIGJ1ZmZlciBzdXBwbGllZCB0aHJvdWdoIHRoZQogICAgICAgICBwb2ludGVyIDxWQVI+YnVmZmVyPC9WQVI+LiAgVGhlIHJhbmRvbSBudW1iZXIgaXMgcmV0dXJuZWQgaW4gdGhlIHZhcmlhYmxlCiAgICAgICAgIHBvaW50ZWQgdG8gYnkgPFZBUj5yZXN1bHQ8L1ZBUj4uCiAgICAgICAgIDxicj48YnI+IFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9uIGluZGljYXRlcyB3aGV0aGVyIHRoZSBjYWxsIHN1Y2NlZWRlZC4KICAgICAgICAgSWYgdGhlIHZhbHVlIGlzIGxlc3MgdGhhbiA8Q09ERT4wPC9DT0RFPiBhbiBlcnJvciBvY2N1cnJlZCBhbmQgPFZBUj5lcnJubzwvVkFSPiBpcwogICAgICAgICBzZXQgdG8gaW5kaWNhdGUgdGhlIHByb2JsZW0uCiAgICAgICAgIDxicj48YnI+IFRoaXMgZnVuY3Rpb24gaXMgYSBHTlUgZXh0ZW5zaW9uIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgaW4gcG9ydGFibGUKICAgICAgICAgcHJvZ3JhbXMuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHN0ZGxpYi5oeHEAfgZJdAArc3RydWN0IGRyYW5kNDhfZGF0YSAqYnVmZmVyLCBkb3VibGUgKnJlc3VsdHQAA2ludHQABGRyZW1zcQB+AAp0AzsKICAgICAgICBUaGVzZSBmdW5jdGlvbnMgYXJlIGxpa2UgPENPREU+Zm1vZDwvQ09ERT4gZXhjZXB0IHRoYXQgdGhleSByb3VuZCB0aGUKICAgICAgICAgaW50ZXJuYWwgcXVvdGllbnQgPFZBUj5uPC9WQVI+IHRvIHRoZSBuZWFyZXN0IGludGVnZXIgaW5zdGVhZCBvZiB0b3dhcmRzIHplcm8KICAgICAgICAgdG8gYW4gaW50ZWdlci4gIEZvciBleGFtcGxlLCA8Q09ERT5kcmVtICg2LjUsIDIuMyk8L0NPREU+IHJldHVybnMgPENPREU+LTAuNDwv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c28gdGhhdCB0aGVyZSBpcyBhIHdob2xlIG51bWJlciBvZiBibG9ja3MgdG8gZW5jcnlwdCkuCiAgICAgICAgIDxWQVI+bGVuPC9WQVI+IGlzIGxpbWl0ZWQgdG8gYSBtYXhpbXVtIG9mIDxDT0RFPkRFU19NQVhEQVRBPC9DT0RFPiBieXRlcy4KICAgICAgICAgPGJyPjxicj4gVGhlIHJlc3VsdCBvZiB0aGUgZW5jcnlwdGlvbiByZXBsYWNlcyB0aGUgaW5wdXQgaW4gPFZBUj5ibG9ja3M8L1ZBUj4uCiAgICAgICAgIDxicj48YnI+IFRoZSA8VkFSPm1vZGU8L1ZBUj4gcGFyYW1ldGVyIGlzIHRoZSBiaXR3aXNlIE9SIG9mIHR3byBvZiB0aGUgZm9sbG93aW5nOgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8RFQ+PENPREU+REVTX0VOQ1JZUFQ8L0NPREU+CjxERD4KICAgICAgICAgVGhpcyBjb25zdGFudCwgdXNlZCBpbiB0aGUgPFZBUj5tb2RlPC9WQVI+IHBhcmFtZXRlciwgc3BlY2lmaWVzIHRoYXQKICAgICAgICAgPFZBUj5ibG9ja3M8L1ZBUj4gaXMgdG8gYmUgZW5jcnlwdGVkLgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+REVTX0RFQ1JZUFQ8L0NPREU+CjxERD4KICAgICAgICAgVGhpcyBjb25zdGFudCwgdXNlZCBpbiB0aGUgPFZBUj5tb2RlPC9WQVI+IHBhcmFtZXRlciwgc3BlY2lmaWVzIHRoYXQKICAgICAgICAgPFZBUj5ibG9ja3M8L1ZBUj4gaXMgdG8gYmUgZGVjcnlwdGVkLgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+REVTX0hXPC9DT0RFPgo8REQ+CiAgICAgICAgIFRoaXMgY29uc3RhbnQsIHVzZWQgaW4gdGhlIDxWQVI+bW9kZTwvVkFSPiBwYXJhbWV0ZXIsIGFza3MgdG8gdXNlIGEgaGFyZHdhcmUKICAgICAgICAgZGV2aWNlLiAgSWYgbm8gaGFyZHdhcmUgZGV2aWNlIGlzIGF2YWlsYWJsZSwgZW5jcnlwdGlvbiBoYXBwZW5zIGFueXdheSwKICAgICAgICAgYnV0IGluIHNvZnR3YXJlLgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+REVTX1NXPC9DT0RFPgo8REQ+CiAgICAgICAgIFRoaXMgY29uc3RhbnQsIHVzZWQgaW4gdGhlIDxWQVI+bW9kZTwvVkFSPiBwYXJhbWV0ZXIsIHNwZWNpZmllcyB0aGF0IG5vCiAgICAgICAgIGhhcmR3YXJlIGRldmljZSBpcyB0byBiZSB1c2VkLgogICAgICAgICA8L0RMPgogICAgICAgICA8YnI+PGJyPiBUaGUgcmVzdWx0IG9mIHRoZSBmdW5jdGlvbiB3aWxsIGJlIG9uZSBvZiB0aGVzZSB2YWx1ZXM6CiAgICAgICAgIDxicj48YnI+IDxETD4KCiAgICAgICAgIDxEVD48Q09ERT5ERVNFUlJfTk9ORTwvQ09ERT4KPEREPgogICAgICAgICBUaGUgZW5jcnlwdGlvbiBzdWNjZWVkZWQuCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5ERVNFUlJfTk9IV0RFVklDRTwvQ09ERT4KPEREPgogICAgICAgICBUaGUgZW5jcnlwdGlvbiBzdWNjZWVkZWQsIGJ1dCB0aGVyZSB3YXMgbm8gaGFyZHdhcmUgZGV2aWNlIGF2YWlsYWJsZS4KICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPkRFU0VSUl9IV0VSUk9SPC9DT0RFPgo8REQ+CiAgICAgICAgIFRoZSBlbmNyeXB0aW9uIGZhaWxlZCBiZWNhdXNlIG9mIGEgaGFyZHdhcmUgcHJvYmxlbS4KICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPkRFU0VSUl9CQURQQVJBTTwvQ09ERT4KPEREPgogICAgICAgICBUaGUgZW5jcnlwdGlvbiBmYWlsZWQgYmVjYXVzZSBvZiBhIGJhZCBwYXJhbWV0ZXIsIGZvciBpbnN0YW5jZSA8VkFSPmxlbjwvVkFSPgogICAgICAgICBpcyBub3QgYSBtdWx0aXBsZSBvZiA4IG9yIDxWQVI+bGVuPC9WQVI+IGlzIGxhcmdlciB0aGFuIDxDT0RFPkRFU19NQVhEQVRBPC9DT0RFPi4KICAgICAgICAgPC9ETD4KICAgICAgICBzcQB+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ZiA8VkFSPmtleTwvVkFSPi4gIEJlZm9yZSBjYWxsaW5nIDxDT0RFPnNldGtleV9yPC9DT0RFPiB0aGUgZmlyc3QgdGltZSwKICAgICAgICAgPENPREU+ZGF0YS0+aW5pdGlhbGl6ZWQ8L0NPREU+IG11c3QgYmUgY2xlYXJlZCB0byB6ZXJvLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAdjcnlwdC5oeHEAfgaPdAAzY2hhciAqYmxvY2ssIGludCBlZGZsYWcsIHtzdHJ1Y3QgY3J5cHRfZGF0YSAqfSBkYXRhdAAEdm9pZHQACGVuZGZzZW50c3EAfgAKdADICiAgICAgICAgVGhpcyBmdW5jdGlvbiBtYWtlcyBzdXJlIHRoYXQgYWxsIHJlc291cmNlcyBhY3F1aXJlZCBieSBhIHByaW9yIGNhbGwgdG8KICAgICAgICAgPENPREU+c2V0ZnNlbnQ8L0NPREU+IChleHBsaWNpdGx5IG9yIGltcGxpY2l0bHkgYnkgY2FsbGluZyA8Q09ERT5nZXRmc2VudDwvQ09ERT4pIGFyZQogICAgICAgICBmcmVlZC4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHZnN0YWIuaHhxAH4GlnQABHZvaWR0AAR2b2lkdAAIZW5kZ3JlbnRzcQB+AAp0AH0KICAgICAgICBUaGlzIGZ1bmN0aW9uIGNsb3NlcyB0aGUgaW50ZXJuYWwgc3RyZWFtIHVzZWQgYnkgPENPREU+Z2V0Z3JlbnQ8L0NPREU+IG9yCiAgICAgICAgIDxDT0RFPmdldGdyZW50X3I8L0NPREU+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAVncnAuaHhxAH4GnXQABHZvaWR0AAR2b2lkdAAKZW5kaG9zdGVudHNxAH4ACnQAOgogICAgICAgIFRoaXMgZnVuY3Rpb24gY2xvc2VzIHRoZSBob3N0cyBkYXRhYmFzZS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHbmV0ZGIuaHhxAH4GpHQABHZvaWR0AAR2b2lkdAAJZW5kbW50ZW50c3EAfgAKdAFQCiAgICAgICAgVGhpcyBmdW5jdGlvbiB0YWtlcyBmb3IgdGhlIDxWQVI+c3RyZWFtPC9WQVI+IHBhcmFtZXRlciBhIGZpbGUgaGFuZGxlIHdoaWNoCiAgICAgICAgIHByZXZpb3VzbHkgd2FzIHJldHVybmVkIGZyb20gdGhlIDxDT0RFPnNldG1udGVudDwvQ09ERT4gY2FsbC4KICAgICAgICAgPENPREU+ZW5kbW50ZW50PC9DT0RFPiBjbG9zZXMgdGhlIHN0cmVhbSBhbmQgZnJlZXMgYWxsIHJlc291cmNlcy4KICAgICAgICAgPGJyPjxicj4gVGhlIHJldHVybiB2YWx1ZSBpcyAxIHVubGVzcyBhbiBlcnJvciBvY2N1cnJlZCBpbiB3aGljaCBjYXNlIGl0CiAgICAgICAgIGlzIDAuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACG1udGVudC5oeHEAfgardAAMRklMRSAqc3RyZWFtdAADaW50dAAJZW5kbmV0ZW50c3EAfgAKdAA9CiAgICAgICAgVGhpcyBmdW5jdGlvbiBjbG9zZXMgdGhlIG5ldHdvcmtzIGRhdGFiYXNlLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAduZXRkYi5oeHEAfgaydAAEdm9pZHQABHZvaWR0AAtlbmRuZXRncmVudHNxAH4ACnQA5gogICAgICAgIFRoaXMgZnVuY3Rpb24gZnJlZXMgYWxsIGJ1ZmZlcnMgd2hpY2ggd2VyZSBhbGxvY2F0ZWQgdG8gcHJvY2VzcyB0aGUgbGFzdAogICAgICAgICBzZWxlY3RlZCBuZXRncm91cC4gIEFzIGEgcmVzdWx0IGFsbCBzdHJpbmcgcG9pbnRlcnMgcmV0dXJuZWQgYnkgY2FsbHMKICAgICAgICAgdG8gPENPREU+Z2V0bmV0Z3JlbnQ8L0NPREU+IGFyZSBpbnZhbGlkIGFmdGVyd2FyZHMuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB25ldGRiLmh4cQB+Brl0AAR2b2lkdAAEdm9pZHQAC2VuZHByb3RvZW50c3EAfgAKdAA+CiAgICAgICAgVGhpcyBmdW5jdGlvbiBjbG9zZXMgdGhlIHByb3RvY29scyBkYXRhYmFzZS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHbmV0ZGIuaHhxAH4GwHQABHZvaWR0AAR2b2lkdAAIZW5kcHdlbnRzcQB+AAp0AH0KICAgICAgICBUaGlzIGZ1bmN0aW9uIGNsb3NlcyB0aGUgaW50ZXJuYWwgc3RyZWFtIHVzZWQgYnkgPENPREU+Z2V0cHdlbnQ8L0NPREU+IG9yCiAgICAgICAgIDxDT0RFPmdldHB3ZW50X3I8L0NPREU+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAVwd2QuaHhxAH4Gx3QABHZvaWR0AAR2b2lkdAAKZW5kc2VydmVudHNxAH4ACnQAPQogICAgICAgIFRoaXMgZnVuY3Rpb24gY2xvc2VzIHRoZSBzZXJ2aWNlcyBkYXRhYmFzZS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHbmV0ZGIuaHhxAH4GznQABHZvaWR0AAR2b2lkdAAIZW5kdXRlbnRzcQB+AAp0AEQKICAgICAgICBUaGlzIGZ1bmN0aW9uIGNsb3NlcyB0aGUgdXNlciBhY2NvdW50aW5nIGRhdGFiYXNlLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZ1dG1wLmh4cQB+BtV0AAR2b2lkdAAEdm9pZHQACWVuZHV0eGVudHNxAH4ACnQAkQogICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byA8Q09ERT5lbmR1dGVudDwvQ09ERT4uICBPbiB0aGUgR05VIHN5c3RlbSBpdCBpcwogICAgICAgICBzaW1wbHkgYW4gYWxpYXMgZm9yIDxDT0RFPmVuZHV0ZW50PC9DT0RFPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHdXRtcHguaHhxAH4G3HQABHZvaWR0AAR2b2lkdAAIZW52el9hZGRzcQB+AAp0AeQKICAgICAgICBUaGUgPENPREU+ZW52el9hZGQ8L0NPREU+IGZ1bmN0aW9uIGFkZHMgYW4gZW50cnkgdG8gPENPREU+KjxWQVI+ZW52ejwvVkFSPjwvQ09ERT4KICAgICAgICAgKHVwZGF0aW5nIDxDT0RFPio8VkFSPmVudno8L1ZBUj48L0NPREU+IGFuZCA8Q09ERT4qPFZBUj5lbnZ6X2xlbjwvVkFSPjwvQ09ERT4pIHdpdGggdGhlIG5hbWUKICAgICAgICAgPFZBUj5uYW1lPC9WQVI+LCBhbmQgdmFsdWUgPFZBUj52YWx1ZTwvVkFSPi4gIElmIGFuIGVudHJ5IHdpdGggdGhlIHNhbWUgbmFtZQogICAgICAgICBhbHJlYWR5IGV4aXN0cyBpbiA8VkFSPmVudno8L1ZBUj4sIGl0IGlzIHJlbW92ZWQgZmlyc3QuICBJZiA8VkFSPnZhbHVlPC9WQVI+IGlzCiAgICAgICAgIDxDT0RFPjA8L0NPREU+LCB0aGVuIHRoZSBuZXcgZW50cnkgd2lsbCB0aGUgc3BlY2lhbCBudWxsIHR5cGUgb2YgZW50cnkKICAgICAgICAgKG1lbnRpb25lZCBhYm92ZSkuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQABmVudnouaHhxAH4G43QAQmNoYXIgKiplbnZ6LCBzaXplX3QgKmVudnpfbGVuLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZXQAB2Vycm9yX3R0AAplbnZ6X2VudHJ5c3EAfgAKdAFmCiAgICAgICAgVGhlIDxDT0RFPmVudnpfZW50cnk8L0NPREU+IGZ1bmN0aW9uIGZpbmRzIHRoZSBlbnRyeSBpbiA8VkFSPmVudno8L1ZBUj4gd2l0aCB0aGUgbmFtZQogICAgICAgICA8VkFSPm5hbWU8L1ZBUj4sIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgd2hvbGUgZW50cnktLS10aGF0IGlzLCB0aGUgYXJnegogICAgICAgICBlbGVtZW50IHdoaWNoIGJlZ2lucyB3aXRoIDxWQVI+bmFtZTwvVkFSPiBmb2xsb3dlZCBieSBhIDxDT0RFPic9JzwvQ09ERT4gY2hhcmFjdGVyLiAgSWYKICAgICAgICAgdGhlcmUgaXMgbm8gZW50cnkgd2l0aCB0aGF0IG5hbWUsIDxDT0RFPjA8L0NPREU+IGlzIHJldHVybmVkLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZlbnZ6Lmh4cQB+Bup0ADNjb25zdCBjaGFyICplbnZ6LCBzaXplX3QgZW52el9sZW4sIGNvbnN0IGNoYXIgKm5hbWV0AAZjaGFyICp0AAhlbnZ6X2dldHNxAH4ACnQBZAogICAgICAgIFRoZSA8Q09ERT5lbnZ6X2dldDwvQ09ERT4gZnVuY3Rp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IGJlIGNhbGxlZCBzdWJzZXF1ZW50bHkgc2luY2UgaXQgdXBkYXRlcyB0aGUgYXJyYXkgdG8KICAgICAgICAgZ3VhcmFudGVlIHJhbmRvbSBudW1iZXJzLiAgVGhlIGFycmF5IHNob3VsZCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgYmVmb3JlCiAgICAgICAgIGluaXRpYWwgdXNlIHRvIG9idGFpbiByZXByb2R1Y2libGUgcmVzdWx0cy4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc3RkbGliLmh4cQB+BwZ0ABt1bnNpZ25lZCBzaG9ydCBpbnQgeHN1YmlbM110AAZkb3VibGV0AAllcmFuZDQ4X3JzcQB+AAp0ApoKICAgICAgICBUaGUgPENPREU+ZXJhbmQ0OF9yPC9DT0RFPiBmdW5jdGlvbiB3b3JrcyBsaWtlIDxDT0RFPmVyYW5kNDg8L0NPREU+LCBidXQgaW4gYWRkaXRpb24KICAgICAgICAgaXQgdGFrZXMgYW4gYXJndW1lbnQgPFZBUj5idWZmZXI8L1ZBUj4gd2hpY2ggZGVzY3JpYmVzIHRoZSByYW5kb20gbnVtYmVyCiAgICAgICAgIGdlbmVyYXRvci4gIFRoZSBzdGF0ZSBvZiB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgaXMgdGFrZW4gZnJvbSB0aGUKICAgICAgICAgPENPREU+eHN1Ymk8L0NPREU+IGFycmF5LCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGNvbmdydWVudGlhbCBmb3JtdWxhIGZyb20gdGhlCiAgICAgICAgIGdsb2JhbCByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBkYXRhLiAgVGhlIHJhbmRvbSBudW1iZXIgaXMgcmV0dXJuZWQgaW4KICAgICAgICAgdGhlIHZhcmlhYmxlIHBvaW50ZWQgdG8gYnkgPFZBUj5yZXN1bHQ8L1ZBUj4uCiAgICAgICAgIDxicj48YnI+IFRoZSByZXR1cm4gdmFsdWUgaXMgbm9uLW5lZ2F0aXZlIGlmIHRoZSBjYWxsIHN1Y2NlZWRlZC4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiBpcyBhIEdOVSBleHRlbnNpb24gYW5kIHNo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eHR1YWwgZm9ybS4gIEJ1dCB1bmxpa2UgPENPREU+cGVycm9yPC9DT0RFPiB0aGUgZXJyb3IgdmFsdWUgaXMgZXhwbGljaXRseQogICAgICAgICBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uIGluIHRoZSA8VkFSPmVycm51bTwvVkFSPiBwYXJhbWV0ZXIuICBUaGlzIGVsaW1pbmF0ZXMKICAgICAgICAgdGhlIHByb2JsZW0gbWVudGlvbmVkIGFib3ZlIHRoYXQgdGhlIGVycm9yIHJlcG9ydGluZyBmdW5jdGlvbiBtdXN0IGJlCiAgICAgICAgIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgZnVuY3Rpb24gY2F1c2luZyB0aGUgZXJyb3Igc2luY2Ugb3RoZXJ3aXNlCiAgICAgICAgIDxDT0RFPmVycm5vPC9DT0RFPiBtaWdodCBoYXZlIGEgZGlmZmVyZW50IHZhbHVlLgogICAgICAgICA8YnI+PGJyPiBUaGUgPENPREU+ZXJyb3I8L0NPREU+IHByaW50cyBmaXJzdCB0aGUgcHJvZ3JhbSBuYW1lLiAgSWYgdGhlIGFwcGxpY2F0aW9uCiAgICAgICAgIGRlZmluZWQgYSBnbG9iYWwgdmFyaWFibGUgPENPREU+ZXJyb3JfcHJpbnRfcHJvZ25hbWU8L0NPREU+IGFuZCBwb2ludHMgaXQgdG8gYQogICAgICAgICBmdW5jdGlvbiB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHRvIHByaW50IHRoZSBwcm9ncmFtIG5hbWUuCiAgICAgICAgIE90aGVyd2lzZSB0aGUgc3RyaW5nIGZyb20gdGhlIGdsb2JhbCB2YXJpYWJsZSA8Q09ERT5wcm9ncmFtX25hbWU8L0NPREU+IGlzCiAgICAgICAgIHVzZWQuICBUaGUgcHJvZ3JhbSBuYW1lIGlzIGZvbGxvd2VkIGJ5IGEgY29sb24gYW5kIGEgc3BhY2Ugd2hpY2ggaW4gdHVybgogICAgICAgICBpcyBmb2xsb3dlZCBieSB0aGUgb3V0cHV0IHByb2R1Y2VkIGJ5IHRoZSBmb3JtYXQgc3RyaW5nLiAgSWYgdGhlCiAgICAgICAgIDxWQVI+ZXJybnVtPC9WQVI+IHBhcmFtZXRlciBpcyBub24temVybyB0aGUgZm9ybWF0IHN0cmluZyBvdXRwdXQgaXMgZm9sbG93ZWQKICAgICAgICAgYnkgYSBjb2xvbiBhbmQgYSBzcGFjZSwgZm9sbG93ZWQgYnkgdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHRoZSBlcnJvciBjb2RlCiAgICAgICAgIDxWQVI+ZXJybnVtPC9WQVI+LiAgSW4gYW55IGNhc2UgaXMgdGhlIG91dHB1dCB0ZXJtaW5hdGVkIHdpdGggYSBuZXdsaW5lLgogICAgICAgICA8YnI+PGJyPiBUaGUgb3V0cHV0IGlzIGRpcmVjdGVkIHRvIHRoZSA8Q09ERT5zdGRlcnI8L0NPREU+IHN0cmVhbS4gIElmIHRoZQogICAgICAgICA8Q09ERT5zdGRlcnI8L0NPREU+IHdhc24ndCBvcmllbnRlZCBiZWZvcmUgdGhlIGNhbGwgaXQgd2lsbCBiZSBuYXJyb3ctb3JpZW50ZWQKICAgICAgICAgYWZ0ZXJ3YXJkcy4KICAgICAgICAgPGJyPjxicj4gVGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHVubGVzcyB0aGUgPFZBUj5zdGF0dXM8L1ZBUj4gcGFyYW1ldGVyIGhhcyBhCiAgICAgICAgIG5vbi16ZXJvIHZhbHVlLiAgSW4gdGhpcyBjYXNlIHRoZSBmdW5jdGlvbiB3aWxsIGNhbGwgPENPREU+ZXhpdDwvQ09ERT4gd2l0aAogICAgICAgICB0aGUgPFZBUj5zdGF0dXM8L1ZBUj4gdmFsdWUgZm9yIGl0cyBwYXJhbWV0ZXIgYW5kIHRoZXJlZm9yZSBuZXZlciByZXR1cm4uICBJZgogICAgICAgICA8Q09ERT5lcnJvcjwvQ09ERT4gcmV0dXJucyB0aGUgZ2xvYmFsIHZhcmlhYmxlIDxDT0RFPmVycm9yX21lc3NhZ2VfY291bnQ8L0NPREU+IGlzCiAgICAgICAgIGluY3JlbWVudGVkIGJ5IG9uZSB0byBrZWVwIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgZXJyb3JzIHJlcG9ydGVkLgogICAgICAgIHNxAH4ADwAAAAJ3BAAAAAJ0AAdlcnJuby5odAAHZXJyb3IuaHhxAH4HRXQAL2ludCBzdGF0dXMsIGludCBlcnJudW0sIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4udAAEdm9pZHQADWVycm9yX2F0X2xpbmVzcQB+AAp0BaoKICAgICAgICA8YnI+PGJyPiBUaGUgPENPREU+ZXJyb3JfYXRfbGluZTwvQ09ERT4gZnVuY3Rpb24gaXMgdmVyeSBzaW1pbGFyIHRvIHRoZSA8Q09ERT5lcnJvcjwvQ09ERT4KICAgICAgICAgZnVuY3Rpb24uICBUaGUgb25seSBkaWZmZXJlbmNlIGFyZSB0aGUgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIDxWQVI+Zm5hbWU8L1ZBUj4KICAgICAgICAgYW5kIDxWQVI+bGluZW5vPC9WQVI+LiAgVGhlIGhhbmRsaW5nIG9mIHRoZSBvdGhlciBwYXJhbWV0ZXJzIGlzIGlkZW50aWNhbCB0bwogICAgICAgICB0aGF0IG9mIDxDT0RFPmVycm9yPC9DT0RFPiBleGNlcHQgdGhhdCBiZXR3ZWVuIHRoZSBwcm9ncmFtIG5hbWUgYW5kIHRoZSBzdHJpbmcKICAgICAgICAgZ2VuZXJhdGVkIGJ5IHRoZSBmb3JtYXQgc3RyaW5nIGFkZGl0aW9uYWwgdGV4dCBpcyBpbnNlcnRlZC4KICAgICAgICAgPGJyPjxicj4gRGlyZWN0bHkgZm9sbG93aW5nIHRoZSBwcm9ncmFtIG5hbWUgYSBjb2xvbiwgZm9sbG93ZWQgYnkgdGhlIGZpbGUgbmFtZQogICAgICAgICBwb2ludGVyIHRvIGJ5IDxWQVI+Zm5hbWU8L1ZBUj4sIGFub3RoZXIgY29sb24sIGFuZCBhIHZhbHVlIG9mIDxWQVI+bGluZW5vPC9WQVI+IGlzCiAgICAgICAgIHByaW50ZWQuCiAgICAgICAgIDxicj48YnI+IFRoaXMgYWRkaXRpb25hbCBvdXRwdXQgb2YgY291cnNlIGlzIG1lYW50IHRvIGJlIHVzZWQgdG8gbG9jYXRlIGFuIGVycm9yCiAgICAgICAgIGluIGFuIGlucHV0IGZpbGUgKGxpa2UgYSBwcm9ncmFtbWluZyBsYW5ndWFnZSBzb3VyY2UgY29kZSBmaWxlIGV0YykuCiAgICAgICAgIDxicj48YnI+IElmIHRoZSBnbG9iYWwgdmFyaWFibGUgPENPREU+ZXJyb3Jfb25lX3Blcl9saW5lPC9DT0RFPiBpcyBzZXQgdG8gYSBub24temVybwogICAgICAgICB2YWx1ZSA8Q09ERT5lcnJvcl9hdF9saW5lPC9DT0RFPiB3aWxsIGF2b2lkIHByaW50aW5nIGNvbnNlY3V0aXZlIG1lc3NhZ2VzIGZvcgogICAgICAgICB0aGUgc2FtZSBmaWxlIGFuZCBsaW5lLiAgUmVwZXRpdGlvbiB3aGljaCBhcmUgbm90IGRpcmVjdGx5IGZvbGxvd2luZwogICAgICAgICBlYWNoIG90aGVyIGFyZSBub3QgY2F1Z2h0LgogICAgICAgICA8YnI+PGJyPiBKdXN0IGxpa2UgPENPREU+ZXJyb3I8L0NPREU+IHRoaXMgZnVuY3Rpb24gb25seSByZXR1cm5lZCBpZiA8VkFSPnN0YXR1czwvVkFSPiBpcwogICAgICAgICB6ZXJvLiAgT3RoZXJ3aXNlIDxDT0RFPmV4aXQ8L0NPREU+IGlzIGNhbGxlZCB3aXRoIHRoZSBub24temVybyB2YWx1ZS4gIElmCiAgICAgICAgIDxDT0RFPmVycm9yPC9DT0RFPiByZXR1cm5zIHRoZSBnbG9iYWwgdmFyaWFibGUgPENPREU+ZXJyb3JfbWVzc2FnZV9jb3VudDwvQ09ERT4gaXMKICAgICAgICAgaW5jcmVtZW50ZWQgYnkgb25lIHRvIGtlZXAgdHJhY2sgb2YgdGhlIG51bWJlciBvZiBlcnJvcnMgcmVwb3J0ZWQuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB2Vycm9yLmh4cQB+B010AFdpbnQgc3RhdHVzLCBpbnQgZXJybnVtLCBjb25zdCBjaGFyICpmbmFtZSwgdW5zaWduZWQgaW50IGxpbmVubywgY29uc3QgY2hhciAqZm9ybWF0LCAuLi50AAR2b2lkdAAEZXJyeHNxAH4ACnQBvgogICAgICAgIFRoZSA8Q09ERT5lcnJ4PC9DT0RFPiBmdW5jdGlvbiBpcyByb3VnaGx5IGVxdWl2YWxlbnQgdG8gYSBjYWxsIGxpa2UKICAgICAgICAgPHByZT48YnI+CiAgICAgICAgICAgZXJyb3IgKHN0YXR1cywgMCwgZm9ybWF0LCB0aGUgcGFyYW1ldGVycyk8YnI+CiAgICAgICAgIDwvcHJlPgoKICAgICAgICAgZXhjZXB0IHRoYXQgdGhlIGdsb2JhbCB2YXJpYWJsZXMgPENPREU+ZXJyb3I8L0NPREU+IHJlc3BlY3RzIGFuZCBtb2RpZmllcwogICAgICAgICBhcmUgbm90IHVzZWQgYW5kIHRoYXQgdGhlIHByb2dyYW0gaXMgZXhpdGVkIGV2ZW4gaWYgPFZBUj5zdGF0dXM8L1ZBUj4KICAgICAgICAgaXMgemVyby4gIFRoZSBkaWZmZXJlbmNlIHRvIDxDT0RFPmVycjwvQ09ERT4gaXMgdGhhdCBubyBlcnJvciBudW1iZXIKICAgICAgICAgc3RyaW5nIGlzIHByaW50ZWQuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQABWVyci5oeHEAfgdUdAAjaW50IHN0YXR1cywgY29uc3QgY2hhciAqZm9ybWF0LCAuLi50AAR2b2lkdAAFZXhlY2xzcQB+AAp0ANcKICAgICAgICBUaGlzIGlzIHNpbWlsYXIgdG8gPENPREU+ZXhlY3Y8L0NPREU+LCBidXQgdGhlIDxWQVI+YXJndjwvVkFSPiBzdHJpbmdzIGFyZQogICAgICAgICBzcGVjaWZpZWQgaW5kaXZpZHVhbGx5IGluc3RlYWQgb2YgYXMgYW4gYXJyYXkuICBBIG51bGwgcG9pbnRlciBtdXN0IGJlCiAgICAgICAgIHBhc3NlZCBhcyB0aGUgbGFzdCBzdWNoIGFyZ3VtZW50LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAh1bmlzdGQuaHhxAH4HW3QAK2NvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICphcmcwLCAuLi50AANpbnR0AAZleGVjbGVzcQB+AAp0AXMKICAgICAgICBUaGlzIGlzIHNpbWlsYXIgdG8gPENPREU+ZXhlY2w8L0NPREU+LCBidXQgcGVybWl0cyB5b3UgdG8gc3BlY2lmeSB0aGUKICAgICAgICAgZW52aXJvbm1lbnQgZm9yIHRoZSBuZXcgcHJvZ3JhbSBleHBsaWNpdGx5LiAgVGhlIGVudmlyb25tZW50IGFyZ3VtZW50IGlzCiAgICAgICAgIHBhc3NlZCBmb2xsb3dpbmcgdGhlIG51bGwgcG9pbnRlciB0aGF0IG1hcmtzIHRoZSBsYXN0IDxWQVI+YXJndjwvVkFSPgogICAgICAgICBhcmd1bWVudCwgYW5kIHNob3VsZCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzIGluIHRoZSBzYW1lIGZvcm1hdCBhcyBmb3IKICAgICAgICAgdGhlIDxDT0RFPmVudmlyb248L0NPREU+IHZhcmlhYmxlLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAh1bmlzdGQuaHhxAH4HYnQAPmNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICphcmcwLCBjaGFyICpjb25zdCBlbnZbXSwgLi4udAADaW50dAAGZXhlY2xwc3EAfgAKdACeCiAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBsaWtlIDxDT0RFPmV4ZWNsPC9DT0RFPiwgZXhjZXB0IHRoYXQgaXQgcGVyZm9ybXMgdGhlIHNhbWUKICAgICAgICAgZmlsZSBuYW1lIHNlYXJjaGluZyBhcyB0aGUgPENPREU+ZXhlY3ZwPC9DT0RFPiBmdW5jdGlvbi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIdW5pc3RkLmh4cQB+B2l0ACtjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqYXJnMCwgLi4udAADaW50dAAFZXhlY3ZzcQB+AAp0AzgKICAgICAgICBUaGUgPENPREU+ZXhlY3Y8L0NPREU+IGZ1bmN0aW9uIGV4ZWN1dGVzIHRoZSBmaWxlIG5hbWVkIGJ5IDxWQVI+ZmlsZW5hbWU8L1ZBUj4gYXMgYQogICAgICAgICBuZXcgcHJvY2VzcyBpbWFnZS4KICAgICAgICAgPGJyPjxicj4gVGhlIDxWQVI+YXJndjwvVkFSPiBhcmd1bWVudCBpcyBhbiBhcnJheSBvZiBudWxsLXRlcm1pbmF0ZWQgc3RyaW5ncyB0aGF0IGlzCiAgICAgICAgIHVzZWQgdG8gcHJvdmlkZSBhIHZhbHVlIGZvciB0aGUgPENPREU+YXJndjwvQ09ERT4gYXJndW1lbnQgdG8gdGhlIDxDT0RFPm1haW48L0NPREU+CiAgICAgICAgIGZ1bmN0aW9uIG9mIHRoZSBwcm9ncmFtIHRvIGJlIGV4ZWN1dGVkLiAgVGhlIGxhc3QgZWxlbWVudCBvZiB0aGlzIGFycmF5CiAgICAgICAgIG11c3QgYmUgYSBudWxsIHBvaW50ZXIuICBCeSBjb252ZW50aW9uLCB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGlzIGFycmF5CiAgICAgICAgIGlzIHRoZSBmaWxlIG5hbWUgb2YgdGhlIHByb2dyYW0gc2FucyBkaXJlY3RvcnkgbmFtZXMuICAsIGZvciBmdWxsIGRldGFpbHMgb24gaG93IHByb2dyYW1zIGNhbiBhY2Nlc3MgdGhlc2UgYXJndW1lbnRzLgogICAgICAgICA8YnI+PGJyPiBUaGUgZW52aXJvbm1lbnQgZm9yIHRoZSBuZXcgcHJvY2VzcyBpbWFnZSBpcyB0YWtlbiBmcm9tIHRoZQogICAgICAgICA8Q09ERT5lbnZpcm9uPC9DT0RFPiB2YXJpYWJsZSBvZiB0aGUgY3VycmVudCBwcm9jZXNzIGltYWdlOyBzZWUKICAgICAgICAgRW52aXJvbm1lbnQgVmFyaWFibGVzLCBmb3IgaW5mb3JtYXRpb24gYWJvdXQgZW52aXJvbm1lbnRzLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAh1bmlzdGQuaHhxAH4HcHQAKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjaGFyICpjb25zdCBhcmd2W110AANpbnR0AAZleGVjdmVzcQB+AAp0ATYKICAgICAgICBUaGlzIGlzIHNpbWlsYXIgdG8gPENPREU+ZXhlY3Y8L0NPREU+LCBidXQgcGVybWl0cyB5b3UgdG8gc3BlY2lmeSB0aGUgZW52aXJvbm1lbnQKICAgICAgICAgZm9yIHRoZSBuZXcgcHJvZ3JhbSBleHBsaWNpdGx5IGFzIHRoZSA8VkFSPmVudjwvVkFSPiBhcmd1bWVudC4gIFRoaXMgc2hvdWxkCiAgICAgICAgIGJlIGFuIGFycmF5IG9mIHN0cmluZ3MgaW4gdGhlIHNhbWUgZm9ybWF0IGFzIGZvciB0aGUgPENPREU+ZW52aXJvbjwvQ09ERT4KICAgICAgICAgdmFyaWFibGU7IHNlZSBFbnZpcm9ubWVudCBBY2Nlc3MuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHVuaXN0ZC5oeHEAfgd3dAA7Y29uc3QgY2hhciAqZmlsZW5hbWUsIGNoYXIgKmNvbnN0IGFyZ3ZbXSwgY2hhciAqY29uc3QgZW52W110AANpbnR0AAZleGVjdnBzcQB+AAp0AhUKICAgICAgICBUaGUgPENPREU+ZXhlY3ZwPC9DT0RFPiBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIDxDT0RFPmV4ZWN2PC9DT0RFPiwgZXhjZXB0IHRoYXQgaXQKICAgICAgICAgc2VhcmNoZXMgdGhlIGRpcmVjdG9yaWVzIGxpc3RlZCBpbiB0aGUgPENPREU+UEFUSDwvQ09ERT4gZW52aXJvbm1lbnQgdmFyaWFibGUKICAgICAgICAgIHRvIGZpbmQgdGhlIGZ1bGwgZmlsZSBuYW1lIG9mIGEKICAgICAgICAgZmlsZSBmcm9tIDxWQVI+ZmlsZW5hbWU8L1ZBUj4gaWYgPFZBUj5maWxlbmFtZTwvVkFSPiBkb2VzIG5vdCBjb250YWluIGEgc2xhc2guCiAgICAgICAgIDxicj48YnI+IFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIGZvciBleGVjdXRpbmcgc3lzdGVtIHV0aWxpdHkgcHJvZ3JhbXMsIGJlY2F1c2UKICAgICAgICAgaXQgbG9va3MgZm9yIHRoZW0gaW4gdGhlIHBsYWNlcyB0aGF0IHRoZSB1c2VyIGhhcyBjaG9zZW4uICBTaGVsbHMgdXNlIGl0CiAgICAgICAgIHRvIHJ1biB0aGUgY29tbWFuZHMgdGhhdCB1c2VycyB0eXBlLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAh1bmlzdGQuaHhxAH4HfnQAKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjaGFyICpjb25zdCBhcmd2W110AANpbnR0AARleGl0c3EAfgAKdAEwCiAgICAgICAgVGhlIDxDT0RFPmV4aXQ8L0NPREU+IGZ1bmN0aW9uIHRlbGxzIHRoZSBzeXN0ZW0gdGhhdCB0aGUgcHJvZ3JhbSBpcyBkb25lLCB3aGljaAogICAgICAgICBjYXVzZXMgaXQgdG8gdGVybWluYXRlIHRoZSBwcm9jZXNzLgogICAg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IGZ1bmN0aW9uIHJldHVybnMgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBmbG9hdGluZy1wb2ludCBudW1iZXIKICAgICAgICAgPFZBUj5udW1iZXI8L1ZBUj4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQABm1hdGguaHhxAH4H4HQADWRvdWJsZSBudW1iZXJ0AAZkb3VibGV0AAVmYWJzZnNxAH4ACnQAcwogICAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIGZsb2F0aW5nLXBvaW50IG51bWJlcgogICAgICAgICA8VkFSPm51bWJlcjwvVkFSPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGbWF0aC5oeHEAfgfndAAMZmxvYXQgbnVtYmVydAAFZmxvYXR0AAVmYWJzbHNxAH4ACnQAcwogICAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIGZsb2F0aW5nLXBvaW50IG51bWJlcgogICAgICAgICA8VkFSPm51bWJlcjwvVkFSPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGbWF0aC5oeHEAfgfudAASbG9uZyBkb3VibGUgbnVtYmVydAALbG9uZyBkb3VibGV0AAZmY2hkaXJzcQB+AAp0A5oKICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2V0IHRoZSBwcm9jZXNzJ3Mgd29ya2luZyBkaXJlY3RvcnkgdG8KICAgICAgICAgZGlyZWN0b3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlsZSBkZXNjcmlwdG9yIDxWQVI+ZmlsZWRlczwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gVGhlIG5vcm1hbCwgc3VjY2Vzc2Z1bCByZXR1cm4gdmFsdWUgZnJvbSA8Q09ERT5mY2hkaXI8L0NPREU+IGlzIDxDT0RFPjA8L0NPREU+LiAgQQogICAgICAgICB2YWx1ZSBvZiA8Q09ERT4tMTwvQ09ERT4gaXMgcmV0dXJuZWQgdG8gaW5kaWNhdGUgYW4gZXJyb3IuICBUaGUgZm9sbG93aW5nCiAgICAgICAg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biBiZSBkZXRlY3RlZCBhdCB0aGlzCiAgICAgICAgIHRpbWUuICBGb3IgZXhhbXBsZSwgd2hlbiA8Q09ERT5mY2xvc2U8L0NPREU+IHdyaXRlcyB0aGUgcmVtYWluaW5nIGJ1ZmZlcmVkCiAgICAgICAgIG91dHB1dCwgaXQgbWlnaHQgZ2V0IGFuIGVycm9yIGJlY2F1c2UgdGhlIGRpc2sgaXMgZnVsbC4gIEV2ZW4gaWYgeW91CiAgICAgICAgIGtub3cgdGhlIGJ1ZmZlciBpcyBlbXB0eSwgZXJyb3JzIGNhbiBzdGlsbCBvY2N1ciB3aGVuIGNsb3NpbmcgYSBmaWxlIGlmCiAgICAgICAgIHlvdSBhcmUgdXNpbmcgTkZTLgogICAgICAgICA8YnI+PGJyPiBUaGUgZnVuY3Rpb24gPENPREU+ZmNsb3NlPC9DT0RFPiBpcyBkZWNsYXJlZCBpbiA8VFQ+c3RkaW8uaDwvVFQ+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAdzdGRpby5oeHEAfggSdAAMRklMRSAqc3RyZWFtdAADaW50dAAJZmNsb3NlYWxsc3EAfgAKdANVCiAgICAgICAgVGhpcyBmdW5jdGlvbiBjYXVzZXMgYWxsIG9wZW4gc3RyZWFtcyBvZiB0aGUgcHJvY2VzcyB0byBiZSBjbG9zZWQgYW5kCiAgICAgICAgIHRoZSBjb25uZWN0aW9uIHRvIGNvcnJlc3BvbmRpbmcgZmlsZXMgdG8gYmUgYnJva2VuLiAgQWxsIGJ1ZmZlcmVkIGRhdGEKICAgICAgICAgaXMgd3JpdHRlbiBhbmQgYW55IGJ1ZmZlcmVkIGlucHV0IGlzIGRpc2NhcmRlZC4gIFRoZSA8Q09ERT5mY2xvc2VhbGw8L0NPREU+CiAgICAgICAgIGZ1bmN0aW9uIHJldHVybnMgYSB2YWx1ZSBvZiA8Q09ERT4wPC9DT0RFPiBpZiBhbGwgdGhlIGZpbGVzIHdlcmUgY2xvc2VkCiAgICAgICAgIHN1Y2Nlc3NmdWxseSwgYW5kIDxDT0RFPkVPRjwvQ09ERT4gaWYgYW4gZXJyb3Igd2FzIGRldGVjdGVkLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkIG9ubHkgaW4gc3BlY2lhbCBzaXR1YXRpb25zLCBlLmcuLCB3aGVuIGFuCiAgICAgICAgIGVycm9yIG9jY3VycmVkIGFuZCB0aGUgcHJvZ3JhbSBtdXN0IGJlIGFib3J0ZWQuICBOb3JtYWxseSBlYWNoIHNpbmdsZQogICAgICAgICBzdHJlYW0gc2hvdWxkIGJlIGNsb3NlZCBzZXBhcmF0ZWx5IHNvIHRoYXQgcHJvYmxlbXMgd2l0aCBpbmRpdmlkdWFsCiAgICAgICAgIHN0cmVhbXMgY2FuIGJlIGlkZW50aWZpZWQuICBJdCBpcyBhbHNvIHByb2JsZW1hdGljIHNpbmNlIHRoZSBzdGFuZGFyZAogICAgICAgICBzdHJlYW1zICB3aWxsIGFsc28gYmUgY2xvc2VkLgogICAgICAgICA8YnI+PGJyPiBUaGUgZnVuY3Rpb24gPENPREU+ZmNsb3NlYWxsPC9DT0RFPiBpcyBkZWNsYXJlZCBpbiA8VFQ+c3RkaW8uaDwvVFQ+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAdzdGRpby5oeHEAfggZdAAEdm9pZHQAA2ludHQABWZjbnRsc3EAfgAKdAd8CiAgICAgICAgVGhlIDxDT0RFPmZjbnRsPC9DT0RFPiBmdW5jdGlvbiBwZXJmb3JtcyB0aGUgb3BlcmF0aW9uIHNwZWNpZmllZCBieQogICAgICAgICA8VkFSPmNvbW1hbmQ8L1ZBUj4gb24gdGhlIGZpbGUgZGVzY3JpcHRvciA8VkFSPmZpbGVkZXM8L1ZBUj4uICBTb21lIGNvbW1hbmRzCiAgICAgICAgIHJlcXVpcmUgYWRkaXRpb25hbCBhcmd1bWVudHMgdG8gYmUgc3VwcGxpZWQuICBUaGVzZSBhZGRpdGlvbmFsIGFyZ3VtZW50cwogICAgICAgICBhbmQgdGhlIHJldHVybiB2YWx1ZSBhbmQgZXJyb3IgY29uZGl0aW9ucyBhcmUgZ2l2ZW4gaW4gdGhlIGRldGFpbGVkCiAgICAgICAgIGRlc2NyaXB0aW9ucyBvZiB0aGUgaW5kaXZpZHVhbCBjb21tYW5kcy4KICAgICAgICAgPGJyPjxicj4gQnJpZWZseSwgaGVyZSBpcyBhIGxpc3Qgb2Ygd2hhdCB0aGUgdmFyaW91cyBjb21tYW5kcyBhcmUuCiAgICAgICAgIDxicj48YnI+IDxETD4KCiAgICAgICAgIDxEVD48Q09ERT5GX0RVUEZEPC9DT0RFPgo8REQ+CiAgICAgICAgIER1cGxpY2F0ZSB0aGUgZmlsZSBkZXNjcmlwdG9yIChyZXR1cm4gYW5vdGhlciBmaWxlIGRlc2NyaXB0b3IgcG9pbnRpbmcKICAgICAgICAgdG8gdGhlIHNhbWUgb3BlbiBmaWxlKS4gIC4KICAgICAgICAgPGJyPjxicj4gPExJPiBGX0dFVEZECiAgICAgICAgIEdldCBmbGFncyBhc3NvY2lhdGVkIHdpdGggdGhlIGZpbGUgZGVzY3JpcHRvci4gIC4KICAgICAgICAgPGJyPjxicj4gPExJPiBGX1NFVEZECiAgICAgICAgIFNldCBmbGFncyBhc3NvY2lhdGVkIHdpdGggdGhlIGZpbGUgZGVzY3JpcHRvci4gIC4KICAgICAgICAgPGJyPjxicj4gPExJPiBGX0dFVEZMCiAgICAgICAgIEdldCBmbGFncyBhc3NvY2lhdGVkIHdpdGggdGhlIG9wZW4gZmlsZS4gIC4KICAgICAgICAgPGJyPjxicj4gPExJPiBGX1NFVEZMCiAgICAgICAgIFNldCBmbGFncyBhc3NvY2lhdGVkIHdpdGggdGhlIG9wZW4gZmlsZS4gIC4KICAgICAgICAgPGJyPjxicj4gPExJPiBGX0dFVExLCiAgICAgICAgIEdldCBhIGZpbGUgbG9jay4gIC4KICAgICAgICAgPGJyPjxicj4gPExJPiBGX1NFVExLCiAgICAgICAgIFNldCBvciBjbGVhciBhIGZpbGUgbG9jay4gIC4KICAgICAgICAgPGJyPjxicj4gPExJPiBGX1NFVExLVwogICAgICAgICBMaWtlIDxDT0RFPkZfU0VUTEs8L0NPREU+LCBidXQgd2FpdCBmb3IgY29tcGxldGlvbi4gIC4KICAgICAgICAgPGJyPjxicj4gPExJPiBGX0dFVE9XTgogICAgICAgICBHZXQgcHJvY2VzcyBvciBwcm9jZXNzIGdyb3VwIElEIHRvIHJlY2VpdmUgPENPREU+U0lHSU88L0NPREU+IHNpZ25hbHMuCiAgICAgICAgIC4KICAgICAgICAgPGJyPjxicj4gPExJPiBGX1NFVE9XTgogICAgICAgICBTZXQgcHJvY2VzcyBvciBwcm9jZXNzIGdyb3VwIElEIHRvIHJlY2VpdmUgPENPREU+U0lHSU88L0NPREU+IHNpZ25hbHMuCiAgICAgICAgIC4KCiAgICAgICAgIDxicj48YnI+IFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgaW4gbXVsdGktdGhyZWFkZWQgcHJvZ3JhbXMuICBUaGlzCiAgICAgICAgIGlzIGEgcHJvYmxlbSBpZiB0aGUgdGhyZWFkIGFsbG9jYXRlcyBzb21lIHJlc291cmNlcyAobGlrZSBtZW1vcnksIGZpbGUKICAgICAgICAgZGVzY3JpcHRvcnMsIHNlbWFwaG9yZXMgb3Igd2hhdGV2ZXIpIGF0IHRoZSB0aW1lIDxDT0RFPmZjbnRsPC9DT0RFPiBpcwogICAgICAgICBjYWxsZWQuICBJZiB0aGUgdGhyZWFkIGdldHMgY2FuY2VsZWQgdGhlc2UgcmVzb3VyY2VzIHN0YXkgYWxsb2NhdGVkCiAgICAgICAgIHVudGlsIHRoZSBwcm9ncmFtIGVuZHMuICBUbyBhdm9pZCB0aGlzIGNhbGxzIHRvIDxDT0RFPmZjbnRsPC9DT0RFPiBzaG91bGQgYmUKICAgICAgICAgcHJvdGVjdGVkIHVzaW5nIGNhbmNlbGxhdGlvbiBoYW5kbGVycy4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHZmNudGwuaHhxAH4IIHQAHWludCBmaWxlZGVzLCBpbnQgY29tbWFuZCwgLi4udAADaW50dAAEZmN2dHNxAH4ACnQDlAogICAgICAgIFRoZSBmdW5jdGlvbiA8Q09ERT5mY3Z0PC9DT0RFPiBpcyBsaWtlIDxDT0RFPmVjdnQ8L0NPREU+LCBidXQgPFZBUj5uZGlnaXQ8L1ZBUj4gc3BlY2lmaWVzCiAgICAgICAgIHRoZSBudW1iZXIgb2YgZGlnaXRzIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50LiAgSWYgPFZBUj5uZGlnaXQ8L1ZBUj4gaXMgbGVzcwogICAgICAgICB0aGFuIHplcm8sIDxWQVI+dmFsdWU8L1ZBUj4gaXMgcm91bmRlZCB0byB0aGUgPFZBUj5uZGlnaXQ8L1ZBUj4rMSd0aCBwbGFjZSB0byB0aGUKICAgICAgICAgbGVmdCBvZiB0aGUgZGVjaW1hbCBwb2ludC4gIEZvciBleGFtcGxlLCBpZiA8VkFSPm5kaWdpdDwvVkFSPiBpcyA8Q09ERT4tMTwvQ09ERT4sCiAgICAgICAgIDxWQVI+dmFsdWU8L1ZBUj4gd2lsbCBiZSByb3VuZGVkIHRvIHRoZSBuZWFyZXN0IDEwLiAgSWYgPFZBUj5uZGlnaXQ8L1ZBUj4gaXMKICAgICAgICAgbmVnYXRpdmUgYW5kIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YgZGlnaXRzIHRvIHRoZSBsZWZ0IG9mIHRoZSBkZWNpbWFsCiAgICAgICAgIHBvaW50IGluIDxWQVI+dmFsdWU8L1ZBUj4sIDxWQVI+dmFsdWU8L1ZBUj4gd2lsbCBiZSByb3VuZGVkIHRvIG9uZSBzaWduaWZpY2FudCBkaWdpdC4KICAgICAgICAgPGJyPjxicj4gSWYgPFZBUj5uZGlnaXQ8L1ZBUj4gZGVjaW1hbCBkaWdpdHMgd291bGQgZXhjZWVkIHRoZSBwcmVjaXNpb24gb2YgYQogICAgICAgICA8Q09ERT5kb3VibGU8L0NPREU+IGl0IGlzIHJlZHVjZWQgdG8gYSBzeXN0ZW0tc3BlY2lmaWMgdmFsdWUuCiAgICAgICAgIDxicj48YnI+IFRoZSByZXR1cm5lZCBzdHJpbmcgaXMgc3RhdGljYWxseSBhbGxvY2F0ZWQgYW5kIG92ZXJ3cml0dGVuIGJ5IGVhY2ggY2FsbAogICAgICAgICB0byA8Q09ERT5mY3Z0PC9DT0RFPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc3RkbGliLmh4cQB+CCd0AC5kb3VibGUgdmFsdWUsIGludCBuZGlnaXQsIGludCAqZGVjcHQsIGludCAqbmVndAAGY2hhciAqdAAGZmN2dF9yc3EAfgAKdAFqCiAgICAgICAgVGhlIDxDT0RFPmZjdnRfcjwvQ09ERT4gZnVuY3Rpb24gaXMgdGhlIHNhbWUgYXMgPENPREU+ZmN2dDwvQ09ERT4sIGV4Y2VwdCB0aGF0IGl0CiAgICAgICAgIHBsYWNlcyBpdHMgcmVzdWx0IGludG8gdGhlIHVzZXItc3BlY2lmaWVkIGJ1ZmZlciBwb2ludGVkIHRvIGJ5CiAgICAgICAgIDxWQVI+YnVmPC9WQVI+LCB3aXRoIGxlbmd0aCA8VkFSPmxlbjwvVkFSPi4gIFRoZSByZXR1cm4gdmFsdWUgaXMgPENPREU+LTE8L0NPREU+IGluCiAgICAgICAgIGNhc2Ugb2YgYW4gZXJyb3IgYW5kIHplcm8gb3RoZXJ3aXNlLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIGlzIGEgR05VIGV4dGVuc2lvbi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc3RkbGliLmh4cQB+CC50AEVkb3VibGUgdmFsdWUsIGludCBuZGlnaXQsIGludCAqZGVjcHQsIGludCAqbmVnLCBjaGFyICpidWYsIHNpemVfdCBsZW50AANpbnR0AAlmZGF0YXN5bmNzcQB+AAp0BBIKICAgICAgICBXaGVuIGEgY2FsbCB0byB0aGUgPENPREU+ZmRhdGFzeW5jPC9DT0RFPiBmdW5jdGlvbiByZXR1cm5zLCBpdCBpcyBlbnN1cmVkCiAgICAgICAgIHRoYXQgYWxsIG9mIHRoZSBmaWxlIGRhdGEgaXMgd3JpdHRlbiB0byB0aGUgZGV2aWNlLiAgRm9yIGFsbCBwZW5kaW5nIEkvTwogICAgICAgICBvcGVyYXRpb25zLCB0aGUgcGFydHMgZ3VhcmFudGVlaW5nIGRhdGEgaW50ZWdyaXR5IGZpbmlzaGVkLgogICAgICAgICA8YnI+PGJyPiBOb3QgYWxsIHN5c3RlbXMgaW1wbGVtZW50IHRoZSA8Q09ERT5mZGF0YXN5bmM8L0NPREU+IG9wZXJhdGlvbi4gIE9uIHN5c3RlbXMKICAgICAgICAgbWlzc2luZyB0aGlzIGZ1bmN0aW9uYWxpdHkgPENPREU+ZmRhdGFzeW5jPC9DT0RFPiBpcyBlbXVsYXRlZCBieSBhIGNhbGwgdG8KICAgICAgICAgPENPREU+ZnN5bmM8L0NPREU+IHNpbmNlIHRoZSBwZXJmb3JtZWQgYWN0aW9ucyBhcmUgYSBzdXBlcnNldCBvZiB0aG9zZQogICAgICAgICByZXF1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eHEAfghKdAAcbG9uZyBkb3VibGUgeCwgbG9uZyBkb3VibGUgeXQAC2xvbmcgZG91YmxldAAGZmRvcGVuc3EAfgAKdATuCiAgICAgICAgVGhlIDxDT0RFPmZkb3BlbjwvQ09ERT4gZnVuY3Rpb24gcmV0dXJucyBhIG5ldyBzdHJlYW0gZm9yIHRoZSBmaWxlIGRlc2NyaXB0b3IKICAgICAgICAgPFZBUj5maWxlZGVzPC9WQVI+LgogICAgICAgICA8YnI+PGJyPiBUaGUgPFZBUj5vcGVudHlwZTwvVkFSPiBhcmd1bWVudCBpcyBpbnRlcnByZXRlZCBpbiB0aGUgc2FtZSB3YXkgYXMgZm9yIHRoZQogICAgICAgICA8Q09ERT5mb3BlbjwvQ09ERT4gZnVuY3Rpb24gLCBleGNlcHQgdGhhdAogICAgICAgICB0aGUgPHNhbXA+Yjwvc2FtcD4gb3B0aW9uIGlzIG5vdCBwZXJtaXR0ZWQ7IHRoaXMgaXMgYmVjYXVzZSBHTlUgbWFrZXMgbm8KICAgICAgICAgZGlzdGluY3Rpb24gYmV0d2VlbiB0ZXh0IGFuZCBiaW5hcnkgZmlsZXMuICBBbHNvLCA8Q09ERT4idyI8L0NPREU+IGFuZAogICAgICAgICA8Q09ERT4idysiPC9DT0RFPiBkbyBub3QgY2F1c2UgdHJ1bmNhdGlvbiBvZiB0aGUgZmlsZTsgdGhlc2UgaGF2ZSBhbiBlZmZlY3Qgb25seQogICAgICAgICB3aGVuIG9wZW5pbmcgYSBmaWxlLCBhbmQgaW4gdGhpcyBjYXNlIHRoZSBmaWxlIGhhcyBhbHJlYWR5IGJlZW4gb3BlbmVkLgogICAgICAgICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGUgPFZBUj5vcGVudHlwZTwvVkFSPiBhcmd1bWVudCBtYXRjaGVzIHRoZSBhY3R1YWwKICAgICAgICAgbW9kZSBvZiB0aGUgb3BlbiBmaWxlIGRlc2NyaXB0b3IuCiAgICAgICAgIDxicj48YnI+IFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIG5ldyBzdHJlYW0uICBJZiB0aGUgc3RyZWFtIGNhbm5vdCBiZSBjcmVhdGVkCiAgICAgICAgIChmb3IgZXhhbXBsZSwgaWYgdGhlIG1vZGVzIGZvciB0aGUgZmlsZSBpbmRpY2F0ZWQgYnkgdGhlIGZpbGUgZGVzY3JpcHRvcgogICAgICAgICBkbyBub3QgcGVybWl0IHRoZSBhY2Nlc3Mgc3BlY2lmaWVkIGJ5IHRoZSA8VkFSPm9wZW50eXBlPC9WQVI+IGFyZ3VtZW50KSwgYQogICAgICAgICBudWxsIHBvaW50ZXIgaXMgcmV0dXJuZWQgaW5zdGVhZC4KICAgICAgICAgPGJyPjxicj4gSW4gc29tZSBvdGhlciBzeXN0ZW1zLCA8Q09ERT5mZG9wZW48L0NPREU+IG1heSBmYWlsIHRvIGRldGVjdCB0aGF0IHRoZSBtb2RlcwogICAgICAgICBmb3IgZmlsZSBkZXNjcmlwdG9yIGRvIG5vdCBwZXJtaXQgdGhlIGFjY2VzcyBzcGVjaWZpZWQgYnkKICAgICAgICAgPENPREU+b3BlbnR5cGU8L0NPREU+LiAgVGhlIEdOVSBDIGxpYnJhcnkgYWx3YXlzIGNoZWNrcyBmb3IgdGhpcy4KICAgICAgICBzcQB+AA8AAAACdwQAAAACdAALc3lzL3R5cGVzLmh0AAdzdGRpby5oeHEAfghRdAAhaW50IGZpbGVkZXMsIGNvbnN0IGNoYXIgKm9wZW50eXBldAAGRklMRSAqdAAJZmRvcGVuZGlyc3EAfgAKdAV8CiAgICAgICAgVGhlIDxDT0RFPmZkb3BlbmRpcjwvQ09ERT4gZnVuY3Rpb24gd29ya3MganVzdCBsaWtlIDxDT0RFPm9wZW5kaXI8L0NPREU+IGJ1dAogICAgICAgICBpbnN0ZWFkIG9mIHRha2luZyBhIGZpbGUgbmFtZSBhbmQgb3BlbmluZyBhIGZpbGUgZGVzY3JpcHRvciBmb3IgdGhlCiAgICAgICAgIGRpcmVjdG9yeSB0aGUgY2FsbGVyIGlzIHJlcXVpcmVkIHRvIHByb3ZpZGUgYSBmaWxlIGRlc2NyaXB0b3IuICBUaGlzCiAgICAgICAgIGZpbGUgZGVzY3JpcHRvciBpcyB0aGVuIHVzZWQgaW4gc3Vic2VxdWVudCB1c2VzIG9mIHRoZSByZXR1cm5lZAogICAgICAgICBkaXJlY3Rvcnkgc3RyZWFtIG9iamVjdC4KICAgICAgICAgPGJyPjxicj4gVGhlIGNhbGxlciBtdXN0IG1ha2Ugc3VyZSB0aGUgZmlsZSBkZXNjcmlwdG9yIGlzIGFzc29jaWF0ZWQgd2l0aCBhCiAgICAgICAgIGRpcmVjdG9yeSBhbmQgaXQgYWxsb3dzIHJlYWRpbmcuCiAgICAgICAgIDxicj48YnI+IElmIHRoZSA8Q09ERT5mZG9wZW5kaXI8L0NPREU+IGNhbGwgcmV0dXJucyBzdWNjZXNzZnVsbHkgdGhlIGZpbGUgZGVzY3JpcHRvcgogICAgICAgICBpcyBub3cgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlIHN5c3RlbS4gIEl0IGNhbiBiZSB1c2VkIGluIHRoZSBzYW1lCiAgICAgICAgIHdheSB0aGUgZGVzY3JpcHRvciBpbXBsaWNpdGx5IGNyZWF0ZWQgYnkgPENPREU+b3BlbmRpcjwvQ09ERT4gY2FuIGJlIHVzZWQKICAgICAgICAgYnV0IHRoZSBwcm9ncmFtIG11c3Qgbm90IGNsb3NlIHRoZSBkZXNjcmlwdG9yLgogICAgICAgICA8YnI+PGJyPiBJbiBjYXNlIHRoZSBmdW5jdGlvbiBpcyB1bnN1Y2Nlc3NmdWwgaXQgcmV0dXJucyBhIG51bGwgcG9pbnRlciBhbmQgdGhlCiAgICAgICAgIGZpbGUgZGVzY3JpcHRvciByZW1haW5zIHRvIGJlIHVzYWJsZSBieSB0aGUgcHJvZ3JhbS4gIFRoZSBmb2xsb3dpbmcKICAgICAgICAgPENPREU+ZXJybm88L0NPREU+IGVycm9yIGNvbmRpdGlvbnMgYXJlIGRlZmluZWQgZm9yIHRoaXMgZnVuY3Rpb246CiAgICAgICAgIDxicj48YnI+IDxETD4KCiAgICAgICAgIDxEVD48Q09ERT5FQkFERjwvQ09ERT4KPEREPgogICAgICAgICBUaGUgZmlsZSBkZXNjcmlwdG9yIGlzIG5vdCB2YWxpZC4KICAgICAgICAgPGJyPjxicj4gPExJPiBFTk9URElSCiAgICAgICAgIFRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhIGRpcmVjdG9yeS4KICAgICAgICAgPGJyPjxicj4gPExJPiBFSU5WQUwKICAgICAgICAgVGhlIGRlc2NyaXB0b3IgZG9lcyBub3QgYWxsb3cgcmVhZGluZyB0aGUgZGlyZWN0b3J5IGNvbnRlbnQuCiAgICAgICAgIDxicj48YnI+IDxMST4gRU5PTUVNCiAgICAgICAgIE5vdCBlbm91Z2ggbWVtb3J5IGF2YWlsYWJsZS4KCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACGRpcmVudC5oeHEAfghZdAAGaW50IGZkdAAFRElSICp0AA1mZWNsZWFyZXhjZXB0c3EAfgAKdADsCiAgICAgICAgVGhpcyBmdW5jdGlvbiBjbGVhcnMgYWxsIG9mIHRoZSBzdXBwb3J0ZWQgZXhjZXB0aW9uIGZsYWdzIGluZGljYXRlZCBieQogICAgICAgICA8VkFSPmV4Y2VwdHM8L1ZBUj4uCiAgICAgICAgIDxicj48YnI+IFRoZSBmdW5jdGlvbiByZXR1cm5zIHplcm8gaW4gY2FzZSB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLCBhCiAgICAgICAgIG5vbi16ZXJvIHZhbHVlIG90aGVyd2lzZS4KICAgICAgICBzcQB+AA8AAAACdwQAAAACdAAGbWF0aC5odAAGZmVudi5oeHEAfghgdAALaW50IGV4Y2VwdHN0AANpbnR0AA9mZWRpc2FibGVleGNlcHRzcQB+AAp0AcsKICAgICAgICBUaGlzIGZ1bmN0aW9ucyBkaXNhYmxlcyB0cmFwcyBmb3IgZWFjaCBvZiB0aGUgZXhjZXB0aW9ucyBhcyBpbmRpY2F0ZWQgYnkKICAgICAgICAgdGhlIHBhcmFtZXRlciA8VkFSPmV4Y2VwdDwvVkFSPi4gIFRoZSBpbmRpdmlkdWFsIGV4Y2VwZXRpb25zIGFyZSBkZXNjcmliZWQgaW4KICAgICAgICAgU3RhdHVzIGJpdCBvcGVyYXRpb25zLiAgT25seSB0aGUgc3BlY2lmaWVkIGV4Y2VwdGlvbnMgYXJlCiAgICAgICAgIGRpc2FibGVkLCB0aGUgc3RhdHVzIG9mIHRoZSBvdGhlciBleGNlcHRpb25zIGlzIG5vdCBjaGFuZ2VkLgogICAgICAgICA8YnI+PGJyPiBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgcHJldmlvdXMgZW5hYmxlZCBleGNlcHRpb25zIGluIGNhc2UgdGhlCiAgICAgICAgIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgPENPREU+LTE8L0NPREU+IG90aGVyd2lzZS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGZmVudi5oeHEAfghodAALaW50IGV4Y2VwdHN0AANpbnR0AA5mZWVuYWJsZWV4Y2VwdHNxAH4ACnQByQogICAgICAgIFRoaXMgZnVuY3Rpb25zIGVuYWJsZXMgdHJhcHMgZm9yIGVhY2ggb2YgdGhlIGV4Y2VwdGlvbnMgYXMgaW5kaWNhdGVkIGJ5CiAgICAgICAgIHRoZSBwYXJhbWV0ZXIgPFZBUj5leGNlcHQ8L1ZBUj4uICBUaGUgaW5kaXZpZHVhbCBleGNlcGV0aW9ucyBhcmUgZGVzY3JpYmVkIGluCiAgICAgICAgIFN0YXR1cyBiaXQgb3BlcmF0aW9ucy4gIE9ubHkgdGhlIHNwZWNpZmllZCBleGNlcHRpb25zIGFyZQogICAgICAgICBlbmFibGVkLCB0aGUgc3RhdHVzIG9mIHRoZSBvdGhlciBleGNlcHRpb25zIGlzIG5vdCBjaGFuZ2VkLgogICAgICAgICA8YnI+PGJyPiBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgcHJldmlvdXMgZW5hYmxlZCBleGNlcHRpb25zIGluIGNhc2UgdGhlCiAgICAgICAgIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgPENPREU+LTE8L0NPREU+IG90aGVyd2lzZS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGZmVudi5oeHEAfghvdAALaW50IGV4Y2VwdHN0AANpbnR0AAhmZWdldGVudnNxAH4ACnQA5QogICAgICAgIFN0b3JlIHRoZSBmbG9hdGluZy1wb2ludCBlbnZpcm9ubWVudCBpbiB0aGUgdmFyaWFibGUgcG9pbnRlZCB0byBieQogICAgICAgICA8VkFSPmVudnA8L1ZBUj4uCiAgICAgICAgIDxicj48YnI+IFRoZSBmdW5jdGlvbiByZXR1cm5zIHplcm8gaW4gY2FzZSB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLCBhCiAgICAgICAgIG5vbi16ZXJvIHZhbHVlIG90aGVyd2lzZS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGZmVudi5oeHEAfgh2dAAMZmVudl90ICplbnZwdAADaW50dAALZmVnZXRleGNlcHRzcQB+AAp0AI4KICAgICAgICBUaGUgZnVuY3Rpb24gcmV0dXJucyBhIGJpdG1hc2sgb2YgYWxsIGN1cnJlbnRseSBlbmFibGVkIGV4Y2VwdGlvbnMuICBJdAogICAgICAgICByZXR1cm5zIDxDT0RFPi0xPC9DT0RFPiBpbiBjYXNlIG9mIGZhaWx1cmUuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQABmZlbnYuaHhxAH4IfXQAC2ludCBleGNlcHRzdAADaW50dAAPZmVnZXRleGNlcHRmbGFnc3EAfgAKdAFXCiAgICAgICAgVGhpcyBmdW5jdGlvbiBzdG9yZXMgaW4gdGhlIHZhcmlhYmxlIHBvaW50ZWQgdG8gYnkgPFZBUj5mbGFncDwvVkFSPiBhbgogICAgICAgICBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBzZXR0aW5nIG9mIHRoZQogICAgICAgICBleGNlcHRpb24gZmxhZ3MgaW5kaWNhdGVkIGJ5IDxWQVI+ZXhjZXB0czwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gVGhlIGZ1bmN0aW9uIHJldHVybnMgemVybyBpbiBjYXNlIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwsIGEKICAgICAgICAgbm9uLXplcm8gdmFsdWUgb3RoZXJ3aXNlLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZmZW52Lmh4cQB+CIR0AB1mZXhjZXB0X3QgKmZsYWdwLCBpbnQgZXhjZXB0c3QAA2ludHQACmZlZ2V0cm91bmRzcQB+AAp0AI4KICAgICAgICBSZXR1cm5zIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcm91bmRpbmcgbW9kZSwgcmVwcmVzZW50ZWQgYnkgb25lIG9mIHRoZQogICAgICAgICB2YWx1ZXMgb2YgdGhlIGRlZmluZWQgcm91bmRpbmcgbW9kZSBtYWNyb3MuCiAgICAgICAgc3EAfgAPAAAAAncEAAAAAnQABm1hdGguaHQABmZlbnYuaHhxAH4Ii3QABHZvaWR0AANpbnR0AAxmZWhvbGRleGNlcHRzcQB+AAp0AXQKICAgICAgICBTdG9yZSB0aGUgY3VycmVudCBmbG9hdGluZy1wb2ludCBlbnZpcm9ubWVudCBpbiB0aGUgb2JqZWN0IHBvaW50ZWQgdG8gYnkKICAgICAgICAgPFZBUj5lbnZwPC9WQVI+LiAgVGhlbiBjbGVhciBhbGwgZXhjZXB0aW9uIGZsYWdzLCBhbmQgc2V0IHRoZSBGUFUgdG8gdHJhcCBubwogICAgICAgICBleGNlcHRpb25zLiAgTm90IGFsbCBGUFVzIHN1cHBvcnQgdHJhcHBpbmcgbm8gZXhjZXB0aW9uczsgaWYKICAgICAgICAgPENPREU+ZmVob2xkZXhjZXB0PC9DT0RFPiBjYW5ub3Qgc2V0IHRoaXMgbW9kZSwgaXQgcmV0dXJucyBub256ZXJvIHZhbHVlLiAgSWYgaXQKICAgICAgICAgc3VjY2VlZHMsIGl0IHJldHVybnMgemVyby4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGZmVudi5oeHEAfgiTdAAMZmVudl90ICplbnZwdAADaW50dAAEZmVvZnNxAH4ACnQA2gogICAgICAgIFRoZSA8Q09ERT5mZW9mPC9DT0RFPiBmdW5jdGlvbiByZXR1cm5zIG5vbnplcm8gaWYgYW5kIG9ubHkgaWYgdGhlIGVuZC1vZi1maWxlCiAgICAgICAgIGluZGljYXRvciBmb3IgdGhlIHN0cmVhbSA8VkFSPnN0cmVhbTwvVkFSPiBpcyBzZXQuCiAgICAgICAgIDxicj48YnI+IFRoaXMgc3ltYm9sIGlzIGRlY2xhcmVkIGluIDxUVD5zdGRpby5oPC9UVD4uCiAgICAgICAgc3EAfgAPAAAAAncEAAAAAnQAB3N0ZGlvLmh0AAd3Y2hhci5oeHEAfgiadAAMRklMRSAqc3RyZWFtdAADaW50dAANZmVvZl91bmxvY2tlZHNxAH4ACnQBGQogICAgICAgIFRoZSA8Q09ERT5mZW9mX3VubG9ja2VkPC9DT0RFPiBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIHRoZSA8Q09ERT5mZW9mPC9DT0RFPgogICAgICAgICBmdW5jdGlvbiBleGNlcHQgdGhhdCBpdCBkb2VzIG5vdCBpbXBsaWNpdGx5IGxvY2sgdGhlIHN0cmVhbS4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiBpcyBhIEdOVSBleHRlbnNpb24uCiAgICAgICAgIDxicj48YnI+IFRoaXMgc3ltYm9sIGlzIGRlY2xhcmVkIGluIDxUVD5zdGRpby5oPC9UVD4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3N0ZGlvLmh4cQB+CKJ0AAxGSUxFICpzdHJlYW10AANpbnR0AA1mZXJhaXNlZXhjZXB0c3EAfgAKdAJ8CiAgICAgICAgVGhpcyBmdW5jdGlvbiByYWlzZXMgdGhlIHN1cHBvcnRlZCBleGNlcHRpb25zIGluZGljYXRlZCBieQogICAgICAgICA8VkFSPmV4Y2VwdHM8L1ZBUj4uICBJZiBtb3JlIHRoYW4gb25lIGV4Y2VwdGlvbiBiaXQgaW4gPFZBUj5leGNlcHRzPC9WQVI+IGlzIHNldAogICAgICAgICB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGV4Y2VwdGlvbnMgYXJlIHJhaXNlZCBpcyB1bmRlZmluZWQgZXhjZXB0IHRoYXQKICAgICAgICAgb3ZlcmZsb3cgKDxDT0RFPkZFX09WRVJGTE9XPC9DT0RFPikgb3IgdW5kZXJmbG93ICg8Q09ERT5GRV9VTkRFUkZMT1c8L0NPREU+KSBhcmUKICAgICAgICAgcmFpc2VkIGJlZm9yZSBpbmV4YWN0ICg8Q09ERT5GRV9JTkVYQUNUPC9DT0RFPikuICBXaGV0aGVyIGZvciBvdmVyZmxvdyBvcgogICAgICAgICB1bmRlcmZsb3cgdGhlIGluZXhhY3QgZXhjZXB0aW9uIGlzIGFsc28gcmFpc2VkIGlzIGFsc28gaW1wbGVtZW50YXRpb24KICAgICAgICAgZGVwZW5kZW50LgogICAgICAgICA8YnI+PGJyPiBUaGUgZnVuY3Rpb24gcmV0dXJucyB6ZXJvIGluIGNhc2UgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgYQogICAgICAgICBub24temVybyB2YWx1ZSBvdGhlcndpc2UuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQABmZlbnYuaHhxAH4IqXQAC2ludCBleGNlcHRzdAADaW50dAAGZmVycm9yc3EAfgAKdAEsCiAgICAgICAgVGhlIDxDT0RFPmZlcnJvcjwvQ09ERT4gZnVuY3Rpb24gcmV0dXJucyBub256ZXJvIGlmIGFuZCBvbmx5IGlmIHRoZSBlcnJvcgogICAgICAgICBpbmRpY2F0b3IgZm9yIHRoZSBzdHJlYW0gPFZBUj5zdHJlYW08L1ZBUj4gaXMgc2V0LCBpbmRpY2F0aW5nIHRoYXQgYW4gZXJyb3IKICAgICAgICAgaGFzIG9jY3VycmVkIG9uIGEgcHJldmlvdXMgb3BlcmF0aW9uIG9uIHRoZSBzdHJlYW0uCiAgICAgICAgIDxicj48YnI+IFRoaXMgc3ltYm9sIGlzIGRlY2xhcmVkIGluIDxUVD5zdGRpby5oPC9UVD4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3N0ZGlvLmh4cQB+CLB0AAxGSUxFICpzdHJlYW10AANpbnR0AA9mZXJyb3JfdW5sb2NrZWRzcQB+AAp0AR0KICAgICAgICBUaGUgPENPREU+ZmVycm9yX3VubG9ja2VkPC9DT0RFPiBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIHRoZSA8Q09ERT5mZXJyb3I8L0NPREU+CiAgICAgICAgIGZ1bmN0aW9uIGV4Y2VwdCB0aGF0IGl0IGRvZXMgbm90IGltcGxpY2l0bHkgbG9jayB0aGUgc3RyZWFtLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIGlzIGEgR05VIGV4dGVuc2lvbi4KICAgICAgICAgPGJyPjxicj4gVGhpcyBzeW1ib2wgaXMgZGVjbGFyZWQgaW4gPFRUPnN0ZGlvLmg8L1RUPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHc3RkaW8uaHhxAH4It3QADEZJTEUgKnN0cmVhbXQAA2ludHQACGZlc2V0ZW52c3EAfgAKdADRCiAgICAgICAgU2V0IHRoZSBmbG9hdGluZy1wb2ludCBlbnZpcm9ubWVudCB0byB0aGF0IGRlc2NyaWJlZCBieSA8VkFSPmVudnA8L1ZBUj4uCiAgICAgICAgIDxicj48YnI+IFRoZSBmdW5jdGlvbiByZXR1cm5zIHplcm8gaW4gY2FzZSB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLCBhCiAgICAgICAgIG5vbi16ZXJvIHZhbHVlIG90aGVyd2lzZS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGZmVudi5oeHEAfgi+dAASY29uc3QgZmVudl90ICplbnZwdAADaW50dAAPZmVzZXRleGNlcHRmbGFnc3EAfgAKdAEzCiAgICAgICAgVGhpcyBmdW5jdGlvbiByZXN0b3JlcyB0aGUgZmxhZ3MgZm9yIHRoZSBleGNlcHRpb25zIGluZGljYXRlZCBieQogICAgICAgICA8VkFSPmV4Y2VwdHM8L1ZBUj4gdG8gdGhlIHZhbHVlcyBzdG9yZWQgaW4gdGhlIHZhcmlhYmxlIHBvaW50ZWQgdG8gYnkKICAgICAgICAgPFZBUj5mbGFncDwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gVGhlIGZ1bmN0aW9uIHJldHVybnMgemVybyBpbiBjYXNlIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwsIGEKICAgICAgICAgbm9uLXplcm8gdmFsdWUgb3RoZXJ3aXNlLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZmZW52Lmh4cQB+CMV0ACNjb25zdCBmZXhjZXB0X3QgKmZsYWdwLCBpbnQgZXhjZXB0c3QAA2ludHQACmZlc2V0cm91bmRzcQB+AAp0AUcKICAgICAgICBDaGFuZ2VzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcm91bmRpbmcgbW9kZSB0byA8VkFSPnJvdW5kPC9WQVI+LiAgSWYKICAgICAgICAgPFZBUj5yb3VuZDwvVkFSPiBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIG9uZSBvZiB0aGUgc3VwcG9ydGVkIHJvdW5kaW5nIG1vZGVzCiAgICAgICAgIG5vdGhpbmcgaXMgY2hhbmdlZC4gIDxDT0RFPmZlc2V0cm91bmQ8L0NPREU+IHJldHVybnMgemVybyBpZiBpdCBjaGFuZ2VkIHRoZQogICAgICAgICByb3VuZGluZyBtb2RlLCBhIG5vbnplcm8gdmFsdWUgaWYgdGhlIG1vZGUgaXMgbm90IHN1cHBvcnRlZC4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGZmVudi5oeHEAfgjMdAAJaW50IHJvdW5kdAADaW50dAAMZmV0ZXN0ZXhjZXB0c3EAfgAKdAD+CiAgICAgICAgVGVzdCB3aGV0aGVyIHRoZSBleGNlcHRpb24gZmxhZ3MgaW5kaWNhdGVkIGJ5IHRoZSBwYXJhbWV0ZXIgPFZBUj5leGNlcHQ8L1ZBUj4KICAgICAgICAgYXJlIGN1cnJlbnRseSBzZXQuICBJZiBhbnkgb2YgdGhlbSBhcmUsIGEgbm9uemVybyB2YWx1ZSBpcyByZXR1cm5lZAogICAgICAgICB3aGljaCBzcGVjaWZpZXMgd2hpY2ggZXhjZXB0aW9ucyBhcmUgc2V0LiAgT3RoZXJ3aXNlIHRoZSByZXN1bHQgaXMgemVyby4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGZmVudi5oeHEAfgjTdAALaW50IGV4Y2VwdHN0AANpbnR0AAtmZXVwZGF0ZWVudnNxAH4ACnQCVAogICAgICAgIExpa2UgPENPREU+ZmVzZXRlbnY8L0NPREU+LCB0aGlzIGZ1bmN0aW9uIHNldHMgdGhlIGZsb2F0aW5nLXBvaW50IGVudmlyb25tZW50CiAgICAgICAgIHRvIHRoYXQgZGVzY3JpYmVkIGJ5IDxWQVI+ZW52cDwvVkFSPi4gIEhvd2V2ZXIsIGlmIGFueSBleGNlcHRpb25zIHdlcmUKICAgICAgICAgZmxhZ2dlZCBpbiB0aGUgc3RhdHVzIHdvcmQgYmVmb3JlIDxDT0RFPmZldXBkYXRlZW52PC9DT0RFPiB3YXMgY2FsbGVkLCB0aGV5CiAgICAgICAgIHJlbWFpbiBmbGFnZ2VkIGFmdGVyIHRoZSBjYWxsLiAgSW4gb3RoZXIgd29yZHMsIGFmdGVyIDxDT0RFPmZldXBkYXRlZW52PC9DT0RFPgogICAgICAgICBpcyBjYWxsZWQsIHRoZSBzdGF0dXMgd29yZCBpcyB0aGUgYml0d2lzZSBPUiBvZiB0aGUgcHJldmlvdXMgc3RhdHVzIHdvcmQKICAgICAgICAgYW5kIHRoZSBvbmUgc2F2ZWQgaW4gPFZBUj5lbnZwPC9WQVI+LgogICAgICAgICA8YnI+PGJyPiBUaGUgZnVuY3Rpb24gcmV0dXJucyB6ZXJvIGluIGNhc2UgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgYQogICAgICAgICBub24temVybyB2YWx1ZSBvdGhlcndpc2UuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQABmZlbnYuaHhxAH4I2nQAEmNvbnN0IGZlbnZfdCAqZW52cHQAA2ludHQABmZmbHVzaHNxAH4ACnQBgQogICAgICAgIFRoaXMgZnVuY3Rpb24gY2F1c2VzIGFueSBidWZmZXJlZCBvdXRwdXQgb24gPFZBUj5zdHJlYW08L1ZBUj4gdG8gYmUgZGVsaXZlcmVkCiAgICAgICAgIHRvIHRoZSBmaWxlLiAgSWYgPFZBUj5zdHJlYW08L1ZBUj4gaXMgYSBudWxsIHBvaW50ZXIsIHRoZW4KICAgICAgICAgPENPREU+ZmZsdXNoPC9DT0RFPiBjYXVzZXMgYnVmZmVyZWQgb3V0cHV0IG9uIDxFTT5hbGw8L0VNPiBvcGVuIG91dHB1dCBzdHJlYW1zCiAgICAgICAgIHRvIGJlIGZsdXNoZWQuCiAgICAgICAgIDxicj48YnI+IFRoaXMgZnVuY3Rpb24gcmV0dXJucyA8Q09ERT5FT0Y8L0NPREU+IGlmIGEgd3JpdGUgZXJyb3Igb2NjdXJzLCBvciB6ZXJvCiAgICAgICAgIG90aGVyd2lzZS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHc3RkaW8uaHhxAH4I4XQADEZJTEUgKnN0cmVhbXQAA2ludHQAD2ZmbHVzaF91bmxvY2tlZHNxAH4ACnQAqgogICAgICAgIFRoZSA8Q09ERT5mZmx1c2hfdW5sb2NrZWQ8L0NPREU+IGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gdGhlIDxDT0RFPmZmbHVzaDwvQ09ERT4KICAgICAgICAgZnVuY3Rpb24gZXhjZXB0IHRoYXQgaXQgZG9lcyBub3QgaW1wbGljaXRseSBsb2NrIHRoZSBzdHJlYW0uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3N0ZGlvLmh4cQB+COh0AAxGSUxFICpzdHJlYW10AANpbnR0AAVmZ2V0Y3NxAH4ACnQBKAogICAgICAgIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIG5leHQgY2hhcmFjdGVyIGFzIGFuIDxDT0RFPnVuc2lnbmVkIGNoYXI8L0NPREU+IGZyb20KICAgICAgICAgdGhlIHN0cmVhbSA8VkFSPnN0cmVhbTwvVkFSPiBhbmQgcmV0dXJucyBpdHMgdmFsdWUsIGNvbnZlcnRlZCB0byBhbgogICAgICAgICA8Q09ERT5pbnQ8L0NPREU+LiAgSWYgYW4gZW5kLW9mLWZpbGUgY29uZGl0aW9uIG9yIHJlYWQgZXJyb3Igb2NjdXJzLAogICAgICAgICA8Q09ERT5FT0Y8L0NPREU+IGlzIHJldHVybmVkIGluc3RlYWQuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3N0ZGlvLmh4cQB+CO90AAxGSUxFICpzdHJlYW10AANpbnR0AA5mZ2V0Y191bmxvY2tlZHNxAH4ACnQAqAogICAgICAgIFRoZSA8Q09ERT5mZ2V0Y191bmxvY2tlZDwvQ09ERT4gZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byB0aGUgPENPREU+ZmdldGM8L0NPREU+CiAgICAgICAgIGZ1bmN0aW9uIGV4Y2VwdCB0aGF0IGl0IGRvZXMgbm90IGltcGxpY2l0bHkgbG9jayB0aGUgc3RyZWFtLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAdzdGRpby5oeHEAfgj2dAAMRklMRSAqc3RyZWFtdAADaW50dAAJZmdldGdyZW50c3EAfgAKdAHcCiAgICAgICAgVGhlIDxDT0RFPmZnZXRncmVudDwvQ09ERT4gZnVuY3Rpb24gcmVhZHMgdGhlIG5leHQgZW50cnkgZnJvbSA8VkFSPnN0cmVhbTwvVkFSPi4KICAgICAgICAgSXQgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGVudHJ5LiAgVGhlIHN0cnVjdHVyZSBpcyBzdGF0aWNhbGx5CiAgICAgICAgIGFsbG9jYXRlZCBhbmQgaXMgb3ZlcndyaXR0ZW4gb24gc3Vic2VxdWVudCBjYWxscyB0byA8Q09ERT5mZ2V0Z3JlbnQ8L0NPREU+LiAgWW91CiAgICAgICAgIG11c3QgY29weSB0aGUgY29udGVudHMgb2YgdGhlIHN0cnVjdHVyZSBpZiB5b3Ugd2lzaCB0byBzYXZlIHRoZQogICAgICAgICBpbmZvcm1hdGlvbi4KICAgICAgICAgPGJyPjxicj4gVGhlIHN0cmVhbSBtdXN0IGNvcnJlc3BvbmQgdG8gYSBmaWxlIGluIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgc3RhbmRhcmQKICAgICAgICAgZ3JvdXAgZGF0YWJhc2UgZmlsZS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAFZ3JwLmh4cQB+CP10AAxGSUxFICpzdHJlYW10AA5zdHJ1Y3QgZ3JvdXAgKnQAC2ZnZXRncmVudF9yc3EAfgAKdANmCiAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIDxDT0RFPmZnZXRncmVudDwvQ09ERT4gaW4gdGhhdCBpdCByZWFkcyB0aGUgbmV4dAogICAgICAgICB1c2VyIGVudHJ5IGZyb20gPFZBUj5zdHJlYW08L1ZBUj4uICBCdXQgdGhlIHJlc3VsdCBpcyByZXR1cm5lZCBpbiB0aGUKICAgICAgICAgc3RydWN0dXJlIHBvaW50ZWQgdG8gYnkgPFZBUj5yZXN1bHRfYnVmPC9WQVI+LiAgVGhlIGZpcnN0IDxWQVI+YnVmbGVuPC9WQVI+IGJ5dGVzCiAgICAgICAgIG9mIHRoZSBhZGRpdGlvbmFsIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IDxWQVI+YnVmZmVyPC9WQVI+IGFyZSB1c2VkIHRvIGNvbnRhaW4KICAgICAgICAgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiwgbm9ybWFsbHkgc3RyaW5ncyB3aGljaCBhcmUgcG9pbnRlZCB0byBieSB0aGUKICAgICAgICAgZWxlbWVudHMgb2YgdGhlIHJlc3VsdCBzdHJ1Y3R1cmUuCiAgICAgICAgIDxicj48YnI+IFRoaXMgc3RyZWFtIG11c3QgY29ycmVzcG9uZCB0byBhIGZpbGUgaW4gdGhlIHNhbWUgZm9ybWF0IGFzIHRoZSBzdGFuZGFyZAogICAgICAgICBncm91cCBkYXRhYmFzZSBmaWxlLgogICAgICAgICA8YnI+PGJyPiBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyB6ZXJvIDxWQVI+cmVzdWx0PC9WQVI+IHBvaW50cyB0byB0aGUgc3RydWN0dXJlIHdpdGgKICAgICAgICAgdGhlIHdhbnRlZCBkYXRhIChub3JtYWxseSB0aGlzIGlzIGluIDxWQVI+cmVzdWx0X2J1ZjwvVkFSPikuICBJZiBlcnJvcnMKICAgICAgICAgb2NjdXJyZWQgdGhlIHJldHVybiB2YWx1ZSBpcyBub24temVybyBhbmQgPFZBUj5yZXN1bHQ8L1ZBUj4gY29udGFpbnMgYSBudWxsCiAgICAgICAgIHBvaW50ZXIuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQABWdycC5oeHEAfgkEdABaRklMRSAqc3RyZWFtLCBzdHJ1Y3QgZ3JvdXAgKnJlc3VsdF9idWYsIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGJ1Zmxlbiwgc3RydWN0IGdyb3VwICoqcmVzdWx0dAADaW50dAAHZmdldHBvc3NxAH4ACnQCbgogICAgICAgIFRoaXMgZnVuY3Rpb24gc3RvcmVzIHRoZSB2YWx1ZSBvZiB0aGUgZmlsZSBwb3NpdGlvbiBpbmRpY2F0b3IgZm9yIHRoZQogICAgICAgICBzdHJlYW0gPFZBUj5zdHJlYW08L1ZBUj4gaW4gdGhlIDxDT0RFPmZwb3NfdDwvQ09ERT4gb2JqZWN0IHBvaW50ZWQgdG8gYnkKICAgICAgICAgPFZBUj5wb3NpdGlvbjwvVkFSPi4gIElmIHN1Y2Nlc3NmdWwsIDxDT0RFPmZnZXRwb3M8L0NPREU+IHJldHVybnMgemVybzsgb3RoZXJ3aXNlCiAgICAgICAgIGl0IHJldHVybnMgYSBub256ZXJvIHZhbHVlIGFuZCBzdG9yZXMgYW4gaW1wbGVtZW50YXRpb24tZGVmaW5lZCBwb3NpdGl2ZQogICAgICAgICB2YWx1ZSBpbiA8Q09ERT5lcnJubzwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IFdoZW4gdGhlIHNvdXJjZXMgYXJlIGNvbXBpbGVkIHdpdGggPENPREU+X0ZJTEVfT0ZGU0VUX0JJVFMgPT0gNjQ8L0NPREU+IG9uIGEKICAgICAgICAgMzIgYml0IHN5c3RlbSB0aGUgZnVuY3Rpb24gaXMgaW4gZmFjdCA8Q09ERT5mZ2V0cG9zNjQ8L0NPREU+LiAgSS5lLiwgdGhlIExGUwogICAgICAgICBpbnRlcmZhY2UgdHJhbnNwYXJlbnRseSByZXBsYWNlcyB0aGUgb2xkIGludGVyZmFjZS4KICAgICAgICBzcQB+AA8AAAACdwQAAAACdAAKc3lzL2ZpbGUuaHQAB3N0ZGlvLmh4cQB+CQt0AB5GSUxFICpzdHJlYW0sIGZwb3NfdCAqcG9zaXRpb250AANpbnR0AAlmZ2V0cG9zNjRzcQB+AAp0AbYKICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gPENPREU+ZmdldHBvczwvQ09ERT4gYnV0IHRoZSBmaWxlIHBvc2l0aW9uIGlzCiAgICAgICAgIHJldHVybmVkIGluIGEgdmFyaWFibGUgb2YgdHlwZSA8Q09ERT5mcG9zNjRfdDwvQ09ERT4gdG8gd2hpY2ggPFZBUj5wb3NpdGlvbjwvVkFSPgogICAgICAgICBwb2ludHMuCiAgICAgICAgIDxicj48YnI+IElmIHRoZSBzb3VyY2VzIGFyZSBjb21waWxlZCB3aXRoIDxDT0RFPl9GSUxFX09GRlNFVF9CSVRTID09IDY0PC9DT0RFPiBvbiBhIDMyCiAgICAgICAgIGJpdHMgbWFjaGluZSB0aGlzIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSB1bmRlciB0aGUgbmFtZSA8Q09ERT5mZ2V0cG9zPC9DT0RFPgogICAgICAgICBhbmQgc28gdHJhbnNwYXJlbnRseSByZXBsYWNlcyB0aGUgb2xkIGludGVyZmFjZS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHc3RkaW8uaHhxAH4JE3QAIEZJTEUgKnN0cmVhbSwgZnBvczY0X3QgKnBvc2l0aW9udAADaW50dAAJZmdldHB3ZW50c3EAfgAKdAHDCiAgICAgICAgVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgbmV4dCB1c2VyIGVudHJ5IGZyb20gPFZBUj5zdHJlYW08L1ZBUj4gYW5kIHJldHVybnMgYQogICAgICAgICBwb2ludGVyIHRvIHRoZSBlbnRyeS4gIFRoZSBzdHJ1Y3R1cmUgaXMgc3RhdGljYWxseSBhbGxvY2F0ZWQgYW5kIGlzCiAgICAgICAgIHJld3JpdHRlbiBvbiBzdWJzZXF1ZW50IGNhbGxzIHRvIDxDT0RFPmZnZXRwd2VudDwvQ09ERT4uICBZb3UgbXVzdCBjb3B5IHRoZQogICAgICAgICBjb250ZW50cyBvZiB0aGUgc3RydWN0dXJlIGlmIHlvdSB3aXNoIHRvIHNhdmUgdGhlIGluZm9ybWF0aW9uLgogICAgICAgICA8YnI+PGJyPiBUaGUgc3RyZWFtIG11c3QgY29ycmVzcG9uZCB0byBhIGZpbGUgaW4gdGhlIHNhbWUgZm9ybWF0IGFzIHRoZSBzdGFuZGFyZAogICAgICAgICBwYXNzd29yZCBkYXRhYmFzZSBmaWxlLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAVwd2QuaHhxAH4JGnQADEZJTEUgKnN0cmVhbXQAD3N0cnVjdCBwYXNzd2QgKnQAC2ZnZXRwd2VudF9yc3EAfgAKdANnCiAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIDxDT0RFPmZnZXRwd2VudDwvQ09ERT4gaW4gdGhhdCBpdCByZWFkcyB0aGUgbmV4dAogICAgICAgICB1c2VyIGVudHJ5IGZyb20gPFZBUj5zdHJlYW08L1ZBUj4uICBCdXQgdGhlIHJlc3VsdCBpcyByZXR1cm5lZCBpbiB0aGUKICAgICAgICAgc3RydWN0dXJlIHBvaW50ZWQgdG8gYnkgPFZBUj5yZXN1bHRfYnVmPC9WQVI+LiAgVGhlCiAgICAgICAgIGZpcnN0IDxWQVI+YnVmbGVuPC9WQVI+IGJ5dGVzIG9mIHRoZSBhZGRpdGlvbmFsIGJ1ZmZlciBwb2ludGVkIHRvIGJ5CiAgICAgICAgIDxWQVI+YnVmZmVyPC9WQVI+IGFyZSB1c2VkIHRvIGNvbnRhaW4gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiwgbm9ybWFsbHkKICAgICAgICAgc3RyaW5ncyB3aGljaCBhcmUgcG9pbnRlZCB0byBieSB0aGUgZWxlbWVudHMgb2YgdGhlIHJlc3VsdCBzdHJ1Y3R1cmUuCiAgICAgICAgIDxicj48YnI+IFRoZSBzdHJlYW0gbXVzdCBjb3JyZXNwb25kIHRvIGEgZmlsZSBpbiB0aGUgc2FtZSBmb3JtYXQgYXMgdGhlIHN0YW5kYXJkCiAgICAgICAgIHBhc3N3b3JkIGRhdGFiYXNlIGZpbGUuCiAgICAgICAgIDxicj48YnI+IElmIHRoZSBmdW5jdGlvbiByZXR1cm5zIHplcm8gPFZBUj5yZXN1bHQ8L1ZBUj4gcG9pbnRzIHRvIHRoZSBzdHJ1Y3R1cmUgd2l0aAogICAgICAgICB0aGUgd2FudGVkIGRhdGEgKG5vcm1hbGx5IHRoaXMgaXMgaW4gPFZBUj5yZXN1bHRfYnVmPC9WQVI+KS4gIElmIGVycm9ycwogICAgICAgICBvY2N1cnJlZCB0aGUgcmV0dXJuIHZhbHVlIGlzIG5vbnplcm8gYW5kIDxWQVI+cmVzdWx0PC9WQVI+IGNvbnRhaW5zIGEgbnVsbAogICAgICAgICBwb2ludGVyLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAVwd2QuaHhxAH4JIXQAXEZJTEUgKnN0cmVhbSwgc3RydWN0IHBhc3N3ZCAqcmVzdWx0X2J1ZiwgY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmbGVuLCBzdHJ1Y3QgcGFzc3dkICoqcmVzdWx0dAADaW50dAAFZmdldHNzcQB+AAp0BQEKICAgICAgICBUaGUgPENPREU+ZmdldHM8L0NPREU+IGZ1bmN0aW9uIHJlYWRzIGNoYXJhY3RlcnMgZnJvbSB0aGUgc3RyZWFtIDxWQVI+c3RyZWFtPC9WQVI+CiAgICAgICAgIHVwIHRvIGFuZCBpbmNsdWRpbmcgYSBuZXdsaW5lIGNoYXJhY3RlciBhbmQgc3RvcmVzIHRoZW0gaW4gdGhlIHN0cmluZwogICAgICAgICA8VkFSPnM8L1ZBUj4sIGFkZGluZyBhIG51bGwgY2hhcmFjdGVyIHRvIG1hcmsgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLiAgWW91CiAgICAgICAgIG11c3Qgc3VwcGx5IDxWQVI+Y291bnQ8L1ZBUj4gY2hhcmFjdGVycyB3b3J0aCBvZiBzcGFjZSBpbiA8VkFSPnM8L1ZBUj4sIGJ1dCB0aGUKICAgICAgICAgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZCBpcyBhdCBtb3N0IDxWQVI+Y291bnQ8L1ZBUj4gIDEuICBUaGUgZXh0cmEKICAgICAgICAgY2hhcmFjdGVyIHNwYWNlIGlzIHVzZWQgdG8gaG9sZCB0aGUgbnVsbCBjaGFyYWN0ZXIgYXQgdGhlIGVuZCBvZiB0aGUKICAgICAgICAgc3RyaW5nLgogICAgICAgICA8YnI+PGJyPiBJZiB0aGUgc3lzdGVtIGlzIGFscmVhZHkgYXQgZW5kIG9mIGZpbGUgd2hlbiB5b3UgY2FsbCA8Q09ERT5mZ2V0czwvQ09ERT4sIHRoZW4KICAgICAgICAgdGhlIGNvbnRlbnRzIG9mIHRoZSBhcnJheSA8VkFSPnM8L1ZBUj4gYXJlIHVuY2hhbmdlZCBhbmQgYSBudWxsIHBvaW50ZXIgaXMKICAgICAgICAgcmV0dXJuZWQuICBBIG51bGwgcG9pbnRlciBpcyBhbHNvIHJldHVybmVkIGlmIGEgcmVhZCBlcnJvciBvY2N1cnMuCiAgICAgICAgIE90aGVyd2lzZSwgdGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgcG9pbnRlciA8VkFSPnM8L1ZBUj4uCiAgICAgICAgIDxicj48YnI+IFdhcm5pbmc6ICBJZiB0aGUgaW5wdXQgZGF0YSBoYXMgYSBudWxsIGNoYXJhY3RlciwgeW91IGNhbid0IHRlbGwuCiAgICAgICAgIFNvIGRvbid0IHVzZSA8Q09ERT5mZ2V0czwvQ09ERT4gdW5sZXNzIHlvdSBrbm93IHRoZSBkYXRhIGNhbm5vdCBjb250YWluIGEgbnVsbC4KICAgICAgICAgRG9uJ3QgdXNlIGl0IHRvIHJlYWQgZmlsZXMgZWRpdGVkIGJ5IHRoZSB1c2VyIGJlY2F1c2UsIGlmIHRoZSB1c2VyIGluc2VydHMKICAgICAgICAgYSBudWxsIGNoYXJhY3RlciwgeW91IHNob3VsZCBlaXRoZXIgaGFuZGxlIGl0IHByb3Blcmx5IG9yIHByaW50IGEgY2xlYXIKICAgICAgICAgZXJyb3IgbWVzc2FnZS4gIFdlIHJlY29tbWVuZCB1c2luZyA8Q09ERT5nZXRsaW5lPC9DT0RFPiBpbnN0ZWFkIG9mIDxDT0RFPmZnZXRzPC9DT0RFPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHc3RkaW8uaHhxAH4JKHQAIGNoYXIgKnMsIGludCBjb3VudCwgRklMRSAqc3RyZWFtdAAGY2hhciAqdAAOZmdldHNfdW5sb2NrZWRzcQB+AAp0ANwKICAgICAgICBUaGUgPENPREU+ZmdldHNfdW5sb2NrZWQ8L0NPREU+IGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gdGhlIDxDT0RFPmZnZXRzPC9DT0RFPgogICAgICAgICBmdW5jdGlvbiBleGNlcHQgdGhhdCBpdCBkb2VzIG5vdCBpbXBsaWNpdGx5IGxvY2sgdGhlIHN0cmVhbS4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiBpcyBhIEdOVSBleHRlbnNpb24uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3N0ZGlvLmh4cQB+CS90ACBjaGFyICpzLCBpbnQgY291bnQsIEZJTEUgKnN0cmVhbXQABmNoYXIgKnQABmZnZXR3Y3NxAH4ACnQA4gogICAgICAgIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIG5leHQgd2lkZSBjaGFyYWN0ZXIgZnJvbSB0aGUgc3RyZWFtIDxWQVI+c3RyZWFtPC9WQVI+CiAgICAgICAgIGFuZCByZXR1cm5zIGl0cyB2YWx1ZS4gIElmIGFuIGVuZC1vZi1maWxlIGNvbmRpdGlvbiBvciByZWFkIGVycm9yCiAgICAgICAgIG9jY3VycywgPENPREU+V0VPRjwvQ09ERT4gaXMgcmV0dXJuZWQgaW5zdGVhZC4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHd2NoYXIuaHhxAH4JNnQADEZJTEUgKnN0cmVhbXQABndpbnRfdHQAD2ZnZXR3Y191bmxvY2tlZHNxAH4ACnQA3gogICAgICAgIFRoZSA8Q09ERT5mZ2V0d2NfdW5sb2NrZWQ8L0NPREU+IGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gdGhlIDxDT0RFPmZnZXR3YzwvQ09ERT4KICAgICAgICAgZnVuY3Rpb24gZXhjZXB0IHRoYXQgaXQgZG9lcyBub3QgaW1wbGljaXRseSBs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YmVyJycgdmFsdWUsIGFuZCB6ZXJvIG90aGVyd2lzZS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGbWF0aC5oeHEAfglgdAAIZG91YmxlIHh0AANpbnR0AAdmaW5pdGVmc3EAfgAKdACLCiAgICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgbm9uemVybyB2YWx1ZSBpZiA8VkFSPng8L1ZBUj4gaXMgZmluaXRlIG9yIGEgYGBub3QgYQogICAgICAgICBudW1iZXInJyB2YWx1ZSwgYW5kIHplcm8gb3RoZXJ3aXNlLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZtYXRoLmh4cQB+CWd0AAdmbG9hdCB4dAADaW50dAAHZmluaXRlbHNxAH4ACnQAiwogICAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIG5vbnplcm8gdmFsdWUgaWYgPFZBUj54PC9WQVI+IGlzIGZpbml0ZSBvciBhIGBgbm90IGEKICAgICAgICAgbnVtYmVyJycgdmFsdWUsIGFuZCB6ZXJvIG90aGVyd2lzZS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGbWF0aC5oeHEAfgludAANbG9uZyBkb3VibGUgeHQAA2ludHQACWZsb2NrZmlsZXNxAH4ACnQB5gogICAgICAgIFRoZSA8Q09ERT5mbG9ja2ZpbGU8L0NPREU+IGZ1bmN0aW9uIGFjcXVpcmVzIHRoZSBpbnRlcm5hbCBsb2NraW5nIG9iamVjdAogICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIHN0cmVhbSA8VkFSPnN0cmVhbTwvVkFSPi4gIFRoaXMgZW5zdXJlcyB0aGF0IG5vIG90aGVyCiAgICAgICAgIHRocmVhZCBjYW4gZXhwbGljaXRseSB0aHJvdWdoIDxDT0RFPmZsb2NrZmlsZTwvQ09ERT4vPENPREU+ZnRyeWxvY2tmaWxlPC9DT0RFPiBvcgogICAgICAgICBpbXBsaWNpdCB0aHJvdWdoIGEgY2FsbCBvZiBhIHN0cmVhbSBmdW5jdGlvbiBsb2NrIHRoZSBzdHJlYW0uICBUaGUKICAgICAgICAgdGhyZWFkIHdpbGwgYmxvY2sgdW50aWwgdGhlIGxvY2sgaXMgYWNxdWlyZWQuICBBbiBleHBsaWNpdCBjYWxsIHRvCiAgICAgICAgIDxDT0RFPmZ1bmxvY2tmaWxlPC9DT0RFPiBoYXMgdG8gYmUgdXNlZCB0byByZWxlYXNlIHRoZSBsb2NrLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAdzdGRpby5oeHEAfgl1dAAMRklMRSAqc3RyZWFtdAAEdm9pZHQABWZsb29yc3EAfgAKdAD/CiAgICAgICAgVGhlc2UgZnVuY3Rpb25zIHJvdW5kIDxWQVI+eDwvVkFSPiBkb3dud2FyZHMgdG8gdGhlIG5lYXJlc3QKICAgICAgICAgaW50ZWdlciwgcmV0dXJuaW5nIHRoYXQgdmFsdWUgYXMgYSA8Q09ERT5kb3VibGU8L0NPREU+LiAgVGh1cywgPENPREU+Zmxvb3IKICAgICAgICAgKDEuNSk8L0NPREU+IGlzIDxDT0RFPjEuMDwvQ09ERT4gYW5kIDxDT0RFPmZsb29yICgtMS41KTwvQ09ERT4gaXMgPENPREU+LTIuMDwvQ09ERT4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQABm1hdGguaHhxAH4JfHQACGRvdWJsZSB4dAAGZG91YmxldAAGZmxvb3Jmc3EAfgAKdAD/CiAgICAgICAgVGhlc2UgZnVuY3Rpb25zIHJvdW5kIDxWQVI+eDwvVkFSPiBkb3dud2FyZHMgdG8gdGhlIG5lYXJlc3QKICAgICAgICAgaW50ZWdlciwgcmV0dXJuaW5nIHRoYXQgdmFsdWUgYXMgYSA8Q09ERT5kb3VibGU8L0NPREU+LiAgVGh1cywgPENPREU+Zmxvb3IKICAgICAgICAgKDEuNSk8L0NPREU+IGlzIDxDT0RFPjEuMDwvQ09ERT4gYW5kIDxDT0RFPmZsb29yICgtMS41KTwvQ09ERT4gaXMgPENPREU+LTIuMDwvQ09ERT4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQABm1hdGguaHhxAH4Jg3QAB2Zsb2F0IHh0AAVmbG9hdHQABmZsb29ybHNxAH4ACnQA/wogICAgICAgIFRoZXNlIGZ1bmN0aW9ucyByb3VuZCA8VkFSPng8L1ZBUj4gZG93bndhcmRzIHRvIHRoZSBuZWFyZXN0CiAgICAgICAgIGludGVnZXIsIHJldHVybmluZyB0aGF0IHZhbHVlIGFzIGEgPENPREU+ZG91YmxlPC9DT0RFPi4gIFRodXMsIDxDT0RFPmZsb29yCiAgICAgICAgICgxLjUpPC9DT0RFPiBpcyA8Q09ERT4xLjA8L0NPREU+IGFuZCA8Q09ERT5mbG9vciAoLTEuNSk8L0NPREU+IGlzIDxDT0RFPi0yLjA8L0NPREU+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZtYXRoLmh4cQB+CYp0AA1sb25nIGRvdWJsZSB4dAALbG9uZyBkb3VibGV0AANmbWFzcQB+AAp0BKoKCiAgICAgICAgIFRoZSA8Q09ERT5mbWE8L0NPREU+IGZ1bmN0aW9uIHBlcmZvcm1zIGZsb2F0aW5nLXBvaW50IG11bHRpcGx5LWFkZC4gIFRoaXMgaXMKICAgICAgICAgdGhlIG9wZXJhdGlvbiAoPFZBUj54PC9WQVI+ICA8VkFSPnk8L1ZBUj4pICsgPFZBUj56PC9WQVI+LCBidXQgdGhlCiAgICAgICAgIGludGVybWVkaWF0ZSByZXN1bHQgaXMgbm90IHJvdW5kZWQgdG8gdGhlIGRlc3RpbmF0aW9uIHR5cGUuICBUaGlzIGNhbgogICAgICAgICBzb21ldGltZXMgaW1wcm92ZSB0aGUgcHJlY2lzaW9uIG9mIGEgY2FsY3VsYXRpb24uCiAgICAgICAgIDxicj48YnI+IFRoaXMgZnVuY3Rpb24gd2FzIGludHJvZHVjZWQgYmVjYXVzZSBzb21lIHByb2Nlc3NvcnMgaGF2ZSBhIHNwZWNpYWwKICAgICAgICAgaW5zdHJ1Y3Rpb24gdG8gcGVyZm9ybSBtdWx0aXBseS1hZGQuICBUaGUgQyBjb21waWxlciBjYW5ub3QgdXNlIGl0CiAgICAgICAgIGRpcmVjdGx5LCBiZWNhdXNlIHRoZSBleHByZXNzaW9uIDxzYW1wPngqeSArIHo8L3NhbXA+IGlzIGRlZmluZWQgdG8gcm91bmQgdGhlCiAgICAgICAgIGludGVybWVkaWF0ZSByZXN1bHQuICA8Q09ERT5mbWE8L0NPREU+IGxldHMgeW91IGNob29zZSB3aGVuIHlvdSB3YW50IHRvIHJvdW5kCiAgICAgICAgIG9ubHkgb25jZS4KICAgICAgICAgPGJyPjxicj4KICAgICAgICAgT24gcHJvY2Vzc29ycyB3aGljaCBkbyBub3QgaW1wbGVtZW50IG11bHRpcGx5LWFkZCBpbiBoYXJkd2FyZSwKICAgICAgICAgPENPREU+Zm1hPC9DT0RFPiBjYW4gYmUgdmVyeSBzbG93IHNpbmNlIGl0IG11c3QgYXZvaWQgaW50ZXJtZWRpYXRlIHJvdW5kaW5nLgogICAgICAgICA8VFQ+bWF0aC5oPC9UVD4gZGVmaW5lcyB0aGUgc3ltYm9scyA8Q09ERT5GUF9GQVNUX0ZNQTwvQ09ERT4sCiAgICAgICAgIDxDT0RFPkZQX0ZBU1RfRk1BRjwvQ09ERT4sIGFuZCA8Q09ERT5GUF9GQVNUX0ZNQUw8L0NPREU+IHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcKICAgICAgICAgdmVyc2lvbiBvZiA8Q09ERT5mbWE8L0NPREU+IGlzIG5vIHNsb3dlciB0aGFuIHRoZSBleHByZXNzaW9uIDxzYW1wPngqeSArIHo8L3NhbXA+LgogICAgICAgICBJbiB0aGUgR05VIEMgbGlicmFyeSwgdGhpcyBhbHdheXMgbWVhbnMgdGhlIG9wZXJhdGlvbiBpcyBpbXBsZW1lbnRlZCBpbgogICAgICAgICBoYXJkd2FyZS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGbWF0aC5oeHEAfgmRdAAcZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgenQABmRvdWJsZXQABGZtYWZzcQB+AAp0BKoKCiAgICAgICAgIFRoZSA8Q09ERT5mbWE8L0NPREU+IGZ1bmN0aW9uIHBlcmZvcm1zIGZsb2F0aW5nLXBvaW50IG11bHRpcGx5LWFkZC4gIFRoaXMgaXMKICAgICAgICAgdGhlIG9wZXJhdGlvbiAoPFZBUj54PC9WQVI+ICA8VkFSPnk8L1ZBUj4pICsgPFZBUj56PC9WQVI+LCBidXQgdGhlCiAgICAgICAgIGludGVybWVkaWF0ZSByZXN1bHQgaXMgbm90IHJvdW5kZWQgdG8gdGhlIGRlc3RpbmF0aW9uIHR5cGUuICBUaGlzIGNhbgogICAgICAgICBzb21ldGltZXMgaW1wcm92ZSB0aGUgcHJlY2lzaW9uIG9mIGEgY2FsY3VsYXRpb24uCiAgICAgICAgIDxicj48YnI+IFRoaXMgZnVuY3Rpb24gd2FzIGludHJvZHVjZWQgYmVjYXVzZSBzb21lIHByb2Nlc3NvcnMgaGF2ZSBhIHNwZWNpYWwKICAgICAgICAgaW5zdHJ1Y3Rpb24gdG8gcGVyZm9ybSBtdWx0aXBseS1hZGQuICBUaGUgQyBjb21waWxlciBjYW5ub3QgdXNlIGl0CiAgICAgICAgIGRpcmVjdGx5LCBiZWNhdXNlIHRoZSBleHByZXNzaW9uIDxzYW1wPngqeSArIHo8L3NhbXA+IGlzIGRlZmluZWQgdG8gcm91bmQgdGhlCiAgICAgICAgIGludGVybWVkaWF0ZSByZXN1bHQuICA8Q09ERT5mbWE8L0NPREU+IGxldHMgeW91IGNob29zZSB3aGVuIHlvdSB3YW50IHRvIHJvdW5kCiAgICAgICAgIG9ubHkgb25jZS4KICAgICAgICAgPGJyPjxicj4KICAgICAgICAgT24gcHJvY2Vzc29ycyB3aGljaCBkbyBub3QgaW1wbGVtZW50IG11bHRpcGx5LWFkZCBpbiBoYXJkd2FyZSwKICAgICAgICAgPENPREU+Zm1hPC9DT0RFPiBjYW4gYmUgdmVyeSBzbG93IHNpbmNlIGl0IG11c3QgYXZvaWQgaW50ZXJtZWRpYXRlIHJvdW5kaW5nLgogICAgICAgICA8VFQ+bWF0aC5oPC9UVD4gZGVmaW5lcyB0aGUgc3ltYm9scyA8Q09ERT5GUF9GQVNUX0ZNQTwvQ09ERT4sCiAgICAgICAgIDxDT0RFPkZQX0ZBU1RfRk1BRjwvQ09ERT4sIGFuZCA8Q09ERT5GUF9GQVNUX0ZNQUw8L0NPREU+IHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcKICAgICAgICAgdmVyc2lvbiBvZiA8Q09ERT5mbWE8L0NPREU+IGlzIG5vIHNsb3dlciB0aGFuIHRoZSBleHByZXNzaW9uIDxzYW1wPngqeSArIHo8L3NhbXA+LgogICAgICAgICBJbiB0aGUgR05VIEMgbGlicmFyeSwgdGhpcyBhbHdheXMgbWVhbnMgdGhlIG9wZXJhdGlvbiBpcyBpbXBsZW1l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IDxicj48YnI+IElmIHlvdSBzcGVjaWZ5IGEgbnVsbCBwb2ludGVyIGFzIHRoZSA8VkFSPmJ1ZjwvVkFSPiBhcmd1bWVudCwgPENPREU+Zm1lbW9wZW48L0NPREU+CiAgICAgICAgIGR5bmFtaWNhbGx5IGFsbG9jYXRlcyBhbiBhcnJheSA8VkFSPnNpemU8L1ZBUj4gYnl0ZXMgbG9uZyAoYXMgd2l0aCA8Q09ERT5tYWxsb2M8L0NPREU+OwogICAgICAgICApLiAgVGhpcyBpcyByZWFsbHkgb25seSB1c2VmdWwKICAgICAgICAgaWYgeW91IGFyZSBnb2luZyB0byB3cml0ZSB0aGluZ3MgdG8gdGhlIGJ1ZmZlciBhbmQgdGhlbiByZWFkIHRoZW0gYmFjawogICAgICAgICBpbiBhZ2FpbiwgYmVjYXVzZSB5b3UgaGF2ZSBubyB3YXkgb2YgYWN0dWFsbHkgZ2V0dGluZyBhIHBvaW50ZXIgdG8gdGhlCiAgICAgICAgIGJ1ZmZlciAoZm9yIHRoaXMsIHRyeSA8Q09ERT5vcGVuX21lbXN0cmVhbTwvQ09ERT4sIGJlbG93KS4gIFRoZSBidWZmZXIgaXMKICAgICAgICAgZnJlZWQgd2hlbiB0aGUgc3RyZWFtIGlzIGNsb3NlZC4KICAgICAgICAgPGJyPjxicj4gVGhlIGFyZ3VtZW50IDxWQVI+b3BlbnR5cGU8L1ZBUj4gaXMgdGhlIHNhbWUgYXMgaW4gPENPREU+Zm9wZW48L0NPREU+CiAgICAgICAgIC4gIElmIHRoZSA8VkFSPm9wZW50eXBlPC9WQVI+IHNwZWNpZmllcwogICAgICAgICBhcHBlbmQgbW9kZSwgdGhlbiB0aGUgaW5pdGlhbCBmaWxlIHBvc2l0aW9uIGlzIHNldCB0byB0aGUgZmlyc3QgbnVsbAogICAgICAgICBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlci4gIE90aGVyd2lzZSB0aGUgaW5pdGlhbCBmaWxlIHBvc2l0aW9uIGlzIGF0IHRoZQogICAgICAgICBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlci4KICAgICAgICAgPGJyPjxicj4gV2hlbiBhIHN0cmVhbSBvcGVuIGZvciB3cml0aW5nIGlzIGZs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ZXNjcmliZXMgdGhlIGNvbmRpdGlvbiBvZiB0aGUgZXJyb3IsIHRoZSA8VkFSPmFjdGlvbjwvVkFSPiBwYXJhbWV0ZXIgcG9zc2libGUKICAgICAgICAgc3RlcHMgdG8gcmVjb3ZlciBmcm9tIHRoZSBlcnJvciBhbmQgdGhlIDxWQVI+dGFnPC9WQVI+IHBhcmFtZXRlciBpcyBhCiAgICAgICAgIHJlZmVyZW5jZSB0byB0aGUgb25saW5lIGRvY3VtZW50YXRpb24gd2hlcmUgbW9yZSBpbmZvcm1hdGlvbiBjYW4gYmUKICAgICAgICAgZm91bmQuICBJdCBzaG91bGQgY29udGFpbiB0aGUgPFZBUj5sYWJlbDwvVkFSPiB2YWx1ZSBhbmQgYSB1bmlxdWUKICAgICAgICAgaWRlbnRpZmljYXRpb24gbnVtYmVyLgogICAgICAgICA8YnI+PGJyPiBFYWNoIG9mIHRoZSBwYXJhbWV0ZXJzIGNhbiBiZSBhIHNwZWNpYWwgdmFsdWUgd2hpY2ggbWVhbnMgdGhpcyB2YWx1ZQogICAgICAgICBpcyB0byBiZSBvbWl0dGVkLiAgVGhlIHN5bWJvbGljIG5hbWVzIGZvciB0aGVzZSB2YWx1ZXMgYXJlOgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8RFQ+PENPREU+TU1fTlVMTExCTDwvQ09ERT4KPEREPgogICAgICAgICBJZ25vcmUgPFZBUj5sYWJlbDwvVkFSPiBwYXJhbWV0ZXIuCiAgICAgICAgIDxEVD48Q09ERT5NTV9OVUxMU0VWPC9DT0RFPgo8REQ+CiAgICAgICAgIElnbm9yZSA8VkFSPnNldmVyaXR5PC9WQVI+IHBhcmFtZXRlci4KICAgICAgICAgPERUPjxDT0RFPk1NX05VTExNQzwvQ09ERT4KPEREPgogICAgICAgICBJZ25vcmUgPFZBUj5jbGFzc2lmaWNhdGlvbjwvVkFSPiBwYXJhbWV0ZXIuICBUaGlzIGltcGxpZXMgdGhhdCBub3RoaW5nIGlzCiAgICAgICAgIGFjdHVhbGx5IHByaW50ZWQuCiAgICAgICAgIDxEVD48Q09ERT5NTV9OVUxMVFhUPC9DT0RFPgo8REQ+CiAgICAgICAgIElnbm9yZSA8VkFSPnRleHQ8L1ZBUj4gcGFyYW1ldGVyLgogICAgICAgICA8RFQ+PENPREU+TU1fTlVMTEFDVDwvQ09ERT4KPEREPgogICAgICAgICBJZ25vcmUgPFZBUj5hY3Rpb248L1ZBUj4gcGFyYW1ldGVyLgogICAgICAgICA8RFQ+PENPREU+TU1fTlVMTFRBRzwvQ09ERT4KPEREPgogICAgICAgICBJZ25vcmUgPFZBUj50YWc8L1ZBUj4gcGFyYW1ldGVyLgogICAgICAgICA8L0RMPgogICAgICAgICA8YnI+PGJyPiBUaGVyZSBpcyBhbm90aGVyIHdheSBjZXJ0YWluIGZpZWxkcyBjYW4gYmUgb21pdHRlZCBmcm9tIHRoZSBvdXRwdXQgdG8KICAgICAgICAgc3RhbmRhcmQgZXJyb3IuICBUaGlzIGlzIGRlc2NyaWJlZCBiZWxvdyBpbiB0aGUgZGVzY3JpcHRpb24gb2YKICAgICAgICAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGluZmx1ZW5jaW5nIHRoZSBiZWhhdmlvci4KICAgICAgICAgPGJyPjxicj4gVGhlIDxWQVI+c2V2ZXJpdHk8L1ZBUj4gcGFyYW1ldGVyIGNhbiBoYXZlIG9uZSBvZiB0aGUgdmFsdWVzIGluIHRoZSBmb2xsb3dpbmcKICAgICAgICAgdGFibGU6CiAgICAgICAgICBjbGFzcwogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8RFQ+PENPREU+TU1fTk9TRVY8L0NPREU+CjxERD4KICAgICAgICAgTm90aGluZyBpcyBwcmludGVkLCB0aGlzIHZhbHVlIGlzIHRoZSBzYW1lIGFzIDxDT0RFPk1NX05VTExTRVY8L0NPREU+LgogICAgICAgICA8RFQ+PENPREU+TU1fSEFMVDwvQ09ERT4KPEREPgogICAgICAgICBUaGlzIHZhbHVlIGlzIHByaW50ZWQgYXMgPENPREU+SEFMVDwvQ09ERT4uCiAgICAgICAgIDxEVD48Q09ERT5NTV9FUlJPUjwvQ09ERT4KPEREPgogICAgICAgICBUaGlzIHZhbHVlIGlzIHByaW50ZWQgYXMgPENPREU+RVJST1I8L0NPREU+LgogICAgICAgICA8RFQ+PENPREU+TU1fV0FSTklORzwvQ09ERT4KPEREPgogICAgICAgICBUaGlzIHZhbHVlIGlzIHByaW50ZWQgYXMgPENPREU+V0FSTklORzwvQ09ERT4uCiAgICAgICAgIDxEVD48Q09ERT5NTV9JTkZPPC9DT0RFPgo8REQ+CiAgICAgICAgIFRoaXMgdmFsdWUgaXMgcHJpbnRlZCBhcyA8Q09ERT5JTkZPPC9DT0RFPi4KICAgICAgICAgPC9ETD4KICAgICAgICAgPGJyPjxicj4gVGhlIG51bWVyaWMgdmFsdWUgb2YgdGhlc2UgZml2ZSBtYWNyb3MgYXJlIGJldHdlZW4gPENPREU+MDwvQ09ERT4gYW5kCiAgICAgICAgIDxDT0RFPjQ8L0NPREU+LiAgVXNpbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIDxDT0RFPlNFVl9MRVZFTDwvQ09ERT4gb3IgdXNpbmcgdGhlCiAgICAgICAgIDxDT0RFPmFkZHNldmVyaXR5PC9DT0RFPiBmdW5jdGlvbiBvbmUgY2FuIGFkZCBtb3JlIHNldmVyaXR5IGxldmVscyB3aXRoIHRoZWlyCiAgICAgICAgIGNvcnJlc3BvbmRpbmcgc3RyaW5nIHRvIHByaW50LiAgVGhpcyBpcyBkZXNjcmliZWQgYmVsb3cKICAgICAgICAgLgogICAgICAgICA8YnI+PGJyPgogICAgICAgICBJZiBubyBwYXJhbWV0ZXIgaXMgaWdub3JlZCB0aGUgb3V0cHV0IGxvb2tzIGxpa2UgdGhpczoKICAgICAgICAgPGJyPjxicj4gPHByZT48YnI+CiAgICAgICAgIDxWQVI+bGFiZWw8L1ZBUj46IDxWQVI+c2V2ZXJpdHktc3RyaW5nPC9WQVI+OiA8VkFSPnRleHQ8L1ZBUj48YnI+CiAgICAgICAgIFRPIEZJWDogPFZBUj5hY3Rpb248L1ZBUj4gPFZBUj50YWc8L1ZBUj48YnI+CiAgICAgICAgIDwvcHJlPgogICAgICAgICA8YnI+PGJyPiBUaGUgY29sb25zLCBuZXcgbGluZSBjaGFyYWN0ZXJzIGFuZCB0aGUgPENPREU+VE8gRklYPC9DT0RFPiBzdHJpbmcgYXJlCiAgICAgICAgIGluc2VydGVkIGlmIG5lY2Vzc2FyeSwgaS5lLiwgaWYgdGhlIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVyIGlzIG5vdAogICAgICAgICBpZ25vcmVkLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIGlzIHNwZWNpZmllZCBpbiB0aGUgWC9PcGVuIFBvcnRhYmlsaXR5IEd1aWRlLiAgSXQgaXMgYWxzbwogICAgICAgICBhdmFpbGFibGUgb24gYWxsIHN5c3RlbXMgZGVyaXZlZCBmcm9tIFN5c3RlbSBWLgogICAgICAgICA8YnI+PGJyPiBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgdmFsdWUgPENPREU+TU1fT0s8L0NPREU+IGlmIG5vIGVycm9yIG9jY3VycmVkLiAgSWYKICAgICAgICAgb25seSB0aGUgcHJpbnRpbmcgdG8gc3RhbmRhcmQgZXJyb3IgZmFpbGVkLCBpdCByZXR1cm5zIDxDT0RFPk1NX05PTVNHPC9DT0RFPi4KICAgICAgICAgSWYgcHJpbnRpbmcgdG8gdGhlIGNvbnNvbGUgZmFpbHMsIGl0IHJldHVybnMgPENPREU+TU1fTk9DT048L0NPREU+LiAgSWYKICAgICAgICAgbm90aGluZyBpcyBwcmludGVkIDxDT0RFPk1NX05PVE9LPC9DT0RFPiBpcyByZXR1cm5lZC4gIEFtb25nIHNpdHVhdGlvbnMgd2hlcmUKICAgICAgICAgYWxsIG91dHB1dHMgZmFpbCB0aGlzIGxhc3QgdmFsdWUgaXMgYWxzbyByZXR1cm5lZCBpZiBhIHBhcmFtZXRlciB2YWx1ZQogICAgICAgICBpcyBpbmNvcnJlY3QuCiAgICAgICAgc3EAfgAPAAAAAncEAAAAAnQAB3N0ZGlvLmh0AAhmbXRtc2cuaHhxAH4J7HQAb2xvbmcgaW50IGNsYXNzaWZpY2F0aW9uLCBjb25zdCBjaGFyICpsYWJlbCwgaW50IHNldmVyaXR5LCBjb25zdCBjaGFyICp0ZXh0LCBjb25zdCBjaGFyICphY3Rpb24sIGNvbnN0IGNoYXIgKnRhZ3QAA2ludHQAB2ZubWF0Y2hzcQB+AAp0A2MKICAgICAgICBUaGlzIGZ1bmN0aW9uIHRlc3RzIHdoZXRoZXIgdGhlIHN0cmluZyA8VkFSPnN0cmluZzwvVkFSPiBtYXRjaGVzIHRoZSBwYXR0ZXJuCiAgICAgICAgIDxWQVI+cGF0dGVybjwvVkFSPi4gIEl0IHJldHVybnMgPENPREU+MDwvQ09ERT4gaWYgdGhleSBkbyBtYXRjaDsgb3RoZXJ3aXNlLCBpdAogICAgICAgICByZXR1cm5zIHRoZSBub256ZXJvIHZhbHVlIDxDT0RFPkZOTV9OT01BVENIPC9DT0RFPi4gIFRoZSBhcmd1bWVudHMKICAgICAgICAgPFZBUj5wYXR0ZXJuPC9WQVI+IGFuZCA8VkFSPnN0cmluZzwvVkFSPiBhcmUgYm90aCBzdHJpbmdzLgogICAgICAgICA8YnI+PGJyPiBUaGUgYXJndW1lbnQgPFZBUj5mbGFnczwvVkFSPiBpcyBhIGNvbWJpbmF0aW9uIG9mIGZsYWcgYml0cyB0aGF0IGFsdGVyIHRoZQogICAgICAgICBkZXRhaWxzIG9mIG1hdGNoaW5nLiAgU2VlIGJlbG93IGZvciBhIGxpc3Qgb2YgdGhlIGRlZmluZWQgZmxhZ3MuCiAgICAgICAgIDxicj48YnI+IEluIHRoZSBHTlUgQyBMaWJyYXJ5LCA8Q09ERT5mbm1hdGNoPC9DT0RFPiBjYW5ub3QgZXhwZXJpZW5jZSBhbiBgYGVycm9yJyctLS1pdAogICAgICAgICBhbHdheXMgcmV0dXJucyBhbiBhbnN3ZXIgZm9yIHdoZXRoZXIgdGhlIG1hdGNoIHN1Y2NlZWRzLiAgSG93ZXZlciwgb3RoZXIKICAgICAgICAgaW1wbGVtZW50YXRpb25zIG9mIDxDT0RFPmZubWF0Y2g8L0NPREU+IG1pZ2h0IHNvbWV0aW1lcyByZXBvcnQgYGBlcnJvcnMnJy4KICAgICAgICAgVGhleSB3b3VsZCBkbyBzbyBieSByZXR1cm5pbmcgbm9uemVybyB2YWx1ZXMgdGhhdCBhcmUgbm90IGVxdWFsIHRvCiAgICAgICAgIDxDT0RFPkZOTV9OT01BVENIPC9DT0RFPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAJZm5tYXRjaC5oeHEAfgn0dAAyY29uc3QgY2hhciAqcGF0dGVybiwgY29uc3QgY2hhciAqc3RyaW5nLCBpbnQgZmxhZ3N0AANpbnR0AAVmb3BlbnNxAH4ACnQSNwogICAgICAgIFRoZSA8Q09ERT5mb3BlbjwvQ09ERT4gZnVuY3Rpb24gb3BlbnMgYSBzdHJlYW0gZm9yIEkvTyB0byB0aGUgZmlsZQogICAgICAgICA8VkFSPmZpbGVuYW1lPC9WQVI+LCBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHN0cmVhbS4KICAgICAgICAgPGJyPjxicj4gVGhlIDxWQVI+b3BlbnR5cGU8L1ZBUj4gYXJndW1lbnQgaXMgYSBzdHJpbmcgdGhhdCBjb250cm9scyBob3cgdGhlIGZpbGUgaXMKICAgICAgICAgb3BlbmVkIGFuZCBzcGVjaWZpZXMgYXR0cmlidXRlcyBvZiB0aGUgcmVzdWx0aW5nIHN0cmVhbS4gIEl0IG11c3QgYmVnaW4KICAgICAgICAgd2l0aCBvbmUgb2YgdGhlIGZvbGxvd2luZyBzZXF1ZW5jZXMgb2YgY2hhcmFjdGVyczoKICAgICAgICAgPGJyPjxicj4gPERMPgoKICAgICAgICAgPERUPjxTQU1QPnI8L1NBTVA+CjxERD4KICAgICAgICAgT3BlbiBhbiBleGlzdGluZyBmaWxlIGZvciByZWFkaW5nIG9ubHkuCiAgICAgICAgIDxicj48YnI+IDxEVD48U0FNUD53PC9TQU1QPgo8REQ+CiAgICAgICAgIE9wZW4gdGhlIGZpbGUgZm9yIHdyaXRpbmcgb25seS4gIElmIHRoZSBmaWxlIGFscmVhZHkgZXhpc3RzLCBpdCBpcwogICAgICAgICB0cnVuY2F0ZWQgdG8gemVybyBsZW5ndGguICBPdGhlcndpc2UgYSBuZXcgZmlsZSBpcyBjcmVhdGVkLgogICAgICAgICA8YnI+PGJyPiA8RFQ+PFNBTVA+YTwvU0FNUD4KPEREPgogICAgICAgICBPcGVuIGEgZmlsZSBmb3IgYXBwZW5kIGFjY2VzczsgdGhhdCBpcywgd3JpdGluZyBhdCB0aGUgZW5kIG9mIGZpbGUgb25seS4KICAgICAgICAgSWYgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHMsIGl0cyBpbml0aWFsIGNvbnRlbnRzIGFyZSB1bmNoYW5nZWQgYW5kCiAgICAgICAgIG91dHB1dCB0byB0aGUgc3RyZWFtIGlzIGFwcGVuZGVkIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUuCiAgICAgICAgIE90aGVyd2lzZSwgYSBuZXcsIGVtcHR5IGZpbGUgaXMgY3JlYXRlZC4KICAgICAgICAgPGJyPjxicj4gPERUPjxTQU1QPnIrPC9TQU1QPgo8REQ+CiAgICAgICAgIE9wZW4gYW4gZXhpc3RpbmcgZmlsZSBmb3IgYm90aCByZWFkaW5nIGFuZCB3cml0aW5nLiAgVGhlIGluaXRpYWwgY29udGVudHMKICAgICAgICAgb2YgdGhlIGZpbGUgYXJlIHVuY2hhbmdlZCBhbmQgdGhlIGluaXRpYWwgZmlsZSBwb3NpdGlvbiBpcyBhdCB0aGUKICAgICAgICAgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLgogICAgICAgICA8YnI+PGJyPiA8RFQ+PFNBTVA+dys8L1NBTVA+CjxERD4KICAgICAgICAgT3BlbiBhIGZpbGUgZm9yIGJvdGggcmVhZGluZyBhbmQgd3JpdGluZy4gIElmIHRoZSBmaWxlIGFscmVhZHkgZXhpc3RzLCBpdAogICAgICAgICBpcyB0cnVuY2F0ZWQgdG8gemVybyBsZW5ndGguICBPdGhlcndpc2UsIGEgbmV3IGZpbGUgaXMgY3JlYXRlZC4KICAgICAgICAgPGJyPjxicj4gPERUPjxTQU1QPmErPC9TQU1QPgo8REQ+CiAgICAgICAgIE9wZW4gb3IgY3JlYXRlIGZpbGUgZm9yIGJvdGggcmVhZGluZyBhbmQgYXBwZW5kaW5nLiAgSWYgdGhlIGZpbGUgZXhpc3RzLAogICAgICAgICBpdHMgaW5pdGlhbCBjb250ZW50cyBhcmUgdW5jaGFuZ2VkLiAgT3RoZXJ3aXNlLCBhIG5ldyBmaWxlIGlzIGNyZWF0ZWQuCiAgICAgICAgIFRoZSBpbml0aWFsIGZpbGUgcG9zaXRpb24gZm9yIHJlYWRpbmcgaXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSwKICAgICAgICAgYnV0IG91dHB1dCBpcyBhbHdheXMgYXBwZW5kZWQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZS4KICAgICAgICAgPC9ETD4KICAgICAgICAgPGJyPjxicj4gQXMgeW91IGNhbiBzZWUsIDxzYW1wPis8L3NhbXA+IHJlcXVlc3RzIGEgc3RyZWFtIHRoYXQgY2FuIGRvIGJvdGggaW5wdXQgYW5kCiAgICAgICAgIG91dHB1dC4gIFdoZW4gdXNpbmcgc3VjaCBhIHN0cmVhbSwgeW91IG11c3QgY2FsbCA8Q09ERT5mZmx1c2g8L0NPREU+CiAgICAgICAgICBvciBhIGZpbGUgcG9zaXRpb25pbmcgZnVuY3Rpb24gc3VjaCBhcwogICAgICAgICA8Q09ERT5mc2VlazwvQ09ERT4gIHdoZW4gc3dpdGNoaW5nIGZyb20gcmVhZGluZwogICAgICAgICB0byB3cml0aW5nIG9yIHZpY2UgdmVyc2EuICBPdGhlcndpc2UsIGludGVybmFsIGJ1ZmZlcnMgbWlnaHQgbm90IGJlCiAgICAgICAgIGVtcHRpZWQgcHJvcGVybHkuCiAgICAgICAgIDxicj48YnI+IEFkZGl0aW9uYWwgY2hhcmFjdGVycyBtYXkgYXBwZWFyIGFmdGVyIHRoZXNlIHRvIHNwZWNpZnkgZmxhZ3MgZm9yIHRoZQogICAgICAgICBjYWxsLiAgQWx3YXlzIHB1dCB0aGUgbW9kZSAoPHNhbXA+cjwvc2FtcD4sIDxzYW1wPncrPC9zYW1wPiwgZXRjLikgZmlyc3Q7IHRoYXQgaXMKICAgICAgICAgdGhlIG9ubHkgcGFydCB5b3UgYXJlIGd1YXJhbnRlZWQgd2lsbCBiZSB1bmRlcnN0b29kIGJ5IGFsbCBzeXN0ZW1zLgogICAgICAgICA8YnI+PGJyPiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIG9uZSBhZGRpdGlvbmFsIGNoYXJhY3RlciBmb3IgdXNlIGluCiAgICAgICAgIDxWQVI+b3BlbnR5cGU8L1ZBUj46IHRoZSBjaGFyYWN0ZXIgPHNhbXA+eDwvc2FtcD4gaW5zaXN0cyBvbiBjcmVhdGluZyBhIG5ldwogICAgICAgICBmaWxlLS0taWYgYSBmaWxlIDxWQVI+ZmlsZW5hbWU8L1ZBUj4gYWxyZWFkeSBleGlzdHMsIDxDT0RFPmZvcGVuPC9DT0RFPiBmYWlscwogICAgICAgICByYXRoZXIgdGhhbiBvcGVuaW5nIGl0LiAgSWYgeW91IHVzZSA8c2FtcD54PC9zYW1wPiB5b3UgYXJlIGd1YXJhbnRlZWQgdGhhdAogICAgICAgICB5b3Ugd2lsbCBub3QgY2xvYmJlciBhbiBleGlzdGluZyBmaWxlLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZQogICAgICAgICA8Q09ERT5PX0VYQ0w8L0NPREU+IG9wdGlvbiB0byB0aGUgPENPREU+b3BlbjwvQ09ERT4gZnVuY3Rpb24gLgogICAgICAgICA8YnI+PGJyPiBUaGUgY2hhcmFjdGVyIDxzYW1wPmI8L3NhbXA+IGluIDxWQVI+b3BlbnR5cGU8L1ZBUj4gaGFzIGEgc3RhbmRhcmQgbWVhbmluZzsgaXQKICAgICAgICAgcmVxdWVzdHMgYSBiaW5hcnkgc3RyZWFtIHJhdGhlciB0aGFuIGEgdGV4dCBzdHJlYW0uICBCdXQgdGhpcyBtYWtlcyBubwogICAgICAgICBkaWZmZXJlbmNlIGluIFBPU0lYIHN5c3RlbXMgKGluY2x1ZGluZyB0aGUgR05VIHN5c3RlbSkuICBJZiBib3RoCiAgICAgICAgIDxzYW1wPis8L3NhbXA+IGFuZCA8c2FtcD5iPC9zYW1wPiBhcmUgc3BlY2lmaWVkLCB0aGV5IGNhbiBhcHBlYXIgaW4gZWl0aGVyIG9yZGVyLgogICAgICAgICAuCiAgICAgICAgIDxicj48YnI+ICBvcmllbnRhdGlvbgogICAgICAgICAsIHN0cmVhbQogICAgICAgICBJZiB0aGUgPFZBUj5vcGVudHlwZTwvVkFSPiBzdHJpbmcgY29udGFpbnMgdGhlIHNlcXVlbmNlCiAgICAgICAgIDxDT0RFPixjY3M9PFZBUj5TVFJJTkc8L1ZBUj48L0NPREU+IHRoZW4gPFZBUj5TVFJJTkc8L1ZBUj4gaXMgdGFrZW4gYXMgdGhlIG5hbWUgb2YgYQogICAgICAgICBjb2RlZCBjaGFyYWN0ZXIgc2V0IGFuZCA8Q09ERT5mb3BlbjwvQ09ERT4gd2lsbCBtYXJrIHRoZSBzdHJlYW0gYXMKICAgICAgICAgd2lkZS1vcmllbnRlZCB3aGljaCBhcHByb3ByaWF0ZSBjb252ZXJzaW9uIGZ1bmN0aW9ucyBpbiBwbGFjZSB0byBjb252ZXJ0CiAgICAgICAgIGZyb20gYW5kIHRvIHRoZSBjaGFyYWN0ZXIgc2V0IDxWQVI+U1RSSU5HPC9WQVI+IGlzIHBsYWNlLiAgQW55IG90aGVyIHN0cmVhbQogICAgICAgICBpcyBvcGVuZWQgaW5pdGlhbGx5IHVub3JpZW50ZWQgYW5kIHRoZSBvcmllbnRhdGlvbiBpcyBkZWNpZGVkIHdpdGggdGhlCiAgICAgICAgIGZpcnN0IGZpbGUgb3BlcmF0aW9uLiAgSWYgdGhlIGZpcnN0IG9wZXJhdGlvbiBpcyBhIHdpZGUgY2hhcmFjdGVyCiAgICAgICAgIG9wZXJhdGlvbiwgdGhlIHN0cmVhbSBpcyBub3Qgb25seSBtYXJrZWQgYXMgd2lkZS1vcmllbnRlZCwgYWxzbyB0aGUKICAgICAgICAgY29udmVyc2lvbiBmdW5jdGlvbnMgdG8gY29udmVydCB0byB0aGUgY29kZWQgY2hhcmFjdGVyIHNldCB1c2VkIGZvciB0aGUKICAgICAgICAgY3VycmVudCBsb2NhbGUgYXJlIGxvYWRlZC4gIFRoaXMgd2lsbCBub3QgY2hhbmdlIGFueW1vcmUgZnJvbSB0aGlzIHBvaW50CiAgICAgICAgIG9uIGV2ZW4gaWYgdGhlIGxvY2FsZSBzZWxlY3RlZCBmb3IgdGhlIDxDT0RFPkxDX0NUWVBFPC9DT0RFPiBjYXRlZ29yeSBpcwogICAgICAgICBjaGFuZ2VkLgogICAgICAgICA8YnI+PGJyPiBBbnkgb3RoZXIgY2hhcmFjdGVycyBpbiA8VkFSPm9wZW50eXBlPC9WQVI+IGFyZSBzaW1wbHkgaWdub3JlZC4gIFRoZXkgbWF5IGJlCiAgICAgICAgIG1lYW5pbmdmdWwgaW4gb3RoZXIgc3lzdGVtcy4KICAgICAgICAgPGJyPjxicj4gSWYgdGhlIG9wZW4gZmFpbHMsIDxDT0RFPmZvcGVuPC9DT0RFPiByZXR1cm5zIGEgbnVsbCBwb2ludGVyLgogICAgICAgICA8YnI+PGJyPiBXaGVuIHRoZSBzb3VyY2VzIGFyZSBjb21waWxpbmcgd2l0aCA8Q09ERT5fRklMRV9PRkZTRVRfQklUUyA9PSA2NDwvQ09ERT4gb24gYQogICAgICAgICAzMiBiaXQgbWFjaGluZSB0aGlzIGZ1bmN0aW9uIGlzIGluIGZhY3QgPENPREU+Zm9wZW42NDwvQ09ERT4gc2luY2UgdGhlIExGUwogICAgICAgICBpbnRlcmZhY2UgcmVwbGFjZXMgdHJhbnNwYXJlbnRseSB0aGUgb2xkIGludGVyZmFjZS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHc3RkaW8uaHhxAH4J+3QAKmNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpvcGVudHlwZXQABkZJTEUgKnQAB2ZvcGVuNjRzcQB+AAp0AoUKICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gPENPREU+Zm9wZW48L0NPREU+IGJ1dCB0aGUgc3RyZWFtIGl0IHJldHVybnMgYQogICAgICAgICBwb2ludGVyIGZvciBpcyBvcGVuZWQgdXNpbmcgPENPREU+b3BlbjY0PC9DT0RFPi4gIFRoZXJlZm9yZSB0aGlzIHN0cmVhbSBjYW4gYmUKICAgICAgICAgdXNlZCBldmVuIG9uIGZpbGVzIGxhcmdlciB0aGVuIDJeMzEgYnl0ZXMgb24gMzIgYml0IG1hY2hpbmVzLgogICAgICAgICA8YnI+PGJyPiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSByZXR1cm4gdHlwZSBpcyBzdGlsbCA8Q09ERT5GSUxFICo8L0NPREU+LiAgVGhlcmUgaXMgbm8KICAgICAgICAgc3BlY2lhbCA8Q09ERT5GSUxFPC9DT0RFPiB0eXBlIGZvciB0aGUgTEZTIGludGVyZmFjZS4KICAgICAgICAgPGJyPjxicj4gSWYgdGhlIHNvdXJjZXMgYXJlIGNvbXBpbGVkIHdpdGggPENPREU+X0ZJTEVfT0ZGU0VUX0JJVFMgPT0gNjQ8L0NPREU+IG9uIGEgMzIKICAgICAgICAgYml0cyBtYWNoaW5lIHRoaXMgZnVuY3Rpb24gaXMgYXZhaWxhYmxlIHVuZGVyIHRoZSBuYW1lIDxDT0RFPmZvcGVuPC9DT0RFPgogICAgICAgICBhbmQgc28gdHJhbnNwYXJlbnRseSByZXBsYWNlcyB0aGUgb2xkIGludGVyZmFjZS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHc3RkaW8uaHhxAH4KAnQAKmNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpvcGVudHlwZXQABkZJTEUgKnQAC2ZvcGVuY29va2llc3EAfgAKdAITCiAgICAgICAgVGhpcyBmdW5jdGlvbiBhY3R1YWxseSBjcmVhdGVzIHRoZSBzdHJlYW0gZm9yIGNvbW11bmljYXRpbmcgd2l0aCB0aGUKICAgICAgICAgPFZBUj5jb29raWU8L1ZBUj4gdXNpbmcgdGhlIGZ1bmN0aW9ucyBpbiB0aGUgPFZBUj5pby1mdW5jdGlvbnM8L1ZBUj4gYXJndW1lbnQuCiAgICAgICAgIFRoZSA8VkFSPm9wZW50eXBlPC9WQVI+IGFyZ3VtZW50IGlzIGludGVycHJldGVkIGFzIGZvciA8Q09ERT5mb3BlbjwvQ09ERT47CiAgICAgICAgIHNlZSBPcGVuaW5nIFN0cmVhbXMuICAoQnV0IG5vdGUgdGhhdCB0aGUgYGB0cnVuY2F0ZSBvbgogICAgICAgICBvcGVuJycgb3B0aW9uIGlzIGlnbm9yZWQuKSAgVGhlIG5ldyBzdHJlYW0gaXMgZnVsbHkgYnVmZmVyZWQuCiAgICAgICAgIDxicj48YnI+IFRoZSA8Q09ERT5mb3BlbmNvb2tpZTwvQ09ERT4gZnVuY3Rpb24gcmV0dXJucyB0aGUgbmV3bHkgY3JlYXRlZCBzdHJlYW0sIG9yIGEgbnVsbAogICAgICAgICBwb2ludGVyIGluIGNhc2Ugb2YgYW4gZXJyb3IuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3N0ZGlvLmh4cQB+Cgl0AEZ2b2lkICpjb29raWUsIGNvbnN0IGNoYXIgKm9wZW50eXBlLCBjb29raWVfaW9fZnVuY3Rpb25zX3QgaW8tZnVuY3Rpb25zdAAGRklMRSAqdAAEZm9ya3NxAH4ACnQD+wogICAgICAgIFRoZSA8Q09ERT5mb3JrPC9DT0RFPiBmdW5jdGlvbiBjcmVhdGVzIGEgbmV3IHByb2Nlc3MuCiAgICAgICAgIDxicj48YnI+IElmIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bCwgdGhlcmUgYXJlIHRoZW4gYm90aCBwYXJlbnQgYW5kIGNoaWxkCiAgICAgICAgIHByb2Nlc3NlcyBhbmQgYm90aCBzZWUgPENPREU+Zm9yazwvQ09ERT4gcmV0dXJuLCBidXQgd2l0aCBkaWZmZXJlbnQgdmFsdWVzOiBpdAogICAgICAgICByZXR1cm5zIGEgdmFsdWUgb2YgPENPREU+MDwvQ09ERT4gaW4gdGhlIGNoaWxkIHByb2Nlc3MgYW5kIHJldHVybnMgdGhlIGNoaWxkJ3MKICAgICAgICAgcHJvY2VzcyBJRCBpbiB0aGUgcGFyZW50IHByb2Nlc3MuCiAgICAgICAgIDxicj48YnI+IElmIHByb2Nlc3MgY3JlYXRpb24gZmFpbGVkLCA8Q09ERT5mb3JrPC9DT0RFPiByZXR1cm5zIGEgdmFsdWUgb2YgPENPREU+LTE8L0NPREU+IGluCiAgICAgICAgIHRoZSBwYXJlbnQgcHJvY2Vzcy4gIFRoZSBmb2xsb3dpbmcgPENPREU+ZXJybm88L0NPREU+IGVycm9yIGNvbmRpdGlvbnMgYXJlCiAgICAgICAgIGRlZmluZWQgZm9yIDxDT0RFPmZvcms8L0NPREU+OgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8RFQ+PENPREU+RUFHQUlOPC9DT0RFPgo8REQ+CiAgICAgICAgIFRoZXJlIGFyZW4ndCBlbm91Z2ggc3lzdGVtIHJlc291cmNlcyB0byBjcmVhdGUgYW5vdGhlciBwcm9jZXNzLCBvciB0aGUKICAgICAgICAgdXNlciBhbHJlYWR5IGhhcyB0b28gbWFueSBwcm9jZXNzZXMgcnVubmluZy4gIFRoaXMgbWVhbnMgZXhjZWVkaW5nIHRoZQogICAgICAgICA8Q09ERT5STElNSVRfTlBST0M8L0NPREU+IHJlc291cmNlIGxpbWl0LCB3aGljaCBjYW4gdXN1YWxseSBiZSBpbmNyZWFzZWQ7CiAgICAgICAgIC4KICAgICAgICAgPGJyPjxicj4gPExJPiBFTk9NRU0KICAgICAgICAgVGhlIHByb2Nlc3MgcmVxdWlyZXMgbW9yZSBzcGFjZSB0aGFuIHRoZSBzeXN0ZW0gY2FuIHN1cHBseS4KCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHVuaXN0ZC5oeHEAfgoQdAAEdm9pZHQABXBpZF90dAAHZm9ya3B0eXNxAH4ACnQDdgogICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byB0aGUgPENPREU+b3BlbnB0eTwvQ09ERT4gZnVuY3Rpb24sIGJ1dCBpbgogICAgICAgICBhZGRpdGlvbiwgZm9ya3MgYSBuZXcgcHJvY2VzcyAgYW5kIG1ha2VzIHRoZQogICAgICAgICBuZXdseSBvcGVuZWQgc2xhdmUgcHNldWRvLXRlcm1pbmFsIGRldmljZSB0aGUgY29udHJvbGxpbmcgdGVybWluYWwKICAgICAgICAgIGZvciB0aGUgY2hpbGQgcHJvY2Vzcy4KICAgICAgICAgPGJyPjxicj4gSWYgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLCB0aGVyZSBhcmUgdGhlbiBib3RoIHBhcmVudCBhbmQgY2hpbGQKICAgICAgICAgcHJvY2Vzc2VzIGFuZCBib3RoIHNlZSA8Q09ERT5mb3JrcHR5PC9DT0RFPiByZXR1cm4sIGJ1dCB3aXRoIGRpZmZlcmVudCB2YWx1ZXM6CiAgICAgICAgIGl0IHJldHVybnMgYSB2YWx1ZSBvZiAwIGluIHRoZSBjaGlsZCBwcm9jZXNzIGFuZCByZXR1cm5zIHRoZSBjaGlsZCdzCiAgICAgICAgIHByb2Nlc3MgSUQgaW4gdGhlIHBhcmVudCBwcm9jZXNzLgogICAgICAgICA8YnI+PGJyPiBJZiB0aGUgYWxsb2NhdGlvbiBvZiBhIHBzZXVkby10ZXJtaW5hbCBwYWlyIG9yIHRoZSBwcm9jZXNzIGNyZWF0aW9uCiAgICAgICAgIGZhaWxlZCwgPENPREU+Zm9ya3B0eTwvQ09ERT4gcmV0dXJucyBhIHZhbHVlIG9mIC0xIGluIHRoZSBwYXJlbnQKICAgICAgICAgcHJvY2Vzcy4KICAgICAgICAgPGJyPjxicj4gV2FybmluZzogVGhlIDxDT0RFPmZvcmtwdHk8L0NPREU+IGZ1bmN0aW9uIGhhcyB0aGUg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b24gaXMgZXF1aXZhbGVudCB0byB0aGUgPENPREU+ZnB1dHM8L0NPREU+CiAgICAgICAgIGZ1bmN0aW9uIGV4Y2VwdCB0aGF0IGl0IGRvZXMgbm90IGltcGxpY2l0bHkgbG9jayB0aGUgc3RyZWFtLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIGlzIGEgR05VIGV4dGVuc2lvbi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHc3RkaW8uaHhxAH4KQXQAG2NvbnN0IGNoYXIgKnMsIEZJTEUgKnN0cmVhbXQAA2ludHQABmZwdXR3Y3NxAH4ACnQA+AogICAgICAgIFRoZSA8Q09ERT5mcHV0d2M8L0NPREU+IGZ1bmN0aW9uIHdyaXRlcyB0aGUgd2lkZSBjaGFyYWN0ZXIgPFZBUj53YzwvVkFSPiB0byB0aGUKICAgICAgICAgc3RyZWFtIDxWQVI+c3RyZWFtPC9WQVI+LiAgPENPREU+V0VPRjwvQ09ERT4gaXMgcmV0dXJuZWQgaWYgYSB3cml0ZSBlcnJvciBvY2N1cnM7CiAgICAgICAgIG90aGVyd2lzZSB0aGUgY2hhcmFjdGVyIDxWQVI+d2M8L1ZBUj4gaXMgcmV0dXJuZWQuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3djaGFyLmh4cQB+Ckh0ABh3Y2hhcl90IHdjLCBGSUxFICpzdHJlYW10AAZ3aW50X3R0AA9mcHV0d2NfdW5sb2NrZWRzcQB+AAp0AN4KICAgICAgICBUaGUgPENPREU+ZnB1dHdjX3VubG9ja2VkPC9DT0RFPiBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIHRoZSA8Q09ERT5mcHV0d2M8L0NPREU+CiAgICAgICAgIGZ1bmN0aW9uIGV4Y2VwdCB0aGF0IGl0IGRvZXMgbm90IGltcGxpY2l0bHkgbG9jayB0aGUgc3RyZWFtLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIGlzIGEgR05VIGV4dGVuc2lvbi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHd2NoYXIuaHhxAH4KT3QAF3dpbnRfdCB3YywgRklMRSAqc3RyZWFtdAAGd2ludF90dAAGZnB1dHdzc3EAfgAKdAG9CiAgICAgICAgVGhlIGZ1bmN0aW9uIDxDT0RFPmZwdXR3czwvQ09ERT4gd3JpdGVzIHRoZSB3aWRlIGNoYXJhY3RlciBzdHJpbmcgPFZBUj53czwvVkFSPiB0bwogICAgICAgICB0aGUgc3RyZWFtIDxWQVI+c3RyZWFtPC9WQVI+LiAgVGhlIHRlcm1pbmF0aW5nIG51bGwgY2hhcmFjdGVyIGlzIG5vdCB3cml0dGVuLgogICAgICAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgPEVNPm5vdDwvRU0+IGFkZCBhIG5ld2xpbmUgY2hhcmFjdGVyLCBlaXRoZXIuICBJdAogICAgICAgICBvdXRwdXRzIG9ubHkgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZy4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIDxDT0RFPldFT0Y8L0NPREU+IGlmIGEgd3JpdGUgZXJyb3Igb2NjdXJzLCBhbmQgb3RoZXJ3aXNlCiAgICAgICAgIGEgbm9uLW5lZ2F0aXZlIHZhbHVlLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAd3Y2hhci5oeHEAfgpWdAAfY29uc3Qgd2NoYXJfdCAqd3MsIEZJTEUgKnN0cmVhbXQAA2ludHQAD2ZwdXR3c191bmxvY2tlZHNxAH4ACnQA3gogICAgICAgIFRoZSA8Q09ERT5mcHV0d3NfdW5sb2NrZWQ8L0NPREU+IGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gdGhlIDxDT0RFPmZwdXR3czwvQ09ERT4KICAgICAgICAgZnVuY3Rpb24gZXhjZXB0IHRoYXQgaXQgZG9lcyBub3QgaW1wbGljaXRseSBsb2NrIHRoZSBzdHJlYW0uCiAgICAgICAgIDxicj48YnI+IFRoaXMgZnVuY3Rpb24gaXMgYSBHTlUgZXh0ZW5zaW9uLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAd3Y2hhci5oeHEAfgpddAAfY29uc3Qgd2NoYXJfdCAqd3MsIEZJTEUgKnN0cmVhbXQAA2ludHQABWZyZWFkc3EAfgAKdALXCiAgICAgICAgVGhpcyBmdW5jdGlvbiByZWFkcyB1cCB0byA8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b3BlbnR5cGU8L1ZBUj4gYXMgZm9yIDxDT0RFPmZvcGVuPC9DT0RFPiwKICAgICAgICAgYW5kIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2FtZSBzdHJlYW0gb2JqZWN0IDxWQVI+c3RyZWFtPC9WQVI+LgogICAgICAgICA8YnI+PGJyPiBJZiB0aGUgb3BlcmF0aW9uIGZhaWxzLCBhIG51bGwgcG9pbnRlciBpcyByZXR1cm5lZDsgb3RoZXJ3aXNlLAogICAgICAgICA8Q09ERT5mcmVvcGVuPC9DT0RFPiByZXR1cm5zIDxWQVI+c3RyZWFtPC9WQVI+LgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5mcmVvcGVuPC9DT0RFPiBoYXMgdHJhZGl0aW9uYWxseSBiZWVuIHVzZWQgdG8gY29ubmVjdCBhIHN0YW5kYXJkIHN0cmVhbQogICAgICAgICBzdWNoIGFzIDxDT0RFPnN0ZGluPC9DT0RFPiB3aXRoIGEgZmlsZSBvZiB5b3VyIG93biBjaG9pY2UuICBUaGlzIGlzIHVzZWZ1bCBpbgogICAgICAgICBwcm9ncmFtcyBpbiB3aGljaCB1c2Ugb2YgYSBzdGFuZGFyZCBzdHJlYW0gZm9yIGNlcnRhaW4gcHVycG9zZXMgaXMKICAgICAgICAgaGFyZC1jb2RlZC4gIEluIHRoZSBHTlUgQyBsaWJyYXJ5LCB5b3UgY2FuIHNpbXBseSBjbG9zZSB0aGUgc3RhbmRhcmQKICAgICAgICAgc3RyZWFtcyBhbmQgb3BlbiBuZXcgb25lcyB3aXRoIDxDT0RFPmZvcGVuPC9DT0RFPi4gIEJ1dCBvdGhlciBzeXN0ZW1zIGxhY2sKICAgICAgICAgdGhpcyBhYmlsaXR5LCBzbyB1c2luZyA8Q09ERT5mcmVvcGVuPC9DT0RFPiBpcyBtb3JlIHBvcnRhYmxlLgogICAgICAgICA8YnI+PGJyPiBXaGVuIHRoZSBzb3VyY2VzIGFyZSBjb21waWxpbmcgd2l0aCA8Q09ERT5fRklMRV9PRkZTRVRfQklUUyA9PSA2NDwvQ09ERT4gb24gYQogICAgICAgICAzMiBiaXQgbWFjaGluZSB0aGlzIGZ1bmN0aW9uIGlzIGluIGZhY3QgPENPREU+ZnJlb3BlbjY0PC9DT0RFPiBzaW5jZSB0aGUgTEZTCiAgICAgICAgIGludGVyZmFjZSByZXBsYWNlcyB0cmFuc3BhcmVudGx5IHRoZSBvbGQgaW50ZXJmYWNlLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAdzdGRpby5oeHEAfgp5dAA4Y29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKm9wZW50eXBlLCBGSUxFICpzdHJlYW10AAZGSUxFICp0AAlmcmVvcGVuNjRzcQB+AAp0Aq8KICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gPENPREU+ZnJlb3BlbjwvQ09ERT4uICBUaGUgb25seSBkaWZmZXJlbmNlIGlzIHRoYXQKICAgICAgICAgb24gMzIgYml0IG1hY2hpbmUgdGhlIHN0cmVhbSByZXR1cm5lZCBpcyBhYmxlIHRvIHJlYWQgYmV5b25kIHRoZQogICAgICAgICAyXjMxIGJ5dGVzIGxpbWl0cyBpbXBvc2VkIGJ5IHRoZSBub3JtYWwgaW50ZXJmYWNlLiAgSXQgc2hvdWxkIGJlCiAgICAgICAgIG5vdGVkIHRoYXQgdGhlIHN0cmVhbSBwb2ludGVkIHRvIGJ5IDxWQVI+c3RyZWFtPC9WQVI+IG5lZWQgbm90IGJlIG9wZW5lZAogICAgICAgICB1c2luZyA8Q09ERT5mb3BlbjY0PC9DT0RFPiBvciA8Q09ERT5mcmVvcGVuNjQ8L0NPREU+IHNpbmNlIGl0cyBtb2RlIGlzIG5vdCBpbXBvcnRhbnQKICAgICAgICAgZm9yIHRoaXMgZnVuY3Rpb24uCiAgICAgICAgIDxicj48YnI+IElmIHRoZSBzb3VyY2VzIGFyZSBjb21waWxlZCB3aXRoIDxDT0RFPl9GSUxFX09GRlNFVF9CSVRTID09IDY0PC9DT0RFPiBvbiBhIDMyCiAgICAgICAgIGJpdHMgbWFjaGluZSB0aGlzIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSB1bmRlciB0aGUgbmFtZSA8Q09ERT5mcmVvcGVuPC9DT0RFPgogICAgICAgICBhbmQgc28gdHJhbnNwYXJlbnRseSByZXBsYWNlcyB0aGUgb2xkIGludGVyZmFjZS4KICAgICAg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dXJucyBhIHZhbHVlIG9mIHplcm8gaWYgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwKICAgICAgICAgYW5kIGEgbm9uemVybyB2YWx1ZSB0byBpbmRpY2F0ZSBmYWlsdXJlLiAgQSBzdWNjZXNzZnVsIGNhbGwgYWxzbyBjbGVhcnMKICAgICAgICAgdGhlIGVuZC1vZi1maWxlIGluZGljYXRvciBvZiA8VkFSPnN0cmVhbTwvVkFSPiBhbmQgZGlzY2FyZHMgYW55IGNoYXJhY3RlcnMKICAgICAgICAgdGhhdCB3ZXJlIGBgcHVzaGVkIGJhY2snJyBieSB0aGUgdXNlIG9mIDxDT0RFPnVuZ2V0YzwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IDxDT0RFPmZzZWVrPC9DT0RFPiBlaXRoZXIgZmx1c2hlcyBhbnkgYnVmZmVyZWQgb3V0cHV0IGJlZm9yZSBzZXR0aW5nIHRoZSBmaWxlCiAgICAgICAgIHBvc2l0aW9uIG9yIGVsc2UgcmVtZW1iZXJzIGl0IHNvIGl0IHdpbGwgYmUgd3JpdHRlbiBsYXRlciBpbiBpdHMgcHJvcGVyCiAgICAgICAgIHBsYWNlIGluIHRoZSBmaWxlLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAdzdGRpby5oeHEAfgqjdAApRklMRSAqc3RyZWFtLCBsb25nIGludCBvZmZzZXQsIGludCB3aGVuY2V0AANpbnR0AAZmc2Vla29zcQB+AAp0A/oKICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gPENPREU+ZnNlZWs8L0NPREU+IGJ1dCBpdCBjb3JyZWN0cyBhIHByb2JsZW0gd2l0aAogICAgICAgICA8Q09ERT5mc2VlazwvQ09ERT4gaW4gYSBzeXN0ZW0gd2l0aCBQT1NJWCB0eXBlcy4gIFVzaW5nIGEgdmFsdWUgb2YgdHlwZQogICAgICAgICA8Q09ERT5sb25nIGludDwvQ09ERT4gZm9yIHRoZSBvZmZzZXQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBQT1NJWC4KICAgICAgICAgPENPREU+ZnNlZWtvPC9DT0RFPiB1c2VzIHRoZSBjb3JyZWN0IHR5cGUgPENPREU+b2ZmX3Q8L0NPREU+IGZvciB0aGUgPFZBUj5vZmZzZXQ8L1ZBUj4KICAgICAgICAgcGFyYW1ldGVyLgogICAgICAgICA8YnI+PGJyPiBGb3IgdGhpcyByZWFzb24gaXQgaXMgYSBnb29kIGlkZWEgdG8gcHJlZmVyIDxDT0RFPmZ0ZWxsbzwvQ09ERT4gd2hlbmV2ZXIgaXQgaXMKICAgICAgICAgYXZhaWxhYmxlIHNpbmNlIGl0cyBmdW5jdGlvbmFsaXR5IGlzIChpZiBkaWZmZXJlbnQgYXQgYWxsKSBjbG9zZXIgdGhlCiAgICAgICAgIHVuZGVybHlpbmcgZGVmaW5pdGlvbi4KICAgICAgICAgPGJyPjxicj4gVGhlIGZ1bmN0aW9uYWxpdHkgYW5kIHJldHVybiB2YWx1ZSBpcyB0aGUgc2FtZSBhcyBmb3IgPENPREU+ZnNlZWs8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBUaGUgZnVuY3Rpb24gaXMgYW4gZXh0ZW5zaW9uIGRlZmluZWQgaW4gdGhlIFVuaXggU2luZ2xlIFNwZWNpZmljYXRpb24KICAgICAgICAgdmVyc2lvbiAyLgogICAgICAgICA8YnI+PGJyPiBXaGVuIHRoZSBzb3VyY2VzIGFyZSBjb21waWxlZCB3aXRoIDxDT0RFPl9GSUxFX09GRlNFVF9CSVRTID09IDY0PC9DT0RFPiBvbiBhCiAgICAgICAgIDMyIGJpdCBzeXN0ZW0gdGhpcyBmdW5jdGlvbiBpcyBpbiBmYWN0IDxDT0RFPmZzZWVrbzY0PC9DT0RFPi4gIEkuZS4sIHRoZQogICAgICAgICBMRlMgaW50ZXJmYWNlIHRyYW5zcGFyZW50bHkgcmVwbGFjZXMgdGhlIG9sZCBpbnRlcmZhY2UuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3N0ZGlvLmh4cQB+Cqp0ACZGSUxFICpzdHJlYW0sIG9mZl90IG9mZnNldCwgaW50IHdoZW5jZXQAA2ludHQACGZzZWVrbzY0c3EAfgAKdALFCiAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIDxDT0RFPmZzZWVrbzwvQ09ERT4gd2l0aCB0aGUgb25seSBkaWZmZXJlbmNlIHRoYXQKICAgICAgICAgdGhlIDxWQVI+b2Zmc2V0PC9WQVI+IHBhcmFtZXRlciBpcyBvZiB0eXBlIDxDT0RFPm9mZjY0X3Q8L0NPREU+LiAgVGhpcyBhbHNvCiAgICAgICAgIHJlcXVpcmVzIHRoYXQgdGhlIHN0cmVhbSA8VkFSPnN0cmVhbTwvVkFSPiB3YXMgb3BlbmVkIHVzaW5nIGVpdGhlcgogICAgICAgICA8Q09ERT5mb3BlbjY0PC9DT0RFPiwgPENPREU+ZnJlb3BlbjY0PC9DT0RFPiwgb3IgPENPREU+dG1wZmlsZTY0PC9DT0RFPiBzaW5jZSBvdGhlcndpc2UKICAgICAgICAgdGhlIHVuZGVybHlpbmcgZmlsZSBvcGVyYXRpb25zIHRvIHBvc2l0aW9uIHRoZSBmaWxlIHBvaW50ZXIgYmV5b25kIHRoZQogICAgICAgICAyXjMxIGJ5dGVzIGxpbWl0IG1pZ2h0IGZhaWwuCiAgICAgICAgIDxicj48YnI+IElmIHRoZSBzb3VyY2VzIGFyZSBjb21waWxlZCB3aXRoIDxDT0RFPl9GSUxFX09GRlNFVF9CSVRTID09IDY0PC9DT0RFPiBvbiBhIDMyCiAgICAgICAgIGJpdHMgbWFjaGluZSB0aGlzIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSB1bmRlciB0aGUgbmFtZSA8Q09ERT5mc2Vla288L0NPREU+CiAgICAgICAgIGFuZCBzbyB0cmFuc3BhcmVudGx5IHJlcGxhY2VzIHRoZSBvbGQgaW50ZXJmYWNlLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAdzdGRpby5oeHEAfgqxdAAoRklMRSAqc3RyZWFtLCBvZmY2NF90IG9mZnNldCwgaW50IHdoZW5jZXQAA2ludHQAB2ZzZXRwb3NzcQB+AAp0A1EKICAgICAgICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGZpbGUgcG9zaXRpb24gaW5kaWNhdG9yIGZvciB0aGUgc3RyZWFtIDxWQVI+c3RyZWFtPC9WQVI+CiAgICAgICAgIHRvIHRoZSBwb3NpdGlvbiA8VkFSPnBvc2l0aW9uPC9WQVI+LCB3aGljaCBtdXN0IGhhdmUgYmVlbiBzZXQgYnkgYSBwcmV2aW91cwogICAgICAgICBjYWxsIHRvIDxDT0RFPmZnZXRwb3M8L0NPREU+IG9uIHRoZSBzYW1lIHN0cmVhbS4gIElmIHN1Y2Nlc3NmdWwsIDxDT0RFPmZzZXRwb3M8L0NPREU+CiAgICAgICAgIGNsZWFycyB0aGUgZW5kLW9mLWZpbGUgaW5kaWNhdG9yIG9uIHRoZSBzdHJlYW0sIGRpc2NhcmRzIGFueSBjaGFyYWN0ZXJzCiAgICAgICAgIHRoYXQgd2VyZSBgYHB1c2hlZCBiYWNrJycgYnkgdGhlIHVzZSBvZiA8Q09ERT51bmdldGM8L0NPREU+LCBhbmQgcmV0dXJucyBhIHZhbHVlCiAgICAgICAgIG9mIHplcm8uICBPdGhlcndpc2UsIDxDT0RFPmZzZXRwb3M8L0NPREU+IHJldHVybnMgYSBub256ZXJvIHZhbHVlIGFuZCBzdG9yZXMKICAgICAgICAgYW4gaW1wbGVtZW50YXRpb24tZGVmaW5lZCBwb3NpdGl2ZSB2YWx1ZSBpbiA8Q09ERT5lcnJubzwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IFdoZW4gdGhlIHNvdXJjZXMgYXJlIGNvbXBpbGVkIHdpdGggPENPREU+X0ZJTEVfT0ZGU0VUX0JJVFMgPT0gNjQ8L0NPREU+IG9uIGEKICAgICAgICAgMzIgYml0IHN5c3RlbSB0aGUgZnVuY3Rpb24gaXMgaW4gZmFjdCA8Q09ERT5mc2V0cG9zNjQ8L0NPREU+LiAgSS5lLiwgdGhlIExGUwogICAgICAgICBpbnRlcmZhY2UgdHJhbnNwYXJlbnRseSByZXBsYWNlcyB0aGUgb2xkIGludGVyZmFjZS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHc3RkaW8uaHhxAH4KuHQAJEZJTEUgKnN0cmVhbSwgY29uc3QgZnBvc190ICpwb3NpdGlvbnQAA2ludHQACWZzZXRwb3M2NHNxAH4ACnQBywogICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byA8Q09ERT5mc2V0cG9zPC9DT0RFPiBidXQgdGhlIGZpbGUgcG9zaXRpb24gdXNlZAogICAgICAgICBmb3IgcG9zaXRpb25pbmcgaXMgcHJvdmlkZWQgaW4gYSB2YXJpYWJsZSBvZiB0eXBlIDxDT0RFPmZwb3M2NF90PC9DT0RFPiB0bwogICAgICAgICB3aGljaCA8VkFSPnBvc2l0aW9uPC9WQVI+IHBvaW50cy4KICAgICAgICAgPGJyPjxicj4gSWYgdGhlIHNvdXJjZXMgYXJlIGNvbXBpbGVkIHdpdGggPENPREU+X0ZJTEVfT0ZGU0VUX0JJVFMgPT0gNjQ8L0NPREU+IG9uIGEgMzIKICAgICAgICAgYml0cyBtYWNoaW5lIHRoaXMgZnVuY3Rpb24gaXMgYXZhaWxhYmxlIHVuZGVyIHRoZSBuYW1lIDxDT0RFPmZzZXRwb3M8L0NPREU+CiAgICAgICAgIGFuZCBzbyB0cmFuc3BhcmVudGx5IHJlcGxhY2VzIHRoZSBvbGQgaW50ZXJmYWNlLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAdzdGRpby5oeHEAfgq/dAAmRklMRSAqc3RyZWFtLCBjb25zdCBmcG9zNjRfdCAqcG9zaXRpb250AANpbnR0AAVmc3RhdHNxAH4ACnQDBwogICAgICAgIFRoZSA8Q09ERT5mc3RhdDwvQ09ERT4gZnVuY3Rpb24gaXMgbGlrZSA8Q09ERT5zdGF0PC9DT0RFPiwgZXhjZXB0IHRoYXQgaXQgdGFrZXMgYW4KICAgICAgICAgb3BlbiBmaWxlIGRlc2NyaXB0b3IgYXMgYW4gYXJndW1lbnQgaW5zdGVhZCBvZiBhIGZpbGUgbmFtZS4KICAgICAgICAgLgogICAgICAgICA8YnI+PGJyPiBMaWtlIDxDT0RFPnN0YXQ8L0NPREU+LCA8Q09ERT5mc3RhdDwvQ09ERT4gcmV0dXJucyA8Q09ERT4wPC9DT0RFPiBvbiBzdWNjZXNzIGFuZCA8Q09ERT4tMTwvQ09ERT4KICAgICAgICAgb24gZmFpbHVyZS4gIFRoZSBmb2xsb3dpbmcgPENPREU+ZXJybm88L0NPREU+IGVycm9yIGNvbmRpdGlvbnMgYXJlIGRlZmluZWQgZm9yCiAgICAgICAgIDxDT0RFPmZzdGF0PC9DT0RFPjoKICAgICAgICAgPGJyPjxicj4gPERMPgoKICAgICAgICAgPERUPjxDT0RFPkVCQURGPC9DT0RFPgo8REQ+CiAgICAgICAgIFRoZSA8VkFSPmZpbGVkZXM8L1ZBUj4gYXJndW1lbnQgaXMgbm90IGEgdmFsaWQgZmlsZSBkZXNjcmlwdG9yLgoKICAgICAgICAgPGJyPjxicj4gV2hlbiB0aGUgc291cmNlcyBhcmUgY29tcGlsZWQgd2l0aCA8Q09ERT5fRklMRV9PRkZTRVRfQklUUyA9PSA2NDwvQ09ERT4gdGhpcwogICAgICAgICBmdW5jdGlvbiBpcyBpbiBmYWN0IDxDT0RFPmZzdGF0NjQ8L0NPREU+IHNpbmNlIHRoZSBMRlMgaW50ZXJmYWNlIHRyYW5zcGFyZW50bHkKICAgICAgICAgcmVwbGFjZXMgdGhlIG5vcm1hbCBpbXBsZW1lbnRhdGlvbi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAKc3lzL3N0YXQuaHhxAH4KxnQAHWludCBmaWxlZGVzLCBzdHJ1Y3Qgc3RhdCAqYnVmdAADaW50dAAHZnN0YXQ2NHNxAH4ACnQCkQogICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byA8Q09ERT5mc3RhdDwvQ09ERT4gYnV0IGlzIGFibGUgdG8gd29yayBvbiBsYXJnZQogICAgICAgICBmaWxlcyBvbiAzMi1iaXQgcGxhdGZvcm1zLiAgRm9yIGxhcmdlIGZpbGVzIHRoZSBmaWxlIGRlc2NyaXB0b3IKICAgICAgICAgPFZBUj5maWxlZGVzPC9WQVI+IHNob3VsZCBiZSBvYnRhaW5lZCBieSA8Q09ERT5vcGVuNjQ8L0NPREU+IG9yIDxDT0RFPmNyZWF0NjQ8L0NPREU+LgogICAgICAgICBUaGUgPFZBUj5idWY8L1ZBUj4gcG9pbnRlciBwb2ludHMgdG8gYSB2YXJpYWJsZSBvZiB0eXBlIDxDT0RFPnN0cnVjdCBzdGF0NjQ8L0NPREU+CiAgICAgICAgIHdoaWNoIGlzIGFibGUgdG8gcmVwcmVzZW50IHRoZSBsYXJnZXIgdmFsdWVzLgogICAgICAgICA8YnI+PGJyPiBXaGVuIHRoZSBzb3VyY2VzIGFyZSBjb21waWxlZCB3aXRoIDxDT0RFPl9GSUxFX09GRlNFVF9CSVRTID09IDY0PC9DT0RFPiB0aGlzCiAgICAgICAgIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSB1bmRlciB0aGUgbmFtZSA8Q09ERT5mc3RhdDwvQ09ERT4gYW5kIHNvIHRyYW5zcGFyZW50bHkKICAgICAgICAgcmVwbGFjZXMgdGhlIGludGVyZmFjZSBmb3Igc21hbGwgZmlsZXMgb24gMzItYml0IG1hY2hpbmVzLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AApzeXMvc3RhdC5oeHEAfgrNdAAfaW50IGZpbGVkZXMsIHN0cnVjdCBzdGF0NjQgKmJ1ZnQAA2ludHQABWZzeW5jc3EAfgAKdATfCiAgICAgICAgVGhlIDxDT0RFPmZzeW5jPC9DT0RFPiBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBtYWtlIHN1cmUgYWxsIGRhdGEgYXNzb2NpYXRlZCB3aXRoCiAgICAgICAgIHRoZSBvcGVuIGZpbGUgPFZBUj5maWxkZXM8L1ZBUj4gaXMgd3JpdHRlbiB0byB0aGUgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUKICAgICAgICAgZGVzY3JpcHRvci4gIFRoZSBmdW5jdGlvbiBjYWxsIGRvZXMgbm90IHJldHVybiB1bmxlc3MgYWxsIGFjdGlvbnMgaGF2ZQogICAgICAgICBmaW5pc2hlZC4KICAgICAgICAgPGJyPjxicj4gQSBwcm90b3R5cGUgZm9yIDxDT0RFPmZzeW5jPC9DT0RFPiBjYW4gYmUgZm91bmQgaW4gPFRUPnVuaXN0ZC5oPC9UVD4uCiAgICAgICAgIDxicj48YnI+IFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgaW4gbXVsdGktdGhyZWFkZWQgcHJvZ3JhbXMuICBUaGlzCiAgICAgICAgIGlzIGEgcHJvYmxlbSBpZiB0aGUgdGhyZWFkIGFsbG9jYXRlcyBzb21lIHJlc291cmNlcyAobGlrZSBtZW1vcnksIGZpbGUKICAgICAgICAgZGVzY3JpcHRvcnMsIHNlbWFwaG9yZXMgb3Igd2hhdGV2ZXIpIGF0IHRoZSB0aW1lIDxDT0RFPmZzeW5jPC9DT0RFPiBpcwogICAgICAgICBjYWxsZWQuICBJZiB0aGUgdGhyZWFkIGdldHMgY2FuY2VsZWQgdGhlc2UgcmVzb3VyY2VzIHN0YXkgYWxsb2NhdGVkCiAgICAgICAgIHVudGlsIHRoZSBwcm9ncmFtIGVuZHMuICBUbyBhdm9pZCB0aGlzLCBjYWxscyB0byA8Q09ERT5mc3luYzwvQ09ERT4gc2hvdWxkIGJlCiAgICAgICAgIHByb3RlY3RlZCB1c2luZyBjYW5jZWxsYXRpb24gaGFuZGxlcnMuCiAgICAgICAgIDxicj48YnI+IFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9uIGlzIHplcm8gaWYgbm8gZXJyb3Igb2NjdXJyZWQuICBPdGhlcndpc2UKICAgICAgICAgaXQgaXMgLTEgYW5kIHRoZSBnbG9iYWwgdmFyaWFibGUgPFZBUj5lcnJubzwvVkFSPiBpcyBzZXQgdG8gdGhlCiAgICAgICAgIGZvbGxvd2luZyB2YWx1ZXM6CiAgICAgICAgIDxETD4KCiAgICAgICAgIDxEVD48Q09ERT5FQkFERjwvQ09ERT4KPEREPgogICAgICAgICBUaGUgZGVzY3JpcHRvciA8VkFSPmZpbGRlczwvVkFSPiBpcyBub3QgdmFsaWQuCiAgICAgICAgIDxicj48YnI+IDxMST4gRUlOVkFMCiAgICAgICAgIE5vIHN5bmNocm9uaXphdGlvbiBpcyBwb3NzaWJsZSBzaW5jZSB0aGUgc3lzdGVtIGRvZXMgbm90IGltcGxlbWVudCB0aGlzLgoKICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIdW5pc3RkLmh4cQB+CtR0AAppbnQgZmlsZGVzdAADaW50dAAFZnRlbGxzcQB+AAp0AY4KICAgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGN1cnJlbnQgZmlsZSBwb3NpdGlvbiBvZiB0aGUgc3RyZWFtCiAgICAgICAgIDxWQVI+c3RyZWFtPC9WQVI+LgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIGNhbiBmYWlsIGlmIHRoZSBzdHJlYW0gZG9lc24ndCBzdXBwb3J0IGZpbGUgcG9zaXRpb25pbmcsCiAgICAgICAgIG9yIGlmIHRoZSBmaWxlIHBvc2l0aW9uIGNhbid0IGJlIHJlcHJlc2VudGVkIGluIGEgPENPREU+bG9uZyBpbnQ8L0NPREU+LCBhbmQKICAgICAgICAgcG9zc2libHkgZm9yIG90aGVyIHJlYXNvbnMgYXMgd2VsbC4gIElmIGEgZmFpbHVyZSBvY2N1cnMsIGEgdmFsdWUgb2YKICAgICAgICAgPENPREU+LTE8L0NPREU+IGlzIHJldHVybmVkLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAdzdGRpby5oeHEAfgrbdAAMRklMRSAqc3RyZWFtdAAIbG9uZyBpbnR0AAZmdGVsbG9zcQB+AAp0BIQKICAgICAgICBUaGUgPENPREU+ZnRlbGxvPC9DT0RFPiBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIDxDT0RFPmZ0ZWxsPC9DT0RFPiwgZXhjZXB0IHRoYXQgaXQKICAgICAgICAgcmV0dXJucyBhIHZhbHVlIG9mIHR5cGUgPENPREU+b2ZmX3Q8L0NPREU+LiAgU3lzdGVtcyB3aGljaCBzdXBwb3J0IHRoaXMgdHlwZQogICAgICAgICB1c2UgaXQgdG8gZGVzY3JpYmUgYWxsIGZpbGUgcG9zaXRpb25zLCB1bmxpa2UgdGhlIFBPU0lYIHNwZWNpZmljYXRpb24KICAgICAgICAgd2hpY2ggdXNlcyBhIGxvbmcgaW50LiAgVGhlIHR3byBhcmUgbm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIHNpemUuCiAgICAgICAgIFRoZXJlZm9yZSwgdXNpbmcgZnRlbGwgY2FuIGxlYWQgdG8gcHJvYmxlbXMgaWYgdGhlIGltcGxlbWVudGF0aW9uIGlzCiAgICAgICAgIHdyaXR0ZW4gb24gdG9wIG9mIGEgUE9TSVggY29tcGxpYW50IGxvdy1sZXZlbCBJL08gaW1wbGVtZW50YXRpb24sIGFuZCB1c2luZwogICAgICAgICA8Q09ERT5mdGVsbG88L0NPREU+IGlzIHByZWZlcmFibGUgd2hlbmV2ZXIgaXQgaXMgYXZhaWxhYmxlLgogICAgICAgICA8YnI+PGJyPiBJZiB0aGlzIGZ1bmN0aW9uIGZhaWxzIGl0IHJldHVybnMgPENPREU+KG9mZl90KSAtMTwvQ09ERT4uICBUaGlzIGNhbiBoYXBwZW4gZHVlCiAgICAgICAgIHRvIG1pc3Npbmcgc3VwcG9ydCBmb3IgZmlsZSBwb3NpdGlvbmluZyBvciBpbnRlcm5hbCBlcnJvcnMuICBPdGhlcndpc2UKICAgICAgICAgdGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgY3VycmVudCBmaWxlIHBvc2l0aW9uLgogICAgICAgICA8YnI+PGJyPiBUaGUgZnVuY3Rpb24gaXMgYW4gZXh0ZW5zaW9uIGRlZmluZWQgaW4gdGhlIFVuaXggU2luZ2xlIFNwZWNpZmljYXRpb24KICAgICAgICAgdmVyc2lvbiAyLgogICAgICAgICA8YnI+PGJyPiBXaGVuIHRoZSBzb3VyY2VzIGFyZSBjb21waWxlZCB3aXRoIDxDT0RFPl9GSUxFX09GRlNFVF9CSVRTID09IDY0PC9DT0RFPiBvbiBhCiAgICAgICAgIDMyIGJpdCBzeXN0ZW0gdGhpcyBmdW5jdGlvbiBpcyBpbiBmYWN0IDxDT0RFPmZ0ZWxsbzY0PC9DT0RFPi4gIEkuZS4sIHRoZQogICAgICAgICBMRlMgaW50ZXJmYWNlIHRyYW5zcGFyZW50bHkgcmVwbGFjZXMgdGhlIG9sZCBpbnRlcmZhY2UuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3N0ZGlvLmh4cQB+CuJ0AAxGSUxFICpzdHJlYW10AAVvZmZfdHQACGZ0ZWxsbzY0c3EAfgAKdAK2CiAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIDxDT0RFPmZ0ZWxsbzwvQ09ERT4gd2l0aCB0aGUgb25seSBkaWZmZXJlbmNlIHRoYXQKICAgICAgICAgdGhlIHJldHVybiB2YWx1ZSBpcyBvZiB0eXBlIDxDT0RFPm9mZjY0X3Q8L0NPREU+LiAgVGhpcyBhbHNvIHJlcXVpcmVzIHRoYXQgdGhlCiAgICAgICAgIHN0cmVhbSA8VkFSPnN0cmVhbTwvVkFSPiB3YXMgb3BlbmVkIHVzaW5nIGVpdGhlciA8Q09ERT5mb3BlbjY0PC9DT0RFPiwKICAgICAgICAgPENPREU+ZnJlb3BlbjY0PC9DT0RFPiwgb3IgPENPREU+dG1wZmlsZTY0PC9DT0RFPiBzaW5jZSBvdGhlcndpc2UgdGhlIHVuZGVybHlpbmcKICAgICAgICAgZmlsZSBvcGVyYXRpb25zIHRvIHBvc2l0aW9uIHRoZSBmaWxlIHBvaW50ZXIgYmV5b25kIHRoZSAyXjMxCiAgICAgICAgIGJ5dGVzIGxpbWl0IG1pZ2h0IGZhaWwuCiAgICAgICAgIDxicj48YnI+IElmIHRoZSBzb3VyY2VzIGFyZSBjb21waWxlZCB3aXRoIDxDT0RFPl9GSUxFX09GRlNFVF9CSVRTID09IDY0PC9DT0RFPiBvbiBhIDMyCiAgICAgICAgIGJpdHMgbWFjaGluZSB0aGlzIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSB1bmRlciB0aGUgbmFtZSA8Q09ERT5mdGVsbG88L0NPREU+CiAgICAgICAgIGFuZCBzbyB0cmFuc3BhcmVudGx5IHJlcGxhY2VzIHRoZSBvbGQgaW50ZXJmYWNlLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAdzdGRpby5oeHEAfgrpdAAMRklMRSAqc3RyZWFtdAAHb2ZmNjRfdHQACWZ0cnVuY2F0ZXNxAH4ACnQJdQogICAgICAgIDxicj48YnI+IFRoaXMgaXMgbGlrZSA8Q09ERT50cnVuY2F0ZTwvQ09ERT4sIGJ1dCBpdCB3b3JrcyBvbiBhIGZpbGUgZGVzY3JpcHRvciA8VkFSPmZkPC9WQVI+CiAgICAgICAgIGZvciBhbiBvcGVuZWQgZmlsZSBpbnN0ZWFkIG9mIGEgZmlsZSBuYW1lIHRvIGlkZW50aWZ5IHRoZSBvYmplY3QuICBUaGUKICAgICAgICAgZmlsZSBtdXN0IGJlIG9wZW5lZCBmb3Igd3JpdGluZyB0byBzdWNjZXNzZnVsbHkgY2Fycnkgb3V0IHRoZSBvcGVyYXRpb24uCiAgICAgICAgIDxicj48YnI+IFRoZSBQT1NJWCBzdGFuZGFyZCBsZWF2ZXMgaXQgaW1wbGVtZW50YXRpb24gZGVmaW5lZCB3aGF0IGhhcHBlbnMgaWYgdGhlCiAgICAgICAgIHNwZWNpZmllZCBuZXcgPFZBUj5sZW5ndGg8L1ZBUj4gb2YgdGhlIGZpbGUgaXMgYmlnZ2VyIHRoYW4gdGhlIG9yaWdpbmFsIHNpemUuCiAgICAgICAgIFRoZSA8Q09ERT5mdHJ1bmNhdGU8L0NPREU+IGZ1bmN0aW9uIG1pZ2h0IHNpbXBseSBsZWF2ZSB0aGUgZmlsZSBhbG9uZSBhbmQgZG8KICAgICAgICAgbm90aGluZyBvciBpdCBjYW4gaW5jcmVhc2UgdGhlIHNpemUgdG8gdGhlIGRlc2lyZWQgc2l6ZS4gIEluIHRoaXMgbGF0ZXIKICAgICAgICAgY2FzZSB0aGUgZXh0ZW5kZWQgYXJlYSBzaG91bGQgYmUgemVyby1maWxsZWQuICBTbyB1c2luZyA8Q09ERT5mdHJ1bmNhdGU8L0NPREU+CiAgICAgICAgIGlzIG5vIHJlbGlhYmxlIHdheSB0byBpbmNyZWFzZSB0aGUgZmlsZSBzaXplIGJ1dCBpZiBpdCBpcyBwb3NzaWJsZSBpdCBpcwogICAgICAgICBwcm9iYWJseSB0aGUgZmFzdGVzdCB3YXkuICBUaGUgZnVuY3Rpb24gYWxzbyBvcGVyYXRlcyBvbiBQT1NJWCBzaGFyZWQKICAgICAgICAgbWVtb3J5IHNlZ21lbnRzIGlmIHRoZXNlIGFyZSBpbXBsZW1lbnRlZCBieSB0aGUgc3lzdGVtLgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5mdHJ1bmNhdGU8L0NPREU+IGlzIGVzcGVjaWFsbHkgdXNlZnVsIGluIGNvbWJpbmF0aW9uIHdpdGggPENPREU+bW1hcDwvQ09ERT4uCiAgICAgICAgIFNpbmNlIHRoZSBtYXBwZWQgcmVnaW9uIG11c3QgaGF2ZSBhIGZpeGVkIHNpemUgb25lIGNhbm5vdCBlbmxhcmdlIHRoZQogICAgICAgICBmaWxlIGJ5IHdyaXRpbmcgc29tZXRoaW5nIGJleW9uZCB0aGUgbGFzdCBtYXBwZWQgcGFnZS4gIEluc3RlYWQgb25lIGhhcwogICAgICAgICB0byBlbmxhcmdlIHRoZSBmaWxlIGl0c2VsZiBhbmQgdGhlbiByZW1hcCB0aGUgZmlsZSB3aXRoIHRoZSBuZXcgc2l6ZS4KICAgICAgICAgVGhlIGV4YW1wbGUgYmVsb3cgc2hvd3MgaG93IHRoaXMgd29ya3MuCiAgICAgICAgIDxicj48YnI+IFdoZW4gdGhlIHNvdXJjZSBmaWxlIGlzIGNvbXBpbGVkIHdpdGggPENPREU+X0ZJTEVfT0ZGU0VUX0JJVFMgPT0gNjQ8L0NPREU+IHRoZQogICAgICAgICA8Q09ERT5mdHJ1bmNhdGU8L0NPREU+IGZ1bmN0aW9uIGlzIGluIGZhY3QgPENPREU+ZnRydW5jYXRlNjQ8L0NPREU+IGFuZCB0aGUgdHlwZQogICAgICAgICA8Q09ERT5vZmZfdDwvQ09ERT4gaGFzIDY0IGJpdHMgd2hpY2ggbWFrZXMgaXQgcG9zc2libGUgdG8gaGFuZGxlIGZpbGVzIHVwIHRvCiAgICAgICAgIDJeNjMgYnl0ZXMgaW4gbGVuZ3RoLgogICAgICAgICA8YnI+PGJyPiBUaGUgcmV0dXJuIHZhbHVlIGlzIDAgZm9yIHN1Y2Nlc3MsIG9yIC0xIGZvciBhbiBlcnJvci4gIFRoZQogICAgICAgICBmb2xsb3dpbmcgZXJyb3JzIG1heSBvY2N1cjoKICAgICAgICAgPGJyPjxicj4gPERMPgoKICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPkVCQURGPC9DT0RFPgo8REQ+CiAgICAgICAgIDxWQVI+ZmQ8L1ZBUj4gZG9lcyBub3QgY29ycmVzcG9uZCB0byBhbiBvcGVuIGZpbGUuCiAgICAgICAgIDxicj48YnI+IDxMST4gRUFDQ0VTCiAgICAgICAgIDxWQVI+ZmQ8L1ZBUj4gaXMgYSBkaXJlY3Rvcnkgb3Igbm90IG9wZW4gZm9yIHdyaXRpbmcuCiAgICAgICAgIDxicj48YnI+IDxMST4gRUlOVkFMCiAgICAgICAgIDxWQVI+bGVuZ3RoPC9WQVI+IGlzIG5lZ2F0aXZlLgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVGQklHCiAgICAgICAgIFRoZSBvcGVyYXRpb24gd291bGQgZXh0ZW5kIHRoZSBmaWxlIGJleW9uZCB0aGUgbGltaXRzIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtLgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVJTwogICAgICAgICBBIGhhcmR3YXJlIEkvTyBlcnJvciBvY2N1cnJlZC4KICAgICAgICAgPGJyPjxicj4gPExJPiBFUEVSTQogICAgICAgICBUaGUgZmlsZSBpcyAiYXBwZW5kLW9ubHkiIG9yICJpbW11dGFibGUiLgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVJTlRSCiAgICAgICAgIFRoZSBvcGVyYXRpb24gd2FzIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsLgogICAgICAgICA8YnI+PGJyPiA8YnI+PGJyPgogICAgICAgICA8YnI+PGJyPgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAh1bmlzdGQuaHhxAH4K8HQAFGludCBmZCwgb2ZmX3QgbGVuZ3RodAADaW50dAALZnRydW5jYXRlNjRzcQB+AAp0AhAKICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gdGhlIDxDT0RFPmZ0cnVuY2F0ZTwvQ09ERT4gZnVuY3Rpb24uICBUaGUKICAgICAgICAgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZSA8VkFSPmxlbmd0aDwvVkFSPiBhcmd1bWVudCBpcyA2NCBiaXRzIHdpZGUgZXZlbiBvbiAzMgogICAgICAgICBiaXRzIG1hY2hpbmVzIHdoaWNoIGFsbG93cyB0aGUgaGFuZGxpbmcgb2YgZmlsZXMgd2l0aCBzaXplcyB1cCB0bwogICAgICAgICAyXjYzIGJ5dGVzLgogICAgICAgICA8YnI+PGJyPiBXaGVuIHRoZSBzb3VyY2UgZmlsZSBpcyBjb21waWxlZCB3aXRoIDxDT0RFPl9GSUxFX09GRlNFVF9CSVRTID09IDY0PC9DT0RFPiBvbiBhCiAgICAgICAgIDMyIGJpdHMgbWFjaGluZSB0aGlzIGZ1bmN0aW9uIGlzIGFjdHVhbGx5IGF2YWlsYWJsZSB1bmRlciB0aGUgbmFtZQogICAgICAgICA8Q09ERT5mdHJ1bmNhdGU8L0NPREU+IGFuZCBzbyB0cmFuc3BhcmVudGx5IHJlcGxhY2VzIHRoZSAzMiBiaXRzIGludGVyZmFjZS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIdW5pc3RkLmh4cQB+Cvd0ABZpbnQgaWQsIG9mZjY0X3QgbGVuZ3RodAADaW50dAAMZnRyeWxvY2tmaWxlc3EAfgAKdAHBCiAgICAgICAgVGhlIDxDT0RFPmZ0cnlsb2NrZmlsZTwvQ09ERT4gZnVuY3Rpb24gdHJpZXMgdG8gYWNxdWlyZSB0aGUgaW50ZXJuYWwgbG9ja2luZwogICAgICAgICBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdHJlYW0gPFZBUj5zdHJlYW08L1ZBUj4ganVzdCBsaWtlCiAgICAgICAgIDxDT0RFPmZsb2NrZmlsZTwvQ09ERT4uICBCdXQgdW5saWtlIDxDT0RFPmZsb2NrZmlsZTwvQ09ERT4gdGhpcyBmdW5jdGlvbiBkb2VzIG5vdAogICAgICAgICBibG9jayBpZiB0aGUgbG9jayBpcyBub3QgYXZhaWxhYmxlLiAgPENPREU+ZnRyeWxvY2tmaWxlPC9DT0RFPiByZXR1cm5zIHplcm8gaWYKICAgICAgICAgdGhlIGxvY2sgd2FzIHN1Y2Nlc3NmdWxseSBhY3F1aXJlZC4gIE90aGVyd2lzZSB0aGUgc3RyZWFtIGlzIGxvY2tlZCBieQogICAgICAgICBhbm90aGVyIHRocmVhZC4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHc3RkaW8uaHhxAH4K/nQADEZJTEUgKnN0cmVhbXQAA2ludHQAA2Z0d3NxAH4ACnQMCgogICAgICAgIFRoZSA8Q09ERT5mdHc8L0NPREU+IGZ1bmN0aW9uIGNhbGxzIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBnaXZlbiBpbiB0aGUKICAgICAgICAgcGFyYW1ldGVyIDxWQVI+ZnVuYzwvVkFSPiBmb3IgZXZlcnkgaXRlbSB3aGljaCBpcyBmb3VuZCBpbiB0aGUgZGlyZWN0b3J5CiAgICAgICAgIHNwZWNpZmllZCBieSA8VkFSPmZpbGVuYW1lPC9WQVI+IGFuZCBhbGwgZGlyZWN0b3JpZXMgYmVsb3cuICBUaGUgZnVuY3Rpb24KICAgICAgICAgZm9sbG93cyBzeW1ib2xpYyBsaW5rcyBpZiBuZWNlc3NhcnkgYnV0IGRvZXMgbm90IHByb2Nlc3MgYW4gaXRlbSB0d2ljZS4KICAgICAgICAgSWYgPFZBUj5maWxlbmFtZTwvVkFSPiBpcyBub3QgYSBkaXJlY3RvcnkgdGhlbiBpdCBpdHNlbGYgaXMgdGhlIG9ubHkgb2JqZWN0CiAgICAgICAgIHJldHVybmVkIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbi4KICAgICAgICAgPGJyPjxicj4gVGhlIGZpbGUgbmFtZSBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNvbnN0cnVjdGVkIGJ5IHRha2luZwogICAgICAgICB0aGUgPFZBUj5maWxlbmFtZTwvVkFSPiBwYXJhbWV0ZXIgYW5kIGFwcGVuZGluZyB0aGUgbmFtZXMgb2YgYWxsIHBhc3NlZAogICAgICAgICBkaXJlY3RvcmllcyBhbmQgdGhlbiB0aGUgbG9jYWwgZmlsZSBuYW1lLiAgU28gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbgogICAgICAgICB1c2UgdGhpcyBwYXJhbWV0ZXIgdG8gYWNjZXNzIHRoZSBmaWxlLiAgPENPREU+ZnR3PC9DT0RFPiBhbHNvIGNhbGxzCiAgICAgICAgIDxDT0RFPnN0YXQ8L0NPREU+IGZvciB0aGUgZmlsZSBhbmQgcGFzc2VzIHRoYXQgaW5mb3JtYXRpb24gb24gdG8gdGhlIGNhbGxiYWNrCiAgICAgICAgIGZ1bmN0aW9uLiAgSWYgdGhpcyA8Q09ERT5zdGF0PC9DT0RFPiBjYWxsIHdhcyBub3Qgc3VjY2Vzc2Z1bCB0aGUgZmFpbHVyZSBpcwogICAgICAgICBpbmRpY2F0ZWQgYnkgc2V0dGluZyB0aGUgdGhpcmQgYXJndW1lbnQgb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvCiAgICAgICAgIDxDT0RFPkZUV19OUzwvQ09ERT4uICBPdGhlcndpc2UgaXQgaXMgc2V0IGFjY29yZGluZyB0byB0aGUgZGVzY3JpcHRpb24gZ2l2ZW4KICAgICAgICAgaW4gdGhlIGFjY291bnQgb2YgPENPREU+X19mdHdfZnVuY190PC9DT0RFPiBhYm92ZS4KICAgICAgICAgPGJyPjxicj4gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGV4cGVjdGVkIHRvIHJldHVybiAwIHRvIGluZGljYXRlIHRoYXQgbm8KICAgICAgICAgZXJyb3Igb2NjdXJyZWQgYW5kIHRoYXQgcHJvY2Vzc2luZyBzaG91bGQgY29udGludWUuICBJZiBhbiBlcnJvcgogICAgICAgICBvY2N1cnJlZCBpbiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gb3IgaXQgd2FudHMgPENPREU+ZnR3PC9DT0RFPiB0byByZXR1cm4KICAgICAgICAgaW1tZWRpYXRlbHksIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBjYW4gcmV0dXJuIGEgdmFsdWUgb3RoZXIgdGhhbgogICAgICAgICAwLiAgVGhpcyBpcyB0aGUgb25seSBjb3JyZWN0IHdheSB0byBzdG9wIHRoZSBmdW5jdGlvbi4gIFRoZQogICAgICAgICBwcm9ncmFtIG11c3Qgbm90IHVzZSA8Q09ERT5zZXRqbXA8L0NPREU+IG9yIHNpbWlsYXIgdGVjaG5pcXVlcyB0byBjb250aW51ZQogICAgICAgICBmcm9tIGFub3RoZXIgcGxhY2UuICBUaGlzIHdvdWxkIGxlYXZlIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhlCiAgICAgICAgIDxDT0RFPmZ0dzwvQ09ERT4gZnVuY3Rpb24gdW5mcmVlZC4KICAgICAgICAgPGJyPjxicj4gVGhlIDxWQVI+ZGVzY3JpcHRvcnM8L1ZBUj4gcGFyYW1ldGVyIHRvIDxDT0RFPmZ0dzwvQ09ERT4gc3BlY2lmaWVzIGhvdyBtYW55IGZpbGUKICAgICAgICAgZGVzY3JpcHRvcnMgaXQgaXMgYWxsb3dlZCB0byBjb25zdW1lLiAgVGhlIGZ1bmN0aW9uIHJ1bnMgZmFzdGVyIHRoZSBtb3JlCiAgICAgICAgIGRlc2NyaXB0b3JzIGl0IGNhbiB1c2UuICBGb3IgZWFjaCBsZXZlbCBpbiB0aGUgZGlyZWN0b3J5IGhpZXJhcmNoeSBhdAogICAgICAgICBtb3N0IG9uZSBkZXNjcmlwdG9yIGlzIHVzZWQsIGJ1dCBmb3IgdmVyeSBkZWVwIG9uZXMgYW55IGxpbWl0IG9uIG9wZW4KICAgICAgICAgZmlsZSBkZXNjcmlwdG9ycyBmb3IgdGhlIHByb2Nlc3Mgb3IgdGhlIHN5c3RlbSBtYXkgYmUgZXhjZWVkZWQuCiAgICAgICAgIE1vcmVvdmVyLCBmaWxlIGRlc2NyaXB0b3IgbGltaXRzIGluIGEgbXVsdGktdGhyZWFkZWQgcHJvZ3JhbSBhcHBseSB0bwogICAgICAgICBhbGwgdGhlIHRocmVhZHMgYXMgYSBncm91cCwgYW5kIHRoZXJlZm9yZSBpdCBpcyBhIGdvb2QgaWRlYSB0byBzdXBwbHkgYQogICAgICAgICByZWFzb25hYmxlIGxpbWl0IHRvIHRoZSBudW1iZXIgb2Ygb3BlbiBkZXNjcmlwdG9ycy4KICAgICAgICAgPGJyPjxicj4gVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgPENPREU+ZnR3PC9DT0RFPiBmdW5jdGlvbiBpcyAwIGlmIGFsbCBjYWxsYmFjawogICAgICAgICBmdW5jdGlvbiBjYWxscyByZXR1cm5lZCAwIGFuZCBhbGwgYWN0aW9ucyBwZXJmb3JtZWQgYnkgdGhlCiAgICAgICAgIDxDT0RFPmZ0dzwvQ09ERT4gc3VjY2VlZGVkLiAgSWYgYSBmdW5jdGlvbiBjYWxsIGZhaWxlZCAob3RoZXIgdGhhbiBjYWxsaW5nCiAgICAgICAgIDxDT0RFPnN0YXQ8L0NPREU+IG9uIGFuIGl0ZW0pIHRoZSBmdW5jdGlvbiByZXR1cm5zIC0xLiAgSWYgYSBjYWxsYmFjawogICAgICAgICBmdW5jdGlvbiByZXR1cm5zIGEgdmFsdWUgb3RoZXIgdGhhbiAwIHRoaXMgdmFsdWUgaXMgcmV0dXJuZWQgYXMKICAgICAgICAgdGhlIHJldHVybiB2YWx1ZSBvZiA8Q09ERT5mdHc8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBXaGVuIHRoZSBzb3VyY2VzIGFyZSBjb21waWxlZCB3aXRoIDxDT0RFPl9GSUxFX09GRlNFVF9CSVRTID09IDY0PC9DT0RFPiBvbiBhCiAgICAgICAgIDMyLWJpdCBzeXN0ZW0gdGhpcyBmdW5jdGlvbiBpcyBpbiBmYWN0IDxDT0RFPmZ0dzY0PC9DT0RFPiwgaS5lLiwgdGhlIExGUwogICAgICAgICBpbnRlcmZhY2UgdHJhbnNwYXJlbnRseSByZXBsYWNlcyB0aGUgb2xkIGludGVyZmFjZS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAFZnR3Lmh4cQB+CwV0ADhjb25zdCBjaGFyICpmaWxlbmFtZSwgX19mdHdfZnVuY190IGZ1bmMsIGludCBkZXNjcmlwdG9yc3QAA2ludHQABWZ0dzY0c3EAfgAKdAIACiAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIDxDT0RFPmZ0dzwvQ09ERT4gYnV0IGl0IGNhbiB3b3JrIG9uIGZpbGVzeXN0ZW1zCiAgICAgICAgIHdpdGggbGFyZ2UgZmlsZXMuICBGaWxlIGluZm9ybWF0aW9uIGlzIHJlcG9ydGVkIHVzaW5nIGEgdmFyaWFibGUgb2YgdHlwZQogICAgICAgICA8Q09ERT5zdHJ1Y3Qgc3RhdDY0PC9DT0RFPiB3aGljaCBpcyBwYXNzZWQgYnkgcmVmZXJlbmNlIHRvIHRoZSBjYWxsYmFjawogICAgICAgICBmdW5jdGlvbi4KICAgICAgICAgPGJyPjxicj4gV2hlbiB0aGUgc291cmNlcyBhcmUgY29tcGlsZWQgd2l0aCA8Q09ERT5fRklMRV9PRkZTRVRfQklUUyA9PSA2NDwvQ09ERT4gb24gYQogICAgICAgICAzMi1iaXQgc3lzdGVtIHRoaXMgZnVuY3Rpb24gaXMgYXZhaWxhYmxlIHVuZGVyIHRoZSBuYW1lIDxDT0RFPmZ0dzwvQ09ERT4gYW5kCiAgICAgICAgIHRyYW5zcGFyZW50bHkgcmVwbGFjZXMgdGhlIG9sZCBpbXBsZW1lbnRhdGlvbi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAFZnR3Lmh4cQB+Cwx0ADpjb25zdCBjaGFyICpmaWxlbmFtZSwgX19mdHc2NF9mdW5jX3QgZnVuYywgaW50IGRlc2NyaXB0b3JzdAADaW50dAALZnVubG9ja2ZpbGVzcQB+AAp0Ah4KICAgICAgICBUaGUgPENPREU+ZnVubG9ja2ZpbGU8L0NPREU+IGZ1bmN0aW9uIHJlbGVhc2VzIHRoZSBpbnRlcm5hbCBsb2NraW5nIG9iamVjdCBvZgogICAgICAgICB0aGUgc3RyZWFtIDxWQVI+c3RyZWFtPC9WQVI+LiBUaGUgc3RyZWFtIG11c3QgaGF2ZSBiZWVuIGxvY2tlZCBiZWZvcmUgYnkgYQogICAgICAgICBjYWxsIHRvIDxDT0RFPmZsb2NrZmlsZTwvQ09ERT4gb3IgYSBzdWNjZXNzZnVsIGNhbGwgb2YgPENPREU+ZnRyeWxvY2tmaWxlPC9DT0RFPi4KICAgICAgICAgVGhlIGltcGxpY2l0IGxvY2tpbmcgcGVyZm9ybWVkIGJ5IHRoZSBzdHJlYW0gb3BlcmF0aW9ucyBkbyBub3QgY291bnQuCiAgICAgICAgIFRoZSA8Q09ERT5mdW5sb2NrZmlsZTwvQ09ERT4gZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGFuIGVycm9yIHN0YXR1cyBhbmQgdGhlCiAgICAgICAgIGJlaGF2aW9yIG9mIGEgY2FsbCBmb3IgYSBzdHJlYW0gd2hpY2ggaXMgbm90IGxvY2tlZCBieSB0aGUgY3VycmVudAogICAgICAgICB0aHJlYWQgaXMgdW5kZWZpbmVkLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAdzdGRpby5oeHEAfgsTdAAMRklMRSAqc3RyZWFtdAAEdm9pZHQAB2Z1dGltZXNzcQB+AAp0BN0KICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgPENPREU+dXRpbWVzPC9DT0RFPiwgZXhjZXB0IHRoYXQgaXQgdGFrZXMgYW4gb3BlbiBmaWxlCiAgICAgICAgIGRlc2NyaXB0b3IgYXMgYW4gYXJndW1lbnQgaW5zdGVhZCBvZiBhIGZpbGUgbmFtZS4gIC4gIFRoaXMgZnVuY3Rpb24gY29tZXMgZnJvbSBGcmVlQlNELCBhbmQgaXMgbm90IGF2YWlsYWJsZSBvbiBhbGwKICAgICAgICAgcGxhdGZvcm1zIChpZiBub3QgYXZhaWxhYmxlLCBpdCB3aWxsIGZhaWwgd2l0aCA8Q09ERT5FTk9TWVM8L0NPREU+KS4KICAgICAgICAgPGJyPjxicj4gTGlrZSA8Q09ERT51dGltZXM8L0NPREU+LCA8Q09ERT5mdXRpbWVzPC9DT0RFPiByZXR1cm5zIDxDT0RFPjA8L0NPREU+IG9uIHN1Y2Nlc3MgYW5kIDxDT0RFPi0xPC9DT0RFPgogICAgICAgICBvbiBmYWlsdXJlLiAgVGhlIGZvbGxvd2luZyA8Q09ERT5lcnJubzwvQ09ERT4gZXJyb3IgY29uZGl0aW9ucyBh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CyF0ABZGSUxFICpzdHJlYW0sIGludCBtb2RldAADaW50dAAIZndwcmludGZzcQB+AAp0AK0KICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIGp1c3QgbGlrZSA8Q09ERT53cHJpbnRmPC9DT0RFPiwgZXhjZXB0IHRoYXQgdGhlIG91dHB1dCBpcwogICAgICAgICB3cml0dGVuIHRvIHRoZSBzdHJlYW0gPFZBUj5zdHJlYW08L1ZBUj4gaW5zdGVhZCBvZiA8Q09ERT5zdGRvdXQ8L0NPREU+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAd3Y2hhci5oeHEAfgsodAAqRklMRSAqc3RyZWFtLCBjb25zdCB3Y2hhcl90ICp0ZW1wbGF0ZSwgLi4udAADaW50dAAGZndyaXRlc3EAfgAKdAFMCiAgICAgICAgVGhpcyBmdW5jdGlvbiB3cml0ZXMgdXAgdG8gPFZBUj5jb3VudDwvVkFSPiBvYmplY3RzIG9mIHNpemUgPFZBUj5zaXplPC9WQVI+IGZyb20KICAgICAgICAgdGhlIGFycmF5IDxWQVI+ZGF0YTwvVkFSPiwgdG8gdGhlIHN0cmVhbSA8VkFSPnN0cmVhbTwvVkFSPi4gIFRoZSByZXR1cm4gdmFsdWUgaXMKICAgICAgICAgbm9ybWFsbHkgPFZBUj5jb3VudDwvVkFSPiwgaWYgdGhlIGNhbGwgc3VjY2VlZHMuICBBbnkgb3RoZXIgdmFsdWUgaW5kaWNhdGVzCiAgICAgICAgIHNvbWUgc29ydCBvZiBlcnJvciwgc3VjaCBhcyBydW5uaW5nIG91dCBvZiBzcGFjZS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHc3RkaW8uaHhxAH4LL3QAOWNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBzaXplX3QgY291bnQsIEZJTEUgKnN0cmVhbXQABnNpemVfdHQAD2Z3cml0ZV91bmxvY2tlZHNxAH4ACnQA3gogICAgICAgIFRoZSA8Q09ERT5md3JpdGVfdW5sb2NrZWQ8L0NPREU+IGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gdGhlIDxDT0RFPmZ3cml0ZTwvQ09ERT4KICAgICAgICAgZnVuY3Rpb24gZXhjZXB0IHRoYXQgaXQgZG9lcyBub3QgaW1wbGljaXRseSBsb2NrIHRoZSBzdHJlYW0uCiAgICAgICAgIDxicj48YnI+IFRoaXMgZnVuY3Rpb24gaXMgYSBHTlUgZXh0ZW5zaW9uLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAdzdGRpby5oeHEAfgs2dAA5Y29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIHNpemVfdCBjb3VudCwgRklMRSAqc3RyZWFtdAAGc2l6ZV90dAAHZndzY2FuZnNxAH4ACnQAqQogICAgICAgIFRoaXMgZnVuY3Rpb24gaXMganVzdCBsaWtlIDxDT0RFPndzY2FuZjwvQ09ERT4sIGV4Y2VwdCB0aGF0IHRoZSBpbnB1dCBpcyByZWFkCiAgICAgICAgIGZyb20gdGhlIHN0cmVhbSA8VkFSPnN0cmVhbTwvVkFSPiBpbnN0ZWFkIG9mIDxDT0RFPnN0ZGluPC9DT0RFPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHd2NoYXIuaHhxAH4LPXQAKkZJTEUgKnN0cmVhbSwgY29uc3Qgd2NoYXJfdCAqdGVtcGxhdGUsIC4uLnQAA2ludHQABWdhbW1hc3EAfgAKdAFPCiAgICAgICAgVGhlc2UgZnVuY3Rpb25zIGV4aXN0IGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMuICBUaGV5IGFyZSBlcXVpdmFsZW50IHRvCiAgICAgICAgIDxDT0RFPmxnYW1tYTwvQ09ERT4gZXRjLiAgSXQgaXMgYmV0dGVyIHRvIHVzZSA8Q09ERT5sZ2FtbWE8L0NPREU+IHNpbmNlIGZvciBvbmUgdGhlCiAgICAgICAgIG5hbWUgcmVmbGVjdHMgYmV0dGVyIHRoZSBhY3R1YWwgY29tcHV0YXRpb24sIG1vcmVvdmVyIDxDT0RFPmxnYW1tYTwvQ09ERT4gaXMKICAgICAgICAgc3RhbmRhcmRpemVkIGluIElTTyBDOTkgd2hpbGUgPENPREU+Z2FtbWE8L0NPREU+IGlzIG5vdC4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGbWF0aC5oeHEAfgtEdAAIZG91YmxlIHh0AAZkb3VibGV0AAZnYW1tYWZzcQB+AAp0AU8KICAgICAgICBUaGVzZSBmdW5jdGlvbnMgZXhpc3QgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucy4gIFRoZXkgYXJlIGVxdWl2YWxlbnQgdG8KICAgICAgICAgPENPREU+bGdhbW1hPC9DT0RFPiBldGMuICBJdCBpcyBiZXR0ZXIgdG8gdXNlIDxDT0RFPmxnYW1tYTwvQ09ERT4gc2luY2UgZm9yIG9uZSB0aGUKICAgICAgICAgbmFtZSByZWZsZWN0cyBiZXR0ZXIgdGhlIGFjdHVhbCBjb21wdXRhdGlvbiwgbW9yZW92ZXIgPENPREU+bGdhbW1hPC9DT0RFPiBpcwogICAgICAgICBzdGFuZGFyZGl6ZWQgaW4gSVNPIEM5OSB3aGlsZSA8Q09ERT5nYW1tYTwvQ09ERT4gaXMgbm90LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZtYXRoLmh4cQB+C0t0AAdmbG9hdCB4dAAFZmxvYXR0AAZnYW1tYWxzcQB+AAp0AU8KICAgICAgICBUaGVzZSBmdW5jdGlvbnMgZXhpc3QgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucy4gIFRoZXkgYXJlIGVxdWl2YWxlbnQgdG8KICAgICAgICAgPENPREU+bGdhbW1hPC9DT0RFPiBldGMuICBJdCBpcyBiZXR0ZXIgdG8gdXNlIDxDT0RFPmxnYW1tYTwvQ09ERT4gc2luY2UgZm9yIG9uZSB0aGUKICAgICAgICAgbmFtZSByZWZsZWN0cyBiZXR0ZXIgdGhlIGFjdHVhbCBjb21wdXRhdGlvbiwgbW9yZW92ZXIgPENPREU+bGdhbW1hPC9DT0RFPiBpcwogICAgICAgICBzdGFuZGFyZGl6ZWQgaW4gSVNPIEM5OSB3aGlsZSA8Q09ERT5nYW1tYTwvQ09ERT4gaXMgbm90LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZtYXRoLmh4cQB+C1J0AA1sb25nIGRvdWJsZSB4dAALbG9uZyBkb3VibGV0AARnY3Z0c3EAfgAKdAFrCiAgICAgICAgPENPREU+Z2N2dDwvQ09ERT4gaXMgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gPHNhbXA+c3ByaW50ZihidWYsICIlKmciLAogICAgICAgICBuZGlnaXQsIHZhbHVlPC9zYW1wPi4gIEl0IGlzIHByb3ZpZGVkIG9ubHkgZm9yIGNvbXBhdGliaWxpdHkncyBzYWtlLiAgSXQKICAgICAgICAgcmV0dXJucyA8VkFSPmJ1ZjwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gSWYgPFZBUj5uZGlnaXQ8L1ZBUj4gZGVjaW1hbCBkaWdpdHMgd291bGQgZXhjZWVkIHRoZSBwcmVjaXNpb24gb2YgYQogICAgICAgICA8Q09ERT5kb3VibGU8L0NPREU+IGl0IGlzIHJlZHVjZWQgdG8gYSBzeXN0ZW0tc3BlY2lmaWMgdmFsdWUuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHN0ZGxpYi5oeHEAfgtZdAAjZG91YmxlIHZhbHVlLCBpbnQgbmRpZ2l0LCBjaGFyICpidWZ0AAZjaGFyICp0ABBnZXRfYXZwaHlzX3BhZ2Vzc3EAfgAKdAESCiAgICAgICAgVGhlIDxDT0RFPmdldF9waHlzX3BhZ2VzPC9DT0RFPiBmdW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIHBhZ2VzIG9mCiAgICAgICAgIHBoeXNpY2FsIHRoZSBzeXN0ZW0gaGFzLiAgVG8gZ2V0IHRoZSBhbW91bnQgb2YgbWVtb3J5IHRoaXMgbnVtYmVyIGhhcyB0bwogICAgICAgICBiZSBtdWx0aXBsaWVkIGJ5IHRoZSBwYWdlIHNpemUuCiAgICAgICAgIDxicj48YnI+IFRoaXMgZnVuY3Rpb24gaXMgYSBHTlUgZXh0ZW5zaW9uLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AA1zeXMvc3lzaW5mby5oeHEAfgtgdAAEdm9pZHQACGxvbmcgaW50dAAUZ2V0X2N1cnJlbnRfZGlyX25hbWVzcQB+AAp0AlYKCiAgICAgICAgIFRoaXMgPENPREU+Z2V0X2N1cnJlbnRfZGlyX25hbWU8L0NPREU+IGZ1bmN0aW9uIGlzIGJhc2ljYWxseSBlcXVpdmFsZW50IHRvCiAgICAgICAgIDxDT0RFPmdldGN3ZCAoTlVMTCwgMCk8L0NPREU+LiAgVGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZSB2YWx1ZSBvZgogICAgICAgICB0aGUgPENPREU+UFdEPC9DT0RFPiB2YXJpYWJsZSBpcyByZXR1cm5lZCBpZiB0aGlzIHZhbHVlIGlzIGNvcnJlY3QuICBUaGlzIGlzIGEKICAgICAgICAgc3VidGxlIGRpZmZlcmVuY2Ugd2hpY2ggaXMgdmlzaWJsZSBpZiB0aGUgcGF0aCBkZXNjcmliZWQgYnkgdGhlCiAgICAgICAgIDxDT0RFPlBXRDwvQ09ERT4gdmFsdWUgaXMgdXNpbmcgb25lIG9yIG1vcmUgc3ltYm9sIGxpbmtzIGluIHdoaWNoIGNhc2UgdGhlCiAgICAgICAgIHZhbHVlIHJldHVybmVkIGJ5IDxDT0RFPmdldGN3ZDwvQ09ERT4gY2FuIHJlc29sdmUgdGhlIHN5bWJvbCBsaW5rcyBhbmQKICAgICAgICAgdGhlcmVmb3JlIHlpZWxkIGEgZGlmZmVyZW50IHJlc3VsdC4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiBpcyBhIEdOVSBleHRlbnNpb24uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHVuaXN0ZC5oeHEAfgtndAAEdm9pZHQABmNoYXIgKnQACmdldF9ucHJvY3NzcQB+AAp0AJYKICAgICAgICBUaGUgPENPREU+Z2V0X25wcm9jczwvQ09ERT4gZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBwcm9jZXNzb3JzLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIGlzIGEgR05VIGV4dGVuc2lvbi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAANc3lzL3N5c2luZm8uaHhxAH4LbnQABHZvaWR0AANpbnR0AA9nZXRfbnByb2NzX2NvbmZzcQB+AAp0ALoKICAgICAgICBUaGUgPENPREU+Z2V0X25wcm9jc19jb25mPC9DT0RFPiBmdW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIgb2YgcHJvY2Vzc29ycyB0aGUKICAgICAgICAgb3BlcmF0aW5nIHN5c3RlbSBjb25maWd1cmVkLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIGlzIGEgR05VIGV4dGVuc2lvbi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAANc3lzL3N5c2luZm8uaHhxAH4LdXQABHZvaWR0AANpbnR0AA5nZXRfcGh5c19wYWdlc3NxAH4ACnQBDgogICAgICAgIFRoZSA8Q09ERT5nZXRfcGh5c19wYWdlczwvQ09ERT4gZnVuY3Rpb24gcmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIG9mCiAgICAgICAgIHBoeXNpY2FsIHRoZSBzeXN0ZW0gaGFzLiAgVG8gZ2V0IHRoZSBhbW91bnQgb2YgbWVtb3J5IHRoaXMgbnVtYmVyIGhhcyB0bwogICAgICAgICBiZSBtdWx0aXBsaWVkIGJ5IHRoZSBwYWdlIHNpemUuCiAgICAgICAgIDxicj48YnI+IFRoaXMgZnVuY3Rpb24gaXMgYSBHTlUgZXh0ZW5zaW9uLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AA1zeXMvc3lzaW5mby5oeHEAfgt8dAAEdm9pZHQACGxvbmcgaW50dAAEZ2V0Y3NxAH4ACnQBXQogICAgICAgIFRoaXMgaXMganVzdCBsaWtlIDxDT0RFPmZnZXRjPC9DT0RFPiwgZXhjZXB0IHRoYXQgaXQgaXMgcGVybWlzc2libGUgKGFuZAogICAgICAgICB0eXBpY2FsKSBmb3IgaXQgdG8gYmUgaW1wbGVtZW50ZWQgYXMgYSBtYWNybyB0aGF0IGV2YWx1YXRlcyB0aGUKICAgICAgICAgPFZBUj5zdHJlYW08L1ZBUj4gYXJndW1lbnQgbW9yZSB0aGFuIG9uY2UuICA8Q09ERT5nZXRjPC9DT0RFPiBpcyBvZnRlbiBoaWdobHkKICAgICAgICAgb3B0aW1pemVkLCBzbyBpdCBpcyB1c3VhbGx5IHRoZSBiZXN0IGZ1bmN0aW9uIHRvIHVzZSB0byByZWFkIGEgc2luZ2xlCiAgICAgICAgIGNoYXJhY3Rlci4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHc3RkaW8uaHhxAH4Lg3QADEZJTEUgKnN0cmVhbXQAA2ludHQADWdldGNfdW5sb2NrZWRzcQB+AAp0AKYKICAgICAgICBUaGUgPENPREU+Z2V0Y191bmxvY2tlZDwvQ09ERT4gZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byB0aGUgPENPREU+Z2V0YzwvQ09ERT4KICAgICAgICAgZnVuY3Rpb24gZXhjZXB0IHRoYXQgaXQgZG9lcyBub3QgaW1wbGljaXRseSBsb2NrIHRoZSBzdHJlYW0uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3N0ZGlvLmh4cQB+C4p0AAxGSUxFICpzdHJlYW10AANpbnR0AAdnZXRjaGFyc3EAfgAKdACnCiAgICAgICAgVGhlIDxDT0RFPmdldGNoYXI8L0NPREU+IGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gPENPREU+Z2V0YzwvQ09ERT4gd2l0aCA8Q09ERT5zdGRpbjwvQ09ERT4KICAgICAgICAgYXMgdGhlIHZhbHVlIG9mIHRoZSA8VkFSPnN0cmVhbTwvVkFSPiBhcmd1bWVudC4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHc3RkaW8uaHhxAH4LkXQABHZvaWR0AANpbnR0ABBnZXRjaGFyX3VubG9ja2Vkc3EAfgAKdACsCiAgICAgICAgVGhlIDxDT0RFPmdldGNoYXJfdW5sb2NrZWQ8L0NPREU+IGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gdGhlIDxDT0RFPmdldGNoYXI8L0NPREU+CiAgICAgICAgIGZ1bmN0aW9uIGV4Y2VwdCB0aGF0IGl0IGRvZXMgbm90IGltcGxpY2l0bHkgbG9jayB0aGUgc3RyZWFtLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAdzdGRpby5oeHEAfguYdAAEdm9pZHQAA2ludHQACmdldGNvbnRleHRzcQB+AAp0AhUKICAgICAgICBUaGUgPENPREU+Z2V0Y29udGV4dDwvQ09ERT4gZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIHZhcmlhYmxlIHBvaW50ZWQgdG8gYnkKICAgICAgICAgPFZBUj51Y3A8L1ZBUj4gd2l0aCB0aGUgY29udGV4dCBvZiB0aGUgY2FsbGluZyB0aHJlYWQuICBUaGUgY29udGV4dCBjb250YWlucwogICAgICAgICB0aGUgY29udGVudCBvZiB0aGUgcmVnaXN0ZXJzLCB0aGUgc2lnbmFsIG1hc2ssIGFuZCB0aGUgY3VycmVudCBzdGFjay4KICAgICAgICAgRXhlY3V0aW5nIHRoZSBjb250ZW50cyB3b3VsZCBzdGFydCBhdCB0aGUgcG9pbnQgd2hlcmUgdGhlCiAgICAgICAgIDxDT0RFPmdldGNvbnRleHQ8L0NPREU+IGNhbGwganVzdCByZXR1cm5lZC4KICAgICAgICAgPGJyPjxicj4gVGhlIGZ1bmN0aW9uIHJldHVybnMgPENPREU+MDwvQ09ERT4gaWYgc3VjY2Vzc2Z1bC4gIE90aGVyd2lzZSBpdCByZXR1cm5zCiAgICAgICAgIDxDT0RFPi0xPC9DT0RFPiBhbmQgc2V0cyA8VkFSPmVycm5vPC9WQVI+IGFjY29yZGluZ2x5LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAp1Y29udGV4dC5oeHEAfgufdAAPdWNvbnRleHRfdCAqdWNwdAADaW50dAAGZ2V0Y3dkc3EAfgAKdAVcCiAgICAgICAgVGhlIDxDT0RFPmdldGN3ZDwvQ09ERT4gZnVuY3Rpb24gcmV0dXJucyBhbiBhYnNvbHV0ZSBmaWxlIG5hbWUgcmVwcmVzZW50aW5nCiAgICAgICAgIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCBzdG9yaW5nIGl0IGluIHRoZSBjaGFyYWN0ZXIgYXJyYXkKICAgICAgICAgPFZBUj5idWZmZXI8L1ZBUj4gdGhhdCB5b3UgcHJvdmlkZS4gIFRoZSA8VkFSPnNpemU8L1ZBUj4gYXJndW1lbnQgaXMgaG93IHlvdSB0ZWxsCiAgICAgICAgIHRoZSBzeXN0ZW0gdGhlIGFsbG9jYXRpb24gc2l6ZSBvZiA8VkFSPmJ1ZmZlcjwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gVGhlIEdOVSBsaWJyYXJ5IHZlcnNpb24gb2YgdGhpcyBmdW5jdGlvbiBhbHNvIHBlcm1pdHMgeW91IHRvIHNwZWNpZnkgYQogICAgICAgICBudWxsIHBvaW50ZXIgZm9yIHRoZSA8VkFSPmJ1ZmZlcjwvVkFSPiBhcmd1bWVudC4gIFRoZW4gPENPREU+Z2V0Y3dkPC9DT0RFPgogICAgICAgICBhbGxvY2F0ZXMgYSBidWZmZXIgYXV0b21hdGljYWxseSwgYXMgd2l0aCA8Q09ERT5tYWxsb2M8L0NPREU+CiAgICAgICAgIC4gIElmIHRoZSA8VkFSPnNpemU8L1ZBUj4gaXMgZ3JlYXRlciB0aGFuCiAgICAgICAgIHplcm8sIHRoZW4gdGhlIGJ1ZmZlciBpcyB0aGF0IGxhcmdlOyBvdGhlcndpc2UsIHRoZSBidWZmZXIgaXMgYXMgbGFyZ2UKICAgICAgICAgYXMgbmVjZXNzYXJ5IHRvIGhvbGQgdGhlIHJlc3VsdC4KICAgICAgICAgPGJyPjxicj4gVGhlIHJldHVybiB2YWx1ZSBpcyA8VkFSPmJ1ZmZlcjwvVkFSPiBvbiBzdWNjZXNzIGFuZCBhIG51bGwgcG9pbnRlciBvbiBmYWlsdXJlLgogICAgICAgICBUaGUgZm9sbG93aW5nIDxDT0RFPmVycm5vPC9DT0RFPiBlcnJvciBjb25kaXRpb25zIGFyZSBkZWZpbmVkIGZvciB0aGlzIGZ1bmN0aW9uOgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8RFQ+PENPREU+RUlOVkFMPC9DT0RFPgo8REQ+CiAgICAgICAgIFRoZSA8VkFSPnNpemU8L1ZBUj4gYXJndW1lbnQgaXMgemVybyBhbmQgPFZBUj5idWZmZXI8L1ZBUj4gaXMgbm90IGEgbnVsbCBwb2ludGVyLgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVSQU5HRQogICAgICAgICBUaGUgPFZBUj5zaXplPC9WQVI+IGFyZ3VtZW50IGlzIGxlc3MgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoZSB3b3JraW5nIGRpcmVjdG9yeQogICAgICAgICBuYW1lLiAgWW91IG5lZWQgdG8gYWxsb2NhdGUgYSBiaWdnZXIgYXJyYXkgYW5kIHRyeSBhZ2Fpbi4KICAgICAgICAgPGJyPjxicj4gPExJPiBFQUNDRVMKICAgICAgICAgUGVybWlzc2lvbiB0byByZWFkIG9yIHNlYXJjaCBhIGNvbXBvbmVudCBvZiB0aGUgZmlsZSBuYW1lIHdhcyBkZW5pZWQuCgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAh1bmlzdGQuaHhxAH4LpnQAGWNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemV0AAZjaGFyICp0AAdnZXRkYXRlc3EAfgAKdBX9CiAgICAgICAgVGhlIGludGVyZmFjZSB0byA8Q09ERT5nZXRkYXRlPC9DT0RFPiBpcyB0aGUgc2ltcGxlc3QgcG9zc2libGUgZm9yIGEgZnVuY3Rpb24KICAgICAgICAgdG8gcGFyc2UgYSBzdHJpbmcgYW5kIHJldHVybiB0aGUgdmFsdWUuICA8VkFSPnN0cmluZzwvVkFSPiBpcyB0aGUgaW5wdXQKICAgICAgICAgc3RyaW5nIGFuZCB0aGUgcmVzdWx0IGlzIHJldHVybmVkIGluIGEgc3RhdGljYWxseS1hbGxvY2F0ZWQgdmFyaWFibGUuCiAgICAgICAgIDxicj48YnI+IFRoZSBkZXRhaWxzIGFib3V0IGhvdyB0aGUgc3RyaW5nIGlzIHByb2Nlc3NlZCBhcmUgaGlkZGVuIGZyb20gdGhlIHVzZXIuCiAgICAgICAgIEluIGZhY3QsIHRoZXkgY2FuIGJlIG91dHNpZGUgdGhlIGNvbnRyb2wgb2YgdGhlIHByb2dyYW0uICBXaGljaCBmb3JtYXRzCiAgICAgICAgIGFyZSByZWNvZ25pemVkIGlzIGNvbnRyb2xsZWQgYnkgdGhlIGZpbGUgbmFtZWQgYnkgdGhlIGVudmlyb25tZW50CiAgICAgICAgIHZhcmlhYmxlIDxDT0RFPkRBVEVNU0s8L0NPREU+LiAgVGhpcyBmaWxlIHNob3VsZCBjb250YWluCiAgICAgICAgIGxpbmVzIG9mIHZhbGlkIGZvcm1hdCBzdHJpbmdzIHdoaWNoIGNvdWxkIGJlIHBhc3NlZCB0byA8Q09ERT5zdHJwdGltZTwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IFRoZSA8Q09ERT5nZXRkYXRlPC9DT0RFPiBmdW5jdGlvbiByZWFkcyB0aGVzZSBmb3JtYXQgc3RyaW5ncyBvbmUgYWZ0ZXIgdGhlCiAgICAgICAgIG90aGVyIGFuZCB0cmllcyB0byBtYXRjaCB0aGUgaW5wdXQgc3RyaW5nLiAgVGhlIGZpcnN0IGxpbmUgd2hpY2gKICAgICAgICAgY29tcGxldGVseSBtYXRjaGVzIHRoZSBpbnB1dCBzdHJpbmcgaXMgdXNlZC4KICAgICAgICAgPGJyPjxicj4gRWxlbWVudHMgbm90IGluaXRpYWxpemVkIHRocm91Z2ggdGhlIGZvcm1hdCBzdHJpbmcgcmV0YWluIHRoZSB2YWx1ZXMKICAgICAgICAgcHJlc2VudCBhdCB0aGUgdGltZSBvZiB0aGUgPENPREU+Z2V0ZGF0ZTwvQ09ERT4gZnVuY3Rpb24gY2FsbC4KICAgICAgICAgPGJyPjxicj4gVGhlIGZvcm1hdHMgcmVjb2duaXplZCBieSA8Q09ERT5nZXRkYXRlPC9DT0RFPiBhcmUgdGhlIHNhbWUgYXMgZm9yCiAgICAgICAgIDxDT0RFPnN0cnB0aW1lPC9DT0RFPi4gIFNlZSBhYm92ZSBmb3IgYW4gZXhwbGFuYXRpb24uICBUaGVyZSBhcmUgb25seSBhIGZldwogICAgICAgICBleHRlbnNpb25zIHRvIHRoZSA8Q09ERT5zdHJwdGltZTwvQ09ERT4gYmVoYXZpb3I6CiAgICAgICAgIDxicj48YnI+IDxPTD4KICAgICAgICAgPExJPgogICAgICAgICBJZiB0aGUgPENPREU+JVo8L0NPREU+IGZvcm1hdCBpcyBnaXZlbiB0aGUgYnJva2VuLWRvd24gdGltZSBpcyBiYXNlZCBvbiB0aGUKICAgICAgICAgY3VycmVudCB0aW1lIG9mIHRoZSB0aW1lem9uZSBtYXRjaGVkLCBub3Qgb2YgdGhlIGN1cnJlbnQgdGltZXpvbmUgb2YgdGhlCiAgICAgICAgIHJ1bnRpbWUgZW52aXJvbm1lbnQuCiAgICAgICAgIDxicj48YnI+IDxFTT5Ob3RlPC9FTT46IFRoaXMgaXMgbm90IGltcGxlbWVudGVkIChjdXJyZW50bHkpLiAgVGhlIHByb2JsZW0gaXMgdGhhdAogICAgICAgICB0aW1lem9uZSBuYW1lcyBhcmUgbm90IHVuaXF1ZS4gIElmIGEgZml4ZWQgdGltZXpvbmUgaXMgYXNzdW1lZCBmb3IgYQogICAgICAgICBnaXZlbiBzdHJpbmcgKHNheSA8Q09ERT5FU1Q8L0NPREU+IG1lYW5pbmcgVVMgRWFzdCBDb2FzdCB0aW1lKSwgdGhlbiB1c2VzIGZvcgogICAgICAgICBjb3VudHJpZXMgb3RoZXIgdGhhbiB0aGUgVVNBIHdpbGwgZmFpbC4gIFNvIGZhciB3ZSBoYXZlIGZvdW5kIG5vIGdvb2QKICAgICAgICAgc29sdXRpb24gdG8gdGhpcy4KICAgICAgICAgPGJyPjxicj4gPExJPgogICAgICAgICBJZiBvbmx5IHRoZSB3ZWVrZGF5IGlzIHNwZWNpZmllZCB0aGUgc2VsZWN0ZWQgZGF5IGRlcGVuZHMgb24gdGhlIGN1cnJlbnQKICAgICAgICAgZGF0ZS4gIElmIHRoZSBjdXJyZW50IHdlZWtkYXkgaXMgZ3JlYXRlciBvciBlcXVhbCB0byB0aGUgPENPREU+dG1fd2RheTwvQ09ERT4KICAgICAgICAgdmFsdWUgdGhlIGN1cnJlbnQgd2VlaydzIGRheSBpcyBjaG9zZW4sIG90aGVyd2lzZSB0aGUgZGF5IG5leHQgd2VlayBpcyBjaG9zZW4uCiAgICAgICAgIDxicj48YnI+IDxMST4KICAgICAgICAgQSBzaW1pbGFyIGhldXJpc3RpYyBpcyB1c2VkIHdoZW4gb25seSB0aGUgbW9udGggaXMgZ2l2ZW4gYW5kIG5vdCB0aGUKICAgICAgICAgeWVhci4gIElmIHRoZSBtb250aCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGN1cnJlbnQgbW9udGgsIHRoZW4KICAgICAgICAgdGhlIGN1cnJlbnQgeWVhciBpcyB1c2VkLiAgT3RoZXJ3aXNlIGl0IHdyYXBzIHRvIG5leHQgeWVhci4gIFRoZSBmaXJzdAogICAgICAgICBkYXkgb2YgdGhlIG1vbnRoIGlzIGFzc3VtZWQgaWYgb25lIGlzIG5vdCBleHBsaWNpdGx5IHNwZWNpZmllZC4KICAgICAgICAgPGJyPjxicj4gPExJPgogICAgICAgICBUaGUgY3VycmVudCBob3VyLCBtaW51dGUsIGFuZCBzZWNvbmQgYXJlIHVzZWQgaWYgdGhlIGFwcHJvcHJpYXRlIHZhbHVlIGlzCiAgICAgICAgIG5vdCBzZXQgdGhyb3VnaCB0aGUgZm9ybWF0LgogICAgICAgICA8YnI+PGJyPiA8TEk+CiAgICAgICAgIElmIG5vIGRhdGUgaXMgZ2l2ZW4gdG9tb3Jyb3cncyBkYXRlIGlzIHVzZWQgaWYgdGhlIHRpbWUgaXMKICAgICAgICAgc21hbGxlciB0aGFuIHRoZSBjdXJyZW50IHRpbWUuICBPdGhlcndpc2UgdG9kYXkncyBkYXRlIGlzIHRha2VuLgogICAgICAgICA8L09MPgogICAgICAgICA8YnI+PGJyPiBJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB0aGUgZm9ybWF0IGluIHRoZSB0ZW1wbGF0ZSBmaWxlIG5lZWQgbm90IG9ubHkKICAgICAgICAgY29udGFpbiBmb3JtYXQgZWxlbWVudHMuICBUaGUgZm9sbG93aW5nIGlzIGEgbGlzdCBvZiBwb3NzaWJsZSBmb3JtYXQKICAgICAgICAgc3RyaW5ncyAodGFrZW4gZnJvbSB0aGUgVW5peCBzdGFuZGFyZCk6CiAgICAgICAgIDxicj48YnI+IDxwcmU+PGJyPgogICAgICAgICAlbTxicj4KICAgICAgICAgJUEgJUIgJWQsICVZICVIOiVNOiVTPGJyPgogICAgICAgICAlQTxicj4KICAgICAgICAgJUI8YnI+CiAgICAgICAgICVtLyVkLyV5ICVJICVwPGJyPgogICAgICAgICAlZCwlbSwlWSAlSDolTTxicj4KICAgICAgICAgYXQgJUEgdGhlICVkc3Qgb2YgJUIgaW4gJVk8YnI+CiAgICAgICAgIHJ1biBqb2IgYXQgJUkgJXAsJUIgJWRuZDxicj4KICAgICAgICAgJUEgZGVuICVkLiAlQiAlWSAlSC4lTSBVaHI8YnI+CiAgICAgICAgIDwvcHJlPgogICAgICAgICA8YnI+PGJyPiBBcyB5b3UgY2FuIHNlZSwgdGhlIHRlbXBsYXRlIGxpc3QgY2FuIGNvbnRhaW4gdmVyeSBzcGVjaWZpYyBzdHJpbmdzIGxpa2UKICAgICAgICAgPENPREU+cnVuIGpvYiBhdCAlSSAlcCwlQiAlZG5kPC9DT0RFPi4gIFVzaW5nIHRoZSBhYm92ZSBsaXN0IG9mIHRlbXBsYXRlcyBhbmQKICAgICAgICAgYXNzdW1pbmcgdGhlIGN1cnJlbnQgdGltZSBpcyBNb24gU2VwIDIyIDEyOjE5OjQ3IEVEVCAxOTg2IHdlIGNhbiBvYnRhaW4gdGhlCiAgICAgICAgIGZvbGxvd2luZyByZXN1bHRzIGZvciB0aGUgZ2l2ZW4gaW5wdXQuCiAgICAgICAgIDxicj48YnI+IDxETD4KPERUPjxwcmU+SW5wdXQgICAgICBNYXRjaCAgUmVzdWx0PC9wcmU+CjxERD48YnI+IDxEVD48cHJlPk1vbiAgICAgICAgJWEgICAgIE1vbiBTZXAgMjIgMTI6MTk6NDcgRURUIDE5ODY8L3ByZT4KPEREPjxicj4gPERUPjxwcmU+U3VuICAgICAgICAlYSAgICAgU3VuIFNlcCAyOCAxMjoxOTo0NyBFRFQgMTk4NjwvcHJlPgo8REQ+PGJyPiA8RFQ+PHByZT5GcmkgICAgICAgICVhICAgICBGcmkgU2VwIDI2IDEyOjE5OjQ3IEVEVCAxOTg2PC9wcmU+CjxERD48YnI+IDxEVD48cHJlPlNlcHRlbWJlciAgJUIgICAgIE1vbiBTZXAgMSAxMjoxOTo0NyBFRFQgMTk4NjwvcHJlPgo8REQ+PGJyPiA8RFQ+PHByZT5KYW51YXJ5ICAgICVCICAgICBUaHUgSmFuIDEgMTI6MTk6NDcgRVNUIDE5ODc8L3ByZT4KPEREPjxicj4gPERUPjxwcmU+RGVjZW1iZXIgICAlQiAgICAgTW9uIERlYyAxIDEyOjE5OjQ3IEVTVCAxOTg2PC9wcmU+CjxERD48YnI+IDxEVD48cHJlPlNlcCBNb24gICAgJWIgJWEgIE1vbiBTZXAgMSAxMjoxOTo0NyBFRFQgMTk4NjwvcHJlPgo8REQ+PGJyPiA8RFQ+PHByZT5KYW4gRnJpICAgICViICVhICBGcmkgSmFuIDIgMTI6MTk6NDcgRVNUIDE5ODc8L3ByZT4KPEREPjxicj4gPERUPjxwcmU+RGVjIE1vbiAgICAlYiAlYSAgTW9uIERlYyAxIDEyOjE5OjQ3IEVTVCAxOTg2PC9wcmU+CjxERD48YnI+IDxEVD48cHJlPkphbiBXZWQgMTk4OSAgICViICVhICVZICBXZWQgSmFuIDQgMTI6MTk6NDcgRVNUIDE5ODk8L3ByZT4KPEREPjxicj4gPERUPjxwcmU+RnJpIDkgICAgICAlYSAlSCAgRnJpIFNlcCAyNiAwOTowMDowMCBFRFQgMTk4NjwvcHJlPgo8REQ+PGJyPiA8RFQ+PHByZT5GZWIgMTA6MzAgICViICVIOiVTICBTdW4gRmViIDEgMTA6MDA6MzAgRVNUIDE5ODc8L3ByZT4KPEREPjxicj4gPERUPjxwcmU+MTA6MzAgICAgICAlSDolTSAgVHVlIFNlcCAyMyAxMDozMDowMCBFRFQgMTk4NjwvcHJlPgo8REQ+PGJyPiA8RFQ+PHByZT4xMzozMCAgICAgICVIOiVNICBNb24gU2VwIDIyIDEzOjMwOjAwIEVEVCAxOTg2PC9wcmU+CjxERD48YnI+IDwvREw+CiAgICAgICAgIDxicj48YnI+IFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9uIGlzIGEgcG9pbnRlciB0byBhIHN0YXRpYyB2YXJpYWJsZSBvZgogICAgICAgICB0eXBlIDxDT0RFPnN0cnVjdCB0bTwvQ09ERT4sIG9yIGEgbnVsbCBwb2ludGVyIGlmIGFuIGVycm9yIG9jY3VycmVkLiAgVGhlCiAgICAgICAgIHJlc3VsdCBpcyBvbmx5IHZhbGlkIHVudGlsIHRoZSBuZXh0IDxDT0RFPmdldGRhdGU8L0NPREU+IGNhbGwsIG1ha2luZyB0aGlzCiAgICAgICAgIGZ1bmN0aW9uIHVudXNhYmxlIGluIG11bHRpLXRocmVhZGVkIGFwcGxpY2F0aW9ucy4KICAgICAgICAgPGJyPjxicj4gVGhlIDxDT0RFPmVycm5vPC9DT0RFPiB2YXJpYWJsZSBpcyA8RU0+bm90PC9FTT4gY2hhbmdlZC4gIEVycm9yIGNvbmRpdGlvbnMgYXJlCiAgICAgICAgIHN0b3JlZCBpbiB0aGUgZ2xvYmFsIHZhcmlhYmxlIDxDT0RFPmdldGRhdGVfZXJyPC9DT0RFPi4gIFNlZSB0aGUKICAgICAgICAgZGVzY3JpcHRpb24gYWJvdmUgZm9yIGEgbGlzdCBvZiB0aGUgcG9zc2libGUgZXJyb3IgdmFsdWVzLgogICAgICAgICA8YnI+PGJyPiA8RU0+V2FybmluZzo8L0VNPiBUaGUgPENPREU+Z2V0ZGF0ZTwvQ09ERT4gZnVuY3Rpb24gc2hvdWxkIDxFTT5uZXZlcjwvRU0+IGJlCiAgICAgICAgIHVzZWQgaW4gU1VJRC1wcm9ncmFtcy4gIFRoZSByZWFzb24gaXMgb2J2aW91czogdXNpbmcgdGhlCiAgICAgICAgIDxDT0RFPkRBVEVNU0s8L0NPREU+IGVudmlyb25tZW50IHZhcmlhYmxlIHlvdSBjYW4gZ2V0IHRoZSBmdW5jdGlvbiB0byBvcGVuCiAgICAgICAgIGFueSBhcmJpdHJhcnkgZmlsZSBhbmQgY2hhbmNlcyBhcmUgaGlnaCB0aGF0IHdpdGggc29tZSBib2d1cyBpbnB1dAogICAgICAgICAoc3VjaCBhcyBhIGJpbmFyeSBmaWxlKSB0aGUgcHJvZ3JhbSB3aWxsIGNyYXNoLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZ0aW1lLmh4cQB+C610ABJjb25zdCBjaGFyICpzdHJpbmd0AAtzdHJ1Y3QgdG0gKnQACWdldGRhdGVfcnNxAH4ACnQDaAogICAgICAgIFRoZSA8Q09ERT5nZXRkYXRlX3I8L0NPREU+IGZ1bmN0aW9uIGlzIHRoZSByZWVudHJhbnQgY291bnRlcnBhcnQgb2YKICAgICAgICAgPENPREU+Z2V0ZGF0ZTwvQ09ERT4uICBJdCBkb2VzIG5vdCB1c2UgdGhlIGdsb2JhbCB2YXJpYWJsZSA8Q09ERT5nZXRkYXRlX2VycjwvQ09ERT4KICAgICAgICAgdG8gc2lnbmFsIGFuIGVycm9yLCBidXQgaW5zdGVhZCByZXR1cm5zIGFuIGVycm9yIGNvZGUuICBUaGUgc2FtZSBlcnJvcgogICAgICAgICBjb2RlcyBhcyBkZXNjcmliZWQgaW4gdGhlIDxDT0RFPmdldGRhdGVfZXJyPC9DT0RFPiBkb2N1bWVudGF0aW9uIGFib3ZlIGFyZQogICAgICAgICB1c2VkLCB3aXRoIDAgbWVhbmluZyBzdWNjZXNzLgogICAgICAgICA8YnI+PGJyPiBNb3Jlb3ZlciwgPENPREU+Z2V0ZGF0ZV9yPC9DT0RFPiBzdG9yZXMgdGhlIGJyb2tlbi1kb3duIHRpbWUgaW4gdGhlIHZhcmlhYmxlCiAgICAgICAgIG9mIHR5cGUgPENPREU+c3RydWN0IHRtPC9DT0RFPiBwb2ludGVkIHRvIGJ5IHRoZSBzZWNvbmQgYXJndW1lbnQsIHJhdGhlciB0aGFuCiAgICAgICAgIGluIGEgc3RhdGljIHZhcmlhYmxlLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBkZWZpbmVkIGluIHRoZSBVbml4IHN0YW5kYXJkLiAgTmV2ZXJ0aGVsZXNzIGl0IGlzCiAgICAgICAgIGF2YWlsYWJsZSBvbiBzb21lIG90aGVyIFVuaXggc3lzdGVtcyBhcyB3ZWxsLgogICAgICAgICA8YnI+PGJyPiBUaGUgd2FybmluZyBhZ2FpbnN0IHVzaW5nIDxDT0RFPmdldGRhdGU8L0NPREU+IGluIFNVSUQtcHJvZ3JhbXMgYXBwbGllcyB0bwogICAgICAgICA8Q09ERT5nZXRkYXRlX3I8L0NPREU+IGFzIHdlbGwuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQABnRpbWUuaHhxAH4LtHQAIWNvbnN0IGNoYXIgKnN0cmluZywgc3RydWN0IHRtICp0cHQAA2ludHQACGdldGRlbGltc3EAfgAKdAOKCiAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBsaWtlIDxDT0RFPmdldGxpbmU8L0NPREU+IGV4Y2VwdCB0aGF0IHRoZSBjaGFyYWN0ZXIgd2hpY2gKICAgICAgICAgdGVsbHMgaXQgdG8gc3RvcCByZWFkaW5nIGlzIG5vdCBuZWNlc3NhcmlseSBuZXdsaW5lLiAgVGhlIGFyZ3VtZW50CiAgICAgICAgIDxWQVI+ZGVsaW1pdGVyPC9WQVI+IHNwZWNpZmllcyB0aGUgZGVsaW1pdGVyIGNoYXJhY3RlcjsgPENPREU+Z2V0ZGVsaW08L0NPREU+IGtlZXBzCiAgICAgICAgIHJlYWRpbmcgdW50aWwgaXQgc2VlcyB0aGF0IGNoYXJhY3RlciAob3IgZW5kIG9mIGZpbGUpLgogICAgICAgICA8YnI+PGJyPiBUaGUgdGV4dCBpcyBzdG9yZWQgaW4gPFZBUj5saW5lcHRyPC9WQVI+LCBpbmNsdWRpbmcgdGhlIGRlbGltaXRlciBjaGFyYWN0ZXIKICAgICAgICAgYW5kIGEgdGVybWluYXRpbmcgbnVsbC4gIExpa2UgPENP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IHRoZSA8Q09ERT5mc19maWxlPC9DT0RFPiBlbGVtZW50LgogICAgICAgICBTaW5jZSB0aGVyZSBpcyBub3JtYWxseSBleGFjdGx5IG9uZSBlbnRyeSBmb3IgZWFjaCBtb3VudCBwb2ludCBpdAogICAgICAgICBtYWtlcyBubyBzZW5zZSB0byBjYWxsIHRoaXMgZnVuY3Rpb24gbW9yZSB0aGFuIG9uY2UgZm9yIHRoZSBzYW1lCiAgICAgICAgIGFyZ3VtZW50LiAgSWYgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbCB0byBhbnkgb2YgdGhlIGZ1bmN0aW9ucyBoYW5kbGluZwogICAgICAgICA8VFQ+ZnN0YWI8L1RUPiBzaW5jZSBwcm9ncmFtIHN0YXJ0IG9yIHRoZSBsYXN0IGNhbGwgb2YgPENPREU+ZW5kZnNlbnQ8L0NPREU+LAogICAgICAgICB0aGUgZmlsZSB3aWxsIGJlIG9wZW5lZC4KICAgICAgICAgPGJyPjxicj4gVGhlIGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIHRvIGEgdmFyaWFibGUgb2YgdHlwZSA8Q09ERT5zdHJ1Y3QKICAgICAgICAgZnN0YWI8L0NPREU+LiAgVGhpcyB2YXJpYWJsZSBpcyBzaGFyZWQgYnkgYWxsIHRocmVhZHMgYW5kIHRoZXJlZm9yZSB0aGlzCiAgICAgICAgIGZ1bmN0aW9uIGlzIG5vdCB0aHJlYWQtc2FmZS4gIElmIGFuIGVycm9yIG9jY3VycmVkIDxDT0RFPmdldGZzZW50PC9DT0RFPgogICAgICAgICByZXR1cm5zIGEgPENPREU+TlVMTDwvQ09ERT4gcG9pbnRlci4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHZnN0YWIuaHhxAH4L5XQAEGNvbnN0IGNoYXIgKm5hbWV0AA5zdHJ1Y3QgZnN0YWIgKnQACWdldGZzc3BlY3NxAH4ACnQDPAogICAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbmV4dCBlbnRyeSBvZiB0aGUgPFRUPmZzdGFiPC9UVD4gZmlsZSB3aGljaCBoYXMKICAgICAgICAgYSBzdHJpbmcgZXF1YWwgdG8gPFZBUj5uYW1lPC9WQVI+IHBvaW50ZWQgdG8gYnkgdGhlIDxDT0RFPmZzX3NwZWM8L0NPREU+IGVsZW1lbnQuCiAgICAgICAgIFNpbmNlIHRoZXJlIGlzIG5vcm1hbGx5IGV4YWN0bHkgb25lIGVudHJ5IGZvciBlYWNoIHNwZWNpYWwgZGV2aWNlIGl0CiAgICAgICAgIG1ha2VzIG5vIHNlbnNlIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBtb3JlIHRoYW4gb25jZSBmb3IgdGhlIHNhbWUKICAgICAgICAgYXJndW1lbnQuICBJZiB0aGlzIGlzIHRoZSBmaXJzdCBjYWxsIHRvIGFueSBvZiB0aGUgZnVuY3Rpb25zIGhhbmRsaW5nCiAgICAgICAgIDxUVD5mc3RhYjwvVFQ+IHNpbmNlIHByb2dyYW0gc3RhcnQgb3IgdGhlIGxhc3QgY2FsbCBvZiA8Q09ERT5lbmRmc2VudDwvQ09ERT4sCiAgICAgICAgIHRoZSBmaWxlIHdpbGwgYmUgb3BlbmVkLgogICAgICAgICA8YnI+PGJyPiBUaGUgZnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gYSB2YXJpYWJsZSBvZiB0eXBlIDxDT0RFPnN0cnVjdAogICAgICAgICBmc3RhYjwvQ09ERT4uICBUaGlzIHZhcmlhYmxlIGlzIHNoYXJlZCBieSBhbGwgdGhyZWFkcyBhbmQgdGhlcmVmb3JlIHRoaXMKICAgICAgICAgZnVuY3Rpb24gaXMgbm90IHRocmVhZC1zYWZlLiAgSWYgYW4gZXJyb3Igb2NjdXJyZWQgPENPREU+Z2V0ZnNlbnQ8L0NPREU+CiAgICAgICAgIHJldHVybnMgYSA8Q09ERT5OVUxMPC9DT0RFPiBwb2ludGVyLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAdmc3RhYi5oeHEAfgvsdAAQY29uc3QgY2hhciAqbmFtZXQADnN0cnVjdCBmc3RhYiAqdAAGZ2V0Z2lkc3EAfgAKdABcCiAgICAgICAgVGhlIDxDT0RFPmdldGdpZDwvQ09ERT4gZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVhbCBncm91cCBJRCBvZiB0aGUgcHJvY2Vzcy4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIdW5pc3RkLmh4cQB+C/N0AAR2b2lkdAAFZ2lkX3R0AAhnZXRncmVudHNxAH4ACnQBgQogICAgICAgIFRoZSA8Q09ERT5nZXRncmVudDwvQ09ERT4gZnVuY3Rpb24gcmVhZHMgdGhlIG5leHQgZW50cnkgZnJvbSB0aGUgc3RyZWFtCiAgICAgICAgIGluaXRpYWxpemVkIGJ5IDxDT0RFPnNldGdyZW50PC9DT0RFPi4gIEl0IHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBlbnRyeS4gIFRoZQogICAgICAgICBzdHJ1Y3R1cmUgaXMgc3RhdGljYWxseSBhbGxvY2F0ZWQgYW5kIGlzIG92ZXJ3cml0dGVuIG9uIHN1YnNlcXVlbnQgY2FsbHMKICAgICAgICAgdG8gPENPREU+Z2V0Z3JlbnQ8L0NPREU+LiAgWW91IG11c3QgY29weSB0aGUgY29udGVudHMgb2YgdGhlIHN0cnVjdHVyZSBpZiB5b3UKICAgICAgICAgd2lzaCB0byBzYXZlIHRoZSBpbmZvcm1hdGlvbi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAFZ3JwLmh4cQB+C/p0AAR2b2lkdAAOc3RydWN0IGdyb3VwICp0AApnZXRncmVudF9yc3EAfgAKdAI5CiAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIDxDT0RFPmdldGdyZW50PC9DT0RFPiBpbiB0aGF0IGl0IHJldHVybnMgdGhlIG5leHQKICAgICAgICAgZW50cnkgZnJvbSB0aGUgc3RyZWFtIGluaXRpYWxpemVkIGJ5IDxDT0RFPnNldGdyZW50PC9DT0RFPi4gIExpa2UKICAgICAgICAgPENPREU+ZmdldGdyZW50X3I8L0NPREU+LCBpdCBwbGFjZXMgdGhlIHJlc3VsdCBpbiB1c2VyLXN1cHBsaWVkIGJ1ZmZlcnMKICAgICAgICAgcG9pbnRlZCB0byA8VkFSPnJlc3VsdF9idWY8L1ZBUj4gYW5kIDxWQVI+YnVmZmVyPC9WQVI+LgogICAgICAgICA8YnI+PGJyPiBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyB6ZXJvIDxWQVI+cmVzdWx0PC9WQVI+IGNvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUgZGF0YQogICAgICAgICAobm9ybWFsbHkgZXF1YWwgdG8gPFZBUj5yZXN1bHRfYnVmPC9WQVI+KS4gIElmIGVycm9ycyBvY2N1cnJlZCB0aGUgcmV0dXJuCiAgICAgICAgIHZhbHVlIGlzIG5vbi16ZXJvIGFuZCA8VkFSPnJlc3VsdDwvVkFSPiBjb250YWlucyBhIG51bGwgcG9pbnRlci4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAFZ3JwLmh4cQB+DAF0AExzdHJ1Y3QgZ3JvdXAgKnJlc3VsdF9idWYsIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGJ1Zmxlbiwgc3RydWN0IGdyb3VwICoqcmVzdWx0dAADaW50dAAIZ2V0Z3JnaWRzcQB+AAp0AV4KICAgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIHRvIGEgc3RhdGljYWxseS1hbGxvY2F0ZWQgc3RydWN0dXJlCiAgICAgICAgIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGdyb3VwIHdob3NlIGdyb3VwIElEIGlzIDxWQVI+Z2lkPC9WQVI+LgogICAgICAgICBUaGlzIHN0cnVjdHVyZSBtYXkgYmUgb3ZlcndyaXR0ZW4gYnkgc3Vic2VxdWVudCBjYWxscyB0bwogICAgICAgICA8Q09ERT5nZXRncmdpZDwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IEEgbnVsbCBwb2ludGVyIGluZGljYXRlcyB0aGVyZSBpcyBubyBncm91cCB3aXRoIElEIDxWQVI+Z2lkPC9WQVI+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAVncnAuaHhxAH4MCHQACWdpZF90IGdpZHQADnN0cnVjdCBncm91cCAqdAAKZ2V0Z3JnaWRfcnNxAH4ACnQEmwogICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byA8Q09ERT5nZXRncmdpZDwvQ09ERT4gaW4gdGhhdCBpdCByZXR1cm5zCiAgICAgICAgIGluZm9ybWF0aW9uIGFib3V0IHRoZSBncm91cCB3aG9zZSBncm91cCBJRCBpcyA8VkFSPmdpZDwvVkFSPi4gIEhvd2V2ZXIsIGl0CiAgICAgICAgIGZpbGxzIHRoZSB1c2VyIHN1cHBsaWVkIHN0cnVjdHVyZSBwb2ludGVkIHRvIGJ5IDxWQVI+cmVzdWx0X2J1ZjwvVkFSPiB3aXRoCiAgICAgICAgIHRoZSBpbmZvcm1hdGlvbiBpbnN0ZWFkIG9mIHVzaW5nIGEgc3RhdGljIGJ1ZmZlci4gIFRoZSBmaXJzdAogICAgICAgICA8VkFSPmJ1ZmxlbjwvVkFSPiBieXRlcyBvZiB0aGUgYWRkaXRpb25hbCBidWZmZXIgcG9pbnRlZCB0byBieSA8VkFSPmJ1ZmZlcjwvVkFSPgogICAgICAgICBhcmUgdXNlZCB0byBjb250YWluIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24sIG5vcm1hbGx5IHN0cmluZ3Mgd2hpY2ggYXJlCiAgICAgICAgIHBvaW50ZWQgdG8gYnkgdGhlIGVsZW1lbnRzIG9mIHRoZSByZXN1bHQgc3RydWN0dXJlLgogICAgICAgICA8YnI+PGJyPiBJZiBhIGdyb3VwIHdpdGggSUQgPFZBUj5naWQ8L1ZBUj4gaXMgZm91bmQsIHRoZSBwb2ludGVyIHJldHVybmVkIGluCiAgICAgICAgIDxWQVI+cmVzdWx0PC9WQVI+IHBvaW50cyB0byB0aGUgcmVjb3JkIHdoaWNoIGNvbnRhaW5zIHRoZSB3YW50ZWQgZGF0YSAoaS5lLiwKICAgICAgICAgPFZBUj5yZXN1bHQ8L1ZBUj4gY29udGFpbnMgdGhlIHZhbHVlIDxWQVI+cmVzdWx0X2J1ZjwvVkFSPikuICBJZiBubyBncm91cCBpcyBmb3VuZAogICAgICAgICBvciBpZiBhbiBlcnJvciBvY2N1cnJlZCwgdGhlIHBvaW50ZXIgcmV0dXJuZWQgaW4gPFZBUj5yZXN1bHQ8L1ZBUj4gaXMgYSBudWxsCiAgICAgICAgIHBvaW50ZXIuICBUaGUgZnVuY3Rpb24gcmV0dXJucyB6ZXJvIG9yIGFuIGVycm9yIGNvZGUuICBJZiB0aGUgYnVmZmVyCiAgICAgICAgIDxWQVI+YnVmZmVyPC9WQVI+IGlzIHRvbyBzbWFsbCB0byBjb250YWluIGFsbCB0aGUgbmVlZGVkIGluZm9ybWF0aW9uLCB0aGUKICAgICAgICAgZXJyb3IgY29kZSA8Q09ERT5FUkFOR0U8L0NPREU+IGlzIHJldHVybmVkIGFuZCA8VkFSPmVycm5vPC9WQVI+IGlzIHNldCB0bwogICAgICAgICA8Q09ERT5FUkFOR0U8L0NPREU+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAVncnAuaHhxAH4MD3QAV2dpZF90IGdpZCwgc3RydWN0IGdyb3VwICpyZXN1bHRfYnVmLCBjaGFyICpidWZmZXIsIHNpemVfdCBidWZsZW4sIHN0cnVjdCBncm91cCAqKnJlc3VsdHQAA2ludHQACGdldGdybmFtc3EAfgAKdAFgCiAgICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byBhIHN0YXRpY2FsbHktYWxsb2NhdGVkIHN0cnVjdHVyZQogICAgICAgICBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBncm91cCB3aG9zZSBncm91cCBuYW1lIGlzIDxWQVI+bmFtZTwvVkFSPi4KICAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgbWF5IGJlIG92ZXJ3cml0dGVuIGJ5IHN1YnNlcXVlbnQgY2FsbHMgdG8KICAgICAgICAgPENPREU+Z2V0Z3JuYW08L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBBIG51bGwgcG9pbnRlciBpbmRpY2F0ZXMgdGhlcmUgaXMgbm8gZ3JvdXAgbmFtZWQgPFZBUj5uYW1lPC9WQVI+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAVncnAuaHhxAH4MFnQAEGNvbnN0IGNoYXIgKm5hbWV0AA5zdHJ1Y3QgZ3JvdXAgKnQACmdldGdybmFtX3JzcQB+AAp0AaYKICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gPENPREU+Z2V0Z3JuYW08L0NPREU+IGluIHRoYXQgaXMgcmV0dXJucwogICAgICAgICBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZ3JvdXAgd2hvc2UgZ3JvdXAgbmFtZSBpcyA8VkFSPm5hbWU8L1ZBUj4uICBMaWtlCiAgICAgICAgIDxDT0RFPmdldGdyZ2lkX3I8L0NPREU+LCBpdCB1c2VzIHRoZSB1c2VyIHN1cHBsaWVkIGJ1ZmZlcnMgaW4KICAgICAgICAgPFZBUj5yZXN1bHRfYnVmPC9WQVI+IGFuZCA8VkFSPmJ1ZmZlcjwvVkFSPiwgbm90IGEgc3RhdGljIGJ1ZmZlci4KICAgICAgICAgPGJyPjxicj4gVGhlIHJldHVybiB2YWx1ZXMgYXJlIHRoZSBzYW1lIGFzIGZvciA8Q09ERT5nZXRncmdpZF9yPC9DT0RFPgogICAgICAgICA8Q09ERT5FUkFOR0U8L0NPREU+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAVncnAuaHhxAH4MHXQAXmNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBncm91cCAqcmVzdWx0X2J1ZiwgY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmbGVuLCBzdHJ1Y3QgZ3JvdXAgKipyZXN1bHR0AANpbnR0AAxnZXRncm91cGxpc3RzcQB+AAp0Bg8KICAgICAgICBUaGUgPENPREU+Z2V0Z3JvdXBsaXN0PC9DT0RFPiBmdW5jdGlvbiBzY2FucyB0aGUgZ3JvdXAgZGF0YWJhc2UgZm9yIGFsbCB0aGUKICAgICAgICAgZ3JvdXBzIDxWQVI+dXNlcjwvVkFSPiBiZWxvbmdzIHRvLiAgVXAgdG8gKjxWQVI+bmdyb3VwczwvVkFSPiBncm91cCBJRHMKICAgICAgICAgY29ycmVzcG9uZGluZyB0byB0aGVzZSBncm91cHMgYXJlIHN0b3JlZCBpbiB0aGUgYXJyYXkgPFZBUj5ncm91cHM8L1ZBUj47IHRoZQogICAgICAgICByZXR1cm4gdmFsdWUgZnJvbSB0aGUgZnVuY3Rpb24gaXMgdGhlIG51bWJlciBvZiBncm91cCBJRHMgYWN0dWFsbHkKICAgICAgICAgc3RvcmVkLiAgSWYgKjxWQVI+bmdyb3VwczwvVkFSPiBpcyBzbWFsbGVyIHRoYW4gdGhlIHRvdGFsIG51bWJlciBvZiBncm91cHMKICAgICAgICAgZm91bmQsIHRoZW4gPENPREU+Z2V0Z3JvdXBsaXN0PC9DT0RFPiByZXR1cm5zIGEgdmFsdWUgb2YgPENPREU+LTE8L0NPREU+IGFuZCBzdG9yZXMKICAgICAgICAgdGhlIGFjdHVhbCBudW1iZXIgb2YgZ3JvdXBzIGluICo8VkFSPm5ncm91cHM8L1ZBUj4uICBUaGUgZ3JvdXAgPFZBUj5ncm91cDwvVkFSPiBpcwogICAgICAgICBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIGluIHRoZSBsaXN0IG9mIGdyb3VwcyByZXR1cm5lZCBieQogICAgICAgICA8Q09ERT5nZXRncm91cGxpc3Q8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBIZXJlJ3MgaG93IHRvIHVzZSA8Q09ERT5nZXRncm91cGxpc3Q8L0NPREU+IHRvIHJlYWQgYWxsIHN1cHBsZW1lbnRhcnkgZ3JvdXBzCiAgICAgICAgIGZvciA8VkFSPnVzZXI8L1ZBUj46CiAgICAgICAgIDxicj48YnI+IDxwcmU+PGJyPgogICAgICAgICA8YnI+CiAgICAgICAgIGdpZF90ICo8YnI+CiAgICAgICAgIHN1cHBsZW1lbnRhcnlfZ3JvdXBzIChjaGFyICp1c2VyKTxicj4KICAgICAgICAgezxicj4KICAgICAgICAgICBpbnQgbmdyb3VwcyA9IDE2Ozxicj4KICAgICAgICAgICBnaWRfdCAqZ3JvdXBzPGJyPgogICAgICAgICAgICAgPSAoZ2lkX3QgKikgeG1hbGxvYyAobmdyb3VwcyAqIHNpemVvZiAoZ2lkX3QpKTs8YnI+CiAgICAgICAgICAgc3RydWN0IHBhc3N3ZCAqcHcgPSBnZXRwd25hbSAodXNlcik7PGJyPgogICAgICAgICA8YnI+PGJyPiAgIGlmIChwdyA9PSBOVUxMKTxicj4KICAgICAgICAgICAgIHJldHVybiBOVUxMOzxicj4KICAgICAgICAgPGJyPjxicj4gICBpZiAoZ2V0Z3JvdXBsaXN0IChwdy0+cHdfbmFtZSwgcHctPnB3X2dpZCwgZ3JvdXBzLCAmbmdyb3VwcykgPCAwKTxicj4KICAgICAgICAgICAgIHs8YnI+CiAgICAgICAgICAgICAgIGdyb3VwcyA9IHhyZWFsbG9jIChuZ3JvdXBzICogc2l6ZW9mIChnaWRfdCkpOzxicj4KICAgICAgICAgICAgICAgZ2V0Z3JvdXBsaXN0IChwdy0+cHdfbmFtZSwgcHctPnB3X2dpZCwgZ3JvdXBzLCAmbmdyb3Vwcyk7PGJyPgogICAgICAgICAgICAgfTxicj4KICAgICAgICAgICByZXR1cm4gZ3JvdXBzOzxicj4KICAgICAgICAgfTxicj4KICAgICAgICAgPGJyPgogICAgICAgICA8L3ByZT4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAFZ3JwLmh4cQB+DCR0ADpjb25zdCBjaGFyICp1c2VyLCBnaWRfdCBncm91cCwgZ2lkX3QgKmdyb3VwcywgaW50ICpuZ3JvdXBzdAADaW50dAAJZ2V0Z3JvdXBzc3EAfgAKdAVuCiAgICAgICAgVGhlIDxDT0RFPmdldGdyb3VwczwvQ09ERT4gZnVuY3Rpb24gaXMgdXNlZCB0byBpbnF1aXJlIGFib3V0IHRoZSBzdXBwbGVtZW50YXJ5CiAgICAgICAgIGdyb3VwIElEcyBvZiB0aGUgcHJvY2Vzcy4gIFVwIHRvIDxWQVI+Y291bnQ8L1ZBUj4gb2YgdGhlc2UgZ3JvdXAgSURzIGFyZQogICAgICAgICBzdG9yZWQgaW4gdGhlIGFycmF5IDxWQVI+Z3JvdXBzPC9WQVI+OyB0aGUgcmV0dXJuIHZhbHVlIGZyb20gdGhlIGZ1bmN0aW9uIGlzCiAgICAgICAgIHRoZSBudW1iZXIgb2YgZ3JvdXAgSURzIGFjdHVhbGx5IHN0b3JlZC4gIElmIDxWQVI+Y291bnQ8L1ZBUj4gaXMgc21hbGxlciB0aGFuCiAgICAgICAgIHRoZSB0b3RhbCBudW1iZXIgb2Ygc3VwcGxlbWVudGFyeSBncm91cCBJRHMsIHRoZW4gPENPREU+Z2V0Z3JvdXBzPC9DT0RFPgogICAgICAgICByZXR1cm5zIGEgdmFsdWUgb2YgPENPREU+LTE8L0NPREU+IGFuZCA8Q09ERT5lcnJubzwvQ09ERT4gaXMgc2V0IHRvIDxDT0RFPkVJTlZBTDwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IElmIDxWQVI+Y291bnQ8L1ZBUj4gaXMgemVybywgdGhlbiA8Q09ERT5nZXRncm91cHM8L0NPREU+IGp1c3QgcmV0dXJucyB0aGUgdG90YWwKICAgICAgICAgbnVtYmVyIG9mIHN1cHBsZW1lbnRhcnkgZ3JvdXAgSURzLiAgT24gc3lzdGVtcyB0aGF0IGRvIG5vdCBzdXBwb3J0CiAgICAgICAgIHN1cHBsZW1lbnRhcnkgZ3JvdXBzLCB0aGlzIHdpbGwgYWx3YXlzIGJlIHplcm8uCiAgICAgICAgIDxicj48YnI+IEhlcmUncyBob3cgdG8gdXNlIDxDT0RFPmdldGdyb3VwczwvQ09ERT4gdG8gcmVhZCBhbGwgdGhlIHN1cHBsZW1lbnRhcnkgZ3JvdXAKICAgICAgICAgSURzOgogICAgICAgICA8YnI+PGJyPiA8cHJlPjxicj4KICAgICAgICAgPGJyPgogICAgICAgICBnaWRfdCAqPGJyPgogICAgICAgICByZWFkX2FsbF9ncm91cHMgKHZvaWQpPGJyPgogICAgICAgICB7PGJyPgogICAgICAgICAgIGludCBuZ3JvdXBzID0gZ2V0Z3JvdXBzICgwLCBOVUxMKTs8YnI+CiAgICAgICAgICAgZ2lkX3QgKmdyb3Vwczxicj4KICAgICAgICAgICAgID0gKGdpZF90ICopIHhtYWxsb2MgKG5ncm91cHMgKiBzaXplb2YgKGdpZF90KSk7PGJyPgogICAgICAgICAgIGludCB2YWwgPSBnZXRncm91cHMgKG5ncm91cHMsIGdyb3Vwcyk7PGJyPgogICAgICAgICAgIGlmICh2YWwgPCAwKTxicj4KICAgICAgICAgICAgIHs8YnI+CiAgICAgICAgICAgICAgIGZyZWUgKGdyb3Vwcyk7PGJyPgogICAgICAgICAgICAgICByZXR1cm4gTlVMTDs8YnI+CiAgICAgICAgICAgICB9PGJyPgogICAgICAgICAgIHJldHVybiBncm91cHM7PGJyPgogICAgICAgICB9PGJyPgogICAgICAgICA8YnI+CiAgICAgICAgIDwvcHJlPgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAh1bmlzdGQuaHhxAH4MK3QAGGludCBjb3VudCwgZ2lkX3QgKmdyb3Vwc3QAA2ludHQADWdldGhvc3RieWFkZHJzcQB+AAp0ApEKICAgICAgICBUaGUgPENPREU+Z2V0aG9zdGJ5YWRkcjwvQ09ERT4gZnVuY3Rpb24gcmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaG9zdAogICAgICAgICB3aXRoIEludGVybmV0IGFkZHJlc3MgPFZBUj5hZGRyPC9WQVI+LiAgVGhlIHBhcmFtZXRlciA8VkFSPmFkZHI8L1ZBUj4gaXMgbm90CiAgICAgICAgIHJlYWxseSBhIHBvaW50ZXIgdG8gY2hhciAtIGl0IGNhbiBiZSBhIHBvaW50ZXIgdG8gYW4gSVB2NCBvciBhbiBJUHY2CiAgICAgICAgIGFkZHJlc3MuIFRoZSA8VkFSPmxlbmd0aDwvVkFSPiBhcmd1bWVudCBpcyB0aGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIHRoZSBhZGRyZXNzCiAgICAgICAgIGF0IDxWQVI+YWRkcjwvVkFSPi4gIDxWQVI+Zm9ybWF0PC9WQVI+IHNwZWNpZmllcyB0aGUgYWRkcmVzcyBmb3JtYXQ7IGZvciBhbiBJUHY0CiAgICAgICAgIEludGVybmV0IGFkZHJlc3MsIHNwZWNpZnkgYSB2YWx1ZSBvZiA8Q09ERT5BRl9JTkVUPC9DT0RFPjsgZm9yIGFuIElQdjYKICAgICAgICAgSW50ZXJuZXQgYWRkcmVzcywgdXNlIDxDT0RFPkFGX0lORVQ2PC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gSWYgdGhlIGxvb2t1cCBmYWlscywgPENPREU+Z2V0aG9zdGJ5YWRkcjwvQ09ERT4gcmV0dXJucyBhIG51bGwgcG9pbnRlci4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHbmV0ZGIuaHhxAH4MMnQAK2NvbnN0IGNoYXIgKmFkZHIsIHNpemVfdCBsZW5ndGgsIGludCBmb3JtYXR0ABBzdHJ1Y3QgaG9zdGVudCAqdAAPZ2V0aG9zdGJ5YWRkcl9yc3EAfgAKdAOnCiAgICAgICAgVGhlIDxDT0RFPmdldGhvc3RieWFkZHJfcjwvQ09ERT4gZnVuY3Rpb24gcmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaG9zdAogICAgICAgICB3aXRoIEludGVybmV0IGFkZHJlc3MgPFZBUj5hZGRyPC9WQVI+LiAgVGhlIHBhcmFtZXRlciA8VkFSPmFkZHI8L1ZBUj4gaXMgbm90CiAgICAgICAgIHJlYWxseSBhIHBvaW50ZXIgdG8gY2hhciAtIGl0IGNhbiBiZSBhIHBvaW50ZXIgdG8gYW4gSVB2NCBvciBhbiBJUHY2CiAgICAgICAgIGFkZHJlc3MuIFRoZSA8VkFSPmxlbmd0aDwvVkFSPiBhcmd1bWVudCBpcyB0aGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIHRoZSBhZGRyZXNzCiAgICAgICAgIGF0IDxWQVI+YWRkcjwvVkFSPi4gIDxWQVI+Zm9ybWF0PC9WQVI+IHNwZWNpZmllcyB0aGUgYWRkcmVzcyBmb3JtYXQ7IGZvciBhbiBJUHY0CiAgICAgICAgIEludGVybmV0IGFkZHJlc3MsIHNwZWNpZnkgYSB2YWx1ZSBvZiA8Q09ERT5BRl9JTkVUPC9DT0RFPjsgZm9yIGFuIElQdjYKICAgICAgICAgSW50ZXJuZXQgYWRkcmVzcywgdXNlIDxDT0RFPkFGX0lORVQ2PC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gU2ltaWxhciB0byB0aGUgPENPREU+Z2V0aG9zdGJ5bmFtZV9yPC9DT0RFPiBmdW5jdGlvbiwgdGhlIGNhbGxlciBtdXN0IHByb3ZpZGUKICAgICAgICAgYnVmZmVycyBmb3IgdGhlIHJlc3VsdCBhbmQgbWVtb3J5IHVzZWQgaW50ZXJuYWxseS4gIEluIGNhc2Ugb2Ygc3VjY2VzcwogICAgICAgICB0aGUgZnVuY3Rpb24gcmV0dXJucyB6ZXJvLiAgT3RoZXJ3aXNlIHRoZSB2YWx1ZSBpcyBhbiBlcnJvciBudW1iZXIgd2hlcmUKICAgICAgICAgPENPREU+RVJBTkdFPC9DT0RFPiBoYXMgdGhlIHNwZWNpYWwgbWVhbmluZyB0aGF0IHRoZSBjYWxsZXItcHJvdmlkZWQgYnVmZmVyIGlzCiAgICAgICAgIHRvbyBzbWFsbC4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHbmV0ZGIuaHhxAH4MOXQArWNvbnN0IGNoYXIgKmFkZHIsIHNpemVfdCBsZW5ndGgsIGludCBmb3JtYXQsIHN0cnVjdCBob3N0ZW50ICpyZXN0cmljdCByZXN1bHRfYnVmLCBjaGFyICpyZXN0cmljdCBidWYsIHNpemVfdCBidWZsZW4sIHN0cnVjdCBob3N0ZW50ICoqcmVzdHJpY3QgcmVzdWx0LCBpbnQgKnJlc3RyaWN0IGhfZXJybm9wdAADaW50dAANZ2V0aG9zdGJ5bmFtZXNxAH4ACnQArQogICAgICAgIFRoZSA8Q09ERT5nZXRob3N0YnluYW1lPC9DT0RFPiBmdW5jdGlvbiByZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBob3N0CiAgICAgICAgIG5hbWVkIDxWQVI+bmFtZTwvVkFSPi4gIElmIHRoZSBsb29rdXAgZmFpbHMsIGl0IHJldHVybnMgYSBudWxsIHBvaW50ZXIuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB25ldGRiLmh4cQB+DEB0ABBjb25zdCBjaGFyICpuYW1ldAAQc3RydWN0IGhvc3RlbnQgKnQADmdldGhvc3RieW5hbWUyc3EAfgAKdADxCiAgICAgICAgVGhlIDxDT0RFPmdldGhvc3RieW5hbWUyPC9DT0RFPiBmdW5jdGlvbiBpcyBsaWtlIDxDT0RFPmdldGhvc3RieW5hbWU8L0NPREU+LCBidXQKICAgICAgICAgYWxsb3dzIHRoZSBjYWxsZXIgdG8gc3BlY2lmeSB0aGUgZGVzaXJlZCBhZGRyZXNzIGZhbWlseSAoZS5nLjoKICAgICAgICAgPENPREU+QUZfSU5FVDwvQ09ERT4gb3IgPENPREU+QUZfSU5FVDY8L0NPREU+KSBvZiB0aGUgcmVzdWx0LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAduZXRkYi5oeHEAfgxHdAAYY29uc3QgY2hhciAqbmFtZSwgaW50IGFmdAAQc3RydWN0IGhvc3RlbnQgKnQAEGdldGhvc3RieW5hbWUyX3JzcQB+AAp0APYKICAgICAgICBUaGUgPENPREU+Z2V0aG9zdGJ5bmFtZTJfcjwvQ09ERT4gZnVuY3Rpb24gaXMgbGlrZSA8Q09ERT5nZXRob3N0YnluYW1lX3I8L0NPREU+LCBidXQKICAgICAgICAgYWxsb3dzIHRoZSBjYWxsZXIgdG8gc3BlY2lmeSB0aGUgZGVzaXJlZCBhZGRyZXNzIGZhbWlseSAoZS5nLjoKICAgICAgICAgPENPREU+QUZfSU5FVDwvQ09ERT4gb3IgPENPREU+QUZfSU5FVDY8L0NPREU+KSBmb3IgdGhlIHJlc3VsdC4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHbmV0ZGIuaHhxAH4MTnQAmmNvbnN0IGNoYXIgKm5hbWUsIGludCBhZiwgc3RydWN0IGhvc3RlbnQgKnJlc3RyaWN0IHJlc3VsdF9idWYsIGNoYXIgKnJlc3RyaWN0IGJ1Ziwgc2l6ZV90IGJ1Zmxlbiwgc3RydWN0IGhvc3RlbnQgKipyZXN0cmljdCByZXN1bHQsIGludCAqcmVzdHJpY3QgaF9lcnJub3B0AANpbnR0AA9nZXRob3N0YnluYW1lX3JzcQB+AAp0CKMKICAgICAgICBUaGUgPENPREU+Z2V0aG9zdGJ5bmFtZV9yPC9DT0RFPiBmdW5jdGlvbiByZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBob3N0CiAgICAgICAgIG5hbWVkIDxWQVI+bmFtZTwvVkFSPi4gIFRoZSBjYWxsZXIgbXVzdCBwYXNzIGEgcG9pbnRlciB0byBhbiBvYmplY3Qgb2YgdHlwZQogICAgICAgICA8Q09ERT5zdHJ1Y3QgaG9zdGVudDwvQ09ERT4gaW4gdGhlIDxWQVI+cmVzdWx0X2J1ZjwvVkFSPiBwYXJhbWV0ZXIuICBJbiBhZGRpdGlvbgogICAgICAgICB0aGUgZnVuY3Rpb24gbWF5IG5lZWQgZXh0cmEgYnVmZmVyIHNwYWNlIGFuZCB0aGUgY2FsbGVyIG11c3QgcGFzcyBhbgogICAgICAgICBwb2ludGVyIGFuZCB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIGluIHRoZSA8VkFSPmJ1ZjwvVkFSPiBhbmQgPFZBUj5idWZsZW48L1ZBUj4KICAgICAgICAgcGFyYW1ldGVycy4KICAgICAgICAgPGJyPjxicj4gQSBwb2ludGVyIHRvIHRoZSBidWZmZXIsIGluIHdoaWNoIHRoZSByZXN1bHQgaXMgc3RvcmVkLCBpcyBhdmFpbGFibGUgaW4KICAgICAgICAgPENPREU+KjxWQVI+cmVzdWx0PC9WQVI+PC9DT0RFPiBhZnRlciB0aGUgZnVuY3Rpb24gY2FsbCBzdWNjZXNzZnVsbHkgcmV0dXJuZWQuICBJZgogICAgICAgICBhbiBlcnJvciBvY2N1cnMgb3IgaWYgbm8gZW50cnkgaXMgZm91bmQsIHRoZSBwb2ludGVyIDxDT0RFPio8VkFSPnJlc3VsdDwvVkFSPjwvQ09ERT4KICAgICAgICAgaXMgYSBudWxsIHBvaW50ZXIuICBTdWNjZXNzIGlzIHNpZ25hbGxlZCBieSBhIHplcm8gcmV0dXJuIHZhbHVlLiAgSWYgdGhlCiAgICAgICAgIGZ1bmN0aW9uIGZhaWxlZCB0aGUgcmV0dXJuIHZhbHVlIGlzIGFuIGVycm9yIG51bWJlci4gIEluIGFkZGl0aW9uIHRvIHRoZQogICAgICAgICBlcnJvcnMgZGVmaW5lZCBmb3IgPENPREU+Z2V0aG9zdGJ5bmFtZTwvQ09ERT4gaXQgY2FuIGFsc28gYmUgPENPREU+RVJBTkdFPC9DT0RFPi4KICAgICAgICAgSW4gdGhpcyBjYXNlIHRoZSBjYWxsIHNob3VsZCBiZSByZXBlYXRlZCB3aXRoIGEgbGFyZ2VyIGJ1ZmZlci4KICAgICAgICAgQWRkaXRpb25hbCBlcnJvciBpbmZvcm1hdGlvbiBpcyBub3Qgc3RvcmVkIGluIHRoZSBnbG9iYWwgdmFyaWFibGUKICAgICAgICAgPENPREU+aF9lcnJubzwvQ09ERT4gYnV0IGluc3RlYWQgaW4gdGhlIG9iamVjdCBwb2ludGVkIHRvIGJ5IDxWQVI+aF9lcnJub3A8L1ZBUj4uCiAgICAgICAgIDxicj48YnI+IEhlcmUncyBhIHNtYWxsIGV4YW1wbGU6CiAgICAgICAgIDxwcmU+PGJyPgogICAgICAgICBzdHJ1Y3QgaG9zdGVudCAqPGJyPgogICAgICAgICBnZXRob3N0bmFtZSAoY2hhciAqaG9zdCk8YnI+CiAgICAgICAgIHs8YnI+CiAgICAgICAgICAgc3RydWN0IGhvc3RlbnQgaG9zdGJ1ZiwgKmhwOzxicj4KICAgICAgICAgICBzaXplX3QgaHN0YnVmbGVuOzxicj4KICAgICAgICAgICBjaGFyICp0bXBoc3RidWY7PGJyPgogICAgICAgICAgIGludCByZXM7PGJyPgogICAgICAgICAgIGludCBoZXJyOzxicj4KICAg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PnNldGl0aW1lcjwvQ09ERT4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACnN5cy90aW1lLmh4cQB+DHF0ACBpbnQgd2hpY2gsIHN0cnVjdCBpdGltZXJ2YWwgKm9sZHQAA2ludHQAB2dldGxpbmVzcQB+AAp0B2wKICAgICAgICBUaGlzIGZ1bmN0aW9uIHJlYWRzIGFuIGVudGlyZSBsaW5lIGZyb20gPFZBUj5zdHJlYW08L1ZBUj4sIHN0b3JpbmcgdGhlIHRleHQKICAgICAgICAgKGluY2x1ZGluZyB0aGUgbmV3bGluZSBhbmQgYSB0ZXJtaW5hdGluZyBudWxsIGNoYXJhY3RlcikgaW4gYSBidWZmZXIKICAgICAgICAgYW5kIHN0b3JpbmcgdGhlIGJ1ZmZlciBhZGRyZXNzIGluIDxDT0RFPio8VkFSPmxpbmVwdHI8L1ZBUj48L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBCZWZvcmUgY2FsbGluZyA8Q09ERT5nZXRsaW5lPC9DT0RFPiwgeW91IHNob3VsZCBwbGFjZSBpbiA8Q09ERT4qPFZBUj5saW5lcHRyPC9WQVI+PC9DT0RFPgogICAgICAgICB0aGUgYWRkcmVzcyBvZiBhIGJ1ZmZlciA8Q09ERT4qPFZBUj5uPC9WQVI+PC9DT0RFPiBieXRlcyBsb25nLCBhbGxvY2F0ZWQgd2l0aAogICAgICAgICA8Q09ERT5tYWxsb2M8L0NPREU+LiAgSWYgdGhpcyBidWZmZXIgaXMgbG9uZyBlbm91Z2ggdG8gaG9sZCB0aGUgbGluZSwKICAgICAgICAgPENPREU+Z2V0bGluZTwvQ09ERT4gc3RvcmVzIHRoZSBsaW5lIGluIHRoaXMgYnVmZmVyLiAgT3RoZXJ3aXNlLAogICAgICAgICA8Q09ERT5nZXRsaW5lPC9DT0RFPiBtYWtlcyB0aGUgYnVmZmVyIGJpZ2dlciB1c2luZyA8Q09ERT5yZWFsbG9jPC9DT0RFPiwgc3RvcmluZyB0aGUKICAgICAgICAgbmV3IGJ1ZmZlciBhZGRyZXNzIGJhY2sgaW4gPENPREU+KjxWQVI+bGluZXB0cjwvVkFSPjwvQ09ERT4gYW5kIHRoZSBpbmNyZWFzZWQgc2l6ZQogICAgICAgICBiYWNrIGluIDxDT0RFPio8VkFSPm48L1ZBUj48L0NPREU+LgogICAgICAgICAuCiAgICAgICAgIDxicj48YnI+IElmIHlvdSBzZXQgPENPREU+KjxWQVI+bGluZXB0cjwvVkFSPjwvQ09ERT4gdG8gYSBudWxsIHBvaW50ZXIsIGFuZCA8Q09ERT4qPFZBUj5uPC9WQVI+PC9DT0RFPgogICAgICAgICB0byB6ZXJvLCBiZWZvcmUgdGhlIGNhbGwsIHRoZW4gPENPREU+Z2V0bGluZTwvQ09ERT4gYWxsb2NhdGVzIHRoZSBpbml0aWFsCiAgICAgICAgIGJ1ZmZlciBmb3IgeW91IGJ5IGNhbGxpbmcgPENPREU+bWFsbG9jPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gSW4gZWl0aGVyIGNhc2UsIHdoZW4gPENPREU+Z2V0bGluZTwvQ09ERT4gcmV0dXJucywgIDxDT0RFPio8VkFSPmxpbmVwdHI8L1ZBUj48L0NPREU+IGlzCiAgICAgICAgIGEgPENPREU+Y2hhciAqPC9DT0RFPiB3aGljaCBwb2ludHMgdG8gdGhlIHRleHQgb2YgdGhlIGxpbmUuCiAgICAgICAgIDxicj48YnI+IFdoZW4gPENPREU+Z2V0bGluZTwvQ09ERT4gaXMgc3VjY2Vzc2Z1bCwgaXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMKICAgICAgICAgcmVhZCAoaW5jbHVkaW5nIHRoZSBuZXdsaW5lLCBidXQgbm90IGluY2x1ZGluZyB0aGUgdGVybWluYXRpbmcgbnVsbCkuCiAgICAgICAgIFRoaXMgdmFsdWUgZW5hYmxlcyB5b3UgdG8gZGlzdGluZ3Vpc2ggbnVsbCBjaGFyYWN0ZXJzIHRoYXQgYXJlIHBhcnQgb2YKICAgICAgICAgdGhlIGxpbmUgZnJvbSB0aGUgbnVsbCBjaGFyYWN0ZXIgaW5zZXJ0ZWQgYXMgYSB0ZXJtaW5hdG9yLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIGlzIGEgR05VIGV4dGVuc2lvbiwgYnV0IGl0IGlzIHRoZSByZWNvbW1lbmRlZCB3YXkgdG8gcmVhZAogICAgICAgICBsaW5lcyBmcm9tIGEgc3RyZWFtLiAgVGhlIGFsdGVybmF0aXZlIHN0YW5kYXJkIGZ1bmN0aW9ucyBhcmUgdW5yZWxpYWJsZS4KICAgICAgICAgPGJyPjxicj4gSWYgYW4gZXJyb3Igb2NjdXJzIG9yIGVuZCBvZiBmaWxlIGlzIHJlYWNoZWQgd2l0aG91dCBhbnkgYnl0ZXMgcmVhZCwKICAgICAgICAgPENPREU+Z2V0bGluZTwvQ09ERT4gcmV0dXJucyA8Q09ERT4tMTwvQ09ERT4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3N0ZGlvLmh4cQB+DHh0ACdjaGFyICoqbGluZXB0ciwgc2l6ZV90ICpuLCBGSUxFICpzdHJlYW10AAdzc2l6ZV90dAAKZ2V0bG9hZGF2Z3NxAH4ACnQBvwogICAgICAgIFRoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgMSwgNSBhbmQgMTUgbWludXRlIGxvYWQgYXZlcmFnZXMgb2YgdGhlCiAgICAgICAgIHN5c3RlbS4gVGhlIHZhbHVlcyBhcmUgcGxhY2VkIGluIDxWQVI+bG9hZGF2ZzwvVkFSPi4gIDxDT0RFPmdldGxvYWRhdmc8L0NPREU+IHdpbGwKICAgICAgICAgcGxhY2UgYXQgbW9zdCA8VkFSPm5lbGVtPC9WQVI+IGVsZW1lbnRzIGludG8gdGhlIGFycmF5IGJ1dCBuZXZlciBtb3JlIHRoYW4KICAgICAgICAgdGhyZWUgZWxlbWVudHMuICBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgd3JpdHRlbiB0bwogICAgICAgICA8VkFSPmxvYWRhdmc8L1ZBUj4sIG9yIC0xIG9uIGVycm9yLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIGlzIGRlY2xhcmVkIGluIDxUVD5zdGRsaWIuaDwvVFQ+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAhzdGRsaWIuaHhxAH4Mf3QAG2RvdWJsZSBsb2FkYXZnW10sIGludCBuZWxlbXQAA2ludHQACGdldGxvZ2luc3EAfgAKdAGGCiAgICAgICAgVGhlIDxDT0RFPmdldGxvZ2luPC9DT0RFPiBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byBhIHN0cmluZyBjb250YWluaW5nIHRoZQogICAgICAgICBuYW1lIG9mIHRoZSB1c2VyIGxvZ2dlZCBpbiBvbiB0aGUgY29udHJvbGxpbmcgdGVybWluYWwgb2YgdGhlIHByb2Nlc3MsCiAgICAgICAgIG9yIGEgbnVsbCBwb2ludGVyIGlmIHRoaXMgaW5mb3JtYXRpb24gY2Fubm90IGJlIGRldGVybWluZWQuICBUaGUgc3RyaW5nCiAgICAgICAgIGlzIHN0YXRpY2FsbHkgYWxsb2NhdGVkIGFuZCBtaWdodCBiZSBvdmVyd3JpdHRlbiBvbiBzdWJzZXF1ZW50IGNhbGxzIHRvCiAgICAgICAgIHRoaXMgZnVuY3Rpb24gb3IgdG8gPENPREU+Y3VzZXJpZDwvQ09ERT4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHVuaXN0ZC5oeHEAfgyGdAAEdm9pZHQABmNoYXIgKnQACWdldG1udGVudHNxAH4ACnQFSgogICAgICAgIFRoZSA8Q09ERT5nZXRtbnRlbnQ8L0NPREU+IGZ1bmN0aW9uIHRha2VzIGFzIHRoZSBwYXJhbWV0ZXIgYSBmaWxlIGhhbmRsZQogICAgICAgICBwcmV2aW91c2x5IHJldHVybmVkIGJ5IHN1Y2Nlc3NmdWwgY2FsbCB0byA8Q09ERT5zZXRtbnRlbnQ8L0NPREU+LiAgSXQgcmV0dXJucwogICAgICAgICBhIHBvaW50ZXIgdG8gYSBzdGF0aWMgdmFyaWFibGUgb2YgdHlwZSA8Q09ERT5zdHJ1Y3QgbW50ZW50PC9DT0RFPiB3aGljaCBpcwogICAgICAgICBmaWxsZWQgd2l0aCB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgbmV4dCBlbnRyeSBmcm9tIHRoZSBmaWxlIGN1cnJlbnRseQogICAgICAgICByZWFkLgogICAgICAgICA8YnI+PGJyPiBUaGUgZmlsZSBmb3JtYXQgdXNlZCBwcmVzY3JpYmVzIHRoZSB1c2Ugb2Ygc3BhY2VzIG9yIHRhYiBjaGFyYWN0ZXJzIHRvCiAgICAgICAgIHNlcGFyYXRlIHRoZSBmaWVsZHMuICBUaGlzIG1ha2VzIGl0IGhhcmRlciB0byB1c2UgbmFtZSBjb250YWluaW5nIG9uZQogICAgICAgICBvZiB0aGVzZSBjaGFyYWN0ZXJzIChlLmcuLCBtb3VudCBwb2ludHMgdXNpbmcgc3BhY2VzKS4gIFRoZXJlZm9yZQogICAgICAgICB0aGVzZSBjaGFyYWN0ZXJzIGFyZSBlbmNvZGVkIGluIHRoZSBmaWxlcyBhbmQgdGhlIDxDT0RFPmdldG1udGVudDwvQ09ERT4KICAgICAgICAgZnVuY3Rpb24gdGFrZXMgY2FyZSBvZiB0aGUgZGVjb2Rpbmcgd2hpbGUgcmVhZGluZyB0aGUgZW50cmllcyBiYWNrIGluLgogICAgICAgICA8Q09ERT4nXDA0MCc8L0NPREU+IGlzIHVzZWQgdG8gZW5jb2RlIGEgc3BhY2UgY2hhcmFjdGVyLCA8Q09ERT4nXDAxMSc8L0NPREU+IHRvCiAgICAgICAgIGVuY29kZSBhIHRhYiBjaGFyYWN0ZXIsIDxDT0RFPidcMDEyJzwvQ09ERT4gdG8gZW5jb2RlIGEgbmV3bGluZSBjaGFyYWN0ZXIsCiAgICAgICAgIGFuZCA8Q09ERT4nXFwnPC9DT0RFPiB0byBlbmNvZGUgYSBiYWNrc2xhc2guCiAgICAgICAgIDxicj48YnI+IElmIHRoZXJlIHdhcyBhbiBlcnJvciBvciB0aGUgZW5kIG9mIHRoZSBmaWxlIGlzIHJlYWNoZWQgdGhlIHJldHVybiB2YWx1ZQogICAgICAgICBpcyA8Q09ERT5OVUxMPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiBpcyBub3QgdGhyZWFkLXNhZmUgc2luY2UgYWxsIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24gcmV0dXJuCiAgICAgICAgIGEgcG9pbnRlciB0byB0aGUgc2FtZSBzdGF0aWMgdmFyaWFibGUuICA8Q09ERT5nZXRtbnRlbnRfcjwvQ09ERT4gc2hvdWxkIGJlCiAgICAgICAgIHVzZWQgaW4gc2l0dWF0aW9ucyB3aGVyZSBtdWx0aXBsZSB0aHJlYWRzIGFjY2VzcyB0aGUgZmlsZS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIbW50ZW50Lmh4cQB+DI10AAxGSUxFICpzdHJlYW10AA9zdHJ1Y3QgbW50ZW50ICp0AAtnZXRtbnRlbnRfcnNxAH4ACnQECgogICAgICAgIFRoZSA8Q09ERT5nZXRtbnRlbnRfcjwvQ09ERT4gZnVuY3Rpb24gaXMgdGhlIHJlZW50cmFudCB2YXJpYW50IG9mCiAgICAgICAgIDxDT0RFPmdldG1udGVudDwvQ09ERT4uICBJdCBhbHNvIHJldHVybnMgdGhlIG5leHQgZW50cnkgZnJvbSB0aGUgZmlsZSBhbmQKICAgICAgICAgcmV0dXJucyBhIHBvaW50ZXIuICBUaGUgYWN0dWFsIHZhcmlhYmxlIHRoZSB2YWx1ZXMgYXJlIHN0b3JlZCBpbiBpcyBub3QKICAgICAgICAgc3RhdGljLCB0aG91Z2guICBJbnN0ZWFkIHRoZSBmdW5jdGlvbiBzdG9yZXMgdGhlIHZhbHVlcyBpbiB0aGUgdmFyaWFibGUKICAgICAgICAgcG9pbnRlZCB0byBieSB0aGUgPFZBUj5yZXN1bHQ8L1ZBUj4gcGFyYW1ldGVyLiAgQWRkaXRpb25hbCBpbmZvcm1hdGlvbiAoZS5nLiwKICAgICAgICAgdGhlIHN0cmluZ3MgcG9pbnRlZCB0byBieSB0aGUgZWxlbWVudHMgb2YgdGhlIHJlc3VsdCkgYXJlIGtlcHQgaW4gdGhlCiAgICAgICAgIGJ1ZmZlciBvZiBzaXplIDxWQVI+YnVmc2l6ZTwvVkFSPiBwb2ludGVkIHRvIGJ5IDxWQVI+YnVmZmVyPC9WQVI+LgogICAgICAgICA8YnI+PGJyPiBFc2NhcGVkIGNoYXJhY3RlcnMgKHNwYWNlLCB0YWIsIGJhY2tzbGFzaCkgYXJlIGNvbnZlcnRlZCBiYWNrIGluIHRoZQogICAgICAgICBzYW1lIHdheSBhcyBpdCBoYXBwZW5zIGZvciA8Q09ERT5nZXRtZW50ZW50PC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gVGhlIGZ1bmN0aW9uIHJldHVybnMgYSA8Q09ERT5OVUxMPC9DT0RFPiBwb2ludGVyIGluIGVycm9yIGNhc2VzLiAgRXJyb3JzIGNvdWxkIGJlOgogICAgICAgICA8T0w+CiAgICAgICAgIDxMST4KICAgICAgICAgZXJyb3Igd2hpbGUgcmVhZGluZyB0aGUgZmlsZSwKICAgICAgICAgPExJPgogICAgICAgICBlbmQgb2YgZmlsZSByZWFjaGVkLAogICAgICAgICA8TEk+CiAgICAgICAgIDxWQVI+YnVmc2l6ZTwvVkFSPiBpcyB0b28gc21hbGwgZm9yIHJlYWRpbmcgYSBjb21wbGV0ZSBuZXcgZW50cnkuCiAgICAgICAgIDwvT0w+CiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACG1udGVudC5oeHEAfgyUdAA/RklMRSAqc3RyZWFtLCBzdHJ1Y3QgbWVudGVudCAqcmVzdWx0LCBjaGFyICpidWZmZXIsIGludCBidWZzaXpldAAPc3RydWN0IG1udGVudCAqdAAMZ2V0bmV0YnlhZGRyc3EAfgAKdAF5CiAgICAgICAgVGhlIDxDT0RFPmdldG5ldGJ5YWRkcjwvQ09ERT4gZnVuY3Rpb24gcmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbmV0d29yawogICAgICAgICBvZiB0eXBlIDxWQVI+dHlwZTwvVkFSPiB3aXRoIG51bWJlciA8VkFSPm5ldDwvVkFSPi4gIFlvdSBzaG91bGQgc3BlY2lmeSBhIHZhbHVlIG9mCiAgICAgICAgIDxDT0RFPkFGX0lORVQ8L0NPREU+IGZvciB0aGUgPFZBUj50eXBlPC9WQVI+IGFyZ3VtZW50IGZvciBJbnRlcm5ldCBuZXR3b3Jrcy4KICAgICAgICAgPGJyPjxicj4gPENPREU+Z2V0bmV0YnlhZGRyPC9DT0RFPiByZXR1cm5zIGEgbnVsbCBwb2ludGVyIGlmIHRoZXJlIGlzIG5vIHN1Y2gKICAgICAgICAgbmV0d29yay4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHbmV0ZGIuaHhxAH4Mm3QAH3Vuc2lnbmVkIGxvbmcgaW50IG5ldCwgaW50IHR5cGV0AA9zdHJ1Y3QgbmV0ZW50ICp0AAxnZXRuZXRieW5hbWVzcQB+AAp0AL8KICAgICAgICBUaGUgPENPREU+Z2V0bmV0YnluYW1lPC9DT0RFPiBmdW5jdGlvbiByZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBuZXR3b3JrCiAgICAgICAgIG5hbWVkIDxWQVI+bmFtZTwvVkFSPi4gIEl0IHJldHVybnMgYSBudWxsIHBvaW50ZXIgaWYgdGhlcmUgaXMgbm8gc3VjaAogICAgICAgICBuZXR3b3JrLgogICAgICAgIHNxAH4ADwAAAAJ3BAAAAAJ0AAxzeXMvc29ja2V0Lmh0AAduZXRkYi5oeHEAfgyidAAQY29uc3QgY2hhciAqbmFtZXQAD3N0cnVjdCBuZXRlbnQgKnQACWdldG5ldGVudHNxAH4ACnQAkgogICAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbmV4dCBlbnRyeSBpbiB0aGUgbmV0d29ya3MgZGF0YWJhc2UuICBJdAogICAgICAgICByZXR1cm5zIGEgbnVsbCBwb2ludGVyIGlmIHRoZXJlIGFyZSBubyBtb3JlIGVudHJpZXMuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB25ldGRiLmh4cQB+DKp0AAR2b2lkdAAPc3RydWN0IG5ldGVudCAqdAALZ2V0bmV0Z3JlbnRzcQB+AAp0AtoKICAgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG5leHQgdW5wcm9jZXNzZWQgZW50cnkgb2YgdGhlIGN1cnJlbnRseQogICAgICAgICBzZWxlY3RlZCBuZXRncm91cC4gIFRoZSBzdHJpbmcgcG9pbnRlcnMsIGluIHdoaWNoIGFkZHJlc3NlcyBhcmUgcGFzc2VkIGluCiAgICAgICAgIHRoZSBhcmd1bWVudHMgPFZBUj5ob3N0cDwvVkFSPiwgPFZBUj51c2VycDwvVkFSPiwgYW5kIDxWQVI+ZG9tYWlucDwvVkFSPiwgd2lsbCBjb250YWluCiAgICAgICAgIGFmdGVyIGEgc3VjY2Vzc2Z1bCBjYWxsIHBvaW50ZXJzIHRvIGFwcHJvcHJpYXRlIHN0cmluZ3MuICBJZiB0aGUgc3RyaW5nCiAgICAgICAgIGluIHRoZSBuZXh0IGVudHJ5IGlzIGVtcHR5IHRoZSBwb2ludGVyIGhhcyB0aGUgdmFsdWUgPENPREU+TlVMTDwvQ09ERT4uCiAgICAgICAgIFRoZSByZXR1cm5lZCBzdHJpbmcgcG9pbnRlcnMgYXJlIG9ubHkgdmFsaWQgaWYgbm9uZSBvZiB0aGUgbmV0Z3JvdXAKICAgICAgICAgcmVsYXRlZCBmdW5jdGlvbnMgYXJlIGNhbGxlZC4KICAgICAgICAgPGJyPjxicj4gVGhlIHJldHVybiB2YWx1ZSBpcyA8Q09ERT4xPC9DT0RFPiBpZiB0aGUgbmV4dCBlbnRyeSB3YXMgc3VjY2Vzc2Z1bGx5IHJlYWQuICBBCiAgICAgICAgIHZhbHVlIG9mIDxDT0RFPjA8L0NPREU+IG1lYW5zIG5vIGZ1cnRoZXIgZW50cmllcyBleGlzdCBvciBpbnRlcm5hbCBlcnJvcnMgb2NjdXJyZWQuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB25ldGRiLmh4cQB+DLF0ACpjaGFyICoqaG9zdHAsIGNoYXIgKip1c2VycCwgY2hhciAqKmRvbWFpbnB0AANpbnR0AA1nZXRuZXRncmVudF9yc3EAfgAKdANcCiAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIDxDT0RFPmdldG5ldGdyZW50PC9DT0RFPiB3aXRoIG9ubHkgb25lIGV4Y2VwdGlvbjoKICAgICAgICAgdGhlIHN0cmluZ3MgdGhlIHRocmVlIHN0cmluZyBwb2ludGVycyA8VkFSPmhvc3RwPC9WQVI+LCA8VkFSPnVzZXJwPC9WQVI+LCBhbmQKICAgICAgICAgPFZBUj5kb21haW5wPC9WQVI+IHBvaW50IHRvLCBhcmUgcGxhY2VkIGluIHRoZSBidWZmZXIgb2YgPFZBUj5idWZsZW48L1ZBUj4gYnl0ZXMKICAgICAgICAgc3RhcnRpbmcgYXQgPFZBUj5idWZmZXI8L1ZBUj4uICBUaGlzIG1lYW5zIHRoZSByZXR1cm5lZCB2YWx1ZXMgYXJlIHZhbGlkCiAgICAgICAgIGV2ZW4gYWZ0ZXIgb3RoZXIgbmV0Z3JvdXAgcmVsYXRlZCBmdW5jdGlvbnMgYXJlIGNhbGxlZC4KICAgICAgICAgPGJyPjxicj4gVGhlIHJldHVybiB2YWx1ZSBpcyA8Q09ERT4xPC9DT0RFPiBpZiB0aGUgbmV4dCBlbnRyeSB3YXMgc3VjY2Vzc2Z1bGx5IHJlYWQgYW5kCiAgICAgICAgIHRoZSBidWZmZXIgY29udGFpbnMgZW5vdWdoIHJvb20gdG8gcGxhY2UgdGhlIHN0cmluZ3MgaW4gaXQuICA8Q09ERT4wPC9DT0RFPiBpcwogICAgICAgICByZXR1cm5lZCBpbiBjYXNlIG5vIG1vcmUgZW50cmllcyBhcmUgZm91bmQsIHRoZSBidWZmZXIgaXMgdG9vIHNtYWxsLCBvcgogICAgICAgICBpbnRlcm5hbCBlcnJvcnMgb2NjdXJyZWQuCiAgICAgICAgIDxicj48YnI+IFRoaXMgZnVuY3Rpb24gaXMgYSBHTlUgZXh0ZW5zaW9uLiAgVGhlIG9yaWdpbmFsIGltcGxlbWVudGF0aW9uIGluIHRoZQogICAgICAgICBTdW5PUyBsaWJjIGRvZXMgbm90IHByb3ZpZGUgdGhpcyBmdW5jdGlvbi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHbmV0ZGIuaHhxAH4MuHQARGNoYXIgKipob3N0cCwgY2hhciAqKnVzZXJwLCBjaGFyICoqZG9tYWlucCwgY2hhciAqYnVmZmVyLCBpbnQgYnVmbGVudAADaW50dAAGZ2V0b3B0c3EAfgAKdAyqCiAgICAgICAgVGhlIDxDT0RFPmdldG9wdDwvQ09ERT4gZnVuY3Rpb24gZ2V0cyB0aGUgbmV4dCBvcHRpb24gYXJndW1lbnQgZnJvbSB0aGUKICAgICAgICAgYXJndW1lbnQgbGlzdCBzcGVjaWZpZWQgYnkgdGhlIDxWQVI+YXJndjwvVkFSPiBhbmQgPFZBUj5hcmdjPC9WQVI+IGFyZ3VtZW50cy4KICAgICAgICAgTm9ybWFsbHkgdGhlc2UgdmFsdWVzIGNvbWUgZGlyZWN0bHkgZnJvbSB0aGUgYXJndW1lbnRzIHJlY2VpdmVkIGJ5CiAgICAgICAgIDxDT0RFPm1haW48L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBUaGUgPFZBUj5vcHRpb25zPC9WQVI+IGFyZ3VtZW50IGlzIGEgc3RyaW5nIHRoYXQgc3BlY2lmaWVzIHRoZSBvcHRpb24KICAgICAgICAgY2hhcmFjdGVycyB0aGF0IGFyZSB2YWxpZCBmb3IgdGhpcyBwcm9ncmFtLiAgQW4gb3B0aW9uIGNoYXJhY3RlciBpbiB0aGlzCiAgICAgICAgIHN0cmluZyBjYW4gYmUgZm9sbG93ZWQgYnkgYSBjb2xvbiAoPHNhbXA+Ojwvc2FtcD4pIHRvIGluZGljYXRlIHRoYXQgaXQgdGFrZXMgYQogICAgICAgICByZXF1aXJlZCBhcmd1bWVudC4gIElmIGFuIG9wdGlvbiBjaGFyYWN0ZXIgaXMgZm9sbG93ZWQgYnkgdHdvIGNvbG9ucwogICAgICAgICAoPHNhbXA+Ojo8L3NhbXA+KSwgaXRzIGFyZ3VtZW50IGlzIG9wdGlvbmFsOyB0aGlzIGlzIGEgR05VIGV4dGVuc2lvbi4KICAgICAgICAgPGJyPjxicj4gPENPREU+Z2V0b3B0PC9DT0RFPiBoYXMgdGhyZWUgd2F5cyB0byBkZWFsIHdpdGggb3B0aW9ucyB0aGF0IGZvbGxvdwogICAgICAgICBub24tb3B0aW9ucyA8VkFSPmFyZ3Y8L1ZBUj4gZWxlbWVudHMuICBUaGUgc3BlY2lhbCBhcmd1bWVudCA8c2FtcD4tLTwvc2FtcD4gZm9yY2VzCiAgICAgICAgIGluIGFsbCBjYXNlcyB0aGUgZW5kIG9mIG9wdGlvbiBzY2FubmluZy4KICAgICAgICAgPGJyPjxicj4gPE9MPgogICAgICAgICA8TEk+CiAgICAgICAgIFRoZSBkZWZhdWx0IGlzIHRvIHBlcm11dGUgdGhlIGNvbnRlbnRzIG9mIDxWQVI+YXJndjwvVkFSPiB3aGlsZSBzY2FubmluZyBpdAogICAgICAgICBzbyB0aGF0IGV2ZW50dWFsbHkgYWxsIHRoZSBub24tb3B0aW9ucyBhcmUgYXQgdGhlIGVuZC4gIFRoaXMgYWxsb3dzCiAgICAgICAgIG9wdGlvbnMgdG8gYmUgZ2l2ZW4gaW4gYW55IG9yZGVyLCBldmVuIHdpdGggcHJvZ3JhbXMgdGhhdCB3ZXJlIG5vdAogICAgICAgICB3cml0dGVuIHRvIGV4cGVjdCB0aGlzLgogICAgICAgICA8YnI+PGJyPiA8TEk+CiAgICAgICAgIElmIHRoZSA8VkFSPm9wdGlvbnM8L1ZBUj4gYXJndW1lbnQgc3RyaW5nIGJlZ2lucyB3aXRoIGEgaHlwaGVuICg8c2FtcD4tPC9zYW1wPiksIHRoaXMKICAgICAgICAgaXMgdHJlYXRlZCBzcGVjaWFsbHkuICBJdCBwZXJtaXRzIGFyZ3VtZW50cyB0aGF0IGFyZSBub3Qgb3B0aW9ucyB0byBiZQogICAgICAgICByZXR1cm5lZCBhcyBpZiB0aGV5IHdlcmUgYXNzb2NpYXRlZCB3aXRoIG9wdGlvbiBjaGFyYWN0ZXIgPHNhbXA+XDE8L3NhbXA+LgogICAgICAgICA8YnI+PGJyPiA8TEk+CiAgICAgICAgIFBPU0lYIGRlbWFuZHMgdGhlIGZvbGxvd2luZyBiZWhhdmlvcjogVGhlIGZpcnN0IG5vbi1vcHRpb24gc3RvcHMgb3B0aW9uCiAgICAgICAgIHByb2Nlc3NpbmcuICBUaGlzIG1vZGUgaXMgc2VsZWN0ZWQgYnkgZWl0aGVyIHNldHRpbmcgdGhlIGVudmlyb25tZW50CiAgICAgICAgIHZhcmlhYmxlIDxDT0RFPlBPU0lYTFlfQ09SUkVDVDwvQ09ERT4gb3IgYmVnaW5uaW5nIHRoZSA8VkFSPm9wdGlvbnM8L1ZBUj4gYXJndW1lbnQKICAgICAgICAgc3RyaW5nIHdpdGggYSBwbHVzIHNpZ24gKDxzYW1wPis8L3NhbXA+KS4KICAgICAgICAgPC9PTD4KICAgICAgICAgPGJyPjxicj4gVGhlIDxDT0RFPmdldG9wdDwvQ09ERT4gZnVuY3Rpb24gcmV0dXJucyB0aGUgb3B0aW9uIGNoYXJhY3RlciBmb3IgdGhlIG5leHQKICAgICAgICAgY29tbWFuZCBsaW5lIG9wdGlvbi4gIFdoZW4gbm8gbW9yZSBvcHRpb24gYXJndW1lbnRzIGFyZSBhdmFpbGFibGUsIGl0CiAgICAgICAgIHJldHVybnMgPENPREU+LTE8L0NPREU+LiAgVGhlcmUgbWF5IHN0aWxsIGJlIG1vcmUgbm9uLW9wdGlvbiBhcmd1bWVudHM7IHlvdQogICAgICAgICBtdXN0IGNvbXBhcmUgdGhlIGV4dGVybmFsIHZhcmlhYmxlIDxDT0RFPm9wdGluZDwvQ09ERT4gYWdhaW5zdCB0aGUgPFZBUj5hcmdjPC9WQVI+CiAgICAgICAgIHBhcmFtZXRlciB0byBjaGVjayB0aGlzLgogICAgICAgICA8YnI+PGJyPiBJZiB0aGUgb3B0aW9uIGhhcyBhbiBhcmd1bWVudCwgPENPREU+Z2V0b3B0PC9DT0RFPiByZXR1cm5zIHRoZSBhcmd1bWVudCBieQogICAgICAgICBzdG9yaW5nIGl0IGluIHRoZSB2YXJpYWJsZSA8VkFSPm9wdGFyZzwvVkFSPi4gIFlvdSBkb24ndCBvcmRpbmFyaWx5IG5lZWQgdG8KICAgICAgICAgY29weSB0aGUgPENPREU+b3B0YXJnPC9DT0RFPiBzdHJpbmcsIHNpbmNlIGl0IGlzIGEgcG9pbnRlciBpbnRvIHRoZSBvcmlnaW5hbAogICAgICAgICA8VkFSPmFyZ3Y8L1ZBUj4gYXJyYXksIG5vdCBpbnRvIGEgc3RhdGljIGFyZWEgdGhhdCBtaWdodCBiZSBvdmVyd3JpdHRlbi4KICAgICAgICAgPGJyPjxicj4gSWYgPENPREU+Z2V0b3B0PC9DT0RFPiBmaW5kcyBhbiBvcHRpb24gY2hhcmFjdGVyIGluIDxWQVI+YXJndjwvVkFSPiB0aGF0IHdhcyBub3QKICAgICAgICAgaW5jbHVkZWQgaW4gPFZBUj5vcHRpb25zPC9WQVI+LCBvciBhIG1pc3Npbmcgb3B0aW9uIGFyZ3VtZW50LCBpdCByZXR1cm5zCiAgICAgICAgIDxzYW1wPj88L3NhbXA+IGFuZCBzZXRzIHRoZSBleHRlcm5hbCB2YXJpYWJsZSA8Q09ERT5vcHRvcHQ8L0NPREU+IHRvIHRoZSBhY3R1YWwKICAgICAgICAgb3B0aW9uIGNoYXJhY3Rlci4gIElmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgPFZBUj5vcHRpb25zPC9WQVI+IGlzIGEgY29sb24KICAgICAgICAgKDxzYW1wPjo8L3NhbXA+KSwgdGhlbiA8Q09ERT5nZXRvcHQ8L0NPREU+IHJldHVybnMgPHNhbXA+Ojwvc2FtcD4gaW5zdGVhZCBvZiA8c2FtcD4/PC9zYW1wPiB0bwogICAgICAgICBpbmRpY2F0ZSBhIG1pc3Npbmcgb3B0aW9uIGFyZ3VtZW50LiAgSW4gYWRkaXRpb24sIGlmIHRoZSBleHRlcm5hbAogICAgICAgICB2YXJpYWJsZSA8Q09ERT5vcHRlcnI8L0NPREU+IGlzIG5vbnplcm8gKHdoaWNoIGlzIHRoZSBkZWZhdWx0KSwgPENPREU+Z2V0b3B0PC9DT0RFPgogICAgICAgICBwcmludHMgYW4gZXJyb3IgbWVzc2FnZS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIdW5pc3RkLmh4cQB+DL90ACppbnQgYXJnYywgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKm9wdGlvbnN0AANpbnR0AAtnZXRvcHRfbG9uZ3NxAH4ACnQLKgogICAgICAgIERlY29kZSBvcHRpb25zIGZyb20gdGhlIHZlY3RvciA8VkFSPmFyZ3Y8L1ZBUj4gKHdob3NlIGxlbmd0aCBpcyA8VkFSPmFyZ2M8L1ZBUj4pLgogICAgICAgICBUaGUgYXJndW1lbnQgPFZBUj5zaG9ydG9wdHM8L1ZBUj4gZGVzY3JpYmVzIHRoZSBzaG9ydCBvcHRpb25zIHRvIGFjY2VwdCwganVzdCBhcwogICAgICAgICBpdCBkb2VzIGluIDxDT0RFPmdldG9wdDwvQ09ERT4uICBUaGUgYXJndW1lbnQgPFZBUj5sb25nb3B0czwvVkFSPiBkZXNjcmliZXMgdGhlIGxvbmcKICAgICAgICAgb3B0aW9ucyB0byBhY2NlcHQgKHNlZSBhYm92ZSkuCiAgICAgICAgIDxicj48YnI+IFdoZW4gPENPREU+Z2V0b3B0X2xvbmc8L0NPREU+IGVuY291bnRlcnMgYSBzaG9ydCBvcHRpb24sIGl0IGRvZXMgdGhlIHNhbWUKICAgICAgICAgdGhpbmcgdGhhdCA8Q09ERT5nZXRvcHQ8L0NPREU+IHdvdWxkIGRvOiBpdCByZXR1cm5zIHRoZSBjaGFyYWN0ZXIgY29kZSBmb3IgdGhlCiAgICAgICAgIG9wdGlvbiwgYW5kIHN0b3JlcyB0aGUgb3B0aW9ucyBhcmd1bWVudCAoaWYgaXQgaGFzIG9uZSkgaW4gPENPREU+b3B0YXJnPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gV2hlbiA8Q09ERT5nZXRvcHRfbG9uZzwvQ09ERT4gZW5jb3VudGVycyBhIGxvbmcgb3B0aW9uLCBpdCB0YWtlcyBhY3Rpb25zIGJhc2VkCiAgICAgICAgIG9uIHRoZSA8Q09ERT5mbGFnPC9DT0RFPiBhbmQgPENPREU+dmFsPC9DT0RFPiBmaWVsZHMgb2YgdGhlIGRlZmluaXRpb24gb2YgdGhhdAogICAgICAgICBvcHRpb24uCiAgICAgICAgIDxicj48YnI+IElmIDxDT0RFPmZsYWc8L0NPREU+IGlzIGEgbnVsbCBwb2ludGVyLCB0aGVuIDxDT0RFPmdldG9wdF9sb25nPC9DT0RFPiByZXR1cm5zIHRoZQogICAgICAgICBjb250ZW50cyBvZiA8Q09ERT52YWw8L0NPREU+IHRvIGluZGljYXRlIHdoaWNoIG9wdGlvbiBpdCBmb3VuZC4gIFlvdSBzaG91bGQKICAgICAgICAgYXJyYW5nZSBkaXN0aW5jdCB2YWx1ZXMgaW4gdGhlIDxDT0RFPnZhbDwvQ09ERT4gZmllbGQgZm9yIG9wdGlvbnMgd2l0aAogICAgICAgICBkaWZmZXJlbnQgbWVhbmluZ3MsIHNvIHlvdSBjYW4gZGVjb2RlIHRoZXNlIHZhbHVlcyBhZnRlcgogICAgICAgICA8Q09ERT5nZXRvcHRfbG9uZzwvQ09ERT4gcmV0dXJucy4gIElmIHRoZSBsb25nIG9wdGlvbiBpcyBlcXVpdmFsZW50IHRvIGEgc2hvcnQKICAgICAgICAgb3B0aW9uLCB5b3UgY2FuIHVzZSB0aGUgc2hvcnQgb3B0aW9uJ3MgY2hhcmFjdGVyIGNvZGUgaW4gPENPREU+dmFsPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gSWYgPENPREU+ZmxhZzwvQ09ERT4gaXMgbm90IGEgbnVsbCBwb2ludGVyLCB0aGF0IG1lYW5zIHRoaXMgb3B0aW9uIHNob3VsZCBqdXN0CiAgICAgICAgIHNldCBhIGZsYWcgaW4gdGhlIHByb2dyYW0uICBUaGUgZmxhZyBpcyBhIHZhcmlhYmxlIG9mIHR5cGUgPENPREU+aW50PC9DT0RFPgogICAgICAgICB0aGF0IHlvdSBkZWZpbmUuICBQdXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGZsYWcgaW4gdGhlIDxDT0RFPmZsYWc8L0NPREU+IGZpZWxkLgogICAgICAgICBQdXQgaW4gdGhlIDxDT0RFPnZhbDwvQ09ERT4gZmllbGQgdGhlIHZhbHVlIHlvdSB3b3VsZCBsaWtlIHRoaXMgb3B0aW9uIHRvCiAgICAgICAgIHN0b3JlIGluIHRoZSBmbGFnLiAgSW4gdGhpcyBjYXNlLCA8Q09ERT5nZXRvcHRfbG9uZzwvQ09ERT4gcmV0dXJucyA8Q09ERT4wPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gRm9yIGFueSBsb25nIG9wdGlvbiwgPENPREU+Z2V0b3B0X2xvbmc8L0NPREU+IHRlbGxzIHlvdSB0aGUgaW5kZXggaW4gdGhlIGFycmF5CiAgICAgICAgIDxWQVI+bG9uZ29wdHM8L1ZBUj4gb2YgdGhlIG9wdGlvbnMgZGVmaW5pdGlvbiwgYnkgc3RvcmluZyBpdCBpbnRvCiAgICAgICAgIDxDT0RFPio8VkFSPmluZGV4cHRyPC9WQVI+PC9DT0RFPi4gIFlvdSBjYW4gZ2V0IHRoZSBuYW1lIG9mIHRoZSBvcHRpb24gd2l0aAogICAgICAgICA8Q09ERT48VkFSPmxvbmdvcHRzPC9WQVI+Wyo8VkFSPmluZGV4cHRyPC9WQVI+XS5uYW1lPC9DT0RFPi4gIFNvIHlvdSBjYW4gZGlzdGluZ3Vpc2ggYW1vbmcKICAgICAgICAgbG9uZyBvcHRpb25zIGVpdGhlciBieSB0aGUgdmFsdWVzIGluIHRoZWlyIDxDT0RFPnZhbDwvQ09ERT4gZmllbGRzIG9yIGJ5IHRoZWlyCiAgICAgICAgIGluZGljZXMuICBZb3UgY2FuIGFsc28gZGlzdGluZ3Vpc2ggaW4gdGhpcyB3YXkgYW1vbmcgbG9uZyBvcHRpb25zIHRoYXQKICAgICAgICAgc2V0IGZsYWdzLgogICAgICAgICA8YnI+PGJyPiBXaGVuIGEgbG9uZyBvcHRpb24gaGFzIGFuIGFyZ3VtZW50LCA8Q09ERT5nZXRvcHRfbG9uZzwvQ09ERT4gcHV0cyB0aGUgYXJndW1lbnQKICAgICAgICAgdmFsdWUgaW4gdGhlIHZhcmlhYmxlIDxDT0RFPm9wdGFyZzwvQ09ERT4gYmVmb3JlIHJldHVybmluZy4gIFdoZW4gdGhlIG9wdGlvbgogICAgICAgICBoYXMgbm8gYXJndW1lbnQsIHRoZSB2YWx1ZSBpbiA8Q09ERT5vcHRhcmc8L0NPREU+IGlzIGEgbnVsbCBwb2ludGVyLiAgVGhpcyBpcwogICAgICAgICBob3cgeW91IGNhbiB0ZWxsIHdoZXRoZXIgYW4gb3B0aW9uYWwgYXJndW1lbnQgd2FzIHN1cHBsaWVkLgogICAgICAgICA8YnI+PGJyPiBXaGVuIDxDT0RFPmdldG9wdF9sb25nPC9DT0RFPiBoYXMgbm8gbW9yZSBvcHRpb25zIHRvIGhhbmRsZSwgaXQgcmV0dXJucwogICAgICAgICA8Q09ERT4tMTwvQ09ERT4sIGFuZCBsZWF2ZXMgaW4gdGhlIHZhcmlhYmxlIDxDT0RFPm9wdGluZDwvQ09ERT4gdGhlIGluZGV4IGluCiAgICAgICAgIDxWQVI+YXJndjwvVkFSPiBvZiB0aGUgbmV4dCByZW1haW5pbmcgYXJndW1lbnQuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACGdldG9wdC5oeHEAfgzGdABgaW50IGFyZ2MsIGNoYXIgKmNvbnN0ICphcmd2LCBjb25zdCBjaGFyICpzaG9ydG9wdHMsIGNvbnN0IHN0cnVjdCBvcHRpb24gKmxvbmdvcHRzLCBpbnQgKmluZGV4cHRydAADaW50dAAQZ2V0b3B0X2xvbmdfb25seXNxAH4ACnQDsgogICAgICAgIDxicj48YnI+IFRoZSA8Q09ERT5nZXRvcHRfbG9uZ19vbmx5PC9DT0RFPiBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIHRoZQogICAgICAgICA8Q09ERT5nZXRvcHRfbG9uZzwvQ09ERT4gZnVuY3Rpb24gYnV0IGl0IGFsbG93cyB0byBzcGVjaWZ5IHRoZSB1c2VyIG9mIHRoZQogICAgICAgICBhcHBsaWNhdGlvbiB0byBwYXNzIGxvbmcgb3B0aW9ucyB3aXRoIG9ubHkgPHNhbXA+LTwvc2FtcD4gaW5zdGVhZCBvZgogICAgICAgICA8c2FtcD4tLTwvc2FtcD4uICBUaGUgPHNhbXA+LS08L3NhbXA+IHByZWZpeCBpcyBzdGlsbCByZWNvZ25pemVkIGJ1dCBpbnN0ZWFkIG9mCiAgICAgICAgIGxvb2tpbmcgdGhyb3VnaCB0aGUgc2hvcnQgb3B0aW9ucyBpZiBhIDxzYW1wPi08L3NhbXA+IGlzIHNlZW4gaXQgaXMgZmlyc3QKICAgICAgICAgdHJpZWQgd2hldGhlciB0aGlzIHBhcmFtZXRlciBuYW1lcyBhIGxvbmcgb3B0aW9uLiAgSWYgbm90LCBpdCBpcyBwYXJzZWQKICAgICAgICAgYXMgYSBzaG9ydCBvcHRpb24uCiAgICAgICAgIDxicj48YnI+IEFzc3VtaW5nIDxDT0RFPmdldG9wdF9sb25nX29ubHk8L0NPREU+IGlzIHVzZWQgc3RhcnRpbmcgYW4gYXBwbGljYXRpb24gd2l0aAogICAgICAgICA8YnI+PGJyPiA8cHJlPjxicj4KICAgICAgICAgICBhcHAgLWZvbzxicj4KICAgICAgICAgPC9wcmU+CiAgICAgICAgIDxicj48YnI+CiAgICAgICAgIHRoZSA8Q09ERT5nZXRvcHRfbG9uZ19vbmx5PC9DT0RFPiB3aWxsIGZpcnN0IGxvb2sgZm9yIGEgbG9uZyBvcHRpb24gbmFtZWQKICAgICAgICAgPHNhbXA+Zm9vPC9zYW1wPi4gIElmIHRoaXMgaXMgbm90IGZvdW5kLCB0aGUgc2hvcnQgb3B0aW9ucyA8c2FtcD5mPC9zYW1wPiwgPHNhbXA+bzwvc2FtcD4sCiAgICAgICAgIGFuZCBhZ2FpbiA8c2FtcD5vPC9zYW1wPiBhcmUgcmVjb2duaXplZC4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIZ2V0b3B0Lmh4cQB+DM10AGBpbnQgYXJnYywgY2hhciAqY29uc3QgKmFyZ3YsIGNvbnN0IGNoYXIgKnNob3J0b3B0cywgY29uc3Qgc3RydWN0IG9wdGlvbiAqbG9uZ29wdHMsIGludCAqaW5kZXhwdHJ0AANpbnR0AAtnZXRwYWdlc2l6ZXNxAH4ACnQBFgogICAgICAgIFRoZSA8Q09ERT5nZXRwYWdlc2l6ZTwvQ09ERT4gZnVuY3Rpb24gcmV0dXJucyB0aGUgcGFnZSBzaXplIG9mIHRoZSBwcm9jZXNzLgogICAgICAgICBUaGlzIHZhbHVlIGlzIGZpeGVkIGZvciB0aGUgcnVudGltZSBvZiB0aGUgcHJvY2VzcyBidXQgY2FuIHZhcnkgaW4KICAgICAgICAgZGlmZmVyZW50IHJ1bnMgb2YgdGhlIGFwcGxpY2F0aW9uLgogICAgICAgICA8YnI+PGJyPiBUaGUgZnVuY3Rpb24gaXMgZGVjbGFyZWQgaW4gPFRUPnVuaXN0ZC5oPC9UVD4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHVuaXN0ZC5oeHEAfgzUdAAEdm9pZHQAA2ludHQAB2dldHBhc3NzcQB+AAp0BAkKICAgICAgICA8YnI+PGJyPiA8Q09ERT5nZXRwYXNzPC9DT0RFPiBvdXRwdXRzIDxWQVI+cHJvbXB0PC9WQVI+LCB0aGVuIHJlYWRzIGEgc3RyaW5nIGluIGZyb20gdGhlCiAgICAgICAgIHRlcm1pbmFsIHdpdGhvdXQgZWNob2luZyBpdC4gIEl0IHRyaWVzIHRvIGNvbm5lY3QgdG8gdGhlIHJlYWwgdGVybWluYWwsCiAgICAgICAgIDxUVD4vZGV2L3R0eTwvVFQ+LCBpZiBwb3NzaWJsZSwgdG8gZW5jb3VyYWdlIHVzZXJzIG5vdCB0byBwdXQgcGxhaW50ZXh0CiAgICAgICAgIHBhc3N3b3JkcyBpbiBmaWxlczsgb3RoZXJ3aXNlLCBpdCB1c2VzIDxDT0RFPnN0ZGluPC9DT0RFPiBhbmQgPENPREU+c3RkZXJyPC9DT0RFPi4KICAgICAgICAgPENPREU+Z2V0cGFzczwvQ09ERT4gYWxzbyBkaXNhYmxlcyB0aGUgSU5UUiwgUVVJVCwgYW5kIFNVU1AgY2hhcmFjdGVycyBvbiB0aGUKICAgICAgICAgdGVybWluYWwgdXNpbmcgdGhlIDxDT0RFPklTSUc8L0NPREU+IHRlcm1pbmFsIGF0dHJpYnV0ZSAuCiAgICAgICAgIFRoZSB0ZXJtaW5hbCBpcyBmbHVzaGVkIGJlZm9yZSBhbmQgYWZ0ZXIgPENPREU+Z2V0cGFzczwvQ09ERT4sIHNvIHRoYXQKICAgICAgICAgY2hhcmFjdGVycyBvZiBhIG1pc3R5cGVkIHBhc3N3b3JkIGFyZSBub3QgYWNjaWRlbnRhbGx5IHZpc2libGUuCiAgICAgICAgIDxicj48YnI+IEluIG90aGVyIEMgbGlicmFyaWVzLCA8Q09E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ICAgICAgICBUaGUgdmFsdWUgb2YgPFZBUj5jbGFzczwvVkFSPiBpcyBub3QgdmFsaWQuCgogICAgICAgICA8YnI+PGJyPiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIDxDT0RFPi0xPC9DT0RFPiwgaXQgY291bGQgaW5kaWNhdGUgZmFpbHVyZSwgb3IgaXQgY291bGQKICAgICAgICAgYmUgdGhlIG5pY2UgdmFsdWUuICBUaGUgb25seSB3YXkgdG8gbWFrZSBjZXJ0YWluIGlzIHRvIHNldCA8Q09ERT5lcnJubyA9CiAgICAgICAgIDA8L0NPREU+IGJlZm9yZSBjYWxsaW5nIDxDT0RFPmdldHByaW9yaXR5PC9DT0RFPiwgdGhlbiB1c2UgPENPREU+ZXJybm8gIT0gMDwvQ09ERT4KICAgICAgICAgYWZ0ZXJ3YXJkIGFzIHRoZSBjcml0ZXJpb24gZm9yIGZhaWx1cmUuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQADnN5cy9yZXNvdXJjZS5oeHEAfgz4dAARaW50IGNsYXNzLCBpbnQgaWR0AANpbnR0AA5nZXRwcm90b2J5bmFtZXNxAH4ACnQAzAogICAgICAgIFRoZSA8Q09ERT5nZXRwcm90b2J5bmFtZTwvQ09ERT4gZnVuY3Rpb24gcmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKICAgICAgICAgbmV0d29yayBwcm90b2NvbCBuYW1lZCA8VkFSPm5hbWU8L1ZBUj4uICBJZiB0aGVyZSBpcyBubyBzdWNoIHByb3RvY29sLCBpdAogICAgICAgICByZXR1cm5zIGEgbnVsbCBwb2ludGVyLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAduZXRkYi5oeHEAfgz/dAAQY29uc3QgY2hhciAqbmFtZXQAEXN0cnVjdCBwcm90b2VudCAqdAAQZ2V0cHJvdG9ieW51bWJlcnNxAH4ACnQA2AogICAgICAgIFRoZSA8Q09ERT5nZXRwcm90b2J5bnVtYmVyPC9DT0RFPiBmdW5jdGlvbiByZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZQogICAgICAgICBuZXR3b3JrIHByb3RvY29sIHdpdGggbnVtYmVyIDxWQVI+cHJvdG9jb2w8L1ZBUj4uICBJZiB0aGVyZSBpcyBubyBzdWNoCiAgICAgICAgIHByb3RvY29sLCBpdCByZXR1cm5zIGEgbnVsbCBwb2ludGVyLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAduZXRkYi5oeHEAfg0GdAAMaW50IHByb3RvY29sdAARc3RydWN0IHByb3RvZW50ICp0AAtnZXRwcm90b2VudHNxAH4ACnQAkwogICAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbmV4dCBlbnRyeSBpbiB0aGUgcHJvdG9jb2xzIGRhdGFiYXNlLiAgSXQKICAgICAgICAgcmV0dXJucyBhIG51bGwgcG9pbnRlciBpZiB0aGVyZSBhcmUgbm8gbW9yZSBlbnRyaWVzLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAduZXRkYi5oeHEAfg0NdAAEdm9pZHQAEXN0cnVjdCBwcm90b2VudCAqdAAFZ2V0cHRzcQB+AAp0AjgKICAgICAgICBUaGUgPENPREU+Z2V0cHQ8L0NPREU+IGZ1bmN0aW9uIHJldHVybnMgYSBuZXcgZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgbmV4dAogICAgICAgICBhdmFpbGFibGUgbWFzdGVyIHBzZXVkby10ZXJtaW5hbC4gIFRoZSBub3JtYWwgcmV0dXJuIHZhbHVlIGZyb20KICAgICAgICAgPENPREU+Z2V0cHQ8L0NPREU+IGlzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgZmlsZSBkZXNjcmlwdG9yLiAgSW4gdGhlIGNhc2Ugb2YKICAgICAgICAgYW4gZXJyb3IsIGEgdmFsdWUgb2YgLTEgaXMgcmV0dXJuZWQgaW5zdGVhZC4gIFRoZSBmb2xsb3dpbmcKICAgICAgICAgPENPREU+ZXJybm88L0NPREU+IGNvbmRpdGlvbnMgYXJlIGRlZmluZWQgZm9yIHRoaXMgZnVuY3Rpb246CiAgICAgICAgIDxicj48YnI+IDxETD4KCiAgICAgICAgIDxEVD48Q09ERT5FTk9FTlQ8L0NPREU+CjxERD4KICAgICAgICAgVGhlcmUgYXJlIG5vIGZyZWUgbWFzdGVyIHBzZXVkby10ZXJtaW5hbHMgYXZhaWxhYmxlLgoKICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiBpcyBhIEdOVSBleHRlbnNpb24uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHN0ZGxpYi5oeHEAfg0UdAAEdm9pZHQAA2ludHQACGdldHB3ZW50c3EAfgAKdAHQCiAgICAgICAgVGhlIDxDT0RFPmdldHB3ZW50PC9DT0RFPiBmdW5jdGlvbiByZWFkcyB0aGUgbmV4dCBlbnRyeSBmcm9tIHRoZSBzdHJlYW0KICAgICAgICAgaW5pdGlhbGl6ZWQgYnkgPENPREU+c2V0cHdlbnQ8L0NPREU+LiAgSXQgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGVudHJ5LiAgVGhlCiAgICAgICAgIHN0cnVjdHVyZSBpcyBzdGF0aWNhbGx5IGFsbG9jYXRlZCBhbmQgaXMgcmV3cml0dGVuIG9uIHN1YnNlcXVlbnQgY2FsbHMKICAgICAgICAgdG8gPENPREU+Z2V0cHdlbnQ8L0NPREU+LiAgWW91IG11c3QgY29weSB0aGUgY29udGVudHMgb2YgdGhlIHN0cnVjdHVyZSBpZiB5b3UKICAgICAgICAgd2lzaCB0byBzYXZlIHRoZSBpbmZvcm1hdGlvbi4KICAgICAgICAgPGJyPjxicj4gQSBudWxsIHBvaW50ZXIgaXMgcmV0dXJuZWQgd2hlbiBubyBtb3JlIGVudHJpZXMgYXJlIGF2YWlsYWJsZS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAFcHdkLmh4cQB+DRt0AAR2b2lkdAAPc3RydWN0IHBhc3N3ZCAqdAAKZ2V0cHdlbnRfcnNxAH4ACnQBsAogICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byA8Q09ERT5nZXRwd2VudDwvQ09ERT4gaW4gdGhhdCBpdCByZXR1cm5zIHRoZSBuZXh0CiAgICAgICAgIGVudHJ5IGZyb20gdGhlIHN0cmVhbSBpbml0aWFsaXplZCBieSA8Q09ERT5zZXRwd2VudDwvQ09ERT4uICBMaWtlCiAgICAgICAgIDxDT0RFPmZnZXRwd2VudF9yPC9DT0RFPiwgaXQgdXNlcyB0aGUgdXNlci1zdXBwbGllZCBidWZmZXJzIGluCiAgICAgICAgIDxWQVI+cmVzdWx0X2J1ZjwvVkFSPiBhbmQgPFZBUj5idWZmZXI8L1ZBUj4gdG8gcmV0dXJuIHRoZSBpbmZvcm1hdGlvbiByZXF1ZXN0ZWQuCiAgICAgICAgIDxicj48YnI+IFRoZSByZXR1cm4gdmFsdWVzIGFyZSB0aGUgc2FtZSBhcyBmb3IgPENPREU+ZmdldHB3ZW50X3I8L0NPREU+LgogICAgICAgICA8YnI+PGJyPgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAVwd2QuaHhxAH4NInQAS3N0cnVjdCBwYXNzd2QgKnJlc3VsdF9idWYsIGNoYXIgKmJ1ZmZlciwgaW50IGJ1Zmxlbiwgc3RydWN0IHBhc3N3ZCAqKnJlc3VsdHQAA2ludHQACGdldHB3bmFtc3EAfgAKdAFkCiAgICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byBhIHN0YXRpY2FsbHktYWxsb2NhdGVkIHN0cnVjdHVyZQogICAgICAgICBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSB1c2VyIHdob3NlIHVzZXIgbmFtZSBpcyA8VkFSPm5hbWU8L1ZBUj4uCiAgICAgICAgIFRoaXMgc3RydWN0dXJlIG1heSBiZSBvdmVyd3JpdHRlbiBvbiBzdWJzZXF1ZW50IGNhbGxzIHRvCiAgICAgICAgIDxDT0RFPmdldHB3bmFtPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gQSBudWxsIHBvaW50ZXIgcmV0dXJuIGluZGljYXRlcyB0aGVyZSBpcyBubyB1c2VyIG5hbWVkIDxWQVI+bmFtZTwvVkFSPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAFcHdkLmh4cQB+DSl0ABBjb25zdCBjaGFyICpuYW1ldAAPc3RydWN0IHBhc3N3ZCAqdAAKZ2V0cHduYW1fcnNxAH4ACnQBuwogICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byA8Q09ERT5nZXRwd25hbTwvQ09ERT4gaW4gdGhhdCBpcyByZXR1cm5zCiAgICAgICAgIGluZm9ybWF0aW9uIGFib3V0IHRoZSB1c2VyIHdob3NlIHVzZXIgbmFtZSBpcyA8VkFSPm5hbWU8L1ZBUj4uICBIb3dldmVyLCBsaWtlCiAgICAgICAgIDxDT0RFPmdldHB3dWlkX3I8L0NPREU+LCBpdCBmaWxscyB0aGUgdXNlciBzdXBwbGllZCBidWZmZXJzIGluCiAgICAgICAgIDxWQVI+cmVzdWx0X2J1ZjwvVkFSPiBhbmQgPFZBUj5idWZmZXI8L1ZBUj4gd2l0aCB0aGUgaW5mb3JtYXRpb24gaW5zdGVhZCBvZiB1c2luZwogICAgICAgICBhIHN0YXRpYyBidWZmZXIuCiAgICAgICAgIDxicj48YnI+IFRoZSByZXR1cm4gdmFsdWVzIGFyZSB0aGUgc2FtZSBhcyBmb3IgPENPREU+Z2V0cHd1aWRfcjwvQ09ERT4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQABXB3ZC5oeHEAfg0wdABgY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHBhc3N3ZCAqcmVzdWx0X2J1ZiwgY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmbGVuLCBzdHJ1Y3QgcGFzc3dkICoqcmVzdWx0dAADaW50dAAIZ2V0cHd1aWRzcQB+AAp0AXgKICAgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIHRvIGEgc3RhdGljYWxseS1hbGxvY2F0ZWQgc3RydWN0dXJlCiAgICAgICAgIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVzZXIgd2hvc2UgdXNlciBJRCBpcyA8VkFSPnVpZDwvVkFSPi4gIFRoaXMKICAgICAgICAgc3RydWN0dXJlIG1heSBiZSBvdmVyd3JpdHRlbiBvbiBzdWJzZXF1ZW50IGNhbGxzIHRvIDxDT0RFPmdldHB3dWlkPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gQSBudWxsIHBvaW50ZXIgdmFsdWUgaW5kaWNhdGVzIHRoZXJlIGlzIG5vIHVzZXIgaW4gdGhlIGRhdGEgYmFzZSB3aXRoCiAgICAgICAgIHVzZXIgSUQgPFZBUj51aWQ8L1ZBUj4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQABXB3ZC5oeHEAfg03dAAJdWlkX3QgdWlkdAAPc3RydWN0IHBhc3N3ZCAqdAAKZ2V0cHd1aWRfcnNxAH4ACnQElwogICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byA8Q09ERT5nZXRwd3VpZDwvQ09ERT4gaW4gdGhhdCBpdCByZXR1cm5zCiAgICAgICAgIGluZm9ybWF0aW9uIGFib3V0IHRoZSB1c2VyIHdob3NlIHVzZXIgSUQgaXMgPFZBUj51aWQ8L1ZBUj4uICBIb3dldmVyLCBpdAogICAgICAgICBmaWxscyB0aGUgdXNlciBzdXBwbGllZCBzdHJ1Y3R1cmUgcG9pbnRlZCB0byBieSA8VkFSPnJlc3VsdF9idWY8L1ZBUj4gd2l0aAogICAgICAgICB0aGUgaW5mb3JtYXRpb24gaW5zdGVhZCBvZiB1c2luZyBhIHN0YXRpYyBidWZmZXIuICBUaGUgZmlyc3QKICAgICAgICAgPFZBUj5idWZsZW48L1ZBUj4gYnl0ZXMgb2YgdGhlIGFkZGl0aW9uYWwgYnVmZmVyIHBvaW50ZWQgdG8gYnkgPFZBUj5idWZmZXI8L1ZBUj4KICAgICAgICAgYXJlIHVzZWQgdG8gY29udGFpbiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLCBub3JtYWxseSBzdHJpbmdzIHdoaWNoIGFyZQogICAgICAgICBwb2ludGVkIHRvIGJ5IHRoZSBlbGVtZW50cyBvZiB0aGUgcmVzdWx0IHN0cnVjdHVyZS4KICAgICAgICAgPGJyPjxicj4gSWYgYSB1c2VyIHdpdGggSUQgPFZBUj51aWQ8L1ZBUj4gaXMgZm91bmQsIHRoZSBwb2ludGVyIHJldHVybmVkIGluCiAgICAgICAgIDxWQVI+cmVzdWx0PC9WQVI+IHBvaW50cyB0byB0aGUgcmVjb3JkIHdoaWNoIGNvbnRhaW5zIHRoZSB3YW50ZWQgZGF0YSAoaS5lLiwKICAgICAgICAgPFZBUj5yZXN1bHQ8L1ZBUj4gY29udGFpbnMgdGhlIHZhbHVlIDxWQVI+cmVzdWx0X2J1ZjwvVkFSPikuICBJZiBubyB1c2VyIGlzIGZvdW5kCiAgICAgICAgIG9yIGlmIGFuIGVycm9yIG9jY3VycmVkLCB0aGUgcG9pbnRlciByZXR1cm5lZCBpbiA8VkFSPnJlc3VsdDwvVkFSPiBpcyBhIG51bGwKICAgICAgICAgcG9pbnRlci4gIFRoZSBmdW5jdGlvbiByZXR1cm5zIHplcm8gb3IgYW4gZXJyb3IgY29kZS4gIElmIHRoZSBidWZmZXIKICAgICAgICAgPFZBUj5idWZmZXI8L1ZBUj4gaXMgdG9vIHNtYWxsIHRvIGNvbnRhaW4gYWxsIHRoZSBuZWVkZWQgaW5mb3JtYXRpb24sIHRoZQogICAgICAgICBlcnJvciBjb2RlIDxDT0RFPkVSQU5HRTwvQ09ERT4gaXMgcmV0dXJuZWQgYW5kIDxWQVI+ZXJybm88L1ZBUj4gaXMgc2V0IHRvCiAgICAgICAgIDxDT0RFPkVSQU5HRTwvQ09ERT4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQABXB3ZC5oeHEAfg0+dABZdWlkX3QgdWlkLCBzdHJ1Y3QgcGFzc3dkICpyZXN1bHRfYnVmLCBjaGFyICpidWZmZXIsIHNpemVfdCBidWZsZW4sIHN0cnVjdCBwYXNzd2QgKipyZXN1bHR0AANpbnR0AAlnZXRybGltaXRzcQB+AAp0Aj8KICAgICAgICBSZWFkIHRoZSBjdXJyZW50IGFuZCBtYXhpbXVtIGxpbWl0cyBmb3IgdGhlIHJlc291cmNlIDxWQVI+cmVzb3VyY2U8L1ZBUj4KICAgICAgICAgYW5kIHN0b3JlIHRoZW0gaW4gPENPREU+KjxWQVI+cmxwPC9WQVI+PC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gVGhlIHJldHVybiB2YWx1ZSBpcyA8Q09ERT4wPC9DT0RFPiBvbiBzdWNjZXNzIGFuZCA8Q09ERT4tMTwvQ09ERT4gb24gZmFpbHVyZS4gIFRoZQogICAgICAgICBvbmx5IHBvc3NpYmxlIDxDT0RFPmVycm5vPC9DT0RFPiBlcnJvciBjb25kaXRpb24gaXMgPENPREU+RUZBVUxUPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gV2hlbiB0aGUgc291cmNlcyBhcmUgY29tcGlsZWQgd2l0aCA8Q09ERT5fRklMRV9PRkZTRVRfQklUUyA9PSA2NDwvQ09ERT4gb24gYQogICAgICAgICAzMi1iaXQgc3lzdGVtIHRoaXMgZnVuY3Rpb24gaXMgaW4gZmFjdCA8Q09ERT5nZXRybGltaXQ2NDwvQ09ERT4uICBUaHVzLCB0aGUKICAgICAgICAgTEZTIGludGVyZmFjZSB0cmFuc3BhcmVudGx5IHJlcGxhY2VzIHRoZSBvbGQgaW50ZXJmYWNlLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AA5zeXMvcmVzb3VyY2UuaHhxAH4NRXQAIGludCByZXNvdXJjZSwgc3RydWN0IHJsaW1pdCAqcmxwdAADaW50dAALZ2V0cmxpbWl0NjRzcQB+AAp0AgsKICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gPENPREU+Z2V0cmxpbWl0PC9DT0RFPiBidXQgaXRzIHNlY29uZCBwYXJhbWV0ZXIgaXMKICAgICAgICAgYSBwb2ludGVyIHRvIGEgdmFyaWFibGUgb2YgdHlwZSA8Q09ERT5zdHJ1Y3QgcmxpbWl0NjQ8L0NPREU+LCB3aGljaCBhbGxvd3MgaXQKICAgICAgICAgdG8gcmVhZCB2YWx1ZXMgd2hpY2ggd291bGRuJ3QgZml0IGluIHRoZSBtZW1iZXIgb2YgYSA8Q09ERT5zdHJ1Y3QKICAgICAgICAgcmxpbWl0PC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gSWYgdGhlIHNvdXJjZXMgYXJlIGNvbXBpbGVkIHdpdGggPENPREU+X0ZJTEVfT0ZGU0VUX0JJVFMgPT0gNjQ8L0NPREU+IG9uIGEKICAgICAgICAgMzItYml0IG1hY2hpbmUsIHRoaXMgZnVuY3Rpb24gaXMgYXZhaWxhYmxlIHVuZGVyIHRoZSBuYW1lCiAgICAgICAgIDxDT0RFPmdldHJsaW1pdDwvQ09ERT4gYW5kIHNvIHRyYW5zcGFyZW50bHkgcmVwbGFjZXMgdGhlIG9sZCBpbnRlcmZhY2UuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQADnN5cy9yZXNvdXJjZS5oeHEAfg1MdAAiaW50IHJlc291cmNlLCBzdHJ1Y3QgcmxpbWl0NjQgKnJscHQAA2ludHQACWdldHJ1c2FnZXNxAH4ACnQDWwogICAgICAgIFRoaXMgZnVuY3Rpb24gcmVwb3J0cyByZXNvdXJjZSB1c2FnZSB0b3RhbHMgZm9yIHByb2Nlc3NlcyBzcGVjaWZpZWQgYnkKICAgICAgICAgPFZBUj5wcm9jZXNzZXM8L1ZBUj4sIHN0b3JpbmcgdGhlIGluZm9ybWF0aW9uIGluIDxDT0RFPio8VkFSPnJ1c2FnZTwvVkFSPjwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IEluIG1vc3Qgc3lzdGVtcywgPFZBUj5wcm9jZXNzZXM8L1ZBUj4gaGFzIG9ubHkgdHdvIHZhbGlkIHZhbHVlczoKICAgICAgICAgPGJyPjxicj4gPERMPgoKICAgICAgICAgPERUPjxDT0RFPlJVU0FHRV9TRUxGPC9DT0RFPgo8REQ+CiAgICAgICAgIEp1c3QgdGhlIGN1cnJlbnQgcHJvY2Vzcy4KICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPlJVU0FHRV9DSElMRFJFTjwvQ09ERT4KPEREPgogICAgICAgICBBbGwgY2hpbGQgcHJvY2Vzc2VzIChkaXJlY3QgYW5kIGluZGlyZWN0KSB0aGF0IGhhdmUgYWxyZWFkeSB0ZXJtaW5hdGVkLgoKICAgICAgICAgPGJyPjxicj4gSW4gdGhlIEdOVSBzeXN0ZW0sIHlvdSBjYW4gYWxzbyBpbnF1aXJlIGFib3V0IGEgcGFydGljdWxhciBjaGlsZCBwcm9jZXNzCiAgICAgICAgIGJ5IHNwZWNpZnlpbmcgaXRzIHByb2Nlc3MgSUQuCiAgICAgICAgIDxicj48YnI+IFRoZSByZXR1cm4gdmFsdWUgb2YgPENPREU+Z2V0cnVzYWdlPC9DT0RFPiBpcyB6ZXJvIGZvciBzdWNjZXNzLCBhbmQgPENPREU+LTE8L0NPREU+CiAgICAgICAgIGZvciBmYWlsdXJlLgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8TEk+IEVJTlZBTAogICAgICAgICBUaGUgYXJndW1lbnQgPFZBUj5wcm9jZXNzZXM8L1ZBUj4gaXMgbm90IHZhbGlkLgoKICAgICAgICBzcQB+AA8AAAACdwQAAAACdAAIbWFsbG9jLmh0AA5zeXMvcmVzb3VyY2UuaHhxAH4NU3QAJGludCBwcm9jZXNzZXMsIHN0cnVjdCBydXNhZ2UgKnJ1c2FnZXQAA2ludHQADWdldHNlcnZieW5hbWVzcQB+AAp0AXsKICAgICAgICBUaGUgPENPREU+Z2V0c2VydmJ5bmFtZTwvQ09ERT4gZnVuY3Rpb24gcmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKICAgICAgICAgc2VydmljZSBuYW1lZCA8VkFSPm5hbWU8L1ZBUj4gdXNpbmcgcHJvdG9jb2wgPFZBUj5wcm90bzwvVkFSPi4gIElmIGl0IGNhbid0IGZpbmQKICAgICAgICAgc3VjaCBhIHNlcnZpY2UsIGl0IHJldHVybnMgYSBudWxsIHBvaW50ZXIuCiAgICAgICAgIDxicj48YnI+IFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIGZvciBzZXJ2ZXJzIGFzIHdlbGwgYXMgZm9yIGNsaWVudHM7IHNlcnZlcnMKICAgICAgICAgdXNlIGl0IHRvIGRldGVybWluZSB3aGljaCBwb3J0IHRoZXkgc2hvdWxkIGxpc3RlbiBvbiAuCiAgICAgICAgc3EAfgAPAAAAAncEAAAAAnQADG5ldGluZXQvaW4uaHQAB25ldGRiLmh4cQB+DVt0ACNjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpwcm90b3QAEHN0cnVjdCBzZXJ2ZW50ICp0AA1nZXRzZXJ2Ynlwb3J0c3EAfgAKdADnCiAgICAgICAgVGhlIDxDT0RFPmdldHNlcnZieXBvcnQ8L0NPREU+IGZ1bmN0aW9uIHJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlCiAgICAgICAgIHNlcnZpY2UgYXQgcG9ydCA8VkFSPnBvcnQ8L1ZBUj4gdXNpbmcgcHJvdG9jb2wgPFZBUj5wcm90bzwvVkFSPi4gIElmIGl0IGNhbid0CiAgICAgICAgIGZpbmQgc3VjaCBhIHNlcnZpY2UsIGl0IHJldHVybnMgYSBudWxsIHBvaW50ZXIuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB25ldGRiLmh4cQB+DWN0ABtpbnQgcG9ydCwgY29uc3QgY2hhciAqcHJvdG90ABBzdHJ1Y3Qgc2VydmVudCAqdAAKZ2V0c2VydmVudHNxAH4ACnQAkwogICAg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dWN0IHNvY2thZGRyICphZGRyLCBzb2NrbGVuX3QgKmxlbmd0aC1wdHJ0AANpbnR0AApnZXRzb2Nrb3B0c3EAfgAKdASFCiAgICAgICAgVGhlIDxDT0RFPmdldHNvY2tvcHQ8L0NPREU+IGZ1bmN0aW9uIGdldHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHZhbHVlIG9mCiAgICAgICAgIG9wdGlvbiA8VkFSPm9wdG5hbWU8L1ZBUj4gYXQgbGV2ZWwgPFZBUj5sZXZlbDwvVkFSPiBmb3Igc29ja2V0IDxWQVI+c29ja2V0PC9WQVI+LgogICAgICAgICA8YnI+PGJyPiBUaGUgb3B0aW9uIHZhbHVlIGlzIHN0b3JlZCBpbiBhIGJ1ZmZlciB0aGF0IDxWQVI+b3B0dmFsPC9WQVI+IHBvaW50cyB0by4KICAgICAgICAgQmVmb3JlIHRoZSBjYWxsLCB5b3Ugc2hvdWxkIHN1cHBseSBpbiA8Q09ERT4qPFZBUj5vcHRsZW4tcHRyPC9WQVI+PC9DT0RFPiB0aGUKICAgICAgICAgc2l6ZSBvZiB0aGlzIGJ1ZmZlcjsgb24gcmV0dXJuLCBpdCBjb250YWlucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mCiAgICAgICAgIGluZm9ybWF0aW9uIGFjdHVhbGx5IHN0b3JlZCBpbiB0aGUgYnVmZmVyLgogICAgICAgICA8YnI+PGJyPiBNb3N0IG9wdGlvbnMgaW50ZXJwcmV0IHRoZSA8VkFSPm9wdHZhbDwvVkFSPiBidWZmZXIgYXMgYSBzaW5nbGUgPENPREU+aW50PC9DT0RFPgogICAgICAgICB2YWx1ZS4KICAgICAgICAgPGJyPjxicj4gVGhlIGFjdHVhbCByZXR1cm4gdmFsdWUgb2YgPENPREU+Z2V0c29ja29wdDwvQ09ERT4gaXMgPENPREU+MDwvQ09ERT4gb24gc3VjY2VzcwogICAgICAgICBhbmQgPENPREU+LTE8L0NPREU+IG9uIGZhaWx1cmUuICBUaGUgZm9sbG93aW5nIDxDT0RFPmVycm5vPC9DT0RFPiBlcnJvciBjb25kaXRpb25zCiAgICAgICAgIGFyZSBkZWZpbmVkOgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8RFQ+PENPREU+RUJBREY8L0NPREU+CjxERD4KICAgICAgICAgVGhlIDxWQVI+c29ja2V0PC9WQVI+IGFyZ3VtZW50IGlzIG5vdCBhIHZhbGlkIGZpbGUgZGVzY3JpcHRvci4KICAgICAgICAgPGJyPjxicj4gPExJPiBFTk9UU09DSwogICAgICAgICBUaGUgZGVzY3JpcHRvciA8VkFSPnNvY2tldDwvVkFSPiBpcyBub3QgYSBzb2NrZXQuCiAgICAgICAgIDxicj48YnI+IDxMST4gRU5PUFJPVE9PUFQKICAgICAgICAgVGhlIDxWQVI+b3B0bmFtZTwvVkFSPiBkb2Vzbid0IG1ha2Ugc2Vuc2UgZm9yIHRoZSBnaXZlbiA8VkFSPmxldmVsPC9WQVI+LgoKICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAMc3lzL3NvY2tldC5oeHEAfg1/dABHaW50IHNvY2tldCwgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwgdm9pZCAqb3B0dmFsLCBzb2NrbGVuX3QgKm9wdGxlbi1wdHJ0AANpbnR0AAlnZXRzdWJvcHRzcQB+AAp0BesKICAgICAgICA8YnI+PGJyPiBUaGUgPFZBUj5vcHRpb25wPC9WQVI+IHBhcmFtZXRlciBtdXN0IGJlIGEgcG9pbnRlciB0byBhIHZhcmlhYmxlIGNvbnRhaW5pbmcKICAgICAgICAgdGhlIGFkZHJlc3Mgb2YgdGhlIHN0cmluZyB0byBwcm9jZXNzLiAgV2hlbiB0aGUgZnVuY3Rpb24gcmV0dXJucyB0aGUKICAgICAgICAgcmVmZXJlbmNlIGlzIHVwZGF0ZWQgdG8gcG9pbnQgdG8gdGhlIG5leHQgc3Vib3B0aW9uIG9yIHRvIHRoZQogICAgICAgICB0ZXJtaW5hdGluZyA8c2FtcD5cMDwvc2FtcD4gY2hhcmFjdGVyIGlmIHRoZXJlIGlzIG5vIG1vcmUgc3Vib3B0aW9uIGF2YWlsYWJsZS4KICAgICAgICAgPGJyPjxicj4gVGhlIDxWQVI+dG9rZW5zPC9WQVI+IHBhcmFtZXRlciByZWZlcmVuY2VzIGFuIGFycmF5IG9mIHN0cmluZ3MgY29udGFpbmluZyB0aGUKICAgICAgICAga25vd24gc3Vib3B0aW9ucy4gIEFsbCBzdHJpbmdzIG11c3QgYmUgPHNhbXA+XDA8L3NhbXA+IHRlcm1pbmF0ZWQgYW5kIHRvIG1hcmsKICAgICAgICAgdGhlIGVuZCBhIG51bGwgcG9pbnRlciBtdXN0IGJlIHN0b3JlZC4gIFdoZW4gPENPREU+Z2V0c3Vib3B0PC9DT0RFPiBmaW5kcyBhCiAgICAgICAgIHBvc3NpYmxlIGxlZ2FsIHN1Ym9wdGlvbiBpdCBjb21wYXJlcyBpdCB3aXRoIGFsbCBzdHJpbmdzIGF2YWlsYWJsZSBpbgogICAgICAgICB0aGUgPFZBUj50b2tlbnM8L1ZBUj4gYXJyYXkgYW5kIHJldHVybnMgdGhlIGluZGV4IGluIHRoZSBzdHJpbmcgYXMgdGhlCiAgICAgICAgIGluZGljYXRvci4KICAgICAgICAgPGJyPjxicj4gSW4gY2FzZSB0aGUgc3Vib3B0aW9uIGhhcyBhbiBhc3NvY2lhdGVkIHZhbHVlIGludHJvZHVjZWQgYnkgYSA8c2FtcD49PC9zYW1wPgogICAgICAgICBjaGFyYWN0ZXIsIGEgcG9pbnRlciB0byB0aGUgdmFsdWUgaXMgcmV0dXJuZWQgaW4gPFZBUj52YWx1ZXA8L1ZBUj4uICBUaGUKICAgICAgICAgc3RyaW5nIGlzIDxzYW1wPlwwPC9zYW1wPiB0ZXJtaW5hdGVkLiAgSWYgbm8gYXJndW1lbnQgaXMgYXZhaWxhYmxlCiAgICAgICAgIDxWQVI+dmFsdWVwPC9WQVI+IGlzIHNldCB0byB0aGUgbnVsbCBwb2ludGVyLiAgQnkgZG9pbmcgdGhpcyB0aGUgY2FsbGVyIGNhbgogICAgICAgICBjaGVjayB3aGV0aGVyIGEgbmVjZXNzYXJ5IHZhbHVlIGlzIGdpdmVuIG9yIHdoZXRoZXIgbm8gdW5leHBlY3RlZCB2YWx1ZQogICAgICAgICBpcyBwcmVzZW50LgogICAgICAgICA8YnI+PGJyPiBJbiBjYXNlIHRoZSBuZXh0IHN1Ym9wdGlvbiBpbiB0aGUgc3RyaW5nIGlzIG5vdCBtZW50aW9uZWQgaW4gdGhlCiAgICAgICAgIDxWQVI+dG9rZW5zPC9WQVI+IGFycmF5IHRoZSBzdGFydGluZyBhZGRyZXNzIG9mIHRoZSBzdWJvcHRpb24gaW5jbHVkaW5nIGEKICAgICAgICAgcG9zc2libGUgdmFsdWUgaXMgcmV0dXJuZWQgaW4gPFZBUj52YWx1ZXA8L1ZBUj4gYW5kIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlCiAgICAgICAgIGZ1bmN0aW9uIGlzIDxzYW1wPi0xPC9zYW1wPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc3RkbGliLmh4cQB+DYZ0ADhjaGFyICoqb3B0aW9ucCwgY29uc3QgY2hhciogY29uc3QgKnRva2VucywgY2hhciAqKnZhbHVlcHQAA2ludHQAB2dldHRleHRzcQB+AAp0B0QKICAgICAgICBUaGUgPENPREU+Z2V0dGV4dDwvQ09ERT4gZnVuY3Rpb24gc2VhcmNoZXMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBtZXNzYWdlCiAgICAgICAgIGNhdGFsb2dzIGZvciBhIHN0cmluZyB3aGljaCBpcyBlcXVhbCB0byA8VkFSPm1zZ2lkPC9WQVI+LiAgSWYgdGhlcmUgaXMgc3VjaCBhCiAgICAgICAgIHN0cmluZyBhdmFpbGFibGUgaXQgaXMgcmV0dXJuZWQuICBPdGhlcndpc2UgdGhlIGFyZ3VtZW50IHN0cmluZwogICAgICAgICA8VkFSPm1zZ2lkPC9WQVI+IGlzIHJldHVybmVkLgogICAgICAgICA8YnI+PGJyPiBQbGVhc2Ugbm90ZSB0aGF0IGFsbCB0aG91Z2ggdGhlIHJldHVybiB2YWx1ZSBpcyA8Q09ERT5jaGFyICo8L0NPREU+IHRoZQogICAgICAgICByZXR1cm5lZCBzdHJpbmcgbXVzdCBub3QgYmUgY2hhbmdlZC4gIFRoaXMgYnJva2VuIHR5cGUgcmVzdWx0cyBmcm9tIHRoZQogICAgICAgICBoaXN0b3J5IG9mIHRoZSBmdW5jdGlvbiBhbmQgZG9lcyBub3QgcmVmbGVjdCB0aGUgd2F5IHRoZSBmdW5jdGlvbiBzaG91bGQKICAgICAgICAgYmUgdXNlZC4KICAgICAgICAgPGJyPjxicj4gUGxlYXNlIG5vdGUgdGhhdCBhYm92ZSB3ZSB3cm90ZSBgYG1lc3NhZ2UgY2F0YWxvZ3MnJyAocGx1cmFsKS4gIFRoaXMgaXMKICAgICAgICAgYSBzcGVjaWFsdHkgb2YgdGhlIEdOVSBpbXBsZW1lbnRhdGlvbiBvZiB0aGVzZSBmdW5jdGlvbnMgYW5kIHdlIHdpbGwKICAgICAgICAgc2F5IG1vcmUgYWJvdXQgdGhpcyB3aGVuIHdlIHRhbGsgYWJvdXQgdGhlIHdheXMgbWVzc2FnZSBjYXRhbG9ncyBhcmUKICAgICAgICAgc2VsZWN0ZWQgLgogICAgICAgICA8YnI+PGJyPiBUaGUgPENPREU+Z2V0dGV4dDwvQ09ERT4gZnVuY3Rpb24gZG9lcyBub3QgbW9kaWZ5IHRoZSB2YWx1ZSBvZiB0aGUgZ2xvYmFsCiAgICAgICAgIDxWQVI+ZXJybm88L1ZBUj4gdmFyaWFibGUuICBUaGlzIGlzIG5lY2Vzc2FyeSB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIHdyaXRlCiAgICAgICAgIHNvbWV0aGluZyBsaWtlCiAgICAgICAgIDxicj48YnI+IDxwcmU+PGJyPgogICAgICAgICAgIHByaW50ZiAoZ2V0dGV4dCAoIk9wZXJhdGlvbiBmYWlsZWQ6ICVtXG4iKSk7PGJyPgogICAgICAgICA8L3ByZT4KICAgICAgICAgPGJyPjxicj4gSGVyZSB0aGUgPFZBUj5lcnJubzwvVkFSPiB2YWx1ZSBpcyB1c2VkIGluIHRoZSA8Q09ERT5wcmludGY8L0NPREU+IGZ1bmN0aW9uIHdoaWxlCiAgICAgICAgIHByb2Nlc3NpbmcgdGhlIDxDT0RFPiVtPC9DT0RFPiBmb3JtYXQgZWxlbWVudCBhbmQgaWYgdGhlIDxDT0RFPmdldHRleHQ8L0NPREU+CiAgICAgICAgIGZ1bmN0aW9uIHdvdWxkIGNoYW5nZSB0aGlzIHZhbHVlIChpdCBpcyBjYWxsZWQgYmVmb3JlIDxDT0RFPnByaW50ZjwvQ09ERT4gaXMKICAgICAgICAgY2FsbGVkKSB3ZSB3b3VsZCBnZXQgYSB3cm9uZyBtZXNzYWdlLgogICAgICAgICA8YnI+PGJyPiBTbyB0aGVyZSBpcyBubyBlYXN5IHdheSB0byBkZXRlY3QgYSBtaXNzaW5nIG1lc3NhZ2UgY2F0YWxvZyBiZXNpZGUKICAgICAgICAgY29tcGFyaW5nIHRoZSBhcmd1bWVudCBzdHJpbmcgd2l0aCB0aGUgcmVzdWx0LiAgQnV0IGl0IGlzIG5vcm1hbGx5IHRoZQogICAgICAgICB0YXNrIG9mIHRoZSB1c2VyIHRvIHJlYWN0IG9uIG1pc3NpbmcgY2F0YWxvZ3MuICBUaGUgcHJvZ3JhbSBjYW5ub3QgZ3Vlc3MKICAgICAgICAgd2hlbiBhIG1lc3NhZ2UgY2F0YWxvZyBpcyByZWFsbHkgbmVjZXNzYXJ5IHNpbmNlIGZvciBhIHVzZXIgd2hvIHNwZWFrcwogICAgICAgICB0aGUgbGFuZ3VhZ2UgdGhlIHByb2dyYW0gd2FzIGRldmVsb3BlZCBpbiBkb2VzIG5vdCBuZWVkIGFueSB0cmFuc2xhdGlvbi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAJbGliaW50bC5oeHEAfg2NdAARY29uc3QgY2hhciAqbXNnaWR0AAZjaGFyICp0AAxnZXR0aW1lb2ZkYXlzcQB+AAp0BEQKICAgICAgICBUaGUgPENPREU+Z2V0dGltZW9mZGF5PC9DT0RFPiBmdW5jdGlvbiByZXR1cm5zIHRoZSBjdXJyZW50IGNhbGVuZGFyIHRpbWUgYXMKICAgICAgICAgdGhlIGVsYXBzZWQgdGltZSBzaW5jZSB0aGUgZXBvY2ggaW4gdGhlIDxDT0RFPnN0cnVjdCB0aW1ldmFsPC9DT0RFPiBzdHJ1Y3R1cmUKICAgICAgICAgaW5kaWNhdGVkIGJ5IDxWQVI+dHA8L1ZBUj4uICAoIGZvciBhIGRlc2NyaXB0aW9uIG9mCiAgICAgICAgIDxDT0RFPnN0cnVjdCB0aW1ldmFsPC9DT0RFPikuICBJbmZvcm1hdGlvbiBhYm91dCB0aGUgdGltZSB6b25lIGlzIHJldHVybmVkIGluCiAgICAgICAgIHRoZSBzdHJ1Y3R1cmUgcG9pbnRlZCBhdCA8VkFSPnR6cDwvVkFSPi4gIElmIHRoZSA8VkFSPnR6cDwvVkFSPiBhcmd1bWVudCBpcyBhIG51bGwKICAgICAgICAgcG9pbnRlciwgdGltZSB6b25lIGluZm9ybWF0aW9uIGlzIGlnbm9yZWQuCiAgICAgICAgIDxicj48YnI+IFRoZSByZXR1cm4gdmFsdWUgaXMgPENPREU+MDwvQ09ERT4gb24gc3VjY2VzcyBhbmQgPENPREU+LTE8L0NPREU+IG9uIGZhaWx1cmUuICBUaGUKICAgICAgICAgZm9sbG93aW5nIDxDT0RFPmVycm5vPC9DT0RFPiBlcnJvciBjb25kaXRpb24gaXMgZGVmaW5lZCBmb3IgdGhpcyBmdW5jdGlvbjoKICAgICAgICAgPGJyPjxicj4gPERMPgoKICAgICAgICAgPERUPjxDT0RFPkVOT1NZUzwvQ09ERT4KPEREPgogICAgICAgICBUaGUgb3BlcmF0aW5nIHN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IGdldHRpbmcgdGltZSB6b25lIGluZm9ybWF0aW9uLCBhbmQKICAgICAgICAgPFZBUj50enA8L1ZBUj4gaXMgbm90IGEgbnVsbCBwb2ludGVyLiAgVGhlIEdOVSBvcGVyYXRpbmcgc3lzdGVtIGRvZXMgbm90CiAgICAgICAgIHN1cHBvcnQgdXNpbmcgPENPREU+c3RydWN0IHRpbWV6b25lPC9DT0RFPiB0byByZXByZXNlbnQgdGltZSB6b25lCiAgICAgICAgIGluZm9ybWF0aW9uOyB0aGF0IGlzIGFuIG9ic29sZXRlIGZlYXR1cmUgb2YgNC4zIEJTRC4KICAgICAgICAgSW5zdGVhZCwgdXNlIHRoZSBmYWNpbGl0aWVzIGRlc2NyaWJlZCBpbiBUaW1lIFpvbmUgRnVuY3Rpb25zLgoKICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAKc3lzL3RpbWUuaHhxAH4NlHQAKHN0cnVjdCB0aW1ldmFsICp0cCwgc3RydWN0IHRpbWV6b25lICp0enB0AANpbnR0AAZnZXR1aWRzcQB+AAp0AFsKICAgICAgICBUaGUgPENPREU+Z2V0dWlkPC9DT0RFPiBmdW5jdGlvbiByZXR1cm5zIHRoZSByZWFsIHVzZXIgSUQgb2YgdGhlIHByb2Nlc3MuCiAgICAgICAgc3EAfgAPAAAAAncEAAAAAnQAC3N5cy90eXBlcy5odAAIdW5pc3RkLmh4cQB+DZt0AAR2b2lkdAAFdWlkX3R0AAhnZXR1bWFza3NxAH4ACnQAiQogICAgICAgIFJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgZmlsZSBjcmVhdGlvbiBtYXNrIGZvciB0aGUgY3VycmVudAogICAgICAgICBwcm9jZXNzLiAgVGhpcyBmdW5jdGlvbiBpcyBhIEdOVSBleHRlbnNpb24uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACnN5cy9zdGF0Lmh4cQB+DaN0AAR2b2lkdAAGbW9kZV90dAAIZ2V0dXRlbnRzcQB+AAp0AioKICAgICAgICBUaGUgPENPREU+Z2V0dXRlbnQ8L0NPREU+IGZ1bmN0aW9uIHJlYWRzIHRoZSBuZXh0IGVudHJ5IGZyb20gdGhlIHVzZXIKICAgICAgICAgYWNjb3VudGluZyBkYXRhYmFzZS4gIEl0IHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBlbnRyeSwgd2hpY2ggaXMKICAgICAgICAgc3RhdGljYWxseSBhbGxvY2F0ZWQgYW5kIG1heSBiZSBvdmVyd3JpdHRlbiBieSBzdWJzZXF1ZW50IGNhbGxzIHRvCiAgICAgICAgIDxDT0RFPmdldHV0ZW50PC9DT0RFPi4gIFlvdSBtdXN0IGNvcHkgdGhlIGNvbnRlbnRzIG9mIHRoZSBzdHJ1Y3R1cmUgaWYgeW91CiAgICAgICAgIHdpc2ggdG8gc2F2ZSB0aGUgaW5mb3JtYXRpb24gb3IgeW91IGNhbiB1c2UgdGhlIDxDT0RFPmdldHV0ZW50X3I8L0NPREU+CiAgICAgICAgIGZ1bmN0aW9uIHdoaWNoIHN0b3JlcyB0aGUgZGF0YSBpbiBhIHVzZXItcHJvdmlkZWQgYnVmZmVyLgogICAgICAgICA8YnI+PGJyPiBBIG51bGwgcG9pbnRlciBpcyByZXR1cm5lZCBpbiBjYXNlIG5vIGZ1cnRoZXIgZW50cnkgaXMgYXZhaWxhYmxlLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZ1dG1wLmh4cQB+Dap0AAR2b2lkdAANc3RydWN0IHV0bXAgKnQACmdldHV0ZW50X3JzcQB+AAp0AwgKICAgICAgICBUaGUgPENPREU+Z2V0dXRlbnRfcjwvQ09ERT4gaXMgZXF1aXZhbGVudCB0byB0aGUgPENPREU+Z2V0dXRlbnQ8L0NPREU+IGZ1bmN0aW9uLiAgSXQKICAgICAgICAgcmV0dXJucyB0aGUgbmV4dCBlbnRyeSBmcm9tIHRoZSBkYXRhYmFzZS4gIEJ1dCBpbnN0ZWFkIG9mIHN0b3JpbmcgdGhlCiAgICAgICAgIGluZm9ybWF0aW9uIGluIGEgc3RhdGljIGJ1ZmZlciBpdCBzdG9yZXMgaXQgaW4gdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5CiAgICAgICAgIHRoZSBwYXJhbWV0ZXIgPFZBUj5idWZmZXI8L1ZBUj4uCiAgICAgICAgIDxicj48YnI+IElmIHRoZSBjYWxsIHdhcyBzdWNjZXNzZnVsLCB0aGUgZnVuY3Rpb24gcmV0dXJucyA8Q09ERT4wPC9DT0RFPiBhbmQgdGhlCiAgICAgICAgIHBvaW50ZXIgdmFyaWFibGUgcG9pbnRlZCB0byBieSB0aGUgcGFyYW1ldGVyIDxWQVI+cmVzdWx0PC9WQVI+IGNvbnRhaW5zIGEKICAgICAgICAgcG9pbnRlciB0byB0aGUgYnVmZmVyIHdoaWNoIGNvbnRhaW5zIHRoZSByZXN1bHQgKHRoaXMgaXMgbW9zdCBwcm9iYWJseQogICAgICAgICB0aGUgc2FtZSB2YWx1ZSBhcyA8VkFSPmJ1ZmZlcjwvVkFSPikuICBJZiBzb21ldGhpbmcgd2VudCB3cm9uZyBkdXJpbmcgdGhlCiAgICAgICAgIGV4ZWN1dGlvbiBvZiA8Q09ERT5nZXR1dGVudF9yPC9DT0RFPiB0aGUgZnVuY3Rpb24gcmV0dXJucyA8Q09ERT4tMTwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IFRoaXMgZnVuY3Rpb24gaXMgYSBHTlUgZXh0ZW5zaW9uLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZ1dG1wLmh4cQB+DbF0AClzdHJ1Y3QgdXRtcCAqYnVmZmVyLCBzdHJ1Y3QgdXRtcCAqKnJlc3VsdHQAA2ludHQAB2dldHV0aWRzcQB+AAp0BxcKICAgICAgICBUaGlzIGZ1bmN0aW9uIHNlYXJjaGVzIGZvcndhcmQgZnJvbSB0aGUgY3VycmVudCBwb2ludCBpbiB0aGUgZGF0YWJhc2UKICAgICAgICAgZm9yIGFuIGVudHJ5IHRoYXQgbWF0Y2hlcyA8VkFSPmlkPC9WQVI+LiAgSWYgdGhlIDxDT0RFPnV0X3R5cGU8L0NPREU+IG1lbWJlciBvZiB0aGUKICAgICAgICAgPFZBUj5pZDwvVkFSPiBzdHJ1Y3R1cmUgaXMgb25lIG9mIDxDT0RFPlJVTl9MVkw8L0NPREU+LCA8Q09ERT5CT09UX1RJTUU8L0NPREU+LAogICAgICAgICA8Q09ERT5PTERfVElNRTwvQ09ERT4gb3IgPENPREU+TkVXX1RJTUU8L0NPREU+IHRoZSBlbnRyaWVzIG1hdGNoIGlmIHRoZQogICAgICAgICA8Q09ERT51dF90eXBlPC9DT0RFPiBtZW1iZXJzIGFyZSBpZGVudGljYWwuICBJZiB0aGUgPENPREU+dXRfdHlwZTwvQ09ERT4gbWVtYmVyIG9mCiAgICAgICAgIHRoZSA8VkFSPmlkPC9WQVI+IHN0cnVjdHVyZSBpcyA8Q09ERT5JTklUX1BST0NFU1M8L0NPREU+LCA8Q09ERT5MT0dJTl9QUk9DRVNTPC9DT0RFPiwKICAgICAgICAgPENPREU+VVNFUl9QUk9DRVNTPC9DT0RFPiBvciA8Q09ERT5ERUFEX1BST0NFU1M8L0NPREU+LCB0aGUgZW50cmllcyBtYXRjaCBpZiB0aGUKICAgICAgICAgPENPREU+dXRfdHlwZTwvQ09ERT4gbWVtYmVyIG9mIHRoZSBlbnRyeSByZWFkIGZyb20gdGhlIGRhdGFiYXNlIGlzIG9uZSBvZgogICAgICAgICB0aGVzZSBmb3VyLCBhbmQgdGhlIDxDT0RFPnV0X2lkPC9DT0RFPiBtZW1iZXJzIG1hdGNoLiAgSG93ZXZlciBpZiB0aGUKICAgICAgICAgPENPREU+dXRfaWQ8L0NPREU+IG1lbWJlciBvZiBlaXRoZXIgdGhlIDxWQVI+aWQ8L1ZBUj4gc3RydWN0dXJlIG9yIHRoZSBlbnRyeSByZWFkCiAgICAgICAgIGZyb20gdGhlIGRhdGFiYXNlIGlzIGVtcHR5IGl0IGNoZWNrcyBpZiB0aGUgPENPREU+dXRfbGluZTwvQ09ERT4gbWVtYmVycyBtYXRjaAogICAgICAgICBpbnN0ZWFkLiAgSWYgYSBtYXRjaGluZyBlbnRyeSBpcyBmb3VuZCwgPENPREU+Z2V0dXRpZDwvQ09ERT4gcmV0dXJucyBhIHBvaW50ZXIKICAgICAgICAgdG8gdGhlIGVudHJ5LCB3aGljaCBpcyBzdGF0aWNhbGx5IGFsbG9jYXRlZCwgYW5kIG1heSBiZSBvdmVyd3JpdHRlbiBieSBhCiAgICAgICAgIHN1YnNlcXVlbnQgY2FsbCB0byA8Q09ERT5nZXR1dGVudDwvQ09ERT4sIDxDT0RFPmdldHV0aWQ8L0NPREU+IG9yIDxDT0RFPmdldHV0bGluZTwvQ09ERT4uCiAgICAgICAgIFlvdSBtdXN0IGNvcHkgdGhlIGNvbnRlbnRzIG9mIHRoZSBzdHJ1Y3R1cmUgaWYgeW91IHdpc2ggdG8gc2F2ZSB0aGUKICAgICAgICAgaW5mb3JtYXRpb24uCiAgICAgICAgIDxicj48YnI+IEEgbnVsbCBwb2ludGVyIGlzIHJldHVybmVkIGluIGNhc2UgdGhlIGVuZCBvZiB0aGUgZGF0YWJhc2UgaXMgcmVhY2hlZAogICAgICAgICB3aXRob3V0IGEgbWF0Y2guCiAgICAgICAgIDxicj48YnI+IFRoZSA8Q09ERT5nZXR1dGlkPC9DT0RFPiBmdW5jdGlvbiBtYXkgY2FjaGUgdGhlIGxhc3QgcmVhZCBlbnRyeS4gIFRoZXJlZm9yZSwKICAgICAgICAgaWYgeW91IGFyZSB1c2luZyA8Q09ERT5nZXR1dGlkPC9DT0RFPiB0byBzZWFyY2ggZm9yIG11bHRpcGxlIG9jY3VycmVuY2VzLCBpdAogICAgICAgICBpcyBuZWNlc3NhcnkgdG8gemVybyBvdXQgdGhlIHN0YXRpYyBkYXRhIGFmdGVyIGVhY2ggY2FsbC4gIE90aGVyd2lzZQogICAgICAgICA8Q09ERT5nZXR1dGlkPC9DT0RFPiBjb3VsZCBqdXN0IHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHNhbWUgZW50cnkgb3ZlciBhbmQKICAgICAgICAgb3ZlciBhZ2Fpbi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGdXRtcC5oeHEAfg24dAAVY29uc3Qgc3RydWN0IHV0bXAgKmlkdAANc3RydWN0IHV0bXAgKnQACWdldHV0aWRfcnNxAH4ACnQCXgogICAgICAgIFRoaXMgZnVuY3Rpb24gcmV0cmlldmVzIGp1c3QgbGlrZSA8Q09ERT5nZXR1dGlkPC9DT0RFPiB0aGUgbmV4dCBlbnRyeSBtYXRjaGluZwogICAgICAgICB0aGUgaW5mb3JtYXRpb24gc3RvcmVkIGluIDxWQVI+aWQ8L1ZBUj4uICBCdXQgdGhlIHJlc3VsdCBpcyBzdG9yZWQgaW4gdGhlCiAgICAgICAgIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IHRoZSBwYXJhbWV0ZXIgPFZBUj5idWZmZXI8L1ZBUj4uCiAgICAgICAgIDxicj48YnI+IElmIHN1Y2Nlc3NmdWwgdGhlIGZ1bmN0aW9uIHJldHVybnMgPENPREU+MDwvQ09ERT4gYW5kIHRoZSBwb2ludGVyIHZhcmlhYmxlCiAgICAgICAgIHBvaW50ZWQgdG8gYnkgdGhlIHBhcmFtZXRlciA8VkFSPnJlc3VsdDwvVkFSPiBjb250YWlucyBhIHBvaW50ZXIgdG8gdGhlCiAgICAgICAgIGJ1ZmZlciB3aXRoIHRoZSByZXN1bHQgKHByb2JhYmx5IHRoZSBzYW1lIGFzIDxWQVI+cmVzdWx0PC9WQVI+LiAgSWYgbm90CiAgICAgICAgIHN1Y2Nlc3NmdWwgdGhlIGZ1bmN0aW9uIHJldHVybiA8Q09ERT4tMTwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IFRoaXMgZnVuY3Rpb24gaXMgYSBHTlUgZXh0ZW5zaW9uLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZ1dG1wLmh4cQB+Db90AEBjb25zdCBzdHJ1Y3QgdXRtcCAqaWQsIHN0cnVjdCB1dG1wICpidWZmZXIsIHN0cnVjdCB1dG1wICoqcmVzdWx0dAADaW50dAAJZ2V0dXRsaW5lc3EAfgAKdASDCiAgICAgICAgVGhpcyBmdW5jdGlvbiBzZWFyY2hlcyBmb3J3YXJkIGZyb20gdGhlIGN1cnJlbnQgcG9pbnQgaW4gdGhlIGRhdGFiYXNlCiAgICAgICAgIHVudGlsIGl0IGZpbmRzIGFuIGVudHJ5IHdob3NlIDxDT0RFPnV0X3R5cGU8L0NPREU+IHZhbHVlIGlzCiAgICAgICAgIDxDT0RFPkxPR0lOX1BST0NFU1M8L0NPREU+IG9yIDxDT0RFPlVTRVJfUFJPQ0VTUzwvQ09ERT4sIGFuZCB3aG9zZSA8Q09ERT51dF9saW5lPC9DT0RFPgogICAgICAgICBtZW1iZXIgbWF0Y2hlcyB0aGUgPENPREU+dXRfbGluZTwvQ09ERT4gbWVtYmVyIG9mIHRoZSA8VkFSPmxpbmU8L1ZBUj4gc3RydWN0dXJlLgogICAgICAgICBJZiBpdCBmaW5kcyBzdWNoIGFuIGVudHJ5LCBpdCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZW50cnkgd2hpY2ggaXMKICAgICAgICAgc3RhdGljYWxseSBhbGxvY2F0ZWQsIGFuZCBtYXkgYmUgb3ZlcndyaXR0ZW4gYnkgYSBzdWJzZXF1ZW50IGNhbGwgdG8KICAgICAgICAgPENPREU+Z2V0dXRlbnQ8L0NPREU+LCA8Q09ERT5nZXR1dGlkPC9DT0RFPiBvciA8Q09ERT5nZXR1dGxpbmU8L0NPREU+LiAgWW91IG11c3QgY29weSB0aGUKICAgICAgICAgY29udGVudHMgb2YgdGhlIHN0cnVjdHVyZSBpZiB5b3Ugd2lzaCB0byBzYXZlIHRoZSBpbmZvcm1hdGlvbi4KICAgICAgICAgPGJyPjxicj4gQSBudWxsIHBvaW50ZXIgaXMgcmV0dXJuZWQgaW4gY2FzZSB0aGUgZW5kIG9mIHRoZSBkYXRhYmFzZSBpcyByZWFjaGVkCiAgICAgICAgIHdpdGhvdXQgYSBtYXRjaC4KICAgICAgICAgPGJyPjxicj4gVGhlIDxDT0RFPmdldHV0bGluZTwvQ09ERT4gZnVuY3Rpb24gbWF5IGNhY2hlIHRoZSBsYXN0IHJlYWQgZW50cnkuICBUaGVyZWZvcmUKICAgICAgICAgaWYgeW91IGFyZSB1c2luZyA8Q09ERT5nZXR1dGxpbmU8L0NPREU+IHRvIHNlYXJjaCBmb3IgbXVsdGlwbGUgb2NjdXJyZW5jZXMsIGl0CiAgICAgICAgIGlzIG5lY2Vzc2FyeSB0byB6ZXJvIG91dCB0aGUgc3RhdGljIGRhdGEgYWZ0ZXIgZWFjaCBjYWxsLiAgT3RoZXJ3aXNlCiAgICAgICAgIDxDT0RFPmdldHV0bGluZTwvQ09ERT4gY291bGQganVzdCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBzYW1lIGVudHJ5IG92ZXIgYW5kCiAgICAgICAgIG92ZXIgYWdhaW4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQABnV0bXAuaHhxAH4NxnQAF2NvbnN0IHN0cnVjdCB1dG1wICpsaW5ldAANc3RydWN0IHV0bXAgKnQAC2dldHV0bGluZV9yc3EAfgAKdAJiCiAgICAgICAgVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMganVzdCBsaWtlIDxDT0RFPmdldHV0bGluZTwvQ09ERT4gdGhlIG5leHQgZW50cnkKICAgICAgICAgbWF0Y2hpbmcgdGhlIGluZm9ybWF0aW9uIHN0b3JlZCBpbiA8VkFSPmxpbmU8L1ZBUj4uICBCdXQgdGhlIHJlc3VsdCBpcyBzdG9yZWQKICAgICAgICAgaW4gdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IHRoZSBwYXJhbWV0ZXIgPFZBUj5idWZmZXI8L1ZBUj4uCiAgICAgICAgIDxicj48YnI+IElmIHN1Y2Nlc3NmdWwgdGhlIGZ1bmN0aW9uIHJldHVybnMgPENPREU+MDwvQ09ERT4gYW5kIHRoZSBwb2ludGVyIHZhcmlhYmxlCiAgICAgICAgIHBvaW50ZWQgdG8gYnkgdGhlIHBhcmFtZXRlciA8VkFSPnJlc3VsdDwvVkFSPiBjb250YWlucyBhIHBvaW50ZXIgdG8gdGhlCiAgICAgICAgIGJ1ZmZlciB3aXRoIHRoZSByZXN1bHQgKHByb2JhYmx5IHRoZSBzYW1lIGFzIDxWQVI+cmVzdWx0PC9WQVI+LiAgSWYgbm90CiAgICAgICAgIHN1Y2Nlc3NmdWwgdGhlIGZ1bmN0aW9uIHJldHVybiA8Q09ERT4tMTwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IFRoaXMgZnVuY3Rpb24gaXMgYSBHTlUgZXh0ZW5zaW9uLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZ1dG1wLmh4cQB+Dc10AEJjb25zdCBzdHJ1Y3QgdXRtcCAqbGluZSwgc3RydWN0IHV0bXAgKmJ1ZmZlciwgc3RydWN0IHV0bXAgKipyZXN1bHR0AANpbnR0AAdnZXR1dG1wc3EAfgAKdACbCiAgICAgICAgPENPREU+Z2V0dXRtcDwvQ09ERT4gY29waWVzIHRoZSBpbmZvcm1hdGlvbiwgaW5zb2ZhciBhcyB0aGUgc3RydWN0dXJlcyBhcmUKICAgICAgICAgY29tcGF0aWJsZSwgZnJvbSA8VkFSPnV0bXB4PC9WQVI+IHRvIDxWQVI+dXRtcDwvVkFSPi4KICAgICAgICBzcQB+AA8AAAACdwQAAAACdAAHdXRtcHguaHQABnV0bXAuaHhxAH4N1HQALGNvbnN0IHN0cnVjdCB1dG1weCAqdXRtcHgsIHN0cnVjdCB1dG1wICp1dG1wdAADaW50dAAIZ2V0dXRtcHhzcQB+AAp0AJwKICAgICAgICA8Q09ERT5nZXR1dG1weDwvQ09ERT4gY29waWVzIHRoZSBpbmZvcm1hdGlvbiwgaW5zb2ZhciBhcyB0aGUgc3RydWN0dXJlcyBhcmUKICAgICAgICAgY29tcGF0aWJsZSwgZnJvbSA8VkFSPnV0bXA8L1ZBUj4gdG8gPFZBUj51dG1weDwvVkFSPi4KICAgICAgICBzcQB+AA8AAAACdwQAAAACdAAHdXRtcHguaHQABnV0bXAuaHhxAH4N3HQALGNvbnN0IHN0cnVjdCB1dG1wICp1dG1wLCBzdHJ1Y3QgdXRtcHggKnV0bXB4dAADaW50dAAJZ2V0dXR4ZW50c3EAfgAKdAEKCiAgICAgICAgVGhlIDxDT0RFPmdldHV0eGVudDwvQ09ERT4gZnVuY3Rpb24gaXMgc2ltaWxhciB0byA8Q09ERT5nZXR1dGVudDwvQ09ERT4sIGJ1dCByZXR1cm5zCiAgICAgICAgIGEgcG9pbnRlciB0byBhIDxDT0RFPnN0cnVjdCB1dG1weDwvQ09ERT4gaW5zdGVhZCBvZiA8Q09ERT5zdHJ1Y3QgdXRtcDwvQ09ERT4uICBPbgogICAgICAgICB0aGUgR05VIHN5c3RlbSBpdCBzaW1wbHkgaXMgYW4gYWxpYXMgZm9yIDxDT0RFPmdldHV0ZW50PC9DT0RFPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHdXRtcHguaHhxAH4N5HQABHZvaWR0AA5zdHJ1Y3QgdXRtcHggKnQACGdldHV0eGlkc3EAfgAKdADgCiAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIDxDT0RFPmdldHV0aWQ8L0NPREU+LCBidXQgdXNlcyA8Q09ERT5zdHJ1Y3QgdXRtcHg8L0NPREU+CiAgICAgICAgIGluc3RlYWQgb2YgPENPREU+c3RydWN0IHV0bXA8L0NPREU+LiAgT24gdGhlIEdOVSBzeXN0ZW0gaXQgaXMgc2ltcGx5IGFuIGFsaWFzCiAgICAgICAgIGZvciA8Q09ERT5nZXR1dGlkPC9DT0RFPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHdXRtcHguaHhxAH4N63QAFmNvbnN0IHN0cnVjdCB1dG1weCAqaWR0AA5zdHJ1Y3QgdXRtcHggKnQACmdldHV0eGxpbmVzcQB+AAp0AOIKICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gPENPREU+Z2V0dXRpZDwvQ09ERT4sIGJ1dCB1c2VzIDxDT0RFPnN0cnVjdCB1dG1weDwvQ09ERT4KICAgICAgICAgaW5zdGVhZCBvZiA8Q09ERT5zdHJ1Y3QgdXRtcDwvQ09ERT4uICBPbiB0aGUgR05VIHN5c3RlbSBpdCBpcyBzaW1wbHkgYW4gYWxpYXMKICAgICAgICAgZm9yIDxDT0RFPmdldHV0bGluZTwvQ09ERT4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3V0bXB4Lmh4cQB+DfJ0ABhjb25zdCBzdHJ1Y3QgdXRtcHggKmxpbmV0AA5zdHJ1Y3QgdXRtcHggKnQABGdldHdzcQB+AAp0Ad0KICAgICAgICBUaGlzIGZ1bmN0aW9uIHJlYWRzIGEgd29yZCAodGhhdCBpcywgYW4gPENPREU+aW50PC9DT0RFPikgZnJvbSA8VkFSPnN0cmVhbTwvVkFSPi4KICAgICAgICAgSXQncyBwcm92aWRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIFNWSUQuICBXZSByZWNvbW1lbmQgeW91IHVzZQogICAgICAgICA8Q09ERT5mcmVhZDwvQ09ERT4gaW5zdGVhZC4gVW5saWtlIDxDT0RFPmdldGM8L0NPREU+LAogICAgICAgICBhbnkgPENPREU+aW50PC9DT0RFPiB2YWx1ZSBjb3VsZCBiZSBhIHZhbGlkIHJlc3VsdC4gIDxDT0RFPmdldHc8L0NPREU+IHJldHVybnMKICAgICAgICAgPENPREU+RU9GPC9DT0RFPiB3aGVuIGl0IGVuY291bnRlcnMgZW5kLW9mLWZpbGUgb3IgYW4gZXJyb3IsIGJ1dCB0aGVyZSBpcyBubwogICAgICAgICB3YXkgdG8gZGlzdGluZ3Vpc2ggdGhpcyBmcm9tIGFuIGlucHV0IHdvcmQgd2l0aCB2YWx1ZSAtMS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHc3RkaW8uaHhxAH4N+XQADEZJTEUgKnN0cmVhbXQAA2ludHQABWdldHdjc3EAfgAKdAFLCiAgICAgICAgVGhpcyBpcyBqdXN0IGxpa2UgPENPREU+ZmdldHdjPC9DT0RFPiwgZXhjZXB0IHRoYXQgaXQgaXMgcGVybWlzc2libGUgZm9yIGl0IHRvCiAgICAgICAgIGJlIGltcGxlbWVudGVkIGFzIGEgbWFjcm8gdGhhdCBldmFsdWF0ZXMgdGhlIDxWQVI+c3RyZWFtPC9WQVI+IGFyZ3VtZW50IG1vcmUKICAgICAgICAgdGhhbiBvbmNlLiAgPENPREU+Z2V0d2M8L0NPREU+IGNhbiBiZSBoaWdobHkgb3B0aW1pemVkLCBzbyBpdCBpcyB1c3VhbGx5IHRoZQogICAgICAgICBiZXN0IGZ1bmN0aW9uIHRvIHVzZSB0byByZWFkIGEgc2luZ2xlIHdpZGUgY2hhcmFjdGVyLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAd3Y2hhci5oeHEAfg4AdAAMRklMRSAqc3RyZWFtdAAGd2ludF90dAAOZ2V0d2NfdW5sb2NrZWRzcQB+AAp0ANwKICAgICAgICBUaGUgPENPREU+Z2V0d2NfdW5sb2NrZWQ8L0NPREU+IGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gdGhlIDxDT0RFPmdldHdjPC9DT0RFPgogICAgICAgICBmdW5jdGlvbiBleGNlcHQgdGhhdCBpdCBkb2VzIG5vdCBpbXBsaWNpdGx5IGxvY2sgdGhlIHN0cmVhbS4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiBpcyBhIEdOVSBleHRlbnNpb24uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3djaGFyLmh4cQB+Dgd0AAxGSUxFICpzdHJlYW10AAZ3aW50X3R0AAhnZXR3Y2hhcnNxAH4ACnQAqQogICAgICAgIFRoZSA8Q09ERT5nZXR3Y2hhcjwvQ09ERT4gZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byA8Q09ERT5nZXR3YzwvQ09ERT4gd2l0aCA8Q09ERT5zdGRpbjwvQ09ERT4KICAgICAgICAgYXMgdGhlIHZhbHVlIG9mIHRoZSA8VkFSPnN0cmVhbTwvVkFSPiBhcmd1bWVudC4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHd2NoYXIuaHhxAH4ODnQABHZvaWR0AAZ3aW50X3R0ABFnZXR3Y2hhcl91bmxvY2tlZHNxAH4ACnQA4gogICAgICAgIFRoZSA8Q09ERT5nZXR3Y2hhcl91bmxvY2tlZDwvQ09ERT4gZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byB0aGUgPENPREU+Z2V0d2NoYXI8L0NPREU+CiAgICAgICAgIGZ1bmN0aW9uIGV4Y2VwdCB0aGF0IGl0IGRvZXMgbm90IGltcGxpY2l0bHkgbG9jayB0aGUgc3RyZWFtLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIGlzIGEgR05VIGV4dGVuc2lvbi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHd2NoYXIuaHhxAH4OFXQABHZvaWR0AAZ3aW50X3R0AARnbG9ic3EAfgAKdAyECiAgICAgICAgVGhlIGZ1bmN0aW9uIDxDT0RFPmdsb2I8L0NPREU+IGRvZXMgZ2xvYmJpbmcgdXNpbmcgdGhlIHBhdHRlcm4gPFZBUj5wYXR0ZXJuPC9WQVI+CiAgICAgICAgIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gIEl0IHB1dHMgdGhlIHJlc3VsdCBpbiBhIG5ld2x5IGFsbG9jYXRlZAogICAgICAgICB2ZWN0b3IsIGFuZCBzdG9yZXMgdGhlIHNpemUgYW5kIGFkZHJlc3Mgb2YgdGhpcyB2ZWN0b3IgaW50bwogICAgICAgICA8Q09ERT4qPFZBUj52ZWN0b3ItcHRyPC9WQVI+PC9DT0RFPi4gIFRoZSBhcmd1bWVudCA8VkFSPmZsYWdzPC9WQVI+IGlzIGEgY29tYmluYXRpb24gb2YKICAgICAgICAgYml0IGZsYWdzOyBzZWUgRmxhZ3MgZm9yIEdsb2JiaW5nLCBmb3IgZGV0YWlscyBvZiB0aGUgZmxhZ3MuCiAgICAgICAgIDxicj48YnI+IFRoZSByZXN1bHQgb2YgZ2xvYmJpbmcgaXMgYSBzZXF1ZW5jZSBvZiBmaWxlIG5hbWVzLiAgVGhlIGZ1bmN0aW9uCiAgICAgICAgIDxDT0RFPmdsb2I8L0NPREU+IGFsbG9jYXRlcyBhIHN0cmluZyBmb3IgZWFjaCByZXN1bHRpbmcgd29yZCwgdGhlbgogICAgICAgICBhbGxvY2F0ZXMgYSB2ZWN0b3Igb2YgdHlwZSA8Q09ERT5jaGFyICoqPC9DT0RFPiB0byBzdG9yZSB0aGUgYWRkcmVzc2VzIG9mCiAgICAgICAgIHRoZXNlIHN0cmluZ3MuICBUaGUgbGFzdCBlbGVtZW50IG9mIHRoZSB2ZWN0b3IgaXMgYSBudWxsIHBvaW50ZXIuCiAgICAgICAgIFRoaXMgdmVjdG9yIGlzIGNhbGxlZCB0aGUgd29yZCB2ZWN0b3IuCiAgICAgICAgIDxicj48YnI+IFRvIHJldHVybiB0aGlzIHZlY3RvciwgPENPREU+Z2xvYjwvQ09ERT4gc3RvcmVzIGJvdGggaXRzIGFkZHJlc3MgYW5kIGl0cwogICAgICAgICBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cywgbm90IGNvdW50aW5nIHRoZSB0ZXJtaW5hdGluZyBudWxsIHBvaW50ZXIpCiAgICAgICAgIGludG8gPENPREU+KjxWQVI+dmVjdG9yLXB0cjwvVkFSPjwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IE5vcm1hbGx5LCA8Q09ERT5nbG9iPC9DT0RFPiBzb3J0cyB0aGUgZmlsZSBuYW1lcyBhbHBoYWJldGljYWxseSBiZWZvcmUKICAgICAgICAgcmV0dXJuaW5nIHRoZW0uICBZb3UgY2FuIHR1cm4gdGhpcyBvZmYgd2l0aCB0aGUgZmxhZyA8Q09ERT5HTE9CX05PU09SVDwvQ09ERT4KICAgICAgICAgaWYgeW91IHdhbnQgdG8gZ2V0IHRoZSBpbmZvcm1hdGlvbiBhcyBmYXN0IGFzIHBvc3NpYmxlLiAgVXN1YWxseSBpdCdzCiAgICAgICAgIGEgZ29vZCBpZGVhIHRvIGxldCA8Q09ERT5nbG9iPC9DT0RFPiBzb3J0IHRoZW0tLS1pZiB5b3UgcHJvY2VzcyB0aGUgZmlsZXMgaW4KICAgICAgICAgYWxwaGFiZXRpY2FsIG9yZGVyLCB0aGUgdXNlcnMgd2lsbCBoYXZlIGEgZmVlbCBmb3IgdGhlIHJhdGUgb2YgcHJvZ3Jlc3MKICAgICAgICAgdGhhdCB5b3VyIGFwcGxpY2F0aW9uIGlzIG1ha2luZy4KICAgICAgICAgPGJyPjxicj4gSWYgPENPREU+Z2xvYjwvQ09ERT4gc3VjY2VlZHMsIGl0IHJldHVybnMgMC4gIE90aGVyd2lzZSwgaXQgcmV0dXJucyBvbmUKICAgICAgICAgb2YgdGhlc2UgZXJyb3IgY29kZXM6CiAgICAgICAgIDxicj48YnI+IDxETD4KCiAgICAgICAgIDxEVD48Q09ERT5HTE9CX0FCT1JURUQ8L0NPREU+CjxERD4KICAgICAgICAgVGhlcmUgd2FzIGFuIGVycm9yIG9wZW5pbmcgYSBkaXJlY3RvcnksIGFuZCB5b3UgdXNlZCB0aGUgZmxhZwogICAgICAgICA8Q09ERT5HTE9CX0VSUjwvQ09ERT4gb3IgeW91ciBzcGVjaWZpZWQgPFZBUj5lcnJmdW5jPC9WQVI+IHJldHVybmVkIGEgbm9uemVybwogICAgICAgICB2YWx1ZS4KCgogICAgICAgICAsCgogICAgICAgICBmb3IgYW4gZXhwbGFuYXRpb24gb2YgdGhlIDxDT0RFPkdMT0JfRVJSPC9DT0RFPiBmbGFnIGFuZCA8VkFSPmVycmZ1bmM8L1ZBUj4uCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5HTE9CX05PTUFUQ0g8L0NPREU+CjxERD4KICAgICAgICAgVGhlIHBhdHRlcm4gZGlkbid0IG1hdGNoIGFueSBleGlzdGluZyBmaWxlcy4gIElmIHlvdSB1c2UgdGhlCiAgICAgICAgIDxDT0RFPkdMT0JfTk9DSEVDSzwvQ09ERT4gZmxhZywgdGhlbiB5b3UgbmV2ZXIgZ2V0IHRoaXMgZXJyb3IgY29kZSwgYmVjYXVzZQogICAgICAgICB0aGF0IGZsYWcgdGVsbHMgPENPREU+Z2xvYjwvQ09ERT4gdG8gPEVNPnByZXRlbmQ8L0VNPiB0aGF0IHRoZSBwYXR0ZXJuIG1hdGNoZWQKICAgICAgICAgYXQgbGVhc3Qgb25lIGZpbGUuCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5HTE9CX05PU1BBQ0U8L0NPREU+CjxERD4KICAgICAgICAgSXQgd2FzIGltcG9zc2libGUgdG8gYWxsb2NhdGUgbWVtb3J5IHRvIGhvbGQgdGhlIHJlc3VsdC4KICAgICAgICAgPC9ETD4KICAgICAgICAgPGJyPjxicj4gSW4gdGhlIGV2ZW50IG9mIGFuIGVycm9yLCA8Q09ERT5nbG9iPC9DT0RFPiBzdG9yZXMgaW5mb3JtYXRpb24gaW4KICAgICAgICAgPENPREU+KjxWQVI+dmVjdG9yLXB0cjwvVkFSPjwvQ09ERT4gYWJvdXQgYWxsIHRoZSBtYXRjaGVzIGl0IGhhcyBmb3VuZCBzbyBmYXIuCiAgICAgICAgIDxicj48YnI+IEl0IGlzIGltcG9ydGFudCB0byBub3RpY2UgdGhhdCB0aGUgPENPREU+Z2xvYjwvQ09ERT4gZnVuY3Rpb24gd2lsbCBub3QgZmFpbCBpZgogICAgICAgICBpdCBlbmNvdW50ZXJzIGRpcmVjdG9yaWVzIG9yIGZpbGVzIHdoaWNoIGNhbm5vdCBiZSBoYW5kbGVkIHdpdGhvdXQgdGhlCiAgICAgICAgIExGUyBpbnRlcmZhY2VzLiAgVGhlIGltcGxlbWVudGF0aW9uIG9mIDxDT0RFPmdsb2I8L0NPREU+IGlzIHN1cHBvc2VkIHRvIHVzZQogICAgICAgICB0aGVzZSBmdW5jdGlvbnMgaW50ZXJuYWxseS4gIFRoaXMgYXQgbGVhc3QgaXMgdGhlIGFzc3VtcHRpb25zIG1hZGUgYnkKICAgICAgICAgdGhlIFVuaXggc3RhbmRhcmQuICBUaGUgR05VIGV4dGVuc2lvbiBvZiBhbGxvd2luZyB0aGUgdXNlciB0byBwcm92aWRlCiAgICAgICAgIG93biBkaXJlY3RvcnkgaGFuZGxpbmcgYW5kIDxDT0RFPnN0YXQ8L0NPREU+IGZ1bmN0aW9ucyBjb21wbGljYXRlcyB0aGluZ3MgYQogICAgICAgICBiaXQuICBJZiB0aGVzZSBjYWxsYmFjayBmdW5jdGlvbnMgYXJlIHVzZWQgYW5kIGEgbGFyZ2UgZmlsZSBvciBkaXJlY3RvcnkKICAgICAgICAgaXMgZW5jb3VudGVyZWQgPENPREU+Z2xvYjwvQ09ERT4gPEVNPmNhbjwvRU0+IGZhaWwuCiAgICAgICAgc3EAfgAPAAAAAncEAAAAAnQACWZubWF0Y2guaHQABmdsb2IuaHhxAH4OHHQAaWNvbnN0IGNoYXIgKnBhdHRlcm4sIGludCBmbGFncywgaW50ICgqZXJyZnVuYykgKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgZXJyb3ItY29kZSksIGdsb2JfdCAqdmVjdG9yLXB0cnQAA2ludHQABmdsb2I2NHNxAH4ACnQDiAogICAgICAgIFRoZSA8Q09ERT5nbG9iNjQ8L0NPREU+IGZ1bmN0aW9uIHdhcyBhZGRlZCBhcyBwYXJ0IG9mIHRoZSBMYXJnZSBGaWxlIFN1bW1pdAogICAgICAgICBleHRlbnNpb25zIGJ1dCBpcyBub3QgcGFydCBvZiB0aGUgb3JpZ2luYWwgTEZTIHByb3Bvc2FsLiAgVGhlIHJlYXNvbiBmb3IKICAgICAgICAgdGhpcyBpcyBzaW1wbGU6IGl0IGlzIG5vdCBuZWNlc3NhcnkuICBUaGUgbmVjZXNzaXR5IGZvciBhIDxDT0RFPmdsb2I2NDwvQ09ERT4KICAgICAgICAgZnVuY3Rpb24gaXMgYWRkZWQgYnkgdGhlIGV4dGVuc2lvbnMgb2YgdGhlIEdOVSA8Q09ERT5nbG9iPC9DT0RFPgogICAgICAgICBpbXBsZW1lbnRhdGlvbiB3aGljaCBhbGxvd3MgdGhlIHVzZXIgdG8gcHJvdmlkZSBvd24gZGlyZWN0b3J5IGhhbmRsaW5nCiAgICAgICAgIGFuZCA8Q09ERT5zdGF0PC9DT0RFPiBmdW5jdGlvbnMuICBUaGUgPENPREU+cmVhZGRpcjwvQ09ERT4gYW5kIDxDT0RFPnN0YXQ8L0NPREU+IGZ1bmN0aW9ucwogICAgICAgICBkbyBkZXBlbmQgb24gdGhlIGNob2ljZSBvZiA8Q09ERT5fRklMRV9PRkZTRVRfQklUUzwvQ09ERT4gc2luY2UgdGhlIGRlZmluaXRpb24KICAgICAgICAgb2YgdGhlIHR5cGVzIDxDT0RFPnN0cnVjdCBkaXJlbnQ8L0NPREU+IGFuZCA8Q09ERT5zdHJ1Y3Qgc3RhdDwvQ09ERT4gd2lsbCBjaGFuZ2UKICAgICAgICAgZGVwZW5kaW5nIG9uIHRoZSBjaG9pY2UuCiAgICAgICAgIDxicj48YnI+IEJlc2lkZSB0aGlzIGRpZmZlcmVuY2UgdGhlIDxDT0RFPmdsb2I2NDwvQ09ERT4gd29ya3MganVzdCBsaWtlIDxDT0RFPmdsb2I8L0NPREU+IGluCiAgICAgICAgIGFsbCBhc3BlY3RzLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIGlzIGEgR05VIGV4dGVuc2lvbi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGZ2xvYi5oeHEAfg4kdABrY29uc3QgY2hhciAqcGF0dGVybiwgaW50IGZsYWdzLCBpbnQgKCplcnJmdW5jKSAoY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBlcnJvci1jb2RlKSwgZ2xvYjY0X3QgKnZlY3Rvci1wdHJ0AANpbnR0AAhnbG9iZnJlZXNxAH4ACnQBQAogICAgICAgIFRoZSA8Q09ERT5nbG9iZnJlZTwvQ09ERT4gZnVuY3Rpb24gZnJlZXMgYWxsIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgcHJldmlvdXMKICAgICAgICAgY2FsbHMgdG8gPENPREU+Z2xvYjwvQ09ERT4gYXNzb2NpYXRlZCB3aXRoIHRoZSBvYmplY3QgcG9pbnRlZCB0byBieQogICAgICAgICA8VkFSPnBnbG9iPC9WQVI+LiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdoZW5ldmVyIHRoZSBjdXJyZW50bHkgdXNlZAogICAgICAgICA8Q09ERT5nbG9iX3Q8L0NPREU+IHR5cGVkIG9iamVjdCBpc24ndCB1c2VkIGFueW1vcmUuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQABmdsb2IuaHhxAH4OK3QADWdsb2JfdCAqcGdsb2J0AAR2b2lkdAAKZ2xvYmZyZWU2NHNxAH4ACnQArwogICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byA8Q09ERT5nbG9iZnJlZTwvQ09ERT4gYnV0IGl0IGZyZWVzIHJlY29yZHMgb2YKICAgICAgICAgdHlwZSA8Q09ERT5nbG9iNjRfdDwvQ09ERT4gd2hpY2ggd2VyZSBhbGxvY2F0ZWQgYnkgPENPREU+Z2xvYjY0PC9DT0RFPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGZ2xvYi5oeHEAfg4ydAAPZ2xvYjY0X3QgKnBnbG9idAAEdm9pZHQABmdtdGltZXNxAH4ACnQBEgogICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byA8Q09ERT5sb2NhbHRpbWU8L0NPREU+LCBleGNlcHQgdGhhdCB0aGUgYnJva2VuLWRvd24KICAgICAgICAgdGltZSBpcyBleHByZXNzZWQgYXMgQ29vcmRpbmF0ZWQgVW5pdmVyc2FsIFRpbWUgKFVUQykgKGZvcm1lcmx5IGNhbGxlZAogICAgICAgICBHcmVlbndpY2ggTWVhbiBUaW1lIChHTVQpKSByYXRoZXIgdGhhbiByZWxhdGl2ZSB0byBhIGxvY2FsIHRpbWUgem9uZS4KICAgICAgICAgPGJyPjxicj4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGdGltZS5oeHEAfg45dAASY29uc3QgdGltZV90ICp0aW1ldAALc3RydWN0IHRtICp0AAhnbXRpbWVfcnNxAH4ACnQBXgogICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byA8Q09ERT5sb2NhbHRpbWVfcjwvQ09ERT4sIGV4Y2VwdCB0aGF0IGl0IGNvbnZlcnRzCiAgICAgICAgIGp1c3QgbGlrZSA8Q09ERT5nbXRpbWU8L0NPREU+IHRoZSBnaXZlbiB0aW1lIGFzIENvb3JkaW5hdGVkIFVuaXZlcnNhbCBUaW1lLgogICAgICAgICA8YnI+PGJyPiBJZiB0aGUgY29udmVyc2lvbiBpcyBzdWNjZXNzZnVsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUKICAgICAgICAgb2JqZWN0IHRoZSByZXN1bHQgd2FzIHdyaXR0ZW4gaW50bywgaS5lLiwgaXQgcmV0dXJucyA8VkFSPnJlc3VsdHA8L1ZBUj4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQABnRpbWUuaHhxAH4OQHQAJmNvbnN0IHRpbWVfdCAqdGltZSwgc3RydWN0IHRtICpyZXN1bHRwdAALc3RydWN0IHRtICp0AAdncmFudHB0c3EAfgAKdAYZCiAgICAgICAgVGhlIDxDT0RFPmdyYW50cHQ8L0NPREU+IGZ1bmN0aW9uIGNoYW5nZXMgdGhlIG93bmVyc2hpcCBhbmQgYWNjZXNzIHBlcm1pc3Npb24KICAgICAgICAgb2YgdGhlIHNsYXZlIHBzZXVkby10ZXJtaW5hbCBkZXZpY2UgY29ycmVzcG9uZGluZyB0byB0aGUgbWFzdGVyCiAgICAgICAgIHBzZXVkby10ZXJtaW5hbCBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaWxlIGRlc2NyaXB0b3IKICAgICAgICAgPFZBUj5maWxlZGVzPC9WQVI+LiAgVGhlIG93bmVyIGlzIHNldCBmcm9tIHRoZSByZWFsIHVzZXIgSUQgb2YgdGhlIGNhbGxpbmcKICAgICAgICAgcHJvY2VzcyAsIGFuZCB0aGUgZ3JvdXAgaXMgc2V0IHRvIGEgc3BlY2lhbAogICAgICAgICBncm91cCAodHlwaWNhbGx5IHR0eSkgb3IgZnJvbSB0aGUgcmVhbCBncm91cCBJRCBvZiB0aGUgY2FsbGluZwogICAgICAgICBwcm9jZXNzLiAgVGhlIGFjY2VzcyBwZXJtaXNzaW9uIGlzIHNldCBzdWNoIHRoYXQgdGhlIGZpbGUgaXMgYm90aAogICAgICAgICByZWFkYWJsZSBhbmQgd3JpdGFibGUgYnkgdGhlIG93bmVyIGFuZCBvbmx5IHdyaXRhYmxlIGJ5IHRoZSBncm91cC4KICAgICAgICAgPGJyPjxicj4gT24gc29tZSBzeXN0ZW1zIHRoaXMgZnVuY3Rpb24gaXMgaW1wbGVtZW50ZWQgYnkgaW52b2tpbmcgYSBzcGVjaWFsCiAgICAgICAgIDxDT0RFPnNldHVpZDwvQ09ERT4gcm9vdCBwcm9ncmFtLiBBcyBhCiAgICAgICAgIGNvbnNlcXVlbmNlLCBpbnN0YWxsaW5nIGEgc2lnbmFsIGhhbmRsZXIgZm9yIHRoZSA8Q09ERT5TSUdDSExEPC9DT0RFPiBzaWduYWwKICAgICAgICAgIG1heSBpbnRlcmZlcmUgd2l0aCBhIGNhbGwgdG8KICAgICAgICAgPENPREU+Z3JhbnRwdDwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IFRoZSBub3JtYWwgcmV0dXJuIHZhbHVlIGZyb20gPENPREU+Z3JhbnRwdDwvQ09ERT4gaXMgMDsgYSB2YWx1ZSBvZgogICAgICAgICAtMSBpcyByZXR1cm5lZCBpbiBjYXNlIG9mIGZhaWx1cmUuICBUaGUgZm9sbG93aW5nIDxDT0RFPmVycm5vPC9DT0RFPgogICAgICAgICBlcnJvciBjb25kaXRpb25zIGFyZSBkZWZpbmVkIGZvciB0aGlzIGZ1bmN0aW9uOgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8RFQ+PENPREU+RUJBREY8L0NPREU+CjxERD4KICAgICAgICAgVGhlIDxWQVI+ZmlsZWRlczwvVkFSPiBhcmd1bWVudCBpcyBub3QgYSB2YWxpZCBmaWxlIGRlc2NyaXB0b3IuCiAgICAgICAgIDxicj48YnI+IDxMST4gRUlOVkFMCiAgICAgICAgIFRoZSA8VkFSPmZpbGVkZXM8L1ZBUj4gYXJndW1lbnQgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhIG1hc3RlciBwc2V1ZG8tdGVybWluYWwKICAgICAgICAgZGV2aWNlLgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVBQ0NFUwogICAgICAgICBUaGUgc2xhdmUgcHNldWRvLXRlcm1pbmFsIGRldmljZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBtYXN0ZXIgYXNzb2NpYXRlZAogICAgICAgICB3aXRoIDxWQVI+ZmlsZWRlczwvVkFSPiBjb3VsZCBub3QgYmUgYWNjZXNzZWQuCgogICAgICAgICA8YnI+PGJyPgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAhzdGRsaWIuaHhxAH4OR3QAC2ludCBmaWxlZGVzdAADaW50dAAHZ3NpZ25hbHNxAH4ACnQAmAogICAgICAgIFRoZSA8Q09ERT5nc2lnbmFsPC9DT0RFPiBmdW5jdGlvbiBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIDxDT0RFPnJhaXNlPC9DT0RFPjsgaXQgaXMKICAgICAgICAgcHJvdmlkZWQgb25seSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIFNWSUQuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHNpZ25hbC5oeHEAfg5OdAAKaW50IHNpZ251bXQAA2ludHQABGd0dHlzcQB+AAp0APYKICAgICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgdGhlIGF0dHJpYnV0ZXMgb2YgYSB0ZXJtaW5hbC4KICAgICAgICAgPGJyPjxicj4gPENPREU+Z3R0eTwvQ09ERT4gc2V0cyAqPFZBUj5hdHRyaWJ1dGVzPC9WQVI+IHRvIGRlc2NyaWJlIHRoZSB0ZXJtaW5hbCBhdHRyaWJ1dGVzCiAgICAgICAgIG9mIHRoZSB0ZXJtaW5hbCB3aGljaCBpcyBvcGVuIHdpdGggZmlsZSBkZXNjcmlwdG9yIDxWQVI+ZmlsZWRlczwvVkFSPi4KICAgICAgICBzcQB+AA8AAAACdwQAAAACdAAJdGVybWlvcy5odAAHc2d0dHkuaHhxAH4OVXQAJmludCBmaWxlZGVzLCBzdHJ1Y3Qgc2d0dHliICphdHRyaWJ1dGVzdAADaW50dAAJaGFzbW50b3B0c3EAfgAKdAKZCiAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIHRoZSBzdHJpbmcgcG9pbnRlZCB0byBieSB0aGUKICAgICAgICAgPENPREU+bW50X29wdHM8L0NPREU+IGVsZW1lbnQgb2YgdGhlIHZhcmlhYmxlIHBvaW50ZWQgdG8gYnkgPFZBUj5tbnQ8L1ZBUj4gY29udGFpbnMKICAgICAgICAgdGhlIG9wdGlvbiA8VkFSPm9wdDwvVkFSPi4gIElmIHRoaXMgaXMgdHJ1ZSBhIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUKICAgICAgICAgb3B0aW9uIGluIHRoZSA8Q09ERT5tbnRfb3B0czwvQ09ERT4gZWxlbWVudCBpcyByZXR1cm5lZC4gIElmIG5vIHN1Y2ggb3B0aW9uCiAgICAgICAgIGV4aXN0cyB0aGUgZnVuY3Rpb24gcmV0dXJucyA8Q09ERT5OVUxMPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiBpcyB1c2VmdWwgdG8gdGVzdCB3aGV0aGVyIGEgc3BlY2lmaWMgb3B0aW9uIGlzIHByZXNlbnQgYnV0CiAgICAgICAgIHdoZW4gYWxsIG9wdGlvbnMgaGF2ZSB0byBiZSBwcm9jZXNzZWQgb25lIGlzIGJldHRlciBvZmYgd2l0aCB1c2luZyB0aGUKICAgICAgICAgPENPREU+Z2V0c3Vib3B0PC9DT0RFPiBmdW5jdGlvbiB0byBpdGVyYXRlIG92ZXIgYWxsIG9wdGlvbnMgaW4gdGhlIHN0cmluZy4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIbW50ZW50Lmh4cQB+Dl10ACljb25zdCBzdHJ1Y3QgbW50ZW50ICptbnQsIGNvbnN0IGNoYXIgKm9wdHQABmNoYXIgKnQAB2hjcmVhdGVzcQB+AAp0BkgKICAgICAgICBUaGUgPENPREU+aGNyZWF0ZTwvQ09ERT4gZnVuY3Rpb24gY3JlYXRlcyBhIGhhc2hpbmcgdGFibGUgd2hpY2ggY2FuIGNvbnRhaW4gYXQKICAgICAgICAgbGVhc3QgPFZBUj5uZWw8L1ZBUj4gZWxlbWVudHMuICBUaGVyZSBpcyBubyBwb3NzaWJpbGl0eSB0byBncm93IHRoaXMgdGFibGUgc28KICAgICAgICAgaXQgaXMgbmVjZXNzYXJ5IHRvIGNob29zZSB0aGUgdmFsdWUgZm9yIDxWQVI+bmVsPC9WQVI+IHdpc2VseS4gIFRoZSBtZXRob2QKICAgICAgICAgdXNlZCB0byBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbiBtaWdodCBtYWtlIGl0IG5lY2Vzc2FyeSB0byBtYWtlIHRoZQogICAgICAgICBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGhhc2hpbmcgdGFibGUgbGFyZ2VyIHRoYW4gdGhlIGV4cGVjdGVkIG1heGltYWwKICAgICAgICAgbnVtYmVyIG9mIGVsZW1lbnRzLiAgSGFzaGluZyB0YWJsZXMgdXN1YWxseSB3b3JrIGluZWZmaWNpZW50bHkgaWYgdGhleSBhcmUKICAgICAgICAgZmlsbGVkIDgwJSBvciBtb3JlLiAgVGhlIGNvbnN0YW50IGFjY2VzcyB0aW1lIGd1YXJhbnRlZWQgYnkgaGFzaGluZyBjYW4KICAgICAgICAgb25seSBiZSBhY2hpZXZlZCBpZiBmZXcgY29sbGlzaW9ucyBleGlzdC4gIFNlZSBLbnV0aCdzIGBgVGhlIEFydCBvZgogICAgICAgICBDb21wdXRlciBQcm9ncmFtbWluZywgUGFydCAzOiBTZWFyY2hpbmcgYW5kIFNvcnRpbmcnJyBmb3IgbW9yZQogICAgICAgICBpbmZvcm1hdGlvbi4KICAgICAgICAgPGJyPjxicj4gVGhlIHdlYWtlc3QgYXNwZWN0IG9mIHRoaXMgZnVuY3Rpb24gaXMgdGhhdCB0aGVyZSBjYW4gYmUgYXQgbW9zdCBvbmUKICAgICAgICAgaGFzaGluZyB0YWJsZSB1c2VkIHRocm91Z2ggdGhlIHdob2xlIHByb2dyYW0uICBUaGUgdGFibGUgaXMgYWxsb2NhdGVkCiAgICAgICAgIGluIGxvY2FsIG1lbW9yeSBvdXQgb2YgY29udHJvbCBvZiB0aGUgcHJvZ3JhbW1lci4gIEFzIGFuIGV4dGVuc2lvbiB0aGUKICAgICAgICAgR05VIEMgbGlicmFyeSBwcm92aWRlcyBhbiBhZGRpdGlvbmFsIHNldCBvZiBmdW5jdGlvbnMgd2l0aCBhbiByZWVudHJhbnQKICAgICAgICAgaW50ZXJmYWNlIHdoaWNoIHByb3ZpZGUgYSBzaW1pbGFyIGludGVyZmFjZSBidXQgd2hpY2ggYWxsb3cgdG8ga2VlcAogICAgICAgICBhcmJpdHJhcmlseSBtYW55IGhhc2hpbmcgdGFibGVzLgogICAgICAgICA8YnI+PGJyPiBJdCBpcyBwb3NzaWJsZSB0byB1c2UgbW9yZSB0aGFuIG9uZSBoYXNoaW5nIHRhYmxlIGluIHRoZSBwcm9ncmFtIHJ1biBpZgogICAgICAgICB0aGUgZm9ybWVyIHRhYmxlIGlzIGZpcnN0IGRlc3Ryb3llZCBieSBhIGNhbGwgdG8gPENPREU+aGRlc3Ryb3k8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBUaGUgZnVuY3Rpb24gcmV0dXJucyBhIG5vbi16ZXJvIHZhbHVlIGlmIHN1Y2Nlc3NmdWwuICBJZiBpdCByZXR1cm4gemVybwogICAgICAgICBzb21ldGhpbmcgd2VudCB3cm9uZy4gIFRoaXMgY291bGQgZWl0aGVyIG1lYW4gdGhlcmUgaXMgYWxyZWFkeSBhIGhhc2hpbmcKICAgICAgICAgdGFibGUgaW4gdXNlIG9yIHRoZSBwcm9ncmFtIHJ1bnMgb3V0IG9mIG1lbW9yeS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc2VhcmNoLmh4cQB+DmR0AApzaXplX3QgbmVsdAADaW50dAAJaGNyZWF0ZV9yc3EAfgAKdAMpCiAgICAgICAgVGhlIDxDT0RFPmhjcmVhdGVfcjwvQ09ERT4gZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIG9iamVjdCBwb2ludGVkIHRvIGJ5CiAgICAgICAgIDxWQVI+aHRhYjwvVkFSPiB0byBjb250YWluIGEgaGFzaGluZyB0YWJsZSB3aXRoIGF0IGxlYXN0IDxWQVI+bmVsPC9WQVI+IGVsZW1lbnRzLgogICAgICAgICBTbyB0aGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gdGhlIDxDT0RFPmhjcmVhdGU8L0NPREU+IGZ1bmN0aW9uIGV4Y2VwdAogICAgICAgICB0aGF0IHRoZSBpbml0aWFsaXplZCBkYXRhIHN0cnVjdHVyZSBpcyBjb250cm9sbGVkIGJ5IHRoZSB1c2VyLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGFsbG93cyBoYXZpbmcgbW9yZSB0aGFuIG9uZSBoYXNoaW5nIHRhYmxlIGF0IG9uZSB0aW1lLiAgVGhlIG1lbW9yeQogICAgICAgICBuZWNlc3NhcnkgZm9yIHRoZSA8Q09ERT5zdHJ1Y3QgaHNlYXJjaF9kYXRhPC9DT0RFPiBvYmplY3QgY2FuIGJlIGFsbG9jYXRlZAogICAgICAgICBkeW5hbWljYWxseS4gIEl0IG11c3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCB6ZXJvIGJlZm9yZSBjYWxsaW5nIHRoaXMKICAgICAgICAgZnVuY3Rpb24uCiAgICAgICAgIDxicj48YnI+IFRoZSByZXR1cm4gdmFsdWUgaXMgbm9uLXplcm8gaWYgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4gIElmIHRoZQogICAgICAgICByZXR1cm4gdmFsdWUgaXMgemVybywgc29tZXRoaW5nIHdlbnQgd3JvbmcsIHdoaWNoIHByb2JhYmx5IG1lYW5zIHRoZQogICAgICAgICBwcm9ncmFtcyByYW4gb3V0IG9mIG1lbW9yeS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc2VhcmNoLmh4cQB+Dmt0ACVzaXplX3QgbmVsLCBzdHJ1Y3QgaHNlYXJjaF9kYXRhICpodGFidAADaW50dAAIaGRlc3Ryb3lzcQB+AAp0BOAKICAgICAgICBUaGUgPENPREU+aGRlc3Ryb3k8L0NPREU+IGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGZyZWUgYWxsIHRoZSByZXNvdXJjZXMKICAgICAgICAgYWxsb2NhdGVkIGluIGEgcHJldmlvdXMgY2FsbCBvZiA8Q09ERT5oY3JlYXRlPC9DT0RFPi4gIEFmdGVyIGEgY2FsbCB0byB0aGlzCiAgICAgICAgIGZ1bmN0aW9uIGl0IGlzIGFnYWluIHBvc3NpYmxlIHRvIGNhbGwgPENPREU+aGNyZWF0ZTwvQ09ERT4gYW5kIGFsbG9jYXRlIGEgbmV3CiAgICAgICAgIHRhYmxlIHdpdGggcG9zc2libHkgZGlmZmVyZW50IHNpemUuCiAgICAgICAgIDxicj48YnI+IEl0IGlzIGltcG9ydGFudCB0byByZW1lbWJlciB0aGF0IHRoZSBlbGVtZW50cyBjb250YWluZWQgaW4gdGhlIGhhc2hpbmcKICAgICAgICAgdGFibGUgYXQgdGhlIHRpbWUgPENPREU+aGRlc3Ryb3k8L0NPREU+IGlzIGNhbGxlZCBhcmUgPEVNPm5vdDwvRU0+IGZyZWVkIGJ5IHRoaXMKICAgICAgICAgZnVuY3Rpb24uICBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIHByb2dyYW0gY29kZSB0byBmcmVlIHRob3NlCiAgICAgICAgIHN0cmluZ3MgKGlmIG5lY2Vzc2FyeSBhdCBhbGwpLiAgRnJlZWluZyBhbGwgdGhlIGVsZW1lbnQgbWVtb3J5IGlzIG5vdAogICAgICAgICBwb3NzaWJsZSB3aXRob3V0IGV4dHJhLCBzZXBhcmF0ZWx5IGtlcHQgaW5mb3JtYXRpb24gc2luY2UgdGhlcmUgaXMgbm8KICAgICAgICAgZnVuY3Rpb24gdG8gaXRlcmF0ZSB0aHJvdWdoIGFsbCBhdmFpbGFibGUgZWxlbWVudHMgaW4gdGhlIGhhc2hpbmcgdGFibGUuCiAgICAgICAgIElmIGl0IGlzIHJlYWxseSBuZWNlc3NhcnkgdG8gZnJlZSBhIHRhYmxlIGFuZCBhbGwgZWxlbWVudHMgdGhlCiAgICAgICAgIHByb2dyYW1tZXIgaGFzIHRvIGtlZXAgYSBsaXN0IG9mIGFsbCB0YWJsZSBlbGVtZW50cyBhbmQgYmVmb3JlIGNhbGxpbmcKICAgICAgICAgPENPREU+aGRlc3Ryb3k8L0NPREU+IHMvaGUgaGFzIHRvIGZyZWUgYWxsIGVsZW1lbnQncyBkYXRhIHVzaW5nIHRoaXMgbGlzdC4KICAgICAgICAgVGhpcyBpcyBhIHZlcnkgdW5wbGVhc2FudCBtZWNoYW5pc20gYW5kIGl0IGFsc28gc2hvd3MgdGhhdCB0aGlzIGtpbmQgb2YKICAgICAgICAgaGFzaGluZyB0YWJsZXMgaXMgbWFpbmx5IG1lYW50IGZvciB0YWJsZXMgd2hpY2ggYXJlIGNyZWF0ZWQgb25jZSBhbmQKICAgICAgICAgdXNlZCB1bnRpbCB0aGUgZW5kIG9mIHRoZSBwcm9ncmFtIHJ1bi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc2VhcmNoLmh4cQB+DnJ0AAR2b2lkdAAEdm9pZHQACmhkZXN0cm95X3JzcQB+AAp0ATQKICAgICAgICBUaGUgPENPREU+aGRlc3Ryb3lfcjwvQ09ERT4gZnVuY3Rpb24gZnJlZXMgYWxsIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhlCiAgICAgICAgIDxDT0RFPmhjcmVhdGVfcjwvQ09ERT4gZnVuY3Rpb24gZm9yIHRoaXMgdmVyeSBzYW1lIG9iamVjdCA8VkFSPmh0YWI8L1ZBUj4uICBBcyBmb3IKICAgICAgICAgPENPREU+aGRlc3Ryb3k8L0NPREU+IGl0IGlzIHRoZSBwcm9ncmFtcyByZXNwb25zaWJpbGl0eSB0byBmcmVlIHRoZSBzdHJpbmdzCiAgICAgICAgIGZvciB0aGUgZWxlbWVudHMgb2YgdGhlIHRhYmxlLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAhzZWFyY2guaHhxAH4OeXQAGXN0cnVjdCBoc2VhcmNoX2RhdGEgKmh0YWJ0AAR2b2lkdAAHaHNlYXJjaHNxAH4ACnQEmAogICAgICAgIFRvIHNlYXJjaCBpbiBhIGhhc2hpbmcgdGFibGUgY3JlYXRlZCB1c2luZyA8Q09ERT5oY3JlYXRlPC9DT0RFPiB0aGUKICAgICAgICAgPENPREU+aHNlYXJjaDwvQ09ERT4gZnVuY3Rpb24gbXVzdCBiZSB1c2VkLiAgVGhpcyBmdW5jdGlvbiBjYW4gcGVyZm9ybSBzaW1wbGUKICAgICAgICAgc2VhcmNoIGZvciBhbiBlbGVtZW50IChpZiA8VkFSPmFjdGlvbjwvVkFSPiBoYXMgdGhlIDxDT0RFPkZJTkQ8L0NPREU+KSBvciBpdCBjYW4KICAgICAgICAgYWx0ZXJuYXRpdmVseSBpbnNlcnQgdGhlIGtleSBlbGVtZW50IGludG8gdGhlIGhhc2hpbmcgdGFibGUuICBFbnRyaWVzCiAgICAgICAgIGFyZSBuZXZlciByZXBsYWNlZC4KICAgICAgICAgPGJyPjxicj4gVGhlIGtleSBpcyBkZW5vdGVkIGJ5IGEgcG9pbnRlciB0byBhbiBvYmplY3Qgb2YgdHlwZSA8Q09ERT5FTlRSWTwvQ09ERT4uICBGb3IKICAgICAgICAgbG9jYXRpbmcgdGhlIGNvcnJlc3BvbmRpbmcgcG9zaXRpb24gaW4gdGhlIGhhc2hpbmcgdGFibGUgb25seSB0aGUKICAgICAgICAgPENPREU+a2V5PC9DT0RFPiBlbGVtZW50IG9mIHRoZSBzdHJ1Y3R1cmUgaXMgdXNlZC4KICAgICAgICAgPGJyPjxicj4gSWYgYW4gZW50cnkgd2l0aCBtYXRjaGluZyBrZXkgaXMgZm91bmQgdGhlIDxWQVI+YWN0aW9uPC9WQVI+IHBhcmFtZXRlciBpcwogICAgICAgICBpcnJlbGV2YW50LiAgVGhlIGZvdW5kIGVudHJ5IGlzIHJldHVybmVkLiAgSWYgbm8gbWF0Y2hpbmcgZW50cnkgaXMgZm91bmQKICAgICAgICAgYW5kIHRoZSA8VkFSPmFjdGlvbjwvVkFSPiBwYXJhbWV0ZXIgaGFzIHRoZSB2YWx1ZSA8Q09ERT5GSU5EPC9DT0RFPiB0aGUgZnVuY3Rpb24KICAgICAgICAgcmV0dXJucyBhIDxDT0RFPk5VTEw8L0NPREU+IHBvaW50ZXIuICBJZiBubyBlbnRyeSBpcyBmb3VuZCBhbmQgdGhlCiAgICAgICAgIDxWQVI+YWN0aW9uPC9WQVI+IHBhcmFtZXRlciBoYXMgdGhlIHZhbHVlIDxDT0RFPkVOVEVSPC9DT0RFPiBhIG5ldyBlbnRyeSBpcyBhZGRlZAogICAgICAgICB0byB0aGUgaGFzaGluZyB0YWJsZSB3aGljaCBpcyBpbml0aWFsaXplZCB3aXRoIHRoZSBwYXJhbWV0ZXIgPFZBUj5pdGVtPC9WQVI+LgogICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIG5ld2x5IGFkZGVkIGVudHJ5IGlzIHJldHVybmVkLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAhzZWFyY2guaHhxAH4OgHQAGUVOVFJZIGl0ZW0sIEFDVElPTiBhY3Rpb250AAdFTlRSWSAqdAAJaHNlYXJjaF9yc3EAfgAKdATwCiAgICAgICAgVGhlIDxDT0RFPmhzZWFyY2hfcjwvQ09ERT4gZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byA8Q09ERT5oc2VhcmNoPC9DT0RFPi4gIFRoZQogICAgICAgICBtZWFuaW5nIG9mIHRoZSBmaXJzdCB0d28gYXJndW1lbnRzIGlzIGlkZW50aWNhbC4gIEJ1dCBpbnN0ZWFkIG9mCiAgICAgICAgIG9wZXJhdGluZyBvbiBhIHNpbmdsZSBnbG9iYWwgaGFzaGluZyB0YWJsZSB0aGUgZnVuY3Rpb24gd29ya3Mgb24gdGhlCiAgICAgICAgIHRhYmxlIGRlc2NyaWJlZCBieSB0aGUgb2JqZWN0IHBvaW50ZWQgdG8gYnkgPFZBUj5odGFiPC9WQVI+ICh3aGljaCBpcwogICAgICAgICBpbml0aWFsaXplZCBieSBhIGNhbGwgdG8gPENPREU+aGNyZWF0ZV9yPC9DT0RFPikuCiAgICAgICAgIDxicj48YnI+IEFub3RoZXIgZGlmZmVyZW5jZSB0byA8Q09ERT5oY3JlYXRlPC9DT0RFPiBpcyB0aGF0IHRoZSBwb2ludGVyIHRvIHRoZSBmb3VuZAogICAgICAgICBlbnRyeSBpbiB0aGUgdGFibGUgaXMgbm90IHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9ucy4gIEl0IGlzCiAgICAgICAgIHJldHVybmVkIGJ5IHN0b3JpbmcgaXQgaW4gYSBwb2ludGVyIHZhcmlhYmxlcyBwb2ludGVkIHRvIGJ5IHRoZQogICAgICAgICA8VkFSPnJldHZhbDwvVkFSPiBwYXJhbWV0ZXIuICBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBmdW5jdGlvbiBpcyBhbiBpbnRlZ2VyCiAgICAgICAgIHZhbHVlIGluZGljYXRpbmcgc3VjY2VzcyBpZiBpdCBpcyBub24temVybyBhbmQgZmFpbHVyZSBpZiBpdCBpcyB6ZXJvLgogICAgICAgICBJbiB0aGUgbGF0dGVyIGNhc2UgdGhlIGdsb2JhbCB2YXJpYWJsZSA8VkFSPmVycm5vPC9WQVI+IHNpZ25hbHMgdGhlIHJlYXNvbiBmb3IKICAgICAgICAgdGhlIGZhaWx1cmUuCiAgICAgICAgIDxicj48YnI+IDxETD4KCiAgICAgICAgIDxEVD48Q09ERT5FTk9NRU08L0NPREU+CjxERD4KICAgICAgICAgVGhlIHRhYmxlIGlzIGZpbGxlZCBhbmQgPENPREU+aHNlYXJjaF9yPC9DT0RFPiB3YXMgY2FsbGVkIHdpdGggYW4gc28gZmFyCiAgICAgICAgIHVua25vd24ga2V5IGFuZCA8VkFSPmFjdGlvbjwvVkFSPiBzZXQgdG8gPENPREU+RU5URVI8L0NPREU+LgogICAgICAgICA8TEk+IEVTUkNICiAgICAgICAgIFRoZSA8VkFSPmFjdGlvbjwvVkFSPiBwYXJhbWV0ZXIgaXMgPENPREU+RklORDwvQ09ERT4gYW5kIG5vIGNvcnJlc3BvbmRpbmcgZWxlbWVudAogICAgICAgICBpcyBmb3VuZCBpbiB0aGUgdGFibGUuCgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAhzZWFyY2guaHhxAH4Oh3QAREVOVFJZIGl0ZW0sIEFDVElPTiBhY3Rpb24sIEVOVFJZICoqcmV0dmFsLCBzdHJ1Y3QgaHNlYXJjaF9kYXRhICpodGFidAADaW50dAAFaHRvbmxzcQB+AAp0AM8KICAgICAgICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIHRoZSA8Q09ERT51aW50MzJfdDwvQ09ERT4gaW50ZWdlciA8VkFSPmhvc3Rsb25nPC9WQVI+IGZyb20KICAgICAgICAgaG9zdCBieXRlIG9yZGVyIHRvIG5ldHdvcmsgYnl0ZSBvcmRlci4KICAgICAgICAgPGJyPjxicj4gVGhpcyBpcyB1c2VkIGZvciBJUHY0IEludGVybmV0IGFkZHJlc3Nlcy4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAMbmV0aW5ldC9pbi5oeHEAfg6OdAARdWludDMyX3QgaG9zdGxvbmd0AAh1aW50MzJfdHQABWh0b25zc3EAfgAKdACUCiAgICAgICAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgPENPREU+dWludDE2X3Q8L0NPREU+IGludGVnZXIgPFZBUj5ob3N0c2hvcnQ8L1ZBUj4gZnJvbQogICAgICAgICBob3N0IGJ5dGUgb3JkZXIgdG8gbmV0d29yayBieXRlIG9yZGVyLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAxuZXRpbmV0L2luLmh4cQB+DpV0ABJ1aW50MTZfdCBob3N0c2hvcnR0AAh1aW50MTZfdHQABWh5cG90c3EAfgAKdAHyCiAgICAgICAgVGhlc2UgZnVuY3Rpb25zIHJldHVybiA8Q09ERT5zcXJ0ICg8VkFSPng8L1ZBUj4qPFZBUj54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ZWQgd2l0aCB0aGUgZGVzY3JpcHRvciA8VkFSPmNkPC9WQVI+IGFuZAogICAgICAgICBzdG9yZXMgdGhlIHJlc3VsdCBpbiB0aGUgb3V0cHV0IGJ1ZmZlci4gIEl0IGlzIHBvc3NpYmxlIHRvIGNhbGwgdGhlCiAgICAgICAgIGZ1bmN0aW9uIGZvciB0aGUgc2FtZSB0ZXh0IHNldmVyYWwgdGltZXMgaW4gYSByb3cgc2luY2UgZm9yIHN0YXRlZnVsCiAgICAgICAgIGNoYXJhY3RlciBzZXRzIHRoZSBuZWNlc3Nhcnkgc3RhdGUgaW5mb3JtYXRpb24gaXMga2VwdCBpbiB0aGUgZGF0YQogICAgICAgICBzdHJ1Y3R1cmVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGVzY3JpcHRvci4KICAgICAgICAgPGJyPjxicj4gVGhlIGlucHV0IGJ1ZmZlciBpcyBzcGVjaWZpZWQgYnkgPENPREU+KjxWQVI+aW5idWY8L1ZBUj48L0NPREU+IGFuZCBpdCBjb250YWlucwogICAgICAgICA8Q09ERT4qPFZBUj5pbmJ5dGVzbGVmdDwvVkFSPjwvQ09ERT4gYnl0ZXMuICBUaGUgZXh0cmEgaW5kaXJlY3Rpb24gaXMgbmVjZXNzYXJ5IGZvcgogICAgICAgICBjb21tdW5pY2F0aW5nIHRoZSB1c2VkIGlucHV0IGJhY2sgdG8gdGhlIGNhbGxlciAoc2VlIGJlbG93KS4gIEl0IGlzCiAgICAgICAgIGltcG9ydGFudCB0byBub3RlIHRoYXQgdGhlIGJ1ZmZlciBwb2ludGVyIGlzIG9mIHR5cGUgPENPREU+Y2hhcjwvQ09ERT4gYW5kIHRoZQogICAgICAgICBsZW5ndGggaXMgbWVhc3VyZWQgaW4gYnl0ZXMgZXZlbiBpZiB0aGUgaW5wdXQgdGV4dCBpcyBlbmNvZGVkIGluIHdpZGUKICAgICAgICAgY2hhcmFjdGVycy4KICAgICAgICAgPGJyPjxicj4gVGhlIG91dHB1dCBidWZmZXIgaXMgc3BlY2lmaWVkIGluIGEgc2ltaWxhciB3YXkuICA8Q09ERT4qPFZBUj5vdXRidWY8L1ZBUj48L0NPREU+CiAgICAgICAgIHBvaW50cyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIgd2l0aCBhdCBsZWFzdAogICAgICAgICA8Q09ERT4qPFZBUj5vdXRieXRlc2xlZnQ8L1ZBUj48L0NPREU+IGJ5dGVzIHJvb20gZm9yIHRoZSByZXN1bHQuICBUaGUgYnVmZmVyCiAgICAgICAgIHBvaW50ZXIgYWdhaW4gaXMgb2YgdHlwZSA8Q09ERT5jaGFyPC9DT0RFPiBhbmQgdGhlIGxlbmd0aCBpcyBtZWFzdXJlZCBpbgogICAgICAgICBieXRlcy4gIElmIDxWQVI+b3V0YnVmPC9WQVI+IG9yIDxDT0RFPio8VkFSPm91dGJ1ZjwvVkFSPjwvQ09ERT4gaXMgYSBudWxsIHBvaW50ZXIsIHRoZQogICAgICAgICBjb252ZXJzaW9uIGlzIHBlcmZvcm1lZCBidXQgbm8gb3V0cHV0IGlzIGF2YWlsYWJsZS4KICAgICAgICAgPGJyPjxicj4gSWYgPFZBUj5pbmJ1ZjwvVkFSPiBpcyBhIG51bGwgcG9pbnRlciwgdGhlIDxDT0RFPmljb252PC9DT0RFPiBmdW5jdGlvbiBwZXJmb3JtcyB0aGUKICAgICAgICAgbmVjZXNzYXJ5IGFjdGlvbiB0byBwdXQgdGhlIHN0YXRlIG9mIHRoZSBjb252ZXJzaW9uIGludG8gdGhlIGluaXRpYWwKICAgICAgICAgc3RhdGUuICBUaGlzIGlzIG9idmlvdXNseSBhIG5vLW9wIGZvciBub24tc3RhdGVmdWwgZW5jb2RpbmdzLCBidXQgaWYgdGhlCiAgICAgICAgIGVuY29kaW5nIGhhcyBhIHN0YXRlLCBzdWNoIGEgZnVuY3Rpb24gY2FsbCBtaWdodCBwdXQgc29tZSBieXRlIHNlcXVlbmNlcwogICAgICAgICBpbiB0aGUgb3V0cHV0IGJ1ZmZlciwgd2hpY2ggcGVyZm9ybSB0aGUgbmVjZXNzYXJ5IHN0YXRlIGNoYW5nZXMuICBUaGUKICAgICAgICAgbmV4dCBjYWxsIHdpdGggPFZBUj5pbmJ1ZjwvVkFSPiBub3QgYmVpbmcgYSBudWxsIHBvaW50ZXIgdGhlbiBzaW1wbHkgZ29lcyBvbgogICAgICAgICBmcm9tIHRoZSBpbml0aWFsIHN0YXRlLiAgSXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlIHByb2dyYW1tZXIgbmV2ZXIgbWFrZXMKICAgICAgICAgYW55IGFzc3VtcHRpb24gYXMgdG8gd2hldGhlciB0aGUgY29udmVyc2lvbiBoYXMgdG8gZGVhbCB3aXRoIHN0YXRlcy4KICAgICAgICAgRXZlbiBpZiB0aGUgaW5wdXQgYW5kIG91dHB1dCBjaGFyYWN0ZXIgc2V0cyBhcmUgbm90IHN0YXRlZnVsLCB0aGUKICAgICAgICAgaW1wbGVtZW50YXRpb24gbWlnaHQgc3RpbGwgaGF2ZSB0byBrZWVwIHN0YXRlcy4gIFRoaXMgaXMgZHVlIHRvIHRoZQogICAgICAgICBpbXBsZW1lbnRhdGlvbiBjaG9zZW4gZm9yIHRoZSBHTlUgQyBsaWJyYXJ5IGFzIGl0IGlzIGRlc2NyaWJlZCBiZWxvdy4KICAgICAgICAgVGhlcmVmb3JlIGFuIDxDT0RFPmljb252PC9DT0RFPiBjYWxsIHRvIHJlc2V0IHRoZSBzdGF0ZSBzaG91bGQgYWx3YXlzIGJlCiAgICAgICAgIHBlcmZvcm1lZCBpZiBzb21lIHByb3RvY29sIHJlcXVpcmVzIHRoaXMgZm9yIHRoZSBvdXRwdXQgdGV4dC4KICAgICAgICAgPGJyPjxicj4gVGhlIGNvbnZlcnNpb24gc3RvcHMgZm9yIG9uZSBvZiB0aHJlZSByZWFzb25zLiBUaGUgZmlyc3QgaXMgdGhhdCBhbGwKICAgICAgICAgY2hhcmFjdGVycyBmcm9tIHRoZSBpbnB1dCBidWZmZXIgYXJlIGNvbnZlcnRlZC4gIFRoaXMgYWN0dWFsbHkgY2FuIG1lYW4KICAgICAgICAgdHdvIHRoaW5nczogZWl0aGVyIGFsbCBieXRlcyBmcm9tIHRoZSBpbnB1dCBidWZmZXIgYXJlIGNvbnN1bWVkIG9yCiAgICAgICAgIHRoZXJlIGFyZSBzb21lIGJ5dGVzIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciB0aGF0IHBvc3NpYmx5IGNhbiBmb3JtIGEKICAgICAgICAgY29tcGxldGUgY2hhcmFjdGVyIGJ1dCB0aGUgaW5wdXQgaXMgaW5jb21wbGV0ZS4gIFRoZSBzZWNvbmQgcmVhc29uIGZvciBhCiAgICAgICAgIHN0b3AgaXMgdGhhdCB0aGUgb3V0cHV0IGJ1ZmZlciBpcyBmdWxsLiAgQW5kIHRoZSB0aGlyZCByZWFzb24gaXMgdGhhdAogICAgICAgICB0aGUgaW5wdXQgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzLgogICAgICAgICA8YnI+PGJyPiBJbiBhbGwgb2YgdGhlc2UgY2FzZXMgdGhlIGJ1ZmZlciBwb2ludGVycyBhZnRlciB0aGUgbGFzdCBzdWNjZXNzZnVsCiAgICAgICAgIGNvbnZlcnNpb24sIGZvciBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlciwgYXJlIHN0b3JlZCBpbiA8VkFSPmluYnVmPC9WQVI+IGFuZAogICAgICAgICA8VkFSPm91dGJ1ZjwvVkFSPiwgYW5kIHRoZSBhdmFpbGFibGUgcm9vbSBpbiBlYWNoIGJ1ZmZlciBpcyBzdG9yZWQgaW4KICAgICAgICAgPFZBUj5pbmJ5dGVzbGVmdDwvVkFSPiBhbmQgPFZBUj5vdXRieXRlc2xlZnQ8L1ZBUj4uCiAgICAgICAgIDxicj48YnI+IFNpbmNlIHRoZSBjaGFyYWN0ZXIgc2V0cyBzZWxlY3RlZCBpbiB0aGUgPENPREU+aWNvbnZfb3BlbjwvQ09ERT4gY2FsbCBjYW4gYmUKICAgICAgICAgYWxtb3N0IGFyYml0cmFyeSwgdGhlcmUgY2FuIGJlIHNpdHVhdGlvbnMgd2hlcmUgdGhlIGlucHV0IGJ1ZmZlciBjb250YWlucwogICAgICAgICB2YWxpZCBjaGFyYWN0ZXJzLCB3aGljaCBoYXZlIG5vIGlkZW50aWNhbCByZXByZXNlbnRhdGlvbiBpbiB0aGUgb3V0cHV0CiAgICAgICAgIGNoYXJhY3RlciBzZXQuICBUaGUgYmVoYXZpb3IgaW4gdGhpcyBzaXR1YXRpb24gaXMgdW5kZWZpbmVkLiAgVGhlCiAgICAgICAgIDxFTT5jdXJyZW50PC9FTT4gYmVoYXZpb3Igb2YgdGhlIEdOVSBDIGxpYnJhcnkgaW4gdGhpcyBzaXR1YXRpb24gaXMgdG8KICAgICAgICAgcmV0dXJuIHdpdGggYW4gZXJyb3IgaW1tZWRpYXRlbHkuICBUaGlzIGNlcnRhaW5seSBpcyBub3QgdGhlIG1vc3QKICAgICAgICAgZGVzaXJhYmxlIHNvbHV0aW9uOyB0aGVyZWZvcmUsIGZ1dHVyZSB2ZXJzaW9ucyB3aWxsIHByb3ZpZGUgYmV0dGVyIG9uZXMsCiAgICAgICAgIGJ1dCB0aGV5IGFyZSBub3QgeWV0IGZpbmlzaGVkLgogICAgICAgICA8YnI+PGJyPiBJZiBhbGwgaW5wdXQgZnJvbSB0aGUgaW5wdXQgYnVmZmVyIGlzIHN1Y2Nlc3NmdWxseSBjb252ZXJ0ZWQgYW5kIHN0b3JlZAogICAgICAgICBpbiB0aGUgb3V0cHV0IGJ1ZmZlciwgdGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBub24tcmV2ZXJzaWJsZQogICAgICAgICBjb252ZXJzaW9ucyBwZXJmb3JtZWQuICBJbiBhbGwgb3RoZXIgY2FzZXMgdGhlIHJldHVybiB2YWx1ZSBpcwogICAgICAgICA8Q09ERT4oc2l6ZV90KSAtMTwvQ09ERT4gYW5kIDxDT0RFPmVycm5vPC9DT0RFPiBpcyBzZXQgYXBwcm9wcmlhdGVseS4gIEluIHN1Y2ggY2FzZXMKICAgICAgICAgdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgPFZBUj5pbmJ5dGVzbGVmdDwvVkFSPiBpcyBub256ZXJvLgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8RFQ+PENPREU+RUlMU0VRPC9DT0RFPgo8REQ+CiAgICAgICAgIFRoZSBjb252ZXJzaW9uIHN0b3BwZWQgYmVjYXVzZSBvZiBhbiBpbnZhbGlkIGJ5dGUgc2VxdWVuY2UgaW4gdGhlIGlucHV0LgogICAgICAgICBBZnRlciB0aGUgY2FsbCwgPENPREU+KjxWQVI+aW5idWY8L1ZBUj48L0NPREU+IHBvaW50cyBhdCB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUKICAgICAgICAgaW52YWxpZCBieXRlIHNlcXVlbmNlLgogICAgICAgICA8YnI+PGJyPiA8TEk+IEUyQklHCiAgICAgICAgIFRoZSBjb252ZXJzaW9uIHN0b3BwZWQgYmVjYXVzZSBpdCByYW4gb3V0IG9mIHNwYWNlIGluIHRoZSBvdXRwdXQgYnVmZmVyLgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVJTlZBTAogICAgICAgICBUaGUgY29udmVyc2lvbiBzdG9wcGVkIGJlY2F1c2Ugb2YgYW4gaW5jb21wbGV0ZSBieXRlIHNlcXVlbmNlIGF0IHRoZSBlbmQKICAgICAgICAgb2YgdGhlIGlucHV0IGJ1ZmZlci4KICAgICAgICAgPGJyPjxicj4gPExJPiBFQkFERgogICAgICAgICBUaGUgPFZBUj5jZDwvVkFSPiBhcmd1bWVudCBpcyBpbnZhbGlkLgoKICAgICAgICAgPGJyPjxicj4gVGhlIDxDT0RFPmljb252PC9DT0RFPiBmdW5jdGlvbiB3YXMgaW50cm9kdWNlZCBpbiB0aGUgWFBHMiBzdGFuZGFyZCBhbmQgaXMKICAgICAgICAgZGVjbGFyZWQgaW4gdGhlIDxUVD5pY29udi5oPC9UVD4gaGVhZGVyLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAdpY29udi5oeHEAfg6xdABSaWNvbnZfdCBjZCwgY2hhciAqKmluYnVmLCBzaXplX3QgKmluYnl0ZXNsZWZ0LCBjaGFyICoqb3V0YnVmLCBzaXplX3QgKm91dGJ5dGVzbGVmdHQABnNpemVfdHQAC2ljb252X2Nsb3Nlc3EAfgAKdAK6CiAgICAgICAgVGhlIDxDT0RFPmljb252X2Nsb3NlPC9DT0RFPiBmdW5jdGlvbiBmcmVlcyBhbGwgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUKICAgICAgICAgaGFuZGxlIDxWQVI+Y2Q8L1ZBUj4sIHdoaWNoIG11c3QgaGF2ZSBiZWVuIHJldHVybmVkIGJ5IGEgc3VjY2Vzc2Z1bCBjYWxsIHRvCiAgICAgICAgIHRoZSA8Q09ERT5pY29udl9vcGVuPC9DT0RFPiBmdW5jdGlvbi4KICAgICAgICAgPGJyPjxicj4gSWYgdGhlIGZ1bmN0aW9uIGNhbGwgd2FzIHN1Y2Nlc3NmdWwgdGhlIHJldHVybiB2YWx1ZSBpcyAwLgogICAgICAgICBPdGhlcndpc2UgaXQgaXMgLTEgYW5kIDxDT0RFPmVycm5vPC9DT0RFPiBpcyBzZXQgYXBwcm9wcmlhdGVseS4KICAgICAgICAgRGVmaW5lZCBlcnJvciBhcmU6CiAgICAgICAgIDxicj48YnI+IDxETD4KCiAgICAgICAgIDxEVD48Q09ERT5FQkFERjwvQ09ERT4KPEREPgogICAgICAgICBUaGUgY29udmVyc2lvbiBkZXNjcmlwdG9yIGlzIGludmFsaWQuCgogICAgICAgICA8YnI+PGJyPiBUaGUgPENPREU+aWNvbnZfY2xvc2U8L0NPREU+IGZ1bmN0aW9uIHdhcyBpbnRyb2R1Y2VkIHRvZ2V0aGVyIHdpdGggdGhlIHJlc3QKICAgICAgICAgb2YgdGhlIDxDT0RFPmljb252PC9DT0RFPiBmdW5jdGlvbnMgaW4gWFBHMiBhbmQgaXMgZGVjbGFyZWQgaW4gPFRUPmljb252Lmg8L1RUPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHaWNvbnYuaHhxAH4OuHQACmljb252X3QgY2R0AANpbnR0AAppY29udl9vcGVuc3EAfgAKdAxoCiAgICAgICAgVGhlIDxDT0RFPmljb252X29wZW48L0NPREU+IGZ1bmN0aW9uIGhhcyB0byBiZSB1c2VkIGJlZm9yZSBzdGFydGluZyBhCiAgICAgICAgIGNvbnZlcnNpb24uICBUaGUgdHdvIHBhcmFtZXRlcnMgdGhpcyBmdW5jdGlvbiB0YWtlcyBkZXRlcm1pbmUgdGhlCiAgICAgICAgIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gY2hhcmFjdGVyIHNldCBmb3IgdGhlIGNvbnZlcnNpb24sIGFuZCBpZiB0aGUKICAgICAgICAgaW1wbGVtZW50YXRpb24gaGFzIHRoZSBwb3NzaWJpbGl0eSB0byBwZXJmb3JtIHN1Y2ggYSBjb252ZXJzaW9uLCB0aGUKICAgICAgICAgZnVuY3Rpb24gcmV0dXJucyBhIGhhbmRsZS4KICAgICAgICAgPGJyPjxicj4gSWYgdGhlIHdhbnRlZCBjb252ZXJzaW9uIGlzIG5vdCBhdmFpbGFibGUsIHRoZSA8Q09ERT5pY29udl9vcGVuPC9DT0RFPiBmdW5jdGlvbgogICAgICAgICByZXR1cm5zIDxDT0RFPihpY29udl90KSAtMTwvQ09ERT4uIEluIHRoaXMgY2FzZSB0aGUgZ2xvYmFsIHZhcmlhYmxlCiAgICAgICAgIDxDT0RFPmVycm5vPC9DT0RFPiBjYW4gaGF2ZSB0aGUgZm9sbG93aW5nIHZhbHVlczoKICAgICAgICAgPGJyPjxicj4gPERMPgoKICAgICAgICAgPERUPjxDT0RFPkVNRklMRTwvQ09ERT4KPEREPgogICAgICAgICBUaGUgcHJvY2VzcyBhbHJlYWR5IGhhcyA8Q09ERT5PUEVOX01BWDwvQ09ERT4gZmlsZSBkZXNjcmlwdG9ycyBvcGVuLgogICAgICAgICA8TEk+IEVORklMRQogICAgICAgICBUaGUgc3lzdGVtIGxpbWl0IG9mIG9wZW4gZmlsZSBpcyByZWFjaGVkLgogICAgICAgICA8TEk+IEVOT01FTQogICAgICAgICBOb3QgZW5vdWdoIG1lbW9yeSB0byBjYXJyeSBvdXQgdGhlIG9wZXJhdGlvbi4KICAgICAgICAgPExJPiBFSU5WQUwKICAgICAgICAgVGhlIGNvbnZlcnNpb24gZnJvbSA8VkFSPmZyb21jb2RlPC9WQVI+IHRvIDxWQVI+dG9jb2RlPC9WQVI+IGlzIG5vdCBzdXBwb3J0ZWQuCgogICAgICAgICA8YnI+PGJyPiBJdCBpcyBub3QgcG9zc2libGUgdG8gdXNlIHRoZSBzYW1lIGRlc2NyaXB0b3IgaW4gZGlmZmVyZW50IHRocmVhZHMgdG8KICAgICAgICAgcGVyZm9ybSBpbmRlcGVuZGVudCBjb252ZXJzaW9ucy4gIFRoZSBkYXRhIHN0cnVjdHVyZXMgYXNzb2NpYXRlZAogICAgICAgICB3aXRoIHRoZSBkZXNjcmlwdG9yIGluY2x1ZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnZlcnNpb24gc3RhdGUuCiAgICAgICAgIFRoaXMgbXVzdCBub3QgYmUgbWVzc2VkIHVwIGJ5IHVzaW5nIGl0IGluIGRpZmZlcmVudCBjb252ZXJzaW9ucy4KICAgICAgICAgPGJyPjxicj4gQW4gPENPREU+aWNvbnY8L0NPREU+IGRlc2NyaXB0b3IgaXMgbGlrZSBhIGZpbGUgZGVzY3JpcHRvciBhcyBmb3IgZXZlcnkgdXNlIGEKICAgICAgICAgbmV3IGRlc2NyaXB0b3IgbXVzdCBiZSBjcmVhdGVkLiAgVGhlIGRlc2NyaXB0b3IgZG9lcyBub3Qgc3RhbmQgZm9yIGFsbAogICAgICAgICBvZiB0aGUgY29udmVyc2lvbnMgZnJvbSA8VkFSPmZyb21zZXQ8L1ZBUj4gdG8gPFZBUj50b3NldDwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gVGhlIEdOVSBDIGxpYnJhcnkgaW1wbGVtZW50YXRpb24gb2YgPENPREU+aWNvbnZfb3BlbjwvQ09ERT4gaGFzIG9uZQogICAgICAgICBzaWduaWZpY2FudCBleHRlbnNpb24gdG8gb3RoZXIgaW1wbGVtZW50YXRpb25zLiAgVG8gZWFzZSB0aGUgZXh0ZW5zaW9uCiAgICAgICAgIG9mIHRoZSBzZXQgb2YgYXZhaWxhYmxlIGNvbnZlcnNpb25zLCB0aGUgaW1wbGVtZW50YXRpb24gYWxsb3dzIHN0b3JpbmcKICAgICAgICAgdGhlIG5lY2Vzc2FyeSBmaWxlcyB3aXRoIGRhdGEgYW5kIGNvZGUgaW4gYW4gYXJiaXRyYXJ5IG51bWJlciBvZgogICAgICAgICBkaXJlY3Rvcmllcy4gIEhvdyB0aGlzIGV4dGVuc2lvbiBtdXN0IGJlIHdyaXR0ZW4gd2lsbCBiZSBleHBsYWluZWQgYmVsb3cKICAgICAgICAgLiAgSGVyZSBpdCBpcyBvbmx5IGltcG9ydGFudCB0byBzYXkKICAgICAgICAgdGhhdCBhbGwgZGlyZWN0b3JpZXMgbWVudGlvbmVkIGluIHRoZSA8Q09ERT5HQ09OVl9QQVRIPC9DT0RFPiBlbnZpcm9ubWVudAogICAgICAgICB2YXJpYWJsZSBhcmUgY29uc2lkZXJlZCBvbmx5IGlmIHRoZXkgY29udGFpbiBhIGZpbGUgPFRUPmdjb252LW1vZHVsZXM8L1RUPi4KICAgICAgICAgVGhlc2UgZGlyZWN0b3JpZXMgbmVlZCBub3QgbmVjZXNzYXJpbHkgYmUgY3JlYXRlZCBieSB0aGUgc3lzdGVtCiAgICAgICAgIGFkbWluaXN0cmF0b3IuICBJbiBmYWN0LCB0aGlzIGV4dGVuc2lvbiBpcyBpbnRyb2R1Y2VkIHRvIGhlbHAgdXNlcnMKICAgICAgICAgd3JpdGluZyBhbmQgdXNpbmcgdGhlaXIgb3duLCBuZXcgY29udmVyc2lvbnMuICBPZiBjb3Vyc2UsIHRoaXMgZG9lcyBub3QKICAgICAgICAgd29yayBmb3Igc2VjdXJpdHkgcmVhc29ucyBpbiBTVUlEIGJpbmFyaWVzOyBpbiB0aGlzIGNhc2Ugb25seSB0aGUgc3lzdGVtCiAgICAgICAgIGRpcmVjdG9yeSBpcyBjb25zaWRlcmVkIGFuZCB0aGlzIG5vcm1hbGx5IGlzCiAgICAgICAgIDxUVD48VkFSPnByZWZpeDwvVkFSPi9saWIvZ2NvbnY8L1RUPi4gIFRoZSA8Q09ERT5HQ09OVl9QQVRIPC9DT0RFPiBlbnZpcm9ubWVudAogICAgICAgICB2YXJpYWJsZSBpcyBleGFtaW5lZCBleGFjdGx5IG9uY2UgYXQgdGhlIGZpcnN0IGNhbGwgb2YgdGhlCiAgICAgICAgIDxDT0RFPmljb252X29wZW48L0NPREU+IGZ1bmN0aW9uLiAgTGF0ZXIgbW9kaWZpY2F0aW9ucyBvZiB0aGUgdmFyaWFibGUgaGF2ZSBubwogICAgICAgICBlZmZlY3QuCiAgICAgICAgIDxicj48YnI+IFRoZSA8Q09ERT5pY29udl9vcGVuPC9DT0RFPiBmdW5jdGlvbiB3YXMgaW50cm9kdWNlZCBlYXJseSBpbiB0aGUgWC9PcGVuCiAgICAgICAgIFBvcnRhYmlsaXR5IEd1aWRlLCB2ZXJzaW9uIDIuICBJdCBpcyBzdXBwb3J0ZWQgYnkgYWxsIGNvbW1lcmNpYWwKICAgICAgICAgVW5pY2VzIGFzIGl0IGlzIHJlcXVpcmVkIGZvciB0aGUgVW5peCBicmFuZGluZy4gIEhvd2V2ZXIsIHRoZSBxdWFsaXR5IGFuZAogICAgICAgICBjb21wbGV0ZW5lc3Mgb2YgdGhlIGltcGxlbWVudGF0aW9uIHZhcmllcyB3aWRlbHkuICBUaGUgPENPREU+aWNvbnZfb3BlbjwvQ09ERT4KICAgICAgICAgZnVuY3Rpb24gaXMgZGVjbGFyZWQgaW4gPFRUPmljb252Lmg8L1RUPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHaWNvbnYuaHhxAH4Ov3QAKGNvbnN0IGNoYXIgKnRvY29kZSwgY29uc3QgY2hhciAqZnJvbWNvZGV0AAdpY29udl90dAAQaWZfZnJlZW5hbWVpbmRleHNxAH4ACnQAdgogICAgICAgIFRoaXMgZnVuY3Rpb24gZnJlZXMgdGhlIHN0cnVjdHVyZSByZXR1cm5lZCBieSBhbiBlYXJsaWVyIGNhbGwgdG8KICAgICAgICAgPENPREU+aWZfbmFtZWluZGV4PC9DT0RFPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIbmV0L2lmLmh4cQB+DsZ0ABhzdHJ1Y3QgaWZfbmFtZWluZGV4ICpwdHJ0AAR2b2lkdAAOaWZfaW5kZXh0b25hbWVzcQB+AAp0AXEKICAgICAgICBUaGlzIGZ1bmN0aW9uIG1hcHMgYW4gaW50ZXJmYWNlIGluZGV4IHRvIGl0cyBjb3JyZXNwb25kaW5nIG5hbWUuICBUaGUKICAgICAgICAgcmV0dXJuZWQgbmFtZSBpcyBwbGFjZWQgaW4gdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IDxDT0RFPmlmbmFtZTwvQ09ERT4sIHdoaWNoCiAgICAgICAgIG11c3QgYmUgYXQgbGVhc3QgPENPREU+SUZOQU1TSVo8L0NPREU+IGJ5dGVzIGluIGxlbmd0aC4gIElmIHRoZSBpbmRleCB3YXMKICAgICAgICAgaW52YWxpZCwgdGhlIGZ1bmN0aW9uJ3MgcmV0dXJuIHZhbHVlIGlzIGEgbnVsbCBwb2ludGVyLCBvdGhlcndpc2UgaXQgaXMKICAgICAgICAgPENPREU+aWZuYW1lPC9DT0RFPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIbmV0L2lmLmh4cQB+Ds10ACJ1bnNpZ25lZCBpbnQgaWZpbmRleCwgY2hhciAqaWZuYW1ldAAGY2hhciAqdAAMaWZfbmFtZWluZGV4c3EAfgAKdAGnCiAgICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGFycmF5IG9mIDxDT0RFPmlmX25hbWVpbmRleDwvQ09ERT4gc3RydWN0dXJlcywgb25lCiAgICAgICAgIGZvciBldmVyeSBpbnRlcmZhY2UgdGhhdCBpcyBwcmVzZW50LiAgVGhlIGVuZCBvZiB0aGUgbGlzdCBpcyBpbmRpY2F0ZWQKICAgICAgICAgYnkgYSBzdHJ1Y3R1cmUgd2l0aCBhbiBpbnRlcmZhY2Ugb2YgMCBhbmQgYSBudWxsIG5hbWUgcG9pbnRlci4gIElmIGFuCiAgICAgICAgIGVycm9yIG9jY3VycywgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgbnVsbCBwb2ludGVyLgogICAgICAgICA8YnI+PGJyPiBUaGUgcmV0dXJuZWQgc3RydWN0dXJlIG11c3QgYmUgZnJlZWQgd2l0aCA8Q09ERT5pZl9mcmVlbmFtZWluZGV4PC9DT0RFPiBhZnRlcgogICAgICAgICB1c2UuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACG5ldC9pZi5oeHEAfg7UdAAEdm9pZHQAFXN0cnVjdCBpZl9uYW1laW5kZXggKnQADmlmX25hbWV0b2luZGV4c3EAfgAKdACiCiAgICAgICAgVGhpcyBmdW5jdGlvbiB5aWVsZHMgdGhlIGludGVyZmFjZSBpbmRleCBjb3JyZXNwb25kaW5nIHRvIGEgcGFydGljdWxhcgogICAgICAgICBuYW1lLiAgSWYgbm8gaW50ZXJmYWNlIGV4aXN0cyB3aXRoIHRoZSBuYW1lIGdpdmVuLCBpdCByZXR1cm5zIDAuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACG5ldC9pZi5oeHEAfg7bdAASY29uc3QgY2hhciAqaWZuYW1ldAAMdW5zaWduZWQgaW50dAAFaWxvZ2JzcQB+AAp0AJkKICAgICAgICBUaGVzZSBmdW5jdGlvbnMgYXJlIGVxdWl2YWxlbnQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgPENPREU+bG9nYjwvQ09ERT4KICAgICAgICAgZnVuY3Rpb25zIGV4Y2VwdCB0aGF0IHRoZXkgcmV0dXJuIHNpZ25lZCBpbnRlZ2VyIHZhbHVlcy4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGbWF0aC5oeHEAfg7idAAIZG91YmxlIHh0AANpbnR0AAZpbG9nYmZzcQB+AAp0AJkKICAgICAgICBUaGVzZSBmdW5jdGlvbnMgYXJlIGVxdWl2YWxlbnQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgPENPREU+bG9nYjwvQ09ERT4KICAgICAgICAgZnVuY3Rpb25zIGV4Y2VwdCB0aGF0IHRoZXkgcmV0dXJuIHNpZ25lZCBpbnRlZ2VyIHZhbHVlcy4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGbWF0aC5oeHEAfg7pdAAHZmxvYXQgeHQAA2ludHQABmlsb2dibHNxAH4ACnQAmQogICAgICAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUgZXF1aXZhbGVudCB0byB0aGUgY29ycmVzcG9uZGluZyA8Q09ERT5sb2diPC9DT0RFPgogICAgICAgICBmdW5jdGlvbnMgZXhjZXB0IHRoYXQgdGhleSByZXR1cm4gc2lnbmVkIGludGVnZXIgdmFsdWVzLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZtYXRoLmh4cQB+DvB0AA1sb25nIGRvdWJsZSB4dAADaW50dAAHaW1heGFic3NxAH4ACnQCEAogICAgICAgIFRoZXNlIGZ1bmN0aW9ucyByZXR1cm4gdGhlIGFic29sdXRlIHZhbHVlIG9mIDxWQVI+bnVtYmVyPC9WQVI+LgogICAgICAgICA8YnI+PGJyPiBNb3N0IGNvbXB1dGVycyB1c2UgYSB0d28ncyBjb21wbGVtZW50IGludGVnZXIgcmVwcmVzZW50YXRpb24sIGluIHdoaWNoCiAgICAgICAgIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiA8Q09ERT5JTlRfTUlOPC9DT0RFPiAodGhlIHNtYWxsZXN0IHBvc3NpYmxlIDxDT0RFPmludDwvQ09ERT4pCiAgICAgICAgIGNhbm5vdCBiZSByZXByZXNlbnRlZDsgdGh1cywgPENPREU+YWJzIChJTlRfTUlOKTwvQ09ERT4gaXMgbm90IGRlZmluZWQuCiAgICAgICAgIDxicj48YnI+IDxDT0RFPmxsYWJzPC9DT0RFPiBhbmQgPENPREU+aW1heGRpdjwvQ09ERT4gYXJlIG5ldyB0byBJU08gQzk5LgogICAgICAgICA8YnI+PGJyPiBTZWUgSW50ZWdlcnMgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIDxDT0RFPmludG1heF90PC9DT0RFPiB0eXBlLgogICAgICAgICA8YnI+PGJyPgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAppbnR0eXBlcy5oeHEAfg73dAAPaW50bWF4X3QgbnVtYmVydAAIaW50bWF4X3R0AAdpbWF4ZGl2c3EAfgAKdAGICiAgICAgICAgVGhlIDxDT0RFPmltYXhkaXY8L0NPREU+IGZ1bmN0aW9uIGlzIGxpa2UgdGhlIDxDT0RFPmRpdjwvQ09ERT4gZnVuY3Rpb24sIGJ1dCB0aGUKICAgICAgICAgYXJndW1lbnRzIGFyZSBvZiB0eXBlIDxDT0RFPmludG1heF90PC9DT0RFPiBhbmQgdGhlIHJlc3VsdCBpcyByZXR1cm5lZCBhcwogICAgICAgICBhIHN0cnVjdHVyZSBvZiB0eXBlIDxDT0RFPmltYXhkaXZfdDwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IFNlZSBJbnRlZ2VycyBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgPENPREU+aW50bWF4X3Q8L0NPREU+IHR5cGUuCiAgICAgICAgIDxicj48YnI+IFRoZSA8Q09ERT5pbWF4ZGl2PC9DT0RFPiBmdW5jdGlvbiB3YXMgYWRkZWQgaW4gSVNPIEM5OS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAKaW50dHlwZXMuaHhxAH4O/nQAKGludG1heF90IG51bWVyYXRvciwgaW50bWF4X3QgZGVub21pbmF0b3J0AAlpbWF4ZGl2X3R0AAVpbmRleHNxAH4ACnQBOQogICAgICAgIDxDT0RFPmluZGV4PC9DT0RFPiBpcyBhbm90aGVyIG5hbWUgZm9yIDxDT0RFPnN0cmNocjwvQ09ERT47IHRoZXkgYXJlIGV4YWN0bHkgdGhlIHNhbWUuCiAgICAgICAgIE5ldyBjb2RlIHNob3VsZCBhbHdheXMgdXNlIDxDT0RFPnN0cmNocjwvQ09ERT4gc2luY2UgdGhpcyBuYW1lIGlzIGRlZmluZWQgaW4KICAgICAgICAgSVNPIEMgd2hpbGUgPENPREU+aW5kZXg8L0NPREU+IGlzIGEgQlNEIGludmVudGlvbiB3aGljaCBuZXZlciB3YXMgYXZhaWxhYmxlCiAgICAgICAgIG9uIFN5c3RlbSBWIGRlcml2ZWQgc3lzdGVtcy4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc3RyaW5nLmh4cQB+DwV0ABljb25zdCBjaGFyICpzdHJpbmcsIGludCBjdAAGY2hhciAqdAAJaW5ldF9hZGRyc3EAfgAKdAIZCiAgICAgICAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgSVB2NCBJbnRlcm5ldCBob3N0IGFkZHJlc3MgPFZBUj5uYW1lPC9WQVI+IGZyb20gdGhlCiAgICAgICAgIHN0YW5kYXJkIG51bWJlcnMtYW5kLWRvdHMgbm90YXRpb24gaW50byBiaW5hcnkgZGF0YS4gIElmIHRoZSBpbnB1dCBpcwogICAgICAgICBub3QgdmFsaWQsIDxDT0RFPmluZXRfYWRkcjwvQ09ERT4gcmV0dXJucyA8Q09ERT5JTkFERFJfTk9ORTwvQ09ERT4uICBUaGlzIGlzIGFuCiAgICAgICAgIG9ic29sZXRlIGludGVyZmFjZSB0byA8Q09ERT5pbmV0X2F0b248L0NPREU+LCBkZXNjcmliZWQgaW1tZWRpYXRlbHkgYWJvdmUuIEl0CiAgICAgICAgIGlzIG9ic29sZXRlIGJlY2F1c2UgPENPREU+SU5BRERSX05PTkU8L0NPREU+IGlzIGEgdmFsaWQgYWRkcmVzcwogICAgICAgICAoMjU1LjI1NS4yNTUuMjU1KSwgYW5kIDxDT0RFPmluZXRfYXRvbjwvQ09ERT4gcHJvdmlkZXMgYSBjbGVhbmVyIHdheSB0bwogICAgICAgICBpbmRpY2F0ZSBlcnJvciByZXR1cm4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAC2FycGEvaW5ldC5oeHEAfg8MdAAQY29uc3QgY2hhciAqbmFtZXQACHVpbnQzMl90dAAJaW5ldF9hdG9uc3EAfgAKdAFNCiAgICAgICAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgSVB2NCBJbnRlcm5ldCBob3N0IGFkZHJlc3MgPFZBUj5uYW1lPC9WQVI+CiAgICAgICAgIGZyb20gdGhlIHN0YW5kYXJkIG51bWJlcnMtYW5kLWRvdHMgbm90YXRpb24gaW50byBiaW5hcnkgZGF0YSBhbmQgc3RvcmVzCiAgICAgICAgIGl0IGluIHRoZSA8Q09ERT5zdHJ1Y3QgaW5fYWRkcjwvQ09ERT4gdGhhdCA8VkFSPmFkZHI8L1ZBUj4gcG9pbnRzIHRvLgogICAgICAgICA8Q09ERT5pbmV0X2F0b248L0NPREU+IHJldHVybnMgbm9uemVybyBpZiB0aGUgYWRkcmVzcyBpcyB2YWxpZCwgemVybyBpZiBub3QuCiAgICAgICAgc3EAfgAPAAAAA3cEAAAAA3QADHN5cy9zb2NrZXQuaHQADG5ldGluZXQvaW4uaHQAC2FycGEvaW5ldC5oeHEAfg8TdAAmY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGluX2FkZHIgKmFkZHJ0AANpbnR0AAppbmV0X2xuYW9mc3EAfgAKdAE/CiAgICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBsb2NhbC1hZGRyZXNzLXdpdGhpbi1uZXR3b3JrIHBhcnQgb2YgdGhlCiAgICAgICAgIEludGVybmV0IGhvc3QgYWRkcmVzcyA8VkFSPmFkZHI8L1ZBUj4uCiAgICAgICAgIDxicj48YnI+IFRoZSBmdW5jdGlvbiB3b3JrcyBvbmx5IHdpdGggdHJhZGl0aW9uYWwgSVB2NCBjbGFzcyBBLCBCIGFuZCBDIG5ldHdvcmsKICAgICAgICAgdHlwZXMuICBJdCBkb2Vzbid0IHdvcmsgd2l0aCBjbGFzc2xlc3MgYWRkcmVzc2VzIGFuZCBzaG91bGRuJ3QgYmUgdXNlZAogICAgICAgICBhbnltb3JlLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAthcnBhL2luZXQuaHhxAH4PHHQAE3N0cnVjdCBpbl9hZGRyIGFkZHJ0AAh1aW50MzJfdHQADWluZXRfbWFrZWFkZHJzcQB+AAp0AMMKICAgICAgICBUaGlzIGZ1bmN0aW9uIG1ha2VzIGFuIElQdjQgSW50ZXJuZXQgaG9zdCBhZGRyZXNzIGJ5IGNvbWJpbmluZyB0aGUgbmV0d29yawogICAgICAgICBudW1iZXIgPFZBUj5uZXQ8L1ZBUj4gd2l0aCB0aGUgbG9jYWwtYWRkcmVzcy13aXRoaW4tbmV0d29yayBudW1iZXIKICAgICAgICAgPFZBUj5sb2NhbDwvVkFSPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAALYXJwYS9pbmV0Lmh4cQB+DyN0ABx1aW50MzJfdCBuZXQsIHVpbnQzMl90IGxvY2FsdAAOc3RydWN0IGluX2FkZHJ0AAppbmV0X25ldG9mc3EAfgAKdAExCiAgICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBuZXR3b3JrIG51bWJlciBwYXJ0IG9mIHRoZSBJbnRlcm5ldCBob3N0CiAgICAgICAgIGFkZHJlc3MgPFZBUj5hZGRyPC9WQVI+LgogICAgICAgICA8YnI+PGJyPiBUaGUgZnVuY3Rpb24gd29ya3Mgb25seSB3aXRoIHRyYWRpdGlvbmFsIElQdjQgY2xhc3MgQSwgQiBhbmQgQyBuZXR3b3JrCiAgICAgICAgIHR5cGVzLiAgSXQgZG9lc24ndCB3b3JrIHdpdGggY2xhc3NsZXNzIGFkZHJlc3NlcyBhbmQgc2hvdWxkbid0IGJlIHVzZWQKICAgICAgICAgYW55bW9yZS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAALYXJwYS9pbmV0Lmh4cQB+Dyp0ABNzdHJ1Y3QgaW5fYWRkciBhZGRydAAIdWludDMyX3R0AAxpbmV0X25ldHdvcmtzcQB+AAp0AdkKICAgICAgICBUaGlzIGZ1bmN0aW9uIGV4dHJhY3RzIHRoZSBuZXR3b3JrIG51bWJlciBmcm9tIHRoZSBhZGRyZXNzIDxWQVI+bmFtZTwvVkFSPiwKICAgICAgICAgZ2l2ZW4gaW4gdGhlIHN0YW5kYXJkIG51bWJlcnMtYW5kLWRvdHMgbm90YXRpb24uIFRoZSByZXR1cm5lZCBhZGRyZXNzIGlzCiAgICAgICAgIGluIGhvc3Qgb3JkZXIuIElmIHRoZSBpbnB1dCBpcyBub3QgdmFsaWQsIDxDT0RFPmluZXRfbmV0d29yazwvQ09ERT4gcmV0dXJucwogICAgICAgICA8Q09ERT4tMTwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IFRoZSBmdW5jdGlvbiB3b3JrcyBvbmx5IHdpdGggdHJhZGl0aW9uYWwgSVB2NCBjbGFzcyBBLCBCIGFuZCBDIG5ldHdvcmsKICAgICAgICAgdHlwZXMuICBJdCBkb2Vzbid0IHdvcmsgd2l0aCBjbGFzc2xlc3MgYWRkcmVzc2VzIGFuZCBzaG91bGRuJ3QgYmUgdXNlZAogICAgICAgICBhbnltb3JlLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAthcnBhL2luZXQuaHhxAH4PMXQAEGNvbnN0IGNoYXIgKm5hbWV0AAh1aW50MzJfdHQACWluZXRfbnRvYXNxAH4ACnQDDAogICAgICAgIFRoaXMgZnVuY3Rpb24gY29udmVydHMgdGhlIElQdjQgSW50ZXJuZXQgaG9zdCBhZGRyZXNzIDxWQVI+YWRkcjwvVkFSPiB0byBhCiAgICAgICAgIHN0cmluZyBpbiB0aGUgc3RhbmRhcmQgbnVtYmVycy1hbmQtZG90cyBub3RhdGlvbi4gIFRoZSByZXR1cm4gdmFsdWUgaXMKICAgICAgICAgYSBwb2ludGVyIGludG8gYSBzdGF0aWNhbGx5LWFsbG9jYXRlZCBidWZmZXIuICBTdWJzZXF1ZW50IGNhbGxzIHdpbGwKICAgICAgICAgb3ZlcndyaXRlIHRoZSBzYW1lIGJ1ZmZlciwgc28geW91IHNob3VsZCBjb3B5IHRoZSBzdHJpbmcgaWYgeW91IG5lZWQKICAgICAgICAgdG8gc2F2ZSBpdC4KICAgICAgICAgPGJyPjxicj4gSW4gbXVsdGktdGhyZWFkZWQgcHJvZ3JhbXMgZWFjaCB0aHJlYWQgaGFzIGFuIG93biBzdGF0aWNhbGx5LWFsbG9jYXRlZAogICAgICAgICBidWZmZXIuICBCdXQgc3RpbGwgc3Vic2VxdWVudCBjYWxscyBvZiA8Q09ERT5pbmV0X250b2E8L0NPREU+IGluIHRoZSBzYW1lCiAgICAgICAgIHRocmVhZCB3aWxsIG92ZXJ3cml0ZSB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGNhbGwuCiAgICAgICAgIDxicj48YnI+IEluc3RlYWQgb2YgPENPREU+aW5ldF9udG9hPC9DT0RFPiB0aGUgbmV3ZXIgZnVuY3Rpb24gPENPREU+aW5ldF9udG9wPC9DT0RFPiB3aGljaCBpcwogICAgICAgICBkZXNjcmliZWQgYmVsb3cgc2hvdWxkIGJlIHVzZWQgc2luY2UgaXQgaGFuZGxlcyBib3RoIElQdjQgYW5kIElQdjYKICAgICAgICAgYWRkcmVzc2VzLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAthcnBhL2luZXQuaHhxAH4POHQAE3N0cnVjdCBpbl9hZGRyIGFkZHJ0AAZjaGFyICp0AAlpbmV0X250b3BzcQB+AAp0AgYKICAgICAgICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGFuIEludGVybmV0IGFkZHJlc3MgKGVpdGhlciBJUHY0IG9yIElQdjYpIGZyb20KICAgICAgICAgbmV0d29yayAoYmluYXJ5KSB0byBwcmVzZW50YXRpb24gKHRleHR1YWwpIGZvcm0uICA8VkFSPmFmPC9WQVI+IHNob3VsZCBiZQogICAgICAgICBlaXRoZXIgPENPREU+QUZfSU5FVDwvQ09ERT4gb3IgPENPREU+QUZfSU5FVDY8L0NPREU+LCBhcyBhcHByb3ByaWF0ZS4gIDxWQVI+Y3A8L1ZBUj4gaXMgYQogICAgICAgICBwb2ludGVyIHRvIHRoZSBhZGRyZXNzIHRvIGJlIGNvbnZlcnRlZC4gIDxWQVI+YnVmPC9WQVI+IHNob3VsZCBiZSBhIHBvaW50ZXIKICAgICAgICAgdG8gYSBidWZmZXIgdG8gaG9sZCB0aGUgcmVzdWx0LCBhbmQgPFZBUj5sZW48L1ZBUj4gaXMgdGhlIGxlbmd0aCBvZiB0aGlzCiAgICAgICAgIGJ1ZmZlci4gIFRoZSByZXR1cm4gdmFsdWUgZnJvbSB0aGUgZnVuY3Rpb24gd2lsbCBiZSB0aGlzIGJ1ZmZlciBhZGRyZXNzLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAthcnBhL2luZXQuaHhxAH4PP3QALWludCBhZiwgY29uc3Qgdm9pZCAqY3AsIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbnQADGNvbnN0IGNoYXIgKnQACWluZXRfcHRvbnNxAH4ACnQB9wogICAgICAgIFRoaXMgZnVuY3Rpb24gY29udmVydHMgYW4gSW50ZXJuZXQgYWRkcmVzcyAoZWl0aGVyIElQdjQgb3IgSVB2NikgZnJvbQogICAgICAgICBwcmVzZW50YXRpb24gKHRleHR1YWwpIHRvIG5ldHdvcmsgKGJpbmFyeSkgZm9ybWF0LiAgPFZBUj5hZjwvVkFSPiBzaG91bGQgYmUKICAgICAgICAgZWl0aGVyIDxDT0RFPkFGX0lORVQ8L0NPREU+IG9yIDxDT0RFPkFGX0lORVQ2PC9DT0RFPiwgYXMgYXBwcm9wcmlhdGUgZm9yIHRoZSB0eXBlIG9mCiAgICAgICAgIGFkZHJlc3MgYmVpbmcgY29udmVydGVkLiAgPFZBUj5jcDwvVkFSPiBpcyBhIHBvaW50ZXIgdG8gdGhlIGlucHV0IHN0cmluZywgYW5kCiAgICAgICAgIDxWQVI+YnVmPC9WQVI+IGlzIGEgcG9pbnRlciB0byBhIGJ1ZmZlciBmb3IgdGhlIHJlc3VsdC4gIEl0IGlzIHRoZSBjYWxsZXIncwogICAgICAgICByZXNwb25zaWJpbGl0eSB0byBtYWtlIHN1cmUgdGhlIGJ1ZmZlciBpcyBsYXJnZSBlbm91Z2guCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAC2FycGEvaW5ldC5oeHEAfg9GdAAhaW50IGFmLCBjb25zdCBjaGFyICpjcCwgdm9pZCAqYnVmdAADaW50dAAKaW5pdGdyb3Vwc3NxAH4ACnQCIgogICAgICAgIFRoZSA8Q09ERT5pbml0Z3JvdXBzPC9DT0RFPiBmdW5jdGlvbiBzZXRzIHRoZSBwcm9jZXNzJ3Mgc3VwcGxlbWVudGFyeSBncm91cAogICAgICAgICBJRHMgdG8gYmUgdGhlIG5vcm1hbCBkZWZhdWx0IGZvciB0aGUgdXNlciBuYW1lIDxWQVI+dXNlcjwvVkFSPi4gIFRoZSBncm91cAogICAgICAgICA8VkFSPmdyb3VwPC9WQVI+IGlzIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQuCiAgICAgICAgIDxicj48YnI+IFRoaXMgZnVuY3Rpb24gd29ya3MgYnkgc2Nhbm5pbmcgdGhlIGdyb3VwIGRhdGFiYXNlIGZvciBhbGwgdGhlIGdyb3VwcwogICAgICAgICA8VkFSPnVzZXI8L1ZBUj4gYmVsb25ncyB0by4gIEl0IHRoZW4gY2FsbHMgPENPREU+c2V0Z3JvdXBzPC9DT0RFPiB3aXRoIHRoZSBsaXN0IGl0CiAgICAgICAgIGhhcyBjb25zdHJ1Y3RlZC4KICAgICAgICAgPGJyPjxicj4gVGhlIHJldHVybiB2YWx1ZXMgYW5kIGVycm9yIGNvbmRpdGlvbnMgYXJlIHRoZSBzYW1lIGFzIGZvcgogICAgICAgICA8Q09ERT5zZXRncm91cHM8L0NPREU+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAVncnAuaHhxAH4PTXQAHWNvbnN0IGNoYXIgKnVzZXIsIGdpZF90IGdyb3VwdAADaW50dAAJaW5pdHN0YXRlc3EAfgAKdAJsCiAgICAgICAgVGhlIDxDT0RFPmluaXRzdGF0ZTwvQ09ERT4gZnVuY3Rpb24gaXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSByYW5kb20gbnVtYmVyCiAgICAgICAgIGdlbmVyYXRvciBzdGF0ZS4gIFRoZSBhcmd1bWVudCA8VkFSPnN0YXRlPC9WQVI+IGlzIGFuIGFycmF5IG9mIDxWQVI+c2l6ZTwvVkFSPgogICAgICAgICBieXRlcywgdXNlZCB0byBob2xkIHRoZSBzdGF0ZSBpbmZvcm1hdGlvbi4gIEl0IGlzIGluaXRpYWxpemVkIGJhc2VkIG9uCiAgICAgICAgIDxWQVI+c2VlZDwvVkFSPi4gIFRoZSBzaXplIG11c3QgYmUgYmV0d2VlbiA4IGFuZCAyNTYgYnl0ZXMsIGFuZCBzaG91bGQgYmUgYQogICAgICAgICBwb3dlciBvZiB0d28uICBUaGUgYmlnZ2VyIHRoZSA8VkFSPnN0YXRlPC9WQVI+IGFycmF5LCB0aGUgYmV0dGVyLgogICAgICAgICA8YnI+PGJyPiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBwcmV2aW91cyB2YWx1ZSBvZiB0aGUgc3RhdGUgaW5mb3JtYXRpb24gYXJyYXkuCiAgICAgICAgIFlvdSBjYW4gdXNlIHRoaXMgdmFsdWUgbGF0ZXIgYXMgYW4gYXJndW1lbnQgdG8gPENPREU+c2V0c3RhdGU8L0NPREU+IHRvCiAgICAgICAgIHJlc3RvcmUgdGhhdCBzdGF0ZS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc3RkbGliLmh4cQB+D1R0ACt1bnNpZ25lZCBpbnQgc2VlZCwgdm9pZCAqc3RhdGUsIHNpemVfdCBzaXpldAAGdm9pZCAqdAALaW5pdHN0YXRlX3JzcQB+AAp0APsKICAgICAgICBUaGUgPENPREU+aW5pdHN0YXRlX3I8L0NPREU+IGZ1bmN0aW9uIGJlaGF2ZXMgZXhhY3RseSBsaWtlIHRoZSA8Q09ERT5pbml0c3RhdGU8L0NPREU+CiAgICAgICAgIGZ1bmN0aW9uIGV4Y2VwdCB0aGF0IGl0IHVzZXMgYW5kIG1vZGlmaWVzIHRoZSBzdGF0ZSBpbiB0aGUgb2JqZWN0CiAgICAgICAgIHBvaW50ZWQgdG8gYnkgdGhlIGZvdXJ0aCBwYXJhbWV0ZXIgaW5zdGVhZCBvZiB0aGUgZ2xvYmFsIHN0YXRlLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAhzdGRsaWIuaHhxAH4PW3QAXXVuc2lnbmVkIGludCBzZWVkLCBjaGFyICpyZXN0cmljdCBzdGF0ZWJ1Ziwgc2l6ZV90IHN0YXRlbGVuLCBzdHJ1Y3QgcmFuZG9tX2RhdGEgKnJlc3RyaWN0IGJ1ZnQAA2ludHQAB2lubmV0Z3JzcQB+AAp0BKAKICAgICAgICBUaGlzIGZ1bmN0aW9uIHRlc3RzIHdoZXRoZXIgdGhlIHRyaXBsZSBzcGVjaWZpZWQgYnkgdGhlIHBhcmFtZXRlcnMKICAgICAgICAgPFZBUj5ob3N0cDwvVkFSPiwgPFZBUj51c2VycDwvVkFSPiwgYW5kIDxWQVI+ZG9tYWlucDwvVkFSPiBpcyBwYXJ0IG9mIHRoZSBuZXRncm91cAogICAgICAgICA8VkFSPm5ldGdyb3VwPC9WQVI+LiAgVXNpbmcgdGhpcyBmdW5jdGlvbiBoYXMgdGhlIGFkdmFudGFnZSB0aGF0CiAgICAgICAgIDxicj48YnI+IDxPTD4KICAgICAgICAgPExJPgogICAgICAgICBubyBvdGhlciBuZXRncm91cCBmdW5jdGlvbiBjYW4gdXNlIHRoZSBnbG9iYWwgbmV0Z3JvdXAgc3RhdGUgc2luY2UKICAgICAgICAgaW50ZXJuYWwgbG9ja2luZyBpcyB1c2VkIGFuZAogICAgICAgICA8TEk+CiAgICAgICAgIHRoZSBmdW5jdGlvbiBpcyBpbXBsZW1lbnRlZCBtb3JlIGVmZmljaWVudGx5IHRoYW4gc3VjY2Vzc2l2ZSBjYWxscwogICAgICAgICB0byB0aGUgb3RoZXIgPENPREU+c2V0PC9DT0RFPi88Q09ERT5nZXQ8L0NPREU+LzxDT0RFPmVuZG5ldGdyZW50PC9DT0RFPiBmdW5jdGlvbnMuCiAgICAgICAgIDwvT0w+CiAgICAgICAgIDxicj48YnI+IEFueSBvZiB0aGUgcG9pbnRlcnMgPFZBUj5ob3N0cDwvVkFSPiwgPFZBUj51c2VycDwvVkFSPiwgYW5kIDxWQVI+ZG9tYWlucDwvVkFSPiBjYW4gYmUKICAgICAgICAgPENPREU+TlVMTDwvQ09ERT4gd2hpY2ggbWVhbnMgYW55IHZhbHVlIGlzIGFjY2VwdGVkIGluIHRoaXMgcG9zaXRpb24uICBUaGlzIGlzCiAgICAgICAgIGFsc28gdHJ1ZSBmb3IgdGhlIG5hbWUgPENPREU+LTwvQ09ERT4gd2hpY2ggc2hvdWxkIG5vdCBtYXRjaCBhbnkgb3RoZXIgc3RyaW5nCiAgICAgICAgIG90aGVyd2lzZS4KICAgICAgICAgPGJyPjxicj4gVGhlIHJldHVybiB2YWx1ZSBpcyA8Q09ERT4xPC9DT0RFPiBpZiBhbiBlbnRyeSBtYXRjaGluZyB0aGUgZ2l2ZW4gdHJpcGxlIGlzCiAgICAgICAgIGZvdW5kIGluIHRoZSBuZXRncm91cC4gIFRoZSByZXR1cm4gdmFsdWUgaXMgPENPREU+MDwvQ09ERT4gaWYgdGhlIG5ldGdyb3VwCiAgICAgICAgIGl0c2VsZiBpcyBub3QgZm91bmQsIHRoZSBuZXRncm91cCBkb2VzIG5vdCBjb250YWluIHRoZSB0cmlwbGUgb3IKICAgICAgICAgaW50ZXJuYWwgZXJyb3JzIG9jY3VycmVkLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAduZXRkYi5oeHEAfg9idABMY29uc3QgY2hhciAqbmV0Z3JvdXAsIGNvbnN0IGNoYXIgKmhvc3QsIGNvbnN0IGNoYXIgKnVzZXIsIGNvbnN0IGNoYXIgKmRvbWFpbnQAA2ludHQA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PC9WQVI+ID09IDA8L0NPREU+CjxERD4KICAgICAgICAgQWxsIHByb2Nlc3NlcyBpbiB0aGUgc2FtZSBwcm9jZXNzIGdyb3VwIGFzIHRoZSBzZW5kZXIuCiAgICAgICAgIDxicj48YnI+IDxMST4gPFZBUj5waWQ8L1ZBUj4gPCAtMQogICAgICAgICBUaGUgcHJvY2VzcyBncm91cCB3aG9zZSBpZGVudGlmaWVyIGlzIDxWQVI+cGlkPC9WQVI+LgogICAgICAgICA8YnI+PGJyPiA8TEk+IDxWQVI+cGlkPC9WQVI+ID09IC0xCiAgICAgICAgIElmIHRoZSBwcm9jZXNzIGlzIHByaXZpbGVnZWQsIHNlbmQgdGhlIHNpZ25hbCB0byBhbGwgcHJvY2Vzc2VzIGV4Y2VwdAogICAgICAgICBmb3Igc29tZSBzcGVjaWFsIHN5c3RlbSBwcm9jZXNzZXMuICBPdGhlcndpc2UsIHNlbmQgdGhlIHNpZ25hbCB0byBhbGwKICAgICAgICAgcHJvY2Vzc2VzIHdpdGggdGhlIHNhbWUgZWZmZWN0aXZlIHVzZXIgSUQuCgogICAgICAgICA8YnI+PGJyPiBBIHByb2Nlc3MgY2FuIHNlbmQgYSBzaWduYWwgdG8gaXRzZWxmIHdpdGggYSBjYWxsIGxpa2UgPENPREU+a2lsbAogICAgICAgICAoZ2V0cGlkKCksIDxWQVI+c2lnbnVtPC9WQVI+KTwvQ09ERT4uICBJZiA8Q09ERT5raWxsPC9DT0RFPiBpcyB1c2VkIGJ5IGEgcHJvY2VzcyB0byBzZW5kCiAgICAgICAgIGEgc2lnbmFsIHRvIGl0c2VsZiwgYW5kIHRoZSBzaWduYWwgaXMgbm90IGJsb2NrZWQsIHRoZW4gPENPREU+a2lsbDwvQ09ERT4KICAgICAgICAgZGVsaXZlcnMgYXQgbGVhc3Qgb25lIHNpZ25hbCAod2hpY2ggbWlnaHQgYmUgc29tZSBvdGhlciBwZW5kaW5nCiAgICAgICAgIHVuYmxvY2tlZCBzaWduYWwgaW5zdGVhZCBvZiB0aGUgc2lnbmFsIDxWQVI+c2lnbnVtPC9WQVI+KSB0byB0aGF0IHByb2Nlc3MKICAgICAgICAgYmVmb3JlIGl0IHJldHVybnMuCiAgICAgICAgIDxicj48YnI+IFRoZSByZXR1cm4gdmFsdWUgZnJvbSA8Q09ERT5raWxsPC9DT0RFPiBpcyB6ZXJvIGlmIHRoZSBzaWduYWwgY2FuIGJlIHNlbnQKICAgICAgICAgc3VjY2Vzc2Z1bGx5LiAgT3RoZXJ3aXNlLCBubyBzaWduYWwgaXMgc2VudCwgYW5kIGEgdmFsdWUgb2YgPENPREU+LTE8L0NPREU+IGlzCiAgICAgICAgIHJldHVybmVkLiAgSWYgPFZBUj5waWQ8L1ZBUj4gc3BlY2lmaWVzIHNlbmRpbmcgYSBzaWduYWwgdG8gc2V2ZXJhbCBwcm9jZXNzZXMsCiAgICAgICAgIDxDT0RFPmtpbGw8L0NPREU+IHN1Y2NlZWRzIGlmIGl0IGNhbiBzZW5kIHRoZSBzaWduYWwgdG8gYXQgbGVhc3Qgb25lIG9mIHRoZW0uCiAgICAgICAgIFRoZXJlJ3Mgbm8gd2F5IHlvdSBjYW4gdGVsbCB3aGljaCBvZiB0aGUgcHJvY2Vzc2VzIGdvdCB0aGUgc2lnbmFsCiAgICAgICAgIG9yIHdoZXRoZXIgYWxsIG9mIHRoZW0gZGlkLgogICAgICAgICA8YnI+PGJyPiBUaGUgZm9sbG93aW5nIDxDT0RFPmVycm5vPC9DT0RFPiBlcnJvciBjb25kaXRpb25zIGFyZSBkZWZpbmVkIGZvciB0aGlzIGZ1bmN0aW9uOgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8TEk+IEVJTlZBTAogICAgICAgICBUaGUgPFZBUj5zaWdudW08L1ZBUj4gYXJndW1lbnQgaXMgYW4gaW52YWxpZCBvciB1bnN1cHBvcnRlZCBudW1iZXIuCiAgICAgICAgIDxicj48YnI+IDxMST4gRVBFUk0KICAgICAgICAgWW91IGRvIG5vdCBoYXZlIHRoZSBwcml2aWxlZ2UgdG8gc2VuZCBhIHNpZ25hbCB0byB0aGUgcHJvY2VzcyBvciBhbnkgb2YKICAgICAgICAgdGhlIHByb2Nlc3NlcyBpbiB0aGUgcHJvY2VzcyBncm91cCBuYW1lZCBieSA8VkFSPnBpZDwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gPExJPiBFU1JDSAogICAgICAgICBUaGUgPFZBUj5waWQ8L1ZBUj4gYXJndW1lbnQgZG9lcyBub3QgcmVmZXIgdG8gYW4gZXhpc3RpbmcgcHJvY2VzcyBvciBncm91cC4KCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHNpZ25hbC5oeHEAfhCldAAVcGlkX3QgcGlkLCBpbnQgc2lnbnVtdAADaW50dAAGa2lsbHBnc3EAfgAKdAD+CiAgICAgICAgVGhpcyBpcyBzaW1pbGFyIHRvIDxDT0RFPmtpbGw8L0NPREU+LCBidXQgc2VuZHMgc2lnbmFsIDxWQVI+c2lnbnVtPC9WQVI+IHRvIHRoZQogICAgICAgICBwcm9jZXNzIGdyb3VwIDxWQVI+cGdpZDwvVkFSPi4gIFRoaXMgZnVuY3Rpb24gaXMgcHJvdmlkZWQgZm9yIGNvbXBhdGliaWxpdHkKICAgICAgICAgd2l0aCBCU0Q7IHVzaW5nIDxDT0RFPmtpbGw8L0NPREU+IHRvIGRvIHRoaXMgaXMgbW9yZSBwb3J0YWJsZS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc2lnbmFsLmh4cQB+EKx0ABRpbnQgcGdpZCwgaW50IHNpZ251bXQAA2ludHQABGw2NGFzcQB+AAp0C9YKICAgICAgICBUaGlzIGZ1bmN0aW9uIGVuY29kZXMgYSAzMi1iaXQgaW5wdXQgdmFsdWUgdXNpbmcgY2hhcmFjdGVycyBmcm9tIHRoZQogICAgICAgICBiYXNpYyBjaGFyYWN0ZXIgc2V0LiAgSXQgcmV0dXJucyBhIHBvaW50ZXIgdG8gYSA3IGNoYXJhY3RlciBidWZmZXIgd2hpY2gKICAgICAgICAgY29udGFpbnMgYW4gZW5jb2RlZCB2ZXJzaW9uIG9mIDxWQVI+bjwvVkFSPi4gIFRvIGVuY29kZSBhIHNlcmllcyBvZiBieXRlcyB0aGUKICAgICAgICAgdXNlciBtdXN0IGNvcHkgdGhlIHJldHVybmVkIHN0cmluZyB0byBhIGRlc3RpbmF0aW9uIGJ1ZmZlci4gIEl0IHJldHVybnMKICAgICAgICAgdGhlIGVtcHR5IHN0cmluZyBpZiA8VkFSPm48L1ZBUj4gaXMgemVybywgd2hpY2ggaXMgc29tZXdoYXQgYml6YXJyZSBidXQKICAgICAgICAgbWFuZGF0ZWQgYnkgdGhlIHN0YW5kYXJkLioKICAgICAgICAgV2FybmluZzogU2luY2UgYSBzdGF0aWMgYnVmZmVyIGlzIHVzZWQgdGhpcyBmdW5jdGlvbiBzaG91bGQgbm90CiAgICAgICAgIGJlIHVzZWQgaW4gbXVsdGktdGhyZWFkZWQgcHJvZ3JhbXMuICBUaGVyZSBpcyBubyB0aHJlYWQtc2FmZSBhbHRlcm5hdGl2ZQogICAgICAgICB0byB0aGlzIGZ1bmN0aW9uIGluIHRoZSBDIGxpYnJhcnkuKgogICAgICAgICBDb21wYXRpYmlsaXR5IE5vdGU6IFRoZSBYUEcgc3RhbmRhcmQgc3RhdGVzIHRoYXQgdGhlIHJldHVybgogICAgICAgICB2YWx1ZSBvZiA8Q09ERT5sNjRhPC9DT0RFPiBpcyB1bmRlZmluZWQgaWYgPFZBUj5uPC9WQVI+IGlzIG5lZ2F0aXZlLiAgSW4gdGhlIEdOVQogICAgICAgICBpbXBsZW1lbnRhdGlvbiwgPENPREU+bDY0YTwvQ09ERT4gdHJlYXRzIGl0cyBhcmd1bWVudCBhcyB1bnNpZ25lZCwgc28gaXQgd2lsbAogICAgICAgICByZXR1cm4gYSBzZW5zaWJsZSBlbmNvZGluZyBmb3IgYW55IG5vbnplcm8gPFZBUj5uPC9WQVI+OyBob3dldmVyLCBwb3J0YWJsZQogICAgICAgICBwcm9ncmFtcyBzaG91bGQgbm90IHJlbHkgb24gdGhpcy4KICAgICAgICAgPGJyPjxicj4gVG8gZW5jb2RlIGEgbGFyZ2UgYnVmZmVyIDxDT0RFPmw2NGE8L0NPREU+IG11c3QgYmUgY2FsbGVkIGluIGEgbG9vcCwgb25jZSBmb3IKICAgICAgICAgZWFjaCAzMi1iaXQgd29yZCBvZiB0aGUgYnVmZmVyLiAgRm9yIGV4YW1wbGUsIG9uZSBjb3VsZCBkbyBzb21ldGhpbmcKICAgICAgICAgbGlrZSB0aGlzOgogICAgICAgICA8YnI+PGJyPiA8cHJlPjxicj4KICAgICAgICAgY2hhciAqPGJyPgogICAgICAgICBlbmNvZGUgKGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbik8YnI+CiAgICAgICAgIHs8YnI+CiAgICAgICAgICAgLyogV2Uga25vdyBpbiBhZHZhbmNlIGhvdyBsb25nIHRoZSBidWZmZXIgaGFzIHRvIGJlLiAqLzxicj4KICAgICAgICAgICB1bnNpZ25lZCBjaGFyICppbiA9ICh1bnNpZ25lZCBjaGFyICopIGJ1Zjs8YnI+CiAgICAgICAgICAgY2hhciAqb3V0ID0gbWFsbG9jICg2ICsgKChsZW4gKyAzKSAvIDQpICogNiArIDEpOzxicj4KICAgICAgICAgICBjaGFyICpjcCA9IG91dCwgKnA7PGJyPgogICAgICAgICA8YnI+PGJyPiAgIC8qIEVuY29kZSB0aGUgbGVuZ3RoLiAqLzxicj4KICAgICAgICAgICAvKiBVc2luZyBgaHRvbmwnIGlzIG5lY2Vzc2FyeSBzbyB0aGF0IHRoZSBkYXRhIGNhbiBiZTxicj4KICAgICAgICAgICAgICBkZWNvZGVkIGV2ZW4gb24gbWFjaGluZXMgd2l0aCBkaWZmZXJlbnQgYnl0ZSBvcmRlci48YnI+CiAgICAgICAgICAgICAgYGw2NGEnIGNhbiByZXR1cm4gYSBzdHJpbmcgc2hvcnRlciB0aGFuIDYgYnl0ZXMsIHNvIDxicj4KICAgICAgICAgICAgICB3ZSBwYWQgaXQgd2l0aCBlbmNvZGluZyBvZiAwICgnLicpIGF0IHRoZSBlbmQgYnkgPGJyPgogICAgICAgICAgICAgIGhhbmQuICovPGJyPgogICAgICAgICA8YnI+PGJyPiAgIHAgPSBzdHBjcHkgKGNwLCBsNjRhIChodG9ubCAobGVuKSkpOzxicj4KICAgICAgICAgICBjcCA9IG1lbXBjcHkgKHAsICIuLi4uLi4iLCA2IC0gKHAgLSBjcCkpOzxicj4KICAgICAgICAgPGJyPjxicj4gICB3aGlsZSAobGVuID4gMyk8YnI+CiAgICAgICAgICAgICB7PGJyPgogICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGludCBuID0gKmluKys7PGJyPgogICAgICAgICAgICAgICBuID0gKG4gPDwgOCkgfCAqaW4rKzs8YnI+CiAgICAgICAgICAgICAgIG4gPSAobiA8PCA4KSB8ICppbisrOzxicj4KICAgICAgICAgICAgICAgbiA9IChuIDw8IDgpIHwgKmluKys7PGJyPgogICAgICAgICAgICAgICBsZW4gLT0gNDs8YnI+CiAgICAgICAgICAgICAgIHAgPSBzdHBjcHkgKGNwLCBsNjRhIChodG9ubCAobikpKTs8YnI+CiAgICAgICAgICAgICAgIGNwID0gbWVtcGNweSAocCwgIi4uLi4uLiIsIDYgLSAocCAtIGNwKSk7PGJyPgogICAgICAgICAgICAgfTxicj4KICAgICAgICAgICBpZiAobGVuID4gMCk8YnI+CiAgICAgICAgICAgICB7PGJyPgogICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGludCBuID0gKmluKys7PGJyPgogICAgICAgICAgICAgICBpZiAoLS1sZW4gPiAwKTxicj4KICAgICAgICAgICAgICAgICB7PGJyPgogICAgICAgICAgICAgICAgICAgbiA9IChuIDw8IDgpIHwgKmluKys7PGJyPgogICAgICAgICAgICAgICAgICAgaWYgKC0tbGVuID4gMCk8YnI+CiAgICAgICAgICAgICAgICAgICAgIG4gPSAobiA8PCA4KSB8ICppbjs8YnI+CiAgICAgICAgICAgICAgICAgfTxicj4KICAgICAgICAgICAgICAgY3AgPSBzdHBjcHkgKGNwLCBsNjRhIChodG9ubCAobikpKTs8YnI+CiAgICAgICAgICAgICB9PGJyPgogICAgICAgICAgICpjcCA9ICdcMCc7PGJyPgogICAgICAgICAgIHJldHVybiBvdXQ7PGJyPgogICAgICAgICB9PGJyPgogICAgICAgICA8L3ByZT4KICAgICAgICAgPGJyPjxicj4gSXQgaXMgc3RyYW5nZSB0aGF0IHRoZSBsaWJyYXJ5IGRvZXMgbm90IHByb3ZpZGUgdGhlIGNvbXBsZXRlCiAgICAgICAgIGZ1bmN0aW9uYWxpdHkgbmVlZGVkIGJ1dCBzbyBiZSBpdC4KICAgICAgICAgPGJyPjxicj4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc3RkbGliLmh4cQB+ELN0AApsb25nIGludCBudAAGY2hhciAqdAAEbGFic3NxAH4ACnQCEAogICAgICAgIFRoZXNlIGZ1bmN0aW9ucyByZXR1cm4gdGhlIGFic29sdXRlIHZhbHVlIG9mIDxWQVI+bnVtYmVyPC9WQVI+LgogICAgICAgICA8YnI+PGJyPiBNb3N0IGNvbXB1dGVycyB1c2UgYSB0d28ncyBjb21wbGVtZW50IGludGVnZXIgcmVwcmVzZW50YXRpb24sIGluIHdoaWNoCiAgICAgICAgIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiA8Q09ERT5JTlRfTUlOPC9DT0RFPiAodGhlIHNtYWxsZXN0IHBvc3NpYmxlIDxDT0RFPmludDwvQ09ERT4pCiAgICAgICAgIGNhbm5vdCBiZSByZXByZXNlbnRlZDsgdGh1cywgPENPREU+YWJzIChJTlRfTUlOKTwvQ09ERT4gaXMgbm90IGRlZmluZWQuCiAgICAgICAgIDxicj48YnI+IDxDT0RFPmxsYWJzPC9DT0RFPiBhbmQgPENPREU+aW1heGRpdjwvQ09ERT4gYXJlIG5ldyB0byBJU08gQzk5LgogICAgICAgICA8YnI+PGJyPiBTZWUgSW50ZWdlcnMgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIDxDT0RFPmludG1heF90PC9DT0RFPiB0eXBlLgogICAgICAgICA8YnI+PGJyPgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAhzdGRsaWIuaHhxAH4QunQAD2xvbmcgaW50IG51bWJlcnQACGxvbmcgaW50dAAHbGNvbmc0OHNxAH4ACnQC/wogICAgICAgIFRoZSA8Q09ERT5sY29uZzQ4PC9DT0RFPiBmdW5jdGlvbiBhbGxvd3MgdGhlIHVzZXIgdG8gY2hhbmdlIHRoZSBjb21wbGV0ZSBzdGF0ZQogICAgICAgICBvZiB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuICBVbmxpa2UgPENPREU+c3JhbmQ0ODwvQ09ERT4gYW5kCiAgICAgICAgIDxDT0RFPnNlZWQ0ODwvQ09ERT4sIHRoaXMgZnVuY3Rpb24gYWxzbyBjaGFuZ2VzIHRoZSBjb25zdGFudHMgaW4gdGhlCiAgICAgICAgIGNvbmdydWVudGlhbCBmb3JtdWxhLgogICAgICAgICA8YnI+PGJyPiBGcm9tIHRoZSBzZXZlbiBlbGVtZW50cyBpbiB0aGUgYXJyYXkgPFZBUj5wYXJhbTwvVkFSPiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQKICAgICAgICAgMTYgYml0cyBvZiB0aGUgZW50cmllcyA8Q09ERT48VkFSPnBhcmFtPC9WQVI+WzBdPC9DT0RFPiB0byA8Q09ERT48VkFSPnBhcmFtPC9WQVI+WzJdPC9DT0RFPgogICAgICAgICBkZXRlcm1pbmUgdGhlIGluaXRpYWwgc3RhdGUsIHRoZSBsZWFzdCBzaWduaWZpY2FudCAxNiBiaXRzIG9mCiAgICAgICAgIDxDT0RFPjxWQVI+cGFyYW08L1ZBUj5bM108L0NPREU+IHRvIDxDT0RFPjxWQVI+cGFyYW08L1ZBUj5bNV08L0NPREU+IGRldGVybWluZSB0aGUgNDggYml0CiAgICAgICAgIGNvbnN0YW50IDxDT0RFPmE8L0NPREU+IGFuZCA8Q09ERT48VkFSPnBhcmFtPC9WQVI+WzZdPC9DT0RFPiBkZXRlcm1pbmVzIHRoZSAxNi1iaXQgdmFsdWUKICAgICAgICAgPENPREU+YzwvQ09ERT4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHN0ZGxpYi5oeHEAfhDBdAAbdW5zaWduZWQgc2hvcnQgaW50IHBhcmFtWzdddAAEdm9pZHQACWxjb25nNDhfcnNxAH4ACnQCjAogICAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgYWxsIGFzcGVjdHMgb2YgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCiAgICAgICAgIGRlc2NyaWJlZCBpbiA8VkFSPmJ1ZmZlcjwvVkFSPiB3aXRoIHRoZSBkYXRhIGluIDxWQVI+cGFyYW08L1ZBUj4uICBIZXJlIGl0IGlzCiAgICAgICAgIGVzcGVjaWFsbHkgdHJ1ZSB0aGF0IHRoZSBmdW5jdGlvbiBkb2VzIG1vcmUgdGhhbiBqdXN0IGNvcHlpbmcgdGhlCiAgICAgICAgIGNvbnRlbnRzIG9mIDxWQVI+cGFyYW08L1ZBUj4gYW5kIDxWQVI+YnVmZmVyPC9WQVI+LiAgTW9yZSB3b3JrIGlzIHJlcXVpcmVkIGFuZAogICAgICAgICB0aGVyZWZvcmUgaXQgaXMgaW1wb3J0YW50IHRvIHVzZSB0aGlzIGZ1bmN0aW9uIHJhdGhlciB0aGFuIGluaXRpYWxpemluZwogICAgICAgICB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZGlyZWN0bHkuCiAgICAgICAgIDxicj48YnI+IElmIHRoZSByZXR1cm4gdmFsdWUgaXMgbm9uLW5lZ2F0aXZlIHRoZSBmdW5jdGlvbiBjYWxsIHN1Y2NlZWRlZC4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiBpcyBhIEdOVSBleHRlbnNpb24gYW5kIHNob3VsZCBub3QgYmUgdXNlZCBpbiBwb3J0YWJsZQogICAgICAgICBwcm9ncmFtcy4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc3RkbGliLmh4cQB+EMh0ADh1bnNpZ25lZCBzaG9ydCBpbnQgcGFyYW1bN10sIHN0cnVjdCBkcmFuZDQ4X2RhdGEgKmJ1ZmZlcnQAA2ludHQABWxkZXhwc3EAfgAKdAFwCiAgICAgICAgVGhlc2UgZnVuY3Rpb25zIHJldHVybiB0aGUgcmVzdWx0IG9mIG11bHRpcGx5aW5nIHRoZSBmbG9hdGluZy1wb2ludAogICAgICAgICBudW1iZXIgPFZBUj52YWx1ZTwvVkFSPiBieSAyIHJhaXNlZCB0byB0aGUgcG93ZXIgPFZBUj5leHBvbmVudDwvVkFSPi4gIChJdCBjYW4KICAgICAgICAgYmUgdXNlZCB0byByZWFzc2VtYmxlIGZsb2F0aW5nLXBvaW50IG51bWJlcnMgdGhhdCB3ZXJlIHRha2VuIGFwYXJ0CiAgICAgICAgIGJ5IDxDT0RFPmZyZXhwPC9DT0RFPi4pCiAgICAgICAgIDxicj48YnI+IEZvciBleGFtcGxlLCA8Q09ERT5sZGV4cCAoMC44LCA0KTwvQ09ERT4gcmV0dXJucyA8Q09ERT4xMi44PC9DT0RFPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGbWF0aC5oeHEAfhDPdAAaZG91YmxlIHZhbHVlLCBpbnQgZXhwb25lbnR0AAZkb3VibGV0AAZsZGV4cGZzcQB+AAp0AXAKICAgICAgICBUaGVzZSBmdW5jdGlvbnMgcmV0dXJuIHRoZSByZXN1bHQgb2YgbXVsdGlwbHlpbmcgdGhlIGZsb2F0aW5nLXBvaW50CiAgICAgICAgIG51bWJlciA8VkFSPnZhbHVlPC9WQVI+IGJ5IDIgcmFpc2VkIHRvIHRoZSBwb3dlciA8VkFSPmV4cG9uZW50PC9WQVI+LiAgKEl0IGNhbgogICAgICAgICBiZSB1c2VkIHRvIHJlYXNzZW1ibGUgZmxvYXRpbmctcG9pbnQgbnVtYmVycyB0aGF0IHdlcmUgdGFrZW4gYXBhcnQKICAgICAgICAgYnkgPENPREU+ZnJleHA8L0NPREU+LikKICAgICAgICAgPGJyPjxicj4gRm9yIGV4YW1wbGUsIDxDT0RFPmxkZXhwICgwLjgsIDQpPC9DT0RFPiByZXR1cm5zIDxDT0RFPjEyLjg8L0NPREU+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZtYXRoLmh4cQB+ENZ0ABlmbG9hdCB2YWx1ZSwgaW50IGV4cG9uZW50dAAFZmxvYXR0AAZsZGV4cGxzcQB+AAp0AXAKICAgICAgICBUaGVzZSBmdW5jdGlvbnMgcmV0dXJuIHRoZSByZXN1bHQgb2YgbXVsdGlwbHlpbmcgdGhlIGZsb2F0aW5nLXBvaW50CiAgICAgICAgIG51bWJlciA8VkFSPnZhbHVlPC9WQVI+IGJ5IDIgcmFpc2VkIHRvIHRoZSBwb3dlciA8VkFSPmV4cG9uZW50PC9WQVI+LiAgKEl0IGNhbgogICAgICAgICBiZSB1c2VkIHRvIHJlYXNzZW1ibGUgZmxvYXRpbmctcG9pbnQgbnVtYmVycyB0aGF0IHdlcmUgdGFrZW4gYXBhcnQKICAgICAgICAgYnkgPENPREU+ZnJleHA8L0NPREU+LikKICAgICAgICAgPGJyPjxicj4gRm9yIGV4YW1wbGUsIDxDT0RFPmxkZXhwICgwLjgsIDQpPC9DT0RFPiByZXR1cm5zIDxDT0RFPjEyLjg8L0NPREU+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZtYXRoLmh4cQB+EN10AB9sb25nIGRvdWJsZSB2YWx1ZSwgaW50IGV4cG9uZW50dAALbG9uZyBkb3VibGV0AARsZGl2c3EA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RUFDQ0VTPC9DT0RFPgo8REQ+CiAgICAgICAgIFlvdSBhcmUgbm90IGFsbG93ZWQgdG8gd3JpdGUgdG8gdGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0aGUgbmV3IGxpbmsgaXMKICAgICAgICAgdG8gYmUgd3JpdHRlbi4KCiAgICAgICAgIDxicj48YnI+IDxMST4gRUVYSVNUCiAgICAgICAgIFRoZXJlIGlzIGFscmVhZHkgYSBmaWxlIG5hbWVkIDxWQVI+bmV3bmFtZTwvVkFSPi4gIElmIHlvdSB3YW50IHRvIHJlcGxhY2UKICAgICAgICAgdGhpcyBsaW5rIHdpdGggYSBuZXcgbGluaywgeW91IG11c3QgcmVtb3ZlIHRoZSBvbGQgbGluayBleHBsaWNpdGx5IGZpcnN0LgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVNTElOSwogICAgICAgICBUaGVyZSBhcmUgYWxyZWFkeSB0b28gbWFueSBsaW5rcyB0byB0aGUgZmlsZSBuYW1lZCBieSA8VkFSPm9sZG5hbWU8L1ZBUj4uCiAgICAgICAgIChUaGUgbWF4aW11bSBudW1iZXIgb2YgbGlua3MgdG8gYSBmaWxlIGlzIDxDT0RFPkxJTktfTUFYPC9DT0RFPjsgc2VlCiAgICAgICAgIExpbWl0cyBmb3IgRmlsZXMuKQogICAgICAgICA8YnI+PGJyPiA8TEk+IEVOT0VOVAogICAgICAgICBUaGUgZmlsZSBuYW1lZCBieSA8VkFSPm9sZG5hbWU8L1ZBUj4gZG9lc24ndCBleGlzdC4gIFlvdSBjYW4ndCBtYWtlIGEgbGluayB0bwogICAgICAgICBhIGZpbGUgdGhhdCBkb2Vzbid0IGV4aXN0LgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVOT1NQQwogICAgICAgICBUaGUgZGlyZWN0b3J5IG9yIGZpbGUgc3lzdGVtIHRoYXQgd291bGQgY29udGFpbiB0aGUgbmV3IGxpbmsgaXMgZnVsbAogICAgICAgICBhbmQgY2Fubm90IGJlIGV4dGVuZGVkLgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVQRVJNCiAgICAgICAgIEluIHRoZSBHTlUgc3lzdGVtIGFuZCBzb21lIG90aGVycywgeW91IGNhbm5vdCBtYWtlIGxpbmtzIHRvIGRpcmVjdG9yaWVzLgogICAgICAgICBNYW55IHN5c3RlbXMgYWxsb3cgb25seSBwcml2aWxlZ2VkIHVzZXJzIHRvIGRvIHNvLiAgVGhpcyBlcnJvcgogICAgICAgICBpcyB1c2VkIHRvIHJlcG9ydCB0aGUgcHJvYmxlbS4KICAgICAgICAgPGJyPjxicj4gPExJPiBFUk9GUwogICAgICAgICBUaGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIG5ldyBsaW5rIGNhbid0IGJlIG1vZGlmaWVkIGJlY2F1c2UgaXQncyBvbgogICAgICAgICBhIHJlYWQtb25seSBmaWxlIHN5c3RlbS4KICAgICAgICAgPGJyPjxicj4gPExJPiBFWERFVgogICAgICAgICBUaGUgZGlyZWN0b3J5IHNwZWNpZmllZCBpbiA8VkFSPm5ld25hbWU8L1ZBUj4gaXMgb24gYSBkaWZmZXJlbnQgZmlsZSBzeXN0ZW0KICAgICAgICAgdGhhbiB0aGUgZXhpc3RpbmcgZmlsZS4KICAgICAgICAgPGJyPjxicj4gPExJPiBFSU8KICAgICAgICAgQSBoYXJkd2FyZSBlcnJvciBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gcmVhZCBvciB3cml0ZSB0aGUgdG8gZmlsZXN5c3RlbS4KCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHVuaXN0ZC5oeHEAfhEddAAoY29uc3QgY2hhciAqb2xkbmFtZSwgY29uc3QgY2hhciAqbmV3bmFtZXQAA2ludHQACmxpb19saXN0aW9zcQB+AAp0E20KICAgICAgICBUaGUgPENPREU+bGlvX2xpc3RpbzwvQ09ERT4gZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZW5xdWV1ZSBhbiBhcmJpdHJhcnkKICAgICAgICAgbnVtYmVyIG9mIHJlYWQgYW5kIHdyaXRlIHJlcXVlc3RzIGF0IG9uZSB0aW1lLiAgVGhlIHJlcXVlc3RzIGNhbiBhbGwgYmUKICAgICAgICAgbWVhbnQgZm9yIHRoZSBzYW1lIGZpbGUsIGFsbCBmb3IgZGlmZmVyZW50IGZpbGVzIG9yIGV2ZXJ5IHNvbHV0aW9uIGluCiAgICAgICAgIGJldHdlZW4uCiAgICAgICAgIDxicj48YnI+IDxDT0RFPmxpb19saXN0aW88L0NPREU+IGdldHMgdGhlIDxWQVI+bmVudDwvVkFSPiByZXF1ZXN0cyBmcm9tIHRoZSBhcnJheSBwb2ludGVkIHRvCiAgICAgICAgIGJ5IDxWQVI+bGlzdDwvVkFSPi4gIFRoZSBvcGVyYXRpb24gdG8gYmUgcGVyZm9ybWVkIGlzIGRldGVybWluZWQgYnkgdGhlCiAgICAgICAgIDxDT0RFPmFpb19saW9fb3Bjb2RlPC9DT0RFPiBtZW1iZXIgaW4gZWFjaCBlbGVtZW50IG9mIDxWQVI+bGlzdDwvVkFSPi4gIElmIHRoaXMKICAgICAgICAgZmllbGQgaXMgPENPREU+TElPX1JFQUQ8L0NPREU+IGEgcmVhZCBvcGVyYXRpb24gaXMgZW5xdWV1ZWQsIHNpbWlsYXIgdG8gYSBjYWxsCiAgICAgICAgIG9mIDxDT0RFPmFpb19yZWFkPC9DT0RFPiBmb3IgdGhpcyBlbGVtZW50IG9mIHRoZSBhcnJheSAoZXhjZXB0IHRoYXQgdGhlIHdheQogICAgICAgICB0aGUgdGVybWluYXRpb24gaXMgc2lnbmFsbGVkIGlzIGRpZmZlcmVudCwgYXMgd2Ugd2lsbCBzZWUgYmVsb3cpLiAgSWYKICAgICAgICAgdGhlIDxDT0RFPmFpb19saW9fb3Bjb2RlPC9DT0RFPiBtZW1iZXIgaXMgPENPREU+TElPX1dSSVRFPC9DT0RFPiBhIHdyaXRlIG9wZXJhdGlvbgogICAgICAgICBpcyBlbnF1ZXVlZC4gIE90aGVyd2lzZSB0aGUgPENPREU+YWlvX2xpb19vcGNvZGU8L0NPREU+IG11c3QgYmUgPENPREU+TElPX05PUDwvQ09ERT4KICAgICAgICAgaW4gd2hpY2ggY2FzZSB0aGlzIGVsZW1lbnQgb2YgPFZBUj5saXN0PC9WQVI+IGlzIHNpbXBseSBpZ25vcmVkLiAgVGhpcwogICAgICAgICBgYG9wZXJhdGlvbicnIGlzIHVzZWZ1bCBpbiBzaXR1YXRpb25zIHdoZXJlIG9uZSBoYXMgYSBmaXhlZCBhcnJheSBvZgogICAgICAgICA8Q09ERT5zdHJ1Y3QgYWlvY2I8L0NPREU+IGVsZW1lbnRzIGZyb20gd2hpY2ggb25seSBhIGZldyBuZWVkIHRvIGJlIGhhbmRsZWQgYXQKICAgICAgICAgYSB0aW1lLiAgQW5vdGhlciBzaXR1YXRpb24gaXMgd2hlcmUgdGhlIDxDT0RFPmxpb19saXN0aW88L0NPREU+IGNhbGwgd2FzCiAgICAgICAgIGNhbmNlbGVkIGJlZm9yZSBhbGwgcmVxdWVzdHMgYXJlIHByb2Nlc3NlZCAgYW5kIHRoZSByZW1haW5pbmcgcmVxdWVzdHMgaGF2ZSB0byBiZSByZWlzc3VlZC4KICAgICAgICAgPGJyPjxicj4gVGhlIG90aGVyIG1lbWJlcnMgb2YgZWFjaCBlbGVtZW50IG9mIHRoZSBhcnJheSBwb2ludGVkIHRvIGJ5CiAgICAgICAgIDxDT0RFPmxpc3Q8L0NPREU+IG11c3QgaGF2ZSB2YWx1ZXMgc3VpdGFibGUgZm9yIHRoZSBvcGVyYXRpb24gYXMgZGVzY3JpYmVkIGluCiAgICAgICAgIHRoZSBkb2N1bWVudGF0aW9uIGZvciA8Q09ERT5haW9fcmVhZDwvQ09ERT4gYW5kIDxDT0RFPmFpb193cml0ZTwvQ09ERT4gYWJvdmUuCiAgICAgICAgIDxicj48YnI+IFRoZSA8VkFSPm1vZGU8L1ZBUj4gYXJndW1lbnQgZGV0ZXJtaW5lcyBob3cgPENPREU+bGlvX2xpc3RpbzwvQ09ERT4gYmVoYXZlcyBhZnRlcgogICAgICAgICBoYXZpbmcgZW5xdWV1ZWQgYWxsIHRoZSByZXF1ZXN0cy4gIElmIDxWQVI+bW9kZTwvVkFSPiBpcyA8Q09ERT5MSU9fV0FJVDwvQ09ERT4gaXQKICAgICAgICAgd2FpdHMgdW50aWwgYWxsIHJlcXVlc3RzIHRlcm1pbmF0ZWQuICBPdGhlcndpc2UgPFZBUj5tb2RlPC9WQVI+IG11c3QgYmUKICAgICAgICAgPENPREU+TElPX05PV0FJVDwvQ09ERT4gYW5kIGluIHRoaXMgY2FzZSB0aGUgZnVuY3Rpb24gcmV0dXJucyBpbW1lZGlhdGVseSBhZnRlcgogICAgICAgICBoYXZpbmcgZW5xdWV1ZWQgYWxsIHRoZSByZXF1ZXN0cy4gIEluIHRoaXMgY2FzZSB0aGUgY2FsbGVyIGdldHMgYQogICAgICAgICBub3RpZmljYXRpb24gb2YgdGhlIHRlcm1pbmF0aW9uIG9mIGFsbCByZXF1ZXN0cyBhY2NvcmRpbmcgdG8gdGhlCiAgICAgICAgIDxWQVI+c2lnPC9WQVI+IHBhcmFtZXRlci4gIElmIDxWQVI+c2lnPC9WQVI+IGlzIDxDT0RFPk5VTEw8L0NPREU+IG5vIG5vdGlmaWNhdGlvbiBpcwogICAgICAgICBzZW5kLiAgT3RoZXJ3aXNlIGEgc2lnbmFsIGlzIHNlbnQgb3IgYSB0aHJlYWQgaXMgc3RhcnRlZCwganVzdCBhcwogICAgICAgICBkZXNjcmliZWQgaW4gdGhlIGRlc2NyaXB0aW9uIGZvciA8Q09ERT5haW9fcmVhZDwvQ09ERT4gb3IgPENPREU+YWlvX3dyaXRlPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gSWYgPFZBUj5tb2RlPC9WQVI+IGlzIDxDT0RFPkxJT19XQUlUPC9DT0RFPiwgdGhlIHJldHVybiB2YWx1ZSBvZiA8Q09ERT5saW9fbGlzdGlvPC9DT0RFPgogICAgICAgICBpcyAwIHdoZW4gYWxsIHJlcXVlc3RzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuICBPdGhlcndpc2UgdGhlCiAgICAgICAgIGZ1bmN0aW9uIHJldHVybiAtMSBhbmQgPENPREU+ZXJybm88L0NPREU+IGlzIHNldCBhY2NvcmRpbmdseS4gIFRvIGZpbmQKICAgICAgICAgb3V0IHdoaWNoIHJlcXVlc3Qgb3IgcmVxdWVzdHMgZmFpbGVkIG9uZSBoYXMgdG8gdXNlIHRoZSA8Q09ERT5haW9fZXJyb3I8L0NPREU+CiAgICAgICAgIGZ1bmN0aW9uIG9uIGFsbCB0aGUgZWxlbWVudHMgb2YgdGhlIGFycmF5IDxWQVI+bGlzdDwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gSW4gY2FzZSA8VkFSPm1vZGU8L1ZBUj4gaXMgPENPREU+TElPX05PV0FJVDwvQ09ERT4sIHRoZSBmdW5jdGlvbiByZXR1cm5zIDAgaWYKICAgICAgICAgYWxsIHJlcXVlc3RzIHdlcmUgZW5xdWV1ZWQgY29ycmVjdGx5LiAgVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHJlcXVlc3RzCiAgICAgICAgIGNhbiBiZSBmb3VuZCB1c2luZyA8Q09ERT5haW9fZXJyb3I8L0NPREU+IGFuZCA8Q09ERT5haW9fcmV0dXJuPC9DT0RFPiBhcyBkZXNjcmliZWQKICAgICAgICAgYWJvdmUuICBJZiA8Q09ERT5saW9fbGlzdGlvPC9DT0RFPiByZXR1cm5zIC0xIGluIHRoaXMgbW9kZSwgdGhlCiAgICAgICAgIGdsb2JhbCB2YXJpYWJsZSA8Q09ERT5lcnJubzwvQ09ERT4gaXMgc2V0IGFjY29yZGluZ2x5LiAgSWYgYSByZXF1ZXN0IGRpZCBub3QKICAgICAgICAgeWV0IHRlcm1pbmF0ZSwgYSBjYWxsIHRvIDxDT0RFPmFpb19lcnJvcjwvQ09ERT4gcmV0dXJucyA8Q09ERT5FSU5QUk9HUkVTUzwvQ09ERT4uICBJZgogICAgICAgICB0aGUgdmFsdWUgaXMgZGlmZmVyZW50LCB0aGUgcmVxdWVzdCBpcyBmaW5pc2hlZCBhbmQgdGhlIGVycm9yIHZhbHVlIChvcgogICAgICAgICAwKSBpcyByZXR1cm5lZCBhbmQgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uIGNhbiBiZSByZXRyaWV2ZWQKICAgICAgICAgdXNpbmcgPENPREU+YWlvX3JldHVybjwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IFBvc3NpYmxlIHZhbHVlcyBmb3IgPENPREU+ZXJybm88L0NPREU+IGFyZToKICAgICAgICAgPGJyPjxicj4gPERMPgoKICAgICAgICAgPERUPjxDT0RFPkVBR0FJTjwvQ09ERT4KPEREPgogICAgICAgICBUaGUgcmVzb3VyY2VzIG5lY2Vzc2FyeSB0byBxdWV1ZSBhbGwgdGhlIHJlcXVlc3RzIGFyZSBub3QgYXZhaWxhYmxlIGF0CiAgICAgICAgIHRoZSBtb21lbnQuICBUaGUgZXJyb3Igc3RhdHVzIGZvciBlYWNoIGVsZW1lbnQgb2YgPFZBUj5saXN0PC9WQVI+IG11c3QgYmUKICAgICAgICAgY2hlY2tlZCB0byBkZXRlcm1pbmUgd2hpY2ggcmVxdWVzdCBmYWlsZWQuCiAgICAgICAgIDxicj48YnI+IEFub3RoZXIgcmVhc29uIGNvdWxkIGJlIHRoYXQgdGhlIHN5c3RlbSB3aWRlIGxpbWl0IG9mIEFJTyByZXF1ZXN0cyBpcwogICAgICAgICBleGNlZWRlZC4gIFRoaXMgY2Fubm90IGJlIHRoZSBjYXNlIGZvciB0aGUgaW1wbGVtZW50YXRpb24gb24gR05VIHN5c3RlbXMKICAgICAgICAgc2luY2Ugbm8gYXJiaXRyYXJ5IGxpbWl0cyBleGlzdC4KICAgICAgICAgPExJPiBFSU5WQUwKICAgICAgICAgVGhlIDxWQVI+bW9kZTwvVkFSPiBwYXJhbWV0ZXIgaXMgaW52YWxpZCBvciA8VkFSPm5lbnQ8L1ZBUj4gaXMgbGFyZ2VyIHRoYW4KICAgICAgICAgPENPREU+QUlPX0xJU1RJT19NQVg8L0NPREU+LgogICAgICAgICA8TEk+IEVJTwogICAgICAgICBPbmUgb3IgbW9yZSBvZiB0aGUgcmVxdWVzdCdzIEkvTyBvcGVyYXRpb25zIGZhaWxlZC4gIFRoZSBlcnJvciBzdGF0dXMgb2YKICAgICAgICAgZWFjaCByZXF1ZXN0IHNob3VsZCBiZSBjaGVja2VkIHRvIGRldGVybWluZSB3aGljaCBvbmUgZmFpbGVkLgogICAgICAgICA8TEk+IEVOT1NZUwogICAgICAgICBUaGUgPENPREU+bGlvX2xpc3RpbzwvQ09ERT4gZnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZC4KCiAgICAgICAgIDxicj48YnI+IElmIHRoZSA8VkFSPm1vZGU8L1ZBUj4gcGFyYW1ldGVyIGlzIDxDT0RFPkxJT19OT1dBSVQ8L0NPREU+IGFuZCB0aGUgY2FsbGVyIGNhbmNlbHMKICAgICAgICAgYSByZXF1ZXN0LCB0aGUgZXJyb3Igc3RhdHVzIGZvciB0aGlzIHJlcXVlc3QgcmV0dXJuZWQgYnkKICAgICAgICAgPENPREU+YWlvX2Vycm9yPC9DT0RFPiBpcyA8Q09ERT5FQ0FOQ0VMRUQ8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBXaGVuIHRoZSBzb3VyY2VzIGFyZSBjb21waWxlZCB3aXRoIDxDT0RFPl9GSUxFX09GRlNFVF9CSVRTID09IDY0PC9DT0RFPiwgdGhpcwogICAgICAgICBmdW5jdGlvbiBpcyBpbiBmYWN0IDxDT0RFPmxpb19saXN0aW82NDwvQ09ERT4gc2luY2UgdGhlIExGUyBpbnRlcmZhY2UKICAgICAgICAgdHJhbnNwYXJlbnRseSByZXBsYWNlcyB0aGUgbm9ybWFsIGltcGxlbWVudGF0aW9uLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAVhaW8uaHhxAH4RJHQARGludCBtb2RlLCBzdHJ1Y3QgYWlvY2IgKmNvbnN0IGxpc3RbXSwgaW50IG5lbnQsIHN0cnVjdCBzaWdldmVudCAqc2lndAADaW50dAAMbGlvX2xpc3RpbzY0c3EAfgAKdALqCiAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIHRoZSA8Q09ERT5saW9fbGlzdGlvPC9DT0RFPiBmdW5jdGlvbi4gIFRoZSBvbmx5CiAgICAgICAgIGRpZmZlcmVuY2UgaXMgdGhhdCBvbiAzMiBiaXQgbWFjaGluZXMsIHRoZSBmaWxlIGRlc2NyaXB0b3Igc2hvdWxkCiAgICAgICAgIGJlIG9wZW5lZCBpbiB0aGUgbGFyZ2UgZmlsZSBtb2RlLiAgSW50ZXJuYWxseSwgPENPREU+bGlvX2xpc3RpbzY0PC9DT0RFPiB1c2VzCiAgICAgICAgIGZ1bmN0aW9uYWxpdHkgZXF1aXZhbGVudCB0byA8Q09ERT5sc2VlazY0PC9DT0RFPiAgdG8gcG9zaXRpb24gdGhlIGZpbGUgZGVzY3JpcHRvciBjb3JyZWN0bHkgZm9yIHRoZSByZWFkaW5nIG9yCiAgICAgICAgIHdyaXRpbmcsIGFzIG9wcG9zZWQgdG8gPENPREU+bHNlZWs8L0NPREU+IGZ1bmN0aW9uYWxpdHkgdXNlZCBpbgogICAgICAgICA8Q09ERT5saW9fbGlzdGlvPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gV2hlbiB0aGUgc291cmNlcyBhcmUgY29tcGlsZWQgd2l0aCA8Q09ERT5fRklMRV9PRkZTRVRfQklUUyA9PSA2NDwvQ09ERT4sIHRoaXMKICAgICAgICAgZnVuY3Rpb24gaXMgYXZhaWxhYmxlIHVuZGVyIHRoZSBuYW1lIDxDT0RFPmxpb19saXN0aW88L0NPREU+IGFuZCBzbwogICAgICAgICB0cmFuc3BhcmVudGx5IHJlcGxhY2VzIHRoZSBpbnRlcmZhY2UgZm9yIHNtYWxsIGZpbGVzIG9uIDMyIGJpdAogICAgICAgICBtYWNoaW5lcy4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAFYWlvLmh4cQB+ESt0AEJpbnQgbW9kZSwgc3RydWN0IGFpb2NiICpjb25zdCBsaXN0LCBpbnQgbmVudCwgc3RydWN0IHNpZ2V2ZW50ICpzaWd0AANpbnR0AAZsaXN0ZW5zcQB+AAp0A+kKICAgICAgICBUaGUgPENPREU+bGlzdGVuPC9DT0RFPiBmdW5jdGlvbiBlbmFibGVzIHRoZSBzb2NrZXQgPFZBUj5zb2NrZXQ8L1ZBUj4gdG8gYWNjZXB0CiAgICAgICAgIGNvbm5lY3Rpb25zLCB0aHVzIG1ha2luZyBpdCBhIHNlcnZlciBzb2NrZXQuCiAgICAgICAgIDxicj48YnI+IFRoZSBhcmd1bWVudCA8VkFSPm48L1ZBUj4gc3BlY2lmaWVzIHRoZSBsZW5ndGggb2YgdGhlIHF1ZXVlIGZvciBwZW5kaW5nCiAgICAgICAgIGNvbm5lY3Rpb25zLiAgV2hlbiB0aGUgcXVldWUgZmlsbHMsIG5ldyBjbGllbnRzIGF0dGVtcHRpbmcgdG8gY29ubmVjdAogICAgICAgICBmYWlsIHdpdGggPENPREU+RUNPTk5SRUZVU0VEPC9DT0RFPiB1bnRpbCB0aGUgc2VydmVyIGNhbGxzIDxDT0RFPmFjY2VwdDwvQ09ERT4gdG8KICAgICAgICAgYWNjZXB0IGEgY29ubmVjdGlvbiBmcm9tIHRoZSBxdWV1ZS4KICAgICAgICAgPGJyPjxicj4gVGhlIDxDT0RFPmxpc3RlbjwvQ09ERT4gZnVuY3Rpb24gcmV0dXJucyA8Q09ERT4wPC9DT0RFPiBvbiBzdWNjZXNzIGFuZCA8Q09ERT4tMTwvQ09ERT4KICAg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ICAgICBUaGVzZSBmdW5jdGlvbnMgYXJlIGp1c3QgbGlrZSA8Q09ERT5yaW50PC9DT0RFPiwgYnV0IHRoZXkgcmV0dXJuIGEKICAgICAgICAgPENPREU+bG9uZyBsb25nIGludDwvQ09ERT4gaW5zdGVhZCBvZiBhIGZsb2F0aW5nLXBvaW50IG51bWJlci4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGbWF0aC5oeHEAfhFOdAAHZmxvYXQgeHQADWxvbmcgbG9uZyBpbnR0AAdsbHJpbnRsc3EAfgAKdACcCiAgICAgICAgVGhlc2UgZnVuY3Rpb25zIGFyZSBqdXN0IGxpa2UgPENPREU+cmludDwvQ09ERT4sIGJ1dCB0aGV5IHJldHVybiBhCiAgICAgICAgIDxDT0RFPmxvbmcgbG9uZyBpbnQ8L0NPREU+IGluc3RlYWQgb2YgYSBmbG9hdGluZy1wb2ludCBudW1iZXIuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQABm1hdGguaHhxAH4RVXQADWxvbmcgZG91YmxlIHh0AA1sb25nIGxvbmcgaW50dAAHbGxyb3VuZHNxAH4ACnQAnQogICAgICAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUganVzdCBsaWtlIDxDT0RFPnJvdW5kPC9DT0RFPiwgYnV0IHRoZXkgcmV0dXJuIGEKICAgICAgICAgPENPREU+bG9uZyBsb25nIGludDwvQ09ERT4gaW5zdGVhZCBvZiBhIGZsb2F0aW5nLXBvaW50IG51bWJlci4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGbWF0aC5oeHEAfhFcdAAIZG91YmxlIHh0AA1sb25nIGxvbmcgaW50dAAIbGxyb3VuZGZzcQB+AAp0AJ0KICAgICAgICBUaGVzZSBmdW5jdGlvbnMgYXJlIGp1c3QgbGlrZSA8Q09ERT5yb3VuZDwvQ09ERT4sIGJ1dCB0aGV5IHJldHVybiBhCiAgICAgICAgIDxDT0RFPmxvbmcgbG9uZyBpbnQ8L0NPREU+IGluc3RlYWQgb2YgYSBmbG9hdGluZy1wb2ludCBudW1iZXIuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQABm1hdGguaHhxAH4RY3QAB2Zsb2F0IHh0AA1sb25nIGxvbmcgaW50dAAIbGxyb3VuZGxzcQB+AAp0AJ0KICAgICAgICBUaGVzZSBmdW5jdGlvbnMgYXJlIGp1c3QgbGlrZSA8Q09ERT5yb3VuZDwvQ09ERT4sIGJ1dCB0aGV5IHJldHVybiBhCiAgICAgICAgIDxDT0RFPmxvbmcgbG9uZyBpbnQ8L0NPREU+IGluc3RlYWQgb2YgYSBmbG9hdGluZy1wb2ludCBudW1iZXIuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQABm1hdGguaHhxAH4RanQADWxvbmcgZG91YmxlIHh0AA1sb25nIGxvbmcgaW50dAAKbG9jYWxlY29udnNxAH4ACnQB+AogICAgICAgIFRoZSA8Q09ERT5sb2NhbGVjb252PC9DT0RFPiBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byBhIHN0cnVjdHVyZSB3aG9zZQogICAgICAgICBjb21wb25lbnRzIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgaG93IG51bWVyaWMgYW5kIG1vbmV0YXJ5IHZhbHVlcwogICAgICAgICBzaG91bGQgYmUgZm9ybWF0dGVkIGluIHRoZSBjdXJyZW50IGxvY2FsZS4KICAgICAgICAgPGJyPjxicj4gWW91IHNob3VsZCBub3QgbW9kaWZ5IHRoZSBzdHJ1Y3R1cmUgb3IgaXRzIGNvbnRlbnRzLiAgVGhlIHN0cnVjdHVyZSBtaWdodAogICAgICAgICBiZSBvdmVyd3JpdHRlbiBieSBzdWJzZXF1ZW50IGNhbGxzIHRvIDxDT0RFPmxvY2FsZWNvbnY8L0NPREU+LCBvciBieSBjYWxscyB0bwogICAgICAgICA8Q09ERT5zZXRsb2NhbGU8L0NPREU+LCBidXQgbm8gb3RoZXIgZnVuY3Rpb24gaW4gdGhlIGxpYnJhcnkgb3ZlcndyaXRlcyB0aGlzCiAgICAgICAgIHZhbHVlLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAhsb2NhbGUuaHhxAH4RcXQABHZvaWR0AA5zdHJ1Y3QgbGNvbnYgKnQACWxvY2FsdGltZXNxAH4ACnQDhQogICAgICAgIFRoZSA8Q09ERT5sb2NhbHRpbWU8L0NPREU+IGZ1bmN0aW9uIGNvbnZlcnRzIHRoZSBzaW1wbGUgdGltZSBwb2ludGVkIHRvIGJ5CiAgICAgICAgIDxWQVI+dGltZTwvVkFSPiB0byBicm9rZW4tZG93biB0aW1lIHJlcHJlc2VudGF0aW9uLCBleHByZXNzZWQgcmVsYXRpdmUgdG8gdGhlCiAgICAgICAgIHVzZXIncyBzcGVjaWZpZWQgdGltZSB6b25lLgogICAgICAgICA8YnI+PGJyPiBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgcG9pbnRlciB0byBhIHN0YXRpYyBicm9rZW4tZG93biB0aW1lIHN0cnVjdHVyZSwgd2hpY2gKICAgICAgICAgbWlnaHQgYmUgb3ZlcndyaXR0ZW4gYnkgc3Vic2VxdWVudCBjYWxscyB0byA8Q09ERT5jdGltZTwvQ09ERT4sIDxDT0RFPmdtdGltZTwvQ09ERT4sCiAgICAgICAgIG9yIDxDT0RFPmxvY2FsdGltZTwvQ09ERT4uICAoQnV0IG5vIG90aGVyIGxpYnJhcnkgZnVuY3Rpb24gb3ZlcndyaXRlcyB0aGUgY29udGVudHMKICAgICAgICAgb2YgdGhpcyBvYmplY3QuKQogICAgICAgICA8YnI+PGJyPiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBudWxsIHBvaW50ZXIgaWYgPFZBUj50aW1lPC9WQVI+IGNhbm5vdCBiZSByZXByZXNlbnRlZAogICAgICAgICBhcyBhIGJyb2tlbi1kb3duIHRpbWU7IHR5cGljYWxseSB0aGlzIGlzIGJlY2F1c2UgdGhlIHllYXIgY2Fubm90IGZpdCBpbnRvCiAgICAgICAgIGFuIDxDT0RFPmludDwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IENhbGxpbmcgPENPREU+bG9jYWx0aW1lPC9DT0RFPiBoYXMgb25lIG90aGVyIGVmZmVjdDogaXQgc2V0cyB0aGUgdmFyaWFibGUKICAgICAgICAgPENPREU+dHpuYW1lPC9DT0RFPiB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IHRpbWUgem9uZS4gIC4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGdGltZS5oeHEAfhF4dAASY29uc3Qg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aW48L0NPREU+CiAgICAgICAgIHVzZXMgc3RhbmRhcmQgb3V0cHV0IG9yIHN0YW5kYXJkIGVycm9yIG91dHB1dCB0byBkZXRlcm1pbmUgdGhlIG5hbWUgb2YKICAgICAgICAgdGhlIHRlcm1pbmFsLiAgSWYgPENPREU+c3RydWN0IHV0bXA8L0NPREU+IGhhcyBhIDxDT0RFPnV0X3R5cGU8L0NPREU+IG1lbWJlciwKICAgICAgICAgPENPREU+bG9naW48L0NPREU+IHNldHMgaXQgdG8gPENPREU+VVNFUl9QUk9DRVNTPC9DT0RFPiwgYW5kIGlmIHRoZXJlIGlzIGFuCiAgICAgICAgIDxDT0RFPnV0X3BpZDwvQ09ERT4gbWVtYmVyLCBpdCB3aWxsIGJlIHNldCB0byB0aGUgcHJvY2VzcyBJRCBvZiB0aGUgY3VycmVudAogICAgICAgICBwcm9jZXNzLiAgVGhlIHJlbWFpbmluZyBlbnRyaWVzIGFyZSBjb3BpZWQgZnJvbSA8VkFSPmVudHJ5PC9WQVI+LgogICAgICAgICA8YnI+PGJyPiBBIGNvcHkgb2YgdGhlIGVudHJ5IGlzIHdyaXR0ZW4gdG8gdGhlIHVzZXIgYWNjb3VudGluZyBsb2cgZmlsZS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGdXRtcC5oeHEAfhHodAAYY29uc3Qgc3RydWN0IHV0bXAgKmVudHJ5dAAEdm9pZHQACWxvZ2luX3R0eXNxAH4ACnQBaAogICAgICAgIFRoaXMgZnVuY3Rpb24gbWFrZXMgPFZBUj5maWxlZGVzPC9WQVI+IHRoZSBjb250cm9sbGluZyB0ZXJtaW5hbCBvZiB0aGUKICAgICAgICAgY3VycmVudCBwcm9jZXNzLCByZWRpcmVjdHMgc3RhbmRhcmQgaW5wdXQsIHN0YW5kYXJkIG91dHB1dCBhbmQKICAgICAgICAgc3RhbmRhcmQgZXJyb3Igb3V0cHV0IHRvIHRoaXMgdGVybWluYWwsIGFuZCBjbG9zZXMgPFZBUj5maWxlZGVzPC9WQVI+LgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgPENPREU+MDwvQ09ERT4gb24gc3VjY2Vzc2Z1bCBjb21wbGV0aW9uLCBhbmQgPENPREU+LTE8L0NPREU+CiAgICAgICAgIG9uIGVycm9yLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZ1dG1wLmh4cQB+Ee90AAtpbnQgZmlsZWRlc3QAA2ludHQABGxvZ2xzcQB+AAp0Aa0KICAgICAgICBUaGVzZSBmdW5jdGlvbnMgY29tcHV0ZSB0aGUgbmF0dXJhbCBsb2dhcml0aG0gb2YgPFZBUj54PC9WQVI+LiAgPENPREU+ZXhwIChsb2cKICAgICAgICAgKDxWQVI+eDwvVkFSPikpPC9DT0RFPiBlcXVhbHMgPFZBUj54PC9WQVI+LCBleGFjdGx5IGluIG1hdGhlbWF0aWNzIGFuZCBhcHByb3hpbWF0ZWx5IGluCiAgICAgICAgIEMuCiAgICAgICAgIDxicj48YnI+IElmIDxWQVI+eDwvVkFSPiBpcyBuZWdhdGl2ZSwgPENPREU+bG9nPC9DT0RFPiBzaWduYWxzIGEgZG9tYWluIGVycm9yLiAgSWYgPFZBUj54PC9WQVI+CiAgICAgICAgIGlzIHplcm8sIGl0IHJldHVybnMgbmVnYXRpdmUgaW5maW5pdHk7IGlmIDxWQVI+eDwvVkFSPiBpcyB0b28gY2xvc2UgdG8gemVybywKICAgICAgICAgaXQgbWF5IHNpZ25hbCBvdmVyZmxvdy4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGbWF0aC5oeHEAfhH2dAANbG9uZyBkb3VibGUgeHQAC2xvbmcgZG91YmxldAAGbG9nb3V0c3EAfgAKdAE0CiAgICAgICAgVGhpcyBmdW5jdGlvbiBtb2RpZmllcyB0aGUgdXNlciBhY2NvdW50aW5nIGRhdGFiYXNlIHRvIGluZGljYXRlIHRoYXQgdGhlCiAgICAgICAgIHVzZXIgb24gPFZBUj51dF9saW5lPC9WQVI+IGhhcyBsb2dnZWQgb3V0LgogICAgICAgICA8YnI+PGJyPiBUaGUgPENPREU+bG9nb3V0PC9DT0RFPiBmdW5jdGlvbiByZXR1cm5zIDxDT0RFPjE8L0NPREU+IGlmIHRoZSBlbnRyeSB3YXMgc3VjY2Vzc2Z1bGx5CiAgICAgICAgIHdyaXR0ZW4gdG8gdGhlIGRhdGFiYXNlLCBvciA8Q09ERT4wPC9DT0RFPiBvbiBlcnJvci4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGdXRtcC5oeHEAfhH9dAATY29uc3QgY2hhciAqdXRfbGluZXQAA2ludHQAB2xvZ3d0bXBzcQB+AAp0APkKICAgICAgICBUaGUgPENPREU+bG9nd3RtcDwvQ09ERT4gZnVuY3Rpb24gYXBwZW5kcyBhbiBlbnRyeSB0byB0aGUgdXNlciBhY2NvdW50aW5nIGxvZwogICAgICAgICBmaWxlLCBmb3IgdGhlIGN1cnJlbnQgdGltZSBhbmQgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGluIHRoZQogICAgICAgICA8VkFSPnV0X2xpbmU8L1ZBUj4sIDxWQVI+dXRfbmFtZTwvVkFSPiBhbmQgPFZBUj51dF9ob3N0PC9WQVI+IGFyZ3VtZW50cy4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGdXRtcC5oeHEAfhIEdAA9Y29uc3QgY2hhciAqdXRfbGluZSwgY29uc3QgY2hhciAqdXRfbmFtZSwgY29uc3QgY2hhciAqdXRfaG9zdHQABHZvaWR0AAdsb25nam1wc3EAfgAKdAIDCiAgICAgICAgVGhpcyBmdW5jdGlvbiByZXN0b3JlcyBjdXJyZW50IGV4ZWN1dGlvbiB0byB0aGUgc3RhdGUgc2F2ZWQgaW4KICAgICAgICAgPFZBUj5zdGF0ZTwvVkFSPiwgYW5kIGNvbnRpbnVlcyBleGVjdXRpb24gZnJvbSB0aGUgY2FsbCB0byA8Q09ERT5zZXRqbXA8L0NPREU+IHRoYXQKICAgICAgICAgZXN0YWJsaXNoZWQgdGhhdCByZXR1cm4gcG9pbnQuICBSZXR1cm5pbmcgZnJvbSA8Q09ERT5zZXRqbXA8L0NPREU+IGJ5IG1lYW5zIG9mCiAgICAgICAgIDxDT0RFPmxvbmdqbXA8L0NPREU+IHJldHVybnMgdGhlIDxWQVI+dmFsdWU8L1ZBUj4gYXJndW1lbnQgdGhhdCB3YXMgcGFzc2VkIHRvCiAgICAgICAgIDxDT0RFPmxvbmdqbXA8L0NPREU+LCByYXRoZXIgdGhhbiA8Q09ERT4wPC9DT0RFPi4gIChCdXQgaWYgPFZBUj52YWx1ZTwvVkFSPiBpcyBnaXZlbiBhcwogICAgICAgICA8Q09ERT4wPC9DT0RFPiwgPENPREU+c2V0am1wPC9DT0RFPiByZXR1cm5zIDxDT0RFPjE8L0NPREU+KS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc2V0am1wLmh4cQB+Egt0ABhqbXBfYnVmIHN0YXRlLCBpbnQgdmFsdWV0AAR2b2lkdAAHbHJhbmQ0OHNxAH4ACnQBhQogICAgICAgIFRoZSA8Q09ERT5scmFuZDQ4PC9DT0RFPiBmdW5jdGlvbiByZXR1cm5zIGFuIGludGVnZXIgdmFsdWUgaW4gdGhlIHJhbmdlIG9mCiAgICAgICAgIDxDT0RFPjA8L0NPREU+IHRvIDxDT0RFPjJeMzE8L0NPREU+IChleGNsdXNpdmUpLiAgRXZlbiBpZiB0aGUgc2l6ZSBvZiB0aGUgPENPREU+bG9uZwogICAgICAgICBpbnQ8L0NPREU+IHR5cGUgY2FuIHRha2UgbW9yZSB0aGFuIDMyIGJpdHMsIG5vIGhpZ2hlciBudW1iZXJzIGFyZSByZXR1cm5lZC4KICAgICAgICAgVGhlIHJhbmRvbSBiaXRzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBnbG9iYWwgc3RhdGUgb2YgdGhlIHJhbmRvbSBudW1iZXIKICAgICAgICAgZ2VuZXJhdG9yIGluIHRoZSBDIGxpYnJhcnkuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHN0ZGxpYi5oeHEAfhISdAAEdm9pZHQACGxvbmcgaW50dAAJbHJhbmQ0OF9yc3EAfgAKdAHwCiAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIDxDT0RFPmxyYW5kNDg8L0NPREU+LCBidXQgaW4gYWRkaXRpb24gaXQgdGFrZXMgYQogICAgICAgICBwb2ludGVyIHRvIGEgYnVmZmVyIGRlc2NyaWJpbmcgdGhlIHN0YXRlIG9mIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgogICAgICAgICBqdXN0IGxpa2UgPENPREU+ZHJhbmQ0ODwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IElmIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9uIGlzIG5vbi1uZWdhdGl2ZSB0aGUgdmFyaWFibGUgcG9pbnRlZAogICAgICAgICB0byBieSA8VkFSPnJlc3VsdDwvVkFSPiBjb250YWlucyB0aGUgcmVzdWx0LiAgT3RoZXJ3aXNlIGFuIGVycm9yIG9jY3VycmVkLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIGlzIGEgR05VIGV4dGVuc2lvbiBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHBvcnRhYmxlCiAgICAgICAgIHByb2dyYW1zLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAhzdGRsaWIuaHhxAH4SGXQAK3N0cnVjdCBkcmFuZDQ4X2RhdGEgKmJ1ZmZlciwgZG91YmxlICpyZXN1bHR0AANpbnR0AAVscmludHNxAH4ACnQAlwogICAgICAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUganVzdCBsaWtlIDxDT0RFPnJpbnQ8L0NPREU+LCBidXQgdGhleSByZXR1cm4gYQogICAgICAgICA8Q09ERT5sb25nIGludDwvQ09ERT4gaW5zdGVhZCBvZiBhIGZsb2F0aW5nLXBvaW50IG51bWJlci4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGbWF0aC5oeHEAfhIgdAAIZG91YmxlIHh0AAhsb25nIGludHQABmxyaW50ZnNxAH4ACnQAlwogICAgICAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUganVzdCBsaWtlIDxDT0RFPnJpbnQ8L0NPREU+LCBidXQgdGhleSByZXR1cm4gYQogICAgICAgICA8Q09ERT5sb25nIGludDwvQ09ERT4gaW5zdGVhZCBvZiBhIGZsb2F0aW5nLXBvaW50IG51bWJlci4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGbWF0aC5oeHEAfhIndAAHZmxvYXQgeHQACGxvbmcgaW50dAAGbHJpbnRsc3EAfgAKdACXCiAgICAgICAgVGhlc2UgZnVuY3Rpb25zIGFyZSBqdXN0IGxpa2UgPENPREU+cmludDwvQ09ERT4sIGJ1dCB0aGV5IHJldHVybiBhCiAgICAgICAgIDxDT0RFPmxvbmcgaW50PC9DT0RFPiBpbnN0ZWFkIG9mIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZtYXRoLmh4cQB+Ei50AA1sb25nIGRvdWJsZSB4dAAIbG9uZyBpbnR0AAZscm91bmRzcQB+AAp0AJgKICAgICAgICBUaGVzZSBmdW5jdGlvbnMgYXJlIGp1c3QgbGlrZSA8Q09ERT5yb3VuZDwvQ09ERT4sIGJ1dCB0aGV5IHJldHVybiBhCiAgICAgICAgIDxDT0RFPmxvbmcgaW50PC9DT0RFPiBpbnN0ZWFkIG9mIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZtYXRoLmh4cQB+EjV0AAhkb3VibGUgeHQACGxvbmcgaW50dAAHbHJvdW5kZnNxAH4ACnQAmAogICAgICAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUganVzdCBsaWtlIDxDT0RFPnJvdW5kPC9DT0RFPiwgYnV0IHRoZXkgcmV0dXJuIGEKICAgICAgICAgPENPREU+bG9uZyBpbnQ8L0NPREU+IGluc3RlYWQgb2YgYSBmbG9hdGluZy1wb2ludCBudW1iZXIuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQABm1hdGguaHhxAH4SPHQAB2Zsb2F0IHh0AAhsb25nIGludHQAB2xyb3VuZGxzcQB+AAp0AJgKICAgICAgICBUaGVzZSBmdW5jdGlvbnMgYXJlIGp1c3QgbGlrZSA8Q09ERT5yb3VuZDwvQ09ERT4sIGJ1dCB0aGV5IHJldHVybiBhCiAgICAgICAgIDxDT0RFPmxvbmcgaW50PC9DT0RFPiBpbnN0ZWFkIG9mIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZtYXRoLmh4cQB+EkN0AA1sb25nIGRvdWJsZSB4dAAIbG9uZyBpbnR0AAdsc2VhcmNoc3EAfgAKdAO9CiAgICAgICAgVGhlIDxDT0RFPmxzZWFyY2g8L0NPREU+IGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gdGhlIDxDT0RFPmxmaW5kPC9DT0RFPiBmdW5jdGlvbi4gIEl0CiAgICAgICAgIHNlYXJjaGVzIHRoZSBnaXZlbiBhcnJheSBmb3IgYW4gZWxlbWVudCBhbmQgcmV0dXJucyBpdCBpZiBmb3VuZC4gIFRoZQogICAgICAgICBkaWZmZXJlbmNlIGlzIHRoYXQgaWYgbm8gbWF0Y2hpbmcgZWxlbWVudCBpcyBmb3VuZCB0aGUgPENPREU+bHNlYXJjaDwvQ09ERT4KICAgICAgICAgZnVuY3Rpb24gYWRkcyB0aGUgb2JqZWN0IHBvaW50ZWQgdG8gYnkgPFZBUj5rZXk8L1ZBUj4gKHdpdGggYSBzaXplIG9mCiAgICAgICAgIDxWQVI+c2l6ZTwvVkFSPiBieXRlcykgYXQgdGhlIGVuZCBvZiB0aGUgYXJyYXkgYW5kIGl0IGluY3JlbWVudHMgdGhlIHZhbHVlIG9mCiAgICAgICAgIDxDT0RFPio8VkFSPm5tZW1iPC9WQVI+PC9DT0RFPiB0byByZWZsZWN0IHRoaXMgYWRkaXRpb24uCiAgICAgICAgIDxicj48YnI+IFRoaXMgbWVhbnMgZm9yIHRoZSBjYWxsZXIgdGhhdCBpZiBpdCBpcyBub3Qgc3VyZSB0aGF0IHRoZSBhcnJheSBjb250YWlucwogICAgICAgICB0aGUgZWxlbWVudCBvbmUgaXMgc2VhcmNoaW5nIGZvciB0aGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIGFycmF5CiAgICAgICAgIHN0YXJ0aW5nIGF0IDxWQVI+YmFzZTwvVkFSPiBtdXN0IGhhdmUgcm9vbSBmb3IgYXQgbGVhc3QgPFZBUj5zaXplPC9WQVI+IG1vcmUKICAgICAgICAgYnl0ZXMuICBJZiBvbmUgaXMgc3VyZSB0aGUgZWxlbWVudCBpcyBpbiB0aGUgYXJyYXkgaXQgaXMgYmV0dGVyIHRvIHVzZQogICAgICAgICA8Q09ERT5sZmluZDwvQ09ERT4gc28gaGF2aW5nIG1vcmUgcm9vbSBpbiB0aGUgYXJyYXkgaXMgYWx3YXlzIG5lY2Vzc2FyeSB3aGVuCiAgICAgICAgIGNhbGxpbmcgPENPREU+bHNlYXJjaDwvQ09ERT4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHNlYXJjaC5oeHEAfhJKdABPY29uc3Qgdm9pZCAqa2V5LCB2b2lkICpiYXNlLCBzaXplX3QgKm5tZW1iLCBzaXplX3Qgc2l6ZSwgY29tcGFyaXNvbl9mbl90IGNvbXBhcnQABnZvaWQgKnQABWxzZWVrc3EAfgAKdBFNCiAgICAgICAgVGhlIDxDT0RFPmxzZWVrPC9DT0RFPiBmdW5jdGlvbiBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgZmlsZSBwb3NpdGlvbiBvZiB0aGUKICAgICAgICAgZmlsZSB3aXRoIGRlc2NyaXB0b3IgPFZBUj5maWxlZGVzPC9WQVI+LgogICAgICAgICA8YnI+PGJyPiBUaGUgPFZBUj53aGVuY2U8L1ZBUj4gYXJndW1lbnQgc3BlY2lmaWVzIGhvdyB0aGUgPFZBUj5vZmZzZXQ8L1ZBUj4gc2hvdWxkIGJlCiAgICAgICAgIGludGVycHJldGVkLCBpbiB0aGUgc2FtZSB3YXkgYXMgZm9yIHRoZSA8Q09ERT5mc2VlazwvQ09ERT4gZnVuY3Rpb24sIGFuZCBpdCBtdXN0CiAgICAgICAgIGJlIG9uZSBvZiB0aGUgc3ltYm9saWMgY29uc3RhbnRzIDxDT0RFPlNFRUtfU0VUPC9DT0RFPiwgPENPREU+U0VFS19DVVI8L0NPREU+LCBvcgogICAgICAgICA8Q09ERT5TRUVLX0VORDwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IDxETD4KCiAgICAgICAgIDxEVD48Q09ERT5TRUVLX1NFVDwvQ09ERT4KPEREPgogICAgICAgICBTcGVjaWZpZXMgdGhhdCA8VkFSPndoZW5jZTwvVkFSPiBpcyBhIGNvdW50IG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgYmVnaW5uaW5nCiAgICAgICAgIG9mIHRoZSBmaWxlLgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+U0VFS19DVVI8L0NPREU+CjxERD4KICAgICAgICAgU3BlY2lmaWVzIHRoYXQgPFZBUj53aGVuY2U8L1ZBUj4gaXMgYSBjb3VudCBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGN1cnJlbnQKICAgICAgICAgZmlsZSBwb3NpdGlvbi4gIFRoaXMgY291bnQgbWF5IGJlIHBvc2l0aXZlIG9yIG5lZ2F0aXZlLgogICAgICAgICA8YnI+PGJyPiA8TEk+IFNFRUtfRU5ECiAgICAgICAgIFNwZWNpZmllcyB0aGF0IDxWQVI+d2hlbmNlPC9WQVI+IGlzIGEgY291bnQgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBlbmQgb2YKICAgICAgICAgdGhlIGZpbGUuICBBIG5lZ2F0aXZlIGNvdW50IHNwZWNpZmllcyBhIHBvc2l0aW9uIHdpdGhpbiB0aGUgY3VycmVudAogICAgICAgICBleHRlbnQgb2YgdGhlIGZpbGU7IGEgcG9zaXRpdmUgY291bnQgc3BlY2lmaWVzIGEgcG9zaXRpb24gcGFzdCB0aGUKICAgICAgICAgY3VycmVudCBlbmQuICBJZiB5b3Ugc2V0IHRoZSBwb3NpdGlvbiBwYXN0IHRoZSBjdXJyZW50IGVuZCwgYW5kCiAgICAgICAgIGFjdHVhbGx5IHdyaXRlIGRhdGEsIHlvdSB3aWxsIGV4dGVuZCB0aGUgZmlsZSB3aXRoIHplcm9zIHVwIHRvIHRoYXQKICAgICAgICAgcG9zaXRpb24uCgogICAgICAgICA8YnI+PGJyPiBUaGUgcmV0dXJuIHZhbHVlIGZyb20gPENPREU+bHNlZWs8L0NPREU+IGlzIG5vcm1hbGx5IHRoZSByZXN1bHRpbmcgZmlsZQogICAgICAgICBwb3NpdGlvbiwgbWVhc3VyZWQgaW4gYnl0ZXMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLgogICAgICAgICBZb3UgY2FuIHVzZSB0aGlzIGZlYXR1cmUgdG9nZXRoZXIgd2l0aCA8Q09ERT5TRUVLX0NVUjwvQ09ERT4gdG8gcmVhZCB0aGUKICAgICAgICAgY3VycmVudCBmaWxlIHBvc2l0aW9uLgogICAgICAgICA8YnI+PGJyPiBJZiB5b3Ugd2FudCB0byBhcHBlbmQgdG8gdGhlIGZpbGUsIHNldHRpbmcgdGhlIGZpbGUgcG9zaXRpb24gdG8gdGhlCiAgICAgICAgIGN1cnJlbnQgZW5kIG9mIGZpbGUgd2l0aCA8Q09ERT5TRUVLX0VORDwvQ09ERT4gaXMgbm90IHN1ZmZpY2llbnQuICBBbm90aGVyCiAgICAgICAgIHByb2Nlc3MgbWF5IHdyaXRlIG1vcmUgZGF0YSBhZnRlciB5b3Ugc2VlayBidXQgYmVmb3JlIHlvdSB3cml0ZSwKICAgICAgICAgZXh0ZW5kaW5nIHRoZSBmaWxlIHNvIHRoZSBwb3NpdGlvbiB5b3Ugd3JpdGUgb250byBjbG9iYmVycyB0aGVpciBkYXRhLgogICAgICAgICBJbnN0ZWFkLCB1c2UgdGhlIDxDT0RFPk9fQVBQRU5EPC9DT0RFPiBvcGVyYXRpbmcgbW9kZTsgLgogICAgICAgICA8YnI+PGJyPiBZb3UgY2FuIHNldCB0aGUgZmlsZSBwb3NpdGlvbiBwYXN0IHRoZSBjdXJyZW50IGVuZCBvZiB0aGUgZmlsZS4gIFRoaXMKICAgICAgICAgZG9lcyBub3QgYnkgaXRzZWxmIG1ha2UgdGhlIGZpbGUgbG9uZ2VyOyA8Q09ERT5sc2VlazwvQ09ERT4gbmV2ZXIgY2hhbmdlcyB0aGUKICAgICAgICAgZmlsZS4gIEJ1dCBzdWJzZXF1ZW50IG91dHB1dCBhdCB0aGF0IHBvc2l0aW9uIHdpbGwgZXh0ZW5kIHRoZSBmaWxlLgogICAgICAgICBDaGFyYWN0ZXJzIGJldHdlZW4gdGhlIHByZXZpb3VzIGVuZCBvZiBmaWxlIGFuZCB0aGUgbmV3IHBvc2l0aW9uIGFyZQogICAgICAgICBmaWxsZWQgd2l0aCB6ZXJvcy4gIEV4dGVuZGluZyB0aGUgZmlsZSBpbiB0aGlzIHdheSBjYW4gY3JlYXRlIGEKICAgICAgICAgYGBob2xlJyc6IHRoZSBibG9ja3Mgb2YgemVyb3MgYXJlIG5vdCBhY3R1YWxseSBhbGxvY2F0ZWQgb24gZGlzaywgc28gdGhlCiAgICAgICAgIGZpbGUgdGFrZXMgdXAgbGVzcyBzcGFjZSB0aGFuIGl0IGFwcGVhcnMgdG87IGl0IGlzIHRoZW4gY2FsbGVkIGEKICAgICAgICAgYGBzcGFyc2UgZmlsZScnLgogICAgICAgICAgZmlsZXMKICAgICAgICAgIGluIGZpbGVzCiAgICAgICAgIDxicj48YnI+IElmIHRoZSBmaWxlIHBvc2l0aW9uIGNhbm5vdCBiZSBjaGFuZ2VkLCBvciB0aGUgb3BlcmF0aW9uIGlzIGluIHNvbWUgd2F5CiAgICAgICAgIGludmFsaWQsIDxDT0RFPmxzZWVrPC9DT0RFPiByZXR1cm5zIGEgdmFsdWUgb2YgLTEuICBUaGUgZm9sbG93aW5nCiAgICAgICAgIDxDT0RFPmVycm5vPC9DT0RFPiBlcnJvciBjb25kaXRpb25zIGFyZSBkZWZpbmVkIGZvciB0aGlzIGZ1bmN0aW9uOgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8TEk+IEVCQURGCiAgICAgICAgIFRoZSA8VkFSPmZpbGVkZXM8L1ZBUj4gaXMgbm90IGEgdmFsaWQgZmlsZSBkZXNjcmlwdG9yLgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVJTlZBTAogICAgICAgICBUaGUgPFZBUj53aGVuY2U8L1ZBUj4gYXJndW1lbnQgdmFsdWUgaXMgbm90IHZhbGlkLCBvciB0aGUgcmVzdWx0aW5nCiAgICAgICAgIGZpbGUgb2Zmc2V0IGlzIG5vdCB2YWxpZC4gIEEgZmlsZSBvZmZzZXQgaXMgaW52YWxpZC4KICAgICAgICAgPGJyPjxicj4gPExJPiBFU1BJUEUKICAgICAgICAgVGhlIDxWQVI+ZmlsZWRlczwvVkFSPiBjb3JyZXNwb25kcyB0byBhbiBvYmplY3QgdGhhdCBjYW5ub3QgYmUgcG9zaXRpb25lZCwKICAgICAgICAgc3VjaCBhcyBhIHBpcGUsIEZJRk8gb3IgdGVybWluYWwgZGV2aWNlLiAgKFBPU0lYLjEgc3BlY2lmaWVzIHRoaXMgZXJyb3IKICAgICAgICAgb25seSBmb3IgcGlwZXMgYW5kIEZJRk9zLCBidXQgaW4gdGhlIEdOVSBzeXN0ZW0sIHlvdSBhbHdheXMgZ2V0CiAgICAgICAgIDxDT0RFPkVTUElQRTwvQ09ERT4gaWYgdGhlIG9iamVjdCBpcyBub3Qgc2Vla2FibGUuKQoKICAgICAgICAgPGJyPjxicj4gV2hlbiB0aGUgc291cmNlIGZpbGUgaXMgY29tcGlsZWQgd2l0aCA8Q09ERT5fRklMRV9PRkZTRVRfQklUUyA9PSA2NDwvQ09ERT4gdGhlCiAgICAgICAgIDxDT0RFPmxzZWVrPC9DT0RFPiBmdW5jdGlvbiBpcyBpbiBmYWN0IDxDT0RFPmxzZWVrNjQ8L0NPREU+IGFuZCB0aGUgdHlwZQogICAgICAgICA8Q09ERT5vZmZfdDwvQ09ERT4gaGFzIDY0IGJpdHMgd2hpY2ggbWFrZXMgaXQgcG9zc2libGUgdG8gaGFuZGxlIGZpbGVzIHVwIHRvCiAgICAgICAgIDJeNjMgYnl0ZXMgaW4gbGVuZ3RoLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGluIG11bHRpLXRocmVhZGVkIHByb2dyYW1zLiAgVGhpcwogICAgICAgICBpcyBhIHByb2JsZW0gaWYgdGhlIHRocmVhZCBhbGxvY2F0ZXMgc29tZSByZXNvdXJjZXMgKGxpa2UgbWVtb3J5LCBmaWxlCiAgICAgICAgIGRlc2NyaXB0b3JzLCBzZW1hcGhvcmVzIG9yIHdoYXRldmVyKSBhdCB0aGUgdGltZSA8Q09ERT5sc2VlazwvQ09ERT4gaXMKICAgICAgICAgY2FsbGVkLiAgSWYgdGhlIHRocmVhZCBnZXRzIGNhbmNlbGVkIHRoZXNlIHJlc291cmNlcyBzdGF5IGFsbG9jYXRlZAogICAgICAgICB1bnRpbCB0aGUgcHJvZ3JhbSBlbmRzLiAgVG8gYXZvaWQgdGhpcyBjYWxscyB0byA8Q09ERT5sc2VlazwvQ09ERT4gc2hvdWxkIGJlCiAgICAgICAgIHByb3RlY3RlZCB1c2luZyBjYW5jZWxsYXRpb24gaGFuZGxlcnMuCiAgICAgICAgIDxicj48YnI+IFRoZSA8Q09ERT5sc2VlazwvQ09ERT4gZnVuY3Rpb24gaXMgdGhlIHVuZGVybHlpbmcgcHJpbWl0aXZlIGZvciB0aGUKICAgICAgICAgPENPREU+ZnNlZWs8L0NPREU+LCA8Q09ERT5mc2Vla288L0NPREU+LCA8Q09ERT5mdGVsbDwvQ09ERT4sIDxDT0RFPmZ0ZWxsbzwvQ09ERT4gYW5kCiAgICAgICAgIDxDT0RFPnJld2luZDwvQ09ERT4gZnVuY3Rpb25zLCB3aGljaCBvcGVyYXRlIG9uIHN0cmVhbXMgaW5zdGVhZCBvZiBmaWxlCiAgICAgICAgIGRlc2NyaXB0b3JzLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAh1bmlzdGQuaHhxAH4SUXQAJWludCBmaWxlZGVzLCBvZmZfdCBvZmZzZXQsIGludCB3aGVuY2V0AAVvZmZfdHQAB2xzZWVrNjRzcQB+AAp0AzMKICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gdGhlIDxDT0RFPmxzZWVrPC9DT0RFPiBmdW5jdGlvbi4gIFRoZSBkaWZmZXJlbmNlCiAgICAgICAgIGlzIHRoYXQgdGhlIDxWQVI+b2Zmc2V0PC9WQVI+IHBhcmFtZXRlciBpcyBvZiB0eXBlIDxDT0RFPm9mZjY0X3Q8L0NPREU+IGluc3RlYWQgb2YKICAgICAgICAgPENPREU+b2ZmX3Q8L0NPREU+IHdoaWNoIG1ha2VzIGl0IHBvc3NpYmxlIG9uIDMyIGJpdCBtYWNoaW5lcyB0byBhZGRyZXNzCiAgICAgICAgIGZpbGVzIGxhcmdlciB0aGFuIDJeMzEgYnl0ZXMgYW5kIHVwIHRvIDJeNjMgYnl0ZXMuICBUaGUKICAgICAgICAgZmlsZSBkZXNjcmlwdG9yIDxDT0RFPmZpbGVkZXM8L0NPREU+IG11c3QgYmUgb3BlbmVkIHVzaW5nIDxDT0RFPm9wZW42NDwvQ09ERT4gc2luY2UKICAgICAgICAgb3RoZXJ3aXNlIHRoZSBsYXJnZSBvZmZzZXRzIHBvc3NpYmxlIHdpdGggPENPREU+b2ZmNjRfdDwvQ09ERT4gd2lsbCBsZWFkIHRvCiAgICAgICAgIGVycm9ycyB3aXRoIGEgZGVzY3JpcHRvciBpbiBzbWFsbCBmaWxlIG1vZGUuCiAgICAgICAgIDxicj48YnI+IFdoZW4gdGhlIHNvdXJjZSBmaWxlIGlzIGNvbXBpbGVkIHdpdGggPENPREU+X0ZJTEVfT0ZGU0VUX0JJVFMgPT0gNjQ8L0NPREU+IG9uIGEKICAgICAgICAgMzIgYml0cyBtYWNoaW5lIHRoaXMgZnVuY3Rpb24gaXMgYWN0dWFsbHkgYXZhaWxhYmxlIHVuZGVyIHRoZSBuYW1lCiAgICAgICAgIDxDT0RFPmxzZWVrPC9DT0RFPiBhbmQgc28gdHJhbnNwYXJlbnRseSByZXBsYWNlcyB0aGUgMzIgYml0IGludGVyZmFjZS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIdW5pc3RkLmh4cQB+Elh0ACdpbnQgZmlsZWRlcywgb2ZmNjRfdCBvZmZzZXQsIGludCB3aGVuY2V0AAdvZmY2NF90dAAFbHN0YXRzcQB+AAp0Ai4KICAgICAgICBUaGUgPENPREU+bHN0YXQ8L0NPREU+IGZ1bmN0aW9uIGlzIGxpa2UgPENPREU+c3RhdDwvQ09ERT4sIGV4Y2VwdCB0aGF0IGl0IGRvZXMgbm90CiAgICAgICAgIGZvbGxvdyBzeW1ib2xpYyBsaW5rcy4gIElmIDxWQVI+ZmlsZW5hbWU8L1ZBUj4gaXMgdGhlIG5hbWUgb2YgYSBzeW1ib2xpYwogICAgICAgICBsaW5rLCA8Q09ERT5sc3RhdDwvQ09ERT4gcmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbGluayBpdHNlbGY7IG90aGVyd2lzZQogICAgICAgICA8Q09ERT5sc3RhdDwvQ09ERT4gd29ya3MgbGlrZSA8Q09ERT5zdGF0PC9DT0RFPi4gIC4KICAgICAgICAgPGJyPjxicj4gV2hlbiB0aGUgc291cmNlcyBhcmUgY29tcGlsZWQgd2l0aCA8Q09ERT5fRklMRV9PRkZTRVRfQklUUyA9PSA2NDwvQ09ERT4gdGhpcwogICAgICAgICBmdW5jdGlvbiBpcyBpbiBmYWN0IDxDT0RFPmxzdGF0NjQ8L0NPREU+IHNpbmNlIHRoZSBMRlMgaW50ZXJmYWNlIHRyYW5zcGFyZW50bHkKICAgICAgICAgcmVwbGFjZXMgdGhlIG5vcm1hbCBpbXBsZW1lbnRhdGlvbi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAKc3lzL3N0YXQuaHhxAH4SX3QAJmNvbnN0IGNoYXIgKmZpbGVuYW1lLCBzdHJ1Y3Qgc3RhdCAqYnVmdAADaW50dAAHbHN0YXQ2NHNxAH4ACnQCJAogICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byA8Q09ERT5sc3RhdDwvQ09ERT4gYnV0IGl0IGlzIGFsc28gYWJsZSB0byB3b3JrIG9uCiAgICAgICAgIGZpbGVzIGxhcmdlciB0aGVuIDJeMzEgYnl0ZXMgb24gMzItYml0IHN5c3RlbXMuICBUbyBiZSBhYmxlIHRvIGRvCiAgICAgICAgIHRoaXMgdGhlIHJlc3VsdCBpcyBzdG9yZWQgaW4gYSB2YXJpYWJsZSBvZiB0eXBlIDxDT0RFPnN0cnVjdCBzdGF0NjQ8L0NPREU+IHRvCiAgICAgICAgIHdoaWNoIDxWQVI+YnVmPC9WQVI+IG11c3QgcG9pbnQuCiAgICAgICAgIDxicj48YnI+IFdoZW4gdGhlIHNvdXJjZXMgYXJlIGNvbXBpbGVkIHdpdGggPENPREU+X0ZJTEVfT0ZGU0VUX0JJVFMgPT0gNjQ8L0NPREU+IHRoaXMKICAgICAgICAgZnVuY3Rpb24gaXMgYXZhaWxhYmxlIHVuZGVyIHRoZSBuYW1lIDxDT0RFPmxzdGF0PC9DT0RFPiBhbmQgc28gdHJhbnNwYXJlbnRseQogICAgICAgICByZXBsYWNlcyB0aGUgaW50ZXJmYWNlIGZvciBzbWFsbCBmaWxlcyBvbiAzMi1iaXQgbWFjaGluZXMuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACnN5cy9zdGF0Lmh4cQB+EmZ0AChjb25zdCBjaGFyICpmaWxlbmFtZSwgc3RydWN0IHN0YXQ2NCAqYnVmdAADaW50dAAHbHV0aW1lc3NxAH4ACnQC2AogICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSA8Q09ERT51dGltZXM8L0NPREU+LCBleGNlcHQgdGhhdCBpdCBkb2VzIG5vdCBmb2xsb3cKICAgICAgICAgc3ltYm9saWMgbGlua3MuICBJZiA8VkFSPmZpbGVuYW1lPC9WQVI+IGlzIHRoZSBuYW1lIG9mIGEgc3ltYm9saWMgbGluaywKICAgICAgICAgPENPREU+bHV0aW1lczwvQ09ERT4gc2V0cyB0aGUgZmlsZSBhY2Nlc3MgYW5kIG1vZGlmaWNhdGlvbiB0aW1lcyBvZiB0aGUKICAgICAgICAgc3ltYm9saWMgbGluayBzcGVjaWFsIGZpbGUgaXRzZWxmIChhcyBzZWVuIGJ5IDxDT0RFPmxzdGF0PC9DT0RFPjsKICAgICAgICAgKSB3aGlsZSA8Q09ERT51dGltZXM8L0NPREU+IHNldHMgdGhlIGZpbGUgYWNjZXNzIGFuZAogICAgICAgICBtb2RpZmljYXRpb24gdGltZXMgb2YgdGhlIGZpbGUgdGhlIHN5bWJvbGljIGxpbmsgcmVmZXJzIHRvLiAgVGhpcwogICAgICAgICBmdW5jdGlvbiBjb21lcyBmcm9tIEZyZWVCU0QsIGFuZCBpcyBub3QgYXZhaWxhYmxlIG9uIGFsbCBwbGF0Zm9ybXMgKGlmCiAgICAgICAgIG5vdCBhdmFpbGFibGUsIGl0IHdpbGwgZmFpbCB3aXRoIDxDT0RFPkVOT1NZUzwvQ09ERT4pLgogICAgICAgICA8YnI+PGJyPiBUaGUgcmV0dXJuIHZhbHVlcyBhbmQgZXJyb3IgY29uZGl0aW9ucyBhcmUgdGhlIHNhbWUgYXMgZm9yIHRoZSA8Q09ERT51dGltZTwvQ09ERT4KICAgICAgICAgZnVuY3Rpb24uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACnN5cy90aW1lLmh4cQB+Em10ACtjb25zdCBjaGFyICpmaWxlbmFtZSwgc3RydWN0IHRpbWV2YWwgdHZwWzJddAADaW50dAAHbWFkdmlzZXNxAH4ACnQJEwogICAgICAgIDxicj48YnI+IFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSB0aGUgc3lzdGVtIHdpdGggPFZBUj5hZHZpY2U8L1ZBUj4gYWJvdXQKICAgICAgICAgdGhlIGludGVuZGVkIHVzYWdlIHBhdHRlcm5zIG9mIHRoZSBtZW1vcnkgcmVnaW9uIHN0YXJ0aW5nIGF0IDxWQVI+YWRkcjwvVkFSPgogICAgICAgICBhbmQgZXh0ZW5kaW5nIDxWQVI+bGVuZ3RoPC9WQVI+IGJ5dGVzLgogICAgICAgICA8YnI+PGJyPiBUaGUgdmFsaWQgQlNEIHZhbHVlcyBmb3IgPFZBUj5hZHZpY2U8L1ZBUj4gYXJlOgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+TUFEVl9OT1JNQUw8L0NPREU+CjxERD4KICAgICAgICAgVGhlIHJlZ2lvbiBzaG91bGQgcmVjZWl2ZSBubyBmdXJ0aGVyIHNwZWNpYWwgdHJlYXRtZW50LgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+TUFEVl9SQU5ET008L0NPREU+CjxERD4KICAgICAgICAgVGhlIHJlZ2lvbiB3aWxsIGJlIGFjY2Vzc2VkIHZpYSByYW5kb20gcGFnZSByZWZlcmVuY2VzLiBUaGUga2VybmVsCiAgICAgICAgIHNob3VsZCBwYWdlLWluIHRoZSBtaW5pbWFsIG51bWJlciBvZiBwYWdlcyBmb3IgZWFjaCBwYWdlIGZhdWx0LgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+TUFEVl9TRVFVRU5USUFMPC9DT0RFPgo8REQ+CiAgICAgICAgIFRoZSByZWdpb24gd2lsbCBiZSBhY2Nlc3NlZCB2aWEgc2VxdWVudGlhbCBwYWdlIHJlZmVyZW5jZXMuIFRoaXMKICAgICAgICAgbWF5IGNhdXNlIHRoZSBrZXJuZWwgdG8gYWdncmVzc2l2ZWx5IHJlYWQtYWhlYWQsIGV4cGVjdGluZyBmdXJ0aGVyCiAgICAgICAgIHNlcXVlbnRpYWwgcmVmZXJlbmNlcyBhZnRlciBhbnkgcGFnZSBmYXVsdCB3aXRoaW4gdGhpcyByZWdpb24uCiAgICAgICAgIDxicj48YnI+IDxMST4gTUFEVl9XSUxMTkVFRAogICAgICAgICBUaGUgcmVnaW9uIHdpbGwgYmUgbmVlZGVkLiAgVGhlIHBhZ2VzIHdpdGhpbiB0aGlzIHJlZ2lvbiBtYXkKICAgICAgICAgYmUgcHJlLWZhdWx0ZWQgaW4gYnkgdGhlIGtlcm5lbC4KICAgICAgICAgPGJyPjxicj4gPExJPiBNQURWX0RPTlRORUVECiAgICAgICAgIFRoZSByZWdpb24gaXMgbm8gbG9uZ2VyIG5lZWRlZC4gIFRoZSBrZXJuZWwgbWF5IGZyZWUgdGhlc2UgcGFnZXMsCiAgICAgICAgIGNhdXNpbmcgYW55IGNoYW5nZXMgdG8gdGhlIHBhZ2VzIHRvIGJlIGxvc3QsIGFzIHdlbGwgYXMgc3dhcHBlZAogICAgICAgICBvdXQgcGFnZXMgdG8gYmUgZGlzY2FyZGVkLgogICAgICAgICA8YnI+PGJyPgogICAgICAgICA8YnI+PGJyPiBUaGUgUE9TSVggbmFtZXMgYXJlIHNsaWdodGx5IGRpZmZlcmVudCwgYnV0IHdpdGggdGhlIHNhbWUgbWVhbmluZ3M6CiAgICAgICAgIDxicj48YnI+IDxETD4KCiAgICAgICAgIDxicj48YnI+IDxMST4gUE9TSVhfTUFEVl9OT1JNQUwKICAgICAgICAgVGhpcyBjb3JyZXNwb25kcyB3aXRoIEJTRCdzIDxDT0RFPk1BRFZfTk9STUFMPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gPExJPiBQT1NJWF9NQURWX1JBTkRPTQogICAgICAgICBUaGlzIGNvcnJlc3BvbmRzIHdpdGggQlNEJ3MgPENPREU+TUFEVl9SQU5ET008L0NPREU+LgogICAgICAgICA8YnI+PGJyPiA8TEk+IFBPU0lYX01BRFZfU0VRVUVOVElBTAogICAgICAgICBUaGlzIGNvcnJlc3BvbmRzIHdpdGggQlNEJ3MgPENPREU+TUFEVl9TRVFVRU5USUFMPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gPExJPiBQT1NJWF9NQURWX1dJTExORUVECiAgICAgICAgIFRoaXMgY29ycmVzcG9uZHMgd2l0aCBCU0QncyA8Q09ERT5NQURWX1dJTExORUVEPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gPExJPiBQT1NJWF9NQURWX0RPTlRORUVECiAgICAgICAgIFRoaXMgY29ycmVzcG9uZHMgd2l0aCBCU0QncyA8Q09ERT5NQURWX0RPTlRORUVEPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4KICAgICAgICAgPGJyPjxicj4gPENPREU+bXN5bmM8L0NPREU+IHJldHVybnMgMCBmb3Igc3VjY2VzcyBhbmQgLTEgZm9yCiAgICAgICAgIGVycm9yLiAgRXJyb3JzIGluY2x1ZGU6CiAgICAgICAgIDxETD4KCiAgICAgICAgIDxicj48YnI+IDxMST4gRUlOVkFMCiAgICAgICAgIEFuIGludmFsaWQgcmVnaW9uIHdhcyBnaXZlbiwgb3IgdGhlIDxWQVI+YWR2aWNlPC9WQVI+IHdhcyBpbnZhbGlkLgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVGQVVMVAogICAgICAgICBUaGVyZSBpcyBubyBleGlzdGluZyBtYXBwaW5nIGluIGF0IGxlYXN0IHBhcnQgb2YgdGhlIGdpdmVuIHJlZ2lvbi4KICAgICAgICAgPGJyPjxicj4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAKc3lzL21tYW4uaHhxAH4SdHQAJXZvaWQgKmFkZHIsIHNpemVfdCBsZW5ndGgsIGludCBhZHZpY2V0AANpbnR0AAttYWtlY29udGV4dHNxAH4ACnQEvgogICAgICAgIDxicj48YnI+IFRoZSA8VkFSPnVjcDwvVkFSPiBwYXJhbWV0ZXIgcGFzc2VkIHRvIHRoZSA8Q09ERT5tYWtlY29udGV4dDwvQ09ERT4gc2hhbGwgYmUKICAgICAgICAgaW5pdGlhbGl6ZWQgYnkgYSBjYWxsIHRvIDxDT0RFPmdldGNvbnRleHQ8L0NPREU+LiAgVGhlIGNvbnRleHQgd2lsbCBiZQogICAgICAgICBtb2RpZmllZCB0byBpbiBhIHdheSBzbyB0aGF0IGlmIHRoZSBjb250ZXh0IGlzIHJlc3VtZWQgaXQgd2lsbCBzdGFydCBieQogICAgICAgICBjYWxsaW5nIHRoZSBmdW5jdGlvbiA8Q09ERT5mdW5jPC9DT0RFPiB3aGljaCBnZXRzIDxWQVI+YXJnYzwvVkFSPiBpbnRlZ2VyIGFyZ3VtZW50cwogICAgICAgICBwYXNzZWQuICBUaGUgaW50ZWdlciBhcmd1bWVudHMgd2hpY2ggYXJlIHRvIGJlIHBhc3NlZCBzaG91bGQgZm9sbG93IHRoZQogICAgICAgICA8VkFSPmFyZ2M8L1ZBUj4gcGFyYW1ldGVyIGluIHRoZSBjYWxsIHRvIDxDT0RFPm1ha2Vjb250ZXh0PC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gQmVmb3JlIHRoZSBjYWxsIHRvIHRoaXMgZnVuY3Rpb24gdGhlIDxDT0RFPnVjX3N0YWNrPC9DT0RFPiBhbmQgPENPREU+dWNfbGluazwvQ09ERT4KICAgICAgICAgZWxlbWVudCBvZiB0aGUgPFZBUj51Y3A8L1ZBUj4gc3RydWN0dXJlIHNob3VsZCBiZSBpbml0aWFsaXplZC4gIFRoZQogICAgICAgICA8Q09ERT51Y19zdGFjazwvQ09ERT4gZWxlbWVudCBkZXNjcmliZXMgdGhlIHN0YWNrIHdoaWNoIGlzIHVzZWQgZm9yIHRoaXMKICAgICAgICAgY29udGV4dC4gIE5vIHR3byBjb250ZXh0cyB3aGljaCBhcmUgdXNlZCBhdCB0aGUgc2FtZSB0aW1lIHNob3VsZCB1c2UgdGhlCiAgICAgICAgIHNhbWUgbWVtb3J5IHJlZ2lvbiBmb3IgYSBzdGFjay4KICAgICAgICAgPGJyPjxicj4gVGhlIDxDT0RFPnVjX2xpbms8L0NPREU+IGVsZW1lbnQgb2YgdGhlIG9iamVjdCBwb2ludGVkIHRvIGJ5IDxWQVI+dWNwPC9WQVI+IHNob3VsZAogICAgICAgICBiZSBhIHBvaW50ZXIgdG8gdGhlIGNvbnRleHQgdG8gYmUgZXhlY3V0ZWQgd2hlbiB0aGUgZnVuY3Rpb24gPFZBUj5mdW5jPC9WQVI+CiAgICAgICAgIHJldHVybnMgb3IgaXQgc2hvdWxkIGJlIGEgbnVsbCBwb2ludGVyLiAgU2VlIDxDT0RFPnNldGNvbnRleHQ8L0NPREU+IGZvciBtb3JlCiAgICAgICAgIGluZm9ybWF0aW9uIGFib3V0IHRoZSBleGFjdCB1c2UuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACnVjb250ZXh0Lmh4cQB+Ent0ADN1Y29udGV4dF90ICp1Y3AsIHZvaWQgKCpmdW5jKSAodm9pZCksIGludCBhcmdjLCAuLi50AAR2b2lkdAAIbWFsbGluZm9zcQB+AAp0AJgKICAgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgZHluYW1pYyBtZW1vcnkgdXNhZ2UKICAgICAgICAgaW4gYSBzdHJ1Y3R1cmUgb2YgdHlwZSA8Q09ERT5zdHJ1Y3QgbWFsbGluZm88L0NPREU+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAhtYWxsb2MuaHhxAH4SgnQABHZvaWR0AA9zdHJ1Y3QgbWFsbGluZm90AAZtYWxsb2NzcQB+AAp0AKgKICAgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIHRvIGEgbmV3bHkgYWxsb2NhdGVkIGJsb2NrIDxWQVI+c2l6ZTwvVkFSPgogICAgICAgICBieXRlcyBsb25nLCBvciBhIG51bGwgcG9pbnRlciBpZiB0aGUgYmxvY2sgY291bGQgbm90IGJlIGFsbG9jYXRlZC4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc3RkbGliLmh4cQB+Eol0AAtzaXplX3Qgc2l6ZXQABnZvaWQgKnQAB21hbGxvcHRzcQB+AAp0B1cKICAgICAgICBXaGVuIGNhbGxpbmcgPENPREU+bWFsbG9wdDwvQ09ERT4sIHRoZSA8VkFSPnBhcmFtPC9WQVI+IGFyZ3VtZW50IHNwZWNpZmllcyB0aGUKICAgICAgICAgcGFyYW1ldGVyIHRvIGJlIHNldCwgYW5kIDxWQVI+dmFsdWU8L1ZBUj4gdGhlIG5ldyB2YWx1ZSB0byBiZSBzZXQuICBQb3NzaWJsZQogICAgICAgICBjaG9pY2VzIGZvciA8VkFSPnBhcmFtPC9WQVI+LCBhcyBkZWZpbmVkIGluIDxUVD5tYWxsb2MuaDwvVFQ+LCBhcmU6CiAgICAgICAgIDxicj48YnI+IDxETD4KCiAgICAgICAgIDxEVD48Q09ERT5NX1RSSU1fVEhSRVNIT0xEPC9DT0RFPgo8REQ+CiAgICAgICAgIFRoaXMgaXMgdGhlIG1pbmltdW0gc2l6ZSAoaW4gYnl0ZXMpIG9mIHRoZSB0b3AtbW9zdCwgcmVsZWFzYWJsZSBjaHVuawogICAgICAgICB0aGF0IHdpbGwgY2F1c2UgPENPREU+c2JyazwvQ09ERT4gdG8gYmUgY2FsbGVkIHdpdGggYSBuZWdhdGl2ZSBhcmd1bWVudCBpbgogICAgICAgICBvcmRlciB0byByZXR1cm4gbWVtb3J5IHRvIHRoZSBzeXN0ZW0uCiAgICAgICAgIDxMST4gTV9UT1BfUEFECiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGRldGVybWluZXMgdGhlIGFtb3VudCBvZiBleHRyYSBtZW1vcnkgdG8gb2J0YWluIGZyb20gdGhlCiAgICAgICAgIHN5c3RlbSB3aGVuIGEgY2FsbCB0byA8Q09ERT5zYnJrPC9DT0RFPiBpcyByZXF1aXJlZC4gIEl0IGFsc28gc3BlY2lmaWVzIHRoZQogICAgICAgICBudW1iZXIgb2YgYnl0ZXMgdG8gcmV0YWluIHdoZW4gc2hyaW5raW5nIHRoZSBoZWFwIGJ5IGNhbGxpbmcgPENPREU+c2JyazwvQ09ERT4KICAgICAgICAgd2l0aCBhIG5lZ2F0aXZlIGFyZ3VtZW50LiAgVGhpcyBwcm92aWRlcyB0aGUgbmVjZXNzYXJ5IGh5c3RlcmVzaXMgaW4KICAgICAgICAgaGVhcCBzaXplIHN1Y2ggdGhhdCBleGNlc3NpdmUgYW1vdW50cyBvZiBzeXN0ZW0gY2FsbHMgY2FuIGJlIGF2b2lkZWQuCiAgICAgICAgIDxMST4gTV9NTUFQX1RIUkVTSE9MRAogICAgICAgICBBbGwgY2h1bmtzIGxhcmdlciB0aGFuIHRoaXMgdmFsdWUgYXJlIGFsbG9jYXRlZCBvdXRzaWRlIHRoZSBub3JtYWwKICAgICAgICAgaGVhcCwgdXNpbmcgdGhlIDxDT0RFPm1tYXA8L0NPREU+IHN5c3RlbSBjYWxsLiAgVGhpcyB3YXkgaXQgaXMgZ3VhcmFudGVlZAogICAgICAgICB0aGF0IHRoZSBtZW1vcnkgZm9yIHRoZXNlIGNodW5rcyBjYW4gYmUgcmV0dXJuZWQgdG8gdGhlIHN5c3RlbSBvbgogICAgICAgICA8Q09ERT5mcmVlPC9DT0RFPi4gIE5vdGUgdGhhdCByZXF1ZXN0cyBzbWFsbGVyIHRoYW4gdGhpcyB0aHJlc2hvbGQgbWlnaHQgc3RpbGwKICAgICAgICAgYmUgYWxsb2NhdGVkIHZpYSA8Q09ERT5tbWFwPC9DT0RFPi4KICAgICAgICAgPExJPiBNX01NQVBfTUFYCiAgICAgICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjaHVua3MgdG8gYWxsb2NhdGUgd2l0aCA8Q09ERT5tbWFwPC9DT0RFPi4gIFNldHRpbmcgdGhpcwogICAgICAgICB0byB6ZXJvIGRpc2FibGVzIGFsbCB1c2Ugb2YgPENPREU+bW1hcDwvQ09ERT4uCiAgICAgICAgIDxMST4gTV9QRVJUVVJCCiAgICAgICAgIElmIG5vbi16ZXJvLCBtZW1vcnkgYmxvY2tzIGFyZSBmaWxsZWQgd2l0aCB2YWx1ZXMgZGVwZW5kaW5nIG9uIHNvbWUKICAgICAgICAgbG93IG9yZGVyIGJpdHMgb2YgdGhpcyBwYXJhbWV0ZXIgd2hlbiB0aGV5IGFyZSBhbGxvY2F0ZWQgKGV4Y2VwdCB3aGVuCiAgICAgICAgIGFsbG9jYXRlZCBieSA8Q09ERT5jYWxsb2M8L0NPREU+KSBhbmQgZnJlZWQuICBUaGlzIGNhbiBiZSB1c2VkIHRvIGRlYnVnIHRoZQogICAgICAgICB1c2Ugb2YgdW5pbml0aWFsaXplZCBvciBmcmVlZCBoZWFwIG1lbW9yeS4KCiAgICAgICAgIDxicj48YnI+CiAgICAgICAgc3EAfgAPAAAAAHcEAAAAAHhxAH4SkHQAFGludCBwYXJhbSwgaW50IHZhbHVldAADaW50dAAFbWJsZW5zcQB+AAp0BfsKICAgICAgICBUaGUgPENPREU+bWJsZW48L0NPREU+IGZ1bmN0aW9uIHdpdGggYSBub24tbnVsbCA8VkFSPnN0cmluZzwvVkFSPiBhcmd1bWVudCByZXR1cm5zCiAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBtYWtlIHVwIHRoZSBtdWx0aWJ5dGUgY2hhcmFjdGVyIGJlZ2lubmluZyBhdAogICAgICAgICA8VkFSPnN0cmluZzwvVkFSPiwgbmV2ZXIgZXhhbWluaW5nIG1vcmUgdGhhbiA8VkFSPnNpemU8L1ZBUj4gYnl0ZXMuICAoVGhlIGlkZWEgaXMKICAgICAgICAgdG8gc3VwcGx5IGZvciA8VkFSPnNpemU8L1ZBUj4gdGhlIG51bWJlciBvZiBieXRlcyBvZiBkYXRhIHlvdSBoYXZlIGluIGhhbmQuKQogICAgICAgICA8YnI+PGJyPiBUaGUgcmV0dXJuIHZhbHVlIG9mIDxDT0RFPm1ibGVuPC9DT0RFPiBkaXN0aW5ndWlzaGVzIHRocmVlIHBvc3NpYmlsaXRpZXM6IHRoZQogICAgICAgICBmaXJzdCA8VkFSPnNpemU8L1ZBUj4gYnl0ZXMgYXQgPFZBUj5zdHJpbmc8L1ZBUj4gc3RhcnQgd2l0aCB2YWxpZCBtdWx0aWJ5dGUKICAgICAgICAgY2hhcmFjdGVycywgdGhleSBzdGFydCB3aXRoIGFuIGludmFsaWQgYnl0ZSBzZXF1ZW5jZSBvciBqdXN0IHBhcnQgb2YgYQogICAgICAgICBjaGFyYWN0ZXIsIG9yIDxWQVI+c3RyaW5nPC9WQVI+IHBvaW50cyB0byBhbiBlbXB0eSBzdHJpbmcgKGEgbnVsbCBjaGFyYWN0ZXIpLgogICAgICAgICA8YnI+PGJyPiBGb3IgYSB2YWxpZCBtdWx0aWJ5dGUgY2hhcmFjdGVyLCA8Q09ERT5tYmxlbjwvQ09ERT4gcmV0dXJucyB0aGUgbnVtYmVyIG9mCiAgICAgICAgIGJ5dGVzIGluIHRoYXQgY2hhcmFjdGVyIChhbHdheXMgYXQgbGVhc3QgPENPREU+MTwvQ09ERT4gYW5kIG5ldmVyIG1vcmUgdGhhbgogICAgICAgICA8VkFSPnNpemU8L1ZBUj4pLiAgRm9yIGFuIGludmFsaWQgYnl0ZSBzZXF1ZW5jZSwgPENPREU+bWJsZW48L0NPREU+IHJldHVybnMKICAgICAgICAgLTEuICBGb3IgYW4gZW1wdHkgc3RyaW5nLCBpdCByZXR1cm5zIDAuCiAgICAgICAgIDxicj48YnI+IElmIHRoZSBtdWx0aWJ5dGUgY2hhcmFjdGVyIGNvZGUgdXNlcyBzaGlmdCBjaGFyYWN0ZXJzLCB0aGVuIDxDT0RFPm1ibGVuPC9DT0RFPgogICAgICAgICBtYWludGFpbnMgYW5kIHVwZGF0ZXMgYSBzaGlmdCBzdGF0ZSBhcyBpdCBzY2Fucy4gIElmIHlvdSBjYWxsCiAgICAgICAgIDxDT0RFPm1ibGVuPC9DT0RFPiB3aXRoIGEgbnVsbCBwb2ludGVyIGZvciA8VkFSPnN0cmluZzwvVkFSPiwgdGhhdCBpbml0aWFsaXplcyB0aGUKICAgICAgICAgc2hpZnQgc3RhdGUgdG8gaXRzIHN0YW5kYXJkIGluaXRpYWwgdmFsdWUuICBJdCBhbHNvIHJldHVybnMgYSBub256ZXJvCiAgICAgICAgIHZhbHVlIGlmIHRoZSBtdWx0aWJ5dGUgY2hhcmFjdGVyIGNvZGUgaW4gdXNlIGFjdHVhbGx5IGhhcyBhIHNoaWZ0IHN0YXRlLgogICAgICAgICAuCiAgICAgICAgIDxicj48YnI+IFRoZSBmdW5jdGlvbiA8Q09ERT5tYmxlbjwvQ09ERT4gaXMgZGVjbGFyZWQgaW4gPFRUPnN0ZGxpYi5oPC9UVD4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHN0ZGxpYi5oeHEAfhKWdAAfY29uc3QgY2hhciAqc3RyaW5nLCBzaXplX3Qgc2l6ZXQAA2ludHQABm1icmxlbnNxAH4ACnQEpQogICAgICAgIFRoZSA8Q09ERT5tYnJsZW48L0NPREU+IGZ1bmN0aW9uIChgYG11bHRpYnl0ZSByZXN0YXJ0YWJsZSBsZW5ndGgnJykgY29tcHV0ZXMKICAgICAgICAgdGhlIG51bWJlciBvZiBhdCBtb3N0IDxWQVI+bjwvVkFSPiBieXRlcyBzdGFydGluZyBhdCA8VkFSPnM8L1ZBUj4sIHdoaWNoIGZvcm0gdGhlCiAgICAgICAgIG5leHQgdmFsaWQgYW5kIGNvbXBsZXRlIG11bHRpYnl0ZSBjaGFyYWN0ZXIuCiAgICAgICAgIDxicj48YnI+IElmIHRoZSBuZXh0IG11bHRpYnl0ZSBjaGFyYWN0ZXIgY29ycmVzcG9uZHMgdG8gdGhlIE5VTCB3aWRlIGNoYXJhY3RlciwKICAgICAgICAgdGhlIHJldHVybiB2YWx1ZSBpcyAwLiAgSWYgdGhlIG5leHQgPFZBUj5uPC9WQVI+IGJ5dGVzIGZvcm0gYSB2YWxpZAogICAgICAgICBtdWx0aWJ5dGUgY2hhcmFjdGVyLCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGJlbG9uZ2luZyB0byB0aGlzIG11bHRpYnl0ZQogICAgICAgICBjaGFyYWN0ZXIgYnl0ZSBzZXF1ZW5jZSBpcyByZXR1cm5lZC4KICAgICAgICAgPGJyPjxicj4gSWYgdGhlIGZpcnN0IDxWQVI+bjwvVkFSPiBieXRlcyBwb3NzaWJseSBmb3JtIGEgdmFsaWQgbXVsdGlieXRlCiAgICAgICAgIGNoYXJhY3RlciBidXQgdGhlIGNoYXJhY3RlciBpcyBpbmNvbXBsZXRlLCB0aGUgcmV0dXJuIHZhbHVlIGlzCiAgICAgICAgIDxDT0RFPihzaXplX3QpIC0yPC9DT0RFPi4gIE90aGVyd2lzZSB0aGUgbXVsdGlieXRlIGNoYXJhY3RlciBzZXF1ZW5jZSBpcyBpbnZhbGlkCiAgICAgICAgIGFuZCB0aGUgcmV0dXJuIHZhbHVlIGlzIDxDT0RFPihzaXplX3QpIC0xPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gVGhlIG11bHRpYnl0ZSBzZXF1ZW5jZSBpcyBpbnRlcnByZXRlZCBpbiB0aGUgc3RhdGUgcmVwcmVzZW50ZWQgYnkgdGhlCiAgICAgICAgIG9iamVjdCBwb2ludGVkIHRvIGJ5IDxWQVI+cHM8L1ZBUj4uICBJZiA8VkFSPnBzPC9WQVI+IGlzIGEgbnVsbCBwb2ludGVyLCBhIHN0YXRlCiAgICAgICAgIG9iamVjdCBsb2NhbCB0byA8Q09ERT5tYnJsZW48L0NPREU+IGlzIHVzZWQuCiAgICAgICAgIDxicj48YnI+IDxDT0RFPm1icmxlbjwvQ09ERT4gd2FzIGludHJvZHVjZWQgaW4gQW1lbmRtZW50IDEgdG8gSVNPIEM5MCBhbmQKICAgICAgICAgaXMgZGVjbGFyZWQgaW4gPFRUPndjaGFyLmg8L1RUPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHd2NoYXIuaHhxAH4SnXQAL2NvbnN0IGNoYXIgKnJlc3RyaWN0IHMsIHNpemVfdCBuLCBtYnN0YXRlX3QgKnBzdAAGc2l6ZV90dAAHbWJydG93Y3NxAH4ACnQJiQoKICAgICAgICAgVGhlIDxDT0RFPm1icnRvd2M8L0NPREU+IGZ1bmN0aW9uIChgYG11bHRpYnl0ZSByZXN0YXJ0YWJsZSB0byB3aWRlCiAgICAgICAgIGNoYXJhY3RlcicnKSBjb252ZXJ0cyB0aGUgbmV4dCBtdWx0aWJ5dGUgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcgcG9pbnRlZAogICAgICAgICB0byBieSA8VkFSPnM8L1ZBUj4gaW50byBhIHdpZGUgY2hhcmFjdGVyIGFuZCBzdG9yZXMgaXQgaW4gdGhlIHdpZGUgY2hhcmFjdGVyCiAgICAgICAgIHN0cmluZyBwb2ludGVkIHRvIGJ5IDxWQVI+cHdjPC9WQVI+LiAgVGhlIGNvbnZlcnNpb24gaXMgcGVyZm9ybWVkIGFjY29yZGluZwogICAgICAgICB0byB0aGUgbG9jYWxlIGN1cnJlbnRseSBzZWxlY3RlZCBmb3IgdGhlIDxDT0RFPkxDX0NUWVBFPC9DT0RFPiBjYXRlZ29yeS4gIElmCiAgICAgICAgIHRoZSBjb252ZXJzaW9uIGZvciB0aGUgY2hhcmFjdGVyIHNldCB1c2VkIGluIHRoZSBsb2NhbGUgcmVxdWlyZXMgYSBzdGF0ZSwKICAgICAgICAgdGhlIG11bHRpYnl0ZSBzdHJpbmcgaXMgaW50ZXJwcmV0ZWQgaW4gdGhlIHN0YXRlIHJlcHJlc2VudGVkIGJ5IHRoZQogICAgICAgICBvYmplY3QgcG9pbnRlZCB0byBieSA8VkFSPnBzPC9WQVI+LiAgSWYgPFZBUj5wczwvVkFSPiBpcyBhIG51bGwgcG9pbnRlciwgYSBzdGF0aWMsCiAgICAgICAgIGludGVybmFsIHN0YXRlIHZhcmlhYmxlIHVzZWQgb25seSBieSB0aGUgPENPREU+bWJydG93YzwvQ09ERT4gZnVuY3Rpb24gaXMKICAgICAgICAgdXNlZC4KICAgICAgICAgPGJyPjxicj4gSWYgdGhlIG5leHQgbXVsdGlieXRlIGNoYXJhY3RlciBjb3JyZXNwb25kcyB0byB0aGUgTlVMIHdpZGUgY2hhcmFjdGVyLAogICAgICAgICB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBmdW5jdGlvbiBpcyAwIGFuZCB0aGUgc3RhdGUgb2JqZWN0IGlzCiAgICAgICAgIGFmdGVyd2FyZHMgaW4gdGhlIGluaXRpYWwgc3RhdGUuICBJZiB0aGUgbmV4dCA8VkFSPm48L1ZBUj4gb3IgZmV3ZXIgYnl0ZXMKICAgICAgICAgZm9ybSBhIGNvcnJlY3QgbXVsdGlieXRlIGNoYXJhY3RlciwgdGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mCiAgICAgICAgIGJ5dGVzIHN0YXJ0aW5nIGZyb20gPFZBUj5zPC9WQVI+IHRoYXQgZm9ybSB0aGUgbXVsdGlieXRlIGNoYXJhY3Rlci4gIFRoZQogICAgICAgICBjb252ZXJzaW9uIHN0YXRlIGlzIHVwZGF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBieXRlcyBjb25zdW1lZCBpbiB0aGUKICAgICAgICAgY29udmVyc2lvbi4gIEluIGJvdGggY2FzZXMgdGhlIHdpZGUgY2hhcmFjdGVyIChlaXRoZXIgdGhlIDxDT0RFPkwnXDAnPC9DT0RFPgogICAgICAgICBvciB0aGUgb25lIGZvdW5kIGluIHRoZSBjb252ZXJzaW9uKSBpcyBzdG9yZWQgaW4gdGhlIHN0cmluZyBwb2ludGVkIHRvCiAgICAgICAgIGJ5IDxWQVI+cHdjPC9WQVI+IGlmIDxWQVI+cHdjPC9WQVI+IGlzIG5vdCBudWxsLgogICAgICAgICA8YnI+PGJyPiBJZiB0aGUgZmlyc3QgPFZBUj5uPC9WQVI+IGJ5dGVzIG9mIHRoZSBtdWx0aWJ5dGUgc3RyaW5nIHBvc3NpYmx5IGZvcm0gYSB2YWxpZAogICAgICAgICBtdWx0aWJ5dGUgY2hhcmFjdGVyIGJ1dCB0aGVyZSBhcmUgbW9yZSB0aGFuIDxWQVI+bjwvVkFSPiBieXRlcyBuZWVkZWQgdG8KICAgICAgICAgY29tcGxldGUgaXQsIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9uIGlzIDxDT0RFPihzaXplX3QpIC0yPC9DT0RFPiBhbmQKICAgICAgICAgbm8gdmFsdWUgaXMgc3RvcmVkLiAgUGxlYXNlIG5vdGUgdGhhdCB0aGlzIGNhbiBoYXBwZW4gZXZlbiBpZiA8VkFSPm48L1ZBUj4KICAgICAgICAgaGFzIGEgdmFsdWUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDxDT0RFPk1CX0NVUl9NQVg8L0NPREU+IHNpbmNlIHRoZSBpbnB1dAogICAgICAgICBtaWdodCBjb250YWluIHJlZHVuZGFudCBzaGlmdCBzZXF1ZW5jZXMuCiAgICAgICAgIDxicj48YnI+IElmIHRoZSBmaXJzdCA8Q09ERT5uPC9DT0RFPiBieXRlcyBvZiB0aGUgbXVsdGlieXRlIHN0cmluZyBjYW5ub3QgcG9zc2libHkgZm9ybQogICAgICAgICBhIHZhbGlkIG11bHRpYnl0ZSBjaGFyYWN0ZXIsIG5vIHZhbHVlIGlzIHN0b3JlZCwgdGhlIGdsb2JhbCB2YXJpYWJsZQogICAgICAgICA8Q09ERT5lcnJubzwvQ09ERT4gaXMgc2V0IHRvIHRoZSB2YWx1ZSA8Q09ERT5FSUxTRVE8L0NPREU+LCBhbmQgdGhlIGZ1bmN0aW9uIHJldHVybnMKICAgICAgICAgPENPREU+KHNpemVfdCkgLTE8L0NPREU+LiAgVGhlIGNvbnZlcnNpb24gc3RhdGUgaXMgYWZ0ZXJ3YXJkcyB1bmRlZmluZWQuCiAgICAgICAgIDxicj48YnI+IDxDT0RFPm1icnRvd2M8L0NPREU+IHdhcyBpbnRyb2R1Y2VkIGluIEFtZW5kbWVudCAxIHRvIElTTyBDOTAgYW5kCiAgICAgICAgIGlzIGRlY2xhcmVkIGluIDxUVD53Y2hhci5oPC9UVD4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3djaGFyLmh4cQB+EqR0AE93Y2hhcl90ICpyZXN0cmljdCBwd2MsIGNvbnN0IGNoYXIgKnJlc3RyaWN0IHMsIHNpemVfdCBuLCBtYnN0YXRlX3QgKnJlc3RyaWN0IHBzdAAGc2l6ZV90dAAHbWJzaW5pdHNxAH4ACnQBowogICAgICAgIFRoZSA8Q09ERT5tYnNpbml0PC9DT0RFPiBmdW5jdGlvbiBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHN0YXRlIG9iamVjdCBwb2ludGVkCiAgICAgICAgIHRvIGJ5IDxWQVI+cHM8L1ZBUj4gaXMgaW4gdGhlIGluaXRpYWwgc3RhdGUuICBJZiA8VkFSPnBzPC9WQVI+IGlzIGEgbnVsbCBwb2ludGVyIG9yCiAgICAgICAgIHRoZSBvYmplY3QgaXMgaW4gdGhlIGluaXRpYWwgc3RhdGUgdGhlIHJldHVybiB2YWx1ZSBpcyBub256ZXJvLiAgT3RoZXJ3aXNlCiAgICAgICAgIGl0IGlzIHplcm8uCiAgICAgICAgIDxicj48YnI+IDxDT0RFPm1ic2luaXQ8L0NPREU+IHdhcyBpbnRyb2R1Y2VkIGluIEFtZW5kbWVudCAxIHRvIElTTyBDOTAgYW5kIGlzCiAgICAgICAgIGRlY2xhcmVkIGluIDxUVD53Y2hhci5oPC9UVD4uCiAgICAgICAgc3EAfgAPAAAABHcEAAAABHQACHN0ZGRlZi5odAAHd2NoYXIuaHQACGxpbWl0cy5odAAIc3RkbGliLmh4cQB+Eqt0ABNjb25zdCBtYnN0YXRlX3QgKnBzdAADaW50dAAKbWJzbnJ0b3djc3NxAH4ACnQDvAogICAgICAgIFRoZSA8Q09ERT5tYnNucnRvd2NzPC9DT0RFPiBmdW5jdGlvbiBpcyB2ZXJ5IHNpbWlsYXIgdG8gdGhlIDxDT0RFPm1ic3J0b3djczwvQ09ERT4KICAgICAgICAgZnVuY3Rpb24uICBBbGwgdGhlIHBhcmFtZXRlcnMgYXJlIHRoZSBzYW1lIGV4Y2VwdCBmb3IgPFZBUj5ubWM8L1ZBUj4sIHdoaWNoIGlzCiAgICAgICAgIG5ldy4gIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHNhbWUgYXMgZm9yIDxDT0RFPm1ic3J0b3djczwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IFRoaXMgbmV3IHBhcmFtZXRlciBzcGVjaWZpZXMgaG93IG1hbnkgYnl0ZXMgYXQgbW9zdCBjYW4gYmUgdXNlZCBmcm9tIHRoZQogICAgICAgICBtdWx0aWJ5dGUgY2hhcmFjdGVyIHN0cmluZy4gIEluIG90aGVyIHdvcmRzLCB0aGUgbXVsdGlieXRlIGNoYXJhY3RlcgogICAgICAgICBzdHJpbmcgPENPREU+KjxWQVI+c3JjPC9WQVI+PC9DT0RFPiBuZWVkIG5vdCBiZSBOVUwtdGVybWluYXRlZC4gIEJ1dCBpZiBhIE5VTCBieXRlCiAgICAgICAgIGlzIGZvdW5kIHdpdGhpbiB0aGUgPFZBUj5ubWM8L1ZBUj4gZmlyc3QgYnl0ZXMgb2YgdGhlIHN0cmluZywgdGhlIGNvbnZlcnNpb24KICAgICAgICAgc3RvcHMgaGVyZS4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiBpcyBhIEdOVSBleHRlbnNpb24uICBJdCBpcyBtZWFudCB0byB3b3JrIGFyb3VuZCB0aGUKICAgICAgICAgcHJvYmxlbXMgbWVudGlvbmVkIGFib3ZlLiAgTm93IGl0IGlzIHBvc3NpYmxlIHRvIGNvbnZlcnQgYSBidWZmZXIgd2l0aAogICAgICAgICBtdWx0aWJ5dGUgY2hhcmFjdGVyIHRleHQgcGllY2UgZm9yIHBpZWNlIHdpdGhvdXQgaGF2aW5nIHRvIGNhcmUgYWJvdXQKICAgICAgICAgaW5zZXJ0aW5nIE5VTCBieXRlcyBhbmQgdGhlIGVmZmVjdCBvZiBOVUwgYnl0ZXMgb24gdGhlIGNvbnZlcnNpb24gc3RhdGUuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3djaGFyLmh4cQB+ErV0AGB3Y2hhcl90ICpyZXN0cmljdCBkc3QsIGNvbnN0IGNoYXIgKipyZXN0cmljdCBzcmMsIHNpemVfdCBubWMsIHNpemVfdCBsZW4sIG1ic3RhdGVfdCAqcmVzdHJpY3QgcHN0AAZzaXplX3R0AAltYnNydG93Y3NzcQB+AAp0CCwKICAgICAgICBUaGUgPENPREU+bWJzcnRvd2NzPC9DT0RFPiBmdW5jdGlvbiAoYGBtdWx0aWJ5dGUgc3RyaW5nIHJlc3RhcnRhYmxlIHRvIHdpZGUKICAgICAgICAgY2hhcmFjdGVyIHN0cmluZycnKSBjb252ZXJ0cyBhbiBOVUwtdGVybWluYXRlZCBtdWx0aWJ5dGUgY2hhcmFjdGVyCiAgICAgICAgIHN0cmluZyBhdCA8Q09ERT4qPFZBUj5zcmM8L1ZBUj48L0NPREU+IGludG8gYW4gZXF1aXZhbGVudCB3aWRlIGNoYXJhY3RlciBzdHJpbmcsCiAgICAgICAgIGluY2x1ZGluZyB0aGUgTlVMIHdpZGUgY2hhcmFjdGVyIGF0IHRoZSBlbmQuICBUaGUgY29udmVyc2lvbiBpcyBzdGFydGVkCiAgICAgICAgIHVzaW5nIHRoZSBzdGF0ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBvYmplY3QgcG9pbnRlZCB0byBieSA8VkFSPnBzPC9WQVI+IG9yCiAgICAgICAgIGZyb20gYW4gaW50ZXJuYWwgb2JqZWN0IG9mIDxDT0RFPm1ic3J0b3djczwvQ09ERT4gaWYgPFZBUj5wczwvVkFSPiBpcyBhIG51bGwKICAgICAgICAgcG9pbnRlci4gIEJlZm9yZSByZXR1cm5pbmcsIHRoZSBzdGF0ZSBvYmplY3QgaXMgdXBkYXRlZCB0byBtYXRjaCB0aGUgc3RhdGUKICAgICAgICAgYWZ0ZXIgdGhlIGxhc3QgY29udmVydGVkIGNoYXJhY3Rlci4gIFRoZSBzdGF0ZSBpcyB0aGUgaW5pdGlhbCBzdGF0ZSBpZiB0aGUKICAgICAgICAgdGVybWluYXRpbmcgTlVMIGJ5dGUgaXMgcmVhY2hlZCBhbmQgY29udmVydGVkLgogICAgICAgICA8YnI+PGJyPiBJZiA8VkFSPmRzdDwvVkFSPiBpcyBub3QgYSBudWxsIHBvaW50ZXIsIHRoZSByZXN1bHQgaXMgc3RvcmVkIGluIHRoZSBhcnJheQogICAgICAgICBwb2ludGVkIHRvIGJ5IDxWQVI+ZHN0PC9WQVI+OyBvdGhlcndpc2UsIHRoZSBjb252ZXJzaW9uIHJlc3VsdCBpcyBub3QKICAgICAgICAgYXZhaWxhYmxlIHNpbmNlIGl0IGlzIHN0b3JlZCBpbiBhbiBpbnRlcm5hbCBidWZmZXIuCiAgICAgICAgIDxicj48YnI+IElmIDxWQVI+bGVuPC9WQVI+IHdpZGUgY2hhcmFjdGVycyBhcmUgc3RvcmVkIGluIHRoZSBhcnJheSA8VkFSPmRzdDwvVkFSPiBiZWZvcmUKICAgICAgICAgcmVhY2hpbmcgdGhlIGVuZCBvZiB0aGUgaW5wdXQgc3RyaW5nLCB0aGUgY29udmVyc2lvbiBzdG9wcyBhbmQgPFZBUj5sZW48L1ZBUj4KICAgICAgICAgaXMgcmV0dXJuZWQuICBJZiA8VkFSPmRzdDwvVkFSPiBpcyBhIG51bGwgcG9pbnRlciwgPFZBUj5sZW48L1ZBUj4gaXMgbmV2ZXIgY2hlY2tlZC4KICAgICAgICAgPGJyPjxicj4gQW5vdGhlciByZWFzb24gZm9yIGEgcHJlbWF0dXJlIHJldHVybiBmcm9tIHRoZSBmdW5jdGlvbiBjYWxsIGlzIGlmIHRoZQogICAgICAgICBpbnB1dCBzdHJpbmcgY29udGFpbnMgYW4gaW52YWxpZCBtdWx0aWJ5dGUgc2VxdWVuY2UuICBJbiB0aGlzIGNhc2UgdGhlCiAgICAgICAgIGdsb2JhbCB2YXJpYWJsZSA8Q09ERT5lcnJubzwvQ09ERT4gaXMgc2V0IHRvIDxDT0RFPkVJTFNFUTwvQ09ERT4gYW5kIHRoZSBmdW5jdGlvbgogICAgICAgICByZXR1cm5zIDxDT0RFPihzaXplX3QpIC0xPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gPGJyPjxicj4gSW4gYWxsIG90aGVyIGNhc2VzIHRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIgb2Ygd2lkZSBjaGFyYWN0ZXJzCiAgICAgICAgIGNvbnZlcnRlZCBkdXJpbmcgdGhpcyBjYWxsLiAgSWYgPFZBUj5kc3Q8L1ZBUj4gaXMgbm90IG51bGwsIDxDT0RFPm1ic3J0b3djczwvQ09ERT4KICAgICAgICAgc3RvcmVzIGluIHRoZSBwb2ludGVyIHBvaW50ZWQgdG8gYnkgPFZBUj5zcmM8L1ZBUj4gZWl0aGVyIGEgbnVsbCBwb2ludGVyIChpZgogICAgICAgICB0aGUgTlVMIGJ5dGUgaW4gdGhlIGlucHV0IHN0cmluZyB3YXMgcmVhY2hlZCkgb3IgdGhlIGFkZHJlc3Mgb2YgdGhlIGJ5dGUKICAgICAgICAgZm9sbG93aW5nIHRoZSBsYXN0IGNvbnZlcnRlZCBtdWx0aWJ5dGUgY2hhcmFjdGVyLgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5tYnNydG93Y3M8L0NPREU+IHdhcyBpbnRyb2R1Y2VkIGluIEFtZW5kbWVudCAxIHRvIElTTyBDOTAgYW5kIGlzCiAgICAgICAgIGRlY2xhcmVkIGluIDxUVD53Y2hhci5oPC9UVD4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3djaGFyLmh4cQB+Erx0AFR3Y2hhcl90ICpyZXN0cmljdCBkc3QsIGNvbnN0IGNoYXIgKipyZXN0cmljdCBzcmMsIHNpemVfdCBsZW4sIG1ic3RhdGVfdCAqcmVzdHJpY3QgcHN0AAZzaXplX3R0AAhtYnN0b3djc3NxAH4ACnQGtQogICAgICAgIFRoZSA8Q09ERT5tYnN0b3djczwvQ09ERT4gKGBgbXVsdGlieXRlIHN0cmluZyB0byB3aWRlIGNoYXJhY3RlciBzdHJpbmcnJykKICAgICAgICAgZnVuY3Rpb24gY29udmVydHMgdGhlIG51bGwtdGVybWluYXRlZCBzdHJpbmcgb2YgbXVsdGlieXRlIGNoYXJhY3RlcnMKICAgICAgICAgPFZBUj5zdHJpbmc8L1ZBUj4gdG8gYW4gYXJyYXkgb2Ygd2lkZSBjaGFyYWN0ZXIgY29kZXMsIHN0b3Jpbmcgbm90IG1vcmUgdGhhbgogICAgICAgICA8VkFSPnNpemU8L1ZBUj4gd2lkZSBjaGFyYWN0ZXJzIGludG8gdGhlIGFycmF5IGJlZ2lubmluZyBhdCA8VkFSPndzdHJpbmc8L1ZBUj4uCiAgICAgICAgIFRoZSB0ZXJtaW5hdGluZyBudWxsIGNoYXJhY3RlciBjb3VudHMgdG93YXJkcyB0aGUgc2l6ZSwgc28gaWYgPFZBUj5zaXplPC9WQVI+CiAgICAgICAgIGlzIGxlc3MgdGhhbiB0aGUgYWN0dWFsIG51bWJlciBvZiB3aWRlIGNoYXJhY3RlcnMgcmVzdWx0aW5nIGZyb20KICAgICAgICAgPFZBUj5zdHJpbmc8L1ZBUj4sIG5vIHRlcm1pbmF0aW5nIG51bGwgY2hhcmFjdGVyIGlzIHN0b3JlZC4KICAgICAgICAgPGJyPjxicj4gVGhlIGNvbnZlcnNpb24gb2YgY2hhcmFjdGVycyBmcm9tIDxWQVI+c3RyaW5nPC9WQVI+IGJlZ2lucyBpbiB0aGUgaW5pdGlhbAogICAgICAgICBzaGlmdCBzdGF0ZS4KICAgICAgICAgPGJyPjxicj4gSWYgYW4gaW52YWxpZCBtdWx0aWJ5dGUgY2hhcmFjdGVyIHNlcXVlbmNlIGlzIGZvdW5kLCB0aGUgPENPREU+bWJzdG93Y3M8L0NPREU+CiAgICAgICAgIGZ1bmN0aW9uIHJldHVybnMgYSB2YWx1ZSBvZiAtMS4gIE90aGVyd2lzZSwgaXQgcmV0dXJucyB0aGUgbnVtYmVyCiAgICAgICAgIG9mIHdpZGUgY2hhcmFjdGVycyBzdG9yZWQgaW4gdGhlIGFycmF5IDxWQVI+d3N0cmluZzwvVkFSPi4gIFRoaXMgbnVtYmVyIGRvZXMKICAgICAgICAgbm90IGluY2x1ZGUgdGhlIHRlcm1pbmF0aW5nIG51bGwgY2hhcmFjdGVyLCB3aGljaCBpcyBwcmVzZW50IGlmIHRoZQogICAgICAgICBudW1iZXIgaXMgbGVzcyB0aGFuIDxWQVI+c2l6ZTwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gSGVyZSBpcyBhbiBleGFtcGxlIHNob3dpbmcgaG93IHRvIGNvbnZlcnQgYSBzdHJpbmcgb2YgbXVsdGlieXRlCiAgICAgICAgIGNoYXJhY3RlcnMsIGFsbG9jYXRpbmcgZW5vdWdoIHNwYWNlIGZvciB0aGUgcmVzdWx0LgogICAgICAgICA8YnI+PGJyPiA8cHJlPjxicj4KICAgICAgICAgd2NoYXJfdCAqPGJyPgogICAgICAgICBtYnN0b3djc19hbGxvYyAoY29uc3QgY2hhciAqc3RyaW5nKTxicj4KICAgICAgICAgezxicj4KICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IHN0cmxlbiAoc3RyaW5nKSArIDE7PGJyPgogICAgICAgICAgIHdjaGFyX3QgKmJ1ZiA9IHhtYWxsb2MgKHNpemUgKiBzaXplb2YgKHdjaGFyX3QpKTs8YnI+CiAgICAgICAgIDxicj48YnI+ICAgc2l6ZSA9IG1ic3Rvd2NzIChidWYsIHN0cmluZywgc2l6ZSk7PGJyPgogICAgICAgICAgIGlmIChzaXplID09IChzaXplX3QpIC0xKTxicj4KICAgICAgICAgICAgIHJldHVybiBOVUxMOzxicj4KICAgICAgICAgICBidWYgPSB4cmVhbGxvYyAoYnVmLCAoc2l6ZSArIDEpICogc2l6ZW9mICh3Y2hhcl90KSk7PGJyPgogICAgICAgICAgIHJldHVybiBidWY7PGJyPgogICAgICAgICB9PGJyPgogICAgICAgICA8L3ByZT4KICAgICAgICAgPGJyPjxicj4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc3RkbGliLmh4cQB+EsN0ADF3Y2hhcl90ICp3c3RyaW5nLCBjb25zdCBjaGFyICpzdHJpbmcsIHNpemVfdCBzaXpldAAGc2l6ZV90dAAGbWJ0b3djc3EAfgAKdAcGCiAgICAgICAgVGhlIDxDT0RFPm1idG93YzwvQ09ERT4gKGBgbXVsdGlieXRlIHRvIHdpZGUgY2hhcmFjdGVyJycpIGZ1bmN0aW9uIHdoZW4gY2FsbGVkCiAgICAgICAgIHdpdGggbm9uLW51bGwgPFZBUj5zdHJpbmc8L1ZBUj4gY29udmVydHMgdGhlIGZpcnN0IG11bHRpYnl0ZSBjaGFyYWN0ZXIKICAgICAgICAgYmVnaW5uaW5nIGF0IDxWQVI+c3RyaW5nPC9WQVI+IHRvIGl0cyBjb3JyZXNwb25kaW5nIHdpZGUgY2hhcmFjdGVyIGNvZGUuICBJdAogICAgICAgICBzdG9yZXMgdGhlIHJlc3VsdCBpbiA8Q09ERT4qPFZBUj5yZXN1bHQ8L1ZBUj48L0NPREU+LgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5tYnRvd2M8L0NPREU+IG5ldmVyIGV4YW1pbmVzIG1vcmUgdGhhbiA8VkFSPnNpemU8L1ZBUj4gYnl0ZXMuICAoVGhlIGlkZWEgaXMKICAgICAgICAgdG8gc3VwcGx5IGZvciA8VkFSPnNpemU8L1ZBUj4gdGhlIG51bWJlciBvZiBieXRlcyBvZiBkYXRhIHlvdSBoYXZlIGluIGhhbmQuKQogICAgICAgICA8YnI+PGJyPiA8Q09ERT5tYnRvd2M8L0NPREU+IHdpdGggbm9uLW51bGwgPFZBUj5zdHJpbmc8L1ZBUj4gZGlzdGluZ3Vpc2hlcyB0aHJlZQogICAgICAgICBwb3NzaWJpbGl0aWVzOiB0aGUgZmlyc3QgPFZBUj5zaXplPC9WQVI+IGJ5dGVzIGF0IDxWQVI+c3RyaW5nPC9WQVI+IHN0YXJ0IHdpdGgKICAgICAgICAgdmFsaWQgbXVsdGlieXRlIGNoYXJhY3RlcnMsIHRoZXkgc3RhcnQgd2l0aCBhbiBpbnZhbGlkIGJ5dGUgc2VxdWVuY2Ugb3IKICAgICAgICAganVzdCBwYXJ0IG9mIGEgY2hhcmFjdGVyLCBvciA8VkFSPnN0cmluZzwvVkFSPiBwb2ludHMgdG8gYW4gZW1wdHkgc3RyaW5nIChhCiAgICAgICAgIG51bGwgY2hhcmFjdGVyKS4KICAgICAgICAgPGJyPjxicj4gRm9yIGEgdmFsaWQgbXVsdGlieXRlIGNoYXJhY3RlciwgPENPREU+bWJ0b3djPC9DT0RFPiBjb252ZXJ0cyBpdCB0byBhIHdpZGUKICAgICAgICAgY2hhcmFjdGVyIGFuZCBzdG9yZXMgdGhhdCBpbiA8Q09ERT4qPFZBUj5yZXN1bHQ8L1ZBUj48L0NPREU+LCBhbmQgcmV0dXJucyB0aGUKICAgICAgICAgbnVtYmVyIG9mIGJ5dGVzIGluIHRoYXQgY2hhcmFjdGVyIChhbHdheXMgYXQgbGVhc3QgMSBhbmQgbmV2ZXIKICAgICAgICAgbW9yZSB0aGFuIDxWQVI+c2l6ZTwvVkFSPikuCiAgICAgICAgIDxicj48YnI+IEZvciBhbiBpbnZhbGlkIGJ5dGUgc2VxdWVuY2UsIDxDT0RFPm1idG93YzwvQ09ERT4gcmV0dXJucyAtMS4gIEZvciBhbgogICAgICAgICBlbXB0eSBzdHJpbmcsIGl0IHJldHVybnMgMCwgYWxzbyBzdG9yaW5nIDxDT0RFPidcMCc8L0NPREU+IGluCiAgICAgICAgIDxDT0RFPio8VkFSPnJlc3VsdDwvVkFSPjwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IElmIHRoZSBtdWx0aWJ5dGUgY2hhcmFjdGVyIGNvZGUgdXNlcyBzaGlmdCBjaGFyYWN0ZXJzLCB0aGVuCiAgICAgICAgIDxDT0RFPm1idG93YzwvQ09ERT4gbWFpbnRhaW5zIGFuZCB1cGRhdGVzIGEgc2hpZnQgc3RhdGUgYXMgaXQgc2NhbnMuICBJZiB5b3UKICAgICAgICAgY2FsbCA8Q09ERT5tYnRvd2M8L0NPREU+IHdpdGggYSBudWxsIHBvaW50ZXIgZm9yIDxWQVI+c3RyaW5nPC9WQVI+LCB0aGF0CiAgICAgICAgIGluaXRpYWxpemVzIHRoZSBzaGlmdCBzdGF0ZSB0byBpdHMgc3RhbmRhcmQgaW5pdGlhbCB2YWx1ZS4gIEl0IGFsc28KICAgICAgICAgcmV0dXJucyBub256ZXJvIGlmIHRoZSBtdWx0aWJ5dGUgY2hhcmFjdGVyIGNvZGUgaW4gdXNlIGFjdHVhbGx5IGhhcyBhCiAgICAgICAgIHNoaWZ0IHN0YXRlLiAgLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAhzdGRsaWIuaHhxAH4SynQAQndjaGFyX3QgKnJlc3RyaWN0IHJlc3VsdCwgY29uc3QgY2hhciAqcmVzdHJpY3Qgc3RyaW5nLCBzaXplX3Qgc2l6ZXQAA2ludHQABm1jaGVja3NxAH4ACnQIQgogICAgICAgIENhbGxpbmcgPENPREU+bWNoZWNrPC9DT0RFPiB0ZWxscyA8Q09ERT5tYWxsb2M8L0NPREU+IHRvIHBlcmZvcm0gb2NjYXNpb25hbAogICAgICAgICBjb25zaXN0ZW5jeSBjaGVja3MuICBUaGVzZSB3aWxsIGNhdGNoIHRoaW5ncyBzdWNoIGFzIHdyaXRpbmcKICAgICAgICAgcGFzdCB0aGUgZW5kIG9mIGEgYmxvY2sgdGhhdCB3YXMgYWxsb2NhdGVkIHdpdGggPENPREU+bWFsbG9jPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gVGhlIDxWQVI+YWJvcnRmbjwvVkFSPiBhcmd1bWVudCBpcyB0aGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGFuIGluY29uc2lzdGVuY3kKICAgICAgICAgaXMgZm91bmQuICBJZiB5b3Ugc3VwcGx5IGEgbnVsbCBwb2ludGVyLCB0aGVuIDxDT0RFPm1jaGVjazwvQ09ERT4gdXNlcyBhCiAgICAgICAgIGRlZmF1bHQgZnVuY3Rpb24gd2hpY2ggcHJpbnRzIGEgbWVzc2FnZSBhbmQgY2FsbHMgPENPREU+YWJvcnQ8L0NPREU+CiAgICAgICAgIC4gIFRoZSBmdW5jdGlvbiB5b3Ugc3VwcGx5IGlzIGNhbGxlZCB3aXRoCiAgICAgICAgIG9uZSBhcmd1bWVudCwgd2hpY2ggc2F5cyB3aGF0IHNvcnQgb2YgaW5jb25zaXN0ZW5jeSB3YXMgZGV0ZWN0ZWQ7IGl0cwogICAgICAgICB0eXBlIGlzIGRlc2NyaWJlZCBiZWxvdy4KICAgICAgICAgPGJyPjxicj4gSXQgaXMgdG9vIGxhdGUgdG8gYmVnaW4gYWxsb2NhdGlvbiBjaGVja2luZyBvbmNlIHlvdSBoYXZlIGFsbG9jYXRlZAogICAgICAgICBhbnl0aGluZyB3aXRoIDxDT0RFPm1hbGxvYzwvQ09ERT4uICBTbyA8Q09ERT5tY2hlY2s8L0NPREU+IGRvZXMgbm90aGluZyBpbiB0aGF0CiAgICAgICAgIGNhc2UuICBUaGUgZnVuY3Rpb24gcmV0dXJucyA8Q09ERT4tMTwvQ09ERT4gaWYgeW91IGNhbGwgaXQgdG9vIGxhdGUsIGFuZAogICAgICAgICA8Q09ERT4wPC9DT0RFPiBvdGhlcndpc2UgKHdoZW4gaXQgaXMgc3VjY2Vzc2Z1bCkuCiAgICAgICAgIDxicj48YnI+IFRoZSBlYXNpZXN0IHdheSB0byBhcnJhbmdlIHRvIGNhbGwgPENPREU+bWNoZWNrPC9DT0RFPiBlYXJseSBlbm91Z2ggaXMgdG8gdXNlCiAgICAgICAgIHRoZSBvcHRpb24gPHNhbXA+LWxtY2hlY2s8L3NhbXA+IHdoZW4geW91IGxpbmsgeW91ciBwcm9ncmFtOyB0aGVuIHlvdSBkb24ndAogICAgICAgICBuZWVkIHRvIG1vZGlmeSB5b3VyIHByb2dyYW0gc291cmNlIGF0IGFsbC4gIEFsdGVybmF0aXZlbHkgeW91IG1pZ2h0IHVzZQogICAgICAgICBhIGRlYnVnZ2VyIHRvIGluc2VydCBhIGNhbGwgdG8gPENPREU+bWNoZWNrPC9DT0RFPiB3aGVuZXZlciB0aGUgcHJvZ3JhbSBpcwogICAgICAgICBzdGFydGVkLCBmb3IgZXhhbXBsZSB0aGVzZSBnZGIgY29tbWFuZHMgd2lsbCBhdXRvbWF0aWNhbGx5IGNhbGwgPENPREU+bWNoZWNrPC9DT0RFPgogICAgICAgICB3aGVuZXZlciB0aGUgcHJvZ3JhbSBzdGFydHM6CiAgICAgICAgIDxicj48YnI+IDxwcmU+PGJyPgogICAgICAgICAoZ2RiKSBicmVhayBtYWluPGJyPgogICAgICAgICBCcmVha3BvaW50IDEsIG1haW4gKGFyZ2M9MiwgYXJndj0weGJmZmZmOTY0KSBhdCB3aGF0ZXZlci5jOjEwPGJyPgogICAgICAgICAoZ2RiKSBjb21tYW5kIDE8YnI+CiAgICAgICAgIFR5cGUgY29tbWFuZHMgZm9yIHdoZW4gYnJlYWtwb2ludCAxIGlzIGhpdCwgb25lIHBlciBsaW5lLjxicj4KICAgICAgICAgRW5kIHdpdGggYSBsaW5lIHNheWluZyBqdXN0ICJlbmQiLjxicj4KICAgICAgICAgPmNhbGwgbWNoZWNrKDApPGJyPgogICAgICAgICA+Y29udGludWU8YnI+CiAgICAgICAgID5l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ICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgc2l6ZV90IHNpemV0AAZ2b2lkICp0AAdtZW1wY3B5c3EAfgAKdAQZCiAgICAgICAgVGhlIDxDT0RFPm1lbXBjcHk8L0NPREU+IGZ1bmN0aW9uIGlzIG5lYXJseSBpZGVudGljYWwgdG8gdGhlIDxDT0RFPm1lbWNweTwvQ09ERT4KICAgICAgICAgZnVuY3Rpb24uICBJdCBjb3BpZXMgPFZBUj5zaXplPC9WQVI+IGJ5dGVzIGZyb20gdGhlIG9iamVjdCBiZWdpbm5pbmcgYXQKICAgICAgICAgPENPREU+ZnJvbTwvQ09ERT4gaW50byB0aGUgb2JqZWN0IHBvaW50ZWQgdG8gYnkgPFZBUj50bzwvVkFSPi4gIEJ1dCBpbnN0ZWFkIG9mCiAgICAgICAgIHJldHVybmluZyB0aGUgdmFsdWUgb2YgPFZBUj50bzwvVkFSPiBpdCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYnl0ZQogICAgICAgICBmb2xsb3dpbmcgdGhlIGxhc3Qgd3JpdHRlbiBieXRlIGluIHRoZSBvYmplY3QgYmVnaW5uaW5nIGF0IDxWQVI+dG88L1ZBUj4uCiAgICAgICAgIEkuZS4sIHRoZSB2YWx1ZSBpcyA8Q09ERT4oKHZvaWQgKikgKChjaGFyICopIDxWQVI+dG88L1ZBUj4gKyA8VkFSPnNpemU8L1ZBUj4pKTwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIGluIHNpdHVhdGlvbnMgd2hlcmUgYSBudW1iZXIgb2Ygb2JqZWN0cyBzaGFsbCBiZQogICAgICAgICBjb3BpZWQgdG8gY29uc2VjdXRpdmUgbWVtb3J5IHBvc2l0aW9ucy4KICAgICAgICAgPGJyPjxicj4gPHByZT48YnI+CiAgICAgICAgIHZvaWQgKjxicj4KICAgICAgICAgY29tYmluZSAodm9pZCAqbzEsIHNpemVfdCBzMSwgdm9pZCAqbzIsIHNpemVfdCBzMik8YnI+CiAgICAgICAgIHs8YnI+CiAgICAgICAgICAgdm9pZCAqcmVzdWx0ID0gbWFsbG9jIChzMSArIHMyKTs8YnI+CiAgICAg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byBiZSBhZGRlZC4KICAgICAgICAgPGJyPjxicj4gPExJPiBFRVhJU1QKICAgICAgICAgQSBmaWxlIG5hbWVkIDxWQVI+ZmlsZW5hbWU8L1ZBUj4gYWxyZWFkeSBleGlzdHMuCiAgICAgICAgIDxicj48YnI+IDxMST4gRU1MSU5LCiAgICAgICAgIFRoZSBwYXJlbnQgZGlyZWN0b3J5IGhhcyB0b28gbWFueSBsaW5rcyAoZW50cmllcykuCiAgICAgICAgIDxicj48YnI+IFdlbGwtZGVzaWduZWQgZmlsZSBzeXN0ZW1zIG5ldmVyIHJlcG9ydCB0aGlzIGVycm9yLCBiZWNhdXNlIHRoZXkgcGVybWl0CiAgICAgICAgIG1vcmUgbGlua3MgdGhhbiB5b3VyIGRpc2sgY291bGQgcG9zc2libHkgaG9sZC4gIEhvd2V2ZXIsIHlvdSBtdXN0IHN0aWxsCiAgICAgICAgIHRha2UgYWNjb3VudCBvZiB0aGUgcG9zc2liaWxpdHkgb2YgdGhpcyBlcnJvciwgYXMgaXQgY291bGQgcmVzdWx0IGZyb20KICAgICAgICAgbmV0d29yayBhY2Nlc3MgdG8gYSBmaWxlIHN5c3RlbSBvbiBhbm90aGVyIG1hY2hpbmUuCiAgICAgICAgIDxicj48YnI+IDxMST4gRU5PU1BDCiAgICAgICAgIFRoZSBmaWxlIHN5c3RlbSBkb2Vzbid0IGhhdmUgZW5vdWdoIHJvb20gdG8gY3JlYXRlIHRoZSBuZXcgZGlyZWN0b3J5LgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVST0ZTCiAgICAgICAgIFRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSBkaXJlY3RvcnkgYmVpbmcgY3JlYXRlZCBpcyBvbiBhIHJlYWQtb25seQogICAgICAgICBmaWxlIHN5c3RlbSBhbmQgY2Fubm90IGJlIG1vZGlmaWVkLgoKICAgICAgICAgPGJyPjxicj4gVG8gdXNlIHRoaXMgZnVuY3Rpb24sIHlvdXIgcHJvZ3JhbSBzaG91bGQgaW5jbHVkZSB0aGUgaGVhZGVyIGZpbGUKICAgICAgICAgPFRUPnN5cy9zdGF0Lmg8L1RUPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAKc3lzL3N0YXQuaHhxAH4TJXQAIWNvbnN0IGNoYXIgKmZpbGVuYW1lLCBtb2RlX3QgbW9kZXQAA2ludHQAB21rZHRlbXBzcQB+AAp0A1QKICAgICAgICBUaGUgPENPREU+bWtkdGVtcDwvQ09ERT4gZnVuY3Rpb24gY3JlYXRlcyBhIGRpcmVjdG9yeSB3aXRoIGEgdW5pcXVlIG5hbWUuICBJZgogICAgICAgICBpdCBzdWNjZWVkcywgaXQgb3ZlcndyaXRlcyA8VkFSPnRlbXBsYXRlPC9WQVI+IHdpdGggdGhlIG5hbWUgb2YgdGhlCiAgICAgICAgIGRpcmVjdG9yeSwgYW5kIHJldHVybnMgPFZBUj50ZW1wbGF0ZTwvVkFSPi4gIEFzIHdpdGggPENPREU+bWt0ZW1wPC9DT0RFPiBhbmQKICAgICAgICAgPENPREU+bWtzdGVtcDwvQ09ERT4sIDxWQVI+dGVtcGxhdGU8L1ZBUj4gc2hvdWxkIGJlIGEgc3RyaW5nIGVuZGluZyB3aXRoCiAgICAgICAgIDxzYW1wPlhYWFhYWDwvc2FtcD4uCiAgICAgICAgIDxicj48YnI+IElmIDxDT0RFPm1rZHRlbXA8L0NPREU+IGNhbm5vdCBjcmVhdGUgYW4gdW5pcXVlbHkgbmFtZWQgZGlyZWN0b3J5LCBpdCByZXR1cm5zCiAgICAgICAgIDxDT0RFPk5VTEw8L0NPREU+IGFuZCBzZXRzIDxWQVI+ZXJybm88L1ZBUj4gYXBwcm9wcmlhdGVseS4gIElmIDxWQVI+dGVtcGxhdGU8L1ZBUj4gZG9lcwogICAgICAgICBub3QgZW5kIHdpdGggPHNhbXA+WFhYWFhYPC9zYW1wPiwgPENPREU+bWtkdGVtcDwvQ09ERT4gcmV0dXJucyA8Q09ERT5OVUxMPC9DT0RFPiBhbmQgZG9lcwogICAgICAgICBub3QgbW9kaWZ5IDxWQVI+dGVtcGxhdGU8L1ZBUj4uICA8VkFSPmVycm5vPC9WQVI+IHdpbGwgYmUgc2V0IHRvIDxDT0RFPkVJTlZBTDwvQ09ERT4gaW4KICAgICAgICAgdGhpcyBjYXNlLgogICAgICAgICA8YnI+PGJyPiBUaGUgZGlyZWN0b3J5IGlzIGNyZWF0ZWQgdXNpbmcgbW9kZSA8Q09ERT4wNzAwPC9DT0RFPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc3RkbGliLmh4cQB+Eyx0AA5jaGFyICp0ZW1wbGF0ZXQABmNoYXIgKnQABm1rZmlmb3NxAH4ACnQDSQogICAgICAgIFRoZSA8Q09ERT5ta2ZpZm88L0NPREU+IGZ1bmN0aW9uIG1ha2VzIGEgRklGTyBzcGVjaWFsIGZpbGUgd2l0aCBuYW1lCiAgICAgICAgIDxWQVI+ZmlsZW5hbWU8L1ZBUj4uICBUaGUgPFZBUj5tb2RlPC9WQVI+IGFyZ3VtZW50IGlzIHVzZWQgdG8gc2V0IHRoZSBmaWxlJ3MKICAgICAgICAgcGVybWlzc2lvbnM7IHNlZSBTZXR0aW5nIFBlcm1pc3Npb25zLgogICAgICAgICA8YnI+PGJyPiBUaGUgbm9ybWFsLCBzdWNjZXNzZnVsIHJldHVybiB2YWx1ZSBmcm9tIDxDT0RFPm1rZmlmbzwvQ09ERT4gaXMgPENPREU+MDwvQ09ERT4uICBJbgogICAgICAgICB0aGUgY2FzZSBvZiBhbiBlcnJvciwgPENPREU+LTE8L0NPREU+IGlzIHJldHVybmVkLiAgSW4gYWRkaXRpb24gdG8gdGhlIHVzdWFsCiAgICAgICAgIGZpbGUgbmFtZSBlcnJvcnMgLCB0aGUgZm9sbG93aW5nCiAgICAgICAgIDxDT0RFPmVycm5vPC9DT0RFPiBlcnJvciBjb25kaXRpb25zIGFyZSBkZWZpbmVkIGZvciB0aGlzIGZ1bmN0aW9uOgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8RFQ+PENPREU+RUVYSVNUPC9DT0RFPgo8REQ+CiAgICAgICAgIFRoZSBuYW1lZCBmaWxlIGFscmVhZHkgZXhpc3RzLgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVOT1NQQwogICAgICAgICBUaGUgZGlyZWN0b3J5IG9yIGZpbGUgc3lzdGVtIGNhbm5vdCBiZSBleHRlbmRlZC4KICAgICAgICAgPGJyPjxicj4gPExJPiBFUk9GUwogICAgICAgICBUaGUgZGlyZWN0b3J5IHRoYXQgd291bGQgY29udGFpbiB0aGUgZmlsZSByZXNpZGVzIG9uIGEgcmVhZC1vbmx5IGZpbGUKICAgICAgICAgc3lzdGVtLgoKICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAKc3lzL3N0YXQuaHhxAH4TM3QAIWNvbnN0IGNoYXIgKmZpbGVuYW1lLCBtb2RlX3QgbW9kZXQAA2ludHQABW1rbm9kc3EAfgAKdAVxCiAgICAgICAgVGhlIDxDT0RFPm1rbm9kPC9DT0RFPiBmdW5jdGlvbiBtYWtlcyBhIHNwZWNpYWwgZmlsZSB3aXRoIG5hbWUgPFZBUj5maWxlbmFtZTwvVkFSPi4KICAgICAgICAgVGhlIDxWQVI+bW9kZTwvVkFSPiBzcGVjaWZpZXMgdGhlIG1vZGUgb2YgdGhlIGZpbGUsIGFuZCBtYXkgaW5jbHVkZSB0aGUgdmFyaW91cwogICAgICAgICBzcGVjaWFsIGZpbGUgYml0cywgc3VjaCBhcyA8Q09ERT5TX0lGQ0hSPC9DT0RFPiAoZm9yIGEgY2hhcmFjdGVyIHNwZWNpYWwgZmlsZSkKICAgICAgICAgb3IgPENPREU+U19JRkJMSzwvQ09ERT4gKGZvciBhIGJsb2NrIHNwZWNpYWwgZmlsZSkuICAuCiAgICAgICAgIDxicj48YnI+IFRoZSA8VkFSPmRldjwvVkFSPiBhcmd1bWVudCBzcGVjaWZpZXMgd2hpY2ggZGV2aWNlIHRoZSBzcGVjaWFsIGZpbGUgcmVmZXJzIHRvLgogICAgICAgICBJdHMgZXhhY3QgaW50ZXJwcmV0YXRpb24gZGVwZW5kcyBvbiB0aGUga2luZCBvZiBzcGVjaWFsIGZpbGUgYmVpbmcgY3JlYXRlZC4KICAgICAgICAgPGJyPjxicj4gVGhlIHJldHVybiB2YWx1ZSBpcyA8Q09ERT4wPC9DT0RFPiBvbiBzdWNjZXNzIGFuZCA8Q09ERT4tMTwvQ09ERT4gb24gZXJyb3IuICBJbiBhZGRpdGlvbgogICAgICAgICB0byB0aGUgdXN1YWwgZmlsZSBuYW1lIGVycm9ycyAsIHRoZQogICAgICAgICBmb2xsb3dpbmcgPENPREU+ZXJybm88L0NPREU+IGVycm9yIGNvbmRpdGlvbnMgYXJlIGRlZmluZWQgZm9yIHRoaXMgZnVuY3Rpb246CiAgICAgICAgIDxicj48YnI+IDxETD4KCiAgICAgICAgIDxEVD48Q09ERT5FUEVSTTwvQ09ERT4KPEREPgogICAgICAgICBUaGUgY2FsbGluZyBwcm9jZXNzIGlzIG5vdCBwcml2aWxlZ2VkLiAgT25seSB0aGUgc3VwZXJ1c2VyIGNhbiBjcmVhdGUKICAgICAgICAgc3BlY2lhbCBmaWxlcy4KICAgICAgICAgPGJyPjxicj4gPExJPiBFTk9TUEMKICAgICAgICAgVGhlIGRpcmVjdG9yeSBvciBmaWxlIHN5c3RlbSB0aGF0IHdvdWxkIGNvbnRhaW4gdGhlIG5ldyBmaWxlIGlzIGZ1bGwKICAgICAgICAgYW5kIGNhbm5vdCBiZSBleHRlbmRlZC4KICAgICAgICAgPGJyPjxicj4gPExJPiBFUk9GUwogICAgICAgICBUaGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIG5ldyBmaWxlIGNhbid0IGJlIG1vZGlmaWVkIGJlY2F1c2UgaXQncyBvbgogICAgICAgICBhIHJlYWQtb25seSBmaWxlIHN5c3RlbS4KICAgICAgICAgPGJyPjxicj4gPExJPiBFRVhJU1QKICAgICAgICAgVGhlcmUgaXMgYWxyZWFkeSBhIGZpbGUgbmFtZWQgPFZBUj5maWxlbmFtZTwvVkFSPi4gIElmIHlvdSB3YW50IHRvIHJlcGxhY2UKICAgICAgICAgdGhpcyBmaWxlLCB5b3UgbXVzdCByZW1vdmUgdGhlIG9sZCBmaWxlIGV4cGxpY2l0bHkgZmlyc3QuCgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AApzeXMvc3RhdC5oeHEAfhM6dAAnY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBtb2RlLCBpbnQgZGV2dAADaW50dAAHbWtzdGVtcHNxAH4ACnQDAQogICAgICAgIFRoZSA8Q09ERT5ta3N0ZW1wPC9DT0RFPiBmdW5jdGlvbiBnZW5lcmF0ZXMgYSB1bmlxdWUgZmlsZSBuYW1lIGp1c3QgYXMKICAgICAgICAgPENPREU+bWt0ZW1wPC9DT0RFPiBkb2VzLCBidXQgaXQgYWxzbyBvcGVucyB0aGUgZmlsZSBmb3IgeW91IHdpdGggPENPREU+b3BlbjwvQ09ERT4KICAgICAgICAgLiAgSWYgc3VjY2Vzc2Z1bCwgaXQgbW9kaWZpZXMKICAgICAgICAgPFZBUj50ZW1wbGF0ZTwvVkFSPiBpbiBwbGFjZSBhbmQgcmV0dXJucyBhIGZpbGUgZGVzY3JpcHRvciBmb3IgdGhhdCBmaWxlIG9wZW4KICAgICAgICAgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuICBJZiA8Q09ERT5ta3N0ZW1wPC9DT0RFPiBjYW5ub3QgY3JlYXRlIGEKICAgICAgICAgdW5pcXVlbHktbmFtZWQgZmlsZSwgaXQgcmV0dXJucyA8Q09ERT4tMTwvQ09ERT4uICBJZiA8VkFSPnRlbXBsYXRlPC9WQVI+IGRvZXMgbm90CiAgICAgICAgIGVuZCB3aXRoIDxzYW1wPlhYWFhYWDwvc2FtcD4sIDxDT0RFPm1rc3RlbXA8L0NPREU+IHJldHVybnMgPENPREU+LTE8L0NPREU+IGFuZCBkb2VzIG5vdAogICAgICAgICBtb2RpZnkgPFZBUj50ZW1wbGF0ZTwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gVGhlIGZpbGUgaXMgb3BlbmVkIHVzaW5nIG1vZGUgPENPREU+MDYwMDwvQ09ERT4uICBJZiB0aGUgZmlsZSBpcyBtZWFudCB0byBiZQogICAgICAgICB1c2VkIGJ5IG90aGVyIHVzZXJzIHRoaXMgbW9kZSBtdXN0IGJlIGNoYW5nZWQgZXhwbGljaXRseS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc3RkbGliLmh4cQB+E0F0AA5jaGFyICp0ZW1wbGF0ZXQAA2ludHQABm1rdGVtcHNxAH4ACnQDpAogICAgICAgIFRoZSA8Q09ERT5ta3RlbXA8L0NPREU+IGZ1bmN0aW9uIGdlbmVyYXRlcyBhIHVuaXF1ZSBmaWxlIG5hbWUgYnkgbW9kaWZ5aW5nCiAgICAgICAgIDxWQVI+dGVtcGxhdGU8L1ZBUj4gYXMgZGVzY3JpYmVkIGFib3ZlLiAgSWYgc3VjY2Vzc2Z1bCwgaXQgcmV0dXJucwogICAgICAgICA8VkFSPnRlbXBsYXRlPC9WQVI+IGFzIG1vZGlmaWVkLiAgSWYgPENPREU+bWt0ZW1wPC9DT0RFPiBjYW5ub3QgZmluZCBhIHVuaXF1ZSBmaWxlCiAgICAgICAgIG5hbWUsIGl0IG1ha2VzIDxWQVI+dGVtcGxhdGU8L1ZBUj4gYW4gZW1wdHkgc3RyaW5nIGFuZCByZXR1cm5zIHRoYXQuICBJZgogICAgICAgICA8VkFSPnRlbXBsYXRlPC9WQVI+IGRvZXMgbm90IGVuZCB3aXRoIDxzYW1wPlhYWFhYWDwvc2FtcD4sIDxDT0RFPm1rdGVtcDwvQ09ERT4gcmV0dXJucyBhCiAgICAgICAgIG51bGwgcG9pbnRlci4KICAgICAgICAgPGJyPjxicj4gV2FybmluZzogQmV0d2VlbiB0aGUgdGltZSB0aGUgcGF0aG5hbWUgaXMgY29uc3RydWN0ZWQgYW5kIHRoZQogICAgICAgICBmaWxlIGlzIGNyZWF0ZWQgYW5vdGhlciBwcm9jZXNzIG1pZ2h0IGhhdmUgY3JlYXRlZCBhIGZpbGUgd2l0aCB0aGUgc2FtZQogICAgICAgICBuYW1lIHVzaW5nIDxDT0RFPm1rdGVtcDwvQ09ERT4sIGxlYWRpbmcgdG8gYSBwb3NzaWJsZSBzZWN1cml0eSBob2xlLiAgVGhlCiAgICAgICAgIGltcGxlbWVudGF0aW9uIGdlbmVyYXRlcyBuYW1lcyB3aGljaCBjYW4gaGFyZGx5IGJlIHByZWRpY3RlZCwgYnV0IHdoZW4KICAgICAgICAgb3BlbmluZyB0aGUgZmlsZSB5b3Ugc2hvdWxkIHVzZSB0aGUgPENPREU+T19FWENMPC9DT0RFPiBmbGFnLiAgVXNpbmcKICAgICAgICAgPENPREU+bWtzdGVtcDwvQ09ERT4gaXMgYSBzYWZlIHdheSB0byBhdm9pZCB0aGlzIHByb2JsZW0uCiAgICAgICAgc3EAfgAPAAAAAncEAAAAAnQAB3N0ZGlvLmh0AAhzdGRsaWIuaHhxAH4TSHQADmNoYXIgKnRlbXBsYXRldAAGY2hhciAqdAAGbWt0aW1lc3EAfgAKdAT+CiAgICAgICAgVGhlIDxDT0RFPm1rdGltZTwvQ09ERT4gZnVuY3Rpb24gaXMgdXNlZCB0byBjb252ZXJ0IGEgYnJva2VuLWRvd24gdGltZSBzdHJ1Y3R1cmUKICAgICAgICAgdG8gYSBzaW1wbGUgdGltZSByZXByZXNlbnRhdGlvbi4gIEl0IGFsc28gYGBub3JtYWxpemVzJycgdGhlIGNvbnRlbnRzIG9mCiAgICAgICAgIHRoZSBicm9rZW4tZG93biB0aW1lIHN0cnVjdHVyZSwgYnkgZmlsbGluZyBpbiB0aGUgZGF5IG9mIHdlZWsgYW5kIGRheSBvZgogICAgICAgICB5ZWFyIGJhc2VkIG9uIHRoZSBvdGhlciBkYXRlIGFuZCB0aW1lIGNvbXBvbmVudHMuCiAgICAgICAgIDxicj48YnI+IFRoZSA8Q09ERT5ta3RpbWU8L0NPREU+IGZ1bmN0aW9uIGlnbm9yZXMgdGhlIHNwZWNpZmllZCBjb250ZW50cyBvZiB0aGUKICAgICAgICAgPENPREU+dG1fd2RheTwvQ09ERT4gYW5kIDxDT0RFPnRtX3lkYXk8L0NPREU+IG1lbWJlcnMgb2YgdGhlIGJyb2tlbi1kb3duIHRpbWUKICAgICAgICAgc3RydWN0dXJlLiAgSXQgdXNlcyB0aGUgdmFsdWVzIG9mIHRoZSBvdGhlciBjb21wb25lbnRzIHRvIGRldGVybWluZSB0aGUKICAgICAgICAgY2FsZW5kYXIgdGltZTsgaXQncyBwZXJtaXNzaWJsZSBmb3IgdGhlc2UgY29tcG9uZW50cyB0byBoYXZlCiAgICAgICAgIHVubm9ybWFsaXplZCB2YWx1ZXMgb3V0c2lkZSB0aGVpciBub3JtYWwgcmFuZ2VzLiAgVGhlIGxhc3QgdGhpbmcgdGhhdAogICAgICAgICA8Q09ERT5ta3RpbWU8L0NPREU+IGRvZXMgaXMgYWRqdXN0IHRoZSBjb21wb25lbnRzIG9mIHRoZSA8VkFSPmJyb2tlbnRpbWU8L1ZBUj4KICAgICAgICAgc3RydWN0dXJlIChpbmNsdWRpbmcgdGhlIDxDT0RFPnRtX3dkYXk8L0NPREU+IGFuZCA8Q09ERT50bV95ZGF5PC9DT0RFPikuCiAgICAgICAgIDxicj48YnI+IElmIHRoZSBzcGVjaWZpZWQgYnJva2VuLWRvd24gdGltZSBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgYXMgYSBzaW1wbGUgdGltZSwKICAgICAgICAgPENPREU+bWt0aW1lPC9DT0RFPiByZXR1cm5zIGEgdmFsdWUgb2YgPENPREU+KHRpbWVfdCkoLTEpPC9DT0RFPiBhbmQgZG9lcyBub3QgbW9kaWZ5CiAgICAgICAgIHRoZSBjb250ZW50cyBvZiA8VkFSPmJyb2tlbnRpbWU8L1ZBUj4uCiAgICAgICAgIDxicj48YnI+IENhbGxpbmcgPENPREU+bWt0aW1lPC9DT0RFPiBhbHNvIHNldHMgdGhlIHZhcmlhYmxlIDxDT0RFPnR6bmFtZTwvQ09ERT4gd2l0aAogICAgICAgICBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCB0aW1lIHpvbmUuICAuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQABnRpbWUuaHhxAH4TUHQAFXN0cnVjdCB0bSAqYnJva2VudGltZXQABnRpbWVfdHQABW1sb2Nrc3EAfgAKdAfLCiAgICAgICAgPGJyPjxicj4gPENPREU+bWxvY2s8L0NPREU+IGxvY2tzIGEgcmFuZ2Ugb2YgdGhlIGNhbGxpbmcgcHJvY2VzcycgdmlydHVhbCBwYWdlcy4KICAgICAgICAgPGJyPjxicj4gVGhlIHJhbmdlIG9mIG1lbW9yeSBzdGFydHMgYXQgYWRkcmVzcyA8VkFSPmFkZHI8L1ZBUj4gYW5kIGlzIDxWQVI+bGVuPC9WQVI+IGJ5dGVzCiAgICAgICAgIGxvbmcuICBBY3R1YWxseSwgc2luY2UgeW91IG11c3QgbG9jayB3aG9sZSBwYWdlcywgaXQgaXMgdGhlIHJhbmdlIG9mCiAgICAgICAgIHBhZ2VzIHRoYXQgaW5jbHVkZSBhbnkgcGFydCBvZiB0aGUgc3BlY2lmaWVkIHJhbmdlLgogICAgICAgICA8YnI+PGJyPiBXaGVuIHRoZSBmdW5jdGlvbiByZXR1cm5zIHN1Y2Nlc3NmdWxseSwgZWFjaCBvZiB0aG9zZSBwYWdlcyBpcyBiYWNrZWQgYnkKICAgICAgICAgKGNvbm5lY3RlZCB0bykgYSByZWFsIGZyYW1lIChpcyByZXNpZGVudCkgYW5kIGlzIG1hcmtlZCB0byBzdGF5IHRoYXQKICAgICAgICAgd2F5LiAgVGhpcyBtZWFucyB0aGUgZnVuY3Rpb24gbWF5IGNhdXNlIHBhZ2UtaW5zIGFuZCBoYXZlIHRvIHdhaXQgZm9yCiAgICAgICAgIHRoZW0uCiAgICAgICAgIDxicj48YnI+IFdoZW4gdGhlIGZ1bmN0aW9uIGZhaWxzLCBpdCBkb2VzIG5vdCBhZmZlY3QgdGhlIGxvY2sgc3RhdHVzIG9mIGFueQogICAgICAgICBwYWdlcy4KICAgICAgICAgPGJyPjxicj4gVGhlIHJldHVybiB2YWx1ZSBpcyB6ZXJvIGlmIHRoZSBmdW5jdGlvbiBzdWNjZWVkcy4gIE90aGVyd2lzZSwgaXQgaXMKICAgICAgICAgPENPREU+LTE8L0NPREU+IGFuZCA8Q09ERT5lcnJubzwvQ09ERT4gaXMgc2V0IGFjY29yZGluZ2x5LiAgPENPREU+ZXJybm88L0NPREU+IHZhbHVlcwogICAgICAgICBzcGVjaWZpYyB0byB0aGlzIGZ1bmN0aW9uIGFyZToKICAgICAgICAgPGJyPjxicj4gPERMPgoKICAgICAgICAgPERUPjxDT0RFPkVOT01FTTwvQ09ERT4KPEREPgogICAgICAgICA8T0w+CiAgICAgICAgIDxMST4KICAgICAgICAgQXQgbGVhc3Qgc29tZSBvZiB0aGUgc3BlY2lmaWVkIGFkZHJlc3MgcmFuZ2UgZG9lcyBub3QgZXhpc3QgaW4gdGhlCiAgICAgICAgIGNhbGxpbmcgcHJvY2VzcycgdmlydHVhbCBhZGRyZXNzIHNwYWNlLgogICAgICAgICA8TEk+CiAgICAgICAgIFRoZSBsb2NraW5nIHdvdWxkIGNhdXNlIHRoZSBwcm9jZXNzIHRvIGV4Y2VlZCBpdHMgbG9ja2VkIHBhZ2UgbGltaXQuCiAgICAgICAgIDwvT0w+CiAgICAgICAgIDxicj48YnI+IDxMST4gRVBFUk0KICAgICAgICAgVGhlIGNhbGxpbmcgcHJvY2VzcyBpcyBub3Qgc3VwZXJ1c2VyLgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVJTlZBTAogICAgICAgICA8VkFSPmxlbjwvVkFSPiBpcyBub3QgcG9zaXRpdmUuCiAgICAgICAgIDxicj48YnI+IDxMST4gRU5PU1lTCiAgICAgICAgIFRoZSBrZXJuZWwgZG9lcyBub3QgcHJvdmlkZSA8Q09ERT5tbG9jazwvQ09ERT4gY2FwYWJpbGl0eS4KICAgICAgICAgPGJyPjxicj4KICAgICAgICAgPGJyPjxicj4gWW91IGNhbiBsb2NrIDxFTT5hbGw8L0VNPiBhIHByb2Nlc3MnIG1lbW9yeSB3aXRoIDxDT0RFPm1sb2NrYWxsPC9DT0RFPi4gIFlvdQogICAgICAgICB1bmxvY2sgbWVtb3J5IHdpdGggPENPREU+bXVubG9jazwvQ09ERT4gb3IgPENPREU+bXVubG9ja2FsbDwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IFRvIGF2b2lkIGFsbCBwYWdlIGZhdWx0cyBpbiBhIEMgcHJvZ3JhbSwgeW91IGhhdmUgdG8gdXNlCiAgICAgICAgIDxDT0RFPm1sb2NrYWxsPC9DT0RFPiwgYmVjYXVzZSBzb21lIG9mIHRoZSBtZW1vcnkgYSBwcm9ncmFtIHVzZXMgaXMgaGlkZGVuCiAgICAgICAgIGZyb20gdGhlIEMgY29kZSwgZS5nLiB0aGUgc3RhY2sgYW5kIGF1dG9tYXRpYyB2YXJpYWJsZXMsIGFuZCB5b3UKICAgICAgICAgd291bGRuJ3Qga25vdyB3aGF0IGFkZHJlc3MgdG8gdGVsbCA8Q09ERT5tbG9jazwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+CiAgICAgICAgc3EAfgAPAAAAAncEAAAAAnQACHVuaXN0ZC5odAAKc3lzL21tYW4uaHhxAH4TV3QAHGNvbnN0IHZvaWQgKmFkZHIsIHNpemVfdCBsZW50AANpbnR0AAhtbG9ja2FsbHNxAH4ACnQMfQogICAgICAgIDxicj48YnI+IDxDT0RFPm1sb2NrYWxsPC9DT0RFPiBsb2NrcyBhbGwgdGhlIHBhZ2VzIGluIGEgcHJvY2VzcycgdmlydHVhbCBtZW1vcnkgYWRkcmVzcwogICAgICAgICBzcGFjZSwgYW5kL29yIGFueSB0aGF0IGFyZSBhZGRlZCB0byBpdCBpbiB0aGUgZnV0dXJlLiAgVGhpcyBpbmNsdWRlcyB0aGUKICAgICAgICAgcGFnZXMgb2YgdGhlIGNvZGUsIGRhdGEgYW5kIHN0YWNrIHNlZ21lbnQsIGFzIHdlbGwgYXMgc2hhcmVkIGxpYnJhcmllcywKICAgICAgICAgdXNlciBzcGFjZSBrZXJuZWwgZGF0YSwgc2hhcmVkIG1lbW9yeSwgYW5kIG1lbW9yeSBtYXBwZWQgZmlsZXMuCiAgICAgICAgIDxicj48YnI+IDxWQVI+ZmxhZ3M8L1ZBUj4gaXMgYSBzdHJpbmcgb2Ygc2luZ2xlIGJpdCBmbGFncyByZXByZXNlbnRlZCBieSB0aGUgZm9sbG93aW5nCiAgICAgICAgIG1hY3Jvcy4gIFRoZXkgdGVsbCA8Q09ERT5tbG9ja2FsbDwvQ09ERT4gd2hpY2ggb2YgaXRzIGZ1bmN0aW9ucyB5b3Ugd2FudC4gIEFsbAogICAgICAgICBvdGhlciBiaXRzIG11c3QgYmUgemVyby4KICAgICAgICAgPGJyPjxicj4gPERMPgoKICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPk1DTF9DVVJSRU5UPC9DT0RFPgo8REQ+CiAgICAgICAgIExvY2sgYWxsIHBhZ2VzIHdoaWNoIGN1cnJlbnRseSBleGlzdCBpbiB0aGUgY2FsbGluZyBwcm9jZXNzJyB2aXJ0dWFsCiAgICAgICAgIGFkZHJlc3Mgc3BhY2UuCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5NQ0xfRlVUVVJFPC9DT0RFPgo8REQ+CiAgICAgICAgIFNldCBhIG1vZGUgc3VjaCB0aGF0IGFueSBwYWdlcyBhZGRlZCB0byB0aGUgcHJvY2VzcycgdmlydHVhbCBhZGRyZXNzCiAgICAgICAgIHNwYWNlIGluIHRoZSBmdXR1cmUgd2lsbCBiZSBsb2NrZWQgZnJvbSBiaXJ0aC4gIFRoaXMgbW9kZSBkb2VzIG5vdAogICAgICAgICBhZmZlY3QgZnV0dXJlIGFkZHJlc3Mgc3BhY2VzIG93bmVkIGJ5IHRoZSBzYW1lIHByb2Nlc3Mgc28gZXhlYywgd2hpY2gKICAgICAgICAgcmVwbGFjZXMgYSBwcm9jZXNzJyBhZGRyZXNzIHNwYWNlLCB3aXBlcyBvdXQgPENPREU+TUNMX0ZVVFVSRTwvQ09ERT4uCiAgICAgICAgIC4KICAgICAgICAgPGJyPjxicj4KICAgICAgICAgPGJyPjxicj4gV2hlbiB0aGUgZnVuY3Rpb24gcmV0dXJucyBzdWNjZXNzZnVsbHksIGFuZCB5b3Ugc3BlY2lmaWVkCiAgICAgICAgIDxDT0RFPk1DTF9DVVJSRU5UPC9DT0RFPiwgYWxsIG9mIHRoZSBwcm9jZXNzJyBwYWdlcyBhcmUgYmFja2VkIGJ5IChjb25uZWN0ZWQKICAgICAgICAgdG8pIHJlYWwgZnJhbWVzICh0aGV5IGFyZSByZXNpZGVudCkgYW5kIGFyZSBtYXJrZWQgdG8gc3RheSB0aGF0IHdheS4KICAgICAgICAgVGhpcyBtZWFucyB0aGUgZnVuY3Rpb24gbWF5IGNhdXNlIHBhZ2UtaW5zIGFuZCBoYXZlIHRvIHdhaXQgZm9yIHRoZW0uCiAgICAgICAgIDxicj48YnI+IFdoZW4gdGhlIHByb2Nlc3MgaXMgaW4gPENPREU+TUNMX0ZVVFVSRTwvQ09ERT4gbW9kZSBiZWNhdXNlIGl0IHN1Y2Nlc3NmdWxseQogICAgICAgICBleGVjdXRlZCB0aGlzIGZ1bmN0aW9uIGFuZCBzcGVjaWZpZWQgPENPREU+TUNMX0NVUlJFTlQ8L0NPREU+LCBhbnkgc3lzdGVtIGNhbGwKICAgICAgICAgYnkgdGhlIHByb2Nlc3MgdGhhdCByZXF1aXJlcyBzcGFjZSBiZSBhZGRlZCB0byBpdHMgdmlydHVhbCBhZGRyZXNzIHNwYWNlCiAgICAgICAgIGZhaWxzIHdpdGggPENPREU+ZXJybm88L0NPREU+ID0gPENPREU+RU5PTUVNPC9DT0RFPiBpZiBsb2NraW5nIHRoZSBhZGRpdGlvbmFsIHNwYWNlCiAgICAgICAgIHdvdWxkIGNhdXNlIHRoZSBwcm9jZXNzIHRvIGV4Y2VlZCBpdHMgbG9ja2VkIHBhZ2UgbGltaXQuICBJbiB0aGUgY2FzZQogICAgICAgICB0aGF0IHRoZSBhZGRyZXNzIHNwYWNlIGFkZGl0aW9uIHRoYXQgY2FuJ3QgYmUgYWNjb21tb2RhdGVkIGlzIHN0YWNrCiAgICAgICAgIGV4cGFuc2lvbiwgdGhlIHN0YWNrIGV4cGFuc2lvbiBmYWlscyBhbmQgdGhlIGtlcm5lbCBzZW5kcyBhCiAgICAgICAgIDxDT0RFPlNJR1NFR1Y8L0NPREU+IHNpZ25hbCB0byB0aGUgcHJvY2Vzcy4KICAgICAgICAgPGJyPjxicj4gV2hlbiB0aGUgZnVuY3Rpb24gZmFpbHMsIGl0IGRvZXMgbm90IGFmZmVjdCB0aGUgbG9jayBzdGF0dXMgb2YgYW55IHBhZ2VzCiAgICAgICAgIG9yIHRoZSBmdXR1cmUgbG9ja2luZyBtb2RlLgogICAgICAgICA8YnI+PGJyPiBUaGUgcmV0dXJuIHZhbHVlIGlzIHplcm8gaWYgdGhlIGZ1bmN0aW9uIHN1Y2NlZWRzLiAgT3RoZXJ3aXNlLCBpdCBpcwogICAgICAgICA8Q09ERT4tMTwvQ09ERT4gYW5kIDxDT0RFPmVycm5vPC9DT0RFPiBpcyBzZXQgYWNjb3JkaW5nbHkuICA8Q09ERT5lcnJubzwvQ09ERT4gdmFsdWVzCiAgICAgICAgIHNwZWNpZmljIHRvIHRoaXMgZnVuY3Rpb24gYXJlOgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8TEk+IEVOT01FTQogICAgICAgICA8T0w+CiAgICAgICAgIDxMST4KICAgICAgICAgQXQgbGVhc3Qgc29tZSBvZiB0aGUgc3BlY2lmaWVkIGFkZHJlc3MgcmFuZ2UgZG9lcyBub3QgZXhpc3QgaW4gdGhlCiAgICAgICAgIGNhbGxpbmcgcHJvY2VzcycgdmlydHVhbCBhZGRyZXNzIHNwYWNlLgogICAgICAgICA8TEk+CiAgICAgICAgIFRoZSBsb2NraW5nIHdvdWxkIGNhdXNlIHRoZSBwcm9jZXNzIHRvIGV4Y2VlZCBpdHMgbG9ja2VkIHBhZ2UgbGltaXQuCiAgICAgICAgIDwvT0w+CiAgICAgICAgIDxicj48YnI+IDxMST4gRVBFUk0KICAgICAgICAgVGhlIGNhbGxpbmcgcHJvY2VzcyBpcyBub3Qgc3VwZXJ1c2VyLgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVJTlZBTAogICAgICAgICBVbmRlZmluZWQgYml0cyBpbiA8VkFSPmZsYWdzPC9WQVI+IGFyZSBub3QgemVyby4KICAgICAgICAgPGJyPjxicj4gPExJPiBFTk9TWVMKICAgICAgICAgVGhlIGtlcm5lbCBkb2VzIG5vdCBwcm92aWRlIDxDT0RFPm1sb2NrYWxsPC9DT0RFPiBjYXBhYmlsaXR5LgogICAgICAgICA8YnI+PGJyPgogICAgICAgICA8YnI+PGJyPiBZb3UgY2FuIGxvY2sganVzdCBzcGVjaWZpYyBwYWdlcyB3aXRoIDxDT0RFPm1sb2NrPC9DT0RFPi4gIFlvdSB1bmxvY2sgcGFnZXMKICAgICAgICAgd2l0aCA8Q09ERT5tdW5sb2NrYWxsPC9DT0RFPiBhbmQgPENPREU+bXVubG9jazwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+CiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACnN5cy9tbWFuLmh4cQB+E190AAlpbnQgZmxhZ3N0AANpbnR0AARtbWFwc3EAfgAKdBFwCiAgICAgICAgPGJyPjxicj4gVGhlIDxDT0RFPm1tYXA8L0NPREU+IGZ1bmN0aW9uIGNyZWF0ZXMgYSBuZXcgbWFwcGluZywgY29ubmVjdGVkIHRvIGJ5dGVzCiAgICAgICAgICg8VkFSPm9mZnNldDwvVkFSPikgdG8gKDxWQVI+b2Zmc2V0PC9WQVI+ICsgPFZBUj5sZW5ndGg8L1ZBUj4gLSAxKSBpbiB0aGUgZmlsZSBvcGVuIG9uCiAgICAgICAgIDxWQVI+ZmlsZWRlczwvVkFSPi4gIEEgbmV3IHJlZmVyZW5jZSBmb3IgdGhlIGZpbGUgc3BlY2lmaWVkIGJ5IDxWQVI+ZmlsZWRlczwvVkFSPgogICAgICAgICBpcyBjcmVhdGVkLCB3aGljaCBpcyBub3QgcmVtb3ZlZCBieSBjbG9zaW5nIHRoZSBmaWxlLgogICAgICAgICA8YnI+PGJyPiA8VkFSPmFkZHJlc3M8L1ZBUj4gZ2l2ZXMgYSBwcmVmZXJyZWQgc3RhcnRpbmcgYWRkcmVzcyBmb3IgdGhlIG1hcHBpbmcuCiAgICAgICAgIDxDT0RFPk5VTEw8L0NPREU+IGV4cHJlc3NlcyBubyBwcmVmZXJlbmNlLiBBbnkgcHJldmlvdXMgbWFwcGluZyBhdCB0aGF0CiAgICAgICAgIGFkZHJlc3MgaXMgYXV0b21hdGljYWxseSByZW1vdmVkLiBUaGUgYWRkcmVzcyB5b3UgZ2l2ZSBtYXkgc3RpbGwgYmUKICAgICAgICAgY2hhbmdlZCwgdW5sZXNzIHlvdSB1c2UgdGhlIDxDT0RFPk1BUF9GSVhFRDwvQ09ERT4gZmxhZy4KICAgICAgICAgPGJyPjxicj4KCgogICAgICAgICA8VkFSPnByb3RlY3Q8L1ZBUj4gY29udGFpbnMgZmxhZ3MgdGhhdCBjb250cm9sIHdoYXQga2luZCBvZiBhY2Nlc3MgaXMKICAgICAgICAgcGVybWl0dGVkLiAgVGhleSBpbmNsdWRlIDxDT0RFPlBST1RfUkVBRDwvQ09ERT4sIDxDT0RFPlBST1RfV1JJVEU8L0NPREU+LCBhbmQKICAgICAgICAgPENPREU+UFJPVF9FWEVDPC9DT0RFPiwgd2hpY2ggcGVybWl0IHJlYWRpbmcsIHdyaXRpbmcsIGFuZCBleGVjdXRpb24sCiAgICAgICAgIHJlc3BlY3RpdmVseS4gIEluYXBwcm9wcmlhdGUgYWNjZXNzIHdpbGwgY2F1c2UgYSBzZWdmYXVsdCAuCiAgICAgICAgIDxicj48YnI+IE5vdGUgdGhhdCBtb3N0IGhhcmR3YXJlIGRlc2lnbnMgY2Fubm90IHN1cHBvcnQgd3JpdGUgcGVybWlzc2lvbiB3aXRob3V0CiAgICAgICAgIHJlYWQgcGVybWlzc2lvbiwgYW5kIG1hbnkgZG8gbm90IGRpc3Rpbmd1aXNoIHJlYWQgYW5kIGV4ZWN1dGUgcGVybWlzc2lvbi4KICAgICAgICAgVGh1cywgeW91IG1heSByZWNlaXZlIHdpZGVyIHBlcm1pc3Npb25zIHRoYW4geW91IGFzayBmb3IsIGFuZCBtYXBwaW5ncyBvZgogICAgICAgICB3cml0ZS1vbmx5IGZpbGVzIG1heSBiZSBkZW5pZWQgZXZlbiBpZiB5b3UgZG8gbm90IHVzZSA8Q09ERT5QUk9UX1JFQUQ8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiA8VkFSPmZsYWdzPC9WQVI+IGNvbnRhaW5zIGZsYWdzIHRoYXQgY29udHJvbCB0aGUgbmF0dXJlIG9mIHRoZSBtYXAuCiAgICAgICAgIE9uZSBvZiA8Q09ERT5NQVBfU0hBUkVEPC9DT0RFPiBvciA8Q09ERT5NQVBfUFJJVkFURTwvQ09ERT4gbXVzdCBiZSBzcGVjaWZpZWQuCiAgICAgICAgIDxicj48YnI+IFRoZXkgaW5jbHVkZToKICAgICAgICAgPGJyPjxicj4gPERMPgoKICAgICAgICAgPERUPjxDT0RFPk1BUF9QUklWQVRFPC9DT0RFPgo8REQ+CiAgICAgICAgIFRoaXMgc3BlY2lmaWVzIHRoYXQgd3JpdGVzIHRvIHRoZSByZWdpb24gc2hvdWxkIG5ldmVyIGJlIHdyaXR0ZW4gYmFjawogICAgICAgICB0byB0aGUgYXR0YWNoZWQgZmlsZS4gIEluc3RlYWQsIGEgY29weSBpcyBtYWRlIGZvciB0aGUgcHJvY2VzcywgYW5kIHRoZQogICAgICAgICByZWdpb24gd2lsbCBiZSBzd2FwcGVkIG5vcm1hbGx5IGlmIG1lbW9yeSBydW5zIGxvdy4gIE5vIG90aGVyIHByb2Nlc3Mgd2lsbAogICAgICAgICBzZWUgdGhlIGNoYW5nZXMuCiAgICAgICAgIDxicj48YnI+IFNpbmNlIHByaXZhdGUgbWFwcGluZ3MgZWZmZWN0aXZlbHkgcmV2ZXJ0IHRvIG9yZGluYXJ5IG1lbW9yeQogICAgICAgICB3aGVuIHdyaXR0ZW4gdG8sIHlvdSBtdXN0IGhhdmUgZW5vdWdoIHZpcnR1YWwgbWVtb3J5IGZvciBhIGNvcHkgb2YKICAgICAgICAgdGhlIGVudGlyZSBtbWFwcGVkIHJlZ2lvbiBpZiB5b3UgdXNlIHRoaXMgbW9kZSB3aXRoIDxDT0RFPlBST1RfV1JJVEU8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+TUFQX1NIQVJFRDwvQ09ERT4KPEREPgogICAgICAgICBUaGlzIHNwZWNpZmllcyB0aGF0IHdyaXRlcyB0byB0aGUgcmVnaW9uIHdpbGwgYmUgd3JpdHRlbiBiYWNrIHRvIHRoZQogICAgICAgICBmaWxlLiAgQ2hhbmdlcyBtYWRlIHdpbGwgYmUgc2hhcmVkIGltbWVkaWF0ZWx5IHdpdGggb3RoZXIgcHJvY2Vzc2VzCiAgICAgICAgIG1tYXBpbmcgdGhlIHNhbWUgZmlsZS4KICAgICAgICAgPGJyPjxicj4gTm90ZSB0aGF0IGFjdHVhbCB3cml0aW5nIG1heSB0YWtlIHBsYWNlIGF0IGFueSB0aW1lLiAgWW91IG5lZWQgdG8gdXNlCiAgICAgICAgIDxDT0RFPm1zeW5jPC9DT0RFPiwgZGVzY3JpYmVkIGJlbG93LCBpZiBpdCBpcyBpbXBvcnRhbnQgdGhhdCBvdGhlciBwcm9jZXNzZXMKICAgICAgICAgdXNpbmcgY29udmVudGlvbmFsIEkvTyBnZXQgYSBjb25zaXN0ZW50IHZpZXcgb2YgdGhlIGZpbGUuCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5NQVBfRklYRUQ8L0NPREU+CjxERD4KICAgICAgICAgVGhpcyBmb3JjZXMgdGhlIHN5c3RlbSB0byB1c2UgdGhlIGV4YWN0IG1hcHBpbmcgYWRkcmVzcyBzcGVjaWZpZWQgaW4KICAgICAgICAgPFZBUj5hZGRyZXNzPC9WQVI+IGFuZCBmYWlsIGlmIGl0IGNhbid0LgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+TUFQX0FOT05ZTU9VUzwvQ09ERT4KPEREPgogICAgICAgICA8TEk+eCBNQVBfQU5PTgogICAgICAgICBUaGlzIGZsYWcgdGVsbHMgdGhlIHN5c3RlbSB0byBjcmVhdGUgYW4gYW5vbnltb3VzIG1hcHBpbmcsIG5vdCBjb25uZWN0ZWQKICAgICAgICAgdG8gYSBmaWxlLiAgPFZBUj5maWxlZGVzPC9WQVI+IGFuZCA8VkFSPm9mZjwvVkFSPiBhcmUgaWdub3JlZCwgYW5kIHRoZSByZWdpb24gaXMKICAgICAgICAgaW5pdGlhbGl6ZWQgd2l0aCB6ZXJvcy4KICAgICAgICAgPGJyPjxicj4gQW5vbnltb3VzIG1hcHMgYXJlIHVzZWQgYXMgdGhlIGJhc2ljIHByaW1pdGl2ZSB0byBleHRlbmQgdGhlIGhlYXAgb24gc29tZQogICAgICAgICBzeXN0ZW1zLiAgVGhleSBhcmUgYWxzbyB1c2VmdWwgdG8gc2hhcmUgZGF0YSBiZXR3ZWVuIG11bHRpcGxlIHRhc2tzCiAgICAgICAgIHdpdGhvdXQgY3JlYXRpbmcgYSBmaWxlLgogICAgICAgICA8YnI+PGJyPiBPbiBzb21lIHN5c3RlbXMgdXNpbmcgcHJpdmF0ZSBhbm9ueW1vdXMgbW1hcHMgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiB1c2luZwogICAgICAgICA8Q09ERT5tYWxsb2M8L0NPREU+IGZvciBsYXJnZSBibG9ja3MuICBUaGlzIGlzIG5vdCBhbiBpc3N1ZSB3aXRoIHRoZSBHTlUgQyBsaWJyYXJ5LAogICAgICAgICBhcyB0aGUgaW5jbHVkZWQgPENPREU+bWFsbG9jPC9DT0RFPiBhdXRvbWF0aWNhbGx5IHVzZXMgPENPREU+bW1hcDwvQ09ERT4gd2hlcmUgYXBwcm9wcmlhdGUuCiAgICAgICAgIDxicj48YnI+IDxicj48YnI+IDwvREw+CiAgICAgICAgIDxicj48YnI+IDxDT0RFPm1tYXA8L0NPREU+IHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIG5ldyBtYXBwaW5nLCBvciAtMSBmb3IgYW4KICAgICAgICAgZXJyb3IuCiAgICAgICAgIDxicj48YnI+IFBvc3NpYmxlIGVycm9ycyBpbmNsdWRlOgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+RUlOVkFMPC9DT0RFPgo8REQ+CiAgICAgICAgIDxicj48YnI+IEVpdGhlciA8VkFSPmFkZHJlc3M8L1ZBUj4gd2FzIHVudXNhYmxlLCBvciBpbmNvbnNpc3RlbnQgPFZBUj5mbGFnczwvVkFSPiB3ZXJlCiAgICAgICAgIGdpdmVuLgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVBQ0NFUwogICAgICAgICA8YnI+PGJyPiA8VkFSPmZpbGVkZXM8L1ZBUj4gd2FzIG5vdCBvcGVuIGZvciB0aGUgdHlwZSBvZiBhY2Nlc3Mgc3BlY2lmaWVkIGluIDxWQVI+cHJvdGVjdDwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gPExJPiBFTk9NRU0KICAgICAgICAgPGJyPjxicj4gRWl0aGVyIHRoZXJlIGlzIG5vdCBlbm91Z2ggbWVtb3J5IGZvciB0aGUgb3BlcmF0aW9uLCBvciB0aGUgcHJvY2VzcyBpcwogICAgICAgICBvdXQgb2YgYWRkcmVzcyBzcGFjZS4KICAgICAgICAgPGJyPjxicj4gPExJPiBFTk9ERVYKICAgICAgICAgPGJyPjxicj4gVGhpcyBmaWxlIGlzIG9mIGEgdHlwZSB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCBtYXBwaW5nLgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVOT0VYRUMKICAgICAgICAgPGJyPjxicj4gVGhlIGZpbGUgaXMgb24gYSBmaWxlc3lzdGVtIHRoYXQgZG9lc24ndCBzdXBwb3J0IG1hcHBpbmcuCiAgICAgICAgIDxicj48YnI+CiAgICAgICAgIDxicj48YnI+CiAgICAgICAgIDxicj48YnI+CiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACnN5cy9tbWFuLmh4cQB+E2Z0AE52b2lkICphZGRyZXNzLCBzaXplX3QgbGVuZ3RoLGludCBwcm90ZWN0LCBpbnQgZmxhZ3MsIGludCBmaWxlZGVzLCBvZmZfdCBvZmZzZXR0AAZ2b2lkICp0AAZtbWFwNjRzcQB+AAp0AysKICAgICAgICBUaGUgPENPREU+bW1hcDY0PC9DT0RFPiBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIHRoZSA8Q09ERT5tbWFwPC9DT0RFPiBmdW5jdGlvbiBidXQKICAgICAgICAgdGhlIDxWQVI+b2Zmc2V0PC9WQVI+IHBhcmFtZXRlciBpcyBvZiB0eXBlIDxDT0RFPm9mZjY0X3Q8L0NPREU+LiAgT24gMzItYml0IHN5c3RlbXMKICAgICAgICAgdGhpcyBhbGxvd3MgdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSA8VkFSPmZpbGVkZXM8L1ZBUj4gZGVzY3JpcHRvciB0byBiZQogICAgICAgICBsYXJnZXIgdGhhbiAyR0IuICA8VkFSPmZpbGVkZXM8L1ZBUj4gbXVzdCBiZSBhIGRlc2NyaXB0b3IgcmV0dXJuZWQgZnJvbSBhCiAgICAgICAgIGNhbGwgdG8gPENPREU+b3BlbjY0PC9DT0RFPiBvciA8Q09ERT5mb3BlbjY0PC9DT0RFPiBhbmQgPENPREU+ZnJlb3BlbjY0PC9DT0RFPiB3aGVyZSB0aGUKICAgICAgICAgZGVzY3JpcHRvciBpcyByZXRyaWV2ZWQgd2l0aCA8Q09ERT5maWxlbm88L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBXaGVuIHRoZSBzb3VyY2VzIGFyZSB0cmFuc2xhdGVkIHdpdGggPENPREU+X0ZJTEVfT0ZGU0VUX0JJVFMgPT0gNjQ8L0NPREU+IHRoaXMKICAgICAgICAgZnVuY3Rpb24gaXMgYWN0dWFsbHkgYXZhaWxhYmxlIHVuZGVyIHRoZSBuYW1lIDxDT0RFPm1tYXA8L0NPREU+LiAgSS5lLiwgdGhlCiAgICAgICAgIG5ldywgZXh0ZW5kZWQgQVBJIHVzaW5nIDY0IGJpdCBmaWxlIHNpemVzIGFuZCBvZmZzZXRzIHRyYW5zcGFyZW50bHkKICAgICAgICAgcmVwbGFjZXMgdGhlIG9sZCBBUEkuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACnN5cy9tbWFuLmh4cQB+E210AFB2b2lkICphZGRyZXNzLCBzaXplX3QgbGVuZ3RoLGludCBwcm90ZWN0LCBpbnQgZmxhZ3MsIGludCBmaWxlZGVzLCBvZmY2NF90IG9mZnNldHQABnZvaWQgKnQABG1vZGZzcQB+AAp0Am8KICAgICAgICBUaGVzZSBmdW5jdGlvbnMgYnJlYWsgdGhlIGFyZ3VtZW50IDxWQVI+dmFsdWU8L1ZBUj4gaW50byBhbiBpbnRlZ2VyIHBhcnQgYW5kIGEKICAgICAgICAgZnJhY3Rpb25hbCBwYXJ0IChiZXR3ZWVuIDxDT0RFPi0xPC9DT0RFPiBhbmQgPENPREU+MTwvQ09ERT4sIGV4Y2x1c2l2ZSkuICBUaGVpciBzdW0KICAgICAgICAgZXF1YWxzIDxWQVI+dmFsdWU8L1ZBUj4uICBFYWNoIG9mIHRoZSBwYXJ0cyBoYXMgdGhlIHNhbWUgc2lnbiBhcyA8VkFSPnZhbHVlPC9WQVI+LAogICAgICAgICBhbmQgdGhlIGludGVnZXIgcGFydCBpcyBhbHdheXMgcm91bmRlZCB0b3dhcmQgemVyby4KICAgICAgICAgPGJyPjxicj4gPENPREU+bW9kZjwvQ09ERT4gc3RvcmVzIHRoZSBpbnRlZ2VyIHBhcnQgaW4gPENPREU+KjxWQVI+aW50ZWdlci1wYXJ0PC9WQVI+PC9DT0RFPiwgYW5kCiAgICAgICAgIHJldHVybnMgdGhlIGZyYWN0aW9uYWwgcGFydC4gIEZvciBleGFtcGxlLCA8Q09ERT5tb2RmICgyLjUsICZpbnRwYXJ0KTwvQ09ERT4KICAgICAgICAgcmV0dXJucyA8Q09ERT4wLjU8L0NPREU+IGFuZCBzdG9yZXMgPENPREU+Mi4wPC9DT0RFPiBpbnRvIDxDT0RFPmludHBhcnQ8L0NPREU+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZtYXRoLmh4cQB+E3R0ACJkb3VibGUgdmFsdWUsIGRvdWJsZSAqaW50ZWdlci1wYXJ0dAAGZG91YmxldAAFbW9kZmZzcQB+AAp0Am8KICAgICAgICBUaGVzZSBmdW5jdGlvbnMgYnJlYWsgdGhlIGFyZ3VtZW50IDxWQVI+dmFsdWU8L1ZBUj4gaW50byBhbiBpbnRlZ2VyIHBhcnQgYW5kIGEKICAgICAgICAgZnJhY3Rpb25hbCBwYXJ0IChiZXR3ZWVuIDxDT0RFPi0xPC9DT0RFPiBhbmQgPENPREU+MTwvQ09ERT4sIGV4Y2x1c2l2ZSkuICBUaGVpciBzdW0KICAgICAgICAgZXF1YWxzIDxWQVI+dmFsdWU8L1ZBUj4uICBFYWNoIG9mIHRoZSBwYXJ0cyBoYXMgdGhlIHNhbWUgc2lnbiBhcyA8VkFSPnZhbHVlPC9WQVI+LAogICAgICAgICBhbmQgdGhlIGludGVnZXIgcGFydCBpcyBhbHdheXMgcm91bmRlZCB0b3dhcmQgemVyby4KICAgICAgICAgPGJyPjxicj4gPENPREU+bW9kZjwvQ09ERT4gc3RvcmVzIHRoZSBpbnRlZ2VyIHBhcnQgaW4gPENPREU+KjxWQVI+aW50ZWdlci1wYXJ0PC9WQVI+PC9DT0RFPiwgYW5kCiAgICAgICAgIHJldHVybnMgdGhlIGZyYWN0aW9uYWwgcGFydC4gIEZvciBleGFtcGxlLCA8Q09ERT5tb2RmICgyLjUsICZpbnRwYXJ0KTwvQ09ERT4KICAgICAgICAgcmV0dXJucyA8Q09ERT4wLjU8L0NPREU+IGFuZCBzdG9yZXMgPENPREU+Mi4wPC9DT0RFPiBpbnRvIDxDT0RFPmludHBhcnQ8L0NPREU+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZtYXRoLmh4cQB+E3t0ACBmbG9hdCB2YWx1ZSwgZmxvYXQgKmludGVnZXItcGFydHQABWZsb2F0dAAFbW9kZmxzcQB+AAp0Am8KICAgICAgICBUaGVzZSBmdW5jdGlvbnMgYnJlYWsgdGhlIGFyZ3VtZW50IDxWQVI+dmFsdWU8L1ZBUj4gaW50byBhbiBpbnRlZ2VyIHBhcnQgYW5kIGEKICAgICAgICAgZnJhY3Rpb25hbCBwYXJ0IChiZXR3ZWVuIDxDT0RFPi0xPC9DT0RFPiBhbmQgPENPREU+MTwvQ09ERT4sIGV4Y2x1c2l2ZSkuICBUaGVpciBzdW0KICAgICAgICAgZXF1YWxzIDxWQVI+dmFsdWU8L1ZBUj4uICBFYWNoIG9mIHRoZSBwYXJ0cyBoYXMgdGhlIHNhbWUgc2lnbiBhcyA8VkFSPnZhbHVlPC9WQVI+LAogICAgICAgICBhbmQgdGhlIGludGVnZXIgcGFydCBpcyBhbHdheXMgcm91bmRlZCB0b3dhcmQgemVyby4KICAgICAgICAgPGJyPjxicj4gPENPREU+bW9kZjwvQ09ERT4gc3RvcmVzIHRoZSBpbnRlZ2VyIHBhcnQgaW4gPENPREU+KjxWQVI+aW50ZWdlci1wYXJ0PC9WQVI+PC9DT0RFPiwgYW5kCiAgICAgICAgIHJldHVybnMgdGhlIGZyYWN0aW9uYWwgcGFydC4gIEZvciBleGFtcGxlLCA8Q09ERT5tb2RmICgyLjUsICZpbnRwYXJ0KTwvQ09ERT4KICAgICAgICAgcmV0dXJucyA8Q09ERT4wLjU8L0NPREU+IGFuZCBzdG9yZXMgPENPREU+Mi4wPC9DT0RFPiBpbnRvIDxDT0RFPmludHBhcnQ8L0NPREU+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZtYXRoLmh4cQB+E4J0ACxsb25nIGRvdWJsZSB2YWx1ZSwgbG9uZyBkb3VibGUgKmludGVnZXItcGFydHQAC2xvbmcgZG91YmxldAAFbW91bnRzcQB+AAp0IT4KICAgICAgICA8YnI+PGJyPiA8Q09ERT5tb3VudDwvQ09ERT4gbW91bnRzIG9yIHJlbW91bnRzIGEgZmlsZXN5c3RlbS4gIFRoZSB0d28gb3BlcmF0aW9ucyBhcmUKICAgICAgICAgcXVpdGUgZGlmZmVyZW50IGFuZCBhcmUgbWVyZ2VkIHJhdGhlciB1bm5hdHVyYWxseSBpbnRvIHRoaXMgb25lIGZ1bmN0aW9uLgogICAgICAgICBUaGUgPENPREU+TVNfUkVNT1VOVDwvQ09ERT4gb3B0aW9uLCBleHBsYWluZWQgYmVsb3csIGRldGVybWluZXMgd2hldGhlcgogICAgICAgICA8Q09ERT5tb3VudDwvQ09ERT4gbW91bnRzIG9yIHJlbW91bnRzLgogICAgICAgICA8YnI+PGJyPiBGb3IgYSBtb3VudCwgdGhlIGZpbGVzeXN0ZW0gb24gdGhlIGJsb2NrIGRldmljZSByZXByZXNlbnRlZCBieSB0aGUKICAgICAgICAgZGV2aWNlIHNwZWNpYWwgZmlsZSBuYW1lZCA8VkFSPnNwZWNpYWxfZmlsZTwvVkFSPiBnZXRzIG1vdW50ZWQgb3ZlciB0aGUgbW91bnQKICAgICAgICAgcG9pbnQgPFZBUj5kaXI8L1ZBUj4uICBUaGlzIG1lYW5zIHRoYXQgdGhlIGRpcmVjdG9yeSA8VkFSPmRpcjwvVkFSPiAoYWxvbmcgd2l0aCBhbnkKICAgICAgICAgZmlsZXMgaW4gaXQpIGlzIG5vIGxvbmdlciB2aXNpYmxlOyBpbiBpdHMgcGxhY2UgKGFuZCBzdGlsbCB3aXRoIHRoZSBuYW1lCiAgICAgICAgIDxWQVI+ZGlyPC9WQVI+KSBpcyB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlIGZpbGVzeXN0ZW0gb24gdGhlIGRldmljZS4KICAgICAgICAgPGJyPjxicj4gQXMgYW4gZXhjZXB0aW9uLCBpZiB0aGUgZmlsZXN5c3RlbSB0eXBlIChzZWUgYmVsb3cpIGlzIG9uZSB3aGljaCBpcyBub3QKICAgICAgICAgYmFzZWQgb24gYSBkZXZpY2UgKGUuZy4gYGBwcm9jJycpLCA8Q09ERT5tb3VudDwvQ09ERT4gaW5zdGFudGlhdGVzIGEKICAgICAgICAgZmlsZXN5c3RlbSBhbmQgbW91bnRzIGl0IG92ZXIgPFZBUj5kaXI8L1ZBUj4gYW5kIGlnbm9yZXMgPFZBUj5zcGVjaWFsX2ZpbGU8L1ZBUj4uCiAgICAgICAgIDxicj48YnI+IEZvciBhIHJlbW91bnQsIDxWQVI+ZGlyPC9WQVI+IHNwZWNpZmllcyB0aGUgbW91bnQgcG9pbnQgd2hlcmUgdGhlIGZpbGVzeXN0ZW0KICAgICAgICAgdG8gYmUgcmVtb3VudGVkIGlzIChhbmQgcmVtYWlucykgbW91bnRlZCBhbmQgPFZBUj5zcGVjaWFsX2ZpbGU8L1ZBUj4gaXMKICAgICAgICAgaWdub3JlZC4gIFJlbW91bnRpbmcgYSBmaWxlc3lzdGVtIG1lYW5zIGNoYW5naW5nIHRoZSBvcHRpb25zIHRoYXQgY29udHJvbAogICAgICAgICBvcGVyYXRpb25zIG9uIHRoZSBmaWxlc3lzdGVtIHdoaWxlIGl0IGlzIG1vdW50ZWQuICBJdCBkb2VzIG5vdCBtZWFuCiAgICAgICAgIHVubW91bnRpbmcgYW5kIG1vdW50aW5nIGFnYWluLgogICAgICAgICA8YnI+PGJyPiBGb3IgYSBtb3VudCwgeW91IG11c3QgaWRlbnRpZnkgdGhlIHR5cGUgb2YgdGhlIGZpbGVzeXN0ZW0gYXMKICAgICAgICAgPFZBUj5mc3R5cGU8L1ZBUj4uICBUaGlzIHR5cGUgdGVsbHMgdGhlIGtlcm5lbCBob3cgdG8gYWNjZXNzIHRoZSBmaWxlc3lzdGVtCiAgICAgICAgIGFuZCBjYW4gYmUgdGhvdWdodCBvZiBhcyB0aGUgbmFtZSBvZiBhIGZpbGVzeXN0ZW0gZHJpdmVyLiAgVGhlCiAgICAgICAgIGFjY2VwdGFibGUgdmFsdWVzIGFyZSBzeXN0ZW0gZGVwZW5kZW50LiAgT24gYSBzeXN0ZW0gd2l0aCBhIExpbnV4IGtlcm5lbAogICAgICAgICBhbmQgdGhlIDxDT0RFPnByb2M8L0NPREU+IGZpbGVzeXN0ZW0sIHRoZSBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlcyBpcyBpbiB0aGUKICAgICAgICAgZmlsZSA8VFQ+ZmlsZXN5c3RlbXM8L1RUPiBpbiB0aGUgPENPREU+cHJvYzwvQ09ERT4gZmlsZXN5c3RlbSAoZS5nLiB0eXBlCiAgICAgICAgIDxLQkQ+Y2F0IC9wcm9jL2ZpbGVzeXN0ZW1zPC9LQkQ+IHRvIHNlZSB0aGUgbGlzdCkuICBXaXRoIGEgTGludXgga2VybmVsLCB0aGUKICAgICAgICAgdHlwZXMgb2YgZmlsZXN5c3RlbXMgdGhhdCA8Q09ERT5tb3VudDwvQ09ERT4gY2FuIG1vdW50LCBhbmQgdGhlaXIgdHlwZSBuYW1lcywKICAgICAgICAgZGVwZW5kcyBvbiB3aGF0IGZpbGVzeXN0ZW0gZHJpdmVycyBhcmUgY29uZmlndXJlZCBpbnRvIHRoZSBrZXJuZWwgb3IKICAgICAgICAgbG9hZGVkIGFzIGxvYWRhYmxlIGtlcm5lbCBtb2R1bGVzLiAgQW4gZXhhbXBsZSBvZiBhIGNvbW1vbiB2YWx1ZSBmb3IKICAgICAgICAgPFZBUj5mc3R5cGU8L1ZBUj4gaXMgPENPREU+ZXh0MjwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IEZvciBhIHJlbW91bnQsIDxDT0RFPm1vdW50PC9DT0RFPiBpZ25vcmVzIDxWQVI+ZnN0eXBlPC9WQVI+LgogICAgICAgICA8YnI+PGJyPiA8VkFSPm9wdGlvbnM8L1ZBUj4gc3BlY2lmaWVzIGEgdmFyaWV0eSBvZiBvcHRpb25zIHRoYXQgYXBwbHkgdW50aWwgdGhlCiAgICAgICAgIGZpbGVzeXN0ZW0gaXMgdW5tb3VudGVkIG9yIHJlbW91bnRlZC4gIFRoZSBwcmVjaXNlIG1lYW5pbmcgb2YgYW4gb3B0aW9uCiAgICAgICAgIGRlcGVuZHMgb24gdGhlIGZpbGVzeXN0ZW0gYW5kIHdpdGggc29tZSBmaWxlc3lzdGVtcywgYW4gb3B0aW9uIG1heSBoYXZlCiAgICAgICAgIG5vIGVmZmVjdCBhdCBhbGwuICBGdXJ0aGVybW9yZSwgZm9yIHNvbWUgZmlsZXN5c3RlbXMsIHNvbWUgb2YgdGhlc2UKICAgICAgICAgb3B0aW9ucyAoYnV0IG5ldmVyIDxDT0RFPk1TX1JET05MWTwvQ09ERT4pIGNhbiBiZSBvdmVycmlkZGVuIGZvciBpbmRpdmlkdWFsCiAgICAgICAgIGZpbGUgYWNjZXNzZXMgdmlhIDxDT0RFPmlvY3RsPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gPFZBUj5vcHRpb25zPC9WQVI+IGlzIGEgYml0IHN0cmluZyB3aXRoIGJpdCBmaWVsZHMgZGVmaW5lZCB1c2luZyB0aGUKICAgICAgICAgZm9sbG93aW5nIG1hc2sgYW5kIG1hc2tlZCB2YWx1ZSBtYWNyb3M6CiAgICAgICAgIDxicj48YnI+IDxETD4KCiAgICAgICAgIDxEVD48Q09ERT5NU19NR0NfTUFTSzwvQ09ERT4KPEREPgogICAgICAgICBUaGlzIG11bHRpYml0IGZpZWxkIGNvbnRhaW5zIGEgbWFnaWMgbnVtYmVyLiAgSWYgaXQgZG9lcyBub3QgaGF2ZSB0aGUgdmFsdWUKICAgICAgICAgPENPREU+TVNfTUdDX1ZBTDwvQ09ERT4sIDxDT0RFPm1vdW50PC9DT0RFPiBhc3N1bWVzIGFsbCB0aGUgZm9sbG93aW5nIGJpdHMgYXJlIHplcm8gYW5kCiAgICAgICAgIHRoZSA8VkFSPmRhdGE8L1ZBUj4gYXJndW1lbnQgaXMgYSBudWxsIHN0cmluZywgcmVnYXJkbGVzcyBvZiB0aGVpciBhY3R1YWwgdmFsdWVzLgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+TVNfUkVNT1VOVDwvQ09ERT4KPEREPgogICAgICAgICBUaGlzIGJpdCBvbiBtZWFucyB0byByZW1vdW50IHRoZSBmaWxlc3lzdGVtLiAgT2ZmIG1lYW5zIHRvIG1vdW50IGl0LgogICAgICAgICA8YnI+PGJyPiA8TEk+IE1TX1JET05MWQogICAgICAgICBUaGlzIGJpdCBvbiBzcGVjaWZpZXMgdGhhdCBubyB3cml0aW5nIHRvIHRoZSBmaWxlc3lzdGVtIHNoYWxsIGJlIGFsbG93ZWQKICAgICAgICAgd2hpbGUgaXQgaXMgbW91bnRlZC4gIFRoaXMgY2Fubm90IGJlIG92ZXJyaWRkZW4gYnkgPENPREU+aW9jdGw8L0NPREU+LiAgVGhpcwogICAgICAgICBvcHRpb24gaXMgYXZhaWxhYmxlIG9uIG5lYXJseSBhbGwgZmlsZXN5c3RlbXMuCiAgICAgICAgIDxicj48YnI+IDxMST4gU19JTU1VVEFCTEUKICAgICAgICAgVGhpcyBiaXQgb24gc3BlY2lmaWVzIHRoYXQgbm8gd3JpdGluZyB0byB0aGUgZmlsZXMgaW4gdGhlIGZpbGVzeXN0ZW0KICAgICAgICAgc2hhbGwgYmUgYWxsb3dlZCB3aGlsZSBpdCBpcyBtb3VudGVkLiAgVGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiBmb3IgYQogICAgICAgICBwYXJ0aWN1bGFyIGZpbGUgYWNjZXNzIGJ5IGEgcHJvcGVybHkgcHJpdmlsZWdlZCBjYWxsIHRvIDxDT0RFPmlvY3RsPC9DT0RFPi4KICAgICAgICAgVGhpcyBvcHRpb24gaXMgYSByZWxhdGl2ZWx5IG5ldyBpbnZlbnRpb24gYW5kIGlzIG5vdCBhdmFpbGFibGUgb24gbWFueQogICAgICAgICBmaWxlc3lzdGVtcy4KICAgICAgICAgPGJyPjxicj4gPExJPiBTX0FQUEVORAogICAgICAgICBUaGlzIGJpdCBvbiBzcGVjaWZpZXMgdGhhdCB0aGUgb25seSBmaWxlIHdyaXRpbmcgdGhhdCBzaGFsbCBiZSBhbGxvd2VkCiAgICAgICAgIHdoaWxlIHRoZSBmaWxlc3lzdGVtIGlzIG1vdW50ZWQgaXMgYXBwZW5kaW5nLiAgU29tZSBmaWxlc3lzdGVtcyBhbGxvdwogICAgICAgICB0aGlzIHRvIGJlIG92ZXJyaWRkZW4gZm9yIGEgcGFydGljdWxhciBwcm9jZXNzIGJ5IGEgcHJvcGVybHkgcHJpdmlsZWdlZAogICAgICAgICBjYWxsIHRvIDxDT0RFPmlvY3RsPC9DT0RFPi4gIFRoaXMgaXMgYSByZWxhdGl2ZWx5IG5ldyBpbnZlbnRpb24gYW5kIGlzIG5vdAogICAgICAgICBhdmFpbGFibGUgb24gbWFueSBmaWxlc3lzdGVtcy4KICAgICAgICAgPGJyPjxicj4gPExJPiBNU19OT1NVSUQKICAgICAgICAgVGhpcyBiaXQgb24gc3BlY2lmaWVzIHRoYXQgU2V0dWlkIGFuZCBTZXRnaWQgcGVybWlzc2lvbnMgb24gZmlsZXMgaW4gdGhlCiAgICAgICAgIGZpbGVzeXN0ZW0gc2hhbGwgYmUgaWdub3JlZCB3aGlsZSBpdCBpcyBtb3VudGVkLgogICAgICAgICA8YnI+PGJyPiA8TEk+IE1TX05PRVhFQwogICAgICAgICBUaGlzIGJpdCBvbiBzcGVjaWZpZXMgdGhhdCBubyBmaWxlcyBpbiB0aGUgZmlsZXN5c3RlbSBzaGFsbCBiZSBleGVjdXRlZAogICAgICAgICB3aGlsZSB0aGUgZmlsZXN5c3RlbSBpcyBtb3VudGVkLgogICAgICAgICA8YnI+PGJyPiA8TEk+IE1TX05PREVWCiAgICAgICAgIFRoaXMgYml0IG9uIHNwZWNpZmllcyB0aGF0IG5vIGRldmljZSBzcGVjaWFsIGZpbGVzIGluIHRoZSBmaWxlc3lzdGVtCiAgICAgICAgIHNoYWxsIGJlIGFjY2Vzc2libGUgd2hpbGUgdGhlIGZpbGVzeXN0ZW0gaXMgbW91bnRlZC4KICAgICAgICAgPGJyPjxicj4gPExJPiBNU19TWU5DSFJPTk9VUwogICAgICAgICBUaGlzIGJpdCBvbiBzcGVjaWZpZXMgdGhhdCBhbGwgd3JpdGVzIHRvIHRoZSBmaWxlc3lzdGVtIHdoaWxlIGl0IGlzCiAgICAgICAgIG1vdW50ZWQgc2hhbGwgYmUgc3luY2hyb25vdXM7IGkuZS4sIGRhdGEgc2hhbGwgYmUgc3luY2VkIGJlZm9yZSBlYWNoCiAgICAgICAgIHdyaXRlIGNvbXBsZXRlcyByYXRoZXIgdGhhbiBoZWxkIGluIHRoZSBidWZmZXIgY2FjaGUuCiAgICAgICAgIDxicj48YnI+IDxMST4gTVNfTUFORExPQ0sKICAgICAgICAgVGhpcyBiaXQgb24gc3BlY2lmaWVzIHRoYXQgbWFuZGF0b3J5IGxvY2tzIG9uIGZpbGVzIHNoYWxsIGJlIHBlcm1pdHRlZCB3aGlsZQogICAgICAgICB0aGUgZmlsZXN5c3RlbSBpcyBtb3VudGVkLgogICAgICAgICA8YnI+PGJyPiA8TEk+IE1TX05PQVRJTUUKICAgICAgICAgVGhpcyBiaXQgb24gc3BlY2lmaWVzIHRoYXQgYWNjZXNzIHRpbWVzIG9mIGZpbGVzIHNoYWxsIG5vdCBiZSB1cGRhdGVkIHdoZW4KICAgICAgICAgdGhlIGZpbGVzIGFyZSBhY2Nlc3NlZCB3aGlsZSB0aGUgZmlsZXN5c3RlbSBpcyBtb3VudGVkLgogICAgICAgICA8YnI+PGJyPiA8TEk+IE1TX05PRElSQVRJTUUKICAgICAgICAgVGhpcyBiaXQgb24gc3BlY2lmaWVzIHRoYXQgYWNjZXNzIHRpbWVzIG9mIGRpcmVjdG9yaWVzIHNoYWxsIG5vdCBiZSB1cGRhdGVkCiAgICAgICAgIHdoZW4gdGhlIGRpcmVjdG9yaWVzIGFyZSBhY2Nlc3NlZCB3aGlsZSB0aGUgZmlsZXN5c3RlbSBpbiBtb3VudGVkLgogICAgICAgICA8YnI+PGJyPiA8YnI+PGJyPgogICAgICAgICA8YnI+PGJyPiBBbnkgYml0cyBub3QgY292ZXJlZCBieSB0aGUgYWJvdmUgbWFza3Mgc2hvdWxkIGJlIHNldCBvZmY7IG90aGVyd2lzZSwKICAgICAgICAgcmVzdWx0cyBhcmUgdW5kZWZpbmVkLgogICAgICAgICA8YnI+PGJyPiBUaGUgbWVhbmluZyBvZiA8VkFSPmRhdGE8L1ZBUj4gZGVwZW5kcyBvbiB0aGUgZmlsZXN5c3RlbSB0eXBlIGFuZCBpcyBjb250cm9sbGVkCiAgICAgICAgIGVudGlyZWx5IGJ5IHRoZSBmaWxlc3lzdGVtIGRyaXZlciBpbiB0aGUga2VybmVsLgogICAgICAgICA8YnI+PGJyPiBFeGFtcGxlOgogICAgICAgICA8YnI+PGJyPiA8cHJlPjxicj4KICAgICAgICAgPGJyPgogICAgICAgICAjaW5jbHVkZSA8c3lzL21vdW50Lmg+PGJyPgogICAgICAgICA8YnI+PGJyPiBtb3VudCgiL2Rldi9oZGIiLCAiL2Nkcm9tIiwgTVNfTUdDX1ZBTCB8IE1TX1JET05MWSB8IE1TX05PU1VJRCwgIiIpOzxicj4KICAgICAgICAgPGJyPjxicj4gbW91bnQoIi9kZXYvaGRhMiIsICIvbW50IiwgTVNfTUdDX1ZBTCB8IE1TX1JFTU9VTlQsICIiKTs8YnI+CiAgICAgICAgIDxicj48YnI+IDxicj4KICAgICAgICAgPC9wcmU+CiAgICAgICAgIDxicj48YnI+IEFwcHJvcHJpYXRlIGFyZ3VtZW50cyBmb3IgPENPREU+bW91bnQ8L0NPREU+IGFyZSBjb252ZW50aW9uYWxseSByZWNvcmRlZCBpbgogICAgICAgICB0aGUgPFRUPmZzdGFiPC9UVD4gdGFibGUuICAuCiAgICAgICAgIDxicj48YnI+IFRoZSByZXR1cm4gdmFsdWUgaXMgemVybyBpZiB0aGUgbW91bnQgb3IgcmVtb3VudCBpcyBzdWNjZXNzZnVsLiAgT3RoZXJ3aXNlLAogICAgICAgICBpdCBpcyA8Q09ERT4tMTwvQ09ERT4gYW5kIDxDT0RFPmVycm5vPC9DT0RFPiBpcyBzZXQgYXBwcm9wcmlhdGVseS4gIFRoZSB2YWx1ZXMgb2YKICAgICAgICAgPENPREU+ZXJybm88L0NPREU+IGFyZSBmaWxlc3lzdGVtIGRlcGVuZGVudCwgYnV0IGhlcmUgaXMgYSBnZW5lcmFsIGxpc3Q6CiAgICAgICAgIDxicj48YnI+IDxETD4KCiAgICAgICAgIDxMST4gRVBFUk0KICAgICAgICAgVGhlIHByb2Nlc3MgaXMgbm90IHN1cGVydXNlci4KICAgICAgICAgPExJPiBFTk9ERVYKICAgICAgICAgVGhlIGZpbGUgc3lzdGVtIHR5cGUgPFZBUj5mc3R5cGU8L1ZBUj4gaXMgbm90IGtub3duIHRvIHRoZSBrZXJuZWwuCiAgICAgICAgIDxMST4gRU5PVEJMSwogICAgICAgICBUaGUgZmlsZSA8VkFSPmRldjwvVkFSPiBpcyBub3QgYSBibG9jayBkZXZpY2Ugc3BlY2lhbCBmaWxlLgogICAgICAgICA8TEk+IEVCVVNZCiAgICAgICAgIDxicj48YnI+IDxPTD4KICAgICAgICAgPGJyPjxicj4gPExJPgogICAgICAgICBUaGUgZGV2aWNlIGlzIGFscmVhZHkgbW91bnRlZC4KICAgICAgICAgPGJyPjxicj4gPExJPgogICAgICAgICBUaGUgbW91bnQgcG9pbnQgaXMgYnVzeS4gIChFLmcuIGl0IGlzIHNvbWUgcHJvY2Vzcycgd29ya2luZyBkaXJlY3Rvcnkgb3IKICAgICAgICAgaGFzIGEgZmlsZXN5c3RlbSBtb3VudGVkIG9uIGl0IGFscmVhZHkpLgogICAgICAgICA8YnI+PGJyPiA8TEk+CiAgICAgICAgIFRoZSByZXF1ZXN0IGlzIHRvIHJlbW91bnQgcmVhZC1vbmx5LCBidXQgdGhlcmUgYXJlIGZpbGVzIG9wZW4gZm9yIHdyaXRlLgogICAgICAgICA8L09MPgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVJTlZBTAogICAgICAgICA8T0w+CiAgICAgICAgIDxicj48YnI+IDxMST4KICAgICAgICAgQSByZW1vdW50IHdhcyBhdHRlbXB0ZWQsIGJ1dCB0aGVyZSBpcyBubyBmaWxlc3lzdGVtIG1vdW50ZWQgb3ZlciB0aGUKICAgICAgICAgc3BlY2lmaWVkIG1vdW50IHBvaW50LgogICAgICAgICA8YnI+PGJyPiA8TEk+CiAgICAgICAgIFRoZSBzdXBwb3NlZCBmaWxlc3lzdGVtIGhhcyBhbiBpbnZhbGlkIHN1cGVyYmxvY2suCiAgICAgICAgIDxicj48YnI+IDwvT0w+CiAgICAgICAgIDxicj48YnI+IDxMST4gRUFDQ0VTCiAgICAgICAgIDxPTD4KICAgICAgICAgPGJyPjxicj4gPExJPgogICAgICAgICBUaGUgZmlsZXN5c3RlbSBpcyBpbmhlcmVudGx5IHJlYWQtb25seSAocG9zc2libHkgZHVlIHRvIGEgc3dpdGNoIG9uIHRoZQogICAgICAgICBkZXZpY2UpIGFuZCB0aGUgcHJvY2VzcyBhdHRlbXB0ZWQgdG8gbW91bnQgaXQgcmVhZC93cml0ZSAoYnkgc2V0dGluZyB0aGUKICAgICAgICAgPENPREU+TVNfUkRPTkxZPC9DT0RFPiBiaXQgb2ZmKS4KICAgICAgICAgPGJyPjxicj4gPExJPgogICAgICAgICA8VkFSPnNwZWNpYWxfZmlsZTwvVkFSPiBvciA8VkFSPmRpcjwvVkFSPiBpcyBub3QgYWNjZXNzaWJsZSBkdWUgdG8gZmlsZSBwZXJtaXNzaW9ucy4KICAgICAgICAgPGJyPjxicj4gPExJPgogICAgICAgICA8VkFSPnNwZWNpYWxfZmlsZTwvVkFSPiBpcyBub3QgYWNjZXNzaWJsZSBiZWNhdXNlIGl0IGlzIGluIGEgZmlsZXN5c3RlbSB0aGF0IGlzCiAgICAgICAgIG1vdW50ZWQgd2l0aCB0aGUgPENPREU+TVNfTk9ERVY8L0NPREU+IG9wdGlvbi4KICAgICAgICAgPGJyPjxicj4gPC9PTD4KICAgICAgICAgPGJyPjxicj4gPExJPiBFTV9GSUxFCiAgICAgICAgIFRoZSB0YWJsZSBvZiBkdW1teSBkZXZpY2VzIGlzIGZ1bGwuICA8Q09ERT5tb3VudDwvQ09ERT4gbmVlZHMgdG8gY3JlYXRlIGEKICAgICAgICAgZHVtbXkgZGV2aWNlIChha2EgYGB1bm5hbWVkJycgZGV2aWNlKSBpZiB0aGUgZmlsZXN5c3RlbSBiZWluZyBtb3VudGVkIGlzCiAgICAgICAgIG5vdCBvbmUgdGhhdCB1c2VzIGEgZGV2aWNlLgogICAgICAgICA8YnI+PGJyPgogICAgICAgICA8YnI+PGJyPgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAtzeXMvbW91bnQuaHhxAH4TiXQAamNvbnN0IGNoYXIgKnNwZWNpYWxfZmlsZSwgY29uc3QgY2hhciAqZGlyLCBjb25zdCBjaGFyICpmc3R5cGUsIHVuc2lnbmVkIGxvbmcgaW50IG9wdGlvbnMsIGNvbnN0IHZvaWQgKmRhdGF0AANpbnR0AAZtcHJvYmVzcQB+AAp0AoQKICAgICAgICBUaGUgPENPREU+bXByb2JlPC9DT0RFPiBmdW5jdGlvbiBsZXRzIHlvdSBleHBsaWNpdGx5IGNoZWNrIGZvciBpbmNvbnNpc3RlbmNpZXMKICAgICAgICAgaW4gYSBwYXJ0aWN1bGFyIGFsbG9jYXRlZCBibG9jay4gIFlvdSBtdXN0IGhhdmUgYWxyZWFkeSBjYWxsZWQKICAgICAgICAgPENPREU+bWNoZWNrPC9DT0RFPiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwcm9ncmFtLCB0byBkbyBpdHMgb2NjYXNpb25hbAogICAgICAgICBjaGVja3M7IGNhbGxpbmcgPENPREU+bXByb2JlPC9DT0RFPiByZXF1ZXN0cyBhbiBhZGRpdGlvbmFsIGNvbnNpc3RlbmN5IGNoZWNrCiAgICAgICAgIHRvIGJlIGRvbmUgYXQgdGhlIHRpbWUgb2YgdGhlIGNh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IFRoZSBhZGRyZXNzIG9mIHRoZSByZXN1bHRpbmcgbWFwcGluZyBpcyByZXR1cm5lZCwgb3IgLTEuIFBvc3NpYmxlCiAgICAgICAgIGVycm9yIGNvZGVzIGluY2x1ZGU6CiAgICAgICAgIDxicj48YnI+IDxETD4KCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5FRkFVTFQ8L0NPREU+CjxERD4KICAgICAgICAgVGhlcmUgaXMgbm8gZXhpc3RpbmcgbWFwcGluZyBpbiBhdCBsZWFzdCBwYXJ0IG9mIHRoZSBvcmlnaW5hbCByZWdpb24sIG9yCiAgICAgICAgIHRoZSByZWdpb24gY292ZXJzIHR3byBvciBtb3JlIGRpc3RpbmN0IG1hcHBpbmdzLgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVJTlZBTAogICAgICAgICBUaGUgYWRkcmVzcyBnaXZlbiBpcyBtaXNhbGlnbmVkIG9yIGluYXBwcm9wcmlhdGUuCiAgICAgICAgIDxicj48YnI+IDxMST4gRUFHQUlOCiAgICAgICAgIFRoZSByZWdpb24gaGFzIHBhZ2VzIGxvY2tlZCwgYW5kIGlmIGV4dGVuZGVkIGl0IHdvdWxkIGV4Y2VlZCB0aGUKICAgICAgICAgcHJvY2VzcydzIHJlc291cmNlIGxpbWl0IGZvciBsb2NrZWQgcGFnZXMuICAuCiAgICAgICAgIDxicj48YnI+IDxMST4gRU5PTUVNCiAgICAgICAgIFRoZSByZWdpb24gaXMgcHJpdmF0ZSB3cml0YWJsZSwgYW5kIGluc3VmZmljaWVudCB2aXJ0dWFsIG1lbW9yeSBpcwogICAgICAgICBhdmFpbGFibGUgdG8gZXh0ZW5kIGl0LiAgQWxzbywgdGhpcyBlcnJvciB3aWxsIG9jY3VyIGlmCiAgICAgICAgIDxDT0RFPk1SRU1BUF9NQVlNT1ZFPC9DT0RFPiBpcyBub3QgZ2l2ZW4gYW5kIHRoZSBleHRlbnNpb24gd291bGQgY29sbGlkZSB3aXRoCiAgICAgICAgIGFub3RoZXIgbWFwcGVkIHJlZ2lvbi4KICAgICAgICAgPGJyPjxicj4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAKc3lzL21tYW4uaHhxAH4TpHQAOXZvaWQgKmFkZHJlc3MsIHNpemVfdCBsZW5ndGgsIHNpemVfdCBuZXdfbGVuZ3RoLCBpbnQgZmxhZ3QABnZvaWQgKnQABW1zeW5jc3EAfgAKdAXbCiAgICAgICAgPGJyPjxicj4gV2hlbiB1c2luZyBzaGFyZWQgbWFwcGluZ3MsIHRoZSBrZXJuZWwgY2FuIHdyaXRlIHRoZSBmaWxlIGF0IGFueSB0aW1lCiAgICAgICAgIGJlZm9yZSB0aGUgbWFwcGluZyBpcyByZW1vdmVkLiAgVG8gYmUgY2VydGFpbiBkYXRhIGhhcyBhY3R1YWxseSBiZWVuCiAgICAgICAgIHdyaXR0ZW4gdG8gdGhlIGZpbGUgYW5kIHdpbGwgYmUgYWNjZXNzaWJsZSB0byBub24tbWVtb3J5LW1hcHBlZCBJL08sIGl0CiAgICAgICAgIGlzIG5lY2Vzc2FyeSB0byB1c2UgdGhpcyBmdW5jdGlvbi4KICAgICAgICAgPGJyPjxicj4gSXQgb3BlcmF0ZXMgb24gdGhlIHJlZ2lvbiA8VkFSPmFkZHJlc3M8L1ZBUj4gdG8gKDxWQVI+YWRkcmVzczwvVkFSPiArIDxWQVI+bGVuZ3RoPC9WQVI+KS4KICAgICAgICAgSXQgbWF5IGJlIHVzZWQgb24gcGFydCBvZiBhIG1hcHBpbmcgb3IgbXVsdGlwbGUgbWFwcGluZ3MsIGhvd2V2ZXIgdGhlCiAgICAgICAgIHJlZ2lvbiBnaXZlbiBzaG91bGQgbm90IGNvbnRhaW4gYW55IHVubWFwcGVkIHNwYWNlLgogICAgICAgICA8YnI+PGJyPiA8VkFSPmZsYWdzPC9WQVI+IGNhbiBjb250YWluIHNvbWUgb3B0aW9uczoKICAgICAgICAgPGJyPjxicj4gPERMPgoKICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPk1TX1NZTkM8L0NPREU+CjxERD4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmbGFnIG1ha2VzIHN1cmUgdGhlIGRhdGEgaXMgYWN0dWFsbHkgd3JpdHRlbiA8RU0+dG8gZGlzazwvRU0+LgogICAgICAgICBOb3JtYWxseSA8Q09ERT5tc3luYzwvQ09ERT4gb25seSBtYWtlcyBzdXJlIHRoYXQgYWNjZXNzZXMgdG8gYSBmaWxlIHdpdGgKICAgICAgICAgY29udmVudGlvbmFsIEkvTyByZWZsZWN0IHRoZSByZWNlbnQgY2hhbmdlcy4KICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPk1TX0FTWU5DPC9DT0RFPgo8REQ+CiAgICAgICAgIDxicj48YnI+IFRoaXMgdGVsbHMgPENPREU+bXN5bmM8L0NPREU+IHRvIGJlZ2luIHRoZSBzeW5jaHJvbml6YXRpb24sIGJ1dCBub3QgdG8gd2FpdCBmb3IKICAgICAgICAgaXQgdG8gY29tcGxldGUuCiAgICAgICAgIDxicj48YnI+IDxicj48YnI+IDwvREw+CiAgICAgICAgIDxicj48YnI+IDxDT0RFPm1zeW5jPC9DT0RFPiByZXR1cm5zIDAgZm9yIHN1Y2Nlc3MgYW5kIC0xIGZvcgogICAgICAgICBlcnJvci4gIEVycm9ycyBpbmNsdWRlOgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+RUlOVkFMPC9DT0RFPgo8REQ+CiAgICAgICAgIEFuIGludmFsaWQgcmVnaW9uIHdhcyBnaXZlbiwgb3IgdGhlIDxWQVI+ZmxhZ3M8L1ZBUj4gd2VyZSBpbnZhbGlkLgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVGQVVMVAogICAgICAgICBUaGVyZSBpcyBubyBleGlzdGluZyBtYXBwaW5nIGluIGF0IGxlYXN0IHBhcnQgb2YgdGhlIGdpdmVuIHJlZ2lvbi4KICAgICAgICAgPGJyPjxicj4KICAgICAgICAgPGJyPjxicj4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAKc3lzL21tYW4uaHhxAH4Tq3QAJ3ZvaWQgKmFkZHJlc3MsIHNpemVfdCBsZW5ndGgsIGludCBmbGFnc3QAA2ludHQABm10cmFjZXNxAH4ACnQExgogICAgICAgIFdoZW4gdGhlIDxDT0RFPm10cmFjZTwvQ09ERT4gZnVuY3Rpb24gaXMgY2FsbGVkIGl0IGxvb2tzIGZvciBhbiBlbnZpcm9ubWVudAogICAgICAgICB2YXJpYWJsZSBuYW1lZCA8Q09ERT5NQUxMT0NfVFJBQ0U8L0NPREU+LiAgVGhpcyB2YXJpYWJsZSBpcyBzdXBwb3NlZCB0bwogICAgICAgICBjb250YWluIGEgdmFsaWQgZmlsZSBuYW1lLiAgVGhlIHVzZXIgbXVzdCBoYXZlIHdyaXRlIGFjY2Vzcy4gIElmIHRoZQogICAgICAgICBmaWxlIGFscmVhZHkgZXhpc3RzIGl0IGlzIHRydW5jYXRlZC4gIElmIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3QKICAgICAgICAgc2V0IG9yIGl0IGRvZXMgbm90IG5hbWUgYSB2YWxpZCBmaWxlIHdoaWNoIGNhbiBiZSBvcGVuZWQgZm9yIHdyaXRpbmcKICAgICAgICAgbm90aGluZyBpcyBkb25lLiAgVGhlIGJlaGF2aW9yIG9mIDxDT0RFPm1hbGxvYzwvQ09ERT4gZXRjLiBpcyBub3QgY2hhbmdlZC4KICAgICAgICAgRm9yIG9idmlvdXMgcmVhc29ucyB0aGlzIGFsc28gaGFwcGVucyBpZiB0aGUgYXBwbGljYXRpb24gaXMgaW5zdGFsbGVkCiAgICAgICAgIHdpdGggdGhlIFNVSUQgb3IgU0dJRCBiaXQgc2V0LgogICAgICAgICA8YnI+PGJyPiBJZiB0aGUgbmFtZWQgZmlsZSBpcyBzdWNjZXNzZnVsbHkgb3BlbmVkLCA8Q09ERT5tdHJhY2U8L0NPREU+IGluc3RhbGxzIHNwZWNpYWwKICAgICAgICAgaGFuZGxlcnMgZm9yIHRoZSBmdW5jdGlvbnMgPENPREU+bWFsbG9jPC9DT0RFPiwgPENPREU+cmVhbGxvYzwvQ09ERT4sIGFuZAogICAgICAgICA8Q09ERT5mcmVlPC9DT0RFPiAuICBGcm9tIHRoZW4gb24sIGFsbCB1c2VzIG9mIHRoZXNlCiAgICAgICAgIGZ1bmN0aW9ucyBhcmUgdHJhY2VkIGFuZCBwcm90b2NvbGxlZCBpbnRvIHRoZSBmaWxlLiAgVGhlcmUgaXMgbm93IG9mCiAgICAgICAgIGNvdXJzZSBhIHNwZWVkIHBlbmFsdHkgZm9yIGFsbCBjYWxscyB0byB0aGUgdHJhY2VkIGZ1bmN0aW9ucyBzbyB0cmFjaW5nCiAgICAgICAgIHNob3VsZCBub3QgYmUgZW5hYmxlZCBkdXJpbmcgbm9ybWFsIHVzZS4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiBpcyBhIEdOVSBleHRlbnNpb24gYW5kIGdlbmVyYWxseSBub3QgYXZhaWxhYmxlIG9uIG90aGVyCiAgICAgICAgIHN5c3RlbXMuICBUaGUgcHJvdG90eXBlIGNhbiBiZSBmb3VuZCBpbiA8VFQ+bWNoZWNrLmg8L1RUPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIbWNoZWNrLmh4cQB+E7J0AAR2b2lkdAAEdm9pZHQAB211bmxvY2tzcQB+AAp0AUYKICAgICAgICA8YnI+PGJyPiA8Q09ERT5tdW5sb2NrPC9DT0RFPiB1bmxvY2tzIGEgcmFuZ2Ugb2YgdGhlIGNhbGxpbmcgcHJvY2VzcycgdmlydHVhbCBwYWdlcy4KICAgICAgICAgPGJyPjxicj4gPENPREU+bXVubG9jazwvQ09ERT4gaXMgdGhlIGludmVyc2Ugb2YgPENPREU+bWxvY2s8L0NPREU+IGFuZCBmdW5jdGlvbnMgY29tcGxldGVseQogICAgICAgICBhbmFsb2dvdXNseSB0byA8Q09ERT5tbG9jazwvQ09ERT4sIGV4Y2VwdCB0aGF0IHRoZXJlIGlzIG5vIDxDT0RFPkVQRVJNPC9DT0RFPgogICAgICAgICBmYWlsdXJlLgogICAgICAgICA8YnI+PGJyPgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AApzeXMvbW1hbi5oeHEAfhO5dAAcY29uc3Qgdm9pZCAqYWRkciwgc2l6ZV90IGxlbnQAA2ludHQACm11bmxvY2thbGxzcQB+AAp0AhMKICAgICAgICA8YnI+PGJyPiA8Q09ERT5tdW5sb2NrYWxsPC9DT0RFPiB1bmxvY2tzIGV2ZXJ5IHBhZ2UgaW4gdGhlIGNhbGxpbmcgcHJvY2VzcycgdmlydHVhbAogICAgICAgICBhZGRyZXNzIHNwYWNlIGFuZCB0dXJuIG9mZiA8Q09ERT5NQ0xfRlVUVVJFPC9DT0RFPiBmdXR1cmUgbG9ja2luZyBtb2RlLgogICAgICAgICA8YnI+PGJyPiBUaGUgcmV0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ICAgIDc1NCBzeXN0ZW1zLCB0aGVyZSBhcmUgbWFueSByZXByZXNlbnRhdGlvbnMgb2YgTmFOLCBhbmQgPFZBUj50YWdwPC9WQVI+CiAgICAgICAgIHNlbGVjdHMgb25lLiAgT24gb3RoZXIgc3lzdGVtcyBpdCBtYXkgZG8gbm90aGluZy4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGbWF0aC5oeHEAfhPjdAAQY29uc3QgY2hhciAqdGFncHQAC2xvbmcgZG91YmxldAAJbmFub3NsZWVwc3EAfgAKdAhfCiAgICAgICAgSWYgcmVzb2x1dGlvbiB0byBzZWNvbmRzIGlzIG5vdCBlbm91Z2ggdGhlIDxDT0RFPm5hbm9zbGVlcDwvQ09ERT4gZnVuY3Rpb24gY2FuCiAgICAgICAgIGJlIHVzZWQuICBBcyB0aGUgbmFtZSBzdWdnZXN0cyB0aGUgc2xlZXAgaW50ZXJ2YWwgY2FuIGJlIHNwZWNpZmllZCBpbgogICAgICAgICBuYW5vc2Vjb25kcy4gIFRoZSBhY3R1YWwgZWxhcHNlZCB0aW1lIG9mIHRoZSBzbGVlcCBpbnRlcnZhbCBtaWdodCBiZQogICAgICAgICBsb25nZXIgc2luY2UgdGhlIHN5c3RlbSByb3VuZHMgdGhlIGVsYXBzZWQgdGltZSB5b3UgcmVxdWVzdCB1cCB0byB0aGUKICAgICAgICAgbmV4dCBpbnRlZ2VyIG11bHRpcGxlIG9mIHRoZSBhY3R1YWwgcmVzb2x1dGlvbiB0aGUgc3lzdGVtIGNhbiBkZWxpdmVyLgogICAgICAgICA8YnI+PGJyPiAqPENPREU+cmVxdWVzdGVkX3RpbWU8L0NPREU+IGlzIHRoZSBlbGFwc2VkIHRpbWUgb2YgdGhlIGludGVydmFsIHlvdSB3YW50IHRvCiAgICAgICAgIHNsZWVwLgogICAgICAgICA8YnI+PGJyPiBUaGUgZnVuY3Rpb24gcmV0dXJucyBhcyAqPENPREU+cmVtYWluaW5nPC9DT0RFPiB0aGUgZWxhcHNlZCB0aW1lIGxlZnQgaW4gdGhlCiAgICAgICAgIGludGVydmFsIGZvciB3aGljaCB5b3UgcmVxdWVzdGVkIHRvIHNsZWVwLiAgSWYgdGhlIGludGVydmFsIGNvbXBsZXRlZAogICAgICAgICB3aXRob3V0IGdldHRpbmcgaW50ZXJydXB0ZWQgYnkgYSBzaWduYWwsIHRoaXMgaXMgemVyby4KICAgICAgICAgPGJyPjxicj4gPENPREU+c3RydWN0IHRpbWVzcGVjPC9DT0RFPiBpcyBkZXNjcmliZWQgaW4gLgogICAgICAgICA8YnI+PGJyPiBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBiZWNhdXNlIHRoZSBpbnRlcnZhbCBpcyBvdmVyIHRoZSByZXR1cm4gdmFsdWUgaXMKICAgICAgICAgemVyby4gIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zIC0xIHRoZSBnbG9iYWwgdmFyaWFibGUgPFZBUj5lcnJubzwvVkFSPgogICAgICAgICBpcyBzZXQgdG8gdGhlIGZvbGxvd2luZyB2YWx1ZXM6CiAgICAgICAgIDxicj48YnI+IDxETD4KCiAgICAgICAgIDxEVD48Q09ERT5FSU5UUjwvQ09ERT4KPEREPgogICAgICAgICBUaGUgY2FsbCB3YXMgaW50ZXJydXB0ZWQgYmVjYXVzZSBhIHNpZ25hbCB3YXMgZGVsaXZlcmVkIHRvIHRoZSB0aHJlYWQuCiAgICAgICAgIElmIHRoZSA8VkFSPnJlbWFpbmluZzwvVkFSPiBwYXJhbWV0ZXIgaXMgbm90IHRoZSBudWxsIHBvaW50ZXIgdGhlIHN0cnVjdHVyZQogICAgICAgICBwb2ludGVkIHRvIGJ5IDxWQVI+cmVtYWluaW5nPC9WQVI+IGlzIHVwZGF0ZWQgdG8gY29udGFpbiB0aGUgcmVtYWluaW5nCiAgICAgICAgIGVsYXBzZWQgdGltZS4KICAgICAgICAgPGJyPjxicj4gPExJPiBFSU5WQUwKICAgICAgICAgVGhlIG5hbm9zZWNvbmQgdmFsdWUgaW4gdGhlIDxWQVI+cmVxdWVzdGVkX3RpbWU8L1ZBUj4gcGFyYW1ldGVyIGNvbnRhaW5zIGFuCiAgICAgICAgIGlsbGVnYWwgdmFsdWUuICBFaXRoZXIgdGhlIHZhbHVlIGlzIG5lZ2F0aXZlIG9yIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0bwogICAgICAgICAxMDAwIG1pbGxpb24uCgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGluIG11bHRpLXRocmVhZGVkIHByb2dyYW1zLiAgVGhpcwogICAgICAgICBpcyBhIHByb2JsZW0gaWYgdGhlIHRocmVhZCBhbGxvY2F0ZXMgc29tZSByZXNvdXJjZXMgKGxpa2UgbWVtb3J5LCBmaWxlCiAgICAgICAgIGRlc2NyaXB0b3JzLCBzZW1hcGhvcmVzIG9yIHdoYXRldmVyKSBhdCB0aGUgdGltZSA8Q09ERT5uYW5vc2xlZXA8L0NPREU+IGlzCiAgICAgICAgIGNhbGxlZC4gIElmIHRoZSB0aHJlYWQgZ2V0cyBjYW5jZWxlZCB0aGVzZSByZXNvdXJjZXMgc3RheSBhbGxvY2F0ZWQKICAgICAgICAgdW50aWwgdGhlIHByb2dyYW0gZW5kcy4gIFRvIGF2b2lkIHRoaXMgY2FsbHMgdG8gPENPREU+bmFub3NsZWVwPC9DT0RFPiBzaG91bGQKICAgICAgICAgYmUgcHJvdGVjdGVkIHVzaW5nIGNhbmNlbGxhdGlvbiBoYW5kbGVycy4KICAgICAgICAgPGJyPjxicj4gVGhlIDxDT0RFPm5hbm9zbGVlcDwvQ09ERT4gZnVuY3Rpb24gaXMgZGVjbGFyZWQgaW4gPFRUPnRpbWUuaDwvVFQ+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZ0aW1lLmh4cQB+E+p0AEFjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnJlcXVlc3RlZF90aW1lLCBzdHJ1Y3QgdGltZXNwZWMgKnJlbWFpbmluZ3QAA2ludHQACW5lYXJieWludHNxAH4ACnQArgogICAgICAgIFRoZXNlIGZ1bmN0aW9ucyByZXR1cm4gdGhlIHNhbWUgdmFsdWUgYXMgdGhlIDxDT0RFPnJpbnQ8L0NPREU+IGZ1bmN0aW9ucywgYnV0CiAgICAgICAgIGRvIG5vdCByYWlzZSB0aGUgaW5leGFjdCBleGNlcHRpb24gaWYgPFZBUj54PC9WQVI+IGlzIG5vdCBhbiBpbnRlZ2VyLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZtYXRoLmh4cQB+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ZSBmdW5jdGlvbiBzaW1wbHkgcmV0dXJucyA8VkFSPnk8L1ZBUj4uICBJZiBlaXRoZXIKICAgICAgICAgdmFsdWUgaXMgPENPREU+TmFOPC9DT0RFPiwgPENPREU+TmFOPC9DT0RFPiBpcyByZXR1cm5lZC4gIE90aGVyd2lzZQogICAgICAgICBhIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHZhbHVlIG9mIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgaW4gdGhlCiAgICAgICAgIG1hbnRpc3NhIGlzIGFkZGVkIG9yIHN1YnRyYWN0ZWQsIGRlcGVuZGluZyBvbiB0aGUgZGlyZWN0aW9uLgogICAgICAgICA8Q09ERT5uZXh0YWZ0ZXI8L0NPREU+IHdpbGwgc2lnbmFsIG92ZXJmbG93IG9yIHVuZGVyZmxvdyBpZiB0aGUgcmVzdWx0IGdvZXMKICAgICAgICAgb3V0c2lkZSBvZiB0aGUgcmFuZ2Ugb2Ygbm9ybWFsaXplZCBudW1iZXJzLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIGlzIGRlZmluZWQgaW4gSUVDIDU1OSAoYW5kIHRoZSBhcHBlbmRpeCB3aXRoCiAgICAgICAgIHJlY29tbWVuZGVkIGZ1bmN0aW9ucyBpbiBJRUVFIDc1NC9JRUVFIDg1NCkuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQABm1hdGguaHhxAH4UFHQAHGxvbmcgZG91YmxlIHgsIGxvbmcgZG91YmxlIHl0AAtsb25nIGRvdWJsZXQACm5leHR0b3dhcmRzcQB+AAp0ALoKICAgICAgICBUaGVzZSBmdW5jdGlvbnMgYXJlIGlkZW50aWNhbCB0byB0aGUgY29ycmVzcG9uZGluZyB2ZXJzaW9ucyBvZgogICAgICAgICA8Q09ERT5uZXh0YWZ0ZXI8L0NPREU+IGV4Y2VwdCB0aGF0IHRoZWlyIHNlY29uZCBhcmd1bWVudCBpcyBhIDxDT0RFPmxvbmcKICAgICAgICAgZG91YmxlPC9DT0RFPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGbWF0aC5oeHEAfhQbdAAXZG91YmxlIHgsIGxvbmcgZG91YmxlIHl0AAZkb3VibGV0AAtuZXh0dG93YXJkZnNxAH4ACnQAugogICAgICAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUgaWRlbnRpY2FsIHRvIHRoZSBjb3JyZXNwb25kaW5nIHZlcnNpb25zIG9mCiAgICAgICAgIDxDT0RFPm5leHRhZnRlcjwvQ09ERT4gZXhjZXB0IHRoYXQgdGhlaXIgc2Vjb25kIGFyZ3VtZW50IGlzIGEgPENPREU+bG9uZwogICAgICAgICBkb3VibGU8L0NPREU+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZtYXRoLmh4cQB+FCJ0ABZmbG9hdCB4LCBsb25nIGRvdWJsZSB5dAAFZmxvYXR0AAtuZXh0dG93YXJkbHNxAH4ACnQAugogICAgICAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUgaWRlbnRpY2FsIHRvIHRoZSBjb3JyZXNwb25kaW5nIHZlcnNpb25zIG9mCiAgICAgICAgIDxDT0RFPm5leHRhZnRlcjwvQ09ERT4gZXhjZXB0IHRoYXQgdGhlaXIgc2Vjb25kIGFyZ3VtZW50IGlzIGEgPENPREU+bG9uZwogICAgICAgICBkb3VibGU8L0NPREU+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZtYXRoLmh4cQB+FCl0ABxsb25nIGRvdWJsZSB4LCBsb25nIGRvdWJsZSB5dAALbG9uZyBkb3VibGV0AARuZnR3c3EAfgAKdA3SCiAgICAgICAgVGhlIDxDT0RFPm5mdHc8L0NPREU+IGZ1bmN0aW9uIHdvcmtzIGxpa2UgdGhlIDxDT0RFPmZ0dzwvQ09ERT4gZnVuY3Rpb25zLiAgVGhleSBjYWxsCiAgICAgICAgIHRoZSBjYWxsYmFjayBmdW5jdGlvbiA8VkFSPmZ1bmM8L1ZBUj4gZm9yIGFsbCBpdGVtcyBmb3VuZCBpbiB0aGUgZGlyZWN0b3J5CiAgICAgICAgIDxWQVI+ZmlsZW5hbWU8L1ZBUj4gYW5kIGJlbG93LiAgQXQgbW9zdCA8VkFSPmRlc2NyaXB0b3JzPC9WQVI+IGZpbGUgZGVzY3JpcHRvcnMKICAgICAgICAgYXJlIGNvbnN1bWVkIGR1cmluZyB0aGUgPENPREU+bmZ0dzwvQ09ERT4gY2FsbC4KICAgICAgICAgPGJyPjxicj4gT25lIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gaXMgb2YgYSBkaWZmZXJlbnQgdHlwZS4gIEl0CiAgICAgICAgIGlzIG9mIHR5cGUgPENPREU+c3RydWN0IEZUVyAqPC9DT0RFPiBhbmQgcHJvdmlkZXMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uCiAgICAgICAgIHdpdGggdGhlIGV4dHJhIGluZm9ybWF0aW9uIGRlc2NyaWJlZCBhYm92ZS4KICAgICAgICAgPGJyPjxicj4gQSBzZWNvbmQgZGlmZmVyZW5jZSBpcyB0aGF0IDxDT0RFPm5mdHc8L0NPREU+IHRha2VzIGEgZm91cnRoIGFyZ3VtZW50LCB3aGljaAogICAgICAgICBpcyAwIG9yIGEgYml0d2lzZS1PUiBjb21iaW5hdGlvbiBvZiBhbnkgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMuCiAgICAgICAgIDxicj48YnI+IDxETD4KCiAgICAgICAgIDxEVD48Q09ERT5GVFdfUEhZUzwvQ09ERT4KPEREPgogICAgICAgICBXaGlsZSB0cmF2ZXJzaW5nIHRoZSBkaXJlY3Rvcnkgc3ltYm9saWMgbGlua3MgYXJlIG5vdCBmb2xsb3dlZC4gIEluc3RlYWQKICAgICAgICAgc3ltYm9saWMgbGlua3MgYXJlIHJlcG9ydGVkIHVzaW5nIHRoZSA8Q09ERT5GVFdfU0w8L0NPREU+IHZhbHVlIGZvciB0aGUgdHlwZQogICAgICAgICBwYXJhbWV0ZXIgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLiAgSWYgdGhlIGZpbGUgcmVmZXJlbmNlZCBieSBhCiAgICAgICAgIHN5bWJvbGljIGxpbmsgZG9lcyBub3QgZXhpc3QgPENPREU+RlRXX1NMTjwvQ09ERT4gaXMgcmV0dXJuZWQgaW5zdGVhZC4KICAgICAgICAgPERUPjxDT0RFPkZUV19NT1VOVDwvQ09ERT4KPEREPgogICAgICAgICBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgZm9yIGl0ZW1zIHdoaWNoIGFyZSBvbiB0aGUgc2FtZQogICAgICAgICBtb3VudGVkIGZpbGVzeXN0ZW0gYXMgdGhlIGRpcmVjdG9yeSBnaXZlbiBieSB0aGUgPFZBUj5maWxlbmFtZTwvVkFSPgogICAgICAgICBwYXJhbWV0ZXIgdG8gPENPREU+bmZ0dzwvQ09ERT4uCiAgICAgICAgIDxEVD48Q09ERT5GVFdfQ0hESVI8L0NPREU+CjxERD4KICAgICAgICAgSWYgdGhpcyBmbGFnIGlzIGdpdmVuIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGlzIGNoYW5nZWQgdG8gdGhlCiAgICAgICAgIGRpcmVjdG9yeSBvZiB0aGUgcmVwb3J0ZWQgb2JqZWN0IGJlZm9yZSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gaXMgY2FsbGVkLgogICAgICAgICBXaGVuIDxDT0RFPm50Znc8L0NPREU+IGZpbmFsbHkgcmV0dXJucyB0aGUgY3VycmVudCBkaXJlY3RvcnkgaXMgcmVzdG9yZWQgdG8KICAgICAgICAgaXRzIG9yaWdpbmFsIHZhbHVlLgogICAgICAgICA8RFQ+PENPREU+RlRXX0RFUFRIPC9DT0RFPgo8REQ+CiAgICAgICAgIElmIHRoaXMgb3B0aW9uIGlzIHNwZWNpZmllZCB0aGVuIGFsbCBzdWJkaXJlY3RvcmllcyBhbmQgZmlsZXMgd2l0aGluCiAgICAgICAgIHRoZW0gYXJlIHByb2Nlc3NlZCBiZWZvcmUgcHJvY2Vzc2luZyB0aGUgdG9wIGRpcmVjdG9yeSBpdHNlbGYKICAgICAgICAgKGRlcHRoLWZpcnN0IHByb2Nlc3NpbmcpLiAgVGhpcyBhbHNvIG1lYW5zIHRoZSB0eXBlIGZsYWcgZ2l2ZW4gdG8gdGhlCiAgICAgICAgIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIDxDT0RFPkZUV19EUDwvQ09ERT4gYW5kIG5vdCA8Q09ERT5GVFdfRDwvQ09ERT4uCiAgICAgICAgIDxEVD48Q09ERT5GVFdfQUNUSU9OUkVUVkFMPC9DT0RFPgo8REQ+CiAgICAgICAgIElmIHRoaXMgb3B0aW9uIGlzIHNwZWNpZmllZCB0aGVuIHJldHVybiB2YWx1ZXMgZnJvbSBjYWxsYmFja3MKICAgICAgICAgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHkuICBJZiB0aGUgY2FsbGJhY2sgcmV0dXJucyA8Q09ERT5GVFdfQ09OVElOVUU8L0NPREU+LAogICAgICAgICB3YWxraW5nIGNvbnRpbnVlcyBub3JtYWxseS4gIDxDT0RFPkZUV19TVE9QPC9DT0RFPiBtZWFucyB3YWxraW5nIHN0b3BzCiAgICAgICAgIGFuZCA8Q09ERT5GVFdfU1RPUDwvQ09ERT4gaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4gIElmIDxDT0RFPkZUV19TS0lQX1NVQlRSRUU8L0NPREU+CiAgICAgICAgIGlzIHJldHVybmVkIGJ5IHRoZSBjYWxsYmFjayB3aXRoIDxDT0RFPkZUV19EPC9DT0RFPiBhcmd1bWVudCwgdGhlIHN1YnRyZWUKICAgICAgICAgaXMgc2tpcHBlZCBhbmQgd2Fsa2luZyBjb250aW51ZXMgd2l0aCBuZXh0IHNpYmxpbmcgb2YgdGhlIGRpcmVjdG9yeS4KICAgICAgICAgSWYgPENPREU+RlRXX1NLSVBfU0lCTElOR1M8L0NPREU+IGlzIHJldHVybmVkIGJ5IHRoZSBjYWxsYmFjaywgYWxsIHNpYmxpbmdzCiAgICAgICAgIG9mIHRoZSBjdXJyZW50IGVudHJ5IGFyZSBza2lwcGVkIGFuZCB3YWxraW5nIGNvbnRpbnVlcyBpbiBpdHMgcGFyZW50LgogICAgICAgICBObyBvdGhlciByZXR1cm4gdmFsdWVzIHNob3VsZCBiZSByZXR1cm5lZCBmcm9tIHRoZSBjYWxsYmFja3MgaWYKICAgICAgICAgdGhpcyBvcHRpb24gaXMgc2V0LiAgVGhpcyBvcHRpb24gaXMgYSBHTlUgZXh0ZW5zaW9uLgogICAgICAgICA8L0RMPgogICAgICAgICA8YnI+PGJyPiBUaGUgcmV0dXJuIHZhbHVlIGlzIGNvbXB1dGVkIGluIHRoZSBzYW1lIHdheSBhcyBmb3IgPENPREU+ZnR3PC9DT0RFPi4KICAgICAgICAgPENPREU+bmZ0dzwvQ09ERT4gcmV0dXJucyAwIGlmIG5vIGZhaWx1cmVzIG9jY3VycmVkIGFuZCBhbGwgY2FsbGJhY2sKICAgICAgICAgZnVuY3Rpb25zIHJldHVybmVkIDAuICBJbiBjYXNlIG9mIGludGVybmFsIGVycm9ycywgc3VjaCBhcyBtZW1vcnkKICAgICAgICAgcHJvYmxlbXMsIHRoZSByZXR1cm4gdmFsdWUgaXMgLTEgYW5kIDxWQVI+ZXJybm88L1ZBUj4gaXMgc2V0CiAgICAgICAgIGFjY29yZGluZ2x5LiAgSWYgdGhlIHJldHVybiB2YWx1ZSBvZiBhIGNhbGxiYWNrIGludm9jYXRpb24gd2FzIG5vbi16ZXJvCiAgICAgICAgIHRoZW4gdGhhdCB2YWx1ZSBpcyByZXR1cm5lZC4KICAgICAgICAgPGJyPjxicj4gV2hlbiB0aGUgc291cmNlcyBhcmUgY29tcGlsZWQgd2l0aCA8Q09ERT5fRklMRV9PRkZTRVRfQklUUyA9PSA2NDwvQ09ERT4gb24gYQogICAgICAgICAzMi1iaXQgc3lzdGVtIHRoaXMgZnVuY3Rpb24gaXMgaW4gZmFjdCA8Q09ERT5uZnR3NjQ8L0NPREU+LCBpLmUuLCB0aGUgTEZTCiAgICAgICAgIGludGVyZmFjZSB0cmFuc3BhcmVudGx5IHJlcGxhY2VzIHRoZSBvbGQgaW50ZXJmYWNlLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAVmdHcuaHhxAH4UMHQAQ2NvbnN0IGNoYXIgKmZpbGVuYW1lLCBfX25mdHdfZnVuY190IGZ1bmMsIGludCBkZXNjcmlwdG9ycywgaW50IGZsYWd0AANpbnR0AAZuZnR3NjRzcQB+AAp0AgIKICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gPENPREU+bmZ0dzwvQ09ERT4gYnV0IGl0IGNhbiB3b3JrIG9uIGZpbGVzeXN0ZW1zCiAgICAgICAgIHdpdGggbGFyZ2UgZmlsZXMuICBGaWxlIGluZm9ybWF0aW9uIGlzIHJlcG9ydGVkIHVzaW5nIGEgdmFyaWFibGUgb2YgdHlwZQogICAgICAgICA8Q09ERT5zdHJ1Y3Qgc3RhdDY0PC9DT0RFPiB3aGljaCBpcyBwYXNzZWQgYnkgcmVmZXJlbmNlIHRvIHRoZSBjYWxsYmFjawogICAgICAgICBmdW5jdGlvbi4KICAgICAgICAgPGJyPjxicj4gV2hlbiB0aGUgc291cmNlcyBhcmUgY29tcGlsZWQgd2l0aCA8Q09ERT5fRklMRV9PRkZTRVRfQklUUyA9PSA2NDwvQ09ERT4gb24gYQogICAgICAgICAzMi1iaXQgc3lzdGVtIHRoaXMgZnVuY3Rpb24gaXMgYXZhaWxhYmxlIHVuZGVyIHRoZSBuYW1lIDxDT0RFPm5mdHc8L0NPREU+IGFuZAogICAgICAgICB0cmFuc3BhcmVudGx5IHJlcGxhY2VzIHRoZSBvbGQgaW1wbGVtZW50YXRpb24uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQABWZ0dy5oeHEAfhQ3dABFY29uc3QgY2hhciAqZmlsZW5hbWUsIF9fbmZ0dzY0X2Z1bmNfdCBmdW5jLCBpbnQgZGVzY3JpcHRvcnMsIGludCBmbGFndAADaW50dAAIbmdldHRleHRzcQB+AAp0BAgKICAgICAgICBUaGUgPENPREU+bmdldHRleHQ8L0NPREU+IGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gdGhlIDxDT0RFPmdldHRleHQ8L0NPREU+IGZ1bmN0aW9uCiAgICAgICAgIGFzIGl0IGZpbmRzIHRoZSBtZXNzYWdlIGNhdGFsb2dzIGluIHRoZSBzYW1lIHdheS4gIEJ1dCBpdCB0YWtlcyB0d28KICAgICAgICAgZXh0cmEgYXJndW1lbnRzLiAgVGhlIDxWQVI+bXNnaWQxPC9WQVI+IHBhcmFtZXRlciBtdXN0IGNvbnRhaW4gdGhlIHNpbmd1bGFyCiAgICAgICAgIGZvcm0gb2YgdGhlIHN0cmluZyB0byBiZSBjb252ZXJ0ZWQuICBJdCBpcyBhbHNvIHVzZWQgYXMgdGhlIGtleSBmb3IgdGhlCiAgICAgICAgIHNlYXJjaCBpbiB0aGUgY2F0YWxvZy4gIFRoZSA8VkFSPm1zZ2lkMjwvVkFSPiBwYXJhbWV0ZXIgaXMgdGhlIHBsdXJhbCBmb3JtLgogICAgICAgICBUaGUgcGFyYW1ldGVyIDxWQVI+bjwvVkFSPiBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgcGx1cmFsIGZvcm0uICBJZiBubwogICAgICAgICBtZXNzYWdlIGNhdGFsb2cgaXMgZm91bmQgPFZBUj5tc2dpZDE8L1ZBUj4gaXMgcmV0dXJuZWQgaWYgPENPREU+biA9PSAxPC9DT0RFPiwKICAgICAgICAgb3RoZXJ3aXNlIDxDT0RFPm1zZ2lkMjwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IEFuIGV4YW1wbGUgZm9yIHRoZSB1cyBvZiB0aGlzIGZ1bmN0aW9uIGlzOgogICAgICAgICA8YnI+PGJyPiA8cHJlPjxicj4KICAgICAgICAgICBwcmludGYgKG5nZXR0ZXh0ICgiJWQgZmlsZSByZW1vdmVkIiwgIiVkIGZpbGVzIHJlbW92ZWQiLCBuKSwgbik7PGJyPgogICAgICAgICA8L3ByZT4KICAgICAgICAgPGJyPjxicj4gUGxlYXNlIG5vdGUgdGhhdCB0aGUgbnVtZXJpYyB2YWx1ZSA8VkFSPm48L1ZBUj4gaGFzIHRvIGJlIHBhc3NlZCB0byB0aGUKICAgICAgICAgPENPREU+cHJpbnRmPC9DT0RFPiBmdW5jdGlvbiBhcyB3ZWxsLiAgSXQgaXMgbm90IHN1ZmZpY2llbnQgdG8gcGFzcyBpdCBvbmx5IHRvCiAgICAgICAgIDxDT0RFPm5nZXR0ZXh0PC9DT0RFPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAJbGliaW50bC5oeHEAfhQ+dAA7Y29uc3QgY2hhciAqbXNnaWQxLCBjb25zdCBjaGFyICptc2dpZDIsIHVuc2lnbmVkIGxvbmcgaW50IG50AAZjaGFyICp0AARuaWNlc3EAfgAKdAMJCiAgICAgICAgSW5jcmVtZW50IHRoZSBuaWNlIHZhbHVlIG9mIHRoZSBjYWxsaW5nIHByb2Nlc3MgYnkgPFZBUj5pbmNyZW1lbnQ8L1ZBUj4uCiAgICAgICAgIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIG5ldyBuaWNlIHZhbHVlIG9uIHN1Y2Nlc3MsIGFuZCA8Q09ERT4tMTwvQ09ERT4gb24KICAgICAgICAgZmFpbHVyZS4gIEluIHRoZSBjYXNlIG9mIGZhaWx1cmUsIDxDT0RFPmVycm5vPC9DT0RFPiB3aWxsIGJlIHNldCB0byB0aGUKICAgICAgICAgc2FtZSB2YWx1ZXMgYXMgZm9yIDxDT0RFPnNldHByaW9yaXR5PC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gPGJyPjxicj4gSGVyZSBpcyBhbiBlcXVpdmFsZW50IGRlZmluaXRpb24gb2YgPENPREU+bmljZTwvQ09ERT46CiAgICAgICAgIDxicj48YnI+IDxwcmU+PGJyPgogICAgICAgICBpbnQ8YnI+CiAgICAgICAgIG5pY2UgKGludCBpbmNyZW1lbnQpPGJyPgogICAgICAgICB7PGJyPgogICAgICAgICAgIGludCByZXN1bHQsIG9sZCA9IGdldHByaW9yaXR5IChQUklPX1BST0NFU1MsIDApOzxicj4KICAgICAgICAgICByZXN1bHQgPSBzZXRwcmlvcml0eSAoUFJJT19QUk9DRVNTLCAwLCBvbGQgKyBpbmNyZW1lbnQpOzxicj4KICAgICAgICAgICBpZiAocmVzdWx0ICE9IC0xKTxicj4KICAgICAgICAgICAgICAgcmV0dXJuIG9sZCArIGluY3JlbWVudDs8YnI+CiAgICAgICAgICAgZWxzZTxicj4KICAgICAgICAgICAgICAgcmV0dXJuIC0xOzxicj4KICAgICAgICAgfTxicj4KICAgICAgICAgPC9wcmU+CiAgICAgICAgc3EAfgAPAAAAAncEAAAAAnQADnN5cy9yZXNvdXJjZS5odAAIdW5pc3RkLmh4cQB+FEV0AA1pbnQgaW5jcmVtZW50dAADaW50dAALbmxfbGFuZ2luZm9zcQB+AAp0M2UKICAgICAgICBUaGUgPENPREU+bmxfbGFuZ2luZm88L0NPREU+IGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGFjY2VzcyBpbmRpdmlkdWFsCiAgICAgICAgIGVsZW1lbnRzIG9mIHRoZSBsb2NhbGUgY2F0ZWdvcmllcy4gIFVubGlrZSB0aGUgPENPREU+bG9jYWxlY29udjwvQ09ERT4KICAgICAgICAgZnVuY3Rpb24sIHdoaWNoIHJldHVybnMgYWxsIHRoZSBpbmZvcm1hdGlvbiwgPENPREU+bmxfbGFuZ2luZm88L0NPREU+CiAgICAgICAgIGxldHMgdGhlIGNhbGxlciBzZWxlY3Qgd2hhdCBpbmZvcm1hdGlvbiBpdCByZXF1aXJlcy4gIFRoaXMgaXMgdmVyeQogICAgICAgICBmYXN0IGFuZCBpdCBpcyBub3QgYSBwcm9ibGVtIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBtdWx0aXBsZSB0aW1lcy4KICAgICAgICAgPGJyPjxicj4gQSBzZWNvbmQgYWR2YW50YWdlIGlzIHRoYXQgaW4gYWRkaXRpb24gdG8gdGhlIG51bWVyaWMgYW5kIG1vbmV0YXJ5CiAgICAgICAgIGZvcm1hdHRpbmcgaW5mb3JtYXRpb24sIGluZm9ybWF0aW9uIGZyb20gdGhlCiAgICAgICAgIDxDT0RFPkxDX1RJTUU8L0NPREU+IGFuZCA8Q09ERT5MQ19NRVNTQUdFUzwvQ09ERT4gY2F0ZWdvcmllcyBpcyBhdmFpbGFibGUuCiAgICAgICAgIDxicj48YnI+IFRoZSB0eXBlIDxDT0RFPm5sX3R5cGU8L0NPREU+IGlzIGRlZmluZWQgaW4gPFRUPm5sX3R5cGVzLmg8L1RUPi4gIFRoZSBhcmd1bWVudAogICAgICAgICA8VkFSPml0ZW08L1ZBUj4gaXMgYSBudW1lcmljIHZhbHVlIGRlZmluZWQgaW4gdGhlIGhlYWRlciA8VFQ+bGFuZ2luZm8uaDwvVFQ+LgogICAgICAgICBUaGUgWC9PcGVuIHN0YW5kYXJkIGRlZmluZXMgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CiAgICAgICAgIDxicj48YnI+IDxETD4KCiAgICAgICAgIDxEVD48Q09ERT5DT0RFU0VUPC9DT0RFPgo8REQ+CiAgICAgICAgIDxDT0RFPm5sX2xhbmdpbmZvPC9DT0RFPiByZXR1cm5zIGEgc3RyaW5nIHdpdGggdGhlIG5hbWUgb2YgdGhlIGNvZGVkIGNoYXJhY3RlcgogICAgICAgICBzZXQgdXNlZCBpbiB0aGUgc2VsZWN0ZWQgbG9jYWxlLgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+QUJEQVlfMTwvQ09ERT4KPEREPgogICAgICAgICA8TEk+eCBBQkRBWV8yCiAgICAgICAgIDxMST54IEFCREFZXzMKICAgICAgICAgPExJPnggQUJEQVlfNAogICAgICAgICA8TEk+eCBBQkRBWV81CiAgICAgICAgIDxMST54IEFCREFZXzYKICAgICAgICAgPExJPnggQUJEQVlfNwogICAgICAgICA8Q09ERT5ubF9sYW5naW5mbzwvQ09ERT4gcmV0dXJucyB0aGUgYWJicmV2aWF0ZWQgd2Vla2RheSBuYW1lLiAgPENPREU+QUJEQVlfMTwvQ09ERT4KICAgICAgICAgY29ycmVzcG9uZHMgdG8gU3VuZGF5LgogICAgICAgICA8RFQ+PENPREU+REFZXzE8L0NPREU+CjxERD4KICAgICAgICAgPExJPnggREFZXzIKICAgICAgICAgPExJPnggREFZXzMKICAgICAgICAgPExJPnggREFZXzQKICAgICAgICAgPExJPnggREFZXzUKICAgICAgICAgPExJPnggREFZXzYKICAgICAgICAgPExJPnggREFZXzcKICAgICAgICAgU2ltaWxhciB0byA8Q09ERT5BQkRBWV8xPC9DT0RFPiBldGMuLCBidXQgaGVyZSB0aGUgcmV0dXJuIHZhbHVlIGlzIHRoZQogICAgICAgICB1bmFiYnJldmlhdGVkIHdlZWtkYXkgbmFtZS4KICAgICAgICAgPERUPjxDT0RFPkFCTU9OXzE8L0NPREU+CjxERD4KICAgICAgICAgPExJPnggQUJNT05fMgogICAgICAgICA8TEk+eCBBQk1PTl8zCiAgICAgICAgIDxMST54IEFCTU9OXzQKICAgICAgICAgPExJPnggQUJNT05fNQogICAgICAgICA8TEk+eCBBQk1PTl82CiAgICAgICAgIDxMST54IEFCTU9OXzcKICAgICAgICAgPExJPnggQUJNT05fOAogICAgICAgICA8TEk+eCBBQk1PTl85CiAgICAgICAgIDxMST54IEFCTU9OXzEwCiAgICAgICAgIDxMST54IEFCTU9OXzExCiAgICAgICAgIDxMST54IEFCTU9OXzEyCiAgICAgICAgIFRoZSByZXR1cm4gdmFsdWUgaXMgYWJicmV2aWF0ZWQgbmFtZSBvZiB0aGUgbW9udGguICA8Q09ERT5BQk1PTl8xPC9DT0RFPgogICAgICAgICBjb3JyZXNwb25kcyB0byBKYW51YXJ5LgogICAgICAgICA8RFQ+PENPREU+TU9OXzE8L0NPREU+CjxERD4KICAgICAgICAgPExJPnggTU9OXzIKICAgICAgICAgPExJPnggTU9OXzMKICAgICAgICAgPExJPnggTU9OXzQKICAgICAgICAgPExJPnggTU9OXzUKICAgICAgICAgPExJPnggTU9OXzYKICAgICAgICAgPExJPnggTU9OXzcKICAgICAgICAgPExJPnggTU9OXzgKICAgICAgICAgPExJPnggTU9OXzkKICAgICAgICAgPExJPnggTU9OXzEwCiAgICAgICAgIDxMST54IE1PTl8xMQogICAgICAgICA8TEk+eCBNT05fMTIKICAgICAgICAgU2ltaWxhciB0byA8Q09ERT5BQk1PTl8xPC9DT0RFPiBldGMuLCBidXQgaGVyZSB0aGUgbW9udGggbmFtZXMgYXJlIG5vdCBhYmJyZXZpYXRlZC4KICAgICAgICAgSGVyZSB0aGUgZmlyc3QgdmFsdWUgPENPREU+TU9OXzE8L0NPREU+IGFsc28gY29ycmVzcG9uZHMgdG8gSmFudWFyeS4KICAgICAgICAgPERUPjxDT0RFPkFNX1NUUjwvQ09ERT4KPEREPgogICAgICAgICA8TEk+eCBQTV9TVFIKICAgICAgICAgVGhlIHJldHVybiB2YWx1ZXMgYXJlIHN0cmluZ3Mgd2hpY2ggY2FuIGJlIHVzZWQgaW4gdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRpbWUKICAgICAgICAgYXMgYW4gaG91ciBmcm9tIDEgdG8gMTIgcGx1cyBhbiBhbS9wbSBzcGVjaWZpZXIuCiAgICAgICAgIDxicj48YnI+IE5vdGUgdGhhdCBpbiBsb2NhbGVzIHdoaWNoIGRvIG5vdCB1c2UgdGhpcyB0aW1lIHJlcHJlc2VudGF0aW9uCiAgICAgICAgIHRoZXNlIHN0cmluZ3MgbWlnaHQgYmUgZW1wdHksIGluIHdoaWNoIGNhc2UgdGhlIGFtL3BtIGZvcm1hdAogICAgICAgICBjYW5ub3QgYmUgdXNlZCBhdCBhbGwuCiAgICAgICAgIDxEVD48Q09ERT5EX1RfRk1UPC9DT0RFPgo8REQ+CiAgICAgICAgIFRoZSByZXR1cm4gdmFsdWUgY2FuIGJlIHVzZWQgYXMgYSBmb3JtYXQgc3RyaW5nIGZvciA8Q09ERT5zdHJmdGltZTwvQ09ERT4gdG8KICAgICAgICAgcmVwcmVzZW50IHRpbWUgYW5kIGRhdGUgaW4gYSBsb2NhbGUtc3BlY2lmaWMgd2F5LgogICAgICAgICA8RFQ+PENPREU+RF9GTVQ8L0NPREU+CjxERD4KICAgICAgICAgVGhlIHJldHVybiB2YWx1ZSBjYW4gYmUgdXNlZCBhcyBhIGZvcm1hdCBzdHJpbmcgZm9yIDxDT0RFPnN0cmZ0aW1lPC9DT0RFPiB0bwogICAgICAgICByZXByZXNlbnQgYSBkYXRlIGluIGEgbG9jYWxlLXNwZWNpZmljIHdheS4KICAgICAgICAgPERUPjxDT0RFPlRfRk1UPC9DT0RFPgo8REQ+CiAgICAgICAgIFRoZSByZXR1cm4gdmFsdWUgY2FuIGJlIHVzZWQgYXMgYSBmb3JtYXQgc3RyaW5nIGZvciA8Q09ERT5zdHJmdGltZTwvQ09ERT4gdG8KICAgICAgICAgcmVwcmVzZW50IHRpbWUgaW4gYSBsb2NhbGUtc3BlY2lmaWMgd2F5LgogICAgICAgICA8RFQ+PENPREU+VF9GTVRfQU1QTTwvQ09ERT4KPEREPgogICAgICAgICBUaGUgcmV0dXJuIHZhbHVlIGNhbiBiZSB1c2VkIGFzIGEgZm9ybWF0IHN0cmluZyBmb3IgPENPREU+c3RyZnRpbWU8L0NPREU+IHRvCiAgICAgICAgIHJlcHJlc2VudCB0aW1lIGluIHRoZSBhbS9wbSBmb3JtYXQuCiAgICAgICAgIDxicj48YnI+IE5vdGUgdGhhdCBpZiB0aGUgYW0vcG0gZm9ybWF0IGRvZXMgbm90IG1ha2UgYW55IHNlbnNlIGZvciB0aGUKICAgICAgICAgc2VsZWN0ZWQgbG9jYWxlLCB0aGUgcmV0dXJuIHZhbHVlIG1pZ2h0IGJlIHRoZSBzYW1lIGFzIHRoZSBvbmUgZm9yCiAgICAgICAgIDxDT0RFPlRfRk1UPC9DT0RFPi4KICAgICAgICAgPERUPjxDT0RFPkVSQTwvQ09ERT4KPEREPgogICAgICAgICBUaGUgcmV0dXJuIHZhbHVlIHJlcHJlc2VudHMgdGhlIGVyYSB1c2VkIGluIHRoZSBjdXJyZW50IGxvY2FsZS4KICAgICAgICAgPGJyPjxicj4gTW9zdCBsb2NhbGVzIGRvIG5vdCBkZWZpbmUgdGhpcyB2YWx1ZS4gIEFuIGV4YW1wbGUgb2YgYSBsb2NhbGUgd2hpY2gKICAgICAgICAgZG9lcyBkZWZpbmUgdGhpcyB2YWx1ZSBpcyB0aGUgSmFwYW5lc2Ugb25lLiAgSW4gSmFwYW4sIHRoZSB0cmFkaXRpb25hbAogICAgICAgICByZXByZXNlbnRhdGlvbiBvZiBkYXRlcyBpbmNsdWRlcyB0aGUgbmFtZSBvZiB0aGUgZXJhIGNvcnJlc3BvbmRpbmcgdG8KICAgICAgICAgdGhlIHRoZW4tZW1wZXJvcidzIHJlaWduLgogICAgICAgICA8YnI+PGJyPiBOb3JtYWxseSBpdCBzaG91bGQgbm90IGJlIG5lY2Vzc2FyeSB0byB1c2UgdGhpcyB2YWx1ZSBkaXJlY3RseS4KICAgICAgICAgU3BlY2lmeWluZyB0aGUgPENPREU+RTwvQ09ERT4gbW9kaWZpZXIgaW4gdGhlaXIgZm9ybWF0IHN0cmluZ3MgY2F1c2VzIHRoZQogICAgICAgICA8Q09ERT5zdHJmdGltZTwvQ09ERT4gZnVuY3Rpb25zIHRvIHVzZSB0aGlzIGluZm9ybWF0aW9uLiAgVGhlIGZvcm1hdCBvZiB0aGUKICAgICAgICAgcmV0dXJuZWQgc3RyaW5nIGlzIG5vdCBzcGVjaWZpZWQsIGFuZCB0aGVyZWZvcmUgeW91IHNob3VsZCBub3QgYXNzdW1lCiAgICAgICAgIGtub3dsZWRnZSBvZiBpdCBvbiBkaWZmZXJlbnQgc3lzdGVtcy4KICAgICAgICAgPERUPjxDT0RFPkVSQV9ZRUFSPC9DT0RFPgo8REQ+CiAgICAgICAgIFRoZSByZXR1cm4gdmFsdWUgZ2l2ZXMgdGhlIHllYXIgaW4gdGhlIHJlbGV2YW50IGVyYSBvZiB0aGUgbG9jYWxlLgogICAgICAgICBBcyBmb3IgPENPREU+RVJBPC9DT0RFPiBpdCBzaG91bGQgbm90IGJlIG5lY2Vzc2FyeSB0byB1c2UgdGhpcyB2YWx1ZSBkaXJlY3RseS4KICAgICAgICAgPERUPjxDT0RFPkVSQV9EX1RfRk1UPC9DT0RFPgo8REQ+CiAgICAgICAgIFRoaXMgcmV0dXJuIHZhbHVlIGNhbiBiZSB1c2VkIGFzIGEgZm9ybWF0IHN0cmluZyBmb3IgPENPREU+c3RyZnRpbWU8L0NPREU+IHRvCiAgICAgICAgIHJlcHJlc2VudCBkYXRlcyBhbmQgdGltZXMgaW4gYSBsb2NhbGUtc3BlY2lmaWMgZXJhLWJhc2VkIHdheS4KICAgICAgICAgPERUPjxDT0RFPkVSQV9EX0ZNVDwvQ09ERT4KPEREPgogICAgICAgICBUaGlzIHJldHVybiB2YWx1ZSBjYW4gYmUgdXNlZCBhcyBhIGZvcm1hdCBzdHJpbmcgZm9yIDxDT0RFPnN0cmZ0aW1lPC9DT0RFPiB0bwogICAgICAgICByZXByZXNlbnQgYSBkYXRlIGluIGEgbG9jYWxlLXNwZWNpZmljIGVyYS1iYXNlZCB3YXkuCiAgICAgICAgIDxEVD48Q09ERT5FUkFfVF9GTVQ8L0NPREU+CjxERD4KICAgICAgICAgVGhpcyByZXR1cm4gdmFsdWUgY2FuIGJlIHVzZWQgYXMgYSBmb3JtYXQgc3RyaW5nIGZvciA8Q09ERT5zdHJmdGltZTwvQ09ERT4gdG8KICAgICAgICAgcmVwcmVzZW50IHRpbWUgaW4gYSBsb2NhbGUtc3BlY2lmaWMgZXJhLWJhc2VkIHdheS4KICAgICAgICAgPERUPjxDT0RFPkFMVF9ESUdJVFM8L0NPREU+CjxERD4KICAgICAgICAgVGhlIHJldHVybiB2YWx1ZSBpcyBhIHJlcHJlc2VudGF0aW9uIG9mIHVwIHRvIDEwMCB2YWx1ZXMgdXNlZCB0bwogICAgICAgICByZXByZXNlbnQgdGhlIHZhbHVlcyAwIHRvIDk5LiAgQXMgZm9yIDxDT0RFPkVSQTwvQ09ERT4gdGhpcwogICAgICAgICB2YWx1ZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBkaXJlY3RseSwgYnV0IGluc3RlYWQgaW5kaXJlY3RseQogICAgICAgICB0aHJvdWdoIHRoZSA8Q09ERT5zdHJmdGltZTwvQ09ERT4gZnVuY3Rpb24uICBXaGVuIHRoZSBtb2RpZmllciA8Q09ERT5PPC9DT0RFPiBpcwogICAgICAgICB1c2VkIGluIGEgZm9ybWF0IHdoaWNoIHdvdWxkIG90aGVyd2lzZSB1c2UgbnVtZXJhbHMgdG8gcmVwcmVzZW50IGhvdXJzLAogICAgICAgICBtaW51dGVzLCBzZWNvbmRzLCB3ZWVrZGF5cywgbW9udGhzLCBvciB3ZWVrcywgdGhlIGFwcHJvcHJpYXRlIHZhbHVlIGZvcgogICAgICAgICB0aGUgbG9jYWxlIGlzIHVzZWQgaW5zdGVhZC4KICAgICAgICAgPERUPjxDT0RFPklOVF9DVVJSX1NZTUJPTDwvQ09ERT4KPEREPgogICAgICAgICBUaGUgc2FtZSBhcyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgPENPREU+bG9jYWxlY29udjwvQ09ERT4gaW4gdGhlCiAgICAgICAgIDxDT0RFPmludF9jdXJyX3N5bWJvbDwvQ09ERT4gZWxlbWVudCBvZiB0aGUgPENPREU+c3RydWN0IGxjb252PC9DT0RFPi4KICAgICAgICAgPERUPjxDT0RFPkNVUlJFTkNZX1NZTUJPTDwvQ09ERT4KPEREPgogICAgICAgICA8TEk+eCBDUk5DWVNUUgogICAgICAgICBUaGUgc2FtZSBhcyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgPENPREU+bG9jYWxlY29udjwvQ09ERT4gaW4gdGhlCiAgICAgICAgIDxDT0RFPmN1cnJlbmN5X3N5bWJvbDwvQ09ERT4gZWxlbWVudCBvZiB0aGUgPENPREU+c3RydWN0IGxjb252PC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gPENPREU+Q1JOQ1lTVFI8L0NPREU+IGlzIGEgZGVwcmVjYXRlZCBhbGlhcyBzdGlsbCByZXF1aXJlZCBieSBVbml4OTguCiAgICAgICAgIDxEVD48Q09ERT5NT05fREVDSU1BTF9QT0lOVDwvQ09ERT4KPEREPgogICAgICAgICBUaGUgc2FtZSBhcyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgPENPREU+bG9jYWxlY29udjwvQ09ERT4gaW4gdGhlCiAgICAgICAgIDxDT0RFPm1vbl9kZWNpbWFsX3BvaW50PC9DT0RFPiBlbGVtZW50IG9mIHRoZSA8Q09ERT5zdHJ1Y3QgbGNvbnY8L0NPREU+LgogICAgICAgICA8RFQ+PENPREU+TU9OX1RIT1VTQU5EU19TRVA8L0NPREU+CjxERD4KICAgICAgICAgVGhlIHNhbWUgYXMgdGhlIHZhbHVlIHJldHVybmVkIGJ5IDxDT0RFPmxvY2FsZWNvbnY8L0NPREU+IGluIHRoZQogICAgICAgICA8Q09ERT5tb25fdGhvdXNhbmRzX3NlcDwvQ09ERT4gZWxlbWVudCBvZiB0aGUgPENPREU+c3RydWN0IGxjb252PC9DT0RFPi4KICAgICAgICAgPERUPjxDT0RFPk1PTl9HUk9VUElORzwvQ09ERT4KPEREPgogICAgICAgICBUaGUgc2FtZSBhcyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgPENPREU+bG9jYWxlY29udjwvQ09ERT4gaW4gdGhlCiAgICAgICAgIDxDT0RFPm1vbl9ncm91cGluZzwvQ09ERT4gZWxlbWVudCBvZiB0aGUgPENPREU+c3RydWN0IGxjb252PC9DT0RFPi4KICAgICAgICAgPERUPjxDT0RFPlBPU0lUSVZFX1NJR048L0NPREU+CjxERD4KICAgICAgICAgVGhlIHNhbWUgYXMgdGhlIHZhbHVlIHJldHVybmVkIGJ5IDxDT0RFPmxvY2FsZWNvbnY8L0NPREU+IGluIHRoZQogICAgICAgICA8Q09ERT5wb3NpdGl2ZV9zaWduPC9DT0RFPiBlbGVtZW50IG9mIHRoZSA8Q09ERT5zdHJ1Y3QgbGNvbnY8L0NPREU+LgogICAgICAgICA8RFQ+PENPREU+TkVHQVRJVkVfU0lHTjwvQ09ERT4KPEREPgogICAgICAgICBUaGUgc2FtZSBhcyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgPENPREU+bG9jYWxlY29udjwvQ09ERT4gaW4gdGhlCiAgICAgICAgIDxDT0RFPm5lZ2F0aXZlX3NpZ248L0NPREU+IGVsZW1lbnQgb2YgdGhlIDxDT0RFPnN0cnVjdCBsY29udjwvQ09ERT4uCiAgICAgICAgIDxEVD48Q09ERT5JTlRfRlJBQ19ESUdJVFM8L0NPREU+CjxERD4KICAgICAgICAgVGhlIHNhbWUgYXMgdGhlIHZhbHVlIHJldHVybmVkIGJ5IDxDT0RFPmxvY2FsZWNvbnY8L0NPREU+IGluIHRoZQogICAgICAgICA8Q09ERT5pbnRfZnJhY19kaWdpdHM8L0NPREU+IGVsZW1lbnQgb2YgdGhlIDxDT0RFPnN0cnVjdCBsY29udjwvQ09ERT4uCiAgICAgICAgIDxEVD48Q09ERT5GUkFDX0RJR0lUUzwvQ09ERT4KPEREPgogICAgICAgICBUaGUgc2FtZSBhcyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgPENPREU+bG9jYWxlY29udjwvQ09ERT4gaW4gdGhlCiAgICAgICAgIDxDT0RFPmZyYWNfZGlnaXRzPC9DT0RFPiBlbGVtZW50IG9mIHRoZSA8Q09ERT5zdHJ1Y3QgbGNvbnY8L0NPREU+LgogICAgICAgICA8RFQ+PENPREU+UF9DU19QUkVDRURFUzwvQ09ERT4KPEREPgogICAgICAgICBUaGUgc2FtZSBhcyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgPENPREU+bG9jYWxlY29udjwvQ09ERT4gaW4gdGhlCiAgICAgICAgIDxDT0RFPnBfY3NfcHJlY2VkZXM8L0NPREU+IGVsZW1lbnQgb2YgdGhlIDxDT0RFPnN0cnVjdCBsY29udjwvQ09ERT4uCiAgICAgICAgIDxEVD48Q09ERT5QX1NFUF9CWV9TUEFDRTwvQ09ERT4KPEREPgogICAgICAgICBUaGUgc2FtZSBhcyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgPENPREU+bG9jYWxlY29udjwvQ09ERT4gaW4gdGhlCiAgICAgICAgIDxDT0RFPnBfc2VwX2J5X3NwYWNlPC9DT0RFPiBlbGVtZW50IG9mIHRoZSA8Q09ERT5zdHJ1Y3QgbGNvbnY8L0NPREU+LgogICAgICAgICA8RFQ+PENPREU+Tl9DU19QUkVDRURFUzwvQ09ERT4KPEREPgogICAgICAgICBUaGUgc2FtZSBhcyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgPENPREU+bG9jYWxlY29udjwvQ09ERT4gaW4gdGhlCiAgICAgICAgIDxDT0RFPm5fY3NfcHJlY2VkZXM8L0NPREU+IGVsZW1lbnQgb2YgdGhlIDxDT0RFPnN0cnVjdCBsY29udjwvQ09ERT4uCiAgICAgICAgIDxEVD48Q09ERT5OX1NFUF9CWV9TUEFDRTwvQ09ERT4KPEREPgogICAgICAgICBUaGUgc2FtZSBhcyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgPENPREU+bG9jYWxlY29udjwvQ09ERT4gaW4gdGhlCiAgICAgICAgIDxDT0RFPm5fc2VwX2J5X3NwYWNlPC9DT0RFPiBlbGVtZW50IG9mIHRoZSA8Q09ERT5zdHJ1Y3QgbGNvbnY8L0NPREU+LgogICAgICAgICA8RFQ+PENPREU+UF9TSUdOX1BPU048L0NPREU+CjxERD4KICAgICAgICAgVGhlIHNhbWUgYXMgdGhlIHZhbHVlIHJldHVybmVkIGJ5IDxDT0RFPmxvY2FsZWNvbnY8L0NPREU+IGluIHRoZQogICAgICAgICA8Q09ERT5wX3NpZ25fcG9zbjwvQ09ERT4gZWxlbWVudCBvZiB0aGUgPENPREU+c3RydWN0IGxjb252PC9DT0RFPi4KICAgICAgICAgPERUPjxDT0RFPk5fU0lHTl9QT1NOPC9DT0RFPgo8REQ+CiAgICAgICAgIFRoZSBzYW1lIGFzIHRoZSB2YWx1ZSByZXR1cm5lZCBieSA8Q09ERT5sb2NhbGVjb252PC9DT0RFPiBpbiB0aGUKICAgICAgICAgPENPREU+bl9zaWduX3Bvc248L0NPREU+IGVsZW1lbnQgb2YgdGhlIDxDT0RFPnN0cnVjdCBsY29udjwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5JTlRfUF9DU19QUkVDRURFUzwvQ09ERT4KPEREPgogICAgICAgICBUaGUgc2FtZSBhcyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgPENPREU+bG9jYWxlY29udjwvQ09ERT4gaW4gdGhlCiAgICAgICAgIDxDT0RFPmludF9wX2NzX3ByZWNlZGVzPC9DT0RFPiBlbGVtZW50IG9mIHRoZSA8Q09ERT5zdHJ1Y3QgbGNvbnY8L0NPREU+LgogICAgICAgICA8RFQ+PENPREU+SU5UX1BfU0VQX0JZX1NQQUNFPC9DT0RFPgo8REQ+CiAgICAgICAgIFRoZSBzYW1lIGFzIHRoZSB2YWx1ZSByZXR1cm5lZCBieSA8Q09ERT5sb2NhbGVjb252PC9DT0RFPiBpbiB0aGUKICAgICAgICAgPENPREU+aW50X3Bfc2VwX2J5X3NwYWNlPC9DT0RFPiBlbGVtZW50IG9mIHRoZSA8Q09ERT5zdHJ1Y3QgbGNvbnY8L0NPREU+LgogICAgICAgICA8RFQ+PENPREU+SU5UX05fQ1NfUFJFQ0VERVM8L0NPREU+CjxERD4KICAgICAgICAgVGhlIHNhbWUgYXMgdGhlIHZhbHVlIHJldHVybmVkIGJ5IDxDT0RFPmxvY2FsZWNvbnY8L0NPREU+IGluIHRoZQogICAgICAgICA8Q09ERT5pbnRfbl9jc19wcmVjZWRlczwvQ09ERT4gZWxlbWVudCBvZiB0aGUgPENPREU+c3RydWN0IGxjb252PC9DT0RFPi4KICAgICAgICAgPERUPjxDT0RFPklOVF9OX1NFUF9CWV9TUEFDRTwvQ09ERT4KPEREPgogICAgICAgICBUaGUgc2FtZSBhcyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgPENPREU+bG9jYWxlY29udjwvQ09ERT4gaW4gdGhlCiAgICAgICAgIDxDT0RFPmludF9uX3NlcF9ieV9zcGFjZTwvQ09ERT4gZWxlbWVudCBvZiB0aGUgPENPREU+c3RydWN0IGxjb252PC9DT0RFPi4KICAgICAgICAgPERUPjxDT0RFPklOVF9QX1NJR05fUE9TTjwvQ09ERT4KPEREPgogICAgICAgICBUaGUgc2FtZSBhcyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgPENPREU+bG9jYWxlY29udjwvQ09ERT4gaW4gdGhlCiAgICAgICAgIDxDT0RFPmludF9wX3NpZ25fcG9zbjwvQ09ERT4gZWxlbWVudCBvZiB0aGUgPENPREU+c3RydWN0IGxjb252PC9DT0RFPi4KICAgICAgICAgPERUPjxDT0RFPklOVF9OX1NJR05fUE9TTjwvQ09ERT4KPEREPgogICAgICAgICBUaGUgc2FtZSBhcyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgPENPREU+bG9jYWxlY29udjwvQ09ERT4gaW4gdGhlCiAgICAgICAgIDxDT0RFPmludF9uX3NpZ25fcG9zbjwvQ09ERT4gZWxlbWVudCBvZiB0aGUgPENPREU+c3RydWN0IGxjb252PC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPkRFQ0lNQUxfUE9JTlQ8L0NPREU+CjxERD4KICAgICAgICAgPExJPnggUkFESVhDSEFSCiAgICAgICAgIFRoZSBzYW1lIGFzIHRoZSB2YWx1ZSByZXR1cm5lZCBieSA8Q09ERT5sb2NhbGVjb252PC9DT0RFPiBpbiB0aGUKICAgICAgICAgPENPREU+ZGVjaW1hbF9wb2ludDwvQ09ERT4gZWxlbWVudCBvZiB0aGUgPENPREU+c3RydWN0IGxjb252PC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gVGhlIG5hbWUgPENPREU+UkFESVhDSEFSPC9DT0RFPiBpcyBhIGRlcHJlY2F0ZWQgYWxpYXMgc3RpbGwgdXNlZCBpbiBVbml4OTguCiAgICAgICAgIDxEVD48Q09ERT5USE9VU0FORFNfU0VQPC9DT0RFPgo8REQ+CiAgICAgICAgIDxMST54IFRIT1VTRVAKICAgICAgICAgVGhlIHNhbWUgYXMgdGhlIHZhbHVlIHJldHVybmVkIGJ5IDxDT0RFPmxvY2FsZWNvbnY8L0NPREU+IGluIHRoZQogICAgICAgICA8Q09ERT50aG91c2FuZHNfc2VwPC9DT0RFPiBlbGVtZW50IG9mIHRoZSA8Q09ERT5zdHJ1Y3QgbGNvbnY8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBUaGUgbmFtZSA8Q09ERT5USE9VU0VQPC9DT0RFPiBpcyBhIGRlcHJlY2F0ZWQgYWxpYXMgc3RpbGwgdXNlZCBpbiBVbml4OTguCiAgICAgICAgIDxEVD48Q09ERT5HUk9VUElORzwvQ09ERT4KPEREPgogICAgICAgICBUaGUgc2FtZSBhcyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgPENPREU+bG9jYWxlY29udjwvQ09ERT4gaW4gdGhlCiAgICAgICAgIDxDT0RFPmdyb3VwaW5nPC9DT0RFPiBlbGVtZW50IG9mIHRoZSA8Q09ERT5zdHJ1Y3QgbGNvbnY8L0NPREU+LgogICAgICAgICA8RFQ+PENPREU+WUVTRVhQUjwvQ09ERT4KPEREPgogICAgICAgICBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgcmVndWxhciBleHByZXNzaW9uIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggdGhlCiAgICAgICAgIDxDT0RFPnJlZ2V4PC9DT0RFPiBmdW5jdGlvbiB0byByZWNvZ25pemUgYSBwb3NpdGl2ZSByZXNwb25zZSB0byBhIHllcy9ubwogICAgICAgICBxdWVzdGlvbi4gIFRoZSBHTlUgQyBsaWJyYXJ5IHByb3ZpZGVzIHRoZSA8Q09ERT5ycG1hdGNoPC9DT0RFPiBmdW5jdGlvbiBmb3IKICAgICAgICAgZWFzaWVyIGhhbmRsaW5nIGluIGFwcGxpY2F0aW9ucy4KICAgICAgICAgPERUPjxDT0RFPk5PRVhQUjwvQ09ERT4KPEREPgogICAgICAgICBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgcmVndWxhciBleHByZXNzaW9uIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggdGhlCiAgICAgICAgIDxDT0RFPnJlZ2V4PC9DT0RFPiBmdW5jdGlvbiB0byByZWNvZ25pemUgYSBuZWdhdGl2ZSByZXNwb25zZSB0byBhIHllcy9ubwogICAgICAgICBxdWVzdGlvbi4KICAgICAgICAgPERUPjxDT0RFPllFU1NUUjwvQ09ERT4KPEREPgogICAgICAgICBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgbG9jYWxlLXNwZWNpZmljIHRyYW5zbGF0aW9uIG9mIHRoZSBwb3NpdGl2ZSByZXNwb25zZQogICAgICAgICB0byBhIHllcy9ubyBxdWVzdGlvbi4KICAgICAgICAgPGJyPjxicj4gVXNpbmcgdGhpcyB2YWx1ZSBpcyBkZXByZWNhdGVkIHNpbmNlIGl0IGlzIGEgdmVyeSBzcGVjaWFsIGNhc2Ugb2YKICAgICAgICAgbWVzc2FnZSB0cmFuc2xhdGlvbiwgYW5kIGlzIGJldHRlciBoYW5kbGVkIGJ5IHRoZSBtZXNzYWdlCiAgICAgICAgIHRyYW5zbGF0aW9uIGZ1bmN0aW9ucyAuCiAgICAgICAgIDxicj48YnI+IFRoZSB1c2Ugb2YgdGhpcyBzeW1ib2wgaXMgZGVwcmVjYXRlZC4gIEluc3RlYWQgbWVzc2FnZSB0cmFuc2xhdGlvbgogICAgICAgICBzaG91bGQgYmUgdXNlZC4KICAgICAgICAgPERUPjxDT0RFPk5PU1RSPC9DT0RFPgo8REQ+CiAgICAgICAgIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBsb2NhbGUtc3BlY2lmaWMgdHJhbnNsYXRpb24gb2YgdGhlIG5lZ2F0aXZlIHJlc3BvbnNlCiAgICAgICAgIHRvIGEgeWVzL25vIHF1ZXN0aW9uLiAgV2hhdCBpcyBzYWlkIGZvciA8Q09ERT5ZRVNTVFI8L0NPREU+IGlzIGFsc28gdHJ1ZSBoZXJlLgogICAgICAgICA8YnI+PGJyPiBUaGUgdXNlIG9mIHRoaXMgc3ltYm9sIGlzIGRlcHJlY2F0ZWQuICBJbnN0ZWFkIG1lc3NhZ2UgdHJhbnNsYXRpb24KICAgICAgICAgc2hvdWxkIGJlIHVzZWQuCiAgICAgICAgIDwvREw+CiAgICAgICAgIDxicj48YnI+IFRoZSBmaWxlIDxUVD5sYW5naW5mby5oPC9UVD4gZGVmaW5lcyBhIGxvdCBtb3JlIHN5bWJvbHMgYnV0IG5vbmUgb2YgdGhlbQogICAgICAgICBpcyBvZmZpY2lhbC4gIFVzaW5nIHRoZW0gaXMgbm90IHBvcnRhYmxlLCBhbmQgdGhlIGZvcm1hdCBvZiB0aGUKICAgICAgICAgcmV0dXJuIHZhbHVlcyBtaWdodCBjaGFuZ2UuICBUaGVyZWZvcmUgd2UgcmVjb21tZW5kZWQgeW91IG5vdCB1c2UKICAgICAgICAgdGhlbS4KICAgICAgICAgPGJyPjxicj4gTm90ZSB0aGF0IHRoZSByZXR1cm4gdmFsdWUgZm9yIGFueSB2YWxpZCBhcmd1bWVudCBjYW4gYmUgdXNlZCBmb3IKICAgICAgICAgaW4gYWxsIHNpdHVhdGlvbnMgKHdpdGggdGhlIHBvc3NpYmxlIGV4Y2VwdGlvbiBvZiB0aGUgYW0vcG0gdGltZSBmb3JtYXR0aW5nCiAgICAgICAgIGNvZGVzKS4gIElmIHRoZSB1c2VyIGhhcyBub3Qgc2VsZWN0ZWQgYW55IGxvY2FsZSBmb3IgdGhlCiAgICAgICAgIGFwcHJvcHJpYXRlIGNhdGVnb3J5LCA8Q09ERT5ubF9sYW5naW5mbzwvQ09ERT4gcmV0dXJucyB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUKICAgICAgICAgPENPREU+IkMiPC9DT0RFPiBsb2NhbGUuICBJdCBpcyB0aGVyZWZvcmUgcG9zc2libGUgdG8gdXNlIHRoaXMgZnVuY3Rpb24gYXMKICAgICAgICAgc2hvd24gaW4gdGhlIGV4YW1wbGUgYmVsb3cuCiAgICAgICAgIDxicj48YnI+IElmIHRoZSBhcmd1bWVudCA8VkFSPml0ZW08L1ZBUj4gaXMgbm90IHZhbGlkLCBhIHBvaW50ZXIgdG8gYW4gZW1wdHkgc3RyaW5nIGlzCiAgICAgICAgIHJldHVybmVkLgogICAgICAgIHNxAH4ADwAAAAJ3BAAAAAJ0AAhsb2NhbGUuaHQACmxhbmdpbmZvLmh4cQB+FE10AAxubF9pdGVtIGl0ZW10AAZjaGFyICp0AAducmFuZDQ4c3EAfgAKdAKFCiAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIHRoZSA8Q09ERT5scmFuZDQ4PC9DT0RFPiBmdW5jdGlvbiBpbiB0aGF0IGl0CiAgICAgICAgIHJldHVybnMgYSBudW1iZXIgaW4gdGhlIHJhbmdlIG9mIDxDT0RFPjA8L0NPREU+IHRvIDxDT0RFPjJeMzE8L0NPREU+IChleGNsdXNpdmUpIGJ1dAogICAgICAgICB0aGUgc3RhdGUgb2YgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHVzZWQgdG8gcHJvZHVjZSB0aGUgcmFuZG9tIGJpdHMKICAgICAgICAgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYXJyYXkgcHJvdmlkZWQgYXMgdGhlIHBhcmFtZXRlciB0byB0aGUgZnVuY3Rpb24uCiAgICAgICAgIDxicj48YnI+IFRoZSBudW1iZXJzIGluIHRoZSBhcnJheSBhcmUgdXBkYXRlZCBhZnRlcndhcmRzIHNvIHRoYXQgc3Vic2VxdWVudCBjYWxscwogICAgICAgICB0byB0aGlzIGZ1bmN0aW9uIHlpZWxkIGRpZmZlcmVudCByZXN1bHRzIChhcyBpcyBleHBlY3RlZCBvZiBhIHJhbmRvbQogICAgICAgICBudW1iZXIgZ2VuZXJhdG9yKS4gIFRoZSBhcnJheSBzaG91bGQgaGF2ZSBiZWVuIGluaXRpYWxpemVkIGJlZm9yZSB0aGUKICAgICAgICAgZmlyc3QgY2FsbCB0byBvYnRhaW4gcmVwcm9kdWNpYmxlIHJlc3VsdHMuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHN0ZGxpYi5oeHEAfhRVdAAbdW5zaWduZWQgc2hvcnQgaW50IHhzdWJpWzNddAAIbG9uZyBpbnR0AAlucmFuZDQ4X3JzcQB+AAp0AoYKICAgICAgICBUaGUgPENPREU+bnJhbmQ0OF9yPC9DT0RFPiBmdW5jdGlvbiB3b3JrcyBsaWtlIDxDT0RFPm5yYW5kNDg8L0NPREU+IGluIHRoYXQgaXQKICAgICAgICAgcHJvZHVjZXMgYSByYW5kb20gbnVtYmVyIGluIHRoZSByYW5nZSA8Q09ERT4wPC9DT0RFPiB0byA8Q09ERT4yXjMxPC9DT0RFPi4gIEJ1dCBpbnN0ZWFkCiAgICAgICAgIG9mIHVzaW5nIHRoZSBnbG9iYWwgcGFyYW1ldGVycyBmb3IgdGhlIGNvbmdydWVudGlhbCBmb3JtdWxhIGl0IHVzZXMgdGhlCiAgICAgICAgIGluZm9ybWF0aW9uIGZyb20gdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IDxWQVI+YnVmZmVyPC9WQVI+LiAgVGhlIHN0YXRlIGlzCiAgICAgICAgIGRlc2NyaWJlZCBieSB0aGUgdmFsdWVzIGluIDxWQVI+eHN1Ymk8L1ZBUj4uCiAgICAgICAgIDxicj48YnI+IElmIHRoZSByZXR1cm4gdmFsdWUgaXMgbm9uLW5lZ2F0aXZlIHRoZSB2YXJpYWJsZSBwb2ludGVkIHRvIGJ5CiAgICAgICAgIDxWQVI+cmVzdWx0PC9WQVI+IGNvbnRhaW5zIHRoZSByZXN1bHQuCiAgICAgICAgIDxicj48YnI+IFRoaXMgZnVuY3Rpb24gaXMgYSBHTlUgZXh0ZW5zaW9uIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgaW4gcG9ydGFibGUKICAgICAgICAgcHJvZ3JhbXMuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHN0ZGxpYi5oeHEAfhRcdABKdW5zaWduZWQgc2hvcnQgaW50IHhzdWJpWzNdLCBzdHJ1Y3QgZHJhbmQ0OF9kYXRhICpidWZmZXIsIGxvbmcgaW50ICpyZXN1bHR0AANpbnR0AAVudG9obHNxAH4ACnQAzgogICAgICAgIFRoaXMgZnVuY3Rpb24gY29udmVydHMgdGhlIDxDT0RFPnVpbnQzMl90PC9DT0RFPiBpbnRlZ2VyIDxWQVI+bmV0bG9uZzwvVkFSPiBmcm9tCiAgICAgICAgIG5ldHdvcmsgYnl0ZSBvcmRlciB0byBob3N0IGJ5dGUgb3JkZXIuCiAgICAgICAgIDxicj48YnI+IFRoaXMgaXMgdXNlZCBmb3IgSVB2NCBJbnRlcm5ldCBhZGRyZXNzZXMuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQADG5ldGluZXQvaW4uaHhxAH4UY3QAEHVpbnQzMl90IG5ldGxvbmd0AAh1aW50MzJfdHQABW50b2hzc3EAfgAKdACTCiAgICAgICAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgPENPREU+dWludDE2X3Q8L0NPREU+IGludGVnZXIgPFZBUj5uZXRzaG9ydDwvVkFSPiBmcm9tCiAgICAgICAgIG5ldHdvcmsgYnl0ZSBvcmRlciB0byBob3N0IGJ5dGUgb3JkZXIuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQADG5ldGluZXQvaW4uaHhxAH4UanQAEXVpbnQxNl90IG5ldHNob3J0dAAIdWludDE2X3R0AAtudHBfYWRqdGltZXNxAH4ACnQGTAogICAgICAgIFRoZSA8Q09ERT5udHBfYWRqdGltZTwvQ09ERT4gZnVuY3Rpb24gc2V0cyB0aGUgc3RydWN0dXJlIHNwZWNpZmllZCBieQogICAgICAgICA8VkFSPnRwdHI8L1ZBUj4gdG8gY3VycmVudCB2YWx1ZXMuCiAgICAgICAgIDxicj48YnI+IEluIGFkZGl0aW9uLCA8Q09ERT5udHBfYWRqdGltZTwvQ09ERT4gdXBkYXRlcyBzb21lIHNldHRpbmdzIHRvIG1hdGNoIHdoYXQgeW91CiAgICAgICAgIHBhc3MgdG8gaXQgaW4gKjxWQVI+dHB0cjwvVkFSPi4gIFVzZSB0aGUgPENPREU+bW9kZXM8L0NPREU+IGVsZW1lbnQgb2YgKjxWQVI+dHB0cjwvVkFSPgogICAgICAgICB0byBzZWxlY3Qgd2hhdCBzZXR0aW5ncyB0byB1cGRhdGUuICBZb3UgY2FuIHNldCA8Q09ERT5vZmZzZXQ8L0NPREU+LAogICAgICAgICA8Q09ERT5mcmVxPC9DT0RFPiwgPENPREU+bWF4ZXJyb3I8L0NPREU+LCA8Q09ERT5lc3RlcnJvcjwvQ09ERT4sIDxDT0RFPnN0YXR1czwvQ09ERT4sCiAgICAgICAgIDxDT0RFPmNvbnN0YW50PC9DT0RFPiwgYW5kIDxDT0RFPnRpY2s8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5tb2RlczwvQ09ERT4gPSB6ZXJvIG1lYW5zIHNldCBub3RoaW5nLgogICAgICAgICA8YnI+PGJyPiBPbmx5IHRoZSBzdXBlcnVzZXIgY2FuIHVwZGF0ZSBzZXR0aW5ncy4KICAgICAgICAgPGJyPjxicj4gPGJyPjxicj4gVGhlIHJldHVybiB2YWx1ZSBpcyA8Q09ERT4wPC9DT0RFPiBvbiBzdWNjZXNzIGFuZCBvdGhlciB2YWx1ZXMgb24gZmFpbHVyZS4gIFRoZQogICAgICAgICBmb2xsb3dpbmcgPENPREU+ZXJybm88L0NPREU+IGVycm9yIGNvbmRpdGlvbnMgYXJlIGRlZmluZWQgZm9yIHRoaXMgZnVuY3Rpb246CiAgICAgICAgIDxicj48YnI+IDxETD4KCiAgICAgICAgIDxEVD48Q09ERT5USU1FX0VSUk9SPC9DT0RFPgo8REQ+CiAgICAgICAgIFRoZSBoaWdoIGFjY3VyYWN5IGNsb2NrIG1vZGVsIGlzIG5vdCBwcm9wZXJseSBzZXQgdXAgYXQgdGhlIG1vbWVudCwgdGh1cyB0aGUKICAgICAgICAgY2xvY2sgbXVzdCBiZSBjb25zaWRlcmVkIHVuc3luY2hyb25pemVkLCBhbmQgdGhlIHZhbHVlcyBzaG91bGQgYmUKICAgICAgICAgdHJlYXRlZCB3aXRoIGNhcmUuICBBbm90aGVyIHJlYXNvbiBjb3VsZCBiZSB0aGF0IHRoZSBzcGVjaWZpZWQgbmV3IHZhbHVlcwogICAgICAgICBhcmUgbm90IGFsbG93ZWQuCiAgICAgICAgIDxicj48YnI+IDxMST4gRVBFUk0KICAgICAgICAgVGhlIHByb2Nlc3Mgc3BlY2lmaWVkIGEgc2V0dGluZ3MgdXBkYXRlLCBidXQgaXMgbm90IHN1cGVydXNlci4KICAgICAgICAgPGJyPjxicj4KICAgICAgICAgPGJyPjxicj4gRm9yIG1vcmUgZGV0YWlscyBzZWUgUkZDMTMwNSAoTmV0d29yayBUaW1lIFByb3RvY29sLCBWZXJzaW9uIDMpIGFuZAogICAgICAgICByZWxhdGVkIGRvY3VtZW50cy4KICAgICAgICAgPGJyPjxicj4gUG9ydGFiaWxpdHkgbm90ZTogRWFybHkgdmVyc2lvbnMgb2YgdGhlIEdOVSBDIGxpYnJhcnkgZGlkIG5vdAogICAgICAgICBoYXZlIHRoaXMgZnVuY3Rpb24gYnV0IGRpZCBoYXZlIHRoZSBzeW5vbnltb3VzIDxDT0RFPmFkanRpbWV4PC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAALc3lzL3RpbWV4Lmh4cQB+FHF0ABJzdHJ1Y3QgdGltZXggKnRwdHJ0AANpbnR0AAtudHBfZ2V0dGltZXNxAH4ACnQDJAogICAgICAgIFRoZSA8Q09ERT5udHBfZ2V0dGltZTwvQ09ERT4gZnVuY3Rpb24gc2V0cyB0aGUgc3RydWN0dXJlIHBvaW50ZWQgdG8gYnkKICAgICAgICAgPFZBUj50cHRyPC9WQVI+IHRvIGN1cnJlbnQgdmFsdWVzLiAgVGhlIGVsZW1lbnRzIG9mIHRoZSBzdHJ1Y3R1cmUgYWZ0ZXJ3YXJkcwogICAgICAgICBjb250YWluIHRoZSB2YWx1ZXMgdGhlIHRpbWVyIGltcGxlbWVudGF0aW9uIGluIHRoZSBrZXJuZWwgYXNzdW1lcy4gIFRoZXkKICAgICAgICAgbWlnaHQgb3IgbWlnaHQgbm90IGJlIGNvcnJlY3QuICBJZiB0aGV5IGFyZSBub3QgYSA8Q09ERT5udHBfYWRqdGltZTwvQ09ERT4KICAgICAgICAgY2FsbCBpcyBuZWNlc3NhcnkuCiAgICAgICAgIDxicj48YnI+IFRoZSByZXR1cm4gdmFsdWUgaXMgPENPREU+MDwvQ09ERT4gb24gc3VjY2VzcyBhbmQgb3RoZXIgdmFsdWVzIG9uIGZhaWx1cmUuICBUaGUKICAgICAgICAgZm9sbG93aW5nIDxDT0RFPmVycm5vPC9DT0RFPiBlcnJvciBjb25kaXRpb25zIGFyZSBkZWZpbmVkIGZvciB0aGlzIGZ1bmN0aW9uOgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8RFQ+PENPREU+VElNRV9FUlJPUjwvQ09ERT4KPEREPgogICAgICAgICBUaGUgcHJlY2lzaW9uIGNsb2NrIG1vZGVsIGlzIG5vdCBwcm9wZXJseSBzZXQgdXAgYXQgdGhlIG1vbWVudCwgdGh1cyB0aGUKICAgICAgICAgY2xvY2sgbXVzdCBiZSBjb25zaWRlcmVkIHVuc3luY2hyb25pemVkLCBhbmQgdGhlIHZhbHVlcyBzaG91bGQgYmUKICAgICAgICAgdHJlYXRlZCB3aXRoIGNhcmUuCgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAtzeXMvdGltZXguaHhxAH4UeHQAF3N0cnVjdCBudHB0aW1ldmFsICp0cHRydAADaW50dAANb2JzdGFja18xZ3Jvd3NxAH4ACnQArAogICAgICAgIFRvIGFkZCBvbmUgY2hhcmFjdGVyIGF0IGEgdGltZSwgdXNlIHRoZSBmdW5jdGlvbiA8Q09ERT5vYnN0YWNrXzFncm93PC9DT0RFPi4KICAgICAgICAgSXQgYWRkcyBhIHNpbmdsZSBieXRlIGNvbnRhaW5pbmcgPFZBUj5jPC9WQVI+IHRvIHRoZSBncm93aW5nIG9iamVjdC4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAJb2JzdGFjay5oeHEAfhR/dAAjc3RydWN0IG9ic3RhY2sgKm9ic3RhY2stcHRyLCBjaGFyIGN0AAR2b2lkdAASb2JzdGFja18xZ3Jvd19mYXN0c3EAfgAKdAC0CiAgICAgICAgVGhlIGZ1bmN0aW9uIDxDT0RFPm9ic3RhY2tfMWdyb3dfZmFzdDwvQ09ERT4gYWRkcyBvbmUgYnl0ZSBjb250YWluaW5nIHRoZQogICAgICAgICBjaGFyYWN0ZXIgPFZBUj5jPC9WQVI+IHRvIHRoZSBncm93aW5nIG9iamVjdCBpbiBvYnN0YWNrIDxWQVI+b2JzdGFjay1wdHI8L1ZBUj4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACW9ic3RhY2suaHhxAH4UhnQAI3N0cnVjdCBvYnN0YWNrICpvYnN0YWNrLXB0ciwgY2hhciBjdAAEdm9pZHQADW9ic3RhY2tfYWxsb2NzcQB+AAp0AswKICAgICAgICBUaGlzIGFsbG9jYXRlcyBhbiB1bmluaXRpYWxpemVkIGJsb2NrIG9mIDxWQVI+c2l6ZTwvVkFSPiBieXRlcyBpbiBhbiBvYnN0YWNrCiAgICAgICAgIGFuZCByZXR1cm5zIGl0cyBhZGRyZXNzLiAgSGVyZSA8VkFSPm9ic3RhY2stcHRyPC9WQVI+IHNwZWNpZmllcyB3aGljaCBvYnN0YWNrCiAgICAgICAgIHRvIGFsbG9jYXRlIHRoZSBibG9jayBpbjsgaXQgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIDxDT0RFPnN0cnVjdCBvYnN0YWNrPC9DT0RFPgogICAgICAgICBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyB0aGUgb2JzdGFjay4gIEVhY2ggb2JzdGFjayBmdW5jdGlvbiBvciBtYWNybwogICAgICAgICByZXF1aXJlcyB5b3UgdG8gc3BlY2lmeSBhbiA8VkFSPm9ic3RhY2stcHRyPC9WQVI+IGFzIHRoZSBmaXJzdCBhcmd1bWVudC4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiBjYWxscyB0aGUgb2JzdGFjaydzIDxDT0RFPm9ic3RhY2tfY2h1bmtfYWxsb2M8L0NPREU+IGZ1bmN0aW9uIGlmCiAgICAgICAgIGl0IG5lZWRzIHRvIGFsbG9jYXRlIGEgbmV3IGNodW5rIG9mIG1lbW9yeTsgaXQgY2FsbHMKICAgICAgICAgPENPREU+b2JzdGFja19hbGxvY19mYWlsZWRfaGFuZGxlcjwvQ09ERT4gaWYgYWxsb2NhdGlvbiBvZiBtZW1vcnkgYnkKICAgICAgICAgPENPREU+b2JzdGFja19jaHVua19hbGxvYzwvQ09ERT4gZmFpbGVkLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAlvYnN0YWNrLmh4cQB+FI10ACVzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjay1wdHIsIGludCBzaXpldAAGdm9pZCAqdAAMb2JzdGFja19iYXNlc3EAfgAKdAH0CiAgICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB0ZW50YXRpdmUgYWRkcmVzcyBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZQogICAgICAgICBjdXJyZW50bHkgZ3Jvd2luZyBvYmplY3QgaW4gPFZBUj5vYnN0YWNrLXB0cjwvVkFSPi4gIElmIHlvdSBmaW5pc2ggdGhlIG9iamVjdAogICAgICAgICBpbW1lZGlhdGVseSwgaXQgd2lsbCBoYXZlIHRoYXQgYWRkcmVzcy4gIElmIHlvdSBtYWtlIGl0IGxhcmdlciBmaXJzdCwgaXQKICAgICAgICAgbWF5IG91dGdyb3cgdGhlIGN1cnJlbnQgY2h1bmstLS10aGVuIGl0cyBhZGRyZXNzIHdpbGwgY2hhbmdlIQogICAgICAgICA8YnI+PGJyPiBJZiBubyBvYmplY3QgaXMgZ3Jvd2luZywgdGhpcyB2YWx1ZSBzYXlzIHdoZXJlIHRoZSBuZXh0IG9iamVjdCB5b3UKICAgICAgICAgYWxsb2NhdGUgd2lsbCBzdGFydCAob25jZSBhZ2FpbiBhc3N1bWluZyBpdCBmaXRzIGluIHRoZSBjdXJyZW50CiAgICAgICAgIGNodW5rKS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAJb2JzdGFjay5oeHEAfhSUdAAbc3RydWN0IG9ic3RhY2sgKm9ic3RhY2stcHRydAAGdm9pZCAqdAANb2JzdGFja19ibGFua3NxAH4ACnQAmgogICAgICAgIFRoZSBtb3N0IGJhc2ljIGZ1bmN0aW9uIGZvciBhZGRpbmcgdG8gYSBncm93aW5nIG9iamVjdCBpcwogICAgICAgICA8Q09ERT5vYnN0YWNrX2JsYW5rPC9DT0RFPiwgd2hpY2ggYWRkcyBzcGFjZSB3aXRob3V0IGluaXRpYWxpemluZyBpdC4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAJb2JzdGFjay5oeHEAfhSbdAAlc3RydWN0IG9ic3RhY2sgKm9ic3RhY2stcHRyLCBpbnQgc2l6ZXQABHZvaWR0ABJvYnN0YWNrX2JsYW5rX2Zhc3RzcQB+AAp0ALUKICAgICAgICBUaGUgZnVuY3Rpb24gPENPREU+b2JzdGFja19ibGFua19mYXN0PC9DT0RFPiBhZGRzIDxWQVI+c2l6ZTwvVkFSPiBieXRlcyB0byB0aGUKICAgICAgICAgZ3Jvd2luZyBvYmplY3QgaW4gb2JzdGFjayA8VkFSPm9ic3RhY2stcHRyPC9WQVI+IHdpdGhvdXQgaW5pdGlhbGl6aW5nIHRoZW0uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACW9ic3RhY2suaHhxAH4UonQAJXN0cnVjdCBvYnN0YWNrICpvYnN0YWNrLXB0ciwgaW50IHNpemV0AAR2b2lkdAAMb2JzdGFja19jb3B5c3EAfgAKdAEXCiAgICAgICAgVGhpcyBhbGxvY2F0ZXMgYSBibG9jayBhbmQgaW5pdGlhbGl6ZXMgaXQgYnkgY29weWluZyA8VkFSPnNpemU8L1ZBUj4KICAgICAgICAgYnl0ZXMgb2YgZGF0YSBzdGFydGluZyBhdCA8VkFSPmFkZHJlc3M8L1ZBUj4uICBJdCBjYWxscwogICAgICAgICA8Q09ERT5vYnN0YWNrX2FsbG9jX2ZhaWxlZF9oYW5kbGVyPC9DT0RFPiBpZiBhbGxvY2F0aW9uIG9mIG1lbW9yeSBieQogICAgICAgICA8Q09ERT5vYnN0YWNrX2NodW5rX2FsbG9jPC9DT0RFPiBmYWlsZWQuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACW9ic3RhY2suaHhxAH4UqXQANHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrLXB0ciwgdm9pZCAqYWRkcmVzcywgaW50IHNpemV0AAZ2b2lkICp0AA1vYnN0YWNrX2NvcHkwc3EAfgAKdACyCiAgICAgICAgTGlrZSA8Q09ERT5vYnN0YWNrX2NvcHk8L0NPREU+LCBidXQgYXBwZW5kcyBhbiBleHRyYSBieXRlIGNvbnRhaW5pbmcgYSBudWxsCiAgICAgICAgIGNoYXJhY3Rlci4gIFRoaXMgZXh0cmEgYnl0ZSBpcyBub3QgY291bnRlZCBpbiB0aGUgYXJndW1lbnQgPFZBUj5zaXplPC9WQVI+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAlvYnN0YWNrLmh4cQB+FLB0ADRzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjay1wdHIsIHZvaWQgKmFkZHJlc3MsIGludCBzaXpldAAGdm9pZCAqdAAOb2JzdGFja19maW5pc2hzcQB+AAp0AaoKICAgICAgICBXaGVuIHlvdSBhcmUgZmluaXNoZWQgZ3Jvd2luZyB0aGUgb2JqZWN0LCB1c2UgdGhlIGZ1bmN0aW9uCiAgICAgICAgIDxDT0RFPm9ic3RhY2tfZmluaXNoPC9DT0RFPiB0byBjbG9zZSBpdCBvZmYgYW5kIHJldHVybiBpdHMgZmluYWwgYWRkcmVzcy4KICAgICAgICAgPGJyPjxicj4gT25jZSB5b3UgaGF2ZSBmaW5pc2hlZCB0aGUgb2JqZWN0LCB0aGUgb2JzdGFjayBpcyBhdmFpbGFibGUgZm9yIG9yZGluYXJ5CiAgICAgICAgIGFsbG9jYXRpb24gb3IgZm9yIGdyb3dpbmcgYW5vdGhlciBvYmplY3QuCiAgICAgICAgIDxicj48YnI+IFRoaXMgZnVuY3Rpb24gY2FuIHJldHVybiBhIG51bGwgcG9pbnRlciB1bmRlciB0aGUgc2FtZSBjb25kaXRpb25zIGFzCiAgICAgICAgIDxDT0RFPm9ic3RhY2tfYWxsb2M8L0NPREU+IC4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAJb2JzdGFjay5oeHEAfhS3dAAbc3RydWN0IG9ic3RhY2sgKm9ic3RhY2stcHRydAAGdm9pZCAqdAAMb2JzdGFja19mcmVlc3EAfgAKdAFMCiAgICAgICAgSWYgPFZBUj5vYmplY3Q8L1ZBUj4gaXMgYSBudWxsIHBvaW50ZXIsIGV2ZXJ5dGhpbmcgYWxsb2NhdGVkIGluIHRoZSBvYnN0YWNrCiAgICAgICAgIGlzIGZyZWVkLiAgT3RoZXJ3aXNlLCA8VkFSPm9iamVjdDwvVkFSPiBtdXN0IGJlIHRoZSBhZGRyZXNzIG9mIGFuIG9iamVjdAogICAgICAgICBhbGxvY2F0ZWQgaW4gdGhlIG9ic3RhY2suICBUaGVuIDxWQVI+b2JqZWN0PC9WQVI+IGlzIGZyZWVkLCBhbG9uZyB3aXRoCiAgICAgICAgIGV2ZXJ5dGhpbmcgYWxsb2NhdGVkIGluIDxWQVI+b2JzdGFjazwvVkFSPiBzaW5jZSA8VkFSPm9iamVjdDwvVkFSPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAJb2JzdGFjay5oeHEAfhS+dAApc3RydWN0IG9ic3RhY2sgKm9ic3RhY2stcHRyLCB2b2lkICpvYmplY3R0AAR2b2lkdAAMb2JzdGFja19ncm93c3EAfgAKdAEcCiAgICAgICAgVG8gYWRkIGEgYmxvY2sgb2YgaW5pdGlhbGl6ZWQgc3BhY2UsIHVzZSA8Q09ERT5vYnN0YWNrX2dyb3c8L0NPREU+LCB3aGljaCBpcwogICAgICAgICB0aGUgZ3Jvd2luZy1vYmplY3QgYW5hbG9ndWUgb2YgPENPREU+b2JzdGFja19jb3B5PC9DT0RFPi4gIEl0IGFkZHMgPFZBUj5zaXplPC9WQVI+CiAgICAgICAgIGJ5dGVzIG9mIGRhdGEgdG8gdGhlIGdyb3dpbmcgb2JqZWN0LCBjb3B5aW5nIHRoZSBjb250ZW50cyBmcm9tCiAgICAgICAgIDxWQVI+ZGF0YTwvVkFSPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAJb2JzdGFjay5oeHEAfhTFdAAxc3RydWN0IG9ic3RhY2sgKm9ic3RhY2stcHRyLCB2b2lkICpkYXRhLCBpbnQgc2l6ZXQABHZvaWR0AA1vYnN0YWNrX2dyb3cwc3EAfgAKdADMCiAgICAgICAgVGhpcyBpcyB0aGUgZ3Jvd2luZy1vYmplY3QgYW5hbG9ndWUgb2YgPENPREU+b2JzdGFja19jb3B5MDwvQ09ERT4uICBJdCBhZGRzCiAgICAgICAgIDxWQVI+c2l6ZTwvVkFSPiBieXRlcyBjb3BpZWQgZnJvbSA8VkFSPmRhdGE8L1ZBUj4sIGZvbGxvd2VkIGJ5IGFuIGFkZGl0aW9uYWwgbnVsbAogICAgICAgICBjaGFyYWN0ZXIuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACW9ic3RhY2suaHhxAH4UzHQAMXN0cnVjdCBvYnN0YWNrICpvYnN0YWNrLXB0ciwgdm9pZCAqZGF0YSwgaW50IHNpemV0AAR2b2lkdAAMb2JzdGFja19pbml0c3EAfgAKdAHOCiAgICAgICAgSW5pdGlhbGl6ZSBvYnN0YWNrIDxWQVI+b2JzdGFjay1wdHI8L1ZBUj4gZm9yIGFsbG9jYXRpb24gb2Ygb2JqZWN0cy4gIFRoaXMKICAgICAgICAgZnVuY3Rpb24gY2FsbHMgdGhlIG9ic3RhY2sncyA8Q09ERT5vYnN0YWNrX2NodW5rX2FsbG9jPC9DT0RFPiBmdW5jdGlvbi4gIElmCiAgICAgICAgIGFsbG9jYXRpb24gb2YgbWVtb3J5IGZhaWxzLCB0aGUgZnVuY3Rpb24gcG9pbnRlZCB0byBieQogICAgICAgICA8Q09ERT5vYnN0YWNrX2FsbG9jX2ZhaWxlZF9oYW5kbGVyPC9DT0RFPiBpcyBjYWxsZWQuICBUaGUgPENPREU+b2JzdGFja19pbml0PC9DT0RFPgogICAgICAgICBmdW5jdGlvbiBhbHdheXMgcmV0dXJucyAxIChDb21wYXRpYmlsaXR5IG5vdGljZTogRm9ybWVyIHZlcnNpb25zIG9mCiAgICAgICAgIG9ic3RhY2sgcmV0dXJuZWQgMCBpZiBhbGxvY2F0aW9uIGZhaWxlZCkuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACW9ic3RhY2suaHhxAH4U03QAG3N0cnVjdCBvYnN0YWNrICpvYnN0YWNrLXB0cnQAA2ludHQAEG9ic3RhY2tfaW50X2dyb3dzcQB+AAp0AQQKICAgICAgICBBIHNpbmdsZSB2YWx1ZSBvZiB0eXBlIDxDT0RFPmludDwvQ09ERT4gY2FuIGJlIGFkZGVkIGJ5IHVzaW5nIHRoZQogICAgICAgICA8Q09ERT5vYnN0YWNrX2ludF9ncm93PC9DT0RFPiBmdW5jdGlvbi4gIEl0IGFkZHMgPENPREU+c2l6ZW9mIChpbnQpPC9DT0RFPiBieXRlcyB0bwogICAgICAgICB0aGUgZ3Jvd2luZyBvYmplY3QgYW5kIGluaXRpYWxpemVzIHRoZW0gd2l0aCB0aGUgdmFsdWUgb2YgPFZBUj5kYXRhPC9WQVI+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAlvYnN0YWNrLmh4cQB+FNp0ACVzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjay1wdHIsIGludCBkYXRhdAAEdm9pZHQAFW9ic3RhY2tfaW50X2dyb3dfZmFzdHNxAH4ACnQA2QogICAgICAgIFRoZSBmdW5jdGlvbiA8Q09ERT5vYnN0YWNrX2ludF9ncm93X2Zhc3Q8L0NPREU+IGFkZHMgPENPREU+c2l6ZW9mIChpbnQpPC9DT0RFPiBieXRlcwogICAgICAgICBjb250YWluaW5nIHRoZSB2YWx1ZSBvZiA8VkFSPmRhdGE8L1ZBUj4gdG8gdGhlIGdyb3dpbmcgb2JqZWN0IGluIG9ic3RhY2sKICAgICAgICAgPFZBUj5vYnN0YWNrLXB0cjwvVkFSPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAJb2JzdGFjay5oeHEAfhThdAAlc3RydWN0IG9ic3RhY2sgKm9ic3RhY2stcHRyLCBpbnQgZGF0YXQABHZvaWR0ABFvYnN0YWNrX25leHRfZnJlZXNxAH4ACnQBPQogICAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgZnJlZSBieXRlIGluIHRoZSBjdXJyZW50CiAgICAgICAgIGNodW5rIG9mIG9ic3RhY2sgPFZBUj5vYnN0YWNrLXB0cjwvVkFSPi4gIFRoaXMgaXMgdGhlIGVuZCBvZiB0aGUgY3VycmVudGx5CiAgICAgICAgIGdyb3dpbmcgb2JqZWN0LiAgSWYgbm8gb2JqZWN0IGlzIGdyb3dpbmcsIDxDT0RFPm9ic3RhY2tfbmV4dF9mcmVlPC9DT0RFPgogICAgICAgICByZXR1cm5zIHRoZSBzYW1lIHZhbHVlIGFzIDxDT0RFPm9ic3RhY2tfYmFzZTwvQ09ERT4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACW9ic3RhY2suaHhxAH4U6HQAG3N0cnVjdCBvYnN0YWNrICpvYnN0YWNrLXB0cnQABnZvaWQgKnQAE29ic3RhY2tfb2JqZWN0X3NpemVzcQB+AAp0AQUKICAgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGN1cnJlbnRseSBncm93aW5nIG9iamVjdC4KICAgICAgICAgVGhpcyBpcyBlcXVpdmFsZW50IHRvCiAgICAgICAgIDxicj48YnI+IDxwcmU+PGJyPgogICAgICAgICBvYnN0YWNrX25leHRfZnJlZSAoPFZBUj5vYnN0YWNrLXB0cjwvVkFSPikgLSBvYnN0YWNrX2Jhc2UgKDxWQVI+b2JzdGFjay1wdHI8L1ZBUj4pPGJyPgogICAgICAgICA8L3ByZT4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAJb2JzdGFjay5oeHQAE29ic3RhY2tfb2JqZWN0X3NpemV0ABtzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjay1wdHJ0AANpbnR0AA5vYnN0YWNrX3ByaW50ZnNxAH4ACnQBSwogICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byA8Q09ERT5hc3ByaW50ZjwvQ09ERT4sIGV4Y2VwdCB0aGF0IGl0IHVzZXMgdGhlCiAgICAgICAgIG9ic3RhY2sgPFZBUj5vYnN0YWNrPC9WQVI+IHRvIGFsbG9jYXRlIHRoZSBzcGFjZS4gIC4KICAgICAgICAgPGJyPjxicj4gVGhlIGNoYXJhY3RlcnMgYXJlIHdyaXR0ZW4gb250byB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IG9iamVjdC4KICAgICAgICAgVG8gZ2V0IGF0IHRoZW0sIHlvdSBtdXN0IGZpbmlzaCB0aGUgb2JqZWN0IHdpdGggPENPREU+b2JzdGFja19maW5pc2g8L0NPREU+CiAgICAgICAgIC4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHc3RkaW8uaHhxAH4U93QAMnN0cnVjdCBvYnN0YWNrICpvYnN0YWNrLCBjb25zdCBjaGFyICp0ZW1wbGF0ZSwgLi4udAADaW50dAAQb2JzdGFja19wdHJfZ3Jvd3NxAH4ACnQAzgogICAgICAgIEFkZGluZyB0aGUgdmFsdWUgb2YgYSBwb2ludGVyIG9uZSBjYW4gdXNlIHRoZSBmdW5jdGlvbgogICAgICAgICA8Q09ERT5vYnN0YWNrX3B0cl9ncm93PC9DT0RFPi4gIEl0IGFkZHMgPENPREU+c2l6ZW9mICh2b2lkICopPC9DT0RFPiBieXRlcwogICAgICAgICBjb250YWluaW5nIHRoZSB2YWx1ZSBvZiA8VkFSPmRhdGE8L1ZBUj4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACW9ic3RhY2suaHhxAH4U/nQAJ3N0cnVjdCBvYnN0YWNrICpvYnN0YWNrLXB0ciwgdm9pZCAqZGF0YXQABHZvaWR0ABVvYnN0YWNrX3B0cl9ncm93X2Zhc3RzcQB+AAp0ANwKICAgICAgICBUaGUgZnVuY3Rpb24gPENPREU+b2JzdGFja19wdHJfZ3Jvd19mYXN0PC9DT0RFPiBhZGRzIDxDT0RFPnNpemVvZiAodm9pZCAqKTwvQ09ERT4KICAgICAgICAgYnl0ZXMgY29udGFpbmluZyB0aGUgdmFsdWUgb2YgPFZBUj5kYXRhPC9WQVI+IHRvIHRoZSBncm93aW5nIG9iamVjdCBpbgogICAgICAgICBvYnN0YWNrIDxWQVI+b2JzdGFjay1wdHI8L1ZBUj4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACW9ic3RhY2suaHhxAH4VBXQAJ3N0cnVjdCBvYnN0YWNrICpvYnN0YWNrLXB0ciwgdm9pZCAqZGF0YXQABHZvaWR0AAxvYnN0YWNrX3Jvb21zcQB+AAp0AOAKICAgICAgICBUaGlzIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBiZSBhZGRlZCBzYWZlbHkgdG8gdGhlIGN1cnJlbnQKICAgICAgICAgZ3Jvd2luZyBvYmplY3QgKG9yIHRvIGFuIG9iamVjdCBhYm91dCB0byBiZSBzdGFydGVkKSBpbiBvYnN0YWNrCiAgICAgICAgIDxWQVI+b2JzdGFjazwvVkFSPiB1c2luZyB0aGUgZmFzdCBncm93dGggZnVuY3Rpb25zLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAlvYnN0YWNrLmh4cQB+FQx0ABtzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjay1wdHJ0AANpbnR0AA9vYnN0YWNrX3ZwcmludGZzcQB+AAp0AM4KICAgICAgICBUaGUgPENPREU+b2JzdGFja192cHJpbnRmPC9DT0RFPiBmdW5jdGlvbiBpcyB0aGUgZXF1aXZhbGVudCBvZgogICAgICAgICA8Q09ERT5vYnN0YWNrX3ByaW50ZjwvQ09ERT4gd2l0aCB0aGUgdmFyaWFibGUgYXJndW1lbnQgbGlzdCBzcGVjaWZpZWQgZGlyZWN0bHkKICAgICAgICAgYXMgZm9yIDxDT0RFPnZwcmludGY8L0NPREU+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAdzdGRpby5oeHEAfhUTdAA5c3RydWN0IG9ic3RhY2sgKm9ic3RhY2ssIGNvbnN0IGNoYXIgKnRlbXBsYXRlLCB2YV9saXN0IGFwdAADaW50dAAHb25fZXhpdHNxAH4ACnQCKQogICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgYSBzb21ld2hhdCBtb3JlIHBvd2VyZnVsIHZhcmlhbnQgb2YgPENPREU+YXRleGl0PC9DT0RFPi4gIEl0CiAgICAgICAgIGFjY2VwdHMgdHdvIGFyZ3VtZW50cywgYSBmdW5jdGlvbiA8VkFSPmZ1bmN0aW9uPC9WQVI+IGFuZCBhbiBhcmJpdHJhcnkKICAgICAgICAgcG9pbnRlciA8VkFSPmFyZzwvVkFSPi4gIEF0IG5vcm1hbCBwcm9ncmFtIHRlcm1pbmF0aW9uLCB0aGUgPFZBUj5mdW5jdGlvbjwvVkFSPiBpcwogICAgICAgICBjYWxsZWQgd2l0aCB0d28gYXJndW1lbnRzOiAgdGhlIDxWQVI+c3RhdHVzPC9WQVI+IHZhbHVlIHBhc3NlZCB0byA8Q09ERT5leGl0PC9DT0RFPiwKICAgICAgICAgYW5kIHRoZSA8VkFSPmFyZzwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiBpcyBpbmNsdWRlZCBpbiB0aGUgR05VIEMgbGlicmFyeSBvbmx5IGZvciBjb21wYXRpYmlsaXR5CiAgICAgICAgIGZvciBTdW5PUywgYW5kIG1heSBub3QgYmUgc3VwcG9ydGVkIGJ5IG90aGVyIGltcGxlbWVudGF0aW9ucy4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc3RkbGliLmh4cQB+FRp0ADJ2b2lkICgqZnVuY3Rpb24pKGludCBzdGF0dXMsIHZvaWQgKmFyZyksIHZvaWQgKmFyZ3QAA2ludHQABG9wZW5zcQB+AAp0D3wKICAgICAgICBUaGUgPENPREU+b3BlbjwvQ09ERT4gZnVuY3Rpb24gY3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBmaWxlIGRlc2NyaXB0b3IKICAgICAgICAgZm9yIHRoZSBmaWxlIG5hbWVkIGJ5IDxWQVI+ZmlsZW5hbWU8L1ZBUj4uICBJbml0aWFsbHksIHRoZSBmaWxlIHBvc2l0aW9uCiAgICAgICAgIGluZGljYXRvciBmb3IgdGhlIGZpbGUgaXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4gIFRoZSBhcmd1bWVudAogICAgICAgICA8VkFSPm1vZGU8L1ZBUj4gaXMgdXNlZCBvbmx5IHdoZW4gYSBmaWxlIGlzIGNyZWF0ZWQsIGJ1dCBpdCBkb2Vzbid0IGh1cnQKICAgICAgICAgdG8gc3VwcGx5IHRoZSBhcmd1bWVudCBpbiBhbnkgY2FzZS4KICAgICAgICAgPGJyPjxicj4gVGhlIDxWQVI+ZmxhZ3M8L1ZBUj4gYXJndW1lbnQgY29udHJvbHMgaG93IHRoZSBmaWxlIGlzIHRvIGJlIG9wZW5lZC4gIFRoaXMgaXMKICAgICAgICAgYSBiaXQgbWFzazsgeW91IGNyZWF0ZSB0aGUgdmFsdWUgYnkgdGhlIGJpdHdpc2UgT1Igb2YgdGhlIGFwcHJvcHJpYXRlCiAgICAgICAgIHBhcmFtZXRlcnMgKHVzaW5nIHRoZSA8c2FtcD58PC9zYW1wPiBvcGVyYXRvciBpbiBDKS4KICAgICAgICAgLCBmb3IgdGhlIHBhcmFtZXRlcnMgYXZhaWxhYmxlLgogICAgICAgICA8YnI+PGJyPiBUaGUgbm9ybWFsIHJldHVybiB2YWx1ZSBmcm9tIDxDT0RFPm9wZW48L0NPREU+IGlzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgZmlsZQogICAgICAgICBkZXNjcmlwdG9yLiAgSW4gdGhlIGNhc2Ugb2YgYW4gZXJyb3IsIGEgdmFsdWUgb2YgLTEgaXMgcmV0dXJuZWQKICAgICAgICAgaW5zdGVhZC4gIEluIGFkZGl0aW9uIHRvIHRoZSB1c3VhbCBmaWxlIG5hbWUgZXJyb3JzICwgdGhlIGZvbGxvd2luZyA8Q09ERT5lcnJubzwvQ09ERT4gZXJyb3IgY29uZGl0aW9ucyBhcmUgZGVmaW5lZAogICAgICAgICBmb3IgdGhpcyBmdW5jdGlvbjoKICAgICAgICAgPGJyPjxicj4gPERMPgoKICAgICAgICAgPERUPjxDT0RFPkVBQ0NFUzwvQ09ERT4KPEREPgogICAgICAgICBUaGUgZmlsZSBleGlzdHMgYnV0IGlzIG5vdCByZWFkYWJsZS93cml0YWJsZSBhcyByZXF1ZXN0ZWQgYnkgdGhlIDxWQVI+ZmxhZ3M8L1ZBUj4KICAgICAgICAgYXJndW1lbnQsIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0IGFuZCB0aGUgZGlyZWN0b3J5IGlzIHVud3JpdGFibGUgc28KICAgICAgICAgaXQgY2Fubm90IGJlIGNyZWF0ZWQuCiAgICAgICAgIDxicj48YnI+IDxMST4gRUVYSVNUCiAgICAgICAgIEJvdGggPENPREU+T19DUkVBVDwvQ09ERT4gYW5kIDxDT0RFPk9fRVhDTDwvQ09ERT4gYXJlIHNldCwgYW5kIHRoZSBuYW1lZCBmaWxlIGFscmVhZHkKICAgICAgICAgZXhpc3RzLgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVJTlRSCiAgICAgICAgIFRoZSA8Q09ERT5vcGVuPC9DT0RFPiBvcGVyYXRpb24gd2FzIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsLgogICAgICAgICAuCiAgICAgICAgIDxicj48YnI+IDxMST4gRUlTRElSCiAgICAgICAgIFRoZSA8VkFSPmZsYWdzPC9WQVI+IGFyZ3VtZW50IHNwZWNpZmllZCB3cml0ZSBhY2Nlc3MsIGFuZCB0aGUgZmlsZSBpcyBhIGRpcmVjdG9yeS4KICAgICAgICAgPGJyPjxicj4gPExJPiBFTUZJTEUKICAgICAgICAgVGhlIHByb2Nlc3MgaGFzIHRvbyBtYW55IGZpbGVzIG9wZW4uCiAgICAgICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGlzIGNvbnRyb2xsZWQgYnkgdGhlCiAgICAgICAgIDxDT0RFPlJMSU1JVF9OT0ZJTEU8L0NPREU+IHJlc291cmNlIGxpbWl0OyAuCiAgICAgICAgIDxicj48YnI+IDxMST4gRU5GSUxFCiAgICAgICAgIFRoZSBlbnRpcmUgc3lzdGVtLCBvciBwZXJoYXBzIHRoZSBmaWxlIHN5c3RlbSB3aGljaCBjb250YWlucyB0aGUKICAgICAgICAgZGlyZWN0b3J5LCBjYW5ub3Qgc3VwcG9ydCBhbnkgYWRkaXRpb25hbCBvcGVuIGZpbGVzIGF0IHRoZSBtb21lbnQuCiAgICAgICAgIChUaGlzIHByb2JsZW0gY2Fubm90IGhhcHBlbiBvbiB0aGUgR05VIHN5c3RlbS4pCiAgICAgICAgIDxicj48YnI+IDxMST4gRU5PRU5UCiAgICAgICAgIFRoZSBuYW1lZCBmaWxlIGRvZXMgbm90IGV4aXN0LCBhbmQgPENPREU+T19DUkVBVDwvQ09ERT4gaXMgbm90IHNwZWNpZmllZC4KICAgICAgICAgPGJyPjxicj4gPExJPiBFTk9TUEMKICAgICAgICAgVGhlIGRpcmVjdG9yeSBvciBmaWxlIHN5c3RlbSB0aGF0IHdvdWxkIGNvbnRhaW4gdGhlIG5ldyBmaWxlIGNhbm5vdCBiZQogICAgICAgICBleHRlbmRlZCwgYmVjYXVzZSB0aGVyZSBpcyBubyBkaXNrIHNwYWNlIGxlZnQuCiAgICAgICAgIDxicj48YnI+IDxMST4gRU5YSU8KICAgICAgICAgPENPREU+T19OT05CTE9DSzwvQ09ERT4gYW5kIDxDT0RFPk9fV1JPTkxZPC9DT0RFPiBhcmUgYm90aCBzZXQgaW4gdGhlIDxWQVI+ZmxhZ3M8L1ZBUj4KICAgICAgICAgYXJndW1lbnQsIHRoZSBmaWxlIG5hbWVkIGJ5IDxWQVI+ZmlsZW5hbWU8L1ZBUj4gaXMgYSBGSUZPICwgYW5kIG5vIHByb2Nlc3MgaGFzIHRoZSBmaWxlIG9wZW4gZm9yIHJlYWRpbmcuCiAgICAgICAgIDxicj48YnI+IDxMST4gRVJPRlMKICAgICAgICAgVGhlIGZpbGUgcmVzaWRlcyBvbiBhIHJlYWQtb25seSBmaWxlIHN5c3RlbSBhbmQgYW55IG9mIDxDT0RFPk9fV1JPTkxZPC9DT0RFPiwKICAgICAgICAgPENPREU+T19SRFdSPC9DT0RFPiwgYW5kIDxDT0RFPk9fVFJVTkM8L0NPREU+IGFyZSBzZXQgaW4gdGhlIDxWQVI+ZmxhZ3M8L1ZBUj4gYXJndW1lbnQsCiAgICAgICAgIG9yIDxDT0RFPk9fQ1JFQVQ8L0NPREU+IGlzIHNldCBhbmQgdGhlIGZpbGUgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4KCiAgICAgICAgIDxicj48YnI+IDxicj48YnI+IElmIG9uIGEgMzIgYml0IG1hY2hpbmUgdGhlIHNvdXJjZXMgYXJlIHRyYW5zbGF0ZWQgd2l0aAogICAgICAgICA8Q09ERT5fRklMRV9PRkZTRVRfQklUUyA9PSA2NDwvQ09ERT4gdGhlIGZ1bmN0aW9uIDxDT0RFPm9wZW48L0NPREU+IHJldHVybnMgYSBmaWxlCiAgICAgICAgIGRlc2NyaXB0b3Igb3BlbmVkIGluIHRoZSBsYXJnZSBmaWxlIG1vZGUgd2hpY2ggZW5hYmxlcyB0aGUgZmlsZSBoYW5kbGluZwogICAgICAgICBmdW5jdGlvbnMgdG8gdXNlIGZpbGVzIHVwIHRvIDJeNjMgYnl0ZXMgaW4gc2l6ZSBhbmQgb2Zmc2V0IGZyb20KICAgICAgICAgLTJeNjMgdG8gMl42My4gIFRoaXMgaGFwcGVucyB0cmFuc3BhcmVudGx5IGZvciB0aGUgdXNlcgogICAgICAgICBzaW5jZSBhbGwgb2YgdGhlIGxvd2xldmVsIGZpbGUgaGFuZGxpbmcgZnVuY3Rpb25zIGFyZSBlcXVhbGx5IHJlcGxhY2VkLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGluIG11bHRpLXRocmVhZGVkIHByb2dyYW1zLiAgVGhpcwogICAgICAgICBpcyBhIHByb2JsZW0gaWYgdGhlIHRocmVhZCBhbGxvY2F0ZXMgc29tZSByZXNvdXJjZXMgKGxpa2UgbWVtb3J5LCBmaWxlCiAgICAgICAgIGRlc2NyaXB0b3JzLCBzZW1hcGhvcmVzIG9yIHdoYXRldmVyKSBhdCB0aGUgdGltZSA8Q09ERT5vcGVuPC9DT0RFPiBpcwogICAgICAgICBjYWxsZWQuICBJZiB0aGUgdGhyZWFkIGdldHMgY2FuY2VsZWQgdGhlc2UgcmVzb3VyY2VzIHN0YXkgYWxsb2NhdGVkCiAgICAgICAgIHVudGlsIHRoZSBwcm9ncmFtIGVuZHMuICBUbyBhdm9pZCB0aGlzIGNhbGxzIHRvIDxDT0RFPm9wZW48L0NPREU+IHNob3VsZCBiZQogICAgICAgICBwcm90ZWN0ZWQgdXNpbmcgY2FuY2VsbGF0aW9uIGhhbmRsZXJzLgogICAgICAgICA8YnI+PGJyPiBUaGUgPENPREU+b3BlbjwvQ09ERT4gZnVuY3Rpb24gaXMgdGhlIHVuZGVybHlpbmcgcHJpbWl0aXZlIGZvciB0aGUgPENPREU+Zm9wZW48L0NPREU+CiAgICAgICAgIGFuZCA8Q09ERT5mcmVvcGVuPC9DT0RFPiBmdW5jdGlvbnMsIHRoYXQgY3JlYXRlIHN0cmVhbXMuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB2ZjbnRsLmh4cQB+FSF0AC5jb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGZsYWdzWywgbW9kZV90IG1vZGVddAADaW50dAAGb3BlbjY0c3EAfgAKdAJwCiAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIDxDT0RFPm9wZW48L0NPREU+LiAgSXQgcmV0dXJucyBhIGZpbGUgZGVzY3JpcHRvcgogICAgICAgICB3aGljaCBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgdGhlIGZpbGUgbmFtZWQgYnkgPFZBUj5maWxlbmFtZTwvVkFSPi4gIFRoZSBvbmx5CiAgICAgICAgIGRpZmZlcmVuY2UgaXMgdGhhdCBvbiAzMiBiaXQgc3lzdGVtcyB0aGUgZmlsZSBpcyBvcGVuZWQgaW4gdGhlCiAgICAgICAgIGxhcmdlIGZpbGUgbW9kZS4gIEkuZS4sIGZpbGUgbGVuZ3RoIGFuZCBmaWxlIG9mZnNldHMgY2FuIGV4Y2VlZCAzMSBiaXRzLgogICAgICAgICA8YnI+PGJyPiBXaGVuIHRoZSBzb3VyY2VzIGFyZSB0cmFuc2xhdGVkIHdpdGggPENPREU+X0ZJTEVfT0ZGU0VUX0JJVFMgPT0gNjQ8L0NPREU+IHRoaXMKICAgICAgICAgZnVuY3Rpb24gaXMgYWN0dWFsbHkgYXZhaWxhYmxlIHVuZGVyIHRoZSBuYW1lIDxDT0RFPm9wZW48L0NPREU+LiAgSS5lLiwgdGhlCiAgICAgICAgIG5ldywgZXh0ZW5kZWQgQVBJIHVzaW5nIDY0IGJpdCBmaWxlIHNpemVzIGFuZCBvZmZzZXRzIHRyYW5zcGFyZW50bHkKICAgICAgICAgcmVwbGFjZXMgdGhlIG9sZCBBUEkuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB2ZjbnRsLmh4cQB+FSh0AC5jb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGZsYWdzWywgbW9kZV90IG1vZGVddAADaW50dAAOb3Blbl9tZW1zdHJlYW1zcQB+AAp0BLEKICAgICAgICBUaGlzIGZ1bmN0aW9uIG9wZW5zIGEgc3RyZWFtIGZvciB3cml0aW5nIHRvIGEgYnVmZmVyLiAgVGhlIGJ1ZmZlciBpcwogICAgICAgICBhbGxvY2F0ZWQgZHluYW1pY2FsbHkgYW5kIGdyb3duIGFzIG5lY2Vzc2FyeSwgdXNpbmcgPENPREU+bWFsbG9jPC9DT0RFPi4KICAgICAgICAgQWZ0ZXIgeW91J3ZlIGNsb3NlZCB0aGUgc3RyZWFtLCB0aGlzIGJ1ZmZlciBpcyB5b3VyIHJlc3BvbnNpYmlsaXR5IHRvCiAgICAgICAgIGNsZWFuIHVwIHVzaW5nIDxDT0RFPmZyZWU8L0NPREU+IG9yIDxDT0RFPnJlYWxsb2M8L0NPREU+LiAgLgogICAgICAgICA8YnI+PGJyPiBXaGVuIHRoZSBzdHJlYW0gaXMgY2xvc2VkIHdpdGggPENPREU+ZmNsb3NlPC9DT0RFPiBvciBmbHVzaGVkIHdpdGgKICAgICAgICAgPENPREU+ZmZsdXNoPC9DT0RFPiwgdGhlIGxvY2F0aW9ucyA8VkFSPnB0cjwvVkFSPiBhbmQgPFZBUj5zaXplbG9jPC9WQVI+IGFyZSB1cGRhdGVkIHRvCiAgICAgICAgIGNvbnRhaW4gdGhlIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBhbmQgaXRzIHNpemUuICBUaGUgdmFsdWVzIHRodXMgc3RvcmVkCiAgICAgICAgIHJlbWFpbiB2YWxpZCBvbmx5IGFzIGxvbmcgYXMgbm8gZnVydGhlciBvdXRwdXQgb24gdGhlIHN0cmVhbSB0YWtlcwogICAgICAgICBwbGFjZS4gIElmIHlvdSBkbyBtb3JlIG91dHB1dCwgeW91IG11c3QgZmx1c2ggdGhlIHN0cmVhbSBhZ2FpbiB0byBzdG9yZQogICAgICAgICBuZXcgdmFsdWVzIGJlZm9yZSB5b3UgdXNlIHRoZW0gYWdhaW4uCiAgICAgICAgIDxicj48YnI+IEEgbnVsbCBjaGFyYWN0ZXIgaXMgd3JpdHRlbiBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIuICBUaGlzIG51bGwgY2hhcmFjdGVyCiAgICAgICAgIGlzIDxFTT5ub3Q8L0VNPiBpbmNsdWRlZCBpbiB0aGUgc2l6ZSB2YWx1ZSBzdG9yZWQgYXQgPFZBUj5zaXplbG9jPC9WQVI+LgogICAgICAgICA8YnI+PGJyPiBZb3UgY2FuIG1vdmUgdGhlIHN0cmVhbSdzIGZpbGUgcG9zaXRpb24gd2l0aCA8Q09ERT5mc2VlazwvQ09ERT4gb3IKICAgICAgICAgPENPREU+ZnNlZWtvPC9DT0RFPiAuICBNb3ZpbmcgdGhlIGZpbGUgcG9zaXRpb24gcGFzdAogICAgICAgICB0aGUgZW5kIG9mIHRoZSBkYXRhIGFscmVhZHkgd3JpdHRlbiBmaWxscyB0aGUgaW50ZXJ2ZW5pbmcgc3BhY2Ugd2l0aAogICAgICAgICB6ZXJvZXMuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3N0ZGlvLmh4cQB+FS90ABtjaGFyICoqcHRyLCBzaXplX3QgKnNpemVsb2N0AAZGSUxFICp0ABNvcGVuX29ic3RhY2tfc3RyZWFtc3EAfgAKdAXuCiAgICAgICAgVGhpcyBmdW5jdGlvbiBvcGVucyBhIHN0cmVhbSBmb3Igd3JpdGluZyBkYXRhIGludG8gdGhlIG9ic3RhY2sgPFZBUj5vYnN0YWNrPC9WQVI+LgogICAgICAgICBUaGlzIHN0YXJ0cyBhbiBvYmplY3QgaW4gdGhlIG9ic3RhY2sgYW5kIG1ha2VzIGl0IGdyb3cgYXMgZGF0YSBpcwogICAgICAgICB3cml0dGVuIC4KICAgICAgICAgPGJyPjxicj4gQ2FsbGluZyA8Q09ERT5mZmx1c2g8L0NPREU+IG9uIHRoaXMgc3RyZWFtIHVwZGF0ZXMgdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUKICAgICAgICAgb2JqZWN0IHRvIG1hdGNoIHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IGhhcyBiZWVuIHdyaXR0ZW4uICBBZnRlciBhIGNhbGwKICAgICAgICAgdG8gPENPREU+ZmZsdXNoPC9DT0RFPiwgeW91IGNhbiBleGFtaW5lIHRoZSBvYmplY3QgdGVtcG9yYXJpbHkuCiAgICAgICAgIDxicj48YnI+IFlvdSBjYW4gbW92ZSB0aGUgZmlsZSBwb3NpdGlvbiBvZiBhbiBvYnN0YWNrIHN0cmVhbSB3aXRoIDxDT0RFPmZzZWVrPC9DT0RFPiBvcgogICAgICAgICA8Q09ERT5mc2Vla288L0NPREU+IC4gIE1vdmluZyB0aGUgZmlsZSBwb3NpdGlvbiBwYXN0CiAgICAgICAgIHRoZSBlbmQgb2YgdGhlIGRhdGEgd3JpdHRlbiBmaWxscyB0aGUgaW50ZXJ2ZW5pbmcgc3BhY2Ugd2l0aCB6ZXJvcy4KICAgICAgICAgPGJyPjxicj4gVG8gbWFrZSB0aGUgb2JqZWN0IHBlcm1hbmVudCwgdXBkYXRlIHRoZSBvYnN0YWNrIHdpdGggPENPREU+ZmZsdXNoPC9DT0RFPiwgYW5kCiAgICAgICAgIHRoZW4gdXNlIDxDT0RFPm9ic3RhY2tfZmluaXNoPC9DT0RFPiB0byBmaW5hbGl6ZSB0aGUgb2JqZWN0IGFuZCBnZXQgaXRzIGFkZHJlc3MuCiAgICAgICAgIFRoZSBmb2xsb3dpbmcgd3JpdGUgdG8gdGhlIHN0cmVhbSBzdGFydHMgYSBuZXcgb2JqZWN0IGluIHRoZSBvYnN0YWNrLAogICAgICAgICBhbmQgbGF0ZXIgd3JpdGVzIGFkZCB0byB0aGF0IG9iamVjdCB1bnRpbCB5b3UgZG8gYW5vdGhlciA8Q09ERT5mZmx1c2g8L0NPREU+CiAgICAgICAgIGFuZCA8Q09ERT5vYnN0YWNrX2ZpbmlzaDwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IEJ1dCBob3cgZG8geW91IGZpbmQgb3V0IGhv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ciAqZGlybmFtZXQABURJUiAqdAAHb3BlbmxvZ3NxAH4ACnQWZQogICAgICAgIDxicj48YnI+IDxDT0RFPm9wZW5sb2c8L0NPREU+IG9wZW5zIG9yIHJlb3BlbnMgYSBjb25uZWN0aW9uIHRvIFN5c2xvZyBpbiBwcmVwYXJhdGlvbgogICAgICAgICBmb3Igc3VibWl0dGluZyBtZXNzYWdlcy4KICAgICAgICAgPGJyPjxicj4gPFZBUj5pZGVudDwvVkFSPiBpcyBhbiBhcmJpdHJhcnkgaWRlbnRpZmljYXRpb24gc3RyaW5nIHdoaWNoIGZ1dHVyZQogICAgICAgICA8Q09ERT5zeXNsb2c8L0NPREU+IGludm9jYXRpb25zIHdpbGwgcHJlZml4IHRvIGVhY2ggbWVzc2FnZS4gIFRoaXMgaXMgaW50ZW5kZWQKICAgICAgICAgdG8gaWRlbnRpZnkgdGhlIHNvdXJjZSBvZiB0aGUgbWVzc2FnZSwgYW5kIHBlb3BsZSBjb252ZW50aW9uYWxseSBzZXQgaXQKICAgICAgICAgdG8gdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gdGhhdCB3aWxsIHN1Ym1pdCB0aGUgbWVzc2FnZXMuCiAgICAgICAgIDxicj48YnI+IElmIDxWQVI+aWRlbnQ8L1ZBUj4gaXMgTlVMTCwgb3IgaWYgPENPREU+b3BlbmxvZzwvQ09ERT4gaXMgbm90IGNhbGxlZCwgdGhlIGRlZmF1bHQKICAgICAgICAgaWRlbnRpZmljYXRpb24gc3RyaW5nIHVzZWQgaW4gU3lzbG9nIG1lc3NhZ2VzIHdpbGwgYmUgdGhlIHByb2dyYW0gbmFtZSwKICAgICAgICAgdGFrZW4gZnJvbSBhcmd2WzBdLgogICAgICAgICA8YnI+PGJyPiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBzdHJpbmcgcG9pbnRlciA8VkFSPmlkZW50PC9WQVI+IHdpbGwgYmUgcmV0YWluZWQKICAgICAgICAgaW50ZXJuYWxseSBieSB0aGUgU3lzbG9nIHJvdXRpbmVzLiAgWW91IG11c3Qgbm90IGZyZWUgdGhlIG1lbW9yeSB0aGF0CiAgICAgICAgIDxWQVI+aWRlbnQ8L1ZBUj4gcG9pbnRzIHRvLiAgSXQgaXMgYWxzbyBkYW5nZXJvdXMgdG8gcGFzcyBhIHJlZmVyZW5jZSB0byBhbgogICAgICAgICBhdXRvbWF0aWMgdmFyaWFibGUgc2luY2UgbGVhdmluZyB0aGUgc2NvcGUgd291bGQgbWVhbiBlbmRpbmcgdGhlCiAgICAgICAgIGxpZmV0aW1lIG9mIHRoZSB2YXJpYWJsZS4gIElmIHlvdSB3YW50IHRvIGNoYW5nZSB0aGUgPFZBUj5pZGVudDwvVkFSPiBzdHJpbmcsCiAgICAgICAgIHlvdSBtdXN0IGNhbGwgPENPREU+b3BlbmxvZzwvQ09ERT4gYWdhaW47IG92ZXJ3cml0aW5nIHRoZSBzdHJpbmcgcG9pbnRlZCB0byBieQogICAgICAgICA8VkFSPmlkZW50PC9WQVI+IGlzIG5vdCB0aHJlYWQtc2FmZS4KICAgICAgICAgPGJyPjxicj4gWW91IGNhbiBjYXVzZSB0aGUgU3lzbG9nIHJvdXRpbmVzIHRvIGRyb3AgdGhlIHJlZmVyZW5jZSB0byA8VkFSPmlkZW50PC9WQVI+IGFuZAogICAgICAgICBnbyBiYWNrIHRvIHRoZSBkZWZhdWx0IHN0cmluZyAodGhlIHByb2dyYW0gbmFtZSB0YWtlbiBmcm9tIGFyZ3ZbMF0pLCBieQogICAgICAgICBjYWxsaW5nIDxDT0RFPmNsb3NlbG9nPC9DT0RFPjogLgogICAgICAgICA8YnI+PGJyPiBJbiBwYXJ0aWN1bGFyLCBpZiB5b3UgYXJlIHdyaXRpbmcgY29kZSBmb3IgYSBzaGFyZWQgbGlicmFyeSB0aGF0IG1pZ2h0IGdldAogICAgICAgICBsb2FkZWQgYW5kIHRoZW4gdW5sb2FkZWQgKGUuZy4gYSBQQU0gbW9kdWxlKSwgYW5kIHlvdSB1c2UgPENPREU+b3BlbmxvZzwvQ09ERT4sCiAgICAgICAgIHlvdSBtdXN0IGNhbGwgPENPREU+Y2xvc2Vsb2c8L0NPREU+IGJlZm9yZSBhbnkgcG9pbnQgd2hlcmUgeW91ciBsaWJyYXJ5IG1pZ2h0CiAgICAgICAgIGdldCB1bmxvYWRlZCwgYXMgaW4gdGhpcyBleGFtcGxlOgogICAgICAgICA8YnI+PGJyPiA8cHJlPjxicj4KICAgICAgICAgI2luY2x1ZGUgPHN5c2xvZy5oPjxicj4KICAgICAgICAgPGJyPjxicj4gdm9pZDxicj4KICAgICAgICAgc2hhcmVkX2xpYnJhcnlfZnVuY3Rpb24gKHZvaWQpPGJyPgogICAgICAgICB7PGJyPgogICAgICAgICAgIG9wZW5sb2cgKCJteWxpYnJhcnkiLCBvcHRpb24sIHByaW9yaXR5KTs8YnI+CiAgICAgICAgIDxicj48YnI+ICAgc3lzbG9nIChMT0dfSU5GTywgInNoYXJlZCBsaWJyYXJ5IGhhcyBiZWVuIGludm9rZWQiKTs8YnI+CiAgICAgICAgIDxicj48YnI+ICAgY2xvc2Vsb2cgKCk7PGJyPgogICAgICAgICB9PGJyPgogICAgICAgICA8L3ByZT4KICAgICAgICAgPGJyPjxicj4gV2l0aG91dCB0aGUgY2FsbCB0byA8Q09ERT5jbG9zZWxvZzwvQ09ERT4sIGZ1dHVyZSBpbnZvY2F0aW9ucyBvZiA8Q09ERT5zeXNsb2c8L0NPREU+CiAgICAgICAgIGJ5IHRoZSBwcm9ncmFtIHVzaW5nIHRoZSBzaGFyZWQgbGlicmFyeSBtYXkgY3Jhc2gsIGlmIHRoZSBsaWJyYXJ5IGdldHMKICAgICAgICAgdW5sb2FkZWQgYW5kIHRoZSBtZW1vcnkgY29udGFpbmluZyB0aGUgc3RyaW5nIDxDT0RFPiJteWxpYnJhcnkiPC9DT0RFPiBiZWNvbWVzCiAgICAgICAgIHVubWFwcGVkLiAgVGhpcyBpcyBhIGxpbWl0YXRpb24gb2YgdGhlIEJTRCBzeXNsb2cgaW50ZXJmYWNlLgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5vcGVubG9nPC9DT0RFPiBtYXkgb3IgbWF5IG5vdCBvcGVuIHRoZSA8VFQ+L2Rldi9sb2c8L1RUPiBzb2NrZXQsIGRlcGVuZGluZwogICAgICAgICBvbiA8VkFSPm9wdGlvbjwvVkFSPi4gIElmIGl0IGRvZXMsIGl0IHRyaWVzIHRvIG9wZW4gaXQgYW5kIGNvbm5lY3QgaXQgYXMgYQogICAgICAgICBzdHJlYW0gc29ja2V0LiAgSWYgdGhhdCBkb2Vzbid0IHdvcmssIGl0IHRyaWVzIHRvIG9wZW4gaXQgYW5kIGNvbm5lY3QgaXQKICAgICAgICAgYXMgYSBkYXRhZ3JhbSBzb2NrZXQuICBUaGUgc29ja2V0IGhhcyB0aGUgYGBDbG9zZSBvbiBFeGVjJycgYXR0cmlidXRlLAogICAgICAgICBzbyB0aGUga2VybmVsIHdpbGwgY2xvc2UgaXQgaWYgdGhlIHByb2Nlc3MgcGVyZm9ybXMgYW4gZXhlYy4KICAgICAgICAgPGJyPjxicj4gWW91IGRvbid0IGhhdmUgdG8gdXNlIDxDT0RFPm9wZW5sb2c8L0NPREU+LiAgSWYgeW91IGNhbGwgPENPREU+c3lzbG9nPC9DT0RFPiB3aXRob3V0CiAgICAgICAgIGhhdmluZyBjYWxsZWQgPENPREU+b3BlbmxvZzwvQ09ERT4sIDxDT0RFPnN5c2xvZzwvQ09ERT4ganVzdCBvcGVucyB0aGUgY29ubmVjdGlvbgogICAgICAgICBpbXBsaWNpdGx5IGFuZCB1c2VzIGRlZmF1bHRzIGZvciB0aGUgaW5mb3JtYXRpb24gaW4gPFZBUj5pZGVudDwvVkFSPiBhbmQKICAgICAgICAgPFZBUj5vcHRpb25zPC9WQVI+LgogICAgICAgICA8YnI+PGJyPiA8VkFSPm9wdGlvbnM8L1ZBUj4gaXMgYSBiaXQgc3RyaW5nLCB3aXRoIHRoZSBiaXRzIGFzIGRlZmluZWQgYnkgdGhlIGZvbGxvd2luZwogICAgICAgICBzaW5nbGUgYml0IG1hc2tzOgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8RFQ+PENPREU+TE9HX1BFUlJPUjwvQ09ERT4KPEREPgogICAgICAgICBJZiBvbiwgPENPREU+b3BlbmxvZzwvQ09ERT4gc2V0cyB1cCB0aGUgY29ubmVjdGlvbiBzbyB0aGF0IGFueSA8Q09ERT5zeXNsb2c8L0NPREU+CiAgICAgICAgIG9uIHRoaXMgY29ubmVjdGlvbiB3cml0ZXMgaXRzIG1lc3NhZ2UgdG8gdGhlIGNhbGxpbmcgcHJvY2VzcycgU3RhbmRhcmQKICAgICAgICAgRXJyb3Igc3RyZWFtIGluIGFkZGl0aW9uIHRvIHN1Ym1pdHRpbmcgaXQgdG8gU3lzbG9nLiAgSWYgb2ZmLCA8Q09ERT5zeXNsb2c8L0NPREU+CiAgICAgICAgIGRvZXMgbm90IHdyaXRlIHRoZSBtZXNzYWdlIHRvIFN0YW5kYXJkIEVycm9yLgogICAgICAgICA8YnI+PGJyPiA8TEk+IExPR19DT05TCiAgICAgICAgIElmIG9uLCA8Q09ERT5vcGVubG9nPC9DT0RFPiBzZXRzIHVwIHRoZSBjb25uZWN0aW9uIHNvIHRoYXQgYSA8Q09ERT5zeXNsb2c8L0NPREU+IG9uCiAgICAgICAgIHRoaXMgY29ubmVjdGlvbiB0aGF0IGZhaWxzIHRvIHN1Ym1pdCBhIG1lc3NhZ2UgdG8gU3lzbG9nIHdyaXRlcyB0aGUKICAgICAgICAgbWVzc2FnZSBpbnN0ZWFkIHRvIHN5c3RlbSBjb25zb2xlLiAgSWYgb2ZmLCA8Q09ERT5zeXNsb2c8L0NPREU+IGRvZXMgbm90IHdyaXRlCiAgICAgICAgIHRvIHRoZSBzeXN0ZW0gY29uc29sZSAoYnV0IG9mIGNvdXJzZSBTeXNsb2cgbWF5IHdyaXRlIG1lc3NhZ2VzIGl0CiAgICAgICAgIHJlY2VpdmVzIHRvIHRoZSBjb25zb2xlKS4KICAgICAgICAgPGJyPjxicj4gPExJPiBMT0dfUElECiAgICAgICAgIFdoZW4gb24sIDxDT0RFPm9wZW5sb2c8L0NPREU+IHNldHMgdXAgdGhlIGNvbm5lY3Rpb24gc28gdGhhdCBhIDxDT0RFPnN5c2xvZzwvQ09ERT4KICAgICAgICAgb24gdGhpcyBjb25uZWN0aW9uIGluc2VydHMgdGhlIGNhbGxpbmcgcHJvY2VzcycgUHJvY2VzcyBJRCAoUElEKSBpbnRvCiAgICAgICAgIHRoZSBtZXNzYWdlLiAgV2hlbiBvZmYsIDxDT0RFPm9wZW5sb2c8L0NPREU+IGRvZXMgbm90IGluc2VydCB0aGUgUElELgogICAgICAgICA8YnI+PGJyPiA8TEk+IExPR19OREVMQVkKICAgICAgICAgV2hlbiBvbiwgPENPREU+b3BlbmxvZzwvQ09ERT4gb3BlbnMgYW5kIGNvbm5lY3RzIHRoZSA8VFQ+L2Rldi9sb2c8L1RUPiBzb2NrZXQuCiAgICAgICAgIFdoZW4gb2ZmLCBhIGZ1dHVyZSA8Q09ERT5zeXNsb2c8L0NPREU+IGNhbGwgbXVzdCBvcGVuIGFuZCBjb25uZWN0IHRoZSBzb2NrZXQuCiAgICAgICAgIDxicj48YnI+IFBvcnRhYmlsaXR5IG5vdGU6ICBJbiBlYXJseSBzeXN0ZW1zLCB0aGUgc2Vuc2Ugb2YgdGhpcyBiaXQgd2FzCiAgICAgICAgIGV4YWN0bHkgdGhlIG9wcG9zaXRlLgogICAgICAgICA8YnI+PGJyPiA8TEk+IExPR19PREVMQVkKICAgICAgICAgVGhpcyBiaXQgZG9lcyBub3RoaW5nLiAgSXQgZXhpc3RzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgogICAgICAgICA8YnI+PGJyPgogICAgICAgICA8YnI+PGJyPiBJZiBhbnkgb3RoZXIgYml0IGluIDxWQVI+b3B0aW9uczwvVkFSPiBpcyBvbiwgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQuCiAgICAgICAgIDxicj48YnI+IDxWQVI+ZmFjaWxpdHk8L1ZBUj4gaXMgdGhlIGRlZmF1bHQgZmFjaWxpdHkgY29kZSBmb3IgdGhpcyBjb25uZWN0aW9uLiAgQQogICAgICAgICA8Q09ERT5zeXNsb2c8L0NPREU+IG9uIHRoaXMgY29ubmVjdGlvbiB0aGF0IHNwZWNpZmllcyBkZWZhdWx0IGZhY2lsaXR5IGNhdXNlcwogICAgICAgICB0aGlzIGZhY2lsaXR5IHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVzc2FnZS4gIFNlZSA8Q09ERT5zeXNsb2c8L0NPREU+IGZvcgogICAgICAgICBwb3NzaWJsZSB2YWx1ZXMuICBBIHZhbHVlIG9mIHplcm8gbWVhbnMgdGhlIGRlZmF1bHQgZGVmYXVsdCwgd2hpY2ggaXMKICAgICAgICAgPENPREU+TE9HX1VTRVI8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBJZiBhIFN5c2xvZyBjb25uZWN0aW9uIGlzIGFscmVhZHkgb3BlbiB3aGVuIHlvdSBjYWxsIDxDT0RFPm9wZW5sb2c8L0NPREU+LAogICAgICAgICA8Q09ERT5vcGVubG9nPC9DT0RFPiBgYHJlb3BlbnMnJyB0aGUgY29ubmVjdGlvbi4gIFJlb3BlbmluZyBpcyBsaWtlIG9wZW5pbmcKICAgICAgICAgZXhjZXB0IHRoYXQgaWYgeW91IHNwZWNpZnkgemVybyBmb3IgdGhlIGRlZmF1bHQgZmFjaWxpdHkgY29kZSwgdGhlCiAgICAgICAgIGRlZmF1bHQgZmFjaWxpdHkgY29kZSBzaW1wbHkgcmVtYWlucyB1bmNoYW5nZWQgYW5kIGlmIHlvdSBzcGVjaWZ5CiAgICAgICAgIExPR19OREVMQVkgYW5kIHRoZSBzb2NrZXQgaXMgYWxyZWFkeSBvcGVuIGFuZCBjb25uZWN0ZWQsIDxDT0RFPm9wZW5sb2c8L0NPREU+CiAgICAgICAgIGp1c3QgbGVhdmVzIGl0IHRoYXQgd2F5LgogICAgICAgICA8YnI+PGJyPiA8YnI+PGJyPgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAhzeXNsb2cuaHhxAH4VRHQAK2NvbnN0IGNoYXIgKmlkZW50LCBpbnQgb3B0aW9uLCBpbnQgZmFjaWxpdHl0AAR2b2lkdAAHb3BlbnB0eXNxAH4ACnQF9QogICAgICAgIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGFuZCBvcGVucyBhIHBzZXVkby10ZXJtaW5hbCBwYWlyLCByZXR1cm5pbmcgdGhlCiAgICAgICAgIGZpbGUgZGVzY3JpcHRvciBmb3IgdGhlIG1hc3RlciBpbiA8VkFSPiphbWFzdGVyPC9WQVI+LCBhbmQgdGhlIGZpbGUKICAgICAgICAgZGVzY3JpcHRvciBmb3IgdGhlIHNsYXZlIGluIDxWQVI+KmFzbGF2ZTwvVkFSPi4gIElmIHRoZSBhcmd1bWVudCA8VkFSPm5hbWU8L1ZBUj4KICAgICAgICAgaXMgbm90IGEgbnVsbCBwb2ludGVyLCB0aGUgZmlsZSBuYW1lIG9mIHRoZSBzbGF2ZSBwc2V1ZG8tdGVybWluYWwKICAgICAgICAgZGV2aWNlIGlzIHN0b3JlZCBpbiA8Q09ERT4qbmFtZTwvQ09ERT4uICBJZiA8VkFSPnRlcm1wPC9WQVI+IGlzIG5vdCBhIG51bGwgcG9pbnRlciwKICAgICAgICAgdGhlIHRlcm1pbmFsIGF0dHJpYnV0ZXMgb2YgdGhlIHNsYXZlIGFyZSBzZXQgdG8gdGhlIG9uZXMgc3BlY2lmaWVkIGluCiAgICAgICAgIHRoZSBzdHJ1Y3R1cmUgdGhhdCA8VkFSPnRlcm1wPC9WQVI+IHBvaW50cyB0byAuCiAgICAgICAgIExpa2V3aXNlLCBpZiB0aGUgPFZBUj53aW5wPC9WQVI+IGlzIG5vdCBhIG51bGwgcG9pbnRlciwgdGhlIHNjcmVlbiBzaXplIG9mCiAgICAgICAgIHRoZSBzbGF2ZSBpcyBzZXQgdG8gdGhlIHZhbHVlcyBzcGVjaWZpZWQgaW4gdGhlIHN0cnVjdHVyZSB0aGF0CiAgICAgICAgIDxWQVI+d2lucDwvVkFSPiBwb2ludHMgdG8uCiAgICAgICAgIDxicj48YnI+IFRoZSBub3JtYWwgcmV0dXJuIHZhbHVlIGZyb20gPENPREU+b3BlbnB0eTwvQ09ERT4gaXMgMDsgYSB2YWx1ZSBvZgogICAgICAgICAtMSBpcyByZXR1cm5lZCBpbiBjYXNlIG9mIGZhaWx1cmUuICBUaGUgZm9sbG93aW5nIDxDT0RFPmVycm5vPC9DT0RFPgogICAgICAgICBjb25kaXRpb25zIGFyZSBkZWZpbmVkIGZvciB0aGlzIGZ1bmN0aW9uOgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8RFQ+PENPREU+RU5PRU5UPC9DT0RFPgo8REQ+CiAgICAgICAgIFRoZXJlIGFyZSBubyBmcmVlIHBzZXVkby10ZXJtaW5hbCBwYWlycyBhdmFpbGFibGUuCgogICAgICAgICA8YnI+PGJyPiBXYXJuaW5nOiBVc2luZyB0aGUgPENPREU+b3BlbnB0eTwvQ09ERT4gZnVuY3Rpb24gd2l0aCA8VkFSPm5hbWU8L1ZBUj4gbm90CiAgICAgICAgIHNldCB0byA8Q09ERT5OVUxMPC9DT0RFPiBpcyB2ZXJ5IGRhbmdlcm91cyBiZWNhdXNlIGl0IHByb3ZpZGVzIG5vCiAgICAgICAgIHByb3RlY3Rpb24gYWdhaW5zdCBvdmVyZmxvd2luZyB0aGUgc3RyaW5nIDxWQVI+bmFtZTwvVkFSPi4gIFlvdSBzaG91bGQgdXNlCiAgICAgICAgIHRoZSA8Q09ERT50dHluYW1lPC9DT0RFPiBmdW5jdGlvbiBvbiB0aGUgZmlsZSBkZXNjcmlwdG9yIHJldHVybmVkIGluCiAgICAgICAgIDxWQVI+KnNsYXZlPC9WQVI+IHRvIGZpbmQgb3V0IHRoZSBmaWxlIG5hbWUgb2YgdGhlIHNsYXZlIHBzZXVkby10ZXJtaW5hbAogICAgICAgICBkZXZpY2UgaW5zdGVhZC4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAFcHR5Lmh4cQB+FUt0AF5pbnQgKmFtYXN0ZXIsIGludCAqYXNsYXZlLCBjaGFyICpuYW1lLCBjb25zdCBzdHJ1Y3QgdGVybWlvcyAqdGVybXAsIGNvbnN0IHN0cnVjdCB3aW5zaXplICp3aW5wdAADaW50dAATcGFyc2VfcHJpbnRmX2Zvcm1hdHNxAH4ACnQECAogICAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbnVtYmVyIGFuZCB0eXBlcyBvZgogICAgICAgICBhcmd1bWVudHMgZXhwZWN0ZWQgYnkgdGhlIDxDT0RFPnByaW50ZjwvQ09ERT4gdGVtcGxhdGUgc3RyaW5nIDxWQVI+dGVtcGxhdGU8L1ZBUj4uCiAgICAgICAgIFRoZSBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4gdGhlIGFycmF5IDxWQVI+YXJndHlwZXM8L1ZBUj47IGVhY2ggZWxlbWVudCBvZgogICAgICAgICB0aGlzIGFycmF5IGRlc2NyaWJlcyBvbmUgYXJndW1lbnQuICBUaGlzIGluZm9ybWF0aW9uIGlzIGVuY29kZWQgdXNpbmcKICAgICAgICAgdGhlIHZhcmlvdXMgPHNhbXA+UEFfPC9zYW1wPiBtYWNyb3MsIGxpc3RlZCBiZWxvdy4KICAgICAgICAgPGJyPjxicj4gVGhlIGFyZ3VtZW50IDxWQVI+bjwvVkFSPiBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgYXJyYXkKICAgICAgICAgPFZBUj5hcmd0eXBlczwvVkFSPi4gIFRoaXMgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIHRoYXQKICAgICAgICAgPENPREU+cGFyc2VfcHJpbnRmX2Zvcm1hdDwvQ09ERT4gd2lsbCB0cnkgdG8gd3JpdGUuCiAgICAgICAgIDxicj48YnI+IDxDT0RFPnBhcnNlX3ByaW50Zl9mb3JtYXQ8L0NPREU+IHJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBhcmd1bWVudHMgcmVxdWlyZWQKICAgICAgICAgYnkgPFZBUj50ZW1wbGF0ZTwvVkFSPi4gIElmIHRoaXMgbnVtYmVyIGlzIGdyZWF0ZXIgdGhhbiA8VkFSPm48L1ZBUj4sIHRoZW4gdGhlCiAgICAgICAgIGluZm9ybWF0aW9uIHJldHVybmVkIGRlc2NyaWJlcyBvbmx5IHRoZSBmaXJzdCA8VkFSPm48L1ZBUj4gYXJndW1lbnRzLiAgSWYgeW91CiAgICAgICAgIHdhbnQgaW5mb3JtYXRpb24gYWJvdXQgYWRkaXRpb25hbCBhcmd1bWVudHMsIGFsbG9jYXRlIGEgYmlnZ2VyCiAgICAgICAgIGFycmF5IGFuZCBjYWxsIDxDT0RFPnBhcnNlX3ByaW50Zl9mb3JtYXQ8L0NPREU+IGFnYWluLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAhwcmludGYuaHhxAH4VUnQALWNvbnN0IGNoYXIgKnRlbXBsYXRlLCBzaXplX3QgbiwgaW50ICphcmd0eXBlc3QABnNpemVfdHQACHBhdGhjb25mc3EAfgAKdAReCiAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGlucXVpcmUgYWJvdXQgdGhlIGxpbWl0cyB0aGF0IGFwcGx5IHRvCiAgICAgICAgIHRoZSBmaWxlIG5hbWVkIDxWQVI+ZmlsZW5hbWU8L1ZBUj4uCiAgICAgICAgIDxicj48YnI+IFRoZSA8VkFSPnBhcmFtZXRlcjwvVkFSPiBhcmd1bWVudCBzaG91bGQgYmUgb25lIG9mIHRoZSA8c2FtcD5fUENfPC9zYW1wPiBjb25zdGFudHMKICAgICAgICAgbGlzdGVkIGJlbG93LgogICAgICAgICA8YnI+PGJyPiBUaGUgbm9ybWFsIHJldHVybiB2YWx1ZSBmcm9tIDxDT0RFPnBhdGhjb25mPC9DT0RFPiBpcyB0aGUgdmFsdWUgeW91IHJlcXVlc3RlZC4KICAgICAgICAgQSB2YWx1ZSBvZiA8Q09ERT4tMTwvQ09ERT4gaXMgcmV0dXJuZWQgYm90aCBpZiB0aGUgaW1wbGVtZW50YXRpb24gZG9lcyBub3QKICAgICAgICAgaW1wb3NlIGEgbGltaXQsIGFuZCBpbiBjYXNlIG9mIGFuIGVycm9yLiAgSW4gdGhlIGZvcm1lciBjYXNlLAogICAgICAgICA8Q09ERT5lcnJubzwvQ09ERT4gaXMgbm90IHNldCwgd2hpbGUgaW4gdGhlIGxhdHRlciBjYXNlLCA8Q09ERT5lcnJubzwvQ09ERT4gaXMgc2V0CiAgICAgICAgIHRvIGluZGljYXRlIHRoZSBjYXVzZSBvZiB0aGUgcHJvYmxlbS4gIFNvIHRoZSBvbmx5IHdheSB0byB1c2UgdGhpcwogICAgICAgICBmdW5jdGlvbiByb2J1c3RseSBpcyB0byBzdG9yZSA8Q09ERT4wPC9DT0RFPiBpbnRvIDxDT0RFPmVycm5vPC9DT0RFPiBqdXN0IGJlZm9yZQogICAgICAgICBjYWxsaW5nIGl0LgogICAgICAgICA8YnI+PGJyPiBCZXNpZGVzIHRoZSB1c3VhbCBmaWxlIG5hbWUgZXJyb3JzICwKICAgICAgICAgdGhlIGZvbGxvd2luZyBlcnJvciBjb25kaXRpb24gaXMgZGVmaW5lZCBmb3IgdGhpcyBmdW5jdGlvbjoKICAgICAgICAgPGJyPjxicj4gPERMPgoKICAgICAgICAgPERUPjxDT0RFPkVJTlZBTDwvQ09ERT4KPEREPgogICAgICAgICBUaGUgdmFsdWUgb2YgPFZBUj5wYXJhbWV0ZXI8L1ZBUj4gaXMgaW52YWxpZCwgb3IgdGhlIGltcGxlbWVudGF0aW9uIGRvZXNuJ3QKICAgICAgICAgc3VwcG9ydCB0aGUgPFZBUj5wYXJhbWV0ZXI8L1ZBUj4gZm9yIHRoZSBzcGVjaWZpYyBmaWxlLgoKICAgICAgICBzcQB+AA8AAAAFdwQAAAAFdAAIdW5pc3RkLmh0AAl1bmlzdGRoLmh0AAhsaW1pdHMuaHQACGRpcmVudC5odAAHc3RkaW8uaHhxAH4VWXQAI2NvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgcGFyYW1ldGVydAAIbG9uZyBpbnR0AAVwYXVzZXNxAH4ACnQGHwogICAgICAgIFRoZSA8Q09ERT5wYXVzZTwvQ09ERT4gZnVuY3Rpb24gc3VzcGVuZHMgcHJvZ3JhbSBleGVjdXRpb24gdW50aWwgYSBzaWduYWwKICAgICAgICAgYXJyaXZlcyB3aG9zZSBhY3Rpb24gaXMgZWl0aGVyIHRvIGV4ZWN1dGUgYSBoYW5kbGVyIGZ1bmN0aW9uLCBvciB0bwogICAgICAgICB0ZXJtaW5hdGUgdGhlIHByb2Nlc3MuCiAgICAgICAgIDxicj48YnI+IElmIHRoZSBzaWduYWwgY2F1c2VzIGEgaGFuZGxlciBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCwgdGhlbgogICAgICAgICA8Q09ERT5wYXVzZTwvQ09ERT4gcmV0dXJucy4gIFRoaXMgaXMgY29uc2lkZXJlZCBhbiB1bnN1Y2Nlc3NmdWwgcmV0dXJuIChzaW5jZQogICAgICAgICBgYHN1Y2Nlc3NmdWwnJyBiZWhhdmlvciB3b3VsZCBiZSB0byBzdXNwZW5kIHRoZSBwcm9ncmFtIGZvcmV2ZXIpLCBzbyB0aGUKICAgICAgICAgcmV0dXJuIHZhbHVlIGlzIDxDT0RFPi0xPC9DT0RFPi4gIEV2ZW4gaWYgeW91IHNwZWNpZnkgdGhhdCBvdGhlciBwcmltaXRpdmVzCiAgICAgICAgIHNob3VsZCByZXN1bWUgd2hlbiBhIHN5c3RlbSBoYW5kbGVyIHJldHVybnMgLCB0aGlzIGhhcyBubyBlZmZlY3Qgb24gPENPREU+cGF1c2U8L0NPREU+OyBpdCBhbHdheXMgZmFpbHMgd2hlbiBhCiAgICAgICAgIHNpZ25hbCBpcyBoYW5kbGVkLgogICAgICAgICA8YnI+PGJyPiBUaGUgZm9sbG93aW5nIDxDT0RFPmVycm5vPC9DT0RFPiBlcnJvciBjb25kaXRpb25zIGFyZSBkZWZpbmVkIGZvciB0aGlzIGZ1bmN0aW9uOgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8RFQ+PENPREU+RUlOVFI8L0NPREU+CjxERD4KICAgICAgICAgVGhlIGZ1bmN0aW9uIHdhcyBpbnRlcnJ1cHRlZCBieSBkZWxpdmVyeSBvZiBhIHNpZ25hbC4KCiAgICAgICAgIDxicj48YnI+IElmIHRoZSBzaWduYWwgY2F1c2VzIHByb2dyYW0gdGVybWluYXRpb24sIDxDT0RFPnBhdXNlPC9DT0RFPiBkb2Vzbid0IHJldHVybgogICAgICAgICAob2J2aW91c2x5KS4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBpbiBtdWx0aXRocmVhZGVkIHByb2dyYW1zLiAgVGhpcwogICAgICAgICBpcyBhIHByb2JsZW0gaWYgdGhlIHRocmVhZCBhbGxvY2F0ZXMgc29tZSByZXNvdXJjZXMgKGxpa2UgbWVtb3J5LCBmaWxlCiAgICAgICAgIGRlc2NyaXB0b3JzLCBzZW1hcGhvcmVzIG9yIHdoYXRldmVyKSBhdCB0aGUgdGltZSA8Q09ERT5wYXVzZTwvQ09ERT4gaXMKICAgICAgICAgY2FsbGVkLiAgSWYgdGhlIHRocmVhZCBnZXRzIGNhbmNlbGxlZCB0aGVzZSByZXNvdXJjZXMgc3RheSBhbGxvY2F0ZWQKICAgICAgICAgdW50aWwgdGhlIHByb2dyYW0gZW5kcy4gIFRvIGF2b2lkIHRoaXMgY2FsbHMgdG8gPENPREU+cGF1c2U8L0NPREU+IHNob3VsZCBiZQogICAgICAgICBwcm90ZWN0ZWQgdXNpbmcgY2FuY2VsbGF0aW9uIGhhbmRsZXJzLgogICAgICAgICA8YnI+PGJyPiBUaGUgPENPREU+cGF1c2U8L0NPREU+IGZ1bmN0aW9uIGlzIGRlY2xhcmVkIGluICA8VFQ+dW5pc3RkLmg8L1RUPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIdW5pc3RkLmh4cQB+FWR0AAB0AANpbnR0AAZwY2xvc2VzcQB+AAp0APAKICAgICAgICBUaGUgPENPREU+cGNsb3NlPC9DT0RFPiBmdW5jdGlvbiBpcyB1c2VkIHRvIGNsb3NlIGEgc3RyZWFtIGNyZWF0ZWQgYnkgPENPREU+cG9wZW48L0NPREU+LgogICAgICAgICBJdCB3YWl0cyBmb3IgdGhlIGNoaWxkIHByb2Nlc3MgdG8gdGVybWluYXRlIGFuZCByZXR1cm5zIGl0cyBzdGF0dXMgdmFsdWUsCiAgICAgICAgIGFzIGZvciB0aGUgPENPREU+c3lzdGVtPC9DT0RFPiBmdW5jdGlvbi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHc3RkaW8uaHhxAH4Va3QADEZJTEUgKnN0cmVhbXQAA2ludHQABnBlcnJvcnNxAH4ACnQDNwogICAgICAgIFRoaXMgZnVuY3Rpb24gcHJpbnRzIGFuIGVycm9yIG1lc3NhZ2UgdG8gdGhlIHN0cmVhbSA8Q09ERT5zdGRlcnI8L0NPREU+OwogICAgICAgICBzZWUgU3RhbmRhcmQgU3RyZWFtcy4gIFRoZSBvcmllbnRhdGlvbiBvZiA8Q09ERT5zdGRlcnI8L0NPREU+IGlzIG5vdAogICAgICAgICBjaGFuZ2VkLgogICAgICAgICA8YnI+PGJyPiBJZiB5b3UgY2FsbCA8Q09ERT5wZXJyb3I8L0NPREU+IHdpdGggYSA8VkFSPm1lc3NhZ2U8L1ZBUj4gdGhhdCBpcyBlaXRoZXIgYSBudWxsCiAgICAgICAgIHBvaW50ZXIgb3IgYW4gZW1wdHkgc3RyaW5nLCA8Q09ERT5wZXJyb3I8L0NPREU+IGp1c3QgcHJpbnRzIHRoZSBlcnJvciBtZXNzYWdlCiAgICAgICAgIGNvcnJlc3BvbmRpbmcgdG8gPENPREU+ZXJybm88L0NPREU+LCBhZGRpbmcgYSB0cmFpbGluZyBuZXdsaW5lLgogICAgICAgICA8YnI+PGJyPiBJZiB5b3Ugc3VwcGx5IGEgbm9uLW51bGwgPFZBUj5tZXNzYWdlPC9WQVI+IGFyZ3VtZW50LCB0aGVuIDxDT0RFPnBlcnJvcjwvQ09ERT4KICAgICAgICAgcHJlZml4ZXMgaXRzIG91dHB1dCB3aXRoIHRoaXMgc3RyaW5nLiAgSXQgYWRkcyBhIGNvbG9uIGFuZCBhIHNwYWNlCiAgICAgICAgIGNoYXJhY3RlciB0byBzZXBhcmF0ZSB0aGUgPFZBUj5tZXNzYWdlPC9WQVI+IGZyb20gdGhlIGVycm9yIHN0cmluZyBjb3JyZXNwb25kaW5nCiAgICAgICAgIHRvIDxDT0RFPmVycm5vPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gVGhlIGZ1bmN0aW9uIDxDT0RFPnBlcnJvcjwvQ09ERT4gaXMgZGVjbGFyZWQgaW4gPFRUPnN0ZGlvLmg8L1RUPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHc3RkaW8uaHhxAH4VcnQAE2NvbnN0IGNoYXIgKm1lc3NhZ2V0AAR2b2lkdAAEcGlwZXNxAH4ACnQD5AogICAgICAgIFRoZSA8Q09ERT5waXBlPC9DT0RFPiBmdW5jdGlvbiBjcmVhdGVzIGEgcGlwZSBhbmQgcHV0cyB0aGUgZmlsZSBkZXNjcmlwdG9ycwogICAgICAgICBmb3IgdGhlIHJlYWRpbmcgYW5kIHdyaXRpbmcgZW5kcyBvZiB0aGUgcGlwZSAocmVzcGVjdGl2ZWx5KSBpbnRvCiAgICAgICAgIDxDT0RFPjxWQVI+ZmlsZWRlczwvVkFSPlswXTwvQ09ERT4gYW5kIDxDT0RFPjxWQVI+ZmlsZWRlczwvVkFSPlsxXTwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IEFuIGVhc3kgd2F5IHRvIHJlbWVtYmVyIHRoYXQgdGhlIGlucHV0IGVuZCBjb21lcyBmaXJzdCBpcyB0aGF0IGZpbGUKICAgICAgICAgZGVzY3JpcHRvciA8Q09ERT4wPC9DT0RFPiBpcyBzdGFuZGFyZCBpbnB1dCwgYW5kIGZpbGUgZGVzY3JpcHRvciA8Q09ERT4xPC9DT0RFPiBpcwogICAgICAgICBzdGFuZGFyZCBvdXRwdXQuCiAgICAgICAgIDxicj48YnI+IElmIHN1Y2Nlc3NmdWwsIDxDT0RFPnBpcGU8L0NPREU+IHJldHVybnMgYSB2YWx1ZSBvZiA8Q09ERT4wPC9DT0RFPi4gIE9uIGZhaWx1cmUsCiAgICAgICAgIDxDT0RFPi0xPC9DT0RFPiBpcyByZXR1cm5lZC4gIFRoZSBmb2xsb3dpbmcgPENPREU+ZXJybm88L0NPREU+IGVycm9yIGNvbmRpdGlvbnMgYXJlCiAgICAgICAgIGRlZmluZWQgZm9yIHRoaXMgZnVuY3Rpb246CiAgICAgICAgIDxicj48YnI+IDxETD4KCiAgICAgICAgIDxEVD48Q09ERT5FTUZJTEU8L0NPREU+CjxERD4KICAgICAgICAgVGhlIHByb2Nlc3MgaGFzIHRvbyBtYW55IGZpbGVzIG9wZW4uCiAgICAgICAgIDxicj48YnI+IDxMST4gRU5GSUxFCiAgICAgICAgIFRoZXJlIGFyZSB0b28gbWFueSBvcGVuIGZpbGVzIGluIHRoZSBlbnRpcmUgc3lzdGVtLiAgLAogICAgICAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCA8Q09ERT5FTkZJTEU8L0NPREU+LiAgVGhpcyBlcnJvciBuZXZlciBvY2N1cnMgaW4KICAgICAgICAgdGhlIEdOVSBzeXN0ZW0uCgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAh1bmlzdGQuaHhxAH4VeXQADmludCBmaWxlZGVzWzJddAADaW50dAAFcG9wZW5zcQB+AAp0BJcKICAgICAgICBUaGUgPENPREU+cG9wZW48L0NPREU+IGZ1bmN0aW9uIGlzIGNsb3NlbHkgcmVsYXRlZCB0byB0aGUgPENPREU+c3lzdGVtPC9DT0RFPgogICAgICAgICBmdW5jdGlvbjsgc2VlIFJ1bm5pbmcgYSBDb21tYW5kLiAgSXQgZXhlY3V0ZXMgdGhlIHNoZWxsIGNvbW1hbmQKICAgICAgICAgPFZBUj5jb21tYW5kPC9WQVI+IGFzIGEgc3VicHJvY2Vzcy4gIEhvd2V2ZXIsIGluc3RlYWQgb2Ygd2FpdGluZyBmb3IgdGhlCiAgICAgICAgIGNvbW1hbmQgdG8gY29tcGxldGUsIGl0IGNyZWF0ZXMgYSBwaXBlIHRvIHRoZSBzdWJwcm9jZXNzIGFuZCByZXR1cm5zIGEKICAgICAgICAgc3RyZWFtIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhhdCBwaXBlLgogICAgICAgICA8YnI+PGJyPiBJZiB5b3Ugc3BlY2lmeSBhIDxWQVI+bW9kZTwvVkFSPiBhcmd1bWVudCBvZiA8Q09ERT4iciI8L0NPREU+LCB5b3UgY2FuIHJlYWQgZnJvbSB0aGUKICAgICAgICAgc3RyZWFtIHRvIHJldHJpZXZlIGRhdGEgZnJvbSB0aGUgc3RhbmRhcmQgb3V0cHV0IGNoYW5uZWwgb2YgdGhlIHN1YnByb2Nlc3MuCiAgICAgICAgIFRoZSBzdWJwcm9jZXNzIGluaGVyaXRzIGl0cyBzdGFuZGFyZCBpbnB1dCBjaGFubmVsIGZyb20gdGhlIHBhcmVudCBwcm9jZXNzLgogICAgICAgICA8YnI+PGJyPiBTaW1pbGFybHksIGlmIHlvdSBzcGVjaWZ5IGEgPFZBUj5tb2RlPC9WQVI+IGFyZ3VtZW50IG9mIDxDT0RFPiJ3IjwvQ09ERT4sIHlvdSBjYW4KICAgICAgICAgd3JpdGUgdG8gdGhlIHN0cmVhbSB0byBzZW5kIGRhdGEgdG8gdGhlIHN0YW5kYXJkIGlucHV0IGNoYW5uZWwgb2YgdGhlCiAgICAgICAgIHN1YnByb2Nlc3MuICBUaGUgc3VicHJvY2VzcyBpbmhlcml0cyBpdHMgc3RhbmRhcmQgb3V0cHV0IGNoYW5uZWwgZnJvbQogICAgICAgICB0aGUgcGFyZW50IHByb2Nlc3MuCiAgICAgICAgIDxicj48YnI+IEluIHRoZSBldmVudCBvZiBhbiBlcnJvciA8Q09ERT5wb3BlbjwvQ09ERT4gcmV0dXJucyBhIG51bGwgcG9pbnRlci4gIFRoaXMKICAgICAgICAgbWlnaHQgaGFwcGVuIGlmIHRoZSBwaXBlIG9yIHN0cmVhbSBjYW5ub3QgYmUgY3JlYXRlZCwgaWYgdGhlIHN1YnByb2Nlc3MKICAgICAgICAgY2Fubm90IGJlIGZvcmtlZCwgb3IgaWYgdGhlIHByb2dyYW0gY2Fubm90IGJlIGV4ZWN1dGVkLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAdzdGRpby5oeHEAfhWAdAAlY29uc3QgY2hhciAqY29tbWFuZCwgY29uc3QgY2hhciAqbW9kZXQABkZJTEUgKnQADnBvc2l4X21lbWFsaWduc3EAfgAKdALKCiAgICAgICAgVGhlIDxDT0RFPnBvc2l4X21lbWFsaWduPC9DT0RFPiBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIHRoZSA8Q09ERT5tZW1hbGlnbjwvQ09ERT4KICAgICAgICAgZnVuY3Rpb24gaW4gdGhhdCBpdCByZXR1cm5zIGEgYnVmZmVyIG9mIDxWQVI+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RT5wcmVhZDwvQ09ERT4gZnVuY3Rpb24gaXMgc2ltaWxhciB0byB0aGUgPENPREU+cmVhZDwvQ09ERT4gZnVuY3Rpb24uICBUaGUKICAgICAgICAgZmlyc3QgdGhyZWUgYXJndW1lbnRzIGFyZSBpZGVudGljYWwsIGFuZCB0aGUgcmV0dXJuIHZhbHVlcyBhbmQgZXJyb3IKICAgICAgICAgY29kZXMgYWxzbyBjb3JyZXNwb25kLgogICAgICAgICA8YnI+PGJyPiBUaGUgZGlmZmVyZW5jZSBpcyB0aGUgZm91cnRoIGFyZ3VtZW50IGFuZCBpdHMgaGFuZGxpbmcuICBUaGUgZGF0YSBibG9jawogICAgICAgICBpcyBub3QgcmVhZCBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSBmaWxlIGRlc2NyaXB0b3IKICAgICAgICAgPENPREU+ZmlsZWRlczwvQ09ERT4uICBJbnN0ZWFkIHRoZSBkYXRhIGlzIHJlYWQgZnJvbSB0aGUgZmlsZSBzdGFydGluZyBhdAogICAgICAgICBwb3NpdGlvbiA8VkFSPm9mZnNldDwvVkFSPi4gIFRoZSBwb3NpdGlvbiBvZiB0aGUgZmlsZSBkZXNjcmlwdG9yIGl0c2VsZiBpcwogICAgICAgICBub3QgYWZmZWN0ZWQgYnkgdGhlIG9wZXJhdGlvbi4gIFRoZSB2YWx1ZSBpcyB0aGUgc2FtZSBhcyBiZWZvcmUgdGhlIGNhbGwuCiAgICAgICAgIDxicj48YnI+IFdoZW4gdGhlIHNvdXJjZSBmaWxlIGlzIGNvbXBpbGVkIHdpdGggPENPREU+X0ZJTEVfT0ZGU0VUX0JJVFMgPT0gNjQ8L0NPREU+IHRoZQogICAgICAgICA8Q09ERT5wcmVhZDwvQ09ERT4gZnVuY3Rpb24gaXMgaW4gZmFjdCA8Q09ERT5wcmVhZDY0PC9DT0RFPiBhbmQgdGhlIHR5cGUKICAgICAgICAgPENPREU+b2ZmX3Q8L0NPREU+IGhhcyA2NCBiaXRzLCB3aGljaCBtYWtlcyBpdCBwb3NzaWJsZSB0byBoYW5kbGUgZmlsZXMgdXAgdG8KICAgICAgICAgMl42MyBieXRlcyBpbiBsZW5ndGguCiAgICAgICAgIDxicj48YnI+IFRoZSByZXR1cm4gdmFsdWUgb2YgPENPREU+cHJlYWQ8L0NPREU+IGRlc2NyaWJlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuCiAgICAgICAgIEluIHRoZSBlcnJvciBjYXNlIGl0IHJldHVybnMgLTEgbGlrZSA8Q09ERT5yZWFkPC9DT0RFPiBkb2VzIGFuZCB0aGUKICAgICAgICAgZXJyb3IgY29kZXMgYXJlIGFsc28gdGhlIHNhbWUsIHdpdGggdGhlc2UgYWRkaXRpb25zOgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8RFQ+PENPREU+RUlOVkFMPC9DT0RFPgo8REQ+CiAgICAgICAgIFRoZSB2YWx1ZSBnaXZlbiBmb3IgPFZBUj5vZmZzZXQ8L1ZBUj4gaXMgbmVnYXRpdmUgYW5kIHRoZXJlZm9yZSBpbGxlZ2FsLgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVTUElQRQogICAgICAgICBUaGUgZmlsZSBkZXNjcmlwdG9yIDxWQVI+ZmlsZWRlczwvVkFSPiBpcyBhc3NvY2lhdGUgd2l0aCBhIHBpcGUgb3IgYSBGSUZPIGFuZAogICAgICAgICB0aGlzIGRldmljZSBkb2VzIG5vdCBhbGxvdyBwb3NpdGlvbmluZyBvZiB0aGUgZmlsZSBwb2ludGVyLgoKICAgICAgICAgPGJyPjxicj4gVGhlIGZ1bmN0aW9uIGlzIGFuIGV4dGVuc2lvbiBkZWZpbmVkIGluIHRoZSBVbml4IFNpbmdsZSBTcGVjaWZpY2F0aW9uCiAgICAgICAgIHZlcnNpb24gMi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIdW5pc3RkLmh4cQB+Fbh0ADRpbnQgZmlsZWRlcywgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSwgb2ZmX3Qgb2Zmc2V0dAAHc3NpemVfdHQAB3ByZWFkNjRzcQB+AAp0AzIKICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gdGhlIDxDT0RFPnByZWFkPC9DT0RFPiBmdW5jdGlvbi4gIFRoZSBkaWZmZXJlbmNlCiAgICAgICAgIGlzIHRoYXQgdGhlIDxWQVI+b2Zmc2V0PC9WQVI+IHBhcmFtZXRlciBpcyBvZiB0eXBlIDxDT0RFPm9mZjY0X3Q8L0NPREU+IGluc3RlYWQgb2YKICAgICAgICAgPENPREU+b2ZmX3Q8L0NPREU+IHdoaWNoIG1ha2VzIGl0IHBvc3NpYmxlIG9uIDMyIGJpdCBtYWNoaW5lcyB0byBhZGRyZXNzCiAgICAgICAgIGZpbGVzIGxhcmdlciB0aGFuIDJeMzEgYnl0ZXMgYW5kIHVwIHRvIDJeNjMgYnl0ZXMuICBUaGUKICAgICAgICAgZmlsZSBkZXNjcmlwdG9yIDxDT0RFPmZpbGVkZXM8L0NPREU+IG11c3QgYmUgb3BlbmVkIHVzaW5nIDxDT0RFPm9wZW42NDwvQ09ERT4gc2luY2UKICAgICAgICAgb3RoZXJ3aXNlIHRoZSBsYXJnZSBvZmZzZXRzIHBvc3NpYmxlIHdpdGggPENPREU+b2ZmNjRfdDwvQ09ERT4gd2lsbCBsZWFkIHRvCiAgICAgICAgIGVycm9ycyB3aXRoIGEgZGVzY3JpcHRvciBpbiBzbWFsbCBmaWxlIG1vZGUuCiAgICAgICAgIDxicj48YnI+IFdoZW4gdGhlIHNvdXJjZSBmaWxlIGlzIGNvbXBpbGVkIHdpdGggPENPREU+X0ZJTEVfT0ZGU0VUX0JJVFMgPT0gNjQ8L0NPREU+IG9uIGEKICAgICAgICAgMzIgYml0IG1hY2hpbmUgdGhpcyBmdW5jdGlvbiBpcyBhY3R1YWxseSBhdmFpbGFibGUgdW5kZXIgdGhlIG5hbWUKICAgICAgICAgPENPREU+cHJlYWQ8L0NPREU+IGFuZCBzbyB0cmFuc3BhcmVudGx5IHJlcGxhY2VzIHRoZSAzMiBiaXQgaW50ZXJmYWNlLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAh1bmlzdGQuaHhxAH4Vv3QANmludCBmaWxlZGVzLCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplLCBvZmY2NF90IG9mZnNldHQAB3NzaXplX3R0AAZwcmludGZzcQB+AAp0ASsKICAgICAgICBUaGUgPENPREU+cHJpbnRmPC9DT0RFPiBmdW5jdGlvbiBwcmludHMgdGhlIG9wdGlvbmFsIGFyZ3VtZW50cyB1bmRlciB0aGUKICAgICAgICAgY29udHJvbCBvZiB0aGUgdGVtcGxhdGUgc3RyaW5nIDxWQVI+dGVtcGxhdGU8L1ZBUj4gdG8gdGhlIHN0cmVhbQogICAgICAgICA8Q09ERT5zdGRvdXQ8L0NPREU+LiAgSXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZCwgb3IgYQogICAgICAgICBuZWdhdGl2ZSB2YWx1ZSBpZiB0aGVyZSB3YXMgYW4gb3V0cHV0IGVycm9yLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAdzdGRpby5oeHEAfhXGdAAZY29uc3QgY2hhciAqdGVtcGxhdGUsIC4uLnQAA2ludHQAC3ByaW50Zl9zaXplc3EAfgAKdAW+CiAgICAgICAgUHJpbnQgYSBnaXZlbiBmbG9hdGluZyBwb2ludCBudW1iZXIgYXMgZm9yIHRoZSBmb3JtYXQgPENPREU+JWY8L0NPREU+IGV4Y2VwdAogICAgICAgICB0aGF0IHRoZXJlIGlzIGEgcG9zdGZpeCBjaGFyYWN0ZXIgaW5kaWNhdGluZyB0aGUgZGl2aXNvciBmb3IgdGhlCiAgICAgICAgIG51bWJlciB0byBtYWtlIHRoaXMgbGVzcyB0aGFuIDEwMDAuICBUaGVyZSBhcmUgdHdvIHBvc3NpYmxlIGRpdmlzb3JzOgogICAgICAgICBwb3dlcnMgb2YgMTAyNCBvciBwb3dlcnMgb2YgMTAwMC4gIFdoaWNoIG9uZSBpcyB1c2VkIGRlcGVuZHMgb24gdGhlCiAgICAgICAgIGZvcm1hdCBjaGFyYWN0ZXIgc3BlY2lmaWVkIHdoaWxlIHJlZ2lzdGVyZWQgdGhpcyBoYW5kbGVyLiAgSWYgdGhlCiAgICAgICAgIGNoYXJhY3RlciBpcyBvZiBsb3dlciBjYXNlLCAxMDI0IGlzIHVzZWQuICBGb3IgdXBwZXIgY2FzZSBjaGFyYWN0ZXJzLAogICAgICAgICAxMDAwIGlzIHVzZWQuCiAgICAgICAgIDxicj48YnI+IFRoZSBwb3N0Zml4IHRhZyBjb3JyZXNwb25kcyB0byBieXRlcywga2lsb2J5dGVzLCBtZWdhYnl0ZXMsIGdpZ2FieXRlcywKICAgICAgICAgZXRjLiAgVGhlIGZ1bGwgdGFibGUgaXM6CiAgICAgICAgIDxicj48YnI+CiAgICAgICAgIDxETD4KPERUPjxwcmU+bG93ICBNdWx0aXBsaWVyICAgRnJvbSAgIFVwcGVyICBNdWx0aXBsaWVyPC9wcmU+CjxERD48YnI+IDxEVD48cHJlPicgJyAgMSAgICAgICAgICAgICAgICAgICAnICcgICAgMTwvcHJlPgo8REQ+PGJyPiA8RFQ+PHByZT5rICAgIDJeMTAgKDEwMjQpICBraWxvICAgSyAgICAgIDEwXjMgKDEwMDApPC9wcmU+CjxERD48YnI+IDxEVD48cHJlPm0gICAgMl4yMCAgICAgICAgIG1lZ2EgICBNICAgICAgMTBeNjwvcHJlPgo8REQ+PGJyPiA8RFQ+PHByZT5nICAgIDJeMzAgICAgICAgICBnaWdhICAgRyAgICAgIDEwXjk8L3ByZT4KPEREPjxicj4gPERUPjxwcmU+dCAgICAyXjQwICAgICAgICAgdGVyYSAgIFQgICAgICAxMF4xMjwvcHJlPgo8REQ+PGJyPiA8RFQ+PHByZT5wICAgIDJeNTAgICAgICAgICBwZXRhICAgUCAgICAgIDEwXjE1PC9wcmU+CjxERD48YnI+IDxEVD48cHJlPmUgICAgMl42MCAgICAgICAgIGV4YSAgICBFICAgICAgMTBeMTg8L3ByZT4KPEREPjxicj4gPERUPjxwcmU+eiAgICAyXjcwICAgICAgICAgemV0dGEgIFogICAgICAxMF4yMTwvcHJlPgo8REQ+PGJyPiA8RFQ+PHByZT55ICAgIDJeODAgICAgICAgICB5b3R0YSAgWSAgICAgIDEwXjI0PC9wcmU+CjxERD48YnI+IDwvREw+CgoKICAgICAgICAgPGJyPjxicj4gVGhlIGRlZmF1bHQgcHJlY2lzaW9uIGlzIDMsIGkuZS4sIDEwMjQgaXMgcHJpbnRlZCB3aXRoIGEgbG93ZXItY2FzZQogICAgICAgICBmb3JtYXQgY2hhcmFjdGVyIGFzIGlmIGl0IHdlcmUgPENPREU+JS4zZms8L0NPREU+IGFuZCB3aWxsIHlpZWxkIDxDT0RFPjEuMDAwazwvQ09ERT4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHByaW50Zi5oeHEAfhXNdABBRklMRSAqZnAsIGNvbnN0IHN0cnVjdCBwcmludGZfaW5mbyAqaW5mbywgY29uc3Qgdm9pZCAqY29uc3QgKmFyZ3N0AANpbnR0ABBwcmludGZfc2l6ZV9pbmZvc3EAfgAKdADlCiAgICAgICAgVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBpbiA8VkFSPmFyZ3R5cGVzPC9WQVI+IHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUKICAgICAgICAgdXNlZCBwYXJhbWV0ZXJzIGluIHRoZSB3YXkgdGhlIDxDT0RFPnZmcHJpbnRmPC9DT0RFPiBpbXBsZW1lbnRhdGlvbiBleHBlY3RzCiAgICAgICAgIGl0LiAgVGhlIGZvcm1hdCBhbHdheXMgdGFrZXMgb25lIGFyZ3VtZW50LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAhwcmludGYuaHhxAH4V1HQAN2NvbnN0IHN0cnVjdCBwcmludGZfaW5mbyAqaW5mbywgc2l6ZV90IG4sIGludCAqYXJndHlwZXN0AANpbnR0AAdwc2lnbmFsc3EAfgAKdAMvCiAgICAgICAgVGhpcyBmdW5jdGlvbiBwcmludHMgYSBtZXNzYWdlIGRlc2NyaWJpbmcgdGhlIHNpZ25hbCA8VkFSPnNpZ251bTwvVkFSPiB0byB0aGUKICAgICAgICAgc3RhbmRhcmQgZXJyb3Igb3V0cHV0IHN0cmVhbSA8Q09ERT5zdGRlcnI8L0NPREU+OyBzZWUgU3RhbmRhcmQgU3RyZWFtcy4KICAgICAgICAgPGJyPjxicj4gSWYgeW91IGNhbGwgPENPREU+cHNpZ25hbDwvQ09ERT4gd2l0aCBhIDxWQVI+bWVzc2FnZTwvVkFSPiB0aGF0IGlzIGVpdGhlciBhIG51bGwKICAgICAgICAgcG9pbnRlciBvciBhbiBlbXB0eSBzdHJpbmcsIDxDT0RFPnBzaWduYWw8L0NPREU+IGp1c3QgcHJpbnRzIHRoZSBtZXNzYWdlCiAgICAgICAgIGNvcnJlc3BvbmRpbmcgdG8gPFZBUj5zaWdudW08L1ZBUj4sIGFkZGluZyBhIHRyYWlsaW5nIG5ld2xpbmUuCiAgICAgICAgIDxicj48YnI+IElmIHlvdSBzdXBwbHkgYSBub24tbnVsbCA8VkFSPm1lc3NhZ2U8L1ZBUj4gYXJndW1lbnQsIHRoZW4gPENPREU+cHNpZ25hbDwvQ09ERT4KICAgICAgICAgcHJlZml4ZXMgaXRzIG91dHB1dCB3aXRoIHRoaXMgc3RyaW5nLiAgSXQgYWRkcyBhIGNvbG9uIGFuZCBhIHNwYWNlCiAgICAgICAgIGNoYXJhY3RlciB0byBzZXBhcmF0ZSB0aGUgPFZBUj5tZXNzYWdlPC9WQVI+IGZyb20gdGhlIHN0cmluZyBjb3JyZXNwb25kaW5nCiAgICAgICAgIHRvIDxWQVI+c2lnbnVtPC9WQVI+LgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIGlzIGEgQlNEIGZlYXR1cmUsIGRlY2xhcmVkIGluIHRoZSBoZWFkZXIgZmlsZSA8VFQ+c2lnbmFsLmg8L1RUPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc2lnbmFsLmh4cQB+Fdt0AB9pbnQgc2lnbnVtLCBjb25zdCBjaGFyICptZXNzYWdldAAEdm9pZHQAB3B0c25hbWVzcQB+AAp0AY8KICAgICAgICBJZiB0aGUgZmlsZSBkZXNjcmlwdG9yIDxWQVI+ZmlsZWRlczwvVkFSPiBpcyBhc3NvY2lhdGVkIHdpdGggYQogICAgICAgICBtYXN0ZXIgcHNldWRvLXRlcm1pbmFsIGRldmljZSwgdGhlIDxDT0RFPnB0c25hbWU8L0NPREU+IGZ1bmN0aW9uIHJldHVybnMgYQogICAgICAgICBwb2ludGVyIHRvIGEgc3RhdGljYWxseS1hbGxvY2F0ZWQsIG51bGwtdGVybWluYXRlZCBzdHJpbmcgY29udGFpbmluZyB0aGUKICAgICAgICAgZmlsZSBuYW1lIG9mIHRoZSBhc3NvY2lhdGVkIHNsYXZlIHBzZXVkby10ZXJtaW5hbCBmaWxlLiAgVGhpcyBzdHJpbmcKICAgICAgICAgbWlnaHQgYmUgb3ZlcndyaXR0ZW4gYnkgc3Vic2VxdWVudCBjYWxscyB0byA8Q09ERT5wdHNuYW1lPC9DT0RFPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc3RkbGliLmh4cQB+FeJ0AAtpbnQgZmlsZWRlc3QABmNoYXIgKnQACXB0c25hbWVfcnNxAH4ACnQBIgogICAgICAgIFRoZSA8Q09ERT5wdHNuYW1lX3I8L0NPREU+IGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gdGhlIDxDT0RFPnB0c25hbWU8L0NPREU+IGZ1bmN0aW9uCiAgICAgICAgIGV4Y2VwdCB0aGF0IGl0IHBsYWNlcyBpdHMgcmVzdWx0IGludG8gdGhlIHVzZXItc3BlY2lmaWVkIGJ1ZmZlciBzdGFydGluZwogICAgICAgICBhdCA8VkFSPmJ1ZjwvVkFSPiB3aXRoIGxlbmd0aCA8VkFSPmxlbjwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiBpcyBhIEdOVSBleHRlbnNpb24uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHN0ZGxpYi5oeHEAfhXpdAAiaW50IGZpbGVkZXMsIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbnQAA2ludHQABHB1dGNzcQB+AAp0AYQKICAgICAgICBUaGlzIGlzIGp1c3QgbGlrZSA8Q09ERT5mcHV0YzwvQ09ERT4sIGV4Y2VwdCB0aGF0IG1vc3Qgc3lzdGVtcyBpbXBsZW1lbnQgaXQgYXMKICAgICAgICAgYSBtYWNybywgbWFraW5nIGl0IGZhc3Rlci4gIE9uZSBjb25zZXF1ZW5jZSBpcyB0aGF0IGl0IG1heSBldmFsdWF0ZSB0aGUKICAgICAgICAgPFZBUj5zdHJlYW08L1ZBUj4gYXJndW1lbnQgbW9yZSB0aGFuIG9uY2UsIHdoaWNoIGlzIGFuIGV4Y2VwdGlvbiB0byB0aGUKICAgICAgICAgZ2VuZXJhbCBydWxlIGZvciBtYWNyb3MuICA8Q09ERT5wdXRjPC9DT0RFPiBpcyB1c3VhbGx5IHRoZSBiZXN0IGZ1bmN0aW9uIHRvCiAgICAgICAgIHVzZSBmb3Igd3JpdGluZyBhIHNpbmdsZSBjaGFyYWN0ZXIuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3N0ZGlvLmh4cQB+FfB0ABNpbnQgYywgRklMRSAqc3RyZWFtdAADaW50dAANcHV0Y191bmxvY2tlZHNxAH4ACnQApgogICAgICAgIFRoZSA8Q09ERT5wdXRjX3VubG9ja2VkPC9DT0RFPiBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIHRoZSA8Q09ERT5wdXRjPC9DT0RFPgogICAgICAgICBmdW5jdGlvbiBleGNlcHQgdGhhdCBpdCBkb2VzIG5vdCBpbXBsaWNpdGx5IGxvY2sgdGhlIHN0cmVhbS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHc3RkaW8uaHhxAH4V93QAE2ludCBjLCBGSUxFICpzdHJlYW10AANpbnR0AAdwdXRjaGFyc3EAfgAKdACoCiAgICAgICAgVGhlIDxDT0RFPnB1dGNoYXI8L0NPREU+IGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gPENPREU+cHV0YzwvQ09ERT4gd2l0aAogICAgICAgICA8Q09ERT5zdGRvdXQ8L0NPREU+IGFzIHRoZSB2YWx1ZSBvZiB0aGUgPFZBUj5zdHJlYW08L1ZBUj4gYXJndW1lbnQuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3N0ZGlvLmh4cQB+Ff50AAVpbnQgY3QAA2ludHQAEHB1dGNoYXJfdW5sb2NrZWRzcQB+AAp0AKwKICAgICAgICBUaGUgPENPREU+cHV0Y2hhcl91bmxvY2tlZDwvQ09ERT4gZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byB0aGUgPENPREU+cHV0Y2hhcjwvQ09ERT4KICAgICAgICAgZnVuY3Rpb24gZXhjZXB0IHRoYXQgaXQgZG9lcyBub3QgaW1wbGljaXRseSBsb2NrIHRoZSBzdHJlYW0uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3N0ZGlvLmh4cQB+FgV0AAVpbnQgY3QAA2ludHQABnB1dGVudnNxAH4ACnQE3AogICAgICAgIFRoZSA8Q09ERT5wdXRlbnY8L0NPREU+IGZ1bmN0aW9uIGFkZHMgb3IgcmVtb3ZlcyBkZWZpbml0aW9ucyBmcm9tIHRoZSBlbnZpcm9ubWVudC4KICAgICAgICAgSWYgdGhlIDxWQVI+c3RyaW5nPC9WQVI+IGlzIG9mIHRoZSBmb3JtIDxzYW1wPjxWQVI+bmFtZTwvVkFSPj08VkFSPnZhbHVlPC9WQVI+PC9zYW1wPiwgdGhlCiAgICAgICAgIGRlZmluaXRpb24gaXMgYWRkZWQgdG8gdGhlIGVudmlyb25tZW50LiAgT3RoZXJ3aXNlLCB0aGUgPFZBUj5zdHJpbmc8L1ZBUj4gaXMKICAgICAgICAgaW50ZXJwcmV0ZWQgYXMgdGhlIG5hbWUgb2YgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUsIGFuZCBhbnkgZGVmaW5pdGlvbgogICAgICAgICBmb3IgdGhpcyB2YXJpYWJsZSBpbiB0aGUgZW52aXJvbm1lbnQgaXMgcmVtb3ZlZC4KICAgICAgICAgPGJyPjxicj4gVGhlIGRpZmZlcmVuY2UgdG8gdGhlIDxDT0RFPnNldGVudjwvQ09ERT4gZnVuY3Rpb24gaXMgdGhhdCB0aGUgZXhhY3Qgc3RyaW5nCiAgICAgICAgIGdpdmVuIGFzIHRoZSBwYXJhbWV0ZXIgPFZBUj5zdHJpbmc8L1ZBUj4gaXMgcHV0IGludG8gdGhlIGVudmlyb25tZW50LiAgSWYgdGhlCiAgICAgICAgIHVzZXIgc2hvdWxkIGNoYW5nZSB0aGUgc3RyaW5nIGFmdGVyIHRoZSA8Q09ERT5wdXRlbnY8L0NPREU+IGNhbGwgdGhpcyB3aWxsCiAgICAgICAgIHJlZmxlY3QgaW4gYXV0b21hdGljYWxseSBpbiB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGFsc28gcmVxdWlyZXMgdGhhdAogICAgICAgICA8VkFSPnN0cmluZzwvVkFSPiBpcyBubyBhdXRvbWF0aWMgdmFyaWFibGUgd2hpY2ggc2NvcGUgaXMgbGVmdCBiZWZvcmUgdGhlCiAgICAgICAgIHZhcmlhYmxlIGlzIHJlbW92ZWQgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGUgc2FtZSBhcHBsaWVzIG9mIGNvdXJzZSB0bwogICAgICAgICBkeW5hbWljYWxseSBhbGxvY2F0ZWQgdmFyaWFibGVzIHdoaWNoIGFyZSBmcmVlZCBsYXRlci4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiBpcyBwYXJ0IG9mIHRoZSBleHRlbmRlZCBVbml4IGludGVyZmFjZS4gIFNpbmNlIGl0IHdhcyBhbHNvCiAgICAgICAgIGF2YWlsYWJsZSBpbiBvbGQgU1ZJRCBsaWJyYXJpZXMgeW91IHNob3VsZCBkZWZpbmUgZWl0aGVyCiAgICAgICAgIDxWQVI+X1hPUEVOX1NPVVJDRTwvVkFSPiBvciA8VkFSPl9TVklEX1NPVVJDRTwvVkFSPiBiZWZvcmUgaW5jbHVkaW5nIGFueSBoZWFkZXIuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHN0ZGxpYi5oeHEAfhYMdAAMY2hhciAqc3RyaW5ndAADaW50dAAIcHV0cHdlbnRzcQB+AAp0A6cKICAgICAgICBUaGlzIGZ1bmN0aW9uIHdyaXRlcyB0aGUgdXNlciBlbnRyeSA8Q09ERT4qPFZBUj5wPC9WQVI+PC9DT0RFPiB0byB0aGUgc3RyZWFtCiAgICAgICAgIDxWQVI+c3RyZWFtPC9WQVI+LCBpbiB0aGUgZm9ybWF0IHVzZWQgZm9yIHRoZSBzdGFuZGFyZCB1c2VyIGRhdGFiYXNlCiAgICAgICAgIGZpbGUuICBUaGUgcmV0dXJuIHZhbHVlIGlzIHplcm8gb24gc3VjY2VzcyBhbmQgbm9uemVybyBvbiBmYWlsdXJlLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIGV4aXN0cyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIFNWSUQuICBXZSByZWNvbW1lbmQgdGhhdCB5b3UKICAgICAgICAgYXZvaWQgdXNpbmcgaXQsIGJlY2F1c2UgaXQgbWFrZXMgc2Vuc2Ugb25seSBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZQogICAgICAgICA8Q09ERT5zdHJ1Y3QgcGFzc3dkPC9DT0RFPiBzdHJ1Y3R1cmUgaGFzIG5vIG1lbWJlcnMgZXhjZXB0IHRoZSBzdGFuZGFyZCBvbmVzOwogICAgICAgICBvbiBhIHN5c3RlbSB3aGljaCBtZXJnZXMgdGhlIHRyYWRpdGlvbmFsIFVuaXggZGF0YSBiYXNlIHdpdGggb3RoZXIKICAgICAgICAgZXh0ZW5kZWQgaW5mb3JtYXRpb24gYWJvdXQgdXNlcnMsIGFkZGluZyBhbiBlbnRyeSB1c2luZyB0aGlzIGZ1bmN0aW9uCiAgICAgICAgIHdvdWxkIGluZXZpdGFibHkgbGVhdmUgb3V0IG11Y2ggb2YgdGhlIGltcG9ydGFudCBpbmZvcm1hdGlvbi4KICAgICAgICAgPGJyPjxicj4gVGhlIGdyb3VwIGFuZCB1c2VyIElEIGZpZWxkcyBhcmUgbGVmdCBlbXB0eSBpZiB0aGUgZ3JvdXAgb3IgdXNlciBuYW1lCiAgICAgICAgIHN0YXJ0cyB3aXRoIGEgLSBvciArLgogICAgICAgICA8YnI+PGJyPiBUaGUgZnVuY3Rpb24gPENPREU+cHV0cHdlbnQ8L0NPREU+IGlzIGRlY2xhcmVkIGluIDxUVD5wd2QuaDwvVFQ+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAVwd2QuaHhxAH4WE3QAJGNvbnN0IHN0cnVjdCBwYXNzd2QgKnAsIEZJTEUgKnN0cmVhbXQAA2ludHQABHB1dHNzcQB+AAp0AmwKICAgICAgICBUaGUgPENPREU+cHV0czwvQ09ERT4gZnVuY3Rpb24gd3JpdGVzIHRoZSBzdHJpbmcgPFZBUj5zPC9WQVI+IHRvIHRoZSBzdHJlYW0KICAgICAgICAgPENPREU+c3Rkb3V0PC9DT0RFPiBmb2xsb3dlZCBieSBhIG5ld2xpbmUuICBUaGUgdGVybWluYXRpbmcgbnVsbCBjaGFyYWN0ZXIgb2YKICAgICAgICAgdGhlIHN0cmluZyBpcyBub3Qgd3JpdHRlbi4gIChOb3RlIHRoYXQgPENPREU+ZnB1dHM8L0NPREU+IGRvZXMgPEVNPm5vdDwvRU0+CiAgICAgICAgIHdyaXRlIGEgbmV3bGluZSBhcyB0aGlzIGZ1bmN0aW9uIGRvZXMuKQogICAgICAgICA8YnI+PGJyPiA8Q09ERT5wdXRzPC9DT0RFPiBpcyB0aGUgbW9zdCBjb252ZW5pZW50IGZ1bmN0aW9uIGZvciBwcmludGluZyBzaW1wbGUKICAgICAgICAgbWVzc2FnZXMuICBGb3IgZXhhbXBsZToKICAgICAgICAgPGJyPjxicj4gPHByZT48YnI+CiAgICAgICAgIHB1dHMgKCJUaGlzIGlzIGEgbWVzc2FnZS4iKTs8YnI+CiAgICAgICAgIDwvcHJlPgogICAgICAgICA8YnI+PGJyPgogICAgICAgICBvdXRwdXRzIHRoZSB0ZXh0IDxzYW1wPlRoaXMgaXMgYSBtZXNzYWdlLjwvc2FtcD4gZm9sbG93ZWQgYnkgYSBuZXdsaW5lLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAdzdGRpby5oeHEAfhYadAANY29uc3QgY2hhciAqc3QAA2ludHQACXB1dHV0bGluZXNxAH4ACnQEDwogICAgICAgIFRoZSA8Q09ERT5wdXR1dGxpbmU8L0NPREU+IGZ1bmN0aW9uIGluc2VydHMgdGhlIGVudHJ5IDxDT0RFPio8VkFSPnV0bXA8L1ZBUj48L0NPREU+IGF0CiAgICAgICAgIHRoZSBhcHByb3ByaWF0ZSBwbGFjZSBpbiB0aGUgdXNlciBhY2NvdW50aW5nIGRhdGFiYXNlLiAgSWYgaXQgZmluZHMgdGhhdAogICAgICAgICBpdCBpcyBub3QgYWxyZWFkeSBhdCB0aGUgY29ycmVjdCBwbGFjZSBpbiB0aGUgZGF0YWJhc2UsIGl0IHVzZXMKICAgICAgICAgPENPREU+Z2V0dXRpZDwvQ09ERT4gdG8gc2VhcmNoIGZvciB0aGUgcG9zaXRpb24gdG8gaW5zZXJ0IHRoZSBlbnRyeSwgaG93ZXZlcgogICAgICAgICB0aGlzIHdpbGwgbm90IG1vZGlmeSB0aGUgc3RhdGljIHN0cnVjdHVyZSByZXR1cm5lZCBieSA8Q09ERT5nZXR1dGVudDwvQ09ERT4sCiAgICAgICAgIDxDT0RFPmdldHV0aWQ8L0NPREU+IGFuZCA8Q09ERT5nZXR1dGxpbmU8L0NPREU+LiAgSWYgdGhpcyBzZWFyY2ggZmFpbHMsIHRoZSBlbnRyeQogICAgICAgICBpcyBhcHBlbmRlZCB0byB0aGUgZGF0YWJhc2UuCiAgICAgICAgIDxicj48YnI+IFRoZSA8Q09ERT5wdXR1dGxpbmU8L0NPREU+IGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIHRvIGEgY29weSBvZiB0aGUgZW50cnkKICAgICAgICAgaW5zZXJ0ZWQgaW4gdGhlIHVzZXIgYWNjb3VudGluZyBkYXRhYmFzZSwgb3IgYSBudWxsIHBvaW50ZXIgaWYgdGhlIGVudHJ5CiAgICAgICAgIGNvdWxkIG5vdCBiZSBhZGRlZC4gIFRoZSBmb2xsb3dpbmcgPENPREU+ZXJybm88L0NPREU+IGVycm9yIGNvbmRpdGlvbnMgYXJlCiAgICAgICAgIGRlZmluZWQgZm9yIHRoaXMgZnVuY3Rpb246CiAgICAgICAgIDxicj48YnI+IDxETD4KCiAgICAgICAgIDxEVD48Q09ERT5FUEVSTTwvQ09ERT4KPEREPgogICAgICAgICBUaGUgcHJvY2VzcyBkb2VzIG5vdCBoYXZlIHRoZSBhcHByb3ByaWF0ZSBwcml2aWxlZ2VzOyB5b3UgY2Fubm90IG1vZGlmeQogICAgICAgICB0aGUgdXNlciBhY2NvdW50aW5nIGRhdGFiYXNlLgoKICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGdXRtcC5oeHEAfhYhdAAXY29uc3Qgc3RydWN0IHV0bXAgKnV0bXB0AA1zdHJ1Y3QgdXRtcCAqdAAKcHV0dXR4bGluZXNxAH4ACnQBKQogICAgICAgIFRoZSA8Q09ERT5wdXR1dHhsaW5lPC9DT0RFPiBmdW5jdGlvbiBpcyBmdW5jdGlvbmFsbHkgaWRlbnRpY2FsIHRvCiAgICAgICAgIDxDT0RFPnB1dHV0bGluZTwvQ09ERT4sIGJ1dCB1c2VzIDxDT0RFPnN0cnVjdCB1dG1weDwvQ09ERT4gaW5zdGVhZCBvZiA8Q09ERT5zdHJ1Y3QKICAgICAgICAgdXRtcDwvQ09ERT4uICBPbiB0aGUgR05VIHN5c3RlbSwgPENPREU+cHV0dXR4bGluZTwvQ09ERT4gaXMgc2ltcGx5IGFuIGFsaWFzIGZvcgogICAgICAgICA8Q09ERT5wdXR1dGxpbmU8L0NPREU+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAd1dG1weC5oeHEAfhYodAAYY29uc3Qgc3RydWN0IHV0bXB4ICp1dG1wdAAOc3RydWN0IHV0bXB4ICp0AARwdXR3c3EAfgAKdADnCiAgICAgICAgVGhpcyBmdW5jdGlvbiB3cml0ZXMgdGhlIHdvcmQgPFZBUj53PC9WQVI+ICh0aGF0IGlzLCBhbiA8Q09ERT5pbnQ8L0NPREU+KSB0bwogICAgICAgICA8VkFSPnN0cmVhbTwvVkFSPi4gIEl0IGlzIHByb3ZpZGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggU1ZJRCwgYnV0IHdlCiAgICAgICAgIHJlY29tbWVuZCB5b3UgdXNlIDxDT0RFPmZ3cml0ZTwvQ09ERT4gaW5zdGVhZCAuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3N0ZGlvLmh4cQB+Fi90ABNpbnQgdywgRklMRSAqc3RyZWFtdAADaW50dAAFcHV0d2NzcQB+AAp0AYUKICAgICAgICBUaGlzIGlzIGp1c3QgbGlrZSA8Q09ERT5mcHV0d2M8L0NPREU+LCBleGNlcHQgdGhhdCBpdCBjYW4gYmUgaW1wbGVtZW50IGFzCiAgICAgICAgIGEgbWFjcm8sIG1ha2luZyBpdCBmYXN0ZXIuICBPbmUgY29uc2VxdWVuY2UgaXMgdGhhdCBpdCBtYXkgZXZhbHVhdGUgdGhlCiAgICAgICAgIDxWQVI+c3RyZWFtPC9WQVI+IGFyZ3VtZW50IG1vcmUgdGhhbiBvbmNlLCB3aGljaCBpcyBhbiBleGNlcHRpb24gdG8gdGhlCiAgICAgICAgIGdlbmVyYWwgcnVsZSBmb3IgbWFjcm9zLiAgPENPREU+cHV0d2M8L0NPREU+IGlzIHVzdWFsbHkgdGhlIGJlc3QgZnVuY3Rpb24gdG8KICAgICAgICAgdXNlIGZvciB3cml0aW5nIGEgc2luZ2xlIHdpZGUgY2hhcmFjdGVyLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAd3Y2hhci5oeHEAfhY2dAAYd2NoYXJfdCB3YywgRklMRSAqc3RyZWFtdAAGd2ludF90dAAOcHV0d2NfdW5sb2NrZWRzcQB+AAp0ANwKICAgICAgICBUaGUgPENPREU+cHV0d2NfdW5sb2NrZWQ8L0NPREU+IGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gdGhlIDxDT0RFPnB1dHdjPC9DT0RFPgogICAgICAgICBmdW5jdGlvbiBleGNlcHQgdGhhdCBpdCBkb2VzIG5vdCBpbXBsaWNpdGx5IGxvY2sgdGhlIHN0cmVhbS4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiBpcyBhIEdOVSBleHRlbnNpb24uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3djaGFyLmh4cQB+Fj10ABh3Y2hhcl90IHdjLCBGSUxFICpzdHJlYW10AAZ3aW50X3R0AAhwdXR3Y2hhcnNxAH4ACnQAqgogICAgICAgIFRoZSA8Q09ERT5wdXR3Y2hhcjwvQ09ERT4gZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byA8Q09ERT5wdXR3YzwvQ09ERT4gd2l0aAogICAgICAgICA8Q09ERT5zdGRvdXQ8L0NPREU+IGFzIHRoZSB2YWx1ZSBvZiB0aGUgPFZBUj5zdHJlYW08L1ZBUj4gYXJndW1lbnQuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3djaGFyLmh4cQB+FkR0AAp3Y2hhcl90IHdjdAAGd2ludF90dAARcHV0d2NoYXJfdW5sb2NrZWRzcQB+AAp0AOIKICAgICAgICBUaGUgPENPREU+cHV0d2NoYXJfdW5sb2NrZWQ8L0NPREU+IGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gdGhlIDxDT0RFPnB1dHdjaGFyPC9DT0RFPgogICAgICAgICBmdW5jdGlvbiBleGNlcHQgdGhhdCBpdCBkb2VzIG5vdCBpbXBsaWNpdGx5IGxvY2sgdGhlIHN0cmVhbS4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiBpcyBhIEdOVSBleHRlbnNpb24uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3djaGFyLmh4cQB+Fkt0AAp3Y2hhcl90IHdjdAAGd2ludF90dAAGcHdyaXRlc3EAfgAKdAZACiAgICAgICAgVGhlIDxDT0RFPnB3cml0ZTwvQ09ERT4gZnVuY3Rpb24gaXMgc2ltaWxhciB0byB0aGUgPENPREU+d3JpdGU8L0NPREU+IGZ1bmN0aW9uLiAgVGhlCiAgICAgICAgIGZpcnN0IHRocmVlIGFyZ3VtZW50cyBhcmUgaWRlbnRpY2FsLCBhbmQgdGhlIHJldHVybiB2YWx1ZXMgYW5kIGVycm9yIGNvZGVzCiAgICAgICAgIGFsc28gY29ycmVzcG9uZC4KICAgICAgICAgPGJyPjxicj4gVGhlIGRpZmZlcmVuY2UgaXMgdGhlIGZvdXJ0aCBhcmd1bWVudCBhbmQgaXRzIGhhbmRsaW5nLiAgVGhlIGRhdGEgYmxvY2sKICAgICAgICAgaXMgbm90IHdyaXR0ZW4gdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIGZpbGUgZGVzY3JpcHRvcgogICAgICAgICA8Q09ERT5maWxlZGVzPC9DT0RFPi4gIEluc3RlYWQgdGhlIGRhdGEgaXMgd3JpdHRlbiB0byB0aGUgZmlsZSBzdGFydGluZyBhdAogICAgICAgICBwb3NpdGlvbiA8VkFSPm9mZnNldDwvVkFSPi4gIFRoZSBwb3NpdGlvbiBvZiB0aGUgZmlsZSBkZXNjcmlwdG9yIGl0c2VsZiBpcwogICAgICAgICBub3QgYWZmZWN0ZWQgYnkgdGhlIG9wZXJhdGlvbi4gIFRoZSB2YWx1ZSBpcyB0aGUgc2FtZSBhcyBiZWZvcmUgdGhlIGNhbGwuCiAgICAgICAgIDxicj48YnI+IFdoZW4gdGhlIHNvdXJjZSBmaWxlIGlzIGNvbXBpbGVkIHdpdGggPENPREU+X0ZJTEVfT0ZGU0VUX0JJVFMgPT0gNjQ8L0NPREU+IHRoZQogICAgICAgICA8Q09ERT5wd3JpdGU8L0NPREU+IGZ1bmN0aW9uIGlzIGluIGZhY3QgPENPREU+cHdyaXRlNjQ8L0NPREU+IGFuZCB0aGUgdHlwZQogICAgICAgICA8Q09ERT5vZmZfdDwvQ09ERT4gaGFzIDY0IGJpdHMsIHdoaWNoIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGhhbmRsZSBmaWxlcyB1cCB0bwogICAgICAgICAyXjYzIGJ5dGVzIGluIGxlbmd0aC4KICAgICAgICAgPGJyPjxicj4gVGhlIHJldHVybiB2YWx1ZSBvZiA8Q09ERT5wd3JpdGU8L0NPREU+IGRlc2NyaWJlcyB0aGUgbnVtYmVyIG9mIHdyaXR0ZW4gYnl0ZXMuCiAgICAgICAgIEluIHRoZSBlcnJvciBjYXNlIGl0IHJldHVybnMgLTEgbGlrZSA8Q09ERT53cml0ZTwvQ09ERT4gZG9lcyBhbmQgdGhlCiAgICAgICAgIGVycm9yIGNvZGVzIGFyZSBhbHNvIHRoZSBzYW1lLCB3aXRoIHRoZXNlIGFkZGl0aW9uczoKICAgICAgICAgPGJyPjxicj4gPERMPgoKICAgICAgICAgPERUPjxDT0RFPkVJTlZBTDwvQ09ERT4KPEREPgogICAgICAgICBUaGUgdmFsdWUgZ2l2ZW4gZm9yIDxWQVI+b2Zmc2V0PC9WQVI+IGlzIG5lZ2F0aXZlIGFuZCB0aGVyZWZvcmUgaWxsZWdhbC4KICAgICAgICAgPGJyPjxicj4gPExJPiBFU1BJUEUKICAgICAgICAgVGhlIGZpbGUgZGVzY3JpcHRvciA8VkFSPmZpbGVkZXM8L1ZBUj4gaXMgYXNzb2NpYXRlZCB3aXRoIGEgcGlwZSBvciBhIEZJRk8gYW5kCiAgICAgICAgIHRoaXMgZGV2aWNlIGRvZXMgbm90IGFsbG93IHBvc2l0aW9uaW5nIG9mIHRoZSBmaWxlIHBvaW50ZXIuCgogICAgICAgICA8YnI+PGJyPiBUaGUgZnVuY3Rpb24gaXMgYW4gZXh0ZW5zaW9uIGRlZmluZWQgaW4gdGhlIFVuaXggU2luZ2xlIFNwZWNpZmljYXRpb24KICAgICAgICAgdmVyc2lvbiAyLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAh1bmlzdGQuaHhxAH4WUnQAOmludCBmaWxlZGVzLCBjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplLCBvZmZfdCBvZmZzZXR0AAdzc2l6ZV90dAAIcHdyaXRlNjRzcQB+AAp0AzUKICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gdGhlIDxDT0RFPnB3cml0ZTwvQ09ERT4gZnVuY3Rpb24uICBUaGUgZGlmZmVyZW5jZQogICAgICAgICBpcyB0aGF0IHRoZSA8VkFSPm9mZnNldDwvVkFSPiBwYXJhbWV0ZXIgaXMgb2YgdHlwZSA8Q09ERT5vZmY2NF90PC9DT0RFPiBpbnN0ZWFkIG9mCiAgICAgICAgIDxDT0RFPm9mZl90PC9DT0RFPiB3aGljaCBtYWtlcyBpdCBwb3NzaWJsZSBvbiAzMiBiaXQgbWFjaGluZXMgdG8gYWRkcmVzcwogICAgICAgICBmaWxlcyBsYXJnZXIgdGhhbiAyXjMxIGJ5dGVzIGFuZCB1cCB0byAyXjYzIGJ5dGVzLiAgVGhlCiAgICAgICAgIGZpbGUgZGVzY3JpcHRvciA8Q09ERT5maWxlZGVzPC9DT0RFPiBtdXN0IGJlIG9wZW5lZCB1c2luZyA8Q09ERT5vcGVuNjQ8L0NPREU+IHNpbmNlCiAgICAgICAgIG90aGVyd2lzZSB0aGUgbGFyZ2Ugb2Zmc2V0cyBwb3NzaWJsZSB3aXRoIDxDT0RFPm9mZjY0X3Q8L0NPREU+IHdpbGwgbGVhZCB0bwogICAgICAgICBlcnJvcnMgd2l0aCBhIGRlc2NyaXB0b3IgaW4gc21hbGwgZmlsZSBtb2RlLgogICAgICAgICA8YnI+PGJyPiBXaGVuIHRoZSBzb3VyY2UgZmlsZSBpcyBjb21waWxlZCB1c2luZyA8Q09ERT5fRklMRV9PRkZTRVRfQklUUyA9PSA2NDwvQ09ERT4gb24gYQogICAgICAgICAzMiBiaXQgbWFjaGluZSB0aGlzIGZ1bmN0aW9uIGlzIGFjdHVhbGx5IGF2YWlsYWJsZSB1bmRlciB0aGUgbmFtZQogICAgICAgICA8Q09ERT5wd3JpdGU8L0NPREU+IGFuZCBzbyB0cmFuc3BhcmVudGx5IHJlcGxhY2VzIHRoZSAzMiBiaXQgaW50ZXJmYWNlLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAh1bmlzdGQuaHhxAH4WWXQAPGludCBmaWxlZGVzLCBjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplLCBvZmY2NF90IG9mZnNldHQAB3NzaXplX3R0AAVxZWN2dHNxAH4ACnQA9QogICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byA8Q09ERT5lY3Z0PC9DT0RFPiBleGNlcHQgdGhhdCBpdCB0YWtlcyBhCiAgICAgICAgIDxDT0RFPmxvbmcgZG91YmxlPC9DT0RFPiBmb3IgdGhlIGZpcnN0IHBhcmFtZXRlciBhbmQgdGhhdCA8VkFSPm5kaWdpdDwvVkFSPiBpcwogICAgICAgICByZXN0cmljdGVkIGJ5IHRoZSBwcmVjaXNpb24gb2YgYSA8Q09ERT5sb25nIGRvdWJsZTwvQ09ERT4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHN0ZGxpYi5oeHEAfhZgdAAzbG9uZyBkb3VibGUgdmFs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aW9uIHNvcnRzIHRoZSBhcnJheSA8VkFSPmFycmF5PC9WQVI+LiAgVGhlIGFycmF5IGNvbnRhaW5zCiAgICAgICAgIDxWQVI+Y291bnQ8L1ZBUj4gZWxlbWVudHMsIGVhY2ggb2Ygd2hpY2ggaXMgb2Ygc2l6ZSA8VkFSPnNpemU8L1ZBUj4uCiAgICAgICAgIDxicj48YnI+IFRoZSA8VkFSPmNvbXBhcmU8L1ZBUj4gZnVuY3Rpb24gaXMgdXNlZCB0byBwZXJmb3JtIHRoZSBjb21wYXJpc29uIG9uIHRoZQogICAgICAgICBhcnJheSBlbGVtZW50cy4gIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggdHdvIHBvaW50ZXIgYXJndW1lbnRzIGFuZAogICAgICAgICBzaG91bGQgcmV0dXJuIGFuIGludGVnZXIgbGVzcyB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHplcm8KICAgICAgICAgY29ycmVzcG9uZGluZyB0byB3aGV0aGVyIGl0cyBmaXJzdCBhcmd1bWVudCBpcyBjb25zaWRlcmVkIGxlc3MgdGhhbiwKICAgICAgICAgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiBpdHMgc2Vjb25kIGFyZ3VtZW50LgogICAgICAgICA8YnI+PGJyPiAgc29ydGluZwogICAgICAgICBXYXJuaW5nOiBJZiB0d28gb2JqZWN0cyBjb21wYXJlIGFzIGVxdWFsLCB0aGVpciBvcmRlciBhZnRlcgogICAgICAgICBzb3J0aW5nIGlzIHVucHJlZGljdGFibGUuICBUaGF0IGlzIHRvIHNheSwgdGhlIHNvcnRpbmcgaXMgbm90IHN0YWJsZS4KICAgICAgICAgVGhpcyBjYW4gbWFrZSBhIGRpZmZlcmVuY2Ugd2hlbiB0aGUgY29tcGFyaXNvbiBjb25zaWRlcnMgb25seSBwYXJ0IG9mCiAgICAgICAgIHRoZSBlbGVtZW50cy4gIFR3byBlbGVtZW50cyB3aXRoIHRoZSBzYW1lIHNvcnQga2V5IG1heSBkaWZmZXIgaW4gb3RoZXIKICAgICAgICAgcmVzcGVjdHMuCiAgICAgICAgIDxicj48YnI+IElmIHlvdSB3YW50IHRoZSBlZmZlY3Qgb2YgYSBzdGFibGUgc29ydCwgeW91IGNhbiBnZXQgdGhpcyByZXN1bHQgYnkKICAgICAgICAgd3JpdGluZyB0aGUgY29tcGFyaXNvbiBmdW5jdGlvbiBzbyB0aGF0LCBsYWNraW5nIG90aGVyIHJlYXNvbgogICAgICAgICBkaXN0aW5ndWlzaCBiZXR3ZWVuIHR3byBlbGVtZW50cywgaXQgY29tcGFyZXMgdGhlbSBieSB0aGVpciBhZGRyZXNzZXMuCiAgICAgICAgIE5vdGUgdGhhdCBkb2luZyB0aGlzIG1heSBtYWtlIHRoZSBzb3J0aW5nIGFsZ29yaXRobSBsZXNzIGVmZmljaWVudCwgc28KICAgICAgICAgZG8gaXQgb25seSBpZiBuZWNlc3NhcnkuCiAgICAgICAgIDxicj48YnI+IEhlcmUgaXMgYSBzaW1wbGUgZXhhbXBsZSBvZiBzb3J0aW5nIGFuIGFycmF5IG9mIGRvdWJsZXMgaW4gbnVtZXJpY2FsCiAgICAgICAgIG9yZGVyLCB1c2luZyB0aGUgY29tcGFyaXNvbiBmdW5jdGlvbiBkZWZpbmVkIGFib3ZlIDoKICAgICAgICAgPGJyPjxicj4gPHByZT48YnI+CiAgICAgICAgIHs8YnI+CiAgICAgICAgICAgZG91YmxlICphcnJheTs8YnI+CiAgICAgICAgICAgaW50IHNpemU7PGJyPgogICAgICAgICAgIDxzbWFsbD4uLi48L3NtYWxsPjxicj4KICAgICAgICAgICBxc29ydCAoYXJyYXksIHNpemUsIHNpemVvZiAoZG91YmxlKSwgY29tcGFyZV9kb3VibGVzKTs8YnI+CiAgICAgICAgIH08YnI+CiAgICAgICAgIDwvcHJlPgogICAgICAgICA8YnI+PGJyPiBUaGUgPENPREU+cXNvcnQ8L0NPREU+IGZ1bmN0aW9uIGRlcml2ZXMgaXRzIG5hbWUgZnJvbSB0aGUgZmFjdCB0aGF0IGl0IHdhcwogICAgICAgICBvcmlnaW5hbGx5IGltcGxlbWVudGVkIHVzaW5nIHRoZSBgYHF1aWNrIHNvcnQnJyBhbGdvcml0aG0uCiAgICAgICAgIDxicj48YnI+IFRoZSBpbXBsZW1lbnRhdGlvbiBvZiA8Q09ERT5xc29ydDwvQ09ERT4gaW4gdGhpcyBsaWJyYXJ5IG1pZ2h0IG5vdCBiZSBhbgogICAgICAgICBpbi1wbGFjZSBzb3J0IGFuZCBtaWdodCB0aGVyZWJ5IHVzZSBhbiBleHRyYSBhbW91bnQgb2YgbWVtb3J5IHRvIHN0b3JlCiAgICAgICAgIHRoZSBhcnJheS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc3RkbGliLmh4cQB+FoN0AD92b2lkICphcnJheSwgc2l6ZV90IGNvdW50LCBzaXplX3Qgc2l6ZSwgY29tcGFyaXNvbl9mbl90IGNvbXBhcmV0AAR2b2lkdAAFcmFpc2VzcQB+AAp0ASAKICAgICAgICBUaGUgPENPREU+cmFpc2U8L0NPREU+IGZ1bmN0aW9uIHNlbmRzIHRoZSBzaWduYWwgPFZBUj5zaWdudW08L1ZBUj4gdG8gdGhlIGNhbGxpbmcKICAgICAgICAgcHJvY2Vzcy4gIEl0IHJldHVybnMgemVybyBpZiBzdWNjZXNzZnVsIGFuZCBhIG5vbnplcm8gdmFsdWUgaWYgaXQgZmFpbHMuCiAgICAgICAgIEFib3V0IHRoZSBvbmx5IHJlYXNvbiBmb3IgZmFpbHVyZSB3b3VsZCBiZSBpZiB0aGUgdmFsdWUgb2YgPFZBUj5zaWdudW08L1ZBUj4KICAgICAgICAgaXMgaW52YWxpZC4KICAgICAgICBzcQB+AA8AAAACdwQAAAACdAAIc2lnbmFsLmh0AAh1bmlzdGQuaHhxAH4WinQACmludCBzaWdudW10AANpbnR0AARyYW5kc3EAfgAKdACuCiAgICAgICAgVGhlIDxDT0RFPnJhbmQ8L0NPREU+IGZ1bmN0aW9uIHJldHVybnMgdGhlIG5leHQgcHNldWRvLXJhbmRvbSBudW1iZXIgaW4gdGhlCiAgICAgICAgIHNlcmllcy4gIFRoZSB2YWx1ZSByYW5nZXMgZnJvbSA8Q09ERT4wPC9DT0RFPiB0byA8Q09ERT5SQU5EX01BWDwvQ09ERT4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHN0ZGxpYi5oeHEAfhaSdAAEdm9pZHQAA2ludHQABnJhbmRfcnNxAH4ACnQCeAogICAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHJhbmRvbSBudW1iZXIgaW4gdGhlIHJhbmdlIDAgdG8gPENPREU+UkFORF9NQVg8L0NPREU+CiAgICAgICAgIGp1c3QgYXMgPENPREU+cmFuZDwvQ09ERT4gZG9lcy4gIEhvd2V2ZXIsIGFsbCBpdHMgc3RhdGUgaXMgc3RvcmVkIGluIHRoZQogICAgICAgICA8VkFSPnNlZWQ8L1ZBUj4gYXJndW1lbnQuICBUaGlzIG1lYW5zIHRoZSBSTkcncyBzdGF0ZSBjYW4gb25seSBoYXZlIGFzIG1hbnkKICAgICAgICAgYml0cyBhcyB0aGUgdHlwZSA8Q09ERT51bnNpZ25lZCBpbnQ8L0NPREU+IGhhcy4gIFRoaXMgaXMgZmFyIHRvbyBmZXcgdG8KICAgICAgICAgcHJvdmlkZSBhIGdvb2QgUk5HLgogICAgICAgICA8YnI+PGJyPiBJZiB5b3VyIHByb2dyYW0gcmVxdWlyZXMgYSByZWVudHJhbnQgUk5HLCB3ZSByZWNvbW1lbmQgeW91IHVzZSB0aGUKICAgICAgICAgcmVlbnRyYW50IEdOVSBleHRlbnNpb25zIHRvIHRoZSBTVklEIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLiAgVGhlCiAgICAgICAgIFBPU0lYLjEgaW50ZXJmYWNlIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgR05VIGV4dGVuc2lvbnMgYXJlIG5vdAogICAgICAgICBhdmFpbGFibGUuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHN0ZGxpYi5oeHEAfhaZdAASdW5zaWduZWQgaW50ICpzZWVkdAADaW50dAAGcmFuZG9tc3EAfgAKdAH0CiAgICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBuZXh0IHBzZXVkby1yYW5kb20gbnVtYmVyIGluIHRoZSBzZXF1ZW5jZS4KICAgICAgICAgVGhlIHZhbHVlIHJldHVybmVkIHJhbmdlcyBmcm9tIDxDT0RFPjA8L0NPREU+IHRvIDxDT0RFPlJBTkRfTUFYPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gTkI6IFRlbXBvcmFyaWx5IHRoaXMgZnVuY3Rpb24gd2FzIGRlZmluZWQgdG8gcmV0dXJuIGEKICAgICAgICAgPENPREU+aW50MzJfdDwvQ09ERT4gdmFsdWUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgcmV0dXJuIHZhbHVlIGFsd2F5cyBjb250YWlucwogICAgICAgICAzMiBiaXRzIGV2ZW4gaWYgPENPREU+bG9uZyBpbnQ8L0NPREU+IGlzIHdpZGVyLiAgVGhlIHN0YW5kYXJkIGRlbWFuZHMgaXQKICAgICAgICAgZGlmZmVyZW50bHkuICBVc2VycyBtdXN0IGFsd2F5cyBiZSBhd2FyZSBvZiB0aGUgMzItYml0IGxpbWl0YXRpb24sCiAgICAgICAgIHRob3VnaC4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc3RkbGliLmh4cQB+FqB0AAR2b2lkdAAIbG9uZyBpbnR0AAhyYW5kb21fcnNxAH4ACnQA9AogICAgICAgIFRoZSA8Q09ERT5yYW5kb21fcjwvQ09ERT4gZnVuY3Rpb24gYmVoYXZlcyBleGFjdGx5IGxpa2UgdGhlIDxDT0RFPnJhbmRvbTwvQ09ERT4KICAgICAgICAgZnVuY3Rpb24gZXhjZXB0IHRoYXQgaXQgdXNlcyBhbmQgbW9kaWZpZXMgdGhlIHN0YXRlIGluIHRoZSBvYmplY3QKICAgICAgICAgcG9pbnRlZCB0byBieSB0aGUgZmlyc3QgcGFyYW1ldGVyIGluc3RlYWQgb2YgdGhlIGdsb2JhbCBzdGF0ZS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc3RkbGliLmh4cQB+Fqd0ADpzdHJ1Y3QgcmFuZG9tX2RhdGEgKnJlc3RyaWN0IGJ1ZiwgaW50MzJfdCAqcmVzdHJpY3QgcmVzdWx0dAADaW50dAAJcmF3bWVtY2hyc3EAfgAKdAUrCiAgICAgICAgT2Z0ZW4gdGhlIDxDT0RFPm1lbWNocjwvQ09ERT4gZnVuY3Rpb24gaXMgdXNlZCB3aXRoIHRoZSBrbm93bGVkZ2UgdGhhdCB0aGUKICAgICAgICAgYnl0ZSA8VkFSPmM8L1ZBUj4gaXMgYXZhaWxhYmxlIGluIHRoZSBtZW1vcnkgYmxvY2sgc3BlY2lmaWVkIGJ5IHRoZQogICAgICAgICBwYXJhbWV0ZXJzLiAgQnV0IHRoaXMgbWVhbnMgdGhhdCB0aGUgPFZBUj5zaXplPC9WQVI+IHBhcmFtZXRlciBpcyBub3QgcmVhbGx5CiAgICAgICAgIG5lZWRlZCBhbmQgdGhhdCB0aGUgdGVzdHMgcGVyZm9ybWVkIHdpdGggaXQgYXQgcnVudGltZSAodG8gY2hlY2sgd2hldGhlcgogICAgICAgICB0aGUgZW5kIG9mIHRoZSBibG9jayBpcyByZWFjaGVkKSBhcmUgbm90IG5lZWRlZC4KICAgICAgICAgPGJyPjxicj4gVGhlIDxDT0RFPnJhd21lbWNocjwvQ09ERT4gZnVuY3Rpb24gZXhpc3RzIGZvciBqdXN0IHRoaXMgc2l0dWF0aW9uIHdoaWNoIGlzCiAgICAgICAgIHN1cnByaXNpbmdseSBmcmVxdWVudC4gIFRoZSBpbnRlcmZhY2UgaXMgc2ltaWxhciB0byA8Q09ERT5tZW1jaHI8L0NPREU+IGV4Y2VwdAogICAgICAgICB0aGF0IHRoZSA8VkFSPnNpemU8L1ZBUj4gcGFyYW1ldGVyIGlzIG1pc3NpbmcuICBUaGUgZnVuY3Rpb24gd2lsbCBsb29rIGJleW9uZAogICAgICAgICB0aGUgZW5kIG9mIHRoZSBibG9jayBwb2ludGVkIHRvIGJ5IDxWQVI+YmxvY2s8L1ZBUj4gaW4gY2FzZSB0aGUgcHJvZ3JhbW1lcgogICAgICAgICBtYWRlIGFuIGVycm9yIGluIGFzc3VtaW5nIHRoYXQgdGhlIGJ5dGUgPFZBUj5jPC9WQVI+IGlzIHByZXNlbnQgaW4gdGhlIGJsb2NrLgogICAgICAgICBJbiB0aGlzIGNhc2UgdGhlIHJlc3VsdCBpcyB1bnNwZWNpZmllZC4gIE90aGVyd2lzZSB0aGUgcmV0dXJuIHZhbHVlIGlzIGEKICAgICAgICAgcG9pbnRlciB0byB0aGUgbG9jYXRlZCBieXRlLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIGlzIG9mIHNwZWNpYWwgaW50ZXJlc3Qgd2hlbiBsb29raW5nIGZvciB0aGUgZW5kIG9mIGEKICAgICAgICAgc3RyaW5nLiAgU2luY2UgYWxsIHN0cmluZ3MgYXJlIHRlcm1pbmF0ZWQgYnkgYSBudWxsIGJ5dGUgYSBjYWxsIGxpa2UKICAgICAgICAgPGJyPjxicj4gPHByZT48YnI+CiAgICAgICAgICAgIHJhd21lbWNociAoc3RyLCAnXDAnKTxicj4KICAgICAgICAgPC9wcmU+CiAgICAgICAgIDxicj48YnI+CiAgICAgICAgIHdpbGwgbmV2ZXIgZ28gYmV5b25kIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiBpcyBhIEdOVSBleHRlbnNpb24uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHN0cmluZy5oeHEAfhaudAAYY29uc3Qgdm9pZCAqYmxvY2ssIGludCBjdAAGdm9pZCAqdAAEcmVhZHNxAH4ACnQTwwogICAgICAgIFRoZSA8Q09ERT5yZWFkPC9DT0RFPiBmdW5jdGlvbiByZWFkcyB1cCB0byA8VkFSPnNpemU8L1ZBUj4gYnl0ZXMgZnJvbSB0aGUgZmlsZQogICAgICAgICB3aXRoIGRlc2NyaXB0b3IgPFZBUj5maWxlZGVzPC9WQVI+LCBzdG9yaW5nIHRoZSByZXN1bHRzIGluIHRoZSA8VkFSPmJ1ZmZlcjwvVkFSPi4KICAgICAgICAgKFRoaXMgaXMgbm90IG5lY2Vzc2FyaWx5IGEgY2hhcmFjdGVyIHN0cmluZywgYW5kIG5vIHRlcm1pbmF0aW5nIG51bGwKICAgICAgICAgY2hhcmFjdGVyIGlzIGFkZGVkLikKICAgICAgICAgPGJyPjxicj4gLW9mLWZpbGUsIG9uIGEgZmlsZSBkZXNjcmlwdG9yCiAgICAgICAgIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkLiAgVGhpcyBtaWdodCBiZQogICAgICAgICBsZXNzIHRoYW4gPFZBUj5zaXplPC9WQVI+OyBmb3IgZXhhbXBsZSwgaWYgdGhlcmUgYXJlbid0IHRoYXQgbWFueSBieXRlcyBsZWZ0CiAgICAgICAgIGluIHRoZSBmaWxlIG9yIGlmIHRoZXJlIGFyZW4ndCB0aGF0IG1hbnkgYnl0ZXMgaW1tZWRpYXRlbHkgYXZhaWxhYmxlLgogICAgICAgICBUaGUgZXhhY3QgYmVoYXZpb3IgZGVwZW5kcyBvbiB3aGF0IGtpbmQgb2YgZmlsZSBpdCBpcy4gIE5vdGUgdGhhdAogICAgICAgICByZWFkaW5nIGxlc3MgdGhhbiA8VkFSPnNpemU8L1ZBUj4gYnl0ZXMgaXMgbm90IGFuIGVycm9yLgogICAgICAgICA8YnI+PGJyPiBBIHZhbHVlIG9mIHplcm8gaW5kaWNhdGVzIGVuZC1vZi1maWxlIChleGNlcHQgaWYgdGhlIHZhbHVlIG9mIHRoZQogICAgICAgICA8VkFSPnNpemU8L1ZBUj4gYXJndW1lbnQgaXMgYWxzbyB6ZXJvKS4gIFRoaXMgaXMgbm90IGNvbnNpZGVyZWQgYW4gZXJyb3IuCiAgICAgICAgIElmIHlvdSBrZWVwIGNhbGxpbmcgPENPREU+cmVhZDwvQ09ERT4gd2hpbGUgYXQgZW5kLW9mLWZpbGUsIGl0IHdpbGwga2VlcAogICAgICAgICByZXR1cm5pbmcgemVybyBhbmQgZG9pbmcgbm90aGluZyBlbHNlLgogICAgICAgICA8YnI+PGJyPiBJZiA8Q09ERT5yZWFkPC9DT0RFPiByZXR1cm5zIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIsIHRoZXJlIGlzIG5vIHdheSB5b3UgY2FuCiAgICAgICAgIHRlbGwgd2hldGhlciBlbmQtb2YtZmlsZSB3YXMgcmVhY2hlZC4gIEJ1dCBpZiB5b3UgZGlkIHJlYWNoIHRoZSBlbmQsIHRoZQogICAgICAgICBuZXh0IHJlYWQgd2lsbCByZXR1cm4gemVyby4KICAgICAgICAgPGJyPjxicj4gSW4gY2FzZSBvZiBhbiBlcnJvciwgPENPREU+cmVhZDwvQ09ERT4gcmV0dXJucyAtMS4gIFRoZSBmb2xsb3dpbmcKICAgICAgICAgPENPREU+ZXJybm88L0NPREU+IGVycm9yIGNvbmRpdGlvbnMgYXJlIGRlZmluZWQgZm9yIHRoaXMgZnVuY3Rpb246CiAgICAgICAgIDxicj48YnI+IDxETD4KCiAgICAgICAgIDxEVD48Q09ERT5FQUdBSU48L0NPREU+CjxERD4KICAgICAgICAgTm9ybWFsbHksIHdoZW4gbm8gaW5wdXQgaXMgaW1tZWRpYXRlbHkgYXZhaWxhYmxlLCA8Q09ERT5yZWFkPC9DT0RFPiB3YWl0cyBmb3IKICAgICAgICAgc29tZSBpbnB1dC4gIEJ1dCBpZiB0aGUgPENPREU+T19OT05CTE9DSzwvQ09ERT4gZmxhZyBpcyBzZXQgZm9yIHRoZSBmaWxlCiAgICAgICAgICwgPENPREU+cmVhZDwvQ09ERT4gcmV0dXJucyBpbW1lZGlhdGVseSB3aXRob3V0CiAgICAgICAgIHJlYWRpbmcgYW55IGRhdGEsIGFuZCByZXBvcnRzIHRoaXMgZXJyb3IuCiAgICAgICAgIDxicj48YnI+IENvbXBhdGliaWxpdHkgTm90ZTogTW9zdCB2ZXJzaW9ucyBvZiBCU0QgVW5peCB1c2UgYSBkaWZmZXJlbnQKICAgICAgICAgZXJyb3IgY29kZSBmb3IgdGhpczogPENPREU+RVdPVUxEQkxPQ0s8L0NPREU+LiAgSW4gdGhlIEdOVSBsaWJyYXJ5LAogICAgICAgICA8Q09ERT5FV09VTERCTE9DSzwvQ09ERT4gaXMgYW4gYWxpYXMgZm9yIDxDT0RFPkVBR0FJTjwvQ09ERT4sIHNvIGl0IGRvZXNuJ3QgbWF0dGVyCiAgICAgICAgIHdoaWNoIG5hbWUgeW91IHVzZS4KICAgICAgICAgPGJyPjxicj4gT24gc29tZSBzeXN0ZW1zLCByZWFkaW5nIGEgbGFyZ2UgYW1vdW50IG9mIGRhdGEgZnJvbSBhIGNoYXJhY3RlciBzcGVjaWFsCiAgICAgICAgIGZpbGUgY2FuIGFsc28gZmFpbCB3aXRoIDxDT0RFPkVBR0FJTjwvQ09ERT4gaWYgdGhlIGtlcm5lbCBjYW5ub3QgZmluZCBlbm91Z2gKICAgICAgICAgcGh5c2ljYWwgbWVtb3J5IHRvIGxvY2sgZG93biB0aGUgdXNlcidzIHBhZ2VzLiAgVGhpcyBpcyBsaW1pdGVkIHRvCiAgICAgICAgIGRldmljZXMgdGhhdCB0cmFuc2ZlciB3aXRoIGRpcmVjdCBtZW1vcnkgYWNjZXNzIGludG8gdGhlIHVzZXIncyBtZW1vcnksCiAgICAgICAgIHdoaWNoIG1lYW5zIGl0IGRvZXMgbm90IGluY2x1ZGUgdGVybWluYWxzLCBzaW5jZSB0aGV5IGFsd2F5cyB1c2UKICAgICAgICAgc2VwYXJhdGUgYnVmZmVycyBpbnNpZGUgdGhlIGtlcm5lbC4gIFRoaXMgcHJvYmxlbSBuZXZlciBoYXBwZW5zIGluIHRoZQogICAgICAgICBHTlUgc3lzdGVtLgogICAgICAgICA8YnI+PGJyPiBBbnkgY29uZGl0aW9uIHRoYXQgY291bGQgcmVzdWx0IGluIDxDT0RFPkVBR0FJTjwvQ09ERT4gY2FuIGluc3RlYWQgcmVzdWx0IGluIGEKICAgICAgICAgc3VjY2Vzc2Z1bCA8Q09ERT5yZWFkPC9DT0RFPiB3aGljaCByZXR1cm5zIGZld2VyIGJ5dGVzIHRoYW4gcmVxdWVzdGVkLgogICAgICAgICBDYWxsaW5nIDxDT0RFPnJlYWQ8L0NPREU+IGFnYWluIGltbWVkaWF0ZWx5IHdvdWxkIHJlc3VsdCBpbiA8Q09ERT5FQUdBSU48L0NPREU+LgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVCQURGCiAgICAgICAgIFRoZSA8VkFSPmZpbGVkZXM8L1ZBUj4gYXJndW1lbnQgaXMgbm90IGEgdmFsaWQgZmlsZSBkZXNjcmlwdG9yLAogICAgICAgICBvciBpcyBub3Qgb3BlbiBmb3IgcmVhZGluZy4KICAgICAgICAgPGJyPjxicj4gPExJPiBFSU5UUgogICAgICAgICA8Q09ERT5yZWFkPC9DT0RFPiB3YXMgaW50ZXJydXB0ZWQgYnkgYSBzaWduYWwgd2hpbGUgaXQgd2FzIHdhaXRpbmcgZm9yIGlucHV0LgogICAgICAgICAuICBBIHNpZ25hbCB3aWxsIG5vdCBuZWNlc3NhcnkgY2F1c2UKICAgICAgICAgPENPREU+cmVhZDwvQ09ERT4gdG8gcmV0dXJuIDxDT0RFPkVJTlRSPC9DT0RFPjsgaXQgbWF5IGluc3RlYWQgcmVzdWx0IGluIGEKICAgICAgICAgc3VjY2Vzc2Z1bCA8Q09ERT5yZWFkPC9DT0RFPiB3aGljaCByZXR1cm5zIGZld2VyIGJ5dGVzIHRoYW4gcmVxdWVzdGVkLgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVJTwogICAgICAgICBGb3IgbWFueSBkZXZpY2VzLCBhbmQgZm9yIGRpc2sgZmlsZXMsIHRoaXMgZXJyb3IgY29kZSBpbmRpY2F0ZXMKICAgICAgICAgYSBoYXJkd2FyZSBlcnJvci4KICAgICAgICAgPGJyPjxicj4gPENPREU+RUlPPC9DT0RFPiBhbHNvIG9jY3VycyB3aGVuIGEgYmFja2dyb3VuZCBwcm9jZXNzIHRyaWVzIHRvIHJlYWQgZnJvbSB0aGUKICAgICAgICAgY29udHJvbGxpbmcgdGVybWluYWwsIGFuZCB0aGUgbm9ybWFsIGFjdGlvbiBvZiBzdG9wcGluZyB0aGUgcHJvY2VzcyBieQogICAgICAgICBzZW5kaW5nIGl0IGEgPENPREU+U0lHVFRJTjwvQ09ERT4gc2lnbmFsIGlzbid0IHdvcmtpbmcuICBUaGlzIG1pZ2h0IGhhcHBlbiBpZgogICAgICAgICB0aGUgc2lnbmFsIGlzIGJlaW5nIGJsb2NrZWQgb3IgaWdub3JlZCwgb3IgYmVjYXVzZSB0aGUgcHJvY2VzcyBncm91cCBpcwogICAgICAgICBvcnBoYW5lZC4gICwgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgam9iIGNvbnRyb2wsCiAgICAgICAgIGFuZCBTaWduYWwgSGFuZGxpbmcsIGZvciBpbmZvcm1hdGlvbiBhYm91dCBzaWduYWxzLgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVJTlZBTAogICAgICAgICBJbiBzb21lIHN5c3RlbXMsIHdoZW4gcmVhZGluZyBmcm9tIGEgY2hhcmFjdGVyIG9yIGJsb2NrIGRldmljZSwgcG9zaXRpb24KICAgICAgICAgYW5kIHNpemUgb2Zmc2V0cyBtdXN0IGJlIGFsaWduZWQgdG8gYSBwYXJ0aWN1bGFyIGJsb2NrIHNpemUuICBUaGlzIGVycm9yCiAgICAgICAgIGluZGljYXRlcyB0aGF0IHRoZSBvZmZzZXRzIHdlcmUgbm90IHByb3Blcmx5IGFsaWduZWQuCgogICAgICAgICA8YnI+PGJyPiBQbGVhc2Ugbm90ZSB0aGF0IHRoZXJlIGlzIG5vIGZ1bmN0aW9uIG5hbWVkIDxDT0RFPnJlYWQ2NDwvQ09ERT4uICBUaGlzIGlzIG5vdAogICAgICAgICBuZWNlc3Nhcnkgc2luY2UgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBkaXJlY3RseSBtb2RpZnkgb3IgaGFuZGxlIHRoZQogICAgICAgICBwb3NzaWJseSB3aWRlIGZpbGUgb2Zmc2V0LiAgU2luY2UgdGhlIGtlcm5lbCBoYW5kbGVzIHRoaXMgc3RhdGUKICAgICAgICAgaW50ZXJuYWxseSwgdGhlIDxDT0RFPnJlYWQ8L0NPREU+IGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGZvciBhbGwgY2FzZXMuCiAgICAgICAgIDxicj48YnI+IFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgaW4gbXVsdGktdGhyZWFkZWQgcHJvZ3JhbXMuICBUaGlzCiAgICAgICAgIGlzIGEgcHJvYmxlbSBpZiB0aGUgdGhyZWFkIGFsbG9jYXRlcyBzb21lIHJlc291cmNlcyAobGlrZSBtZW1vcnksIGZpbGUKICAgICAgICAgZGVzY3JpcHRvcnMsIHNlbWFwaG9yZXMgb3Igd2hhdGV2ZXIpIGF0IHRoZSB0aW1lIDxDT0RFPnJlYWQ8L0NPREU+IGlzCiAgICAgICAgIGNhbGxlZC4gIElmIHRoZSB0aHJlYWQgZ2V0cyBjYW5jZWxlZCB0aGVzZSByZXNvdXJjZXMgc3RheSBhbGxvY2F0ZWQKICAgICAgICAgdW50aWwgdGhlIHByb2dyYW0gZW5kcy4gIFRvIGF2b2lkIHRoaXMsIGNhbGxzIHRvIDxDT0RFPnJlYWQ8L0NPREU+IHNob3VsZCBiZQogICAgICAgICBwcm90ZWN0ZWQgdXNpbmcgY2FuY2VsbGF0aW9uIGhhbmRsZXJzLgogICAgICAgICA8YnI+PGJyPiBUaGUgPENPREU+cmVhZDwvQ09ERT4gZnVuY3Rpb24gaXMgdGhlIHVuZGVybHlpbmcgcHJpbWl0aXZlIGZvciBhbGwgb2YgdGhlCiAgICAgICAgIGZ1bmN0aW9ucyB0aGF0IHJlYWQgZnJvbSBzdHJlYW1zLCBzdWNoIGFzIDxDT0RFPmZnZXRjPC9DT0RFPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIdW5pc3RkLmh4cQB+FrV0ACZpbnQgZmlsZWRlcywgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZXQAB3NzaXplX3R0AAdyZWFkZGlyc3EAfgAKdAQuCiAgICAgICAgVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgbmV4dCBlbnRyeSBmcm9tIHRoZSBkaXJlY3RvcnkuICBJdCBub3JtYWxseQogICAgICAgICByZXR1cm5zIGEgcG9pbnRlciB0byBhIHN0cnVjdHVyZSBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmaWxlLgogICAgICAgICBUaGlzIHN0cnVjdHVyZSBpcyBzdGF0aWNhbGx5IGFsbG9jYXRlZCBhbmQgY2FuIGJlIHJld3JpdHRlbiBieSBhCiAgICAgICAgIHN1YnNlcXVlbnQgY2FsbC4KICAgICAgICAgPGJyPjxicj4gUG9ydGFiaWxpdHkgTm90ZTogT24gc29tZSBzeXN0ZW1zIDxDT0RFPnJlYWRkaXI8L0NPREU+IG1heSBub3QKICAgICAgICAgcmV0dXJuIGVudHJpZXMgZm9yIDxUVD4uPC9UVD4gYW5kIDxUVD4uLjwvVFQ+LCBldmVuIHRob3VnaCB0aGVzZSBhcmUgYWx3YXlzCiAgICAgICAgIHZhbGlkIGZpbGUgbmFtZXMgaW4gYW55IGRpcmVjdG9yeS4gIC4KICAgICAgICAgPGJyPjxicj4gSWYgdGhlcmUgYXJlIG5vIG1vcmUgZW50cmllcyBpbiB0aGUgZGlyZWN0b3J5IG9yIGFuIGVycm9yIGlzIGRldGVjdGVkLAogICAgICAgICA8Q09ERT5yZWFkZGlyPC9DT0RFPiByZXR1cm5zIGEgbnVsbCBwb2ludGVyLiAgVGhlIGZvbGxvd2luZyA8Q09ERT5lcnJubzwvQ09ERT4gZXJyb3IKICAgICAgICAgY29uZGl0aW9ucyBhcmUgZGVmaW5lZCBmb3IgdGhpcyBmdW5jdGlvbjoKICAgICAgICAgPGJyPjxicj4gPERMPgoKICAgICAgICAgPERUPjxDT0RFPkVCQURGPC9DT0RFPgo8REQ+CiAgICAgICAgIFRoZSA8VkFSPmRpcnN0cmVhbTwvVkFSPiBhcmd1bWVudCBpcyBub3QgdmFsaWQuCgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5yZWFkZGlyPC9DT0RFPiBpcyBub3QgdGhyZWFkIHNhZmUuICBNdWx0aXBsZSB0aHJlYWRzIHVzaW5nCiAgICAgICAgIDxDT0RFPnJlYWRkaXI8L0NPREU+IG9uIHRoZSBzYW1lIDxWQVI+ZGlyc3RyZWFtPC9WQVI+IG1heSBvdmVyd3JpdGUgdGhlIHJldHVybgogICAgICAgICB2YWx1ZS4gIFVzZSA8Q09ERT5yZWFkZGlyX3I8L0NPREU+IHdoZW4gdGhpcyBpcyBjcml0aWNhbC4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIZGlyZW50Lmh4cQB+Frx0AA5ESVIgKmRpcnN0cmVhbXQAD3N0cnVjdCBkaXJlbnQgKnQACXJlYWRkaXI2NHNxAH4ACnQBqgogICAgICAgIFRoZSA8Q09ERT5yZWFkZGlyNjQ8L0NPREU+IGZ1bmN0aW9uIGlzIGp1c3QgbGlrZSB0aGUgPENPREU+cmVhZGRpcjwvQ09ERT4gZnVuY3Rpb24KICAgICAgICAgZXhjZXB0IHRoYXQgaXQgcmV0dXJucyBhIHBvaW50ZXIgdG8gYSByZWNvcmQgb2YgdHlwZSA8Q09ERT5zdHJ1Y3QKICAgICAgICAgZGlyZW50NjQ8L0NPREU+LiAgU29tZSBvZiB0aGUgbWVtYmVycyBvZiB0aGlzIGRhdGEgdHlwZSAobm90YWJseSA8Q09ERT5kX2lubzwvQ09ERT4pCiAgICAgICAgIG1pZ2h0IGhhdmUgYSBkaWZmZXJlbnQgc2l6ZSB0byBhbGxvdyBsYXJnZSBmaWxlc3lzdGVtcy4KICAgICAgICAgPGJyPjxicj4gSW4gYWxsIG90aGVyIGFzcGVjdHMgdGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIDxDT0RFPnJlYWRkaXI8L0NPREU+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAhkaXJlbnQuaHhxAH4Ww3QADkRJUiAqZGlyc3RyZWFtdAARc3RydWN0IGRpcmVudDY0ICp0AAtyZWFkZGlyNjRfcnNxAH4ACnQBggogICAgICAgIFRoZSA8Q09ERT5yZWFkZGlyNjRfcjwvQ09ERT4gZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byB0aGUgPENPREU+cmVhZGRpcl9yPC9DT0RFPgogICAgICAgICBmdW5jdGlvbiBleGNlcHQgdGhhdCBpdCB0YWtlcyBwYXJhbWV0ZXJzIG9mIGJhc2UgdHlwZSA8Q09ERT5zdHJ1Y3QKICAgICAgICAgZGlyZW50NjQ8L0NPREU+IGluc3RlYWQgb2YgPENPREU+c3RydWN0IGRpcmVudDwvQ09ERT4gaW4gdGhlIHNlY29uZCBhbmQgdGhpcmQKICAgICAgICAgcG9zaXRpb24uICBUaGUgc2FtZSBwcmVjYXV0aW9ucyBtZW50aW9uZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YKICAgICAgICAgPENPREU+cmVhZGRpcl9yPC9DT0RFPiBhbHNvIGFwcGx5IGhlcmUuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACGRpcmVudC5oeHEAfhbKdABARElSICpkaXJzdHJlYW0sIHN0cnVjdCBkaXJlbnQ2NCAqZW50cnksIHN0cnVjdCBkaXJlbnQ2NCAqKnJlc3VsdHQAA2ludHQACXJlYWRkaXJfcnNxAH4ACnQJGgogICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdGhlIHJlZW50cmFudCB2ZXJzaW9uIG9mIDxDT0RFPnJlYWRkaXI8L0NPREU+LiAgTGlrZQogICAgICAgICA8Q09ERT5yZWFkZGlyPC9DT0RFPiBpdCByZXR1cm5zIHRoZSBuZXh0IGVudHJ5IGZyb20gdGhlIGRpcmVjdG9yeS4gIEJ1dCB0bwogICAgICAgICBwcmV2ZW50IGNvbmZsaWN0cyBiZXR3ZWVuIHNpbXVsdGFuZW91c2x5IHJ1bm5pbmcgdGhyZWFkcyB0aGUgcmVzdWx0IGlzCiAgICAgICAgIG5vdCBzdG9yZWQgaW4gc3RhdGljYWxseSBhbGxvY2F0ZWQgbWVtb3J5LiAgSW5zdGVhZCB0aGUgYXJndW1lbnQKICAgICAgICAgPFZBUj5lbnRyeTwvVkFSPiBwb2ludHMgdG8gYSBwbGFjZSB0byBzdG9yZSB0aGUgcmVzdWx0LgogICAgICAgICA8YnI+PGJyPiBOb3JtYWxseSA8Q09ERT5yZWFkZGlyX3I8L0NPREU+IHJldHVybnMgemVybyBhbmQgc2V0cyA8Q09ERT4qPFZBUj5yZXN1bHQ8L1ZBUj48L0NPREU+CiAgICAgICAgIHRvIDxWQVI+ZW50cnk8L1ZBUj4uICBJZiB0aGVyZSBhcmUgbm8gbW9yZSBlbnRyaWVzIGluIHRoZSBkaXJlY3Rvcnkgb3IgYW4KICAgICAgICAgZXJyb3IgaXMgZGV0ZWN0ZWQsIDxDT0RFPnJlYWRkaXJfcjwvQ09ERT4gc2V0cyA8Q09ERT4qPFZBUj5yZXN1bHQ8L1ZBUj48L0NPREU+IHRvIGEKICAgICAgICAgbnVsbCBwb2ludGVyIGFuZCByZXR1cm5zIGEgbm9uemVybyBlcnJvciBjb2RlLCBhbHNvIHN0b3JlZCBpbgogICAgICAgICA8Q09ERT5lcnJubzwvQ09ERT4sIGFzIGRlc2NyaWJlZCBmb3IgPENPREU+cmVhZGRpcjwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IFBvcnRhYmlsaXR5IE5vdGU6IE9uIHNvbWUgc3lzdGVtcyA8Q09ERT5yZWFkZGlyX3I8L0NPREU+IG1heSBub3QKICAgICAgICAgcmV0dXJuIGEgTlVMIHRlcm1pbmF0ZWQgc3RyaW5nIGZvciB0aGUgZmlsZSBuYW1lLCBldmVuIHdoZW4gdGhlcmUgaXMgbm8KICAgICAgICAgPENPREU+ZF9yZWNsZW48L0NPREU+IGZpZWxkIGluIDxDT0RFPnN0cnVjdCBkaXJlbnQ8L0NPREU+IGFuZCB0aGUgZmlsZQogICAgICAgICBuYW1lIGlzIHRoZSBtYXhpbXVtIGFsbG93ZWQgc2l6ZS4gIE1vZGVybiBzeXN0ZW1zIGFsbCBoYXZlIHRoZQogICAgICAgICA8Q09ERT5kX3JlY2xlbjwvQ09ERT4gZmllbGQsIGFuZCBvbiBvbGQgc3lzdGVtcyBtdWx0aS10aHJlYWRpbmcgaXMgbm90CiAgICAgICAgIGNyaXRpY2FsLiAgSW4gYW55IGNhc2UgdGhlcmUgaXMgbm8gc3VjaCBwcm9ibGVtIHdpdGggdGhlIDxDT0RFPnJlYWRkaXI8L0NPREU+CiAgICAgICAgIGZ1bmN0aW9uLCBzbyB0aGF0IGV2ZW4gb24gc3lzdGVtcyB3aXRob3V0IHRoZSA8Q09ERT5kX3JlY2xlbjwvQ09ERT4gbWVtYmVyIG9uZQogICAgICAgICBjb3VsZCB1c2UgbXVsdGlwbGUgdGhyZWFkcyBieSB1c2luZyBleHRlcm5hbCBsb2NraW5nLgogICAgICAgICA8YnI+PGJyPiBJdCBpcyBhbHNvIGltcG9ydGFudCB0byBsb29rIGF0IHRoZSBkZWZpbml0aW9uIG9mIHRoZSA8Q09ERT5zdHJ1Y3QKICAgICAgICAgZGlyZW50PC9DT0RFPiB0eXBlLiAgU2ltcGx5IHBhc3NpbmcgYSBwb2ludGVyIHRvIGFuIG9iamVjdCBvZiB0aGlzIHR5cGUgZm9yCiAgICAgICAgIHRoZSBzZWNvbmQgcGFyYW1ldGVyIG9mIDxDT0RFPnJlYWRkaXJfcjwvQ09ERT4gbWlnaHQgbm90IGJlIGVub3VnaC4gIFNvbWUKICAgICAgICAgc3lzdGVtcyBkb24ndCBkZWZpbmUgdGhlIDxDT0RFPmRfbmFtZTwvQ09ERT4gZWxlbWVudCBzdWZmaWNpZW50bHkgbG9uZy4gIEluCiAgICAgICAgIHRoaXMgY2FzZSB0aGUgdXNlciBoYXMgdG8gcHJvdmlkZSBhZGRpdGlvbmFsIHNwYWNlLiAgVGhlcmUgbXVzdCBiZSByb29tCiAgICAgICAgIGZvciBhdCBsZWFzdCA8Q09ERT5OQU1FX01BWCArIDE8L0NPREU+IGNoYXJhY3RlcnMgaW4gdGhlIDxDT0RFPmRfbmFtZTwvQ09ERT4gYXJyYXkuCiAgICAgICAgIENvZGUgdG8gY2FsbCA8Q09ERT5yZWFkZGlyX3I8L0NPREU+IGNvdWxkIGxvb2sgbGlrZSB0aGlzOgogICAgICAgICA8YnI+PGJyPiA8cHJlPjxicj4KICAgICAgICAgICB1bmlvbjxicj4KICAgICAgICAgICB7PGJyPgogICAgICAgICAgICAgc3RydWN0IGRpcmVudCBkOzxicj4KICAgICAgICAgICAgIGNoYXIgYltvZmZzZXRvZiAoc3RydWN0IGRpcmVudCwgZF9uYW1lKSArIE5BTUVfTUFYICsgMV07PGJyPgogICAgICAgICAgIH0gdTs8YnI+CiAgICAgICAgIDxicj48YnI+ICAgaWYgKHJlYWRkaXJfciAoZGlyLCAmdS5kLCAmcmVzKSA9PSAwKTxicj4KICAgICAgICAgICAgIDxzbWFsbD4uLi48L3NtYWxsPjxicj4KICAgICAgICAgPC9wcmU+CiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACGRpcmVudC5oeHEAfhbRdAA8RElSICpkaXJzdHJlYW0sIHN0cnVjdCBkaXJlbnQgKmVudHJ5LCBzdHJ1Y3QgZGlyZW50ICoqcmVzdWx0dAADaW50dAAIcmVhZGxpbmtzcQB+AAp0BygKICAgICAgICBUaGUgPENPREU+cmVhZGxpbms8L0NPREU+IGZ1bmN0aW9uIGdldHMgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2xpYyBsaW5rCiAgICAgICAgIDxWQVI+ZmlsZW5hbWU8L1ZBUj4uICBUaGUgZmlsZSBuYW1lIHRoYXQgdGhlIGxpbmsgcG9pbnRzIHRvIGlzIGNvcGllZCBpbnRvCiAgICAgICAgIDxWQVI+YnVmZmVyPC9WQVI+LiAgVGhpcyBmaWxlIG5hbWUgc3RyaW5nIGlzIDxFTT5ub3Q8L0VNPiBudWxsLXRlcm1pbmF0ZWQ7CiAgICAgICAgIDxDT0RFPnJlYWRsaW5rPC9DT0RFPiBub3JtYWxseSByZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBjb3BpZWQuICBUaGUKICAgICAgICAgPFZBUj5zaXplPC9WQVI+IGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBjb3B5LAogICAgICAgICB1c3VhbGx5IHRoZSBhbGxvY2F0aW9uIHNpemUgb2YgPFZBUj5idWZmZXI8L1ZBUj4uCiAgICAgICAgIDxicj48YnI+IElmIHRoZSByZXR1cm4gdmFsdWUgZXF1YWxzIDxWQVI+c2l6ZTwvVkFSPiwgeW91IGNhbm5vdCB0ZWxsIHdoZXRoZXIgb3Igbm90CiAgICAgICAgIHRoZXJlIHdhcyByb29tIHRvIHJldHVybiB0aGUgZW50aXJlIG5hbWUuICBTbyBtYWtlIGEgYmlnZ2VyIGJ1ZmZlciBhbmQKICAgICAgICAgY2FsbCA8Q09ERT5yZWFkbGluazwvQ09ERT4gYWdhaW4uICBIZXJlIGlzIGFuIGV4YW1wbGU6CiAgICAgICAgIDxicj48YnI+IDxwcmU+PGJyPgogICAgICAgICBjaGFyICo8YnI+CiAgICAgICAgIHJlYWRsaW5rX21hbGxvYyAoY29uc3QgY2hhciAqZmlsZW5hbWUpPGJyPgogICAgICAgICB7PGJyPgogICAgICAgICAgIGludCBzaXplID0gMTAwOzxicj4KICAgICAgICAgICBjaGFyICpidWZmZXIgPSBOVUxMOzxicj4KICAgICAgICAgPGJyPjxicj4gICB3aGlsZSAoMSk8YnI+CiAgICAgICAgICAgICB7PGJyPgogICAgICAgICAgICAgICBidWZmZXIgPSAoY2hhciAqKSB4cmVhbGxvYyAoYnVmZmVyLCBzaXplKTs8YnI+CiAgICAgICAgICAgICAgIGludCBuY2hhcnMgPSByZWFkbGluayAoZmlsZW5hbWUsIGJ1ZmZlciwgc2l6ZSk7PGJyPgogICAgICAgICAgICAgICBpZiAobmNoYXJzIDwgMCk8YnI+CiAgICAgICAgICAgICAgICAgezxicj4KICAgICAgICAgICAgICAgICAgIGZyZWUgKGJ1ZmZlcik7PGJyPgogICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7PGJyPgogICAgICAgICAgICAgICAgIH08YnI+CiAgICAgICAgICAgICAgIGlmIChuY2hhcnMgPCBzaXplKTxicj4KICAgICAgICAgICAgICAgICByZXR1cm4gYnVmZmVyOzxicj4KICAgICAgICAgICAgICAgc2l6ZSAqPSAyOzxicj4KICAgICAgICAgICAgIH08YnI+CiAgICAgICAgIH08YnI+CiAgICAgICAgIDwvcHJlPgogICAgICAgICA8YnI+PGJyPiBBIHZhbHVlIG9mIDxDT0RFPi0xPC9DT0RFPiBpcyByZXR1cm5lZCBpbiBjYXNlIG9mIGVycm9yLiAgSW4gYWRkaXRpb24gdG8gdGhlCiAgICAgICAgIHVzdWFsIGZpbGUgbmFtZSBlcnJvcnMgLCB0aGUgZm9sbG93aW5nCiAgICAgICAgIDxDT0RFPmVy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YmVoYXZlcyBqdXN0CiAgICAgICAgIGxpa2UgPHNhbXA+bWFsbG9jICg8VkFSPm5ld3NpemU8L1ZBUj4pPC9zYW1wPi4gIFRoaXMgY2FuIGJlIGNvbnZlbmllbnQsIGJ1dCBiZXdhcmUKICAgICAgICAgdGhhdCBvbGRlciBpbXBsZW1lbnRhdGlvbnMgKGJlZm9yZSBJU08gQykgbWF5IG5vdCBzdXBwb3J0IHRoaXMKICAgICAgICAgYmVoYXZpb3IsIGFuZCB3aWxsIHByb2JhYmx5IGNyYXNoIHdoZW4gPENPREU+cmVhbGxvYzwvQ09ERT4gaXMgcGFzc2VkIGEgbnVsbAogICAgICAgICBwb2ludGVyLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAhzdGRsaWIuaHhxAH4W5nQAGXZvaWQgKnB0ciwgc2l6ZV90IG5ld3NpemV0AAZ2b2lkICp0AAhyZWFscGF0aHNxAH4ACnQEyQogICAgICAgIDxicj48YnI+IEEgY2FsbCB0byA8Q09ERT5yZWFscGF0aDwvQ09ERT4gd2hlcmUgdGhlIDxWQVI+cmVzb2x2ZWQ8L1ZBUj4gcGFyYW1ldGVyIGlzCiAgICAgICAgIDxDT0RFPk5VTEw8L0NPREU+IGJlaGF2ZXMgZXhhY3RseSBsaWtlIDxDT0RFPmNhbm9uaWNhbGl6ZV9maWxlX25hbWU8L0NPREU+LiAgVGhlCiAgICAgICAgIGZ1bmN0aW9uIGFsbG9jYXRlcyBhIGJ1ZmZlciBmb3IgdGhlIGZpbGUgbmFtZSBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8KICAgICAgICAgaXQuICBJZiA8VkFSPnJlc29sdmVkPC9WQVI+IGlzIG5vdCA8Q09ERT5OVUxMPC9DT0RFPiBpdCBwb2ludHMgdG8gYSBidWZmZXIgaW50bwogICAgICAgICB3aGljaCB0aGUgcmVzdWx0IGlzIGNvcGllZC4gIEl0IGlzIHRoZSBjYWxsZXJzIHJlc3BvbnNpYmlsaXR5IHRvCiAgICAgICAgIGFsbG9jYXRlIGEgYnVmZmVyIHdoaWNoIGlzIGxhcmdlIGVub3VnaC4gIE9uIHN5c3RlbXMgd2hpY2ggZGVmaW5lCiAgICAgICAgIDxDT0RFPlBBVEhfTUFYPC9DT0RFPiB0aGlzIG1lYW5zIHRoZSBidWZmZXIgbXVzdCBiZSBsYXJnZSBlbm91Z2ggZm9yIGEKICAgICAgICAgcGF0aG5hbWUgb2YgdGhpcyBzaXplLiAgRm9yIHN5c3RlbXMgd2l0aG91dCBsaW1pdGF0aW9ucyBvbiB0aGUgcGF0aG5hbWUKICAgICAgICAgbGVuZ3RoIHRoZSByZXF1aXJlbWVudCBjYW5ub3QgYmUgbWV0IGFuZCBwcm9ncmFtcyBzaG91bGQgbm90IGNhbGwKICAgICAgICAgPENPREU+cmVhbHBhdGg8L0NPREU+IHdpdGggYW55dGhpbmcgYnV0IDxDT0RFPk5VTEw8L0NPREU+IGZvciB0aGUgc2Vjb25kIHBhcmFtZXRlci4KICAgICAgICAgPGJyPjxicj4gT25lIG90aGVyIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUgYnVmZmVyIDxWQVI+cmVzb2x2ZWQ8L1ZBUj4gKGlmIG5vbnplcm8pIHdpbGwKICAgICAgICAgY29udGFpbiB0aGUgcGFydCBvZiB0aGUgcGF0aCBjb21wb25lbnQgd2hpY2ggZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90CiAgICAgICAgIHJlYWRhYmxlIGlmIHRoZSBmdW5jdGlvbiByZXR1cm5zIDxDT0RFPk5VTEw8L0NPREU+IGFuZCA8Q09ERT5lcnJubzwvQ09ERT4gaXMgc2V0IHRvCiAgICAgICAgIDxDT0RFPkVBQ0NFUzwvQ09ERT4gb3IgPENPREU+RU5PRU5UPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiBpcyBkZWNsYXJlZCBpbiA8VFQ+c3RkbGliLmg8L1RUPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc3RkbGliLmh4cQB+Fu10ADJjb25zdCBjaGFyICpyZXN0cmljdCBuYW1lLCBjaGFyICpyZXN0cmljdCByZXNvbHZlZHQABmNoYXIgKnQABHJlY3ZzcQB+AAp0BhkKICAgICAgICBUaGUgPENPREU+cmVjdjwvQ09ERT4gZnVuY3Rpb24gaXMgbGlrZSA8Q09ERT5yZWFkPC9DT0RFPiwgYnV0IHdpdGggdGhlIGFkZGl0aW9uYWwKICAgICAgICAgZmxhZ3MgPFZBUj5mbGFnczwvVkFSPi4gIFRoZSBwb3NzaWJsZSB2YWx1ZXMgb2YgPFZBUj5mbGFnczwvVkFSPiBhcmUgZGVzY3JpYmVkCiAgICAgICAgIGluIFNvY2tldCBEYXRhIE9wdGlvbnMuCiAgICAgICAgIDxicj48YnI+IElmIG5vbmJsb2NraW5nIG1vZGUgaXMgc2V0IGZvciA8VkFSPnNvY2tldDwvVkFSPiwgYW5kIG5vIGRhdGEgYXJlIGF2YWlsYWJsZSB0bwogICAgICAgICBiZSByZWFkLCA8Q09ERT5yZWN2PC9DT0RFPiBmYWlscyBpbW1lZGlhdGVseSByYXRoZXIgdGhhbiB3YWl0aW5nLiAgLCBmb3IgaW5mb3JtYXRpb24gYWJvdXQgbm9uYmxvY2tpbmcgbW9kZS4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQsIG9yIDxDT0RFPi0xPC9DT0RFPiBvbiBmYWlsdXJlLgogICAgICAgICBUaGUgZm9sbG93aW5nIDxDT0RFPmVycm5vPC9DT0RFPiBlcnJvciBjb25kaXRpb25zIGFyZSBkZWZpbmVkIGZvciB0aGlzIGZ1bmN0aW9uOgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8RFQ+PENPREU+RUJBREY8L0NPREU+CjxERD4KICAgICAgICAgVGhlIDxWQVI+c29ja2V0PC9WQVI+IGFyZ3VtZW50IGlzIG5vdCBhIHZhbGlkIGZpbGUgZGVzY3JpcHRvci4KICAgICAgICAgPGJyPjxicj4gPExJPiBFTk9UU09DSwogICAgICAgICBUaGUgZGVzY3JpcHRvciA8VkFSPnNvY2tldDwvVkFSPiBpcyBub3QgYSBzb2NrZXQuCiAgICAgICAgIDxicj48YnI+IDxMST4gRVdPVUxEQkxPQ0sKICAgICAgICAgTm9uYmxvY2tpbmcgbW9kZSBoYXMgYmVlbiBzZXQgb24gdGhlIHNvY2tldCwgYW5kIHRoZSByZWFkIG9wZXJhdGlvbgogICAgICAgICB3b3VsZCBibG9jay4gIChOb3JtYWxseSwgPENPREU+cmVjdjwvQ09ERT4gYmxvY2tzIHVudGlsIHRoZXJlIGlzIGlucHV0CiAgICAgICAgIGF2YWlsYWJsZSB0byBiZSByZWFkLikKICAgICAgICAgPGJyPjxicj4gPExJPiBFSU5UUgogICAgICAgICBUaGUgb3BlcmF0aW9uIHdhcyBpbnRlcnJ1cHRlZCBieSBhIHNpZ25hbCBiZWZvcmUgYW55IGRhdGEgd2FzIHJlYWQuCiAgICAgICAgIC4KICAgICAgICAgPGJyPjxicj4gPExJPiBFTk9UQ09OTgogICAgICAgICBZb3UgbmV2ZXIgY29ubmVjdGVkIHRoaXMgc29ja2V0LgoKICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiBpcyBkZWZpbmVkIGFzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGluIG11bHRpLXRocmVhZGVkCiAgICAgICAgIHByb2dyYW1zLCBzbyBvbmUgaGFzIHRvIGJlIHByZXBhcmVkIGZvciB0aGlzIGFuZCBtYWtlIHN1cmUgdGhhdAogICAgICAgICBhbGxvY2F0ZWQgcmVzb3VyY2VzIChsaWtlIG1lbW9yeSwgZmlsZXMgZGVzY3JpcHRvcnMsIHNlbWFwaG9yZXMgb3IKICAgICAgICAgd2hhdGV2ZXIpIGFyZSBmcmVlZCBldmVuIGlmIHRoZSB0aHJlYWQgaXMgY2FuY2VsZWQuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQADHN5cy9zb2NrZXQuaHhxAH4W9HQAMGludCBzb2NrZXQsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUsIGludCBmbGFnc3QAA2ludHQACHJlY3Zmcm9tc3EAfgAKdAW7CiAgICAgICAgVGhlIDxDT0RFPnJlY3Zmcm9tPC9DT0RFPiBmdW5jdGlvbiByZWFkcyBvbmUgcGFja2V0IGZyb20gdGhlIHNvY2tldAogICAgICAgICA8VkFSPnNvY2tldDwvVkFSPiBpbnRvIHRoZSBidWZmZXIgPFZBUj5idWZmZXI8L1ZBUj4uICBUaGUgPFZBUj5zaXplPC9WQVI+IGFyZ3VtZW50CiAgICAgICAgIHNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcmVhZC4KICAgICAgICAgPGJyPjxicj4gSWYgdGhlIHBhY2tldCBpcyBsb25nZXIgdGhhbiA8VkFSPnNpemU8L1ZBUj4gYnl0ZXMsIHRoZW4geW91IGdldCB0aGUgZmlyc3QKICAgICAgICAgPFZBUj5zaXplPC9WQVI+IGJ5dGVzIG9mIHRoZSBwYWNrZXQgYW5kIHRoZSByZXN0IG9mIHRoZSBwYWNrZXQgaXMgbG9zdC4KICAgICAgICAgVGhlcmUncyBubyB3YXkgdG8gcmVhZCB0aGUgcmVzdCBvZiB0aGUgcGFja2V0LiAgVGh1cywgd2hlbiB5b3UgdXNlIGEKICAgICAgICAgcGFja2V0IHByb3RvY29sLCB5b3UgbXVzdCBhbHdheXMga25vdyBob3cgbG9uZyBhIHBhY2tldCB0byBleHBlY3QuCiAgICAgICAgIDxicj48YnI+IFRoZSA8VkFSPmFkZHI8L1ZBUj4gYW5kIDxWQVI+bGVuZ3RoLXB0cjwvVkFSPiBhcmd1bWVudHMgYXJlIHVzZWQgdG8gcmV0dXJuIHRoZQogICAgICAgICBhZGRyZXNzIHdoZXJlIHRoZSBwYWNrZXQgY2FtZSBmcm9tLiAgLiAgRm9yIGEKICAgICAgICAgc29ja2V0IGluIHRoZSBsb2NhbCBkb21haW4gdGhlIGFkZHJlc3MgaW5mb3JtYXRpb24gd29uJ3QgYmUgbWVhbmluZ2Z1bCwKICAgICAgICAgc2luY2UgeW91IGNhbid0IHJlYWQgdGhlIGFkZHJlc3Mgb2Ygc3VjaCBhIHNvY2tldC4gWW91IGNhbiBzcGVjaWZ5IGEgbnVsbCBwb2ludGVyIGFzIHRoZSA8VkFSPmFkZHI8L1ZBUj4gYXJndW1lbnQKICAgICAgICAgaWYgeW91IGFyZSBub3QgaW50ZXJlc3RlZCBpbiB0aGlzIGluZm9ybWF0aW9uLgogICAgICAgICA8YnI+PGJyPiBUaGUgPFZBUj5mbGFnczwvVkFSPiBhcmUgaW50ZXJwcmV0ZWQgdGhlIHNhbWUgd2F5IGFzIGZvciA8Q09ERT5yZWN2PC9DT0RFPgogICAgICAgICAuICBUaGUgcmV0dXJuIHZhbHVlIGFuZCBlcnJvciBjb25kaXRpb25zCiAgICAgICAgIGFyZSBhbHNvIHRoZSBzYW1lIGFzIGZvciA8Q09ERT5yZWN2PC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiBpcyBkZWZpbmVkIGFzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGluIG11bHRpLXRocmVhZGVkCiAgICAgICAgIHByb2dyYW1zLCBzbyBvbmUgaGFzIHRvIGJlIHByZXBhcmVkIGZvciB0aGlzIGFuZCBtYWtlIHN1cmUgdGhhdAogICAgICAgICBhbGxvY2F0ZWQgcmVzb3VyY2VzIChsaWtlIG1lbW9yeSwgZmlsZXMgZGVzY3JpcHRvcnMsIHNlbWFwaG9yZXMgb3IKICAgICAgICAgd2hhdGV2ZXIpIGFyZSBmcmVlZCBldmVuIGlmIHRoZSB0aHJlYWQgaXMgY2FuY2VsZWQuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQADHN5cy9zb2NrZXQuaHhxAH4W+3QAXmludCBzb2NrZXQsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUsIGludCBmbGFncywgc3RydWN0IHNvY2thZGRyICphZGRyLCBzb2NrbGVuX3QgKmxlbmd0aC1wdHJ0AANpbnR0AAdyZWN2bXNnc3EAfgAKdAEvCiAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiBpcyBkZWZpbmVkIGFzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGluIG11bHRpLXRocmVhZGVkCiAgICAgICAgIHByb2dyYW1zLCBzbyBvbmUgaGFzIHRvIGJlIHByZXBhcmVkIGZvciB0aGlzIGFuZCBtYWtlIHN1cmUgdGhhdAogICAgICAgICBhbGxvY2F0ZWQgcmVzb3VyY2VzIChsaWtlIG1lbW9yeSwgZmlsZXMgZGVzY3JpcHRvcnMsIHNlbWFwaG9yZXMgb3IKICAgICAgICAgd2hhdGV2ZXIpIGFyZSBmcmVlZCBldmVuIGlmIHRoZSB0aHJlYWQgaXMgY2FuY2VsZWQuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQADHN5cy9zb2NrZXQuaHhxAH4XAnQALWludCBzb2NrZXQsIHN0cnVjdCBtc2doZHIgKm1lc3NhZ2UsIGludCBmbGFnc3QAA2ludHQAB3JlZ2NvbXBzcQB+AAp0B0MKICAgICAgICBUaGUgZnVuY3Rpb24gPENPREU+cmVnY29tcDwvQ09ERT4gYGBjb21waWxlcycnIGEgcmVndWxhciBleHByZXNzaW9uIGludG8gYQogICAgICAgICBkYXRhIHN0cnVjdHVyZSB0aGF0IHlvdSBjYW4gdXNlIHdpdGggPENPREU+cmVnZXhlYzwvQ09ERT4gdG8gbWF0Y2ggYWdhaW5zdCBhCiAgICAgICAgIHN0cmluZy4gIFRoZSBjb21waWxlZCByZWd1bGFyIGV4cHJlc3Npb24gZm9ybWF0IGlzIGRlc2lnbmVkIGZvcgogICAgICAgICBlZmZpY2llbnQgbWF0Y2hpbmcuICA8Q09ERT5yZWdjb21wPC9DT0RFPiBzdG9yZXMgaXQgaW50byA8Q09ERT4qPFZBUj5jb21waWxlZDwvVkFSPjwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IEl0J3MgdXAgdG8geW91IHRvIGFsbG9jYXRlIGFuIG9iamVjdCBvZiB0eXBlIDxDT0RFPnJlZ2V4X3Q8L0NPREU+IGFuZCBwYXNzIGl0cwogICAgICAgICBhZGRyZXNzIHRvIDxDT0RFPnJlZ2NvbXA8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBUaGUgYXJndW1lbnQgPFZBUj5jZmxhZ3M8L1ZBUj4gbGV0cyB5b3Ugc3BlY2lmeSB2YXJpb3VzIG9wdGlvbnMgdGhhdCBjb250cm9sCiAgICAgICAgIHRoZSBzeW50YXggYW5kIHNlbWFudGljcyBvZiByZWd1bGFyIGV4cHJlc3Npb25zLiAgLgogICAgICAgICA8YnI+PGJyPiBJZiB5b3UgdXNlIHRoZSBmbGFnIDxDT0RFPlJFR19OT1NVQjwvQ09ERT4sIHRoZW4gPENPREU+cmVnY29tcDwvQ09ERT4gb21pdHMgZnJvbQogICAgICAgICB0aGUgY29tcGlsZWQgcmVndWxhciBleHByZXNzaW9uIHRoZSBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgdG8gcmVjb3JkCiAgICAgICAgIGhvdyBzdWJleHByZXNzaW9ucyBhY3R1YWxseSBtYXRjaC4gIEluIHRoaXMgY2FzZSwgeW91IG1pZ2h0IGFzIHdlbGwKICAgICAgICAgcGFzcyA8Q09ERT4wPC9DT0RFPiBmb3IgdGhlIDxWQVI+bWF0Y2hwdHI8L1ZBUj4gYW5kIDxWQVI+bm1hdGNoPC9WQVI+IGFyZ3VtZW50cyB3aGVuCiAgICAgICAgIHlvdSBjYWxsIDxDT0RFPnJlZ2V4ZWM8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBJZiB5b3UgZG9uJ3QgdXNlIDxDT0RFPlJFR19OT1NVQjwvQ09ERT4sIHRoZW4gdGhlIGNvbXBpbGVkIHJlZ3VsYXIgZXhwcmVzc2lvbgogICAgICAgICBkb2VzIGhhdmUgdGhlIGNhcGFjaXR5IHRvIHJlY29yZCBob3cgc3ViZXhwcmVzc2lvbnMgbWF0Y2guICBBbHNvLAogICAgICAgICA8Q09ERT5yZWdjb21wPC9DT0RFPiB0ZWxscyB5b3UgaG93IG1hbnkgc3ViZXhwcmVzc2lvbnMgPFZBUj5wYXR0ZXJuPC9WQVI+IGhhcywgYnkKICAgICAgICAgc3RvcmluZyB0aGUgbnVtYmVyIGluIDxDT0RFPjxWQVI+Y29tcGlsZWQ8L1ZBUj4tPnJlX25zdWI8L0NPREU+LiAgWW91IGNhbiB1c2UgdGhhdAogICAgICAgICB2YWx1ZSB0byBkZWNpZGUgaG93IGxvbmcgYW4gYXJyYXkgdG8gYWxsb2NhdGUgdG8gaG9sZCBpbmZvcm1hdGlvbiBhYm91dAogICAgICAgICBzdWJleHByZXNzaW9uIG1hdGNoZXMuCiAgICAgICAgIDxicj48YnI+IDxDT0RFPnJlZ2NvbXA8L0NPREU+IHJldHVybnMgPENPREU+MDwvQ09ERT4gaWYgaXQgc3VjY2VlZHMgaW4gY29tcGlsaW5nIHRoZSByZWd1bGFyCiAgICAgICAgIGV4cHJlc3Npb247IG90aGVyd2lzZSwgaXQgcmV0dXJucyBhIG5vbnplcm8gZXJyb3IgY29kZSAoc2VlIHRoZSB0YWJsZQogICAgICAgICBiZWxvdykuICBZb3UgY2FuIHVzZSA8Q09ERT5yZWdlcnJvcjwvQ09ERT4gdG8gcHJvZHVjZSBhbiBlcnJvciBtZXNzYWdlIHN0cmluZwogICAgICAgICBkZXNjcmliaW5nIHRoZSByZWFzb24gZm9yIGEgbm9uemVybyB2YWx1ZTsgc2VlIFJlZ2V4cCBDbGVhbnVwLgogICAgICAgICA8YnI+PGJyPgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAdyZWdleC5oeHEAfhcJdABEcmVnZXhfdCAqcmVzdHJpY3QgY29tcGlsZWQsIGNvbnN0IGNoYXIgKnJlc3RyaWN0IHBhdHRlcm4sIGludCBjZmxhZ3N0AANpbnR0AAhyZWdlcnJvcnNxAH4ACnQGqAogICAgICAgIFRoaXMgZnVuY3Rpb24gcHJvZHVjZXMgYW4gZXJyb3IgbWVzc2FnZSBzdHJpbmcgZm9yIHRoZSBlcnJvciBjb2RlCiAgICAgICAgIDxWQVI+ZXJyY29kZTwvVkFSPiwgYW5kIHN0b3JlcyB0aGUgc3RyaW5nIGluIDxWQVI+bGVuZ3RoPC9WQVI+IGJ5dGVzIG9mIG1lbW9yeQogICAgICAgICBzdGFydGluZyBhdCA8VkFSPmJ1ZmZlcjwvVkFSPi4gIEZvciB0aGUgPFZBUj5jb21waWxlZDwvVkFSPiBhcmd1bWVudCwgc3VwcGx5IHRoZQogICAgICAgICBzYW1lIGNvbXBpbGVkIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdHJ1Y3R1cmUgdGhhdCA8Q09ERT5yZWdjb21wPC9DT0RFPiBvcgogICAgICAgICA8Q09ERT5yZWdleGVjPC9DT0RFPiB3YXMgd29ya2luZyB3aXRoIHdoZW4gaXQgZ290IHRoZSBlcnJvci4gIEFsdGVybmF0aXZlbHksCiAgICAgICAgIHlvdSBjYW4gc3VwcGx5IDxDT0RFPk5VTEw8L0NPREU+IGZvciA8VkFSPmNvbXBpbGVkPC9WQVI+OyB5b3Ugd2lsbCBzdGlsbCBnZXQgYQogICAgICAgICBtZWFuaW5nZnVsIGVycm9yIG1lc3NhZ2UsIGJ1dCBpdCBtaWdodCBub3QgYmUgYXMgZGV0YWlsZWQuCiAgICAgICAgIDxicj48YnI+IElmIHRoZSBlcnJvciBtZXNzYWdlIGNhbid0IGZpdCBpbiA8VkFSPmxlbmd0aDwvVkFSPiBieXRlcyAoaW5jbHVkaW5nIGEKICAgICAgICAgdGVybWluYXRpbmcgbnVsbCBjaGFyYWN0ZXIpLCB0aGVuIDxDT0RFPnJlZ2Vycm9yPC9DT0RFPiB0cnVuY2F0ZXMgaXQuCiAgICAgICAgIFRoZSBzdHJpbmcgdGhhdCA8Q09ERT5yZWdlcnJvcjwvQ09ERT4gc3RvcmVzIGlzIGFsd2F5cyBudWxsLXRlcm1pbmF0ZWQKICAgICAgICAgZXZlbiBpZiBpdCBoYXMgYmVlbiB0cnVuY2F0ZWQuCiAgICAgICAgIDxicj48YnI+IFRoZSByZXR1cm4gdmFsdWUgb2YgPENPREU+cmVnZXJyb3I8L0NPREU+IGlzIHRoZSBtaW5pbXVtIGxlbmd0aCBuZWVkZWQgdG8KICAgICAgICAgc3RvcmUgdGhlIGVudGlyZSBlcnJvciBtZXNzYWdlLiAgSWYgdGhpcyBpcyBsZXNzIHRoYW4gPFZBUj5sZW5ndGg8L1ZBUj4sIHRoZW4KICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2Ugd2FzIG5vdCB0cnVuY2F0ZWQsIGFuZCB5b3UgY2FuIHVzZSBpdC4gIE90aGVyd2lzZSwgeW91CiAgICAgICAgIHNob3VsZCBjYWxsIDxDT0RFPnJlZ2Vycm9yPC9DT0RFPiBhZ2FpbiB3aXRoIGEgbGFyZ2VyIGJ1ZmZlci4KICAgICAgICAgPGJyPjxicj4gSGVyZSBpcyBhIGZ1bmN0aW9uIHdoaWNoIHVzZXMgPENPREU+cmVnZXJyb3I8L0NPREU+LCBidXQgYWx3YXlzIGR5bmFtaWNhbGx5CiAgICAgICAgIGFsbG9jYXRlcyBhIGJ1ZmZlciBmb3IgdGhlIGVycm9yIG1lc3NhZ2U6CiAgICAgICAgIDxicj48YnI+IDxwcmU+PGJyPgogICAgICAgICBjaGFyICpnZXRfcmVnZXJyb3IgKGludCBlcnJjb2RlLCByZWdleF90ICpjb21waWxlZCk8YnI+CiAgICAgICAgIHs8YnI+CiAgICAgICAgICAgc2l6ZV90IGxlbmd0aCA9IHJlZ2Vycm9yIChlcnJjb2RlLCBjb21waWxlZCwgTlVMTCwgMCk7PGJyPgogICAgICAgICAgIGNoYXIgKmJ1ZmZlciA9IHhtYWxsb2MgKGxlbmd0aCk7PGJyPgogICAgICAgICAgICh2b2lkKSByZWdlcnJvciAoZXJyY29kZSwgY29tcGlsZWQsIGJ1ZmZlciwgbGVuZ3RoKTs8YnI+CiAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcjs8YnI+CiAgICAgICAgIH08YnI+CiAgICAgICAgIDwvcHJlPgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAdyZWdleC5oeHEAfhcQdABTaW50IGVycmNvZGUsIGNvbnN0IHJlZ2V4X3QgKnJlc3RyaWN0IGNvbXBpbGVkLCBjaGFyICpyZXN0cmljdCBidWZmZXIsIHNpemVfdCBsZW5ndGh0AAZzaXplX3R0AAdyZWdleGVjc3EAfgAKdAO8CiAgICAgICAgVGhpcyBmdW5jdGlvbiB0cmllcyB0byBtYXRjaCB0aGUgY29tcGlsZWQgcmVndWxhciBleHByZXNzaW9uCiAgICAgICAgIDxDT0RFPio8VkFSPmNvbXBpbGVkPC9WQVI+PC9DT0RFPiBhZ2FpbnN0IDxWQVI+c3RyaW5nPC9WQVI+LgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5yZWdleGVjPC9DT0RFPiByZXR1cm5zIDxDT0RFPjA8L0NPREU+IGlmIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hlczsKICAgICAgICAgb3RoZXJ3aXNlLCBpdCByZXR1cm5zIGEgbm9uemVybyB2YWx1ZS4gIFNlZSB0aGUgdGFibGUgYmVsb3cgZm9yCiAgICAgICAgIHdoYXQgbm9uemVybyB2YWx1ZXMgbWVhbi4gIFlvdSBjYW4gdXNlIDxDT0RFPnJlZ2Vycm9yPC9DT0RFPiB0byBwcm9kdWNlIGFuCiAgICAgICAgIGVycm9yIG1lc3NhZ2Ugc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHJlYXNvbiBmb3IgYSBub256ZXJvIHZhbHVlOwogICAgICAgICBzZWUgUmVnZXhwIENsZWFudXAuCiAgICAgICAgIDxicj48YnI+IFRoZSBhcmd1bWVudCA8VkFSPmVmbGFnczwvVkFSPiBpcyBhIHdvcmQgb2YgYml0IGZsYWdzIHRoYXQgZW5hYmxlIHZhcmlvdXMKICAgICAgICAgb3B0aW9ucy4KICAgICAgICAgPGJyPjxicj4gSWYgeW91IHdhbnQgdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IHdoYXQgcGFydCBvZiA8VkFSPnN0cmluZzwvVkFSPiBhY3R1YWxseQogICAgICAgICBtYXRjaGVkIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gb3IgaXRzIHN1YmV4cHJlc3Npb25zLCB1c2UgdGhlIGFyZ3VtZW50cwogICAgICAgICA8VkFSPm1hdGNocHRyPC9WQVI+IGFuZCA8VkFSPm5tYXRjaDwvVkFSPi4gIE90aGVyd2lzZSwgcGFzcyA8Q09ERT4wPC9DT0RFPiBmb3IKICAgICAgICAgPFZBUj5ubWF0Y2g8L1ZBUj4sIGFuZCA8Q09ERT5OVUxMPC9DT0RFPiBmb3IgPFZBUj5tYXRjaHB0cjwvVkFSPi4gIC4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHcmVnZXguaHhxAH4XF3QAd2NvbnN0IHJlZ2V4X3QgKnJlc3RyaWN0IGNvbXBpbGVkLCBjb25zdCBjaGFyICpyZXN0cmljdCBzdHJpbmcsIHNpemVfdCBubWF0Y2gsIHJlZ21hdGNoX3QgbWF0Y2hwdHJbcmVzdHJpY3RdLCBpbnQgZWZsYWdzdAADaW50dAAHcmVnZnJlZXNxAH4ACnQBZgogICAgICAgIENhbGxpbmcgPENPREU+cmVnZnJlZTwvQ09ERT4gZnJlZXMgYWxsIHRoZSBzdG9yYWdlIHRoYXQgPENPREU+KjxWQVI+Y29tcGlsZWQ8L1ZBUj48L0NPREU+CiAgICAgICAgIHBvaW50cyB0by4gIFRoaXMgaW5jbHVkZXMgdmFyaW91cyBpbnRlcm5hbCBmaWVsZHMgb2YgdGhlIDxDT0RFPnJlZ2V4X3Q8L0NPREU+CiAgICAgICAgIHN0cnVjdHVyZSB0aGF0IGFyZW4ndCBkb2N1bWVudGVkIGluIHRoaXMgbWFudWFsLgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5yZWdmcmVlPC9DT0RFPiBkb2VzIG5vdCBmcmVlIHRoZSBvYmplY3QgPENPREU+KjxWQVI+Y29tcGlsZWQ8L1ZBUj48L0NPREU+IGl0c2VsZi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHcmVnZXguaHhxAH4XHnQAEXJlZ2V4X3QgKmNvbXBpbGVkdAAEdm9pZHQAGHJlZ2lzdGVyX3ByaW50Zl9mdW5jdGlvbnNxAH4ACnQICgogICAgICAgIFRoaXMgZnVuY3Rpb24gZGVmaW5lcyB0aGUgY29udmVyc2lvbiBzcGVjaWZpZXIgY2hhcmFjdGVyIDxWQVI+c3BlYzwvVkFSPi4KICAgICAgICAgVGh1cywgaWYgPFZBUj5zcGVjPC9WQVI+IGlzIDxDT0RFPidZJzwvQ09ERT4sIGl0IGRlZmluZXMgdGhlIGNvbnZlcnNpb24gPHNhbXA+JVk8L3NhbXA+LgogICAgICAgICBZb3UgY2FuIHJlZGVmaW5lIHRoZSBidWlsdC1pbiBjb252ZXJzaW9ucyBsaWtlIDxzYW1wPiVzPC9zYW1wPiwgYnV0IGZsYWcKICAgICAgICAgY2hhcmFjdGVycyBsaWtlIDxzYW1wPiM8L3NhbXA+IGFuZCB0eXBlIG1vZGlmaWVycyBsaWtlIDxzYW1wPmw8L3NhbXA+IGNhbiBuZXZlciBiZQogICAgICAgICB1c2VkIGFzIGNvbnZlcnNpb25zOyBjYWxsaW5nIDxDT0RFPnJlZ2lzdGVyX3ByaW50Zl9mdW5jdGlvbjwvQ09ERT4gZm9yIHRob3NlCiAgICAgICAgIGNoYXJhY3RlcnMgaGFzIG5vIGVmZmVjdC4gIEl0IGlzIGFkdmlzYWJsZSBub3QgdG8gdXNlIGxvd2VyY2FzZSBsZXR0ZXJzLAogICAgICAgICBzaW5jZSB0aGUgSVNPIEMgc3RhbmRhcmQgd2FybnMgdGhhdCBhZGRpdGlvbmFsIGxvd2VyY2FzZSBsZXR0ZXJzIG1heSBiZQogICAgICAgICBzdGFuZGFyZGl6ZWQgaW4gZnV0dXJlIGVkaXRpb25zIG9mIHRoZSBzdGFuZGFyZC4KICAgICAgICAgPGJyPjxicj4gVGhlIDxWQVI+aGFuZGxlci1mdW5jdGlvbjwvVkFSPiBpcyB0aGUgZnVuY3Rpb24gY2FsbGVkIGJ5IDxDT0RFPnByaW50ZjwvQ09ERT4gYW5kCiAgICAgICAgIGZyaWVuZHMgd2hlbiB0aGlzIGNvbnZlcnNpb24gYXBwZWFycyBpbiBhIHRlbXBsYXRlIHN0cmluZy4KICAgICAgICAgLCBmb3IgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIGRlZmluZQogICAgICAgICBhIGZ1bmN0aW9uIHRvIHBhc3MgYXMgdGhpcyBhcmd1bWVudC4gIElmIHlvdSBzcGVjaWZ5IGEgbnVsbCBwb2ludGVyLCBhbnkKICAgICAgICAgZXhpc3RpbmcgaGFuZGxlciBmdW5jdGlvbiBmb3IgPFZBUj5zcGVjPC9WQVI+IGlzIHJlbW92ZWQuCiAgICAgICAgIDxicj48YnI+IFRoZSA8VkFSPmFyZ2luZm8tZnVuY3Rpb248L1ZBUj4gaXMgdGhlIGZ1bmN0aW9uIGNhbGxlZCBieQogICAgICAgICA8Q09ERT5wYXJzZV9wcmludGZfZm9ybWF0PC9DT0RFPiB3aGVuIHRoaXMgY29udmVyc2lvbiBhcHBlYXJzIGluIGEKICAgICAgICAgdGVtcGxhdGUgc3RyaW5nLiAgLCBmb3IgaW5mb3JtYXRpb24KICAgICAgICAgYWJvdXQgdGhpcy4KICAgICAgICAgPGJyPjxicj4KICAgICAgICAgPGJyPjxicj4gQXR0ZW50aW9uOiBJbiB0aGUgR05VIEMgbGlicmFyeSB2ZXJzaW9ucyBiZWZvcmUgMi4wIHRoZQogICAgICAgICA8VkFSPmFyZ2luZm8tZnVuY3Rpb248L1ZBUj4gZnVuY3Rpb24gZGlkIG5vdCBuZWVkIHRvIGJlIGluc3RhbGxlZCB1bmxlc3MKICAgICAgICAgdGhlIHVzZXIgdXNlZCB0aGUgPENPREU+cGFyc2VfcHJpbnRmX2Zvcm1hdDwvQ09ERT4gZnVuY3Rpb24uICBUaGlzIGhhcyBjaGFuZ2VkLgogICAgICAgICBOb3cgYSBjYWxsIHRvIGFueSBvZiB0aGUgPENPREU+cHJpbnRmPC9DT0RFPiBmdW5jdGlvbnMgd2lsbCBjYWxsIHRoaXMKICAgICAgICAgZnVuY3Rpb24gd2hlbiB0aGlzIGZvcm1hdCBzcGVjaWZpZXIgYXBwZWFycyBpbiB0aGUgZm9ybWF0IHN0cmluZy4KICAgICAgICAgPGJyPjxicj4gVGhlIHJldHVybiB2YWx1ZSBpcyA8Q09ERT4wPC9DT0RFPiBvbiBzdWNjZXNzLCBhbmQgPENPREU+LTE8L0NPREU+IG9uIGZhaWx1cmUKICAgICAgICAgKHdoaWNoIG9jY3VycyBpZiA8VkFSPnNwZWM8L1ZBUj4gaXMgb3V0IG9mIHJhbmdlKS4KICAgICAgICAgPGJyPjxicj4gWW91IGNhbiByZWRlZmluZSB0aGUgc3RhbmRhcmQgb3V0cHV0IGNvbnZlcnNpb25zLCBidXQgdGhpcyBpcyBwcm9iYWJseQogICAgICAgICBub3QgYSBnb29kIGlkZWEgYmVjYXVzZSBvZiB0aGUgcG90ZW50aWFsIGZvciBjb25mdXNpb24uICBMaWJyYXJ5IHJvdXRpbmVzCiAgICAgICAgIHdyaXR0ZW4gYnkgb3RoZXIgcGVvcGxlIGNvdWxkIGJyZWFrIGlmIHlvdSBkbyB0aGlzLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAhwcmludGYuaHhxAH4XJXQAVGludCBzcGVjLCBwcmludGZfZnVuY3Rpb24gaGFuZGxlci1mdW5jdGlvbiwgcHJpbnRmX2FyZ2luZm9fZnVuY3Rpb24gYXJnaW5mby1mdW5jdGlvbnQAA2ludHQACXJlbWFpbmRlcnNxAH4ACnQARgogICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgYW5vdGhlciBuYW1lIGZvciA8Q09ERT5kcmVtPC9DT0RFPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGbWF0aC5oeHEAfhcsdAAkZG91YmxlIG51bWVyYXRvciwgZG91YmxlIGRlbm9taW5hdG9ydAAGZG91YmxldAAKcmVtYWluZGVyZnNxAH4ACnQARgogICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgYW5vdGhlciBuYW1lIGZvciA8Q09ERT5kcmVtPC9DT0RFPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGbWF0aC5oeHEAfhczdAAiZmxvYXQgbnVtZXJhdG9yLCBmbG9hdCBkZW5vbWluYXRvcnQABWZsb2F0dAAKcmVtYWluZGVybHNxAH4ACnQARgogICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgYW5vdGhlciBuYW1lIGZvciA8Q09ERT5kcmVtPC9DT0RFPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGbWF0aC5oeHEAfhc6dAAubG9uZyBkb3VibGUgbnVtZXJhdG9yLCBsb25nIGRvdWJsZSBkZW5vbWluYXRvcnQAC2xvbmcgZG91YmxldAAGcmVtb3Zlc3EAfgAKdADfCiAgICAgICAgVGhpcyBpcyB0aGUgSVNPIEMgZnVuY3Rpb24gdG8gcmVtb3ZlIGEgZmlsZS4gIEl0IHdvcmtzIGxpa2UKICAgICAgICAgPENPREU+dW5saW5rPC9DT0RFPiBmb3IgZmlsZXMgYW5kIGxpa2UgPENPREU+cm1kaXI8L0NPREU+IGZvciBkaXJlY3Rvcmllcy4KICAgICAgICAgPENPREU+cmVtb3ZlPC9DT0RFPiBpcyBkZWNsYXJlZCBpbiA8VFQ+c3RkaW8uaDwvVFQ+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAdzdGRpby5oeHEAfhdBdAAUY29uc3QgY2hhciAqZmlsZW5hbWV0AANpbnR0AAZyZW5hbWVzcQB+AAp0EFAKICAgICAgICBUaGUgPENPREU+cmVuYW1lPC9DT0RFPiBmdW5jdGlvbiByZW5hbWVzIHRoZSBmaWxlIDxWQVI+b2xkbmFtZTwvVkFSPiB0bwogICAgICAgICA8VkFSPm5ld25hbWU8L1ZBUj4uICBUaGUgZmlsZSBmb3JtZXJseSBhY2Nlc3NpYmxlIHVuZGVyIHRoZSBuYW1lCiAgICAgICAgIDxWQVI+b2xkbmFtZTwvVkFSPiBpcyBhZnRlcndhcmRzIGFjY2Vzc2libGUgYXMgPFZBUj5uZXduYW1lPC9WQVI+IGluc3RlYWQuICAoSWYKICAgICAgICAgdGhlIGZpbGUgaGFkIGFueSBvdGhlciBuYW1lcyBhc2lkZSBmcm9tIDxWQVI+b2xkbmFtZTwvVkFSPiwgaXQgY29udGludWVzIHRvCiAgICAgICAgIGhhdmUgdGhvc2UgbmFtZXMuKQogICAgICAgICA8YnI+PGJyPiBUaGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIG5hbWUgPFZBUj5uZXduYW1lPC9WQVI+IG11c3QgYmUgb24gdGhlIHNhbWUgZmlsZQogICAgICAgICBzeXN0ZW0gYXMgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBuYW1lIDxWQVI+b2xkbmFtZTwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gT25lIHNwZWNpYWwgY2FzZSBmb3IgPENPREU+cmVuYW1lPC9DT0RFPiBpcyB3aGVuIDxWQVI+b2xkbmFtZTwvVkFSPiBhbmQKICAgICAgICAgPFZBUj5uZXduYW1lPC9WQVI+IGFyZSB0d28gbmFtZXMgZm9yIHRoZSBzYW1lIGZpbGUuICBUaGUgY29uc2lzdGVudCB3YXkgdG8KICAgICAgICAgaGFuZGxlIHRoaXMgY2FzZSBpcyB0byBkZWxldGUgPFZBUj5vbGRuYW1lPC9WQVI+LiAgSG93ZXZlciwgaW4gdGhpcyBjYXNlCiAgICAgICAgIFBPU0lYIHJlcXVpcmVzIHRoYXQgPENPREU+cmVuYW1lPC9DT0RFPiBkbyBub3RoaW5nIGFuZCByZXBvcnQgc3VjY2Vzcy0tLXdoaWNoCiAgICAgICAgIGlzIGluY29uc2lzdGVudC4gIFdlIGRvbid0IGtub3cgd2hhdCB5b3VyIG9wZXJhdGluZyBzeXN0ZW0gd2lsbCBkby4KICAgICAgICAgPGJyPjxicj4gSWYgPFZBUj5vbGRuYW1lPC9WQVI+IGlzIG5vdCBhIGRpcmVjdG9yeSwgdGhlbiBhbnkgZXhpc3RpbmcgZmlsZSBuYW1lZAogICAgICAgICA8VkFSPm5ld25hbWU8L1ZBUj4gaXMgcmVtb3ZlZCBkdXJpbmcgdGhlIHJlbmFtaW5nIG9wZXJhdGlvbi4gIEhvd2V2ZXIsIGlmCiAgICAgICAgIDxWQVI+bmV3bmFtZTwvVkFSPiBpcyB0aGUgbmFtZSBvZiBhIGRpcmVjdG9yeSwgPENPREU+cmVuYW1lPC9DT0RFPiBmYWlscyBpbiB0aGlzCiAgICAgICAgIGNhc2UuCiAgICAgICAgIDxicj48YnI+IElmIDxWQVI+b2xkbmFtZTwvVkFSPiBpcyBhIGRpcmVjdG9yeSwgdGhlbiBlaXRoZXIgPFZBUj5uZXduYW1lPC9WQVI+IG11c3Qgbm90CiAgICAgICAgIGV4aXN0IG9yIGl0IG11c3QgbmFtZSBhIGRpcmVjdG9yeSB0aGF0IGlzIGVtcHR5LiAgSW4gdGhlIGxhdHRlciBjYXNlLAogICAgICAgICB0aGUgZXhpc3RpbmcgZGlyZWN0b3J5IG5hbWVkIDxWQVI+bmV3bmFtZTwvVkFSPiBpcyBkZWxldGVkIGZpcnN0LiAgVGhlIG5hbWUKICAgICAgICAgPFZBUj5uZXduYW1lPC9WQVI+IG11c3Qgbm90IHNwZWNpZnkgYSBzdWJkaXJlY3Rvcnkgb2YgdGhlIGRpcmVjdG9yeQogICAgICAgICA8Q09ERT5vbGRuYW1lPC9DT0RFPiB3aGljaCBpcyBiZWluZyByZW5hbWVkLgogICAgICAgICA8YnI+PGJyPiBPbmUgdXNlZnVsIGZlYXR1cmUgb2YgPENPREU+cmVuYW1lPC9DT0RFPiBpcyB0aGF0IHRoZSBtZWFuaW5nIG9mIDxWQVI+bmV3bmFtZTwvVkFSPgogICAgICAgICBjaGFuZ2VzIGBgYXRvbWljYWxseScnIGZyb20gYW55IHByZXZpb3VzbHkgZXhpc3RpbmcgZmlsZSBieSB0aGF0IG5hbWUgdG8KICAgICAgICAgaXRzIG5ldyBtZWFuaW5nIChpLmUuLCB0aGUgZmlsZSB0aGF0IHdhcyBjYWxsZWQgPFZBUj5vbGRuYW1lPC9WQVI+KS4gIFRoZXJlIGlzCiAgICAgICAgIG5vIGluc3RhbnQgYXQgd2hpY2ggPFZBUj5uZXduYW1lPC9WQVI+IGlzIG5vbi1leGlzdGVudCBgYGluIGJldHdlZW4nJyB0aGUgb2xkCiAgICAgICAgIG1lYW5pbmcgYW5kIHRoZSBuZXcgbWVhbmluZy4gIElmIHRoZXJlIGlzIGEgc3lzdGVtIGNyYXNoIGR1cmluZyB0aGUKICAgICAgICAgb3BlcmF0aW9uLCBpdCBpcyBwb3NzaWJsZSBmb3IgYm90aCBuYW1lcyB0byBzdGlsbCBleGlzdDsgYnV0CiAgICAgICAgIDxWQVI+bmV3bmFtZTwvVkFSPiB3aWxsIGFsd2F5cyBiZSBpbnRhY3QgaWYgaXQgZXhpc3RzIGF0IGFsbC4KICAgICAgICAgPGJyPjxicj4gSWYgPENPREU+cmVuYW1lPC9DT0RFPiBmYWlscywgaXQgcmV0dXJucyA8Q09ERT4tMTwvQ09ERT4uICBJbiBhZGRpdGlvbiB0byB0aGUgdXN1YWwKICAgICAgICAgZmlsZSBuYW1lIGVycm9ycyAsIHRoZSBmb2xsb3dpbmcKICAgICAgICAgPENPREU+ZXJybm88L0NPREU+IGVycm9yIGNvbmRpdGlvbnMgYXJlIGRlZmluZWQgZm9yIHRoaXMgZnVuY3Rpb246CiAgICAgICAgIDxicj48YnI+IDxETD4KCiAgICAgICAgIDxEVD48Q09ERT5FQUNDRVM8L0NPREU+CjxERD4KICAgICAgICAgT25lIG9mIHRoZSBkaXJlY3RvcmllcyBjb250YWluaW5nIDxWQVI+bmV3bmFtZTwvVkFSPiBvciA8VkFSPm9sZG5hbWU8L1ZBUj4KICAgICAgICAgcmVmdXNlcyB3cml0ZSBwZXJtaXNzaW9uOyBvciA8VkFSPm5ld25hbWU8L1ZBUj4gYW5kIDxWQVI+b2xkbmFtZTwvVkFSPiBhcmUKICAgICAgICAgZGlyZWN0b3JpZXMgYW5kIHdyaXRlIHBlcm1pc3Npb24gaXMgcmVmdXNlZCBmb3Igb25lIG9mIHRoZW0uCiAgICAgICAgIDxicj48YnI+IDxMST4gRUJVU1kKICAgICAgICAgQSBkaXJlY3RvcnkgbmFtZWQgYnkgPFZBUj5vbGRuYW1lPC9WQVI+IG9yIDxWQVI+bmV3bmFtZTwvVkFSPiBpcyBiZWluZyB1c2VkIGJ5CiAgICAgICAgIHRoZSBzeXN0ZW0gaW4gYSB3YXkgdGhhdCBwcmV2ZW50cyB0aGUgcmVuYW1pbmcgZnJvbSB3b3JraW5nLiAgVGhpcyBpbmNsdWRlcwogICAgICAgICBkaXJlY3RvcmllcyB0aGF0IGFyZSBtb3VudCBwb2ludHMgZm9yIGZpbGVzeXN0ZW1zLCBhbmQgZGlyZWN0b3JpZXMKICAgICAgICAgdGhhdCBhcmUgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcmllcyBvZiBwcm9jZXNzZXMuCiAgICAgICAgIDxicj48YnI+IDxMST4gRU5PVEVNUFRZCiAgICAgICAgIDxMST54IEVFWElTVAogICAgICAgICBUaGUgZGlyZWN0b3J5IDxWQVI+bmV3bmFtZTwvVkFSPiBpc24ndCBlbXB0eS4gIFRoZSBHTlUgc3lzdGVtIGFsd2F5cyByZXR1cm5zCiAgICAgICAgIDxDT0RFPkVOT1RFTVBUWTwvQ09ERT4gZm9yIHRoaXMsIGJ1dCBzb21lIG90aGVyIHN5c3RlbXMgcmV0dXJuIDxDT0RFPkVFWElTVDwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IDxMST4gRUlOVkFMCiAgICAgICAgIDxWQVI+b2xkbmFtZTwvVkFSPiBpcyBhIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIDxWQVI+bmV3bmFtZTwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gPExJPiBFSVNESVIKICAgICAgICAgPFZBUj5uZXduYW1lPC9WQVI+IGlzIGEgZGlyZWN0b3J5IGJ1dCB0aGUgPFZBUj5vbGRuYW1lPC9WQVI+IGlzbid0LgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVNTElOSwogICAgICAgICBUaGUgcGFyZW50IGRpcmVjdG9yeSBvZiA8VkFSPm5ld25hbWU8L1ZBUj4gd291bGQgaGF2ZSB0b28gbWFueSBsaW5rcwogICAgICAgICAoZW50cmllcykuCiAgICAgICAgIDxicj48YnI+IDxMST4gRU5PRU5UCiAgICAgICAgIFRoZSBmaWxlIDxWQVI+b2xkbmFtZTwvVkFSPiBkb2Vzbid0IGV4aXN0LgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVOT1NQQwogICAgICAgICBUaGUgZGlyZWN0b3J5IHRoYXQgd291bGQgY29udGFpbiA8VkFSPm5ld25hbWU8L1ZBUj4gaGFzIG5vIHJvb20gZm9yIGFub3RoZXIKICAgICAgICAgZW50cnksIGFuZCB0aGVyZSBpcyBubyBzcGFjZSBsZWZ0IGluIHRoZSBmaWxlIHN5c3RlbSB0byBleHBhbmQgaXQuCiAgICAgICAgIDxicj48YnI+IDxMST4gRVJPRlMKICAgICAgICAgVGhlIG9wZXJhdGlvbiB3b3VsZCBpbnZvbHZlIHdyaXRpbmcgdG8gYSBkaXJlY3Rvcnkgb24gYSByZWFkLW9ubHkgZmlsZQogICAgICAgICBzeXN0ZW0uCiAgICAgICAgIDxicj48YnI+IDxMST4gRVhERVYKICAgICAgICAgVGhlIHR3byBmaWxlIG5hbWVzIDxWQVI+bmV3bmFtZTwvVkFSPiBhbmQgPFZBUj5vbGRuYW1lPC9WQVI+IGFyZSBvbiBkaWZmZXJlbnQKICAgICAgICAgZmlsZSBzeXN0ZW1zLgoKICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHc3RkaW8uaHhxAH4XSHQAKGNvbnN0IGNoYXIgKm9sZG5hbWUsIGNvbnN0IGNoYXIgKm5ld25hbWV0AANpbnR0AAZyZXdpbmRzcQB+AAp0AdAKICAgICAgICBUaGUgPENPREU+cmV3aW5kPC9DT0RFPiBmdW5jdGlvbiBwb3NpdGlvbnMgdGhlIHN0cmVhbSA8VkFSPnN0cmVhbTwvVkFSPiBhdCB0aGUKICAgICAgICAgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLiAgSXQgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nIDxDT0RFPmZzZWVrPC9DT0RFPiBvcgogICAgICAgICA8Q09ERT5mc2Vla288L0NPREU+IG9uIHRoZSA8VkFSPnN0cmVhbTwvVkFSPiB3aXRoIGFuIDxWQVI+b2Zmc2V0PC9WQVI+IGFyZ3VtZW50IG9mCiAgICAgICAgIDxDT0RFPjBMPC9DT0RFPiBhbmQgYSA8VkFSPndoZW5jZTwvVkFSPiBhcmd1bWVudCBvZiA8Q09ERT5TRUVLX1NFVDwvQ09ERT4sIGV4Y2VwdCB0aGF0CiAgICAgICAgIHRoZSByZXR1cm4gdmFsdWUgaXMgZGlzY2FyZGVkIGFuZCB0aGUgZXJyb3IgaW5kaWNhdG9yIGZvciB0aGUgc3RyZWFtIGlzCiAgICAgICAgIHJlc2V0LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAdzdGRpby5oeHEAfhdPdAAMRklMRSAqc3RyZWFtdAAEdm9pZHQACXJld2luZGRpcnNxAH4ACnQCWwogICAgICAgIFRoZSA8Q09ERT5yZXdpbmRkaXI8L0NPREU+IGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVpbml0aWFsaXplIHRoZSBkaXJlY3RvcnkKICAgICAgICAgc3RyZWFtIDxWQVI+ZGlyc3RyZWFtPC9WQVI+LCBzbyB0aGF0IGlmIHlvdSBjYWxsIDxDT0RFPnJlYWRkaXI8L0NPREU+IGl0CiAgICAgICAgIHJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBkaXJlY3RvcnkgYWdhaW4uICBUaGlzCiAgICAgICAgIGZ1bmN0aW9uIGFsc28gbm90aWNlcyBpZiBmaWxlcyBoYXZlIGJlZW4gYWRkZWQgb3IgcmVtb3ZlZCB0byB0aGUKICAgICAgICAgZGlyZWN0b3J5IHNpbmNlIGl0IHdhcyBvcGVuZWQgd2l0aCA8Q09ERT5vcGVuZGlyPC9DT0RFPi4gIChFbnRyaWVzIGZvciB0aGVzZQogICAgICAgICBmaWxlcyBtaWdodCBvciBtaWdodCBub3QgYmUgcmV0dXJuZWQgYnkgPENPREU+cmVhZGRpcjwvQ09ERT4gaWYgdGhleSB3ZXJlCiAgICAgICAgIGFkZGVkIG9yIHJlbW92ZWQgc2luY2UgeW91IGxhc3QgY2FsbGVkIDxDT0RFPm9wZW5kaXI8L0NPREU+IG9yCiAgICAgICAgIDxDT0RFPnJld2luZGRpcjwvQ09ERT4uKQogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAhkaXJlbnQuaHhxAH4XVnQADkRJUiAqZGlyc3RyZWFtdAAEdm9pZHQABnJpbmRleHNxAH4ACnQBPQogICAgICAgIDxDT0RFPnJpbmRleDwvQ09ERT4gaXMgYW5vdGhlciBuYW1lIGZvciA8Q09ERT5zdHJyY2hyPC9DT0RFPjsgdGhleSBhcmUgZXhhY3RseSB0aGUgc2FtZS4KICAgICAgICAgTmV3IGNvZGUgc2hvdWxkIGFsd2F5cyB1c2UgPENPREU+c3RycmNocjwvQ09ERT4gc2luY2UgdGhpcyBuYW1lIGlzIGRlZmluZWQgaW4KICAgICAgICAgSVNPIEMgd2hpbGUgPENPREU+cmluZGV4PC9DT0RFPiBpcyBhIEJTRCBpbnZlbnRpb24gd2hpY2ggbmV2ZXIgd2FzIGF2YWlsYWJsZQogICAgICAgICBvbiBTeXN0ZW0gViBkZXJpdmVkIHN5c3RlbXMuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHN0cmluZy5oeHEAfhdddAAZY29uc3QgY2hhciAqc3RyaW5nLCBpbnQgY3QABmNoYXIgKnQABHJpbnRzcQB+AAp0AfQKICAgICAgICBUaGVzZSBmdW5jdGlvbnMgcm91bmQgPFZBUj54PC9WQVI+IHRvIGFuIGludGVnZXIgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZQogICAgICAgICBjdXJyZW50IHJvdW5kaW5nIG1vZGUuICAsIGZvcgogICAgICAgICBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmFyaW91cyByb3VuZGluZyBtb2Rlcy4gIFRoZSBkZWZhdWx0CiAgICAgICAgIHJvdW5kaW5nIG1vZGUgaXMgdG8gcm91bmQgdG8gdGhlIG5lYXJlc3QgaW50ZWdlcjsgc29tZSBtYWNoaW5lcwogICAgICAgICBzdXBwb3J0IG90aGVyIG1vZGVzLCBidXQgcm91bmQtdG8tbmVhcmVzdCBpcyBhbHdheXMgdXNlZCB1bmxlc3MKICAgICAgICAgeW91IGV4cGxpY2l0bHkgc2VsZWN0IGFub3RoZXIuCiAgICAgICAgIDxicj48YnI+IElmIDxWQVI+eDwvVkFSPiB3YXMgbm90IGluaXRpYWxseSBhbiBpbnRlZ2VyLCB0aGVzZSBmdW5jdGlvbnMgcmFpc2UgdGhlCiAgICAgICAgIGluZXhhY3QgZXhjZXB0aW9uLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZtYXRoLmh4cQB+F2R0AAhkb3VibGUgeHQABmRvdWJsZXQABXJpbnRmc3EAfgAKdAH0CiAgICAgICAgVGhlc2UgZnVuY3Rpb25zIHJvdW5kIDxWQVI+eDwvVkFSPiB0byBhbiBpbnRlZ2VyIHZhbHVlIGFjY29yZGluZyB0byB0aGUKICAgICAgICAgY3VycmVudCByb3VuZGluZyBtb2RlLiAgLCBmb3IKICAgICAgICAgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHZhcmlvdXMgcm91bmRpbmcgbW9kZXMuICBUaGUgZGVmYXVsdAogICAgICAgICByb3VuZGluZyBtb2RlIGlzIHRvIHJvdW5kIHRvIHRoZSBuZWFyZXN0IGludGVnZXI7IHNvbWUgbWFjaGluZXMKICAgICAgICAgc3VwcG9ydCBvdGhlciBtb2RlcywgYnV0IHJvdW5kLXRvLW5lYXJlc3QgaXMgYWx3YXlzIHVzZWQgdW5sZXNzCiAgICAgICAgIHlvdSBleHBsaWNpdGx5IHNlbGVjdCBhbm90aGVyLgogICAgICAgICA8YnI+PGJyPiBJZiA8VkFSPng8L1ZBUj4gd2FzIG5vdCBpbml0aWFsbHkgYW4gaW50ZWdlciwgdGhlc2UgZnVuY3Rpb25zIHJhaXNlIHRoZQogICAgICAgICBpbmV4YWN0IGV4Y2VwdGlvbi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGbWF0aC5oeHEAfhdrdAAHZmxvYXQgeHQABWZsb2F0dAAFcmludGxzcQB+AAp0AfQKICAgICAgICBUaGVzZSBmdW5jdGlvbnMgcm91bmQgPFZBUj54PC9WQVI+IHRvIGFuIGludGVnZXIgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZQogICAgICAgICBjdXJyZW50IHJvdW5kaW5nIG1vZGUuICAsIGZvcgogICAgICAgICBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmFyaW91cyByb3VuZGluZyBtb2Rlcy4gIFRoZSBkZWZhdWx0CiAgICAgICAgIHJvdW5kaW5nIG1vZGUgaXMgdG8gcm91bmQgdG8gdGhlIG5lYXJlc3QgaW50ZWdlcjsgc29tZSBtYWNoaW5lcwogICAgICAgICBzdXBwb3J0IG90aGVyIG1vZGVzLCBidXQgcm91bmQtdG8tbmVhcmVzdCBpcyBhbHdheXMgdXNlZCB1bmxlc3MKICAgICAgICAgeW91IGV4cGxpY2l0bHkgc2VsZWN0IGFub3RoZXIuCiAgICAgICAgIDxicj48YnI+IElmIDxWQVI+eDwvVkFSPiB3YXMgbm90IGluaXRpYWxseSBhbiBpbnRlZ2VyLCB0aGVzZSBmdW5jdGlvbnMgcmFpc2UgdGhlCiAgICAgICAgIGluZXhhY3QgZXhjZXB0aW9uLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZtYXRoLmh4cQB+F3J0AA1sb25nIGRvdWJsZSB4dAALbG9uZyBkb3VibGV0AAVybWRpcnNxAH4ACnQDbwogICAgICAgICwgZGVsZXRpbmcKICAgICAgICAgIGEgZGlyZWN0b3J5CiAgICAgICAgIFRoZSA8Q09ERT5ybWRpcjwvQ09ERT4gZnVuY3Rpb24gZGVsZXRlcyBhIGRpcmVjdG9yeS4gIFRoZSBkaXJlY3RvcnkgbXVzdCBiZQogICAgICAgICBlbXB0eSBiZWZvcmUgaXQgY2FuIGJlIHJlbW92ZWQ7IGluIG90aGVyIHdvcmRzLCBpdCBjYW4gb25seSBjb250YWluCiAgICAgICAgIGVudHJpZXMgZm9yIDxUVD4uPC9UVD4gYW5kIDxUVD4uLjwvVFQ+LgogICAgICAgICA8YnI+PGJyPiBJbiBtb3N0IG90aGVyIHJlc3BlY3RzLCA8Q09ERT5ybWRpcjwvQ09ERT4gYmVoYXZlcyBsaWtlIDxDT0RFPnVubGluazwvQ09ERT4uICBUaGVyZQogICAgICAgICBhcmUgdHdvIGFkZGl0aW9uYWwgPENPREU+ZXJybm88L0NPREU+IGVycm9yIGNvbmRpdGlvbnMgZGVmaW5lZCBmb3IKICAgICAgICAgPENPREU+cm1kaXI8L0NPREU+OgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8RFQ+PENPREU+RU5PVEVNUFRZPC9DT0RFPgo8REQ+CiAgICAgICAgIDxMST54IEVFWElTVAogICAgICAgICBUaGUgZGlyZWN0b3J5IHRvIGJlIGRlbGV0ZWQgaXMgbm90IGVtcHR5LgoKICAgICAgICAgPGJyPjxicj4gVGhlc2UgdHdvIGVycm9yIGNvZGVzIGFyZSBzeW5vbnltb3VzOyBzb21lIHN5c3RlbXMgdXNlIG9uZSwgYW5kIHNvbWUgdXNlCiAgICAgICAgIHRoZSBvdGhlci4gIFRoZSBHTlUgc3lzdGVtIGFsd2F5cyB1c2VzIDxDT0RFPkVOT1RFTVBUWTwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IFRoZSBwcm90b3R5cGUgZm9yIHRoaXMgZnVuY3Rpb24gaXMgZGVjbGFyZWQgaW4gdGhlIGhlYWRlciBmaWxlCiAgICAgICAgIDxUVD51bmlzdGQuaDwvVFQ+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAh1bmlzdGQuaHhxAH4XeXQAFGNvbnN0IGNoYXIgKmZpbGVuYW1ldAADaW50dAAFcm91bmRzcQB+AAp0AMUKICAgICAgICBUaGVzZSBmdW5jdGlvbnMgYXJlIHNpbWlsYXIgdG8gPENPREU+cmludDwvQ09ERT4sIGJ1dCB0aGV5IHJvdW5kIGhhbGZ3YXkKICAgICAgICAgY2FzZXMgYXdheSBmcm9tIHplcm8gaW5zdGVhZCBvZiB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyIChvciBvdGhlcgogICAgICAgICBjdXJyZW50IHJvdW5kaW5nIG1vZGUpLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZtYXRoLmh4cQB+F4B0AAhkb3VibGUgeHQABmRvdWJsZXQABnJvdW5kZnNxAH4ACnQAxQogICAgICAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUgc2ltaWxhciB0byA8Q09ERT5yaW50PC9DT0RFPiwgYnV0IHRoZXkgcm91bmQgaGFsZndheQogICAgICAgICBjYXNlcyBhd2F5IGZyb20gemVybyBpbnN0ZWFkIG9mIHRvIHRoZSBuZWFyZXN0IGludGVnZXIgKG9yIG90aGVyCiAgICAgICAgIGN1cnJlbnQgcm91bmRpbmcgbW9kZSkuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQABm1hdGguaHhxAH4Xh3QAB2Zsb2F0IHh0AAVmbG9hdHQABnJvdW5kbHNxAH4ACnQAxQogICAgICAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUgc2ltaWxhciB0byA8Q09ERT5yaW50PC9DT0RFPiwgYnV0IHRoZXkgcm91bmQgaGFsZndheQogICAgICAgICBjYXNlcyBhd2F5IGZyb20gemVybyBpbnN0ZWFkIG9mIHRvIHRoZSBuZWFyZXN0IGludGVnZXIgKG9yIG90aGVyCiAgICAgICAgIGN1cnJlbnQgcm91bmRpbmcgbW9kZSkuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQABm1hdGguaHhxAH4XjnQADWxvbmcgZG91YmxlIHh0AAtsb25nIGRvdWJsZXQAB3JwbWF0Y2hzcQB+AAp0Az4KICAgICAgICBUaGUgZnVuY3Rpb24gPENPREU+cnBtYXRjaDwvQ09ERT4gY2hlY2tzIHRoZSBzdHJpbmcgaW4gPFZBUj5yZXNwb25zZTwvVkFSPiB3aGV0aGVyCiAgICAgICAgIG9yIG5vdCBpdCBpcyBhIGNvcnJlY3QgeWVzLW9yLW5vIGFuc3dlciBhbmQg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PnNjYWxiPC9DT0RFPiwgZXhjZXB0IHRoYXQgdGhlIGV4cG9uZW50CiAgICAgICAgIDxWQVI+bjwvVkFSPiBpcyBhbiA8Q09ERT5pbnQ8L0NPREU+IGluc3RlYWQgb2YgYSBmbG9hdGluZy1wb2ludCBudW1iZXIuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQABm1hdGguaHhxAH4X1HQAFGxvbmcgZG91YmxlIHgsIGludCBudAANbG9uZyBsb25nIGludHQAB3NjYW5kaXJzcQB+AAp0BYYKICAgICAgICA8YnI+PGJyPiBUaGUgPENPREU+c2NhbmRpcjwvQ09ERT4gZnVuY3Rpb24gc2NhbnMgdGhlIGNvbnRlbnRzIG9mIHRoZSBkaXJlY3Rvcnkgc2VsZWN0ZWQKICAgICAgICAgYnkgPFZBUj5kaXI8L1ZBUj4uICBUaGUgcmVzdWx0IGluICo8VkFSPm5hbWVsaXN0PC9WQVI+IGlzIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvCiAgICAgICAgIHN0cnVjdHVyZSBvZiB0eXBlIDxDT0RFPnN0cnVjdCBkaXJlbnQ8L0NPREU+IHdoaWNoIGRlc2NyaWJlIGFsbCBzZWxlY3RlZAogICAgICAgICBkaXJlY3RvcnkgZW50cmllcyBhbmQgd2hpY2ggaXMgYWxsb2NhdGVkIHVzaW5nIDxDT0RFPm1hbGxvYzwvQ09ERT4uICBJbnN0ZWFkCiAgICAgICAgIG9mIGFsd2F5cyBnZXR0aW5nIGFsbCBkaXJlY3RvcnkgZW50cmllcyByZXR1cm5lZCwgdGhlIHVzZXIgc3VwcGxpZWQKICAgICAgICAgZnVuY3Rpb24gPFZBUj5zZWxlY3RvcjwvVkFSPiBjYW4gYmUgdXNlZCB0byBkZWNpZGUgd2hpY2ggZW50cmllcyBhcmUgaW4gdGhlCiAgICAgICAgIHJlc3VsdC4gIE9ubHkgdGhlIGVudHJpZXMgZm9yIHdoaWNoIDxWQVI+c2VsZWN0b3I8L1ZBUj4gcmV0dXJucyBhIG5vbi16ZXJvCiAgICAgICAgIHZhbHVlIGFyZSBzZWxlY3RlZC4KICAgICAgICAgPGJyPjxicj4gRmluYWxseSB0aGUgZW50cmllcyBpbiAqPFZBUj5uYW1lbGlzdDwvVkFSPiBhcmUgc29ydGVkIHVzaW5nIHRoZQogICAgICAgICB1c2VyLXN1cHBsaWVkIGZ1bmN0aW9uIDxWQVI+Y21wPC9WQVI+LiAgVGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIDxWQVI+Y21wPC9WQVI+CiAgICAgICAgIGZ1bmN0aW9uIGFyZSBvZiB0eXBlIDxDT0RFPnN0cnVjdCBkaXJlbnQgKio8L0NPREU+LCB0aGVyZWZvcmUgb25lIGNhbm5vdAogICAgICAgICBkaXJlY3RseSB1c2UgdGhlIDxDT0RFPnN0cmNtcDwvQ09ERT4gb3IgPENPREU+c3RyY29sbDwvQ09ERT4gZnVuY3Rpb25zOyBpbnN0ZWFkIHNlZQogICAgICAgICB0aGUgZnVuY3Rpb25zIDxDT0RFPmFscGhhc29ydDwvQ09ERT4gYW5kIDxDT0RFPnZlcnNpb25zb3J0PC9DT0RFPiBiZWxvdy4KICAgICAgICAgPGJyPjxicj4gVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24gaXMgdGhlIG51bWJlciBvZiBlbnRyaWVzIHBsYWNlZCBpbgogICAgICAgICAqPFZBUj5uYW1lbGlzdDwvVkFSPi4gIElmIGl0IGlzIDxDT0RFPi0xPC9DT0RFPiBhbiBlcnJvciBvY2N1cnJlZCAoZWl0aGVyIHRoZQogICAgICAgICBkaXJlY3RvcnkgY291bGQgbm90IGJlIG9wZW5lZCBmb3IgcmVhZGluZyBvciB0aGUgbWFsbG9jIGNhbGwgZmFpbGVkKSBhbmQKICAgICAgICAgdGhlIGdsb2JhbCB2YXJpYWJsZSA8Q09ERT5lcnJubzwvQ09ERT4gY29udGFpbnMgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgZXJyb3IuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACGRpcmVudC5oeHEAfhfbdAB8Y29uc3QgY2hhciAqZGlyLCBzdHJ1Y3QgZGlyZW50ICoqKm5hbWVsaXN0LCBpbnQgKCpzZWxlY3RvcikgKGNvbnN0IHN0cnVjdCBkaXJlbnQgKiksIGludCAoKmNtcCkgKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKXQAA2ludHQACXNjYW5kaXI2NHNxAH4ACnQCXgogICAgICAgIFRoZSA8Q09ERT5zY2FuZGlyNjQ8L0NPREU+IGZ1bmN0aW9uIHdvcmtzIGxpa2UgdGhlIDxDT0RFPnNjYW5kaXI8L0NPREU+IGZ1bmN0aW9uCiAgICAgICAgIGV4Y2VwdCB0aGF0IHRoZSBkaXJlY3RvcnkgZW50cmllcyBpdCByZXR1cm5zIGFyZSBkZXNjcmliZWQgYnkgZWxlbWVudHMKICAgICAgICAgb2YgdHlwZSA8Q09ERT5zdHJ1Y3QgZGlyZW50NjQ8L0NPREU+LiAgVGhlIGZ1bmN0aW9uIHBvaW50ZWQgdG8gYnkKICAgICAgICAgPFZBUj5zZWxlY3RvcjwvVkFSPiBpcyBhZ2FpbiB1c2VkIHRvIHNlbGVjdCB0aGUgZGVzaXJlZCBlbnRyaWVzLCBleGNlcHQgdGhhdAogICAgICAgICA8VkFSPnNlbGVjdG9yPC9WQVI+IG5vdyBtdXN0IHBvaW50IHRvIGEgZnVuY3Rpb24gd2hpY2ggdGFrZXMgYQogICAgICAgICA8Q09ERT5zdHJ1Y3QgZGlyZW50NjQgKjwvQ09ERT4gcGFyYW1ldGVyLgogICAgICAgICA8YnI+PGJyPiBTaW1pbGFybHkgdGhlIDxWQVI+Y21wPC9WQVI+IGZ1bmN0aW9uIHNob3VsZCBleHBlY3QgaXRzIHR3byBhcmd1bWVudHMgdG8gYmUKICAgICAgICAgb2YgdHlwZSA8Q09ERT5zdHJ1Y3QgZGlyZW50NjQgKio8L0NPREU+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAhkaXJlbnQuaHhxAH4X4nQAgGNvbnN0IGNoYXIgKmRpciwgc3RydWN0IGRpcmVudDY0ICoqKm5hbWVsaXN0LCBpbnQgKCpzZWxlY3RvcikgKGNvbnN0IHN0cnVjdCBkaXJlbnQ2NCAqKSwgaW50ICgqY21wKSAoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopdAADaW50dAAFc2NhbmZzcQB+AAp0AkQKICAgICAgICBUaGUgPENPREU+c2NhbmY8L0NPREU+IGZ1bmN0aW9uIHJlYWRzIGZvcm1hdHRlZCBpbnB1dCBmcm9tIHRoZSBzdHJlYW0KICAgICAgICAgPENPREU+c3RkaW48L0NPREU+IHVuZGVyIHRoZSBjb250cm9sIG9mIHRoZSB0ZW1wbGF0ZSBzdHJpbmcgPFZBUj50ZW1wbGF0ZTwvVkFSPi4KICAgICAgICAgVGhlIG9wdGlvbmFsIGFyZ3VtZW50cyBhcmUgcG9pbnRlcnMgdG8gdGhlIHBsYWNlcyB3aGljaCByZWNlaXZlIHRoZQogICAgICAgICByZXN1bHRpbmcgdmFsdWVzLgogICAgICAgICA8YnI+PGJyPiBUaGUgcmV0dXJuIHZhbHVlIGlzIG5vcm1hbGx5IHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCBhc3NpZ25tZW50cy4gIElmCiAgICAgICAgIGFuIGVuZC1vZi1maWxlIGNvbmRpdGlvbiBpcyBkZXRlY3RlZCBiZWZvcmUgYW55IG1hdGNoZXMgYXJlIHBlcmZvcm1lZCwKICAgICAgICAgaW5jbHVkaW5nIG1hdGNoZXMgYWdhaW5zdCB3aGl0ZXNwYWNlIGFuZCBsaXRlcmFsIGNoYXJhY3RlcnMgaW4gdGhlCiAgICAgICAgIHRlbXBsYXRlLCB0aGVuIDxDT0RFPkVPRjwvQ09ERT4gaXMgcmV0dXJuZWQuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3N0ZGlvLmh4cQB+F+l0ABljb25zdCBjaGFyICp0ZW1wbGF0ZSwgLi4udAADaW50dAAWc2NoZWRfZ2V0X3ByaW9yaXR5X21heHNxAH4ACnQCeAogICAgICAgIDxicj48YnI+IFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgaGlnaGVzdCBhYnNvbHV0ZSBwcmlvcml0eSB2YWx1ZSB0aGF0IGlzCiAgICAgICAgIGFsbG93YWJsZSBmb3IgYSBwcm9jZXNzIHRoYXQgd2l0aCBzY2hlZHVsaW5nIHBvbGljeSA8VkFSPnBvbGljeTwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gT24gTGludXgsIGl0IGlzIDAgZm9yIFNDSEVEX09USEVSIGFuZCA5OSBmb3IgZXZlcnl0aGluZyBlbHNlLgogICAgICAgICA8YnI+PGJyPiBPbiBzdWNjZXNzLCB0aGUgcmV0dXJuIHZhbHVlIGlzIDxDT0RFPjA8L0NPREU+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dWxpbmcKICAgICAgICAgPERUPjxDT0RFPlNDSEVEX0ZJRk88L0NPREU+CjxERD4KICAgICAgICAgRmlyc3QgSW4gRmlyc3QgT3V0CiAgICAgICAgIDxMST4gU0NIRURfUlIKICAgICAgICAgUm91bmQgUm9iaW4KCiAgICAgICAgIDxicj48YnI+IDxicj48YnI+IE9uIHN1Y2Nlc3MsIHRoZSByZXR1cm4gdmFsdWUgaXMgPENPREU+MDwvQ09ERT4uICBPdGhlcndpc2UsIGl0IGlzIDxDT0RFPi0xPC9DT0RFPgogICAgICAgICBhbmQgPENPREU+RVJSTk88L0NPREU+IGlzIHNldCBhY2NvcmRpbmdseS4gIFRoZSA8Q09ERT5lcnJubzwvQ09ERT4gdmFsdWVzIHNwZWNpZmljCiAgICAgICAgIHRvIHRoaXMgZnVuY3Rpb24gYXJlOgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8TEk+IEVQRVJNCiAgICAgICAgIDxPTD4KICAgICAgICAgPExJPgogICAgICAgICBUaGUgY2FsbGluZyBwcm9jZXNzIGRvZXMgbm90IGhhdmUgPENPREU+Q0FQX1NZU19OSUNFPC9DT0RFPiBwZXJtaXNzaW9uIGFuZAogICAgICAgICA8VkFSPnBvbGljeTwvVkFSPiBpcyBub3QgPENPREU+U0NIRURfT1RIRVI8L0NPREU+IChvciBpdCdzIG5lZ2F0aXZlIGFuZCB0aGUKICAgICAgICAgZXhpc3RpbmcgcG9saWN5IGlzIG5vdCA8Q09ERT5TQ0hFRF9PVEhFUjwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IDxMST4KICAgICAgICAgVGhlIGNhbGxpbmcgcHJvY2VzcyBkb2VzIG5vdCBoYXZlIDxDT0RFPkNBUF9TWVNfTklDRTwvQ09ERT4gcGVybWlzc2lvbiBhbmQgaXRzCiAgICAgICAgIG93bmVyIGlzIG5vdCB0aGUgdGFyZ2V0IHByb2Nlc3MnIG93bmVyLiAgSS5lLiwgdGhlIGVmZmVjdGl2ZSB1aWQgb2YgdGhlCiAgICAgICAgIGNhbGxpbmcgcHJvY2VzcyBpcyBuZWl0aGVyIHRoZSBlZmZlY3RpdmUgbm9yIHRoZSByZWFsIHVpZCBvZiBwcm9jZXNzCiAgICAgICAgIDxWQVI+cGlkPC9WQVI+LgogICAgICAgICA8L09MPgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVTUkNICiAgICAgICAgIFRoZXJlIGlzIG5vIHByb2Nlc3Mgd2l0aCBwaWQgPFZBUj5waWQ8L1ZBUj4gYW5kIDxWQVI+cGlkPC9WQVI+IGlzIG5vdCB6ZXJvLgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVJTlZBTAogICAgICAgICA8T0w+CiAgICAgICAgIDxMST4KICAgICAgICAgPFZBUj5wb2xpY3k8L1ZBUj4gZG9lcyBub3QgaWRlbnRpZnkgYW4gZXhpc3Rpbmcgc2NoZWR1bGluZyBwb2xpY3kuCiAgICAgICAgIDxicj48YnI+IDxMST4KICAgICAgICAgVGhlIGFic29sdXRlIHByaW9yaXR5IHZhbHVlIGlkZW50aWZpZWQgYnkgKjxWQVI+cGFyYW08L1ZBUj4gaXMgb3V0c2lkZSB0aGUKICAgICAgICAgdmFsaWQgcmFuZ2UgZm9yIHRoZSBzY2hlZHVsaW5nIHBvbGljeSA8VkFSPnBvbGljeTwvVkFSPiAob3IgdGhlIGV4aXN0aW5nCiAgICAgICAgIHNjaGVkdWxpbmcgcG9saWN5IGlmIDxWQVI+cG9saWN5PC9WQVI+IGlzIG5lZ2F0aXZlKSBvciA8VkFSPnBhcmFtPC9WQVI+IGlzCiAgICAgICAgIG51bGwuICA8Q09ERT5zY2hlZF9nZXRfcHJpb3JpdHlfbWF4PC9DT0RFPiBhbmQgPENPREU+c2NoZWRfZ2V0X3ByaW9yaXR5X21pbjwvQ09ERT4KICAgICAgICAgdGVsbCB5b3Ugd2hhdCB0aGUgdmFsaWQgcmFuZ2UgaXMuCiAgICAgICAgIDxicj48YnI+IDxMST4KICAgICAgICAgPFZBUj5waWQ8L1ZBUj4gaXMgbmVnYXRpdmUuCiAgICAgICAgIDwvT0w+CgogICAgICAgICA8YnI+PGJyPgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAdzY2hlZC5oeHEAfhgodAA2cGlkX3QgcGlkLCBpbnQgcG9saWN5LCBjb25zdCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKnBhcmFtdAADaW50dAALc2NoZWRfeWllbGRzcQB+AAp0BVYKICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIHZvbHVudGFyaWx5IGdpdmVzIHVwIHRoZSBwcm9jZXNzJyBjbGFpbSBvbiB0aGUgQ1BVLgogICAgICAgICA8YnI+PGJyPiBUZWNobmljYWxseSwgPENPREU+c2NoZWRfeWllbGQ8L0NPREU+IGNhdXNlcyB0aGUgY2FsbGluZyBwcm9jZXNzIHRvIGJlIG1hZGUKICAgICAgICAgaW1tZWRpYXRlbHkgcmVhZHkgdG8gcnVuIChhcyBvcHBvc2VkIHRvIHJ1bm5pbmcsIHdoaWNoIGlzIHdoYXQgaXQgd2FzCiAgICAgICAgIGJlZm9yZSkuICBUaGlzIG1lYW5zIHRoYXQgaWYgaXQgaGFzIGFic29sdXRlIHByaW9yaXR5IGhpZ2hlciB0aGFuIDAsIGl0CiAgICAgICAgIGdldHMgcHVzaGVkIG9udG8gdGhlIHRhaWwgb2YgdGhlIHF1ZXVlIG9mIHByb2Nlc3NlcyB0aGF0IHNoYXJlIGl0cwogICAgICAgICBhYnNvbHV0ZSBwcmlvcml0eSBhbmQgYXJlIHJlYWR5IHRvIHJ1biwgYW5kIGl0IHdpbGwgcnVuIGFnYWluIHdoZW4gaXRzCiAgICAgICAgIHR1cm4gbmV4dCBhcnJpdmVzLiAgSWYgaXRzIGFic29sdXRlIHByaW9yaXR5IGlzIDAsIGl0IGlzIG1vcmUKICAgICAgICAgY29tcGxpY2F0ZWQsIGJ1dCBzdGlsbCBoYXMgdGhlIGVmZmVjdCBvZiB5aWVsZGluZyB0aGUgQ1BVIHRvIG90aGVyCiAgICAgICAgIHByb2Nlc3Nlcy4KICAgICAgICAgPGJyPjxicj4gSWYgdGhlcmUgYXJlIG5vIG90aGVyIHByb2Nlc3NlcyB0aGF0IHNoYXJlIHRoZSBjYWxsaW5nIHByb2Nlc3MnIGFic29sdXRlCiAgICAgICAgIHByaW9yaXR5LCB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QgaGF2ZSBhbnkgZWZmZWN0LgogICAgICAgICA8YnI+PGJyPiBUbyB0aGUgZXh0ZW50IHRoYXQgdGhlIGNvbnRhaW5pbmcgcHJvZ3JhbSBpcyBvYmxpdmlvdXMgdG8gd2hhdCBvdGhlcgogICAgICAgICBwcm9jZXNzZXMgaW4gdGhlIHN5c3RlbSBhcmUgZG9pbmcgYW5kIGhvdyBmYXN0IGl0IGV4ZWN1dGVzLCB0aGlzCiAgICAgICAgIGZ1bmN0aW9uIGFwcGVhcnMgYXMgYSBuby1vcC4KICAgICAgICAgPGJyPjxicj4gVGhlIHJldHVybiB2YWx1ZSBpcyA8Q09ERT4wPC9DT0RFPiBvbiBzdWNjZXNzIGFuZCBpbiB0aGUgcGF0aG9sb2dpY2FsIGNhc2UKICAgICAgICAgdGhhdCBpdCBmYWlscywgdGhlIHJldHVybiB2YWx1ZSBpcyA8Q09ERT4tMTwvQ09ERT4gYW5kIDxDT0RFPmVycm5vPC9DT0RFPiBpcyBzZXQKICAgICAgICAgYWNjb3JkaW5nbHkuICBUaGVyZSBpcyBub3RoaW5nIHNwZWNpZmljIHRoYXQgY2FuIGdvIHdyb25nIHdpdGggdGhpcwogICAgICAgICBmdW5jdGlvbiwgc28gdGhlcmUgYXJlIG5vIHNwZWNpZmljIDxDT0RFPmVycm5vPC9DT0RFPiB2YWx1ZXMuCiAgICAgICAgIDxicj48YnI+CiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3NjaGVkLmh4cQB+GC90AAR2b2lkdAADaW50dAAGc2VlZDQ4c3EAfgAKdASNCiAgICAgICAgVGhlIDxDT0RFPnNlZWQ0ODwvQ09ERT4gZnVuY3Rpb24gaW5pdGlhbGl6ZXMgYWxsIDQ4IGJpdHMgb2YgdGhlIHN0YXRlIG9mIHRoZQogICAgICAgICBpbnRlcm5hbCByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBmcm9tIHRoZSBjb250ZW50cyBvZiB0aGUgcGFyYW1ldGVyCiAgICAgICAgIDxWQVI+c2VlZDE2djwvVkFSPi4gIEhlcmUgdGhlIGxvd2VyIDE2IGJpdHMgb2YgdGhlIGZpcnN0IGVsZW1lbnQgb2YKICAgICAgICAgPFZBUj5zZWUxNnY8L1ZBUj4gaW5pdGlhbGl6ZSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgMTYgYml0cyBvZiB0aGUgaW50ZXJuYWwKICAgICAgICAgc3RhdGUsIHRoZSBsb3dlciAxNiBiaXRzIG9mIDxDT0RFPjxWQVI+c2VlZDE2djwvVkFSPlsxXTwvQ09ERT4gaW5pdGlhbGl6ZSB0aGUgbWlkLW9yZGVyCiAgICAgICAgIDE2IGJpdHMgb2YgdGhlIHN0YXRlIGFuZCB0aGUgMTYgbG93ZXIgYml0cyBvZiA8Q09ERT48VkFSPnNlZWQxNnY8L1ZBUj5bMl08L0NPREU+CiAgICAgICAgIGluaXRpYWxpemUgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgMTYgYml0cyBvZiB0aGUgc3RhdGUuCiAgICAgICAgIDxicj48YnI+IFVubGlrZSA8Q09ERT5zcmFuZDQ4PC9DT0RFPiB0aGlzIGZ1bmN0aW9uIGxldHMgdGhlIHVzZXIgaW5pdGlhbGl6ZSBhbGwgNDggYml0cwogICAgICAgICBvZiB0aGUgc3RhdGUuCiAgICAgICAgIDxicj48YnI+IFRoZSB2YWx1ZSByZXR1cm5lZCBieSA8Q09ERT5zZWVkNDg8L0NPREU+IGlzIGEgcG9pbnRlciB0byBhbiBhcnJheSBjb250YWluaW5nCiAgICAgICAgIHRoZSB2YWx1ZXMgb2YgdGhlIGludGVybmFsIHN0YXRlIGJlZm9yZSB0aGUgY2hhbmdlLiAgVGhpcyBtaWdodCBiZQogICAgICAgICB1c2VmdWwgdG8gcmVzdGFydCB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgYXQgYSBjZXJ0YWluIHN0YXRlLgogICAgICAgICBPdGhlcndpc2UgdGhlIHZhbHVlIGNhbiBzaW1wbHkgYmUgaWdub3JlZC4KICAgICAgICAgPGJyPjxicj4gQXMgZm9yIDxDT0RFPnNyYW5kNDg8L0NPREU+LCB0aGUgdmFsdWVzIDxDT0RFPmE8L0NPREU+IGFuZCA8Q09ERT5jPC9DT0RFPiBmcm9tIHRoZQogICAgICAgICBjb25ncnVlbnRpYWwgZm9ybXVsYSBhcmUgcmVzZXQgdG8gdGhlIGRlZmF1bHQgdmFsdWVzLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAhzdGRsaWIuaHhxAH4YNnQAHXVuc2lnbmVkIHNob3J0IGludCBzZWVkMTZ2WzNddAAUdW5zaWduZWQgc2hvcnQgaW50ICp0AAhzZWVkNDhfcnNxAH4ACnQClAogICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byA8Q09ERT5zcmFuZDQ4X3I8L0NPREU+IGJ1dCBsaWtlIDxDT0RFPnNlZWQ0ODwvQ09ERT4gaXQKICAgICAgICAgaW5pdGlhbGl6ZXMgYWxsIDQ4IGJpdHMgb2YgdGhlIHN0YXRlIGZyb20gdGhlIHBhcmFtZXRlciA8VkFSPnNlZWQxNnY8L1ZBUj4uCiAgICAgICAgIDxicj48YnI+IElmIHRoZSByZXR1cm4gdmFsdWUgaXMgbm9uLW5lZ2F0aXZlIHRoZSBmdW5jdGlvbiBjYWxsIHN1Y2NlZWRlZC4gIEl0CiAgICAgICAgIGRvZXMgbm90IHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHByZXZpb3VzIHN0YXRlIG9mIHRoZSByYW5kb20gbnVtYmVyCiAgICAgICAgIGdlbmVyYXRvciBsaWtlIHRoZSA8Q09ERT5zZWVkNDg8L0NPREU+IGZ1bmN0aW9uIGRvZXMuICBJZiB0aGUgdXNlciB3YW50cyB0bwogICAgICAgICBwcmVzZXJ2ZSB0aGUgc3RhdGUgZm9yIGEgbGF0ZXIgcmUtcnVuIHMvaGUgY2FuIGNvcHkgdGhlIHdob2xlIGJ1ZmZlcgogICAgICAgICBwb2ludGVkIHRvIGJ5IDxWQVI+YnVmZmVyPC9WQVI+LgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIGlzIGEgR05VIGV4dGVuc2lvbiBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHBvcnRhYmxlCiAgICAgICAgIHByb2dyYW1zLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAhzdGRsaWIuaHhxAH4YPXQAOnVuc2lnbmVkIHNob3J0IGludCBzZWVkMTZ2WzNdLCBzdHJ1Y3QgZHJhbmQ0OF9kYXRhICpidWZmZXJ0AANpbnR0AAdzZWVrZGlyc3EAfgAKdAF9CiAgICAgICAgVGhlIDxDT0RFPnNlZWtkaXI8L0NPREU+IGZ1bmN0aW9uIHNldHMgdGhlIGZpbGUgcG9zaXRpb24gb2YgdGhlIGRpcmVjdG9yeQogICAgICAgICBzdHJlYW0gPFZBUj5kaXJzdHJlYW08L1ZBUj4gdG8gPFZBUj5wb3M8L1ZBUj4uICBUaGUgdmFsdWUgPFZBUj5wb3M8L1ZBUj4gbXVzdCBiZSB0aGUKICAgICAgICAgcmVzdWx0IG9mIGEgcHJldmlvdXMgY2FsbCB0byA8Q09ERT50ZWxsZGlyPC9DT0RFPiBvbiB0aGlzIHBhcnRpY3VsYXIgc3RyZWFtOwogICAgICAgICBjbG9zaW5nIGFuZCByZW9wZW5pbmcgdGhlIGRpcmVjdG9yeSBjYW4gaW52YWxpZGF0ZSB2YWx1ZXMgcmV0dXJuZWQgYnkKICAgICAgICAgPENPREU+dGVsbGRpcjwvQ09ERT4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACGRpcmVudC5oeHEAfhhEdAAcRElSICpkaXJzdHJlYW0sIGxvbmcgaW50IHBvc3QABHZvaWR0AAZzZWxlY3RzcQB+AAp0D3UKICAgICAgICBUaGUgPENPREU+c2VsZWN0PC9DT0RFPiBmdW5jdGlvbiBibG9ja3MgdGhlIGNhbGxpbmcgcHJvY2VzcyB1bnRpbCB0aGVyZSBpcwogICAgICAgICBhY3Rpdml0eSBvbiBhbnkgb2YgdGhlIHNwZWNpZmllZCBzZXRzIG9mIGZpbGUgZGVzY3JpcHRvcnMsIG9yIHVudGlsIHRoZQogICAgICAgICB0aW1lb3V0IHBlcmlvZCBoYXMgZXhwaXJlZC4KICAgICAgICAgPGJyPjxicj4gVGhlIGZpbGUgZGVzY3JpcHRvcnMgc3BlY2lmaWVkIGJ5IHRoZSA8VkFSPnJlYWQtZmRzPC9WQVI+IGFyZ3VtZW50IGFyZQogICAgICAgICBjaGVja2VkIHRvIHNlZSBpZiB0aGV5IGFyZSByZWFkeSBmb3IgcmVhZGluZzsgdGhlIDxWQVI+d3JpdGUtZmRzPC9WQVI+IGZpbGUKICAgICAgICAgZGVzY3JpcHRvcnMgYXJlIGNoZWNrZWQgdG8gc2VlIGlmIHRoZXkgYXJlIHJlYWR5IGZvciB3cml0aW5nOyBhbmQgdGhlCiAgICAgICAgIDxWQVI+ZXhjZXB0LWZkczwvVkFSPiBmaWxlIGRlc2NyaXB0b3JzIGFyZSBjaGVja2VkIGZvciBleGNlcHRpb25hbAogICAgICAgICBjb25kaXRpb25zLiAgWW91IGNhbiBwYXNzIGEgbnVsbCBwb2ludGVyIGZvciBhbnkgb2YgdGhlc2UgYXJndW1lbnRzIGlmCiAgICAgICAgIHlvdSBhcmUgbm90IGludGVyZXN0ZWQgaW4gY2hlY2tpbmcgZm9yIHRoYXQga2luZCBvZiBjb25kaXRpb24uCiAgICAgICAgIDxicj48YnI+IEEgZmlsZSBkZXNjcmlwdG9yIGlzIGNvbnNpZGVyZWQgcmVhZHkgZm9yIHJlYWRpbmcgaWYgYSA8Q09ERT5yZWFkPC9DT0RFPgogICAgICAgICBjYWxsIHdpbGwgbm90IGJsb2NrLiAgVGhpcyB1c3VhbGx5IGluY2x1ZGVzIHRoZSByZWFkIG9mZnNldCBiZWluZyBhdAogICAgICAgICB0aGUgZW5kIG9mIHRoZSBmaWxlIG9yIHRoZXJlIGlzIGFuIGVycm9yIHRvIHJlcG9ydC4gIEEgc2VydmVyIHNvY2tldAogICAgICAgICBpcyBjb25zaWRlcmVkIHJlYWR5IGZvciByZWFkaW5nIGlmIHRoZXJlIGlzIGEgcGVuZGluZyBjb25uZWN0aW9uIHdoaWNoCiAgICAgICAgIGNhbiBiZSBhY2NlcHRlZCB3aXRoIDxDT0RFPmFjY2VwdDwvQ09ERT47IC4gIEEKICAgICAgICAgY2xpZW50IHNvY2tldCBpcyByZWFkeSBmb3Igd3JpdGluZyB3aGVuIGl0cyBjb25uZWN0aW9uIGlzIGZ1bGx5CiAgICAgICAgIGVzdGFibGlzaGVkOyAuCiAgICAgICAgIDxicj48YnI+IGBgRXhjZXB0aW9uYWwgY29uZGl0aW9ucycnIGRvZXMgbm90IG1lYW4gZXJyb3JzLS0tZXJyb3JzIGFyZSByZXBvcnRlZAogICAgICAgICBpbW1lZGlhdGVseSB3aGVuIGFuIGVycm9uZW91cyBzeXN0ZW0gY2FsbCBpcyBleGVjdXRlZCwgYW5kIGRvIG5vdAogICAgICAgICBjb25zdGl0dXRlIGEgc3RhdGUgb2YgdGhlIGRlc2NyaXB0b3IuICBSYXRoZXIsIHRoZXkgaW5jbHVkZSBjb25kaXRpb25zCiAgICAgICAgIHN1Y2ggYXMgdGhlIHByZXNlbmNlIG9mIGFuIHVyZ2VudCBtZXNzYWdlIG9uIGEgc29ja2V0LiAgKCwKICAgICAgICAgZm9yIGluZm9ybWF0aW9uIG9uIHVyZ2VudCBtZXNzYWdlcy4pCiAgICAgICAgIDxicj48YnI+IFRoZSA8Q09ERT5zZWxlY3Q8L0NPREU+IGZ1bmN0aW9uIGNoZWNrcyBvbmx5IHRoZSBmaXJzdCA8VkFSPm5mZHM8L1ZBUj4gZmlsZQogICAgICAgICBkZXNjcmlwdG9ycy4gIFRoZSB1c3VhbCB0aGluZyBpcyB0byBwYXNzIDxDT0RFPkZEX1NFVFNJWkU8L0NPREU+IGFzIHRoZSB2YWx1ZQogICAgICAgICBvZiB0aGlzIGFyZ3VtZW50LgogICAgICAgICA8YnI+PGJyPiBUaGUgPFZBUj50aW1lb3V0PC9WQVI+IHNwZWNpZmllcyB0aGUgbWF4aW11bSB0aW1lIHRvIHdhaXQuICBJZiB5b3UgcGFzcyBhCiAgICAgICAgIG51bGwgcG9pbnRlciBmb3IgdGhpcyBhcmd1bWVudCwgaXQgbWVhbnMgdG8gYmxvY2sgaW5kZWZpbml0ZWx5IHVudGlsIG9uZQogICAgICAgICBvZiB0aGUgZmlsZSBkZXNjcmlwdG9ycyBpcyByZWFkeS4gIE90aGVyd2lzZSwgeW91IHNob3VsZCBwcm92aWRlIHRoZQogICAgICAgICB0aW1lIGluIDxDT0RFPnN0cnVjdCB0aW1ldmFsPC9DT0RFPiBmb3JtYXQ7IHNlZSBIaWdoLVJlc29sdXRpb24KICAgICAgICAgQ2FsZW5kYXIuICBTcGVjaWZ5IHplcm8gYXMgdGhlIHRpbWUgKGEgPENPREU+c3RydWN0IHRpbWV2YWw8L0NPREU+IGNvbnRhaW5pbmcKICAgICAgICAgYWxsIHplcm9zKSBpZiB5b3Ugd2FudCB0byBmaW5kIG91dCB3aGljaCBkZXNjcmlwdG9ycyBhcmUgcmVhZHkgd2l0aG91dAogICAgICAgICB3YWl0aW5nIGlmIG5vbmUgYXJlIHJlYWR5LgogICAgICAgICA8YnI+PGJyPiBUaGUgbm9ybWFsIHJldHVybiB2YWx1ZSBmcm9tIDxDT0RFPnNlbGVjdDwvQ09ERT4gaXMgdGhlIHRvdGFsIG51bWJlciBvZiByZWFkeSBmaWxlCiAgICAgICAgIGRlc2NyaXB0b3JzIGluIGFsbCBvZiB0aGUgc2V0cy4gIEVhY2ggb2YgdGhlIGFyZ3VtZW50IHNldHMgaXMgb3ZlcndyaXR0ZW4KICAgICAgICAgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGVzY3JpcHRvcnMgdGhhdCBhcmUgcmVhZHkgZm9yIHRoZSBjb3JyZXNwb25kaW5nCiAgICAgICAgIG9wZXJhdGlvbi4gIFRodXMsIHRvIHNlZSBpZiBhIHBhcnRpY3VsYXIgZGVzY3JpcHRvciA8VkFSPmRlc2M8L1ZBUj4gaGFzIGlucHV0LAogICAgICAgICB1c2UgPENPREU+RkRfSVNTRVQgKDxWQVI+ZGVzYzwvVkFSPiwgPFZBUj5yZWFkLWZkczwvVkFSPik8L0NPREU+IGFmdGVyIDxDT0RFPnNlbGVjdDwvQ09ERT4gcmV0dXJucy4KICAgICAgICAgPGJyPjxicj4gSWYgPENPREU+c2VsZWN0PC9DT0RFPiByZXR1cm5zIGJlY2F1c2UgdGhlIHRpbWVvdXQgcGVyaW9kIGV4cGlyZXMsIGl0IHJldHVybnMKICAgICAgICAgYSB2YWx1ZSBvZiB6ZXJvLgogICAgICAgICA8YnI+PGJyPiBBbnkgc2lnbmFsIHdpbGwgY2F1c2UgPENPREU+c2VsZWN0PC9DT0RFPiB0byByZXR1cm4gaW1tZWRpYXRlbHkuICBTbyBpZiB5b3VyCiAgICAgICAgIHByb2dyYW0gdXNlcyBzaWduYWxzLCB5b3UgY2FuJ3QgcmVseSBvbiA8Q09ERT5zZWxlY3Q8L0NPREU+IHRvIGtlZXAgd2FpdGluZwogICAgICAgICBmb3IgdGhlIGZ1bGwgdGltZSBzcGVjaWZpZWQuICBJZiB5b3Ugd2FudCB0byBiZSBzdXJlIG9mIHdhaXRpbmcgZm9yIGEKICAgICAgICAgcGFydGljdWxhciBhbW91bnQgb2YgdGltZSwgeW91IG11c3QgY2hlY2sgZm9yIDxDT0RFPkVJTlRSPC9DT0RFPiBhbmQgcmVwZWF0CiAgICAgICAgIHRoZSA8Q09ERT5zZWxlY3Q8L0NPREU+IHdpdGggYSBuZXdseSBjYWxjdWxhdGVkIHRpbWVvdXQgYmFzZWQgb24gdGhlIGN1cnJlbnQKICAgICAgICAgdGltZS4gIFNlZSB0aGUgZXhhbXBsZSBiZWxvdy4gIFNlZSBhbHNvIEludGVycnVwdGVkIFByaW1pdGl2ZXMuCiAgICAgICAgIDxicj48YnI+IElmIGFuIGVycm9yIG9jY3VycywgPENPREU+c2VsZWN0PC9DT0RFPiByZXR1cm5zIDxDT0RFPi0xPC9DT0RFPiBhbmQgZG9lcyBub3QgbW9kaWZ5CiAgICAgICAgIHRoZSBhcmd1bWVudCBmaWxlIGRlc2NyaXB0b3Igc2V0cy4gIFRoZSBmb2xsb3dpbmcgPENPREU+ZXJybm88L0NPREU+IGVycm9yCiAgICAgICAgIGNvbmRpdGlvbnMgYXJlIGRlZmluZWQgZm9yIHRoaXMgZnVuY3Rpb246CiAgICAgICAgIDxicj48YnI+IDxETD4KCiAgICAgICAgIDxEVD48Q09ERT5FQkFERjwvQ09ERT4KPEREPgogICAgICAgICBPbmUgb2YgdGhlIGZpbGUgZGVzY3JpcHRvciBzZXRzIHNwZWNpZmllZCBhbiBpbnZhbGlkIGZpbGUgZGVzY3JpcHRvci4KICAgICAgICAgPGJyPjxicj4gPExJPiBFSU5UUgogICAgICAgICBUaGUgb3BlcmF0aW9uIHdhcyBpbnRlcnJ1cHRlZCBieSBhIHNpZ25hbC4gIC4KICAgICAgICAgPGJyPjxicj4gPExJPiBFSU5WQUwKICAgICAgICAgVGhlIDxWQVI+dGltZW91dDwvVkFSPiBhcmd1bWVudCBpcyBpbnZhbGlkOyBvbmUgb2YgdGhlIGNvbXBvbmVudHMgaXMgbmVnYXRpdmUKICAgICAgICAgb3IgdG9vIGxhcmdlLgoKICAgICAgICBzcQB+AA8AAAABdwQAAAABdAALc3lzL3R5cGVzLmh4cQB+GEt0AFppbnQgbmZkcywgZmRfc2V0ICpyZWFkLWZkcywgZmRfc2V0ICp3cml0ZS1mZHMsIGZkX3NldCAqZXhjZXB0LWZkcywgc3RydWN0IHRpbWV2YWwgKnRpbWVvdXR0AANpbnR0AARzZW5kc3EAfgAKdAkgCiAgICAgICAgVGhlIDxDT0RFPnNlbmQ8L0NPREU+IGZ1bmN0aW9uIGlzIGxpa2UgPENPREU+d3JpdGU8L0NPREU+LCBidXQgd2l0aCB0aGUgYWRkaXRpb25hbAogICAgICAgICBmbGFncyA8VkFSPmZsYWdzPC9WQVI+LiAgVGhlIHBvc3NpYmxlIHZhbHVlcyBvZiA8VkFSPmZsYWdzPC9WQVI+IGFyZSBkZXNjcmliZWQKICAgICAgICAgaW4gU29ja2V0IERhdGEgT3B0aW9ucy4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgdHJhbnNtaXR0ZWQsIG9yIDxDT0RFPi0xPC9DT0RFPiBvbgogICAgICAgICBmYWlsdXJlLiAgSWYgdGhlIHNvY2tldCBpcyBub25ibG9ja2luZywgdGhlbiA8Q09ERT5zZW5kPC9DT0RFPiAobGlrZQogICAgICAgICA8Q09ERT53cml0ZTwvQ09ERT4pIGNhbiByZXR1cm4gYWZ0ZXIgc2VuZGluZyBqdXN0IHBhcnQgb2YgdGhlIGRhdGEuCiAgICAgICAgICwgZm9yIGluZm9ybWF0aW9uIGFib3V0IG5vbmJsb2NraW5nIG1vZGUuCiAgICAgICAgIDxicj48YnI+IE5vdGUsIGhvd2V2ZXIsIHRoYXQgYSBzdWNjZXNzZnVsIHJldHVybiB2YWx1ZSBtZXJlbHkgaW5kaWNhdGVzIHRoYXQKICAgICAgICAgdGhlIG1lc3NhZ2UgaGFzIGJlZW4gc2VudCB3aXRob3V0IGVycm9yLCBub3QgbmVjZXNzYXJpbHkgdGhhdCBpdCBoYXMKICAgICAgICAgYmVlbiByZWNlaXZlZCB3aXRob3V0IGVycm9yLgogICAgICAgICA8YnI+PGJyPiBUaGUgZm9sbG93aW5nIDxDT0RFPmVycm5vPC9DT0RFPiBlcnJvciBjb25kaXRpb25zIGFyZSBkZWZpbmVkIGZvciB0aGlzIGZ1bmN0aW9uOgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8RFQ+PENPREU+RUJBREY8L0NPREU+CjxERD4KICAgICAgICAgVGhlIDxWQVI+c29ja2V0PC9WQVI+IGFyZ3VtZW50IGlzIG5vdCBhIHZhbGlkIGZpbGUgZGVzY3JpcHRvci4KICAgICAgICAgPGJyPjxicj4gPExJPiBFSU5UUgogICAgICAgICBUaGUgb3BlcmF0aW9uIHdhcyBpbnRlcnJ1cHRlZCBieSBhIHNpZ25hbCBiZWZvcmUgYW55IGRhdGEgd2FzIHNlbnQuCiAgICAgICAgIC4KICAgICAgICAgPGJyPjxicj4gPExJPiBFTk9UU09DSwogICAgICAgICBUaGUgZGVzY3JpcHRvciA8VkFSPnNvY2tldDwvVkFSPiBpcyBub3QgYSBzb2NrZXQuCiAgICAgICAgIDxicj48YnI+IDxMST4gRU1TR1NJWkUKICAgICAgICAgVGhlIHNvY2tldCB0eXBlIHJlcXVpcmVzIHRoYXQgdGhlIG1lc3NhZ2UgYmUgc2VudCBhdG9taWNhbGx5LCBidXQgdGhlCiAgICAgICAgIG1lc3NhZ2UgaXMgdG9vIGxhcmdlIGZvciB0aGlzIHRvIGJlIHBvc3NpYmxlLgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVXT1VMREJMT0NLCiAgICAgICAgIE5vbmJsb2NraW5nIG1vZGUgaGFzIGJlZW4gc2V0IG9uIHRoZSBzb2NrZXQsIGFuZCB0aGUgd3JpdGUgb3BlcmF0aW9uCiAgICAgICAgIHdvdWxkIGJsb2NrLiAgKE5vcm1hbGx5IDxDT0RFPnNlbmQ8L0NPREU+IGJsb2NrcyB1bnRpbCB0aGUgb3BlcmF0aW9uIGNhbiBiZQogICAgICAgICBjb21wbGV0ZWQuKQogICAgICAgICA8YnI+PGJyPiA8TEk+IEVOT0JVRlMKICAgICAgICAgVGhlcmUgaXMgbm90IGVub3VnaCBpbnRlcm5hbCBidWZmZXIgc3BhY2UgYXZhaWxhYmxlLgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVOT1RDT05OCiAgICAgICAgIFlvdSBuZXZlciBjb25uZWN0ZWQgdGhpcyBzb2NrZXQuCiAgICAgICAgIDxicj48YnI+IDxMST4gRVBJUEUKICAgICAgICAgVGhpcyBzb2NrZXQgd2FzIGNvbm5lY3RlZCBidXQgdGhlIGNvbm5lY3Rpb24gaXMgbm93IGJyb2tlbi4gIEluIHRoaXMKICAgICAgICAgY2FzZSwgPENPREU+c2VuZDwvQ09ERT4gZ2VuZXJhdGVzIGEgPENPREU+U0lHUElQRTwvQ09ERT4gc2lnbmFsIGZpcnN0OyBpZiB0aGF0CiAgICAgICAgIHNpZ25hbCBpcyBpZ25vcmVkIG9yIGJsb2NrZWQsIG9yIGlmIGl0cyBoYW5kbGVyIHJldHVybnMsIHRoZW4KICAgICAgICAgPENPREU+c2VuZDwvQ09ERT4gZmFpbHMgd2l0aCA8Q09ERT5FUElQRTwvQ09ERT4uCgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIGlzIGRlZmluZWQgYXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgaW4gbXVsdGktdGhyZWFkZWQKICAgICAgICAgcHJvZ3JhbXMsIHNvIG9uZSBoYXMgdG8gYmUgcHJlcGFyZWQgZm9yIHRoaXMgYW5kIG1ha2Ugc3VyZSB0aGF0CiAgICAgICAgIGFsbG9jYXRlZCByZXNvdXJjZXMgKGxpa2UgbWVtb3J5LCBmaWxlcyBkZXNjcmlwdG9ycywgc2VtYXBob3JlcyBvcgogICAgICAgICB3aGF0ZXZlcikgYXJlIGZyZWVkIGV2ZW4gaWYgdGhlIHRocmVhZCBpcyBjYW5jZWxlZC4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAMc3lzL3NvY2tldC5oeHEAfhhSdAAwaW50IHNvY2tldCwgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzdAADaW50dAAHc2VuZG1zZ3NxAH4ACnQBLQogICAgICAgIDxicj48YnI+IFRoaXMgZnVuY3Rpb24gaXMgZGVmaW5lZCBhcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBpbiBtdWx0aS10aHJlYWRlZAogICAgICAgICBwcm9ncmFtcywgc28gb25lIGhhcyB0byBiZSBwcmVwYXJlZCBmb3IgdGhpcyBhbmQgbWFrZSBzdXJlIHRoYXQKICAgICAgICAgYWxsb2NhdGVkIHJlc291cmNlcyAobGlrZSBtZW1vcnksIGZpbGVzIGRlc2NyaXB0b3JzLCBzZW1hcGhvcmVzIG9yCiAgICAgICAgIHdoYXRldmVyKSBhcmUgZnJlZWQgZXZlbiBpZiB0aGUgdGhyZWFkIGlzIGNhbmNlbC4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAMc3lzL3NvY2tldC5oeHEAfhhZdAAzaW50IHNvY2tldCwgY29uc3Qgc3RydWN0IG1zZ2hkciAqbWVzc2FnZSwgaW50IGZsYWdzdAADaW50dAAGc2VuZHRvc3EAfgAKdAUDCiAgICAgICAgVGhlIDxDT0RFPnNlbmR0bzwvQ09ERT4gZnVuY3Rpb24gdHJhbnNtaXRzIHRoZSBkYXRhIGluIHRoZSA8VkFSPmJ1ZmZlcjwvVkFSPgogICAgICAgICB0aHJvdWdoIHRoZSBzb2NrZXQgPFZBUj5zb2NrZXQ8L1ZBUj4gdG8gdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3Mgc3BlY2lmaWVkCiAgICAgICAgIGJ5IHRoZSA8VkFSPmFkZHI8L1ZBUj4gYW5kIDxWQVI+bGVuZ3RoPC9WQVI+IGFyZ3VtZW50cy4gIFRoZSA8VkFSPnNpemU8L1ZBUj4gYXJndW1lbnQKICAgICAgICAgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgdHJhbnNtaXR0ZWQuCiAgICAgICAgIDxicj48YnI+IFRoZSA8VkFSPmZsYWdzPC9WQVI+IGFyZSBpbnRlcnByZXRlZCB0aGUgc2FtZSB3YXkgYXMgZm9yIDxDT0RFPnNlbmQ8L0NPREU+OyBzZWUKICAgICAgICAgU29ja2V0IERhdGEgT3B0aW9ucy4KICAgICAgICAgPGJyPjxicj4gVGhlIHJldHVybiB2YWx1ZSBhbmQgZXJyb3IgY29uZGl0aW9ucyBhcmUgYWxzbyB0aGUgc2FtZSBhcyBmb3IKICAgICAgICAgPENPREU+c2VuZDwvQ09ERT4sIGJ1dCB5b3UgY2Fubm90IHJlbHkgb24gdGhlIHN5c3RlbSB0byBkZXRlY3QgZXJyb3JzIGFuZAogICAgICAgICByZXBvcnQgdGhlbTsgdGhlIG1vc3QgY29tbW9uIGVycm9yIGlzIHRoYXQgdGhlIHBhY2tldCBpcyBsb3N0IG9yIHRoZXJlCiAgICAgICAgIGlzIG5vLW9uZSBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MgdG8gcmVjZWl2ZSBpdCwgYW5kIHRoZSBvcGVyYXRpbmcKICAgICAgICAgc3lzdGVtIG9uIHlvdXIgbWFjaGluZSB1c3VhbGx5IGRvZXMgbm90IGtub3cgdGhpcy4KICAgICAgICAgPGJyPjxicj4gSXQgaXMgYWxzbyBwb3NzaWJsZSBmb3Igb25lIGNhbGwgdG8gPENPREU+c2VuZHRvPC9DT0RFPiB0byByZXBvcnQgYW4gZXJyb3IKICAgICAgICAgb3dpbmcgdG8gYSBwcm9ibGVtIHJlbGF0ZWQgdG8gYSBwcmV2aW91cyBjYWxsLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIGlzIGRlZmluZWQgYXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgaW4gbXVsdGktdGhyZWFkZWQKICAgICAgICAgcHJvZ3JhbXMsIHNvIG9uZSBoYXMgdG8gYmUgcHJlcGFyZWQgZm9yIHRoaXMgYW5kIG1ha2Ugc3VyZSB0aGF0CiAgICAgICAgIGFsbG9jYXRlZCByZXNvdXJjZXMgKGxpa2UgbWVtb3J5LCBmaWxlcyBkZXNjcmlwdG9ycywgc2VtYXBob3JlcyBvcgogICAgICAgICB3aGF0ZXZlcikgYXJlIGZyZWVkIGV2ZW4gaWYgdGhlIHRocmVhZCBpcyBjYW5jZWxlZC4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAMc3lzL3NvY2tldC5oeHEAfhhgdABZaW50IHNvY2tldCwgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIHNvY2tsZW5fdCBsZW5ndGh0AANpbnR0AAZzZXRidWZzcQB+AAp0AikKICAgICAgICBJZiA8VkFSPmJ1ZjwvVkFSPiBpcyBhIG51bGwgcG9pbnRlciwgdGhlIGVmZmVjdCBvZiB0aGlzIGZ1bmN0aW9uIGlzCiAgICAgICAgIGVxdWl2YWxlbnQgdG8gY2FsbGluZyA8Q09ERT5zZXR2YnVmPC9DT0RFPiB3aXRoIGEgPFZBUj5tb2RlPC9WQVI+IGFyZ3VtZW50IG9mCiAgICAgICAgIDxDT0RFPl9JT05CRjwvQ09ERT4uICBPdGhlcndpc2UsIGl0IGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyA8Q09ERT5zZXR2YnVmPC9DT0RFPgogICAgICAgICB3aXRoIDxWQVI+YnVmPC9WQVI+LCBhbmQgYSA8VkFSPm1vZGU8L1ZBUj4gb2YgPENPREU+X0lPRkJGPC9DT0RFPiBhbmQgYSA8VkFSPnNpemU8L1ZBUj4KICAgICAgICAgYXJndW1lbnQgb2YgPENPREU+QlVGU0laPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gVGhlIDxDT0RFPnNldGJ1ZjwvQ09ERT4gZnVuY3Rpb24gaXMgcHJvdmlkZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgY29kZTsKICAgICAgICAgdXNlIDxDT0RFPnNldHZidWY8L0NPREU+IGluIGFsbCBuZXcgcHJvZ3JhbXMuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3N0ZGlvLmh4cQB+GGd0ABdGSUxFICpzdHJlYW0sIGNoYXIgKmJ1ZnQABHZvaWR0AAlzZXRidWZmZXJzcQB+AAp0AZYKICAgICAgICBJZiA8VkFSPmJ1ZjwvVkFSPiBpcyBhIG51bGwgcG9pbnRlciwgdGhpcyBmdW5jdGlvbiBtYWtlcyA8VkFSPnN0cmVhbTwvVkFSPiB1bmJ1ZmZlcmVkLgogICAgICAgICBPdGhlcndpc2UsIGl0IG1ha2VzIDxWQVI+c3RyZWFtPC9WQVI+IGZ1bGx5IGJ1ZmZlcmVkIHVzaW5nIDxWQVI+YnVmPC9WQVI+IGFzIHRoZQogICAgICAgICBidWZmZXIuICBUaGUgPFZBUj5zaXplPC9WQVI+IGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgbGVuZ3RoIG9mIDxWQVI+YnVmPC9WQVI+LgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkIEJTRCBjb2RlLiAgVXNlCiAgICAgICAgIDxDT0RFPnNldHZidWY8L0NPREU+IGluc3RlYWQuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3N0ZGlvLmh4cQB+GG50ACRGSUxFICpzdHJlYW0sIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemV0AAR2b2lkdAAKc2V0Y29udGV4dHNxAH4ACnQFJgogICAgICAgIDxicj48YnI+IFRoZSA8Q09ERT5zZXRjb250ZXh0PC9DT0RFPiBmdW5jdGlvbiByZXN0b3JlcyB0aGUgY29udGV4dCBkZXNjcmliZWQgYnkKICAgICAgICAgPFZBUj51Y3A8L1ZBUj4uICBUaGUgY29udGV4dCBpcyBub3QgbW9kaWZpZWQgYW5kIGNhbiBiZSByZXVzZWQgYXMgb2Z0ZW4gYXMKICAgICAgICAgd2FudGVkLgogICAgICAgICA8YnI+PGJyPiBJZiB0aGUgY29udGV4dCB3YXMgY3JlYXRlZCBieSA8Q09ERT5nZXRjb250ZXh0PC9DT0RFPiBleGVjdXRpb24gcmVzdW1lcyB3aXRoCiAgICAgICAgIHRoZSByZWdpc3RlcnMgZmlsbGVkIHdpdGggdGhlIHNhbWUgdmFsdWVzIGFuZCB0aGUgc2FtZSBzdGFjayBhcyBpZiB0aGUKICAgICAgICAgPENPREU+Z2V0Y29udGV4dDwvQ09ERT4gY2FsbCBqdXN0IHJldHVybmVkLgogICAgICAgICA8YnI+PGJyPiBJZiB0aGUgY29udGV4dCB3YXMgbW9kaWZpZWQgd2l0aCBhIGNhbGwgdG8gPENPREU+bWFrZWNvbnRleHQ8L0NPREU+IGV4ZWN1dGlvbgogICAgICAgICBjb250aW51ZXMgd2l0aCB0aGUgZnVuY3Rpb24gcGFzc2VkIHRvIDxDT0RFPm1ha2Vjb250ZXh0PC9DT0RFPiB3aGljaCBnZXRzIHRoZQogICAgICAgICBzcGVjaWZpZWQgcGFyYW1ldGVycyBwYXNzZWQuICBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgZXhlY3V0aW9uIGlzCiAgICAgICAgIHJlc3VtZWQgaW4gdGhlIGNvbnRleHQgd2hpY2ggd2FzIHJlZmVyZW5jZWQgYnkgdGhlIDxDT0RFPnVjX2xpbms8L0NPREU+CiAgICAgICAgIGVsZW1lbnQgb2YgdGhlIGNvbnRleHQgc3RydWN0dXJlIHBhc3NlZCB0byA8Q09ERT5tYWtlY29udGV4dDwvQ09ERT4gYXQgdGhlCiAgICAgICAgIHRpbWUgb2YgdGhlIGNhbGwuICBJZiA8Q09ERT51Y19saW5rPC9DT0RFPiB3YXMgYSBudWxsIHBvaW50ZXIgdGhlIGFwcGxpY2F0aW9uCiAgICAgICAgIHRlcm1pbmF0ZXMgaW4gdGhpcyBjYXNlLgogICAgICAgICA8YnI+PGJyPiBTaW5jZSB0aGUgY29udGV4dCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhY2sgbm8gdHdvIHRocmVhZHMKICAgICAgICAgc2hvdWxkIHVzZSB0aGUgc2FtZSBjb250ZXh0IGF0IHRoZSBzYW1lIHRpbWUuICBUaGUgcmVzdWx0IGluIG1vc3QgY2FzZXMKICAgICAgICAgd291bGQgYmUgZGlzYXN0cm91cy4KICAgICAgICAgPGJyPjxicj4gVGhlIDxDT0RFPnNldGNvbnRleHQ8L0NPREU+IGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiB1bmxlc3MgYW4gZXJyb3Igb2NjdXJyZWQKICAgICAgICAgaW4gd2hpY2ggY2FzZSBpdCByZXR1cm5zIDxDT0RFPi0xPC9DT0RFPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAKdWNvbnRleHQuaHhxAH4YdXQAFWNvbnN0IHVjb250ZXh0X3QgKnVjcHQAA2ludHQADXNldGRvbWFpbm5hbWVzcQB+AAp0AZEKICAgICAgICAgZG9tYWluIG5hbWUKICAgICAgICAgIGRvbWFpbiBuYW1lCiAgICAgICAgIDxicj48YnI+IDxDT0RFPmdldGRvbWFpbm5hbWU8L0NPREU+IHNldHMgdGhlIE5JUyAoYWthIFlQKSBkb21haW4gbmFtZSBvZiB0aGUgc3lzdGVtCiAgICAgICAgIG9uIHdoaWNoIGl0IGlzIGNhbGxlZC4gIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCB0aGUgbW9yZSBwb3B1bGFyIEROUwogICAgICAgICBkb21haW4gbmFtZS4gIFNldCB0aGF0IHdpdGggPENPREU+c2V0aG9zdG5hbWU8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBUaGUgc3BlY2lmaWNzIG9mIHRoaXMgZnVuY3Rpb24gYXJlIGFuYWxvZ291cyB0byA8Q09ERT5z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cGxhY2VkIGJ5IHRoZSBuZXcgb25lLgogICAgICAgICA8YnI+PGJyPiBQbGVhc2Ugbm90ZSB0aGF0IHlvdSBjYW5ub3QgcmVtb3ZlIGFuIGVudHJ5IGNvbXBsZXRlbHkgdXNpbmcgdGhpcyBmdW5jdGlvbi4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiB3YXMgb3JpZ2luYWxseSBwYXJ0IG9mIHRoZSBCU0QgbGlicmFyeSBidXQgaXMgbm93IHBhcnQgb2YKICAgICAgICAgdGhlIFVuaXggc3RhbmRhcmQuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHN0ZGxpYi5oeHEAfhiKdAAwY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUsIGludCByZXBsYWNldAADaW50dAAHc2V0ZXVpZHNxAH4ACnQEXwogICAgICAgIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgZWZmZWN0aXZlIHVzZXIgSUQgb2YgYSBwcm9jZXNzIHRvIDxWQVI+bmV3dWlkPC9WQVI+LAogICAgICAgICBwcm92aWRlZCB0aGF0IHRoZSBwcm9jZXNzIGlzIGFsbG93ZWQgdG8gY2hhbmdlIGl0cyBlZmZlY3RpdmUgdXNlciBJRC4gIEEKICAgICAgICAgcHJpdmlsZWdlZCBwcm9jZXNzIChlZmZlY3RpdmUgdXNlciBJRCB6ZXJvKSBjYW4gY2hhbmdlIGl0cyBlZmZlY3RpdmUKICAgICAgICAgdXNlciBJRCB0byBhbnkgbGVnYWwgdmFsdWUuICBBbiB1bnByaXZpbGVnZWQgcHJvY2VzcyB3aXRoIGEgZmlsZSB1c2VyIElECiAgICAgICAgIGNhbiBjaGFuZ2UgaXRzIGVmZmVjdGl2ZSB1c2VyIElEIHRvIGl0cyByZWFsIHVzZXIgSUQgb3IgdG8gaXRzIGZpbGUgdXNlcgogICAgICAgICBJRC4gIE90aGVyd2lzZSwgYSBwcm9jZXNzIG1heSBub3QgY2hhbmdlIGl0cyBlZmZlY3RpdmUgdXNlciBJRCBhdCBhbGwuCiAgICAgICAgIDxicj48YnI+IFRoZSA8Q09ERT5zZXRldWlkPC9DT0RFPiBmdW5jdGlvbiByZXR1cm5z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bml0aWFsaXplcyBhIHN0cmVhbSBmb3IgcmVhZGluZyBmcm9tIHRoZSBncm91cCBkYXRhIGJhc2UuCiAgICAgICAgIFlvdSB1c2UgdGhpcyBzdHJlYW0gYnkgY2FsbGluZyA8Q09ERT5nZXRncmVudDwvQ09ERT4gb3IgPENPREU+Z2V0Z3JlbnRfcjwvQ09ERT4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQABWdycC5oeHEAfhimdAAEdm9pZHQABHZvaWR0AAlzZXRncm91cHNzcQB+AAp0AiQKICAgICAgICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHByb2Nlc3MncyBzdXBwbGVtZW50YXJ5IGdyb3VwIElEcy4gIEl0IGNhbiBvbmx5CiAgICAgICAgIGJlIGNhbGxlZCBmcm9tIHByaXZpbGVnZWQgcHJvY2Vzc2VzLiAgVGhlIDxWQVI+Y291bnQ8L1ZBUj4gYXJndW1lbnQgc3BlY2lmaWVzCiAgICAgICAgIHRoZSBudW1iZXIgb2YgZ3JvdXAgSURzIGluIHRoZSBhcnJheSA8VkFSPmdyb3VwczwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIDxDT0RFPjA8L0NPREU+IGlmIHN1Y2Nlc3NmdWwgYW5kIDxDT0RFPi0xPC9DT0RFPiBvbiBlcnJvci4KICAgICAgICAgVGhlIGZvbGxvd2luZyA8Q09ERT5lcnJubzwvQ09ERT4gZXJyb3IgY29uZGl0aW9ucyBhcmUgZGVmaW5lZCBmb3IgdGhpcwogICAgICAgICBmdW5jdGlvbjoKICAgICAgICAgPGJyPjxicj4gPERMPgoKICAgICAgICAgPERUPjxDT0RFPkVQRVJNPC9DT0RFPgo8REQ+CiAgICAgICAgIFRoZSBjYWxsaW5nIHByb2Nlc3MgaXMgbm90IHByaXZpbGVnZWQuCgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAVncnAuaHhxAH4YrXQAG3NpemVfdCBjb3VudCwgZ2lkX3QgKmdyb3Vwc3QAA2ludHQACnNldGhvc3RlbnRzcQB+AAp0AhUKICAgICAgICBUaGlzIGZ1bmN0aW9uIG9wZW5zIHRoZSBob3N0cyBkYXRhYmFzZSB0byBiZWdpbiBzY2FubmluZyBpdC4gIFlvdSBjYW4KICAgICAgICAgdGhlbiBjYWxsIDxDT0RFPmdldGhvc3RlbnQ8L0NPREU+IHRvIHJlYWQgdGhlIGVudHJpZXMuCiAgICAgICAgIDxicj48YnI+IElmIHRoZSA8VkFSPnN0YXlvcGVuPC9WQVI+IGFyZ3VtZW50IGlzIG5vbnplcm8sIHRoaXMgc2V0cyBhIGZsYWcgc28gdGhhdAogICAgICAgICBzdWJzZXF1ZW50IGNhbGxzIHRvIDxDT0RFPmdldGhvc3RieW5hbWU8L0NPREU+IG9yIDxDT0RFPmdldGhvc3RieWFkZHI8L0NPREU+IHdpbGwKICAgICAgICAgbm90IGNsb3NlIHRoZSBkYXRhYmFzZSAoYXMgdGhleSB1c3VhbGx5IHdvdWxkKS4gIFRoaXMgbWFrZXMgZm9yIG1vcmUKICAgICAgICAgZWZmaWNpZW5jeSBpZiB5b3UgY2FsbCB0aG9zZSBmdW5jdGlvbnMgc2V2ZXJhbCB0aW1lcywgYnkgYXZvaWRpbmcKICAgICAgICAgcmVvcGVuaW5nIHRoZSBkYXRhYmFzZSBmb3IgZWFjaCBjYWxsLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAduZXRkYi5oeHEAfhi0dAAMaW50IHN0YXlvcGVudAAEdm9pZHQACXNldGhvc3RpZHNxAH4ACnQEjwogICAgICAgIFRoZSA8Q09ERT5zZXRob3N0aWQ8L0NPREU+IGZ1bmN0aW9uIHNldHMgdGhlIGBgaG9zdCBJRCcnIG9mIHRoZSBob3N0IG1hY2hpbmUKICAgICAgICAgdG8gPFZBUj5pZDwvVkFSPi4gIE9ubHkgcHJpdmlsZWdlZCBwcm9jZXNzZXMgYXJlIHBlcm1pdHRlZCB0byBkbyB0aGlzLiAgVXN1YWxseQogICAgICAgICBpdCBoYXBwZW5zIGp1c3Qgb25jZSwgYXQgc3lzdGVtIGJvb3QgdGltZS4KICAgICAgICAgPGJyPjxicj4gVGhlIHByb3BlciB3YXkgdG8gZXN0YWJsaXNoIHRoZSBwcmltYXJ5IElQIGFkZHJlc3Mgb2YgYSBzeXN0ZW0KICAgICAgICAgaXMgdG8gY29uZmlndXJlIHRoZSBJUCBhZGRyZXNzIHJlc29sdmVyIHRvIGFzc29jaWF0ZSB0aGF0IElQIGFkZHJlc3Mgd2l0aAogICAgICAgICB0aGUgc3lzdGVtJ3MgaG9zdCBuYW1lIGFzIHJldHVybmVkIGJ5IDxDT0RFPmdldGhvc3RuYW1lPC9DT0RFPi4gIEZvciBleGFtcGxlLAogICAgICAgICBwdXQgYSByZWNvcmQgZm9yIHRoZSBzeXN0ZW0gaW4gPFRUPi9ldGMvaG9zdHM8L1RUPi4KICAgICAgICAgPGJyPjxicj4gU2VlIDxDT0RFPmdldGhvc3RpZDwvQ09ERT4gYWJvdmUgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG9zdCBpZHMuCiAgICAgICAgIDxicj48YnI+IFRoZSByZXR1cm4gdmFsdWUgaXMgPENPREU+MDwvQ09ERT4gb24gc3VjY2VzcyBhbmQgPENPREU+LTE8L0NPREU+IG9uIGZhaWx1cmUuCiAgICAgICAgIFRoZSBmb2xsb3dpbmcgPENPREU+ZXJybm88L0NPREU+IGVycm9yIGNvbmRpdGlvbnMgYXJlIGRlZmluZWQgZm9yIHRoaXMgZnVuY3Rpb246CiAgICAgICAgIDxicj48YnI+IDxETD4KCiAgICAgICAgIDxEVD48Q09ERT5FUEVSTTwvQ09ERT4KPEREPgogICAgICAgICBUaGlzIHByb2Nlc3MgY2Fubm90IHNldCB0aGUgaG9zdCBuYW1lIGJlY2F1c2UgaXQgaXMgbm90IHByaXZpbGVnZWQuCiAgICAgICAgIDxicj48YnI+IDxMST4gRU5PU1lTCiAgICAgICAgIFRoZSBvcGVyYXRpbmcgc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgc2V0dGluZyB0aGUgaG9zdCBJRC4gIE9uIHNvbWUKICAgICAgICAgc3lzdGVtcywgdGhlIGhvc3QgSUQgaXMgYSBtZWFuaW5nbGVzcyBidXQgdW5pcXVlIG51bWJlciBoYXJkLWNvZGVkIGZvcgogICAgICAgICBlYWNoIG1hY2hpbmUuCgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAh1bmlzdGQuaHhxAH4Yu3QAC2xvbmcgaW50IGlkdAADaW50dAALc2V0aG9zdG5hbWVzcQB+AAp0A5EKICAgICAgICBUaGUgPENPREU+c2V0aG9zdG5hbWU8L0NPREU+IGZ1bmN0aW9uIHNldHMgdGhlIGhvc3QgbmFtZSBvZiB0aGUgc3lzdGVtIHRoYXQKICAgICAgICAgY2FsbHMgaXQgdG8gPFZBUj5uYW1lPC9WQVI+LCBhIHN0cmluZyB3aXRoIGxlbmd0aCA8VkFSPmxlbmd0aDwvVkFSPi4gIE9ubHkKICAgICAgICAgcHJpdmlsZWdlZCBwcm9jZXNzZXMgYXJlIHBlcm1pdHRlZCB0byBkbyB0aGlzLgogICAgICAgICA8YnI+PGJyPiBVc3VhbGx5IDxDT0RFPnNldGhvc3RuYW1lPC9DT0RFPiBnZXRzIGNhbGxlZCBqdXN0IG9uY2UsIGF0IHN5c3RlbSBib290IHRpbWUuCiAgICAgICAgIE9mdGVuLCB0aGUgcHJvZ3JhbSB0aGF0IGNhbGxzIGl0IHNldHMgaXQgdG8gdGhlIHZhbHVlIGl0IGZpbmRzIGluIHRoZQogICAgICAgICBmaWxlIDxDT0RFPi9ldGMvaG9zdG5hbWU8L0NPREU+LgogICAgICAgICAvZXRjL2hvc3RuYW1lCiAgICAgICAgIDxicj48YnI+IEJlIHN1cmUgdG8gc2V0IHRoZSBob3N0IG5hbWUgdG8gdGhlIGZ1bGwgaG9zdCBuYW1lLCBub3QganVzdCB0aGUgRE5TCiAgICAgICAgIGhvc3RuYW1lIChzZWUgYWJvdmUpLgogICAgICAgICA8YnI+PGJyPiBUaGUgcmV0dXJuIHZhbHVlIGlzIDxDT0RFPjA8L0NPREU+IG9uIHN1Y2Nlc3MgYW5kIDxDT0RFPi0xPC9DT0RFPiBvbiBmYWlsdXJlLgogICAgICAgICBUaGUgZm9sbG93aW5nIDxDT0RFPmVycm5vPC9DT0RFPiBlcnJvciBjb25kaXRpb24gaXMgZGVmaW5lZCBmb3IgdGhpcyBmdW5jdGlvbjoKICAgICAgICAgPGJyPjxicj4gPERMPgoKICAgICAgICAgPERUPjxDT0RFPkVQRVJNPC9DT0RFPgo8REQ+CiAgICAgICAgIFRoaXMgcHJvY2VzcyBjYW5ub3Qgc2V0IHRoZSBob3N0IG5hbWUgYmVjYXVzZSBpdCBpcyBub3Qg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IGFuCiAgICAgICAgIHNpbmdsZSBwdXJwb3NlIC4KICAgICAgICAgPGJyPjxicj4gWW91IGNhbiBhbHNvIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGZpbmQgb3V0IHRoZSBjdXJyZW50IGxvY2FsZSBieSBwYXNzaW5nCiAgICAgICAgIGEgbnVsbCBwb2ludGVyIGFzIHRoZSA8VkFSPmxvY2FsZTwvVkFSPiBhcmd1bWVudC4gIEluIHRoaXMgY2FzZSwKICAgICAgICAgPENPREU+c2V0bG9jYWxlPC9DT0RFPiByZXR1cm5zIGEgc3RyaW5nIHRoYXQgaXMgdGhlIG5hbWUgb2YgdGhlIGxvY2FsZQogICAgICAgICBjdXJyZW50bHkgc2VsZWN0ZWQgZm9yIGNhdGVnb3J5IDxWQVI+Y2F0ZWdvcnk8L1ZBUj4uCiAgICAgICAgIDxicj48YnI+IFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgPENPREU+c2V0bG9jYWxlPC9DT0RFPiBjYW4gYmUgb3ZlcndyaXR0ZW4gYnkgc3Vic2VxdWVudAogICAgICAgICBjYWxscywgc28geW91IHNob3VsZCBtYWtlIGEgY29weSBvZiB0aGUgc3RyaW5nICBpZiB5b3Ugd2FudCB0byBzYXZlIGl0IHBhc3QgYW55IGZ1cnRoZXIgY2FsbHMgdG8KICAgICAgICAgPENPREU+c2V0bG9jYWxlPC9DT0RFPi4gIChUaGUgc3RhbmRhcmQgbGlicmFyeSBpcyBndWFyYW50ZWVkIG5ldmVyIHRvIGNhbGwKICAgICAgICAgPENPREU+c2V0bG9jYWxlPC9DT0RFPiBpdHNlbGYuKQogICAgICAgICA8YnI+PGJyPiBZb3Ugc2hvdWxkIG5vdCBtb2RpZnkgdGhlIHN0cmluZyByZXR1cm5lZCBieSA8Q09ERT5zZXRsb2NhbGU8L0NPREU+LiAgSXQgbWlnaHQKICAgICAgICAgYmUgdGhlIHNhbWUgc3RyaW5nIHRoYXQgd2FzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCBpbiBhIHByZXZpb3VzIGNhbGwgdG8KICAgICAgICAgPENPREU+c2V0bG9jYWxlPC9DT0RFPi4gIE9uZSByZXF1aXJlbWVudCBpcyB0aGF0IHRoZSA8VkFSPmNhdGVnb3J5PC9WQVI+IG11c3QgYmUKICAgICAgICAgdGhlIHNhbWUgaW4gdGhlIGNhbGwgdGhlIHN0cmluZyB3YXMgcmV0dXJuZWQgYW5kIHRoZSBvbmUgd2hlbiB0aGUgc3RyaW5nCiAgICAgICAgIGlzIHBhc3NlZCBpbiBhcyA8VkFSPmxvY2FsZTwvVkFSPiBwYXJhbWV0ZXIuCiAgICAgICAgIDxicj48YnI+IFdoZW4geW91IHJlYWQgdGhlIGN1cnJlbnQgbG9jYWxlIGZvciBjYXRlZ29yeSA8Q09ERT5MQ19BTEw8L0NPREU+LCB0aGUgdmFsdWUKICAgICAgICAgZW5jb2RlcyB0aGUgZW50aXJlIGNvbWJpbmF0aW9uIG9mIHNlbGVjdGVkIGxvY2FsZXMgZm9yIGFsbCBjYXRlZ29yaWVzLgogICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSB2YWx1ZSBpcyBub3QganVzdCBhIHNpbmdsZSBsb2NhbGUgbmFtZS4gIEluIGZhY3QsIHdlCiAgICAgICAgIGRvbid0IG1ha2UgYW55IHByb21pc2VzIGFib3V0IHdoYXQgaXQgbG9va3MgbGlrZS4gIEJ1dCBpZiB5b3Ugc3BlY2lmeQogICAgICAgICB0aGUgc2FtZSBgYGxvY2FsZSBuYW1lJycgd2l0aCA8Q09ERT5MQ19BTEw8L0NPREU+IGluIGEgc3Vic2VxdWVudCBjYWxsIHRvCiAgICAgICAgIDxDT0RFPnNldGxvY2FsZTwvQ09ERT4sIGl0IHJlc3RvcmVzIHRoZSBzYW1lIGNvbWJpbmF0aW9uIG9mIGxvY2FsZSBzZWxlY3Rpb25zLgogICAgICAgICA8YnI+PGJyPiBUbyBiZSBzdXJlIHlvdSBjYW4gdXNlIHRoZSByZXR1cm5lZCBzdHJpbmcgZW5jb2RpbmcgdGhlIGN1cnJlbnRseSBzZWxlY3RlZAogICAgICAgICBsb2NhbGUgYXQgYSBsYXRlciB0aW1lLCB5b3UgbXVzdCBtYWtlIGEgY29weSBvZiB0aGUgc3RyaW5nLiAgSXQgaXMgbm90CiAgICAgICAgIGd1YXJhbnRlZWQgdGhhdCB0aGUgcmV0dXJuZWQgcG9pbnRlciByZW1haW5zIHZhbGlkIG92ZXIgdGltZS4KICAgICAgICAgPGJyPjxicj4gV2hlbiB0aGUgPFZBUj5sb2NhbGU8L1ZBUj4gYXJndW1lbnQgaXMgbm90IGEgbnVsbCBwb2ludGVyLCB0aGUgc3RyaW5nIHJldHVybmVkCiAgICAgICAgIGJ5IDxDT0RFPnNldGxvY2FsZTwvQ09ERT4gcmVmbGVjdHMgdGhlIG5ld2x5LW1vZGlmaWVkIGxvY2FsZS4KICAgICAgICAgPGJyPjxicj4gSWYgeW91IHNwZWNpZnkgYW4gZW1wdHkgc3RyaW5nIGZvciA8VkFSPmxvY2FsZTwvVkFSPiwgdGhpcyBtZWFucyB0byByZWFkIHRoZQogICAgICAgICBhcHByb3ByaWF0ZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBhbmQgdXNlIGl0cyB2YWx1ZSB0byBzZWxlY3QgdGhlIGxvY2FsZQogICAgICAgICBmb3IgPFZBUj5jYXRlZ29yeTwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gSWYgYSBub25lbXB0eSBzdHJpbmcgaXMgZ2l2ZW4gZm9yIDxWQVI+bG9jYWxlPC9WQVI+LCB0aGVuIHRoZSBsb2NhbGUgb2YgdGhhdAogICAgICAgICBuYW1lIGlzIHVzZWQgaWYgcG9zc2libGUuCiAgICAgICAgIDxicj48YnI+IElmIHlvdSBzcGVjaWZ5IGFuIGludmFsaWQgbG9jYWxlIG5hbWUsIDxDT0RFPnNldGxvY2FsZTwvQ09ERT4gcmV0dXJucyBhIG51bGwKICAgICAgICAgcG9pbnRlciBhbmQgbGVhdmVzIHRoZSBjdXJyZW50IGxvY2FsZSB1bmNoYW5nZWQuCiAgICAgICAgc3EAfgAPAAAAAncEAAAAAnQACHVuaXN0ZC5odAAIbG9jYWxlLmh4cQB+GOZ0ACBpbnQgY2F0ZWdvcnksIGNvbnN0IGNoYXIgKmxvY2FsZXQABmNoYXIgKnQACnNldGxvZ21hc2tzcQB+AAp0CAwKICAgICAgICA8YnI+PGJyPiA8Q09ERT5zZXRsb2dtYXNrPC9DT0RFPiBzZXRzIGEgbWFzayAodGhlIGBgbG9nbWFzaycnKSB0aGF0IGRldGVybWluZXMgd2hpY2gKICAgICAgICAgZnV0dXJlIDxDT0RFPnN5c2xvZzwvQ09ERT4gY2FsbHMgc2hhbGwgYmUgaWdub3JlZC4gIElmIGEgcHJvZ3JhbSBoYXMgbm90CiAgICAgICAgIGNhbGxlZCA8Q09ERT5zZXRsb2dtYXNrPC9DT0RFPiwgPENPREU+c3lzbG9nPC9DT0RFPiBkb2Vzbid0IGlnbm9yZSBhbnkgY2FsbHMuICBZb3UKICAgICAgICAgY2FuIHVzZSA8Q09ERT5zZXRsb2dtYXNrPC9DT0RFPiB0byBzcGVjaWZ5IHRoYXQgbWVzc2FnZXMgb2YgcGFydGljdWxhcgogICAgICAgICBwcmlvcml0aWVzIHNoYWxsIGJlIGlnbm9yZWQgaW4gdGhlIGZ1dHVyZS4KICAgICAgICAgPGJyPjxicj4gQSA8Q09ERT5zZXRsb2dtYXNrPC9DT0RFPiBjYWxsIG92ZXJyaWRlcyBhbnkgcHJldmlvdXMgPENPREU+c2V0bG9nbWFzazwvQ09ERT4gY2FsbC4KICAgICAgICAgPGJyPjxicj4gTm90ZSB0aGF0IHRoZSBsb2dtYXNrIGV4aXN0cyBlbnRpcmVseSBpbmRlcGVuZGVudGx5IG9mIG9wZW5pbmcgYW5kCiAgICAgICAgIGNsb3Npbmcgb2YgU3lzbG9nIGNvbm5lY3Rpb25zLgogICAgICAgICA8YnI+PGJyPiBTZXR0aW5nIHRoZSBsb2dtYXNrIGhhcyBhIHNpbWlsYXIgZWZmZWN0IHRvLCBidXQgaXMgbm90IHRoZSBzYW1lIGFzLAogICAgICAgICBjb25maWd1cmluZyBTeXNsb2cuICBUaGUgU3lzbG9nIGNvbmZpZ3VyYXRpb24gbWF5IGNhdXNlIFN5c2xvZyB0bwogICAgICAgICBkaXNjYXJkIGNlcnRhaW4gbWVzc2FnZXMgaXQgcmVjZWl2ZXMsIGJ1dCB0aGUgbG9nbWFzayBjYXVzZXMgY2VydGFpbgogICAgICAgICBtZXNzYWdlcyBuZXZlciB0byBnZXQgc3VibWl0dGVkIHRvIFN5c2xvZyBpbiB0aGUgZmlyc3QgcGxhY2UuCiAgICAgICAgIDxicj48YnI+IDxWQVI+bWFzazwvVkFSPiBpcyBhIGJpdCBzdHJpbmcgd2l0aCBvbmUgYml0IGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBvZiB0aGUKICAgICAgICAgcG9zc2libGUgbWVzc2FnZSBwcmlvcml0aWVzLiAgSWYgdGhlIGJpdCBpcyBvbiwgPENPREU+c3lzbG9nPC9DT0RFPiBoYW5kbGVzCiAgICAgICAgIG1lc3NhZ2VzIG9mIHRoYXQgcHJpb3JpdHkgbm9ybWFsbHkuICBJZiBpdCBpcyBvZmYsIDxDT0RFPnN5c2xvZzwvQ09ERT4KICAgICAgICAgZGlzY2FyZHMgbWVzc2FnZXMgb2YgdGhhdCBwcmlvcml0eS4gIFVzZSB0aGUgbWVzc2FnZSBwcmlvcml0eSBtYWNyb3MKICAgICAgICAgZGVzY3JpYmVkIGluIHN5c2xvZzsgdnN5c2xvZyBhbmQgdGhlIDxDT0RFPkxPR19NQVNLPC9DT0RFPiB0byBjb25zdHJ1Y3QKICAgICAgICAgYW4gYXBwcm9wcmlhdGUgPFZBUj5tYXNrPC9WQVI+IHZhbHVlLCBhcyBpbiB0aGlzIGV4YW1wbGU6CiAgICAgICAgIDxicj48YnI+IDxwcmU+PGJyPgogICAgICAgICBMT0dfTUFTSyhMT0dfRU1FUkcpIHwgTE9HX01BU0soTE9HX0VSUk9SKTxicj4KICAgICAgICAgPC9wcmU+PGJyPgogICAgICAgICA8YnI+PGJyPiBvcjxicj4KICAgICAgICAgPGJyPjxicj4gPHByZT48YnI+CiAgICAgICAgIH4oTE9HX01BU0soTE9HX0lORk8pKTxicj4KICAgICAgICAgPC9wcmU+PGJyPgogICAgICAgICA8YnI+PGJyPiBUaGVyZSBpcyBhbHNvIGEgPENPREU+TE9HX1VQVE88L0NPREU+IG1hY3JvLCB3aGljaCBnZW5lcmF0ZXMgYSBtYXNrIHdpdGggdGhlIGJpdHM8YnI+CiAgICAgICAgIG9uIGZvciBhIGNlcnRhaW4gcHJpb3JpdHkgYW5kIGFsbCBwcmlvcml0aWVzIGFib3ZlIGl0Ojxicj4KICAgICAgICAgPGJyPjxicj4gPHByZT48YnI+CiAgICAgICAgIExPR19VUFRPKExPR19FUlJPUik8YnI+CiAgICAgICAgIDwvcHJlPgogICAgICAgICA8YnI+PGJyPiBUaGUgdW5mb3J0dW5hdGUgbmFtaW5nIG9mIHRoZSBtYWNybyBpcyBkdWUgdG8gdGhlIGZhY3QgdGhhdCBpbnRlcm5hbGx5LAogICAgICAgICBoaWdoZXIgbnVtYmVycyBhcmUgdXNlZCBmb3IgbG93ZXIgbWVzc2FnZSBwcmlvcml0aWVzLgogICAgICAgICA8YnI+PGJyPgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAhzeXNsb2cuaHhxAH4Y7nQACGludCBtYXNrdAADaW50dAAJc2V0bW50ZW50c3EAfgAKdALHCiAgICAgICAgVGhlIDxDT0RFPnNldG1udGVudDwvQ09ERT4gZnVuY3Rpb24gcHJlcGFyZXMgdGhlIGZpbGUgbmFtZWQgPFZBUj5GSUxFPC9WQVI+IHdoaWNoCiAgICAgICAgIG11c3QgYmUgaW4gdGhlIGZvcm1hdCBvZiBhIDxUVD5mc3RhYjwvVFQ+IGFuZCA8VFQ+bXRhYjwvVFQ+IGZpbGUgZm9yIHRoZQogICAgICAgICB1cGNvbWluZyBwcm9jZXNzaW5nIHRocm91Z2ggdGhlIG90aGVyIGZ1bmN0aW9ucyBvZiB0aGUgZmFtaWx5LiAgVGhlCiAgICAgICAgIDxWQVI+bW9kZTwvVkFSPiBwYXJhbWV0ZXIgY2FuIGJlIGNob3NlbiBpbiB0aGUgd2F5IHRoZSA8VkFSPm9wZW50eXBlPC9WQVI+CiAgICAgICAgIHBhcmFtZXRlciBmb3IgPENPREU+Zm9wZW48L0NPREU+ICBjYW4gYmUgY2hvc2VuLiAgSWYKICAgICAgICAgdGhlIGZpbGUgaXMgb3BlbmVkIGZvciB3cml0aW5nIHRoZSBmaWxlIGlzIGFsc28gYWxsb3dlZCB0byBiZSBlbXB0eS4KICAgICAgICAgPGJyPjxicj4gSWYgdGhlIGZpbGUgd2FzIHN1Y2Nlc3NmdWxseSBvcGVuZWQgPENPREU+c2V0bW50ZW50PC9DT0RFPiByZXR1cm5zIGEgZmlsZQogICAgICAgICBkZXNjcmlwdG9yIGZvciBmdXR1cmUgdXNlLiAgT3RoZXJ3aXNlIHRoZSByZXR1cm4gdmFsdWUgaXMgPENPREU+TlVMTDwvQ09ERT4KICAgICAgICAgYW5kIDxDT0RFPmVycm5vPC9DT0RFPiBpcyBzZXQgYWNjb3JkaW5nbHkuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACG1udGVudC5oeHEAfhj1dAAiY29uc3QgY2hhciAqZmlsZSwgY29uc3QgY2hhciAqbW9kZXQABkZJTEUgKnQACXNldG5ldGVudHNxAH4ACnQBxAogICAgICAgIFRoaXMgZnVuY3Rpb24gb3BlbnMgYW5kIHJld2luZHMgdGhlIG5ldHdvcmtzIGRhdGFiYXNlLgogICAgICAgICA8YnI+PGJyPiBJZiB0aGUgPFZBUj5zdGF5b3BlbjwvVkFSPiBhcmd1bWVudCBpcyBub256ZXJvLCB0aGlzIHNldHMgYSBmbGFnIHNvIHRoYXQKICAgICAgICAgc3Vic2VxdWVudCBjYWxscyB0byA8Q09ERT5nZXRuZXRieW5hbWU8L0NPREU+IG9yIDxDT0RFPmdldG5ldGJ5YWRkcjwvQ09ERT4gd2lsbAogICAgICAgICBub3QgY2xvc2UgdGhlIGRhdGFiYXNlIChhcyB0aGV5IHVzdWFsbHkgd291bGQpLiAgVGhpcyBtYWtlcyBmb3IgbW9yZQogICAgICAgICBlZmZpY2llbmN5IGlmIHlvdSBjYWxsIHRob3NlIGZ1bmN0aW9ucyBzZXZlcmFsIHRpbWVzLCBieSBhdm9pZGluZwogICAgICAgICByZW9wZW5pbmcgdGhlIGRhdGFiYXNlIGZvciBlYWNoIGNhbGwuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB25ldGRiLmh4cQB+GPx0AAxpbnQgc3RheW9wZW50AAR2b2lkdAALc2V0bmV0Z3JlbnRzcQB+AAp0AegKICAgICAgICBBIGNhbGwgdG8gdGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIGxpYnJhcnkgdG8KICAgICAgICAgYWxsb3cgZm9sbG93aW5nIGNhbGxzIG9mIHRoZSA8Q09ERT5nZXRuZXRncmVudDwvQ09ERT4gdG8gaXRlcmF0ZSBvdmVyIGFsbCBlbnRyaWVzCiAgICAgICAgIGluIHRoZSBuZXRncm91cCB3aXRoIG5hbWUgPFZBUj5uZXRncm91cDwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gV2hlbiB0aGUgY2FsbCBpcyBzdWNjZXNzZnVsIChpLmUuLCB3aGVuIGEgbmV0Z3JvdXAgd2l0aCB0aGlzIG5hbWUgZXhpc3RzKQogICAgICAgICB0aGUgcmV0dXJuIHZhbHVlIGlzIDxDT0RFPjE8L0NPREU+LiAgV2hlbiB0aGUgcmV0dXJuIHZhbHVlIGlzIDxDT0RFPjA8L0NPREU+IG5vCiAgICAgICAgIG5ldGdyb3VwIG9mIHRoaXMgbmFtZSBpcyBrbm93biBvciBzb21lIG90aGVyIGVycm9yIG9jY3VycmVkLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAduZXRkYi5oeHEAfhkDdAAUY29uc3QgY2hhciAqbmV0Z3JvdXB0AANpbnR0AAdzZXRwZ2lkc3EAfgAKdAWcCiAgICAgICAgVGhlIDxDT0RFPnNldHBnaWQ8L0NPREU+IGZ1bmN0aW9uIHB1dHMgdGhlIHByb2Nlc3MgPFZBUj5waWQ8L1ZBUj4gaW50byB0aGUgcHJvY2VzcwogICAgICAgICBncm91cCA8VkFSPnBnaWQ8L1ZBUj4uICBBcyBhIHNwZWNpYWwgY2FzZSwgZWl0aGVyIDxWQVI+cGlkPC9WQVI+IG9yIDxWQVI+cGdpZDwvVkFSPiBjYW4KICAgICAgICAgYmUgemVybyB0byBpbmRpY2F0ZSB0aGUgcHJvY2VzcyBJRCBvZiB0aGUgY2FsbGluZyBwcm9jZXNzLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIGZhaWxzIG9uIGEgc3lzdGVtIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCBqb2IgY29udHJvbC4KICAgICAgICAgLCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAgICAgICAgPGJyPjxicj4gSWYgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLCA8Q09ERT5zZXRwZ2lkPC9DT0RFPiByZXR1cm5zIHplcm8uICBPdGhlcndpc2UKICAgICAgICAgaXQgcmV0dXJucyA8Q09ERT4tMTwvQ09ERT4uICBUaGUgZm9sbG93aW5nIDxDT0RFPmVycm5vPC9DT0RFPiBlcnJvciBjb25kaXRpb25zIGFyZQog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ZSBjYWxsIHdvdWxkIHNldCB0aGUgbmljZSB2YWx1ZSBvZiBhIHByb2Nlc3Mgd2hpY2ggaXMgb3duZWQgYnkgYSBkaWZmZXJlbnQKICAgICAgICAgdXNlciB0aGFuIHRoZSBjYWxsaW5nIHByb2Nlc3MgKGkuZS4sIHRoZSB0YXJnZXQgcHJvY2VzcycgcmVhbCBvciBlZmZlY3RpdmUKICAgICAgICAgdWlkIGRvZXMgbm90IG1hdGNoIHRoZSBjYWxsaW5nIHByb2Nlc3MnIGVmZmVjdGl2ZSB1aWQpIGFuZCB0aGUgY2FsbGluZwogICAgICAgICBwcm9jZXNzIGRvZXMgbm90IGhhdmUgPENPREU+Q0FQX1NZU19OSUNFPC9DT0RFPiBwZXJtaXNzaW9uLgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVBQ0NFUwogICAgICAgICBUaGUgY2FsbCB3b3VsZCBsb3dlciB0aGUgcHJvY2VzcycgbmljZSB2YWx1ZSBhbmQgdGhlIHByb2Nlc3MgZG9lcyBub3QgaGF2ZQogICAgICAgICA8Q09ERT5DQVBfU1lTX05JQ0U8L0NPREU+IHBlcm1pc3Npb24uCgogICAgICAgICA8YnI+PGJyPgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AA5zeXMvcmVzb3VyY2UuaHhxAH4ZGHQAHmludCBjbGFzcywgaW50IGlkLCBpbnQgbmljZXZhbHQAA2ludHQAC3NldHByb3RvZW50c3EAfgAKdAHUCiAgICAgICAgVGhpcyBmdW5jdGlvbiBvcGVucyB0aGUgcHJvdG9jb2xzIGRhdGFiYXNlIHRvIGJlZ2luIHNjYW5uaW5nIGl0LgogICAgICAgICA8YnI+PGJyPiBJZiB0aGUgPFZBUj5zdGF5b3BlbjwvVkFSPiBhcmd1bWVudCBpcyBub256ZXJvLCB0aGlzIHNldHMgYSBmbGFnIHNvIHRoYXQKICAgICAgICAgc3Vic2VxdWVudCBjYWxscyB0byA8Q09ERT5nZXRwcm90b2J5bmFtZTwvQ09ERT4gb3IgPENPREU+Z2V0cHJvdG9ieW51bWJlcjwvQ09ERT4gd2lsbAogICAgICAgICBub3QgY2xvc2UgdGhlIGRhdGFiYXNlIChhcyB0aGV5IHVz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IHRvIDxDT0RFPnNldHJsaW1pdDwvQ09ERT4gYnV0IGl0cyBzZWNvbmQgcGFyYW1ldGVyIGlzCiAgICAgICAgIGEgcG9pbnRlciB0byBhIHZhcmlhYmxlIG9mIHR5cGUgPENPREU+c3RydWN0IHJsaW1pdDY0PC9DT0RFPiB3aGljaCBhbGxvd3MgaXQKICAgICAgICAgdG8gc2V0IHZhbHVlcyB3aGljaCB3b3VsZG4ndCBmaXQgaW4gdGhlIG1lbWJlciBvZiBhIDxDT0RFPnN0cnVjdAogICAgICAgICBybGltaXQ8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBJZiB0aGUgc291cmNlcyBhcmUgY29tcGlsZWQgd2l0aCA8Q09ERT5fRklMRV9PRkZTRVRfQklUUyA9PSA2NDwvQ09ERT4gb24gYQogICAgICAgICAzMi1iaXQgbWFjaGluZSB0aGlzIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSB1bmRlciB0aGUgbmFtZQogICAgICAgICA8Q09ERT5zZXRybGltaXQ8L0NPREU+IGFuZCBzbyB0cmFuc3BhcmVudGx5IHJlcGxhY2VzIHRoZSBvbGQgaW50ZXJmYWNlLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AA5zeXMvcmVzb3VyY2UuaHhxAH4ZQnQAKGludCByZXNvdXJjZSwgY29uc3Qgc3RydWN0IHJsaW1pdDY0ICpybHB0AANpbnR0AApzZXRzZXJ2ZW50c3EAfgAKdAHPCiAgICAgICAgVGhpcyBmdW5jdGlvbiBvcGVucyB0aGUgc2VydmljZXMgZGF0YWJhc2UgdG8gYmVnaW4gc2Nhbm5pbmcgaXQuCiAgICAgICAgIDxicj48YnI+IElmIHRoZSA8VkFSPnN0YXlvcGVuPC9WQVI+IGFyZ3VtZW50IGlzIG5vbnplcm8sIHRoaXMgc2V0cyBhIGZsYWcgc28gdGhhdAogICAgICAgICBzdWJzZXF1ZW50IGNhbGxzIHRvIDxDT0RFPmdldHNlcnZieW5hbWU8L0NPREU+IG9yIDxDT0RFPmdldHNlcnZieXBvcnQ8L0NPREU+IHdpbGwKICAgICAgICAgbm90IGNsb3NlIHRoZSBkYXRhYmFzZSAoYXMgdGhleSB1c3VhbGx5IHdvdWxkKS4gIFRoaXMgbWFrZXMgZm9yIG1vcmUKICAgICAgICAgZWZmaWNpZW5jeSBpZiB5b3UgY2FsbCB0aG9zZSBmdW5jdGlvbnMgc2V2ZXJhbCB0aW1lcywgYnkgYXZvaWRpbmcKICAgICAgICAgcmVvcGVuaW5nIHRoZSBkYXRhYmFzZSBmb3IgZWFjaCBjYWxsLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAduZXRkYi5oeHEAfhlJdAAMaW50IHN0YXlvcGVudAAEdm9pZHQABnNldHNpZHNxAH4ACnQDzwogICAgICAgIFRoZSA8Q09ERT5zZXRzaWQ8L0NPREU+IGZ1bmN0aW9uIGNyZWF0ZXMgYSBuZXcgc2Vzc2lvbi4gIFRoZSBjYWxsaW5nIHByb2Nlc3MKICAgICAgICAgYmVjb21lcyB0aGUgc2Vzc2lvbiBsZWFkZXIsIGFuZCBpcyBwdXQgaW4gYSBuZXcgcHJvY2VzcyBncm91cCB3aG9zZQogICAgICAgICBwcm9jZXNzIGdyb3VwIElEIGlzIHRoZSBzYW1lIGFzIHRoZSBwcm9jZXNzIElEIG9mIHRoYXQgcHJvY2Vzcy4gIFRoZXJlCiAgICAgICAgIGFyZSBpbml0aWFsbHkgbm8gb3RoZXIgcHJvY2Vzc2VzIGluIHRoZSBuZXcgcHJvY2VzcyBncm91cCwgYW5kIG5vIG90aGVyCiAgICAgICAgIHByb2Nlc3MgZ3JvdXBzIGluIHRoZSBuZXcgc2Vzc2lvbi4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiBhbHNvIG1ha2VzIHRoZSBjYWxsaW5nIHByb2Nlc3MgaGF2ZSBubyBjb250cm9sbGluZyB0ZXJtaW5hbC4KICAgICAgICAgPGJyPjxicj4gVGhlIDxDT0RFPnNldHNpZDwvQ09ERT4gZnVuY3Rpb24gcmV0dXJucyB0aGUgbmV3IHByb2Nlc3MgZ3JvdXAgSUQgb2YgdGhlCiAgICAgICAgIGNhbGxpbmcgcHJvY2VzcyBpZiBzdWNjZXNzZnVsLiAgQSByZXR1cm4gdmFsdWUgb2YgPENPREU+LTE8L0NPREU+IGluZGljYXRlcyBhbgogICAgICAgICBlcnJvci4gIFRoZSBmb2xsb3dpbmcgPENPREU+ZXJybm88L0NPREU+IGVycm9yIGNvbmRpdGlvbnMgYXJlIGRlZmluZWQgZm9yIHRoaXMKICAgICAgICAgZnVuY3Rpb246CiAgICAgICAgIDxicj48YnI+IDxETD4KCiAgICAgICAgIDxEVD48Q09ERT5FUEVSTTwvQ09ERT4KPEREPgogICAgICAgICBUaGUgY2FsbGluZyBwcm9jZXNzIGlzIGFscmVhZHkgYSBwcm9jZXNzIGdyb3VwIGxlYWRlciwgb3IgdGhlcmUgaXMKICAgICAgICAgYWxyZWFkeSBhbm90aGVyIHByb2Nlc3MgZ3JvdXAgYXJvdW5kIHRoYXQgaGFzIHRoZSBzYW1lIHByb2Nlc3MgZ3JvdXAgSUQuCgogICAgICAgIHNxAH4ADwAAAAJ3BAAAAAJ0AAdzdGRpby5odAAIdW5pc3RkLmh4cQB+GVB0AAR2b2lkdAAFcGlkX3R0AApzZXRzb2Nrb3B0c3EAfgAKdAGdCiAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNldCB0aGUgc29ja2V0IG9wdGlvbiA8VkFSPm9wdG5hbWU8L1ZBUj4gYXQgbGV2ZWwKICAgICAgICAgPFZBUj5sZXZlbDwvVkFSPiBmb3Igc29ja2V0IDxWQVI+c29ja2V0PC9WQVI+LiAgVGhlIHZhbHVlIG9mIHRoZSBvcHRpb24gaXMgcGFzc2VkCiAgICAgICAgIGluIHRoZSBidWZmZXIgPFZBUj5vcHR2YWw8L1ZBUj4gb2Ygc2l6ZSA8VkFSPm9wdGxlbjwvVkFSPi4KICAgICAgICAgPGJyPjxicj4KCiAgICAgICAgIFRoZSByZXR1cm4gdmFsdWUgYW5kIGVycm9yIGNvZGVzIGZvciA8Q09ERT5zZXRzb2Nrb3B0PC9DT0RFPiBhcmUgdGhlIHNhbWUgYXMKICAgICAgICAgZm9yIDxDT0RFPmdldHNvY2tvcHQ8L0NPREU+LgoKICAgICAgICAgPGJyPjxicj4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAMc3lzL3NvY2tldC5oeHEAfhlYdABCaW50IHNvY2tldCwgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwgdm9pZCAqb3B0dmFsLCBzb2NrbGVuX3Qgb3B0bGVudAADaW50dAAIc2V0c3RhdGVzcQB+AAp0AgYKICAgICAgICBUaGUgPENPREU+c2V0c3RhdGU8L0NPREU+IGZ1bmN0aW9uIHJlc3RvcmVzIHRoZSByYW5kb20gbnVtYmVyIHN0YXRlCiAgICAgICAgIGluZm9ybWF0aW9uIDxWQVI+c3RhdGU8L1ZBUj4uICBUaGUgYXJndW1lbnQgbXVzdCBoYXZlIGJlZW4gdGhlIHJlc3VsdCBvZgogICAgICAgICBhIHByZXZpb3VzIGNhbGwgdG8gPFZBUj5pbml0c3RhdGU8L1ZBUj4gb3IgPFZBUj5zZXRzdGF0ZTwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgcHJldmlvdXMgdmFsdWUgb2YgdGhlIHN0YXRlIGluZm9ybWF0aW9uIGFycmF5LgogICAgICAgICBZb3UgY2FuIHVzZSB0aGlzIHZhbHVlIGxhdGVyIGFzIGFuIGFyZ3VtZW50IHRvIDxDT0RFPnNldHN0YXRlPC9DT0RFPiB0bwogICAgICAgICByZXN0b3JlIHRoYXQgc3RhdGUuCiAgICAgICAgIDxicj48YnI+IElmIHRoZSBmdW5jdGlvbiBmYWlscyB0aGUgcmV0dXJuIHZhbHVlIGlzIDxDT0RFPk5VTEw8L0NPREU+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAhzdGRsaWIuaHhxAH4ZX3QAC3ZvaWQgKnN0YXRldAAGdm9pZCAqdAAKc2V0c3RhdGVfcnNxAH4ACnQA+AogICAgICAgIFRoZSA8Q09ERT5zZXRzdGF0ZV9yPC9DT0RFPiBmdW5jdGlvbiBiZWhhdmVzIGV4YWN0bHkgbGlrZSB0aGUgPENPREU+c2V0c3RhdGU8L0NPREU+CiAgICAgICAgIGZ1bmN0aW9uIGV4Y2VwdCB0aGF0IGl0IHVzZXMgYW5kIG1vZGlmaWVzIHRoZSBzdGF0ZSBpbiB0aGUgb2JqZWN0CiAgICAgICAgIHBvaW50ZWQgdG8gYnkgdGhlIGZpcnN0IHBhcmFtZXRlciBpbnN0ZWFkIG9mIHRoZSBnbG9iYWwgc3RhdGUuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHN0ZGxpYi5oeHEAfhlmdAA5Y2hhciAqcmVzdHJpY3Qgc3RhdGVidWYsIHN0cnVjdCByYW5kb21fZGF0YSAqcmVzdHJpY3QgYnVmdAADaW50dAAMc2V0dGltZW9mZGF5c3EAfgAKdAeCCiAgICAgICAgVGhlIDxDT0RFPnNldHRpbWVvZmRheTwvQ09ERT4gZnVuY3Rpb24gc2V0cyB0aGUgY3VycmVudCBjYWxlbmRhciB0aW1lIGluIHRoZQogICAgICAgICBzeXN0ZW0gY2xvY2sgYWNjb3JkaW5nIHRvIHRoZSBhcmd1bWVudHMuICBBcyBmb3IgPENPREU+Z2V0dGltZW9mZGF5PC9DT0RFPiwKICAgICAgICAgdGhlIGNhbGVuZGFyIHRpbWUgaXMgcmVwcmVzZW50ZWQgYXMgdGhlIGVsYXBzZWQgdGltZSBzaW5jZSB0aGUgZXBvY2guCiAgICAgICAgIEFzIGZvciA8Q09ERT5nZXR0aW1lb2ZkYXk8L0NPREU+LCB0aW1lIHpvbmUgaW5mb3JtYXRpb24gaXMgaWdub3JlZCBpZgogICAgICAgICA8VkFSPnR6cDwvVkFSPiBpcyBhIG51bGwgcG9pbnRlci4KICAgICAgICAgPGJyPjxicj4gWW91IG11c3QgYmUgYSBwcml2aWxlZ2VkIHVzZXIgaW4gb3JkZXIgdG8gdXNlIDxDT0RFPnNldHRpbWVvZmRheTwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IFNvbWUga2VybmVscyBhdXRvbWF0aWNhbGx5IHNldCB0aGUgc3lzdGVtIGNsb2NrIGZyb20gc29tZSBzb3VyY2Ugc3VjaCBhcwogICAgICAgICBhIGhhcmR3YXJlIGNsb2NrIHdoZW4gdGhleSBzdGFydCB1cC4gIE90aGVycywgaW5jbHVkaW5nIExpbnV4LCBwbGFjZSB0aGUKICAgICAgICAgc3lzdGVtIGNsb2NrIGluIGFuIGBgaW52YWxpZCcnIHN0YXRlIChpbiB3aGljaCBhdHRlbXB0cyB0byByZWFkIHRoZSBjbG9jawogICAgICAgICBmYWlsKS4gIEEgY2FsbCBvZiA8Q09ERT5zdGltZTwvQ09ERT4gcmVtb3ZlcyB0aGUgc3lzdGVtIGNsb2NrIGZyb20gYW4gaW52YWxpZAogICAgICAgICBzdGF0ZSwgYW5kIHN5c3RlbSBzdGFydHVwIHNjcmlwdHMgdHlwaWNhbGx5IHJ1biBhIHByb2dyYW0gdGhhdCBjYWxscwogICAgICAgICA8Q09ERT5zdGltZTwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IDxDT0RFPnNldHRpbWVvZmRheTwvQ09ERT4gY2F1c2VzIGEgc3VkZGVuIGp1bXAgZm9yd2FyZHMgb3IgYmFja3dhcmRzLCB3aGljaAogICAgICAgICBjYW4gY2F1c2UgYSB2YXJpZXR5IG9mIHByb2JsZW1zIGluIGEgc3lzdGVtLiAgVXNlIDxDT0RFPmFkanRpbWU8L0NPREU+IChiZWxvdykKICAgICAgICAgdG8gbWFrZSBhIHNtb290aCB0cmFuc2l0aW9uIGZyb20gb25lIHRpbWUgdG8gYW5vdGhlciBieSB0ZW1wb3JhcmlseQogICAgICAgICBzcGVlZGluZyB1cCBvciBzbG93aW5nIGRvd24gdGhlIGNsb2NrLgogICAgICAgICA8YnI+PGJyPiBXaXRoIGEgTGludXgga2VybmVsLCA8Q09ERT5hZGp0aW1leDwvQ09ERT4gZG9lcyB0aGUgc2FtZSB0aGluZyBhbmQgY2FuIGFsc28KICAgICAgICAgbWFrZSBwZXJtYW5lbnQgY2hhbmdlcyB0byB0aGUgc3BlZWQgb2YgdGhlIHN5c3RlbSBjbG9jayBzbyBpdCBkb2Vzbid0CiAgICAgICAgIG5lZWQgdG8gYmUgY29ycmVjdGVkIGFzIG9mdGVuLgogICAgICAgICA8YnI+PGJyPiBUaGUgcmV0dXJuIHZhbHVlIGlzIDxDT0RFPjA8L0NPREU+IG9uIHN1Y2Nlc3MgYW5kIDxDT0RFPi0xPC9DT0RFPiBvbiBmYWlsdXJlLiAgVGhlCiAgICAgICAgIGZvbGxvd2luZyA8Q09ERT5lcnJubzwvQ09ERT4gZXJyb3IgY29uZGl0aW9ucyBhcmUgZGVmaW5lZCBmb3IgdGhpcyBmdW5jdGlvbjoKICAgICAgICAgPGJyPjxicj4gPERMPgoKICAgICAgICAgPERUPjxDT0RFPkVQRVJNPC9DT0RFPgo8REQ+CiAgICAgICAgIFRoaXMgcHJvY2VzcyBjYW5ub3Qgc2V0IHRoZSBjbG9jayBiZWNhdXNlIGl0IGlzIG5vdCBwcml2aWxlZ2VkLgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVOT1NZUwogICAgICAgICBUaGUgb3BlcmF0aW5nIHN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IHNldHRpbmcgdGltZSB6b25lIGluZm9ybWF0aW9uLCBhbmQKICAgICAgICAgPFZBUj50enA8L1ZBUj4gaXMgbm90IGEgbnVsbCBwb2ludGVyLgoKICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAKc3lzL3RpbWUuaHhxAH4ZbXQANGNvbnN0IHN0cnVjdCB0aW1ldmFsICp0cCwgY29uc3Qgc3RydWN0IHRpbWV6b25lICp0enB0AANpbnR0AAZzZXR1aWRzcQB+AAp0ApAKICAgICAgICBJZiB0aGUgY2FsbGluZyBwcm9jZXNzIGlzIHByaXZpbGVnZWQsIHRoaXMgZnVuY3Rpb24gc2V0cyBib3RoIHRoZSByZWFsCiAgICAgICAgIGFuZCBlZmZlY3RpdmUgdXNlciBJRCBvZiB0aGUgcHJvY2VzcyB0byA8VkFSPm5ld3VpZDwvVkFSPi4gIEl0IGFsc28gZGVsZXRlcwogICAgICAgICB0aGUgZmlsZSB1c2VyIElEIG9mIHRoZSBwcm9jZXNzLCBpZiBhbnkuICA8VkFSPm5ld3VpZDwvVkFSPiBtYXkgYmUgYW55CiAgICAgICAgIGxlZ2FsIHZhbHVlLiAgKE9uY2UgdGhpcyBoYXMgYmVlbiBkb25lLCB0aGVyZSBpcyBubyB3YXkgdG8gcmVjb3ZlciB0aGUKICAgICAgICAgb2xkIGVmZmVjdGl2ZSB1c2VyIElELikKICAgICAgICAgPGJyPjxicj4gSWYgdGhlIHByb2Nlc3MgaXMgbm90IHByaXZpbGVnZWQsIGFuZCB0aGUgc3lzdGVtIHN1cHBvcnRzIHRoZQogICAgICAgICA8Q09ERT5fUE9TSVhfU0FWRURfSURTPC9DT0RFPiBmZWF0dXJlLCB0aGVuIHRoaXMgZnVuY3Rpb24gYmVoYXZlcyBsaWtlCiAgICAgICAgIDxDT0RFPnNldGV1aWQ8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBUaGUgcmV0dXJuIHZhbHVlcyBhbmQgZXJyb3IgY29uZGl0aW9ucyBhcmUgdGhlIHNhbWUgYXMgZm9yIDxDT0RFPnNldGV1aWQ8L0NPREU+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAh1bmlzdGQuaHhxAH4ZdHQADHVpZF90IG5ld3VpZHQAA2ludHQACHNldHV0ZW50c3EAfgAKdAFxCiAgICAgICAgVGhpcyBmdW5jdGlvbiBvcGVucyB0aGUgdXNlciBhY2NvdW50aW5nIGRhdGFiYXNlIHRvIGJlZ2luIHNjYW5uaW5nIGl0LgogICAgICAgICBZb3UgY2FuIHRoZW4gY2FsbCA8Q09ERT5nZXR1dGVudDwvQ09ERT4sIDxDT0RFPmdldHV0aWQ8L0NPREU+IG9yIDxDT0RFPmdldHV0bGluZTwvQ09ERT4gdG8KICAgICAgICAgcmVhZCBlbnRyaWVzIGFuZCA8Q09ERT5wdXR1dGxpbmU8L0NPREU+IHRvIHdyaXRlIGVudHJpZXMuCiAgICAgICAgIDxicj48YnI+IElmIHRoZSBkYXRhYmFzZSBpcyBhbHJlYWR5IG9wZW4sIGl0IHJlc2V0cyB0aGUgaW5wdXQgdG8gdGhlIGJlZ2lubmluZyBvZgogICAgICAgICB0aGUgZGF0YWJhc2UuCiAgICAgICAgc3EAfgAPAAAAAncEAAAAAnQAB3N0ZGlvLmh0AAZ1dG1wLmh4cQB+GXt0AAR2b2lkdAAEdm9pZHQACXNldHV0eGVudHNxAH4ACnQAkQogICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byA8Q09ERT5zZXR1dGVudDwvQ09ERT4uICBPbiB0aGUgR05VIHN5c3RlbSBpdCBpcwogICAgICAgICBzaW1wbHkgYW4gYWxpYXMgZm9yIDxDT0RFPnNldHV0ZW50PC9DT0RFPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHdXRtcHguaHhxAH4Zg3QABHZvaWR0AAR2b2lkdAAHc2V0dmJ1ZnNxAH4ACnQF6gogICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzcGVjaWZ5IHRoYXQgdGhlIHN0cmVhbSA8VkFSPnN0cmVhbTwvVkFSPiBzaG91bGQKICAgICAgICAgaGF2ZSB0aGUgYnVmZmVyaW5nIG1vZGUgPFZBUj5tb2RlPC9WQVI+LCB3aGljaCBjYW4gYmUgZWl0aGVyIDxDT0RFPl9JT0ZCRjwvQ09ERT4KICAgICAgICAgKGZvciBmdWxsIGJ1ZmZlcmluZyksIDxDT0RFPl9JT0xCRjwvQ09ERT4gKGZvciBsaW5lIGJ1ZmZlcmluZyksIG9yCiAgICAgICAgIDxDT0RFPl9JT05CRjwvQ09ERT4gKGZvciB1bmJ1ZmZlcmVkIGlucHV0L291dHB1dCkuCiAgICAgICAgIDxicj48YnI+IElmIHlvdSBzcGVjaWZ5IGEgbnVsbCBwb2ludGVyIGFzIHRoZSA8VkFSPmJ1ZjwvVkFSPiBhcmd1bWVudCwgdGhlbiA8Q09ERT5zZXR2YnVmPC9DT0RFPgogICAgICAgICBhbGxvY2F0ZXMgYSBidWZmZXIgaXRzZWxmIHVzaW5nIDxDT0RFPm1hbGxvYzwvQ09ERT4uICBUaGlzIGJ1ZmZlciB3aWxsIGJlIGZyZWVkCiAgICAgICAgIHdoZW4geW91IGNsb3NlIHRoZSBzdHJlYW0uCiAgICAgICAgIDxicj48YnI+IE90aGVyd2lzZSwgPFZBUj5idWY8L1ZBUj4gc2hvdWxkIGJlIGEgY2hhcmFjdGVyIGFycmF5IHRoYXQgY2FuIGhvbGQgYXQgbGVhc3QKICAgICAgICAgPFZBUj5zaXplPC9WQVI+IGNoYXJhY3RlcnMuICBZb3Ugc2hvdWxkIG5vdCBmcmVlIHRoZSBzcGFjZSBmb3IgdGhpcyBhcnJheSBhcwogICAgICAgICBsb25nIGFzIHRoZSBzdHJlYW0gcmVtYWlucyBvcGVuIGFuZCB0aGlzIGFycmF5IHJlbWFpbnMgaXRzIGJ1ZmZlci4gIFlvdQogICAgICAgICBzaG91bGQgdXN1YWxseSBlaXRoZXIgYWxsb2NhdGUgaXQgc3RhdGljYWxseSwgb3IgPENPREU+bWFsbG9jPC9DT0RFPgogICAgICAgICAgdGhlIGJ1ZmZlci4gIFVzaW5nIGFuIGF1dG9tYXRpYyBhcnJheQogICAgICAgICBpcyBub3QgYSBnb29kIGlkZWEgdW5sZXNzIHlvdSBjbG9zZSB0aGUgZmls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AANpbnR0AAlzaWdhY3Rpb25zcQB+AAp0BXcKICAgICAgICBUaGUgPFZBUj5hY3Rpb248L1ZBUj4gYXJndW1lbnQgaXMgdXNlZCB0byBzZXQgdXAgYSBuZXcgYWN0aW9uIGZvciB0aGUgc2lnbmFsCiAgICAgICAgIDxWQVI+c2lnbnVtPC9WQVI+LCB3aGlsZSB0aGUgPFZBUj5vbGQtYWN0aW9uPC9WQVI+IGFyZ3VtZW50IGlzIHVzZWQgdG8gcmV0dXJuCiAgICAgICAgIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhY3Rpb24gcHJldmlvdXNseSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzeW1ib2wuCiAgICAgICAgIChJbiBvdGhlciB3b3JkcywgPFZBUj5vbGQtYWN0aW9uPC9WQVI+IGhhcyB0aGUgc2FtZSBwdXJwb3NlIGFzIHRoZQogICAgICAgICA8Q09ERT5zaWduYWw8L0NPREU+IGZ1bmN0aW9uJ3MgcmV0dXJuIHZhbHVlLS0teW91IGNhbiBjaGVjayB0byBzZWUgd2hhdCB0aGUKICAgICAgICAgb2xkIGFjdGlvbiBpbiBlZmZlY3QgZm9yIHRoZSBzaWduYWwgd2FzLCBhbmQgcmVzdG9yZSBpdCBsYXRlciBpZiB5b3UKICAgICAgICAgd2FudC4pCiAgICAgICAgIDxicj48YnI+IEVpdGhlciA8VkFSPmFjdGlvbjwvVkFSPiBvciA8VkFSPm9sZC1hY3Rpb248L1ZBUj4gY2FuIGJlIGEgbnVsbCBwb2ludGVyLiAgSWYKICAgICAgICAgPFZBUj5vbGQtYWN0aW9uPC9WQVI+IGlzIGEgbnVsbCBwb2ludGVyLCB0aGlzIHNpbXBseSBzdXBwcmVzc2VzIHRoZSByZXR1cm4KICAgICAgICAgb2YgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9sZCBhY3Rpb24uICBJZiA8VkFSPmFjdGlvbjwvVkFSPiBpcyBhIG51bGwgcG9pbnRlciwKICAgICAgICAgdGhlIGFjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHNpZ25hbCA8VkFSPnNpZ251bTwvVkFSPiBpcyB1bmNoYW5nZWQ7IHRoaXMKICAgICAgICAgYWxsb3dzIHlvdSB0byBpbnF1aXJlIGFib3V0IGhvdyBhIHNpZ25hbCBpcyBiZWluZyBoYW5kbGVkIHdpdGhvdXQgY2hhbmdpbmcKICAgICAgICAgdGhhdCBoYW5kbGluZy4KICAgICAgICAgPGJyPjxicj4gVGhlIHJldHVybiB2YWx1ZSBmcm9tIDxDT0RFPnNpZ2FjdGlvbjwvQ09ERT4gaXMgemVybyBpZiBpdCBzdWNjZWVkcywgYW5kCiAgICAgICAgIDxDT0RFPi0xPC9DT0RFPiBvbiBmYWlsdXJlLiAgVGhlIGZvbGxvd2luZyA8Q09ERT5lcnJubzwvQ09ERT4gZXJyb3IgY29uZGl0aW9ucyBhcmUKICAgICAgICAgZGVmaW5lZCBmb3IgdGhpcyBmdW5jdGlvbjoKICAgICAgICAgPGJyPjxicj4gPERMPgoKICAgICAgICAgPERUPjxDT0RFPkVJTlZBTDwvQ09ERT4KPEREPgogICAgICAgICBUaGUgPFZBUj5zaWdudW08L1ZBUj4gYXJndW1lbnQgaXMgbm90IHZhbGlkLCBvciB5b3UgYXJlIHRyeWluZyB0bwogICAgICAgICB0cmFwIG9yIGlnbm9yZSA8Q09ERT5TSUdLSUxMPC9DT0RFPiBvciA8Q09ERT5TSUdTVE9QPC9DT0RFPi4KCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHNpZ25hbC5oeHEAfhmYdABaaW50IHNpZ251bSwgY29uc3Qgc3RydWN0IHNpZ2FjdGlvbiAqcmVzdHJpY3QgYWN0aW9uLCBzdHJ1Y3Qgc2lnYWN0aW9uICpyZXN0cmljdCBvbGQtYWN0aW9udAADaW50dAAJc2lnYWRkc2V0c3EAfgAKdAIYCiAgICAgICAgVGhpcyBmdW5jdGlvbiBhZGRzIHRoZSBzaWduYWwgPFZBUj5zaWdudW08L1ZBUj4gdG8gdGhlIHNpZ25hbCBzZXQgPFZBUj5zZXQ8L1ZBUj4uCiAgICAgICAgIEFsbCA8Q09ERT5zaWdhZGRzZXQ8L0NPREU+IGRvZXMgaXMgbW9kaWZ5IDxWQVI+c2V0PC9WQVI+OyBpdCBkb2VzIG5vdCBibG9jayBvcgogICAgICAgICB1bmJsb2NrIGFueSBzaWduYWxzLgogICAgICAgICA8YnI+PGJyPiBUaGUgcmV0dXJuIHZhbHVlIGlzIDxDT0RFPjA8L0NPREU+IG9uIHN1Y2Nlc3MgYW5kIDxDT0RFPi0xPC9DT0RFPiBvbiBmYWlsdXJlLgogICAgICAgICBUaGUgZm9sbG93aW5nIDxDT0RFPmVycm5vPC9DT0RFPiBlcnJvciBjb25kaXRpb24gaXMgZGVmaW5lZCBmb3IgdGhpcyBmdW5jdGlvbjoKICAgICAgICAgPGJyPjxicj4gPERMPgoKICAgICAgICAgPERUPjxDT0RFPkVJTlZBTDwvQ09ERT4KPEREPgogICAgICAgICBUaGUgPFZBUj5zaWdudW08L1ZBUj4gYXJndW1lbnQgZG9lc24ndCBzcGVjaWZ5IGEgdmFsaWQgc2lnbmFsLgoKICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc2lnbmFsLmh4cQB+GZ90ABlzaWdzZXRfdCAqc2V0LCBpbnQgc2lnbnVtdAADaW50dAALc2lnYWx0c3RhY2tzcQB+AAp0BHMKICAgICAgICBUaGUgPENPREU+c2lnYWx0c3RhY2s8L0NPREU+IGZ1bmN0aW9uIHNwZWNpZmllcyBhbiBhbHRlcm5hdGUgc3RhY2sgZm9yIHVzZQogICAgICAgICBkdXJpbmcgc2lnbmFsIGhhbmRsaW5nLiAgV2hlbiBhIHNpZ25hbCBpcyByZWNlaXZlZCBieSB0aGUgcHJvY2VzcyBhbmQKICAgICAgICAgaXRzIGFjdGlvbiBpbmRpY2F0ZXMgdGhhdCB0aGUgc2lnbmFsIHN0YWNrIGlzIHVzZWQsIHRoZSBzeXN0ZW0gYXJyYW5nZXMKICAgICAgICAgYSBzd2l0Y2ggdG8gdGhlIGN1cnJlbnRseSBpbnN0YWxsZWQgc2lnbmFsIHN0YWNrIHdoaWxlIHRoZSBoYW5kbGVyIGZvcgogICAgICAgICB0aGF0IHNpZ25hbCBpcyBleGVjdXRlZC4KICAgICAgICAgPGJyPjxicj4gSWYgPFZBUj5vbGRzdGFjazwvVkFSPiBpcyBub3QgYSBudWxsIHBvaW50ZXIsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50bHkKICAgICAgICAgaW5zdGFsbGVkIHNpZ25hbCBzdGFjayBpcyByZXR1cm5l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ICAgICAgIHRoZSBzaWduYWwgPFZBUj5zaWdudW08L1ZBUj4uCiAgICAgICAgIDxicj48YnI+IFRoZSBmaXJzdCBhcmd1bWVudCwgPFZBUj5zaWdudW08L1ZBUj4sIGlkZW50aWZpZXMgdGhlIHNpZ25hbCB3aG9zZSBiZWhhdmlvcgogICAgICAgICB5b3Ugd2FudCB0byBjb250cm9sLCBhbmQgc2hvdWxkIGJlIGEgc2lnbmFsIG51bWJlci4gIFRoZSBwcm9wZXIgd2F5IHRvCiAgICAgICAgIHNwZWNpZnkgYSBzaWduYWwgbnVtYmVyIGlzIHdpdGggb25lIG9mIHRoZSBzeW1ib2xpYyBzaWduYWwgbmFtZXMKICAgICAgICAgLS0tZG9uJ3QgdXNlIGFuIGV4cGxpY2l0IG51bWJlciwgYmVjYXVzZQogICAgICAgICB0aGUgbnVtZXJpY2FsIGNvZGUgZm9yIGEgZ2l2ZW4ga2luZCBvZiBzaWduYWwgbWF5IHZhcnkgZnJvbSBvcGVyYXRpbmcKICAgICAgICAgc3lzdGVtIHRvIG9wZXJhdGluZyBzeXN0ZW0uCiAgICAgICAgIDxicj48YnI+IFRoZSBzZWNvbmQgYXJndW1lbnQsIDxWQVI+YWN0aW9uPC9WQVI+LCBzcGVjaWZpZXMgdGhlIGFjdGlvbiB0byB1c2UgZm9yIHRoZQogICAgICAgICBzaWduYWwgPFZBUj5zaWdudW08L1ZBUj4uICBUaGlzIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKICAgICAgICAgPGJyPjxicj4gPERMPgoKICAgICAgICAgPERUPjxDT0RFPlNJR19ERkw8L0NPREU+CjxERD4KCiAgICAgICAgICBhY3Rpb24gZm9yIGEgc2lnbmFsCiAgICAgICAgIDxDT0RFPlNJR19ERkw8L0NPREU+IHNwZWNpZmllcyB0aGUgZGVmYXVsdCBhY3Rpb24gZm9yIHRoZSBwYXJ0aWN1bGFyIHNpZ25hbC4KICAgICAgICAgVGhlIGRlZmF1bHQgYWN0aW9ucyBmb3IgdmFyaW91cyBraW5kcyBvZiBzaWduYWxzIGFyZSBzdGF0ZWQgaW4KICAgICAgICAgU3RhbmRhcmQgU2lnbmFscy4KICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPlNJR19JR048L0NPREU+CjxERD4KCiAgICAgICAgICBhY3Rpb24gZm9yIGEgc2lnbmFsCiAgICAgICAgIDxDT0RFPlNJR19JR048L0NPREU+IHNwZWNpZmllcyB0aGF0IHRoZSBzaWduYWwgc2hvdWxkIGJlIGlnbm9yZWQuCiAgICAgICAgIDxicj48YnI+IFlvdXIgcHJvZ3JhbSBnZW5lcmFsbHkgc2hvdWxkIG5vdCBpZ25vcmUgc2lnbmFscyB0aGF0IHJlcHJlc2VudCBzZXJpb3VzCiAgICAgICAgIGV2ZW50cyBvciB0aGF0IGFyZSBub3JtYWxseSB1c2VkIHRvIHJlcXVlc3QgdGVybWluYXRpb24uICBZb3UgY2Fubm90CiAgICAgICAgIGlnbm9yZSB0aGUgPENPREU+U0lHS0lMTDwvQ09ERT4gb3IgPENPREU+U0lHU1RPUDwvQ09ERT4gc2lnbmFscyBhdCBhbGwuICBZb3UgY2FuCiAgICAgICAgIGlnbm9yZSBwcm9ncmFtIGVycm9yIHNpZ25hbHMgbGlrZSA8Q09ERT5TSUdTRUdWPC9DT0RFPiwgYnV0IGlnbm9yaW5nIHRoZSBlcnJvcgogICAgICAgICB3b24ndCBlbmFibGUgdGhlIHByb2dyYW0gdG8gY29udGludWUgZXhlY3V0aW5nIG1lYW5pbmdmdWxseS4gIElnbm9yaW5nCiAgICAgICAgIHVzZXIgcmVxdWVzdHMgc3VjaCBhcyA8Q09ERT5TSUdJTlQ8L0NPREU+LCA8Q09ERT5TSUdRVUlUPC9DT0RFPiwgYW5kIDxDT0RFPlNJR1RTVFA8L0NPREU+CiAgICAgICAgIGlzIHVuZnJpZW5kbHkuCiAgICAgICAgIDxicj48YnI+IFdoZW4geW91IGRvIG5vdCB3aXNoIHNpZ25hbHMgdG8gYmUgZGVsaXZlcmVkIGR1cmluZyBhIGNlcnRhaW4gcGFydCBvZgogICAgICAgICB0aGUgcHJvZ3JhbSwgdGhlIHRoaW5nIHRvIGRvIGlzIHRvIGJsb2NrIHRoZW0sIG5vdCBpZ25vcmUgdGhlbS4KICAgICAgICAgLgogICAgICAgICA8YnI+PGJyPiA8TEk+IDxWQVI+aGFuZGxlcjwvVkFSPgogICAgICAgICBTdXBwbHkgdGhlIGFkZHJlc3Mgb2YgYSBoYW5kbGVyIGZ1bmN0aW9uIGluIHlvdXIgcHJvZ3JhbSwgdG8gc3BlY2lmeQogICAgICAgICBydW5uaW5nIHRoaXMgaGFuZGxlciBhcyB0aGUgd2F5IHRvIGRlbGl2ZXIgdGhlIHNpZ25hbC4KICAgICAgICAgPGJyPjxicj4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgZGVmaW5pbmcgc2lnbmFsIGhhbmRsZXIgZnVuY3Rpb25zLAogICAgICAgICBzZWUgRGVmaW5pbmcgSGFuZGxlcnMuCgogICAgICAgICA8YnI+PGJyPiBJZiB5b3Ugc2V0IHRoZSBhY3Rpb24gZm9yIGEgc2lnbmFsIHRvIDxDT0RFPlNJR19JR048L0NPREU+LCBvciBpZiB5b3Ugc2V0IGl0CiAgICAgICAgIHRvIDxDT0RFPlNJR19ERkw8L0NPREU+IGFuZCB0aGUgZGVmYXVsdCBhY3Rpb24gaXMgdG8gaWdub3JlIHRoYXQgc2lnbmFsLCB0aGVuCiAgICAgICAgIGFueSBwZW5kaW5nIHNpZ25hbHMgb2YgdGhhdCB0eXBlIGFyZSBkaXNjYXJkZWQgKGV2ZW4gaWYgdGhleSBhcmUKICAgICAgICAgYmxvY2tlZCkuICBEaXNjYXJkaW5nIHRoZSBwZW5kaW5nIHNpZ25hbHMgbWVhbnMgdGhhdCB0aGV5IHdpbGwgbmV2ZXIgYmUKICAgICAgICAgZGVsaXZlcmVkLCBub3QgZXZlbiBpZiB5b3Ugc3Vic2VxdWVudGx5IHNwZWNpZnkgYW5vdGhlciBhY3Rpb24gYW5kCiAgICAgICAgIHVuYmxvY2sgdGhpcyBraW5kIG9mIHNpZ25hbC4KICAgICAgICAgPGJyPjxicj4gVGhlIDxDT0RFPnNpZ25hbDwvQ09ERT4gZnVuY3Rpb24gcmV0dXJucyB0aGUgYWN0aW9uIHRoYXQgd2FzIHByZXZpb3VzbHkgaW4KICAgICAgICAgZWZmZWN0IGZvciB0aGUgc3BlY2lmaWVkIDxWQVI+c2lnbnVtPC9WQVI+LiAgWW91IGNhbiBzYXZlIHRoaXMgdmFsdWUgYW5kCiAgICAgICAgIHJlc3RvcmUgaXQgbGF0ZXIgYnkgY2FsbGluZyA8Q09ERT5zaWduYWw8L0NPREU+IGFnYWluLgogICAgICAgICA8YnI+PGJyPiBJZiA8Q09ERT5zaWduYWw8L0NPREU+IGNhbid0IGhvbm9yIHRoZSByZXF1ZXN0LCBpdCByZXR1cm5zIDxDT0RFPlNJR19FUlI8L0NPREU+CiAgICAgICAgIGluc3RlYWQuICBUaGUgZm9sbG93aW5nIDxDT0RFPmVycm5vPC9DT0RFPiBlcnJvciBjb25kaXRpb25zIGFyZSBkZWZpbmVkIGZvcgogICAgICAgICB0aGlzIGZ1bmN0aW9uOgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8TEk+IEVJTlZBTAogICAgICAgICBZb3Ugc3BlY2lmaWVkIGFuIGludmFsaWQgPFZBUj5zaWdudW08L1ZBUj47IG9yIHlvdSB0cmllZCB0byBpZ25vcmUgb3IgcHJvdmlkZQogICAgICAgICBhIGhhbmRsZXIgZm9yIDxDT0RFPlNJR0tJTEw8L0NPREU+IG9yIDxDT0RFPlNJR1NUT1A8L0NPREU+LgoKICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc2lnbmFsLmh4cQB+Gd50AB9pbnQgc2lnbnVtLCBzaWdoYW5kbGVyX3QgYWN0aW9udAAMc2lnaGFuZGxlcl90dAAHc2lnbmJpdHNxAH4ACnQBwQogICAgICAgIDxDT0RFPnNpZ25iaXQ8L0NPREU+IGlzIGEgZ2VuZXJpYyBtYWNybyB3aGljaCBjYW4gd29yayBvbiBhbGwgZmxvYXRpbmctcG9pbnQKICAgICAgICAgdHlwZXMuICBJdCByZXR1cm5zIGEgbm9uemVybyB2YWx1ZSBpZiB0aGUgdmFsdWUgb2YgPFZBUj54PC9WQVI+IGhhcyBpdHMgc2lnbgogICAgICAgICBiaXQgc2V0LgogICAgICAgICA8YnI+PGJyPiBUaGlzIGlzIG5vdCB0aGUgc2FtZSBhcyA8Q09ERT54IDwgMC4wPC9DT0RFPiwgYmVjYXVzZSBJRUVFIDc1NCBmbG9hdGluZwogICAgICAgICBwb2ludCBhbGxvd3MgemVybyB0byBiZSBzaWduZWQuICBUaGUgY29tcGFyaXNvbiA8Q09ERT4tMC4wIDwgMC4wPC9DT0RFPiBpcwogICAgICAgICBmYWxzZSwgYnV0IDxDT0RFPnNpZ25iaXQgKC0wLjApPC9DT0RFPiB3aWxsIHJldHVybiBhIG5vbnplcm8gdmFsdWUuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQABm1hdGguaHhxAH4Z5XQAAiB4dAADaW50dAALc2lnbmlmaWNhbmRzcQB+AAp0AUoKICAgICAgICA8Q09ERT5zaWduaWZpY2FuZDwvQ09ERT4gcmV0dXJucyB0aGUgbWFudGlzc2Egb2YgPFZBUj54PC9WQVI+IHNjYWxlZCB0byB0aGUgcmFuZ2UKICAgICAgICAgWzEsIDIpLgogICAgICAgICBJdCBpcyBlcXVpdmFsZW50IHRvIDxDT0RFPnNjYWxiICg8VkFSPng8L1ZBUj4sIChkb3VibGUpIC1pbG9nYiAoPFZBUj54PC9WQVI+KSk8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIGV4aXN0cyBtYWlubHkgZm9yIHVzZSBpbiBjZXJ0YWluIHN0YW5kYXJkaXplZCB0ZXN0cwogICAgICAgICBvZiBJRUVFIDc1NCBjb25mb3JtYW5jZS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGbWF0aC5oeHEAfhnsdAAIZG91YmxlIHh0AA1sb25nIGxvbmcgaW50dAAMc2lnbmlmaWNhbmRmc3EAfgAKdAFKCiAgICAgICAgPENPREU+c2lnbmlmaWNhbmQ8L0NPREU+IHJldHVybnMgdGhlIG1hbnRpc3NhIG9mIDxWQVI+eDwvVkFSPiBzY2FsZWQgdG8gdGhlIHJhbmdlCiAgICAgICAgIFsxLCAyKS4KICAgICAgICAgSXQgaXMgZXF1aXZhbGVudCB0byA8Q09ERT5zY2FsYiAoPFZBUj54PC9WQVI+LCAoZG91YmxlKSAtaWxvZ2IgKDxWQVI+eDwvVkFSPikpPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiBleGlzdHMgbWFpbmx5IGZvciB1c2UgaW4gY2VydGFpbiBzdGFuZGFyZGl6ZWQgdGVzdHMKICAgICAgICAgb2YgSUVFRSA3NTQgY29uZm9ybWFuY2UuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQABm1hdGguaHhxAH4Z83QAB2Zsb2F0IHh0AA1sb25nIGxvbmcgaW50dAAMc2lnbmlmaWNhbmRsc3EAfgAKdAFKCiAgICAgICAgPENPREU+c2lnbmlmaWNhbmQ8L0NPREU+IHJldHVybnMgdGhlIG1hbnRpc3NhIG9mIDxWQVI+eDwvVkFSPiBzY2FsZWQgdG8gdGhlIHJhbmdlCiAgICAgICAgIFsxLCAyKS4KICAgICAgICAgSXQgaXMgZXF1aXZhbGVudCB0byA8Q09ERT5zY2FsYiAoPFZBUj54PC9WQVI+LCAoZG91YmxlKSAtaWxvZ2IgKDxWQVI+eDwvVkFSPikpPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiBleGlzdHMgbWFpbmx5IGZvciB1c2UgaW4gY2VydGFpbiBzdGFuZGFyZGl6ZWQgdGVzdHMKICAgICAgICAgb2YgSUVFRSA3NTQgY29uZm9ybWFuY2UuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQABm1hdGguaHhxAH4Z+nQADWxvbmcgZG91YmxlIHh0AA1sb25nIGxvbmcgaW50dAAIc2lncGF1c2VzcQB+AAp0AP0KICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBlcXVpdmFsZW50IG9mIDxDT0RFPnNpZ3N1c3BlbmQ8L0NPREU+IDogIGl0IHNldHMgdGhlIGNhbGxpbmcgcHJvY2VzcydzIHNpZ25hbCBtYXNrIHRvIDxWQVI+bWFzazwvVkFSPiwKICAgICAgICAgYW5kIHdhaXRzIGZvciBhIHNpZ25hbCB0byBhcnJpdmUuICBPbiByZXR1cm4gdGhlIHByZXZpb3VzIHNldCBvZiBibG9ja2VkCiAgICAgICAgIHNpZ25hbHMgaXMgcmVzdG9yZWQuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHNpZ25hbC5oeHEAfhoBdAAIaW50IG1hc2t0AANpbnR0AApzaWdwZW5kaW5nc3EAfgAKdAHeCiAgICAgICAgVGhlIDxDT0RFPnNpZ3BlbmRpbmc8L0NPREU+IGZ1bmN0aW9uIHN0b3JlcyBpbmZvcm1hdGlvbiBhYm91dCBwZW5kaW5nIHNpZ25hbHMKICAgICAgICAgaW4gPFZBUj5zZXQ8L1ZBUj4uICBJZiB0aGVyZSBpcyBhIHBlbmRpbmcgc2lnbmFsIHRoYXQgaXMgYmxvY2tlZCBmcm9tCiAgICAgICAgIGRlbGl2ZXJ5LCB0aGVuIHRoYXQgc2lnbmFsIGlzIGEgbWVtYmVyIG9mIHRoZSByZXR1cm5lZCBzZXQuICAoWW91IGNhbgogICAgICAgICB0ZXN0IHdoZXRoZXIgYSBwYXJ0aWN1bGFyIHNpZ25hbCBpcyBhIG1lbWJlciBvZiB0aGlzIHNldCB1c2luZwogICAgICAgICA8Q09ERT5zaWdpc21lbWJlcjwvQ09ERT47IHNlZSBTaWduYWwgU2V0cy4pCiAgICAgICAgIDxicj48YnI+IFRoZSByZXR1cm4gdmFsdWUgaXMgPENPREU+MDwvQ09ERT4gaWYgc3VjY2Vzc2Z1bCwgYW5kIDxDT0RFPi0xPC9DT0RFPiBvbiBmYWlsdXJlLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAhzaWduYWwuaHhxAH4aCHQADXNpZ3NldF90ICpzZXR0AANpbnR0AAtzaWdwcm9jbWFza3NxAH4ACnQLjgogICAgICAgIFRoZSA8Q09ERT5zaWdwcm9jbWFzazwvQ09ERT4gZnVuY3Rpb24gaXMgdXNlZCB0byBleGFtaW5lIG9yIGNoYW5nZSB0aGUgY2FsbGluZwogICAgICAgICBwcm9jZXNzJ3Mgc2lnbmFsIG1hc2suICBUaGUgPFZBUj5ob3c8L1ZBUj4gYXJndW1lbnQgZGV0ZXJtaW5lcyBob3cgdGhlIHNpZ25hbAogICAgICAgICBtYXNrIGlzIGNoYW5nZWQsIGFuZCBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICAgICAgICAgPGJyPjxicj4gPERMPgoKCiAgICAgICAgIDxEVD48Q09ERT5TSUdfQkxPQ0s8L0NPREU+CjxERD4KICAgICAgICAgQmxvY2sgdGhlIHNpZ25hbHMgaW4gPENPREU+c2V0PC9DT0RFPi0tLWFkZCB0aGVtIHRvIHRoZSBleGlzdGluZyBtYXNrLiAgSW4KICAgICAgICAgb3RoZXIgd29yZHMsIHRoZSBuZXcgbWFzayBpcyB0aGUgdW5pb24gb2YgdGhlIGV4aXN0aW5nIG1hc2sgYW5kCiAgICAgICAgIDxWQVI+c2V0PC9WQVI+LgogICAgICAgICA8YnI+PGJyPgogICAgICAgICA8RFQ+PENPREU+U0lHX1VOQkxPQ0s8L0NPREU+CjxERD4KICAgICAgICAgVW5ibG9jayB0aGUgc2lnbmFscyBpbiA8VkFSPnNldDwvVkFSPi0tLXJlbW92ZSB0aGVtIGZyb20gdGhlIGV4aXN0aW5nIG1hc2suCiAgICAgICAgIDxicj48YnI+CiAgICAgICAgIDxMST4gU0lHX1NFVE1BU0sKICAgICAgICAgVXNlIDxWQVI+c2V0PC9WQVI+IGZvciB0aGUgbWFzazsgaWdub3JlIHRoZSBwcmV2aW91cyB2YWx1ZSBvZiB0aGUgbWFzay4KCiAgICAgICAgIDxicj48YnI+IFRoZSBsYXN0IGFyZ3VtZW50LCA8VkFSPm9sZHNldDwvVkFSPiwgaXMgdXNlZCB0byByZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlCiAgICAgICAgIG9sZCBwcm9jZXNzIHNpZ25hbCBtYXNrLiAgSWYgeW91IGp1c3Qgd2FudCB0byBjaGFuZ2UgdGhlIG1hc2sgd2l0aG91dAogICAgICAgICBsb29raW5nIGF0IGl0LCBwYXNzIGEgbnVsbCBwb2ludGVyIGFzIHRoZSA8VkFSPm9sZHNldDwvVkFSPiBhcmd1bWVudC4KICAgICAgICAgU2ltaWxhcmx5LCBpZiB5b3Ugd2FudCB0byBrbm93IHdoYXQncyBpbiB0aGUgbWFzayB3aXRob3V0IGNoYW5naW5nIGl0LAogICAgICAgICBwYXNzIGEgbnVsbCBwb2ludGVyIGZvciA8VkFSPnNldDwvVkFSPiAoaW4gdGhpcyBjYXNlIHRoZSA8VkFSPmhvdzwvVkFSPiBhcmd1bWVudAogICAgICAgICBpcyBub3Qgc2lnbmlmaWNhbnQpLiAgVGhlIDxWQVI+b2xkc2V0PC9WQVI+IGFyZ3VtZW50IGlzIG9mdGVuIHVzZWQgdG8KICAgICAgICAgcmVtZW1iZXIgdGhlIHByZXZpb3VzIHNpZ25hbCBtYXNrIGluIG9yZGVyIHRvIHJlc3RvcmUgaXQgbGF0ZXIuICAoU2luY2UKICAgICAgICAgdGhlIHNpZ25hbCBtYXNrIGlzIGluaGVyaXRlZCBvdmVyIDxDT0RFPmZvcms8L0NPREU+IGFuZCA8Q09ERT5leGVjPC9DT0RFPiBjYWxscywgeW91CiAgICAgICAgIGNhbid0IHByZWRpY3Qgd2hhdCBpdHMgY29udGVudHMgYXJlIHdoZW4geW91ciBwcm9ncmFtIHN0YXJ0cyBydW5uaW5nLikKICAgICAgICAgPGJyPjxicj4gSWYgaW52b2tpbmcgPENPREU+c2lncHJvY21hc2s8L0NPREU+IGNhdXNlcyBhbnkgcGVuZGluZyBzaWduYWxzIHRvIGJlCiAgICAgICAgIHVuYmxvY2tlZCwgYXQgbGVhc3Qgb25lIG9mIHRob3NlIHNpZ25hbHMgaXMgZGVsaXZlcmVkIHRvIHRoZSBwcm9jZXNzCiAgICAgICAgIGJlZm9yZSA8Q09ERT5zaWdwcm9jbWFzazwvQ09ERT4gcmV0dXJucy4gIFRoZSBvcmRlciBpbiB3aGljaCBwZW5kaW5nIHNpZ25hbHMKICAgICAgICAgYXJlIGRlbGl2ZXJlZCBpcyBub3Qgc3BlY2lmaWVkLCBidXQgeW91IGNhbiBjb250cm9sIHRoZSBvcmRlciBleHBsaWNpdGx5CiAgICAgICAgIGJ5IG1ha2luZyBtdWx0aXBsZSA8Q09ERT5zaWdwcm9jbWFzazwvQ09ERT4gY2FsbHMgdG8gdW5ibG9jayB2YXJpb3VzIHNpZ25hbHMKICAgICAgICAgb25lIGF0IGEgdGltZS4KICAgICAgICAgPGJyPjxicj4gVGhlIDxDT0RFPnNpZ3Byb2NtYXNrPC9DT0RFPiBmdW5jdGlvbiByZXR1cm5zIDxDT0RFPjA8L0NPREU+IGlmIHN1Y2Nlc3NmdWwsIGFuZCA8Q09ERT4tMTwvQ09ERT4KICAgICAgICAgdG8gaW5kaWNhdGUgYW4gZXJyb3IuICBUaGUgZm9sbG93aW5nIDxDT0RFPmVycm5vPC9DT0RFPiBlcnJvciBjb25kaXRpb25zIGFyZQogICAgICAgICBkZWZpbmVkIGZvciB0aGlzIGZ1bmN0aW9uOgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8TEk+IEVJTlZBTAogICAgICAgICBUaGUgPFZBUj5ob3c8L1ZBUj4gYXJndW1lbnQgaXMgaW52YWxpZC4KCiAgICAgICAgIDxicj48YnI+IFlvdSBjYW4ndCBibG9jayB0aGUgPENPREU+U0lHS0lMTDwvQ09ERT4gYW5kIDxDT0RFPlNJR1NUT1A8L0NPREU+IHNpZ25hbHMsIGJ1dAogICAgICAgICBpZiB0aGUgc2lnbmFsIHNldCBpbmNsdWRlcyB0aGVzZSwgPENPREU+c2lncHJvY21hc2s8L0NPREU+IGp1c3QgaWdub3JlcwogICAgICAgICB0aGVtIGluc3RlYWQgb2YgcmV0dXJuaW5nIGFuIGVycm9yIHN0YXR1cy4KICAgICAgICAgPGJyPjxicj4gUmVtZW1iZXIsIHRvbywgdGhhdCBibG9ja2luZyBwcm9ncmFtIGVycm9yIHNpZ25hbHMgc3VjaCBhcyA8Q09ERT5TSUdGUEU8L0NPREU+CiAgICAgICAgIGxlYWRzIHRvIHVuZGVzaXJhYmxlIHJlc3VsdHMgZm9yIHNpZ25hbHMgZ2VuZXJhdGVkIGJ5IGFuIGFjdHVhbCBwcm9ncmFtCiAgICAgICAgIGVycm9yIChhcyBvcHBvc2VkIHRvIHNpZ25hbHMgc2VudCB3aXRoIDxDT0RFPnJhaXNlPC9DT0RFPiBvciA8Q09ERT5raWxsPC9DT0RFPikuCiAgICAgICAgIFRoaXMgaXMgYmVjYXVzZSB5b3VyIHByb2dyYW0gbWF5IGJlIHRvbyBicm9rZW4gdG8gYmUgYWJsZSB0byBjb250aW51ZQogICAgICAgICBleGVjdXRpbmcgdG8gYSBwb2ludCB3aGVyZSB0aGUgc2lnbmFsIGlzIHVuYmxvY2tlZCBhZ2Fpbi4KICAgICAgICAgLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAhzaWduYWwuaHhxAH4aD3QAQGludCBob3csIGNvbnN0IHNpZ3NldF90ICpyZXN0cmljdCBzZXQsIHNpZ3NldF90ICpyZXN0cmljdCBvbGRzZXR0AANpbnR0AAlzaWdzZXRqbXBzcQB+AAp0AQgKICAgICAgICBUaGlzIGlzIHNpbWlsYXIgdG8gPENPREU+c2V0am1wPC9DT0RFPi4gIElmIDxWQVI+c2F2ZXNpZ3M8L1ZBUj4gaXMgbm9uemVybywgdGhlIHNldAogICAgICAgICBvZiBibG9ja2VkIHNpZ25hbHMgaXMgc2F2ZWQgaW4gPFZBUj5zdGF0ZTwvVkFSPiBhbmQgd2lsbCBiZSByZXN0b3JlZCBpZiBhCiAgICAgICAgIDxDT0RFPnNpZ2xvbmdqbXA8L0NPREU+IGlzIGxhdGVyIHBlcmZvcm1lZCB3aXRoIHRoaXMgPFZBUj5zdGF0ZTwvVkFSPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc2V0am1wLmh4cQB+GhZ0AB5zaWdqbXBfYnVmIHN0YXRlLCBpbnQgc2F2ZXNpZ3N0AANpbnR0AApzaWdzZXRtYXNrc3EAfgAKdAENCiAgICAgICAgVGhpcyBmdW5jdGlvbiBlcXVpdmFsZW50IHRvIDxDT0RFPnNpZ3Byb2NtYXNrPC9DT0RFPiAgd2l0aCBhIDxWQVI+aG93PC9WQVI+IGFyZ3VtZW50IG9mIDxDT0RFPlNJR19TRVRNQVNLPC9DT0RFPjogaXQgc2V0cwogICAgICAgICB0aGUgY2FsbGluZyBwcm9jZXNzJ3Mgc2lnbmFsIG1hc2sgdG8gPFZBUj5tYXNrPC9WQVI+LiAgVGhlIHJldHVybiB2YWx1ZSBpcwogICAgICAgICB0aGUgcHJldmlvdXMgc2V0IG9mIGJsb2NrZWQgc2lnbmFscy4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc2lnbmFsLmh4cQB+Gh10AAhpbnQgbWFza3QAA2ludHQACHNpZ3N0YWNrc3EAfgAKdAL3CiAgICAgICAgVGhlIDxDT0RFPnNpZ3N0YWNrPC9DT0RFPiBmdW5jdGlvbiBzcGVjaWZpZXMgYW4gYWx0ZXJuYXRlIHN0YWNrIGZvciB1c2UgZHVyaW5nCiAgICAgICAgIHNpZ25hbCBoYW5kbGluZy4gIFdoZW4gYSBzaWduYWwgaXMgcmVjZWl2ZWQgYnkgdGhlIHByb2Nlc3MgYW5kIGl0cwogICAgICAgICBhY3Rpb24gaW5kaWNhdGVzIHRoYXQgdGhlIHNpZ25hbCBzdGFjayBpcyB1c2VkLCB0aGUgc3lzdGVtIGFycmFuZ2VzIGEKICAgICAgICAgc3dpdGNoIHRvIHRoZSBjdXJyZW50bHkgaW5zdGFsbGVkIHNpZ25hbCBzdGFjayB3aGlsZSB0aGUgaGFuZGxlciBmb3IKICAgICAgICAgdGhhdCBzaWduYWwgaXMgZXhlY3V0ZWQuCiAgICAgICAgIDxicj48YnI+IElmIDxWQVI+b2xkc3RhY2s8L1ZBUj4gaXMgbm90IGEgbnVsbCBwb2ludGVyLCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudGx5CiAgICAgICAgIGluc3RhbGxlZCBzaWduYWwgc3RhY2sgaXMgcmV0dXJuZWQgaW4gdGhlIGxvY2F0aW9uIGl0IHBvaW50cyB0by4gIElmCiAgICAgICAgIDxWQVI+c3RhY2s8L1ZBUj4gaXMgbm90IGEgbnVsbCBwb2ludGVyLCB0aGVuIHRoaXMgaXMgaW5zdGFsbGVkIGFzIHRoZSBuZXcKICAgICAgICAgc3RhY2sgZm9yIHVzZSBieSBzaWduYWwgaGFuZGxlcnMuCiAgICAgICAgIDxicj48YnI+IFRoZSByZXR1cm4gdmFsdWUgaXMgPENPREU+MDwvQ09ERT4gb24gc3VjY2VzcyBhbmQgPENPREU+LTE8L0NPREU+IG9uIGZhaWx1cmUuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHNpZ25hbC5oeHEAfhokdAA3Y29uc3Qgc3RydWN0IHNpZ3N0YWNrICpzdGFjaywgc3RydWN0IHNpZ3N0YWNrICpvbGRzdGFja3QAA2ludHQACnNpZ3N1c3BlbmRzcQB+AAp0A4UKICAgICAgICBUaGlzIGZ1bmN0aW9uIHJlcGxhY2VzIHRoZSBwcm9jZXNzJ3Mgc2lnbmFsIG1hc2sgd2l0aCA8VkFSPnNldDwvVkFSPiBhbmQgdGhlbgogICAgICAgICBzdXNwZW5kcyB0aGUgcHJvY2VzcyB1bnRpbCBhIHNpZ25hbCBpcyBkZWxpdmVyZWQgd2hvc2UgYWN0aW9uIGlzIGVpdGhlcgogICAgICAgICB0byB0ZXJtaW5hdGUgdGhlIHByb2Nlc3Mgb3IgaW52b2tlIGEgc2lnbmFsIGhhbmRsaW5nIGZ1bmN0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CiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQABm1hdGguaHhxAH4acXQADWxvbmcgZG91YmxlIHh0AAtsb25nIGRvdWJsZXQABXNsZWVwc3EAfgAKdAHhCiAgICAgICAgVGhlIDxDT0RFPnNsZWVwPC9DT0RFPiBmdW5jdGlvbiB3YWl0cyBmb3IgPFZBUj5zZWNvbmRzPC9WQVI+IG9yIHVudGlsIGEgc2lnbmFsCiAgICAgICAgIGlzIGRlbGl2ZXJlZCwgd2hpY2hldmVyIGhhcHBlbnMgZmlyc3QuCiAgICAgICAgIDxicj48YnI+IElmIDxDT0RFPnNsZWVwPC9DT0RFPiBmdW5jdGlvbiByZXR1cm5zIGJlY2F1c2UgdGhlIHJlcXVlc3RlZCBpbnRlcnZhbCBpcyBvdmVyLAogICAgICAgICBpdCByZXR1cm5zIGEgdmFsdWUgb2YgemVyby4gIElmIGl0IHJldHVybnMgYmVjYXVzZSBvZiBkZWxpdmVyeSBvZiBhCiAgICAgICAgIHNpZ25hbCwgaXRzIHJldHVybiB2YWx1ZSBpcyB0aGUgcmVtYWluaW5nIHRpbWUgaW4gdGhlIHNsZWVwIGludGVydmFsLgogICAgICAgICA8YnI+PGJyPiBUaGUgPENPREU+c2xlZXA8L0NPREU+IGZ1bmN0aW9uIGlzIGRlY2xhcmVkIGluIDxUVD51bmlzdGQuaDwvVFQ+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAh1bmlzdGQuaHhxAH4aeHQAFHVuc2lnbmVkIGludCBzZWNvbmRzdAAMdW5zaWduZWQgaW50dAAIc25wcmludGZzcQB+AAp0CgoKICAgICAgICBUaGUgPENPREU+c25wcmludGY8L0NPREU+IGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gPENPREU+c3ByaW50ZjwvQ09ERT4sIGV4Y2VwdCB0aGF0CiAgICAgICAgIHRoZSA8VkFSPnNpemU8L1ZBUj4gYXJndW1lbnQgc3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvCiAgICAgICAgIHByb2R1Y2UuICBUaGUgdHJhaWxpbmcgbnVsbCBjaGFyYWN0ZXIgaXMgY291bnRlZCB0b3dhcmRzIHRoaXMgbGltaXQsIHNvCiAgICAgICAgIHlvdSBzaG91bGQgYWxsb2NhdGUgYXQgbGVhc3QgPFZBUj5zaXplPC9WQVI+IGNoYXJhY3RlcnMgZm9yIHRoZSBzdHJpbmcgPFZBUj5zPC9WQVI+LgogICAgICAgICA8YnI+PGJyPiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB3aGljaCB3b3VsZCBiZSBnZW5lcmF0ZWQKICAgICAgICAgZm9yIHRoZSBnaXZlbiBpbnB1dCwgZXhjbHVkaW5nIHRoZSB0cmFpbGluZyBudWxsLiAgSWYgdGhpcyB2YWx1ZSBpcwogICAgICAgICBncmVhdGVyIG9yIGVxdWFsIHRvIDxWQVI+c2l6ZTwvVkFSPiwgbm90IGFsbCBjaGFyYWN0ZXJzIGZyb20gdGhlIHJlc3VsdCBoYXZlCiAgICAgICAgIGJlZW4gc3RvcmVkIGluIDxWQVI+czwvVkFSPi4gIFlvdSBzaG91bGQgdHJ5IGFnYWluIHdpdGggYSBiaWdnZXIgb3V0cHV0CiAgICAgICAgIHN0cmluZy4gIEhlcmUgaXMgYW4gZXhhbXBsZSBvZiBkb2luZyB0aGlzOgogICAgICAgICA8YnI+PGJyPiA8cHJlPjxicj4KICAgICAgICAgPGJyPgogICAgICAgICAvKiBDb25zdHJ1Y3QgYSBtZXNzYWdlIGRlc2NyaWJpbmcgdGhlIHZhbHVlIG9mIGEgdmFyaWFibGU8YnI+CiAgICAgICAgICAgIHdob3NlIG5hbWUgaXMgPFZBUj5uYW1lPC9WQVI+IGFuZCB3aG9zZSB2YWx1ZSBpcyA8VkFSPnZhbHVlPC9WQVI+LiAqLzxicj4KICAgICAgICAgY2hhciAqPGJyPgogICAgICAgICBtYWtlX21lc3NhZ2UgKGNoYXIgKm5hbWUsIGNoYXIgKnZhbHVlKTxicj4KICAgICAgICAgezxicj4KICAgICAgICAgICAvKiBHdWVzcyB3ZSBuZWVkIG5vIG1vcmUgdGhhbiAxMDAgY2hhcnMgb2Ygc3BhY2UuICovPGJyPgogICAgICAgICAgIGludCBzaXplID0gMTAwOzxicj4KICAgICAgICAgICBjaGFyICpidWZmZXIgPSAoY2hhciAqKSB4bWFsbG9jIChzaXplKTs8YnI+CiAgICAgICAgICAgaW50IG5jaGFyczs8YnI+CiAgICAgICAgIDxicj4KICAgICAgICAgPGJyPgogICAgICAgICAgIGlmIChidWZmZXIgPT0gTlVMTCk8YnI+CiAgICAgICAgICAgICByZXR1cm4gTlVMTDs8YnI+CiAgICAgICAgIDxicj48YnI+ICAvKiBUcnkgdG8gcHJpbnQgaW4gdGhlIGFsbG9jYXRlZCBzcGFjZS4gKi88YnI+CiAgICAgICAgICAgbmNoYXJzID0gc25wcmludGYgKGJ1ZmZlciwgc2l6ZSwgInZhbHVlIG9mICVzIGlzICVzIiw8YnI+CiAgICAgICAgICAgICAgICAgICAgICBuYW1lLCB2YWx1ZSk7PGJyPgogICAgICAgICA8YnI+CiAgICAgICAgIDxicj4KICAgICAgICAgICBpZiAobmNoYXJzID49IHNpemUpPGJyPgogICAgICAgICAgICAgezxicj4KICAgICAgICAgICAgICAgLyogUmVhbGxvY2F0ZSBidWZmZXIgbm93IHRoYXQgd2Uga25vdzxicj4KICAgICAgICAgICAgICBob3cgbXVjaCBzcGFjZSBpcyBuZWVkZWQuICovPGJyPgogICAgICAgICAgICAgICBzaXplID0gbmNoYXJzICsgMTs8YnI+CiAgICAgICAgICAgICAgIGJ1ZmZlciA9IChjaGFyICopIHhyZWFsbG9jIChidWZmZXIsIHNpemUpOzxicj4KICAgICAgICAgPGJyPjxicj4gICAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKTxicj4KICAgICAgICAgICAgIC8qIFRyeSBhZ2Fpbi4gKi88YnI+CiAgICAgICAgICAgICBzbnByaW50ZiAoYnVmZmVyLCBzaXplLCAidmFsdWUgb2YgJXMgaXMgJXMiLDxicj4KICAgICAgICAgICAgICAgICAgIG5hbWUsIHZhbHVlKTs8YnI+CiAgICAgICAgICAgICB9PGJyPgogICAgICAgICAgIC8qIFRoZSBsYXN0IGNhbGwgd29ya2VkLCByZXR1cm4gdGhlIHN0cmluZy4gKi88YnI+CiAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcjs8YnI+CiAgICAgICAgIH08YnI+CiAgICAgICAgIDxicj4KICAgICAgICAgPC9wcmU+CiAgICAgICAgIDxicj48YnI+IEluIHByYWN0aWNlLCBpdCBpcyBvZnRlbiBlYXNpZXIganVzdCB0byB1c2UgPENPREU+YXNwcmludGY8L0NPREU+LCBiZWxvdy4KICAgICAgICAgPGJyPjxicj4gQXR0ZW50aW9uOiBJbiB2ZXJzaW9ucyBvZiB0aGUgR05VIEMgbGlicmFyeSBwcmlvciB0byAyLjEgdGhlCiAgICAgICAgIHJldHVybiB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgc3RvcmVkLCBub3QgaW5jbHVkaW5nIHRoZQogICAgICAgICB0ZXJtaW5hdGluZyBudWxsOyB1bmxlc3MgdGhlcmUgd2FzIG5vdCBlbm91Z2ggc3BhY2UgaW4gPFZBUj5zPC9WQVI+IHRvCiAgICAgICAgIHN0b3JlIHRoZSByZXN1bHQgaW4gd2hpY2ggY2FzZSA8Q09ERT4tMTwvQ09ERT4gaXMgcmV0dXJuZWQuICBUaGlzIHdhcwogICAgICAgICBjaGFuZ2VkIGluIG9yZGVyIHRvIGNvbXBseSB3aXRoIHRoZSBJU08gQzk5IHN0YW5kYXJkLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAdzdGRpby5oeHEAfhp/dAAvY2hhciAqcywgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKnRlbXBsYXRlLCAuLi50AANpbnR0AAZzb2NrZXRzcQB+AAp0Bf8KICAgICAgICBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBzb2NrZXQgYW5kIHNwZWNpZmllcyBjb21tdW5pY2F0aW9uIHN0eWxlCiAgICAgICAgIDxWQVI+c3R5bGU8L1ZBUj4sIHdoaWNoIHNob3VsZCBiZSBvbmUgb2YgdGhlIHNvY2tldCBzdHlsZXMgbGlzdGVkIGluCiAgICAgICAgIENvbW11bmljYXRpb24gU3R5bGVzLiAgVGhlIDxWQVI+bmFtZXNwYWNlPC9WQVI+IGFyZ3VtZW50IHNwZWNpZmllcwogICAgICAgICB0aGUgbmFtZXNwYWNlOyBpdCBtdXN0IGJlIDxDT0RFPlBGX0xPQ0FMPC9DT0RFPiAgb3IKICAgICAgICAgPENPREU+UEZfSU5FVDwvQ09ERT4gLiAgPFZBUj5wcm90b2NvbDwvVkFSPgogICAgICAgICBkZXNpZ25hdGVzIHRoZSBzcGVjaWZpYyBwcm90b2NvbCA7IHplcm8gaXMKICAgICAgICAgdXN1YWxseSByaWdodCBmb3IgPFZBUj5wcm90b2NvbDwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gVGhlIHJldHVybiB2YWx1ZSBmcm9tIDxDT0RFPnNvY2tldDwvQ09ERT4gaXMgdGhlIGZpbGUgZGVzY3JpcHRvciBmb3IgdGhlIG5ldwogICAgICAgICBzb2NrZXQsIG9yIDxDT0RFPi0xPC9DT0RFPiBpbiBjYXNlIG9mIGVycm9yLiAgVGhlIGZvbGxvd2luZyA8Q09ERT5lcnJubzwvQ09ERT4gZXJyb3IKICAgICAgICAgY29uZGl0aW9ucyBhcmUgZGVmaW5lZCBmb3IgdGhpcyBmdW5jdGlvbjoKICAgICAgICAgPGJyPjxicj4gPERMPgoKICAgICAgICAgPERUPjxDT0RFPkVQUk9UT05PU1VQUE9SVDwvQ09ERT4KPEREPgogICAgICAgICBUaGUgPFZBUj5wcm90b2NvbDwvVkFSPiBvciA8VkFSPnN0eWxlPC9WQVI+IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlCiAgICAgICAgIDxWQVI+bmFtZXNwYWNlPC9WQVI+IHNwZWNpZmllZC4KICAgICAgICAgPGJyPjxicj4gPExJPiBFTUZJTEUKICAgICAgICAgVGhlIHByb2Nlc3MgYWxyZWFkeSBoYXMgdG9vIG1hbnkgZmlsZSBkZXNjcmlwdG9ycyBvcGVuLgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVORklMRQogICAgICAgICBUaGUgc3lzdGVtIGFscmVhZHkgaGFzIHRvbyBtYW55IGZpbGUgZGVzY3JpcHRvcnMgb3Blbi4KICAgICAgICAgPGJyPjxicj4gPExJPiBFQUNDRVMKICAgICAgICAgVGhlIHByb2Nlc3MgZG9lcyBub3QgaGF2ZSB0aGUgcHJpdmlsZWdlIHRvIGNyZWF0ZSBhIHNvY2tldCBvZiB0aGUgc3BlY2lmaWVkCiAgICAgICAgIDxWQVI+c3R5bGU8L1ZBUj4gb3IgPFZBUj5wcm90b2NvbDwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gPExJPiBFTk9CVUZTCiAgICAgICAgIFRoZSBzeXN0ZW0gcmFuIG91dCBvZiBpbnRlcm5hbCBidWZmZXIgc3BhY2UuCgogICAgICAgICA8YnI+PGJyPiBUaGUgZmlsZSBkZXNjcmlwdG9yIHJldHVybmVkIGJ5IHRoZSA8Q09ERT5zb2NrZXQ8L0NPREU+IGZ1bmN0aW9uIHN1cHBvcnRzIGJvdGgKICAgICAgICAgcmVhZCBhbmQgd3JpdGUgb3BlcmF0aW9ucy4gIEhvd2V2ZXIsIGxpa2UgcGlwZXMsIHNvY2tldHMgZG8gbm90IHN1cHBvcnQgZmlsZQogICAgICAgICBwb3NpdGlvbmluZyBvcGVyYXRpb25zLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAxzeXMvc29ja2V0Lmh4cQB+GoZ0ACZpbnQgbmFtZXNwYWNlLCBpbnQgc3R5bGUsIGludCBwcm90b2NvbHQAA2ludHQACnNvY2tldHBhaXJzcQB+AAp0Br0KICAgICAgICBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBzb2NrZXQgcGFpciwgcmV0dXJuaW5nIHRoZSBmaWxlIGRlc2NyaXB0b3JzIGluCiAgICAgICAgIDxDT0RFPjxWQVI+ZmlsZWRlczwvVkFSPlswXTwvQ09ERT4gYW5kIDxDT0RFPjxWQVI+ZmlsZWRlczwvVkFSPlsxXTwvQ09ERT4uICBUaGUgc29ja2V0IHBhaXIKICAgICAgICAgaXMgYSBmdWxsLWR1cGxleCBjb21tdW5pY2F0aW9ucyBjaGFubmVsLCBzbyB0aGF0IGJvdGggcmVhZGluZyBhbmQgd3JpdGluZwogICAgICAgICBtYXkgYmUgcGVyZm9ybWVkIGF0IGVpdGhlciBlbmQuCiAgICAgICAgIDxicj48YnI+IFRoZSA8VkFSPm5hbWVzcGFjZTwvVkFSPiwgPFZBUj5zdHlsZTwvVkFSPiBhbmQgPFZBUj5wcm90b2NvbDwvVkFSPiBhcmd1bWVudHMgYXJlCiAgICAgICAgIGludGVycHJldGVkIGFzIGZvciB0aGUgPENPREU+c29ja2V0PC9DT0RFPiBmdW5jdGlvbi4gIDxWQVI+c3R5bGU8L1ZBUj4gc2hvdWxkIGJlCiAgICAgICAgIG9uZSBvZiB0aGUgY29tbXVuaWNhdGlvbiBzdHlsZXMgbGlzdGVkIGluIENvbW11bmljYXRpb24gU3R5bGVzLgogICAgICAgICBUaGUgPFZBUj5uYW1lc3BhY2U8L1ZBUj4gYXJndW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lc3BhY2UsIHdoaWNoIG11c3QgYmUKICAgICAgICAgPENPREU+QUZfTE9DQUw8L0NPREU+IDsgPFZBUj5wcm90b2NvbDwvVkFSPiBzcGVjaWZpZXMgdGhlCiAgICAgICAgIGNvbW11bmljYXRpb25zIHByb3RvY29sLCBidXQgemVybyBpcyB0aGUgb25seSBtZWFuaW5nZnVsIHZhbHVlLgogICAgICAgICA8YnI+PGJyPiBJZiA8VkFSPnN0eWxlPC9WQVI+IHNwZWNpZmllcyBhIGNvbm5lY3Rpb25sZXNzIGNvbW11bmljYXRpb24gc3R5bGUsIHRoZW4KICAgICAgICAgdGhlIHR3byBzb2NrZXRzIHlvdSBnZXQgYXJlIG5vdCA8RU0+Y29ubmVjdGVkPC9FTT4sIHN0cmljdGx5IHNwZWFraW5nLAogICAgICAgICBidXQgZWFjaCBvZiB0aGVtIGtub3dzIHRoZSBvdGhlciBhcyB0aGUgZGVmYXVsdCBkZXN0aW5hdGlvbiBhZGRyZXNzLAogICAgICAgICBzbyB0aGV5IGNhbiBzZW5kIHBhY2tldHMgdG8gZWFjaCBvdGhlci4KICAgICAgICAgPGJyPjxicj4gVGhlIDxDT0RFPnNvY2tldHBhaXI8L0NPREU+IGZ1bmN0aW9uIHJldHVybnMgPENPREU+MDwvQ09ERT4gb24gc3VjY2VzcyBhbmQgPENPREU+LTE8L0NPREU+CiAgICAgICAgIG9uIGZhaWx1cmUuICBUaGUgZm9sbG93aW5nIDxDT0RFPmVycm5vPC9DT0RFPiBlcnJvciBjb25kaXRpb25zIGFyZSBkZWZpbmVkCiAgICAgICAgIGZvciB0aGlzIGZ1bmN0aW9uOgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8RFQ+PENPREU+RU1GSUxFPC9DT0RFPgo8REQ+CiAgICAgICAgIFRoZSBwcm9jZXNzIGhhcyB0b28gbWFueSBmaWxlIGRlc2NyaXB0b3JzIG9wZW4uCiAgICAgICAgIDxicj48YnI+IDxMST4gRUFGTk9TVVBQT1JUCiAgICAgICAgIFRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlIGlzIG5vdCBzdXBwb3J0ZWQuCiAgICAgICAgIDxicj48YnI+IDxMST4gRVBST1RPTk9TVVBQT1JUCiAgICAgICAgIFRoZSBzcGVjaWZpZWQgcHJvdG9jb2wgaXMgbm90IHN1cHBvcnRlZC4KICAgICAgICAgPGJyPjxicj4gPExJPiBFT1BOT1RTVVBQCiAgICAgICAgIFRoZSBzcGVjaWZpZWQgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB0aGUgY3JlYXRpb24gb2Ygc29ja2V0IHBhaXJzLgoKICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAMc3lzL3NvY2tldC5oeHEAfhqNdAA2aW50IG5hbWVzcGFjZSwgaW50IHN0eWxlLCBpbnQgcHJvdG9jb2wsIGludCBmaWxlZGVzWzJddAADaW50dAAHc3ByaW50ZnNxAH4ACnQEZQogICAgICAgIFRoaXMgaXMgbGlrZSA8Q09ERT5wcmludGY8L0NPREU+LCBleGNlcHQgdGhhdCB0aGUgb3V0cHV0IGlzIHN0b3JlZCBpbiB0aGUgY2hhcmFjdGVyCiAgICAgICAgIGFycmF5IDxWQVI+czwvVkFSPiBpbnN0ZWFkIG9mIHdyaXR0ZW4gdG8gYSBzdHJlYW0uICBBIG51bGwgY2hhcmFjdGVyIGlzIHdyaXR0ZW4KICAgICAgICAgdG8gbWFyayB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCiAgICAgICAgIDxicj48YnI+IFRoZSA8Q09ERT5zcHJpbnRmPC9DT0RFPiBmdW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBzdG9yZWQgaW4KICAgICAgICAgdGhlIGFycmF5IDxWQVI+czwvVkFSPiwgbm90IGluY2x1ZGluZyB0aGUgdGVybWluYXRpbmcgbnVsbCBjaGFyYWN0ZXIuCiAgICAgICAgIDxicj48YnI+IFRoZSBiZWhhdmlvciBvZiB0aGlzIGZ1bmN0aW9uIGlzIHVuZGVmaW5lZCBpZiBjb3B5aW5nIHRha2VzIHBsYWNlCiAgICAgICAgIGJldHdlZW4gb2JqZWN0cyB0aGF0IG92ZXJsYXAtLS1mb3IgZXhhbXBsZSwgaWYgPFZBUj5zPC9WQVI+IGlzIGFsc28gZ2l2ZW4KICAgICAgICAgYXMgYW4gYXJndW1lbnQgdG8gYmUgcHJpbnRlZCB1bmRlciBjb250cm9sIG9mIHRoZSA8c2FtcD4lczwvc2FtcD4gY29udmVyc2lvbi4KICAgICAgICAgLgogICAgICAgICA8YnI+PGJyPiBXYXJuaW5nOiBUaGUgPENPREU+c3ByaW50ZjwvQ09ERT4gZnVuY3Rpb24gY2FuIGJlIDxoMz5kYW5nZXJvdXM8L2gzPgogICAgICAgICBiZWNhdXNlIGl0IGNhbiBwb3RlbnRpYWxseSBvdXRwdXQgbW9yZSBjaGFyYWN0ZXJzIHRoYW4gY2FuIGZpdCBpbiB0aGUKICAgICAgICAgYWxsb2NhdGlvbiBzaXplIG9mIHRoZSBzdHJpbmcgPFZBUj5zPC9WQVI+LiAgUmVtZW1iZXIgdGhhdCB0aGUgZmllbGQgd2lkdGgKICAgICAgICAgZ2l2ZW4gaW4gYSBjb252ZXJzaW9uIHNwZWNpZmljYXRpb24gaXMgb25seSBhIDxFTT5taW5pbXVtPC9FTT4gdmFsdWUuCiAgICAgICAgIDxicj48YnI+IFRvIGF2b2lkIHRoaXMgcHJvYmxlbSwgeW91IGNhbiB1c2UgPENPREU+c25wcmludGY8L0NPREU+IG9yIDxDT0RFPmFzcHJpbnRmPC9DT0RFPiwKICAgICAgICAgZGVzY3JpYmVkIGJlbG93LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAdzdGRpby5oeHEAfhqUdAAiY2hhciAqcywgY29uc3QgY2hhciAqdGVtcGxhdGUsIC4uLnQAA2ludHQABHNxcnRzcQB+AAp0AOoKICAgICAgICBUaGVzZSBmdW5jdGlvbnMgcmV0dXJuIHRoZSBub25uZWdhdGl2ZSBzcXVhcmUgcm9vdCBvZiA8VkFSPng8L1ZBUj4uCiAgICAgICAgIDxicj48YnI+IElmIDxWQVI+eDwvVkFSPiBpcyBuZWdhdGl2ZSwgPENPREU+c3FydDwvQ09ERT4gc2lnbmFscyBhIGRvbWFpbiBlcnJvci4KICAgICAgICAgTWF0aGVtYXRpY2FsbHksIGl0IHNob3VsZCByZXR1cm4gYSBjb21wbGV4IG51bWJlci4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGbWF0aC5oeHEAfhqbdAAIZG91YmxlIHh0AAZkb3VibGV0AAVzcXJ0ZnNxAH4ACnQA6gogICAgICAgIFRoZXNlIGZ1bmN0aW9ucyByZXR1cm4gdGhlIG5vbm5lZ2F0aXZlIHNxdWFyZSByb290IG9mIDxWQVI+eDwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gSWYgPFZBUj54PC9WQVI+IGlzIG5lZ2F0aXZlLCA8Q09ERT5zcXJ0PC9DT0RFPiBzaWduYWxzIGEgZG9tYWluIGVycm9yLgogICAgICAgICBNYXRoZW1hdGljYWxseSwgaXQgc2hvdWxkIHJldHVybiBhIGNvbXBsZXggbnVtYmVyLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZtYXRoLmh4cQB+GqJ0AAdmbG9hdCB4dAAFZmxvYXR0AAVzcXJ0bHNxAH4ACnQA6gogICAgICAgIFRoZXNlIGZ1bmN0aW9ucyByZXR1cm4gdGhlIG5vbm5lZ2F0aXZlIHNxdWFyZSByb290IG9mIDxWQVI+eDwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gSWYgPFZBUj54PC9WQVI+IGlzIG5lZ2F0aXZlLCA8Q09ERT5zcXJ0PC9DT0RFPiBzaWduYWxzIGEgZG9tYWluIGVycm9yLgogICAgICAgICBNYXRoZW1hdGljYWxseSwgaXQgc2hvdWxkIHJldHVybiBhIGNvbXBsZXggbnVtYmVyLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZtYXRoLmh4cQB+Gql0AA1sb25nIGRvdWJsZSB4dAALbG9uZyBkb3VibGV0AAVzcmFuZHNxAH4ACnQBpAogICAgICAgIFRoaXMgZnVuY3Rpb24gZXN0YWJsaXNoZXMgPFZBUj5zZWVkPC9WQVI+IGFzIHRoZSBzZWVkIGZvciBhIG5ldyBzZXJpZXMgb2YKICAgICAgICAgcHNldWRvLXJhbmRvbSBudW1iZXJzLiAgSWYgeW91IGNhbGwgPENPREU+cmFuZDwvQ09ERT4gYmVmb3JlIGEgc2VlZCBoYXMgYmVlbgogICAgICAgICBlc3RhYmxpc2hlZCB3aXRoIDxDT0RFPnNyYW5kPC9DT0RFPiwgaXQgdXNlcyB0aGUgdmFsdWUgPENPREU+MTwvQ09ERT4gYXMgYSBkZWZhdWx0CiAgICAgICAgIHNlZWQuCiAgICAgICAgIDxicj48YnI+IFRvIHByb2R1Y2UgYSBkaWZmZXJlbnQgcHNldWRvLXJhbmRvbSBzZXJpZXMgZWFjaCB0aW1lIHlvdXIgcHJvZ3JhbSBpcwogICAgICAgICBydW4sIGRvIDxDT0RFPnNyYW5kICh0aW1lICgwKSk8L0NPREU+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAhzdGRsaWIuaHhxAH4asHQAEXVuc2lnbmVkIGludCBzZWVkdAAEdm9pZHQAB3NyYW5kNDhzcQB+AAp0A70KICAgICAgICBUaGUgPENPREU+c3JhbmQ0ODwvQ09ERT4gZnVuY3Rpb24gc2V0cyB0aGUgbW9zdCBzaWduaWZpY2FudCAzMiBiaXRzIG9mIHRoZQogICAgICAgICBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgdG8gdGhlIGxlYXN0CiAgICAgICAgIHNpZ25pZmljYW50IDMyIGJpdHMgb2YgdGhlIDxWQVI+c2VlZHZhbDwvVkFSPiBwYXJhbWV0ZXIuICBUaGUgbG93ZXIgMTYgYml0cwogICAgICAgICBhcmUgaW5pdGlhbGl6ZWQgdG8gdGhlIHZhbHVlIDxDT0RFPjB4MzMwRTwvQ09ERT4uICBFdmVuIGlmIHRoZSA8Q09ERT5sb25nCiAgICAgICAgIGludDwvQ09ERT4gdHlwZSBjb250YWlucyBtb3JlIHRoYW4gMzIgYml0cyBvbmx5IHRoZSBsb3dlciAzMiBiaXRzIGFyZSB1c2VkLgogICAgICAgICA8YnI+PGJyPiBPd2luZyB0byB0aGlzIGxpbWl0YXRpb24sIGluaXRpYWxpemF0aW9uIG9mIHRoZSBzdGF0ZSBvZiB0aGlzCiAgICAgICAgIGZ1bmN0aW9uIGlzIG5vdCB2ZXJ5IHVzZWZ1bC4gIEJ1dCBpdCBtYWtlcyBpdCBlYXN5IHRvIHVzZSBhIGNvbnN0cnVjdAogICAgICAgICBsaWtlIDxDT0RFPnNyYW5kNDggKHRpbWUgKDApKTwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IEEgc2lkZS1lZmZlY3Qgb2YgdGhpcyBmdW5jdGlvbiBpcyB0aGF0IHRoZSB2YWx1ZXMgPENPREU+YTwvQ09ERT4gYW5kIDxDT0RFPmM8L0NPREU+CiAgICAgICAgIGZyb20gdGhlIGludGVybmFsIHN0YXRlLCB3aGljaCBhcmUgdXNlZCBpbiB0aGUgY29uZ3J1ZW50aWFsIGZvcm11bGEsCiAgICAgICAgIGFyZSByZXNldCB0byB0aGUgZGVmYXVsdCB2YWx1ZXMgZ2l2ZW4gYWJvdmUuICBUaGlzIGlzIG9mIGltcG9ydGFuY2Ugb25jZQogICAgICAgICB0aGUgdXNlciBoYXMgY2FsbGVkIHRoZSA8Q09ERT5sY29uZzQ4PC9DT0RFPiBmdW5jdGlvbiAoc2VlIGJlbG93KS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc3RkbGliLmh4cQB+Grd0ABBsb25nIGludCBzZWVkdmFsdAAEdm9pZHQACXNyYW5kNDhfcnNxAH4ACnQCNgogICAgICAgIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgcmVwcmVzZW50ZWQgYnkgdGhlCiAgICAgICAgIGluZm9ybWF0aW9uIGluIDxWQVI+YnVmZmVyPC9WQVI+IGlzIGluaXRpYWxpemVkIHNpbWlsYXJseSB0byB3aGF0IHRoZSBmdW5jdGlvbgogICAgICAgICA8Q09ERT5zcmFuZDQ4PC9DT0RFPiBkb2VzLiAgVGhlIHN0YXRlIGlzIGluaXRpYWxpemVkIGZyb20gdGhlIHBhcmFtZXRlcgogICAgICAgICA8VkFSPnNlZWR2YWw8L1ZBUj4gYW5kIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY29uZ3J1ZW50aWFsIGZvcm11bGEgYXJlCiAgICAgICAgIGluaXRpYWxpemVkIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgogICAgICAgICA8YnI+PGJyPiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIG5vbi1uZWdhdGl2ZSB0aGUgZnVuY3Rpb24gY2FsbCBzdWNjZWVkZWQuCiAgICAgICAgIDxicj48YnI+IFRoaXMgZnVuY3Rpb24gaXMgYSBHTlUgZXh0ZW5zaW9uIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgaW4gcG9ydGFibGUKICAgICAgICAgcHJvZ3JhbXMuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHN0ZGxpYi5oeHEAfhq+dAAtbG9uZyBpbnQgc2VlZHZhbCwgc3RydWN0IGRyYW5kNDhfZGF0YSAqYnVmZmVydAADaW50dAAHc3JhbmRvbXNxAH4ACnQBwAogICAgICAgIFRoZSA8Q09ERT5zcmFuZG9tPC9DT0RFPiBmdW5jdGlvbiBzZXRzIHRoZSBzdGF0ZSBvZiB0aGUgcmFuZG9tIG51bWJlcgogICAgICAgICBnZW5lcmF0b3IgYmFzZWQgb24gdGhlIGludGVnZXIgPFZBUj5zZWVkPC9WQVI+LiAgSWYgeW91IHN1cHBseSBhIDxWQVI+c2VlZDwvVkFSPiB2YWx1ZQogICAgICAgICBvZiA8Q09ERT4xPC9DT0RFPiwgdGhpcyB3aWxsIGNhdXNlIDxDT0RFPnJhbmRvbTwvQ09ERT4gdG8gcmVwcm9kdWNlIHRoZSBkZWZhdWx0IHNldAogICAgICAgICBvZiByYW5kb20gbnVtYmVycy4KICAgICAgICAgPGJyPjxicj4gVG8gcHJvZHVjZSBhIGRpZmZlcmVudCBzZXQgb2YgcHNldWRvLXJhbmRvbSBudW1iZXJzIGVhY2ggdGltZSB5b3VyCiAgICAgICAgIHByb2dyYW0gcnVucywgZG8gPENPREU+c3JhbmRvbSAodGltZSAoMCkpPC9DT0RFPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc3RkbGliLmh4cQB+GsV0ABF1bnNpZ25lZCBpbnQgc2VlZHQABHZvaWR0AAlzcmFuZG9tX3JzcQB+AAp0APcKICAgICAgICBUaGUgPENPREU+c3JhbmRvbV9yPC9DT0RFPiBmdW5jdGlvbiBiZWhhdmVzIGV4YWN0bHkgbGlrZSB0aGUgPENPREU+c3JhbmRvbTwvQ09ERT4KICAgICAgICAgZnVuY3Rpb24gZXhjZXB0IHRoYXQgaXQgdXNlcyBhbmQgbW9kaWZpZXMgdGhlIHN0YXRlIGluIHRoZSBvYmplY3QKICAgICAgICAgcG9pbnRlZCB0byBieSB0aGUgc2Vjb25kIHBhcmFtZXRlciBpbnN0ZWFkIG9mIHRoZSBnbG9iYWwgc3RhdGUuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHN0ZGxpYi5oeHEAfhrMdAAqdW5zaWduZWQgaW50IHNlZWQsIHN0cnVjdCByYW5kb21fZGF0YSAqYnVmdAADaW50dAAGc3NjYW5mc3EAfgAKdAIvCiAgICAgICAgVGhpcyBpcyBsaWtlIDxDT0RFPnNjYW5mPC9DT0RFPiwgZXhjZXB0IHRoYXQgdGhlIGNoYXJhY3RlcnMgYXJlIHRha2VuIGZyb20gdGhlCiAgICAgICAgIG51bGwtdGVybWluYXRlZCBzdHJpbmcgPFZBUj5zPC9WQVI+IGluc3RlYWQgb2YgZnJvbSBhIHN0cmVhbS4gIFJlYWNoaW5nIHRoZQogICAgICAgICBlbmQgb2YgdGhlIHN0cmluZyBpcyB0cmVhdGVkIGFzIGFuIGVuZC1vZi1maWxlIGNvbmRpdGlvbi4KICAgICAgICAgPGJyPjxicj4gVGhlIGJlaGF2aW9yIG9mIHRoaXMgZnVuY3Rpb24gaXMgdW5kZWZpbmVkIGlmIGNvcHlpbmcgdGFrZXMgcGxhY2UKICAgICAgICAgYmV0d2VlbiBvYmplY3RzIHRoYXQgb3ZlcmxhcC0tLWZvciBleGFtcGxlLCBpZiA8VkFSPnM8L1ZBUj4gaXMgYWxzbyBnaXZlbgogICAgICAgICBhcyBhbiBhcmd1bWVudCB0byByZWNlaXZlIGEgc3RyaW5nIHJlYWQgdW5kZXIgY29udHJvbCBvZiB0aGUgPHNhbXA+JXM8L3NhbXA+LAogICAgICAgICA8c2FtcD4lUzwvc2FtcD4sIG9yIDxzYW1wPiVbPC9zYW1wPiBjb252ZXJzaW9uLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAdzdGRpby5oeHEAfhrTdAAoY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqdGVtcGxhdGUsIC4uLnQAA2ludHQAB3NzaWduYWxzcQB+AAp0AJkKICAgICAgICBUaGUgPENPREU+c3NpZ25hbDwvQ09ERT4gZnVuY3Rpb24gZG9lcyB0aGUgc2FtZSB0aGluZyBhcyA8Q09ERT5zaWduYWw8L0NPREU+OyBpdCBpcwogICAgICAgICBwcm92aWRlZCBvbmx5IGZvciBjb21wYXRpYmlsaXR5IHdpdGggU1ZJRC4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc2lnbmFsLmh4cQB+Gtp0AB9pbnQgc2lnbnVtLCBzaWdoYW5kbGVyX3QgYWN0aW9udAAMc2lnaGFuZGxlcl90dAAEc3RhdHNxAH4ACnQEOQogICAgICAgIFRoZSA8Q09ERT5zdGF0PC9DT0RFPiBmdW5jdGlvbiByZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhdHRyaWJ1dGVzIG9mIHRoZQogICAgICAgICBmaWxlIG5hbWVkIGJ5IDxWQVI+ZmlsZW5hbWU8L1ZBUj4gaW4gdGhlIHN0cnVjdHVyZSBwb2ludGVkIHRvIGJ5IDxWQVI+YnVmPC9WQVI+LgogICAgICAgICA8YnI+PGJyPiBJZiA8VkFSPmZpbGVuYW1lPC9WQVI+IGlzIHRoZSBuYW1lIG9mIGEgc3ltYm9saWMgbGluaywgdGhlIGF0dHJpYnV0ZXMgeW91IGdldAogICAgICAgICBkZXNjcmliZSB0aGUgZmlsZSB0aGF0IHRoZSBsaW5rIHBvaW50cyB0by4gIElmIHRoZSBsaW5rIHBvaW50cyB0byBhCiAgICAgICAgIG5vbmV4aXN0ZW50IGZpbGUgbmFtZSwgdGhlbiA8Q09ERT5zdGF0PC9DT0RFPiBmYWlscyByZXBvcnRpbmcgYSBub25leGlzdGVudAogICAgICAgICBmaWxlLgogICAgICAgICA8YnI+PGJyPiBUaGUgcmV0dXJuIHZhbHVlIGlzIDxDT0RFPjA8L0NPREU+IGlmIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bCwgb3IKICAgICAgICAgPENPREU+LTE8L0NPREU+IG9uIGZhaWx1cmUuICBJbiBhZGRpdGlvbiB0byB0aGUgdXN1YWwgZmlsZSBuYW1lIGVycm9ycwogICAgICAgICAoLCB0aGUgZm9sbG93aW5nIDxDT0RFPmVycm5vPC9DT0RFPiBlcnJvciBjb25kaXRpb25zCiAgICAgICAgIGFyZSBkZWZpbmVkIGZvciB0aGlzIGZ1bmN0aW9uOgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8RFQ+PENPREU+RU5PRU5UPC9DT0RFPgo8REQ+CiAgICAgICAgIFRoZSBmaWxlIG5hbWVkIGJ5IDxWQVI+ZmlsZW5hbWU8L1ZBUj4gZG9lc24ndCBleGlzdC4KCiAgICAgICAgIDxicj48YnI+IFdoZW4gdGhlIHNvdXJjZXMgYXJlIGNvbXBpbGVkIHdpdGggPENPREU+X0ZJTEVfT0ZGU0VUX0JJVFMgPT0gNjQ8L0NPREU+IHRoaXMKICAgICAgICAgZnVuY3Rpb24gaXMgaW4gZmFjdCA8Q09ERT5zdGF0NjQ8L0NPREU+IHNpbmNlIHRoZSBMRlMgaW50ZXJmYWNlIHRyYW5zcGFyZW50bHkKICAgICAgICAgcmVwbGFjZXMgdGhlIG5vcm1hbCBpbXBsZW1lbnRhdGlvbi4KICAgICAgICBzcQB+AA8AAAACdwQAAAACdAAKc3lzL3N0YXQuaHQAC3N5cy90eXBlcy5oeHEAfhrhdAAmY29uc3QgY2hhciAqZmlsZW5hbWUsIHN0cnVjdCBzdGF0ICpidWZ0AANpbnR0AAZzdGF0NjRzcQB+AAp0AiIKICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gPENPREU+c3RhdDwvQ09ERT4gYnV0IGl0IGlzIGFsc28gYWJsZSB0byB3b3JrIG9uCiAgICAgICAgIGZpbGVzIGxhcmdlciB0aGVuIDJeMzEgYnl0ZXMgb24gMzItYml0IHN5c3RlbXMuICBUbyBiZSBhYmxlIHRvIGRvCiAgICAgICAgIHRoaXMgdGhlIHJlc3VsdCBpcyBzdG9yZWQgaW4gYSB2YXJpYWJsZSBvZiB0eXBlIDxDT0RFPnN0cnVjdCBzdGF0NjQ8L0NPREU+IHRvCiAgICAgICAgIHdoaWNoIDxWQVI+YnVmPC9WQVI+IG11c3QgcG9pbnQuCiAgICAgICAgIDxicj48YnI+IFdoZW4gdGhlIHNvdXJjZXMgYXJlIGNvbXBpbGVkIHdpdGggPENPREU+X0ZJTEVfT0ZGU0VUX0JJVFMgPT0gNjQ8L0NPREU+IHRoaXMKICAgICAgICAgZnVuY3Rpb24gaXMgYXZhaWxhYmxlIHVuZGVyIHRoZSBuYW1lIDxDT0RFPnN0YXQ8L0NPREU+IGFuZCBzbyB0cmFuc3BhcmVudGx5CiAgICAgICAgIHJlcGxhY2VzIHRoZSBpbnRlcmZhY2UgZm9yIHNtYWxsIGZpbGVzIG9uIDMyLWJpdCBtYWNoaW5lcy4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAKc3lzL3N0YXQuaHhxAH4a6XQAKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBzdHJ1Y3Qgc3RhdDY0ICpidWZ0AANpbnR0AAVzdGltZXNxAH4ACnQDKwogICAgICAgIDxDT0RFPnN0aW1lPC9DT0RFPiBzZXRzIHRoZSBzeXN0ZW0gY2xvY2ssIGkuZS4sIGl0IHRlbGxzIHRoZSBzeXN0ZW0gdGhhdCB0aGUKICAgICAgICAgY3VycmVudCBjYWxlbmRhciB0aW1lIGlzIDxWQVI+bmV3dGltZTwvVkFSPiwgd2hlcmUgPENPREU+bmV3dGltZTwvQ09ERT4gaXMKICAgICAgICAgaW50ZXJwcmV0ZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBhYm92ZSBkZWZpbml0aW9uIG9mIDxDT0RFPnRpbWVfdDwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IDxDT0RFPnNldHRpbWVvZmRheTwvQ09ERT4gaXMgYSBuZXdlciBmdW5jdGlvbiB3aGljaCBzZXRzIHRoZSBzeXN0ZW0gY2xvY2sgdG8KICAgICAgICAgYmV0dGVyIHRoYW4gb25lIHNlY29uZCBwcmVjaXNpb24uICA8Q09ERT5zZXR0aW1lb2ZkYXk8L0NPREU+IGlzIGdlbmVyYWxseSBhCiAgICAgICAgIGJldHRlciBjaG9pY2UgdGhhbiA8Q09ERT5zdGltZTwvQ09ERT4uICAuCiAgICAgICAgIDxicj48YnI+IE9ubHkgdGhlIHN1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ICA8YnI+PGJyPiBJZiB0aGUgbGVuZ3RoIG9mIDxWQVI+ZnJvbTwvVkFSPiBpcyBtb3JlIHRoZW4gPFZBUj5zaXplPC9WQVI+LCB0aGVuIDxDT0RFPnN0cG5jcHk8L0NPREU+CiAgICAgICAgIGNvcGllcyBqdXN0IHRoZSBmaXJzdCA8VkFSPnNpemU8L1ZBUj4gY2hhcmFjdGVycyBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlCiAgICAgICAgIGNoYXJhY3RlciBkaXJlY3RseSBmb2xsb3dpbmcgdGhlIG9uZSB3aGljaCB3YXMgY29waWVkIGxhc3QuICBOb3RlIHRoYXQgaW4KICAgICAgICAgdGhpcyBjYXNlIHRoZXJlIGlzIG5vIG51bGwgdGVybWluYXRvciB3cml0dGVuIGludG8gPFZBUj50bzwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gSWYgdGhlIGxlbmd0aCBvZiA8VkFSPmZyb208L1ZBUj4gaXMgbGVzcyB0aGFuIDxWQVI+c2l6ZTwvVkFSPiwgdGhlbiA8Q09ERT5zdHBuY3B5PC9DT0RFPgogICAgICAgICBjb3BpZXMgYWxsIG9mIDxWQVI+ZnJvbTwvVkFSPiwgZm9sbG93ZWQgYnkgZW5vdWdoIG51bGwgY2hhcmFjdGVycyB0byBhZGQgdXAKICAgICAgICAgdG8gPFZBUj5zaXplPC9WQVI+IGNoYXJhY3RlcnMgaW4gYWxsLiAgVGhpcyBiZWhhdmlvciBpcyByYXJlbHkgdXNlZnVsLCBidXQgaXQKICAgICAgICAgaXMgaW1wbGVtZW50ZWQgdG8gYmUgdXNlZnVsIGluIGNvbnRleHRzIHdoZXJlIHRoaXMgYmVoYXZpb3Igb2YgdGhlCiAgICAgICAgIDxDT0RFPnN0cm5jcHk8L0NPREU+IGlzIHVzZWQuICA8Q09ERT5zdHBuY3B5PC9DT0RFPiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUKICAgICAgICAgPEVNPmZpcnN0PC9FTT4gd3JpdHRlbiBudWxsIGNoYXJhY3Rlci4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBJU08gb3IgUE9TSVggYnV0IHdhcyBmb3VuZCB1c2VmdWwgd2hpbGUKICAgICAgICAgZGV2ZWxvcGluZyB0aGUgR05VIEMgTGlicmFyeSBpdHNlbGYuCiAgICAgICAgIDxicj48YnI+IEl0cyBiZWhhdmlvciBpcyB1bmRlZmluZWQgaWYgdGhlIHN0cmluZ3Mgb3ZlcmxhcC4gIFRoZSBmdW5jdGlvbiBpcwogICAgICAgICBkZWNsYXJlZCBpbiA8VFQ+c3RyaW5nLmg8L1RUPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc3RyaW5nLmh4cQB+Gv50ADljaGFyICpyZXN0cmljdCB0bywgY29uc3QgY2hhciAqcmVzdHJpY3QgZnJvbSwgc2l6ZV90IHNpemV0AAZjaGFyICp0AApzdHJjYXNlY21wc3EAfgAKdAHfCiAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBsaWtlIDxDT0RFPnN0cmNtcDwvQ09ERT4sIGV4Y2VwdCB0aGF0IGRpZmZlcmVuY2VzIGluIGNhc2UgYXJlCiAgICAgICAgIGlnbm9yZWQuICBIb3cgdXBwZXJjYXNlIGFuZCBsb3dlcmNhc2UgY2hhcmFjdGVycyBhcmUgcmVsYXRlZCBpcwogICAgICAgICBkZXRlcm1pbmVkIGJ5IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbG9jYWxlLiAgSW4gdGhlIHN0YW5kYXJkIDxDT0RFPiJDIjwvQ09ERT4KICAgICAgICAgbG9jYWxlIHRoZSBjaGFyYWN0ZXJzICJBIGFuZCAiYSBkbyBub3QgbWF0Y2ggYnV0IGluIGEgbG9jYWxlIHdoaWNoCiAgICAgICAgIHJlZ2FyZHMgdGhlc2UgY2hhcmFjdGVycyBhcyBwYXJ0cyBvZiB0aGUgYWxwaGFiZXQgdGhleSBkbyBtYXRjaC4KICAgICAgICAgPGJyPjxicj4KICAgICAgICAgPENPREU+c3RyY2FzZWNtcDwvQ09ERT4gaXMgZGVyaXZlZCBmcm9tIEJTRC4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc3RyaW5nLmh4cQB+GwV0AB5jb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczJ0AANpbnR0AApzdHJjYXNlc3Ryc3EAfgAKdAHNCiAg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cmluZy5oeHEAfhshdAAZY29uc3QgY2hhciAqc3RyaW5nLCBpbnQgY3QABmNoYXIgKnQABnN0cmNtcHNxAH4ACnQDTgogICAgICAgIFRoZSA8Q09ERT5zdHJjbXA8L0NPREU+IGZ1bmN0aW9uIGNvbXBhcmVzIHRoZSBzdHJpbmcgPFZBUj5zMTwvVkFSPiBhZ2FpbnN0CiAgICAgICAgIDxWQVI+czI8L1ZBUj4sIHJldHVybmluZyBhIHZhbHVlIHRoYXQgaGFzIHRoZSBzYW1lIHNpZ24gYXMgdGhlIGRpZmZlcmVuY2UKICAgICAgICAgYmV0d2VlbiB0aGUgZmlyc3QgZGlmZmVyaW5nIHBhaXIgb2YgY2hhcmFjdGVycyAoaW50ZXJwcmV0ZWQgYXMKICAgICAgICAgPENPREU+dW5zaWduZWQgY2hhcjwvQ09ERT4gb2JqZWN0cywgdGhlbiBwcm9tb3RlZCB0byA8Q09ERT5pbnQ8L0NPREU+KS4KICAgICAgICAgPGJyPjxicj4gSWYgdGhlIHR3byBzdHJpbmdzIGFyZSBlcXVhbCwgPENPREU+c3RyY21wPC9DT0RFPiByZXR1cm5zIDxDT0RFPjA8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBBIGNvbnNlcXVlbmNlIG9mIHRoZSBvcmRlcmluZyB1c2VkIGJ5IDxDT0RFPnN0cmNtcDwvQ09ERT4gaXMgdGhhdCBpZiA8VkFSPnMxPC9WQVI+CiAgICAgICAgIGlzIGFuIGluaXRpYWwgc3Vic3RyaW5nIG9mIDxWQVI+czI8L1ZBUj4sIHRoZW4gPFZBUj5zMTwvVkFSPiBpcyBjb25zaWRlcmVkIHRvIGJlCiAgICAgICAgIGBgbGVzcyB0aGFuJycgPFZBUj5zMjwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gPENPREU+c3RyY21wPC9DT0RFPiBkb2VzIG5vdCB0YWtlIHNvcnRpbmcgY29udmVudGlvbnMgb2YgdGhlIGxhbmd1YWdlIHRoZQogICAgICAgICBzdHJpbmdzIGFyZSB3cml0dGVuIGluIGludG8gYWNjb3VudC4gIFRvIGdldCB0aGF0IG9uZSBoYXMgdG8gdXNlCiAgICAgICAgIDxDT0RFPnN0cmNvbGw8L0NP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BnN0cmR1cHNxAH4ACnQBhAogICAgICAgIFRoaXMgZnVuY3Rpb24gY29waWVzIHRoZSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIDxWQVI+czwvVkFSPiBpbnRvIGEgbmV3bHkKICAgICAgICAgYWxsb2NhdGVkIHN0cmluZy4gIFRoZSBzdHJpbmcgaXMgYWxsb2NhdGVkIHVzaW5nIDxDT0RFPm1hbGxvYzwvQ09ERT47IHNlZQogICAgICAgICBVbmNvbnN0cmFpbmVkIEFsbG9jYXRpb24uICBJZiA8Q09ERT5tYWxsb2M8L0NPREU+IGNhbm5vdCBhbGxvY2F0ZSBzcGFjZQogICAgICAgICBmb3IgdGhlIG5ldyBzdHJpbmcsIDxDT0RFPnN0cmR1cDwvQ09ERT4gcmV0dXJucyBhIG51bGwgcG9pbnRlci4gIE90aGVyd2lzZSBpdAogICAgICAgICByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbmV3IHN0cmluZy4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc3RyaW5nLmh4cQB+G0R0AA1jb25zdCBjaGFyICpzdAAGY2hhciAqdAAIc3RyZXJyb3JzcQB+AAp0AsEKICAgICAgICBUaGUgPENPREU+c3RyZXJyb3I8L0NPREU+IGZ1bmN0aW9uIG1hcHMgdGhlIGVycm9yIGNvZGUgIHNwZWNpZmllZCBieSB0aGUgPFZBUj5lcnJudW08L1ZBUj4gYXJndW1lbnQgdG8gYSBkZXNjcmlwdGl2ZSBlcnJvcgogICAgICAgICBtZXNzYWdlIHN0cmluZy4gIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBwb2ludGVyIHRvIHRoaXMgc3RyaW5nLgogICAgICAgICA8YnI+PGJyPiBUaGUgdmFsdWUgPFZBUj5lcnJudW08L1ZBUj4gbm9ybWFsbHkgY29tZXMgZnJvbSB0aGUgdmFyaWFibGUgPENPREU+ZXJybm88L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBZb3Ugc2hvdWxkIG5vdCBtb2RpZnkgdGhlIHN0cmluZyByZXR1cm5lZCBieSA8Q09ERT5zdHJlcnJvcjwvQ09ERT4uICBBbHNvLCBpZgogICAgICAgICB5b3UgbWFrZSBzdWJzZXF1ZW50IGNhbGxzIHRvIDxDT0RFPnN0cmVycm9yPC9DT0RFPiwgdGhlIHN0cmluZyBtaWdodCBiZQogICAgICAgICBvdmVyd3JpdHRlbi4gIChCdXQgaXQncyBndWFyYW50ZWVkIHRoYXQgbm8gbGlicmFyeSBmdW5jdGlvbiBldmVyIGNhbGxzCiAgICAgICAgIDxDT0RFPnN0cmVycm9yPC9DT0RFPiBiZWhpbmQgeW91ciBiYWNrLikKICAgICAgICAgPGJyPjxicj4gVGhlIGZ1bmN0aW9uIDxDT0RFPnN0cmVycm9yPC9DT0RFPiBpcyBkZWNsYXJlZCBpbiA8VFQ+c3RyaW5nLmg8L1RUPi4KICAgICAgICBzcQB+AA8AAAACdwQAAAACdAAHZXJybm8uaHQACHN0cmluZy5oeHEAfhtLdAAKaW50IGVycm51bXQABmNoYXIgKnQACnN0cmVycm9yX3JzcQB+AAp0A8QKICAgICAgICBUaGUgPENPREU+c3RyZXJyb3JfcjwvQ09ERT4gZnVuY3Rpb24gd29ya3MgbGlrZSA8Q09ERT5zdHJlcnJvcjwvQ09ERT4gYnV0IGluc3RlYWQgb2YKICAgICAgICAgcmV0dXJuaW5nIHRoZSBlcnJvciBtZXNzYWdlIGluIGEgc3RhdGljYWxseSBhbGxvY2F0ZWQgYnVmZmVyIHNoYXJlZCBieQogICAgICAgICBhbGwgdGhyZWFkcyBpbiB0aGUgcHJvY2VzcywgaXQgcmV0dXJucyBhIHByaXZhdGUgY29weSBmb3IgdGhlCiAgICAgICAgIHRocmVhZC4gVGhpcyBtaWdodCBiZSBlaXRoZXIgc29tZSBwZXJtYW5lbnQgZ2xvYmFsIGRhdGEgb3IgYSBtZXNzYWdlCiAgICAgICAgIHN0cmluZyBpbiB0aGUgdXNlciBzdXBwbGllZCBidWZmZXIgc3RhcnRpbmcgYXQgPFZBUj5idWY8L1ZBUj4gd2l0aCB0aGUKICAgICAgICAgbGVuZ3RoIG9mIDxWQVI+bjwvVkFSPiBieXRlcy4KICAgICAgICAgPGJyPjxicj4gQXQgbW9zdCA8VkFSPm48L1ZBUj4gY2hhcmFjdGVycyBhcmUgd3JpdHRlbiAoaW5jbHVkaW5nIHRoZSBOVUwgYnl0ZSkgc28gaXQgaXMKICAgICAgICAgdXAgdG8gdGhlIHVzZXIgdG8gc2VsZWN0IHRoZSBidWZmZXIgbGFyZ2UgZW5vdWdoLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBhbHdheXMgYmUgdXNlZCBpbiBtdWx0aS10aHJlYWRlZCBwcm9ncmFtcyBzaW5jZQogICAgICAgICB0aGVyZSBpcyBubyB3YXkgdG8gZ3VhcmFudGVlIHRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgPENPREU+c3RyZXJyb3I8L0NPREU+CiAgICAgICAgIHJlYWxseSBiZWxvbmdzIHRvIHRoZSBsYXN0IGNhbGwgb2YgdGhlIGN1cnJlbnQgdGhyZWFkLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIDxDT0RFPnN0cmVycm9yX3I8L0NPREU+IGlzIGEgR05VIGV4dGVuc2lvbiBhbmQgaXQgaXMgZGVjbGFyZWQgaW4KICAgICAgICAgPFRUPnN0cmluZy5oPC9UVD4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHN0cmluZy5oeHEAfhtTdAAfaW50IGVycm51bSwgY2hhciAqYnVmLCBzaXplX3QgbnQABmNoYXIgKnQAB3N0cmZtb25zcQB+AAp0GMgKICAgICAgICBUaGUgPENPREU+c3RyZm1vbjwvQ09ERT4gZnVuY3Rpb24gaXMgc2ltaWxhciB0byB0aGUgPENPREU+c3RyZnRpbWU8L0NPREU+IGZ1bmN0aW9uCiAgICAgICAgIGluIHRoYXQgaXQgdGFrZXMgYSBidWZmZXIsIGl0cyBzaXplLCBhIGZvcm1hdCBzdHJpbmcsCiAgICAgICAgIGFuZCB2YWx1ZXMgdG8gd3JpdGUgaW50byB0aGUgYnVmZmVyIGFzIHRleHQgaW4gYSBmb3JtIHNwZWNpZmllZAogICAgICAgICBieSB0aGUgZm9ybWF0IHN0cmluZy4gIExpa2UgPENPREU+c3RyZnRpbWU8L0NPREU+LCB0aGUgZnVuY3Rpb24KICAgICAgICAgYWxzbyByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBpbnRvIHRoZSBidWZmZXIuCiAgICAgICAgIDxicj48YnI+IFRoZXJlIGFyZSB0d28gZGlmZmVyZW5jZXM6IDxDT0RFPnN0cmZtb248L0NPREU+IGNhbiB0YWtlIG1vcmUgdGhhbiBvbmUKICAgICAgICAgYXJndW1lbnQsIGFuZCwgb2YgY291cnNlLCB0aGUgZm9ybWF0IHNwZWNpZmljYXRpb24gaXMgZGlmZmVyZW50LiAgTGlrZQogICAgICAgICA8Q09ERT5zdHJmdGltZTwvQ09ERT4sIHRoZSBmb3JtYXQgc3RyaW5nIGNvbnNpc3RzIG9mIG5vcm1hbCB0ZXh0LCB3aGljaCBpcwogICAgICAgICBvdXRwdXQgYXMgaXMsIGFuZCBmb3JtYXQgc3BlY2lmaWVycywgd2hpY2ggYXJlIGluZGljYXRlZCBieSBhIDxzYW1wPiU8L3NhbXA+LgogICAgICAgICBJbW1lZGlhdGVseSBhZnRlciB0aGUgPHNhbXA+JTwvc2FtcD4sIHlvdSBjYW4gb3B0aW9uYWxseSBzcGVjaWZ5IHZhcmlvdXMgZmxhZ3MKICAgICAgICAgYW5kIGZvcm1hdHRpbmcgaW5mb3JtYXRpb24gYmVmb3JlIHRoZSBtYWluIGZvcm1hdHRpbmcgY2hhcmFjdGVyLCBpbiBhCiAgICAgICAgIHNpbWlsYXIgd2F5IHRvIDxDT0RFPnByaW50ZjwvQ09ERT46CiAgICAgICAgIDxicj48YnI+IDxPTD4KICAgICAgICAgPExJPgogICAgICAgICBJbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlIDxzYW1wPiU8L3NhbXA+IHRoZXJlIGNhbiBiZSBvbmUgb3IgbW9yZSBvZiB0aGUKICAgICAgICAgZm9sbG93aW5nIGZsYWdzOgogICAgICAgICA8REw+CgogICAgICAgICA8TEk+IDxzYW1wPj08VkFSPmY8L1ZBUj48L3NhbXA+CiAgICAgICAgIFRoZSBzaW5nbGUgYnl0ZSBjaGFyYWN0ZXIgPFZBUj5mPC9WQVI+IGlzIHVzZWQgZm9yIHRoaXMgZmllbGQgYXMgdGhlIG51bWVyaWMKICAgICAgICAgZmlsbCBjaGFyYWN0ZXIuICBCeSBkZWZhdWx0IHRoaXMgY2hhcmFjdGVyIGlzIGEgc3BhY2UgY2hhcmFjdGVyLgogICAgICAgICBGaWxsaW5nIHdpdGggdGhpcyBjaGFyYWN0ZXIgaXMgb25seSBwZXJmb3JtZWQgaWYgYSBsZWZ0IHByZWNpc2lvbgogICAgICAgICBpcyBzcGVjaWZpZWQuICBJdCBpcyBub3QganVzdCB0byBmaWxsIHRvIHRoZSBnaXZlbiBmaWVsZCB3aWR0aC4KICAgICAgICAgPExJPiA8c2FtcD5ePC9zYW1wPgogICAgICAgICBUaGUgbnVtYmVyIGlzIHByaW50ZWQgd2l0aG91dCBncm91cGluZyB0aGUgZGlnaXRzIGFjY29yZGluZyB0byB0aGUgcnVsZXMKICAgICAgICAgb2YgdGhlIGN1cnJlbnQgbG9jYWxlLiAgQnkgZGVmYXVsdCBncm91cGluZyBpcyBlbmFibGVkLgogICAgICAgICA8TEk+IDxzYW1wPis8L3NhbXA+LCA8c2FtcD4oPC9zYW1wPgogICAgICAgICBBdCBtb3N0IG9uZSBvZiB0aGVzZSBmbGFncyBjYW4gYmUgdXNlZC4gIFRoZXkgc2VsZWN0IHdoaWNoIGZvcm1hdCB0bwogICAgICAgICByZXByZXNlbnQgdGhlIHNpZ24gb2YgYSBjdXJyZW5jeSBhbW91bnQuICBCeSBkZWZhdWx0LCBhbmQgaWYKICAgICAgICAgPHNhbXA+Kzwvc2FtcD4gaXMgZ2l2ZW4sIHRoZSBsb2NhbGUgZXF1aXZhbGVudCBvZiArLy0gaXMgdXNlZC4gIElmCiAgICAgICAgIDxzYW1wPig8L3NhbXA+IGlzIGdpdmVuLCBuZWdhdGl2ZSBhbW91bnRzIGFyZSBlbmNsb3NlZCBpbiBwYXJlbnRoZXNlcy4gIFRoZQogICAgICAgICBleGFjdCBmb3JtYXQgaXMgZGV0ZXJtaW5lZCBieSB0aGUgdmFsdWVzIG9mIHRoZSA8Q09ERT5MQ19NT05FVEFSWTwvQ09ERT4KICAgICAgICAgY2F0ZWdvcnkgb2YgdGhlIGxvY2FsZSBzZWxlY3RlZCBhdCBwcm9ncmFtIHJ1bnRpbWUuCiAgICAgICAgIDxMST4gPHNhbXA+ITwvc2FtcD4KICAgICAgICAgVGhlIG91dHB1dCB3aWxsIG5vdCBjb250YWluIHRoZSBjdXJyZW5jeSBzeW1ib2wuCiAgICAgICAgIDxMST4gPHNhbXA+LTwvc2FtcD4KICAgICAgICAgVGhlIG91dHB1dCB3aWxsIGJlIGZvcm1hdHRlZCBsZWZ0LWp1c3RpZmllZCBpbnN0ZWFkIG9mIHJpZ2h0LWp1c3RpZmllZCBpZgogICAgICAgICBpdCBkb2VzIG5vdCBmaWxsIHRoZSBlbnRpcmUgZmllbGQgd2lkdGguCiAgICAgICAgIDwvREw+CiAgICAgICAgIDwvT0w+CiAgICAgICAgIDxicj48YnI+IFRoZSBuZXh0IHBhcnQgb2YgYSBzcGVjaWZpY2F0aW9uIGlzIGFuIG9wdGlvbmFsIGZpZWxkIHdpZHRoLiAgSWYgbm8KICAgICAgICAgd2lkdGggaXMgc3BlY2lmaWVkIDAgaXMgdGFrZW4uICBEdXJpbmcgb3V0cHV0LCB0aGUgZnVuY3Rpb24gZmlyc3QKICAgICAgICAgZGV0ZXJtaW5lcyBob3cgbXVjaCBzcGFjZSBpcyByZXF1aXJlZC4gIElmIGl0IHJlcXVpcmVzIGF0IGxlYXN0IGFzIG1hbnkKICAgICAgICAgY2hhcmFjdGVycyBhcyBnaXZlbiBieSB0aGUgZmllbGQgd2lkdGgsIGl0IGlzIG91dHB1dCB1c2luZyBhcyBtdWNoIHNwYWNlCiAgICAgICAgIGFzIG5lY2Vzc2FyeS4gIE90aGVyd2lzZSwgaXQgaXMgZXh0ZW5kZWQgdG8gdXNlIHRoZSBmdWxsIHdpZHRoIGJ5CiAgICAgICAgIGZpbGxpbmcgd2l0aCB0aGUgc3BhY2UgY2hhcmFjdGVyLiAgVGhlIHByZXNlbmNlIG9yIGFic2VuY2Ugb2YgdGhlCiAgICAgICAgIDxzYW1wPi08L3NhbXA+IGZsYWcgZGV0ZXJtaW5lcyB0aGUgc2lkZSBhdCB3aGljaCBzdWNoIHBhZGRpbmcgb2NjdXJzLiAgSWYKICAgICAgICAgcHJlc2VudCwgdGhlIHNwYWNlcyBhcmUgYWRkZWQgYXQgdGhlIHJpZ2h0IG1ha2luZyB0aGUgb3V0cHV0CiAgICAgICAgIGxlZnQtanVzdGlmaWVkLCBhbmQgdmljZSB2ZXJzYS4KICAgICAgICAgPGJyPjxicj4gU28gZmFyIHRoZSBmb3JtYXQgbG9va3MgZmFtaWxpYXIsIGJlaW5nIHNpbWlsYXIgdG8gdGhlIDxDT0RFPnByaW50ZjwvQ09ERT4gYW5kCiAgICAgICAgIDxDT0RFPnN0cmZ0aW1lPC9DT0RFPiBmb3JtYXRzLiAgSG93ZXZlciwgdGhlIG5leHQgdHdvIG9wdGlvbmFsIGZpZWxkcwogICAgICAgICBpbnRyb2R1Y2Ugc29tZXRoaW5nIG5ldy4gIFRoZSBmaXJzdCBvbmUgaXMgYSA8c2FtcD4jPC9zYW1wPiBjaGFyYWN0ZXIgZm9sbG93ZWQKICAgICAgICAgYnkgYSBkZWNpbWFsIGRpZ2l0IHN0cmluZy4gIFRoZSB2YWx1ZSBvZiB0aGUgZGlnaXQgc3RyaW5nIHNwZWNpZmllcyB0aGUKICAgICAgICAgbnVtYmVyIG9mIDxFTT5kaWdpdDwvRU0+IHBvc2l0aW9ucyB0byB0aGUgbGVmdCBvZiB0aGUgZGVjaW1hbCBwb2ludCAob3IKICAgICAgICAgZXF1aXZhbGVudCkuICBUaGlzIGRvZXMgPEVNPm5vdDwvRU0+IGluY2x1ZGUgdGhlIGdyb3VwaW5nIGNoYXJhY3RlciB3aGVuCiAgICAgICAgIHRoZSA8c2FtcD5ePC9zYW1wPiBmbGFnIGlzIG5vdCBnaXZlbi4gIElmIHRoZSBzcGFjZSBuZWVkZWQgdG8gcHJpbnQgdGhlIG51bWJlcgogICAgICAgICBkb2VzIG5vdCBmaWxsIHRoZSB3aG9sZSB3aWR0aCwgdGhlIGZpZWxkIGlzIHBhZGRlZCBhdCB0aGUgbGVmdCBzaWRlIHdpdGgKICAgICAgICAgdGhlIGZpbGwgY2hhcmFjdGVyLCB3aGljaCBjYW4gYmUgc2VsZWN0ZWQgdXNpbmcgdGhlIDxzYW1wPj08L3NhbXA+IGZsYWcgYW5kIGJ5CiAgICAgICAgIGRlZmF1bHQgaXMgYSBzcGFjZS4gIEZvciBleGFtcGxlLCBpZiB0aGUgZmllbGQgd2lkdGggaXMgc2VsZWN0ZWQgYXMgNgogICAgICAgICBhbmQgdGhlIG51bWJlciBpcyAxMjMsIHRoZSBmaWxsIGNoYXJhY3RlciBpcyA8c2FtcD4qPC9zYW1wPiB0aGUgcmVzdWx0CiAgICAgICAgIHdpbGwgYmUgPHNhbXA+KioqMTIzPC9zYW1wPi4KICAgICAgICAgPGJyPjxicj4gVGhlIHNlY29uZCBvcHRpb25hbCBmaWVsZCBzdGFydHMgd2l0aCBhIDxzYW1wPi48L3NhbXA+IChwZXJpb2QpIGFuZCBjb25zaXN0cwogICAgICAgICBvZiBhbm90aGVyIGRlY2ltYWwgZGlnaXQgc3RyaW5nLiAgSXRzIHZhbHVlIGRlc2NyaWJlcyB0aGUgbnVtYmVyIG9mCiAgICAgICAgIGNoYXJhY3RlcnMgcHJpbnRlZCBhZnRlciB0aGUgZGVjaW1hbCBwb2ludC4gIFRoZSBkZWZhdWx0IGlzIHNlbGVjdGVkCiAgICAgICAgIGZyb20gdGhlIGN1cnJlbnQgbG9jYWxlICg8Q09ERT5mcmFjX2RpZ2l0czwvQ09ERT4sIDxDT0RFPmludF9mcmFjX2RpZ2l0czwvQ09ERT4sIHNlZQogICAgICAgICApLiAgSWYgdGhlIGV4YWN0IHJlcHJlc2VudGF0aW9uIG5lZWRzIG1vcmUgZGlnaXRzCiAgICAgICAgIHRoYW4gZ2l2ZW4gYnkgdGhlIGZpZWxkIHdpZHRoLCB0aGUgZGlzcGxheWVkIHZhbHVlIGlzIHJvdW5kZWQuICBJZiB0aGUKICAgICAgICAgbnVtYmVyIG9mIGZyYWN0aW9uYWwgZGlnaXRzIGlzIHNlbGVjdGVkIHRvIGJlIHplcm8sIG5vIGRlY2ltYWwgcG9pbnQgaXMKICAgICAgICAgcHJpbnRlZC4KICAgICAgICAgPGJyPjxicj4gQXMgYSBHTlUgZXh0ZW5zaW9uLCB0aGUgPENPREU+c3RyZm1vbjwvQ09ERT4gaW1wbGVtZW50YXRpb24gaW4gdGhlIEdOVSBsaWJjCiAgICAgICAgIGFsbG93cyBhbiBvcHRpb25hbCA8c2FtcD5MPC9zYW1wPiBuZXh0IGFzIGEgZm9ybWF0IG1vZGlmaWVyLiAgSWYgdGhpcyBtb2RpZmllcgogICAgICAgICBpcyBnaXZlbiwgdGhlIGFyZ3VtZW50IGlzIGV4cGVjdGVkIHRvIGJlIGEgPENPREU+bG9uZyBkb3VibGU8L0NPREU+IGluc3RlYWQgb2YKICAgICAgICAgYSA8Q09ERT5kb3VibGU8L0NPREU+IHZhbHVlLgogICAgICAgICA8YnI+PGJyPiBGaW5hbGx5LCB0aGUgbGFzdCBjb21wb25lbnQgaXMgYSBmb3JtYXQgc3BlY2lmaWVyLiAgVGhlcmUgYXJlIHRocmVlCiAgICAgICAgIHNwZWNpZmllcnMgZGVmaW5lZDoKICAgICAgICAgPGJyPjxicj4gPERMPgoKICAgICAgICAgPExJPiA8c2FtcD5pPC9zYW1wPgogICAgICAgICBVc2UgdGhlIGxvY2FsZSdzIHJ1bGVzIGZvciBmb3JtYXR0aW5nIGFuIGludGVybmF0aW9uYWwgY3VycmVuY3kgdmFsdWUuCiAgICAgICAgIDxMST4gPHNhbXA+bjwvc2FtcD4KICAgICAgICAgVXNlIHRoZSBsb2NhbGUncyBydWxlcyBmb3IgZm9ybWF0dGluZyBhIG5hdGlvbmFsIGN1cnJlbmN5IHZhbHVlLgogICAgICAgICA8TEk+IDxzYW1wPiU8L3NhbXA+CiAgICAgICAgIFBsYWNlIGEgPHNhbXA+JTwvc2FtcD4gaW4gdGhlIG91dHB1dC4gIFRoZXJlIG11c3QgYmUgbm8gZmxhZywgd2lkdGgKICAgICAgICAgc3BlY2lmaWVyIG9yIG1vZGlmaWVyIGdpdmVuLCBvbmx5IDxzYW1wPiUlPC9zYW1wPiBpcyBhbGxvd2VkLgogICAgICAgICA8L0RMPgogICAgICAgICA8YnI+PGJyPiBBcyBmb3IgPENPREU+cHJpbnRmPC9DT0RFPiwgdGhlIGZ1bmN0aW9uIHJlYWRzIHRoZSBmb3JtYXQgc3RyaW5nCiAgICAgICAgIGZyb20gbGVmdCB0byByaWdodCBhbmQgdXNlcyB0aGUgdmFsdWVzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24gZm9sbG93aW5nCiAgICAgICAgIHRoZSBmb3JtYXQgc3RyaW5nLiAgVGhlIHZhbHVlcyBhcmUgZXhwZWN0ZWQgdG8gYmUgZWl0aGVyIG9mIHR5cGUKICAgICAgICAgPENPREU+ZG91YmxlPC9DT0RFPiBvciA8Q09ERT5sb25nIGRvdWJsZTwvQ09ERT4sIGRlcGVuZGluZyBvbiB0aGUgcHJlc2VuY2Ug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bmNlcy4KICAgICAgICAgQ29udmVyc2lvbiBzcGVjaWZpZXJzIGFyZSBpbnRyb2R1Y2VkIGJ5IGEgPHNhbXA+JTwvc2FtcD4gY2hhcmFjdGVyLCBmb2xsb3dlZAogICAgICAgICBieSBhbiBvcHRpb25hbCBmbGFnIHdoaWNoIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZy4gIFRoZXNlIGZsYWdzCiAgICAgICAgIGFyZSBhbGwgR05VIGV4dGVuc2lvbnMuIFRoZSBmaXJzdCB0aHJlZSBhZmZlY3Qgb25seSB0aGUgb3V0cHV0IG9mCiAgICAgICAgIG51bWJlcnM6CiAgICAgICAgIDxicj48YnI+IDxETD4KCiAgICAgICAgIDxEVD48Q09ERT5fPC9DT0RFPgo8REQ+CiAgICAgICAgIFRoZSBudW1iZXIgaXMgcGFkZGVkIHdpdGggc3BhY2VzLgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+LTwvQ09ERT4KPEREPgogICAgICAgICBUaGUgbnVtYmVyIGlzIG5vdCBwYWRkZWQgYXQgYWxsLgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+MDwvQ09ERT4KPEREPgogICAgICAgICBUaGUgbnVtYmVyIGlzIHBhZGRlZCB3aXRoIHplcm9zIGV2ZW4gaWYgdGhlIGZvcm1hdCBzcGVjaWZpZXMgcGFkZGluZwogICAgICAgICB3aXRoIHNwYWNlcy4KICAgICAgICAgPGJyPjxicj4gPExJPiBeCiAgICAgICAgIFRoZSBvdXRwdXQgdXNlcyB1cHBlcmNhc2UgY2hhcmFjdGVycywgYnV0IG9ubHkgaWYgdGhpcyBpcyBwb3NzaWJsZQogICAgICAgICAuCgogICAgICAgICA8YnI+PGJyPiBUaGUgZGVmYXVsdCBhY3Rpb24gaXMgdG8gcGFkIHRoZSBudW1iZXIgd2l0aCB6ZXJvcyB0byBrZWVwIGl0IGEgY29uc3RhbnQKICAgICAgICAgd2lkdGguICBOdW1iZXJzIHRoYXQgZG8gbm90IGhhdmUgYSByYW5nZSBpbmRpY2F0ZWQgYmVsb3cgYXJlIG5ldmVyCiAgICAgICAgIHBhZGRlZCwgc2luY2UgdGhlcmUgaXMgbm8gbmF0dXJhbCB3aWR0aCBmb3IgdGhlbS4KICAgICAgICAgPGJyPjxicj4gRm9sbG93aW5nIHRoZSBmbGFnIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIHdpZHRoIGlzIHBvc3NpYmxlLgogICAgICAgICBUaGlzIGlzIHNwZWNpZmllZCBpbiBkZWNpbWFsIG5vdGF0aW9uLiAgSWYgdGhlIG5hdHVyYWwgc2l6ZSBvZiB0aGUKICAgICAgICAgb3V0cHV0IGlzIG9mIHRoZSBmaWVsZCBoYXMgbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMsCiAgICAgICAgIHRoZSByZXN1bHQgaXMgd3JpdHRlbiByaWdodCBhZGp1c3RlZCBhbmQgc3BhY2UgcGFkZGVkIHRvIHRoZSBnaXZlbgogICAgICAgICBzaXplLgogICAgICAgICA8YnI+PGJyPiBBbiBvcHRpb25hbCBtb2RpZmllciBjYW4gZm9sbG93IHRoZSBvcHRpb25hbCBmbGFnIGFuZCB3aWR0aAogICAgICAgICBzcGVjaWZpY2F0aW9uLiAgVGhlIG1vZGlmaWVycywgd2hpY2ggd2VyZSBmaXJzdCBzdGFuZGFyZGl6ZWQgYnkKICAgICAgICAgUE9TSVguMi0xOTkyIGFuZCBieSBJU08gQzk5LCBhcmU6CiAgICAgICAgIDxicj48YnI+IDxETD4KCiAgICAgICAgIDxMST4gRQogICAgICAgICBVc2UgdGhlIGxvY2FsZSdzIGFsdGVybmF0ZSByZXByZXNlbnRhdGlvbiBmb3IgZGF0ZSBhbmQgdGltZS4gIFRoaXMKICAgICAgICAgbW9kaWZpZXIgYXBwbGllcyB0byB0aGUgPENPREU+JWM8L0NPREU+LCA8Q09ERT4lQzwvQ09ERT4sIDxDT0RFPiV4PC9DT0RFPiwgPENPREU+JVg8L0NPREU+LAogICAgICAgICA8Q09ERT4leTwvQ09ERT4gYW5kIDxDT0RFPiVZPC9DT0RFPiBmb3JtYXQgc3BlY2lmaWVycy4gIEluIGEgSmFwYW5lc2UgbG9jYWxlLCBmb3IKICAgICAgICAgZXhhbXBsZSwgPENPREU+JUV4PC9DT0RFPiBtaWdodCB5aWVsZCBhIGRhdGUgZm9ybWF0IGJhc2VkIG9uIHRoZSBKYXBhbmVzZQogICAgICAgICBFbXBlcm9ycycgcmVpZ25zLgogICAgICAgICA8YnI+PGJyPiA8TEk+IE8KICAgICAgICAgVXNlIHRoZSBsb2NhbGUncyBhbHRlcm5hdGUgbnVtZXJpYyBzeW1ib2xzIGZvciBudW1iZXJzLiAgVGhpcyBtb2RpZmllcgogICAgICAgICBhcHBsaWVzIG9ubHkgdG8gbnVtZXJpYyBmb3JtYXQgc3BlY2lmaWVycy4KCiAgICAgICAgIDxicj48YnI+IElmIHRoZSBmb3JtYXQgc3VwcG9ydHMgdGhlIG1vZGlmaWVyIGJ1dCBubyBhbHRlcm5hdGUgcmVwcmVzZW50YXRpb24KICAgICAgICAgaXMgYXZhaWxhYmxlLCBpdCBpcyBpZ25vcmVkLgogICAgICAgICA8YnI+PGJyPiBUaGUgY29udmVyc2lvbiBzcGVjaWZpZXIgZW5kcyB3aXRoIGEgZm9ybWF0IHNwZWNpZmllciB0YWtlbiBmcm9tIHRoZQogICAgICAgICBmb2xsb3dpbmcgbGlzdC4gIFRoZSB3aG9sZSA8c2FtcD4lPC9zYW1wPiBzZXF1ZW5jZSBpcyByZXBsYWNlZCBpbiB0aGUgb3V0cHV0CiAgICAgICAgIHN0cmluZyBhcyBmb2xsb3dzOgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8TEk+ICVhCiAgICAgICAgIFRoZSBhYmJyZXZpYXRlZCB3ZWVrZGF5IG5hbWUgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGxvY2FsZS4KICAgICAgICAgPGJyPjxicj4gPExJPiAlQQogICAgICAgICBUaGUgZnVsbCB3ZWVrZGF5IG5hbWUgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGxvY2FsZS4KICAgICAgICAgPGJyPjxicj4gPExJPiAlYgogICAgICAgICBUaGUgYWJicmV2aWF0ZWQgbW9udGggbmFtZSBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgbG9jYWxlLgogICAgICAgICA8YnI+PGJyPiA8TEk+ICVCCiAgICAgICAgIFRoZSBmdWxsIG1vbnRoIG5hbWUgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGxvY2FsZS4KICAgICAgICAgPGJyPjxicj4gVXNpbmcgPENPREU+JUI8L0NPREU+IHRvZ2V0aGVyIHdpdGggPENPREU+JWQ8L0NPREU+IHByb2R1Y2VzIGdyYW1tYXRpY2FsbHkKICAgICAgICAgaW5jb3JyZWN0IHJlc3VsdHMgZm9yIHNvbWUgbG9jYWxlcy4KICAgICAgICAgPGJyPjxicj4gPExJPiAlYwogICAgICAgICBUaGUgcHJlZmVycmVkIGNhbGVuZGFyIHRpbWUgcmVwcmVzZW50YXRpb24gZm9yIHRoZSBjdXJyZW50IGxvY2FsZS4KICAgICAgICAgPGJyPjxicj4gPExJPiAlQwogICAgICAgICBUaGUgY2VudHVyeSBvZiB0aGUgeWVhci4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgZ3JlYXRlc3QgaW50ZWdlciBub3QKICAgICAgICAgZ3JlYXRlciB0aGFuIHRoZSB5ZWFyIGRpdmlkZWQgYnkgMTAwLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZvcm1hdCB3YXMgZmlyc3Qgc3RhbmRhcmRpemVkIGJ5IFBPU0lYLjItMTk5MiBhbmQgYnkgSVNPIEM5OS4KICAgICAgICAgPGJyPjxicj4gPExJPiAlZAogICAgICAgICBUaGUgZGF5IG9mIHRoZSBtb250aCBhcyBhIGRlY2ltYWwgbnVtYmVyIChyYW5nZSA8Q09ERT4wMTwvQ09ERT4gdGhyb3VnaCA8Q09ERT4zMTwvQ09ERT4pLgogICAgICAgICA8YnI+PGJyPiA8TEk+ICVECiAgICAgICAgIFRoZSBkYXRlIHVzaW5nIHRoZSBmb3JtYXQgPENPREU+JW0vJWQvJXk8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZvcm1hdCB3YXMgZmlyc3Qgc3RhbmRhcmRpemVkIGJ5IFBPU0lYLjItMTk5MiBhbmQgYnkgSVNPIEM5OS4KICAgICAgICAgPGJyPjxicj4gPExJPiAlZQogICAgICAgICBUaGUgZGF5IG9mIHRoZSBtb250aCBsaWtlIHdpdGggPENPREU+JWQ8L0NPREU+LCBidXQgcGFkZGVkIHdpdGggYmxhbmsgKHJhbmdlCiAgICAgICAgIDxDT0RFPiAxPC9DT0RFPiB0aHJvdWdoIDxDT0RFPjMxPC9DT0RFPikuCiAgICAgICAgIDxicj48YnI+IFRoaXMgZm9ybWF0IHdhcyBmaXJzdCBzdGFuZGFyZGl6ZWQgYnkgUE9TSVguMi0xOTkyIGFuZCBieSBJU08gQzk5LgogICAgICAgICA8YnI+PGJyPiA8TEk+ICVGCiAgICAgICAgIFRoZSBkYXRlIHVzaW5nIHRoZSBmb3JtYXQgPENPREU+JVktJW0tJWQ8L0NPREU+LiAgVGhpcyBpcyB0aGUgZm9ybSBzcGVjaWZpZWQKICAgICAgICAgaW4gdGhlIElTTyA4NjAxIHN0YW5kYXJkIGFuZCBpcyB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIGFsbCB1c2VzLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZvcm1hdCB3YXMgZmlyc3Qgc3RhbmRhcmRpemVkIGJ5IElTTyBDOTkgYW5kIGJ5IFBPU0lYLjEtMjAwMS4KICAgICAgICAgPGJyPjxicj4gPExJPiAlZwogICAgICAgICBUaGUgeWVhciBjb3JyZXNwb25kaW5nIHRvIHRoZSBJU08gd2VlayBudW1iZXIsIGJ1dCB3aXRob3V0IHRoZSBjZW50dXJ5CiAgICAgICAgIChyYW5nZSA8Q09ERT4wMDwvQ09ERT4gdGhyb3VnaCA8Q09ERT45OTwvQ09ERT4pLiAgVGhpcyBoYXMgdGhlIHNhbWUgZm9ybWF0IGFuZCB2YWx1ZQogICAgICAgICBhcyA8Q09ERT4leTwvQ09ERT4sIGV4Y2VwdCB0aGF0IGlmIHRoZSBJU08gd2VlayBudW1iZXIgKHNlZSA8Q09ERT4lVjwvQ09ERT4pIGJlbG9uZ3MKICAgICAgICAgdG8gdGhlIHByZXZpb3VzIG9yIG5leHQgeWVhciwgdGhhdCB5ZWFyIGlzIHVzZWQgaW5zdGVhZC4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmb3JtYXQgd2FzIGZpcnN0IHN0YW5kYXJkaXplZCBieSBJU08gQzk5IGFuZCBieSBQT1NJWC4xLTIwMDEuCiAgICAgICAgIDxicj48YnI+IDxMST4gJUcKICAgICAgICAgVGhlIHllYXIgY29ycmVzcG9uZGluZyB0byB0aGUgSVNPIHdlZWsgbnVtYmVyLiAgVGhpcyBoYXMgdGhlIHNhbWUgZm9ybWF0CiAgICAgICAgIGFuZCB2YWx1ZSBhcyA8Q09ERT4lWTwvQ09ERT4sIGV4Y2VwdCB0aGF0IGlmIHRoZSBJU08gd2VlayBudW1iZXIgKHNlZQogICAgICAgICA8Q09ERT4lVjwvQ09ERT4pIGJlbG9uZ3MgdG8gdGhlIHByZXZpb3VzIG9yIG5leHQgeWVhciwgdGhhdCB5ZWFyIGlzIHVzZWQKICAgICAgICAgaW5zdGVhZC4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmb3JtYXQgd2FzIGZpcnN0IHN0YW5kYXJkaXplZCBieSBJU08gQzk5IGFuZCBieSBQT1NJWC4xLTIwMDEKICAgICAgICAgYnV0IHdhcyBwcmV2aW91c2x5IGF2YWlsYWJsZSBhcyBhIEdOVSBleHRlbnNpb24uCiAgICAgICAgIDxicj48YnI+IDxMST4gJWgKICAgICAgICAgVGhlIGFiYnJldmlhdGVkIG1vbnRoIG5hbWUgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGxvY2FsZS4gIFRoZSBhY3Rpb24KICAgICAgICAgaXMgdGhlIHNhbWUgYXMgZm9yIDxDT0RFPiViPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmb3JtYXQgd2FzIGZpcnN0IHN0YW5kYXJkaXplZCBieSBQT1NJWC4yLTE5OTIgYW5kIGJ5IElTTyBDOTkuCiAgICAgICAgIDxicj48YnI+IDxMST4gJUgKICAgICAgICAgVGhlIGhvdXIgYXMgYSBkZWNpbWFsIG51bWJlciwgdXNpbmcgYSAyNC1ob3VyIGNsb2NrIChyYW5nZSA8Q09ERT4wMDwvQ09ERT4gdGhyb3VnaAogICAgICAgICA8Q09ERT4yMzwvQ09ERT4pLgogICAgICAgICA8YnI+PGJyPiA8TEk+ICVJCiAgICAgICAgIFRoZSBob3VyIGFzIGEgZGVjaW1hbCBudW1iZXIsIHVzaW5nIGEgMTItaG91ciBjbG9jayAocmFuZ2UgPENPREU+MDE8L0NPREU+IHRocm91Z2gKICAgICAgICAgPENPREU+MTI8L0NPREU+KS4KICAgICAgICAgPGJyPjxicj4gPExJPiAlagogICAgICAgICBUaGUgZGF5IG9mIHRoZSB5ZWFyIGFzIGEgZGVjaW1hbCBudW1iZXIgKHJhbmdlIDxDT0RFPjAwMTwvQ09ERT4gdGhyb3VnaCA8Q09ERT4zNjY8L0NPREU+KS4KICAgICAgICAgPGJyPjxicj4gPExJPiAlawogICAgICAgICBUaGUgaG91ciBhcyBhIGRlY2ltYWwgbnVtYmVyLCB1c2luZyBhIDI0LWhvdXIgY2xvY2sgbGlrZSA8Q09ERT4lSDwvQ09ERT4sIGJ1dAogICAgICAgICBwYWRkZWQgd2l0aCBibGFuayAocmFuZ2UgPENPREU+IDA8L0NPREU+IHRocm91Z2ggPENPREU+MjM8L0NPREU+KS4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmb3JtYXQgaXMgYSBHTlUgZXh0ZW5zaW9uLgogICAgICAgICA8YnI+PGJyPiA8TEk+ICVsCiAgICAgICAgIFRoZSBob3VyIGFzIGEgZGVjaW1hbCBudW1iZXIsIHVzaW5nIGEgMTItaG91ciBjbG9jayBsaWtlIDxDT0RFPiVJPC9DT0RFPiwgYnV0CiAgICAgICAgIHBhZGRlZCB3aXRoIGJsYW5rIChyYW5nZSA8Q09ERT4gMTwvQ09ERT4gdGhyb3VnaCA8Q09ERT4xMjwvQ09ERT4pLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZvcm1hdCBpcyBhIEdOVSBleHRlbnNpb24uCiAgICAgICAgIDxicj48YnI+IDxMST4gJW0KICAgICAgICAgVGhlIG1vbnRoIGFzIGEgZGVjaW1hbCBudW1iZXIgKHJhbmdlIDxDT0RFPjAxPC9DT0RFPiB0aHJvdWdoIDxDT0RFPjEyPC9DT0RFPikuCiAgICAgICAgIDxicj48YnI+IDxMST4gJU0KICAgICAgICAgVGhlIG1pbnV0ZSBhcyBhIGRlY2ltYWwgbnVtYmVyIChyYW5nZSA8Q09ERT4wMDwvQ09ERT4gdGhyb3VnaCA8Q09ERT41OTwvQ09ERT4pLgogICAgICAgICA8YnI+PGJyPiA8TEk+ICVuCiAgICAgICAgIEEgc2luZ2xlIDxzYW1wPlxuPC9zYW1wPiAobmV3bGluZSkgY2hhcmFjdGVyLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZvcm1hdCB3YXMgZmlyc3Qgc3RhbmRhcmRpemVkIGJ5IFBPU0lYLjItMTk5MiBhbmQgYnkgSVNPIEM5OS4KICAgICAgICAgPGJyPjxicj4gPExJPiAlcAogICAgICAgICBFaXRoZXIgPHNhbXA+QU08L3NhbXA+IG9yIDxzYW1wPlBNPC9zYW1wPiwgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiB0aW1lIHZhbHVlOyBvciB0aGUKICAgICAgICAgY29ycmVzcG9uZGluZyBzdHJpbmdzIGZvciB0aGUgY3VycmVudCBsb2NhbGUuICBOb29uIGlzIHRyZWF0ZWQgYXMKICAgICAgICAgPHNhbXA+UE08L3NhbXA+IGFuZCBtaWRuaWdodCBhcyA8c2FtcD5BTTwvc2FtcD4uICBJbiBtb3N0IGxvY2FsZXMKICAgICAgICAgPHNhbXA+QU08L3NhbXA+LzxzYW1wPlBNPC9zYW1wPiBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZCwgaW4gc3VjaCBjYXNlcyA8Q09ERT4iJXAiPC9DT0RFPgogICAgICAgICB5aWVsZHMgYW4gZW1wdHkgc3RyaW5nLgogICAgICAgICA8YnI+PGJyPgogICAgICAgICA8TEk+ICVQCiAgICAgICAgIEVpdGhlciA8c2FtcD5hbTwvc2FtcD4gb3IgPHNhbXA+cG08L3NhbXA+LCBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHRpbWUgdmFsdWU7IG9yIHRoZQogICAgICAgICBjb3JyZXNwb25kaW5nIHN0cmluZ3MgZm9yIHRoZSBjdXJyZW50IGxvY2FsZSwgcHJpbnRlZCBpbiBsb3dlcmNhc2UKICAgICAgICAgY2hhcmFjdGVycy4gIE5vb24gaXMgdHJlYXRlZCBhcyA8c2FtcD5wbTwvc2FtcD4gYW5kIG1pZG5pZ2h0IGFzIDxzYW1wPmFtPC9zYW1wPi4gIEluCiAgICAgICAgIG1vc3QgbG9jYWxlcyA8c2FtcD5BTTwvc2FtcD4vPHNhbXA+UE08L3NhbXA+IGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLCBpbiBzdWNoIGNhc2VzCiAgICAgICAgIDxDT0RFPiIlUCI8L0NPREU+IHlpZWxkcyBhbiBlbXB0eSBzdHJpbmcuCiAgICAgICAgIDxicj48YnI+IFRoaXMgZm9ybWF0IGlzIGEgR05VIGV4dGVuc2lvbi4KICAgICAgICAgPGJyPjxicj4gPExJPiAlcgogICAgICAgICBUaGUgY29tcGxldGUgY2FsZW5kYXIgdGltZSB1c2luZyB0aGUgQU0vUE0gZm9ybWF0IG9mIHRoZSBjdXJyZW50IGxvY2FsZS4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmb3JtYXQgd2FzIGZpcnN0IHN0YW5kYXJkaXplZCBieSBQT1NJWC4yLTE5OTIgYW5kIGJ5IElTTyBDOTkuCiAgICAgICAgIEluIHRoZSBQT1NJWCBsb2NhbGUsIHRoaXMgZm9ybWF0IGlzIGVxdWl2YWxlbnQgdG8gPENPREU+JUk6JU06JVMgJXA8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiA8TEk+ICVSCiAgICAgICAgIFRoZSBob3VyIGFuZCBtaW51dGUgaW4gZGVjaW1hbCBudW1iZXJzIHVzaW5nIHRoZSBmb3JtYXQgPENPREU+JUg6JU08L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZvcm1hdCB3YXMgZmlyc3Qgc3RhbmRhcmRpemVkIGJ5IElTTyBDOTkgYW5kIGJ5IFBPU0lYLjEtMjAwMQogICAgICAgICBidXQgd2FzIHByZXZpb3VzbHkgYXZhaWxhYmxlIGFzIGEgR05VIGV4dGVuc2lvbi4KICAgICAgICAgPGJyPjxicj4gPExJPiAlcwogICAgICAgICBUaGUgbnVtYmVyIG9mIHNlY29uZHMgc2luY2UgdGhlIGVwb2NoLCBpLmUuLCBzaW5jZSAxOTcwLTAxLTAxIDAwOjAwOjAwIFVUQy4KICAgICAgICAgTGVhcCBzZWNvbmRzIGFyZSBub3QgY291bnRlZCB1bmxlc3MgbGVhcCBzZWNvbmQgc3VwcG9ydCBpcyBhdmFpbGFibGUuCiAgICAgICAgIDxicj48YnI+IFRoaXMgZm9ybWF0IGlzIGEgR05VIGV4dGVuc2lvbi4KICAgICAgICAgPGJyPjxicj4gPExJPiAlUwogICAgICAgICBUaGUgc2Vjb25kcyBhcyBhIGRlY2ltYWwgbnVtYmVyIChyYW5nZSA8Q09ERT4wMDwvQ09ERT4gdGhyb3VnaCA8Q09ERT42MDwvQ09ERT4pLgogICAgICAgICA8YnI+PGJyPiA8TEk+ICV0CiAgICAgICAgIEEgc2luZ2xlIDxzYW1wPlx0PC9zYW1wPiAodGFidWxhdG9yKSBjaGFyYWN0ZXIuCiAgICAgICAgIDxicj48YnI+IFRoaXMgZm9ybWF0IHdhcyBmaXJzdCBzdGFuZGFyZGl6ZWQgYnkgUE9TSVguMi0xOTkyIGFuZCBieSBJU08gQzk5LgogICAgICAgICA8YnI+PGJyPiA8TEk+ICVUCiAgICAgICAgIFRoZSB0aW1lIG9mIGRheSB1c2luZyBkZWNpbWFsIG51bWJlcnMgdXNpbmcgdGhlIGZvcm1hdCA8Q09ERT4lSDolTTolUzwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IFRoaXMgZm9ybWF0IHdhcyBmaXJzdCBzdGFuZGFyZGl6ZWQgYnkgUE9TSVguMi0xOTkyIGFuZCBieSBJU08gQzk5LgogICAgICAgICA8YnI+PGJyPiA8TEk+ICV1CiAgICAgICAgIFRoZSBkYXkgb2YgdGhlIHdlZWsgYXMgYSBkZWNpbWFsIG51bWJlciAocmFuZ2UgPENPREU+MTwvQ09ERT4gdGhyb3VnaAogICAgICAgICA8Q09ERT43PC9DT0RFPiksIE1vbmRheSBiZWluZyA8Q09ERT4xPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmb3JtYXQgd2FzIGZpcnN0IHN0YW5kYXJkaXplZCBieSBQT1NJWC4yLTE5OTIgYW5kIGJ5IElTTyBDOTkuCiAgICAgICAgIDxicj48YnI+IDxMST4gJVUKICAgICAgICAgVGhlIHdlZWsgbnVtYmVyIG9mIHRoZSBjdXJyZW50IHllYXIgYXMgYSBkZWNpbWFsIG51bWJlciAocmFuZ2UgPENPREU+MDA8L0NPREU+CiAgICAgICAgIHRocm91Z2ggPENPREU+NTM8L0NPREU+KSwgc3RhcnRpbmcgd2l0aCB0aGUgZmlyc3QgU3VuZGF5IGFzIHRoZSBmaXJzdCBkYXkgb2YKICAgICAgICAgdGhlIGZpcnN0IHdlZWsuICBEYXlzIHByZWNlZGluZyB0aGUgZmlyc3QgU3VuZGF5IGluIHRoZSB5ZWFyIGFyZQogICAgICAgICBjb25zaWRlcmVkIHRvIGJlIGluIHdlZWsgPENPREU+MDA8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiA8TEk+ICVWCiAgICAgICAgIFRoZSBJU08gODYwMToxOTg4IHdlZWsgbnVtYmVyIGFzIGEgZGVjaW1hbCBudW1iZXIgKHJhbmdlIDxDT0RFPjAxPC9DT0RFPgogICAgICAgICB0aHJvdWdoIDxDT0RFPjUzPC9DT0RFPikuICBJU08gd2Vla3Mgc3RhcnQgd2l0aCBNb25kYXkgYW5kIGVuZCB3aXRoIFN1bmRheS4KICAgICAgICAgV2VlayA8Q09ERT4wMTwvQ09ERT4gb2YgYSB5ZWFyIGlzIHRoZSBmaXJzdCB3ZWVrIHdoaWNoIGhhcyB0aGUgbWFqb3JpdHkgb2YgaXRzCiAgICAgICAgIGRheXMgaW4gdGhhdCB5ZWFyOyB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIHdlZWsgY29udGFpbmluZyB0aGUgeWVhcidzCiAgICAgICAgIGZpcnN0IFRodXJzZGF5LCBhbmQgaXQgaXMgYWxzbyBlcXVpdmFsZW50IHRvIHRoZSB3ZWVrIGNvbnRhaW5pbmcgSmFudWFyeQogICAgICAgICA0LiAgV2VlayA8Q09ERT4wMTwvQ09ERT4gb2YgYSB5ZWFyIGNhbiBjb250YWluIGRheXMgZnJvbSB0aGUgcHJldmlvdXMgeWVhci4KICAgICAgICAgVGhlIHdlZWsgYmVmb3JlIHdlZWsgPENPREU+MDE8L0NPREU+IG9mIGEgeWVhciBpcyB0aGUgbGFzdCB3ZWVrICg8Q09ERT41MjwvQ09ERT4gb3IKICAgICAgICAgPENPREU+NTM8L0NPREU+KSBvZiB0aGUgcHJldmlvdXMgeWVhciBldmVuIGlmIGl0IGNvbnRhaW5zIGRheXMgZnJvbSB0aGUgbmV3CiAgICAgICAgIHllYXIuCiAgICAgICAgIDxicj48YnI+IFRoaXMgZm9ybWF0IHdhcyBmaXJzdCBzdGFuZGFyZGl6ZWQgYnkgUE9TSVguMi0xOTkyIGFuZCBieSBJU08gQzk5LgogICAgICAgICA8YnI+PGJyPiA8TEk+ICV3CiAgICAgICAgIFRoZSBkYXkgb2YgdGhlIHdlZWsgYXMgYSBkZWNpbWFsIG51bWJlciAocmFuZ2UgPENPREU+MDwvQ09ERT4gdGhyb3VnaAogICAgICAgICA8Q09ERT42PC9DT0RFPiksIFN1bmRheSBiZWluZyA8Q09ERT4wPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gPExJPiAlVwogICAgICAgICBUaGUgd2VlayBudW1iZXIgb2YgdGhlIGN1cnJlbnQgeWVhciBhcyBhIGRlY2ltYWwgbnVtYmVyIChyYW5nZSA8Q09ERT4wMDwvQ09ERT4KICAgICAgICAgdGhyb3VnaCA8Q09ERT41MzwvQ09ERT4pLCBzdGFydGluZyB3aXRoIHRoZSBmaXJzdCBNb25kYXkgYXMgdGhlIGZpcnN0IGRheSBvZgogICAgICAgICB0aGUgZmlyc3Qgd2Vlay4gIEFsbCBkYXlzIHByZWNlZGluZyB0aGUgZmlyc3QgTW9uZGF5IGluIHRoZSB5ZWFyIGFyZQogICAgICAgICBjb25zaWRlcmVkIHRvIGJlIGluIHdlZWsgPENPREU+MDA8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiA8TEk+ICV4CiAgICAgICAgIFRoZSBwcmVmZXJyZWQgZGF0ZSByZXByZXNlbnRhdGlvbiBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlLgogICAgICAgICA8YnI+PGJyPiA8TEk+ICVYCiAgICAgICAgIFRoZSBwcmVmZXJyZWQgdGltZSBvZiBkYXkgcmVwcmVzZW50YXRpb24gZm9yIHRoZSBjdXJyZW50IGxvY2FsZS4KICAgICAgICAgPGJyPjxicj4gPExJPiAleQogICAgICAgICBUaGUgeWVhciB3aXRob3V0IGEgY2VudHVyeSBhcyBhIGRlY2ltYWwgbnVtYmVyIChyYW5nZSA8Q09ERT4wMDwvQ09ERT4gdGhyb3VnaAogICAgICAgICA8Q09ERT45OTwvQ09ERT4pLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSB5ZWFyIG1vZHVsbyAxMDAuCiAgICAgICAgIDxicj48YnI+IDxMST4gJVkKICAgICAgICAgVGhlIHllYXIgYXMgYSBkZWNpbWFsIG51bWJlciwgdXNpbmcgdGhlIEdyZWdvcmlhbiBjYWxlbmRhci4gIFllYXJzCiAgICAgICAgIGJlZm9yZSB0aGUgeWVhciA8Q09ERT4xPC9DT0RFPiBhcmUgbnVtYmVyZWQgPENPREU+MDwvQ09ERT4sIDxDT0RFPi0xPC9DT0RFPiwgYW5kIHNvIG9uLgogICAgICAgICA8YnI+PGJyPiA8TEk+ICV6CiAgICAgICAgIFJGQyA4MjIvSVNPIDg2MDE6MTk4OCBzdHlsZSBudW1lcmljIHRpbWUgem9uZSAoZS5nLiwKICAgICAgICAgPENPREU+LTA2MDA8L0NPREU+IG9yIDxDT0RFPiswMTAwPC9DT0RFPiksIG9yIG5vdGhpbmcgaWYgbm8gdGltZSB6b25lIGlzCiAgICAgICAgIGRldGVybWluYWJsZS4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmb3JtYXQgd2FzIGZpcnN0IHN0YW5kYXJkaXplZCBieSBJU08gQzk5IGFuZCBieSBQT1NJWC4xLTIwMDEKICAgICAgICAgYnV0IHdhcyBwcmV2aW91c2x5IGF2YWlsYWJsZSBhcyBhIEdOVSBleHRlbnNpb24uCiAgICAgICAgIDxicj48YnI+IEluIHRoZSBQT1NJWCBsb2NhbGUsIGEgZnVsbCBSRkMgODIyIHRpbWVzdGFtcCBpcyBnZW5lcmF0ZWQgYnkgdGhlIGZvcm1hdAogICAgICAgICA8c2FtcD4iJWEsICVkICViICVZICVIOiVNOiVTICV6Ijwvc2FtcD4gKG9yIHRoZSBlcXVpdmFsZW50CiAgICAgICAgIDxzYW1wPiIlYSwgJWQgJWIgJVkgJVQgJXoiPC9zYW1wPikuCiAgICAgICAgIDxicj48YnI+IDxMST4gJVoKICAgICAgICAgVGhlIHRpbWUgem9uZSBhYmJyZXZpYXRpb24gKGVtcHR5IGlmIHRoZSB0aW1lIHpvbmUgY2FuJ3QgYmUgZGV0ZXJtaW5lZCkuCiAgICAgICAgIDxicj48YnI+IDxMST4gJSUKICAgICAgICAgQSBsaXRlcmFsIDxzYW1wPiU8L3NhbXA+IGNoYXJhY3Rlci4KCiAgICAgICAgIDxicj48YnI+IFRoZSA8VkFSPnNpemU8L1ZBUj4gcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIG1heGltdW0gbnVtYmVyIG9mCiAgICAgICAgIGNoYXJhY3RlcnMgdG8gYmUgc3RvcmVkIGluIHRoZSBhcnJheSA8VkFSPnM8L1ZBUj4sIGluY2x1ZGluZyB0aGUgdGVybWluYXRpbmcKICAgICAgICAgbnVsbCBjaGFyYWN0ZXIuICBJZiB0aGUgZm9ybWF0dGVkIHRpbWUgcmVxdWlyZXMgbW9yZSB0aGFuIDxWQVI+c2l6ZTwvVkFSPgogICAgICAgICBjaGFyYWN0ZXJzLCA8Q09ERT5zdHJmdGltZTwvQ09ERT4gcmV0dXJucyB6ZXJvIGFuZCB0aGUgY29udGVudHMgb2YgdGhlIGFycmF5CiAgICAgICAgIDxWQVI+czwvVkFSPiBhcmUgdW5kZWZpbmVkLiAgT3RoZXJ3aXNlIHRoZSByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIHRoZQogICAgICAgICBudW1iZXIgb2YgY2hhcmFjdGVycyBwbGFjZWQgaW4gdGhlIGFycmF5IDxWQVI+czwvVkFSPiwgbm90IGluY2x1ZGluZyB0aGUKICAgICAgICAgdGVybWluYXRpbmcgbnVsbCBjaGFyYWN0ZXIuCiAgICAgICAgIDxicj48YnI+IDxFTT5XYXJuaW5nOjwvRU0+IFRoaXMgY29udmVudGlvbiBmb3IgdGhlIHJldHVybiB2YWx1ZSB3aGljaCBpcyBwcmVzY3JpYmVkCiAgICAgICAgIGluIElTTyBDIGNhbiBsZWFkIHRvIHByb2JsZW1zIGluIHNvbWUgc2l0dWF0aW9ucy4gIEZvciBjZXJ0YWluCiAgICAgICAgIGZvcm1hdCBzdHJpbmdzIGFuZCBjZXJ0YWluIGxvY2FsZXMgdGhlIG91dHB1dCByZWFsbHkgY2FuIGJlIHRoZSBlbXB0eQogICAgICAgICBzdHJpbmcgYW5kIHRoaXMgY2Fubm90IGJlIGRpc2NvdmVyZWQgYnkgdGVzdGluZyB0aGUgcmV0dXJuIHZhbHVlIG9ubHkuCiAgICAgICAgIEUuZy4sIGluIG1vc3QgbG9jYWxlcyB0aGUgQU0vUE0gdGltZSBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZCAobW9zdCBvZgogICAgICAgICB0aGUgd29ybGQgdXNlcyB0aGUgMjQgaG91ciB0aW1lIHJlcHJlc2VudGF0aW9uKS4gIEluIHN1Y2ggbG9jYWxlcwogICAgICAgICA8Q09ERT4iJXAiPC9DT0RFPiB3aWxsIHJldHVybiB0aGUgZW1wdHkgc3RyaW5nLCBpLmUuLCB0aGUgcmV0dXJuIHZhbHVlIGlzCiAgICAgICAgIHplcm8uICBUbyBkZXRlY3Qgc2l0dWF0aW9ucyBsaWtlIHRoaXMgc29tZXRoaW5nIHNpbWlsYXIgdG8gdGhlIGZvbGxvd2luZwogICAgICAgICBjb2RlIHNob3VsZCBiZSB1c2VkOgogICAgICAgICA8YnI+PGJyPiA8cHJlPjxicj4KICAgICAgICAgYnVmWzBdID0gJ1wxJzs8YnI+CiAgICAgICAgIGxlbiA9IHN0cmZ0aW1lIChidWYsIGJ1ZnNpemUsIGZvcm1hdCwgdHApOzxicj4KICAgICAgICAgaWYgKGxlbiA9PSAwICYmIGJ1ZlswXSAhPSAnXDAnKTxicj4KICAgICAgICAgICB7PGJyPgogICAgICAgICAgICAgLyogU29tZXRoaW5nIHdlbnQgd3JvbmcgaW4gdGhlIHN0cmZ0aW1lIGNhbGwuICAqLzxicj4KICAgICAgICAgICAgIDxzbWFsbD4uLi48L3NtYWxsPjxicj4KICAgICAgICAgICB9PGJyPgogICAgICAgICA8L3ByZT4KICAgICAgICAgPGJyPjxicj4gSWYgPFZBUj5zPC9WQVI+IGlzIGEgbnVsbCBwb2ludGVyLCA8Q09ERT5zdHJmdGltZTwvQ09ERT4gZG9lcyBub3QgYWN0dWFsbHkgd3JpdGUKICAgICAgICAgYW55dGhpbmcsIGJ1dCBpbnN0ZWFkIHJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGl0IHdvdWxkIGhhdmUgd3JpdHRlbi4KICAgICAgICAgPGJyPjxicj4gQWNjb3JkaW5nIHRvIFBPU0lYLjEgZXZlcnkgY2FsbCB0byA8Q09ERT5zdHJmdGltZTwvQ09ERT4gaW1wbGllcyBhIGNhbGwgdG8KICAgICAgICAgPENPREU+dHpzZXQ8L0NPREU+LiAgU28gdGhlIGNvbnRlbnRzIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSA8Q09ERT5UWjwvQ09ERT4KICAgICAgICAgaXMgZXhhbWluZWQgYmVmb3JlIGFueSBvdXRwdXQgaXMgcHJvZHVjZWQuCiAgICAgICAgIDxicj48YnI+IEZvciBhbiBleGFtcGxlIG9mIDxDT0RFPnN0cmZ0aW1lPC9DT0RFPiwgc2VlIFRpbWUgRnVuY3Rpb25zIEV4YW1wbGUuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQABnRpbWUuaHhxAH4bZ3QAR2NoYXIgKnMsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICp0ZW1wbGF0ZSwgY29uc3Qgc3RydWN0IHRtICpicm9rZW50aW1ldAAGc2l6ZV90dAAGc3RybGVuc3EAfgAKdAmlCiAgICAgICAgVGhlIDxDT0RFPnN0cmxlbjwvQ09ERT4gZnVuY3Rpb24gcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBudWxsLXRlcm1pbmF0ZWQKICAgICAgICAgc3RyaW5nIDxWQVI+czwvVkFSPiBpbiBieXRlcy4gIChJbiBvdGhlciB3b3JkcywgaXQgcmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoZQogICAgICAgICB0ZXJtaW5hdGluZyBudWxsIGNoYXJhY3RlciB3aXRoaW4gdGhlIGFycmF5LikKICAgICAgICAgPGJyPjxicj4gRm9yIGV4YW1wbGUsCiAgICAgICAgIDxwcmU+PGJyPgogICAgICAgICBzdHJsZW4gKCJoZWxsbywgd29ybGQiKTxicj4KICAgICAgICAgICAgICAxMjxicj4KICAgICAgICAgPC9wcmU+PGJyPgogICAgICAgICA8YnI+PGJyPiBXaGVuIGFwcGxpZWQgdG8gYSBjaGFyYWN0ZXIgYXJyYXksIHRoZSA8Q09ERT5zdHJsZW48L0NPREU+IGZ1bmN0aW9uIHJldHVybnM8YnI+CiAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBzdG9yZWQgdGhlcmUsIG5vdCBpdHMgYWxsb2NhdGVkIHNpemUuICBZb3UgY2FuPGJyPgogICAgICAgICBnZXQgdGhlIGFsbG9jYXRlZCBzaXplIG9mIHRoZSBjaGFyYWN0ZXIgYXJyYXkgdGhhdCBob2xkcyBhIHN0cmluZyB1c2luZzxicj4KICAgICAgICAgdGhlIDxDT0RFPnNpemVvZjwvQ09ERT4gb3BlcmF0b3I6PGJyPgogICAgICAgICA8YnI+PGJyPiA8cHJlPjxicj4KICAgICAgICAgY2hhciBzdHJpbmdbMzJdID0gImhlbGxvLCB3b3JsZCI7PGJyPgogICAgICAgICBzaXplb2YgKHN0cmluZyk8YnI+CiAgICAgICAgICAgICAgMzI8YnI+CiAgICAgICAgIHN0cmxlbiAoc3RyaW5nKTxicj4KICAgICAgICAgICAgICAxMjxicj4KICAgICAgICAgPC9wcmU+PGJyPgogICAgICAgICA8YnI+PGJyPiBCdXQgYmV3YXJlLCB0aGlzIHdpbGwgbm90IHdvcmsgdW5sZXNzIDxWQVI+c3RyaW5nPC9WQVI+IGlzIHRoZSBjaGFyYWN0ZXI8YnI+CiAgICAgICAgIGFycmF5IGl0c2VsZiwgbm90IGEgcG9pbnRlciB0byBpdC4gIEZvciBleGFtcGxlOjxicj4KICAgICAgICAgPGJyPjxicj4gPHByZT48YnI+CiAgICAgICAgIGNoYXIgc3RyaW5nWzMyXSA9ICJoZWxsbywgd29ybGQiOzxicj4KICAgICAgICAgY2hhciAqcHRyID0gc3RyaW5nOzxicj4KICAgICAgICAgc2l6ZW9mIChzdHJpbmcpPGJyPgogICAgICAgICAgICAgIDMyPGJyPgogICAgICAgICBzaXplb2YgKHB0cik8YnI+CiAgICAgICAgICAgICAgNCAgLyogKG9uIGEgbWFjaGluZSB3aXRoIDQgYnl0ZSBwb2ludGVycykgKi88YnI+CiAgICAgICAgIDwvcHJlPjxicj4KICAgICAgICAgPGJyPjxicj4gVGhpcyBpcyBhbiBlYXN5IG1pc3Rha2UgdG8gbWFrZSB3aGVuIHlvdSBhcmUgd29ya2luZyB3aXRoIGZ1bmN0aW9ucyB0aGF0PGJyPgogICAgICAgICB0YWtlIHN0cmluZyBhcmd1bWVudHM7IHRob3NlIGFyZ3VtZW50cyBhcmUgYWx3YXlzIHBvaW50ZXJzLCBub3QgYXJyYXlzLjxicj4KICAgICAgICAgPGJyPjxicj4gSXQgbXVzdCBhbHNvIGJlIG5vdGVkIHRoYXQgZm9yIG11bHRpYnl0ZSBlbmNvZGVkIHN0cmluZ3MgdGhlIHJldHVybjxicj4KICAgICAgICAgdmFsdWUgZG9lcyBub3QgaGF2ZSB0byBjb3JyZXNwb25kIHRvIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGU8YnI+CiAgICAgICAgIHN0cmluZy4gIFRvIGdldCB0aGlzIHZhbHVlIHRoZSBzdHJpbmcgY2FuIGJlIGNvbnZlcnRlZCB0byB3aWRlPGJyPgogICAgICAgICBjaGFyYWN0ZXJzIGFuZCA8Q09ERT53Y3NsZW48L0NPREU+IGNhbiBiZSB1c2VkIG9yIHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmc8YnI+CiAgICAgICAgIGNvZGUgY2FuIGJlIHVzZWQ6PGJyPgogICAgICAgICA8YnI+PGJyPiA8cHJlPjxicj4KICAgICAgICAgLyogVGhlIGlucHV0IGlzIGluIDxDT0RFPnN0cmluZzwvQ09ERT4uPGJyPgogICAgICAgICAgICBUaGUgbGVuZ3RoIGlzIGV4cGVjdGVkIGluIDxDT0RFPm48L0NPREU+LiAgKi88YnI+CiAgICAgICAgIHs8YnI+CiAgICAgICAgICAgbWJzdGF0ZV90IHQ7PGJyPgogICAgICAgICAgIGNoYXIgKnNjb3B5ID0gc3RyaW5nOzxicj4KICAgICAgICAgICAvKiBJbiBpbml0aWFsIHN0YXRlLiAgKi88YnI+CiAgICAgICAgICAgbWVtc2V0ICgmdCwgJ1wwJywgc2l6ZW9mICh0KSk7PGJyPgogICAgICAgICAgIC8qIERldGVybWluZSBudW1iZXIgb2YgY2hhcmFjdGVycy4gICovPGJyPgogICAgICAgICAgIG4gPSBtYnNydG93Y3MgKE5VTEwsICZzY29weSwgc3RybGVuIChzY29weSksICZ0KTs8YnI+CiAgICAgICAgIH08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Y3RlcnMgaW4gYWxsLiAgVGhpcyBiZWhhdmlvciBpcyByYXJlbHkgdXNlZnVsLCBidXQgaXQKICAgICAgICAgaXMgc3BlY2lmaWVkIGJ5IHRoZSBJU08gQyBzdGFuZGFyZC4KICAgICAgICAgPGJyPjxicj4gVGhlIGJlaGF2aW9yIG9mIDxDT0RFPnN0cm5jcHk8L0NPREU+IGlzIHVuZGVmaW5lZCBpZiB0aGUgc3RyaW5ncyBvdmVybGFwLgogICAgICAgICA8YnI+PGJyPiBVc2luZyA8Q09ERT5zdHJuY3B5PC9DT0RFPiBhcyBvcHBvc2VkIHRvIDxDT0RFPnN0cmNweTwvQ09ERT4gaXMgYSB3YXkgdG8gYXZvaWQgYnVncwogICAgICAgICByZWxhdGluZyB0byB3cml0aW5nIHBhc3QgdGhlIGVuZCBvZiB0aGUgYWxsb2NhdGVkIHNwYWNlIGZvciA8VkFSPnRvPC9WQVI+LgogICAgICAgICBIb3dldmVyLCBpdCBjYW4gYWxzbyBtYWtlIHlvdXIgcHJvZ3JhbSBtdWNoIHNsb3dlciBpbiBvbmUgY29tbW9uIGNhc2U6CiAgICAgICAgIGNvcHlpbmcgYSBzdHJpbmcgd2hpY2ggaXMgcHJvYmFibHkgc21hbGwgaW50byBhIHBvdGVudGlhbGx5IGxhcmdlIGJ1ZmZlci4KICAgICAgICAgSW4gdGhpcyBjYXNlLCA8VkFSPnNpemU8L1ZBUj4gbWF5IGJlIGxhcmdlLCBhbmQgd2hlbiBpdCBpcywgPENPREU+c3RybmNweTwvQ09ERT4gd2lsbAogICAgICAgICB3YXN0ZSBhIGNvbnNpZGVyYWJsZSBhbW91bnQgb2YgdGltZSBjb3B5aW5nIG51bGwgY2hhcmFjdGVycy4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc3RyaW5nLmh4cQB+G4p0ADljaGFyICpyZXN0cmljdCB0bywgY29uc3QgY2hhciAqcmVzdHJpY3QgZnJvbSwgc2l6ZV90IHNpemV0AAZjaGFyICp0AAdzdHJuZHVwc3EAfgAKdAJ5CiAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIDxDT0RFPnN0cmR1cDwvQ09ERT4gYnV0IGFsd2F5cyBjb3BpZXMgYXQgbW9zdAogICAgICAgICA8VkFSPnNpemU8L1ZBUj4gY2hhcmFjdGVycyBpbnRvIHRoZSBuZXdseSBhbGxvY2F0ZWQgc3RyaW5nLgogICAgICAgICA8YnI+PGJyPiBJZiB0aGUgbGVuZ3RoIG9mIDxWQVI+czwvVkFSPiBpcyBtb3JlIHRoYW4gPFZBUj5zaXplPC9WQVI+LCB0aGVuIDxDT0RFPnN0cm5kdXA8L0NPREU+CiAgICAgICAgIGNvcGllcyBqdXN0IHRoZSBmaXJzdCA8VkFSPnNpemU8L1ZBUj4gY2hhcmFjdGVycyBhbmQgYWRkcyBhIGNsb3NpbmcgbnVsbAogICAgICAgICB0ZXJtaW5hdG9yLiAgT3RoZXJ3aXNlIGFsbCBjaGFyYWN0ZXJzIGFyZSBjb3BpZWQgYW5kIHRoZSBzdHJpbmcgaXMKICAgICAgICAgdGVybWluYXRlZC4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiBpcyBkaWZmZXJlbnQgdG8gPENPREU+c3RybmNweTwvQ09ERT4gaW4gdGhhdCBpdCBhbHdheXMKICAgICAgICAgdGVybWluYXRlcyB0aGUgZGVzdGluYXRpb24gc3RyaW5nLgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5zdHJuZHVwPC9DT0RFPiBpcyBhIEdOVSBleHRlbnNpb24uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHN0cmluZy5oeHEAfhuRdAAaY29uc3QgY2hhciAqcywgc2l6ZV90IHNpemV0AAZjaGFyICp0AAdzdHJubGVuc3EAfgAKdALyCiAgICAgICAgVGhlIDxDT0RFPnN0cm5sZW48L0NPREU+IGZ1bmN0aW9uIHJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIDxWQVI+czwvVkFSPiBpbgogICAgICAgICBieXRlcyBpZiB0aGlzIGxlbmd0aCBpcyBzbWFsbGVyIHRoYW4gPFZBUj5tYXhsZW48L1ZBUj4gYnl0ZXMuICBPdGhlcndpc2UgaXQKICAgICAgICAgcmV0dXJucyA8VkFSPm1heGxlbjwvVkFSPi4gIFRoZXJlZm9yZSB0aGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8KICAgICAgICAgPENPREU+KHN0cmxlbiAoPFZBUj5zPC9WQVI+KSA8IG4gPyBzdHJsZW4gKDxWQVI+czwvVkFSPikgOiA8VkFSPm1heGxlbjwvVkFSPik8L0NPREU+IGJ1dCBpdAogICAgICAgICBpcyBtb3JlIGVmZmljaWVudCBhbmQgd29ya3MgZXZlbiBpZiB0aGUgc3RyaW5nIDxWQVI+czwvVkFSPiBpcyBub3QKICAgICAgICAgbnVsbC10ZXJtaW5hdGVkLgogICAgICAgICA8YnI+PGJyPiA8cHJlPjxicj4KICAgICAgICAgY2hhciBzdHJpbmdbMzJdID0gImhlbGxvLCB3b3JsZCI7PGJyPgogICAgICAgICBzdHJubGVuIChzdHJpbmcsIDMyKTxicj4KICAgICAgICAgICAgICAxMjxicj4KICAgICAgICAgc3RybmxlbiAoc3RyaW5nLCA1KTxicj4KICAgICAgICAgICAgICA1PGJyPgogICAgICAgICA8L3ByZT4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiBpcyBhIEdOVSBleHRlbnNpb24gYW5kIGlzIGRlY2xhcmVkIGluIDxUVD5zdHJpbmcuaDwvVFQ+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAhzdHJpbmcuaHhxAH4bmHQAHGNvbnN0IGNoYXIgKnMsIHNpemVfdCBtYXhsZW50AAZzaXplX3R0AAdzdHJwYnJrc3EAfgAKdANmCiAgICAgICAgVGhlIDxDT0RFPnN0cnBicms8L0NPREU+IChgYHN0cmluZyBwb2ludGVyIGJyZWFrJycpIGZ1bmN0aW9uIGlzIHJlbGF0ZWQgdG8KICAgICAgICAgPENPREU+c3RyY3NwbjwvQ09ERT4sIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIKICAgICAgICAgaW4gPFZBUj5zdHJpbmc8L1ZBUj4gdGhhdCBpcyBhIG1lbWJlciBvZiB0aGUgc2V0IDxWQVI+c3RvcHNldDwvVkFSPiBpbnN0ZWFkIG9mIHRoZQogICAgICAgICBsZW5ndGggb2YgdGhlIGluaXRpYWwgc3Vic3RyaW5nLiAgSXQgcmV0dXJucyBhIG51bGwgcG9pbnRlciBpZiBubyBzdWNoCiAgICAgICAgIGNoYXJhY3RlciBmcm9tIDxWQVI+c3RvcHNldDwvVkFSPiBpcyBmb3VuZC4KICAgICAgICAgPGJyPjxicj4gRm9yIGV4YW1wbGUsCiAgICAgICAgIDxicj48YnI+IDxwcmU+PGJyPgogICAgICAgICBzdHJwYnJrICgiaGVsbG8sIHdvcmxkIiwgIiBcdFxuLC47IT8iKTxicj4KICAgICAgICAgICAgICAiLCB3b3JsZCI8YnI+CiAgICAgICAgIDwvcHJlPgogICAgICAgICA8YnI+PGJyPiBOb3RlIHRoYXQgYGBjaGFyYWN0ZXInJyBpcyBoZXJlIHVzZWQgaW4gdGhlIHNlbnNlIG9mIGJ5dGUuICBJbiBhIHN0cmluZwogICAgICAgICB1c2luZyBhIG11bHRpYnl0ZSBjaGFyYWN0ZXIgZW5jb2RpbmcgKGFic3RyYWN0KSBjaGFyYWN0ZXIgY29uc2lzdGluZyBvZgogICAgICAgICBtb3JlIHRoYW4gb25lIGJ5dGUgYXJlIG5vdCB0cmVhdGVkIGFzIGFuIGVudGl0eS4gIEVhY2ggYnl0ZSBpcyB0cmVhdGVkCiAgICAgICAgIHNlcGFyYXRlbHkuICBUaGUgZnVuY3Rpb24gaXMgbm90IGxvY2FsZS1kZXBlbmRlbnQuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHN0cmluZy5oeHEAfhufdAAnY29uc3QgY2hhciAqc3RyaW5nLCBjb25zdCBjaGFyICpzdG9wc2V0dAAGY2hhciAqdAAIc3RycHRpbWVzcQB+AAp0M5UKICAgICAgICBUaGUgPENPREU+c3RycHRpbWU8L0NPREU+IGZ1bmN0aW9uIHBhcnNlcyB0aGUgaW5wdXQgc3RyaW5nIDxWQVI+czwvVkFSPiBhY2NvcmRpbmcKICAgICAgICAgdG8gdGhlIGZvcm1hdCBzdHJpbmcgPFZBUj5mbXQ8L1ZBUj4gYW5kIHN0b3JlcyBpdHMgcmVzdWx0cyBpbiB0aGUKICAgICAgICAgc3RydWN0dXJlIDxWQVI+dHA8L1ZBUj4uCiAgICAgICAgIDxicj48YnI+IFRoZSBpbnB1dCBzdHJpbmcgY291bGQgYmUgZ2VuZXJhdGVkIGJ5IGEgPENPREU+c3RyZnRpbWU8L0NPREU+IGNhbGwgb3IKICAgICAgICAgb2J0YWluZWQgYW55IG90aGVyIHdheS4gIEl0IGRvZXMgbm90IG5lZWQgdG8gYmUgaW4gYSBodW1hbi1yZWNvZ25pemFibGUKICAgICAgICAgZm9ybWF0OyBlLmcuIGEgZGF0ZSBwYXNzZWQgYXMgPENPREU+IjAyOjE5OTk6OSI8L0NPREU+IGlzIGFjY2VwdGFibGUsIGV2ZW4KICAgICAgICAgdGhvdWdoIGl0IGlzIGFtYmlndW91cyB3aXRob3V0IGNvbnRleHQuICBBcyBsb25nIGFzIHRoZSBmb3JtYXQgc3RyaW5nCiAgICAgICAgIDxWQVI+Zm10PC9WQVI+IG1hdGNoZXMgdGhlIGlucHV0IHN0cmluZyB0aGUgZnVuY3Rpb24gd2lsbCBzdWNjZWVkLgogICAgICAgICA8YnI+PGJyPiBUaGUgdXNlciBoYXMgdG8gbWFrZSBzdXJlLCB0aG91Z2gsIHRoYXQgdGhlIGlucHV0IGNhbiBiZSBwYXJzZWQgaW4gYQogICAgICAgICB1bmFtYmlndW91cyB3YXkuICBUaGUgc3RyaW5nIDxDT0RFPiIxOTk5MTEyIjwvQ09ERT4gY2FuIGJlIHBhcnNlZCB1c2luZyB0aGUKICAgICAgICAgZm9ybWF0IDxDT0RFPiIlWSVtJWQiPC9DT0RFPiBhcyAxOTk5LTEtMTIsIDE5OTktMTEtMiwgb3IgZXZlbiAxOTk5MS0xLTIuICBJdAogICAgICAgICBpcyBuZWNlc3NhcnkgdG8gYWRkIGFwcHJvcHJpYXRlIHNlcGFyYXRvcnMgdG8gcmVsaWFibHkgZ2V0IHJlc3VsdHMuCiAgICAgICAgIDxicj48YnI+IFRoZSBmb3JtYXQgc3RyaW5nIGNvbnNpc3RzIG9mIHRoZSBzYW1lIGNvbXBvbmVudHMgYXMgdGhlIGZvcm1hdCBzdHJpbmcKICAgICAgICAgb2YgdGhlIDxDT0RFPnN0cmZ0aW1lPC9DT0RFPiBmdW5jdGlvbi4gIFRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUgZmxhZ3MKICAgICAgICAgPENPREU+XzwvQ09ERT4sIDxDT0RFPi08L0NPREU+LCA8Q09ERT4wPC9DT0RFPiwgYW5kIDxDT0RFPl48L0NPREU+IGFyZSBub3QgYWxsb3dlZC4KICAgICAgICAgU2V2ZXJhbCBvZiB0aGUgZGlzdGluY3QgZm9ybWF0cyBvZiA8Q09ERT5zdHJmdGltZTwvQ09ERT4gZG8gdGhlIHNhbWUgd29yayBpbgogICAgICAgICA8Q09ERT5zdHJwdGltZTwvQ09ERT4gc2luY2UgZGlmZmVyZW5jZXMgbGlrZSBjYXNlIG9mIHRoZSBpbnB1dCBkbyBub3QgbWF0dGVyLgogICAgICAgICBGb3IgcmVhc29ucyBvZiBzeW1tZXRyeSBhbGwgZm9ybWF0cyBhcmUgc3VwcG9ydGVkLCB0aG91Z2guCiAgICAgICAgIDxicj48YnI+IFRoZSBtb2RpZmllcnMgPENPREU+RTwvQ09ERT4gYW5kIDxDT0RFPk88L0NPREU+IGFyZSBhbHNvIGFsbG93ZWQgZXZlcnl3aGVyZSB0aGUKICAgICAgICAgPENPREU+c3RyZnRpbWU8L0NPREU+IGZ1bmN0aW9uIGFsbG93cyB0aGVtLgogICAgICAgICA8YnI+PGJyPiBUaGUgZm9ybWF0cyBhcmU6CiAgICAgICAgIDxicj48YnI+IDxETD4KCiAgICAgICAgIDxEVD48Q09ERT4lYTwvQ09ERT4KPEREPgogICAgICAgICA8TEk+eCAlQQogICAgICAgICBUaGUgd2Vla2RheSBuYW1lIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBsb2NhbGUsIGluIGFiYnJldmlhdGVkIGZvcm0gb3IKICAgICAgICAgdGhlIGZ1bGwgbmFtZS4KICAgICAgICAgPGJyPjxicj4gPExJPiAlYgogICAgICAgICA8TEk+eCAlQgogICAgICAgICA8TEk+eCAlaAogICAgICAgICBUaGUgbW9udGggbmFtZSBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgbG9jYWxlLCBpbiBhYmJyZXZpYXRlZCBmb3JtIG9yCiAgICAgICAgIHRoZSBmdWxsIG5hbWUuCiAgICAgICAgIDxicj48YnI+IDxMST4gJWMKICAgICAgICAgVGhlIGRhdGUgYW5kIHRpbWUgcmVwcmVzZW50YXRpb24gZm9yIHRoZSBjdXJyZW50IGxvY2FsZS4KICAgICAgICAgPGJyPjxicj4gPExJPiAlRWMKICAgICAgICAgTGlrZSA8Q09ERT4lYzwvQ09ERT4gYnV0IHRoZSBsb2NhbGUncyBhbHRlcm5hdGl2ZSBkYXRlIGFuZCB0aW1lIGZvcm1hdCBpcyB1c2VkLgogICAgICAgICA8YnI+PGJyPiA8TEk+ICVDCiAgICAgICAgIFRoZSBjZW50dXJ5IG9mIHRoZSB5ZWFyLgogICAgICAgICA8YnI+PGJyPiBJdCBtYWtlcyBzZW5zZSB0byB1c2UgdGhpcyBmb3JtYXQgb25seSBpZiB0aGUgZm9ybWF0IHN0cmluZyBhbHNvCiAgICAgICAgIGNvbnRhaW5zIHRoZSA8Q09ERT4leTwvQ09ERT4gZm9ybWF0LgogICAgICAgICA8YnI+PGJyPiA8TEk+ICVFQwogICAgICAgICBUaGUgbG9jYWxlJ3MgcmVwcmVzZW50YXRpb24gb2YgdGhlIHBlcmlvZC4KICAgICAgICAgPGJyPjxicj4gVW5saWtlIDxDT0RFPiVDPC9DT0RFPiBpdCBzb21ldGltZXMgbWFrZXMgc2Vuc2UgdG8gdXNlIHRoaXMgZm9ybWF0IHNpbmNlIHNvbWUKICAgICAgICAgY3VsdHVyZXMgcmVwcmVzZW50IHllYXJzIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgZXJhcyBpbnN0ZWFkIG9mCiAgICAgICAgIHVzaW5nIHRoZSBHcmVnb3JpYW4geWVhcnMuCiAgICAgICAgIDxicj48YnI+IDxMST4gJWQKICAgICAgICAgPExJPiAlZQogICAgICAgICBUaGUgZGF5IG9mIHRoZSBtb250aCBhcyBhIGRlY2ltYWwgbnVtYmVyIChyYW5nZSA8Q09ERT4xPC9DT0RFPiB0aHJvdWdoIDxDT0RFPjMxPC9DT0RFPikuCiAgICAgICAgIExlYWRpbmcgemVyb2VzIGFyZSBwZXJtaXR0ZWQgYnV0IG5vdCByZXF1aXJlZC4KICAgICAgICAgPGJyPjxicj4gPExJPiAlT2QKICAgICAgICAgPExJPnggJU9lCiAgICAgICAgIFNhbWUgYXMgPENPREU+JWQ8L0NPREU+IGJ1dCB1c2luZyB0aGUgbG9jYWxlJ3MgYWx0ZXJuYXRpdmUgbnVtZXJpYyBzeW1ib2xzLgogICAgICAgICA8YnI+PGJyPiBMZWFkaW5nIHplcm9lcyBhcmUgcGVybWl0dGVkIGJ1dCBub3QgcmVxdWlyZWQuCiAgICAgICAgIDxicj48YnI+IDxMST4gJUQKICAgICAgICAgRXF1aXZhbGVudCB0byA8Q09ERT4lbS8lZC8leTwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IDxMST4gJUYKICAgICAgICAgRXF1aXZhbGVudCB0byA8Q09ERT4lWS0lbS0lZDwvQ09ERT4sIHdoaWNoIGlzIHRoZSBJU08gODYwMSBkYXRlCiAgICAgICAgIGZvcm1hdC4KICAgICAgICAgPGJyPjxicj4gVGhpcyBpcyBhIEdOVSBleHRlbnNpb24gZm9sbG93aW5nIGFuIElTTyBDOTkgZXh0ZW5zaW9uIHRvCiAgICAgICAgIDxDT0RFPnN0cmZ0aW1lPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gPExJPiAlZwogICAgICAgICBUaGUgeWVhciBjb3JyZXNwb25kaW5nIHRvIHRoZSBJU08gd2VlayBudW1iZXIsIGJ1dCB3aXRob3V0IHRoZSBjZW50dXJ5CiAgICAgICAgIChyYW5nZSA8Q09ERT4wMDwvQ09ERT4gdGhyb3VnaCA8Q09ERT45OTwvQ09ERT4pLgogICAgICAgICA8YnI+PGJyPiA8RU0+Tm90ZTo8L0VNPiBDdXJyZW50bHksIHRoaXMgaXMgbm90IGZ1bGx5IGltcGxlbWVudGVkLiAgVGhlIGZvcm1hdCBpcwogICAgICAgICByZWNvZ25pemVkLCBpbnB1dCBpcyBjb25zdW1lZCBidXQgbm8gZmllbGQgaW4gPFZBUj50bTwvVkFSPiBpcyBzZXQuCiAgICAgICAgIDxicj48YnI+IFRoaXMgZm9ybWF0IGlzIGEgR05VIGV4dGVuc2lvbiBmb2xsb3dpbmcgYSBHTlUgZXh0ZW5zaW9uIG9mIDxDT0RFPnN0cmZ0aW1lPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gPExJPiAlRwogICAgICAgICBUaGUgeWVhciBjb3JyZXNwb25kaW5nIHRvIHRoZSBJU08gd2VlayBudW1iZXIuCiAgICAgICAgIDxicj48YnI+IDxFTT5Ob3RlOjwvRU0+IEN1cnJlbnRseSwgdGhpcyBpcyBub3QgZnVsbHkgaW1wbGVtZW50ZWQuICBUaGUgZm9ybWF0IGlzCiAgICAgICAgIHJlY29nbml6ZWQsIGlucHV0IGlzIGNvbnN1bWVkIGJ1dCBubyBmaWVsZCBpbiA8VkFSPnRtPC9WQVI+IGlzIHNldC4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmb3JtYXQgaXMgYSBHTlUgZXh0ZW5zaW9uIGZvbGxvd2luZyBhIEdOVSBleHRlbnNpb24gb2YgPENPREU+c3RyZnRpbWU8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiA8TEk+ICVICiAgICAgICAgIDxMST54ICVrCiAgICAgICAgIFRoZSBob3VyIGFzIGEgZGVjaW1hbCBudW1iZXIsIHVzaW5nIGEgMjQtaG91ciBjbG9jayAocmFuZ2UgPENPREU+MDA8L0NPREU+IHRocm91Z2gKICAgICAgICAgPENPREU+MjM8L0NPREU+KS4KICAgICAgICAgPGJyPjxicj4gPENPREU+JWs8L0NPREU+IGlzIGEgR05VIGV4dGVuc2lvbiBmb2xsb3dpbmcgYSBHTlUgZXh0ZW5zaW9uIG9mIDxDT0RFPnN0cmZ0aW1lPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gPExJPiAlT0gKICAgICAgICAgU2FtZSBhcyA8Q09ERT4lSDwvQ09ERT4gYnV0IHVzaW5nIHRoZSBsb2NhbGUncyBhbHRlcm5hdGl2ZSBudW1lcmljIHN5bWJvbHMuCiAgICAgICAgIDxicj48YnI+IDxMST4gJUkKICAgICAgICAgPExJPnggJWwKICAgICAgICAgVGhlIGhvdXIgYXMgYSBkZWNpbWFsIG51bWJlciwgdXNpbmcgYSAxMi1ob3VyIGNsb2NrIChyYW5nZSA8Q09ERT4wMTwvQ09ERT4gdGhyb3VnaAogICAgICAgICA8Q09ERT4xMjwvQ09ERT4pLgogICAgICAgICA8YnI+PGJyPiA8Q09ERT4lbDwvQ09ERT4gaXMgYSBHTlUgZXh0ZW5zaW9uIGZvbGxvd2luZyBhIEdOVSBleHRlbnNpb24gb2YgPENPREU+c3RyZnRpbWU8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiA8TEk+ICVPSQogICAgICAgICBTYW1lIGFzIDxDT0RFPiVJPC9DT0RFPiBidXQgdXNpbmcgdGhlIGxvY2FsZSdzIGFsdGVybmF0aXZlIG51bWVyaWMgc3ltYm9scy4KICAgICAgICAgPGJyPjxicj4gPExJPiAlagogICAgICAgICBUaGUgZGF5IG9mIHRoZSB5ZWFyIGFzIGEgZGVjaW1hbCBudW1iZXIgKHJhbmdlIDxDT0RFPjE8L0NPREU+IHRocm91Z2ggPENPREU+MzY2PC9DT0RFPikuCiAgICAgICAgIDxicj48YnI+IExlYWRpbmcgemVyb2VzIGFyZSBwZXJtaXR0ZWQgYnV0IG5vdCByZXF1aXJlZC4KICAgICAgICAgPGJyPjxicj4gPExJPiAlbQogICAgICAgICBUaGUgbW9udGggYXMgYSBkZWNpbWFsIG51bWJlciAocmFuZ2UgPENPREU+MTwvQ09ERT4gdGhyb3VnaCA8Q09ERT4xMjwvQ09ERT4pLgogICAgICAgICA8YnI+PGJyPiBMZWFkaW5nIHplcm9lcyBhcmUgcGVybWl0dGVkIGJ1dCBub3QgcmVxdWlyZWQuCiAgICAgICAgIDxicj48YnI+IDxMST4gJU9tCiAgICAgICAgIFNhbWUgYXMgPENPREU+JW08L0NPREU+IGJ1dCB1c2luZyB0aGUgbG9jYWxlJ3MgYWx0ZXJuYXRpdmUgbnVtZXJpYyBzeW1ib2xzLgogICAgICAgICA8YnI+PGJyPiA8TEk+ICVNCiAgICAgICAgIFRoZSBtaW51dGUgYXMgYSBkZWNpbWFsIG51bWJlciAocmFuZ2UgPENPREU+MDwvQ09ERT4gdGhyb3VnaCA8Q09ERT41OTwvQ09ERT4pLgogICAgICAgICA8YnI+PGJyPiBMZWFkaW5nIHplcm9lcyBhcmUgcGVybWl0dGVkIGJ1dCBub3QgcmVxdWlyZWQuCiAgICAgICAgIDxicj48YnI+IDxMST4gJU9NCiAgICAgICAgIFNhbWUgYXMgPENPREU+JU08L0NPREU+IGJ1dCB1c2luZyB0aGUgbG9jYWxlJ3MgYWx0ZXJuYXRpdmUgbnVtZXJpYyBzeW1ib2xzLgogICAgICAgICA8YnI+PGJyPiA8TEk+ICVuCiAgICAgICAgIDxMST54ICV0CiAgICAgICAgIE1hdGNoZXMgYW55IHdoaXRlIHNwYWNlLgogICAgICAgICA8YnI+PGJyPiA8TEk+ICVwCiAgICAgICAgIDxMST4gJVAKICAgICAgICAgVGhlIGxvY2FsZS1kZXBlbmRlbnQgZXF1aXZhbGVudCB0byA8c2FtcD5BTTwvc2FtcD4gb3IgPHNhbXA+UE08L3NhbXA+LgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZvcm1hdCBpcyBub3QgdXNlZnVsIHVubGVzcyA8Q09ERT4lSTwvQ09ERT4gb3IgPENPREU+JWw8L0NPREU+IGlzIGFsc28gdXNlZC4KICAgICAgICAgQW5vdGhlciBjb21wbGljYXRpb24gaXMgdGhhdCB0aGUgbG9jYWxlIG1pZ2h0IG5vdCBkZWZpbmUgdGhlc2UgdmFsdWVzIGF0CiAgICAgICAgIGFsbCBhbmQgdGhlcmVmb3JlIHRoZSBjb252ZXJzaW9uIGZhaWxzLgogICAgICAgICA8YnI+PGJyPiA8Q09ERT4lUDwvQ09ERT4gaXMgYSBHTlUgZXh0ZW5zaW9uIGZvbGxvd2luZyBhIEdOVSBleHRlbnNpb24gdG8gPENPREU+c3RyZnRpbWU8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiA8TEk+ICVyCiAgICAgICAgIFRoZSBjb21wbGV0ZSB0aW1lIHVzaW5nIHRoZSBBTS9QTSBmb3JtYXQgb2YgdGhlIGN1cnJlbnQgbG9jYWxlLgogICAgICAgICA8YnI+PGJyPiBBIGNvbXBsaWNhdGlvbiBpcyB0aGF0IHRoZSBsb2NhbGUgbWlnaHQgbm90IGRlZmluZSB0aGlzIGZvcm1hdCBhdCBhbGwKICAgICAgICAgYW5kIHRoZXJlZm9yZSB0aGUgY29udmVyc2lvbiBmYWlscy4KICAgICAgICAgPGJyPjxicj4gPExJPiAlUgogICAgICAgICBUaGUgaG91ciBhbmQgbWludXRlIGluIGRlY2ltYWwgbnVtYmVycyB1c2luZyB0aGUgZm9ybWF0IDxDT0RFPiVIOiVNPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gPENPREU+JVI8L0NPREU+IGlzIGEgR05VIGV4dGVuc2lvbiBmb2xsb3dpbmcgYSBHTlUgZXh0ZW5zaW9uIHRvIDxDT0RFPnN0cmZ0aW1lPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gPExJPiAlcwogICAgICAgICBUaGUgbnVtYmVyIG9mIHNlY29uZHMgc2luY2UgdGhlIGVwb2NoLCBpLmUuLCBzaW5jZSAxOTcwLTAxLTAxIDAwOjAwOjAwIFVUQy4KICAgICAgICAgTGVhcCBzZWNvbmRzIGFyZSBub3QgY291bnRlZCB1bmxlc3MgbGVhcCBzZWNvbmQgc3VwcG9ydCBpcyBhdmFpbGFibGUuCiAgICAgICAgIDxicj48YnI+IDxDT0RFPiVzPC9DT0RFPiBpcyBhIEdOVSBleHRlbnNpb24gZm9sbG93aW5nIGEgR05VIGV4dGVuc2lvbiB0byA8Q09ERT5zdHJmdGltZTwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IDxMST4gJVMKICAgICAgICAgVGhlIHNlY29uZHMgYXMgYSBkZWNpbWFsIG51bWJlciAocmFuZ2UgPENPREU+MDwvQ09ERT4gdGhyb3VnaCA8Q09ERT42MDwvQ09ERT4pLgogICAgICAgICA8YnI+PGJyPiBMZWFkaW5nIHplcm9lcyBhcmUgcGVybWl0dGVkIGJ1dCBub3QgcmVxdWlyZWQuCiAgICAgICAgIDxicj48YnI+IE5COiBUaGUgVW5peCBzcGVjaWZpY2F0aW9uIHNheXMgdGhlIHVwcGVyIGJvdW5kIG9uIHRoaXMgdmFsdWUKICAgICAgICAgaXMgPENPREU+NjE8L0NPREU+LCBhIHJlc3VsdCBvZiBhIGRlY2lzaW9uIHRvIGFsbG93IGRvdWJsZSBsZWFwIHNlY29uZHMuICBZb3UKICAgICAgICAgd2lsbCBub3Qgc2VlIHRoZSB2YWx1ZSA8Q09ERT42MTwvQ09ERT4gYmVjYXVzZSBubyBtaW51dGUgaGFzIG1vcmUgdGhhbiBvbmUKICAgICAgICAgbGVhcCBzZWNvbmQsIGJ1dCB0aGUgbXl0aCBwZXJzaXN0cy4KICAgICAgICAgPGJyPjxicj4gPExJPiAlT1MKICAgICAgICAgU2FtZSBhcyA8Q09ERT4lUzwvQ09ERT4gYnV0IHVzaW5nIHRoZSBsb2NhbGUncyBhbHRlcm5hdGl2ZSBudW1lcmljIHN5bWJvbHMuCiAgICAgICAgIDxicj48YnI+IDxMST4gJVQKICAgICAgICAgRXF1aXZhbGVudCB0byB0aGUgdXNlIG9mIDxDT0RFPiVIOiVNOiVTPC9DT0RFPiBpbiB0aGlzIHBsYWNlLgogICAgICAgICA8YnI+PGJyPiA8TEk+ICV1CiAgICAgICAgIFRoZSBkYXkgb2YgdGhlIHdlZWsgYXMgYSBkZWNpbWFsIG51bWJlciAocmFuZ2UgPENPREU+MTwvQ09ERT4gdGhyb3VnaAogICAgICAgICA8Q09ERT43PC9DT0RFPiksIE1vbmRheSBiZWluZyA8Q09ERT4xPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gTGVhZGluZyB6ZXJvZXMgYXJlIHBlcm1pdHRlZCBidXQgbm90IHJlcXVpcmVkLgogICAgICAgICA8YnI+PGJyPiA8RU0+Tm90ZTo8L0VNPiBDdXJyZW50bHksIHRoaXMgaXMgbm90IGZ1bGx5IGltcGxlbWVudGVkLiAgVGhlIGZvcm1hdCBpcwogICAgICAgICByZWNvZ25pemVkLCBpbnB1dCBpcyBjb25zdW1lZCBidXQgbm8gZmllbGQgaW4gPFZBUj50bTwvVkFSPiBpcyBzZXQuCiAgICAgICAgIDxicj48YnI+IDxMST4gJVUKICAgICAgICAgVGhlIHdlZWsgbnVtYmVyIG9mIHRoZSBjdXJyZW50IHllYXIgYXMgYSBkZWNpbWFsIG51bWJlciAocmFuZ2UgPENPREU+MDwvQ09ERT4KICAgICAgICAgdGhyb3VnaCA8Q09ERT41MzwvQ09ERT4pLgogICAgICAgICA8YnI+PGJyPiBMZWFkaW5nIHplcm9lcyBhcmUgcGVybWl0dGVkIGJ1dCBub3QgcmVxdWlyZWQuCiAgICAgICAgIDxicj48YnI+IDxMST4gJU9VCiAgICAgICAgIFNhbWUgYXMgPENPREU+JVU8L0NPREU+IGJ1dCB1c2luZyB0aGUgbG9jYWxlJ3MgYWx0ZXJuYXRpdmUgbnVtZXJpYyBzeW1ib2xzLgogICAgICAgICA8YnI+PGJyPiA8TEk+ICVWCiAgICAgICAgIFRoZSBJU08gODYwMToxOTg4IHdlZWsgbnVtYmVyIGFzIGEgZGVjaW1hbCBudW1iZXIgKHJhbmdlIDxDT0RFPjE8L0NPREU+CiAgICAgICAgIHRocm91Z2ggPENPREU+NTM8L0NPREU+KS4KICAgICAgICAgPGJyPjxicj4gTGVhZGluZyB6ZXJvZXMgYXJlIHBlcm1pdHRlZCBidXQgbm90IHJlcXVpcmVkLgogICAgICAgICA8YnI+PGJyPiA8RU0+Tm90ZTo8L0VNPiBDdXJyZW50bHksIHRoaXMgaXMgbm90IGZ1bGx5IGltcGxlbWVudGVkLiAgVGhlIGZvcm1hdCBpcwogICAgICAgICByZWNvZ25pemVkLCBpbnB1dCBpcyBjb25zdW1lZCBidXQgbm8gZmllbGQgaW4gPFZBUj50bTwvVkFSPiBpcyBzZXQuCiAgICAgICAgIDxicj48YnI+IDxMST4gJXcKICAgICAgICAgVGhlIGRheSBvZiB0aGUgd2VlayBhcyBhIGRlY2ltYWwgbnVtYmVyIChyYW5nZSA8Q09ERT4wPC9DT0RFPiB0aHJvdWdoCiAgICAgICAgIDxDT0RFPjY8L0NPREU+KSwgU3VuZGF5IGJlaW5nIDxDT0RFPjA8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBMZWFkaW5nIHplcm9lcyBhcmUgcGVybWl0dGVkIGJ1dCBub3QgcmVxdWlyZWQuCiAgICAgICAgIDxicj48YnI+IDxFTT5Ob3RlOjwvRU0+IEN1cnJlbnRseSwgdGhpcyBpcyBub3QgZnVsbHkgaW1wbGVtZW50ZWQuICBUaGUgZm9ybWF0IGlzCiAgICAgICAgIHJlY29nbml6ZWQsIGlucHV0IGlzIGNvbnN1bWVkIGJ1dCBubyBmaWVsZCBpbiA8VkFSPnRtPC9WQVI+IGlzIHNldC4KICAgICAgICAgPGJyPjxicj4gPExJPiAlT3cKICAgICAgICAgU2FtZSBhcyA8Q09ERT4ldzwvQ09ERT4gYnV0IHVzaW5nIHRoZSBsb2NhbGUncyBhbHRlcm5hdGl2ZSBudW1lcmljIHN5bWJvbHMuCiAgICAgICAgIDxicj48YnI+IDxMST4gJVcKICAgICAgICAgVGhlIHdlZWsgbnVtYmVyIG9mIHRoZSBjdXJyZW50IHllYXIgYXMgYSBkZWNpbWFsIG51bWJlciAocmFuZ2UgPENPREU+MDwvQ09ERT4KICAgICAgICAgdGhyb3VnaCA8Q09ERT41MzwvQ09ERT4pLgogICAgICAgICA8YnI+PGJyPiBMZWFkaW5nIHplcm9lcyBhcmUgcGVybWl0dGVkIGJ1dCBub3QgcmVxdWlyZWQuCiAgICAgICAgIDxicj48YnI+IDxFTT5Ob3RlOjwvRU0+IEN1cnJlbnRseSwgdGhpcyBpcyBub3QgZnVsbHkgaW1wbGVtZW50ZWQuICBUaGUgZm9ybWF0IGlzCiAgICAgICAgIHJlY29nbml6ZWQsIGlucHV0IGlzIGNvbnN1bWVkIGJ1dCBubyBmaWVsZCBpbiA8VkFSPnRtPC9WQVI+IGlzIHNldC4KICAgICAgICAgPGJyPjxicj4gPExJPiAlT1cKICAgICAgICAgU2FtZSBhcyA8Q09ERT4lVzwvQ09ERT4gYnV0IHVzaW5nIHRoZSBsb2NhbGUncyBhbHRlcm5hdGl2ZSBudW1lcmljIHN5bWJvbHMuCiAgICAgICAgIDxicj48YnI+IDxMST4gJXgKICAgICAgICAgVGhlIGRhdGUgdXNpbmcgdGhlIGxvY2FsZSdzIGRhdGUgZm9ybWF0LgogICAgICAgICA8YnI+PGJyPiA8TEk+ICVFeAogICAgICAgICBMaWtlIDxDT0RFPiV4PC9DT0RFPiBidXQgdGhlIGxvY2FsZSdzIGFsdGVybmF0aXZlIGRhdGEgcmVwcmVzZW50YXRpb24gaXMgdXNlZC4KICAgICAgICAgPGJyPjxicj4gPExJPiAlWAogICAgICAgICBUaGUgdGltZSB1c2luZyB0aGUgbG9jYWxlJ3MgdGltZSBmb3JtYXQuCiAgICAgICAgIDxicj48YnI+IDxMST4gJUVYCiAgICAgICAgIExpa2UgPENPREU+JVg8L0NPREU+IGJ1dCB0aGUgbG9jYWxlJ3MgYWx0ZXJuYXRpdmUgdGltZSByZXByZXNlbnRhdGlvbiBpcyB1c2VkLgogICAgICAgICA8YnI+PGJyPiA8TEk+ICV5CiAgICAgICAgIFRoZSB5ZWFyIHdpdGhvdXQgYSBjZW50dXJ5IGFzIGEgZGVjaW1hbCBudW1iZXIgKHJhbmdlIDxDT0RFPjA8L0NPREU+IHRocm91Z2gKICAgICAgICAgPENPREU+OTk8L0NPREU+KS4KICAgICAgICAgPGJyPjxicj4gTGVhZGluZyB6ZXJvZXMgYXJlIHBlcm1pdHRlZCBidXQgbm90IHJlcXVpcmVkLgogICAgICAgICA8YnI+PGJyPiBOb3RlIHRoYXQgaXQgaXMgcXVlc3Rpb25hYmxlIHRvIHVzZSB0aGlzIGZvcm1hdCB3aXRob3V0CiAgICAgICAgIHRoZSA8Q09ERT4lQzwvQ09ERT4gZm9ybWF0LiAgVGhlIDxDT0RFPnN0cnB0aW1lPC9DT0RFPiBmdW5jdGlvbiBkb2VzIHJlZ2FyZCBpbnB1dAogICAgICAgICB2YWx1ZXMgaW4gdGhlIHJhbmdlIDY4IHRvIDk5IGFzIHRoZSB5ZWFycyAxOTY5IHRvCiAgICAgICAgIDE5OTkgYW5kIHRoZSB2YWx1ZXMgMCB0byA2OCBhcyB0aGUgeWVhcnMKICAgICAgICAgMjAwMCB0byAyMDY4LiAgQnV0IG1heWJlIHRoaXMgaGV1cmlzdGljIGZhaWxzIGZvciBzb21lCiAgICAgICAgIGlucHV0IGRhdGEuCiAgICAgICAgIDxicj48YnI+IFRoZXJlZm9yZSBpdCBpcyBiZXN0IHRvIGF2b2lkIDxDT0RFPiV5PC9DT0RFPiBjb21wbGV0ZWx5IGFuZCB1c2UgPENPREU+JVk8L0NPREU+CiAgICAgICAgIGluc3RlYWQuCiAgICAgICAgIDxicj48YnI+IDxMST4gJUV5CiAgICAgICAgIFRoZSBvZmZzZXQgZnJvbSA8Q09ERT4lRUM8L0NPREU+IGluIHRoZSBsb2NhbGUncyBhbHRlcm5hdGl2ZSByZXByZXNlbnRhdGlvbi4KICAgICAgICAgPGJyPjxicj4gPExJPiAlT3kKICAgICAgICAgVGhlIG9mZnNldCBvZiB0aGUgeWVhciAoZnJvbSA8Q09ERT4lQzwvQ09ERT4pIHVzaW5nIHRoZSBsb2NhbGUncyBhbHRlcm5hdGl2ZQogICAgICAgICBudW1lcmljIHN5bWJvbHMuCiAgICAgICAgIDxicj48YnI+IDxMST4gJVkKICAgICAgICAgVGhlIHllYXIgYXMgYSBkZWNpbWFsIG51bWJlciwgdXNpbmcgdGhlIEdyZWdvcmlhbiBjYWxlbmRhci4KICAgICAgICAgPGJyPjxicj4gPExJPiAlRVkKICAgICAgICAgVGhlIGZ1bGwgYWx0ZXJuYXRpdmUgeWVhciByZXByZXNlbnRhdGlvbi4KICAgICAgICAgPGJyPjxicj4gPExJPiAlegogICAgICAgICBUaGUgb2Zmc2V0IGZyb20gR01UIGluIElTTyA4NjAxL1JGQzgyMiBmb3JtYXQuCiAgICAgICAgIDxicj48YnI+IDxMST4gJVoKICAgICAgICAgVGhlIHRpbWV6b25lIG5hbWUuCiAgICAgICAgIDxicj48YnI+IDxFTT5Ob3RlOjwvRU0+IEN1cnJlbnRseSwgdGhpcyBpcyBub3QgZnVsbHkgaW1wbGVtZW50ZWQuICBUaGUgZm9ybWF0IGlzCiAgICAgICAgIHJlY29nbml6ZWQsIGlucHV0IGlzIGNvbnN1bWVkIGJ1dCBubyBmaWVsZCBpbiA8VkFSPnRtPC9WQVI+IGlzIHNldC4KICAgICAgICAgPGJyPjxicj4gPExJPiAlJQogICAgICAgICBBIGxpdGVyYWwgPHNhbXA+JTwvc2FtcD4gY2hhcmFjdGVyLgoKICAgICAgICAgPGJyPjxicj4gQWxsIG90aGVyIGNoYXJhY3RlcnMgaW4gdGhlIGZvcm1hdCBzdHJpbmcgbXVzdCBoYXZlIGEgbWF0Y2hpbmcgY2hhcmFjdGVyCiAgICAgICAgIGluIHRoZSBpbnB1dCBzdHJpbmcuICBFeGNlcHRpb25zIGFyZSB3aGl0ZSBzcGFjZXMgaW4gdGhlIGlucHV0IHN0cmluZwogICAgICAgICB3aGljaCBjYW4gbWF0Y2ggemVybyBvciBtb3JlIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBpbiB0aGUgZm9ybWF0IHN0cmluZy4KICAgICAgICAgPGJyPjxicj4gUG9ydGFiaWxpdHkgTm90ZTogVGhlIFhQRyBzdGFuZGFyZCBhZHZpc2VzIGFwcGxpY2F0aW9ucyB0byB1c2UKICAgICAgICAgYXQgbGVhc3Qgb25lIHdoaXRlc3BhY2UgY2hhcmFjdGVyIChhcyBzcGVjaWZpZWQgYnkgPENPREU+aXNzcGFjZTwvQ09ERT4pIG9yCiAgICAgICAgIG90aGVyIG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVycyBiZXR3ZWVuIGFueSB0d28gY29udmVyc2lvbgogICAgICAgICBzcGVjaWZpY2F0aW9ucy4gIFRoZSBHTlUgQyBMaWJyYXJ5IGRvZXMgbm90IGhhdmUgdGhpcyBsaW1pdGF0aW9uIGJ1dAogICAgICAgICBvdGhlciBsaWJyYXJpZXMgbWlnaHQgaGF2ZSB0cm91YmxlIHBhcnNpbmcgZm9ybWF0cyBsaWtlCiAgICAgICAgIDxDT0RFPiIlZCVtJVklSCVNJVMiPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gVGhlIDxDT0RFPnN0cnB0aW1lPC9DT0RFPiBmdW5jdGlvbiBwcm9jZXNzZXMgdGhlIGlucHV0IHN0cmluZyBmcm9tIHJpZ2h0IHRvCiAgICAgICAgIGxlZnQuICBFYWNoIG9mIHRoZSB0aHJlZSBwb3NzaWJsZSBpbnB1dCBlbGVtZW50cyAod2hpdGUgc3BhY2UsIGxpdGVyYWwsCiAgICAgICAgIG9yIGZvcm1hdCkgYXJlIGhhbmRsZWQgb25lIGFmdGVyIHRoZSBvdGhlci4gIElmIHRoZSBpbnB1dCBjYW5ub3QgYmUKICAgICAgICAgbWF0Y2hlZCB0byB0aGUgZm9ybWF0IHN0cmluZyB0aGUgZnVuY3Rpb24gc3RvcHMuICBUaGUgcmVtYWluZGVyIG9mIHRoZQogICAgICAgICBmb3JtYXQgYW5kIGlucHV0IHN0cmluZ3MgYXJlIG5vdCBwcm9jZXNzZWQuCiAgICAgICAgIDxicj48YnI+IFRoZSBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIGl0IHdhcyB1bmFibGUgdG8KICAgICAgICAgcHJvY2Vzcy4gIElmIHRoZSBpbnB1dCBzdHJpbmcgY29udGFpbnMgbW9yZSBjaGFyYWN0ZXJzIHRoYW4gcmVxdWlyZWQgYnkKICAgICAgICAgdGhlIGZvcm1hdCBzdHJpbmcgdGhlIHJldHVybiB2YWx1ZSBwb2ludHMgcmlnaHQgYWZ0ZXIgdGhlIGxhc3QgY29uc3VtZWQKICAgICAgICAgaW5wdXQgY2hhcmFjdGVyLiAgSWYgdGhlIHdob2xlIGlucHV0IHN0cmluZyBpcyBjb25zdW1lZCB0aGUgcmV0dXJuIHZhbHVlCiAgICAgICAgIHBvaW50cyB0byB0aGUgPENPREU+TlVMTDwvQ09ERT4gYnl0ZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuICBJZiBhbiBlcnJvcgogICAgICAgICBvY2N1cnMsIGkuZS4sIDxDT0RFPnN0cnB0aW1lPC9DT0RFPiBmYWlscyB0byBtYXRjaCBhbGwgb2YgdGhlIGZvcm1hdCBzdHJpbmcsCiAgICAgICAgIHRoZSBmdW5jdGlvbiByZXR1cm5zIDxDT0RFPk5VTEw8L0NPREU+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZ0aW1lLmh4cQB+G6Z0AC1jb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICpmbXQsIHN0cnVjdCB0bSAqdHB0AAZjaGFyICp0AAdzdHJyY2hyc3EAfgAKdAFbCiAgICAgICAgVGhlIGZ1bmN0aW9uIDxDT0RFPnN0cnJjaHI8L0NPREU+IGlzIGxpa2UgPENPREU+c3RyY2hyPC9DT0RFPiwgZXhjZXB0IHRoYXQgaXQgc2VhcmNoZXMKICAgICAgICAgYmFja3dhcmRzIGZyb20gdGhlIGVuZCBvZiB0aGUgc3RyaW5nIDxWQVI+c3RyaW5nPC9WQVI+IChpbnN0ZWFkIG9mIGZvcndhcmRzCiAgICAgICAgIGZyb20gdGhlIGZyb250KS4KICAgICAgICAgPGJyPjxicj4gRm9yIGV4YW1wbGUsCiAgICAgICAgIDxwcmU+PGJyPgogICAgICAgICBzdHJyY2hyICgiaGVsbG8sIHdvcmxkIiwgJ2wnKTxicj4KICAgICAgICAgICAgICAibGQiPGJyPgogICAgICAgICA8L3ByZT4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc3RyaW5nLmh4cQB+G610ABljb25zdCBjaGFyICpzdHJpbmcsIGludCBjdAAGY2hhciAqdAAGc3Ryc2Vwc3EAfgAKdAQcCiAgICAgICAgVGhpcyBmdW5jdGlvbiBoYXMgYSBzaW1pbGFyIGZ1bmN0aW9uYWxpdHkgYXMgPENPREU+c3RydG9rX3I8L0NPREU+IHdpdGggdGhlCiAgICAgICAgIDxWQVI+bmV3c3RyaW5nPC9WQVI+IGFyZ3VtZW50IHJlcGxhY2VkIGJ5IHRoZSA8VkFSPnNhdmVfcHRyPC9WQVI+IGFyZ3VtZW50LiAgVGhlCiAgICAgICAgIGluaXRpYWxpemF0aW9uIG9mIHRoZSBtb3ZpbmcgcG9pbnRlciBoYXMgdG8gYmUgZG9uZSBieSB0aGUgdXNlci4KICAgICAgICAgU3VjY2Vzc2l2ZSBjYWxscyB0byA8Q09ERT5zdHJzZXA8L0NPREU+IG1vdmUgdGhlIHBvaW50ZXIgYWxvbmcgdGhlIHRva2VucwogICAgICAgICBzZXBhcmF0ZWQgYnkgPFZBUj5kZWxpbWl0ZXI8L1ZBUj4sIHJldHVybmluZyB0aGUgYWRkcmVzcyBvZiB0aGUgbmV4dCB0b2tlbgogICAgICAgICBhbmQgdXBkYXRpbmcgPFZBUj5zdHJpbmdfcHRyPC9WQVI+IHRvIHBvaW50IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQKICAgICAgICAgdG9rZW4uCiAgICAgICAgIDxicj48YnI+IE9uZSBkaWZmZXJlbmNlIGJldHdlZW4gPENPREU+c3Ryc2VwPC9DT0RFPiBhbmQgPENPREU+c3RydG9rX3I8L0NPREU+IGlzIHRoYXQgaWYgdGhlCiAgICAgICAgIGlucHV0IHN0cmluZyBjb250YWlucyBtb3JlIHRoYW4gb25lIGNoYXJhY3RlciBmcm9tIDxWQVI+ZGVsaW1pdGVyPC9WQVI+IGluIGEKICAgICAgICAgcm93IDxDT0RFPnN0cnNlcDwvQ09ERT4gcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgZm9yIGVhY2ggcGFpciBvZiBjaGFyYWN0ZXJzCiAgICAgICAgIGZyb20gPFZBUj5kZWxpbWl0ZXI8L1ZBUj4uICBUaGlzIG1lYW5zIHRoYXQgYSBwcm9ncmFtIG5vcm1hbGx5IHNob3VsZCB0ZXN0CiAgICAgICAgIGZvciA8Q09ERT5zdHJzZXA8L0NPREU+IHJldHVybmluZyBhbiBlbXB0eSBzdHJpbmcgYmVmb3JlIHByb2Nlc3NpbmcgaXQuCiAgICAgICAgIDxicj48YnI+IFRoaXMgZnVuY3Rpb24gd2FzIGludHJvZHVjZWQgaW4gNC4zQlNEIGFuZCB0aGVyZWZvcmUgaXMgd2lkZWx5IGF2YWlsYWJsZS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc3RyaW5nLmh4cQB+G7R0AChjaGFyICoqc3RyaW5nX3B0ciwgY29uc3QgY2hhciAqZGVsaW1pdGVydAAGY2hhciAqdAAJc3Ryc2lnbmFsc3EAfgAKdAHICiAgICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byBhIHN0YXRpY2FsbHktYWxsb2NhdGVkIHN0cmluZwogICAgICAgICBjb250YWluaW5nIGEgbWVzc2FnZSBkZXNjcmliaW5nIHRoZSBzaWduYWwgPFZBUj5zaWdudW08L1ZBUj4uICBZb3UKICAgICAgICAgc2hvdWxkIG5vdCBtb2RpZnkgdGhlIGNvbnRlbnRzIG9mIHRoaXMgc3RyaW5nOyBhbmQsIHNpbmNlIGl0IGNhbiBiZQogICAgICAgICByZXdyaXR0ZW4gb24gc3Vic2VxdWVudCBjYWxscywgeW91IHNob3VsZCBzYXZlIGEgY29weSBvZiBpdCBpZiB5b3UgbmVlZAogICAgICAgICB0byByZWZlcmVuY2UgaXQgbGF0ZXIuCiAgICAgICAgIDxicj48YnI+IFRoaXMgZnVuY3Rpb24gaXMgYSBHTlUgZXh0ZW5zaW9uLCBkZWNsYXJlZCBpbiB0aGUgaGVhZGVyIGZpbGUKICAgICAgICAgPFRUPnN0cmluZy5oPC9UVD4uCiAgICAgICAgc3EAfgAPAAAAAncEAAAAAnQACHNpZ25hbC5odAAIc3RyaW5nLmh4cQB+G7t0AAppbnQgc2lnbnVtdAAGY2hhciAqdAAGc3Ryc3Buc3EAfgAKdAMiCiAgICAgICAgVGhlIDxDT0RFPnN0cnNwbjwvQ09ERT4gKGBgc3RyaW5nIHNwYW4nJykgZnVuY3Rpb24gcmV0dXJucyB0aGUgbGVuZ3Ro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PiBUaGlzIGZ1bmN0aW9uIGF0dGVtcHRzIHRvIGRlY29tcG9zZSA8VkFSPnN0cmluZzwvVkFSPiBhcyBmb2xsb3dzOgogICAgICAgICA8YnI+PGJyPiA8T0w+CiAgICAgICAgIDxMST4KICAgICAgICAgQSAocG9zc2libHkgZW1wdHkpIHNlcXVlbmNlIG9mIHdoaXRlc3BhY2UgY2hhcmFjdGVycy4gIFdoaWNoIGNoYXJhY3RlcnMKICAgICAgICAgYXJlIHdoaXRlc3BhY2UgaXMgZGV0ZXJtaW5lZCBieSB0aGUgPENPREU+aXNzcGFjZTwvQ09ERT4gZnVuY3Rpb24KICAgICAgICAgLiAgVGhlc2UgYXJlIGRpc2NhcmRlZC4KICAgICAgICAgPGJyPjxicj4gPExJPgogICAgICAgICBBbiBvcHRpb25hbCBwbHVzIG9yIG1pbnVzIHNpZ24gKDxzYW1wPis8L3NhbXA+IG9yIDxzYW1wPi08L3NhbXA+KS4KICAgICAgICAgPGJyPjxicj4gPExJPiBBIGZsb2F0aW5nIHBvaW50IG51bWJlciBpbiBkZWNpbWFsIG9yIGhleGFkZWNpbWFsIGZvcm1hdC4gIFRoZQogICAgICAgICBkZWNpbWFsIGZvcm1hdCBpczoKICAgICAgICAgPFVMPgogICAgICAgICA8YnI+PGJyPiA8TEk+CiAgICAgICAgIEEgbm9uZW1wdHkgc2VxdWVuY2Ugb2YgZGlnaXRzIG9wdGlvbmFsbHkgY29udGFpbmluZyBhIGRlY2ltYWwtcG9pbnQKICAgICAgICAgY2hhcmFjdGVyLS0tbm9ybWFsbHkgPHNhbXA+Ljwvc2FtcD4sIGJ1dCBpdCBkZXBlbmRzIG9uIHRoZSBsb2NhbGUKICAgICAgICAgLgogICAgICAgICA8YnI+PGJyPiA8TEk+CiAgICAgICAgIEFuIG9wdGlvbmFsIGV4cG9uZW50IHBhcnQsIGNvbnNpc3Rpbmcgb2YgYSBjaGFyYWN0ZXIgPHNhbXA+ZTwvc2FtcD4gb3IKICAgICAgICAgPHNhbXA+RTwvc2FtcD4sIGFuIG9wdGlvbmFsIHNpZ24sIGFuZCBhIHNlcXVlbmNlIG9mIGRpZ2l0cy4KICAgICAgICAgPGJyPjxicj4gPC9VTD4KICAgICAgICAgPGJyPjxicj4gVGhlIGhleGFkZWNpbWFsIGZvcm1hdCBpcyBhcyBmb2xsb3dzOgogICAgICAgICA8VUw+CiAgICAgICAgIDxicj48YnI+IDxMST4KICAgICAgICAgQSAweCBvciAwWCBmb2xsb3dlZCBieSBhIG5vbmVtcHR5IHNlcXVlbmNlIG9mIGhleGFkZWNpbWFsIGRpZ2l0cwogICAgICAgICBvcHRpb25hbGx5IGNvbnRhaW5pbmcgYSBkZWNpbWFsLXBvaW50IGNoYXJhY3Rlci0tLW5vcm1hbGx5IDxzYW1wPi48L3NhbXA+LCBidXQKICAgICAgICAgaXQgZGVwZW5kcyBvbiB0aGUgbG9jYWxlIC4KICAgICAgICAgPGJyPjxicj4gPExJPgogICAgICAgICBBbiBvcHRpb25hbCBiaW5hcnktZXhwb25lbnQgcGFydCwgY29uc2lzdGluZyBvZiBhIGNoYXJhY3RlciA8c2FtcD5wPC9zYW1wPiBvcgogICAgICAgICA8c2FtcD5QPC9zYW1wPiwgYW4gb3B0aW9uYWwgc2lnbiwgYW5kIGEgc2VxdWVuY2Ugb2YgZGlnaXRzLgogICAgICAgICA8YnI+PGJyPiA8L1VMPgogICAgICAgICA8YnI+PGJyPiA8TEk+CiAgICAgICAgIEFueSByZW1haW5pbmcgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nLiAgSWYgPFZBUj50YWlscHRyPC9WQVI+IGlzIG5vdCBhIG51bGwKICAgICAgICAgcG9pbnRlciwgYSBwb2ludGVyIHRvIHRoaXMgdGFpbCBvZiB0aGUgc3RyaW5nIGlzIHN0b3JlZCBpbgogICAgICAgICA8Q09ERT4qPFZBUj50YWlscHRyPC9WQVI+PC9DT0RFPi4KICAgICAgICAgPC9PTD4KICAgICAgICAgPGJyPjxicj4gSWYgdGhlIHN0cmluZyBpcyBlbXB0eSwgY29udGFpbnMgb25seSB3aGl0ZXNwYWNlLCBvciBkb2VzIG5vdCBjb250YWluIGFuCiAgICAgICAgIGluaXRpYWwgc3Vic3RyaW5nIHRoYXQgaGFzIHRoZSBleHBlY3RlZCBzeW50YXggZm9yIGEgZmxvYXRpbmctcG9pbnQKICAgICAgICAgbnVtYmVyLCBubyBjb252ZXJzaW9uIGlzIHBlcmZvcm1lZC4gIEluIHRoaXMgY2FzZSwgPENPREU+c3RydG9kPC9DT0RFPiByZXR1cm5zCiAgICAgICAgIGEgdmFsdWUgb2YgemVybyBhbmQgdGhlIHZhbHVlIHJldHVybmVkIGluIDxDT0RFPio8VkFSPnRhaWxwdHI8L1ZBUj48L0NPREU+IGlzIHRoZQogICAgICAgICB2YWx1ZSBvZiA8VkFSPnN0cmluZzwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gSW4gYSBsb2NhbGUgb3RoZXIgdGhhbiB0aGUgc3RhbmRhcmQgPENPREU+IkMiPC9DT0RFPiBvciA8Q09ERT4iUE9TSVgiPC9DT0RFPiBsb2NhbGVzLAogICAgICAgICB0aGlzIGZ1bmN0aW9uIG1heSByZWNvZ25pemUgYWRkaXRpb25hbCBsb2NhbGUtZGVwZW5kZW50IHN5bnRheC4KICAgICAgICAgPGJyPjxicj4gSWYgdGhlIHN0cmluZyBoYXMgdmFsaWQgc3ludGF4IGZvciBhIGZsb2F0aW5nLXBvaW50IG51bWJlciBidXQgdGhlIHZhbHVlCiAgICAgICAgIGlzIG91dHNpZGUgdGhlIHJhbmdlIG9mIGEgPENPREU+ZG91YmxlPC9DT0RFPiwgPENPREU+c3RydG9kPC9DT0RFPiB3aWxsIHNpZ25hbAogICAgICAgICBvdmVyZmxvdyBvciB1bmRlcmZsb3cgYXMgZGVzY3JpYmVkIGluIE1hdGggRXJyb3IgUmVwb3J0aW5nLgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5zdHJ0b2Q8L0NPREU+IHJlY29nbml6ZXMgZm91ciBzcGVjaWFsIGlucHV0IHN0cmluZ3MuICBUaGUgc3RyaW5ncwogICAgICAgICA8Q09ERT4iaW5mIjwvQ09ERT4gYW5kIDxDT0RFPiJpbmZpbml0eSI8L0NPREU+IGFyZSBjb252ZXJ0ZWQgdG8gaW5maW5pdHl7fSwKICAgICAgICAgb3IgdG8gdGhlIGxhcmdlc3QgcmVwcmVzZW50YWJsZSB2YWx1ZSBpZiB0aGUgZmxvYXRpbmctcG9pbnQgZm9ybWF0CiAgICAgICAgIGRvZXNuJ3Qgc3VwcG9ydCBpbmZpbml0aWVzLiAgWW91IGNhbiBwcmVwZW5kIGEgPENPREU+IisiPC9DT0RFPiBvciA8Q09ERT4iLSI8L0NPREU+CiAgICAgICAgIHRvIHNwZWNpZnkgdGhlIHNpZ24uICBDYXNlIGlzIGlnbm9yZWQgd2hlbiBzY2FubmluZyB0aGVzZSBzdHJpbmdzLgogICAgICAgICA8YnI+PGJyPiBUaGUgc3RyaW5ncyA8Q09ERT4ibmFuIjwvQ09ERT4gYW5kIDxDT0RFPiJuYW4oPFZBUj5jaGFyczwvVkFSPjwvQ09ERT4pIiBhcmUgY29udmVydGVkCiAgICAgICAgIHRvIE5hTi4gIEFnYWluLCBjYXNlIGlzIGlnbm9yZWQuICBJZiA8VkFSPmNoYXJzPC9WQVI+IGFyZSBwcm92aWRlZCwgdGhleQogICAgICAgICBhcmUgdXNlZCBpbiBzb21lIHVuc3BlY2lmaWVkIGZhc2hpb24gdG8gc2VsZWN0IGEgcGFydGljdWxhcgogICAgICAgICByZXByZXNlbnRhdGlvbiBvZiBOYU4gKHRoZXJlIGNhbiBiZSBzZXZlcmFsKS4KICAgICAgICAgPGJyPjxicj4gU2luY2UgemVybyBpcyBhIHZhbGlkIHJlc3VsdCBhcyB3ZWxsIGFzIHRoZSB2YWx1ZSByZXR1cm5lZCBvbiBlcnJvciwgeW91CiAgICAgICAgIHNob3VsZCBjaGVjayBmb3IgZXJyb3JzIGluIHRoZSBzYW1lIHdheSBhcyBmb3IgPENPREU+c3RydG9sPC9DT0RFPiwgYnkKICAgICAgICAgZXhhbWluaW5nIDxWQVI+ZXJybm88L1ZBUj4gYW5kIDxWQVI+dGFpbHB0cjwvVkFSPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc3RkbGliLmh4cQB+G9F0ADRjb25zdCBjaGFyICpyZXN0cmljdCBzdHJpbmcsIGNoYXIgKipyZXN0cmljdCB0YWlscHRydAAGZG91YmxldAAGc3RydG9mc3EAfgAKdAJBCiAgICAgICAgVGhlc2UgZnVuY3Rpb25zIGFyZSBhbmFsb2dvdXMgdG8gPENPREU+c3RydG9kPC9DT0RFPiwgYnV0IHJldHVybiA8Q09ERT5mbG9hdDwvQ09ERT4KICAgICAgICAgYW5kIDxDT0RFPmxvbmcgZG91YmxlPC9DT0RFPiB2YWx1ZXMgcmVzcGVjdGl2ZWx5LiAgVGhleSByZXBvcnQgZXJyb3JzIGluIHRoZQogICAgICAgICBzYW1lIHdheSBhcyA8Q09ERT5zdHJ0b2Q8L0NPREU+LiAgPENPREU+c3RydG9mPC9DT0RFPiBjYW4gYmUgc3Vic3RhbnRpYWxseSBmYXN0ZXIKICAgICAgICAgdGhhbiA8Q09ERT5zdHJ0b2Q8L0NPREU+LCBidXQgaGFzIGxlc3MgcHJlY2lzaW9uOyBjb252ZXJzZWx5LCA8Q09ERT5zdHJ0b2xkPC9DT0RFPgogICAgICAgICBjYW4gYmUgbXVjaCBzbG93ZXIgYnV0IGhhcyBtb3JlIHByZWNpc2lvbiAob24gc3lzdGVtcyB3aGVyZSA8Q09ERT5sb25nCiAgICAgICAgIGRvdWJsZTwvQ09ERT4gaXMgYSBzZXBhcmF0ZSB0eXBlKS4KICAgICAgICAgPGJyPjxicj4gVGhlc2UgZnVuY3Rpb25zIGhhdmUgYmVlbiBHTlUgZXh0ZW5zaW9ucyBhbmQgYXJlIG5ldyB0byBJU08gQzk5LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAhzdGRsaWIuaHhxAH4b2HQAImNvbnN0IGNoYXIgKnN0cmluZywgY2hhciAqKnRhaWxwdHJ0AAVmbG9hdHQACXN0cnRvaW1heHNxAH4ACnQC1AogICAgICAgIFRoZSA8Q09ERT5zdHJ0b2ltYXg8L0NPREU+IGZ1bmN0aW9uIGlzIGxpa2UgPENPREU+c3RydG9sPC9DT0RFPiBleGNlcHQgdGhhdCBpdCByZXR1cm5zCiAgICAgICAgIGEgPENPREU+aW50bWF4X3Q8L0NPREU+IHZhbHVlLCBhbmQgYWNjZXB0cyBudW1iZXJzIG9mIGEgY29ycmVzcG9uZGluZyByYW5nZS4KICAgICAgICAgPGJyPjxicj4gSWYgdGhlIHN0cmluZyBoYXMgdmFsaWQgc3ludGF4IGZvciBhbiBpbnRlZ2VyIGJ1dCB0aGUgdmFsdWUgaXMgbm90CiAgICAgICAgIHJlcHJlc2VudGFibGUgYmVjYXVzZSBvZiBvdmVyZmxvdywgPENPREU+c3RydG9pbWF4PC9DT0RFPiByZXR1cm5zIGVpdGhlcgogICAgICAgICA8Q09ERT5JTlRNQVhfTUFYPC9DT0RFPiBvciA8Q09ERT5JTlRNQVhfTUlOPC9DT0RFPiAsIGFzCiAgICAgICAgIGFwcHJvcHJpYXRlIGZvciB0aGUgc2lnbiBvZiB0aGUgdmFsdWUuICBJdCBhbHNvIHNldHMgPENPREU+ZXJybm88L0NPREU+IHRvCiAgICAgICAgIDxDT0RFPkVSQU5HRTwvQ09ERT4gdG8gaW5kaWNhdGUgdGhlcmUgd2FzIG92ZXJmbG93LgogICAgICAgICA8YnI+PGJyPiBTZWUgSW50ZWdlcnMgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIDxDT0RFPmludG1heF90PC9DT0RFPiB0eXBlLiAgVGhlCiAgICAgICAgIDxDT0RFPnN0cnRvaW1heDwvQ09ERT4gZnVuY3Rpb24gd2FzIGludHJvZHVjZWQgaW4gSVNPIEM5OS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAKaW50dHlwZXMuaHhxAH4b33QAPmNvbnN0IGNoYXIgKnJlc3RyaWN0IHN0cmluZywgY2hhciAqKnJlc3RyaWN0IHRhaWxwdHIsIGludCBiYXNldAAIaW50bWF4X3R0AAZzdHJ0b2tzcQB+AAp0CRUKICAgICAgICBBIHN0cmluZyBjYW4gYmUgc3BsaXQgaW50byB0b2tlbnMgYnkgbWFraW5nIGEgc2VyaWVzIG9mIGNhbGxzIHRvIHRoZQogICAgICAgICBmdW5jdGlvbiA8Q09ERT5zdHJ0b2s8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBUaGUgc3RyaW5nIHRvIGJlIHNwbGl0IHVwIGlzIHBhc3NlZCBhcyB0aGUgPFZBUj5uZXdzdHJpbmc8L1ZBUj4gYXJndW1lbnQgb24KICAgICAgICAgdGhlIGZpcnN0IGNhbGwgb25seS4gIFRoZSA8Q09ERT5zdHJ0b2s8L0NPREU+IGZ1bmN0aW9uIHVzZXMgdGhpcyB0byBzZXQgdXAKICAgICAgICAgc29tZSBpbnRlcm5hbCBzdGF0ZSBpbmZvcm1hdGlvbi4gIFN1YnNlcXVlbnQgY2FsbHMgdG8gZ2V0IGFkZGl0aW9uYWwKICAgICAgICAgdG9rZW5zIGZyb20gdGhlIHNhbWUgc3RyaW5nIGFyZSBpbmRpY2F0ZWQgYnkgcGFzc2luZyBhIG51bGwgcG9pbnRlciBhcwogICAgICAgICB0aGUgPFZBUj5uZXdzdHJpbmc8L1ZBUj4gYXJndW1lbnQuICBDYWxsaW5nIDxDT0RFPnN0cnRvazwvQ09ERT4gd2l0aCBhbm90aGVyCiAgICAgICAgIG5vbi1udWxsIDxWQVI+bmV3c3RyaW5nPC9WQVI+IGFyZ3VtZW50IHJlaW5pdGlhbGl6ZXMgdGhlIHN0YXRlIGluZm9ybWF0aW9uLgogICAgICAgICBJdCBpcyBndWFyYW50ZWVkIHRoYXQgbm8gb3RoZXIgbGlicmFyeSBmdW5jdGlvbiBldmVyIGNhbGxzIDxDT0RFPnN0cnRvazwvQ09ERT4KICAgICAgICAgYmVoaW5kIHlvdXIgYmFjayAod2hpY2ggd291bGQgbWVzcyB1cCB0aGlzIGludGVybmFsIHN0YXRlIGluZm9ybWF0aW9uKS4KICAgICAgICAgPGJyPjxicj4gVGhlIDxWQVI+ZGVsaW1pdGVyczwvVkFSPiBhcmd1bWVudCBpcyBhIHN0cmluZyB0aGF0IHNwZWNpZmllcyBhIHNldCBvZiBkZWxpbWl0ZXJzCiAgICAgICAgIHRoYXQgbWF5IHN1cnJvdW5kIHRoZSB0b2tlbiBiZWluZyBleHRyYWN0ZWQuICBBbGwgdGhlIGluaXRpYWwgY2hhcmFjdGVycwogICAgICAgICB0aGF0IGFyZSBtZW1iZXJzIG9mIHRoaXMgc2V0IGFyZSBkaXNjYXJkZWQuICBUaGUgZmlyc3QgY2hhcmFjdGVyIHRoYXQgaXMKICAgICAgICAgPEVNPm5vdDwvRU0+IGEgbWVtYmVyIG9mIHRoaXMgc2V0IG9mIGRlbGltaXRlcnMgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUKICAgICAgICAgbmV4dCB0b2tlbi4gIFRoZSBlbmQgb2YgdGhlIHRva2VuIGlzIGZvdW5kIGJ5IGxvb2tpbmcgZm9yIHRoZSBuZXh0CiAgICAgICAgIGNoYXJhY3RlciB0aGF0IGlzIGEgbWVtYmVyIG9mIHRoZSBkZWxpbWl0ZXIgc2V0LiAgVGhpcyBjaGFyYWN0ZXIgaW4gdGhlCiAgICAgICAgIG9yaWdpbmFsIHN0cmluZyA8VkFSPm5ld3N0cmluZzwvVkFSPiBpcyBvdmVyd3JpdHRlbiBieSBhIG51bGwgY2hhcmFjdGVyLCBhbmQgdGhlCiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgdG9rZW4gaW4gPFZBUj5uZXdzdHJpbmc8L1ZBUj4gaXMgcmV0dXJuZWQuCiAgICAgICAgIDxicj48YnI+IE9uIHRoZSBuZXh0IGNhbGwgdG8gPENPREU+c3RydG9rPC9DT0RFPiwgdGhlIHNlYXJjaGluZyBiZWdpbnMgYXQgdGhlIG5leHQKICAgICAgICAgY2hhcmFjdGVyIGJleW9uZCB0aGUgb25lIHRoYXQgbWFya2VkIHRoZSBlbmQgb2YgdGhlIHByZXZpb3VzIHRva2VuLgogICAgICAgICBOb3RlIHRoYXQgdGhlIHNldCBvZiBkZWxpbWl0ZXJzIDxWQVI+ZGVsaW1pdGVyczwvVkFSPiBkbyBub3QgaGF2ZSB0byBiZSB0aGUKICAgICAgICAgc2FtZSBvbiBldmVyeSBjYWxsIGluIGEgc2VyaWVzIG9mIGNhbGxzIHRvIDxDT0RFPnN0cnRvazwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IElmIHRoZSBlbmQgb2YgdGhlIHN0cmluZyA8VkFSPm5ld3N0cmluZzwvVkFSPiBpcyByZWFjaGVkLCBvciBpZiB0aGUgcmVtYWluZGVyIG9mCiAgICAgICAgIHN0cmluZyBjb25zaXN0cyBvbmx5IG9mIGRlbGltaXRlciBjaGFyYWN0ZXJzLCA8Q09ERT5zdHJ0b2s8L0NPREU+IHJldHVybnMKICAgICAgICAgYSBudWxsIHBvaW50ZXIuCiAgICAgICAgIDxicj48YnI+IE5vdGUgdGhhdCBgYGNoYXJhY3RlcicnIGlzIGhlcmUgdXNlZCBpbiB0aGUgc2Vuc2Ugb2YgYnl0ZS4gIEluIGEgc3RyaW5nCiAgICAgICAgIHVzaW5nIGEgbXVsdGlieXRlIGNoYXJhY3RlciBlbmNvZGluZyAoYWJzdHJhY3QpIGNoYXJhY3RlciBjb25zaXN0aW5nIG9mCiAgICAgICAgIG1vcmUgdGhhbiBvbmUgYnl0ZSBhcmUgbm90IHRyZWF0ZWQgYXMgYW4gZW50aXR5LiAgRWFjaCBieXRlIGlzIHRyZWF0ZWQKICAgICAgICAgc2VwYXJhdGVseS4gIFRoZSBmdW5jdGlvbiBpcyBub3QgbG9jYWxlLWRlcGVuZGVudC4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc3RyaW5nLmh4cQB+G+Z0ADljaGFyICpyZXN0cmljdCBuZXdzdHJpbmcsIGNvbnN0IGNoYXIgKnJlc3RyaWN0IGRlbGltaXRlcnN0AAZjaGFyICp0AAhzdHJ0b2tfcnNxAH4ACnQCwgogICAgICAgIEp1c3QgbGlrZSA8Q09ERT5zdHJ0b2s8L0NPREU+LCB0aGlzIGZ1bmN0aW9uIHNwbGl0cyB0aGUgc3RyaW5nIGludG8gc2V2ZXJhbAogICAgICAgICB0b2tlbnMgd2hpY2ggY2FuIGJlIGFjY2Vzc2VkIGJ5IHN1Y2Nlc3NpdmUgY2FsbHMgdG8gPENPREU+c3RydG9rX3I8L0NPREU+LgogICAgICAgICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbmV4dCB0b2tlbiBpcyBzdG9yZWQgaW4KICAgICAgICAgdGhlIHNwYWNlIHBvaW50ZWQgdG8gYnkgdGhlIHRoaXJkIGFyZ3VtZW50LCA8VkFSPnNhdmVfcHRyPC9WQVI+LCB3aGljaCBpcyBhCiAgICAgICAgIHBvaW50ZXIgdG8gYSBzdHJpbmcgcG9pbnRlci4gIENhbGxpbmcgPENPREU+c3RydG9rX3I8L0NPREU+IHdpdGggYSBudWxsCiAgICAgICAgIHBvaW50ZXIgZm9yIDxWQVI+bmV3c3RyaW5nPC9WQVI+IGFuZCBsZWF2aW5nIDxWQVI+c2F2ZV9wdHI8L1ZBUj4gYmV0d2VlbiB0aGUgY2FsbHMKICAgICAgICAgdW5jaGFuZ2VkIGRvZXMgdGhlIGpvYiB3aXRob3V0IGhpbmRlcmluZyByZWVudHJhbmN5LgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIGlzIGRlZmluZWQgaW4gUE9TSVguMSBhbmQgY2FuIGJlIGZvdW5kIG9uIG1hbnkgc3lzdGVtcwogICAgICAgICB3aGljaCBzdXBwb3J0IG11bHRpLXRocmVhZGluZy4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc3RyaW5nLmh4cQB+G+10ADhjaGFyICpuZXdzdHJpbmcsIGNvbnN0IGNoYXIgKmRlbGltaXRlcnMsIGNoYXIgKipzYXZlX3B0cnQABmNoYXIgKnQABnN0cnRvbHNxAH4ACnQMiwogICAgICAgIFRoZSA8Q09ERT5zdHJ0b2w8L0NPREU+IChgYHN0cmluZy10by1sb25nJycpIGZ1bmN0aW9uIGNvbnZlcnRzIHRoZSBpbml0aWFsCiAgICAgICAgIHBhcnQgb2YgPFZBUj5zdHJpbmc8L1ZBUj4gdG8gYSBzaWduZWQgaW50ZWdlciwgd2hpY2ggaXMgcmV0dXJuZWQgYXMgYSB2YWx1ZQogICAgICAgICBvZiB0eXBlIDxDT0RFPmxvbmcgaW50PC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiBhdHRlbXB0cyB0byBkZWNvbXBvc2UgPFZBUj5zdHJpbmc8L1ZBUj4gYXMgZm9sbG93czoKICAgICAgICAgPGJyPjxicj4gPE9MPgogICAgICAgICA8TEk+CiAgICAgICAgIEEgKHBvc3NpYmx5IGVtcHR5KSBzZXF1ZW5jZSBvZiB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMuICBXaGljaCBjaGFyYWN0ZXJzCiAgICAgICAgIGFyZSB3aGl0ZXNwYWNlIGlzIGRldGVybWluZWQgYnkgdGhlIDxDT0RFPmlzc3BhY2U8L0NPREU+IGZ1bmN0aW9uCiAgICAgICAgIC4gIFRoZXNlIGFyZSBkaXNjYXJkZWQuCiAgICAgICAgIDxicj48YnI+IDxMST4KICAgICAgICAgQW4gb3B0aW9uYWwgcGx1cyBvciBtaW51cyBzaWduICg8c2FtcD4rPC9zYW1wPiBvciA8c2FtcD4tPC9zYW1wPikuCiAgICAgICAgIDxicj48YnI+IDxMST4KICAgICAgICAgQSBub25lbXB0eSBzZXF1ZW5jZSBvZiBkaWdpdHMgaW4gdGhlIHJhZGl4IHNwZWNpZmllZCBieSA8VkFSPmJhc2U8L1ZBUj4uCiAgICAgICAgIDxicj48YnI+IElmIDxWQVI+YmFzZTwvVkFSPiBpcyB6ZXJvLCBkZWNpbWFsIHJhZGl4IGlzIGFzc3VtZWQgdW5sZXNzIHRoZSBzZXJpZXMgb2YKICAgICAgICAgZGlnaXRzIGJlZ2lucyB3aXRoIDxzYW1wPjA8L3NhbXA+IChzcGVjaWZ5aW5nIG9jdGFsIHJhZGl4KSwgb3IgPHNhbXA+MHg8L3NhbXA+IG9yCiAgICAgICAgIDxzYW1wPjBYPC9zYW1wPiAoc3BlY2lmeWluZyBoZXhhZGVjaW1hbCByYWRpeCk7IGluIG90aGVyIHdvcmRzLCB0aGUgc2FtZQogICAgICAgICBzeW50YXggdXNlZCBmb3IgaW50ZWdlciBjb25zdGFudHMgaW4gQy4KICAgICAgICAgPGJyPjxicj4gT3RoZXJ3aXNlIDxWQVI+YmFzZTwvVkFSPiBtdXN0IGhhdmUgYSB2YWx1ZSBiZXR3ZWVuIDxDT0RFPjI8L0NPREU+IGFuZCA8Q09ERT4zNjwvQ09ERT4uCiAgICAgICAgIElmIDxWQVI+YmFzZTwvVkFSPiBpcyA8Q09ERT4xNjwvQ09ERT4sIHRoZSBkaWdpdHMgbWF5IG9wdGlvbmFsbHkgYmUgcHJlY2VkZWQgYnkKICAgICAgICAgPHNhbXA+MHg8L3NhbXA+IG9yIDxzYW1wPjBYPC9zYW1wPi4gIElmIGJhc2UgaGFzIG5vIGxlZ2FsIHZhbHVlIHRoZSB2YWx1ZSByZXR1cm5lZAogICAgICAgICBpcyA8Q09ERT4wbDwvQ09ERT4gYW5kIHRoZSBnbG9iYWwgdmFyaWFibGUgPENPREU+ZXJybm88L0NPREU+IGlzIHNldCB0byA8Q09ERT5FSU5WQUw8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiA8TEk+CiAgICAgICAgIEFueSByZW1haW5pbmcgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nLiAgSWYgPFZBUj50YWlscHRyPC9WQVI+IGlzIG5vdCBhIG51bGwKICAgICAgICAgcG9pbnRlciwgPENPREU+c3RydG9sPC9DT0RFPiBzdG9yZXMgYSBwb2ludGVyIHRvIHRoaXMgdGFpbCBpbgogICAgICAgICA8Q09ERT4qPFZBUj50YWlscHRyPC9WQVI+PC9DT0RFPi4KICAgICAgICAgPC9PTD4KICAgICAgICAgPGJyPjxicj4gSWYgdGhlIHN0cmluZyBpcyBlbXB0eSwgY29udGFpbnMgb25seSB3aGl0ZXNwYWNlLCBvciBkb2VzIG5vdCBjb250YWluIGFuCiAgICAgICAgIGluaXRpYWwgc3Vic3RyaW5nIHRoYXQgaGFzIHRoZSBleHBlY3RlZCBzeW50YXggZm9yIGFuIGludGVnZXIgaW4gdGhlCiAgICAgICAgIHNwZWNpZmllZCA8VkFSPmJhc2U8L1ZBUj4sIG5vIGNvbnZlcnNpb24gaXMgcGVyZm9ybWVkLiAgSW4gdGhpcyBjYXNlLAogICAgICAgICA8Q09ERT5zdHJ0b2w8L0NPREU+IHJldHVybnMgYSB2YWx1ZSBvZiB6ZXJvIGFuZCB0aGUgdmFsdWUgc3RvcmVkIGluCiAgICAgICAgIDxDT0RFPio8VkFSPnRhaWxwdHI8L1ZBUj48L0NPREU+IGlzIHRoZSB2YWx1ZSBvZiA8VkFSPnN0cmluZzwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gSW4gYSBsb2NhbGUgb3RoZXIgdGhhbiB0aGUgc3RhbmRhcmQgPENPREU+IkMiPC9DT0RFPiBsb2NhbGUsIHRoaXMgZnVuY3Rpb24KICAgICAgICAgbWF5IHJlY29nbml6ZSBhZGRpdGlvbmFsIGltcGxlbWVudGF0aW9uLWRlcGVuZGVudCBzeW50YXguCiAgICAgICAgIDxicj48YnI+IElmIHRoZSBzdHJpbmcgaGFzIHZhbGlkIHN5bnRheCBmb3IgYW4gaW50ZWdlciBidXQgdGhlIHZhbHVlIGlzIG5vdAogICAgICAgICByZXByZXNlbnRhYmxlIGJlY2F1c2Ugb2Ygb3ZlcmZsb3csIDxDT0RFPnN0cnRvbDwvQ09ERT4gcmV0dXJucyBlaXRoZXIKICAgICAgICAgPENPREU+TE9OR19NQVg8L0NPREU+IG9yIDxDT0RFPkxPTkdfTUlOPC9DT0RFPiAsIGFzCiAgICAgICAgIGFwcHJvcHJpYXRlIGZvciB0aGUgc2lnbiBvZiB0aGUgdmFsdWUuICBJdCBhbHNvIHNldHMgPENPREU+ZXJybm88L0NPREU+CiAgICAgICAgIHRvIDxDT0RFPkVSQU5HRTwvQ09ERT4gdG8gaW5kaWNhdGUgdGhlcmUgd2FzIG92ZXJmbG93LgogICAgICAgICA8YnI+PGJyPiBZb3Ugc2hvdWxkIG5vdCBjaGVjayBmb3IgZXJyb3JzIGJ5IGV4YW1pbmluZyB0aGUgcmV0dXJuIHZhbHVlIG9mCiAgICAgICAgIDxDT0RFPnN0cnRvbDwvQ09ERT4sIGJlY2F1c2UgdGhlIHN0cmluZyBtaWdodCBiZSBhIHZhbGlkIHJlcHJlc2VudGF0aW9uIG9mCiAgICAgICAgIDxDT0RFPjBsPC9DT0RFPiwgPENPREU+TE9OR19NQVg8L0NPREU+LCBvciA8Q09ERT5MT05HX01JTjwvQ09ERT4uICBJbnN0ZWFkLCBjaGVjayB3aGV0aGVyCiAgICAgICAgIDxWQVI+dGFpbHB0cjwvVkFSPiBwb2ludHMgdG8gd2hhdCB5b3UgZXhwZWN0IGFmdGVyIHRoZSBudW1iZXIKICAgICAgICAgKGUuZy4gPENPREU+J1wwJzwvQ09ERT4gaWYgdGhlIHN0cmluZyBzaG91bGQgZW5kIGFmdGVyIHRoZSBudW1iZXIpLiAgWW91IGFsc28KICAgICAgICAgbmVlZCB0byBjbGVhciA8VkFSPmVycm5vPC9WQVI+IGJlZm9yZSB0aGUgY2FsbCBhbmQgY2hlY2sgaXQgYWZ0ZXJ3YXJkLCBpbgogICAgICAgICBjYXNlIHRoZXJlIHdhcyBvdmVyZmxvdy4KICAgICAgICAgPGJyPjxicj4gVGhlcmUgaXMgYW4gZXhhbXBsZSBhdCB0aGUgZW5kIG9mIHRoaXMgc2VjdGlvbi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc3RkbGliLmh4cQB+G/R0AD5jb25zdCBjaGFyICpyZXN0cmljdCBzdHJpbmcsIGNoYXIgKipyZXN0cmljdCB0YWlscHRyLCBpbnQgYmFzZXQACGxvbmcgaW50dAAHc3RydG9sZHNxAH4ACnQCQQogICAgICAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUgYW5hbG9nb3VzIHRvIDxDT0RFPnN0cnRvZDwvQ09ERT4sIGJ1dCByZXR1cm4gPENPREU+ZmxvYXQ8L0NPREU+CiAgICAgICAgIGFuZCA8Q09ERT5sb25nIGRvdWJsZTwvQ09ERT4gdmFsdWVzIHJlc3BlY3RpdmVseS4gIFRoZXkgcmVwb3J0IGVycm9ycyBpbiB0aGUKICAgICAgICAgc2FtZSB3YXkgYXMgPENPREU+c3RydG9kPC9DT0RFPi4gIDxDT0RFPnN0cnRvZjwvQ09ERT4gY2FuIGJlIHN1YnN0YW50aWFsbHkgZmFzdGVyCiAgICAgICAgIHRoYW4gPENPREU+c3RydG9kPC9DT0RFPiwgYnV0IGhhcyBsZXNzIHByZWNpc2lvbjsgY29udmVyc2VseSwgPENPREU+c3RydG9sZDwvQ09ERT4KICAgICAgICAgY2FuIGJlIG11Y2ggc2xvd2VyIGJ1dCBoYXMgbW9yZSBwcmVjaXNpb24gKG9uIHN5c3RlbXMgd2hlcmUgPENPREU+bG9uZwogICAgICAgICBkb3VibGU8L0NPREU+IGlzIGEgc2VwYXJhdGUgdHlwZSkuCiAgICAgICAgIDxicj48YnI+IFRoZXNlIGZ1bmN0aW9ucyBoYXZlIGJlZW4gR05VIGV4dGVuc2lvbnMgYW5kIGFyZSBuZXcgdG8gSVNPIEM5OS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc3RkbGliLmh4cQB+G/t0ACJjb25zdCBjaGFyICpzdHJpbmcsIGNoYXIgKip0YWlscHRydAALbG9uZyBkb3VibGV0AAdzdHJ0b2xsc3EAfgAKdAKhCiAgICAgICAgVGhlIDxDT0RFPnN0cnRvbGw8L0NPREU+IGZ1bmN0aW9uIGlzIGxpa2UgPENPREU+c3RydG9sPC9DT0RFPiBleGNlcHQgdGhhdCBpdCByZXR1cm5zCiAgICAgICAgIGEgPENPREU+bG9uZyBsb25nIGludDwvQ09ERT4gdmFsdWUsIGFuZCBhY2NlcHRzIG51bWJlcnMgd2l0aCBhIGNvcnJlc3BvbmRpbmdseQogICAgICAgICBsYXJnZXIgcmFuZ2UuCiAgICAgICAgIDxicj48YnI+IElmIHRoZSBzdHJpbmcgaGFzIHZhbGlkIHN5bnRheCBmb3IgYW4gaW50ZWdlciBidXQgdGhlIHZhbHVlIGlzIG5vdAogICAgICAgICByZXByZXNlbnRhYmxlIGJlY2F1c2Ugb2Ygb3ZlcmZsb3csIDxDT0RFPnN0cnRvbGw8L0NPREU+IHJldHVybnMgZWl0aGVyCiAgICAgICAgIDxDT0RFPkxPTkdfTE9OR19NQVg8L0NPREU+IG9yIDxDT0RFPkxPTkdfTE9OR19NSU48L0NPREU+ICwgYXMKICAgICAgICAgYXBwcm9wcmlhdGUgZm9yIHRoZSBzaWduIG9mIHRoZSB2YWx1ZS4gIEl0IGFsc28gc2V0cyA8Q09ERT5lcnJubzwvQ09ERT4gdG8KICAgICAgICAgPENPREU+RVJBTkdFPC9DT0RFPiB0byBpbmRpY2F0ZSB0aGVyZSB3YXMgb3ZlcmZsb3cuCiAgICAgICAgIDxicj48YnI+IFRoZSA8Q09ERT5zdHJ0b2xsPC9DT0RFPiBmdW5jdGlvbiB3YXMgaW50cm9kdWNlZCBpbiBJU08gQzk5LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAhzdGRsaWIuaHhxAH4cAnQAPmNvbnN0IGNoYXIgKnJlc3RyaWN0IHN0cmluZywgY2hhciAqKnJlc3RyaWN0IHRhaWxwdHIsIGludCBiYXNldAANbG9uZyBsb25nIGludHQABnN0cnRvcXNxAH4ACnQAaQogICAgICAgIDxDT0RFPnN0cnRvcTwvQ09ERT4gKGBgc3RyaW5nLXRvLXF1YWQtd29yZCcnKSBpcyB0aGUgQlNEIG5hbWUgZm9yIDxDT0RFPnN0cnRvbGw8L0NPREU+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAhzdGRsaWIuaHhxAH4cCXQAPmNvbnN0IGNoYXIgKnJlc3RyaWN0IHN0cmluZywgY2hhciAqKnJlc3RyaWN0IHRhaWxwdHIsIGludCBiYXNldAANbG9uZyBsb25nIGludHQAB3N0cnRvdWxzcQB+AAp0A3wKICAgICAgICBUaGUgPENPREU+c3RydG91bDwvQ09ERT4gKGBgc3RyaW5nLXRvLXVuc2lnbmVkLWxvbmcnJykgZnVuY3Rpb24gaXMgbGlrZQogICAgICAgICA8Q09ERT5zdHJ0b2w8L0NPREU+IGV4Y2VwdCBpdCBjb252ZXJ0cyB0byBhbiA8Q09ERT51bnNpZ25lZCBsb25nIGludDwvQ09ERT4gdmFsdWUuCiAgICAgICAgIFRoZSBzeW50YXggaXMgdGhlIHNhbWUgYXMgZGVzY3JpYmVkIGFib3ZlIGZvciA8Q09ERT5zdHJ0b2w8L0NPREU+LiAgVGhlIHZhbHVlCiAgICAgICAgIHJldHVybmVkIG9uIG92ZXJmbG93IGlzIDxDT0RFPlVMT05HX01BWDwvQ09ERT4gLgogICAgICAgICA8YnI+PGJyPiBJZiA8VkFSPnN0cmluZzwvVkFSPiBkZXBpY3RzIGEgbmVnYXRpdmUgbnVtYmVyLCA8Q09ERT5zdHJ0b3VsPC9DT0RFPiBhY3RzIHRoZSBzYW1lCiAgICAgICAgIGFzIDxWQVI+c3RydG9sPC9WQVI+IGJ1dCBjYXN0cyB0aGUgcmVzdWx0IHRvIGFuIHVuc2lnbmVkIGludGVnZXIuICBUaGF0IG1lYW5zCiAgICAgICAgIGZvciBleGFtcGxlIHRoYXQgPENPREU+c3RydG91bDwvQ09ERT4gb24gPENPREU+Ii0xIjwvQ09ERT4gcmV0dXJucyA8Q09ERT5VTE9OR19NQVg8L0NPREU+CiAgICAgICAgIGFuZCBhbiBpbnB1dCBtb3JlIG5lZ2F0aXZlIHRoYW4gPENPREU+TE9OR19NSU48L0NPREU+IHJldHVybnMKICAgICAgICAgKDxDT0RFPlVMT05HX01BWDwvQ09ERT4gKyAxKSAvIDIuCiAgICAgICAgIDxicj48YnI+IDxDT0RFPnN0cnRvdWw8L0NPREU+IHNldHMgPFZBUj5lcnJubzwvVkFSPiB0byA8Q09ERT5FSU5WQUw8L0NPREU+IGlmIDxWQVI+YmFzZTwvVkFSPiBpcyBvdXQgb2YKICAgICAgICAgcmFuZ2UsIG9yIDxDT0RFPkVSQU5HRTwvQ09ERT4gb24gb3ZlcmZsb3cuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHN0ZGxpYi5oeHEAfhwQdAA9Y29uc3QgY2hhciAqcmV0cmljdCBzdHJpbmcsIGNoYXIgKipyZXN0cmljdCB0YWlscHRyLCBpbnQgYmFzZXQAEXVuc2lnbmVkIGxvbmcgaW50dAAIc3RydG91bGxzcQB+AAp0APUKICAgICAgICBUaGUgPENPREU+c3RydG91bGw8L0NPREU+IGZ1bmN0aW9uIGlzIHJlbGF0ZWQgdG8gPENPREU+c3RydG9sbDwvQ09ERT4gdGhlIHNhbWUgd2F5CiAgICAgICAgIDxDT0RFPnN0cnRvdWw8L0NPREU+IGlzIHJlbGF0ZWQgdG8gPENPREU+c3RydG9sPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gVGhlIDxDT0RFPnN0cnRvdWxsPC9DT0RFPiBmdW5jdGlvbiB3YXMgaW50cm9kdWNlZCBpbiBJU08gQzk5LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAhzdGRsaWIuaHhxAH4cF3QAPmNvbnN0IGNoYXIgKnJlc3RyaWN0IHN0cmluZywgY2hhciAqKnJlc3RyaWN0IHRhaWxwdHIsIGludCBiYXNldAAWdW5zaWduZWQgbG9uZyBsb25nIGludHQACXN0cnRvdW1heHNxAH4ACnQBSgogICAgICAgIFRoZSA8Q09ERT5zdHJ0b3VtYXg8L0NPREU+IGZ1bmN0aW9uIGlzIHJlbGF0ZWQgdG8gPENPREU+c3RydG9pbWF4PC9DT0RFPgogICAgICAgICB0aGUgc2FtZSB3YXkgdGhhdCA8Q09ERT5zdHJ0b3VsPC9DT0RFPiBpcyByZWxhdGVkIHRvIDxDT0RFPnN0cnRvbDwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IFNlZSBJbnRlZ2VycyBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgPENPREU+aW50bWF4X3Q8L0NPREU+IHR5cGUuICBUaGUKICAgICAgICAgPENPREU+c3RydG91bWF4PC9DT0RFPiBmdW5jdGlvbiB3YXMgaW50cm9kdWNlZCBpbiBJU08gQzk5LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAppbnR0eXBlcy5oeHEAfhwedAA+Y29uc3QgY2hhciAqcmVzdHJpY3Qgc3RyaW5nLCBjaGFyICoqcmVzdHJpY3QgdGFpbHB0ciwgaW50IGJhc2V0AAl1aW50bWF4X3R0AAdzdHJ0b3Vxc3EAfgAKdABRCiAgICAgICAgPENPREU+c3RydG91cTwvQ09ERT4gaXMgdGhlIEJTRCBuYW1lIGZvciA8Q09ERT5zdHJ0b3VsbDwvQ09ERT4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHN0ZGxpYi5oeHEAfhwldAA+Y29uc3QgY2hhciAqcmVzdHJpY3Qgc3RyaW5nLCBjaGFyICoqcmVzdHJpY3QgdGFpbHB0ciwgaW50IGJhc2V0ABZ1bnNpZ25lZCBsb25nIGxvbmcgaW50dAAKc3RydmVyc2NtcHNxAH4ACnQIyQogICAgICAgIFRoZSA8Q09ERT5zdHJ2ZXJzY21wPC9DT0RFPiBmdW5jdGlvbiBjb21wYXJlcyB0aGUgc3RyaW5nIDxWQVI+czE8L1ZBUj4gYWdhaW5zdAogICAgICAgICA8VkFSPnMyPC9WQVI+LCBjb25zaWRlcmluZyB0aGVtIGFzIGhvbGRpbmcgaW5kaWNlcy92ZXJzaW9uIG51bWJlcnMuICBSZXR1cm4KICAgICAgICAgdmFsdWUgZm9sbG93cyB0aGUgc2FtZSBjb252ZW50aW9ucyBhcyBmb3VuZCBpbiB0aGUgPENPREU+c3RydmVyc2NtcDwvQ09ERT4KICAgICAgICAgZnVuY3Rpb24uICBJbiBmYWN0LCBpZiA8VkFSPnMxPC9WQVI+IGFuZCA8VkFSPnMyPC9WQVI+IGNvbnRhaW4gbm8gZGlnaXRzLAogICAgICAgICA8Q09ERT5zdHJ2ZXJzY21wPC9DT0RFPiBiZWhhdmVzIGxpa2UgPENPREU+c3RyY21wPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gQmFzaWNhbGx5LCB3ZSBjb21wYXJlIHN0cmluZ3Mgbm9ybWFsbHkgKGNoYXJhY3RlciBieSBjaGFyYWN0ZXIpLCB1bnRpbAogICAgICAgICB3ZSBmaW5kIGEgZGlnaXQgaW4gZWFjaCBzdHJpbmcgLSB0aGVuIHdlIGVudGVyIGEgc3BlY2lhbCBjb21wYXJpc29uCiAgICAgICAgIG1vZGUsIHdoZXJlIGVhY2ggc2VxdWVuY2Ugb2YgZGlnaXRzIGlzIHRha2VuIGFzIGEgd2hvbGUuICBJZiB3ZSByZWFjaCB0aGUKICAgICAgICAgZW5kIG9mIHRoZXNlIHR3byBwYXJ0cyB3aXRob3V0IG5vdGljaW5nIGEgZGlmZmVyZW5jZSwgd2UgcmV0dXJuIHRvIHRoZQogICAgICAgICBzdGFuZGFyZCBjb21wYXJpc29uIG1vZGUuICBUaGVyZSBhcmUgdHdvIHR5cGVzIG9mIG51bWVyaWMgcGFydHM6CiAgICAgICAgICJpbnRlZ3JhbCIgYW5kICJmcmFjdGlvbmFsIiAodGhvc2UgIGJlZ2luIHdpdGggYSAnMCcpLiBUaGUgdHlwZXMKICAgICAgICAgb2YgdGhlIG51bWVyaWMgcGFydHMgYWZmZWN0IHRoZSB3YXkgd2Ugc29ydCB0aGVtOgogICAgICAgICA8YnI+PGJyPiA8T0w+CiAgICAgICAgIDxMST4KICAgICAgICAgaW50ZWdyYWwvaW50ZWdyYWw6IHdlIGNvbXBhcmUgdmFsdWVzIGFzIHlvdSB3b3VsZCBleHBlY3QuCiAgICAgICAgIDxicj48YnI+IDxMST4KICAgICAgICAgZnJhY3Rpb25hbC9pbnRlZ3JhbDogdGhlIGZyYWN0aW9uYWwgcGFydCBpcyBsZXNzIHRoYW4gdGhlIGludGVncmFsIG9uZS4KICAgICAgICAgQWdhaW4sIG5vIHN1cnByaXNlLgogICAgICAgICA8YnI+PGJyPiA8TEk+CiAgICAgICAgIGZyYWN0aW9uYWwvZnJhY3Rpb25hbDogdGhlIHRoaW5ncyBiZWNvbWUgYSBiaXQgbW9yZSBjb21wbGV4LgogICAgICAgICBJZiB0aGUgY29tbW9uIHByZWZpeCBjb250YWlucyBvbmx5IGxlYWRpbmcgemVyb2VzLCB0aGUgbG9uZ2VzdCBwYXJ0IGlzIGxlc3MKICAgICAgICAgdGhhbiB0aGUgb3RoZXIgb25lOyBlbHNlIHRoZSBjb21wYXJpc29uIGJlaGF2ZXMgbm9ybWFsbHkuCiAgICAgICAgIDwvT0w+CiAgICAgICAgIDxicj48YnI+IDxwcmU+PGJyPgogICAgICAgICBzdHJ2ZXJzY21wICgibm8gZGlnaXQiLCAibm8gZGlnaXQiKTxicj4KICAgICAgICAgICAgICAwICAgIC8qIHNhbWUgYmVoYXZpb3IgYXMgc3RyY21wLiAqLzxicj4KICAgICAgICAgc3RydmVyc2NtcCAoIml0ZW0jOTkiLCAiaXRlbSMxMDAiKTxicj4KICAgICAgICAgICAgICA8MCAgIC8qIHNhbWUgcHJlZml4LCBidXQgOTkgPCAxMDAuICovPGJyPgogICAgICAgICBzdHJ2ZXJzY21wICgiYWxwaGExIiwgImFscGhhMDAxIik8YnI+CiAgICAgICAgICAgICAgPjAgICAvKiBmcmFjdGlvbmFsIHBhcnQgaW5mZXJpb3IgdG8gaW50ZWdyYWwgb25lLiAqLzxicj4KICAgICAgICAgc3RydmVyc2NtcCAoInBhcnQxX2YwMTIiLCAicGFydDFfZjAxIik8YnI+CiAgICAgICAgICAgICAgPjAgICAvKiB0d28gZnJhY3Rpb25hbCBwYXJ0cy4gKi88YnI+CiAgICAgICAgIHN0cnZlcnNjbXAgKCJmb28uMDA5IiwgImZvby4wIik8YnI+CiAgICAgICAgICAgICAgPDAgICAvKiBpZGVtLCBidXQgd2l0aCBsZWFkaW5nIHplcm9lcyBvbmx5LiAqLzxicj4KICAgICAgICAgPC9wcmU+CiAgICAgICAgIDxicj48YnI+IFRoaXMgZnVuY3Rpb24gaXMgZXNwZWNpYWxseSB1c2VmdWwgd2hlbiBkZWFsaW5nIHdpdGggZmlsZW5hbWUgc29ydGluZywKICAgICAgICAgYmVjYXVzZSBmaWxlbmFtZXMgZnJlcXVlbnRseSBob2xkIGluZGljZXMvdmVyc2lvbiBudW1iZXJzLgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5zdHJ2ZXJzY21wPC9DT0RFPiBpcyBhIEdOVSBleHRlbnNpb24uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHN0cmluZy5oeHEAfhwsdAAeY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMydAADaW50dAAHc3RyeGZybXNxAH4ACnQGGgogICAgICAgIFRoZSBmdW5jdGlvbiA8Q09ERT5zdHJ4ZnJtPC9DT0RFPiB0cmFuc2Zvcm1zIHRoZSBzdHJpbmcgPFZBUj5mcm9tPC9WQVI+IHVzaW5nIHRoZQogICAgICAgICBjb2xsYXRpb24gdHJhbnNmb3JtYXRpb24gZGV0ZXJtaW5lZCBieSB0aGUgbG9jYWxlIGN1cnJlbnRseSBzZWxlY3RlZCBmb3IKICAgICAgICAgY29sbGF0aW9uLCBhbmQgc3RvcmVzIHRoZSB0cmFuc2Zvcm1lZCBzdHJpbmcgaW4gdGhlIGFycmF5IDxWQVI+dG88L1ZBUj4uICBVcAogICAgICAgICB0byA8VkFSPnNpemU8L1ZBUj4gY2hhcmFjdGVycyAoaW5jbHVkaW5nIGEgdGVybWluYXRpbmcgbnVsbCBjaGFyYWN0ZXIpIGFyZQogICAgICAgICBzdG9yZWQuCiAgICAgICAgIDxicj48YnI+IFRoZSBiZWhhdmlvciBpcyB1bmRlZmluZWQgaWYgdGhlIHN0cmluZ3MgPFZBUj50bzwvVkFSPiBhbmQgPFZBUj5mcm9tPC9WQVI+CiAgICAgICAgIG92ZXJsYXA7IHNlZSBDb3B5aW5nIGFuZCBDb25jYXRlbmF0aW9uLgogICAgICAgICA8YnI+PGJyPiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBsZW5ndGggb2YgdGhlIGVudGlyZSB0cmFuc2Zvcm1lZCBzdHJpbmcuICBUaGlzCiAgICAgICAgIHZhbHVlIGlzIG5vdCBhZmZlY3RlZCBieSB0aGUgdmFsdWUgb2YgPFZBUj5zaXplPC9WQVI+LCBidXQgaWYgaXQgaXMgZ3JlYXRlcgogICAgICAgICBvciBlcXVhbCB0aGFuIDxWQVI+c2l6ZTwvVkFSPiwgaXQgbWVhbnMgdGhhdCB0aGUgdHJhbnNmb3JtZWQgc3RyaW5nIGRpZCBub3QKICAgICAgICAgZW50aXJlbHkgZml0IGluIHRoZSBhcnJheSA8VkFSPnRvPC9WQVI+LiAgSW4gdGhpcyBjYXNlLCBvbmx5IGFzIG11Y2ggb2YgdGhlCiAgICAgICAgIHN0cmluZyBhcyBhY3R1YWxseSBmaXRzIHdhcyBzdG9yZWQuICBUbyBnZXQgdGhlIHdob2xlIHRyYW5zZm9ybWVkCiAgICAgICAgIHN0cmluZywgY2FsbCA8Q09ERT5zdHJ4ZnJtPC9DT0RFPiBhZ2FpbiB3aXRoIGEgYmlnZ2VyIG91dHB1dCBhcnJheS4KICAgICAgICAgPGJyPjxicj4gVGhlIHRyYW5zZm9ybWVkIHN0cmluZyBtYXkgYmUgbG9uZ2VyIHRoYW4gdGhlIG9yaWdpbmFsIHN0cmluZywgYW5kIGl0CiAgICAgICAgIG1heSBhbHNvIGJlIHNob3J0ZXIuCiAgICAgICAgIDxicj48YnI+IElmIDxWQVI+c2l6ZTwvVkFSPiBpcyB6ZXJvLCBubyBjaGFyYWN0ZXJzIGFyZSBzdG9yZWQgaW4gPFZBUj50bzwvVkFSPi4gIEluIHRoaXMKICAgICAgICAgY2FzZSwgPENPREU+c3RyeGZybTwvQ09ERT4gc2ltcGx5IHJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgd291bGQKICAgICAgICAgYmUgdGhlIGxlbmd0aCBvZiB0aGUgdHJhbnNmb3JtZWQgc3RyaW5nLiAgVGhpcyBpcyB1c2VmdWwgZm9yIGRldGVybWluaW5nCiAgICAgICAgIHdoYXQgc2l6ZSB0aGUgYWxsb2NhdGVkIGFycmF5IHNob3VsZCBiZS4gIEl0IGRvZXMgbm90IG1hdHRlciB3aGF0CiAgICAgICAgIDxWQVI+dG88L1ZBUj4gaXMgaWYgPFZBUj5zaXplPC9WQVI+IGlzIHplcm87IDxWQVI+dG88L1ZBUj4gbWF5IGV2ZW4gYmUgYSBudWxsIHBvaW50ZXIuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHN0cmluZy5oeHEAfhwzdAA5Y2hhciAqcmVzdHJpY3QgdG8sIGNvbnN0IGNoYXIgKnJlc3RyaWN0IGZyb20sIHNpemVfdCBzaXpldAAGc2l6ZV90dAAEc3R0eXNxAH4ACnQBBgogICAgICAgIDxicj48YnI+IFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgYXR0cmlidXRlcyBvZiBhIHRlcm1pbmFsLgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5zdHR5PC9DT0RFPiBzZXRzIHRoZSB0ZXJtaW5hbCBhdHRyaWJ1dGVzIG9mIHRoZSB0ZXJtaW5hbCB3aGljaCBpcyBvcGVuIHdpdGgKICAgICAgICAgZmlsZSBkZXNjcmlwdG9yIDxWQVI+ZmlsZWRlczwvVkFSPiB0byB0aG9zZSBkZXNjcmliZWQgYnkgKjxWQVI+ZmlsZWRlczwvVkFSPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHc2d0dHkuaHhxAH4cOnQAJ2ludCBmaWxlZGVzLCBzdHJ1Y3Qgc2d0dHliICogYXR0cmlidXRlc3QAA2ludHQAC3N3YXBjb250ZXh0c3EAfgAKdAOECiAgICAgICAgPGJyPjxicj4gVGhlIDxDT0RFPnN3YXBjb250ZXh0PC9DT0RFPiBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIDxDT0RFPnNldGNvbnRleHQ8L0NPREU+IGJ1dAogICAgICAgICBpbnN0ZWFkIG9mIGp1c3QgcmVwbGFjaW5nIHRoZSBjdXJyZW50IGNvbnRleHQgdGhlIGxhdHRlciBpcyBmaXJzdCBzYXZlZAogICAgICAgICBpbiB0aGUgb2JqZWN0IHBvaW50ZWQgdG8gYnkgPFZBUj5vdWNwPC9WQVI+IGFzIGlmIHRoaXMgd2FzIGEgY2FsbCB0bwogICAgICAgICA8Q09ERT5nZXRjb250ZXh0PC9DT0RFPi4gIFRoZSBzYXZlZCBjb250ZXh0IHdvdWxkIHJlc3VtZSBhZnRlciB0aGUgY2FsbCB0bwogICAgICAgICA8Q09ERT5zd2FwY29udGV4dDwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IE9uY2UgdGhlIGN1cnJlbnQgY29udGV4dCBpcyBzYXZlZCB0aGUgY29udGV4dCBkZXNjcmliZWQgaW4gPFZBUj51Y3A8L1ZBUj4gaXMKICAgICAgICAgaW5zdGFsbGVkIGFuZCBleGVjdXRpb24gY29udGludWVzIGFzIGRlc2NyaWJlZCBpbiB0aGlzIGNvbnRleHQuCiAgICAgICAgIDxicj48YnI+IElmIDxDT0RFPnN3YXBjb250ZXh0PC9DT0RFPiBzdWNjZWVkcyB0aGUgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIHVubGVzcyB0aGUKICAgICAgICAgY29udGV4dCA8VkFSPm91Y3A8L1ZBUj4gaXMgdXNlZCB3aXRob3V0IHByaW9yIG1vZGlmaWNhdGlvbiBieQogICAgICAgICA8Q09ERT5tYWtlY29udGV4dDwvQ09ERT4uICBUaGUgcmV0dXJuIHZhbHVlIGluIHRoaXMgY2FzZSBpcyA8Q09ERT4wPC9DT0RFPi4gIElmIHRoZQogICAgICAgICBmdW5jdGlvbiBmYWlscyBpdCByZXR1cm5zIDxDT0RFPi0xPC9DT0RFPiBhbmQgc2V0IDxWQVI+ZXJybm88L1ZBUj4gYWNjb3JkaW5nbHkuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACnVjb250ZXh0Lmh4cQB+HEF0ADl1Y29udGV4dF90ICpyZXN0cmljdCBvdWNwLCBjb25zdCB1Y29udGV4dF90ICpyZXN0cmljdCB1Y3B0AANpbnR0AAhzd3ByaW50ZnNxAH4ACnQFMgogICAgICAgIFRoaXMgaXMgbGlrZSA8Q09ERT53cHJpbnRmPC9DT0RFPiwgZXhjZXB0IHRoYXQgdGhlIG91dHB1dCBpcyBzdG9yZWQgaW4gdGhlCiAgICAgICAgIHdpZGUgY2hhcmFjdGVyIGFycmF5IDxWQVI+d3M8L1ZBUj4gaW5zdGVhZCBvZiB3cml0dGVuIHRvIGEgc3RyZWFtLiAgQSBudWxsCiAgICAgICAgIHdpZGUgY2hhcmFjdGVyIGlzIHdyaXR0ZW4gdG8gbWFyayB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuICBUaGUgPFZBUj5zaXplPC9WQVI+CiAgICAgICAgIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBwcm9kdWNlLiAgVGhlCiAgICAgICAgIHRyYWlsaW5nIG51bGwgY2hhcmFjdGVyIGlzIGNvdW50ZWQgdG93YXJkcyB0aGlzIGxpbWl0LCBzbyB5b3Ugc2hvdWxkCiAgICAgICAgIGFsbG9jYXRlIGF0IGxlYXN0IDxWQVI+c2l6ZTwvVkFSPiB3aWRlIGNoYXJhY3RlcnMgZm9yIHRoZSBzdHJpbmcgPFZBUj53czwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZ2VuZXJhdGVkIGZvciB0aGUgZ2l2ZW4KICAgICAgICAgaW5wdXQsIGV4Y2x1ZGluZyB0aGUgdHJhaWxpbmcgbnVsbC4gIElmIG5vdCBhbGwgb3V0cHV0IGZpdHMgaW50byB0aGUKICAgICAgICAgcHJvdmlkZWQgYnVmZmVyIGEgbmVnYXRpdmUgdmFsdWUgaXMgcmV0dXJuZWQuICBZb3Ugc2hvdWxkIHRyeSBhZ2FpbiB3aXRoCiAgICAgICAgIGEgYmlnZ2VyIG91dHB1dCBzdHJpbmcuICA8RU0+Tm90ZTo8L0VNPiB0aGlzIGlzIGRpZmZlcmVudCBmcm9tIGhvdwogICAgICAgICA8Q09ERT5zbnByaW50ZjwvQ09ERT4gaGFuZGxlcyB0aGlzIHNpdHVhdGlvbi4KICAgICAgICAgPGJyPjxicj4gTm90ZSB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIG5hcnJvdyBzdHJlYW0gZnVuY3Rpb24gdGFrZXMgZmV3ZXIKICAgICAgICAgcGFyYW1ldGVycy4gIDxDT0RFPnN3cHJpbnRmPC9DT0RFPiBpbiBmYWN0IGNvcnJlc3BvbmRzIHRvIHRoZSA8Q09ERT5zbnByaW50ZjwvQ09ERT4KICAgICAgICAgZnVuY3Rpb24uICBTaW5jZSB0aGUgPENPREU+c3ByaW50ZjwvQ09ERT4gZnVuY3Rpb24gY2FuIGJlIGRhbmdlcm91cyBhbmQgc2hvdWxkCiAgICAgICAgIGJlIGF2b2lkZWQgdGhlIElTTyBDIGNvbW1pdHRlZSByZWZ1c2VkIHRvIG1ha2UgdGhlIHNhbWUgbWlzdGFrZQogICAgICAgICBhZ2FpbiBhbmQgZGVjaWRlZCB0byBub3QgZGVmaW5lIGFuIGZ1bmN0aW9uIGV4YWN0bHkgY29ycmVzcG9uZGluZyB0bwogICAgICAgICA8Q09ERT5zcHJpbnRmPC9DT0RFPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHd2NoYXIuaHhxAH4cSHQANXdjaGFyX3QgKnMsIHNpemVfdCBzaXplLCBjb25zdCB3Y2hhcl90ICp0ZW1wbGF0ZSwgLi4udAADaW50dAAHc3dzY2FuZnNxAH4ACnQCMgogICAgICAgIFRoaXMgaXMgbGlrZSA8Q09ERT53c2NhbmY8L0NPREU+LCBleGNlcHQgdGhhdCB0aGUgY2hhcmFjdGVycyBhcmUgdGFrZW4gZnJvbSB0aGUKICAgICAgICAgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyA8VkFSPndzPC9WQVI+IGluc3RlYWQgb2YgZnJvbSBhIHN0cmVhbS4gIFJlYWNoaW5nIHRoZQogICAgICAgICBlbmQgb2YgdGhlIHN0cmluZyBpcyB0cmVhdGVkIGFzIGFuIGVuZC1vZi1maWxlIGNvbmRpdGlvbi4KICAgICAgICAgPGJyPjxicj4gVGhlIGJlaGF2aW9yIG9mIHRoaXMgZnVuY3Rpb24gaXMgdW5kZWZpbmVkIGlmIGNvcHlpbmcgdGFrZXMgcGxhY2UKICAgICAgICAgYmV0d2VlbiBvYmplY3RzIHRoYXQgb3ZlcmxhcC0tLWZvciBleGFtcGxlLCBpZiA8VkFSPndzPC9WQVI+IGlzIGFsc28gZ2l2ZW4gYXMKICAgICAgICAgYW4gYXJndW1lbnQgdG8gcmVjZWl2ZSBhIHN0cmluZyByZWFkIHVuZGVyIGNvbnRyb2wgb2YgdGhlIDxzYW1wPiVzPC9zYW1wPiwKICAgICAgICAgPHNhbXA+JVM8L3NhbXA+LCBvciA8c2FtcD4lWzwvc2FtcD4gY29udmVyc2lvbi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHd2NoYXIuaHhxAH4cT3QALGNvbnN0IHdjaGFyX3QgKndzLCBjb25zdCBjaGFyICp0ZW1wbGF0ZSwgLi4udAADaW50dAAHc3ltbGlua3NxAH4ACnQDhgogICAgICAgIFRoZSA8Q09ERT5zeW1saW5rPC9DT0RFPiBmdW5jdGlvbiBtYWtlcyBhIHN5bWJvbGljIGxpbmsgdG8gPFZBUj5vbGRuYW1lPC9WQVI+IG5hbWVkCiAgICAgICAgIDxWQVI+bmV3bmFtZTwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gVGhlIG5vcm1hbCByZXR1cm4gdmFsdWUgZnJvbSA8Q09ERT5zeW1saW5rPC9DT0RFPiBpcyA8Q09ERT4wPC9DT0RFPi4gIEEgcmV0dXJuIHZhbHVlCiAgICAgICAgIG9mIDxDT0RFPi0xPC9DT0RFPiBpbmRpY2F0ZXMgYW4gZXJyb3IuICBJbiBhZGRpdGlvbiB0byB0aGUgdXN1YWwgZmlsZSBuYW1lCiAgICAgICAgIHN5bnRheCBlcnJvcnMgLCB0aGUgZm9sbG93aW5nIDxDT0RFPmVycm5vPC9DT0RFPgogICAgICAgICBlcnJvciBjb25kaXRpb25z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aWdub3JlZC4KICAgICAgICAgPGJyPjxicj4gVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgcmV0dXJuIHZhbHVlIGZyb20gdGhlIHN5c3RlbSBjYWxsLCB1bmxlc3MgdGhlCiAgICAgICAgIHN5c3RlbSBjYWxsIGZhaWxlZC4gIEluIHRoYXQgY2FzZSwgPENPREU+c3lzY2FsbDwvQ09ERT4gcmV0dXJucyA8Q09ERT4tMTwvQ09ERT4gYW5kCiAgICAgICAgIHNldHMgPENPREU+ZXJybm88L0NPREU+IHRvIGFuIGVycm9yIGNvZGUgdGhhdCB0aGUgc3lzdGVtIGNhbGwgcmV0dXJuZWQuICBOb3RlCiAgICAgICAgIHRoYXQgc3lzdGVtIGNhbGxzIGRvIG5vdCByZXR1cm4gPENPREU+LTE8L0NPREU+IHdoZW4gdGhleSBzdWNjZWVkLgoKICAgICAgICAgPGJyPjxicj4gSWYgeW91IHNwZWNpZnkgYW4gaW52YWxpZCA8VkFSPnN5c25vPC9WQVI+LCA8Q09ERT5zeXNjYWxsPC9DT0RFPiByZXR1cm5zIDxDT0RFPi0xPC9DT0RFPgogICAgICAgICB3aXRoIDxDT0RFPmVycm5vPC9DT0RFPiA9IDxDT0RFPkVOT1NZUzwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IEV4YW1wbGU6CiAgICAgICAgIDxicj48YnI+IDxwcmU+PGJyPgogICAgICAgICA8YnI+PGJyPiAjaW5jbHVkZSA8dW5pc3RkLmg+PGJyPgogICAgICAgICAjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD48YnI+CiAgICAgICAgICNpbmNsdWRlIDxlcnJuby5oPjxicj4KICAgICAgICAgPGJyPjxicj4gPHNtYWxsPi4uLjwvc21hbGw+PGJyPgogICAgICAgICA8YnI+PGJyPiBpbnQgcmM7PGJyPgogICAgICAgICA8YnI+PGJyPiByYyA9IHN5c2NhbGwoU1lTX2NobW9kLCAiL2V0Yy9wYXNzd2QiLCAwNDQ0KTs8YnI+CiAgICAgICAgIDxicj48YnI+IGlmIChyYyA9PSAtMSk8YnI+CiAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY2htb2QgZmFpbGVk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ICA8TEk+IG1heGltdW0gbnVtYmVyIG9mIGZpbGVzIHRoYXQgbWF5IGJlIG9wZW4KICAgICAgICAgPExJPiByb290IGZpbGVzeXN0ZW0gZGV2aWNlCiAgICAgICAgIDxMST4gd2hlbiBrZXJuZWwgd2FzIGJ1aWx0CiAgICAgICAgIDwvT0w+CiAgICAgICAgIDxicj48YnI+IFRoZSBzZXQgb2YgYXZhaWxhYmxlIHBhcmFtZXRlcnMgZGVwZW5kcyBvbiB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24gYW5kCiAgICAgICAgIGNhbiBjaGFuZ2Ugd2hpbGUgdGhlIHN5c3RlbSBpcyBydW5uaW5nLCBwYXJ0aWN1bGFybHkgd2hlbiB5b3UgbG9hZCBhbmQKICAgICAgICAgdW5sb2FkIGxvYWRhYmxlIGtlcm5lbCBtb2R1bGVzLgogICAgICAgICA8YnI+PGJyPiBUaGUgc3lzdGVtIHBhcmFtZXRlcnMgd2l0aCB3aGljaCA8Q09ERT5zeXNsb2c8L0NPREU+IGlzIGNvbmNlcm5lZCBhcmUgYXJyYW5nZWQKICAgICAgICAgaW4gYSBoaWVyYXJjaGljYWwgc3RydWN0dXJlIGxpa2UgYSBoaWVyYXJjaGljYWwgZmlsZXN5c3RlbS4gIFRvIGlkZW50aWZ5CiAgICAgICAgIGEgcGFydGljdWxhciBwYXJhbWV0ZXIsIHlvdSBzcGVjaWZ5IGEgcGF0aCB0aHJvdWdoIHRoZSBzdHJ1Y3R1cmUgaW4gYQogICAgICAgICB3YXkgYW5hbG9nb3VzIHRvIHNwZWNpZnlpbmcgdGhlIHBhdGhuYW1lIG9mIGEgZmlsZS4gIEVhY2ggY29tcG9uZW50IG9mCiAgICAgICAgIHRoZSBwYXRoIGlzIHNwZWNpZmllZCBieSBhbiBpbnRlZ2VyIGFuZCBlYWNoIG9mIHRoZXNlIGludGVnZXJzIGhhcyBhCiAgICAgICAgIG1hY3JvIGRlZmluZWQgZm9yIGl0IGJ5IDxUVD5zeXNjdGwuaDwvVFQ+LiAgPFZBUj5uYW1lczwvVkFSPiBpcyB0aGUgcGF0aCwgaW4KICAgICAgICAgdGhlIGZvcm0gb2YgYW4gYXJyYXkgb2YgaW50ZWdlcnMuICBFYWNoIGNvbXBvbmVudCBvZiB0aGUgcGF0aCBpcyBvbmUKICAgICAgICAgZWxlbWVudCBvZiB0aGUgYXJyYXksIGluIG9yZGVyLiAgPFZBUj5ubGVuPC9WQVI+IGlzIHRoZSBudW1iZXIgb2YgY29tcG9uZW50cwogICAgICAgICBpbiB0aGUgcGF0aC4KICAgICAgICAgPGJyPjxicj4gRm9yIGV4YW1wbGUsIHRoZSBmaXJzdCBjb21wb25lbnQgb2YgdGhlIHBhdGggZm9yIGFsbCB0aGUgcGFnaW5nCiAgICAgICAgIHBhcmFtZXRlcnMgaXMgdGhlIHZhbHVlIDxDT0RFPkNUTF9WTTwvQ09ERT4uICBGb3IgdGhlIGZyZWUgcGFnZSB0aHJlc2hvbGRzLCB0aGUKICAgICAgICAgc2Vjb25kIGNvbXBvbmVudCBvZiB0aGUgcGF0aCBpcyA8Q09ERT5WTV9GUkVFUEc8L0NPREU+LiAgU28gdG8gZ2V0IHRoZSBmcmVlCiAgICAgICAgIHBhZ2UgdGhyZXNob2xkIHZhbHVlcywgbWFrZSA8VkFSPm5hbWVzPC9WQVI+IGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHR3bwogICAgICAgICBlbGVtZW50cyA8Q09ERT5DVExfVk08L0NPREU+IGFuZCA8Q09ERT5WTV9GUkVFUEc8L0NPREU+IGFuZCBtYWtlIDxWQVI+bmxlbjwvVkFSPiA9IDIuCiAgICAgICAgIDxicj48YnI+IDxicj48YnI+IFRoZSBmb3JtYXQgb2YgdGhlIHZhbHVlIG9mIGEgcGFyYW1ldGVyIGRlcGVuZHMgb24gdGhlIHBhcmFtZXRlci4KICAgICAgICAgU29tZXRpbWVzIGl0IGlzIGFuIGludGVnZXI7IHNvbWV0aW1lcyBpdCBpcyBhbiBBU0NJSSBzdHJpbmc7IHNvbWV0aW1lcwogICAgICAgICBpdCBpcyBhbiBlbGFib3JhdGUgc3RydWN0dXJlLiAgSW4gdGhlIGNhc2Ugb2YgdGhlIGZyZWUgcGFnZSB0aHJlc2hvbGRzCiAgICAgICAgIHVzZWQgaW4gdGhlIGV4YW1wbGUgYWJvdmUsIHRoZSBwYXJhbWV0ZXIgdmFsdWUgaXMgYSBzdHJ1Y3R1cmUgY29udGFpbmluZwogICAgICAgICBzZXZlcmFsIGludGVnZXJzLgogICAgICAgICA8YnI+PGJyPiBJbiBhbnkgY2FzZSwgeW91IGlkZW50aWZ5IGEgcGxhY2UgdG8gcmV0dXJuIHRoZSBwYXJhbWV0ZXIncyB2YWx1ZSB3aXRoCiAgICAgICAgIDxWQVI+b2xkdmFsPC9WQVI+IGFuZCBzcGVjaWZ5IHRoZSBhbW91bnQgb2Ygc3RvcmFnZSBhdmFpbGFibGUgYXQgdGhhdAogICAgICAgICBsb2NhdGlvbiBhcyAqPFZBUj5vbGRsZW5wPC9WQVI+LiAgKjxWQVI+b2xkbGVucDwvVkFSPiBkb2VzIGRvdWJsZSBkdXR5IGJlY2F1c2UgaXQKICAgICAgICAgaXMgYWxzbyB0aGUgb3V0cHV0IGxvY2F0aW9uIHRoYXQgY29udGFpbnMgdGhlIGFjdHVhbCBsZW5ndGggb2YgdGhlCiAgICAgICAgIHJldHVybmVkIHZhbHVlLgogICAgICAgICA8YnI+PGJyPiBJZiB5b3UgZG9uJ3Qgd2FudCB0aGUgcGFyYW1ldGVyIHZhbHVlIHJldHVybmVkLCBzcGVjaWZ5IGEgbnVsbCBwb2ludGVyCiAgICAgICAgIGZvciA8VkFSPm9sZHZhbDwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gVG8gc2V0IHRoZSBwYXJhbWV0ZXIsIHNwZWNpZnkgdGhlIGFkZHJlc3MgYW5kIGxlbmd0aCBvZiB0aGUgbmV3IHZhbHVlCiAgICAgICAgIGFzIDxWQVI+bmV3dmFsPC9WQVI+IGFuZCA8VkFSPm5ld2xlbjwvVkFSPi4gIElmIHlvdSBkb24ndCB3YW50IHRvIHNldCB0aGUgcGFyYW1ldGVyLAogICAgICAgICBzcGVjaWZ5IGEgbnVsbCBwb2ludGVyIGFzIDxWQVI+bmV3dmFsPC9WQVI+LgogICAgICAgICA8YnI+PGJyPiBJZiB5b3UgZ2V0IGFuZCBzZXQgYSBwYXJhbWV0ZXIgaW4gdGhlIHNhbWUgPENPREU+c3lzY3RsPC9DT0RFPiBjYWxsLCB0aGUgdmFsdWUKICAgICAgICAgcmV0dXJuZWQgaXMgdGhlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIgYmVmb3JlIGl0IHdhcyBzZXQuCiAgICAgICAgIDxicj48YnI+IEVhY2ggc3lzdGVtIHBhcmFtZXRlciBoYXMgYSBzZXQgb2YgcGVybWlzc2lvbnMgc2ltaWxhciB0byB0aGUKICAgICAgICAgcGVybWlzc2lvbnMgZm9yIGEgZmlsZSAoaW5jbHVkaW5nIHRoZSBwZXJtaXNzaW9ucyBvbiBkaXJlY3RvcmllcyBpbiBpdHMKICAgICAgICAgcGF0aCkgdGhhdCBkZXRlcm1pbmUgd2hldGhlciB5b3UgbWF5IGdldCBvciBzZXQgaXQuICBGb3IgdGhlIHB1cnBvc2VzIG9mCiAgICAgICAgIHRoZXNlIHBlcm1pc3Npb25zLCBldmVyeSBwYXJhbWV0ZXIgaXMgY29uc2lkZXJlZCB0byBiZSBvd25lZCBieSB0aGUKICAgICAgICAgc3VwZXJ1c2VyIGFuZCBHcm91cCAwIHNvIHByb2Nlc3NlcyB3aXRoIHRoYXQgZWZmZWN0aXZlIHVpZCBvciBnaWQgbWF5CiAgICAgICAgIGhhdmUgbW9yZSBhY2Nlc3MgdG8gc3lzdGVtIHBhcmFtZXRlcnMuICBVbmxpa2Ugd2l0aCBmaWxlcywgdGhlIHN1cGVydXNlcgogICAgICAgICBkb2VzIG5vdCBpbnZhcmlhYmx5IGhhdmUgZnVsbCBwZXJtaXNzaW9uIHRvIGFsbCBzeXN0ZW0gcGFyYW1ldGVycywgYmVjYXVzZQogICAgICAgICBzb21lIG9mIHRoZW0gYXJlIGRlc2lnbmVkIG5vdCB0byBiZSBjaGFuZ2VkIGV2ZXIuCiAgICAgICAgIDxicj48YnI+IDxicj48YnI+IDxDT0RFPnN5c2N0bDwvQ09ERT4gcmV0dXJucyBhIHplcm8gcmV0dXJuIHZhbHVlIGlmIGl0IHN1Y2NlZWRzLiAgT3RoZXJ3aXNlLCBpdAogICAgICAgICByZXR1cm5zIDxDT0RFPi0xPC9DT0RFPiBhbmQgc2V0cyA8Q09ERT5lcnJubzwvQ09ERT4gYXBwcm9wcmlhdGVseS4gIEJlc2lkZXMgdGhlCiAgICAgICAgIGZhaWx1cmVzIHRoYXQgYXBwbHkgdG8gYWxsIHN5c3RlbSBjYWxscywgdGhlIGZvbGxvd2luZyBhcmUgdGhlCiAgICAgICAgIDxDT0RFPmVycm5vPC9DT0RFPiBjb2RlcyBmb3IgYWxsIHBvc3NpYmxlIGZhaWx1cmVzOgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8RFQ+PENPREU+RVBFUk08L0NPREU+CjxERD4KICAgICAgICAgVGhlIHByb2Nlc3MgaXMgbm90IHBlcm1pdHRlZCB0byBhY2Nlc3Mgb25lIG9mIHRoZSBjb21wb25lbnRzIG9mIHRoZQogICAgICAgICBwYXRoIG9mIHRoZSBzeXN0ZW0gcGFyYW1ldGVyIG9yIGlzIG5vdCBwZXJtaXR0ZWQgdG8gYWNjZXNzIHRoZSBzeXN0ZW0gcGFyYW1ldGVyCiAgICAgICAgIGl0c2VsZiBpbiB0aGUgd2F5IChyZWFkIG9yIHdyaXRlKSB0aGF0IGl0IHJlcXVlc3RlZC4KICAgICAgICAgPExJPiBFTk9URElSCiAgICAgICAgIFRoZXJlIGlzIG5vIHN5c3RlbSBwYXJhbWV0ZXIgY29ycmVzcG9uZGluZyB0byA8VkFSPm5hbWU8L1ZBUj4uCiAgICAgICAgIDxMST4gRUZBVUxUCiAgICAgICAgIDxWQVI+b2xkdmFsPC9WQVI+IGlzIG5vdCBudWxsLCB3aGljaCBtZWFucyB0aGUgcHJvY2VzcyB3YW50ZWQgdG8gcmVhZCB0aGUgcGFyYW1ldGVyLAogICAgICAgICBidXQgKjxWQVI+b2xkbGVucDwvVkFSPiBpcyB6ZXJvLCBzbyB0aGVyZSBpcyBubyBwbGFjZSB0byByZXR1cm4gaXQuCiAgICAgICAgIDxMST4gRUlOVkFMCiAgICAgICAgIDxPTD4KICAgICAgICAgPExJPgogICAgICAgICBUaGUgcHJvY2VzcyBhdHRlbXB0ZWQgdG8gc2V0IGEgc3lzdGVtIHBhcmFtZXRlciB0byBhIHZhbHVlIHRoYXQgaXMgbm90IHZhbGlkCiAgICAgICAgIGZvciB0aGF0IHBhcmFtZXRlci4KICAgICAgICAgPExJPgogICAgICAgICBUaGUgc3BhY2UgcHJvdmlkZWQgZm9yIHRoZSByZXR1cm4gb2YgdGhlIHN5c3RlbSBwYXJhbWV0ZXIgaXMgbm90IHRoZSByaWdodAogICAgICAgICBzaXplIGZvciB0aGF0IHBhcmFtZXRlci4KICAgICAgICAgPC9PTD4KICAgICAgICAgPExJPiBFTk9NRU0KICAgICAgICAgVGhpcyB2YWx1ZSBtYXkgYmUgcmV0dXJuZWQgaW5zdGVhZCBvZiB0aGUgbW9yZSBjb3JyZWN0IDxDT0RFPkVJTlZBTDwvQ09ERT4gaW4gc29tZQogICAgICAgICBjYXNlcyB3aGVyZSB0aGUgc3BhY2UgcHJvdmlkZWQgZm9yIHRoZSByZXR1cm4gb2YgdGhlIHN5c3RlbSBwYXJhbWV0ZXIgaXMgdG9vCiAgICAgICAgIHNtYWxsLgogICAgICAgICA8YnI+PGJyPgogICAgICAgICA8YnI+PGJyPgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAhzeXNjdGwuaHhxAH4cdHQAUGludCAqbmFtZXMsIGludCBubGVuLCB2b2lkICpvbGR2YWwsIHNpemVfdCAqb2xkbGVucCwgdm9pZCAqbmV3dmFsLCBzaXplX3QgbmV3bGVudAADaW50dAAGc3lzbG9nc3EAfgAKdBTxCiAgICAgICAgPGJyPjxicj4gPENPREU+c3lzbG9nPC9DT0RFPiBzdWJtaXRzIGEgbWVzc2FnZSB0byB0aGUgU3lzbG9nIGZhY2lsaXR5LiAgSXQgZG9lcyB0aGlzIGJ5CiAgICAgICAgIHdyaXRpbmcgdG8gdGhlIFVuaXggZG9tYWluIHNvY2tldCA8Q09ERT4vZGV2L2xvZzwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IDxDT0RFPnN5c2xvZzwvQ09ERT4gc3VibWl0cyB0aGUgbWVzc2FnZSB3aXRoIHRoZSBmYWNpbGl0eSBhbmQgcHJpb3JpdHkgaW5kaWNhdGVkCiAgICAgICAgIGJ5IDxWQVI+ZmFjaWxpdHlfcHJpb3JpdHk8L1ZBUj4uICBUaGUgbWFjcm8gPENPREU+TE9HX01BS0VQUkk8L0NPREU+IGdlbmVyYXRlcyBhCiAgICAgICAgIGZhY2lsaXR5L3ByaW9yaXR5IGZyb20gYSBmYWNpbGl0eSBhbmQgYSBwcmlvcml0eSwgYXMgaW4gdGhlIGZvbGxvd2luZwogICAgICAgICBleGFtcGxlOgogICAgICAgICA8YnI+PGJyPiA8cHJlPjxicj4KICAgICAgICAgTE9HX01BS0VQUkkoTE9HX1VTRVIsIExPR19XQVJOSU5HKTxicj4KICAgICAgICAgPC9wcmU+PGJyPgogICAgICAgICA8YnI+PGJyPiBUaGUgcG9zc2libGUgdmFsdWVzIGZvciB0aGUgZmFjaWxpdHkgY29kZSBhcmUgKG1hY3Jvcyk6PGJyPgogICAgICAgICA8YnI+PGJyPiA8YnI+PGJyPiA8REw+Cjxicj4KICAgICAgICAgPERUPjxDT0RFPkxPR19VU0VSPGJyPjwvQ09ERT4KPEREPgogICAgICAgICBBIG1pc2NlbGxhbmVvdXMgdXNlciBwcm9jZXNzPGJyPgogICAgICAgICA8RFQ+PENPREU+TE9HX01BSUw8YnI+PC9DT0RFPgo8REQ+CiAgICAgICAgIE1haWw8YnI+CiAgICAgICAgIDxEVD48Q09ERT5MT0dfREFFTU9OPGJyPjwvQ09ERT4KPEREPgogICAgICAgICBBIG1pc2NlbGxhbmVvdXMgc3lzdGVtIGRhZW1vbjxicj4KICAgICAgICAgPERUPjxDT0RFPkxPR19BVVRIPGJyPjwvQ09ERT4KPEREPgogICAgICAgICBTZWN1cml0eSAoYXV0aG9yaXphdGlvbik8YnI+CiAgICAgICAgIDxEVD48Q09ERT5MT0dfU1lTTE9HPGJyPjwvQ09ERT4KPEREPgogICAgICAgICBTeXNsb2c8YnI+CiAgICAgICAgIDxEVD48Q09ERT5MT0dfTFBSPGJyPjwvQ09ERT4KPEREPgogICAgICAgICBDZW50cmFsIHByaW50ZXI8YnI+CiAgICAgICAgIDxEVD48Q09ERT5MT0dfTkVXUzxicj48L0NPREU+CjxERD4KICAgICAgICAgTmV0d29yayBuZXdzIChlLmcuIFVzZW5ldCk8YnI+CiAgICAgICAgIDxEVD48Q09ERT5MT0dfVVVDUDxicj48L0NPREU+CjxERD4KICAgICAgICAgVVVDUDxicj4KICAgICAgICAgPERUPjxDT0RFPkxPR19DUk9OPGJyPjwvQ09ERT4KPEREPgogICAgICAgICBDcm9uIGFuZCBBdDxicj4KICAgICAgICAgPERUPjxDT0RFPkxPR19BVVRIUFJJVjxicj48L0NPREU+CjxERD4KICAgICAgICAgUHJpdmF0ZSBzZWN1cml0eSAoYXV0aG9yaXphdGlvbik8YnI+CiAgICAgICAgIDxEVD48Q09ERT5MT0dfRlRQPGJyPjwvQ09ERT4KPEREPgogICAgICAgICBGdHAgc2VydmVyPGJyPgogICAgICAgICA8RFQ+PENPREU+TE9HX0xPQ0FMMDxicj48L0NPREU+CjxERD4KICAgICAgICAgTG9jYWxseSBkZWZpbmVkPGJyPgogICAgICAgICA8RFQ+PENPREU+TE9HX0xPQ0FMMTxicj48L0NPREU+CjxERD4KICAgICAgICAgTG9jYWxseSBkZWZpbmVkPGJyPgogICAgICAgICA8RFQ+PENPREU+TE9HX0xPQ0FMMjxicj48L0NPREU+CjxERD4KICAgICAgICAgTG9jYWxseSBkZWZpbmVkPGJyPgogICAgICAgICA8RFQ+PENPREU+TE9HX0xPQ0FMMzxicj48L0NPREU+CjxERD4KICAgICAgICAgTG9jYWxseSBkZWZpbmVkPGJyPgogICAgICAgICA8RFQ+PENPREU+TE9HX0xPQ0FMNDxicj48L0NPREU+CjxERD4KICAgICAgICAgTG9jYWxseSBkZWZpbmVkPGJyPgogICAgICAgICA8RFQ+PENPREU+TE9HX0xPQ0FMNTxicj48L0NPREU+CjxERD4KICAgICAgICAgTG9jYWxseSBkZWZpbmVkPGJyPgogICAgICAgICA8RFQ+PENPREU+TE9HX0xPQ0FMNjxicj48L0NPREU+CjxERD4KICAgICAgICAgTG9jYWxseSBkZWZpbmVkPGJyPgogICAgICAgICA8RFQ+PENPREU+TE9HX0xPQ0FMNzxicj48L0NPREU+CjxERD4KICAgICAgICAgTG9jYWxseSBkZWZpbmVkPGJyPgogICAgICAgICA8L0RMPjxicj4KICAgICAgICAgPGJyPjxicj4gUmVzdWx0cyBhcmUgdW5kZWZpbmVkIGlmIHRoZSBmYWNpbGl0eSBjb2RlIGlzIGFueXRoaW5nIGVsc2UuPGJyPgogICAgICAgICA8YnI+PGJyPiBOQjogPENPREU+c3lzbG9nPC9DT0RFPiByZWNvZ25pemVzIG9uZSBvdGhlciBmYWNpbGl0eSBjb2RlOiB0aGF0IG9mPGJyPgogICAgICAgICB0aGUga2VybmVsLiAgQnV0IHlvdSBjYW4ndCBzcGVjaWZ5IHRoYXQgZmFjaWxpdHkgY29kZSB3aXRoIHRoZXNlPGJyPgogICAgICAgICBmdW5jdGlvbnMuICBJZiB5b3UgdHJ5LCBpdCBsb29rcyB0aGUgc2FtZSB0byA8Q09ERT5zeXNsb2c8L0NPREU+IGFzIGlmIHlvdSBhcmU8YnI+CiAgICAgICAgIHJlcXVlc3RpbmcgdGhlIGRlZmF1bHQgZmFjaWxpdHkuICBCdXQgeW91IHdvdWxkbid0IHdhbnQgdG8gYW55d2F5LDxicj4KICAgICAgICAgYmVjYXVzZSBhbnkgcHJvZ3JhbSB0aGF0IHVzZXMgdGhlIEdOVSBDIGxpYnJhcnkgaXMgbm90IHRoZSBrZXJuZWwuPGJyPgogICAgICAgICA8YnI+PGJyPiBZb3UgY2FuIHVzZSBqdXN0IGEgcHJpb3JpdHkgY29kZSBhcyA8VkFSPmZhY2lsaXR5X3ByaW9yaXR5PC9WQVI+LiAgSW4gdGhhdDxicj4KICAgICAgICAgY2FzZSwgPENPREU+c3lzbG9nPC9DT0RFPiBhc3N1bWVzIHRoZSBkZWZhdWx0IGZhY2lsaXR5IGVzdGFibGlzaGVkIHdoZW4gdGhlPGJyPgogICAgICAgICBTeXNsb2cgY29ubmVjdGlvbiB3YXMgb3BlbmVkLiAgLjxicj4KICAgICAgICAgPGJyPjxicj4gVGhlIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIHByaW9yaXR5IGNvZGUgYXJlIChtYWNyb3MpOjxicj4KICAgICAgICAgPGJyPjxicj4gPERMPgo8YnI+CiAgICAgICAgIDxEVD48Q09ERT5MT0dfRU1FUkc8YnI+PC9DT0RFPgo8REQ+CiAgICAgICAgIFRoZSBtZXNzYWdlIHNheXMgdGhlIHN5c3RlbSBpcyB1bnVzYWJsZS48YnI+CiAgICAgICAgIDxEVD48Q09ERT5MT0dfQUxFUlQ8YnI+PC9DT0RFPgo8REQ+CiAgICAgICAgIEFjdGlvbiBvbiB0aGUgbWVzc2FnZSBtdXN0IGJlIHRha2VuIGltbWVkaWF0ZWx5Ljxicj4KICAgICAgICAgPERUPjxDT0RFPkxPR19DUklUPGJyPjwvQ09ERT4KPEREPgogICAgICAgICBUaGUgbWVzc2FnZSBzdGF0ZXMgYSBjcml0aWNhbCBjb25kaXRpb24uPGJyPgogICAgICAgICA8RFQ+PENPREU+TE9HX0VSUjxicj48L0NPREU+CjxERD4KICAgICAgICAgVGhlIG1lc3NhZ2UgZGVzY3JpYmVzIGFuIGVycm9yLjxicj4KICAgICAgICAgPERUPjxDT0RFPkxPR19XQVJOSU5HPGJyPjwvQ09ERT4KPEREPgogICAgICAgICBUaGUgbWVzc2FnZSBpcyBhIHdhcm5pbmcuPGJyPgogICAgICAgICA8RFQ+PENPREU+TE9HX05PVElDRTxicj48L0NPREU+CjxERD4KICAgICAgICAgVGhlIG1lc3NhZ2UgZGVzY3JpYmVzIGEgbm9ybWFsIGJ1dCBpbXBvcnRhbnQgZXZlbnQuPGJyPgogICAgICAgICA8RFQ+PENPREU+TE9HX0lORk88YnI+PC9DT0RFPgo8REQ+CiAgICAgICAgIFRoZSBtZXNzYWdlIGlzIHB1cmVseSBpbmZvcm1hdGlvbmFsLjxicj4KICAgICAgICAgPERUPjxDT0RFPkxPR19ERUJVRzxicj48L0NPREU+CjxERD4KICAgICAgICAgVGhlIG1lc3NhZ2UgaXMgb25seSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLjxicj4KICAgICAgICAgPC9ETD48YnI+CiAgICAgICAgIDxicj48YnI+IFJlc3VsdHMgYXJlIHVuZGVmaW5lZCBpZiB0aGUgcHJpb3JpdHkgY29kZSBpcyBhbnl0aGluZyBlbHNlLjxicj4KICAgICAgICAgPGJyPjxicj4gSWYgdGhlIHByb2Nlc3MgZG9lcyBub3QgcHJlc2VudGx5IGhhdmUgYSBTeXNsb2cgY29ubmVjdGlvbiBvcGVuIChpLmUuLDxicj4KICAgICAgICAgaXQgZGlkIG5vdCBjYWxsIDxDT0RFPm9wZW5sb2c8L0NPREU+KSwgPENPREU+c3lzbG9nPC9DT0RFPiBpbXBsaWNpdGx5IG9wZW5zIHRoZTxicj4KICAgICAgICAgY29ubmVjdGlvbiB0aGUgc2FtZSBhcyA8Q09ERT5vcGVubG9nPC9DT0RFPiB3b3VsZCwgd2l0aCB0aGUgZm9sbG93aW5nIGRlZmF1bHRzPGJyPgogICAgICAgICBmb3IgaW5mb3JtYXRpb24gdGhhdCB3b3VsZCBvdGhlcndpc2UgYmUgaW5jbHVkZWQgaW4gYW4gPENPREU+b3BlbmxvZzwvQ09ERT48YnI+CiAgICAgICAgIGNhbGw6IFRoZSBkZWZhdWx0IGlkZW50aWZpY2F0aW9uIHN0cmluZyBpcyB0aGUgcHJvZ3JhbSBuYW1lLiAgVGhlPGJyPgogICAgICAgICBkZWZhdWx0IGRlZmF1bHQgZmFjaWxpdHkgaXMgPENPREU+TE9HX1VTRVI8L0NPREU+LiAgVGhlIGRlZmF1bHQgZm9yIGFsbCB0aGU8YnI+CiAgICAgICAgIGNvbm5lY3Rpb24gb3B0aW9ucyBpbiA8VkFSPm9wdGlvbnM8L1ZBUj4gaXMgYXMgaWYgdGhvc2UgYml0cyB3ZXJlIG9mZi48YnI+CiAgICAgICAgIDxDT0RFPnN5c2xvZzwvQ09ERT4gbGVhdmVzIHRoZSBTeXNsb2cgY29ubmVjdGlvbiBvcGVuLjxicj4KICAgICAgICAgPGJyPjxicj4gSWYgdGhlIDxUVD5kZXYvbG9nPC9UVD4gc29ja2V0IGlzIG5vdCBvcGVuIGFuZCBjb25uZWN0ZWQsIDxDT0RFPnN5c2xvZzwvQ09ERT48YnI+CiAgICAgICAgIG9wZW5zIGFuZCBjb25uZWN0cyBpdCwgdGhlIHNhbWUgYXMgPENPREU+b3BlbmxvZzwvQ09ERT4gd2l0aCB0aGU8YnI+CiAgICAgICAgIDxDT0RFPkxPR19OREVMQVk8L0NPREU+IG9wdGlvbiB3b3VsZC48YnI+CiAgICAgICAgIDxicj48YnI+IDxDT0RFPnN5c2xvZzwvQ09ERT4gbGVhdmVzIDxUVD4vZGV2L2xvZzwvVFQ+IG9wZW4gYW5kIGNvbm5lY3RlZCB1bmxlc3MgaXRzIGF0dGVtcHQ8YnI+CiAgICAgICAgIHRvIHNlbmQgdGhlIG1lc3NhZ2UgZmFpbGVkLCBpbiB3aGljaCBjYXNlIDxDT0RFPnN5c2xvZzwvQ09ERT4gY2xvc2VzIGl0ICh3aXRoIHRoZTxicj4KICAgICAgICAgaG9wZSB0aGF0IGEgZnV0dXJlIGltcGxpY2l0IG9wZW4gd2lsbCByZXN0b3JlIHRoZSBTeXNsb2cgY29ubmVjdGlvbiB0byBhPGJyPgogICAgICAgICB1c2FibGUgc3RhdGUpLjxicj4KICAgICAgICAgPGJyPjxicj4gRXhhbXBsZTo8YnI+CiAgICAgICAgIDxicj48YnI+IDxwcmU+PGJyPgogICAgICAgICA8YnI+PGJyPiAjaW5jbHVkZSA8c3lzbG9nLmg+PGJyPgogICAgICAgICBzeXNsb2cgKExPR19NQUtFUFJJKExPR19MT0NBTDEsIExPR19FUlJPUiksPGJyPgogICAgICAgICAgICAgICAgICJVbmFibGUgdG8gbWFrZSBuZXR3b3JrIGNvbm5lY3Rpb24gdG8gJXMuICBFcnJvcj0lbSIsIGhvc3QpOzxicj4KICAgICAgICAgPGJyPjxicj4gPC9wcmU+CiAgICAgICAgIDxicj48YnI+CiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHN5c2xvZy5oeHEAfhx7dAAoaW50IGZhY2lsaXR5X3ByaW9yaXR5LCBjaGFyICpmb3JtYXQsIC4uLnQABHZvaWR0AAZzeXN0ZW1zcQB+AAp0BNoKICAgICAgICBUaGlzIGZ1bmN0aW9uIGV4ZWN1dGVzIDxWQVI+Y29tbWFuZDwvVkFSPiBhcyBhIHNoZWxsIGNvbW1hbmQuICBJbiB0aGUgR05VIEMKICAgICAgICAgbGlicmFyeSwgaXQgYWx3YXlzIHVzZXMgdGhlIGRlZmF1bHQgc2hlbGwgPENPREU+c2g8L0NPREU+IHRvIHJ1biB0aGUgY29tbWFuZC4KICAgICAgICAgSW4gcGFydGljdWxhciwgaXQgc2VhcmNoZXMgdGhlIGRpcmVjdG9yaWVzIGluIDxDT0RFPlBBVEg8L0NPREU+IHRvIGZpbmQKICAgICAgICAgcHJvZ3JhbXMgdG8gZXhlY3V0ZS4gIFRoZSByZXR1cm4gdmFsdWUgaXMgPENPREU+LTE8L0NPREU+IGlmIGl0IHdhc24ndAogICAgICAgICBwb3NzaWJsZSB0byBjcmVhdGUgdGhlIHNoZWxsIHByb2Nlc3MsIGFuZCBvdGhlcndpc2UgaXMgdGhlIHN0YXR1cyBvZiB0aGUKICAgICAgICAgc2hlbGwgcHJvY2Vzcy4gICwgZm9yIGRldGFpbHMgb24gaG93IHRoaXMKICAgICAgICAgc3RhdHVzIGNvZGUgY2FuIGJlIGludGVycHJldGVkLgogICAgICAgICA8YnI+PGJyPiBJZiB0aGUgPFZBUj5jb21tYW5kPC9WQVI+IGFyZ3VtZW50IGlzIGEgbnVsbCBwb2ludGVyLCBhIHJldHVybiB2YWx1ZSBvZiB6ZXJvCiAgICAgICAgIGluZGljYXRlcyB0aGF0IG5vIGNvbW1hbmQgcHJvY2Vzc29yIGlzIGF2YWlsYWJsZS4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBpbiBtdWx0aS10aHJlYWRlZCBwcm9ncmFtcy4gIFRoaXMKICAgICAgICAgaXMgYSBwcm9ibGVtIGlmIHRoZSB0aHJlYWQgYWxsb2NhdGVzIHNvbWUgcmVzb3VyY2VzIChsaWtlIG1lbW9yeSwgZmlsZQogICAgICAgICBkZXNjcmlwdG9ycywgc2VtYXBob3JlcyBvciB3aGF0ZXZlcikgYXQgdGhlIHRpbWUgPENPREU+c3lzdGVtPC9DT0RFPiBpcwogICAgICAgICBjYWxsZWQuICBJZiB0aGUgdGhyZWFkIGdldHMgY2FuY2VsZWQgdGhlc2UgcmVzb3VyY2VzIHN0YXkgYWxsb2NhdGVkCiAgICAgICAgIHVudGlsIHRoZSBwcm9ncmFtIGVuZHMuICBUbyBhdm9pZCB0aGlzIGNhbGxzIHRvIDxDT0RFPnN5c3RlbTwvQ09ERT4gc2hvdWxkIGJlCiAgICAgICAgIHByb3RlY3RlZCB1c2luZyBjYW5jZWxsYXRpb24gaGFuZGxlcnMuCiAgICAgICAgIDxicj48YnI+IFRoZSA8Q09ERT5zeXN0ZW08L0NPREU+IGZ1bmN0aW9uIGlzIGRlY2xhcmVkIGluIHRoZSBoZWFkZXIgZmlsZQogICAgICAgICA8VFQ+c3RkbGliLmg8L1RUPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc3RkbGliLmh4cQB+HIJ0ABNjb25zdCBjaGFyICpjb21tYW5kdAADaW50dAALc3lzdl9zaWduYWxzcQB+AAp0Ab4KICAgICAgICBUaGUgPENPREU+c3lzdl9zaWduYWw8L0NPREU+IGltcGxlbWVudHMgdGhlIGJlaGF2aW9yIG9mIHRoZSBzdGFuZGFyZAogICAgICAgICA8Q09ERT5zaWduYWw8L0NPREU+IGZ1bmN0aW9uIGFzIGZvdW5kIG9uIFNWSUQgc3lzdGVtcy4gIFRoZSBkaWZmZXJlbmNlIHRvIEJTRAogICAgICAgICBzeXN0ZW1zIGlzIHRoYXQgdGhlIGhhbmRsZXIgaXMgZGVpbnN0YWxsZWQgYWZ0ZXIgYSBkZWxpdmVyeSBvZiBhIHNpZ25hbC4KICAgICAgICAgPGJyPjxicj4gQ29tcGF0aWJpbGl0eSBOb3RlOiBBcyBzYWlkIGFib3ZlIGZvciA8Q09ERT5zaWduYWw8L0NPREU+LCB0aGlzCiAgICAgICAgIGZ1bmN0aW9uIHNob3VsZCBiZSBhdm9pZGVkIHdoZW4gcG9zc2libGUuICA8Q09ERT5zaWdhY3Rpb248L0NPREU+IGlzIHRoZQogICAgICAgICBwcmVmZXJyZWQgbWV0aG9kLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAhzaWduYWwuaHhxAH4ciXQAH2ludCBzaWdudW0sIHNpZ2hhbmRsZXJfdCBhY3Rpb250AAxzaWdoYW5kbGVyX3R0AAN0YW5zcQB+AAp0AVwKICAgICAgICBUaGVzZSBmdW5jdGlvbnMgcmV0dXJuIHRoZSB0YW5nZW50IG9mIDxWQVI+eDwvVkFSPiwgd2hlcmUgPFZBUj54PC9WQVI+IGlzIGdpdmVuIGluCiAgICAgICAgIHJhZGlhbnMuCiAgICAgICAgIDxicj48YnI+IE1hdGhlbWF0aWNhbGx5LCB0aGUgdGFuZ2VudCBmdW5jdGlvbiBoYXMgc2luZ3VsYXJpdGllcyBhdCBvZGQgbXVsdGlwbGVzCiAgICAgICAgIG9mIHBpLzIuICBJZiB0aGUgYXJndW1lbnQgPFZBUj54PC9WQVI+IGlzIHRvbyBjbG9zZSB0byBvbmUgb2YgdGhlc2UKICAgICAgICAgc2luZ3VsYXJpdGllcywgPENPREU+dGFuPC9DT0RFPiB3aWxs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s3QADWxvbmcgZG91YmxlIHh0AAtsb25nIGRvdWJsZXQAB3RjZHJhaW5zcQB+AAp0BIEKICAgICAgICBUaGUgPENPREU+dGNkcmFpbjwvQ09ERT4gZnVuY3Rpb24gd2FpdHMgdW50aWwgYWxsIHF1ZXVlZAogICAgICAgICBvdXRwdXQgdG8gdGhlIHRlcm1pbmFsIDxWQVI+ZmlsZWRlczwvVkFSPiBoYXMgYmVlbiB0cmFuc21pdHRlZC4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBpbiBtdWx0aS10aHJlYWRlZCBwcm9ncmFtcy4gIFRoaXMKICAgICAgICAgaXMgYSBwcm9ibGVtIGlmIHRoZSB0aHJlYWQgYWxsb2NhdGVzIHNvbWUgcmVzb3VyY2VzIChsaWtlIG1lbW9yeSwgZmlsZQogICAgICAgICBkZXNjcmlwdG9ycywgc2VtYXBob3JlcyBvciB3aGF0ZXZlcikgYXQgdGhlIHRpbWUgPENPREU+dGNkcmFpbjwvQ09ERT4gaXMKICAgICAgICAgY2FsbGVkLiAgSWYgdGhlIHRocmVhZCBnZXRzIGNhbmNlbGVkIHRoZXNlIHJlc291cmNlcyBzdGF5IGFsbG9jYXRlZAogICAgICAgICB1bnRpbCB0aGUgcHJvZ3JhbSBlbmRzLiAgVG8gYXZvaWQgdGhpcyBjYWxscyB0byA8Q09ERT50Y2RyYWluPC9DT0RFPiBzaG91bGQgYmUKICAgICAgICAgcHJvdGVjdGVkIHVzaW5nIGNhbmNlbGxhdGlvbiBoYW5kbGVycy4KICAgICAgICAgPGJyPjxicj4gVGhlIHJldHVybiB2YWx1ZSBpcyBub3JtYWxseSB6ZXJvLiAgSW4gdGhlIGV2ZW50IG9mIGFuIGVycm9yLCBhIHZhbHVlCiAgICAgICAgIG9mIC0xIGlzIHJldHVybmVkLiAgVGhlIGZvbGxvd2luZyA8Q09ERT5lcnJubzwvQ09ERT4gZXJyb3IgY29uZGl0aW9ucwogICAgICAgICBhcmUgZGVmaW5lZCBmb3IgdGhpcyBmdW5jdGlvbjoKICAgICAgICAgPGJyPjxicj4gPERMPgoKICAgICAgICAgPERUPjxD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REU+IGZ1bmN0aW9uIGlzIHVzZWQgdG8gY2xlYXIgdGhlIGlucHV0IGFuZC9vciBvdXRwdXQKICAgICAgICAgcXVldWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGVybWluYWwgZmlsZSA8VkFSPmZpbGVkZXM8L1ZBUj4uICBUaGUgPFZBUj5xdWV1ZTwvVkFSPgogICAgICAgICBhcmd1bWVudCBzcGVjaWZpZXMgd2hpY2ggcXVldWUocykgdG8gY2xlYXIsIGFuZCBjYW4gYmUgb25lIG9mIHRoZQogICAgICAgICBmb2xsb3dpbmcgdmFsdWVzOgogICAgICAgICA8YnI+PGJyPiA8REw+CgoKICAgICAgICAgPERUPjxDT0RFPlRDSUZMVVNIPC9DT0RFPgo8REQ+CiAgICAgICAgIDxicj48YnI+IENsZWFyIGFueSBpbnB1dCBkYXRhIHJlY2VpdmVkLCBidXQgbm90IHlldCByZWFkLgogICAgICAgICA8YnI+PGJyPgogICAgICAgICA8RFQ+PENPREU+VENPRkxVU0g8L0NPREU+CjxERD4KICAgICAgICAgPGJyPjxicj4gQ2xlYXIgYW55IG91dHB1dCBkYXRhIHdyaXR0ZW4sIGJ1dCBub3QgeWV0IHRyYW5zbWl0dGVkLgogICAgICAgICA8YnI+PGJyPgogICAgICAgICA8TEk+IFRDSU9GTFVTSAogICAgICAgICA8YnI+PGJyPiBDbGVhciBib3RoIHF1ZXVlZCBpbnB1dCBhbmQgb3V0cHV0LgoKICAgICAgICAgPGJyPjxicj4gVGhlIHJldHVybiB2YWx1ZSBpcyBub3JtYWxseSB6ZXJvLiAgSW4gdGhlIGV2ZW50IG9mIGFuIGVycm9yLCBhIHZhbHVlCiAgICAgICAgIG9mIC0xIGlzIHJldHVybmVkLiAgVGhlIGZvbGxvd2luZyA8Q09ERT5lcnJubzwvQ09ERT4gZXJyb3IgY29uZGl0aW9ucwogICAgICAgICBhcmUgZGVmaW5lZCBmb3IgdGhpcyBmdW5jdGlvbjoKICAgICAgICAgPGJyPjxicj4gPERMPgoKICAgICAgICAgPExJPiBFQkFERgogICAgICAgICBUaGUgPFZBUj5maWxlZGVzPC9WQVI+IGlzIG5vdCBhIHZhbGlkIGZpbGUgZGVzY3JpcHRvci4KICAgICAgICAgPGJyPjxicj4gPExJPiBFTk9UVFkKICAgICAgICAgVGhlIDxWQVI+ZmlsZWRlczwvVkFSPiBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGEgdGVybWluYWwgZGV2aWNlLgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVJTlZBTAogICAgICAgICBBIGJhZCB2YWx1ZSB3YXMgc3VwcGxpZWQgYXMgdGhlIDxWQVI+cXVldWU8L1ZBUj4gYXJndW1lbnQuCgogICAgICAgICA8YnI+PGJyPiBJdCBpcyB1bmZvcnR1bmF0ZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgbmFtZWQgPENPREU+dGNmbHVzaDwvQ09ERT4sIGJlY2F1c2UKICAgICAgICAgdGhlIHRlcm0gYGBmbHVzaCcnIGlzIG5vcm1hbGx5IHVzZWQgZm9yIHF1aXRlIGFub3RoZXIgb3BlcmF0aW9uLS0td2FpdGluZwogICAgICAgICB1bnRpbCBhbGwgb3V0cHV0IGlzIHRyYW5zbWl0dGVkLS0tYW5kIHVzaW5nIGl0IGZvciBkaXNjYXJkaW5nIGlucHV0IG9yCiAgICAgICAgIG91dHB1dCB3b3VsZCBiZSBjb25mdXNpbmcuICBVbmZvcnR1bmF0ZWx5LCB0aGUgbmFtZSA8Q09ERT50Y2ZsdXNoPC9DT0RFPiBjb21lcwogICAgICAgICBmcm9tIFBPU0lYIGFuZCB3ZSBjYW5ub3QgY2hhbmdlIGl0LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAl0ZXJtaW9zLmh4cQB+HMh0ABZpbnQgZmlsZWRlcywgaW50IHF1ZXVldAADaW50dAAJdGNnZXRhdHRyc3EAfgAKdAKfCiAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGV4YW1pbmUgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIHRlcm1pbmFsCiAgICAgICAgIGRldmljZSB3aXRoIGZpbGUgZGVzY3JpcHRvciA8VkFSPmZpbGVkZXM8L1ZBUj4uICBUaGUgYXR0cmlidXRlcyBhcmUgcmV0dXJuZWQKICAgICAgICAgaW4gdGhlIHN0cnVjdHVyZSB0aGF0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bWluYWwgZGV2aWNlIHdpdGggZmlsZQogICAgICAgICBkZXNjcmlwdG9yIDxWQVI+ZmlsZWRlczwvVkFSPi4gIFRoZSBuZXcgYXR0cmlidXRlcyBhcmUgdGFrZW4gZnJvbSB0aGUKICAgICAgICAgc3RydWN0dXJlIHRoYXQgPFZBUj50ZXJtaW9zLXA8L1ZBUj4gcG9pbnRzIHRvLgogICAgICAgICA8YnI+PGJyPiBUaGUgPFZBUj53aGVuPC9WQVI+IGFyZ3VtZW50IHNwZWNpZmllcyBob3cgdG8gZGVhbCB3aXRoIGlucHV0IGFuZCBvdXRwdXQKICAgICAgICAgYWxyZWFkeSBxdWV1ZWQuICBJdCBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8RFQ+PENPREU+VENTQU5PVzwvQ09ERT4KPEREPgoKICAgICAgICAgTWFrZSB0aGUgY2hhbmdlIGltbWVkaWF0ZWx5LgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+VENTQURSQUlOPC9DT0RFPgo8REQ+CgogICAgICAgICBNYWtlIHRoZSBjaGFuZ2UgYWZ0ZXIgd2FpdGluZyB1bnRpbCBhbGwgcXVldWVkIG91dHB1dCBoYXMgYmVlbiB3cml0dGVuLgogICAgICAgICBZb3Ugc2hvdWxkIHVzdWFsbHkgdXNlIHRoaXMgb3B0aW9uIHdoZW4gY2hhbmdpbmcgcGFyYW1ldGVycyB0aGF0IGFmZmVjdAogICAgICAgICBvdXRwdXQuCiAgICAgICAgIDxicj48YnI+IDxMST4gVENTQUZMVVNICgogICAgICAgICBUaGlzIGlzIGxpa2UgPENPREU+VENTQURSQUlOPC9DT0RFPiwgYnV0IGFsc28gZGlzY2FyZHMgYW55IHF1ZXVlZCBpbnB1dC4KICAgICAgICAgPGJyPjxicj4gPExJPiBUQ1NBU09GVAoKICAgICAgICAgVGhpcyBpcyBhIGZsYWcgYml0IHRoYXQgeW91IGNhbiBhZGQgdG8gYW55IG9mIHRoZSBhYm92ZSBhbHRlcm5hdGl2ZXMuCiAgICAgICAgIEl0cyBtZWFuaW5nIGlzIHRvIGluaGliaXQgYWx0ZXJhdGlvbiBvZiB0aGUgc3RhdGUgb2YgdGhlIHRlcm1pbmFsCiAgICAgICAgIGhhcmR3YXJlLiAgSXQgaXMgYSBCU0QgZXh0ZW5zaW9uOyBpdCBpcyBvbmx5IHN1cHBvcnRlZCBvbiBCU0Qgc3lzdGVtcwogICAgICAgICBhbmQgdGhlIEdOVSBzeXN0ZW0uCiAgICAgICAgIDxicj48YnI+IFVzaW5nIDxDT0RFPlRDU0FTT0ZUPC9DT0RFPiBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIHNldHRpbmcgdGhlIDxDT0RFPkNJR05PUkU8L0NPREU+CiAgICAgICAgIGJpdCBpbiB0aGUgPENPREU+Y19jZmxhZzwvQ09ERT4gbWVtYmVyIG9mIHRoZSBzdHJ1Y3R1cmUgPFZBUj50ZXJtaW9zLXA8L1ZBUj4gcG9pbnRzCiAgICAgICAgIHRvLiAgLCBmb3IgYSBkZXNjcmlwdGlvbiBvZiA8Q09ERT5DSUdOT1JFPC9DT0RFPi4KCiAgICAgICAgIDxicj48YnI+IElmIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gYSBiYWNrZ3JvdW5kIHByb2Nlc3Mgb24gaXRzIGNvbnRyb2xsaW5nCiAgICAgICAgIHRlcm1pbmFsLCBub3JtYWxseSBhbGwgcHJvY2Vzc2VzIGluIHRoZSBwcm9jZXNzIGdyb3VwIGFyZSBzZW50IGEKICAgICAgICAgPENPREU+U0lHVFRPVTwvQ09ERT4gc2lnbmFsLCBpbiB0aGUgc2FtZSB3YXkgYXMgaWYgdGhlIHByb2Nlc3Mgd2VyZSB0cnlpbmcgdG8KICAgICAgICAgd3JpdGUgdG8gdGhlIHRlcm1pbmFsLiAgVGhlIGV4Y2VwdGlvbiBpcyBpZiB0aGUgY2FsbGluZyBwcm9jZXNzIGl0c2VsZgogICAgICAgICBpcyBpZ25vcmluZyBvciBibG9ja2luZyA8Q09ERT5TSUdUVE9VPC9DT0RFPiBzaWduYWxzLCBpbiB3aGljaCBjYXNlIHRoZQogICAgICAgICBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIGFuZCBubyBzaWduYWwgaXMgc2VudC4gIC4KICAgICAgICAgPGJyPjxicj4gSWYgc3VjY2Vzc2Z1bCwgPENPREU+dGNzZXRhdHRyPC9DT0RFPiByZXR1cm5zIDAuICBBIHJldHVybiB2YWx1ZSBvZgogICAgICAgICAtMSBpbmRpY2F0ZXMgYW4gZXJyb3IuICBUaGUgZm9sbG93aW5nIDxDT0RFPmVycm5vPC9DT0RFPiBlcnJvcgogICAgICAgICBjb25kaXRpb25zIGFyZSBkZWZpbmVkIGZvciB0aGlzIGZ1bmN0aW9uOgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8TEk+IEVCQURGCiAgICAgICAgIFRoZSA8VkFSPmZpbGVkZXM8L1ZBUj4gYXJndW1lbnQgaXMgbm90IGEgdmFsaWQgZmlsZSBkZXNjcmlwdG9yLgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVOT1RUWQogICAgICAgICBUaGUgPFZBUj5maWxlZGVzPC9WQVI+IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSB0ZXJtaW5hbC4KICAgICAgICAgPGJyPjxicj4gPExJPiBFSU5WQUwKICAgICAgICAgRWl0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgPENPREU+d2hlbjwvQ09ERT4gYXJndW1lbnQgaXMgbm90IHZhbGlkLCBvciB0aGVyZSBpcwogICAgICAgICBzb21ldGhpbmcgd3Jvbmcgd2l0aCB0aGUgZGF0YSBpbiB0aGUgPFZBUj50ZXJtaW9zLXA8L1ZBUj4gYXJndW1lbnQuCgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAl0ZXJtaW9zLmh4cQB+HOt0ADZpbnQgZmlsZWRlcywgaW50IHdoZW4sIGNvbnN0IHN0cnVjdCB0ZXJtaW9zICp0ZXJtaW9zLXB0AANpbnR0AAl0Y3NldHBncnBzcQB+AAp0BkEKICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2V0IGEgdGVybWluYWwncyBmb3JlZ3JvdW5kIHByb2Nlc3MgZ3JvdXAgSUQuCiAgICAgICAgIFRoZSBhcmd1bWVudCA8VkFSPmZpbGVkZXM8L1ZBUj4gaXMgYSBkZXNjcmlwdG9yIHdoaWNoIHNwZWNpZmllcyB0aGUgdGVybWluYWw7CiAgICAgICAgIDxWQVI+cGdpZDwvVkFSPiBzcGVjaWZpZXMgdGhlIHByb2Nlc3MgZ3JvdXAuICBUaGUgY2FsbGluZyBwcm9jZXNzIG11c3QgYmUgYQogICAgICAgICBtZW1iZXIgb2YgdGhlIHNhbWUgc2Vzc2lvbiBhcyA8VkFSPnBnaWQ8L1ZBUj4gYW5kIG11c3QgaGF2ZSB0aGUgc2FtZQogICAgICAgICBjb250cm9sbGluZyB0ZXJtaW5hbC4KICAgICAgICAgPGJyPjxicj4gRm9yIHRlcm1pbmFsIGFjY2VzcyBwdXJwb3NlcywgdGhpcyBmdW5jdGlvbiBpcyB0cmVhdGVkIGFzIG91dHB1dC4gIElmIGl0CiAgICAgICAgIGlzIGNhbGxlZCBmcm9tIGEgYmFja2dyb3VuZCBwcm9jZXNzIG9uIGl0cyBjb250cm9sbGluZyB0ZXJtaW5hbCwKICAgICAgICAgbm9ybWFsbHkgYWxsIHByb2Nlc3NlcyBpbiB0aGUgcHJvY2VzcyBncm91cCBhcmUgc2VudCBhIDxDT0RFPlNJR1RUT1U8L0NPREU+CiAgICAgICAgIHNpZ25hbC4gIFRoZSBleGNlcHRpb24gaXMgaWYgdGhlIGNhbGxpbmcgcHJvY2VzcyBpdHNlbGYgaXMgaWdub3Jpbmcgb3IKICAgICAgICAgYmxvY2tpbmcgPENPREU+U0lHVFRPVTwvQ09ERT4gc2lnbmFscywgaW4gd2hpY2ggY2FzZSB0aGUgb3BlcmF0aW9uIGlzCiAgICAgICAgIHBlcmZvcm1lZCBhbmQgbm8gc2lnbmFsIGlzIHNlbnQuCiAgICAgICAgIDxicj48YnI+IElmIHN1Y2Nlc3NmdWwsIDxDT0RFPnRjc2V0cGdycDwvQ09ERT4gcmV0dXJucyA8Q09ERT4wPC9DT0RFPi4gIEEgcmV0dXJuIHZhbHVlIG9mCiAgICAgICAgIDxDT0RFPi0xPC9DT0RFPiBpbmRpY2F0ZXMgYW4gZXJyb3IuICBUaGUgZm9sbG93aW5nIDxDT0RFPmVycm5vPC9DT0RFPiBlcnJvcgogICAgICAgICBjb25kaXRpb25zIGFyZSBkZWZpbmVkIGZvciB0aGlzIGZ1bmN0aW9uOgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAg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cG9pbnQgdG8gYSBmdW5jdGlvbiBkb2luZwogICAgICAgICBub3RoaW5nLiAgSXQgaXMgY2FsbGVkIGluIGFueSBjYXNlLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIGlzIGEgR05VIGV4dGVuc2lvbiBhbmQgbm90IGNvdmVyZWQgYnkgdGhlIFN5c3RlbSBWIG9yCiAgICAgICAgIFgvT3BlbiBzcGVjaWZpY2F0aW9ucy4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc2VhcmNoLmh4cQB+HQB0ACB2b2lkICp2cm9vdCwgX19mcmVlX2ZuX3QgZnJlZWZjdHQABHZvaWR0AAd0ZW1wbmFtc3EAfgAKdAaJCiAgICAgICAgVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgYSB1bmlxdWUgdGVtcG9yYXJ5IGZpbGUgbmFtZS4gIElmIDxWQVI+cHJlZml4PC9WQVI+CiAgICAgICAgIGlzIG5vdCBhIG51bGwgcG9pbnRlciwgdXAgdG8gZml2ZSBjaGFyYWN0ZXJzIG9mIHRoaXMgc3RyaW5nIGFyZSB1c2VkIGFzCiAgICAgICAgIGEgcHJlZml4IGZvciB0aGUgZmlsZSBuYW1lLiAgVGhlIHJldHVybiB2YWx1ZSBpcyBhIHN0cmluZyBuZXdseQogICAgICAgICBhbGxvY2F0ZWQgd2l0aCA8Q09ERT5tYWxsb2M8L0NPREU+LCBzbyB5b3Ugc2hvdWxkIHJlbGVhc2UgaXRzIHN0b3JhZ2Ugd2l0aAogICAgICAgICA8Q09ERT5mcmVlPC9DT0RFPiB3aGVuIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQuCiAgICAgICAgIDxicj48YnI+IEJlY2F1c2UgdGhlIHN0cmluZyBpcyBkeW5hbWljYWxseSBhbGxvY2F0ZWQgdGhpcyBmdW5jdGlvbiBpcyByZWVudHJhbnQuCiAgICAgICAgIDxicj48YnI+IFRoZSBkaXJlY3RvcnkgcHJlZml4IGZvciB0aGUgdGVtcG9yYXJ5IGZpbGUgbmFtZSBpcyBkZXRlcm1pbmVkIGJ5CiAgICAgICAgIHRlc3RpbmcgZWFjaCBvZiB0aGUgZm9sbG93aW5nIGluIHNlcXVlbmNlLiAgVGhlIGRpcmVjdG9yeSBtdXN0IGV4aXN0IGFuZAogICAgICAgICBiZSB3cml0YWJsZS4KICAgICAgICAgPGJyPjxicj4gPE9MPgogICAgICAgICA8TEk+CiAgICAgICAgIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSA8Q09ERT5UTVBESVI8L0NPREU+LCBpZiBpdCBpcyBkZWZpbmVkLiAgRm9yIHNlY3VyaXR5CiAgICAgICAgIHJlYXNvbnMgdGhpcyBvbmx5IGhhcHBlbnMgaWYgdGhlIHByb2dyYW0gaXMgbm90IFNVSUQgb3IgU0dJRCBlbmFibGVkLgogICAgICAgICA8YnI+PGJyPiA8TEk+CiAgICAgICAgIFRoZSA8VkFSPmRpcjwvVkFSPiBhcmd1bWVudCwgaWYgaXQgaXMgbm90IGEgbnVsbCBwb2ludGVyLgogICAgICAgICA8YnI+PGJyPiA8TEk+CiAgICAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgPENPREU+UF90bXBkaXI8L0NPREU+IG1hY3JvLgogICAgICAgICA8YnI+PGJyPiA8TEk+CiAgICAgICAgIFRoZSBkaXJlY3RvcnkgPFRUPi90bXA8L1RUPi4KICAgICAgICAgPC9PTD4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiBpcyBkZWZpbmVkIGZvciBTVklEIGNvbXBhdGliaWxpdHkuCiAgICAgICAgIDxicj48YnI+IFdhcm5pbmc6IEJldHdlZW4gdGhlIHRpbWUgdGhlIHBhdGhuYW1lIGlzIGNvbnN0cnVjdGVkIGFuZCB0aGUKICAgICAgICAgZmlsZSBpcyBjcmVhdGVkIGFub3RoZXIgcHJvY2VzcyBtaWdodCBoYXZlIGNyZWF0ZWQgYSBmaWxlIHdpdGggdGhlIHNhbWUKICAgICAgICAgbmFtZSB1c2luZyA8Q09ERT50ZW1wbmFtPC9DT0RFPiwgbGVhZGluZyB0byBhIHBvc3NpYmxlIHNlY3VyaXR5IGhvbGUuICBUaGUKICAgICAgICAgaW1wbGVtZW50YXRpb24gZ2VuZXJhdGVzIG5hbWVzIHdoaWNoIGNhbiBoYXJkbHkgYmUgcHJlZGljdGVkLCBidXQgd2hlbgogICAgICAgICBvcGVuaW5nIHRoZSBmaWxlIHlvdSBzaG91bGQgdXNlIHRoZSA8Q09ERT5PX0VYQ0w8L0NPREU+IGZsYWcuICBVc2luZwogICAgICAgICA8Q09ERT50bXBmaWxlPC9DT0RFPiBvciA8Q09ERT5ta3N0ZW1wPC9DT0RFPiBpcyBhIHNhZmUgd2F5IHRvIGF2b2lkIHRoaXMgcHJvYmxlbS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHc3RkaW8uaHhxAH4dB3QAI2NvbnN0IGNoYXIgKmRpciwgY29uc3QgY2hhciAqcHJlZml4dAAGY2hhciAqdAAKdGV4dGRvbWFpbnNxAH4ACnQGkAogICAgICAgIFRoZSA8Q09ERT50ZXh0ZG9tYWluPC9DT0RFPiBmdW5jdGlvbiBzZXRzIHRoZSBkZWZhdWx0IGRvbWFpbiwgd2hpY2ggaXMgdXNlZCBpbgogICAgICAgICBhbGwgZnV0dXJlIDxDT0RFPmdldHRleHQ8L0NPREU+IGNhbGxzLCB0byA8VkFSPmRvbWFpbm5hbWU8L1ZBUj4uICBQbGVhc2Ugbm90ZSB0aGF0CiAgICAgICAgIDxDT0RFPmRnZXR0ZXh0PC9DT0RFPiBhbmQgPENPREU+ZGNnZXR0ZXh0PC9DT0RFPiBjYWxscyBhcmUgbm90IGluZmx1ZW5jZWQgaWYgdGhlCiAgICAgICAgIDxWQVI+ZG9tYWlubmFtZTwvVkFSPiBwYXJhbWV0ZXIgb2YgdGhlc2UgZnVuY3Rpb25zIGlzIG5vdCB0aGUgbnVsbCBwb2ludGVyLgogICAgICAgICA8YnI+PGJyPiBCZWZvcmUgdGhlIGZpcnN0IGNhbGwgdG8gPENPREU+dGV4dGRvbWFpbjwvQ09ERT4gdGhlIGRlZmF1bHQgZG9tYWluIGlzCiAgICAgICAgIDxDT0RFPm1lc3NhZ2VzPC9DT0RFPi4gIFRoaXMgaXMgdGhlIG5hbWUgc3BlY2lmaWVkIGluIHRoZSBzcGVjaWZpY2F0aW9uIG9mCiAgICAgICAgIHRoZSA8Q09ERT5nZXR0ZXh0PC9DT0RFPiBBUEkuICBUaGlzIG5hbWUgaXMgYXMgZ29vZCBhcyBhbnkgb3RoZXIgbmFtZS4gIE5vCiAgICAgICAgIHByb2dyYW0gc2hvdWxkIGV2ZXIgcmVhbGx5IHVzZSBhIGRvbWFpbiB3aXRoIHRoaXMgbmFtZSBzaW5jZSB0aGlzIGNhbgogICAgICAgICBvbmx5IGxlYWQgdG8gcHJvYmxlbXMuCiAgICAgICAgIDxicj48YnI+IFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSB2YWx1ZSB3aGljaCBpcyBmcm9tIG5vdyBvbiB0YWtlbiBhcyB0aGUgZGVmYXVsdAogICAgICAgICBkb21haW4uICBJZiB0aGUgc3lzdGVtIHdlbnQgb3V0IG9mIG1lbW9yeSB0aGUgcmV0dXJuZWQgdmFsdWUgaXMKICAgICAgICAgPENPREU+TlVMTDwvQ09ERT4gYW5kIHRoZSBnbG9iYWwgdmFyaWFibGUgPFZBUj5lcnJubzwvVkFSPiBpcyBzZXQgdG8gPENPREU+RU5PTUVNPC9DT0RFPi4KICAgICAgICAgRGVzcGl0ZSB0aGUgcmV0dXJuIHZhbHVlIHR5cGUgYmVpbmcgPENPREU+Y2hhciAqPC9DT0RFPiB0aGUgcmV0dXJuIHN0cmluZyBtdXN0CiAgICAgICAgIG5vdCBiZSBjaGFuZ2VkLiAgSXQgaXMgYWxsb2NhdGVkIGludGVybmFsbHkgYnkgdGhlIDxDT0RFPnRleHRkb21haW48L0NPREU+CiAgICAgICAgIGZ1bmN0aW9uLgogICAgICAgICA8YnI+PGJyPiBJZiB0aGUgPFZBUj5kb21haW5uYW1lPC9WQVI+IHBhcmFtZXRlciBpcyB0aGUgbnVsbCBwb2ludGVyIG5vIG5ldyBkZWZhdWx0CiAgICAgICAgIGRvbWFpbiBpcyBzZXQuICBJbnN0ZWFkIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZGVmYXVsdCBkb21haW4gaXMKICAgICAgICAgcmV0dXJuZWQuCiAgICAgICAgIDxicj48YnI+IElmIHRoZSA8VkFSPmRvbWFpbm5hbWU8L1ZBUj4gcGFyYW1ldGVyIGlzIHRoZSBlbXB0eSBzdHJpbmcgdGhlIGRlZmF1bHQgZG9tYWluCiAgICAgICAgIGlzIHJlc2V0IHRvIGl0cyBpbml0aWFsIHZhbHVlLCB0aGUgZG9tYWluIHdpdGggdGhlIG5hbWUgPENPREU+bWVzc2FnZXM8L0NPREU+LgogICAgICAgICBUaGlzIHBvc3NpYmlsaXR5IGlzIHF1ZXN0aW9uYWJsZSB0byB1c2Ugc2luY2UgdGhlIGRvbWFpbiA8Q09ERT5tZXNzYWdlczwvQ09ERT4KICAgICAgICAgcmVhbGx5IG5ldmVyIHNob3VsZCBiZSB1c2VkLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAlsaWJpbnRsLmh4cQB+HQ50ABZjb25zdCBjaGFyICpkb21haW5uYW1ldAAGY2hhciAqdAAFdGZpbmRzcQB+AAp0Aa8KICAgICAgICBUaGUgPENPREU+dGZpbmQ8L0NPREU+IGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gdGhlIDxDT0RFPnRzZWFyY2g8L0NPREU+IGZ1bmN0aW9uLiAgSXQKICAgICAgICAgbG9jYXRlcyBhbiBlbGVtZW50IG1hdGNoaW5nIHRoZSBvbmUgcG9pbnRlZCB0byBieSA8VkFSPmtleTwvVkFSPiBhbmQgcmV0dXJucwogICAgICAgICBhIHBvaW50ZXIgdG8gdGhpcyBlbGVtZW50LiAgQnV0IGlmIG5vIG1hdGNoaW5nIGVsZW1lbnQgaXMgYXZhaWxhYmxlIG5vCiAgICAgICAgIG5ldyBlbGVtZW50IGlzIGVudGVyZWQgKG5vdGUgdGhhdCB0aGUgPFZBUj5yb290cDwvVkFSPiBwYXJhbWV0ZXIgcG9pbnRzIHRvIGEKICAgICAgICAgY29uc3RhbnQgcG9pbnRlcikuICBJbnN0ZWFkIHRoZSBmdW5jdGlvbiByZXR1cm5zIDxDT0RFPk5VTEw8L0NPREU+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAhzZWFyY2guaHhxAH4dFXQAO2NvbnN0IHZvaWQgKmtleSwgdm9pZCAqY29uc3QgKnJvb3RwLCBjb21wYXJpc29uX2ZuX3QgY29tcGFydAAGdm9pZCAqdAAGdGdhbW1hc3EAfgAKdAEnCiAgICAgICAgPENPREU+dGdhbW1hPC9DT0RFPiBhcHBsaWVzIHRoZSBnYW1tYSBmdW5jdGlvbiB0byA8VkFSPng8L1ZBUj4uICBUaGUgZ2FtbWEKICAgICAgICAgZnVuY3Rpb24gaXMgZGVmaW5lZCBhcwoKCiAgICAgICAgIDxwcmU+PGJyPgogICAgICAgICBnYW1tYSAoeCkgPSBpbnRlZ3JhbCBmcm9tIDAgdG8gaW5maW5pdHl7fSBvZiB0Xih4LTEpIGVeLXQgZHQ8YnI+CiAgICAgICAgIDwvcHJlPgoKICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiB3YXMgaW50cm9kdWNlZCBpbiBJU08gQzk5LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZtYXRoLmh4cQB+HRx0AAhkb3VibGUgeHQABmRvdWJsZXQAB3RnYW1tYWZzcQB+AAp0AScKICAgICAgICA8Q09ERT50Z2FtbWE8L0NPREU+IGFwcGxpZXMgdGhlIGdhbW1hIGZ1bmN0aW9uIHRvIDxWQVI+eDwvVkFSPi4gIFRoZSBnYW1tYQogICAgICAgICBmdW5jdGlvbiBpcyBkZWZpbmVkIGFzCgoKICAgICAgICAgPHByZT48YnI+CiAgICAgICAgIGdhbW1hICh4KSA9IGludGVncmFsIGZyb20gMCB0byBpbmZpbml0eXt9IG9mIHReKHgtMSkgZV4tdCBkdDxicj4KICAgICAgICAgPC9wcmU+CgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIHdhcyBpbnRyb2R1Y2VkIGluIElTTyBDOTkuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQABm1hdGguaHhxAH4dI3QAB2Zsb2F0IHh0AAVmbG9hdHQAB3RnYW1tYWxzcQB+AAp0AScKICAgICAgICA8Q09ERT50Z2FtbWE8L0NPREU+IGFwcGxpZXMgdGhlIGdhbW1hIGZ1bmN0aW9uIHRvIDxWQVI+eDwvVkFSPi4gIFRoZSBnYW1tYQogICAgICAgICBmdW5jdGlvbiBpcyBkZWZpbmVkIGFzCgoKICAgICAgICAgPHByZT48YnI+CiAgICAgICAgIGdhbW1hICh4KSA9IGludGVncmFsIGZyb20gMCB0byBpbmZpbml0eXt9IG9mIHReKHgtMSkgZV4tdCBkdDxicj4KICAgICAgICAgPC9wcmU+CgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIHdhcyBpbnRyb2R1Y2VkIGluIElTTyBDOTkuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQABm1hdGguaHhxAH4dKnQADWxvbmcgZG91YmxlIHh0AAtsb25nIGRvdWJsZXQABHRpbWVzcQB+AAp0AYQKICAgICAgICBUaGUgPENPREU+dGltZTwvQ09ERT4gZnVuY3Rpb24gcmV0dXJucyB0aGUgY3VycmVudCBjYWxlbmRhciB0aW1lIGFzIGEgdmFsdWUgb2YKICAgICAgICAgdHlwZSA8Q09ERT50aW1lX3Q8L0NPREU+LiAgSWYgdGhlIGFyZ3VtZW50IDxWQVI+cmVzdWx0PC9WQVI+IGlzIG5vdCBhIG51bGwgcG9pbnRlciwKICAgICAgICAgdGhlIGNhbGVuZGFyIHRpbWUgdmFsdWUgaXMgYWxzbyBzdG9yZWQgaW4gPENPREU+KjxWQVI+cmVzdWx0PC9WQVI+PC9DT0RFPi4gIElmIHRoZQogICAgICAgICBjdXJyZW50IGNhbGVuZGFyIHRpbWUgaXMgbm90IGF2YWlsYWJsZSwgdGhlIHZhbHVlCiAgICAgICAgIDxDT0RFPih0aW1lX3QpKC0xKTwvQ09ERT4gaXMgcmV0dXJuZWQuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQABnRpbWUuaHhxAH4dMXQADnRpbWVfdCAqcmVzdWx0dAAGdGltZV90dAAGdGltZWdtc3EAfgAKdAK6CiAgICAgICAgPGJyPjxicj4gPENPREU+dGltZWdtPC9DT0RFPiBpcyBmdW5jdGlvbmFsbHkgaWRlbnRpY2FsIHRvIDxDT0RFPm1rdGltZTwvQ09ERT4gZXhjZXB0IGl0CiAgICAgICAgIGFsd2F5cyB0YWtlcyB0aGUgaW5wdXQgdmFsdWVzIHRvIGJlIENvb3JkaW5hdGVkIFVuaXZlcnNhbCBUaW1lIChVVEMpCiAgICAgICAgIHJlZ2FyZGxlc3Mgb2YgYW55IGxvY2FsIHRpbWUgem9uZSBzZXR0aW5nLgogICAgICAgICA8YnI+PGJyPiBOb3RlIHRoYXQgPENPREU+dGltZWdtPC9DT0RFPiBpcyB0aGUgaW52ZXJzZSBvZiA8Q09ERT5nbXRpbWU8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBQb3J0YWJpbGl0eSBub3RlOiAgPENPREU+bWt0aW1lPC9DT0RFPiBpcyBlc3NlbnRpYWxseSB1bml2ZXJzYWxseQogICAgICAgICBhdmFpbGFibGUuICA8Q09ERT50aW1lZ208L0NPREU+IGlzIHJhdGhlciByYXJlLiAgRm9yIHRoZSBtb3N0IHBvcnRhYmxlCiAgICAgICAgIGNvbnZlcnNpb24gZnJvbSBhIFVUQyBicm9rZW4tZG93biB0aW1lIHRvIGEgc2ltcGxlIHRpbWUsIHNldAogICAgICAgICB0aGUgPENPREU+VFo8L0NPREU+IGVudmlyb25tZW50IHZhcmlhYmxlIHRvIFVUQywgY2FsbCA8Q09ERT5ta3RpbWU8L0NPREU+LCB0aGVuIHNldAogICAgICAgICA8Q09ERT5UWjwvQ09ERT4gYmFjay4KICAgICAgICAgPGJyPjxicj4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGdGltZS5oeHEAfh04dAAVc3RydWN0IHRtICpicm9rZW50aW1ldAAGdGltZV90dAAJdGltZWxvY2Fsc3EAfgAKdAF5CiAgICAgICAgPGJyPjxicj4gPENPREU+dGltZWxvY2FsPC9DT0RFPiBpcyBmdW5jdGlvbmFsbHkgaWRlbnRpY2FsIHRvIDxDT0RFPm1rdGltZTwvQ09ERT4sIGJ1dCBtb3JlCiAgICAgICAgIG1uZW1vbmljYWxseSBuYW1lZC4gIE5vdGUgdGhhdCBpdCBpcyB0aGUgaW52ZXJzZSBvZiB0aGUgPENPREU+bG9jYWx0aW1lPC9DT0RFPgogICAgICAgICBmdW5jdGlvbi4KICAgICAgICAgPGJyPjxicj4gUG9ydGFiaWxpdHkgbm90ZTogIDxDT0RFPm1rdGltZTwvQ09ERT4gaXMgZXNzZW50aWFsbHkgdW5pdmVyc2FsbHkKICAgICAgICAgYXZhaWxhYmxlLiAgPENPREU+dGltZWxvY2FsPC9DT0RFPiBpcyByYXRoZXIgcmFyZS4KICAgICAgICAgPGJyPjxicj4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGdGltZS5oeHEAfh0/dAAVc3RydWN0IHRtICpicm9rZW50aW1ldAAGdGltZV90dAAFdGltZXNzcQB+AAp0AWMKICAgICAgICBUaGUgPENPREU+dGltZXM8L0NPREU+IGZ1bmN0aW9uIHN0b3JlcyB0aGUgcHJvY2Vzc29yIHRpbWUgaW5mb3JtYXRpb24gZm9yCiAgICAgICAgIHRoZSBjYWxsaW5nIHByb2Nlc3MgaW4gPFZBUj5idWZmZXI8L1ZBUj4uCiAgICAgICAgIDxicj48YnI+IFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIGNhbGxpbmcgcHJvY2VzcycgQ1BVIHRpbWUgKHRoZSBzYW1lIHZhbHVlIHlvdQogICAgICAgICBnZXQgZnJvbSA8Q09ERT5jbG9jaygpPC9DT0RFPi4gIDxDT0RFPnRpbWVzPC9DT0RFPiByZXR1cm5zIDxDT0RFPihjbG9ja190KSgtMSk8L0NPREU+IHRvCiAgICAgICAgIGluZGljYXRlIGZhaWx1cmUuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAC3N5cy90aW1lcy5oeHEAfh1GdAASc3RydWN0IHRtcyAqYnVmZmVydAAHY2xvY2tfdHQAB3RtcGZpbGVzcQB+AAp0ApAKICAgICAgICBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSB0ZW1wb3JhcnkgYmluYXJ5IGZpbGUgZm9yIHVwZGF0ZSBtb2RlLCBhcyBpZiBieQogICAgICAgICBjYWxsaW5nIDxDT0RFPmZvcGVuPC9DT0RFPiB3aXRoIG1vZGUgPENPREU+IndiKyI8L0NPREU+LiAgVGhlIGZpbGUgaXMgZGVsZXRlZAogICAgICAgICBhdXRvbWF0aWNhbGx5IHdoZW4gaXQgaXMgY2xvc2VkIG9yIHdoZW4gdGhlIHByb2dyYW0gdGVybWluYXRlcy4gIChPbgogICAgICAgICBzb21lIG90aGVyIElTTyBDIHN5c3RlbXMgdGhlIGZpbGUgbWF5IGZhaWwgdG8gYmUgZGVsZXRlZCBpZiB0aGUgcHJvZ3JhbQogICAgICAgICB0ZXJtaW5hdGVzIGFibm9ybWFsbHkpLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIGlzIHJlZW50cmFudC4KICAgICAgICAgPGJyPjxicj4gV2hlbiB0aGUgc291cmNlcyBhcmUgY29tcGlsZWQgd2l0aCA8Q09ERT5fRklMRV9PRkZTRVRfQklUUyA9PSA2NDwvQ09ERT4gb24gYQogICAgICAgICAzMi1iaXQgc3lzdGVtIHRoaXMgZnVuY3Rpb24gaXMgaW4gZmFjdCA8Q09ERT50bXBmaWxlNjQ8L0NPREU+LCBpLmUuLCB0aGUgTEZTCiAgICAgICAgIGludGVyZmFjZSB0cmFuc3BhcmVudGx5IHJlcGxhY2VzIHRoZSBvbGQgaW50ZXJmYWNlLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAdzdGRpby5oeHEAfh1NdAAEdm9pZHQABkZJTEUgKnQACXRtcGZpbGU2NHNxAH4ACnQCiQogICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byA8Q09ERT50bXBmaWxlPC9DT0RFPiwgYnV0IHRoZSBzdHJlYW0gaXQgcmV0dXJucyBhCiAgICAgICAgIHBvaW50ZXIgdG8gd2FzIG9wZW5lZCB1c2luZyA8Q09ERT50bXBmaWxlNjQ8L0NPREU+LiAgVGhlcmVmb3JlIHRoaXMgc3RyZWFtIGNhbgogICAgICAgICBiZSB1c2VkIGZvciBmaWxlcyBsYXJnZXIgdGhlbiAyXjMxIGJ5dGVzIG9uIDMyLWJpdCBtYWNoaW5lcy4KICAgICAgICAgPGJyPjxicj4gUGxlYXNlIG5vdGUgdGhhdCB0aGUgcmV0dXJuIHR5cGUgaXMgc3RpbGwgPENPREU+RklMRSAqPC9DT0RFPi4gIFRoZXJlIGlzIG5vCiAgICAgICAgIHNwZWNpYWwgPENPREU+RklMRTwvQ09ERT4gdHlwZSBmb3IgdGhlIExGUyBpbnRlcmZhY2UuCiAgICAgICAgIDxicj48YnI+IElmIHRoZSBzb3VyY2VzIGFyZSBjb21waWxlZCB3aXRoIDxDT0RFPl9GSUxFX09GRlNFVF9CSVRTID09IDY0PC9DT0RFPiBvbiBhIDMyCiAgICAgICAgIGJpdHMgbWFjaGluZSB0aGlzIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSB1bmRlciB0aGUgbmFtZSA8Q09ERT50bXBmaWxlPC9DT0RFPgogICAgICAgICBhbmQgc28gdHJhbnNwYXJlbnRseSByZXBsYWNlcyB0aGUgb2xkIGludGVyZmFjZS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHc3RkaW8uaHhxAH4dVHQABHZvaWR0AAZGSUxFICp0AAZ0bXBuYW1zcQB+AAp0BV4KICAgICAgICBUaGlzIGZ1bmN0aW9uIGNvbnN0cnVjdHMgYW5kIHJldHVybnMgYSB2YWxpZCBmaWxlIG5hbWUgdGhhdCBkb2VzIG5vdAogICAgICAgICByZWZlciB0byBhbnkgZXhpc3RpbmcgZmlsZS4gIElmIHRoZSA8VkFSPnJlc3VsdDwvVkFSPiBhcmd1bWVudCBpcyBhIG51bGwKICAgICAgICAgcG9pbnRlciwgdGhlIHJldHVybiB2YWx1ZSBpcyBhIHBvaW50ZXIgdG8gYW4gaW50ZXJuYWwgc3RhdGljIHN0cmluZywKICAgICAgICAgd2hpY2ggbWlnaHQgYmUgbW9kaWZpZWQgYnkgc3Vic2VxdWVudCBjYWxscyBhbmQgdGhlcmVmb3JlIG1ha2VzIHRoaXMKICAgICAgICAgZnVuY3Rpb24gbm9uLXJlZW50cmFudC4gIE90aGVyd2lzZSwgdGhlIDxWQVI+cmVzdWx0PC9WQVI+IGFyZ3VtZW50IHNob3VsZCBiZQogICAgICAgICBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgYXQgbGVhc3QgPENPREU+TF90bXBuYW08L0NPREU+IGNoYXJhY3RlcnMsIGFuZCB0aGUKICAgICAgICAgcmVzdWx0IGlzIHdyaXR0ZW4gaW50byB0aGF0IGFycmF5LgogICAgICAgICA8YnI+PGJyPiBJdCBpcyBwb3NzaWJsZSBmb3IgPENPREU+dG1wbmFtPC9DT0RFPiB0byBmYWlsIGlmIHlvdSBjYWxsIGl0IHRvbyBtYW55IHRpbWVzCiAgICAgICAgIHdpdGhvdXQgcmVtb3ZpbmcgcHJldmlvdXNseS1jcmVhdGVkIGZpbGVzLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBsaW1pdGVkCiAgICAgICAgIGxlbmd0aCBvZiB0aGUgdGVtcG9yYXJ5IGZpbGUgbmFtZXMgZ2l2ZXMgcm9vbSBmb3Igb25seSBhIGZpbml0ZSBudW1iZXIKICAgICAgICAgb2YgZGlmZmVyZW50IG5hbWVzLiAgSWYgPENPREU+dG1wbmFtPC9DT0RFPiBmYWlscyBpdCByZXR1cm5zIGEgbnVsbCBwb2ludGVyLgogICAgICAgICA8YnI+PGJyPiBXYXJuaW5nOiBCZXR3ZWVuIHRoZSB0aW1lIHRoZSBwYXRobmFtZSBpcyBjb25zdHJ1Y3RlZCBhbmQgdGhlCiAgICAgICAgIGZpbGUgaXMgY3JlYXRlZCBhbm90aGVyIHByb2Nlc3MgbWlnaHQgaGF2ZSBjcmVhdGVkIGEgZmlsZSB3aXRoIHRoZSBzYW1lCiAgICAgICAgIG5hbWUgdXNpbmcgPENPREU+dG1wbmFtPC9DT0RFPiwgbGVhZGluZyB0byBhIHBvc3NpYmxlIHNlY3VyaXR5IGhvbGUuICBUaGUKICAgICAgICAgaW1wbGVtZW50YXRpb24gZ2VuZXJhdGVzIG5hbWVzIHdoaWNoIGNhbiBoYXJkbHkgYmUgcHJlZGljdGVkLCBidXQgd2hlbgogICAgICAgICBvcGVuaW5nIHRoZSBmaWxlIHlvdSBzaG91bGQgdXNlIHRoZSA8Q09ERT5PX0VYQ0w8L0NPREU+IGZsYWcuICBVc2luZwogICAgICAgICA8Q09ERT50bXBmaWxlPC9DT0RFPiBvciA8Q09ERT5ta3N0ZW1wPC9DT0RFPiBpcyBhIHNhZmUgd2F5IHRvIGF2b2lkIHRoaXMgcHJvYmxlbS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHc3RkaW8uaHhxAH4dW3QADGNoYXIgKnJlc3VsdHQABmNoYXIgKnQACHRtcG5hbV9yc3EAfgAKdAGmCiAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBuZWFybHkgaWRlbnRpY2FsIHRvIHRoZSA8Q09ERT50bXBuYW08L0NPREU+IGZ1bmN0aW9uLCBleGNlcHQKICAgICAgICAgdGhhdCBpZiA8VkFSPnJlc3VsdDwvVkFSPiBpcyBhIG51bGwgcG9pbnRlciBpdCByZXR1cm5zIGEgbnVsbCBwb2ludGVyLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGd1YXJhbnRlZXMgcmVlbnRyYW5jeSBiZWNhdXNlIHRoZSBub24tcmVlbnRyYW50IHNpdHVhdGlvbiBvZgogICAgICAgICA8Q09ERT50bXBuYW08L0NPREU+IGNh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bnR0AAp0cnVuY2F0ZTY0c3EAfgAKdAIPCiAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIHRoZSA8Q09ERT50cnVuY2F0ZTwvQ09ERT4gZnVuY3Rpb24uICBUaGUKICAgICAgICAgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZSA8VkFSPmxlbmd0aDwvVkFSPiBhcmd1bWVudCBpcyA2NCBiaXRzIHdpZGUgZXZlbiBvbiAzMgogICAgICAgICBiaXRzIG1hY2hpbmVzLCB3aGljaCBhbGxvd3MgdGhlIGhhbmRsaW5nIG9mIGZpbGVzIHdpdGggc2l6ZXMgdXAgdG8KICAgICAgICAgMl42MyBieXRlcy4KICAgICAgICAgPGJyPjxicj4gV2hlbiB0aGUgc291cmNlIGZpbGUgaXMgY29tcGlsZWQgd2l0aCA8Q09ERT5fRklMRV9PRkZTRVRfQklUUyA9PSA2NDwvQ09ERT4gb24gYQogICAgICAgICAzMiBiaXRzIG1hY2hpbmUgdGhpcyBmdW5jdGlvbiBpcyBhY3R1YWxseSBhdmFpbGFibGUgdW5kZXIgdGhlIG5hbWUKICAgICAgICAgPENPREU+dHJ1bmNhdGU8L0NPREU+IGFuZCBzbyB0cmFuc3BhcmVudGx5IHJlcGxhY2VzIHRoZSAzMiBiaXRzIGludGVyZmFjZS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIdW5pc3RkLmh4cQB+HaF0ACBjb25zdCBjaGFyICpuYW1lLCBvZmY2NF90IGxlbmd0aHQAA2ludHQABnRydW5jZnNxAH4ACnQBCAogICAgICAgIFRoZSA8Q09ERT50cnVuYzwvQ09ERT4gZnVuY3Rpb25zIHJvdW5kIDxWQVI+eDwvVkFSPiB0b3dhcmRzIHplcm8gdG8gdGhlIG5lYXJlc3QKICAgICAgICAgaW50ZWdlciAocmV0dXJuZWQgaW4gZmxvYXRpbmctcG9pbnQgZm9ybWF0KS4gIFRodXMsIDxDT0RFPnRydW5jICgxLjUpPC9DT0RFPgogICAgICAgICBpcyA8Q09ERT4xLjA8L0NPREU+IGFuZCA8Q09ERT50cnVuYyAoLTEuNSk8L0NPREU+IGlzIDxDT0RFPi0xLjA8L0NPREU+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZtYXRoLmh4cQB+Hah0AAdmbG9hdCB4dAAFZmxvYXR0AAZ0cnVuY2xzcQB+AAp0AQgKICAgICAgICBUaGUgPENPREU+dHJ1bmM8L0NPREU+IGZ1bmN0aW9ucyByb3VuZCA8VkFSPng8L1ZBUj4gdG93YXJkcyB6ZXJvIHRvIHRoZSBuZWFyZXN0CiAgICAgICAgIGludGVnZXIgKHJldHVybmVkIGluIGZsb2F0aW5nLXBvaW50IGZvcm1hdCkuICBUaHVzLCA8Q09ERT50cnVuYyAoMS41KTwvQ09ERT4KICAgICAgICAgaXMgPENPREU+MS4wPC9DT0RFPiBhbmQgPENPREU+dHJ1bmMgKC0xLjUpPC9DT0RFPiBpcyA8Q09ERT4tMS4wPC9DT0RFPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGbWF0aC5oeHEAfh2vdAANbG9uZyBkb3VibGUgeHQAC2xvbmcgZG91YmxldAAHdHNlYXJjaHNxAH4ACnQGRQogICAgICAgIFRoZSA8Q09ERT50c2VhcmNoPC9DT0RFPiBmdW5jdGlvbiBzZWFyY2hlcyBpbiB0aGUgdHJlZSBwb2ludGVkIHRvIGJ5CiAgICAgICAgIDxDT0RFPio8VkFSPnJvb3RwPC9WQVI+PC9DT0RFPiBmb3IgYW4gZWxlbWVudCBtYXRjaGluZyA8VkFSPmtleTwvVkFSPi4gIFRoZSBmdW5jdGlvbgogICAgICAgICBwb2ludGVkIHRvIGJ5IDxWQVI+Y29tcGFyPC9WQVI+IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdHdvIGVsZW1lbnRzCiAgICAgICAgIG1hdGNoLiAgLCBmb3IgYSBzcGVjaWZpY2F0aW9uIG9mIHRoZSBmdW5jdGlvbnMKICAgICAgICAgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRoZSA8VkFSPmNvbXBhcjwvVkFSPiBwYXJhbWV0ZXIuCiAgICAgICAgIDxicj48YnI+IElmIHRoZSB0cmVlIGRvZXMgbm90IGNvbnRhaW4gYSBtYXRjaGluZyBlbnRyeSB0aGUgPFZBUj5rZXk8L1ZBUj4gdmFsdWUgd2lsbAogICAgICAgICBiZSBhZGRlZCB0byB0aGUgdHJlZS4gIDxDT0RFPnRzZWFyY2g8L0NPREU+IGRvZXMgbm90IG1ha2UgYSBjb3B5IG9mIHRoZSBvYmplY3QKICAgICAgICAgcG9pbnRlZCB0byBieSA8VkFSPmtleTwvVkFSPiAoaG93IGNvdWxkIGl0IHNpbmNlIHRoZSBzaXplIGlzIHVua25vd24pLgogICAgICAgICBJbnN0ZWFkIGl0IGFkZHMgYSByZWZlcmVuY2UgdG8gdGhpcyBvYmplY3Qgd2hpY2ggbWVhbnMgdGhlIG9iamVjdCBtdXN0CiAgICAgICAgIGJlIGF2YWlsYWJsZSBhcyBsb25nIGFzIHRoZSB0cmVlIGRhdGEgc3RydWN0dXJlIGlzIHVzZWQuCiAgICAgICAgIDxicj48YnI+IFRoZSB0cmVlIGlzIHJlcHJlc2VudGVkIGJ5IGEgcG9pbnRlciB0byBhIHBvaW50ZXIgc2luY2UgaXQgaXMgc29tZXRpbWVzCiAgICAgICAgIG5lY2Vzc2FyeSB0byBjaGFuZ2UgdGhlIHJvb3Qgbm9kZSBvZiB0aGUgdHJlZS4gIFNvIGl0IG11c3Qgbm90IGJlCiAgICAgICAgIGFzc3VtZWQgdGhhdCB0aGUgdmFyaWFibGUgcG9pbnRlZCB0byBieSA8VkFSPnJvb3RwPC9WQVI+IGhhcyB0aGUgc2FtZSB2YWx1ZQogICAgICAgICBhZnRlciB0aGUgY2FsbC4gIFRoaXMgYWxzbyBzaG93cyB0aGF0IGl0IGlzIG5vdCBzYWZlIHRvIGNhbGwgdGhlCiAgICAgICAgIDxDT0RFPnRzZWFyY2g8L0NPREU+IGZ1bmN0aW9uIG1vcmUgdGhhbiBvbmNlIGF0IHRoZSBzYW1lIHRpbWUgdXNpbmcgdGhlIHNhbWUKICAgICAgICAgdHJlZS4gIEl0IGlzIG5vIHByb2JsZW0gdG8gcnVuIGl0IG1vcmUgdGhhbiBvbmNlIGF0IGEgdGltZSBvbiBkaWZmZXJlbnQKICAgICAgICAgdHJlZXMuCiAgICAgICAgIDxicj48YnI+IFRoZSByZXR1cm4gdmFsdWUgaXMgYSBwb2ludGVyIHRvIHRoZSBtYXRjaGluZyBlbGVtZW50IGluIHRoZSB0cmVlLiAgSWYgYQogICAgICAgICBuZXcgZWxlbWVudCB3YXMgY3JlYXRlZCB0aGUgcG9pbnRlciBwb2ludHMgdG8gdGhlIG5ldyBkYXRhICh3aGljaCBpcyBpbgogICAgICAgICBmYWN0IDxWQVI+a2V5PC9WQVI+KS4gIElmIGFuIGVudHJ5IGhhZCB0byBiZSBjcmVhdGVkIGFuZCB0aGUgcHJvZ3JhbSByYW4gb3V0CiAgICAgICAgIG9mIHNwYWNlIDxDT0RFPk5VTEw8L0NPREU+IGlzIHJldHVybmVkLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAhzZWFyY2guaHhxAH4dtnQANWNvbnN0IHZvaWQgKmtleSwgdm9pZCAqKnJvb3RwLCBjb21wYXJpc29uX2ZuX3QgY29tcGFydAAGdm9pZCAqdAAHdHR5bmFtZXNxAH4ACnQBlwogICAgICAgIElmIHRoZSBmaWxlIGRlc2NyaXB0b3IgPFZBUj5maWxlZGVzPC9WQVI+IGlzIGFzc29jaWF0ZWQgd2l0aCBhIHRlcm1pbmFsCiAgICAgICAgIGRldmljZSwgdGhlIDxDT0RFPnR0eW5hbWU8L0NPREU+IGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIHRvIGEKICAgICAgICAgc3RhdGljYWxseS1hbGxvY2F0ZWQsIG51bGwtdGVybWluYXRlZCBzdHJpbmcgY29udGFpbmluZyB0aGUgZmlsZSBuYW1lIG9mCiAgICAgICAgIHRoZSB0ZXJtaW5hbCBmaWxlLiAgVGhlIHZhbHVlIGlzIGEgbnVsbCBwb2ludGVyIGlmIHRoZSBmaWxlIGRlc2NyaXB0b3IKICAgICAgICAgaXNuJ3QgYXNzb2NpYXRlZCB3aXRoIGEgdGVybWluYWwsIG9yIHRoZSBmaWxlIG5hbWUgY2Fubm90IGJlIGRldGVybWluZWQuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHVuaXN0ZC5oeHEAfh29dAALaW50IGZpbGVkZXN0AAZjaGFyICp0AAl0dHluYW1lX3JzcQB+AAp0A0YKICAgICAgICBUaGUgPENPREU+dHR5bmFtZV9yPC9DT0RFPiBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIHRoZSA8Q09ERT50dHluYW1lPC9DT0RFPiBmdW5jdGlvbgogICAgICAgICBleGNlcHQgdGhhdCBpdCBwbGFjZXMgaXRzIHJlc3VsdCBpbnRvIHRoZSB1c2VyLXNwZWNpZmllZCBidWZmZXIgc3RhcnRpbmcKICAgICAgICAgYXQgPFZBUj5idWY8L1ZBUj4gd2l0aCBsZW5ndGggPFZBUj5sZW48L1ZBUj4uCiAgICAgICAgIDxicj48YnI+IFRoZSBub3JtYWwgcmV0dXJuIHZhbHVlIGZyb20gPENPREU+dHR5bmFtZV9yPC9DT0RFPiBpcyAwLiAgT3RoZXJ3aXNlIGFuCiAgICAgICAgIGVycm9yIG51bWJlciBpcyByZXR1cm5lZCB0byBpbmRpY2F0ZSB0aGUgZXJyb3IuICBUaGUgZm9sbG93aW5nCiAgICAgICAgIDxDT0RFPmVycm5vPC9DT0RFPiBlcnJvciBjb25kaXRpb25zIGFyZSBkZWZpbmVkIGZvciB0aGlzIGZ1bmN0aW9uOgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8RFQ+PENPREU+RUJBREY8L0NPREU+CjxERD4KICAgICAgICAgVGhlIDxWQVI+ZmlsZWRlczwvVkFSPiBhcmd1bWVudCBpcyBub3QgYSB2YWxpZCBmaWxlIGRlc2NyaXB0b3IuCiAgICAgICAgIDxicj48YnI+IDxMST4gRU5PVFRZCiAgICAgICAgIFRoZSA8VkFSPmZpbGVkZXM8L1ZBUj4gaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhIHRlcm1pbmFsLgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVSQU5HRQogICAgICAgICBUaGUgYnVmZmVyIGxlbmd0aCA8VkFSPmxlbjwvVkFSPiBpcyB0b28gc21hbGwgdG8gc3RvcmUgdGhlIHN0cmluZyB0byBiZQogICAgICAgICByZXR1cm5lZC4KCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHVuaXN0ZC5oeHEAfh3EdAAiaW50IGZpbGVkZXMsIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbnQAA2ludHQABXR3YWxrc3EAfgAKdARkCiAgICAgICAgRm9yIGVhY2ggbm9kZSBpbiB0aGUgdHJlZSB3aXRoIGEgbm9kZSBwb2ludGVkIHRvIGJ5IDxWQVI+cm9vdDwvVkFSPiwgdGhlCiAgICAgICAgIDxDT0RFPnR3YWxrPC9DT0RFPiBmdW5jdGlvbiBjYWxscyB0aGUgZnVuY3Rpb24gcHJvdmlkZWQgYnkgdGhlIHBhcmFtZXRlcgogICAgICAgICA8VkFSPmFjdGlvbjwvVkFSPi4gIEZvciBsZWFmIG5vZGVzIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZXhhY3RseSBvbmNlIHdpdGgKICAgICAgICAgPFZBUj52YWx1ZTwvVkFSPiBzZXQgdG8gPENPREU+bGVhZjwvQ09ERT4uICBGb3IgaW50ZXJuYWwgbm9kZXMgdGhlIGZ1bmN0aW9uIGlzCiAgICAgICAgIGNhbGxlZCB0aHJlZSB0aW1lcywgc2V0dGluZyB0aGUgPFZBUj52YWx1ZTwvVkFSPiBwYXJhbWV0ZXIgb3IgPFZBUj5hY3Rpb248L1ZBUj4gdG8KICAgICAgICAgdGhlIGFwcHJvcHJpYXRlIHZhbHVlLiAgVGhlIDxWQVI+bGV2ZWw8L1ZBUj4gYXJndW1lbnQgZm9yIHRoZSA8VkFSPmFjdGlvbjwvVkFSPgogICAgICAgICBmdW5jdGlvbiBpcyBjb21wdXRlZCB3aGlsZSBkZXNjZW5kaW5nIHRoZSB0cmVlIHdpdGggaW5jcmVhc2luZyB0aGUgdmFsdWUKICAgICAgICAgYnkgb25lIGZvciB0aGUgZGVzY2VuZCB0byBhIGNoaWxkLCBzdGFydGluZyB3aXRoIHRoZSB2YWx1ZSAwIGZvcgogICAgICAgICB0aGUgcm9vdCBub2RlLgogICAgICAgICA8YnI+PGJyPiBTaW5jZSB0aGUgZnVuY3Rpb25zIHVzZWQgZm9yIHRoZSA8VkFSPmFjdGlvbjwvVkFSPiBwYXJhbWV0ZXIgdG8gPENPREU+dHdhbGs8L0NPREU+CiAgICAgICAgIG11c3Qgbm90IG1vZGlmeSB0aGUgdHJlZSBkYXRhLCBpdCBpcyBzYWZlIHRvIHJ1biA8Q09ERT50d2FsazwvQ09ERT4gaW4gbW9yZQogICAgICAgICB0aGFuIG9uZSB0aHJlYWQgYXQgdGhlIHNhbWUgdGltZSwgd29ya2luZyBvbiB0aGUgc2FtZSB0cmVlLiAgSXQgaXMgYWxzbwogICAgICAgICBzYWZlIHRvIGNhbGwgPENPREU+dGZpbmQ8L0NPREU+IGluIHBhcmFsbGVsLiAgRnVuY3Rpb25zIHdoaWNoIG1vZGlmeSB0aGUgdHJlZQogICAgICAgICBtdXN0IG5vdCBiZSB1c2VkLCBvdGhlcndpc2UgdGhlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZC4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc2VhcmNoLmh4cQB+Hct0ACZjb25zdCB2b2lkICpyb290LCBfX2FjdGlvbl9mbl90IGFjdGlvbnQABHZvaWR0AAV0enNldHNxAH4ACnQBdQogICAgICAgIFRoZSA8Q09ERT50enNldDwvQ09ERT4gZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIDxDT0RFPnR6bmFtZTwvQ09ERT4gdmFyaWFibGUgZnJvbQogICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIDxDT0RFPlRaPC9DT0RFPiBlbnZpcm9ubWVudCB2YXJpYWJsZS4gIEl0IGlzIG5vdCB1c3VhbGx5CiAgICAgICAgIG5lY2Vzc2FyeSBmb3IgeW91ciBwcm9ncmFtIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiwgYmVjYXVzZSBpdCBpcyBjYWxsZWQKICAgICAgICAgYXV0b21hdGljYWxseSB3aGVuIHlvdSB1c2UgdGhlIG90aGVyIHRpbWUgY29udmVyc2lvbiBmdW5jdGlvbnMgdGhhdAogICAgICAgICBkZXBlbmQgb24gdGhlIHRpbWUgem9uZS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAGdGltZS5oeHEAfh3SdAAEdm9pZHQABHZvaWR0AAZ1bGltaXRzcQB+AAp0BiQKICAgICAgICA8YnI+PGJyPiA8Q09ERT51bGltaXQ8L0NPREU+IGdldHMgdGhlIGN1cnJlbnQgbGltaXQgb3Igc2V0cyB0aGUgY3VycmVudCBhbmQgbWF4aW11bQogICAgICAgICBsaW1pdCBmb3IgYSBwYXJ0aWN1bGFyIHJlc291cmNlIGZvciB0aGUgY2FsbGluZyBwcm9jZXNzIGFjY29yZGluZyB0byB0aGUKICAgICAgICAgY29tbWFuZCA8VkFSPmNtZDwvVkFSPi5hCiAgICAgICAgIDxicj48YnI+IElmIHlvdSBhcmUgZ2V0dGluZyBhIGxpbWl0LCB0aGUgY29tbWFuZCBhcmd1bWVudCBpcyB0aGUgb25seSBhcmd1bWVudC4KICAgICAgICAgSWYgeW91IGFyZSBzZXR0aW5nIGEgbGltaXQsIHRoZXJlIGlzIGEgc2Vjb25kIGFyZ3VtZW50OgogICAgICAgICA8Q09ERT5sb25nIGludDwvQ09ERT4gPFZBUj5saW1pdDwvVkFSPiB3aGljaCBpcyB0aGUgdmFsdWUgdG8gd2hpY2ggeW91IGFyZSBzZXR0aW5nCiAgICAgICAgIHRoZSBsaW1pdC4KICAgICAgICAgPGJyPjxicj4gVGhlIDxWQVI+Y21kPC9WQVI+IHZhbHVlcyBhbmQgdGhlIG9wZXJhdGlvbnMgdGhleSBzcGVjaWZ5IGFyZToKICAgICAgICAgPERMPgoKICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPkdFVEZTSVpFPC9DT0RFPgo8REQ+CiAgICAgICAgIEdldCB0aGUgY3VycmVudCBsaW1pdCBvbiB0aGUgc2l6ZSBvZiBhIGZpbGUsIGluIHVuaXRzIG9mIDUxMiBieXRlcy4KICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPlNFVEZTSVpFPC9DT0RFPgo8REQ+CiAgICAgICAgIFNldCB0aGUgY3VycmVudCBhbmQgbWF4aW11bSBsaW1pdCBvbiB0aGUgc2l6ZSBvZiBhIGZpbGUgdG8gPFZBUj5saW1pdDwvVkFSPiAqCiAgICAgICAgIDUxMiBieXRlcy4KICAgICAgICAgPGJyPjxicj4KICAgICAgICAgPGJyPjxicj4gVGhlcmUgYXJlIGFsc28gc29tZSBvdGhlciA8VkFSPmNtZDwvVkFSPiB2YWx1ZXMgdGhhdCBtYXkgZG8gdGhpbmdzIG9uIHNvbWUKICAgICAgICAgc3lzdGVtcywgYnV0IHRoZXkgYXJlIG5vdCBzdXBwb3J0ZWQuCiAgICAgICAgIDxicj48YnI+IE9ubHkgdGhlIHN1cGVydXNlciBtYXkgaW5jcmVhc2UgYSBtYXhpbXVtIGxpbWl0LgogICAgICAgICA8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ZXQAA2ludHQAB3Vtb3VudDJzcQB+AAp0COoKICAgICAgICA8YnI+PGJyPiA8Q09ERT51bW91bnQyPC9DT0RFPiB1bm1vdW50cyBhIGZpbGVzeXN0ZW0uCiAgICAgICAgIDxicj48YnI+IFlvdSBjYW4gaWRlbnRpZnkgdGhlIGZpbGVzeXN0ZW0gdG8gdW5tb3VudCBlaXRoZXIgYnkgdGhlIGRldmljZSBzcGVjaWFsCiAgICAgICAgIGZpbGUgdGhhdCBjb250YWlucyB0aGUgZmlsZXN5c3RlbSBvciBieSB0aGUgbW91bnQgcG9pbnQuICBUaGUgZWZmZWN0IGlzCiAgICAgICAgIHRoZSBzYW1lLiAgU3BlY2lmeSBlaXRoZXIgYXMgdGhlIHN0cmluZyA8VkFSPmZpbGU8L1ZBUj4uCiAgICAgICAgIDxicj48YnI+IDxWQVI+ZmxhZ3M8L1ZBUj4gY29udGFpbnMgdGhlIG9uZS1iaXQgZmllbGQgaWRlbnRpZmllZCBieSB0aGUgZm9sbG93aW5nCiAgICAgICAgIG1hc2sgbWFjcm86CiAgICAgICAgIDxicj48YnI+IDxETD4KCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5NTlRfRk9SQ0U8L0NPREU+CjxERD4KICAgICAgICAgVGhpcyBiaXQgb24gbWVhbnMgdG8gZm9yY2UgdGhlIHVubW91bnRpbmcgZXZlbiBpZiB0aGUgZmlsZXN5c3RlbSBpcwogICAgICAgICBidXN5LCBieSBtYWtpbmcgaXQgdW5idXN5IGZpcnN0LiAgSWYgdGhlIGJpdCBpcyBvZmYgYW5kIHRoZSBmaWxlc3lzdGVtIGlzCiAgICAgICAgIGJ1c3ksIDxDT0RFPnVtb3VudDI8L0NPREU+IGZhaWxzIHdpdGggPENPREU+ZXJybm88L0NPREU+ID0gPENPREU+RUJVU1k8L0NPREU+LiAgRGVwZW5kaW5nCiAgICAgICAgIG9uIHRoZSBmaWxlc3lzdGVtLCB0aGlzIG1heSBvdmVycmlkZSBhbGwsIHNvbWUsIG9yIG5vIGJ1c3kgY29uZGl0aW9ucy4KICAgICAgICAgPGJyPjxicj4KICAgICAgICAgPGJyPjxicj4gQWxsIG90aGVyIGJpdHMgaW4gPFZBUj5mbGFnczwvVkFSPiBzaG91bGQgYmUgc2V0IHRvIHplcm87IG90aGVyd2lzZSwgdGhlIHJlc3VsdAogICAgICAgICBpcyB1bmRlZmluZWQuCiAgICAgICAgIDxicj48YnI+IEV4YW1wbGU6CiAgICAgICAgIDxicj48YnI+IDxwcmU+PGJyPgogICAgICAgICA8YnI+CiAgICAgICAgICNpbmNsdWRlIDxzeXMvbW91bnQuaD48YnI+CiAgICAgICAgIDxicj48YnI+IHVtb3VudDIoIi9tbnQiLCBNTlRfRk9SQ0UpOzxicj4KICAgICAgICAgPGJyPjxicj4gdW1vdW50MigiL2Rldi9oZGQxIiwgMCk7PGJyPgogICAgICAgICA8YnI+PGJyPiA8YnI+CiAgICAgICAgIDwvcHJlPgogICAgICAgICA8YnI+PGJyPiBBZnRlciB0aGUgZmlsZXN5c3RlbSBpcyB1bm1vdW50ZWQsIHRoZSBkaXJlY3RvcnkgdGhhdCB3YXMgdGhlIG1vdW50IHBvaW50CiAgICAgICAgIGlzIHZpc2libGUsIGFzIGFyZSBhbnkgZmlsZXMgaW4gaXQuCiAgICAgICAgIDxicj48YnI+IEFzIHBhcnQgb2YgdW5tb3VudGluZywgPENPREU+dW1vdW50MjwvQ09ERT4gc3luY3MgdGhlIGZpbGVzeXN0ZW0uCiAgICAgICAgIDxicj48YnI+IElmIHRoZSB1bm1vdW50aW5nIGlzIHN1Y2Nlc3NmdWwsIHRoZSByZXR1cm4gdmFsdWUgaXMgemVyby4gIE90aGVyd2lzZSwgaXQKICAgICAgICAgaXMgPENPREU+LTE8L0NPREU+IGFuZCA8Q09ERT5lcnJubzwvQ09ERT4gaXMgc2V0IGFjY29yZGluZ2x5OgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8TEk+IEVQRVJNCiAgICAgICAgIFRoZSBwcm9jZXNzIGlzIG5vdCBzdXBlcnVzZXIuCiAgICAgICAgIDxMST4gRUJVU1kKICAgICAgICAgVGhlIGZpbGVzeXN0ZW0gY2Fubm90IGJlIHVubW91bnRlZCBiZWNhdXNlIGl0IGlzIGJ1c3kuICBFLmcuIGl0IGNvbnRhaW5zCiAgICAgICAgIGEgZGlyZWN0b3J5IHRoYXQgaXMgc29tZSBwcm9jZXNzJ3Mgd29ya2luZyBkaXJlY3Rvcnkgb3IgYSBmaWxlIHRoYXQgc29tZQogICAgICAgICBwcm9jZXNzIGhhcyBvcGVuLiAgV2l0aCBzb21lIGZpbGVzeXN0ZW1zIGluIHNvbWUgY2FzZXMsIHlvdSBjYW4gYXZvaWQKICAgICAgICAgdGhpcyBmYWlsdXJlIHdpdGggdGhlIDxDT0RFPk1OVF9GT1JDRTwvQ09ERT4gb3B0aW9uLgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVJTlZBTAogICAgICAgICA8VkFSPmZpbGU8L1ZBUj4gdmFsaWRseSByZWZlcnMgdG8gYSBmaWxlLCBidXQgdGhhdCBmaWxlIGlzIG5laXRoZXIgYSBtb3VudAogICAgICAgICBwb2ludCBub3IgYSBkZXZpY2Ugc3BlY2lhbCBmaWxlIG9mIGEgY3VycmVudGx5IG1vdW50ZWQgZmlsZXN5c3RlbS4KICAgICAgICAgPGJyPjxicj4KPC9ETD4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiBpcyBub3QgYXZhaWxhYmxlIG9uIGFsbCBzeXN0ZW1zLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAtzeXMvbW91bnQuaHhxAH4d73QAG2NvbnN0IGNoYXIgKmZpbGUsIGludCBmbGFnc3QAA2ludHQABXVuYW1lc3EAfgAKdAHBCiAgICAgICAgVGhlIDxDT0RFPnVuYW1lPC9DT0RFPiBmdW5jdGlvbiBmaWxscyBpbiB0aGUgc3RydWN0dXJlIHBvaW50ZWQgdG8gYnkKICAgICAgICAgPFZBUj5pbmZvPC9WQVI+IHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9wZXJhdGluZyBzeXN0ZW0gYW5kIGhvc3QgbWFjaGluZS4KICAgICAgICAgQSBub24tbmVnYXRpdmUgdmFsdWUgaW5kaWNhdGVzIHRoYXQgdGhlIGRhdGEgd2FzIHN1Y2Nlc3NmdWxseSBzdG9yZWQuCiAgICAgICAgIDxicj48YnI+IDxDT0RFPi0xPC9DT0RFPiBhcyB0aGUgdmFsdWUgaW5kaWNhdGVzIGFuIGVycm9yLiAgVGhlIG9ubHkgZXJyb3IgcG9zc2libGUgaXMKICAgICAgICAgPENPREU+RUZBVUxUPC9DT0RFPiwgd2hpY2ggd2Ugbm9ybWFsbHkgZG9uJ3QgbWVudGlvbiBhcyBpdCBpcyBhbHdheXMgYQogICAgICAgICBwb3NzaWJpbGl0eS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAANc3lzL3V0c25hbWUuaHhxAH4d9nQAFHN0cnVjdCB1dHNuYW1lICppbmZvdAADaW50dAAGdW5nZXRjc3EAfgAKdAgOCiAgICAgICAgVGhlIDxDT0RFPnVuZ2V0YzwvQ09ERT4gZnVuY3Rpb24gcHVzaGVzIGJhY2sgdGhlIGNoYXJhY3RlciA8VkFSPmM8L1ZBUj4gb250byB0aGUKICAgICAgICAgaW5wdXQgc3RyZWFtIDxWQVI+c3RyZWFtPC9WQVI+LiAgU28gdGhlIG5leHQgaW5wdXQgZnJvbSA8VkFSPnN0cmVhbTwvVkFSPiB3aWxsCiAgICAgICAgIHJlYWQgPFZBUj5jPC9WQVI+IGJlZm9yZSBhbnl0aGluZyBlbHNlLgogICAgICAgICA8YnI+PGJyPiBJZiA8VkFSPmM8L1ZBUj4gaXMgPENPREU+RU9GPC9DT0RFPiwgPENPREU+dW5nZXRjPC9DT0RFPiBkb2VzIG5vdGhpbmcgYW5kIGp1c3QgcmV0dXJucwogICAgICAgICA8Q09ERT5FT0Y8L0NPREU+LiAgVGhpcyBsZXRzIHlvdSBjYWxsIDxDT0RFPnVuZ2V0YzwvQ09ERT4gd2l0aCB0aGUgcmV0dXJuIHZhbHVlIG9mCiAgICAgICAgIDxDT0RFPmdldGM8L0NPREU+IHdpdGhvdXQgbmVlZGluZyB0byBjaGVjayBmb3IgYW4gZXJyb3IgZnJvbSA8Q09ERT5nZXRjPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gVGhlIGNoYXJhY3RlciB0aGF0IHlvdSBwdXNoIGJhY2sgZG9lc24ndCBoYXZlIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBsYXN0CiAgICAgICAgIGNoYXJhY3RlciB0aGF0IHdhcyBhY3R1YWxseSByZWFkIGZyb20gdGhlIHN0cmVhbS4gIEluIGZhY3QsIGl0IGlzbid0CiAgICAgICAgIG5lY2Vzc2FyeSB0byBhY3R1YWxseSByZWFkIGFueSBjaGFyYWN0ZXJzIGZyb20gdGhlIHN0cmVhbSBiZWZvcmUKICAgICAgICAgdW5yZWFkaW5nIHRoZW0gd2l0aCA8Q09ERT51bmdldGM8L0NPREU+ISAgQnV0IHRoYXQgaXMgYSBzdHJhbmdlIHdheSB0byB3cml0ZSBhCiAgICAgICAgIHByb2dyYW07IHVzdWFsbHkgPENPREU+dW5nZXRjPC9DT0RFPiBpcyB1c2VkIG9ubHkgdG8gdW5yZWFkIGEgY2hhcmFjdGVyIHRoYXQKICAgICAgICAgd2FzIGp1c3QgcmVhZCBmcm9tIHRoZSBzYW1lIHN0cmVhbS4gIFRoZSBHTlUgQyBsaWJyYXJ5IHN1cHBvcnRzIHRoaXMKICAgICAgICAgZXZlbiBvbiBmaWxlcyBvcGVuZWQgaW4gYmluYXJ5IG1vZGUsIGJ1dCBvdGhlciBzeXN0ZW1zIG1pZ2h0IG5vdC4KICAgICAgICAgPGJyPjxicj4gVGhlIEdOVSBDIGxpYnJhcnkgb25seSBzdXBwb3J0cyBvbmUgY2hhcmFjdGVyIG9mIHB1c2hiYWNrLS0taW4gb3RoZXIKICAgICAgICAgd29yZHMsIGl0IGRvZXMgbm90IHdvcmsgdG8gY2FsbCA8Q09ERT51bmdldGM8L0NPREU+IHR3aWNlIHdpdGhvdXQgZG9pbmcgaW5wdXQKICAgICAgICAgaW4gYmV0d2Vlbi4gIE90aGVyIHN5c3RlbXMgbWlnaHQgbGV0IHlvdSBwdXNoIGJhY2sgbXVsdGlwbGUgY2hhcmFjdGVyczsKICAgICAgICAgdGhlbiByZWFkaW5nIGZyb20gdGhlIHN0cmVhbSByZXRyaWV2ZXMgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHJldmVyc2UKICAgICAgICAgb3JkZXIgdGhhdCB0aGV5IHdlcmUgcHVzaGVkLgogICAgICAgICA8YnI+PGJyPiBQdXNoaW5nIGJhY2sgY2hhcmFjdGVycyBkb2Vzbid0IGFsdGVyIHRoZSBmaWxlOyBvbmx5IHRoZSBpbnRlcm5hbAogICAgICAgICBidWZmZXJpbmcgZm9yIHRoZSBzdHJlYW0gaXMgYWZmZWN0ZWQuICBJZiBhIGZpbGUgcG9zaXRpb25pbmcgZnVuY3Rpb24KICAgICAgICAgKHN1Y2ggYXMgPENPREU+ZnNlZWs8L0NPREU+LCA8Q09ERT5mc2Vla288L0NPREU+IG9yIDxDT0RFPnJld2luZDwvQ09ERT47ICkgaXMgY2FsbGVkLCBhbnkgcGVuZGluZyBwdXNoZWQtYmFjayBjaGFyYWN0ZXJzIGFyZQogICAgICAgICBkaXNjYXJkZWQuCiAgICAgICAgIDxicj48YnI+IFVucmVhZGluZyBhIGNoYXJhY3RlciBvbiBhIHN0cmVhbSB0aGF0IGlzIGF0IGVuZCBvZiBmaWxlIGNsZWFycyB0aGUKICAgICAgICAgZW5kLW9mLWZpbGUgaW5kaWNhdG9yIGZvciB0aGUgc3RyZWFtLCBiZWNhdXNlIGl0IG1ha2VzIHRoZSBjaGFyYWN0ZXIgb2YKICAgICAgICAgaW5wdXQgYXZhaWxhYmxlLiAgQWZ0ZXIgeW91IHJlYWQgdGhhdCBjaGFyYWN0ZXIsIHRyeWluZyB0byByZWFkIGFnYWluCiAgICAgICAgIHdpbGwgZW5jb3VudGVyIGVuZCBvZiBmaWxlLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAdzdGRpby5oeHEAfh39dAATaW50IGMsIEZJTEUgKnN0cmVhbXQAA2ludHQAB3VuZ2V0d2NzcQB+AAp0AI0KICAgICAgICBUaGUgPENPREU+dW5nZXR3YzwvQ09ERT4gZnVuY3Rpb24gYmVoYXZlcyBqdXN0IGxpa2UgPENPREU+dW5nZXRjPC9DT0RFPiBqdXN0IHRoYXQgaXQKICAgICAgICAgcHVzaGVzIGJhY2sgYSB3aWRlIGNoYXJhY3Rlci4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHd2NoYXIuaHhxAH4eBHQAF3dpbnRfdCB3YywgRklMRSAqc3RyZWFtdAAGd2ludF90dAAGdW5saW5rc3EAfgAKdAcJCiAgICAgICAgVGhlIDxDT0RFPnVubGluazwvQ09ERT4gZnVuY3Rpb24gZGVsZXRlcyB0aGUgZmlsZSBuYW1lIDxWQVI+ZmlsZW5hbWU8L1ZBUj4uICBJZgogICAgICAgICB0aGlzIGlzIGEgZmlsZSdzIHNvbGUgbmFtZSwgdGhlIGZpbGUgaXRzZWxmIGlzIGFsc28gZGVsZXRlZC4gIChBY3R1YWxseSwKICAgICAgICAgaWYgYW55IHByb2Nlc3MgaGFzIHRoZSBmaWxlIG9wZW4gd2hlbiB0aGlzIGhhcHBlbnMsIGRlbGV0aW9uIGlzCiAgICAgICAgIHBvc3Rwb25lZCB1bnRpbCBhbGwgcHJvY2Vzc2VzIGhhdmUgY2xvc2VkIHRoZSBmaWxlLikKICAgICAgICAgPGJyPjxicj4gVGhlIGZ1bmN0aW9uIDxDT0RFPnVubGluazwvQ09ERT4gaXMgZGVjbGFyZWQgaW4gdGhlIGhlYWRlciBmaWxlIDxUVD51bmlzdGQuaDwvVFQ+LgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgPENPREU+MDwvQ09ERT4gb24gc3VjY2Vzc2Z1bCBjb21wbGV0aW9uLCBhbmQgPENPREU+LTE8L0NPREU+CiAgICAgICAgIG9uIGVycm9yLiAgSW4gYWRkaXRpb24gdG8gdGhlIHVzdWFsIGZpbGUgbmFtZSBlcnJvcnMKICAgICAgICAgLCB0aGUgZm9sbG93aW5nIDxDT0RFPmVycm5vPC9DT0RFPiBlcnJvciBjb25kaXRpb25zIGFyZQogICAgICAgICBkZWZpbmVkIGZvciB0aGlzIGZ1bmN0aW9uOgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8RFQ+PENPREU+RUFDQ0VTPC9DT0RFPgo8REQ+CiAgICAgICAgIFdyaXRlIHBlcm1pc3Npb24gaXMgZGVuaWVkIGZvciB0aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggdGhlIGZpbGUgaXMgdG8gYmUKICAgICAgICAgcmVtb3ZlZCwgb3IgdGhlIGRpcmVjdG9yeSBoYXMgdGhlIHN0aWNreSBiaXQgc2V0IGFuZCB5b3UgZG8gbm90IG93biB0aGUgZmlsZS4KICAgICAgICAgPGJyPjxicj4gPExJPiBFQlVTWQogICAgICAgICBUaGlzIGVycm9yIGluZGljYXRlcyB0aGF0IHRoZSBmaWxlIGlzIGJlaW5nIHVzZWQgYnkgdGhlIHN5c3RlbSBpbiBzdWNoIGEKICAgICAgICAgd2F5IHRoYXQgaXQgY2FuJ3QgYmUgdW5saW5rZWQuICBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IHNlZSB0aGlzIGVycm9yIGlmCiAgICAgICAgIHRoZSBmaWxlIG5hbWUgc3BlY2lmaWVzIHRoZSByb290IGRpcmVjdG9yeSBvciBhIG1vdW50IHBvaW50IGZvciBhIGZpbGUKICAgICAgICAgc3lzdGVtLgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVOT0VOVAogICAgICAgICBUaGUgZmlsZSBuYW1lIHRvIGJlIGRlbGV0ZWQgZG9lc24ndCBleGlzdC4KICAgICAgICAgPGJyPjxicj4gPExJPiBFUEVSTQogICAgICAgICBPbiBzb21lIHN5c3RlbXMgPENPREU+dW5saW5rPC9DT0RFPiBjYW5ub3QgYmUgdXNlZCB0byBkZWxldGUgdGhlIG5hbWUgb2YgYQogICAgICAgICBkaXJlY3RvcnksIG9yIGF0IGxlYXN0IGNhbiBvbmx5IGJlIHVzZWQgdGhpcyB3YXkgYnkgYSBwcml2aWxlZ2VkIHVzZXIuCiAgICAgICAgIFRvIGF2b2lkIHN1Y2ggcHJvYmxlbXMsIHVzZSA8Q09ERT5ybWRpcjwvQ09ERT4gdG8gZGVsZXRlIGRpcmVjdG9yaWVzLiAgKEluIHRoZQogICAgICAgICBHTlUgc3lzdGVtIDxDT0RFPnVubGluazwvQ09ERT4gY2FuIG5ldmVyIGRlbGV0ZSB0aGUgbmFtZSBvZiBhIGRpcmVjdG9yeS4pCiAgICAgICAgIDxicj48YnI+IDxMST4gRVJPRlMKICAgICAgICAgVGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBmaWxlIG5hbWUgdG8gYmUgZGVsZXRlZCBpcyBvbiBhIHJlYWQtb25seQogICAgICAgICBmaWxlIHN5c3RlbSBhbmQgY2FuJ3QgYmUgbW9kaWZpZWQuCgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAh1bmlzdGQuaHhxAH4eC3QAFGNvbnN0IGNoYXIgKmZpbGVuYW1ldAADaW50dAAIdW5sb2NrcHRzcQB+AAp0A3sKICAgICAgICBUaGUgPENPREU+dW5sb2NrcHQ8L0NPREU+IGZ1bmN0aW9uIHVubG9ja3MgdGhlIHNsYXZlIHBzZXVkby10ZXJtaW5hbCBkZXZpY2UKICAgICAgICAgY29ycmVzcG9uZGluZyB0byB0aGUgbWFzdGVyIHBzZXVkby10ZXJtaW5hbCBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZQogICAgICAgICBmaWxlIGRlc2NyaXB0b3IgPFZBUj5maWxlZGVzPC9WQVI+LiAgT24gbWFueSBzeXN0ZW1zLCB0aGUgc2xhdmUgY2FuIG9ubHkgYmUKICAgICAgICAgb3BlbmVkIGFmdGVyIHVubG9ja2luZywgc28gcG9ydGFibGUgYXBwbGljYXRpb25zIHNob3VsZCBhbHdheXMgY2FsbAogICAgICAgICA8Q09ERT51bmxvY2twdDwvQ09ERT4gYmVmb3JlIHRyeWluZyB0byBvcGVuIHRoZSBzbGF2ZS4KICAgICAgICAgPGJyPjxicj4gVGhlIG5vcm1hbCByZXR1cm4gdmFsdWUgZnJvbSA8Q09ERT51bmxvY2twdDwvQ09ERT4gaXMgMDsgYSB2YWx1ZSBvZgogICAgICAgICAtMSBpcyByZXR1cm5lZCBpbiBjYXNlIG9mIGZhaWx1cmUuICBUaGUgZm9sbG93aW5nIDxDT0RFPmVycm5vPC9DT0RFPgogICAgICAgICBlcnJvciBjb25kaXRpb25zIGFyZSBkZWZpbmVkIGZvciB0aGlzIGZ1bmN0aW9uOgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8RFQ+PENPREU+RUJBREY8L0NPREU+CjxERD4KICAgICAgICAgVGhlIDxWQVI+ZmlsZWRlczwvVkFSPiBhcmd1bWVudCBpcyBub3QgYSB2YWxpZCBmaWxlIGRlc2NyaXB0b3IuCiAgICAgICAgIDxicj48YnI+IDxMST4gRUlOVkFMCiAgICAgICAgIFRoZSA8VkFSPmZpbGVkZXM8L1ZBUj4gYXJndW1lbnQgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhIG1hc3RlciBwc2V1ZG8tdGVybWluYWwKICAgICAgICAgZGV2aWNlLgoKICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc3RkbGliLmh4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CiAgICAgICAgIGluIGVpdGhlciBjYXNlIChzaW5jZSBjaGFuZ2luZyB0aGUgdGltZSBzdGFtcHMgaXMgaXRzZWxmIGEgbW9kaWZpY2F0aW9uCiAgICAgICAgIG9mIHRoZSBmaWxlIGF0dHJpYnV0ZXMpLgogICAgICAgICA8YnI+PGJyPiBUaGUgPENPREU+dXRpbWU8L0NPREU+IGZ1bmN0aW9uIHJldHVybnMgPENPREU+MDwvQ09ERT4gaWYgc3VjY2Vzc2Z1bCBhbmQgPENPREU+LTE8L0NPREU+CiAgICAgICAgIG9uIGZhaWx1cmUuICBJbiBhZGRpdGlvbiB0byB0aGUgdXN1YWwgZmlsZSBuYW1lIGVycm9ycwogICAgICAgICAsIHRoZSBmb2xsb3dpbmcgPENPREU+ZXJybm88L0NPREU+IGVycm9yIGNvbmRpdGlvbnMKICAgICAgICAgYXJlIGRlZmluZWQgZm9yIHRoaXMgZnVuY3Rpb246CiAgICAgICAgIDxicj48YnI+IDxETD4KCiAgICAgICAgIDxEVD48Q09ERT5FQUNDRVM8L0NPREU+CjxERD4KICAgICAgICAgVGhlcmUgaXMgYSBwZXJtaXNzaW9uIHByb2JsZW0gaW4gdGhlIGNhc2Ugd2hlcmUgYSBudWxsIHBvaW50ZXIgd2FzCiAgICAgICAgIHBhc3NlZCBhcyB0aGUgPFZBUj50aW1lczwvVkFSPiBhcmd1bWVudC4gIEluIG9yZGVyIHRvIHVwZGF0ZSB0aGUgdGltZSBzdGFtcCBvbgogICAgICAgICB0aGUgZmlsZSwgeW91IG11c3QgZWl0aGVyIGJlIHRoZSBvd25lciBvZiB0aGUgZmlsZSwgaGF2ZSB3cml0ZQogICAgICAgICBwZXJtaXNzaW9uIGZvciB0aGUgZmlsZSwgb3IgYmUgYSBwcml2aWxlZ2VkIHVzZXIuCiAgICAgICAgIDxicj48YnI+IDxMST4gRU5PRU5UCiAgICAgICAgIFRoZSBmaWxlIGRvZXNuJ3QgZXhpc3QuCiAgICAgICAgIDxicj48YnI+IDxMST4gRVBFUk0KICAgICAgICAgSWYgdGhlIDxWQVI+dGltZXM8L1ZBUj4gYXJndW1lbnQgaXMgbm90IGEgbnVsbCBwb2ludGVyLCB5b3UgbXVzdCBlaXRoZXIgYmUKICAgICAgICAgdGhlIG93bmVyIG9mIHRoZSBmaWxlIG9yIGJlIGEgcHJpdmlsZWdlZCB1c2VyLgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVST0ZTCiAgICAgICAgIFRoZSBmaWxlIGxpdmVzIG9uIGEgcmVhZC1vbmx5IGZpbGUgc3lzdGVtLgoKICAgICAgICBzcQB+AA8AAAACdwQAAAACdAAIdW5pc3RkLmh0AAZ0aW1lLmh4cQB+Hid0ADFjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3Qgc3RydWN0IHV0aW1idWYgKnRpbWVzdAADaW50dAAGdXRpbWVzc3EAfgAKdAJOCiAgICAgICAgVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBmaWxlIGFjY2VzcyBhbmQgbW9kaWZpY2F0aW9uIHRpbWVzIG9mIHRoZSBmaWxlCiAgICAgICAgIDxWQVI+ZmlsZW5hbWU8L1ZBUj4uICBUaGUgbmV3IGZpbGUgYWNjZXNzIHRpbWUgaXMgc3BlY2lmaWVkIGJ5CiAgICAgICAgIDxDT0RFPjxWQVI+dHZwPC9WQVI+WzBdPC9DT0RFPiwgYW5kIHRoZSBuZXcgbW9kaWZpY2F0aW9uIHRpbWUgYnkKICAgICAgICAgPENPREU+PFZBUj50dnA8L1ZBUj5bMV08L0NPREU+LiAgU2ltaWxhciB0byA8Q09ERT51dGltZTwvQ09ERT4sIGlmIDxWQVI+dHZwPC9WQVI+IGlzIGEgbnVsbAogICAgICAgICBwb2ludGVyIHRoZW4gdGhlIGFjY2VzcyBhbmQgbW9kaWZpY2F0aW9uIHRpbWVzIG9mIHRoZSBmaWxlIGFyZSBzZXQgdG8KICAgICAgICAgdGhlIGN1cnJlbnQgdGltZS4gIFRoaXMgZnVuY3Rpb24gY29tZXMgZnJvbSBCU0QuCiAgICAgICAgIDxicj48YnI+IFRoZSByZXR1cm4gdmFsdWVzIGFuZCBlcnJvciBjb25kaXRpb25zIGFyZSB0aGUgc2FtZSBhcyBmb3IgdGhlIDxDT0RFPnV0aW1lPC9DT0RFPgogICAgICAgICBmdW5jdGlvbi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAKc3lzL3RpbWUuaHhxAH4eL3QAK2NvbnN0IGNoYXIgKmZpbGVuYW1lLCBzdHJ1Y3QgdGltZXZhbCB0dnBbMl10AANpbnR0AAh1dG1wbmFtZXNxAH4ACnQEKwogICAgICAgIFRoZSA8Q09ERT51dG1wbmFtZTwvQ09ERT4gZnVuY3Rpb24gY2hhbmdlcyB0aGUgbmFtZSBvZiB0aGUgZGF0YWJhc2UgdG8gYmUKICAgICAgICAgZXhhbWluZWQgdG8gPFZBUj5maWxlPC9WQVI+LCBhbmQgY2xvc2VzIGFueSBwcmV2aW91c2x5IG9wZW5lZCBkYXRhYmFzZS4gIEJ5CiAgICAgICAgIGRlZmF1bHQgPENPREU+Z2V0dXRlbnQ8L0NPREU+LCA8Q09ERT5nZXR1dGlkPC9DT0RFPiwgPENPREU+Z2V0dXRsaW5lPC9DT0RFPiBhbmQKICAgICAgICAgPENPREU+cHV0dXRsaW5lPC9DT0RFPiByZWFkIGZyb20gYW5kIHdyaXRlIHRvIHRoZSB1c2VyIGFjY291bnRpbmcgZGF0YWJhc2UuCiAgICAgICAgIDxicj48YnI+IFRoZSBmb2xsb3dpbmcgbWFjcm9zIGFyZSBkZWZpbmVkIGZvciB1c2UgYXMgdGhlIDxWQVI+ZmlsZTwvVkFSPiBhcmd1bWVudDoKICAgICAgICAgPGJyPjxicj4gTWFjcm8ge2NoYXIgKn0gX1BBVEhfVVRNUAogICAgICAgICBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgdXNlciBhY2NvdW50aW5nIGRhdGFiYXNlLgoKICAgICAgICAgPGJyPjxicj4gTWFjcm8ge2NoYXIgKn0gX1BBVEhfV1RNUAogICAgICAgICBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgdXNlciBhY2NvdW50aW5nIGxvZyBmaWxlLgoKICAgICAgICAgPGJyPjxicj4gVGhlIDxDT0RFPnV0bXBuYW1lPC9DT0RFPiBmdW5jdGlvbiByZXR1cm5zIGEgdmFsdWUgb2YgPENPREU+MDwvQ09ERT4gaWYgdGhlIG5ldyBuYW1lCiAgICAgICAgIHdhcyBzdWNjZXNzZnVsbHkgc3RvcmVkLCBhbmQgYSB2YWx1ZSBvZiA8Q09E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RT4gZnVuY3Rpb24gaXMganVzdCBsaWtlIDxDT0RFPmVycng8L0NPREU+IGV4Y2VwdCB0aGF0IHRoZQogICAgICAgICBwYXJhbWV0ZXJzIGZvciB0aGUgaGFuZGxpbmcgb2YgdGhlIGZvcm1hdCBzdHJpbmcgPFZBUj5mb3JtYXQ8L1ZBUj4gYXJlIHBhc3NlZAogICAgICAgICBpbiBhcyBhbiB2YWx1ZSBvZiB0eXBlIDxDT0RFPnZhX2xpc3Q8L0NPREU+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAVlcnIuaHhxAH4eWXQAJ2ludCBzdGF0dXMsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdHQABHZvaWR0AAt2ZXJzaW9uc29ydHNxAH4ACnQApAogICAgICAgIFRoZSA8Q09ERT52ZXJzaW9uc29ydDwvQ09ERT4gZnVuY3Rpb24gaXMgbGlrZSA8Q09ERT5hbHBoYXNvcnQ8L0NPREU+IGV4Y2VwdCB0aGF0IGl0CiAgICAgICAgIHVzZXMgdGhlIDxDT0RFPnN0cnZlcnNjbXA8L0NPREU+IGZ1bmN0aW9uIGludGVybmFsbHkuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACGRpcmVudC5oeHEAfh5gdAAcY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYnQAA2ludHQADXZlcnNpb25zb3J0NjRzcQB+AAp0AKsKICAgICAgICBUaGUgPENPREU+dmVyc2lvbnNvcnQ2NDwvQ09ERT4gZnVuY3Rpb24gaXMgbGlrZSA8Q09ERT5hbHBoYXNvcnQ2NDwvQ09ERT4sIGV4Y2VwdGVkIHRoYXQgaXQKICAgICAgICAgdXNlcyB0aGUgPENPREU+c3RydmVyc2NtcDwvQ09ERT4gZnVuY3Rpb24gaW50ZXJuYWxseS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIZGlyZW50Lmh4cQB+Hmd0ABxjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpidAADaW50dAAFdmZvcmtzcQB+AAp0BikKICAgICAgICBUaGUgPENPREU+dmZvcms8L0NPREU+IGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gPENPREU+Zm9yazwvQ09ERT4gYnV0IG9uIHNvbWUgc3lzdGVtcwogICAgICAgICBpdCBpcyBtb3JlIGVmZmljaWVudDsgaG93ZXZlciwgdGhlcmUgYXJlIHJlc3RyaWN0aW9ucyB5b3UgbXVzdCBmb2xsb3cgdG8KICAgICAgICAgdXNlIGl0IHNhZmVseS4KICAgICAgICAgPGJyPjxicj4gV2hpbGUgPENPREU+Zm9yazwvQ09ERT4gbWFrZXMgYSBjb21wbGV0ZSBjb3B5IG9mIHRoZSBjYWxsaW5nIHByb2Nlc3MncyBhZGRyZXNzCiAgICAgICAgIHNwYWNlIGFuZCBhbGxvd3MgYm90aCB0aGUgcGFyZW50IGFuZCBjaGlsZCB0byBleGVjdXRlIGluZGVwZW5kZW50bHksCiAgICAgICAgIDxDT0RFPnZmb3JrPC9DT0RFPiBkb2VzIG5vdCBtYWtlIHRoaXMgY29weS4gIEluc3RlYWQsIHRoZSBjaGlsZCBwcm9jZXNzCiAgICAgICAgIGNyZWF0ZWQgd2l0aCA8Q09ERT52Zm9yazwvQ09ERT4gc2hhcmVzIGl0cyBwYXJlbnQncyBhZGRyZXNzIHNwYWNlIHVudGlsIGl0CiAgICAgICAgIGNhbGxzIDxDT0RFPl9leGl0PC9DT0RFPiBvciBvbmUgb2YgdGhlIDxDT0RFPmV4ZWM8L0NPREU+IGZ1bmN0aW9ucy4gIEluIHRoZQogICAgICAgICBtZWFudGltZSwgdGhlIHBhcmVudCBwcm9jZXNzIHN1c3BlbmRzIGV4ZWN1dGlvbi4KICAgICAgICAgPGJyPjxicj4gWW91IG11c3QgYmUgdmVyeSBjYXJlZnVsIG5vdCB0byBhbGxvdyB0aGUgY2hpbGQgcHJvY2VzcyBjcmVhdGVkIHdpdGgKICAgICAgICAgPENPREU+dmZvcms8L0NPREU+IHRvIG1vZGlmeSBhbnkgZ2xvYmFsIGRhdGEgb3IgZXZlbiBsb2NhbCB2YXJpYWJsZXMgc2hhcmVkCiAgICAgICAgIHdpdGggdGhlIHBhcmVudC4gIEZ1cnRoZXJtb3JlLCB0aGUgY2hpbGQgcHJvY2VzcyBjYW5ub3QgcmV0dXJuIGZyb20gKG9yCiAgICAgICAgIGRvIGEgbG9uZyBqdW1wIG91dCBvZikgdGhlIGZ1bmN0aW9uIHRoYXQgY2FsbGVkIDxDT0RFPnZmb3JrPC9DT0RFPiEgIFRoaXMKICAgICAgICAgd291bGQgbGVhdmUgdGhlIHBhcmVudCBwcm9jZXNzJ3MgY29udHJvbCBpbmZvcm1hdGlvbiB2ZXJ5IGNvbmZ1c2VkLiAgSWYKICAgICAgICAgaW4gZG91YnQsIHVzZSA8Q09ERT5mb3JrPC9DT0RFPiBpbnN0ZWFkLgogICAgICAgICA8YnI+PGJyPiBTb21lIG9wZXJhdGluZyBzeXN0ZW1zIGRvbid0IHJlYWxseSBpbXBsZW1lbnQgPENPREU+dmZvcms8L0NPREU+LiAgVGhlIEdOVSBDCiAgICAgICAgIGxpYnJhcnkgcGVybWl0cyB5b3UgdG8gdXNlIDxDT0RFPnZmb3JrPC9DT0RFPiBvbiBhbGwgc3lzdGVtcywgYnV0IGFjdHVhbGx5CiAgICAgICAgIGV4ZWN1dGVzIDxDT0RFPmZvcms8L0NPREU+IGlmIDxDT0RFPnZmb3JrPC9DT0RFPiBpc24ndCBhdmFpbGFibGUuICBJZiB5b3UgZm9sbG93CiAgICAgICAgIHRoZSBwcm9wZXIgcHJlY2F1dGlvbnMgZm9yIHVzaW5nIDxDT0RFPnZmb3JrPC9DT0RFPiwgeW91ciBwcm9ncmFtIHdpbGwgc3RpbGwKICAgICAgICAgd29yayBldmVuIGlmIHRoZSBzeXN0ZW0gdXNlcyA8Q09ERT5mb3JrPC9DT0RFPiBpbnN0ZWFkLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAh1bmlzdGQuaHhxAH4ebnQABHZvaWR0AAVwaWRfdHQACHZmcHJpbnRmc3EAfgAKdACZCiAgICAgICAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiA8Q09ERT5mcHJpbnRmPC9DT0RFPiB3aXRoIHRoZSB2YXJpYWJsZSBhcmd1bWVudCBsaXN0CiAgICAgICAgIHNwZWNpZmllZCBkaXJlY3RseSBhcyBmb3IgPENPREU+dnByaW50ZjwvQ09ERT4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3N0ZGlvLmh4cQB+HnV0AC5GSUxFICpzdHJlYW0sIGNvbnN0IGNoYXIgKnRlbXBsYXRlLCB2YV9saXN0IGFwdAADaW50dAAHdmZzY2FuZnNxAH4ACnQAlwogICAgICAgIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgPENPREU+ZnNjYW5mPC9DT0RFPiB3aXRoIHRoZSB2YXJpYWJsZSBhcmd1bWVudCBsaXN0CiAgICAgICAgIHNwZWNpZmllZCBkaXJlY3RseSBhcyBmb3IgPENPREU+dnNjYW5mPC9DT0RFPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHc3RkaW8uaHhxAH4efHQALkZJTEUgKnN0cmVhbSwgY29uc3QgY2hhciAqdGVtcGxhdGUsIHZhX2xpc3QgYXB0AANpbnR0AAl2ZndwcmludGZzcQB+AAp0AJsKICAgICAgICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIDxDT0RFPmZ3cHJpbnRmPC9DT0RFPiB3aXRoIHRoZSB2YXJpYWJsZSBhcmd1bWVudCBsaXN0CiAgICAgICAgIHNwZWNpZmllZCBkaXJlY3RseSBhcyBmb3IgPENPREU+dndwcmludGY8L0NPREU+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAd3Y2hhci5oeHEAfh6DdAAxRklMRSAqc3RyZWFtLCBjb25zdCB3Y2hhcl90ICp0ZW1wbGF0ZSwgdmFfbGlzdCBhcHQAA2ludHQACHZmd3NjYW5mc3EAfgAKdACZCiAgICAgICAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiA8Q09ERT5md3NjYW5mPC9DT0RFPiB3aXRoIHRoZSB2YXJpYWJsZSBhcmd1bWVudCBsaXN0CiAgICAgICAgIHNwZWNpZmllZCBkaXJlY3RseSBhcyBmb3IgPENPREU+dndzY2FuZjwvQ09ERT4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3djaGFyLmh4cQB+Hop0ADFGSUxFICpzdHJlYW0sIGNvbnN0IHdjaGFyX3QgKnRlbXBsYXRlLCB2YV9saXN0IGFwdAADaW50dAAGdmxpbWl0c3EAfgAKdASpCiAgICAgICAgPGJyPjxicj4gPENPREU+dmxpbWl0PC9DT0RFPiBzZXRzIHRoZSBjdXJyZW50IGxpbWl0IGZvciBhIHJlc291cmNlIGZvciBhIHByb2Nlc3MuCiAgICAgICAgIDxicj48YnI+IDxWQVI+cmVzb3VyY2U8L1ZBUj4gaWRlbnRpZmllcyB0aGUgcmVzb3VyY2U6CiAgICAgICAgIDxicj48YnI+IDxETD4KCiAgICAgICAgIDxEVD48Q09ERT5MSU1fQ1BVPC9DT0RFPgo8REQ+CiAgICAgICAgIE1heGltdW0gQ1BVIHRpbWUuICBTYW1lIGFzIDxDT0RFPlJMSU1JVF9DUFU8L0NPREU+IGZvciA8Q09ERT5zZXRybGltaXQ8L0NPREU+LgogICAgICAgICA8RFQ+PENPREU+TElNX0ZTSVpFPC9DT0RFPgo8REQ+CiAgICAgICAgIE1heGltdW0gZmlsZSBzaXplLiAgU2FtZSBhcyA8Q09ERT5STElNSVRfRlNJWkU8L0NPREU+IGZvciA8Q09ERT5zZXRybGltaXQ8L0NPREU+LgogICAgICAgICA8TEk+IExJTV9EQVRBCiAgICAgICAgIE1heGltdW0gZGF0YSBtZW1vcnkuICBTYW1lIGFzIDxDT0RFPlJMSU1JVF9EQVRBPC9DT0RFPiBmb3IgPENPREU+c2V0cmxpbWl0PC9DT0RFPi4KICAgICAgICAgPExJPiBMSU1fU1RBQ0sKICAgICAgICAgTWF4aW11bSBzdGFjayBzaXplLiAgU2FtZSBhcyA8Q09ERT5STElNSVRfU1RBQ0s8L0NPREU+IGZvciA8Q09ERT5zZXRybGltaXQ8L0NPREU+LgogICAgICAgICA8TEk+IExJTV9DT1JFCiAgICAgICAgIE1heGltdW0gY29yZSBmaWxlIHNpemUuICBTYW1lIGFzIDxDT0RFPlJMSU1JVF9DT1I8L0NPREU+IGZvciA8Q09ERT5zZXRybGltaXQ8L0NPREU+LgogICAgICAgICA8TEk+IExJTV9NQVhSU1MKICAgICAgICAgTWF4aW11bSBwaHlzaWNhbCBtZW1vcnkuICBTYW1lIGFzIDxDT0RFPlJMSU1JVF9SU1M8L0NPREU+IGZvciA8Q09ERT5zZXRybGltaXQ8L0NPREU+LgoKICAgICAgICAgPGJyPjxicj4gVGhlIHJldHVybiB2YWx1ZSBpcyB6ZXJvIGZvciBzdWNjZXNzLCBhbmQgPENPREU+LTE8L0NPREU+IHdpdGggPENPREU+ZXJybm88L0NPREU+IHNldAogICAgICAgICBhY2NvcmRpbmdseSBmb3IgZmFpbHVyZToKICAgICAgICAgPGJyPjxicj4gPERMPgoKICAgICAgICAgPExJPiBFUEVSTQogICAgICAgICBUaGUgcHJvY2VzcyB0cmllZCB0byBzZXQgaXRzIGN1cnJlbnQgbGltaXQgYmV5b25kIGl0cyBtYXhpbXVtIGxpbWl0LgoKICAgICAgICAgPGJyPjxicj4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAMc3lzL3ZsaW1pdC5oeHEAfh6RdAAXaW50IHJlc291cmNlLCBpbnQgbGltaXR0AANpbnR0AAd2cHJpbnRmc3EAfgAKdADMCiAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIDxDT0RFPnByaW50ZjwvQ09ERT4gZXhjZXB0IHRoYXQsIGluc3RlYWQgb2YgdGFraW5nCiAgICAgICAgIGEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBkaXJlY3RseSwgaXQgdGFrZXMgYW4gYXJndW1lbnQgbGlzdAogICAgICAgICBwb2ludGVyIDxWQVI+YXA8L1ZBUj4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3N0ZGlvLmh4cQB+Hph0ACBjb25zdCBjaGFyICp0ZW1wbGF0ZSwgdmFfbGlzdCBhcHQAA2ludHQABnZzY2FuZnNxAH4ACnQA4QogICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byA8Q09ERT5zY2FuZjwvQ09ERT4sIGJ1dCBpbnN0ZWFkIG9mIHRha2luZwogICAgICAgICBhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMgZGlyZWN0bHksIGl0IHRha2VzIGFuIGFyZ3VtZW50IGxpc3QKICAgICAgICAgcG9pbnRlciA8VkFSPmFwPC9WQVI+IG9mIHR5cGUgPENPREU+dmFfbGlzdDwvQ09ERT4gLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAdzdGRpby5oeHEAfh6fdAAgY29uc3QgY2hhciAqdGVtcGxhdGUsIHZhX2xpc3QgYXB0AANpbnR0AAl2c25wcmludGZzcQB+AAp0AJoKICAgICAgICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIDxDT0RFPnNucHJpbnRmPC9DT0RFPiB3aXRoIHRoZSB2YXJpYWJsZSBhcmd1bWVudCBsaXN0CiAgICAgICAgIHNwZWNpZmllZCBkaXJlY3RseSBhcyBmb3IgPENPREU+dnByaW50ZjwvQ09ERT4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3N0ZGlvLmh4cQB+HqZ0ADZjaGFyICpzLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqdGVtcGxhdGUsIHZhX2xpc3QgYXB0AANpbnR0AAh2c3ByaW50ZnNxAH4ACnQAmQogICAgICAgIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgPENPREU+c3ByaW50ZjwvQ09ERT4gd2l0aCB0aGUgdmFyaWFibGUgYXJndW1lbnQgbGlzdAogICAgICAgICBzcGVjaWZpZWQgZGlyZWN0bHkgYXMgZm9yIDxDT0RFPnZwcmludGY8L0NPREU+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAdzdGRpby5oeHEAfh6tdAApY2hhciAqcywgY29uc3QgY2hhciAqdGVtcGxhdGUsIHZhX2xpc3QgYXB0AANpbnR0AAd2c3NjYW5mc3EAfgAKdACXCiAgICAgICAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiA8Q09ERT5zc2NhbmY8L0NPREU+IHdpdGggdGhlIHZhcmlhYmxlIGFyZ3VtZW50IGxpc3QKICAgICAgICAgc3BlY2lmaWVkIGRpcmVjdGx5IGFzIGZvciA8Q09ERT52c2NhbmY8L0NPREU+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAdzdGRpby5oeHEAfh60dAAvY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqdGVtcGxhdGUsIHZhX2xpc3QgYXB0AANpbnR0AAl2c3dwcmludGZzcQB+AAp0AJsKICAgICAgICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIDxDT0RFPnN3cHJpbnRmPC9DT0RFPiB3aXRoIHRoZSB2YXJpYWJsZSBhcmd1bWVudCBsaXN0CiAgICAgICAgIHNwZWNpZmllZCBkaXJlY3RseSBhcyBmb3IgPENPREU+dndwcmludGY8L0NPREU+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAd3Y2hhci5oeHEAfh67dAA8d2NoYXJfdCAqcywgc2l6ZV90IHNpemUsIGNvbnN0IHdjaGFyX3QgKnRlbXBsYXRlLCB2YV9saXN0IGFwdAADaW50dAAIdnN3c2NhbmZzcQB+AAp0AJkKICAgICAgICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIDxDT0RFPnN3c2NhbmY8L0NPREU+IHdpdGggdGhlIHZhcmlhYmxlIGFyZ3VtZW50IGxpc3QKICAgICAgICAgc3BlY2lmaWVkIGRpcmVjdGx5IGFzIGZvciA8Q09ERT52d3NjYW5mPC9DT0RFPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHd2NoYXIuaHhxAH4ewnQANWNvbnN0IHdjaGFyX3QgKnMsIGNvbnN0IHdjaGFyX3QgKnRlbXBsYXRlLCB2YV9saXN0IGFwdAADaW50dAAHdnN5c2xvZ3NxAH4ACnQAmQogICAgICAgIDxicj48YnI+IFRoaXMgaXMgZnVuY3Rpb25hbGx5IGlkZW50aWNhbCB0byA8Q09ERT5zeXNsb2c8L0NPREU+LCB3aXRoIHRoZSBCU0Qgc3R5bGUgdmFyaWFibGUKICAgICAgICAgbGVuZ3RoIGFyZ3VtZW50LgogICAgICAgICA8YnI+PGJyPgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAhzeXNsb2cuaHhxAH4eyXQANGludCBmYWNpbGl0eV9wcmlvcml0eSwgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ2xpc3R0AAR2b2lkdAAGdnRpbWVzc3EAfgAKdAhyCiAgICAgICAgPGJyPjxicj4gPENPREU+dnRpbWVzPC9DT0RFPiByZXBvcnRzIHJlc291cmNlIHVzYWdlIHRvdGFscyBmb3IgYSBwcm9jZXNzLgogICAgICAgICA8YnI+PGJyPiBJZiA8VkFSPmN1cnJlbnQ8L1ZBUj4gaXMgbm9uLW51bGwsIDxDT0RFPnZ0aW1lczwvQ09ERT4gc3RvcmVzIHJlc291cmNlIHVzYWdlIHRvdGFscyBmb3IKICAgICAgICAgdGhlIGludm9raW5nIHByb2Nlc3MgYWxvbmUgaW4gdGhlIHN0cnVjdHVyZSB0byB3aGljaCBpdCBwb2ludHMuICBJZgogICAgICAgICA8VkFSPmNoaWxkPC9WQVI+IGlzIG5vbi1udWxsLCA8Q09ERT52dGltZXM8L0NPREU+IHN0b3JlcyByZXNvdXJjZSB1c2FnZSB0b3RhbHMgZm9yIGFsbAogICAgICAgICBwYXN0IGNoaWxkcmVuICh3aGljaCBoYXZlIHRlcm1pbmF0ZWQpIG9mIHRoZSBpbnZva2luZyBwcm9jZXNzIGluIHRoZSBzdHJ1Y3R1cmUKICAgICAgICAgdG8gd2hpY2ggaXQgcG9pbnRzLgogICAgICAgICA8YnI+PGJyPiA8aDQ+RGF0YSBUeXBlIC0gc3RydWN0IHZ0aW1lczwvaDQ+CiAgICAgICAgIFRoaXMgZGF0YSB0eXBlIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZXNvdXJjZSB1c2FnZSBvZiBhIHByb2Nlc3MuCiAgICAgICAgIEVhY2ggbWVtYmVyIGNvcnJlc3BvbmRzIHRvIGEgbWVtYmVyIG9mIHRoZSA8Q09ERT5zdHJ1Y3QgcnVzYWdlPC9DT0RFPiBkYXRhIHR5cGUKICAgICAgICAgZGVzY3JpYmVkIGFib3ZlLgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8RFQ+PENPREU+dm1fdXRpbWU8L0NPREU+CjxERD4KICAgICAgICAgVXNlciBDUFUgdGltZS4gIEFuYWxvZ291cyB0byA8Q09ERT5ydV91dGltZTwvQ09ERT4gaW4gPENPREU+c3RydWN0IHJ1c2FnZTwvQ09ERT4KICAgICAgICAgPExJPiB2bV9zdGltZQogICAgICAgICBTeXN0ZW0gQ1BVIHRpbWUuICBBbmFsb2dvdXMgdG8gPENPREU+cnVfc3RpbWU8L0NPREU+IGluIDxDT0RFPnN0cnVjdCBydXNhZ2U8L0NPREU+CiAgICAgICAgIDxMST4gdm1faWRzcnNzCiAgICAgICAgIERhdGEgYW5kIHN0YWNrIG1lbW9yeS4gIFRoZSBzdW0gb2YgdGhlIHZhbHVlcyB0aGF0IHdvdWxkIGJlIHJlcG9ydGVkIGFzCiAgICAgICAgIDxDT0RFPnJ1X2lkcnNzPC9DT0RFPiBhbmQgPENPREU+cnVfaXNyc3M8L0NPREU+IGluIDxDT0RFPnN0cnVjdCBydXNhZ2U8L0NPREU+CiAgICAgICAgIDxMST4gdm1faXhyc3MKICAgICAgICAgU2hhcmVkIG1lbW9yeS4gIEFuYWxvZ291cyB0byA8Q09ERT5ydV9peHJzczwvQ09ERT4gaW4gPENPREU+c3RydWN0IHJ1c2FnZTwvQ09ERT4KICAgICAgICAgPExJPiB2bV9tYXhyc3MKICAgICAgICAgTWF4aW1lbnQgcmVzaWRlbnQgc2V0IHNpemUuICBBbmFsb2dvdXMgdG8gPENPREU+cnVfbWF4cnNzPC9DT0RFPiBpbgogICAgICAgICA8Q09ERT5zdHJ1Y3QgcnVzYWdlPC9DT0RFPgogICAgICAgICA8TEk+IHZtX21hamZsdAogICAgICAgICBNYWpvciBwYWdlIGZhdWx0cy4gIEFuYWxvZ291cyB0byA8Q09ERT5ydV9tYWpmbHQ8L0NPREU+IGluIDxDT0RFPnN0cnVjdCBydXNhZ2U8L0NPREU+CiAgICAgICAgIDxMST4gdm1fbWluZmx0CiAgICAgICAgIE1pbm9yIHBhZ2UgZmF1bHRzLiAgQW5hbG9nb3VzIHRvIDxDT0RFPnJ1X21pbmZsdDwvQ09ERT4gaW4gPENPREU+c3RydWN0IHJ1c2FnZTwvQ09ERT4KICAgICAgICAgPExJPiB2bV9uc3dhcAogICAgICAgICBTd2FwIGNvdW50LiAgQW5hbG9nb3VzIHRvIDxDT0RFPnJ1X25zd2FwPC9DT0RFPiBpbiA8Q09ERT5zdHJ1Y3QgcnVzYWdlPC9DT0RFPgogICAgICAgICA8TEk+IHZtX2luYmxrCiAgICAgICAgIERpc2sgcmVhZHMuICBBbmFsb2dvdXMgdG8gPENPREU+cnVfaW5ibGs8L0NPREU+IGluIDxDT0RFPnN0cnVjdCBydXNhZ2U8L0NPREU+CiAgICAgICAgIDxMST4gdm1fb3VibGsKICAgICAgICAgRGlzayB3cml0ZXMuICBBbmFsb2dvdXMgdG8gPENPREU+cnVfb3VibGs8L0NPREU+IGluIDxDT0RFPnN0cnVjdCBy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cyBleGFjdGx5IGVxdWl2YWxlbnQgdG86PGJyPgogICAgICAgICA8YnI+PGJyPiA8cHJlPjxicj4KICAgICAgICAgd2FpdHBpZCAoLTEsICZzdGF0dXMsIDApPGJyPgogICAgICAgICA8L3ByZT4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBpbiBtdWx0aS10aHJlYWRlZCBwcm9ncmFtcy4gIFRoaXMKICAgICAgICAgaXMgYSBwcm9ibGVtIGlmIHRoZSB0aHJlYWQgYWxsb2NhdGVzIHNvbWUgcmVzb3VyY2VzIChsaWtlIG1lbW9yeSwgZmlsZQogICAgICAgICBkZXNjcmlwdG9ycywgc2VtYXBob3JlcyBvciB3aGF0ZXZlcikgYXQgdGhlIHRpbWUgPENPREU+d2FpdDwvQ09ERT4gaXMKICAgICAgICAgY2FsbGVkLiAgSWYgdGhlIHRocmVhZCBnZXRzIGNhbmNlbGVkIHRoZXNlIHJlc291cmNlcyBzdGF5IGFsbG9jYXRlZAogICAgICAgICB1bnRpbCB0aGUgcHJvZ3JhbSBlbmRzLiAgVG8gYXZvaWQgdGhpcyBjYWxscyB0byA8Q09ERT53YWl0PC9DT0RFPiBzaG91bGQgYmUKICAgICAgICAgcHJvdGVjdGVkIHVzaW5nIGNhbmNlbGxhdGlvbiBoYW5kbGVycy4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAKc3lzL3dhaXQuaHhxAH4e9HQAD2ludCAqc3RhdHVzLXB0cnQABXBpZF90dAAFd2FpdDNzcQB+AAp0AZMKICAgICAgICBJZiA8VkFSPnVzYWdlPC9WQVI+IGlzIGEgbnVsbCBwb2ludGVyLCA8Q09ERT53YWl0MzwvQ09ERT4gaXMgZXF1aXZhbGVudCB0bwogICAgICAgICA8Q09ERT53YWl0cGlkICgtMSwgPFZBUj5zdGF0dXMtcHRyPC9WQVI+LCA8VkFSPm9wdGlvbnM8L1ZBUj4pPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gSWYgPFZBUj51c2FnZTwvVkFSPiBpcyBub3QgbnVsbCwgPENPREU+d2FpdDM8L0NPREU+IHN0b3JlcyB1c2FnZSBmaWd1cmVzIGZvciB0aGUKICAgICAgICAgY2hpbGQgcHJvY2VzcyBpbiA8Q09ERT4qPFZBUj5ydXNhZ2U8L1ZBUj48L0NPREU+IChidXQgb25seSBpZiB0aGUgY2hpbGQgaGFzCiAgICAgICAgIHRlcm1pbmF0ZWQsIG5vdCBpZiBpdCBoYXMgc3RvcHBlZCkuICAuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACnN5cy93YWl0Lmh4cQB+Hvt0ADl1bmlvbiB3YWl0ICpzdGF0dXMtcHRyLCBpbnQgb3B0aW9ucywgc3RydWN0IHJ1c2FnZSAqdXNhZ2V0AAVwaWRfdHQABXdhaXQ0c3EAfgAKdAHTCiAgICAgICAgSWYgPFZBUj51c2FnZTwvVkFSPiBpcyBhIG51bGwgcG9pbnRlciwgPENPREU+d2FpdDQ8L0NPREU+IGlzIGVxdWl2YWxlbnQgdG8KICAgICAgICAgPENPREU+d2FpdHBpZCAoPFZBUj5waWQ8L1ZBUj4sIDxWQVI+c3RhdHVzLXB0cjwvVkFSPiwgPFZBUj5vcHRpb25zPC9WQVI+KTwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IElmIDxWQVI+dXNhZ2U8L1ZBUj4gaXMgbm90IG51bGwsIDxDT0RFPndhaXQ0PC9DT0RFPiBzdG9yZXMgdXNhZ2UgZmlndXJlcyBmb3IgdGhlCiAgICAgICAgIGNoaWxkIHByb2Nlc3MgaW4gPENPREU+KjxWQVI+cnVzYWdlPC9WQVI+PC9DT0RFPiAoYnV0IG9ubHkgaWYgdGhlIGNoaWxkIGhhcwogICAgICAgICB0ZXJtaW5hdGVkLCBub3QgaWYgaXQgaGFzIHN0b3BwZWQpLiAgLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIGlzIGEgQlNEIGV4dGVuc2lvbi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAKc3lzL3dhaXQuaHhxAH4fAnQAPXBpZF90IHBpZCwgaW50ICpzdGF0dXMtcHRyLCBpbnQgb3B0aW9ucywgc3RydWN0IHJ1c2FnZSAqdXNhZ2V0AAVwaWRfdHQAB3dhaXRwaWRzcQB+AAp0DngKICAgICAgICBUaGUgPENPREU+d2FpdHBpZDwvQ09ERT4gZnVuY3Rpb24gaXMgdXNlZCB0byByZXF1ZXN0IHN0YXR1cyBpbmZvcm1hdGlvbiBmcm9tIGEKICAgICAgICAgY2hpbGQgcHJvY2VzcyB3aG9zZSBwcm9jZXNzIElEIGlzIDxWQVI+cGlkPC9WQVI+LiAgTm9ybWFsbHksIHRoZSBjYWxsaW5nCiAgICAgICAgIHByb2Nlc3MgaXMgc3VzcGVuZGVkIHVudGlsIHRoZSBjaGlsZCBwcm9jZXNzIG1ha2VzIHN0YXR1cyBpbmZvcm1hdGlvbgogICAgICAgICBhdmFpbGFibGUgYnkgdGVybWluYXRpbmcuCiAgICAgICAgIDxicj48YnI+IE90aGVyIHZhbHVlcyBmb3IgdGhlIDxWQVI+cGlkPC9WQVI+IGFyZ3VtZW50IGhhdmUgc3BlY2lhbCBpbnRlcnByZXRhdGlvbnMuICBBCiAgICAgICAgIHZhbHVlIG9mIDxDT0RFPi0xPC9DT0RFPiBvciA8Q09ERT5XQUlUX0FOWTwvQ09ERT4gcmVxdWVzdHMgc3RhdHVzIGluZm9ybWF0aW9uIGZvcgogICAgICAgICBhbnkgY2hpbGQgcHJvY2VzczsgYSB2YWx1ZSBvZiA8Q09ERT4wPC9DT0RFPiBvciA8Q09ERT5XQUlUX01ZUEdSUDwvQ09ERT4gcmVxdWVzdHMKICAgICAgICAgaW5mb3JtYXRpb24gZm9yIGFueSBjaGlsZCBwcm9jZXNzIGluIHRoZSBzYW1lIHByb2Nlc3MgZ3JvdXAgYXMgdGhlCiAgICAgICAgIGNhbGxpbmcgcHJvY2VzczsgYW5kIGFueSBvdGhlciBuZWdhdGl2ZSB2YWx1ZSAgPFZBUj5wZ2lkPC9WQVI+CiAgICAgICAgIHJlcXVlc3RzIGluZm9ybWF0aW9uIGZvciBhbnkgY2hpbGQgcHJvY2VzcyB3aG9zZSBwcm9jZXNzIGdyb3VwIElEIGlzCiAgICAgICAgIDxWQVI+cGdpZDwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gSWYgc3RhdHVzIGluZm9ybWF0aW9uIGZvciBhIGNoaWxkIHByb2Nlc3MgaXMgYXZhaWxhYmxlIGltbWVkaWF0ZWx5LCB0aGlzCiAgICAgICAgIGZ1bmN0aW9uIHJldHVybnMgaW1tZWRpYXRlbHkgd2l0aG91dCB3YWl0aW5nLiAgSWYgbW9yZSB0aGFuIG9uZSBlbGlnaWJsZQogICAgICAgICBjaGlsZCBwcm9jZXNzIGhhcyBzdGF0dXMgaW5mb3JtYXRpb24gYXZhaWxhYmxlLCBvbmUgb2YgdGhlbSBpcyBjaG9zZW4KICAgICAgICAgcmFuZG9tbHksIGFuZCBpdHMgc3RhdHVzIGlzIHJldHVybmVkIGltbWVkaWF0ZWx5LiAgVG8gZ2V0IHRoZSBzdGF0dXMKICAgICAgICAgZnJvbSB0aGUgb3RoZXIgZWxpZ2libGUgY2hpbGQgcHJvY2Vzc2VzLCB5b3UgbmVlZCB0byBjYWxsIDxDT0RFPndhaXRwaWQ8L0NPREU+CiAgICAgICAgIGFnYWluLgogICAgICAgICA8YnI+PGJyPiBUaGUgPFZBUj5vcHRpb25zPC9WQVI+IGFyZ3VtZW50IGlzIGEgYml0IG1hc2suICBJdHMgdmFsdWUgc2hvdWxkIGJlIHRoZQogICAgICAgICBiaXR3aXNlIE9SICh0aGF0IGlzLCB0aGUgPHNhbXA+fDwvc2FtcD4gb3BlcmF0b3IpIG9mIHplcm8gb3IgbW9yZSBvZiB0aGUKICAgICAgICAgPENPREU+V05PSEFORzwvQ09ERT4gYW5kIDxDT0RFPldVTlRSQUNFRDwvQ09ERT4gZmxhZ3MuICBZb3UgY2FuIHVzZSB0aGUKICAgICAgICAgPENPREU+V05PSEFORzwvQ09ERT4gZmxhZyB0byBpbmRpY2F0ZSB0aGF0IHRoZSBwYXJlbnQgcHJvY2VzcyBzaG91bGRuJ3Qgd2FpdDsKICAgICAgICAgYW5kIHRoZSA8Q09ERT5XVU5UUkFDRUQ8L0NPREU+IGZsYWcgdG8gcmVxdWVzdCBzdGF0dXMgaW5mb3JtYXRpb24gZnJvbSBzdG9wcGVkCiAgICAgICAgIHByb2Nlc3NlcyBhcyB3ZWxsIGFzIHByb2Nlc3NlcyB0aGF0IGhhdmUgdGVybWluYXRlZC4KICAgICAgICAgPGJyPjxicj4gVGhlIHN0YXR1cyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBjaGlsZCBwcm9jZXNzIGlzIHN0b3JlZCBpbiB0aGUgb2JqZWN0CiAgICAgICAgIHRoYXQgPFZBUj5zdGF0dXMtcHRyPC9WQVI+IHBvaW50cyB0bywgdW5sZXNzIDxWQVI+c3RhdHVzLXB0cjwvVkFSPiBpcyBhIG51bGwgcG9pbnRlci4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBpbiBtdWx0aS10aHJlYWRlZCBwcm9ncmFtcy4gIFRoaXMKICAgICAgICAgaXMgYSBwcm9ibGVtIGlmIHRoZSB0aHJlYWQgYWxsb2NhdGVzIHNvbWUgcmVzb3VyY2VzIChsaWtlIG1lbW9yeSwgZmlsZQogICAgICAgICBkZXNjcmlwdG9ycywgc2VtYXBob3JlcyBvciB3aGF0ZXZlcikgYXQgdGhlIHRpbWUgPENPREU+d2FpdHBpZDwvQ09ERT4gaXMKICAgICAgICAgY2FsbGVkLiAgSWYgdGhlIHRocmVhZCBnZXRzIGNhbmNlbGVkIHRoZXNlIHJlc291cmNlcyBzdGF5IGFsbG9jYXRlZAogICAgICAgICB1bnRpbCB0aGUgcHJvZ3JhbSBlbmRzLiAgVG8gYXZvaWQgdGhpcyBjYWxscyB0byA8Q09ERT53YWl0cGlkPC9DT0RFPiBzaG91bGQgYmUKICAgICAgICAgcHJvdGVjdGVkIHVzaW5nIGNhbmNlbGxhdGlvbiBoYW5kbGVycy4KICAgICAgICAgPGJyPjxicj4gVGhlIHJldHVybiB2YWx1ZSBpcyBub3JtYWxseSB0aGUgcHJvY2VzcyBJRCBvZiB0aGUgY2hpbGQgcHJvY2VzcyB3aG9zZQogICAgICAgICBzdGF0dXMgaXMgcmVwb3J0ZWQuICBJZiB0aGVyZSBhcmUgY2hpbGQgcHJvY2Vzc2VzIGJ1dCBub25lIG9mIHRoZW0gaXMKICAgICAgICAgd2FpdGluZyB0byBiZSBub3RpY2VkLCA8Q09ERT53YWl0cGlkPC9DT0RFPiB3aWxsIGJsb2NrIHVudGlsIG9uZSBpcy4gIEhvd2V2ZXIsCiAgICAgICAgIGlmIHRoZSA8Q09ERT5XTk9IQU5HPC9DT0RFPiBvcHRpb24gd2FzIHNwZWNpZmllZCwgPENPREU+d2FpdHBpZDwvQ09ERT4gd2lsbCByZXR1cm4KICAgICAgICAgemVybyBpbnN0ZWFkIG9mIGJsb2NraW5nLgogICAgICAgICA8YnI+PGJyPiBJZiBhIHNwZWNpZmljIFBJRCB0byB3YWl0IGZvciB3YXMgZ2l2ZW4gdG8gPENPREU+d2FpdHBpZDwvQ09ERT4sIGl0IHdpbGwKICAgICAgICAgaWdub3JlIGFsbCBvdGhlciBjaGlsZHJlbiAoaWYgYW55KS4gIFRoZXJlZm9yZSBpZiB0aGVyZSBhcmUgY2hpbGRyZW4KICAgICAgICAgd2FpdGluZyB0byBiZSBub3RpY2VkIGJ1dCB0aGUgY2hpbGQgd2hvc2UgUElEIHdhcyBzcGVjaWZpZWQgaXMgbm90IG9uZQogICAgICAgICBvZiB0aGVtLCA8Q09ERT53YWl0cGlkPC9DT0RFPiB3aWxsIGJsb2NrIG9yIHJldHVybiB6ZXJvIGFzIGRlc2NyaWJlZCBhYm92ZS4KICAgICAgICAgPGJyPjxicj4gQSB2YWx1ZSBvZiA8Q09ERT4tMTwvQ09ERT4gaXMgcmV0dXJuZWQgaW4gY2FzZSBvZiBlcnJvci4gIFRoZSBmb2xsb3dpbmcKICAgICAgICAgPENPREU+ZXJybm88L0NPREU+IGVycm9yIGNvbmRpdGlvbnMgYXJlIGRlZmluZWQgZm9yIHRoaXMgZnVuY3Rpb246CiAgICAgICAgIDxicj48YnI+IDxETD4KCiAgICAgICAgIDxEVD48Q09ERT5FSU5UUjwvQ09ERT4KPEREPgogICAgICAgICBUaGUgZnVuY3Rpb24gd2FzIGludGVycnVwdGVkIGJ5IGRlbGl2ZXJ5IG9mIGEgc2lnbmFsIHRvIHRoZSBjYWxsaW5nCiAgICAgICAgIHByb2Nlc3MuICAuCiAgICAgICAgIDxicj48YnI+IDxMST4gRUNISUxECiAgICAgICAgIFRoZXJlIGFyZSBubyBjaGlsZCBwcm9jZXNzZXMgdG8gd2FpdCBmb3IsIG9yIHRoZSBzcGVjaWZpZWQgPFZBUj5waWQ8L1ZBUj4KICAgICAgICAgaXMgbm90IGEgY2hpbGQgb2YgdGhlIGNhbGxpbmcgcHJvY2Vzcy4KICAgICAgICAgPGJyPjxicj4gPExJPiBFSU5WQUwKICAgICAgICAg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Uj53c2l6ZTwvVkFSPiBjaGFyYWN0ZXJzIGludG8gPFZBUj53dG88L1ZBUj4uCiAgICAgICAgIDxicj48YnI+IElmIHRoZSBsZW5ndGggb2YgPFZBUj53ZnJvbTwvVkFSPiBpcyBtb3JlIHRoZW4gPFZBUj5zaXplPC9WQVI+LCB0aGVuCiAgICAgICAgIDxDT0RFPndjcG5jcHk8L0NPREU+IGNvcGllcyBqdXN0IHRoZSBmaXJzdCA8VkFSPnNpemU8L1ZBUj4gd2lkZSBjaGFyYWN0ZXJzIGFuZAogICAgICAgICByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgd2lkZSBjaGFyYWN0ZXIgZGlyZWN0bHkgZm9sbG93aW5nIHRoZSBsYXN0CiAgICAgICAgIG5vbi1udWxsIHdpZGUgY2hhcmFjdGVyIHdoaWNoIHdhcyBjb3BpZWQgbGFzdC4gIE5vdGUgdGhhdCBpbiB0aGlzIGNhc2UKICAgICAgICAgdGhlcmUgaXMgbm8gbnVsbCB0ZXJtaW5hdG9yIHdyaXR0ZW4gaW50byA8VkFSPnd0bzwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gSWYgdGhlIGxlbmd0aCBvZiA8VkFSPndmcm9tPC9WQVI+IGlzIGxlc3MgdGhhbiA8VkFSPnNpemU8L1ZBUj4sIHRoZW4gPENPREU+d2NwbmNweTwvQ09ERT4KICAgICAgICAgY29waWVzIGFsbCBvZiA8VkFSPndmcm9tPC9WQVI+LCBmb2xsb3dlZCBieSBlbm91Z2ggbnVsbCBjaGFyYWN0ZXJzIHRvIGFkZCB1cAogICAgICAgICB0byA8VkFSPnNpemU8L1ZBUj4gY2hhcmFjdGVycyBpbiBhbGwuICBUaGlzIGJlaGF2aW9yIGlzIHJhcmVseSB1c2VmdWwsIGJ1dCBpdAogICAgICAgICBpcyBpbXBsZW1lbnRlZCB0byBiZSB1c2VmdWwgaW4gY29udGV4dHMgd2hlcmUgdGhpcyBiZWhhdmlvciBvZiB0aGUKICAgICAgICAgPENPREU+d2NzbmNweTwvQ09ERT4gaXMgdXNlZC4gIDxDT0RFPndjcG5jcHk8L0NPREU+IHJldHVybnMgYSBwb2ludGVyIHRvIHRoZQogICAgICAgICA8RU0+Zmlyc3Q8L0VNPiB3cml0dGVuIG51bGwgY2hhcmFjdGVyLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIElTTyBvciBQT1NJWCBidXQgd2FzIGZvdW5kIHVzZWZ1bCB3aGlsZQogICAgICAgICBkZXZlbG9waW5nIHRoZSBHTlUgQyBMaWJyYXJ5IGl0c2VsZi4KICAgICAgICAgPGJyPjxicj4gSXRzIGJlaGF2aW9yIGlzIHVuZGVmaW5lZCBpZiB0aGUgc3RyaW5ncyBvdmVybGFwLgogICAgICAgICA8YnI+PGJyPiA8Q09ERT53Y3BuY3B5PC9DT0RFPiBpcyBhIEdOVSBleHRlbnNpb24gYW5kIGlzIGRlY2xhcmVkIGluIDxUVD53Y2hhci5oPC9UVD4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3djaGFyLmh4cQB+HyZ0AEF3Y2hhcl90ICpyZXN0cmljdCB3dG8sIGNvbnN0IHdjaGFyX3QgKnJlc3RyaWN0IHdmcm9tLCBzaXplX3Qgc2l6ZXQACXdjaGFyX3QgKnQAB3djcnRvbWJzcQB+AAp0CXsKICAgICAgICBUaGUgPENPREU+d2NydG9tYjwvQ09ERT4gZnVuY3Rpb24gKGBgd2lkZSBjaGFyYWN0ZXIgcmVzdGFydGFibGUgdG8KICAgICAgICAgbXVsdGlieXRlJycpIGNvbnZlcnRzIGEgc2luZ2xlIHdpZGUgY2hhcmFjdGVyIGludG8gYSBtdWx0aWJ5dGUgc3RyaW5nCiAgICAgICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhhdCB3aWRlIGNoYXJhY3Rlci4KICAgICAgICAgPGJyPjxicj4gSWYgPFZBUj5zPC9WQVI+IGlzIGEgbnVsbCBwb2ludGVyLCB0aGUgZnVuY3Rpb24gcmVzZXRzIHRoZSBzdGF0ZSBzdG9yZWQgaW4KICAgICAgICAgdGhlIG9iamVjdHMgcG9pbnRlZCB0byBieSA8VkFSPnBzPC9WQVI+IChvciB0aGUgaW50ZXJuYWwgPENPREU+bWJzdGF0ZV90PC9DT0RFPgogICAgICAgICBvYmplY3QpIHRvIHRoZSBpbml0aWFsIHN0YXRlLiAgVGhpcyBjYW4gYWxzbyBiZSBhY2hpZXZlZCBieSBhIGNhbGwgbGlrZQogICAgICAgICB0aGlzOgogICAgICAgICA8YnI+PGJyPiA8cHJlPjxicj4KICAgICAgICAgd2NydG9tYnMgKHRlbXBfYnVmLCBMJ1wwJywgcHMpPGJyPgogICAgICAgICA8L3ByZT4KICAgICAgICAgPGJyPjxicj4KICAgICAgICAgc2luY2UsIGlmIDxWQVI+czwvVkFSPiBpcyBhIG51bGwgcG9pbnRlciwgPENPREU+d2NydG9tYjwvQ09ERT4gcGVyZm9ybXMgYXMgaWYgaXQKICAgICAgICAgd3JpdGVzIGludG8gYW4gaW50ZXJuYWwgYnVmZmVyLCB3aGljaCBpcyBndWFyYW50ZWVkIHRvIGJlIGxhcmdlIGVub3VnaC4KICAgICAgICAgPGJyPjxicj4gSWYgPFZBUj53YzwvVkFSPiBpcyB0aGUgTlVMIHdpZGUgY2hhcmFjdGVyLCA8Q09ERT53Y3J0b21iPC9DT0RFPiBlbWl0cywgaWYKICAgICAgICAgbmVjZXNzYXJ5LCBhIHNoaWZ0IHNlcXVlbmNlIHRvIGdldCB0aGUgc3RhdGUgPFZBUj5wczwvVkFSPiBpbnRvIHRoZSBpbml0aWFsCiAgICAgICAgIHN0YXRlIGZvbGxvd2VkIGJ5IGEgc2luZ2xlIE5VTCBieXRlLCB3aGljaCBpcyBzdG9yZWQgaW4gdGhlIHN0cmluZwogICAgICAgICA8VkFSPnM8L1ZBUj4uCiAgICAgICAgIDxicj48YnI+IE90aGVyd2lzZSBhIGJ5dGUgc2VxdWVuY2UgKHBvc3NpYmx5IGluY2x1ZGluZyBzaGlmdCBzZXF1ZW5jZXMpIGlzIHdyaXR0ZW4KICAgICAgICAgaW50byB0aGUgc3RyaW5nIDxWQVI+czwvVkFSPi4gIFRoaXMgb25seSBoYXBwZW5zIGlmIDxWQVI+d2M8L1ZBUj4gaXMgYSB2YWxpZCB3aWRlCiAgICAgICAgIGNoYXJhY3RlciAoaS5lLiwgaXQgaGFzIGEgbXVsdGlieXRlIHJlcHJlc2VudGF0aW9uIGluIHRoZSBjaGFyYWN0ZXIgc2V0CiAgICAgICAgIHNlbGVjdGVkIGJ5IGxvY2FsZSBvZiB0aGUgPENPREU+TENfQ1RZUEU8L0NPREU+IGNhdGVnb3J5KS4gIElmIDxWQVI+d2M8L1ZBUj4gaXMgbm8KICAgICAgICAgdmFsaWQgd2lkZSBjaGFyYWN0ZXIsIG5vdGhpbmcgaXMgc3RvcmVkIGluIHRoZSBzdHJpbmdzIDxWQVI+czwvVkFSPiwKICAgICAgICAgPENPREU+ZXJybm88L0NPREU+IGlzIHNldCB0byA8Q09ERT5FSUxTRVE8L0NPREU+LCB0aGUgY29udmVyc2lvbiBzdGF0ZSBpbiA8VkFSPnBzPC9WQVI+CiAgICAgICAgIGlzIHVuZGVmaW5lZCBhbmQgdGhlIHJldHVybiB2YWx1ZSBpcyA8Q09ERT4oc2l6ZV90KSAtMTwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IElmIG5vIGVycm9yIG9jY3VycmVkIHRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgc3RvcmVkIGluCiAgICAgICAgIHRoZSBzdHJpbmcgPFZBUj5zPC9WQVI+LiAgVGhpcyBpbmNsdWRlcyBhbGwgYnl0ZXMgcmVwcmVzZW50aW5nIHNoaWZ0CiAgICAgICAgIHNlcXVlbmNlcy4KICAgICAgICAgPGJyPjxicj4gT25lIHdvcmQgYWJvdXQgdGhlIGludGVyZmFjZSBvZiB0aGUgZnVuY3Rpb246IHRoZXJlIGlzIG5vIHBhcmFtZXRlcgogICAgICAgICBzcGVjaWZ5aW5nIHRoZSBsZW5ndGggb2YgdGhlIGFycmF5IDxWQVI+czwvVkFSPi4gIEluc3RlYWQgdGhlIGZ1bmN0aW9uCiAgICAgICAgIGFzc3VtZXMgdGhhdCB0aGVyZSBhcmUgYXQgbGVhc3QgPENPREU+TUJfQ1VSX01BWDwvQ09ERT4gYnl0ZXMgYXZhaWxhYmxlIHNpbmNlCiAgICAgICAgIHRoaXMgaXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGFueSBieXRlIHNlcXVlbmNlIHJlcHJlc2VudGluZyBhIHNpbmdsZQogICAgICAgICBjaGFyYWN0ZXIuICBTbyB0aGUgY2FsbGVyIGhhcyB0byBtYWtlIHN1cmUgdGhhdCB0aGVyZSBpcyBlbm91Z2ggc3BhY2UKICAgICAgICAgYXZhaWxhYmxlLCBvdGhlcndpc2UgYnVmZmVyIG92ZXJydW5zIGNhbiBvY2N1ci4KICAgICAgICAgPGJyPjxicj4gPENPREU+d2NydG9tYjwvQ09ERT4gd2FzIGludHJvZHVjZWQgaW4gQW1lbmRtZW50IDEgdG8gSVNPIEM5MCBhbmQgaXMKICAgICAgICAgZGVjbGFyZWQgaW4gPFRUPndjaGFyLmg8L1RUPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHd2NoYXIuaHhxAH4fLXQANGNoYXIgKnJlc3RyaWN0IHMsIHdjaGFyX3Qgd2MsIG1ic3RhdGVfdCAqcmVzdHJpY3QgcHN0AAZzaXplX3R0AAp3Y3NjYXNlY21wc3EAfgAKdAHeCiAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBsaWtlIDxDT0RFPndjc2NtcDwvQ09ERT4sIGV4Y2VwdCB0aGF0IGRpZmZlcmVuY2VzIGluIGNhc2UgYXJlCiAgICAgICAgIGlnbm9yZWQuICBIb3cgdXBwZXJjYXNlIGFuZCBsb3dlcmNhc2UgY2hhcmFjdGVycyBhcmUgcmVsYXRlZCBpcwogICAgICAgICBkZXRlcm1pbmVkIGJ5IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbG9jYWxlLiAgSW4gdGhlIHN0YW5kYXJkIDxDT0RFPiJDIjwvQ09ERT4KICAgICAgICAgbG9jYWxlIHRoZSBjaGFyYWN0ZXJzICJBIGFuZCAiYSBkbyBub3QgbWF0Y2ggYnV0IGluIGEgbG9jYWxlIHdoaWNoCiAgICAgICAgIHJlZ2FyZHMgdGhlc2UgY2hhcmFjdGVycyBhcyBwYXJ0cyBvZiB0aGUgYWxwaGFiZXQgdGhleSBkbyBtYXRjaC4KICAgICAgICAgPGJyPjxicj4KICAgICAgICAgPENPREU+d2NzY2FzZWNtcDwvQ09ERT4gaXMgYSBHTlUgZXh0ZW5zaW9uLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAd3Y2hhci5oeHEAfh80dAAmY29uc3Qgd2NoYXJfdCAqd3MxLCBjb25zdCB3Y2hhcl9UICp3czJ0AANpbnR0AAZ3Y3NjYXRzcQB+AAp0Au8KICAgICAgICBU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Y2F0ZWQgc3RyaW5nLiAgVGhlIHN0cmluZyBpcyBhbGxvY2F0ZWQgdXNpbmcKICAgICAgICAgPENPREU+bWFsbG9jPC9DT0RFPjsgc2VlIFVuY29uc3RyYWluZWQgQWxsb2NhdGlvbi4gIElmIDxDT0RFPm1hbGxvYzwvQ09ERT4KICAgICAgICAgY2Fubm90IGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgbmV3IHN0cmluZywgPENPREU+d2NzZHVwPC9DT0RFPiByZXR1cm5zIGEgbnVsbAogICAgICAgICBwb2ludGVyLiAgT3RoZXJ3aXNlIGl0IHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBuZXcgd2lkZSBjaGFyYWN0ZXIKICAgICAgICAgc3RyaW5nLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIGlzIGEgR05VIGV4dGVuc2lvbi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHd2NoYXIuaHhxAH4fbHQAEWNvbnN0IHdjaGFyX3QgKndzdAAJd2NoYXJfdCAqdAAId2NzZnRpbWVzcQB+AAp0BW8KICAgICAgICBUaGUgPENPREU+d2NzZnRpbWU8L0NPREU+IGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gdGhlIDxDT0RFPnN0cmZ0aW1lPC9DT0RFPgogICAgICAgICBmdW5jdGlvbiB3aXRoIHRoZSBkaWZmZXJlbmNlIHRoYXQgaXQgb3BlcmF0ZXMgb24gd2lkZSBjaGFyYWN0ZXIKICAgICAgICAgc3RyaW5ncy4gIFRoZSBidWZmZXIgd2hlcmUgdGhlIHJlc3VsdCBpcyBzdG9yZWQsIHBvaW50ZWQgdG8gYnkgPFZBUj5zPC9WQVI+LAogICAgICAgICBtdXN0IGJlIGFuIGFycmF5IG9mIHdpZGUgY2hhcmFjdGVycy4gIFRoZSBwYXJhbWV0ZXIgPFZBUj5zaXplPC9WQVI+IHdoaWNoCiAgICAgICAgIHNwZWNpZmllcyB0aGUgc2l6ZSBvZiB0aGUgb3V0cHV0IGJ1ZmZlciBnaXZlcyB0aGUgbnVtYmVyIG9mIHdpZGUKICAgICAgICAgY2hhcmFjdGVyLCBub3QgdGhlIG51bWJlciBvZiBieXRlcy4KICAgICAgICAgPGJyPjxicj4gQWxzbyB0aGUgZm9ybWF0IHN0cmluZyA8VkFSPnRlbXBsYXRlPC9WQVI+IGlzIGEgd2lkZSBjaGFyYWN0ZXIgc3RyaW5nLiAgU2luY2UKICAgICAgICAgYWxsIGNoYXJhY3RlcnMgbmVlZGVkIHRvIHNwZWNpZnkgdGhlIGZvcm1hdCBzdHJpbmcgYXJlIGluIHRoZSBiYXNpYwogICAgICAgICBjaGFyYWN0ZXIgc2V0IGl0IGlzIHBvcnRhYmx5IHBvc3NpYmxlIHRvIHdyaXRlIGZvcm1hdCBzdHJpbmdzIGluIHRoZSBDCiAgICAgICAgIHNvdXJjZSBjb2RlIHVzaW5nIHRoZSA8Q09ERT5MIjxzbWFsbD4uLi48L3NtYWxsPiI8L0NPREU+IG5vdGF0aW9uLiAgVGhlIHBhcmFtZXRlcgogICAgICAgICA8VkFSPmJyb2tlbnRpbWU8L1ZBUj4gaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgaW4gdGhlIDxDT0RFPnN0cmZ0aW1lPC9DT0RFPiBjYWxsLgogICAgICAgICA8YnI+PGJyPiBUaGUgPENPREU+d2NzZnRpbWU8L0NPREU+IGZ1bmN0aW9uIHN1cHBvcnRzIHRoZSBzYW1lIGZsYWdzLCBtb2RpZmllcnMsIGFuZAogICAgICAgICBmb3JtYXQgc3BlY2lmaWVycyBhcyB0aGUgPENPREU+c3RyZnRpbWU8L0NPREU+IGZ1bmN0aW9uLgogICAgICAgICA8YnI+PGJyPiBUaGUgcmV0dXJuIHZhbHVlIG9mIDxDT0RFPndjc2Z0aW1lPC9DT0RFPiBpcyB0aGUgbnVtYmVyIG9mIHdpZGUgY2hhcmFjdGVycwogICAgICAgICBzdG9yZWQgaW4gPENPREU+czwvQ09ERT4uICBXaGVuIG1vcmUgY2hhcmFjdGVycyB3b3VsZCBoYXZlIHRvIGJlIHdyaXR0ZW4gdGhhbgogICAgICAgICBjYW4gYmUgcGxhY2VkIGluIHRoZSBidWZmZXIgPFZBUj5zPC9WQVI+IHRoZSByZXR1cm4gdmFsdWUgaXMgemVybywgd2l0aCB0aGUKICAgICAgICAgc2FtZSBwcm9ibGVtcyBpbmRpY2F0ZWQgaW4gdGhlIDxDT0RFPnN0cmZ0aW1lPC9DT0RFPiBkb2N1bWVudGF0aW9uLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAZ0aW1lLmh4cQB+H3N0AE13Y2hhcl90ICpzLCBzaXplX3Qgc2l6ZSwgY29uc3Qgd2NoYXJfdCAqdGVtcGxhdGUsIGNvbnN0IHN0cnVjdCB0bSAqYnJva2VudGltZXQABnNpemVfdHQABndjc2xlbnNxAH4ACnQCXQogICAgICAgIFRoZSA8Q09ERT53Y3NsZW48L0NPREU+IGZ1bmN0aW9uIGlzIHRoZSB3aWRlIGNoYXJhY3RlciBlcXVpdmFsZW50IHRvCiAgICAgICAgIDxDT0RFPnN0cmxlbjwvQ09ERT4uICBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBudW1iZXIgb2Ygd2lkZSBjaGFyYWN0ZXJzIGluIHRoZQogICAgICAgICB3aWRlIGNoYXJhY3RlciBzdHJpbmcgcG9pbnRlZCB0byBieSA8VkFSPndzPC9WQVI+ICh0aGlzIGlzIGFsc28gdGhlIG9mZnNldCBvZgogICAgICAgICB0aGUgdGVybWluYXRpbmcgbnVsbCB3aWRlIGNoYXJhY3RlciBvZiA8VkFSPndzPC9WQVI+KS4KICAgICAgICAgPGJyPjxicj4gU2luY2UgdGhlcmUgYXJlIG5vIG11bHRpIHdpZGUgY2hhcmFjdGVyIHNlcXVlbmNlcyBtYWtpbmcgdXAgb25lCiAgICAgICAgIGNoYXJhY3RlciB0aGUgcmV0dXJuIHZhbHVlIGlzIG5vdCBvbmx5IHRoZSBvZmZzZXQgaW4gdGhlIGFycmF5LCBpdCBpcwogICAgICAgICBhbHNvIHRoZSBudW1iZXIgb2Ygd2lkZSBjaGFyYWN0ZXJzLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGZ1bmN0aW9uIHdhcyBpbnRyb2R1Y2VkIGluIEFtZW5kbWVudCAxIHRvIElTTyBDOTAuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3djaGFyLmh4cQB+H3p0ABFjb25zdCB3Y2hhcl90ICp3c3QABnNpemVfdHQAC3djc25jYXNlY21wc3EAfgAKdAEuCiAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBsaWtl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aGFyX3QgKndzMSwgY29uc3Qgd2NoYXJfdCAqd3MyLCBzaXplX3Qgc2l6ZXQAA2ludHQAB3djc25jcHlzcQB+AAp0BVwKICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gPENPREU+d2NzY3B5PC9DT0RFPiBidXQgYWx3YXlzIGNvcGllcyBleGFjdGx5CiAgICAgICAgIDxWQVI+c2l6ZTwvVkFSPiB3aWRlIGNoYXJhY3RlcnMgaW50byA8VkFSPnd0bzwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gSWYgdGhlIGxlbmd0aCBvZiA8VkFSPndmcm9tPC9WQVI+IGlzIG1vcmUgdGhhbiA8VkFSPnNpemU8L1ZBUj4sIHRoZW4KICAgICAgICAgPENPREU+d2NzbmNweTwvQ09ERT4gY29waWVzIGp1c3QgdGhlIGZpcnN0IDxWQVI+c2l6ZTwvVkFSPiB3aWRlIGNoYXJhY3RlcnMuICBOb3RlCiAgICAgICAgIHRoYXQgaW4gdGhpcyBjYXNlIHRoZXJlIGlzIG5vIG51bGwgdGVybWluYXRvciB3cml0dGVuIGludG8gPFZBUj53dG88L1ZBUj4uCiAgICAgICAgIDxicj48YnI+IElmIHRoZSBsZW5ndGggb2YgPFZBUj53ZnJvbTwvVkFSPiBpcyBsZXNzIHRoYW4gPFZBUj5zaXplPC9WQVI+LCB0aGVuCiAgICAgICAgIDxDT0RFPndjc25jcHk8L0NPREU+IGNvcGllcyBhbGwgb2YgPFZBUj53ZnJvbTwvVkFSPiwgZm9sbG93ZWQgYnkgZW5vdWdoIG51bGwgd2lkZQogICAgICAgICBjaGFyYWN0ZXJzIHRvIGFkZCB1cCB0byA8VkFSPnNpemU8L1ZBUj4gd2lkZSBjaGFyYWN0ZXJzIGluIGFsbC4gIFRoaXMKICAgICAgICAgYmVoYXZpb3IgaXMgcmFyZWx5IHVzZWZ1bCwgYnV0IGl0IGlzIHNwZWNpZmllZCBieSB0aGUgSVNPIEMKICAgICAgICAgc3RhbmRhcmQuCiAgICAgICAgIDxicj48YnI+IFRoZSBiZWhhdmlvciBvZiA8Q09ERT53Y3NuY3B5PC9DT0RFPiBpcyB1bmRlZmluZWQgaWYgdGhlIHN0cmluZ3Mgb3ZlcmxhcC4KICAgICAgICAgPGJyPjxicj4gVXNpbmcgPENPREU+d2NzbmNweTwvQ09ERT4gYXMgb3Bwb3NlZCB0byA8Q09ERT53Y3NjcHk8L0NPREU+IGlzIGEgd2F5IHRvIGF2b2lkIGJ1Z3MKICAgICAgICAgcmVsYXRpbmcgdG8gd3JpdGluZyBwYXN0IHRoZSBlbmQgb2YgdGhlIGFsbG9jYXRlZCBzcGFjZSBmb3IgPFZBUj53dG88L1ZBUj4uCiAgICAgICAgIEhvd2V2ZXIsIGl0IGNhbiBhbHNvIG1ha2UgeW91ciBwcm9ncmFtIG11Y2ggc2xvd2VyIGluIG9uZSBjb21tb24gY2FzZToKICAgICAgICAgY29weWluZyBhIHN0cmluZyB3aGljaCBpcyBwcm9iYWJseSBzbWFsbCBpbnRvIGEgcG90ZW50aWFsbHkgbGFyZ2UgYnVmZmVyLgogICAgICAgICBJbiB0aGlzIGNhc2UsIDxWQVI+c2l6ZTwvVkFSPiBtYXkgYmUgbGFyZ2UsIGFuZCB3aGVuIGl0IGlzLCA8Q09ERT53Y3NuY3B5PC9DT0RFPiB3aWxsCiAgICAgICAgIHdhc3RlIGEgY29uc2lkZXJhYmxlIGFtb3VudCBvZiB0aW1lIGNvcHlpbmcgbnVsbCB3aWRlIGNoYXJhY3RlcnMuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3djaGFyLmh4cQB+H5Z0AEF3Y2hhcl90ICpyZXN0cmljdCB3dG8sIGNvbnN0IHdjaGFyX3QgKnJlc3RyaWN0IHdmcm9tLCBzaXplX3Qgc2l6ZXQACXdjaGFyX3QgKnQAB3djc25sZW5zcQB+AAp0ARMKICAgICAgICA8Q09ERT53Y3NubGVuPC9DT0RFPiBpcyB0aGUgd2lkZSBjaGFyYWN0ZXIgZXF1aXZhbGVudCB0byA8Q09ERT5zdHJubGVuPC9DT0RFPi4gIFRoZQogICAgICAgICA8VkFSPm1heGxlbjwvVkFSPiBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiB3aWRlIGNoYXJhY3RlcnMuCiAgICAgICAgIDxicj48YnI+IFRoaXMgZnVuY3Rpb24gaXMgYSBHTlUgZXh0ZW5zaW9uIGFuZCBpcyBkZWNsYXJlZCBpbiA8VFQ+d2NoYXIuaDwvVFQ+LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAd3Y2hhci5oeHEAfh+ddAAgY29uc3Qgd2NoYXJfdCAqd3MsIHNpemVfdCBtYXhsZW50AAZzaXplX3R0AAp3Y3NucnRvbWJzc3EAfgAKdAMqCiAgICAgICAgVGhlIDxDT0RFPndjc25ydG9tYnM8L0NPREU+IGZ1bmN0aW9uIGltcGxlbWVudHMgdGhlIGNvbnZlcnNpb24gZnJvbSB3aWRlCiAgICAgICAgIGNoYXJhY3RlciBzdHJpbmdzIHRvIG11bHRpYnl0ZSBjaGFyYWN0ZXIgc3RyaW5ncy4gIEl0IGlzIHNpbWlsYXIgdG8KICAgICAgICAgPENPREU+d2NzcnRvbWJzPC9DT0RFPiBidXQsIGp1c3QgbGlrZSA8Q09ERT5tYnNucnRvd2NzPC9DT0RFPiwgaXQgdGFrZXMgYW4gZXh0cmEKICAgICAgICAgcGFyYW1ldGVyLCB3aGljaCBzcGVjaWZpZXMgdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQgc3RyaW5nLgogICAgICAgICA8YnI+PGJyPiBObyBtb3JlIHRoYW4gPFZBUj5ud2M8L1ZBUj4gd2lkZSBjaGFyYWN0ZXJzIGZyb20gdGhlIGlucHV0IHN0cmluZwogICAgICAgICA8Q09ERT4qPFZBUj5zcmM8L1ZBUj48L0NPREU+IGFyZSBjb252ZXJ0ZWQuICBJZiB0aGUgaW5wdXQgc3RyaW5nIGNvbnRhaW5zIGEgTlVMCiAgICAgICAgIHdpZGUgY2hhcmFjdGVyIGluIHRoZSBmaXJzdCA8VkFSPm53YzwvVkFSPiBjaGFyYWN0ZXJzLCB0aGUgY29udmVyc2lvbiBzdG9wcyBhdAogICAgICAgICB0aGlzIHBsYWNlLgogICAgICAgICA8YnI+PGJyPiBUaGUgPENPREU+d2NzbnJ0b21iczwvQ09ERT4gZnVuY3Rpb24gaXMgYSBHTlUgZXh0ZW5zaW9uIGFuZCBqdXN0IGxpa2UKICAgICAgICAgPENPREU+bWJzbnJ0b3djczwvQ09ERT4gaGVscHMgaW4gc2l0dWF0aW9ucyB3aGVyZSBubyBOVUwtdGVybWluYXRlZCBpbnB1dAogICAgICAgICBzdHJpbmdzIGFyZSBhdmFpbGFibGUuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3djaGFyLmh4cQB+H6R0AGBjaGFyICpyZXN0cmljdCBkc3QsIGNvbnN0IHdjaGFyX3QgKipyZXN0cmljdCBzcmMsIHNpemVfdCBud2MsIHNpemVfdCBsZW4sIG1ic3RhdGVfdCAqcmVzdHJpY3QgcHN0AAZzaXplX3R0AAd3Y3NwYnJrc3EAfgAKdAGpCiAgICAgICAgVGhlIDxDT0RFPndjc3Bicms8L0NPREU+IChgYHdpZGUgY2hhcmFjdGVyIHN0cmluZyBwb2ludGVyIGJyZWFrJycpIGZ1bmN0aW9uIGlzCiAgICAgICAgIHJlbGF0ZWQgdG8gPENPREU+d2NzY3NwbjwvQ09ERT4sIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBmaXJzdAogICAgICAgICB3aWRlIGNoYXJhY3RlciBpbiA8VkFSPndzdHJpbmc8L1ZBUj4gdGhhdCBpcyBhIG1lbWJlciBvZiB0aGUgc2V0CiAgICAgICAgIDxWQVI+c3RvcHNldDwvVkFSPiBpbnN0ZWFkIG9mIHRoZSBsZW5ndGggb2YgdGhlIGluaXRpYWwgc3Vic3RyaW5nLiAgSXQKICAgICAgICAgcmV0dXJucyBhIG51bGwgcG9pbnRlciBpZiBubyBzdWNoIGNoYXJhY3RlciBmcm9tIDxWQVI+c3RvcHNldDwvVkFSPiBpcyBmb3VuZC4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHd2NoYXIuaHhxAH4fq3QALmNvbnN0IHdjaGFyX3QgKndzdHJpbmcsIGNvbnN0IHdjaGFyX3QgKnN0b3BzZXR0AAl3Y2hhcl90ICp0AAd3Y3NyY2hyc3EAfgAKdADYCiAgICAgICAgVGhlIGZ1bmN0aW9uIDxDT0RFPndjc3JjaHI8L0NPREU+IGlzIGxpa2UgPENPREU+d2NzY2hyPC9DT0RFPiwgZXhjZXB0IHRoYXQgaXQgc2VhcmNoZXMKICAgICAgICAgYmFja3dhcmRzIGZyb20gdGhlIGVuZCBvZiB0aGUgc3RyaW5nIDxWQVI+d3N0cmluZzwvVkFSPiAoaW5zdGVhZCBvZiBmb3J3YXJkcwogICAgICAgICBmcm9tIHRoZSBmcm9udCkuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3djaGFyLmh4cQB+H7J0ACFjb25zdCB3Y2hhcl90ICp3c3RyaW5nLCB3Y2hhcl90IGN0AAl3Y2hhcl90ICp0AAl3Y3NydG9tYnNzcQB+AAp0CRgKICAgICAgICBUaGUgPENPREU+d2NzcnRvbWJzPC9DT0RFPiBmdW5jdGlvbiAoYGB3aWRlIGNoYXJhY3RlciBzdHJpbmcgcmVzdGFydGFibGUgdG8KICAgICAgICAgbXVsdGlieXRlIHN0cmluZycnKSBjb252ZXJ0cyB0aGUgTlVMLXRlcm1pbmF0ZWQgd2lkZSBjaGFyYWN0ZXIgc3RyaW5nIGF0CiAgICAgICAgIDxDT0RFPio8VkFSPnNyYzwvVkFSPjwvQ09ERT4gaW50byBhbiBlcXVpdmFsZW50IG11bHRpYnl0ZSBjaGFyYWN0ZXIgc3RyaW5nIGFuZAogICAgICAgICBzdG9yZXMgdGhlIHJlc3VsdCBpbiB0aGUgYXJyYXkgcG9pbnRlZCB0byBieSA8VkFSPmRzdDwvVkFSPi4gIFRoZSBOVUwgd2lkZQogICAgICAgICBjaGFyYWN0ZXIgaXMgYWxzbyBjb252ZXJ0ZWQuICBUaGUgY29udmVyc2lvbiBzdGFydHMgaW4gdGhlIHN0YXRlCiAgICAgICAgIGRlc2NyaWJlZCBpbiB0aGUgb2JqZWN0IHBvaW50ZWQgdG8gYnkgPFZBUj5wczwvVkFSPiBvciBieSBhIHN0YXRlIG9iamVjdAogICAgICAgICBsb2NhbGx5IHRvIDxDT0RFPndjc3J0b21iczwvQ09ERT4gaW4gY2FzZSA8VkFSPnBzPC9WQVI+IGlzIGEgbnVsbCBwb2ludGVyLiAgSWYKICAgICAgICAgPFZBUj5kc3Q8L1ZBUj4gaXMgYSBudWxsIHBvaW50ZXIsIHRoZSBjb252ZXJzaW9uIGlzIHBlcmZvcm1lZCBhcyB1c3VhbCBidXQgdGhlCiAgICAgICAgIHJlc3VsdCBpcyBub3QgYXZhaWxhYmxlLiAgSWYgYWxsIGNoYXJhY3RlcnMgb2YgdGhlIGlucHV0IHN0cmluZyB3ZXJlCiAgICAgICAgIHN1Y2Nlc3NmdWxseSBjb252ZXJ0ZWQgYW5kIGlmIDxWQVI+ZHN0PC9WQVI+IGlzIG5vdCBhIG51bGwgcG9pbnRlciwgdGhlCiAgICAgICAgIHBvaW50ZXIgcG9pbnRlZCB0byBieSA8VkFSPnNyYzwvVkFSPiBnZXRzIGFzc2lnbmVkIGEgbnVsbCBwb2ludGVyLgogICAgICAgICA8YnI+PGJyPiBJZiBvbmUgb2YgdGhlIHdpZGUgY2hhcmFjdGVycyBpbiB0aGUgaW5wdXQgc3RyaW5nIGhhcyBubyB2YWxpZCBtdWx0aWJ5dGUKICAgICAgICAgY2hhcmFjdGVyIGVxdWl2YWxlbnQsIHRoZSBjb252ZXJzaW9uIHN0b3BzIGVhcmx5LCBzZXRzIHRoZSBnbG9iYWwKICAgICAgICAgdmFyaWFibGUgPENPREU+ZXJybm88L0NPREU+IHRvIDxDT0RFPkVJTFNFUTwvQ09ERT4sIGFuZCByZXR1cm5zIDxDT0RFPihzaXplX3QpIC0xPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gQW5vdGhlciByZWFzb24gZm9yIGEgcHJlbWF0dXJlIHN0b3AgaXMgaWYgPFZBUj5kc3Q8L1ZBUj4gaXMgbm90IGEgbnVsbAogICAgICAgICBwb2ludGVyIGFuZCB0aGUgbmV4dCBjb252ZXJ0ZWQgY2hhcmFjdGVyIHdvdWxkIHJlcXVpcmUgbW9yZSB0aGFuCiAgICAgICAgIDxWQVI+bGVuPC9WQVI+IGJ5dGVzIGluIHRvdGFsIHRvIHRoZSBhcnJheSA8VkFSPmRzdDwvVkFSPi4gIEluIHRoaXMgY2FzZSAoYW5kIGlmCiAgICAgICAgIDxWQVI+ZGVzdDwvVkFSPiBpcyBub3QgYSBudWxsIHBvaW50ZXIpIHRoZSBwb2ludGVyIHBvaW50ZWQgdG8gYnkgPFZBUj5zcmM8L1ZBUj4gaXMKICAgICAgICAgYXNzaWduZWQgYSB2YWx1ZSBwb2ludGluZyB0byB0aGUgd2lkZSBjaGFyYWN0ZXIgcmlnaHQgYWZ0ZXIgdGhlIGxhc3Qgb25lCiAgICAgICAgIHN1Y2Nlc3NmdWxseSBjb252ZXJ0ZWQuCiAg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bnN0IHdjaGFyX3QgKmhheXN0YWNrLCBjb25zdCB3Y2hhcl90ICpuZWVkbGV0AAl3Y2hhcl90ICp0AAZ3Y3N0b2RzcQB+AAp0AdgKICAgICAgICBUaGUgPENPREU+d2NzdG9kPC9DT0RFPiwgPENPREU+d2NzdG9mPC9DT0RFPiwgYW5kIDxDT0RFPndjc3RvbDwvQ09ERT4gZnVuY3Rpb25zIGFyZQogICAgICAgICBlcXVpdmFsZW50IGluIG5lYXJseSBhbGwgYXNwZWN0IHRvIHRoZSA8Q09ERT5zdHJ0b2Q8L0NPREU+LCA8Q09ERT5zdHJ0b2Y8L0NPREU+LCBhbmQKICAgICAgICAgPENPREU+c3RydG9sZDwvQ09ERT4gZnVuY3Rpb25zIGJ1dCBpdCBoYW5kbGVzIHdpZGUgY2hhcmFjdGVyIHN0cmluZy4KICAgICAgICAgPGJyPjxicj4gVGhlIDxDT0RFPndjc3RvZDwvQ09ERT4gZnVuY3Rpb24gd2FzIGludHJvZHVjZWQgaW4gQW1lbmRtZW50IDEgb2YgSVNPCiAgICAgICAgIEM5MC4gIFRoZSA8Q09ERT53Y3N0b2Y8L0NPREU+IGFuZCA8Q09ERT53Y3N0b2xkPC9DT0RFPiBmdW5jdGlvbnMgd2VyZSBpbnRyb2R1Y2VkIGluCiAgICAgICAgIElTTyBDOTkuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3djaGFyLmh4cQB+H850ADpjb25zdCB3Y2hhcl90ICpyZXN0cmljdCBzdHJpbmcsIHdjaGFyX3QgKipyZXN0cmljdCB0YWlscHRydAAGZG91YmxldAAGd2NzdG9mc3EAfgAKdAHYCiAgICAgICAgVGhlIDxDT0RFPndjc3RvZDwvQ09ERT4sIDxDT0RFPndjc3RvZjwvQ09ERT4sIGFuZCA8Q09ERT53Y3N0b2w8L0NPREU+IGZ1bmN0aW9ucyBhcmUKICAgICAgICAgZXF1aXZhbGVudCBpbiBuZWFybHkgYWxsIGFzcGVjdCB0byB0aGUgPENPREU+c3RydG9kPC9DT0RFPiwgPENPREU+c3RydG9mPC9DT0RFPiwgYW5kCiAgICAgICAgIDxDT0RFPnN0cnRvbGQ8L0NPREU+IGZ1bmN0aW9ucyBidXQgaXQgaGFuZGxlcyB3aWRlIGNoYXJhY3RlciBzdHJpbmcuCiAgICAgICAgIDxicj48YnI+IFRoZSA8Q09ERT53Y3N0b2Q8L0NPREU+IGZ1bmN0aW9uIHdhcyBpbnRyb2R1Y2VkIGluIEFtZW5kbWVudCAxIG9mIElTTwogICAgICAgICBDOTAuICBUaGUgPENPREU+d2NzdG9mPC9DT0RFPiBhbmQgPENPREU+d2NzdG9sZDwvQ09ERT4gZnVuY3Rpb25zIHdlcmUgaW50cm9kdWNlZCBpbgogICAgICAgICBJU08gQzk5LgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAhzdGRsaWIuaHhxAH4f1XQAKGNvbnN0IHdjaGFyX3QgKnN0cmluZywgd2NoYXJfdCAqKnRhaWxwdHJ0AAVmbG9hdHQACXdjc3RvaW1heHNxAH4ACnQA/gogICAgICAgIFRoZSA8Q09ERT53Y3N0b2ltYXg8L0NPREU+IGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gdGhlIDxDT0RFPnN0cnRvaW1heDwvQ09ERT4gZnVuY3Rpb24KICAgICAgICAgaW4gbmVhcmx5IGFsbCBhc3BlY3RzIGJ1dCBoYW5kbGVzIHdpZGUgY2hhcmFjdGVyIHN0cmluZ3MuCiAgICAgICAgIDxicj48YnI+IFRoZSA8Q09ERT53Y3N0b2ltYXg8L0NPREU+IGZ1bmN0aW9uIHdhcyBpbnRyb2R1Y2VkIGluIElTTyBDOTkuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3djaGFyLmh4cQB+H9x0AERjb25zdCB3Y2hhcl90ICpyZXN0cmljdCBzdHJpbmcsIHdjaGFyX3QgKipyZXN0cmljdCB0YWlscHRyLCBpbnQgYmFzZXQACGludG1heF90dAAGd2NzdG9rc3EAfgAKdAmGCiAgICAgICAgQSBzdHJpbmcgY2FuIGJlIHNwbGl0IGludG8gdG9rZW5zIGJ5IG1ha2luZyBhIHNlcmllcyBvZiBjYWxscyB0byB0aGUKICAgICAgICAgZnVuY3Rpb24gPENPREU+d2NzdG9rPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gVGhlIHN0cmluZyB0byBiZSBzcGxpdCB1cCBpcyBwYXNzZWQgYXMgdGhlIDxWQVI+bmV3c3RyaW5nPC9WQVI+IGFyZ3VtZW50IG9uCiAgICAgICAgIHRoZSBmaXJzdCBjYWxsIG9ubHkuICBUaGUgPENPREU+d2NzdG9rPC9DT0RFPiBmdW5jdGlvbiB1c2VzIHRoaXMgdG8gc2V0IHVwCiAgICAgICAgIHNvbWUgaW50ZXJuYWwgc3RhdGUgaW5mb3JtYXRpb24uICBTdWJzZXF1ZW50IGNhbGxzIHRvIGdldCBhZGRpdGlvbmFsCiAgICAgICAgIHRva2VucyBmcm9tIHRoZSBzYW1lIHdpZGUgY2hhcmFjdGVyIHN0cmluZyBhcmUgaW5kaWNhdGVkIGJ5IHBhc3NpbmcgYQogICAgICAgICBudWxsIHBvaW50ZXIgYXMgdGhlIDxWQVI+bmV3c3RyaW5nPC9WQVI+IGFyZ3VtZW50LiAgQ2FsbGluZyA8Q09ERT53Y3N0b2s8L0NPREU+CiAgICAgICAgIHdpdGggYW5vdGhlciBub24tbnVsbCA8VkFSPm5ld3N0cmluZzwvVkFSPiBhcmd1bWVudCByZWluaXRpYWxpemVzIHRoZSBzdGF0ZQogICAgICAgICBpbmZvcm1hdGlvbi4gIEl0IGlzIGd1YXJhbnRlZWQgdGhhdCBubyBvdGhlciBsaWJyYXJ5IGZ1bmN0aW9uIGV2ZXIgY2FsbHMKICAgICAgICAgPENPREU+d2NzdG9rPC9DT0RFPiBiZWhpbmQgeW91ciBiYWNrICh3aGljaCB3b3VsZCBtZXNzIHVwIHRoaXMgaW50ZXJuYWwgc3RhdGUKICAgICAgICAgaW5mb3JtYXRpb24pLgogICAgICAgICA8YnI+PGJyPiBUaGUgPFZBUj5kZWxpbWl0ZXJzPC9WQVI+IGFyZ3VtZW50IGlzIGEgd2lkZSBjaGFyYWN0ZXIgc3RyaW5nIHRoYXQgc3BlY2lmaWVzCiAgICAgICAgIGEgc2V0IG9mIGRlbGltaXRlcnMgdGhhdCBtYXkgc3Vycm91bmQgdGhlIHRva2VuIGJlaW5nIGV4dHJhY3RlZC4gIEFsbAogICAgICAgICB0aGUgaW5pdGlhbCB3aWRlIGNoYXJhY3RlcnMgdGhhdCBhcmUgbWVtYmVycyBvZiB0aGlzIHNldCBhcmUgZGlzY2FyZGVkLgogICAgICAgICBUaGUgZmlyc3Qgd2lkZSBjaGFyYWN0ZXIgdGhhdCBpcyA8RU0+bm90PC9FTT4gYSBtZW1iZXIgb2YgdGhpcyBzZXQgb2YKICAgICAgICAgZGVsaW1pdGVycyBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IHRva2VuLiAgVGhlIGVuZCBvZiB0aGUgdG9rZW4KICAgICAgICAgaXMgZm91bmQgYnkgbG9va2luZyBmb3IgdGhlIG5leHQgd2lkZSBjaGFyYWN0ZXIgdGhhdCBpcyBhIG1lbWJlciBvZiB0aGUKICAgICAgICAgZGVsaW1pdGVyIHNldC4gIFRoaXMgd2lkZSBjaGFyYWN0ZXIgaW4gdGhlIG9yaWdpbmFsIHdpZGUgY2hhcmFjdGVyCiAgICAgICAgIHN0cmluZyA8VkFSPm5ld3N0cmluZzwvVkFSPiBpcyBvdmVyd3JpdHRlbiBieSBhIG51bGwgd2lkZSBjaGFyYWN0ZXIsIGFuZCB0aGUKICAgICAgICAgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0b2tlbiBpbiA8VkFSPm5ld3N0cmluZzwvVkFSPiBpcyByZXR1cm5lZC4KICAgICAgICAgPGJyPjxicj4gT24gdGhlIG5leHQgY2FsbCB0byA8Q09ERT53Y3N0b2s8L0NPREU+LCB0aGUgc2VhcmNoaW5nIGJlZ2lucyBhdCB0aGUgbmV4dAogICAgICAgICB3aWRlIGNoYXJhY3RlciBiZXlvbmQgdGhlIG9uZSB0aGF0IG1hcmtlZCB0aGUgZW5kIG9mIHRoZSBwcmV2aW91cyB0b2tlbi4KICAgICAgICAgTm90ZSB0aGF0IHRoZSBzZXQgb2YgZGVsaW1pdGVycyA8VkFSPmRlbGltaXRlcnM8L1ZBUj4gZG8gbm90IGhhdmUgdG8gYmUgdGhlCiAgICAgICAgIHNhbWUgb24gZXZlcnkgY2FsbCBpbiBhIHNlcmllcyBvZiBjYWxscyB0byA8Q09ERT53Y3N0b2s8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBJZiB0aGUgZW5kIG9mIHRoZSB3aWRlIGNoYXJhY3RlciBzdHJpbmcgPFZBUj5uZXdzdHJpbmc8L1ZBUj4gaXMgcmVhY2hlZCwgb3IKICAgICAgICAgaWYgdGhlIHJlbWFpbmRlciBvZiBzdHJpbmcgY29uc2lzdHMgb25seSBvZiBkZWxpbWl0ZXIgd2lkZSBjaGFyYWN0ZXJzLAogICAgICAgICA8Q09ERT53Y3N0b2s8L0NPREU+IHJldHVybnMgYSBudWxsIHBvaW50ZXIuCiAgICAgICAgIDxicj48YnI+IE5vdGUgdGhhdCBgYGNoYXJhY3RlcicnIGlzIGhlcmUgdXNlZCBpbiB0aGUgc2Vuc2Ugb2YgYnl0ZS4gIEluIGEgc3RyaW5nCiAgICAgICAgIHVzaW5nIGEgbXVsdGlieXRlIGNoYXJhY3RlciBlbmNvZGluZyAoYWJzdHJhY3QpIGNoYXJhY3RlciBjb25zaXN0aW5nIG9mCiAgICAgICAgIG1vcmUgdGhhbiBvbmUgYnl0ZSBhcmUgbm90IHRyZWF0ZWQgYXMgYW4gZW50aXR5LiAgRWFjaCBieXRlIGlzIHRyZWF0ZWQKICAgICAgICAgc2VwYXJhdGVseS4gIFRoZSBmdW5jdGlvbiBpcyBub3QgbG9jYWxlLWRlcGVuZGVudC4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHd2NoYXIuaHhxAH4f43QAKndjaGFyX3QgKm5ld3N0cmluZywgY29uc3QgY2hhciAqZGVsaW1pdGVyc3QACXdjaGFyX3QgKnQABndjc3RvbHNxAH4ACnQBBAogICAgICAgIFRoZSA8Q09ERT53Y3N0b2w8L0NPREU+IGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gdGhlIDxDT0RFPnN0cnRvbDwvQ09ERT4gZnVuY3Rpb24KICAgICAgICAgaW4gbmVhcmx5IGFsbCBhc3BlY3RzIGJ1dCBoYW5kbGVzIHdpZGUgY2hhcmFjdGVyIHN0cmluZ3MuCiAgICAgICAgIDxicj48YnI+IFRoZSA8Q09ERT53Y3N0b2w8L0NPREU+IGZ1bmN0aW9uIHdhcyBpbnRyb2R1Y2VkIGluIEFtZW5kbWVudCAxIG9mIElTTyBDOTAuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3djaGFyLmh4cQB+H+p0AERjb25zdCB3Y2hhcl90ICpyZXN0cmljdCBzdHJpbmcsIHdjaGFyX3QgKipyZXN0cmljdCB0YWlscHRyLCBpbnQgYmFzZXQACGxvbmcgaW50dAAHd2NzdG9sZHNxAH4ACnQB2AogICAgICAgIFRoZSA8Q09ERT53Y3N0b2Q8L0NPREU+LCA8Q09ERT53Y3N0b2Y8L0NPREU+LCBhbmQgPENPREU+d2NzdG9sPC9DT0RFPiBmdW5jdGlvbnMgYXJlCiAgICAgICAgIGVxdWl2YWxlbnQgaW4gbmVhcmx5IGFsbCBhc3BlY3QgdG8gdGhlIDxDT0RFPnN0cnRvZDwvQ09ERT4sIDxDT0RFPnN0cnRvZjwvQ09ERT4sIGFuZAogICAgICAgICA8Q09ERT5zdHJ0b2xkPC9DT0RFPiBmdW5jdGlvbnMgYnV0IGl0IGhhbmRsZXMgd2lkZSBjaGFyYWN0ZXIgc3RyaW5nLgogICAgICAgICA8YnI+PGJyPiBUaGUgPENPREU+d2NzdG9kPC9DT0RFPiBmdW5jdGlvbiB3YXMgaW50cm9kdWNlZCBpbiBBbWVuZG1lbnQgMSBvZiBJU08KICAgICAgICAgQzkwLiAgVGhlIDxDT0RFPndjc3RvZjwvQ09ERT4gYW5kIDxDT0RFPndjc3RvbGQ8L0NPREU+IGZ1bmN0aW9ucyB3ZXJlIGludHJvZHVjZWQgaW4KICAgICAgICAgSVNPIEM5OS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc3RkbGliLmh4cQB+H/F0AChjb25zdCB3Y2hhcl90ICpzdHJpbmcsIHdjaGFyX3QgKip0YWlscHRydAALbG9uZyBkb3VibGV0AAd3Y3N0b2xsc3EAfgAKdAEHCiAgICAgICAgVGhlIDxDT0RFPndjc3RvbGw8L0NPREU+IGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gdGhlIDxDT0RFPnN0cnRvbGw8L0NPREU+IGZ1bmN0aW9uCiAgICAgICAgIGluIG5lYXJseSBhbGwgYXNwZWN0cyBidXQgaGFuZGxlcyB3aWRlIGNoYXJhY3RlciBzdHJpbmdzLgogICAgICAgICA8YnI+PGJyPiBUaGUgPENPREU+d2NzdG9sbDwvQ09ERT4gZnVuY3Rpb24gd2FzIGludHJvZHVjZWQgaW4gQW1lbmRtZW50IDEgb2YgSVNPIEM5MC4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHd2NoYXIuaHhxAH4f+HQARGNvbnN0IHdjaGFyX3QgKnJlc3RyaWN0IHN0cmluZywgd2NoYXJfdCAqKnJlc3RyaWN0IHRhaWxwdHIsIGludCBiYXNldAANbG9uZyBsb25nIGludHQACHdjc3RvbWJzc3EAfgAKdARDCiAgICAgICAgVGhlIDxDT0RFPndjc3RvbWJzPC9DT0RFPiAoYGB3aWRlIGNoYXJhY3RlciBzdHJpbmcgdG8gbXVsdGlieXRlIHN0cmluZycnKQogICAgICAgICBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgbnVsbC10ZXJtaW5hdGVkIHdpZGUgY2hhcmFjdGVyIGFycmF5IDxWQVI+d3N0cmluZzwvVkFSPgogICAgICAgICBpbnRvIGEgc3RyaW5nIGNvbnRhaW5pbmcgbXVsdGlieXRlIGNoYXJhY3RlcnMsIHN0b3Jpbmcgbm90IG1vcmUgdGhhbgogICAgICAgICA8VkFSPnNpemU8L1ZBUj4gYnl0ZXMgc3RhcnRpbmcgYXQgPFZBUj5zdHJpbmc8L1ZBUj4sIGZvbGxvd2VkIGJ5IGEgdGVybWluYXRpbmcKICAgICAgICAgbnVsbCBjaGFyYWN0ZXIgaWYgdGhlcmUgaXMgcm9vbS4gIFRoZSBjb252ZXJzaW9uIG9mIGNoYXJhY3RlcnMgYmVnaW5zIGluCiAgICAgICAgIHRoZSBpbml0aWFsIHNoaWZ0IHN0YXRlLgogICAgICAgICA8YnI+PGJyPiBUaGUgdGVybWluYXRpbmcgbnVsbCBjaGFyYWN0ZXIgY291bnRzIHRvd2FyZHMgdGhlIHNpemUsIHNvIGlmIDxWQVI+c2l6ZTwvVkFSPgogICAgICAgICBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBieXRlcyBuZWVkZWQgaW4gPFZBUj53c3RyaW5nPC9WQVI+LCBubwogICAgICAgICB0ZXJtaW5hdGluZyBudWxsIGNoYXJhY3RlciBpcyBzdG9yZWQuCiAgICAgICAgIDxicj48YnI+IElmIGEgY29kZSB0aGF0IGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYSB2YWxpZCBtdWx0aWJ5dGUgY2hhcmFjdGVyIGlzCiAgICAgICAgIGZvdW5kLCB0aGUgPENPREU+d2NzdG9tYnM8L0NPREU+IGZ1bmN0aW9uIHJldHVybnMgYSB2YWx1ZSBvZiAtMS4KICAgICAgICAgT3RoZXJ3aXNlLCB0aGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgc3RvcmVkIGluIHRoZSBhcnJheQogICAgICAgICA8VkFSPnN0cmluZzwvVkFSPi4gIFRoaXMgbnVtYmVyIGRvZXMgbm90IGluY2x1ZGUgdGhlIHRlcm1pbmF0aW5nIG51bGwgY2hhcmFjdGVyLAogICAgICAgICB3aGljaCBpcyBwcmVzZW50IGlmIHRoZSBudW1iZXIgaXMgbGVzcyB0aGFuIDxWQVI+c2l6ZTwvVkFSPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAIc3RkbGliLmh4cQB+H/90ADFjaGFyICpzdHJpbmcsIGNvbnN0IHdjaGFyX3QgKndzdHJpbmcsIHNpemVfdCBzaXpldAAGc2l6ZV90dAAGd2NzdG9xc3EAfgAKdADuCiAgICAgICAgVGhlIDxDT0RFPndjc3RvcTwvQ09ERT4gZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byB0aGUgPENPREU+c3RydG9xPC9DT0RFPiBmdW5jdGlvbgogICAgICAgICBpbiBuZWFybHkgYWxsIGFzcGVjdHMgYnV0IGhhbmRsZXMgd2lkZSBjaGFyYWN0ZXIgc3RyaW5ncy4KICAgICAgICAgPGJyPjxicj4gVGhlIDxDT0RFPndjc3RvcTwvQ09ERT4gZnVuY3Rpb24gaXMgYSBHTlUgZXh0ZW5zaW9uLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAd3Y2hhci5oeHEAfiAGdABEY29uc3Qgd2NoYXJfdCAqcmVzdHJpY3Qgc3RyaW5nLCB3Y2hhcl90ICoqcmVzdHJpY3QgdGFpbHB0ciwgaW50IGJhc2V0AA1sb25nIGxvbmcgaW50dAAHd2NzdG91bHNxAH4ACnQBBwogICAgICAgIFRoZSA8Q09ERT53Y3N0b3VsPC9DT0RFPiBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIHRoZSA8Q09ERT5zdHJ0b3VsPC9DT0RFPiBmdW5jdGlvbgogICAgICAgICBpbiBuZWFybHkgYWxsIGFzcGVjdHMgYnV0IGhhbmRsZXMgd2lkZSBjaGFyYWN0ZXIgc3RyaW5ncy4KICAgICAgICAgPGJyPjxicj4gVGhlIDxDT0RFPndjc3RvdWw8L0NPREU+IGZ1bmN0aW9uIHdhcyBpbnRyb2R1Y2VkIGluIEFtZW5kbWVudCAxIG9mIElTTyBDOTAuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3djaGFyLmh4cQB+IA10AERjb25zdCB3Y2hhcl90ICpyZXN0cmljdCBzdHJpbmcsIHdjaGFyX3QgKipyZXN0cmljdCB0YWlscHRyLCBpbnQgYmFzZXQAEXVuc2lnbmVkIGxvbmcgaW50dAAId2NzdG91bGxzcQB+AAp0AQoKICAgICAgICBUaGUgPENPREU+d2NzdG91bGw8L0NPREU+IGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gdGhlIDxDT0RFPnN0cnRvdWxsPC9DT0RFPiBmdW5jdGlvbgogICAgICAgICBpbiBuZWFybHkgYWxsIGFzcGVjdHMgYnV0IGhhbmRsZXMgd2lkZSBjaGFyYWN0ZXIgc3RyaW5ncy4KICAgICAgICAgPGJyPjxicj4gVGhlIDxDT0RFPndjc3RvdWxsPC9DT0RFPiBmdW5jdGlvbiB3YXMgaW50cm9kdWNlZCBpbiBBbWVuZG1lbnQgMSBvZiBJU08gQzkwLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAd3Y2hhci5oeHEAfiAUdABEY29uc3Qgd2NoYXJfdCAqcmVzdHJpY3Qgc3RyaW5nLCB3Y2hhcl90ICoqcmVzdHJpY3QgdGFpbHB0ciwgaW50IGJhc2V0ABZ1bnNpZ25lZCBsb25nIGxvbmcgaW50dAAJd2NzdG91bWF4c3EAfgAKdAD+CiAgICAgICAgVGhlIDxDT0RFPndjc3RvdW1heDwvQ09ERT4gZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byB0aGUgPENPREU+c3RydG91bWF4PC9DT0RFPiBmdW5jdGlvbgogICAgICAgICBpbiBuZWFybHkgYWxsIGFzcGVjdHMgYnV0IGhhbmRsZXMgd2lkZSBjaGFyYWN0ZXIgc3RyaW5ncy4KICAgICAgICAgPGJyPjxicj4gVGhlIDxDT0RFPndjc3RvdW1heDwvQ09ERT4gZnVuY3Rpb24gd2FzIGludHJvZHVjZWQgaW4gSVNPIEM5OS4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHd2NoYXIuaHhxAH4gG3QARGNvbnN0IHdjaGFyX3QgKnJlc3RyaWN0IHN0cmluZywgd2NoYXJfdCAqKnJlc3RyaWN0IHRhaWxwdHIsIGludCBiYXNldAAJdWludG1heF90dAAHd2NzdG91cXNxAH4ACnQA8QogICAgICAgIFRoZSA8Q09ERT53Y3N0b3VxPC9DT0RFPiBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIHRoZSA8Q09ERT5zdHJ0b3VxPC9DT0RFPiBmdW5jdGlvbgogICAgICAgICBpbiBuZWFybHkgYWxsIGFzcGVjdHMgYnV0IGhhbmRsZXMgd2lkZSBjaGFyYWN0ZXIgc3RyaW5ncy4KICAgICAgICAgPGJyPjxicj4gVGhlIDxDT0RFPndjc3RvdXE8L0NPREU+IGZ1bmN0aW9uIGlzIGEgR05VIGV4dGVuc2lvbi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHd2NoYXIuaHhxAH4gInQARGNvbnN0IHdjaGFyX3QgKnJlc3RyaWN0IHN0cmluZywgd2NoYXJfdCAqKnJlc3RyaWN0IHRhaWxwdHIsIGludCBiYXNldAAWdW5zaWduZWQgbG9uZyBsb25nIGludHQABndjc3djc3NxAH4ACnQA2gogICAgICAgIDxDT0RFPndjc3djczwvQ09ERT4gaXMgYW4gZGVwcmVjYXRlZCBhbGlhcyBmb3IgPENPREU+d2Nzc3RyPC9DT0RFPi4gIFRoaXMgaXMgdGhlCiAgICAgICAgIG5hbWUgb3JpZ2luYWxseSB1c2VkIGluIHRoZSBYL09wZW4gUG9ydGFiaWxpdHkgR3VpZGUgYmVmb3JlIHRoZQogICAgICAgICBBbWVuZG1lbnQgMSB0byBJU08gQzkwIHdhcyBwdWJsaXNoZWQuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3djaGFyLmh4cQB+ICl0AC5jb25zdCB3Y2hhcl90ICpoYXlzdGFjaywgY29uc3Qgd2NoYXJfdCAqbmVlZGxldAAJd2NoYXJfdCAqdAAHd2NzeGZybXNxAH4ACnQG6wogICAgICAgIFRoZSBmdW5jdGlvbiA8Q09ERT53Y3N4ZnJtPC9DT0RFPiB0cmFuc2Zvcm1zIHdpZGUgY2hhcmFjdGVyIHN0cmluZyA8VkFSPndmcm9tPC9WQVI+CiAgICAgICAgIHVzaW5nIHRoZSBjb2xsYXRpb24gdHJhbnNmb3JtYXRpb24gZGV0ZXJtaW5lZCBieSB0aGUgbG9jYWxlIGN1cnJlbnRseQogICAgICAgICBzZWxlY3RlZCBmb3IgY29sbGF0aW9uLCBhbmQgc3RvcmVzIHRoZSB0cmFuc2Zvcm1lZCBzdHJpbmcgaW4gdGhlIGFycmF5CiAgICAgICAgIDxWQVI+d3RvPC9WQVI+LiAgVXAgdG8gPFZBUj5zaXplPC9WQVI+IHdpZGUgY2hhcmFjdGVycyAoaW5jbHVkaW5nIGEgdGVybWluYXRpbmcgbnVsbAogICAgICAgICBjaGFyYWN0ZXIpIGFyZSBzdG9yZWQuCiAgICAgICAgIDxicj48YnI+IFRoZSBiZWhhdmlvciBpcyB1bmRlZmluZWQgaWYgdGhlIHN0cmluZ3MgPFZBUj53dG88L1ZBUj4gYW5kIDxWQVI+d2Zyb208L1ZBUj4KICAgICAgICAgb3ZlcmxhcDsgc2VlIENvcHlpbmcgYW5kIENvbmNhdGVuYXRpb24uCiAgICAgICAgIDxicj48YnI+IFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIGxlbmd0aCBvZiB0aGUgZW50aXJlIHRyYW5zZm9ybWVkIHdpZGUgY2hhcmFjdGVyCiAgICAgICAgIHN0cmluZy4gIFRoaXMgdmFsdWUgaXMgbm90IGFmZmVjdGVkIGJ5IHRoZSB2YWx1ZSBvZiA8VkFSPnNpemU8L1ZBUj4sIGJ1dCBpZgogICAgICAgICBpdCBpcyBncmVhdGVyIG9yIGVxdWFsIHRoYW4gPFZBUj5zaXplPC9WQVI+LCBpdCBtZWFucyB0aGF0IHRoZSB0cmFuc2Zvcm1lZAogICAgICAgICB3aWRlIGNoYXJhY3RlciBzdHJpbmcgZGlkIG5vdCBlbnRpcmVseSBmaXQgaW4gdGhlIGFycmF5IDxWQVI+d3RvPC9WQVI+LiAgSW4KICAgICAgICAgdGhpcyBjYXNlLCBvbmx5IGFzIG11Y2ggb2YgdGhlIHdpZGUgY2hhcmFjdGVyIHN0cmluZyBhcyBhY3R1YWxseSBmaXRzCiAgICAgICAgIHdhcyBzdG9yZWQuICBUbyBnZXQgdGhlIHdob2xlIHRyYW5zZm9ybWVkIHdpZGUgY2hhcmFjdGVyIHN0cmluZywgY2FsbAogICAgICAgICA8Q09ERT53Y3N4ZnJtPC9DT0RFPiBhZ2FpbiB3aXRoIGEgYmlnZ2VyIG91dHB1dCBhcnJheS4KICAgICAgICAgPGJyPjxicj4gVGhlIHRyYW5zZm9ybWVkIHdpZGUgY2hhcmFjdGVyIHN0cmluZyBtYXkgYmUgbG9uZ2VyIHRoYW4gdGhlIG9yaWdpbmFsCiAgICAgICAgIHdpZGUgY2hhcmFjdGVyIHN0cmluZywgYW5kIGl0IG1heSBhbHNvIGJlIHNob3J0ZXIuCiAgICAgICAgIDxicj48YnI+IElmIDxWQVI+c2l6ZTwvVkFSPiBpcyB6ZXJvLCBubyBjaGFyYWN0ZXJzIGFyZSBzdG9yZWQgaW4gPFZBUj50bzwvVkFSPi4gIEluIHRoaXMKICAgICAgICAgY2FzZSwgPENPREU+d2NzeGZybTwvQ09ERT4gc2ltcGx5IHJldHVybnMgdGhlIG51bWJlciBvZiB3aWRlIGNoYXJhY3RlcnMgdGhhdAogICAgICAgICB3b3VsZCBiZSB0aGUgbGVuZ3RoIG9mIHRoZSB0cmFuc2Zvcm1lZCB3aWRlIGNoYXJhY3RlciBzdHJpbmcuICBUaGlzIGlzCiAgICAgICAgIHVzZWZ1bCBmb3IgZGV0ZXJtaW5pbmcgd2hhdCBzaXplIHRoZSBhbGxvY2F0ZWQgYXJyYXkgc2hvdWxkIGJlIChyZW1lbWJlcgogICAgICAgICB0byBtdWx0aXBseSB3aXRoIDxDT0RFPnNpemVvZiAod2NoYXJfdCk8L0NPREU+KS4gIEl0IGRvZXMgbm90IG1hdHRlciB3aGF0CiAgICAgICAgIDxWQVI+d3RvPC9WQVI+IGlzIGlmIDxWQVI+c2l6ZTwvVkFSPiBpcyB6ZXJvOyA8VkFSPnd0bzwvVkFSPiBtYXkgZXZlbiBiZSBhIG51bGwgcG9pbnRlci4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHd2NoYXIuaHhxAH4gMHQAOHdjaGFyX3QgKnJlc3RyaWN0IHd0bywgY29uc3Qgd2NoYXJfdCAqd2Zyb20sIHNpemVfdCBzaXpldAAGc2l6ZV90dAAFd2N0b2JzcQB+AAp0AeYKICAgICAgICBUaGUgPENPREU+d2N0b2I8L0NPREU+IGZ1bmN0aW9uIChgYHdpZGUgY2hhcmFjdGVyIHRvIGJ5dGUnJykgdGFrZXMgYXMgdGhlCiAgICAgICAgIHBhcmFtZXRlciBhIHZhbGlkIHdpZGUgY2hhcmFjdGVyLiAgSWYgdGhlIG11bHRpYnl0ZSByZXByZXNlbnRhdGlvbiBmb3IKICAgICAgICAgdGhpcyBjaGFyYWN0ZXIgaW4gdGhlIGluaXRpYWwgc3RhdGUgaXMgZXhhY3RseSBvbmUgYnl0ZSBsb25nLCB0aGUgcmV0dXJuCiAgICAgICAgIHZhbHVlIG9mIHRoaXMgZnVuY3Rpb24gaXMgdGhpcyBjaGFyYWN0ZXIuICBPdGhlcndpc2UgdGhlIHJldHVybiB2YWx1ZSBpcwogICAgICAgICA8Q09ERT5FT0Y8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiA8Q09ERT53Y3RvYjwvQ09ERT4gd2FzIGludHJvZHVjZWQgaW4gQW1lbmRtZW50IDEgdG8gSVNPIEM5MCBhbmQKICAgICAgICAgaXMgZGVjbGFyZWQgaW4gPFRUPndjaGFyLmg8L1RUPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAHd2NoYXIuaHhxAH4gN3QACHdpbnRfdCBjdAADaW50dAAGd2N0b21ic3EAfgAKdAdWCiAgICAgICAgVGhlIDxDT0RFPndjdG9tYjwvQ09ERT4gKGBgd2lkZSBjaGFyYWN0ZXIgdG8gbXVsdGlieXRlJycpIGZ1bmN0aW9uIGNvbnZlcnRzCiAgICAgICAgIHRoZSB3aWRlIGNoYXJhY3RlciBjb2RlIDxWQVI+d2NoYXI8L1ZBUj4gdG8gaXRzIGNvcnJlc3BvbmRpbmcgbXVsdGlieXRlCiAgICAgICAgIGNoYXJhY3RlciBzZXF1ZW5jZSwgYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGluIGJ5dGVzIHN0YXJ0aW5nIGF0CiAgICAgICAgIDxWQVI+c3RyaW5nPC9WQVI+LiAgQXQgbW9zdCA8Q09ERT5NQl9DVVJfTUFYPC9DT0RFPiBjaGFyYWN0ZXJzIGFyZSBzdG9yZWQuCiAgICAgICAgIDxicj48YnI+IDxDT0RFPndjdG9tYjwvQ09ERT4gd2l0aCBub24tbnVsbCA8VkFSPnN0cmluZzwvVkFSPiBkaXN0aW5ndWlzaGVzIHRocmVlCiAgICAgICAgIHBvc3NpYmlsaXRpZXMgZm9yIDxWQVI+d2NoYXI8L1ZBUj46IGEgdmFsaWQgd2lkZSBjaGFyYWN0ZXIgY29kZSAob25lIHRoYXQgY2FuCiAgICAgICAgIGJlIHRyYW5zbGF0ZWQgdG8gYSBtdWx0aWJ5dGUgY2hhcmFjdGVyKSwgYW4gaW52YWxpZCBjb2RlLCBhbmQKICAgICAgICAgPENPREU+TCdcMCc8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBHaXZlbiBhIHZhbGlkIGNvZGUsIDxDT0RFPndjdG9tYjwvQ09ERT4gY29udmVydHMgaXQgdG8gYSBtdWx0aWJ5dGUgY2hhcmFjdGVyLAogICAgICAgICBzdG9yaW5nIHRoZSBieXRlcyBzdGFydGluZyBhdCA8VkFSPnN0cmluZzwvVkFSPi4gIFRoZW4gaXQgcmV0dXJucyB0aGUgbnVtYmVyCiAgICAgICAgIG9mIGJ5dGVzIGluIHRoYXQgY2hhcmFjdGVyIChhbHdheXMgYXQgbGVhc3QgMSBhbmQgbmV2ZXIgbW9yZQogICAgICAgICB0aGFuIDxDT0RFPk1CX0NVUl9NQVg8L0NPREU+KS4KICAgICAgICAgPGJyPjxicj4gSWYgPFZBUj53Y2hhcjwvVkFSPiBpcyBhbiBpbnZhbGlkIHdpZGUgY2hhcmFjdGVyIGNvZGUsIDxDT0RFPndjdG9tYjwvQ09ERT4gcmV0dXJucwogICAgICAgICAtMS4gIElmIDxWQVI+d2NoYXI8L1ZBUj4gaXMgPENPREU+TCdcMCc8L0NPREU+LCBpdCByZXR1cm5zIDxDT0RFPjA8L0NPREU+LCBhbHNvCiAgICAgICAgIHN0b3JpbmcgPENPREU+J1wwJzwvQ09ERT4gaW4gPENPREU+KjxWQVI+c3RyaW5nPC9WQVI+PC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gSWYgdGhlIG11bHRpYnl0ZSBjaGFyYWN0ZXIgY29kZSB1c2VzIHNoaWZ0IGNoYXJhY3RlcnMsIHRoZW4KICAgICAgICAgPENPREU+d2N0b21iPC9DT0RFPiBtYWludGFpbnMgYW5kIHVwZGF0ZXMgYSBzaGlmdCBzdGF0ZSBhcyBpdCBzY2Fucy4gIElmIHlvdQogICAgICAgICBjYWxsIDxDT0RFPndjdG9tYjwvQ09ERT4gd2l0aCBhIG51bGwgcG9pbnRlciBmb3IgPFZBUj5zdHJpbmc8L1ZBUj4sIHRoYXQKICAgICAgICAgaW5pdGlhbGl6ZXMgdGhlIHNoaWZ0IHN0YXRlIHRvIGl0cyBzdGFuZGFyZCBpbml0aWFsIHZhbHVlLiAgSXQgYWxzbwogICAgICAgICByZXR1cm5zIG5vbnplcm8gaWYgdGhlIG11bHRpYnl0ZSBjaGFyYWN0ZXIgY29kZSBpbiB1c2UgYWN0dWFsbHkgaGFzIGEKICAgICAgICAgc2hpZnQgc3RhdGUuICAuCiAgICAgICAgIDxicj48YnI+IENhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aXRoIGEgPFZBUj53Y2hhcjwvVkFSPiBhcmd1bWVudCBvZiB6ZXJvIHdoZW4KICAgICAgICAgPFZBUj5zdHJpbmc8L1ZBUj4gaXMgbm90IG51bGwgaGFzIHRoZSBzaWRlLWVmZmVjdCBvZiByZWluaXRpYWxpemluZyB0aGUKICAgICAgICAgc3RvcmVkIHNoaWZ0IHN0YXRlIDxFTT5hcyB3ZWxsIGFzPC9FTT4gc3RvcmluZyB0aGUgbXVsdGlieXRlIGNoYXJhY3RlcgogICAgICAgICA8Q09ERT4nXDAnPC9DT0RFPiBhbmQgcmV0dXJuaW5nIDAuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHN0ZGxpYi5oeHEAfiA+dAAbY2hhciAqc3RyaW5nLCB3Y2hhcl90IHdjaGFydAADaW50dAAHd2N0cmFuc3NxAH4ACnQCjAogICAgICAgIFRoZSA8Q09ERT53Y3RyYW5zPC9DT0RFPiBmdW5jdGlvbiBoYXMgdG8gYmUgdXNlZCB0byBmaW5kIG91dCB3aGV0aGVyIGEgbmFtZWQKICAgICAgICAgbWFwcGluZyBpcyBkZWZpbmVkIGluIHRoZSBjdXJyZW50IGxvY2FsZSBzZWxlY3RlZCBmb3IgdGhlCiAgICAgICAgIDxDT0RFPkxDX0NUWVBFPC9DT0RFPiBjYXRlZ29yeS4gIElmIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBub24temVybywgeW91IGNhbiB1c2UKICAgICAgICAgaXQgYWZ0ZXJ3YXJkcyBpbiBjYWxscyB0byA8Q09ERT50b3djdHJhbnM8L0NPREU+LiAgSWYgdGhlIHJldHVybiB2YWx1ZSBpcwogICAgICAgICB6ZXJvIG5vIHN1Y2ggbWFwcGluZyBpcyBrbm93biBpbiB0aGUgY3VycmVudCBsb2NhbGUuCiAgICAgICAgIDxicj48YnI+IEJlc2lkZSBsb2NhbGUtc3BlY2lmaWMgbWFwcGluZ3MgdGhlcmUgYXJlIHR3byBtYXBwaW5ncyB3aGljaCBhcmUKICAgICAgICAgZ3VhcmFudGVlZCB0byBiZSBhdmFpbGFibGUgaW4gZXZlcnkgbG9jYWxlOgogICAgICAgICA8YnI+PGJyPiA8RFQ+PHByZT48L3ByZT4KPEREPjxicj4KICAgICAgICAgPGJyPjxicj4KICAgICAgICAgVGhlc2UgZnVuY3Rpb25zIGFyZSBkZWNsYXJlZCBpbiA8VFQ+d2N0eXBlLmg8L1RUPi4KICAgICAgICBzcQB+AA8AAAABdwQAAAABdAAId2N0eXBlLmh4cQB+IEV0ABRjb25zdCBjaGFyICpwcm9wZXJ0eXQACXdjdHJhbnNfdHQABndjdHlwZXNxAH4ACnQCSQogICAgICAgIFRoZSA8Q09ERT53Y3R5cGU8L0NPREU+IHJldHVybnMgYSB2YWx1ZSByZXByZXNlbnRpbmcgYSBjbGFzcyBvZiB3aWRlCiAgICAgICAgIGNoYXJhY3RlcnMgd2hpY2ggaXMgaWRlbnRpZmllZCBieSB0aGUgc3RyaW5nIDxWQVI+cHJvcGVydHk8L1ZBUj4uICBCZXNpZGUKICAgICAgICAgc29tZSBzdGFuZGFyZCBwcm9wZXJ0aWVzIGVhY2gg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VkFSPnNpemU8L1ZBUj4gd2lkZSBjaGFyYWN0ZXJzIGF0IDxWQVI+d2Zyb208L1ZBUj4KICAgICAgICAgaW50byB0aGUgPFZBUj5zaXplPC9WQVI+IHdpZGUgY2hhcmFjdGVycyBhdCA8VkFSPnd0bzwvVkFSPiwgZXZlbiBpZiB0aG9zZSB0d28KICAgICAgICAgYmxvY2tzIG9mIHNwYWNlIG92ZXJsYXAuICBJbiB0aGUgY2FzZSBvZiBvdmVybGFwLCA8Q09ERT5tZW1tb3ZlPC9DT0RFPiBpcwogICAgICAgICBjYXJlZnVsIHRvIGNvcHkgdGhlIG9yaWdpbmFsIHZhbHVlcyBvZiB0aGUgd2lkZSBjaGFyYWN0ZXJzIGluIHRoZSBibG9jawogICAgICAgICBhdCA8VkFSPndmcm9tPC9WQVI+LCBpbmNsdWRpbmcgdGhvc2Ugd2lkZSBjaGFyYWN0ZXJzIHdoaWNoIGFsc28gYmVsb25nIHRvIHRoZQogICAgICAgICBibG9jayBhdCA8VkFSPnd0bzwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gVGhlIGZvbGxvd2luZyBpcyBhIHBvc3NpYmxlIGltcGxlbWVudGF0aW9uIG9mIDxDT0RFPndtZW1jcHk8L0NPREU+IGJ1dCB0aGVyZQogICAgICAgICBhcmUgbW9yZSBvcHRpbWl6YXRpb25zIHBvc3NpYmxlLgogICAgICAgICA8YnI+PGJyPiA8cHJlPjxicj4KICAgICAgICAgd2NoYXJfdCAqPGJyPgogICAgICAgICB3bWVtcGNweSAod2NoYXJfdCAqcmVzdHJpY3Qgd3RvLCBjb25zdCB3Y2hhcl90ICpyZXN0cmljdCB3ZnJvbSw8YnI+CiAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSk8YnI+CiAgICAgICAgIHs8YnI+CiAgICAgICAgICAgcmV0dXJuICh3Y2hhcl90ICopIG1lbXBjcHkgKHd0bywgd2Zyb20sIHNpemUgKiBzaXplb2YgKHdjaGFyX3QpKTs8YnI+CiAgICAgICAgIH08YnI+CiAgICAgICAgIDwvcHJlPgogICAgICAgICA8YnI+PGJyPiBUaGUgdmFsdWUgcmV0dXJuZWQgYnkgPENPREU+d21l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emVfdCBzaXpldAAJd2NoYXJfdCAqdAAHd29yZGV4cHNxAH4ACnQJwAogICAgICAgIFBlcmZvcm0gd29yZCBleHBhbnNpb24gb24gdGhlIHN0cmluZyA8VkFSPndvcmRzPC9WQVI+LCBwdXR0aW5nIHRoZSByZXN1bHQgaW4KICAgICAgICAgYSBuZXdseSBhbGxvY2F0ZWQgdmVjdG9yLCBhbmQgc3RvcmUgdGhlIHNpemUgYW5kIGFkZHJlc3Mgb2YgdGhpcyB2ZWN0b3IKICAgICAgICAgaW50byA8Q09ERT4qPFZBUj53b3JkLXZlY3Rvci1wdHI8L1ZBUj48L0NPREU+LiAgVGhlIGFyZ3VtZW50IDxWQVI+ZmxhZ3M8L1ZBUj4gaXMgYQogICAgICAgICBjb21iaW5hdGlvbiBvZiBiaXQgZmxhZ3M7IHNlZSBGbGFncyBmb3IgV29yZGV4cCwgZm9yIGRldGFpbHMgb2YKICAgICAgICAgdGhlIGZsYWdzLgogICAgICAgICA8YnI+PGJyPiBZb3Ugc2hvdWxkbid0IHVzZSBhbnkgb2YgdGhlIGNoYXJhY3RlcnMgPHNhbXA+fCY7PD48L3NhbXA+IGluIHRoZSBzdHJpbmcKICAgICAgICAgPFZBUj53b3JkczwvVkFSPiB1bmxlc3MgdGhleSBhcmUgcXVvdGVkOyBsaWtld2lzZSBmb3IgbmV3bGluZS4gIElmIHlvdSB1c2UKICAgICAgICAgdGhlc2UgY2hhcmFjdGVycyB1bnF1b3RlZCwgeW91IHdpbGwgZ2V0IHRoZSA8Q09ERT5XUkRFX0JBRENIQVI8L0NPREU+IGVycm9yCiAgICAgICAgIGNvZGUuICBEb24ndCB1c2UgcGFyZW50aGVzZXMgb3IgYnJhY2VzIHVubGVzcyB0aGV5IGFyZSBxdW90ZWQgb3IgcGFydCBvZgogICAgICAgICBhIHdvcmQgZXhwYW5zaW9uIGNvbnN0cnVjdC4gIElmIHlvdSB1c2UgcXVvdGF0aW9uIGNoYXJhY3RlcnMgPHNhbXA+JyJgPC9zYW1wPiwKICAgICAgICAgdGhleSBzaG91bGQgY29tZSBpbiBwYWlycyB0aGF0IGJhbGFuY2UuCiAgICAgICAgIDxicj48YnI+IFRoZSByZXN1bHRzIG9mIHdvcmQgZXhwYW5zaW9uIGFyZSBhIHNlcXVlbmNlIG9mIHdvcmRzLiAgVGhlIGZ1bmN0aW9uCiAgICAgICAgIDxDT0RFPndvcmRleHA8L0NPREU+IGFsbG9jYXRlcyBhIHN0cmluZyBmb3IgZWFjaCByZXN1bHRpbmcgd29yZCwgdGhlbgogICAgICAgICBhbGxvY2F0ZXMgYSB2ZWN0b3Igb2YgdHlwZSA8Q09ERT5jaGFyICoqPC9DT0RFPiB0byBzdG9yZSB0aGUgYWRkcmVzc2VzIG9mCiAgICAgICAgIHRoZXNlIHN0cmluZ3MuICBUaGUgbGFzdCBlbGVtZW50IG9mIHRoZSB2ZWN0b3IgaXMgYSBudWxsIHBvaW50ZXIuCiAgICAgICAgIFRoaXMgdmVjdG9yIGlzIGNhbGxlZCB0aGUgd29yZCB2ZWN0b3IuCiAgICAgICAgIDxicj48YnI+IFRvIHJldHVybiB0aGlzIHZlY3RvciwgPENPREU+d29yZGV4cDwvQ09ERT4gc3RvcmVzIGJvdGggaXRzIGFkZHJlc3MgYW5kIGl0cwogICAgICAgICBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cywgbm90IGNvdW50aW5nIHRoZSB0ZXJtaW5hdGluZyBudWxsIHBvaW50ZXIpCiAgICAgICAgIGludG8gPENPREU+KjxWQVI+d29yZC12ZWN0b3ItcHRyPC9WQVI+PC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gSWYgPENPREU+d29yZGV4cDwvQ09ERT4gc3VjY2VlZHMsIGl0IHJldHVybnMgMC4gIE90aGVyd2lzZSwgaXQgcmV0dXJucyBvbmUKICAgICAgICAgb2YgdGhlc2UgZXJyb3IgY29kZXM6CiAgICAgICAgIDxicj48YnI+IDxETD4KCiAgICAgICAgIDxEVD48Q09ERT5XUkRFX0JBRENIQVI8L0NPREU+CjxERD4KICAgICAgICAgVGhlIGlucHV0IHN0cmluZyA8VkFSPndvcmRzPC9WQVI+IGNvbnRhaW5zIGFuIHVucXVvdGVkIGludmFsaWQgY2hhcmFjdGVyIHN1Y2gKICAgICAgICAgYXMgPHNhbXA+fDwvc2FtcD4uCiAgICAgICAgIDxicj48YnI+IDxMST4gV1JERV9CQURWQUwKICAgICAgICAgVGhlIGlucHV0IHN0cmluZyByZWZlcnMgdG8gYW4gdW5kZWZpbmVkIHNoZWxsIHZhcmlhYmxlLCBhbmQgeW91IHVzZWQgdGhlIGZsYWcKICAgICAgICAgPENPREU+V1JERV9VTkRFRjwvQ09ERT4gdG8gZm9yYmlkIHN1Y2ggcmVmZXJlbmNlcy4KICAgICAgICAgPGJyPjxicj4gPExJPiBXUkRFX0NNRFNVQgogICAgICAgICBUaGUgaW5wdXQgc3RyaW5nIHVzZXMgY29tbWFuZCBzdWJzdGl0dXRpb24sIGFuZCB5b3UgdXNlZCB0aGUgZmxhZwogICAgICAgICA8Q09ERT5XUkRFX05PQ01EPC9DT0RFPiB0byBmb3JiaWQgY29tbWFuZCBzdWJzdGl0dXRpb24uCiAgICAgICAgIDxicj48YnI+IDxMST4gV1JERV9OT1NQQUNFCiAgICAgICAgIEl0IHdhcyBpbXBvc3NpYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSB0byBob2xkIHRoZSByZXN1bHQuICBJbiB0aGlzIGNhc2UsCiAgICAgICAgIDxDT0RFPndvcmRleHA8L0NPREU+IGNhbiBzdG9yZSBwYXJ0IG9mIHRoZSByZXN1bHRzLS0tYXMgbXVjaCBhcyBpdCBjb3VsZAogICAgICAgICBhbGxvY2F0ZSByb29tIGZvci4KICAgICAgICAgPGJyPjxicj4gPExJPiBXUkRFX1NZTlRBWAogICAgICAgICBUaGVyZSB3YXMgYSBzeW50YXggZXJyb3IgaW4gdGhlIGlucHV0IHN0cmluZy4gIEZvciBleGFtcGxlLCBhbiB1bm1hdGNoZWQKICAgICAgICAgcXVvdGluZyBjaGFyYWN0ZXIgaXMgYSBzeW50YXggZXJyb3IuCgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAl3b3JkZXhwLmh4cQB+IH10ADhjb25zdCBjaGFyICp3b3Jkcywgd29yZGV4cF90ICp3b3JkLXZlY3Rvci1wdHIsIGludCBmbGFnc3QAA2ludHQACHdvcmRmcmVlc3EAfgAKdAERCiAgICAgICAgRnJlZSB0aGUgc3RvcmFnZSB1c2VkIGZvciB0aGUgd29yZC1zdHJpbmdzIGFuZCB2ZWN0b3IgdGhhdAogICAgICAgICA8Q09ERT4qPFZBUj53b3JkLXZlY3Rvci1wdHI8L1ZBUj48L0NPREU+IHBvaW50cyB0by4gIFRoaXMgZG9lcyBub3QgZnJlZSB0aGUKICAgICAgICAgc3RydWN0dXJlIDxDT0RFPio8VkFSPndvcmQtdmVjdG9yLXB0cjwvVkFSPjwvQ09ERT4gaXRzZWxmLS0tb25seSB0aGUgb3RoZXIKICAgICAgICAgZGF0YSBpdCBwb2ludHMgdG8uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACXdvcmRleHAuaHhxAH4ghHQAGndvcmRleHBfdCAqd29yZC12ZWN0b3ItcHRydAAEdm9pZHQAB3dwcmludGZzcQB+AAp0ATYKICAgICAgICBUaGUgPENPREU+d3ByaW50ZjwvQ09ERT4gZnVuY3Rpb24gcHJpbnRzIHRoZSBvcHRpb25hbCBhcmd1bWVudHMgdW5kZXIgdGhlCiAgICAgICAgIGNvbnRyb2wgb2YgdGhlIHdpZGUgdGVtcGxhdGUgc3RyaW5nIDxWQVI+dGVtcGxhdGU8L1ZBUj4gdG8gdGhlIHN0cmVhbQogICAgICAgICA8Q09ERT5zdGRvdXQ8L0NPREU+LiAgSXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHdpZGUgY2hhcmFjdGVycyBwcmludGVkLCBvciBhCiAgICAgICAgIG5lZ2F0aXZlIHZhbHVlIGlmIHRoZXJlIHdhcyBhbiBvdXRwdXQgZXJyb3IuCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQAB3djaGFyLmh4cQB+IIt0ABxjb25zdCB3Y2hhcl90ICp0ZW1wbGF0ZSwgLi4udAADaW50dAAFd3JpdGVzcQB+AAp0Fh4KICAgICAgICBUaGUgPENPREU+d3JpdGU8L0NPREU+IGZ1bmN0aW9uIHdyaXRlcyB1cCB0byA8VkFSPnNpemU8L1ZBUj4gYnl0ZXMgZnJvbQogICAgICAgICA8VkFSPmJ1ZmZlcjwvVkFSPiB0byB0aGUgZmlsZSB3aXRoIGRlc2NyaXB0b3IgPFZBUj5maWxlZGVzPC9WQVI+LiAgVGhlIGRhdGEgaW4KICAgICAgICAgPFZBUj5idWZmZXI8L1ZBUj4gaXMgbm90IG5lY2Vzc2FyaWx5IGEgY2hhcmFjdGVyIHN0cmluZyBhbmQgYSBudWxsIGNoYXJhY3RlciBpcwogICAgICAgICBvdXRwdXQgbGlrZSBhbnkgb3RoZXIgY2hhcmFjdGVyLgogICAgICAgICA8YnI+PGJyPiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgd3JpdHRlbi4gIFRoaXMgbWF5IGJlCiAgICAgICAgIDxWQVI+c2l6ZTwvVkFSPiwgYnV0IGNhbiBhbHdheXMgYmUgc21hbGxlci4gIFlvdXIgcHJvZ3JhbSBzaG91bGQgYWx3YXlzIGNhbGwKICAgICAgICAgPENPREU+d3JpdGU8L0NPREU+IGluIGEgbG9vcCwgaXRlcmF0aW5nIHVudGlsIGFsbCB0aGUgZGF0YSBpcyB3cml0dGVuLgogICAgICAgICA8YnI+PGJyPiBPbmNlIDxDT0RFPndyaXRlPC9DT0RFPiByZXR1cm5zLCB0aGUgZGF0YSBpcyBlbnF1ZXVlZCB0byBiZSB3cml0dGVuIGFuZCBjYW4gYmUKICAgICAgICAgcmVhZCBiYWNrIHJpZ2h0IGF3YXksIGJ1dCBpdCBpcyBub3QgbmVjZXNzYXJpbHkgd3JpdHRlbiBvdXQgdG8gcGVybWFuZW50CiAgICAgICAgIHN0b3JhZ2UgaW1tZWRpYXRlbHkuICBZb3UgY2FuIHVzZSA8Q09ERT5mc3luYzwvQ09ERT4gd2hlbiB5b3UgbmVlZCB0byBiZSBzdXJlCiAgICAgICAgIHlvdXIgZGF0YSBoYXMgYmVlbiBwZXJtYW5lbnRseSBzdG9yZWQgYmVmb3JlIGNvbnRpbnVpbmcuICAoSXQgaXMgbW9yZQogICAgICAgICBlZmZpY2llbnQgZm9yIHRoZSBzeXN0ZW0gdG8gYmF0Y2ggdXAgY29uc2VjdXRpdmUgd3JpdGVzIGFuZCBkbyB0aGVtIGFsbAogICAgICAgICBhdCBvbmNlIHdoZW4gY29udmVuaWVudC4gIE5vcm1hbGx5IHRoZXkgd2lsbCBhbHdheXMgYmUgd3JpdHRlbiB0byBkaXNrCiAgICAgICAgIHdpdGhpbiBhIG1pbnV0ZSBvciBsZXNzLikgIE1vZGVybiBzeXN0ZW1zIHByb3ZpZGUgYW5vdGhlciBmdW5jdGlvbgogICAgICAgICA8Q09ERT5mZGF0YXN5bmM8L0NPREU+IHdoaWNoIGd1YXJhbnRlZXMgaW50ZWdyaXR5IG9ubHkgZm9yIHRoZSBmaWxlIGRhdGEgYW5kCiAgICAgICAgIGlzIHRoZXJlZm9yZSBmYXN0ZXIuCiAgICAgICAgIFlvdSBjYW4gdXNlIHRoZSA8Q09ERT5PX0ZTWU5DPC9DT0RFPiBvcGVuIG1vZGUgdG8gbWFrZSA8Q09ERT53cml0ZTwvQ09ERT4gYWx3YXlzCiAgICAgICAgIHN0b3JlIHRoZSBkYXRhIHRvIGRpc2sgYmVmb3JlIHJldHVybmluZzsgLgogICAgICAgICA8YnI+PGJyPiBJbiB0aGUgY2FzZSBvZiBhbiBlcnJvciwgPENPREU+d3JpdGU8L0NPREU+IHJldHVybnMgLTEuICBUaGUgZm9sbG93aW5nCiAgICAgICAgIDxDT0RFPmVycm5vPC9DT0RFPiBlcnJvciBjb25kaXRpb25zIGFyZSBkZWZpbmVkIGZvciB0aGlzIGZ1bmN0aW9uOgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8RFQ+PENPREU+RUFHQUlOPC9DT0RFPgo8REQ+CiAgICAgICAgIE5vcm1hbGx5LCA8Q09ERT53cml0ZTwvQ09ERT4gYmxvY2tzIHVudGlsIHRoZSB3cml0ZSBvcGVyYXRpb24gaXMgY29tcGxldGUuCiAgICAgICAgIEJ1dCBpZiB0aGUgPENPREU+T19OT05CTE9DSzwvQ09ERT4gZmxhZyBpcyBzZXQgZm9yIHRoZSBmaWxlICwgaXQgcmV0dXJucyBpbW1lZGlhdGVseSB3aXRob3V0IHdyaXRpbmcgYW55IGRhdGEgYW5kCiAgICAgICAgIHJlcG9ydHMgdGhpcyBlcnJvci4gIEFuIGV4YW1wbGUgb2YgYSBzaXR1YXRpb24gdGhhdCBtaWdodCBjYXVzZSB0aGUKICAgICAgICAgcHJvY2VzcyB0byBibG9jayBvbiBvdXRwdXQgaXMgd3JpdGluZyB0byBhIHRlcm1pbmFsIGRldmljZSB0aGF0IHN1cHBvcnRzCiAgICAgICAgIGZsb3cgY29udHJvbCwgd2hlcmUgb3V0cHV0IGhhcyBiZWVuIHN1c3BlbmRlZCBieSByZWNlaXB0IG9mIGEgU1RPUAogICAgICAgICBjaGFyYWN0ZXIuCiAgICAgICAgIDxicj48YnI+IENvbXBhdGliaWxpdHkgTm90ZTogTW9zdCB2ZXJzaW9ucyBvZiBCU0QgVW5peCB1c2UgYSBkaWZmZXJlbnQKICAgICAgICAgZXJyb3IgY29kZSBmb3IgdGhpczogPENPREU+RVdPVUxEQkxPQ0s8L0NPREU+LiAgSW4gdGhlIEdOVSBsaWJyYXJ5LAogICAgICAgICA8Q09ERT5FV09VTERCTE9DSzwvQ09ERT4gaXMgYW4gYWxpYXMgZm9yIDxDT0RFPkVBR0FJTjwvQ09ERT4sIHNvIGl0IGRvZXNuJ3QgbWF0dGVyCiAgICAgICAgIHdoaWNoIG5hbWUgeW91IHVzZS4KICAgICAgICAgPGJyPjxicj4gT24gc29tZSBzeXN0ZW1zLCB3cml0aW5nIGEgbGFyZ2UgYW1vdW50IG9mIGRhdGEgZnJvbSBhIGNoYXJhY3RlciBzcGVjaWFsCiAgICAgICAgIGZpbGUgY2FuIGFsc28gZmFpbCB3aXRoIDxDT0RFPkVBR0FJTjwvQ09ERT4gaWYgdGhlIGtlcm5lbCBjYW5ub3QgZmluZCBlbm91Z2gKICAgICAgICAgcGh5c2ljYWwgbWVtb3J5IHRvIGxvY2sgZG93biB0aGUgdXNlcidzIHBhZ2VzLiAgVGhpcyBpcyBsaW1pdGVkIHRvCiAgICAgICAgIGRldmljZXMgdGhhdCB0cmFuc2ZlciB3aXRoIGRpcmVjdCBtZW1vcnkgYWNjZXNzIGludG8gdGhlIHVzZXIncyBtZW1vcnksCiAgICAgICAgIHdoaWNoIG1lYW5zIGl0IGRvZXMgbm90IGluY2x1ZGUgdGVybWluYWxzLCBzaW5jZSB0aGV5IGFsd2F5cyB1c2UKICAgICAgICAgc2VwYXJhdGUgYnVmZmVycyBpbnNpZGUgdGhlIGtlcm5lbC4gIFRoaXMgcHJvYmxlbSBkb2VzIG5vdCBhcmlzZSBpbiB0aGUKICAgICAgICAgR05VIHN5c3RlbS4KICAgICAgICAgPGJyPjxicj4gPExJPiBFQkFERgogICAgICAgICBUaGUgPFZBUj5maWxlZGVzPC9WQVI+IGFyZ3VtZW50IGlzIG5vdCBhIHZhbGlkIGZpbGUgZGVzY3JpcHRvciwKICAgICAgICAgb3IgaXMgbm90IG9wZW4gZm9yIHdyaXRpbmcuCiAgICAgICAgIDxicj48YnI+IDxMST4gRUZCSUcKICAgICAgICAgVGhlIHNpemUgb2YgdGhlIGZpbGUgd291bGQgYmVjb21lIGxhcmdlciB0aGFuIHRoZSBpbXBsZW1lbnRhdGlvbiBjYW4gc3VwcG9ydC4KICAgICAgICAgPGJyPjxicj4gPExJPiBFSU5UUgogICAgICAgICBUaGUgPENPREU+d3JpdGU8L0NPREU+IG9wZXJhdGlvbiB3YXMgaW50ZXJydXB0ZWQgYnkgYSBzaWduYWwgd2hpbGUgaXQgd2FzCiAgICAgICAgIGJsb2NrZWQgd2FpdGluZyBmb3IgY29tcGxldGlvbi4gIEEgc2lnbmFsIHdpbGwgbm90IG5lY2Vzc2FyaWx5IGNhdXNlCiAgICAgICAgIDxDT0RFPndyaXRlPC9DT0RFPiB0byByZXR1cm4gPENPREU+RUlOVFI8L0NPREU+OyBpdCBtYXkgaW5zdGVhZCByZXN1bHQgaW4gYQogICAgICAgICBzdWNjZXNzZnVsIDxDT0RFPndyaXRlPC9DT0RFPiB3aGljaCB3cml0ZXMgZmV3ZXIgYnl0ZXMgdGhhbiByZXF1ZXN0ZWQuCiAgICAgICAgIC4KICAgICAgICAgPGJyPjxicj4gPExJPiBFSU8KICAgICAgICAgRm9yIG1hbnkgZGV2aWNlcywgYW5kIGZvciBkaXNrIGZpbGVzLCB0aGlzIGVycm9yIGNvZGUgaW5kaWNhdGVzCiAgICAgICAgIGEgaGFyZHdhcmUgZXJyb3IuCiAgICAgICAgIDxicj48YnI+IDxMST4gRU5PU1BDCiAgICAgICAgIFRoZSBkZXZpY2UgY29udGFpbmluZyB0aGUgZmlsZSBpcyBmdWxsLgogICAgICAgICA8YnI+PGJyPiA8TEk+IEVQSVBFCiAgICAgICAgIFRoaXMgZXJyb3IgaXMgcmV0dXJuZWQgd2hlbiB5b3UgdHJ5IHRvIHdyaXRlIHRvIGEgcGlwZSBvciBGSUZPIHRoYXQKICAgICAgICAgaXNuJ3Qgb3BlbiBmb3IgcmVhZGluZyBieSBhbnkgcHJvY2Vzcy4gIFdoZW4gdGhpcyBoYXBwZW5zLCBhIDxDT0RFPlNJR1BJUEU8L0NPREU+CiAgICAgICAgIHNpZ25hbCBpcyBhbHNvIHNlbnQgdG8gdGhlIHByb2Nlc3M7IHNlZSBTaWduYWwgSGFuZGxpbmcuCiAgICAgICAgIDxicj48YnI+IDxMST4gRUlOVkFMCiAgICAgICAgIEluIHNvbWUgc3lzdGVtcywgd2hlbiB3cml0aW5nIHRvIGEgY2hhcmFjdGVyIG9yIGJsb2NrIGRldmljZSwgcG9zaXRpb24KICAgICAgICAgYW5kIHNpemUgb2Zmc2V0cyBtdXN0IGJlIGFsaWduZWQgdG8gYSBwYXJ0aWN1bGFyIGJsb2NrIHNpemUuICBUaGlzIGVycm9yCiAgICAgICAgIGluZGljYXRlcyB0aGF0IHRoZSBvZmZzZXRzIHdlcmUgbm90IHByb3Blcmx5IGFsaWduZWQuCgogICAgICAgICA8YnI+PGJyPiBVbmxlc3MgeW91IGhhdmUgYXJyYW5nZWQgdG8gcHJldmVudCA8Q09ERT5FSU5UUjwvQ09ERT4gZmFpbHVyZXMsIHlvdSBzaG91bGQKICAgICAgICAgY2hlY2sgPENPREU+ZXJybm88L0NPREU+IGFmdGVyIGVhY2ggZmFpbGluZyBjYWxsIHRvIDxDT0RFPndyaXRlPC9DT0RFPiwgYW5kIGlmIHRoZQogICAgICAgICBlcnJvciB3YXMgPENPREU+RUlOVFI8L0NPREU+LCB5b3Ugc2hvdWxkIHNpbXBseSByZXBlYXQgdGhlIGNhbGwuCiAgICAgICAgIC4gIFRoZSBlYXN5IHdheSB0byBkbyB0aGlzIGlzIHdpdGggdGhlCiAgICAgICAgIG1hY3JvIDxDT0RFPlRFTVBfRkFJTFVSRV9SRVRSWTwvQ09ERT4sIGFzIGZvbGxvd3M6CiAgICAgICAgIDxicj48YnI+IDxwcmU+PGJyPgogICAgICAgICBuYnl0ZXMgPSBURU1QX0ZBSUxVUkVfUkVUUlkgKHdyaXRlIChkZXNjLCBidWZmZXIsIGNvdW50KSk7PGJyPgogICAgICAgICA8L3ByZT4KICAgICAgICAgPGJyPjxicj4gUGxlYXNlIG5vdGUgdGhhdCB0aGVyZSBpcyBubyBmdW5jdGlvbiBuYW1lZCA8Q09ERT53cml0ZTY0PC9DT0RFPi4gIFRoaXMgaXMgbm90CiAgICAgICAgIG5lY2Vzc2FyeSBzaW5jZSB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGRpcmVjdGx5IG1vZGlmeSBvciBoYW5kbGUgdGhlCiAgICAgICAgIHBvc3NpYmx5IHdpZGUgZmlsZSBvZmZzZXQuICBTaW5jZSB0aGUga2VybmVsIGhhbmRsZXMgdGhpcyBzdGF0ZQogICAgICAgICBpbnRlcm5hbGx5IHRoZSA8Q09ERT53cml0ZTwvQ09ERT4gZnVuY3Rpb24gY2FuIGJlIHVzZWQgZm9yIGFsbCBjYXNlcy4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBpbiBtdWx0aS10aHJlYWRlZCBwcm9ncmFtcy4gIFRoaXMKICAgICAgICAgaXMgYSBwcm9ibGVtIGlmIHRoZSB0aHJlYWQgYWxsb2NhdGVzIHNvbWUgcmVzb3VyY2VzIChsaWtlIG1lbW9yeSwgZmlsZQogICAgICAgICBkZXNjcmlwdG9ycywgc2VtYXBob3JlcyBvciB3aGF0ZXZlcikgYXQgdGhlIHRpbWUgPENPREU+d3JpdGU8L0NPREU+IGlzCiAgICAgICAgIGNhbGxlZC4gIElmIHRoZSB0aHJlYWQgZ2V0cyBjYW5jZWxlZCB0aGVzZSByZXNvdXJjZXMgc3RheSBhbGxvY2F0ZWQKICAgICAgICAgdW50aWwgdGhlIHByb2dyYW0gZW5kcy4gIFRvIGF2b2lkIHRoaXMsIGNhbGxzIHRvIDxDT0RFPndyaXRlPC9DT0RFPiBzaG91bGQgYmUKICAgICAgICAgcHJvdGVjdGVkIHVzaW5nIGNhbmNlbGxhdGlvbiBoYW5kbGVycy4KICAgICAgICAgPGJyPjxicj4gVGhlIDxDT0RFPndyaXRlPC9DT0RFPiBmdW5jdGlvbiBpcyB0aGUgdW5kZXJseWluZyBwcmltaXRpdmUgZm9yIGFsbCBvZiB0aGUKICAgICAgICAgZnVuY3Rpb25zIHRoYXQgd3JpdGUgdG8gc3RyZWFtcywgc3VjaCBhcyA8Q09ERT5mcHV0YzwvQ09ERT4uCiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACHVuaXN0ZC5oeHEAfiCSdAAsaW50IGZpbGVkZXMsIGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemV0AAdzc2l6ZV90dAAGd3JpdGV2c3EAfgAKdAJqCiAgICAgICAgPGJyPjxicj4gVGhlIDxDT0RFPndyaXRldjwvQ09ERT4gZnVuY3Rpb24gZ2F0aGVycyBkYXRhIGZyb20gdGhlIGJ1ZmZlcnMgZGVzY3JpYmVkIGluCiAgICAgICAgIDxWQVI+dmVjdG9yPC9WQVI+LCB3aGljaCBpcyB0YWtlbiB0byBiZSA8VkFSPmNvdW50PC9WQVI+IHN0cnVjdHVyZXMgbG9uZywgYW5kIHdyaXRlcwogICAgICAgICB0aGVtIHRvIDxDT0RFPmZpbGVkZXM8L0NPREU+LiAgQXMgZWFjaCBidWZmZXIgaXMgd3JpdHRlbiwgaXQgbW92ZXMgb24gdG8gdGhlCiAgICAgICAgIG5leHQuCiAgICAgICAgIDxicj48YnI+IExpa2UgPENPREU+cmVhZHY8L0NPREU+LCA8Q09ERT53cml0ZXY8L0NPREU+IG1heSBzdG9wIG1pZHN0cmVhbSB1bmRlciB0aGUgc2FtZQogICAgICAgICBjb25kaXRpb25zIDxDT0RFPndyaXRlPC9DT0RFPiB3b3VsZC4KICAgICAgICAgPGJyPjxicj4gVGhlIHJldHVybiB2YWx1ZSBpcyBhIGNvdW50IG9mIGJ5dGVzIHdyaXR0ZW4sIG9yIC0xIGluZGljYXRpbmcgYW4KICAgICAgICAgZXJyb3IuICBUaGUgcG9zc2libGUgZXJyb3JzIGFyZSB0aGUgc2FtZSBhcyBpbiA8Q09ERT53cml0ZTwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+CiAgICAgICAgc3EAfgAPAAAAAXcEAAAAAXQACXN5cy91aW8uaHhxAH4gmXQAMmludCBmaWxlZGVzLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKnZlY3RvciwgaW50IGNvdW50dAAHc3NpemVfdHQABndzY2FuZnNxAH4ACnQCRgogICAgICAgIFRoZSA8Q09ERT53c2NhbmY8L0NPREU+IGZ1bmN0aW9uIHJlYWRzIGZvcm1hdHRlZCBpbnB1dCBmcm9tIHRoZSBzdHJlYW0KICAgICAgICAgPENPREU+c3RkaW48L0NPREU+IHVuZGVyIHRoZSBjb250cm9sIG9mIHRoZSB0ZW1wbGF0ZSBzdHJpbmcgPFZBUj50ZW1wbGF0ZTwvVkFSPi4KICAgICAgICAgVGhlIG9wdGlvbmFsIGFyZ3VtZW50cyBhcmUgcG9pbnRlcnMgdG8gdGhlIHBsYWNlcyB3aGljaCByZWNlaXZlIHRoZQogICAgICAgICByZXN1bHRpbmcgdmFsdWVzLgogICAgICAgICA8YnI+PGJyPiBUaGUgcmV0dXJuIHZhbHVlIGlzIG5vcm1hbGx5IHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCBhc3NpZ25tZW50cy4gIElmCiAgICAgICAgIGFuIGVuZC1vZi1maWxlIGNvbmRpdGlvbiBpcyBkZXRlY3RlZCBiZWZvcmUgYW55IG1hdGNoZXMgYXJlIHBlcmZvcm1lZCwKICAgICAgICAgaW5jbHVkaW5nIG1hdGNoZXMgYWdhaW5zdCB3aGl0ZXNwYWNlIGFuZCBsaXRlcmFsIGNoYXJhY3RlcnMgaW4gdGhlCiAgICAgICAgIHRlbXBsYXRlLCB0aGVuIDxDT0RFPldFT0Y8L0NPREU+IGlzIHJldHVybmVkLgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAF0AAd3Y2hhci5oeHEAfiCgdAAcY29uc3Qgd2NoYXJfdCAqdGVtcGxhdGUsIC4uLnQAA2ludHQAAnkwc3EAfgAKdAFLCiAgICAgICAgPENPREU+eTA8L0NPREU+IHJldHVybnMgdGhlIEJlc3NlbCBmdW5jdGlvbiBvZiB0aGUgc2Vjb25kIGtpbmQgb2Ygb3JkZXIgMCBvZgogICAgICAgICA8VkFSPng8L1ZBUj4uICBJdCBtYXkgc2lnbmFsIHVuZGVyZmxvdyBpZiA8VkFSPng8L1ZBUj4gaXMgdG9vIGxhcmdlLiAgSWYgPFZBUj54PC9WQVI+CiAgICAgICAgIGlzIG5lZ2F0aXZlLCA8Q09ERT55MDwvQ09ERT4g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