CiAgICAgICAgICAgICAgICBDaGFuZ2VMb2cgZmlsZSBmb3IgemxpYgoKQ2hhbmdlcyBpbiAxLjIuNyAoMiBNYXkgMjAxMikKLSBSZXBsYWNlIHVzZSBvZiBtZW1tb3ZlKCkgd2l0aCBhIHNpbXBsZSBjb3B5IGZvciBwb3J0YWJpbGl0eQotIFRlc3QgZm9yIGV4aXN0ZW5jZSBvZiBzdHJlcnJvcgotIFJlc3RvcmUgZ3pnZXRjXyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIDEuMi42Ci0gRml4IGJ1aWxkIHdpdGggbm9uLUdOVSBtYWtlIG9uIFNvbGFyaXMKLSBSZXF1aXJlIGdjYyA0LjAgb3IgbGF0ZXIgb24gTWFjIE9TIFggdG8gdXNlIHRoZSBoaWRkZW4gYXR0cmlidXRlCi0gSW5jbHVkZSB1bmlzdGQuaCBmb3IgV2F0Y29tIEMKLSBVc2UgX19XQVRDT01DX18gaW5zdGVhZCBvZiBfX1dBVENPTV9fCi0gRG8gbm90IHVzZSB0aGUgdmlzaWJpbGl0eSBhdHRyaWJ1dGUgaWYgTk9fVklaIGRlZmluZWQKLSBJbXByb3ZlIHRoZSBkZXRlY3Rpb24gb2Ygbm8gaGlkZGVuIHZpc2liaWxpdHkgYXR0cmlidXRlCi0gQXZvaWQgdXNpbmcgX19pbnQ2NCBmb3IgZ2NjIG9yIHNvbG8gY29tcGlsYXRpb24KLSBDYXN0IHRvIGNoYXIgKiBpbiBnenByaW50ZiB0byBhdm9pZCB3YXJuaW5ncyBbWmluc2VyXQotIEZpeCBtYWtlX3Ztcy5jb20gZm9yIFZBWCBbWmluc2VyXQotIERvbid0IHVzZSBsaWJyYXJ5IG9yIGJ1aWx0LWluIGJ5dGUgc3dhcHMKLSBTaW1wbGlmeSB0ZXN0IGFuZCB1c2Ugb2YgZ2NjIGhpZGRlbiBhdHRyaWJ1dGUKLSBGaXggYnVnIGluIGd6Y2xvc2VfdygpIHdoZW4gZ3p3cml0ZSgpIGZhaWxzIHRvIGFsbG9jYXRlIG1lbW9yeQotIEFkZCAieCIgKE9fRVhDTCkgYW5kICJlIiAoT19DTE9FWEVDKSBtb2RlcyBzdXBwb3J0IHRvIGd6b3BlbigpCi0gRml4IGJ1ZyBpbiB0ZXN0L21pbmlnemlwLmMgZm9yIGNvbmZpZ3VyZSAtLXNvbG8KLSBGaXggY29udHJpYi92c3R1ZGlvIHByb2plY3QgbGluayBlcnJvcnMgW01vaGFuYXRoYXNdCi0gQWRkIGFiaWxpdHkgdG8gY2hvb3NlIHRoZSBidWlsZGVyIGluIG1ha2Vfdm1zLmNvbSBbU2Nod2VkYV0KLSBBZGQgREVTVERJUiBzdXBwb3J0IHRvIG1pbmd3MzIgd2luMzIvTWFrZWZpbGUuZ2NjCi0gRml4IGNvbW1lbnRzIGluIHdpbjMyL01ha2VmaWxlLmdjYyBmb3IgcHJvcGVyIHVzYWdlCi0gQWxsb3cgb3ZlcnJpZGluZyB0aGUgZGVmYXVsdCBpbnN0YWxsIGxvY2F0aW9ucyBmb3IgY21ha2UKLSBHZW5lcmF0ZSBhbmQgaW5zdGFsbCB0aGUgcGtnLWNvbmZpZyBmaWxlIHdpdGggY21ha2UKLSBCdWlsZCBib3RoIGEgc3RhdGljIGFuZCBhIHNoYXJlZCB2ZXJzaW9uIG9mIHpsaWIgd2l0aCBjbWFrZQotIEluY2x1ZGUgdmVyc2lvbiBzeW1ib2xzIGZvciBjbWFrZSBidWlsZHMKLSBJZiB1c2luZyBjbWFrZSB3aXRoIE1TVkMsIGFkZCB0aGUgc291cmNlIGRpcmVjdG9yeSB0byB0aGUgaW5jbHVkZXMKLSBSZW1vdmUgdW5uZWVkZWQgRVhUUkFfQ0ZMQUdTIGZyb20gd2luMzIvTWFrZWZpbGUuZ2NjIFtUcnV0YV0KLSBNb3ZlIG9ic29sZXRlIGVteCBtYWtlZmlsZSB0byBvbGQgW1RydXRhXQotIEFsbG93IHRoZSB1c2Ugb2YgLVd1bmRlZiB3aGVuIGNvbXBpbGluZyBvciB1c2luZyB6bGliCi0gQXZvaWQgdGhlIHVzZSBvZiB0aGUgLXUgb3B0aW9uIHdpdGggbWt0ZW1wCi0gSW1wcm92ZSBpbmZsYXRlKCkgZG9jdW1lbnRhdGlvbiBvbiB0aGUgdXNlIG9mIFpfRklOSVNICi0gUmVjb2duaXplIGNsYW5nIGFzIGdjYwotIEFkZCBnem9wZW5fdygpIGluIFdpbmRvd3MgZm9yIHdpZGUgY2hhcmFjdGVyIHBhdGggbmFtZXMKLSBSZW5hbWUgemNvbmYuaCBpbiBDTWFrZUxpc3RzLnR4dCB0byBtb3ZlIGl0IG91dCBvZiB0aGUgd2F5Ci0gQWRkIHNvdXJjZSBkaXJlY3RvcnkgaW4gQ01ha2VMaXN0cy50eHQgZm9yIGJ1aWxkaW5nIGV4YW1wbGVzCi0gTG9vayBpbiBidWlsZCBkaXJlY3RvcnkgZm9yIHpsaWIucGMgaW4gQ01ha2VMaXN0cy50eHQKLSBSZW1vdmUgZ3pmbGFncyBmcm9tIHpsaWJ2Yy5kZWYgaW4gdmM5IGFuZCB2YzEwCi0gRml4IGNvbnRyaWIvbWluaXppcCBjb21waWxhdGlvbiBpbiB0aGUgTWluR1cgZW52aXJvbm1lbnQKLSBVcGRhdGUgLi9jb25maWd1cmUgZm9yIFNvbGFyaXMsIHN1cHBvcnQgLS02NCBbTW9vbmV5XQotIFJlbW92ZSAtUi4gZnJvbSBTb2xhcmlzIHNoYXJlZCBidWlsZCAocG9zc2libGUgc2VjdXJpdHkgaXNzdWUpCi0gQXZvaWQgcmFjZSBjb25kaXRpb24gZm9yIHBhcmFsbGVsIG1ha2UgKC1qKSBydW5uaW5nIGV4YW1wbGUKLSBGaXggdHlwZSBtaXNtYXRjaCBiZXR3ZWVuIGdldF9jcmNfdGFibGUoKSBhbmQgY3JjX3RhYmxlCi0gRml4IHBhcnNpbmcgb2YgdmVyc2lvbiB3aXRoICItIiBpbiBDTWFrZUxpc3RzLnR4dCBbU25pZGVyLCBaaWVnbGVyXQotIEZpeCB0aGUgcGF0aCB0byB6bGliLm1hcCBpbiBDTWFrZUxpc3RzLnR4dAotIEZvcmNlIHRoZSBuYXRpdmUgbGlidG9vbCBpbiBNYWMgT1MgWCB0byBhdm9pZCBHTlUgbGlidG9vbCBbQmVlYmVdCi0gQWRkIGluc3RydWN0aW9ucyB0byB3aW4zMi9NYWtlZmlsZS5nY2MgZm9yIHNoYXJlZCBpbnN0YWxsIFtUb3JyaV0KCkNoYW5nZXMgaW4gMS4yLjYuMSAoMTIgRmViIDIwMTIpCi0gQXZvaWQgdGhlIHVzZSBvZiB0aGUgT2JqZWN0aXZlLUMgcmVzZXJ2ZWQgbmFtZSAiaWQiCi0gSW5jbHVkZSBpby5oIGluIGd6Z3V0cy5oIGZvciBNaWNyb3NvZnQgY29tcGlsZXJzCi0gRml4IHByb2JsZW0gd2l0aCAuL2NvbmZpZ3VyZSAtLXByZWZpeCBhbmQgZ3pnZXRjIG1hY3JvCi0gSW5jbHVkZSBnel9oZWFkZXIgZGVmaW5pdGlvbiB3aGVuIGNvbXBpbGluZyB6bGliIHNvbG8KLSBQdXQgZ3pmbGFncygpIGZ1bmN0aW9uYWxpdHkgYmFjayBpbiB6dXRpbC5jCi0gQXZvaWQgbGlicmFyeSBoZWFkZXIgaW5jbHVkZSBpbiBjcmMzMi5jIGZvciBaX1NPTE8KLSBVc2UgbmFtZSBpbiBHQ0NfQ0xBU1NJQyBhcyBDIGNvbXBpbGVyIGZvciBjb3ZlcmFnZSB0ZXN0aW5nLCBpZiBzZXQKLSBNaW5vciBjbGVhbnVwIGluIGNvbnRyaWIvbWluaXppcC96aXAuYyBbVm9sbGFudF0KLSBVcGRhdGUgbWFrZV92bXMuY29tIFtaaW5zZXJdCi0gUmVtb3ZlIHVubmVjZXNzYXJ5IGd6Z2V0Y18gZnVuY3Rpb24KLSBVc2Ugb3B0aW1pemVkIGJ5dGUgc3dhcCBvcGVyYXRpb25zIGZvciBNaWNyb3NvZnQgYW5kIEdOVSBbU255ZGVyXQotIEZpeCBtaW5vciB0eXBvIGluIHpsaWIuaCBjb21tZW50cyBbUnplc25pb3dpZWNraV0KCkNoYW5nZXMgaW4gMS4yLjYgKDI5IEphbiAyMDEyKQotIFVwZGF0ZSB0aGUgUGFzY2FsIGludGVyZmFjZSBpbiBjb250cmliL3Bhc2NhbAotIEZpeCBmdW5jdGlvbiBudW1iZXJzIGZvciBnemdldGNfIGluIHpsaWJ2Yy5kZWYgZmlsZXMKLSBGaXggY29uZmlndXJlLmFjIGZvciBjb250cmliL21pbml6aXAgW1NjaGlmZmVyXQotIEZpeCBsYXJnZS1lbnRyeSBkZXRlY3Rpb24gaW4gbWluaXppcCBvbiA2NC1iaXQgc3lzdGVtcyBbU2NoaWZmZXJdCi0gSGF2ZSAuL2NvbmZpZ3VyZSB1c2UgdGhlIGNvbXBpbGVyIHJldHVybiBjb2RlIGZvciBlcnJvciBpbmRpY2F0aW9uCi0gRml4IENNYWtlTGlzdHMudHh0IGZvciBjcm9zcyBjb21waWxhdGlvbiBbTWNDbHVyZV0KLSBGaXggY29udHJpYi9taW5pemlwL3ppcC5jIGZvciA2NC1iaXQgYXJjaGl0ZWN0dXJlcyBbRGFsc25lc10KLSBGaXggY29tcGlsYXRpb24gb2YgY29udHJpYi9taW5pemlwIG9uIEZyZWVCU0QgW01hcnF1ZXpdCi0gQ29ycmVjdCBzdWdnZXN0ZWQgdXNhZ2VzIGluIHdpbjMyL01ha2VmaWxlLm1zYyBbU2hhY2hhciwgSG9ydmF0aF0KLSBJbmNsdWRlIGlvLmggZm9yIFR1cmJvIEMgLyBCb3JsYW5kIEMgb24gYWxsIHBsYXRmb3JtcyBbVHJ1dGFdCi0gTWFrZSB2ZXJzaW9uIGV4cGxpY2l0IGluIGNvbnRyaWIvbWluaXppcC9jb25maWd1cmUuYWMgW0Jvc21hbnNdCi0gQXZvaWQgd2FybmluZyBmb3Igbm8gZW5jcnlwdGlvbiBpbiBjb250cmliL21pbml6aXAvemlwLmMgW1ZvbGxhbnRdCi0gTWlub3IgY2xlYW51cCB1cCBjb250cmliL21pbml6aXAvdW56aXAuYyBbVm9sbGFudF0KLSBGaXggYnVnIHdoZW4gY29tcGlsaW5nIG1pbml6aXAgd2l0aCBDKysgW1ZvbGxhbnRdCi0gUHJvdGVjdCBmb3IgbG9uZyBuYW1lIGFuZCBleHRyYSBmaWVsZHMgaW4gY29udHJpYi9taW5pemlwIFtWb2xsYW50XQotIEF2b2lkIHNvbWUgd2FybmluZ3MgaW4gY29udHJpYi9taW5pemlwIFtWb2xsYW50XQotIEFkZCAtSS4uLy4uIC1MLi4vLi4gdG8gQ0ZMQUdTIGZvciBtaW5pemlwIGFuZCBtaW5pdW56aXAKLSBBZGQgbWlzc2luZyBsaWJzIHRvIG1pbml6aXAgbGlua2VyIGNvbW1hbmQKLSBBZGQgc3VwcG9ydCBmb3IgVlBBVEggYnVpbGRzIGluIGNvbnRyaWIvbWluaXppcAotIEFkZCBhbiAtLWVuYWJsZS1kZW1vcyBvcHRpb24gdG8gY29udHJpYi9taW5pemlwL2NvbmZpZ3VyZQotIEFkZCB0aGUgZ2VuZXJhdGlvbiBvZiBjb25maWd1cmUubG9nIGJ5IC4vY29uZmlndXJlCi0gRXhpdCB3aGVuIHJlcXVpcmVkIHBhcmFtZXRlcnMgbm90IHByb3ZpZGVkIHRvIHdpbjMyL01ha2VmaWxlLmdjYwotIEhhdmUgZ3pwdXRjIHJldHVybiB0aGUgY2hhcmFjdGVyIHdyaXR0ZW4gaW5zdGVhZCBvZiB0aGUgYXJndW1lbnQKLSBVc2UgdGhlIC1tIG9wdGlvbiBvbiBsZGNvbmZpZyBmb3IgQlNEIHN5c3RlbXMgW1RvYmlhc10KLSBDb3JyZWN0IGluIHpsaWIubWFwIHdoZW4gZGVmbGF0ZVJlc2V0S2VlcCB3YXMgYWRkZWQKCkNoYW5nZXMgaW4gMS4yLjUuMyAoMTUgSmFuIDIwMTIpCi0gUmVzdG9yZSBnemdldGMgZnVuY3Rpb24gZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5Ci0gRG8gbm90IHVzZSBfbHNlZWtpNjQgdW5kZXIgQm9ybGFuZCBDKysgW1RydXRhXQotIFVwZGF0ZSB3aW4zMi9NYWtlZmlsZS5tc2MgdG8gYnVpbGQgdGVzdC8qLmMgW1RydXRhXQotIFJlbW92ZSBvbGQvdmlzdWFsYzYgZ2l2ZW4gQ01ha2VmaWxlIGFuZCBvdGhlciBhbHRlcm5hdGl2ZXMKLSBVcGRhdGUgQVM0MDAgYnVpbGQgZmlsZXMgYW5kIGRvY3VtZW50YXRpb24gW01vbm5lcmF0XQotIFVwZGF0ZSB3aW4zMi9NYWtlZmlsZS5nY2MgdG8gYnVpbGQgdGVzdC8qLmMgW1RydXRhXQotIFBlcm1pdCBzdHJvbmdlciBmbHVzaGVzIGFmdGVyIFpfQkxPQ0sgZmx1c2hlcwotIEF2b2lkIGV4dHJhbmVvdXMgZW1wdHkgYmxvY2tzIHdoZW4gZG9pbmcgZW1wdHkgZmx1c2hlcwotIFBlcm1pdCBaX05VTEwgYXJndW1lbnRzIHRvIGRlZmxhdGVQZW5kaW5nCi0gQWxsb3cgZGVmbGF0ZVByaW1lKCkgdG8gaW5zZXJ0IGJpdHMgaW4gdGhlIG1pZGRsZSBvZiBhIHN0cmVhbQotIFJlbW92ZSBzZWNvbmQgZW1wdHkgc3RhdGljIGJsb2NrIGZvciBaX1BBUlRJQUxfRkxVU0gKLSBXcml0ZSBvdXQgYWxsIG9mIHRoZSBhdmFpbGFibGUgYml0cyB3aGVuIHVzaW5nIFpfQkxPQ0sKLSBJbnNlcnQgdGhlIGZpcnN0IHR3byBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIGFmdGVyIGEgZmx1c2gKCkNoYW5nZXMgaW4gMS4yLjUuMiAoMTcgRGVjIDIwMTEpCi0gZml4IGxkIGVycm9yOiB1bmFibGUgdG8gZmluZCB2ZXJzaW9uIGRlcGVuZGVuY3kgJ1pMSUJfMS4yLjUnCi0gdXNlIHJlbGF0aXZlIHN5bWxpbmtzIGZvciBzaGFyZWQgbGlicwotIEF2b2lkIHNlYXJjaGluZyBwYXN0IHdpbmRvdyBmb3IgWl9STEUgc3RyYXRlZ3kKLSBBc3N1cmUgdGhhdCBoaWdoLXdhdGVyIG1hcmsgaW5pdGlhbGl6YXRpb24gaXMgYWx3YXlzIGFwcGxpZWQgaW4gZGVmbGF0ZQotIEFkZCBhc3NlcnRpb25zIHRvIGZpbGxfd2luZG93KCkgaW4gZGVmbGF0ZS5jIHRvIG1hdGNoIGNvbW1lbnRzCi0gVXBkYXRlIHB5dGhvbiBsaW5rIGluIFJFQURNRQotIENvcnJlY3Qgc3BlbGxpbmcgZXJyb3IgaW4gZ3pyZWFkLmMKLSBGaXggYnVnIGluIGd6Z2V0cygpIGZvciBhIGNvbmNhdGVuYXRlZCBlbXB0eSBnemlwIHN0cmVhbQotIENvcnJlY3QgZXJyb3IgaW4gY29tbWVudCBmb3IgZ3pfbWFrZSgpCi0gQ2hhbmdlIGd6cmVhZCgpIGFuZCByZWxhdGVkIHRvIGlnbm9yZSBqdW5rIGFmdGVyIGd6aXAgc3RyZWFtcwotIEFsbG93IGd6cmVhZCgpIGFuZCByZWxhdGVkIHRvIGNvbnRpbnVlIGFmdGVyIGd6Y2xlYXJlcnIoKQotIEFsbG93IGd6cmV3aW5kKCkgYW5kIGd6c2VlaygpIGFmdGVyIGEgcHJlbWF0dXJlIGVuZC1vZi1maWxlCi0gU2ltcGxpZnkgZ3pzZWVrKCkgbm93IHRoYXQgcmF3IGFmdGVyIGd6aXAgaXMgaWdub3JlZAotIENoYW5nZSBnemdldGMoKSB0byBhIG1hY3JvIGZvciBzcGVlZCAofjQwJSBzcGVlZHVwIGluIHRlc3RpbmcpCi0gRml4IGd6Y2xvc2UoKSB0byByZXR1cm4gdGhlIGFjdHVhbCBlcnJvciBsYXN0IGVuY291bnRlcmVkCi0gQWx3YXlzIGFkZCBsYXJnZSBmaWxlIHN1cHBvcnQgZm9yIHdpbmRvd3MKLSBJbmNsdWRlIHpjb25mLmggZm9yIHdpbmRvd3MgbGFyZ2UgZmlsZSBzdXBwb3J0Ci0gSW5jbHVkZSB6Y29uZi5oLmNtYWtlaW4gZm9yIHdpbmRvd3MgbGFyZ2UgZmlsZSBzdXBwb3J0Ci0gVXBkYXRlIHpjb25mLmguY21ha2VpbiBvbiBtYWtlIGRpc3RjbGVhbgotIE1lcmdlIHZlc3RpZ2lhbCB2c25wcmludGYgZGV0ZXJtaW5hdGlvbiBmcm9tIHp1dGlsLmggdG8gZ3pndXRzLmgKLSBDbGFyaWZ5IGhvdyBnem9wZW4oKSBhcHBlbmRzIGluIHpsaWIuaCBjb21tZW50cwotIENvcnJlY3QgZG9jdW1lbnRhdGlvbiBvZiBnemRpcmVjdCgpIHNpbmNlIGp1bmsgYXQgZW5kIG5vdyBpZ25vcmVkCi0gQWRkIGEgdHJhbnNwYXJlbnQgd3JpdGUgbW9kZSB0byBnem9wZW4oKSB3aGVuICdUJyBpcyBpbiB0aGUgbW9kZQotIFVwZGF0ZSBweXRob24gbGluayBpbiB6bGliIG1hbiBwYWdlCi0gR2V0IGluZmZpeGVkLmggYW5kIE1BS0VGSVhFRCByZXN1bHQgdG8gbWF0Y2gKLSBBZGQgYSAuL2NvbmZpZyAtLXNvbG8gb3B0aW9uIHRvIG1ha2UgemxpYiBzdWJzZXQgd2l0aCBubyBsaWJhcnkgdXNlCi0gQWRkIHVuZG9jdW1lbnRlZCBpbmZsYXRlUmVzZXRLZWVwKCkgZnVuY3Rpb24gZm9yIENBQiBmaWxlIGRlY29kaW5nCi0gQWRkIC0tY292ZXIgb3B0aW9uIHRvIC4vY29uZmlndXJlIGZvciBnY2MgY292ZXJhZ2UgdGVzdGluZwotIEFkZCAjZGVmaW5lIFpMSUJfQ09OU1Qgb3B0aW9uIHRvIHVzZSBjb25zdCBpbiB0aGUgel9zdHJlYW0gaW50ZXJmYWNlCi0gQWRkIGNvbW1lbnQgdG8gZ3pkb3BlbigpIGluIHpsaWIuaCB0byB1c2UgZHVwKCkgd2hlbiB1c2luZyBmaWxlbm8oKQotIE5vdGUgYmVoYXZpb3Igb2YgdW5jb21wcmVzcygpIHRvIHByb3ZpZGUgYXMgbXVjaCBkYXRhIGFzIGl0IGNhbgotIEFkZCBmaWxlcyBpbiBjb250cmliL21pbml6aXAgdG8gYWlkIGluIGJ1aWxkaW5nIGxpYm1pbml6aXAKLSBTcGxpdCBvZmYgQVIgb3B0aW9ucyBpbiBNYWtlZmlsZS5pbiBhbmQgY29uZmlndXJlCi0gQ2hhbmdlIE9OIG1hY3JvIHRvIFpfQVJHIHRvIGF2b2lkIGFwcGxpY2F0aW9uIGNvbmZsaWN0cwotIEZhY2lsaXRhdGUgY29tcGlsYXRpb24gd2l0aCBCb3JsYW5kIEMrKyBmb3IgcHJhZ21hcyBhbmQgdnNucHJpbnRmCi0gSW5jbHVkZSBpby5oIGZvciBUdXJibyBDIC8gQm9ybGFuZCBDKysKLSBNb3ZlIGV4YW1wbGUuYyBhbmQgbWluaWd6aXAuYyB0byB0ZXN0LwotIFNpbXBsaWZ5IGluY29tcGxldGUgY29kZSB0YWJsZSBmaWxsaW5nIGluIGluZmxhdGVfdGFibGUoKQotIFJlbW92ZSBjb2RlIGZyb20gaW5mbGF0ZS5jIGFuZCBpbmZiYWNrLmMgdGhhdCBpcyBpbXBvc3NpYmxlIHRvIGV4ZWN1dGUKLSBUZXN0IHRoZSBpbmZsYXRlIGNvZGUgd2l0aCBmdWxsIGNvdmVyYWdlCi0gQWxsb3cgZGVmbGF0ZVNldERpY3Rpb25hcnksIGluZmxhdGVTZXREaWN0aW9uYXJ5IGF0IGFueSB0aW1lIChpbiByYXcpCi0gQWRkIGRlZmxhdGVSZXNldEtlZXAgYW5kIGZpeCBpbmZsYXRlUmVzZXRLZWVwIHRvIHJldGFpbiBkaWN0aW9uYXJ5Ci0gRml4IGd6d3JpdGUuYyB0byBhY2NvbW1vZGF0ZSByZWR1Y2VkIG1lbW9yeSB6bGliIGNvbXBpbGF0aW9uCi0gSGF2ZSBpbmZsYXRlKCkgd2l0aCBaX0ZJTklTSCBhdm9pZCB0aGUgYWxsb2NhdGlvbiBvZiBhIHdpbmRvdwotIERvIG5vdCBzZXQgc3RybS0+YWRsZXIgd2hlbiBkb2luZyByYXcgaW5mbGF0ZQotIEZpeCBnemVvZigpIHRvIGJlaGF2ZSBqdXN0IGxpa2UgZmVvZigpIHdoZW4gcmVhZCBpcyBub3QgcGFzdCBlbmQgb2YgZmlsZQotIEZpeCBidWcgaW4gZ3pyZWFkLmMgd2hlbiBlbmQtb2YtZmlsZSBpcyByZWFjaGVkCi0gQXZvaWQgdXNlIG9mIFpfQlVGX0VSUk9SIGluIGd6KiBmdW5jdGlvbnMgZXhjZXB0IGZvciBwcmVtYXR1cmUgRU9GCi0gRG9jdW1lbnQgZ3pyZWFkKCkgY2FwYWJpbGl0eSB0byByZWFkIGNvbmN1cnJlbnRseSB3cml0dGVuIGZpbGVzCi0gUmVtb3ZlIGhhcmQtY29kaW5nIG9mIHJlc291cmNlIGNvbXBpbGVyIGluIENNYWtlTGlzdHMudHh0IFtCbGFtbW9dCgpDaGFuZ2VzIGluIDEuMi41LjEgKDEwIFNlcCAyMDExKQotIFVwZGF0ZSBGQVEgZW50cnkgb24gc2hhcmVkIGJ1aWxkcyAoIzEzKQotIEF2b2lkIHN5bWJvbGljIGFyZ3VtZW50IHRvIGNobW9kIGluIE1ha2VmaWxlLmluCi0gRml4IGJ1ZyBhbmQgYWRkIGNvbnN0cyBpbiBjb250cmliL3B1ZmYgW09iZXJodW1lcl0KLSBVcGRhdGUgY29udHJpYi9wdWZmL3plcm9zLnJhdyB0ZXN0IGZpbGUgdG8gaGF2ZSBhbGwgYmxvY2sgdHlwZXMKLSBBZGQgZnVsbCBjb3ZlcmFnZSB0ZXN0IGZvciBwdWZmIGluIGNvbnRyaWIvcHVmZi9NYWtlZmlsZQotIEZpeCBzdGF0aWMtb25seS1idWlsZCBpbnN0YWxsIGluIE1ha2VmaWxlLmluCi0gRml4IGJ1ZyBpbiB1bnpHZXRDdXJyZW50RmlsZUluZm8oKSBpbiBjb250cmliL21pbml6aXAgW0t1bm9dCi0gQWRkIGxpYnouYSBkZXBlbmRlbmN5IHRvIHNoYXJlZCBpbiBNYWtlZmlsZS5pbiBmb3IgcGFyYWxsZWwgYnVpbGRzCi0gU3BlbGwgb3V0ICJudW1iZXIiIChpbnN0ZWFkIG9mICJuYiIpIGluIHpsaWIuaCBmb3IgdG90YWxfaW4sIHRvdGFsX291dAotIFJlcGxhY2UgJCguLi4pIHdpdGggYC4uLmAgaW4gY29uZmlndXJlIGZvciBub24tYmFzaCBzaCBbQm93bGVyXQotIEFkZCBkYXJ3aW4qIHRvIERhcndpbiogYW5kIHNvbGFyaXMqIHRvIFN1bk9TXCA1KiBpbiBjb25maWd1cmUgW0dyb2ZmZW5dCi0gQWRkIHNvbGFyaXMqIHRvIExpbnV4KiBpbiBjb25maWd1cmUgdG8gYWxsb3cgZ2NjIHVzZSBbR3JvZmZlbl0KLSBBZGQgKmJzZCogdG8gTGludXgqIGNhc2UgaW4gY29uZmlndXJlIFtCYXItTGV2XQotIEFkZCBpbmZmYXN0Lm9iaiB0byBkZXBlbmRlbmNpZXMgaW4gd2luMzIvTWFrZWZpbGUubXNjCi0gQ29ycmVjdCBzcGVsbGluZyBlcnJvciBpbiBkZWZsYXRlLmggW0tvaGxlcl0KLSBDaGFuZ2UgbGliemRsbC5hIGFnYWluIHRvIGxpYnouZGxsLmEgKCEpIGluIHdpbjMyL01ha2VmaWxlLmdjYwotIEFkZCB0ZXN0IHRvIGNvbmZpZ3VyZSBmb3IgR05VIEMgbG9va2luZyBmb3IgZ2NjIGluIG91dHB1dCBvZiAkY2MgLXYKLSBBZGQgemxpYi5wYyBnZW5lcmF0aW9uIHRvIHdpbjMyL01ha2VmaWxlLmdjYyBbV2VpZ2VsdF0KLSBGaXggYnVnIGluIHpsaWIuaCBmb3IgX0ZJTEVfT0ZGU0VUX0JJVFMgc2V0IGFuZCBfTEFSR0VGSUxFNjRfU09VUkNFIG5vdAotIEFkZCBjb21tZW50IGluIHpsaWIuaCB0aGF0IGFkbGVyMzJfY29tYmluZSB3aXRoIGxlbjIgPCAwIG1ha2VzIG5vIHNlbnNlCi0gTWFrZSBOT19ESVZJREUgb3B0aW9uIGluIGFkbGVyMzIuYyBtdWNoIGZhc3RlciAodGhhbmtzIHRvIEpvaG4gUmVpc2VyKQotIE1ha2Ugc3Ryb25nZXIgdGVzdCBpbiB6Y29uZi5oIHRvIGluY2x1ZGUgdW5pc3RkLmggZm9yIExGUwotIEFwcGx5IERhcndpbiBwYXRjaGVzIGZvciA2NC1iaXQgZmlsZSBvZmZzZXRzIHRvIGNvbnRyaWIvbWluaXppcCBbU2xhY2tdCi0gRml4IHpsaWIuaCBMRlMgc3VwcG9ydCB3aGVuIFpfUFJFRklYIHVzZWQKLSBBZGQgdXBkYXRlZCBhczQwMCBzdXBwb3J0IChyZW1vdmVkIGZyb20gb2xkKSBbTW9ubmVyYXRdCi0gQXZvaWQgZGVmbGF0ZSBzZW5zaXRpdml0eSB0byB2b2xhdGlsZSBpbnB1dCBkYXRhCi0gQXZvaWQgZGl2aXNpb24gaW4gYWRsZXIzMl9jb21iaW5lIGZvciBOT19ESVZJREUKLSBDbGFyaWZ5IHRoZSB1c2Ugb2YgWl9GSU5JU0ggd2l0aCBkZWZsYXRlQm91bmQoKSBhbW91bnQgb2Ygc3BhY2UKLSBTZXQgYmluYXJ5IGZvciBvdXRwdXQgZmlsZSBpbiBwdWZmLmMKLSBVc2UgdTQgdHlwZSBmb3IgY3JjX3RhYmxlIHRvIGF2b2lkIGNvbnZlcnNpb24gd2FybmluZ3MKLSBBcHBseSBjYXN0cyBpbiB6bGliLmggdG8gYXZvaWQgY29udmVyc2lvbiB3YXJuaW5ncwotIEFkZCBPRiB0byBwcm90b3R5cGVzIGZvciBhZGxlcjMyX2NvbWJpbmVfIGFuZCBjcmMzMl9jb21iaW5lXyBbTWlsbGVyXQotIEltcHJvdmUgaW5mbGF0ZVN5bmMoKSBkb2N1bWVudGF0aW9uIHRvIG5vdGUgaW5kZXRlcm1pbmFuY3kKLSBBZGQgZGVmbGF0ZVBlbmRpbmcoKSBmdW5jdGlvbiB0byByZXR1cm4gdGhlIGFtb3VudCBvZiBwZW5kaW5nIG91dHB1dAotIENvcnJlY3QgdGhlIHNwZWxsaW5nIG9mICJzcGVjaWZpY2F0aW9uIiBpbiBGQVEgW1JhbmRlcnMtUGVocnNvbl0KLSBBZGQgYSBjaGVjayBpbiBjb25maWd1cmUgZm9yIHN0ZGFyZy5oLCB1c2UgZm9yIGd6cHJpbnRmKCkKLSBDaGVjayB0aGF0IHBvaW50ZXJzIGZpdCBpbiBpbnRzIHdoZW4gZ3pwcmludCgpIGNvbXBpbGVkIG9sZCBzdHlsZQotIEFkZCBkdW1teSBuYW1lIGJlZm9yZSAkKFNIQVJFRExJQlYpIGluIE1ha2VmaWxlIFtCYXItTGV2LCBCb3dsZXJdCi0gRGVsZXRlIGxpbmUgaW4gY29uZmlndXJlIHRoYXQgYWRkcyAtTC4gbGliei5hIHRvIExERkxBR1MgW1dlaWdlbHRdCi0gQWRkIGRlYnVnIHJlY29yZHMgaW4gYXNzbWVibGVyIGNvZGUgW0xvbmRlcl0KLSBVcGRhdGUgUkZDIHJlZmVyZW5jZXMgdG8gdXNlIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sLy4uLiBbTGldCi0gQWRkIC0tYXJjaHMgb3B0aW9uLCB1c2Ugb2YgbGlidG9vbCB0byBjb25maWd1cmUgZm9yIE1hYyBPUyBYIFtCb3JzdGVsXQoKQ2hhbmdlcyBpbiAxLjIuNSAoMTkgQXByIDIwMTApCi0gRGlzYWJsZSB2aXNpYmlsaXR5IGF0dHJpYnV0ZSBpbiB3aW4zMi9NYWtlZmlsZS5nY2MgW0Jhci1MZXZdCi0gRGVmYXVsdCB0byBsaWJkaXIgYXMgc2hhcmVkbGliZGlyIGluIGNvbmZpZ3VyZSBbTmllZGVyXQotIFVwZGF0ZSBjb3B5cmlnaHQgZGF0ZXMgb24gbW9kaWZpZWQgc291cmNlIGZpbGVzCi0gVXBkYXRlIHRyZWVzLmMgdG8gYmUgYWJsZSB0byBnZW5lcmF0ZSBtb2RpZmllZCB0cmVlcy5oCi0gRXhpdCBjb25maWd1cmUgZm9yIE1pbkdXLCBzdWdnZXN0aW5nIHdpbjMyL01ha2VmaWxlLmdjYwotIENoZWNrIGZvciBOVUxMIHBhdGggaW4gZ3pfb3BlbiBbSG9tdXJsdV0KCkNoYW5nZXMgaW4gMS4yLjQuNSAoMTggQXByIDIwMTApCi0gU2V0IHNoYXJlZGxpYmRpciBpbiBjb25maWd1cmUgW1Rvcm9rXQotIFNldCBMREZMQUdTIGluIE1ha2VmaWxlLmluIFtCYXItTGV2XQotIEF2b2lkIG1rZGlyIG9ianMgcmFjZSBjb25kaXRpb24gaW4gTWFrZWZpbGUuaW4gW0Jvd2xlcl0KLSBBZGQgWkxJQl9JTlRFUk5BTCBpbiBmcm9udCBvZiBpbnRlcm5hbCBpbnRlci1tb2R1bGUgZnVuY3Rpb25zIGFuZCBhcnJheXMKLSBEZWZpbmUgWkxJQl9JTlRFUk5BTCB0byBoaWRlIGludGVybmFsIGZ1bmN0aW9ucyBhbmQgYXJyYXlzIGZvciBHTlUgQwotIERvbid0IHVzZSBoaWRkZW4gYXR0cmlidXRlIHdoZW4gaXQgaXMgYSB3YXJuaW5nIGdlbmVyYXRvciAoZS5nLiBTb2xhcmlzKQoKQ2hhbmdlcyBpbiAxLjIuNC40ICgxOCBBcHIgMjAxMCkKLSBGaXggQ1JPU1NfUFJFRklYIGV4ZWN1dGFibGUgdGVzdGluZywgQ0hPU1QgZXh0cmFjdCwgbWluZ3cqIFtUb3Jva10KLSBVbmRlZmluZSBfTEFSR0VGSUxFNjRfU09VUkNFIGluIHpjb25mLmggaWYgaXQgaXMgemVybywgYnV0IG5vdCBpZiBlbXB0eQotIFRyeSB0byB1c2UgYmFzaCBvciBrc2ggcmVnYXJkbGVzcyBvZiBmdW5jdGlvbmFsaXR5IG9mIC9iaW4vc2gKLSBGaXggY29uZmlndXJlIGluY29tcGF0aWJpbGl0eSB3aXRoIE5ldEJTRCBzaAotIFJlbW92ZSBhdHRlbXB0IHRvIHJ1biB1bmRlciBiYXNoIG9yIGtzaCBzaW5jZSBoYXZlIGJldHRlciBOZXRCU0QgZml4Ci0gRml4IHdpbjMyL01ha2VmaWxlLmdjYyBmb3IgTWluR1cgW0Jhci1MZXZdCi0gQWRkIGRpYWdub3N0aWMgbWVzc2FnZXMgd2hlbiB1c2luZyBDUk9TU19QUkVGSVggaW4gY29uZmlndXJlCi0gQWRkZWQgLS1zaGFyZWRsaWJkaXIgb3B0aW9uIHRvIGNvbmZpZ3VyZSBbV2VpZ2VsdF0KLSBVc2UgaGlkZGVuIHZpc2liaWxpdHkgYXR0cmlidXRlIHdoZW4gYXZhaWxhYmxlIFtGcnlzaW5nZXJdCgpDaGFuZ2VzIGluIDEuMi40LjMgKDEwIEFwciAyMDEwKQotIE9ubHkgdXNlIENST1NTX1BSRUZJWCBpbiBjb25maWd1cmUgZm9yIGFyIGFuZCByYW5saWIgaWYgdGhleSBleGlzdAotIFVzZSBDUk9TU19QUkVGSVggZm9yIG5tIFtCYXItTGV2XQotIEFzc3VtZSBfTEFSR0VGSUxFNjRfU09VUkNFIGRlZmluZWQgaXMgZXF1aXZhbGVudCB0byB0cnVlCi0gQXZvaWQgdXNlIG9mIHVuZGVmaW5lZCBzeW1ib2xzIGluICNpZiB3aXRoICYmIGFuZCB8fAotIE1ha2UgKjY0IHByb3RvdHlwZXMgaW4gZ3pndXRzLmggY29uc2lzdGVudCB3aXRoIGZ1bmN0aW9ucwotIEFkZCAtc2hhcmVkIGxvYWQgb3B0aW9uIGZvciBNaW5HVyBpbiBjb25maWd1cmUgW0Jvd2xlcl0KLSBNb3ZlIHpfb2ZmNjRfdCB0byBwdWJsaWMgaW50ZXJmYWNlLCB1c2UgaW5zdGVhZCBvZiBvZmY2NF90Ci0gUmVtb3ZlICEgZnJvbSBzaGVsbCB0ZXN0IGluIGNvbmZpZ3VyZSAobm90IHBvcnRhYmxlIHRvIFNvbGFyaXMpCi0gQ2hhbmdlICswIG1hY3JvIHRlc3RzIHRvIC0wIGZvciBwb3NzaWJseSBpbmNyZWFzZWQgcG9ydGFiaWxpdHkKCkNoYW5nZXMgaW4gMS4yLjQuMiAoOSBBcHIgMjAxMCkKLSBBZGQgY29uc2lzdGVudCBjYXJyaWFnZSByZXR1cm5zIHRvIHJlYWRtZS50eHQncyBpbiBtYXNteDg2IGFuZCBtYXNteDY0Ci0gUmVhbGx5IHByb3ZpZGUgcHJvdG90eXBlcyBmb3IgKjY0IGZ1bmN0aW9ucyB3aGVuIGJ1aWxkaW5nIHdpdGhvdXQgTEZTCi0gT25seSBkZWZpbmUgdW5saW5rKCkgaW4gbWluaWd6aXAuYyBpZiB1bmlzdGQuaCBub3QgaW5jbHVkZWQKLSBVcGRhdGUgUkVBRE1FIHRvIHBvaW50IHRvIGNvbnRyaWIvdnN0dWRpbyBwcm9qZWN0IGZpbGVzCi0gTW92ZSBwcm9qZWN0cy92YzYgdG8gb2xkLyBhbmQgcmVtb3ZlIHByb2plY3RzLwotIEluY2x1ZGUgc3RkbGliLmggaW4gbWluaWd6aXAuYyBmb3Igc2V0bW9kZSgpIGRlZmluaXRpb24gdW5kZXIgV2luQ0UKLSBDbGVhbiB1cCBhc3NlbWJsZXIgYnVpbGRzIGluIHdpbjMyL01ha2VmaWxlLm1zYyBbUm93ZV0KLSBJbmNsdWRlIHN5cy90eXBlcy5oIGZvciBNaWNyb3NvZnQgZm9yIG9mZl90IGRlZmluaXRpb24KLSBGaXggbWVtb3J5IGxlYWsgb24gZXJyb3IgaW4gZ3pfb3BlbigpCi0gU3ltYm9saXplIG5tIGFzICROTSBpbiBjb25maWd1cmUgW1dlaWdlbHRdCi0gVXNlIFRFU1RfTERTSEFSRUQgaW5zdGVhZCBvZiBMRFNIQVJFRCB0byBsaW5rIHRlc3QgcHJvZ3JhbXMgW1dlaWdlbHRdCi0gQWRkICswIHRvIF9GSUxFX09GRlNFVF9CSVRTIGFuZCBfTEZTNjRfTEFSR0VGSUxFIGluIGNhc2Ugbm90IGRlZmluZWQKLSBGaXggYnVnIGluIGd6ZW9mKCkgdG8gdGFrZSBpbnRvIGFjY291bnQgdW51c2VkIGlucHV0IGRhdGEKLSBBdm9pZCBpbml0aWFsaXphdGlvbiBvZiBzdHJ1Y3R1cmVzIHdpdGggdmFyaWFibGVzIGluIHB1ZmYuYwotIFVwZGF0ZWQgd2luMzIvUkVBRE1FLVdJTjMyLnR4dCBbUm93ZV0KCkNoYW5nZXMgaW4gMS4yLjQuMSAoMjggTWFyIDIwMTApCi0gUmVtb3ZlIHRoZSB1c2Ugb2YgW2Etel0gY29uc3RydWN0cyBmb3Igc2VkIGluIGNvbmZpZ3VyZSBbZ2VudG9vIDMxMDIyNV0KLSBSZW1vdmUgJChTSEFSRURMSUIpIGZyb20gTElCUyBpbiBNYWtlZmlsZS5pbiBbQ3JlZWNoXQotIFJlc3RvcmUgImZvciBkZWJ1Z2dpbmciIGNvbW1lbnQgb24gc3ByaW50ZigpIGluIGd6bGliLmMKLSBSZW1vdmUgZmRvcGVuIGZvciBNVlMgZnJvbSBnemd1dHMuaAotIFB1dCBuZXcgUkVBRE1FLVdJTjMyLnR4dCBpbiB3aW4zMiBbUm93ZV0KLSBBZGQgY2hlY2sgZm9yIHNoZWxsIHRvIGNvbmZpZ3VyZSBhbmQgaW52b2tlIGFub3RoZXIgc2hlbGwgaWYgbmVlZGVkCi0gRml4IGJpZyBmYXQgc3RpbmtpbmcgYnVnIGluIGd6c2VlaygpIG9uIHVuY29tcHJlc3NlZCBmaWxlcwotIFJlbW92ZSB2ZXN0aWdpYWwgRl9PUEVONjQgZGVmaW5lIGluIHp1dGlsLmgKLSBTZXQgYW5kIGNoZWNrIHRoZSB2YWx1ZSBvZiBfTEFSR0VGSUxFX1NPVVJDRSBhbmQgX0xBUkdFRklMRTY0X1NPVVJDRQotIEF2b2lkIGVycm9ycyBvbiBub24tTEZTIHN5c3RlbXMgd2hlbiBhcHBsaWNhdGlvbnMgZGVmaW5lIExGUyBtYWNyb3MKLSBTZXQgRVhFIHRvICIuZXhlIiBpbiBjb25maWd1cmUgZm9yIE1JTkdXIFtLYWhsZV0KLSBNYXRjaCBjcmMzMigpIGluIGNyYzMyLmMgZXhhY3RseSB0byB0aGUgcHJvdG90eXBlIGluIHpsaWIuaCBbU2hlcnJpbGxdCi0gQWRkIHByZWZpeCBmb3IgY3Jvc3MtY29tcGlsYXRpb24gaW4gd2luMzIvbWFrZWZpbGUuZ2NjIFtCYXItTGV2XQotIEFkZCBETEwgaW5zdGFsbCBpbiB3aW4zMi9tYWtlZmlsZS5nY2MgW0Jhci1MZXZdCi0gQWxsb3cgTGludXgqIG9yIGxpbnV4KiBmcm9tIHVuYW1lIGluIGNvbmZpZ3VyZSBbQmFyLUxldl0KLSBBbGxvdyBsZGNvbmZpZyB0byBiZSByZWRlZmluZWQgaW4gY29uZmlndXJlIGFuZCBNYWtlZmlsZS5pbiBbQmFyLUxldl0KLSBBZGQgY3Jvc3MtY29tcGlsYXRpb24gcHJlZml4ZXMgdG8gY29uZmlndXJlIFtCYXItTGV2XQotIE1hdGNoIHR5cGUgZXhhY3RseSBpbiBnel9sb2FkKCkgaW52b2NhdGlvbiBpbiBnenJlYWQuYwotIE1hdGNoIHR5cGUgZXhhY3RseSBvZiB6Y2FsbG9jKCkgaW4genV0aWwuYyB0byB6bGliLmggYWxsb2NfZnVuYwotIFByb3ZpZGUgcHJvdG90eXBlcyBmb3IgKjY0IGZ1bmN0aW9ucyB3aGVuIGJ1aWxkaW5nIHpsaWIgd2l0aG91dCBMRlMKLSBEb24ndCB1c2UgLWxjIHdoZW4gbGlua2luZyBzaGFyZWQgbGlicmFyeSBvbiBNaW5HVwotIFJlbW92ZSBlcnJuby5oIGNoZWNrIGluIGNvbmZpZ3VyZSBhbmQgdmVzdGlnaWFsIGVycm5vIGNvZGUgaW4genV0aWwuaAoKQ2hhbmdlcyBpbiAxLjIuNCAoMTQgTWFyIDIwMTApCi0gRml4IFZFUjMgZXh0cmFjdGlvbiBpbiBjb25maWd1cmUgZm9yIG5vIGZvdXJ0aCBzdWJ2ZXJzaW9uCi0gVXBkYXRlIHpsaWIuMywgYWRkIGRvY3MgdG8gTWFrZWZpbGUuaW4gdG8gbWFrZSAucGRmIG91dCBvZiBpdAotIEFkZCB6bGliLjMucGRmIHRvIGRpc3RyaWJ1dGlvbgotIERvbid0IHNldCBlcnJvciBjb2RlIGluIGd6ZXJyb3IoKSBpZiBwYXNzZWQgcG9pbnRlciBpcyBOVUxMCi0gQXBwbHkgZGVzdGluYXRpb24gZGlyZWN0b3J5IGZpeGVzIHRvIENNYWtlTGlzdHMudHh0IFtMb3dtYW5dCi0gTW92ZSAjY21ha2VkZWZpbmUncyB0byBhIG5ldyB6Y29uZi5pbi5jbWFrZWluCi0gUmVzdG9yZSB6Y29uZi5oIGZvciBidWlsZHMgdGhhdCBkb24ndCB1c2UgY29uZmlndXJlIG9yIGNtYWtlCi0gQWRkIGRpc3RjbGVhbiB0byBkdW1teSBNYWtlZmlsZSBmb3IgY29udmVuaWVuY2UKLSBVcGRhdGUgYW5kIGltcHJvdmUgSU5ERVgsIFJFQURNRSwgYW5kIEZBUQotIFVwZGF0ZSBDTWFrZUxpc3RzLnR4dCBmb3IgdGhlIHJldHVybiBvZiB6Y29uZi5oIFtMb3dtYW5dCi0gVXBkYXRlIGNvbnRyaWIvdnN0dWRpby92YzkgYW5kIHZjMTAgW1ZvbGxhbnRdCi0gQ2hhbmdlIGxpYnouZGxsLmEgYmFjayB0byBsaWJ6ZGxsLmEgaW4gd2luMzIvTWFrZWZpbGUuZ2NjCi0gQXBwbHkgbGljZW5zZSBhbmQgcmVhZG1lIGNoYW5nZXMgdG8gY29udHJpYi9hc202ODYgW1JhaXRlcl0KLSBDaGVjayBmaWxlIG5hbWUgbGVuZ3RocyBhbmQgYWRkIC1jIG9wdGlvbiBpbiBtaW5pZ3ppcC5jIFtMaV0KLSBVcGRhdGUgY29udHJpYi9hbWQ2NCBhbmQgY29udHJpYi9tYXNteDg2LyBbVm9sbGFudF0KLSBBdm9pZCB1c2Ugb2YgImVvZiIgcGFyYW1ldGVyIGluIHRyZWVzLmMgdG8gbm90IHNoYWRvdyBsaWJyYXJ5IHZhcmlhYmxlCi0gVXBkYXRlIG1ha2Vfdm1zLmNvbSBmb3IgcmVtb3ZhbCBvZiB6bGliZGVmcy5oIFtaaW5zZXJdCi0gVXBkYXRlIGFzc2VtYmxlciBjb2RlIGFuZCB2c3R1ZGlvIHByb2plY3RzIGluIGNvbnRyaWIgW1ZvbGxhbnRdCi0gUmVtb3ZlIG91dGRhdGVkIGFzc2VtYmxlciBjb2RlIGNvbnRyaWIvbWFzbTY4NiBhbmQgY29udHJpYi9hc201ODYKLSBSZW1vdmUgb2xkIHZjNyBhbmQgdmM4IGZyb20gY29udHJpYi92c3R1ZGlvCi0gVXBkYXRlIHdpbjMyL01ha2VmaWxlLm1zYywgYWRkIFpMSUJfVkVSX1NVQlJFVklTSU9OIFtSb3dlXQotIEZpeCBtZW1vcnkgbGVha3MgaW4gZ3pjbG9zZV9yKCkgYW5kIGd6Y2xvc2VfdygpLCBmaWxlIGxlYWsgaW4gZ3pfb3BlbigpCi0gQWRkIGNvbnRyaWIvZ2NjX2d2bWF0NjQgZm9yIGxvbmdlc3RfbWF0Y2ggYW5kIGluZmxhdGVfZmFzdCBbVm9sbGFudF0KLSBSZW1vdmUgKjY0IGZ1bmN0aW9ucyBmcm9tIHdpbjMyL3psaWIuZGVmICh0aGV5J3JlIG5vdCA2NC1iaXQgeWV0KQotIEZpeCBidWcgaW4gdm9pZC1yZXR1cm5pbmcgdnNwcmludGYoKSBjYXNlIGluIGd6d3JpdGUuYwotIEZpeCBuYW1lIGNoYW5nZSBmcm9tIGluZmxhdGUuaCBpbiBjb250cmliL2luZmxhdGU4Ni9pbmZmYXM4Ni5jCi0gQ2hlY2sgaWYgdGVtcG9yYXJ5IGZpbGUgZXhpc3RzIGJlZm9yZSByZW1vdmluZyBpbiBtYWtlX3Ztcy5jb20gW1ppbnNlcl0KLSBGaXggbWFrZSBpbnN0YWxsIGFuZCB1bmluc3RhbGwgZm9yIC0tc3RhdGljIG9wdGlvbgotIEZpeCB1c2FnZSBvZiBfTVNDX1ZFUiBpbiBnemd1dHMuaCBhbmQgenV0aWwuaCBbVHJ1dGFdCi0gVXBkYXRlIHJlYWRtZS50eHQgaW4gY29udHJpYi9tYXNteDY0IGFuZCBtYXNteDg2IHRvIGFzc2VtYmxlCgpDaGFuZ2VzIGluIDEuMi4zLjkgKDIxIEZlYiAyMDEwKQotIEV4cHVuZ2UgZ3ppby5jCi0gTW92ZSBhczQwMCBidWlsZCBpbmZvcm1hdGlvbiB0byBvbGQKLSBGaXggdXBkYXRlcyBpbiBjb250cmliL21pbml6aXAgYW5kIGNvbnRyaWIvdnN0dWRpbwotIEFkZCBjb25zdCB0byB2c25wcmludGYgdGVzdCBpbiBjb25maWd1cmUgdG8gYXZvaWQgd2FybmluZ3MgW1dlaWdlbHRdCi0gRGVsZXRlIHpjb25mLmggKG1hZGUgYnkgY29uZmlndXJlKSBbV2VpZ2VsdF0KLSBDaGFuZ2UgemNvbmYuaW4uaCB0byB6Y29uZi5oLmluIHBlciBjb252ZW50aW9uIFtXZWlnZWx0XQotIENoZWNrIGZvciBOVUxMIGJ1ZiBpbiBnemdldHMoKQotIFJldHVybiBlbXB0eSBzdHJpbmcgZm9yIGd6Z2V0cygpIHdpdGggbGVuID09IDEgKGxpa2UgZmdldHMoKSkKLSBGaXggZGVzY3JpcHRpb24gb2YgZ3pnZXRzKCkgaW4gemxpYi5oIGZvciBlbmQtb2YtZmlsZSwgTlVMTCByZXR1cm4KLSBVcGRhdGUgbWluaXppcCB0byAxLjEgW1ZvbGxhbnRdCi0gQXZvaWQgTVNWQyBsb3NzIG9mIGRhdGEgd2FybmluZ3MgaW4gZ3pyZWFkLmMsIGd6d3JpdGUuYwotIE5vdGUgaW4gemxpYi5oIHRoYXQgZ3plcnJvcigpIHNob3VsZCBiZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIGZyb20gRU9GCi0gUmVtb3ZlIHVzZSBvZiBzbnByaW50ZigpIGZyb20gZ3psaWIuYwotIEZpeCBidWcgaW4gZ3pzZWVrKCkKLSBVcGRhdGUgY29udHJpYi92c3R1ZGlvLCBhZGRpbmcgdmM5IGFuZCB2YzEwIFtLdW5vLCBWb2xsYW50XQotIEZpeCB6Y29uZi5oIGdlbmVyYXRpb24gaW4gQ01ha2VMaXN0cy50eHQgW0xvd21hbl0KLSBJbXByb3ZlIGNvbW1lbnRzIGluIHpjb25mLmggd2hlcmUgbW9kaWZpZWQgYnkgY29uZmlndXJlCgpDaGFuZ2VzIGluIDEuMi4zLjggKDEzIEZlYiAyMDEwKQotIENsZWFuIHVwIHRleHQgZmlsZXMgKHRhYnMsIHRyYWlsaW5nIHdoaXRlc3BhY2UsIGV0Yy4pIFtPYmVyaHVtZXJdCi0gVXNlIHpfb2ZmNjRfdCBpbiBnel96ZXJvKCkgYW5kIGd6X3NraXAoKSB0byBtYXRjaCBzdGF0ZS0+c2tpcAotIEF2b2lkIGNvbXBhcmlzb24gcHJvYmxlbSB3aGVuIHNpemVvZihpbnQpID09IHNpemVvZih6X29mZjY0X3QpCi0gUmV2ZXJ0IHRvIE1ha2VmaWxlLmluIGZyb20gMS4yLjMuNiAobGl2ZSB3aXRoIHRoZSBjbHV0dGVyKQotIEZpeCBtaXNzaW5nIGVycm9yIHJldHVybiBpbiBnemZsdXNoKCksIGFkZCB6bGliLmggbm90ZQotIEFkZCAqNjQgZnVuY3Rpb25zIHRvIHpsaWIubWFwIFtMZXZpbl0KLSBGaXggc2lnbmVkL3Vuc2lnbmVkIGNvbXBhcmlzb24gaW4gZ3pfY29tcCgpCi0gVXNlIFNGTEFHUyB3aGVuIHRlc3Rpbmcgc2hhcmVkIGxpbmtpbmcgaW4gY29uZmlndXJlCi0gQWRkIC0tNjQgb3B0aW9uIHRvIC4vY29uZmlndXJlIHRvIHVzZSAtbTY0IHdpdGggZ2NjCi0gRml4IC4vY29uZmlndXJlIC0taGVscCB0byBjb3JyZWN0bHkgbmFtZSBvcHRpb25zCi0gSGF2ZSBtYWtlIGZhaWwgaWYgYSB0ZXN0IGZhaWxzIFtMZXZpbl0KLSBBdm9pZCBidWZmZXIgb3ZlcnJ1biBpbiBjb250cmliL21hc214NjQvZ3ZtYXQ2NC5hc20gW1NpbXBzb25dCi0gUmVtb3ZlIGFzc2VtYmxlciBvYmplY3QgZmlsZXMgZnJvbSBjb250cmliCgpDaGFuZ2VzIGluIDEuMi4zLjcgKDI0IEphbiAyMDEwKQotIEFsd2F5cyBnem9wZW4oKSB3aXRoIE9fTEFSR0VGSUxFIGlmIGF2YWlsYWJsZQotIEZpeCBnemRpcmVjdCgpIHRvIHdvcmsgaW1tZWRpYXRlbHkgYWZ0ZXIgZ3pvcGVuKCkgb3IgZ3pkb3BlbigpCi0gTWFrZSBnemRpcmVjdCgpIG1vcmUgcHJlY2lzZSB3aGVuIHRoZSBzdGF0ZSBjaGFuZ2VzIHdoaWxlIHJlYWRpbmcKLSBJbXByb3ZlIHpsaWIuaCBkb2N1bWVudGF0aW9uIGluIG1hbnkgcGxhY2VzCi0gQ2F0Y2ggbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSBpbiBnel9vcGVuKCkKLSBDb21wbGV0ZSBjbG9zZSBvcGVyYXRpb24gaWYgc2VlayBmb3J3YXJkIGluIGd6Y2xvc2VfdygpIGZhaWxzCi0gUmV0dXJuIFpfRVJSTk8gZnJvbSBnemNsb3NlX3IoKSBpZiBjbG9zZSgpIGZhaWxzCi0gUmV0dXJuIFpfU1RSRUFNX0VSUk9SIGluc3RlYWQgb2YgRU9GIGZvciBnemNsb3NlKCkgYmVpbmcgcGFzc2VkIE5VTEwKLSBSZXR1cm4gemVybyBmb3IgZ3p3cml0ZSgpIGVycm9ycyB0byBtYXRjaCB6bGliLmggZGVzY3JpcHRpb24KLSBSZXR1cm4gLTEgb24gZ3pwdXRzKCkgZXJyb3IgdG8gbWF0Y2ggemxpYi5oIGRlc2NyaXB0aW9uCi0gQWRkIHpjb25mLmluLmggdG8gYWxsb3cgcmVjb3ZlcnkgZnJvbSBjb25maWd1cmUgbW9kaWZpY2F0aW9uIFtXZWlnZWx0XQotIEZpeCBzdGF0aWMgbGlicmFyeSBwZXJtaXNzaW9ucyBpbiBNYWtlZmlsZS5pbiBbV2VpZ2VsdF0KLSBBdm9pZCB3YXJuaW5ncyBpbiBjb25maWd1cmUgdGVzdHMgdGhhdCBoaWRlIGZ1bmN0aW9uYWxpdHkgW1dlaWdlbHRdCi0gQWRkICpCU0QgYW5kIERyYWdvbkZseSB0byBMaW51eCBjYXNlIGluIGNvbmZpZ3VyZSBbZ2VudG9vIDEyMzU3MV0KLSBDaGFuZ2UgbGliemRsbC5hIHRvIGxpYnouZGxsLmEgaW4gd2luMzIvTWFrZWZpbGUuZ2NjIFtnZW50b28gMjg4MjEyXQotIEF2b2lkIGFjY2VzcyBvZiB1bmluaXRpYWxpemVkIGRhdGEgZm9yIGZpcnN0IGluZmxhdGVSZXNldDIgY2FsbCBbR29tZXNdCi0gS2VlcCBvYmplY3QgZmlsZXMgaW4gc3ViZGlyZWN0b3JpZXMgdG8gcmVkdWNlIHRoZSBjbHV0dGVyIHNvbWV3aGF0Ci0gUmVtb3ZlIGRlZmF1bHQgTWFrZWZpbGUgYW5kIHpsaWJkZWZzLmgsIGFkZCBkdW1teSBNYWtlZmlsZQotIEFkZCBuZXcgZXh0ZXJuYWwgZnVuY3Rpb25zIHRvIFpfUFJFRklYLCByZW1vdmUgZHVwbGljYXRlcywgel96XyAtPiB6XwotIFJlbW92ZSB6bGliZGVmcy5oIGNvbXBsZXRlbHkgLS0gbW9kaWZ5IHpjb25mLmggaW5zdGVhZAoKQ2hhbmdlcyBpbiAxLjIuMy42ICgxNyBKYW4gMjAxMCkKLSBBdm9pZCB2b2lkICogYXJpdGhtZXRpYyBpbiBnenJlYWQuYyBhbmQgZ3p3cml0ZS5jCi0gTWFrZSBjb21waWxlcnMgaGFwcGllciB3aXRoIGNvbnN0IGNoYXIgKiBmb3IgZ3pfZXJyb3IgbWVzc2FnZQotIEF2b2lkIHVudXNlZCBwYXJhbWV0ZXIgd2FybmluZyBpbiBpbmZsYXRlLmMKLSBBdm9pZCBzaWduZWQtdW5zaWduZWQgY29tcGFyaXNvbiB3YXJuaW5nIGluIGluZmxhdGUuYwotIEluZGVudCAjcHJhZ21hJ3MgZm9yIHRyYWRpdGlvbmFsIEMKLSBGaXggdXNhZ2Ugb2Ygc3Ryd2luZXJyb3IoKSBpbiBnbGliLmMsIGNoYW5nZSB0byBnel9zdHJ3aW5lcnJvcigpCi0gQ29ycmVjdCBlbWFpbCBhZGRyZXNzIGluIGNvbmZpZ3VyZSBmb3Igc3lzdGVtIG9wdGlvbnMKLSBVcGRhdGUgbWFrZV92bXMuY29tIGFuZCBhZGQgbWFrZV92bXMuY29tIHRvIGNvbnRyaWIvbWluaXppcCBbWmluc2VyXQotIFVwZGF0ZSB6bGliLm1hcCBbQnJvd25dCi0gRml4IE1ha2VmaWxlLmluIGZvciBTb2xhcmlzIDEwIG1ha2Ugb2YgZXhhbXBsZTY0IGFuZCBtaW5pemlwNjQgW1Rvcm9rXQotIEFwcGx5IHZhcmlvdXMgZml4ZXMgdG8gQ01ha2VMaXN0cy50eHQgW0xvd21hbl0KLSBBZGQgY2hlY2tzIG9uIGxlbiBpbiBnenJlYWQoKSBhbmQgZ3p3cml0ZSgpCi0gQWRkIGVycm9yIG1lc3NhZ2UgZm9yIG5vIG1vcmUgcm9vbSBmb3IgZ3p1bmdldGMoKQotIFJlbW92ZSB6bGliIHZlcnNpb24gY2hlY2sgaW4gZ3p3cml0ZSgpCi0gRGVmZXIgY29tcHJlc3Npb24gb2YgZ3pwcmludGYoKSByZXN1bHQgdW50aWwgbmVlZCB0bwotIFVzZSBzbnByaW50ZigpIGluIGd6ZG9wZW4oKSBpZiBhdmFpbGFibGUKLSBSZW1vdmUgVVNFX01NQVAgY29uZmlndXJhdGlvbiBkZXRlcm1pbmF0aW9uIChvbmx5IHVzZWQgYnkgbWluaWd6aXApCi0gUmVtb3ZlIGV4YW1wbGVzL3BpZ3ouYyAoYXZhaWxhYmxlIHNlcGFyYXRlbHkpCi0gVXBkYXRlIGV4YW1wbGVzL2d1bi5jIHRvIDEuNgoKQ2hhbmdlcyBpbiAxLjIuMy41ICg4IEphbiAyMDEwKQotIEFkZCBzcGFjZSBhZnRlciAjaWYgaW4genV0aWwuaCBmb3Igc29tZSBjb21waWxlcnMKLSBGaXggcmVsYXRpdmVseSBoYXJtbGVzcyBidWcgaW4gZGVmbGF0ZV9mYXN0KCkgW0V4YXJldnNreV0KLSBGaXggc2FtZSBwcm9ibGVtIGluIGRlZmxhdGVfc2xvdygpCi0gQWRkICQoU0hBUkVETElCVikgdG8gTElCUyBpbiBNYWtlZmlsZS5pbiBbQnJvd25dCi0gQWRkIGRlZmxhdGVfcmxlKCkgZm9yIGZhc3RlciBaX1JMRSBzdHJhdGVneSBydW4tbGVuZ3RoIGVuY29kaW5nCi0gQWRkIGRlZmxhdGVfaHVmZigpIGZvciBmYXN0ZXIgWl9IVUZGTUFOX09OTFkgZW5jb2RpbmcKLSBDaGFuZ2UgbmFtZSBvZiAid3JpdGUiIHZhcmlhYmxlIGluIGluZmZhc3QuYyB0byBhdm9pZCBsaWJyYXJ5IGNvbGxpc2lvbnMKLSBGaXggcHJlbWF0dXJlIEVPRiBmcm9tIGd6cmVhZCgpIGluIGd6aW8uYyBbQnJvd25dCi0gVXNlIHpsaWIgaGVhZGVyIHdpbmRvdyBzaXplIGlmIHdpbmRvd0JpdHMgaXMgMCBpbiBpbmZsYXRlSW5pdDIoKQotIFJlbW92ZSBjb21wcmVzc0JvdW5kKCkgY2FsbCBpbiBkZWZsYXRlLmMgdG8gYXZvaWQgbGlua2luZyBjb21wcmVzcy5vCi0gUmVwbGFjZSB1c2Ugb2YgZXJybm8gaW4gZ3oqIHdpdGggZnVuY3Rpb25zLCBzdXBwb3J0IFdpbkNFIFtBbHZlc10KLSBQcm92aWRlIGFsdGVybmF0aXZlIHRvIHBlcnJvcigpIGluIG1pbmlnemlwLmMgZm9yIFdpbkNFIFtBbHZlc10KLSBEb24ndCB1c2UgX3ZzbnByaW50ZiBvbiBsYXRlciB2ZXJzaW9ucyBvZiBNU1ZDIFtMb3dtYW5dCi0gQWRkIENNYWtlIGJ1aWxkIHNjcmlwdCBhbmQgaW5wdXQgZmlsZSBbTG93bWFuXQotIFVwZGF0ZSBjb250cmliL21pbml6aXAgdG8gMS4xIFtTdmVuc3NvbiwgVm9sbGFudF0KLSBNb3ZlZCBuaW50ZW5kb2RzIGRpcmVjdG9yeSBmcm9tIGNvbnRyaWIgdG8gLgotIFJlcGxhY2UgZ3ppby5jIHdpdGggYSBuZXcgc2V0IG9mIHJvdXRpbmVzIHdpdGggdGhlIHNhbWUgZnVuY3Rpb25hbGl0eQotIEFkZCBnemJ1ZmZlcigpLCBnem9mZnNldCgpLCBnemNsb3NlX3IoKSwgZ3pjbG9zZV93KCkgYXMgcGFydCBvZiBhYm92ZQotIFVwZGF0ZSBjb250cmliL21pbml6aXAgdG8gMS4xYgotIENoYW5nZSBnemVvZigpIHRvIHJldHVybiAwIG9uIGVycm9yIGluc3RlYWQgb2YgLTEgdG8gYWdyZWUgd2l0aCB6bGliLmgKCkNoYW5nZXMgaW4gMS4yLjMuNCAoMjEgRGVjIDIwMDkpCi0gVXNlIG9sZCBzY2hvb2wgLlNVRkZJWEVTIGluIE1ha2VmaWxlLmluIGZvciBGcmVlQlNEIGNvbXBhdGliaWxpdHkKLSBVcGRhdGUgY29tbWVudHMgaW4gY29uZmlndXJlIGFuZCBNYWtlZmlsZS5pbiBmb3IgZGVmYXVsdCAtLXNoYXJlZAotIEZpeCB0ZXN0IC16J3MgaW4gY29uZmlndXJlIFtNYXJxdWVzc10KLSBCdWlsZCBleGFtcGxlc2ggYW5kIG1pbmlnemlwc2ggd2hlbiBub3QgdGVzdGluZwotIENoYW5nZSBOVUxMJ3MgdG8gWl9OVUxMJ3MgaW4gZGVmbGF0ZS5jIGFuZCBpbiBjb21tZW50cyBpbiB6bGliLmgKLSBJbXBvcnQgTERGTEFHUyBmcm9tIHRoZSBlbnZpcm9ubWVudCBpbiBjb25maWd1cmUKLSBGaXggY29uZmlndXJlIHRvIHBvcHVsYXRlIFNGTEFHUyB3aXRoIGRpc2NvdmVyZWQgQ0ZMQUdTIG9wdGlvbnMKLSBBZGFwdCBtYWtlX3Ztcy5jb20gdG8gdGhlIG5ldyBNYWtlZmlsZS5pbiBbWmluc2VyXQotIEFkZCB6bGliMmFuc2kgc2NyaXB0IGZvciBDKysgY29tcGlsYXRpb24gW01hcnF1ZXNzXQotIEFkZCBfRklMRV9PRkZTRVRfQklUUz02NCB0ZXN0IHRvIG1ha2UgdGVzdCAod2hlbiBhcHBsaWNhYmxlKQotIEFkZCBBTUQ2NCBhc3NlbWJsZXIgY29kZSBmb3IgbG9uZ2VzdCBtYXRjaCB0byBjb250cmliIFtUZXRlcmluXQotIEluY2x1ZGUgb3B0aW9ucyBmcm9tICRTRkxBR1Mgd2hlbiBkb2luZyAkTERTSEFSRUQKLSBTaW1wbGlmeSA2NC1iaXQgZmlsZSBzdXBwb3J0IGJ5IGludHJvZHVjaW5nIHpfb2ZmNjRfdCB0eXBlCi0gTWFrZSBzaGFyZWQgb2JqZWN0IGZpbGVzIGluIG9ianMgZGlyZWN0b3J5IHRvIHdvcmsgYXJvdW5kIG9sZCBTdW4gY2MKLSBVc2Ugb25seSB0aHJlZS1wYXJ0IHZlcnNpb24gbnVtYmVyIGZvciBEYXJ3aW4gc2hhcmVkIGNvbXBpbGVzCi0gQWRkIHJjIG9wdGlvbiB0byBhciBpbiBNYWtlZmlsZS5pbiBmb3Igd2hlbiAuL2NvbmZpZ3VyZSBub3QgcnVuCi0gQWRkIC1XSSwtcnBhdGgsLiB0byBMREZMQUdTIGZvciBPU0YgMSBWNCoKLSBTZXQgTERfTElCUkFSWU4zMl9QQVRIIGZvciBTR0kgSVJJWCBzaGFyZWQgY29tcGlsZQotIFByb3RlY3QgYWdhaW5zdCBfRklMRV9PRkZTRVRfQklUUyBiZWluZyBkZWZpbmVkIHdoZW4gY29tcGlsaW5nIHpsaWIKLSBSZW5hbWUgTWFrZWZpbGUuaW4gdGFyZ2V0cyBhbGxzdGF0aWMgdG8gc3RhdGljIGFuZCBhbGxzaGFyZWQgdG8gc2hhcmVkCi0gRml4IHN0YXRpYyBhbmQgc2hhcmVkIE1ha2VmaWxlLmluIHRhcmdldHMgdG8gYmUgaW5kZXBlbmRlbnQKLSBDb3JyZWN0IGVycm9yIHJldHVybiBidWcgaW4gZ3pfb3BlbigpIGJ5IHNldHRpbmcgc3RhdGUgW0Jyb3duXQotIFB1dCBzcGFjZXMgYmVmb3JlIDs7J3MgaW4gY29uZmlndXJlIGZvciBiZXR0ZXIgc2ggY29tcGF0aWJpbGl0eQotIEFkZCBwaWd6LmMgKHBhcmFsbGVsIGltcGxlbWVudGF0aW9uIG9mIGd6aXApIHRvIGV4YW1wbGVzLwotIENvcnJlY3QgY29uc3RhbnQgaW4gY3JjMzIuYyB0byBVTCBbTGV2ZW50aGFsXQotIFJlamVjdCBuZWdhdGl2ZSBsZW5ndGhzIGluIGNyYzMyX2NvbWJpbmUoKQotIEFkZCBpbmZsYXRlUmVzZXQyKCkgZnVuY3Rpb24gdG8gd29yayBsaWtlIGluZmxhdGVFbmQoKS9pbmZsYXRlSW5pdDIoKQotIEluY2x1ZGUgc3lzL3R5cGVzLmggZm9yIF9MQVJHRUZJTEU2NF9TT1VSQ0UgW0Jyb3duXQotIENvcnJlY3QgdHlwbyBpbiBkb2MvYWxnb3JpdGhtLnR4dCBbSmFuaWtdCi0gRml4IGJ1ZyBpbiBhZGxlcjMyX2NvbWJpbmUoKSBbWmh1XQotIENhdGNoIG1pc3NpbmctZW5kLW9mLWJsb2NrLWNvZGUgZXJyb3IgaW4gYWxsIGluZmxhdGVzIGFuZCBpbiBwdWZmCiAgICBBc3N1cmVzIHRoYXQgcmFuZG9tIGlucHV0IHRvIGluZmxhdGUgZXZlbnR1YWxseSByZXN1bHRzIGluIGFuIGVycm9yCi0gQWRkZWQgZW5vdWdoLmMgKGNhbGN1bGF0aW9uIG9mIEVOT1VHSCBmb3IgaW5mdHJlZXMuaCkgdG8gZXhhbXBsZXMvCi0gVXBkYXRlIEVOT1VHSCBhbmQgaXRzIHVzYWdlIHRvIHJlZmxlY3QgZGlzY292ZXJlZCBib3VuZHMKLSBGaXggZ3plcnJvcigpIGVycm9yIHJlcG9ydCBvbiBlbXB0eSBpbnB1dCBmaWxlIFtCcm93bl0KLSBBZGQgdXNoIGNhc3RzIGluIHRyZWVzLmMgdG8gYXZvaWQgcGVkYW50aWMgcnVudGltZSBlcnJvcnMKLSBGaXggdHlwbyBpbiB6bGliLmggdW5jb21wcmVzcygpIGRlc2NyaXB0aW9uIFtSZWlzc10KLSBDb3JyZWN0IGluZmxhdGUoKSBjb21tZW50cyB3aXRoIHJlZ2FyZCB0byBhdXRvbWF0aWMgaGVhZGVyIGRldGVjdGlvbgotIFJlbW92ZSBkZXByZWNhdGlvbiBjb21tZW50IG9uIFpfUEFSVElBTF9GTFVTSCAoaXQgc3RheXMpCi0gUHV0IG5ldyB2ZXJzaW9uIG9mIGd6bG9nICgyLjApIGluIGV4YW1wbGVzIHdpdGggaW50ZXJydXB0aW9uIHJlY292ZXJ5Ci0gQWRkIHB1ZmYgY29tcGlsZSBvcHRpb24gdG8gcGVybWl0IGludmFsaWQgZGlzdGFuY2UtdG9vLWZhciBzdHJlYW1zCi0gQWRkIHB1ZmYgVEVTVCBjb21tYW5kIG9wdGlvbnMsIGFiaWxpdHkgdG8gcmVhZCBwaXBlZCBpbnB1dAotIFByb3RvdHlwZSB0aGUgKjY0IGZ1bmN0aW9ucyBpbiB6bGliLmggd2hlbiBfRklMRV9PRkZTRVRfQklUUyA9PSA2NCwgYnV0CiAgX0xBUkdFRklMRTY0X1NPVVJDRSBub3QgZGVmaW5lZAotIEZpeCBaX0ZVTExfRkxVU0ggdG8gdHJ1bHkgZXJhc2UgdGhlIHBhc3QgYnkgcmVzZXR0aW5nIHMtPnN0cnN0YXJ0Ci0gRml4IGRlZmxhdGVTZXREaWN0aW9uYXJ5KCkgdG8gdXNlIGFsbCAzMksgZm9yIG91dHB1dCBjb25zaXN0ZW5jeQotIFJlbW92ZSBleHRyYW5lb3VzICNkZWZpbmUgTUlOX0xPT0tBSEVBRCBpbiBkZWZsYXRlLmMgKGluIGRlZmxhdGUuaCkKLSBDbGVhciBieXRlcyBhZnRlciBkZWZsYXRlIGxvb2thaGVhZCB0byBhdm9pZCB1c2Ugb2YgdW5pbml0aWFsaXplZCBkYXRhCi0gQ2hhbmdlIGEgbGltaXQgaW4gaW5mdHJlZXMuYyB0byBiZSBtb3JlIHRyYW5zcGFyZW50IHRvIENvdmVyaXR5IFByZXZlbnQKLSBVcGRhdGUgd2luMzIvemxpYi5kZWYgd2l0aCBleHBvcnRlZCBzeW1ib2xzIGZyb20gemxpYi5oCi0gQ29ycmVjdCBzcGVsbGluZyBlcnJvcnMgaW4gemxpYi5oIFtXaWxsZW0sIFNvYnJhZG9dCi0gQWxsb3cgWl9CTE9DSyBmb3IgZGVmbGF0ZSgpIHRvIGZvcmNlIGEgbmV3IGJsb2NrCi0gQWxsb3cgbmVnYXRpdmUgYml0cyBpbiBpbmZsYXRlUHJpbWUoKSB0byBkZWxldGUgZXhpc3RpbmcgYml0IGJ1ZmZlcgotIEFkZCBaX1RSRUVTIGZsdXNoIG9wdGlvbiB0byBpbmZsYXRlKCkgdG8gcmV0dXJuIGF0IGVuZCBvZiB0cmVlcwotIEFkZCBpbmZsYXRlTWFyaygpIHRvIHJldHVybiBjdXJyZW50IHN0YXRlIGluZm9ybWF0aW9uIGZvciByYW5kb20gYWNjZXNzCi0gQWRkIE1ha2VmaWxlIGZvciBOaW50ZW5kb0RTIHRvIGNvbnRyaWIgW0Nvc3RhXQotIEFkZCAtdyBpbiBjb25maWd1cmUgY29tcGlsZSB0ZXN0cyB0byBhdm9pZCBzcHVyaW91cyB3YXJuaW5ncyBbQmV1Y2xlcl0KLSBGaXggdHlwb3MgaW4gemxpYi5oIGNvbW1lbnRzIGZvciBkZWZsYXRlU2V0RGljdGlvbmFyeSgpCi0gRml4IEVPRiBkZXRlY3Rpb24gaW4gdHJhbnNwYXJlbnQgZ3pyZWFkKCkgW01haWVyXQoKQ2hhbmdlcyBpbiAxLjIuMy4zICgyIE9jdG9iZXIgMjAwNikKLSBNYWtlIC0tc2hhcmVkIHRoZSBkZWZhdWx0IGZvciBjb25maWd1cmUsIGFkZCBhIC0tc3RhdGljIG9wdGlvbgotIEFkZCBjb21waWxlIG9wdGlvbiB0byBwZXJtaXQgaW52YWxpZCBkaXN0YW5jZS10b28tZmFyIHN0cmVhbXMKLSBBZGQgaW5mbGF0ZVVuZGVybWluZSgpIGZ1bmN0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIGVuYWJsZSBhYm92ZQotIFJlbW92ZSB1c2Ugb2YgInRoaXMiIHZhcmlhYmxlIG5hbWUgZm9yIEMrKyBjb21wYXRpYmlsaXR5IFtNYXJxdWVzc10KLSBBZGQgdGVzdGluZyBvZiBzaGFyZWQgbGlicmFyeSBpbiBtYWtlIHRlc3QsIGlmIHNoYXJlZCBsaWJyYXJ5IGJ1aWx0Ci0gVXNlIGZ0ZWxsbygpIGFuZCBmc2Vla28oKSBpZiBhdmFpbGFibGUgaW5zdGVhZCBvZiBmdGVsbCgpIGFuZCBmc2VlaygpCi0gUHJvdmlkZSB0d28gdmVyc2lvbnMgb2YgYWxsIGZ1bmN0aW9ucyB0aGF0IHVzZSB0aGUgel9vZmZfdCB0eXBlIGZvcgogIGJpbmFyeSBjb21wYXRpYmlsaXR5IC0tIGEgbm9ybWFsIHZlcnNpb24gYW5kIGEgNjQtYml0IG9mZnNldCB2ZXJzaW9uLAogIHBlciB0aGUgTGFyZ2UgRmlsZSBTdXBwb3J0IEV4dGVuc2lvbiB3aGVuIF9MQVJHRUZJTEU2NF9TT1VSQ0UgaXMKICBkZWZpbmVkOyB1c2UgdGhlIDY0LWJpdCB2ZXJzaW9ucyBieSBkZWZhdWx0IHdoZW4gX0ZJTEVfT0ZGU0VUX0JJVFMKICBpcyBkZWZpbmVkIHRvIGJlIDY0Ci0gQWRkIGEgLS11bmFtZT0gb3B0aW9uIHRvIGNvbmZpZ3VyZSB0byBwZXJoYXBzIGhlbHAgd2l0aCBjcm9zcy1jb21waWxpbmcKCkNoYW5nZXMgaW4gMS4yLjMuMiAoMyBTZXB0ZW1iZXIgMjAwNikKLSBUdXJuIG9mZiBzaWxseSBCb3JsYW5kIHdhcm5pbmdzIFtIYXldCi0gVXNlIG9mZjY0X3QgYW5kIGRlZmluZSBfTEFSR0VGSUxFNjRfU09VUkNFIHdoZW4gcHJlc2VudAotIEZpeCBtaXNzaW5nIGRlcGVuZGVuY3kgb24gaW5mZml4ZWQuaCBpbiBNYWtlZmlsZS5pbgotIFJpZyBjb25maWd1cmUgLS1zaGFyZWQgdG8gYnVpbGQgYm90aCBzaGFyZWQgYW5kIHN0YXRpYyBbVGVyZWRlc2FpLCBUcnV0YV0KLSBSZW1vdmUgemNvbmYuaW4uaCBhbmQgaW5zdGVhZCBjcmVhdGUgYSBuZXcgemxpYmRlZnMuaCBmaWxlCi0gRml4IGNvbnRyaWIvbWluaXppcC91bnppcC5jIG5vbi1lbmNyeXB0ZWQgYWZ0ZXIgZW5jcnlwdGVkIFtWb2xsYW50XQotIEFkZCB0cmVlYnVpbGQueG1sIChzZWUgaHR0cDovL3RyZWVidWlsZC5tZXR1eC5kZS8pIFtXZWlnZWx0XQoKQ2hhbmdlcyBpbiAxLjIuMy4xICgxNiBBdWd1c3QgMjAwNikKLSBBZGQgd2F0Y29tIGRpcmVjdG9yeSB3aXRoIE9wZW5XYXRjb20gbWFrZSBmaWxlcyBbRGFuaWVsXQotIFJlbW92ZSAjdW5kZWYgb2YgRkFSIGluIHpjb25mLmluLmggZm9yIE1WUyBbRmVkdGtlXQotIFVwZGF0ZSBtYWtlX3Ztcy5jb20gW1ppbnNlcl0KLSBVc2UgLWZQSUMgZm9yIHNoYXJlZCBidWlsZCBpbiBjb25maWd1cmUgW1RlcmVkZXNhaSwgTmljaG9sc29uXQotIFVzZSBvbmx5IG1ham9yIHZlcnNpb24gbnVtYmVyIGZvciBsaWJ6LnNvIG9uIElSSVggYW5kIE9TRjEgW1JlaW5ob2xkdHNlbl0KLSBVc2UgZmRvcGVuKCkgKG5vdCBfZmRvcGVuKCkpIGZvciBJbnRlcml4IGluIHp1dGlsLmggW0KKY2tdCi0gQWRkIHNvbWUgRkFRIGVudHJpZXMgYWJvdXQgdGhlIGNvbnRyaWIgZGlyZWN0b3J5Ci0gVXBkYXRlIHRoZSBNVlMgcXVlc3Rpb24gaW4gdGhlIEZBUQotIEF2b2lkIGV4dHJhbmVvdXMgcmVhZHMgYWZ0ZXIgRU9GIGluIGd6aW8uYyBbQnJvd25dCi0gQ29ycmVjdCBzcGVsbGluZyBvZiAic3VjY2Vzc2Z1bGx5IiBpbiBnemlvLmMgW1JhbmRlcnMtUGVocnNvbl0KLSBBZGQgY29tbWVudHMgdG8gemxpYi5oIGFib3V0IGd6ZXJyb3IoKSB1c2FnZSBbQnJvd25dCi0gU2V0IGV4dHJhIGZsYWdzIGluIGd6aXAgaGVhZGVyIGluIGd6b3BlbigpIGxpa2UgZGVmbGF0ZSgpIGRvZXMKLSBNYWtlIGNvbmZpZ3VyZSBvcHRpb25zIG1vcmUgY29tcGF0aWJsZSB3aXRoIGRvdWJsZS1kYXNoIGNvbnZlbnRpb25zCiAgW1dlaWdlbHRdCi0gQ2xlYW4gdXAgY29tcGlsYXRpb24gdW5kZXIgU29sYXJpcyBTdW5TdHVkaW8gY2MgW1Jvd2UsIFJlaW5ob2xkdHNlbl0KLSBGaXggdW5pbnN0YWxsIHRhcmdldCBpbiBNYWtlZmlsZS5pbiBbVHJ1dGFdCi0gQWRkIHBrZ2NvbmZpZyBzdXBwb3J0IFtXZWlnZWx0XQotIFVzZSAkKERFU1RESVIpIG1hY3JvIGluIE1ha2VmaWxlLmluIFtSZWluaG9sZHRzZW4sIFdlaWdlbHRdCi0gUmVwbGFjZSBzZXRfZGF0YV90eXBlKCkgd2l0aCBhIG1vcmUgYWNjdXJhdGUgZGV0ZWN0X2RhdGFfdHlwZSgpIGluCiAgdHJlZXMuYywgYWNjb3JkaW5nIHRvIHRoZSB0eHR2c2Jpbi50eHQgZG9jdW1lbnQgW1RydXRhXQotIFN3YXAgdGhlIG9yZGVyIG9mICNpbmNsdWRlIDxzdGRpby5oPiBhbmQgI2luY2x1ZGUgInpsaWIuaCIgaW4KICBnemlvLmMsIGV4YW1wbGUuYyBhbmQgbWluaWd6aXAuYyBbVHJ1dGFdCi0gU2h1dCB1cCBhbm5veWluZyBWUzIwMDUgd2FybmluZ3MgYWJvdXQgc3RhbmRhcmQgQyBkZXByZWNhdGlvbiBbUm93ZSwKICBUcnV0YV0gKHdoZXJlPykKLSBGaXggdGFyZ2V0ICJjbGVhbiIgZnJvbSB3aW4zMi9NYWtlZmlsZS5ib3IgW1RydXRhXQotIENyZWF0ZSAucGRiIGFuZCAubWFuaWZlc3QgZmlsZXMgaW4gd2luMzIvbWFrZWZpbGUubXNjIFtaaWVnbGVyLCBSb3dlXQotIFVwZGF0ZSB6bGliIHd3dyBob21lIGFkZHJlc3MgaW4gd2luMzIvRExMX0ZBUS50eHQgW1RydXRhXQotIFVwZGF0ZSBjb250cmliL21hc214ODYvaW5mZmFzMzIuYXNtIGZvciBWUzIwMDUgW1ZvbGxhbnQsIFZhbiBXYXNzZW5ob3ZlXQotIEVuYWJsZSBicm93c2UgaW5mbyBpbiB0aGUgIkRlYnVnIiBhbmQgIkFTTSBEZWJ1ZyIgY29uZmlndXJhdGlvbnMgaW4KICB0aGUgVmlzdWFsIEMrKyA2IHByb2plY3QsIGFuZCBzZXQgKG5vbi1BU00pICJEZWJ1ZyIgYXMgZGVmYXVsdCBbVHJ1dGFdCi0gQWRkIHBrZ2NvbmZpZyBzdXBwb3J0IFtXZWlnZWx0XQotIEFkZCBaTElCX1ZFUl9NQUpPUiwgWkxJQl9WRVJfTUlOT1IgYW5kIFpMSUJfVkVSX1JFVklTSU9OIGluIHpsaWIuaCwKICBmb3IgdXNlIGluIHdpbjMyL3psaWIxLnJjIFtQb2x1c2hpbiwgUm93ZSwgVHJ1dGFdCi0gQWRkIGEgZG9jdW1lbnQgdGhhdCBleHBsYWlucyB0aGUgbmV3IHRleHQgZGV0ZWN0aW9uIHNjaGVtZSB0bwogIGRvYy90eHR2c2Jpbi50eHQgW1RydXRhXQotIEFkZCByZmMxOTUwLnR4dCwgcmZjMTk1MS50eHQgYW5kIHJmYzE5NTIudHh0IHRvIGRvYy8gW1RydXRhXQotIE1vdmUgYWxnb3JpdGhtLnR4dCBpbnRvIGRvYy8gW1RydXRhXQotIFN5bmNocm9uaXplIEZBUSB3aXRoIHdlYnNpdGUKLSBGaXggY29tcHJlc3NCb3VuZCgpLCB3YXMgbG93IGZvciBzb21lIHBhdGhvbG9naWNhbCBjYXNlcyBbRmVhcm5sZXldCi0gVGFrZSBpbnRvIGFjY291bnQgd3JhcHBlciB2YXJpYXRpb25zIGluIGRlZmxhdGVCb3VuZCgpCi0gU2V0IGV4YW1wbGVzL3pwaXBlLmMgaW5wdXQgYW5kIG91dHB1dCB0byBiaW5hcnkgbW9kZSBmb3IgV2luZG93cwotIFVwZGF0ZSBleGFtcGxlcy96bGliX2hvdy5odG1sIHdpdGggbmV3IHpwaXBlLmMgKGFsc28gd2ViIHNpdGUpCi0gRml4IHNvbWUgd2FybmluZ3MgaW4gZXhhbXBsZXMvZ3psb2cuYyBhbmQgZXhhbXBsZXMvenJhbi5jIChpdCBzZWVtcwogIHRoYXQgZ2NjIGJlY2FtZSBwaWNraWVyIGluIDQuMCkKLSBBZGQgemxpYi5tYXAgZm9yIExpbnV4OiAiQWxsIHN5bWJvbHMgZnJvbSB6bGliLTEuMS40IHJlbWFpbgogIHVuLXZlcnNpb25lZCwgdGhlIHBhdGNoIGFkZHMgdmVyc2lvbmluZyBvbmx5IGZvciBzeW1ib2xzIGludHJvZHVjZWQgaW4KICB6bGliLTEuMi4wIG9yIGxhdGVyLiAgSXQgYWxzbyBkZWNsYXJlcyBhcyBsb2NhbCB0aG9zZSBzeW1ib2xzIHdoaWNoIGFyZQogIG5vdCBkZXNpZ25lZCB0byBiZSBleHBvcnRlZC4iIFtMZXZpbl0KLSBVcGRhdGUgWl9QUkVGSVggbGlzdCBpbiB6Y29uZi5pbi5oLCBhZGQgLS16cHJlZml4IG9wdGlvbiB0byBjb25maWd1cmUKLSBEbyBub3QgaW5pdGlhbGl6ZSBnbG9iYWwgc3RhdGljIGJ5IGRlZmF1bHQgaW4gdHJlZXMuYywgYWRkIGEgcmVzcG9uc2UKICBOT19JTklUX0dMT0JBTF9QT0lOVEVSUyB0byBpbml0aWFsaXplIHRoZW0gaWYgbmVlZGVkIFtNYXJxdWVzc10KLSBEb24ndCB1c2Ugc3RyZXJyb3IoKSBpbiBnemlvLmMgdW5kZXIgV2luQ0UgW1lha2ltb3ZdCi0gRG9uJ3QgdXNlIGVycm5vLmggaW4genV0aWwuaCB1bmRlciBXaW5DRSBbWWFraW1vdl0KLSBNb3ZlIGFyZ3VtZW50cyBmb3IgQVIgdG8gaXRzIHVzYWdlIHRvIGFsbG93IHJlcGxhY2luZyBhciBbTWFyb3RdCi0gQWRkIEhBVkVfVklTSUJJTElUWV9QUkFHTUEgaW4gemNvbmYuaW4uaCBmb3IgTW96aWxsYSBbUmFuZGVycy1QZWhyc29uXQotIEltcHJvdmUgaW5mbGF0ZUluaXQoKSBhbmQgaW5mbGF0ZUluaXQyKCkgZG9jdW1lbnRhdGlvbgotIEZpeCBzdHJ1Y3R1cmUgc2l6ZSBjb21tZW50IGluIGluZmxhdGUuaAotIENoYW5nZSBjb25maWd1cmUgaGVscCBvcHRpb24gZnJvbSAtLWgqIHRvIC0taGVscCBbU2FudG9zXQoKQ2hhbmdlcyBpbiAxLjIuMyAoMTggSnVseSAyMDA1KQotIEFwcGx5IHNlY3VyaXR5IHZ1bG5lcmFiaWxpdHkgZml4ZXMgdG8gY29udHJpYi9pbmZiYWNrOSBhcyB3ZWxsCi0gQ2xlYW4gdXAgc29tZSB0ZXh0IGZpbGVzIChjYXJyaWFnZSByZXR1cm5zLCB0cmFpbGluZyBzcGFjZSkKLSBVcGRhdGUgdGVzdHpsaWIsIHZzdHVkaW8sIG1hc214NjQsIGFuZCBtYXNteDg2IGluIGNvbnRyaWIgW1ZvbGxhbnRdCgpDaGFuZ2VzIGluIDEuMi4yLjQgKDExIEp1bHkgMjAwNSkKLSBBZGQgaW5mbGF0ZVByaW1lKCkgZnVuY3Rpb24gZm9yIHN0YXJ0aW5nIGluZmxhdGlvbiBhdCBiaXQgYm91bmRhcnkKLSBBdm9pZCBzb21lIFZpc3VhbCBDIHdhcm5pbmdzIGluIGRlZmxhdGUuYwotIEF2b2lkIG1vcmUgc2lsbHkgVmlzdWFsIEMgd2FybmluZ3MgaW4gaW5mbGF0ZS5jIGFuZCBpbmZ0cmVlcy5jIGZvciA2NC1iaXQKICBjb21waWxlCi0gRml4IHNvbWUgc3BlbGxpbmcgZXJyb3JzIGluIGNvbW1lbnRzIFtCZXR0c10KLSBDb3JyZWN0IGluZmxhdGVJbml0MigpIGVycm9yIHJldHVybiBkb2N1bWVudGF0aW9uIGluIHpsaWIuaAotIEFkZCB6cmFuLmMgZXhhbXBsZSBvZiBjb21wcmVzc2VkIGRhdGEgcmFuZG9tIGFjY2VzcyB0byBleGFtcGxlcwogIGRpcmVjdG9yeSwgc2hvd3MgdXNlIG9mIGluZmxhdGVQcmltZSgpCi0gRml4IGNhc3QgZm9yIGFzc2lnbm1lbnRzIHRvIHN0cm0tPnN0YXRlIGluIGluZmxhdGUuYyBhbmQgaW5mYmFjay5jCi0gRml4IHpsaWJDb21waWxlRmxhZ3MoKSBpbiB6dXRpbC5jIHRvIHVzZSAxTCBmb3IgbG9uZyBzaGlmdHMgW09iZXJodW1lcl0KLSBNb3ZlIGRlY2xhcmF0aW9ucyBvZiBnZjIgZnVuY3Rpb25zIHRvIHJpZ2h0IHBsYWNlIGluIGNyYzMyLmMgW09iZXJodW1lcl0KLSBBZGQgY2FzdCBpbiB0cmVlcy5jIHQgYXZvaWQgYSB3YXJuaW5nIFtPYmVyaHVtZXJdCi0gQXZvaWQgc29tZSB3YXJuaW5ncyBpbiBmaXRibGsuYywgZ3VuLmMsIGd6am9pbi5jIGluIGV4YW1wbGVzIFtPYmVyaHVtZXJdCi0gVXBkYXRlIG1ha2Vfdm1zLmNvbSBbWmluc2VyXQotIEluaXRpYWxpemUgc3RhdGUtPndyaXRlIGluIGluZmxhdGVSZXNldCgpIHNpbmNlIGNvcGllZCBpbiBpbmZsYXRlX2Zhc3QoKQotIEJlIG1vcmUgc3RyaWN0IG9uIGluY29tcGxldGUgY29kZSBzZXRzIGluIGluZmxhdGVfdGFibGUoKSBhbmQgaW5jcmVhc2UKICBFTk9VR0ggYW5kIE1BWEQgLS0gdGhpcyByZXBhaXJzIGEgcG9zc2libGUgc2VjdXJpdHkgdnVsbmVyYWJpbGl0eSBmb3IKICBpbnZhbGlkIGluZmxhdGUgaW5wdXQuICBUaGFua3MgdG8gVGF2aXMgT3JtYW5keSBhbmQgTWFya3VzIE9iZXJodW1lciBmb3IKICBkaXNjb3ZlcmluZyB0aGUgdnVsbmVyYWJpbGl0eSBhbmQgcHJvdmlkaW5nIHRlc3QgY2FzZXMuCi0gQWRkIGlhNjQgc3VwcG9ydCB0byBjb25maWd1cmUgZm9yIEhQLVVYIFtTbWl0aF0KLSBBZGQgZXJyb3IgcmV0dXJuIHRvIGd6cmVhZCgpIGZvciBmb3JtYXQgb3IgaS9vIGVycm9yIFtMZXZpbl0KLSBVc2UgbWFsbG9jLmggZm9yIE9TLzIgW05lY2FzZWtdCgpDaGFuZ2VzIGluIDEuMi4yLjMgKDI3IE1heSAyMDA1KQotIFJlcGxhY2UgMVUgY29uc3RhbnRzIGluIGluZmxhdGUuYyBhbmQgaW5mdHJlZXMuYyBmb3IgNjQtYml0IGNvbXBpbGUKLSBUeXBlY2FzdCBmcmVhZCgpIHJldHVybiB2YWx1ZXMgaW4gZ3ppby5jIFtWb2xsYW50XQotIFJlbW92ZSB0cmFpbGluZyBzcGFjZSBpbiBtaW5pZ3ppcC5jIG91dG1vZGUgKFZDKysgY2FuJ3QgZGVhbCB3aXRoIGl0KQotIEZpeCBjcmMgY2hlY2sgYnVnIGluIGd6cmVhZCgpIGFmdGVyIGd6dW5nZXRjKCkgW0hlaW5lcl0KLSBBZGQgdGhlIGRlZmxhdGVUdW5lKCkgZnVuY3Rpb24gdG8gYWRqdXN0IGludGVybmFsIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMKLSBBZGQgYSBmYXN0IGd6aXAgZGVjb21wcmVzc29yLCBndW4uYywgdG8gZXhhbXBsZXMgKHVzZSBvZiBpbmZsYXRlQmFjaykKLSBSZW1vdmUgYW4gaW5jb3JyZWN0IGFzc2VydGlvbiBpbiBleGFtcGxlcy96cGlwZS5jCi0gQWRkIEMrKyB3cmFwcGVyIGluIGluZmJhY2s5LmggW0RvbmFpc10KLSBGaXggYnVnIGluIGluZmxhdGVDb3B5KCkgd2hlbiBkZWNvZGluZyBmaXhlZCBjb2RlcwotIE5vdGUgaW4gemxpYi5oIGhvdyBtdWNoIGRlZmxhdGVTZXREaWN0aW9uYXJ5KCkgYWN0dWFsbHkgdXNlcwotIFJlbW92ZSBVU0VfRElDVF9IRUFEIGluIGRlZmxhdGUuYyAod291bGQgbWVzcyB1cCBpbmZsYXRlIGlmIHVzZWQpCi0gQWRkIF9XSU4zMl9XQ0UgdG8gZGVmaW5lIFdJTjMyIGluIHpjb25mLmluLmggW1NwZW5jZXJdCi0gRG9uJ3QgaW5jbHVkZSBzdGRlcnIuaCBvciBlcnJuby5oIGZvciBfV0lOMzJfV0NFIGluIHp1dGlsLmggW1NwZW5jZXJdCi0gQWRkIGd6ZGlyZWN0KCkgZnVuY3Rpb24gdG8gaW5kaWNhdGUgdHJhbnNwYXJlbnQgcmVhZHMKLSBVcGRhdGUgY29udHJpYi9taW5pemlwIFtWb2xsYW50XQotIEZpeCBjb21waWxhdGlvbiBvZiBkZWZsYXRlLmMgd2hlbiBib3RoIEFTTVYgYW5kIEZBU1RFU1QgW09iZXJodW1lcl0KLSBBZGQgY2FzdHMgaW4gY3JjMzIuYyB0byBhdm9pZCB3YXJuaW5ncyBbT2Jlcmh1bWVyXQotIEFkZCBjb250cmliL21hc214NjQgW1ZvbGxhbnRdCi0gVXBkYXRlIGNvbnRyaWIvYXNtNTg2LCBhc202ODYsIG1hc214ODYsIHRlc3R6bGliLCB2c3R1ZGlvIFtWb2xsYW50XQoKQ2hhbmdlcyBpbiAxLjIuMi4yICgzMCBEZWNlbWJlciAyMDA0KQotIFJlcGxhY2Ugc3RydWN0dXJlIGFzc2lnbm1lbnRzIGluIGRlZmxhdGUuYyBhbmQgaW5mbGF0ZS5jIHdpdGggem1lbWNweSB0bwogIGF2b2lkIGltcGxpY2l0IG1lbWNweSBjYWxscyAocG9ydGFiaWxpdHkgZm9yIG5vLWxpYnJhcnkgY29tcGlsYXRpb24pCi0gSW5jcmVhc2Ugc3ByaW50ZigpIGJ1ZmZlciBzaXplIGluIGd6ZG9wZW4oKSB0byBhbGxvdyBmb3IgbGFyZ2UgbnVtYmVycwotIEFkZCBJTkZMQVRFX1NUUklDVCB0byBjaGVjayBkaXN0YW5jZXMgYWdhaW5zdCB6bGliIGhlYWRlcgotIEltcHJvdmUgV2luQ0UgZXJybm8gaGFuZGxpbmcgYW5kIGNvbW1lbnRzIFtDaGFuZ10KLSBSZW1vdmUgY29tbWVudCBhYm91dCBubyBnemlwIGhlYWRlciBwcm9jZXNzaW5nIGluIEZBUQotIEFkZCBaX0ZJWEVEIHN0cmF0ZWd5IG9wdGlvbiB0byBkZWZsYXRlSW5pdDIoKSB0byBmb3JjZSBmaXhlZCB0cmVlcwotIEFkZCB1cGRhdGVkIG1ha2Vfdm1zLmNvbSBbQ29naGxhbl0sIHVwZGF0ZSBSRUFETUUKLSBDcmVhdGUgYSBuZXcgImV4YW1wbGVzIiBkaXJlY3RvcnksIG1vdmUgZ3phcHBlbmQuYyB0aGVyZSwgYWRkIHpwaXBlLmMsCiAgZml0YmxrLmMsIGd6bG9nLltjaF0sIGd6am9pbi5jLCBhbmQgemxpYl9ob3cuaHRtbC4KLSBBZGQgRkFRIGVudHJ5IGFuZCBjb21tZW50cyBpbiBkZWZsYXRlLmMgb24gdW5pbml0aWFsaXplZCBtZW1vcnkgYWNjZXNzCi0gQWRkIFNvbGFyaXMgOSBtYWtlIG9wdGlvbnMgaW4gY29uZmlndXJlIFtHaWxiZXJ0XQotIEFsbG93IHN0cmVycm9yKCkgdXNhZ2UgaW4gZ3ppby5jIGZvciBTVERDCi0gRml4IERlY29tcHJlc3NCdWYgaW4gY29udHJpYi9kZWxwaGkvWkxpYi5wYXMgW01hbkNoZXNUZXJdCi0gVXBkYXRlIGNvbnRyaWIvbWFzbXg4Ni9pbmZmYXMzMi5hc20gYW5kIGd2bWF0MzIuYXNtIFtWb2xsYW50XQotIFVzZSB6X29mZl90IGZvciBhZGxlcjMyX2NvbWJpbmUoKSBhbmQgY3JjMzJfY29tYmluZSgpIGxlbmd0aHMKLSBNYWtlIGFkbGVyMzIoKSBtdWNoIGZhc3RlciBmb3Igc21hbGwgbGVuCi0gVXNlIE9TX0NPREUgaW4gZGVmbGF0ZSgpIGRlZmF1bHQgZ3ppcCBoZWFkZXIKCkNoYW5nZXMgaW4gMS4yLjIuMSAoMzEgT2N0b2JlciAyMDA0KQotIEFsbG93IGluZmxhdGVTZXREaWN0aW9uYXJ5KCkgY2FsbCBmb3IgcmF3IGluZmxhdGUKLSBGaXggaW5mbGF0ZSBoZWFkZXIgY3JjIGNoZWNrIGJ1ZyBmb3IgZmlsZSBuYW1lcyBhbmQgY29tbWVudHMKLSBBZGQgZGVmbGF0ZVNldEhlYWRlcigpIGFuZCBnel9oZWFkZXIgc3RydWN0dXJlIGZvciBjdXN0b20gZ3ppcCBoZWFkZXJzCi0gQWRkIGluZmxhdGVHZXRoZWFkZXIoKSB0byByZXRyaWV2ZSBnemlwIGhlYWRlcnMKLSBBZGQgY3JjMzJfY29tYmluZSgpIGFuZCBhZGxlcjMyX2NvbWJpbmUoKSBmdW5jdGlvbnMKLSBBZGQgYWxsb2NfZnVuYywgZnJlZV9mdW5jLCBpbl9mdW5jLCBvdXRfZnVuYyB0byBaX1BSRUZJWCBsaXN0Ci0gVXNlIHpzdHJlYW1wIGNvbnNpc3RlbnRseSBpbiB6bGliLmggKGluZmxhdGVfYmFjayBmdW5jdGlvbnMpCi0gUmVtb3ZlIEdVTlpJUCBjb25kaXRpb24gZnJvbSBkZWZpbml0aW9uIG9mIGluZmxhdGVfbW9kZSBpbiBpbmZsYXRlLmgKICBhbmQgaW4gY29udHJpYi9pbmZsYXRlODYvaW5mZmFzdC5TIFtUcnV0YSwgQW5kZXJzb25dCi0gQWRkIHN1cHBvcnQgZm9yIEFNRDY0IGluIGNvbnRyaWIvaW5mbGF0ZTg2L2luZmZhczg2LmMgW0FuZGVyc29uXQotIFVwZGF0ZSBwcm9qZWN0cy9SRUFETUUucHJvamVjdHMgYW5kIHByb2plY3RzL3Zpc3VhbGM2IFtUcnV0YV0KLSBVcGRhdGUgd2luMzIvRExMX0ZBUS50eHQgW1RydXRhXQotIEF2b2lkIHdhcm5pbmcgdW5kZXIgTk9fR1pDT01QUkVTUyBpbiBnemlvLmM7IGZpeCB0eXBvIFtUcnV0YV0KLSBEZXByZWNhdGUgWl9BU0NJSTsgdXNlIFpfVEVYVCBpbnN0ZWFkIFtUcnV0YV0KLSBVc2UgYSBuZXcgYWxnb3JpdGhtIGZvciBzZXR0aW5nIHN0cm0tPmRhdGFfdHlwZSBpbiB0cmVlcy5jIFtUcnV0YV0KLSBEbyBub3QgZGVmaW5lIGFuIGV4aXQoKSBwcm90b3R5cGUgaW4genV0aWwuYyB1bmxlc3MgREVCVUcgZGVmaW5lZAotIFJlbW92ZSBwcm90b3R5cGUgb2YgZXhpdCgpIGZyb20genV0aWwuYywgZXhhbXBsZS5jLCBtaW5pZ3ppcC5jIFtUcnV0YV0KLSBBZGQgY29tbWVudCBpbiB6bGliLmggZm9yIFpfTk9fRkxVU0ggcGFyYW1ldGVyIHRvIGRlZmxhdGUoKQotIEZpeCBEYXJ3aW4gYnVpbGQgdmVyc2lvbiBpZGVudGlmaWNhdGlvbiBbUGV0ZXJzb25dCgpDaGFuZ2VzIGluIDEuMi4yICgzIE9jdG9iZXIgMjAwNCkKLSBVcGRhdGUgemxpYi5oIGNvbW1lbnRzIG9uIGd6aXAgaW4tbWVtb3J5IHByb2Nlc3NpbmcKLSBTZXQgYWRsZXIgdG8gMSBpbiBpbmZsYXRlUmVzZXQoKSB0byBzdXBwb3J0IEphdmEgdGVzdCBzdWl0ZSBbV2FsbGVzXQotIEFkZCBjb250cmliL2RvdHpsaWIgW1Jhdm5dCi0gVXBkYXRlIHdpbjMyL0RMTF9GQVEudHh0IFtUcnV0YV0KLSBVcGRhdGUgY29udHJpYi9taW5pemlwIFtWb2xsYW50XQotIE1vdmUgY29udHJpYi92aXN1YWwtYmFzaWMudHh0IHRvIG9sZC8gW1RydXRhXQotIEZpeCBhc3NlbWJsZXIgYnVpbGRzIGluIHByb2plY3RzL3Zpc3VhbGM2LyBbVHJ1dGFdCgpDaGFuZ2VzIGluIDEuMi4xLjIgKDkgU2VwdGVtYmVyIDIwMDQpCi0gVXBkYXRlIElOREVYIGZpbGUKLSBGaXggdHJlZXMuYyB0byB1cGRhdGUgc3RybS0+ZGF0YV90eXBlIChubyBvbmUgZXZlciBub3RpY2VkISkKLSBGaXggYnVnIGluIGVycm9yIGNhc2UgaW4gaW5mbGF0ZS5jLCBpbmZiYWNrLmMsIGFuZCBpbmZiYWNrOS5jIFtCcm93bl0KLSBBZGQgInZvbGF0aWxlIiB0byBjcmMgdGFibGUgZmxhZyBkZWNsYXJhdGlvbiAoZm9yIERZTkFNSUNfQ1JDX1RBQkxFKQotIEFkZCBsaW1pdGVkIG11bHRpdGFza2luZyBwcm90ZWN0aW9uIHRvIERZTkFNSUNfQ1JDX1RBQkxFCi0gQWRkIE5PX3ZzbnByaW50ZiBmb3IgVk1TIGluIHp1dGlsLmggW01vemlsbGFdCi0gRG9uJ3QgZGVjbGFyZSBzdHJlcnJvcigpIHVuZGVyIFZNUyBbTW96aWxsYV0KLSBBZGQgY29tbWVudCB0byBEWU5BTUlDX0NSQ19UQUJMRSB0byB1c2UgZ2V0X2NyY190YWJsZSgpIHRvIGluaXRpYWxpemUKLSBVcGRhdGUgY29udHJpYi9hZGEgW0FuaXNpbWtvdl0KLSBVcGRhdGUgY29udHJpYi9taW5pemlwIFtWb2xsYW50XQotIEZpeCBjb25maWd1cmUgdG8gbm90IGhhcmRjb2RlIGRpcmVjdG9yaWVzIGZvciBEYXJ3aW4gW1BldGVyc29uXQotIEZpeCBnemlvLmMgdG8gbm90IHJldHVybiBlcnJvciBvbiBlbXB0eSBmaWxlcyBbQnJvd25dCi0gRml4IGluZGVudGF0aW9uOyB1cGRhdGUgdmVyc2lvbiBpbiBjb250cmliL2RlbHBoaS9aTGliLnBhcyBhbmQKICBjb250cmliL3Bhc2NhbC96bGlicGFzLnBhcyBbVHJ1dGFdCi0gVXBkYXRlIG1rYXNtLmJhdCBpbiBjb250cmliL21hc214ODYgW1RydXRhXQotIFVwZGF0ZSBjb250cmliL3VudGd6IFtUcnV0YV0KLSBBZGQgcHJvamVjdHMvUkVBRE1FLnByb2plY3RzIFtUcnV0YV0KLSBBZGQgcHJvamVjdCBmb3IgTVMgVmlzdWFsIEMrKyA2LjAgaW4gcHJvamVjdHMvdmlzdWFsYzYgW0NhZGlldXgsIFRydXRhXQotIFVwZGF0ZSB3aW4zMi9ETExfRkFRLnR4dCBbVHJ1dGFdCi0gVXBkYXRlIGxpc3Qgb2YgWl9QUkVGSVggc3ltYm9scyBpbiB6Y29uZi5oIFtSYW5kZXJzLVBlaHJzb24sIFRydXRhXQotIFJlbW92ZSBhbiB1bm5lY2Vzc2FyeSBhc3NpZ25tZW50IHRvIGN1cnIgaW4gaW5mdHJlZXMuYyBbVHJ1dGFdCi0gQWRkIE9TLzIgdG8gZXhlIGJ1aWxkcyBpbiBjb25maWd1cmUgW1BvbHRvcmFrXQotIFJlbW92ZSBlcnIgZHVtbXkgcGFyYW1ldGVyIGluIHpsaWIuaCBbS2llbnR6bGVdCgpDaGFuZ2VzIGluIDEuMi4xLjEgKDkgSmFudWFyeSAyMDA0KQotIFVwZGF0ZSBlbWFpbCBhZGRyZXNzIGluIFJFQURNRQotIFNldmVyYWwgRkFRIHVwZGF0ZXMKLSBGaXggYSBiaWcgZmF0IGJ1ZyBpbiBpbmZ0cmVlcy5jIHRoYXQgcHJldmVudGVkIGRlY29kaW5nIHZhbGlkCiAgZHluYW1pYyBibG9ja3Mgd2l0aCBvbmx5IGxpdGVyYWxzIGFuZCBubyBkaXN0YW5jZSBjb2RlcyAtLQogIFRoYW5rcyB0byAiSG90IEVtdSIgZm9yIHRoZSBidWcgcmVwb3J0IGFuZCBzYW1wbGUgZmlsZQotIEFkZCBhIG5vdGUgdG8gcHVmZi5jIG9uIG5vIGRpc3RhbmNlIGNvZGVzIGNhc2UuCgpDaGFuZ2VzIGluIDEuMi4xICgxNyBOb3ZlbWJlciAyMDAzKQotIFJlbW92ZSBhIHRhYiBpbiBjb250cmliL2d6YXBwZW5kL2d6YXBwZW5kLmMKLSBVcGRhdGUgc29tZSBpbnRlcmZhY2VzIGluIGNvbnRyaWIgZm9yIG5ldyB6bGliIGZ1bmN0aW9ucwotIFVwZGF0ZSB6bGliIHZlcnNpb24gbnVtYmVyIGluIHNvbWUgY29udHJpYiBlbnRyaWVzCi0gQWRkIFdpbmRvd3MgQ0UgZGVmaW5pdGlvbiBmb3IgcHRyZGlmZl90IGluIHp1dGlsLmggW01haSwgVHJ1dGFdCi0gU3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzIG9uIEh1cmQgYW5kIEtGcmVlQlNEIFtCcm93bl0KLSBGaXggZXJyb3IgaW4gTk9fRElWSURFIG9wdGlvbiBvZiBhZGxlcjMyLmMKCkNoYW5nZXMgaW4gMS4yLjAuOCAoNCBOb3ZlbWJlciAyMDAzKQotIFVwZGF0ZSB2ZXJzaW9uIGluIGNvbnRyaWIvZGVscGhpL1pMaWIucGFzIGFuZCBjb250cmliL3Bhc2NhbC96bGlicGFzLnBhcwotIEFkZCBleHBlcmltZW50YWwgTk9fRElWSURFICNkZWZpbmUgaW4gYWRsZXIzMi5jCiAgICAtIFBvc3NpYmx5IGZhc3RlciBvbiBzb21lIHByb2Nlc3NvcnMgKGxldCBtZSBrbm93IGlmIGl0IGlzKQotIENvcnJlY3QgWl9CTE9DSyB0byBub3QgcmV0dXJuIG9uIGZpcnN0IGluZmxhdGUgY2FsbCBpZiBubyB3cmFwCi0gRml4IHN0cm0tPmRhdGFfdHlwZSBvbiBpbmZsYXRlKCkgcmV0dXJuIHRvIGNvcnJlY3RseSBpbmRpY2F0ZSBFT0IKLSBBZGQgZGVmbGF0ZVByaW1lKCkgZnVuY3Rpb24gZm9yIGFwcGVuZGluZyBpbiB0aGUgbWlkZGxlIG9mIGEgYnl0ZQotIEFkZCBjb250cmliL2d6YXBwZW5kIGZvciBhbiBleGFtcGxlIG9mIGFwcGVuZGluZyB0byBhIHN0cmVhbQotIFVwZGF0ZSB3aW4zMi9ETExfRkFRLnR4dCBbVHJ1dGFdCi0gRGVsZXRlIFR1cmJvIEMgY29tbWVudCBpbiBSRUFETUUgW1RydXRhXQotIEltcHJvdmUgc29tZSBpbmRlbnRhdGlvbiBpbiB6Y29uZi5oIFtUcnV0YV0KLSBGaXggaW5maW5pdGUgbG9vcCBvbiBiYWQgaW5wdXQgaW4gY29uZmlndXJlIHNjcmlwdCBbQ2h1cmNoXQotIEZpeCBnemVvZigpIGZvciBjb25jYXRlbmF0ZWQgZ3ppcCBmaWxlcyBbSm9obnNvbl0KLSBBZGQgZXhhbXBsZSB0byBjb250cmliL3Zpc3VhbC1iYXNpYy50eHQgW01pY2hhZWwgQi5dCi0gQWRkIC1wIHRvIG1rZGlyJ3MgaW4gTWFrZWZpbGUuaW4gW3ZkYV0KLSBGaXggY29uZmlndXJlIHRvIHByb3Blcmx5IGRldGVjdCBwcmVzZW5jZSBvciBsYWNrIG9mIHByaW50ZiBmdW5jdGlvbnMKLSBBZGQgQVM0MDAgc3VwcG9ydCBbTW9ubmVyYXRdCi0gQWRkIGEgbGl0dGxlIEN5Z3dpbiBzdXBwb3J0IFtXaWxzb25dCgpDaGFuZ2VzIGluIDEuMi4wLjcgKDIxIFNlcHRlbWJlciAyMDAzKQotIENvcnJlY3Qgc29tZSBkZWJ1ZyBmb3JtYXRzIGluIGNvbnRyaWIvaW5mYmFjazkKLSBDYXN0IGEgdHlwZSBpbiBhIGRlYnVnIHN0YXRlbWVudCBpbiB0cmVlcy5jCi0gQ2hhbmdlIHNlYXJjaCBhbmQgcmVwbGFjZSBkZWxpbWl0ZXIgaW4gY29uZmlndXJlIGZyb20gJSB0byAjIFtCZWViZV0KLSBVcGRhdGUgY29udHJpYi91bnRneiB0byAwLjIgd2l0aCB2YXJpb3VzIGZpeGVzIFtUcnV0YV0KLSBBZGQgYnVpbGQgc3VwcG9ydCBmb3IgQW1pZ2EgW05pa2xdCi0gUmVtb3ZlIHNvbWUgZGlyZWN0b3JpZXMgaW4gb2xkIHRoYXQgaGF2ZSBiZWVuIHVwZGF0ZWQgdG8gMS4yCi0gQWRkIGR5bGliIGJ1aWxkaW5nIGZvciBNYWMgT1MgWCBpbiBjb25maWd1cmUgYW5kIE1ha2VmaWxlLmluCi0gUmVtb3ZlIG9sZCBkaXN0cmlidXRpb24gc3R1ZmYgZnJvbSBNYWtlZmlsZQotIFVwZGF0ZSBSRUFETUUgdG8gcG9pbnQgdG8gRExMX0ZBUS50eHQsIGFuZCBhZGQgY29tbWVudCBvbiBNYWMgT1MgWAotIFVwZGF0ZSBsaW5rcyBpbiBSRUFETUUKCkNoYW5nZXMgaW4gMS4yLjAuNiAoMTMgU2VwdGVtYmVyIDIwMDMpCi0gTWlub3IgRkFRIHVwZGF0ZXMKLSBVcGRhdGUgY29udHJpYi9taW5pemlwIHRvIDEuMDAgW1ZvbGxhbnRdCi0gUmVtb3ZlIHRlc3Qgb2YgZ3ogZnVuY3Rpb25zIGluIGV4YW1wbGUuYyB3aGVuIEdaX0NPTVBSRVNTIGRlZmluZWQgW1RydXRhXQotIFVwZGF0ZSBQT1NUSU5DIGNvbW1lbnQgZm9yIDY4MDYwIFtOaWtsXQotIEFkZCBjb250cmliL2luZmJhY2s5IHdpdGggZGVmbGF0ZTY0IGRlY29kaW5nICh1bnN1cHBvcnRlZCkKLSBGb3IgTVZTIGRlZmluZSBOT192c25wcmludGYgYW5kIHVuZGVmaW5lIEZBUiBbdmFuIEJ1cmlrXQotIEFkZCBwcmFnbWEgZm9yIGZkb3BlbiBvbiBNVlMgW3ZhbiBCdXJpa10KCkNoYW5nZXMgaW4gMS4yLjAuNSAoOCBTZXB0ZW1iZXIgMjAwMykKLSBBZGQgT0YgdG8gaW5mbGF0ZUJhY2tFbmQoKSBkZWNsYXJhdGlvbiBpbiB6bGliLmgKLSBSZW1lbWJlciBzdGFydCB3aGVuIHVzaW5nIGd6ZG9wZW4gaW4gdGhlIG1pZGRsZSBvZiBhIGZpbGUKLSBVc2UgaW50ZXJuYWwgb2ZmX3QgY291bnRlcnMgaW4gZ3oqIGZ1bmN0aW9ucyB0byBwcm9wZXJseSBoYW5kbGUgc2Vla3MKLSBQZXJmb3JtIG1vcmUgcmlnb3JvdXMgY2hlY2sgZm9yIGRpc3RhbmNlLXRvby1mYXIgaW4gaW5mZmFzdC5jCi0gQWRkIFpfQkxPQ0sgZmx1c2ggb3B0aW9uIHRvIHJldHVybiBmcm9tIGluZmxhdGUgYXQgYmxvY2sgYm91bmRhcnkKLSBTZXQgc3RybS0+ZGF0YV90eXBlIG9uIHJldHVybiBmcm9tIGluZmxhdGUKICAgIC0gSW5kaWNhdGUgYml0cyB1bnVzZWQsIGlmIGF0IGJsb2NrIGJvdW5kYXJ5LCBhbmQgaWYgaW4gbGFzdCBibG9jawotIFJlcGxhY2Ugc2l6ZV90IHdpdGggcHRyZGlmZl90IGluIGNyYzMyLmMsIGFuZCBjaGVjayBmb3IgY29ycmVjdCBzaXplCi0gQWRkIGNvbmRpdGlvbiBzbyBvbGQgTk9fREVGTEFURSBkZWZpbmUgc3RpbGwgd29ya3MgZm9yIGNvbXBhdGliaWxpdHkKLSBGQVEgdXBkYXRlIHJlZ2FyZGluZyB0aGUgV2luZG93cyBETEwgW1RydXRhXQotIElOREVYIHVwZGF0ZTogYWRkIHFueCBlbnRyeSwgcmVtb3ZlIGFpeCBlbnRyeSBbVHJ1dGFdCi0gSW5zdGFsbCB6bGliLjMgaW50byBtYW5kaXIgW1dpbHNvbl0KLSBNb3ZlIGNvbnRyaWIvemxpYl9kbGxfRkFRLnR4dCB0byB3aW4zMi9ETExfRkFRLnR4dDsgdXBkYXRlIFtUcnV0YV0KLSBBZGFwdCB0aGUgemxpYiBpbnRlcmZhY2UgdG8gdGhlIG5ldyBETEwgY29udmVudGlvbiBndWlkZWxpbmVzIFtUcnV0YV0KLSBJbnRyb2R1Y2UgWkxJQl9XSU5BUEkgbWFjcm8gdG8gYWxsb3cgdGhlIGV4cG9ydCBvZiBmdW5jdGlvbnMgdXNpbmcKICB0aGUgV0lOQVBJIGNhbGxpbmcgY29udmVudGlvbiwgZm9yIFZpc3VhbCBCYXNpYyBbVm9sbGFudCwgVHJ1dGFdCi0gVXBkYXRlIG1zZG9zIGFuZCB3aW4zMiBzY3JpcHRzIGFuZCBtYWtlZmlsZXMgW1RydXRhXQotIEV4cG9ydCBzeW1ib2xzIGJ5IG5hbWUsIG5vdCBieSBvcmRpbmFsLCBpbiB3aW4zMi96bGliLmRlZiBbVHJ1dGFdCi0gQWRkIGNvbnRyaWIvYWRhIFtBbmlzaW1rb3ZdCi0gTW92ZSBhc20gZmlsZXMgZnJvbSBjb250cmliL3ZzdHVkaW8vdmM3MF8zMiB0byBjb250cmliL2FzbTM4NiBbVHJ1dGFdCi0gUmVuYW1lIGNvbnRyaWIvYXNtMzg2IHRvIGNvbnRyaWIvbWFzbXg4NiBbVHJ1dGEsIFZvbGxhbnRdCi0gQWRkIGNvbnRyaWIvbWFzbTY4NiBbVHJ1dGFdCi0gRml4IG9mZnNldHMgaW4gY29udHJpYi9pbmZsYXRlODYgYW5kIGNvbnRyaWIvbWFzbXg4Ni9pbmZmYXMzMi5hc20KICBbVHJ1dGEsIFZvbGxhbnRdCi0gVXBkYXRlIGNvbnRyaWIvZGVscGhpOyByZW5hbWUgdG8gY29udHJpYi9wYXNjYWw7IGFkZCBleGFtcGxlIFtUcnV0YV0KLSBSZW1vdmUgY29udHJpYi9kZWxwaGkyOyBhZGQgYSBuZXcgY29udHJpYi9kZWxwaGkgW1RydXRhXQotIEF2b2lkIGluY2x1c2lvbiBvZiB0aGUgbm9uc3RhbmRhcmQgPG1lbW9yeS5oPiBpbiBjb250cmliL2lvc3RyZWFtLAogIGFuZCBmaXggc29tZSBtZXRob2QgcHJvdG90eXBlcyBbVHJ1dGFdCi0gRml4IHRoZSBaQ1JfU0VFRDIgY29uc3RhbnQgdG8gYXZvaWQgd2FybmluZ3MgaW4gY29udHJpYi9taW5pemlwCiAgW1RydXRhXQotIEF2b2lkIHRoZSB1c2Ugb2YgYmFja3NsYXNoIChcKSBpbiBjb250cmliL21pbml6aXAgW1ZvbGxhbnRdCi0gRml4IGZpbGUgdGltZSBoYW5kbGluZyBpbiBjb250cmliL3VudGd6OyB1cGRhdGUgbWFrZWZpbGVzIFtUcnV0YV0KLSBVcGRhdGUgY29udHJpYi92c3R1ZGlvL3ZjNzBfMzIgdG8gY29tcGx5IHdpdGggdGhlIG5ldyBETEwgZ3VpZGVsaW5lcwogIFtWb2xsYW50XQotIFJlbW92ZSBjb250cmliL3ZzdHVkaW8vdmMxNV8xNiBbVm9sbGFudF0KLSBSZW5hbWUgY29udHJpYi92c3R1ZGlvL3ZjNzBfMzIgdG8gY29udHJpYi92c3R1ZGlvL3ZjNyBbVHJ1dGFdCi0gVXBkYXRlIFJFQURNRS5jb250cmliIFtUcnV0YV0KLSBJbnZlcnQgdGhlIGFzc2lnbm1lbnQgb3JkZXIgb2YgbWF0Y2hfaGVhZCBhbmQgcy0+cHJldlsuLi5dIGluCiAgSU5TRVJUX1NUUklORyBbVHJ1dGFdCi0gQ29tcGFyZSBUT09fRkFSIHdpdGggMzI3NjcgaW5zdGVhZCBvZiAzMjc2OCwgdG8gYXZvaWQgMTYtYml0IHdhcm5pbmdzCiAgW1RydXRhXQotIENvbXBhcmUgZnVuY3Rpb24gcG9pbnRlcnMgd2l0aCAwLCBub3Qgd2l0aCBOVUxMIG9yIFpfTlVMTCBbVHJ1dGFdCi0gRml4IHByb3RvdHlwZSBvZiBzeW5jc2VhcmNoIGluIGluZmxhdGUuYyBbVHJ1dGFdCi0gSW50cm9kdWNlIEFTTUlORiBtYWNybyB0byBiZSBlbmFibGVkIHdoZW4gdXNpbmcgYW4gQVNNIGltcGxlbWVudGF0aW9uCiAgb2YgaW5mbGF0ZV9mYXN0IFtUcnV0YV0KLSBDaGFuZ2UgTk9fREVGTEFURSB0byBOT19HWkNPTVBSRVNTIFtUcnV0YV0KLSBNb2RpZnkgdGVzdF9nemlvIGluIGV4YW1wbGUuYyB0byB0YWtlIGEgc2luZ2xlIGZpbGUgbmFtZSBhcyBhCiAgcGFyYW1ldGVyIFtUcnV0YV0KLSBFeGl0IHRoZSBleGFtcGxlLmMgcHJvZ3JhbSBpZiBnem9wZW4gZmFpbHMgW1RydXRhXQotIEFkZCB0eXBlIGNhc3RzIGFyb3VuZCBzdHJsZW4gaW4gZXhhbXBsZS5jIFtUcnV0YV0KLSBSZW1vdmUgY2FzdGluZyB0byBzaXplb2YgaW4gbWluaWd6aXAuYzsgZ2l2ZSBhIHByb3BlciB0eXBlCiAgdG8gdGhlIHZhcmlhYmxlIGNvbXBhcmVkIHdpdGggU1VGRklYX0xFTiBbVHJ1dGFdCi0gVXBkYXRlIGRlZmluaXRpb25zIG9mIFNUREMgYW5kIFNUREM5OSBpbiB6Y29uZi5oIFtUcnV0YV0KLSBTeW5jaHJvbml6ZSB6Y29uZi5oIHdpdGggdGhlIG5ldyBXaW5kb3dzIERMTCBpbnRlcmZhY2UgW1RydXRhXQotIFVzZSBTWVMxNkJJVCBpbnN0ZWFkIG9mIF9fMzJCSVRfXyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuCiAgMTYtIGFuZCAzMi1iaXQgcGxhdGZvcm1zIFtUcnV0YV0KLSBVc2UgZmFyIG1lbW9yeSBhbGxvY2F0b3JzIGluIHNtYWxsIDE2LWJpdCBtZW1vcnkgbW9kZWxzIGZvcgogIFR1cmJvIEMgW1RydXRhXQotIEFkZCBpbmZvIGFib3V0IHRoZSB1c2Ugb2YgQVNNViwgQVNNSU5GIGFuZCBaTElCX1dJTkFQSSBpbgogIHpsaWJDb21waWxlRmxhZ3MgW1RydXRhXQotIEN5Z3dpbiBoYXMgdnNucHJpbnRmIFtXaWxzb25dCi0gSW4gV2luZG93czE2LCBPU19DT0RFIGlzIDAsIGFzIGluIE1TRE9TIFtUcnV0YV0KLSBJbiBDeWd3aW4sIE9TX0NPREUgaXMgMyAoVW5peCksIG5vdCAxMSAoV2luZG93czMyKSBbV2lsc29uXQoKQ2hhbmdlcyBpbiAxLjIuMC40ICgxMCBBdWd1c3QgMjAwMykKLSBNaW5vciBGQVEgdXBkYXRlcwotIEJlIG1vcmUgc3RyaWN0IHdoZW4gY2hlY2tpbmcgaW5mbGF0ZUluaXQyJ3Mgd2luZG93Qml0cyBwYXJhbWV0ZXIKLSBDaGFuZ2UgTk9fR1VOWklQIGNvbXBpbGUgb3B0aW9uIHRvIE5PX0daSVAgdG8gY292ZXIgZGVmbGF0ZSBhcyB3ZWxsCi0gQWRkIGd6aXAgd3JhcHBlciBvcHRpb24gdG8gZGVmbGF0ZUluaXQyIHVzaW5nIHdpbmRvd0JpdHMKLSBBZGQgdXBkYXRlZCBRTlggcnVsZSBpbiBjb25maWd1cmUgYW5kIHFueCBkaXJlY3RvcnkgW0Jvbm5lZm95XQotIE1ha2UgaW5mbGF0ZSBkaXN0YW5jZS10b28tZmFyIGNoZWNrcyBtb3JlIHJpZ29yb3VzCi0gQ2xlYW4gdXAgRkFSIHVzYWdlIGluIGluZmxhdGUKLSBBZGQgY2FzdGluZyB0byBzaXplb2YoKSBpbiBnemlvLmMgYW5kIG1pbmlnemlwLmMKCkNoYW5nZXMgaW4gMS4yLjAuMyAoMTkgSnVseSAyMDAzKQotIEZpeCBzaWxseSBlcnJvciBpbiBnenVuZ2V0YygpIGltcGxlbWVudGF0aW9uIFtWb2xsYW50XQotIFVwZGF0ZSBjb250cmliL21pbml6aXAgYW5kIGNvbnRyaWIvdnN0dWRpbyBbVm9sbGFudF0KLSBGaXggcHJpbnRmIGZvcm1hdCBpbiBleGFtcGxlLmMKLSBDb3JyZWN0IGNkZWNsIHN1cHBvcnQgaW4gemNvbmYuaW4uaCBbQW5pc2lta292XQotIE1pbm9yIEZBUSB1cGRhdGVzCgpDaGFuZ2VzIGluIDEuMi4wLjIgKDEzIEp1bHkgMjAwMykKLSBBZGQgWkxJQl9WRVJOVU0gaW4gemxpYi5oIGZvciBudW1lcmljYWwgcHJlcHJvY2Vzc29yIGNvbXBhcmlzb25zCi0gQXR0ZW1wdCB0byBhdm9pZCB3YXJuaW5ncyBpbiBjcmMzMi5jIGZvciBwb2ludGVyLWludCBjb252ZXJzaW9uCi0gQWRkIEFJWCB0byBjb25maWd1cmUsIHJlbW92ZSBhaXggZGlyZWN0b3J5IFtCYWtrZXJdCi0gQWRkIHNvbWUgY2FzdHMgdG8gbWluaWd6aXAuYwotIEltcHJvdmUgY2hlY2tpbmcgYWZ0ZXIgaW5zZWN1cmUgc3ByaW50ZigpIG9yIHZzcHJpbnRmKCkgY2FsbHMKLSBSZW1vdmUgI2VsaWYncyBmcm9tIGNyYzMyLmMKLSBDaGFuZ2UgbGVhdmUgbGFiZWwgdG8gaW5mX2xlYXZlIGluIGluZmxhdGUuYyBhbmQgaW5mYmFjay5jIHRvIGF2b2lkCiAgbGlicmFyeSBjb25mbGljdHMKLSBSZW1vdmUgaW5mbGF0ZSBnemlwIGRlY29kaW5nIGJ5IGRlZmF1bHQtLW9ubHkgZW5hYmxlIGd6aXAgZGVjb2RpbmcgYnkKICBzcGVjaWFsIHJlcXVlc3QgZm9yIHN0cmljdGVyIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKLSBBZGQgemxpYkNvbXBpbGVGbGFncygpIGZ1bmN0aW9uIHRvIHJldHVybiBjb21waWxhdGlvbiBpbmZvcm1hdGlvbgotIE1vcmUgdHlwZWNhc3RpbmcgaW4gZGVmbGF0ZS5jIHRvIGF2b2lkIHdhcm5pbmdzCi0gUmVtb3ZlIGxlYWRpbmcgdW5kZXJzY29yZSBmcm9tIF9DYXBpdGFsICNkZWZpbmVzIFtUcnV0YV0KLSBGaXggY29uZmlndXJlIHRvIGxpbmsgc2hhcmVkIGxpYnJhcnkgd2hlbiB0ZXN0aW5nCi0gQWRkIHNvbWUgV2luZG93cyBDRSB0YXJnZXQgYWRqdXN0bWVudHMgW01haV0KLSBSZW1vdmUgI2RlZmluZSBaTElCX0RMTCBpbiB6Y29uZi5oIFtWb2xsYW50XQotIEFkZCB6bGliLjMgW1JvZGdlcnNdCi0gVXBkYXRlIFJGQyBVUkwgaW4gZGVmbGF0ZS5jIGFuZCBhbGdvcml0aG0udHh0IFtNYWldCi0gQWRkIHpsaWJfZGxsX0ZBUS50eHQgdG8gY29udHJpYiBbVHJ1dGFdCi0gQWRkIFVMIHRvIHNvbWUgY29uc3RhbnRzIFtUcnV0YV0KLSBVcGRhdGUgbWluaXppcCBhbmQgdnN0dWRpbyBbVm9sbGFudF0KLSBSZW1vdmUgdmVzdGlnaWFsIE5FRURfRFVNTVlfUkVUVVJOIGZyb20gemNvbmYuaW4uaAotIEV4cGFuZCB1c2Ugb2YgTk9fRFVNTVlfREVDTCB0byBhdm9pZCBhbGwgZHVtbXkgc3RydWN0dXJlcwotIEFkZGVkIGlvc3RyZWFtMyB0byBjb250cmliIFtTY2h3YXJkdF0KLSBSZXBsYWNlIHJld2luZCgpIHdpdGggZnNlZWsoKSBmb3IgV2luQ0UgW1RydXRhXQotIEltcHJvdmUgc2V0dGluZyBvZiB6bGliIGZvcm1hdCBjb21wcmVzc2lvbiBsZXZlbCBmbGFncwogICAgLSBSZXBvcnQgMCBmb3IgaHVmZm1hbiBhbmQgcmxlIHN0cmF0ZWdpZXMgYW5kIGZvciBsZXZlbCA9PSAwIG9yIDEKICAgIC0gUmVwb3J0IDIgb25seSBmb3IgbGV2ZWwgPT0gNgotIE9ubHkgZGVhbCB3aXRoIDY0SyBsaW1pdCB3aGVuIG5lY2Vzc2FyeSBhdCBjb21waWxlIHRpbWUgW1RydXRhXQotIEFsbG93IFRPT19GQVIgY2hlY2sgdG8gYmUgdHVybmVkIG9mZiBhdCBjb21waWxlIHRpbWUgW1RydXRhXQotIEFkZCBnemNsZWFyZXJyKCkgZnVuY3Rpb24gW1NvdXphXQotIEFkZCBnenVuZ2V0YygpIGZ1bmN0aW9uCgpDaGFuZ2VzIGluIDEuMi4wLjEgKDE3IE1hcmNoIDIwMDMpCi0gQWRkIFpfUkxFIHN0cmF0ZWd5IGZvciBydW4tbGVuZ3RoIGVuY29kaW5nIFtUcnV0YV0KICAgIC0gV2hlbiBaX1JMRSByZXF1ZXN0ZWQsIHJlc3RyaWN0IG1hdGNoZXMgdG8gZGlzdGFuY2Ugb25lCiAgICAtIFVwZGF0ZSB6bGliLmgsIG1pbmlnemlwLmMsIGd6b3BlbigpLCBnemRvcGVuKCkgZm9yIFpfUkxFCi0gQ29ycmVjdCBGQVNURVNUIGNvbXBpbGF0aW9uIHRvIGFsbG93IGxldmVsID09IDAKLSBDbGVhbiB1cCB3aGF0IGdldHMgY29tcGlsZWQgZm9yIEZBU1RFU1QKLSBJbmNvcnBvcmF0ZSBjaGFuZ2VzIHRvIHpjb25mLmluLmggW1ZvbGxhbnRdCiAgICAtIFJlZmluZSBkZXRlY3Rpb24gb2YgVHVyYm8gQyBuZWVkIGZvciBkdW1teSByZXR1cm5zCiAgICAtIFJlZmluZSBaTElCX0RMTCBjb21waWxhdGlvbgogICAgLSBJbmNsdWRlIGFkZGl0aW9uYWwgaGVhZGVyIGZpbGUgb24gVk1TIGZvciBvZmZfdCB0eXBlZGVmCi0gVHJ5IHRvIHVzZSBfdnNucHJpbnRmIHdoZXJlIGl0IHN1cHBsYW50cyB2c3ByaW50ZiBbVm9sbGFudF0KLSBBZGQgc29tZSBjYXN0cyBpbiBpbmZmYXN0LmMKLSBFbmNoYW5jZSBjb21tZW50cyBpbiB6bGliLmggb24gd2hhdCBoYXBwZW5zIGlmIGd6cHJpbnRmKCkgdHJpZXMgdG8KICB3cml0ZSBtb3JlIHRoYW4gNDA5NSBieXRlcyBiZWZvcmUgY29tcHJlc3Npb24KLSBSZW1vdmUgdW51c2VkIHN0YXRlIGZyb20gaW5mbGF0ZUJhY2tFbmQoKQotIFJlbW92ZSBleGl0KDApIGZyb20gbWluaWd6aXAuYywgZXhhbXBsZS5jCi0gR2V0IHJpZCBvZiBhbGwgdGhvc2UgZGFybiB0YWJzCi0gQWRkICJjaGVjayIgdGFyZ2V0IHRvIE1ha2VmaWxlLmluIHRoYXQgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyAidGVzdCIKLSBBZGQgIm1vc3RseWNsZWFuIiBhbmQgIm1haW50YWluZXItY2xlYW4iIHRhcmdldHMgdG8gTWFrZWZpbGUuaW4KLSBVcGRhdGUgY29udHJpYi9pbmZsYXRlODYgW0FuZGVyc29uXQotIFVwZGF0ZSBjb250cmliL3Rlc3R6bGliLCBjb250cmliL3ZzdHVkaW8sIGNvbnRyaWIvbWluaXppcCBbVm9sbGFudF0KLSBBZGQgbXNkb3MgYW5kIHdpbjMyIGRpcmVjdG9yaWVzIHdpdGggbWFrZWZpbGVzIFtUcnV0YV0KLSBNb3JlIGFkZGl0aW9ucyBhbmQgaW1wcm92ZW1lbnRzIHRvIHRoZSBGQVEKCkNoYW5nZXMgaW4gMS4yLjAgKDkgTWFyY2ggMjAwMykKLSBOZXcgYW5kIGltcHJvdmVkIGluZmxhdGUgY29kZQogICAgLSBBYm91dCAyMCUgZmFzdGVyCiAgICAtIERvZXMgbm90IGFsbG9jYXRlIDMySyB3aW5kb3cgdW5sZXNzIGFuZCB1bnRpbCBuZWVkZWQKICAgIC0gQXV0b21hdGljYWxseSBkZXRlY3RzIGFuZCBkZWNvbXByZXNzZXMgZ3ppcCBzdHJlYW1zCiAgICAtIFJhdyBpbmZsYXRlIG5vIGxvbmdlciBuZWVkcyBhbiBleHRyYSBkdW1teSBieXRlIGF0IGVuZAogICAgLSBBZGRlZCBpbmZsYXRlQmFjayBmdW5jdGlvbnMgdXNpbmcgYSBjYWxsYmFjayBpbnRlcmZhY2UtLWV2ZW4gZmFzdGVyCiAgICAgIHRoYW4gaW5mbGF0ZSwgdXNlZnVsIGZvciBmaWxlIHV0aWxpdGllcyAoZ3ppcCwgemlwKQogICAgLSBBZGRlZCBpbmZsYXRlQ29weSgpIGZ1bmN0aW9uIHRvIHJlY29yZCBzdGF0ZSBmb3IgcmFuZG9tIGFjY2VzcyBvbgogICAgICBleHRlcm5hbGx5IGdlbmVyYXRlZCBkZWZsYXRlIHN0cmVhbXMgKGUuZy4gaW4gZ3ppcCBmaWxlcykKICAgIC0gTW9yZSByZWFkYWJsZSBjb2RlIChJIGhvcGUpCi0gTmV3IGFuZCBpbXByb3ZlZCBjcmMzMigpCiAgICAtIEFib3V0IDUwJSBmYXN0ZXIsIHRoYW5rcyB0byBzdWdnZXN0aW9ucyBmcm9tIFJvZG5leSBCcm93bgotIEFkZCBkZWZsYXRlQm91bmQoKSBhbmQgY29tcHJlc3NCb3VuZCgpIGZ1bmN0aW9ucwotIEZpeCBtZW1vcnkgbGVhayBpbiBkZWZsYXRlSW5pdDIoKQotIFBlcm1pdCBzZXR0aW5nIGRpY3Rpb25hcnkgZm9yIHJhdyBkZWZsYXRlIChmb3IgcGFyYWxsZWwgZGVmbGF0ZSkKLSBGaXggY29uc3QgZGVjbGFyYXRpb24gZm9yIGd6d3JpdGUoKQotIENoZWNrIGZvciBzb21lIG1hbGxvYygpIGZhaWx1cmVzIGluIGd6aW8uYwotIEZpeCBidWcgaW4gZ3pvcGVuKCkgb24gc2luZ2xlLWJ5dGUgZmlsZSAweDFmCi0gRml4IGJ1ZyBpbiBnenJlYWQoKSBvbiBjb25jYXRlbmF0ZWQgZmlsZSB3aXRoIDB4MWYgYXQgZW5kIG9mIGJ1ZmZlcgogIGFuZCBuZXh0IGJ1ZmZlciBkb2Vzbid0IHN0YXJ0IHdpdGggMHg4YgotIEZpeCB1bmNvbXByZXNzKCkgdG8gcmV0dXJuIFpfREFUQV9FUlJPUiBvbiB0cnVuY2F0ZWQgaW5wdXQKLSBGcmVlIG1lbW9yeSBhdCBlbmQgb2YgZXhhbXBsZS5jCi0gUmVtb3ZlIE1BWCAjZGVmaW5lIGluIHRyZWVzLmMgKGNvbmZsaWN0ZWQgd2l0aCBzb21lIGxpYnJhcmllcykKLSBGaXggc3RhdGljIGNvbnN0J3MgaW4gZGVmbGF0ZS5jLCBnemlvLmMsIGFuZCB6dXRpbC5bY2hdCi0gRGVjbGFyZSBtYWxsb2MoKSBhbmQgZnJlZSgpIGluIGd6aW8uYyBpZiBTVERDIG5vdCBkZWZpbmVkCi0gVXNlIG1hbGxvYygpIGluc3RlYWQgb2YgY2FsbG9jKCkgaW4genV0aWwuYyBpZiBpbnQgYmlnIGVub3VnaAotIERlZmluZSBTVERDIGZvciBBSVgKLSBBZGQgYWl4LyB3aXRoIGFwcHJvYWNoIGZvciBjb21waWxpbmcgc2hhcmVkIGxpYnJhcnkgb24gQUlYCi0gQWRkIEhQLVVYIHN1cHBvcnQgZm9yIHNoYXJlZCBsaWJyYXJpZXMgaW4gY29uZmlndXJlCi0gQWRkIE9wZW5VTklYIHN1cHBvcnQgZm9yIHNoYXJlZCBsaWJyYXJpZXMgaW4gY29uZmlndXJlCi0gVXNlICRjYyBpbnN0ZWFkIG9mIGdjYyB0byBidWlsZCBzaGFyZWQgbGlicmFyeQotIE1ha2UgcHJlZml4IGRpcmVjdG9yeSBpZiBuZWVkZWQgd2hlbiBpbnN0YWxsaW5nCi0gQ29ycmVjdCBNYWNpbnRvc2ggYXZvaWRhbmNlIG9mIHR5cGVkZWYgQnl0ZSBpbiB6Y29uZi5oCi0gQ29ycmVjdCBUdXJibyBDIG1lbW9yeSBhbGxvY2F0aW9uIHdoZW4gdW5kZXIgTGludXgKLSBVc2UgbGliei5hIGluc3RlYWQgb2YgLWx6IGluIE1ha2VmaWxlIChhc3N1cmUgdXNlIG9mIGNvbXBpbGVkIGxpYnJhcnkpCi0gVXBkYXRlIGNvbmZpZ3VyZSB0byBjaGVjayBmb3Igc25wcmludGYgb3IgdnNucHJpbnRmIGZ1bmN0aW9ucyBhbmQgdGhlaXIKICByZXR1cm4gdmFsdWUsIHdhcm4gZHVyaW5nIG1ha2UgaWYgdXNpbmcgYW4gaW5zZWN1cmUgZnVuY3Rpb24KLSBGaXggY29uZmlndXJlIHByb2JsZW0gd2l0aCBjb21waWxlLXRpbWUga25vd2xlZGdlIG9mIEhBVkVfVU5JU1REX0ggdGhhdAogIGlzIGxvc3Qgd2hlbiBsaWJyYXJ5IGlzIHVzZWQtLXJlc29sdXRpb24gaXMgdG8gYnVpbGQgbmV3IHpjb25mLmgKLSBEb2N1bWVudGF0aW9uIGltcHJvdmVtZW50cyAoaW4gemxpYi5oKToKICAgIC0gRG9jdW1lbnQgcmF3IGRlZmxhdGUgYW5kIGluZmxhdGUKICAgIC0gVXBkYXRlIFJGQ3MgVVJMCiAgICAtIFBvaW50IG91dCB0aGF0IHpsaWIgYW5kIGd6aXAgZm9ybWF0cyBhcmUgZGlmZmVyZW50CiAgICAtIE5vdGUgdGhhdCBaX0JVRl9FUlJPUiBpcyBub3QgZmF0YWwKICAgIC0gRG9jdW1lbnQgc3RyaW5nIGxpbWl0IGZvciBnenByaW50ZigpIGFuZCBwb3NzaWJsZSBidWZmZXIgb3ZlcmZsb3cKICAgIC0gTm90ZSByZXF1aXJlbWVudCBvbiBhdmFpbF9vdXQgd2hlbiBmbHVzaGluZwogICAgLSBOb3RlIHBlcm1pdHRlZCB2YWx1ZXMgb2YgZmx1c2ggcGFyYW1ldGVyIG9mIGluZmxhdGUoKQotIEFkZCBzb21lIEZBUXMgKGFuZCBldmVuIGFuc3dlcnMpIHRvIHRoZSBGQVEKLSBBZGQgY29udHJpYi9pbmZsYXRlODYvIGZvciB4ODYgZmFzdGVyIGluZmxhdGUKLSBBZGQgY29udHJpYi9ibGFzdC8gZm9yIFBLV2FyZSBEYXRhIENvbXByZXNzaW9uIExpYnJhcnkgZGVjb21wcmVzc2lvbgotIEFkZCBjb250cmliL3B1ZmYvIHNpbXBsZSBpbmZsYXRlIGZvciBkZWZsYXRlIGZvcm1hdCBkZXNjcmlwdGlvbgoKQ2hhbmdlcyBpbiAxLjEuNCAoMTEgTWFyY2ggMjAwMikKLSBaRlJFRSB3YXMgcmVwZWF0ZWQgb24gc2FtZSBhbGxvY2F0aW9uIG9uIHNvbWUgZXJyb3IgY29uZGl0aW9ucy4KICBUaGlzIGNyZWF0ZXMgYSBzZWN1cml0eSBwcm9ibGVtIGRlc2NyaWJlZCBpbgogIGh0dHA6Ly93d3cuemxpYi5vcmcvYWR2aXNvcnktMjAwMi0wMy0xMS50eHQKLSBSZXR1cm5lZCBpbmNvcnJlY3QgZXJyb3IgKFpfTUVNX0VSUk9SKSBvbiBzb21lIGludmFsaWQgZGF0YQotIEF2b2lkIGFjY2Vzc2VzIGJlZm9yZSB3aW5kb3cgZm9yIGludmFsaWQgZGlzdGFuY2VzIHdpdGggaW5mbGF0ZSB3aW5kb3cKICBsZXNzIHRoYW4gMzJLLgotIGZvcmNlIHdpbmRvd0JpdHMgPiA4IHRvIGF2b2lkIGEgYnVnIGluIHRoZSBlbmNvZGVyIGZvciBhIHdpbmRvdyBzaXplCiAgb2YgMjU2IGJ5dGVzLiAoQSBjb21wbGV0ZSBmaXggd2lsbCBiZSBhdmFpbGFibGUgaW4gMS4xLjUpLgoKQ2hhbmdlcyBpbiAxLjEuMyAoOSBKdWx5IDE5OTgpCi0gZml4ICJhbiBpbmZsYXRlIGlucHV0IGJ1ZmZlciBidWcgdGhhdCBzaG93cyB1cCBvbiByYXJlIGJ1dCBwZXJzaXN0ZW50CiAgb2NjYXNpb25zIiAoTWFyaykKLSBmaXggZ3pyZWFkIGFuZCBnenRlbGwgZm9yIGNvbmNhdGVuYXRlZCAuZ3ogZmlsZXMgKERpZGllciBMZSBCb3RsYW4pCi0gZml4IGd6c2VlayguLi4sIFNFRUtfU0VUKSBpbiB3cml0ZSBtb2RlCi0gZml4IGNyYyBjaGVjayBhZnRlciBhIGd6ZWVrIChGcmFuayBGYXViZXJ0KQotIGZpeCBtaW5pdW56aXAgd2hlbiB0aGUgbGFzdCBlbnRyeSBpbiBhIHppcCBmaWxlIGlzIGl0c2VsZiBhIHppcCBmaWxlCiAgKEogTGlsbGdlKQotIGFkZCBjb250cmliL2FzbTU4NiBhbmQgY29udHJpYi9hc202ODYgKEJyaWFuIFJhaXRlcikKICBTZWUgaHR0cDovL3d3dy5tdXBwZXRsYWJzLmNvbS9+YnJlYWRib3gvc29mdHdhcmUvYXNzZW1ibHkuaHRtbAotIGFkZCBzdXBwb3J0IGZvciBEZWxwaGkgMyBpbiBjb250cmliL2RlbHBoaSAoQm9iIERlbGxhY2EpCi0gYWRkIHN1cHBvcnQgZm9yIEMrK0J1aWxkZXIgMyBhbmQgRGVscGhpIDMgaW4gY29udHJpYi9kZWxwaGkyIChEYXZpZGUgTW9yZXR0aSkKLSBkbyBub3QgZXhpdCBwcmVtYXR1cmVseSBpbiB1bnRneiBpZiAwIGF0IHN0YXJ0IG9mIGJsb2NrIChNYWdudXMgSG9sbWdyZW4pCi0gdXNlIG1hY3JvIEVYVEVSTiBpbnN0ZWFkIG9mIGV4dGVybiB0byBzdXBwb3J0IERMTCBmb3IgQmVPUyAoU2FuZGVyIFN0b2tzKQotIGFkZGVkIGEgRkFRIGZpbGUKCi0gU3VwcG9ydCBnemRvcGVuIG9uIE1hYyB3aXRoIE1ldHJvd2Vya3MgKEphc29uIExpbmhhcnQpCi0gRG8gbm90IHJlZGVmaW5lIEJ5dGUgb24gTWFjIChCcmFkIFBldHRpdCAmIEphc29uIExpbmhhcnQpCi0gZGVmaW5lIFNFRUtfRU5EIHRvbyBpZiBTRUVLX1NFVCBpcyBub3QgZGVmaW5lZCAoQWxiZXJ0IENoaW4tQS1Zb3VuZykKLSBhdm9pZCBzb21lIHdhcm5pbmdzIHdpdGggQm9ybGFuZCBDIChUb20gVGFubmVyKQotIGZpeCBhIHByb2JsZW0gaW4gY29udHJpYi9taW5pemlwL3ppcC5jIGZvciAxNi1iaXQgTVNET1MgKEdpbGxlcyBWb2xsYW50KQotIGVtdWxhdGUgdXRpbWUoKSBmb3IgV0lOMzIgaW4gY29udHJpYi91bnRneiAgKEdpbGxlcyBWb2xsYW50KQotIGFsbG93IHNldmVyYWwgYXJndW1lbnRzIHRvIGNvbmZpZ3VyZSAoVGltIE1vb25leSwgRnJvZG8gTG9vaWphYXJkKQotIHVzZSBsaWJkaXIgYW5kIGluY2x1ZGVkaXIgaW4gTWFrZWZpbGUuaW4gKFRpbSBNb29uZXkpCi0gc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzIG9uIE9TRjEgVjQgKFRpbSBNb29uZXkpCi0gcmVtb3ZlIHNvX2xvY2F0aW9ucyBpbiAibWFrZSBjbGVhbiIgIChUaW0gTW9vbmV5KQotIGZpeCBtYWtldHJlZS5jIGNvbXBpbGF0aW9uIGVycm9yIChHbGVubiwgTWFyaykKLSBQeXRob24gaW50ZXJmYWNlIHRvIHpsaWIgbm93IGluIFB5dGhvbiAxLjUgKEplcmVteSBIeWx0b24pCi0gbmV3IE1ha2VmaWxlLnJpc2NvcyAoUmljaCBXYWxrZXIpCi0gaW5pdGlhbGl6ZSBzdGF0aWMgZGVzY3JpcHRvcnMgaW4gdHJlZXMuYyBmb3IgZW1iZWRkZWQgdGFyZ2V0cyAoTmljayBTbWl0aCkKLSB1c2UgImZvby1neiIgaW4gZXhhbXBsZS5jIGZvciBSSVNDT1MgYW5kIFZNUyAoTmljayBTbWl0aCkKLSBhZGQgdGhlIE9TLzIgZmlsZXMgaW4gTWFrZWZpbGUuaW4gdG9vIChBbmRyZXcgWmFib2xvdG55KQotIGZpeCBmZG9wZW4gYW5kIGhhbGxvYyBtYWNyb3MgZm9yIE1pY3Jvc29mdCBDIDYuMCAoVG9tIExhbmUpCi0gZml4IG1ha2V0cmVlLmMgdG8gYWxsb3cgY2xlYW4gY29tcGlsYXRpb24gb2YgaW5mZml4ZWQuaCAoTWFyaykKLSBmaXggcGFyYW1ldGVyIGNoZWNrIGluIGRlZmxhdGVDb3B5IChHdW50aGVyIE5pa2wpCi0gY2xlYW51cCB0cmVlcy5jLCB1c2UgY29tcHJlc3NlZF9sZW4gb25seSBpbiBkZWJ1ZyBtb2RlIChDaHJpc3RpYW4gU3BpZWxlcikKLSBNYW55IHBvcnRhYmlsaXR5IHBhdGNoZXMgYnkgQ2hyaXN0aWFuIFNwaWVsZXI6CiAgLiB6dXRpbC5jLCB6dXRpbC5oOiBhZGRlZCAiY29uc3QiIGZvciB6bWVtKgogIC4gTWFrZV92bXMuY29tOiBmaXhlZCBzb21lIHR5cG9zCiAgLiBNYWtlX3Ztcy5jb206IG1zZG9zL01ha2VmaWxlLio6IHJlbW92ZWQgenV0aWwuaCBmcm9tIHNvbWUgZGVwZW5kZW5jeSBsaXN0cwogIC4gbXNkb3MvTWFrZWZpbGUubXNjOiByZW1vdmUgImRlZmF1bHQgcnRsIGxpbmsgbGlicmFyeSIgaW5mbyBmcm9tIG9iaiBmaWxlcwogIC4gbXNkb3MvTWFrZWZpbGUuKjogdXNlIG1vZGVsLWRlcGVuZGVudCBuYW1lIGZvciB0aGUgYnVpbHQgemxpYiBsaWJyYXJ5CiAgLiBtc2Rvcy9NYWtlZmlsZS5lbXgsIG50L01ha2VmaWxlLmVteCwgbnQvTWFrZWZpbGUuZ2NjOgogICAgIG5ldyBtYWtlZmlsZXMsIGZvciBlbXggKERPUy9PUzIpLCBlbXgmcnN4bnQgYW5kIG1pbmd3MzIgKFdpbmRvd3MgOXggLyBOVCkKLSB1c2UgZGVmaW5lIGluc3RlYWQgb2YgdHlwZWRlZiBmb3IgQnl0ZWYgYWxzbyBmb3IgTVNDIHNtYWxsL21lZGl1bSAoVG9tIExhbmUpCi0gcmVwbGFjZSBfX2ZhciB3aXRoIF9mYXIgZm9yIGJldHRlciBwb3J0YWJpbGl0eSAoQ2hyaXN0aWFuIFNwaWVsZXIsIFRvbSBMYW5lKQotIGZpeCB0ZXN0IGZvciBlcnJuby5oIGluIGNvbmZpZ3VyZSAoVGltIE5ld3NoYW0pCgpDaGFuZ2VzIGluIDEuMS4yICgxOSBNYXJjaCA5OCkKLSBhZGRlZCBjb250cmliL21pbnppcCwgbWluaSB6aXAgYW5kIHVuemlwIGJhc2VkIG9uIHpsaWIgKEdpbGxlcyBWb2xsYW50KQogIFNlZSBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL3VuemlwLmh0bWwKLSBwcmVpbml0aWFsaXplIHRoZSBpbmZsYXRlIHRhYmxlcyBmb3IgZml4ZWQgY29kZXMsIHRvIG1ha2UgdGhlIGNvZGUKICBjb21wbGV0ZWx5IHRocmVhZCBzYWZlIChNYXJrKQotIHNvbWUgc2ltcGxpZmljYXRpb25zIGFuZCBzbGlnaHQgc3BlZWQtdXAgdG8gdGhlIGluZmxhdGUgY29kZSAoTWFyaykKLSBmaXggZ3plb2Ygb24gbm9uLWNvbXByZXNzZWQgZmlsZXMgKEFsbGFuIFNjaHJ1bSkKLSBhZGQgLXN0ZDEgb3B0aW9uIGluIGNvbmZpZ3VyZSBmb3IgT1NGMSB0byBmaXggZ3pwcmludGYgKE1hcnRpbiBNb2tyZWpzKQotIHVzZSBkZWZhdWx0IHZhbHVlIG9mIDRLIGZvciBaX0JVRlNJWkUgZm9yIDE2LWJpdCBNU0RPUyAoVGltIFdlZ25lciArIEdsZW5uKQotIGFkZGVkIG9zMi9NYWtlZmlsZS5kZWYgYW5kIG9zMi96bGliLmRlZiAoQW5kcmV3IFphYm9sb3RueSkKLSBhZGQgc2hhcmVkIGxpYiBzdXBwb3J0IGZvciBVTklYX1NWNC4yTVAgKE1BVFNVVVJBIFRha2Fub3JpKQotIGRvIG5vdCB3cmFwIGV4dGVybiAiQyIgYXJvdW5kIHN5c3RlbSBpbmNsdWRlcyAoVG9tIExhbmUpCi0gbWVudGlvbiB6bGliIGJpbmRpbmcgZm9yIFRDTCBpbiBSRUFETUUgKEFuZHJlYXMgS3VwcmllcykKLSBhZGRlZCBhbWlnYS9NYWtlZmlsZS5wdXAgZm9yIEFtaWdhIHBvd2VyVVAgU0FTL0MgUFBDIChBbmRyZWFzIEtsZWluZXJ0KQotIGFsbG93ICJtYWtlIGluc3RhbGwgcHJlZml4PS4uLiIgZXZlbiBhZnRlciBjb25maWd1cmUgKEdsZW5uIFJhbmRlcnMtUGVocnNvbikKLSBhbGxvdyAiY29uZmlndXJlIC0tcHJlZml4ICRIT01FIiAoVGltIE1vb25leSkKLSByZW1vdmUgd2FybmluZ3MgaW4gZXhhbXBsZS5jIGFuZCBnemlvLmMgKEdsZW5uIFJhbmRlcnMtUGVocnNvbikKLSBtb3ZlIE1ha2VmaWxlLnNhcyB0byBhbWlnYS9NYWtlZmlsZS5zYXMKCkNoYW5nZXMgaW4gMS4xLjEgKDI3IEZlYiA5OCkKLSBmaXggbWFjcm9zIF90cl90YWxseV8qIGluIGRlZmxhdGUuaCBmb3IgZGVidWcgbW9kZSAgKEdsZW5uIFJhbmRlcnMtUGVocnNvbikKLSByZW1vdmUgYmxvY2sgdHJ1bmNhdGlvbiBoZXVyaXN0aWMgd2hpY2ggaGFkIHZlcnkgbWFyZ2luYWwgZWZmZWN0IGZvciB6bGliCiAgKHNtYWxsZXIgbGl0X2J1ZnNpemUgdGhhbiBpbiBnemlwIDEuMi40KSBhbmQgZGVncmFkZWQgYSBsaXR0bGUgdGhlCiAgY29tcHJlc3Npb24gcmF0aW8gb24gc29tZSBmaWxlcy4gVGhpcyBhbHNvIGFsbG93cyBpbmxpbmluZyBfdHJfdGFsbHkgZm9yCiAgbWF0Y2hlcyBpbiBkZWZsYXRlX3Nsb3cuCi0gYWRkZWQgbXNkb3MvTWFrZWZpbGUudzMyIGZvciBXSU4zMiBNaWNyb3NvZnQgVmlzdWFsIEMrKyAoQm9iIEZyYXppZXIpCgpDaGFuZ2VzIGluIDEuMS4wICgyNCBGZWIgOTgpCi0gZG8gbm90IHJldHVybiBTVFJFQU1fRU5EIHByZW1hdHVyZWx5IGluIGluZmxhdGUgKEpvaG4gQm93bGVyKQotIHJldmVydCB0byB0aGUgemxpYiAxLjAuOCBpbmZsYXRlIHRvIGF2b2lkIHRoZSBnY2MgMi44LjAgYnVnIChKZXJlbXkgQnVobGVyKQotIGNvbXBpbGUgd2l0aCAtREZBU1RFU1QgdG8gZ2V0IGNvbXByZXNzaW9uIGNvZGUgb3B0aW1pemVkIGZvciBzcGVlZCBvbmx5Ci0gaW4gbWluaWd6aXAsIHRyeSBtbWFwJ2luZyB0aGUgaW5wdXQgZmlsZSBmaXJzdCAoTWlndWVsIEFsYnJlY2h0KQotIGluY3JlYXNlIHNpemUgb2YgSS9PIGJ1ZmZlcnMgaW4gbWluaWd6aXAuYyBhbmQgZ3ppby5jIChub3QgYSBiaWcgZ2FpbgogIG9uIFN1biBidXQgc2lnbmlmaWNhbnQgb24gSFApCgotIGFkZCBhIHBvaW50ZXIgdG8gZXhwZXJpbWVudGFsIHVuemlwIGxpYnJhcnkgaW4gUkVBRE1FIChHaWxsZXMgVm9sbGFudCkKLSBpbml0aWFsaXplIHZhcmlhYmxlIGdjYyBpbiBjb25maWd1cmUgKENocmlzIEhlcmJvcnRoKQoKQ2hhbmdlcyBpbiAxLjAuOSAoMTcgRmViIDE5OTgpCi0gYWRkZWQgZ3pwdXRzIGFuZCBnemdldHMgZnVuY3Rpb25zCi0gZG8gbm90IGNsZWFyIGVvZiBmbGFnIGluIGd6c2VlayAoTWFyayBEaWVraGFucykKLSBmaXggZ3pzZWVrIGZvciBmaWxlcyBpbiB0cmFuc3BhcmVudCBtb2RlIChNYXJrIERpZWtoYW5zKQotIGRvIG5vdCBhc3N1bWUgdGhhdCB2c3ByaW50ZiByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiAoSmVucyBLcmlua2UpCi0gcmVwbGFjZSBFWFBPUlQgd2l0aCBaRVhQT1JUIHRvIGF2b2lkIGNvbmZsaWN0IHdpdGggb3RoZXIgcHJvZ3JhbXMKLSBhZGRlZCBjb21wcmVzczIgaW4gemNvbmYuaCwgemxpYi5kZWYsIHpsaWIuZG50Ci0gbmV3IGFzbSBjb2RlIGZyb20gR2lsbGVzIFZvbGxhbnQgaW4gY29udHJpYi9hc20zODYKLSBzaW1wbGlmeSB0aGUgaW5mbGF0ZSBjb2RlIChNYXJrKToKIC4gUmVwbGFjZSBaQUxMT0MncyBpbiBodWZ0X2J1aWxkKCkgd2l0aCBzaW5nbGUgWkFMTE9DIGluIGluZmxhdGVfYmxvY2tzX25ldygpCiAuIFpBTExPQyB0aGUgbGVuZ3RoIGxpc3QgaW4gaW5mbGF0ZV90cmVlc19maXhlZCgpIGluc3RlYWQgb2YgdXNpbmcgc3RhY2sKIC4gWkFMTE9DIHRoZSB2YWx1ZSBhcmVhIGZvciBodWZ0X2J1aWxkKCkgaW5zdGVhZCBvZiB1c2luZyBzdGFjawogLiBTaW1wbGlmeSBaX0ZJTklTSCBjaGVjayBpbiBpbmZsYXRlKCkKCi0gQXZvaWQgZ2NjIDIuOC4wIGNvbXBhcmlzb24gYnVnIGEgbGl0dGxlIGRpZmZlcmVudGx5IHRoYW4gemxpYiAxLjAuOAotIGluIGluZnRyZWVzLmMsIGF2b2lkIGNjIC1PIGJ1ZyBvbiBIUCAoRmFyc2hpZCBFbGFoaSkKLSBpbiB6Y29uZi5oIG1vdmUgdGhlIFpMSUJfRExMIHN0dWZmIGVhcmxpZXIgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aAogIHRoZSBkZWNsYXJhdGlvbiBvZiBGQVIgKEdpbGxlcyBWT2xsYW50KQotIGluc3RhbGwgbGliei5zbyogd2l0aCBtb2RlIDc1NSAoZXhlY3V0YWJsZSkgaW5zdGVhZCBvZiA2NDQgKE1hcmMgTGVobWFubikKLSByZWFkX2J1ZiBidWYgcGFyYW1ldGVyIG9mIHR5cGUgQnl0ZWYqIGluc3RlYWQgb2YgY2hhcmYqCi0gem1lbWNweSBwYXJhbWV0ZXJzIGFyZSBvZiB0eXBlIEJ5dGVmKiwgbm90IGNoYXJmKiAoSm9zZXBoIFN0cm91dCkKLSBkbyBub3QgcmVkZWNsYXJlIHVubGluayBpbiBtaW5pZ3ppcC5jIGZvciBXSU4zMiAoSm9obiBCb3dsZXIpCi0gZml4IGNoZWNrIGZvciBwcmVzZW5jZSBvZiBkaXJlY3RvcmllcyBpbiAibWFrZSBpbnN0YWxsIiAoSWFuIFdpbGxpcykKCkNoYW5nZXMgaW4gMS4wLjggKDI3IEphbiAxOTk4KQotIGZpeGVkIG9mZnNldHMgaW4gY29udHJpYi9hc20zODYvZ3ZtYXQzMi5hc20gKEdpbGxlcyBWb2xsYW50KQotIGZpeCBnemdldGMgYW5kIGd6cHV0YyBmb3IgYmlnIGVuZGlhbiBzeXN0ZW1zIChNYXJrdXMgT2Jlcmh1bWVyKQotIGFkZGVkIGNvbXByZXNzMigpIHRvIGFsbG93IHNldHRpbmcgdGhlIGNvbXByZXNzaW9uIGxldmVsCi0gaW5jbHVkZSBzeXMvdHlwZXMuaCB0byBnZXQgb2ZmX3Qgb24gc29tZSBzeXN0ZW1zIChNYXJjIExlaG1hbm4gJiBRaW5nTG9uZykKLSB1c2UgY29uc3RhbnQgYXJyYXlzIGZvciB0aGUgc3RhdGljIHRyZWVzIGluIHRyZWVzLmMgaW5zdGVhZCBvZiBjb21wdXRpbmcKICB0aGVtIGF0IHJ1biB0aW1lICh0aGFua3MgdG8gS2VuIFJhZWJ1cm4gZm9yIHRoaXMgc3VnZ2VzdGlvbikuIFRvIGNyZWF0ZQogIHRyZWVzLmgsIGNvbXBpbGUgd2l0aCBHRU5fVFJFRVNfSCBhbmQgcnVuICJtYWtlIHRlc3QiLgotIGNoZWNrIHJldHVybiBjb2RlIG9mIGV4YW1wbGUgaW4gIm1ha2UgdGVzdCIgYW5kIGRpc3BsYXkgcmVzdWx0Ci0gcGFzcyBtaW5pZ3ppcCBjb21tYW5kIGxpbmUgb3B0aW9ucyB0byBmaWxlX2NvbXByZXNzCi0gc2ltcGxpZnlpbmcgY29kZSBvZiBpbmZsYXRlU3luYyB0byBhdm9pZCBnY2MgMi44IGJ1ZwoKLSBzdXBwb3J0IENDPSJnY2MgLVdhbGwiIGluIGNvbmZpZ3VyZSAtcyAoUWluZ0xvbmcpCi0gYXZvaWQgYSBmbHVzaCBjYXVzZWQgYnkgZnRlbGwgaW4gZ3pvcGVuIGZvciB3cml0ZSBtb2RlIChLZW4gUmFlYnVybikKLSBmaXggdGVzdCBmb3Igc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCB0byBhdm9pZCBjb21waWxlciB3YXJuaW5ncwotIHpsaWIubGliIC0+IHpsaWIuZGxsIGluIG1zZG9zL3psaWIucmMgKEdpbGxlcyBWb2xsYW50KQotIGNoZWNrIGZvciBUQVJHRVRfT1NfTUFDIGluIGFkZGl0aW9uIHRvIE1BQ09TIChCcmFkIFBldHRpdCkKLSBkbyBub3QgdXNlIGZkb3BlbiBmb3IgTWV0cm93ZXJrcyBvbiBNYWMgKEJyYWQgUGV0dGl0KSkKLSBhZGQgY2hlY2tzIGZvciBnenB1dGMgYW5kIGd6cHV0YyBpbiBleGFtcGxlLmMKLSBhdm9pZCB3YXJuaW5ncyBpbiBnemlvLmMgYW5kIGRlZmxhdGUuYyAoQW5kcmVhcyBLbGVpbmVydCkKLSB1c2UgY29uc3QgZm9yIHRoZSBDUkMgdGFibGUgKEtlbiBSYWVidXJuKQotIGZpeGVkICJtYWtlIHVuaW5zdGFsbCIgZm9yIHNoYXJlZCBsaWJyYXJpZXMKLSB1c2UgVHJhY2V2IGluc3RlYWQgb2YgVHJhY2UgaW4gaW5mYmxvY2suYwotIGluIGV4YW1wbGUuYyB1c2UgY29ycmVjdCBjb21wcmVzc2VkIGxlbmd0aCBmb3IgdGVzdF9zeW5jCi0gc3VwcHJlc3MgK3Zub2NvbXBhdHdhcm5pbmdzIGluIGNvbmZpZ3VyZSBmb3IgSFBVWCAobm90IGFsd2F5cyBzdXBwb3J0ZWQpCgpDaGFuZ2VzIGluIDEuMC43ICgyMCBKYW4gMTk5OCkKLSBmaXggZ3pzZWVrIHdoaWNoIHdhcyBicm9rZW4gaW4gd3JpdGUgbW9kZQotIHJldHVybiBlcnJvciBmb3IgZ3pzZWVrIHRvIG5lZ2F0aXZlIGFic29sdXRlIHBvc2l0aW9uCi0gZml4IGNvbmZpZ3VyZSBmb3IgTGludXggKENodW4tQ2h1bmcgQ2hlbikKLSBpbmNyZWFzZSBzdGFjayBzcGFjZSBmb3IgTVNDIChUaW0gV2VnbmVyKQotIGdldF9jcmNfdGFibGUgYW5kIGluZmxhdGVTeW5jUG9pbnQgYXJlIEVYUE9SVGVkIChHaWxsZXMgVm9sbGFudCkKLSBkZWZpbmUgRVhQT1JUVkEgZm9yIGd6cHJpbnRmIChHaWxsZXMgVm9sbGFudCkKLSBhZGRlZCBtYW4gcGFnZSB6bGliLjMgKFJpY2sgUm9kZ2VycykKLSBmb3IgY29udHJpYi91bnRneiwgZml4IG1ha2VkaXIoKSBhbmQgaW1wcm92ZSBNYWtlZmlsZQoKLSBjaGVjayBnenNlZWsgaW4gd3JpdGUgbW9kZSBpbiBleGFtcGxlLmMKLSBhbGxvY2F0ZSBleHRyYSBidWZmZXIgZm9yIHNlZWtzIG9ubHkgaWYgZ3pzZWVrIGlzIGFjdHVhbGx5IGNhbGxlZAotIGF2b2lkIHNpZ25lZC91bnNpZ25lZCBjb21wYXJpc29ucyAoVGltIFdlZ25lciwgR2lsbGVzIFZvbGxhbnQpCi0gYWRkIGluZmxhdGVTeW5jUG9pbnQgaW4gemNvbmYuaAotIGZpeCBsaXN0IG9mIGV4cG9ydGVkIGZ1bmN0aW9ucyBpbiBudC96bGliLmRudCBhbmQgbWRzb3MvemxpYi5kZWYKCkNoYW5nZXMgaW4gMS4wLjYgKDE5IEphbiAxOTk4KQotIGFkZCBmdW5jdGlvbnMgZ3pwcmludGYsIGd6cHV0YywgZ3pnZXRjLCBnenRlbGwsIGd6ZW9mLCBnenNlZWssIGd6cmV3aW5kIGFuZAogIGd6c2V0cGFyYW1zICh0aGFua3MgdG8gUm9sYW5kIEdpZXJzaWcgYW5kIEtldmluIFJ1bGFuZCBmb3Igc29tZSBvZiB0aGlzIGNvZGUpCi0gRml4IGEgZGVmbGF0ZSBidWcgb2NjdXJyaW5nIG9ubHkgd2l0aCBjb21wcmVzc2lvbiBsZXZlbCAwICh0aGFua3MgdG8KICBBbmR5IEJ1Y2tsZXIgZm9yIGZpbmRpbmcgdGhpcyBvbmUpLgotIEluIG1pbmlnemlwLCBwYXNzIHRyYW5zcGFyZW50bHkgYWxzbyB0aGUgZmlyc3QgYnl0ZSBmb3IgLlogZmlsZXMuCi0gcmV0dXJuIFpfQlVGX0VSUk9SIGluc3RlYWQgb2YgWl9PSyBpZiBvdXRwdXQgYnVmZmVyIGZ1bGwgaW4gdW5jb21wcmVzcygpCi0gY2hlY2sgWl9GSU5JU0ggaW4gaW5mbGF0ZSAodGhhbmtzIHRvIE1hcmMgU2NobHVwZXIpCi0gSW1wbGVtZW50IGRlZmxhdGVDb3B5ICh0aGFua3MgdG8gQWRhbSBDb3N0ZWxsbykKLSBtYWtlIHN0YXRpYyBsaWJyYXJpZXMgYnkgZGVmYXVsdCBpbiBjb25maWd1cmUsIGFkZCAtLXNoYXJlZCBvcHRpb24uCi0gbW92ZSBNU0RPUyBvciBXaW5kb3dzIHNwZWNpZmljIGZpbGVzIHRvIGRpcmVjdG9yeSBtc2RvcwotIHN1cHByZXNzIHRoZSBub3Rpb24gb2YgcGFydGlhbCBmbHVzaCB0byBzaW1wbGlmeSB0aGUgaW50ZXJmYWNlCiAgKGJ1dCB0aGUgc3ltYm9sIFpfUEFSVElBTF9GTFVTSCBpcyBrZXB0IGZvciBjb21wYXRpYmlsaXR5IHdpdGggMS4wLjQpCi0gc3VwcHJlc3MgaGlzdG9yeSBidWZmZXIgcHJvdmlkZWQgYnkgYXBwbGljYXRpb24gdG8gc2ltcGxpZnkgdGhlIGludGVyZmFjZQogICh0aGlzIGZlYXR1cmUgd2FzIG5vdCBpbXBsZW1lbnRlZCBhbnl3YXkgaW4gMS4wLjQpCi0gbmV4dF9pbiBhbmQgYXZhaWxfaW4gbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgY2FsbGluZyBpbmZsYXRlSW5pdCBvcgogIGluZmxhdGVJbml0MgotIGFkZCBFWFBPUlQgaW4gYWxsIGV4cG9ydGVkIGZ1bmN0aW9ucyAoZm9yIFdpbmRvd3MgRExMKQotIGFkZGVkIE1ha2VmaWxlLm50ICh0aGFua3MgdG8gU3RlcGhlbiBXaWxsaWFtcykKLSBhZGRlZCB0aGUgdW5zdXBwb3J0ZWQgImNvbnRyaWIiIGRpcmVjdG9yeToKICAgY29udHJpYi9hc20zODYvIGJ5IEdpbGxlcyBWb2xsYW50IDxpbmZvQHdpbmltYWdlLmNvbT4KICAgICAgICAzODYgYXNtIGNvZGUgcmVwbGFjaW5nIGxvbmdlc3RfbWF0Y2goKS4KICAgY29udHJpYi9pb3N0cmVhbS8gYnkgS2V2aW4gUnVsYW5kIDxrZXZpbkByb2Rpbi53dXN0bC5lZHU+CiAgICAgICAgQSBDKysgSS9PIHN0cmVhbXMgaW50ZXJmYWNlIHRvIHRoZSB6bGliIGd6KiBmdW5jdGlvbnMKICAgY29udHJpYi9pb3N0cmVhbTIvICBieSBUeWdlIEz4dnNldCA8VHlnZS5Mb3ZzZXRAY21yLm5vPgogICAgICAgIEFub3RoZXIgQysrIEkvTyBzdHJlYW1zIGludGVyZmFjZQogICBjb250cmliL3VudGd6LyAgYnkgIlBlZHJvIEEuIEFyYW5kYSBHdXRpXGlycmV6IiA8cGFhZ0B0aWQuZXM+CiAgICAgICAgQSB2ZXJ5IHNpbXBsZSB0YXIuZ3ogZmlsZSBleHRyYWN0b3IgdXNpbmcgemxpYgogICBjb250cmliL3Zpc3VhbC1iYXNpYy50eHQgYnkgQ2FybG9zIFJpb3MgPGNfcmlvc0Bzb25kYS5jbD4KICAgICAgICBIb3cgdG8gdXNlIGNvbXByZXNzKCksIHVuY29tcHJlc3MoKSBhbmQgdGhlIGd6KiBmdW5jdGlvbnMgZnJvbSBWQi4KLSBwYXNzIHBhcmFtcyAtZiAoZmlsdGVyZWQgZGF0YSksIC1oIChodWZmbWFuIG9ubHkpLCAtMSB0byAtOSAoY29tcHJlc3Npb24KICBsZXZlbCkgaW4gbWluaWd6aXAgKHRoYW5rcyB0byBUb20gTGFuZSkKCi0gdXNlIGNvbnN0IGZvciByb21tYWJsZSBjb25zdGFudHMgaW4gZGVmbGF0ZQotIGFkZGVkIHRlc3QgZm9yIGd6c2VlayBhbmQgZ3p0ZWxsIGluIGV4YW1wbGUuYwotIGFkZCB1bmRvY3VtZW50ZWQgZnVuY3Rpb24gaW5mbGF0ZVN5bmNQb2ludCgpIChoYWNrIGZvciBQYXVsIE1hY2tlcnJhcykKLSBhZGQgdW5kb2N1bWVudGVkIGZ1bmN0aW9uIHpFcnJvciB0byBjb252ZXJ0IGVycm9yIGNvZGUgdG8gc3RyaW5nCiAgKGZvciBUaW0gU21pdGhlcnMpCi0gQWxsb3cgY29tcGlsYXRpb24gb2YgZ3ppbyB3aXRoIC1ETk9fREVGTEFURSB0byBhdm9pZCB0aGUgY29tcHJlc3Npb24gY29kZS4KLSBVc2UgZGVmYXVsdCBtZW1jcHkgZm9yIFN5bWFudGVjIE1TRE9TIGNvbXBpbGVyLgotIEFkZCBFWFBPUlQga2V5d29yZCBmb3IgY2hlY2tfZnVuYyAobmVlZGVkIGZvciBXaW5kb3dzIERMTCkKLSBhZGQgY3VycmVudCBkaXJlY3RvcnkgdG8gTERfTElCUkFSWV9QQVRIIGZvciAibWFrZSB0ZXN0IgotIGNyZWF0ZSBhbHNvIGEgbGluayBmb3IgbGliei5zby4xCi0gYWRkZWQgc3VwcG9ydCBmb3IgRlVKSVRTVSBVWFAvRFMgKHRoYW5rcyB0byBUb3NoaWFraSBOb211cmEpCi0gdXNlICQoU0hBUkVETElCKSBpbnN0ZWFkIG9mIGxpYnouc28gaW4gTWFrZWZpbGUuaW4gKGZvciBIUFVYKQotIGFkZGVkIC1zb25hbWUgZm9yIExpbnV4IGluIGNvbmZpZ3VyZSAoQ2h1bi1DaHVuZyBDaGVuLAotIGFzc2lnbiBudW1iZXJzIHRvIHRoZSBleHBvcnRlZCBmdW5jdGlvbnMgaW4gemxpYi5kZWYgKGZvciBXaW5kb3dzIERMTCkKLSBhZGQgYWR2aWNlIGluIHpsaWIuaCBmb3IgYmVzdCB1c2FnZSBvZiBkZWZsYXRlU2V0RGljdGlvbmFyeQotIHdvcmsgYXJvdW5kIGNvbXBpbGVyIGJ1ZyBvbiBBdGFyaSAoY2FzdCBaX05VTEwgaW4gY2FsbCBvZiBzLT5jaGVja2ZuKQotIGFsbG93IGNvbXBpbGF0aW9uIHdpdGggQU5TSSBrZXl3b3JkcyBvbmx5IGVuYWJsZWQgZm9yIFR1cmJvQyBpbiBsYXJnZSBtb2RlbAotIGF2b2lkICJ2ZXJzaW9uU3RyaW5nIlswXSAoQm9ybGFuZCBidWcpCi0gYWRkIE5FRURfRFVNTVlfUkVUVVJOIGZvciBCb3JsYW5kCi0gdXNlIHZhcmlhYmxlIHpfdmVyYm9zZSBmb3IgdHJhY2luZyBpbiBkZWJ1ZyBtb2RlIChMLiBQZXRlciBEZXV0c2NoKS4KLSBhbGxvdyBjb21waWxhdGlvbiB3aXRoIENDCi0gZGVmaW5lZCBTVERDIGZvciBPUy8yIChEYXZpZCBDaGFybGFwKQotIGxpbWl0IGV4dGVybmFsIG5hbWVzIHRvIDggY2hhcnMgZm9yIE1WUyAoVGhvbWFzIEx1bmQpCi0gaW4gbWluaWd6aXAuYywgdXNlIHN0YXRpYyBidWZmZXJzIG9ubHkgZm9yIDE2LWJpdCBzeXN0ZW1zCi0gZml4IHN1ZmZpeCBjaGVjayBmb3IgIm1pbmlnemlwIC1kIGZvby5neiIKLSBkbyBub3QgcmV0dXJuIGFuIGVycm9yIGZvciB0aGUgMm5kIG9mIHR3byBjb25zZWN1dGl2ZSBnemZsdXNoKCkgKEZlbGl4IExlZSkKLSB1c2UgX2Zkb3BlbiBpbnN0ZWFkIG9mIGZkb3BlbiBmb3IgTVNDID49IDYuMCAoVGhvbWFzIEZhbnNsYXUpCi0gYWRkZWQgbWFrZWxjYy5iYXQgZm9yIGxjYy13aW4zMiAoVG9tIFN0IERlbmlzKQotIGluIE1ha2VmaWxlLmRqMiwgdXNlIGNvcHkgYW5kIGRlbCBpbnN0ZWFkIG9mIGluc3RhbGwgYW5kIHJtIChGcmFuayBEb25haG9lKQotIEF2b2lkIGV4cGFuZGVkICRJZCQuIFVzZSAicmNzIC1rYiIgb3IgImN2cyBhZG1pbiAta2IiIHRvIGF2b2lkIElkIGV4cGFuc2lvbi4KLSBjaGVjayBmb3IgdW5pc3RkLmggaW4gY29uZmlndXJlIChmb3Igb2ZmX3QpCi0gcmVtb3ZlIHVzZWxlc3MgY2hlY2sgcGFyYW1ldGVyIGluIGluZmxhdGVfYmxvY2tzX2ZyZWUKLSBhdm9pZCB1c2VsZXNzIGFzc2lnbm1lbnQgb2Ygcy0+Y2hlY2sgdG8gaXRzZWxmIGluIGluZmxhdGVfYmxvY2tzX25ldwotIGRvIG5vdCBmbHVzaCB0d2ljZSBpbiBnemNsb3NlICh0aGFua3MgdG8gS2VuIFJhZWJ1cm4pCi0gcmVuYW1lIEZPUEVOIGFzIEZfT1BFTiB0byBhdm9pZCBjbGFzaCB3aXRoIC91c3IvaW5jbHVkZS9zeXMvZmlsZS5oCi0gdXNlIE5PX0VSUk5PX0ggaW5zdGVhZCBvZiBlbnVtZXJhdGlvbiBvZiBvcGVyYXRpbmcgc3lzdGVtcyB3aXRoIGVycm5vLmgKLSB3b3JrIGFyb3VuZCBidWdneSBmY2xvc2Ugb24gcGlwZXMgZm9yIEhQL1VYCi0gc3VwcG9ydCB6bGliIERMTCB3aXRoIEJPUkxBTkQgQysrIDUuMCAodGhhbmtzIHRvIEdsZW5uIFJhbmRlcnMtUGVocnNvbikKLSBmaXggY29uZmlndXJlIGlmIENDIGlzIGFscmVhZHkgZXF1YWwgdG8gZ2NjCgpDaGFuZ2VzIGluIDEuMC41ICgzIEphbiA5OCkKLSBGaXggaW5mbGF0ZSB0byB0ZXJtaW5hdGUgZ3JhY2VmdWxseSB3aGVuIGZlZCBjb3JydXB0ZWQgb3IgaW52YWxpZCBkYXRhCi0gVXNlIGNvbnN0IGZvciByb21tYWJsZSBjb25zdGFudHMgaW4gaW5mbGF0ZQotIEVsaW1pbmF0ZSBtZW1vcnkgbGVha3Mgb24gZXJyb3IgY29uZGl0aW9ucyBpbiBpbmZsYXRlCi0gUmVtb3ZlZCBzb21lIHZlc3RpZ2lhbCBjb2RlIGluIGluZmxhdGUKLSBVcGRhdGUgd2ViIGFkZHJlc3MgaW4gUkVBRE1FCgpDaGFuZ2VzIGluIDEuMC40ICgyNCBKdWwgOTYpCi0gSW4gdmVyeSByYXJlIGNvbmRpdGlvbnMsIGRlZmxhdGUocywgWl9GSU5JU0gpIGNvdWxkIGZhaWwgdG8gcHJvZHVjZSBhbiBFT0YKICBiaXQsIHNvIHRoZSBkZWNvbXByZXNzb3IgY291bGQgZGVjb21wcmVzcyBhbGwgdGhlIGNvcnJlY3QgZGF0YSBidXQgd2VudAogIG9uIHRvIGF0dGVtcHQgZGVjb21wcmVzc2luZyBleHRyYSBnYXJiYWdlIGRhdGEuIFRoaXMgYWZmZWN0ZWQgbWluaWd6aXAgdG9vLgotIHpsaWJWZXJzaW9uIGFuZCBnemVycm9yIHJldHVybiBjb25zdCBjaGFyKiAobmVlZGVkIGZvciBETEwpCi0gcG9ydCB0byBSSVNDT1MgKG5vIGZkb3Blbiwgbm8gbXVsdGlwbGUgZG90cywgbm8gdW5saW5rLCBubyBmaWxlbm8pCi0gdXNlIHpfZXJyb3Igb25seSBmb3IgREVCVUcgKGF2b2lkIHByb2JsZW0gd2l0aCBETExzKQoKQ2hhbmdlcyBpbiAxLjAuMyAoMiBKdWwgOTYpCi0gdXNlIHpfc3RyZWFtcCBpbnN0ZWFkIG9mIHpfc3RyZWFtICosIHdoaWNoIGlzIG5vdyBhIGZhciBwb2ludGVyIGluIE1TRE9TCiAgc21hbGwgYW5kIG1lZGl1bSBtb2RlbHM7IHRoaXMgbWFrZXMgdGhlIGxpYnJhcnkgaW5jb21wYXRpYmxlIHdpdGggcHJldmlvdXMKICB2ZXJzaW9ucyBmb3IgdGhlc2UgbW9kZWxzLiAoTm8gZWZmZWN0IGluIGxhcmdlIG1vZGVsIG9yIG9uIG90aGVyIHN5c3RlbXMuKQotIHJldHVybiBPSyBpbnN0ZWFkIG9mIEJVRl9FUlJPUiBpZiBwcmV2aW91cyBkZWZsYXRlIGNhbGwgcmV0dXJuZWQgd2l0aAogIGF2YWlsX291dCBhcyB6ZXJvIGJ1dCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvCi0gYWRkZWQgbWVtY21wIGZvciBub24gU1REQyBjb21waWxlcnMKLSBkZWZpbmUgTk9fRFVNTVlfREVDTCBmb3IgbW9yZSBNYWMgY29tcGlsZXJzICguaCBmaWxlcyBtZXJnZWQgaW5jb3JyZWN0bHkpCi0gZGVmaW5lIF9fMzJCSVRfXyBpZiBfXzM4Nl9fIG9yIGkzODYgaXMgZGVmaW5lZCAocGIuIHdpdGggV2F0Y29tIGFuZCBTQ08pCi0gYmV0dGVyIGNoZWNrIGZvciAxNi1iaXQgbW9kZSBNU0MgKGF2b2lkcyBwcm9ibGVtIHdpdGggU3ltYW50ZWMpCgpDaGFuZ2VzIGluIDEuMC4yICgyMyBNYXkgOTYpCi0gYWRkZWQgV2luZG93cyBETEwgc3VwcG9ydAotIGFkZGVkIGEgZnVuY3Rpb24gemxpYlZlcnNpb24gKGZvciB0aGUgRExMIHN1cHBvcnQpCi0gZml4ZWQgZGVjbGFyYXRpb25zIHVzaW5nIEJ5dGVmIGluIGluZnV0aWwuYyAocGIgd2l0aCBNU0RPUyBtZWRpdW0gbW9kZWwpCi0gQnl0ZWYgaXMgZGVmaW5lJ3MgaW5zdGVhZCBvZiB0eXBlZGVmJ2Qgb25seSBmb3IgQm9ybGFuZCBDCi0gYXZvaWQgcmVhZGluZyB1bmluaXRpYWxpemVkIG1lbW9yeSBpbiBleGFtcGxlLmMKLSBtZW50aW9uIGluIFJFQURNRSB0aGF0IHRoZSB6bGliIGZvcm1hdCBpcyBub3cgUkZDMTk1MAotIHVwZGF0ZWQgTWFrZWZpbGUuZGoyCi0gYWRkZWQgYWxnb3JpdGhtLmRvYwoKQ2hhbmdlcyBpbiAxLjAuMSAoMjAgTWF5IDk2KSBbMS4wIHNraXBwZWQgdG8gYXZvaWQgY29uZnVzaW9uXQotIGZpeCBhcnJheSBvdmVybGF5IGluIGRlZmxhdGUuYyB3aGljaCBzb21ldGltZXMgY2F1c2VkIGJhZCBjb21wcmVzc2VkIGRhdGEKLSBmaXggaW5mbGF0ZSBidWcgd2l0aCBlbXB0eSBzdG9yZWQgYmxvY2sKLSBmaXggTVNET1MgbWVkaXVtIG1vZGVsIHdoaWNoIHdhcyBicm9rZW4gaW4gMC45OQotIGZpeCBkZWZsYXRlUGFyYW1zKCkgd2hpY2ggY291bGQgZ2VuZXJhdGVkIGJhZCBjb21wcmVzc2VkIGRhdGEuCi0gQnl0ZWYgaXMgZGVmaW5lJ2QgaW5zdGVhZCBvZiB0eXBlZGVmJ2VkICh3b3JrIGFyb3VuZCBCb3JsYW5kIGJ1ZykKLSBhZGRlZCBhbiBJTkRFWCBmaWxlCi0gbmV3IG1ha2VmaWxlcyBmb3IgREpHUFAgKE1ha2VmaWxlLmRqMiksIDMyLWJpdCBCb3JsYW5kIChNYWtlZmlsZS5iMzIpLAogIFdhdGNvbSAoTWFrZWZpbGUud2F0KSwgQW1pZ2EgU0FTL0MgKE1ha2VmaWxlLnNhcykKLSBzcGVlZCB1cCBhZGxlcjMyIGZvciBtb2Rlcm4gbWFjaGluZXMgd2l0aG91dCBhdXRvLWluY3JlbWVudAotIGFkZGVkIC1hbnNpIGZvciBJUklYIGluIGNvbmZpZ3VyZQotIHN0YXRpY19pbml0X2RvbmUgaW4gdHJlZXMuYyBpcyBhbiBpbnQKLSBkZWZpbmUgdW5saW5rIGFzIGRlbGV0ZSBmb3IgVk1TCi0gZml4IGNvbmZpZ3VyZSBmb3IgUU5YCi0gYWRkIGNvbmZpZ3VyZSBicmFuY2ggZm9yIFNDTyBhbmQgSFBVWAotIGF2b2lkIG1hbnkgd2FybmluZ3MgKHVudXNlZCB2YXJpYWJsZXMsIGRlYWQgYXNzaWdubWVudHMsIGV0Yy4uLikKLSBubyBmZG9wZW4gZm9yIEJlT1MKLSBmaXggdGhlIFdhdGNvbSBmaXggZm9yIDMyIGJpdCBtb2RlIChkZWZpbmUgRkFSIGFzIGVtcHR5KQotIHJlbW92ZWQgcmVkZWZpbml0aW9uIG9mIEJ5dGUgZm9yIE1LV0VSS1MKLSB3b3JrIGFyb3VuZCBhbiBNV0tFUktTIGJ1ZyAoaW5jb3JyZWN0IG1lcmdlIG9mIGFsbCAuaCBmaWxlcykKCkNoYW5nZXMgaW4gMC45OSAoMjcgSmFuIDk2KQotIGFsbG93IHByZXNldCBkaWN0aW9uYXJ5IHNoYXJlZCBiZXR3ZWVuIGNvbXByZXNzb3IgYW5kIGRlY29tcHJlc3NvcgotIGFsbG93IGNvbXByZXNzaW9uIGxldmVsIDAgKG5vIGNvbXByZXNzaW9uKQotIGFkZCBkZWZsYXRlUGFyYW1zIGluIHpsaWIuaDogYWxsb3cgZHluYW1pYyBjaGFuZ2Ugb2YgY29tcHJlc3Npb24gbGV2ZWwKICBhbmQgY29tcHJlc3Npb24gc3RyYXRlZ3kuCi0gdGVzdCBsYXJnZSBidWZmZXJzIGFuZCBkZWZsYXRlUGFyYW1zIGluIGV4YW1wbGUuYwotIGFkZCBvcHRpb25hbCAiY29uZmlndXJlIiB0byBidWlsZCB6bGliIGFzIGEgc2hhcmVkIGxpYnJhcnkKLSBzdXBwcmVzcyBNYWtlZmlsZS5xbngsIHVzZSBjb25maWd1cmUgaW5zdGVhZAotIGZpeGVkIGRlZmxhdGUgZm9yIDY0LWJpdCBzeXN0ZW1zIChkZXRlY3RlZCBvbiBDcmF5KQotIGZpeGVkIGluZmxhdGVfYmxvY2tzIGZvciA2NC1iaXQgc3lzdGVtcyAoZGV0ZWN0ZWQgb24gQWxwaGEpCi0gZGVjbGFyZSBaX0RFRkxBVEVEIGluIHpsaWIuaCAocG9zc2libGUgcGFyYW1ldGVyIGZvciBkZWZsYXRlSW5pdDIpCi0gYWx3YXlzIHJldHVybiBaX0JVRl9FUlJPUiB3aGVuIGRlZmxhdGUoKSBoYXMgbm90aGluZyB0byBkbwotIGRlZmxhdGVJbml0IGFuZCBpbmZsYXRlSW5pdCBhcmUgbm93IG1hY3JvcyB0byBhbGxvdyB2ZXJzaW9uIGNoZWNraW5nCi0gcHJlZml4IGFsbCBnbG9iYWwgZnVuY3Rpb25zIGFuZCB0eXBlcyB3aXRoIHpfIHdpdGggLURaX1BSRUZJWAotIG1ha2UgZmFsbG9jIGNvbXBsZXRlbHkgcmVlbnRyYW50IChpbmZ0cmVlcy5jKQotIGZpeGVkIHZlcnkgdW5saWtlbHkgcmFjZSBjb25kaXRpb24gaW4gY3Rfc3RhdGljX2luaXQKLSBmcmVlIGluIHJldmVyc2Ugb3JkZXIgb2YgYWxsb2NhdGlvbiB0byBoZWxwIG1lbW9yeSBtYW5hZ2VyCi0gdXNlIHpsaWItMS4wLyogaW5zdGVhZCBvZiB6bGliLyogaW5zaWRlIHRoZSB0YXIuZ3oKLSBtYWtlIHpsaWIgd2FybmluZy1mcmVlIHdpdGggImdjYyAtTzMgLVdhbGwgLVd3cml0ZS1zdHJpbmdzIC1XcG9pbnRlci1hcml0aAogIC1XY29udmVyc2lvbiAtV3N0cmljdC1wcm90b3R5cGVzIC1XbWlzc2luZy1wcm90b3R5cGVzIgotIGFsbG93IGd6cmVhZCBvbiBjb25jYXRlbmF0ZWQgLmd6IGZpbGVzCi0gZGVmbGF0ZUVuZCBub3cgcmV0dXJucyBaX0RBVEFfRVJST1IgaWYgaXQgd2FzIHByZW1hdHVyZQotIGRlZmxhdGUgaXMgZmluYWxseSAoPykgZnVsbHkgZGV0ZXJtaW5pc3RpYyAobm8gbWF0Y2hlcyBiZXlvbmQgZW5kIG9mIGlucHV0KQotIERvY3VtZW50IFpfU1lOQ19GTFVTSAotIGFkZCB1bmluc3RhbGwgaW4gTWFrZWZpbGUKLSBDaGVjayBmb3IgX19jcGx1cGx1cyBpbiB6bGliLmgKLSBCZXR0ZXIgdGVzdCBpbiBjdF9hbGlnbiBmb3IgcGFydGlhbCBmbHVzaAotIGF2b2lkIGhhcm1sZXNzIHdhcm5pbmdzIGZvciBCb3JsYW5kIEMrKwotIGluaXRpYWxpemUgaGFzaF9oZWFkIGluIGRlZmxhdGUuYwotIGF2b2lkIHdhcm5pbmcgb24gZmRvcGVuIChnemlvLmMpIGZvciBIUCBjYyAtQWEKLSBpbmNsdWRlIHN0ZGxpYi5oIGZvciBTVERDIGNvbXBpbGVycwotIGluY2x1ZGUgZXJybm8uaCBmb3IgQ3JheQotIGlnbm9yZSBlcnJvciBpZiByYW5saWIgZG9lc24ndCBleGlzdAotIGNhbGwgcmFubGliIHR3aWNlIGZvciBOZVhUU1RFUAotIHVzZSBleGVjX3ByZWZpeCBpbnN0ZWFkIG9mIHByZWZpeCBmb3IgbGliei5hCi0gcmVuYW1lZCBjdF8qIGFzIF90cl8qIHRvIGF2b2lkIGNvbmZsaWN0IHdpdGggYXBwbGljYXRpb25zCi0gY2xlYXIgei0+bXNnIGluIGluZmxhdGVJbml0MiBiZWZvcmUgYW55IGVycm9yIHJldHVybgotIGluaXRpYWxpemUgb3BhcXVlIGluIGV4YW1wbGUuYywgZ3ppby5jLCBkZWZsYXRlLmMgYW5kIGluZmxhdGUuYwotIGZpeGVkIHR5cG8gaW4gemNvbmYuaCAoX0dOVUNfXyA9PiBfX0dOVUNfXykKLSBjaGVjayBmb3IgV0lOMzIgaW4gemNvbmYuaCBhbmQgenV0aWwuYyAoYXZvaWQgZmFybWFsbG9jIGluIDMyLWJpdCBtb2RlKQotIGZpeCB0eXBvIGluIE1ha2Vfdm1zLmNvbSAoZiR0cm5sbm0gLT4gZiRnZXRzeWkpCi0gaW4gZmNhbGxvYywgbm9ybWFsaXplIHBvaW50ZXIgaWYgc2l6ZSA+IDY1NTIwIGJ5dGVzCi0gZG9uJ3QgdXNlIHNwZWNpYWwgZmNhbGxvYyBmb3IgMzIgYml0IEJvcmxhbmQgQysrCi0gdXNlIFNUREMgaW5zdGVhZCBvZiBfX0dPMzJfXyB0byBhdm9pZCByZWRlY2xhcmluZyBleGl0LCBjYWxsb2MsIGV0Yy4uLgotIHVzZSBaX0JJTkFSWSBpbnN0ZWFkIG9mIEJJTkFSWQotIGRvY3VtZW50IHRoYXQgZ3pjbG9zZSBhZnRlciBnemRvcGVuIHdpbGwgY2xvc2UgdGhlIGZpbGUKLSBhbGxvdyAiYSIgYXMgbW9kZSBpbiBnem9wZW4uCi0gZml4IGVycm9yIGNoZWNraW5nIGluIGd6cmVhZAotIGFsbG93IHNraXBwaW5nIC5neiBleHRyYS1maWVsZCBvbiBwaXBlcwotIGFkZGVkIHJlZmVyZW5jZSB0byBQZXJsIGludGVyZmFjZSBpbiBSRUFETUUKLSBwdXQgdGhlIGNyYyB0YWJsZSBpbiBGQVIgZGF0YSAoSSBkaXNsaWtlIG1vcmUgYW5kIG1vcmUgdGhlIG1lZGl1bSBtb2RlbCA6KQotIGFkZGVkIGdldF9jcmNfdGFibGUKLSBhZGRlZCBhIGRpbWVuc2lvbiB0byBhbGwgYXJyYXlzIChCb3JsYW5kIEMgY2FuJ3QgY291bnQpLgotIHdvcmthcm91bmQgQm9ybGFuZCBDIGJ1ZyBpbiBkZWNsYXJhdGlvbiBvZiBpbmZsYXRlX2NvZGVzX25ldyAmIGluZmxhdGVfZmFzdAotIGd1YXJkIGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9uIG9mICouaCAoZm9yIHByZWNvbXBpbGVkIGhlYWRlciBvbiBNYWMpCi0gV2F0Y29tIEMgcHJldGVuZHMgdG8gYmUgTWljcm9zb2Z0IEMgc21hbGwgbW9kZWwgZXZlbiBpbiAzMiBiaXQgbW9kZS4KLSBkb24ndCB1c2UgdW5zaXplZCBhcnJheXMgdG8gYXZvaWQgc2lsbHkgd2FybmluZ3MgYnkgVmlzdWFsIEMrKzoKICAgICB3YXJuaW5nIEM0NzQ2OiAnaW5mbGF0ZV9tYXNrJyA6IHVuc2l6ZWQgYXJyYXkgdHJlYXRlZCBhcyAgJ19fZmFyJwogICAgICh3aGF0J3Mgd3Jvbmcgd2l0aCBmYXIgZGF0YSBpbiBmYXIgbW9kZWw/KS4KLSBkZWZpbmUgZW51bSBvdXQgb2YgaW5mbGF0ZV9ibG9ja3Nfc3RhdGUgdG8gYWxsb3cgY29tcGlsYXRpb24gd2l0aCBDKysKCkNoYW5nZXMgaW4gMC45NSAoMTYgQXVnIDk1KQotIGZpeCBNU0RPUyBzbWFsbCBhbmQgbWVkaXVtIG1vZGVsIChub3cgZWFzaWVyIHRvIGFkYXB0IHRvIGFueSBjb21waWxlcikKLSBpbmxpbmVkIHNlbmRfYml0cwotIGZpeCB0aGUgZmluYWwgKDotKSBidWcgZm9yIGRlZmxhdGUgd2l0aCBmbHVzaCAob3V0cHV0IHdhcyBjb3JyZWN0IGJ1dAogIG5vdCBjb21wbGV0ZWx5IGZsdXNoZWQgaW4gcmFyZSBvY2Nhc2lvbnMpLgotIGRlZmF1bHQgd2luZG93IHNpemUgaXMgc2FtZSBmb3IgY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24KICAoaXQncyBub3cgc3VmZmljaWVudCB0byBzZXQgTUFYX1dCSVRTIGluIHpjb25mLmgpLgotIHZvaWRwIC0+IHZvaWRwZiBhbmQgdm9pZG5wIC0+IHZvaWRwIChmb3IgY29uc2lzdGVuY3kgd2l0aCBvdGhlcgogIHR5cGVkZWZzIGFuZCBiZWNhdXNlIHZvaWRucCB3YXMgbm90IG5lYXIgaW4gbGFyZ2UgbW9kZWwpLgoKQ2hhbmdlcyBpbiAwLjk0ICgxMyBBdWcgOTUpCi0gc3VwcG9ydCBNU0RPUyBtZWRpdW0gbW9kZWwKLSBmaXggZGVmbGF0ZSB3aXRoIGZsdXNoIChjb3VsZCBzb21ldGltZXMgZ2VuZXJhdGUgYmFkIG91dHB1dCkKLSBmaXggZGVmbGF0ZVJlc2V0ICh6bGliIGhlYWRlciB3YXMgaW5jb3JyZWN0bHkgc3VwcHJlc3NlZCkKLSBhZGRlZCBzdXBwb3J0IGZvciBWTVMKLSBhbGxvdyBhIGNvbXByZXNzaW9uIGxldmVsIGluIGd6b3BlbigpCi0gZ3pmbHVzaCBub3cgY2FsbHMgZmZsdXNoCi0gRm9yIGRlZmxhdGUgd2l0aCBmbHVzaCwgZmx1c2ggZXZlbiBpZiBubyBtb3JlIGlucHV0IGlzIHByb3ZpZGVkLgotIHJlbmFtZSBsaWJnei5hIGFzIGxpYnouYQotIGF2b2lkIGNvbXBsZXggZXhwcmVzc2lvbiBpbiBpbmZjb2Rlcy5jIHRyaWdnZXJpbmcgVHVyYm8gQyBidWcKLSB3b3JrIGFyb3VuZCBhIHByb2JsZW0gd2l0aCBnY2Mgb24gQWxwaGEgKGluIElOU0VSVF9TVFJJTkcpCi0gZG9uJ3QgdXNlIGlubGluZSBmdW5jdGlvbnMgKHByb2JsZW0gd2l0aCBzb21lIGdjYyB2ZXJzaW9ucykKLSBhbGxvdyByZW5hbWluZyBvZiBCeXRlLCB1SW50LCBldGMuLi4gd2l0aCAjZGVmaW5lLgotIGF2b2lkIHdhcm5pbmcgYWJvdXQgKHVudXNlZCkgcG9pbnRlciBiZWZvcmUgc3RhcnQgb2YgYXJyYXkgaW4gZGVmbGF0ZS5jCi0gYXZvaWQgdmFyaW91cyB3YXJuaW5ncyBpbiBnemlvLmMsIGV4YW1wbGUuYywgaW5mYmxvY2suYywgYWRsZXIzMi5jLCB6dXRpbC5jCi0gYXZvaWQgcmVzZXJ2ZWQgd29yZCAnbmV3JyBpbiB0cmVlcy5jCgpDaGFuZ2VzIGluIDAuOTMgKDI1IEp1bmUgOTUpCi0gdGVtcG9yYXJpbHkgZGlzYWJsZSBpbmxpbmUgZnVuY3Rpb25zCi0gbWFrZSBkZWZsYXRlIGRldGVybWluaXN0aWMKLSBnaXZlIGVub3VnaCBsb29rYWhlYWQgZm9yIFBBUlRJQUxfRkxVU0gKLSBTZXQgYmluYXJ5IG1vZGUgZm9yIHN0ZGluL3N0ZG91dCBpbiBtaW5pZ3ppcC5jIGZvciBPUy8yCi0gZG9uJ3QgZXZlbiB1c2Ugc2lnbmVkIGNoYXIgaW4gaW5mbGF0ZSAobm90IHBvcnRhYmxlIGVub3VnaCkKLSBmaXggaW5mbGF0ZSBtZW1vcnkgbGVhayBmb3Igc2VnbWVudGVkIGFyY2hpdGVjdHVyZXMKCkNoYW5nZXMgaW4gMC45MiAoMyBNYXkgOTUpCi0gZG9uJ3QgYXNzdW1lIHRoYXQgY2hhciBpcyBzaWduZWQgKHByb2JsZW0gb24gU0dJKQotIENsZWFyIGJpdCBidWZmZXIgd2hlbiBzdGFydGluZyBhIHN0b3JlZCBibG9jawotIG5vIG1lbWNweSBvbiBQeXJhbWlkCi0gc3VwcHJlc3NlZCBpbmZ0ZXN0LmMKLSBvcHRpbWl6ZWQgZmlsbF93aW5kb3csIHB1dCBsb25nZXN0X21hdGNoIGlubGluZSBmb3IgZ2NjCi0gb3B0aW1pemVkIGluZmxhdGUgb24gc3RvcmVkIGJsb2Nrcy4KLSB1bnRhYmlmeSBhbGwgc291cmNlcyB0byBzaW1wbGlmeSBwYXRjaGVzCgpDaGFuZ2VzIGluIDAuOTEgKDIgTWF5IDk1KQotIERlZmF1bHQgTUVNX0xFVkVMIGlzIDggKG5vdCA5IGZvciBVbml4KSBhcyBkb2N1bWVudGVkIGluIHpsaWIuaAotIERvY3VtZW50IHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGluIHpjb25mLmgKLSBhZGRlZCAibWFrZSBpbnN0YWxsIgotIGZpeCBzeW5jIHNlYXJjaCBsb2dpYyBpbiBpbmZsYXRlU3luYwotIGRlZmxhdGUoWl9GVUxMX0ZMVVNIKSBub3cgd29ya3MgZXZlbiBpZiBvdXRwdXQgYnVmZmVyIHRvbyBzaG9ydAotIGFmdGVyIGluZmxhdGVTeW5jLCBkb24ndCBzY2FyZSBwZW9wbGUgd2l0aCBqdXN0ICJsbyB3b3JsZCIKLSBhZGRlZCBzdXBwb3J0IGZvciBESkdQUAoKQ2hhbmdlcyBpbiAwLjkgKDEgTWF5IDk1KQotIGRvbid0IGFzc3VtZSB0aGF0IHphbGxvYyBjbGVhcnMgdGhlIGFsbG9jYXRlZCBtZW1vcnkgKHRoZSBUdXJib0MgYnVnCiAgd2FzIE1hcmsncyBidWcgYWZ0ZXIgYWxsIDopCi0gbGV0IGFnYWluIGd6cmVhZCBjb3B5IHVuY29tcHJlc3NlZCBkYXRhIHVuY2hhbmdlZCAod2FzIHdvcmtpbmcgaW4gMC43MSkKLSBkZWZsYXRlKFpfRlVMTF9GTFVTSCksIGluZmxhdGVSZXNldCBhbmQgaW5mbGF0ZVN5bmMgYXJlIG5vdyBmdWxseSBpbXBsZW1lbnRlZAotIGFkZGVkIGEgdGVzdCBvZiBpbmZsYXRlU3luYyBpbiBleGFtcGxlLmMKLSBtb3ZlZCBNQVhfV0JJVFMgdG8gemNvbmYuaCBiZWNhdXNlIHVzZXJzIG1pZ2h0IHdhbnQgdG8gY2hhbmdlIHRoYXQuCi0gZG9jdW1lbnQgZXhwbGljaXRseSB0aGF0IHphbGxvYyg2NEspIG9uIE1TRE9TIG11c3QgcmV0dXJuIGEgbm9ybWFsaXplZAogIHBvaW50ZXIgKHplcm8gb2Zmc2V0KQotIGFkZGVkIE1ha2VmaWxlcyBmb3IgTWljcm9zb2Z0IEMsIFR1cmJvIEMsIEJvcmxhbmQgQysrCi0gZmFzdGVyIGNyYzMyKCkKCkNoYW5nZXMgaW4gMC44ICgyOSBBcHJpbCA5NSkKLSBhZGRlZCBmYXN0IGluZmxhdGUgKGluZmZhc3QuYykKLSBkZWZsYXRlKFpfRklOSVNIKSBub3cgcmV0dXJucyBaX1NUUkVBTV9FTkQgd2hlbiBkb25lLiBXYXJuaW5nOiB0aGlzCiAgaXMgaW5jb21wYXRpYmxlIHdpdGggcHJldmlvdXMgdmVyc2lvbnMgb2YgemxpYiB3aGljaCByZXR1cm5lZCBaX09LLgotIHdvcmsgYXJvdW5kIGEgVHVyYm9DIGNvbXBpbGVyIGJ1ZyAoYmFkIGNvZGUgZm9yIGIgPDwgMCwgc2VlIGluZnV0aWwuaCkKICAoYWN0dWFsbHkgdGhhdCB3YXMgbm90IGEgY29tcGlsZXIgYnVnLCBzZWUgMC44MSBhYm92ZSkKLSBnenJlYWQgbm8gbG9uZ2VyIHJlYWRzIG9uZSBleHRyYSBieXRlIGluIGNlcnRhaW4gY2FzZXMKLSBJbiBnemlvIGRlc3Ryb3koKSwgZG9uJ3QgcmVmZXJlbmNlIGEgZnJlZWQgc3RydWN0dXJlCi0gYXZvaWQgbWFueSB3YXJuaW5ncyBmb3IgTVNET1MKLSBhdm9pZCB0aGUgRVJST1Igc3ltYm9sIHdoaWNoIGlzIHVzZWQgYnkgTVMgV2luZG93cwoKQ2hhbmdlcyBpbiAwLjcxICgxNCBBcHJpbCA5NSkKLSBGaXhlZCBtb3JlIE1TRE9TIGNvbXBpbGF0aW9uIHByb2JsZW1zIDooIFRoZXJlIGlzIHN0aWxsIGEgYnVnIHdpdGgKICBUdXJib0MgbGFyZ2UgbW9kZWwuCgpDaGFuZ2VzIGluIDAuNyAoMTQgQXByaWwgOTUpCi0gQWRkZWQgZnVsbCBpbmZsYXRlIHN1cHBvcnQuCi0gU2ltcGxpZmllZCB0aGUgY3JjMzIoKSBpbnRlcmZhY2UuIFRoZSBwcmUtIGFuZCBwb3N0LWNvbmRpdGlvbmluZwogIChvbmUncyBjb21wbGVtZW50KSBpcyBub3cgZG9uZSBpbnNpZGUgY3JjMzIoKS4gV0FSTklORzogdGhpcyBpcwogIGluY29tcGF0aWJsZSB3aXRoIHByZXZpb3VzIHZlcnNpb25zOyBzZWUgemxpYi5oIGZvciB0aGUgbmV3IHVzYWdlLgoKQ2hhbmdlcyBpbiAwLjYxICgxMiBBcHJpbCA5NSkKLSB3b3JrYXJvdW5kIGZvciBhIGJ1ZyBpbiBUdXJib0MuIGV4YW1wbGUgYW5kIG1pbmlnemlwIG5vdyB3b3JrIG9uIE1TRE9TLgoKQ2hhbmdlcyBpbiAwLjYgKDExIEFwcmlsIDk1KQotIGFkZGVkIG1pbmlnemlwLmMKLSBhZGRlZCBnemRvcGVuIHRvIHJlb3BlbiBhIGZpbGUgZGVzY3JpcHRvciBhcyBnekZpbGUKLSBhZGRlZCB0cmFuc3BhcmVudCByZWFkaW5nIG9mIG5vbi1nemlwZWQgZmlsZXMgaW4gZ3pyZWFkLgotIGZpeGVkIGJ1ZyBpbiBnenJlYWQgKGRvbid0IHJlYWQgY3JjIGFzIGRhdGEpCi0gZml4ZWQgYnVnIGluIGRlc3Ryb3kgKGd6aW8uYykgKGRvbid0IHJldHVybiBaX1NUUkVBTV9FTkQgZm9yIGd6Y2xvc2UpLgotIGRvbid0IGFsbG9jYXRlIGJpZyBhcnJheXMgaW4gdGhlIHN0YWNrIChmb3IgTVNET1MpCi0gZml4IHNvbWUgTVNET1MgY29tcGlsYXRpb24gcHJvYmxlbXMKCkNoYW5nZXMgaW4gMC41OgotIGRvIHJlYWwgY29tcHJlc3Npb24gaW4gZGVmbGF0ZS5jLiBaX1BBUlRJQUxfRkxVU0ggaXMgc3VwcG9ydGVkIGJ1dAogIG5vdCB5ZXQgWl9GVUxMX0ZMVVNILgotIHN1cHBvcnQgZGVjb21wcmVzc2lvbiBidXQgb25seSBpbiBhIHNpbmdsZSBzdGVwIChmb3JjZWQgWl9GSU5JU0gpCi0gYWRkZWQgb3BhcXVlIG9iamVjdCBmb3IgemFsbG9jIGFuZCB6ZnJlZS4KLSBhZGRlZCBkZWZsYXRlUmVzZXQgYW5kIGluZmxhdGVSZXNldAotIGFkZGVkIGEgdmFyaWFibGUgemxpYl92ZXJzaW9uIGZvciBjb25zaXN0ZW5jeSBjaGVja2luZy4KLSByZW5hbWVkIHRoZSAnZmlsdGVyJyBwYXJhbWV0ZXIgb2YgZGVmbGF0ZUluaXQyIGFzICdzdHJhdGVneScuCiAgQWRkZWQgWl9GSUxURVJFRCBhbmQgWl9IVUZGTUFOX09OTFkgY29uc3RhbnRzLgoKQ2hhbmdlcyBpbiAwLjQ6Ci0gYXZvaWQgInppcCIgZXZlcnl3aGVyZSwgdXNlIHpsaWIgaW5zdGVhZCBvZiB6aXBsaWIuCi0gc3VwcHJlc3MgWl9CTE9DS19GTFVTSCwgaW50ZXJwcmV0IFpfUEFSVElBTF9GTFVTSCBhcyBibG9jayBmbHVzaAogIGlmIGNvbXByZXNzaW9uIG1ldGhvZCA9PSA4LgotIGFkZGVkIGFkbGVyMzIgYW5kIGNyYzMyCi0gcmVuYW1lZCBkZWZsYXRlT3B0aW9ucyBhcyBkZWZsYXRlSW5pdDIsIGNhbGwgb25lIG9yIHRoZSBvdGhlciBidXQgbm90IGJvdGgKLSBhZGRlZCB0aGUgbWV0aG9kIHBhcmFtZXRlciBmb3IgZGVmbGF0ZUluaXQyLgotIGFkZGVkIGluZmxhdGVJbml0MgotIHNpbXBsaWVkIGNvbnNpZGVyYWJseSBkZWZsYXRlSW5pdCBhbmQgaW5mbGF0ZUluaXQgYnkgbm90IHN1cHBvcnRpbmcKICB1c2VyLXByb3ZpZGVkIGhpc3RvcnkgYnVmZmVyLiBUaGlzIGlzIHN1cHBvcnRlZCBvbmx5IGluIGRlZmxhdGVJbml0MgogIGFuZCBpbmZsYXRlSW5pdDIuCgpDaGFuZ2VzIGluIDAuMzoKLSBwcmVmaXggYWxsIG1hY3JvIG5hbWVzIHdpdGggWl8KLSB1c2UgWl9GSU5JU0ggaW5zdGVhZCBvZiBkZWZsYXRlRW5kIHRvIGZpbmlzaCBjb21wcmVzc2lvbi4KLSBhZGRlZCBaX0hVRkZNQU5fT05MWQotIGFkZGVkIGd6ZXJyb3IoKQo=