Experimental representation · Base64
When prediction is not explanation

From protein language models to the person as data
KipBcnRpZmljaWFsIGludGVsbGlnZW5jZSBpcyBsZWFybmluZyByZWd1bGFyaXRpZXMgaW4gcHJvdGVpbnMsIGdlbm9tZXMgYW5kIGhlYWx0aCB0cmFqZWN0b3JpZXMgd2l0aCBleHRyYW9yZGluYXJ5IGVmZmVjdGl2ZW5lc3MuIEJ1dCBhIHByb3RlaW4gZG9lcyBub3QgaW50ZXJwcmV0IGEgcHJlZGljdGlvbiBhYm91dCBpdHNlbGY7IGEgcGVyc29uIGNhbi4gQmV0d2VlbiB0aG9zZSB0d28gc2NhbGVzIGxpZXMgYSBzY2llbnRpZmljLCBhbnRocm9wb2xvZ2ljYWwgYW5kIHBvbGl0aWNhbCBib3VuZGFyeSB0aGF0IHNob3VsZCBub3QgYmUgZXJhc2VkLioqCgpMb25nIGJlZm9yZSB0aGUgY3VycmVudCBleHBhbnNpb24gb2YgYXJ0aWZpY2lhbCBpbnRlbGxpZ2VuY2UsIEFsZm9uc28gVmFsZW5jaWHigJlzIHNjaWVudGlmaWMgY2FyZWVyIHdhcyBhbHJlYWR5IHNoYXBlZCBieSBhIHF1ZXN0aW9uIHRoYXQgaGFzIG5vdyBiZWNvbWUgY2VudHJhbC4gSG93IGZhciBjYW4gd2UgaW5mZXIgd2hhdCBhIGJpb2xvZ2ljYWwgc3lzdGVtIGRvZXMgZnJvbSB0aGUgZGF0YSB3ZSBoYXZlIGFib3V0IGl0PwoKSW4gMjAwMCwgRGFtaWVuIERldm9zIGFuZCBBbGZvbnNvIFZhbGVuY2lhIHB1Ymxpc2hlZCAqUHJhY3RpY2FsIGxpbWl0cyBvZiBmdW5jdGlvbiBwcmVkaWN0aW9uKi4gQXQgdGhlIHRpbWUsIHRoZSBwcm9ibGVtIHdhcyBwcm90ZWluIGZ1bmN0aW9uLiBUaGUgbnVtYmVyIG9mIGtub3duIHNlcXVlbmNlcyB3YXMgZ3Jvd2luZyBtdWNoIGZhc3RlciB0aGFuIHRoZSBleHBlcmltZW50YWwgY2FwYWNpdHkgdG8gZXN0YWJsaXNoIHdoYXQgZWFjaCBwcm90ZWluIGRpZCwgc28gYmlvaW5mb3JtYXRpY3Mgc291Z2h0IHRvIHRyYW5zZmVyIGZ1bmN0aW9ucyBmcm9tIGtub3duIHByb3RlaW5zIHRvIHNpbWlsYXIgb25lcy4gVGhlaXIgYW5hbHlzaXMgc2hvd2VkIHRoYXQgZmluZGluZyBwYXR0ZXJucyBjYW4gc3VwcG9ydCB1c2VmdWwgcHJlZGljdGlvbnMsIGJ1dCB0aGF0IHRoaXMgdHJhbnNmZXIgaGFzIGxpbWl0cyBhcmlzaW5nIGZyb20gZGF0YWJhc2UgaW5hY2N1cmFjaWVzLCBldm9sdXRpb25hcnkgZGl2ZXJnZW5jZSBhbmQgdGhlIGZ1bmN0aW9uYWwgcGxhc3RpY2l0eSBvZiBwcm90ZWlucyB0aGVtc2VsdmVzIChEZXZvcyAmIFZhbGVuY2lhLCAyMDAwKS4KClR3ZW50eS1zaXggeWVhcnMgbGF0ZXIsIHRoZSBzY2FsZSBoYXMgY2hhbmdlZC4gRGVlcC1sZWFybmluZyBtb2RlbHMgcHJlZGljdCBtb2xlY3VsYXIgc3RydWN0dXJlcywgZXhwbG9yZSBnZW5vbWUgcmVndWxhdGlvbiwgcHJvY2VzcyBtZWRpY2FsIHJlY29yZHMsIHNpbXVsYXRlIHR1bW91cnMgYW5kIGdlbmVyYXRlIHN5bnRoZXRpYyBiaW9sb2dpY2FsIGRhdGEuIFlldCB0aGUgdW5kZXJseWluZyBxdWVzdGlvbiByZW1haW5zLgoKKipXaGF0IGV4YWN0bHkgZG8gd2Uga25vdyB3aGVuIGEgcHJlZGljdGlvbiBpcyBjb3JyZWN0PyoqCgpUaGUgaXNzdWUgYmVjb21lcyBlc3BlY2lhbGx5IGludGVyZXN0aW5nIHdoZW4gd2UgZm9sbG93IHRoZSBwYXRoIGZyb20gYW4gYW1pbm8tYWNpZCBzZXF1ZW5jZSB0byBhIHBlcnNvbi4gQXQgZWFjaCBjaGFuZ2Ugb2Ygc2NhbGUsIG5vdCBvbmx5IHRoZSBudW1iZXIgb2YgdmFyaWFibGVzIGluY3JlYXNlczsgc28gZG8gdGhlIGtpbmRzIG9mIHJlbGF0aW9uc2hpcHMgd2UgbXVzdCB0YWtlIGludG8gYWNjb3VudC4gVGhlc2UgaW5jbHVkZSBkZXZlbG9wbWVudCwgZW52aXJvbm1lbnQsIGhpc3RvcnksIGxhbmd1YWdlLCBpbnN0aXR1dGlvbnMsIGluZXF1YWxpdHkgYW5kIHRoZSBjYXBhY2l0eSB0byBhY3QgdXBvbiBvbmXigJlzIG93biBmdXR1cmUuCgo+ICoqKkEgZGlnaXRpc2VkIG1lZGljYWwgcmVjb3JkIGRvZXMgbm90IGNvbnRhaW4gYSBsaWZlLiBJdCBjb250YWlucyB0aG9zZSBwYXJ0cyBvZiBhIGxpZmUgdGhhdCBhIHBhcnRpY3VsYXIgaGVhbHRoIHN5c3RlbSBtYW5hZ2VkIOKAlCBhbmQgY2hvc2Ug4oCUIHRvIHR1cm4gaW50byBkYXRhLioqKgoKIyMgV2hlbiBldm9sdXRpb24gYmVjb21lcyBhIGNvcnB1cwoKVGhlIHNpbWlsYXJpdHkgYmV0d2VlbiBsYW5ndWFnZSBtb2RlbHMgYW5kIG1vZGVscyB0aGF0IHdvcmsgd2l0aCBwcm90ZWlucyBkZXNlcnZlcyBjYXJlZnVsIGV4cGxhbmF0aW9uLgoKQSBsYW5ndWFnZSBtb2RlbCBsZWFybnMgcmVndWxhcml0aWVzIHdpdGhpbiBzZXF1ZW5jZXMuIEluIG5hdHVyYWwgbGFuZ3VhZ2UsIHRob3NlIHNlcXVlbmNlcyBhcmUgbWFkZSB1cCBvZiBkaXNjcmV0ZSB1bml0cyDigJQgdG9rZW5zIOKAlCB3aG9zZSBwcm9iYWJpbGl0eSBkZXBlbmRzIG9uIGNvbnRleHQuIFNvbWUgbW9kZWxzIGFyZSB0cmFpbmVkIGJ5IHByZWRpY3RpbmcgdGhlIG5leHQgZWxlbWVudDsgb3RoZXJzIGJ5IHJlY29uc3RydWN0aW5nIGhpZGRlbiBlbGVtZW50cy4gSW4gYm90aCBjYXNlcywgbGVhcm5pbmcgZW1lcmdlcyBmcm9tIGRldGVjdGluZyBkZXBlbmRlbmNpZXMgYWNyb3NzIGVub3Jtb3VzIHF1YW50aXRpZXMgb2Ygc2VxdWVuY2VzLgoKUHJvdGVpbnMgb2ZmZXIgYSBmb3JtYWwgc3RydWN0dXJlIHRoYXQgaXMgc3RyaWtpbmdseSB3ZWxsIHN1aXRlZCB0byBhIHNpbWlsYXIgcHJvYmxlbS4gVGhleSwgdG9vLCBjb25zaXN0IG9mIHNlcXVlbmNlcyBvZiBkaXNjcmV0ZSB1bml0cy4gSW4gdGhpcyBjYXNlLCBhbWlubyBhY2lkcy4gVGhlIGFscGhhYmV0IGlzIG11Y2ggc21hbGxlciDigJQgdHdlbnR5IHN0YW5kYXJkIGFtaW5vIGFjaWRzIOKAlCBhbmQgdGhlIG5hdHVyYWwgc2VxdWVuY2VzIGF2YWlsYWJsZSB0byB1cyBhcmUgdGhlIHByb2R1Y3Qgb2YgYW4gaW1tZW5zZSBldm9sdXRpb25hcnkgaGlzdG9yeS4KClRoZSBhbmFsb2d5IGlzIG5vdCB0aGF0IGEgcHJvdGVpbiDigJhzcGVha3PigJkuIEl0IGlzIHRoYXQgZXZvbHV0aW9uIGhhcyBwcm9kdWNlZCBhIHZhc3QgY29ycHVzIG9mIHNlcXVlbmNlcyBpbiB3aGljaCBzb21lIGNvbWJpbmF0aW9ucyBhcHBlYXIsIGRpc2FwcGVhciBvciByZW1haW4gY29uc2VydmVkIHVuZGVyIHBoeXNpY2FsLCBjaGVtaWNhbCBhbmQgZnVuY3Rpb25hbCBjb25zdHJhaW50cy4gVGhvc2UgcmVndWxhcml0aWVzIGNhbiBiZSBsZWFybnQgc3RhdGlzdGljYWxseS4KClJpdmVzIGFuZCBjb2xsZWFndWVzICgyMDIxKSB0cmFpbmVkIGxhbmd1YWdlIG1vZGVscyBvbiAyNTAgbWlsbGlvbiBwcm90ZWluIHNlcXVlbmNlcyBjb250YWluaW5nIGFyb3VuZCA4NiBiaWxsaW9uIGFtaW5vIGFjaWRzLiBXaXRob3V0IGJlaW5nIGdpdmVuIGV4cGxpY2l0IGFubm90YXRpb25zIGFib3V0IHN0cnVjdHVyZSwgdGhlIG1vZGVsc+KAmSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbnMgYmVnYW4gdG8gb3JnYW5pc2UgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBiaW9jaGVtaWNhbCBwcm9wZXJ0aWVzLCBob21vbG9neSwgYW5kIHNlY29uZGFyeSBhbmQgdGVydGlhcnkgc3RydWN0dXJlLiBUaGUgYXBwYXJlbnRseSBzaW1wbGUgb2JqZWN0aXZlIG9mIHJlY29uc3RydWN0aW5nIHNlcXVlbmNlcyBmb3JjZWQgdGhlIHN5c3RlbSB0byBjYXB0dXJlIHNvbWUgb2YgdGhlIGNvbnN0cmFpbnRzIHRoYXQgZXZvbHV0aW9uIGhhZCBsZWZ0IGVtYmVkZGVkIHdpdGhpbiB0aGVtLgoKVGhpcyByZXZlYWxzIGEgZmlyc3QgaW1wb3J0YW50IGNvbm5lY3Rpb24gd2l0aCBsYXJnZSBsYW5ndWFnZSBtb2RlbHMuICoqQ29udGV4dCBjYW4gYmUgdXNlZCB0byBpbmZlciByZWxhdGlvbnNoaXBzIHRoYXQgYXJlIG5vdCBleHBsaWNpdGx5IGxhYmVsbGVkIGluIHRoZSBkYXRhKiouCgpBbHBoYUZvbGQyLCBob3dldmVyLCBpcyBub3Qgc3RyaWN0bHkgYW4gTExNLgoKSXRzIGFyY2hpdGVjdHVyZSBpcyBzcGVjaWZpY2FsbHkgZGVzaWduZWQgZm9yIHRoZSBwcm90ZWluLXN0cnVjdHVyZSBwcm9ibGVtLiBJdHMgRXZvZm9ybWVyIGNvcmUgcHJvY2Vzc2VzIG11bHRpcGxlLXNlcXVlbmNlIGFsaWdubWVudHMgYW5kIHBhaXJ3aXNlIHJlc2lkdWUgcmVwcmVzZW50YXRpb25zIHVzaW5nIGF0dGVudGlvbi1iYXNlZCBjb21wb25lbnRzIGFsb25nc2lkZSBvdGhlciBzcGVjaWFsaXNlZCBtZWNoYW5pc21zLiBUaGUgZXZvbHV0aW9uYXJ5IGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aG9zZSBhbGlnbm1lbnRzIGhlbHBzIGluZmVyIHdoaWNoIGFtaW5vIGFjaWRzIGhhdmUgdmFyaWVkIHRvZ2V0aGVyIG92ZXIgZXZvbHV0aW9uYXJ5IHRpbWUgYW5kLCB0aGVyZWZvcmUsIHdoYXQgc3BhdGlhbCByZWxhdGlvbnNoaXBzIG1heSBleGlzdCBiZXR3ZWVuIHRoZW0gKEp1bXBlciBldCBhbC4sIDIwMjEpLgoKVGhlIGNvbm5lY3Rpb24gd2l0aCBsYW5ndWFnZSBtb2RlbHMgYmVjb21lcyBldmVuIGNsZWFyZXIgd2l0aCBFU01Gb2xkLiBMaW4gYW5kIGNvbGxlYWd1ZXMgKDIwMjMpIHNob3dlZCB0aGF0IGEgbGFyZ2UgbGFuZ3VhZ2UgbW9kZWwgdHJhaW5lZCBkaXJlY3RseSBvbiBwcm90ZWluIHNlcXVlbmNlcyBjb3VsZCBpbmZlciBhdG9taWMgc3RydWN0dXJlcyBmcm9tIGEgc2luZ2xlIHNlcXVlbmNlLiBXaGVuIHNjYWxlZCB0byAxNSBiaWxsaW9uIHBhcmFtZXRlcnMsIGl0cyBpbnRlcm5hbCByZXByZXNlbnRhdGlvbnMgY29udGFpbmVkIGVub3VnaCBzdHJ1Y3R1cmFsIGluZm9ybWF0aW9uIHRvIHByb2R1Y2UgdGhyZWUtZGltZW5zaW9uYWwgcHJlZGljdGlvbnMgYXQgaGlnaCBzcGVlZC4KClRoaXMgYWxsb3dzIHRoZSByZXNlbWJsYW5jZSB0byBiZSBzdGF0ZWQgcHJlY2lzZWx5LgoKKipQcm90ZWluIGxhbmd1YWdlIG1vZGVscyB3b3JrIGJlY2F1c2Ugc2VxdWVuY2VzIGNvbnRhaW4gY29udGV4dHVhbCBhbmQgZXZvbHV0aW9uYXJ5IHJlZ3VsYXJpdGllcyBmcm9tIHdoaWNoIHByb3BlcnRpZXMgdGhhdCBhcmUgbm90IGV4cGxpY2l0bHkgd3JpdHRlbiBhdCBlYWNoIHBvc2l0aW9uIGNhbiBiZSBpbmZlcnJlZC4qKgoKSW4gYSBzZW5zZSwgZXZvbHV0aW9uIGdlbmVyYXRlZCB0aGUgdHJhaW5pbmcgY29ycHVzLgoKQnV0IHRoaXMgaXMgYWxzbyB3aGVyZSBwYXJ0IG9mIHRoZSBhbmFsb2d5IGVuZHMuCgpBbWlubyBhY2lkcyBhcmUgbm90IHdvcmRzLiBBIHByb3RlaW4gZG9lcyBub3QgaG9sZCBhIGNvbnZlcnNhdGlvbiwgbmVnb3RpYXRlIHRoZSBtZWFuaW5nIG9mIGEgc2VxdWVuY2Ugb3IgYWx0ZXIgaXRzIGJlaGF2aW91ciBiZWNhdXNlIGl0IGhhcyBsZWFybnQgdGhhdCBzb21lb25lIGhhcyBtYWRlIGEgcHJlZGljdGlvbiBhYm91dCBpdC4gVG8gY29uZnVzZSB0aGUgY29tcHV0YXRpb25hbCB1c2VmdWxuZXNzIG9mIHRoZSBsaW5ndWlzdGljIG1ldGFwaG9yIHdpdGggYW4gaWRlbnRpdHkgYmV0d2VlbiBwcm90ZWlucyBhbmQgaHVtYW4gbGFuZ3VhZ2Ugd291bGQgYmUgdG8gdHVybiBhIG1ldGhvZG9sb2dpY2FsIHRvb2wgaW50byBhbiBvbnRvbG9naWNhbCBjbGFpbS4KCiMjIEEgcHJvdGVpbiBpcyBub3QgYSBwZXJzb24KClRoYXQganVtcCBpbiBzY2FsZSByZWNhbGxzIGEgd2FybmluZyBkZXZlbG9wZWQgYnkgQWxmcmVkbyBGcmFuY2VzY2ggRMOtYXogaW4gYSBkaWZmZXJlbnQgY29udGV4dC4KCkluICpTYWJvcmVzIHkgc2luc2Fib3JlcyBkZSB1biBwcm9ncmFtYSBkYXJ3aW5pc3RhIHBhcmEgbGFzIGNpZW5jaWFzIHNvY2lhbGVzKiBbUGxlYXN1cmVzIGFuZCBwaXRmYWxscyBvZiBhIERhcndpbmlhbiBwcm9ncmFtbWUgZm9yIHRoZSBzb2NpYWwgc2NpZW5jZXNdLCBGcmFuY2VzY2ggRMOtYXogKDIwMTApIGNyaXRpY2FsbHkgZXhhbWluZXMgd2hhdCBoYXBwZW5zIHdoZW4gYW4gZXhwbGFuYXRvcnkgcHJvZ3JhbW1lIGJ1aWx0IGluIGJpb2xvZ3kgaXMgZXh0ZW5kZWQgaW50byBzb2NpYWwgcGhlbm9tZW5hLiBIaXMgd29yayBkb2VzIG5vdCBkaXNjdXNzIGFydGlmaWNpYWwgaW50ZWxsaWdlbmNlIG9yIGFudGljaXBhdGUgcHJvdGVpbiBsYW5ndWFnZSBtb2RlbHMuIFRoZSBjb25uZWN0aW9uIHByb3Bvc2VkIGhlcmUgaXMgYW4gYW5hbG9neS4gKipBIGZyYW1ld29yayBjYW4gYmUgZXh0cmFvcmRpbmFyaWx5IHByb2R1Y3RpdmUgd2l0aGluIG9uZSBkb21haW4gd2l0aG91dCB0aGVyZWJ5IGJlY29taW5nIGEgdW5pdmVyc2FsIGV4cGxhbmF0aW9uKiouCgpBSSBub3cgcHJlc2VudHMgYSBwYXJ0aWN1bGFybHkgdGVtcHRpbmcgY2FzZS4KCklmIGEgdHJhbnNmb3JtZXIgY2FuIGRpc2NvdmVyIHJlbGV2YW50IHJlbGF0aW9uc2hpcHMgYW1vbmcgYW1pbm8gYWNpZHM7IGlmIGFub3RoZXIgbW9kZWwgY2FuIHByZWRpY3QgYSBwcm90ZWlu4oCZcyBzdHJ1Y3R1cmU7IGlmIEFscGhhR2Vub21lIGNhbiBsZWFybiByZWxhdGlvbnNoaXBzIGJldHdlZW4gc2VxdWVuY2UgYW5kIHJlZ3VsYXRpb24sIHdoeSBub3QgY29udGludWUgdXB3YXJkcyB0byBtb2RlbCB0aXNzdWVzLCBvcmdhbnMsIGJlaGF2aW91ciBhbmQgZXZlbiBwZXJzb25zPwoKVGhlIGFuc3dlciBpcyBub3QgdG8gZGVueSB0aGF0IHN1Y2ggbW9kZWxsaW5nIGlzIHBvc3NpYmxlLiBJdCBpcyB0byByZWNvZ25pc2UgdGhhdCBlYWNoIHNjYWxlIGludHJvZHVjZXMgbmV3IHByb3BlcnRpZXMgYW5kIHJlbGF0aW9uc2hpcHMuCgpBIHByb3RlaW4gaXMgbW9yZSB0aGFuIGEgc2VxdWVuY2UsIGJ1dCBpdHMgc3RydWN0dXJlIGlzIHN0cm9uZ2x5IGNvbnN0cmFpbmVkIGJ5IHBoeXNpY2FsIHByb3BlcnRpZXMgYW5kIGJ5IGNvbnN0cmFpbnRzIGFjY3VtdWxhdGVkIHRocm91Z2ggZXZvbHV0aW9uLiBBIHBlcnNvbiwgYnkgY29udHJhc3QsIGRldmVsb3BzIHdpdGhpbiBlbnZpcm9ubWVudHMgdGhhdCB0aGV5IGNoYW5nZSBhbmQgdGhhdCBjaGFuZ2UgdGhlbSwgbGVhcm5zIGNhdGVnb3JpZXMsIHBhcnRpY2lwYXRlcyBpbiBpbnN0aXR1dGlvbnMsIGludGVycHJldHMgbWVhbmluZ3MgYW5kIGNhbiByZWFjdCB0byBjbGFzc2lmaWNhdGlvbnMgcHJvZHVjZWQgYWJvdXQgdGhlbSBieSBvdGhlciBwZW9wbGUgb3IgYnkgc3lzdGVtcy4KCkFkZGluZyBtb3JlIHZhcmlhYmxlcyBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IHJlc29sdmUgdGhpcyBjaGFuZ2UgaW4gdGhlIG5hdHVyZSBvZiB0aGUgcHJvYmxlbS4KCiMjIFRoZSBnZW5vbWUgaXMgbm90IGEgY2xvc2VkIHByb2dyYW1tZQoKVGhlIGhpc3Rvcnkgb2YgZ2Vub21pY3Mgb2ZmZXJzIGEgc2Vjb25kIGV4YW1wbGUuCgpTZXF1ZW5jaW5nIHRoZSBodW1hbiBnZW5vbWUgZW5jb3VyYWdlZCBhIHBvd2VyZnVsIGltYWdlIGZvciB5ZWFycy4gSWYgd2UgY291bGQgcmVhZCB0aGUgZW50aXJlIGNvZGUsIHdlIHdvdWxkIHVuZGVyc3RhbmQgdGhlIG9yZ2FuaXNtLiBZZXQgYmV0d2VlbiBrbm93aW5nIGEgc2VxdWVuY2UgYW5kIGV4cGxhaW5pbmcgYSBwaGVub3R5cGUgbGllcyBhIG5ldHdvcmsgb2YgZ2VuZSByZWd1bGF0aW9uLCBkZXZlbG9wbWVudCwgY2VsbHVsYXIgaW50ZXJhY3Rpb24gYW5kIGVudmlyb25tZW50YWwgY29uZGl0aW9ucyB0aGF0IGNhbm5vdCBiZSByZWR1Y2VkIHRvIGEgbGluZWFyIHJlYWRpbmcgb2YgRE5BLgoKQmlvaW5mb3JtYXRpY3MgaXRzZWxmIGhhcyBwcm9ncmVzc2l2ZWx5IG1vdmVkIGF3YXkgZnJvbSBpc29sYXRlZCBzZXF1ZW5jZXMgdG93YXJkcyBpbmNyZWFzaW5nbHkgaGV0ZXJvZ2VuZW91cyBzeXN0ZW1zLiBDaXJpbGxvIGFuZCBWYWxlbmNpYSAoMjAxOSkgZGVzY3JpYmUgcGVyc29uYWxpc2VkIG1lZGljaW5lIGFzIGEgcHJvYmxlbSBvZiBpbnRlZ3JhdGluZyBnZW5vbWljIGFuZCBtdWx0aS1vbWljIGRhdGEsIGltYWdpbmcsIG1lZGljYWwgcmVjb3JkcyBhbmQgZGF0YSBwcm9kdWNlZCBieSBwZXJzb25hbCBkZXZpY2VzLiBUaGV5IGFsc28gd2FybiB0aGF0IGxhcmdlIGJpb21lZGljYWwgZGF0YXNldHMgYXJlIGhldGVyb2dlbmVvdXMsIGluY29tcGxldGUgYW5kIGltcHJlY2lzZSwgYW5kIHRoYXQgb3VyIGFiaWxpdHkgdG8gZ2VuZXJhdGUgZGF0YSBpcyBhZHZhbmNpbmcgZmFzdGVyIHRoYW4gb3VyIGFiaWxpdHkgdG8gaW50ZXJwcmV0IGl0LgoKRXVnZW5pYSBSYW3DrXJleiBHb2ljb2VjaGVh4oCZcyBiaW9zb2NpYWwgYW50aHJvcG9sb2d5IG9mZmVycyBhIHBhcnRpY3VsYXJseSBwcm9kdWN0aXZlIGZyYW1ld29yayBmb3IgdGhpbmtpbmcgdGhyb3VnaCB0aGlzIGRpZmZpY3VsdHkuIEluICpBbnRyb3BvbG9nw61hIGJpb3NvY2lhbDogQmlvbG9nw61hLCBjdWx0dXJhIHkgc29jaWVkYWQqIFtCaW9zb2NpYWwgYW50aHJvcG9sb2d5OiBCaW9sb2d5LCBjdWx0dXJlIGFuZCBzb2NpZXR5XSwgaHVtYW4gZXZvbHV0aW9uIGRvZXMgbm90IGFwcGVhciBhcyB0aGUgbGluZWFyIHVuZm9sZGluZyBvZiBhIGdlbmV0aWMgcHJvZ3JhbW1lLCBidXQgYXMgYSBwcm9jZXNzIGluIHdoaWNoIHBoeWxvZ2VueSwgb250b2dlbnksIGVwaWdlbmVzaXMsIHBsYXN0aWNpdHkgYW5kIGVudmlyb25tZW50IGFyZSBpbnRlcnR3aW5lZCAoUmFtw61yZXogR29pY29lY2hlYSwgMjAxMykuCgpIZXIgZm9ybXVsYXRpb24gaXMgZXNwZWNpYWxseSBjbGVhci4g4oCYTG8gZ2Vuw6l0aWNvIG5vcyBkZWZpbmUgY29tbyBwb3NpYmlsaWRhZCBhIHJlYWxpemFyc2UsIHBlcm8gc8OzbG8gZW4gbGEgb250b2dlbmlhIGRldmVuaW1vcyBodW1hbm9z4oCZIFtUaGUgZ2VuZXRpYyBkZWZpbmVzIHVzIGFzIGEgcG9zc2liaWxpdHkgdG8gYmUgcmVhbGlzZWQsIGJ1dCBpdCBpcyBvbmx5IHRocm91Z2ggb250b2dlbnkgdGhhdCB3ZSBiZWNvbWUgaHVtYW5dIChSYW3DrXJleiBHb2ljb2VjaGVhLCAyMDEzLCBwLiAxODApLgoKVGhlIGdlbmUgdGhlcmVmb3JlIGNlYXNlcyB0byBvY2N1cHkgdGhlIHBvc2l0aW9uIG9mIGEgc3VmZmljaWVudCBjYXVzZS4gRGV2ZWxvcG1lbnQgaXMgbm90IG1lcmVseSB0aGUgcGVyaW9kIGR1cmluZyB3aGljaCBhIGNvbXBsZXRlZCBwcm9ncmFtbWUgaXMgZXhlY3V0ZWQ7IGl0IGlzIHRoZSBwcm9jZXNzIHRocm91Z2ggd2hpY2ggcGFydGljdWxhciBwb3RlbnRpYWxzIGFyZSByZWFsaXNlZCB1bmRlciBzcGVjaWZpYyBzcGF0aWFsLCB0ZW1wb3JhbCwgYmlvbG9naWNhbCBhbmQgc29jaWFsIGNvbmRpdGlvbnMuCgpBbHBoYUdlbm9tZSBzaG93cyBob3cgZmFyIHByZWRpY3Rpb24gY2FuIG5vdyBhZHZhbmNlIHdpdGhpbiB0aGlzIHRlcnJpdG9yeS4gVGhlIG1vZGVsIGFuYWx5c2VzIHNlcXVlbmNlcyBvZiB1cCB0byBvbmUgbWlsbGlvbiBiYXNlIHBhaXJzIGFuZCBwcmVkaWN0cyBtdWx0aXBsZSBtb2RhbGl0aWVzIG9mIHJlZ3VsYXRvcnkgYWN0aXZpdHkuIEluIHRoZSBwdWJsaXNoZWQgZXZhbHVhdGlvbnMsIGl0IG1hdGNoZWQgb3Igb3V0cGVyZm9ybWVkIHNwZWNpYWxpc2VkIG1vZGVscyBpbiAyNSBvZiAyNiB2YXJpYW50LWVmZmVjdCBwcmVkaWN0aW9uIHRhc2tzIChBdnNlYyBldCBhbC4sIDIwMjYpLgoKVGhpcyBpcyBhbiBleHRyYW9yZGluYXJ5IHJlc3VsdCwgYnV0IGl0IGlzIG5vdCBlcXVpdmFsZW50IHRvIGhhdmluZyBzaW11bGF0ZWQgdGhlIGNvbXBsZXRlIGRldmVsb3BtZW50IG9mIGFuIG9yZ2FuaXNtLiBCZXR3ZWVuIGEgZ2VuZXRpYyB2YXJpYW50IGFuZCBhIGxpZmUgcmVtYWluIGNlbGxzLCB0aXNzdWVzLCBtaWNyb2Jpb21lLCBkaWV0LCBlbnZpcm9ubWVudGFsIGV4cG9zdXJlLCBkaXNlYXNlLCBsZWFybmluZyBhbmQgc29jaWFsIHJlbGF0aW9uc2hpcHMuCgpUaGUgcHJvYmxlbSB0aGVyZWZvcmUgY2Vhc2VzIHRvIGJlIG9ubHkgaG93IG11Y2ggd2Uga25vdyBhYm91dCB0aGUgZ2Vub21lIGFuZCBiZWNvbWVzICoqd2hhdCB0aGF0IGdlbm9tZSBkb2VzIHdpdGhpbiBhIHN5c3RlbSB0aGF0IGlzIGNvbnRpbnVvdXNseSBkZXZlbG9waW5nKiouCgojIyBGcm9tIGNsaW5pY2FsIHRyYWplY3RvcnkgdG8gZW1ib2RpZWQgYmlvZ3JhcGh5CgpBbm90aGVyIHRyYW5zZm9ybWF0aW9uIGFwcGVhcnMgd2hlbiB3ZSBtb3ZlIGZyb20gdGhlIGdlbm9tZSB0byBtZWRpY2FsIHJlY29yZHMuCgpEZWxwaGktMk0sIHB1Ymxpc2hlZCBpbiAyMDI1LCB3YXMgdHJhaW5lZCBvbiBkYXRhIGZyb20gYXBwcm94aW1hdGVseSA0MDAsMDAwIFVLIEJpb2JhbmsgcGFydGljaXBhbnRzIGFuZCBleHRlcm5hbGx5IHZhbGlkYXRlZCB1c2luZyAxLjkgbWlsbGlvbiBwZW9wbGUgaW4gRGVubWFyay4gVGhlIHN5c3RlbSBwcm9iYWJpbGlzdGljYWxseSBtb2RlbHMgdGhlIHRlbXBvcmFsIGV2b2x1dGlvbiBvZiBtb3JlIHRoYW4gb25lIHRob3VzYW5kIGRpc2Vhc2VzIGFuZCBjYW4gZ2VuZXJhdGUgcG9zc2libGUgbG9uZy10ZXJtIGhlYWx0aCB0cmFqZWN0b3JpZXMgKFNobWF0a28gZXQgYWwuLCAyMDI1KS4KCkZvciB0aGUgbW9kZWwsIGEgY2xpbmljYWwgdHJhamVjdG9yeSBpcyBhIHNlcXVlbmNlIG9mIGVuY29kZWQgZXZlbnRzLiBJdCBpbmNsdWRlcyBkaWFnbm9zZXMsIG1lZGljaW5lcywgYWdlcyBhbmQgdGVtcG9yYWwgcmVsYXRpb25zaGlwcy4KCkZyb20gYSBiaW9jdWx0dXJhbCBwZXJzcGVjdGl2ZSwgd2UgY2FuIGFsc28gcmVhZCBpdCBhcyB0aGUgcGFydGlhbCB0cmFjZSBvZiBhbiAqKmVtYm9kaWVkIGJpb2dyYXBoeSoqLgoKQmVoaW5kIGh5cGVydGVuc2lvbiwgcmVzcGlyYXRvcnkgZGlzZWFzZSBvciBtZXRhYm9saWMgYWx0ZXJhdGlvbiB3YXMgYSBib2R5IHRoYXQgZGV2ZWxvcGVkIGluIHBhcnRpY3VsYXIgZW52aXJvbm1lbnRzLiBEaWV0LCBwb2xsdXRpb24sIG1hdGVyaWFsIGNvbmRpdGlvbnMsIHdvcmssIGNhcmUsIHN0cmVzcywgYWNjZXNzIHRvIGhlYWx0aGNhcmUgYW5kIG90aGVyIGV4cGVyaWVuY2VzIGNhbiBoYXZlIGJvZGlseSBjb25zZXF1ZW5jZXMgd2l0aG91dCBuZWNlc3NhcmlseSBiZWluZyByZWNvcmRlZCB3aXRoIHRoZSBzYW1lIGxldmVsIG9mIGRldGFpbCBpbiBhIGRhdGFiYXNlLgoKUmFtw61yZXogR29pY29lY2hlYSAoMjAxMykgaW5zaXN0cyBwcmVjaXNlbHkgdGhhdCB0aGUgc29jaW9jdWx0dXJhbCBpcyBub3QgYSBsYXRlciBhZGRpdGlvbiB0byBhIHByZXZpb3VzbHkgY29tcGxldGVkIGh1bWFuIG5hdHVyZS4gSHVtYW4gYmlvbG9neSBkZXZlbG9wcyB3aXRoaW4gY29uY3JldGUgaGlzdG9yaWNhbCBhbmQgc29jaWFsIGVudmlyb25tZW50cy4KClRoaXMgZG9lcyBub3QgbWVhbiB0aGF0IGV2ZXJ5IGRpc2Vhc2UgY2FuIGJlIHJlZHVjZWQgdG8gY3VsdHVyZS4gSXQgbWVhbnMgdGhhdCBhIGNsaW5pY2FsIHRyYWplY3RvcnkgcmVwcmVzZW50cyBzb21lIGRpbWVuc2lvbnMgb2YgYSBsaWZlIGFuZCBsZWF2ZXMgb3RoZXJzIG91dC4KCkFuZCB3aGF0IHdhcyBub3QgbWVhc3VyZWQsIGNhdGVnb3Jpc2VkIG9yIGluY29ycG9yYXRlZCBpbnRvIGhlYWx0aGNhcmUgaW5mcmFzdHJ1Y3R1cmUgY2FuIGRpc2FwcGVhciBmcm9tIHRoZSBtb2RlbCBldmVuIGlmIGl0IG1hdGVyaWFsbHkgY29udHJpYnV0ZWQgdG8gdGhlIHByb2Nlc3MgdGhlIG1vZGVsIGlzIHRyeWluZyB0byBwcmVkaWN0LgoKIyMgQSBwcmVkaWN0aW9uIGFib3V0IGEgcGVyc29uIGNhbiBjaGFuZ2UgdGhlIHBlcnNvbgoKSGVyZSwgQ2FyaXNzYSBWw6lsaXrigJlzIHBoaWxvc29waHkgaW50cm9kdWNlcyBhIGRlY2lzaXZlIGRpZmZlcmVuY2UuCgpJbiAqUHJvcGhlY3k6IFByZWRpY3Rpb24sIFBvd2VyLCBhbmQgdGhlIEZpZ2h0IGZvciB0aGUgRnV0dXJlLCBmcm9tIEFuY2llbnQgT3JhY2xlcyB0byBBSSosIFbDqWxpeiAoMjAyNikgZXhhbWluZXMgdGhlIGxvbmcgc29jaWFsIGhpc3Rvcnkgb2YgcHJlZGljdGlvbiBhbmQgZHJhd3MgYXR0ZW50aW9uIHRvIGEgcGFydGljdWxhcmx5IGltcG9ydGFudCBwcm9wZXJ0eSB3aGVuIHBlb3BsZSBhcmUgdGhlIG9iamVjdCBvZiBwcmVkaWN0aW9uLiBQcmVkaWN0aW9ucyBjYW4gYWx0ZXIgZXhwZWN0YXRpb25zLCBkZWNpc2lvbnMgYW5kIGJlaGF2aW91ciBhbmQsIGluIGRvaW5nIHNvLCBoZWxwIHRyYW5zZm9ybSB3aGF0IHRoZXkgcHVycG9ydGVkIG1lcmVseSB0byBkZXNjcmliZS4KClRoZSBkaWZmZXJlbmNlIGZyb20gYSBwcm90ZWluIGlzIGZ1bmRhbWVudGFsLgoKSWYgYSBtb2RlbCBwcmVkaWN0cyB0aGUgc3RydWN0dXJlIG9mIGEgcHJvdGVpbiwgdGhlIHByb3RlaW4gZG9lcyBub3QgbGVhcm4gYWJvdXQgdGhlIHByZWRpY3Rpb24gYW5kIGRlY2lkZSB0byBmb2xkIGRpZmZlcmVudGx5IGluIHJlc3BvbnNlLgoKQSBjbGluaWNhbCBwcmVkaWN0aW9uLCBieSBjb250cmFzdCwgZW50ZXJzIGEgc29jaWFsIGNpcmN1aXQuIEl0IGNhbiBhbHRlciB0aGUgYmVoYXZpb3VyIG9mIHRoZSBwZXJzb24gd2hvIHJlY2VpdmVzIGl0LCBkZWNpc2lvbnMgbWFkZSBieSBoZWFsdGhjYXJlIHByb2Zlc3Npb25hbHMsIHRoZSBpbnRlbnNpdHkgb2YgbWVkaWNhbCBtb25pdG9yaW5nLCBpbnN1cmFuY2UgYXJyYW5nZW1lbnRzIG9yIHRoZSBpbnN0aXR1dGlvbmFsIGFsbG9jYXRpb24gb2YgcmVzb3VyY2VzLiBUaGUgcHJlZGljdGlvbiBiZWNvbWVzIHBhcnQgb2YgdGhlIGZ1dHVyZSBjb25kaXRpb25zIG9mIHdoYXQgaXQgc2Vla3MgdG8gYW50aWNpcGF0ZS4KCk5vdCBhbGwgcHJlZGljdGlvbnMgdGhlcmVmb3JlIGhhdmUgdGhlIHNhbWUgc3RhdHVzLgoKQSBtb2xlY3VsYXIgcHJlZGljdGlvbiBjYW4gYmUgYXNzZXNzZWQgcHJpbWFyaWx5IGJ5IGl0cyBjb3JyZXNwb25kZW5jZSB3aXRoIGEgcGh5c2ljYWwgcGhlbm9tZW5vbi4gQSBwcmVkaWN0aW9uIGFib3V0IGEgcGVyc29uIGNhbiBhZGRpdGlvbmFsbHkgYWNxdWlyZSAqKnBlcmZvcm1hdGl2ZSBlZmZlY3RzKiouCgpUaGlzIG1ha2VzIHRoZSBjb252ZXJzaW9uIG9mIHByb2JhYmlsaXRpZXMgaW50byBpZGVudGl0aWVzIHBhcnRpY3VsYXJseSBkYW5nZXJvdXMuIEEgcmlzayBzY29yZSBkb2VzIG5vdCBzYXkgd2hvIGEgcGVyc29uIGlzLCBub3IgZG9lcyBpdCBuZWNlc3NhcmlseSBkZXNjcmliZSB3aGF0IHdpbGwgaGFwcGVuIHRvIHRoZW0uIEl0IGV4cHJlc3NlcyBhbiBpbmZlcmVuY2UgcHJvZHVjZWQgZnJvbSBwYXJ0aWN1bGFyIGRhdGEsIGNhdGVnb3JpZXMgYW5kIHJlZmVyZW5jZSBwb3B1bGF0aW9ucy4KClbDqWxpeiAoMjAyNikgdGhlcmVmb3JlIHR1cm5zIGFuIGVwaXN0ZW1vbG9naWNhbCBwcm9ibGVtIGludG8gYSBxdWVzdGlvbiBvZiBwb3dlci4gUHJlZGljdGlvbiBpcyBub3Qgb25seSBhYm91dCBkZXNjcmliaW5nIHBvc3NpYmxlIGZ1dHVyZXM7IGl0IGNhbiBhbHNvIGRpc3RyaWJ1dGUgdGhlIGNhcGFjaXR5IHRvIG1ha2UgZGVjaXNpb25zIGFib3V0IHRoZW0uCgojIyBCZXR0ZXIgcHJlZGljdGlvbiBhbHNvIG1lYW5zIGtub3dpbmcgd2hlcmUgbm90IHRvIGdlbmVyYWxpc2UKCkV4cGxhaW5hYmlsaXR5IGFuZCBiaWFzIGFyZSBub3Qgb2JqZWN0aW9ucyBpbXBvc2VkIGZyb20gb3V0c2lkZSBieSB0aGUgc29jaWFsIHNjaWVuY2VzIHVwb24gYSBiaW9tZWRpY2luZSBpbmRpZmZlcmVudCB0byBpdHMgb3duIGxpbWl0cy4KClRoZXkgYXJlIHBhcnQgb2YgVmFsZW5jaWHigJlzIG93biByZXNlYXJjaC4KCkNpcmlsbG8gYW5kIGNvbGxlYWd1ZXMgKDIwMjApLCB3aXRoIEFsZm9uc28gVmFsZW5jaWEgYW1vbmcgdGhlIGF1dGhvcnMsIGFuYWx5c2VkIHNleCBhbmQgZ2VuZGVyIGRpZmZlcmVuY2VzIGFuZCBiaWFzZXMgaW4gYXJ0aWZpY2lhbCBpbnRlbGxpZ2VuY2UgZm9yIGJpb21lZGljaW5lIGFuZCBoZWFsdGhjYXJlLiBUaGUgc3R1ZHkgd2FybnMgdGhhdCBpZ25vcmluZyB0aGVzZSBkaW1lbnNpb25zIGNhbiBwcm9kdWNlIHN1Ym9wdGltYWwgb3V0Y29tZXMsIGVycm9ycyBhbmQgZGlzY3JpbWluYXRvcnkgZWZmZWN0cy4gSXQgYWxzbyBlbXBoYXNpc2VzIHRoZSBpbXBvcnRhbmNlIG9mIGFwcHJvcHJpYXRlIGRhdGFzZXRzIGFuZCBleHBsYWluYWJsZSBBSSB0b29scyBpbiBtb3ZpbmcgdG93YXJkcyBwZXJzb25hbGlzZWQgbWVkaWNpbmUgdGhhdCBkb2VzIG5vdCBhbXBsaWZ5IGV4aXN0aW5nIGluZXF1YWxpdGllcy4KCkl0IGlzIHRoZXJlZm9yZSBub3QgZW5vdWdoIHRvIGluY3JlYXNlIHRoZSBhdmVyYWdlIGFjY3VyYWN5IG9mIGEgcHJlZGljdGlvbi4gV2UgYWxzbyBuZWVkIHRvIGtub3cgdGhlIGNvbmRpdGlvbnMgdW5kZXIgd2hpY2ggaXQgY2FuIGZhaWwsIHdoaWNoIHBvcHVsYXRpb25zIGFyZSByZXByZXNlbnRlZCwgd2hhdCBjYXRlZ29yaWVzIHRoZSBzeXN0ZW0gdXNlcyBhbmQgd2hhdCBkZWdyZWUgb2YgY29uZmlkZW5jZSBjYW4gYmUgcGxhY2VkIGluIGl0cyByZXN1bHRzLgoKVGhpcyBjb25jZXJuIGNvbm5lY3RzIHZlcnkgZGlmZmVyZW50IG1vbWVudHMgaW4gVmFsZW5jaWHigJlzIHdvcmsuIEluIDIwMDAsIGl0IGFwcGVhcmVkIGFzIGEgbGltaXQgb24gcHJlZGljdGluZyBwcm90ZWluIGZ1bmN0aW9uIChEZXZvcyAmIFZhbGVuY2lhLCAyMDAwKS4gSW4gdGhlIGNvbW11bml0eSBhc3Nlc3NtZW50IG9mIEFscGhhRm9sZCwgaXQgcmVhcHBlYXJzIGluIHRoZSBuZWVkIHRvIGludGVycHJldCBjb25maWRlbmNlIG1ldHJpY3MgY3JpdGljYWxseSAoQWtkZWwgZXQgYWwuLCAyMDIyKS4gSW4gYmlvbWVkaWNhbCBBSSwgaXQgYmVjb21lcyBhIHF1ZXN0aW9uIG9mIHJlcHJlc2VudGF0aW9uLCBleHBsYWluYWJpbGl0eSBhbmQgZXF1aXR5IGFzIHdlbGwgKENpcmlsbG8gZXQgYWwuLCAyMDIwKS4KCioqQmV0dGVyIHByZWRpY3Rpb24gYWxzbyBtZWFucyBsZWFybmluZyB3aGVyZSB3ZSBzaG91bGQgbm90IGdlbmVyYWxpc2UuKioKCiMjIEZyb20gdHVtb3VyIHRvIGRpZ2l0YWwgdHdpbgoKTXVsdGlzY2FsZSBtb2RlbHMgcmV2ZWFsIGFub3RoZXIgYm91bmRhcnkuCgpQb25jZS1kZS1MZW9uIGFuZCBjb2xsZWFndWVzICgyMDIyKSwgd2l0aCBWYWxlbmNpYSBhbW9uZyB0aGUgYXV0aG9ycywgZGV2ZWxvcGVkIGEgbXVsdGlzY2FsZSB0dW1vdXItZ3Jvd3RoIG1vZGVsIHRvIGV4cGxvcmUgdHJlYXRtZW50IHNjaGVkdWxlcyBhbmQgdGhlIGVtZXJnZW5jZSBvZiByZXNpc3RhbmNlLiBUaGUgYWltIHdhcyBub3QgdG8gcHJvZHVjZSBhIGNvbXBsZXRlIHJlcGxpY2Egb2YgYSBwZXJzb24sIGJ1dCB0byByZXByZXNlbnQgcGFydGljdWxhciB0dW1vdXIgcHJvY2Vzc2VzIGFuZCBleHBlcmltZW50IGNvbXB1dGF0aW9uYWxseSB3aXRoIHRoZWlyIHBvc3NpYmxlIHJlc3BvbnNlcy4KClRoYXQgZGlzdGluY3Rpb24gaXMgZXNzZW50aWFsIHdoZW4gZGlzY3Vzc2luZyBkaWdpdGFsIHR3aW5zLgoKQSBtb2RlbCBjYW4gaW5jb3Jwb3JhdGUgY2FzZS1zcGVjaWZpYyBpbmZvcm1hdGlvbiBhbmQgc2ltdWxhdGUgcGFydGljdWxhciBiaW9sb2dpY2FsIGJlaGF2aW91cnMgd2l0aG91dCB0aGVyZWJ5IGJlY29taW5nIGEgY29tcGxldGUgY29weSBvZiB0aGUgcGVyc29uLgoKVGhlIGRpZmZpY3VsdHkgZ3Jvd3Mgd2l0aCBldmVyeSBjaGFuZ2Ugb2Ygc2NhbGUuIEEgcHJvdGVpbiBzdHJ1Y3R1cmUgY2FuIGJlIGRlbGltaXRlZCB3aXRoIHJlbGF0aXZlIGNsYXJpdHkuIEEgY2VsbCBpbnZvbHZlcyBtb2xlY3VsYXIgbmV0d29ya3MgYW5kIHJlbGF0aW9uc2hpcHMgd2l0aCBpdHMgbWljcm9lbnZpcm9ubWVudC4gQSB0aXNzdWUgaW50cm9kdWNlcyBpbnRlcmFjdGlvbnMgYmV0d2VlbiBjZWxsIHBvcHVsYXRpb25zLiBBbiBvcmdhbmlzbSByZXF1aXJlcyB0aGUgaW50ZWdyYXRpb24gb2YgZGlzdGluY3Qgc3lzdGVtcywgdGVtcG9yYWxpdGllcyBhbmQgZW52aXJvbm1lbnRhbCBjb25kaXRpb25zLgoKV2hlbiB3ZSByZWFjaCBhIHBlcnNvbiwgdGhlIHByb2JsZW0gaXMgbm8gbG9uZ2VyIHNpbXBseSBvbmUgb2YgYWRkaW5nIGVub3VnaCB2YXJpYWJsZXMuCgpBIHBlcnNvbiBpbnRlcnByZXRzLCBsZWFybnMsIHJlbWVtYmVycywgZXN0YWJsaXNoZXMgcmVsYXRpb25zaGlwcywgbW9kaWZpZXMgdGhlaXIgZW52aXJvbm1lbnQgYW5kIGlzIG1vZGlmaWVkIGJ5IGl0LiBUaGV5IG1heSBldmVuIGNoYW5nZSB0aGVpciBiZWhhdmlvdXIgYmVjYXVzZSB0aGV5IGtub3cgYWJvdXQgYSBwcmVkaWN0aW9uIGNvbmNlcm5pbmcgdGhlaXIgb3duIGZ1dHVyZS4KClRoYXQgcmVsYXRpb25hbCBjaGFyYWN0ZXIgaXMgYWxzbyBjZW50cmFsIHRvIFJhbcOtcmV6IEdvaWNvZWNoZWEgKDIwMTMpLiBUaGUgaHVtYW4gbWluZCBhbmQgdGhlIGNhcGFjaXRpZXMgYXNzb2NpYXRlZCB3aXRoIGh1bWFuaXNhdGlvbiBkbyBub3QgZW1lcmdlIG91dHNpZGUgdGhlIHByb2Nlc3NlcyBvZiBhdHRhY2htZW50LCBjb21tdW5pY2F0aW9uLCBsZWFybmluZyBhbmQgaW50ZXJzdWJqZWN0aXZpdHkgdGhyb3VnaCB3aGljaCBhIHBlcnNvbiBkZXZlbG9wcy4KCiMjIFNwZWFraW5nIGFuZCB0aGlua2luZyBhcmUgbm90IG1lcmVseSBzZXF1ZW5jZXMKClRoZSBhbmFsb2d5IGJldHdlZW4gbGFuZ3VhZ2UgYW5kIHByb3RlaW5zIGJlY29tZXMgZXZlbiBtb3JlIGludGVyZXN0aW5nIHdoZW4gd2UgcmV0dXJuIHRvIGh1bWFuIGxhbmd1YWdlLgoKSW4gKkhhYmxhciB5IHBlbnNhciwgdGFyZWFzIGN1bHR1cmFsZXM6IFRlbWFzIGRlIGFudHJvcG9sb2fDrWEgbGluZ8O8w61zdGljYSB5IGFudHJvcG9sb2fDrWEgY29nbml0aXZhKiBbU3BlYWtpbmcgYW5kIHRoaW5raW5nLCBjdWx0dXJhbCB0YXNrczogVG9waWNzIGluIGxpbmd1aXN0aWMgYW5kIGNvZ25pdGl2ZSBhbnRocm9wb2xvZ3ldLCBIb25vcmlvIFZlbGFzY28gTWFpbGxvICgyMDEzKSBhcHByb2FjaGVzIHRoZSBvcmlnaW5zIG9mIGxhbmd1YWdlIHRocm91Z2ggaXRzIGJpb2xvZ2ljYWwgZGltZW5zaW9ucyDigJQgdGhlIGJyYWluIGFuZCB2b2NhbCB0cmFjdCDigJQgYnV0IGFsc28gdGhyb3VnaCB0aGUgc29jaWFsIGdyb3VwLCBpbnRlcmFjdGlvbiwgc29jaWFiaWxpdHksIHRvb2xzLCBzeW1ib2xzLCBzcGVlY2ggY29tbXVuaXRpZXMgYW5kIGxpbmd1aXN0aWMgZGl2ZXJzaXR5LgoKVGhlIGJyYWluIGlzIG5lY2Vzc2FyeSBmb3Igc3BlYWtpbmcuCgpCdXQgYW4gaXNvbGF0ZWQgYnJhaW4gZG9lcyBub3QgZXhwbGFpbiBsYW5ndWFnZS4KClRoaXMgb2JzZXJ2YXRpb24gYWxsb3dzIHVzIHRvIHJldHVybiB0byBwcm90ZWluIGxhbmd1YWdlIG1vZGVscyBmcm9tIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb24uIFRoZWlyIHN1Y2Nlc3Mgc2hvd3MgdGhhdCB0cmVhdGluZyBhIGJpb2xvZ2ljYWwgc2VxdWVuY2UgKiphcyBpZiBpdCB3ZXJlIGEgbGFuZ3VhZ2UgZm9yIGNvbXB1dGF0aW9uYWwgcHVycG9zZXMqKiBjYW4gYmUgZXh0cmFvcmRpbmFyaWx5IHByb2R1Y3RpdmUuIEl0IGRvZXMgbm90IGRlbW9uc3RyYXRlIHRoYXQgaHVtYW4gbGFuZ3VhZ2UgY2FuIGJlIHJlZHVjZWQgdG8gYW4gZXF1aXZhbGVudCBzZXF1ZW5jZS4KCkluIGEgcHJvdGVpbiwgZGVwZW5kZW5jaWVzIGJldHdlZW4gcG9zaXRpb25zIGFyaXNlIGZyb20gYmlvcGh5c2ljYWwsIGZ1bmN0aW9uYWwgYW5kIGV2b2x1dGlvbmFyeSBjb25zdHJhaW50cy4gSHVtYW4gbGFuZ3VhZ2UgYWxzbyBpbnZvbHZlcyBpbnRlbnRpb24sIGNvbnZlbnRpb25zLCBzb2NpYWwgcmVsYXRpb25zaGlwcywgaGlzdG9yeSwgcHJhZ21hdGljcyBhbmQgc2hhcmVkIGNvbnRleHRzLiBXb3JkcyBkbyBub3QgbWVhbiBvbmx5IGJlY2F1c2Ugb2Ygd2hlcmUgdGhleSBhcHBlYXIgaW4gYSBzdHJpbmcuCgpXZSBjYW4gcmVjb3JkIHdvcmRzLCB0b2tlbmlzZSB0aGVtIGFuZCBsZWFybiB0aGVpciBzdGF0aXN0aWNhbCByZWd1bGFyaXRpZXMuIExMTXMgZGVtb25zdHJhdGUgaG93IG11Y2ggc3RydWN0dXJlIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSB0aGF0IHByb2NlZHVyZS4KCkJ1dCB0aGUgYWJpbGl0eSB0byBwcmVkaWN0IGxpbmd1aXN0aWMgc2VxdWVuY2VzIGRvZXMgbm90IGV4aGF1c3Qgd2hhdCBpdCBtZWFucyB0byBzcGVhay4KClZlbGFzY28gdGhlcmVmb3JlIGVuYWJsZXMgdXMgdG8gaW52ZXJ0IHRoZSBtZXRhcGhvci4gVGhlIGNvbmNsdXNpb24gaXMgbm90IHRoYXQgcHJvdGVpbnMgYXJlIGxhbmd1YWdlLCBidXQgdG8gYXNrIHdoeSAqKnRoZSBpZGVhIG9mIGxhbmd1YWdlIHdvcmtzIHNvIHdlbGwgYXMgYSBjb21wdXRhdGlvbmFsIHRvb2wgaW4gYmlvbG9neSB3aGlsZSByZW1haW5pbmcgaW5zdWZmaWNpZW50IHRvIGV4cGxhaW4gaHVtYW4gbGFuZ3VhZ2UgaW4gZnVsbCoqLgoKIyMgU3ludGhldGljIGRhdGEgYW5kIHRoZSBxdWVzdGlvbiBvZiBmaWRlbGl0eQoKVGhlIHNhbWUgcHJvYmxlbSByZWFwcGVhcnMgd2l0aCBzeW50aGV0aWMgZGF0YS4KCkEgcmV2aWV3IGRldmVsb3BlZCB3aXRoaW4gRUxJWElSIGFuZCBjby1hdXRob3JlZCBieSBBbGZvbnNvIFZhbGVuY2lhIGV4YW1pbmVzIHRoZSBncm93aW5nIHVzZSBvZiBzeW50aGV0aWMgZGF0YSBpbiB0aGUgbGlmZSBzY2llbmNlcy4gU3ludGhldGljIGRhdGFzZXRzIGNhbiBoZWxwIGFkZHJlc3Mgc2NhcmNpdHksIHByaXZhY3kgY29uc3RyYWludHMgb3IgbGltaXRlZCBhY2Nlc3MgdG8gcmVhbC13b3JsZCBkYXRhLCBidXQgdGhlaXIgdXNlZnVsbmVzcyBkZXBlbmRzIG9uIGV2YWx1YXRpbmcgd2hldGhlciB0aGV5IHByZXNlcnZlIHRoZSByZWxldmFudCBwcm9wZXJ0aWVzIG9mIHRoZSBwaGVub21lbm9uIHRoZXkgYXJlIGludGVuZGVkIHRvIHJlcHJlc2VudC4gVGhlIHJldmlldyBub3RlcyB0aGF0IGdlbmVyYXRpb24gdGVjaG5pcXVlcyBhcmUgYWR2YW5jaW5nIHJhcGlkbHkgd2hpbGUgc3RhbmRhcmRpc2VkIHByb2NlZHVyZXMgZm9yIG1lYXN1cmluZyBmaWRlbGl0eSwgdXRpbGl0eSBhbmQgcmVsaWFiaWxpdHkgcmVtYWluIGluc3VmZmljaWVudCBpbiBtYW55IGRvbWFpbnMgKEZyYWdrb3VsaSBldCBhbC4sIDIwMjYpLgoKVGhlIHF1ZXN0aW9uIGlzIHRlY2huaWNhbCwgYnV0IGl0IGlzIGFsc28gZXBpc3RlbW9sb2dpY2FsLgoKQSBzeW50aGV0aWMgZGF0YXNldCBkb2VzIG5vdCBuZWVkIHRvIHJlcHJvZHVjZSBldmVyeSBkZXRhaWwgb2YgdGhlIG9yaWdpbmFsLiBJdCBuZWVkcyB0byBwcmVzZXJ2ZSB3aGF0IGlzIGRlZW1lZCByZWxldmFudCBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuCgpUaGUgcXVlc3Rpb24sIHRoZXJlZm9yZSwgaXMgbm90IHNpbXBseSB3aGV0aGVyIGEgc2ltdWxhdGlvbiBhcHBlYXJzIHJlYWxpc3RpYywgYnV0ICoqd2hvIGRlZmluZXMgd2hpY2ggcHJvcGVydGllcyBpdCBtdXN0IHByZXNlcnZlIGluIG9yZGVyIHRvIGNvdW50IGFzIHZhbGlkKiouCgpUaGUgc2FtZSBkaWxlbW1hIGFwcGVhcnMgYXQgZGlmZmVyZW50IHNjYWxlcyBpbiBhIHByZWRpY3RlZCBwcm90ZWluIHN0cnVjdHVyZSwgYSBzaW11bGF0ZWQgdHVtb3VyLCBhIHN5bnRoZXRpYyBjbGluaWNhbCBjb2hvcnQgb3IgYSBwb3NzaWJsZSBodW1hbiBkaWdpdGFsIHR3aW4uCgpNYWtpbmcgc29tZXRoaW5nIGNvbXB1dGF0aW9uYWxseSBsZWdpYmxlIHJlcXVpcmVzIGRlY2lkaW5nIHdoYXQgY2FuIGJlIG9taXR0ZWQuCgojIyBMZWdpYmlsaXR5LCBwb3dlciBhbmQgZ292ZXJuYW5jZQoKRXZlcnkgZGF0YWJhc2UgaXMgYWxzbyBhIHNlbGVjdGlvbi4KCkZvciBhIG1hY2hpbmUgdG8gYW5hbHlzZSBhIHJlYWxpdHksIHRoYXQgcmVhbGl0eSBoYXMgdG8gYmUgdHJhbnNsYXRlZCBpbnRvIHZhcmlhYmxlcywgc2VxdWVuY2VzLCBpbWFnZXMsIGNhdGVnb3JpZXMsIGxhYmVscyBhbmQgcXVhbnRpZmlhYmxlIHJlbGF0aW9uc2hpcHMuIFRoaXMgdHJhbnNsYXRpb24gY2FuIGJlIGV4dHJlbWVseSB1c2VmdWwsIGJ1dCBpdCBpcyBuZWl0aGVyIHRyYW5zcGFyZW50IG5vciBwb2xpdGljYWxseSBuZXV0cmFsLgoKSWduYWNpbyBJdHVycmFsZGUgQmxhbmNv4oCZcyBwb2xpdGljYWwgYW5kIGxlZ2FsIGFudGhyb3BvbG9neSBvZmZlcnMgYW5vdGhlciBwb2ludCBvZiBzdXBwb3J0IGhlcmUsIGFsdGhvdWdoIHRoZSBjb25uZWN0aW9uIHdpdGggQUkgaXMgYWdhaW4gb3Vycy4KCkluIGhpcyBhbmFseXNpcyBvZiB0aGUgTWl4ZSBub3JtYXRpdmUgc3lzdGVtIGFuZCBjb25mbGljdHMgYmV0d2VlbiBJbmRpZ2Vub3VzIGF1dG9ub215IGFuZCBzdGF0ZSBsYXcsIEl0dXJyYWxkZSBCbGFuY28gKDIwMTEpIHNob3dzIGhvdyBhIGRvbWluYW50IG5vcm1hdGl2ZSBvcmRlciBjYW4gbmFtZSwgY2xhc3NpZnkgYW5kIG9ubHkgcGFydGlhbGx5IHJlY29nbmlzZSBsb2NhbCBzeXN0ZW1zIHdob3NlIGxvZ2ljcyBkbyBub3QgZnVsbHkgY29pbmNpZGUgd2l0aCBzdGF0ZSBjYXRlZ29yaWVzLiBUaGUgcHJvYmxlbSBpcyBub3QgY29tcHV0YXRpb25hbCwgYnV0IGl0IHNoYXJlcyBhIGZ1bmRhbWVudGFsIHF1ZXN0aW9uIHdpdGggZGF0YSBnb3Zlcm5hbmNlLiAqKldobyBoYXMgdGhlIGF1dGhvcml0eSB0byBkZWZpbmUgdGhlIGNhdGVnb3JpZXMgdGhyb3VnaCB3aGljaCBhIHJlYWxpdHkgYmVjb21lcyBhZG1pbmlzdHJhdGl2ZWx5IGxlZ2libGU/KioKClRoZSBpc3N1ZSBpcyBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IGluIGJpb21lZGljaW5lLgoKU28gZmFyLCBtYW55IG9mIHRoZSBtb3N0IHZpc2libGUgY2FzZXMgY29tZSBmcm9tIG1ham9yIGluZnJhc3RydWN0dXJlcyBpbiB0aGUgR2xvYmFsIE5vcnRoLCBpbmNsdWRpbmcgRGVlcE1pbmQsIHRoZSBCYXJjZWxvbmEgU3VwZXJjb21wdXRpbmcgQ2VudGVyLCBVSyBCaW9iYW5rIGFuZCBFdXJvcGVhbiBoZWFsdGggcmVjb3Jkcy4gVGhlIGdlb2dyYXBoeSBvZiBkYXRhIG1hdHRlcnMuCgpUaGUgQUdlbkRBIHByb2plY3QgcHJvdmlkZXMgYSBzaWduaWZpY2FudCBjb3VudGVycG9pbnQuIEFzIHBhcnQgb2YgSDNBZnJpY2EsIGl0IGJlZ2lucyBmcm9tIGFuIGV4cGxpY2l0IG9ic2VydmF0aW9uLiBBZnJpY2FuIHBvcHVsYXRpb25zIHJlbWFpbiBzdWJzdGFudGlhbGx5IHVuZGVycmVwcmVzZW50ZWQgaW4gZ2xvYmFsIGdlbm9taWMgcmVzZWFyY2ggYW5kIGRhdGFiYXNlcyBkZXNwaXRlIHRoZSBjb250aW5lbnTigJlzIGV4dHJhb3JkaW5hcnkgZ2VuZXRpYyBkaXZlcnNpdHkuIEFHZW5EQSBpZGVudGlmaWVkIHVuZGVycmVwcmVzZW50ZWQgZ3JvdXBzIGluIG5pbmUgQWZyaWNhbiBjb3VudHJpZXMgZm9yIHdob2xlLWdlbm9tZSBzZXF1ZW5jaW5nIGFuZCBpbmNvcnBvcmF0ZWQgY29tbXVuaXR5IGVuZ2FnZW1lbnQsIGV0aGljYWwgYXBwcm92YWwsIGNvbXBsaWFuY2Ugd2l0aCBuYXRpb25hbCBsZWdpc2xhdGlvbiBhbmQgYSBzaGFyZWQgZ292ZXJuYW5jZSBmcmFtZXdvcmsuIFRoZSBwcm9qZWN0IGlzIGxlZCBmcm9tIEFmcmljYSBieSBBZnJpY2FuIHRlYW1zIHRoYXQgcGFydGljaXBhdGUgaW4gZGVjaXNpb25zIGFib3V0IGRhdGEgc2hhcmluZyAoUmFtc2F5IGV0IGFsLiwgMjAyNikuCgpUaGUgY2FzZSBhbGxvd3MgdXMgdG8gcmVmb3JtdWxhdGUgdGhlIHF1ZXN0aW9uIG9mIGFsZ29yaXRobWljIGxlZ2liaWxpdHkuCgoqKkEgcG9wdWxhdGlvbiB0aGF0IGlzIGJhcmVseSBwcmVzZW50IGluIHRoZSBkYXRhIGlzIG5vdCBlcXVhbGx5IGxlZ2libGUgdG8gdGhlIG1vZGVsLioqCgpCdXQgY29ycmVjdGluZyB0aGF0IGFic2VuY2UgaXMgbm90IHNpbXBseSBhIG1hdHRlciBvZiBleHRyYWN0aW5nIG1vcmUgZGF0YS4KCkl0IGFsc28gcmVxdWlyZXMgYXNraW5nIHdobyBjb2xsZWN0cyB0aGUgZGF0YSwgd2hlcmUgaXQgaXMgc3RvcmVkLCB3aG8gZGV0ZXJtaW5lcyB0aGUgY29uZGl0aW9ucyBvZiByZXVzZSwgd2hpY2ggaW5zdGl0dXRpb25zIHN1YnNlcXVlbnRseSBkZXZlbG9wIHRoZSBtb2RlbHMgYW5kIGhvdyBwb3RlbnRpYWwgYmVuZWZpdHMgcmV0dXJuIHRvIHRoZSBjb21tdW5pdGllcyB0aGF0IG1hZGUgdGhlIGtub3dsZWRnZSBwb3NzaWJsZS4KCkNvdWxkcnkgYW5kIE1lamlhc+KAmXMgKDIwMTkpIGNvbmNlcHQgb2YgKmRhdGEgY29sb25pYWxpc20qIGNhbiBzZXJ2ZSBoZXJlIGFzIGEgZnJhbWV3b3JrIGZvciBjYXV0aW9uLCBub3QgYXMgYW4gYXV0b21hdGljIGxhYmVsLiBOb3QgZXZlcnkgY29sbGVjdGlvbiBvZiBiaW9tZWRpY2FsIGluZm9ybWF0aW9uIGNvbnN0aXR1dGVzIGEgY29sb25pYWwgcmVsYXRpb25zaGlwLiBCdXQgd2hlbiBkaWZmZXJlbnQgZGltZW5zaW9ucyBvZiBsaWZlIGFyZSBzeXN0ZW1hdGljYWxseSB0cmFuc2Zvcm1lZCBpbnRvIGFwcHJvcHJpYWJsZSByZXNvdXJjZXMgZm9yIGNsYXNzaWZpY2F0aW9uLCBwcmVkaWN0aW9uIGFuZCB2YWx1ZSBnZW5lcmF0aW9uLCB0aGUgcG93ZXIgcmVsYXRpb25zIG9yZ2FuaXNpbmcgdGhhdCB0cmFuc2Zvcm1hdGlvbiBhbHNvIGJlY29tZSBwYXJ0IG9mIHRoZSBvYmplY3Qgb2Ygc3R1ZHkuCgpQZXJzb25hbGlzZWQgbWVkaWNpbmUgZG9lcyBub3QgYmVnaW4gb3IgZW5kIHdpdGggdGhlIGFsZ29yaXRobS4KCiMjIFdoYXQgd2UgdGhpbmsgd2UgYXJlIGV4cGxhaW5pbmcgd2hlbiB0aGUgbW9kZWwgZ2V0cyBpdCByaWdodAoKVGhlIHBhdGggZnJvbSB0aGUgbGltaXRzIG9mIGZ1bmN0aW9uYWwgcHJlZGljdGlvbiB0aHJvdWdoIHByb3RlaW4gbGFuZ3VhZ2UgbW9kZWxzLCBBbHBoYUZvbGQsIEFscGhhR2Vub21lLCBjbGluaWNhbCB0cmFqZWN0b3JpZXMsIHNpbXVsYXRlZCB0dW1vdXJzIGFuZCBzeW50aGV0aWMgZGF0YSByZXZlYWxzIHNvbWV0aGluZyBtb3JlIGludGVyZXN0aW5nIHRoYW4gYSBzdWNjZXNzaW9uIG9mIHRlY2hub2xvZ2ljYWwgYWR2YW5jZXMuCgpFYWNoIGNoYW5nZSBvZiBzY2FsZSBhbHNvIGNoYW5nZXMgdGhlIGtpbmQgb2YgcHJvYmxlbS4KCkluIHByb3RlaW5zLCBtaWxsaW9ucyBvZiB5ZWFycyBvZiBldm9sdXRpb24gaGF2ZSBwcm9kdWNlZCBhbiBpbW1lbnNlIGNvcnB1cyBvZiBzZXF1ZW5jZXMgc3ViamVjdGVkIHRvIGNvbnN0cmFpbnRzIHRoYXQgbW9kZWxzIGNhbiBsZWFybi4gVHJhbnNmb3JtZXJzIGFuZCBwcm90ZWluIGxhbmd1YWdlIG1vZGVscyBhcmUgcGFydGljdWxhcmx5IGVmZmVjdGl2ZSBwcmVjaXNlbHkgYmVjYXVzZSB0aG9zZSBzZXF1ZW5jZXMgY29udGFpbiBjb250ZXh0dWFsLCBldm9sdXRpb25hcnkgYW5kIHN0cnVjdHVyYWwgcmVndWxhcml0aWVzLgoKQnV0IGEgcGVyc29uIGlzIG5vdCBzaW1wbHkgYSBsb25nZXIgc2VxdWVuY2UuCgpSYW3DrXJleiBHb2ljb2VjaGVhIGhlbHBzIGV4cGxhaW4gd2h5IHRoZSBnZW5vbWUgaXMgbm90IGVub3VnaC4gRGV2ZWxvcG1lbnQgaXMgY29uc3RpdHV0aXZlLiBWZWxhc2NvIE1haWxsbyBzaG93cyB3aHkgbGFuZ3VhZ2UgYW5kIHRob3VnaHQgY2Fubm90IGJlIGV4aGF1c3RlZCBieSBmb3JtYWwgcmVsYXRpb25zIGFtb25nIHNpZ25zLiBGcmFuY2VzY2ggRMOtYXogb2ZmZXJzIGEgd2FybmluZyBhYm91dCBleHRlbmRpbmcgcGFyYWRpZ21zIGJleW9uZCB0aGUgZG9tYWlucyBpbiB3aGljaCB0aGV5IGRlbW9uc3RyYXRlZCB0aGVpciBlZmZlY3RpdmVuZXNzLiBWw6lsaXogYWRkcyBhIGRlY2lzaXZlIGRpZmZlcmVuY2UuIFByZWRpY3Rpb25zIGFib3V0IHBlb3BsZSBjYW4gaW50ZXJ2ZW5lIGluIHRoZSBjb25kaXRpb25zIG9mIHdoYXQgdGhleSBwcmVkaWN0LiBJdHVycmFsZGUgQmxhbmNvIGFsbG93cyB1cyB0byBpbnRyb2R1Y2UgdGhlIHF1ZXN0aW9uIG9mIHdobyBkZWZpbmVzIGNhdGVnb3JpZXMgYW5kIHJlZ2ltZXMgb2YgcmVjb2duaXRpb24uIEFuZCBWYWxlbmNpYeKAmXMgd29yayBzaG93cywgZnJvbSB3aXRoaW4gYmlvaW5mb3JtYXRpY3MsIGJvdGggdGhlIHBvd2VyIG9mIHByZWRpY3Rpb24gYW5kIHRoZSBuZWVkIHRvIGludGVycHJldCwgdmFsaWRhdGUgYW5kIGRlbGltaXQgaXRzIHJlc3VsdHMuCgpUaGUgbW9zdCBwcm9kdWN0aXZlIHF1ZXN0aW9uIG1heSB0aGVyZWZvcmUgbm90IGJlIHdoZXRoZXIgYXJ0aWZpY2lhbCBpbnRlbGxpZ2VuY2Ug4oCYdW5kZXJzdGFuZHPigJkgbGlmZS4KClRoZXJlIGlzIGFuIGVhcmxpZXIgcXVlc3Rpb24uCgoqKldoYXQgdmVyc2lvbiBvZiBsaWZlIGhhdmUgd2UgaGFkIHRvIGNvbnN0cnVjdCBpbiBvcmRlciBmb3IgYSBtYWNoaW5lIHRvIHByZWRpY3QgaXQ/KioKCkFJIGNhbiBtYWtlIGNlcnRhaW4gZGltZW5zaW9ucyBvZiBvdXIgb3JnYW5pc21zIGV4dHJhb3JkaW5hcmlseSBsZWdpYmxlLiBUaGF0IGNhcGFjaXR5IGlzIGFscmVhZHkgdHJhbnNmb3JtaW5nIHNjaWVudGlmaWMgcmVzZWFyY2ggYW5kIG1lZGljaW5lLgoKQnV0IGEgbGlmZSBpcyBub3QgbWVyZWx5IHdoYXQgd2UgaGF2ZSBtYW5hZ2VkIHRvIHJlY29yZCBhYm91dCBpdC4KCkFuZCBhIHByZWRpY3Rpb24gYWJvdXQgYSBwZXJzb24gZG9lcyBub3QgbWVyZWx5IHRyeSB0byBhbnRpY2lwYXRlIHRoZSBmdXR1cmUuIEl0IGNhbiBiZWNvbWUgb25lIG9mIHRoZSBmb3JjZXMgdGhhdCBoZWxwcyBwcm9kdWNlIGl0LgoKUGVyaGFwcyB0aGUgcmVhbCBjaGFsbGVuZ2Ugb2YgZnV0dXJlIGRpZ2l0YWwgdHdpbnMgd2lsbCBub3QgYmUgdG8gcGxhY2UgYW4gZW50aXJlIHBlcnNvbiBpbnNpZGUgYSBjb21wdXRlciwgYnV0IHRvIHJlY29nbmlzZSBwcmVjaXNlbHkgKip3aGF0IHdlIGhhZCB0byBsZWF2ZSBvdXQgaW4gb3JkZXIgdG8gc2F5IHRoYXQgdGhlIG1vZGVsIHdvcmtzLCBhbmQgd2hhdCBlZmZlY3RzIHRoZSBtb2RlbCBtYXkgcHJvZHVjZSB3aGVuIGl0IHJldHVybnMgdG8gdGhlIHdvcmxkKiouCgojIyBRdWVzdGlvbnMgdG8ga2VlcCB0aGlua2luZyB3aXRoCgotIFdoYXQgaXMgdGhlIGVwaXN0ZW1vbG9naWNhbCBkaWZmZXJlbmNlIGJldHdlZW4gcHJlZGljdGluZyB0aGUgc3RydWN0dXJlIG9mIGEgcHJvdGVpbiBhbmQgcHJlZGljdGluZyB0aGUgdHJhamVjdG9yeSBvZiBhIHBlcnNvbj8KLSBXaGljaCBkaW1lbnNpb25zIG9mIGEgYmlvZ3JhcGh5IGRpc2FwcGVhciB3aGVuIGEgbGlmZSB0cmFqZWN0b3J5IGJlY29tZXMgYSBkYXRhIHRyYWplY3Rvcnk/Ci0gV2hlbiBkb2VzIGEgcHJlZGljdGlvbiBzdG9wIGRlc2NyaWJpbmcgYSBwb3NzaWJsZSBmdXR1cmUgYW5kIGJlZ2luIHRvIGhlbHAgcHJvZHVjZSBpdD8KLSBXaG8gc2hvdWxkIGRlY2lkZSB3aGF0IGEgZGlnaXRhbCBtb2RlbCBuZWVkcyB0byBjb250YWluIGluIG9yZGVyIHRvIHJlcHJlc2VudCBhbiBvcmdhbmlzbSBvciBhIHBlcnNvbiB2YWxpZGx5PwoKIyMgUmVmZXJlbmNlcwoKQWtkZWwsIE0uLCBQaXJlcywgRC4gRS4gVi4sIFBvcnRhIFBhcmRvLCBFLiwgSsOkbmVzLCBKLiwgWmFsZXZza3ksIEEuIE8uLCBNw6lzesOhcm9zLCBCLiwgQnJ5YW50LCBQLiwgR29vZCwgTC4gTC4sIExhc2tvd3NraSwgUi4gQS4sIFBvenphdGksIEcuLCBTaGVub3ksIEEuLCBaaHUsIFcuLCBLdW5kcm90YXMsIFAuLCBSdWl6IFNlcnJhLCBWLiwgUm9kcmlndWVzLCBDLiBILiBNLiwgRHVuaGFtLCBBLiBTLiwgQnVya2UsIEQuLCBCb3JrYWtvdGksIE4uLCBWZWxhbmthciwgUy4sIOKApiBCZWx0cmFvLCBQLiAoMjAyMikuIEEgc3RydWN0dXJhbCBiaW9sb2d5IGNvbW11bml0eSBhc3Nlc3NtZW50IG9mIEFscGhhRm9sZDIgYXBwbGljYXRpb25zLiAqTmF0dXJlIFN0cnVjdHVyYWwgJiBNb2xlY3VsYXIgQmlvbG9neSwgMjkqLCAxMDU24oCTMTA2Ny4gaHR0cHM6Ly9kb2kub3JnLzEwLjEwMzgvczQxNTk0LTAyMi0wMDg0OS13CgpBdnNlYywgxb0uLCBMYXR5c2hldmEsIE4uLCBDaGVuZywgSi4sIE5vdmF0aSwgRy4sIFRheWxvciwgSy4gUi4sIFdhcmQsIFQuLCBCeWNyb2Z0LCBDLiwgTmljb2xhaXNlbiwgTC4sIEFydmFuaXRpLCBFLiwgUGFuLCBKLiwgVGhvbWFzLCBSLiwgRHV0b3Jkb2lyLCBWLiwgUGVyaW5vLCBNLiwgRGUsIFMuLCBLYXJvbGx1cywgQS4sIEdheW9zbywgQS4sIFNhcmdlYW50LCBULiwgTW90dHJhbSwgQS4sIFdvbmcsIEwuIEguLCDigKYgS29obGksIFAuICgyMDI2KS4gQWR2YW5jaW5nIHJlZ3VsYXRvcnkgdmFyaWFudCBlZmZlY3QgcHJlZGljdGlvbiB3aXRoIEFscGhhR2Vub21lLiAqTmF0dXJlLCA2NDkqLCAxMjA24oCTMTIxOC4gaHR0cHM6Ly9kb2kub3JnLzEwLjEwMzgvczQxNTg2LTAyNS0xMDAxNC0wCgpDaXJpbGxvLCBELiwgQ2F0dWFyYS1Tb2xhcnosIFMuLCBNb3JleSwgQy4sIEd1bmV5LCBFLiwgU3ViaXJhdHMsIEwuLCBNZWxsaW5vLCBTLiwgR2lnYW50ZSwgQS4sIFZhbGVuY2lhLCBBLiwgUmVtZW50ZXJpYSwgTS4gSi4sIFNhbnR1Y2Npb25lIENoYWRoYSwgQS4sICYgTWF2cmlkaXMsIE4uICgyMDIwKS4gU2V4IGFuZCBnZW5kZXIgZGlmZmVyZW5jZXMgYW5kIGJpYXNlcyBpbiBhcnRpZmljaWFsIGludGVsbGlnZW5jZSBmb3IgYmlvbWVkaWNpbmUgYW5kIGhlYWx0aGNhcmUuICpucGogRGlnaXRhbCBNZWRpY2luZSwgMyosIEFydGljbGUgODEuIGh0dHBzOi8vZG9pLm9yZy8xMC4xMDM4L3M0MTc0Ni0wMjAtMDI4OC01CgpDaXJpbGxvLCBELiwgJiBWYWxlbmNpYSwgQS4gKDIwMTkpLiBCaWcgZGF0YSBhbmFseXRpY3MgZm9yIHBlcnNvbmFsaXplZCBtZWRpY2luZS4gKkN1cnJlbnQgT3BpbmlvbiBpbiBCaW90ZWNobm9sb2d5LCA1OCosIDE2MeKAkzE2Ny4gaHR0cHM6Ly9kb2kub3JnLzEwLjEwMTYvai5jb3BiaW8uMjAxOS4wMy4wMDQKCkNvdWxkcnksIE4uLCAmIE1lamlhcywgVS4gQS4gKDIwMTkpLiAqVGhlIGNvc3RzIG9mIGNvbm5lY3Rpb246IEhvdyBkYXRhIGlzIGNvbG9uaXppbmcgaHVtYW4gbGlmZSBhbmQgYXBwcm9wcmlhdGluZyBpdCBmb3IgY2FwaXRhbGlzbSouIFN0YW5mb3JkIFVuaXZlcnNpdHkgUHJlc3MuCgpEZXZvcywgRC4sICYgVmFsZW5jaWEsIEEuICgyMDAwKS4gUHJhY3RpY2FsIGxpbWl0cyBvZiBmdW5jdGlvbiBwcmVkaWN0aW9uLiAqUHJvdGVpbnM6IFN0cnVjdHVyZSwgRnVuY3Rpb24sIGFuZCBHZW5ldGljcywgNDEqKDEpLCA5OOKAkzEwNy4gaHR0cHM6Ly9kb2kub3JnLzEwLjEwMDIvMTA5Ny0wMTM0KDIwMDAxMDAxKTQxOjElM0M5ODo6QUlELVBST1QxMjAlM0UzLjAuQ087Mi1TCgpGcmFna291bGksIFMuLUMuLCBJcWJhbCwgUy4sIENyb3NzbWFuLCBMLiwgR3JhdmVsLCBCLiwgTWFzdWVkLCBOLiwgT25kZXJzLCBNLiwgSGFzZWphLCBELiwgU3Rpa2tlbG1hbiwgQS4sIFZhbGVuY2lhLCBBLiwgTGVuYWVydHMsIFQuLCBQc29tb3BvdWxvcywgRi4sIMOTIEJyb2luLCBQLiwgUXVlcmFsdC1Sb3NpbmFjaCwgTi4sICYgQ2lyaWxsbywgRC4gKDIwMjYpLiBBbiBFTElYSVIgc2NvcGluZyByZXZpZXcgb24gZG9tYWluLXNwZWNpZmljIGV2YWx1YXRpb24gbWV0cmljcyBmb3Igc3ludGhldGljIGRhdGEgaW4gbGlmZSBzY2llbmNlcy4gKk5BUiBHZW5vbWljcyBhbmQgQmlvaW5mb3JtYXRpY3MsIDgqKDEpLCBscWFnMDEyLiBodHRwczovL2RvaS5vcmcvMTAuMTA5My9uYXJnYWIvbHFhZzAxMgoKRnJhbmNlc2NoIETDrWF6LCBBLiAoMjAxMCkuIFNhYm9yZXMgeSBzaW5zYWJvcmVzIGRlIHVuIHByb2dyYW1hIGRhcndpbmlzdGEgcGFyYSBsYXMgY2llbmNpYXMgc29jaWFsZXMgW1BsZWFzdXJlcyBhbmQgcGl0ZmFsbHMgb2YgYSBEYXJ3aW5pYW4gcHJvZ3JhbW1lIGZvciB0aGUgc29jaWFsIHNjaWVuY2VzXS4gKkFudHJvcG9sb2dpYSBQb3J0dWd1ZXNhLCAyNuKAkzI3KiwgOeKAkzI3LgoKSXR1cnJhbGRlIEJsYW5jbywgSS4gKDIwMTEpLiBTaXN0ZW1hIGp1csOtZGljbyBkb21pbmFudGUgeSBhdXRvbm9tw61hIGluZMOtZ2VuYTogRWwgc2lzdGVtYSBub3JtYXRpdm8gbWl4ZSB5IGxvcyBjb25mbGljdG9zIGp1cmlzZGljY2lvbmFsZXMgW0RvbWluYW50IGxlZ2FsIHN5c3RlbSBhbmQgSW5kaWdlbm91cyBhdXRvbm9teTogVGhlIE1peGUgbm9ybWF0aXZlIHN5c3RlbSBhbmQganVyaXNkaWN0aW9uYWwgY29uZmxpY3RzXS4gRW4gTS4gQXBhcmljaW8gV2lsaGVsbWkgKEVkLiksICpDb250cmFjb3JyaWVudGVzOiBBcHVudGVzIHNvYnJlIGlndWFsZGFkLCBkaWZlcmVuY2lhIHkgZGVyZWNob3MqIFtDb3VudGVyY3VycmVudHM6IE5vdGVzIG9uIGVxdWFsaXR5LCBkaWZmZXJlbmNlIGFuZCByaWdodHNdIChwcC4gODfigJMxMTYpLiBEb2N1bWVudGEgVW5pdmVyc2l0YXJpYS4KCkp1bXBlciwgSi4sIEV2YW5zLCBSLiwgUHJpdHplbCwgQS4sIEdyZWVuLCBULiwgRmlndXJub3YsIE0uLCBSb25uZWJlcmdlciwgTy4sIFR1bnlhc3V2dW5ha29vbCwgSy4sIEJhdGVzLCBSLiwgxb3DrWRlaywgQS4sIFBvdGFwZW5rbywgQS4sIEJyaWRnbGFuZCwgQS4sIE1leWVyLCBDLiwgS29obCwgUy4gQS4gQS4sIEJhbGxhcmQsIEEuIEouLCBDb3dpZSwgQS4sIFJvbWVyYS1QYXJlZGVzLCBCLiwgTmlrb2xvdiwgUy4sIEphaW4sIFIuLCBBZGxlciwgSi4sIOKApiBIYXNzYWJpcywgRC4gKDIwMjEpLiBIaWdobHkgYWNjdXJhdGUgcHJvdGVpbiBzdHJ1Y3R1cmUgcHJlZGljdGlvbiB3aXRoIEFscGhhRm9sZC4gKk5hdHVyZSwgNTk2KiwgNTgz4oCTNTg5LiBodHRwczovL2RvaS5vcmcvMTAuMTAzOC9zNDE1ODYtMDIxLTAzODE5LTIKCkxpbiwgWi4sIEFraW4sIEguLCBSYW8sIFIuLCBIaWUsIEIuLCBaaHUsIFouLCBMdSwgVy4sIFNtZXRhbmluLCBOLiwgVmVya3VpbCwgUi4sIEthYmVsaSwgTy4sIFNobXVlbGksIFkuLCBEb3MgU2FudG9zIENvc3RhLCBBLiwgRmF6ZWwtWmFyYW5kaSwgTS4sIFNlcmN1LCBULiwgQ2FuZGlkbywgUy4sICYgUml2ZXMsIEEuICgyMDIzKS4gRXZvbHV0aW9uYXJ5LXNjYWxlIHByZWRpY3Rpb24gb2YgYXRvbWljLWxldmVsIHByb3RlaW4gc3RydWN0dXJlIHdpdGggYSBsYW5ndWFnZSBtb2RlbC4gKlNjaWVuY2UsIDM3OSooNjYzNyksIDExMjPigJMxMTMwLiBodHRwczovL2RvaS5vcmcvMTAuMTEyNi9zY2llbmNlLmFkZTI1NzQKClBvbmNlLWRlLUxlb24sIE0uLCBNb250YWd1ZCwgQS4sIEFrYXNpYWRpcywgQy4sIFNjaHJlaWJlciwgSi4sIE50aW5pYWtvdSwgVC4sICYgVmFsZW5jaWEsIEEuICgyMDIyKS4gT3B0aW1pemluZyBkb3NhZ2Utc3BlY2lmaWMgdHJlYXRtZW50cyBpbiBhIG11bHRpLXNjYWxlIG1vZGVsIG9mIGEgdHVtb3IgZ3Jvd3RoLiAqRnJvbnRpZXJzIGluIE1vbGVjdWxhciBCaW9zY2llbmNlcywgOSosIDgzNjc5NC4gaHR0cHM6Ly9kb2kub3JnLzEwLjMzODkvZm1vbGIuMjAyMi44MzY3OTQKClJhbcOtcmV6IEdvaWNvZWNoZWEsIEUuICgyMDEzKS4gKkFudHJvcG9sb2fDrWEgYmlvc29jaWFsOiBCaW9sb2fDrWEsIGN1bHR1cmEgeSBzb2NpZWRhZCogW0Jpb3NvY2lhbCBhbnRocm9wb2xvZ3k6IEJpb2xvZ3ksIGN1bHR1cmUgYW5kIHNvY2lldHldLiBFZGl0b3JpYWwgVW5pdmVyc2l0YXJpYSBSYW3Ds24gQXJlY2VzLgoKUmFtc2F5LCBNLiwgRXRoZXJlZGdlLCBILiwgVGx1d2F5LCBGLiwgROKAmUFtYXRvLCBNLiBFLiwgQ2hpa3dhbWJpLCBaLiwgSGFtZGksIFkuLCBBbGh1ZGlyaSwgSS4sIEZha2ltLCBZLiwgQWhtYWQsIEsuIE0uLCBCZWxndWl0aCwgTi4sIEJlbnRsZXksIEQuLCBCb3VqZW1hYSwgTS4sIENhbHVtYnVhbmEsIE4uLCBDaGFvdWNoLCBNLiwgQ2hhcmZlZGRpbmUsIEMuLCBDaGluaWVuLCBHLiwgRHVrdXplLCBOLiwgRWxqaWxhbmksIE0uLCBFbHphZ2hlaWQsIEEuLCDigKYgQ2hvdWRodXJ5LCBBLiAoMjAyNikuIEVucmljaGluZyBBZnJpY2FuIGdlbm9tZSByZXByZXNlbnRhdGlvbiB0aHJvdWdoIHRoZSBBR2VuREEgcHJvamVjdC4gKk5hdHVyZSwgNjQ5KiwgNTY14oCTNTczLiBodHRwczovL2RvaS5vcmcvMTAuMTAzOC9zNDE1ODYtMDI1LTA5OTM1LTcKClJpdmVzLCBBLiwgTWVpZXIsIEouLCBTZXJjdSwgVC4sIEdveWFsLCBTLiwgTGluLCBaLiwgTGl1LCBKLiwgR3VvLCBELiwgT3R0LCBNLiwgWml0bmljaywgQy4gTC4sIE1hLCBKLiwgJiBGZXJndXMsIFIuICgyMDIxKS4gQmlvbG9naWNhbCBzdHJ1Y3R1cmUgYW5kIGZ1bmN0aW9uIGVtZXJnZSBmcm9tIHNjYWxpbmcgdW5zdXBlcnZpc2VkIGxlYXJuaW5nIHRvIDI1MCBtaWxsaW9uIHByb3RlaW4gc2VxdWVuY2VzLiAqUHJvY2VlZGluZ3Mgb2YgdGhlIE5hdGlvbmFsIEFjYWRlbXkgb2YgU2NpZW5jZXMgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSwgMTE4KigxNSksIGUyMDE2MjM5MTE4LiBodHRwczovL2RvaS5vcmcvMTAuMTA3My9wbmFzLjIwMTYyMzkxMTgKClNobWF0a28sIEEuLCBKdW5nLCBBLiBXLiwgR2F1cmF2LCBLLiwgQnJ1bmFrLCBTLiwgTW9ydGVuc2VuLCBMLiBILiwgQmlybmV5LCBFLiwgRml0emdlcmFsZCwgVC4sICYgR2Vyc3R1bmcsIE0uICgyMDI1KS4gTGVhcm5pbmcgdGhlIG5hdHVyYWwgaGlzdG9yeSBvZiBodW1hbiBkaXNlYXNlIHdpdGggZ2VuZXJhdGl2ZSB0cmFuc2Zvcm1lcnMuICpOYXR1cmUsIDY0NyosIDI0OOKAkzI1Ni4gaHR0cHM6Ly9kb2kub3JnLzEwLjEwMzgvczQxNTg2LTAyNS0wOTUyOS0zCgpWw6lsaXosIEMuICgyMDI2KS4gKlByb3BoZWN5OiBQcmVkaWN0aW9uLCBwb3dlciBhbmQgdGhlIGZpZ2h0IGZvciB0aGUgZnV0dXJlLCBmcm9tIGFuY2llbnQgb3JhY2xlcyB0byBBSSouIFN3aWZ0IFByZXNzLgoKVmVsYXNjbyBNYWlsbG8sIEguIE0uICgyMDEzKS4gKkhhYmxhciB5IHBlbnNhciwgdGFyZWFzIGN1bHR1cmFsZXM6IFRlbWFzIGRlIGFudHJvcG9sb2fDrWEgbGluZ8O8w61zdGljYSB5IGFudHJvcG9sb2fDrWEgY29nbml0aXZhKiBbU3BlYWtpbmcgYW5kIHRoaW5raW5nLCBjdWx0dXJhbCB0YXNrczogVG9waWNzIGluIGxpbmd1aXN0aWMgYW5kIGNvZ25pdGl2ZSBhbnRocm9wb2xvZ3ldLiBVbml2ZXJzaWRhZCBOYWNpb25hbCBkZSBFZHVjYWNpw7NuIGEgRGlzdGFuY2lhLgo=