PGh0bWw+PGhlYWQ+PCEtLQogICAgIENvcHlyaWdodCAyMDA1IEFhcm9uIFdpbmRzb3IKICAgIAogICAgIFVzZSwgbW9kaWZpY2F0aW9uIGFuZCBkaXN0cmlidXRpb24gaXMgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUKICAgICBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAogICAgIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKICAgIAogICAgICBBdXRob3I6IEFhcm9uIFdpbmRzb3IKICAtLT48dGl0bGU+Qm9vc3QgR3JhcGggTGlicmFyeTogTWF4aW11bSBDYXJkaW5hbGl0eSBNYXRjaGluZzwvdGl0bGU+PC9oZWFkPgo8Ym9keSBhbGluaz0iI2ZmMDAwMCIgYmdjb2xvcj0iI2ZmZmZmZiIgbGluaz0iIzAwMDBlZSIgdGV4dD0iIzAwMDAwMCIgdmxpbms9IiM1NTFhOGIiPgo8aW1nIHNyYz0iLi4vLi4vLi4vYm9vc3QucG5nIiBhbHQ9IkMrKyBCb29zdCIgaGVpZ2h0PSI4NiIgd2lkdGg9IjI3NyI+CjxiciBjbGVhcj0iIj4KPGgxPgo8YSBuYW1lPSJzZWM6bWF4aW11bV9jYXJkaW5hbGl0eV9tYXRjaGluZyI+TWF4aW11bSBDYXJkaW5hbGl0eSBNYXRjaGluZzwvYT4KPC9oMT4KPHByZT4KdGVtcGxhdGUgJmx0O3R5cGVuYW1lIEdyYXBoLCB0eXBlbmFtZSBNYXRlTWFwJmd0Owp2b2lkIGVkbW9uZHNfbWF4aW11bV9jYXJkaW5hbGl0eV9tYXRjaGluZyhjb25zdCBHcmFwaCZhbXA7IGcsIE1hdGVNYXAgbWF0ZSk7Cgp0ZW1wbGF0ZSAmbHQ7dHlwZW5hbWUgR3JhcGgsIHR5cGVuYW1lIE1hdGVNYXAsIHR5cGVuYW1lIFZlcnRleEluZGV4TWFwJmd0Owp2b2lkIGVkbW9uZHNfbWF4aW11bV9jYXJkaW5hbGl0eV9tYXRjaGluZyhjb25zdCBHcmFwaCZhbXA7IGcsIE1hdGVNYXAgbWF0ZSwgVmVydGV4SW5kZXhNYXAgdm0pOwoKdGVtcGxhdGUgJmx0O3R5cGVuYW1lIEdyYXBoLCB0eXBlbmFtZSBNYXRlTWFwJmd0Owpib29sIGNoZWNrZWRfZWRtb25kc19tYXhpbXVtX2NhcmRpbmFsaXR5X21hdGNoaW5nKGNvbnN0IEdyYXBoJmFtcDsgZywgTWF0ZU1hcCBtYXRlKTsKCnRlbXBsYXRlICZsdDt0eXBlbmFtZSBHcmFwaCwgdHlwZW5hbWUgTWF0ZU1hcCwgdHlwZW5hbWUgVmVydGV4SW5kZXhNYXAmZ3Q7CmJvb2wgY2hlY2tlZF9lZG1vbmRzX21heGltdW1fY2FyZGluYWxpdHlfbWF0Y2hpbmcoY29uc3QgR3JhcGgmYW1wOyBnLCBNYXRlTWFwIG1hdGUsIFZlcnRleEluZGV4TWFwIHZtKTsKPC9wcmU+CjxwPgo8YSBuYW1lPSJzZWM6bWF0Y2hpbmciPkEgPGk+bWF0Y2hpbmc8L2k+IGlzIGEgc3Vic2V0IG9mIHRoZSBlZGdlcwpvZiBhIGdyYXBoIHN1Y2ggdGhhdCBubyB0d28gZWRnZXMgc2hhcmUgYSBjb21tb24gdmVydGV4LgpUd28gZGlmZmVyZW50IG1hdGNoaW5ncyBpbiB0aGUgc2FtZSBncmFwaCBhcmUgaWxsdXN0cmF0ZWQgYmVsb3cgKGVkZ2VzIGluIHRoZQptYXRjaGluZyBhcmUgY29sb3JlZCBibHVlLikgVGhlIG1hdGNoaW5nIG9uIHRoZSBsZWZ0IGlzIGEgPGk+bWF4aW1hbCBtYXRjaGluZzwvaT4sIAptZWFuaW5nIHRoYXQgaXRzIHNpemUgY2FuJ3QgYmUgaW5jcmVhc2VkIGJ5IGFkZGluZyBlZGdlcy4gVGhlIG1hdGNoaW5nIG9uIHRoZSAKcmlnaHQgaXMgYSA8aT5tYXhpbXVtIGNhcmRpbmFsaXR5IG1hdGNoaW5nPC9pPiwgbWVhbmluZyB0aGF0IGlzIGhhcyBtYXhpbXVtIHNpemUgCm92ZXIgYWxsIG1hdGNoaW5ncyBpbiB0aGUgZ3JhcGguCgo8L2E+PC9wPjxwPjwvcD48Y2VudGVyPgo8dGFibGUgYm9yZGVyPSIwIj4KPHRyPgo8dGQ+PGEgbmFtZT0iZmlnOm1heGltYWxfbWF0Y2hpbmciPjxpbWcgc3JjPSJmaWdzL21heGltYWwtbWF0Y2gucG5nIj48L2E+PC90ZD4KPHRkIHdpZHRoPSIxNTAiPjwvdGQ+Cjx0ZD48YSBuYW1lPSJmaWc6bWF4aW11bV9tYXRjaGluZyI+PGltZyBzcmM9ImZpZ3MvbWF4aW11bS1tYXRjaC5wbmciPjwvYT48L3RkPgo8L3RyPgo8L3RhYmxlPgo8L2NlbnRlcj4KCjxwPgpCb3RoIDx0dD5lZG1vbmRzX21heGltdW1fY2FyZGluYWxpdHlfbWF0Y2hpbmc8L3R0PiBhbmQgCjx0dD5jaGVja2VkX2VkbW9uZHNfbWF4aW11bV9jYXJkaW5hbGl0eV9tYXRjaGluZzwvdHQ+IGZpbmQgdGhlCm1heGltdW0gY2FyZGluYWxpdHkgbWF0Y2hpbmcgaW4gYW55IHVuZGlyZWN0ZWQgZ3JhcGguIFRoZSBtYXRjaGluZyBpcyByZXR1cm5lZCBpbiBhCjx0dD5NYXRlTWFwPC90dD4sIHdoaWNoIGlzIGEgCjxhIGhyZWY9Ii4uLy4uL3Byb3BlcnR5X21hcC9kb2MvUmVhZFdyaXRlUHJvcGVydHlNYXAuaHRtbCI+UmVhZFdyaXRlUHJvcGVydHlNYXA8L2E+IAp0aGF0IG1hcHMgdmVydGljZXMgdG8gdmVydGljZXMuIEluIHRoZSBtYXBwaW5nIHJldHVybmVkLCBlYWNoIHZlcnRleCBpcyBlaXRoZXIgbWFwcGVkCnRvIHRoZSB2ZXJ0ZXggaXQncyBtYXRjaGVkIHRvLCBvciB0byA8dHQ+Z3JhcGhfdHJhaXRzJmx0O0dyYXBoJmd0Ozo6bnVsbF92ZXJ0ZXgoKTwvdHQ+IGlmIGl0CmRvZXNuJ3QgcGFydGljaXBhdGUgaW4gdGhlIG1hdGNoaW5nLiBJZiBubyA8dHQ+VmVydGV4SW5kZXhNYXA8L3R0PiBpcyBwcm92aWRlZCwgYm90aCBmdW5jdGlvbnMKYXNzdW1lIHRoYXQgdGhlIDx0dD5WZXJ0ZXhJbmRleE1hcDwvdHQ+IGlzIHByb3ZpZGVkIGFzIGFuIGludGVybmFsIGdyYXBoIHByb3BlcnR5IGFjY2Vzc2libGUKYnkgY2FsbGluZyA8dHQ+Z2V0KHZlcnRleF9pbmRleCxnKTwvdHQ+LiBUaGUgb25seSBkaWZmZXJlbmNlIGJldHdlZW4gCjx0dD5lZG1vbmRzX21heGltdW1fY2FyZGluYWxpdHlfbWF0Y2hpbmc8L3R0PiBhbmQgCjx0dD5jaGVja2VkX2VkbW9uZHNfbWF4aW11bV9jYXJkaW5hbGl0eV9tYXRjaGluZzwvdHQ+IGlzIHRoYXQgYXMgYSBmaW5hbCBzdGVwLCAKdGhlIGxhdHRlciBhbGdvcml0aG0gcnVucyBhIHNpbXBsZSB2ZXJpZmljYXRpb24gb24gdGhlIG1hdGNoaW5nIGNvbXB1dGVkIGFuZCAKcmV0dXJucyA8dHQ+dHJ1ZTwvdHQ+IGlmIGFuZCBvbmx5IGlmIHRoZSBtYXRjaGluZyBpcyBpbmRlZWQKYSBtYXhpbXVtIGNhcmRpbmFsaXR5IG1hdGNoaW5nLgoKPHA+CkdpdmVuIGEgbWF0Y2hpbmcgTSwgYW55IHZlcnRleCB0aGF0IGlzbid0IGNvdmVyZWQgYnkgYW4gZWRnZSBpbiBNIGlzIGNhbGxlZCA8aT5mcmVlPC9pPi4gQW55CnNpbXBsZSBwYXRoIGNvbnRhaW5pbmcgZXhhY3RseSA8aT4ybiArIDE8L2k+IGVkZ2VzIHRoYXQgc3RhcnRzIGFuZCBlbmRzIGF0IGZyZWUgdmVydGljZXMgYW5kIGNvbnRhaW5zIAo8aT5uPC9pPiBlZGdlcyBmcm9tIE0gaXMgY2FsbGVkIGFuIDxpPmFsdGVybmF0aW5nIHBhdGg8L2k+LiBHaXZlbiBhbiBhbHRlcm5hdGluZyBwYXRoIDxpPnA8L2k+LCBhbGwgbWF0Y2hpbmcgYW5kIApub24tbWF0Y2hpbmcgZWRnZXMgb24gPGk+cDwvaT4gY2FuIGJlIHN3YXBwZWQsIHJlc3VsdGluZyBpbiBhIG5ldyBtYXRjaGluZyB0aGF0J3MgbGFyZ2VyIHRoYW4gdGhlCm9yaWdpbmFsIG1hdGNoaW5nIGJ5IGV4YWN0bHkgb25lIGVkZ2UuIFRoaXMgbWV0aG9kIG9mIGluY3JlbWVudGFsbHkgaW5jcmVhc2luZyB0aGUgc2l6ZSBvZiBtYXRjaGluZywgYWxvbmcgCndpdGggdGhlIGZvbGxvd2luZyBmYWN0LCBmb3JtcyB0aGUgYmFzaXMgb2YgRWRtb25kcycgbWF0Y2hpbmcgYWxnb3JpdGhtOgoKPGJsb2NrcXVvdGU+CjxpPkFuIGFsdGVybmF0aW5nIHBhdGggdGhyb3VnaCB0aGUgbWF0Y2hpbmcgTSBleGlzdHMgaWYgYW5kIG9ubHkgaWYgTSBpcyBub3QgYSBtYXhpbXVtIGNhcmRpbmFsaXR5IG1hdGNoaW5nLjwvaT4KPC9ibG9ja3F1b3RlPgoKVGhlIGRpZmZpY3VsdCBwYXJ0IGlzLCBvZiBjb3Vyc2UsIGZpbmRpbmcgYW4gYXVnbWVudGluZyBwYXRoIHdoZW5ldmVyIG9uZSBleGlzdHMuClRoZSBhbGdvcml0aG0gd2UgdXNlIGZvciBmaW5kaW5nIGEgbWF4aW11bSBjYXJkaW5hbGl0eSBtYXRjaGluZyBjb25zaXN0cyBvZiB0aHJlZSBiYXNpYyBzdGVwczoKPG9sPgo8bGk+Q3JlYXRlIGFuIGluaXRpYWwgbWF0Y2hpbmcuCjxsaT5SZXBlYXRlZGx5IGZpbmQgYW4gYXVnbWVudGluZyBwYXRoIGFuZCB1c2UgaXQgdG8gaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIG1hdGNoaW5nIHVudGlsIG5vIGF1Z21lbnRpbmcgcGF0aCBleGlzdHMuCjxsaT5WZXJpZnkgdGhhdCB0aGUgbWF0Y2hpbmcgZm91bmQgaXMgYSBtYXhpbXVtIGNhcmRpbmFsaXR5IG1hdGNoaW5nLgo8L29sPgoKSWYgeW91IHVzZSA8dHQ+Y2hlY2tlZF9lZG1vbmRzX21heGltdW1fY2FyZGluYWxpdHlfbWF0Y2hpbmc8L3R0PiBvciAKPHR0PmVkbW9uZHNfbWF4aW11bV9jYXJkaW5hbGl0eV9tYXRjaGluZzwvdHQ+LCBhbGwgdGhyZWUgb2YgdGhlc2UKc3RlcHMgYXJlIGNob3NlbiBmb3IgeW91LCBidXQgaXQncyBlYXN5IHRvIHBsdWcgaW4gZGlmZmVyZW50IGFsZ29yaXRobXMgZm9yIHRoZXNlIHRocmVlIHN0ZXBzCnVzaW5nIGEgZ2VuZXJpYyBtYXRjaGluZyBmdW5jdGlvbiBkaXNjdXNzZWQgYmVsb3cgLSBpbiBmYWN0LCBib3RoIDx0dD5jaGVja2VkX2VkbW9uZHNfbWF4aW11bV9jYXJkaW5hbGl0eV9tYXRjaGluZzwvdHQ+IAphbmQgPHR0PmVkbW9uZHNfbWF4aW11bV9jYXJkaW5hbGl0eV9tYXRjaGluZzwvdHQ+IGFyZSBqdXN0IGlubGluZWQgc3BlY2lhbGl6YXRpb25zIG9mIHRoaXMgZnVuY3Rpb24uIAoKPHA+CldoZW4gcXVvdGluZyB0aW1lIGJvdW5kcyBmb3IgYWxnb3JpdGhtcywgd2UgYXNzdW1lIHRoYXQgPHR0PlZlcnRleEluZGV4TWFwPC90dD4gaXMgYSBwcm9wZXJ0eSBtYXAgCnRoYXQgYWxsb3dzIGZvciBjb25zdGFudC10aW1lIG1hcHBpbmcgYmV0d2VlbiB2ZXJ0aWNlcyBhbmQgaW5kaWNlcyAod2hpY2ggaXMgZWFzaWx5IGFjaGlldmVkIGlmLCAKZm9yIGluc3RhbmNlLCB0aGUgdmVydGljZXMgYXJlIHN0b3JlZCBpbiBjb250aWd1b3VzIG1lbW9yeS4pIFdlIHVzZSA8aT5uPC9pPiBhbmQgPGk+bTwvaT4gdG8gcmVwcmVzZW50IHRoZSBzaXplIApvZiB0aGUgdmVydGV4IGFuZCBlZGdlIHNldHMsIHJlc3BlY3RpdmVseSwgb2YgdGhlIGlucHV0IGdyYXBoLgoKPGg0PkFsZ29yaXRobXMgZm9yIENyZWF0aW5nIGFuIEluaXRpYWwgTWF0Y2hpbmc8L2g0PgoKPHVsPgo8bGk+PGI+PHR0PmVtcHR5X21hdGNoaW5nPC90dD48L2I+OiBUYWtlcyB0aW1lIDxpPk8obik8L2k+IHRvIGluaXRpYWxpemUgdGhlIGVtcHR5IG1hdGNoaW5nLgo8bGk+PGI+PHR0PmdyZWVkeV9tYXRjaGluZzwvdHQ+PC9iPjogVGhlIG1hdGNoaW5nIG9idGFpbmVkIGJ5IGl0ZXJhdGluZyB0aHJvdWdoIHRoZSBlZGdlcyBhbmQgYWRkaW5nIGFuIGVkZ2UKaWYgaXQgZG9lc24ndCBjb25mbGljdCB3aXRoIHRoZSBlZGdlcyBhbHJlYWR5IGluIHRoZSBtYXRjaGluZy4gVGhpcyBtYXRjaGluZyBpcyBtYXhpbWFsLCBhbmQgaXMgdGhlcmVmb3JlCmd1YXJhbnRlZWQgdG8gY29udGFpbiBhdCBsZWFzdCBoYWxmIG9mIHRoZSBlZGdlcyB0aGF0IGEgbWF4aW11bSBtYXRjaGluZyBoYXMuIFRha2VzIHRpbWUgPGk+TyhtIGxvZyBuKTwvaT4uCjxsaT48Yj48dHQ+ZXh0cmFfZ3JlZWR5X21hdGNoaW5nPC90dD48L2I+OiBTb3J0cyB0aGUgZWRnZXMgaW4gaW5jcmVhc2luZyBvcmRlciBvZiB0aGUgZGVncmVlIG9mIHRoZSB2ZXJ0aWNlcwpjb250YWluZWQgaW4gZWFjaCBlZGdlLCB0aGVuIGNvbnN0cnVjdHMgYSBncmVlZHkgbWF0Y2hpbmcgZnJvbSB0aG9zZSBlZGdlcy4gQWxzbyBhIG1heGltYWwgbWF0Y2hpbmcsIGFuZCBjYW4Kc29tZXRpbWVzIGJlIG11Y2ggY2xvc2VyIHRvIHRoZSBtYXhpbXVtIGNhcmRpbmFsaXR5IG1hdGNoaW5nIHRoYW4gYSBzaW1wbGUgPHR0PmdyZWVkeV9tYXRjaGluZzwvdHQ+LiAKVGFrZXMgdGltZSA8aT5PKG0gbG9nIG4pPC9pPiwgYnV0IHRoZSBjb25zdGFudHMgaW52b2x2ZWQgbWFrZSB0aGlzIGEgc2xvd2VyIGFsZ29yaXRobSB0aGFuIAo8dHQ+Z3JlZWR5X21hdGNoaW5nPC90dD4uCjwvdWw+Cgo8aDQ+QWxnb3JpdGhtcyBmb3IgRmluZGluZyBhbiBBdWdtZW50aW5nIFBhdGg8L2g0PgoKPHVsPgo8bGk+PGI+PHR0PmVkbW9uZHNfYXVnbWVudGluZ19wYXRoX2ZpbmRlcjwvdHQ+PC9iPjogRmluZHMgYW4gYXVnbWVudGluZyBwYXRoIGluIHRpbWUgPGk+TyhtIGFscGhhKG0sbikpPC9pPiwgCndoZXJlIDxpPmFscGhhKG0sbik8L2k+IGlzIGFuIGludmVyc2Ugb2YgdGhlIEFja2VybWFuIGZ1bmN0aW9uLiA8aT5hbHBoYShtLG4pPC9pPiBpcyBvbmUgb2YgdGhlIHNsb3dlc3QgCmdyb3dpbmcgZnVuY3Rpb25zIHRoYXQgb2NjdXJzIG5hdHVyYWxseSBpbiBjb21wdXRlciBzY2llbmNlOyBlc3NlbnRpYWxseSwgPGk+YWxwaGEobSxuKTwvaT4gJmxlOyA0IGZvciBhbnkgCmdyYXBoIHRoYXQgd2UnZCBldmVyIGhvcGUgdG8gcnVuIHRoaXMgYWxnb3JpdGhtIG9uLiBTaW5jZSB3ZSBhcnJpdmUgYXQgYSBtYXhpbXVtIGNhcmRpbmFsaXR5IG1hdGNoaW5nIGFmdGVyIAphdWdtZW50aW5nIDxpPk8obik8L2k+IG1hdGNoaW5ncywgdGhlIGVudGlyZSBhbGdvcml0aG0gdGFrZXMgdGltZSA8aT5PKG1uIGFscGhhKG0sbikpPC9pPi4gRWRtb25kcycgb3JpZ2luYWwKYWxnb3JpdGhtIGFwcGVhcmVkIGluIFs8YSBocmVmPSJiaWJsaW9ncmFwaHkuaHRtbCNlZG1vbmRzNjUiPjY0PC9hPl0sIGJ1dCBvdXIgaW1wbGVtZW50YXRpb24gb2YgCkVkbW9uZHMnIGFsZ29yaXRobSBjbG9zZWx5IGZvbGxvd3MgVGFyamFuJ3MgCmRlc2NyaXB0aW9uIG9mIHRoZSBhbGdvcml0aG0gZnJvbSBbPGEgaHJlZj0iYmlibGlvZ3JhcGh5Lmh0bWwjdGFyamFuODM6X2RhdGFfc3RydWN0X25ldHdvcmtfYWxnbyI+Mjc8L2E+XS4KPGxpPjxiPjx0dD5ub19hdWdtZW50aW5nX3BhdGhfZmluZGVyPC90dD48L2I+OiBDYW4gYmUgdXNlZCBpZiBubyBhdWdtZW50YXRpb24gb2YgdGhlIGluaXRpYWwgbWF0Y2hpbmcgaXMgZGVzaXJlZC4KPC91bD4KCjxoND5WZXJpZmljYXRpb24gQWxnb3JpdGhtczwvaDQ+Cgo8dWw+CjxsaT48Yj48dHQ+bWF4aW11bV9jYXJkaW5hbGl0eV9tYXRjaGluZ192ZXJpZmllcjwvdHQ+PC9iPjogUmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBtYXRjaGluZyBmb3VuZCBpcyBhIAptYXhpbXVtIGNhcmRpbmFsaXR5IG1hdGNoaW5nLiBUYWtlcyB0aW1lIDxpPk8obSBhbHBoYShtLG4pKTwvaT4sIHdoaWNoIGlzIG9uIHRoZSBvcmRlciBvZiBhIHNpbmdsZSBpdGVyYXRpb24gCm9mIEVkbW9uZHMnIGFsZ29yaXRobS4KPGxpPjxiPjx0dD5ub19tYXRjaGluZ192ZXJpZmllcjwvdHQ+PC9iPjogQWx3YXlzIHJldHVybnMgdHJ1ZQo8L3VsPgoKV2h5IGlzIGEgdmVyaWZpY2F0aW9uIGFsZ29yaXRobSBuZWVkZWQ/IEVkbW9uZHMnIGFsZ29yaXRobSBpcyBmYWlybHkgY29tcGxleCwgYW5kIGl0J3MgbmVhcmx5IAppbXBvc3NpYmxlIGZvciBhIGh1bWFuIHdpdGhvdXQgYSBmZXcgZGF5cyBvZiBzcGFyZSB0aW1lIHRvIGZpZ3VyZSBvdXQgaWYgdGhlIG1hdGNoaW5nIHByb2R1Y2VkIGJ5IAo8dHQ+ZWRtb25kc19tYXRjaGluZzwvdHQ+IG9uIGEgZ3JhcGggd2l0aCwgc2F5LCAxMDAgdmVydGljZXMgYW5kIDUwMCBlZGdlcyBpcyBpbmRlZWQgYSBtYXhpbXVtIGNhcmRpbmFsaXR5IAptYXRjaGluZy4gQSB2ZXJpZmljYXRpb24gYWxnb3JpdGhtIGNhbiBkbyB0aGlzIG1lY2hhbmljYWxseSwgYW5kIGl0J3MgbXVjaCBlYXNpZXIgdG8gdmVyaWZ5IGJ5IGluc3BlY3Rpb24gCnRoYXQgdGhlIHZlcmlmaWNhdGlvbiBhbGdvcml0aG0gaGFzIGJlZW4gaW1wbGVtZW50ZWQgY29ycmVjdGx5IHRoYW4gaXQgaXMgdG8gdmVyaWZ5IGJ5IGluc3BlY3Rpb24gdGhhdCAKRWRtb25kcycgYWxnb3JpdGhtIGhhcyBiZWVuIGltcGxlbWVudGVkIGNvcnJlY3RseS4gClRoZSBCb29zdCBHcmFwaCBsaWJyYXJ5IG1ha2VzIGl0IGluY3JlZGlibHkgc2ltcGxlIHRvIHBlcmZvcm0gdGhlIHN1YnJvdXRpbmVzIG5lZWRlZCBieSB0aGUgdmVyaWZpZXIgCihzdWNoIGFzIGZpbmRpbmcgYWxsIHRoZSBjb25uZWN0ZWQgY29tcG9uZW50cyBvZiBvZGQgY2FyZGluYWxpdHkgaW4gYSBncmFwaCwgb3IgY3JlYXRpbmcgdGhlIGluZHVjZWQgZ3JhcGggCm9uIGFsbCB2ZXJ0aWNlcyB3aXRoIGEgY2VydGFpbiBsYWJlbCkgaW4ganVzdCBhIGZldyBsaW5lcyBvZiBjb2RlLgoKPHA+ClVuZGVyc3RhbmRpbmcgaG93IHRoZSB2ZXJpZmllciB3b3JrcyByZXF1aXJlcyBhIGZldyBncmFwaC10aGVvcmV0aWMgZmFjdHMuIApMZXQgPGk+bShHKTwvaT4gYmUgdGhlIHNpemUgb2YgYSBtYXhpbXVtIGNhcmRpbmFsaXR5IG1hdGNoaW5nIGluIHRoZSBncmFwaCA8aT5HPC9pPi4KRGVub3RlIGJ5IDxpPm8oRyk8L2k+IHRoZSBudW1iZXIgb2YgY29ubmVjdGVkIGNvbXBvbmVudHMgaW4gPGk+RzwvaT4gb2Ygb2RkIGNhcmRpbmFsaXR5LCBhbmQgZm9yIGEgc2V0IG9mIAp2ZXJ0aWNlcyA8aT5YPC9pPiwgZGVub3RlIGJ5IDxpPkcgLSBYPC9pPiB0aGUgaW5kdWNlZCBncmFwaCBvbiB0aGUgdmVydGV4IHNldCA8aT5WKEcpIC0gWDwvaT4uIFRoZW4gdGhlIApUdXR0ZS1CZXJnZSBGb3JtdWxhIHNheXMgdGhhdAo8YmxvY2txdW90ZT4KPGk+MiAqIG0oRykgPSBtaW4gKCB8VihHKXwgKyB8WHwgLSBvKEctWCkgKTwvaT4KPC9ibG9ja3F1b3RlPgpXaGVyZSB0aGUgbWluaW11bSBpcyB0YWtlbiBvdmVyIGFsbCBzdWJzZXRzIDxpPlg8L2k+IG9mIHRoZSB2ZXJ0ZXggc2V0IDxpPlYoRyk8L2k+LiBBIHNpZGUgZWZmZWN0IG9mIHRoZSAKRWRtb25kcyBCbG9zc29tLVNocmlua2luZyBhbGdvcml0aG0gaXMgdGhhdCBpdCBjb21wdXRlcyB3aGF0IGlzIGtub3duIGFzIHRoZSBFZG1vbmRzLUdhbGxhaSBkZWNvbXBvc2l0aW9uIApvZiBhIGdyYXBoOiBpdCBkZWNvbXBvc2VzIHRoZSBncmFwaCBpbnRvIHRocmVlIGRpc2pvaW50IHNldHMgb2YgdmVydGljZXMsIG9uZSBvZiB3aGljaCBhY2hpZXZlcyB0aGUgbWluaW11bSAKaW4gdGhlIFR1dHRlLUJlcmdlIEZvcm11bGEuCgpBbiBvdXRsaW5lIG9mIG91ciB2ZXJpZmljYXRpb24gcHJvY2VkdXJlIGlzOgoKR2l2ZW4gYSA8dHQ+R3JhcGggZzwvdHQ+IGFuZCA8dHQ+TWF0ZU1hcCBtYXRlPC90dD4sCjxvbD4KPGxpPkNoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IDx0dD5tYXRlPC90dD4gaXMgYSB2YWxpZCBtYXRjaGluZyBvbiA8dHQ+ZzwvdHQ+Lgo8bGk+UnVuIDx0dD5lZG1vbmRzX2F1Z21lbnRpbmdfcGF0aF9maW5kZXI8L3R0PiBvbmNlIG9uIDx0dD5nPC90dD4gYW5kIDx0dD5tYXRlPC90dD4uIElmIGl0IGZpbmRzIGFuIGF1Z21lbnRpbmcKcGF0aCwgdGhlIG1hdGNoaW5nIGlzbid0IGEgbWF4aW11bSBjYXJkaW5hbGl0eSBtYXRjaGluZy4gT3RoZXJ3aXNlLCB3ZSByZXRyaWV2ZSBhIGNvcHkgb2YgdGhlIDx0dD52ZXJ0ZXhfc3RhdGU8L3R0PgptYXAgdXNlZCBieSB0aGUgPHR0PmVkbW9uZHNfYXVnbWVudGluZ19wYXRoX2ZpbmRlcjwvdHQ+LiBUaGUgRWRtb25kcy1HYWxsYWkgZGVjb21wb3NpdGlvbiB0ZWxscyB1cyB0aGF0IHRoZSBzZXQKb2YgdmVydGljZXMgbGFiZWxlZCA8dHQ+Vl9PREQ8L3R0PiBieSB0aGUgPHR0PnZlcnRleF9zdGF0ZTwvdHQ+IG1hcCBjYW4gYmUgdXNlZCBhcyB0aGUgc2V0IFggdG8gYWNoaWV2ZSB0aGUgCm1pbmltdW0gaW4gdGhlIFR1dHRlLUJlcmdlIEZvcm11bGEuCjxsaT5Db3VudCB0aGUgbnVtYmVyIG9mIHZlcnRpY2VzIGxhYmVsZWQgPHR0PlZfT0REPC90dD4sIHN0b3JlIHRoaXMgaW4gPHR0Pm51bV9vZGRfdmVydGljZXM8L3R0Pi4KPGxpPkNyZWF0ZSBhIDxhIGhyZWY9ImZpbHRlcmVkX2dyYXBoLmh0bWwiPjx0dD5maWx0ZXJlZF9ncmFwaDwvdHQ+PC9hPgpjb25zaXN0aW5nIG9mIGFsbCB2ZXJ0aWNlcyB0aGF0IGFyZW4ndCBsYWJlbGVkIDx0dD5WX09ERDwvdHQ+LiBDb3VudCB0aGUgbnVtYmVyIG9mIG9kZCBjb25uZWN0ZWQgY29tcG9uZW50cwppbiB0aGlzIGdyYXBoIGFuZCBzdG9yZSB0aGUgcmVzdWx0IGluIDx0dD5udW1fb2RkX2Nvbm5lY3RlZF9jb21wb25lbnRzPC90dD4uCjxsaT5UZXN0IHRvIHNlZSBpZiBlcXVhbGl0eSBob2xkcyBpbiB0aGUgVHV0dGUtQmVyZ2UgZm9ybXVsYSB1c2luZyB8WHwgPSA8dHQ+bnVtX29kZF92ZXJ0aWNlczwvdHQ+IGFuZCBvKEctWCkgPSA8dHQ+bnVtX29kZF9jb25uZWN0ZWRfY29tcG9uZW50czwvdHQ+LiBSZXR1cm4gdHJ1ZSBpZiBpdCBob2xkcywgZmFsc2Ugb3RoZXJ3aXNlLgo8L29sPgoKQXNzdW1pbmcgdGhlc2Ugc3RlcHMgYXJlIGltcGxlbWVudGVkIGNvcnJlY3RseSwgdGhlIHZlcmlmaWVyIHdpbGwgbmV2ZXIgcmV0dXJuIGEgZmFsc2UgcG9zaXRpdmUsCmFuZCB3aWxsIG9ubHkgcmV0dXJuIGEgZmFsc2UgbmVnYXRpdmUgaWYgPHR0PmVkbW9uZHNfYXVnbWVudGluZ19wYXRoX2ZpbmRlcjwvdHQ+IGRvZXNuJ3QgY29tcHV0ZSB0aGUKPHR0PnZlcnRleF9zdGF0ZTwvdHQ+IG1hcCBjb3JyZWN0bHksIGluIHdoaWNoIGNhc2UgdGhlIDx0dD5lZG1vbmRzX2F1Z21lbnRpbmdfcGF0aF9maW5kZXI8L3R0Pgppc24ndCB3b3JraW5nIGNvcnJlY3RseS4gCgoKPGg0PkNyZWF0aW5nIFlvdXIgT3duIE1hdGNoaW5nIEFsZ29yaXRobXM8L2g0PgoKQ3JlYXRpbmcgYSBtYXRjaGluZyBhbGdvcml0aG0gaXMgYXMgc2ltcGxlIGFzIHBsdWdnaW5nIHRoZSBhbGdvcml0aG1zIGRlc2NyaWJlZCBhYm92ZSBpbnRvIGEgZ2VuZXJpYwptYXRjaGluZyBmdW5jdGlvbiwgd2hpY2ggaGFzIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlOgo8cHJlPgp0ZW1wbGF0ZSAmbHQ7dHlwZW5hbWUgR3JhcGgsIAoJICB0eXBlbmFtZSBNYXRlTWFwLAoJICB0eXBlbmFtZSBWZXJ0ZXhJbmRleE1hcCwKCSAgdGVtcGxhdGUgJmx0O3R5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWUmZ3Q7IGNsYXNzIEF1Z21lbnRpbmdQYXRoRmluZGVyLCAKCSAgdGVtcGxhdGUgJmx0O3R5cGVuYW1lLCB0eXBlbmFtZSZndDsgY2xhc3MgSW5pdGlhbE1hdGNoaW5nRmluZGVyLAoJICB0ZW1wbGF0ZSAmbHQ7dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZSZndDsgY2xhc3MgTWF0Y2hpbmdWZXJpZmllciZndDsKICBib29sIG1hdGNoaW5nKGNvbnN0IEdyYXBoJiBnLCBNYXRlTWFwIG1hdGUsIFZlcnRleEluZGV4TWFwIHZtKQo8L3ByZT4KVGhlIG1hdGNoaW5nIGZ1bmN0aW9ucyBwcm92aWRlZCBmb3IgeW91IGFyZSBqdXN0IGlubGluZWQgc3BlY2lhbGl6YXRpb25zIG9mIHRoaXMgZnVuY3Rpb246Cjx0dD5lZG1vbmRzX21heGltdW1fY2FyZGluYWxpdHlfbWF0Y2hpbmc8L3R0PiB1c2VzIDx0dD5lZG1vbmRzX2F1Z21lbnRpbmdfcGF0aF9maW5kZXI8L3R0PiAKYXMgdGhlIDx0dD5BdWdtZW50aW5nUGF0aEZpbmRlcjwvdHQ+LCA8dHQ+ZXh0cmFfZ3JlZWR5X21hdGNoaW5nPC90dD4gYXMgdGhlIDx0dD5Jbml0aWFsTWF0Y2hpbmdGaW5kZXI8L3R0PiwgCmFuZCA8dHQ+bm9fbWF0Y2hpbmdfdmVyaWZpZXI8L3R0PiBhcyB0aGUgPHR0Pk1hdGNoaW5nVmVyaWZpZXI8L3R0Pi4gCjx0dD5jaGVja2VkX2VkbW9uZHNfbWF4aW11bV9jYXJkaW5hbGl0eV9tYXRjaGluZzwvdHQ+IHVzZXMgdGhlIHNhbWUgcGFyYW1ldGVycyBleGNlcHQgdGhhdAo8dHQ+bWF4aW11bV9jYXJkaW5hbGl0eV9tYXRjaGluZ192ZXJpZmllcjwvdHQ+IGlzIHVzZWQgZm9yIHRoZSA8dHQ+TWF0Y2hpbmdWZXJpZmllcjwvdHQ+LgoKPHA+ClRoZXNlIGFyZW4ndCBuZWNlc3NhcmlseSB0aGUgYmVzdCBjaG9pY2VzIGZvciBhbnkgc2l0dWF0aW9uIC0gZm9yIGV4YW1wbGUsIGl0J3MgYmVlbiBjbGFpbWVkIGluIHRoZSBsaXRlcmF0dXJlCnRoYXQgZm9yIHNwYXJzZSBncmFwaHMsIEVkbW9uZHMnIGFsZ29yaXRobSBjb252ZXJnZXMgdG8gdGhlIG1heGltdW0gY2FyZGluYWxpdHkgbWF0Y2hpbmcgbW9yZSBxdWlja2x5IGlmIGl0IAppc24ndCBzdXBwbGllZCB3aXRoIGFuIGludGl0aWFsIG1hdGNoaW5nLiBTdWNoIGFuIGFsZ29yaXRobSBjYW4gYmUgZWFzaWx5IGFzc2VtYmxlZCBieSBjYWxsaW5nIDx0dD5tYXRjaGluZzwvdHQ+IHdpdGgKPHVsPgo8bGk+PHR0PkF1Z21lbnRpbmdQYXRoRmluZGVyID0gZWRtb25kc19hdWdtZW50aW5nX3BhdGhfZmluZGVyPC90dD4KPGxpPjx0dD5Jbml0aWFsTWF0Y2hpbmdGaW5kZXIgPSBlbXB0eV9tYXRjaGluZzwvdHQ+CjwvdWw+CmFuZCBjaG9vc2luZyB0aGUgPHR0Pk1hdGNoaW5nVmVyaWZpZXI8L3R0PiBkZXBlbmRpbmcgb24gaG93IGNhcmVmdWwgeW91J3JlIGZlZWxpbmcuCgo8cD4KU3VwcG9zZSBpbnN0ZWFkIHRoYXQgeW91IHdhbnQgYSByZWxhdGl2ZWx5IGxhcmdlIG1hdGNoaW5nIHF1aWNrbHksIGJ1dCBhcmUgbm90IGV4YWN0bHkgaW50ZXJlc3RlZCBpbiBhIG1heGltdW0gbWF0Y2hpbmcuIApCb3RoIGV4dHJhX2dyZWVkeV9tYXRjaGluZyBhbmQgZ3JlZWR5X21hdGNoaW5nIGZpbmQgbWF4aW1hbCBtYXRjaGluZ3MsIHdoaWNoIG1lYW5zIHRoZXkncmUgZ3VhcmFudGVlZCB0byBiZSBhdCAKbGVhc3QgaGFsZiB0aGUgc2l6ZSBvZiBhIG1heGltdW0gY2FyZGluYWxpdHkgbWF0Y2hpbmcsIHNvIHlvdSBjb3VsZCBjYWxsIDx0dD5tYXRjaGluZzwvdHQ+IHdpdGgKPHVsPgo8bGk+PHR0PkF1Z21lbnRpbmdQYXRoRmluZGVyID0gbm9fYXVnbWVudGluZ19wYXRoX2ZpbmRlcjwvdHQ+CjxsaT48dHQ+SW5pdGlhbE1hdGNoaW5nRmluZGVyID0gZXh0cmFfZ3JlZWR5X21hdGNoaW5nPC90dD4KPGxpPjx0dD5NYXRjaGluZ1ZlcmlmaWVyID0gbWF4aW11bV9jYXJkaW5hbGl0eV9tYXRjaGluZ192ZXJpZmllcjwvdHQ+CjwvdWw+ClRoZSByZXN1bHRpbmcgYWxnb3JpdGhtIHdpbGwgZmluZCBhbiBleHRyYSBncmVlZHkgbWF0Y2hpbmcgaW4gdGltZSA8aT5PKG0gbG9nIG4pPC9pPiB3aXRob3V0IGxvb2tpbmcgZm9yIAphdWdtZW50aW5nIHBhdGhzLiBBcyBhIGJvbnVzLCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoaXMgZnVuY3Rpb24gaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgZXh0cmEgZ3JlZWR5IAptYXRjaGluZyBoYXBwZW5zIHRvIGJlIGEgbWF4aW11bSBjYXJkaW5hbGl0eSBtYXRjaGluZy4KCjwvcD48aDM+V2hlcmUgRGVmaW5lZDwvaDM+Cgo8cD4KPGEgaHJlZj0iLi4vLi4vLi4vYm9vc3QvZ3JhcGgvbWF4X2NhcmRpbmFsaXR5X21hdGNoaW5nLmhwcCI+PHR0PmJvb3N0L2dyYXBoL21heF9jYXJkaW5hbGl0eV9tYXRjaGluZy5ocHA8L3R0PjwvYT4KCgo8L3A+PGgzPlBhcmFtZXRlcnM8L2gzPgoKSU46IDx0dD5jb25zdCBHcmFwaCZhbXA7IGc8L3R0Pgo8YmxvY2txdW90ZT4KQW4gdW5kaXJlY3RlZCBncmFwaC4gVGhlIGdyYXBoIHR5cGUgbXVzdCBiZSBhIG1vZGVsIG9mIAo8YSBocmVmPSJWZXJ0ZXhBbmRFZGdlTGlzdEdyYXBoLmh0bWwiPlZlcnRleCBhbmQgRWRnZSBMaXN0IEdyYXBoPC9hPiBhbmQKPGEgaHJlZj0iSW5jaWRlbmNlR3JhcGguaHRtbCI+SW5jaWRlbmNlIEdyYXBoPC9hPi48YnI+CjwvYmxvY2txdW90ZT4KCklOOiA8dHQ+VmVydGV4SW5kZXhNYXAgdm08L3R0Pgo8YmxvY2txdW90ZT4KTXVzdCBiZSBhIG1vZGVsIG9mIDxhIGhyZWY9Ii4uLy4uL3Byb3BlcnR5X21hcC9kb2MvUmVhZGFibGVQcm9wZXJ0eU1hcC5odG1sIj5SZWFkYWJsZVByb3BlcnR5TWFwPC9hPiwgbWFwcGluZyB2ZXJ0aWNlcyB0byBpbnRlZ2VyIGluZGljZXMuCjwvYmxvY2txdW90ZT4KCk9VVDogPHR0Pk1hdGVNYXAgbWF0ZTwvdHQ+CjxibG9ja3F1b3RlPgpNdXN0IGJlIGEgbW9kZWwgb2YgPGEgaHJlZj0iLi4vLi4vcHJvcGVydHlfbWFwL2RvYy9SZWFkV3JpdGVQcm9wZXJ0eU1hcC5odG1sIj5SZWFkV3JpdGVQcm9wZXJ0eU1hcDwvYT4sIG1hcHBpbmcKdmVydGljZXMgdG8gdmVydGljZXMuIEZvciBhbnkgdmVydGV4IHYgaW4gdGhlIGdyYXBoLCA8dHQ+Z2V0KG1hdGUsdik8L3R0PiB3aWxsIGJlIHRoZSB2ZXJ0ZXggdGhhdCB2IGlzIG1hdGNoZWQgdG8sIG9yCjx0dD5ncmFwaF90cmFpdHM8R3JhcGg+OjpudWxsX3ZlcnRleCgpPC90dD4gaWYgdiBpc24ndCBtYXRjaGVkLgo8L2Jsb2NrcXVvdGU+Cgo8aDM+Q29tcGxleGl0eTwvaDM+Cgo8cD4KTGV0IDxpPm08L2k+IGFuZCA8aT5uPC9pPiBiZSB0aGUgbnVtYmVyIG9mIGVkZ2VzIGFuZCB2ZXJ0aWNlcyBpbiB0aGUgaW5wdXQgZ3JhcGgsIHJlc3BlY3RpdmVseS4gQXNzdW1pbmcgdGhlIAo8dHQ+VmVydGV4SW5kZXhNYXA8L3R0PiBzdXBwbGllZCBhbGxvd3MgY29uc3RhbnQtdGltZSBsb29rdXBzLCB0aGUgdGltZSBjb21wbGV4aXR5IGZvciBib3RoIAo8dHQ+ZWRtb25kc19tYXRjaGluZzwvdHQ+IGFuZCA8dHQ+Y2hlY2tlZF9lZG1vbmRzX21hdGNoaW5nPC90dD4gaXMgPGk+TyhtbiBhbHBoYShtLG4pKTwvaT4uIAo8aT5hbHBoYShtLG4pPC9pPiBpcyBhIHNsb3cgZ3Jvd2luZyBmdW5jdGlvbiB0aGF0IGlzIGF0IG1vc3QgNCBmb3IgYW55IGZlYXNpYmxlIGlucHV0Lgo8L3A+PHA+Cgo8L3A+PGgzPkV4YW1wbGU8L2gzPgoKPHA+IFRoZSBmaWxlIDxhIGhyZWY9Ii4uL2V4YW1wbGUvbWF0Y2hpbmdfZXhhbXBsZS5jcHAiPjx0dD5leGFtcGxlL21hdGNoaW5nX2V4YW1wbGUuY3BwPC90dD48L2E+CmNvbnRhaW5zIGFuIGV4YW1wbGUuCgo8YnI+CjwvcD48aHI+Cjx0YWJsZT4KPHRib2R5Pjx0ciB2YWxpZ249InRvcCI+Cjx0ZCBub3dyYXA9Im5vd3JhcCI+Q29weXJpZ2h0IKkgMjAwNTwvdGQ+PHRkPgpBYXJvbiBXaW5kc29yICg8YSBocmVmPSJtYWlsdG86YWFyb24ud2luZHNvckBnbWFpbC5jb20iPmFhcm9uLndpbmRzb3JAZ21haWwuY29tPC9hPik8YnI+CjwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+Cgo8L2JvZHk+PC9odG1sPgo=