IFRoZSBmaWxlIGZvcm1hdCBvZiB0aGUgdGVzdCBzdWl0ZSBpcyBhIHZlcnkgc2ltcGxlIGFuZCBleHRlbmRhYmxlIGZvcm1hdC4gQWxsCmRhdGEgZm9yIGEgc2luZ2xlIHRlc3QgY2FzZSByZXNpZGVzIGluIGEgc2luZ2xlIEFTQ0lJIGZpbGUuIExhYmVscyBtYXJrIHRoZQpiZWdpbm5pbmcgYW5kIHRoZSBlbmQgb2YgYWxsIHNlY3Rpb25zLiBFYWNoIGxhYmVsIG11c3QgYmUgd3JpdHRlbiBpbiBpdHMgb3duCmxpbmUgYW5kIGlzIHJlc2VtYmxpbmcgWE1ML0hUTUwuCgogRWFjaCBmaWxlIGlzIHNwbGl0IHVwIGluIHRocmVlIG1haW4gc2VjdGlvbnM6IHJlcGx5LCBjbGllbnQgYW5kIHZlcmlmeS4gVGhlCnJlcGx5IHNlY3Rpb24gaXMgdXNlZCBmb3IgdGhlIHNlcnZlciB0byBrbm93IHdoYXQgdG8gc2VuZCBhcyBhIHJlcGx5IGZvciB0aGUKcmVxdWVzdHMgY3VybCBzZW5kcywgdGhlIGNsaWVudCBzZWN0aW9uIGRlZmluZXMgaG93IHRoZSBjbGllbnQgc2hvdWxkIGJlaGF2ZQp3aGlsZSB0aGUgdmVyaWZ5IHNlY3Rpb24gZGVmaW5lcyBob3cgdG8gdmVyaWZ5IHRoYXQgdGhlIGRhdGEgc3RvcmVkIGFmdGVyIGEKY29tbWFuZCBoYXMgYmVlbiBydW4gZW5kZWQgdXAgY29ycmVjdGx5LgoKIEVhY2ggbWFpbiBzZWN0aW9uIGhhcyBhIG51bWJlciBvZiBhdmFpbGFibGUgc3Vic2VjdGlvbnMgdGhhdCBjYW4gYmUKc3BlY2lmaWVkLCB0aGF0IHdpbGwgYmUgY2hlY2tlZC91c2VkIGlmIHNwZWNpZmllZC4gVGhpcyBkb2N1bWVudCBpbmNsdWRlcyBhbGwKdGhlIHN1YnNlY3Rpb25zIGN1cnJlbnRseSBzdXBwb3J0ZWQuCgpNYWluIHNlY3Rpb25zIGFyZSAnaW5mbycsICdyZXBseScsICdjbGllbnQnIGFuZCAndmVyaWZ5Jy4KCjxpbmZvPgo8a2V5d29yZHM+CkEgbmV3bGluZS1zZXBhcmF0ZWQgbGlzdCBvZiBrZXl3b3JkcyBkZXNjcmliaW5nIHdoYXQgdGhpcyB0ZXN0IGNhc2UgdXNlcyBhbmQKdGVzdHMuIFRyeSB0byB1c2UgYW4gYWxyZWFkeSB1c2VkIGtleXdvcmQuIFRoZXNlIGtleXdvcmRzIHdpbGwgYmUgdXNlZCBmb3IKc3RhdGlzdGljYWwvaW5mb3JtYXRpb25hbCBwdXJwb3Nlcy4KPC9rZXl3b3Jkcz4KPC9pbmZvPgoKPHJlcGx5Pgo8ZGF0YSBbbm9jaGVjaz0xXSBbc2VuZHplcm89eWVzXSBbYmFzZTY0PXllc10+CqdkYXRhIHRvIHNlbnQgdG8gdGhlIGNsaWVudCBvbiBpdHMgcmVxdWVzdCBhbmQgbGF0ZXIgdmVyaWZpZWQgdGhhdCBpdCBhcnJpdmVkCnNhZmVseS4gU2V0IHRoZSBub2NoZWNrPTEgdG8gcHJldmVudCB0aGUgdGVzdCBzY3JpcHQgdG8gdmVyaWZ5IHRoZSBhcnJpdmFsCm9mIHRoaXMgZGF0YS4KCklmIHRoZSBkYXRhIGNvbnRhaW5zICdzd3NjbG9zZScgYW55d2hlcmUgd2l0aGluIHRoZSBzdGFydCBhbmQgZW5kIHRhZywgYW5kCnRoaXMgaXMgYSBIVFRQIHRlc3QsIHRoZW4gdGhlIGNvbm5lY3Rpb24gd2lsbCBiZSBjbG9zZWQgYnkgdGhlIHNlcnZlciBhZnRlcgp0aGlzIHJlc3BvbnNlIGlzIHNlbnQuIElmIG5vdCwgdGhlIGNvbm5lY3Rpb24gd2lsbCBiZSBrZXB0IHBlcnNpc3RhbnQuCgpJZiB0aGUgZGF0YSBjb250YWlucyAnc3dzYm91bmNlJyBhbnl3aGVyZSB3aXRoaW4gdGhlIHN0YXJ0IGFuZCBlbmQgdGFnLCB0aGUKSFRUUCBzZXJ2ZXIgd2lsbCBkZXRlY3QgaWYgdGhpcyBpcyBhIHNlY29uZCByZXF1ZXN0IHVzaW5nIHRoZSBzYW1lIHRlc3QgYW5kCnBhcnQgbnVtYmVyIGFuZCB3aWxsIHRoZW4gaW5jcmVhc2UgdGhlIHBhcnQgbnVtYmVyIHdpdGggb25lLiBUaGlzIGlzIHVzZWZ1bApmb3IgYXV0aCB0ZXN0cyBhbmQgc2ltaWxhci4KCidzZW5kemVybycgc2V0IHRvIHllcyBtZWFucyB0aGF0IHRoZSAoRlRQKSBzZXJ2ZXIgd2lsbCAic2VuZCIgdGhlIGRhdGEgZXZlbiBpZgp0aGUgc2l6ZSBpcyB6ZXJvIGJ5dGVzLiBVc2VkIHRvIHZlcmlmeSBjdXJsJ3MgYmVoYXZpb3VyIG9uIHplcm8gYnl0ZXMKdHJhbnNmZXJzLgoKJ2Jhc2U2NCcgc2V0IHRvIHllcyBtZWFucyB0aGF0IHRoZSBkYXRhIHByb3ZpZGVkIGluIHRoZSB0ZXN0LWZpbGUgaXMgYSBjaHVuawpvZiBkYXRhIGVuY29kZWQgd2l0aCBiYXNlNjQuIEl0IGlzIHRoZSBvbmx5IHdheSBhIHRlc3QgY2FzZSBjYW4gY29udGFpbiBiaW5hcnkKZGF0YS4gKFRoaXMgYXR0cmlidXRlIGNhbiBpbiBmYWN0IGJlIHVzZWQgb24gYW55IHNlY3Rpb24sIGJ1dCBpdCBkb2Vzbid0IG1ha2UKbXVjaCBzZW5zZSBmb3Igb3RoZXIgc2VjdGlvbnMgdGhhbiAiZGF0YSIpLgo8L2RhdGE+CjxkYXRhTlVNPgpTZW5kIGJhY2sgdGhpcyBjb250ZW50cyBpbnN0ZWFkIG9mIHRoZSA8ZGF0YT4gb25lLiBUaGUgbnVtIGlzIHNldCBieToKQSkgVGhlIHRlc3QgbnVtYmVyIGluIHRoZSByZXF1ZXN0IGxpbmUgaXMgPjEwMDAwIGFuZCB0aGlzIGlzIHRoZSByZW1haW5kZXIKb2YgW3Rlc3QgY2FzZSBudW1iZXJdJTEwMDAwLgpCKSBUaGUgcmVxdWVzdCB3YXMgSFRUUCBhbmQgaW5jbHVkZWQgZGlnZXN0IGRldGFpbHMsIHdoaWNoIGFkZHMgMTAwMCB0byBOVU0KQykgSWYgYSBIVFRQIHJlcXVlc3QgaXMgTlRMTSB0eXBlLTEsIGl0IGFkZHMgMTAwMSB0byBudW0KRCkgSWYgYSBIVFRQIHJlcXVlc3QgaXMgTlRMTSB0eXBlLTMsIGl0IGFkZHMgMTAwMiB0byBudW0KPC9kYXRhTlVNPgo8ZGF0YWNoZWNrIFtub25ld2xpbmU9eWVzXT4KaWYgdGhlIGRhdGEgaXMgc2VudCBidXQgdGhpcyBpcyB3aGF0IHNob3VsZCBiZSBjaGVja2VkIGFmdGVyd2FyZHMuIElmCidub25ld2xpbmUnIGlzIHNldCwgd2Ugd2lsbCBjdXQgb2ZmIHRoZSB0cmFpbGluZyBuZXdsaW5lIG9mIHRoaXMgZ2l2ZW4gZGF0YQpiZWZvcmUgY29tcGFyaW5nIHdpdGggdGhlIG9uZSBhY3R1YWxseSByZWNlaXZlZCBieSB0aGUgY2xpZW50CjwvZGF0YWNoZWNrPgo8c2l6ZT4KbnVtYmVyIHRvIHJldHVybiBvbiBhIGZ0cCBTSVpFIGNvbW1hbmQgKHNldCB0byAtMSB0byBtYWtlIHRoaXMgY29tbWFuZCBmYWlsKQo8L3NpemU+CjxtZHRtPgp3aGF0IHRvIHNlbmQgYmFjayBpZiB0aGUgY2xpZW50IHNlbmRzIGEgKEZUUCkgTURUTSBjb21tYW5kLCBzZXQgdG8gLTEgdG8KaGF2ZSBpdCByZXR1cm4gdGhhdCB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0CjwvbWR0bT4KPHBvc3RjbWQ+CnNwZWNpYWwgcHVycG9zZSBzZXJ2ZXItY29tbWFuZCB0byBjb250cm9sIGl0cyBiZWhhdmlvciAqYWZ0ZXIqIHRoZQpyZXBseSBpcyBzZW50CjwvcG9zdGNtZD4KPHNlcnZlcmNtZD4KU3BlY2lhbC1jb21tYW5kcyBmb3IgdGhlIHNlcnZlci4KRm9yIEZUUCwgdGhlc2UgYXJlIHN1cHBvcnRlZDoKUkVQTFkKQ09VTlQKREVMQVkKUkVUUldFSVJETwpSRVRSTk9TSVpFCk5PU0FWRQpTTE9XRE9XTgpQQVNWQkFESVAgIC0gbWFrZXMgUEFTViBzZW5kIGJhY2sgYW4gaWxsZWdhbCBJUCBpbiBpdHMgMjI3IHJlc3BvbnNlCgpGb3IgSFRUUCwgb25lIHNwZWNpZmllZCBjb21tYW5kIGlzIHN1cHBvcnRlZDoKICJhdXRoX3JlcXVpcmVkIiAtIGlmIHRoaXMgaXMgc2V0IGFuZCBhIFBPU1QvUFVUIGlzIG1hZGUgd2l0aG91dCBhdXRoLCB0aGUKIHNlcnZlciB3aWxsIE5PVCB3YWl0IGZvciB0aGUgZnVsbCByZXF1ZXN0IGJvZHkgdG8gZ2V0IHNlbnQKPC9zZXJ2ZXJjbWQ+CjwvcmVwbHk+Cgo8Y2xpZW50PgoKPHNlcnZlcj4KV2hhdCBzZXJ2ZXIocykgdGhpcyB0ZXN0IGNhc2UgcmVxdWlyZXMvdXNlczoKJ2h0dHAnICdmdHAnLCAnaHR0cHMnLCAnZnRwcycsICdodHRwLWlwdjYnLiBHaXZlIG9ubHkgb25lIHBlciBsaW5lLgo8L3NlcnZlcj4KCjxmZWF0dXJlcz4KQSBsaXN0IG9mIGZlYXR1cmVzIHRoYXQgTVVTVCBiZSBwcmVzZW50IGluIHRoZSBjbGllbnQvbGlicmFyeSBmb3IgdGhpcyB0ZXN0IHRvCmJlIGFibGUgdG8gcnVuIChpZiB0aGVzZSBmZWF0dXJlcyBhcmUgbm90IHByZXNlbnQsIHRoZSB0ZXN0IHdpbGwgYmUKU0tJUFBFRCkuIEZlYXR1cmVzIHRlc3RhYmxlIGhlcmUgYXJlOgoKU1NMCm5ldHJjX2RlYnVnCmxhcmdlX2ZpbGUKaWRuCmdldHJsaW1pdAppcHY2CmxpYnoKPC9mZWF0dXJlcz4KCjxraWxsc2VydmVyPgpVc2luZyB0aGUgc2FtZSBzeW50YXggYXMgaW4gPHNlcnZlcj4gYnV0IHdoZW4gbWVudGlvbmVkIGhlcmUgdGhlc2Ugc2VydmVycwphcmUgZXhwbGljaXRseSBLSUxMRUQgd2hlbiB0aGlzIHRlc3QgY2FzZSBpcyBjb21wbGV0ZWQuIE9ubHkgdXNlIHRoaXMgaWYgdGhlcmUKaXMgbm8gb3RoZXIgYWx0ZXJuYXRpdmVzLiBVc2luZyB0aGlzIG9mIGNvdXJzZSByZXF1aXJlcyBzdWJzZXF1ZW50IHRlc3RzIHRvCnJlc3RhcnQgc2VydmVycy4KPC9raWxsc2VydmVyPgoKPHByZWNoZWNrPgpBIGNvbW1hbmQgbGluZSB0aGF0IGlmIHNldCBnZXRzIHJ1biBieSB0aGUgdGVzdCBzY3JpcHQgYmVmb3JlIHRoZSB0ZXN0LiBJZiBhbgpvdXRwdXQgaXMgZGlzcGxheWVkIGJ5IHRoZSBjb21tYW5kIGxpbmUsIHRoZSB0ZXN0IHdpbGwgYmUgc2tpcHBlZCBhbmQgdGhlCihzaW5nbGUtbGluZSkgb3V0cHV0IHdpbGwgYmUgZGlzcGxheWVkIGFzIHJlYXNvbiBmb3Igbm90IHJ1bm5pbmcgdGhlIHRlc3QuCjwvcHJlY2hlY2s+Cgo8dG9vbD4KTmFtZSBvZiB0b29sIHRvIHVzZSBpbnN0ZWFkIG9mICJjdXJsIi4gVGhpcyB0b29sIG11c3QgYmUgYnVpbHQgYW5kIGV4aXN0CmluIHRoZSBsaWJ0ZXN0LyBkaXJlY3RvcnkuCjwvdG9vbD4KCjxuYW1lPgp0ZXN0IGNhc2UgZGVzY3JpcHRpb24KPC9uYW1lPgoKPHNldGVudj4KdmFyaWFibGUxPWNvbnRlbnRzMQp2YXJpYWJsZTI9Y29udGVudHMyCgpTZXQgdGhlIGdpdmVuIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIGJlZm9yZSB0aGUgYWN0dWFsCmNvbW1hbmQgaXMgcnVuLCB0aGV5IGFyZSBjbGVhcmVkIGFnYWluIGFmdGVyIHRoZSBjb21tYW5kIGhhcyBiZWVuIHJ1bi4KPC9zZXRlbnY+Cgo8Y29tbWFuZCBbb3B0aW9uPW5vLW91dHB1dF0+CmNvbW1hbmQgbGluZSB0byBydW4sIHRoZXJlJ3MgYSBidW5jaCBvZiAldmFyaWFibGVzIHRoYXQgZ2V0IHJlcGxhY2VkCmFjY29yZGluZ2x5LgoKTm90ZSB0aGF0IHRoZSBVUkwgdGhhdCBnZXRzIHBhc3NlZCB0byB0aGUgc2VydmVyIGFjdHVhbGx5IGNvbnRyb2xzIHdoYXQgZGF0YQp0aGF0IGlzIHJldHVybmVkLiBUaGUgbGFzdCBzbGFzaCBpbiB0aGUgVVJMIG11c3QgYmUgZm9sbG93ZWQgYnkgYSBudW1iZXIuIFRoYXQKbnVtYmVyIChOKSB3aWxsIGJlIHVzZWQgYnkgdGhlIHRlc3Qtc2VydmVyIHRvIGxvYWQgdGVzdCBjYXNlIE4gYW5kIHJldHVybiB0aGUKZGF0YSB0aGF0IGlzIGRlZmluZWQgd2l0aGluIHRoZSA8cmVwbHk+PGRhdGE+PC9kYXRhPjwvcmVwbHk+IHNlY3Rpb24uCgpJZiBhIENPTk5FQ1QgaXMgdXNlZCB0byB0aGUgc2VydmVyICh0byBlbXVsYXRlIEhUVFBTIGV0YyBvdmVyIHByb3h5KSwgdGhlIHBvcnQKbnVtYmVyIGdpdmVuIGluIHRoZSBDT05ORUNUIHJlcXVlc3Qgd2lsbCBiZSB1c2VkIHRvIGlkZW50aWZ5IHdoaWNoIHRlc3QgdGhhdAppcyBiZWluZyBydW4sIGlmIHRoZSBwcm94eSBob3N0IG5hbWUgaXMgc2FpZCB0byBzdGFydCB3aXRoICd0ZXN0Jy4KClNldCAnb3B0aW9uPW5vLW91dHB1dCcgdG8gcHJldmVudCB0aGUgdGVzdCBzY3JpcHQgdG8gc2xhcCBvbiB0aGUgLS1vdXRwdXQKYXJndW1lbnQgdGhhdCBkaXJlY3RzIHRoZSBvdXRwdXQgdG8gYSBmaWxlLiBUaGUgLS1vdXRwdXQgaXMgYWxzbyBub3QgYWRkZWQgaWYKdGhlIGNsaWVudC9zdGRvdXQgc2VjdGlvbiBpcyB1c2VkLgoKQXZhaWxhYmxlIHN1YnN0aXR1dGUgdmFyaWFibGVzIGluY2x1ZGU6CiVIT1NUSVAgICAgLSBJUCBhZGRyZXNzIG9mIHRoZSBob3N0IHJ1bm5pbmcgdGhpcyB0ZXN0CiVIT1NUUE9SVCAgLSBQb3J0IG51bWJlciBvZiB0aGUgSFRUUCBzZXJ2ZXIKJUhUVFBTUE9SVCAtIFBvcnQgbnVtYmVyIG9mIHRoZSBIVFRQUyBzZXJ2ZXIKJUZUUFBPUlQgICAtIFBvcnQgbnVtYmVyIG9mIHRoZSBGVFAgc2VydmVyCiVGVFBTUE9SVCAgLSBQb3J0IG51bWJlciBvZiB0aGUgRlRQUyBzZXJ2ZXIKJVNSQ0RJUiAgICAtIEZ1bGwgcGF0aCB0byB0aGUgc291cmNlIGRpcgolUFdEICAgICAgIC0gQ3VycmVudCBkaXJlY3RvcnkKPC9jb21tYW5kPgoKPGZpbGUgbmFtZT0ibG9nL2ZpbGVuYW1lIj4KdGhpcyBjcmVhdGVzIHRoZSBuYW1lZCBmaWxlIHdpdGggdGhpcyBjb250ZW50IGJlZm9yZSB0aGUgdGVzdCBjYXNlIGlzIHJ1bgp3aGljaCBpcyB1c2VmdWwgaWYgdGhlIHRlc3QgY2FzZSBuZWVkcyBhIGZpbGUgdG8gYWN0IG9uLgo8L2ZpbGU+Cgo8c3RkaW4+ClBhc3MgdGhpcyBnaXZlbiBkYXRhIG9uIHN0ZGluIHRvIHRoZSB0b29sLgo8L3N0ZGluPgoKPC9jbGllbnQ+Cgo8dmVyaWZ5Pgo8ZXJyb3Jjb2RlPgpudW1lcmljYWwgZXJyb3IgY29kZSBjdXJsIGlzIHN1cHBvc2VkIHRvIHJldHVybi4gU3BlY2lmeSBhIGxpc3Qgb2YgYWNjZXB0ZWQKZXJyb3IgY29kZXMgYnkgc2VwYXJhdGluZyBtdWx0aXBsZSBudW1iZXJzIHdpdGggY29tbWEuIFNlZSB0ZXN0IDIzNyBmb3IgYW4KZXhhbXBsZS4KPC9lcnJvcmNvZGU+CjxzdHJpcD4KT25lIHJlZ2V4IHBlciBsaW5lIHRoYXQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBwcm90b2NvbCBkdW1wcyBiZWZvcmUgdGhlCmNvbXBhcmlzb24gaXMgbWFkZS4gVGhpcyBpcyB2ZXJ5IHVzZWZ1bCB0byByZW1vdmUgZGVwZW5kZW5jaWVzIG9uIGR5bmFtaWNseQpjaGFuZ2luZyBwcm90b2NvbCBkYXRhIHN1Y2ggYXMgcG9ydCBudW1iZXJzIG9yIHVzZXItYWdlbnQgc3RyaW5ncy4KPC9zdHJpcD4KPHN0cmlwcGFydD4KT25lIHBlcmwgb3AgcGVyIGxpbmUgdGhhdCBvcGVyYXRlcyBvbiB0aGUgcHJvdG9jb2wgZHVtcC4gVGhpcyBpcyBwcmV0dHkKYWR2YW5jZWQuIEV4YW1wbGU6ICJzL15FUFJUIC4qL0VQUlQgc3RyaXBwZWQvIgo8L3N0cmlwcGFydD4KPHByb3RvY29sIFtub25ld2xpbmU9eWVzXT4KdGhlIHByb3RvY29sIGR1bXAgY3VybCBzaG91bGQgdHJhbnNtaXQsIGlmICdub25ld2xpbmUnIGlzIHNldCwgd2Ugd2lsbCBjdXQKb2ZmIHRoZSB0cmFpbGluZyBuZXdsaW5lIG9mIHRoaXMgZ2l2ZW4gZGF0YSBiZWZvcmUgY29tcGFyaW5nIHdpdGggdGhlIG9uZQphY3R1YWxseSBzZW50IGJ5IHRoZSBjbGllbnQKPC9wcm90b2NvbD4KPHN0ZG91dCBbbW9kZT10ZXh0XT4KVGhpcyB2ZXJmaWVzIHRoYXQgdGhpcyBkYXRhIHdhcyBwYXNzZWQgdG8gc3Rkb3V0LgoKVXNlIHRoZSAibW9kZT10ZXh0IiBhdHRyaWJ1dGUgaWYgdGhlIG91dHB1dCBpcyBpbiB0ZXh0IG1vZGUgb24gcGxhdGZvcm1zIHRoYXQKaGF2ZSBhIHRleHQvYmluYXJ5IGRpZmZlcmVuY2UuCjwvc3Rkb3V0Pgo8ZmlsZSBuYW1lPSJsb2cvZmlsZW5hbWUiIFttb2RlPXRleHRdPgpUaGUgZmlsZSdzIGNvbnRlbnRzIG11c3QgYmUgaWRlbnRpY2FsIHRvIHRoaXMgYWZ0ZXIgdGhlIHRlc3QgaXMgY29tcGxldGUuCgpVc2UgdGhlICJtb2RlPXRleHQiIGF0dHJpYnV0ZSBpZiB0aGUgb3V0cHV0IGlzIGluIHRleHQgbW9kZSBvbiBwbGF0Zm9ybXMgdGhhdApoYXZlIGEgdGV4dC9iaW5hcnkgZGlmZmVyZW5jZS4KPC9maWxlPgo8c3RyaXBmaWxlPgpPbmUgcGVybCBvcCBwZXIgbGluZSB0aGF0IG9wZXJhdGVzIG9uIHRoZSBmaWxlIGJlZm9yZSBiZWluZyBjb21wYXJlZC4gVGhpcyBpcwpwcmV0dHkgYWR2YW5jZWQuIEV4YW1wbGU6ICJzL15FUFJUIC4qL0VQUlQgc3RyaXBwZWQvIgo8L3N0cmlwZmlsZT4KPHVwbG9hZD4KdGhlIGNvbnRlbnRzIG9mIHRoZSB1cGxvYWQgZGF0YSBjdXJsIHNob3VsZCBoYXZlIHNlbnQKPC91cGxvYWQ+Cjx2YWxncmluZD4KZGlzYWJsZSAtIGRpc2FibGVzIHRoZSB2YWxncmluZCBsb2cgY2hlY2sgZm9yIHRoaXMgdGVzdAo8L3ZhbGdyaW5kPgo8L3ZlcmlmeT4K