SW50cm8KLS0tLS0KVGhpcyBkZXNjcmliZXMgYW4gYWRhcHRpdmUsIHN0YWJsZSwgbmF0dXJhbCBtZXJnZXNvcnQsIG1vZGVzdGx5IGNhbGxlZAp0aW1zb3J0IChoZXksIEkgZWFybmVkIGl0IDx3aW5rPikuICBJdCBoYXMgc3VwZXJuYXR1cmFsIHBlcmZvcm1hbmNlIG9uIG1hbnkKa2luZHMgb2YgcGFydGlhbGx5IG9yZGVyZWQgYXJyYXlzIChsZXNzIHRoYW4gbGcoTiEpIGNvbXBhcmlzb25zIG5lZWRlZCwgYW5kCmFzIGZldyBhcyBOLTEpLCB5ZXQgYXMgZmFzdCBhcyBQeXRob24ncyBwcmV2aW91cyBoaWdobHkgdHVuZWQgc2FtcGxlc29ydApoeWJyaWQgb24gcmFuZG9tIGFycmF5cy4KCkluIGEgbnV0c2hlbGwsIHRoZSBtYWluIHJvdXRpbmUgbWFyY2hlcyBvdmVyIHRoZSBhcnJheSBvbmNlLCBsZWZ0IHRvIHJpZ2h0LAphbHRlcm5hdGVseSBpZGVudGlmeWluZyB0aGUgbmV4dCBydW4sIHRoZW4gbWVyZ2luZyBpdCBpbnRvIHRoZSBwcmV2aW91cwpydW5zICJpbnRlbGxpZ2VudGx5Ii4gIEV2ZXJ5dGhpbmcgZWxzZSBpcyBjb21wbGljYXRpb24gZm9yIHNwZWVkLCBhbmQgc29tZQpoYXJkLXdvbiBtZWFzdXJlIG9mIG1lbW9yeSBlZmZpY2llbmN5LgoKCkNvbXBhcmlzb24gd2l0aCBQeXRob24ncyBTYW1wbGVzb3J0IEh5YnJpZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB0aW1zb3J0IGNhbiByZXF1aXJlIGEgdGVtcCBhcnJheSBjb250YWluaW5nIGFzIG1hbnkgYXMgTi8vMiBwb2ludGVycywKICB3aGljaCBtZWFucyBhcyBtYW55IGFzIDIqTiBleHRyYSBieXRlcyBvbiAzMi1iaXQgYm94ZXMuICBJdCBjYW4gYmUKICBleHBlY3RlZCB0byByZXF1aXJlIGEgdGVtcCBhcnJheSB0aGlzIGxhcmdlIHdoZW4gc29ydGluZyByYW5kb20gZGF0YTsgb24KICBkYXRhIHdpdGggc2lnbmlmaWNhbnQgc3RydWN0dXJlLCBpdCBtYXkgZ2V0IGF3YXkgd2l0aG91dCB1c2luZyBhbnkgZXh0cmEKICBoZWFwIG1lbW9yeS4gIFRoaXMgYXBwZWFycyB0byBiZSB0aGUgc3Ryb25nZXN0IGFyZ3VtZW50IGFnYWluc3QgaXQsIGJ1dAogIGNvbXBhcmVkIHRvIHRoZSBzaXplIG9mIGFuIG9iamVjdCwgMiB0ZW1wIGJ5dGVzIHdvcnN0LWNhc2UgKGFsc28gZXhwZWN0ZWQtCiAgY2FzZSBmb3IgcmFuZG9tIGRhdGEpIGRvZXNuJ3Qgc2NhcmUgbWUgbXVjaC4KCiAgSXQgdHVybnMgb3V0IHRoYXQgUGVybCBpcyBtb3ZpbmcgdG8gYSBzdGFibGUgbWVyZ2Vzb3J0LCBhbmQgdGhlIGNvZGUgZm9yCiAgdGhhdCBhcHBlYXJzIGFsd2F5cyB0byByZXF1aXJlIGEgdGVtcCBhcnJheSB3aXRoIHJvb20gZm9yIGF0IGxlYXN0IE4KICBwb2ludGVycy4gKE5vdGUgdGhhdCBJIHdvdWxkbid0IHdhbnQgdG8gZG8gdGhhdCBldmVuIGlmIHNwYWNlIHdlcmVuJ3QgYW4KICBpc3N1ZTsgSSBiZWxpZXZlIGl0cyBlZmZvcnRzIGF0IG1lbW9yeSBmcnVnYWxpdHkgYWxzbyBzYXZlIHRpbXNvcnQKICBzaWduaWZpY2FudCBwb2ludGVyLWNvcHlpbmcgY29zdHMsIGFuZCBhbGxvdyBpdCB0byBoYXZlIGEgc21hbGxlciB3b3JraW5nCiAgc2V0LikKCisgQWNyb3NzIGFib3V0IGZvdXIgaG91cnMgb2YgZ2VuZXJhdGluZyByYW5kb20gYXJyYXlzLCBhbmQgc29ydGluZyB0aGVtCiAgdW5kZXIgYm90aCBtZXRob2RzLCBzYW1wbGVzb3J0IHJlcXVpcmVkIGFib3V0IDEuNSUgbW9yZSBjb21wYXJpc29ucwogICh0aGUgcHJvZ3JhbSBpcyBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZSkuCgorIEluIHJlYWwgbGlmZSwgdGhpcyBtYXkgYmUgZmFzdGVyIG9yIHNsb3dlciBvbiByYW5kb20gYXJyYXlzIHRoYW4KICBzYW1wbGVzb3J0IHdhcywgZGVwZW5kaW5nIG9uIHBsYXRmb3JtIHF1aXJrcy4gIFNpbmNlIGl0IGRvZXMgZmV3ZXIKICBjb21wYXJpc29ucyBvbiBhdmVyYWdlLCBpdCBjYW4gYmUgZXhwZWN0ZWQgdG8gZG8gYmV0dGVyIHRoZSBtb3JlCiAgZXhwZW5zaXZlIGEgY29tcGFyaXNvbiBmdW5jdGlvbiBpcy4gIE9UT0gsIGl0IGRvZXMgbW9yZSBkYXRhIG1vdmVtZW50CiAgKHBvaW50ZXIgY29weWluZykgdGhhbiBzYW1wbGVzb3J0LCBhbmQgdGhhdCBtYXkgbmVnYXRlIGl0cyBzbWFsbAogIGNvbXBhcmlzb24gYWR2YW50YWdlIChkZXBlbmRpbmcgb24gcGxhdGZvcm0gcXVpcmtzKSB1bmxlc3MgY29tcGFyaXNvbgogIGlzIHZlcnkgZXhwZW5zaXZlLgoKKyBPbiBhcnJheXMgd2l0aCBtYW55IGtpbmRzIG9mIHByZS1leGlzdGluZyBvcmRlciwgdGhpcyBibG93cyBzYW1wbGVzb3J0IG91dAogIG9mIHRoZSB3YXRlci4gIEl0J3Mgc2lnbmlmaWNhbnRseSBmYXN0ZXIgdGhhbiBzYW1wbGVzb3J0IGV2ZW4gb24gc29tZQogIGNhc2VzIHNhbXBsZXNvcnQgd2FzIHNwZWNpYWwtY2FzaW5nIHRoZSBzbm90IG91dCBvZi4gIEkgYmVsaWV2ZSB0aGF0IGxpc3RzCiAgdmVyeSBvZnRlbiBkbyBoYXZlIGV4cGxvaXRhYmxlIHBhcnRpYWwgb3JkZXIgaW4gcmVhbCBsaWZlLCBhbmQgdGhpcyBpcyB0aGUKICBzdHJvbmdlc3QgYXJndW1lbnQgaW4gZmF2b3Igb2YgdGltc29ydCAoaW5kZWVkLCBzYW1wbGVzb3J0J3Mgc3BlY2lhbCBjYXNlcwogIGZvciBleHRyZW1lIHBhcnRpYWwgb3JkZXIgYXJlIGFwcHJlY2lhdGVkIGJ5IHJlYWwgdXNlcnMsIGFuZCB0aW1zb3J0IGdvZXMKICBtdWNoIGRlZXBlciB0aGFuIHRob3NlLCBpbiBwYXJ0aWN1bGFyIG5hdHVyYWxseSBjb3ZlcmluZyBldmVyeSBjYXNlIHdoZXJlCiAgc29tZW9uZSBoYXMgc3VnZ2VzdGVkICJhbmQgaXQgd291bGQgYmUgY29vbCBpZiBsaXN0LnNvcnQoKSBoYWQgYSBzcGVjaWFsCiAgY2FzZSBmb3IgdGhpcyB0b28gLi4uIGFuZCBmb3IgdGhhdCAuLi4iKS4KCisgSGVyZSBhcmUgZXhhY3QgY29tcGFyaXNvbiBjb3VudHMgYWNyb3NzIGFsbCB0aGUgdGVzdHMgaW4gc29ydHBlcmYucHksCiAgd2hlbiBydW4gd2l0aCBhcmd1bWVudHMgIjE1IDIwIDEiLgoKICBGaXJzdCB0aGUgdHJpdmlhbCBjYXNlcywgdHJpdmlhbCBmb3Igc2FtcGxlc29ydCBiZWNhdXNlIGl0IHNwZWNpYWwtY2FzZWQKICB0aGVtLCBhbmQgdHJpdmlhbCBmb3IgdGltc29ydCBiZWNhdXNlIGl0IG5hdHVyYWxseSB3b3JrcyBvbiBydW5zLiAgV2l0aGluCiAgYW4gIm4iIGJsb2NrLCB0aGUgZmlyc3QgbGluZSBnaXZlcyB0aGUgIyBvZiBjb21wYXJlcyBkb25lIGJ5IHNhbXBsZXNvcnQsCiAgdGhlIHNlY29uZCBsaW5lIGJ5IHRpbXNvcnQsIGFuZCB0aGUgdGhpcmQgbGluZSBpcyB0aGUgcGVyY2VudGFnZSBieQogIHdoaWNoIHRoZSBzYW1wbGVzb3J0IGNvdW50IGV4Y2VlZHMgdGhlIHRpbXNvcnQgY291bnQ6CgogICAgICBuICAgXHNvcnQgICAvc29ydCAgID1zb3J0Ci0tLS0tLS0gIC0tLS0tLSAgLS0tLS0tICAtLS0tLS0KICAzMjc2OCAgIDMyNzY4ICAgMzI3NjcgICAzMjc2NyAgc2FtcGxlc29ydAogICAgICAgICAgMzI3NjcgICAzMjc2NyAgIDMyNzY3ICB0aW1zb3J0CiAgICAgICAgICAwLjAwJSAgIDAuMDAlICAgMC4wMCUgIChzYW1wbGVzb3J0IC0gdGltc29ydCkgLyB0aW1zb3J0CgogIDY1NTM2ICAgNjU1MzYgICA2NTUzNSAgIDY1NTM1CiAgICAgICAgICA2NTUzNSAgIDY1NTM1ICAgNjU1MzUKICAgICAgICAgIDAuMDAlICAgMC4wMCUgICAwLjAwJQoKIDEzMTA3MiAgMTMxMDcyICAxMzEwNzEgIDEzMTA3MQogICAgICAgICAxMzEwNzEgIDEzMTA3MSAgMTMxMDcxCiAgICAgICAgICAwLjAwJSAgIDAuMDAlICAgMC4wMCUKCiAyNjIxNDQgIDI2MjE0NCAgMjYyMTQzICAyNjIxNDMKICAgICAgICAgMjYyMTQzICAyNjIxNDMgIDI2MjE0MwogICAgICAgICAgMC4wMCUgICAwLjAwJSAgIDAuMDAlCgogNTI0Mjg4ICA1MjQyODggIDUyNDI4NyAgNTI0Mjg3CiAgICAgICAgIDUyNDI4NyAgNTI0Mjg3ICA1MjQyODcKICAgICAgICAgIDAuMDAlICAgMC4wMCUgICAwLjAwJQoKMTA0ODU3NiAxMDQ4NTc2IDEwNDg1NzUgMTA0ODU3NQogICAgICAgIDEwNDg1NzUgMTA0ODU3NSAxMDQ4NTc1CiAgICAgICAgICAwLjAwJSAgIDAuMDAlICAgMC4wMCUKCiAgVGhlIGFsZ29yaXRobXMgYXJlIGVmZmVjdGl2ZWx5IGlkZW50aWNhbCBpbiB0aGVzZSBjYXNlcywgZXhjZXB0IHRoYXQKICB0aW1zb3J0IGRvZXMgb25lIGxlc3MgY29tcGFyZSBpbiBcc29ydC4KCiAgTm93IGZvciB0aGUgbW9yZSBpbnRlcmVzdGluZyBjYXNlcy4gIGxnKG4hKSBpcyB0aGUgaW5mb3JtYXRpb24tdGhlb3JldGljCiAgbGltaXQgZm9yIHRoZSBiZXN0IGFueSBjb21wYXJpc29uLWJhc2VkIHNvcnRpbmcgYWxnb3JpdGhtIGNhbiBkbyBvbgogIGF2ZXJhZ2UgKGFjcm9zcyBhbGwgcGVybXV0YXRpb25zKS4gIFdoZW4gYSBtZXRob2QgZ2V0cyBzaWduaWZpY2FudGx5CiAgYmVsb3cgdGhhdCwgaXQncyBlaXRoZXIgYXN0cm9ub21pY2FsbHkgbHVja3ksIG9yIGlzIGZpbmRpbmcgZXhwbG9pdGFibGUKICBzdHJ1Y3R1cmUgaW4gdGhlIGRhdGEuCgogICAgICBuICAgbGcobiEpICAgICpzb3J0ICAgIDNzb3J0ICAgICArc29ydCAgICVzb3J0ICAgIH5zb3J0ICAgICAhc29ydAotLS0tLS0tICAtLS0tLS0tICAgLS0tLS0tICAgLS0tLS0tLSAgLS0tLS0tLSAgLS0tLS0tICAtLS0tLS0tICAtLS0tLS0tLQogIDMyNzY4ICAgNDQ0MjU1ICAgNDUzMDk2ICAgNDUzNjE0ICAgIDMyOTA4ICAgNDUyODcxICAgMTMwNDkxICAgIDQ2OTE0MSBvbGQKICAgICAgICAgICAgICAgICAgIDQ0ODg4NSAgICAzMzAxNiAgICAzMzAwNyAgICA1MDQyNiAgIDE4MjA4MyAgICAgNjU1MzQgbmV3CiAgICAgICAgICAgICAgICAgICAgMC45NCUgMTI3My45MiUgICAtMC4zMCUgIDc5OC4wOSUgIC0yOC4zMyUgICA2MTUuODclICVjaCBmcm9tIG5ldwoKICA2NTUzNiAgIDk1NDAzNyAgIDk3MjY5OSAgIDk4MTk0MCAgICA2NTY4NiAgIDk3MzEwNCAgIDI2MDAyOSAgIDEwMDQ2MDcKICAgICAgICAgICAgICAgICAgIDk2Mjk5MSAgICA2NTgyMSAgICA2NTgwOCAgIDEwMTY2NyAgIDM2NDM0MSAgICAxMzEwNzAKICAgICAgICAgICAgICAgICAgICAxLjAxJSAxMzkxLjgzJSAgIC0wLjE5JSAgODU3LjE1JSAgLTI4LjYzJSAgIDY2Ni40NyUKCiAxMzEwNzIgIDIwMzkxMzcgIDIxMDE4ODEgIDIwOTE0OTEgICAxMzEyMzIgIDIwOTI4OTQgICA1NTQ3OTAgICAyMTYxMzc5CiAgICAgICAgICAgICAgICAgIDIwNTc1MzMgICAxMzE0MTAgICAxMzEzNjEgICAyMDYxOTMgICA3Mjg4NzEgICAgMjYyMTQyCiAgICAgICAgICAgICAgICAgICAgMi4xNiUgMTQ5MS41OCUgICAtMC4xMCUgIDkxNS4wMiUgIC0yMy44OCUgICA3MjQuNTElCgogMjYyMTQ0ICA0MzQwNDA5ICA0NDY0NDYwICA0NDAzMjMzICAgMjYyMzE0ICA0NDQ1ODg0ICAxMTA3ODQyICAgNDU4NDU2MAogICAgICAgICAgICAgICAgICA0Mzc3NDAyICAgMjYyNDM3ICAgMjYyNDU5ICAgNDE2MzQ3ICAxNDU3OTQ1ICAgIDUyNDI4NgogICAgICAgICAgICAgICAgICAgIDEuOTklIDE1NzcuODIlICAgLTAuMDYlICA5NjcuODMlICAtMjQuMDElICAgNzc0LjQ0JQoKIDUyNDI4OCAgOTIwNTA5NiA5NDUzMzU2ICAgOTQwODQ2MyAgIDUyNDQ2OCAgOTQ0MTkzMCAgMjIxODU3NyAgIDk2OTIwMTUKICAgICAgICAgICAgICAgICA5Mjc4NzM0ICAgIDUyNDU4MCAgIDUyNDYzMyAgIDgzNzk0NyAgMjkxNjEwNyAgIDEwNDg1NzQKICAgICAgICAgICAgICAgICAgIDEuODglICAxNjkzLjUyJSAgIC0wLjAzJSAxMDI2Ljc5JSAgLTIzLjkyJSAgIDgyNC4zMCUKCjEwNDg1NzYgMTk0NTg3NTYgMTk5NTAyNzIgMTk4Mzg1ODggIDEwNDg3NjYgMTk5MTIxMzQgIDQ0MzA2NDkgIDIwNDM0MjEyCiAgICAgICAgICAgICAgICAgMTk2MDYwMjggIDEwNDg5NTggIDEwNDg5NDEgIDE2OTQ4OTYgIDU4MzI0NDUgICAyMDk3MTUwCiAgICAgICAgICAgICAgICAgICAgMS43NiUgMTc5MS4yNyUgICAtMC4wMiUgMTA3NC44MyUgIC0yNC4wMyUgICA4NzQuMzglCgogIERpc2N1c3Npb24gb2YgY2FzZXM6CgogICpzb3J0OiAgVGhlcmUncyBubyBzdHJ1Y3R1cmUgaW4gcmFuZG9tIGRhdGEgdG8gZXhwbG9pdCwgc28gdGhlIHRoZW9yZXRpY2FsCiAgbGltaXQgaXMgbGcobiEpLiAgQm90aCBtZXRob2RzIGdldCBjbG9zZSB0byB0aGF0LCBhbmQgdGltc29ydCBpcyBodWdnaW5nCiAgaXQgKGluZGVlZCwgaW4gYSAqbWFyZ2luYWwqIHNlbnNlLCBpdCdzIGEgc3BlY3RhY3VsYXIgaW1wcm92ZW1lbnQgLS0KICB0aGVyZSdzIG9ubHkgYWJvdXQgMSUgbGVmdCBiZWZvcmUgaGl0dGluZyB0aGUgd2FsbCwgYW5kIHRpbXNvcnQga25vd3MKICBkYXJuZWQgd2VsbCBpdCdzIGRvaW5nIGNvbXBhcmVzIHRoYXQgd29uJ3QgcGF5IG9uIHJhbmRvbSBkYXRhIC0tIGJ1dCBzbwogIGRvZXMgdGhlIHNhbXBsZXNvcnQgaHlicmlkKS4gIEZvciBjb250cmFzdCwgSG9hcmUncyBvcmlnaW5hbCByYW5kb20tcGl2b3QKICBxdWlja3NvcnQgZG9lcyBhYm91dCAzOSUgbW9yZSBjb21wYXJlcyB0aGFuIHRoZSBsaW1pdCwgYW5kIHRoZSBtZWRpYW4tb2YtMwogIHZhcmlhbnQgYWJvdXQgMTklIG1vcmUuCgogIDNzb3J0LCAlc29ydCwgYW5kICFzb3J0OiAgTm8gY29udGVzdDsgdGhlcmUncyBzdHJ1Y3R1cmUgaW4gdGhpcyBkYXRhLCBidXQKICBub3Qgb2YgdGhlIHNwZWNpZmljIGtpbmRzIHNhbXBsZXNvcnQgc3BlY2lhbC1jYXNlcy4gIE5vdGUgdGhhdCBzdHJ1Y3R1cmUKICBpbiAhc29ydCB3YXNuJ3QgcHV0IHRoZXJlIG9uIHB1cnBvc2UgLS0gaXQgd2FzIGNyYWZ0ZWQgYXMgYSB3b3JzdCBjYXNlIGZvcgogIGEgcHJldmlvdXMgcXVpY2tzb3J0IGltcGxlbWVudGF0aW9uLiAgVGhhdCB0aW1zb3J0IG5haWxzIGl0IGNhbWUgYXMgYQogIHN1cnByaXNlIHRvIG1lIChhbHRob3VnaCBpdCdzIG9idmlvdXMgaW4gcmV0cm9zcGVjdCkuCgogICtzb3J0OiAgc2FtcGxlc29ydCBzcGVjaWFsLWNhc2VzIHRoaXMgZGF0YSwgYW5kIGRvZXMgYSBmZXcgbGVzcyBjb21wYXJlcwogIHRoYW4gdGltc29ydC4gIEhvd2V2ZXIsIHRpbXNvcnQgcnVucyB0aGlzIGNhc2Ugc2lnbmlmaWNhbnRseSBmYXN0ZXIgb24gYWxsCiAgYm94ZXMgd2UgaGF2ZSB0aW1pbmdzIGZvciwgYmVjYXVzZSB0aW1zb3J0IGlzIGluIHRoZSBidXNpbmVzcyBvZiBtZXJnaW5nCiAgcnVucyBlZmZpY2llbnRseSwgd2hpbGUgc2FtcGxlc29ydCBkb2VzIG11Y2ggbW9yZSBkYXRhIG1vdmVtZW50IGluIHRoaXMKICAoZm9yIGl0KSBzcGVjaWFsIGNhc2UuCgogIH5zb3J0OiAgc2FtcGxlc29ydCdzIHNwZWNpYWwgY2FzZXMgZm9yIGxhcmdlIG1hc3NlcyBvZiBlcXVhbCBlbGVtZW50cyBhcmUKICBleHRyZW1lbHkgZWZmZWN0aXZlIG9uIH5zb3J0J3Mgc3BlY2lmaWMgZGF0YSBwYXR0ZXJuLCBhbmQgdGltc29ydCBqdXN0CiAgaXNuJ3QgZ29pbmcgdG8gZ2V0IGNsb3NlIHRvIHRoYXQsIGRlc3BpdGUgdGhhdCBpdCdzIGNsZWFybHkgZ2V0dGluZyBhCiAgZ3JlYXQgZGVhbCBvZiBiZW5lZml0IG91dCBvZiB0aGUgZHVwbGljYXRlcyAodGhlICMgb2YgY29tcGFyZXMgaXMgbXVjaCBsZXNzCiAgdGhhbiBsZyhuISkpLiAgfnNvcnQgaGFzIGEgcGVyZmVjdGx5IHVuaWZvcm0gZGlzdHJpYnV0aW9uIG9mIGp1c3QgNAogIGRpc3RpbmN0IHZhbHVlcywgYW5kIGFzIHRoZSBkaXN0cmlidXRpb24gZ2V0cyBtb3JlIHNrZXdlZCwgc2FtcGxlc29ydCdzCiAgZXF1YWwtZWxlbWVudCBnaW1taWNrcyBiZWNvbWUgbGVzcyBlZmZlY3RpdmUsIHdoaWxlIHRpbXNvcnQncyBhZGFwdGl2ZQogIHN0cmF0ZWdpZXMgZmluZCBtb3JlIHRvIGV4cGxvaXQ7IGluIGEgZGF0YWJhc2Ugc3VwcGxpZWQgYnkgS2V2aW4gQWx0aXMsIGEKICBzb3J0IG9uIGl0cyBoaWdobHkgc2tld2VkICJvbiB3aGljaCBzdG9jayBleGNoYW5nZSBkb2VzIHRoaXMgY29tcGFueSdzCiAgc3RvY2sgdHJhZGU/IiBmaWVsZCByYW4gb3ZlciB0d2ljZSBhcyBmYXN0IHVuZGVyIHRpbXNvcnQuCgogIEhvd2V2ZXIsIGRlc3BpdGUgdGhhdCB0aW1zb3J0IGRvZXMgbWFueSBtb3JlIGNvbXBhcmlzb25zIG9uIH5zb3J0LCBhbmQKICB0aGF0IG9uIHNldmVyYWwgcGxhdGZvcm1zIH5zb3J0IHJ1bnMgaGlnaGx5IHNpZ25pZmljYW50bHkgc2xvd2VyIHVuZGVyCiAgdGltc29ydCwgb24gb3RoZXIgcGxhdGZvcm1zIH5zb3J0IHJ1bnMgaGlnaGx5IHNpZ25pZmljYW50bHkgZmFzdGVyIHVuZGVyCiAgdGltc29ydC4gIE5vIG90aGVyIGtpbmQgb2YgZGF0YSBoYXMgc2hvd24gdGhpcyB3aWxkIHgtcGxhdGZvcm0gYmVoYXZpb3IsCiAgYW5kIHdlIGRvbid0IGhhdmUgYW4gZXhwbGFuYXRpb24gZm9yIGl0LiAgVGhlIG9ubHkgdGhpbmcgSSBjYW4gdGhpbmsgb2YKICB0aGF0IGNvdWxkIHRyYW5zZm9ybSB3aGF0ICJzaG91bGQgYmUiIGhpZ2hseSBzaWduaWZpY2FudCBzbG93ZG93bnMgaW50bwogIGhpZ2hseSBzaWduaWZpY2FudCBzcGVlZHVwcyBvbiBzb21lIGJveGVzIGFyZSBjYXRhc3Ryb3BoaWMgY2FjaGUgZWZmZWN0cwogIGluIHNhbXBsZXNvcnQuCgogIEJ1dCB0aW1zb3J0ICJzaG91bGQgYmUiIHNsb3dlciB0aGFuIHNhbXBsZXNvcnQgb24gfnNvcnQsIHNvIGl0J3MgaGFyZAogIHRvIGNvdW50IHRoYXQgaXQgaXNuJ3Qgb24gc29tZSBib3hlcyBhcyBhIHN0cmlrZSBhZ2FpbnN0IGl0IDx3aW5rPi4KCisgSGVyZSdzIHRoZSBoaWdod2F0ZXIgbWFyayBmb3IgdGhlIG51bWJlciBvZiBoZWFwLWJhc2VkIHRlbXAgc2xvdHMgKDQKICBieXRlcyBlYWNoIG9uIHRoaXMgYm94KSBuZWVkZWQgYnkgZWFjaCB0ZXN0LCBhZ2FpbiB3aXRoIGFyZ3VtZW50cwogICIxNSAyMCAxIjoKCiAgIDIqKmkgICpzb3J0IFxzb3J0IC9zb3J0ICAzc29ydCAgK3NvcnQgICVzb3J0ICB+c29ydCAgPXNvcnQgICFzb3J0CiAgMzI3NjggIDE2Mzg0ICAgICAwICAgICAwICAgNjI1NiAgICAgIDAgIDEwODIxICAxMjI4OCAgICAgIDAgIDE2MzgzCiAgNjU1MzYgIDMyNzY2ICAgICAwICAgICAwICAyMTY1MiAgICAgIDAgIDMxMjc2ICAyNDU3NiAgICAgIDAgIDMyNzY3CiAxMzEwNzIgIDY1NTM0ICAgICAwICAgICAwICAxNzI1OCAgICAgIDAgIDU4MTEyICA0OTE1MiAgICAgIDAgIDY1NTM1CiAyNjIxNDQgMTMxMDcyICAgICAwICAgICAwICAzNTY2MCAgICAgIDAgMTIzNTYxICA5ODMwNCAgICAgIDAgMTMxMDcxCiA1MjQyODggMjYyMTQyICAgICAwICAgICAwICAzMTMwMiAgICAgIDAgMjEyMDU3IDE5NjYwOCAgICAgIDAgMjYyMTQzCjEwNDg1NzYgNTI0Mjg2ICAgICAwICAgICAwIDMxMjQzOCAgICAgIDAgNDg0OTQyIDM5MzIxNiAgICAgIDAgNTI0Mjg3CgogIERpc2N1c3Npb246ICBUaGUgdGVzdHMgdGhhdCBlbmQgdXAgZG9pbmcgKGNsb3NlIHRvKSBwZXJmZWN0bHkgYmFsYW5jZWQKICBtZXJnZXMgKCpzb3J0LCAhc29ydCkgbmVlZCBhbGwgTi8vMiB0ZW1wIHNsb3RzIChvciBhbG1vc3QgYWxsKS4gIH5zb3J0CiAgYWxzbyBlbmRzIHVwIGRvaW5nIGJhbGFuY2VkIG1lcmdlcywgYnV0IHN5c3RlbWF0aWNhbGx5IGJlbmVmaXRzIGEgbG90IGZyb20KICB0aGUgcHJlbGltaW5hcnkgcHJlLW1lcmdlIHNlYXJjaGVzIGRlc2NyaWJlZCB1bmRlciAiTWVyZ2UgTWVtb3J5IiBsYXRlci4KICAlc29ydCBhcHByb2FjaGVzIGhhdmluZyBhIGJhbGFuY2VkIG1lcmdlIGF0IHRoZSBlbmQgYmVjYXVzZSB0aGUgcmFuZG9tCiAgc2VsZWN0aW9uIG9mIGVsZW1lbnRzIHRvIHJlcGxhY2UgaXMgZXhwZWN0ZWQgdG8gcHJvZHVjZSBhbiBvdXQtb2Ytb3JkZXIKICBlbGVtZW50IG5lYXIgdGhlIG1pZHBvaW50LiAgXHNvcnQsIC9zb3J0LCA9c29ydCBhcmUgdGhlIHRyaXZpYWwgb25lLXJ1bgogIGNhc2VzLCBuZWVkaW5nIG5vIG1lcmdpbmcgYXQgYWxsLiAgK3NvcnQgZW5kcyB1cCBoYXZpbmcgb25lIHZlcnkgbG9uZyBydW4KICBhbmQgb25lIHZlcnkgc2hvcnQsIGFuZCBzbyBnZXRzIGFsbCB0aGUgdGVtcCBzcGFjZSBpdCBuZWVkcyBmcm9tIHRoZSBzbWFsbAogIHRlbXBhcnJheSBtZW1iZXIgb2YgdGhlIE1lcmdlU3RhdGUgc3RydWN0IChub3RlIHRoYXQgdGhlIHNhbWUgd291bGQgYmUKICB0cnVlIGlmIHRoZSBuZXcgcmFuZG9tIGVsZW1lbnRzIHdlcmUgcHJlZml4ZWQgdG8gdGhlIHNvcnRlZCBsaXN0IGluc3RlYWQsCiAgYnV0IG5vdCBpZiB0aGV5IGFwcGVhcmVkICJpbiB0aGUgbWlkZGxlIikuICAzc29ydCBhcHByb2FjaGVzIE4vLzMgdGVtcAogIHNsb3RzIHR3aWNlLCBidXQgdGhlIHJ1biBsZW5ndGhzIHRoYXQgcmVtYWluIGFmdGVyIDMgcmFuZG9tIGV4Y2hhbmdlcwogIGNsZWFybHkgaGFzIHZlcnkgaGlnaCB2YXJpYW5jZS4KCgpBIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRpbXNvcnQgZm9sbG93cy4KClJ1bnMKLS0tLQpjb3VudF9ydW4oKSByZXR1cm5zIHRoZSAjIG9mIGVsZW1lbnRzIGluIHRoZSBuZXh0IHJ1bi4gIEEgcnVuIGlzIGVpdGhlcgoiYXNjZW5kaW5nIiwgd2hpY2ggbWVhbnMgbm9uLWRlY3JlYXNpbmc6CgogICAgYTAgPD0gYTEgPD0gYTIgPD0gLi4uCgpvciAiZGVzY2VuZGluZyIsIHdoaWNoIG1lYW5zIHN0cmljdGx5IGRlY3JlYXNpbmc6CgogICAgYTAgPiBhMSA+IGEyID4gLi4uCgpOb3RlIHRoYXQgYSBydW4gaXMgYWx3YXlzIGF0IGxlYXN0IDIgbG9uZywgdW5sZXNzIHdlIHN0YXJ0IGF0IHRoZSBhcnJheSdzCmxhc3QgZWxlbWVudC4KClRoZSBkZWZpbml0aW9uIG9mIGRlc2NlbmRpbmcgaXMgc3RyaWN0LCBiZWNhdXNlIHRoZSBtYWluIHJvdXRpbmUgcmV2ZXJzZXMKYSBkZXNjZW5kaW5nIHJ1biBpbi1wbGFjZSwgdHJhbnNmb3JtaW5nIGEgZGVzY2VuZGluZyBydW4gaW50byBhbiBhc2NlbmRpbmcKcnVuLiAgUmV2ZXJzYWwgaXMgZG9uZSB2aWEgdGhlIG9idmlvdXMgZmFzdCAic3dhcCBlbGVtZW50cyBzdGFydGluZyBhdCBlYWNoCmVuZCwgYW5kIGNvbnZlcmdlIGF0IHRoZSBtaWRkbGUiIG1ldGhvZCwgYW5kIHRoYXQgY2FuIHZpb2xhdGUgc3RhYmlsaXR5IGlmCnRoZSBzbGljZSBjb250YWlucyBhbnkgZXF1YWwgZWxlbWVudHMuICBVc2luZyBhIHN0cmljdCBkZWZpbml0aW9uIG9mCmRlc2NlbmRpbmcgZW5zdXJlcyB0aGF0IGEgZGVzY2VuZGluZyBydW4gY29udGFpbnMgZGlzdGluY3QgZWxlbWVudHMuCgpJZiBhbiBhcnJheSBpcyByYW5kb20sIGl0J3MgdmVyeSB1bmxpa2VseSB3ZSdsbCBzZWUgbG9uZyBydW5zLiAgSWYgYSBuYXR1cmFsCnJ1biBjb250YWlucyBsZXNzIHRoYW4gbWlucnVuIGVsZW1lbnRzIChzZWUgbmV4dCBzZWN0aW9uKSwgdGhlIG1haW4gbG9vcAphcnRpZmljaWFsbHkgYm9vc3RzIGl0IHRvIG1pbnJ1biBlbGVtZW50cywgdmlhIGEgc3RhYmxlIGJpbmFyeSBpbnNlcnRpb24gc29ydAphcHBsaWVkIHRvIHRoZSByaWdodCBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgZm9sbG93aW5nIHRoZSBzaG9ydCBuYXR1cmFsCnJ1bi4gIEluIGEgcmFuZG9tIGFycmF5LCAqYWxsKiBydW5zIGFyZSBsaWtlbHkgdG8gYmUgbWlucnVuIGxvbmcgYXMgYQpyZXN1bHQuICBUaGlzIGhhcyB0d28gcHJpbWFyeSBnb29kIGVmZmVjdHM6CgoxLiBSYW5kb20gZGF0YSBzdHJvbmdseSB0ZW5kcyB0aGVuIHRvd2FyZCBwZXJmZWN0bHkgYmFsYW5jZWQgKGJvdGggcnVucyBoYXZlCiAgIHRoZSBzYW1lIGxlbmd0aCkgbWVyZ2VzLCB3aGljaCBpcyB0aGUgbW9zdCBlZmZpY2llbnQgd2F5IHRvIHByb2NlZWQgd2hlbgogICBkYXRhIGlzIHJhbmRvbS4KCjIuIEJlY2F1c2UgcnVucyBhcmUgbmV2ZXIgdmVyeSBzaG9ydCwgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgZG9lc24ndCBtYWtlCiAgIGhlcm9pYyBlZmZvcnRzIHRvIHNoYXZlIGEgZmV3IGN5Y2xlcyBvZmYgcGVyLW1lcmdlIG92ZXJoZWFkcy4gIEZvcgogICBleGFtcGxlLCByZWFzb25hYmxlIHVzZSBvZiBmdW5jdGlvbiBjYWxscyBpcyBtYWRlLCByYXRoZXIgdGhhbiB0cnlpbmcgdG8KICAgaW5saW5lIGV2ZXJ5dGhpbmcuICBTaW5jZSB0aGVyZSBhcmUgbm8gbW9yZSB0aGFuIE4vbWlucnVuIHJ1bnMgdG8gYmVnaW4KICAgd2l0aCwgYSBmZXcgImV4dHJhIiBmdW5jdGlvbiBjYWxscyBwZXIgbWVyZ2UgaXMgYmFyZWx5IG1lYXN1cmFibGUuCgoKQ29tcHV0aW5nIG1pbnJ1bgotLS0tLS0tLS0tLS0tLS0tCklmIE4gPCA2NCwgbWlucnVuIGlzIE4uICBJT1csIGJpbmFyeSBpbnNlcnRpb24gc29ydCBpcyB1c2VkIGZvciB0aGUgd2hvbGUKYXJyYXkgdGhlbjsgaXQncyBoYXJkIHRvIGJlYXQgdGhhdCBnaXZlbiB0aGUgb3ZlcmhlYWRzIG9mIHRyeWluZyBzb21ldGhpbmcKZmFuY2llci4KCldoZW4gTiBpcyBhIHBvd2VyIG9mIDIsIHRlc3Rpbmcgb24gcmFuZG9tIGRhdGEgc2hvd2VkIHRoYXQgbWlucnVuIHZhbHVlcyBvZgoxNiwgMzIsIDY0IGFuZCAxMjggd29ya2VkIGFib3V0IGVxdWFsbHkgd2VsbC4gIEF0IDI1NiB0aGUgZGF0YS1tb3ZlbWVudCBjb3N0CmluIGJpbmFyeSBpbnNlcnRpb24gc29ydCBjbGVhcmx5IGh1cnQsIGFuZCBhdCA4IHRoZSBpbmNyZWFzZSBpbiB0aGUgbnVtYmVyCm9mIGZ1bmN0aW9uIGNhbGxzIGNsZWFybHkgaHVydC4gIFBpY2tpbmcgKnNvbWUqIHBvd2VyIG9mIDIgaXMgaW1wb3J0YW50CmhlcmUsIHNvIHRoYXQgdGhlIG1lcmdlcyBlbmQgdXAgcGVyZmVjdGx5IGJhbGFuY2VkIChzZWUgbmV4dCBzZWN0aW9uKS4gIFdlCnBpY2sgMzIgYXMgYSBnb29kIHZhbHVlIGluIHRoZSBzd2VldCByYW5nZTsgcGlja2luZyBhIHZhbHVlIGF0IHRoZSBsb3cgZW5kCmFsbG93cyB0aGUgYWRhcHRpdmUgZ2ltbWlja3MgbW9yZSBvcHBvcnR1bml0eSB0byBleHBsb2l0IHNob3J0ZXIgbmF0dXJhbApydW5zLgoKQmVjYXVzZSBzb3J0cGVyZi5weSBvbmx5IHRyaWVzIHBvd2VycyBvZiAyLCBpdCB0b29rIGEgbG9uZyB0aW1lIHRvIG5vdGljZQp0aGF0IDMyIGlzbid0IGEgZ29vZCBjaG9pY2UgZm9yIHRoZSBnZW5lcmFsIGNhc2UhICBDb25zaWRlciBOPTIxMTI6Cgo+Pj4gZGl2bW9kKDIxMTIsIDMyKQooNjYsIDApCj4+PgoKSWYgdGhlIGRhdGEgaXMgcmFuZG9tbHkgb3JkZXJlZCwgd2UncmUgdmVyeSBsaWtlbHkgdG8gZW5kIHVwIHdpdGggNjYgcnVucwplYWNoIG9mIGxlbmd0aCAzMi4gIFRoZSBmaXJzdCA2NCBvZiB0aGVzZSB0cmlnZ2VyIGEgc2VxdWVuY2Ugb2YgcGVyZmVjdGx5CmJhbGFuY2VkIG1lcmdlcyAoc2VlIG5leHQgc2VjdGlvbiksIGxlYXZpbmcgcnVucyBvZiBsZW5ndGhzIDIwNDggYW5kIDY0IHRvCm1lcmdlIGF0IHRoZSBlbmQuICBUaGUgYWRhcHRpdmUgZ2ltbWlja3MgY2FuIGRvIHRoYXQgd2l0aCBmZXdlciB0aGFuIDIwNDgrNjQKY29tcGFyZXMsIGJ1dCBpdCdzIHN0aWxsIG1vcmUgY29tcGFyZXMgdGhhbiBuZWNlc3NhcnksIGFuZC0tIG1lcmdlc29ydCdzCmJ1Z2Fib28gcmVsYXRpdmUgdG8gc2FtcGxlc29ydCAtLWEgbG90IG1vcmUgZGF0YSBtb3ZlbWVudCAoTyhOKSBjb3BpZXMganVzdAp0byBnZXQgNjQgZWxlbWVudHMgaW50byBwbGFjZSkuCgpJZiB3ZSB0YWtlIG1pbnJ1bj0zMyBpbiB0aGlzIGNhc2UsIHRoZW4gd2UncmUgdmVyeSBsaWtlbHkgdG8gZW5kIHVwIHdpdGggNjQKcnVucyBlYWNoIG9mIGxlbmd0aCAzMywgYW5kIHRoZW4gYWxsIG1lcmdlcyBhcmUgcGVyZmVjdGx5IGJhbGFuY2VkLiAgQmV0dGVyIQoKV2hhdCB3ZSB3YW50IHRvIGF2b2lkIGlzIHBpY2tpbmcgbWlucnVuIHN1Y2ggdGhhdCBpbgoKICAgIHEsIHIgPSBkaXZtb2QoTiwgbWlucnVuKQoKcSBpcyBhIHBvd2VyIG9mIDIgYW5kIHI+MCAodGhlbiB0aGUgbGFzdCBtZXJnZSBvbmx5IGdldHMgciBlbGVtZW50cyBpbnRvCnBsYWNlLCBhbmQgciA8IG1pbnJ1biBpcyBzbWFsbCBjb21wYXJlZCB0byBOKSwgb3IgcSBhIGxpdHRsZSBsYXJnZXIgdGhhbiBhCnBvd2VyIG9mIDIgcmVnYXJkbGVzcyBvZiByICh0aGVuIHdlJ3ZlIGdvdCBhIGNhc2Ugc2ltaWxhciB0byAiMjExMiIsIGFnYWluCmxlYXZpbmcgdG9vIGxpdHRsZSB3b3JrIGZvciB0aGUgbGFzdCBtZXJnZSB0byBkbykuCgpJbnN0ZWFkIHdlIHBpY2sgYSBtaW5ydW4gaW4gcmFuZ2UoMzIsIDY1KSBzdWNoIHRoYXQgTi9taW5ydW4gaXMgZXhhY3RseSBhCnBvd2VyIG9mIDIsIG9yIGlmIHRoYXQgaXNuJ3QgcG9zc2libGUsIGlzIGNsb3NlIHRvLCBidXQgc3RyaWN0bHkgbGVzcyB0aGFuLAphIHBvd2VyIG9mIDIuICBUaGlzIGlzIGVhc2llciB0byBkbyB0aGFuIGl0IG1heSBzb3VuZDogIHRha2UgdGhlIGZpcnN0IDYKYml0cyBvZiBOLCBhbmQgYWRkIDEgaWYgYW55IG9mIHRoZSByZW1haW5pbmcgYml0cyBhcmUgc2V0LiAgSW4gZmFjdCwgdGhhdApydWxlIGNvdmVycyBldmVyeSBjYXNlIGluIHRoaXMgc2VjdGlvbiwgaW5jbHVkaW5nIHNtYWxsIE4gYW5kIGV4YWN0IHBvd2VycwpvZiAyOyBtZXJnZV9jb21wdXRlX21pbnJ1bigpIGlzIGEgZGVjZXB0aXZlbHkgc2ltcGxlIGZ1bmN0aW9uLgoKClRoZSBNZXJnZSBQYXR0ZXJuCi0tLS0tLS0tLS0tLS0tLS0tCkluIG9yZGVyIHRvIGV4cGxvaXQgcmVndWxhcml0aWVzIGluIHRoZSBkYXRhLCB3ZSdyZSBtZXJnaW5nIG9uIG5hdHVyYWwKcnVuIGxlbmd0aHMsIGFuZCB0aGV5IGNhbiBiZWNvbWUgd2lsZGx5IHVuYmFsYW5jZWQuICBUaGF0J3MgYSBHb29kIFRoaW5nCmZvciB0aGlzIHNvcnQhICBJdCBtZWFucyB3ZSBoYXZlIHRvIGZpbmQgYSB3YXkgdG8gbWFuYWdlIGFuIGFzc29ydG1lbnQgb2YKcG90ZW50aWFsbHkgdmVyeSBkaWZmZXJlbnQgcnVuIGxlbmd0aHMsIHRob3VnaC4KClN0YWJpbGl0eSBjb25zdHJhaW5zIHBlcm1pc3NpYmxlIG1lcmdpbmcgcGF0dGVybnMuICBGb3IgZXhhbXBsZSwgaWYgd2UgaGF2ZQozIGNvbnNlY3V0aXZlIHJ1bnMgb2YgbGVuZ3RocwoKICAgIEE6MTAwMDAgIEI6MjAwMDAgIEM6MTAwMDAKCndlIGRhcmUgbm90IG1lcmdlIEEgd2l0aCBDIGZpcnN0LCBiZWNhdXNlIGlmIEEsIEIgYW5kIEMgaGFwcGVuIHRvIGNvbnRhaW4KYSBjb21tb24gZWxlbWVudCwgaXQgd291bGQgZ2V0IG91dCBvZiBvcmRlciB3cnQgaXRzIG9jY3VyZW5jZShzKSBpbiBCLiAgVGhlCm1lcmdpbmcgbXVzdCBiZSBkb25lIGFzIChBK0IpK0Mgb3IgQSsoQitDKSBpbnN0ZWFkLgoKU28gbWVyZ2luZyBpcyBhbHdheXMgZG9uZSBvbiB0d28gY29uc2VjdXRpdmUgcnVucyBhdCBhIHRpbWUsIGFuZCBpbi1wbGFjZSwKYWx0aG91Z2ggdGhpcyBtYXkgcmVxdWlyZSBzb21lIHRlbXAgbWVtb3J5IChtb3JlIG9uIHRoYXQgbGF0ZXIpLgoKV2hlbiBhIHJ1biBpcyBpZGVudGlmaWVkLCBpdHMgYmFzZSBhZGRyZXNzIGFuZCBsZW5ndGggYXJlIHB1c2hlZCBvbiBhIHN0YWNrCmluIHRoZSBNZXJnZVN0YXRlIHN0cnVjdC4gIG1lcmdlX2NvbGxhcHNlKCkgaXMgdGhlbiBjYWxsZWQgdG8gc2VlIHdoZXRoZXIgaXQKc2hvdWxkIG1lcmdlIGl0IHdpdGggcHJlY2VkaW5nIHJ1bihzKS4gIFdlIHdvdWxkIGxpa2UgdG8gZGVsYXkgbWVyZ2luZyBhcwpsb25nIGFzIHBvc3NpYmxlIGluIG9yZGVyIHRvIGV4cGxvaXQgcGF0dGVybnMgdGhhdCBtYXkgY29tZSB1cCBsYXRlciwgYnV0IHdlCmxpa2UgZXZlbiBtb3JlIHRvIGRvIG1lcmdpbmcgYXMgc29vbiBhcyBwb3NzaWJsZSB0byBleHBsb2l0IHRoYXQgdGhlIHJ1biBqdXN0CmZvdW5kIGlzIHN0aWxsIGhpZ2ggaW4gdGhlIG1lbW9yeSBoaWVyYXJjaHkuICBXZSBhbHNvIGNhbid0IGRlbGF5IG1lcmdpbmcKInRvbyBsb25nIiBiZWNhdXNlIGl0IGNvbnN1bWVzIG1lbW9yeSB0byByZW1lbWJlciB0aGUgcnVucyB0aGF0IGFyZSBzdGlsbAp1bm1lcmdlZCwgYW5kIHRoZSBzdGFjayBoYXMgYSBmaXhlZCBzaXplLgoKV2hhdCB0dXJuZWQgb3V0IHRvIGJlIGEgZ29vZCBjb21wcm9taXNlIG1haW50YWlucyB0d28gaW52YXJpYW50cyBvbiB0aGUKc3RhY2sgZW50cmllcywgd2hlcmUgQSwgQiBhbmQgQyBhcmUgdGhlIGxlbmd0aHMgb2YgdGhlIHRocmVlIHJpZ2htb3N0IG5vdC15ZXQKbWVyZ2VkIHNsaWNlczoKCjEuICBBID4gQitDCjIuICBCID4gQwoKTm90ZSB0aGF0LCBieSBpbmR1Y3Rpb24sICMyIGltcGxpZXMgdGhlIGxlbmd0aHMgb2YgcGVuZGluZyBydW5zIGZvcm0gYQpkZWNyZWFzaW5nIHNlcXVlbmNlLiAgIzEgaW1wbGllcyB0aGF0LCByZWFkaW5nIHRoZSBsZW5ndGhzIHJpZ2h0IHRvIGxlZnQsCnRoZSBwZW5kaW5nLXJ1biBsZW5ndGhzIGdyb3cgYXQgbGVhc3QgYXMgZmFzdCBhcyB0aGUgRmlib25hY2NpIG51bWJlcnMuClRoZXJlZm9yZSB0aGUgc3RhY2sgY2FuIG5ldmVyIGdyb3cgbGFyZ2VyIHRoYW4gYWJvdXQgbG9nX2Jhc2VfcGhpKE4pIGVudHJpZXMsCndoZXJlIHBoaSA9ICgxK3NxcnQoNSkpLzIgfj0gMS42MTguICBUaHVzIGEgc21hbGwgIyBvZiBzdGFjayBzbG90cyBzdWZmaWNlCmZvciB2ZXJ5IGxhcmdlIGFycmF5cy4KCklmIEEgPD0gQitDLCB0aGUgc21hbGxlciBvZiBBIGFuZCBDIGlzIG1lcmdlZCB3aXRoIEIgKHRpZXMgZmF2b3IgQywgZm9yIHRoZQpmcmVzaG5lc3MtaW4tY2FjaGUgcmVhc29uKSwgYW5kIHRoZSBuZXcgcnVuIHJlcGxhY2VzIHRoZSBBLEIgb3IgQixDIGVudHJpZXM7CmUuZy4sIGlmIHRoZSBsYXN0IDMgZW50cmllcyBhcmUKCiAgICBBOjMwICBCOjIwICBDOjEwCgp0aGVuIEIgaXMgbWVyZ2VkIHdpdGggQywgbGVhdmluZwoKICAgIEE6MzAgIEJDOjMwCgpvbiB0aGUgc3RhY2suICBPciBpZiB0aGV5IHdlcmUKCiAgICBBOjUwMCAgQjo0MDA6ICBDOjEwMDAKCnRoZW4gQSBpcyBtZXJnZWQgd2l0aCBCLCBsZWF2aW5nCgogICAgQUI6OTAwICBDOjEwMDAKCm9uIHRoZSBzdGFjay4KCkluIGJvdGggZXhhbXBsZXMsIHRoZSBzdGFjayBjb25maWd1cmF0aW9uIGFmdGVyIHRoZSBtZXJnZSBzdGlsbCB2aW9sYXRlcwppbnZhcmlhbnQgIzIsIGFuZCBtZXJnZV9jb2xsYXBzZSgpIGdvZXMgb24gdG8gY29udGludWUgbWVyZ2luZyBydW5zIHVudGlsCmJvdGggaW52YXJpYW50cyBhcmUgc2F0aXNmaWVkLiAgQXMgYW4gZXh0cmVtZSBjYXNlLCBzdXBwb3NlIHdlIGRpZG4ndCBkbyB0aGUKbWlucnVuIGdpbW1pY2ssIGFuZCBuYXR1cmFsIHJ1bnMgd2VyZSBvZiBsZW5ndGhzIDEyOCwgNjQsIDMyLCAxNiwgOCwgNCwgMiwKYW5kIDIuICBOb3RoaW5nIHdvdWxkIGdldCBtZXJnZWQgdW50aWwgdGhlIGZpbmFsIDIgd2FzIHNlZW4sIGFuZCB0aGF0IHdvdWxkCnRyaWdnZXIgNyBwZXJmZWN0bHkgYmFsYW5jZWQgbWVyZ2VzLgoKVGhlIHRocnVzdCBvZiB0aGVzZSBydWxlcyB3aGVuIHRoZXkgdHJpZ2dlciBtZXJnaW5nIGlzIHRvIGJhbGFuY2UgdGhlIHJ1bgpsZW5ndGhzIGFzIGNsb3NlbHkgYXMgcG9zc2libGUsIHdoaWxlIGtlZXBpbmcgYSBsb3cgYm91bmQgb24gdGhlIG51bWJlciBvZgpydW5zIHdlIGhhdmUgdG8gcmVtZW1iZXIuICBUaGlzIGlzIG1heGltYWxseSBlZmZlY3RpdmUgZm9yIHJhbmRvbSBkYXRhLAp3aGVyZSBhbGwgcnVucyBhcmUgbGlrZWx5IHRvIGJlIG9mIChhcnRpZmljaWFsbHkgZm9yY2VkKSBsZW5ndGggbWlucnVuLCBhbmQKdGhlbiB3ZSBnZXQgYSBzZXF1ZW5jZSBvZiBwZXJmZWN0bHkgYmFsYW5jZWQgbWVyZ2VzICh3aXRoLCBwZXJoYXBzLCBzb21lCm9kZGJhbGxzIGF0IHRoZSBlbmQpLgoKT1RPSCwgb25lIHJlYXNvbiB0aGlzIHNvcnQgaXMgc28gZ29vZCBmb3IgcGFydGx5IG9yZGVyZWQgZGF0YSBoYXMgdG8gZG8Kd2l0aCB3aWxkbHkgdW5iYWxhbmNlZCBydW4gbGVuZ3Rocy4KCgpNZXJnZSBNZW1vcnkKLS0tLS0tLS0tLS0tCk1lcmdpbmcgYWRqYWNlbnQgcnVucyBvZiBsZW5ndGhzIEEgYW5kIEIgaW4tcGxhY2UgaXMgdmVyeSBkaWZmaWN1bHQuClRoZW9yZXRpY2FsIGNvbnN0cnVjdGlvbnMgYXJlIGtub3duIHRoYXQgY2FuIGRvIGl0LCBidXQgdGhleSdyZSB0b28gZGlmZmljdWx0CmFuZCBzbG93IGZvciBwcmFjdGljYWwgdXNlLiAgQnV0IGlmIHdlIGhhdmUgdGVtcCBtZW1vcnkgZXF1YWwgdG8gbWluKEEsIEIpLAppdCdzIGVhc3kuCgpJZiBBIGlzIHNtYWxsZXIgKGZ1bmN0aW9uIG1lcmdlX2xvKSwgY29weSBBIHRvIGEgdGVtcCBhcnJheSwgbGVhdmUgQiBhbG9uZSwKYW5kIHRoZW4gd2UgY2FuIGRvIHRoZSBvYnZpb3VzIG1lcmdlIGFsZ29yaXRobSBsZWZ0IHRvIHJpZ2h0LCBmcm9tIHRoZSB0ZW1wCmFyZWEgYW5kIEIsIHN0YXJ0aW5nIHRoZSBzdG9yZXMgaW50byB3aGVyZSBBIHVzZWQgdG8gbGl2ZS4gIFRoZXJlJ3MgYWx3YXlzIGEKZnJlZSBhcmVhIGluIHRoZSBvcmlnaW5hbCBhcmVhIGNvbXByaXNpbmcgYSBudW1iZXIgb2YgZWxlbWVudHMgZXF1YWwgdG8gdGhlCm51bWJlciBub3QgeWV0IG1lcmdlZCBmcm9tIHRoZSB0ZW1wIGFycmF5ICh0cml2aWFsbHkgdHJ1ZSBhdCB0aGUgc3RhcnQ7CnByb2NlZWQgYnkgaW5kdWN0aW9uKS4gIFRoZSBvbmx5IHRyaWNreSBiaXQgaXMgdGhhdCBpZiBhIGNvbXBhcmlzb24gcmFpc2VzIGFuCmV4Y2VwdGlvbiwgd2UgaGF2ZSB0byByZW1lbWJlciB0byBjb3B5IHRoZSByZW1haW5pbmcgZWxlbWVudHMgYmFjayBpbiBmcm9tCnRoZSB0ZW1wIGFyZWEsIGxlc3QgdGhlIGFycmF5IGVuZCB1cCB3aXRoIGR1cGxpY2F0ZSBlbnRyaWVzIGZyb20gQi4gIEJ1dAp0aGF0J3MgZXhhY3RseSB0aGUgc2FtZSB0aGluZyB3ZSBuZWVkIHRvIGRvIGlmIHdlIHJlYWNoIHRoZSBlbmQgb2YgQiBmaXJzdCwKc28gdGhlIGV4aXQgY29kZSBpcyBwbGVhc2FudGx5IGNvbW1vbiB0byBib3RoIHRoZSBub3JtYWwgYW5kIGVycm9yIGNhc2VzLgoKSWYgQiBpcyBzbWFsbGVyIChmdW5jdGlvbiBtZXJnZV9oaSwgd2hpY2ggaXMgbWVyZ2VfbG8ncyAibWlycm9yIGltYWdlIiksCm11Y2ggdGhlIHNhbWUsIGV4Y2VwdCB0aGF0IHdlIG5lZWQgdG8gbWVyZ2UgcmlnaHQgdG8gbGVmdCwgY29weWluZyBCIGludG8gYQp0ZW1wIGFycmF5IGFuZCBzdGFydGluZyB0aGUgc3RvcmVzIGF0IHRoZSByaWdodCBlbmQgb2Ygd2hlcmUgQiB1c2VkIHRvIGxpdmUuCgpBIHJlZmluZW1lbnQ6ICBXaGVuIHdlJ3JlIGFib3V0IHRvIG1lcmdlIGFkamFjZW50IHJ1bnMgQSBhbmQgQiwgd2UgZmlyc3QgZG8KYSBmb3JtIG9mIGJpbmFyeSBzZWFyY2ggKG1vcmUgb24gdGhhdCBsYXRlcikgdG8gc2VlIHdoZXJlIEJbMF0gc2hvdWxkIGVuZCB1cAppbiBBLiAgRWxlbWVudHMgaW4gQSBwcmVjZWRpbmcgdGhhdCBwb2ludCBhcmUgYWxyZWFkeSBpbiB0aGVpciBmaW5hbApwb3NpdGlvbnMsIGVmZmVjdGl2ZWx5IHNocmlua2luZyB0aGUgc2l6ZSBvZiBBLiAgTGlrZXdpc2Ugd2UgYWxzbyBzZWFyY2ggdG8Kc2VlIHdoZXJlIEFbLTFdIHNob3VsZCBlbmQgdXAgaW4gQiwgYW5kIGVsZW1lbnRzIG9mIEIgYWZ0ZXIgdGhhdCBwb2ludCBjYW4KYWxzbyBiZSBpZ25vcmVkLiAgVGhpcyBjdXRzIHRoZSBhbW91bnQgb2YgdGVtcCBtZW1vcnkgbmVlZGVkIGJ5IHRoZSBzYW1lCmFtb3VudC4KClRoZXNlIHByZWxpbWluYXJ5IHNlYXJjaGVzIG1heSBub3QgcGF5IG9mZiwgYW5kIGNhbiBiZSBleHBlY3RlZCAqbm90KiB0bwpyZXBheSB0aGVpciBjb3N0IGlmIHRoZSBkYXRhIGlzIHJhbmRvbS4gIEJ1dCB0aGV5IGNhbiB3aW4gaHVnZSBpbiBhbGwgb2YKdGltZSwgY29weWluZywgYW5kIG1lbW9yeSBzYXZpbmdzIHdoZW4gdGhleSBkbyBwYXksIHNvIHRoaXMgaXMgb25lIG9mIHRoZQoicGVyLW1lcmdlIG92ZXJoZWFkcyIgbWVudGlvbmVkIGFib3ZlIHRoYXQgd2UncmUgaGFwcHkgdG8gZW5kdXJlIGJlY2F1c2UKdGhlcmUgaXMgYXQgbW9zdCBvbmUgdmVyeSBzaG9ydCBydW4uICBJdCdzIGdlbmVyYWxseSB0cnVlIGluIHRoaXMgYWxnb3JpdGhtCnRoYXQgd2UncmUgd2lsbGluZyB0byBnYW1ibGUgYSBsaXR0bGUgdG8gd2luIGEgbG90LCBldmVuIHRob3VnaCB0aGUgbmV0CmV4cGVjdGF0aW9uIGlzIG5lZ2F0aXZlIGZvciByYW5kb20gZGF0YS4KCgpNZXJnZSBBbGdvcml0aG1zCi0tLS0tLS0tLS0tLS0tLS0KbWVyZ2VfbG8oKSBhbmQgbWVyZ2VfaGkoKSBhcmUgd2hlcmUgdGhlIGJ1bGsgb2YgdGhlIHRpbWUgaXMgc3BlbnQuICBtZXJnZV9sbwpkZWFscyB3aXRoIHJ1bnMgd2hlcmUgQSA8PSBCLCBhbmQgbWVyZ2VfaGkgd2hlcmUgQSA+IEIuICBUaGV5IGRvbid0IGtub3cKd2hldGhlciB0aGUgZGF0YSBpcyBjbHVzdGVyZWQgb3IgdW5pZm9ybSwgYnV0IGEgbG92ZWx5IHRoaW5nIGFib3V0IG1lcmdpbmcKaXMgdGhhdCBtYW55IGtpbmRzIG9mIGNsdXN0ZXJpbmcgInJldmVhbCB0aGVtc2VsdmVzIiBieSBob3cgbWFueSB0aW1lcyBpbiBhCnJvdyB0aGUgd2lubmluZyBtZXJnZSBlbGVtZW50IGNvbWVzIGZyb20gdGhlIHNhbWUgcnVuLiAgV2UnbGwgb25seSBkaXNjdXNzCm1lcmdlX2xvIGhlcmU7IG1lcmdlX2hpIGlzIGV4YWN0bHkgYW5hbG9nb3VzLgoKTWVyZ2luZyBiZWdpbnMgaW4gdGhlIHVzdWFsLCBvYnZpb3VzIHdheSwgY29tcGFyaW5nIHRoZSBmaXJzdCBlbGVtZW50IG9mIEEKdG8gdGhlIGZpcnN0IG9mIEIsIGFuZCBtb3ZpbmcgQlswXSB0byB0aGUgbWVyZ2UgYXJlYSBpZiBpdCdzIGxlc3MgdGhhbiBBWzBdLAplbHNlIG1vdmluZyBBWzBdIHRvIHRoZSBtZXJnZSBhcmVhLiAgQ2FsbCB0aGF0IHRoZSAib25lIHBhaXIgYXQgYSB0aW1lIgptb2RlLiAgVGhlIG9ubHkgdHdpc3QgaGVyZSBpcyBrZWVwaW5nIHRyYWNrIG9mIGhvdyBtYW55IHRpbWVzIGluIGEgcm93ICJ0aGUKd2lubmVyIiBjb21lcyBmcm9tIHRoZSBzYW1lIHJ1bi4KCklmIHRoYXQgY291bnQgcmVhY2hlcyBNSU5fR0FMTE9QLCB3ZSBzd2l0Y2ggdG8gImdhbGxvcGluZyBtb2RlIi4gIEhlcmUKd2UgKnNlYXJjaCogQiBmb3Igd2hlcmUgQVswXSBiZWxvbmdzLCBhbmQgbW92ZSBvdmVyIGFsbCB0aGUgQidzIGJlZm9yZQp0aGF0IHBvaW50IGluIG9uZSBjaHVuayB0byB0aGUgbWVyZ2UgYXJlYSwgdGhlbiBtb3ZlIEFbMF0gdG8gdGhlIG1lcmdlCmFyZWEuICBUaGVuIHdlIHNlYXJjaCBBIGZvciB3aGVyZSBCWzBdIGJlbG9uZ3MsIGFuZCBzaW1pbGFybHkgbW92ZSBhCnNsaWNlIG9mIEEgaW4gb25lIGNodW5rLiAgVGhlbiBiYWNrIHRvIHNlYXJjaGluZyBCIGZvciB3aGVyZSBBWzBdIGJlbG9uZ3MsCmV0Yy4gIFdlIHN0YXkgaW4gZ2FsbG9waW5nIG1vZGUgdW50aWwgYm90aCBzZWFyY2hlcyBmaW5kIHNsaWNlcyB0byBjb3B5Cmxlc3MgdGhhbiBNSU5fR0FMTE9QIGVsZW1lbnRzIGxvbmcsIGF0IHdoaWNoIHBvaW50IHdlIGdvIGJhY2sgdG8gb25lLXBhaXItCmF0LWEtdGltZSBtb2RlLgoKQSByZWZpbmVtZW50OiAgVGhlIE1lcmdlU3RhdGUgc3RydWN0IGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiBtaW5fZ2FsbG9wIHRoYXQKY29udHJvbHMgd2hlbiB3ZSBlbnRlciBnYWxsb3BpbmcgbW9kZSwgaW5pdGlhbGl6ZWQgdG8gTUlOX0dBTExPUC4KbWVyZ2VfbG8oKSBhbmQgbWVyZ2VfaGkoKSBhZGp1c3QgdGhpcyBoaWdoZXIgd2hlbiBnYWxsb29waW5nIGlzbid0IHBheWluZwpvZmYsIGFuZCBsb3dlciB3aGVuIGl0IGlzLgoKCkdhbGxvcGluZwotLS0tLS0tLS0KU3RpbGwgd2l0aG91dCBsb3NzIG9mIGdlbmVyYWxpdHksIGFzc3VtZSBBIGlzIHRoZSBzaG9ydGVyIHJ1bi4gIEluIGdhbGxvcGluZwptb2RlLCB3ZSBmaXJzdCBsb29rIGZvciBBWzBdIGluIEIuICBXZSBkbyB0aGlzIHZpYSAiZ2FsbG9waW5nIiwgY29tcGFyaW5nCkFbMF0gaW4gdHVybiB0byBCWzBdLCBCWzFdLCBCWzNdLCBCWzddLCAuLi4sIEJbMioqaiAtIDFdLCAuLi4sIHVudGlsIGZpbmRpbmcKdGhlIGsgc3VjaCB0aGF0IEJbMioqKGstMSkgLSAxXSA8IEFbMF0gPD0gQlsyKiprIC0gMV0uICBUaGlzIHRha2VzIGF0IG1vc3QKcm91Z2hseSBsZyhCKSBjb21wYXJpc29ucywgYW5kLCB1bmxpa2UgYSBzdHJhaWdodCBiaW5hcnkgc2VhcmNoLCBmYXZvcnMKZmluZGluZyB0aGUgcmlnaHQgc3BvdCBlYXJseSBpbiBCIChtb3JlIG9uIHRoYXQgbGF0ZXIpLgoKQWZ0ZXIgZmluZGluZyBzdWNoIGEgaywgdGhlIHJlZ2lvbiBvZiB1bmNlcnRhaW50eSBpcyByZWR1Y2VkIHRvIDIqKihrLTEpIC0gMQpjb25zZWN1dGl2ZSBlbGVtZW50cywgYW5kIGEgc3RyYWlnaHQgYmluYXJ5IHNlYXJjaCByZXF1aXJlcyBleGFjdGx5IGstMQphZGRpdGlvbmFsIGNvbXBhcmlzb25zIHRvIG5haWwgaXQuICBUaGVuIHdlIGNvcHkgYWxsIHRoZSBCJ3MgdXAgdG8gdGhhdApwb2ludCBpbiBvbmUgY2h1bmssIGFuZCB0aGVuIGNvcHkgQVswXS4gIE5vdGUgdGhhdCBubyBtYXR0ZXIgd2hlcmUgQVswXQpiZWxvbmdzIGluIEIsIHRoZSBjb21iaW5hdGlvbiBvZiBnYWxsb3BpbmcgKyBiaW5hcnkgc2VhcmNoIGZpbmRzIGl0IGluIG5vCm1vcmUgdGhhbiBhYm91dCAyKmxnKEIpIGNvbXBhcmlzb25zLgoKSWYgd2UgZGlkIGEgc3RyYWlnaHQgYmluYXJ5IHNlYXJjaCwgd2UgY291bGQgZmluZCBpdCBpbiBubyBtb3JlIHRoYW4KY2VpbGluZyhsZyhCKzEpKSBjb21wYXJpc29ucyAtLSBidXQgc3RyYWlnaHQgYmluYXJ5IHNlYXJjaCB0YWtlcyB0aGF0IG1hbnkKY29tcGFyaXNvbnMgbm8gbWF0dGVyIHdoZXJlIEFbMF0gYmVsb25ncy4gIFN0cmFpZ2h0IGJpbmFyeSBzZWFyY2ggdGh1cyBsb3Nlcwp0byBnYWxsb3BpbmcgdW5sZXNzIHRoZSBydW4gaXMgcXVpdGUgbG9uZywgYW5kIHdlIHNpbXBseSBjYW4ndCBndWVzcwp3aGV0aGVyIGl0IGlzIGluIGFkdmFuY2UuCgpJZiBkYXRhIGlzIHJhbmRvbSBhbmQgcnVucyBoYXZlIHRoZSBzYW1lIGxlbmd0aCwgQVswXSBiZWxvbmdzIGF0IEJbMF0gaGFsZgp0aGUgdGltZSwgYXQgQlsxXSBhIHF1YXJ0ZXIgb2YgdGhlIHRpbWUsIGFuZCBzbyBvbjogIGEgY29uc2VjdXRpdmUgd2lubmluZwpzdWItcnVuIGluIEIgb2YgbGVuZ3RoIGsgb2NjdXJzIHdpdGggcHJvYmFiaWxpdHkgMS8yKiooaysxKS4gIFNvIGxvbmcKd2lubmluZyBzdWItcnVucyBhcmUgZXh0cmVtZWx5IHVubGlrZWx5IGluIHJhbmRvbSBkYXRhLCBhbmQgZ3Vlc3NpbmcgdGhhdCBhCndpbm5pbmcgc3ViLXJ1biBpcyBnb2luZyB0byBiZSBsb25nIGlzIGEgZGFuZ2Vyb3VzIGdhbWUuCgpPVE9ILCBpZiBkYXRhIGlzIGxvcHNpZGVkIG9yIGx1bXB5IG9yIGNvbnRhaW5zIG1hbnkgZHVwbGljYXRlcywgbG9uZwpzdHJldGNoZXMgb2Ygd2lubmluZyBzdWItcnVucyBhcmUgdmVyeSBsaWtlbHksIGFuZCBjdXR0aW5nIHRoZSBudW1iZXIgb2YKY29tcGFyaXNvbnMgbmVlZGVkIHRvIGZpbmQgb25lIGZyb20gTyhCKSB0byBPKGxvZyBCKSBpcyBhIGh1Z2Ugd2luLgoKR2FsbG9waW5nIGNvbXByb21pc2VzIGJ5IGdldHRpbmcgb3V0IGZhc3QgaWYgdGhlcmUgaXNuJ3QgYSBsb25nIHdpbm5pbmcKc3ViLXJ1biwgeWV0IGZpbmRpbmcgc3VjaCB2ZXJ5IGVmZmljaWVudGx5IHdoZW4gdGhleSBleGlzdC4KCkkgZmlyc3QgbGVhcm5lZCBhYm91dCB0aGUgZ2FsbG9waW5nIHN0cmF0ZWd5IGluIGEgcmVsYXRlZCBjb250ZXh0OyBzZWU6CgogICAgIkFkYXB0aXZlIFNldCBJbnRlcnNlY3Rpb25zLCBVbmlvbnMsIGFuZCBEaWZmZXJlbmNlcyIgKDIwMDApCiAgICBFcmlrIEQuIERlbWFpbmUsIEFsZWphbmRybyBM83Blei1PcnRpeiwgSi4gSWFuIE11bnJvCgphbmQgaXRzIGZvbGxvd3VwKHMpLiAgQW4gZWFybGllciBwYXBlciBjYWxsZWQgdGhlIHNhbWUgc3RyYXRlZ3kKImV4cG9uZW50aWFsIHNlYXJjaCI6CgogICAiT3B0aW1pc3RpYyBTb3J0aW5nIGFuZCBJbmZvcm1hdGlvbiBUaGVvcmV0aWMgQ29tcGxleGl0eSIKICAgUGV0ZXIgTWNJbHJveQogICBTT0RBIChGb3VydGggQW5udWFsIEFDTS1TSUFNIFN5bXBvc2l1bSBvbiBEaXNjcmV0ZSBBbGdvcml0aG1zKSwgcHAKICAgNDY3LTQ3NCwgQXVzdGluLCBUZXhhcywgMjUtMjcgSmFudWFyeSAxOTkzLgoKYW5kIGl0IHByb2JhYmx5IGRhdGVzIGJhY2sgdG8gYW4gZWFybGllciBwYXBlciBieSBCZW50bGV5IGFuZCBZYW8uICBUaGUKTWNJbG9yeSBwYXBlciBpbiBwYXJ0aWN1bGFyIGhhcyBnb29kIGFuYWx5c2lzIG9mIGEgbWVyZ2Vzb3J0IHRoYXQncwpwcm9iYWJseSBzdHJvbmdseSByZWxhdGVkIHRvIHRoaXMgb25lIGluIGl0cyBnYWxsb3Bpbmcgc3RyYXRlZ3kuCgoKR2FsbG9waW5nIHdpdGggYSBCcm9rZW4gTGVnCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpTbyB3aHkgZG9uJ3Qgd2UgYWx3YXlzIGdhbGxvcD8gIEJlY2F1c2UgaXQgY2FuIGxvc2UsIG9uIHR3byBjb3VudHM6CgoxLiBXaGlsZSB3ZSdyZSB3aWxsaW5nIHRvIGVuZHVyZSBzbWFsbCBwZXItbWVyZ2Ugb3ZlcmhlYWRzLCBwZXItY29tcGFyaXNvbgogICBvdmVyaGVhZHMgYXJlIGEgZGlmZmVyZW50IHN0b3J5LiAgQ2FsbGluZyBZZXQgQW5vdGhlciBGdW5jdGlvbiBwZXIKICAgY29tcGFyaXNvbiBpcyBleHBlbnNpdmUsIGFuZCBnYWxsb3BfbGVmdCgpIGFuZCBnYWxsb3BfcmlnaHQoKSBhcmUKICAgdG9vIGxvbmctd2luZGVkIGZvciBzYW5lIGlubGluaW5nLgoKMi4gR2FsbG9waW5nIGNhbi0tIGFsYXMgLS1yZXF1aXJlIG1vcmUgY29tcGFyaXNvbnMgdGhhbiBsaW5lYXIgb25lLWF0LXRpbWUKICAgc2VhcmNoLCBkZXBlbmRpbmcgb24gdGhlIGRhdGEuCgojMiByZXF1aXJlcyBkZXRhaWxzLiAgSWYgQVswXSBiZWxvbmdzIGJlZm9yZSBCWzBdLCBnYWxsb3BpbmcgcmVxdWlyZXMgMQpjb21wYXJlIHRvIGRldGVybWluZSB0aGF0LCBzYW1lIGFzIGxpbmVhciBzZWFyY2gsIGV4Y2VwdCBpdCBjb3N0cyBtb3JlCnRvIGNhbGwgdGhlIGdhbGxvcCBmdW5jdGlvbi4gIElmIEFbMF0gYmVsb25ncyByaWdodCBiZWZvcmUgQlsxXSwgZ2FsbG9waW5nCnJlcXVpcmVzIDIgY29tcGFyZXMsIGFnYWluIHNhbWUgYXMgbGluZWFyIHNlYXJjaC4gIE9uIHRoZSB0aGlyZCBjb21wYXJlLApnYWxsb3BpbmcgY2hlY2tzIEFbMF0gYWdhaW5zdCBCWzNdLCBhbmQgaWYgaXQncyA8PSwgcmVxdWlyZXMgb25lIG1vcmUKY29tcGFyZSB0byBkZXRlcm1pbmUgd2hldGhlciBBWzBdIGJlbG9uZ3MgYXQgQlsyXSBvciBCWzNdLiAgVGhhdCdzIGEgdG90YWwKb2YgNCBjb21wYXJlcywgYnV0IGlmIEFbMF0gZG9lcyBiZWxvbmcgYXQgQlsyXSwgbGluZWFyIHNlYXJjaCB3b3VsZCBoYXZlCmRpc2NvdmVyZWQgdGhhdCBpbiBvbmx5IDMgY29tcGFyZXMsIGFuZCB0aGF0J3MgYSBodWdlIGxvc3MhICBSZWFsbHkuICBJdCdzCmFuIGluY3JlYXNlIG9mIDMzJSBpbiB0aGUgbnVtYmVyIG9mIGNvbXBhcmVzIG5lZWRlZCwgYW5kIGNvbXBhcmlzb25zIGFyZQpleHBlbnNpdmUgaW4gUHl0aG9uLgoKaW5kZXggaW4gQiB3aGVyZSAgICAjIGNvbXBhcmVzIGxpbmVhciAgIyBnYWxsb3AgICMgYmluYXJ5ICBnYWxsb3AKQVswXSBiZWxvbmdzICAgICAgICBzZWFyY2ggbmVlZHMgICAgICAgY29tcGFyZXMgIGNvbXBhcmVzICB0b3RhbAotLS0tLS0tLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tICAtLS0tLS0tLSAgLS0tLS0tLS0gIC0tLS0tLQogICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgMSAgICAgICAgIDAgICAgICAgMQoKICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIDIgICAgICAgICAwICAgICAgIDIKCiAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAzICAgICAgICAgMSAgICAgICA0CiAgICAgICAgICAgICAgIDMgICAgICAgICAgICAgICAgICAgIDQgICAgICAgICAzICAgICAgICAgMSAgICAgICA0CgogICAgICAgICAgICAgICA0ICAgICAgICAgICAgICAgICAgICA1ICAgICAgICAgNCAgICAgICAgIDIgICAgICAgNgogICAgICAgICAgICAgICA1ICAgICAgICAgICAgICAgICAgICA2ICAgICAgICAgNCAgICAgICAgIDIgICAgICAgNgogICAgICAgICAgICAgICA2ICAgICAgICAgICAgICAgICAgICA3ICAgICAgICAgNCAgICAgICAgIDIgICAgICAgNgogICAgICAgICAgICAgICA3ICAgICAgICAgICAgICAgICAgICA4ICAgICAgICAgNCAgICAgICAgIDIgICAgICAgNgoKICAgICAgICAgICAgICAgOCAgICAgICAgICAgICAgICAgICAgOSAgICAgICAgIDUgICAgICAgICAzICAgICAgIDgKICAgICAgICAgICAgICAgOSAgICAgICAgICAgICAgICAgICAxMCAgICAgICAgIDUgICAgICAgICAzICAgICAgIDgKICAgICAgICAgICAgICAxMCAgICAgICAgICAgICAgICAgICAxMSAgICAgICAgIDUgICAgICAgICAzICAgICAgIDgKICAgICAgICAgICAgICAxMSAgICAgICAgICAgICAgICAgICAxMiAgICAgICAgIDUgICAgICAgICAzICAgICAgIDgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLgoKSW4gZ2VuZXJhbCwgaWYgQVswXSBiZWxvbmdzIGF0IEJbaV0sIGxpbmVhciBzZWFyY2ggcmVxdWlyZXMgaSsxIGNvbXBhcmlzb25zCnRvIGRldGVybWluZSB0aGF0LCBhbmQgZ2FsbG9waW5nIGEgdG90YWwgb2YgMipmbG9vcihsZyhpKSkrMiBjb21wYXJpc29ucy4KVGhlIGFkdmFudGFnZSBvZiBnYWxsb3BpbmcgaXMgdW5ib3VuZGVkIGFzIGkgZ3Jvd3MsIGJ1dCBpdCBkb2Vzbid0IHdpbiBhdAphbGwgdW50aWwgaT02LiAgQmVmb3JlIHRoZW4sIGl0IGxvc2VzIHR3aWNlIChhdCBpPTIgYW5kIGk9NCksIGFuZCB0aWVzCmF0IHRoZSBvdGhlciB2YWx1ZXMuICBBdCBhbmQgYWZ0ZXIgaT02LCBnYWxsb3BpbmcgYWx3YXlzIHdpbnMuCgpXZSBjYW4ndCBndWVzcyBpbiBhZHZhbmNlIHdoZW4gaXQncyBnb2luZyB0byB3aW4sIHRob3VnaCwgc28gd2UgZG8gb25lIHBhaXIKYXQgYSB0aW1lIHVudGlsIHRoZSBldmlkZW5jZSBzZWVtcyBzdHJvbmcgdGhhdCBnYWxsb3BpbmcgbWF5IHBheS4gIE1JTl9HQUxMT1AKaXMgNywgYW5kIHRoYXQncyBwcmV0dHkgc3Ryb25nIGV2aWRlbmNlLiAgSG93ZXZlciwgaWYgdGhlIGRhdGEgaXMgcmFuZG9tLCBpdApzaW1wbHkgd2lsbCB0cmlnZ2VyIGdhbGxvcGluZyBtb2RlIHB1cmVseSBieSBsdWNrIGV2ZXJ5IG5vdyBhbmQgYWdhaW4sIGFuZAppdCdzIHF1aXRlIGxpa2VseSB0byBoaXQgb25lIG9mIHRoZSBsb3NpbmcgY2FzZXMgbmV4dC4gIE9uIHRoZSBvdGhlciBoYW5kLAppbiBjYXNlcyBsaWtlIH5zb3J0LCBnYWxsb3BpbmcgYWx3YXlzIHBheXMsIGFuZCBNSU5fR0FMTE9QIGlzIGxhcmdlciB0aGFuIGl0CiJzaG91bGQgYmUiIHRoZW4uICBTbyB0aGUgTWVyZ2VTdGF0ZSBzdHJ1Y3Qga2VlcHMgYSBtaW5fZ2FsbG9wIHZhcmlhYmxlCnRoYXQgbWVyZ2VfbG8gYW5kIG1lcmdlX2hpIGFkanVzdDogIHRoZSBsb25nZXIgd2Ugc3RheSBpbiBnYWxsb3BpbmcgbW9kZSwKdGhlIHNtYWxsZXIgbWluX2dhbGxvcCBnZXRzLCBtYWtpbmcgaXQgZWFzaWVyIHRvIHRyYW5zaXRpb24gYmFjayB0bwpnYWxsb3BpbmcgbW9kZSAoaWYgd2UgZXZlciBsZWF2ZSBpdCBpbiB0aGUgY3VycmVudCBtZXJnZSwgYW5kIGF0IHRoZQpzdGFydCBvZiB0aGUgbmV4dCBtZXJnZSkuICBCdXQgd2hlbmV2ZXIgdGhlIGdhbGxvcCBsb29wIGRvZXNuJ3QgcGF5LAptaW5fZ2FsbG9wIGlzIGluY3JlYXNlZCBieSBvbmUsIG1ha2luZyBpdCBoYXJkZXIgdG8gdHJhbnNpdGlvbiB0byBiYWNrCnRvIGdhbGxvcGluZyBtb2RlIChhbmQgYWdhaW4gYm90aCB3aXRoaW4gYSBtZXJnZSBhbmQgYWNyb3NzIG1lcmdlcykuICBGb3IKcmFuZG9tIGRhdGEsIHRoaXMgYWxsIGJ1dCBlbGltaW5hdGVzIHRoZSBnYWxsb3AgcGVuYWx0eTogIG1pbl9nYWxsb3AgZ3Jvd3MKbGFyZ2UgZW5vdWdoIHRoYXQgd2UgYWxtb3N0IG5ldmVyIGdldCBpbnRvIGdhbGxvcGluZyBtb2RlLiAgQW5kIGZvciBjYXNlcwpsaWtlIH5zb3J0LCBtaW5fZ2FsbG9wIGNhbiBmYWxsIHRvIGFzIGxvdyBhcyAxLiAgVGhpcyBzZWVtcyB0byB3b3JrIHdlbGwsCmJ1dCBpbiBhbGwgaXQncyBhIG1pbm9yIGltcHJvdmVtZW50IG92ZXIgdXNpbmcgYSBmaXhlZCBNSU5fR0FMTE9QIHZhbHVlLgoKCkdhbGxvcGluZyBDb21wbGljYXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpUaGUgZGVzY3JpcHRpb24gYWJvdmUgd2FzIGZvciBtZXJnZV9sby4gIG1lcmdlX2hpIGhhcyB0byBtZXJnZSAiZnJvbSB0aGUKb3RoZXIgZW5kIiwgYW5kIHJlYWxseSBuZWVkcyB0byBnYWxsb3Agc3RhcnRpbmcgYXQgdGhlIGxhc3QgZWxlbWVudCBpbiBhIHJ1bgppbnN0ZWFkIG9mIHRoZSBmaXJzdC4gIEdhbGxvcGluZyBmcm9tIHRoZSBmaXJzdCBzdGlsbCB3b3JrcywgYnV0IGRvZXMgbW9yZQpjb21wYXJpc29ucyB0aGFuIGl0IHNob3VsZCAodGhpcyBpcyBzaWduaWZpY2FudCAtLSBJIHRpbWVkIGl0IGJvdGggd2F5cykuCkZvciB0aGlzIHJlYXNvbiwgdGhlIGdhbGxvcF9sZWZ0KCkgYW5kIGdhbGxvcF9yaWdodCgpIGZ1bmN0aW9ucyBoYXZlIGEKImhpbnQiIGFyZ3VtZW50LCB3aGljaCBpcyB0aGUgaW5kZXggYXQgd2hpY2ggZ2FsbG9waW5nIHNob3VsZCBiZWdpbi4gIFNvCmdhbGxvcGluZyBjYW4gYWN0dWFsbHkgc3RhcnQgYXQgYW55IGluZGV4LCBhbmQgcHJvY2VlZCBhdCBvZmZzZXRzIG9mIDEsIDMsCjcsIDE1LCAuLi4gb3IgLTEsIC0zLCAtNywgLTE1LCAuLi4gZnJvbSB0aGUgc3RhcnRpbmcgaW5kZXguCgpJbiB0aGUgY29kZSBhcyBJIHR5cGUgaXQncyBhbHdheXMgY2FsbGVkIHdpdGggZWl0aGVyIDAgb3Igbi0xICh3aGVyZSBuIGlzCnRoZSAjIG9mIGVsZW1lbnRzIGluIGEgcnVuKS4gIEl0J3MgdGVtcHRpbmcgdG8gdHJ5IHRvIGRvIHNvbWV0aGluZyBmYW5jaWVyLAptZWxkaW5nIGdhbGxvcGluZyB3aXRoIHNvbWUgZm9ybSBvZiBpbnRlcnBvbGF0aW9uIHNlYXJjaDsgZm9yIGV4YW1wbGUsIGlmCndlJ3JlIG1lcmdpbmcgYSBydW4gb2YgbGVuZ3RoIDEgd2l0aCBhIHJ1biBvZiBsZW5ndGggMTAwMDAsIGluZGV4IDUwMDAgaXMKcHJvYmFibHkgYSBiZXR0ZXIgZ3Vlc3MgYXQgdGhlIGZpbmFsIHJlc3VsdCB0aGFuIGVpdGhlciAwIG9yIDk5OTkuICBCdXQKaXQncyB1bmNsZWFyIGhvdyB0byBnZW5lcmFsaXplIHRoYXQgaW50dWl0aW9uIHVzZWZ1bGx5LCBhbmQgbWVyZ2luZyBvZgp3aWxkbHkgdW5iYWxhbmNlZCBydW5zIGFscmVhZHkgZW5qb3lzIGV4Y2VsbGVudCBwZXJmb3JtYW5jZS4KCgpDb21wYXJpbmcgQXZlcmFnZSAjIG9mIENvbXBhcmVzIG9uIFJhbmRvbSBBcnJheXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCltOT1RFOiAgVGhpcyB3YXMgZG9uZSB3aGVuIHRoZSBuZXcgYWxnb3JpdGhtIHVzZWQgYWJvdXQgMC4xJSBtb3JlIGNvbXBhcmVzCiBvbiByYW5kb20gZGF0YSB0aGFuIGRvZXMgaXRzIGN1cnJlbnQgaW5jYXJuYXRpb24uXQoKSGVyZSBsaXN0LnNvcnQoKSBpcyBzYW1wbGVzb3J0LCBhbmQgbGlzdC5tc29ydCgpIHRoaXMgc29ydDoKCiIiIgppbXBvcnQgcmFuZG9tCmZyb20gdGltZSBpbXBvcnQgY2xvY2sgYXMgbm93CgpkZWYgZmlsbChuKToKICAgIGZyb20gcmFuZG9tIGltcG9ydCByYW5kb20KICAgIHJldHVybiBbcmFuZG9tKCkgZm9yIGkgaW4geHJhbmdlKG4pXQoKZGVmIG15Y21wKHgsIHkpOgogICAgZ2xvYmFsIG5jbXAKICAgIG5jbXAgKz0gMQogICAgcmV0dXJuIGNtcCh4LCB5KQoKZGVmIHRpbWVpdCh2YWx1ZXMsIG1ldGhvZCk6CiAgICBnbG9iYWwgbmNtcAogICAgWCA9IHZhbHVlc1s6XQogICAgYm91bmQgPSBnZXRhdHRyKFgsIG1ldGhvZCkKICAgIG5jbXAgPSAwCiAgICB0MSA9IG5vdygpCiAgICBib3VuZChteWNtcCkKICAgIHQyID0gbm93KCkKICAgIHJldHVybiB0Mi10MSwgbmNtcAoKZm9ybWF0ID0gIiU1cyAgJTkuMmYgICUxMWQiCmYyICAgICA9ICIlNXMgICU5LjJmICAlMTEuMmYiCgpkZWYgZHJpdmUoKToKICAgIGNvdW50ID0gc3N0ID0gc3NjbXAgPSBtc3QgPSBtc2NtcCA9IG5lbHRzID0gMAogICAgd2hpbGUgVHJ1ZToKICAgICAgICBuID0gcmFuZG9tLnJhbmRyYW5nZSgxMDAwMDApCiAgICAgICAgbmVsdHMgKz0gbgogICAgICAgIHggPSBmaWxsKG4pCgogICAgICAgIHQsIGMgPSB0aW1laXQoeCwgJ3NvcnQnKQogICAgICAgIHNzdCArPSB0CiAgICAgICAgc3NjbXAgKz0gYwoKICAgICAgICB0LCBjID0gdGltZWl0KHgsICdtc29ydCcpCiAgICAgICAgbXN0ICs9IHQKICAgICAgICBtc2NtcCArPSBjCgogICAgICAgIGNvdW50ICs9IDEKICAgICAgICBpZiBjb3VudCAlIDEwOgogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBwcmludCAiY291bnQiLCBjb3VudCwgIm5lbHRzIiwgbmVsdHMKICAgICAgICBwcmludCBmb3JtYXQgJSAoInNvcnQiLCAgc3N0LCBzc2NtcCkKICAgICAgICBwcmludCBmb3JtYXQgJSAoIm1zb3J0IiwgbXN0LCBtc2NtcCkKICAgICAgICBwcmludCBmMiAgICAgJSAoIiIsIChzc3QtbXN0KSoxZTIvbXN0LCAoc3NjbXAtbXNjbXApKjFlMi9tc2NtcCkKCmRyaXZlKCkKIiIiCgpJIHJhbiB0aGlzIG9uIFdpbmRvd3MgYW5kIGtlcHQgdXNpbmcgdGhlIGNvbXB1dGVyIGxpZ2h0bHkgd2hpbGUgaXQgd2FzCnJ1bm5pbmcuICB0aW1lLmNsb2NrKCkgaXMgd2FsbC1jbG9jayB0aW1lIG9uIFdpbmRvd3MsIHdpdGggYmV0dGVyIHRoYW4KbWljcm9zZWNvbmQgcmVzb2x1dGlvbi4gIHNhbXBsZXNvcnQgc3RhcnRlZCB3aXRoIGEgMS41MiUgIy1vZi1jb21wYXJpc29ucwpkaXNhZHZhbnRhZ2UsIGZlbGwgcXVpY2tseSB0byAxLjQ4JSwgYW5kIHRoZW4gZmx1Y3R1YXRlZCB3aXRoaW4gdGhhdCBzbWFsbApyYW5nZS4gIEhlcmUncyB0aGUgbGFzdCBjaHVuayBvZiBvdXRwdXQgYmVmb3JlIEkga2lsbGVkIHRoZSBqb2I6Cgpjb3VudCAyNjMwIG5lbHRzIDEzMDkwNjU0Mwogc29ydCAgICA2MTEwLjgwICAgMTkzNzg4NzU3Mwptc29ydCAgICA2MDAyLjc4ICAgMTkwOTM4OTM4MQogICAgICAgICAgICAxLjgwICAgICAgICAgMS40OQoKV2UndmUgZG9uZSBuZWFybHkgMiBiaWxsaW9uIGNvbXBhcmlzb25zIGFwaWVjZSBhdCBQeXRob24gc3BlZWQgdGhlcmUsIGFuZAp0aGF0J3MgZW5vdWdoIDx3aW5rPi4KCkZvciByYW5kb20gYXJyYXlzIG9mIHNpemUgMiAoeWVzLCB0aGVyZSBhcmUgb25seSAyIGludGVyZXN0aW5nIG9uZXMpLApzYW1wbGVzb3J0IGhhcyBhIDUwJSghKSBjb21wYXJpc29uIGRpc2FkdmFudGFnZS4gIFRoaXMgaXMgYSBjb25zZXF1ZW5jZSBvZgpzYW1wbGVzb3J0IHNwZWNpYWwtY2FzaW5nIGF0IG1vc3Qgb25lIGFzY2VuZGluZyBydW4gYXQgdGhlIHN0YXJ0LCB0aGVuCmZhbGxpbmcgYmFjayB0byB0aGUgZ2VuZXJhbCBjYXNlIGlmIGl0IGRvZXNuJ3QgZmluZCBhbiBhc2NlbmRpbmcgcnVuCmltbWVkaWF0ZWx5LiAgVGhlIGNvbnNlcXVlbmNlIGlzIHRoYXQgaXQgZW5kcyB1cCB1c2luZyB0d28gY29tcGFyZXMgdG8gc29ydApbMiwgMV0uICBHcmF0aWZ5aW5nbHksIHRpbXNvcnQgZG9lc24ndCBkbyBhbnkgc3BlY2lhbC1jYXNpbmcsIHNvIGhhZCB0byBiZQp0YXVnaHQgaG93IHRvIGRlYWwgd2l0aCBtaXh0dXJlcyBvZiBhc2NlbmRpbmcgYW5kIGRlc2NlbmRpbmcgcnVucwplZmZpY2llbnRseSBpbiBhbGwgY2FzZXMuCg==