KnNwZWxsLnR4dCoJRm9yIFZpbSB2ZXJzaW9uIDcuMy4gIExhc3QgY2hhbmdlOiAyMDExIE1heSAyNQoKCgkJICBWSU0gUkVGRVJFTkNFIE1BTlVBTAkgIGJ5IEJyYW0gTW9vbGVuYWFyCgoKU3BlbGwgY2hlY2tpbmcJCQkJCQkqc3BlbGwqCgoxLiBRdWljayBzdGFydAkJCXxzcGVsbC1xdWlja3N0YXJ0fAoyLiBSZW1hcmtzIG9uIHNwZWxsIGNoZWNraW5nCXxzcGVsbC1yZW1hcmtzfAozLiBHZW5lcmF0aW5nIGEgc3BlbGwgZmlsZQl8c3BlbGwtbWtzcGVsbHwKNC4gU3BlbGwgZmlsZSBmb3JtYXQJCXxzcGVsbC1maWxlLWZvcm1hdHwKCntWaSBkb2VzIG5vdCBoYXZlIGFueSBvZiB0aGVzZSBjb21tYW5kc30KClNwZWxsIGNoZWNraW5nIGlzIG5vdCBhdmFpbGFibGUgd2hlbiB0aGUgfCtzeW50YXh8IGZlYXR1cmUgaGFzIGJlZW4gZGlzYWJsZWQKYXQgY29tcGlsZSB0aW1lLgoKTm90ZTogVGhlcmUgYWxzbyBpcyBhIHZpbXNwZWxsIHBsdWdpbi4gIElmIHlvdSBoYXZlIGl0IHlvdSBjYW4gZG8gIjpoZWxwCnZpbXNwZWxsIiB0byBmaW5kIGFib3V0IGl0LiAgQnV0IHlvdSB3aWxsIHByb2JhYmx5IHdhbnQgdG8gZ2V0IHJpZCBvZiB0aGUKcGx1Z2luIGFuZCB1c2UgdGhlICdzcGVsbCcgb3B0aW9uIGluc3RlYWQsIGl0IHdvcmtzIGJldHRlci4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoxLiBRdWljayBzdGFydAkJCQkJKnNwZWxsLXF1aWNrc3RhcnQqICpFNzU2KgoKVGhpcyBjb21tYW5kIHN3aXRjaGVzIG9uIHNwZWxsIGNoZWNraW5nOiA+CgoJOnNldGxvY2FsIHNwZWxsIHNwZWxsbGFuZz1lbl91cwoKVGhpcyBzd2l0Y2hlcyBvbiB0aGUgJ3NwZWxsJyBvcHRpb24gYW5kIHNwZWNpZmllcyB0byBjaGVjayBmb3IgVVMgRW5nbGlzaC4KClRoZSB3b3JkcyB0aGF0IGFyZSBub3QgcmVjb2duaXplZCBhcmUgaGlnaGxpZ2h0ZWQgd2l0aCBvbmUgb2YgdGhlc2U6CglTcGVsbEJhZAl3b3JkIG5vdCByZWNvZ25pemVkCQkJfGhsLVNwZWxsQmFkfAoJU3BlbGxDYXAJd29yZCBub3QgY2FwaXRhbGlzZWQJCQl8aGwtU3BlbGxDYXB8CglTcGVsbFJhcmUJcmFyZSB3b3JkCQkJCXxobC1TcGVsbFJhcmV8CglTcGVsbExvY2FsCXdyb25nIHNwZWxsaW5nIGZvciBzZWxlY3RlZCByZWdpb24JfGhsLVNwZWxsTG9jYWx8CgpWaW0gb25seSBjaGVja3Mgd29yZHMgZm9yIHNwZWxsaW5nLCB0aGVyZSBpcyBubyBncmFtbWFyIGNoZWNrLgoKSWYgdGhlICdtb3VzZW1vZGVsJyBvcHRpb24gaXMgc2V0IHRvICJwb3B1cCIgYW5kIHRoZSBjdXJzb3IgaXMgb24gYSBiYWRseQpzcGVsbGVkIHdvcmQgb3IgaXQgaXMgInBvcHVwX3NldHBvcyIgYW5kIHRoZSBtb3VzZSBwb2ludGVyIGlzIG9uIGEgYmFkbHkKc3BlbGxlZCB3b3JkLCB0aGVuIHRoZSBwb3B1cCBtZW51IHdpbGwgY29udGFpbiBhIHN1Ym1lbnUgdG8gcmVwbGFjZSB0aGUgYmFkCndvcmQuICBOb3RlOiB0aGlzIHNsb3dzIGRvd24gdGhlIGFwcGVhcmFuY2Ugb2YgdGhlIHBvcHVwIG1lbnUuICBOb3RlIGZvciBHVEs6CmRvbid0IHJlbGVhc2UgdGhlIHJpZ2h0IG1vdXNlIGJ1dHRvbiB1bnRpbCB0aGUgbWVudSBhcHBlYXJzLCBvdGhlcndpc2UgaXQKd29uJ3Qgd29yay4KClRvIHNlYXJjaCBmb3IgdGhlIG5leHQgbWlzc3BlbGxlZCB3b3JkOgoKCQkJCQkJCSpdcyoKXXMJCQlNb3ZlIHRvIG5leHQgbWlzc3BlbGxlZCB3b3JkIGFmdGVyIHRoZSBjdXJzb3IuCgkJCUEgY291bnQgYmVmb3JlIHRoZSBjb21tYW5kIGNhbiBiZSB1c2VkIHRvIHJlcGVhdC4KCQkJJ3dyYXBzY2FuJyBhcHBsaWVzLgoKCQkJCQkJCSpbcyoKW3MJCQlMaWtlICJdcyIgYnV0IHNlYXJjaCBiYWNrd2FyZHMsIGZpbmQgdGhlIG1pc3NwZWxsZWQKCQkJd29yZCBiZWZvcmUgdGhlIGN1cnNvci4gIERvZXNuJ3QgcmVjb2duaXplIHdvcmRzCgkJCXNwbGl0IG92ZXIgdHdvIGxpbmVzLCB0aHVzIG1heSBzdG9wIGF0IHdvcmRzIHRoYXQgYXJlCgkJCW5vdCBoaWdobGlnaHRlZCBhcyBiYWQuICBEb2VzIG5vdCBzdG9wIGF0IHdvcmQgd2l0aAoJCQltaXNzaW5nIGNhcGl0YWwgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZS4KCgkJCQkJCQkqXVMqCl1TCQkJTGlrZSAiXXMiIGJ1dCBvbmx5IHN0b3AgYXQgYmFkIHdvcmRzLCBub3QgYXQgcmFyZQoJCQl3b3JkcyBvciB3b3JkcyBmb3IgYW5vdGhlciByZWdpb24uCgoJCQkJCQkJKltTKgpbUwkJCUxpa2UgIl1TIiBidXQgc2VhcmNoIGJhY2t3YXJkcy4KCgpUbyBhZGQgd29yZHMgdG8geW91ciBvd24gd29yZCBsaXN0OgoKCQkJCQkJCSp6ZyoKemcJCQlBZGQgd29yZCB1bmRlciB0aGUgY3Vyc29yIGFzIGEgZ29vZCB3b3JkIHRvIHRoZSBmaXJzdAoJCQluYW1lIGluICdzcGVsbGZpbGUnLiAgQSBjb3VudCBtYXkgcHJlY2VkZSB0aGUgY29tbWFuZAoJCQl0byBpbmRpY2F0ZSB0aGUgZW50cnkgaW4gJ3NwZWxsZmlsZScgdG8gYmUgdXNlZC4gIEEKCQkJY291bnQgb2YgdHdvIHVzZXMgdGhlIHNlY29uZCBlbnRyeS4KCgkJCUluIFZpc3VhbCBtb2RlIHRoZSBzZWxlY3RlZCBjaGFyYWN0ZXJzIGFyZSBhZGRlZCBhcyBhCgkJCXdvcmQgKGluY2x1ZGluZyB3aGl0ZSBzcGFjZSEpLgoJCQlXaGVuIHRoZSBjdXJzb3IgaXMgb24gdGV4dCB0aGF0IGlzIG1hcmtlZCBhcyBiYWRseQoJCQlzcGVsbGVkIHRoZW4gdGhlIG1hcmtlZCB0ZXh0IGlzIHVzZWQuCgkJCU90aGVyd2lzZSB0aGUgd29yZCB1bmRlciB0aGUgY3Vyc29yLCBzZXBhcmF0ZWQgYnkKCQkJbm9uLXdvcmQgY2hhcmFjdGVycywgaXMgdXNlZC4KCgkJCUlmIHRoZSB3b3JkIGlzIGV4cGxpY2l0bHkgbWFya2VkIGFzIGJhZCB3b3JkIGluCgkJCWFub3RoZXIgc3BlbGwgZmlsZSB0aGUgcmVzdWx0IGlzIHVucHJlZGljdGFibGUuCgoJCQkJCQkJKnpHKgp6RwkJCUxpa2UgInpnIiBidXQgYWRkIHRoZSB3b3JkIHRvIHRoZSBpbnRlcm5hbCB3b3JkIGxpc3QKCQkJfGludGVybmFsLXdvcmRsaXN0fC4KCgkJCQkJCQkqencqCnp3CQkJTGlrZSAiemciIGJ1dCBtYXJrIHRoZSB3b3JkIGFzIGEgd3JvbmcgKGJhZCkgd29yZC4KCQkJSWYgdGhlIHdvcmQgYWxyZWFkeSBhcHBlYXJzIGluICdzcGVsbGZpbGUnIGl0IGlzCgkJCXR1cm5lZCBpbnRvIGEgY29tbWVudCBsaW5lLiAgU2VlIHxzcGVsbGZpbGUtY2xlYW51cHwKCQkJZm9yIGdldHRpbmcgcmlkIG9mIHRob3NlLgoKCQkJCQkJCSp6VyoKelcJCQlMaWtlICJ6dyIgYnV0IGFkZCB0aGUgd29yZCB0byB0aGUgaW50ZXJuYWwgd29yZCBsaXN0CgkJCXxpbnRlcm5hbC13b3JkbGlzdHwuCgp6dXcJCQkJCQkJKnp1ZyogKnp1dyoKenVnCQkJVW5kbyB8end8IGFuZCB8emd8LCByZW1vdmUgdGhlIHdvcmQgZnJvbSB0aGUgZW50cnkgaW4KCQkJJ3NwZWxsZmlsZScuICBDb3VudCB1c2VkIGFzIHdpdGggfHpnfC4KCnp1VwkJCQkJCQkqenVHKiAqenVXKgp6dUcJCQlVbmRvIHx6V3wgYW5kIHx6R3wsIHJlbW92ZSB0aGUgd29yZCBmcm9tIHRoZSBpbnRlcm5hbAoJCQl3b3JkIGxpc3QuICBDb3VudCB1c2VkIGFzIHdpdGggfHpnfC4KCgkJCQkJCQkqOnNwZSogKjpzcGVsbGdvb2QqCjpbY291bnRdc3BlW2xsZ29vZF0ge3dvcmR9CgkJCUFkZCB7d29yZH0gYXMgYSBnb29kIHdvcmQgdG8gJ3NwZWxsZmlsZScsIGxpa2Ugd2l0aAoJCQl8emd8LiAgV2l0aG91dCBjb3VudCB0aGUgZmlyc3QgbmFtZSBpcyB1c2VkLCB3aXRoIGEKCQkJY291bnQgb2YgdHdvIHRoZSBzZWNvbmQgZW50cnksIGV0Yy4KCjpzcGVbbGxnb29kXSEge3dvcmR9CUFkZCB7d29yZH0gYXMgYSBnb29kIHdvcmQgdG8gdGhlIGludGVybmFsIHdvcmQgbGlzdCwKCQkJbGlrZSB3aXRoIHx6R3wuCgoJCQkJCQkJKjpzcGVsbHcqICo6c3BlbGx3cm9uZyoKOltjb3VudF1zcGVsbHdbcm9uZ10ge3dvcmR9CgkJCUFkZCB7d29yZH0gYXMgYSB3cm9uZyAoYmFkKSB3b3JkIHRvICdzcGVsbGZpbGUnLCBhcwoJCQl3aXRoIHx6d3wuICBXaXRob3V0IGNvdW50IHRoZSBmaXJzdCBuYW1lIGlzIHVzZWQsIHdpdGgKCQkJYSBjb3VudCBvZiB0d28gdGhlIHNlY29uZCBlbnRyeSwgZXRjLgoKOnNwZWxsd1tyb25nXSEge3dvcmR9CUFkZCB7d29yZH0gYXMgYSB3cm9uZyAoYmFkKSB3b3JkIHRvIHRoZSBpbnRlcm5hbCB3b3JkCgkJCWxpc3QsIGxpa2Ugd2l0aCB8eld8LgoKOltjb3VudF1zcGVsbHVbbmRvXSB7d29yZH0JCQkJKjpzcGVsbHUqICo6c3BlbGx1bmRvKgoJCQlMaWtlIHx6dXd8LiAgW2NvdW50XSB1c2VkIGFzIHdpdGggfDpzcGVsbGdvb2R8LgoKOnNwZWxsdVtuZG9dISB7d29yZH0JTGlrZSB8enVXfC4gIFtjb3VudF0gdXNlZCBhcyB3aXRoIHw6c3BlbGxnb29kfC4KCgpBZnRlciBhZGRpbmcgYSB3b3JkIHRvICdzcGVsbGZpbGUnIHdpdGggdGhlIGFib3ZlIGNvbW1hbmRzIGl0cyBhc3NvY2lhdGVkCiIuc3BsIiBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBiZSB1cGRhdGVkIGFuZCByZWxvYWRlZC4gIElmIHlvdSBjaGFuZ2UKJ3NwZWxsZmlsZScgbWFudWFsbHkgeW91IG5lZWQgdG8gdXNlIHRoZSB8Om1rc3BlbGx8IGNvbW1hbmQuICBUaGlzIHNlcXVlbmNlIG9mCmNvbW1hbmRzIG1vc3RseSB3b3JrcyB3ZWxsOiA+Cgk6ZWRpdCA8ZmlsZSBpbiAnc3BlbGxmaWxlJz4KPAkobWFrZSBjaGFuZ2VzIHRvIHRoZSBzcGVsbCBmaWxlKSA+Cgk6bWtzcGVsbCEgJQoKTW9yZSBkZXRhaWxzIGFib3V0IHRoZSAnc3BlbGxmaWxlJyBmb3JtYXQgYmVsb3cgfHNwZWxsLXdvcmRsaXN0LWZvcm1hdHwuCgoJCQkJCQkJKmludGVybmFsLXdvcmRsaXN0KgpUaGUgaW50ZXJuYWwgd29yZCBsaXN0IGlzIHVzZWQgZm9yIGFsbCBidWZmZXJzIHdoZXJlICdzcGVsbCcgaXMgc2V0LiAgSXQgaXMKbm90IHN0b3JlZCwgaXQgaXMgbG9zdCB3aGVuIHlvdSBleGl0IFZpbS4gIEl0IGlzIGFsc28gY2xlYXJlZCB3aGVuICdlbmNvZGluZycKaXMgc2V0LgoKCkZpbmRpbmcgc3VnZ2VzdGlvbnMgZm9yIGJhZCB3b3JkczoKCQkJCQkJCSp6PSoKej0JCQlGb3IgdGhlIHdvcmQgdW5kZXIvYWZ0ZXIgdGhlIGN1cnNvciBzdWdnZXN0IGNvcnJlY3RseQoJCQlzcGVsbGVkIHdvcmRzLiAgVGhpcyBhbHNvIHdvcmtzIHRvIGZpbmQgYWx0ZXJuYXRpdmVzCgkJCWZvciBhIHdvcmQgdGhhdCBpcyBub3QgaGlnaGxpZ2h0ZWQgYXMgYSBiYWQgd29yZCwKCQkJZS5nLiwgd2hlbiB0aGUgd29yZCBhZnRlciBpdCBpcyBiYWQuCgkJCUluIFZpc3VhbCBtb2RlIHRoZSBoaWdobGlnaHRlZCB0ZXh0IGlzIHRha2VuIGFzIHRoZQoJCQl3b3JkIHRvIGJlIHJlcGxhY2VkLgoJCQlUaGUgcmVzdWx0cyBhcmUgc29ydGVkIG9uIHNpbWlsYXJpdHkgdG8gdGhlIHdvcmQgYmVpbmcKCQkJcmVwbGFjZWQuCgkJCVRoaXMgbWF5IHRha2UgYSBsb25nIHRpbWUuICBIaXQgQ1RSTC1DIHdoZW4geW91IGdldAoJCQlib3JlZC4KCgkJCUlmIHRoZSBjb21tYW5kIGlzIHVzZWQgd2l0aG91dCBhIGNvdW50IHRoZQoJCQlhbHRlcm5hdGl2ZXMgYXJlIGxpc3RlZCBhbmQgeW91IGNhbiBlbnRlciB0aGUgbnVtYmVyCgkJCW9mIHlvdXIgY2hvaWNlIG9yIHByZXNzIDxFbnRlcj4gaWYgeW91IGRvbid0IHdhbnQgdG8KCQkJcmVwbGFjZS4gIFlvdSBjYW4gYWxzbyB1c2UgdGhlIG1vdXNlIHRvIGNsaWNrIG9uIHlvdXIKCQkJY2hvaWNlIChvbmx5IHdvcmtzIGlmIHRoZSBtb3VzZSBjYW4gYmUgdXNlZCBpbiBOb3JtYWwKCQkJbW9kZSBhbmQgd2hlbiB0aGVyZSBhcmUgbm8gbGluZSB3cmFwcykuICBDbGljayBvbiB0aGUKCQkJZmlyc3QgbGluZSAodGhlIGhlYWRlcikgdG8gY2FuY2VsLgoKCQkJVGhlIHN1Z2dlc3Rpb25zIGxpc3RlZCBub3JtYWxseSByZXBsYWNlIGEgaGlnaGxpZ2h0ZWQKCQkJYmFkIHdvcmQuICBTb21ldGltZXMgdGhleSBpbmNsdWRlIG90aGVyIHRleHQsIGluIHRoYXQKCQkJY2FzZSB0aGUgcmVwbGFjZWQgdGV4dCBpcyBhbHNvIGxpc3RlZCBhZnRlciBhICI8Ii4KCgkJCUlmIGEgY291bnQgaXMgdXNlZCB0aGF0IHN1Z2dlc3Rpb24gaXMgdXNlZCwgd2l0aG91dAoJCQlwcm9tcHRpbmcuICBGb3IgZXhhbXBsZSwgIjF6PSIgYWx3YXlzIHRha2VzIHRoZSBmaXJzdAoJCQlzdWdnZXN0aW9uLgoKCQkJSWYgJ3ZlcmJvc2UnIGlzIG5vbi16ZXJvIGEgc2NvcmUgd2lsbCBiZSBkaXNwbGF5ZWQKCQkJd2l0aCB0aGUgc3VnZ2VzdGlvbnMgdG8gaW5kaWNhdGUgdGhlIGxpa2VsaW5lc3MgdG8gdGhlCgkJCWJhZGx5IHNwZWxsZWQgd29yZCAodGhlIGhpZ2hlciB0aGUgc2NvcmUgdGhlIG1vcmUKCQkJZGlmZmVyZW50KS4KCQkJV2hlbiBhIHdvcmQgd2FzIHJlcGxhY2VkIHRoZSByZWRvIGNvbW1hbmQgIi4iIHdpbGwKCQkJcmVwZWF0IHRoZSB3b3JkIHJlcGxhY2VtZW50LiAgVGhpcyB3b3JrcyBsaWtlICJjaXciLAoJCQl0aGUgZ29vZCB3b3JkIGFuZCA8RXNjPi4gIFRoaXMgZG9lcyBOT1Qgd29yayBmb3IgVGhhaQoJCQlhbmQgb3RoZXIgbGFuZ3VhZ2VzIHdpdGhvdXQgc3BhY2VzIGJldHdlZW4gd29yZHMuCgoJCQkJCSo6c3BlbGxyKiAqOnNwZWxscmVwYWxsKiAqRTc1MiogKkU3NTMqCjpzcGVsbHJbZXBhbGxdCQlSZXBlYXQgdGhlIHJlcGxhY2VtZW50IGRvbmUgYnkgfHo9fCBmb3IgYWxsIG1hdGNoZXMKCQkJd2l0aCB0aGUgcmVwbGFjZWQgd29yZCBpbiB0aGUgY3VycmVudCB3aW5kb3cuCgpJbiBJbnNlcnQgbW9kZSwgd2hlbiB0aGUgY3Vyc29yIGlzIGFmdGVyIGEgYmFkbHkgc3BlbGxlZCB3b3JkLCB5b3UgY2FuIHVzZQpDVFJMLVggcyB0byBmaW5kIHN1Z2dlc3Rpb25zLiAgVGhpcyB3b3JrcyBsaWtlIEluc2VydCBtb2RlIGNvbXBsZXRpb24uICBVc2UKQ1RSTC1OIHRvIHVzZSB0aGUgbmV4dCBzdWdnZXN0aW9uLCBDVFJMLVAgdG8gZ28gYmFjay4gfGlfQ1RSTC1YX3N8CgpUaGUgJ3NwZWxsc3VnZ2VzdCcgb3B0aW9uIGluZmx1ZW5jZXMgaG93IHRoZSBsaXN0IG9mIHN1Z2dlc3Rpb25zIGlzIGdlbmVyYXRlZAphbmQgc29ydGVkLiAgU2VlIHwnc3BlbGxzdWdnZXN0J3wuCgpUaGUgJ3NwZWxsY2FwY2hlY2snIG9wdGlvbiBpcyB1c2VkIHRvIGNoZWNrIHRoZSBmaXJzdCB3b3JkIG9mIGEgc2VudGVuY2UKc3RhcnRzIHdpdGggYSBjYXBpdGFsLiAgVGhpcyBkb2Vzbid0IHdvcmsgZm9yIHRoZSBmaXJzdCB3b3JkIGluIHRoZSBmaWxlLgpXaGVuIHRoZXJlIGlzIGEgbGluZSBicmVhayByaWdodCBhZnRlciBhIHNlbnRlbmNlIHRoZSBoaWdobGlnaHRpbmcgb2YgdGhlIG5leHQKbGluZSBtYXkgYmUgcG9zdHBvbmVkLiAgVXNlIHxDVFJMLUx8IHdoZW4gbmVlZGVkLiAgQWxzbyBzZWUgfHNldC1zcGMtYXV0b3wgZm9yCmhvdyBpdCBjYW4gYmUgc2V0IGF1dG9tYXRpY2FsbHkgd2hlbiAnc3BlbGxsYW5nJyBpcyBzZXQuCgpWaW0gY291bnRzIHRoZSBudW1iZXIgb2YgdGltZXMgYSBnb29kIHdvcmQgaXMgZW5jb3VudGVyZWQuICBUaGlzIGlzIHVzZWQgdG8Kc29ydCB0aGUgc3VnZ2VzdGlvbnM6IHdvcmRzIHRoYXQgaGF2ZSBiZWVuIHNlZW4gYmVmb3JlIGdldCBhIHNtYWxsIGJvbnVzLAp3b3JkcyB0aGF0IGhhdmUgYmVlbiBzZWVuIG9mdGVuIGdldCBhIGJpZ2dlciBib251cy4gIFRoZSBDT01NT04gaXRlbSBpbiB0aGUKYWZmaXggZmlsZSBjYW4gYmUgdXNlZCB0byBkZWZpbmUgY29tbW9uIHdvcmRzLCBzbyB0aGF0IHRoaXMgbWVjaGFuaXNtIGFsc28Kd29ya3MgaW4gYSBuZXcgb3Igc2hvcnQgZmlsZSB8c3BlbGwtQ09NTU9OfC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoyLiBSZW1hcmtzIG9uIHNwZWxsIGNoZWNraW5nCQkJCSpzcGVsbC1yZW1hcmtzKgoKUEVSRk9STUFOQ0UKClZpbSBkb2VzIG9uLXRoZS1mbHkgc3BlbGwgY2hlY2tpbmcuICBUbyBtYWtlIHRoaXMgd29yayBmYXN0IHRoZSB3b3JkIGxpc3QgaXMKbG9hZGVkIGluIG1lbW9yeS4gIFRodXMgdGhpcyB1c2VzIGEgbG90IG9mIG1lbW9yeSAoMSBNYnl0ZSBvciBtb3JlKS4gIFRoZXJlCm1pZ2h0IGFsc28gYmUgYSBub3RpY2VhYmxlIGRlbGF5IHdoZW4gdGhlIHdvcmQgbGlzdCBpcyBsb2FkZWQsIHdoaWNoIGhhcHBlbnMKd2hlbiAnc3BlbGwnIGlzIHNldCBhbmQgd2hlbiAnc3BlbGxsYW5nJyBpcyBzZXQgd2hpbGUgJ3NwZWxsJyB3YXMgYWxyZWFkeSBzZXQuClRvIG1pbmltaXplIHRoZSBkZWxheSBlYWNoIHdvcmQgbGlzdCBpcyBvbmx5IGxvYWRlZCBvbmNlLCBpdCBpcyBub3QgZGVsZXRlZAp3aGVuICdzcGVsbGxhbmcnIGlzIG1hZGUgZW1wdHkgb3IgJ3NwZWxsJyBpcyByZXNldC4gIFdoZW4gJ2VuY29kaW5nJyBpcyBzZXQKYWxsIHRoZSB3b3JkIGxpc3RzIGFyZSByZWxvYWRlZCwgdGh1cyB5b3UgbWF5IG5vdGljZSBhIGRlbGF5IHRoZW4gdG9vLgoKClJFR0lPTlMKCkEgd29yZCBtYXkgYmUgc3BlbGxlZCBkaWZmZXJlbnRseSBpbiB2YXJpb3VzIHJlZ2lvbnMuICBGb3IgZXhhbXBsZSwgRW5nbGlzaApjb21lcyBpbiAoYXQgbGVhc3QpIHRoZXNlIHZhcmlhbnRzOgoKCWVuCQlhbGwgcmVnaW9ucwoJZW5fYXUJCUF1c3RyYWxpYQoJZW5fY2EJCUNhbmFkYQoJZW5fZ2IJCUdyZWF0IEJyaXRhaW4KCWVuX256CQlOZXcgWmVhbGFuZAoJZW5fdXMJCVVTQQoKV29yZHMgdGhhdCBhcmUgbm90IHVzZWQgaW4gb25lIHJlZ2lvbiBidXQgYXJlIHVzZWQgaW4gYW5vdGhlciByZWdpb24gYXJlCmhpZ2hsaWdodGVkIHdpdGggU3BlbGxMb2NhbCB8aGwtU3BlbGxMb2NhbHwuCgpBbHdheXMgdXNlIGxvd2VyY2FzZSBsZXR0ZXJzIGZvciB0aGUgbGFuZ3VhZ2UgYW5kIHJlZ2lvbiBuYW1lcy4KCldoZW4gYWRkaW5nIGEgd29yZCB3aXRoIHx6Z3wgb3IgYW5vdGhlciBjb21tYW5kIGl0J3MgYWx3YXlzIGFkZGVkIGZvciBhbGwKcmVnaW9ucy4gIFlvdSBjYW4gY2hhbmdlIHRoYXQgYnkgbWFudWFsbHkgZWRpdGluZyB0aGUgJ3NwZWxsZmlsZScuICBTZWUKfHNwZWxsLXdvcmRsaXN0LWZvcm1hdHwuICBOb3RlIHRoYXQgdGhlIHJlZ2lvbnMgYXMgc3BlY2lmaWVkIGluIHRoZSBmaWxlcyBpbgonc3BlbGxmaWxlJyBhcmUgb25seSB1c2VkIHdoZW4gYWxsIGVudHJpZXMgaW4gJ3NwZWxsbGFuZycgc3BlY2lmeSB0aGUgc2FtZQpyZWdpb24gKG5vdCBjb3VudGluZyBmaWxlcyBzcGVjaWZpZWQgYnkgdGhlaXIgLnNwbCBuYW1lKS4KCgkJCQkJCQkqc3BlbGwtZ2VybWFuKgpTcGVjaWZpYyBleGNlcHRpb246IEZvciBHZXJtYW4gdGhlc2Ugc3BlY2lhbCByZWdpb25zIGFyZSB1c2VkOgoJZGUJCWFsbCBHZXJtYW4gd29yZHMgYWNjZXB0ZWQKCWRlX2RlCQlvbGQgYW5kIG5ldyBzcGVsbGluZwoJZGVfMTkJCW9sZCBzcGVsbGluZwoJZGVfMjAJCW5ldyBzcGVsbGluZwoJZGVfYXQJCUF1c3RyaWEKCWRlX2NoCQlTd2l0emVybGFuZAoKCQkJCQkJCSpzcGVsbC1ydXNzaWFuKgpTcGVjaWZpYyBleGNlcHRpb246IEZvciBSdXNzaWFuIHRoZXNlIHNwZWNpYWwgcmVnaW9ucyBhcmUgdXNlZDoKCXJ1CQlhbGwgUnVzc2lhbiB3b3JkcyBhY2NlcHRlZAoJcnVfcnUJCSJJRSIgbGV0dGVyIHNwZWxsaW5nCglydV95bwkJIllPIiBsZXR0ZXIgc3BlbGxpbmcKCgkJCQkJCQkqc3BlbGwteWlkZGlzaCoKWWlkZGlzaCByZXF1aXJlcyB1c2luZyAidXRmLTgiIGVuY29kaW5nLCBiZWNhdXNlIG9mIHRoZSBzcGVjaWFsIGNoYXJhY3RlcnMKdXNlZC4gIElmIHlvdSBhcmUgdXNpbmcgbGF0aW4xIFZpbSB3aWxsIHVzZSB0cmFuc2xpdGVyYXRlZCAocm9tYW5pemVkKSBZaWRkaXNoCmluc3RlYWQuICBJZiB5b3Ugd2FudCB0byB1c2UgdHJhbnNsaXRlcmF0ZWQgWWlkZGlzaCB3aXRoIHV0Zi04IHVzZSAieWktdHIiLgpJbiBhIHRhYmxlOgoJJ2VuY29kaW5nJwknc3BlbGxsYW5nJwoJdXRmLTgJCXlpCQlZaWRkaXNoCglsYXRpbjEJCXlpCQl0cmFuc2xpdGVyYXRlZCBZaWRkaXNoCgl1dGYtOAkJeWktdHIJCXRyYW5zbGl0ZXJhdGVkIFlpZGRpc2gKCgpTUEVMTCBGSUxFUwkJCQkJCSpzcGVsbC1sb2FkKgoKVmltIHNlYXJjaGVzIGZvciBzcGVsbCBmaWxlcyBpbiB0aGUgInNwZWxsIiBzdWJkaXJlY3Rvcnkgb2YgdGhlIGRpcmVjdG9yaWVzIGluCidydW50aW1lcGF0aCcuICBUaGUgbmFtZSBpczogTEwuRUVFLnNwbCwgd2hlcmU6CglMTAl0aGUgbGFuZ3VhZ2UgbmFtZQoJRUVFCXRoZSB2YWx1ZSBvZiAnZW5jb2RpbmcnCgpUaGUgdmFsdWUgZm9yICJMTCIgY29tZXMgZnJvbSAnc3BlbGxsYW5nJywgYnV0IGV4Y2x1ZGVzIHRoZSByZWdpb24gbmFtZS4KRXhhbXBsZXM6Cgknc3BlbGxsYW5nJwlMTCB+Cgllbl91cwkJZW4KCWVuLXJhcmUJCWVuLXJhcmUKCW1lZGljYWxfY2EJbWVkaWNhbAoKT25seSB0aGUgZmlyc3QgZmlsZSBpcyBsb2FkZWQsIHRoZSBvbmUgdGhhdCBpcyBmaXJzdCBpbiAncnVudGltZXBhdGgnLiAgSWYKdGhpcyBzdWNjZWVkcyB0aGVuIGFkZGl0aW9uYWxseSBmaWxlcyB3aXRoIHRoZSBuYW1lIExMLkVFRS5hZGQuc3BsIGFyZSBsb2FkZWQuCkFsbCB0aGUgb25lcyB0aGF0IGFyZSBmb3VuZCBhcmUgdXNlZC4KCklmIG5vIHNwZWxsIGZpbGUgaXMgZm91bmQgdGhlIHxTcGVsbEZpbGVNaXNzaW5nfCBhdXRvY29tbWFuZCBldmVudCBpcwp0cmlnZ2VyZWQuICBUaGlzIG1heSB0cmlnZ2VyIHRoZSB8c3BlbGxmaWxlLnZpbXwgcGx1Z2luIHRvIG9mZmVyIHlvdQpkb3dubG9hZGluZyB0aGUgc3BlbGwgZmlsZS4KCkFkZGl0aW9uYWxseSwgdGhlIGZpbGVzIHJlbGF0ZWQgdG8gdGhlIG5hbWVzIGluICdzcGVsbGZpbGUnIGFyZSBsb2FkZWQuICBUaGVzZQphcmUgdGhlIGZpbGVzIHRoYXQgfHpnfCBhbmQgfHp3fCBhZGQgZ29vZCBhbmQgd3Jvbmcgd29yZHMgdG8uCgpFeGNlcHRpb25zOgotIFZpbSB1c2VzICJsYXRpbjEiIHdoZW4gJ2VuY29kaW5nJyBpcyAiaXNvLTg4NTktMTUiLiAgVGhlIGV1cm8gc2lnbiBkb2Vzbid0CiAgbWF0dGVyIGZvciBzcGVsbGluZy4KLSBXaGVuIG5vIHNwZWxsIGZpbGUgZm9yICdlbmNvZGluZycgaXMgZm91bmQgImFzY2lpIiBpcyB0cmllZC4gIFRoaXMgb25seQogIHdvcmtzIGZvciBsYW5ndWFnZXMgd2hlcmUgbmVhcmx5IGFsbCB3b3JkcyBhcmUgQVNDSUksIHN1Y2ggYXMgRW5nbGlzaC4gIEl0CiAgaGVscHMgd2hlbiAnZW5jb2RpbmcnIGlzIG5vdCAibGF0aW4xIiwgc3VjaCBhcyBpc28tODg1OS0yLCBhbmQgRW5nbGlzaCB0ZXh0CiAgaXMgYmVpbmcgZWRpdGVkLiAgRm9yIHRoZSAiLmFkZCIgZmlsZXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgZm91bmQgbWFpbgogIHNwZWxsIGZpbGUgaXMgdXNlZC4KCkZvciBleGFtcGxlLCB3aXRoIHRoZXNlIHZhbHVlczoKCSdydW50aW1lcGF0aCcgaXMgIn4vLnZpbSwvdXNyL3NoYXJlL3ZpbTcwLH4vLnZpbS9hZnRlciIKCSdlbmNvZGluZycgICAgaXMgImlzby04ODU5LTIiCgknc3BlbGxsYW5nJyAgIGlzICJwbCIKClZpbSB3aWxsIGxvb2sgZm9yOgoxLiB+Ly52aW0vc3BlbGwvcGwuaXNvLTg4NTktMi5zcGwKMi4gL3Vzci9zaGFyZS92aW03MC9zcGVsbC9wbC5pc28tODg1OS0yLnNwbAozLiB+Ly52aW0vc3BlbGwvcGwuaXNvLTg4NTktMi5hZGQuc3BsCjQuIC91c3Ivc2hhcmUvdmltNzAvc3BlbGwvcGwuaXNvLTg4NTktMi5hZGQuc3BsCjUuIH4vLnZpbS9hZnRlci9zcGVsbC9wbC5pc28tODg1OS0yLmFkZC5zcGwKClRoaXMgYXNzdW1lcyAxLiBpcyBub3QgZm91bmQgYW5kIDIuIGlzIGZvdW5kLgoKSWYgJ2VuY29kaW5nJyBpcyAibGF0aW4xIiBWaW0gd2lsbCBsb29rIGZvcjoKMS4gfi8udmltL3NwZWxsL3BsLmxhdGluMS5zcGwKMi4gL3Vzci9zaGFyZS92aW03MC9zcGVsbC9wbC5sYXRpbjEuc3BsCjMuIH4vLnZpbS9hZnRlci9zcGVsbC9wbC5sYXRpbjEuc3BsCjQuIH4vLnZpbS9zcGVsbC9wbC5hc2NpaS5zcGwKNS4gL3Vzci9zaGFyZS92aW03MC9zcGVsbC9wbC5hc2NpaS5zcGwKNi4gfi8udmltL2FmdGVyL3NwZWxsL3BsLmFzY2lpLnNwbAoKVGhpcyBhc3N1bWVzIG5vbmUgb2YgdGhlbSBhcmUgZm91bmQgKFBvbGlzaCBkb2Vzbid0IG1ha2Ugc2Vuc2Ugd2hlbiBsZWF2aW5nCm91dCB0aGUgbm9uLUFTQ0lJIGNoYXJhY3RlcnMpLgoKU3BlbGxpbmcgZm9yIEVCQ0RJQyBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZC4KCkEgc3BlbGwgZmlsZSBtaWdodCBub3QgYmUgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50ICdlbmNvZGluZycuICBTZWUKfHNwZWxsLW1rc3BlbGx8IGFib3V0IGhvdyB0byBjcmVhdGUgYSBzcGVsbCBmaWxlLiAgQ29udmVydGluZyBhIHNwZWxsIGZpbGUKd2l0aCAiaWNvbnYiIHdpbGwgTk9UIHdvcmshCgpOb3RlOiBvbiBWTVMgIi57ZW5jfS5zcGwiIGlzIGNoYW5nZWQgdG8gIl97ZW5jfS5zcGwiIHRvIGF2b2lkIHRyb3VibGUgd2l0aApmaWxlbmFtZXMuCgoJCQkJCQkgICAgKnNwZWxsLXN1Zy1maWxlKiAqRTc4MSoKSWYgdGhlcmUgaXMgYSBmaWxlIHdpdGggZXhhY3RseSB0aGUgc2FtZSBuYW1lIGFzIHRoZSAiLnNwbCIgZmlsZSBidXQgZW5kaW5nIGluCiIuc3VnIiwgdGhhdCBmaWxlIHdpbGwgYmUgdXNlZCBmb3IgZ2l2aW5nIGJldHRlciBzdWdnZXN0aW9ucy4gIEl0IGlzbid0IGxvYWRlZApiZWZvcmUgc3VnZ2VzdGlvbnMgYXJlIG1hZGUgdG8gcmVkdWNlIG1lbW9yeSB1c2UuCgoJCQkJICAgICpFNzU4KiAqRTc1OSogKkU3NzgqICpFNzc5KiAqRTc4MCogKkU3ODIqCldoZW4gbG9hZGluZyBhIHNwZWxsIGZpbGUgVmltIGNoZWNrcyB0aGF0IGl0IGlzIHByb3Blcmx5IGZvcm1hdHRlZC4gIElmIHlvdQpnZXQgYW4gZXJyb3IgdGhlIGZpbGUgbWF5IGJlIHRydW5jYXRlZCwgbW9kaWZpZWQgb3IgaW50ZW5kZWQgZm9yIGFub3RoZXIgVmltCnZlcnNpb24uCgoKU1BFTExGSUxFIENMRUFOVVAJCQkJCSpzcGVsbGZpbGUtY2xlYW51cCoKClRoZSB8end8IGNvbW1hbmQgdHVybnMgZXhpc3RpbmcgZW50cmllcyBpbiAnc3BlbGxmaWxlJyBpbnRvIGNvbW1lbnQgbGluZXMuClRoaXMgYXZvaWRzIGhhdmluZyB0byB3cml0ZSBhIG5ldyBmaWxlIGV2ZXJ5IHRpbWUsIGJ1dCByZXN1bHRzIGluIHRoZSBmaWxlCm9ubHkgZ2V0dGluZyBsb25nZXIsIG5ldmVyIHNob3J0ZXIuICBUbyBjbGVhbiB1cCB0aGUgY29tbWVudCBsaW5lcyBpbiBhbGwKIi5hZGQiIHNwZWxsIGZpbGVzIGRvIHRoaXM6ID4KCTpydW50aW1lIHNwZWxsL2NsZWFuYWRkLnZpbQoKVGhpcyBkZWxldGVzIGFsbCBjb21tZW50IGxpbmVzLCBleGNlcHQgdGhlIG9uZXMgdGhhdCBzdGFydCB3aXRoICIjIyIuICBVc2UKIiMjIiBsaW5lcyB0byBhZGQgY29tbWVudHMgdGhhdCB5b3Ugd2FudCB0byBrZWVwLgoKWW91IGNhbiBpbnZva2UgdGhpcyBzY3JpcHQgYXMgb2Z0ZW4gYXMgeW91IGxpa2UuICBBIHZhcmlhYmxlIGlzIHByb3ZpZGVkIHRvCnNraXAgdXBkYXRpbmcgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY2hhbmdlZCByZWNlbnRseS4gIFNldCBpdCB0byB0aGUgbnVtYmVyIG9mCnNlY29uZHMgdGhhdCBoYXMgcGFzc2VkIHNpbmNlIGEgZmlsZSB3YXMgY2hhbmdlZCBiZWZvcmUgaXQgd2lsbCBiZSBjbGVhbmVkLgpGb3IgZXhhbXBsZSwgdG8gY2xlYW4gb25seSBmaWxlcyB0aGF0IHdlcmUgbm90IGNoYW5nZWQgaW4gdGhlIGxhc3QgaG91cjogPgogICAgICBsZXQgZzpzcGVsbF9jbGVhbl9saW1pdCA9IDYwICogNjAKVGhlIGRlZmF1bHQgaXMgb25lIHNlY29uZC4KCgpXT1JEUwoKVmltIHVzZXMgYSBmaXhlZCBtZXRob2QgdG8gcmVjb2duaXplIGEgd29yZC4gIFRoaXMgaXMgaW5kZXBlbmRlbnQgb2YKJ2lza2V5d29yZCcsIHNvIHRoYXQgaXQgYWxzbyB3b3JrcyBpbiBoZWxwIGZpbGVzIGFuZCBmb3IgbGFuZ3VhZ2VzIHRoYXQKaW5jbHVkZSBjaGFyYWN0ZXJzIGxpa2UgJy0nIGluICdpc2tleXdvcmQnLiAgVGhlIHdvcmQgY2hhcmFjdGVycyBkbyBkZXBlbmQgb24KJ2VuY29kaW5nJy4KClRoZSB0YWJsZSB3aXRoIHdvcmQgY2hhcmFjdGVycyBpcyBzdG9yZWQgaW4gdGhlIG1haW4gLnNwbCBmaWxlLiAgVGhlcmVmb3JlIGl0Cm1hdHRlcnMgd2hhdCB0aGUgY3VycmVudCBsb2NhbGUgaXMgd2hlbiBnZW5lcmF0aW5nIGl0ISAgQSAuYWRkLnNwbCBmaWxlIGRvZXMKbm90IGNvbnRhaW4gYSB3b3JkIHRhYmxlIHRob3VnaC4KCkZvciBhIHdvcmQgdGhhdCBzdGFydHMgd2l0aCBhIGRpZ2l0IHRoZSBkaWdpdCBpcyBpZ25vcmVkLCB1bmxlc3MgdGhlIHdvcmQgYXMgYQp3aG9sZSBpcyByZWNvZ25pemVkLiAgVGh1cyBpZiAiM0QiIGlzIGEgd29yZCBhbmQgIkQiIGlzIG5vdCB0aGVuICIzRCIgaXMKcmVjb2duaXplZCBhcyBhIHdvcmQsIGJ1dCBpZiAiM0QiIGlzIG5vdCBhIHdvcmQgdGhlbiBvbmx5IHRoZSAiRCIgaXMgbWFya2VkIGFzCmJhZC4gIEhleCBudW1iZXJzIGluIHRoZSBmb3JtIDB4MTJhYiBhbmQgMFgxMkFCIGFyZSByZWNvZ25pemVkLgoKCldPUkQgQ09NQklOQVRJT05TCgpJdCBpcyBwb3NzaWJsZSB0byBzcGVsbC1jaGVjayB3b3JkcyB0aGF0IGluY2x1ZGUgYSBzcGFjZS4gIFRoaXMgaXMgdXNlZCB0bwpyZWNvZ25pemUgd29yZHMgdGhhdCBhcmUgaW52YWxpZCB3aGVuIHVzZWQgYnkgdGhlbXNlbHZlcywgZS5nLiBmb3IgImV0IGFsLiIuCkl0IGNhbiBhbHNvIGJlIHVzZWQgdG8gcmVjb2duaXplICJ0aGUgdGhlIiBhbmQgaGlnaGxpZ2h0IGl0LgoKVGhlIG51bWJlciBvZiBzcGFjZXMgaXMgaXJyZWxldmFudC4gIEluIG1vc3QgY2FzZXMgYSBsaW5lIGJyZWFrIG1heSBhbHNvCmFwcGVhci4gIEhvd2V2ZXIsIHRoaXMgbWFrZXMgaXQgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoZXJlIHRvIHN0YXJ0IGNoZWNraW5nCmZvciBzcGVsbGluZyBtaXN0YWtlcy4gIFdoZW4geW91IG1ha2UgYSBjaGFuZ2UgdG8gb25lIGxpbmUgYW5kIG9ubHkgdGhhdCBsaW5lCmlzIHJlZHJhd24gVmltIHdvbid0IGxvb2sgaW4gdGhlIHByZXZpb3VzIGxpbmUsIHRodXMgd2hlbiAiZXQiIGlzIGF0IHRoZSBlbmQKb2YgdGhlIHByZXZpb3VzIGxpbmUgImFsLiIgd2lsbCBiZSBmbGFnZ2VkIGFzIGFuIGVycm9yLiAgQW5kIHdoZW4geW91IHR5cGUKInRoZTxDUj50aGUiIHRoZSBoaWdobGlnaHRpbmcgZG9lc24ndCBhcHBlYXIgdW50aWwgdGhlIGZpcnN0IGxpbmUgaXMgcmVkcmF3bi4KVXNlIHxDVFJMLUx8IHRvIHJlZHJhdyByaWdodCBhd2F5LiAgIltzIiB3aWxsIGFsc28gc3RvcCBhdCBhIHdvcmQgY29tYmluYXRpb24Kd2l0aCBhIGxpbmUgYnJlYWsuCgpXaGVuIGVuY291bnRlcmluZyBhIGxpbmUgYnJlYWsgVmltIHNraXBzIGNoYXJhY3RlcnMgc3VjaCBhcyAnKicsICc+JyBhbmQgJyInLApzbyB0aGF0IGNvbW1lbnRzIGluIEMsIHNoZWxsIGFuZCBWaW0gY29kZSBjYW4gYmUgc3BlbGwgY2hlY2tlZC4KCgpTWU5UQVggSElHSExJR0hUSU5HCQkJCQkqc3BlbGwtc3ludGF4KgoKRmlsZXMgdGhhdCB1c2Ugc3ludGF4IGhpZ2hsaWdodGluZyBjYW4gc3BlY2lmeSB3aGVyZSBzcGVsbCBjaGVja2luZyBzaG91bGQgYmUKZG9uZToKCjEuICBldmVyeXdoZXJlCQkJICAgZGVmYXVsdAoyLiAgaW4gc3BlY2lmaWMgaXRlbXMJCSAgIHVzZSAiY29udGFpbnM9QFNwZWxsIgozLiAgZXZlcnl3aGVyZSBidXQgc3BlY2lmaWMgaXRlbXMgIHVzZSAiY29udGFpbnM9QE5vU3BlbGwiCgpGb3IgdGhlIHNlY29uZCBtZXRob2QgYWRkaW5nIHRoZSBATm9TcGVsbCBjbHVzdGVyIHdpbGwgZGlzYWJsZSBzcGVsbCBjaGVja2luZwphZ2Fpbi4gIFRoaXMgY2FuIGJlIHVzZWQsIGZvciBleGFtcGxlLCB0byBhZGQgQFNwZWxsIHRvIHRoZSBjb21tZW50cyBvZiBhCnByb2dyYW0sIGFuZCBhZGQgQE5vU3BlbGwgZm9yIGl0ZW1zIHRoYXQgc2hvdWxkbid0IGJlIGNoZWNrZWQuCkFsc28gc2VlIHw6c3luLXNwZWxsfCBmb3IgdGV4dCB0aGF0IGlzIG5vdCBpbiBhIHN5bnRheCBpdGVtLgoKClZJTSBTQ1JJUFRTCgpJZiB5b3Ugd2FudCB0byB3cml0ZSBhIFZpbSBzY3JpcHQgdGhhdCBkb2VzIHNvbWV0aGluZyB3aXRoIHNwZWxsaW5nLCB5b3UgbWF5CmZpbmQgdGhlc2UgZnVuY3Rpb25zIHVzZWZ1bDoKCiAgICBzcGVsbGJhZHdvcmQoKQlmaW5kIGJhZGx5IHNwZWxsZWQgd29yZCBhdCB0aGUgY3Vyc29yCiAgICBzcGVsbHN1Z2dlc3QoKQlnZXQgbGlzdCBvZiBzcGVsbGluZyBzdWdnZXN0aW9ucwogICAgc291bmRmb2xkKCkJCWdldCB0aGUgc291bmQtYS1saWtlIHZlcnNpb24gb2YgYSB3b3JkCgoKU0VUVElORyAnc3BlbGxjYXBjaGVjaycgQVVUT01BVElDQUxMWQkJCSpzZXQtc3BjLWF1dG8qCgpBZnRlciB0aGUgJ3NwZWxsbGFuZycgb3B0aW9uIGhhcyBiZWVuIHNldCBzdWNjZXNzZnVsbHksIFZpbSB3aWxsIHNvdXJjZSB0aGUKZmlsZXMgInNwZWxsL0xBTkcudmltIiBpbiAncnVudGltZXBhdGgnLiAgIkxBTkciIGlzIHRoZSB2YWx1ZSBvZiAnc3BlbGxsYW5nJwp1cCB0byB0aGUgZmlyc3QgY29tbWEsIGRvdCBvciB1bmRlcnNjb3JlLiAgVGhpcyBjYW4gYmUgdXNlZCB0byBzZXQgb3B0aW9ucwpzcGVjaWZpY2FsbHkgZm9yIHRoZSBsYW5ndWFnZSwgZXNwZWNpYWxseSAnc3BlbGxjYXBjaGVjaycuCgpUaGUgZGlzdHJpYnV0aW9uIGluY2x1ZGVzIGEgZmV3IG9mIHRoZXNlIGZpbGVzLiAgVXNlIHRoaXMgY29tbWFuZCB0byBzZWUgd2hhdAp0aGV5IGRvOiA+Cgk6bmV4dCAkVklNUlVOVElNRS9zcGVsbC8qLnZpbQoKTm90ZSB0aGF0IHRoZSBkZWZhdWx0IHNjcmlwdHMgZG9uJ3Qgc2V0ICdzcGVsbGNhcGNoZWNrJyBpZiBpdCB3YXMgY2hhbmdlZCBmcm9tCnRoZSBkZWZhdWx0IHZhbHVlLiAgVGhpcyBhc3N1bWVzIHRoZSB1c2VyIHByZWZlcnMgYW5vdGhlciB2YWx1ZSB0aGVuLgoKCkRPVUJMRSBTQ09SSU5HCQkJCQkJKnNwZWxsLWRvdWJsZS1zY29yaW5nKgoKVGhlICdzcGVsbHN1Z2dlc3QnIG9wdGlvbiBjYW4gYmUgdXNlZCB0byBzZWxlY3QgImRvdWJsZSIgc2NvcmluZy4gIFRoaXMKbWVjaGFuaXNtIGlzIGJhc2VkIG9uIHRoZSBwcmluY2lwbGUgdGhhdCB0aGVyZSBhcmUgdHdvIGtpbmRzIG9mIHNwZWxsaW5nCm1pc3Rha2VzOgoKMS4gWW91IGtub3cgaG93IHRvIHNwZWxsIHRoZSB3b3JkLCBidXQgbWlzdHlwZSBzb21ldGhpbmcuICBUaGlzIHJlc3VsdHMgaW4gYQogICBzbWFsbCBlZGl0aW5nIGRpc3RhbmNlIChjaGFyYWN0ZXIgc3dhcHBlZC9vbWl0dGVkL2luc2VydGVkKSBhbmQgcG9zc2libHkgYQogICB3b3JkIHRoYXQgc291bmRzIGNvbXBsZXRlbHkgZGlmZmVyZW50LgoKMi4gWW91IGRvbid0IGtub3cgaG93IHRvIHNwZWxsIHRoZSB3b3JkIGFuZCB0eXBlIHNvbWV0aGluZyB0aGF0IHNvdW5kcyByaWdodC4KICAgVGhlIGVkaXQgZGlzdGFuY2UgY2FuIGJlIGJpZyBidXQgdGhlIHdvcmQgaXMgc2ltaWxhciBhZnRlciBzb3VuZC1mb2xkaW5nLgoKU2luY2Ugc2NvcmVzIGZvciB0aGVzZSB0d28gbWlzdGFrZXMgd2lsbCBiZSB2ZXJ5IGRpZmZlcmVudCB3ZSB1c2UgYSBsaXN0CmZvciBlYWNoIGFuZCBtaXggdGhlbS4KClRoZSBzb3VuZC1mb2xkaW5nIGlzIHNsb3cgYW5kIHBlb3BsZSB0aGF0IGtub3cgdGhlIGxhbmd1YWdlIHdvbid0IG1ha2UgdGhlCnNlY29uZCBraW5kIG9mIG1pc3Rha2VzLiAgVGhlcmVmb3JlICdzcGVsbHN1Z2dlc3QnIGNhbiBiZSBzZXQgdG8gc2VsZWN0IHRoZQpwcmVmZXJyZWQgbWV0aG9kIGZvciBzY29yaW5nIHRoZSBzdWdnZXN0aW9ucy4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQozLiBHZW5lcmF0aW5nIGEgc3BlbGwgZmlsZQkJCQkqc3BlbGwtbWtzcGVsbCoKClZpbSB1c2VzIGEgYmluYXJ5IGZpbGUgZm9ybWF0IGZvciBzcGVsbGluZy4gIFRoaXMgZ3JlYXRseSBzcGVlZHMgdXAgbG9hZGluZwp0aGUgd29yZCBsaXN0IGFuZCBrZWVwcyBpdCBzbWFsbC4KCQkJCQkJICAgICouYWZmKiAqLmRpYyogKk15c3BlbGwqCllvdSBjYW4gY3JlYXRlIGEgVmltIHNwZWxsIGZpbGUgZnJvbSB0aGUgLmFmZiBhbmQgLmRpYyBmaWxlcyB0aGF0IE15c3BlbGwKdXNlcy4gIE15c3BlbGwgaXMgdXNlZCBieSBPcGVuT2ZmaWNlLm9yZyBhbmQgTW96aWxsYS4gVGhlIE9wZW5PZmZpY2UgLm94dCAKZmlsZXMgYXJlIHppcCBmaWxlcyB3aGljaCBjb250YWluIHRoZSAuYWZmIGFuZCAuZGljIGZpbGVzLiBZb3Ugc2hvdWxkIGJlIGFibGUKdG8gZmluZCB0aGVtIGhlcmU6CglodHRwOi8vZXh0ZW5zaW9ucy5zZXJ2aWNlcy5vcGVub2ZmaWNlLm9yZy9kaWN0aW9uYXJ5ClRoZSBvbGRlciwgT3Blbk9mZmljZSAyIGZpbGVzIG1heSBiZSB1c2VkIGlmIHRoaXMgZG9lc24ndCB3b3JrOgoJaHR0cDovL3dpa2kuc2VydmljZXMub3Blbm9mZmljZS5vcmcvd2lraS9EaWN0aW9uYXJpZXMKWW91IGNhbiBhbHNvIHVzZSBhIHBsYWluIHdvcmQgbGlzdC4gIFRoZSByZXN1bHRzIGFyZSB0aGUgc2FtZSwgdGhlIGNob2ljZQpkZXBlbmRzIG9uIHdoYXQgd29yZCBsaXN0cyB5b3UgY2FuIGZpbmQuCgpJZiB5b3UgaW5zdGFsbCBBYXAgKGZyb20gd3d3LmEtYS1wLm9yZykgeW91IGNhbiB1c2UgdGhlIHJlY2lwZXMgaW4gdGhlCnJ1bnRpbWUvc3BlbGwvPz8vIGRpcmVjdG9yaWVzLiAgQWFwIHdpbGwgdGFrZSBjYXJlIG9mIGRvd25sb2FkaW5nIHRoZSBmaWxlcywKYXBwbHkgcGF0Y2hlcyBuZWVkZWQgZm9yIFZpbSBhbmQgYnVpbGQgdGhlIC5zcGwgZmlsZS4KCk1ha2Ugc3VyZSB5b3VyIGN1cnJlbnQgbG9jYWxlIGlzIHNldCBwcm9wZXJseSwgb3RoZXJ3aXNlIFZpbSBkb2Vzbid0IGtub3cgd2hhdApjaGFyYWN0ZXJzIGFyZSB1cHBlci9sb3dlciBjYXNlIGxldHRlcnMuICBJZiB0aGUgbG9jYWxlIGlzbid0IGF2YWlsYWJsZSAoZS5nLiwKd2hlbiB1c2luZyBhbiBNUy1XaW5kb3dzIGNvZGVwYWdlIG9uIFVuaXgpIGFkZCB0YWJsZXMgdG8gdGhlIC5hZmYgZmlsZQp8c3BlbGwtYWZmaXgtY2hhcnN8LiAgSWYgdGhlIC5hZmYgZmlsZSBkb2Vzbid0IGRlZmluZSBhIHRhYmxlIHRoZW4gdGhlIHdvcmQKdGFibGUgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgc3BlbGxpbmcgaXMgdXNlZC4gIElmIHNwZWxsaW5nIGlzIG5vdCBhY3RpdmUKdGhlbiBWaW0gd2lsbCB0cnkgdG8gZ3Vlc3MuCgoJCQkJCQkJKjpta3NwKiAqOm1rc3BlbGwqCjpta3NwW2VsbF1bIV0gWy1hc2NpaV0ge291dG5hbWV9IHtpbm5hbWV9IC4uLgoJCQlHZW5lcmF0ZSBhIFZpbSBzcGVsbCBmaWxlIGZyb20gd29yZCBsaXN0cy4gIEV4YW1wbGU6ID4KCQk6bWtzcGVsbCAvdG1wL25sIG5sX05MLndvcmRzCjwJCQkJCQkJCSpFNzUxKgoJCQlXaGVuIHtvdXRuYW1lfSBlbmRzIGluICIuc3BsIiBpdCBpcyB1c2VkIGFzIHRoZSBvdXRwdXQKCQkJZmlsZSBuYW1lLiAgT3RoZXJ3aXNlIGl0IHNob3VsZCBiZSBhIGxhbmd1YWdlIG5hbWUsCgkJCXN1Y2ggYXMgImVuIiwgd2l0aG91dCB0aGUgcmVnaW9uIG5hbWUuICBUaGUgZmlsZQoJCQl3cml0dGVuIHdpbGwgYmUgIntvdXRuYW1lfS57ZW5jb2Rpbmd9LnNwbCIsIHdoZXJlCgkJCXtlbmNvZGluZ30gaXMgdGhlIHZhbHVlIG9mIHRoZSAnZW5jb2RpbmcnIG9wdGlvbi4KCgkJCVdoZW4gdGhlIG91dHB1dCBmaWxlIGFscmVhZHkgZXhpc3RzIFshXSBtdXN0IGJlIHVzZWQKCQkJdG8gb3ZlcndyaXRlIGl0LgoKCQkJV2hlbiB0aGUgWy1hc2NpaV0gYXJndW1lbnQgaXMgcHJlc2VudCwgd29yZHMgd2l0aAoJCQlub24tYXNjaWkgY2hhcmFjdGVycyBhcmUgc2tpcHBlZC4gIFRoZSByZXN1bHRpbmcgZmlsZQoJCQllbmRzIGluICJhc2NpaS5zcGwiLgoKCQkJVGhlIGlucHV0IGNhbiBiZSB0aGUgTXlzcGVsbCBmb3JtYXQgZmlsZXMge2lubmFtZX0uYWZmCgkJCWFuZCB7aW5uYW1lfS5kaWMuICBJZiB7aW5uYW1lfS5hZmYgZG9lcyBub3QgZXhpc3QgdGhlbgoJCQl7aW5uYW1lfSBpcyB1c2VkIGFzIHRoZSBmaWxlIG5hbWUgb2YgYSBwbGFpbiB3b3JkCgkJCWxpc3QuCgoJCQlNdWx0aXBsZSB7aW5uYW1lfSBhcmd1bWVudHMgY2FuIGJlIGdpdmVuIHRvIGNvbWJpbmUKCQkJcmVnaW9ucyBpbnRvIG9uZSBWaW0gc3BlbGwgZmlsZS4gIEV4YW1wbGU6ID4KCQk6bWtzcGVsbCB+Ly52aW0vc3BlbGwvZW4gL3RtcC9lbl9VUyAvdG1wL2VuX0NBIC90bXAvZW5fQVUKPAkJCVRoaXMgY29tYmluZXMgdGhlIEVuZ2xpc2ggd29yZCBsaXN0cyBmb3IgVVMsIENBIGFuZCBBVQoJCQlpbnRvIG9uZSBlbi5zcGwgZmlsZS4KCQkJVXAgdG8gZWlnaHQgcmVnaW9ucyBjYW4gYmUgY29tYmluZWQuICpFNzU0KiAqRTc1NSoKCQkJVGhlIFJFUCBhbmQgU0FMIGl0ZW1zIG9mIHRoZSBmaXJzdCAuYWZmIGZpbGUgd2hlcmUKCQkJdGhleSBhcHBlYXIgYXJlIHVzZWQuIHxzcGVsbC1SRVB8IHxzcGVsbC1TQUx8CgkJCQkJCQkJKkU4NDUqCgkJCVRoaXMgY29tbWFuZCB1c2VzIGEgbG90IG9mIG1lbW9yeSwgcmVxdWlyZWQgdG8gZmluZAoJCQl0aGUgb3B0aW1hbCB3b3JkIHRyZWUgKFBvbGlzaCwgSXRhbGlhbiBhbmQgSHVuZ2FyaWFuCgkJCXJlcXVpcmUgc2V2ZXJhbCBodW5kcmVkIE1ieXRlKS4gIFRoZSBmaW5hbCByZXN1bHQgd2lsbAoJCQliZSBtdWNoIHNtYWxsZXIsIGJlY2F1c2UgY29tcHJlc3Npb24gaXMgdXNlZC4gIFRvCgkJCWF2b2lkIHJ1bm5pbmcgb3V0IG9mIG1lbW9yeSBjb21wcmVzc2lvbiB3aWxsIGJlIGRvbmUKCQkJbm93IGFuZCB0aGVuLiAgVGhpcyBjYW4gYmUgdHVuZWQgd2l0aCB0aGUgJ21rc3BlbGxtZW0nCgkJCW9wdGlvbi4KCgkJCUFmdGVyIHRoZSBzcGVsbCBmaWxlIHdhcyB3cml0dGVuIGFuZCBpdCB3YXMgYmVpbmcgdXNlZAoJCQlpbiBhIGJ1ZmZlciBpdCB3aWxsIGJlIHJlbG9hZGVkIGF1dG9tYXRpY2FsbHkuCgo6bWtzcFtlbGxdIFstYXNjaWldIHtuYW1lfS57ZW5jfS5hZGQKCQkJTGlrZSAiOm1rc3BlbGwiIGFib3ZlLCB1c2luZyB7bmFtZX0ue2VuY30uYWRkIGFzIHRoZQoJCQlpbnB1dCBmaWxlIGFuZCBwcm9kdWNpbmcgYW4gb3V0cHV0IGZpbGUgaW4gdGhlIHNhbWUKCQkJZGlyZWN0b3J5IHRoYXQgaGFzICIuc3BsIiBhcHBlbmRlZC4KCjpta3NwW2VsbF0gWy1hc2NpaV0ge25hbWV9CgkJCUxpa2UgIjpta3NwZWxsIiBhYm92ZSwgdXNpbmcge25hbWV9IGFzIHRoZSBpbnB1dCBmaWxlCgkJCWFuZCBwcm9kdWNpbmcgYW4gb3V0cHV0IGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5CgkJCXRoYXQgaGFzICIue2VuY30uc3BsIiBhcHBlbmRlZC4KClZpbSB3aWxsIHJlcG9ydCB0aGUgbnVtYmVyIG9mIGR1cGxpY2F0ZSB3b3Jkcy4gIFRoaXMgbWlnaHQgYmUgYSBtaXN0YWtlIGluIHRoZQpsaXN0IG9mIHdvcmRzLiAgQnV0IHNvbWV0aW1lcyBpdCBpcyB1c2VkIHRvIGhhdmUgZGlmZmVyZW50IHByZWZpeGVzIGFuZApzdWZmaXhlcyBmb3IgdGhlIHNhbWUgYmFzaWMgd29yZCB0byBhdm9pZCB0aGVtIGNvbWJpbmluZyAoZS5nLiBDemVjaCB1c2VzCnRoaXMpLiAgSWYgeW91IHdhbnQgVmltIHRvIHJlcG9ydCBhbGwgZHVwbGljYXRlIHdvcmRzIHNldCB0aGUgJ3ZlcmJvc2UnCm9wdGlvbi4KClNpbmNlIHlvdSBtaWdodCB3YW50IHRvIGNoYW5nZSBhIE15c3BlbGwgd29yZCBsaXN0IGZvciB1c2Ugd2l0aCBWaW0gdGhlCmZvbGxvd2luZyBwcm9jZWR1cmUgaXMgcmVjb21tZW5kZWQ6CgoxLiBPYnRhaW4gdGhlIHh4X1lZLmFmZiBhbmQgeHhfWVkuZGljIGZpbGVzIGZyb20gTXlzcGVsbC4KMi4gTWFrZSBhIGNvcHkgb2YgdGhlc2UgZmlsZXMgdG8geHhfWVkub3JpZy5hZmYgYW5kIHh4X1lZLm9yaWcuZGljLgozLiBDaGFuZ2UgdGhlIHh4X1lZLmFmZiBhbmQgeHhfWVkuZGljIGZpbGVzIHRvIHJlbW92ZSBiYWQgd29yZHMsIGFkZCBtaXNzaW5nCiAgIHdvcmRzLCBkZWZpbmUgd29yZCBjaGFyYWN0ZXJzIHdpdGggRk9ML0xPVy9VUFAsIGV0Yy4gIFRoZSBkaXN0cmlidXRlZAogICAiKi5kaWZmIiBmaWxlcyBjYW4gYmUgdXNlZC4KNC4gU3RhcnQgVmltIHdpdGggdGhlIHJpZ2h0IGxvY2FsZSBhbmQgdXNlIHw6bWtzcGVsbHwgdG8gZ2VuZXJhdGUgdGhlIFZpbQogICBzcGVsbCBmaWxlLgo1LiBUcnkgb3V0IHRoZSBzcGVsbCBmaWxlIHdpdGggIjpzZXQgc3BlbGwgc3BlbGxsYW5nPXh4IiBpZiB5b3Ugd3JvdGUgaXQgaW4KICAgYSBzcGVsbCBkaXJlY3RvcnkgaW4gJ3J1bnRpbWVwYXRoJywgb3IgIjpzZXQgc3BlbGxsYW5nPXh4LmVuYy5zcGwiIGlmIHlvdQogICB3cm90ZSBpdCBzb21ld2hlcmUgZWxzZS4KCldoZW4gdGhlIE15c3BlbGwgZmlsZXMgYXJlIHVwZGF0ZWQgeW91IGNhbiBtZXJnZSB0aGUgZGlmZmVyZW5jZXM6CjEuIE9idGFpbiB0aGUgbmV3IE15c3BlbGwgZmlsZXMgYXMgeHhfWVkubmV3LmFmZiBhbmQgeHhfVVUubmV3LmRpYy4KMi4gVXNlIFZpbWRpZmYgdG8gc2VlIHdoYXQgY2hhbmdlZDogPgoJdmltZGlmZiB4eF9ZWS5vcmlnLmRpYyB4eF9ZWS5uZXcuZGljCjMuIFRha2Ugb3ZlciB0aGUgY2hhbmdlcyB5b3UgbGlrZSBpbiB4eF9ZWS5kaWMuCiAgIFlvdSBtYXkgYWxzbyBuZWVkIHRvIGNoYW5nZSB4eF9ZWS5hZmYuCjQuIFJlbmFtZSB4eF9ZWS5uZXcuZGljIHRvIHh4X1lZLm9yaWcuZGljIGFuZCB4eF9ZWS5uZXcuYWZmIHRvIHh4X1lZLm5ldy5hZmYuCgoKU1BFTEwgRklMRSBWRVJTSU9OUwkJCQkJKkU3NzAqICpFNzcxKiAqRTc3MioKClNwZWxsIGNoZWNraW5nIGlzIGEgcmVsYXRpdmVseSBuZXcgZmVhdHVyZSBpbiBWaW0sIHRodXMgaXQncyBwb3NzaWJsZSB0aGF0IHRoZQouc3BsIGZpbGUgZm9ybWF0IHdpbGwgYmUgY2hhbmdlZCB0byBzdXBwb3J0IG1vcmUgbGFuZ3VhZ2VzLiAgVmltIHdpbGwgY2hlY2sKdGhlIHZhbGlkaXR5IG9mIHRoZSBzcGVsbCBmaWxlIGFuZCByZXBvcnQgYW55dGhpbmcgd3JvbmcuCgoJRTc3MTogT2xkIHNwZWxsIGZpbGUsIG5lZWRzIHRvIGJlIHVwZGF0ZWQgfgpUaGlzIHNwZWxsIGZpbGUgaXMgb2xkZXIgdGhhbiB5b3VyIFZpbS4gIFlvdSBuZWVkIHRvIHVwZGF0ZSB0aGUgLnNwbCBmaWxlLgoKCUU3NzI6IFNwZWxsIGZpbGUgaXMgZm9yIG5ld2VyIHZlcnNpb24gb2YgVmltIH4KVGhpcyBtZWFucyB0aGUgc3BlbGwgZmlsZSB3YXMgbWFkZSBmb3IgYSBsYXRlciB2ZXJzaW9uIG9mIFZpbS4gIFlvdSBuZWVkIHRvCnVwZGF0ZSBWaW0uCgoJRTc3MDogVW5zdXBwb3J0ZWQgc2VjdGlvbiBpbiBzcGVsbCBmaWxlIH4KVGhpcyBtZWFucyB0aGUgc3BlbGwgZmlsZSB3YXMgbWFkZSBmb3IgYSBsYXRlciB2ZXJzaW9uIG9mIFZpbSBhbmQgY29udGFpbnMgYQpzZWN0aW9uIHRoYXQgaXMgcmVxdWlyZWQgZm9yIHRoZSBzcGVsbCBmaWxlIHRvIHdvcmsuICBJbiB0aGlzIGNhc2UgaXQncwpwcm9iYWJseSBhIGdvb2QgaWRlYSB0byB1cGdyYWRlIHlvdXIgVmltLgoKClNQRUxMIEZJTEUgRFVNUAoKSWYgZm9yIHNvbWUgcmVhc29uIHlvdSB3YW50IHRvIGNoZWNrIHdoYXQgd29yZHMgYXJlIHN1cHBvcnRlZCBieSB0aGUgY3VycmVudGx5CnVzZWQgc3BlbGxpbmcgZmlsZXMsIHVzZSB0aGlzIGNvbW1hbmQ6CgoJCQkJCQkJKjpzcGVsbGR1bXAqICo6c3BlbGxkKgo6c3BlbGxkW3VtcF0JCU9wZW4gYSBuZXcgd2luZG93IGFuZCBmaWxsIGl0IHdpdGggYWxsIGN1cnJlbnRseSB2YWxpZAoJCQl3b3Jkcy4gIENvbXBvdW5kIHdvcmRzIGFyZSBub3QgaW5jbHVkZWQuCgkJCU5vdGU6IEZvciBzb21lIGxhbmd1YWdlcyB0aGUgcmVzdWx0IG1heSBiZSBlbm9ybW91cywKCQkJY2F1c2luZyBWaW0gdG8gcnVuIG91dCBvZiBtZW1vcnkuCgo6c3BlbGxkW3VtcF0hCQlMaWtlICI6c3BlbGxkdW1wIiBhbmQgaW5jbHVkZSB0aGUgd29yZCBjb3VudC4gIFRoaXMgaXMKCQkJdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgd29yZCB3YXMgZm91bmQgd2hpbGUKCQkJdXBkYXRpbmcgdGhlIHNjcmVlbi4gIFdvcmRzIHRoYXQgYXJlIGluIENPTU1PTiBpdGVtcwoJCQlnZXQgYSBzdGFydGluZyBjb3VudCBvZiAxMC4KClRoZSBmb3JtYXQgb2YgdGhlIHdvcmQgbGlzdCBpcyB1c2VkIHxzcGVsbC13b3JkbGlzdC1mb3JtYXR8LiAgWW91IHNob3VsZCBiZQphYmxlIHRvIHJlYWQgaXQgd2l0aCAiOm1rc3BlbGwiIHRvIGdlbmVyYXRlIG9uZSAuc3BsIGZpbGUgdGhhdCBpbmNsdWRlcyBhbGwKdGhlIHdvcmRzLgoKV2hlbiBhbGwgZW50cmllcyB0byAnc3BlbGxsYW5nJyB1c2UgdGhlIHNhbWUgcmVnaW9ucyBvciBubyByZWdpb25zIGF0IGFsbCB0aGVuCnRoZSByZWdpb24gaW5mb3JtYXRpb24gaXMgaW5jbHVkZWQgaW4gdGhlIGR1bXBlZCB3b3Jkcy4gIE90aGVyd2lzZSBvbmx5IHdvcmRzCmZvciB0aGUgY3VycmVudCByZWdpb24gYXJlIGluY2x1ZGVkIGFuZCBubyAiL3JlZ2lvbnMiIGxpbmUgaXMgZ2VuZXJhdGVkLgoKQ29tbWVudCBsaW5lcyB3aXRoIHRoZSBuYW1lIG9mIHRoZSAuc3BsIGZpbGUgYXJlIHVzZWQgYXMgYSBoZWFkZXIgYWJvdmUgdGhlCndvcmRzIHRoYXQgd2VyZSBnZW5lcmF0ZWQgZnJvbSB0aGF0IC5zcGwgZmlsZS4KCgpTUEVMTCBGSUxFIE1JU1NJTkcJCSpzcGVsbC1TcGVsbEZpbGVNaXNzaW5nKiAqc3BlbGxmaWxlLnZpbSoKCklmIHRoZSBzcGVsbCBmaWxlIGZvciB0aGUgbGFuZ3VhZ2UgeW91IGFyZSB1c2luZyBpcyBub3QgYXZhaWxhYmxlLCB5b3Ugd2lsbApnZXQgYW4gZXJyb3IgbWVzc2FnZS4gIEJ1dCBpZiB0aGUgInNwZWxsZmlsZS52aW0iIHBsdWdpbiBpcyBhY3RpdmUgaXQgd2lsbApvZmZlciB5b3UgdG8gZG93bmxvYWQgdGhlIHNwZWxsIGZpbGUuICBKdXN0IGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zLCBpdCB3aWxsCmFzayB5b3Ugd2hlcmUgdG8gd3JpdGUgdGhlIGZpbGUgKHRoZXJlIG11c3QgYmUgYSB3cml0YWJsZSBkaXJlY3RvcnkgaW4KJ3J1bnRpbWVwYXRoJyBmb3IgdGhpcykuCgpUaGUgcGx1Z2luIGhhcyBhIGRlZmF1bHQgcGxhY2Ugd2hlcmUgdG8gbG9vayBmb3Igc3BlbGwgZmlsZXMsIG9uIHRoZSBWaW0gZnRwCnNlcnZlci4gIElmIHlvdSB3YW50IHRvIHVzZSBhbm90aGVyIGxvY2F0aW9uIG9yIGFub3RoZXIgcHJvdG9jb2wsIHNldCB0aGUKZzpzcGVsbGZpbGVfVVJMIHZhcmlhYmxlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdCBob2xkcyB0aGUgc3BlbGwgZmlsZXMuICBUaGUKfG5ldHJ3fCBwbHVnaW4gaXMgdXNlZCBmb3IgZ2V0dGluZyB0aGUgZmlsZSwgbG9vayB0aGVyZSBmb3IgdGhlIHNwZWNpZmljCnN5bnRheCBvZiB0aGUgVVJMLiAgRXhhbXBsZTogPgoJbGV0IGc6c3BlbGxmaWxlX1VSTCA9ICdodHRwOi8vZnRwLnZpbS5vcmcvdmltL3J1bnRpbWUvc3BlbGwnCllvdSBtYXkgbmVlZCB0byBlc2NhcGUgc3BlY2lhbCBjaGFyYWN0ZXJzLgoKVGhlIHBsdWdpbiB3aWxsIG9ubHkgYXNrIGFib3V0IGRvd25sb2FkaW5nIGEgbGFuZ3VhZ2Ugb25jZS4gIElmIHlvdSB3YW50IHRvCnRyeSBhZ2FpbiBhbnl3YXkgcmVzdGFydCBWaW0sIG9yIHNldCBnOnNwZWxsZmlsZV9VUkwgdG8gYW5vdGhlciB2YWx1ZSAoZS5nLiwKcHJlcGVuZCBhIHNwYWNlKS4KClRvIGF2b2lkIHVzaW5nIHRoZSAic3BlbGxmaWxlLnZpbSIgcGx1Z2luIGRvIHRoaXMgaW4geW91ciB2aW1yYyBmaWxlOiA+CgoJbGV0IGxvYWRlZF9zcGVsbGZpbGVfcGx1Z2luID0gMQoKSW5zdGVhZCBvZiB1c2luZyB0aGUgcGx1Z2luIHlvdSBjYW4gZGVmaW5lIGEgfFNwZWxsRmlsZU1pc3Npbmd8IGF1dG9jb21tYW5kIHRvCmhhbmRsZSB0aGUgbWlzc2luZyBmaWxlIHlvdXJzZWxmLiAgWW91IGNhbiB1c2UgaXQgbGlrZSB0aGlzOiA+CgoJOmF1IFNwZWxsRmlsZU1pc3NpbmcgKiBjYWxsIERvd25sb2FkX3NwZWxsX2ZpbGUoZXhwYW5kKCc8YW1hdGNoPicpKQoKVGh1cyB0aGUgPGFtYXRjaD4gaXRlbSBjb250YWlucyB0aGUgbmFtZSBvZiB0aGUgbGFuZ3VhZ2UuICBBbm90aGVyIGltcG9ydGFudAp2YWx1ZSBpcyAnZW5jb2RpbmcnLCBzaW5jZSBldmVyeSBlbmNvZGluZyBoYXMgaXRzIG93biBzcGVsbCBmaWxlLiAgV2l0aCB0d28KZXhjZXB0aW9uczoKLSBGb3IgSVNPLTg4NTktMTUgKGxhdGluOSkgdGhlIG5hbWUgImxhdGluMSIgaXMgdXNlZCAodGhlIGVuY29kaW5ncyBvbmx5CiAgZGlmZmVyIGluIGNoYXJhY3RlcnMgbm90IHVzZWQgaW4gZGljdGlvbmFyeSB3b3JkcykuCi0gVGhlIG5hbWUgImFzY2lpIiBtYXkgYWxzbyBiZSB1c2VkIGZvciBzb21lIGxhbmd1YWdlcyB3aGVyZSB0aGUgd29yZHMgdXNlCiAgb25seSBBU0NJSSBsZXR0ZXJzIGZvciBtb3N0IG9mIHRoZSB3b3Jkcy4KClRoZSBkZWZhdWx0ICJzcGVsbGZpbGUudmltIiBwbHVnaW4gdXNlcyB0aGlzIGF1dG9jb21tYW5kLCBpZiB5b3UgZGVmaW5lIHlvdXIKYXV0b2NvbW1hbmQgYWZ0ZXJ3YXJkcyB5b3UgbWF5IHdhbnQgdG8gdXNlICI6YXUhIFNwZWxsRmlsZU1pc3NpbmciIHRvIG92ZXJydWxlCml0LiAgSWYgeW91IGRlZmluZSB5b3VyIGF1dG9jb21tYW5kIGJlZm9yZSB0aGUgcGx1Z2luIGlzIGxvYWRlZCBpdCB3aWxsIG5vdGljZQp0aGlzIGFuZCBub3QgZG8gYW55dGhpbmcuCgkJCQkJCQkqRTc5NyoKTm90ZSB0aGF0IHRoZSBTcGVsbEZpbGVNaXNzaW5nIGF1dG9jb21tYW5kIG11c3Qgbm90IGNoYW5nZSBvciBkZXN0cm95IHRoZQpidWZmZXIgdGhlIHVzZXIgd2FzIGVkaXRpbmcuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNC4gU3BlbGwgZmlsZSBmb3JtYXQJCQkJCSpzcGVsbC1maWxlLWZvcm1hdCoKClRoaXMgaXMgdGhlIGZvcm1hdCBvZiB0aGUgZmlsZXMgdGhhdCBhcmUgdXNlZCBieSB0aGUgcGVyc29uIHdobyBjcmVhdGVzIGFuZAptYWludGFpbnMgYSB3b3JkIGxpc3QuCgpOb3RlIHRoYXQgd2UgYXZvaWQgdGhlIHdvcmQgImRpY3Rpb25hcnkiIGhlcmUuICBUaGF0IGlzIGJlY2F1c2UgdGhlIGdvYWwgb2YKc3BlbGwgY2hlY2tpbmcgZGlmZmVycyBmcm9tIHdyaXRpbmcgYSBkaWN0aW9uYXJ5IChhcyBpbiB0aGUgYm9vaykuICBGb3IKc3BlbGxpbmcgd2UgbmVlZCBhIGxpc3Qgb2Ygd29yZHMgdGhhdCBhcmUgT0ssIHRodXMgc2hvdWxkIG5vdCBiZSBoaWdobGlnaHRlZC4KUGVyc29uIGFuZCBjb21wYW55IG5hbWVzIHdpbGwgbm90IGFwcGVhciBpbiBhIGRpY3Rpb25hcnksIGJ1dCBkbyBhcHBlYXIgaW4gYQp3b3JkIGxpc3QuICBBbmQgc29tZSBvbGQgd29yZHMgYXJlIHJhcmVseSB1c2VkIHdoaWxlIHRoZXkgYXJlIGNvbW1vbgptaXNzcGVsbGluZ3MuICBUaGVzZSBkbyBhcHBlYXIgaW4gYSBkaWN0aW9uYXJ5IGJ1dCBub3QgaW4gYSB3b3JkIGxpc3QuCgpUaGVyZSBhcmUgdHdvIGZvcm1hdHM6IEEgc3RyYWlnaHQgbGlzdCBvZiB3b3JkcyBhbmQgYSBsaXN0IHVzaW5nIGFmZml4CmNvbXByZXNzaW9uLiAgVGhlIGZpbGVzIHdpdGggYWZmaXggY29tcHJlc3Npb24gYXJlIHVzZWQgYnkgTXlzcGVsbCAoTW96aWxsYQphbmQgT3Blbk9mZmljZS5vcmcpLiAgVGhpcyByZXF1aXJlcyB0d28gZmlsZXMsIG9uZSB3aXRoIC5hZmYgYW5kIG9uZSB3aXRoIC5kaWMKZXh0ZW5zaW9uLgoKCkZPUk1BVCBPRiBTVFJBSUdIVCBXT1JEIExJU1QJCQkJKnNwZWxsLXdvcmRsaXN0LWZvcm1hdCoKClRoZSB3b3JkcyBtdXN0IGFwcGVhciBvbmUgcGVyIGxpbmUuICBUaGF0IGlzIGFsbCB0aGF0IGlzIHJlcXVpcmVkLgoKQWRkaXRpb25hbGx5IHRoZSBmb2xsb3dpbmcgaXRlbXMgYXJlIHJlY29nbml6ZWQ6CgotIEVtcHR5IGFuZCBibGFuayBsaW5lcyBhcmUgaWdub3JlZC4KCgkjIGNvbW1lbnQgfgotIExpbmVzIHN0YXJ0aW5nIHdpdGggYSAjIGFyZSBpZ25vcmVkIChjb21tZW50IGxpbmVzKS4KCgkvZW5jb2Rpbmc9dXRmLTggfgotIEEgbGluZSBzdGFydGluZyB3aXRoICIvZW5jb2Rpbmc9IiwgYmVmb3JlIGFueSB3b3JkLCBzcGVjaWZpZXMgdGhlIGVuY29kaW5nCiAgb2YgdGhlIGZpbGUuICBBZnRlciB0aGUgc2Vjb25kICc9JyBjb21lcyBhbiBlbmNvZGluZyBuYW1lLiAgVGhpcyB0ZWxscyBWaW0KICB0byBzZXR1cCBjb252ZXJzaW9uIGZyb20gdGhlIHNwZWNpZmllZCBlbmNvZGluZyB0byAnZW5jb2RpbmcnLiAgVGh1cyB5b3UgY2FuCiAgdXNlIG9uZSB3b3JkIGxpc3QgZm9yIHNldmVyYWwgdGFyZ2V0IGVuY29kaW5ncy4KCgkvcmVnaW9ucz11c2NhIH4KLSBBIGxpbmUgc3RhcnRpbmcgd2l0aCAiL3JlZ2lvbnM9IiBzcGVjaWZpZXMgdGhlIHJlZ2lvbiBuYW1lcyB0aGF0IGFyZQogIHN1cHBvcnRlZC4gIEVhY2ggcmVnaW9uIG5hbWUgbXVzdCBiZSB0d28gQVNDSUkgbGV0dGVycy4gIFRoZSBmaXJzdCBvbmUgaXMKICByZWdpb24gMS4gIFRodXMgIi9yZWdpb25zPXVzY2EiIGhhcyByZWdpb24gMSAidXMiIGFuZCByZWdpb24gMiAiY2EiLgogIEluIGFuIGFkZGl0aW9uIHdvcmQgbGlzdCB0aGUgcmVnaW9uIG5hbWVzIHNob3VsZCBiZSBlcXVhbCB0byB0aGUgbWFpbiB3b3JkCiAgbGlzdCEKCi0gT3RoZXIgbGluZXMgc3RhcnRpbmcgd2l0aCAnLycgYXJlIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiAgVGhlIG9uZXMgdGhhdAogIGFyZSBub3QgcmVjb2duaXplZCBhcmUgaWdub3JlZC4gIFlvdSBkbyBnZXQgYSB3YXJuaW5nIG1lc3NhZ2UsIHNvIHRoYXQgeW91CiAga25vdyBzb21ldGhpbmcgd29uJ3Qgd29yay4KCi0gQSAiLyIgbWF5IGZvbGxvdyB0aGUgd29yZCB3aXRoIHRoZSBmb2xsb3dpbmcgaXRlbXM6CiAgICA9CQlDYXNlIG11c3QgbWF0Y2ggZXhhY3RseS4KICAgID8JCVJhcmUgd29yZC4KICAgICEJCUJhZCAod3JvbmcpIHdvcmQuCiAgICBkaWdpdAlBIHJlZ2lvbiBpbiB3aGljaCB0aGUgd29yZCBpcyB2YWxpZC4gIElmIG5vIHJlZ2lvbnMgYXJlCgkJc3BlY2lmaWVkIHRoZSB3b3JkIGlzIHZhbGlkIGluIGFsbCByZWdpb25zLgoKRXhhbXBsZToKCgkjIFRoaXMgaXMgYW4gZXhhbXBsZSB3b3JkIGxpc3QJCWNvbW1lbnQKCS9lbmNvZGluZz1sYXRpbjEJCQllbmNvZGluZyBvZiB0aGUgZmlsZQoJL3JlZ2lvbnM9dXNjYWdiCQkJCXJlZ2lvbnMgInVzIiwgImNhIiBhbmQgImdiIgoJZXhhbXBsZQkJCQkJd29yZCBmb3IgYWxsIHJlZ2lvbnMKCWJsYWgvMTIJCQkJCXdvcmQgZm9yIHJlZ2lvbnMgInVzIiBhbmQgImNhIgoJdmltLyEJCQkJCWJhZCB3b3JkCglDYW1wYmVsbC8/MwkJCQlyYXJlIHdvcmQgaW4gcmVnaW9uIDMgImdiIgoJJ3MgbW9ybmluZ3MvPQkJCQlrZWVwLWNhc2Ugd29yZAoKTm90ZSB0aGF0IHdoZW4gIi89IiBpcyB1c2VkIHRoZSBzYW1lIHdvcmQgd2l0aCBhbGwgdXBwZXItY2FzZSBsZXR0ZXJzIGlzIG5vdAphY2NlcHRlZC4gIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gYSB3b3JkIHdpdGggbWl4ZWQgY2FzZSB0aGF0IGlzIGF1dG9tYXRpY2FsbHkKbWFya2VkIGFzIGtlZXAtY2FzZSwgdGhvc2Ugd29yZHMgbWF5IGFwcGVhciBpbiBhbGwgdXBwZXItY2FzZSBsZXR0ZXJzLgoKCkZPUk1BVCBXSVRIIC5BRkYgQU5EIC5ESUMgRklMRVMJCQkJKmFmZi1kaWMtZm9ybWF0KgoKVGhlcmUgYXJlIHR3byBmaWxlczogdGhlIGJhc2ljIHdvcmQgbGlzdCBhbmQgYW4gYWZmaXggZmlsZS4gIFRoZSBhZmZpeCBmaWxlCnNwZWNpZmllcyBzZXR0aW5ncyBmb3IgdGhlIGxhbmd1YWdlIGFuZCBjYW4gY29udGFpbiBhZmZpeGVzLiAgVGhlIGFmZml4ZXMgYXJlCnVzZWQgdG8gbW9kaWZ5IHRoZSBiYXNpYyB3b3JkcyB0byBnZXQgdGhlIGZ1bGwgd29yZCBsaXN0LiAgVGhpcyBzaWduaWZpY2FudGx5CnJlZHVjZXMgdGhlIG51bWJlciBvZiB3b3JkcywgZXNwZWNpYWxseSBmb3IgYSBsYW5ndWFnZSBsaWtlIFBvbGlzaC4gIFRoaXMgaXMKY2FsbGVkIGFmZml4IGNvbXByZXNzaW9uLgoKVGhlIGJhc2ljIHdvcmQgbGlzdCBhbmQgdGhlIGFmZml4IGZpbGUgYXJlIGNvbWJpbmVkIHdpdGggdGhlICI6bWtzcGVsbCIKY29tbWFuZCBhbmQgcmVzdWx0cyBpbiBhIGJpbmFyeSBzcGVsbCBmaWxlLiAgQWxsIHRoZSBwcmVwcm9jZXNzaW5nIGhhcyBiZWVuCmRvbmUsIHRodXMgdGhpcyBmaWxlIGxvYWRzIGZhc3QuICBUaGUgYmluYXJ5IHNwZWxsIGZpbGUgZm9ybWF0IGlzIGRlc2NyaWJlZCBpbgp0aGUgc291cmNlIGNvZGUgKHNyYy9zcGVsbC5jKS4gIEJ1dCBvbmx5IGRldmVsb3BlcnMgbmVlZCB0byBrbm93IGFib3V0IGl0LgoKVGhlIHByZXByb2Nlc3NpbmcgYWxzbyBhbGxvd3MgdXMgdG8gdGFrZSB0aGUgTXlzcGVsbCBsYW5ndWFnZSBmaWxlcyBhbmQgbW9kaWZ5CnRoZW0gYmVmb3JlIHRoZSBWaW0gd29yZCBsaXN0IGlzIG1hZGUuICBUaGUgdG9vbHMgZm9yIHRoaXMgY2FuIGJlIGZvdW5kIGluIHRoZQoic3JjL3NwZWxsIiBkaXJlY3RvcnkuCgpUaGUgZm9ybWF0IGZvciB0aGUgYWZmaXggYW5kIHdvcmQgbGlzdCBmaWxlcyBpcyBiYXNlZCBvbiB3aGF0IE15c3BlbGwgdXNlcwoodGhlIHNwZWxsIGNoZWNrZXIgb2YgTW96aWxsYSBhbmQgT3Blbk9mZmljZS5vcmcpLiAgQSBkZXNjcmlwdGlvbiBjYW4gYmUgZm91bmQKaGVyZToKCWh0dHA6Ly9saW5ndWNvbXBvbmVudC5vcGVub2ZmaWNlLm9yZy9hZmZpeC5yZWFkbWUgfgpOb3RlIHRoYXQgYWZmaXhlcyBhcmUgY2FzZSBzZW5zaXRpdmUsIHRoaXMgaXNuJ3Qgb2J2aW91cyBmcm9tIHRoZSBkZXNjcmlwdGlvbi4KClZpbSBzdXBwb3J0cyBxdWl0ZSBhIGZldyBleHRyYXMuICBUaGV5IGFyZSBkZXNjcmliZWQgYmVsb3cgfHNwZWxsLWFmZml4LXZpbXwuCkF0dGVtcHRzIGhhdmUgYmVlbiBtYWRlIHRvIGtlZXAgdGhpcyBjb21wYXRpYmxlIHdpdGggb3RoZXIgc3BlbGwgY2hlY2tlcnMsIHNvCnRoYXQgdGhlIHNhbWUgZmlsZXMgY2FuIG9mdGVuIGJlIHVzZWQuICBPbmUgb3RoZXIgcHJvamVjdCB0aGF0IG9mZmVycyBtb3JlCnRoYW4gTXlzcGVsbCBpcyBIdW5zcGVsbCAoIGh0dHA6Ly9odW5zcGVsbC5zZi5uZXQgKS4KCgpXT1JEIExJU1QgRk9STUFUCQkJCSpzcGVsbC1kaWMtZm9ybWF0KgoKQSBzaG9ydCBleGFtcGxlLCB3aXRoIGxpbmUgbnVtYmVyczoKCgkxCTEyMzQgfgoJMglhYW4gfgoJMwlBbHMgfgoJNAlFdHRlbi1MZXVyIH4KCTUJZXQgYWwuIH4KCTYJJ3MtR3JhdmVuaGFnZSB+Cgk3CSdzLUdyYXZlbmhhYWdzIH4KCTgJIyB3b3JkIHRoYXQgZGlmZmVycyBiZXR3ZWVuIHJlZ2lvbnMgfgoJOQlrYWRvLzEgfgoJMTAJY2FkZWF1LzIgfgoJMTEJVENQLElQIH4KCTEyCS90aGUgUyBhZmZpeCBtYXkgYWRkIGEgJ3MnIH4KCTEzCWJlZGVsL1MgfgoKVGhlIGZpcnN0IGxpbmUgY29udGFpbnMgdGhlIG51bWJlciBvZiB3b3Jkcy4gIFZpbSBpZ25vcmVzIGl0LCBidXQgeW91IGRvIGdldAphbiBlcnJvciBtZXNzYWdlIGlmIGl0J3Mgbm90IHRoZXJlLiAgKkU3NjAqCgpXaGF0IGZvbGxvd3MgaXMgb25lIHdvcmQgcGVyIGxpbmUuICBXaGl0ZSBzcGFjZSBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lIGlzCmlnbm9yZWQsIGFsbCBvdGhlciB3aGl0ZSBzcGFjZSBtYXR0ZXJzLiAgVGhlIGVuY29kaW5nIGlzIHNwZWNpZmllZCBpbiB0aGUKYWZmaXggZmlsZSB8c3BlbGwtU0VUfC4KCkNvbW1lbnQgbGluZXMgc3RhcnQgd2l0aCAnIycgb3IgJy8nLiAgU2VlIHRoZSBleGFtcGxlIGxpbmVzIDggYW5kIDEyLiAgTm90ZQp0aGF0IHB1dHRpbmcgYSBjb21tZW50IGFmdGVyIGEgd29yZCBpcyBOT1QgYWxsb3dlZDoKCgkJc29tZXdvcmQgICAjIGNvbW1lbnQgdGhhdCBjYXVzZXMgYW4gZXJyb3IhIH4KCkFmdGVyIHRoZSB3b3JkIHRoZXJlIGlzIGFuIG9wdGlvbmFsIHNsYXNoIGFuZCBmbGFncy4gIE1vc3Qgb2YgdGhlc2UgZmxhZ3MgYXJlCmxldHRlcnMgdGhhdCBpbmRpY2F0ZSB0aGUgYWZmaXhlcyB0aGF0IGNhbiBiZSB1c2VkIHdpdGggdGhpcyB3b3JkLiAgVGhlc2UgYXJlCnNwZWNpZmllZCB3aXRoIFNGWCBhbmQgUEZYIGxpbmVzIGluIHRoZSAuYWZmIGZpbGUsIHNlZSB8c3BlbGwtU0ZYfCBhbmQKfHNwZWxsLVBGWHwuICBWaW0gYWxsb3dzIHVzaW5nIG90aGVyIGZsYWcgdHlwZXMgd2l0aCB0aGUgRkxBRyBpdGVtIGluIHRoZQphZmZpeCBmaWxlIHxzcGVsbC1GTEFHfC4KCldoZW4gdGhlIHdvcmQgb25seSBoYXMgbG93ZXItY2FzZSBsZXR0ZXJzIGl0IHdpbGwgYWxzbyBtYXRjaCB3aXRoIHRoZSB3b3JkCnN0YXJ0aW5nIHdpdGggYW4gdXBwZXItY2FzZSBsZXR0ZXIuCgpXaGVuIHRoZSB3b3JkIGluY2x1ZGVzIGFuIHVwcGVyLWNhc2UgbGV0dGVyLCB0aGlzIG1lYW5zIHRoZSB1cHBlci1jYXNlIGxldHRlcgppcyByZXF1aXJlZCBhdCB0aGlzIHBvc2l0aW9uLiAgVGhlIHNhbWUgd29yZCB3aXRoIGEgbG93ZXItY2FzZSBsZXR0ZXIgYXQgdGhpcwpwb3NpdGlvbiB3aWxsIG5vdCBtYXRjaC4gV2hlbiBzb21lIG9mIHRoZSBvdGhlciBsZXR0ZXJzIGFyZSB1cHBlci1jYXNlIGl0IHdpbGwKbm90IG1hdGNoIGVpdGhlci4KClRoZSB3b3JkIHdpdGggYWxsIHVwcGVyLWNhc2UgY2hhcmFjdGVycyB3aWxsIGFsd2F5cyBiZSBPSywKCgl3b3JkIGxpc3QJbWF0Y2hlcwkJCWRvZXMgbm90IG1hdGNoIH4KCWFscwkJYWxzIEFscyBBTFMJCUFMcyBBbFMgYUxzIGFMUwoJQWxzCQlBbHMgIEFMUwkJYWxzIEFMcyBBbFMgYUxzIGFMUwoJQUxTCQlBTFMJCQlhbHMgQWxzIEFMcyBBbFMgYUxzIGFMUwoJQWxTCQlBbFMgQUxTCQkJYWxzIEFscyBBTHMgYUxzIGFMUwoKVGhlIEtFRVBDQVNFIGFmZml4IElEIGNhbiBiZSB1c2VkIHRvIHNwZWNpZmljYWxseSBtYXRjaCBhIHdvcmQgd2l0aCBpZGVudGljYWwKY2FzZSBvbmx5LCBzZWUgYmVsb3cgfHNwZWxsLUtFRVBDQVNFfC4KCk5vdGU6IGluIGxpbmUgNSB0byA3IG5vbi13b3JkIGNoYXJhY3RlcnMgYXJlIHVzZWQuICBZb3UgY2FuIGluY2x1ZGUgYW55CmNoYXJhY3RlciBpbiBhIHdvcmQuICBXaGVuIGNoZWNraW5nIHRoZSB0ZXh0IGEgd29yZCBzdGlsbCBvbmx5IG1hdGNoZXMgd2hlbiBpdAphcHBlYXJzIHdpdGggYSBub24td29yZCBjaGFyYWN0ZXIgYmVmb3JlIGFuZCBhZnRlciBpdC4gIEZvciBNeXNwZWxsIGEgd29yZApzdGFydGluZyB3aXRoIGEgbm9uLXdvcmQgY2hhcmFjdGVyIHByb2JhYmx5IHdvbid0IHdvcmsuCgpJbiBsaW5lIDEyIHRoZSB3b3JkICJUQ1AvSVAiIGlzIGRlZmluZWQuICBTaW5jZSB0aGUgc2xhc2ggaGFzIGEgc3BlY2lhbAptZWFuaW5nIHRoZSBjb21tYSBpcyB1c2VkIGluc3RlYWQuICBUaGlzIGlzIGRlZmluZWQgd2l0aCB0aGUgU0xBU0ggaXRlbSBpbiB0aGUKYWZmaXggZmlsZSwgc2VlIHxzcGVsbC1TTEFTSHwuICBOb3RlIHRoYXQgd2l0aG91dCB0aGlzIFNMQVNIIGl0ZW0gdGhlIHdvcmQKd2lsbCBiZSAiVENQLElQIi4KCgpBRkZJWCBGSUxFIEZPUk1BVAkJCSpzcGVsbC1hZmYtZm9ybWF0KiAqc3BlbGwtYWZmaXgtdmltKgoKCQkJCQkJCSpzcGVsbC1hZmZpeC1jb21tZW50KgpDb21tZW50IGxpbmVzIGluIHRoZSAuYWZmIGZpbGUgc3RhcnQgd2l0aCBhICcjJzoKCgkjIGNvbW1lbnQgbGluZSB+CgpJdGVtcyB3aXRoIGEgZml4ZWQgbnVtYmVyIG9mIGFyZ3VtZW50cyBjYW4gYmUgZm9sbG93ZWQgYnkgYSBjb21tZW50LiAgQnV0IG9ubHkKaWYgbm9uZSBvZiB0aGUgYXJndW1lbnRzIGNhbiBjb250YWluIHdoaXRlIHNwYWNlLiAgVGhlIGNvbW1lbnQgbXVzdCBzdGFydCB3aXRoCmEgIiMiIGNoYXJhY3Rlci4gIEV4YW1wbGU6CgoJS0VFUENBU0UgPSAgIyBmaXggY2FzZSBmb3Igd29yZHMgd2l0aCB0aGlzIGZsYWcgfgoKCkVOQ09ESU5HCQkJCQkJCSpzcGVsbC1TRVQqCgpUaGUgYWZmaXggZmlsZSBjYW4gYmUgaW4gYW55IGVuY29kaW5nIHRoYXQgaXMgc3VwcG9ydGVkIGJ5ICJpY29udiIuICBIb3dldmVyLAppbiBzb21lIGNhc2VzIHRoZSBjdXJyZW50IGxvY2FsZSBzaG91bGQgYWxzbyBiZSBzZXQgcHJvcGVybHkgYXQgdGhlIHRpbWUKfDpta3NwZWxsfCBpcyBpbnZva2VkLiAgQWRkaW5nIEZPTC9MT1cvVVBQIGxpbmVzIHJlbW92ZXMgdGhpcyByZXF1aXJlbWVudAp8c3BlbGwtRk9MfC4KClRoZSBlbmNvZGluZyBzaG91bGQgYmUgc3BlY2lmaWVkIGJlZm9yZSBhbnl0aGluZyB3aGVyZSB0aGUgZW5jb2RpbmcgbWF0dGVycy4KVGhlIGVuY29kaW5nIGFwcGxpZXMgYm90aCB0byB0aGUgYWZmaXggZmlsZSBhbmQgdGhlIGRpY3Rpb25hcnkgZmlsZS4gIEl0IGlzCmRvbmUgd2l0aCBhIFNFVCBsaW5lOgoKCVNFVCB1dGYtOCB+CgpUaGUgZW5jb2RpbmcgY2FuIGJlIGRpZmZlcmVudCBmcm9tIHRoZSB2YWx1ZSBvZiB0aGUgJ2VuY29kaW5nJyBvcHRpb24gYXQgdGhlCnRpbWUgIjpta3NwZWxsIiBpcyB1c2VkLiAgVmltIHdpbGwgdGhlbiBjb252ZXJ0IGV2ZXJ5dGhpbmcgdG8gJ2VuY29kaW5nJyBhbmQKZ2VuZXJhdGUgYSBzcGVsbCBmaWxlIGZvciAnZW5jb2RpbmcnLiAgSWYgc29tZSBvZiB0aGUgdXNlZCBjaGFyYWN0ZXJzIHRvIG5vdApmaXQgaW4gJ2VuY29kaW5nJyB5b3Ugd2lsbCBnZXQgYW4gZXJyb3IgbWVzc2FnZS4KCQkJCQkJCSpzcGVsbC1hZmZpeC1tYnl0ZSoKV2hlbiB1c2luZyBhIG11bHRpLWJ5dGUgZW5jb2RpbmcgaXQncyBwb3NzaWJsZSB0byB1c2UgbW9yZSBkaWZmZXJlbnQgYWZmaXgKZmxhZ3MuICBCdXQgTXlzcGVsbCBkb2Vzbid0IHN1cHBvcnQgdGhhdCwgdGh1cyB5b3UgbWF5IG5vdCB3YW50IHRvIHVzZSBpdAphbnl3YXkuICBGb3IgY29tcGF0aWJpbGl0eSB1c2UgYW4gOC1iaXQgZW5jb2RpbmcuCgoKSU5GT1JNQVRJT04KClRoZXNlIGVudHJpZXMgaW4gdGhlIGFmZml4IGZpbGUgY2FuIGJlIHVzZWQgdG8gYWRkIGluZm9ybWF0aW9uIHRvIHRoZSBzcGVsbApmaWxlLiAgVGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucyBvbiB0aGUgZm9ybWF0LCBidXQgdGhleSBzaG91bGQgYmUgaW4gdGhlCnJpZ2h0IGVuY29kaW5nLgoKCQkJCSpzcGVsbC1OQU1FKiAqc3BlbGwtVkVSU0lPTiogKnNwZWxsLUhPTUUqCgkJCQkqc3BlbGwtQVVUSE9SKiAqc3BlbGwtRU1BSUwqICpzcGVsbC1DT1BZUklHSFQqCglOQU1FCQlOYW1lIG9mIHRoZSBsYW5ndWFnZQoJVkVSU0lPTgkJMS4wLjEgIHdpdGggZml4ZXMKCUhPTUUJCWh0dHA6Ly93d3cubXlob21lLmV1CglBVVRIT1IJCUpvaG4gRG9lCglFTUFJTAkJam9obiBBVCBEb2UgRE9UIG5ldAoJQ09QWVJJR0hUCUxHUEwKClRoZXNlIGZpZWxkcyBhcmUgcHV0IGluIHRoZSAuc3BsIGZpbGUgYXMtaXMuICBUaGUgfDpzcGVsbGluZm98IGNvbW1hbmQgY2FuIGJlCnVzZWQgdG8gdmlldyB0aGUgaW5mby4KCgkJCQkJCQkqOnNwZWxsaW5mbyogKjpzcGVsbGkqCjpzcGVsbGlbbmZvXQkJRGlzcGxheSB0aGUgaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVsbCBmaWxlKHMpIHVzZWQgZm9yCgkJCXRoZSBjdXJyZW50IGJ1ZmZlci4KCgpDSEFSQUNURVIgVEFCTEVTCgkJCQkJCQkqc3BlbGwtYWZmaXgtY2hhcnMqCldoZW4gdXNpbmcgYW4gOC1iaXQgZW5jb2RpbmcgdGhlIGFmZml4IGZpbGUgc2hvdWxkIGRlZmluZSB3aGF0IGNoYXJhY3RlcnMgYXJlCndvcmQgY2hhcmFjdGVycy4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgc3lzdGVtIHdoZXJlICI6bWtzcGVsbCIgaXMgdXNlZCBtYXkgbm90CnN1cHBvcnQgYSBsb2NhbGUgd2l0aCB0aGlzIGVuY29kaW5nIGFuZCBpc2FscGhhKCkgd29uJ3Qgd29yay4gIEZvciBleGFtcGxlCndoZW4gdXNpbmcgImNwMTI1MCIgb24gVW5peC4KCQkJCQkJKkU3NjEqICpFNzYyKiAqc3BlbGwtRk9MKgoJCQkJCQkqc3BlbGwtTE9XKiAqc3BlbGwtVVBQKgpUaHJlZSBsaW5lcyBpbiB0aGUgYWZmaXggZmlsZSBhcmUgbmVlZGVkLiAgU2ltcGxpc3RpYyBleGFtcGxlOgoKCUZPTCAg4evxIH4KCUxPVyAg4evxIH4KCVVQUCAgwcvRIH4KCkFsbCB0aHJlZSBsaW5lcyBtdXN0IGhhdmUgZXhhY3RseSB0aGUgc2FtZSBudW1iZXIgb2YgY2hhcmFjdGVycy4KClRoZSAiRk9MIiBsaW5lIHNwZWNpZmllcyB0aGUgY2FzZS1mb2xkZWQgY2hhcmFjdGVycy4gIFRoZXNlIGFyZSB1c2VkIHRvCmNvbXBhcmUgd29yZHMgd2hpbGUgaWdub3JpbmcgY2FzZS4gIEZvciBtb3N0IGVuY29kaW5ncyB0aGlzIGlzIGlkZW50aWNhbCB0bwp0aGUgbG93ZXIgY2FzZSBsaW5lLgoKVGhlICJMT1ciIGxpbmUgc3BlY2lmaWVzIHRoZSBjaGFyYWN0ZXJzIGluIGxvd2VyLWNhc2UuICBNb3N0bHkgaXQncyBlcXVhbCB0bwp0aGUgIkZPTCIgbGluZS4KClRoZSAiVVBQIiBsaW5lIHNwZWNpZmllcyB0aGUgY2hhcmFjdGVycyB3aXRoIHVwcGVyLWNhc2UuICBUaGF0IGlzLCBhIGNoYXJhY3RlcgppcyB1cHBlci1jYXNlIHdoZXJlIGl0J3MgZGlmZmVyZW50IGZyb20gdGhlIGNoYXJhY3RlciBhdCB0aGUgc2FtZSBwb3NpdGlvbiBpbgoiRk9MIi4KCkFuIGV4Y2VwdGlvbiBpcyBtYWRlIGZvciB0aGUgR2VybWFuIHNoYXJwIHMg3y4gIFRoZSB1cHBlci1jYXNlIHZlcnNpb24gaXMKIlNTIi4gIEluIHRoZSBGT0wvTE9XL1VQUCBsaW5lcyBpdCBzaG91bGQgYmUgaW5jbHVkZWQsIHNvIHRoYXQgaXQncyByZWNvZ25pemVkCmFzIGEgd29yZCBjaGFyYWN0ZXIsIGJ1dCB1c2UgdGhlIN8gY2hhcmFjdGVyIGluIGFsbCB0aHJlZS4KCkFTQ0lJIGNoYXJhY3RlcnMgc2hvdWxkIGJlIG9taXR0ZWQsIFZpbSBhbHdheXMgaGFuZGxlcyB0aGVzZSBpbiB0aGUgc2FtZSB3YXkuCldoZW4gdGhlIGVuY29kaW5nIGlzIFVURi04IG5vIHdvcmQgY2hhcmFjdGVycyBuZWVkIHRvIGJlIHNwZWNpZmllZC4KCgkJCQkJCQkqRTc2MyoKVmltIGFsbG93cyB5b3UgdG8gdXNlIHNwZWxsIGNoZWNraW5nIGZvciBzZXZlcmFsIGxhbmd1YWdlcyBpbiB0aGUgc2FtZSBmaWxlLgpZb3UgY2FuIGxpc3QgdGhlbSBpbiB0aGUgJ3NwZWxsbGFuZycgb3B0aW9uLiAgQXMgYSBjb25zZXF1ZW5jZSBhbGwgc3BlbGwgZmlsZXMKZm9yIHRoZSBzYW1lIGVuY29kaW5nIG11c3QgdXNlIHRoZSBzYW1lIHdvcmQgY2hhcmFjdGVycywgb3RoZXJ3aXNlIHRoZXkgY2FuJ3QKYmUgY29tYmluZWQgd2l0aG91dCBlcnJvcnMuICBJZiB5b3UgZ2V0IGEgd2FybmluZyB0aGF0IHRoZSB3b3JkIHRhYmxlcyBkaWZmZXIKeW91IG1heSBuZWVkIHRvIGdlbmVyYXRlIHRoZSAuc3BsIGZpbGUgYWdhaW4gd2l0aCB8Om1rc3BlbGx8LiAgQ2hlY2sgdGhlIEZPTCwKTE9XIGFuZCBVUFAgbGluZXMgaW4gdGhlIHVzZWQgLmFmZiBmaWxlLgoKVGhlIFhYLmFzY2lpLnNwbCBzcGVsbCBmaWxlIGdlbmVyYXRlZCB3aXRoIHRoZSAiLWFzY2lpIiBhcmd1bWVudCB3aWxsIG5vdApjb250YWluIHRoZSB0YWJsZSB3aXRoIGNoYXJhY3RlcnMsIHNvIHRoYXQgaXQgY2FuIGJlIGNvbWJpbmUgd2l0aCBzcGVsbCBmaWxlcwpmb3IgYW55IGVuY29kaW5nLiAgVGhlIC5hZGQuc3BsIGZpbGVzIGFsc28gZG8gbm90IGNvbnRhaW4gdGhlIHRhYmxlLgoKCk1JRC1XT1JEIENIQVJBQ1RFUlMKCQkJCQkJCSpzcGVsbC1taWR3b3JkKgpTb21lIGNoYXJhY3RlcnMgYXJlIG9ubHkgdG8gYmUgY29uc2lkZXJlZCB3b3JkIGNoYXJhY3RlcnMgaWYgdGhleSBhcmUgdXNlZCBpbgpiZXR3ZWVuIHR3byBvcmRpbmFyeSB3b3JkIGNoYXJhY3RlcnMuICBBbiBleGFtcGxlIGlzIHRoZSBzaW5nbGUgcXVvdGU6IEl0IGlzCm9mdGVuIHVzZWQgdG8gcHV0IHRleHQgaW4gcXVvdGVzLCB0aHVzIGl0IGNhbid0IGJlIHJlY29nbml6ZWQgYXMgYSB3b3JkCmNoYXJhY3RlciwgYnV0IHdoZW4gaXQgYXBwZWFycyBpbiBiZXR3ZWVuIHdvcmQgY2hhcmFjdGVycyBpdCBtdXN0IGJlIHBhcnQgb2YKdGhlIHdvcmQuICBUaGlzIGlzIG5lZWRlZCB0byBkZXRlY3QgYSBzcGVsbGluZyBlcnJvciBzdWNoIGFzIHRoZXknYXJlLiAgVGhhdApzaG91bGQgYmUgdGhleSdyZSwgYnV0IHNpbmNlICJ0aGV5IiBhbmQgImFyZSIgYXJlIHdvcmRzIHRoZW1zZWx2ZXMgdGhhdCB3b3VsZApnbyB1bm5vdGljZWQuCgpUaGVzZSBjaGFyYWN0ZXJzIGFyZSBkZWZpbmVkIHdpdGggTUlEV09SRCBpbiB0aGUgLmFmZiBmaWxlLiAgRXhhbXBsZToKCglNSURXT1JECSctIH4KCgpGTEFHIFRZUEVTCQkJCQkJKnNwZWxsLUZMQUcqCgpGbGFncyBhcmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBhZmZpeGVzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCBhIHdvcmQgYW5kIGZvcgpvdGhlciBwcm9wZXJ0aWVzIG9mIHRoZSB3b3JkLiAgTm9ybWFsbHkgc2luZ2xlLWNoYXJhY3RlciBmbGFncyBhcmUgdXNlZC4gIFRoaXMKbGltaXRzIHRoZSBudW1iZXIgb2YgcG9zc2libGUgZmxhZ3MsIGVzcGVjaWFsbHkgZm9yIDgtYml0IGVuY29kaW5ncy4gIFRoZSBGTEFHCml0ZW0gY2FuIGJlIHVzZWQgaWYgbW9yZSBhZmZpeGVzIGFyZSB0byBiZSB1c2VkLiAgUG9zc2libGUgdmFsdWVzOgoKCUZMQUcgbG9uZwl1c2UgdHdvLWNoYXJhY3RlciBmbGFncwoJRkxBRyBudW0JdXNlIG51bWJlcnMsIGZyb20gMSB1cCB0byA2NTAwMAoJRkxBRyBjYXBsb25nCXVzZSBvbmUtY2hhcmFjdGVyIGZsYWdzIHdpdGhvdXQgQS1aIGFuZCB0d28tY2hhcmFjdGVyCgkJCWZsYWdzIHRoYXQgc3RhcnQgd2l0aCBBLVoKCldpdGggIkZMQUcgbnVtIiB0aGUgbnVtYmVycyBpbiBhIGxpc3Qgb2YgYWZmaXhlcyBuZWVkIHRvIGJlIHNlcGFyYXRlZCB3aXRoIGEKY29tbWE6ICIyMzQsMjE0MywxNDM1Ii4gIFRoaXMgbWV0aG9kIGlzIGluZWZmaWNpZW50LCBidXQgdXNlZnVsIGlmIHRoZSBmaWxlIGlzCmdlbmVyYXRlZCB3aXRoIGEgcHJvZ3JhbS4KCldoZW4gdXNpbmcgImNhcGxvbmciIHRoZSB0d28tY2hhcmFjdGVyIGZsYWdzIGFsbCBzdGFydCB3aXRoIGEgY2FwaXRhbDogIkFhIiwKIkIxIiwgIkJCIiwgZXRjLiAgVGhpcyBpcyB1c2VmdWwgdG8gdXNlIG9uZS1jaGFyYWN0ZXIgZmxhZ3MgZm9yIHRoZSBtb3N0CmNvbW1vbiBpdGVtcyBhbmQgdHdvLWNoYXJhY3RlciBmbGFncyBmb3IgdW5jb21tb24gaXRlbXMuCgpOb3RlOiBXaGVuIHVzaW5nIHV0Zi04IG9ubHkgY2hhcmFjdGVycyB1cCB0byA2NTAwMCBtYXkgYmUgdXNlZCBmb3IgZmxhZ3MuCgpOb3RlOiBldmVuIHdoZW4gdXNpbmcgIm51bSIgb3IgImxvbmciIHRoZSBudW1iZXIgb2YgZmxhZ3MgYXZhaWxhYmxlIHRvCmNvbXBvdW5kaW5nIGFuZCBwcmVmaXhlcyBpcyBsaW1pdGVkIHRvIGFib3V0IDI1MC4KCgpBRkZJWEVTCgkJCQkJICAgICpzcGVsbC1QRlgqICpzcGVsbC1TRlgqClRoZSB1c3VhbCBQRlggKHByZWZpeCkgYW5kIFNGWCAoc3VmZml4KSBsaW5lcyBhcmUgc3VwcG9ydGVkIChzZWUgdGhlIE15c3BlbGwKZG9jdW1lbnRhdGlvbiBvciB0aGUgQXNwZWxsIG1hbnVhbDoKaHR0cDovL2FzcGVsbC5uZXQvbWFuLWh0bWwvQWZmaXgtQ29tcHJlc3Npb24uaHRtbCkuCgpTdW1tYXJ5OgoJU0ZYIEwgWSAyIH4KCVNGWCBMIDAgcmUgW154XSB+CglTRlggTCAwIHJvIHggfgoKVGhlIGZpcnN0IGxpbmUgaXMgYSBoZWFkZXIgYW5kIGhhcyBmb3VyIGZpZWxkczoKCVNGWCB7ZmxhZ30ge2NvbWJpbmV9IHtjb3VudH0KCntmbGFnfQkJVGhlIG5hbWUgdXNlZCBmb3IgdGhlIHN1ZmZpeC4gIE1vc3RseSBpdCdzIGEgc2luZ2xlIGxldHRlciwKCQlidXQgb3RoZXIgY2hhcmFjdGVycyBjYW4gYmUgdXNlZCwgc2VlIHxzcGVsbC1GTEFHfC4KCntjb21iaW5lfQlDYW4gYmUgJ1knIG9yICdOJy4gIFdoZW4gJ1knIHRoZW4gdGhlIHdvcmQgcGx1cyBzdWZmaXggY2FuCgkJYWxzbyBoYXZlIGEgcHJlZml4LiAgV2hlbiAnTicgdGhlbiBhIHByZWZpeCBpcyBub3QgYWxsb3dlZC4KCntjb3VudH0JCVRoZSBudW1iZXIgb2YgbGluZXMgZm9sbG93aW5nLiAgSWYgdGhpcyBpcyB3cm9uZyB5b3Ugd2lsbCBnZXQKCQlhbiBlcnJvciBtZXNzYWdlLgoKRm9yIFBGWCB0aGUgZmllbGRzIGFyZSBleGFjdGx5IHRoZSBzYW1lLgoKVGhlIGJhc2ljIGZvcm1hdCBmb3IgdGhlIGZvbGxvd2luZyBsaW5lcyBpczoKCVNGWCB7ZmxhZ30ge3N0cmlwfSB7YWRkfSB7Y29uZGl0aW9ufSB7ZXh0cmF9Cgp7ZmxhZ30JCU11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIHtmbGFnfSB1c2VkIGluIHRoZSBmaXJzdCBsaW5lLgoKe3N0cmlwfQkJQ2hhcmFjdGVycyByZW1vdmVkIGZyb20gdGhlIGJhc2ljIHdvcmQuICBUaGVyZSBpcyBubyBjaGVjayBpZgoJCXRoZSBjaGFyYWN0ZXJzIGFyZSBhY3R1YWxseSB0aGVyZSwgb25seSB0aGUgbGVuZ3RoIGlzIHVzZWQgKGluCgkJYnl0ZXMpLiAgVGhpcyBiZXR0ZXIgbWF0Y2ggdGhlIHtjb25kaXRpb259LCBvdGhlcndpc2Ugc3RyYW5nZQoJCXRoaW5ncyBtYXkgaGFwcGVuLiAgSWYgdGhlIHtzdHJpcH0gbGVuZ3RoIGlzIGVxdWFsIHRvIG9yCgkJbG9uZ2VyIHRoYW4gdGhlIGJhc2ljIHdvcmQgdGhlIHN1ZmZpeCB3b24ndCBiZSB1c2VkLgoJCVdoZW4ge3N0cmlwfSBpcyAwICh6ZXJvKSB0aGVuIG5vdGhpbmcgaXMgc3RyaXBwZWQuCgp7YWRkfQkJQ2hhcmFjdGVycyBhZGRlZCB0byB0aGUgYmFzaWMgd29yZCwgYWZ0ZXIgcmVtb3Zpbmcge3N0cmlwfS4KCQlPcHRpb25hbGx5IHRoZXJlIGlzIGEgJy8nIGZvbGxvd2VkIGJ5IGZsYWdzLiAgVGhlIGZsYWdzIGFwcGx5CgkJdG8gdGhlIHdvcmQgcGx1cyBhZmZpeC4gIFNlZSB8c3BlbGwtYWZmaXgtZmxhZ3N8Cgp7Y29uZGl0aW9ufQlBIHNpbXBsaXN0aWMgcGF0dGVybi4gIE9ubHkgd2hlbiB0aGlzIG1hdGNoZXMgd2l0aCBhIGJhc2ljCgkJd29yZCB3aWxsIHRoZSBzdWZmaXggYmUgdXNlZCBmb3IgdGhhdCB3b3JkLiAgVGhpcyBpcyBub3JtYWxseQoJCWZvciB1c2luZyBvbmUgc3VmZml4IGxldHRlciB3aXRoIGRpZmZlcmVudCB7YWRkfSBhbmQge3N0cmlwfQoJCWZpZWxkcyBmb3Igd29yZHMgd2l0aCBkaWZmZXJlbnQgZW5kaW5ncy4KCQlXaGVuIHtjb25kaXRpb259IGlzIGEgLiAoZG90KSB0aGVyZSBpcyBubyBjb25kaXRpb24uCgkJVGhlIHBhdHRlcm4gbWF5IGNvbnRhaW46CgkJLSBMaXRlcmFsIGNoYXJhY3RlcnMuCgkJLSBBIHNldCBvZiBjaGFyYWN0ZXJzIGluIFtdLiBbYWJjXSBtYXRjaGVzIGEsIGIgYW5kIGMuCgkJICBBIGRhc2ggaXMgYWxsb3dlZCBmb3IgYSByYW5nZSBbYS1jXSwgYnV0IHRoaXMgaXMKCQkgIFZpbS1zcGVjaWZpYy4KCQktIEEgc2V0IG9mIGNoYXJhY3RlcnMgdGhhdCBzdGFydHMgd2l0aCBhIF4sIG1lYW5pbmcgdGhlCgkJICBjb21wbGVtZW50IG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVycy4gW15hYmNdIG1hdGNoZXMgYW55CgkJICBjaGFyYWN0ZXIgYnV0IGEsIGIgYW5kIGMuCgp7ZXh0cmF9CQlPcHRpb25hbCBleHRyYSB0ZXh0OgoJCSAgICAjIGNvbW1lbnQJCUNvbW1lbnQgaXMgaWdub3JlZAoJCSAgICAtCQkJSHVuc3BlbGwgdXNlcyB0aGlzLCBpZ25vcmVkCgpGb3IgUEZYIHRoZSBmaWVsZHMgYXJlIHRoZSBzYW1lLCBidXQgdGhlIHtzdHJpcH0sIHthZGR9IGFuZCB7Y29uZGl0aW9ufSBhcHBseQp0byB0aGUgc3RhcnQgb2YgdGhlIHdvcmQuCgpOb3RlOiBNeXNwZWxsIGlnbm9yZXMgYW55IGV4dHJhIHRleHQgYWZ0ZXIgdGhlIHJlbGV2YW50IGluZm8uICBWaW0gcmVxdWlyZXMKdGhpcyB0ZXh0IHRvIHN0YXJ0IHdpdGggYSAiIyIgc28gdGhhdCBtaXN0YWtlcyBkb24ndCBnbyB1bm5vdGljZWQuICBFeGFtcGxlOgoKCVNGWCBGIDAgaW4gICBbXmldbiAgICAgICMgU3Bpb24gPiBTcGlvbmluICB+CglTRlggRiAwIG5lbiAgaW4JCSMgQmF1ZXJpbiA+IEJhdWVyaW5uZW4gfgoKQXBwYXJlbnRseSBNeXNwZWxsIGFsbG93cyBhbiBhZmZpeCBuYW1lIHRvIGFwcGVhciBtb3JlIHRoYW4gb25jZS4gIFNpbmNlIHRoaXMKbWlnaHQgYWxzbyBiZSBhIG1pc3Rha2UsIFZpbSBjaGVja3MgZm9yIGFuIGV4dHJhICJTIi4gIFRoZSBhZmZpeCBmaWxlcyBmb3IKTXlzcGVsbCB0aGF0IHVzZSB0aGlzIGZlYXR1cmUgYXBwYXJlbnRseSBoYXZlIHRoaXMgZmxhZy4gIEV4YW1wbGU6CgoJU0ZYIGEgWSAxIFMgfgoJU0ZYIGEgMCBhbiAuIH4KCglTRlggYSBZIDIgUyB+CglTRlggYSAwIGVuIC4gfgoJU0ZYIGEgMCBvbiAuIH4KCgpBRkZJWCBGTEFHUwkJCQkJCSpzcGVsbC1hZmZpeC1mbGFncyoKClRoaXMgaXMgYSBmZWF0dXJlIHRoYXQgY29tZXMgZnJvbSBIdW5zcGVsbDogVGhlIGFmZml4IG1heSBzcGVjaWZ5IGZsYWdzLiAgVGhpcwp3b3JrcyBzaW1pbGFyIHRvIGZsYWdzIHNwZWNpZmllZCBvbiBhIGJhc2ljIHdvcmQuICBUaGUgZmxhZ3MgYXBwbHkgdG8gdGhlCmJhc2ljIHdvcmQgcGx1cyB0aGUgYWZmaXggKGJ1dCB0aGVyZSBhcmUgcmVzdHJpY3Rpb25zKS4gIEV4YW1wbGU6CgoJU0ZYIFMgWSAxIH4KCVNGWCBTIDAgcyAuIH4KCglTRlggQSBZIDEgfgoJU0ZYIEEgMCBhYmxlL1MgLiB+CgpXaGVuIHRoZSBkaWN0aW9uYXJ5IGZpbGUgY29udGFpbnMgImRyaW5rL0FTIiB0aGVuIHRoZXNlIHdvcmRzIGFyZSBwb3NzaWJsZToKCglkcmluawoJZHJpbmtzCQl1c2VzIFMgc3VmZml4Cglkcmlua2FibGUJdXNlcyBBIHN1ZmZpeAoJZHJpbmthYmxlcwl1c2VzIEEgc3VmZml4IGFuZCB0aGVuIFMgc3VmZml4CgpHZW5lcmFsbHkgdGhlIGZsYWdzIG9mIHRoZSBzdWZmaXggYXJlIGFkZGVkIHRvIHRoZSBmbGFncyBvZiB0aGUgYmFzaWMgd29yZCwKYm90aCBhcmUgdXNlZCBmb3IgdGhlIHdvcmQgcGx1cyBzdWZmaXguICBCdXQgdGhlIGZsYWdzIG9mIHRoZSBiYXNpYyB3b3JkIGFyZQpvbmx5IHVzZWQgb25jZSBmb3IgYWZmaXhlcywgZXhjZXB0IHRoYXQgYm90aCBvbmUgcHJlZml4IGFuZCBvbmUgc3VmZml4IGNhbiBiZQp1c2VkIHdoZW4gYm90aCBzdXBwb3J0IGNvbWJpbmluZy4KClNwZWNpZmljYWxseSwgdGhlIGFmZml4IGZsYWdzIGNhbiBiZSB1c2VkIGZvcjoKLSBTdWZmaXhlcyBvbiBzdWZmaXhlcywgYXMgaW4gdGhlIGV4YW1wbGUgYWJvdmUuICBUaGlzIHdvcmtzIG9uY2UsIHRodXMgeW91CiAgY2FuIGhhdmUgdHdvIHN1ZmZpeGVzIG9uIGEgd29yZCAocGx1cyBvbmUgcHJlZml4KS4KLSBNYWtpbmcgdGhlIHdvcmQgd2l0aCB0aGUgYWZmaXggcmFyZSwgYnkgdXNpbmcgdGhlIHxzcGVsbC1SQVJFfCBmbGFnLgotIEV4Y2x1ZGUgdGhlIHdvcmQgd2l0aCB0aGUgYWZmaXggZnJvbSBjb21wb3VuZGluZywgYnkgdXNpbmcgdGhlCiAgfHNwZWxsLUNPTVBPVU5ERk9SQklERkxBR3wgZmxhZy4KLSBBbGxvdyB0aGUgd29yZCB3aXRoIHRoZSBhZmZpeCB0byBiZSBwYXJ0IG9mIGEgY29tcG91bmQgd29yZCBvbiB0aGUgc2lkZSBvZgogIHRoZSBhZmZpeCB3aXRoIHRoZSB8c3BlbGwtQ09NUE9VTkRQRVJNSVRGTEFHfC4KLSBVc2UgdGhlIE5FRURDT01QT1VORCBmbGFnOiB3b3JkIHBsdXMgYWZmaXggY2FuIG9ubHkgYmUgdXNlZCBhcyBwYXJ0IG9mIGEKICBjb21wb3VuZCB3b3JkLiB8c3BlbGwtTkVFRENPTVBPVU5EfAotIENvbXBvdW5kIGZsYWdzOiB3b3JkIHBsdXMgYWZmaXggY2FuIGJlIHBhcnQgb2YgYSBjb21wb3VuZCB3b3JkIGF0IHRoZSBlbmQsCiAgbWlkZGxlLCBzdGFydCwgZXRjLiAgVGhlIGZsYWdzIGFyZSBjb21iaW5lZCB3aXRoIHRoZSBmbGFncyBvZiB0aGUgYmFzaWMKICB3b3JkLiAgfHNwZWxsLWNvbXBvdW5kfAotIE5FRURBRkZJWDogYW5vdGhlciBhZmZpeCBpcyBuZWVkZWQgdG8gbWFrZSBhIHZhbGlkIHdvcmQuCi0gQ0lSQ1VNRklYLCBhcyBleHBsYWluZWQganVzdCBiZWxvdy4KCgpDSVJDVU1GSVgJCQkJCQkqc3BlbGwtQ0lSQ1VNRklYKgoKVGhlIENJUkNVTUZJWCBmbGFnIG1lYW5zIGEgcHJlZml4IGFuZCBzdWZmaXggbXVzdCBiZSBhZGRlZCBhdCB0aGUgc2FtZSB0aW1lLgpJZiBhIHByZWZpeCBoYXMgdGhlIENJUkNVTUZJWCBmbGFnIHRoYW4gb25seSBzdWZmaXhlcyB3aXRoIHRoZSBDSVJDVU1GSVggZmxhZwpjYW4gYmUgYWRkZWQsIGFuZCB0aGUgb3RoZXIgd2F5IGFyb3VuZC4KQW4gYWx0ZXJuYXRpdmUgaXMgdG8gb25seSBzcGVjaWZ5IHRoZSBzdWZmaXgsIGFuZCBnaXZlIHRoZSB0aGF0IHN1ZmZpeCB0d28KZmxhZ3M6IFRoZSByZXF1aXJlZCBwcmVmaXggYW5kIHRoZSBORUVEQUZGSVggZmxhZy4gIHxzcGVsbC1ORUVEQUZGSVh8CgoKUEZYUE9TVFBPTkUJCQkJCQkqc3BlbGwtUEZYUE9TVFBPTkUqCgpXaGVuIGFuIGFmZml4IGZpbGUgaGFzIHZlcnkgbWFueSBwcmVmaXhlcyB0aGF0IGFwcGx5IHRvIG1hbnkgd29yZHMgaXQncyBub3QKcG9zc2libGUgdG8gYnVpbGQgdGhlIHdob2xlIHdvcmQgbGlzdCBpbiBtZW1vcnkuICBUaGlzIGFwcGxpZXMgdG8gSGVicmV3IChhCmxpc3Qgd2l0aCBhbGwgd29yZHMgaXMgb3ZlciBhIEdieXRlKS4gIEluIHRoYXQgY2FzZSBhcHBseWluZyBwcmVmaXhlcyBtdXN0IGJlCnBvc3Rwb25lZC4gIFRoaXMgbWFrZXMgc3BlbGwgY2hlY2tpbmcgc2xvd2VyLiAgSXQgaXMgaW5kaWNhdGVkIGJ5IHRoaXMga2V5d29yZAppbiB0aGUgLmFmZiBmaWxlOgoKCVBGWFBPU1RQT05FIH4KCk9ubHkgcHJlZml4ZXMgd2l0aG91dCBhIGNob3Agc3RyaW5nIGFuZCB3aXRob3V0IGZsYWdzIGNhbiBiZSBwb3N0cG9uZWQuClByZWZpeGVzIHdpdGggYSBjaG9wIHN0cmluZyBvciB3aXRoIGZsYWdzIHdpbGwgc3RpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHdvcmQKbGlzdC4gIEFuIGV4Y2VwdGlvbiBpZiB0aGUgY2hvcCBzdHJpbmcgaXMgb25lIGNoYXJhY3RlciBhbmQgZXF1YWwgdG8gdGhlIGxhc3QKY2hhcmFjdGVyIG9mIHRoZSBhZGRlZCBzdHJpbmcsIGJ1dCBpbiBsb3dlciBjYXNlLiAgVGh1cyB3aGVuIHRoZSBjaG9wIHN0cmluZwppcyB1c2VkIHRvIGFsbG93IHRoZSBmb2xsb3dpbmcgd29yZCB0byBzdGFydCB3aXRoIGFuIHVwcGVyIGNhc2UgbGV0dGVyLgoKCldPUkRTIFdJVEggQSBTTEFTSAkJCQkJKnNwZWxsLVNMQVNIKgoKVGhlIHNsYXNoIGlzIHVzZWQgaW4gdGhlIC5kaWMgZmlsZSB0byBzZXBhcmF0ZSB0aGUgYmFzaWMgd29yZCBmcm9tIHRoZSBhZmZpeApsZXR0ZXJzIGFuZCBvdGhlciBmbGFncy4gIFVuZm9ydHVuYXRlbHksIHRoaXMgbWVhbnMgeW91IGNhbm5vdCB1c2UgYSBzbGFzaCBpbgphIHdvcmQuICBUaHVzICJUQ1AvSVAiIGlzIG5vdCBhIHdvcmQgYnV0ICJUQ1Agd2l0aCB0aGUgZmxhZ3MgIklQIi4gIFRvIGluY2x1ZGUKYSBzbGFzaCBpbiB0aGUgd29yZCBwdXQgYSBiYWNrc2xhc2ggYmVmb3JlIGl0OiAiVENQXC9JUCIuICBJbiB0aGUgcmFyZSBjYXNlCnlvdSB3YW50IHRvIHVzZSBhIGJhY2tzbGFzaCBpbnNpZGUgYSB3b3JkIHlvdSBuZWVkIHRvIHVzZSB0d28gYmFja3NsYXNoZXMuCkFueSBvdGhlciB1c2Ugb2YgdGhlIGJhY2tzbGFzaCBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIGV4cGFuc2lvbi4KCgpLRUVQLUNBU0UgV09SRFMJCQkJCQkqc3BlbGwtS0VFUENBU0UqCgpJbiB0aGUgYWZmaXggZmlsZSBhIEtFRVBDQVNFIGxpbmUgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIHRoZSBhZmZpeCBuYW1lIHVzZWQKZm9yIGtlZXAtY2FzZSB3b3Jkcy4gIEV4YW1wbGU6CgoJS0VFUENBU0UgPSB+CgpUaGlzIGZsYWcgaXMgbm90IHN1cHBvcnRlZCBieSBNeXNwZWxsLiAgSXQgaGFzIHRoZSBtZWFuaW5nIHRoYXQgY2FzZSBtYXR0ZXJzLgpUaGlzIGNhbiBiZSB1c2VkIGlmIHRoZSB3b3JkIGRvZXMgbm90IGhhdmUgdGhlIGZpcnN0IGxldHRlciBpbiB1cHBlciBjYXNlIGF0CnRoZSBzdGFydCBvZiBhIHNlbnRlbmNlLiAgRXhhbXBsZToKCiAgICB3b3JkIGxpc3QJICAgIG1hdGNoZXMJCSAgICBkb2VzIG5vdCBtYXRjaCB+CiAgICAncyBtb3JnZW5zLz0gICAgJ3MgbW9yZ2VucwkJICAgICdTIG1vcmdlbnMgJ3MgTW9yZ2VucyAnUyBNT1JHRU5TCiAgICAncyBNb3JnZW5zCSAgICAncyBNb3JnZW5zICdTIE1PUkdFTlMgICAnUyBtb3JnZW5zICdzIG1vcmdlbnMKClRoZSBmbGFnIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXZvaWQgdGhhdCB0aGUgd29yZCBtYXRjaGVzIHdoZW4gaXQgaXMgaW4gYWxsCnVwcGVyLWNhc2UgbGV0dGVycy4KCgpSQVJFIFdPUkRTCQkJCQkJKnNwZWxsLVJBUkUqCgpJbiB0aGUgYWZmaXggZmlsZSBhIFJBUkUgbGluZSBjYW4gYmUgdXNlZCB0byBkZWZpbmUgdGhlIGFmZml4IG5hbWUgdXNlZCBmb3IKcmFyZSB3b3Jkcy4gIEV4YW1wbGU6CgoJUkFSRSA/IH4KClJhcmUgd29yZHMgYXJlIGhpZ2hsaWdodGVkIGRpZmZlcmVudGx5IGZyb20gYmFkIHdvcmRzLiAgVGhpcyBpcyB0byBiZSB1c2VkIGZvcgp3b3JkcyB0aGF0IGFyZSBjb3JyZWN0IGZvciB0aGUgbGFuZ3VhZ2UsIGJ1dCBhcmUgaGFyZGx5IGV2ZXIgdXNlZCBhbmQgY291bGQgYmUKYSB0eXBpbmcgbWlzdGFrZSBhbnl3YXkuICBXaGVuIHRoZSBzYW1lIHdvcmQgaXMgZm91bmQgYXMgZ29vZCBpdCB3b24ndCBiZQpoaWdobGlnaHRlZCBhcyByYXJlLgoKVGhpcyBmbGFnIGNhbiBhbHNvIGJlIHVzZWQgb24gYW4gYWZmaXgsIHNvIHRoYXQgYSBiYXNpYyB3b3JkIGlzIG5vdCByYXJlIGJ1dAp0aGUgYmFzaWMgd29yZCBwbHVzIGFmZml4IGlzIHJhcmUgfHNwZWxsLWFmZml4LWZsYWdzfC4gIEhvd2V2ZXIsIGlmIHRoZSB3b3JkCmFsc28gYXBwZWFycyBhcyBhIGdvb2Qgd29yZCBpbiBhbm90aGVyIHdheSAoZS5nLiwgaW4gYW5vdGhlciByZWdpb24pIGl0IHdvbid0CmJlIG1hcmtlZCBhcyByYXJlLgoKCkJBRCBXT1JEUwkJCQkJCSpzcGVsbC1CQUQqCgpJbiB0aGUgYWZmaXggZmlsZSBhIEJBRCBsaW5lIGNhbiBiZSB1c2VkIHRvIGRlZmluZSB0aGUgYWZmaXggbmFtZSB1c2VkIGZvcgpiYWQgd29yZHMuICBFeGFtcGxlOgoKCUJBRCAhIH4KClRoaXMgY2FuIGJlIHVzZWQgdG8gZXhjbHVkZSB3b3JkcyB0aGF0IHdvdWxkIG90aGVyd2lzZSBiZSBnb29kLiAgRm9yIGV4YW1wbGUKInRoZSB0aGUiIGluIHRoZSAuZGljIGZpbGU6CgoJdGhlIHRoZS8hIH4KCk9uY2UgYSB3b3JkIGhhcyBiZWVuIG1hcmtlZCBhcyBiYWQgaXQgd29uJ3QgYmUgdW5kb25lIGJ5IGVuY291bnRlcmluZyB0aGUgc2FtZQp3b3JkIGFzIGdvb2QuCgpUaGUgZmxhZyBhbHNvIGFwcGxpZXMgdG8gdGhlIHdvcmQgd2l0aCBhZmZpeGVzLCB0aHVzIHRoaXMgY2FuIGJlIHVzZWQgdG8gbWFyawphIHdob2xlIGJ1bmNoIG9mIHJlbGF0ZWQgd29yZHMgYXMgYmFkLgoKCQkJCQkJCSpzcGVsbC1GT1JCSURERU5XT1JEKgpGT1JCSURERU5XT1JEIGNhbiBiZSB1c2VkIGp1c3QgbGlrZSBCQUQuICBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIEh1bnNwZWxsLgoKCQkJCQkJCSpzcGVsbC1ORUVEQUZGSVgqClRoZSBORUVEQUZGSVggZmxhZyBpcyB1c2VkIHRvIHJlcXVpcmUgdGhhdCBhIHdvcmQgaXMgdXNlZCB3aXRoIGFuIGFmZml4LiAgVGhlCndvcmQgaXRzZWxmIGlzIG5vdCBhIGdvb2Qgd29yZCAodW5sZXNzIHRoZXJlIGlzIGFuIGVtcHR5IGFmZml4KS4gIEV4YW1wbGU6CgoJTkVFREFGRklYICsgfgoKCkNPTVBPVU5EIFdPUkRTCQkJCQkJKnNwZWxsLWNvbXBvdW5kKgoKQSBjb21wb3VuZCB3b3JkIGlzIGEgbG9uZ2VyIHdvcmQgbWFkZSBieSBjb25jYXRlbmF0aW5nIHdvcmRzIHRoYXQgYXBwZWFyIGluCnRoZSAuZGljIGZpbGUuICBUbyBzcGVjaWZ5IHdoaWNoIHdvcmRzIG1heSBiZSBjb25jYXRlbmF0ZWQgYSBjaGFyYWN0ZXIgaXMKdXNlZC4gIFRoaXMgY2hhcmFjdGVyIGlzIHB1dCBpbiB0aGUgbGlzdCBvZiBhZmZpeGVzIGFmdGVyIHRoZSB3b3JkLiAgV2Ugd2lsbApjYWxsIHRoaXMgY2hhcmFjdGVyIGEgZmxhZyBoZXJlLiAgT2J2aW91c2x5IHRoZXNlIGZsYWdzIG11c3QgYmUgZGlmZmVyZW50IGZyb20KYW55IGFmZml4IElEcyB1c2VkLgoKCQkJCQkJCSpzcGVsbC1DT01QT1VOREZMQUcqClRoZSBNeXNwZWxsIGNvbXBhdGlibGUgbWV0aG9kIHVzZXMgb25lIGZsYWcsIHNwZWNpZmllZCB3aXRoIENPTVBPVU5ERkxBRy4gIEFsbAp3b3JkcyB3aXRoIHRoaXMgZmxhZyBjb21iaW5lIGluIGFueSBvcmRlci4gIFRoaXMgbWVhbnMgdGhlcmUgaXMgbm8gY29udHJvbApvdmVyIHdoaWNoIHdvcmQgY29tZXMgZmlyc3QuICBFeGFtcGxlOgoJQ09NUE9VTkRGTEFHIGMgfgoKCQkJCQkJCSpzcGVsbC1DT01QT1VORFJVTEUqCkEgbW9yZSBhZHZhbmNlZCBtZXRob2QgdG8gc3BlY2lmeSBob3cgY29tcG91bmQgd29yZHMgY2FuIGJlIGZvcm1lZCB1c2VzCm11bHRpcGxlIGl0ZW1zIHdpdGggbXVsdGlwbGUgZmxhZ3MuICBUaGlzIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggTXlzcGVsbCAzLjAuCkxldCdzIHN0YXJ0IHdpdGggYW4gZXhhbXBsZToKCUNPTVBPVU5EUlVMRSBjKyB+CglDT01QT1VORFJVTEUgc2UgfgoKVGhlIGZpcnN0IGxpbmUgZGVmaW5lcyB0aGF0IHdvcmRzIHdpdGggdGhlICJjIiBmbGFnIGNhbiBiZSBjb25jYXRlbmF0ZWQgaW4gYW55Cm9yZGVyLiAgVGhlIHNlY29uZCBsaW5lIGRlZmluZXMgY29tcG91bmQgd29yZHMgdGhhdCBhcmUgbWFkZSBvZiBvbmUgd29yZCB3aXRoCnRoZSAicyIgZmxhZyBhbmQgb25lIHdvcmQgd2l0aCB0aGUgImUiIGZsYWcuICBXaXRoIHRoaXMgZGljdGlvbmFyeToKCWJvcmsvYyB+Cglvbmlvbi9zIH4KCXNvdXAvZSB+CgpZb3UgY2FuIG1ha2UgdGhlc2Ugd29yZHM6Cglib3JrCglib3JrYm9yawoJYm9ya2Jvcmtib3JrCgkoZXRjLikKCW9uaW9uCglzb3VwCglvbmlvbnNvdXAKClRoZSBDT01QT1VORFJVTEUgaXRlbSBtYXkgYXBwZWFyIG11bHRpcGxlIHRpbWVzLiAgVGhlIGFyZ3VtZW50IGlzIG1hZGUgb3V0IG9mCm9uZSBvciBtb3JlIGdyb3Vwcywgd2hlcmUgZWFjaCBncm91cCBjYW4gYmU6CglvbmUgZmxhZwkJCWUuZy4sIGMKCWFsdGVybmF0ZSBmbGFncyBpbnNpZGUgW10JZS5nLiwgW2FiY10KT3B0aW9uYWxseSB0aGlzIG1heSBiZSBmb2xsb3dlZCBieToKCSoJdGhlIGdyb3VwIGFwcGVhcnMgemVybyBvciBtb3JlIHRpbWVzLCBlLmcuLCBzbSplCgkrCXRoZSBncm91cCBhcHBlYXJzIG9uZSBvciBtb3JlIHRpbWVzLCBlLmcuLCBjKwoJPwl0aGUgZ3JvdXAgYXBwZWFycyB6ZXJvIHRpbWVzIG9yIG9uY2UsIGUuZy4sIHg/CgpUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIHJlZ2V4cCBwYXR0ZXJuIHN5bnRheCAoYnV0IG5vdCB0aGUgc2FtZSEpLiAgQSBmZXcKZXhhbXBsZXMgd2l0aCB0aGUgc2VxdWVuY2Ugb2Ygd29yZCBmbGFncyB0aGV5IHJlcXVpcmU6CiAgICBDT01QT1VORFJVTEUgeCsJICAgIHggeHggeHh4IGV0Yy4KICAgIENPTVBPVU5EUlVMRSB5egkgICAgeXoKICAgIENPTVBPVU5EUlVMRSB4K3oJICAgIHh6IHh4eiB4eHh6IGV0Yy4KICAgIENPTVBPVU5EUlVMRSB5eCsJICAgIHl4IHl4eCB5eHh4IGV0Yy4KICAgIENPTVBPVU5EUlVMRSB4eT96CSAgICB4eiB4eXoKCiAgICBDT01QT1VORFJVTEUgW2FiY116ICAgIGF6IGJ6IGN6CiAgICBDT01QT1VORFJVTEUgW2FiY10reiAgIGF6IGFheiBhYmF6IGJ6IGJheiBiY2J6IGN6IGNheiBjYmF6IGV0Yy4KICAgIENPTVBPVU5EUlVMRSBhW3h5el0rICAgYXggYXh4IGF4eXogYXkgYXl4IGF5enogYXogYXp5IGF6eHkgZXRjLgogICAgQ09NUE9VTkRSVUxFIHNtKmUJICAgIHNlIHNtZSBzbW1lIHNtbW1lIGV0Yy4KICAgIENPTVBPVU5EUlVMRSBzW3h5el0qZSAgc2Ugc3hlIHN4eWUgc3h5eGUgc3llIHN5emUgc3plIHN6eWUgc3p5eGUgIGV0Yy4KCkEgc3BlY2lmaWMgZXhhbXBsZTogQWxsb3cgYSBjb21wb3VuZCB0byBiZSBtYWRlIG9mIHR3byB3b3JkcyBhbmQgYSBkYXNoOgoJSW4gdGhlIC5hZmYgZmlsZToKCSAgICBDT01QT1VORFJVTEUgc2RlIH4KCSAgICBORUVEQUZGSVggeCB+CgkgICAgQ09NUE9VTkRXT1JETUFYIDMgfgoJICAgIENPTVBPVU5ETUlOIDEgfgoJSW4gdGhlIC5kaWMgZmlsZToKCSAgICBzdGFydC9zIH4KCSAgICBlbmQvZSB+CgkgICAgLS94ZCB+CgpUaGlzIGFsbG93cyBmb3IgdGhlIHdvcmQgInN0YXJ0LWVuZCIsIGJ1dCBub3QgInN0YXJ0ZW5kIi4KCkFuIGFkZGl0aW9uYWwgaW1wbGllZCBydWxlIGlzIHRoYXQsIHdpdGhvdXQgZnVydGhlciBmbGFncywgYSB3b3JkIHdpdGggYQpwcmVmaXggY2Fubm90IGJlIGNvbXBvdW5kZWQgYWZ0ZXIgYW5vdGhlciB3b3JkLCBhbmQgYSB3b3JkIHdpdGggYSBzdWZmaXgKY2Fubm90IGJlIGNvbXBvdW5kZWQgd2l0aCBhIGZvbGxvd2luZyB3b3JkLiAgVGh1cyB0aGUgYWZmaXggY2Fubm90IGFwcGVhcgpvbiB0aGUgaW5zaWRlIG9mIGEgY29tcG91bmQgd29yZC4gIFRoaXMgY2FuIGJlIGNoYW5nZWQgd2l0aCB0aGUKfHNwZWxsLUNPTVBPVU5EUEVSTUlURkxBR3wuCgoJCQkJCQkJKnNwZWxsLU5FRURDT01QT1VORCoKVGhlIE5FRURDT01QT1VORCBmbGFnIGlzIHVzZWQgdG8gcmVxdWlyZSB0aGF0IGEgd29yZCBpcyB1c2VkIGFzIHBhcnQgb2YgYQpjb21wb3VuZCB3b3JkLiAgVGhlIHdvcmQgaXRzZWxmIGlzIG5vdCBhIGdvb2Qgd29yZC4gIEV4YW1wbGU6CgoJTkVFRENPTVBPVU5EICYgfgoKCQkJCQkJCSpzcGVsbC1PTkxZSU5DT01QT1VORCoKVGhlIE9OTFlJTkNPTVBPVU5EIGRvZXMgZXhhY3RseSB0aGUgc2FtZSBhcyBORUVEQ09NUE9VTkQuICBTdXBwb3J0ZWQgZm9yCmNvbXBhdGliaWxpdHkgd2l0aCBIdW5zcGVsbC4KCgkJCQkJCQkqc3BlbGwtQ09NUE9VTkRNSU4qClRoZSBtaW5pbWFsIGNoYXJhY3RlciBsZW5ndGggb2YgYSB3b3JkIHVzZWQgZm9yIGNvbXBvdW5kaW5nIGlzIHNwZWNpZmllZCB3aXRoCkNPTVBPVU5ETUlOLiAgRXhhbXBsZToKCUNPTVBPVU5ETUlOIDUgfgoKV2hlbiBvbWl0dGVkIHRoZXJlIGlzIG5vIG1pbmltYWwgbGVuZ3RoLiAgT2J2aW91c2x5IHlvdSBjb3VsZCBqdXN0IGxlYXZlIG91dAp0aGUgY29tcG91bmQgZmxhZyBmcm9tIHNob3J0IHdvcmRzIGluc3RlYWQsIHRoaXMgZmVhdHVyZSBpcyBwcmVzZW50IGZvcgpjb21wYXRpYmlsaXR5IHdpdGggTXlzcGVsbC4KCgkJCQkJCQkqc3BlbGwtQ09NUE9VTkRXT1JETUFYKgpUaGUgbWF4aW11bSBudW1iZXIgb2Ygd29yZHMgdGhhdCBjYW4gYmUgY29uY2F0ZW5hdGVkIGludG8gYSBjb21wb3VuZCB3b3JkIGlzCnNwZWNpZmllZCB3aXRoIENPTVBPVU5EV09SRE1BWC4gIEV4YW1wbGU6CglDT01QT1VORFdPUkRNQVggMyB+CgpXaGVuIG9taXR0ZWQgdGhlcmUgaXMgbm8gbWF4aW11bS4gIEl0IGFwcGxpZXMgdG8gYWxsIGNvbXBvdW5kIHdvcmRzLgoKVG8gc2V0IGEgbGltaXQgZm9yIHdvcmRzIHdpdGggc3BlY2lmaWMgZmxhZ3MgbWFrZSBzdXJlIHRoZSBpdGVtcyBpbgpDT01QT1VORFJVTEUgd2hlcmUgdGhleSBhcHBlYXIgZG9uJ3QgYWxsb3cgdG9vIG1hbnkgd29yZHMuCgoJCQkJCQkJKnNwZWxsLUNPTVBPVU5EU1lMTUFYKgpUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3lsbGFibGVzIHRoYXQgYSBjb21wb3VuZCB3b3JkIG1heSBjb250YWluIGlzIHNwZWNpZmllZAp3aXRoIENPTVBPVU5EU1lMTUFYLiAgRXhhbXBsZToKCUNPTVBPVU5EU1lMTUFYIDYgfgoKVGhpcyBoYXMgbm8gZWZmZWN0IGlmIHRoZXJlIGlzIG5vIFNZTExBQkxFIGl0ZW0uICBXaXRob3V0IENPTVBPVU5EU1lMTUFYIHRoZXJlCmlzIG5vIGxpbWl0IG9uIHRoZSBudW1iZXIgb2Ygc3lsbGFibGVzLgoKSWYgYm90aCBDT01QT1VORFdPUkRNQVggYW5kIENPTVBPVU5EU1lMTUFYIGFyZSBkZWZpbmVkLCBhIGNvbXBvdW5kIHdvcmQgaXMKYWNjZXB0ZWQgaWYgaXQgZml0cyBvbmUgb2YgdGhlIGNyaXRlcmlhLCB0aHVzIGlzIGVpdGhlciBtYWRlIGZyb20gdXAgdG8KQ09NUE9VTkRXT1JETUFYIHdvcmRzIG9yIGNvbnRhaW5zIHVwIHRvIENPTVBPVU5EU1lMTUFYIHN5bGxhYmxlcy4KCgkJCQkJCSAgICAqc3BlbGwtQ09NUE9VTkRGT1JCSURGTEFHKgpUaGUgQ09NUE9VTkRGT1JCSURGTEFHIHNwZWNpZmllcyBhIGZsYWcgdGhhdCBjYW4gYmUgdXNlZCBvbiBhbiBhZmZpeC4gIEl0Cm1lYW5zIHRoYXQgdGhlIHdvcmQgcGx1cyBhZmZpeCBjYW5ub3QgYmUgdXNlZCBpbiBhIGNvbXBvdW5kIHdvcmQuICBFeGFtcGxlOgoJYWZmaXggZmlsZToKCQlDT01QT1VOREZMQUcgYyB+CgkJQ09NUE9VTkRGT1JCSURGTEFHIHggfgoJCVNGWCBhIFkgMiB+CgkJU0ZYIGEgMCBzICAgLiB+CgkJU0ZYIGEgMCBpemUveCAuIH4KCWRpY3Rpb25hcnk6CgkJd29yZC9jIH4KCQl1dGlsL2FjIH4KClRoaXMgYWxsb3dzIGZvciAid29yZHV0aWwiIGFuZCAid29yZHV0aWxzIiBidXQgbm90ICJ3b3JkdXRpbGl6ZSIuCk5vdGU6IHRoaXMgZG9lc24ndCB3b3JrIGZvciBwb3N0cG9uZWQgcHJlZml4ZXMgeWV0LgoKCQkJCQkJICAgICpzcGVsbC1DT01QT1VORFBFUk1JVEZMQUcqClRoZSBDT01QT1VORFBFUk1JVEZMQUcgc3BlY2lmaWVzIGEgZmxhZyB0aGF0IGNhbiBiZSB1c2VkIG9uIGFuIGFmZml4LiAgSXQKbWVhbnMgdGhhdCB0aGUgd29yZCBwbHVzIGFmZml4IGNhbiBhbHNvIGJlIHVzZWQgaW4gYSBjb21wb3VuZCB3b3JkIGluIGEgd2F5CndoZXJlIHRoZSBhZmZpeCBlbmRzIHVwIGhhbGZ3YXkgdGhlIHdvcmQuICBXaXRob3V0IHRoaXMgZmxhZyB0aGF0IGlzIG5vdAphbGxvd2VkLgpOb3RlOiB0aGlzIGRvZXNuJ3Qgd29yayBmb3IgcG9zdHBvbmVkIHByZWZpeGVzIHlldC4KCgkJCQkJCSAgICAqc3BlbGwtQ09NUE9VTkRST09UKgpUaGUgQ09NUE9VTkRST09UIGZsYWcgaXMgdXNlZCBmb3Igd29yZHMgaW4gdGhlIGRpY3Rpb25hcnkgdGhhdCBhcmUgYWxyZWFkeSBhCmNvbXBvdW5kLiAgVGhpcyBtZWFucyBpdCBjb3VudHMgZm9yIHR3byB3b3JkcyB3aGVuIGNoZWNraW5nIHRoZSBjb21wb3VuZGluZwpydWxlcy4gIENhbiBhbHNvIGJlIHVzZWQgZm9yIGFuIGFmZml4IHRvIGNvdW50IHRoZSBhZmZpeCBhcyBhIGNvbXBvdW5kaW5nCndvcmQuCgoJCQkJCQkqc3BlbGwtQ0hFQ0tDT01QT1VORFBBVFRFUk4qCkNIRUNLQ09NUE9VTkRQQVRURVJOIGlzIHVzZWQgdG8gZGVmaW5lIHBhdHRlcm5zIHRoYXQsIHdoZW4gbWF0Y2hpbmcgYXQgdGhlCnBvc2l0aW9uIHdoZXJlIHR3byB3b3JkcyBhcmUgY29tcG91bmRlZCB0b2dldGhlciBmb3JiaWRzIHRoZSBjb21wb3VuZC4KRm9yIGV4YW1wbGU6CglDSEVDS0NPTVBPVU5EUEFUVEVSTiBvIGUgfgoKVGhpcyBmb3JiaWRzIGNvbXBvdW5kaW5nIGlmIHRoZSBmaXJzdCB3b3JkIGVuZHMgaW4gIm8iIGFuZCB0aGUgc2Vjb25kIHdvcmQKc3RhcnRzIHdpdGggImUiLgoKVGhlIGFyZ3VtZW50cyBtdXN0IGJlIHBsYWluIHRleHQsIG5vIHBhdHRlcm5zIGFyZSBhY3R1YWxseSBzdXBwb3J0ZWQsIGRlc3BpdGUKdGhlIGl0ZW0gbmFtZS4gIENhc2UgaXMgYWx3YXlzIGlnbm9yZWQuCgpUaGUgSHVuc3BlbGwgZmVhdHVyZSB0byB1c2UgdGhyZWUgYXJndW1lbnRzIGFuZCBmbGFncyBpcyBub3Qgc3VwcG9ydGVkLgoKCQkJCQkJCSpzcGVsbC1TWUxMQUJMRSoKVGhlIFNZTExBQkxFIGl0ZW0gZGVmaW5lcyBjaGFyYWN0ZXJzIG9yIGNoYXJhY3RlciBzZXF1ZW5jZXMgdGhhdCBhcmUgdXNlZCB0bwpjb3VudCB0aGUgbnVtYmVyIG9mIHN5bGxhYmxlcyBpbiBhIHdvcmQuICBFeGFtcGxlOgoJU1lMTEFCTEUgYeFl6Wntb/P29XX6/Pt5L2FhL2F1L2VhL2VlL2VpL2llL29hL29lL29vL291L3V1L3VpIH4KCkJlZm9yZSB0aGUgZmlyc3Qgc2xhc2ggaXMgdGhlIHNldCBvZiBjaGFyYWN0ZXJzIHRoYXQgYXJlIGNvdW50ZWQgZm9yIG9uZQpzeWxsYWJsZSwgYWxzbyB3aGVuIHJlcGVhdGVkIGFuZCBtaXhlZCwgdW50aWwgdGhlIG5leHQgY2hhcmFjdGVyIHRoYXQgaXMgbm90CmluIHRoaXMgc2V0LiAgQWZ0ZXIgdGhlIHNsYXNoIGNvbWUgc2VxdWVuY2VzIG9mIGNoYXJhY3RlcnMgdGhhdCBhcmUgY291bnRlZApmb3Igb25lIHN5bGxhYmxlLiAgVGhlc2UgYXJlIHByZWZlcnJlZCBvdmVyIHVzaW5nIGNoYXJhY3RlcnMgZnJvbSB0aGUgc2V0LgpXaXRoIHRoZSBleGFtcGxlICJpZGVlZW4iIGhhcyB0aHJlZSBzeWxsYWJsZXMsIGNvdW50ZWQgYnkgImkiLCAiZWUiIGFuZCAiZSIuCgpPbmx5IGNhc2UtZm9sZGVkIGxldHRlcnMgbmVlZCB0byBiZSBpbmNsdWRlZC4KCkFub3RoZXIgd2F5IHRvIHJlc3RyaWN0IGNvbXBvdW5kaW5nIHdhcyBtZW50aW9uZWQgYWJvdmU6IEFkZGluZyB0aGUKfHNwZWxsLUNPTVBPVU5ERk9SQklERkxBR3wgZmxhZyB0byBhbiBhZmZpeCBjYXVzZXMgYWxsIHdvcmRzIHRoYXQgYXJlIG1hZGUKd2l0aCB0aGF0IGFmZml4IG5vdCBiZSBiZSB1c2VkIGZvciBjb21wb3VuZGluZy4KCgpVTkxJTUlURUQgQ09NUE9VTkRJTkcJCQkJCSpzcGVsbC1OT0JSRUFLKgoKRm9yIHNvbWUgbGFuZ3VhZ2VzLCBzdWNoIGFzIFRoYWksIHRoZXJlIGlzIG5vIHNwYWNlIGluIGJldHdlZW4gd29yZHMuICBUaGlzCmxvb2tzIGxpa2UgYWxsIHdvcmRzIGFyZSBjb21wb3VuZGVkLiAgVG8gc3BlY2lmeSB0aGlzIHVzZSB0aGUgTk9CUkVBSyBpdGVtIGluCnRoZSBhZmZpeCBmaWxlLCB3aXRob3V0IGFyZ3VtZW50czoKCU5PQlJFQUsgfgoKVmltIHdpbGwgdHJ5IHRvIGZpZ3VyZSBvdXQgd2hlcmUgb25lIHdvcmQgZW5kcyBhbmQgYSBuZXh0IHN0YXJ0cy4gIFdoZW4gdGhlcmUKYXJlIHNwZWxsaW5nIG1pc3Rha2VzIHRoaXMgbWF5IG5vdCBiZSBxdWl0ZSByaWdodC4KCgoJCQkJCQkJKnNwZWxsLUNPTU1PTioKQ29tbW9uIHdvcmRzIGNhbiBiZSBzcGVjaWZpZWQgd2l0aCB0aGUgQ09NTU9OIGl0ZW0uICBUaGlzIHdpbGwgZ2l2ZSBiZXR0ZXIKc3VnZ2VzdGlvbnMgd2hlbiBlZGl0aW5nIGEgc2hvcnQgZmlsZS4gIEV4YW1wbGU6CgoJQ09NTU9OICB0aGUgb2YgdG8gYW5kIGEgaW4gaXMgaXQgeW91IHRoYXQgaGUgd2FzIGZvciBvbiBhcmUgfgoKVGhlIHdvcmRzIG11c3QgYmUgc2VwYXJhdGVkIGJ5IHdoaXRlIHNwYWNlLCB1cCB0byAyNSBwZXIgbGluZS4KV2hlbiBtdWx0aXBsZSByZWdpb25zIGFyZSBzcGVjaWZpZWQgaW4gYSAiOm1rc3BlbGwiIGNvbW1hbmQgdGhlIGNvbW1vbiB3b3Jkcwpmb3IgYWxsIHJlZ2lvbnMgYXJlIGNvbWJpbmVkIGFuZCB1c2VkIGZvciBhbGwgcmVnaW9ucy4KCgkJCQkJCQkqc3BlbGwtTk9TUExJVFNVR1MqClRoaXMgaXRlbSBpbmRpY2F0ZXMgdGhhdCBzcGxpdHRpbmcgYSB3b3JkIHRvIG1ha2Ugc3VnZ2VzdGlvbnMgaXMgbm90IGEgZ29vZAppZGVhLiAgU3BsaXQtd29yZCBzdWdnZXN0aW9ucyB3aWxsIGFwcGVhciBvbmx5IHdoZW4gdGhlcmUgYXJlIGZldyBzaW1pbGFyCndvcmRzLgoKCU5PU1BMSVRTVUdTIH4KCgkJCQkJCQkqc3BlbGwtTk9TVUdHRVNUKgpUaGUgZmxhZyBzcGVjaWZpZWQgd2l0aCBOT1NVR0dFU1QgY2FuIGJlIHVzZWQgZm9yIHdvcmRzIHRoYXQgd2lsbCBub3QgYmUKc3VnZ2VzdGVkLiAgQ2FuIGJlIHVzZWQgZm9yIG9ic2NlbmUgd29yZHMuCgoJTk9TVUdHRVNUICUgfgoKClJFUExBQ0VNRU5UUwkJCQkJCSpzcGVsbC1SRVAqCgpJbiB0aGUgYWZmaXggZmlsZSBSRVAgaXRlbXMgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIGNvbW1vbiBtaXN0YWtlcy4gIFRoaXMgaXMKdXNlZCB0byBtYWtlIHNwZWxsaW5nIHN1Z2dlc3Rpb25zLiAgVGhlIGl0ZW1zIGRlZmluZSB0aGUgImZyb20iIHRleHQgYW5kIHRoZQoidG8iIHJlcGxhY2VtZW50LiAgRXhhbXBsZToKCglSRVAgNCB+CglSRVAgZiBwaCB+CglSRVAgcGggZiB+CglSRVAgayBjaCB+CglSRVAgY2ggayB+CgpUaGUgZmlyc3QgbGluZSBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBSRVAgbGluZXMgZm9sbG93aW5nLiAgVmltIGlnbm9yZXMgdGhlCm51bWJlciwgYnV0IGl0IG11c3QgYmUgdGhlcmUgKGZvciBjb21wYXRpYmlsaXR5IHdpdGggTXlzcGVsbCkuCgpEb24ndCBpbmNsdWRlIHNpbXBsZSBvbmUtY2hhcmFjdGVyIHJlcGxhY2VtZW50cyBvciBzd2Fwcy4gIFZpbSB3aWxsIHRyeSB0aGVzZQphbnl3YXkuICBZb3UgY2FuIGluY2x1ZGUgd2hvbGUgd29yZHMgaWYgeW91IHdhbnQgdG8sIGJ1dCB5b3UgbWlnaHQgd2FudCB0byB1c2UKdGhlICJmaWxlOiIgaXRlbSBpbiAnc3BlbGxzdWdnZXN0JyBpbnN0ZWFkLgoKWW91IGNhbiBpbmNsdWRlIGEgc3BhY2UgYnkgdXNpbmcgYW4gdW5kZXJzY29yZToKCglSRVAgdGhlX3RoZSB0aGUgfgoKClNJTUlMQVIgQ0hBUkFDVEVSUwkJCQkJKnNwZWxsLU1BUCogKkU3ODMqCgpJbiB0aGUgYWZmaXggZmlsZSBNQVAgaXRlbXMgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIGxldHRlcnMgdGhhdCBhcmUgdmVyeSBtdWNoCmFsaWtlLiAgVGhpcyBpcyBtb3N0bHkgdXNlZCBmb3IgYSBsZXR0ZXIgd2l0aCBkaWZmZXJlbnQgYWNjZW50cy4gIFRoaXMgaXMgdXNlZAp0byBwcmVmZXIgc3VnZ2VzdGlvbnMgd2l0aCB0aGVzZSBsZXR0ZXJzIHN1YnN0aXR1dGVkLiAgRXhhbXBsZToKCglNQVAgMiB+CglNQVAgZenr6uggfgoJTUFQIHX8+fr7IH4KClRoZSBmaXJzdCBsaW5lIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIE1BUCBsaW5lcyBmb2xsb3dpbmcuICBWaW0gaWdub3JlcyB0aGUKbnVtYmVyLCBidXQgdGhlIGxpbmUgbXVzdCBiZSB0aGVyZS4KCkVhY2ggbGV0dGVyIG11c3QgYXBwZWFyIGluIG9ubHkgb25lIG9mIHRoZSBNQVAgaXRlbXMuICBJdCdzIGEgYml0IG1vcmUKZWZmaWNpZW50IGlmIHRoZSBmaXJzdCBsZXR0ZXIgaXMgQVNDSUkgb3IgYXQgbGVhc3Qgb25lIHdpdGhvdXQgYWNjZW50cy4KCgouU1VHIEZJTEUJCQkJCQkqc3BlbGwtTk9TVUdGSUxFKgoKV2hlbiBzb3VuZGZvbGRpbmcgaXMgc3BlY2lmaWVkIGluIHRoZSBhZmZpeCBmaWxlIHRoZW4gIjpta3NwZWxsIiB3aWxsIG5vcm1hbGx5CnByb2R1Y2UgYSAuc3VnIGZpbGUgbmV4dCB0byB0aGUgLnNwbCBmaWxlLiAgVGhpcyBmaWxlIGlzIHVzZWQgdG8gZmluZApzdWdnZXN0aW9ucyBieSB0aGVpciBzb3VuZC1hLWxpa2UgZm9ybSBxdWlja2x5LiAgQXQgdGhlIGNvc3Qgb2YgYSBsb3Qgb2YKbWVtb3J5ICh0aGUgYW1vdW50IGRlcGVuZHMgb24gdGhlIG51bWJlciBvZiB3b3JkcywgfDpta3NwZWxsfCB3aWxsIGRpc3BsYXkgYW4KZXN0aW1hdGUgd2hlbiBpdCdzIGRvbmUpLgoKVG8gYXZvaWQgcHJvZHVjaW5nIGEgLnN1ZyBmaWxlIHVzZSB0aGlzIGl0ZW0gaW4gdGhlIGFmZml4IGZpbGU6CgoJTk9TVUdGSUxFIH4KClVzZXJzIGNhbiBzaW1wbHkgb21pdCB0aGUgLnN1ZyBmaWxlIGlmIHRoZXkgZG9uJ3Qgd2FudCB0byB1c2UgaXQuCgoKU09VTkQtQS1MSUtFCQkJCQkJKnNwZWxsLVNBTCoKCkluIHRoZSBhZmZpeCBmaWxlIFNBTCBpdGVtcyBjYW4gYmUgdXNlZCB0byBkZWZpbmUgdGhlIHNvdW5kcy1hLWxpa2UgbWVjaGFuaXNtCnRvIGJlIHVzZWQuICBUaGUgbWFpbiBpdGVtcyBkZWZpbmUgdGhlICJmcm9tIiB0ZXh0IGFuZCB0aGUgInRvIiByZXBsYWNlbWVudC4KU2ltcGxpc3RpYyBleGFtcGxlOgoKCVNBTCBDSUEJCQkgWCB+CglTQUwgQ0gJCQkgWCB+CglTQUwgQwkJCSBLIH4KCVNBTCBLCQkJIEsgfgoKVGhlcmUgYXJlIGEgZmV3IHJ1bGVzIGFuZCB0aGlzIGNhbiBiZWNvbWUgcXVpdGUgY29tcGxpY2F0ZWQuICBBbiBleHBsYW5hdGlvbgpob3cgaXQgd29ya3MgY2FuIGJlIGZvdW5kIGluIHRoZSBBc3BlbGwgbWFudWFsOgpodHRwOi8vYXNwZWxsLm5ldC9tYW4taHRtbC9QaG9uZXRpYy1Db2RlLmh0bWwuCgpUaGVyZSBhcmUgYSBmZXcgc3BlY2lhbCBpdGVtczoKCglTQUwgZm9sbG93dXAJCXRydWUgfgoJU0FMIGNvbGxhcHNlX3Jlc3VsdAl0cnVlIH4KCVNBTCByZW1vdmVfYWNjZW50cwl0cnVlIH4KCiIxIiBoYXMgdGhlIHNhbWUgbWVhbmluZyBhcyAidHJ1ZSIuICBBbnkgb3RoZXIgdmFsdWUgbWVhbnMgImZhbHNlIi4KCgpTSU1QTEUgU09VTkRGT0xESU5HCQkJCSpzcGVsbC1TT0ZPRlJPTSogKnNwZWxsLVNPRk9UTyoKClRoZSBTQUwgbWVjaGFuaXNtIGlzIGNvbXBsZXggYW5kIHNsb3cuICBBIHNpbXBsZXIgbWVjaGFuaXNtIGlzIG1hcHBpbmcgYWxsCmNoYXJhY3RlcnMgdG8gYW5vdGhlciBjaGFyYWN0ZXIsIG1hcHBpbmcgc2ltaWxhciBzb3VuZGluZyBjaGFyYWN0ZXJzIHRvIHRoZQpzYW1lIGNoYXJhY3Rlci4gIEF0IHRoZSBzYW1lIHRpbWUgdGhpcyBkb2VzIGNhc2UgZm9sZGluZy4gIFlvdSBjYW4gbm90IGhhdmUKYm90aCBTQUwgaXRlbXMgYW5kIHNpbXBsZSBzb3VuZGZvbGRpbmcuCgpUaGVyZSBhcmUgdHdvIGl0ZW1zIHJlcXVpcmVkOiBvbmUgdG8gc3BlY2lmeSB0aGUgY2hhcmFjdGVycyB0aGF0IGFyZSBtYXBwZWQKYW5kIG9uZSB0aGF0IHNwZWNpZmllcyB0aGUgY2hhcmFjdGVycyB0aGV5IGFyZSBtYXBwZWQgdG8uICBUaGV5IG11c3QgaGF2ZQpleGFjdGx5IHRoZSBzYW1lIG51bWJlciBvZiBjaGFyYWN0ZXJzLiAgRXhhbXBsZToKCiAgICBTT0ZPRlJPTSBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIH4KICAgIFNPRk9UTyAgIGViY3RlZmdoZWprbG5uZXBrcnN0ZXZ2a2VzZWJjdGVmZ2hlamtsbm5lcGtyc3RldnZrZXMgfgoKSW4gdGhlIGV4YW1wbGUgYWxsIHZvd2VscyBhcmUgbWFwcGVkIHRvIHRoZSBzYW1lIGNoYXJhY3RlciAnZScuICBBbm90aGVyCm1ldGhvZCB3b3VsZCBiZSB0byBsZWF2ZSBvdXQgYWxsIHZvd2Vscy4gIFNvbWUgY2hhcmFjdGVycyB0aGF0IHNvdW5kIG5lYXJseQp0aGUgc2FtZSBhbmQgYXJlIG9mdGVuIG1peGVkIHVwLCBzdWNoIGFzICdtJyBhbmQgJ24nLCBhcmUgbWFwcGVkIHRvIHRoZSBzYW1lCmNoYXJhY3Rlci4gIERvbid0IGRvIHRoaXMgdG9vIG11Y2gsIGFsbCB3b3JkcyB3aWxsIHN0YXJ0IGxvb2tpbmcgYWxpa2UuCgpDaGFyYWN0ZXJzIHRoYXQgZG8gbm90IGFwcGVhciBpbiBTT0ZPRlJPTSB3aWxsIGJlIGxlZnQgb3V0LCBleGNlcHQgdGhhdCBhbGwKd2hpdGUgc3BhY2UgaXMgcmVwbGFjZWQgYnkgb25lIHNwYWNlLiAgU2VxdWVuY2VzIG9mIHRoZSBzYW1lIGNoYXJhY3RlciBpbgpTT0ZPRlJPTSBhcmUgcmVwbGFjZWQgYnkgb25lLgoKWW91IGNhbiB1c2UgdGhlIHxzb3VuZGZvbGQoKXwgZnVuY3Rpb24gdG8gdHJ5IG91dCB0aGUgcmVzdWx0cy4gIE9yIHNldCB0aGUKJ3ZlcmJvc2UnIG9wdGlvbiB0byBzZWUgdGhlIHNjb3JlIGluIHRoZSBvdXRwdXQgb2YgdGhlIHx6PXwgY29tbWFuZC4KCgpVTlNVUFBPUlRFRCBJVEVNUwkJCQkqc3BlbGwtYWZmaXgtbm90LXN1cHBvcnRlZCoKClRoZXNlIGl0ZW1zIGFwcGVhciBpbiB0aGUgYWZmaXggZmlsZSBvZiBvdGhlciBzcGVsbCBjaGVja2Vycy4gIEluIFZpbSB0aGV5IGFyZQppZ25vcmVkLCBub3Qgc3VwcG9ydGVkIG9yIGRlZmluZWQgaW4gYW5vdGhlciB3YXkuCgpBQ0NFTlQJCShIdW5zcGVsbCkJCQkJKnNwZWxsLUFDQ0VOVCoKCQlVc2UgTUFQIGluc3RlYWQuIHxzcGVsbC1NQVB8CgpCUkVBSwkJKEh1bnNwZWxsKQkJCQkqc3BlbGwtQlJFQUsqCgkJRGVmaW5lIGJyZWFrIHBvaW50cy4gIFVuY2xlYXIgaG93IGl0IHdvcmtzIGV4YWN0bHkuCgkJTm90IHN1cHBvcnRlZC4KCkNIRUNLQ09NUE9VTkRDQVNFICAoSHVuc3BlbGwpCQkJKnNwZWxsLUNIRUNLQ09NUE9VTkRDQVNFKgoJCURpc2FsbG93IHVwcGVyY2FzZSBsZXR0ZXJzIGF0IGNvbXBvdW5kIHdvcmQgYm91bmRhcmllcy4KCQlOb3Qgc3VwcG9ydGVkLgoKQ0hFQ0tDT01QT1VORERVUCAgKEh1bnNwZWxsKQkJCSpzcGVsbC1DSEVDS0NPTVBPVU5ERFVQKgoJCURpc2FsbG93IHVzaW5nIHRoZSBzYW1lIHdvcmQgdHdpY2UgaW4gYSBjb21wb3VuZC4gIE5vdAoJCXN1cHBvcnRlZC4KCkNIRUNLQ09NUE9VTkRSRVAgIChIdW5zcGVsbCkJCQkqc3BlbGwtQ0hFQ0tDT01QT1VORFJFUCoKCQlTb21ldGhpbmcgYWJvdXQgdXNpbmcgUkVQIGl0ZW1zIGFuZCBjb21wb3VuZCB3b3Jkcy4gIE5vdAoJCXN1cHBvcnRlZC4KCkNIRUNLQ09NUE9VTkRUUklQTEUgIChIdW5zcGVsbCkJCQkqc3BlbGwtQ0hFQ0tDT01QT1VORFRSSVBMRSoKCQlGb3JiaWQgdGhyZWUgaWRlbnRpY2FsIGNoYXJhY3RlcnMgd2hlbiBjb21wb3VuZGluZy4gIE5vdAoJCXN1cHBvcnRlZC4KCkNPTVBMRVhQUkVGSVhFUyAgKEh1bnNwZWxsKQkJCQkqc3BlbGwtQ09NUExFWFBSRUZJWEVTKgoJCUVuYWJsZXMgdXNpbmcgdHdvIHByZWZpeGVzLiAgTm90IHN1cHBvcnRlZC4KCkNPTVBPVU5ECShIdW5zcGVsbCkJCQkJKnNwZWxsLUNPTVBPVU5EKgoJCVRoaXMgaXMgb25lIGxpbmUgd2l0aCB0aGUgY291bnQgb2YgQ09NUE9VTkQgaXRlbXMsIGZvbGxvd2VkIGJ5CgkJdGhhdCBtYW55IENPTVBPVU5EIGxpbmVzIHdpdGggYSBwYXR0ZXJuLgoJCVJlbW92ZSB0aGUgZmlyc3QgbGluZSB3aXRoIHRoZSBjb3VudCBhbmQgcmVuYW1lIHRoZSBvdGhlcgoJCWl0ZW1zIHRvIENPTVBPVU5EUlVMRSB8c3BlbGwtQ09NUE9VTkRSVUxFfAoKQ09NUE9VTkRGSVJTVAkoSHVuc3BlbGwpCQkJCSpzcGVsbC1DT01QT1VOREZJUlNUKgoJCVVzZSBDT01QT1VORFJVTEUgaW5zdGVhZC4gfHNwZWxsLUNPTVBPVU5EUlVMRXwKCkNPTVBPVU5EQkVHSU4JKEh1bnNwZWxsKQkJCQkqc3BlbGwtQ09NUE9VTkRCRUdJTioKCQlVc2UgQ09NUE9VTkRSVUxFIGluc3RlYWQuIHxzcGVsbC1DT01QT1VORFJVTEV8CgpDT01QT1VOREVORAkoSHVuc3BlbGwpCQkJCSpzcGVsbC1DT01QT1VOREVORCoKCQlVc2UgQ09NUE9VTkRSVUxFIGluc3RlYWQuIHxzcGVsbC1DT01QT1VORFJVTEV8CgpDT01QT1VORE1JRERMRQkoSHVuc3BlbGwpCQkJCSpzcGVsbC1DT01QT1VORE1JRERMRSoKCQlVc2UgQ09NUE9VTkRSVUxFIGluc3RlYWQuIHxzcGVsbC1DT01QT1VORFJVTEV8CgpDT01QT1VORFJVTEVTCShIdW5zcGVsbCkJCQkJKnNwZWxsLUNPTVBPVU5EUlVMRVMqCgkJTnVtYmVyIG9mIENPTVBPVU5EUlVMRSBsaW5lcyBmb2xsb3dpbmcuICBJZ25vcmVkLCBidXQgdGhlCgkJYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlci4KCkNPTVBPVU5EU1lMTEFCTEUgIChIdW5zcGVsbCkJCQkqc3BlbGwtQ09NUE9VTkRTWUxMQUJMRSoKCQlVc2UgU1lMTEFCTEUgYW5kIENPTVBPVU5EU1lMTUFYIGluc3RlYWQuIHxzcGVsbC1TWUxMQUJMRXwKCQl8c3BlbGwtQ09NUE9VTkRTWUxNQVh8CgpLRVkJCShIdW5zcGVsbCkJCQkJKnNwZWxsLUtFWSoKCQlEZWZpbmUgY2hhcmFjdGVycyB0aGF0IGFyZSBjbG9zZSB0b2dldGhlciBvbiB0aGUga2V5Ym9hcmQuCgkJVXNlZCB0byBnaXZlIGJldHRlciBzdWdnZXN0aW9ucy4gIE5vdCBzdXBwb3J0ZWQuCgkJCkxBTkcJCShIdW5zcGVsbCkJCQkJKnNwZWxsLUxBTkcqCgkJVGhpcyBzcGVjaWZpZXMgbGFuZ3VhZ2Utc3BlY2lmaWMgYmVoYXZpb3IuICBUaGlzIGFjdHVhbGx5CgkJbW92ZXMgcGFydCBvZiB0aGUgbGFuZ3VhZ2Uga25vd2xlZGdlIGludG8gdGhlIHByb2dyYW0sCgkJdGhlcmVmb3JlIFZpbSBkb2VzIG5vdCBzdXBwb3J0IGl0LiAgRWFjaCBsYW5ndWFnZSBwcm9wZXJ0eQoJCW11c3QgYmUgc3BlY2lmaWVkIHNlcGFyYXRlbHkuCgpMRU1NQV9QUkVTRU5UCShIdW5zcGVsbCkJCQkJKnNwZWxsLUxFTU1BX1BSRVNFTlQqCgkJT25seSBuZWVkZWQgZm9yIG1vcnBob2xvZ2ljYWwgYW5hbHlzaXMuCgpNQVhOR1JBTVNVR1MJKEh1bnNwZWxsKQkJCQkqc3BlbGwtTUFYTkdSQU1TVUdTKgoJCVNldCBudW1iZXIgb2Ygbi1ncmFtIHN1Z2dlc3Rpb25zLiAgTm90IHN1cHBvcnRlZC4KClBTRVVET1JPT1QJKEh1bnNwZWxsKQkJCQkqc3BlbGwtUFNFVURPUk9PVCoKCQlVc2UgTkVFREFGRklYIGluc3RlYWQuIHxzcGVsbC1ORUVEQUZGSVh8CgpTVUdTV0lUSERPVFMJKEh1bnNwZWxsKQkJCQkqc3BlbGwtU1VHU1dJVEhET1RTKgoJCUFkZHMgZG90cyB0byBzdWdnZXN0aW9ucy4gIFZpbSBkb2Vzbid0IG5lZWQgdGhpcy4KClNZTExBQkxFTlVNCShIdW5zcGVsbCkJCQkJKnNwZWxsLVNZTExBQkxFTlVNKgoJCU5vdCBzdXBwb3J0ZWQuCgpUUlkJCShNeXNwZWxsLCBIdW5zcGVsbCwgb3RoZXJzKQkJKnNwZWxsLVRSWSoKCQlWaW0gZG9lcyBub3QgdXNlIHRoZSBUUlkgaXRlbSwgaXQgaXMgaWdub3JlZC4gIEZvciBtYWtpbmcKCQlzdWdnZXN0aW9ucyB0aGUgYWN0dWFsIGNoYXJhY3RlcnMgaW4gdGhlIHdvcmRzIGFyZSB1c2VkLCB0aGF0CgkJaXMgbXVjaCBtb3JlIGVmZmljaWVudC4KCldPUkRDSEFSUwkoSHVuc3BlbGwpCQkJCSpzcGVsbC1XT1JEQ0hBUlMqCgkJVXNlZCB0byByZWNvZ25pemUgd29yZHMuICBWaW0gZG9lc24ndCBuZWVkIGl0LCBiZWNhdXNlIHRoZXJlCgkJaXMgbm8gbmVlZCB0byBzZXBhcmF0ZSB3b3JkcyBiZWZvcmUgY2hlY2tpbmcgdGhlbSAodXNpbmcgYQoJCXRyaWUgaW5zdGVhZCBvZiBhIGhhc2h0YWJsZSkuCgogdmltOnR3PTc4OnN3PTQ6dHM9ODpmdD1oZWxwOm5vcmw6Cg==