# smd_random_banner 0.3 # Random image or file chosen by category/text/article field. Use for advertising or fun # Stef Dawson # http://stefdawson.com/ # ...................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ...................................................................... YTo5OntzOjQ6Im5hbWUiO3M6MTc6InNtZF9yYW5kb21fYmFubmVyIjtzOjY6ImF1dGhvciI7czoxMToiU3RlZiBEYXdzb24iO3M6MTA6ImF1dGhvcl91cmkiO3M6MjI6Imh0dHA6Ly9zdGVmZGF3c29uLmNvbS8iO3M6NzoidmVyc2lvbiI7czozOiIwLjMiO3M6MTE6ImRlc2NyaXB0aW9uIjtzOjg2OiJSYW5kb20gaW1hZ2Ugb3IgZmlsZSBjaG9zZW4gYnkgY2F0ZWdvcnkvdGV4dC9hcnRpY2xlIGZpZWxkLiBVc2UgZm9yIGFkdmVydGlzaW5nIG9yIGZ1biI7czo0OiJoZWxwIjtzOjM0ODMxOiI8c3R5bGU+DQpjb2RlIHtjb2xvcjogIzIwNDY2Zn0NCnByZSB7cGFkZGluZzogMC41ZW0gMWVtOyBiYWNrZ3JvdW5kOiAjZWVlOyBib3JkZXI6IDFweCBkYXNoZWQgI2NjYzt9DQpoMSwgaDIsIGgzLCBoMyBjb2RlIHtmb250LWZhbWlseTogc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IGJvbGQ7fQ0KaDEsIGgyLCBoMyB7bWFyZ2luLWxlZnQ6IC0xZW07fQ0KaDIsIGgzIHttYXJnaW4tdG9wOiAyZW07fQ0KaDEge2ZvbnQtc2l6ZTogM2VtO30NCmgyIHtmb250LXNpemU6IDJlbTt9DQpoMyB7Zm9udC1zaXplOiAxLjVlbTt9DQpsaSBhIGNvZGUge2ZvbnQtd2VpZ2h0OiBub3JtYWw7fQ0KLnJlcXVpcmVkLCAud2FybmluZyB7Y29sb3I6cmVkO30NCiNlZ3RhYiB0ZCwjZWd0YWIgdGgge3BhZGRpbmc6LjdlbTsgYm9yZGVyOjFweCBzb2xpZCAjODg4O3RleHQtYWxpZ246Y2VudGVyO30NCjwvc3R5bGU+DQo8aDEgaWQ9InRvcCI+c21kX3JhbmRvbV9iYW5uZXI8L2gxPg0KPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdXNhZ2UsIGJ1Z3MsIGZlYXR1cmVzIGV0YywgcGxlYXNlIDxhIGhyZWY9Imh0dHA6Ly9mb3J1bS50ZXh0cGF0dGVybi5jb20vdmlld3RvcGljLnBocD9pZD0xNjQ0OCI+dmlzaXQgdGhlIGZvcnVtIHRocmVhZDwvYT4uPC9wPg0KDQo8cCBjbGFzcz0icmVxdWlyZWQiPlJlcXVpcmVzIDxhIGhyZWY9Imh0dHA6Ly9zdGVmZGF3c29uLmNvbS9kb3dubG9hZHMvc21kX2xpYl92MC4yMWQudHh0Ij5zbWRfbGliIHYwLjIxZDwvYT4gdG8gYmUgaW5zdGFsbGVkIGFuZCBhY3RpdmF0ZWQuPHA+DQoNCjxoMiBpZD0iY29udGVudHMiPkNvbnRlbnRzPC9oMj4NCjx1bD4NCjxsaT48YSBocmVmPSIjb3ZlcnZpZXciPk92ZXJ2aWV3PC9hPjwvbGk+DQo8bGk+PGEgaHJlZj0iI2ltZ21vZGUiPkltYWdlIG1vZGU8L2E+DQo8dWw+DQo8bGk+PGEgaHJlZj0iI2ltZ2F0dHMiPkF0dHJpYnV0ZXM8L2E+DQo8dWw+DQo8bGk+PGEgaHJlZj0iI21vZGUiPm1vZGU8L2E+PC9saT4NCjxsaT48YSBocmVmPSIjY2F0ZWdvcnkiPmNhdGVnb3J5PC9hPjwvbGk+DQo8bGk+PGEgaHJlZj0iI3N1YmNhdHMiPnN1YmNhdHM8L2E+PC9saT4NCjxsaT48YSBocmVmPSIjbWF0Y2h0ZXh0Ij5tYXRjaF90ZXh0PC9hPjwvbGk+DQo8bGk+PGEgaHJlZj0iI2F2b2lkdGV4dCI+YXZvaWRfdGV4dDwvYT48L2xpPg0KPGxpPjxhIGhyZWY9IiNpbWdjb21wYXJldG8iPmNvbXBhcmVfdG88L2E+PC9saT4NCjxsaT48YSBocmVmPSIjaWRwcmVmaXgiPmlkX3ByZWZpeDwvYT48L2xpPg0KPGxpPjxhIGhyZWY9IiNsaW1pdCI+bGltaXQ8L2E+PC9saT4NCjxsaT48YSBocmVmPSIjYWx3YXlzZGlzcGxheSI+YWx3YXlzX2Rpc3BsYXk8L2E+PC9saT4NCjxsaT48YSBocmVmPSIjdGh1bWIiPnRodW1iPC9hPjwvbGk+DQo8bGk+PGEgaHJlZj0iI2ltZ2xpbmtpbiI+bGlua19pbjwvYT48L2xpPg0KPGxpPjxhIGhyZWY9IiNsaW5rcHJlZml4Ij5saW5rX3ByZWZpeDwvYT48L2xpPg0KPGxpPjxhIGhyZWY9IiNyZWZlcmVyIj5yZWZlcmVyPC9hPjwvbGk+DQo8bGk+PGEgaHJlZj0iI2ltZ2ltZ2NsYXNzIj5pbWdjbGFzczwvYT48L2xpPg0KPGxpPjxhIGhyZWY9IiNyYXd1cmwiPnJhd191cmw8L2E+PC9saT4NCjxsaT48YSBocmVmPSIjdGFyZ2V0Ij50YXJnZXQ8L2E+PC9saT4NCjwvdWw+PC9saT4NCjxsaT48YSBocmVmPSIjaW1nZXhhbXBsZXMiPkltYWdlIG1vZGUgZXhhbXBsZXM8L2E+PC9saT4NCjwvdWw+PC9saT4NCjxsaT48YSBocmVmPSIjZmlsZW1vZGUiPkZpbGUgbW9kZTwvYT4NCjx1bD4NCjxsaT48YSBocmVmPSIjZmlsZXdvcmtzIj5Ib3cgaXQgd29ya3M6IE1JTUUgdHlwZXM8L2E+PC9saT4NCjxsaT48YSBocmVmPSIjZmlsZWF0dHMiPkRpZmZlcmVudCBhdHRyaWJ1dGVzPC9hPg0KPHVsPg0KPGxpPjxhIGhyZWY9IiNmaWxlY29tcGFyZXRvIj5jb21wYXJlX3RvPC9hPjwvbGk+DQo8bGk+PGEgaHJlZj0iI2ZpbGVsaW5raW4iPmxpbmtfaW48L2E+PC9saT4NCjxsaT48YSBocmVmPSIjZmlsZWltZ2NsYXNzIj5pbWdjbGFzczwvYT48L2xpPg0KPGxpPjxhIGhyZWY9IiNjb3VudGRvd25sb2FkcyI+Y291bnRfZG93bmxvYWRzPC9hPjwvbGk+DQo8bGk+PGEgaHJlZj0iI2ZpbGVzZGlyIj5maWxlc19kaXI8L2E+PC9saT4NCjwvdWw+PC9saT4NCjxsaT48YSBocmVmPSIjZmlsZWV4YW1wbGVzIj5GaWxlIG1vZGUgZXhhbXBsZXM8L2E+PC9saT4NCjwvdWw+PC9saT4NCjxsaT48YSBocmVmPSIjY3JlZGl0cyI+Q3JlZGl0czwvYT48L2xpPg0KPC91bD4NCg0KPGgyIGlkPSJvdmVydmlldyI+T3ZlcnZpZXc8L2gyPg0KPHA+UmFuZG9tbHkgZGlzcGxheSBiYW5uZXJzIG9uIGEgcGFnZSBmb3IgY29zbWV0aWMgb3IgYWR2ZXJ0aXNpbmcgcHVycG9zZXMuIFRoZSBjb25jZXB0IGlzOiB3aGF0IGlmIHlvdSB3YW50IHRvIGFkdmVydGlzZSBvdGhlciBwYXJ0cyBvZiB5b3VyIHNpdGUgKGUuZy4gb3RoZXIgcHJvZHVjdHMvc2VydmljZXMpIHVzaW5nIGEgYmFubmVyIGFkPyBZb3Ugd2FudCBhbiBpbWFnZS9hbmltYXRlZCBnaWYvdmlkZW8vd2hhdGV2ZXIgdG8gYWR2ZXJ0aXNlIHRoZSBwcm9kdWN0cyBvciBzZXJ2aWNlcyBhbmQgd2hlbiBwZW9wbGUgY2xpY2sgb24gdGhlIGJhbm5lcnMsIHRoZXkgc2hvdWxkIGJlIHRha2VuIHRvIHRoZSBjb3JyZWN0IHBhcnQgb2YgdGhlIHNpdGUuIFRoZSBjcnVjaWFsIGRpZmZlcmVuY2UgaXMgdGhhdCBpdCBsb29rcyB2ZXJ5IGFtYXRldXIgdG8gYWR2ZXJ0aXNlIHRoZSBwcm9kdWN0IHRoZSBwZXJzb24gaXMgY3VycmVudGx5IGxvb2tpbmcgYXQgb24gdGhlIHNhbWUgcGFnZSBhcyB0aGUgcHJvZHVjdCBpdHNlbGYuPC9wPg0KPHA+VGhpcyBwbHVnaW4gYWxsb3dzIHlvdSB0byByYW5kb21seSBpbmNsdWRlL2V4Y2x1ZGUgY2xpY2thYmxlIGltYWdlcyBvciBmaWxlcywgYmFzZWQgb24gZml4ZWQgdGV4dCBzdHJpbmdzIG9yIHRoZSBjb250ZW50cyBvZiBhcnRpY2xlIGZpZWxkcy4gSXQgY2FuIGFsc28gYmUgdXNlZCB0byBzaW1wbHkgc3BydWNlIHVwIGEgcGFnZSBhbmQgc2hvdyBhIHJhbmRvbSBpbWFnZSBlYWNoIHRpbWUuPC9wPg0KPHA+RmVhdHVyZXM6PC9wPg0KPHVsPg0KPGxpPlR3byBtb2RlcyBvZiBvcGVyYXRpb246IGNsYXNzc2ljYWwgaW1hZ2VzIGZvciBzdGF0aWMgYmFubmVycywgb3IgZmlsZXMgZm9yIGZsYXNoL3ZpZGVvL21vdmluZyBiYW5uZXJzPC9saT4NCjxsaT5DaG9vc2UgaW1hZ2VzL2ZpbGVzIGJhc2VkIG9uIGdpdmVuIHRleHQsIG9yIGl0ZW1zIHJlYWQgZnJvbSB0aGUgZmllbGRzIG9mIHRoZSBjdXJyZW50IGFydGljbGU8L2xpPg0KPGxpPkFyYml0cmFyeSBpbmNsdXNpb24vZXhjbHVzaW9uIG9mIGNhdGVnb3JpZXM8L2xpPg0KPGxpPlN1YmNhdGVnb3JpZXM6IHNwZWNpZnkgYSBwYXJlbnQgYW5kIGFsbCBjaGlsZCBjYXRlZ29yaWVzIGFyZSBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkPC9saT4NCjxsaT5Nb3JlIHRoYW4gb25lIGJhbm5lciBwZXIgcGFnZSBvciB0YWcgc3VwcG9ydGVkPC9saT4NCjxsaT5CYW5uZXJzIGNhbiBsaW5rIHRvIGFueSBvdGhlciBVUkw8L2xpPg0KPGxpPlJ1ZGltZW50YXJ5IHJlZmVycmVyIHRyYWNraW5nIHRvIGFsbG93IGNsaWNrLXRocm91Z2ggcmF0ZXMgdG8gYmUgYW5hbHlzZWQgdmlhIFRYUCdzIGxvZyBmaWxlIHRvIHNlZSB3aGljaCBiYW5uZXJzIGFyZSBtb3N0IHBvcHVsYXI8L2xpPg0KPGxpPjxhIGhyZWY9Imh0dHA6Ly9mb3J1bS50ZXh0cGF0dGVybi5jb20vdmlld3RvcGljLnBocD9pZD0yMDY5MiI+TXVsdGktbGluZ3VhbCBQYWNrIChNTFApPC9hPiBhd2FyZSBmb3IgaW1hZ2UgY2FwdGlvbi9hbHQgc3RyaW5nczwvbGk+DQo8L3VsPg0KDQo8aDIgaWQ9ImltZ21vZGUiPkltYWdlIG1vZGU8L2gyPg0KPHA+SW4gaXRzIGJhc2UgZm9ybSwgdGhpcyBtb2RlIGZ1bmN0aW9ucyBleGFjdGx5IGFzIGRydV9yYW5kb21faW1hZ2UsIGkuZS4gcGlja3Mgb25lIHJhbmRvbSBpbWFnZSBmcm9tIHRoZSBlbnRpcmUgZGF0YWJhc2Ugb2YgaW1hZ2VzIGFuZCBkaXNwbGF5cyBpdC4gQnV0IGl0IGNhbiBkbyBhIHdob2xlIGxvdCBtb3JlLiBFYWNoIG9wdGlvbiB3aGl0dGxlcyB0aGUgaW1hZ2VzIGRvd24gZnVydGhlciwgYmFzZWQgb24gdmFyaW91cyBjcml0ZXJpYSwgdW50aWwgeW91IGFyZSBsZWZ0IHdpdGggYSBwb3RlbnRpYWwgcG9vbCBvZiBpbWFnZXMsIGZyb20gd2hpY2ggdGhlIHBsdWdpbiB0aGVuIHJhbmRvbWx5IGNob29zZXMuPC9wPg0KDQo8aDIgaWQ9ImltZ2F0dHMiPkF0dHJpYnV0ZXM8L2gyPg0KPGgzIGlkPSJtb2RlIj48Y29kZT5tb2RlPC9jb2RlPjwvaDM+DQo8cD5Td2l0Y2hlcyB0aGUgcGx1Z2luIGJldHdlZW4gdGhpcyBkZWZhdWx0IDxhIGhyZWY9IiNpbWdtb2RlIj5pbWFnZSBtb2RlPC9hPiAocHVsbGluZyBwaWN0dXJlcyBmcm9tIHRoZSBpbWFnZSBkYXRhYmFzZSkgb3IgPGEgaHJlZj0iI2ZpbGVtb2RlIj5maWxlIG1vZGU8L2E+IChmcm9tIHVwbG9hZGVkIGZpbGVzKS48L3A+DQo8aDQ+T3B0aW9uczwvaDQ+DQo8dWw+DQo8bGk+PGNvZGU+aW1hZ2U8L2NvZGU+PGJyIC8+DQp0aGUgZGVmYXVsdDwvbGk+DQo8bGk+PGNvZGU+ZmlsZTwvY29kZT48YnIgLz4NCjwvdWw+DQoNCjxoMyBpZD0iY2F0ZWdvcnkiPjxjb2RlPmNhdGVnb3J5PC9jb2RlPjwvaDM+DQo8cD5BIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGltYWdlIGNhdGVnb3J5IG5hbWVzIHRvIGNob29zZSBmcm9tOyBlaXRoZXIgbmFtZWQgZXhwbGljaXRseSBvciB1c2luZyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXM6PC9wPg0KPGg0Pk9wdGlvbnM8L2g0Pg0KPHVsPg0KPGxpPjxjb2RlPj9jPC9jb2RlPjxiciAvPg0KdXNlIHRoZSBjdXJyZW50IGdsb2JhbCAoYXJ0aWNsZSkgY2F0ZWdvcnkgYXMgdGhlIG5hbWUgb2YgYW4gaW1hZ2UgY2F0ZWdvcnk8L2xpPg0KPGxpPjxjb2RlPiFjPC9jb2RlPjxiciAvPg0KdXNlcyBldmVyeXRoaW5nIGV4Y2VwdCB0aGUgY3VycmVudCBnbG9iYWwgY2F0ZWdvcnk8L2xpPg0KPGxpPjxjb2RlPj9zPC9jb2RlPjxiciAvPg0KdXNlIHRoZSBjdXJyZW50IFRYUCBzZWN0aW9uIGFzIHRoZSBuYW1lIG9mIGFuIGltYWdlIGNhdGVnb3J5PC9saT4NCjxsaT48Y29kZT4hczwvY29kZT48YnIgLz4NCnVzZXMgZXZlcnl0aGluZyBleGNlcHQgdGhlIGN1cnJlbnQgc2VjdGlvbjwvbGk+DQo8bGk+PGNvZGU+P3Q8L2NvZGU+PGJyIC8+DQp1c2UgdGhlIGN1cnJlbnQgYXJ0aWNsZSdzIHVybC10aXRsZSBhcyB0aGUgbmFtZSBvZiBhbiBpbWFnZSBjYXRlZ29yeTwvbGk+DQo8bGk+PGNvZGU+IXQ8L2NvZGU+PGJyIC8+DQp1c2VzIGFsbCB1cmwtdGl0bGVzIGV4Y2VwdCB0aGUgY3VycmVudCBhcnRpY2xlIChwcm9iYWJseSBub3QgbXVjaCB1c2UhKTwvbGk+DQo8bGk+PGNvZGU+P2lkPC9jb2RlPjxiciAvPg0KdXNlIHRoZSBjdXJyZW50IGFydGljbGUncyBJRCBhcyB0aGUgbmFtZSBvZiBhbiBpbWFnZSBjYXRlZ29yeS4gVGhlIGNhdGVnb3J5IG5hbWUgaXMgbWFkZSB1cCBvZiB0aGUgPGEgaHJlZj0iI2lkcHJlZml4Ij5pZF9wcmVmaXg8L2E+IG9wdGlvbiBhbmQgdGhlIElEIHNvLCBieSBkZWZhdWx0LCBpdCB3aWxsIGJlIGFydGljbGUtPGNvZGU+SUQ8L2NvZGU+LiBUaGlzIGhlbHBzIHdoZW4gY3JlYXRpbmcgcGVyLWFydGljbGUgaW1hZ2UgY2F0ZWdvcmllcyBhbmQgbWVhbnMgeW91IGRvbid0IGhhdmUgdG8gdXNlIGNhdGVnb3J5IG5hbWVzIHRoYXQgYXJlIHNpbXBseSBudW1iZXJzLjwvbGk+DQo8bGk+PGNvZGU+IWlkPC9jb2RlPjxiciAvPg0KdXNlcyBhbGwgaW1hZ2UgSURzIGV4Y2VwdCB0aGUgY3VycmVudCBhcnRpY2xlPC9saT4NCjxsaT48Y29kZT4/ZmllbGRuYW1lPC9jb2RlPjxiciAvPg0KbG9va3MgaW4gdGhlIGdpdmVuIGZpZWxkbmFtZSBvZiB0aGUgY3VycmVudCBhcnRpY2xlIGFuZCB0cmVhdHMgdGhlIGNvbnRlbnRzIGFzIGEgbGlzdCBvZiBjYXRlZ29yaWVzLiBEZXNpZ25lZCBwcmltYXJpbHkgZm9yIHVzZSB3aXRoIGN1c3RvbSBmaWVsZHMgKGUuZy4gPGNvZGU+P2N1c3RvbTE8L2NvZGU+KSwgaXQgY291bGQgYWxzbyBiZSBhbnkgb3RoZXIgZmllbGQgKG9yIGZpZWxkcykgZnJvbSB5b3VyIGFydGljbGVzIChlLmcuIDxjb2RlPj9leGNlcnB0PC9jb2RlPiBvciA8Y29kZT4/Y2F0ZWdvcnkxPC9jb2RlPiBvciA8Y29kZT4/a2V5d29yZHM8L2NvZGU+IG9yIDxjb2RlPj9hdXRob3JpZDwvY29kZT4sIGV0YykuIEJlIHdhcm5lZDogaWYgeW91IHVzZSA8Y29kZT4/Ym9keTwvY29kZT4gb3Igc29tZXRoaW5nIGVxdWFsbHkgb3V0cmFnZW91cywgY2hhbmNlcyBhcmUgdGhlIHBsdWdpbiB3aWxsIGV4cGxvZGU8L2xpPg0KPC91bD4NCg0KPHA+VG8gbmVnYXRlIGFueSBjYXRlZ29yeSBzZWxlY3Rpb24sIHVzZSA8Y29kZT4hY2F0ZWdvcnk8L2NvZGU+IG9yIDxjb2RlPiFmaWVsZF9uYW1lPC9jb2RlPi4gSWYgeW91IGxpc3Qgc3BlY2lmaWMgaW1hZ2UgY2F0ZWdvcmllcyAoZS5nLiA8Y29kZT4hbWFtbWFsczwvY29kZT4pIHRob3NlIGNhdGVnb3JpZXMgd2lsbCBiZSBleGNsdWRlZC4gSWYgeW91IHNwZWNpZnkgYSBmaWVsZCBuYW1lIHN1Y2ggYXMgPGNvZGU+IWtleXdvcmRzPC9jb2RlPiBvciA8Y29kZT4hY3VzdG9tMTwvY29kZT4sIHRoZSBjb250ZW50cyBvZiB0aGF0IGZpZWxkIHdpbGwgYmUgcmVhZCBhbmQgdGhlIGxpc3Qgb2YgaW1hZ2UgY2F0ZWdvcmllcyBmb3VuZCB0aGVyZSB3aWxsIGJlIGV4Y2x1ZGVkLjwvcD4NCg0KPHA+Tm90ZSB0aGF0IGlmIHlvdSBzcGVjaWZ5IGEgZmllbGQgbmFtZSBhbmQgdGhhdCBmaWVsZCBpbiB0aGUgYXJ0aWNsZSBpcyBlbXB0eSwgdGhlIG5hbWUgd2lsbCBiZSB0cmVhdGVkIGFzIGlmIGl0IHdhcyBhbiBhY3R1YWwgaW1hZ2UgY2F0ZWdvcnkuIFNvIGlmIHlvdSBzcGVjaWZpZWQgPGNvZGU+P2tleXdvcmRzPC9jb2RlPiBhbmQgdGhlIGtleXdvcmRzIGZpZWxkIGluIHRoZSBjdXJyZW50IGFydGljbGUgd2FzIGVtcHR5LCBpdCB3b3VsZCBsb29rIGZvciBhbiBpbWFnZSBjYXRlZ29yeSBuYW1lZCAia2V5d29yZHMiLjwvcD4NCg0KPHA+QWxzbyBub3RlIHRoYXQsIHJlZ2FyZGxlc3Mgb2YgdGhlIG9yZGVyIHlvdSBsaXN0IHRoZW0sIGFsbCAncG9zaXRpdmVzJyB3aWxsIGJlIHByb2Nlc3NlZCBmaXJzdCwgdGhlbiBhbnkgZXhjbHVzaW9ucyBhcHBsaWVkLjwvcD4NCg0KPGgzIGlkPSJzdWJjYXRzIj48Y29kZT5zdWJjYXRzPC9jb2RlPjwvaDM+DQo8cD5BdXRvbWF0aWNhbGx5IGluY2x1ZGVzIGFsbCBzdWItY2F0ZWdvcmllcyBvZiB0aGUgY2hvc2VuIGltYWdlIGNhdGVnb3JpZXMuPC9wPg0KPGg0Pk9wdGlvbnM8L2g0Pg0KPHVsPg0KPGxpPjxjb2RlPjE8L2NvZGU+PGJyIC8+DQpzd2l0Y2hlcyB0aGUgb3B0aW9uIG9uLiBJdCBpcyBtaXNzaW5nIChpLmUuIG9mZikgYnkgZGVmYXVsdDwvbGk+DQo8L3VsPg0KDQo8aDMgaWQ9Im1hdGNodGV4dCI+PGNvZGU+bWF0Y2hfdGV4dDwvY29kZT48L2gzPg0KPHA+QSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0ZXh0IHN0cmluZ3MgdG8gbG9vayBmb3IgaW4gdGhlIGltYWdlLiBBcyB3aXRoIHRoZSA8YSBocmVmPSIjY2F0ZWdvcnkiPmNhdGVnb3J5PC9hPiBvcHRpb24sIHlvdSBjYW4gc3BlY2lmeSB0aGUgZm9sbG93aW5nIHNwZWNpYWwgb3B0aW9uczoNCjxoND5PcHRpb25zPC9oND4NCjx1bD4NCjxsaT48Y29kZT4/YzwvY29kZT48YnIgLz4NCnVzZSB0aGUgY3VycmVudCBnbG9iYWwgKGFydGljbGUpIGNhdGVnb3J5IGFzIG9uZSBvZiB0aGUgd29yZHMgdG8gbG9vayBmb3IgaW4gdGhlIGltYWdlPC9saT4NCjxsaT48Y29kZT4/czwvY29kZT48YnIgLz4NCnVzZSB0aGUgY3VycmVudCBUWFAgc2VjdGlvbiBhcyBvbmUgb2YgdGhlIHNlYXJjaCB0ZXJtczwvbGk+DQo8bGk+PGNvZGU+P3Q8L2NvZGU+PGJyIC8+DQp1c2UgdGhlIGN1cnJlbnQgYXJ0aWNsZSdzIHVybC10aXRsZSBhcyBvbmUgb2YgdGhlIHBocmFzZXMgdG8gbG9vayBmb3I8L2xpPg0KPGxpPjxjb2RlPj9pZDwvY29kZT48YnIgLz4NCnVzZSB0aGUgY3VycmVudCBhcnRpY2xlJ3MgSUQgKGluY2x1ZGluZyA8YSBocmVmPSIjaWRwcmVmaXgiPmlkX3ByZWZpeDwvYT4pIGFzIG9uZSBvZiB0aGUgdGhpbmdzIHRvIGxvb2sgZm9yPC9saT4NCjxsaT48Y29kZT4/ZmllbGRuYW1lPC9jb2RlPjxiciAvPg0KbG9vayBpbiBhbnkgZ2l2ZW4gYXJ0aWNsZSBmaWVsZCAoZS5nLiBjdXN0b20xLCBjdXN0b20yLCBhcnRpY2xlX2ltYWdlLCBrZXl3b3JkcywgZXhjZXJwdCwgZXRjKSBhbmQgcmVhZCB3aGF0ZXZlciBpcyBmb3VuZCB0aGVyZSBhcyBhIHdvcmQgKG9yIGxpc3Qgb2Ygd29yZHMpIHRvIGxvb2sgZm9yIGluIHRoZSBpbWFnZTwvbGk+DQo8L3VsPg0KDQo8aDMgaWQ9ImF2b2lkdGV4dCI+PGNvZGU+YXZvaWRfdGV4dDwvY29kZT48L2gzPg0KPHA+RXhhY3RseSB0aGUgc2FtZSBhcyA8YSBocmVmPSIjbWF0Y2h0ZXh0Ij5tYXRjaF90ZXh0PC9hPiBleGNlcHQgaXQgZGVmaW5lcyB3b3JkcyB0aGF0IDxzdHJvbmc+bXVzdCBub3Q8L3N0cm9uZz4gYmUgZm91bmQgaW4gdGhlIGltYWdlLiBBbnkgaW1hZ2VzIHRoYXQgZG8gbm90IGNvbnRhaW4gdGhlIHdvcmQocykgYXJlIGZhaXIgZ2FtZS48L3A+DQo8aDQ+T3B0aW9uczwvaDQ+DQo8dWw+DQo8bGk+PGNvZGU+P2M8L2NvZGU+PGJyIC8+DQp1c2UgdGhlIGN1cnJlbnQgZ2xvYmFsIChhcnRpY2xlKSBjYXRlZ29yeSBhcyBvbmUgb2YgdGhlIHdvcmRzIHRvIGF2b2lkIGluIHRoZSBpbWFnZTwvbGk+DQo8bGk+PGNvZGU+P3M8L2NvZGU+PGJyIC8+DQppZ25vcmUgYW55IGltYWdlcyB0aGF0IGNvbnRhaW4gdGhlIGN1cnJlbnQgVFhQIHNlY3Rpb24gbmFtZSBpbiB0aGVtPC9saT4NCjxsaT48Y29kZT4/dDwvY29kZT48YnIgLz4NCnVzZSB0aGUgY3VycmVudCBhcnRpY2xlJ3MgdXJsLXRpdGxlIGFzIG9uZSBvZiB0aGUgcGhyYXNlcyB0byBhdm9pZCAobm90ZTogaW5jbHVkZXMgdGhlIHVybC10aXRsZS1oeXBoZW5zIGluIHRoZSBjb21wYXJpc29uKTwvbGk+DQo8bGk+PGNvZGU+P2lkPC9jb2RlPjxiciAvPg0KaWdub3JlIGFueSBpbWFnZSB0aGF0IHVzZXMgdGhlIGN1cnJlbnQgYXJ0aWNsZSdzIElEIChwbHVzIGFueSBjb3JyZXNwb25kaW5nIDxhIGhyZWY9IiNpZHByZWZpeCI+aWRfcHJlZml4PC9hPikgYXMgb25lIG9mIHRoZSB0aGluZ3MgdG8gYXZvaWQ8L2xpPg0KPGxpPjxjb2RlPj9maWVsZG5hbWU8L2NvZGU+PGJyIC8+DQpsb29rIGluIGFueSBnaXZlbiBhcnRpY2xlIGZpZWxkIChlLmcuIGN1c3RvbTEsIGN1c3RvbTIsIGFydGljbGVfaW1hZ2UsIGtleXdvcmRzLCBleGNlcnB0LCBldGMpIGFuZCByZWFkIHdoYXRldmVyIGlzIGZvdW5kIHRoZXJlIGFzIGEgd29yZCAob3IgbGlzdCBvZiB3b3JkcykgdG8gYXZvaWQgaW4gdGhlIGltYWdlPC9saT4NCjwvdWw+DQoNCjxwPk5vdGUgdGhhdCBhbnkgaW1hZ2VzIG1hdGNoaW5nIHN0dWZmIGluIHRoZSAncG9zaXRpdmUnIDxjb2RlPm1hdGNoX3RleHQ8L2NvZGU+IGxpc3Qgd2lsbCBiZSBjaG9zZW4gZmlyc3QsIGJlZm9yZSBzb21lIG9mIHRoZW0gYXJlIHRoZW4gZXhjbHVkZWQgZnJvbSB0aGUgbGlzdCBpbiA8Y29kZT5hdm9pZF90ZXh0PC9jb2RlPi48L3A+DQoNCjxoMyBpZD0iaW1nY29tcGFyZXRvIj48Y29kZT5jb21wYXJlX3RvPC9jb2RlPjwvaDM+DQo8cD5BbGwgdGhpcyB0YWxrIG9mIGNvbXBhcmluZyB3b3JkcyB0byBpbWFnZXMgaXMgZmluZSwgYnV0IHdoYXQgZXhhY3RseSBpcyBpdCBjb21wYXJpbmcgdG8/IFRoaXMgaXMgd2hlcmUgeW91IGRlY2xhcmUgd2hlcmUgdGhlIHBsdWdpbiBsb29rcy4gQnkgZGVmYXVsdCBpdCB1c2VzIGp1c3QgdGhlIGltYWdlIGZpbGUgbmFtZSwgYnV0IGl0IGNhbiBiZSBleHRlbmRlZCB0byBlbmNvbXBhc3MgYW55IG9mIHRoZSBmb2xsb3dpbmc6PC9wPg0KPGg0Pk9wdGlvbnM8L2g0Pg0KPHVsPg0KPGxpPjxjb2RlPm5hbWU8L2NvZGU+PGJyIC8+DQp0aGUgZGVmYXVsdDogbG9vayBhdCB0aGUgZmlsZW5hbWUgb2YgdGhlIGltYWdlIGFuZCBpZiBpdCBjb250YWlucyBhbnkgb2YgdGhlIHdvcmRzIGluIDxhIGhyZWY9IiNtYXRjaHRleHQiPm1hdGNoX3RleHQ8L2E+IHRoZW4gYWRkIGl0IHRvIHRoZSBwb29sLiBDb252ZXJzZWx5LCBpZiBpdCBjb250YWlucyBhbnkgb2YgdGhlIHdvcmRzIGluIDxhIGhyZWY9IiNhdm9pZHRleHQiPmF2b2lkX3RleHQ8L2E+IHRoZW4gaWdub3JlIHRoZSBpbWFnZTwvbGk+DQo8bGk+PGNvZGU+aWQ8L2NvZGU+PGJyIC8+DQpsb29rIGF0IHRoZSBpZCBvZiB0aGUgaW1hZ2UgYW5kIGluY2x1ZGUvZXhjbHVkZSBpdCBiYXNlZCBvbiB0aGUgbnVtYmVycyBpbiBtYXRjaF90ZXh0L2F2b2lkX3RleHQ8L2xpPg0KPGxpPjxjb2RlPmNhcHRpb248L2NvZGU+PGJyIC8+DQppZiB0aGUgY2FwdGlvbiBjb250YWlucyAoZm9yIG1hdGNoX3RleHQpIG9yIGRvZXMgbm90IGNvbnRhaW4gKGZvciBhdm9pZF90ZXh0KSBhbnkgcGFydGljdWxhciB3b3JkcywgaW5jbHVkZS9leGNsdWRlIHRoaXMgaW1hZ2UgZnJvbSB0aGUgcG9vbDwvbGk+DQo8bGk+PGNvZGU+YWx0PC9jb2RlPjxiciAvPg0KaWYgdGhlIGFsdCB0ZXh0IGNvbnRhaW5zIChmb3IgbWF0Y2hfdGV4dCkgb3IgZG9lcyBub3QgY29udGFpbiAoZm9yIGF2b2lkX3RleHQpIGFueSBwYXJ0aWN1bGFyIHdvcmRzLCBpbmNsdWRlL2V4Y2x1ZGUgdGhpcyBpbWFnZSBmcm9tIHRoZSBwb29sPC9saT4NCjxsaT48Y29kZT5jYXRlZ29yeTwvY29kZT48YnIgLz4NCmFsdGhvdWdoIG5vdCByZWFsbHkgb2YgbXVjaCB1c2UgKHRoZSA8YSBocmVmPSIjY2F0ZWdvcnkiPmNhdGVnb3J5PC9hPiBvcHRpb24gY2FuIGJlIHVzZWQgaW5zdGVhZCksIHlvdSBtYXkgc3BlY2lmeSB0aGUgY2F0ZWdvcnkgYXMgYSBwbGFjZSB0byBsb29rIGZvciBwYXJ0aWN1bGFyIHdvcmRzPC9saT4NCjwvdWw+DQoNCjxoMyBpZD0iaWRwcmVmaXgiPjxjb2RlPmlkX3ByZWZpeDwvY29kZT48L2gzPg0KPHA+VGhlIHN0cmluZyB3aGljaCB3aWxsIGJlIHByZWZpeGVkIGJlZm9yZSBldmVyeSBhcnRpY2xlIElELiBEZWZhdWx0cyB0byA8Y29kZT4iYXJ0aWNsZS0iPC9jb2RlPi4gSW4gb3RoZXIgd29yZHMsIGlmIHlvdSBhcmUgY3VycmVudGx5IHZpZXdpbmcgYXJ0aWNsZSA3NSBhbmQgdXNlIDxjb2RlPm1hdGNoX3RleHQ9Ij9pZCI8L2NvZGU+IHRoZSBwbHVnaW4gd2lsbCBsb29rIGZvciBhbnkgaW1hZ2VzIHRoYXQgY29udGFpbiAiYXJ0aWNsZS03NSIgYW5kIGFkZCB0aGVtIHRvIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBmaWxlcyBpbiB0aGUgcG9vbC48L3A+DQoNCjxwPklmIHlvdSBwcmVmZXIgc29tZXRoaW5nIGVsc2UgYmVmb3JlIHRoZSBJRCwgc3BlY2lmeSBpdCB3aXRoIHRoaXMgb3B0aW9uLiBJZiB5b3Ugd2lzaCB0aGUgYXJ0aWNsZSBJRCB0byBiZSB1c2VkIHdpdGhvdXQgYW55IHByZWZpeCwgdXNlIDxjb2RlPmlkX3ByZWZpeD0iIjwvY29kZT4uPC9wPg0KDQo8aDMgaWQ9ImxpbWl0Ij48Y29kZT5saW1pdDwvY29kZT48L2gzPg0KPHA+VGhlIG1heGltdW0gbnVtYmVyIG9mIGltYWdlcyB0byBkaXNwbGF5IGZyb20gdGhlIHBvb2wuIE5vdGUgdGhhdCBpZiB0aGUgcG9vbCBjb250YWlucyBmZXdlciBpdGVtcyB0aGFuIHRoZSBudW1iZXIgc3BlY2lmaWVkIGhlcmUsIHRoZSBwbHVnaW4gY2FuIG9ubHkgZGlzcGxheSB0aGUgbWF4aW11bSBudW1iZXIgaXQgaGFzIGZvdW5kIHRoYXQgbWF0Y2ggeW91ciBjcml0ZXJpYS4gRGVmYXVsdDogMS48L3A+DQoNCjxoMyBpZD0iYWx3YXlzZGlzcGxheSI+PGNvZGU+YWx3YXlzX2Rpc3BsYXk8L2NvZGU+PC9oMz4NCjxwPklmIG5vIG1hdGNoaW5nIGltYWdlcyBhcmUgZm91bmQgdGhlIHBsdWdpbiB1c3VhbGx5IHJldHVybnMgbm90aGluZy4gVGhpcyBmb3JjZXMgaXQgdG8gdHJ5IGFnYWluIHdpdGhvdXQgYW55IG1hdGNoX3RleHQvYXZvaWRfdGV4dC4gRGVmYXVsdDogb2ZmLjwvcD4NCjxoND5PcHRpb25zPC9oND4NCjx1bD4NCjxsaT48Y29kZT4wPC9jb2RlPjxiciAvPg0Kb2ZmICh0aGUgZGVmYXVsdCk6IG9ubHkgZGlzcGxheXMgaW1hZ2VzIHRoYXQgbWF0Y2ggeW91ciBjcml0ZXJpYS4gSWYgbm90aGluZyBtYXRjaGVzLCBkaXNwbGF5IG5vdGhpbmc8L2xpPg0KPGxpPjxjb2RlPjE8L2NvZGU+PGJyIC8+DQpvbjogaW4gdGhlIGV2ZW50IHlvdXIgY3JpdGVyaWEgcmV0dXJuIG5vIGltYWdlcyBpbiB0aGUgcG9vbCwgdGhlIHBsdWdpbiB0cmllcyBhZ2FpbiB3aXRoIDxlbT5vbmx5PC9lbT4gdGhlIGNhdGVnb3JpZXMgeW91IGNob3NlLiBBbnkgbWF0Y2hfdGV4dC9hdm9pZF90ZXh0IGlzIGlnbm9yZWQ8L2xpPg0KPC91bD4NCg0KPGgzIGlkPSJ0aHVtYiI+PGNvZGU+dGh1bWI8L2NvZGU+PC9oMz4NCjxwPlRvIGRpc3BsYXkgdGh1bWJuYWlscyBpbnN0ZWFkIG9mIGZ1bGxzaXplIGltYWdlcy4gRGVmYXVsdDogb21pdHRlZCAoaS5lLiBvZmYpLjwvcD4NCjxoND5PcHRpb25zPC9oND4NCjx1bD4NCjxsaT48Y29kZT4xPC9jb2RlPjxiciAvPg0Kc3dpdGNoZXMgdGh1bWJuYWlscyBvbi4gQnkgZGVmdWx0IHRoZSBvcHRpb24gaXMgbWlzc2luZyAoaS5lLiBkaXNwbGF5IGZ1bGwtc2l6ZSBpbWFnZSBiYW5uZXJzKTwvbGk+DQo8L3VsPg0KDQo8aDMgaWQ9ImltZ2xpbmtpbiI+PGNvZGU+bGlua19pbjwvY29kZT48L2gzPg0KPHA+TWFrZXMgdGhlIGJhbm5lciBpbWFnZSBjbGlja2FibGUuIEluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIFRleHRwYXR0ZXJuIHdlIGFyZSBsaW1pdGVkIHRvIHB1dHRpbmcgYSBVUkwgbGluayBlaXRoZXIgaW4gdGhlIGFsdCBvciB0aGUgY2FwdGlvbi4gRm9yIGFjY2Vzc2liaWxpdHksIHRoZSBjYXB0aW9uIGlzIHByb2JhYmx5IGEgYmV0dGVyIGNob2ljZSBidXQgaXQncyB5b3VyIGNhbGwuIFNwZWNpZnkgd2hpY2ggcGFydCBvZiB0aGUgaW1hZ2UgdGhlIFVSTCBpcyBzdG9yZWQgd2l0aCB0aGlzIG9wdGlvbi4gSXQgY2FuIGJlIGVpdGhlciA8Y29kZT5hbHQ8L2NvZGU+IG9yIDxjb2RlPmNhcHRpb248L2NvZGU+IGluIHRoaXMgbW9kZSAoPGEgaHJlZj0iI2ZpbGVsaW5raW4iPmZpbGUgbW9kZTwvYT4gaXMgZGlmZmVyZW50KS4gRGVmYXVsdDogb21pdHRlZCAobm8gbGluaykuPC9wPg0KDQo8cD5JZiB0aGUgbGluayBpcyBhIGZ1bGwgVVJMIHN0YXJ0aW5nIHdpdGggaHR0cDovLyBpdCB3aWxsIGJlIHVzZWQgdmVyYmF0aW0gZm9yIHRoZSBpbWFnZSBsaW5rLiBJZiBpdCBzdGFydHMgd2l0aCBhICcvJyBpdCB3aWxsIGJlIGh1bmcgb2ZmIHRoZSByb290IHNpdGVfdXJsIGRpcmVjdGx5LiBJZiBpdCBzdGFydHMgd2l0aCBhbnl0aGluZyBlbHNlIGl0IGlzIGFzc3VtZWQgYSAncmVsYXRpdmUnIChvciAnbG9jYWwnKSBsaW5rIGFuZCBpbmhlcml0cyB0aGUgY3VycmVudCBzZWN0aW9uLjwvcD4NCjxoND5PcHRpb25zPC9oND4NCjx1bD4NCjxsaT48Y29kZT5jYXB0aW9uPC9jb2RlPjxiciAvPg0KdGVsbCB0aGUgcGx1Z2luIHRvIG1ha2UgdGhlIGJhbm5lciBjbGlja2FibGUgYW5kIHRoZSBkZXN0aW5hdGlvbiBVUkwgaXMgdG8gYmUgZm91bmQgaW4gdGhlIGNhcHRpb24gb2YgdGhlIGltYWdlPC9saT4NCjxsaT48Y29kZT5hbHQ8L2NvZGU+PGJyIC8+DQp0ZWxsIHRoZSBwbHVnaW4gdG8gbWFrZSB0aGUgYmFubmVyIGNsaWNrYWJsZSBhbmQgdGhlIGRlc3RpbmF0aW9uIFVSTCBpcyB0byBiZSBmb3VuZCBpbiB0aGUgYWx0IHRleHQgb2YgdGhlIGltYWdlPC9saT4NCjwvdWw+DQoNCjxoMyBpZD0ibGlua3ByZWZpeCI+PGNvZGU+bGlua19wcmVmaXg8L2NvZGU+PC9oMz4NCjxwPlN0cmluZyB0byBwcmVwZW5kIHRvIGV2ZXJ5IFVSTCB3aGVuIHVzaW5nIDxhIGhyZWY9IiNpbWdsaW5raW4iPmxpbmtfaW48L2E+LiBVc2VmdWwgaWYgeW91IHJlb3JnYW5pc2UgeW91ciBzaXRlOiB1c2UgdGhpcyBpbnN0ZWFkIG9mIHZpc2l0aW5nIGVhY2ggaW1hZ2UgYW5kIGFsdGVyaW5nIHRoZSBjYXB0aW9uL2FsdCB0ZXh0LiBEZWZhdWx0OiBvbWl0dGVkIChubyB0ZXh0KS48L3A+DQoNCjxwPkFnYWluLCBhcyB3aXRoIDxhIGhyZWY9IiNpbWdsaW5raW4iPmxpbmtfaW48L2E+IGlmIDxjb2RlPmxpbmtfcHJlZml4PC9jb2RlPiBiZWdpbnMgd2l0aCBodHRwOi8vIGl0IGlzIGFzc3VtZWQgYSBmdWxsIFVSTCB0byBhbm90aGVyIHNpdGU7IGlmIGl0IGJlZ2lucyB3aXRoICcvJyBpdCBpcyBhIHJvb3QgbGluazsgYW55dGhpbmcgZWxzZSBpcyBhc3N1bWVkIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHNlY3Rpb24uIE5vdGUgdGhhdCBpZiB5b3UgdXNlIGFuIGh0dHA6Ly8gZnVsbCBVUkwgaW4gdGhlIGltYWdlIGl0c2VsZiwgYW55IDxjb2RlPmxpbmtfcHJlZml4PC9jb2RlPiB3aWxsIGJlIGlnbm9yZWQuPC9wPg0KDQo8aDMgaWQ9InJlZmVyZXIiPjxjb2RlPnJlZmVyZXI8L2NvZGU+IChzaWMhKTwvaDM+DQo8cD5FYWNoIGltYWdlIGhhcyA8Y29kZT4/YmlkPWltYWdlSUQ8L2NvZGU+IGFkZGVkIHRvIGl0LCBzbyBjbGlja3MgY2FuIGJlIHRyYWNrZWQgaW4gdGhlIGxvZ3MgdG8gc2VlIHdoaWNoIGFyZSB0aGUgbW9zdCBlZmZlY3RpdmUgYWRzLiBDaGFuZ2UgdGhlICdiaWQnIHRleHQgaGVyZSB0byBzb21ldGhpbmcgb2YgeW91ciBjaG9vc2luZywgb3IgdXNlIDxjb2RlPnJlZmVyZXI9IiI8L2NvZGU+IHRvIGRpc2FibGUgdHJhY2tpbmcuIERlZmF1bHQ6IGJpZCAod2hlbiA8YSBocmVmPSIjaW1nbGlua2luIj5saW5rX2luPC9hPiBpcyB1c2VkKS4gTm90ZSB0aGF0IHRoZSBvcHRpb24gaXMgbWlzLXNwZWxsZWQgZXhhY3RseSB0aGUgc2FtZSB3YXkgYXMgdGhlIEhUVFAgc3BlYyB3YXMgYWxsIHRob3NlIHllYXJzIGFnbyA6LSk8L3A+DQoNCjxoMyBpZD0iaW1naW1nY2xhc3MiPjxjb2RlPmltZ2NsYXNzPC9jb2RlPjwvaDM+DQo8cD5DU1MgY2xhc3MgZm9yIGVhY2ggYmFubmVyIGltYWdlIGRpc3BsYXllZC4gRGVmYXVsdDogZW1wdHkgKGkuZS4gbm8gY2xhc3MpLjwvcD4NCg0KPGgzIGlkPSJyYXd1cmwiPjxjb2RlPnJhd191cmw8L2NvZGU+PC9oMz4NCjxwPkluc3RlYWQgb2YgbGlua2luZyBhbmQgbWFraW5nIGEgZnVsbCBpbWFnZSB0YWcsIHVzaW5nIHRoaXMgb3B0aW9uIGp1c3Qgb3V0cHV0cyB0aGUgVVJMIGRpcmVjdGx5IHRvIHRoZSBwYWdlLiBUaGlzIGNhbiBiZSB1c2VkIGluIDxjb2RlPiZsdDtzdHlsZSZndDs8L2NvZGU+IGRlY2xhcmF0aW9ucyB0bywgZm9yIGV4YW1wbGUsIHNldCBhIHJhbmRvbSBDU1Mgb2JqZWN0IGJhY2tncm91bmQuIERlZmF1bHQ6IG9mZi48L3A+DQo8aDQ+T3B0aW9uczwvaDQ+DQo8dWw+DQo8bGk+PGNvZGU+MTwvY29kZT48YnIgLz4NCnN3aXRjaGVzIHJhd191cmwgbW9kZSBvbi4gQnkgZGVmYXVsdCB0aGUgb3B0aW9uIGlzIG1pc3NpbmcgKGkuZS4gcmVuZGVycyBhIGZ1bGwgSFRNTCAmbHQ7aW1nJmd0OyB0YWcpPC9saT4NCjwvdWw+DQoNCjxoMyBpZD0idGFyZ2V0Ij48Y29kZT50YXJnZXQ8L2NvZGU+PC9oMz4NCjxwPlNwZWNpZmllcyB0aGUgYW5jaG9yIHRhcmdldCB3aW5kb3cgKGUuZy4gIl9ibGFuayIpIHdoaWNoIHdpbGwgY2F1c2UgYSBwb3B1cCBlZmZlY3Qgd2hlbiBhIGxpbmtlZCBiYW5uZXIgaXMgY2xpY2tlZC4gPGVtPk5COiBpZiB1c2luZyB0aGUgWEhUTUwgMS4xIERPQ1RZUEUgd2l0aCB0aGlzIG9wdGlvbiwgeW91ciBwYWdlIHdpbGwgbm90IHZhbGlkYXRlIHNpbmNlIHRhcmdldCBpcyBkZXByZWNhdGVkIGJ5IHRoZSBXM0M8L2VtPi4gRGVmYXVsdDogbm90IHNldCAobGlua3Mgb3BlbiBpbiBzYW1lIHdpbmRvdykuPC9wPg0KDQo8aDI+PGEgaWQ9ImltZ2V4YW1wbGVzIj48L2E+SW1hZ2UgbW9kZSBleGFtcGxlczwvaDI+DQo8cD5UbyBoaWdobGlnaHQgdGhlIGZlYXR1cmVzLCB3ZSBhcmUgZ29pbmcgdG8gdXNlIGFuIGV4YW1wbGUgb2YgYSB6b28gd2ViIHNpdGUuIE9uIHRoaXMgc2l0ZSB5b3UgaGF2ZSB0aHJlZSBzZWN0aW9uczogImFib3V0IiwgImFuaW1hbHMiIGFuZCAidG91cnMiLiBZb3UgaGF2ZSBpbWFnZXMgb2YgdmFyaW91cyBhbmltYWxzIHVuZGVyIGFuIGltYWdlIGNhdGVnb3J5IGNhbGxlZCAiYW5pbWFscyIuIEJlbG93IHRoYXQgdGhleSBhcmUgc2VwYXJhdGVkIGludG8gIm1hbW1hbHMiLCAicmVwdGlsZXMiLCBhbmQgImJpcmRzIi4gWW91ciBhbHQgdGV4dCBob2xkcyBzdWl0YWJsZSBhbHRlcm5hdGUgZGVzY3JpcHRpb25zIG9mIHRoZSBhbmltYWxzIGFuZCB0aGUgY2FwdGlvbiB0ZXh0IGlzIGEgdXJsIHRvIGFuIGFydGljbGUgYWJvdXQgZWFjaCBhbmltYWwuIFlvdSBhbHNvIGhhdmUgb3RoZXIgaW1hZ2UgY2F0ZWdvcmllcyBmb3IgdGhlIHJlc3Qgb2YgeW91ciBzaXRlLjwvcD4NCg0KPGgzIGlkPSJlZzEiPkV4YW1wbGUgMTwvaDM+DQo8cHJlPiZsdDt0eHA6c21kX3JhbmRvbV9iYW5uZXIgY2F0ZWdvcnk9ImFuaW1hbHMiIGxpbWl0PSI0IiBzdWJjYXRzPSIxIiAvJmd0OzwvcHJlPg0KDQo8cD5UaGF0IHdvdWxkIHB1bGwgb3V0IGZvdXIgcGljdHVyZXMgb2YgYW55IGFuaW1hbCB0byBzaG93IG9uIHlvdXIgZnJvbnQgcGFnZTsgbWF5YmUgYXJyYW5nZWQgaW50byBhIG5lYXQgc3F1YXJlITwvcD4NCg0KPGgzIGlkPSJlZzIiPkV4YW1wbGUgMjwvaDM+DQo8cHJlPiZsdDt0eHA6c21kX3JhbmRvbV9iYW5uZXIgY2F0ZWdvcnk9Im1hbW1hbHMsIHJlcHRpbGVzIiBsaW5rX2luPSJjYXB0aW9uIiAvJmd0OzwvcHJlPg0KPHA+V291bGQgZGlzcGxheSBhIHJhbmRvbSBwaWN0dXJlIGZyb20gZWl0aGVyIHRoZSBtYW1tYWxzIG9yIHJlcHRpbGVzIGNhdGVnb3JpZXMuIFRoZSBpbWFnZSB3b3VsZCBiZSBjbGlja2FibGUgYW5kIHRoZSBsaW5rIHdvdWxkIHRha2UgeW91IHRvIHRoZSBVUkwgZ2l2ZW4gaW4gdGhlIGNhcHRpb24gZmllbGQgb2YgdGhhdCBpbWFnZS4gSWYgdGhlIGNhcHRpb24gZmllbGQgaGFwcGVuZWQgdG8gYmUgZW1wdHksIHRoZSBsaW5rIHdvdWxkIGJlIHN1cHJlc3NlZC48L3A+DQoNCjxoMyBpZD0iZWczIj5FeGFtcGxlIDM8L2gzPg0KPHByZT4mbHQ7c3R5bGUgdHlwZT0idGV4dC9jc3MiJmd0Ow0KI215RGl2IHsNCiAgYmFja2dyb3VuZDogdXJsKCZsdDt0eHA6c21kX3JhbmRvbV9iYW5uZXIgY2F0ZWdvcnk9ImFuaW1hbHMiIHN1YmNhdHM9IjEiIHJhd191cmw9IjEiIC8mZ3Q7KSBuby1yZXBlYXQgdG9wOw0KfQ0KJmx0Oy9zdHlsZSZndDs8L3ByZT4NCjxwPlRoaXMga2luZCBvZiBzeW50YXggY2FuIGJlIHVzZWQgaWYgeW91IG9ubHkgd2FudGVkIHRoZSBiYWNrZ3JvdW5kIG9mIGEgc3BlY2lmaWMgZGl2IHRhZyB0byBob2xkIHlvdXIgcmFuZG9tIGltYWdlLjwvcD4NCg0KPGgzIGlkPSJlZzQiPkV4YW1wbGUgNDwvaDM+DQo8cD5JZiB5b3UgYXJyYW5nZWQgeW91ciBzaXRlIHNvIHRoYXQgeW91IGhhZCBhcnRpY2xlIGNhdGVnb3JpZXMgc3VjaCBhcyAibWFtbWFscyIgYW5kICJyZXB0aWxlcyIgKG1pcnJvcmluZyB5b3VyIGltYWdlIGNhdGVnb3JpZXMpLCB5b3UgY291bGQgZG8gdGhpczo8L3A+DQo8cHJlPiZsdDt0eHA6c21kX3JhbmRvbV9iYW5uZXIgY2F0ZWdvcnk9Ij9jIiBsaW5rX2luPSJjYXB0aW9uIiAvJmd0OzwvcHJlPg0KDQo8cD5UaGUgJz8nIHRlbGxzIHRoZSBwbHVnaW4geW91IGRvbid0IGtub3cgd2hhdCB0aGUgKGltYWdlKSBjYXRlZ29yeSBpcyBnb2luZyB0byBiZSB3aGVuIHlvdSBjb2RlIHRoZSBmb3JtLCBidXQgeW91IHdhbnQgaXQgdG8gYmUgcmVhZCBmcm9tIHRoZSBjdXJyZW50IGFydGljbGUgdGhhdCBhIHZpc2l0b3IgaXMgdmlld2luZy4gU2luY2Ugb3VyIGFydGljbGUgY2F0ZWdvcmllcyBtaW1pYyBvdXIgaW1hZ2UgY2F0ZWdvcmllcyBpbiB0aGlzIGNhc2UsICc/YycgbWVhbnMgInJlYWQgdGhlIGFydGljbGUgY2F0ZWdvcnkgYW5kIHVzZSB0aGF0IGFzIHRoZSBpbWFnZSBjYXRlZ29yeSIuPC9wPg0KPHA+U28gaWYgeW91ciB2aXNpdG9yIHdhcyB2aWV3aW5nIGEgcGFnZSBhYm91dCBhIHJlcHRpbGUsIHRoZSByYW5kb20gaW1hZ2UgZGlzcGxheWVkIG9uIHRoZSBwYWdlIHdvdWxkIGJlIG9mIGFub3RoZXIgcmVwdGlsZSAocG9zc2libHkgdGhlIHNhbWUgb25lKS4gVGhlcmUgYXJlIDxhIGhyZWY9IiNjYXRlZ29yeSI+bWFueSBvdGhlciBvcHRpb25zPC9hPi48L3A+DQoNCjxoMyBpZD0iZWc1Ij5FeGFtcGxlIDU8L2gzPg0KPHByZT4mbHQ7dHhwOnNtZF9yYW5kb21fYmFubmVyIGNhdGVnb3J5PSJhbmltYWxzLCAhYyIgc3ViY2F0cz0iMSIgbGlua19pbj0iY2FwdGlvbiIgLyZndDs8L3ByZT4NCjxwPlNsaWdodGx5IG1vcmUgdXNlZnVsLCB0aGlzIG9uZS4gSXQgdGVsbHMgdGhlIHBsdWdpbiB0byBzZWxlY3QgYW55IGFuaW1hbCBpbWFnZSBidXQgPGVtPm5vdDwvZW0+IG9uZSBmcm9tIHRoZSBjdXJyZW50IGNhdGVnb3J5IHRoYXQgaXMgYmVpbmcgdmlld2VkLiBTbyBpdCdsbCBlZmZlY3RpdmVseSAnYWR2ZXJ0aXNlJyBvdGhlciBjYXRlZ29yaWVzIGZvciB5b3UuPC9wPg0KDQo8aDMgaWQ9ImVnNiI+RXhhbXBsZSA2PC9oMz4NCjxwcmU+Jmx0O3R4cDpzbWRfcmFuZG9tX2Jhbm5lciBjYXRlZ29yeT0icmVwdGlsZXMsID9jdXN0b20xIiBsaW5rX2luPSJjYXB0aW9uIiBzdWJjYXRzPSIxIiAvJmd0OzwvcHJlPg0KPHA+VGhpcyBleGFtcGxlIGdpdmVzIHlvdSBhIHJhbmRvbSBpbWFnZSBjaG9zZW4gZnJvbSB0aGUgJ3JlcHRpbGVzJyBpbWFnZSBjYXRlZ29yeSBhbmQgYWxzbyBhbnkgY2F0ZWdvcmllcyBsaXN0ZWQgaW4gY3VzdG9tMSBvZiB0aGUgY3VycmVudGx5IHZpZXdlZCBhcnRpY2xlLiBJZiB5b3UgcHV0ICJtYW1tYWxzLCBiaXJkcywgcGVuZ3VpbnMiIGluIGN1c3RvbV8xIHdoZW4geW91IHdyb3RlIHRoZSBhcnRpY2xlIHlvdSB3b3VsZCBnZXQgYW4gaW1hZ2UgY2hvc2VuIGZyb20gYWxsIGZvdXIgY2F0ZWdvcmllcyAoYW5kIHRoZWlyIHN1Yi1jYXRlZ29yaWVzIGluIHRoaXMgY2FzZSkuIFRoaXMgc29ydCBvZiBpZGVhIGNvdWxkIGJlIHVzZWQgd2l0aCA8Y29kZT5jYXRlZ29yeT0iP2tleXdvcmRzIjwvY29kZT4gdG8gZ2V0IGEgbGlzdCBvZiAicmVsYXRlZCBpbWFnZSBjYXRlZ29yaWVzIi4uLjwvcD4NCjxwPk5vdGUgeW91IGNhbiBzaW1wbHkgbmVnYXRlIHRoZSBjaG9pY2UgbGlrZSB0aGlzOjwvcD4NCjxwcmU+Jmx0O3R4cDpzbWRfcmFuZG9tX2Jhbm5lciBjYXRlZ29yeT0iYW5pbWFscywgIWN1c3RvbTEiIGxpbmtfaW49ImNhcHRpb24iIHN1YmNhdHM9IjEiIC8mZ3Q7PC9wcmU+DQo8cD5TbyB0aGF0IHdvdWxkIGNob29zZSBhbiBpbWFnZSBmcm9tIGFueSBvZiB0aGUgYW5pbWFscyBleGNlcHQgb25lcyB0aGF0IHdlcmUgaW4gYW55IGNhdGVnb3JpZXMgbGlzdGVkIGluIGN1c3RvbTEuPC9wPg0KDQo8aDMgaWQ9ImVnNyI+RXhhbXBsZSA3PC9oMz4NCjxwPkNhdGVnb3JpZXMgb24gdGhlaXIgb3duIG9ubHkgdGVsbCBoYWxmIHRoZSBzdG9yeS4gVGhlcmUgYXJlIHRpbWVzIHlvdSBtaWdodCB3YW50IHRvIGluY2x1ZGUgb3IgZXhjbHVkZSBzcGVjaWZpYyBwaWVjZXMgb2YgdGV4dCBmb3VuZCBpbiB5b3VyIGltYWdlcy4gVGhlIHRleHQgY291bGQgYmUgaW4gdGhlIGZpbGVuYW1lLCB0aGUgaWQsIHRoZSBjYXB0aW9uLCB0aGUgYWx0IHRleHQsIG9yIHRoZSBjYXRlZ29yeSBuYW1lLjwvcD4NCjxwPkltYWdpbmUgeW91ciB2aXNpdG9yIGNsaWNrZWQgYSBwaWN0dXJlIG9mIGEgY3JvY29kaWxlIGFuZCB0aGV5IGFyZSB2aWV3aW5nIHRoZSBncmlzbHkgZGV0YWlscyBvbiBhbiBhcnRpY2xlIHBhZ2UuIFlvdSBtaWdodCB3YW50IHRvIHB1dCAiSWYgeW91IGxpa2VkIHRoaXMsIGZpbmQgb3V0IGFib3V0IHRoZXNlIGFuaW1hbHMgdG9vOiIgYW5kIHNob3cgYSBmZXcgcmFuZG9tIGltYWdlcyB0aGF0IGFsbG93IHRoZW0gdG8gc2VlIHN0dWZmIGFib3V0IG90aGVyIGFuaW1hbHMuIE9idmlvdXNseSwgd2UgZG9uJ3Qgd2FudCBhIHBpY3R1cmUgb2YgYSBjcm9jb2RpbGUgdG8gc2hvdyB1cC4gQW5kIG1heWJlIHdlIGRvbid0IHdhbnQgdG8gc2hvdyBhbGxpZ2F0b3JzIGVpdGhlciBiZWNhdXNlIHRoZXkncmUgcXVpdGUgc2ltaWxhci4gU28gd2UgY2FuIGRvIHRoaXM6PC9wPg0KPHByZT4mbHQ7dHhwOnNtZF9yYW5kb21fYmFubmVyIGNhdGVnb3J5PSJhbmltYWxzIiBzdWJjYXRzPSIxIiBsaW5rX2luPSJjYXB0aW9uIiBhdm9pZF90ZXh0PSJjcm9jLCBjcm9jb2RpbGUsIGFsbGlnYXRvciIgLyZndDs8L3ByZT4NCjxwPlRoYXQgd291bGQgY2hvb3NlIGFueSBwaWN0dXJlIGZyb20gdGhlIGFuaW1hbHMgY2F0ZWdvcnkgKGFuZCBhbGwgaXRzIHN1Yi1jYXRlZ29yaWVzKSBhcyBsb25nIGFzIHRoZSBuYW1lIG9mIHRoZSBpbWFnZSA8aT5kaWRuJ3Q8L2k+IGNvbnRhaW4gJ2Nyb2MnIG9yICdjcm9jb2RpbGUnIG9yICdhbGxpZ2F0b3InLjwvcD4NCg0KPGgzIGlkPSJlZzgiPkV4YW1wbGUgODwvaDM+DQo8cD5JZiB5b3VyIGZpbGVuYW1lcyB3ZXJlIGEgbGl0dGxlIHVuc3RydWN0dXJlZCwgbWF5YmUgeW91J2Qgd2FudCB0byBjaGVjayB0aGUgYWx0IHRleHQgYW5kIGNhcHRpb24gdGV4dCBmb3IgYSBtYXRjaCBhcyB3ZWxsLiBVc2UgPGEgaHJlZj0iI2ltZ2NvbXBhcmV0byI+Y29tcGFyZV90bzwvYT4gZm9yIHRoaXM6PC9wPg0KPHByZT4mbHQ7dHhwOnNtZF9yYW5kb21fYmFubmVyIGNhdGVnb3J5PSJhbmltYWxzIiBzdWJjYXRzPSIxIiBsaW5rX2luPSJjYXB0aW9uIiBhdm9pZF90ZXh0PSJjcm9jLCBjcm9jb2RpbGUsIGFsbGlnYXRvciIgY29tcGFyZV90bz0ibmFtZSwgYWx0LCBjYXB0aW9uIiAvJmd0OzwvcHJlPg0KDQo8aDMgaWQ9ImVnOSI+RXhhbXBsZSA5PC9oMz4NCjxwcmU+Jmx0O3R4cDpzbWRfcmFuZG9tX2Jhbm5lciBjYXRlZ29yeT0iYW5pbWFscyIgc3ViY2F0cz0iMSIgYXZvaWRfdGV4dD0iP2MiIGNvbXBhcmVfdG89Im5hbWUsIGFsdCwgY2FwdGlvbiwgY2F0ZWdvcnkiIC8mZ3Q7PC9wcmU+DQo8cD5PbiBhbiBhcnRpY2xlIHBhZ2UsIGhhcmQtY29kaW5nIGxpc3RzIG9mIHRoaW5ncyB0byBpbmNsdWRlL2V4Y2x1ZGUgaXMgYWNjZXB0YWJsZS4gQnV0IGlmIHlvdSdyZSB1c2luZyBhIGZvcm0geW91IGRvbid0IHdhbnQgdG8gZG8gdGhhdCwgc28ganVzdCBsaWtlIHRoZSA8YSBocmVmPSIjY2F0ZWdvcnkiPmNhdGVnb3J5PC9hPiBvcHRpb24geW91IGNhbiB1c2UgJz8nIHBsYWNlaG9sZGVycyB0aGF0IHdpbGwgcmVhZCBzdHVmZiBmcm9tIHRoZSBjdXJyZW50IGFydGljbGUuIFRoaXMgZXhhbXBsZSB3aWxsIHBpY2sgYW55IHJhbmRvbSBhbmltYWwgZXhjZXB0IG9uZXMgZnJvbSB0aGUgY3VycmVudCBhcnRpY2xlIGNhdGVnb3J5LiBOb3RlIHRoYXQsIHRvIGJlIG9uIHRoZSBzYWZlIHNpZGUsIGl0IGNoZWNrcyBpbiBmb3VyIGxvY2F0aW9ucyB0byBoZWxwIGVuc3VyZSBpdCB3b24ndCBmaW5kIGFueXRoaW5nIHJlbGF0ZWQgdG8gdGhlIGN1cnJlbnQgY2F0ZWdvcnkuPC9wPg0KDQo8aDIgaWQ9ImZpbGVtb2RlIj5GaWxlIG1vZGU8L2gyPg0KPHA+U2ltaWxhciBpbiBtYW55IHJlc3BlY3RzIHRvIHRoZSA8YSBocmVmPSIjaW1nbW9kZSI+aW1hZ2UgbW9kZTwvYT4gdGhlIHBsdWdpbiBjYW4gY2hvb3NlIHJhbmRvbSBmaWxlcyBmcm9tIHRob3NlIHVwbG9hZGVkIHRvIHRoZSBGaWxlcyB0YWIgaW4gdGhlIFRYUCBpbnRlcmZhY2UuIFRoaXMgZ2l2ZXMgeW91IHRoZSBvcHRpb24gb2YgdXNpbmcgYSByYW5kb20gYmFubmVyIGFzIGEgcGllY2Ugb2YgRmxhc2ggb3IgYSB2aWRlbyBmaWxlIGlmIHlvdSB3YW50LiBJbiB0aGVvcnksIGlmIHRoZXJlJ3MgYSBicm93c2VyIHBsdWdpbiBhdmFpbGFibGUgZm9yIGl0LCB5b3UgY2FuIHBsYXkgaXQgKGJ1dCBub3RlIHRoZSBjYXZlYXRzIGxhdGVyOiBzdXBwb3J0IGZvciBldmVyeXRoaW5nIGlzbid0IGJ1aWx0IGluIG5hdGl2ZWx5KS48L3A+DQo8cD5BcyB3aXRoIHRoZSBpbWFnZSBtb2RlLCBtb3N0IG9mIHRoZSBvcHRpb25zIHdvcmsgdG8gd2hpdHRsZSBkb3duIHRoZSBjaG9pY2VzIHRvIGEgcG9vbCBvZiBmaWxlcyB0aGF0IG1hdGNoIHlvdXIgc3BlY2lmaWMgY3JpdGVyaWEuIFRoZSBwbHVnaW4gdGhlbiByYW5kb21seSBjaG9vc2VzIG9uZSAob3IgbW9yZSBpZiB5b3UgY2hvb3NlKSBhbmQgcmVuZGVycyBpdCBhcyBiZXN0IGl0IGNhbi48L3A+DQo8cD5UaGVyZSBpcyBvbmUgY3J1Y2lhbCBkaWZmZXJlbmNlIGluIHRoaXMgbW9kZTogc2luY2Ugd2UgYXJlIGxpbWl0ZWQgdG8gb25lIGZpZWxkIG9mIGN1c3RvbWlzYWJsZSBjb250ZW50IHdpdGggZmlsZXMgYW5kIHRoZXJlIGFyZSBhIGxvdCBvZiBwb3RlbnRpYWwgaWRpb3N5bmNyYWNpZXMgaW4gZW1iZWRkaW5nIHBsYXlhYmxlIGNvbnRlbnQsIG9ubHkgdGhlIGNvcmUgZnVuY3Rpb25hbGl0eSBpcyBzcGVjaWZpZWQgYXMgcGx1Z2luIG9wdGlvbnMuIEN1c3RvbWlzYXRpb24gYWJvdmUgYW5kIGJleW9uZCB0aGF0IGdvZXMgaW4gdGhlIDxjb2RlPmRlc2NyaXB0aW9uPC9jb2RlPiBmaWVsZCBhcyBhIGNhdGNoLWFsbCBmb3IgbWFueSBleHRyYSBvcHRpb25zLjwvcD4NCjxwPlVuZm9ydHVuYXRlbHksIHVzaW5nIG9uZSBmaWVsZCBmb3IgbWFueSBwdXJwb3NlcyBpbXBsaWVzIHN0aWNraW5nIHRvIHNvbWUgY29udmVudGlvbnMuIFRvIHRoaXMgZW5kLCB3aGVuIHNwZWNpZnlpbmcgb3B0aW9ucyBpbiB0aGUgZGVzY3JpcHRpb24gZmllbGQsIHVzZSB0aGUgZm9sbG93aW5nIGZvcm1hdDo8L3A+DQo8cHJlPg0Kb3B0aW9uTmFtZTE9b3B0aW9uVmFsdWUxOw0Kb3B0aW9uTmFtZTI9b3B0aW9uVmFsdWUyOw0KLi4uDQo8L3ByZT4NCjxwPk5vIHF1b3RlcyBhcmUgbmVjZXNzYXJ5IGFyb3VuZCB0aGUgb3B0aW9uIHZhbHVlcyBhcyB0aGUgcGx1Z2luIHdpbGwgcHV0IHRoZW0gaW4gZm9yIHlvdSwgdGhvdWdoIGl0IGRvZXMgbm8gaGFybSB0byBpbmNsdWRlIHRoZW0uIEFuZCBhbHRob3VnaCBzcGFjZXMgYW5kIG5ld2xpbmVzIGFyZSBhbHNvIG9wdGlvbmFsLCBpdCdsbCBoZWxwIGtlZXAgeW91ciBzYW5pdHkgaWYgeW91IGRvIHRoaW5ncyB0aGlzIHdheSEgSnVzdCBub3RlIHRoYXQgZXZlcnkgb3B0aW9uPXZhbHVlIHBhaXIgZW5kcyB3aXRoIGEgc2VtaWNvbG9uICc7JzwvcD4NCjxwPlsgSXQgaXMgcHJvYmFibHkgYmVzdCB0byBzZXQgYXNpZGUgYSBzcGVjaWZpYyBjYXRlZ29yeS9zdWItY2F0ZWdvcnkgZmlsZSB0cmVlIGZvciB5b3VyIGJhbm5lcnMgc2luY2Ugd2UgYXJlIGdvaW5nIHRvIGJlIGhpamFja2luZyB0aGUgZGVzY3JpcHRpb24gZmllbGQgZm9yIHB1cnBvc2VzIG90aGVyIHRoYW4gaXQgd2FzIGludGVuZGVkLiBdPC9wPg0KDQo8aDMgaWQ9ImZpbGV3b3JrcyI+SG93IGl0IHdvcmtzOiBNSU1FIHR5cGVzPC9oMz4NCjxwPk1JTUUgdHlwZXMgcnVsZTsgZXhjZXB0IHRoZSB0b29scyB0byBhY2N1cmF0ZWx5IGRldGVybWluZSB3aGljaCBmaWxlIGlzIG9mIHdoYXQgdHlwZSBhcmUgb2Z0ZW4gZXh0ZW5zaW9ucyBhbmQgY2Fubm90IGJlIGd1YXJhbnRlZWQgdG8gYmUgaW5zdGFsbGVkIG9uIGV2ZXJ5IHNlcnZlci4gU28gd2UgaGF2ZSB0byB1c2UgdGhlIG5leHQgYmVzdCB0aGluZzogdGhlIGZpbGUgZXh0ZW5zaW9uLiBZZXMgaXQgY2FuIGJlIG1pc2xlYWRpbmcsIGJ1dCB3ZSdyZSBzdHVjayB3aXRoIGl0LjwvcD4NCjxwPkZpcnN0IHRoaW5ncyBmaXJzdDogb25jZSBhIGZpbGUgaGFzIGJlZW4gc2VsZWN0ZWQgYmFzZWQgb24geW91ciBvcHRpb25zLCB0aGUgcGx1Z2luIGxvb2tzIGF0IGl0cyBmaWxlIGV4dGVuc2lvbi4gQmFzZWQgb24gdGhhdCBpdCB1c2VzIGEgbG9va3VwIHRhYmxlIHRvIGRldGVybWluZSB0aGUgY29ycmVjdCBNSU1FIHR5cGUgYW5kICZsdDtvYmplY3QmZ3Q7IHRhZyB0ZW1wbGF0ZS4gVGhlIE1JTUUgdHlwZSBpcyBvdmVycmlkYWJsZSBvbiBhIHBlci1maWxlIGJhc2lzIGJ1dCB0aGUgdGVtcGxhdGVzIGFyZSBhbGwgaGFyZC1jb2RlZCBmb3Igbm93LiBUaGUgbmV4dCByZXZpc2lvbiBvZiB0aGUgcGx1Z2luIHdpbGwgYWxsb3cgdGhlbSB0byBiZSBleHRlbmRlZC9tb2RpZmllZCB2aWEgcGx1Z2luIG9wdGlvbnMgYW5kIHRvIGFsc28gYWRkIGluIGN1c3RvbSBNSU1FIHR5cGVzLiBXaXRoIGx1Y2suPC9wPg0KPHA+Rm9yIG5vdywgdGhlIG1vc3QgY29tbW9uIHRoaW5ncyBsaWtlIEZsYXNoIGZpbGVzLCBBVkkvTU9WL01QRy9XTVYgbW92aWVzIGFuZCBldmVuIHNvbWUgYXVkaW8gZm9ybWF0cyBsaWtlIFdBVi9PR0cvT1BUSU1GUk9HL0ZMQUMgYXJlIHN1cHBvcnRlZCAoYXVkaW8gYmFubmVycyBhbnlvbmU/ISkgQW5kIHRoZSBnb29kIG5ld3MgaXMgaXQgc2hvdWxkIGJlIGZhaXJseSBhdXRvbWF0aWMgKGlmIGl0IGlzbid0LCBwbGVhc2UgPGEgaHJlZj0iaHR0cDovL3N0ZWZkYXdzb24uY29tL2NvbW1lbnRGb3JtIj5nZXQgaW4gdG91Y2g8L2E+IGFuZCBzdWdnZXN0IGJldHRlciB0ZW1wbGF0ZXMgZm9yIHRoZSBuZXh0IHJldmlzaW9uKS48L3A+DQo8cD5UaGUga2V5IHRvIGl0IGlzIGFsbG93aW5nIG92ZXJyaWRhYmxlIG9wdGlvbnMuIFRoZSA8YSBocmVmPSJodHRwOi8vd3d3Lnczc2Nob29scy5jb20vdGFncy90YWdfb2JqZWN0LmFzcCI+SFRNTCBvYmplY3QgdGFnPC9hPiBjb250YWlucyBhIGhvc3Qgb2YgYXR0cmlidXRlcywgYWxsIG9mIHdoaWNoIHlvdSBjYW4gb3ZlcnJpZGUgYnkgc3BlY2lmeWluZyB0aGVtIGFzIG9wdGlvbj12YWx1ZSBwYWlycyBpbiB0aGUgZGVzY3JpcHRpb24gZmllbGQgb2YgdGhhdCBwYXJ0aWN1bGFyIGZpbGUuIFNlZSA8YSBocmVmPSIjZmVnMSI+ZXhhbXBsZSAxIDwvYT4gYW5kIDxhIGhyZWY9IiNmZWcyIj4yPC9hPiBmb3IgbW9yZS48L3A+DQo8cD5BbnkgYXR0cmlidXRlcyB0aGF0IG1hdGNoIHRoZSBuYW1lcyBpbiB0aGUgSFRNTCBzcGVjIGNhbiBiZSB1c2VkLiBUaGVzZSBhcmUgdGhlIGNvcmUgb25lcyB0aGF0IHRoZSBwbHVnaW4gd2lsbCBzZWxlY3QgZm9yIHlvdSBpZiB5b3UgZG8gbm90IHNwZWNpZnkgeW91ciBvd24gaW4gdGhlIDxjb2RlPmRlc2NyaXB0aW9uPC9jb2RlPiBmaWVsZDo8L3A+DQo8dWw+DQo8bGk+PGNvZGU+ZGF0YT08L2NvZGU+IHRoZSBVUkwgdG8gdGhlIGZpbGUgaXRzZWxmLiBUYWtlcyB0aGUgZmlsZSdzIFVSTCBmcm9tIHRoZSBUWFAgZGF0YWJhc2UgYnkgZGVmYXVsdCwgb3IgaXQgbWF5IGJlIG92ZXJyaWRkZW4gYnkgeW91PC9saT4NCjxsaT48Y29kZT50eXBlPTwvY29kZT4gdGhlIE1JTUUgdHlwZSBvZiB0aGUgZmlsZS4gQWdhaW4sIHVzZXMgdGhlIGxvb2t1cCB0YWJsZS4gSWYgaXQgY2hvb3NlcyB3cm9uZ2x5IG9yIHlvdSB3YW50IGEgZmFuY2lmdWwgdHlwZSBub3QgaW5jbHVkZWQsIG92ZXJyaWRlIGl0PC9saT4NCjxsaT48Y29kZT53aWR0aD08L2NvZGU+IHRoZSBob3Jpem9udGFsIHNjcmVlbiByZWFsIGVzdGF0ZSB0aGF0IHRoZSBvYmplY3Qgd2lsbCBvY2N1cHkuIEJ5IGRlZmF1bHQgaXQgdGFrZXMgdGhlIHZhbHVlcyBvbiBhIHBlci1sYW5ndWFnZSBiYXNpcyAoaWYgTUxQIGlzIGluc3RhbGxlZCkgYmVjYXVzZSBjb250ZW50IG9mdGVuIHZhcmllcyBmcm9tIGNvdW50cnkgdG8gY291bnRyeS4gV2l0aG91dCBNTFAgaXQncyAzMDBweCBzbyB5b3UgcHJvYmFibHkgc2hvdWxkIG92ZXJyaWRlIHRoaXM8L2xpPg0KPGxpPjxjb2RlPmhlaWdodD08L2NvZGU+IHRoZSB2ZXJ0aWNhbCBzY3JlZW4gcmVhbCBlc3RhdGUgdGhlIG9iamVjdCB0YWtlcyB1cC4gTUxQLWF3YXJlLCBhcyBhYm92ZTwvbGk+DQo8bGk+PGNvZGU+aWQ9PC9jb2RlPiBUaGUgdW5pcXVlIElEIGZvciB0aGUgb2JqZWN0LiBJZiBub3Qgb3ZlcnJpZGVuLCB3aWxsIGRlZmF1bHQgdG8gImlkIiBwbHVzIGEgcmFuZG9tIG51bWJlci48L2xpPg0KPC91bD4NCg0KPHA+VGhlIG90aGVyIG9wdGlvbnMgYXJlIHRvbyBudW1lcm91cyB0byBsaXN0LCBidXQgVzNTY2hvb2xzIG9yIEdvb2dsZSB3aWxsIGhlbHAgeW91IGZpbmQgdGhlbSBpZiB5b3UgbmVlZCB0aGVtLjwvcD4NCjxwPkFueSA8Y29kZT5vcHRpb249dmFsdWU8L2NvZGU+IHBhaXIgc3BlY2lmaWVkIGluIHRoZSA8Y29kZT5kZXNjcmlwdGlvbjwvY29kZT4gZmllbGQgdGhhdCBpcyA8ZW0+bm90PC9lbT4gcGFydCBvZiB0aGUgY29yZSBzcGVjIGlzIGFzc3VtZWQgdG8gYmUgYSAmbHQ7cGFyYW0mZ3Q7IHRhZyB3aXRoaW4gdGhlIG9iamVjdCBpdHNlbGYuIFVzZSB0aGlzIGZhY2lsaXR5IHRvIHNwZWNpZnkgYW55IGV4dHJhIG9wdGlvbnMgeW91ciBjaG9zZW4gZmlsZSB0eXBlIHJlcXVpcmVzIHRvIG9wZXJhdGUgY29ycmVjdGx5LjwvcD4NCg0KPGgzIGlkPSJmaWxlYXR0cyI+RmlsZSBtb2RlIGF0dHJpYnV0ZXM8L2gzPg0KPHA+VGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIHdvcmsgaW4gZXhhY3RseSB0aGUgc2FtZSB3YXkgYXMgdGhleSBkbyBpbiA8YSBocmVmPSIjaW1nbW9kZSI+aW1hZ2UgbW9kZTwvYT4gd2l0aCB0aGUgZXhjZXB0aW9uIHRoYXQgZXZlcnl3aGVyZSBpdCBtZW50aW9ucyAnaW1hZ2UnIHlvdSBjYW4gc3Vic3RpdHV0ZSAnZmlsZSc6PC9wPg0KPHVsPg0KPGxpPjxhIGhyZWY9IiNtb2RlIj5tb2RlPC9hPjwvbGk+DQo8bGk+PGEgaHJlZj0iI2NhdGVnb3J5Ij5jYXRlZ29yeTwvYT48L2xpPg0KPGxpPjxhIGhyZWY9IiNzdWJjYXRzIj5zdWJjYXRzPC9hPjwvbGk+DQo8bGk+PGEgaHJlZj0iI21hdGNodGV4dCI+bWF0Y2hfdGV4dDwvYT48L2xpPg0KPGxpPjxhIGhyZWY9IiNhdm9pZHRleHQiPmF2b2lkX3RleHQ8L2E+PC9saT4NCjxsaT48YSBocmVmPSIjaWRwcmVmaXgiPmlkX3ByZWZpeDwvYT48L2xpPg0KPGxpPjxhIGhyZWY9IiNsaW1pdCI+bGltaXQ8L2E+PC9saT4NCjxsaT48YSBocmVmPSIjYWx3YXlzZGlzcGxheSI+YWx3YXlzX2Rpc3BsYXk8L2E+PC9saT4NCjxsaT48YSBocmVmPSIjbGlua3ByZWZpeCI+bGlua19wcmVmaXg8L2E+PC9saT4NCjxsaT48YSBocmVmPSIjcmVmZXJlciI+cmVmZXJlcjwvYT48L2xpPg0KPGxpPjxhIGhyZWY9IiNyYXd1cmwiPnJhd191cmw8L2E+PC9saT4NCjxsaT48YSBocmVmPSIjdGFyZ2V0Ij50YXJnZXQ8L2E+PC9saT4NCjwvdWw+DQoNCjxwPlRoZSBmb2xsb3dpbmcgb3B0aW9uIGlzIGlnbm9yZWQgaW4gdGhpcyBtb2RlOjwvcD4NCjx1bD4NCjxsaT48YSBocmVmPSIjdGh1bWIiPnRodW1iPC9hPjwvbGk+DQo8L3VsPg0KDQo8cD5BbmQgdGhlc2Ugb3B0aW9ucyB3b3JrIGRpZmZlcmVudGx5LCBvciBhcmUgc3BlY2lmaWMgdG8gdGhpcyBtb2RlOjwvcD4NCg0KPGgzIGlkPSJmaWxlY29tcGFyZXRvIj48Y29kZT5jb21wYXJlX3RvPC9jb2RlPiAoZmlsZSBtb2RlKTwvaDM+DQo8cD5EZWNsYXJlIHdoaWNoIGZpZWxkcyBvZiB0aGUgZmlsZSB0aGUgcGx1Z2luIGxvb2tzIHdoZW4gbWF0Y2hpbmcgb3IgYXZvaWRpbmcgdGV4dC4gQnkgZGVmYXVsdCBpdCB1c2VzIGp1c3QgdGhlIGZpbGUgbmFtZSwgYnV0IGl0IGNhbiBiZSBleHRlbmRlZCB0byBlbmNvbXBhc3MgYW55IG9mIHRoZSBmb2xsb3dpbmc6PC9wPg0KPGg0Pk9wdGlvbnM8L2g0Pg0KPHVsPg0KPGxpPjxjb2RlPmZpbGVuYW1lPC9jb2RlPjxiciAvPg0KdGhlIGRlZmF1bHQ6IGxvb2sgYXQgdGhlIGZpbGVuYW1lIG9mIHRoZSBmaWxlIGFuZCBpZiBpdCBjb250YWlucyBhbnkgb2YgdGhlIHdvcmRzIGluIDxhIGhyZWY9IiNtYXRjaHRleHQiPm1hdGNoX3RleHQ8L2E+IHRoZW4gYWRkIGl0IHRvIHRoZSBwb29sLiBDb252ZXJzZWx5LCBpZiBpdCBjb250YWlucyBhbnkgb2YgdGhlIHdvcmRzIGluIDxhIGhyZWY9IiNhdm9pZHRleHQiPmF2b2lkX3RleHQ8L2E+IHRoZW4gaWdub3JlIHRoZSBmaWxlPC9saT4NCjxsaT48Y29kZT5kZXNjcmlwdGlvbjwvY29kZT48YnIgLz4NCmxvb2sgYXQgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBmaWxlIGFuZCBpbmNsdWRlL2V4Y2x1ZGUgaXQgYmFzZWQgb24gdGhlIHdvcmRzIGluIG1hdGNoX3RleHQvYXZvaWRfdGV4dDwvbGk+DQo8bGk+PGNvZGU+c3RhdHVzPC9jb2RlPjxiciAvPg0KaWYgdGhlIG51bWVyaWMgZGlzcGxheSBzdGF0dXMgb2YgdGhlIGZpbGUgbWF0Y2hlcyAoZm9yIG1hdGNoX3RleHQpIG9yIGRvZXMgbm90IG1hdGNoIChmb3IgYXZvaWRfdGV4dCkgYW55IG51bWJlcnMsIGluY2x1ZGUvZXhjbHVkZSB0aGlzIGZpbGUgZnJvbSB0aGUgcG9vbDwvbGk+DQo8bGk+PGNvZGU+c2l6ZTwvY29kZT48YnIgLz4NCihvZiBsaW1pdGVkIHVzZSkgaWYgdGhlIGZpbGUgaXMgb2YgYSBwYXJ0aWN1bGFyIHNpemUgKGZvciBtYXRjaF90ZXh0KSBvciBub3Qgb2YgYSBwYXJ0aWN1bGFyIHNpemUgKGZvciBhdm9pZF90ZXh0KSwgaW5jbHVkZS9leGNsdWRlIHRoaXMgZmlsZSBmcm9tIHRoZSBwb29sPC9saT4NCjxsaT48Y29kZT5jYXRlZ29yeTwvY29kZT48YnIgLz4NCmFzIHdpdGggaW1hZ2UgbW9kZSwgdGhpcyBtYXkgbm90IGJlIG9mIG11Y2ggdXNlICh0aGUgPGEgaHJlZj0iI2NhdGVnb3J5Ij5jYXRlZ29yeTwvYT4gb3B0aW9uIGNhbiBiZSB1c2VkIGluc3RlYWQpLCBidXQgeW91IG1heSBzcGVjaWZ5IHRoZSBjYXRlZ29yeSBhcyBhIHBsYWNlIHRvIGxvb2sgZm9yIHBhcnRpY3VsYXIgd29yZHM8L2xpPg0KPC91bD4NCg0KPGgzIGlkPSJmaWxlbGlua2luIj48Y29kZT5saW5rX2luPC9jb2RlPiAoZmlsZSBtb2RlKTwvaDM+DQo8cD5NYWtlcyB0aGUgYmFubmVyIGZpbGUgY2xpY2thYmxlIGJ5IHNwZWNpZnlpbmcgd2hpY2ggZmllbGQgb2YgdGhlIGZpbGUgdGhlIFVSTCBpcyBzdG9yZWQuIENhbiBjdXJyZW50bHkgb25seSBiZSA8Y29kZT5kZXNjcmlwdGlvbjwvY29kZT4uIERlZmF1bHQ6IG9taXR0ZWQgKG5vIGxpbmspPC9saT4NCjxoND5PcHRpb25zPC9oND4NCjx1bD4NCjxsaT48Y29kZT5kZXNjcmlwdGlvbjwvY29kZT48YnIgLz4NCnRlbGwgdGhlIHBsdWdpbiB0byBtYWtlIHRoZSBmaWxlIGJhbm5lciBjbGlja2FibGUuIFRoZSBkZXN0aW5hdGlvbiBVUkwgaXMgZm91bmQgaW4gdGhlIGRlc2NyaXB0aW9uIGZpZWxkIG9mIHRoZSBmaWxlIGFzIGFuIG9wdGlvbj12YWx1ZSBwYWlyIGxpa2UgdGhpczogPGNvZGU+bGlua191cmw9aHR0cDovL215LmRvbWFpbi5jb20vcGxhY2UvdG8vdmlzaXQucGhwOzwvY29kZT48L3A+DQo8cD5BcyB3aXRoIHRoZSA8YSBocmVmPSIjaW1nbGlua2luIj5pbWFnZSBtb2RlIGxpbmtfaW48L2E+IGEgZnVsbCBVUkwgYmVnaW5uaW5nIGh0dHA6Ly8gd2lsbCBiZSB1c2VkIHZlcmJhdGltLCBhbnl0aGluZyBiZWdpbm5pbmcgd2l0aCBhICcvJyB3aWxsIGFzc3VtZSB0byBiZSByZWxhdGl2ZSB0byB0aGUgc2l0ZSByb290IGFuZCBldmVyeXRoaW5nIGVsc2Ugd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBzZWN0aW9uL2FydGljbGUuPC9saT4NCjwvdWw+DQoNCjxoMyBpZD0iZmlsZWltZ2NsYXNzIj48Y29kZT5pbWdjbGFzczwvY29kZT4gKGZpbGUgbW9kZSk8L2gzPg0KPHA+QWx0aG91Z2ggc2xpZ2h0bHkgbWlzbGVhZGluZyBhcyBhIG5hbWVkIG9wdGlvbiwgdGhpcyBnaXZlcyBhbiBvdmVyYWxsIENTUyBjbGFzcyBhcHBsaWVkIHRvIGVhY2ggYmFubmVyIGZpbGUncyAmbHQ7b2JqZWN0Jmd0OyB0YWcuIERlZmF1bHQ6IGVtcHR5IChpLmUuIG5vIGNsYXNzKS4gQ2FuIGJlIG92ZXJyaWRkZW4gb24gYSBmaWxlLWJ5LWZpbGUgYmFzaXMgYnkgc3BlY2lmeWluZyB0aGUgdmFsdWUgPGNvZGU+Y2xhc3M9bXlDbGFzc05hbWU7PC9jb2RlPiBpbiB0aGUgZGVzY3JpcHRpb24gZmllbGQgb2YgYW55IGZpbGUuPC9wPg0KDQo8aDMgaWQ9ImNvdW50ZG93bmxvYWRzIj48Y29kZT5jb3VudF9kb3dubG9hZHM8L2NvZGU+PC9oMz4NCjxwPkJ5IGRlZmF1bHQgZXZlcnkgdGltZSBhIGJhbm5lciBmaWxlIGlzIHNlcnZlZCwgdGhlIGFzc29jaWF0ZWQgY291bnRlciBmb3IgdGhhdCBmaWxlIGlzIGluY3JlbWVudGVkLiBUaGlzIG1heSBvciBtYXkgbm90IGJlIGRlc2lyYWJsZSBzbyBpdCBjYW4gYmUgdHVybmVkIG9mZiBoZXJlLjwvcD4NCjxwPlRoZSByZWFzb24gaXQgaXMgYW4gb3B0aW9uIGlzIGJlY2F1c2UgaXQgY2FuIGluIHNvbWUgY2lyY3Vtc3RhbmNlcyBsZWFkIHRvIG1pc2xlYWRpbmcgcmVzdWx0cy4gRm9yIGV4YW1wbGUsIGEgY2VydGFpbiBicm93c2VyIHRoYXQgc2hhbGwgcmVtYWluIG5hbWVsZXNzIHJlcXVpcmVzIGFuICZsdDtvYmplY3QmZ3Q7IHRhZyB0byBub3Qgb25seSBoYXZlIGEgPGNvZGU+ZGF0YT08L2NvZGU+IG9wdGlvbiBidXQgYWxzbyBhIDxjb2RlPm1vdmllPTwvY29kZT4gcGFyYW1ldGVyIHdoZW4gc2VydmluZyBGbGFzaCBjb250ZW50LiBXaXRoIG9ubHkgb25lIG9mIHRoZXNlIHNwZWNpZmllZCwgdGhlIGZpbGUgd2lsbCBub3QgcGxheTsgeWV0IHdpdGggYm90aCB0aGUgZmlsZSBpcyBkb3dubG9hZGVkIDxlbT50d2ljZTwvZW0+IGFuZCB0aGUgZG93bmxvYWQgY291bnRlciBnb2VzIHVwIGJ5IHR3by4gU28gdGhlIG51bWJlciBvZiB2aXNpdG9ycyB5b3UgaGF2ZSB1c2luZyB0aGlzIGJyb3dzZXIgbWF5IHNrZXcgeW91ciBkb3dubG9hZCBzdGF0cy4gSWYgeW91ciBib3NzIGxpa2VzIHRvIHJlbHkgb24gc3VjaCB2YWx1ZXMgaXQgbWlnaHQgYmUgYmVzdCB0byB0dXJuIHRoZSBvcHRpb24gb2ZmIGFuZCBrZWVwIHF1aWV0ITwvcD4NCjxoND5PcHRpb25zPC9oND4NCjx1bD4NCjxsaT48Y29kZT4xPC9jb2RlPjxiciAvPg0KT24gKHRoZSBkZWZhdWx0IGlmIG9taXR0ZWQpOiBldmVyeSB0aW1lIHRoZSBiYW5uZXIgaXMgc2VydmVkLCB0aGUgZG93bmxvYWQgY291bnRlciBvbiB0aGUgRmlsZXMgdGFiIHdpbGwgaW5jcmVtZW50PC9saT4NCjxsaT48Y29kZT4wPC9jb2RlPjxiciAvPg0KT2ZmOiBldmVyeSB0aW1lIHRoZSBiYW5uZXIgaXMgc2VydmVkLCB0aGUgZG93bmxvYWQgY291bnRlciBvbiB0aGUgRmlsZXMgdGFiIHdpbGwgPGVtPm5vdDwvZW0+IGJlIGluY3JlbWVudGVkLiBUaGlzIG1heSBvciBtYXkgbm90IHJlcXVpcmUgdXNlIG9mIHRoZSA8YSBocmVmPSIjZmlsZXNkaXIiPmZpbGVzX2RpcjwvYT4gb3B0aW9uIGlmIHlvdSBoYXZlIGNoYW5nZWQgeW91ciBkZWZhdWx0IHRleHRwYXR0ZXJuIGRpcmVjdG9yeSBzdHJ1Y3R1cmUuPC9saT4NCjwvdWw+DQoNCjxoMyBpZD0iZmlsZXNkaXIiPjxjb2RlPmZpbGVzX2RpcjwvY29kZT48L2gzPg0KPHA+V2hlbiB0aGUgPGEgaHJlZj0iI2NvdW50ZG93bmxvYWRzIj5jb3VudF9kb3dubG9hZHM8L2E+IGF0dHJpYnV0ZSBpcyB0dXJuZWQgb2ZmLCBmaWxlcyBhcmUgc2VydmVkIGJ5IGRpcmVjdGx5IGFjY2Vzc2luZyB0aGUgVVJMIG9mIHRoZSA8Y29kZT5maWxlczwvY29kZT4gZGlyZWN0b3J5LiBUaGlzIGlzIHVzdWFsbHkgPGVtPmh0dHA6Ly95b3VyZG9tYWluLmNvbS9maWxlczwvZW0+LiBJZiB5b3UgaGF2ZSBjaGFuZ2VkIHlvdXIgZGlyZWN0b3J5IHN0cnVjdHVyZSBhbmQgdGhlIGZpbGVzIGRpcmVjdG9yeSBpcyBzb21ld2hlcmUgZWxzZSBvciBjYWxsZWQgc29tZXRoaW5nIGVsc2UsIHNwZWNpZnkgaXQgd2l0aCB0aGlzIG9wdGlvbi4gVGhlIGRlZmF1bHQgaXMgPGNvZGU+ZmlsZXM8L2NvZGU+LjwvcD4NCg0KPGgyPjxhIGlkPSJmaWxlZXhhbXBsZXMiPjwvYT5GaWxlIG1vZGUgZXhhbXBsZXM8L2gyPg0KPHA+VG8gaGlnaGxpZ2h0IHRoZSBmZWF0dXJlcywgd2UgYXJlIGdvaW5nIHRvIHVzZSB0aGUgc2FtZSB6b28gd2ViIHNpdGUgYXMgaW4gdGhlIDxhIGhyZWY9IiNpbWdleGFtcGxlcyI+SW1hZ2UgbW9kZSBleGFtcGxlczwvYT4uIFRoaXMgdGltZSB5b3UgaGF2ZSB1cGxvYWRlZCBhIGZldyBTaG9ja3dhdmUgRmxhc2ggZG9jdW1lbnRzIGFib3V0IHZhcmlvdXMgYW5pbWFscyBhbmQgYSBjb3VwbGUgb2Ygc2hvcnQgbW92aWVzIGFib3V0IGNoZWV0YWhzIHVuZGVyIGEgZmlsZSBjYXRlZ29yeSBjYWxsZWQgImFuaW1hbHMiLiBUaGUgbW92aWVzIGFyZSBzdWItY2F0ZWdvcmlzZWQgYXMgYmVmb3JlLiBUaGUgPGNvZGU+ZGVzY3JpcHRpb248L2NvZGU+IGZpZWxkIG9mIGVhY2ggZmlsZSBob2xkcyBhIHVybCB0byBhbiBhcnRpY2xlIGFib3V0IGVhY2ggYW5pbWFsIHVzaW5nIDxjb2RlPmxpbmtfdXJsPS9hbmltYWxzL2FuaW1hbE5hbWU7PC9jb2RlPjwvcD4NCg0KPHA+WW91IGNhbiBkbyBhbGwgdGhlIHNhbWUgdGhpbmdzIGFzIGluIGltYWdlIG1vZGUgdG8gY2hvb3NlIHdoaWNoIGZpbGVzIG1hdGNoIHdoYXQgdGV4dC9jYXRlZ29yaWVzIHNvIHdlJ2xsIG5vdCBjb3ZlciB0aGF0IGhlcmUuIE9ubHkgdGhlIG5ldyBvcHRpb25zIGFyZSBjb3ZlcmVkIG9yIHdoZXJlIGFuIG9wdGlvbiBkaWZmZXJzIHNpZ25pZmljYW50bHkuPC9wPg0KDQo8aDMgaWQ9ImZlZzEiPkV4YW1wbGUgMTwvaDM+DQo8cHJlPiZsdDt0eHA6c21kX3JhbmRvbV9iYW5uZXIgbW9kZT0iZmlsZSIgY2F0ZWdvcnk9ImFuaW1hbHMiIGF2b2lkX3RleHQ9Ij9rZXl3b3JkcyIgY29tcGFyZV90bz0iZmlsZW5hbWUsIGRlc2NyaXB0aW9uIiBzdWJjYXRzPSIxIiAvJmd0OzwvcHJlPg0KDQo8cD5GYWlybHkgc3RyYWlnaHRmb3J3YXJkLiBQaWNrcyBhbnkgZmlsZSBpbiB0aGUgY2F0ZWdvcnkgY2FsbGVkICdhbmltYWxzJyB0aGF0IGRvZXMgbm90IGNvbnRhaW4gYW55IG9mIHRoZSBjdXJyZW50IGFydGljbGUncyBrZXl3b3JkcyBpbiBpdHMgZmlsZW5hbWUgb3IgZGVzY3JpcHRpb24gZmllbGRzLjwvcD4NCjxwPkFzc3VtaW5nIGl0IHNlbGVjdHMgYSBzaG9ja3dhdmUgZmxhc2ggZmlsZSwgdGhlIHRhZyBpdCBvdXRwdXRzIG1pZ2h0IGJlOjwvcD4NCg0KPHByZT4NCiZsdDtvYmplY3QgZGF0YT0iaHR0cDovL215Z3JlYXR6b28uY29tL2ZpbGVfZG93bmxvYWQvMiIgdHlwZT0iYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giIHdpZHRoPSIzMDAiIGhlaWdodD0iNzUiIGlkPSJpZDc0NjU4OTMiJmd0Ow0KJmx0O3BhcmFtIG5hbWU9Im1vdmllIiB2YWx1ZT0iaHR0cDovL215Z3JlYXR6b28uY29tL2ZpbGVfZG93bmxvYWQvMiIgLyZndDsNCiZsdDsvb2JqZWN0Jmd0Ow0KPC9wcmU+DQoNCjxoMyBpZD0iZmVnMiI+RXhhbXBsZSAyPC9oMz4NCjxwPlVzaW5nIHRoZSBzYW1lIGV4YW1wbGUgYXMgaW4gPGEgaHJlZj0iI2ZlZzEiPmV4YW1wbGUgMTwvYT4sIGlmIHlvdSBnbyB0byB0aGUgRmlsZXMgdGFiLCBzZWxlY3QgdGhlIEZsYXNoIGZpbGUgaXQgY2hvc2UgYW5kIGVkaXQgdGhlIGRlc2NyaXB0aW9uIGZpZWxkIHRvIHJlYWQ6PC9wPg0KDQo8cHJlPg0KbG9vcD1mYWxzZTsNCndpZHRoPTQ1MDsNCmNvZGViYXNlPWh0dHA6Ly9teWdyZWF0em9vLmNvbS87DQppZD0iem9vYmplY3QiOw0Kc3RhbmRieT0ibG9hZGluZy4uLiI7DQpiZ2NvbG9yPSMwMDY4MDA7DQo8L3ByZT4NCg0KPHA+VGhlbiB5b3Ugd291bGQgZ2V0IGFuIG9iamVjdCB0YWcgdGhhdCByZXNlbWJsZWQgdGhpczo8L3A+DQoNCjxwcmU+DQombHQ7b2JqZWN0IGRhdGE9Imh0dHA6Ly9teWdyZWF0em9vLmNvbS9maWxlX2Rvd25sb2FkLzIiIHR5cGU9ImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIiB3aWR0aD0iNDUwIiBoZWlnaHQ9Ijc1IiBpZD0iem9vYmplY3QiJmd0Ow0KJmx0O3BhcmFtIG5hbWU9Im1vdmllIiB2YWx1ZT0iaHR0cDovL215Z3JlYXR6b28uY29tL2ZpbGVfZG93bmxvYWQvMiIgLyZndDsNCiZsdDtwYXJhbSBuYW1lPSJsb29wIiB2YWx1ZT0iZmFsc2UiIC8mZ3Q7DQombHQ7cGFyYW0gbmFtZT0iY29kZWJhc2UiIHZhbHVlPSJodHRwOi8vbXlncmVhdHpvby5jb20vIiAvJmd0Ow0KJmx0O3BhcmFtIG5hbWU9InN0YW5kYnkiIHZhbHVlPSJsb2FkaW5nLi4uIiAvJmd0Ow0KJmx0O3BhcmFtIG5hbWU9ImJnY29sb3IiIHZhbHVlPSIjMDA2ODAwIiAvJmd0Ow0KJmx0Oy9vYmplY3QmZ3Q7DQo8L3ByZT4NCg0KPHA+SG9wZWZ1bGx5IHlvdSBjYW4gc2VlIHRoYXQgaXQncyBxdWl0ZSBmbGV4aWJsZSBhbmQgc2hvdWxkIGFsbG93IHlvdSB0byB0d2VhayBhbnkgY29udGVudCB0byBwbGF5IGluIG1vc3QgYnJvd3NlcnMuPC9wPg0KDQo8aDMgaWQ9ImZlZzMiPkV4YW1wbGUgMzwvaDM+DQo8cHJlPiZsdDt0eHA6c21kX3JhbmRvbV9iYW5uZXIgbW9kZT0iZmlsZSIgY2F0ZWdvcnk9ImFuaW1hbHMiIG1hdGNoX3RleHQ9ImNoZWV0YWgiIHN1YmNhdHM9IjEiIGxpbmtfaW49ImRlc2NyaXB0aW9uIiBpbWdjbGFzcz0iZmxvYmplY3RzIiAvJmd0OzwvcHJlPg0KDQo8cD5JZiBvbmUgb2YgdGhlIHJvd3MgaW4gdGhlIGRlc2NyaXB0aW9uIGZpZWxkIG9mIHRoZSA8Y29kZT5jaGVldGFoX2NoYXNpbmdfZGVlci53bXY8L2NvZGU+IGZpbGUgaXMgPGNvZGU+dXJsX2xpbms9L2FuaW1hbHMvY2hlZXRhaC1jaGFzaW5nLWRlZXI8L2NvZGU+IHRoZW4gY2xpY2tpbmcgb24gdGhlIGVtYmVkZGVkIG1vdmllIHdpbGwgdGFrZSB0aGUgdmlzaXRvciB0byB0aGF0IGFydGljbGUuIEluIGFkZGl0aW9uIHRvIHRoZSB1c3VhbCBhdHRyaWJ1dGVzLCB0aGlzIGFuZCBhbGwgb2JqZWN0cyBkaXNwbGF5ZWQgYnkgdGhlIHBsdWdpbiB3aWxsIHRha2Ugb24gYSA8Y29kZT5jbGFzcz0iZmxvYmplY3RzIjwvY29kZT4gYXR0cmlidXRlLiBUaGlzIGNhbiBiZSBvdmVycmlkZGVuIG9uIGEgZmlsZS1ieS1maWxlIGJhc2lzIGJ5IGFkZGluZyA8Y29kZT5jbGFzcz0iYW5vdGhlckNsYXNzTmFtZSI7PC9jb2RlPiBhcyBhbiBlbnRyeSBpbiB0aGUgPGNvZGU+ZGVzY3JpcHRpb248L2NvZGU+IGZpZWxkLjwvcD4NCg0KPGgyPjxhIG5hbWU9ImNyZWRpdHMiPjwvYT5DcmVkaXRzPC9oMj4NCg0KPHA+VGhpcyBwbHVnaW4gd2FzIG9yaWdpbmFsbHkgYmFzZWQgb24gZHJ1X3JhbmRvbV9pbWFnZSBhbmQgcGxhZ2lhcmlzZXMgaWRlYXMgZnJvbSA8YSBocmVmPSJodHRwOi8vZm9ydW0udGV4dHBhdHRlcm4uY29tL3ZpZXd0b3BpYy5waHA/aWQ9NTE3NiI+Um9iIFNhYmxlJ3MgcnNzX3RodW1icG9wPC9hPiBhbmQgdmFyaW91cyBUWFBlcnMgaW4gdGhlIGNvbW11bml0eSB3aG8gaGF2ZSBzdWdnZXN0ZWQgZmVhdHVyZXMgYW5kIGltcHJvdmVtZW50cy4gTWFueSB0aGFua3MgdG8gYWxsIHdobyBoYXZlIGhlbHBlZCBjcmFmdCB0aGlzIHBsdWdpbi48L3A+IjtzOjQ6ImNvZGUiO3M6MTQ5Njg6Ii8vIHYwLjEgIEluaXRpYWwgcHVibGljIHJlbGVhc2UNCi8vIHYwLjExIEFkZGVkIFBGWCB0byBxdWVyeSAodGhhbmtzIG1lcmN1cnkpDQovLyB2MC4xMiBGaXhlZCBoZWxwIHRvIGluY2x1ZGUgdHJhaWxpbmcgc2xhc2hlcyAodGhhbmtzIHZpdHRvcmlvKQ0KLy8gdjAuMTMgVW5yZWxlYXNlZC4gQWRkZWQgbG9va19pbj1jYXRlZ29yeSBhbmQgcmVmZXJlcg0KLy8gdjAuMTQgQWRkZWQgbWF0Y2hfdGV4dCBhbmQgdXNlX2FsdCAodGhhbmtzIGx1a2VwZXJtc24pDQovLyB2MC4xNSBBZGRlZCBhbHdheXNfZGlzcGxheSBhbmQgbGltaXQgKHRoYW5rcyBsdWtlcGVybXNuKQ0KLy8gdjAuMTVhIEJ1Z2ZpeCBmb3IgbGlua2NhcHRpb24gKHRoYW5rcyBtZXJjdXJ5KQ0KLy8gdjAuMTYgVGlnaHRlbmVkIGltYWdlKCkgcGFyYW1zIGZvciB0eHAgdjQuMC40IGNvbXBsaWFuY2UNCi8vIHYwLjE3IEFkZGVkIHRodW1iLCBsaW5rcHJlZml4IGFuZCBsaW5rYWx0IG9wdGlvbnMNCi8vIHYwLjE3YSBiaWQgb3B0aW9uIG5vdyB3b3JrcyB3aXRoIGV4aXN0aW5nIHVybCBwYXJhbXMgKHRoYW5rcyBQYXB1YXNzKQ0KLy8gdjAuMTggQWRkZWQgaW1nY2xhc3Mgb3B0aW9uICh0aGFua3MgRGlnaXRhbFJlYWxtKQ0KLy8gdjAuMiAgTWFqb3Igb3ZlcmhhdWwuIEFkZGVkIHN1YmNhdGVnb3J5IHN1cHBvcnQgKHRoYW5rcyBsdWtlcGVybXNuIGFuZCBzYW50aGVvKS4gVXNlcyBzbWRfbGliLiBFbmhhbmNlZCBtYXRjaF90ZXh0L2F2b2lkX3RleHQgc28gbG9va19pbiBpcyBubyBsb25nZXIgbmVlZGVkOyBkcm9wcGVkIHVzZV9hbHQgYW5kIGFkZGVkIGNvbXBhcmVfdG87IHJlcGxhY2VkIGxpbmtjYXB0aW9uL2xpbmthbHQgd2l0aCBsaW5rX2luOyBhZGRlZCBpZF9wcmVmaXg7IGxpbmtwcmVmaXggaXMgbm93IGxpbmtfcHJlZml4DQovLyB2MC4yMSBBZGRlZCBNTFAoTXVsdGktTGluZ3VhbCBQYWNrKSBzdXBwb3J0DQovLyB2MC4yMiBBZGRlZCByYXdfdXJsIG9wdGlvbg0KLy8gdjAuMjMgQWdhaW5zdCBiZXR0ZXIganVkZ2VtZW50LCBhZGRlZCB0YXJnZXQgb3B0aW9uICh0aGFua3MganN0dWJicywgY2R0YXZpaml0KQ0KLy8gdjAuMyAgQWRkZWQgc3VwcG9ydCBmb3IgZmlsZXMgYXMgd2VsbCBhcyBpbWFnZXMgLSBmaW5hbGx5LCB2aWRlby9zd2YgYmFubmVycyBhcmUgYSByZWFsaXR5IQ0KDQpyZWdpc3Rlcl9jYWxsYmFjaygnc21kX3JiYW5fZW51bV9zdHInLCAnbDEwbi5lbnVtZXJhdGVfc3RyaW5ncycpOw0KZ2xvYmFsICRzbWRfcmJhbl9zdHI7DQokc21kX3JiYW5fc3RyID0gYXJyYXkoDQoJJ3dpZHRoJyA9PiAnMzAwJywNCgknaGVpZ2h0JyA9PiAnNzUnLA0KKTsNCg0KZnVuY3Rpb24gc21kX3JhbmRvbV9iYW5uZXIoJGF0dHMpIHsNCglyZXF1aXJlX3BsdWdpbignc21kX2xpYicpOw0KCWdsb2JhbCAkaW1nX2RpciwgJGZpbGVfYmFzZV9wYXRoLCAkc21kX3JiYW5fc3RyOw0KCWRlZmluZSgnRExNX1RSJywgJ0BAJyk7DQoJZGVmaW5lKCdETE1fUkVDJywgJ3wnKTsNCgkkY291bnRfZG93bmxvYWRzID0gdHJ1ZTsNCg0KCS8vICoqIGFsbG93YWJsZSBvcHRpb25zIChkZWZhdWx0IGxpc3RlZCBmaXJzdCkNCgkkY29tcGFyZVRvID0gYXJyYXkoImltYWdlOm5hbWUiLCJpbWFnZTppZCIsImltYWdlOmFsdCIsImltYWdlOmNhcHRpb24iLCJpbWFnZTpjYXRlZ29yeSIsImZpbGU6ZmlsZW5hbWUiLCJmaWxlOmNhdGVnb3J5IiwiZmlsZTpkZXNjcmlwdGlvbiIsImZpbGU6c3RhdHVzIiwiZmlsZTpzaXplIik7DQoJJGxpbmtJbiA9IGFycmF5KCIiLCJpbWFnZTpjYXB0aW9uIiwiaW1hZ2U6YWx0IiwiZmlsZTpkZXNjcmlwdGlvbiIpOw0KCSRtb2RlcyA9IGFycmF5KCJpbWFnZSIsImZpbGUiKTsNCg0KCS8vICoqIGxvb2t1cCB0YWJsZXMNCgkkaHRtbE9iakZpeGVkID0gYXJyYXkoImlkIiwiZGF0YSIsImhlaWdodCIsInR5cGUiLCJ3aWR0aCIpOw0KCSRodG1sT2JqUGFyYW0gPSBhcnJheSgiY2xhc3MiLCJ0aXRsZSIsInN0eWxlIiwiZGlyIiwibGFuZyIsInhtbDpsYW5nIiwiYWxpZ24iLCJhcmNoaXZlIiwiYm9yZGVyIiwiY2xhc3NpZCIsImNvZGViYXNlIiwiY29kZXR5cGUiLCJkZWNsYXJlIiwiaHNwYWNlIiwibmFtZSIsInN0YW5kYnkiLCJ1c2VtYXAiLCJ2c3BhY2UiKTsNCgkkb2JqTWltZVR5cGUgPSBhcnJheSgiYXZpIiA9PiBhcnJheSgidmlkZW8vYXZpIiwgIlZpZGVvIiksDQoJCQkJCQkJCSJmbGF8ZmxhYyIgPT4gYXJyYXkoImF1ZGlvL2ZsYWMiLCAiQXVkaW8iKSwNCgkJCQkJCQkJImZsdnxzd2YiID0+IGFycmF5KCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIsICJGbGFzaCIpLA0KCQkJCQkJCQkiamF2YSIgPT4gYXJyYXkoImFwcGxpY2F0aW9uL3gtamF2YS1hcHBsZXQiLCAiQXBwIiksDQoJCQkJCQkJCSJtaWQiID0+IGFycmF5KCJhdWRpby94LW1pZGkiLCAiQXVkaW8iKSwNCgkJCQkJCQkJIm1vdiIgPT4gYXJyYXkoInZpZGVvL3F1aWNrdGltZSIsICJWaWRlbyIpLA0KCQkJCQkJCQkibXBnfG1wZWd8bXA0IiA9PiBhcnJheSgidmlkZW8vbXBlZyIsICJWaWRlbyIpLA0KCQkJCQkJCQkibXAyfG1wM3xtNGEiID0+IGFycmF5KCJhdWRpby9tcGVnIiwgIkF1ZGlvIiksDQoJCQkJCQkJCSJvZ3Z8b2dhfG9neHxvZ2ciID0+IGFycmF5KCJhcHBsaWNhdGlvbi9vZ2ciLCAiQXVkaW8iKSwNCgkJCQkJCQkJIm9mciIgPT4gYXJyYXkoImFwcGxpY2F0aW9uL3gtb2ZyIiwgIkF1ZGlvIiksDQoJCQkJCQkJCSJyYXxybSIgPT4gYXJyYXkoImF1ZGlvL3gtcG4tcmVhbHZpZGVvIiwgIlZpZGVvIiksDQoJCQkJCQkJCSJ3YXYiID0+IGFycmF5KCJhdWRpby94LXdhdiIsICJBdWRpbyIpLA0KCQkJCQkJCQkid212fHdtYXxhc2YiID0+IGFycmF5KCJ2aWRlby94LW1zLXdtdiIsICJBdWRpbyIpLA0KCQkJCQkJCQkpOw0KCSRvYmpUZW1wbGF0ZUZpeGVkID0gJ3R5cGU9IkBAdHlwZSIgZGF0YT0iQEBkYXRhIiB3aWR0aD0iQEB3aWR0aCIgaGVpZ2h0PSJAQGhlaWdodCIgQEBvdGhlcnMgJzsNCgkkb2JqVGVtcGxhdGUgPSBhcnJheSgNCgkJIkZsYXNoIiA9PiAkb2JqVGVtcGxhdGVGaXhlZC4gJ2lkPSJAQGlkIj48cGFyYW0gbmFtZT0ibW92aWUiIHZhbHVlPSJAQGRhdGEiIC8+JywNCgkJIkF1ZGlvIiA9PiAkb2JqVGVtcGxhdGVGaXhlZC4gJz48cGFyYW0gbmFtZT0ic3JjIiB2YWx1ZT0iQEBkYXRhIiAvPicsDQoJCSJWaWRlbyIgPT4gJG9ialRlbXBsYXRlRml4ZWQuICc+JywNCgkJKTsNCg0KCS8vICoqIHBsdWdpbiBvcHRpb25zDQoJaWYgKGlzX2FycmF5KCRhdHRzKSkgZXh0cmFjdCgkYXR0cyk7DQoJJGNhdGVnb3J5ID0gaXNzZXQoJGNhdGVnb3J5KSA/ICgoJGNhdGVnb3J5PT0iIikgPyAiJSIgOiBkb1NsYXNoKCRjYXRlZ29yeSkpIDogIiUiOw0KCSRtYXRjaF90ZXh0ID0gaXNzZXQoJG1hdGNoX3RleHQpID8gJG1hdGNoX3RleHQgOiAiIjsNCgkkYXZvaWRfdGV4dCA9IGlzc2V0KCRhdm9pZF90ZXh0KSA/ICRhdm9pZF90ZXh0IDogIiI7DQoJJG1vZGUgPSAoaXNzZXQoJG1vZGUpICYmIGluX2FycmF5KCRtb2RlLCRtb2RlcykpID8gJG1vZGUgOiAkbW9kZXNbMF07DQoJJHJlZmVyZXIgPSBpc3NldCgkcmVmZXJlcikgPyAkcmVmZXJlciA6ICJiaWQiOw0KCSRsaW1pdCA9IGlzc2V0KCRsaW1pdCkgPyAkbGltaXQ6ICIxIjsNCgkkaW1nY2xhc3MgPSBpc3NldCgkaW1nY2xhc3MpID8gJGltZ2NsYXNzIDogIiI7DQoJJGlkX3ByZWZpeCA9IGlzc2V0KCRpZF9wcmVmaXgpID8gJGlkX3ByZWZpeCA6ICJhcnRpY2xlLSI7DQoJJGxpbmtfcHJlZml4ID0gaXNzZXQoJGxpbmtfcHJlZml4KSA/ICRsaW5rX3ByZWZpeCA6ICIiOw0KCSRsaW5rX2luID0gKGlzc2V0KCRsaW5rX2luKSAmJiBpbl9hcnJheSgkbW9kZS4iOiIuJGxpbmtfaW4sJGxpbmtJbikpID8gJGxpbmtfaW4gOiAkbGlua0luWzBdOw0KCSRzdWJjYXRzID0gaXNzZXQoJHN1YmNhdHMpID8gdHJ1ZSA6IGZhbHNlOw0KCSR0aHVtYiA9IGlzc2V0KCR0aHVtYikgPyB0cnVlIDogZmFsc2U7DQoJJHJhd191cmwgPSBpc3NldCgkcmF3X3VybCkgPyB0cnVlIDogZmFsc2U7DQoJJGFsd2F5c19kaXNwbGF5ID0gaXNzZXQoJGFsd2F5c19kaXNwbGF5KSA/IHRydWUgOiBmYWxzZTsNCgkkdGFyZ2V0ID0gaXNzZXQoJHRhcmdldCkgPyAnIHRhcmdldD0iJyAuJHRhcmdldC4gJyInIDogIiI7DQoJJGNvdW50X2Rvd25sb2FkcyA9IChpc3NldCgkY291bnRfZG93bmxvYWRzKSAmJiAkY291bnRfZG93bmxvYWRzPT0iMSIpID8gdHJ1ZSA6IGZhbHNlOw0KCSRmaWxlc19kaXIgPSBpc3NldCgkZmlsZXNfZGlyKSA/ICRmaWxlc19kaXIgOiAiZmlsZXMiOw0KDQoJLy8gRXhwZXJpbWVudGFsOiBuZWVkcyBxdW90ZS1hYmlsaXR5IGZpeGluZw0KCWlmIChpc3NldCgkdGVtcGxhdGVzKSkgew0KCQlmb3JlYWNoIChleHBsb2RlKCIsIiwgJHRlbXBsYXRlcykgYXMgJHRTdHJpbmcpIHsNCgkJCSR0SXRlbXMgPSBleHBsb2RlKCI6OiIsJHRTdHJpbmcpOw0KCQkJJG9ialRlbXBsYXRlW3RyaW0oJHRJdGVtc1swXSldID0gJG9ialRlbXBsYXRlRml4ZWQudHJpbSgkdEl0ZW1zWzFdKTsNCgkJfQ0KCX0NCg0KCSRjb21wYXJlVG9PcHRzID0gYXJyYXkoKTsNCglpZiAoaXNzZXQoJGNvbXBhcmVfdG8pKSB7DQoJCSRjdExpc3QgPSBwcmVnX3NwbGl0KCcvWyxcc10rLycsJGNvbXBhcmVfdG8sLTEsUFJFR19TUExJVF9OT19FTVBUWSk7DQoJCWZvciAoJGlkeCA9IDA7ICRpZHggPCBjb3VudCgkY3RMaXN0KTsgJGlkeCsrKSB7DQoJCQlpZihpbl9hcnJheSgkbW9kZS4iOiIuJGN0TGlzdFskaWR4XSwkY29tcGFyZVRvKSkgew0KCQkJCSRjb21wYXJlVG9PcHRzW10gPSAkY3RMaXN0WyRpZHhdOw0KCQkJfQ0KCQl9DQoJfQ0KCWlmKGNvdW50KCRjb21wYXJlVG9PcHRzKSA8PSAwKSB7DQoJCS8vIEZpbmQgdGhlIGZpcnN0IGVudHJ5IG1hdGNoaW5nICRtb2RlIGFuZCB1c2UgdGhhdA0KCQlmb3JlYWNoICgkY29tcGFyZVRvIGFzICRjbXApIHsNCgkJCWlmIChzdHJwb3MoJGNtcCwgJG1vZGUuIjoiKSA9PT0gMCkgew0KCQkJCSRjb21wYXJlVG9PcHRzW10gPSBzdWJzdHIoJGNtcCxzdHJsZW4oJG1vZGUpKzEpOw0KCQkJCWJyZWFrOw0KCQkJfQ0KCQl9DQoJfQ0KDQoJLy8gKiogaW5pdCB2YXJpYWJsZXMNCgkkd2hlcmUgPSAiIjsNCgkkZmllbGRzID0gKCRtb2RlPT0iaW1hZ2UiKSA/ICJpZCwgZXh0LCBjYXB0aW9uLCBhbHQiIDogImlkLCBmaWxlbmFtZSwgZGVzY3JpcHRpb24sIHN0YXR1cywgc2l6ZSI7DQoJJGRiVGFibGUgPSAoJG1vZGU9PSJpbWFnZSIpID8gInR4cF9pbWFnZSIgOiAidHhwX2ZpbGUiOw0KCSRtYXRjaEFycmF5ID0gYXJyYXkoKTsNCgkkYXZvaWRBcnJheSA9IGFycmF5KCk7DQoJJG1hdGNoVmFycyA9IGFycmF5KCI/YyIsICI/cyIsICI/dCIsICI/aWQiLCAiP2ZpZWxkIik7DQoJJHdoZXJlQU5EID0gYXJyYXkoKTsNCg0KCS8vICoqIHByb2Nlc3MgbWF0Y2hfdGV4dA0KCWlmICgkbWF0Y2hfdGV4dCAhPSAiIiApIHsNCgkJLy8gQ29udmVydCB0aGUgc3RyaW5nIGludG8gYW4gU1FMLXN0eWxlICdpbicgbGlzdC4NCgkJLy8gUHJvY2VzcyB0aGUgc3BlY2lhbCAoJz9zb21ldGhpbmcnKSBjYXNlcyB0b28uDQoJCSRyZXRBcnJheSA9IHNtZF9nZXRBdHRzKCRtYXRjaF90ZXh0LCAkbWF0Y2hWYXJzLCAkaWRfcHJlZml4KTsNCgkJJG1hdGNoQXJyYXkgPSAkcmV0QXJyYXlbMF07DQoNCgkJLy8gTWFrZSB1cCB0aGUgV0hFUkUgc3RhdGVtZW50IGZyb20gdGhlIGNvbWJpbmVkIGxpc3Qgb2YgbWF0Y2hlcy4NCgkJLy8gVGhlIGNhdGVnb3JpZXMvaW1hZ2UgSURzIGFyZSBPUmVkIHRvZ2V0aGVyIGluIGJyYWNrZXRzIGZpcnN0DQoJCS8vIGJlZm9yZSB0aGUgbmVnYXRpb24gb3B0aW9ucyBhcmUgdGFja2VkIG9uIGFzIEFORHMgYWZ0ZXJ3YXJkcw0KCQkkd2hlcmVUbXAgPSAiIjsNCgkJJHdoZXJlT1IgPSBhcnJheSgpOw0KDQoJCWlmIChjb3VudCgkbWF0Y2hBcnJheSkgPiAwKSB7DQoJCQlmb3JlYWNoICgkY29tcGFyZVRvT3B0cyBhcyAkY29tcCkgew0KCQkJCSRob2xkID0gYXJyYXkoKTsNCgkJCQlmb3IgKCRpZHggPSBjb3VudCgkbWF0Y2hBcnJheSk7ICRpZHggPj0wOyAkaWR4LS0pIHsNCgkJCQkJaWYgKGVtcHR5KCRtYXRjaEFycmF5WyRpZHhdKSkgew0KCQkJCQkJdW5zZXQoJG1hdGNoQXJyYXlbJGlkeF0pOw0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJJGhvbGRbXSA9ICRjb21wIC4gIiBMSUtFICclIiAuJG1hdGNoQXJyYXlbJGlkeF0uICIlJyI7DQoJCQkJCX0NCgkJCQl9DQoJCQkJJHdoZXJlVG1wID0gaW1wbG9kZSgiIE9SICIsJGhvbGQpOw0KDQoJCQkJaWYgKHRyaW0oJHdoZXJlVG1wKSAhPSAiIikgew0KCQkJCQkkd2hlcmVPUltdID0gJHdoZXJlVG1wOw0KCQkJCX0NCgkJCX0NCgkJfQ0KDQoJCWlmIChjb3VudCgkd2hlcmVPUikgPiAwKSB7DQoJCQkkd2hlcmVBTkRbXSA9ICcoJyAuaW1wbG9kZSgiIE9SICIsJHdoZXJlT1IpLiAnKSc7DQoJCX0NCgl9DQoNCgkvLyAqKiBkbyB0aGUgc2FtZSBmb3IgYXZvaWRfdGV4dA0KCWlmICgkYXZvaWRfdGV4dCAhPSAiIiApIHsNCgkJLy8gQ29udmVydCB0aGUgc3RyaW5nIGludG8gYW4gU1FMLXN0eWxlICdpbicgbGlzdC4NCgkJLy8gUHJvY2VzcyB0aGUgc3BlY2lhbCAoJz9zb21ldGhpbmcnKSBjYXNlcyB0b28uDQoJCSRyZXRBcnJheSA9IHNtZF9nZXRBdHRzKCRhdm9pZF90ZXh0LCAkbWF0Y2hWYXJzLCAkaWRfcHJlZml4KTsNCgkJJGF2b2lkQXJyYXkgPSAkcmV0QXJyYXlbMF07DQoNCgkJLy8gTWFrZSB1cCB0aGUgV0hFUkUgc3RhdGVtZW50IGZyb20gdGhlIGNvbWJpbmVkIGxpc3Qgb2YgTk9UIG1hdGNoZXMuDQoJCSR3aGVyZVRtcCA9ICIiOw0KCQkkd2hlcmVPUiA9IGFycmF5KCk7DQoNCgkJaWYgKGNvdW50KCRhdm9pZEFycmF5KSA+IDApIHsNCgkJCWZvcmVhY2ggKCRjb21wYXJlVG9PcHRzIGFzICRjb21wKSB7DQoJCQkJJGhvbGQgPSBhcnJheSgpOw0KCQkJCWZvciAoJGlkeCA9IGNvdW50KCRhdm9pZEFycmF5KTsgJGlkeCA+PTA7ICRpZHgtLSkgew0KCQkJCQlpZiAoZW1wdHkoJGF2b2lkQXJyYXlbJGlkeF0pKSB7DQoJCQkJCQl1bnNldCgkYXZvaWRBcnJheVskaWR4XSk7DQoJCQkJCX0gZWxzZSB7DQoJCQkJCQkkaG9sZFtdID0gJGNvbXAgLiAiIExJS0UgJyUiIC4kYXZvaWRBcnJheVskaWR4XS4gIiUnIjsNCgkJCQkJfQ0KCQkJCX0NCgkJCQkkd2hlcmVUbXAgPSBpbXBsb2RlKCIgT1IgIiwkaG9sZCk7DQoNCgkJCQlpZiAodHJpbSgkd2hlcmVUbXApICE9ICIiKSB7DQoJCQkJCSR3aGVyZU9SW10gPSAkd2hlcmVUbXA7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoNCgkJaWYgKGNvdW50KCR3aGVyZU9SKSA+IDApIHsNCgkJCSR3aGVyZUFORFtdID0gJ05PVCAoJyAuaW1wbG9kZSgiIE9SICIsJHdoZXJlT1IpLiAnKSc7DQoJCX0NCgl9DQoNCgkvLyBXb3JrIG91dCB0aGUgY2F0ZWdvcmllcyB0byBzZWFyY2gNCgkkY2F0c2luID0gYXJyYXkoKTsNCgkkZnVsbENhdExpc3QgPSBhcnJheSgpOw0KCSRub3RDYXRMaXN0ID0gYXJyYXkoKTsNCgkkY2F0VmFycyA9IGFycmF5KCI/YyIsIj9pZCIsIj9zIiwiP3QiLCI/ZmllbGQiLCIhYyIsIiFpZCIsIiFzIiwiIXQiLCIhZmllbGQiKTsNCg0KCSRyZXRBcnJheSA9IHNtZF9nZXRBdHRzKCRjYXRlZ29yeSwgJGNhdFZhcnMsICRpZF9wcmVmaXgpOw0KCSRmdWxsQ2F0TGlzdCA9ICRyZXRBcnJheVswXTsNCgkkbm90Q2F0TGlzdCA9ICRyZXRBcnJheVsxXTsNCg0KCS8vIGluY2x1ZGVkIGNhdGVnb3JpZXMNCgkkdG1wYSA9IGFycmF5KCk7DQoJZm9yICgkaWR4ID0gMDsgJGlkeCA8IGNvdW50KCRmdWxsQ2F0TGlzdCk7ICRpZHgrKykgew0KCQlpZiAoJHN1YmNhdHMpIHsNCgkJCSRjYXRlZ3MgPSBzbWRfZ2V0U3ViQ2F0cygkZnVsbENhdExpc3RbJGlkeF0sJG1vZGUpOw0KCQkJZm9yICgkamR4ID0gMDsgJGpkeCA8IGNvdW50KCRjYXRlZ3MpOyAkamR4KyspIHsNCgkJCQlpZiAoJGNhdGVnc1skamR4XVsnbmFtZSddICE9ICJyb290Iikgew0KCQkJCQkkdG1wYVtdID0gIiciIC4kY2F0ZWdzWyRqZHhdWyduYW1lJ10uICInIjsNCgkJCQl9DQoJCQl9DQoJCX0gZWxzZSB7DQoJCQkkdG1wYVtdID0gIiciIC4kZnVsbENhdExpc3RbJGlkeF0uICInIjsNCgkJfQ0KCX0NCglpZiAoY291bnQoJHRtcGEpID4gMCkgew0KCQkkY2F0c2luW10gPSAiY2F0ZWdvcnkgSU4gKCIgLmltcGxvZGUoIiwiLCAkdG1wYSkuICIpIjsNCgl9DQoNCgkvLyBleGNsdWRlZCBjYXRlZ29yaWVzDQoJJHRtcGEgPSBhcnJheSgpOw0KCWZvciAoJGlkeCA9IDA7ICRpZHggPCBjb3VudCgkbm90Q2F0TGlzdCk7ICRpZHgrKykgew0KCQlpZiAoJHN1YmNhdHMpIHsNCgkJCSRjYXRlZ3MgPSBzbWRfZ2V0U3ViQ2F0cygkbm90Q2F0TGlzdFskaWR4XSwkbW9kZSk7DQoJCQlmb3IgKCRqZHggPSAwOyAkamR4IDwgY291bnQoJGNhdGVncyk7ICRqZHgrKykgew0KCQkJCWlmICgkY2F0ZWdzWyRqZHhdWyduYW1lJ10gIT0gInJvb3QiKSB7DQoJCQkJCSR0bXBhW10gPSAiJyIgLiRjYXRlZ3NbJGpkeF1bJ25hbWUnXS4gIiciOw0KCQkJCX0NCgkJCX0NCgkJfSBlbHNlIHsNCgkJCSR0bXBhW10gPSAiJyIgLiRub3RDYXRMaXN0WyRpZHhdLiAiJyI7DQoJCX0NCgl9DQoJaWYgKGNvdW50KCR0bXBhKSA+IDApIHsNCgkJJGNhdHNpbltdID0gImNhdGVnb3J5IE5PVCBJTiAoIiAuaW1wbG9kZSgiLCIsICR0bXBhKS4gIikiOw0KCX0NCg0KCWlmICgoJGNhdGVnb3J5ID09ICIlIikgfHwgKGNvdW50KCRjYXRzaW4pIDw9IDApKSB7DQoJCSR3aGVyZUNhdCA9ICJjYXRlZ29yeSBMSUtFICclJyI7DQoJfSBlbHNlIHsNCgkJJHdoZXJlQ2F0ID0gaW1wbG9kZSgiIEFORCAiLCAkY2F0c2luKTsNCgl9DQoNCgkvLyAqKiBtYWtlIHVwIHRoZSBmaW5hbCBXSEVSRSBzdGF0ZW1lbnQNCgkkd2hlcmVPQiA9ICIgT1JERVIgQlkgUkFORCgpIExJTUlUICRsaW1pdCI7DQoJJHdoZXJlID0gJHdoZXJlQ2F0IC4gKChjb3VudCgkd2hlcmVBTkQpPjApID8gIiBBTkQgIiAuaW1wbG9kZSgiIEFORCAiLCR3aGVyZUFORCkgOiAiIikgLiAkd2hlcmVPQjsNCg0KCS8vICoqIHB1bGwgb3V0IHRoZSByZXF1ZXN0ZWQgb2JqZWN0cw0KCSRycyA9IHNhZmVfcm93cygkZmllbGRzLCAkZGJUYWJsZSwgJHdoZXJlKTsNCglpZiAoISRycykgew0KCQlpZiAoJGFsd2F5c19kaXNwbGF5KSB7DQoJCQkkcnMgPSBzYWZlX3Jvd3MoJGZpZWxkcywgJGRiVGFibGUsICR3aGVyZUNhdCAuICR3aGVyZU9CKTsNCgkJfQ0KCX0NCgkvLyAqKiBkaXNwbGF5IHRoZW0NCgkkc3RhdGljcHJlZml4ID0gImh0dHA6Ly8iOw0KCSRvdXRTdHIgPSAnJzsNCglpZigkcnMpIHsNCgkJZm9yZWFjaCgkcnMgYXMgJHJvdykgew0KCQkJJGxpbmt1cmwgPSAnJzsNCgkJCSRsaW5rTmFtZSA9ICcnOw0KCQkJJHRyaW1PcHRzID0gIiBceDIyXHRcblxyXDBceDBCIjsNCgkJCSRvYmpQYXJhbXMgPSBhcnJheSgpOw0KCQkJJHRoZVBhcmFtcyA9IGFycmF5KCk7DQoJCQkkdGVtcGxhdGVPcHRpb25zID0gYXJyYXkoKTsNCgkJCXN3aXRjaCAoJG1vZGUpIHsNCgkJCQljYXNlICJpbWFnZSI6DQoJCQkJCSRsaW5rTmFtZT10cmltKCgkbGlua19pbj09ImFsdCIpID8gJHJvd1snYWx0J10gOiAoKCRsaW5rX2luPT0iY2FwdGlvbiIpID8gJHJvd1snY2FwdGlvbiddIDogIiIpKTsNCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSAiZmlsZSI6DQoJCQkJCSR0aGVEZXNjID0gc21kX3NwbGl0UmFuZ2UoJHJvd1snZGVzY3JpcHRpb24nXSwgIjtcbiIpOw0KCQkJCQlmb3JlYWNoICgkdGhlRGVzYyBhcyAkcGFyYW1zKSB7DQoJCQkJCQkkcGFyYW1zID0gdHJpbSgkcGFyYW1zKTsNCgkJCQkJCWlmICgkcGFyYW1zICE9ICIiKSB7DQoJCQkJCQkJJHRoZXNlUGFyYW1zID0gZXhwbG9kZSgiPSIsICRwYXJhbXMpOw0KCQkJCQkJCWlmICgkdGhlc2VQYXJhbXNbMF0gPT0gImxpbmtfdXJsIikgew0KCQkJCQkJCQlpZiAoJGxpbmtfaW4gPT0gImRlc2NyaXB0aW9uIikgew0KCQkJCQkJCQkJJGxpbmtOYW1lID0gdHJpbSgkdGhlc2VQYXJhbXNbMV0sICR0cmltT3B0cyk7DQoJCQkJCQkJCX0NCgkJCQkJCQl9IGVsc2UgaWYgKGluX2FycmF5KCR0aGVzZVBhcmFtc1swXSwkaHRtbE9iakZpeGVkKSkgew0KCQkJCQkJCQkkb2JqUGFyYW1zW0RMTV9UUi4kdGhlc2VQYXJhbXNbMF1dID0gdHJpbSgkdGhlc2VQYXJhbXNbMV0sJHRyaW1PcHRzKTsNCgkJCQkJCQl9IGVsc2UgaWYgKGluX2FycmF5KCR0aGVzZVBhcmFtc1swXSwkaHRtbE9ialBhcmFtKSkgew0KCQkJCQkJCQkkb2JqUGFyYW1zW0RMTV9UUi4kdGhlc2VQYXJhbXNbMF1dID0gdHJpbSgkdGhlc2VQYXJhbXNbMV0sJHRyaW1PcHRzKTsNCgkJCQkJCQkJJHRlbXBsYXRlT3B0aW9uc1tdID0gJHRoZXNlUGFyYW1zWzBdLiAnPSInIC5ETE1fVFIuJHRoZXNlUGFyYW1zWzBdLiAnIic7DQoJCQkJCQkJfSBlbHNlIHsNCgkJCQkJCQkJJHRoZVBhcmFtc1skdGhlc2VQYXJhbXNbMF1dID0gdHJpbSgkdGhlc2VQYXJhbXNbMV0sJHRyaW1PcHRzKTsNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQkJYnJlYWs7DQoJCQl9DQoJCQkvLyAqKiBoYW5kbGUgbGlua3MNCgkJCWlmIChzdHJsZW4oJGxpbmtOYW1lKSA+IDApIHsNCgkJCQlpZiAoc3Vic3RyKCRsaW5rTmFtZSwgMCwgc3RybGVuKCRzdGF0aWNwcmVmaXgpKSA9PT0gJHN0YXRpY3ByZWZpeCkgew0KCQkJCQkkbGlua1R5cGUgPSAiRlVMTCI7DQoJCQkJfSBlbHNlIGlmICgkbGlua05hbWVbMF0gPT0gJy8nKSB7DQoJCQkJCWlmICgkbGlua19wcmVmaXggPT0gJycpIHsNCgkJCQkJCSRsaW5rVHlwZSA9ICJST09UX05PX1BSRUZJWCI7DQoJCQkJCX0gZWxzZSBpZiAoc3Vic3RyKCRsaW5rX3ByZWZpeCwgMCwgc3RybGVuKCRzdGF0aWNwcmVmaXgpKSA9PT0gJHN0YXRpY3ByZWZpeCkgew0KCQkJCQkJJGxpbmtUeXBlID0gIkZVTExfUFJFRklYIjsNCgkJCQkJfSBlbHNlIGlmICgkbGlua19wcmVmaXhbMF0gPT0gJy8nKSB7DQoJCQkJCQkkbGlua1R5cGUgPSAiUk9PVCI7DQoJCQkJCX0gZWxzZSB7DQoJCQkJCQkkbGlua1R5cGUgPSAiUkVMQVRJVkUiOw0KCQkJCQl9DQoJCQkJfSBlbHNlIGlmICgkbGlua19wcmVmaXggPT0gJycpIHsNCgkJCQkJJGxpbmtUeXBlID0gIlJFTEFUSVZFIjsNCgkJCQl9IGVsc2UgaWYgKCRsaW5rX3ByZWZpeFswXSA9PSAnLycpIHsNCgkJCQkJJGxpbmtUeXBlID0gIlJPT1QiOw0KCQkJCX0gZWxzZSBpZiAoc3Vic3RyKCRsaW5rX3ByZWZpeCwgMCwgc3RybGVuKCRzdGF0aWNwcmVmaXgpKSA9PT0gJHN0YXRpY3ByZWZpeCkgew0KCQkJCQkkbGlua1R5cGUgPSAiRlVMTF9QUkVGSVgiOw0KCQkJCX0gZWxzZSB7DQoJCQkJCSRsaW5rVHlwZSA9ICJSRUxBVElWRSI7DQoJCQkJfQ0KCQkJCXN3aXRjaCAoJGxpbmtUeXBlKSB7DQoJCQkJCWNhc2UgIkZVTEwiOg0KCQkJCQkJJGxpbmt1cmwgPSAkbGlua05hbWU7DQoJCQkJCQlicmVhazsNCgkJCQkJY2FzZSAiUk9PVF9OT19QUkVGSVgiOg0KCQkJCQkJJGxpbmt1cmwgPSBzaXRlX3VybCgkYXR0cykgLiBzdWJzdHIoJGxpbmtOYW1lLDEpOw0KCQkJCQkJYnJlYWs7DQoJCQkJCWNhc2UgIlJPT1QiOg0KCQkJCQkJJGxpbmt1cmwgPSBzaXRlX3VybCgkYXR0cykgLiBzdWJzdHIoJGxpbmtfcHJlZml4LDEpIC4gJGxpbmtOYW1lOw0KCQkJCQkJYnJlYWs7DQoJCQkJCWNhc2UgIlJFTEFUSVZFIjoNCgkJCQkJZGVmYXVsdDoNCgkJCQkJCSRsaW5rdXJsID0gJGxpbmtfcHJlZml4IC4gJGxpbmtOYW1lOw0KCQkJCQkJYnJlYWs7DQoJCQkJfQ0KCQkJfQ0KCQkJLy8gKiogdGhyb3cgb2JqZWN0IG91dCB0byB0aGUgcGFnZQ0KCQkJaWYgKCRyYXdfdXJsKSB7DQoJCQkJc3dpdGNoICgkbW9kZSkgew0KCQkJCQljYXNlICJpbWFnZSI6DQoJCQkJCQkkb3V0U3RyID0gaHUuJGltZ19kaXIgLiAiLyIgLiRyb3dbJ2lkJ10gLiAoKCR0aHVtYikgPyAndCcgOiAnJykgLiAkcm93WydleHQnXTsNCgkJCQkJCWJyZWFrOw0KCQkJCQljYXNlICJmaWxlIjoNCgkJCQkJCSRvdXRTdHIgPSAoJGNvdW50X2Rvd25sb2FkcykgPyBodS5nVHh0KCdmaWxlX2Rvd25sb2FkJykuJy8nLiRyb3dbJ2lkJ10gOiBodS4kZmlsZXNfZGlyLicvJy4kcm93WydmaWxlbmFtZSddOw0KCQkJCQkJYnJlYWs7DQoJCQkJfQ0KCQkJfSBlbHNlIHsNCgkJCQlzd2l0Y2goJG1vZGUpIHsNCgkJCQkJY2FzZSAiaW1hZ2UiOg0KCQkJCQkJJGltZ09wdGlvbnMgPSBhcnJheSgiaWQiID0+ICRyb3dbJ2lkJ10pOw0KCQkJCQkJaWYgKCRpbWdjbGFzcyAhPSAnJykgew0KCQkJCQkJCSRpbWdPcHRpb25zWyJjbGFzcyJdID0gJGltZ2NsYXNzOw0KCQkJCQkJfQ0KCQkJCQkJJG9iak91dCA9ICgoJHRodW1iKSA/IHRodW1ibmFpbCgkaW1nT3B0aW9ucykgOiBpbWFnZSgkaW1nT3B0aW9ucykpOw0KCQkJCQkJYnJlYWs7DQoJCQkJCWNhc2UgImZpbGUiOg0KCQkJCQkJJHRlbXBsYXRlID0gJyc7DQoJCQkJCQkkZmlsZVBhdGggPSBidWlsZF9maWxlX3BhdGgoJGZpbGVfYmFzZV9wYXRoLCAkcm93WydmaWxlbmFtZSddKTsNCgkJCQkJCSRmaWxlREwgPSAoJGNvdW50X2Rvd25sb2FkcykgPyBodS5nVHh0KCdmaWxlX2Rvd25sb2FkJykuJy8nLiRyb3dbJ2lkJ10gOiBodS4kZmlsZXNfZGlyLicvJy4kcm93WydmaWxlbmFtZSddOw0KCQkJCQkJaWYgKGZpbGVfZXhpc3RzKCRmaWxlUGF0aCkpIHsNCgkJCQkJCQkvLyBHZXQgdGhlIGZpbGUgZXh0ZW5zaW9uIGFuZCBsb29rIGl0IHVwIGluIHRoZSB0YWJsZQ0KCQkJCQkJCSRwYXRoQml0ID0gcGF0aGluZm8oJGZpbGVQYXRoKTsNCgkJCQkJCQkkcGF0aEV4dCA9ICRwYXRoQml0WydleHRlbnNpb24nXTsNCgkJCQkJCQlmb3JlYWNoICgkb2JqTWltZVR5cGUgYXMgJGV4dHMgPT4gJHR5cGVzICkgew0KCQkJCQkJCQlpZiAoaW5fYXJyYXkoJHBhdGhFeHQsIGV4cGxvZGUoRExNX1JFQywkZXh0cykpKSB7DQoJCQkJCQkJCQlpZiAoIWFycmF5X2tleV9leGlzdHMoRExNX1RSLiJ0eXBlIiwgJG9ialBhcmFtcykpIHsNCgkJCQkJCQkJCQkkb2JqUGFyYW1zW0RMTV9UUi4idHlwZSJdID0gJHR5cGVzWzBdOw0KCQkJCQkJCQkJfQ0KCQkJCQkJCQkJaWYgKCFhcnJheV9rZXlfZXhpc3RzKERMTV9UUi4iZGF0YSIsICRvYmpQYXJhbXMpKSB7DQoJCQkJCQkJCQkJJG9ialBhcmFtc1tETE1fVFIuImRhdGEiXSA9ICRmaWxlREw7DQoJCQkJCQkJCQl9DQoJCQkJCQkJCQlpZiAoIWFycmF5X2tleV9leGlzdHMoRExNX1RSLiJpZCIsICRvYmpQYXJhbXMpKSB7DQoJCQkJCQkJCQkJJG9ialBhcmFtc1tETE1fVFIuImlkIl0gPSAiaWQiLm10X3JhbmQoKTsNCgkJCQkJCQkJCX0NCgkJCQkJCQkJCWlmICghYXJyYXlfa2V5X2V4aXN0cyhETE1fVFIuIndpZHRoIiwgJG9ialBhcmFtcykpIHsNCgkJCQkJCQkJCQkkb2JqUGFyYW1zW0RMTV9UUi4id2lkdGgiXSA9IHNtZF9nVHh0KCRzbWRfcmJhbl9zdHIsJ3dpZHRoJyk7DQoJCQkJCQkJCQl9DQoJCQkJCQkJCQlpZiAoIWFycmF5X2tleV9leGlzdHMoRExNX1RSLiJoZWlnaHQiLCAkb2JqUGFyYW1zKSkgew0KCQkJCQkJCQkJCSRvYmpQYXJhbXNbRExNX1RSLiJoZWlnaHQiXSA9IHNtZF9nVHh0KCRzbWRfcmJhbl9zdHIsJ2hlaWdodCcpOw0KCQkJCQkJCQkJfQ0KCQkJCQkJCQkJaWYgKCRpbWdjbGFzcyAhPSAnJyAmJiAhYXJyYXlfa2V5X2V4aXN0cyhETE1fVFIuImNsYXNzIiwgJG9ialBhcmFtcykpIHsNCgkJCQkJCQkJCQkkb2JqUGFyYW1zW0RMTV9UUi4iY2xhc3MiXSA9ICRpbWdjbGFzczsNCgkJCQkJCQkJCQkkdGVtcGxhdGVPcHRpb25zW10gPSAnY2xhc3M9IicgLkRMTV9UUi4gJ2NsYXNzIic7DQoJCQkJCQkJCQl9DQoJCQkJCQkJCQkkdGVtcGxhdGUgPSAkb2JqVGVtcGxhdGVbJHR5cGVzWzFdXTsNCgkJCQkJCQkJCSR0ZW1wbGF0ZSA9IHN0cl9yZXBsYWNlKERMTV9UUi4ib3RoZXJzIiwgaW1wbG9kZSgiICIsICR0ZW1wbGF0ZU9wdGlvbnMpLCAkdGVtcGxhdGUpOw0KCQkJCQkJCQl9DQoJCQkJCQkJfQ0KCQkJCQkJCSRvYmpPdXQgPSAiPG9iamVjdCAiOw0KCQkJCQkJCSRvYmpPdXQgLj0gc3RydHIoJHRlbXBsYXRlLCAkb2JqUGFyYW1zKTsNCgkJCQkJCQlmb3JlYWNoICgkdGhlUGFyYW1zIGFzICRrZXkgPT4gJHZhbHVlKSB7DQoJCQkJCQkJCSRvYmpPdXQgLj0gJzxwYXJhbSBuYW1lPSInLiRrZXkuJyIgdmFsdWU9IicuJHZhbHVlLiciIC8+JzsNCgkJCQkJCQl9DQoJCQkJCQkJJG9iak91dCAuPSAiPC9vYmplY3Q+Ii5uOw0KCQkJCQkJfQ0KCQkJCQkJYnJlYWs7DQoJCQkJfQ0KDQoJCQkJaWYgKCgkbGlua19pbiAhPSAiIikgJiYgKHN0cmxlbigkbGlua3VybCkgPiAwKSkgew0KCQkJCQlpZiAoJHJlZmVyZXIgIT0gIiIpIHsNCgkJCQkJCSRyZWZlcnR4dCA9IHNtZF9hZGRRU1ZhcigkbGlua3VybCwgJHJlZmVyZXIsICRyb3dbJ2lkJ10pOw0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJJHJlZmVydHh0ID0gJGxpbmt1cmw7DQoJCQkJCX0NCgkJCQkJJG91dFN0ciAuPSAnPGEgaHJlZj0iJyAuJHJlZmVydHh0LiAnIicgLiR0YXJnZXQuICc+JyAuICRvYmpPdXQuICc8L2E+JzsNCgkJCQl9IGVsc2Ugew0KCQkJCQkkb3V0U3RyIC49ICRvYmpPdXQ7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfSBlbHNlIHsNCgkJcmV0dXJuOw0KCX0NCg0KCXJldHVybiAkb3V0U3RyOw0KfQ0KLy8gQ2FsbGJhY2sgZm9yIE1MUCBzdHJpbmcgcmVwbGFjZW1lbnQNCmZ1bmN0aW9uIHNtZF9yYmFuX2VudW1fc3RyKCRldmVudCwgJHN0ZXA9JycsICRwcmU9MCkgew0KCWdsb2JhbCAkc21kX3JiYW5fc3RyLCAkc21kTUxQOw0KCSRyID0gYXJyYXkJKA0KCQkJJ293bmVyJyA9PiAnc21kX3JhbmRvbV9iYW5uZXInLA0KCQkJJ3ByZWZpeCcgPT4gJHNtZE1MUFsnc21kX3JhbmRvbV9iYW5uZXInXSwNCgkJCSdsYW5nJyA9PiAnZW4tZ2InLCAvLyBEZWZhdWx0IGxhbmd1YWdlDQoJCQknZXZlbnQnID0+ICdwdWJsaWMnLCAvLyBwdWJsaWMvYWRtaW4vY29tbW9uID0gd2hpY2ggaW50ZXJmYWNlIHRoZSBzdHJpbmdzIHdpbGwgYmUgbG9hZGVkIGludG8NCgkJCSdzdHJpbmdzJyA9PiAkc21kX3JiYW5fc3RyLA0KCQkpOw0KCXJldHVybiAkcjsNCn0iO3M6NDoidHlwZSI7czoxOiIwIjtzOjM6Im1kNSI7czozMjoiOWYyZThmYmMwNjZlOTU2MzY2MGUzMzVhMTU3MjI1ZjQiO30=