CiAgICAgICAgICAgICAgICBDaGFuZ2VMb2cgZmlsZSBmb3IgemxpYgoKQ2hhbmdlcyBpbiAxLjIuMy4yICgzIFNlcHRlbWJlciAyMDA2KQotIFR1cm4gb2ZmIHNpbGx5IEJvcmxhbmQgd2FybmluZ3MgW0hheV0KLSBVc2Ugb2ZmNjRfdCBhbmQgZGVmaW5lIF9MQVJHRUZJTEU2NF9TT1VSQ0Ugd2hlbiBwcmVzZW50Ci0gRml4IG1pc3NpbmcgZGVwZW5kZW5jeSBvbiBpbmZmaXhlZC5oIGluIE1ha2VmaWxlLmluCi0gUmlnIGNvbmZpZ3VyZSAtLXNoYXJlZCB0byBidWlsZCBib3RoIHNoYXJlZCBhbmQgc3RhdGljIFtUZXJlZGVzYWksIFRydXRhXQotIFJlbW92ZSB6Y29uZi5pbi5oIGFuZCBpbnN0ZWFkIGNyZWF0ZSBhIG5ldyB6bGliZGVmcy5oIGZpbGUKLSBGaXggY29udHJpYi9taW5pemlwL3VuemlwLmMgbm9uLWVuY3J5cHRlZCBhZnRlciBlbmNyeXB0ZWQgW1ZvbGxhbnRdCi0gQWRkIHRyZWVidWlsZC54bWwgKHNlZSBodHRwOi8vdHJlZWJ1aWxkLm1ldHV4LmRlLykgW1dlaWdlbHRdCgpDaGFuZ2VzIGluIDEuMi4zLjEgKDE2IEF1Z3VzdCAyMDA2KQotIEFkZCB3YXRjb20gZGlyZWN0b3J5IHdpdGggT3BlbldhdGNvbSBtYWtlIGZpbGVzIFtEYW5pZWxdCi0gUmVtb3ZlICN1bmRlZiBvZiBGQVIgaW4gemNvbmYuaW4uaCBmb3IgTVZTIFtGZWR0a2VdCi0gVXBkYXRlIG1ha2Vfdm1zLmNvbSBbWmluc2VyXQotIFVzZSAtZlBJQyBmb3Igc2hhcmVkIGJ1aWxkIGluIGNvbmZpZ3VyZSBbVGVyZWRlc2FpLCBOaWNob2xzb25dCi0gVXNlIG9ubHkgbWFqb3IgdmVyc2lvbiBudW1iZXIgZm9yIGxpYnouc28gb24gSVJJWCBhbmQgT1NGMSBbUmVpbmhvbGR0c2VuXQotIFVzZSBmZG9wZW4oKSAobm90IF9mZG9wZW4oKSkgZm9yIEludGVyaXggaW4genV0aWwuaCBbQopja10KLSBBZGQgc29tZSBGQVEgZW50cmllcyBhYm91dCB0aGUgY29udHJpYiBkaXJlY3RvcnkKLSBVcGRhdGUgdGhlIE1WUyBxdWVzdGlvbiBpbiB0aGUgRkFRCi0gQXZvaWQgZXh0cmFuZW91cyByZWFkcyBhZnRlciBFT0YgaW4gZ3ppby5jIFtCcm93bl0KLSBDb3JyZWN0IHNwZWxsaW5nIG9mICJzdWNjZXNzZnVsbHkiIGluIGd6aW8uYyBbUmFuZGVycy1QZWhyc29uXQotIEFkZCBjb21tZW50cyB0byB6bGliLmggYWJvdXQgZ3plcnJvcigpIHVzYWdlIFtCcm93bl0KLSBTZXQgZXh0cmEgZmxhZ3MgaW4gZ3ppcCBoZWFkZXIgaW4gZ3pvcGVuKCkgbGlrZSBkZWZsYXRlKCkgZG9lcwotIE1ha2UgY29uZmlndXJlIG9wdGlvbnMgbW9yZSBjb21wYXRpYmxlIHdpdGggZG91YmxlLWRhc2ggY29udmVudGlvbnMKICBbV2VpZ2VsdF0KLSBDbGVhbiB1cCBjb21waWxhdGlvbiB1bmRlciBTb2xhcmlzIFN1blN0dWRpbyBjYyBbUm93ZSwgUmVpbmhvbGR0c2VuXQotIEZpeCB1bmluc3RhbGwgdGFyZ2V0IGluIE1ha2VmaWxlLmluIFtUcnV0YV0KLSBBZGQgcGtnY29uZmlnIHN1cHBvcnQgW1dlaWdlbHRdCi0gVXNlICQoREVTVERJUikgbWFjcm8gaW4gTWFrZWZpbGUuaW4gW1JlaW5ob2xkdHNlbiwgV2VpZ2VsdF0KLSBSZXBsYWNlIHNldF9kYXRhX3R5cGUoKSB3aXRoIGEgbW9yZSBhY2N1cmF0ZSBkZXRlY3RfZGF0YV90eXBlKCkgaW4KICB0cmVlcy5jLCBhY2NvcmRpbmcgdG8gdGhlIHR4dHZzYmluLnR4dCBkb2N1bWVudCBbVHJ1dGFdCi0gU3dhcCB0aGUgb3JkZXIgb2YgI2luY2x1ZGUgPHN0ZGlvLmg+IGFuZCAjaW5jbHVkZSAiemxpYi5oIiBpbgogIGd6aW8uYywgZXhhbXBsZS5jIGFuZCBtaW5pZ3ppcC5jIFtUcnV0YV0KLSBTaHV0IHVwIGFubm95aW5nIFZTMjAwNSB3YXJuaW5ncyBhYm91dCBzdGFuZGFyZCBDIGRlcHJlY2F0aW9uIFtSb3dlLAogIFRydXRhXSAod2hlcmU/KQotIEZpeCB0YXJnZXQgImNsZWFuIiBmcm9tIHdpbjMyL01ha2VmaWxlLmJvciBbVHJ1dGFdCi0gQ3JlYXRlIC5wZGIgYW5kIC5tYW5pZmVzdCBmaWxlcyBpbiB3aW4zMi9tYWtlZmlsZS5tc2MgW1ppZWdsZXIsIFJvd2VdCi0gVXBkYXRlIHpsaWIgd3d3IGhvbWUgYWRkcmVzcyBpbiB3aW4zMi9ETExfRkFRLnR4dCBbVHJ1dGFdCi0gVXBkYXRlIGNvbnRyaWIvbWFzbXg4Ni9pbmZmYXMzMi5hc20gZm9yIFZTMjAwNSBbVm9sbGFudCwgVmFuIFdhc3NlbmhvdmVdCi0gRW5hYmxlIGJyb3dzZSBpbmZvIGluIHRoZSAiRGVidWciIGFuZCAiQVNNIERlYnVnIiBjb25maWd1cmF0aW9ucyBpbgogIHRoZSBWaXN1YWwgQysrIDYgcHJvamVjdCwgYW5kIHNldCAobm9uLUFTTSkgIkRlYnVnIiBhcyBkZWZhdWx0IFtUcnV0YV0KLSBBZGQgcGtnY29uZmlnIHN1cHBvcnQgW1dlaWdlbHRdCi0gQWRkIFpMSUJfVkVSX01BSk9SLCBaTElCX1ZFUl9NSU5PUiBhbmQgWkxJQl9WRVJfUkVWSVNJT04gaW4gemxpYi5oLAogIGZvciB1c2UgaW4gd2luMzIvemxpYjEucmMgW1BvbHVzaGluLCBSb3dlLCBUcnV0YV0KLSBBZGQgYSBkb2N1bWVudCB0aGF0IGV4cGxhaW5zIHRoZSBuZXcgdGV4dCBkZXRlY3Rpb24gc2NoZW1lIHRvCiAgZG9jL3R4dHZzYmluLnR4dCBbVHJ1dGFdCi0gQWRkIHJmYzE5NTAudHh0LCByZmMxOTUxLnR4dCBhbmQgcmZjMTk1Mi50eHQgdG8gZG9jLyBbVHJ1dGFdCi0gTW92ZSBhbGdvcml0aG0udHh0IGludG8gZG9jLyBbVHJ1dGFdCi0gU3luY2hyb25pemUgRkFRIHdpdGggd2Vic2l0ZQotIEZpeCBjb21wcmVzc0JvdW5kKCksIHdhcyBsb3cgZm9yIHNvbWUgcGF0aG9sb2dpY2FsIGNhc2VzIFtGZWFybmxleV0KLSBUYWtlIGludG8gYWNjb3VudCB3cmFwcGVyIHZhcmlhdGlvbnMgaW4gZGVmbGF0ZUJvdW5kKCkKLSBTZXQgZXhhbXBsZXMvenBpcGUuYyBpbnB1dCBhbmQgb3V0cHV0IHRvIGJpbmFyeSBtb2RlIGZvciBXaW5kb3dzIAotIFVwZGF0ZSBleGFtcGxlcy96bGliX2hvdy5odG1sIHdpdGggbmV3IHpwaXBlLmMgKGFsc28gd2ViIHNpdGUpCi0gRml4IHNvbWUgd2FybmluZ3MgaW4gZXhhbXBsZXMvZ3psb2cuYyBhbmQgZXhhbXBsZXMvenJhbi5jIChpdCBzZWVtcwogIHRoYXQgZ2NjIGJlY2FtZSBwaWNraWVyIGluIDQuMCkKLSBBZGQgemxpYi5tYXAgZm9yIExpbnV4OiAiQWxsIHN5bWJvbHMgZnJvbSB6bGliLTEuMS40IHJlbWFpbgogIHVuLXZlcnNpb25lZCwgdGhlIHBhdGNoIGFkZHMgdmVyc2lvbmluZyBvbmx5IGZvciBzeW1ib2xzIGludHJvZHVjZWQgaW4KICB6bGliLTEuMi4wIG9yIGxhdGVyLiAgSXQgYWxzbyBkZWNsYXJlcyBhcyBsb2NhbCB0aG9zZSBzeW1ib2xzIHdoaWNoIGFyZQogIG5vdCBkZXNpZ25lZCB0byBiZSBleHBvcnRlZC4iIFtMZXZpbl0KLSBVcGRhdGUgWl9QUkVGSVggbGlzdCBpbiB6Y29uZi5pbi5oLCBhZGQgLS16cHJlZml4IG9wdGlvbiB0byBjb25maWd1cmUKLSBEbyBub3QgaW5pdGlhbGl6ZSBnbG9iYWwgc3RhdGljIGJ5IGRlZmF1bHQgaW4gdHJlZXMuYywgYWRkIGEgcmVzcG9uc2UKICBOT19JTklUX0dMT0JBTF9QT0lOVEVSUyB0byBpbml0aWFsaXplIHRoZW0gaWYgbmVlZGVkIFtNYXJxdWVzc10KLSBEb24ndCB1c2Ugc3RyZXJyb3IoKSBpbiBnemlvLmMgdW5kZXIgV2luQ0UgW1lha2ltb3ZdCi0gRG9uJ3QgdXNlIGVycm5vLmggaW4genV0aWwuaCB1bmRlciBXaW5DRSBbWWFraW1vdl0KLSBNb3ZlIGFyZ3VtZW50cyBmb3IgQVIgdG8gaXRzIHVzYWdlIHRvIGFsbG93IHJlcGxhY2luZyBhciBbTWFyb3RdCi0gQWRkIEhBVkVfVklTSUJJTElUWV9QUkFHTUEgaW4gemNvbmYuaW4uaCBmb3IgTW96aWxsYSBbUmFuZGVycy1QZWhyc29uXQotIEltcHJvdmUgaW5mbGF0ZUluaXQoKSBhbmQgaW5mbGF0ZUluaXQyKCkgZG9jdW1lbnRhdGlvbgotIEZpeCBzdHJ1Y3R1cmUgc2l6ZSBjb21tZW50IGluIGluZmxhdGUuaAotIENoYW5nZSBjb25maWd1cmUgaGVscCBvcHRpb24gZnJvbSAtLWgqIHRvIC0taGVscCBbU2FudG9zXQoKQ2hhbmdlcyBpbiAxLjIuMyAoMTggSnVseSAyMDA1KQotIEFwcGx5IHNlY3VyaXR5IHZ1bG5lcmFiaWxpdHkgZml4ZXMgdG8gY29udHJpYi9pbmZiYWNrOSBhcyB3ZWxsCi0gQ2xlYW4gdXAgc29tZSB0ZXh0IGZpbGVzIChjYXJyaWFnZSByZXR1cm5zLCB0cmFpbGluZyBzcGFjZSkKLSBVcGRhdGUgdGVzdHpsaWIsIHZzdHVkaW8sIG1hc214NjQsIGFuZCBtYXNteDg2IGluIGNvbnRyaWIgW1ZvbGxhbnRdCgpDaGFuZ2VzIGluIDEuMi4yLjQgKDExIEp1bHkgMjAwNSkKLSBBZGQgaW5mbGF0ZVByaW1lKCkgZnVuY3Rpb24gZm9yIHN0YXJ0aW5nIGluZmxhdGlvbiBhdCBiaXQgYm91bmRhcnkKLSBBdm9pZCBzb21lIFZpc3VhbCBDIHdhcm5pbmdzIGluIGRlZmxhdGUuYwotIEF2b2lkIG1vcmUgc2lsbHkgVmlzdWFsIEMgd2FybmluZ3MgaW4gaW5mbGF0ZS5jIGFuZCBpbmZ0cmVlcy5jIGZvciA2NC1iaXQKICBjb21waWxlCi0gRml4IHNvbWUgc3BlbGxpbmcgZXJyb3JzIGluIGNvbW1lbnRzIFtCZXR0c10KLSBDb3JyZWN0IGluZmxhdGVJbml0MigpIGVycm9yIHJldHVybiBkb2N1bWVudGF0aW9uIGluIHpsaWIuaAotIEFkZGVkIHpyYW4uYyBleGFtcGxlIG9mIGNvbXByZXNzZWQgZGF0YSByYW5kb20gYWNjZXNzIHRvIGV4YW1wbGVzCiAgZGlyZWN0b3J5LCBzaG93cyB1c2Ugb2YgaW5mbGF0ZVByaW1lKCkKLSBGaXggY2FzdCBmb3IgYXNzaWdubWVudHMgdG8gc3RybS0+c3RhdGUgaW4gaW5mbGF0ZS5jIGFuZCBpbmZiYWNrLmMKLSBGaXggemxpYkNvbXBpbGVGbGFncygpIGluIHp1dGlsLmMgdG8gdXNlIDFMIGZvciBsb25nIHNoaWZ0cyBbT2Jlcmh1bWVyXQotIE1vdmUgZGVjbGFyYXRpb25zIG9mIGdmMiBmdW5jdGlvbnMgdG8gcmlnaHQgcGxhY2UgaW4gY3JjMzIuYyBbT2Jlcmh1bWVyXQotIEFkZCBjYXN0IGluIHRyZWVzLmMgdCBhdm9pZCBhIHdhcm5pbmcgW09iZXJodW1lcl0KLSBBdm9pZCBzb21lIHdhcm5pbmdzIGluIGZpdGJsay5jLCBndW4uYywgZ3pqb2luLmMgaW4gZXhhbXBsZXMgW09iZXJodW1lcl0KLSBVcGRhdGUgbWFrZV92bXMuY29tIFtaaW5zZXJdCi0gSW5pdGlhbGl6ZSBzdGF0ZS0+d3JpdGUgaW4gaW5mbGF0ZVJlc2V0KCkgc2luY2UgY29waWVkIGluIGluZmxhdGVfZmFzdCgpCi0gQmUgbW9yZSBzdHJpY3Qgb24gaW5jb21wbGV0ZSBjb2RlIHNldHMgaW4gaW5mbGF0ZV90YWJsZSgpIGFuZCBpbmNyZWFzZQogIEVOT1VHSCBhbmQgTUFYRCAtLSB0aGlzIHJlcGFpcnMgYSBwb3NzaWJsZSBzZWN1cml0eSB2dWxuZXJhYmlsaXR5IGZvcgogIGludmFsaWQgaW5mbGF0ZSBpbnB1dC4gIFRoYW5rcyB0byBUYXZpcyBPcm1hbmR5IGFuZCBNYXJrdXMgT2Jlcmh1bWVyIGZvcgogIGRpc2NvdmVyaW5nIHRoZSB2dWxuZXJhYmlsaXR5IGFuZCBwcm92aWRpbmcgdGVzdCBjYXNlcy4KLSBBZGQgaWE2NCBzdXBwb3J0IHRvIGNvbmZpZ3VyZSBmb3IgSFAtVVggW1NtaXRoXQotIEFkZCBlcnJvciByZXR1cm4gdG8gZ3pyZWFkKCkgZm9yIGZvcm1hdCBvciBpL28gZXJyb3IgW0xldmluXQotIFVzZSBtYWxsb2MuaCBmb3IgT1MvMiBbTmVjYXNla10KCkNoYW5nZXMgaW4gMS4yLjIuMyAoMjcgTWF5IDIwMDUpCi0gUmVwbGFjZSAxVSBjb25zdGFudHMgaW4gaW5mbGF0ZS5jIGFuZCBpbmZ0cmVlcy5jIGZvciA2NC1iaXQgY29tcGlsZQotIFR5cGVjYXN0IGZyZWFkKCkgcmV0dXJuIHZhbHVlcyBpbiBnemlvLmMgW1ZvbGxhbnRdCi0gUmVtb3ZlIHRyYWlsaW5nIHNwYWNlIGluIG1pbmlnemlwLmMgb3V0bW9kZSAoVkMrKyBjYW4ndCBkZWFsIHdpdGggaXQpCi0gRml4IGNyYyBjaGVjayBidWcgaW4gZ3pyZWFkKCkgYWZ0ZXIgZ3p1bmdldGMoKSBbSGVpbmVyXQotIEFkZCB0aGUgZGVmbGF0ZVR1bmUoKSBmdW5jdGlvbiB0byBhZGp1c3QgaW50ZXJuYWwgY29tcHJlc3Npb24gcGFyYW1ldGVycwotIEFkZCBhIGZhc3QgZ3ppcCBkZWNvbXByZXNzb3IsIGd1bi5jLCB0byBleGFtcGxlcyAodXNlIG9mIGluZmxhdGVCYWNrKQotIFJlbW92ZSBhbiBpbmNvcnJlY3QgYXNzZXJ0aW9uIGluIGV4YW1wbGVzL3pwaXBlLmMKLSBBZGQgQysrIHdyYXBwZXIgaW4gaW5mYmFjazkuaCBbRG9uYWlzXQotIEZpeCBidWcgaW4gaW5mbGF0ZUNvcHkoKSB3aGVuIGRlY29kaW5nIGZpeGVkIGNvZGVzCi0gTm90ZSBpbiB6bGliLmggaG93IG11Y2ggZGVmbGF0ZVNldERpY3Rpb25hcnkoKSBhY3R1YWxseSB1c2VzCi0gUmVtb3ZlIFVTRV9ESUNUX0hFQUQgaW4gZGVmbGF0ZS5jICh3b3VsZCBtZXNzIHVwIGluZmxhdGUgaWYgdXNlZCkKLSBBZGQgX1dJTjMyX1dDRSB0byBkZWZpbmUgV0lOMzIgaW4gemNvbmYuaW4uaCBbU3BlbmNlcl0KLSBEb24ndCBpbmNsdWRlIHN0ZGVyci5oIG9yIGVycm5vLmggZm9yIF9XSU4zMl9XQ0UgaW4genV0aWwuaCBbU3BlbmNlcl0KLSBBZGQgZ3pkaXJlY3QoKSBmdW5jdGlvbiB0byBpbmRpY2F0ZSB0cmFuc3BhcmVudCByZWFkcwotIFVwZGF0ZSBjb250cmliL21pbml6aXAgW1ZvbGxhbnRdCi0gRml4IGNvbXBpbGF0aW9uIG9mIGRlZmxhdGUuYyB3aGVuIGJvdGggQVNNViBhbmQgRkFTVEVTVCBbT2Jlcmh1bWVyXQotIEFkZCBjYXN0cyBpbiBjcmMzMi5jIHRvIGF2b2lkIHdhcm5pbmdzIFtPYmVyaHVtZXJdCi0gQWRkIGNvbnRyaWIvbWFzbXg2NCBbVm9sbGFudF0KLSBVcGRhdGUgY29udHJpYi9hc201ODYsIGFzbTY4NiwgbWFzbXg4NiwgdGVzdHpsaWIsIHZzdHVkaW8gW1ZvbGxhbnRdCgpDaGFuZ2VzIGluIDEuMi4yLjIgKDMwIERlY2VtYmVyIDIwMDQpCi0gUmVwbGFjZSBzdHJ1Y3R1cmUgYXNzaWdubWVudHMgaW4gZGVmbGF0ZS5jIGFuZCBpbmZsYXRlLmMgd2l0aCB6bWVtY3B5IHRvCiAgYXZvaWQgaW1wbGljaXQgbWVtY3B5IGNhbGxzIChwb3J0YWJpbGl0eSBmb3Igbm8tbGlicmFyeSBjb21waWxhdGlvbikKLSBJbmNyZWFzZSBzcHJpbnRmKCkgYnVmZmVyIHNpemUgaW4gZ3pkb3BlbigpIHRvIGFsbG93IGZvciBsYXJnZSBudW1iZXJzCi0gQWRkIElORkxBVEVfU1RSSUNUIHRvIGNoZWNrIGRpc3RhbmNlcyBhZ2FpbnN0IHpsaWIgaGVhZGVyCi0gSW1wcm92ZSBXaW5DRSBlcnJubyBoYW5kbGluZyBhbmQgY29tbWVudHMgW0NoYW5nXQotIFJlbW92ZSBjb21tZW50IGFib3V0IG5vIGd6aXAgaGVhZGVyIHByb2Nlc3NpbmcgaW4gRkFRCi0gQWRkIFpfRklYRUQgc3RyYXRlZ3kgb3B0aW9uIHRvIGRlZmxhdGVJbml0MigpIHRvIGZvcmNlIGZpeGVkIHRyZWVzCi0gQWRkIHVwZGF0ZWQgbWFrZV92bXMuY29tIFtDb2dobGFuXSwgdXBkYXRlIFJFQURNRQotIENyZWF0ZSBhIG5ldyAiZXhhbXBsZXMiIGRpcmVjdG9yeSwgbW92ZSBnemFwcGVuZC5jIHRoZXJlLCBhZGQgenBpcGUuYywKICBmaXRibGsuYywgZ3psb2cuW2NoXSwgZ3pqb2luLmMsIGFuZCB6bGliX2hvdy5odG1sLgotIEFkZCBGQVEgZW50cnkgYW5kIGNvbW1lbnRzIGluIGRlZmxhdGUuYyBvbiB1bmluaXRpYWxpemVkIG1lbW9yeSBhY2Nlc3MKLSBBZGQgU29sYXJpcyA5IG1ha2Ugb3B0aW9ucyBpbiBjb25maWd1cmUgW0dpbGJlcnRdCi0gQWxsb3cgc3RyZXJyb3IoKSB1c2FnZSBpbiBnemlvLmMgZm9yIFNUREMKLSBGaXggRGVjb21wcmVzc0J1ZiBpbiBjb250cmliL2RlbHBoaS9aTGliLnBhcyBbTWFuQ2hlc1Rlcl0KLSBVcGRhdGUgY29udHJpYi9tYXNteDg2L2luZmZhczMyLmFzbSBhbmQgZ3ZtYXQzMi5hc20gW1ZvbGxhbnRdCi0gVXNlIHpfb2ZmX3QgZm9yIGFkbGVyMzJfY29tYmluZSgpIGFuZCBjcmMzMl9jb21iaW5lKCkgbGVuZ3RocwotIE1ha2UgYWRsZXIzMigpIG11Y2ggZmFzdGVyIGZvciBzbWFsbCBsZW4KLSBVc2UgT1NfQ09ERSBpbiBkZWZsYXRlKCkgZGVmYXVsdCBnemlwIGhlYWRlcgoKQ2hhbmdlcyBpbiAxLjIuMi4xICgzMSBPY3RvYmVyIDIwMDQpCi0gQWxsb3cgaW5mbGF0ZVNldERpY3Rpb25hcnkoKSBjYWxsIGZvciByYXcgaW5mbGF0ZQotIEZpeCBpbmZsYXRlIGhlYWRlciBjcmMgY2hlY2sgYnVnIGZvciBmaWxlIG5hbWVzIGFuZCBjb21tZW50cwotIEFkZCBkZWZsYXRlU2V0SGVhZGVyKCkgYW5kIGd6X2hlYWRlciBzdHJ1Y3R1cmUgZm9yIGN1c3RvbSBnemlwIGhlYWRlcnMKLSBBZGQgaW5mbGF0ZUdldGhlYWRlcigpIHRvIHJldHJpZXZlIGd6aXAgaGVhZGVycwotIEFkZCBjcmMzMl9jb21iaW5lKCkgYW5kIGFkbGVyMzJfY29tYmluZSgpIGZ1bmN0aW9ucwotIEFkZCBhbGxvY19mdW5jLCBmcmVlX2Z1bmMsIGluX2Z1bmMsIG91dF9mdW5jIHRvIFpfUFJFRklYIGxpc3QKLSBVc2UgenN0cmVhbXAgY29uc2lzdGVudGx5IGluIHpsaWIuaCAoaW5mbGF0ZV9iYWNrIGZ1bmN0aW9ucykKLSBSZW1vdmUgR1VOWklQIGNvbmRpdGlvbiBmcm9tIGRlZmluaXRpb24gb2YgaW5mbGF0ZV9tb2RlIGluIGluZmxhdGUuaAogIGFuZCBpbiBjb250cmliL2luZmxhdGU4Ni9pbmZmYXN0LlMgW1RydXRhLCBBbmRlcnNvbl0KLSBBZGQgc3VwcG9ydCBmb3IgQU1ENjQgaW4gY29udHJpYi9pbmZsYXRlODYvaW5mZmFzODYuYyBbQW5kZXJzb25dCi0gVXBkYXRlIHByb2plY3RzL1JFQURNRS5wcm9qZWN0cyBhbmQgcHJvamVjdHMvdmlzdWFsYzYgW1RydXRhXQotIFVwZGF0ZSB3aW4zMi9ETExfRkFRLnR4dCBbVHJ1dGFdCi0gQXZvaWQgd2FybmluZyB1bmRlciBOT19HWkNPTVBSRVNTIGluIGd6aW8uYzsgZml4IHR5cG8gW1RydXRhXQotIERlcHJlY2F0ZSBaX0FTQ0lJOyB1c2UgWl9URVhUIGluc3RlYWQgW1RydXRhXQotIFVzZSBhIG5ldyBhbGdvcml0aG0gZm9yIHNldHRpbmcgc3RybS0+ZGF0YV90eXBlIGluIHRyZWVzLmMgW1RydXRhXQotIERvIG5vdCBkZWZpbmUgYW4gZXhpdCgpIHByb3RvdHlwZSBpbiB6dXRpbC5jIHVubGVzcyBERUJVRyBkZWZpbmVkCi0gUmVtb3ZlIHByb3RvdHlwZSBvZiBleGl0KCkgZnJvbSB6dXRpbC5jLCBleGFtcGxlLmMsIG1pbmlnemlwLmMgW1RydXRhXQotIEFkZCBjb21tZW50IGluIHpsaWIuaCBmb3IgWl9OT19GTFVTSCBwYXJhbWV0ZXIgdG8gZGVmbGF0ZSgpCi0gRml4IERhcndpbiBidWlsZCB2ZXJzaW9uIGlkZW50aWZpY2F0aW9uIFtQZXRlcnNvbl0KCkNoYW5nZXMgaW4gMS4yLjIgKDMgT2N0b2JlciAyMDA0KQotIFVwZGF0ZSB6bGliLmggY29tbWVudHMgb24gZ3ppcCBpbi1tZW1vcnkgcHJvY2Vzc2luZwotIFNldCBhZGxlciB0byAxIGluIGluZmxhdGVSZXNldCgpIHRvIHN1cHBvcnQgSmF2YSB0ZXN0IHN1aXRlIFtXYWxsZXNdCi0gQWRkIGNvbnRyaWIvZG90emxpYiBbUmF2bl0KLSBVcGRhdGUgd2luMzIvRExMX0ZBUS50eHQgW1RydXRhXQotIFVwZGF0ZSBjb250cmliL21pbml6aXAgW1ZvbGxhbnRdCi0gTW92ZSBjb250cmliL3Zpc3VhbC1iYXNpYy50eHQgdG8gb2xkLyBbVHJ1dGFdCi0gRml4IGFzc2VtYmxlciBidWlsZHMgaW4gcHJvamVjdHMvdmlzdWFsYzYvIFtUcnV0YV0KCkNoYW5nZXMgaW4gMS4yLjEuMiAoOSBTZXB0ZW1iZXIgMjAwNCkKLSBVcGRhdGUgSU5ERVggZmlsZQotIEZpeCB0cmVlcy5jIHRvIHVwZGF0ZSBzdHJtLT5kYXRhX3R5cGUgKG5vIG9uZSBldmVyIG5vdGljZWQhKQotIEZpeCBidWcgaW4gZXJyb3IgY2FzZSBpbiBpbmZsYXRlLmMsIGluZmJhY2suYywgYW5kIGluZmJhY2s5LmMgW0Jyb3duXQotIEFkZCAidm9sYXRpbGUiIHRvIGNyYyB0YWJsZSBmbGFnIGRlY2xhcmF0aW9uIChmb3IgRFlOQU1JQ19DUkNfVEFCTEUpCi0gQWRkIGxpbWl0ZWQgbXVsdGl0YXNraW5nIHByb3RlY3Rpb24gdG8gRFlOQU1JQ19DUkNfVEFCTEUKLSBBZGQgTk9fdnNucHJpbnRmIGZvciBWTVMgaW4genV0aWwuaCBbTW96aWxsYV0KLSBEb24ndCBkZWNsYXJlIHN0cmVycm9yKCkgdW5kZXIgVk1TIFtNb3ppbGxhXQotIEFkZCBjb21tZW50IHRvIERZTkFNSUNfQ1JDX1RBQkxFIHRvIHVzZSBnZXRfY3JjX3RhYmxlKCkgdG8gaW5pdGlhbGl6ZQotIFVwZGF0ZSBjb250cmliL2FkYSBbQW5pc2lta292XQotIFVwZGF0ZSBjb250cmliL21pbml6aXAgW1ZvbGxhbnRdCi0gRml4IGNvbmZpZ3VyZSB0byBub3QgaGFyZGNvZGUgZGlyZWN0b3JpZXMgZm9yIERhcndpbiBbUGV0ZXJzb25dCi0gRml4IGd6aW8uYyB0byBub3QgcmV0dXJuIGVycm9yIG9uIGVtcHR5IGZpbGVzIFtCcm93bl0KLSBGaXggaW5kZW50YXRpb247IHVwZGF0ZSB2ZXJzaW9uIGluIGNvbnRyaWIvZGVscGhpL1pMaWIucGFzIGFuZAogIGNvbnRyaWIvcGFzY2FsL3psaWJwYXMucGFzIFtUcnV0YV0KLSBVcGRhdGUgbWthc20uYmF0IGluIGNvbnRyaWIvbWFzbXg4NiBbVHJ1dGFdCi0gVXBkYXRlIGNvbnRyaWIvdW50Z3ogW1RydXRhXQotIEFkZCBwcm9qZWN0cy9SRUFETUUucHJvamVjdHMgW1RydXRhXQotIEFkZCBwcm9qZWN0IGZvciBNUyBWaXN1YWwgQysrIDYuMCBpbiBwcm9qZWN0cy92aXN1YWxjNiBbQ2FkaWV1eCwgVHJ1dGFdCi0gVXBkYXRlIHdpbjMyL0RMTF9GQVEudHh0IFtUcnV0YV0KLSBVcGRhdGUgbGlzdCBvZiBaX1BSRUZJWCBzeW1ib2xzIGluIHpjb25mLmggW1JhbmRlcnMtUGVocnNvbiwgVHJ1dGFdCi0gUmVtb3ZlIGFuIHVubmVjZXNzYXJ5IGFzc2lnbm1lbnQgdG8gY3VyciBpbiBpbmZ0cmVlcy5jIFtUcnV0YV0KLSBBZGQgT1MvMiB0byBleGUgYnVpbGRzIGluIGNvbmZpZ3VyZSBbUG9sdG9yYWtdCi0gUmVtb3ZlIGVyciBkdW1teSBwYXJhbWV0ZXIgaW4gemxpYi5oIFtLaWVudHpsZV0KCkNoYW5nZXMgaW4gMS4yLjEuMSAoOSBKYW51YXJ5IDIwMDQpCi0gVXBkYXRlIGVtYWlsIGFkZHJlc3MgaW4gUkVBRE1FCi0gU2V2ZXJhbCBGQVEgdXBkYXRlcwotIEZpeCBhIGJpZyBmYXQgYnVnIGluIGluZnRyZWVzLmMgdGhhdCBwcmV2ZW50ZWQgZGVjb2RpbmcgdmFsaWQKICBkeW5hbWljIGJsb2NrcyB3aXRoIG9ubHkgbGl0ZXJhbHMgYW5kIG5vIGRpc3RhbmNlIGNvZGVzIC0tCiAgVGhhbmtzIHRvICJIb3QgRW11IiBmb3IgdGhlIGJ1ZyByZXBvcnQgYW5kIHNhbXBsZSBmaWxlCi0gQWRkIGEgbm90ZSB0byBwdWZmLmMgb24gbm8gZGlzdGFuY2UgY29kZXMgY2FzZS4KCkNoYW5nZXMgaW4gMS4yLjEgKDE3IE5vdmVtYmVyIDIwMDMpCi0gUmVtb3ZlIGEgdGFiIGluIGNvbnRyaWIvZ3phcHBlbmQvZ3phcHBlbmQuYwotIFVwZGF0ZSBzb21lIGludGVyZmFjZXMgaW4gY29udHJpYiBmb3IgbmV3IHpsaWIgZnVuY3Rpb25zCi0gVXBkYXRlIHpsaWIgdmVyc2lvbiBudW1iZXIgaW4gc29tZSBjb250cmliIGVudHJpZXMKLSBBZGQgV2luZG93cyBDRSBkZWZpbml0aW9uIGZvciBwdHJkaWZmX3QgaW4genV0aWwuaCBbTWFpLCBUcnV0YV0KLSBTdXBwb3J0IHNoYXJlZCBsaWJyYXJpZXMgb24gSHVyZCBhbmQgS0ZyZWVCU0QgW0Jyb3duXQotIEZpeCBlcnJvciBpbiBOT19ESVZJREUgb3B0aW9uIG9mIGFkbGVyMzIuYwoKQ2hhbmdlcyBpbiAxLjIuMC44ICg0IE5vdmVtYmVyIDIwMDMpCi0gVXBkYXRlIHZlcnNpb24gaW4gY29udHJpYi9kZWxwaGkvWkxpYi5wYXMgYW5kIGNvbnRyaWIvcGFzY2FsL3psaWJwYXMucGFzCi0gQWRkIGV4cGVyaW1lbnRhbCBOT19ESVZJREUgI2RlZmluZSBpbiBhZGxlcjMyLmMKICAgIC0gUG9zc2libHkgZmFzdGVyIG9uIHNvbWUgcHJvY2Vzc29ycyAobGV0IG1lIGtub3cgaWYgaXQgaXMpCi0gQ29ycmVjdCBaX0JMT0NLIHRvIG5vdCByZXR1cm4gb24gZmlyc3QgaW5mbGF0ZSBjYWxsIGlmIG5vIHdyYXAKLSBGaXggc3RybS0+ZGF0YV90eXBlIG9uIGluZmxhdGUoKSByZXR1cm4gdG8gY29ycmVjdGx5IGluZGljYXRlIEVPQgotIEFkZCBkZWZsYXRlUHJpbWUoKSBmdW5jdGlvbiBmb3IgYXBwZW5kaW5nIGluIHRoZSBtaWRkbGUgb2YgYSBieXRlCi0gQWRkIGNvbnRyaWIvZ3phcHBlbmQgZm9yIGFuIGV4YW1wbGUgb2YgYXBwZW5kaW5nIHRvIGEgc3RyZWFtCi0gVXBkYXRlIHdpbjMyL0RMTF9GQVEudHh0IFtUcnV0YV0KLSBEZWxldGUgVHVyYm8gQyBjb21tZW50IGluIFJFQURNRSBbVHJ1dGFdCi0gSW1wcm92ZSBzb21lIGluZGVudGF0aW9uIGluIHpjb25mLmggW1RydXRhXQotIEZpeCBpbmZpbml0ZSBsb29wIG9uIGJhZCBpbnB1dCBpbiBjb25maWd1cmUgc2NyaXB0IFtDaHVyY2hdCi0gRml4IGd6ZW9mKCkgZm9yIGNvbmNhdGVuYXRlZCBnemlwIGZpbGVzIFtKb2huc29uXQotIEFkZCBleGFtcGxlIHRvIGNvbnRyaWIvdmlzdWFsLWJhc2ljLnR4dCBbTWljaGFlbCBCLl0KLSBBZGQgLXAgdG8gbWtkaXIncyBpbiBNYWtlZmlsZS5pbiBbdmRhXQotIEZpeCBjb25maWd1cmUgdG8gcHJvcGVybHkgZGV0ZWN0IHByZXNlbmNlIG9yIGxhY2sgb2YgcHJpbnRmIGZ1bmN0aW9ucwotIEFkZCBBUzQwMCBzdXBwb3J0IFtNb25uZXJhdF0KLSBBZGQgYSBsaXR0bGUgQ3lnd2luIHN1cHBvcnQgW1dpbHNvbl0KCkNoYW5nZXMgaW4gMS4yLjAuNyAoMjEgU2VwdGVtYmVyIDIwMDMpCi0gQ29ycmVjdCBzb21lIGRlYnVnIGZvcm1hdHMgaW4gY29udHJpYi9pbmZiYWNrOQotIENhc3QgYSB0eXBlIGluIGEgZGVidWcgc3RhdGVtZW50IGluIHRyZWVzLmMKLSBDaGFuZ2Ugc2VhcmNoIGFuZCByZXBsYWNlIGRlbGltaXRlciBpbiBjb25maWd1cmUgZnJvbSAlIHRvICMgW0JlZWJlXQotIFVwZGF0ZSBjb250cmliL3VudGd6IHRvIDAuMiB3aXRoIHZhcmlvdXMgZml4ZXMgW1RydXRhXQotIEFkZCBidWlsZCBzdXBwb3J0IGZvciBBbWlnYSBbTmlrbF0KLSBSZW1vdmUgc29tZSBkaXJlY3RvcmllcyBpbiBvbGQgdGhhdCBoYXZlIGJlZW4gdXBkYXRlZCB0byAxLjIKLSBBZGQgZHlsaWIgYnVpbGRpbmcgZm9yIE1hYyBPUyBYIGluIGNvbmZpZ3VyZSBhbmQgTWFrZWZpbGUuaW4KLSBSZW1vdmUgb2xkIGRpc3RyaWJ1dGlvbiBzdHVmZiBmcm9tIE1ha2VmaWxlCi0gVXBkYXRlIFJFQURNRSB0byBwb2ludCB0byBETExfRkFRLnR4dCwgYW5kIGFkZCBjb21tZW50IG9uIE1hYyBPUyBYCi0gVXBkYXRlIGxpbmtzIGluIFJFQURNRQoKQ2hhbmdlcyBpbiAxLjIuMC42ICgxMyBTZXB0ZW1iZXIgMjAwMykKLSBNaW5vciBGQVEgdXBkYXRlcwotIFVwZGF0ZSBjb250cmliL21pbml6aXAgdG8gMS4wMCBbVm9sbGFudF0KLSBSZW1vdmUgdGVzdCBvZiBneiBmdW5jdGlvbnMgaW4gZXhhbXBsZS5jIHdoZW4gR1pfQ09NUFJFU1MgZGVmaW5lZCBbVHJ1dGFdCi0gVXBkYXRlIFBPU1RJTkMgY29tbWVudCBmb3IgNjgwNjAgW05pa2xdCi0gQWRkIGNvbnRyaWIvaW5mYmFjazkgd2l0aCBkZWZsYXRlNjQgZGVjb2RpbmcgKHVuc3VwcG9ydGVkKQotIEZvciBNVlMgZGVmaW5lIE5PX3ZzbnByaW50ZiBhbmQgdW5kZWZpbmUgRkFSIFt2YW4gQnVyaWtdCi0gQWRkIHByYWdtYSBmb3IgZmRvcGVuIG9uIE1WUyBbdmFuIEJ1cmlrXQoKQ2hhbmdlcyBpbiAxLjIuMC41ICg4IFNlcHRlbWJlciAyMDAzKQotIEFkZCBPRiB0byBpbmZsYXRlQmFja0VuZCgpIGRlY2xhcmF0aW9uIGluIHpsaWIuaAotIFJlbWVtYmVyIHN0YXJ0IHdoZW4gdXNpbmcgZ3pkb3BlbiBpbiB0aGUgbWlkZGxlIG9mIGEgZmlsZQotIFVzZSBpbnRlcm5hbCBvZmZfdCBjb3VudGVycyBpbiBneiogZnVuY3Rpb25zIHRvIHByb3Blcmx5IGhhbmRsZSBzZWVrcwotIFBlcmZvcm0gbW9yZSByaWdvcm91cyBjaGVjayBmb3IgZGlzdGFuY2UtdG9vLWZhciBpbiBpbmZmYXN0LmMKLSBBZGQgWl9CTE9DSyBmbHVzaCBvcHRpb24gdG8gcmV0dXJuIGZyb20gaW5mbGF0ZSBhdCBibG9jayBib3VuZGFyeQotIFNldCBzdHJtLT5kYXRhX3R5cGUgb24gcmV0dXJuIGZyb20gaW5mbGF0ZQogICAgLSBJbmRpY2F0ZSBiaXRzIHVudXNlZCwgaWYgYXQgYmxvY2sgYm91bmRhcnksIGFuZCBpZiBpbiBsYXN0IGJsb2NrCi0gUmVwbGFjZSBzaXplX3Qgd2l0aCBwdHJkaWZmX3QgaW4gY3JjMzIuYywgYW5kIGNoZWNrIGZvciBjb3JyZWN0IHNpemUKLSBBZGQgY29uZGl0aW9uIHNvIG9sZCBOT19ERUZMQVRFIGRlZmluZSBzdGlsbCB3b3JrcyBmb3IgY29tcGF0aWJpbGl0eQotIEZBUSB1cGRhdGUgcmVnYXJkaW5nIHRoZSBXaW5kb3dzIERMTCBbVHJ1dGFdCi0gSU5ERVggdXBkYXRlOiBhZGQgcW54IGVudHJ5LCByZW1vdmUgYWl4IGVudHJ5IFtUcnV0YV0KLSBJbnN0YWxsIHpsaWIuMyBpbnRvIG1hbmRpciBbV2lsc29uXQotIE1vdmUgY29udHJpYi96bGliX2RsbF9GQVEudHh0IHRvIHdpbjMyL0RMTF9GQVEudHh0OyB1cGRhdGUgW1RydXRhXQotIEFkYXB0IHRoZSB6bGliIGludGVyZmFjZSB0byB0aGUgbmV3IERMTCBjb252ZW50aW9uIGd1aWRlbGluZXMgW1RydXRhXQotIEludHJvZHVjZSBaTElCX1dJTkFQSSBtYWNybyB0byBhbGxvdyB0aGUgZXhwb3J0IG9mIGZ1bmN0aW9ucyB1c2luZwogIHRoZSBXSU5BUEkgY2FsbGluZyBjb252ZW50aW9uLCBmb3IgVmlzdWFsIEJhc2ljIFtWb2xsYW50LCBUcnV0YV0KLSBVcGRhdGUgbXNkb3MgYW5kIHdpbjMyIHNjcmlwdHMgYW5kIG1ha2VmaWxlcyBbVHJ1dGFdCi0gRXhwb3J0IHN5bWJvbHMgYnkgbmFtZSwgbm90IGJ5IG9yZGluYWwsIGluIHdpbjMyL3psaWIuZGVmIFtUcnV0YV0KLSBBZGQgY29udHJpYi9hZGEgW0FuaXNpbWtvdl0KLSBNb3ZlIGFzbSBmaWxlcyBmcm9tIGNvbnRyaWIvdnN0dWRpby92YzcwXzMyIHRvIGNvbnRyaWIvYXNtMzg2IFtUcnV0YV0KLSBSZW5hbWUgY29udHJpYi9hc20zODYgdG8gY29udHJpYi9tYXNteDg2IFtUcnV0YSwgVm9sbGFudF0KLSBBZGQgY29udHJpYi9tYXNtNjg2IFtUcnV0YV0KLSBGaXggb2Zmc2V0cyBpbiBjb250cmliL2luZmxhdGU4NiBhbmQgY29udHJpYi9tYXNteDg2L2luZmZhczMyLmFzbQogIFtUcnV0YSwgVm9sbGFudF0KLSBVcGRhdGUgY29udHJpYi9kZWxwaGk7IHJlbmFtZSB0byBjb250cmliL3Bhc2NhbDsgYWRkIGV4YW1wbGUgW1RydXRhXQotIFJlbW92ZSBjb250cmliL2RlbHBoaTI7IGFkZCBhIG5ldyBjb250cmliL2RlbHBoaSBbVHJ1dGFdCi0gQXZvaWQgaW5jbHVzaW9uIG9mIHRoZSBub25zdGFuZGFyZCA8bWVtb3J5Lmg+IGluIGNvbnRyaWIvaW9zdHJlYW0sCiAgYW5kIGZpeCBzb21lIG1ldGhvZCBwcm90b3R5cGVzIFtUcnV0YV0KLSBGaXggdGhlIFpDUl9TRUVEMiBjb25zdGFudCB0byBhdm9pZCB3YXJuaW5ncyBpbiBjb250cmliL21pbml6aXAKICBbVHJ1dGFdCi0gQXZvaWQgdGhlIHVzZSBvZiBiYWNrc2xhc2ggKFwpIGluIGNvbnRyaWIvbWluaXppcCBbVm9sbGFudF0KLSBGaXggZmlsZSB0aW1lIGhhbmRsaW5nIGluIGNvbnRyaWIvdW50Z3o7IHVwZGF0ZSBtYWtlZmlsZXMgW1RydXRhXQotIFVwZGF0ZSBjb250cmliL3ZzdHVkaW8vdmM3MF8zMiB0byBjb21wbHkgd2l0aCB0aGUgbmV3IERMTCBndWlkZWxpbmVzCiAgW1ZvbGxhbnRdCi0gUmVtb3ZlIGNvbnRyaWIvdnN0dWRpby92YzE1XzE2IFtWb2xsYW50XQotIFJlbmFtZSBjb250cmliL3ZzdHVkaW8vdmM3MF8zMiB0byBjb250cmliL3ZzdHVkaW8vdmM3IFtUcnV0YV0KLSBVcGRhdGUgUkVBRE1FLmNvbnRyaWIgW1RydXRhXQotIEludmVydCB0aGUgYXNzaWdubWVudCBvcmRlciBvZiBtYXRjaF9oZWFkIGFuZCBzLT5wcmV2Wy4uLl0gaW4KICBJTlNFUlRfU1RSSU5HIFtUcnV0YV0KLSBDb21wYXJlIFRPT19GQVIgd2l0aCAzMjc2NyBpbnN0ZWFkIG9mIDMyNzY4LCB0byBhdm9pZCAxNi1iaXQgd2FybmluZ3MKICBbVHJ1dGFdCi0gQ29tcGFyZSBmdW5jdGlvbiBwb2ludGVycyB3aXRoIDAsIG5vdCB3aXRoIE5VTEwgb3IgWl9OVUxMIFtUcnV0YV0KLSBGaXggcHJvdG90eXBlIG9mIHN5bmNzZWFyY2ggaW4gaW5mbGF0ZS5jIFtUcnV0YV0KLSBJbnRyb2R1Y2UgQVNNSU5GIG1hY3JvIHRvIGJlIGVuYWJsZWQgd2hlbiB1c2luZyBhbiBBU00gaW1wbGVtZW50YXRpb24KICBvZiBpbmZsYXRlX2Zhc3QgW1RydXRhXQotIENoYW5nZSBOT19ERUZMQVRFIHRvIE5PX0daQ09NUFJFU1MgW1RydXRhXQotIE1vZGlmeSB0ZXN0X2d6aW8gaW4gZXhhbXBsZS5jIHRvIHRha2UgYSBzaW5nbGUgZmlsZSBuYW1lIGFzIGEKICBwYXJhbWV0ZXIgW1RydXRhXQotIEV4aXQgdGhlIGV4YW1wbGUuYyBwcm9ncmFtIGlmIGd6b3BlbiBmYWlscyBbVHJ1dGFdCi0gQWRkIHR5cGUgY2FzdHMgYXJvdW5kIHN0cmxlbiBpbiBleGFtcGxlLmMgW1RydXRhXQotIFJlbW92ZSBjYXN0aW5nIHRvIHNpemVvZiBpbiBtaW5pZ3ppcC5jOyBnaXZlIGEgcHJvcGVyIHR5cGUKICB0byB0aGUgdmFyaWFibGUgY29tcGFyZWQgd2l0aCBTVUZGSVhfTEVOIFtUcnV0YV0KLSBVcGRhdGUgZGVmaW5pdGlvbnMgb2YgU1REQyBhbmQgU1REQzk5IGluIHpjb25mLmggW1RydXRhXQotIFN5bmNocm9uaXplIHpjb25mLmggd2l0aCB0aGUgbmV3IFdpbmRvd3MgRExMIGludGVyZmFjZSBbVHJ1dGFdCi0gVXNlIFNZUzE2QklUIGluc3RlYWQgb2YgX18zMkJJVF9fIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4KICAxNi0gYW5kIDMyLWJpdCBwbGF0Zm9ybXMgW1RydXRhXQotIFVzZSBmYXIgbWVtb3J5IGFsbG9jYXRvcnMgaW4gc21hbGwgMTYtYml0IG1lbW9yeSBtb2RlbHMgZm9yCiAgVHVyYm8gQyBbVHJ1dGFdCi0gQWRkIGluZm8gYWJvdXQgdGhlIHVzZSBvZiBBU01WLCBBU01JTkYgYW5kIFpMSUJfV0lOQVBJIGluCiAgemxpYkNvbXBpbGVGbGFncyBbVHJ1dGFdCi0gQ3lnd2luIGhhcyB2c25wcmludGYgW1dpbHNvbl0KLSBJbiBXaW5kb3dzMTYsIE9TX0NPREUgaXMgMCwgYXMgaW4gTVNET1MgW1RydXRhXQotIEluIEN5Z3dpbiwgT1NfQ09ERSBpcyAzIChVbml4KSwgbm90IDExIChXaW5kb3dzMzIpIFtXaWxzb25dCgpDaGFuZ2VzIGluIDEuMi4wLjQgKDEwIEF1Z3VzdCAyMDAzKQotIE1pbm9yIEZBUSB1cGRhdGVzCi0gQmUgbW9yZSBzdHJpY3Qgd2hlbiBjaGVja2luZyBpbmZsYXRlSW5pdDIncyB3aW5kb3dCaXRzIHBhcmFtZXRlcgotIENoYW5nZSBOT19HVU5aSVAgY29tcGlsZSBvcHRpb24gdG8gTk9fR1pJUCB0byBjb3ZlciBkZWZsYXRlIGFzIHdlbGwKLSBBZGQgZ3ppcCB3cmFwcGVyIG9wdGlvbiB0byBkZWZsYXRlSW5pdDIgdXNpbmcgd2luZG93Qml0cwotIEFkZCB1cGRhdGVkIFFOWCBydWxlIGluIGNvbmZpZ3VyZSBhbmQgcW54IGRpcmVjdG9yeSBbQm9ubmVmb3ldCi0gTWFrZSBpbmZsYXRlIGRpc3RhbmNlLXRvby1mYXIgY2hlY2tzIG1vcmUgcmlnb3JvdXMKLSBDbGVhbiB1cCBGQVIgdXNhZ2UgaW4gaW5mbGF0ZQotIEFkZCBjYXN0aW5nIHRvIHNpemVvZigpIGluIGd6aW8uYyBhbmQgbWluaWd6aXAuYwoKQ2hhbmdlcyBpbiAxLjIuMC4zICgxOSBKdWx5IDIwMDMpCi0gRml4IHNpbGx5IGVycm9yIGluIGd6dW5nZXRjKCkgaW1wbGVtZW50YXRpb24gW1ZvbGxhbnRdCi0gVXBkYXRlIGNvbnRyaWIvbWluaXppcCBhbmQgY29udHJpYi92c3R1ZGlvIFtWb2xsYW50XQotIEZpeCBwcmludGYgZm9ybWF0IGluIGV4YW1wbGUuYwotIENvcnJlY3QgY2RlY2wgc3VwcG9ydCBpbiB6Y29uZi5pbi5oIFtBbmlzaW1rb3ZdCi0gTWlub3IgRkFRIHVwZGF0ZXMKCkNoYW5nZXMgaW4gMS4yLjAuMiAoMTMgSnVseSAyMDAzKQotIEFkZCBaTElCX1ZFUk5VTSBpbiB6bGliLmggZm9yIG51bWVyaWNhbCBwcmVwcm9jZXNzb3IgY29tcGFyaXNvbnMKLSBBdHRlbXB0IHRvIGF2b2lkIHdhcm5pbmdzIGluIGNyYzMyLmMgZm9yIHBvaW50ZXItaW50IGNvbnZlcnNpb24KLSBBZGQgQUlYIHRvIGNvbmZpZ3VyZSwgcmVtb3ZlIGFpeCBkaXJlY3RvcnkgW0Jha2tlcl0KLSBBZGQgc29tZSBjYXN0cyB0byBtaW5pZ3ppcC5jCi0gSW1wcm92ZSBjaGVja2luZyBhZnRlciBpbnNlY3VyZSBzcHJpbnRmKCkgb3IgdnNwcmludGYoKSBjYWxscwotIFJlbW92ZSAjZWxpZidzIGZyb20gY3JjMzIuYwotIENoYW5nZSBsZWF2ZSBsYWJlbCB0byBpbmZfbGVhdmUgaW4gaW5mbGF0ZS5jIGFuZCBpbmZiYWNrLmMgdG8gYXZvaWQKICBsaWJyYXJ5IGNvbmZsaWN0cwotIFJlbW92ZSBpbmZsYXRlIGd6aXAgZGVjb2RpbmcgYnkgZGVmYXVsdC0tb25seSBlbmFibGUgZ3ppcCBkZWNvZGluZyBieQogIHNwZWNpYWwgcmVxdWVzdCBmb3Igc3RyaWN0ZXIgYmFja3dhcmQgY29tcGF0aWJpbGl0eQotIEFkZCB6bGliQ29tcGlsZUZsYWdzKCkgZnVuY3Rpb24gdG8gcmV0dXJuIGNvbXBpbGF0aW9uIGluZm9ybWF0aW9uCi0gTW9yZSB0eXBlY2FzdGluZyBpbiBkZWZsYXRlLmMgdG8gYXZvaWQgd2FybmluZ3MKLSBSZW1vdmUgbGVhZGluZyB1bmRlcnNjb3JlIGZyb20gX0NhcGl0YWwgI2RlZmluZXMgW1RydXRhXQotIEZpeCBjb25maWd1cmUgdG8gbGluayBzaGFyZWQgbGlicmFyeSB3aGVuIHRlc3RpbmcKLSBBZGQgc29tZSBXaW5kb3dzIENFIHRhcmdldCBhZGp1c3RtZW50cyBbTWFpXQotIFJlbW92ZSAjZGVmaW5lIFpMSUJfRExMIGluIHpjb25mLmggW1ZvbGxhbnRdCi0gQWRkIHpsaWIuMyBbUm9kZ2Vyc10KLSBVcGRhdGUgUkZDIFVSTCBpbiBkZWZsYXRlLmMgYW5kIGFsZ29yaXRobS50eHQgW01haV0KLSBBZGQgemxpYl9kbGxfRkFRLnR4dCB0byBjb250cmliIFtUcnV0YV0KLSBBZGQgVUwgdG8gc29tZSBjb25zdGFudHMgW1RydXRhXQotIFVwZGF0ZSBtaW5pemlwIGFuZCB2c3R1ZGlvIFtWb2xsYW50XQotIFJlbW92ZSB2ZXN0aWdpYWwgTkVFRF9EVU1NWV9SRVRVUk4gZnJvbSB6Y29uZi5pbi5oCi0gRXhwYW5kIHVzZSBvZiBOT19EVU1NWV9ERUNMIHRvIGF2b2lkIGFsbCBkdW1teSBzdHJ1Y3R1cmVzCi0gQWRkZWQgaW9zdHJlYW0zIHRvIGNvbnRyaWIgW1NjaHdhcmR0XQotIFJlcGxhY2UgcmV3aW5kKCkgd2l0aCBmc2VlaygpIGZvciBXaW5DRSBbVHJ1dGFdCi0gSW1wcm92ZSBzZXR0aW5nIG9mIHpsaWIgZm9ybWF0IGNvbXByZXNzaW9uIGxldmVsIGZsYWdzCiAgICAtIFJlcG9ydCAwIGZvciBodWZmbWFuIGFuZCBybGUgc3RyYXRlZ2llcyBhbmQgZm9yIGxldmVsID09IDAgb3IgMQogICAgLSBSZXBvcnQgMiBvbmx5IGZvciBsZXZlbCA9PSA2Ci0gT25seSBkZWFsIHdpdGggNjRLIGxpbWl0IHdoZW4gbmVjZXNzYXJ5IGF0IGNvbXBpbGUgdGltZSBbVHJ1dGFdCi0gQWxsb3cgVE9PX0ZBUiBjaGVjayB0byBiZSB0dXJuZWQgb2ZmIGF0IGNvbXBpbGUgdGltZSBbVHJ1dGFdCi0gQWRkIGd6Y2xlYXJlcnIoKSBmdW5jdGlvbiBbU291emFdCi0gQWRkIGd6dW5nZXRjKCkgZnVuY3Rpb24KCkNoYW5nZXMgaW4gMS4yLjAuMSAoMTcgTWFyY2ggMjAwMykKLSBBZGQgWl9STEUgc3RyYXRlZ3kgZm9yIHJ1bi1sZW5ndGggZW5jb2RpbmcgW1RydXRhXQogICAgLSBXaGVuIFpfUkxFIHJlcXVlc3RlZCwgcmVzdHJpY3QgbWF0Y2hlcyB0byBkaXN0YW5jZSBvbmUKICAgIC0gVXBkYXRlIHpsaWIuaCwgbWluaWd6aXAuYywgZ3pvcGVuKCksIGd6ZG9wZW4oKSBmb3IgWl9STEUKLSBDb3JyZWN0IEZBU1RFU1QgY29tcGlsYXRpb24gdG8gYWxsb3cgbGV2ZWwgPT0gMAotIENsZWFuIHVwIHdoYXQgZ2V0cyBjb21waWxlZCBmb3IgRkFTVEVTVAotIEluY29ycG9yYXRlIGNoYW5nZXMgdG8gemNvbmYuaW4uaCBbVm9sbGFudF0KICAgIC0gUmVmaW5lIGRldGVjdGlvbiBvZiBUdXJibyBDIG5lZWQgZm9yIGR1bW15IHJldHVybnMKICAgIC0gUmVmaW5lIFpMSUJfRExMIGNvbXBpbGF0aW9uCiAgICAtIEluY2x1ZGUgYWRkaXRpb25hbCBoZWFkZXIgZmlsZSBvbiBWTVMgZm9yIG9mZl90IHR5cGVkZWYKLSBUcnkgdG8gdXNlIF92c25wcmludGYgd2hlcmUgaXQgc3VwcGxhbnRzIHZzcHJpbnRmIFtWb2xsYW50XQotIEFkZCBzb21lIGNhc3RzIGluIGluZmZhc3QuYwotIEVuY2hhbmNlIGNvbW1lbnRzIGluIHpsaWIuaCBvbiB3aGF0IGhhcHBlbnMgaWYgZ3pwcmludGYoKSB0cmllcyB0bwogIHdyaXRlIG1vcmUgdGhhbiA0MDk1IGJ5dGVzIGJlZm9yZSBjb21wcmVzc2lvbgotIFJlbW92ZSB1bnVzZWQgc3RhdGUgZnJvbSBpbmZsYXRlQmFja0VuZCgpCi0gUmVtb3ZlIGV4aXQoMCkgZnJvbSBtaW5pZ3ppcC5jLCBleGFtcGxlLmMKLSBHZXQgcmlkIG9mIGFsbCB0aG9zZSBkYXJuIHRhYnMKLSBBZGQgImNoZWNrIiB0YXJnZXQgdG8gTWFrZWZpbGUuaW4gdGhhdCBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzICJ0ZXN0IgotIEFkZCAibW9zdGx5Y2xlYW4iIGFuZCAibWFpbnRhaW5lci1jbGVhbiIgdGFyZ2V0cyB0byBNYWtlZmlsZS5pbgotIFVwZGF0ZSBjb250cmliL2luZmxhdGU4NiBbQW5kZXJzb25dCi0gVXBkYXRlIGNvbnRyaWIvdGVzdHpsaWIsIGNvbnRyaWIvdnN0dWRpbywgY29udHJpYi9taW5pemlwIFtWb2xsYW50XQotIEFkZCBtc2RvcyBhbmQgd2luMzIgZGlyZWN0b3JpZXMgd2l0aCBtYWtlZmlsZXMgW1RydXRhXQotIE1vcmUgYWRkaXRpb25zIGFuZCBpbXByb3ZlbWVudHMgdG8gdGhlIEZBUQoKQ2hhbmdlcyBpbiAxLjIuMCAoOSBNYXJjaCAyMDAzKQotIE5ldyBhbmQgaW1wcm92ZWQgaW5mbGF0ZSBjb2RlCiAgICAtIEFib3V0IDIwJSBmYXN0ZXIKICAgIC0gRG9lcyBub3QgYWxsb2NhdGUgMzJLIHdpbmRvdyB1bmxlc3MgYW5kIHVudGlsIG5lZWRlZAogICAgLSBBdXRvbWF0aWNhbGx5IGRldGVjdHMgYW5kIGRlY29tcHJlc3NlcyBnemlwIHN0cmVhbXMKICAgIC0gUmF3IGluZmxhdGUgbm8gbG9uZ2VyIG5lZWRzIGFuIGV4dHJhIGR1bW15IGJ5dGUgYXQgZW5kCiAgICAtIEFkZGVkIGluZmxhdGVCYWNrIGZ1bmN0aW9ucyB1c2luZyBhIGNhbGxiYWNrIGludGVyZmFjZS0tZXZlbiBmYXN0ZXIKICAgICAgdGhhbiBpbmZsYXRlLCB1c2VmdWwgZm9yIGZpbGUgdXRpbGl0aWVzIChnemlwLCB6aXApCiAgICAtIEFkZGVkIGluZmxhdGVDb3B5KCkgZnVuY3Rpb24gdG8gcmVjb3JkIHN0YXRlIGZvciByYW5kb20gYWNjZXNzIG9uCiAgICAgIGV4dGVybmFsbHkgZ2VuZXJhdGVkIGRlZmxhdGUgc3RyZWFtcyAoZS5nLiBpbiBnemlwIGZpbGVzKQogICAgLSBNb3JlIHJlYWRhYmxlIGNvZGUgKEkgaG9wZSkKLSBOZXcgYW5kIGltcHJvdmVkIGNyYzMyKCkKICAgIC0gQWJvdXQgNTAlIGZhc3RlciwgdGhhbmtzIHRvIHN1Z2dlc3Rpb25zIGZyb20gUm9kbmV5IEJyb3duCi0gQWRkIGRlZmxhdGVCb3VuZCgpIGFuZCBjb21wcmVzc0JvdW5kKCkgZnVuY3Rpb25zCi0gRml4IG1lbW9yeSBsZWFrIGluIGRlZmxhdGVJbml0MigpCi0gUGVybWl0IHNldHRpbmcgZGljdGlvbmFyeSBmb3IgcmF3IGRlZmxhdGUgKGZvciBwYXJhbGxlbCBkZWZsYXRlKQotIEZpeCBjb25zdCBkZWNsYXJhdGlvbiBmb3IgZ3p3cml0ZSgpCi0gQ2hlY2sgZm9yIHNvbWUgbWFsbG9jKCkgZmFpbHVyZXMgaW4gZ3ppby5jCi0gRml4IGJ1ZyBpbiBnem9wZW4oKSBvbiBzaW5nbGUtYnl0ZSBmaWxlIDB4MWYKLSBGaXggYnVnIGluIGd6cmVhZCgpIG9uIGNvbmNhdGVuYXRlZCBmaWxlIHdpdGggMHgxZiBhdCBlbmQgb2YgYnVmZmVyCiAgYW5kIG5leHQgYnVmZmVyIGRvZXNuJ3Qgc3RhcnQgd2l0aCAweDhiCi0gRml4IHVuY29tcHJlc3MoKSB0byByZXR1cm4gWl9EQVRBX0VSUk9SIG9uIHRydW5jYXRlZCBpbnB1dAotIEZyZWUgbWVtb3J5IGF0IGVuZCBvZiBleGFtcGxlLmMKLSBSZW1vdmUgTUFYICNkZWZpbmUgaW4gdHJlZXMuYyAoY29uZmxpY3RlZCB3aXRoIHNvbWUgbGlicmFyaWVzKQotIEZpeCBzdGF0aWMgY29uc3QncyBpbiBkZWZsYXRlLmMsIGd6aW8uYywgYW5kIHp1dGlsLltjaF0KLSBEZWNsYXJlIG1hbGxvYygpIGFuZCBmcmVlKCkgaW4gZ3ppby5jIGlmIFNUREMgbm90IGRlZmluZWQKLSBVc2UgbWFsbG9jKCkgaW5zdGVhZCBvZiBjYWxsb2MoKSBpbiB6dXRpbC5jIGlmIGludCBiaWcgZW5vdWdoCi0gRGVmaW5lIFNUREMgZm9yIEFJWAotIEFkZCBhaXgvIHdpdGggYXBwcm9hY2ggZm9yIGNvbXBpbGluZyBzaGFyZWQgbGlicmFyeSBvbiBBSVgKLSBBZGQgSFAtVVggc3VwcG9ydCBmb3Igc2hhcmVkIGxpYnJhcmllcyBpbiBjb25maWd1cmUKLSBBZGQgT3BlblVOSVggc3VwcG9ydCBmb3Igc2hhcmVkIGxpYnJhcmllcyBpbiBjb25maWd1cmUKLSBVc2UgJGNjIGluc3RlYWQgb2YgZ2NjIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJ5Ci0gTWFrZSBwcmVmaXggZGlyZWN0b3J5IGlmIG5lZWRlZCB3aGVuIGluc3RhbGxpbmcKLSBDb3JyZWN0IE1hY2ludG9zaCBhdm9pZGFuY2Ugb2YgdHlwZWRlZiBCeXRlIGluIHpjb25mLmgKLSBDb3JyZWN0IFR1cmJvIEMgbWVtb3J5IGFsbG9jYXRpb24gd2hlbiB1bmRlciBMaW51eAotIFVzZSBsaWJ6LmEgaW5zdGVhZCBvZiAtbHogaW4gTWFrZWZpbGUgKGFzc3VyZSB1c2Ugb2YgY29tcGlsZWQgbGlicmFyeSkKLSBVcGRhdGUgY29uZmlndXJlIHRvIGNoZWNrIGZvciBzbnByaW50ZiBvciB2c25wcmludGYgZnVuY3Rpb25zIGFuZCB0aGVpcgogIHJldHVybiB2YWx1ZSwgd2FybiBkdXJpbmcgbWFrZSBpZiB1c2luZyBhbiBpbnNlY3VyZSBmdW5jdGlvbgotIEZpeCBjb25maWd1cmUgcHJvYmxlbSB3aXRoIGNvbXBpbGUtdGltZSBrbm93bGVkZ2Ugb2YgSEFWRV9VTklTVERfSCB0aGF0CiAgaXMgbG9zdCB3aGVuIGxpYnJhcnkgaXMgdXNlZC0tcmVzb2x1dGlvbiBpcyB0byBidWlsZCBuZXcgemNvbmYuaAotIERvY3VtZW50YXRpb24gaW1wcm92ZW1lbnRzIChpbiB6bGliLmgpOgogICAgLSBEb2N1bWVudCByYXcgZGVmbGF0ZSBhbmQgaW5mbGF0ZQogICAgLSBVcGRhdGUgUkZDcyBVUkwKICAgIC0gUG9pbnQgb3V0IHRoYXQgemxpYiBhbmQgZ3ppcCBmb3JtYXRzIGFyZSBkaWZmZXJlbnQKICAgIC0gTm90ZSB0aGF0IFpfQlVGX0VSUk9SIGlzIG5vdCBmYXRhbAogICAgLSBEb2N1bWVudCBzdHJpbmcgbGltaXQgZm9yIGd6cHJpbnRmKCkgYW5kIHBvc3NpYmxlIGJ1ZmZlciBvdmVyZmxvdwogICAgLSBOb3RlIHJlcXVpcmVtZW50IG9uIGF2YWlsX291dCB3aGVuIGZsdXNoaW5nCiAgICAtIE5vdGUgcGVybWl0dGVkIHZhbHVlcyBvZiBmbHVzaCBwYXJhbWV0ZXIgb2YgaW5mbGF0ZSgpCi0gQWRkIHNvbWUgRkFRcyAoYW5kIGV2ZW4gYW5zd2VycykgdG8gdGhlIEZBUQotIEFkZCBjb250cmliL2luZmxhdGU4Ni8gZm9yIHg4NiBmYXN0ZXIgaW5mbGF0ZQotIEFkZCBjb250cmliL2JsYXN0LyBmb3IgUEtXYXJlIERhdGEgQ29tcHJlc3Npb24gTGlicmFyeSBkZWNvbXByZXNzaW9uCi0gQWRkIGNvbnRyaWIvcHVmZi8gc2ltcGxlIGluZmxhdGUgZm9yIGRlZmxhdGUgZm9ybWF0IGRlc2NyaXB0aW9uCgpDaGFuZ2VzIGluIDEuMS40ICgxMSBNYXJjaCAyMDAyKQotIFpGUkVFIHdhcyByZXBlYXRlZCBvbiBzYW1lIGFsbG9jYXRpb24gb24gc29tZSBlcnJvciBjb25kaXRpb25zLgogIFRoaXMgY3JlYXRlcyBhIHNlY3VyaXR5IHByb2JsZW0gZGVzY3JpYmVkIGluCiAgaHR0cDovL3d3dy56bGliLm9yZy9hZHZpc29yeS0yMDAyLTAzLTExLnR4dAotIFJldHVybmVkIGluY29ycmVjdCBlcnJvciAoWl9NRU1fRVJST1IpIG9uIHNvbWUgaW52YWxpZCBkYXRhCi0gQXZvaWQgYWNjZXNzZXMgYmVmb3JlIHdpbmRvdyBmb3IgaW52YWxpZCBkaXN0YW5jZXMgd2l0aCBpbmZsYXRlIHdpbmRvdwogIGxlc3MgdGhhbiAzMksuCi0gZm9yY2Ugd2luZG93Qml0cyA+IDggdG8gYXZvaWQgYSBidWcgaW4gdGhlIGVuY29kZXIgZm9yIGEgd2luZG93IHNpemUKICBvZiAyNTYgYnl0ZXMuIChBIGNvbXBsZXRlIGZpeCB3aWxsIGJlIGF2YWlsYWJsZSBpbiAxLjEuNSkuCgpDaGFuZ2VzIGluIDEuMS4zICg5IEp1bHkgMTk5OCkKLSBmaXggImFuIGluZmxhdGUgaW5wdXQgYnVmZmVyIGJ1ZyB0aGF0IHNob3dzIHVwIG9uIHJhcmUgYnV0IHBlcnNpc3RlbnQKICBvY2Nhc2lvbnMiIChNYXJrKQotIGZpeCBnenJlYWQgYW5kIGd6dGVsbCBmb3IgY29uY2F0ZW5hdGVkIC5neiBmaWxlcyAoRGlkaWVyIExlIEJvdGxhbikKLSBmaXggZ3pzZWVrKC4uLiwgU0VFS19TRVQpIGluIHdyaXRlIG1vZGUKLSBmaXggY3JjIGNoZWNrIGFmdGVyIGEgZ3plZWsgKEZyYW5rIEZhdWJlcnQpCi0gZml4IG1pbml1bnppcCB3aGVuIHRoZSBsYXN0IGVudHJ5IGluIGEgemlwIGZpbGUgaXMgaXRzZWxmIGEgemlwIGZpbGUKICAoSiBMaWxsZ2UpCi0gYWRkIGNvbnRyaWIvYXNtNTg2IGFuZCBjb250cmliL2FzbTY4NiAoQnJpYW4gUmFpdGVyKQogIFNlZSBodHRwOi8vd3d3Lm11cHBldGxhYnMuY29tL35icmVhZGJveC9zb2Z0d2FyZS9hc3NlbWJseS5odG1sCi0gYWRkIHN1cHBvcnQgZm9yIERlbHBoaSAzIGluIGNvbnRyaWIvZGVscGhpIChCb2IgRGVsbGFjYSkKLSBhZGQgc3VwcG9ydCBmb3IgQysrQnVpbGRlciAzIGFuZCBEZWxwaGkgMyBpbiBjb250cmliL2RlbHBoaTIgKERhdmlkZSBNb3JldHRpKQotIGRvIG5vdCBleGl0IHByZW1hdHVyZWx5IGluIHVudGd6IGlmIDAgYXQgc3RhcnQgb2YgYmxvY2sgKE1hZ251cyBIb2xtZ3JlbikKLSB1c2UgbWFjcm8gRVhURVJOIGluc3RlYWQgb2YgZXh0ZXJuIHRvIHN1cHBvcnQgRExMIGZvciBCZU9TIChTYW5kZXIgU3Rva3MpCi0gYWRkZWQgYSBGQVEgZmlsZQoKLSBTdXBwb3J0IGd6ZG9wZW4gb24gTWFjIHdpdGggTWV0cm93ZXJrcyAoSmFzb24gTGluaGFydCkKLSBEbyBub3QgcmVkZWZpbmUgQnl0ZSBvbiBNYWMgKEJyYWQgUGV0dGl0ICYgSmFzb24gTGluaGFydCkKLSBkZWZpbmUgU0VFS19FTkQgdG9vIGlmIFNFRUtfU0VUIGlzIG5vdCBkZWZpbmVkIChBbGJlcnQgQ2hpbi1BLVlvdW5nKQotIGF2b2lkIHNvbWUgd2FybmluZ3Mgd2l0aCBCb3JsYW5kIEMgKFRvbSBUYW5uZXIpCi0gZml4IGEgcHJvYmxlbSBpbiBjb250cmliL21pbml6aXAvemlwLmMgZm9yIDE2LWJpdCBNU0RPUyAoR2lsbGVzIFZvbGxhbnQpCi0gZW11bGF0ZSB1dGltZSgpIGZvciBXSU4zMiBpbiBjb250cmliL3VudGd6ICAoR2lsbGVzIFZvbGxhbnQpCi0gYWxsb3cgc2V2ZXJhbCBhcmd1bWVudHMgdG8gY29uZmlndXJlIChUaW0gTW9vbmV5LCBGcm9kbyBMb29pamFhcmQpCi0gdXNlIGxpYmRpciBhbmQgaW5jbHVkZWRpciBpbiBNYWtlZmlsZS5pbiAoVGltIE1vb25leSkKLSBzdXBwb3J0IHNoYXJlZCBsaWJyYXJpZXMgb24gT1NGMSBWNCAoVGltIE1vb25leSkKLSByZW1vdmUgc29fbG9jYXRpb25zIGluICJtYWtlIGNsZWFuIiAgKFRpbSBNb29uZXkpCi0gZml4IG1ha2V0cmVlLmMgY29tcGlsYXRpb24gZXJyb3IgKEdsZW5uLCBNYXJrKQotIFB5dGhvbiBpbnRlcmZhY2UgdG8gemxpYiBub3cgaW4gUHl0aG9uIDEuNSAoSmVyZW15IEh5bHRvbikKLSBuZXcgTWFrZWZpbGUucmlzY29zIChSaWNoIFdhbGtlcikKLSBpbml0aWFsaXplIHN0YXRpYyBkZXNjcmlwdG9ycyBpbiB0cmVlcy5jIGZvciBlbWJlZGRlZCB0YXJnZXRzIChOaWNrIFNtaXRoKQotIHVzZSAiZm9vLWd6IiBpbiBleGFtcGxlLmMgZm9yIFJJU0NPUyBhbmQgVk1TIChOaWNrIFNtaXRoKQotIGFkZCB0aGUgT1MvMiBmaWxlcyBpbiBNYWtlZmlsZS5pbiB0b28gKEFuZHJldyBaYWJvbG90bnkpCi0gZml4IGZkb3BlbiBhbmQgaGFsbG9jIG1hY3JvcyBmb3IgTWljcm9zb2Z0IEMgNi4wIChUb20gTGFuZSkKLSBmaXggbWFrZXRyZWUuYyB0byBhbGxvdyBjbGVhbiBjb21waWxhdGlvbiBvZiBpbmZmaXhlZC5oIChNYXJrKQotIGZpeCBwYXJhbWV0ZXIgY2hlY2sgaW4gZGVmbGF0ZUNvcHkgKEd1bnRoZXIgTmlrbCkKLSBjbGVhbnVwIHRyZWVzLmMsIHVzZSBjb21wcmVzc2VkX2xlbiBvbmx5IGluIGRlYnVnIG1vZGUgKENocmlzdGlhbiBTcGllbGVyKQotIE1hbnkgcG9ydGFiaWxpdHkgcGF0Y2hlcyBieSBDaHJpc3RpYW4gU3BpZWxlcjoKICAuIHp1dGlsLmMsIHp1dGlsLmg6IGFkZGVkICJjb25zdCIgZm9yIHptZW0qCiAgLiBNYWtlX3Ztcy5jb206IGZpeGVkIHNvbWUgdHlwb3MKICAuIE1ha2Vfdm1zLmNvbTogbXNkb3MvTWFrZWZpbGUuKjogcmVtb3ZlZCB6dXRpbC5oIGZyb20gc29tZSBkZXBlbmRlbmN5IGxpc3RzCiAgLiBtc2Rvcy9NYWtlZmlsZS5tc2M6IHJlbW92ZSAiZGVmYXVsdCBydGwgbGluayBsaWJyYXJ5IiBpbmZvIGZyb20gb2JqIGZpbGVzCiAgLiBtc2Rvcy9NYWtlZmlsZS4qOiB1c2UgbW9kZWwtZGVwZW5kZW50IG5hbWUgZm9yIHRoZSBidWlsdCB6bGliIGxpYnJhcnkKICAuIG1zZG9zL01ha2VmaWxlLmVteCwgbnQvTWFrZWZpbGUuZW14LCBudC9NYWtlZmlsZS5nY2M6CiAgICAgbmV3IG1ha2VmaWxlcywgZm9yIGVteCAoRE9TL09TMiksIGVteCZyc3hudCBhbmQgbWluZ3czMiAoV2luZG93cyA5eCAvIE5UKQotIHVzZSBkZWZpbmUgaW5zdGVhZCBvZiB0eXBlZGVmIGZvciBCeXRlZiBhbHNvIGZvciBNU0Mgc21hbGwvbWVkaXVtIChUb20gTGFuZSkKLSByZXBsYWNlIF9fZmFyIHdpdGggX2ZhciBmb3IgYmV0dGVyIHBvcnRhYmlsaXR5IChDaHJpc3RpYW4gU3BpZWxlciwgVG9tIExhbmUpCi0gZml4IHRlc3QgZm9yIGVycm5vLmggaW4gY29uZmlndXJlIChUaW0gTmV3c2hhbSkKCkNoYW5nZXMgaW4gMS4xLjIgKDE5IE1hcmNoIDk4KQotIGFkZGVkIGNvbnRyaWIvbWluemlwLCBtaW5pIHppcCBhbmQgdW56aXAgYmFzZWQgb24gemxpYiAoR2lsbGVzIFZvbGxhbnQpCiAgU2VlIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvdW56aXAuaHRtbAotIHByZWluaXRpYWxpemUgdGhlIGluZmxhdGUgdGFibGVzIGZvciBmaXhlZCBjb2RlcywgdG8gbWFrZSB0aGUgY29kZQogIGNvbXBsZXRlbHkgdGhyZWFkIHNhZmUgKE1hcmspCi0gc29tZSBzaW1wbGlmaWNhdGlvbnMgYW5kIHNsaWdodCBzcGVlZC11cCB0byB0aGUgaW5mbGF0ZSBjb2RlIChNYXJrKQotIGZpeCBnemVvZiBvbiBub24tY29tcHJlc3NlZCBmaWxlcyAoQWxsYW4gU2NocnVtKQotIGFkZCAtc3RkMSBvcHRpb24gaW4gY29uZmlndXJlIGZvciBPU0YxIHRvIGZpeCBnenByaW50ZiAoTWFydGluIE1va3JlanMpCi0gdXNlIGRlZmF1bHQgdmFsdWUgb2YgNEsgZm9yIFpfQlVGU0laRSBmb3IgMTYtYml0IE1TRE9TIChUaW0gV2VnbmVyICsgR2xlbm4pCi0gYWRkZWQgb3MyL01ha2VmaWxlLmRlZiBhbmQgb3MyL3psaWIuZGVmIChBbmRyZXcgWmFib2xvdG55KQotIGFkZCBzaGFyZWQgbGliIHN1cHBvcnQgZm9yIFVOSVhfU1Y0LjJNUCAoTUFUU1VVUkEgVGFrYW5vcmkpCi0gZG8gbm90IHdyYXAgZXh0ZXJuICJDIiBhcm91bmQgc3lzdGVtIGluY2x1ZGVzIChUb20gTGFuZSkKLSBtZW50aW9uIHpsaWIgYmluZGluZyBmb3IgVENMIGluIFJFQURNRSAoQW5kcmVhcyBLdXByaWVzKQotIGFkZGVkIGFtaWdhL01ha2VmaWxlLnB1cCBmb3IgQW1pZ2EgcG93ZXJVUCBTQVMvQyBQUEMgKEFuZHJlYXMgS2xlaW5lcnQpCi0gYWxsb3cgIm1ha2UgaW5zdGFsbCBwcmVmaXg9Li4uIiBldmVuIGFmdGVyIGNvbmZpZ3VyZSAoR2xlbm4gUmFuZGVycy1QZWhyc29uKQotIGFsbG93ICJjb25maWd1cmUgLS1wcmVmaXggJEhPTUUiIChUaW0gTW9vbmV5KQotIHJlbW92ZSB3YXJuaW5ncyBpbiBleGFtcGxlLmMgYW5kIGd6aW8uYyAoR2xlbm4gUmFuZGVycy1QZWhyc29uKQotIG1vdmUgTWFrZWZpbGUuc2FzIHRvIGFtaWdhL01ha2VmaWxlLnNhcwoKQ2hhbmdlcyBpbiAxLjEuMSAoMjcgRmViIDk4KQotIGZpeCBtYWNyb3MgX3RyX3RhbGx5XyogaW4gZGVmbGF0ZS5oIGZvciBkZWJ1ZyBtb2RlICAoR2xlbm4gUmFuZGVycy1QZWhyc29uKQotIHJlbW92ZSBibG9jayB0cnVuY2F0aW9uIGhldXJpc3RpYyB3aGljaCBoYWQgdmVyeSBtYXJnaW5hbCBlZmZlY3QgZm9yIHpsaWIKICAoc21hbGxlciBsaXRfYnVmc2l6ZSB0aGFuIGluIGd6aXAgMS4yLjQpIGFuZCBkZWdyYWRlZCBhIGxpdHRsZSB0aGUKICBjb21wcmVzc2lvbiByYXRpbyBvbiBzb21lIGZpbGVzLiBUaGlzIGFsc28gYWxsb3dzIGlubGluaW5nIF90cl90YWxseSBmb3IKICBtYXRjaGVzIGluIGRlZmxhdGVfc2xvdy4KLSBhZGRlZCBtc2Rvcy9NYWtlZmlsZS53MzIgZm9yIFdJTjMyIE1pY3Jvc29mdCBWaXN1YWwgQysrIChCb2IgRnJhemllcikKCkNoYW5nZXMgaW4gMS4xLjAgKDI0IEZlYiA5OCkKLSBkbyBub3QgcmV0dXJuIFNUUkVBTV9FTkQgcHJlbWF0dXJlbHkgaW4gaW5mbGF0ZSAoSm9obiBCb3dsZXIpCi0gcmV2ZXJ0IHRvIHRoZSB6bGliIDEuMC44IGluZmxhdGUgdG8gYXZvaWQgdGhlIGdjYyAyLjguMCBidWcgKEplcmVteSBCdWhsZXIpCi0gY29tcGlsZSB3aXRoIC1ERkFTVEVTVCB0byBnZXQgY29tcHJlc3Npb24gY29kZSBvcHRpbWl6ZWQgZm9yIHNwZWVkIG9ubHkKLSBpbiBtaW5pZ3ppcCwgdHJ5IG1tYXAnaW5nIHRoZSBpbnB1dCBmaWxlIGZpcnN0IChNaWd1ZWwgQWxicmVjaHQpCi0gaW5jcmVhc2Ugc2l6ZSBvZiBJL08gYnVmZmVycyBpbiBtaW5pZ3ppcC5jIGFuZCBnemlvLmMgKG5vdCBhIGJpZyBnYWluCiAgb24gU3VuIGJ1dCBzaWduaWZpY2FudCBvbiBIUCkKCi0gYWRkIGEgcG9pbnRlciB0byBleHBlcmltZW50YWwgdW56aXAgbGlicmFyeSBpbiBSRUFETUUgKEdpbGxlcyBWb2xsYW50KQotIGluaXRpYWxpemUgdmFyaWFibGUgZ2NjIGluIGNvbmZpZ3VyZSAoQ2hyaXMgSGVyYm9ydGgpCgpDaGFuZ2VzIGluIDEuMC45ICgxNyBGZWIgMTk5OCkKLSBhZGRlZCBnenB1dHMgYW5kIGd6Z2V0cyBmdW5jdGlvbnMKLSBkbyBub3QgY2xlYXIgZW9mIGZsYWcgaW4gZ3pzZWVrIChNYXJrIERpZWtoYW5zKQotIGZpeCBnenNlZWsgZm9yIGZpbGVzIGluIHRyYW5zcGFyZW50IG1vZGUgKE1hcmsgRGlla2hhbnMpCi0gZG8gbm90IGFzc3VtZSB0aGF0IHZzcHJpbnRmIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIChKZW5zIEtyaW5rZSkKLSByZXBsYWNlIEVYUE9SVCB3aXRoIFpFWFBPUlQgdG8gYXZvaWQgY29uZmxpY3Qgd2l0aCBvdGhlciBwcm9ncmFtcwotIGFkZGVkIGNvbXByZXNzMiBpbiB6Y29uZi5oLCB6bGliLmRlZiwgemxpYi5kbnQKLSBuZXcgYXNtIGNvZGUgZnJvbSBHaWxsZXMgVm9sbGFudCBpbiBjb250cmliL2FzbTM4NgotIHNpbXBsaWZ5IHRoZSBpbmZsYXRlIGNvZGUgKE1hcmspOgogLiBSZXBsYWNlIFpBTExPQydzIGluIGh1ZnRfYnVpbGQoKSB3aXRoIHNpbmdsZSBaQUxMT0MgaW4gaW5mbGF0ZV9ibG9ja3NfbmV3KCkKIC4gWkFMTE9DIHRoZSBsZW5ndGggbGlzdCBpbiBpbmZsYXRlX3RyZWVzX2ZpeGVkKCkgaW5zdGVhZCBvZiB1c2luZyBzdGFjawogLiBaQUxMT0MgdGhlIHZhbHVlIGFyZWEgZm9yIGh1ZnRfYnVpbGQoKSBpbnN0ZWFkIG9mIHVzaW5nIHN0YWNrCiAuIFNpbXBsaWZ5IFpfRklOSVNIIGNoZWNrIGluIGluZmxhdGUoKQoKLSBBdm9pZCBnY2MgMi44LjAgY29tcGFyaXNvbiBidWcgYSBsaXR0bGUgZGlmZmVyZW50bHkgdGhhbiB6bGliIDEuMC44Ci0gaW4gaW5mdHJlZXMuYywgYXZvaWQgY2MgLU8gYnVnIG9uIEhQIChGYXJzaGlkIEVsYWhpKQotIGluIHpjb25mLmggbW92ZSB0aGUgWkxJQl9ETEwgc3R1ZmYgZWFybGllciB0byBhdm9pZCBwcm9ibGVtcyB3aXRoCiAgdGhlIGRlY2xhcmF0aW9uIG9mIEZBUiAoR2lsbGVzIFZPbGxhbnQpCi0gaW5zdGFsbCBsaWJ6LnNvKiB3aXRoIG1vZGUgNzU1IChleGVjdXRhYmxlKSBpbnN0ZWFkIG9mIDY0NCAoTWFyYyBMZWhtYW5uKQotIHJlYWRfYnVmIGJ1ZiBwYXJhbWV0ZXIgb2YgdHlwZSBCeXRlZiogaW5zdGVhZCBvZiBjaGFyZioKLSB6bWVtY3B5IHBhcmFtZXRlcnMgYXJlIG9mIHR5cGUgQnl0ZWYqLCBub3QgY2hhcmYqIChKb3NlcGggU3Ryb3V0KQotIGRvIG5vdCByZWRlY2xhcmUgdW5saW5rIGluIG1pbmlnemlwLmMgZm9yIFdJTjMyIChKb2huIEJvd2xlcikKLSBmaXggY2hlY2sgZm9yIHByZXNlbmNlIG9mIGRpcmVjdG9yaWVzIGluICJtYWtlIGluc3RhbGwiIChJYW4gV2lsbGlzKQoKQ2hhbmdlcyBpbiAxLjAuOCAoMjcgSmFuIDE5OTgpCi0gZml4ZWQgb2Zmc2V0cyBpbiBjb250cmliL2FzbTM4Ni9ndm1hdDMyLmFzbSAoR2lsbGVzIFZvbGxhbnQpCi0gZml4IGd6Z2V0YyBhbmQgZ3pwdXRjIGZvciBiaWcgZW5kaWFuIHN5c3RlbXMgKE1hcmt1cyBPYmVyaHVtZXIpCi0gYWRkZWQgY29tcHJlc3MyKCkgdG8gYWxsb3cgc2V0dGluZyB0aGUgY29tcHJlc3Npb24gbGV2ZWwKLSBpbmNsdWRlIHN5cy90eXBlcy5oIHRvIGdldCBvZmZfdCBvbiBzb21lIHN5c3RlbXMgKE1hcmMgTGVobWFubiAmIFFpbmdMb25nKQotIHVzZSBjb25zdGFudCBhcnJheXMgZm9yIHRoZSBzdGF0aWMgdHJlZXMgaW4gdHJlZXMuYyBpbnN0ZWFkIG9mIGNvbXB1dGluZwogIHRoZW0gYXQgcnVuIHRpbWUgKHRoYW5rcyB0byBLZW4gUmFlYnVybiBmb3IgdGhpcyBzdWdnZXN0aW9uKS4gVG8gY3JlYXRlCiAgdHJlZXMuaCwgY29tcGlsZSB3aXRoIEdFTl9UUkVFU19IIGFuZCBydW4gIm1ha2UgdGVzdCIuCi0gY2hlY2sgcmV0dXJuIGNvZGUgb2YgZXhhbXBsZSBpbiAibWFrZSB0ZXN0IiBhbmQgZGlzcGxheSByZXN1bHQKLSBwYXNzIG1pbmlnemlwIGNvbW1hbmQgbGluZSBvcHRpb25zIHRvIGZpbGVfY29tcHJlc3MKLSBzaW1wbGlmeWluZyBjb2RlIG9mIGluZmxhdGVTeW5jIHRvIGF2b2lkIGdjYyAyLjggYnVnCgotIHN1cHBvcnQgQ0M9ImdjYyAtV2FsbCIgaW4gY29uZmlndXJlIC1zIChRaW5nTG9uZykKLSBhdm9pZCBhIGZsdXNoIGNhdXNlZCBieSBmdGVsbCBpbiBnem9wZW4gZm9yIHdyaXRlIG1vZGUgKEtlbiBSYWVidXJuKQotIGZpeCB0ZXN0IGZvciBzaGFyZWQgbGlicmFyeSBzdXBwb3J0IHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzCi0gemxpYi5saWIgLT4gemxpYi5kbGwgaW4gbXNkb3MvemxpYi5yYyAoR2lsbGVzIFZvbGxhbnQpCi0gY2hlY2sgZm9yIFRBUkdFVF9PU19NQUMgaW4gYWRkaXRpb24gdG8gTUFDT1MgKEJyYWQgUGV0dGl0KQotIGRvIG5vdCB1c2UgZmRvcGVuIGZvciBNZXRyb3dlcmtzIG9uIE1hYyAoQnJhZCBQZXR0aXQpKQotIGFkZCBjaGVja3MgZm9yIGd6cHV0YyBhbmQgZ3pwdXRjIGluIGV4YW1wbGUuYwotIGF2b2lkIHdhcm5pbmdzIGluIGd6aW8uYyBhbmQgZGVmbGF0ZS5jIChBbmRyZWFzIEtsZWluZXJ0KQotIHVzZSBjb25zdCBmb3IgdGhlIENSQyB0YWJsZSAoS2VuIFJhZWJ1cm4pCi0gZml4ZWQgIm1ha2UgdW5pbnN0YWxsIiBmb3Igc2hhcmVkIGxpYnJhcmllcwotIHVzZSBUcmFjZXYgaW5zdGVhZCBvZiBUcmFjZSBpbiBpbmZibG9jay5jCi0gaW4gZXhhbXBsZS5jIHVzZSBjb3JyZWN0IGNvbXByZXNzZWQgbGVuZ3RoIGZvciB0ZXN0X3N5bmMKLSBzdXBwcmVzcyArdm5vY29tcGF0d2FybmluZ3MgaW4gY29uZmlndXJlIGZvciBIUFVYIChub3QgYWx3YXlzIHN1cHBvcnRlZCkKCkNoYW5nZXMgaW4gMS4wLjcgKDIwIEphbiAxOTk4KQotIGZpeCBnenNlZWsgd2hpY2ggd2FzIGJyb2tlbiBpbiB3cml0ZSBtb2RlCi0gcmV0dXJuIGVycm9yIGZvciBnenNlZWsgdG8gbmVnYXRpdmUgYWJzb2x1dGUgcG9zaXRpb24KLSBmaXggY29uZmlndXJlIGZvciBMaW51eCAoQ2h1bi1DaHVuZyBDaGVuKQotIGluY3JlYXNlIHN0YWNrIHNwYWNlIGZvciBNU0MgKFRpbSBXZWduZXIpCi0gZ2V0X2NyY190YWJsZSBhbmQgaW5mbGF0ZVN5bmNQb2ludCBhcmUgRVhQT1JUZWQgKEdpbGxlcyBWb2xsYW50KQotIGRlZmluZSBFWFBPUlRWQSBmb3IgZ3pwcmludGYgKEdpbGxlcyBWb2xsYW50KQotIGFkZGVkIG1hbiBwYWdlIHpsaWIuMyAoUmljayBSb2RnZXJzKQotIGZvciBjb250cmliL3VudGd6LCBmaXggbWFrZWRpcigpIGFuZCBpbXByb3ZlIE1ha2VmaWxlCgotIGNoZWNrIGd6c2VlayBpbiB3cml0ZSBtb2RlIGluIGV4YW1wbGUuYwotIGFsbG9jYXRlIGV4dHJhIGJ1ZmZlciBmb3Igc2Vla3Mgb25seSBpZiBnenNlZWsgaXMgYWN0dWFsbHkgY2FsbGVkCi0gYXZvaWQgc2lnbmVkL3Vuc2lnbmVkIGNvbXBhcmlzb25zIChUaW0gV2VnbmVyLCBHaWxsZXMgVm9sbGFudCkKLSBhZGQgaW5mbGF0ZVN5bmNQb2ludCBpbiB6Y29uZi5oCi0gZml4IGxpc3Qgb2YgZXhwb3J0ZWQgZnVuY3Rpb25zIGluIG50L3psaWIuZG50IGFuZCBtZHNvcy96bGliLmRlZgoKQ2hhbmdlcyBpbiAxLjAuNiAoMTkgSmFuIDE5OTgpCi0gYWRkIGZ1bmN0aW9ucyBnenByaW50ZiwgZ3pwdXRjLCBnemdldGMsIGd6dGVsbCwgZ3plb2YsIGd6c2VlaywgZ3pyZXdpbmQgYW5kCiAgZ3pzZXRwYXJhbXMgKHRoYW5rcyB0byBSb2xhbmQgR2llcnNpZyBhbmQgS2V2aW4gUnVsYW5kIGZvciBzb21lIG9mIHRoaXMgY29kZSkKLSBGaXggYSBkZWZsYXRlIGJ1ZyBvY2N1cnJpbmcgb25seSB3aXRoIGNvbXByZXNzaW9uIGxldmVsIDAgKHRoYW5rcyB0bwogIEFuZHkgQnVja2xlciBmb3IgZmluZGluZyB0aGlzIG9uZSkuCi0gSW4gbWluaWd6aXAsIHBhc3MgdHJhbnNwYXJlbnRseSBhbHNvIHRoZSBmaXJzdCBieXRlIGZvciAuWiBmaWxlcy4KLSByZXR1cm4gWl9CVUZfRVJST1IgaW5zdGVhZCBvZiBaX09LIGlmIG91dHB1dCBidWZmZXIgZnVsbCBpbiB1bmNvbXByZXNzKCkKLSBjaGVjayBaX0ZJTklTSCBpbiBpbmZsYXRlICh0aGFua3MgdG8gTWFyYyBTY2hsdXBlcikKLSBJbXBsZW1lbnQgZGVmbGF0ZUNvcHkgKHRoYW5rcyB0byBBZGFtIENvc3RlbGxvKQotIG1ha2Ugc3RhdGljIGxpYnJhcmllcyBieSBkZWZhdWx0IGluIGNvbmZpZ3VyZSwgYWRkIC0tc2hhcmVkIG9wdGlvbi4KLSBtb3ZlIE1TRE9TIG9yIFdpbmRvd3Mgc3BlY2lmaWMgZmlsZXMgdG8gZGlyZWN0b3J5IG1zZG9zCi0gc3VwcHJlc3MgdGhlIG5vdGlvbiBvZiBwYXJ0aWFsIGZsdXNoIHRvIHNpbXBsaWZ5IHRoZSBpbnRlcmZhY2UKICAoYnV0IHRoZSBzeW1ib2wgWl9QQVJUSUFMX0ZMVVNIIGlzIGtlcHQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCAxLjAuNCkKLSBzdXBwcmVzcyBoaXN0b3J5IGJ1ZmZlciBwcm92aWRlZCBieSBhcHBsaWNhdGlvbiB0byBzaW1wbGlmeSB0aGUgaW50ZXJmYWNlCiAgKHRoaXMgZmVhdHVyZSB3YXMgbm90IGltcGxlbWVudGVkIGFueXdheSBpbiAxLjAuNCkKLSBuZXh0X2luIGFuZCBhdmFpbF9pbiBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBjYWxsaW5nIGluZmxhdGVJbml0IG9yCiAgaW5mbGF0ZUluaXQyCi0gYWRkIEVYUE9SVCBpbiBhbGwgZXhwb3J0ZWQgZnVuY3Rpb25zIChmb3IgV2luZG93cyBETEwpCi0gYWRkZWQgTWFrZWZpbGUubnQgKHRoYW5rcyB0byBTdGVwaGVuIFdpbGxpYW1zKQotIGFkZGVkIHRoZSB1bnN1cHBvcnRlZCAiY29udHJpYiIgZGlyZWN0b3J5OgogICBjb250cmliL2FzbTM4Ni8gYnkgR2lsbGVzIFZvbGxhbnQgPGluZm9Ad2luaW1hZ2UuY29tPgogICAgICAgIDM4NiBhc20gY29kZSByZXBsYWNpbmcgbG9uZ2VzdF9tYXRjaCgpLgogICBjb250cmliL2lvc3RyZWFtLyBieSBLZXZpbiBSdWxhbmQgPGtldmluQHJvZGluLnd1c3RsLmVkdT4KICAgICAgICBBIEMrKyBJL08gc3RyZWFtcyBpbnRlcmZhY2UgdG8gdGhlIHpsaWIgZ3oqIGZ1bmN0aW9ucwogICBjb250cmliL2lvc3RyZWFtMi8gIGJ5IFR5Z2UgTPh2c2V0IDxUeWdlLkxvdnNldEBjbXIubm8+CiAgICAgICAgQW5vdGhlciBDKysgSS9PIHN0cmVhbXMgaW50ZXJmYWNlCiAgIGNvbnRyaWIvdW50Z3ovICBieSAiUGVkcm8gQS4gQXJhbmRhIEd1dGlcaXJyZXoiIDxwYWFnQHRpZC5lcz4KICAgICAgICBBIHZlcnkgc2ltcGxlIHRhci5neiBmaWxlIGV4dHJhY3RvciB1c2luZyB6bGliCiAgIGNvbnRyaWIvdmlzdWFsLWJhc2ljLnR4dCBieSBDYXJsb3MgUmlvcyA8Y19yaW9zQHNvbmRhLmNsPgogICAgICAgIEhvdyB0byB1c2UgY29tcHJlc3MoKSwgdW5jb21wcmVzcygpIGFuZCB0aGUgZ3oqIGZ1bmN0aW9ucyBmcm9tIFZCLgotIHBhc3MgcGFyYW1zIC1mIChmaWx0ZXJlZCBkYXRhKSwgLWggKGh1ZmZtYW4gb25seSksIC0xIHRvIC05IChjb21wcmVzc2lvbgogIGxldmVsKSBpbiBtaW5pZ3ppcCAodGhhbmtzIHRvIFRvbSBMYW5lKQoKLSB1c2UgY29uc3QgZm9yIHJvbW1hYmxlIGNvbnN0YW50cyBpbiBkZWZsYXRlCi0gYWRkZWQgdGVzdCBmb3IgZ3pzZWVrIGFuZCBnenRlbGwgaW4gZXhhbXBsZS5jCi0gYWRkIHVuZG9jdW1lbnRlZCBmdW5jdGlvbiBpbmZsYXRlU3luY1BvaW50KCkgKGhhY2sgZm9yIFBhdWwgTWFja2VycmFzKQotIGFkZCB1bmRvY3VtZW50ZWQgZnVuY3Rpb24gekVycm9yIHRvIGNvbnZlcnQgZXJyb3IgY29kZSB0byBzdHJpbmcKICAoZm9yIFRpbSBTbWl0aGVycykKLSBBbGxvdyBjb21waWxhdGlvbiBvZiBnemlvIHdpdGggLUROT19ERUZMQVRFIHRvIGF2b2lkIHRoZSBjb21wcmVzc2lvbiBjb2RlLgotIFVzZSBkZWZhdWx0IG1lbWNweSBmb3IgU3ltYW50ZWMgTVNET1MgY29tcGlsZXIuCi0gQWRkIEVYUE9SVCBrZXl3b3JkIGZvciBjaGVja19mdW5jIChuZWVkZWQgZm9yIFdpbmRvd3MgRExMKQotIGFkZCBjdXJyZW50IGRpcmVjdG9yeSB0byBMRF9MSUJSQVJZX1BBVEggZm9yICJtYWtlIHRlc3QiCi0gY3JlYXRlIGFsc28gYSBsaW5rIGZvciBsaWJ6LnNvLjEKLSBhZGRlZCBzdXBwb3J0IGZvciBGVUpJVFNVIFVYUC9EUyAodGhhbmtzIHRvIFRvc2hpYWtpIE5vbXVyYSkKLSB1c2UgJChTSEFSRURMSUIpIGluc3RlYWQgb2YgbGliei5zbyBpbiBNYWtlZmlsZS5pbiAoZm9yIEhQVVgpCi0gYWRkZWQgLXNvbmFtZSBmb3IgTGludXggaW4gY29uZmlndXJlIChDaHVuLUNodW5nIENoZW4sCi0gYXNzaWduIG51bWJlcnMgdG8gdGhlIGV4cG9ydGVkIGZ1bmN0aW9ucyBpbiB6bGliLmRlZiAoZm9yIFdpbmRvd3MgRExMKQotIGFkZCBhZHZpY2UgaW4gemxpYi5oIGZvciBiZXN0IHVzYWdlIG9mIGRlZmxhdGVTZXREaWN0aW9uYXJ5Ci0gd29yayBhcm91bmQgY29tcGlsZXIgYnVnIG9uIEF0YXJpIChjYXN0IFpfTlVMTCBpbiBjYWxsIG9mIHMtPmNoZWNrZm4pCi0gYWxsb3cgY29tcGlsYXRpb24gd2l0aCBBTlNJIGtleXdvcmRzIG9ubHkgZW5hYmxlZCBmb3IgVHVyYm9DIGluIGxhcmdlIG1vZGVsCi0gYXZvaWQgInZlcnNpb25TdHJpbmciWzBdIChCb3JsYW5kIGJ1ZykKLSBhZGQgTkVFRF9EVU1NWV9SRVRVUk4gZm9yIEJvcmxhbmQKLSB1c2UgdmFyaWFibGUgel92ZXJib3NlIGZvciB0cmFjaW5nIGluIGRlYnVnIG1vZGUgKEwuIFBldGVyIERldXRzY2gpLgotIGFsbG93IGNvbXBpbGF0aW9uIHdpdGggQ0MKLSBkZWZpbmVkIFNUREMgZm9yIE9TLzIgKERhdmlkIENoYXJsYXApCi0gbGltaXQgZXh0ZXJuYWwgbmFtZXMgdG8gOCBjaGFycyBmb3IgTVZTIChUaG9tYXMgTHVuZCkKLSBpbiBtaW5pZ3ppcC5jLCB1c2Ugc3RhdGljIGJ1ZmZlcnMgb25seSBmb3IgMTYtYml0IHN5c3RlbXMKLSBmaXggc3VmZml4IGNoZWNrIGZvciAibWluaWd6aXAgLWQgZm9vLmd6IgotIGRvIG5vdCByZXR1cm4gYW4gZXJyb3IgZm9yIHRoZSAybmQgb2YgdHdvIGNvbnNlY3V0aXZlIGd6Zmx1c2goKSAoRmVsaXggTGVlKQotIHVzZSBfZmRvcGVuIGluc3RlYWQgb2YgZmRvcGVuIGZvciBNU0MgPj0gNi4wIChUaG9tYXMgRmFuc2xhdSkKLSBhZGRlZCBtYWtlbGNjLmJhdCBmb3IgbGNjLXdpbjMyIChUb20gU3QgRGVuaXMpCi0gaW4gTWFrZWZpbGUuZGoyLCB1c2UgY29weSBhbmQgZGVsIGluc3RlYWQgb2YgaW5zdGFsbCBhbmQgcm0gKEZyYW5rIERvbmFob2UpCi0gQXZvaWQgZXhwYW5kZWQgJElkJC4gVXNlICJyY3MgLWtiIiBvciAiY3ZzIGFkbWluIC1rYiIgdG8gYXZvaWQgSWQgZXhwYW5zaW9uLgotIGNoZWNrIGZvciB1bmlzdGQuaCBpbiBjb25maWd1cmUgKGZvciBvZmZfdCkKLSByZW1vdmUgdXNlbGVzcyBjaGVjayBwYXJhbWV0ZXIgaW4gaW5mbGF0ZV9ibG9ja3NfZnJlZQotIGF2b2lkIHVzZWxlc3MgYXNzaWdubWVudCBvZiBzLT5jaGVjayB0byBpdHNlbGYgaW4gaW5mbGF0ZV9ibG9ja3NfbmV3Ci0gZG8gbm90IGZsdXNoIHR3aWNlIGluIGd6Y2xvc2UgKHRoYW5rcyB0byBLZW4gUmFlYnVybikKLSByZW5hbWUgRk9QRU4gYXMgRl9PUEVOIHRvIGF2b2lkIGNsYXNoIHdpdGggL3Vzci9pbmNsdWRlL3N5cy9maWxlLmgKLSB1c2UgTk9fRVJSTk9fSCBpbnN0ZWFkIG9mIGVudW1lcmF0aW9uIG9mIG9wZXJhdGluZyBzeXN0ZW1zIHdpdGggZXJybm8uaAotIHdvcmsgYXJvdW5kIGJ1Z2d5IGZjbG9zZSBvbiBwaXBlcyBmb3IgSFAvVVgKLSBzdXBwb3J0IHpsaWIgRExMIHdpdGggQk9STEFORCBDKysgNS4wICh0aGFua3MgdG8gR2xlbm4gUmFuZGVycy1QZWhyc29uKQotIGZpeCBjb25maWd1cmUgaWYgQ0MgaXMgYWxyZWFkeSBlcXVhbCB0byBnY2MKCkNoYW5nZXMgaW4gMS4wLjUgKDMgSmFuIDk4KQotIEZpeCBpbmZsYXRlIHRvIHRlcm1pbmF0ZSBncmFjZWZ1bGx5IHdoZW4gZmVkIGNvcnJ1cHRlZCBvciBpbnZhbGlkIGRhdGEKLSBVc2UgY29uc3QgZm9yIHJvbW1hYmxlIGNvbnN0YW50cyBpbiBpbmZsYXRlCi0gRWxpbWluYXRlIG1lbW9yeSBsZWFrcyBvbiBlcnJvciBjb25kaXRpb25zIGluIGluZmxhdGUKLSBSZW1vdmVkIHNvbWUgdmVzdGlnaWFsIGNvZGUgaW4gaW5mbGF0ZQotIFVwZGF0ZSB3ZWIgYWRkcmVzcyBpbiBSRUFETUUKCkNoYW5nZXMgaW4gMS4wLjQgKDI0IEp1bCA5NikKLSBJbiB2ZXJ5IHJhcmUgY29uZGl0aW9ucywgZGVmbGF0ZShzLCBaX0ZJTklTSCkgY291bGQgZmFpbCB0byBwcm9kdWNlIGFuIEVPRgogIGJpdCwgc28gdGhlIGRlY29tcHJlc3NvciBjb3VsZCBkZWNvbXByZXNzIGFsbCB0aGUgY29ycmVjdCBkYXRhIGJ1dCB3ZW50CiAgb24gdG8gYXR0ZW1wdCBkZWNvbXByZXNzaW5nIGV4dHJhIGdhcmJhZ2UgZGF0YS4gVGhpcyBhZmZlY3RlZCBtaW5pZ3ppcCB0b28uCi0gemxpYlZlcnNpb24gYW5kIGd6ZXJyb3IgcmV0dXJuIGNvbnN0IGNoYXIqIChuZWVkZWQgZm9yIERMTCkKLSBwb3J0IHRvIFJJU0NPUyAobm8gZmRvcGVuLCBubyBtdWx0aXBsZSBkb3RzLCBubyB1bmxpbmssIG5vIGZpbGVubykKLSB1c2Ugel9lcnJvciBvbmx5IGZvciBERUJVRyAoYXZvaWQgcHJvYmxlbSB3aXRoIERMTHMpCgpDaGFuZ2VzIGluIDEuMC4zICgyIEp1bCA5NikKLSB1c2Ugel9zdHJlYW1wIGluc3RlYWQgb2Ygel9zdHJlYW0gKiwgd2hpY2ggaXMgbm93IGEgZmFyIHBvaW50ZXIgaW4gTVNET1MKICBzbWFsbCBhbmQgbWVkaXVtIG1vZGVsczsgdGhpcyBtYWtlcyB0aGUgbGlicmFyeSBpbmNvbXBhdGlibGUgd2l0aCBwcmV2aW91cwogIHZlcnNpb25zIGZvciB0aGVzZSBtb2RlbHMuIChObyBlZmZlY3QgaW4gbGFyZ2UgbW9kZWwgb3Igb24gb3RoZXIgc3lzdGVtcy4pCi0gcmV0dXJuIE9LIGluc3RlYWQgb2YgQlVGX0VSUk9SIGlmIHByZXZpb3VzIGRlZmxhdGUgY2FsbCByZXR1cm5lZCB3aXRoCiAgYXZhaWxfb3V0IGFzIHplcm8gYnV0IHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8KLSBhZGRlZCBtZW1jbXAgZm9yIG5vbiBTVERDIGNvbXBpbGVycwotIGRlZmluZSBOT19EVU1NWV9ERUNMIGZvciBtb3JlIE1hYyBjb21waWxlcnMgKC5oIGZpbGVzIG1lcmdlZCBpbmNvcnJlY3RseSkKLSBkZWZpbmUgX18zMkJJVF9fIGlmIF9fMzg2X18gb3IgaTM4NiBpcyBkZWZpbmVkIChwYi4gd2l0aCBXYXRjb20gYW5kIFNDTykKLSBiZXR0ZXIgY2hlY2sgZm9yIDE2LWJpdCBtb2RlIE1TQyAoYXZvaWRzIHByb2JsZW0gd2l0aCBTeW1hbnRlYykKCkNoYW5nZXMgaW4gMS4wLjIgKDIzIE1heSA5NikKLSBhZGRlZCBXaW5kb3dzIERMTCBzdXBwb3J0Ci0gYWRkZWQgYSBmdW5jdGlvbiB6bGliVmVyc2lvbiAoZm9yIHRoZSBETEwgc3VwcG9ydCkKLSBmaXhlZCBkZWNsYXJhdGlvbnMgdXNpbmcgQnl0ZWYgaW4gaW5mdXRpbC5jIChwYiB3aXRoIE1TRE9TIG1lZGl1bSBtb2RlbCkKLSBCeXRlZiBpcyBkZWZpbmUncyBpbnN0ZWFkIG9mIHR5cGVkZWYnZCBvbmx5IGZvciBCb3JsYW5kIEMKLSBhdm9pZCByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGluIGV4YW1wbGUuYwotIG1lbnRpb24gaW4gUkVBRE1FIHRoYXQgdGhlIHpsaWIgZm9ybWF0IGlzIG5vdyBSRkMxOTUwCi0gdXBkYXRlZCBNYWtlZmlsZS5kajIKLSBhZGRlZCBhbGdvcml0aG0uZG9jCgpDaGFuZ2VzIGluIDEuMC4xICgyMCBNYXkgOTYpIFsxLjAgc2tpcHBlZCB0byBhdm9pZCBjb25mdXNpb25dCi0gZml4IGFycmF5IG92ZXJsYXkgaW4gZGVmbGF0ZS5jIHdoaWNoIHNvbWV0aW1lcyBjYXVzZWQgYmFkIGNvbXByZXNzZWQgZGF0YQotIGZpeCBpbmZsYXRlIGJ1ZyB3aXRoIGVtcHR5IHN0b3JlZCBibG9jawotIGZpeCBNU0RPUyBtZWRpdW0gbW9kZWwgd2hpY2ggd2FzIGJyb2tlbiBpbiAwLjk5Ci0gZml4IGRlZmxhdGVQYXJhbXMoKSB3aGljaCBjb3VsZCBnZW5lcmF0ZWQgYmFkIGNvbXByZXNzZWQgZGF0YS4KLSBCeXRlZiBpcyBkZWZpbmUnZCBpbnN0ZWFkIG9mIHR5cGVkZWYnZWQgKHdvcmsgYXJvdW5kIEJvcmxhbmQgYnVnKQotIGFkZGVkIGFuIElOREVYIGZpbGUKLSBuZXcgbWFrZWZpbGVzIGZvciBESkdQUCAoTWFrZWZpbGUuZGoyKSwgMzItYml0IEJvcmxhbmQgKE1ha2VmaWxlLmIzMiksCiAgV2F0Y29tIChNYWtlZmlsZS53YXQpLCBBbWlnYSBTQVMvQyAoTWFrZWZpbGUuc2FzKQotIHNwZWVkIHVwIGFkbGVyMzIgZm9yIG1vZGVybiBtYWNoaW5lcyB3aXRob3V0IGF1dG8taW5jcmVtZW50Ci0gYWRkZWQgLWFuc2kgZm9yIElSSVggaW4gY29uZmlndXJlCi0gc3RhdGljX2luaXRfZG9uZSBpbiB0cmVlcy5jIGlzIGFuIGludAotIGRlZmluZSB1bmxpbmsgYXMgZGVsZXRlIGZvciBWTVMKLSBmaXggY29uZmlndXJlIGZvciBRTlgKLSBhZGQgY29uZmlndXJlIGJyYW5jaCBmb3IgU0NPIGFuZCBIUFVYCi0gYXZvaWQgbWFueSB3YXJuaW5ncyAodW51c2VkIHZhcmlhYmxlcywgZGVhZCBhc3NpZ25tZW50cywgZXRjLi4uKQotIG5vIGZkb3BlbiBmb3IgQmVPUwotIGZpeCB0aGUgV2F0Y29tIGZpeCBmb3IgMzIgYml0IG1vZGUgKGRlZmluZSBGQVIgYXMgZW1wdHkpCi0gcmVtb3ZlZCByZWRlZmluaXRpb24gb2YgQnl0ZSBmb3IgTUtXRVJLUwotIHdvcmsgYXJvdW5kIGFuIE1XS0VSS1MgYnVnIChpbmNvcnJlY3QgbWVyZ2Ugb2YgYWxsIC5oIGZpbGVzKQoKQ2hhbmdlcyBpbiAwLjk5ICgyNyBKYW4gOTYpCi0gYWxsb3cgcHJlc2V0IGRpY3Rpb25hcnkgc2hhcmVkIGJldHdlZW4gY29tcHJlc3NvciBhbmQgZGVjb21wcmVzc29yCi0gYWxsb3cgY29tcHJlc3Npb24gbGV2ZWwgMCAobm8gY29tcHJlc3Npb24pCi0gYWRkIGRlZmxhdGVQYXJhbXMgaW4gemxpYi5oOiBhbGxvdyBkeW5hbWljIGNoYW5nZSBvZiBjb21wcmVzc2lvbiBsZXZlbAogIGFuZCBjb21wcmVzc2lvbiBzdHJhdGVneS4KLSB0ZXN0IGxhcmdlIGJ1ZmZlcnMgYW5kIGRlZmxhdGVQYXJhbXMgaW4gZXhhbXBsZS5jCi0gYWRkIG9wdGlvbmFsICJjb25maWd1cmUiIHRvIGJ1aWxkIHpsaWIgYXMgYSBzaGFyZWQgbGlicmFyeQotIHN1cHByZXNzIE1ha2VmaWxlLnFueCwgdXNlIGNvbmZpZ3VyZSBpbnN0ZWFkCi0gZml4ZWQgZGVmbGF0ZSBmb3IgNjQtYml0IHN5c3RlbXMgKGRldGVjdGVkIG9uIENyYXkpCi0gZml4ZWQgaW5mbGF0ZV9ibG9ja3MgZm9yIDY0LWJpdCBzeXN0ZW1zIChkZXRlY3RlZCBvbiBBbHBoYSkKLSBkZWNsYXJlIFpfREVGTEFURUQgaW4gemxpYi5oIChwb3NzaWJsZSBwYXJhbWV0ZXIgZm9yIGRlZmxhdGVJbml0MikKLSBhbHdheXMgcmV0dXJuIFpfQlVGX0VSUk9SIHdoZW4gZGVmbGF0ZSgpIGhhcyBub3RoaW5nIHRvIGRvCi0gZGVmbGF0ZUluaXQgYW5kIGluZmxhdGVJbml0IGFyZSBub3cgbWFjcm9zIHRvIGFsbG93IHZlcnNpb24gY2hlY2tpbmcKLSBwcmVmaXggYWxsIGdsb2JhbCBmdW5jdGlvbnMgYW5kIHR5cGVzIHdpdGggel8gd2l0aCAtRFpfUFJFRklYCi0gbWFrZSBmYWxsb2MgY29tcGxldGVseSByZWVudHJhbnQgKGluZnRyZWVzLmMpCi0gZml4ZWQgdmVyeSB1bmxpa2VseSByYWNlIGNvbmRpdGlvbiBpbiBjdF9zdGF0aWNfaW5pdAotIGZyZWUgaW4gcmV2ZXJzZSBvcmRlciBvZiBhbGxvY2F0aW9uIHRvIGhlbHAgbWVtb3J5IG1hbmFnZXIKLSB1c2UgemxpYi0xLjAvKiBpbnN0ZWFkIG9mIHpsaWIvKiBpbnNpZGUgdGhlIHRhci5negotIG1ha2UgemxpYiB3YXJuaW5nLWZyZWUgd2l0aCAiZ2NjIC1PMyAtV2FsbCAtV3dyaXRlLXN0cmluZ3MgLVdwb2ludGVyLWFyaXRoCiAgLVdjb252ZXJzaW9uIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMiCi0gYWxsb3cgZ3pyZWFkIG9uIGNvbmNhdGVuYXRlZCAuZ3ogZmlsZXMKLSBkZWZsYXRlRW5kIG5vdyByZXR1cm5zIFpfREFUQV9FUlJPUiBpZiBpdCB3YXMgcHJlbWF0dXJlCi0gZGVmbGF0ZSBpcyBmaW5hbGx5ICg/KSBmdWxseSBkZXRlcm1pbmlzdGljIChubyBtYXRjaGVzIGJleW9uZCBlbmQgb2YgaW5wdXQpCi0gRG9jdW1lbnQgWl9TWU5DX0ZMVVNICi0gYWRkIHVuaW5zdGFsbCBpbiBNYWtlZmlsZQotIENoZWNrIGZvciBfX2NwbHVwbHVzIGluIHpsaWIuaAotIEJldHRlciB0ZXN0IGluIGN0X2FsaWduIGZvciBwYXJ0aWFsIGZsdXNoCi0gYXZvaWQgaGFybWxlc3Mgd2FybmluZ3MgZm9yIEJvcmxhbmQgQysrCi0gaW5pdGlhbGl6ZSBoYXNoX2hlYWQgaW4gZGVmbGF0ZS5jCi0gYXZvaWQgd2FybmluZyBvbiBmZG9wZW4gKGd6aW8uYykgZm9yIEhQIGNjIC1BYQotIGluY2x1ZGUgc3RkbGliLmggZm9yIFNUREMgY29tcGlsZXJzCi0gaW5jbHVkZSBlcnJuby5oIGZvciBDcmF5Ci0gaWdub3JlIGVycm9yIGlmIHJhbmxpYiBkb2Vzbid0IGV4aXN0Ci0gY2FsbCByYW5saWIgdHdpY2UgZm9yIE5lWFRTVEVQCi0gdXNlIGV4ZWNfcHJlZml4IGluc3RlYWQgb2YgcHJlZml4IGZvciBsaWJ6LmEKLSByZW5hbWVkIGN0XyogYXMgX3RyXyogdG8gYXZvaWQgY29uZmxpY3Qgd2l0aCBhcHBsaWNhdGlvbnMKLSBjbGVhciB6LT5tc2cgaW4gaW5mbGF0ZUluaXQyIGJlZm9yZSBhbnkgZXJyb3IgcmV0dXJuCi0gaW5pdGlhbGl6ZSBvcGFxdWUgaW4gZXhhbXBsZS5jLCBnemlvLmMsIGRlZmxhdGUuYyBhbmQgaW5mbGF0ZS5jCi0gZml4ZWQgdHlwbyBpbiB6Y29uZi5oIChfR05VQ19fID0+IF9fR05VQ19fKQotIGNoZWNrIGZvciBXSU4zMiBpbiB6Y29uZi5oIGFuZCB6dXRpbC5jIChhdm9pZCBmYXJtYWxsb2MgaW4gMzItYml0IG1vZGUpCi0gZml4IHR5cG8gaW4gTWFrZV92bXMuY29tIChmJHRybmxubSAtPiBmJGdldHN5aSkKLSBpbiBmY2FsbG9jLCBub3JtYWxpemUgcG9pbnRlciBpZiBzaXplID4gNjU1MjAgYnl0ZXMKLSBkb24ndCB1c2Ugc3BlY2lhbCBmY2FsbG9jIGZvciAzMiBiaXQgQm9ybGFuZCBDKysKLSB1c2UgU1REQyBpbnN0ZWFkIG9mIF9fR08zMl9fIHRvIGF2b2lkIHJlZGVjbGFyaW5nIGV4aXQsIGNhbGxvYywgZXRjLi4uCi0gdXNlIFpfQklOQVJZIGluc3RlYWQgb2YgQklOQVJZCi0gZG9jdW1lbnQgdGhhdCBnemNsb3NlIGFmdGVyIGd6ZG9wZW4gd2lsbCBjbG9zZSB0aGUgZmlsZQotIGFsbG93ICJhIiBhcyBtb2RlIGluIGd6b3Blbi4KLSBmaXggZXJyb3IgY2hlY2tpbmcgaW4gZ3pyZWFkCi0gYWxsb3cgc2tpcHBpbmcgLmd6IGV4dHJhLWZpZWxkIG9uIHBpcGVzCi0gYWRkZWQgcmVmZXJlbmNlIHRvIFBlcmwgaW50ZXJmYWNlIGluIFJFQURNRQotIHB1dCB0aGUgY3JjIHRhYmxlIGluIEZBUiBkYXRhIChJIGRpc2xpa2UgbW9yZSBhbmQgbW9yZSB0aGUgbWVkaXVtIG1vZGVsIDopCi0gYWRkZWQgZ2V0X2NyY190YWJsZQotIGFkZGVkIGEgZGltZW5zaW9uIHRvIGFsbCBhcnJheXMgKEJvcmxhbmQgQyBjYW4ndCBjb3VudCkuCi0gd29ya2Fyb3VuZCBCb3JsYW5kIEMgYnVnIGluIGRlY2xhcmF0aW9uIG9mIGluZmxhdGVfY29kZXNfbmV3ICYgaW5mbGF0ZV9mYXN0Ci0gZ3VhcmQgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb24gb2YgKi5oIChmb3IgcHJlY29tcGlsZWQgaGVhZGVyIG9uIE1hYykKLSBXYXRjb20gQyBwcmV0ZW5kcyB0byBiZSBNaWNyb3NvZnQgQyBzbWFsbCBtb2RlbCBldmVuIGluIDMyIGJpdCBtb2RlLgotIGRvbid0IHVzZSB1bnNpemVkIGFycmF5cyB0byBhdm9pZCBzaWxseSB3YXJuaW5ncyBieSBWaXN1YWwgQysrOgogICAgIHdhcm5pbmcgQzQ3NDY6ICdpbmZsYXRlX21hc2snIDogdW5zaXplZCBhcnJheSB0cmVhdGVkIGFzICAnX19mYXInCiAgICAgKHdoYXQncyB3cm9uZyB3aXRoIGZhciBkYXRhIGluIGZhciBtb2RlbD8pLgotIGRlZmluZSBlbnVtIG91dCBvZiBpbmZsYXRlX2Jsb2Nrc19zdGF0ZSB0byBhbGxvdyBjb21waWxhdGlvbiB3aXRoIEMrKwoKQ2hhbmdlcyBpbiAwLjk1ICgxNiBBdWcgOTUpCi0gZml4IE1TRE9TIHNtYWxsIGFuZCBtZWRpdW0gbW9kZWwgKG5vdyBlYXNpZXIgdG8gYWRhcHQgdG8gYW55IGNvbXBpbGVyKQotIGlubGluZWQgc2VuZF9iaXRzCi0gZml4IHRoZSBmaW5hbCAoOi0pIGJ1ZyBmb3IgZGVmbGF0ZSB3aXRoIGZsdXNoIChvdXRwdXQgd2FzIGNvcnJlY3QgYnV0CiAgbm90IGNvbXBsZXRlbHkgZmx1c2hlZCBpbiByYXJlIG9jY2FzaW9ucykuCi0gZGVmYXVsdCB3aW5kb3cgc2l6ZSBpcyBzYW1lIGZvciBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbgogIChpdCdzIG5vdyBzdWZmaWNpZW50IHRvIHNldCBNQVhfV0JJVFMgaW4gemNvbmYuaCkuCi0gdm9pZHAgLT4gdm9pZHBmIGFuZCB2b2lkbnAgLT4gdm9pZHAgKGZvciBjb25zaXN0ZW5jeSB3aXRoIG90aGVyCiAgdHlwZWRlZnMgYW5kIGJlY2F1c2Ugdm9pZG5wIHdhcyBub3QgbmVhciBpbiBsYXJnZSBtb2RlbCkuCgpDaGFuZ2VzIGluIDAuOTQgKDEzIEF1ZyA5NSkKLSBzdXBwb3J0IE1TRE9TIG1lZGl1bSBtb2RlbAotIGZpeCBkZWZsYXRlIHdpdGggZmx1c2ggKGNvdWxkIHNvbWV0aW1lcyBnZW5lcmF0ZSBiYWQgb3V0cHV0KQotIGZpeCBkZWZsYXRlUmVzZXQgKHpsaWIgaGVhZGVyIHdhcyBpbmNvcnJlY3RseSBzdXBwcmVzc2VkKQotIGFkZGVkIHN1cHBvcnQgZm9yIFZNUwotIGFsbG93IGEgY29tcHJlc3Npb24gbGV2ZWwgaW4gZ3pvcGVuKCkKLSBnemZsdXNoIG5vdyBjYWxscyBmZmx1c2gKLSBGb3IgZGVmbGF0ZSB3aXRoIGZsdXNoLCBmbHVzaCBldmVuIGlmIG5vIG1vcmUgaW5wdXQgaXMgcHJvdmlkZWQuCi0gcmVuYW1lIGxpYmd6LmEgYXMgbGliei5hCi0gYXZvaWQgY29tcGxleCBleHByZXNzaW9uIGluIGluZmNvZGVzLmMgdHJpZ2dlcmluZyBUdXJibyBDIGJ1ZwotIHdvcmsgYXJvdW5kIGEgcHJvYmxlbSB3aXRoIGdjYyBvbiBBbHBoYSAoaW4gSU5TRVJUX1NUUklORykKLSBkb24ndCB1c2UgaW5saW5lIGZ1bmN0aW9ucyAocHJvYmxlbSB3aXRoIHNvbWUgZ2NjIHZlcnNpb25zKQotIGFsbG93IHJlbmFtaW5nIG9mIEJ5dGUsIHVJbnQsIGV0Yy4uLiB3aXRoICNkZWZpbmUuCi0gYXZvaWQgd2FybmluZyBhYm91dCAodW51c2VkKSBwb2ludGVyIGJlZm9yZSBzdGFydCBvZiBhcnJheSBpbiBkZWZsYXRlLmMKLSBhdm9pZCB2YXJpb3VzIHdhcm5pbmdzIGluIGd6aW8uYywgZXhhbXBsZS5jLCBpbmZibG9jay5jLCBhZGxlcjMyLmMsIHp1dGlsLmMKLSBhdm9pZCByZXNlcnZlZCB3b3JkICduZXcnIGluIHRyZWVzLmMKCkNoYW5nZXMgaW4gMC45MyAoMjUgSnVuZSA5NSkKLSB0ZW1wb3JhcmlseSBkaXNhYmxlIGlubGluZSBmdW5jdGlvbnMKLSBtYWtlIGRlZmxhdGUgZGV0ZXJtaW5pc3RpYwotIGdpdmUgZW5vdWdoIGxvb2thaGVhZCBmb3IgUEFSVElBTF9GTFVTSAotIFNldCBiaW5hcnkgbW9kZSBmb3Igc3RkaW4vc3Rkb3V0IGluIG1pbmlnemlwLmMgZm9yIE9TLzIKLSBkb24ndCBldmVuIHVzZSBzaWduZWQgY2hhciBpbiBpbmZsYXRlIChub3QgcG9ydGFibGUgZW5vdWdoKQotIGZpeCBpbmZsYXRlIG1lbW9yeSBsZWFrIGZvciBzZWdtZW50ZWQgYXJjaGl0ZWN0dXJlcwoKQ2hhbmdlcyBpbiAwLjkyICgzIE1heSA5NSkKLSBkb24ndCBhc3N1bWUgdGhhdCBjaGFyIGlzIHNpZ25lZCAocHJvYmxlbSBvbiBTR0kpCi0gQ2xlYXIgYml0IGJ1ZmZlciB3aGVuIHN0YXJ0aW5nIGEgc3RvcmVkIGJsb2NrCi0gbm8gbWVtY3B5IG9uIFB5cmFtaWQKLSBzdXBwcmVzc2VkIGluZnRlc3QuYwotIG9wdGltaXplZCBmaWxsX3dpbmRvdywgcHV0IGxvbmdlc3RfbWF0Y2ggaW5saW5lIGZvciBnY2MKLSBvcHRpbWl6ZWQgaW5mbGF0ZSBvbiBzdG9yZWQgYmxvY2tzLgotIHVudGFiaWZ5IGFsbCBzb3VyY2VzIHRvIHNpbXBsaWZ5IHBhdGNoZXMKCkNoYW5nZXMgaW4gMC45MSAoMiBNYXkgOTUpCi0gRGVmYXVsdCBNRU1fTEVWRUwgaXMgOCAobm90IDkgZm9yIFVuaXgpIGFzIGRvY3VtZW50ZWQgaW4gemxpYi5oCi0gRG9jdW1lbnQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgaW4gemNvbmYuaAotIGFkZGVkICJtYWtlIGluc3RhbGwiCi0gZml4IHN5bmMgc2VhcmNoIGxvZ2ljIGluIGluZmxhdGVTeW5jCi0gZGVmbGF0ZShaX0ZVTExfRkxVU0gpIG5vdyB3b3JrcyBldmVuIGlmIG91dHB1dCBidWZmZXIgdG9vIHNob3J0Ci0gYWZ0ZXIgaW5mbGF0ZVN5bmMsIGRvbid0IHNjYXJlIHBlb3BsZSB3aXRoIGp1c3QgImxvIHdvcmxkIgotIGFkZGVkIHN1cHBvcnQgZm9yIERKR1BQCgpDaGFuZ2VzIGluIDAuOSAoMSBNYXkgOTUpCi0gZG9uJ3QgYXNzdW1lIHRoYXQgemFsbG9jIGNsZWFycyB0aGUgYWxsb2NhdGVkIG1lbW9yeSAodGhlIFR1cmJvQyBidWcKICB3YXMgTWFyaydzIGJ1ZyBhZnRlciBhbGwgOikKLSBsZXQgYWdhaW4gZ3pyZWFkIGNvcHkgdW5jb21wcmVzc2VkIGRhdGEgdW5jaGFuZ2VkICh3YXMgd29ya2luZyBpbiAwLjcxKQotIGRlZmxhdGUoWl9GVUxMX0ZMVVNIKSwgaW5mbGF0ZVJlc2V0IGFuZCBpbmZsYXRlU3luYyBhcmUgbm93IGZ1bGx5IGltcGxlbWVudGVkCi0gYWRkZWQgYSB0ZXN0IG9mIGluZmxhdGVTeW5jIGluIGV4YW1wbGUuYwotIG1vdmVkIE1BWF9XQklUUyB0byB6Y29uZi5oIGJlY2F1c2UgdXNlcnMgbWlnaHQgd2FudCB0byBjaGFuZ2UgdGhhdC4KLSBkb2N1bWVudCBleHBsaWNpdGx5IHRoYXQgemFsbG9jKDY0Sykgb24gTVNET1MgbXVzdCByZXR1cm4gYSBub3JtYWxpemVkCiAgcG9pbnRlciAoemVybyBvZmZzZXQpCi0gYWRkZWQgTWFrZWZpbGVzIGZvciBNaWNyb3NvZnQgQywgVHVyYm8gQywgQm9ybGFuZCBDKysKLSBmYXN0ZXIgY3JjMzIoKQoKQ2hhbmdlcyBpbiAwLjggKDI5IEFwcmlsIDk1KQotIGFkZGVkIGZhc3QgaW5mbGF0ZSAoaW5mZmFzdC5jKQotIGRlZmxhdGUoWl9GSU5JU0gpIG5vdyByZXR1cm5zIFpfU1RSRUFNX0VORCB3aGVuIGRvbmUuIFdhcm5pbmc6IHRoaXMKICBpcyBpbmNvbXBhdGlibGUgd2l0aCBwcmV2aW91cyB2ZXJzaW9ucyBvZiB6bGliIHdoaWNoIHJldHVybmVkIFpfT0suCi0gd29yayBhcm91bmQgYSBUdXJib0MgY29tcGlsZXIgYnVnIChiYWQgY29kZSBmb3IgYiA8PCAwLCBzZWUgaW5mdXRpbC5oKQogIChhY3R1YWxseSB0aGF0IHdhcyBub3QgYSBjb21waWxlciBidWcsIHNlZSAwLjgxIGFib3ZlKQotIGd6cmVhZCBubyBsb25nZXIgcmVhZHMgb25lIGV4dHJhIGJ5dGUgaW4gY2VydGFpbiBjYXNlcwotIEluIGd6aW8gZGVzdHJveSgpLCBkb24ndCByZWZlcmVuY2UgYSBmcmVlZCBzdHJ1Y3R1cmUKLSBhdm9pZCBtYW55IHdhcm5pbmdzIGZvciBNU0RPUwotIGF2b2lkIHRoZSBFUlJPUiBzeW1ib2wgd2hpY2ggaXMgdXNlZCBieSBNUyBXaW5kb3dzCgpDaGFuZ2VzIGluIDAuNzEgKDE0IEFwcmlsIDk1KQotIEZpeGVkIG1vcmUgTVNET1MgY29tcGlsYXRpb24gcHJvYmxlbXMgOiggVGhlcmUgaXMgc3RpbGwgYSBidWcgd2l0aAogIFR1cmJvQyBsYXJnZSBtb2RlbC4KCkNoYW5nZXMgaW4gMC43ICgxNCBBcHJpbCA5NSkKLSBBZGRlZCBmdWxsIGluZmxhdGUgc3VwcG9ydC4KLSBTaW1wbGlmaWVkIHRoZSBjcmMzMigpIGludGVyZmFjZS4gVGhlIHByZS0gYW5kIHBvc3QtY29uZGl0aW9uaW5nCiAgKG9uZSdzIGNvbXBsZW1lbnQpIGlzIG5vdyBkb25lIGluc2lkZSBjcmMzMigpLiBXQVJOSU5HOiB0aGlzIGlzCiAgaW5jb21wYXRpYmxlIHdpdGggcHJldmlvdXMgdmVyc2lvbnM7IHNlZSB6bGliLmggZm9yIHRoZSBuZXcgdXNhZ2UuCgpDaGFuZ2VzIGluIDAuNjEgKDEyIEFwcmlsIDk1KQotIHdvcmthcm91bmQgZm9yIGEgYnVnIGluIFR1cmJvQy4gZXhhbXBsZSBhbmQgbWluaWd6aXAgbm93IHdvcmsgb24gTVNET1MuCgpDaGFuZ2VzIGluIDAuNiAoMTEgQXByaWwgOTUpCi0gYWRkZWQgbWluaWd6aXAuYwotIGFkZGVkIGd6ZG9wZW4gdG8gcmVvcGVuIGEgZmlsZSBkZXNjcmlwdG9yIGFzIGd6RmlsZQotIGFkZGVkIHRyYW5zcGFyZW50IHJlYWRpbmcgb2Ygbm9uLWd6aXBlZCBmaWxlcyBpbiBnenJlYWQuCi0gZml4ZWQgYnVnIGluIGd6cmVhZCAoZG9uJ3QgcmVhZCBjcmMgYXMgZGF0YSkKLSBmaXhlZCBidWcgaW4gZGVzdHJveSAoZ3ppby5jKSAoZG9uJ3QgcmV0dXJuIFpfU1RSRUFNX0VORCBmb3IgZ3pjbG9zZSkuCi0gZG9uJ3QgYWxsb2NhdGUgYmlnIGFycmF5cyBpbiB0aGUgc3RhY2sgKGZvciBNU0RPUykKLSBmaXggc29tZSBNU0RPUyBjb21waWxhdGlvbiBwcm9ibGVtcwoKQ2hhbmdlcyBpbiAwLjU6Ci0gZG8gcmVhbCBjb21wcmVzc2lvbiBpbiBkZWZsYXRlLmMuIFpfUEFSVElBTF9GTFVTSCBpcyBzdXBwb3J0ZWQgYnV0CiAgbm90IHlldCBaX0ZVTExfRkxVU0guCi0gc3VwcG9ydCBkZWNvbXByZXNzaW9uIGJ1dCBvbmx5IGluIGEgc2luZ2xlIHN0ZXAgKGZvcmNlZCBaX0ZJTklTSCkKLSBhZGRlZCBvcGFxdWUgb2JqZWN0IGZvciB6YWxsb2MgYW5kIHpmcmVlLgotIGFkZGVkIGRlZmxhdGVSZXNldCBhbmQgaW5mbGF0ZVJlc2V0Ci0gYWRkZWQgYSB2YXJpYWJsZSB6bGliX3ZlcnNpb24gZm9yIGNvbnNpc3RlbmN5IGNoZWNraW5nLgotIHJlbmFtZWQgdGhlICdmaWx0ZXInIHBhcmFtZXRlciBvZiBkZWZsYXRlSW5pdDIgYXMgJ3N0cmF0ZWd5Jy4KICBBZGRlZCBaX0ZJTFRFUkVEIGFuZCBaX0hVRkZNQU5fT05MWSBjb25zdGFudHMuCgpDaGFuZ2VzIGluIDAuNDoKLSBhdm9pZCAiemlwIiBldmVyeXdoZXJlLCB1c2UgemxpYiBpbnN0ZWFkIG9mIHppcGxpYi4KLSBzdXBwcmVzcyBaX0JMT0NLX0ZMVVNILCBpbnRlcnByZXQgWl9QQVJUSUFMX0ZMVVNIIGFzIGJsb2NrIGZsdXNoCiAgaWYgY29tcHJlc3Npb24gbWV0aG9kID09IDguCi0gYWRkZWQgYWRsZXIzMiBhbmQgY3JjMzIKLSByZW5hbWVkIGRlZmxhdGVPcHRpb25zIGFzIGRlZmxhdGVJbml0MiwgY2FsbCBvbmUgb3IgdGhlIG90aGVyIGJ1dCBub3QgYm90aAotIGFkZGVkIHRoZSBtZXRob2QgcGFyYW1ldGVyIGZvciBkZWZsYXRlSW5pdDIuCi0gYWRkZWQgaW5mbGF0ZUluaXQyCi0gc2ltcGxpZWQgY29uc2lkZXJhYmx5IGRlZmxhdGVJbml0IGFuZCBpbmZsYXRlSW5pdCBieSBub3Qgc3VwcG9ydGluZwogIHVzZXItcHJvdmlkZWQgaGlzdG9yeSBidWZmZXIuIFRoaXMgaXMgc3VwcG9ydGVkIG9ubHkgaW4gZGVmbGF0ZUluaXQyCiAgYW5kIGluZmxhdGVJbml0Mi4KCkNoYW5nZXMgaW4gMC4zOgotIHByZWZpeCBhbGwgbWFjcm8gbmFtZXMgd2l0aCBaXwotIHVzZSBaX0ZJTklTSCBpbnN0ZWFkIG9mIGRlZmxhdGVFbmQgdG8gZmluaXNoIGNvbXByZXNzaW9uLgotIGFkZGVkIFpfSFVGRk1BTl9PTkxZCi0gYWRkZWQgZ3plcnJvcigpCg==