ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8gICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX198IHwgfCB8ICBfIFx8IHwgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfX3wgfCB8IHwgfF8pIHwgfCAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlzdG9yeSBvZiBDaGFuZ2VzCgpWZXJzaW9uIDYuNS4xCgpEYW5pZWwgKDIwIE1hcmNoIDIwMDApOgotIEFuIGFueW5vbW91cyBwb3N0IG9uIHNvdXJjZWZvcmdlIGNvcnJlY3RseSBwb2ludGVkIG91dCBhIHBvc3NpYmxlIGJ1ZmZlcgogIG92ZXJmbG93IGluIHRoZSBjdXJsX3VuZXNjYXBlKCkgZnVuY3Rpb24gZm9yIFVSTCBjb252ZXJ0aW9ucy4gVGhlIG1haW4KICBwcm9ibGVtIHdpdGggdGhpcyBidWcgaXMgdGhhdCB0aGUgZnRwIGRvd25sb2FkIHVzZXMgdGhhdCBmdW5jdGlvbiBhbmQgdGhpcwogIHNpbmdsZS0gYnl0ZSBvdmVyZmxvdyBjb3VsZCBsZWFkIHRvIHZlcnkgb2RkIGJ1Z3MgKGFzIG9uZSByZXBvcnRlZCBieSBKYW5uZQogIEpvaGFuc3NvbikuCgpEYW5pZWwgKDE5IE1hcmNoIDIwMDApOgotIE1hcmNvIEcuIFNhbHZhZ25vIDxtZ3NAd2hpei5jamIubmV0PiBzdXBwbGllZCBtZSB3aXRoIGEgc2VyaWVzIG9mIHBhdGNoZXMKICB0aGF0IG5vdyBhbGxvd3MgY3VybCB0byBnZXQgY29tcGlsZWQgb24gT1MvMi4gSXQgZXZlbiBpbmNsdWRlcyBhIHNlY3Rpb24gaW4KICB0aGUgSU5TVEFMTCBmaWxlLiBWZXJ5IG5pY2Ugam9iIQoKRGFuaWVsICgxNyBNYXJjaCAyMDAwKToKLSBXaGFtIEJhbmcgPHdoYW1fYmFuZ0B5YWhvby5jb20+IChpcyB0aGF0IFBhc2NhbCBHYXVkZXR0ZT8pIHN1cHBsaWVkIGEgcGF0Y2gKICBmb3IgdGhlIGxpYi9NYWtlZmlsZS52YzYgZmlsZS4gV2Ugc3RpbGwgbmVlZCBzb21lIGZpeGVzIGZvciB0aGUKICBjb25maWctd2luMzIuaCBzaW5jZSBpdCBhcHBlYXJzIHRoYXQgVkMrKyBhbmQgbWluZ3czMiBoYXZlIGRpZmZlcmVudAogIG9waW5pb25zIGFib3V0IChhdCBsZWFzdCkgdW5pc3RkLmgncyBleGlzdGFuY2UuCgpEYW5pZWwgKDE1IE1hcmNoIDIwMDApOgotIEkgbW9kaWZpZWQgdGhlIC1ELy0tZHVtcC1oZWFkZXIgd29ya2luZ3Mgc28gdGhhdCBpdCBkb2Vzbid0IHdyaXRlIGFueXRoaW5nCiAgdG8gdGhlIGZpbGUgdW50aWwgaXQgbmVlZHMgdG8uIFRoaXMgd2F5LCB5b3UgY2FuIGFjdHVhbGx5IHVzZSAtYiBhbmQgLUQKICBvbiB0aGUgc2FtZSBmaWxlIGlmIHlvdSB3YW50IHJlcGVhdGVkIGludm9rZXMgdG8gc3RvcmUgYW5kIHJlYWQgdGhlIGNvb2tpZXMKICBpbiB0aGF0IG9uZSBzaW5nbGUgZmlsZS4KCi0gUG9rZWQgYXJvdW5kIGluIGxvdHMgb2YgdGV4dHMuIEFkZGVkIHRoZSBCVUdTIGZpbGUgZm9yIGJ1ZyByZXBvcnRpbmcgc3R1ZmYuCiAgQWRkZWQgdGhlIGNsYXNzaWMgSFRUUCBQT1NUIHF1ZXN0aW9uIHRvIHRoZSBGQVEsIHJlbW92ZWQgc29tZSAjaWZkZWYgV0lOMzIKICBzdHVmZiBmcm9tIHRoZSBzb3VyY2VzICh0aGV5J3JlIGNvdmVyZWQgYnkgdGhlIGNvbmZpZy13aW4zMi5oIG5vdykuCgotIFBhc2NhbCBHYXVkZXR0ZSA8cGFzY2FsQGdhdWRldHRlLm9yZz4gZml4ZWQgYSBtaXNzaW5nIGxkYXAuYyBwcm9ibGVtIGluIHRoZQogIE1ha2VmaWxlLnZjNiBmaWxlLiBIZSBhbHNvIGFkZHJlc3NlZCBhIHByb2JsZW0gaW4gc3JjL2NvbmZpZy13aW4zMi5oLgoKRGFuaWVsICgxNCBNYXJjaCAyMDAwKToKLSBQYXVsIEhhcnJpbmd0b24gcG9pbnRlZCBvdXQgdGhhdCB0aGUgJ2h0dHBfY29kZScgdmFyaWFibGUgaW4gdGhlIC13IG91dHB1dAogIHdhcyBuZXZlciB3cml0dGVuLiBJIGZpeGVkIGl0IG5vdy4KCi0gSmFubmUgSm9oYW5zc29uIDxqakBkeW5hcmMuc2U+IHJlcG9ydGVkIHRoZSBjb21wbGFpbnRzIHRoYXQgT3BlbkJTRCBkb2VzCiAgd2hlbiBnZXRkYXRlLmMgI2luY2x1ZGVzIG1hbGxvYy5oLiBJdCBjbGFpbXMgc3RkbGliLmggc2hvdWxkIGJlIGluY2x1ZGVkCiAgaW5zdGVhZC4gSSBhZGRlZCAjaWZkZWYgSEFWRV9NQUxMT0NfSCBjb2RlIGluIGdldGRhdGUueSBhbmQgdHdvIGNoZWNrcyBpbgogIHRoZSBjb25maWd1cmUuaW4gZm9yIG1hbGxvYy5oIGFuZCBzdGRsaWIuaC4KClZlcnNpb24gNi41CgpEYW5pZWwgKDEzIE1hcmNoIDIwMDApOgotIDxjdXJsQHNwYW0ud29sdmVzYmFuZS5uZXQ+IHBvaW50ZWQgb3V0IHRoYXQgdGhlIHdheSBjdXJsIHNlbnQgY29va2llcyBpbiBhCiAgc2luZ2xlIGxpbmUgd2Fzbid0IGVuam95ZWQgYnkgSUlTNC4wIHNlcnZlcnMuIEluIG15IHZpZXcsIHRoYXQgaXMgbm90IHdoYXQKICB0aGUgc3RhbmRhcmRzIHNheSwgYnV0IEkgYWRkZWQgYSB3aGl0ZSBzcGFjZSBiZXR3ZWVuIHRoZSBuYW1lL3ZhbHVlIHBhaXJzIHRvCiAgcGVyaGFwcyBtYWtlIHRoZW0gd29yayBiZXR0ZXIuCgotIEFkZGVkIHRoZSBwZXJsIGNoZWNrIGJhY2sgaW4gdGhlIGNvbmZpZ3VyZS5pbiBhZ2FpbiBzaW5jZSB0aGUgbWtoZWxwLnBsCiAgc2NyaXB0IG5lZWRzIGl0IQoKLSBNYWRlIHNvbWUgYmVhdXRpZmljYXRpb25zIGluIHRoZSBjdXJsIG1hbiBwYWdlLgoKRGFuaWVsICgzIE1hcmNoIDIwMDApOgotIEr2cm4gaGVscGVkIG1lIHVwZGF0ZSB0aGUgY29uZmlnLXdpbjMyLmggZmlsZXMgd2l0aCBIQVZFX1NFVFZCVUYgYW5kCiAgSEFWRV9TVFJEVVAuCgpEYW5pZWwgKDMgTWFyY2ggMjAwMCk6Ci0gVXBsb2FkZWQgdGhlIDYuNXByZTIgcGFja2FnZS4KCkRhbmllbCAoMiBNYXJjaCAyMDAwKToKLSBSZW1vdmVkIHRoZSBwZXJsLXByb2dyYW1zIGZyb20gdGhlIGRpc3RyaWJ1dGlvbiwgdGhleSBuZXZlciBtYWRlIG1hbnkgcGVvcGxlCiAgaGFwcHkgYW5kIEknbGwgc3RpbGwga2VlcCB0aGVtIGF2YWlsYWJsZSBvbiB0aGUgd2ViLgoKLSBBZGRlZCB0aGUgLXcgYW5kIC1OIHN0dWZmIHRvIHRoZSBtYW4gcGFnZS4gRG9jdW1lbnRlZCB0aGUgbmV3IHByb2dyZXNzIG1ldGVyCiAgZGlzcGxheSBpbiBSRUFETUUuY3VybC4KCi0gSvZybiBIYXJ0cm90aCA8Sm9lcm4uSGFydHJvdGhAdGVsZWtvbS5kZT4sIENocmlzIDxjYmF5bGlzc0Bjc2MuY29tZT4gYW5kIFVsZgogIE32bGxlciBmcm9tIHRoZSBvcGVuc3NsIGRldmVsb3BtZW50IHRlYW0gaGVscGVkIGJyaW5naW5nIG1lIHRoZSBkZXRhaWxzIGZvcgogIGZpeGluZyBhbiBPcGVuU1NMIHVzYWdlIGZsYXcuIEl0IGJlY2FtZSBhcHBlYXJhbnQgd2hlbiB0aGV5IHJlbGVhc2VkIG9wZW5zc2wKICAwLjkuNSBzaW5jZSB0aGF0IGJhcmZlZCBvbiBjdXJsJ3MgYmFkIGJlaGF2aW91ciAobm90IHNlZWRpbmcgYSByYW5kb20gbnVtYmVyCiAgdGhpbmcpLgoKLSBZZXQgYW5vdGhlciBvcHRpb246IC1OLy0tbm8tYnVmZmVyIGRpc2FibGVzIGJ1ZmZlcmluZyBpbiB0aGUgb3V0cHV0IHN0cmVhbS4KICBQcm9iYWJseSBtb3N0IHVzZWZ1bCBmb3IgdmVyeSBzbG93IHRyYW5zZmVycyB3aGVuIHlvdSByZWFsbHkgd2FudCB0byBnZXQKICBldmVyeSBieXRlIGN1cmwgcmVjZWl2ZXMgd2l0aGluIHNvbWUgcHJlZmVyZWQgdGltZS4gQW5kcmV3IDx0bXJAZ2NpLm5ldD4KICBzdWdnZXN0ZWQgdGhpcy4KCi0gRGFtaWVuIEFkYW50IDxkYW1zQHVzYS5uZXQ+IG1haWxlZCBtZSBoaXMgZml4ZXMgZm9yIG1ha2luZyBjdXJsIGNvbXBpbGUKICBvbiBVbHRyaXguCgpEYW5pZWwgKDI0IEZlYnJ1YXJ5IDIwMDApOgotIEFwcGxpZWQgSvZybiBIYXJ0cm90aCdzIGZpeGVzIGZvciBjb25maWctd2luMzIuaCBhbmQgbGliL01ha2VmaWxlLnczMi4KCiAgSSBzaG91bGQgYWxzbyBtYWtlIGEgbm90ZSBoZXJlLCBpZiBub3RoaW5nIGVsc2UgdG8gbXlzZWxmLCB0aGF0IHdoZW4gdXNpbmcKICB0aGUgJS1zeW50YXggZm9yIHZhcmlhYmxlcyBpbiBET1MgY29tbWFuZCBwcm9tcHRzLCB5b3UgbXVzdCB1c2UgdHdvICUtCiAgbGV0dGVycyBmb3IgZWFjaCBvbmUgc2luY2UgdGhhdCBpcyBhbiBlc2NhcGUgbGV0dGVyIHRoZXJlISBNYXliZSBJIHNob3VsZAogIHVzZSBhbm90aGVyIGxldHRlciBpbnN0ZWFkIQoKLSBBZGRlZCBtb3JlIHZhcmlhYmxlcyB0byAtdzoKCiAgJ2h0dHBfY29kZScKICAndGltZV9uYW1lbG9va3VwJwogICd0aW1lX2Nvbm5lY3QnCiAgJ3RpbWVfcHJldHJhbnNmZXInCiAgJ3VybF9lZmZlY3RpdmUnCgotIE1hZGUgLXdAZmlsZW5hbWUgcmVhZCB0aGUgc3ludGF4IGZyb20gYSBmaWxlIGFuZCAtd0AtIHJlYWRzIHRoZSBzeW50YXggZnJvbQogIHN0ZGluIGluIHRoZSBnb29kIG9sZCAic3RhbmRhcmQiIGN1cmwgd2F5LgoKRGFuaWVsICgyMiBGZWJydWFyeSAyMDAwKToKLSBSZWxlYXNlZCBhIDYuNXByZTEgdmVyc2lvbiB0byBnZXQgc29tZSB0ZXN0IGFuZCB1c2VyIGZlZWRiYWNrLgoKRGFuaWVsICgyMSBGZWJydWFyeSAyMDAwKToKCi0gSSBhZGRlZCB0aGUgLXcvLS13cml0ZS1vdXQgZmxhZyBhbmQgc29tZSB2YXJpYWJsZXMgdG8gZ28gd2l0aCBpdC4gLXcgaXMgYQogIHNpbmdsZSBzdHJpbmcsIHdoYXRldmVyIHlvdSBlbnRlciB0aGVyZSB3aWxsIGJlIHdyaXR0ZW4gb3V0IHdoZW4gY3VybCBoYXMKICBjb21wbGV0ZWQgYSBzdWNjZXNzZnVsIHJlcXVlc3QuIFRoZXJlIGFyZSBzb21lIHZhcmlhYmxlIHN1YnN0aXR1dGlvbnMgYW5kCiAgdGhleSBhcmUgc3BlY2lmZWQgYXMgJyV7dmFyaWFibGV9JyAod2l0aG91dCB0aGUgcXVvdGVzKS4gVmFyaWFibGVzIHRoYXQKICBleGlzdCBhcyBvZiB0aGlzIG1vbWVudCBhcmU6CgogICAgICAgIHRvdGFsX3RpbWUgICAgIC0gdG90YWwgdHJhbnNmZXIgdGltZSBpbiBzZWNvbmRzICh3aXRoIDIgZGVjaW1hbHMpCiAgICAgICAgc2l6ZV9kb3dubG9hZCAgLSB0b3RhbCBkb3dubG9hZGVkIGFtb3VudCBvZiBieXRlcwogICAgICAgIHNpemVfdXBsb2FkICAgIC0gdG90YWwgdXBsb2FkZWQgYW1vdW50IG9mIGJ5dGVzCiAgICAgICAgc3BlZWRfZG93bmxvYWQgLSB0aGUgYXZlcmFnZSBzcGVlZCBvZiB0aGUgZW50aXJlIGRvd25sb2FkCiAgICAgICAgc3BlZWRfdXBsb2FkICAgLSB0aGUgYXZlcmFnZSBzcGVlZCBvZiB0aGUgZW50aXJlIHVwbG9hZAoKICBJIHdpbGwgb2YgY291cnNlIGFkZCBtb3JlIHZhcmlhYmxlcywgYnV0IEkgbmVlZCBpbnB1dCBvbiB0aGVzZSBhbmQgb3RoZXJzLgoKLSBJdCBzdHJ1Y2sgbWUgdGhhdCB0aGUgLSMgcHJvZ3Jlc3MgYmFyIHdpbGwgYmUgaGFyZCB0byBqdXN0IGFwcGx5IG9uIHRoZSBuZXcKICBwcm9ncmVzcyBiYXIgY29uY2VwdC4gSSBuZWVkIHNvbWUgZmVlZGJhY2sgb24gdGhpcyBiZWZvcmUgdGhhdCdsbCBnZXQgcmUtCiAgaW50cm9kdWNlZCEgOi0vCgpEYW5pZWwgKDE2IEZlYnJ1YXJ5IDIwMDApOgotIEr2cm4gSGFydHJvdGggYnJvdWdodCBtZSBzb21lIGZpeGVzIGZvciB0aGUgcHJvZ3Jlc3MgbWV0ZXIgYW5kIEkgY29udGludWVkCiAgd29ya2luZyBvbiBpdC4gSXQgc2VlbXMgdG8gd29yayBmb3IgaHR0cCBkb3dubG9hZCwgaHR0cCBwb3N0LCBmdHAgZG93bmxvYWQKICBhbmQgZnRwIHVwbG9hZC4gSXQgc2hvdWxkIGJlIGEgcHJldHR5IGdvb2QgdGVzdCBpdCB3b3JrcyBnZW5lcmFsbHkgZ29vZC4KCi0gU3RpbGwgbmVlZCB0byBhZGQgdGhlIC0jIHByb2dyZXNzIGJhciBpbnRvIHRoZSBuZXcgc3R5bGUgcHJvZ3Jlc3MgaW50ZXJmYWNlLgoKLSBHb25uYSBoYXZlIGEgZ28gYXQgbXkgbmV3IG91dHB1dCBvcHRpb24gcGFyYW1ldGVyIG5leHQuCgpEYW5pZWwgKDE1IEZlYnJ1YXJ5IDIwMDApOgotIFRoZSBwcm9ncmVzcyBtZXRlciBzdHVmZiBpcyBzbG93bHkgdGFraW5nIHBsYWNlLiBUaGVyZSdzIG1vcmUgbGVmdCBiZWZvcmUgaXQKICBpcyB3b3JraW5nIG9rIGFuZCBldmVyeXRoaW5nIGlzIHRlc3RlZCwgYnV0IHdlJ3JlIHJlYWNoaW5nIHRoZXJlLiBTbG93bHkhCgpEYW5pZWwgKDExIEZlYnJ1YXJ5IDIwMDApOgotIFBhdWwgTWFycXVpcyA8cG1hcnF1aXNAaW5hbWUuY29tPiBmaXhlZCB0aGUgY29uZmlnIGZpbGUgcGFyc2luZyBvZiBjdXJsIHRvCiAgZGVhbCB3aXRoIGFueS1sZW5ndGggbGluZXMsIHJlbW92aW5nIHRoZSBwcmV2aW91cyBsaW1pdCBvZiA0Sy4KCi0gRWV0dSBPamFuZW4gPGVzb2phbmVuQGp5dS5maT4ncyBzdWdnZXN0aW9uIG9mIHN1cHBvcnRpbmcgdGhlIEAtc3R5bGUgZm9yIC1iCiAgaXMgaW1wbGVtZW50ZWQuIE5vdyAtYkA8ZmlsZW5hbWU+IHdvcmtzIGFzIHdlbGwgYXMgdGhlIG9sZCBzdHlsZS4gLWJALSBhbHNvCiAgc2ltaWxhcmlseSByZWFkcyB0aGUgY29va2llcyBmcm9tIHN0ZGluLgoKLSBSZW1pbmRlcjogLUQgc2hvdWxkIG5vdCB3cml0ZSB0byB0aGUgZmlsZSB1bnRpbCBpdCBuZWVkcyB0bywgaW4gdGhlIHNhbWUgd2F5CiAgLW8gZG9lcy4gVGhhdCB3b3VsZCBlbmFibGUgY3VybCB0byB1c2UgLWIgYW5kIC1EIG9uIHRoZSBzYW1lIGZpbGUuLi4KCi0gRWxsaXMgUHJpdGNoYXJkIDxlbGxpc0BjaXRyaWEuY29tPiBtYWRlIGdldGRhdGUueSB3b3JrIGZvciBNYWNPUyBYLgoKLSBQYXVsIEhhcnJpbmd0b24gPHBhdWxAcGl6emEub3JnPiBoZWxwZWQgbWUgb3V0IGZpbmRpbmcgdGhlIGNyYXNoIGluIHRoZQogIGNvb2tpZSBwYXJzZXIuIEhlIGFsc28gcG9pbnRlZCBvdXQgY3VybCdzIGhhYmJpdCBvZiBzZW5kaW5nIGVtcHR5IGNvb2tpZXMgdG8KICB0aGUgc2VydmVyLgoKRGFuaWVsICg4IEZlYnJ1YXJ5IDIwMDApOgogLSBSb24gWmFwcCA8cnphcHBlckB5YWhvby5jb20+IGNvcnJlY3RlZCBhIHByb2JsZW0gaW4gc3JjL3VybGdsb2IuYyB0aGF0CiAgIHByZXZlbnRlZCBjdXJsIGZyb20gZ2V0dGluZyBjb21waWxlZCBvbiBzdW5vcyA0LiBUaGUgcHJvYmxlbSBoYWQgdG8gZG8KICAgd2l0aCB0aGUgZGlmZmVyZW5jZSBpbiBzcHJpbnRmKCkgcmV0dXJuIGNvZGUgdHlwZXMuCgogLSBUcmFuc2ZlcigpIHNob3VsZCBub3cgYmUgYWJsZSB0byBkb3dubG9hZCBhbmQgdXBsb2FkIHNpbXVsdGFuZW91c2x5LiBMZXQncwogICBkbyBzb21lIHByb2dyZXNzIG1ldGVyIGZpeGVzIGxhdGVyIHRoaXMgd2Vlay4KCkRhbmllbCAoMzEgSmFudWFyeSAyMDAwKToKIC0gUGF1bCBIYXJyaW5ndG9uIDxwYXVsQHBpenphLm9yZz4gZm91bmQgYW5vdGhlciBjb3JlIGR1bXAgaW4gdGhlIGNvb2tpZQogICBwYXJzZXIuIEN1cmwgZG9lc24ndCBwcm9wZXJseSByZWNvZ25pemUgdGhlICd2ZXJzaW9uJyBrZXl3b3JkIGFuZCBJIHRoaW5rCiAgIHRoYXQgaXMgd2hhdCBjYXVzZWQgdGhpcy4gSSBuZWVkIHRvIHJlZnJlc2ggc29tZSBzcGVjcyBvbiBjb29raWVzIGFuZCBzZWUKICAgd2hhdCBlbHNlIGN1cmwgbGFja3MgdG8gaW1wcm92ZSB0aGlzIGEgYml0IG1vcmUgb25jZSBhbmQgZm9yIGFsbC4KCiAgIFJGQyAyMTA5IGNsZWFybHkgc3BlY2lmaWVzIGhvdyBjb29raWVzIHNob3VsZCBiZSBkZWFsdCB3aXRoIHdoZW4gdGhleSBhcmUKICAgY29tcGxpYW50IHdpdGggdGhhdCBzcGVjLiBJIGRvbid0IHRoaW5rIG1hbnkgc2VydmVycyBhcmUgdGhvdWdoLi4uCgogLSBNYXJrIFcuIEVpY2hpbiA8ZWljaGluQHRob2sub3JnPiBmb3VuZCB0aGF0IHdoaWxlIGN1cmwgaXMgdXBsb2FkaW5nIGEgZm9ybQogICB0byBhIHdlYiBzaXRlLCBpdCBkb2Vzbid0IHJlYWQgaW5jb21pbmcgZGF0YSB3aHkgaXQnbGwgaGFuZyBhZnRlciBhIHdoaWxlCiAgIHNpbmNlIHRoZSBzb2NrZXQgInBpcGUiIGJlY29tZXMgZnVsbC4KCiAgIEl0IHRvb2sgbWUgdHdvIGhvdXJzIHRvIHJld3JpdGUgRG93bmxvYWQoKSBhbmQgVXBsb2FkKCkgaW50byB0aGUgbmV3CiAgIHNpbmdsZSBmdW5jdGlvbiBUcmFuc2ZlcigpLiBJdCBldmVuIHNlZW1zIHRvIHdvcmshIE1vcmUgdGVzdGluZyBpcyByZXF1aXJlZAogICBvZiBjb3Vyc2UuLi4gSSBzaG91bGQgZ2V0IHRoZSBoZWFkZXItc2VuZGluZyB0b2dldGhlciBpbiBhIGtpbmQgb2YgcXVldWUKICAgYW5kIGxldCB0aGVtIGdldCAidXBsb2FkZWQiIGluIFRyYW5zZmVyKCkgYXMgd2VsbC4KCiAtIFpoaWJpYW8gV3UgPHd1emJAZXJvbHMuY29tPiBwb2ludGVkIG91dCBhIGN1cmwgYnVnIGluIHRoZSBsb2NhdGlvbjogYXJlYSwKICAgYWx0aG91Z2ggSSBkaWQgbm90IGdldCBhIHJlcHJvZHVjYWJsZSB3YXkgdG8gZG8gdGhpcyB3aHkgSSBoYXZlIHRvIHdhaXQKICAgd2l0aCBmaXhpbmcgYW55dGhpbmcuCgogLSBCb2IgU2NoYWRlciA8cnNjaGFkZXJAcHJvZHVjdC1kZXMuY29tPiBzdWdnZXN0ZWQgSSBzaG91bGQgaW1wbGVtZW50IHJlc3VtZQogICBzdXBwb3J0IGZvciB0aGUgSFRUUCBQVVQgb3BlcmF0aW9uLCBhbmQgYXMgSSB0aGluayBpdCBpcyBhIHZhbGlkIHN1Z2dlc3Rpb24KICAgSSdsbCB3b3JrIG9uIGl0LgoKRGFuaWVsICgyNSBKYW51YXJ5IDIwMDApOgogLSBNIFRyYXZpcyBPYmVuaGF1cyA8VHJhdmlzLk9iZW5oYXVzQGF1ZC5hbGNhdGVsLmNvbT4gcG9pbnRlZCBvdXQgYSBtYW51YWwKICAgbWl4dXAgd2l0aCAteSBhbmQgLVkgdGhhdCB3YXMgY29ycmVjdGVkLgoKIC0gSmVucyBTY2hsZXVzZW5lciA8SmVucy5TY2hsZXVzZW5lckBkbHIuZGU+IHBvaW50ZWQgb3V0IGEgcHJvYmxlbSB0byBjb21waWxlCiAgIGN1cmwgb24gQUlYIDQuMS40IGFuZCBnYXZlIG1lIGEgc29sdXRpb24uIFRoaXMgcHJvYmxlbSB3YXMgYWxyZWFkeSBmaXhlZAogICBieSBK9nJuJ3MgcmVjZW50ICNpbmNsdWRlIG1vZGlmaWNhdGlvbnMhCgpEYW5pZWwgKDE5IEphbnVhcnkgMjAwMCk6CiAtIE9za2FyIExpbGplYmxhZCA8b3NrQGhlbS5wYXNzYWdlbi5zZT4gcG9pbnRlZCBvdXQgYW5kIGNvcnJlY3RlZCBhIHByb2JsZW0KICAgaW4gdGhlIExvY2F0aW9uOiBmb2xsb3dpbmcgc3lzdGVtIHRoYXQgbWFkZSBjdXJsIGZvbGxvd2luZyBhIGxvY2F0aW9uOiB0byBhCiAgIGRpZmZlcmVudCBwcm90b2NvbCB0byBmYWlsLgoKICAgQXQgSmFudWFyeSAzMXN0IEkgcmUtY29uc2lkZXJlZCB0aGlzIGZpeCBhbmQgdGhlIHN1cnJvdW5kaW5nIHNvdXJjZSBjb2RlLiBJCiAgIGNvdWxkIG5vdCByZWFsbHkgc2VlIHRoYXQgdGhlIHBhdGNoIGRpZCBhbnkgZGlmZmVyZW5jZSwgd2h5IEkgcmVtb3ZlZCBpdAogICBhZ2FpbiBmb3IgZnVydGhlciByZXNlYXJjaCBhbmQgZGVidWdnaW5nLiAoSXQgZGlzYWJsZWQgbG9jYXRpb246IGZvbGxvd2luZwogICBvbiBzZXJ2ZXIgbm90IHJ1bm5pbmcgb24gZGVmYXVsdCBwb3J0cy4pCgogLSBK9nJuIEhhcnRyb3RoIDxKb2Vybi5IYXJ0cm90aEB0ZWxla29tLmRlPiBicm91Z2h0IGEgZml4IHRoYXQgb25jZSBhZ2FpbgogICBtYWRlIGl0IHBvc3NpYmxlIHRvIHNlbGVjdCBwcm9ncmVzcyBiYXIuCgogLSBK9nJuIGFsc28gZml4ZWQgYSBmZXcgaW5jbHVkZSBwcm9ibGVtcy4KClZlcnNpb24gNi40CgpEYW5pZWwgKDE3IEphbnVhcnkgMjAwMCk6CiAtIEJhc2VkIG9uIHN1Z2dlc3Rpb25zIGZyb20gQmr2cm4gU3RlbmJlcmcgKGJqb3JuQGhheHgubnUpLCBJIG1hZGUgdGhlCiAgIHByb2dyZXNzIGRlYWwgYmV0dGVyIHdpdGggbGFyZ2VyIGZpbGVzIGFuZCBhZGRlZCBhICJUaW1lIiBmaWVsZCB3aGljaCBzaG93cwogICB0aGUgdGltZSBzcGVudCBvbiB0aGUgZG93bmxvYWQgc28gZmFyLgogLSBJJ20gbm93IHVzaW5nIHRoZSBDVlMgcmVwb3NpdG9yeSBvbiBzb3VyY2Vmb3JnZS5uZXQsIHdoaWNoIGFsc28gYWxsb3dzIHdlYgogICBicm93c2luZy4gU2VlIGh0dHA6Ly9jdXJsLmhheHgubnUuCgpEYW5pZWwgKDEwIEphbnVhcnkgMjAwMCk6CiAtIFJlbnVtYmVyZWQgc29tZSBlbnVtcyBpbiBjdXJsL2N1cmwuaCBzaW5jZSB0YWcgbnVtYmVyIDM1IHdhcyB1c2VkIHR3aWNlIQogLSBBZGRlZCAicG9zdHF1b3RlIiBzdXBwb3J0IHRvIHRoZSBmdHAgc2VjdGlvbiB0aGF0IGVuYWJsZXMgcG9zdC1mdHAtdHJhbnNmZXIKICAgcXVvdGUgY29tbWFuZHMuCiAtIE5vdyBtYWRlIHRoZSAtUS8tLXF1b3RlIHBhcmFtZXRlciByZWNvZ25pemUgJy0nIGFzIGEgcHJlZml4LCB3aGljaCBtZWFucwogICB0aGF0IGNvbW1hbmQgd2lsbCBiZSBpc3N1ZWQgQUZURVIgYSBzdWNjZXNzZnVsIGZ0cCB0cmFuc2Zlci4gVGhpcyBjYW4gb2YKICAgY291cnNlIGJlIHVzZWQgdG8gZGVsZXRlIG9yIHJlbmFtZSBhIGZpbGUgYWZ0ZXIgaXQgaGFzIGJlZW4gdXBsb2FkZWQgb3IKICAgZG93bmxvYWRlZC4gVXNlIHlvdXIgaW1hZ2luYXRpb24hIDstKQogLSBTaW5jZSBJIGRvIHRoZSBtYWluIGRldmVsb3BtZW50IG9uIHNvbGFyaXMgMi42IG5vdywgSSBoYWQgdG8gZG93bmxvYWQgYW5kCiAgIGluc3RhbGwgR05VIGdyb2ZmIHRvIGdlbmVyYXRlIHRoZSBodWdlaGVscC5jIGZpbGUuIFRoZSBzb2xhcmlzIG5yb2ZmIGNvcmVzCiAgIG9uIHRoZSBtYW4gcGFnZSEgU28sIGluIG9yZGVyIHRvIG1ha2UgdGhlIHNvbGFyaXMgY29uZmlndXJlIHNjcmlwdCBmaW5kIGEKICAgYmV0dGVyIHJlc3VsdCBJIG1hZGUgZ25yb2ZmIGdldCBjaGVja2VkIHByaW9yIHRvIHRoZSByZWd1bGFyIG5yb2ZmLgogLSBBZGRlZCBhbGwgdGhlIGN1cmwgZXhpdCBjb2RlcyB0byB0aGUgbWFuIHBhZ2UuCiAtIEppbSBHYWxsYWdoZXIgPGptZ2FsbGFnQHVzYS5uZXQ+IHByb3Blcmx5IHRyYWNrZWQgZG93biBhIGJ1ZyBpbiBhdXRvY29uZgogICAyLjEzLiBUaGUgQUNfQ0hFQ0tfTElCKCkgbWFjcm8gd3JvbmdmdWxseSB1c2VzIHRoZSAtbCBmbGFnIGJlZm9yZSB0aGUgLUwKICAgZmxhZyB0byAnbGQnIHdoaWNoIGNhdXNlcyB0aGUgSFAtVVggMTAuMjAgZmxhdm91ciB0byBmYWlsIG9uIGFsbCBsaWJjaGVja3MKICAgYW5kIHRoZWZvcmUgeW91IGNhbid0IG1ha2UgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZmluZCB0aGUgb3BlbnNzbCBsaWJzIQoKRGFuaWVsICgyOCBEZWNlbWJlciAxOTk5KToKIC0gVGltIFZlcmhvZXZlbiA8ZGpAd2FsaGFsbGEuc2luLmtoay5iZT4gY29ycmVjdGx5IGlkZW50aWZpZWQgdGhhdCBjdXJsCiAgIGRvZXNuJ3Qgc3VwcG9ydCBVUkwgZm9ybWF0dGVkIGZpbGUgbmFtZXMgd2hlbiBnZXR0aW5nIGZ0cC4gTm93LCB0aGVyZSdzIGEKICAgcHJvYmxlbSB3aXRoIGdldHRpbmcgdmVyeSB3ZWlyZCBmaWxlIG5hbWVzIG9mZiBGVFAgc2VydmVycy4gUkZDIDk1OSBkZWZpbmVzCiAgIHRoYXQgdGhlIGZpbGUgbmFtZSBzeW50YXggdG8gdXNlIHNob3VsZCBiZSB0aGUgc2FtZSBhcyBpbiB0aGUgbmF0aXZlIE9TIG9mCiAgIHRoZSBzZXJ2ZXIuIFNpbmNlIHdlIGRvbid0IGtub3cgdGhlIHBlZXIgc2VydmVyIHN5c3RlbSB3ZSBjdXJyZW50bHkganVzdAogICB0cmFuc2xhdGUgdGhlIFVSTCBzeW50YXggaW50byBwbGFpbiBsZXR0ZXJzLiBJdCBpcyBzdGlsbCBiZXR0ZXIgYW5kIHdpdGgKICAgdGhlIHNvbGFyaXMgMi42LXN1cHBsaWVkIGZ0cCBzZXJ2ZXIgaXQgd29ya3Mgd2l0aCBzcGFjZXMgaW4gdGhlIGZpbGUgbmFtZXMuCgpEYW5pZWwgKDI3IERlY2VtYmVyIDE5OTkpOgogLSBXaGVuIGN1cmwgcGFyc2VkIGNvb2tpZXMgc3RyYWlnaHQgb2ZmIGEgcmVtb3RlIHNpdGUsIGl0IGNvcnJ1cHRlZCB0aGUgaW5wdXQKICAgZGF0YSwgd2hpY2gsIGlmIHRoZSBkb3dubG9hZGVkIGhlYWRlcnMgd2VyZSBzdG9yZWQgbWFkZSB2ZXJ5IG9kZCBjaGFyYWN0ZXJzCiAgIGluIHRoZSBzYXZlZCBkYXRhLiBDb3JyZWN0ZnVsbHkgaWRlbnRpZmllZCBhbmQgcmVwb3J0ZWQgYnkgUGF1bCBIYXJyaW5ndG9uCiAgIDxwYXVsQHBpenphLm9yZz4uCgpEYW5pZWwgKDEzIERlY2VtYmVyIDE5OTkpOgogLSBHZW5lcmFsIGNsZWFudXBzIGluIHRoZSBsaWJyYXJ5IGludGVyZmFjZS4gVGhlcmUgaGFkIGJlZW4gc29tZSBiYWQga2x1ZGdlcwogICBhZGRlZCBkdXJpbmcgdGltZXMgb2Ygc3RyZXNzIGFuZCBJIGRpZCBteSBiZXN0IHRvIGNsZWFuIHRoZW0gb2ZmLiBJdCB3YXMKICAgYm90aCByZWdhcmRpbmcgdGhlIGxpYiBBUEkgYXMgd2VsbCBhcyBpbmNsdWRlIGZpbGUgY29uZnVzaW9ucy4KCkRhbmllbCAoMyBEZWNlbWJlciAxOTk5KToKIC0gQSBzbWFsbCAtLXN0ZGVyciBidWcgd2FzIHJlcG9ydGVkIGJ5IEVldHUgT2phbmVuIDxlc29qYW5lbkBqeXUuZmk+Li4uCgogLSB3aG8gYWxzbyBicm91Z2h0IHRoZSBzdWdnZXN0aW9uIG9mIGV4dGVuZGluZyB0aGUgLVggZmxhZyB0byBmdHAgbGlzdCBhcwogICB3ZWxsLiBTbywgbm93IGl0IGlzIGFuZCB0aGUgbG9uZyBvcHRpb24gaXMgbm93IC0tcmVxdWVzdCBpbnN0ZWFkLiBJdCBpcwogICBvbmx5IGZvciBmdHAgbGlzdCBmb3Igbm93IChhbmQgdGhlIGZvcm1lciBodHRwIHN0dWZmIHRvbyBvZiBjb3Vyc2UpLgoKTGFycyBKLiBBYXMgPGxhcnNhQHNpbS5ubz4gKDI0IE5vdmVtYmVyIDE5OTkpOgogLSBQYXRjaGVkIGN1cmwgdG8gY29tcGlsZSBhbmQgYnVpbGQgdW5kZXIgQmVPUy4gRG9lc24ndCB3b3JrIHlldCB0aG91Z2ghCgogLSBDb3JyZWN0ZWQgdGhlIE1ha2VmaWxlLmFtIGZpbGVzIHRvIGFsbG93IHB1dHRpbmcgb2JqZWN0IGZpbGVzIGluCiAgIGRpZmZlcmVudCBkaXJlY3RvcmllcyB0aGFuIHRoZSBzb3VyY2VzLgoKVmVyc2lvbiA2LjMuMQoKRGFuaWVsICgyMyBOb3ZlbWJlciAxOTk5KToKIC0gSSd2ZSBoYWQgdGhpcyBtYWpvciBkaXNrIGNyYXNoLiBNeSBnb29kIG9sZCB0cnVzdC13b3J0aHkgc291cmNlIGRpc2sgZGllZAogICBhbG9uZyB3aXRoIHRoZSBtYWNoaW5lIHRoYXQgaG9zdGVkIGl0LiBUaGFuayBnb29kbmVzcyBtb3N0IG9mIGFsbCB0aGUKICAgdGhpbmdzIEkndmUgZG9uZSBhcmUgZWl0aGVyIGJhY2tlZCB1cCBlbHNld2hlcmUgb3Igc3RvcmVkIGluIHRoaXMgQ1ZTCiAgIHNlcnZlciEKCiAtIE1pY2hhZWwgUy4gU3RldWVyIDxtaWNoYWVsQHN0ZXVlci5jb20+IHBvaW50ZWQgb3V0IGEgYnVnIGluIHRoZSAtRiBoYW5kbGluZwogICB0aGF0IG1hZGUgY3VybCBoYW5nIGlmIHlvdSBwb3N0ZWQgYW4gZW1wdHkgdmFyaWFibGUgc3VjaCBhcyAnLUYgbmFtZT0nLiBJdAogICB3YXMgb25lIG9mIHRob3NlIG9sZCBidWdzIHRoYXQgbmV2ZXIgaGF2ZSB3b3JrZWQgcHJvcGVybHkuLi4KCiAtIEphc29uIEJhaWV0dG8gPGphc29uQGR1cmlhbnMuY29tPiBwb2ludGVkIG91dCBhIGdlbmVyYWwgZmxhdyBpbiB0aGUgSFRUUAogICBkb3dubG9hZC4gQ3VybCBkaWRuJ3QgY29tcGxhaW4gaWYgaXQgd2FzIHByZW1hdHVyZWx5IGFib3J0ZWQgYmVmb3JlIHRoZQogICBlbnRpcmUgZG93bmxvYWQgd2FzIGNvbXBsZXRlZC4gSXQgZG9lcyBub3cuCgpEYW5pZWwgKDE5IE5vdmVtYmVyIDE5OTkpOgogLSBDaHJpcyBNYWx0YnkgPGNocmlzQGF1cmVtYS5jb20+IHZlcnkgYWNjdXJhdGVseSBjcml0aWNpemVkIHRoZSBsYWNrIG9mCiAgIHJldHVybiBjb2RlIGNoZWNrcyBvbiB0aGUgZndyaXRlKCkgY2FsbHMuIEkgZGlkIGEgdGhvcm91Z2ggY2hlY2sgZm9yIGFsbAogICBvY2N1cnJlbmNlcyBhbmQgY29ycmVjdGVkIHRoaXMuCgpEYW5pZWwgKDE3IE5vdmVtYmVyIDE5OTkpOgogLSBQYXVsIEhhcnJpbmd0b24gPHBhdWxAcGl6emEub3JnPiBwb2ludGVkIG91dCB0aGF0IHRoZSAtbS8tLW1heC10aW1lIG9wdGlvbgogICBkb2Vzbid0IHdvcmsgZm9yIHRoZSBzbG93IHN5c3RlbSBjYWxscyBsaWtlIGdldGhvc3RieW5hbWUoKS4uLiBJIGRvbid0IGhhdmUKICAgYW55IGdvb2QgZml4IHlldCwganVzdCBhIHNsaWdodGx5IGxlc3MgYmFkIG9uZSB0aGF0IG1ha2VzIGN1cmwgZXhpdCBoYXJkCiAgIHdoZW4gdGhlIHRpbWVvdXQgaXMgcmVhY2hlZC4KCiAtIEJqb3JuIFJlZXNlIGhlbHBlZCBtZSBwb2ludCBvdXQgYSBwb3NzaWJsZSBwcm9ibGVtIHRoYXQgbWlnaHQgYmUgdGhlIHJlYXNvbgogICB3aHkgVGhvbWFzIEh1cnN0IGV4cGVyaWVuY2UgcHJvYmxlbXMgaW4gaGlzIEFtaWdhIHZlcnNpb24uCgogRGFuaWVsICgxMiBOb3ZlbWJlciAxOTk5KToKIC0gSSBmb3VuZCBhIGNyYXNoIGluIHRoZSBuZXcgY29va2llIGZpbGUgcGFyc2VyLiBJdCBjcmFzaGVkIHdoZW4geW91IGdhdmUKICAgYSBwbGFpbiBodHRwIGhlYWRlciBmaWxlIGFzIGlucHV0Li4uCgpWZXJzaW9uIDYuMwoKIERhbmllbCAoMTAgTm92ZW1iZXIgMTk5OSk6CiAtIEkga2luZCBvZiBmb3VuZCBvdXQgdGhhdCB0aGUgSFRUUCB0aW1lLWNvbmRpdGlvbmFsIEdFVHMgKC16KSBhcmVuJ3QgYWx3YXlzCiAgIHJlc3BlY3RlZCBieSB0aGUgd2ViIHNlcnZlciBhbmQgdGhlIGRvY3VtZW50IGlzIHRoZXJlZm9yZSBzZW50IGluIHdob2xlCiAgIGFnYWluLCBldmVuIHRob3VnaCBpdCBkb2Vzbid0IG1hdGNoIHRoZSByZXF1ZXN0ZWQgY29uZGl0aW9uLiBBZnRlciByZWFkaW5nCiAgIHNlY3Rpb24gMTMuMy40IG9mIFJGQyAyNjE2LCBJIHRoaW5rIEknbSBkb2luZyB0aGUgcmlnaHQgdGhpbmcgbm93IHdoZW4gSSBkbwogICBteSBvd24gY2hlY2sgYXMgd2VsbC4gSWYgY3VybCB0aGlua3MgdGhlIGNvbmRpdGlvbiBpc24ndCBtZXQsIHRoZSB0cmFuc2ZlcgogICBpcyBhYm9ydGVkIHByZW1hdHVyZWx5IChhZnRlciBhbGwgdGhlIGhlYWRlcnMgaGF2ZSBiZWVuIHJlY2VpdmVkKS4KCiAtIEFmdGVyIGNvbW1lbnRzIGZyb20gUm9iZXJ0IExpbmRlbiA8cm9iZXJ0LmxpbmRlbkBwb3N0Y29tLmRldXRzY2hlcG9zdC5kZT4gSQogICBhbHNvIHJld3JvdGUgc29tZSBwYXJ0cyBvZiB0aGUgbWFuIHBhZ2UgdG8gYmV0dGVyIGRlc2NyaWJlIGhvdyB0aGUgLUYKICAgd29ya3MuCgogLSBNaWNoYWVsIEFudGkgPGFudGlAcHNob3dpbmcuY29tPiBwdXQgdXAgYSBuZXcgY3VybCBkb3dubG9hZCBtaXJyb3IgaW4KICAgQ2hpbmE6ICBodHRwOi8vd3d3LnBzaG93aW5nLmNvbS9jdXJsLwoKIC0gSSBhZGRlZCB0aGUgbGlzdCBvZiBkb3dubG9hZCBtaXJyb3JzIHRvIHRoZSBSRUFETUUgZmlsZQoKIC0gSSBkaWQgYWRkIG1vcmUgZXhwbGFuYXRpb25zIHRvIHRoZSBtYW4gcGFnZQoKIERhbmllbCAoOCBOb3ZlbWJlciAxOTk5KToKIC0gSSBtYWRlIHRoZSAtYi8tLWNvb2tpZSBvcHRpb24gY2FwYWJsZSBvZiByZWFkaW5nIG5ldHNjYXBlIGZvcm1hdHRlZCBjb29raWUKICAgZmlsZXMgYXMgd2VsbCBhcyBub3JtYWwgaHR0cC1oZWFkZXIgZmlsZXMuIEl0IHNob3VsZCBiZSBhYmxlIHRvCiAgIHRyYW5zcGFyYW50bHkgZmlndXJlIG91dCB3aGF0IGtpbmQgb2YgZmlsZSBpdCBnb3QgYXMgaW5wdXQuCgogRGFuaWVsICgyOSBPY3RvYmVyIDE5OTkpOgogLSBBbm90aGVyIG9uZSBvZiBTZWJhc3RpYWFuIHZhbiBFcmsncyBpZGVhcyAodGhhdCBoYXMgYmVlbiByZXF1ZXN0ZWQgYmVmb3JlCiAgIGJ1dCBJIHNlZW0gdG8gaGF2ZSBmb3Jnb3R0ZW4gd2hvIGl0IHdhcyksIGlzIHRvIGFkZCBzdXBwb3J0IGZvciByYW5nZXMgaW4KICAgRlRQIGRvd25sb2Fkcy4gQXMgdXN1YWwsIG9uZSByZXF1ZXN0IGlzIGp1c3QgYSByZXF1ZXN0LCB3aGVuIHRoZXkncmUgdHdvCiAgIGl0IGlzIGEgZGVtYW5kLiBJJ3ZlIGFkZGVkIHNpbXBsZSBzdXBwb3J0IGZvciBYLVkgc3R5bGUgZmV0Y2hlcy4gWCBoYXMgdG8KICAgYmUgdGhlIGxvd2VyIG51bWJlciwgdGhvdWdoIHlvdSBtYXkgb21pdCBvbmUgb2YgdGhlIG51bWJlcnMuIFVzZSB0aGUgLXIvCiAgIC0tcmFuZ2Ugc3dpdGNoIChwcmV2aW91c2x5IEhUVFAtb25seSkuCgogLSBTZWJhc3RpYWFuIHZhbiBFcmsgPHNlYnN0ZXJAc2Vic3Rlci5jb20+IHN1Z2dlc3RlZCB0aGF0IGN1cmwgc2hvdWxkIGJlCiAgIGFibGUgdG8gc2hvdyB0aGUgZmlsZSBzaXplIG9mIGEgc3BlY2lmaWVkIGZpbGUuIEkgdGhpbmsgdGhpcyBpcyBhIHNwbGVuZGlkCiAgIGlkZWEgYW5kIHRoZSAtSSBmbGFnIGlzIG5vdyB3b3JraW5nIGZvciBGVFAuIEl0IGRpc3BsYXlzIHRoZSBmaWxlIHNpemUgaW4KICAgdGhpcyBtYW5uZXI6CiAgICAgICAgQ29udGVudC1MZW5ndGg6IFhYWFgKICAgQXMgaXQgcmVzZW1ibGVzIG5vcm1hbCBoZWFkZXJzLCBhbmQgbGVhdmVzIHVzIHRoZSBvcHBvcnR1bml0eSB0byBhZGQgbW9yZQogICBpbmZvIGluIHRoYXQgZGlzcGxheSBpZiB3ZSBjYW4gY29tZSB1cCB3aXRoIG1vcmUgaW4gdGhlIGZ1dHVyZSEgSXQgYWxzbwogICBtYWtlcyBzZW5zZSBzaW5jZSBpZiB5b3UgYWNjZXNzIGZ0cCB0aHJvdWdoIGEgSFRUUCBwcm94eSwgeW91J2QgZ2V0IHRoZQogICBmaWxlIHNpemUgdGhlIHNhbWUgd2F5LgoKICAgSSBjaGFuZ2VkIHRoZSBvcmRlciBvZiB0aGUgUVVPVEUgY29tbWFuZCBleGVjdXNpb25zLiBUaGV5J3JlIG5vdyBleGVjdXRlZAogICBqdXN0IGFmdGVyIHRoZSBsb2dpbiBhbmQgYmVmb3JlIGFueSBvdGhlciBjb21tYW5kLiBJIG1hZGUgdGhpcyB0byBlbmFibGUKICAgcXVvdGUgY29tbWFuZHMgdG8gcnVuIGJlZm9yZSB0aGUgLUkgc3R1ZmYgaXMgZG9uZSB0b28uCgogLSBJIGZvdW5kIG91dCB0aGF0IC1ELy0tZHVtcC1oZWFkZXIgYW5kIC1WLy0tdmVyc2lvbiB3ZXJlbid0IGRvY3VtZW50ZWQgaW4KICAgdGhlIG1hbiBwYWdlLgoKIC0gTWFueSBIVFRQLzEuMSBzZXJ2ZXJzIGRvIG5vdCBzdXBwb3J0IHJhbmdlcy4gRG9uJ3QgYXNrIG1lIHdoeS4gSSBkaWQgYWRkCiAgIHNvbWUgdGV4dCBhYm91dCB0aGlzIGluIHRoZSBtYW4gcGFnZSBmb3IgdGhlIHJhbmdlIG9wdGlvbi4gVGhlIHRocmVhZCBpbgogICB0aGUgbWFpbGluZyBsaXN0IHRoYXQgc3RhcnRlZCB0aGlzIHdhcyBpbml0aWF0ZWQgYnkgTWljaGFlbCBBbnRpCiAgIDxhbnRpQHBzaG93aW5nLmNvbT4uCgogLSBJIGdldCByZXBvcnRzIGFib3V0IG5yb2ZmIGNyYXNoZXMgb24gc29sYXJpcyAyLjYrIHdoZW4gZGlzcGxheWluZyB0aGUgY3VybAogICBtYW4gcGFnZS4gU3dpdGNoIHRvIGducm9mZiBpbnN0ZWFkLCBpdCBpcyByZXBvcnRlZCB0byB3b3JrKCEpLiBBZGFtIEJhcmNsYXkKICAgPGFkYW1Ab3oub3JnPiByZXBvcnRlZCBhbmQgYnJvdWdodCB0aGUgc3VnZ2VzdGlvbi4KCiAtIEluIGEgZGlhbG9ndWUgd2l0aCBKb2hhbm5lcyBHLiBLcmlzdGluc3NvbiA8ZDk4aXNAZHRlay5jaGFsbWVycy5zZT4gd2UgY2FtZQogICB1cCB3aXRoIHRoZSBpZGVhIHRvIGxldCAtSC8tLWhlYWRlciBzcGVjaWZpZWQgaGVhZGVycyByZXBsYWNlIHRoZQogICBpbnRlcm5hbGx5IGdlbmVyYXRlZCBoZWFkZXJzLCBpZiB5b3UgaGFwcGVuZWQgdG8gc2VsZWN0IHRvIGFkZCBhIGhlYWRlcgogICB0aGF0IGN1cmwgbm9ybWFsbHkgdXNlcyBieSBpdHNlbGYuIFRoZSBhZHZhbnRhZ2Ugd2l0aCB0aGlzIGlzIG5vdCBlbnRpcmVseQogICBvYnZpb3VzLCBidXQgaW4gSm9oYW5uZXMnIGNhc2UgaXQgbWVhbnMgdGhhdCBoZSBjYW4gdXNlIGFub3RoZXIgSG9zdDogdGhhbgogICB0aGUgb25lIGN1cmwgd291bGQgc2V0LgoKIERhbmllbCAoMjcgT2N0b2JlciAxOTk5KToKIC0gSm9uZ2tpIFN1d2FuZGkgPEpvbmdraS5TdXdhbmRpQGVuZy5zdW4uY29tPiBicm91Z2h0IGEgbmljZSBwYXRjaCBmb3IKICAgKHlldCBhbm90aGVyKSBjcmFzaCB3aGVuIGZvbGxvd2luZyBhIGxvY2F0aW9uOi4gVGhpcyB0aW1lIHlvdSBoYWQgdG8KICAgZm9sbG93IGEgaHR0cHM6Ly8gc2VydmVyJ3MgcmVkaXJlY3QgdG8gZ2V0IHRoZSBjb3JlLgoKVmVyc2lvbiA2LjIKCiBEYW5pZWwgKDIxIE9jdG9iZXIgMTk5OSk6CiAtIEkgdGhpbmsgSSBtYW5hZ2VkIHRvIHJlbW92ZSB0aGUgc3VzcGljaW91cyAobmlsKSB0aGF0IGhhcyBiZWVuIHNlZW4ganVzdAogICBiZWZvcmUgdGhlICJIb3N0OiIgaW4gSFRUUCByZXF1ZXN0cyB3aGVuIC12IHdhcyB1c2VkLgogLSBJIGZvdW5kIG91dCB0aGF0IGlmIHlvdSBmb2xsb3dlZCBhIGxvY2F0aW9uOiB3aGVuIHVzaW5nIGEgcHJveHksIHdpdGhvdXQKICAgaGF2aW5nIHNwZWNpZmllZCBodHRwOi8vIGluIHRoZSBVUkwsIHRoZSBwcm90b2NvbCBwYXJ0IHdhcyBhZGRlZCBvbmNlIGFnYWluCiAgIHdoZW4gbW92aW5nIHRvIHRoZSBuZXh0IFVSTCEgKFRoZSBwcm90b2NvbCBwYXJ0IGhhcyB0byBiZSBhZGRlZCB0byB0aGUKICAgVVJMIHdoZW4gZ29pbmcgdGhyb3VnaCBhIHByb3h5IHNpbmNlIGl0IGhhcyBubyBwcm90b2NvbC1ndWVzc2luZyBzeXN0ZW0KICAgc3VjaCBhcyBjdXJsIGhhcy4pCiAtIEJlbmphbWluIFJpdGNleSA8cml0Y2V5QHRmbi5jb20+IHJlcG9ydGVkIGEgY29yZSBkdW1wIHVuZGVyIHNvbGFyaXMgMi42CiAgIHdpdGggT3BlblNTTCAwLjkuNC4gSXQgdHVybmVkIG91dCB0aGlzIHdhcyBkdWUgdG8gYSBiYWQgZnJlZSgpIGluIG1haW4uYwogICB0aGF0IG9jY3VycmVkIGFmdGVyIHRoZSBkb3dubG9hZCB3YXMgZG9uZSBhbmQgY29tcGxldGVkLgogLSBCZW5qYW1pbiBmb3VuZCBmdHAgZG93bmxvYWRzIHRvIHNob3cgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGRvd25sb2FkIG1ldGVyCiAgIHRvIGdldCB3cml0dGVuIHR3aWNlLCBhbmQgSSByZW1vdmVkIHRoYXQgcHJvYmxlbS4gSXQgd2FzIGludHJvZHVjZWQgd2l0aAogICB0aGUgbXVsdGlwbGUgVVJMIHN1cHBvcnQuCiAtIERhbiBaaXR0ZXIgPGR6aXR0ZXJAeml0dGVyLm5ldD4gY29ycmVjdGx5IHBvaW50ZWQgb3V0IHRoYXQgY3VybCA2LjEgYW5kCiAgIGVhcmxpZXIgdmVyc2lvbnMgZGlkbid0IGhvbm9yIFJGQyAyNjE2IGNoYXB0ZXIgNCBzZWN0aW9uIDIsICJNZXNzYWdlCiAgIEhlYWRlcnMiOiAiLi4uRmllbGQgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUuLi4iCiAgIEhUVFAgaGVhZGVyIHBhcnNpbmcgYXNzdW1lZCBhIGNlcnRhaW4gY2FzaW5nLiBEYW4gYWxzbyBwcm92aWRlZCBtZSB3aXRoCiAgIGEgcGF0Y2ggdGhhdCBjb3JyZWN0ZWQgdGhpcywgd2hpY2ggSSB0b29rIHRoZSBsaWJlcnR5IG9mIGVkaXRpbmcgc2xpZ2h0bHkuCiAtIERhbiBaaXR0ZXIgYWxzbyBwcm92aWRlZCBhIG5pY2UgcGF0Y2ggZm9yIGNvbmZpZy5ndWVzcyB0byBiZXR0ZXIgcmVjb2duaXplCiAgIHRoZSBNYWMgT1MgWAogLSBEYW4gYWxzbyBjb3JyZWN0ZWQgYSBtaW5vciBwcm9ibGVtIGluIHRoZSBsaWIvTWFrZWZpbGUgdGhhdCBjYXVzZWQgbGlua2luZwogICB0byBmYWlsIG9uIE9TIFguCgogRGFuaWVsICgxOSBPY3RvYmVyIDE5OTkpOgogLSBMZW4gTWFyaW5hY2NpbyA8bGVuQGdvb2RuZXQuY29tPiBjYW1lIHVwIHdpdGggc29tZSBwcm9ibGVtcyB3aXRoIGN1cmwuCiAgIFNpbmNlIFdpbmRvd3MgaGFzIGEgY3JpcHBsZWQgc2hlbGwsIGl0IGNhbid0IHJlZGlyZWN0IHN0ZGVyciBhbmQgdGhhdAogICBjYXVzZXMgdHJvdWJsZS4gSSBhZGRlZCAtLXN0ZGVyciB0b2RheSB3aGljaCBhbGxvd3MgdGhlIHVzZXIgdG8gcmVkaXJlY3QKICAgdGhlIHN0ZGVyciBzdHJlYW0gdG8gYSBmaWxlIG9yIHN0ZG91dC4KCiBEYW5pZWwgKDE4IE9jdG9iZXIgMTk5OSk6CiAtIFRoZSBjb25maWd1cmUgc2NyaXB0IG5vdyB1bmRlcnN0YW5kcyB0aGUgJy0td2l0aG91dC1zc2wnIGZsYWcsIHdoaWNoIG5vdwogICB0b3RhbGx5IGRpc2FibGUgU1NML2h0dHBzIHN1cHBvcnQuIFByZXZpb3VzbHkgaXQgd2Fzbid0IHBvc3NpYmxlIHRvIGZvcmNlCiAgIHRoZSBjb25maWd1cmUgc2NyaXB0IHRvIGxlYXZlIFNTTCBhbG9uZS4gVGhlIHByZXZpb3VzIGZ1bmN0aW9uYWxpdHkgaGFzCiAgIGJlZW4gcmV0YWluZWQuIFRyb3kgRW5nZWwgaGVscGVkIHRlc3QgdGhpcyBuZXcgb25lLgoKVmVyc2lvbiA2LjEKCiBEYW5pZWwgKDE3IE9jdG9iZXIgMTk5OSk6CiAtIEkgaWZkZWYnZWQgb3IgY29tbWVudGVkIGFsbCB0aGUgemxpYiBzdHVmZiBpbiB0aGUgc291cmNlcyBhbmQgY29uZmlndXJlCiAgIHNjcmlwdC4gSXQgdHVybmVkIG91dCB3ZSBuZWVkZWQgdG8gbW9jayBtb3JlIHdpdGggemxpYiB0aGFuIEkgaW5pdGlhbGx5CiAgIHRob3VnaHQsIHRvIG1ha2UgaXQgY2FwYWJsZSBvZiBkb3dubG9hZGluZyBjb21wcmVzc2VkIEhUVFAgZG9jdW1lbnRzIGFuZAogICB1bmNvbXByZXNzIHRoZW0gb24gdGhlIGZseS4gSSBkaWRuJ3QgbWVhbiB0aGUgemxpYiBwYXJ0cyBvZiBjdXJsIHRvIGJlY29tZQogICBtb3JlIHRoYW4gbWlub3Igc28gdGhpcyBtZWFucyBJIGhhbHQgdGhlIHpsaWIgZXhwZWRpdGlvbiBmb3Igbm93IGFuZCB3YWl0CiAgIHVudGlsIHNvbWVvbmUgZWl0aGVyIHdyaXRlcyB0aGUgY29kZSBvciB6bGliIGdldHMgdXBkYXRlZCBhbmQgYmV0dGVyCiAgIGFkanVzdGVkIGZvciB0aGlzIGtpbmQgb2YgdXNhZ2UuICBJIHdvbid0IGdldCBpbnRvIGRldGFpbHMgaGVyZSwgYnV0IGEKICAgc2hvcnQgYSBzdW1tYXJ5IGlzIHN1aXRhYmxlOgogICAtIHpsaWIgY2FuJ3QgYXV0b21hdGljYWxseSBkZXRlY3Qgd2hldGhlciB0byB1c2UgemxpYiBvciBnemlwCiAgICAgZGVjb21wcmVzc2lvbiBtZXRob2RzLgogICAtIHpsaWIgaXMgdmVyeSBuZWF0IGZvciByZWFkaW5nIGd6aXBwZWQgZmlsZXMgZnJvbSBhIGZpbGUgZGVzY3JpcHRvciwKICAgICBhbHRob3VnaCBub3QgYXMgbmljZSBmb3IgcmVhZGluZyBidWZmZXItYmFzZWQgZGF0YSBzdWNoIGFzIHdlIHdvdWxkCiAgICAgd2FudCBpdC4KICAgLSB0aGVyZSBhcmUgc3RpbGwgc29tZSBwcm9ibGVtcyB3aXRoIHRoZSB3aW4zMiB2ZXJzaW9uIHdoZW4gcmVhZGluZyBmcm9tCiAgICAgYSBmaWxlIGRlc2NyaXB0b3IgaWYgdGhhdCBpcyBhIHNvY2tldAoKIERhbmllbCAoMTQgT2N0b2JlciAxOTk5KToKIC0gTW92ZWQgdGhlIChleHRlcm5hbCkgaW5jbHVkZSBmaWxlcyBmb3IgbGliY3VybCBpbnRvIGEgc3ViZGlyZWN0b3J5IG5hbWVkCiAgIGN1cmwgYW5kIGFkanVzdGVkIGFsbCAjaW5jbHVkZSBsaW5lcyB0byB1c2UgPGN1cmwvWFhYWD4gdG8gbWFpbnRhaW4gYQogICBiZXR0ZXIgbmFtZSBzcGFjZSBhbmQgY29udHJvbCBvZiB0aGUgaGVhZGVycy4gVGhpcyBoYXMgYmVlbiByZXF1ZXN0ZWQuCgogRGFuaWVsICgxMiBPY3RvYmVyIDE5OTkpOgogLSBJIG1vZGlmaWVkIHRoZSAnbWFrZXRneicgc2NyaXB0IHRvIHBlcmZvcm0gYSAnbWFrZScgdG9vIGJlZm9yZSBhIHJlbGVhc2UKICAgYXJjaGl2ZSBpcyBwdXQgdG9nZXRoZXIgaW4gYW4gYXR0ZW1wdCB0byBtYWtlIHRoZSB0aW1lIHN0YW1wcyBiZXR0ZXIgYW5kCiAgIGhvcGVmdWxseSBhdm9pZCB0aGUgZG91YmxlIGNvbmZpZ3VyZS1ydW5uaW5nIHRoYXQgdXNlIHRvIG9jY3VyLgoKIERhbmllbCAoMTEgT2N0b2JlciAxOTk5KToKIC0gQXBwbGllZCBK9nJuJ3MgcGF0Y2hlcyB0aGF0IGZpeGVzIHpsaWIgZm9yIG1pbmd3MzIgY29tcGlsZXMgYXMgd2VsbCBhcwogICBzb21lIG90aGVyIG1pc3NpbmcgemxpYiAjaWZkZWYgYW5kIG1vcmUgdGV4dCBvbiB0aGUgbXVsdGlwbGUgVVJMIGRvY3MgaW4KICAgdGhlIG1hbiBwYWdlLgoKVmVyc2lvbiA2LjFiZXRhCgogRGFuaWVsICg2IE9jdG9iZXIgMTk5OSk6CiAtIERvdWdsYXMgRS4gV2Vnc2NoZWlkIDx3ZWdzY2RAd2hpcmxwb29sLmNvbT4gc2VudCBtZSBhIHBhdGNoIHRoYXQgbWFkZSB0aGUKICAgZXhhY3Qgc2FtZSB0aGluZyBhcyBJIGp1c3QgbWFkZTogdGhlIC1kIHN3aXRjaCBpcyBub3cgY2FwYWJsZSBvZiByZWFkaW5nCiAgIHBvc3QgZGF0YSBmcm9tIGEgbmFtZWQgZmlsZSBvciBzdGRpbi4gIFVzZSBpdCBzaW1pbGFybHkgdG8gdGhlIC1GLiBUbyByZWFkCiAgIHRoZSBwb3N0IGRhdGEgZnJvbSBhIGdpdmVuIGZpbGU6CgogICAgICAgIGN1cmwgLWQgQHBhdGgvdG8vZmlsZW5hbWUgd3d3LnBvc3RzaXRlLmNvbQoKICAgb3IgbGV0IGN1cmwgcmVhZCBpdCBvdXQgZnJvbSBzdGRpbjoKCiAgICAgICAgY3VybCAtZCBALSB3d3cucG9zdGl0LmNvbQoKIEr2cm4gSGFydHJvdGggKDMgT2N0b2JlciAxOTk5KToKIC0gQnJvdWdodCBzb21lIG1vcmUgcGF0Y2hlcyBmb3IgbXVsdGlwbGUgVVJMIGZ1bmN0aW9uYWxpdHkuIFRoZSBNSU1FCiAgIHNlcGFyYXRpb24gaWRlYXMgYXJlIGFsbW9zdCBzY3JhcHBlZCBub3csIGFuZCBhIGN1c3RvbSBzZXBhcmF0b3IgaXMgYmVpbmcKICAgdXNlZCBpbnN0ZWFkLiBUaGlzIGlzIHN0aWxsIGNvbXBpbGUtdGltZSAiZmxhZ2dlZCIuCgogRGFuaWVsCiAtIFVwZGF0ZWQgY3VybC4xIHdpdGggbXVsdGlwbGUgVVJMIGluZm8uCgogRGFuaWVsICgzMCBTZXB0ZW1iZXIgMTk5OSk6CiAtIEZlbGl4IHZvbiBMZWl0bmVyIDxmZWxpeEBjb252ZXJnZW5jZS5kZT4gYnJvdWdodCBvcGVuc3NsLWNoZWNrIGZpeGVzCiAgIGZvciBjb25maWd1cmUuaW4gdG8gd29yayBvdXQtb2YtdGhlLWJveCB3aGVuIHRoZSBvcGVuc3NsIGZpbGVzIGFyZQogICBpbnN0YWxsZWQgaW4gdGhlIHN5c3RlbSBkZWZhdWx0IGRpcnMuCgogRGFuaWVsICgyOCBTZXB0ZW1iZXIgMTk5OSkKIC0gQWRkZWQgbGlieiBmdW5jdGlvbmFsaXR5LiBUaGlzIHNob3VsZCBlbmFibGUgZGVjb21wcmVzc2luZyBnemlwLCBjb21wcmVzcwogICBvciBkZWZsYXRlIGVuY29kaW5nIEhUVFAgZG9jdW1lbnRzLiBJdCBhbHNvIG1ha2VzIGN1cmwgc2VuZCBhbiBhY2NlcHQgdGhhdAogICBpdCBhY2NlcHRzIHRoYXQga2luZCBvZiBlbmNvZGluZy4gQ29tcHJlc3NlZCBjb250ZW50cyB1c3VhbGx5IHNob3J0ZW5zCiAgIGRvd25sb2FkIHRpbWUuIEkgKm5lZWQqIHNvbWVvbmUgdG8gdGVsbCBtZSBhIHNpdGUgdGhhdCB1c2VzIGNvbXByZXNzZWQgSFRUUAogICBkb2N1bWVudHMgc28gdGhhdCBJIGNhbiB0ZXN0IHRoaXMgb3V0IHByb3Blcmx5LgoKIC0gQXMgYSByZXN1bHQgb2YgdGhlIGFkZGluZyBvZiB6bGliIGF3YXJlbmVzcywgSSBjaGFuZ2VkIHRoZSB2ZXJzaW9uIHN0cmluZwogICBhIGxpdHRsZS4gSSBwbGFuIHRvIGFkZCBvcGVubGRhcCB2ZXJzaW9uIHJlcG9ydGluZyBpbiB0aGVyZSB0b28uCgogRGFuaWVsICgxNyBTZXB0ZW1iZXIgMTk5OSkKIC0gTWFkZSB0aGUgLUYgb3B0aW9uIGFsbG93IHN0ZGluIHdoZW4gc3BlY2lmeWluZyBmaWxlcy4gQnkgdXNpbmcgJy0nIGluc3RlYWQKICAgb2YgZmlsZSBuYW1lLCB0aGUgZGF0YSB3aWxsIGJlIHJlYWQgZnJvbSBzdGRpbi4KClZlcnNpb24gNi4wCgogRGFuaWVsICgxMyBTZXB0ZW1iZXIgMTk5OSkKIC0gQWRkZWQgLVgvLS1odHRwLXJlcXVlc3QgPHJlcXVlc3Q+IHRvIGVuYWJsZSBhbnkgSFRUUCBjb21tYW5kIHRvIGJlIHNlbnQuCiAgIERvIG5vdCB0aGF0IHlvdXIgc2VydmVyIGhhcyB0byBzdXBwb3J0IHRoZSBleGFjdCBzdHJpbmcgeW91IGVudGVyLiBUaGlzCiAgIHNob3VsZCBwb3NzaWJseSBhIHN0cmluZyBsaWtlIERFTEVURSBvciBUUkFDRS4KCiAtIEFwcGxpZWQgRG91Z2xhcycgbWluZ3czMi1maXhlcyBmb3IgdGhlIG1ha2VmaWxlcy4KCiBEYW5pZWwgKDEwIFNlcHRlbWJlciAxOTk5KQogLSBEb3VnbGFzIEUuIFdlZ3NjaGVpZCA8d2Vnc2NkQHdoaXJscG9vbC5jb20+IHBvaW50ZWQgb3V0IGEgcHJvYmxlbS4gQ3VybAogICBkaWRuJ3QgY2hlY2sgdGhlIEZUUCBzZXJ2ZXJzIHJldHVybiBjb2RlIHByb3Blcmx5IGFmdGVyIHRoZSAtLXF1b3RlCiAgIGNvbW1hbmRzIHdlcmUgaXNzdWVkLiBJdCB0b29rIGFueXRoaW5nIG5vbiAyMDAgYXMgYW4gZXJyb3IsIHdoZW4gYWxsIDJYWAogICBjb2RlcyBzaG91bGQgYmUgYWNjZXB0ZWQgYXMgT0suCgogLSBTZW5kaW5nIGNvb2tpZXMgdG8gdGhlIHNhbWUgc2l0ZSBpbiBtdWx0aXBsZSBsaW5lcyBsaWtlIGN1cmwgdXNlZCB0byBkbwogICB0dXJuZWQgb3V0IHRvIGJlIGJhZCBhbmQgYnJlYWtpbmcgdGhlIGNvb2tpZSBzcGVjcy4gQ3VybCBub3cgc2VuZHMgYWxsCiAgIGNvb2tpZXMgb24gYSBzaW5nbGUgQ29va2llOiBsaW5lLiBDdXJsIGlzIG5vdCB5ZXQgUkZDIDIxMDkgY29tcGxpYW50LCBidXQgSQogICBkb3VidCB0aGF0IG1hbnkgc2VydmVycyBkbyB1c2UgdGhhdCBzeW50YXggKHlldCkuCgogRGFuaWVsICg4IFNlcHRlbWJlciAxOTk5KQogLSBK9nJuIGhlbHBlZCBtZSBtYWtlIHN1cmUgaXQgc3RpbGwgY29tcGlsZXMgbmljZWx5IHdpdGggbWluZ3czMiB1bmRlciB3aW4zMi4KCiBEYW5pZWwgKDcgU2VwdGVtYmVyIDE5OTkpCiAtIEZUUCB1cGxvYWQgdGhyb3VnaCBwcm94eSBpcyBub3cgdHVybmVkIGludG8gYSBIVFRQIFBVVC4gUmVxdWVzdGVkIGJ5CiAgIFN0ZWZhbiBLYW50aGFrIDxTdGVmYW4uS2FudGhha0BtY2hwLnNpZW1lbnMuZGU+LgoKIC0gQWRkZWQgdGhlIGxkYXAgZmlsZXMgdG8gdGhlIC5tMzIgbWFrZWZpbGUuCgogRGFuaWVsICgzIFNlcHRlbWJlciAxOTk5KQogLSBNYWRlIGNvb2tpZSBtYXRjaGluZyB3b3JrIHdoaWxlIHVzaW5nIEhUVFAgcHJveHkuCgogQmpvcm4gUmVlc2UgPGJyZWVzZUBtYWlsMS5zdG9mYW5ldC5kaz4gKDMxIEF1Z3VzdCAxOTk5KQogLSBQYXNzZWQgaGlzIGxkYXA6Ly8gcGF0Y2guIE5vdGUgdGhhdCB0aGlzIHJlcXVpcmVzIHRoZSBvcGVubGRhcCBzaGFyZWQKICAgbGlicmFyeSB0byBiZSBpbnN0YWxsZWQgYW5kIHRoYXQgTERfTElCUkFSWV9QQVRIIHBvaW50cyB0byB0aGUKICAgZGlyZWN0b3J5IHdoZXJlIHRoZSBsaWIgd2lsbCBiZSBmb3VuZCB3aGVuIGN1cmwgaXMgcnVuIHdpdGggYQogICBsZGFwOi8vIFVSTC4KCiBK9nJuIEhhcnRyb3RoIDxKb2Vybi5IYXJ0cm90aEB0ZWxla29tLmRlPiAoMzEgQXVndXN0IDE5OTkpCiAtIE1hZGUgdGhlIE1pbmd3MzIgbWFrZWZpbGVzIGludG8gc2luZ2xlIGZpbGVzLgogLSBNYWRlIGZpbGU6Ly8gd29yayBmb3IgV2luMzIuIFRoZSBzYW1lIGNvZGUgaXMgbm93IHVzZWQgZm9yIHVuaXggYXMgd2VsbCBmb3IKICAgcGVyZm9ybWFuY2UgcmVhc29ucy4KCiBEb3VnbGFzIEUuIFdlZ3NjaGVpZCA8d2Vnc2NkQHdoaXJscG9vbC5jb20+ICgzMCBBdWd1c3QgMTk5OSkKIC0gUGF0Y2hlZCB0aGUgTWluZ3czMiBtYWtlZmlsZXMgZm9yIFNTTCBidWlsZHMuCgogTWF0dGhldyBDbGFya2UgPGNsYW1hdEB2YW4ubWF2ZXMuY2E+ICgzMCBBdWd1c3QgMTk5OSkKIC0gTWFkZSBhIGNvb2wgcGF0Y2ggZm9yIGNvbmZpZ3VyZS5pbiB0byBhbGxvdyAtLXdpdGgtc3NsIHRvIHNwZWNpZnkgdGhlCiAgIHJvb3QgZGlyIG9mIHRoZSBvcGVuc3NsIGluc3RhbGxhdGlvbiwgYXMgaW4KCiAgICAgICAgLi9jb25maWd1cmUgLS13aXRoLXNzbD0vdXNyL3NzbF9oZXJlCgogLSBDb3JyZWN0ZWQgdGhlICdyZWNvbmYnIHNjcmlwdCB0byB3b3JrIGJldHRlciB3aXRoIHNvbWUgc2hlbGxzLgoKIEr2cm4gSGFydHJvdGggPEpvZXJuLkhhcnRyb3RoQHRlbGVrb20uZGU+ICgyNiBBdWd1c3QgMTk5OSkKIC0gRml4ZWQgdGhlIE1pbmd3MzIgbWFrZWZpbGVzIGluIGxpYi8gYW5kIGNvcnJlY3RlZCB0aGUgZmlsZS5jIGZvciB3aW4zMgogICBjb21waWxlcy4KClZlcnNpb24gNS4xMQoKIERhbmllbCAoMjUgQXVndXN0IDE5OTkpCiAtIEpvaG4gV2Vpc21pbGxlciA8am9obndlaXNAaG9tZS5jb20+IHBvaW50ZWQgb3V0IGEgYnVnIGluIHRoZSBoZWFkZXItbGluZQogICByZWFsbG9jKCkgc3lzdGVtIGluIGRvd25sb2FkLmMuCgogLSBJIGFkZGVkIGxpYi9maWxlLltjaF0gdG8gb2ZmZXIgYSBmaXJzdCwgc2ltcGxlLCBmaWxlOi8vIHN1cHBvcnQuIEl0CiAgIHByb2JhYmx5IHdvbid0IGRvIG11Y2ggZ29vZCBvbiB3aW4zMiBzeXN0ZW0gYXQgdGhpcyBwb2ludCwgYnV0IEkgc2VlIGl0CiAgIGFzIGEgc3RhcnQuCgogLSBNYWRlIHRoZSByZWxlYXNlIGFyY2hpdmVzIGdldCBhIE1ha2VmaWxlIGluIHRoZSByb290IGRpciwgd2hpY2ggY2FuIGJlCiAgIHVzZWQgdG8gc3RhcnQgdGhlIGNvbXBpbGluZy9idWlsZGluZyBwcm9jZXNzIGVhc2llci4gSSBoYXZlbid0IHJlYWxseQogICBjaGFuZ2VkIGFueSBJTlNUQUxMIHRleHQgeWV0LCBJIHdhbnRlZCB0byBnZXQgc29tZSBmZWVkLWJhY2sgb24gdGhpcwogICBmaXJzdC4KCiBEYW5pZWwgKDE3IEF1Z3VzdCAxOTk5KQogLSBBbm90aGVyIExvY2F0aW9uOiBidWcuIEN1cmwgZGlkbid0IGRvIHByb3BlciByZWxhdGl2ZSBsb2NhdGlvbnMgaWYgdGhlCiAgIG9yaWdpbmFsIFVSTCBoYWQgY2dpLXBhcmFtZXRlcnMgdGhhdCBjb250YWluZWQgYSBzbGFzaC4gTnVzdSdzIHBhZ2UKICAgYWdhaW4uCgogLSBDb3JyZWN0ZWQgdGhlIE5PX1BST1hZIHVzYWdlLiBJdCBpcyBhIGxpc3Qgb2Ygc3Vic3RyaW5ncyB0aGF0IGlmIG9uZSBvZgogICB0aGVtIG1hdGNoZXMgdGhlIHRhaWwgb2YgdGhlIGhvc3QgbmFtZSBpdCBzaG91bGQgY29ubmVjdCB0bywgY3VybCBzaG91bGQKICAgbm90IHVzZSBhIHByb3h5IHRvIGNvbm5lY3QgdGhlcmUuIFBvaW50ZWQgb3V0IHRvIG1lIGJ5IERvdWdsYXMgRS4gV2Vnc2NoZWlkCiAgIDx3ZWdzY2RAd2hpcmxwb29sLmNvbT4uIEkgYWxzbyBjaGFuZ2VkIHRoZSBSRUFETUUgdGV4dCBhIGxpdHRsZSByZWdhcmRpbmcKICAgdGhpcy4KCiBEYW5pZWwgKDE2IEF1Z3VzdCAxOTk5KQogLSBGaXhlZCBhIG1lbW9yeSBidWcgd2l0aCBodHRwLXNlcnZlcnMgdGhhdCBzZW50IExvY2F0aW9uOiB0byBhIExvY2F0aW9uOgogICBwYWdlLiBOdXN1J3MgcGFnZSBzaG93ZWQgdGhpcyB0b28uCgogLSBNYWRlIGNvb2tpZXMgd29yayBhIGxvdCBiZXR0ZXIuIFNldHRpbmcgdGhlIHNhbWUgY29va2llIG5hbWUgc2V2ZXJhbCB0aW1lcwogICB1c2VkIHRvIGFkZCBtb3JlIGNvb2tpZXMgaW5zdGVhZCBvZiByZXBsYWNpbmcgdGhlIGZvcm1lciBvbmUgd2hpY2ggaXQKICAgc2hvdWxkJ3ZlLiBOdXN1IDxudXNAaW50ZXJnb3JqLnJvPiBicm91Z2h0IG1lIGFuIFVSTCB0aGF0IG1hZGUgdGhpcwogICBwYWluZnVsbHkgdmlzaWJsZS4uLgoKIFRyb3kgKDE1IEF1Z3VzdCAxOTk5KQogLSBCcm91Z2h0IG5ldyAuc3BlYyBmaWxlcyBhcyB3ZWxsIGFzIGEgcGF0Y2ggZm9yIGNvbmZpZ3VyZS5pbiB0aGF0IGxldHMgdGhlCiAgIGNvbmZpZ3VyZSBzY3JpcHQgZmluZCB0aGUgb3BlbnNzbCBmaWxlcyBiZXR0ZXIsIGV2ZW4gd2hlbiB0aGUgaW5jbHVkZQogICBmaWxlcyBhcmUgaW4gL3Vzci9pbmNsdWRlL29wZW5zc2wKClZlcnNpb24gNS4xMAoKIERhbmllbCAoMTMgQXVndXN0IDE5OTkpCiAtIFNTTF9DVFhfc2V0X2RlZmF1bHRfcGFzc3dkX2NiKCkgaGFzIGJlZW4gbW9kaWZpZWQgaW4gdGhlIDAuOS40IHZlcnNpb24gb2YKICAgT3BlblNTTC4gTm93IHdoeSBjb3VsZG4ndCB0aGV5IHNpbXBseSBhZGQgYSAqbmV3KiBmdW5jdGlvbiBpbnN0ZWFkIG9mCiAgIG1vZGlmeWluZyB0aGUgcGFyYW1ldGVycyBvZiBhbiBhbHJlYWR5IGV4aXN0aW5nIGZ1bmN0aW9uPyBUaGlzIHdheSwgd2UgZ2V0CiAgIGEgY29tcGlsZXIgd2FybmluZyBpZiBjb21waWxpbmcgd2l0aCAwLjkuNCBidXQgbm90IHdpdGggZWFybGllci4gU28sIEkgaGFkCiAgIHRvIGNvbWUgdXAgd2l0aCBhICNpZiBjb250cnVjdGlvbiB0aGF0IGRlYWxzIHdpdGggdGhpcy4uLgoKIC0gTWFkZSBjdXJsIG91dHB1dCB0aGUgU1NMIHZlcnNpb24gbnVtYmVyIGdldCBkaXNwbGF5ZWQgcHJvcGVybHkgd2l0aCAwLjkuNC4KCiBUcm95ICgxMiBBdWd1c3QgMTk5OSkKIC0gQWRkZWQgTWluZ1czMiAoR0NDLTIuOTUpIHN1cHBvcnQgdW5kZXIgV2luMzIuIFRoZSBJTlNUQUxMIGZpbGUgd2FzIGFsc28KICAgYSBiaXQgcmVhcnJhbmdlZC4KIAogRGFuaWVsICgxMiBBdWd1c3QgMTk5OSkKIC0gSSBoYWQgdG8gY29weSBhIGdvb2QgPGFycGEvdGVsbmV0Lmg+IGluY2x1ZGUgZmlsZSBpbnRvIHRoZSBjdXJsIHNvdXJjZQogICB0cmVlIHRvIGVuYWJsZSB0aGUgc2lsbHkgd2luMzIgc3lzdGVtcyB0byBjb21waWxlLiBUaGUgZGlzdHJpYnV0aW9uIHJpZ2h0cwogICBhbGxvd3MgdXMgdG8gZG8gdGhhdCBhcyBsb25nIGFzIHRoZSBmaWxlIHJlbWFpbnMgdW5tb2RpZmllZC4KCiAtIEkgY29ycmVjdGVkIGEgZmV3IG1pbm9yIHRoaW5ncyB0aGF0IG1hZGUgdGhlIGNvbXBpbGVyIGNvbXBsYWluIHdoZW4KICAgLVdhbGwgLXBlZGFudGljIHdhcyB1c2VkLgoKIC0gSSdtIG1vdmluZyB0aGUgb2ZmaWNpYWwgY3VybCB3ZWIgcGFnZSB0byBodHRwOi8vY3VybC5oYXh4Lm51LiBJIHRoaW5rIGl0CiAgIHdpbGwgbWFrZSBpdCBlYXNpZXIgdG8gcmVtZW1iZXIgYXMgaXQgaXMgYSBsb3Qgc2hvcnRlciBhbmQgbGVzcyBjcnlwdGljLgogICBUaGUgb2xkIG9uZSBzdGlsbCB3b3JrcyBhbmQgc2hvd3MgdGhlIHNhbWUgaW5mby4KCiBEYW5pZWwgKDExIEF1Z3VzdCAxOTk5KQogLSBBbGJlcnQgQ2hpbi1BLVlvdW5nIG1haWxlZCBtZSBhbm90aGVyIGNvcnJlY3Rpb24gZm9yIE5ST0ZGIGluIHRoZQogICBjb25maWd1cmUuaW4gdGhhdCBpcyBzdXBwb3NlZCB0byBiZSBiZXR0ZXIgZm9yIElSSVggdXNlcnMuCgogRGFuaWVsICgxMCBBdWd1c3QgMTk5OSkKIC0gQWxiZXJ0IENoaW4tQS1Zb3VuZyA8Y2hpbmFAdGhld3JpdHRlbndvcmQuY29tPiBoZWxwZWQgbWUgd2l0aCBzb21lIHN0dXBpZAogICBNYWtlZmlsZSB0aGluZ3MsIGFzIHdlbGwgYXMgc29tZSBmaWRkbGluZyB3aXRoIHRoZSBnZXRkYXRlLmMKICAgc3R1ZmYgdGhhdCBoZSBoYWQgcHJvYmxlbXMgd2l0aCB1bmRlciBIUC1VWCB2MTAuIGdldGRhdGUueSB3aWxsIG5vdyBiZQogICBjb21waWxlZCBpbnRvIGdldGRhdGUuYyBpZiB0aGUgYXBwcm9wcmlhdGUgeWFjYyBvciBiaXNvbiBpcyBmb3VuZCBieSB0aGUKICAgY29uZmlndXJlIHNjcmlwdC4gU2luY2UgdGhpcyBpcyBzbGlnaHRseSBuZXcsIHdlIG5lZWQgdG8gdGVzdCB0aGUgb3V0cHV0CiAgIGdldGRhdGUuYyB3aXRoIHdpbjMyIHN5c3RlbXMgdG8gbWFrZSBzdXJlIGl0IHN0aWxsIGNvbXBpbGVzIHRoZXJlLgoKIERhbmllbCAoNSBBdWd1c3QgMTk5OSkKIC0gSSd2ZSBqdXN0IHNldHVwIGEgbmV3IG1haWxpbmcgbGlzdCB3aXRoIHRoZSBpbnRlbnRpb24gdG8ga2VlcCBkaXNjdXNzaW9ucwogICBhcm91bmQgbGliY3VybCBkZXZlbG9wbWVudCBpbiBpdC4gSSBtYWlubHkgZXhwZWN0IGl0IHRvIGJlIGZvciB0aG91Z2h0cyBhbmQKICAgYnJhaW5zdG9ybWluZyBhcm91bmQgYSAibmV4dCBnZW5lcmF0aW9uIiBsaWJyYXJ5LCByYXRoZXIgdGhhbiBuaXRwaWNraW5nCiAgIGFib3V0IHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9yIGRldGFpbHMgaW4gdGhlIGN1cnJlbnQgbGliY3VybC4KCiAgIFRvIGpvaW4gb3VyIGhhcHB5IGJ1bmNoIG9mIGZ1dHVyZS1sb29raW5nIGdlZWtzLCBlbnRlciAnc3Vic2NyaWJlCiAgIDxhZGRyZXNzPicgaW4gdGhlIGJvZHkgb2YgYSBtYWlsIGFuZCBzZW5kIGl0IHRvCiAgIGxpYmN1cmwtcmVxdWVzdEBsaXN0c2Vydi5mdHMuZnJvbnRlYy5zZS4gIEN1cmwgYnVnIHJlcG9ydHMsIHRoZSB1c3VhbCBjdXJsCiAgIHRhbGsgYW5kIGV2ZXJ5dGhpbmcgZWxzZSBzaG91bGQgc3RpbGwgYmUga2VwdCBpbiB0aGlzIG1haWxpbmcgbGlzdC4gSSd2ZQogICBzdGFydGVkIHRvIGFyY2hpdmUgdGhpcyBtYWlsaW5nIGxpc3QgYW5kIGhhdmUgcHV0IHRoZSBsaWJjdXJsIHdlYiBwYWdlIGF0CiAgIHd3dy5mdHMuZnJvbnRlYy5zZS9+ZGFzdC9saWJjdXJsLy4KCiAtIFN0ZWZhbiBLYW50aGFrIDxTdGVmYW4uS2FudGhha0BtY2hwLnNpZW1lbnMuZGU+IGNvbnRhY3RlZCBtZSByZWdhcmRpbmcgYQogICBmZXcgcHJvYmxlbXMgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgd2hpY2ggaGUgZGlzY292ZXJlZCB3aGVuIHRyeWluZyB0bwogICBtYWtlIGN1cmwgY29tcGlsZSBhbmQgYnVpbGQgdW5kZXIgU2llbWVucyBTSU5JWC1aIFY1LjQyQjIwMDQhCgogLSBNYXJjdXMgS2xlaW4gPG0ua2xlaW5AaW4tb2xwZS5kZT4gdmVyeSBhY2N1cmF0ZWx5IGluZm9ybWVkIG1lIHRoYXQKICAgc3JjL3ZlcnNpb24uaCB3YXMgbm90IHByZXNlbnQgaW4gdGhlIENWUyByZXBvc2l0b3J5LiBPaCwgaG93IHNpbGx5Li4uCgogLSBMaW51cyBOaWVsc2VuIDxMaW51cy5OaWVsc2VuQHN0aC5mcm9udGVjLnNlPiByZXdyb3RlIHRoZSB0ZWxuZXQ6Ly8gcGFydCBhbmQKICAgbm93IGN1cmwgb2ZmZXJzIGxpbWl0ZWQgdGVsbmV0IHN1cHBvcnQuIElmIHlvdSBydW4gY3VybCBsaWtlICdjdXJsCiAgIHRlbG5ldDovL2hvc3QnIHlvdSdsbCBnZXQgYWxsIG91dHB1dCBvbiB0aGUgc2NyZWVuIGFuZCBjdXJsIHdpbGwgcmVhZCBpbnB1dAogICBmcm9tIHN0ZGluLiBZb3UnbGwgYmUgYWJsZSB0byBsb2dpbiBhbmQgcnVuIGNvbW1hbmRzIGV0YywgYnV0IHNpbmNlIHRoZQogICBvdXRwdXQgaXMgYnVmZmVyZWQsIGV4cGVjdCB0byBnZXQgYSBsaXR0bGUgd2VpcmQgb3V0cHV0LgoKICAgVGhpcyBpcyBzdGlsbCBpbiBpdHMgaW5mYW5jeSBhbmQgaXQgbWlnaHQgZ2V0IGNoYW5nZWQuIFdlIG5lZWQgeW91cgogICBmZWVkLWJhY2sgYW5kIGlucHV0IGluIGhvdyB0aGlzIGlzIGJlc3QgZG9uZS4KCiAgIFdJTjMyIE5PVEU6IEkgYmV0IHdlJ2xsIGdldCBwcm9ibGVtcyB3aGVuIHRyeWluZyB0byBjb21waWxlIHRoZSBjdXJyZW50CiAgIGxpYi90ZWxuZXQuYyBvbiB3aW4zMiwgYnV0IEkgdGhpbmsgd2UgY2FuIHNvcnQgdGhlbSBvdXQgaW4gdGltZS4KCiAtIERhdmlkIFNhbmRlcnNvbiA8ZGF2aWRAdHJhbnNhcmMuY29tPiByZXBvcnRlZCB0aGF0IEZPUkNFX0FMTE9DQV9IIG9yCiAgIEhBVkVfQUxMT0NBX0ggbXVzdCBiZSBkZWZpbmVkIGZvciBnZXRkYXRlLmMgdG8gY29tcGlsZSBwcm9wZXJseSBvbiBIUC1VWAogICAxMS4wLiBJIHVwZGF0ZWQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gY2hlY2sgZm9yIGFsbG9jYS5oIHdoaWNoIHNob3VsZAogICBtYWtlIGl0LgoKIERhbmllbCAoNCBBdWd1c3QgMTk5OSkKIC0gSSBmaW5hbGx5IGdvdCB0byB1bmRlcnN0YW5kIE1hcmN1cyBLbGVpbidzIGZ0cCBkb3dubG9hZCByZXN1bWUgcHJvYmxlbSwKICAgd2hpY2ggdHVybnMgb3V0IHRvIGJlIGR1ZSB0byBkaWZmZXJlbnQgb3V0cHV0cyBmcm9tIGRpZmZlcmVudCBmdHAKICAgc2VydmVycy4gSXQgbWFrZXMgZnRwIGRvd25sb2FkIHJlc3VtaW5nIGEgbGl0dGxlIHRyaWNraWVyLCBidXQgSSd2ZSBtYWRlCiAgIHNvbWUgbW9kaWZpY2F0aW9ucyBJIHJlYWxseSBiZWxpZXZlIHdpbGwgd29yayBmb3IgbW9zdCBmdHAgc2VydmVycyBhbmQgSSBkbwogICBob3BlIHlvdSByZXBvcnQgaWYgeW91IGhhdmUgcHJvYmxlbXMgd2l0aCB0aGlzIQoKIC0gQWRkZWQgdGV4dCBhYm91dCBmaWxlIHRyYW5zZmVyIHJlc3VtaW5nIHRvIFJFQURNRS5jdXJsLgoKIERhbmllbCAoMiBBdWd1c3QgMTk5OSkKIC0gQXBwbGllZCBhIHByb2dyZXNzLWJhciBwYXRjaCBmcm9tIExhcnMgSi4gQWFzIDxsYXJzYUBzaW0ubm8+LiBJdCBvZmZlcnMKICAgYSBuZXcgc3R5bGVkIHByb2dyZXNzIGJhciBlbmFibGVkIHdpdGggLSMvLS1wcm9ncmVzcy1iYXIuIAoKIFQuIFlhbWFkYSA8dGFpQGltYXN5Lm9yLmpwPiAoMzAgSnVseSAxOTk5KQogLSBJdCBicmVha3Mgd2l0aCBzZWdmYXVsdCB3aGVuIDEpIGN1cmwgaXMgdXNpbmcgLm5ldHJjIHRvIG9idGFpbgogICB1c2VybmFtZS9wYXNzd29yZCAob3B0aW9uICctbicpLCBhbmQgMikgaXMgYXV0by1tYXRpY2FsbHkgcmVkaXJlY3RlZCB0bwogICBhbm90aGVyIGxvY2F0aW9uIChvcHRpb24gJy1MJykuCgogICBUaGVyZSBpcyBhIHNtYWxsIGJ1ZyBpbiBsaWIvdXJsLmMgKGJsb2NrIHN0YXJ0aW5nIGZyb20gbGluZSA2NDEpLCB3aGljaAogICB0cmllcyB0byB0YWtlIG91dCB1c2VybmFtZS9wYXNzd29yZCBmcm9tIHVzZXItIHN1cHBsaWVkIGNvbW1hbmQtbGluZQogICBhcmd1bWVudCAoJy11JyBvcHRpb24pLiBUaGlzIGJsb2NrIGlzIG5ldmVyIGV4ZWN1dGVkIG9uIGZpcnN0IGF0dGVtcHQgc2luY2UKICAgQ09ORl9VU0VSUFdEIGJpdCBpc24ndCBzZXQgYXQgZmlyc3QsIGJ1dCBjdXJsIGxhdGVyIHR1cm5zIGl0IG9uIHdoZW4gaXQKICAgY2hlY2tzIGZvciBDT05GX05FVFJDIGJpdC4gU28gd2hlbiBjdXJsIHRyaWVzIHRvIHJlZG8gZXZlcnl0aGluZyBkdWUgdG8KICAgcmVkaXJlY3Rpb24sIGl0IHNlZ2ZhdWx0cyB0cnlpbmcgdG8gYWNjZXNzICpkYXRhLT51c2VycHdkLgoKVmVyc2lvbiA1LjkuMQoKIERhbmllbCAoMzAgSnVseSAxOTk5KQogLSBTdGV2ZSBXYWxjaCA8c3dhbGNoQGNpc29mdC5jb20+IHBvaW50ZWQgb3V0IHRoYXQgdGhlcmUgaXMgYSBtZW1vcnkgbGVhayBpbgogICB0aGUgZm9ybWRhdGEgZnVuY3Rpb25zLiBJIGFkZGVkIGEgRm9ybUZyZWUoKSBmdW5jdGlvbiB0aGF0IGlzIG5vdyB1c2VkIGFuZAogICBzdXBwb3NlZCB0byBjb3JyZWN0IHRoaXMgZmxhdy4KCiAtIE1hcmsgV290dG9uIDxtd290dG9uQGJsYWNrLnVnLmNzLnVzeWQuZWR1LmF1PiByZXBvcnRlZDoKICAgJ2N1cmwgLUwgaHR0cHM6Ly93d3cuY3dhLmNvbS5hdS8nIGNvcmUgZHVtcHMuICBJIG1hbmFnZWQgdG8gY3VyZSB0aGlzIGJ5CiAgIGNvcnJlY3RpbmcgdGhlIGNsZWFudXAgcHJvY2VkdXJlLiBUaGUgYnVnIHNlZW1zIHRvIGJlIGdvbmUgd2l0aCBteSBPcGVuU1NMCiAgIDAuOS4yYiwgYWx0aG91Z2ggc3RpbGwgb2NjdXJzIHdoZW4gSSBydW4gdGhlIH4xMDAgeWVhcnMgb2xkIFNTTGVheSAwLjguMC4gSQogICBkb24ndCBrbm93IHdoZXRoZXIgaXQgaXMgY3VybCBvciBTU0xlYXkgdGhhdCBpcyB0byBibGFtZSBmb3IgdGhhdC4KCiAtIE1hcmN1cyBLbGVpbiA8bS5rbGVpbkBpbi1vbHBlLmRlPjoKICAgUmVwb3J0ZWQgYW4gRlRQIHVwbG9hZCByZXN1bWUgYnVnIHRoYXQgSSByZWFsbHkgY2FuJ3QgcmVwZWF0IG5vciB1bmRlcnN0YW5kLgogICBJIGxlYXZlIGl0IGhlcmUgc28gdGhhdCBpdCB3b24ndCBiZSBmb3Jnb3R0ZW4uCgogRGFuaWVsICgyOSBKdWx5IDE5OTkpCiAtIENvc3R5YSBTaHVseXVwaW4gPGNvc3R5YUB0cml2bmV0LmNvbT4gc3VnZ2VzdGVkIHN1cHBvcnQgZm9yIGxvbmdlciBVUkxzCiAgIHdoZW4gZm9sbG93aW5nIExvY2F0aW9uOiBhbmQgSSBjb3VsZCBvbmx5IGFncmVlIGFuZCBmaXggaXQhCgogLSBMZWlnaCBQdXJkaWUgPGxlaWdocEBkZWZjZW4uZ292LmF1PiBmb3VuZCBhIHByb2JsZW0gaW4gdGhlIHVwbG9hZC9QT1NUCiAgIGRlcGFydG1lbnQuIEl0IHR1cm5lZCBvdXQgdGhhdCBodHRwLmMgYWNjaWRlbnRhbHkgY2xlYXJlZCB0aGUgcG9pbnRlcgogICBpbnN0ZWFkIG9mIHRoZSBieXRlIGNvdW50ZXIgd2hlbiBzdXBwb3NlZCB0by4KCiAtIENvc3R5YSBTaHVseXVwaW4gPGNvc3R5YUB0cml2bmV0LmNvbT4gcG9pbnRlZCBvdXQgYSBwcm9ibGVtIHdpdGggcG9ydAogICBudW1iZXJzIGFuZCBMb2NhdGlvbjouIElmIHlvdSBoYWQgYSBzZXJ2ZXIgYXQgYSBub24tc3RhbmRhcmQgcG9ydCB0aGF0CiAgIHJlZGlyZWN0ZWQgdG8gYW4gVVJMIHVzaW5nIGEgc3RhbmRhcmQgcG9ydCBudW1iZXIsIGN1cmwgc3RpbGwgdXNlZCB0aGF0CiAgIGZpcnN0IHBvcnQgbnVtYmVyLgoKIC0gUmFscGggQmVja21hbm4gPHJhYmVAdW5pLXBhZGVyYm9ybi5kZT4gcG9pbnRlZCBvdXQgYSBwcm9ibGVtIHdoZW4gdXNpbmcgYm90aAogICBDT05GX0ZPTExPV0xPQ0FUSU9OIGFuZCBDT05GX0ZBSUxPTkVSUk9SIHNpbXVsdGFuZW91c2x5LiBTaW5jZSB0aGUKICAgQ09ORl9GQUlMT05FUlJPUiBleGl0cyBvbiB0aGUgMzAyLWNvZGUgdGhhdCB0aGUgZm9sbG93IGxvY2F0aW9uIGhlYWRlcgogICBvdXRwdXRzIGl0IHdpbGwgbmV2ZXIgc2hvdyBhbnkgaHRtbCBvbiBsb2NhdGlvbjogcGFnZXMuIEkgaGF2ZSBub3cgbWFkZSBpdAogICBsb29rIGZvciA+PTQwMCBjb2RlcyBpZiBDT05GX0ZPTExPV0xPQ0FUSU9OIGlzIHNldC4KCiAtICdzdHJ1Y3Qgc2xpc3QnIGlzIG5vdyByZW5hbWVkIHRvICdzdHJ1Y3QgY3VybF9zbGlzdCcgKGFzIHN1Z2dlc3RlZCBieSBSYWxwaAogICBCZWNrbWFubikuCgogLSBKb3NodWEgU3dpbmsgPGpwc3dpbmtAaG90bWFpbC5jb20+IGFuZCBSaWNrIFdlbHlrb2NoeSA8cmlja0BwcmF4aXMuY29tLmF1PgogICB3ZXJlIHRoZSBmaXJzdCB0byBwb2ludCBvdXQgdG8gbWUgdGhhdCB0aGUgbGF0ZXN0IE9wZW5TU0wgcGFja2FnZSBub3cgaGF2ZQogICBtb3ZlZCB0aGUgc3RhbmRhcmQgaW5jbHVkZSBwYXRoLiBJdCBpcyBub3cgaW4KICAgL3Vzci9sb2NhbC9zc2wvaW5jbHVkZS9vcGVuc3NsIGFuZCBJIGhhdmUgbm93IG1vZGlmaWVkIHRoZSAtLWVuYWJsZS1zc2wKICAgb3B0aW9uIGZvciB0aGUgY29uZmlndXJlIHNjcmlwdCB0byB1c2UgdGhhdCBhcyB0aGUgcHJpbWFyeSBwYXRoLCBhbmQgSQogICBsZWF2ZSB0aGUgZm9ybWVyIHBhdGggdG9vIHRvIHdvcmsgd2l0aCBvbGRlciBwYWNrYWdlcyBvZiBPcGVuU1NMIHRvby4KCiBEYW5pZWwgKDkgSnVuZSAxOTk5KQogLSBJIGZpbmFsbHkgdW5kZXJzdG9vZCB0aGUgSVJJWCBwcm9ibGVtIGFuZCBub3cgaXQgc2VlbSB0byBjb21waWxlIG9uIGl0IQogICBJIGFtIGdvbm5hIHJlbW92ZSB0aG9zZSAjZGVmaW5lIHN0cmNhc2VjbXAoKSB0aGluZ3Mgb25jZSBhbmQgZm9yIGFsbCBub3cuCgogRGFuaWVsICg0IEp1bmUgMTk5OSkKIC0gSSBhZGp1c3RlZCB0aGUgRlRQIHJlcGx5IDIyNyBwYXJzZXIgdG8gbWFrZSB0aGUgUEFTViBjb21tYW5kIHdvcmsgYmV0dGVyCiAgIHdpdGggbW9yZSBmdHAgc2VydmVycy4gQXBwZWFyYW50bHkgdGhlIFJveGVuIENoYWxsYW5nZXIgc2VydmVyIHJlcGxpZWQKICAgc29tZXRoaW5nIGN1cmwgNS45IGNvdWxkIGRlYWwgd2l0aCEgOi0oIFJlcG9ydGVkIGJ5IEFzaGxleSBSZWlkLU1vbnRhbmFybwogICA8YXNobGV5QGNvbXBzb2MubWFuLmFjLnVrPiBhbmQgTWFyayBCdXRsZXIgPGJ1dGxlcm1AeG1pc3Npb24uY29tPiBicm91Z2h0IGEKICAgc29sdXRpb24gZm9yIGl0LgoKIERhbmllbCAoMjYgTWF5IDE5OTkpCiAtIFJlYXJyYW5nZWQuIFJFQURNRSBpcyBuZXcsIHRoZSBvbGQgb25lIGlzIG5vdyBSRUFETUUuY3VybCBhbmQgSSBhZGRlZCBhCiAgIFJFQURNRS5saWJjdXJsIHdpdGggdGV4dCBJIGdvdCBmcm9tIFJhbHBoIEJlY2ttYW5uIDxyYWJlQHVuaS1wYWRlcmJvcm4uZGU+LgoKIC0gSSBhbHNvIHVwZGF0ZWQgdGhlIElOU1RBTEwgdGV4dC4KCiBEYW5pZWwgKDI1IE1heSAxOTk5KQogLSBEYXZpZCBKb25hdGhhbiBMb3dza3kgPGRsb3dza3lAbGVsYW5kLnN0YW5mb3JkLmVkdT4gY29ycmVjdGx5IHBvaW50ZWQgb3V0CiAgIHRoYXQgY3VybCBkaWRuJ3QgcHJvcGVybHkgZGVhbCB3aXRoIGZvcm0gcG9zdGluZyB3aGVyZSB0aGUgdmFyaWFibGUgCiAgIHNob3VsZG4ndCBoYXZlIGFueSBjb250ZW50LCBhcyBpbiBjdXJsIC1GICJmb3JtPSIgd3d3LnNpdGUuY29tLiBJdCB3YXMKICAgbm93IGZpeGVkLgoKVmVyc2lvbiA1LjkKCiBEYW5pZWwgKDIyIE1heSAxOTk5KQogLSBJJ3ZlIGdvdCBhIGJ1ZyByZXBvcnQgZnJvbSBBYXJvbiBTY2FyaXNicmljayA8YWFyb25zY2FAaG90bWFpbC5jb20+IGluCiAgIHdoaWNoIGhlIHN0YXRlcyBoZSBoYXMgc29tZSBwcm9ibGVtcyB3aXRoIC1MIHVuZGVyIEZyZWVCU0QgMy4wLiBJIGhhdmUKICAgcHJldmlvdXNseSBnb3QgYW5vdGhlciBidWcgcmVwb3J0IGZyb20gU3RlZmFuIEdyZXRoZXIKICAgPHN0ZWZhbi5ncmV0aGVyQHVicy5jb20+IHdoaWNoIHBvaW50cyBhdCBhbiBlcnJvciB3aXRoIHNpbWlsYXIgc3ltcHRob21zCiAgIHdoZW4gdXNpbmcgd2luMzIuIEkgbWFkZSB0aGUgYWxsb2NhdGlvbiBvZiB0aGUgbmV3IHVybCBzdHJpbmcgYSBiaXQgZmFzdGVyCiAgIGFuZCBkaWZmZXJlbnQsIGRvbid0IGtub3cgaWYgaXQgYWN0dWFsbHkgaW1wcm92ZXMgYW55dGhpbmcgdGhvdWdoLi4uCgogRGFuaWVsICgyMCBNYXkgMTk5OSkKIC0gTWFkZSB0aGUgY29va2llIHBhcnNlciBkZWFsIHdpdGggQ1JMRiBuZXdsaW5lcyB0b28uCgogRGFuaWVsICgxOSBNYXkgMTk5OSkKIC0gRG93bmxvYWQoKSBkaWRuJ3QgcHJvcGVybHkgZGVhbCB3aXRoIGZhaWxpbmcgcmV0dXJuIGNvZGVzIGZyb20gdGhlCiAgIHNyZWFkKCkgZnVuY3Rpb24uIEFkYW0gQ295bmUgPGFkYW1AZ2FtZXNweS5jb20+IGZvdW5kIHRoZSBwcm9ibGVtIGluIHRoZQogICB3aW4zMiB2ZXJzaW9uLCBhbmQgVHJveSBFbmdlbCBoZWxwZWQgbWUgb3V0IGlzb2xhdGluZyBpdC4KCiBEYW5pZWwgKDE2IE1heSAxOTk5KQogLSBSaWNoYXJkIEFkYW1zIDxSaWNoYXJkQFNsYXlmb3JkLmNvbT4gcG9pbnRlZCBvdXQgYSBidWcgSSBpbnRyb2R1Y2VkIGluCiAgIDUuOC4gLS1kdW1wLWhlYWRlciBkb2Vzbid0IHdvcmsgYW55bW9yZSEgOi0vIEkgZml4ZWQgaXQgbm93LgoKIC0gQWZ0ZXIgYSBzdWdnZXN0aW9uIGJ5IEpvc2h1YSBTd2luayA8anBzd2lua0Bob3RtYWlsLmNvbT4gSSBhZGRlZCAtUyAvCiAgIC0tc2hvdy1lcnJvciB0byBmb3JjZSBjdXJsIHRvIGRpc3BsYXkgdGhlIGVycm9yIG1lc3NhZ2UgaW4gY2FzZSBvZiBhbgogICBlcnJvciwgZXZlbiBpZiAtcy8tLXNpbGVudCB3YXMgdXNlZC4KCiBEYW5pZWwgKDEwIE1heSAxOTk5KQogLSBJIG1vdmVkIHRoZSBzdHVmZiBjb25jZXJuaW5nIEhUVFAsIERJQ1QgYW5kIFRFTE5FVCBpdCB0aGVpciBvd24gc291cmNlCiAgIGZpbGVzIG5vdy4gSXQgaXMgYSBiZWdpbm5pbmcgb24gbXkgY2xlYW4tdXAgb2YgdGhlIHNvdXJjZXMgdG8gbWFrZSB0aGVtCiAgIGxheWVyIGFsbCB0aG9zZSBwcm90b2NvbHMgYmV0dGVyIHRvIGVuYWJsZSBtb3JlIHRvIGJlIGFkZGVkIGVhc2llciBpbiB0aGUKICAgZnV0dXJlIQoKIC0gTGVvbiBCcmVlZHQgPGxqYkBkZWJpYW4ub3JnPiBzZW50IG1lIHNvbWUgZmlsZXMgSSd2ZSBub3QgcHV0IGludG8gdGhlIG1haW4KICAgY3VybCBhcmNoaXZlLiBUaGV5J3JlIGZvciBjcmVhdGluZyB0aGUgRGViaWFuIHBhY2thZ2UgdGhpbmdpZS4gSGUgYWxzbyBzZW50CiAgIG1lIGEgZGViaWFuIHBhY2thZ2UgdGhhdCBJJ3ZlIG1hZGUgYXZhaWxhYmxlIGZvciBkb3dubG9hZCBhdCB0aGUgd2ViIHBhZ2UKCiBEYW5pZWwgKDkgTWF5IDE5OTkpCiAtIE1hZGUgaXQgY29tcGlsZSBvbiBjeWd3aW4gdG9vLgoKIFRyb3kgRW5nZWwgKDcgTWF5IDE5OTkpCiAtIEJyb3VnaHQgYSBzZXJpZXMgb2YgcGF0Y2hlcyB0byBhbGxvdyBjdXJsIHRvIGNvbXBpbGUgc21vb3RobHkgb24gTVNWQysrIDYKICAgYWdhaW4hCgogRGFuaWVsICg2IE1heSAxOTk5KQogLSBJIGNoYW5nZWQgdGhlICNpZmRlZiBIQVZFX1NUUkZUSU1FIHBsYWNlbWVudCBmb3IgdGhlIC16IGNvZGUgc28gdGhhdCBpdAogICB3aWxsIGJlIGVhc2llciB0byBkaXNjb3ZlciBzeXN0ZW1zIHRoYXQgZG9uJ3QgaGF2ZSB0aGF0IGZ1bmN0aW9uIGFuZCB0aHVzCiAgIGNhbid0IHVzZSAteiBzdWNjZXNzZnVsbHkuIE1hZGUgdGhlIHN0cmZ0aW1lKCkgZ2V0IHVzZWQgaWYgV0lOMzIgaXMgZGVmaW5lZAogICB0b28uCgpWZXJzaW9uIDUuOAoKIERhbmllbCAoNSBNYXkgMTk5OSkKIC0gSSd2ZSBoYWQgaXQgd2l0aCB0aGlzIGF1dG9jb25mL2F1dG9tYWtlIG1lc3MuIEl0IHNlZW1zIHRvIHdvcmsgYWxscmlnaHQKICAgZm9yIG1vc3QgcGVvcGxlIHdobyBkb24ndCBoYXZlIGF1dG9tYWtlIGluc3RhbGxlZCwgYnV0IGZvciB0aG9zZSB3aG8gaGF2ZQogICB0aGVyZSBhcmUgcHJvYmxlbXMgYWxsIG92ZXIuCgogICBJJ3ZlIGdvdCBsaWtlIGZpdmUgZGlmZmVyZW50IGJ1ZyByZXBvcnRzIG9uIHRoaXMgb25seSB0aGUgbGFzdAogICB3ZWVrLi4uIENsYXVkaW8gTmV2ZXMgPGNsYXVkaW9AbmV4dGlzLmNvbT4gYW5kIEZlZGVyaWNvIEJpYW5jaGkKICAgPGJpYW5jaGlAcGMtYXJ0ZTIuYXJ0ZS51bmlwaS5pdD4gYW5kIHJvb3QgPGR1Z2dlcmowMDFAaGF3YWlpLnJyLmNvbT4gYXJlCiAgIHNvbWUgb2YgdGhlbSByZXBvcnRpbmcgdGhpcy4KCiAgIEN1cnJlbnRseSwgSSBoYXZlIG5vIHJlYWxseSBnb29kIGZpeCBzaW5jZSBJIHdhbnQgdG8gdXNlIGF1dG9tYWtlIG15c2VsZiB0bwogICBnZW5lcmF0ZSB0aGUgTWFrZWZpbGUuaW4gZmlsZXMuIEkndmUgZm91bmQgb3V0IHRoYXQgdGhlIEBTSEVMTEAtcHJvYmxlbXMKICAgY2FuIG9mdGVuIGJlIGZpeGVkIGJ5IG1hbnVhbGx5IGludm9raW5nICdhdXRvbWFrZScgaW4gdGhlIGFyY2hpdmUgcm9vdAogICBiZWZvcmUgeW91IHJ1biAuL2NvbmZpZ3VyZS4uLiBJJ3ZlIGhhY2tlZCBteSBtYWtldGd6IHNjcmlwdCBub3cgdG8gZmlkZGxlCiAgIGEgYml0IHdpdGggdGhpcyBhbmQgbXkgdGVzdHMgc2VlbSB0byB3b3JrIGJldHRlciB0aGFuIGJlZm9yZSBhdCBsZWFzdCEKCiBEYW5pZWwgKDQgTWF5IDE5OTkpCiAtIG1raGVscC5wbCBoYXMgYmVlbiBkb2luZyBiYWRseSBsYXRlbHkuIEkgY29ycmVjdGVkIGEgY2FzZSBwcm9ibGVtIGluCiAgIHRoZSByZWdleGVzLgoKIC0gSSd2ZSBub3cgcmVtYWRlIHRoZSAtbyBvcHRpb24gdG8gbm90IHRvdWNoIHRoZSBmaWxlIHVubGVzcyBpdCBuZWVkcyB0by4KICAgSSBoYWQgdG8gZG8gdGhpcyB0byBtYWtlIC16IG9wdGlvbiByZWFsbHkgZmluZSwgc2luY2Ugbm93IHlvdSBjYW4gbWFrZSBhCiAgIGN1cmwgZmV0Y2ggYW5kIHVzZSBhIGxvY2FsIGNvcHkncyB0aW1lIHdoZW4gZG93bmxvYWRpbmcgdG8gdGhhdCBmaWxlLCBhcwogICBpbjoKCiAgICAgICAgY3VybCAteiBkdW1wIC1vIGR1bXAgcmVtb3RlLnNpdGUuY29tL2ZpbGUuaHRtbAoKICAgVGhpcyB3aWxsIG9ubHkgZ2V0IHRoZSBmaWxlIGlmIHRoZSByZW1vdGUgb25lIGlzIG5ld2VyIHRoYW4gdGhlIGxvY2FsLgogICBJJ20gYXdhcmUgdGhhdCB0aGlzIGFsdGVycyBwcmV2aW91cyBiZWhhdmlvdXIgYSBsaXR0bGUuIFNvbWUgc2NyaXB0cyBvdXQKICAgdGhlcmUgbWF5IGRlcGVuZCBvbiB0aGF0IHRoZSBmaWxlIGlzIGFsd2F5cyB0b3VjaGVkLi4uCgogLSBDb3JyZWN0ZWQgYSBidWcgaW4gdGhlIFNTTHYyL3YzIHNlbGVjdGlvbi4KCiAtIEZlbGl4IHZvbiBMZWl0bmVyIDxsZWl0bmVyQG1hdGguZnUtYmVybGluLmRlPiByZXF1ZXN0ZWQgdGhhdCBjdXJsIHNob3VsZAogICBiZSBhYmxlIHRvIHNlbmQgIklmLU1vZGlmaWVkLVNpbmNlIiBoZWFkZXJzLCB3aGljaCBpbmRlZWQgaXMgYSBmYWlyIGlkZWEuCiAgIEkgaW1wbGVtZW50ZWQgaXQgcmlnaHQgYXdheSEgVHJ5IC16IDxleHByZXNzaW9uPiB3aGVyZSBleHByZXNzaW9uIGlzIGEgZnVsbAogICBHTlUgZGF0ZSBleHByZXNzaW9uIG9yIGEgZmlsZSBuYW1lIHRvIGdldCB0aGUgZGF0ZSBmcm9tIQoKIFN0ZXBoYW4gTGFnZXJob2xtIDxzdGVwaGFuQHVuaWxvZy5zZT4gKDMwIEFwciAxOTk5KQogLSBQb2ludGVkIG91dCBhIHByb2JsZW0gd2l0aCB0aGUgc3JjL01ha2VmaWxlIGZvciBGcmVlQlNELiBUaGUgUk0gdmFyaWFibGUKICAgaXNuJ3Qgc2V0IGFuZCBjYXVzZXMgdGhlIG1ha2UgdG8gZmFpbC4KCiBEYW5pZWwgKDI2IEFwcmlsIDE5OTkpCiAtIEFtIEkgc2lsbHkgb3Igd2hhdD8gPElydmluZ19Xb2xmZUB3b2xmZS5uZXQ+IHBvaW50ZWQgb3V0IHRvIG1lIHRoYXQgdGhlCiAgIGN1cmwgdmVyc2lvbiBudW1iZXIgd2FzIG5vdCBzZXQgcHJvcGVybHkuIEhhc24ndCBiZWVuIHNpbmNlIDUuNi4gVGhpcyB3YXMKICAgZHVlIHRvIGEgYnVnIGluIG15IG1ha2V0Z3ogc2NyaXB0IQoKIERhdmlkIEVyaWtzc29uIDxkYXZpZEAyZ29vZC5jb20+ICgyNSBBcHIgMTk5OSkKIC0gRm91bmQgYSBidWcgaW4gY29va2llcy5jIHRoYXQgbWFkZSBpdCBjcmFzaCBhdCB0aW1lcy4KClZlcnNpb24gNS43LjEKCiBEb3VnIEthdWZtYW4gPGRrYXVmbWFuQHJhaHVsLm5ldD4gKDIzIEFwciAxOTk5KQogLSBCcm91Z2h0IHR3byBzdW5vcyA0IGZpeGVzLiBPbmUgb2YgdGhlbSBiZWluZyB0aGUgaG9zdGlwLmMgZml4IG1lbnRpb25lZAogICBiZWxvdyBhbmQgdGhlIG90aGVyIG9uZSBhIGNvcnJlY3Rpb24gaW4gaW5jbHVkZS9zdGRjaGVhZGVycy5oCgogLSBBZGRlZCBhIHBhcmFncmFwaCBhYm91dCBjb21waWxpbmcgd2l0aCB0aGUgVVMtdmVyc2lvbiBvZiBvcGVuc3NsIHRvIHRoZQogICBJTlNUQUxMIGZpbGUuCgogRGFuaWVsCiAtIE5ldyBtYWlsaW5nIGxpc3QgYWRkcmVzcy4gSW5mbyB1cGRhdGVkIG9uIHRoZSB3ZWIgcGFnZSBhcyB3ZWxsIGFzIGluIHRoZQogICBSRUFETUUgZmlsZQoKIEdyZWcgT251ZmVyIDxHcmVnLk9udWZlckBFbmcuU3VuLkNPTT4gKDIwIEFwciAxOTk5KQogLSBob3N0aXAuYyBkaWRuJ3QgY29tcGlsZSBwcm9wZXJseSBvbiBTdW5PUyA1LjUuMS4KICAgSXQgbmVlZHMgYW4gI2luY2x1ZGUgPHN5cy90eXBlcy5oPgoKVmVyc2lvbiA1LjcKCiBEYW5pZWwgKEFwciAyMCAxOTk5KQogLSBEZWNpZGVkIHRvIHVwbG9hZCBhIG5vbi1iZXRhIHZlcnNpb24gcmlnaHQgbm93IQoKIC0gTWFkZSBjdXJsIHN1cHBvcnQgYW55LWxlbmd0aCBIVFRQIGhlYWRlcnMuIFRoZSBkZXN0aW5hdGlvbiBidWZmZXIgaXMgbm93CiAgIHNpbXBseSBlbmxhcmdlZCBldmVyeSB0aW1lIGl0IHR1cm5zIG91dCB0byBiZSB0b28gc21hbGwhCgogLSBBZGRlZCB0aGUgRkFRIGZpbGUgdG8gdGhlIGFyY2hpdmUuIFN0aWxsIGEgYml0IHNtYWxsaXNoLCBidXQgaXQgaXMgYQogICBzdGFydC4KCiBFcmljIFRoZWxpbiA8ZXJpY0BnZW5lcmF0aW9uLWkuY29tPiAoMTUgQXByIDE5OTkpCiAtIE1hZGUgLUQgYWNjZXB0ICctJyBpbnN0ZWFkIG9mIGZpbGVuYW1lIHRvIHdyaXRlIHRvIHN0ZG91dC4KClZlcnNpb24gNS42LjNiZXRhCgogRGFuaWVsIChBcHIgMTIgMTk5OSkKCiAtIENoYW5nZWQgdHdvICNpZmRlZiBXSU4zMiB0byBiZXR0ZXIgI2lmZGVmIDxlcnJvcmNvZGU+IHdoZW4gY29ubmVjdCgpaW5nCiAgIGluIHVybC5jIGFuZCBmdHAuYy4gTWFrZXMgY3lnd2luMzIgZGVhbCB3aXRoIHRoZW0gYmV0dGVyIHRvby4gV2Ugc2hvdWxkCiAgIHRyeSB0byBnZXQgc29tZSBkZWNlbnQgd2luMzItcmVwbGFjZW1lbnQgdGhlcmUuIEFueW9uZT8KCiAtIFRoZSBvbGQgLTMvLS1jcmxmIG9wdGlvbiBpcyBub3cgT05MWSAtLWNybGYhCgogLSBJIGNoYW5nZWQgdGhlICJTU0wgZml4IiB0byBhIG1vcmUgbGFtZSBvbmUsIGJ1dCB0aGF0IGRvZXNuJ3QgcmVtb3ZlIGFzCiAgIG11Y2ggZnVuY3Rpb25hbGl0eS4gTm93IEkndmUgZW5hYmxlZCB0aGUgbGliIHRvIHNlbGVjdCB3aGF0IFNTTCB2ZXJzaW9uIGl0CiAgIHNob3VsZCB0cnkgZmlyc3QuIEFwcGVhcmFudGx5IHNvbWUgb2xkZXIgU1NMLXNlcnZlcnMgZG9uJ3QgbGlrZSB3aGVuIHlvdQogICB0YWxrIHYzIHdpdGggdGhlbSBzbyB5b3UgbmVlZCB0byBiZSBhYmxlIHRvIGZvcmNlIGN1cmwgdG8gdGFsayB2MiBmcm9tIHRoZQogICBzdGFydC4gVGhlIGZpeCBkYXRlZCBBcHJpbCA2IGFuZCBwb3N0ZWQgb24gdGhlIG1haWxpbmcgbGlzdCBmb3JjZWQgY3VybCB0bwogICB1c2UgdjIgYXQgYWxsIHRpbWVzIHVzaW5nIGEgbW9kZXJuIE9wZW5TU0wgdmVyc2lvbiwgYnV0IHdlIGRvbid0IHJlYWxseQogICB3YW50IHN1Y2ggYSBjcmlwcGxlZCBzb2x1dGlvbi4KIAogLSBNYXJjIEJvdWNoZXIgPG1hcmNAbWJzaS5jYT4gc2VudCBtZSBhIHBhdGNoIHRoYXQgY29ycmVjdGVkIGEgbWF0aCBlcnJvcgogICBmb3IgdGhlICJDdXJyLlNwZWVkIiBwcm9ncmVzcyBtZXRlci4KCiAtIEVyaWMgVGhlbGluIDxlcmljQGdlbmVyYXRpb24taS5jb20+IHNlbnQgbWUgYSBwYXRjaCB0aGF0IGVuYWJsZXMgJy1LIC0nCiAgIHRvIHJlYWQgYSBjb25maWcgZmlsZSBmcm9tIHN0ZGluLgoKIC0gSSBmb3VuZCBvdXQgd2UgZGlkbid0IGNsb3NlIHRoZSBmaWxlIHByb3Blcmx5IGJlZm9yZSBzbyBJIGFkZGVkIGl0IQoKIERhbmllbCAoQXByIDkgMTk5OSkKIC0gWXUgWGluIDxpc0Bpc2VlLnphLm5ldD4gcG9pbnRlZCBvdXQgYSBwcm9ibGVtIHdpdGggZnRwIGRvd25sb2FkIHJlc3VtZS4KICAgSXQgZGlkbid0IHdvcmsgYXQgYWxsISA7LU8KCiBEYW5pZWwgKEFwciA2IDE5OTkpCiAtIENvcnJlY3RlZCB0aGUgdmVyc2lvbiBzdHJpbmcgcGFydCBnZW5lcmF0ZWQgZm9yIHRoZSBTU0wgdmVyc2lvbi4KCiAtIEkgZm91bmQgYSB3YXkgdG8gbWFrZSBzb21lIG90aGVyIFNTTCBwYWdlIHdvcmsgd2l0aCBvcGVuc3NsIDAuOS4xKyB0aGF0CiAgIHByZXZpb3VzbHkgZGlkbid0IChzc2xlYXkgMC44LjAgd29ya3Mgd2l0aCBpdCB0aG91Z2ghKS4gVHJ5aW5nIHRvIGdldAogICBzb21lIHJlYWwgaW5mbyBmcm9tIHRoZSBPcGVuU1NMIGd1eXMgdG8gc2VlIGhvdyBJIHNob3VsZCBkbyB0byBiZWhhdmUgdGhlCiAgIGJlc3Qgd2F5LiBTU0xlYXkgMC44LjAgc2hvdWxkbid0IGJlIHRoYXQgbXVjaCBpbiB1c2UgYW55d2F5IHRoZXNlIGRheXMhCgpWZXJzaW9uIDUuNi4yYmV0YQoKIERhbmllbCAoQXByIDQgMTk5OSkKIC0gRmluYWxseSBoYXZlIGN1cmwgbW9yZSBjb29raWUgImF3YXJlIi4gTm93IHJlYWQgY2FyZWZ1bGx5LiBUaGlzIGlzIGhvdwogICBpdCB3b3Jrcy4KICAgVG8gbWFrZSBjdXJsIHJlYWQgY29va2llcyBmcm9tIGFuIGFscmVhZHkgZXhpc3RpbmcgZmlsZSwgaW4gcGxhaW4gaGVhZGVyLQogICBmb3JtYXQgKGxpa2UgZnJvbSB0aGUgaGVhZGVycyBvZiBhIHByZXZpb3VzIGZldGNoKSBpbnZva2UgY3VybCB3aXRoIHRoZQogICAtYiBmbGFnIGxpa2U6CgogICAgICAgIGN1cmwgLWIgZmlsZSBodHRwOi8vc2l0ZS9mb28uaHRtbAoKICAgQ3VybCB3aWxsIHRoZW4gdXNlIGFsbCBjb29raWVzIGl0IGZpbmRzIG1hdGNoaW5nLiBUaGUgb2xkIHN0eWxlIHRoYXQgc2V0cwogICBhIHNpbmdsZSBjb29raWUgd2l0aCAtYiBpcyBzdGlsbCBzdXBwb3J0ZWQgYW5kIGlzIHVzZWQgaWYgdGhlIHN0cmluZwogICBmb2xsb3dpbmcgLWIgaW5jbHVkZXMgYSAnPScgbGV0dGVyLCBhcyBpbiAiLWIgbmFtZT1kYW5pZWwiLgoKICAgVG8gbWFrZSBjdXJsIHJlYWQgdGhlIGNvb2tpZXMgc2VudCBpbiBjb21iaW5hdGlvbiB3aXRoIGEgbG9jYXRpb246ICh3aGljaAogICBzaXRlcyBvZnRlbiBkbykgcG9pbnQgY3VybCB0byByZWFkIGEgbm9uLWV4aXN0aW5nIGZpbGUgYXQgZmlyc3QgKGkuZQogICB0byBzdGFydCB3aXRoIG5vIGV4aXN0aW5nIGNvb2tpZXMpLCBsaWtlOgoKICAgICAgICBjdXJsIC1iIG5vd2hlcmUgaHR0cDovL3NpdGUvc2V0Y29va2llYW5kcmVsb2NhdGUuaHRtbAoKIC0gQWRkZWQgYSBwYXJhZ3JhcGggaW4gdGhlIFRPRE8gZmlsZSBhYm91dCB0aGUgU1NMIHByb2JsZW1zIHJlY2VudGx5CiAgIHJlcG9ydGVkLiBFdmlkZW50bHksIHNvbWUga2luZCBvZiBTU0wtcHJvYmxlbSBjdXJsIG1heSBuZWVkIHRvIGFkZHJlc3MuCgogLSBCZXR0ZXIgIkxvY2F0aW9uOiIgZm9sbG93aW5nLgoKIERvdWdsYXMgRS4gV2Vnc2NoZWlkIDx3ZWdzY2RAd2hpcmxwb29sLmNvbT4gKFR1ZSwgMzAgTWFyIDE5OTkpCiAtIEEgc3Vic2Vjb25kIGRpc3BsYXkgcGF0Y2guCgogRGFuaWVsIChNYXIgMTQgMTk5OSkKIC0gSSd2ZSBzZXBhcmF0ZWQgdGhlIHZlcnNpb24gbnVtYmVyIG9mIGxpYmN1cmwgYW5kIGN1cmwgbm93LiBUbyBtYWtlCiAgIHRoaW5ncyBhIGxpdHRsZSBlYXNpZXIsIEkgZGVjaWRlZCB0byBzdGFydCB0aGUgY3VybCBudW1iZXJpbmcgZnJvbQogICA1LjYgYW5kIHRoZSBmb3JtZXIgdmVyc2lvbiBudW1iZXIga25vd24gYXMgImN1cmwiIGlzIG5vdyB0aGUgb25lCiAgIHNldCBmb3IgbGliY3VybC4KCiAtIFJlbW92ZWQgdGhlICdlbmFibGUtbm8tcGFzcycgZnJvbSBjb25maWd1cmUsIEkgZG91YnQgYW55b25lIHdhbnRlZAogICB0aGF0LgoKIC0gTWFkZSBsb3RzIG9mIHRpbnkgYWRqdXN0bWVudHMgdG8gY29tcGlsZSBzbW9vdGhseSB3aXRoIGN5Z3dpbiB1bmRlcgogICB3aW4zMi4gSXQncyBhIGtpbGxlciBmb3IgcG9ydGluZyB0aGlzIHRvIHdpbjMyLCBieWUgYnllIFZDKyshIDstKQogICBDb21waWxlcyBhbmQgYnVpbGRzIG91dC1vZi10aGUtYm94IG5vdy4gU2VlIHRoZSBuZXcgd29yZGluZ3MgaW4KICAgSU5TVEFMTCBmb3IgZGV0YWlscy4KCiAtIEJlZ2lubmluZyBleHBlcmltZW50cyB3aXRoIGRvd25sb2FkaW5nIG11bHRpcGxlIGRvY3VtZW50IGZyb20gYSBodHRwCiAgIHNlcnZlciB3aGlsZSByZW1haW5pbmcgY29ubmVjdGVkLgoKVmVyc2lvbiA1LjZiZXRhCgogRGFuaWVsIChNYXIgMTMgMTk5OSkKIC0gU2luY2UgSSd2ZSBjaGFuZ2VkIHNvIG11Y2gsIEkgdGhvdWdodCBJJ2QganVzdCBnbyBhaGVhZCBhbmQgaW1wbGVtZW50CiAgIHRoZSBzdWdnZXN0aW9uIGZyb20gRG91Z2xhcyBFLiBXZWdzY2hlaWQgPHdlZ3NjZEB3aGlybHBvb2wuY29tPi4gLUQgb3IKICAgLS1kdW1wLWhlYWRlciBpcyBub3cgc3RvcmluZyBIVFRQIGhlYWRlcnMgc2VwYXJhdGVseSBpbiB0aGUgc3BlY2lmaWVkCiAgIGZpbGUuCgogLSBBZGRlZCBuZXcgdGV4dCB0byBJTlNUQUxMIG9uIHdoYXQgdG8gZG8gdG8gYnVpbGQgdGhpcyBvbiB3aW4zMiBub3cuCgogLSBBYWFyZ2guIEkgaGFkIHRvIHRha2UgYSBzdGVwIGJhY2sgYW5kIHByZWZpeCB0aGUgc2hhcmVkICNpbmNsdWRlIGZpbGVzCiAgIGluIHRoZSBzb3VyY2VzIHdpdGggIi4uL2luY2x1ZGUvIiB0byBwbGVhc2UgVkMrKy4uLgoKIERhbmllbCAoTWFyIDEyIDE5OTkpCiAtIFNwbGl0IHRoZSB1cmwuYyBzb3VyY2UgaW50byBtYW55IHRpbnkgc291cmNlcyBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5CiAgIGFuZCBzbWFsbGVyIHNpemUuCgogRGFuaWVsIChNYXIgMTEgMTk5OSkKIC0gU3RhcnRlZCB0byBjaGFuZ2Ugc3R1ZmYgZm9yIGEgbW92ZSB0byBtYWtlIGxpYmN1cmwgYW5kIGEgbW9yZSBzZXBhcmF0ZQogICBjdXJsIGFwcGxpY2F0aW9uIHRoYXQgdXNlcyB0aGUgbGliY3VybC4gTWFkZSB0aGUgbGliY3VybCBzb3VyY2VzIGludG8KICAgdGhlIG5ldyBsaWIgZGlyZWN0b3J5IHdoaWxlIHRoZSBjdXJsIGFwcGxpY2F0aW9uIHdpbGwgcmVtYWluIGluIHNyYyBhcwogICBiZWZvcmUuIE5ldyBtYWtlZmlsZXMsIGFkanVzdGVkIGNvbmZpZ3VyZSBzY3JpcHQgYW5kIHNvLgoKICAgbGliY3VybC5hIGJ1aWx0IHF1aWNrbHkgYW5kIGVhc2lseS4gSSBiZXR0ZXIgbWFrZSBhIGJldHRlciBpbnRlcmZhY2UgdG8KICAgdGhlIGxpYiBmdW5jdGlvbnMgdGhvdWdoLgoKICAgVGhlIG5ldyByb290IGRpciBpbmNsdWRlLyBpcyBzdXBwb3NlZCB0byBjb250YWluIHRoZSBwdWJsaWMgaW5mb3JtYXRpb24KICAgYWJvdXQgdGhlIG5ldyBsaWJjdXJsLiBJdCBpcyBhIGxpdHRsZSB1Z2x5IHNvIGZhciA6LSkKCgogRGFuaWVsIChNYXIgMSAxOTk5KQogLSBUb2RkIEthdWZtYW5uIDx0a2F1Zm1hbm5AYWRmb3JjZS5jb20+IHNlbnQgbWUgYSBnb29kIGxpbmsgdG8gTmV0c2NhcGUncwogICBjb29raWUgc3BlYyBhcyB3ZWxsIGFzIHRoZSBpbmZvIHRoYXQgUkZDIDIxMDkgc3BlY2lmaWVzIGhvdyB0byB1c2UgdGhlbS4KICAgVGhlIGxpbmsgaXMgbm93IGluIHRoZSBSRUFETUUgYW5kIHRoZSBSRkMgaW4gdGhlIFJFU09VUkNFUy4KCiBEYW5pZWwgKEZlYiAyMyAxOTk5KQogLSBGaW5hbGx5IG1hZGUgY29uZmlndXJlIGFjY2VwdCAtLXdpdGgtc3NsIHRvIGxvb2sgZm9yIFNTTCBsaWJzIGFuZCBpbmNsdWRlcwogICBpbiB0aGUgInN0YW5kYXJkIiBwbGFjZSAvdXNyL2xvY2FsL3NzbC4uLgoKIERhbmllbCAoRmViIDIyIDE5OTkpCiAtIFZlcmlmaWVkIHRoYXQgY3VybCBsaW5rZWQgZmluZSB3aXRoIE9wZW5TU0wgMC45LjFjIHdoaWNoIHNlZW1zIHRvIGJlCiAgIHRoZSBtb3N0IHJlY2VudC4KCiBIZW5yaSBHb21leiA8Z29tZXpAc2xpYi5mcj4gKEZyaSBGZWIgIDUgMTk5OSkKIC0gU2VudCBpbiBhbiB1cGRhdGVkIGN1cmwtc3NsLnNwZWMuIEkgc3RpbGwgbWlzcyB0aGUgc2NyaXB0IHRoYXQgYnVpbGRzIGFuCiAgIFJQTSBhdXRvbWF0aWNhbGx5Li4uCgpWZXJzaW9uIDUuNS4xCgogTWFyayBCdXRsZXIgPGJ1dGxlcm1AeG1pc3Npb24uY29tPiAoMjcgSmFuIDE5OTkpCiAtIENvcnJlY3RlZCBwcm9ibGVtcyBpbiBEb3dubG9hZCgpLgoKIERhbml0ZWwgU3RlbmJlcmcgKDI1IEphbiAxOTk5KQogLSBKZXJlbWllIFBldGl0IDxKZXJlbWllLlBldGl0QERpZ2l0YWwuY29tPiBwb2ludGVkIG91dCBhIGZldyBmbGF3cyBpbiB0aGUKICAgc291cmNlIHRoYXQgcHJldmVudGVkIGl0IGZyb20gY29tcGlsZSB3YXJuaW5nIGZyZWUgd2l0aCB0aGUgbmF0aXZlCiAgIGNvbXBpbGVyIHVuZGVyIERpZ2l0YWwgVW5peCB2NC4wZC4KClZlcnNpb24gNS41CgogRGFuaWVsIFN0ZW5iZXJnICgxNSBKYW4gMTk5OSkKIC0gQWRkZWQgQmpvcm5zIHNtYWxsIHRleHQgdG8gdGhlIFJFQURNRSBhYm91dCB0aGUgRElDVCBwcm90b2NvbC4KCiBEYW5pZWwgU3RlbmJlcmcgKDExIEphbiAxOTk5KQogLSA8anN3aW5rQHNvZnRjb20ubmV0PiByZXBvcnRlZCBhYm91dCB0aGUgd2luMzItdmVyc2lvaW46ICJEb2Vzbid0IHVzZQogICBBTExfUFJPWFkgZW52aXJvbm1lbnQgdmFyaWFibGUiLiBUdXJuZWQgb3V0IHRvIGJlIGJlY2F1c2Ugb2YgdGhlIHN0YXRpYy0KICAgYnVmZmVyIG5hdHVyZSBvZiB0aGUgd2luMzIgZW52aXJvbm1lbnQgdmFyaWFibGUgY2FsbHMhCgogQmpvcm4gUmVlc2UgPGJyZWVzZUBpbWFkYS5vdS5kaz4gKDEwIEphbiAxOTk5KQogLSBJIGhhdmUgYXR0YWNoZWQgYSBzaW1wbGUgYWRkaXRpb24gZm9yIHRoZSBESUNUIHByb3RvY29sIChSRkMgMjIyOSkuCiAgIEl0IHBlcmZvcm1zIGRpY3Rpb25hcnkgbG9va3Vwcy4gVGhlIG91dHB1dCBzdGlsbCBuZWVkcyB0byBiZSBiZXR0ZXIKICAgZm9ybWF0dGVkLgoKICAgVG8gdGVzdCBpdCB0cnkgKHRoZSBleGFjdCBmb3JtYXQsIGFuZCBtb3JlIGV4YW1wbGVzIGFyZSBkZXNjcmliZWQgaW4KICAgdGhlIFJGQykKCiAgICAgICAgZGljdDovL2RpY3Qub3JnL206aGVsbG8KICAgICAgICBkaWN0Oi8vZGljdC5vcmcvbTpoZWxsbzo6c291bmRleAoKCiBWaWNlbnRlIEdhcmNpYSA8dmVyb3RAcmVkZXN0Yi5lcz4gKDEwIEphbiAxOTk5KQogLSBDb3JyZWN0ZWQgdGhlIHByb2dyZXNzIG1ldGVyIGZvciBmaWxlcyBsYXJnZXIgdGhhbiAyME1CLgoKIERhbmllbCBTdGVuYmVyZyAoNyBKYW4gMTk5OSkKIC0gQ29ycmVjdGVkIHRoZSAtdCBhbmQgLVQgaGVscCB0ZXh0cy4gVGhleSBjbGFpbWVkIHRvIGJlIEZUUCBvbmx5LgoKVmVyc2lvbiA1LjQKCiBEYW5pZWwgU3RlbmJlcmcKICg3IEphbiAxOTk5KQogLSA8SXJ2aW5nX1dvbGZlQFdvbGZlLk5ldD4gcmVwb3J0ZWQgdGhhdCBjdXJsIC1zIGRpZG4ndCBhbHdheXMgc3VwcmVzcyB0aGUKICAgcHJvZ3Jlc3MgcmVwb3J0aW5nLiBJdCB3YXMgdGhlIGZvcm0gcG9zdCB0aGF0IGF1dG9hbXRpY2FsbHkgYWx3YXlzIHN3aXRjaGVkCiAgIGl0IG9uIGFnYWluLiBUaGlzIGlzIG5vdyBjb3JyZWN0ZWQhCgogKDQgSmFuIDE5OTkpCiAtIEFuZHJlYXMgS29zdHlya2EgPGFuZHJlYXNAbXRnLmNvLmF0PiBzdWdnZXN0ZWQgSSdkIGFkZCBQVVQgYW5kIGhlIGhlbHBlZCBtZQogICBvdXQgdG8gdGVzdCBpdC4gSWYgeW91IHVzZSAtdCBvciAtVCBub3cgb24gYSBodHRwIG9yIGh0dHBzIHNlcnZlciwgUFVUIHdpbGwKICAgYmUgdXNlZCBmb3IgZmlsZSB1cGxvYWQuCgogICBJIHJlbW92ZWQgdGhlIGZvcm1lciB1c2Ugb2YgLVQgd2l0aCBIVFRQLiBJIGRvdWJ0IGFueW9uZSBldmVyIHJlYWxseSB1c2VkCiAgIHRoYXQuCgogKDQgSmFuIDE5OTkpCiAtIEVyaWsgSmFjb2JzZW4gPGVyaWtAbWludC5jb20+IGZvdW5kIGEgd2lkdGggYnVnIGluIHRoZSBtcHJpbnRmKCkgZnVuY3Rpb24uCiAgIEkgY29ycmVjdGVkIGl0IG5vdy4KCiAoNCBKYW4gMTk5OSkKIC0gQXMgSm9obiBWLiBDaG93IDxqb2huY2hvd0Bicm9va2xpbmV0ZWNoLmNvbT4gcG9pbnRlZCBvdXQgdG8gbWUsIGN1cmwKICAgYWNjZXB0ZWQgdmVyeSBsaW1pdGVkIFVSTCBzaXplcy4gSXQgc2hvdWxkIG5vdyBhY2NlcHQgcGF0aCBwYXJ0cyB0aGF0IGFyZQogICB1cCB0byBhdCBsZWFzdCA0MDk2IGJ5dGVzLgoKIC0gU29tZWhvdyBJIHNjcmV3ZWQgdXAgd2hlbiBhcHBseWluZyB0aGUgQUlYIGZpeCBmcm9tIEdpbGJlcnQgUmFtaXJleiwgc28KICAgSSByZWRpZCB0aGF0IG5vdy4KClZlcnNpb24gNS4zYSAod2luMzIgb25seSkKCiBUcm95IEVuZ2VsCiAtIENvcnJlY3RlZCBhIHdpbjMyIGJ1ZyBpbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgcGFydC4KClZlcnNpb24gNS4zCgogR2lsYmVydCBSYW1pcmV6IEpyLiAoMjEgRGVjIDE5OTgpCiAtIEkgaGF2ZSBpbXBsZW1lbnRlZCB0aGUgInF1b3RlIiBmdW5jdGlvbiBvZiBGVFAgY2xpZW50cy4gSXQgYWxsb3dzIHlvdSB0bwogICBzZW5kIGFyYml0cmFyeSBjb21tYW5kcyB0byB0aGUgcmVtb3RlIEZUUCBzZXJ2ZXIuIEkgY2hvc2UgdGhlIC1RLy0tcXVvdGUKICAgY29tbWFuZC1saW5lIGFyZ3VtZW50cy4KCiAgIFlvdSBjYW4gaGF2ZSBtb3JlIHRoYW4gb25lIHF1b3RlZCBzdHJpbmcsIGFuZCBjdXJsIHdpbGwgYXBwbHkgdGhlbSBpbgogICBvcmRlci4gIFRoaXMgaXMgd2hhdCBJIHVzZSBmb3IgbXkgTVZTIHVwbG9hZDoKCiAgY3VybCAtQiAtLWNybGYgLVEgInNpdGUgbHJlY2w9ODAiIC1RICJzaXRlIGJsaz04MDAwIiAtVCBmaWxlIGZ0cDovL29zMzkwL3Rlc3QKCiAgIEN1cmwgd2lsbCBzZW5kIHRoZSB0d28gcXVvdGVkICJzaXRlIiBjb21tYW5kcyBpbiB0aGUgcHJvcGVyIG9yZGVyLgoKIC0gTWFkZSBpdCBjb21waWxlIHNtb290aGx5IG9uIEFJWC4KCiBHaWxiZXJ0IFJhbWlyZXogSnIuIDxncmFtQHZlcmRpY3QudXRoc2NzYS5lZHU+ICgxOCBEZWMgMTk5OCkKIC0gQnJvdWdodCBhbiBNVlMgcGF0Y2g6IC0zLy0tbXZzLCBmb3IgZnRwIHVwbG9hZCB0byB0aGUgTVZTIGZ0cCBzZXJ2ZXIuCgogVHJveSBFbmdlbCA8dGVuZ2VsQHNvbmljLm5ldD4gKDE3IERlYyAxOTk4KQogLSBCcm91Z2h0IGEgY29ycmVjdGlvbiB0aGF0IGZpeGVzIHRoZSB3aW4zMiBjdXJsIGJ1Zy4KCiBEYW5pZWwgU3RlbmJlcmcKIC0gQSBidWcsIHBvaW50ZWQgb3V0IHRvIG1lIGJ5IERyIEguIFQuIExldW5nIDxodGwxMEBjdXMuY2FtLmFjLnVrPiwgY2F1c2VkCiAgIGN1cmwgdG8gY3Jhc2ggb24gdGhlIC1BIGZsYWcgb24gY2VydGFpbiBzeXN0ZW1zLiBBY3R1YWxseSwgYWxsIHN5c3RlbXMKICAgc2hvdWxkJ3ZlIQoKIC0gQWRkZWQgYSBmZXcgZGVmaW5lcyB0byBtYWtlIGRpcmVjdG9yaWVzL2ZpbGUgbmFtZXMgZ2V0IGJ1aWxkIG5pY2VyICh3aXRoIF8KICAgaW5zdGVhZCBvZiAuIGFuZCBcIGluc3RlYWQgb2YgLyBpbiB3aW4zMikuCgogLSBzdGV2ZSA8Zmlza0Bwb2xhci5ib3dkb2luLmVkdT4gcmVwb3J0ZWQgYSB3ZWlyZCBidWcgdGhhdCBvY2N1cmVkIGlmIHRoZQogICBmdHAgc2VydmVyIHJlc3BvbnNlIGxpbmUgaGFkIGEgcGFyZW50aGVzaXMgb24gdGhlIGxpbmUgYmVmb3JlIHRoZSAoc2l6ZSkKICAgaW5mby4gSSBob3BlIGl0IHdvcmtzIGJldHRlciBub3chCgpWZXJzaW9uIDUuMi4xCgogU3RldmVuIEcuIEpvaG5zb24gPHN0ZXZlbmpAYWx1bS5taXQuZWR1PiAoRGVjIDE0LCAxOTk4KQogLSBCcm91Z2h0IGEgZml4IHRoYXQgY29ycmVjdGVkIGEgY3Jhc2ggaW4gNS4yIGR1ZSB0byBiYWQgdHJlYXRtZW50IG9mIHRoZQogICBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCgpWZXJzaW9uIDUuMgoKIERhbmllbCBTdGVuYmVyZyAoRGVjIDE0LCAxOTk4KQogLSBSZXdyb3RlIHRoZSBta2hlbHAgc2NyaXB0IGFuZCBub3csIHRoZSBta2hlbHAucGwgc2NyaXB0IGdlbmVyYXRlcyB0aGUKICAgaHVnZWhlbHAuYyBmaWxlIGZyb20gdGhlIFJFQURNRSAqYW5kKiB0aGUgbWFuIHBhZ2UgZmlsZSBjdXJsLjEuIEJ5IHVzaW5nCiAgIGJvdGggZmlsZXMsIEkgbm8gbG9uZ2VyIG5lZWQgdG8gaGF2ZSBkb3VibGUgaW5mb3JtYXRpb24gaW4gYm90aCB0aGUgbWFuCiAgIHBhZ2UgYW5kIHRoZSBSRUFETUUgYXMgd2VsbC4gU28sIHdpbjMyLXVzZXJzIHdpbGwgb25seSBoYXZlIHRoZSBodWdlaGVscC5jCiAgIGZpbGUgZm9yIGFsbCBpbmZvLCBidXQgdGhlbiwgdGhleSBkb3dubG9hZCB0aGUgcGxhaW4gYmluYXJ5IG1vc3QgdGltZXMKICAgYW55d2F5LgoKIC0gZ2NjMi44LjEgd2l0aCB0aGUgLVdhbGwgZmxhZyBjb21wbGFpbnRzIGEgbG90IG9uIHN1YnNjcmlwdCBoYXMgdHlwZSBgY2hhcicKICAgaWYgSSBkb24ndCBleHBsaWNpdGx5IHR5cGVjYXN0IHRoZSBhcmd1bWVudCB0byBpc2RpZ2l0KCkgb3IgaXNzcGFjZSgpIHRvCiAgIGludC4gU28gSSBkaWQgdG8gY29tcGlsZSB3YXJuaW5nIGZyZWUgd2l0aCB0aGF0IHRvby4KCiAtIEFkZGVkIGNoZWNrcyBmb3IgJ2xvbmcgZG91YmxlJyBhbmQgJ2xvbmcgbG9uZycgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQuIEkKICAgbmVlZCB0aG9zZSBmb3IgdGhlIG1wcmludGYuYyBzb3VyY2UgdG8gY29tcGlsZSB3ZWxsIG9uIG5vbiBsb25nIGxvbmcKICAgY29tZm9ybWluZyBzeXN0ZW1zIQoKVmVyc2lvbiA1LjEgKG5vdCBwdWJsaWNseSByZWxlYXNlZCkKCiBEYW5pZWwgU3RlbmJlcmcgKERlYyAxMCwgMTk5OCkKIC0gSSBnb3QgYSByZXF1ZXN0IGZvciBhIHByZS1jb21waWxlZCBOVCBBbHBoYSB2ZXJzaW9uLiBBbnlvbmU/CgogLSBBZGRlZCBMeW54L0NFUk4gd3d3IGxpYiBwcm94eSBlbnZpcm9ubWVudCB2YXJpYWJsZSBzdXBwb3J0LiBUaGF0IG1lYW5zIGN1cmwKICAgbm93IHJlYWRzIGFuZCB1bmRlcnN0YW5kcyB0aGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlczoKCglIVFRQX1BST1hZLCBIVFRQU19QUk9YWSwgRlRQX1BST1hZLCBHT1BIRVJfUFJPWFkKCiAgIFRoZXkgc2hvdWxkIGJlIHNldCBmb3IgcHJvdG9jb2wtc3BlY2lmaWMgcHJveGllcy4gR2VuZXJhbCBwcm94eSBzaG91bGQgYmUKICAgc2V0IHdpdGgKCQoJQUxMX1BST1hZCgogICBBbmQgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBob3N0IG5hbWVzIHRoYXQgc2hvdWxkbid0IGdvIHRocm91Z2ggYW55CiAgIHByb3h5IGlzIHNldCBpbiAob25seSBhbiBhc3RlcmlzaywgJyonIG1hdGNoZXMgYWxsIGhvc3RzKS4KCglOT19QUk9YWQoKICAgVGhlIHVzYWdlIG9mIHRoZSAteC8tLXByb3h5IGZsYWcgb3ZlcnJpZGVzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCgogLSBQcm94eSBjYW4gbm93IGJlIHNwZWNpZmllZCB3aXRoIGEgcHJvY290b2w6Ly8gcHJlZml4LgoKIC0gV3JvdGUgdGhlIGN1cmwuMSBtYW4gcGFnZS4KCiAtIEludHJvZHVjZWQgYSB3aG9sZSBuZXcgZHluYW1pYyBidWZmZXIgc3lzdGVtIGZvciBhbGwgc3ByaW50Zigpcy4gSXQgaXMKICAgYmFzZWQgb24gdGhlICpwcmludGYoKSBwYWNrYWdlIGJ5IHlvdXJzIHRydWx5IGFuZCBCam9ybiBSZWVzZS4gSG9wZWZ1bGx5LAogICB0aGVyZSBhcmVuJ3QgdGhhdCBtYW55IGJ1ZmZlciBvdmVyZmxvdyByaXNrcyBsZWZ0IG5vdy4KCiAtIEFoLCBJIHNob3VsZCBtZW50aW9uIEkndmUgY29tcGlsZWQgYW5kIGJ1aWx0IGN1cmwgc3VjY2Vzc2Z1bGx5IHVuZGVyCiAgIHNvbGFyaXMgMi42IHdpdGggZ2NjIG5vdywgZ2NjIDIuNy4yIHdvbid0IHdvcmsgYnV0IDIuOC4xIGRpZCBvay4KCiBPcmVuIFRpcm9zaCA8b3JlbkBoaXNob21lLm5ldD4gKERlYyAzLCAxOTk4KQogLSBCcm91Z2h0IHR3byAuc3BlYyBmaWxlcywgdG8gdXNlIHdoZW4gY3JlYXRpbmcgKExpbnV4KSBSZWRoYXQgc3R5bGUgUlBNCiAgIHBhY2thZ2VzLiBUaGV5J3JlIG5hbWVkIGN1cmwuc3BlYyBhbmQgY3VybC1zc2wuc3BlYy4KCiBUcm95IEVuZ2VsIDx0ZW5nZWxAc29uaWMubmV0PgogLSBTdXBwbGllZCB0aGUgc3JjL01ha2VmaWxlLnZjNiBmb3IgZWFzeSBjb21waWxpbmcgd2l0aCBWQysrIHVuZGVyIFdpbjMyLgoKVmVyc2lvbiA1LjAKCiBEYW5pZWwgU3RlbmJlcmcgKERlYyAxLCAxOTk4KQogLSBOb3QgYSBzaW5nbGUgYnVnIHJlcG9ydCBpbiBhZ2VzLgogLSBDb3JyZWN0ZWQgZ2V0cGFzcy5jIGFuZCBtYWluLmMgdG8gY29tcGlsZSB3YXJuaW5nIGFuZCBlcnJvciBmcmVlIHdpdGggdGhlCiAgIFdpbjMyIFZDKysgY3JhcC4KClZlcnNpb24gNS4wIGJldGEgMjQKCiBEYW5pZWwgU3RlbmJlcmcgKE5vdiAyMCwgMTk5OCkKCiBIT1cgVE8gQlVJTEQgQSBSRUxFQVNFIEFSQ0hJVkU6CgogKiBQcmUtcmVxdWlzaXRlIHNvZnR3YXJlOgogICBXaGF0CQkgICAgIFRvIGJ1aWxkIHdoYXQgICAgICAgICAgICAgUmVhZHMgZGF0YSBmcm9tCiAgID09PT0gICAgICAgICAgICAgID09PT09PT09PT09PT0gICAgICAgICAgICAgPT09PT09PT09PT09PT09CiAgIEdOVSBhdXRvbWFrZSAgICAgIE1ha2VmaWxlLmluLCBhY2xvY2FsLm00ICAgY29uZmlndXJlLmluCiAgICAgR05VIG1ha2UoMSkgICAgICAtICIgLQogICAgIEdOVSBnY2MoMSkgICAgICAgLSAiIC0KICAgR05VIGF1dG9jb25mICAgICAgY29uZmlndXJlICAgICAgICAgICAgICAgICBjb25maWd1cmUuaW4KICAgR05VIGF1dG9oZWFkZXIoMikgY29uZmlnLmguaW4JICAgICAgIGNvbmZpZ3VyZS5pbiwgYWNjb25maWcuaAoKICogTWFrZSBzdXJlIGFsbCBmaWxlcyB0aGF0IHNob3VsZCBiZSBwYXJ0IG9mIHRoZSBhcmNoaXZlIGFyZSBwdXQgaW4gRklMRVMuCgogKiBSdW4gJy4vbWFrZXRneicgYW5kIGVudGVyIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBuZXcgdG8gYmVjb21lIGFyY2hpdmUuCgogICBtYWtldGd6IGRvZXM6CgogICAtIEVudGVycyB0aGUgbmV3bHkgY3JlYXRlZCB2ZXJzaW9uIG51bWJlciBpbiB1cmwuaC4KICAgLSAoSWYgeW91IGRvbid0IGhhdmUgYXV0b21ha2UsIHRoaXMgc2NyaXB0IHdpbGwgd2FybiBhYm91dCB0aGF0LCBidXQgdW5sZXNzCiAgICAgeW91IGhhdmUgY2hhbmdlZCB0aGUgTWFrZWZpbGUuYW0gZmlsZXMsIHRoYXQgaXMgbm90aGluZyB0byBjYXJlIGFib3V0LikKICAgICBJZiB5b3UgaGF2ZSBpdCwgaXQnbGwgcnVuIGl0LgogICAtIElmIHlvdSBoYXZlIGF1dG9jb25mLCB0aGUgY29uZmlndXJlLmluIHdpbGwgYmUgZWRpdGVkIHRvIGdldCB0aGUgbmV3bHkKICAgICBjcmVhdGVkIHZlcnNpb24gbnVtYmVyIGFuZCBhdXRvY29uZiB3aWxsIGJlIHJ1bi4KICAgLSBDcmVhdGVzIGEgbmV3IGRpcmVjdG9yeSBuYW1lZCBjdXJsLTx2ZXJzaW9uPi4gKEFjdHVhbGx5LCBpdCB1c2VzIHRoZSBiYXNlCiAgICAgbmFtZSBvZiB0aGUgY3VycmVudCBkaXJlY3RvcnkgdXAgdG8gdGhlIGZpcnN0ICctJy4pCiAgIC0gQ29waWVzIGFsbCBmaWxlcyBtZW50aW9uZWQgaW4gRklMRVMgdG8gdGhlIG5ldyBkaXJlY3RvcnkuIFNhdmluZwogICAgIHBlcm1pc3Npb25zIGFuZCBkaXJlY3Rvcnkgc3RydWN0dXJlLgogICAtIFVzZXMgdGFyIHRvIGNyZWF0ZSBhbiBhcmNoaXZlIG9mIGl0IGFsbCwgbmFtZWQgY3VybC08dmVyc2lvbj4udGFyLmd6CiAgIC0gZ3ppcHMgdGhlIGFyY2hpdmUKICAgLSBSZW1vdmVzIHRoZSBuZXcgZGlyZWN0b3J5IGFuZCBhbGwgaXRzIGNvbnRlbnRzLgoKICogV2hlbiBkb25lLCB5b3UgaGF2ZSBhbiBhcmNoaXZlIHN0b3JlZCBpbiB5b3VyIGRpcmVjdG9yeSBuYW1lZAogICBjdXJsLTx2ZXJzaW9uPi50YXIuZ3ouCgogICBEb25lIQoKICAgKDEpIFRoZXkncmUgcmVxdWlyZWQgdG8gbWFrZSBhdXRvbWFrZSBydW4gcHJvcGVybHkuCiAgICgyKSBJdCBpcyBkaXN0cmlidXRlZCBhcyBhIHBhcnQgb2YgdGhlIEdOVSBhdXRvY29uZiBhcmNoaXZlLgoKIERhbmllbCBTdGVuYmVyZyAoTm92IDE4LCAxOTk4KQogLSBJIGNoYW5nZWQgdGhlIFRBRy1zeXN0ZW0uIElmIHlvdSBldmVyIHVzZWQgdXJsZ2V0KCkgZnJvbSB0aGlzIHBhY2thZ2UgaW4KICAgYW5vdGhlciBwcm9kdWN0LCB5b3UgbmVlZCB0byByZWNvbXBpbGUgd2l0aCB0aGUgbmV3IGhlYWRlcnMuIEkgZGlkIHRoaXMKICAgbmV3IHN0dWZmIHRvIGJldHRlciBkZWFsIHdpdGggZGlmZmVyZW50IGNvbXBpbGVycyBhbmQgc3lzdGVtIHdpdGggZGlmZmVyZW50CiAgIHZhcmlhYmxlIHNpemVzLiBJIHRoaW5rIGl0IG1ha2VzIGl0IGEgbGl0dGxlIG1vcmUgcG9ydGFibGUuIFRoaXMgcHJvdmVzCiAgIHRvIGNvbXBpbGUgd2FybmluZyBmcmVlIHdpdGggdGhlIHByb2JsZW1hdGljIElSSVggY29tcGlsZXIhCiAtIFdpbjMyIGNvbXBpbGVkIHdpdGggYSBzaWxseSBlcnJvci4gQ29ycmVjdGVkIG5vdy4KIC0gQnJpYW4gQ2hhcGxpbiA8YmNoYXBsaW5AY2FwaXRhbC1ta3RzLmNvbT4gcmVwb3J0ZWQgeWV0IGFub3RoZXIgcHJvYmxlbSBpbgogICBtdWx0aWxpbmUgRlRQIHJlc3BvbnNlcy4gSSd2ZSB0cmllZCB0byBjb3JyZWN0IGl0LiBJIG1haWxlZCBoaW0gYSBuZXcKICAgdmVyc2lvbiBhbmQgSSBob3BlIGhlIGdldHMgYmFjayBzb29uIHdpdGggcG9zaXRpdmUgZmVlZGJhY2shCiAtIEltcHJvdmVkIHRoZSAnbWFrZXRneicgdG8gY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSB0cmVlIHdoaWNoIGl0IG1ha2VzCiAgIGFuIGFyY2hpdmUgZnJvbSBpbnN0ZWFkIG9mIHRoZSBwcmV2aW91cyByZW5hbWluZyBvZiB0aGUgY3VycmVudCBvbmUuCiAtIE1haWxpbmcgbGlzdCBvcGVuZWQgKHNlZSBSRUFETUUpLgogLSBNYWRlIC12IG1vcmUgdmVyYm9zZSBvbiB0aGUgUEFTViBzZWN0aW9uIG9mIGZ0cCB0cmFuc2ZlcnMuIE5vdyBpdCB0ZWxscwogICBob3N0IG5hbWUgYW5kIElQIG9mIHRoZSBuZXcgaG9zdCAoYW5kIHBvcnQgbnVtYmVyKS4gSSBhbHNvIGFkZGVkIGEgc2VjdGlvbgogICBhYm91dCBQT1JUIHZzIFBBU1YgaW4gdGhlIFJFQURNRS4KClZlcnNpb24gNS4wIGJldGEgMjEKCiBBbmd1cyBNYWNrYXkgKE5vdiAxNSwgMTk5OCkKIC0gSW50cm9kdWNlZCBhdXRvbWFrZSBzdHVmZi4KCiBEYW5pZWwgU3RlbmJlcmcgKE5vdiAxMywgMTk5OCkKIC0gSnVzdCBtYWRlIGEgc3VjY2Vzc2Z1bCBHRVQgb2YgYSBkb2N1bWVudCBmcm9tIGFuIFNTTC1zZXJ2ZXIgdXNpbmcgbXkgb3duCiAgIHByaXZhdGUgY2VydGlmaWNhdGUgZm9yIGF1dGhlbnRpY2F0aW9uISBUaGUgY2VydGlmaWNhdGUgaGFzIHRvIGJlIGluIFBFTQogICBmb3JtYXQuIFlvdSBkbyB0aGF0IHRoZSBlYXNpZXN0IHdheSAoYWx0aG91Z2ggbm90ICp0aGF0KiBlYXN5KSBieQogICBkb3dubG9hZGluZyB0aGUgU1NMeWVheSBQS0NTIzEyLXBhdGNoIGJ5IERyIFN0ZXBoZW4gTi4gSGVuc29uIGZyb20gaGlzIHNpdGUKICAgYXQ6IGh0dHA6Ly93d3cuZHJoLWNvbnN1bHRhbmN5LmRlbW9uLmNvLnVrLy4gVXNpbmcgaGlzIHRvb2wsIHlvdSBjYW4KICAgY29udmVydCBhbnkgbW9kZXJuIE5ldHNjYXBlIG9yIChldmVuKSBNU0lFIGNlcnRpZmljYXRlIHRvIFBFTS1mb3JtYXQuICBVc2UKICAgaXQgd2l0aCAnY3VybCAtRSA8Y2VydGlmaWNhdGU6cGFzc3dvcmQ+IGh0dHBzOi8vc2l0ZS5jb20nLiAgSWYgdGhpcyBpc24ndCBhCiAgIGNvb2wgZmVhdHVyZSwgdGhlbiBJIGRvbid0IGtub3cgd2hhdCBjb29sIGZlYXR1cmVzIGxvb2sgbGlrZSEgOy0pCiAtIFdvcmtpbmcgc2xvd2x5IG9uIHRlbG5ldCBjb25uZWN0aW9ucy4gI2RlZmluZSBUUllfVEVMTkVUIHRvIHRyeSBpdCBvdXQuCiAgIChjdXJsIC11IHVzZXI6cGFzc3dkICJ0ZWxuZXQ6Ly9ob3N0LmNvbS9jYXQgLmxvZ2luIiBpcyBvbmUgZXhhbXBsZSkgSSBkbwogICBoYXZlIHByb2JsZW0gdG8gZGVmaW5lIGhvdyBpdCBzaG91bGQgd29yay4gVGhlIHByaW1lIHB1cnBvc2UgZm9yIHRoaXMgbXVzdAogICBiZSB0byBnZXQgKDhiaXQgY2xlYW4pIGZpbGVzIHZpYSB0ZWxuZXQsIGFuZCBpdCByZWFsbHkgaXNuJ3QgdGhhdCBlYXN5IHRvCiAgIGdldCBmaWxlcyB0aGlzIHdheS4gU3RpbGwgaGF2aW5nIHByb2JsZW1zIHdpdGggXG4gYmVpbmcgY29udmVydGVkIHRvIFxyXG4uCgogQW5ndXMgTWFja2F5IChOb3YgMTIsIDE5OTgpCiAtIENvcnJlY3RlZCBhbm90aGVyIGJ1ZyBpbiB0aGUgbG9uZyBwYXJhbWV0ZXIgbmFtZSBwYXJzZXIuCiAtIE1vZGlmaWVkIGdldHBhc3MuYyAoTk9URTogc2VlIHRoZSBzcGVjaWFsIGxpY2Vuc2luZyBpbiB0aGUgdG9wIG9mIHRoYXQKICAgc291cmNlIGZpbGUpLgoKIERhbmllbCBTdGVuYmVyZyAoTm92IDEyLCAxOTk4KQogLSBXZSBtYXkgaGF2ZSByZW1vdmVkIHRoZSBzaWxseSB3YXJuaW5ncyBmcm9tIHVybC5jIHdoZW4gY29tcGlsZWQgdW5kZXIgSVJJWC4KICAgVGhhbmtzIGFnYWluIHRvIEJqb3JuIFJlZXNlIDxicmVlc2VAaW1hZGEub3UuZGs+IGFuZCBNYXJ0aW4gU3RhYWVsCiAgIDxtYXJ0aW5AbmV0Z3JvdXAuZGs+LgogLSBXcm90ZSBmb3JtZmluZC5wbCB3aGljaCBpcyBhIG5ldyBwZXJsIHNjcmlwdCBpbnRlbmRlZCB0byBoZWxwIHlvdSBmaW5kIG91dAogICBob3cgYSBGT1JNIHN1Ym1pc3Npb24gc2hvdWxkIGJlIGRvbmUuIFRoaXMgbmVlZHMgYSBsaXR0bGUgbW9yZSB3b3JrIHRvIGdldAogICByZWFsbHkgZ29vZC4KCiBEYW5pZWwgU3RlbmJlcmcgKE5vdiAxMSwgMTk5OCkKIC0gTWFkZSB0aGUgSFRUUCBoZWFkZXItY2hlY2tlciBhY2NlcHQgd2hpdGUgc3BhY2VzIGJlZm9yZSB0aGUgSFRUUC8xLj8gbGluZS4KICAgQXBwZWFyYW50bHkgc29tZSBwcm94aWVzL3NpdGVzIGFkZCBzdWNoIGF0IHRpbWVzIChteSB0ZXN0IHByb3h5IGRpZCB3aGVuIEkKICAgZG93bmxvYWRlZCBhIGdvcGhlciBwYWdlIHdpdGggaXQpIQogLSBNb3ZlZCB0aGUgZm9ybWVyIC1oIHRvIC1NIGFuZCBtYWRlIC1oIHNob3cgdGhlIHNob3J0IGhlbHAgdGV4dCBpbnN0ZWFkLiBJCiAgIGhhZCB0byBlbmFibGUgYSBmb3JjZWQgaGVscCB0ZXh0IG9wdGlvbi4gTm93IGFuIGV2ZW4gc2hvcnRlciBoZWxwIHRleHQgd2lsbAogICBiZSBwcmVzZW50ZWQgd2hlbiBhbiB1bmtub3duIG9wdGlvbiBhbmQgc2ltaWxhciwgaXMgdXNlZC4KIC0gc3RkY2hlYWRlcnMuaCBkaWRuJ3Qgd29yayB3aXRoIElSSVggNi40IG5hdGl2ZSBjYyBjb21waWxlci4gSSBob3BlIG15CiAgIGNoYW5nZXMgZG9uJ3QgbWFrZSBvdGhlciB2ZXJzaW9ucyBnbyBudXRzIGluc3RlYWQuCgogRGFuaWVsIFN0ZW5iZXJnIChOb3YgMTAsIDE5OTgpCiAtIEFkZGVkIGEgd2VpcmQgY2hlY2sgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gY2hlY2sgZm9yIHRoZSBzaWxseSBBSVgKICAgd2FybmluZ3MgYWJvdXQgbXkgI2RlZmluZSBzdHJjYXNlY21wKCkgc3R1ZmYuIEkgZG8gdGhhdCBkZWZpbmUgdG8gcHJldmVudAogICBtZSBhbmQgb3RoZXIgY29udHJpYnV0b3JzIHRvIGFjY2lkZW50YWx5IHVzZSB0aGF0IGZ1bmN0aW9uIG5hbWUgaW5zdGVhZAogICBvZiBzdHJlcXVhbCgpLi4uCiAtIEkgYnVnZml4ZWQgQW5ndXMncyBnZXRwYXNzLmMgdmVyeSBsaXR0bGUuCiAtIEZpeGVkIHRoZSB2ZXJib3NlIGZsYWcgbmFtZXMgdG8gZ2V0b3B0LXN0eWxlLCBpLmUgJ2N1cmwgLS1sb2MnIHdpbGwgYmUKICAgc3VmZmljaWVudCBpbnN0ZWFkIG9mIC0tbG9jYXRpb24gYXMgImxvYyIgaXMgYSB1bmlxdWUgcHJlZml4LiBBbHNvLCBhbnl0aGluZwogICBhZnRlciBhICctLScgaXMgdHJlYXRlZCBhcyBhbiBVUkwuIFNvIGlmIHlvdSBkbyBoYXZlIGEgaG9zdCB3aXRoIGEgd2VlZWlyZAogICBuYW1lIHlvdSBjYW4gZG8gJ2N1cmwgLS0gLWhvc3QuY29tJy4KIC0gQW5vdGhlciBnZXRvcHQtYWRqdXN0OyBjdXJsIG5vdyBhY2NlcHRzIGZsYWdzIGFmdGVyIHRoZSBVUkwgb24gdGhlIGNvbW1hbmQKICAgbGluZS4gJ2N1cmwgd3d3LmZvby5jb20gLU8nIGlzIHBlcmZlY3RseSB2YWxpZC4KIC0gQ29ycmVjdGVkIHRoZSAuY3VybHJjIHBhcnNlciBzbyB0aGF0IHN0cnRvaygpIGlzIG5vIGxvbmdlciB1c2VkIGFuZCBJCiAgIGJlbGlldmUgaXQgd29ya3MgYmV0dGVyLiBFdmVuIFVSTHMgY2FuIGJlIHNwZWNpZmllZCBpbiBpdCBub3cuCgogQW5ndXMgTWFja2F5IChOb3YgOSwgMTk5OCkKIC0gUmVwbGFjZWQgZ2V0cGFzcy5jIHdpdGggYSBuZXdseSB3cml0dGVuIG9uZSwgbm90IHVuZGVyIEdQTCBsaWNlbnNlCiAtIENoYW5nZWQgT1MgdG8gYSAjZGVmaW5lIGluIGNvbmZpZy5oIGluc3RlYWQgb2YgY29tcGlsZXIgZmxhZwogLSBNYWtlZmlsZSBub3cgdXNlcyAtREhBVkVfQ09ORklHX0gKCiBEYW5pZWwgU3RlbmJlcmcgKE5vdiA5LCAxOTk4KQogLSBPaywgSSBleHBhbmRlZCB0aGUgdGd6LXRhcmdldCB0byB1cGRhdGUgdGhlIHZlcnNpb24gc3RyaW5nIG9uIGVhY2ggb2NjYXRpb24KICAgSSBidWlsZCBhIHJlbGVhc2UgYXJjaGl2ZSEKIC0gSSByZWFjdGVkIG9uIEFuZ3VzIE1hY2theSdzIGluaXRpYXRpdmUgYW5kIHJlbWFkZSB0aGUgcGFyYW1ldGVyIHBhcnNlciB0bwogICBiZSBtb3JlIGdldG9wdCBjb21wbGlhbnQuIEN1cmwgbm93IHN1cHBvcnRzICJtZXJnZWQiIGZsYWdzIGFzIGluIAoJY3VybCAtbHN2IGZ0cC5zaXRlLmNvbQogICBEbyBub3RlIHRoYXQgSSBoYWQgdG8gbW92ZSB0aHJlZSBzaG9ydC1uYW1lcyBvZiB0aGUgb3B0aW9ucy4gUGFyYW1ldGVycwogICB0aGF0IG5lZWRzIGFuIGFkZGl0aW9uYWwgc3RyaW5nIHN1Y2ggYXMgLXggbXVzdCBiZSBzdGFuZC1hbG9uZSBvciB0aGUKICAgbGFzdCBpbiBhIG1lcmdlZCBzZXF1ZW5jZToKCWN1cmwgLWxzeCBteS1wcm94eSBmdHAuc2l0ZS5jb20KICAgaXMgb2ssIGJ1dCB1c2luZyB0aGUgZmxhZ3MgaW4gYSBkaWZmZXJlbnQgb3JkZXIgbGlrZSAnLWx4cycgd291bGQgY2F1c2UKICAgdW5leHBlY3RlZCByZXN1bHRzIChhcyB0aGUgJ3MnIG9wdGlvbiB3b3VsZCBiZSBza2lwcGVkKS4KIC0gSSd2ZSBjaGFuZ2VkIHRoZSBoZWFkZXJzIGluIGFsbCBmaWxlcyB0aGF0IGFyZSBzdWJqZWN0IHRvIHRoZSBNb3pQTAogICBsaWNlbnNlLCBhcyB0aGV5IGFyZSBzdXBwb3NlZCB0byBsb29rIGxpa2Ugd2hlbiBjb25mb3JtaW5nLgogLSBNYWRlIHRoZSBjb25maWd1cmUgc2NyaXB0IG1ha2UgdGhlIGNvbmZpZy5oLiBUaGUgZm9ybWVyIGNvbmZpZy5oIGlzIG5vdwogICBzZXR1cC5oLgogLSBUaGUgUkVTT1VSQ0VTIGFuZCBUT0RPIGZpbGVzIGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgYXJjaGl2ZS4KCiBBbmd1cyBNYWNrYXkgPGFtYWNrYXlAZ3VzLm1sLm9yZz4gKE5vdiA1LCAxOTk4KQogLSBGaXhlZCBnZXRwYXNzLmMgYW5kIHZhcmlvdXMgY29uZmlndXJlIHN0dWZmCgogRGFuaWVsIFN0ZW5iZXJnIChOb3YgMywgMTk5OCkKIC0gVXNlIC1ILy0taGVhZGVyIGZvciBjdXN0b20gSFRUUC1oZWFkZXJzLiBMZXRzIHlvdSBwYXNzIG9uIHlvdXIgb3duCiAgIHNwZWNpZmllZCBoZWFkZXJzIHRvIHRoZSByZW1vdGUgc2VydmVyLiBJIHdvdWxkbid0IHJlY29tbWVuZCB0cnlpbmcgdG8gdXNlCiAgIGEgaGVhZGVyIHdpdGggYSBkZWZpbmVkIHVzYWdlIGFjY29yZGluZyB0byBzdGFuZGFyZHMuIFVzZSB0aGlzIGZsYWcgb25jZQogICBmb3IgZXZlcnkgY3VzdG9tIGhlYWRlciB5b3Ugd2FudCB0byBhZGQuCiAtIFVzZSAtQi8tLWZ0cC1hc2NpaSB0byBmb3JjZSBmdHAgdG8gdXNlIEFTQ0lJIG1vZGUgd2hlbiB0cmFuc2ZlcmluZyBmaWxlcy4KIC0gQ29ycmVjdGVkIHRoZSAnZ2V0bGlua3MucGwnIHNjcmlwdCwgSSBhY2NpZGVudGFsbHkgbGVmdCBteSBzaWxseSBwcm94eQogICB1c2FnZSBpbiB0aGVyZSEgU2luY2UgdGhlIGludHJvZHVjdGlvbiBvZiB0aGUgLmN1cmxyYyBmaWxlLCBpdCBpcyBlYXNpZXIgdG8KICAgd3JpdGUgc2NyaXB0cyB0aGF0IHVzZSBjdXJsIHNpbmNlIHByb3hpZXMgYW5kIHN0dWZmIHNob3VsZCBiZSBpbiB0aGUKICAgLmN1cmxyYyBmaWxlIGFueXdheS4KIC0gSW50cm9kdWNpbmcgdGhlIG5ldyAtRiBmbGFnIGZvciBIVFRQIFBPU1QuIEl0IHN1cHBvcnRzIG11bHRpcGFydC9mb3JtLWRhdGEKICAgd2hpY2ggbWVhbnMgaXQgaXMgZ29ubmEgYmUgcG9zc2libGUgdG8gdXBsb2FkIGZpbGVzIGV0YyB0aHJvdWdoIEhUVFAgUE9TVC4KICAgU2hpcmF6IEthbmdhIDxza2FuZ2FAYmlnZm9vdC5jb20+IGFza2VkIGZvciB0aGUgZmVhdHVyZSBhbmQgbXkgYnJvdGhlciwKICAgQmr2cm4gU3RlbmJlcmcgPEJqb3JuLlN0ZW5iZXJnQHN0aC5mcm9udGVjLnNlPiBoZWxwZWQgbWUgZGVzaWduIHRoZSB1c2VyCiAgIGludGVyZmFjZSBmb3IgdGhpcyBiZWFzdC4gIFRoaXMgZmVhdHVyZSByZXF1aXJlcyBxdWl0ZSBzb21lIGRvY3MsCiAgIHNpbmNlIGl0IGhhcyB0dXJuZWQgb3V0IG5vdCBvbmx5IHF1aXRlIGNhcGFibGUsIGJ1dCBhbHNvIGNvbXBsaWNhdGVkISA6LSkKIC0gQSBub3RlIGhlcmUsIHNpbmNlIEkndmUgcmVjZWl2ZWQgbWFpbCBhYm91dCBpdC4gU1NMZWF5IHZlcnNpb25zIHByaW9yIHRvCiAgIDAuOCB3aWxsICpub3QqIHdvcmsgd2l0aCBjdXJsIQogLSBXaWwgTGFuZ2ZvcmQgPHdpbEBsYW5nZm9yZC5uZXQ+IHJlcG9ydGVkIGEgYnVnIHRoYXQgb2NjdXJyZWQgc2luY2UgY3VybAogICBkaWQgbm90IHByb3Blcmx5IHVzZSBDUkxGIHdoZW4gaXNzdWluZyBmdHAgY29tbWFuZHMuIEkgZml4ZWQgaXQuCiAtIFJlYXJyYW5nZWQgdGhlIG9yZGVyIGNvbmZpZyBmaWxlcyBhcmUgcmVhZC4gLmN1cmxyYyBpcyBub3cgKmFsd2F5cyogcmVhZAogICBmaXJzdCBhbmQgYmVmb3JlIHRoZSBjb21tYW5kIGxpbmUgZmxhZ3MuIC1LIGNvbmZpZyBmaWxlcyB0aGVuIGFjdCBhcwogICBhZGRpdGlvbmFsIGNvbmZpZyBpdGVtcy4KIC0gVXNlIC1xIEFTIFRIRSBGSVJTVCBPUFRJT04gc3BlY2lmaWVkIHRvIHByZXZlbnQgLmN1cmxyYyBmcm9tIGJlaW5nIHJlYWQuCiAtIFlvdSBjYW4gbm93IGRpc2FibGUgYSBwcm94eSBieSB1c2luZyAteCAiIi4gVXNlZnVsIGlmIHRoZSAuY3VybHJjIGZpbGUKICAgc3BlY2lmaWVzIGEgcHJveHkgYW5kIHlvdSB3YW5uYSBmZXRjaCBzb21ldGhpbmcgd2l0aG91dCBnb2luZyB0aHJvdWdoCiAgIHRoYXQuCiAtIEknbSB0aGlua2luZyBvZiBkcm9wcGluZyB0aGUgLXAgc3VwcG9ydC4gSXRzIHJlYWxseSBub3QgdXNlZnVsIHNpbmNlIHBvcnRzCiAgIGNvdWxkIChhbmQgc2hvdWxkPykgYmUgc3BlY2lmaWVkIGFzIDo8cG9ydD4gYXBwZW5kZWQgb24gdGhlIGhvc3QgbmFtZQogICBpbnN0ZWFkLCBib3RoIGluIFVSTHMgYW5kIHRvIHByb3h5IGhvc3QgbmFtZXMuCiAtIE1hcnRpbiBTdGFhZWwgPG1hcnRpbkBuZXRncm91cC5kaz4gcmVwb3J0cyBjdXJsIC1MIGJ1Z3MgdW5kZXIgV2luZG93cyBOVAogICAodGVzdCB3aXRoIFVSTCBodHRwOi8vY29tZS50by9zY3NkZSkuIFRoaXMgYnVnIGlzIG5vdCBwcmVzZW50IGluIHRoaXMKICAgdmVyc2lvbiBhbnltb3JlLgogLSBBZGRlZCBzdXBwb3J0IGZvciB0aGUgd2VpcmQgRlRQIFVSTCB0eXBlPSB0aGluZy4gWW91IGNhbiBkb3dubG9hZCBhIGZpbGUKICAgdXNpbmcgQVNDSUkgdHJhbnNmZXIgYnkgYXBwZW5kaW5nICI7dHlwZT1BIiB0byB0aGUgcmlnaHQgb2YgaXQuIE90aGVyCiAgIGF2YWlsYWJsZSB0eXBlcyBhcmUgdHlwZT1EIGZvciBkaXItbGlzdCAoTkxTVCkgYW5kIHR5cGU9SSBmb3IgYmluYXJ5CiAgIHRyYW5zZmVyLiBJIGNhbid0IHNheSBJJ3ZlIGV2ZXIgc2VlbiBhbnlvbmUgdXNlIHRoaXMga2luZCBvZiBVUkwgdGhvdWdoIQogICA6LSkKIC0gVHJveSBFbmdlbCA8dGVuZ2VsQHBhbGxhZGl1bS5uZXQ+IHBvaW50ZWQgb3V0IGEgYnVnIGluIG15IGdldGVudigiSE9NRSIpCiAgIHVzYWdlIGZvciB3aW4zMiBzeXN0ZW1zLiBJIGludHJvZHVjZSBnZXRlbnYuYyB0byBiZXR0ZXIgY29wZSB3aXRoCiAgIHRoaXMuIE1yIEVuZ2VsIGhlbHBzIG1lIHdpdGggdGhlIGRldGFpbHMgYXJvdW5kIHRoYXQuLi4KIC0gQSBsaXR0bGUgbm90ZSB0byBteXNlbGYgYW5kIG90aGVycywgSSBzaG91bGQgbWFrZSB0aGUgd2luMzItYmluYXJ5IGJ1aWx0CiAgIHdpdGggU1NMIHN1cHBvcnQuLi4KIC0gci15LWEtbi9uLWUtbC1zLW8tbiA8cnlhbkBpbmNoLmNvbT4gc2VudCBtZSBjb21tZW50cyBhYm91dCBidWlsZGluZyBjdXJsCiAgIHdpdGggU1NMIHVuZGVyIEZyZWVCU0QuIFNlZSB0aGUgTWFrZWZpbGUgZm9yIGRldGFpbHMuIFVzaW5nIHRoZSBjb25maWd1cmUKICAgc2NyaXB0LCBpdCBzaG91bGQgd29yayBiZXR0ZXIgYW5kIGF1dG9tYXRpY2FsbHkgbm93Li4uCiAtIENsZWFuZWQgdXAgaW4gdGhlIHBvcnQgbnVtYmVyIG1lc3MgaW4gdGhlIHNvdXJjZS4gTm8gbG9uZ2VyIHN0b3JlcyBhbmQgdXNlcwogICBwcm94eSBwb3J0IG51bWJlciBzZXBhcmF0ZSBmcm9tIG5vcm1hbCBwb3J0IG51bWJlci4KIC0gJ2NvbmZpZ3VyZScgc2NyaXB0IHdvcmtpbmcuIENvbmZpcm1lZCBjb21waWxlcyBvbjoKICAgIEhvc3QgICAgICAgICBTU0wgIENvbXBpbGVyCiAgICBTdW5PUyA1LjUgICAgbm8gICBnY2MKICAgIFN1bk9TIDUuNS4xICB5ZXMgIGdjYwogICAgU3VuT1MgNS42ICAgIG5vICAgY2MgICh3aXRoIGdjYywgaXQgaGFzIHRoZSAiZ2NjIGluY2x1ZGUgZmlsZXMiIHByb2JsZW0pCiAgICBTdW5PUyA0LjEuMyAgbm8gICBnY2MgKHdpdGhvdXQgQU5TSSBDIGhlYWRlcnMpCiAgICBTdW5PUyA0LjEuMiAgbm8gICBnY2MgKG5hdGl2ZSBjb21waWxlciBmYWlsZWQpCiAgICBMaW51eCAyLjAuMTggbm8gICBnY2MKICAgIExpbnV4IDIuMC4zMiB5ZXMgIGdjYwogICAgTGludXggMi4wLjM1IG5vICAgZ2NjICh3aXRoIGdsaWJjKQogICAgSVJJWCA2LjIgICAgIG5vICAgZ2NjIChjYyBjb21waWxlcyBnZW5lcmF0ZSBhIGZldyB3YXJuaW5ncykKICAgIElSSVggNi40ICAgICBubyAgIGNjICAoZ2VuZXJhdGVkIHdhcm5pbmdzIHRob3VnaCkKICAgIFdpbjMyICAgICAgICBubyAgIEJvcmxhbmQKICAgIE9TRjQuMAkgbm8gICA/CgogLSBPb29wcy4gVGhlIDViZXRhIChhbmQgNC4xMCkgdW5kZXIgd2luMzIgZmFpbGVkIGlmIHRoZSBIT01FIHZhcmlhYmxlIHdhc24ndAogICBzZXQuCiAtIFdoZW4gdXNpbmcgYSBwcm94eSwgY3VybCBub3cgZ3Vlc3NlcyBhbmQgdXNlcyB0aGUgcHJvdG9jb2wgcGFydCBpbiBjYXNlcwogICBsaWtlOgoJY3VybCAteCBwcm94eTo4MCB3d3cuc2l0ZS5jb20KICAgUHJveGllcyBub3JtYWxseSBnbyBudXRzIHVubGVzcyBodHRwOi8vIGlzIHByZXBlbmRlZCB0byB0aGUgaG9zdCBuYW1lLCBzbwogICBpZiBjdXJsIGlzIHVzZWQgbGlrZSB0aGlzLCBpdCBndWVzc2VzIHByb3RvY29sIGFuZCBhcHBlbmRzIHRoZSBwcm90b2NvbAogICBzdHJpbmcgYmVmb3JlIHBhc3NpbmcgaXQgdG8gdGhlIHByb3h5LiBJdCBhbHJlYWR5IGRpZCB0aGlzIHdoZW4gdXNlZAogICB3aXRob3V0IHByb3h5LgogLSBCZXR0ZXIgcG9ydCB1c2FnZSB3aXRoIFNTTCB0aHJvdWdoIHByb3h5IG5vdy4gSWYgeW91IHNwZWNpZmllZCBhIGRpZmZlcmVudAogICBodHRwcy1wb3J0IHdoZW4gYWNjZXNzaW5nIHRocm91Z2ggYSBwcm94eSwgaXQgZGlkbid0IHVzZSB0aGF0IG51bWJlcgogICBjb3JyZWN0bHkuIEkgYWxzbyByZXdyb3RlIHRoZSBjb2RlIHRoYXQgcGFyc2VzIHRoZSBzdHVmZiByZWFkIGZyb20gdGhlCiAgIHByb3h5IHdoZW4geW91IHdhbm5hIGNvbm5lY3QgdGhyb3VnaCBpdCB3aXRoIFNTTC4KIC0gQmpvcm4gUmVlc2UgPGJyZWVzZUBpbWFkYS5vdS5kaz4gaGVscGVkIG1lIHdvcmsgYXJvdW5kIG9uZSBvZiB0aGUgY29tcGlsZXIKICAgd2FybmluZ3Mgb24gSVJJWCBuYXRpdmUgY2MgY29tcGlsZXMuCgpWZXJzaW9uIDQuMTAgKE9jdCAyNiwgMTk5OCkKIERhbmllbCBTdGVuYmVyZwogLSBKb2huIEEuIEJyaXN0b3IgPGpicmlzdG9yQGJlbGxzb3V0aC5uZXQ+IHN1Z2dlc3RlZCBhIGNvbmZpZyBmaWxlIHN3aXRjaCwKICAgYW5kIHNpbmNlIEkndmUgYmVlbiBoYXZpbmcgdGhhdCBpZGVhIGtpbmQgb2YgaW4gdGhlIGJhY2tncm91bmQgZm9yIGEgbG9uZwogICB0aW1lIEkgcmV3cm90ZSB0aGUgcGFyYW1ldGVyIHBhcnNpbmcgZnVuY3Rpb24gYSBsaXR0bGUgYW5kIG5vdyBJIGludHJvZHVjZQogICB0aGUgLUsvLS1jb25maWcgZmxhZy4gSSBhbHNvIG1hZGUgY3VybCAqYWx3YXlzKiAodW5sZXNzIC1LIGlzIHVzZWQpIHRyeSB0bwogICBsb2FkIHRoZSAuY3VybHJjIGZpbGUgZm9yIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzLiBUaGUgc3ludGF4IGZvciB0aGUKICAgY29uZmlnIGZpbGUgaXMgdGhlIHN0YW5kYXJkIGNvbW1hbmQgbGluZSBhcmd1bWVudCBzdHlsZS4gRGV0YWlscyBpbiAnY3VybAogICAtaCcgb3IgdGhlIFJFQURNRS4KIC0gSSByZW1vdmVkIHRoZSAtayBvcHRpb24uIEtlZXAtYWxpdmUgaXNuJ3QgcmVhbGx5IGFueXRoaW5nIGFueW9uZSB3b3VsZAogICB3YW50IHRvIGVuYWJsZSB3aXRoIGN1cmwgYW55d2F5LgogLSBNYXJ0aW4gU3RhYWVsIDxNYXJ0aW5AU3RhYWVsLmRrPiBoZWxwZWQgbWUgYWRkIHRoZSAnaXJpeCcgdGFyZ2V0LiBOb3cKICAgIm1ha2UgaXJpeCIgc2hvdWxkIGJ1aWxkIGN1cmwgc3VjY2Vzc2Z1bGx5IG9uIG5vbi1nY2MgU0dJIG1hY2hpbmVzLgogLSBTaW5nbGUgc3dpdGNoZXMgbm93IHRvZ2dsZSBiZWhhdmlvdXJzLiBJLmUgaWYgeW91IHVzZSAtdiAtdiB0aGUgc2Vjb25kCiAgIHdpbGwgc3dpdGNoIG9mZiB0aGUgdmVyYm9zZSBtb2RlIHRoZSBmaXJzdCBvbmUgZW5hYmxlZC4gVGhpcyBpcyBzbyB0aGF0CiAgIHlvdSBjYW4gZGlzYWJsZSBhIGRlZmF1bHQgc2V0dGluZyBhIC5jdXJscmMgZmlsZSBlbmFibGVzIGV0Yy4KClZlcnNpb24gNC45IChPY3QgNywgMTk5OCkKIERhbmllbCBTdGVuYmVyZwogLSBNYXJ0aW4gU3RhYWVsIDxNYXJ0aW5AU3RhYWVsLmRrPiBzdWdnZXN0ZWQgY3VybCB3b3VsZCBzdXBwb3J0IGNvb2tpZXMuCiAgIEkgYWRkZWQgLWIvLS1jb29raWUgdG8gZW5hYmxlIGZyZWUtdGV4dCBjb29raWUgZGF0YSB0byBiZSBwYXNzZWQuIFRoZXJlJ3MKICAgYWxzbyBhIGxpdHRsZSBibHVyYiBhYm91dCBnZW5lcmFsIGNvb2tpZSBzdHVmZiBpbiB0aGUgUkVBRE1FL2hlbHAgdGV4dC4KIC0gZG1oIDxkbWhAamV0LmVzPiBzdWdnZXN0ZWQgSFRUUCByZXN1bWUgY2FwYWJpbGl0aWVzLiBBbHRob3VnaCB5b3UgY291bGQKICAgbWFudWFsbHkgZ2V0IGN1cmwgdG8gcmVzdW1lIEhUVFAgZG9jdW1lbnRzLCBJIG1hZGUgdGhlIC1jIHJlc3VtZSBmbGFnIHdvcmsKICAgZm9yIEhUVFAgdG9vICh1bmxlc3MgLXIgaXMgdXNlZCB0b28sIHdoaWNoIHdvdWxkIGJlIHZlcnkgb2RkIGFueXdheSkuCiAtIEFkZGVkIGNoZWNrbGlua3MucGwgdG8gdGhlIGFyY2hpdmUuIEl0IGlzIGEgc3RpbGwgZXhwZXJpbWVudGFsIHBlcmwgc2NyaXB0CiAgIHRoYXQgY2hlY2tzIGFsbCBsaW5rcyBvZiBhIHdlYiBwYWdlIGJ5IHVzaW5nIGN1cmwuCiAtIFJlYXJyYW5nZWQgdGhlIGFyY2hpdmUgaGllcmFyY2h5IGEgbGl0dGxlLiBCdWlsZCB0aGUgZXhlY3V0YWJsZSBpbiB0aGUKICAgc3JjLyBkaXIgZnJvbSBub3cgb24hCiAtIFZlcnNpb24gNC45IGFuZCBoZXJlYWZ0ZXIsIGlzIG5vIGxvbmdlciByZWxlYXNlZCB1bmRlciB0aGUgR1BMIGxpY2Vuc2UuCiAgIEkgaGF2ZSBub3cgdXBkYXRlZCB0aGUgTEVHQUwgZmlsZSBldGMgYW5kIG5vdyB0aGlzIGlzIHJlbGVhc2VkIHVzaW5nIHRoZQogICBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIHRvIGF2b2lkIHRoZSBwbGFndWUga25vd24gYXMgInRoZSBHUEwgdmlydXMiLiBZb3UKICAgbXVzdCBtYWtlIHRoZSBzb3VyY2UgYXZhaWxhYmxlIGlmIHlvdSBkZWNpZGUgdG8gY2hhbmdlIGFuZC9vciByZWRpc3RyaWJ1dGUKICAgY3VybCwgYnV0IGlmIHlvdSBkZWNpZGUgdG8gdXNlIGN1cmwgd2l0aGluIHNvbWV0aGluZyBlbHNlIHlvdSBkbyBub3QgbmVlZAogICB0byBvZmZlciB0aGUgd29ybGQgdGhlIHNvdXJjZSB0byB0aGF0IHRvby4KIC0gQ3VybCBkaWQgbm90IGxpa2UgSFRUUCBzZXJ2ZXJzIHRoYXQgc2VudCBubyBoZWFkZXJzIGF0IGFsbCBvbiBhIEdFVAogICByZXF1ZXN0LiAgSXQgaXMgYSB2aW9sYXRpb24gb2YgUkZDMjA2OCBidXQgYXBwZWFyYW50bHkgc29tZSBzZXJ2ZXJzIGRvCiAgIHRoYXQgYW55d2F5LiAgVGhhbmtzIHRvIEdvcmRvbiBCZWF0b24gPGdvcmRvbkBlcml4LmVyaWNzc29uLnNlPiBmb3IgdGhlCiAgIHJlcG9ydCEKIC0gLUwvLS1sb2NhdGlvbiB3YXMgYWRkZWQgYWZ0ZXIgYSBzdWdnZXN0aW9uIGZyb20gTWFydGluIFN0YWFlbAogICA8TWFydGluQFN0YWFlbC5kaz4uIFRoaXMgbWFrZXMgY3VybCBBVFRFTVBUIHRvIGZvbGxvdyB0aGUgTG9jYXRpb246CiAgIHJlZGlyZWN0IGlmIG9uZSBpcyBwcmVzZW50IGluIHRoZSBIVFRQIGhlYWRlcnMuIElmIC1pIG9yIC1JIGlzIHVzZWQgd2l0aAogICB0aGlzIGZsYWcsIHlvdSB3aWxsIHNlZSBoZWFkZXJzIGZyb20gYWxsIHNpdGVzIHRoZSBMb2NhdGlvbjogcG9pbnRzIHRvLiBEbwogICBub3RlIHRoYXQgdGhlIGZpcnN0IHNlcnZlciBjYW4gcG9pbnQgdG8gYSBzZWNvbmQgdGhhdCBwb2ludHMgdG8gYSB0aGlyZAogICBldGMuIEl0IHNlZW1zIHRoZSBMb2NhdGlvbjogcGFyYW1ldGVyIChzYWlkIHRvIGJlIGFuIEFic29sdXRlVVJJIGluCiAgIFJGQzIwNjgpIGlzbid0IGFsd2F5cyBhYnNvbHV0ZS4uIDotLyBBbnl3YXksIEkndmUgbWFkZSBjdXJsIEFUVEVNUFQgdG8gZG8KICAgdGhlIGJlc3QgaXQgY2FuIHRvIGRlYWwgd2l0aCB0aGUgcmVhbGl0eS4KIC0gQWRkZWQgZ2V0bGlua3MucGwgdG8gdGhlIGFyY2hpdmUuIGdldGxpbmtzLnBsIHNlbGVjdGl2ZWx5IGRvd25sb2FkcwogICBmaWxlcyB0aGF0IGEgd2ViIHBhZ2UgbGlua3MgdG8uCgpWZXJzaW9uIDQuOC40CiBEYW5pZWwgU3RlbmJlcmcKIC0gQXMgSnVsaWFuIFJvbWVybyBOaWV0byA8anJvbWVyb0BhbmF5YS5lcz4gcmVwb3J0ZWQsIGN1cmwgcmVwb3J0ZWQgd3JvbmcKICAgdmVyc2lvbiBudW1iZXIuCiAtIEFzIFRlZW11IFlsaS1FbHNpbGEgPHR5bGllbHNpQG1haWwuc3R1ZGVudC5vdWx1LmZpPiBwb2ludGVkIG91dCwKICAgdGhlIHdpbjMyIHZlcnNpb24gb2YgNC44IChhbmQgcHJvYmFibHkgYWxsIG90aGVyIHZlcnNpb25zIGZvciB3aW4zMikKICAgZGlkbid0IHdvcmsgd2l0aCBiaW5hcnkgZmlsZXMgc2luY2UgSSdtIHRvbyB1c2VkIHRvIHRoZSBVTklYIHN0eWxlCiAgIGZvcGVuKCkgd2hlcmUgYmluYXJ5IGFuZCB0ZXh0IGRvbid0IGRpZmZlci4uLgogLSBSYWxwaCBCZWNrbWFubiA8cmFiZUB1bmktcGFkZXJib3JuLmRlPiBicm91Z2h0IG1lIHNvbWUgY2hhbmdlcyB0aGF0IGxldHMKICAgY3VybCBjb21waWxlIGVycm9yIGFuZCB3YXJuaW5nIGZyZWUgd2l0aCAtV2FsbCAtcGVkYW50aWMgd2l0aAogICBnKysuIEkgYWxzbyB0b29rIHRoZSBvcHBvcnR1bml0eSB0byBjbGVhbiBvZmYgc29tZSB1bnVzZWQgdmFyaWFibGVzCiAgIGFuZCBzaW1pbGFyLgogLSBSYWxwaCBCZWNrbWFubiA8cmFiZUB1bmktcGFkZXJib3JuLmRlPiBtYWRlIG1lIGF3YXJlIG9mIGEgcmVhbGx5IG9kZCBidWcKICAgbm93IGNvcnJlY3RlZC4gV2hlbiBjdXJsIHJlYWQgYSBzZXQgb2YgaGVhZGVycyBmcm9tIGEgSFRUUCBzZXJ2ZXIsIGRpdmlkZWQKICAgaW50byBtb3JlIHRoYW4gb25lIHJlYWQgYW5kIHRoZSBmaXJzdCByZWFkIHNob3dlZCBhIGZ1bGwgbGluZSAqZXhhY3RseSoKICAgKGkuZSBlbmRpbmcgd2l0aCBhIG5ld2xpbmUpLCBjdXJsIGRpZCBub3QgYmVoYXZlIHdlbGwuCgpWZXJzaW9uIDQuOC4zCiBEYW5pZWwgU3RlbmJlcmcKIC0gSSB3YXMgdG9vIHF1aWNrIHRvIHJlbGVhc2UgNC44LjIgd2l0aCB0b28gbGl0dGxlIHRlc3RpbmcuIE9uZSBvZiB0aGUKICAgY2hhbmdlcyBpcyBub3cgcmV2ZXJ0ZWQgc2xpZ2h0bHkgdG8gdGhlIDQuOC4xIHdheSBzaW5jZSA0LjguMiBjb3VsZG4ndAogICB1cGxvYWQgZmlsZXMuIEkgc3RpbGwgdGhpbmsgYm90aCBwcm9ibGVtcyBjb3JyZWN0ZWQgaW4gNC44LjIgcmVtYWluCiAgIGNvcnJlY3RlZC4gIFJlcG9ydGVkIGJ5IEp1bGlhbiBSb21lcm8gTmlldG8gPGpyb21lcm9AYW5heWEuZXM+LgoKVmVyc2lvbiA0LjguMgogRGFuaWVsIFN0ZW5iZXJnCiAtIEJlcm5oYXJkIElzZWxib3JuIDxiaXNlbGJvckByaHJrLnVuaS1rbC5kZT4gcmVwb3J0ZWQgdHdvIEZUUCBwcm90b2NvbAogICBlcnJvcnMgY3VybCBkaWQuIFRoZXkncmUgbm93IGNvcnJlY3RlZC4gQm90aCBhcHBlYXJlZCB3aGVuIGdldHRpbmcgZmlsZXMKICAgZnJvbSBhIE1TIEZUUCBzZXJ2ZXIhIDotKQoKVmVyc2lvbiA0LjguMQogRGFuaWVsIFN0ZW5iZXJnCiAtIEFkZGVkIGEgbGFzdCB1cGRhdGUgb2YgdGhlIHByb2dyZXNzIG1ldGVyIHdoZW4gdGhlIHRyYW5zZmVyIGlzIGRvbmUuIFRoZQogICBmaW5hbCBvdXRwdXQgb24gdGhlIHNjcmVlbiBkaWRuJ3QgaGF2ZSB0byBiZSB0aGUgZmluYWwgc2l6ZSB0cmFuc2ZlcmVkCiAgIHdoaWNoIG1hZGUgaXQgc29tZXRpbWVzIGxvb2sgb2RkLgogLSBUaGFua3MgdG8gRGF2aWQgTG9uZyA8bG9uZ0ByZXNlYXJjaC5iZWxsLWxhYnMuY29tPiBJIGdvdCByaWQgb2YgYSBzaWxseQogICBidWcgdGhhdCBoYXBwZW5lZCBpZiBhIEhUVFAtcGFnZSBoYWQgbm90aGluZyBidXQgaGVhZGVyLiBBcHBlYXJhbnRseQogICBTb2xhcmlzIGRlYWxzIHdpdGggbmVnYXRpdmUgc2l6ZXMgaW4gZndyaXRlKCkgY2FsbHMgYSBsb3QgYmV0dGVyIHRoYW4KICAgTGludXggZG9lcy4uLiA9Qi1dCgpWZXJzaW9uIDQuOAogRGFuaWVsIFN0ZW5iZXJnCiAtIENvbnRpbnVlIEZUUCBmaWxlIHRyYW5zZmVyLiAtYyBpcyB0aGUgc3dpdGNoLiBOb3RlIHRoYXQgeW91IG5lZWQgdG8KICAgc3BlY2lmeSBhIGZpbGUgbmFtZSBpZiB5b3Ugd2FubmEgcmVzdW1lIGEgZG93bmxvYWQgKHlvdSBjYW4ndCByZXN1bWUgYQogICBkb3dubG9hZCBzZW50IHRvIHN0ZG91dCkuIFJlc3VtaW5nIHVwbG9hZCBtYXkgYmUgbGltaXRlZCBieSB0aGUgc2VydmVyCiAgIHNpbmNlIGN1cmwgaXMgdGhlbiB1c2luZyB0aGUgbm9uLVJGQzk1OSBjb21tYW5kIFNJWkUgdG8gZ2V0IHRoZSBzaXplIG9mCiAgIHRoZSB0YXJnZXQgZmlsZSBiZWZvcmUgdXBsb2FkIGJlZ2lucyAodG8gZmlndXJlIG91dCB3aGljaCBvZmZzZXQgdG8KICAgdXNlKS4gVXNlIC1DIHRvIHNwZWNpZnkgdGhlIG9mZnNldCB5b3Vyc2VsZiEgLUMgaXMgaGFuZHkgaWYgeW91J3JlIGRvaW5nCiAgIHRoZSBvdXRwdXQgdG8gc29tZXRoaW5nIGVsc2UgYnV0IGEgcGxhaW4gZmlsZSBvciB3aGVuIHlvdSBqdXN0IHdhbnQgdG8gZ2V0CiAgIHRoZSBlbmQgb2YgYSBmaWxlLgogLSByZWN1cnNpdmVmdHBnZXQucGwgbm93IGZlYXR1cmVzIGEgbWF4aW11bSByZWN1cnNpdmUgbGV2ZWwgYXJndW1lbnQuCgpWZXJzaW9uIDQuNwogRGFuaWVsIFN0ZW5iZXJnCiAtIEFkZGVkIHN1cHBvcnQgdG8gYWJvcnQgYSBkb3dubG9hZCBpZiB0aGUgc3BlZWQgaXMgYmVsb3cgYSBjZXJ0YWluIGFtb3VudAogICAoc3BlZWQtbGltaXQpIGJ5dGVzIHBlciBzZWNvbmQgZm9yIGEgY2VydGFpbiAoc3BlZWQtdGltZSkgdGltZS4KIC0gV3JvdGUgYSBwZXJsIHNjcmlwdCAncmVjdXJzaXZlZnRwZ2V0LnBsJyB0byByZWN1cnNpdmVseSB1c2UgY3VybCB0byBnZXQgYQogICB3aG9sZSBmdHAgZGlyZWN0b3J5IHRyZWUuIEl0IGlzIG1lYW50IGFzIGFuIGV4YW1wbGUgb2YgaG93IGN1cmwgY2FuIGJlCiAgIHVzZWQuICBJIGFncmVlIGl0IGlzbid0IHRoZSB3aXNlc3QgdGhpbmcgdG8gZG8gdG8gbWFrZSBhIHNlcGFyYXRlIG5ldwogICBjb25uZWN0aW9uIGZvciBlYWNoIGZpbGUgYW5kIGRpcmVjdG9yeSBmb3IgdGhpcy4KClZlcnNpb24gNC42CiBEYW5pZWwgU3RlbmJlcmcKIC0gQWRkZWQgYSBmaXJzdCBhdHRlbXB0IHRvIG9wdGlvbmFsbHkgcGFyc2UgdGhlIC5uZXRyYyBmaWxlIGZvciBsb2dpbiB1c2VyCiAgIGFuZCBwYXNzd29yZC4gSWYgdXNlZCB3aXRoIGh0dHAsIGl0IGVuYWJsZXMgdXNlciBhdXRoZW50aWNhdGlvbi4gLW4gaXMKICAgdGhlIG5ldyBzd2l0Y2guCiAtIFJlbW92ZWQgdGhlIGV4dHJhIG5ld2xpbmVzIG9uIHRoZSBkZWZhdWx0IHVzZXItYWdlbnQgc3RyaW5nLgogLSBDb3JyZWN0ZWQgdGhlIG1pc3NpbmcgZnRwIHVwbG9hZCBlcnJvciBtZXNzYWdlcyB3aGVuIGl0IGZhaWxlZCB3aXRob3V0IHRoZQogICB2ZXJib3NlIGZsYWcgc2V0LiBHYXJ5IFcuIFN3ZWFyaW5nZW4gZm91bmQgaXQuCiAtIE5vdyB1c2luZyBhbGFybSgpIHRvIGVuYWJsZSBzZWNvbmQtcHJlY2lzaW9uIHRpbWVvdXQgZXZlbiBvbiB0aGUgbmFtZQogICByZXNvbHZpbmcvY29ubmVjdGluZyBwaGFzZS4gVGhlIHRpbWVvdXQgaXMgYWx0aG91Z2ggcmVzZXQgYWZ0ZXIgdGhhdCBmaXJzdAogICBzZXF1ZW5jZS4gKFRoaXMgc2hvdWxkIGJlIGNvcnJlY3RlZC4pIEdhcnkgVy4gU3dlYXJpbmdlbiA8c3dlYXJAYWEubmV0PgogICByZXBvcnRlZC4KIC0gTm93IHNwZWxscyAiVW5rbm93biIgcHJvcGVybHksIGFzIGluICJVbmtub3duIG9wdGlvbiAneiciLi4uIDotKQogLSBBZGRlZCBidWcgcmVwb3J0IGVtYWlsIGFkZHJlc3MgaW4gdGhlIFJFQURNRS4KIC0gQWRkZWQgYSAiY3VycmVudCBzcGVlZCIgZmllbGQgdG8gdGhlIHByb2dyZXNzIG1ldGVyLiBJdCBzaG93cyB0aGUgYXZlcmFnZQogICBzcGVlZCB0aGUgbGFzdCA1IHNlY29uZHMuIFRoZSBvdGhlciBzcGVlZCBmaWVsZCBzaG93cyB0aGUgYXZlcmFnZSBzcGVlZCBvZgogICB0aGUgZW50aXJlIHRyYW5zZmVyIHNvIGZhci4KClZlcnNpb24gNC41LjEKIExpbmFzIFZlcHN0YXMKIC0gU1NMIHRocm91Z2ggcHJveHkgZml4CiAtIEFkZGVkIC1BIHRvIGFsbG93IFVzZXItQWdlbnQ6IGNoYW5nZXMKCiBEYW5pZWwgU3RlbmJlcmcgCiAtIE1hZGUgdGhlIC1BIHdvcmsgd2hlbiBTU0wtdGhyb3VnaC1wcm94eS4KClZlcnNpb24gNC41CiBMaW5hcyBWZXBzdGFzIDxsaW5hc0BsaW5hcy5vcmc+CiAtIE1vcmUgU1NMIGNvcnJlY3Rpb25zCiAtIEkndmUgYWRkZWQgYSBwb3J0IHRvIEFJWC4KIC0gcnVubmluZyBTU0wgdGhyb3VnaCBhIHByb3h5IGNhdXNlcyBhIGNodW5rIG9mIGNvZGUgdG8gYmUgZXhlY3V0cmVkIHR3aWNlLgogICBvbmUgb2YgdGhvc2UgYmxvY2tzIG5lZWRzIHRvIGJlIGRlbGV0ZWQuCgogRGFuaWVsIFN0ZW5iZXJnCiAtIE1hZGUgLWkgYW5kIC1JIHdvcmsgYWdhaW4KClZlcnNpb24gNC40CiBMaW5hcyBWZXBzdGFzIDxsaW5hc0B1cy5pYm0uY29tPgogLSAteCBjYW4gbm93IGFsc28gc3BlY2lmeSBwcm94eXBvcnQgd2hlbiB1c2VkIGFzIGluICdwcm94eWhvc3Q6cHJveHlwb3J0JwogLSBTU0wgZml4ZXMKClZlcnNpb24gNC4zCiBEYW5pZWwgU3RlbmJlcmcKIC0gQWRqdXN0ZWQgdG8gY29tcGlsZSB1bmRlciB3aW4zMiAoVmlzdWFsQysrIDUpLiBUaGUgLVAgc3dpdGNoIGRvZXMgbm90CiAgIHN1cHBvcnQgbmV0d29yayBpbnRlcmZhY2UgbmFtZXMgaW4gd2luMzIuIEkgY291bGRuJ3QgZmlndXJlIG91dCBob3chCgpWZXJzaW9uIDQuMgogTGluYXMgVmVwc3RhcyAvIFNhbXBvIEtlbGxvbWFraQogLSBBZGRlZCBTU0wgLyBTU0xlYXkgc3VwcG9ydCAoaHR0cHM6Ly8pCiAtIEFkZGVkIHRoZSAtVCB1c2FnZSBmb3IgSFRUUCBQT1NULgoKIERhbmllbCBTdGVuYmVyZwogLSBCdWdmaXhlZCB0aGUgU1NMIGltcGxlbWVudGF0aW9uLgogLSBNYWRlIC1QIGEgbG90IGJldHRlciB0byB1c2Ugb3RoZXIgSVAgYWRkcmVzc2VzLiBJdCBub3cgYWNjZXB0cyBhIGZvbGxvd2luZwogICBwYXJhbWV0ZXIgdGhhdCBjYW4gYmUgZWl0aGVyCiAgICAgICAgaW50ZXJmYWNlIC0gaS5lICJldGgwIiB0byBzcGVjaWZ5IHdoaWNoIGludGVyZmFjZSdzIElQIGFkZHJlc3MgeW91CiAgICAgICAgICAgICAgICAgICAgd2FudCB0byB1c2UKICAgICAgICBJUCBhZGRyZXNzIC0gaS5lICIxOTIuMTY4LjEwLjEiIHRvIHNwZWNpZnkgZXhhY3QgSVAgbnVtYmVyCiAgICAgICAgaG9zdCBuYW1lIC0gaS5lICJteS5ob3N0LmRvbWFpbiIgdG8gc3BlY2lmeSBtYWNoaW5lCiAgICAgICAgIi0iICAgICAgIC0gKGFueSBzaW5nbGUtbGV0dGVyIHN0cmluZykgdG8gbWFrZSBpdCBwaWNrIHRoZSBtYWNoaW5lJ3MKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0CiAtIFRoZSBNYWtlZmlsZSBpcyBub3cgcmVhZHkgdG8gY29tcGlsZSBmb3Igc29sYXJpcywgc3Vub3M0IGFuZCBsaW51eCByaWdodAogICBvdXQgb2YgdGhlIGJveC4KIC0gQmV0dGVyIGdlbmVyYXRlZCB2ZXJzaW9uIHN0cmluZyBzZWVuIHdpdGggJ2N1cmwgLVYnCgpWZXJzaW9uIDQuMQogRGFuaWVsIFN0ZW5iZXJnCiAtIFRoZSBJUCBudW1iZXIgcmV0dXJuZWQgYnkgdGhlIGZ0cCBzZXJ2ZXIgYXMgYSByZXBseSB0byBQQVNWIGRvZXMgbm8gbG9uZ2VyCiAgIGhhdmUgdG8gRE5TIHJlc29sdmUuIEluIGZhY3QsIG5vIElQLW51bWJlci1vbmx5IGFkZHJlc3NlcyBoYXZlIHRvIGFueW1vcmUuCiAtIEJpbmRzIGJldHRlciB0byBhdmFpbGFibGUgcG9ydCB3aGVuIC1QIGlzIHVzZWQuCiAtIE5vdyBMSVNUcyAuLyBpbnN0ZWFkIG9mIC8gd2hlbiB1c2VkIGFzIGluIGZ0cDovL2Z0cC5mdW5ldC5maS8uIFRoZSByZWFzb24KICAgZm9yIHRoaXMgaXMgdGhhdCBleGFjdGx5IHRoYXQgc2l0ZSwgZnRwLmZ1bmV0LmZpLCBkb2VzIG5vdCBhbGxvdyBMSVNUIC8KICAgd2hpbGUgTElTVCAuLyBpcyBmaW5lLiBBbnkgb2JqZWN0aW9ucz8KClZlcnNpb24gNCAoMTk5OC0wMy0yMCkKIERhbmllbCBTdGVuYmVyZwogLSBJIHRvb2sgYW5vdGhlciBodWdlIHN0ZXAgYW5kIGNoYW5nZWQgYm90aCB2ZXJzaW9uIG51bWJlciBhbmQgcHJvamVjdCBuYW1lIQogICBUaGUgcmVhc29uIGZvciB0aGUgbmV3IG5hbWUgaXMgdGhhdCB0aGVyZSBhcmUganVzdCBvbmUgdG9vIG1hbnkgcHJvZ3JhbXMKICAgbmFtZWQgdXJsZ2V0IGFscmVhZHkgYW5kIHRoaXMgcHJvZ3JhbSBhbHJlYWR5IGNhbiBhIGxvdCBtb3JlIHRoYW4gbWVyZWx5CiAgIGdldHRpbmcgVVJMcywgYW5kIHRoZSByZWFzb24gZm9yIHRoZSB2ZXJzaW9uIG51bWJlciBpcyB0aGF0IEkgZGlkIGFkZCB0aGUKICAgcHJldHR5IGJpZyBjaGFuZ2UgaW4gLVAgYW5kIHNpbmNlIEkgY2hhbmdlZCBuYW1lIEkgd2FudGVkIHRvIHN0YXJ0IHdpdGgKICAgc29tZXRoaW5nIGZyZXNoIQogLSBUaGUgLS1zdHlsZSBmbGFncyBhcmUgd29ya2luZyBiZXR0ZXIgbm93LgogLSBMaXN0aW5nIGRpcmVjdG9yaWVzIHdpdGggRlRQIG9mdGVuIHJlcG9ydGVkIHRoYXQgdGhlIGZpbGUgdHJhbnNmZXIgd2FzCiAgIGluY29tcGxldGUuIFdyb25nIGFzc3VtcHRpb25zIHdlcmUgdG9vIGNvbW1vbiBmb3IgZGlyZWN0b3JpZXMsIHdoeSBubwogICBzaXplIHdpbGwgYmUgYXR0ZW1wdGVkIHRvIGdldCBjb21wYXJlZCBvbiB0aGVtIGZyb20gbm93IG9uLgogLSBJbXBsZW1lbnRlZCB0aGUgLVAgZmxhZyB0aGF0IGxldCdzIHRoZSBmdHAgY29udHJvbCBpc3N1ZSBhIFBPUlQgY29tbWFuZAogICBpbnN0ZWFkIG9mIHRoZSBzdGFuZGFyZCBQQVNWLgogLSAtYSBmb3IgYXBwZW5kaW5nIEZUUCB1cGxvYWRzIHdvcmtzLgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgpWZXJzaW9uIDMuMTIKIERhbmllbCBTdGVuYmVyZwogLSBFbmQtb2YtaGVhZGVyIHRyYWNraW5nIHN0aWxsIGxhY2tlZCBzdXBwb3J0IGZvciBcclxuIG9yIGp1c3QgXG4gYXQgdGhlCiAgIGVuZCBvZiB0aGUgbGFzdCBoZWFkZXIgbGluZS4KIFNlcmdpbyBCYXJyZXNpIDxzYmFycmVzaUBpbWlzcGEuaXQ+CiAtIEFkZGVkIFBST1hZIGF1dGhlbnRpY2F0aW9uLgogUmFmYWVsIFNhZ3VsYQogLSBGaXhlZCBzb21lIGxpdHRsZSBidWdzLgoKVmVyc2lvbiAzLjExCiBEYW5pZWwgU3RlbmJlcmcKIC0gVGhlIGhlYWRlciBwYXJzaW5nIHdhcyBzdGlsbCBub3QgY29ycmVjdCBzaW5jZSB0aGUgMy4yIG1vZGlmaWNhdGlvbi4uLgoKVmVyc2lvbiAzLjEwCiBEYW5pZWwgU3RlbmJlcmcKIC0gMy43IGFuZCAzLjkgd2VyZSBzaW11bHRhbmVvdXNseSBkZXZlbG9wZWQgYW5kIG1lcmdlZCBpbnRvIHRoaXMgdmVyc2lvbi4KIC0gRlRQIHVwbG9hZCBkaWQgbm90IHdvcmsgY29ycmVjdGx5IHNpbmNlIDMuMi4KClZlcnNpb24gMy45CiBSYWZhZWwgU2FndWxhCiAtIEFkZGVkIHRoZSAiLWUgPHVybD4gLyAtLXJlZmVyZXIgPHVybD4iIG9wdGlvbiB3aGVyZSB3ZSBjYW4gc3BlY2lmeQogICB0aGUgcmVmZXJlciBwYWdlLiBPYnZpb3VzbHksIHRoaXMgaXMgbmVjZXNzYXJ5IG9ubHkgdG8gZm9vbCB0aGUKICAgc2VydmVyLCBidXQuLi4KClZlcnNpb24gMy43CiBEYW5pZWwgU3RlbmJlcmcKIC0gTm93IGNoZWNrcyB0aGUgbGFzdCBlcnJvciBjb2RlIHNlbnQgZnJvbSB0aGUgZnRwIHNlcnZlciBhZnRlciBhIGZpbGUgaGFzCiAgIGJlZW4gcmVjZWl2ZWQgb3IgdXBsb2FkZWQuIFdhc24ndCBkb25lIHByZXZpb3VzbHkuCiAtIFdoZW4gJ3VybGdldCA8aG9zdD4nIGlzIHVzZWQgd2l0aG91dCBhICdwcm90b2NvbDovLycgZmlyc3QgaW4gdGhlIGhvc3QgcGFydCwKICAgaXQgbm93IGNoZWNrcyBmb3IgaG9zdCBuYW1lcyBzdGFydGluZyB3aXRoIGZ0cCBvciBnb3BoZXIgYW5kIGlmIGl0IGRvZXMsCiAgIGl0IHVzZXMgdGhhdCBwcm90b2NvbCBieSBkZWZhdWx0IGluc3RlYWQgb2YgaHR0cC4KClZlcnNpb24gMy42CiBEYW5pZWwgU3RlbmJlcmcKIC0gU2lsbHkgbWlzdGFrZSBtYWRlIHRoZSBQT1NUIGJ1Zy4gVGhpcyBoYXMgbm93IGFsc28gYmVlbiB0ZXN0ZWQgdG8gd29yayB3aXRoCiAgIHByb3h5LgoKVmVyc2lvbiAzLjUKIERhbmllbCBTdGVuYmVyZwogLSBIaWdobHkgaW5zcGlyZWQgYnkgUmFmYWVsIFNhZ3VsYSdzIGNoYW5nZXMgdG8gdGhlIDMuMSB0aGF0IGFkZGVkIGFuIGFsbW9zdAogICBmdW5jdGlvbmFsIFBPU1QsIEkgYXBwbGllZCBoaXMgY2hhbmdlcyBpbnRvIHRoaXMgdmVyc2lvbiBhbmQgbWFkZSB0aGVtIHdvcmsuCiAgIChJdCBzZWVtcyBQT1NUIHJlcXVpcmVzIHRoZSBDb250ZW50LVR5cGUgYW5kIENvbnRlbnQtTGVuZ3RoIGhlYWRlcnMuKSBJdCBpcwogICBub3cgdXNhYmxlIHdpdGggdGhlIC1kIHN3aXRjaC4KClZlcnNpb24gMy4zIC0gMy40CiBQYXNzZWQgdG8gYXZvaWQgY29uZnVzaW9ucwoKVmVyc2lvbiAzLjIKIERhbmllbCBTdGVuYmVyZwogLSBNYWpvciByZXdyaXRlIG9mIHR3byBjcnVjaWFsIHBhcnRzIG9mIHRoaXMgY29kZTogdXBsb2FkIGFuZCBkb3dubG9hZC4KICAgVGhleSBhcmUgYm90aCBub3cgdXNpbmcgYSBzZWxlY3QoKSBzd2l0Y2gsIHRoYXQgYWxsb3dzIG11Y2ggYmV0dGVyCiAgIHByb2dyZXNzIG1ldGVyIGFuZCB0aW1lIGNvbnRyb2wuIAogLSBhbGFybSgpIHVzYWdlIHJlbW92ZWQgY29tcGxldGVseQogLSBGVFAgZ2V0IGNhbiBub3cgbGlzdCBkaXJlY3RvcnkgY29udGVudHMgaWYgdGhlIHBhdGggZW5kcyB3aXRoIGEgc2xhc2ggJy8nLgogICBVcmxnZXQgb24gYSBmdHAtcGF0aCB0aGF0IGRvZXNuJ3QgZW5kIHdpdGggYSBzbGFzaCBtZWFucyB1cmxnZXQgd2lsbAogICBhdHRlbXB0IGdldHRpbmcgaXQgYXMgYSBmaWxlIG5hbWUuCiAtIEZUUCBkaXJlY3RvcnkgdmlldyBzdXBwb3J0cyAtbCBmb3IgImxpc3Qtb25seSIgd2hpY2ggbGlzdHMgdGhlIGZpbGUgbmFtZXMKICAgb25seS4KIC0gQWxsIG9wZXJhdGlvbnMgc3VwcG9ydCAtbSBmb3IgbWF4IHRpbWUgdXNhZ2UgaW4gc2Vjb25kcyBhbGxvd2VkLgogLSBGVFAgdXBsb2FkIG5vdyBhbGxvd3MgdGhlIHNpemUgb2YgdGhlIHVwbG9hZGVkIGZpbGUgdG8gYmUgcHJvdmlkZWQsIGFuZAogICB0aHVzIGl0IGNhbiBiZXR0ZXIgY2hlY2sgaXQgYWN0dWFsbHkgdXBsb2FkZWQgdGhlIHdob2xlIGZpbGUuIEl0IGFsc28KICAgbWFrZXMgdGhlIHByb2dyZXNzIG1ldGVyIGZvciB1cGxvYWRzIG11Y2ggYmV0dGVyIQogLSBNYWRlIHRoZSBwYXJhbWV0ZXIgcGFyc2luZyBmYWlsIGluIGNhc2VzIGxpa2UgJ3VybGdldCAtciA5MDAnIHdoaWNoCiAgIHByZXZpb3VzbHkgdHJpZWQgdG8gY29ubmVjdCB0byB0aGUgaG9zdCBuYW1lZCAnOTAwJy4KClZlcnNpb24gMy4xCiBLamVsbCBFcmljc29uCiAtIFBvaW50ZWQgb3V0IGhvdyB0byBjb3JyZWN0IHRoZSAzIHdhcm5pbmdzIGluIHdpbjMyLWNvbXBpbGVzLgoKIERhbmllbCBTdGVuYmVyZwogLSBSZW1vdmVkIGFsbCBjYWxscyB0byBleGl0KCkuCiAtIE1hZGUgdGhlIHNob3J0IGhlbHAgdGV4dCBnZXQgd3JpdHRlbiB0byBzdGRvdXQgaW5zdGVhZCBvZiBzdGRlcnIuCiAtIE1hZGUgdGhpcyBmaWxlIGluc3RlYWQgb2Yga2VlcGluZyB0aGVzZSBjb21tZW50cyBpbiB0aGUgc291cmNlLgogLSBNYWRlIHR3byBjYWxsYmFjayBob29rcywgdGhhdCBlbmFibGUgZXh0ZXJuYWwgcHJvZ3JhbXMgdG8gdXNlIHVybGdldCgpCiAgIGVhc2llciBhbmQgdG8gZ3JhYiB0aGUgb3V0cHV0L29mZmVyIHRoZSBpbnB1dCBlYXNpZXIuCiAtIEl0IGlzIGV2aWRlbnQgdGhhdCBXaW4zMi1jb21waWxlcyBhcmUgcGFpbmZ1bC4gSSB3YXRjaGVkIHRoZSBvdXRwdXQgZnJvbQogICB0aGUgQm9ybGFuZCBDKysgdjUgYW5kIGl0IHdhcyBhd2Z1bC4gSnVzdCBpZ25vcmUgYWxsIHRob3NlIHdhcm5pbmdzLgoKVmVyc2lvbiAzLjAKIERhbmllbCBTdGVuYmVyZwogLSBBZGRlZCBGVFAgdXBsb2FkIGNhcGFiaWxpdGllcy4gVGhlIG5hbWUgdXJsZ2V0IGdldHMgYSBiaXQgc2lsbHkgbm93CiAgIHdoZW4gd2UgY2FuIHB1dCB0b28uLi4gPSkKIC0gUmVzdHJ1Y3R1cmVkIHRoZSBzb3VyY2UgcXVpdGUgYSBsb3QuCiAgIENoYW5nZWQgdGhlIHVybGdldCgpIGludGVyZmFjZS4gVGhpcyB3YXksIHdlIHdpbGwgc3Vydml2ZSBjaGFuZ2VzIG11Y2gKICAgYmV0dGVyLiBOZXcgZmVhdHVyZXMgY2FuIGNvbWUgYW5kIG9sZCBjYW4gYmUgcmVtb3ZlZCB3aXRob3V0IHVzIG5lZWRpbmcKICAgdG8gY2hhbmdlIHRoZSBpbnRlcmZhY2UuIEkndmUgd3JpdHRlbiBhIHNtYWxsIGV4cGxhbmF0aW9uIGluIHVybGdldC5oCiAgIHRoYXQgZXhwbGFpbnMgaXQuCiAtIE5ldyBmbGFncyBpbmNsdWRlIC10LCAtVCwgLU8gYW5kIC1oLiBUaGUgLWggdGV4dCBpcyBnZW5lcmF0ZWQgYnkgdGhlIG5ldwogICBta2hlbHAgc2NyaXB0LgoKVmVyc2lvbiAyLjkKIFJlbWNvIHZhbiBIb29mZgogLSBBZGRlZCBhIGZpeCB0byBtYWtlIGl0IGNvbXBpbGUgc21vb3RobHkgb24gQW1pZ2EgdXNpbmcgdGhlIFNBUy9DCiAgIGNvbXBpbGVyLgogIAogRGFuaWVsIFN0ZW5iZXJnCiAtIEJlbGlldmUgaXQgb3Igbm90LCBidXQgdGhlIFNUVVBJRCBOb3ZlbGwgd2ViIHNlcnZlciBzZWVtcyB0byByZXF1aXJlCiAgIHRoYXQgdGhlIEhvc3Q6IGtleXdvcmQgaXMgdXNlZCwgc28gd2VsbCBJIHVzZSBpdCBhbmQgSSAocmUtaW50cm9kdWNlKSB0aGUKICAgdXJsZ2V0IFVzZXItQWdlbnQ6LiBJIHN0aWxsIGhhdmUgdG8gY2hlY2sgdGhhdCB0aGlzIEhvc3Q6IHVzYWdlIHdvcmtzIHdpdGgKICAgcHJveGllcy4uLiAnSG9zdDonIGlzIHJlcXVpcmVkIGZvciBIVFRQLzEuMSBHRVQgYWNjb3JkaW5nIHRvIFJGQzIwNjguCgpWZXJzaW9uIDIuOAogUmFmYWVsIFNhZ3VsYQogLSBzb21lIGxpdHRsZSBtb2RpZmljYXRpb25zCgpWZXJzaW9uIDIuNwogRGFuaWVsIFN0ZW5iZXJnCiAtIFJlbW92ZWQgdGhlIC1sIG9wdGlvbiBhbmQgaW50cm9kdWNlZCB0aGUgLWYgb3B0aW9uIGluc3RlYWQuIE5vdyBJJ2xsCiAgIHJld3JpdGUgdGhlIGZvcm1lciAtbCBrbHVkZ2UgaW4gYW4gZXh0ZXJuYWwgc2NyaXB0IHRoYXQnbGwgdXNlIHVybGdldCB0bwogICBmZXRjaCBtdWx0aXBhcnQgZmlsZXMgbGlrZSB0aGF0LgogLSAnLWYnIGlzIGludHJvZHVjZWQsIGl0IG1lYW5zIEZhaWwgd2l0aG91dCBvdXRwdXQgaW4gY2FzZSBvZiBIVFRQIHNlcnZlcgogICBlcnJvcnMgKHJldHVybiBjb2RlID49MzAwKS4KIC0gQWRkZWQgc3VwcG9ydCBmb3IgLXIsIHJhbmdlcy4gU3BlY2lmeSB3aGljaCBwYXJ0IG9mIGEgZG9jdW1lbnQgeW91IAogICB3YW50LCBhbmQgb25seSB0aGF0IHBhcnQgaXMgcmV0dXJuZWQuIE9ubHkgd2l0aCBIVFRQLzEuMS1zZXJ2ZXJzLgogLSBTcGxpdCB1cCB0aGUgc291cmNlIGluIDMgcGFydHMuIE5vdyBhbGwgcHVyZSBVUkwgZnVuY3Rpb25zIGFyZSBpbgogICB1cmxnZXQuYyBhbmQgc3R1ZmYgdGhhdCBkZWFscyB3aXRoIHRoZSBzdGFuZC1hbG9uZSBwcm9ncmFtIGlzIGluIG1haW4uYy4KIC0gSSB0b29rIGEgZmV3IG1pbnV0ZXMgYW5kIHdyb3RlIGFuIGVtYnJ5byBvZiBhIFJFQURNRSBmaWxlIHRvIGV4cGxhaW4KICAgYSBmZXcgdGhpbmdzLgoKVmVyc2lvbiAyLjYKIERhbmllbCBTdGVuYmVyZwogLSBNYWRlIHRoZSAtbCAobG9vcCkgdGhpbmcgdXNlIHRoZSBuZXcgQ09ORl9GQUlMT05FUlJPUiB3aGljaCBtYWtlcwogICB1cmxnZXQoKSByZXR1cm4gZXJyb3IgY29kZSBpZiBub24tc3VjY2Vzc2Z1bC4gSXQgYWxzbyB3b24ndCBvdXRwdXQgYW55dGhpbmcKICAgdGhlbi4gTm93IGZpbmFsbHkgcmVtb3ZlZCB0aGUgSFRUUCAxLjAgYW5kIGVycm9yIDQwNCBkZXBlbmRlbmNpZXMuCiAtIEFkZGVkIC1JIHdoaWNoIHVzZXMgdGhlIEhFQUQgcmVxdWVzdCB0byBnZXQgdGhlIGhlYWRlciBvbmx5IGZyb20gYQogICBodHRwLXNlcnZlci4KClZlcnNpb24gMi41CiBSYWZhZWwgU2FndWxhCiAtIE1hZGUgdGhlIHByb2dyZXNzIG1ldGVyIHVzZSBISEg6TU06U1MgaW5zdGVhZCBvZiBvbmx5IHNlY29uZHMuCgpWZXJzaW9uIDIuNAogRGFuaWVsIFN0ZW5iZXJnCiAtIEFkZGVkIHByb2dyZXNzIG1ldGVyLiBJdCBhcHBlYXJzIHdoZW4gZG93bmxvYWRpbmcgPiBCVUZGRVIgU0laRSBhbmQKICAgbXV0ZSBpcyBub3Qgc2VsZWN0ZWQuIEkgZm91bmQgb3V0IHRoYXQgd2hlbiBkb3dubG9hZGluZyBsYXJnZSBmaWxlcyBmcm9tCiAgIHJlYWxseSByZWFsbHkgc2xvdyBzaXRlcywgaXQgaXMgZGVzaXJhYmxlIHRvIGtub3cgdGhlIHN0YXR1cyBvZiB0aGUKICAgZG93bmxvYWQuIERvIG5vdGUgdGhhdCBzb21lIGRvd25sb2FkcyBhcmUgZG9uZSB1bmF3YXJpbmcgb2YgdGhlIHNpemUsIHdoaWNoCiAgIG1ha2VzIHRoZSBwcm9ncmVzcyBtZXRlciBsZXNzIHRocmlsbGluZyA7KSBJZiB0aGUgb3V0cHV0IGlzIHNlbnQgdG8gYSB0dHksCiAgIHRoZSBwcm9ncmVzcyBtZXRlciBpcyBzaHV0IG9mZi4KIC0gSW5jcmVhc2VkIGJ1ZmZlciBzaXplIHVzZWQgZm9yIHJlYWRpbmcuCiAtIEFkZGVkIGxlbmd0aCBjaGVja3MgaW4gdGhlIHVzZXIrcGFzc3dkIHBhcnNpbmcuCiAtIE1hZGUgaXQgZ3JvayB1c2VyK3Bhc3N3ZCBmb3IgSFRUUCBmZXRjaGVzLiBUaGUgdHJpY2sgaXMgdG8gYmFzZTY0CiAgIGVuY29kZSB0aGUgdXNlcitwYXNzd2QgYW5kIHNlbmQgYW4gZXh0cmEgaGVhZGVyIGxpbmUuIFJlYWQgY2hhcHRlciAxMS4xIGluCiAgIFJGQzIwNjggZm9yIGRldGFpbHMuIEkgYWRkZWQgaXQgdG8gYmUgdXNlZCBqdXN0IGxpa2UgdGhlIGZ0cCBvbmUuICBUbyBnZXQgYQogICBodHRwIGRvY3VtZW50IGZyb20gYSBwbGFjZSB0aGF0IHJlcXVpcmVzIHVzZXIgYW5kIHBhc3N3b3JkLCB1c2UgYW4gVVJMCiAgIGxpa2U6CgogICAgICAgIGh0dHA6Ly91c2VyOnBhc3N3ZEB3d3cuc2l0ZS50by5sZWFjaC9kb2MuaHRtbAoKICAgSSBhbHNvIGFkZGVkIHRoZSAtdSBmbGFnLCBzaW5jZSBXSEVOIFVTSU5HIEEgUFJPWFkgWU9VIENBTidUIFNQRUNJRlkgVEhFCiAgIFVTRVIgQU5EIFBBU1NXT1JEIFdJVEggSFRUUCBMSUtFIFRIQVQuIFRoZSAtdSBmbGFnIHdvcmtzIGZvciBmdHAgdG9vLCBidXQKICAgbm90IGlmIHVzZWQgd2l0aCBwcm94eS4gVG8gZG8gdGhlIHNhbWUgYXMgdGhlIGFib3ZlIG9uZSwgeW91IGNhbiBpbnZva2U6CgogICAgICAgIHVybGdldCAtdSB1c2VyOnBhc3N3ZCBodHRwOi8vd3d3LnNpdGUudG8ubGVhY2gvZG9jLmh0bWwKClZlcnNpb24gMi4zCiBSYWZhZWwgU2FndWxhCiAtIEFkZGVkICItbyIgb3B0aW9uIChvdXRwdXQgZmlsZSkKIC0gQWRkZWQgVVJHX0hUVFBfTk9UX0ZPVU5EIHJldHVybiBjb2RlLgogICAoRGFuaWVsJ3Mgbm90ZTopCiAgIFBlcmhhcHMgd2Ugc2hvdWxkIGRldGVjdCBhbGwga2luZHMgb2YgZXJyb3JzIGFuZCBpbnN0ZWFkIG9mIHdyaXRpbmcgdGhhdAogICBjdXN0b20gc3RyaW5nIGZvciB0aGUgcGFydGljdWxhciA0MDQtZXJyb3IsIHVzZSB0aGUgZXJyb3IgdGV4dCB3ZSBhY3R1YWxseQogICBnZXQgZnJvbSB0aGUgc2VydmVyLiBTZWUgZnVydGhlciBkZXRhaWxzIGluIFJGQzIwNjggKEhUVFAgMS4xCiAgIGRlZmluaXRpb24pLiBUaGUgY3VycmVudCB3YXkgYWxzbyByZWxpZXMgb24gYSBIVFRQLzEuMCByZXBseSwgd2hpY2ggbmV3ZXIKICAgc2VydmVycyBtaWdodCBub3QgZG8uCiAtIExvb3BpbmcgbW9kZSAoIi1sIiBvcHRpb24pLiBJdCdzIGVhc2llciB0byBnZXQgdmFyaW91cyBzcGxpdCBmaWxlcy4KICAgKERhbmllbCdzIG5vdGU6KQogICBVc2UgaXQgbGlrZSAndXJsZ2V0IC1sIDEgaHR0cDovL2Zyb20udGhpcy5zaXRlL2ZpbGUlZC5odG1sJywgd2hpY2ggd2lsbAogICBtYWtlIHVybGdldCB0byBhdHRlbXB0IHRvIGZldGNoIGFsbCBmaWxlcyBuYW1lZCBmaWxlMS5odG1sLCBmaWxlMi5odG1sIGV0YwogICB1bnRpbCBubyBtb3JlIGZpbGVzIGFyZSBmb3VuZC4gVGhpcyBpcyBvbmx5IGEgbW9kaWZpY2F0aW9uIG9mIHRoZQogICBTVEFORF9BTE9ORSBwYXJ0LCBub3RoaW5nIGluIHRoZSB1cmxnZXQoKSBmdW5jdGlvbiB3YXMgbW9kZmlmaWVkIGZvciB0aGlzLgogRGFuaWVsIFN0ZW5iZXJnCiAtIENoYW5nZWQgdGhlIC1oIHRvIGJlIC1pIGluc3RlYWQuIC1oIHNob3VsZCBiZSBwcmVzZXJ2ZWQgdG8gaGVscCB1c2UuCiAtIEJqb3JuIFJlZXNlIGluZGljYXRlZCB0aGF0IEJvcmxhbmQgX21pZ2h0XyB1c2UgJ19XSU4zMicgaW5zdGVhZCBvZiB0aGUKICAgVkMrKyBXSU4zMiBkZWZpbmUgYW5kIHRoZXJlZm9yZSBJIGFkZGVkIGEgbGl0dGxlIGZpeCBmb3IgdGhhdC4KClZlcnNpb24gMi4yCiBKb2hhbiBBbmRlcnNzb24KIC0gVGhlIHVybGdldCBmdW5jdGlvbiBkaWRuJ3Qgc2V0IHRoZSBwYXRoIHRvIHVybCB3aGVuIHVzaW5nIHByb3h5LgogLSBGaXhlZCBidWcgd2l0aCBJTUMgcHJveHkuIE5vdyB1c2luZyAoYWxtb3N0KSBjb21wbGV0ZSBHRVQgY29tbWFuZC4KICAKIERhbmllbCBTdGVuYmVyZwogLSBNYWRlIGl0IGNvbXBpbGUgb24gU29sYXJpcy4gSGFkIHRvIHJlb3JnYW5pemUgdGhlIGluY2x1ZGVzIGEgYml0LgogICAoc28gV2luMzIsIExpbnV4LCBTdW5PUyA0IGFuZCBTb2xhcmlzIDIgY29tcGlsZSBmaW5lLikKIC0gTWFkZSBKb2hhbidzIGtlZXBhbGl2ZSBrZXl3b3JkIG9wdGlvbmFsIHdpdGggdGhlIC1rIGZsYWcgKHNpbmNlIGl0CiAgIG1ha2VzIGEgbG90IG9mIHVybGdldHMgdGFrZSBhIGxvdCBsb25nZXIgdGltZSkuCiAtIE1hZGUgYSAnLWgnIHN3aXRjaCBpbiBjYXNlIHlvdSB3YW50IHRoZSBIVFRQLWhlYWRlciBpbiB0aGUgb3V0cHV0LgoKVmVyc2lvbiAyLjEKIERhbmllbCBTdGVuYmVyZyBhbmQgS2plbGwgRXJpY3NvbgogLSBXaW4zMi1jb21waWxhYmxlCiAtIE5vIG1vcmUgZ2xvYmFsIHZhcmlhYmxlcwogLSBNdXRlIG9wdGlvbiAobm8gb3V0cHV0IGF0IGFsbCB0byBzdGRlcnIpCiAtIEZ1bGwgcmFuZ2Ugb2YgcmV0dXJuIGNvZGVzIGZyb20gdXJsZ2V0KCksIHdoaWNoIGlzIG5vdyB3cml0dGVuIHRvIGJlIGEKICAgZnVuY3Rpb24gZm9yIGVhc3ktdG8tdXNlIGluIFtvdGhlcl0gcHJvZ3JhbXMuCiAtIERlZmluZSBTVEFORF9BTE9ORSB0byBjb21waWxlIHRoZSBzdGFuZCBhbG9uZSB1cmxnZXQgcHJvZ3JhbQogLSBOb3cgY29tcGlsZXMgd2l0aCBnY2Mgb3B0aW9ucyAtYW5zaSAtV2FsbCAtcGVkYW50aWMgOykKClZlcnNpb24gMi4wCiAtIEludHJvZHVjaW5nIGZ0cCBHRVQgc3VwcG9ydC4gVGhlIEZUUCBVUkwgdHlwZSBpcyByZWNvZ25pemVkIGFuZCB1c2VkLgogLSBSZW5hbWVkIHRoZSBwcm9qZWN0IHRvICd1cmxnZXQnLgogLSBTdXBwb3J0cyB0aGUgdXNlcitwYXNzd2QgaW4gdGhlIEZUUCBVUkwgKG90aGVyd2lzZSBpdCB0cmllcyBhbm9ueW1vdXMKICAgbG9naW4gd2l0aCBhIHdlaXJkIGVtYWlsIGFkZHJlc3MgYXMgcGFzc3dvcmQpLgoKVmVyc2lvbiAxLjUKIERhbmllbCBTdGVuYmVyZwogLSBUaGUgc2tpcF9oZWFkZXIoKSBjcmFwIG1lc3NlZCBpdCB1cCBiaWctdGltZS4gQnkgc2ltcGx5IHJlbW92aW5nIHRoYXQKICAgb25lIHdlIGNhbiBhbGwgb2YgYSBzdWRkZW4gZG93bmxvYWQgYW55dGhpbmcgOykKIC0gTm8gbG9uZ2VyIHJlcXVpcmVzIGEgdHJhaWxpbmcgc2xhc2ggb24gdGhlIFVSTHMuCiAtIElmIHRoZSBnaXZlbiBVUkwgaXNuJ3QgcHJlZml4ZWQgd2l0aCAnaHR0cDovLycsIEhUVFAgaXMgYXNzdW1lZCBhbmQKICAgZ2l2ZW4gYSB0cnkhCiAtICd2b2lkIG1haW4oKScgaXMgaGlzdG9yeS4KClZlcnNpb24gMS40CiBEYW5pZWwgU3RlbmJlcmcKIC0gVGhlIGdvcGhlciBzb3VyY2UgdXNlZCB0aGUgcHBhdGggdmFyaWFibGUgaW5zdGVhZCBvZiBwYXRoIHdoaWNoIGNvdWxkCiAgIGxlYWQgdG8gZGlzYXN0ZXIuCgpWZXJzaW9uIDEuMwogRGFuaWVsIFN0ZW5iZXJnCiAtIFdlbGwsIEkgYWRkZWQgYSBsYW1lIHRleHQgYWJvdXQgdGhlIHRpbWUgaXQgdG9vayB0byBnZXQgdGhlIGRhdGEuIEkgYWxzbwogICBmb3VnaHQgYWdhaW5zdCBKb2hhbiB0byBwcmV2ZW50IGhpcyAtZiBvcHRpb24gKHRvIHNwZWNpZnkgYSBmaWxlIG5hbWUKICAgdGhhdCBzaG91bGQgYmUgd3JpdHRlbiBpbnN0ZWFkIG9mIHN0ZG91dCkhID0pCiAtIE1hZGUgaXQgd3JpdGUgJ2Nvbm5lY3Rpb24gcmVmdXNlZCcgZm9yIHRoYXQgcGFydGljdWxhciBjb25uZWN0KCkKICAgcHJvYmxlbS4KIC0gUmVudW1iZXJlZCB0aGUgdmVyc2lvbi4gTGV0J3Mgbm90IG1ha2Ugc2lsbHkgMS4wLlggdmVyc2lvbnMsIHRoaXMgaXMKICAgYSBwbGFpbiAxLjMgaW5zdGVhZC4KClZlcnNpb24gMS4yCiBKb2hhbiBBbmRlcnNzb24KIC0gRGlzY292ZXJlZCBhbmQgZml4ZWQgdGhlIHByb2JsZW0gd2l0aCBnZXR0aW5nIGJpbmFyeSBmaWxlcy4gcHV0cygpIGlzCiAgIG5vdyByZXBsYWNlZCB3aXRoIGZ3cml0ZSgpLiAoRGFuaWVsJ3Mgbm90ZTogdGhpcyBhbHNvIGZpeGVkIHRoZSBidWZmZXIKICAgb3ZlcndyaXRlIHByb2JsZW0gSSBmb3VuZCBpbiB0aGUgcHJldmlvdXMgdmVyc2lvbi4pCgogUmFmYWVsIFNhZ3VsYSA8c2FndWxhQGluZi51ZnJncy5icj4KIC0gTGV0ICItcCIgYmVmb3JlICIteCIuCgogRGFuaWVsIFN0ZW5iZXJnIDxEYW5pZWwuU3RlbmJlcmdAc3RoLmZyb250ZWMuc2U+CiAtIEJ1Z2ZpeGVkIHRoZSBwcm94eSB1c2FnZS4gSXQgc2hvdWxkICpOT1QqIHVzZSBub3Igc3RyaXAgdGhlIHBvcnQgbnVtYmVyCiAgIGZyb20gdGhlIFVSTCBidXQgc2ltcGx5IHBhc3MgdGhhdCBpbmZvcm1hdGlvbiB0byB0aGUgcHJveHkuIFRoaXMgYWxzbwogICBtYWRlIHRoZSB1c2VyL3Bhc3N3b3JkIGZpZWxkcyBwb3NzaWJsZSB0byB1c2UgaW4gcHJveHkgW2Z0cC1dIFVSTHMuCiAgIChsaWtlIGluIGZ0cDovL3VzZXI6cGFzc3dvcmRAZnRwLm15LnNpdGU6ODAyMS9SRUFETUUpCgogSm9oYW4gQW5kZXJzc29uIDxqb2hhbkBob21lbWFpbC5jb20+CiAtIEltcGxlbWVudGVkIEhUVFAgcHJveHkgc3VwcG9ydC4KIC0gUmVjZWl2ZSBieXRlIGNvdW50ZXIgYWRkZWQuCgogQmpvcm4gUmVlc2UgPGJyZWVzZUBpbWFkYS5vdS5kaz4KIC0gSW1wbGVtZW50ZWQgVVJMcyAoYW5kIHNraXBwZWQgdGhlIG9sZCBzeW50YXgpLgogLSBPdXRwdXQgaXMgd3JpdHRlbiB0byBzdGRvdXQsIHNvIHRvIGFjaGlldmUgdGhlIGFib3ZlIGV4YW1wbGUsIGRvOgogICBodHRwZ2V0IGh0dHA6Ly8xNDMuNTQuMTAuNi9pbmZvX2xvZ28uZ2lmID4gdGVzdC5naWYKClZlcnNpb24gMS4xCiBEYW5pZWwgU3RlbmJlcmcgPERhbmllbC5TdGVuYmVyZ0BzdGguZnJvbnRlYy5zZT4KIC0gQWRqdXN0ZWQgaXQgc2xpZ2h0bHkgdG8gYWNjZXB0IG5hbWVkIGhvc3RzIG9uIHRoZSBjb21tYW5kIGxpbmUuIFdlCiAgIHdvdWxkbid0IHdhbm5hIHVzZSBJUCBudW1iZXJzIGZvciB0aGUgcmVzdCBvZiBvdXIgbGlmZXMsIHdvdWxkIHdlPwoKVmVyc2lvbiAxLjAKICBSYWZhZWwgU2FndWxhIDxzYWd1bGFAaW5mLnVmcmdzLmJyPgogIC0gV3JvdGUgdGhlIGluaXRpYWwgaHR0cGdldCwgd2hpY2ggc3RhcnRlZCBhbGwgdGhpcyEK