# smd_slimbox 0.21 # Lightweight image gallery lightbox wrapper from Christophe Beyl's Slimbox # Stef Dawson # http://www.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: # ...................................................................... YTo5OntzOjQ6Im5hbWUiO3M6MTE6InNtZF9zbGltYm94IjtzOjY6ImF1dGhvciI7czoxMToiU3RlZiBEYXdzb24iO3M6MTA6ImF1dGhvcl91cmkiO3M6MjU6Imh0dHA6Ly93d3cuc3RlZmRhd3Nvbi5jb20iO3M6NzoidmVyc2lvbiI7czo0OiIwLjIxIjtzOjExOiJkZXNjcmlwdGlvbiI7czo3MzoiTGlnaHR3ZWlnaHQgaW1hZ2UgZ2FsbGVyeSBsaWdodGJveCB3cmFwcGVyIGZyb20gQ2hyaXN0b3BoZSBCZXlsJ3MgU2xpbWJveCI7czo0OiJoZWxwIjtzOjE0NzYzOiI8aDE+c21kX3NsaW1ib3g8L2gxPg0KDQo8cD5ZZWFoLCB5ZWFoIDxlbT5hbm90aGVyPC9lbT4gbGlnaHRib3gtc3R5bGUgaW1hZ2UgZ2FsbGVyeSEgQnV0IHRoaXMgdGltZSB1c2luZyA8YSBocmVmPSJodHRwOi8vd3d3LmRpZ2l0YWxpYS5iZS9zb2Z0d2FyZS9zbGltYm94Ij5DaHJpc3RvcGhlIEJleWwnczwvYT4gdWx0cmEtbGlnaHR3ZWlnaHQgU2xpbWJveCAoZGlldCBjb2tlIHZlcnNpb24gb2YgbGlnaHRib3gpIGFuZCBtb290b29scy4gQWxzbyBwbGFnaWFyaXNlcyBjaHVua3Mgb2YgY29kZSBmcm9tIDxhIGhyZWY9Imh0dHA6Ly9mb3J1bS50ZXh0cGF0dGVybi5jb20vdmlld3RvcGljLnBocD9pZD01MTc2Ij5Sb2IgU2FibGUncyByc3NfdGh1bWJwb3A8L2E+LiBNYW55IHRoYW5rcyB0byB0aGUgb3JpZ2luYWwgYXV0aG9ycy48L3A+DQoNCjxoMj5JbnN0YWxsYXRpb248L2gyPg0KDQo8cD5FbnN1cmUgdGhhdCB0aGUgY29udGVudHMgb2YgdGhlIGpzIGZvbGRlciAoPGNvZGU+bW9vdG9vbHMuanM8L2NvZGU+IGFuZCA8Y29kZT5zbGltYm94LmpzPC9jb2RlPikgYW5kIHRoZSBjc3MgZm9sZGVyICg8Y29kZT5zbGltYm94LmNzczwvY29kZT4gYW5kIDQgaW1hZ2VzKSBhcmUgdXBsb2FkZWQgdG8geW91ciBzZXJ2ZXIuIFlvdSBjYW4gcHV0IHRoZSBkaXJlY3RvcmllcyBpbiB0aGUgdGV4dHBhdHRlcm4gcm9vdCBmb2xkZXIgb3Igc29tZXdoZXJlIGVsc2Ugb2YgeW91ciBjaG9pY2UuIEl0IGRvZXNuJ3QgcmVhbGx5IG1hdHRlciB3aGVyZSB5b3UgcHV0IHRoZW0sIHlvdSBqdXN0IGhhdmUgdG8gdGVsbCB0aGUgcGx1Z2luIHdoZXJlIGl0IGlzLjwvcD4NCg0KPHA+V2hlbiBpbnN0YWxsZWQsIHRoaXMgcGx1Z2luIGFkZHMgdHdvIHRhZ3MuIFRoZSBmaXJzdCAoPGNvZGU+c21kX3NsaW1ib3hfaW5jPC9jb2RlPikgZ29lcyBpbiB0aGUgJmx0O2hlYWQmZ3Q7IHNlY3Rpb24gb2YgeW91ciBwYWdlIGFuZCBsb2FkcyB0aGUgcmVxdWlyZWQgbGlicmFyaWVzLiBUaGUgc2Vjb25kICg8Y29kZT5zbWRfc2xpbWJveDwvY29kZT4pIGlzIHRoZSBhY3R1YWwgcGx1Z2luIHRoYXQgZGlzcGxheXMgeW91ciBpbWFnZSBnYWxsZXJ5IChvciBnYWxsZXJpZXMgaWYgeW91J3JlIGZlZWxpbmcgYWR2ZW50dXJvdXMpLjwvcD4NCg0KPHA+QSBxdWljayB3b3JkIGFib3V0IGhvdyBpdCBhbGwgd29ya3M6IHRoZSBwbHVnaW4gb3B0aW9ucyBnb3Zlcm4gd2hpY2ggdGh1bWJuYWlscyB0byB1c2UgYW5kIGhvdyB0aGV5IGFyZSBkaXNwbGF5ZWQgb25seS4gT25jZSB0aGUgdGh1bWJzIGFyZSBjbGlja2VkLCBjb250cm9sIGlzIGhhbmRlZCBvdmVyIHRvIHNsaW1ib3ggYW5kIG1vb3Rvb2xzIHRvIGRvIHRoZSBmYW5jeSB3b3JrLiBUaGVyZWZvcmUsIGlmIHlvdSB3aXNoIHRvIGNvbmZpZ3VyZSB0aGUgbG9vayBvZiB0aGUgImxpZ2h0Ym94IiBwYXJ0LCB5b3UgbmVlZCB0byBlZGl0IDxjb2RlPnNsaW1ib3guanM8L2NvZGU+IGFuZC9vciA8Y29kZT5zbGltYm94LmNzczwvY29kZT4uIE1vcmUgaW5mbyBjYW4gYmUgZm91bmQgb24gPGEgaHJlZj0iaHR0cDovL3d3dy5kaWdpdGFsaWEuYmUvc29mdHdhcmUvc2xpbWJveCI+Q2hyaXN0b3BoZSBCZXlsJ3MgcGFnZTwvYT4uPC9wPg0KDQo8cD5BbHNvLCBpZiB5b3UgYWxyZWFkeSB1c2UgbW9vdG9vbHMgZm9yIHlvdXIgcGFnZSB5b3UgZG9uJ3QgbmVlZCB0byB1cGxvYWQgaXQgYWdhaW4uIEp1c3QgbWFrZSBzdXJlIHRoZSB2ZXJzaW9uIHlvdSB1c2UgaGFzIHRoZSBjb3JlIGZ1bmN0aW9uYWxpdHkgcGx1cyB0aGUgImZ4IiBhbmQgIndpbmRvdyIgbW9kdWxlcyBsaXN0ZWQgb24gQ2hyaXN0b3BoZSdzIHBhZ2UuPC9wPg0KDQo8aDI+VXNhZ2U6IHNtZF9zbGltYm94X2luYzwvaDI+DQoNCjxwPlNvbWV3aGVyZSBpbiB0aGUgJmx0O2hlYWQmZ3Q7IG9mIHRoZSBwYWdlIHRoYXQgeW91IHdhbnQgeW91ciBnYWxsZXJ5IG9uLCBhZGQ6PC9wPg0KDQo8cD48Y29kZT4mbHQ7dHhwOnNtZF9zbGltYm94X2luYyBqc2Rpcj0iL2pzIiBjc3NkaXI9Ii9jc3MiIC8mZ3Q7PC9jb2RlPjwvcD4NCg0KPHA+SWYgeW91IGhhdmUgdGhlIGxpYnJhcmllcyBpbiB0aGUganMgYW5kIGNzcyBmb2xkZXJzIGluIHlvdXIgdGV4dHBhdHRlcm4gcm9vdCBmb2xkZXIsIHRoYXQgd2lsbCBiZSBmaW5lLiBJZiBub3QsIHlvdSBjYW4gY2hhbmdlIHdoZXJlIHRoZSBwbHVnaW4gbG9va3MgZm9yIHRoZSBsaWJyYXJpZXMgYnkgYWRqdXN0aW5nIHRoZSB0d28gb3B0aW9ucy48L3A+DQoNCjxwPklmIHlvdSB3YW50IG1vcmUgY29udHJvbCwgeW91IGhhdmUgdHdvIG1vcmUgb3B0aW9ucyBhdmFpbGFibGUuIFRoZSBmaXJzdCBpcyA8Y29kZT5zY3JpcHRzPC9jb2RlPi4gVGhpcyB0YWtlcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHVwIHRvIDMgYXJndW1lbnRzIGluIHRoaXMgb3JkZXI6IG1vb3Rvb2xzSlNMb2NhdGlvbiwgc2xpbWJveEpTTG9jYXRpb24sIHNsaW1ib3hDU1NMb2NhdGlvbi4gVGhlIG9yZGVyIGlzIGltcG9ydGFudDogbW9vdG9vbHMgbXVzdCBhcHBlYXIgb24gdGhlIHBhZ2UgYmVmb3JlIHNsaW1ib3guanMhIFNvIGlmIHlvdSBoYXZlIHlvdXIgc2NyaXB0cyBpbiBkaWZmZXJlbnQgZGlyZWN0b3JpZXMgb3IgaGF2ZSByZW5hbWVkIHRoZSBmaWxlcywgaW5zdGVhZCBvZiB0aGUgPGNvZGU+Y3NzZGlyPC9jb2RlPiBhbmQgPGNvZGU+anNkaXI8L2NvZGU+IG9wdGlvbnMgeW91IGNvdWxkIGRvOjwvcD4NCg0KPHA+PGNvZGU+Jmx0O3R4cDpzbWRfc2xpbWJveF9pbmMgc2NyaXB0cz0iL3NjcmlwdHMvbW9vdG9vbHMuanMsIC9zYm94L3NsaW1ib3guanMsIC9zYmNzcy9zbGltYm94LmNzcyIgLyZndDs8L2NvZGU+PC9wPg0KDQo8cD5UaGUgdGhyZWUgb3B0aW9ucyBjYW4gZWl0aGVyIGJlIGRpcmVjdCBmaWxlIHBhdGhzLCBhcyBpbiB0aGUgZXhhbXBsZSBhYm92ZSwgb3IgZnVsbCBYSFRNTCB0YWdzIGluY2x1ZGluZyA8Y29kZT4mbHQ7c2NyaXB0Jmd0OzwvY29kZT4gb3IgPGNvZGU+Jmx0O2xpbmsmZ3Q7PC9jb2RlPnRhZ3MuIFlvdSBjYW4gbWl4IGFuZCBtYXRjaCB0aGUgb3B0aW9ucyBpbiBhbnkgd2F5IHlvdSBsaWtlLCBhcyBsb25nIGFzIHRoZSB0b3RhbCBudW1iZXIgb2Ygc2NyaXB0cyB5b3UgdGVsbCB0aGUgdGFnIHRvIGxvYWQgZG9lc24ndCBleGNlZWQgMy4gU28gYW4gZXF1aXZhbGVudCB0byB0aGUgYWJvdmUgaXM6PC9wPg0KDQo8cD48Y29kZT4mbHQ7dHhwOnNtZF9zbGltYm94X2luYyBzY3JpcHRzPSIvc2NyaXB0cy9tb290b29scy5qcywgL3Nib3gvc2xpbWJveC5qcyIgY3NzZGlyPSIvc2Jjc3MiIC8mZ3Q7PC9jb2RlPjwvcD4NCg0KPHA+SWYgeW91IHdpc2ggdG8gbG9hZCBzb21lIG9yIGFsbCBvZiB0aGUgc2NyaXB0cyAib3V0c2lkZSIgdGhlIHNtZF9zbGltYm94X2luYyBmdW5jdGlvbiB5b3UgY2FuIHVzZSB0aGUgPGNvZGU+c2tpcDwvY29kZT4gb3B0aW9uIHRvIHRlbGwgaXQgaG93IG1hbnkgeW91IGhhdmUgbG9hZGVkLiBJZiwgZm9yIGV4YW1wbGUsIHlvdSBoYXZlIHN0bV9qYXZhc2NyaXB0IGluc3RhbGxlZCB5b3UgY291bGQgZG86PC9wPg0KDQo8cD48Y29kZT4mbHQ7dHhwOmpzIG49Im1vb3Rvb2xzIiAvJmd0OzwvY29kZT48YnIgLz4NCjxjb2RlPiZsdDt0eHA6c21kX3NsaW1ib3hfaW5jIHNraXA9IjEiIHNjcmlwdHM9IiwgL3Nib3gvc2xpbWJveC5qcywgL3NiY3NzL3NsaW1ib3guY3NzIiAvJmd0OzwvY29kZT48L3A+DQoNCjxwPk5vdGUgdGhlIGVtcHR5IG9wdGlvbiBhdCB0aGUgc3RhcnQuIFlvdSBkb24ndCBoYXZlIHRvIGRvIHRoYXQgKGJlY2F1c2UgPGNvZGU+c2tpcDwvY29kZT4gd2lsbCBqdW1wIG92ZXIgaXQgZm9yIHlvdSkgYnV0IGlmIHlvdSBsaWtlIHRvIG1ha2UgaXQgb2J2aW91cywgaXQgZG9lcyBubyBoYXJtLiBVc2luZyB0aGUgc29sZSBvcHRpb24gPGNvZGU+c2tpcD0iMyI8L2NvZGU+IG1lYW5zICJJJ3ZlIGxvYWRlZCB0aGVtIGFsbCBteXNlbGYsIEkga25vdyB3aGF0IEknbSBkb2luZyIgOi0pPC9wPg0KDQo8cD5PbmUgbW9yZSB0aGluZyB3aXRoIHRoaXMgZmVhdHVyZTogVFhQIGRvZXMgbm90IGFsbG93IHlvdSB0byBkaXJlY3RseSBlbWJlZCBvdGhlciB0YWdzIGFzIGF0dHJpYnV0ZXMgKHNvIHVuZm9ydHVuYXRlbHkgPGNvZGU+c2NyaXB0cz0iJmx0O3R4cDpjc3MgLyZndDsiPC9jb2RlPiBmYWlscykuIElmIHlvdSBhYnNvbHV0ZWx5IG11c3QgZG8gaXQsIHlvdSBjYW4gY2hlYXQgKHNlZSBXZXQncyBleGNlbGxlbnQgcG9zdCBvbiA8YSBocmVmPSJodHRwOi8vYXdhc3Rlb2Z3b3Jkcy5jb20vYXJ0aWNsZS90ZXh0cGF0dGVybi10YWdzLWluLXRhZ3MtdGhlLWdvcmRpYW4ta25vdCI+dGFncyBpbiB0YWdzPC9hPiBmb3IgbW9yZSBkZXRhaWxzKSBieSBkcm9wcGluZyBpbnRvIFBIUCBhbmQgZG9pbmcgc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZzo8L3A+DQoNCjxwPjxjb2RlPiZsdDt0eHA6c21kX3NsaW1ib3hfaW5jIGNzc2Rpcj0iL2NzcyIgc2NyaXB0cz0iL3NjcmlwdHMvbW9vdG9vbHMuanMsICZsdDt0eHA6cGhwJmd0O2VjaG8ganMoYXJyYXkoICduJyA9PiAnc2xpbWJveCcpKTsmbHQ7L3R4cDpwaHAmZ3Q7IC8mZ3Q7PC9jb2RlPjwvcD4NCg0KPHA+VW5mb3J0dW5hdGVseSwgdGhlIHBsdWdpbiBkb2VzIG5vdCBjaGVjayB0aGF0IHlvdSBoYXZlIGdpdmVuIGl0IHRoZSBjb3JyZWN0IGZpbGUgbG9jYXRpb25zIHRvIHZhbGlkLCByZWFkYWJsZSBmaWxlcyBzbyBpZiB5b3UgaGF2ZSBwcm9ibGVtcyBtYWtpbmcgaXQgd29yaywgY2hlY2sgdGhlIHNvdXJjZSBjb2RlIG9mIHRoZSBwYWdlIHRvIHNlZSBpZiB5b3UncmUgbG9hZGluZyB3aGF0IHlvdSB0aGluayB5b3UncmUgbG9hZGluZyBmcm9tIHRoZSBjb3JyZWN0IHBsYWNlcyE8L3A+DQoNCjxoMj5Vc2FnZTogc21kX3NsaW1ib3g8L2gyPg0KDQo8cD5PbmNlIHRoZSBzY3JpcHRzIGFyZSBsb2FkZWQsIHlvdSBhcmUgZnJlZSB0byB1c2UgPGNvZGU+Jmx0O3R4cDpzbWRfc2xpbWJveCAvJmd0OzwvY29kZT4gdG8gZGlzcGxheSBhbiBpbWFnZSBnYWxsZXJ5LiBXaXRob3V0IGFueSBvcHRpb25zIGl0IGRpc3BsYXlzIGV2ZXJ5IGltYWdlIGluIHlvdXIgZW50aXJlIGNvbGxlY3Rpb24gYW5kIHdvbid0IGxvb2sgdmVyeSBwcmV0dHkgKHRob3VnaCB5b3UgY2FuIGhlbHAgYSBiaXQgYnkgc3RhcnRpbmcgd2l0aCB0aGUgPGEgaHJlZj0iI1N0eWxpbmciPmV4YW1wbGUgQ1NTPC9hPiBnaXZlbiBsYXRlcikuIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyB0YW1lIHRoZSBwbHVnaW4gYSBsaXR0bGU6PC9wPg0KDQo8cD4NCjx1bD4NCjxsaT48Yj5jYXRlZ29yeTwvYj48YnIgLz5jb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBpbWFnZSBjYXRlZ29yeSBuYW1lcyB0byBzaG93Lg0KPGJyIC8+VXNpbmcgIj9jIiBhcyBvbmUgb2YgdGhlIG9wdGlvbnMgdXNlcyB0ZXh0cGF0dGVybidzIGdsb2JhbCBjYXRlZ29yeS4NCjxiciAvPlRvIG1ha2UgYSBwZXItYXJ0aWNsZSBpbWFnZSBnYWxsZXJ5LCB1c2UgIj9pZCIgdG8gdGFrZSB0aGUgY3VycmVudCBhcnRpY2xlIElEOiBpdCBtYWtlcyB1cCBhIGNhdGVnb3J5IG5hbWUgdXNpbmcgdGhlIDxjb2RlPmNhdGxhYmVsPC9jb2RlPiBvcHRpb24gYW5kIHRoZSBJRCBmaWVsZC4gQnkgZGVmYXVsdCB0aGlzIHdpbGwgYmUgImFydGljbGUtSUQiLg0KPGJyIC8+WW91IGNhbiBhbHNvIHVzZSAiP2ZpZWxkbmFtZSIgd2hpY2ggd2lsbCBwaWNrIHVwIGNhdGVnb3JpZXMgZnJvbSB0aGUgZ2l2ZW4gZmllbGRuYW1lIG9mIHRoZSBjdXJyZW50bHkgZGlzcGxheWVkIGFydGljbGUuIERlc2lnbmVkIHByaW1hcmlseSBmb3IgdXNlIHdpdGggY3VzdG9tIGZpZWxkcyAoZS5nLiA/Y3VzdG9tMSksIGl0IGNvdWxkIGFsc28gYmUgYW55IG90aGVyIGZpZWxkIChvciBmaWVsZHMpIGZyb20geW91ciBhcnRpY2xlcyAoZS5nLiA/ZXhjZXJwdCBvciA/Y2F0ZWdvcnkxIG9yID9rZXl3b3JkcyBvciA/YXV0aG9yaWQsIGV0Yy4pIFRoZSBza3kncyB0aGUgbGltaXQgYmVjYXVzZSB0aG9zZSBmaWVsZHMgY291bGQgY29udGFpbiBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGNhdGVnb3JpZXMuLi4gYmUgd2FybmVkOiBpZiB5b3UgdXNlID9ib2R5IG9yIHNvbWV0aGluZyBlcXVhbGx5IG91dHJhZ2VvdXMsIGNoYW5jZXMgYXJlIHRoZSBwbHVnaW4gd2lsbCBleHBsb2RlLg0KPGJyIC8+VG8gbmVnYXRlIHRoZSBjYXRlZ29yeSBzZWxlY3Rpb24sIHVzZSAiIWNhdGVnb3J5X29yX2ZpZWxkX25hbWUiLiBJZiB5b3UgbGlzdCBzcGVjaWZpYyBpbWFnZSBjYXRlZ29yaWVzIChlLmcuICFsYW5kc2NhcGUsICFiaXJkcykgdGhvc2UgY2F0ZWdvcmllcyB3aWxsIGJlIGV4Y2x1ZGVkLiBJZiB5b3Ugc3BlY2lmeSBhIGZpZWxkIG5hbWUgc3VjaCBhcyAha2V5d29yZHMgb3IgIWN1c3RvbTEsIHRoZSBjb250ZW50cyBvZiB0aGF0IGZpZWxkIHdpbGwgYmUgcmVhZCBhbmQgdGhlIGxpc3Qgb2YgaW1hZ2UgY2F0ZWdvcmllcyBmb3VuZCB0aGVyZSB3aWxsIGJlIGV4Y2x1ZGVkLiBOb3RlIHRoYXQgaWYgeW91IHNwZWNpZnkgYSBmaWVsZCBuYW1lIGFuZCB0aGF0IGZpZWxkIGluIHRoZSBhcnRpY2xlIGlzIGVtcHR5LCB0aGUgbmFtZSB3aWxsIGJlIHRyZWF0ZWQgYXMgaWYgaXQgd2FzIGFuIGltYWdlIGNhdGVnb3J5LiBBbHNvIG5vdGUgdGhhdCwgcmVnYXJkbGVzcyBvZiB0aGUgb3JkZXIgeW91IGxpc3QgdGhlbSwgYWxsICdwb3NpdGl2ZXMnIHdpbGwgYmUgcHJvY2Vzc2VkIGZpcnN0LCB0aGVuIGFueSBleGNsdXNpb25zIGFwcGxpZWQuPC9saT4NCjxsaT48Yj5jYXRsYWJlbDwvYj48YnIgLz50aGUgbGFiZWwgdXNlZCBpbiBmcm9udCBvZiB0aGUgY2F0ZWdvcnkgaWYgdGhlICI/aWQiIG9wdGlvbiBpcyB1c2VkOyBkZWZhdWx0OiAiYXJ0aWNsZS0iPC9saT4NCjxsaT48Yj5pbWFnZWlkPC9iPjxiciAvPmNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGltYWdlIElEcyB0byBzaG93LiBUaGVzZSBhcmUgYWRkZWQgdG8gYW55IGltYWdlcyBmcm9tIHRoZSA8Y29kZT5jYXRlZ29yeTwvY29kZT4gb3B0aW9uIEJFRk9SRSBhbnkgZXhjbHVzaW9ucyBhcmUgYXBwbGllZC4NCjxiciAvPkFzIHdpdGggdGhlIDxjb2RlPmNhdGVnb3J5PC9jb2RlPiBvcHRpb24sIHlvdSBjYW4gYWxzbyB1c2UgIj9maWVsZG5hbWUiIHdoaWNoIHdpbGwgcGljayB1cCBpbWFnZSBJRHMgZnJvbSB0aGUgZ2l2ZW4gZmllbGRuYW1lIG9mIHRoZSBjdXJyZW50bHkgZGlzcGxheWVkIGFydGljbGUuIEludGVyZXN0aW5nIGlmIHlvdSBjaG9vc2UgP2FydGljbGVfaW1hZ2UgYmVjYXVzZSB5b3UgY2FuIG1ha2UgeW91ciBhcnRpY2xlIGltYWdlIHZpZXdhYmxlIGluIGEgbGlnaHRib3ghDQo8YnIgLz5UaGlzIG9wdGlvbiBhbHNvIHN1cHBvcnRzIG5lZ2F0aW9uIHVzaW5nIHRoZSBzYW1lIHRlcm1pbm9sb2d5IGFzIHRoZSA8Y29kZT5jYXRlZ29yeTwvY29kZT4gb3B0aW9uLg0KPC9saT4NCjxsaT48Yj5saW1pdDwvYj48YnIgLz4wIChvciBvbWl0dGVkKT11bmxpbWl0ZWQ7IG9yIHRoZSBudW1iZXIgb2YgaW1hZ2UgdGh1bWJuYWlscyB0byBzaG93IHBlciBwYWdlPC9saT4NCjxsaT48Yj5vcmRlcmJ5PC9iPjxiciAvPmNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHdheXMgdG8gb3JkZXIgdGhlIHJlc3VsdHMuIENob29zZSBmcm9tOiBjYXRlZ29yeSAodGhlIGRlZmF1bHQpLCBuYW1lLCBpZCwgZGF0ZSwgYWx0LCBjYXB0aW9uIG9yIHJhbmRvbS4gWW91IGNhbiBhbHNvIHNwZWNpZnkgdGhlIG9yZGVyIGJ5IGFkZGluZyA6YXNjIG9yIDpkZXNjIHRvIGFueSB2YWx1ZSAoZS5nIGNhdGVnb3J5LCBkYXRlOmRlc2Mgd291bGQgc29ydCBieSBjYXRlZ29yeSBmaXJzdCwgdGhlbiBkZXNjZW5kaW5nIGRhdGUpLiBBIHNwZWNpYWwsIG92ZXJyaWRpbmcsIG9wdGlvbiAnZml4ZWQnIGFsbG93cyB0aHVtYnMgdG8gYmUgb3V0cHV0IGluIHRoZSBvcmRlciBnaXZlbiBpbiB0aGUgaW1hZ2VpZCB0YWc8L2xpPg0KPGxpPjxiPmdyb3VwbmFtZTwvYj48YnIgLz50aGUgbmFtZSB0byBhcHBlbmQgdG8gdGhlIFtyZWxdIGFyZ3VtZW50IGluIG9yZGVyIHRvIGxvZ2ljYWxseSBncm91cCBpbWFnZXMuICI/YyIgdXNlcyB0aGUgaW1hZ2UgY2F0ZWdvcnksIG9yIHRyeSAiP2ZpZWxkbmFtZSIgdG8gcHVsbCB0aGUgZ3JvdXBuYW1lIGZyb20gdGhlIGdpdmVuIGZpZWxkIGluIHRoZSBjdXJyZW50IGFydGljbGUuIFNlZSB0aGUgPGEgaHJlZj0iI0V4YW1wbGVzIj5leGFtcGxlczwvYT4gYW5kIHRoZSBTbGltYm94IGRvY3VtZW50YXRpb24gZm9yIG1vcmUgb24gdGhpcyBmZWF0dXJlLiBEZWZhdWx0OiAic21kIjwvbGk+DQo8bGk+PGI+c2hvd2NhcHRpb248L2I+PGJyIC8+MT15ZXM7IDA9bm87IHRvIGRpc3BsYXkgdGhlIGltYWdlJ3MgY2FwdGlvbiB3aXRoIHRoZSBpbWFnZS4gT2ZmIGJ5IGRlZmF1bHQ8L2xpPg0KPGxpPjxiPnNob3dhbHQ8L2I+PGJyIC8+MT15ZXM7IDA9bm87IHRvIGRpc3BsYXkgdGhlIGltYWdlJ3MgYWx0IHRhZyB3aXRoIHRoZSBpbWFnZS4gT2ZmIGJ5IGRlZmF1bHQ8L2xpPg0KPGxpPjxiPnRleHRwb3M8L2I+PGJyIC8+cG9zaXRpb24gb2YgdGhlIGFsdC9jYXB0aW9uIGluZm9ybWF0aW9uLiBDaG9vc2UgZnJvbSBvbmUgb2Y6DQo8dWw+DQo8bGk+YWJvdmU6IGFib3ZlIHRoZSB0aHVtYm5haWwsIG5vdCBjbGlja2FibGU8L2xpPg0KPGxpPmJlbG93OiBiZWxvdyB0aGUgdGh1bWJuYWlsLCBub3QgY2xpY2thYmxlIChkZWZhdWx0KTwvbGk+DQo8bGk+YmVmb3JlOiBpbW1lZGlhdGVseSBhYm92ZSB0aGUgdGh1bWJuYWlsLCBjbGlja2FibGUgYXMgcGFydCBvZiB0aGUgbGluazwvbGk+DQo8bGk+YWZ0ZXI6IGltbWVkaWF0ZWx5IGJlbG93IHRoZSB0aHVtYm5haWwsIGNsaWNrYWJsZSBhcyBwYXJ0IG9mIHRoZSBsaW5rPC9saT4NCjwvdWw+DQo8L2xpPg0KPGxpPjxiPnNob3dwYWdlbGlua3M8L2I+PGJyIC8+MT15ZXM7IDA9bm87IHRvIGRpc3BsYXkgY2xpY2thYmxlIG5leHQvcHJldmlvdXMgbGlua3MuIE9uIGJ5IGRlZmF1bHQgKGlmIGxpbWl0IGlzIGdyZWF0ZXIgdGhhbiAwKTwvbGk+DQo8bGk+PGI+cHJldmxhYmVsPC9iPjxiciAvPkxhYmVsIGZvciB0aGUgJ3ByZXZpb3VzIHBhZ2UnIG9mIHBpY3R1cmVzIHdoZW4gdXNpbmcgc2hvd3BhZ2VsaW5rcy4gRGVmYXVsdDogIlByZXYiPC9saT4NCjxsaT48Yj5uZXh0bGFiZWw8L2I+PGJyIC8+TGFiZWwgZm9yIHRoZSAnbmV4dCBwYWdlJyBvZiBwaWN0dXJlcyB3aGVuIHVzaW5nIHNob3dwYWdlbGlua3MuIERlZmF1bHQ6ICJOZXh0IjwvbGk+DQo8bGk+PGI+d3JhcHRhZzwvYj48YnIgLz5UYWcgdG8gd3JhcCBlYWNoICdjZWxsJyB3aXRoLiBEbyBub3Qgc3BlY2lmeSB0aGUgJmx0OyBvciAmZ3Q7IGNoYXJhY3RlcnMuIEZvciBhIHZhbGlkIHBhZ2UsIHRoZSBvbmx5IHVzZWZ1bCBvcHRpb25zIGFyZSAiZGl2IiwgImxpIiBvciAicCIuIERlZmF1bHQ6IGVtcHR5IChpLmUuIG5vIHRhZyk8L2xpPg0KPGxpPjxiPmNlbGxjbGFzczwvYj48YnIgLz5DU1MgY2xhc3MgZm9yIGVhY2ggJ2NlbGwnIHRoYXQgZGlzcGxheXMgYSB0aHVtYm5haWwuIERlZmF1bHQ6IGVtcHR5IChpLmUuIG5vIGNsYXNzKTwvbGk+DQo8bGk+PGI+Y2FwdGlvbmNsYXNzPC9iPjxiciAvPkNTUyBjbGFzcyBmb3IgdGhlIGNhcHRpb24gdGV4dC4gRGVmYXVsdDogZW1wdHkgKGkuZS4gbm8gY2xhc3MpPC9saT4NCjxsaT48Yj5hbHRjbGFzczwvYj48YnIgLz5DU1MgY2xhc3MgZm9yIHRoZSBhbHQgdGV4dC4gRGVmYXVsdDogZW1wdHkgKGkuZS4gbm8gY2xhc3MpPC9saT4NCjxsaT48Yj5uYXZjbGFzczwvYj48YnIgLz5DU1MgY2xhc3MgZm9yIHRoZSBuZXh0L3ByZXYgY29udGFpbmVyLiBEZWZhdWx0OiBlbXB0eSAoaS5lLiBubyBjbGFzcyk8L2xpPg0KPGxpPjxiPnByZXZjbGFzczwvYj48YnIgLz5DU1MgY2xhc3MgZm9yIHRoZSAncHJldicgbGluay4gRGVmYXVsdDogc21kX3NsaW1ib3hfcHJldjwvbGk+DQo8bGk+PGI+bmV4dGNsYXNzPC9iPjxiciAvPkNTUyBjbGFzcyBmb3IgdGhlICduZXh0JyBsaW5rLiBEZWZhdWx0OiBzbWRfc2xpbWJveF9uZXh0PC9saT4NCjwvdWw+DQo8L3A+DQoNCjxoMj48YSBuYW1lPSJFeGFtcGxlcyI+PC9hPkV4YW1wbGVzPC9oMj4NCg0KPGNvZGU+Jmx0O3R4cDpzbWRfc2xpbWJveCBjYXRlZ29yeT0ibGFuZHNjYXBlIiBsaW1pdD0iMTAiIC8mZ3Q7PC9jb2RlPg0KPHA+U2hvdyBhbGwgaW1hZ2VzIGluIHRoZSBsYW5kc2NhcGUgY2F0ZWdvcnksIHRlbiBhdCBhIHRpbWUuPC9wPg0KDQo8Y29kZT4mbHQ7dHhwOnNtZF9zbGltYm94IGNhdGVnb3J5PSJkb2dzLCBiaXJkcyIgbGltaXQ9IjkiIHNob3djYXB0aW9ucz0iMSIgdGV4dHBvcz0iYWZ0ZXIiIHdyYXB0YWc9ImxpIiBjZWxsY2xhc3M9ImNlbGwiIC8mZ3Q7PC9jb2RlPg0KPHA+U2hvdyBhbGwgaW1hZ2VzIGluIHRoZSBkb2dzIGFuZCBiaXJkcyBjYXRlZ29yaWVzLCA5IHBlciBwYWdlLiBBZGQgdGhlIGNhcHRpb25zIHVuZGVyIHRoZSB0aHVtYm5haWxzIGFuZCBtYWtlIHRoZW0gY2xpY2thYmxlIHRvby4gV3JhcCBlYWNoIGltYWdlIGluIGEgPGNvZGU+bGk8L2NvZGU+IHRhZyBhbmQgZ2l2ZSBlYWNoIGEgY2xhc3Mgb2YgJ2NlbGwnIChpbXBsaWVzIHlvdSBtdXN0IG1hbnVhbGx5IGFkZCBhIGNvcnJlc3BvbmRpbmcgPGNvZGU+Jmx0O3VsJmd0OzwvY29kZT4gdGFnIGFyb3VuZCB0aGUgcGx1Z2luIGluIG9yZGVyIHRvIG1haW50YWluIHBhZ2UgdmFsaWRpdHkpLjwvcD4NCg0KPGNvZGU+Jmx0O3R4cDpzbWRfc2xpbWJveCBpbWFnZWlkPSI0OCwyNSw0IiBjYXRlZ29yeT0iZG9ncywgP2N1c3RvbTEiIGxpbWl0PSIyMCIgcHJldmxhYmVsPSJCYWNrIiBvcmRlcmJ5PSJuYW1lOmRlc2MsIGNhdGVnb3J5IiAvJmd0OzwvY29kZT4NCjxwPlNob3cgaW1hZ2VzIHdpdGggSURzIDQ4LCAyNSBhbmQgNCBhcyB3ZWxsIGFzIGFsbCBpbWFnZXMgaW4gdGhlIGRvZ3MgY2F0ZWdvcnkgYW5kIGFsc28gcHVsbCB0aGUgaW1hZ2UgY2F0ZWdvcnkgbmFtZXMgZnJvbSB0aGUgY3VycmVudCBhcnRpY2xlJ3MgY3VzdG9tMSBmaWVsZCAoaWYgY3VzdG9tMSBoZWxkICJiaXJkcywgbGFuZHNjYXBlcyIgKHdpdGhvdXQgdGhlIHF1b3RlcykgeW91J2QgZ2V0IHBpY3R1cmVzIGZyb20gYWxsIHRocmVlIGNhdGVnb3JpZXMpLiBMaW1pdCB0aGUgbnVtYmVyIHBlciBwYWdlIHRvIDIwLCBjaGFuZ2UgdGhlIHByZXZpb3VzIHBhZ2UgbGFiZWwgdG8gIkJhY2siIGFuZCBzb3J0IHRoZSBpbWFnZXMgaW4gZGVzY2VuZGluZyBvcmRlciBvZiBuYW1lLCB0aGVuIGNhdGVnb3J5LjwvcD4NCg0KPGNvZGU+Jmx0O3R4cDpzbWRfc2xpbWJveCBjYXRlZ29yeT0iZml4ZWQsID9pZCIgaW1hZ2VpZD0iIWFydGljbGVfaW1hZ2UiIGxpbWl0PSI2IiBncm91cG5hbWU9Ij9jIiBzaG93cGFnZWxpbmtzPSIwIiAvJmd0OzwvY29kZT4NCjxwPklmIHRoZSBwZXJzb24gaXMgY3VycmVudGx5IHZpZXdpbmcgYXJ0aWNsZSBJRCA2Nywgc2hvdyBhbGwgaW1hZ2VzIGZyb20gdGhlICdmaXhlZCcgY2F0ZWdvcnkgYW5kIHRoZSAnYXJ0aWNsZS02NycgY2F0ZWdvcnkuIElmIGFueSBpbWFnZSBpbiBlaXRoZXIgb2YgdGhvc2UgY2F0ZWdvcmllcyBpcyBmb3VuZCB0byBoYXZlIGFuIElEIG9mIHRoZSBhcnRpY2xlIGltYWdlIGZyb20gdGhlIGN1cnJlbnQgYXJ0aWNsZSwgdGhhdCBwaWN0dXJlIHdpbGwgYmUgaWdub3JlZC4gT25seSBzaG93IDYgcGljdHVyZXMgYW5kIGRvbid0IHNob3cgdGhlIG5leHQvcHJldiBsaW5rcyBvbiB0aGUgcGFnZS4gQWxzbywgZ3JvdXAgdGhlIFNsaW1ib3ggcGljdHVyZXMgYnkgaW1hZ2UgY2F0ZWdvcnkuIFRoaXMgbWVhbnMgdGhhdCBpZiBzb21lb25lIGNsaWNrcyBvbiBhIHBpY3R1cmUgZnJvbSB0aGUgImZpeGVkIiBjYXRlZ29yeSwgdGhlIFNsaW1ib3ggbmV4dC9wcmV2IGxpbmtzIG9ubHkgbmF2aWdhdGUgYmV0d2VlbiB0aG9zZSBwaWN0dXJlcy4gVGhlIHVzZXIgd2lsbCBoYXZlIHRvIGNsb3NlIHRoZSBsaWdodGJveCBhbmQgY2xpY2sgYSBwaWN0dXJlIGluIHRoZSBhcnRpY2xlLTY3IGNhdGVnb3J5IHRvIHNob3cgcGljdHVyZXMgZnJvbSB0aGUgb3RoZXIgZ3JvdXAuPC9wPg0KPHA+T24gdGhlIHN1cmZhY2UgdGhlIGdyb3VwbmFtZSBvcHRpb24gbWF5IHNlZW0gYSBsaXR0bGUgc3VwZXJmbHVvdXMgYnV0IGl0IGNhbiBiZSB1c2VmdWwgdG8gYWxsb3cgcGVvcGxlIHRvIG9ubHkgZmxpY2sgdGhyb3VnaCBhIHN1YnNldCBvZiB0aGUgcGljdHVyZXMgb24gZWFjaCBwYWdlLCBiYXNlZCBvbiB0aGVpciBjYXRlZ29yeSAob3IgYSBmaXhlZCB2YWx1ZSByZWFkIGZyb20gYSBmaWVsZCBpbiB0aGUgY3VycmVudCBhcnRpY2xlLCBlLmcuIGdyb3VwbmFtZT0iP2N1c3RvbTIiKS4gSXQgY29tZXMgaW50byBpdHMgb3duIHdoZW4geW91IHVzZSBDU1MyIHRvIHN0eWxlIGdyb3VwcyBvZiBpbWFnZXMgYmFzZWQgb24gdGhlaXIgW3JlbF0gYXR0cmlidXRlIGJlY2F1c2UgeW91IGNhbiBzdWItZGl2aWRlIHlvdXIgcGljdHVyZXMgZnVydGhlciB0aGFuIHlvdSB3b3VsZCBub3JtYWxseSBiZSBhYmxlLjwvcD4NCg0KPGNvZGU+Jmx0O3R4cDpzbWRfc2xpbWJveCBjYXRlZ29yeT0iP2MsID9jdXN0b20xLCAhY3VzdG9tMiwgIWZpeGVkIiBsaW1pdD0iOCIgLyZndDs8L2NvZGU+DQo8cD5BIGJpdCBvZiBhIGNvbnRyaXZlZCBleGFtcGxlIHRoYXQgc2hvd3MgaG93IGNyYXp5IHlvdSBjYW4gZ2V0OiBUaGlzIHdpbGwgc2hvdyBhbGwgaW1hZ2VzIGZyb20gdGhlIGN1cnJlbnQgZ2xvYmFsIGNhdGVnb3J5LCBwbHVzIGFsbCBpbWFnZXMgZnJvbSBjYXRlZ29yaWVzIGxpc3RlZCBpbiB0aGUgY3VzdG9tMSBmaWVsZCBvZiB0aGUgY3VycmVudCBhcnRpY2xlIGJ1dCA8ZW0+ZXhjbHVkZTwvZW0+IGltYWdlcyBmcm9tIGNhdGVnb3JpZXMgbGlzdGVkIGluIGN1c3RvbTIgYW5kIGFsc28gZXhjbHVkZSB0aGUgJ2ZpeGVkJyBjYXRlZ29yeS4gU2hvdyA4IGltYWdlIHRodW1ibmFpbHMgYXQgYSB0aW1lLjwvcD4NCg0KPGgyPjxhIG5hbWU9IlN0eWxpbmciPjwvYT5TdHlsaW5nIHdpdGggQ1NTPC9oMj4NCg0KPHA+VGhlcmUgYXJlIChkZWxpYmVyYXRlbHkpIHZlcnkgZmV3IGxheW91dCBhdHRyaWJ1dGVzIGZvciB0aGUgcGx1Z2luIGJlY2F1c2UgcHJldHR5IG11Y2ggZXZlcnl0aGluZyBjYW4gYmUgYWNjZXNzZWQgZnJvbSBDU1MgdG8gbGF5IHlvdXIgaW1hZ2VzIG91dCBob3dldmVyIHlvdSBsaWtlIHRoZW0uIFdhbnQgdG8gY2hhbmdlIHRoZSBudW1iZXIgb2YgaW1hZ2VzIHBlciByb3c/IENoYW5nZSB0aGUgd2lkdGggb2YgdGhlIGNvbnRhaW5pbmcgJmx0O2RpdiZndDsgYW5kIHNldCB0aGUgd2lkdGggb2YgZWFjaCB0aHVtYm5haWwgc3BhY2UgdG8gYSBwYXJ0aWN1bGFyIHNpemUuPC9wPg0KDQo8cD5UaGUgZm9sbG93aW5nIGxvZ2ljYWwgc3RydWN0dXJlIGFwcGxpZXM6PC9wPg0KDQo8dWw+DQo8bGk+QW4gb3B0aW9uYWwgd3JhcHRhZyBhbmQgY2xhc3MgbmFtZSBhcm91bmQgZWFjaCAiY2VsbCIgKGkuZS4gdGh1bWJuYWlsKTwvbGk+DQo8bGk+QSBsaW5rIGVsZW1lbnQgY29udGFpbmluZyB0aGUgdGh1bWJuYWlsJ3MgPGNvZGU+Jmx0O2ltZyZndDs8L2NvZGU+IHRhZzwvbGk+DQo8bGk+VGhlIGNhcHRpb24vYWx0IGlzIGEgJmx0O3NwYW4mZ3Q7IHdpdGggYW4gb3B0aW9uYWwgY2xhc3MgYW5kIGNhbiBhcHBlYXIgYWJvdmUsIGJlbG93IG9yIHdpdGhpbiB0aGUgbGluayBlbGVtZW50PC9saT4NCjxsaT5UaGUgbmV4dC9wcmV2IGxpbmtzIGFyZSB3cmFwcGVkIGluIHRoZSBvcHRpb25hbCB3cmFwdGFnIGNvbnRhaW5lciBhbmQgY2FuIGJlIGdpdmVuIGFuIG9wdGlvbmFsIGNsYXNzIG5hbWU8L2xpPg0KPGxpPlRoZSBuZXh0IGxpbmsgaGFzIGEgKGRlZmF1bHQpIGNsYXNzIG9mICJzbWRfc2xpbWJveF9uZXh0IiBhbmQgcHJldiBoYXMgInNtZF9zbGltYm94X3ByZXYiLiBUaGVzZSBjYW4gYmUgY2hhbmdlZCBvciByZW1vdmVkIGlmIHlvdSB3aXNoLjwvbGk+DQo8L3VsPg0KDQo8cD5Vc2luZyBDU1Mgc2VsZWN0b3JzIHlvdSBjYW4gYWNjZXNzIGV2ZXJ5IHBhcnQgb2YgdGhlIHN0cnVjdHVyZS4gQW4gZXhhbXBsZSBDU1MgbGF5b3V0IGlzIGdpdmVuIGhlcmUgdG8gZ2V0IHlvdSBzdGFydGVkIChhc3N1bWVzIGEgd3JhcHRhZyBvZiAnbGknLCBhIGNvbnRhaW5pbmcgJ3VsJyBhcm91bmQgdGhlIHBsdWdpbiB0YWcgd2l0aCBhIGNsYXNzIG9mIDxjb2RlPnNtZF9zbGltYm94PC9jb2RlPiBhbmQgPGNvZGU+bmF2Y2xhc3M9InNtZF9zbGltYm94X25hdiI8L2NvZGU+KS4gUGFzdGUgaXQgaW50byB5b3VyIENTUyB0ZW1wbGF0ZSBhbmQgeW91J3JlIGdvb2QgdG8gZ28uPC9wPg0KDQo8cHJlPg0KLnNtZF9zbGltYm94IHsNCglmbG9hdDpsZWZ0Ow0KCXdpZHRoOjYwMHB4Ow0KCW1hcmdpbjoxZW0gMDsNCgljbGVhcjpib3RoOw0KCWxpc3Qtc3R5bGU6bm9uZTsNCn0NCi5zbWRfc2xpbWJveCBsaSB7DQoJd2lkdGg6MTUwcHg7DQoJaGVpZ2h0OjE1MHB4Ow0KCWZsb2F0OmxlZnQ7DQoJbWFyZ2luOjFlbSBhdXRvOw0KCXRleHQtYWxpZ246Y2VudGVyOw0KfQ0KLnNtZF9zbGltYm94IGltZyB7DQoJbWFyZ2luOjAgYXV0bzsNCn0NCi5zbWRfc2xpbWJveCBzcGFuIHsNCglmbG9hdDpsZWZ0Ow0KCXdpZHRoOjE0MHB4Ow0KCXBhZGRpbmc6MnB4IDAgMCA1cHg7DQp9DQpsaS5zbWRfc2xpbWJveF9uYXYgew0KCWNsZWFyOmJvdGg7DQoJd2lkdGg6NTAwcHg7DQoJcGFkZGluZzoyMHB4Ow0KfQ0KLnNtZF9zbGltYm94X3ByZXYgew0KCWZsb2F0OmxlZnQ7DQp9DQouc21kX3NsaW1ib3hfbmV4dCB7DQoJZmxvYXQ6cmlnaHQ7DQp9DQo8L3ByZT4iO3M6NDoiY29kZSI7czoxNjEwNToiLy8gdjAuMSAgIEluaXRpYWwgcHVibGljIHJlbGVhc2UNCi8vIHYwLjExIEFkZGVkICFjYXRlZ29yeSBzdXBwb3J0DQovLyB2MC4xMiBBZGRlZCB0ZXh0cG9zIG9wdGlvbiAodGhhbmtzIGxlZSkgYW5kIGltYWdlaWQgb3B0aW9uICh0aGFua3Mgd291YXJlbikNCi8vIHYwLjIgICBqcyBhbmQgY3NzIGNhbiBub3cgYmUgbG9hZGVkIGVsc2V3aGVyZSAodGhhbmtzIGpzdHViYnMpLiBBZGRlZCB3cmFwdGFnIGFuZCBjaGFuZ2VkIGRlZmF1bHRzIHRvIG1ha2Ugb3V0cHV0IGxlc3MgbGlrZSB0YWctc291cCAodGhhbmtzIHdvdWFyZW4pDQovLyB2MC4yMSBBZGRlZCBvcmRlcmJ5PSJmaXhlZCIgdG8gYWxsb3dlZCBmaXhlZCBpbWFnZWlkIG9yZGVyaW5nICh0aGFua3MgbGVlKS4gJHdoZXJlIHdhcm5pbmcgc3F1YXNoZWQgKHRoYW5rcyBiZW5qaWJvdCkNCg0KLy8gVXNlIHRoaXMgdG8gaW5jbHVkZSB0aGUgbGlicmFyaWVzIGluIHRoZSA8aGVhZD4gc2VjdGlvbiBvZiB0aGUgcGFnZQ0KZnVuY3Rpb24gc21kX3NsaW1ib3hfaW5jKCRhdHRzKSB7DQoJZ2xvYmFsICRzbGltYm94X2xpYnM7DQoNCglpZiAoaXNfYXJyYXkoJGF0dHMpKSBleHRyYWN0KCRhdHRzKTsNCg0KCS8vIEZ1bmN0aW9uIG9wdGlvbnMNCgkkanNkaXIgPSBpc3NldCgkanNkaXIpID8gZG9TbGFzaCgkanNkaXIpIDogJyc7DQoJJGNzc2RpciA9IGlzc2V0KCRjc3NkaXIpID8gZG9TbGFzaCgkY3NzZGlyKSA6ICcnOw0KCSRzY3JpcHRzID0gaXNzZXQoJHNjcmlwdHMpID8gJHNjcmlwdHMgOiAnJzsNCgkkc2tpcCA9IGlzc2V0KCRza2lwKSA/ICRza2lwIDogIjAiOw0KDQoJJG1vZHNSZXF1aXJlZCA9IDM7DQoJJG1vZHNMb2FkZWQgPSAwOw0KCSRvdXRTdHIgPSAnJzsNCg0KCWlmICgkc2tpcCA+IDApIHsNCgkJJG1vZHNMb2FkZWQgPSAkc2tpcDsNCgl9DQoNCgkvLyBJbmNsdWRlIHRoZSBqcyBsaWJzIGlmIHJlcXVpcmVkDQoJaWYgKCRqc2RpciAhPSAnJykgew0KCQkkb3V0U3RyIC49ICc8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSInIC4kanNkaXIuICcvbW9vdG9vbHMuanMiPjwvc2NyaXB0PicubjsNCgkJJG91dFN0ciAuPSAnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iJyAuJGpzZGlyLiAnL3NsaW1ib3guanMiPjwvc2NyaXB0PicubjsNCgkJJG1vZHNMb2FkZWQgKz0gMjsNCgl9DQoNCgkvLyBGaW5kIHdoaWNoIHNjcmlwdHMgdG8gYXV0by1sb2FkDQoJaWYgKCgkc2NyaXB0cyAhPSAnJykgJiYgKCRtb2RzTG9hZGVkIDwgJG1vZHNSZXF1aXJlZCkpIHsNCgkJJG1vZHNMaXN0ID0gcHJlZ19zcGxpdCgnL1ssXSsvJywkc2NyaXB0cywkbW9kc1JlcXVpcmVkKTsNCgkJJGpzcHJlZml4ID0gIjxzY3JpcHQiOw0KCQkkY3NzcHJlZml4ID0gIjxsaW5rIjsNCgkJJHR4cHByZWZpeCA9ICI8dHhwIjsNCgkJZm9yZWFjaCAoJG1vZHNMaXN0IGFzICRmaWxlb2JqKSB7DQoJCQkkZmlsZW9iaiA9IHRyaW0oJGZpbGVvYmopOw0KCQkJaWYgKCRmaWxlb2JqID09ICcnKSB7DQoJCQkJJG1vZHNMb2FkZWQtLTsNCgkJCX0gZWxzZSBpZiAoc3Vic3RyKCRmaWxlb2JqLCAwLCBzdHJsZW4oJGpzcHJlZml4KSkgPT09ICRqc3ByZWZpeCkgew0KCQkJCSRvdXRTdHIgLj0gJGZpbGVvYmoubjsNCgkJCX0gZWxzZSBpZiAoc3Vic3RyKCRmaWxlb2JqLCAwLCBzdHJsZW4oJGNzc3ByZWZpeCkpID09PSAkY3NzcHJlZml4KSB7DQoJCQkJJG91dFN0ciAuPSAkZmlsZW9iai5uOw0KCQkJfSBlbHNlIGlmIChzdWJzdHIoJGZpbGVvYmosIDAsIHN0cmxlbigkdHhwcHJlZml4KSkgPT09ICR0eHBwcmVmaXgpIHsNCgkJCQkkb3V0U3RyIC49IHBhcnNlKCRmaWxlb2JqKTsNCgkJCX0gZWxzZSB7DQoJCQkJaWYgKCRtb2RzTG9hZGVkIDwgMikgew0KCQkJCQkkb3V0U3RyIC49ICc8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSInIC4kZmlsZW9iai4gJyI+PC9zY3JpcHQ+Jy5uOw0KCQkJCX0gZWxzZSB7DQoJCQkJCSRvdXRTdHIgLj0gJzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iJyAuJGZpbGVvYmouICciIHR5cGU9InRleHQvY3NzIiBtZWRpYT0ic2NyZWVuIiAvPicubjsNCgkJCQl9DQoJCQl9DQoJCQkkbW9kc0xvYWRlZCsrOw0KCQl9DQoJfQ0KDQoJLy8gSW5jbHVkZSB0aGUgY3NzIGZpbGUgaWYgcmVxdWlyZWQNCglpZiAoJGNzc2RpciAhPSAnJykgew0KCQkkb3V0U3RyIC49ICc8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9IicgLiRjc3NkaXIuICcvc2xpbWJveC5jc3MiIHR5cGU9InRleHQvY3NzIiBtZWRpYT0ic2NyZWVuIiAvPicubjsNCgkJJG1vZHNMb2FkZWQrKzsNCgl9DQoNCgkvLyBTZXQgdGhlIGZsYWcgdG8gc2F5IHRoZSBsaWJzIGFyZSBvay4gU2hhbWUgdGhlcmUncyBubyBlYXN5IHByb3Zpc2lvbiBmb3INCgkvLyBjaGVja2luZyB0aGUgZmlsZXMgYWN0dWFsbHkgZXhpc3QgYXQgdGhlIGdpdmVuIGxvY2F0aW9ucywgYnV0IGhleQ0KCWlmICgkbW9kc0xvYWRlZCA9PSAkbW9kc1JlcXVpcmVkKSB7DQoJCSRzbGltYm94X2xpYnMgPSB0cnVlOw0KCX0gZWxzZSB7DQoJCSRzbGltYm94X2xpYnMgPSBmYWxzZTsNCgkJJG91dFN0ciA9ICdTbGltYm94OiBpZiB1c2luZyB0aGUgc2NyaXB0cyBvcHRpb24sIHNwZWNpZnkgdXAgdG8gdGhyZWUgcmVxdWlyZWQgc2NyaXB0cyBpbiB0aGlzIG9yZGVyOiAmbHQ7dHhwOnNtZF9zbGltYm94X2luYyBzY3JpcHRzPSJtb290b29sc0pTTG9jYXRpb24sIHNsaW1ib3hKU0xvY2F0aW9uLCBzbGltYm94Q1NTTG9jYXRpb24iIC8mZ3Q7LiBJZiBhbnkgcG9zaXRpb25zIGFyZSBsZWZ0IGVtcHR5LCB0aGUgbWlzc2luZyBzY3JpcHRzIG11c3QgYmUgc3VwcGxpZWQgdmlhIHRoZSBqc2RpciwgY3NzZGlyIG9yIGxvYWRlZCBleHRlcm5hbGx5IGFuZCB0b2xkIHRvIHNraXAgdGhpcyBzdGVwLiBUaGUgdGhyZWUgdmFsdWVzIGNhbiBlaXRoZXIgYmUgYSBmdWxsIFhIVE1MIHN0cmluZyAoZS5nLiBhcyByZXR1cm5lZCBieSB0eHA6c3RtX2phdmFzY3JpcHQgb3IgdHhwOmNzcywgYWx0aG91Z2ggdGhleSBtYXkgbm90IHdvcmsgZGlyZWN0bHkgd2l0aGluIHRoZSB0YWc7IHNlZSB0aGUgZG9jcykgb3Igc2ltcGx5IHBhdGhzIHRvIHRoZSBmaWxlcy4gTm90ZSB0aGF0IG5vIHZhbGlkYXRpb24gaXMgcGVyZm9ybWVkIHRvIGNoZWNrIGlmIHRoZSBmaWxlcyBleGlzdC4nLm47DQoJfQ0KDQoJcmV0dXJuICRvdXRTdHI7DQp9DQoNCmZ1bmN0aW9uIHNtZF9zbGltYm94KCRhdHRzKSB7DQoJZ2xvYmFsICRwcmV0ZXh0LCAkdGhpc2FydGljbGUsICRpbWdfZGlyOw0KCWdsb2JhbCAkc2xpbWJveF9saWJzOw0KCSRtYXhsaW1pdCA9IDk5OTk5Ow0KDQoJaWYgKGlzX2FycmF5KCRhdHRzKSkgZXh0cmFjdCgkYXR0cyk7DQoNCgkvLyBQbHVnaW4gb3B0aW9ucw0KCSRpbWFnZWlkID0gaXNzZXQoJGltYWdlaWQpID8gZG9TbGFzaCgkaW1hZ2VpZCkgOiAnJzsNCgkkY2F0ZWdvcnkgPSBpc3NldCgkY2F0ZWdvcnkpID8gZG9TbGFzaCgkY2F0ZWdvcnkpIDogKCgkaW1hZ2VpZD09IiIpID8gJHByZXRleHRbJ2MnXTogJycpOw0KCSRjYXRsYWJlbCA9IGlzc2V0KCRjYXRsYWJlbCkgPyAkY2F0bGFiZWw6ICJhcnRpY2xlLSI7DQoJJGdyb3VwbmFtZSA9IGlzc2V0KCRncm91cG5hbWUpID8gJGdyb3VwbmFtZTogInNtZCI7DQoJJGxpbWl0ID0gaXNzZXQoJGxpbWl0KSA/ICRsaW1pdDogIjAiOw0KCSRvcmRlcmJ5ID0gaXNzZXQoJG9yZGVyYnkpID8gJG9yZGVyYnk6ICJjYXRlZ29yeSI7DQoJJHNob3dwYWdlbGlua3MgPSBpc3NldCgkc2hvd3BhZ2VsaW5rcykgPyAkc2hvd3BhZ2VsaW5rczogIjEiOw0KCSRwcmV2bGFiZWw9IGlzc2V0KCRwcmV2bGFiZWwpID8gJHByZXZsYWJlbDogIlByZXYiOw0KCSRuZXh0bGFiZWw9IGlzc2V0KCRuZXh0bGFiZWwpID8gJG5leHRsYWJlbDogIk5leHQiOw0KCSRzaG93Y2FwdGlvbiA9IGlzc2V0KCRzaG93Y2FwdGlvbikgPyAkc2hvd2NhcHRpb246ICIwIjsNCgkkc2hvd2FsdCA9IGlzc2V0KCRzaG93YWx0KSA/ICRzaG93YWx0OiAiMCI7DQoJJHRleHRwb3MgPSBpc3NldCgkdGV4dHBvcykgPyAkdGV4dHBvczogImJlbG93IjsNCgkkd3JhcHRhZyA9IGlzc2V0KCR3cmFwdGFnKSA/ICR3cmFwdGFnOiAiIjsNCgkkY2VsbGNsYXNzID0gaXNzZXQoJGNlbGxjbGFzcykgPyAkY2VsbGNsYXNzOiAiIjsNCgkkbmF2Y2xhc3MgPSBpc3NldCgkbmF2Y2xhc3MpID8gJG5hdmNsYXNzOiAiIjsNCgkkcHJldmNsYXNzID0gaXNzZXQoJHByZXZjbGFzcykgPyAkcHJldmNsYXNzOiAic21kX3NsaW1ib3hfcHJldiI7DQoJJG5leHRjbGFzcyA9IGlzc2V0KCRuZXh0Y2xhc3MpID8gJG5leHRjbGFzczogInNtZF9zbGltYm94X25leHQiOw0KCSRjYXB0aW9uY2xhc3MgPSBpc3NldCgkY2FwdGlvbmNsYXNzKSA/ICRjYXB0aW9uY2xhc3M6ICIiOw0KCSRhbHRjbGFzcyA9IGlzc2V0KCRhbHRjbGFzcykgPyAkYWx0Y2xhc3M6ICIiOw0KDQoJJGZpeGVkT3JkZXIgPSBmYWxzZTsNCg0KCS8vIE1haW4gY29kZSBib2R5DQoJaWYgKCRzbGltYm94X2xpYnMgPT0gZmFsc2UpIHsNCgkJJG91dFN0ciA9ICdTbGltYm94OiBSZXF1aXJlZCBsaWJyYXJpZXMgbm90IGxvYWRlZC4gQ2FsbCAmbHQ7dHhwOnNtZF9zbGltYm94X2luYyAvJmd0OyBpbiB0aGUgJmx0O2hlYWQmZ3Q7IG9mIHRoaXMgcGFnZS4nOw0KCX0gZWxzZSB7DQoJCS8vIFRoZSBkYXRhYmFzZSBmaWVsZHMgcmVxdWlyZWQNCgkJJGZpZWxkcyA9ICdpZCxuYW1lLGNhcHRpb24sYWx0LGNhdGVnb3J5LGV4dCc7DQoJCSRzdWJDYXRMaXN0ID0gYXJyYXkoKTsNCgkJJGZ1bGxDYXRMaXN0ID0gYXJyYXkoKTsNCgkJJG5vdENhdExpc3QgPSBhcnJheSgpOw0KDQoJCS8vIENvbnZlcnQgdGhlIGNhdGVnb3J5IChwb3NzaWJseSBhIGNvbW1hLXNlcCBsaXN0KSBpbnRvIGFuIFNRTC1zdHlsZSAnaW4nIGxpc3QuDQoJCS8vIFByb2Nlc3MgdGhlIHNwZWNpYWwgKCc/c29tZXRoaW5nJykgY2FzZXMgdG9vLg0KCQkkY2F0TGlzdCA9IHByZWdfc3BsaXQoJy9bLFxzXSsvJywkY2F0ZWdvcnksLTEsUFJFR19TUExJVF9OT19FTVBUWSk7DQoNCgkJZm9yICgkaWR4ID0gMDsgJGlkeCA8IGNvdW50KCRjYXRMaXN0KTsgJGlkeCsrKSB7DQoJCQkkY2F0bmFtZSA9ICRjYXRMaXN0WyRpZHhdOw0KCQkJaWYgKCRjYXRuYW1lID09PSAiP2MiKSB7DQoJCQkJLy8gVXNlIHRoZSBnbG9iYWwgYXJ0aWNsZSBjYXRlZ29yeSwgaWYgaXQgZXhpc3RzDQoJCQkJaWYgKCRwcmV0ZXh0WydjJ10gIT0gIiIpIHsNCgkJCQkJaWYgKCFpbl9hcnJheSgkcHJldGV4dFsnYyddLCAkZnVsbENhdExpc3QpKSB7DQoJCQkJCQkkZnVsbENhdExpc3RbXSA9ICRwcmV0ZXh0WydjJ107DQoJCQkJCX0NCgkJCQl9DQoJCQl9IGVsc2UgaWYgKCRjYXRuYW1lID09PSAiP2lkIikgew0KCQkJCS8vIFVzZSB0aGUgZ2xvYmFsIGFydGljbGUgSUQNCgkJCQlpZiAoIWluX2FycmF5KCRjYXRsYWJlbCAuICRwcmV0ZXh0WydpZCddLCAkZnVsbENhdExpc3QpKSB7DQoJCQkJCSRmdWxsQ2F0TGlzdFtdID0gJGNhdGxhYmVsIC4gJHByZXRleHRbJ2lkJ107DQoJCQkJfQ0KCQkJfSBlbHNlIGlmICgkY2F0bmFtZVswXSA9PT0gIj8iKSB7DQoJCQkJLy8gVXNlIHRoZSBnaXZlbiBmaWVsZCBuYW1lOyB3aGljaCBtYXkgYmUgYSBjb21tYS1zZXBhcmF0ZWQgc3VibGlzdC4NCgkJCQkvLyBTcGxpdCBvZmYgdGhlIGZpZWxkIG5hbWUgZnJvbSB0aGUgcXVlc3Rpb24gbWFyaw0KCQkJCSRmaWVsZG5hbWUgPSBzdWJzdHIoJGNhdG5hbWUsMSk7DQoJCQkJaWYgKGlzc2V0KCR0aGlzYXJ0aWNsZVskZmllbGRuYW1lXSkpIHsNCgkJCQkJJGZpZWxkQ29udGVudHMgPSAkdGhpc2FydGljbGVbJGZpZWxkbmFtZV07DQoJCQkJfSBlbHNlIHsNCgkJCQkJJGZpZWxkQ29udGVudHMgPSAnJzsNCgkJCQl9DQoNCgkJCQlpZiAoIWVtcHR5KCRmaWVsZENvbnRlbnRzKSkgew0KCQkJCQkkc3ViQ2F0TGlzdCA9IHByZWdfc3BsaXQoJy9bLFxzXSsvJywgJGZpZWxkQ29udGVudHMsIC0xLCBQUkVHX1NQTElUX05PX0VNUFRZKTsNCgkJCQkJZm9yZWFjaCAoJHN1YkNhdExpc3QgYXMgJHN1YmNhdG5hbWUpIHsNCgkJCQkJCWlmICghaW5fYXJyYXkoJHN1YmNhdG5hbWUsICRmdWxsQ2F0TGlzdCkpIHsNCgkJCQkJCQkkZnVsbENhdExpc3RbXSA9ICRzdWJjYXRuYW1lOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfQ0KCQkJfSBlbHNlIGlmICgkY2F0bmFtZVswXSA9PT0gIiEiKSB7DQoJCQkJLy8gTWF5IGVpdGhlciBiZSBhIGZpZWxkIG5hbWUgKGFuZCBtYXliZSBhbm90aGVyIENTTCkgb3IgYSBmaXhlZCB0ZXJtLg0KCQkJCS8vIFNwbGl0IG9mZiB0aGUgbmFtZSBmcm9tIHRoZSBleGNsYW1hdGlvbiBtYXJrDQoJCQkJJGZpZWxkbmFtZSA9IHN1YnN0cigkY2F0bmFtZSwxKTsNCgkJCQlpZiAoaXNzZXQoJHRoaXNhcnRpY2xlWyRmaWVsZG5hbWVdKSkgew0KCQkJCQkkZmllbGRDb250ZW50cyA9ICR0aGlzYXJ0aWNsZVskZmllbGRuYW1lXTsNCgkJCQl9IGVsc2Ugew0KCQkJCQkkZmllbGRDb250ZW50cyA9ICRmaWVsZG5hbWU7DQoJCQkJfQ0KDQoJCQkJaWYgKCFlbXB0eSgkZmllbGRDb250ZW50cykpIHsNCgkJCQkJJHN1YkNhdExpc3QgPSBwcmVnX3NwbGl0KCcvWyxcc10rLycsICRmaWVsZENvbnRlbnRzLCAtMSwgUFJFR19TUExJVF9OT19FTVBUWSk7DQoJCQkJCWZvcmVhY2ggKCRzdWJDYXRMaXN0IGFzICRzdWJjYXRuYW1lKSB7DQoJCQkJCQlpZiAoIWluX2FycmF5KCRzdWJjYXRuYW1lLCAkbm90Q2F0TGlzdCkpIHsNCgkJCQkJCQkkbm90Q2F0TGlzdFtdID0gJHN1YmNhdG5hbWU7DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQl9DQoJCQl9IGVsc2Ugew0KCQkJCWlmICghaW5fYXJyYXkoJGNhdG5hbWUsICRmdWxsQ2F0TGlzdCkpIHsNCgkJCQkJJGZ1bGxDYXRMaXN0W10gPSAkY2F0bmFtZTsNCgkJCQl9DQoJCQl9DQoJCX0NCg0KCQkkc3ViSURMaXN0ID0gYXJyYXkoKTsNCgkJJGZ1bGxJRExpc3QgPSBhcnJheSgpOw0KCQkkbm90SURMaXN0ID0gYXJyYXkoKTsNCg0KCQkvLyBDb252ZXJ0IHRoZSBpbWFnZWlkIChwb3NzaWJseSBhIGNvbW1hLXNlcCBsaXN0KSBpbnRvIGFuIFNRTC1zdHlsZSAnaW4nIGxpc3QuDQoJCS8vIFByb2Nlc3MgdGhlIHNwZWNpYWwgKCc/c29tZXRoaW5nJykgY2FzZXMgdG9vLg0KCQkkaWRMaXN0ID0gcHJlZ19zcGxpdCgnL1ssXHNdKy8nLCRpbWFnZWlkLC0xLFBSRUdfU1BMSVRfTk9fRU1QVFkpOw0KCQlmb3IgKCRpZHggPSAwOyAkaWR4IDwgY291bnQoJGlkTGlzdCk7ICRpZHgrKykgew0KCQkJJGlkbnVtID0gJGlkTGlzdFskaWR4XTsNCgkJCWlmICgkaWRudW0gPT09ICI/aWQiKSB7DQoJCQkJLy8gVXNlIHRoZSBnbG9iYWwgYXJ0aWNsZSBJRA0KCQkJCWlmICghaW5fYXJyYXkoJHByZXRleHRbJ2lkJ10sICRmdWxsSURMaXN0KSkgew0KCQkJCQkkZnVsbElETGlzdFtdID0gJHByZXRleHRbJ2lkJ107DQoJCQkJfQ0KCQkJfSBlbHNlIGlmICgkaWRudW1bMF0gPT09ICI/Iikgew0KCQkJCS8vIFVzZSB0aGUgZ2l2ZW4gZmllbGQgbmFtZTsgd2hpY2ggbWF5IGJlIGEgY29tbWEtc2VwYXJhdGVkIHN1Ymxpc3QuDQoJCQkJLy8gU3BsaXQgb2ZmIHRoZSBmaWVsZCBuYW1lIGZyb20gdGhlIHF1ZXN0aW9uIG1hcmsNCgkJCQkkZmllbGRuYW1lID0gc3Vic3RyKCRpZG51bSwxKTsNCgkJCQlpZiAoaXNzZXQoJHRoaXNhcnRpY2xlWyRmaWVsZG5hbWVdKSkgew0KCQkJCQkkZmllbGRDb250ZW50cyA9ICR0aGlzYXJ0aWNsZVskZmllbGRuYW1lXTsNCgkJCQl9IGVsc2Ugew0KCQkJCQkkZmllbGRDb250ZW50cyA9ICcnOw0KCQkJCX0NCg0KCQkJCWlmICghZW1wdHkoJGZpZWxkQ29udGVudHMpKSB7DQoJCQkJCSRzdWJJRExpc3QgPSBwcmVnX3NwbGl0KCcvWyxcc10rLycsICRmaWVsZENvbnRlbnRzLCAtMSwgUFJFR19TUExJVF9OT19FTVBUWSk7DQoJCQkJCWZvcmVhY2ggKCRzdWJJRExpc3QgYXMgJHN1YmlkbnVtKSB7DQoJCQkJCQlpZiAoIWluX2FycmF5KCRzdWJpZG51bSwgJGZ1bGxJRExpc3QpKSB7DQoJCQkJCQkJJGZ1bGxJRExpc3RbXSA9ICRzdWJpZG51bTsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0NCgkJCX0gZWxzZSBpZiAoJGlkbnVtWzBdID09PSAiISIpIHsNCgkJCQkvLyBNYXkgZWl0aGVyIGJlIGEgZmllbGQgbmFtZSAoYW5kIG1heWJlIGFub3RoZXIgQ1NMKSBvciBhIGZpeGVkIHRlcm0uDQoJCQkJLy8gU3BsaXQgb2ZmIHRoZSBuYW1lIGZyb20gdGhlIGV4Y2xhbWF0aW9uIG1hcmsNCgkJCQkkZmllbGRuYW1lID0gc3Vic3RyKCRpZG51bSwxKTsNCgkJCQlpZiAoaXNzZXQoJHRoaXNhcnRpY2xlWyRmaWVsZG5hbWVdKSkgew0KCQkJCQkkZmllbGRDb250ZW50cyA9ICR0aGlzYXJ0aWNsZVskZmllbGRuYW1lXTsNCgkJCQl9IGVsc2Ugew0KCQkJCQkkZmllbGRDb250ZW50cyA9ICRmaWVsZG5hbWU7DQoJCQkJfQ0KDQoJCQkJaWYgKCFlbXB0eSgkZmllbGRDb250ZW50cykpIHsNCgkJCQkJJHN1YklETGlzdCA9IHByZWdfc3BsaXQoJy9bLFxzXSsvJywgJGZpZWxkQ29udGVudHMsIC0xLCBQUkVHX1NQTElUX05PX0VNUFRZKTsNCgkJCQkJZm9yZWFjaCAoJHN1YklETGlzdCBhcyAkc3ViaWRudW0pIHsNCgkJCQkJCWlmICghaW5fYXJyYXkoJHN1YmlkbnVtLCAkbm90SURMaXN0KSkgew0KCQkJCQkJCSRub3RJRExpc3RbXSA9ICRzdWJpZG51bTsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0NCgkJCX0gZWxzZSB7DQoJCQkJaWYgKCFpbl9hcnJheSgkaWRudW0sICRmdWxsSURMaXN0KSkgew0KCQkJCQkkZnVsbElETGlzdFtdID0gJGlkbnVtOw0KCQkJCX0NCgkJCX0NCgkJfQ0KDQoJCS8vIE1ha2UgdXAgdGhlIFdIRVJFIHN0YXRlbWVudCBmcm9tIHRoZSBjb21iaW5lZCBsaXN0IG9mIGNhdGVnb3JpZXMuDQoJCS8vIFRoZSBjYXRlZ29yaWVzL2ltYWdlIElEcyBhcmUgT1JlZCB0b2dldGhlciBpbiBicmFja2V0cyBmaXJzdA0KCQkvLyBiZWZvcmUgdGhlIG5lZ2F0aW9uIG9wdGlvbnMgYXJlIHRhY2tlZCBvbiBhcyBBTkRzIGFmdGVyd2FyZHMNCgkJJHdoZXJlVG1wID0gJyc7DQoJCWlmIChjb3VudCgkZnVsbENhdExpc3QpID4gMCkgew0KCQkJJHdoZXJlVG1wID0gJ2NhdGVnb3J5IGluICgnOw0KCQkJZm9yICgkaWR4ID0gY291bnQoJGZ1bGxDYXRMaXN0KTsgJGlkeCA+PTA7ICRpZHgtLSkgew0KCQkJCWlmIChlbXB0eSgkZnVsbENhdExpc3RbJGlkeF0pKSB7DQoJCQkJCXVuc2V0KCRmdWxsQ2F0TGlzdFskaWR4XSk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJJGZ1bGxDYXRMaXN0WyRpZHhdID0gIiciIC4gJGZ1bGxDYXRMaXN0WyRpZHhdIC4gIiciOw0KCQkJCX0NCgkJCX0NCgkJCSR3aGVyZVRtcCAuPSBpbXBsb2RlKCIsIiwkZnVsbENhdExpc3QpOw0KCQkJJHdoZXJlVG1wIC49ICcpJzsNCgkJfQ0KDQoJCWlmICh0cmltKCR3aGVyZVRtcCkgIT0gIiIpIHsNCgkJCSR3aGVyZU9SW10gPSAkd2hlcmVUbXA7DQoJCX0NCg0KCQkvLyBBZGQgdG8gdGhlIFdIRVJFIHN0YXRlbWVudCB0aGUgY29tYmluZWQgbGlzdCBvZiBpbWFnZSBJRHMNCgkJJHdoZXJlVG1wID0gJyc7DQoJCWlmIChjb3VudCgkZnVsbElETGlzdCkgPiAwKSB7DQoJCQkkd2hlcmVUbXAgPSAnaWQgaW4gKCc7DQoJCQlmb3IgKCRpZHggPSBjb3VudCgkZnVsbElETGlzdCk7ICRpZHggPj0wOyAkaWR4LS0pIHsNCgkJCQlpZiAoZW1wdHkoJGZ1bGxJRExpc3RbJGlkeF0pKSB7DQoJCQkJCXVuc2V0KCRmdWxsSURMaXN0WyRpZHhdKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQkkZnVsbElETGlzdFskaWR4XSA9ICInIiAuICRmdWxsSURMaXN0WyRpZHhdIC4gIiciOw0KCQkJCX0NCgkJCX0NCgkJCSR3aGVyZVRtcCAuPSBpbXBsb2RlKCIsIiwkZnVsbElETGlzdCk7DQoJCQkkd2hlcmVUbXAgLj0gJyknOw0KCQl9DQoNCgkJaWYgKHRyaW0oJHdoZXJlVG1wKSAhPSAiIikgew0KCQkJJHdoZXJlT1JbXSA9ICR3aGVyZVRtcDsNCgkJfQ0KDQoJCSR3aGVyZSA9ICcoJyAuaW1wbG9kZSgiIE9SICIsJHdoZXJlT1IpLiAnKSc7DQoNCgkJaWYgKHRyaW0oJHdoZXJlKSA9PSAiKCkiKSB7DQoJCQkkd2hlcmUgPSAnMT0xJzsNCgkJfQ0KDQoJCS8vIEFkZCB0byB0aGUgV0hFUkUgc3RhdGVtZW50IHRoZSBjb21iaW5lZCBsaXN0IG9mIE5PVCBjYXRlZ29yaWVzDQoJCWlmIChjb3VudCgkbm90Q2F0TGlzdCkgPiAwKSB7DQoJCQkkd2hlcmUgLj0gJyBhbmQgY2F0ZWdvcnkgbm90IGluICgnOw0KCQkJZm9yICgkaWR4ID0gY291bnQoJG5vdENhdExpc3QpOyAkaWR4ID49MDsgJGlkeC0tKSB7DQoJCQkJaWYgKGVtcHR5KCRub3RDYXRMaXN0WyRpZHhdKSkgew0KCQkJCQl1bnNldCgkbm90Q2F0TGlzdFskaWR4XSk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJJG5vdENhdExpc3RbJGlkeF0gPSAiJyIgLiAkbm90Q2F0TGlzdFskaWR4XSAuICInIjsNCgkJCQl9DQoJCQl9DQoJCQkkd2hlcmUgLj0gaW1wbG9kZSgiLCIsJG5vdENhdExpc3QpOw0KCQkJJHdoZXJlIC49ICcpJzsNCgkJfQ0KDQoJCS8vIEFkZCB0byB0aGUgV0hFUkUgc3RhdGVtZW50IHRoZSBjb21iaW5lZCBsaXN0IG9mIE5PVCBpbWFnZSBJRHMNCgkJaWYgKGNvdW50KCRub3RJRExpc3QpID4gMCkgew0KCQkJJHdoZXJlIC49ICcgYW5kIGlkIG5vdCBpbiAoJzsNCgkJCWZvciAoJGlkeCA9IGNvdW50KCRub3RJRExpc3QpOyAkaWR4ID49MDsgJGlkeC0tKSB7DQoJCQkJaWYgKGVtcHR5KCRub3RJRExpc3RbJGlkeF0pKSB7DQoJCQkJCXVuc2V0KCRub3RJRExpc3RbJGlkeF0pOw0KCQkJCX0gZWxzZSB7DQoJCQkJCSRub3RJRExpc3RbJGlkeF0gPSAiJyIgLiAkbm90SURMaXN0WyRpZHhdIC4gIiciOw0KCQkJCX0NCgkJCX0NCgkJCSR3aGVyZSAuPSBpbXBsb2RlKCIsIiwkbm90SURMaXN0KTsNCgkJCSR3aGVyZSAuPSAnKSc7DQoJCX0NCg0KCQkvLyBDb252ZXJ0IHRoZSBvcmRlcmJ5IGludG8gYSB2YWxpZCBPUkRFUiBCWSBjbGF1c2UNCgkJJHdoZXJlT0IgPSBBcnJheSgpOw0KCQkkb2JMaXN0ID0gcHJlZ19zcGxpdCgnL1ssXHNdKy8nLCRvcmRlcmJ5LC0xLFBSRUdfU1BMSVRfTk9fRU1QVFkpOw0KCQlmb3IgKCRpZHggPSAwOyAkaWR4IDwgY291bnQoJG9iTGlzdCk7ICRpZHgrKykgew0KCQkJJG9iX2RpciA9IGV4cGxvZGUoJzonLCRvYkxpc3RbJGlkeF0pOw0KCQkJJGRpcmVjdGlvbiA9ICcnOw0KCQkJaWYgKGNvdW50KCRvYl9kaXIpID4gMSkgew0KCQkJCWlmKCRvYl9kaXJbMV0gPT0gImRlc2MiKSB7DQoJCQkJCSRkaXJlY3Rpb24gPSAnIGRlc2MnOw0KCQkJCX0gZWxzZSB7DQoJCQkJCSRkaXJlY3Rpb24gPSAnIGFzYyc7DQoJCQkJfQ0KCQkJfQ0KCQkJc3dpdGNoICgkb2JfZGlyWzBdKSB7DQoJCQkJY2FzZSAnbmFtZSc6DQoJCQkJCSR3aGVyZU9CW10gPSAnbmFtZScuJGRpcmVjdGlvbjsNCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSAnaWQnOg0KCQkJCQkkd2hlcmVPQltdID0gJ2lkJy4kZGlyZWN0aW9uOw0KCQkJCQlicmVhazsNCgkJCQljYXNlICdhbHQnOg0KCQkJCQkkd2hlcmVPQltdID0gJ2FsdCcuJGRpcmVjdGlvbjsNCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSAnY2FwdGlvbic6DQoJCQkJCSR3aGVyZU9CW10gPSAnY2FwdGlvbicuJGRpcmVjdGlvbjsNCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSAnZGF0ZSc6DQoJCQkJCSR3aGVyZU9CW10gPSAnZGF0ZScuJGRpcmVjdGlvbjsNCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSAncmFuZG9tJzoNCgkJCQkJJHdoZXJlT0JbXSA9ICdyYW5kKCknOw0KCQkJCQlicmVhazsNCgkJCQljYXNlICdmaXhlZCc6DQoJCQkJCS8vICdmaXhlZCcgb25seSB3b3JrcyBvbiBpbWFnZSBpZHMNCgkJCQkJaWYgKCRpbWFnZWlkICE9ICIiKSB7DQoJCQkJCQkkZml4ZWRPcmRlciA9IHRydWU7DQoJCQkJCX0NCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSAnY2F0ZWdvcnknOg0KCQkJCWRlZmF1bHQ6DQoJCQkJCSR3aGVyZU9CW10gPSAnY2F0ZWdvcnknLiRkaXJlY3Rpb247DQoJCQkJCWJyZWFrOw0KCQkJfQ0KCQl9DQoNCgkJaWYgKGNvdW50KCR3aGVyZU9CKSA+IDApIHsNCgkJCSR3aGVyZSAuPSAnIE9SREVSIEJZICcgLiBpbXBsb2RlKCIsIiwkd2hlcmVPQik7DQoJCX0NCg0KCQkvLyBIYW5kbGUgcGFnaW5nDQoJCWlmICgoJGxpbWl0ID4gMCkgJiYgJHNob3dwYWdlbGlua3MpIHsNCgkJCSRycyA9IHNhZmVfcm93cygkZmllbGRzLCAndHhwX2ltYWdlJywgJHdoZXJlIC4nIExJTUlUIDAsJy4kbWF4bGltaXQpOw0KCQkJJG51bXRodW0gPSBjb3VudCgkcnMpOw0KCQkJJG51bVBhZ2VzID0gKCRudW10aHVtID4gMCkgPyBjZWlsKCRudW10aHVtLyRsaW1pdCkgOiAxOw0KCQkJJHRodW1icGFnZSA9ICghZ3BzKCd0cGcnKSkgPyAxIDogZ3BzKCd0cGcnKTsNCgkJCSRvZmZzZXQgPSAoJHRodW1icGFnZSAtIDEpICogJGxpbWl0Ow0KCQkJJHJzID0gc2FmZV9yb3dzKCRmaWVsZHMsICd0eHBfaW1hZ2UnLCAkd2hlcmUgLicgTElNSVQgJy4kb2Zmc2V0LicsJy4kbGltaXQpOw0KCQl9IGVsc2Ugew0KCQkJLy8gTm8gcGFnaW5nIHJlcXVpcmVkDQoJCQkkbnVtUGFnZXMgPSAxOw0KCQkJJHRodW1icGFnZSA9IDE7DQoJCQkkcnMgPSBzYWZlX3Jvd3MoJGZpZWxkcywgJ3R4cF9pbWFnZScsICR3aGVyZSAuJyBMSU1JVCAwLCcuICgoJGxpbWl0PT0wKSA/ICRtYXhsaW1pdCA6ICRsaW1pdCkpOw0KCQl9DQoNCgkJLy8gSXMgZml4ZWQtb3JkZXIgb3V0cHV0IGRlc2lyZWQ/IElmIHNvLCByZS1vcmRlciB0aGUgJHJzDQoJCWlmICgkZml4ZWRPcmRlcikgew0KCQkJJG9yZGVyZWRSUyA9IEFycmF5KCk7DQoJCQkkaWdub3JlTGlzdCA9IEFycmF5KCk7DQoJCQkkcmVtYWluaW5nUlMgPSBBcnJheSgpOw0KCQkJLy8gU3VjayBvdXQgdGhlIGZpeGVkIGl0ZW1zIGZpcnN0DQoJCQlmb3IgKCRpZHggPSAwOyAkaWR4IDwgY291bnQoJGZ1bGxJRExpc3QpOyAkaWR4KyspIHsNCgkJCQlmb3JlYWNoKCRycyBhcyAkcm93KSB7DQoJCQkJCWlmICgiJyIuJHJvd1snaWQnXS4iJyIgPT0gJGZ1bGxJRExpc3RbJGlkeF0pIHsNCgkJCQkJCSRvcmRlcmVkUlNbXSA9ICRyb3c7DQoJCQkJCQkkaWdub3JlTGlzdFtdID0gJHJvd1snaWQnXTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJCS8vIFRhY2sgb24gdGhlIHJlbWFpbmluZyByb3dzDQoJCQlmb3JlYWNoKCRycyBhcyAkcm93KSB7DQoJCQkJaWYgKCFpbl9hcnJheSgkcm93WydpZCddLCAkaWdub3JlTGlzdCkpIHsNCgkJCQkJJHJlbWFpbmluZ1JTW10gPSAkcm93Ow0KCQkJCX0NCgkJCX0NCgkJCSRycyA9IGFycmF5X21lcmdlKCRvcmRlcmVkUlMsICRyZW1haW5pbmdSUyk7DQoJCX0NCg0KCQkvLyBDb25zdHJ1Y3QgdGhlIG91dHB1dA0KCQkkb3V0U3RyID0gJyc7DQoJCWlmKCRycykgew0KCQkJZm9yZWFjaCgkcnMgYXMgJHJvdykgew0KCQkJCSR0aHVtYiA9IGh1LiRpbWdfZGlyLicvJyAuICRyb3dbJ2lkJ10gLiAndCcgLiAkcm93WydleHQnXTsNCgkJCQkkZnVsbCA9IGh1LiRpbWdfZGlyLicvJyAuICRyb3dbJ2lkJ10gLiAkcm93WydleHQnXTsNCgkJCQlpZiAoJGdyb3VwbmFtZSA9PT0gIj9jIikgew0KCQkJCQkkZ3JwID0gJHJvd1snY2F0ZWdvcnknXTsNCgkJCQl9IGVsc2UgaWYgKCRncm91cG5hbWVbMF0gPT09ICI/Iikgew0KCQkJCQkvLyBTcGxpdCBvZmYgdGhlIGZpZWxkIG5hbWUgZnJvbSB0aGUgcXVlc3Rpb24gbWFyaw0KCQkJCQkkZmllbGRuYW1lID0gc3Vic3RyKCRncm91cG5hbWUsMSk7DQoJCQkJCWlmIChpc3NldCgkdGhpc2FydGljbGVbJGZpZWxkbmFtZV0pKSB7DQoJCQkJCQkkZ3JwID0gJHRoaXNhcnRpY2xlWyRmaWVsZG5hbWVdOw0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJJGdycCA9ICcnOw0KCQkJCQl9DQoJCQkJfSBlbHNlIHsNCgkJCQkJJGdycCA9ICRncm91cG5hbWU7DQoJCQkJfQ0KDQoJCQkJLy8gR2VuZXJhdGUgdGhlIGNhcHRpb24vYWx0IGlmIHJlcXVpcmVkDQoJCQkJJGNhcFN0ciA9ICgkc2hvd2FsdCAmJiAkcm93WydhbHQnXSkgPyAnPHNwYW4nIC4gKCgkYWx0Y2xhc3MgIT0gIiIpID8gJyBjbGFzcz0iJyAuJGFsdGNsYXNzLiAnIicgOiAnJykgLiAnPicgLiRyb3dbJ2FsdCddLiAnPC9zcGFuPicgOiAnJzsNCgkJCQkkY2FwU3RyIC49ICgkc2hvd2NhcHRpb24gJiYgJHJvd1snY2FwdGlvbiddKSA/ICc8c3BhbicgLiAoKCRjYXB0aW9uY2xhc3MgIT0gIiIpID8gJyBjbGFzcz0iJyAuJGNhcHRpb25jbGFzcy4gJyInIDogJycpIC4gJz4nIC4kcm93WydjYXB0aW9uJ10uICc8L3NwYW4+JyA6ICcnOw0KDQoJCQkJLy8gQ29uc3RydWN0IHRoZSBsaW5rIGFuZCBwdXQgY2FwdGlvbi9hbHQgaW4gdGhlIGFwcHJvcHJpYXRlIHBvc2l0aW9uDQoJCQkJJG91dFN0ciAuPSAoJHdyYXB0YWcgIT0gIiIpID8gJzwnIC4kd3JhcHRhZy4gKCgkY2VsbGNsYXNzICE9ICIiKSA/ICcgY2xhc3M9IicgLiRjZWxsY2xhc3MuICciJyA6ICcnKSAuICc+JyA6ICcnOw0KCQkJCSRvdXRTdHIgLj0gKCR0ZXh0cG9zID09ICJhYm92ZSIpID8gJGNhcFN0ciA6ICcnOw0KCQkJCSRvdXRTdHIgLj0gJzxhIGhyZWY9IicuJGZ1bGwuJyIgcmVsPSJsaWdodGJveC0nIC4kZ3JwLiAnIiB0aXRsZT0iJyAuJHJvd1snY2FwdGlvbiddLiAnIj4nIC4oKCR0ZXh0cG9zID09ICJiZWZvcmUiKSA/ICRjYXBTdHIgOiAnJykuICc8aW1nIHNyYz0iJyAuJHRodW1iLiAnIiBhbHQ9IicgLiRyb3dbJ2FsdCddLiAnIiAvPicgLigoJHRleHRwb3MgPT0gImFmdGVyIikgPyAkY2FwU3RyIDogJycpLiAnPC9hPicubjsNCgkJCQkkb3V0U3RyIC49ICgkdGV4dHBvcyA9PSAiYmVsb3ciKSA/ICRjYXBTdHIgOiAnJzsNCgkJCQkkb3V0U3RyIC49ICgkd3JhcHRhZyAhPSAiIikgPyAnPC8nIC4kd3JhcHRhZy4gJz4nIDogJyc7DQoJCQkJJG91dFN0ciAuPSBuOw0KCQkJfQ0KDQoJCQkvLyBBZGQgdGhlIHBhZ2luZyBmZWF0dXJlcyBpZiByZXF1aXJlZA0KCQkJaWYgKCgkbGltaXQgPiAwKSAmJiAkc2hvd3BhZ2VsaW5rcykgew0KCQkJCSRuZXh0ID0gKCRudW1QYWdlcyA+IDEgJiYgJHRodW1icGFnZSAhPSAkbnVtUGFnZXMpOw0KCQkJCSRwcmV2ID0gKCRudW1QYWdlcyA+IDEgJiYgJHRodW1icGFnZSA+IDEpOw0KDQoJCQkJLy8gUmVwbGFjZSBhbnkgcGFnaW5nIGluZm8gaW4gdGhlIHF1ZXJ5IHN0cmluZw0KCQkJCSRwcmV2UGFnZSA9IGFkZFF1ZXJ5c3RyaW5nVmFyKCRwcmV0ZXh0WydyZXEnXSwgJ3RwZycsICR0aHVtYnBhZ2UtMSk7DQoJCQkJJG5leHRQYWdlID0gYWRkUXVlcnlzdHJpbmdWYXIoJHByZXRleHRbJ3JlcSddLCAndHBnJywgJHRodW1icGFnZSsxKTsNCg0KCQkJCSRvdXRTdHIgLj0gKCR3cmFwdGFnICE9ICIiKSA/ICc8JyAuJHdyYXB0YWcuICgoJG5hdmNsYXNzICE9ICIiKSA/ICcgY2xhc3M9IicgLiRuYXZjbGFzcy4gJyInIDogJycpIC4gJz4nIDogJyc7DQoJCQkJJG91dFN0ciAuPSAoJHByZXYpID8gJzxhJyAuICgoJHByZXZjbGFzcyAhPSAiIikgPyAnIGNsYXNzPSInIC4kcHJldmNsYXNzLiAnIicgOiAnJykgLiAnIGhyZWY9IicgLiRwcmV2UGFnZS4gJyI+JyAuJHByZXZsYWJlbC4gJzwvYT4nLm4gOiAnJzsNCgkJCQkkb3V0U3RyIC49ICgkbmV4dCkgPyAnPGEnIC4gKCgkbmV4dGNsYXNzICE9ICIiKSA/ICcgY2xhc3M9IicgLiRuZXh0Y2xhc3MuICciJyA6ICcnKSAuICcgaHJlZj0iJyAuJG5leHRQYWdlLiAnIj4nIC4kbmV4dGxhYmVsLiAnPC9hPicubiA6ICcnOw0KCQkJCSRvdXRTdHIgLj0gKCR3cmFwdGFnICE9ICIiKSA/ICc8LycgLiR3cmFwdGFnLiAnPicgOiAnJzsNCgkJCQkkb3V0U3RyIC49IG47DQoJCQl9DQoJCX0NCgl9DQoNCglyZXR1cm4gJG91dFN0cjsNCn0NCg0KZnVuY3Rpb24gYWRkUXVlcnlzdHJpbmdWYXIoJHVybCwgJGtleSwgJHZhbHVlKSB7DQoJJHVybCA9IHJlbW92ZVF1ZXJ5c3RyaW5nVmFyKCR1cmwsICRrZXkpOw0KCWlmIChzdHJwb3MoJHVybCwgJz8nKSA9PT0gZmFsc2UpIHsNCgkJcmV0dXJuICgkdXJsIC4gJz8nIC4gJGtleSAuICc9JyAuICR2YWx1ZSk7DQoJfSBlbHNlIHsNCgkJcmV0dXJuICgkdXJsIC4gJyYnIC4gJGtleSAuICc9JyAuICR2YWx1ZSk7DQoJfQ0KfQ0KZnVuY3Rpb24gcmVtb3ZlUXVlcnlzdHJpbmdWYXIoJHVybCwgJGtleSkgew0KCSR1cmwgPSBwcmVnX3JlcGxhY2UoJy8oLiopKFw/fCYpJyAuICRrZXkgLiAnPVteJl0rPygmKSguKikvaScsICckMSQyJDQnLCAkdXJsIC4gJyYnKTsNCgkkdXJsID0gc3Vic3RyKCR1cmwsIDAsIC0xKTsNCglyZXR1cm4gKCR1cmwpOw0KfSI7czo0OiJ0eXBlIjtzOjE6IjAiO3M6MzoibWQ1IjtzOjMyOiI1OTkxYWNkNjBjOTI3MTQ0NmJlMGU1M2EyNzFhZDM3ZSI7fQ==