XGRvY3VtZW50Y2xhc3N7YXJ0aWNsZX0KXHVzZXBhY2thZ2V7ZXBzZmlnfQpcdXNlcGFja2FnZXtkYXJ0fQpcdXNlcGFja2FnZXtibmZ9Clx1c2VwYWNrYWdle2h5cGVycmVmfQpcbmV3Y29tbWFuZHtcY29kZX1bMV17e1xzZiAjMX19Clx0aXRsZXtEYXJ0IFByb2dyYW1taW5nIExhbmd1YWdlICBTcGVjaWZpY2F0aW9uIFxcCntcbGFyZ2UgVmVyc2lvbiAxLjZ9fQolXGF1dGhvcntUaGUgRGFydCBUZWFtfQpcYmVnaW57ZG9jdW1lbnR9ClxtYWtldGl0bGUKXHRhYmxlb2Zjb250ZW50cwoKClxuZXdwYWdlCgpccGFnZXN0eWxle215aGVhZGluZ3N9ClxtYXJrcmlnaHR7RGFydCBQcm9ncmFtbWluZyBMYW5ndWFnZSBTcGVjaWZpY2F0aW9ufQoKJSBiZWdpbiBFY21hIGJvaWxlcnBsYXRlClxzZWN0aW9ue1Njb3BlfQpcbGFiZWx7ZWNtYVNjb3BlfQoKVGhpcyBFY21hIHN0YW5kYXJkIHNwZWNpZmllcyB0aGUgc3ludGF4IGFuZCBzZW1hbnRpY3Mgb2YgdGhlIERhcnQgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuICBJdCBkb2VzIG5vdCBzcGVjaWZ5IHRoZSBBUElzIG9mIHRoZSBEYXJ0IGxpYnJhcmllcyBleGNlcHQgd2hlcmUgdGhvc2UgbGlicmFyeSBlbGVtZW50cyBhcmUgZXNzZW50aWFsIHRvIHRoZSBjb3JyZWN0IGZ1bmN0aW9uaW5nIG9mIHRoZSBsYW5ndWFnZSBpdHNlbGYgKGUuZy4sIHRoZSBleGlzdGVuY2Ugb2YgY2xhc3MgXGNke09iamVjdH0gd2l0aCBtZXRob2RzIHN1Y2ggYXMgXGNke25vU3VjaE1ldGhvZH0sIFxjZHtydW50aW1lVHlwZX0pLgoKXHNlY3Rpb257Q29uZm9ybWFuY2V9ClxsYWJlbHtlY21hQ29uZm9ybWFuY2V9CgpBIGNvbmZvcm1pbmcgIGltcGxlbWVudGF0aW9uIG9mIHRoZSBEYXJ0IHByb2dyYW1taW5nIGxhbmd1YWdlIG11c3QgcHJvdmlkZSBhbmQgc3VwcG9ydCBhbGwgdGhlICBBUElzIChsaWJyYXJpZXMsIHR5cGVzLCBmdW5jdGlvbnMsIGdldHRlcnMsIHNldHRlcnMsIHdoZXRoZXIgdG9wLWxldmVsLCBzdGF0aWMsIGluc3RhbmNlIG9yIGxvY2FsKSBtYW5kYXRlZCBpbiB0aGlzIHNwZWNpZmljYXRpb24uIAoKQSBjb25mb3JtaW5nIGltcGxlbWVudGF0aW9uIGlzIHBlcm1pdHRlZCB0byBwcm92aWRlIGFkZGl0aW9uYWwgQVBJcywgYnV0IG5vdCBhZGRpdGlvbmFsIHN5bnRheCwgZXhjZXB0IGZvciBleHBlcmltZW50YWwgZmVhdHVyZXMgaW4gc3VwcG9ydCBvZiBlbnVtZXJhdGVkIHR5cGVzIGFuZCBkZWZlcnJlZCBsb2FkaW5nIHdoaWNoIGFyZSBleHBlY3RlZCB0byBiZSBhZGRlZCBpbiB0aGUgbmV4dCByZXZpc2lvbiBvZiB0aGlzIHNwZWNpZmljYXRpb24uCgolIEEgY2xhaW0gb2YgY29uZm9ybWFuY2Ugd2l0aCB0aGlzIEVjbWEgU3RhbmRhcmQgc2hhbGwgc3BlY2lmeT8KClxzZWN0aW9ue05vcm1hdGl2ZSBSZWZlcmVuY2VzfQpcbGFiZWx7ZWNtYU5vcm1hdGl2ZVJlZmVyZW5jZXN9CgpUaGUgZm9sbG93aW5nIHJlZmVyZW5jZWQgZG9jdW1lbnRzIGFyZSBpbmRpc3BlbnNhYmxlIGZvciB0aGUgYXBwbGljYXRpb24gb2YgdGhpcyBkb2N1bWVudC4gRm9yIGRhdGVkIHJlZmVyZW5jZXMsIG9ubHkgdGhlIGVkaXRpb24gY2l0ZWQgYXBwbGllcy4gRm9yIHVuZGF0ZWQgcmVmZXJlbmNlcywgdGhlIGxhdGVzdCBlZGl0aW9uIG9mIHRoZSByZWZlcmVuY2VkIGRvY3VtZW50IChpbmNsdWRpbmcgYW55IGFtZW5kbWVudHMpIGFwcGxpZXMuCgpcYmVnaW57ZW51bWVyYXRlfQpcaXRlbQpUaGUgVW5pY29kZSBTdGFuZGFyZCwgVmVyc2lvbiA1LjAsIGFzIGFtZW5kZWQgYnkgVW5pY29kZSA1LjEuMCwgb3Igc3VjY2Vzc29yLgpcaXRlbQpEYXJ0IEFQSSBSZWZlcmVuY2UsIGh0dHBzOi8vYXBpLmRhcnRsYW5nLm9yZy8KXGVuZHtlbnVtZXJhdGV9CgoKXHNlY3Rpb257VGVybXMgYW5kIERlZmluaXRpb25zfQpcbGFiZWx7ZWNtYVRlcm1zQW5kRGVmaW5pdGlvbnN9CgpUZXJtcyBhbmQgZGVmaW5pdGlvbnMgdXNlZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gYXJlIGdpdmVuIGluIHRoZSBib2R5IG9mIHRoZSBzcGVjaWZpY2F0aW9uIHByb3Blci4gU3VjaCB0ZXJtcyBhcmUgaGlnaGxpZ2h0ZWQgaW4gaXRhbGljcyB3aGVuIHRoZXkgYXJlIGludHJvZHVjZWQsIGUuZy4sIGB3ZSB1c2UgdGhlIHRlcm0ge1xlbSB2ZXJib3NpdHl9IHRvIHJlZmVyIHRvIHRoZSBwcm9wZXJ0eSBvZiBleGNlc3MgdmVyYmlhZ2UnLgolIEVuZCBFY21hIEJvaWxlcnBsYXRlCgogIApcc2VjdGlvbntOb3RhdGlvbn0KXGxhYmVse25vdGF0aW9ufQoKV2UgZGlzdGluZ3Vpc2ggYmV0d2VlbiBub3JtYXRpdmUgYW5kIG5vbi1ub3JtYXRpdmUgdGV4dC4gTm9ybWF0aXZlIHRleHQgZGVmaW5lcyB0aGUgcnVsZXMgb2YgRGFydC4gSXQgaXMgZ2l2ZW4gaW4gdGhpcyBmb250LiBBdCB0aGlzIHRpbWUsIG5vbi1ub3JtYXRpdmUgdGV4dCBpbmNsdWRlczoKXGJlZ2lue2l0ZW1pemV9ClxpdGVtW1JhdGlvbmFsZV0gRGlzY3Vzc2lvbiBvZiB0aGUgbW90aXZhdGlvbiBmb3IgbGFuZ3VhZ2UgZGVzaWduIGRlY2lzaW9ucyBhcHBlYXJzIGluIGl0YWxpY3MuIFxyYXRpb25hbGV7RGlzdGluZ3Vpc2hpbmcgbm9ybWF0aXZlIGZyb20gbm9uLW5vcm1hdGl2ZSBoZWxwcyBjbGFyaWZ5IHdoYXQgcGFydCBvZiB0aGUgdGV4dCBpcyBiaW5kaW5nIGFuZCB3aGF0IHBhcnQgaXMgbWVyZWx5IGV4cG9zaXRvcnkufQpcaXRlbVtDb21tZW50YXJ5XSBDb21tZW50cyBzdWNoIGFzICBgYFxjb21tZW50YXJ5e1RoZSBjYXJlZnVsIHJlYWRlciB3aWxsIGhhdmUgbm90aWNlZCB0aGF0IHRoZSBuYW1lIERhcnQgaGFzIGZvdXIgY2hhcmFjdGVyc30nJyBzZXJ2ZSB0byBpbGx1c3RyYXRlIG9yIGNsYXJpZnkgdGhlIHNwZWNpZmljYXRpb24sIGJ1dCBhcmUgcmVkdW5kYW50IHdpdGggdGhlIG5vcm1hdGl2ZSB0ZXh0LiAgXGNvbW1lbnRhcnl7VGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBjb21tZW50YXJ5IGFuZCByYXRpb25hbGUgY2FuIGJlIHN1YnRsZS59IFxyYXRpb25hbGV7IENvbW1lbnRhcnkgaXMgbW9yZSBnZW5lcmFsIHRoYW4gcmF0aW9uYWxlLCBhbmQgbWF5IGluY2x1ZGUgaWxsdXN0cmF0aXZlIGV4YW1wbGVzIG9yIGNsYXJpZmljYXRpb25zLiB9ClxpdGVtW09wZW4gcXVlc3Rpb25zXSAoXFF7aW4gdGhpcyBmb250fSkuIE9wZW4gcXVlc3Rpb25zIGFyZSBwb2ludHMgdGhhdCBhcmUgdW5zZXR0bGVkIGluIHRoZSBtaW5kIG9mIHRoZSBhdXRob3Iocykgb2YgdGhlIHNwZWNpZmljYXRpb247IGV4cGVjdCB0aGVtICh0aGUgcXVlc3Rpb25zLCBub3QgdGhlIGF1dGhvcnM7IHByZWNpc2lvbiBpcyBpbXBvcnRhbnQgaW4gYSBzcGVjaWZpY2F0aW9uKSB0byBiZSBlbGltaW5hdGVkIGluIHRoZSBmaW5hbCBzcGVjaWZpY2F0aW9uLiBcUXtTaG91bGQgdGhlIHRleHQgYXQgdGhlIGVuZCBvZiB0aGUgcHJldmlvdXMgYnVsbGV0IGJlIHJhdGlvbmFsZSBvciBjb21tZW50YXJ5P30KXGVuZHtpdGVtaXplfQoKUmVzZXJ2ZWQgd29yZHMgYW5kIGJ1aWx0LWluIGlkZW50aWZpZXJzICAoXHJlZntpZGVudGlmaWVyUmVmZXJlbmNlfSkgYXBwZWFyIGluIHtcYmYgYm9sZH0uCgpcY29tbWVudGFyeXsKRXhhbXBsZXMgd291bGQgYmUgXFNXSVRDSHt9IG9yIFxDTEFTU3t9Lgp9CgoKR3JhbW1hciBwcm9kdWN0aW9ucyBhcmUgZ2l2ZW4gaW4gYSBjb21tb24gdmFyaWFudCBvZiBFQk5GLiAgVGhlIGxlZnQgaGFuZCBzaWRlIG9mIGEgcHJvZHVjdGlvbiBlbmRzIHdpdGggYSBjb2xvbi4gIE9uIHRoZSByaWdodCBoYW5kIHNpZGUsIGFsdGVybmF0aW9uIGlzIHJlcHJlc2VudGVkIGJ5IHZlcnRpY2FsIGJhcnMsIGFuZCBzZXF1ZW5jaW5nIGJ5IHNwYWNpbmcuICBBcyBpbiBQRUdzLCBhbHRlcm5hdGlvbiBnaXZlcyBwcmlvcml0eSB0byB0aGUgbGVmdC4gT3B0aW9uYWwgZWxlbWVudHMgb2YgYSBwcm9kdWN0aW9uIGFyZSBzdWZmaXhlZCBieSBhIHF1ZXN0aW9uIG1hcmsgbGlrZSBzbzogXGNvZGV7YW5FbGVwaGFudD99LiAgQXBwZW5kaW5nIGEgc3RhciB0byBhbiBlbGVtZW50IG9mIGEgcHJvZHVjdGlvbiBtZWFucyBpdCBtYXkgYmUgcmVwZWF0ZWQgemVybyBvciBtb3JlIHRpbWVzLiAgQXBwZW5kaW5nIGEgcGx1cyBzaWduIHRvIGEgcHJvZHVjdGlvbiBtZWFucyBpdCBvY2N1cnMgb25lIG9yIG1vcmUgdGltZXMuIFBhcmVudGhlc2VzIGFyZSB1c2VkIGZvciBncm91cGluZy4gTmVnYXRpb24gIGlzIHJlcHJlc2VudGVkIGJ5IHByZWZpeGluZyBhbiBlbGVtZW50IG9mIGEgcHJvZHVjdGlvbiB3aXRoIGEgdGlsZGUuIE5lZ2F0aW9uIGlzIHNpbWlsYXIgdG8gdGhlIG5vdCBjb21iaW5hdG9yIG9mIFBFR3MsIGJ1dCBpdCBjb25zdW1lcyBpbnB1dCBpZiBpdCBtYXRjaGVzLiBJbiB0aGUgY29udGV4dCBvZiBhIGxleGljYWwgcHJvZHVjdGlvbiBpdCBjb25zdW1lcyBhIHNpbmdsZSBjaGFyYWN0ZXIgaWYgdGhlcmUgaXMgb25lOyAgb3RoZXJ3aXNlLCBhIHNpbmdsZSB0b2tlbiBpZiB0aGVyZSBpcyBvbmUuCgpcY29tbWVudGFyeXsgQW4gZXhhbXBsZSB3b3VsZCBiZTp9CgpcYmVnaW57Z3JhbW1hcn0Ke1xzZgp7XGJmIEFQcm9kdWN0aW9uOn1BbkFsdGVybmF0aXZlOwogICAgQW5vdGhlckFsdGVybmF0aXZlOwogICAgT25lVGhpbmcgQWZ0ZXIgQW5vdGhlcjsKICAgIFplcm9Pck1vcmVUaGluZ3MqOwogICAgT25lT3JNb3JlVGhpbmdzKzsKICAgIEFuT3B0aW9uYWxUaGluZz87CiAgICAoU29tZSBHcm91cGVkIFRoaW5ncyk7CiAgICBcfnt9Tm90QVRoaW5nOwogICAgQVxfTEVYSUNBTFxfVEhJTkcKICAgIC4KICAgIH0KXGVuZHtncmFtbWFyfQoKJSBuZWVkIGEgbWF0Y2ggYW55dGhpbmcgb3IgYSBwcm9kdWN0aW9uIHRoYXQgZG9lcyB0aGF0LCBzbyB3ZSBjYW4gY29ycmVjdCBidWdzIHdydCB1c2UKJSB+LiB+IGRvZXMgbm90IGFjdHVhbGx5IHBhcnNlIHN0dWZmIC0gaXQganVzdCBsb29rcyBhaGVhZCBhbmQgY2hlY2tzLiBUbyBnZXQgdGhlIGVmZmVjdCBvZgolIHBhcnNpbmcgYW55dGhpbmcgYnV0IFgsIG9uZSBuZWVkcyB+WCBBTllUSElORywgbm90IGp1c3QgflguIFRoZXJlIGFyZSBidWdzIGluIHRoZQolIGdyYW1tYXIgcmVsYXRlZCB0byB0aGlzLiAKJSBUaGUgYWx0ZXJuYXRpdmUgaXMgdG8gZGVmaW5lIH5YIGFzIGFueXRoaW5nIGJ1dCBYLCBvciB0byBpbnRyb2R1Y2UgYW4gYW50aGluZ0J1dChYKSAKJSBjb21iaW5hdG9yLCBzdWNoIGFzICFYCgpCb3RoIHN5bnRhY3RpYyBhbmQgbGV4aWNhbCBwcm9kdWN0aW9ucyBhcmUgcmVwcmVzZW50ZWQgdGhpcyB3YXkuIExleGljYWwgcHJvZHVjdGlvbnMgYXJlIGRpc3Rpbmd1aXNoZWQgYnkgdGhlaXIgbmFtZXMuIFRoZSBuYW1lcyBvZiBsZXhpY2FsIHByb2R1Y3Rpb25zIGNvbnNpc3QgZXhjbHVzaXZlbHkgb2YgdXBwZXIgY2FzZSBjaGFyYWN0ZXJzIGFuZCB1bmRlcnNjb3Jlcy4gIEFzIGFsd2F5cywgd2l0aGluIGdyYW1tYXRpY2FsIHByb2R1Y3Rpb25zLCB3aGl0ZXNwYWNlIGFuZCBjb21tZW50cyBiZXR3ZWVuIGVsZW1lbnRzIG9mIHRoZSBwcm9kdWN0aW9uIGFyZSBpbXBsaWNpdGx5IGlnbm9yZWQgdW5sZXNzIHN0YXRlZCBvdGhlcndpc2UuIApQdW5jdHVhdGlvbiB0b2tlbnMgYXBwZWFyIGluIHF1b3Rlcy4gCgpQcm9kdWN0aW9ucyBhcmUgZW1iZWRkZWQsIGFzIG11Y2ggYXMgcG9zc2libGUsIGluIHRoZSBkaXNjdXNzaW9uIG9mIHRoZSBjb25zdHJ1Y3RzIHRoZXkgcmVwcmVzZW50LiAKCkEgbGlzdCAkeF8xLCBcbGRvdHMsIHhfbiQgZGVub3RlcyBhbnkgbGlzdCBvZiAkbiQgZWxlbWVudHMgb2YgdGhlIGZvcm0gJHhfaSwgMSBcbGUgaSBcbGUgbiQuIE5vdGUgdGhhdCAkbiQgbWF5IGJlIHplcm8sIGluIHdoaWNoIGNhc2UgdGhlIGxpc3QgaXMgZW1wdHkuIFdlIHVzZSBzdWNoIGxpc3RzIGV4dGVuc2l2ZWx5IHRocm91Z2hvdXQgdGhpcyBzcGVjaWZpY2F0aW9uLgoKVGhlIG5vdGF0aW9uICRbeF8xLCBcbGRvdHMsIHhfbi95XzEsIFxsZG90cywgeV9uXUUkIGRlbm90ZXMgYSBjb3B5IG9mICRFJCBpbiB3aGljaCBhbGwgb2NjdXJyZW5jZXMgb2YgJHlfaSwgMSBcbGUgaSBcbGUgbiQgaGF2ZSBiZWVuIHJlcGxhY2VkIHdpdGggJHhfaSQuCgpXZSBzb21ldGltZXMgYWJ1c2UgbGlzdCBvciBtYXAgbGl0ZXJhbCBzeW50YXgsIHdyaXRpbmcgJFtvXzEsIFxsZG90cywgb19uXSQgIChyZXNwZWN0aXZlbHkgJFx7a18xOiBvXzEsIFxsZG90cywga19uOiBvX25cfSQpIHdoZXJlIHRoZSAkb19pJCBhbmQgJGtfaSQgbWF5IGJlIG9iamVjdHMgcmF0aGVyIHRoYW4gZXhwcmVzc2lvbnMuIFRoZSBpbnRlbnQgaXMgdG8gZGVub3RlIGEgbGlzdCAocmVzcGVjdGl2ZWx5IG1hcCkgb2JqZWN0IHdob3NlIGVsZW1lbnRzIGFyZSB0aGUgJG9faSQgKHJlc3BlY3RpdmVseSwgd2hvc2Uga2V5cyBhcmUgdGhlICRrX2kkIGFuZCB2YWx1ZXMgYXJlIHRoZSAkb19pJCkuCgpUaGUgc3BlY2lmaWNhdGlvbnMgb2Ygb3BlcmF0b3JzIG9mdGVuIGludm9sdmUgc3RhdGVtZW50cyBzdWNoIGFzICR4JCAkb3AkICR5JCBpcyBlcXVpdmFsZW50IHRvIHRoZSBtZXRob2QgaW52b2NhdGlvbiAkeC5vcCh5KSQuIFN1Y2ggc3BlY2lmaWNhdGlvbnMgc2hvdWxkIGJlIHVuZGVyc3Rvb2QgYXMgYSBzaG9ydGhhbmQgZm9yOgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0KICR4JCAkb3AkICR5JCBpcyBlcXVpdmFsZW50IHRvIHRoZSBtZXRob2QgaW52b2NhdGlvbiAkeC5vcF5ccHJpbWUoeSkkLCBhc3N1bWluZyB0aGUgY2xhc3Mgb2YgJHgkIGFjdHVhbGx5IGRlY2xhcmVkIGEgbm9uLW9wZXJhdG9yIG1ldGhvZCBuYW1lZCAkb3BeXHByaW1lJCBkZWZpbmluZyB0aGUgc2FtZSBmdW5jdGlvbiBhcyB0aGUgb3BlcmF0b3IgJG9wJC4gCiBcZW5ke2l0ZW1pemV9CiAKIFxyYXRpb25hbGV7VGhpcyBjaXJjdW1sb2N1dGlvbiBpcyByZXF1aXJlZCBiZWNhdXNlIHgub3AoeSksIHdoZXJlIG9wIGlzIGFuIG9wZXJhdG9yLCBpcyBub3QgbGVnYWwgc3ludGF4LiBIb3dldmVyLCBpdCBpcyBwYWluZnVsbHkgdmVyYm9zZSwgYW5kIHdlIHByZWZlciB0byBzdGF0ZSB0aGlzIHJ1bGUgb25jZSBoZXJlLCBhbmQgdXNlIGEgY29uY2lzZSBhbmQgY2xlYXIgbm90YXRpb24gYWNyb3NzIHRoZSBzcGVjaWZpY2F0aW9uLgogfQoKV2hlbiB0aGUgc3BlY2lmaWNhdGlvbiByZWZlcnMgdG8gdGhlIG9yZGVyIGdpdmVuIGluIHRoZSBwcm9ncmFtLCBpdCBtZWFucyB0aGUgb3JkZXIgb2YgdGhlIHByb2dyYW0gc291cmNlIGNvZGUgdGV4dCwgc2Nhbm5pbmcgbGVmdC10by1yaWdodCBhbmQgdG9wLXRvLWJvdHRvbS4KClJlZmVyZW5jZXMgdG8gb3RoZXJ3aXNlIHVuc3BlY2lmaWVkIG5hbWVzIG9mIHByb2dyYW0gZW50aXRpZXMgKHN1Y2ggYXMgY2xhc3NlcyBvciBmdW5jdGlvbnMpIGFyZSBpbnRlcnByZXRlZCBhcyB0aGUgbmFtZXMgb2YgbWVtYmVycyBvZiB0aGUgRGFydCBjb3JlIGxpYnJhcnkuCgpcY29tbWVudGFyeXsKRXhhbXBsZXMgd291bGQgYmUgdGhlIGNsYXNzZXMgXGNvZGV7T2JqZWN0fSBhbmQgXGNvZGV7VHlwZX0gcmVwcmVzZW50aW5nIHRoZSByb290IG9mIHRoZSBjbGFzcyBoaWVyYXJjaHkgYW5kIHRoZSByZWlmaWNhdGlvbiBvZiBydW50aW1lIHR5cGVzIHJlc3BlY3RpdmVseS4gCn0KClxzZWN0aW9ue092ZXJ2aWV3fQpcbGFiZWx7b3ZlcnZpZXd9CgpEYXJ0IGlzIGEgY2xhc3MtYmFzZWQsIHNpbmdsZS1pbmhlcml0YW5jZSwgcHVyZSBvYmplY3Qtb3JpZW50ZWQgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuIERhcnQgaXMgb3B0aW9uYWxseSB0eXBlZCAoXHJlZnt0eXBlc30pIGFuZCBzdXBwb3J0cyByZWlmaWVkIGdlbmVyaWNzLiBUaGUgcnVuLXRpbWUgdHlwZSBvZiBldmVyeSBvYmplY3QgaXMgcmVwcmVzZW50ZWQgYXMgYW4gaW5zdGFuY2Ugb2YgY2xhc3MgXGNvZGV7VHlwZX0gIHdoaWNoIGNhbiBiZSBvYnRhaW5lZCBieSBjYWxsaW5nIHRoZSBnZXR0ZXIgIFxjb2Rle3J1bnRpbWVUeXBlfSBkZWNsYXJlZCBpbiBjbGFzcyBcY29kZXtPYmplY3R9LCB0aGUgcm9vdCBvZiB0aGUgRGFydCBjbGFzcyBoaWVyYXJjaHkuCgpEYXJ0IHByb2dyYW1zIG1heSBiZSBzdGF0aWNhbGx5IGNoZWNrZWQuIFRoZSBzdGF0aWMgY2hlY2tlciB3aWxsIHJlcG9ydCBzb21lIHZpb2xhdGlvbnMgb2YgdGhlIHR5cGUgcnVsZXMsIGJ1dCBzdWNoIHZpb2xhdGlvbnMgZG8gbm90IGFib3J0IGNvbXBpbGF0aW9uIG9yIHByZWNsdWRlIGV4ZWN1dGlvbi4gCgpEYXJ0IHByb2dyYW1zIG1heSBiZSBleGVjdXRlZCBpbiBvbmUgb2YgdHdvIG1vZGVzOiBwcm9kdWN0aW9uIG1vZGUgb3IgY2hlY2tlZCBtb2RlLiBJbiBwcm9kdWN0aW9uIG1vZGUsIHN0YXRpYyB0eXBlIGFubm90YXRpb25zIChccmVme3N0YXRpY1R5cGVzfSkgaGF2ZSBhYnNvbHV0ZWx5IG5vIGVmZmVjdCBvbiBleGVjdXRpb24gd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHJlZmxlY3Rpb24gYW5kIHN0cnVjdHVyYWwgdHlwZSB0ZXN0cy4gCgpcY29tbWVudGFyeXsKUmVmbGVjdGlvbiwgYnkgZGVmaW5pdGlvbiwgZXhhbWluZXMgdGhlIHByb2dyYW0gc3RydWN0dXJlLiBJZiB3ZSBwcm92aWRlIHJlZmxlY3RpdmUgYWNjZXNzIHRvIHRoZSB0eXBlIG9mIGEgZGVjbGFyYXRpb24sIG9yIHRvIHNvdXJjZSBjb2RlLCBpdCB3aWxsIGluZXZpdGFibHkgcHJvZHVjZSByZXN1bHRzIHRoYXQgZGVwZW5kIG9uIHRoZSB0eXBlcyB1c2VkIGluIHRoZSB1bmRlcmx5aW5nIGNvZGUuCgpUeXBlIHRlc3RzIGFsc28gZXhhbWluZSB0aGUgdHlwZXMgaW4gYSBwcm9ncmFtIGV4cGxpY2l0bHkuIE5ldmVydGhlbGVzcywgaW4gbW9zdCBjYXNlcywgdGhlc2Ugd2lsbCBub3QgZGVwZW5kIG9uIHR5cGUgYW5ub3RhdGlvbnMuIFRoZSBleGNlcHRpb25zIHRvIHRoaXMgcnVsZSBhcmUgdHlwZSB0ZXN0cyBpbnZvbHZpbmcgZnVuY3Rpb24gdHlwZXMuIEZ1bmN0aW9uIHR5cGVzIGFyZSBzdHJ1Y3R1cmFsLCBhbmQgc28gZGVwZW5kIG9uIHRoZSB0eXBlcyBkZWNsYXJlZCBmb3IgdGhlaXIgcGFyYW1ldGVycyBhbmQgb24gdGhlaXIgcmV0dXJuIHR5cGVzLiAKfQoKSW4gY2hlY2tlZCBtb2RlLCBhc3NpZ25tZW50cyBhcmUgZHluYW1pY2FsbHkgY2hlY2tlZCwgYW5kIGNlcnRhaW4gdmlvbGF0aW9ucyBvZiB0aGUgdHlwZSBzeXN0ZW0gcmFpc2UgZXhjZXB0aW9ucyBhdCBydW4gdGltZS4KClxjb21tZW50YXJ5ewpUaGUgY29leGlzdGVuY2UgYmV0d2VlbiBvcHRpb25hbCB0eXBpbmcgYW5kIHJlaWZpY2F0aW9uIGlzIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmc6ClxiZWdpbntlbnVtZXJhdGV9ClxpdGVtIFJlaWZpZWQgdHlwZSBpbmZvcm1hdGlvbiByZWZsZWN0cyB0aGUgdHlwZXMgb2Ygb2JqZWN0cyBhdCBydW50aW1lIGFuZCBtYXkgYWx3YXlzIGJlIHF1ZXJpZWQgYnkgZHluYW1pYyB0eXBlY2hlY2tpbmcgY29uc3RydWN0cyAodGhlIGFuYWxvZ3Mgb2YgaW5zdGFuY2VPZiwgY2FzdHMsIHR5cGVjYXNlIGV0Yy4gaW4gb3RoZXIgbGFuZ3VhZ2VzKS4gUmVpZmllZCB0eXBlIGluZm9ybWF0aW9uIGluY2x1ZGVzIGNsYXNzIGRlY2xhcmF0aW9ucywgdGhlIHJ1bnRpbWUgdHlwZSAoYWthIGNsYXNzKSBvZiBhbiBvYmplY3QsIGFuZCB0eXBlIGFyZ3VtZW50cyB0byBjb25zdHJ1Y3RvcnMuIApcaXRlbSBTdGF0aWMgdHlwZSBhbm5vdGF0aW9ucyBkZXRlcm1pbmUgdGhlIHR5cGVzIG9mIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb24gZGVjbGFyYXRpb25zIChpbmNsdWRpbmcgbWV0aG9kcyBhbmQgY29uc3RydWN0b3JzKS4gClxpdGVtIFByb2R1Y3Rpb24gbW9kZSByZXNwZWN0cyBvcHRpb25hbCB0eXBpbmcuIFN0YXRpYyB0eXBlIGFubm90YXRpb25zIGRvIG5vdCBhZmZlY3QgcnVudGltZSBiZWhhdmlvci4KXGl0ZW0gQ2hlY2tlZCBtb2RlIHV0aWxpemVzIHN0YXRpYyB0eXBlIGFubm90YXRpb25zIGFuZCBkeW5hbWljIHR5cGUgaW5mb3JtYXRpb24gYWdncmVzc2l2ZWx5IHlldCBzZWxlY3RpdmVseSB0byBwcm92aWRlIGVhcmx5IGVycm9yIGRldGVjdGlvbiBkdXJpbmcgZGV2ZWxvcG1lbnQuClxlbmR7ZW51bWVyYXRlfQp9CgpEYXJ0IHByb2dyYW1zIGFyZSBvcmdhbml6ZWQgaW4gYSBtb2R1bGFyIGZhc2hpb24gaW50byB1bml0cyBjYWxsZWQge1xlbSBsaWJyYXJpZXN9IChccmVme2xpYnJhcmllc0FuZFNjcmlwdHN9KS4gTGlicmFyaWVzIGFyZSB1bml0cyBvZiBlbmNhcHN1bGF0aW9uIGFuZCBtYXkgYmUgbXV0dWFsbHkgcmVjdXJzaXZlLiAKClxjb21tZW50YXJ5e0hvd2V2ZXIgdGhleSBhcmUgbm90IGZpcnN0IGNsYXNzLiAgVG8gZ2V0IG11bHRpcGxlIGNvcGllcyBvZiBhIGxpYnJhcnkgcnVubmluZyBzaW11bHRhbmVvdXNseSwgb25lIG5lZWRzIHRvIHNwYXduIGFuIGlzb2xhdGUuIAp9Cgpcc3Vic2VjdGlvbntTY29waW5nfQpcbGFiZWx7c2NvcGluZ30KCkEge1xlbSBuYW1lc3BhY2V9IGlzIGEgbWFwcGluZyBvZiBuYW1lcyBkZW5vdGluZyBkZWNsYXJhdGlvbnMgdG8gYWN0dWFsIGRlY2xhcmF0aW9ucy4gIExldCAkTlMkIGJlIGEgbmFtZXNwYWNlLiBXZSBzYXkgdGhhdCBhIG5hbWUgJG4kIHtcZW0gaXMgaW4gfSROUyQgaWYgJG4kIGlzIGEga2V5IG9mICROUyQuIFdlIHNheSBhIGRlY2xhcmF0aW9uICRkJCB7XGVtIGlzIGluIH0kTlMkIGlmIGEga2V5IG9mICROUyQgbWFwcyB0byAkZCQuCgpBIHNjb3BlICRTXzAkIGluZHVjZXMgYSBuYW1lc3BhY2UgJE5TXzAkIHRoYXQgbWFwcyB0aGUgc2ltcGxlIG5hbWUgb2YgZWFjaCB2YXJpYWJsZSwgdHlwZSBvciBmdW5jdGlvbiBkZWNsYXJhdGlvbiAkZCQgZGVjbGFyZWQgaW4gJFNfMCQgdG8gJGQkLiBMYWJlbHMgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgaW5kdWNlZCBuYW1lc3BhY2Ugb2YgYSBzY29wZTsgaW5zdGVhZCB0aGV5IGhhdmUgdGhlaXIgb3duIGRlZGljYXRlZCBuYW1lc3BhY2UuCgpcY29tbWVudGFyeXtJdCBpcyB0aGVyZWZvcmUgaW1wb3NzaWJsZSwgZS5nLiwgIHRvIGRlZmluZSBhIGNsYXNzIHRoYXQgZGVjbGFyZXMgYSBtZXRob2QgYW5kIGEgZmllbGQgd2l0aCB0aGUgc2FtZSBuYW1lIGluIERhcnQuIFNpbWlsYXJseSBvbmUgY2Fubm90IGRlY2xhcmUgYSB0b3AtbGV2ZWwgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSBuYW1lIGFzIGEgbGlicmFyeSB2YXJpYWJsZSBvciBjbGFzcy4KICB9CiAgCkl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgZW50aXR5IHdpdGggdGhlIHNhbWUgbmFtZSBkZWNsYXJlZCBpbiB0aGUgc2FtZSBzY29wZS4KClxjb21tZW50YXJ5ewpJbiBzb21lIGNhc2VzLCB0aGUgbmFtZSBvZiB0aGUgZGVjbGFyYXRpb24gZGlmZmVycyBmcm9tIHRoZSBpZGVudGlmaWVyIHVzZWQgdG8gZGVjbGFyZSBpdC4gIFNldHRlcnMgaGF2ZSBuYW1lcyB0aGF0IGFyZSBkaXN0aW5jdCBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIGdldHRlcnMgYmVjYXVzZSB0aGV5IGFsd2F5cyBoYXZlIGFuID0gYXV0b21hdGljYWxseSBhZGRlZCBhdCB0aGUgZW5kLCBhbmQgdW5hcnkgbWludXMgaGFzIHRoZSBzcGVjaWFsIG5hbWUgdW5hcnktLgp9CgpEYXJ0IGlzIGxleGljYWxseSBzY29wZWQuICAgIFNjb3BlcyBtYXkgbmVzdC4gIEEgbmFtZSBvciBkZWNsYXJhdGlvbiAkZCQgaXMge1xlbSBhdmFpbGFibGUgaW4gc2NvcGV9ICRTJCBpZiAkZCQgaXMgaW4gdGhlIG5hbWVzcGFjZSBpbmR1Y2VkIGJ5ICRTJCBvciBpZiAkZCQgaXMgYXZhaWxhYmxlIGluIHRoZSBsZXhpY2FsbHkgZW5jbG9zaW5nIHNjb3BlIG9mICRTJC4gV2UgIHNheSB0aGF0IGEgbmFtZSBvciBkZWNsYXJhdGlvbiAkZCQgaXMge1xlbSBpbiBzY29wZX0gaWYgJGQkIGlzIGF2YWlsYWJsZSBpbiB0aGUgY3VycmVudCBzY29wZS4gCgoKSWYgYSAgZGVjbGFyYXRpb24gJGQkIG5hbWVkICRuJCBpcyBpbiB0aGUgbmFtZXNwYWNlIGluZHVjZWQgYnkgYSBzY29wZSAkUyQsIHRoZW4gJGQkIHtcZW0gaGlkZXN9IGFueSBkZWNsYXJhdGlvbiBuYW1lZCAkbiQgdGhhdCBpcyBhdmFpbGFibGUgaW4gdGhlIGxleGljYWxseSBlbmNsb3Npbmcgc2NvcGUgb2YgJFMkLiAKClxjb21tZW50YXJ5IHsKQSBjb25zZXF1ZW5jZSBvZiB0aGVzZSBydWxlcyBpcyB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIGhpZGUgYSB0eXBlIHdpdGggYSBtZXRob2Qgb3IgdmFyaWFibGUuCk5hbWluZyBjb252ZW50aW9ucyB1c3VhbGx5IHByZXZlbnQgc3VjaCBhYnVzZXMuIE5ldmVydGhlbGVzcyx0aGUgZm9sbG93aW5nIHByb2dyYW0gaXMgbGVnYWw6Cn0KClxiZWdpbntkYXJ0Q29kZX0KXENMQVNTe30gSGlnaGx5U3RydW5nIFx7CiAgU3RyaW5nKCkgJD0+JCAiPyI7Clx9ClxlbmR7ZGFydENvZGV9CgpOYW1lcyBtYXkgYmUgaW50cm9kdWNlZCBpbnRvIGEgc2NvcGUgYnkgIGRlY2xhcmF0aW9ucyB3aXRoaW4gdGhlIHNjb3BlIG9yICBieSBvdGhlciBtZWNoYW5pc21zIHN1Y2ggYXMgaW1wb3J0cyBvciBpbmhlcml0YW5jZS4KClxyYXRpb25hbGV7ClRoZSBpbnRlcmFjdGlvbiBvZiBsZXhpY2FsIHNjb3BpbmcgYW5kIGluaGVyaXRhbmNlIGlzIGEgc3VidGxlIG9uZS4gIFVsdGltYXRlbHksIHRoZSBxdWVzdGlvbiBpcyB3aGV0aGVyIGxleGljYWwgc2NvcGluZyB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgaW5oZXJpdGFuY2Ugb3IgdmljZSB2ZXJzYS4gRGFydCBjaG9vc2VzIHRoZSBmb3JtZXIuCgpBbGxvd2luZyBpbmhlcml0ZWQgbmFtZXMgdG8gdGFrZSBwcmVjZWRlbmNlIG92ZXIgbG9jYWxseSBkZWNsYXJlZCBuYW1lcyBjYW4gY3JlYXRlIHVuZXhwZWN0ZWQgc2l0dWF0aW9ucyBhcyBjb2RlIGV2b2x2ZXMuIFNwZWNpZmljYWxseSwgdGhlIGJlaGF2aW9yIG9mIGNvZGUgaW4gYSBzdWJjbGFzcyBjYW4gY2hhbmdlIHdpdGhvdXQgd2FybmluZyAgaWYgYSBuZXcgbmFtZSBpcyBpbnRyb2R1Y2VkIGluIGEgc3VwZXJjbGFzcy4gIENvbnNpZGVyOgp9CgpcYmVnaW57ZGFydENvZGV9ClxMSUJSQVJZe30gTDE7ClxDTEFTU3t9IFMgXHtcfQoKXExJQlJBUll7fSBMMjsKXElNUE9SVHt9IGBMMS5kYXJ0JzsKZm9vKCkgPSQ+JCA0MjsKXENMQVNTe30gQyBcRVhURU5EU3t9IFNceyBiYXIoKSA9JD4kIGZvbygpO1x9ClxlbmR7ZGFydENvZGV9CgpccmF0aW9uYWxle05vdyBhc3N1bWUgYSBtZXRob2QgXGNvZGV7Zm9vKCl9IGlzIGFkZGVkIHRvIFxjb2Rle1N9LiB9CgpcYmVnaW57ZGFydENvZGV9ClxMSUJSQVJZe30gTDE7ClxDTEFTU3t9IFMgXHtmb28oKSA9JD4kIDkxO1x9ClxlbmR7ZGFydENvZGV9CgpccmF0aW9uYWxlewpJZiBpbmhlcml0YW5jZSB0b29rIHByZWNlZGVuY2Ugb3ZlciB0aGUgbGV4aWNhbCBzY29wZSwgdGhlIGJlaGF2aW9yIG9mIFxjb2Rle0N9IHdvdWxkIGNoYW5nZSBpbiBhbiB1bmV4cGVjdGVkIHdheS4gTmVpdGhlciB0aGUgYXV0aG9yIG9mIFxjb2Rle1N9IG5vciB0aGUgYXV0aG9yIG9mIFxjb2Rle0N9IGFyZSBuZWNlc3NhcmlseSBhd2FyZSBvZiB0aGlzLiBJbiBEYXJ0LCBpZiB0aGVyZSBpcyBhIGxleGljYWxseSB2aXNpYmxlIG1ldGhvZCBcY29kZXtmb28oKX0sIGl0IHdpbGwgYWx3YXlzIGJlIGNhbGxlZC4KCk5vdyBjb25zaWRlciB0aGUgb3Bwb3NpdGUgc2NlbmFyaW8uIFdlIHN0YXJ0IHdpdGggYSB2ZXJzaW9uIG9mIFxjb2Rle1N9IHRoYXQgY29udGFpbnMgXGNvZGV7Zm9vKCl9LCBidXQgZG8gbm90IGRlY2xhcmUgXGNvZGV7Zm9vKCl9IGluIGxpYnJhcnkgXGNvZGV7TDJ9LiAgQWdhaW4sIHRoZXJlIGlzIGEgY2hhbmdlIGluIGJlaGF2aW9yIC0gYnV0IHRoZSBhdXRob3Igb2YgXGNvZGV7TDJ9IGlzIHRoZSBvbmUgd2hvIGludHJvZHVjZWQgdGhlIGRpc2NyZXBhbmN5IHRoYXQgZWZmZWN0cyB0aGVpciBjb2RlLCBhbmQgdGhlIG5ldyBjb2RlIGlzIGxleGljYWxseSB2aXNpYmxlLiBCb3RoIHRoZXNlIGZhY3RvcnMgbWFrZSBpdCBtb3JlIGxpa2VseSB0aGF0IHRoZSBwcm9ibGVtIHdpbGwgYmUgZGV0ZWN0ZWQuCgpUaGVzZSBjb25zaWRlcmF0aW9ucyBiZWNvbWUgZXZlbiBtb3JlIGltcG9ydGFudCBpZiBvbmUgaW50cm9kdWNlcyBjb25zdHJ1Y3RzIHN1Y2ggYXMgbmVzdGVkIGNsYXNzZXMsIHdoaWNoIG1pZ2h0IGJlIGNvbnNpZGVyZWQgaW4gZnV0dXJlIHZlcnNpb25zIG9mIHRoZSBsYW5ndWFnZS4KCkdvb2QgdG9vbGluZyBzaG91bGQgb2YgY291cnNlIGVuZGVhdm9yIHRvIGluZm9ybSBwcm9ncmFtbWVycyBvZiBzdWNoIHNpdHVhdGlvbnMgKGRpc2NyZWV0bHkpLiBGb3IgZXhhbXBsZSwgYW4gaWRlbnRpZmllciB0aGF0IGlzIGJvdGggaW5oZXJpdGVkIGFuZCBsZXhpY2FsbHkgdmlzaWJsZSBjb3VsZCBiZSBoaWdobGlnaHRlZCAodmlhIHVuZGVybGluaW5nIG9yIGNvbG9yaXphdGlvbikuIEJldHRlciB5ZXQsIHRpZ2h0IGludGVncmF0aW9uIG9mIHNvdXJjZSBjb250cm9sIHdpdGggbGFuZ3VhZ2UgYXdhcmUgdG9vbHMgd291bGQgZGV0ZWN0IHN1Y2ggY2hhbmdlcyB3aGVuIHRoZXkgb2NjdXIuIAogCn0KCgoKClxzdWJzZWN0aW9ue1ByaXZhY3l9ClxsYWJlbHtwcml2YWN5fQoKRGFydCBzdXBwb3J0cyB0d28gbGV2ZWxzIG9mIHByaXZhY3k6IHtcZW0gcHVibGljfSBhbmQge1xlbSBwcml2YXRlfS4gIEEgZGVjbGFyYXRpb24gaXMge1xlbSBwcml2YXRlfSBpZmYgaXRzIG5hbWUgaXMgcHJpdmF0ZSwgb3RoZXJ3aXNlIGl0IGlzIHtcZW0gcHVibGljLn0gIEEgIG5hbWUgJHEkIGlzIHByaXZhdGUgaWZmIGFueSBvbmUgb2YgdGhlIGlkZW50aWZpZXJzIHRoYXQgY29tcHJpc2UgJHEkIGlzIHByaXZhdGUsICBvdGhlcndpc2UgaXQgaXMge1xlbSBwdWJsaWMufSAgQW4gaWRlbnRpZmllciBpcyBwcml2YXRlIGlmZiBpdApiZWdpbnMgd2l0aCBhbiB1bmRlcnNjb3JlICh0aGUgXF8gY2hhcmFjdGVyKSBvdGhlcndpc2UgaXQgaXMge1xlbSBwdWJsaWMufSAKCkEgZGVjbGFyYXRpb24gJG0kIGlzIHtcZW0gYWNjZXNzaWJsZSB0byBsaWJyYXJ5ICRMJH0gIGlmICRtJCBpcyBkZWNsYXJlZCBpbiAkTCQgb3IgaWYgJG0kIGlzIHB1YmxpYy4KClxjb21tZW50YXJ5ewpUaGlzIG1lYW5zIHByaXZhdGUgZGVjbGFyYXRpb25zIG1heSBvbmx5IGJlIGFjY2Vzc2VkIHdpdGhpbiB0aGUgbGlicmFyeSBpbiB3aGljaCB0aGV5IGFyZSBkZWNsYXJlZC4KfQoKUHJpdmFjeSBhcHBsaWVzIG9ubHkgdG8gZGVjbGFyYXRpb25zIHdpdGhpbiBhIGxpYnJhcnksIG5vdCB0byBsaWJyYXJ5IGRlY2xhcmF0aW9ucyB0aGVtc2VsdmVzLiAKClxyYXRpb25hbGV7TGlicmFyaWVzIGRvIG5vdCByZWZlcmVuY2UgZWFjaCBvdGhlciBieSBuYW1lIGFuZCBzbyB0aGUgaWRlYSBvZiBhIHByaXZhdGUgbGlicmFyeSBpcyBtZWFuaW5nbGVzcy4KVGh1cywgaWYgdGhlIG5hbWUgb2YgYSBsaWJyYXJ5IGJlZ2lucyB3aXRoIGFuIHVuZGVyc2NvcmUsIGl0IGhhcyBubyBlZmZlY3Qgb24gdGhlIGFjY2Vzc2liaWxpdHkgb2YgdGhlIGxpYnJhcnkgb3IgaXRzIG1lbWJlcnMuCn0KClxyYXRpb25hbGV7UHJpdmFjeSBpcywgYXQgdGhpcyBwb2ludCwgYSBzdGF0aWMgbm90aW9uIHRpZWQgdG8gYSBwYXJ0aWN1bGFyIHBpZWNlIG9mIGNvZGUgKGEgbGlicmFyeSkuIEl0IGlzIGRlc2lnbmVkIHRvIHN1cHBvcnQgc29mdHdhcmUgZW5naW5lZXJpbmcgY29uY2VybnMgcmF0aGVyIHRoYW4gc2VjdXJpdHkgY29uY2VybnMuIFVudHJ1c3RlZCBjb2RlIHNob3VsZCBhbHdheXMgcnVuIGluIGFuIGFub3RoZXIgaXNvbGF0ZS4gIEl0IGlzIHBvc3NpYmxlIHRoYXQgbGlicmFyaWVzIHdpbGwgYmVjb21lIGZpcnN0IGNsYXNzIG9iamVjdHMgYW5kIHByaXZhY3kgd2lsbCBiZSBhIGR5bmFtaWMgbm90aW9uIHRpZWQgdG8gYSBsaWJyYXJ5IGluc3RhbmNlLgoKUHJpdmFjeSBpcyBpbmRpY2F0ZWQgYnkgdGhlIG5hbWUgb2YgYSBkZWNsYXJhdGlvbiAtIGhlbmNlIHByaXZhY3kgYW5kIG5hbWluZyBhcmUgbm90IG9ydGhvZ29uYWwuIFRoaXMgaGFzIHRoZSBhZHZhbnRhZ2UgdGhhdCBib3RoIGh1bWFucyBhbmQgbWFjaGluZXMgY2FuIHJlY29nbml6ZSBhY2Nlc3MgdG8gcHJpdmF0ZSBkZWNsYXJhdGlvbnMgYXQgdGhlIHBvaW50IG9mIHVzZSB3aXRob3V0IGtub3dsZWRnZSBvZiB0aGUgY29udGV4dCBmcm9tIHdoaWNoIHRoZSBkZWNsYXJhdGlvbiBpcyBkZXJpdmVkLn0KClxzdWJzZWN0aW9ue0NvbmN1cnJlbmN5fQoKRGFydCBjb2RlIGlzIGFsd2F5cyBzaW5nbGUgdGhyZWFkZWQuIFRoZXJlIGlzIG5vIHNoYXJlZC1zdGF0ZSBjb25jdXJyZW5jeSBpbiBEYXJ0LiBDb25jdXJyZW5jeSBpcyBzdXBwb3J0ZWQgdmlhIGFjdG9yLWxpa2UgZW50aXRpZXMgY2FsbGVkIHtcZW0gaXNvbGF0ZXN9LgoKQW4gaXNvbGF0ZSBpcyBhIHVuaXQgb2YgY29uY3VycmVuY3kuIEl0IGhhcyBpdHMgb3duIG1lbW9yeSBhbmQgaXRzIG93biB0aHJlYWQgb2YgY29udHJvbC4gSXNvbGF0ZXMgY29tbXVuaWNhdGUgYnkgbWVzc2FnZSBwYXNzaW5nIChccmVme3NlbmRpbmdNZXNzYWdlc30pLiBObyBzdGF0ZSBpcyBldmVyIHNoYXJlZCBiZXR3ZWVuIGlzb2xhdGVzLiBJc29sYXRlcyBhcmUgY3JlYXRlZCBieSBzcGF3bmluZyAoXHJlZntzcGF3bmluZ0FuSXNvbGF0ZX0pLgoKClxzZWN0aW9ue0Vycm9ycyBhbmQgV2FybmluZ3N9ClxsYWJlbHtlcnJvcnNBbmRXYXJuaW5nc30KClRoaXMgc3BlY2lmaWNhdGlvbiBkaXN0aW5ndWlzaGVzIGJldHdlZW4gc2V2ZXJhbCBraW5kcyBvZiBlcnJvcnMuCgp7XGVtIENvbXBpbGUtdGltZSBlcnJvcnN9IGFyZSBlcnJvcnMgdGhhdCBwcmVjbHVkZSBleGVjdXRpb24uIEEgY29tcGlsZS10aW1lIGVycm9yIG11c3QgYmUgcmVwb3J0ZWQgYnkgYSBEYXJ0IGNvbXBpbGVyIGJlZm9yZSB0aGUgZXJyb25lb3VzIGNvZGUgaXMgZXhlY3V0ZWQuIAoKXHJhdGlvbmFsZXtBIERhcnQgaW1wbGVtZW50YXRpb24gaGFzIGNvbnNpZGVyYWJsZSBmcmVlZG9tIGFzIHRvIHdoZW4gY29tcGlsYXRpb24gdGFrZXMgcGxhY2UuIE1vZGVybiBwcm9ncmFtbWluZyBsYW5ndWFnZSBpbXBsZW1lbnRhdGlvbnMgb2Z0ZW4gaW50ZXJsZWF2ZSBjb21waWxhdGlvbiBhbmQgZXhlY3V0aW9uLCBzbyB0aGF0IGNvbXBpbGF0aW9uIG9mIGEgbWV0aG9kIG1heSBiZSBkZWxheWVkLCBlLmcuLCAgdW50aWwgaXQgaXMgZmlyc3QgaW52b2tlZC4gQ29uc2VxdWVudGx5LCBjb21waWxlLXRpbWUgZXJyb3JzIGluIGEgbWV0aG9kICRtJCBtYXkgYmUgcmVwb3J0ZWQgYXMgbGF0ZSBhcyB0aGUgdGltZSBvZiAkbSQncyBmaXJzdCBpbnZvY2F0aW9uLgoKQXMgYSB3ZWIgbGFuZ3VhZ2UsIERhcnQgaXMgb2Z0ZW4gbG9hZGVkIGRpcmVjdGx5IGZyb20gc291cmNlLCB3aXRoIG5vIGludGVybWVkaWF0ZSBiaW5hcnkgcmVwcmVzZW50YXRpb24uIEluIHRoZSBpbnRlcmVzdHMgb2YgcmFwaWQgbG9hZGluZywgRGFydCBpbXBsZW1lbnRhdGlvbnMgbWF5IGNob29zZSB0byBhdm9pZCBmdWxsIHBhcnNpbmcgb2YgbWV0aG9kIGJvZGllcywgZm9yIGV4YW1wbGUuIFRoaXMgY2FuIGJlIGRvbmUgYnkgdG9rZW5pemluZyB0aGUgaW5wdXQgYW5kIGNoZWNraW5nIGZvciBiYWxhbmNlZCBjdXJseSBicmFjZXMgb24gbWV0aG9kIGJvZHkgZW50cnkuIEluIHN1Y2ggYW4gaW1wbGVtZW50YXRpb24sIGV2ZW4gc3ludGF4IGVycm9ycyB3aWxsIGJlIGRldGVjdGVkIG9ubHkgd2hlbiB0aGUgbWV0aG9kIG5lZWRzIHRvIGJlIGV4ZWN1dGVkLCBhdCB3aGljaCB0aW1lIGl0IHdpbGwgYmUgY29tcGlsZWQgKEpJVGVkKS4KCkluIGEgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgYSBjb21waWxlciBzaG91bGQgb2YgY291cnNlIHJlcG9ydCBjb21waWxhdGlvbiBlcnJvcnMgZWFnZXJseSBzbyBhcyB0byAgYmVzdCBzZXJ2ZSB0aGUgcHJvZ3JhbW1lci4KfQoKSWYgYW4gdW5jYXVnaHQgY29tcGlsZS10aW1lIGVycm9yIG9jY3VycyB3aXRoaW4gdGhlIGNvZGUgb2YgYSBydW5uaW5nIGlzb2xhdGUgJEEkLCAkQSQgaXMgaW1tZWRpYXRlbHkgc3VzcGVuZGVkLiAgVGhlIG9ubHkgY2lyY3Vtc3RhbmNlIHdoZXJlIGEgY29tcGlsZS10aW1lIGVycm9yIGNvdWxkIGJlIGNhdWdodCB3b3VsZCBiZSB2aWEgY29kZSBydW4gcmVmbGVjdGl2ZWx5LCB3aGVyZSB0aGUgbWlycm9yIHN5c3RlbSBjYW4gY2F0Y2ggaXQuCgpccmF0aW9uYWxle1R5cGljYWxseSwgb25jZSBhIGNvbXBpbGUtdGltZSBlcnJvciBpcyB0aHJvd24gYW5kICRBJCBpcyBzdXNwZW5kZWQsICRBJCB3aWxsIHRoZW4gYmUgdGVybWluYXRlZC4gSG93ZXZlciwgdGhpcyBkZXBlbmRzIG9uIHRoZSBvdmVyYWxsIGVudmlyb25tZW50LiAKQSBEYXJ0IGVuZ2luZSBydW5zIGluIHRoZSBjb250ZXh0IG9mIGFuIHtcZW0gZW1iZWRkZXJ9LCAKYSBwcm9ncmFtIHRoYXQgaW50ZXJmYWNlcyBiZXR3ZWVuIHRoZSBlbmdpbmUgYW5kIHRoZSBzdXJyb3VuZGluZyBjb21wdXRpbmcgZW52aXJvbm1lbnQuIFRoZSBlbWJlZGRlciB3aWxsIG9mdGVuIGJlIGEgd2ViIGJyb3dzZXIsIGJ1dCBuZWVkIG5vdCBiZTsgaXQgbWF5IGJlIGEgQysrIHByb2dyYW0gb24gdGhlIHNlcnZlciBmb3IgZXhhbXBsZS4gV2hlbiBhbiBpc29sYXRlIGZhaWxzIHdpdGggYSBjb21waWxlLXRpbWUgZXJyb3IgYXMgZGVzY3JpYmVkIGFib3ZlLCBjb250cm9sIHJldHVybnMgdG8gdGhlIGVtYmVkZGVyLCBhbG9uZyB3aXRoIGFuIGV4Y2VwdGlvbiBkZXNjcmliaW5nIHRoZSBwcm9ibGVtLiAgVGhpcyBpcyBuZWNlc3Nhcnkgc28gdGhhdCB0aGUgZW1iZWRkZXIgY2FuIGNsZWFuIHVwIHJlc291cmNlcyBldGMuIEl0IGlzIHRoZW4gdGhlIGVtYmVkZGVyJ3MgZGVjaXNpb24gd2hldGhlciB0byB0ZXJtaW5hdGUgdGhlIGlzb2xhdGUgb3Igbm90Lgp9Cgp7XGVtIFN0YXRpYyAgd2FybmluZ3N9IGFyZSB0aG9zZSBlcnJvcnMgcmVwb3J0ZWQgYnkgdGhlIHN0YXRpYyBjaGVja2VyLiBUaGV5IGhhdmUgbm8gZWZmZWN0IG9uIGV4ZWN1dGlvbi4gTWFueSwgYnV0IG5vdCBhbGwsIHN0YXRpYyB3YXJuaW5ncyByZWxhdGUgdG8gdHlwZXMsIGluIHdoaWNoIGNhc2UgdGhleSBhcmUga25vd24gYXMge1xlbSBzdGF0aWMgdHlwZSB3YXJuaW5ncy59IFN0YXRpYyB3YXJuaW5ncyBtdXN0IGJlIHByb3ZpZGVkIGJ5IERhcnQgY29tcGlsZXJzIHVzZWQgZHVyaW5nIGRldmVsb3BtZW50IHN1Y2ggYXMgdGhvc2UgaW5jb3Jwb3JhdGVkIGluIElERXMgb3Igb3RoZXJ3aXNlIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgZGV2ZWxvcGVycyBmb3IgZGV2ZWxvcGluZyBjb2RlLiBDb21waWxlcnMgdGhhdCBhcmUgcGFydCBvZiBydW50aW1lIGV4ZWN1dGlvbiBlbnZpcm9ubWVudHMgc3VjaCBhcyB2aXJ0dWFsIG1hY2hpbmVzIHNob3VsZCBub3QgaXNzdWUgc3RhdGljIHdhcm5pbmdzLgoKe1xlbSBEeW5hbWljIHR5cGUgZXJyb3JzfSBhcmUgdHlwZSBlcnJvcnMgcmVwb3J0ZWQgaW4gY2hlY2tlZCBtb2RlLgoKe1xlbSBSdW4tdGltZSBlcnJvcnN9IGFyZSBleGNlcHRpb25zIHJhaXNlZCBkdXJpbmcgZXhlY3V0aW9uLiBXaGVuZXZlciB3ZSBzYXkgdGhhdCBhbiBleGNlcHRpb24gJGV4JCBpcyB7XGVtIHJhaXNlZH0gb3Ige1xlbSB0aHJvd259LCB3ZSBtZWFuIHRoYXQgYSB0aHJvdyBleHByZXNzaW9uICAoXHJlZnt0aHJvd30pIG9mIHRoZSBmb3JtOiBcY29kZXtcVEhST1d7fSAkZXgkO30gd2FzIGltcGxpY2l0bHkgZXZhbHVhdGVkIG9yIHRoYXQgYSByZXRocm93IHN0YXRlbWVudCAoXHJlZntyZXRocm93fSkgb2YgdGhlIGZvcm0gXGNvZGV7XFJFVEhST1d9IHdhcyBleGVjdXRlZC4gV2hlbiB3ZSBzYXkgdGhhdCB7XGVtIGF9ICRDJCB7XGVtIGlzIHRocm93bn0sIHdoZXJlICRDJCBpcyBhIGNsYXNzLCB3ZSBtZWFuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgY2xhc3MgJEMkIGlzIHRocm93bi4KCklmIGFuIHVuY2F1Z2h0IGV4Y2VwdGlvbiBpcyB0aHJvd24gYnkgYSBydW5uaW5nIGlzb2xhdGUgJEEkLCAkQSQgaXMgaW1tZWRpYXRlbHkgc3VzcGVuZGVkLiAKCgpcc2VjdGlvbntWYXJpYWJsZXN9ClxsYWJlbHt2YXJpYWJsZXN9CgpWYXJpYWJsZXMgYXJlIHN0b3JhZ2UgbG9jYXRpb25zIGluIG1lbW9yeS4gIAoKXGJlZ2lue2dyYW1tYXJ9CntcYmYgdmFyaWFibGVEZWNsYXJhdGlvbjp9CiAgICAgIGRlY2xhcmVkSWRlbnRpZmllciAoYCwnIGlkZW50aWZpZXIpKgogICAgICAuCiAgICAgIAp7XGJmIGRlY2xhcmVkSWRlbnRpZmllcjp9CiAgICAgIG1ldGFkYXRhIGZpbmFsQ29uc3RWYXJPclR5cGUgaWRlbnRpZmllcgogICAgLgoKe1xiZiBmaW5hbENvbnN0VmFyT3JUeXBlOn1cRklOQUx7fSB0eXBlPzsKICAgICAgICAgICBcQ09OU1R7fSB0eXBlPzsKCXZhck9yVHlwZQogICAgLgogICAgCiB7XGJmIHZhck9yVHlwZTp9XFZBUnt9OwoJdHlwZQogICAgLgoKIHtcYmYgaW5pdGlhbGl6ZWRWYXJpYWJsZURlY2xhcmF0aW9uOn0KICAgICAgZGVjbGFyZWRJZGVudGlmaWVyIChgPScgZXhwcmVzc2lvbik/IChgLCcgaW5pdGlhbGl6ZWRJZGVudGlmaWVyKSogJSBjb3VsZCBkbyB0b3AgbGV2ZWwgaGVyZQogICAgLgoKe1xiZiBpbml0aWFsaXplZElkZW50aWZpZXI6fQogICAgICBpZGVudGlmaWVyIChgPScgZXhwcmVzc2lvbik/ICUgY291bGQgZG8gdG9wLWxldmVsIGhlcmUKICAgIC4KICAgIAp7XGJmIGluaXRpYWxpemVkSWRlbnRpZmllckxpc3Q6fQogICAgICBpbml0aWFsaXplZElkZW50aWZpZXIgKGAsJyBpbml0aWFsaXplZElkZW50aWZpZXIpKgogICAgLgoKCgoKICBcZW5ke2dyYW1tYXJ9CgpBIHZhcmlhYmxlIHRoYXQgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIGhhcyB0aGUgaW5pdGlhbCB2YWx1ZSBcTlVMTHt9IChccmVme251bGx9KS4KCkEgdmFyaWFibGUgZGVjbGFyZWQgYXQgdGhlIHRvcC1sZXZlbCBvZiBhIGxpYnJhcnkgaXMgcmVmZXJyZWQgdG8gYXMgZWl0aGVyIGEge1xlbSBsaWJyYXJ5IHZhcmlhYmxlfSBvciBzaW1wbHkgYSB0b3AtbGV2ZWwgdmFyaWFibGUuIAoKQSB7XGVtIHN0YXRpYyB2YXJpYWJsZX0gaXMgYSB2YXJpYWJsZSB0aGF0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIGluc3RhbmNlLCBidXQgcmF0aGVyIHdpdGggYW4gZW50aXJlIGxpYnJhcnkgb3IgY2xhc3MuICBTdGF0aWMgdmFyaWFibGVzIGluY2x1ZGUgbGlicmFyeSB2YXJpYWJsZXMgYW5kIGNsYXNzIHZhcmlhYmxlcy4gQ2xhc3MgdmFyaWFibGVzIGFyZSB2YXJpYWJsZXMgd2hvc2UgZGVjbGFyYXRpb24gaXMgaW1tZWRpYXRlbHkgbmVzdGVkIGluc2lkZSBhIGNsYXNzIGRlY2xhcmF0aW9uIGFuZCBpbmNsdWRlcyB0aGUgbW9kaWZpZXIgXFNUQVRJQ3t9LiBBIGxpYnJhcnkgdmFyaWFibGUgaXMgaW1wbGljaXRseSBzdGF0aWMuIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIHRvIHByZWZhY2UgYSB0b3AtbGV2ZWwgdmFyaWFibGUgZGVjbGFyYXRpb24gd2l0aCB0aGUgYnVpbHQtaW4gaWRlbnRpZmllciAgKFxyZWZ7aWRlbnRpZmllclJlZmVyZW5jZX0pIFxTVEFUSUN7fS4gIAoKU3RhdGljIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBhcmUgaW5pdGlhbGl6ZWQgbGF6aWx5LiBXaGVuIGEgc3RhdGljIHZhcmlhYmxlICR2JCBpcyByZWFkLCBpZmYgaXQgaGFzIG5vdCB5ZXQgYmVlbiBhc3NpZ25lZCwgIGl0IGlzIHNldCB0byB0aGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgaXRzIGluaXRpYWxpemVyLiBUaGUgcHJlY2lzZSBydWxlcyBhcmUgZ2l2ZW4gaW4gc2VjdGlvbiBccmVme2V2YWx1YXRpb25PZkltcGxpY2l0VmFyaWFibGVHZXR0ZXJzfS4gCgpccmF0aW9uYWxle1RoZSBsYXp5IHNlbWFudGljcyBhcmUgZ2l2ZW4gYmVjYXVzZSB3ZSBkbyBub3Qgd2FudCBhIGxhbmd1YWdlIHdoZXJlIG9uZSB0ZW5kcyB0byBkZWZpbmUgZXhwZW5zaXZlIGluaXRpYWxpemF0aW9uIGNvbXB1dGF0aW9ucywgY2F1c2luZyBsb25nIGFwcGxpY2F0aW9uIHN0YXJ0dXAgdGltZXMuIFRoaXMgaXMgZXNwZWNpYWxseSBjcnVjaWFsIGZvciBEYXJ0LCB3aGljaCBtdXN0IHN1cHBvcnQgdGhlIGNvZGluZyBvZiAgY2xpZW50IGFwcGxpY2F0aW9ucy4KfQoKQSB7XGVtIGZpbmFsIHZhcmlhYmxlfSBpcyBhIHZhcmlhYmxlIHdob3NlIGJpbmRpbmcgaXMgZml4ZWQgdXBvbiBpbml0aWFsaXphdGlvbjsgYSBmaW5hbCB2YXJpYWJsZSAkdiQgd2lsbCBhbHdheXMgcmVmZXIgdG8gdGhlIHNhbWUgb2JqZWN0IGFmdGVyICR2JCBoYXMgYmVlbiBpbml0aWFsaXplZC4gVGhlIGRlY2xhcmF0aW9uIG9mIGEgZmluYWwgdmFyaWFibGUgbXVzdCAgaW5jbHVkZSB0aGUgbW9kaWZpZXIgXEZJTkFMe30uIAoKSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiBhIGZpbmFsIGluc3RhbmNlIHZhcmlhYmxlIHRoYXQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYXQgaXRzIHBvaW50IG9mIGRlY2xhcmF0aW9uICBpcyAgYWxzbyBpbml0aWFsaXplZCBpbiBhIGNvbnN0cnVjdG9yLiAKJSBJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmIGEgZmluYWwgaW5zdGFuY2UgdmFyaWFibGUgdGhhdCBoYXMgYmVlbiBpbml0aWFsaXplZCBieSBtZWFucyBvZiBhbiBpbml0aWFsaXppbmcgZm9ybWFsIG9mIGEgY29uc3RydWN0b3IgaXMgIGFsc28gaW5pdGlhbGl6ZWQgZWxzZXdoZXJlIGluIHRoZSBzYW1lIGNvbnN0cnVjdG9yLgpJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBhIGxvY2FsIHZhcmlhYmxlICR2JCBpcyBmaW5hbCBhbmQgJHYkIGlzIG5vdCBpbml0aWFsaXplZCBhdCBpdHMgcG9pbnQgb2YgZGVjbGFyYXRpb24uCgpcY29tbWVudGFyeXsKCkEgbGlicmFyeSBvciBzdGF0aWMgdmFyaWFibGUgaXMgZ3VhcmFudGVlZCB0byBoYXZlIGFuIGluaXRpYWxpemVyIGF0IGl0cyBkZWNsYXJhdGlvbiBieSB0aGUgZ3JhbW1hci4KCkF0dGVtcHRpbmcgdG8gYXNzaWduIHRvIGEgZmluYWwgdmFyaWFibGUgYW55d2hlcmUgZXhjZXB0IGluIGl0cyBkZWNsYXJhdGlvbiBvciBpbiBhIGNvbnN0cnVjdG9yIGhlYWRlciAgd2lsbCBjYXVzZSBhIHJ1bnRpbWUgZXJyb3IgdG8gYmUgdGhyb3duIGFzIGRpc2N1c3NlZCBiZWxvdy4gVGhlIGFzc2lnbm1lbnQgd2lsbCBhbHNvIGdpdmUgcmlzZSB0byBhIHN0YXRpYyB3YXJuaW5nLiBBbnkgcmVwZWF0ZWQgYXNzaWdubWVudCB0byBhIGZpbmFsIHZhcmlhYmxlIHdpbGwgYWxzbyBsZWFkIHRvIGEgcnVudGltZSBlcnJvci4KClRha2VuIGFzIGEgd2hvbGUsIHRoZSBydWxlcyBlbnN1cmUgdGhhdCBhbnkgYXR0ZW1wdCB0byBleGVjdXRlIG11bHRpcGxlIGFzc2lnbm1lbnRzIHRvIGEgZmluYWwgdmFyaWFibGUgd2lsbCB5aWVsZCBzdGF0aWMgd2FybmluZ3MgYW5kIHJlcGVhdGVkIGFzc2lnbm1lbnRzIHdpbGwgZmFpbCBkeW5hbWljYWxseS4KfQoKQSB7XGVtIGNvbnN0YW50IHZhcmlhYmxlfSBpcyBhIHZhcmlhYmxlIHdob3NlIGRlY2xhcmF0aW9uIGluY2x1ZGVzIHRoZSBtb2RpZmllciBcQ09OU1R7fS4gQSBjb25zdGFudCB2YXJpYWJsZSBpcyBhbHdheXMgaW1wbGljaXRseSBmaW5hbC4gQSBjb25zdGFudCB2YXJpYWJsZSBtdXN0IGJlIGluaXRpYWxpemVkIHRvIGEgY29tcGlsZS10aW1lIGNvbnN0YW50IChccmVme2NvbnN0YW50c30pIG9yIGEgY29tcGlsZS10aW1lIGVycm9yIG9jY3Vycy4KCldlIHNheSB0aGF0IGEgdmFyaWFibGUgJHYkIGlzIHtcZW0gcG90ZW50aWFsbHkgbXV0YXRlZH0gaW4gc29tZSBzY29wZSAkcyQgaWYgJHYkIGlzIG5vdCBmaW5hbCBvciBjb25zdGFudCBhbmQgYW4gYXNzaWdubWVudCB0byAkdiQgb2NjdXJzIGluICRzJC4KCklmIGEgdmFyaWFibGUgZGVjbGFyYXRpb24gZG9lcyBub3QgZXhwbGljaXRseSBzcGVjaWZ5IGEgdHlwZSwgdGhlIHR5cGUgb2YgdGhlIGRlY2xhcmVkIHZhcmlhYmxlKHMpIGlzICBcRFlOQU1JQ3t9LCB0aGUgdW5rbm93biB0eXBlIChccmVme3R5cGVEeW5hbWljfSkuIAoKQSB2YXJpYWJsZSBpcyB7XGVtIG11dGFibGV9IGlmIGl0IGlzIG5vdCBmaW5hbC4KU3RhdGljIGFuZCBpbnN0YW5jZSB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgYWx3YXlzIGluZHVjZSBpbXBsaWNpdCBnZXR0ZXJzLiBJZiB0aGUgdmFyaWFibGUgaXMgbXV0YWJsZSBpdCBhbHNvIGludHJvZHVjZXMgYW4gaW1wbGljaXQgc2V0dGVyLgpUaGUgc2NvcGUgaW50byB3aGljaCB0aGUgaW1wbGljaXQgZ2V0dGVycyBhbmQgc2V0dGVycyBhcmUgaW50cm9kdWNlZCBkZXBlbmRzIG9uIHRoZSBraW5kIG9mIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGludm9sdmVkLiAKCkEgbGlicmFyeSB2YXJpYWJsZSBpbnRyb2R1Y2VzIGEgZ2V0dGVyIGludG8gdGhlIHRvcCBsZXZlbCBzY29wZSBvZiB0aGUgZW5jbG9zaW5nIGxpYnJhcnkuIEEgc3RhdGljIGNsYXNzIHZhcmlhYmxlIGludHJvZHVjZXMgYSBzdGF0aWMgZ2V0dGVyIGludG8gdGhlIGltbWVkaWF0ZWx5IGVuY2xvc2luZyBjbGFzcy4gQW4gaW5zdGFuY2UgdmFyaWFibGUgaW50cm9kdWNlcyBhbiBpbnN0YW5jZSBnZXR0ZXIgaW50byB0aGUgaW1tZWRpYXRlbHkgZW5jbG9zaW5nIGNsYXNzLiAKCkEgbXV0YWJsZSBsaWJyYXJ5IHZhcmlhYmxlIGludHJvZHVjZXMgYSBzZXR0ZXIgaW50byB0aGUgdG9wIGxldmVsIHNjb3BlIG9mIHRoZSBlbmNsb3NpbmcgbGlicmFyeS4gQSBtdXRhYmxlIHN0YXRpYyBjbGFzcyB2YXJpYWJsZSBpbnRyb2R1Y2VzIGEgc3RhdGljIHNldHRlciBpbnRvIHRoZSBpbW1lZGlhdGVseSBlbmNsb3NpbmcgY2xhc3MuIEEgbXV0YWJsZSBpbnN0YW5jZSB2YXJpYWJsZSBpbnRyb2R1Y2VzIGFuIGluc3RhbmNlIHNldHRlciBpbnRvIHRoZSBpbW1lZGlhdGVseSBlbmNsb3NpbmcgY2xhc3MuIAoKTG9jYWwgdmFyaWFibGVzIGFyZSBhZGRlZCB0byB0aGUgaW5uZXJtb3N0IGVuY2xvc2luZyBzY29wZS4gIFRoZXkgZG8gbm90IGluZHVjZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzLiAgQSBsb2NhbCB2YXJpYWJsZSBtYXkgb25seSBiZSByZWZlcmVuY2VkIGF0IGEgc291cmNlIGNvZGUgbG9jYXRpb24gdGhhdCBpcyBhZnRlciBpdHMgaW5pdGlhbGl6ZXIsIGlmIGFueSwgaXMgY29tcGxldGUsIG9yIGEgY29tcGlsZS10aW1lIGVycm9yIG9jY3Vycy4gIFRoZSBlcnJvciBtYXkgYmUgcmVwb3J0ZWQgZWl0aGVyIGF0IHRoZSBwb2ludCB3aGVyZSB0aGUgcHJlbWF0dXJlIHJlZmVyZW5jZSBvY2N1cnMsIG9yIGF0IHRoZSB2YXJpYWJsZSBkZWNsYXJhdGlvbi4KClxyYXRpb25hbGUgewpXZSBhbGxvdyB0aGUgZXJyb3IgdG8gYmUgcmVwb3J0ZWQgYXQgdGhlIGRlY2xhcmF0aW9uIHRvIGFsbG93IGltcGxlbWVudGF0aW9ucyB0byBhdm9pZCBhbiBleHRyYSBwcm9jZXNzaW5nIHBoYXNlLiAKfQoKXGNvbW1lbnRhcnl7ClRoZSBleGFtcGxlIGJlbG93IGlsbHVzdHJhdGVzIHRoZSBleHBlY3RlZCBiZWhhdmlvci4gIEEgdmFyaWFibGUgJHgkIGlzIGRlY2xhcmVkIGF0IHRoZSBsaWJyYXJ5IGxldmVsLCBhbmQgYW5vdGhlciAkeCQgaXMgZGVjbGFyZWQgaW5zaWRlIHRoZSBmdW5jdGlvbiAkZiQuCn0KClxiZWdpbntkYXJ0Q29kZX0KXFZBUnt9IHggPSAwOwoKZih5KSBcewogIFxWQVJ7fSB6ID0geDsgLy8gY29tcGlsZS10aW1lIGVycm9yIAogIGlmICh5KSBcewogICAgeCA9IHggKyAxOyAvLyB0d28gY29tcGlsZSB0aW1lIGVycm9ycwogICAgcHJpbnQoeCk7IC8vIGNvbXBpbGUgdGltZSBlcnJvcgogIFx9CiBcVkFSe30geCA9IHgrKzsgLy8gY29tcGlsZSB0aW1lIGVycm9yCiBwcmludCh4KTsKXH0KXGVuZHtkYXJ0Q29kZX0KClxjb21tZW50YXJ5ewpUaGUgZGVjbGFyYXRpb24gaW5zaWRlICRmJCBoaWRlcyB0aGUgZW5jbG9zaW5nIG9uZS4gIFNvIGFsbCByZWZlcmVuY2VzIHRvICR4JCBpbnNpZGUgJGYkIHJlZmVyIHRvIHRoZSBpbm5lciBkZWNsYXJhdGlvbiBvZiAkeCQuIEhvd2V2ZXIsIG1hbnkgb2YgdGhlc2UgcmVmZXJlbmNlcyBhcmUgaWxsZWdhbCwgYmVjYXVzZSB0aGV5IGFwcGVhciBiZWZvcmUgdGhlIGRlY2xhcmF0aW9uLiBUaGUgYXNzaWdubWVudCB0byAkeiQgaXMgb25lIHN1Y2ggY2FzZS4gVGhlIGFzc2lnbm1lbnQgdG8gJHgkIGluIHRoZSBcSUZ7fSBzdGF0ZW1lbnQgc3VmZmVycyBmcm9tIG11bHRpcGxlIHByb2JsZW1zLiBUaGUgcmlnaHQgaGFuZCBzaWRlIHJlYWRzICR4JCBiZWZvcmUgaXRzIGRlY2xhcmF0aW9uLCBhbmQgdGhlIGxlZnQgaGFuZCBzaWRlIGFzc2lnbnMgdG8gJHgkIGJlZm9yZSBpdHMgZGVjbGFyYXRpb24uIEVhY2ggb2YgdGhlc2UgYXJlLCBpbmRlcGVuZGVudGx5LCBjb21waWxlIHRpbWUgZXJyb3JzLiAgVGhlIHByaW50IHN0YXRlbWVudCBpbnNpZGUgdGhlIFxJRnt9IGlzIGFsc28gaWxsZWdhbC4KClRoZSBpbm5lciBkZWNsYXJhdGlvbiBvZiAkeCQgaXMgaXRzZWxmIGVycm9uZW91cyBiZWNhdXNlIGl0cyByaWdodCBoYW5kIHNpZGUgYXR0ZW1wdHMgdG8gcmVhZCAkeCQgYmVmb3JlIHRoZSBkZWNsYXJhdGlvbiBoYXMgdGVybWluYXRlZC4gIFRoZSBsZWZ0IGhhbmQgc2lkZSBpcyBub3QsIHRlY2huaWNhbGx5LCBhIHJlZmVyZW5jZSBvciBhbiBhc3NpZ25tZW50IGJ1dCBhIGRlY2xhcmF0aW9uIGFuZCBzbyBpcyBsZWdhbC4gIFRoZSBsYXN0IHByaW50IHN0YXRlbWVudCBpcyBwZXJmZWN0bHkgbGVnYWwgYXMgd2VsbC4KfQoKXGNvbW1lbnRhcnkgewpBcyBhbm90aGVyIGV4YW1wbGUgIFxjb2Rle1xWQVJ7fSB4ID0gMywgeSA9IHg7fSBpcyBsZWdhbCwgYmVjYXVzZSBcY29kZXt4fSBpcyByZWZlcmVuY2VkIGFmdGVyIGl0cyBpbml0aWFsaXplci4gCgpBIHBhcnRpY3VsYXJseSBwZXJ2ZXJzZSBleGFtcGxlIGludm9sdmVzIGEgbG9jYWwgdmFyaWFibGUgbmFtZSBzaGFkb3dpbmcgYSB0eXBlLiBUaGlzIGlzIHBvc3NpYmxlIGJlY2F1c2UgRGFydCBoYXMgYSBzaW5nbGUgbmFtZXNwYWNlIGZvciB0eXBlcywgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMuCn0KClxiZWdpbntkYXJ0Q29kZX0KXENMQVNTe30gQyBce1x9CnBlcnZlcnNlKCkgXHsKICAgXFZBUnt9IHYgPSBcTkVXe30gQygpOyAvLyBjb21waWxlLXRpbWUgZXJyb3IKICAgQyBhQzsgLy8gY29tcGlsZS10aW1lIGVycm9yCiAgIFxWQVJ7fSBDID0gMTA7Clx9CgpcY29tbWVudGFyeSB7CiBJbnNpZGUgXGNke3BlcnZlcnNlKCl9LCBcY2R7Q30gZGVub3RlcyBhIGxvY2FsIHZhcmlhYmxlLiBUaGUgdHlwZSBcY2R7Q30gaXMgaGlkZGVuIGJ5IHRoZSB2YXJpYWJsZSBvZiB0aGUgc2FtZSBuYW1lLiBUaGUgYXR0ZW1wdCB0byBpbnN0YW50aWF0ZSBcY2R7Q30gY2F1c2VzIGEgY29tcGlsZS10aW1lIGVycm9yIGJlY2F1c2UgaXQgcmVmZXJlbmNlcyBhIGxvY2FsIHZhcmlhYmxlIHByaW9yIHRvIGl0cyBkZWNsYXJhdGlvbi4gU2ltaWxhcmx5LCBmb3IgdGhlIGRlY2xhcmF0aW9uIG9mIFxjZHthQ30gKGV2ZW4gdGhvdWdoIGl0IGlzIG9ubHkgYSB0eXBlIGFubm90YXRpb24pLgp9CgpccmF0aW9uYWxlewpBcyBhIHJ1bGUsIHR5cGUgYW5ub3RhdGlvbnMgYXJlIGlnbm9yZWQgaW4gcHJvZHVjdGlvbiBtb2RlLiBIb3dldmVyLCB3ZSBkbyAKIG5vdCB3YW50IHRvIGFsbG93IHByb2dyYW1zIHRvIGNvbXBpbGUgbGVnYWxseSBpbiBvbmUgbW9kZSBhbmQgbm90IGFub3RoZXIsIGFuZCBpbiB0aGlzIGV4dHJlbWVseSBvZGQgc2l0dWF0aW9uLCB0aGF0IGNvbnNpZGVyYXRpb24gdGFrZXMgcHJlY2VkZW5jZS4KfQoKXGVuZHtkYXJ0Q29kZX0KCiUgdGhlIGdyYW1tYXIgZG9lcyBub3Qgc3VwcG9ydCBsb2NhbCBnZXR0ZXJzIGFuZCBzZXR0ZXJzLiBUaGUgbG9jYWwgdmFyIGRpc2N1c3Npb24gZG9lcyBub3Qgc2VlbSB0byBtZW50aW9uIGdldHRlcnMgYW5kIHNldHRlcnMgYmFzZWQgc2VtYW50aWNzLiBJdCBzaW1wbHkgZGlzY3Vzc2VzIHRoZSBjcmVhdGlvbiBvZiB0aGUgdmFyaWFibGUsIG5vdCBpdHMgYWNjZXNzLiBBY2Nlc3MgaXMgZWl0aGVyIGFzc2lnbm1lbnQgb3IgaWRlbnRpZmllcnMuIElkZW50aWZpZXJzIGlnbm9yZSB0aGUgZ2V0dGVyIHN0b3J5LiAKClRoZSBmb2xsb3dpbmcgcnVsZXMgYXBwbHkgdG8gYWxsIHN0YXRpYyBhbmQgaW5zdGFuY2UgdmFyaWFibGVzLgoKQSAgdmFyaWFibGUgZGVjbGFyYXRpb24gIG9mIG9uZSBvZiB0aGUgZm9ybXMgXGNvZGV7JFQkICR2JDt9LCAgXGNvZGV7JFQkICR2JCA9ICRlJDt9ICwgIFxjb2Rle1xDT05TVHt9ICRUJCAkdiQgPSAkZSQ7fSwgXGNvZGV7XEZJTkFMe30gJFQkICR2JDt9ICBvciBcY29kZXtcRklOQUx7fSAkVCQgJHYkID0gJGUkO30gYWx3YXlzIGluZHVjZXMgYW4gaW1wbGljaXQgIGdldHRlciBmdW5jdGlvbiAoXHJlZntnZXR0ZXJzfSkgd2l0aCBzaWduYXR1cmUgCgokVCQgXEdFVHt9ICR2JAoKd2hvc2UgaW52b2NhdGlvbiBldmFsdWF0ZXMgYXMgZGVzY3JpYmVkIGJlbG93IChccmVme2V2YWx1YXRpb25PZkltcGxpY2l0VmFyaWFibGVHZXR0ZXJzfSkuCgoKQSAgdmFyaWFibGUgZGVjbGFyYXRpb24gIG9mIG9uZSBvZiB0aGUgZm9ybXMgXGNvZGV7XFZBUnt9ICR2JDt9LCAgXGNvZGV7XFZBUnt9ICR2JCA9ICRlJDt9ICwgIFxjb2Rle1xDT05TVHt9ICR2JCA9ICRlJDt9LCBcY29kZXtcRklOQUx7fSAkdiQ7fSBvciBcY29kZXtcRklOQUx7fSAgJHYkID0gJGUkO30gIGFsd2F5cyBpbmR1Y2VzIGFuIGltcGxpY2l0ICBnZXR0ZXIgZnVuY3Rpb24gd2l0aCBzaWduYXR1cmUgCgogXEdFVHt9ICR2JAoKd2hvc2UgIGludm9jYXRpb24gZXZhbHVhdGVzIGFzIGRlc2NyaWJlZCBiZWxvdyAoXHJlZntldmFsdWF0aW9uT2ZJbXBsaWNpdFZhcmlhYmxlR2V0dGVyc30pLgoKQSBub24tZmluYWwgIHZhcmlhYmxlIGRlY2xhcmF0aW9uICBvZiB0aGUgZm9ybSBcY29kZXt7fSAkVCQgJHYkO30gb3IgdGhlIGZvcm0gIFxjb2RleyRUJCAkdiQgPSAkZSQ7fSAgIGFsd2F5cyBpbmR1Y2VzIGFuIGltcGxpY2l0ICBzZXR0ZXIgZnVuY3Rpb24gKFxyZWZ7c2V0dGVyc30pIHdpdGggc2lnbmF0dXJlIAoKIFxWT0lEe30gXFNFVHt9ICR2PShUJCAkeCkkCgp3aG9zZSBleGVjdXRpb24gc2V0cyB0aGUgdmFsdWUgb2YgJHYkIHRvIHRoZSBpbmNvbWluZyBhcmd1bWVudCAkeCQuCgpBICBub24tZmluYWwgdmFyaWFibGUgZGVjbGFyYXRpb24gIG9mIHRoZSBmb3JtIFxjb2Rle1xWQVJ7fSAkdiQ7fSBvciB0aGUgZm9ybSAgXGNvZGV7XFZBUnt9ICR2JCA9ICRlJDt9ICAgYWx3YXlzIGluZHVjZXMgYW4gaW1wbGljaXQgIHNldHRlciBmdW5jdGlvbiB3aXRoIHNpZ25hdHVyZSAKClxTRVR7fSAkdj0oeCkkCgp3aG9zZSBleGVjdXRpb24gc2V0cyB0aGUgdmFsdWUgb2YgJHYkIHRvIHRoZSBpbmNvbWluZyBhcmd1bWVudCAkeCQuCgoKXHN1YnNlY3Rpb257RXZhbHVhdGlvbiBvZiBJbXBsaWNpdCAgVmFyaWFibGUgR2V0dGVyc30KXGxhYmVse2V2YWx1YXRpb25PZkltcGxpY2l0VmFyaWFibGVHZXR0ZXJzfQoKTGV0ICRkJCBiZSB0aGUgZGVjbGFyYXRpb24gb2YgYSBzdGF0aWMgb3IgaW5zdGFuY2UgdmFyaWFibGUgJHYkLiAgSWYgJGQkIGlzIGFuIGluc3RhbmNlIHZhcmlhYmxlLCB0aGVuIHRoZSBpbnZvY2F0aW9uIG9mIHRoZSBpbXBsaWNpdCBnZXR0ZXIgIG9mICR2JCBldmFsdWF0ZXMgdG8gdGhlIHZhbHVlIHN0b3JlZCBpbiAkdiQuCklmICRkJCBpcyBhIHN0YXRpYyBvciBsaWJyYXJ5IHZhcmlhYmxlIHRoZW4gdGhlIGltcGxpY2l0IGdldHRlciBtZXRob2Qgb2YgJHYkIGV4ZWN1dGVzIGFzIGZvbGxvd3M6IApcYmVnaW57aXRlbWl6ZX0KXGl0ZW0ge1xiZiBOb24tY29uc3RhbnQgdmFyaWFibGUgZGVjbGFyYXRpb24gd2l0aCBpbml0aWFsaXplcn0uIElmICRkJCBpcyBvZiBvbmUgb2YgdGhlIGZvcm1zIFxjb2Rle1xWQVJ7fSAkdiQgPSAkZSQ7fSAsICBcY29kZXskVCQgJHYkID0gJGUkO30gLCAgIFxjb2Rle1xGSU5BTHt9ICR2JCA9ICRlJDt9ICwgIFxjb2Rle1xGSU5BTHt9ICRUJCAkdiQgPSAkZSQ7fSwgXGNvZGV7XFNUQVRJQ3t9ICR2JCA9ICRlJDsgfSwgXGNvZGV7XFNUQVRJQ3t9ICRUJCAkdiQgPSAkZSQ7IH0sIFxjb2Rle1xTVEFUSUN7fSBcRklOQUx7fSAkdiQgPSAkZSQ7IH0gb3IgXGNvZGV7XFNUQVRJQ3t9IFxGSU5BTHt9ICRUJCAkdiQgPSAkZSQ7fSBhbmQgbm8gdmFsdWUgaGFzIHlldCBiZWVuIHN0b3JlZCBpbnRvICR2JCB0aGVuIHRoZSBpbml0aWFsaXplciBleHByZXNzaW9uICRlJCBpcyBldmFsdWF0ZWQuIElmLCBkdXJpbmcgdGhlIGV2YWx1YXRpb24gb2YgJGUkLCB0aGUgZ2V0dGVyIGZvciAkdiQgaXMgaW52b2tlZCwgYSBcY29kZXtDeWNsaWNJbml0aWFsaXphdGlvbkVycm9yfSBpcyB0aHJvd24uIElmIHRoZSBldmFsdWF0aW9uIHN1Y2NlZWRlZCB5aWVsZGluZyBhbiBvYmplY3QgJG8kLCBsZXQgJHIgPSBvJCwgb3RoZXJ3aXNlIGxldCAkciA9IFxOVUxMe30kLiBJbiBhbnkgY2FzZSwgJHIkIGlzIHN0b3JlZCBpbnRvICR2JC4gVGhlIHJlc3VsdCBvZiBleGVjdXRpbmcgdGhlIGdldHRlciBpcyAkciQuIApcaXRlbSAge1xiZiBDb25zdGFudCB2YXJpYWJsZSBkZWNsYXJhdGlvbn0uIElmICRkJCBpcyBvZiBvbmUgb2YgdGhlIGZvcm1zIFxjb2Rle1xDT05TVHt9ICR2JCA9ICRlJDsgfSAsICBcY29kZXtcQ09OU1R7fSAkVCQgICR2JCA9ICRlJDsgfSwgIFxjb2Rle1xTVEFUSUN7fSBcQ09OU1R7fSAkdiQgPSAkZSQ7IH0gIG9yIFxjb2Rle1xTVEFUSUN7fSBcQ09OU1R7fSAkVCQgJHYkID0gJGUkO30gdGhlIHJlc3VsdCBvZiB0aGUgZ2V0dGVyIGlzIHRoZSB2YWx1ZSBvZiB0aGUgY29tcGlsZSB0aW1lIGNvbnN0YW50ICRlJC4gXGNvbW1lbnRhcnl7Tm90ZSB0aGF0IGEgY29tcGlsZSB0aW1lIGNvbnN0YW50IGNhbm5vdCBkZXBlbmQgb24gaXRzZWxmLCBzbyBubyBjeWNsaWMgcmVmZXJlbmNlcyBjYW4gb2NjdXIufSAKT3RoZXJ3aXNlClxpdGVtIHtcYmYgVmFyaWFibGUgZGVjbGFyYXRpb24gd2l0aG91dCBpbml0aWFsaXplcn0uIFRoZSByZXN1bHQgb2YgZXhlY3V0aW5nIHRoZSBnZXR0ZXIgbWV0aG9kIGlzIHRoZSB2YWx1ZSBzdG9yZWQgaW4gJHYkLiAgClxlbmR7aXRlbWl6ZX0KCgoKCgpcc2VjdGlvbntGdW5jdGlvbnN9ClxsYWJlbHtmdW5jdGlvbnN9CgpGdW5jdGlvbnMgYWJzdHJhY3Qgb3ZlciBleGVjdXRhYmxlIGFjdGlvbnMuCgpcYmVnaW57Z3JhbW1hcn0Ke1xiZiBmdW5jdGlvblNpZ25hdHVyZTp9CiAgICBtZXRhZGF0YSByZXR1cm5UeXBlPyBpZGVudGlmaWVyIGZvcm1hbFBhcmFtZXRlckxpc3QKICAgIC4KICAgIAp7XGJmIHJldHVyblR5cGU6fQogICAgICBcVk9JRHt9OwogICAgICB0eXBlCiAgICAuCgp7XGJmIGZ1bmN0aW9uQm9keTp9YD17XGVzY2FwZWdyYW1tYXIgXGd0fScgZXhwcmVzc2lvbiBge1xlc2NhcGVncmFtbWFyIDt9JzsKICAgICBibG9jawogICAgLgoKe1xiZiBibG9jazp9CiAgICAgIGBceycgc3RhdGVtZW50cyBgXH0nCiAgICAuCgpcZW5ke2dyYW1tYXJ9CgpGdW5jdGlvbnMgaW5jbHVkZSAgZnVuY3Rpb24gZGVjbGFyYXRpb25zIChccmVme2Z1bmN0aW9uRGVjbGFyYXRpb25zfSksIG1ldGhvZHMgKFxyZWZ7aW5zdGFuY2VNZXRob2RzfSwgIFxyZWZ7c3RhdGljTWV0aG9kc30pLCBnZXR0ZXJzICAoXHJlZntnZXR0ZXJzfSksIHNldHRlcnMgIChccmVme3NldHRlcnN9KSwgY29uc3RydWN0b3JzICAoXHJlZntjb25zdHJ1Y3RvcnN9KSBhbmQgZnVuY3Rpb24gbGl0ZXJhbHMgIChccmVme2Z1bmN0aW9uRXhwcmVzc2lvbnN9KS4gIAoKQWxsIGZ1bmN0aW9ucyBoYXZlIGEgc2lnbmF0dXJlIGFuZCBhIGJvZHkuIFRoZSBzaWduYXR1cmUgZGVzY3JpYmVzIHRoZSBmb3JtYWwgcGFyYW1ldGVycyBvZiB0aGUgZnVuY3Rpb24sIGFuZCBwb3NzaWJseSBpdHMgbmFtZSBhbmQgcmV0dXJuIHR5cGUuICBBIGZ1bmN0aW9uIGJvZHkgaXMgZWl0aGVyOgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gQSBibG9jayBzdGF0ZW1lbnQgIChccmVme2Jsb2Nrc30pIGNvbnRhaW5pbmcgdGhlIHN0YXRlbWVudHMgIChccmVme3N0YXRlbWVudHN9KSBleGVjdXRlZCBieSB0aGUgZnVuY3Rpb24uIEluIHRoaXMgY2FzZSwgaWYgdGhlIGxhc3Qgc3RhdGVtZW50IG9mIGEgZnVuY3Rpb24gaXMgbm90IGEgcmV0dXJuIHN0YXRlbWVudCwgdGhlIHN0YXRlbWVudCBcY29kZXtcUkVUVVJOe307fSBpcyBpbXBsaWNpdGx5IGFwcGVuZGVkIHRvIHRoZSBmdW5jdGlvbiBib2R5LgoKXHJhdGlvbmFsZXsKQmVjYXVzZSBEYXJ0IGlzIG9wdGlvbmFsbHkgdHlwZWQsIHdlIGNhbm5vdCBndWFyYW50ZWUgdGhhdCBhIGZ1bmN0aW9uIHRoYXQgZG9lcyBub3QgcmV0dXJuIGEgdmFsdWUgd2lsbCBub3QgYmUgdXNlZCBpbiB0aGUgY29udGV4dCBvZiBhbiBleHByZXNzaW9uLiBUaGVyZWZvcmUsIGV2ZXJ5IGZ1bmN0aW9uIG11c3QgcmV0dXJuIGEgdmFsdWUuIEEgXFJFVFVSTnt9IHdpdGhvdXQgYW4gZXhwcmVzc2lvbiByZXR1cm5zIFxOVUxMe30uIFNlZSBmdXJ0aGVyIGRpc2N1c3Npb24gaW4gc2VjdGlvbiBccmVme3JldHVybn0uCn0KCk9SClxpdGVtIG9mIHRoZSBmb3JtICAgXGNvZGV7PSQ+JCAkZSR9IHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gYSBib2R5IG9mIHRoZSBmb3JtIFxjb2Rle1x7XFJFVFVSTnt9ICRlJDtcfX0uClxlbmR7aXRlbWl6ZX0KCgoKJSBBIGZ1bmN0aW9uIGhhcyBhIGZvcm1hbCBwYXJhbWV0ZXIgc2NvcGUgYW5kIGEgIGJvZHkgc2NvcGUuIFRoZSBlbmNsb3Npbmcgc2NvcGUgb2YgYSBmdW5jdGlvbidzIGJvZHkgc2NvcGUgaXMgaXRzIGZvcm1hbCBwYXJhbWV0ZXIgc2NvcGUuIFRoZSBlbmNsb3Npbmcgc2NvcGUgb2YgdGhlICBmb3JtYWwgcGFyYW1ldGVyIHNjb3BlIG9mIGEgZnVuY3Rpb24gaXMgdGhlIGVuY2xvc2luZyBzY29wZSBvZiB0aGUgZnVuY3Rpb24uCgolIFRoZSBib2R5IG9mIGEgZnVuY3Rpb24gJGYkIGlzIHByb2Nlc3NlZCB3aXRoaW4gdGhlIGJvZHkgc2NvcGUgb2YgJGYkLgolXHJhdGlvbmFsZXtUaGlzIG1heSBzZWVtIG9idmlvdXMsIGJ1dCBuZWVkcyB0byBiZSBzdGF0ZWQufQolIFxjb21tZW50YXJ5e0l0IGZvbGxvd3MgZnJvbSB0aGUgYWJvdmUgcnVsZXMgdGhhdCB0aGUgZm9ybWFsIHBhcmFtZXRlcnMgb2YgYSBmdW5jdGlvbiBtYXkgYmUgcmVmZXJlbmNlZCB3aXRoaW4gaXRzIGJvZHkuICB9Cgpcc3Vic2VjdGlvbntGdW5jdGlvbiBEZWNsYXJhdGlvbnN9ClxsYWJlbHtmdW5jdGlvbkRlY2xhcmF0aW9uc30KCkEge1xlbSBmdW5jdGlvbiBkZWNsYXJhdGlvbn0gaXMgYSBmdW5jdGlvbiB0aGF0IGlzIG5laXRoZXIgYSBtZW1iZXIgb2YgYSBjbGFzcyBub3IgYSBmdW5jdGlvbiBsaXRlcmFsLiBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgaW5jbHVkZSB7XGVtIGxpYnJhcnkgZnVuY3Rpb25zfSwgd2hpY2ggYXJlIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyAKJShpbmNsdWRpbmcgZ2V0dGVycyBhbmQgc2V0dGVycykgCmF0IHRoZSB0b3AgbGV2ZWwgb2YgYSBsaWJyYXJ5LCBhbmQge1xlbSBsb2NhbCBmdW5jdGlvbnN9LCB3aGljaCBhcmUgZnVuY3Rpb24gZGVjbGFyYXRpb25zIGRlY2xhcmVkIGluc2lkZSBvdGhlciBmdW5jdGlvbnMuIExpYnJhcnkgZnVuY3Rpb25zIGFyZSBvZnRlbiByZWZlcnJlZCB0byBzaW1wbHkgYXMgdG9wLWxldmVsIGZ1bmN0aW9ucy4KCkEgZnVuY3Rpb24gZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4gaWRlbnRpZmllciBpbmRpY2F0aW5nIHRoZSBmdW5jdGlvbidzIG5hbWUsIHBvc3NpYmx5IHByZWZhY2VkIGJ5IGEgcmV0dXJuIHR5cGUuIFRoZSBmdW5jdGlvbiBuYW1lIGlzIGZvbGxvd2VkIGJ5IGEgc2lnbmF0dXJlIGFuZCBib2R5LiBGb3IgZ2V0dGVycywgdGhlIHNpZ25hdHVyZSAgaXMgZW1wdHkuIFRoZSBib2R5IGlzIGVtcHR5IGZvciBmdW5jdGlvbnMgdGhhdCBhcmUgZXh0ZXJuYWwuCgpUaGUgc2NvcGUgb2YgYSBsaWJyYXJ5IGZ1bmN0aW9uIGlzIHRoZSBzY29wZSBvZiB0aGUgZW5jbG9zaW5nIGxpYnJhcnkuIFRoZSBzY29wZSBvZiBhIGxvY2FsIGZ1bmN0aW9uIGlzICBkZXNjcmliZWQgaW4gc2VjdGlvbiBccmVme2xvY2FsRnVuY3Rpb25EZWNsYXJhdGlvbn0uIEluIGJvdGggY2FzZXMsIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiBpcyBpbiBzY29wZSBpbiBpdHMgZm9ybWFsIHBhcmFtZXRlciBzY29wZSAoXHJlZntmb3JtYWxQYXJhbWV0ZXJzfSkuCgolQSBmdW5jdGlvbiBkZWNsYXJhdGlvbiBvZiB0aGUgZm9ybSAgJFRfMCQgJGlkKFRfMSQgJGFfMSwgXGxkb3RzLCBUX24kICRhX24sIFtUX3tuKzF9JCAkeF97bisxfSA9IGRfMSwgXGxkb3RzLCBUX3tuK2t9JCAkeF97bitrfSA9IGRfa10pXHtzXH0kIGlzIGVxdWl2YWxlbnQgdG8gYSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBvZiB0aGUgZm9ybSBcY29kZXtcRklOQUx7fSAkRiQgJGlkJCA9ICQoVF8xJCAkYV8xLCBcbGRvdHMsIFRfbiQgJGFfbiwgW1Rfe24rMX0kICR4X3tuKzF9ID0gZF8xLCBcbGRvdHMsIFRfe24ra30kICR4X3tuK2t9PSBkX2tdKVx7c1x9JH0sIHdoZXJlICRGJCBpcyB0aGUgZnVuY3Rpb24gdHlwZSBhbGlhcyAoXHJlZnt0eXBlZGVmfSkgXGNvZGV7XFRZUEVERUZ7fSAkVF8wJCAkRihUXzEkICRhXzEsIFxsZG90cywgVF9uJCAkYV9uLCBbVF97bisxfSQgJHhfe24rMX0sIFxsZG90cywgVF97bitrfSQgJHhfe24ra31dKSR9LiAgTGlrZXdpc2UsICBhIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIG9mIHRoZSBmb3JtICAkaWQoVF8xJCAkYV8xLCBcbGRvdHMsIFRfbiQgJGFfbiwgW1Rfe24rMX0kICR4X3tuKzF9ID0gZF8xLCBcbGRvdHMsIFRfe24ra30kICR4X3tuK2t9ID0gZF9rXSlce3NcfSQgaXMgZXF1aXZhbGVudCB0byBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uIG9mIHRoZSBmb3JtIFxjb2Rle1xGSU5BTHt9ICRGJCAkaWQkID0gJChUXzEkICRhXzEsIFxsZG90cywgVF9uJCAkYV9uLCBbVF97bisxfSQgJHhfe24rMX0gPSBkXzEsIFxsZG90cywgVF97bitrfSQgJHhfe24ra30gPSBkX2tdKVx7c1x9JH0sIHdoZXJlICRGJCBpcyB0aGUgZnVuY3Rpb24gdHlwZSBhbGlhcyBcY29kZXtcVFlQRURFRnt9ICAkRihUXzEkICRhXzEsIFxsZG90cywgVF9uJCAkYV9uLCBbVF97bisxfSQgJHhfe24rMX0sIFxsZG90cywgVF97bitrfSQgJHhfe24ra31dKSR9LiAKCiVcUXtXZSBuZWVkIHRvIGNvdmVyIGxpYnJhcnkgZ2V0dGVycyBhcyB3ZWxsLn0KCiVcUXsgVGhlIGRlZmluaXRpb24gaW4gdGVybXMgb2YgdmFyaWFibGVzIGlzIHVudHJ1ZSwgYmVjYXVzZSB0aGUgY29kZSB3b3VsZCBiZSBpbGxlZ2FsLiBUaGUgaW5pdGlhbGl6ZXIgY2Fubm90IHJlZmVyIHRvIHRoZSBmdW5jdGlvbiBuYW1lIGluIHRoaXMgY2FzZS4gIEkgYmVsaWV2ZSB0aGUgYmVzdCBmaXggaXMgdG8gcmVsYXggdGhpcwolcmVxdWlyZW1lbnQgaW4gdGhlIGNhc2Ugb2YgY2xvc3VyZXMuIFNlZSBidWcgMzE1LgolfQoKJVxjb21tZW50YXJ5ewolU29tZSBvYnZpb3VzIGNvbmNsdXNpb25zOgoKJUEgZnVuY3Rpb24gZGVjbGFyYXRpb24gb2YgdGhlIGZvcm0gJGlkKFRfMSQgJGFfMSwgXGxkb3RzLCBUX24kICRhX24sIFtUX3tuKzF9JCAkeF97bisxfSA9IGRfMSwgXGxkb3RzLCBUX3tuK2t9JCAkeF97bitrfSA9IGRfa10pID0+IGUkIGlzIGVxdWl2YWxlbnQgdG8gYSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBvZiB0aGUgZm9ybSBcY29kZXtcRklOQUx7fSAgJGlkJCA9ICgkKFRfMSQgJGFfMSwgXGxkb3RzLCBUX24kICRhX24sIFtUX3tuKzF9JCAkeF97bisxfSA9IGRfMSwgXGxkb3RzLCBUX3tuK2t9JCAkeF97bitrfSA9IGRfa10pPT4gZSR9LgoKJUEgZnVuY3Rpb24gbGl0ZXJhbCBvZiB0aGUgZm9ybSAkKFRfMSQgJGFfMSwgXGxkb3RzLCBUX24kICRhX24sIFtUX3tuKzF9JCAkeF97bisxfSA9IGRfMSwgXGxkb3RzLCBUX3tuK2t9JCAkeF97bitrfSA9IGRfa10pID0+IGUkIGlzIGVxdWl2YWxlbnQgdG8gYSBmdW5jdGlvbiBsaXRlcmFsIG9mIHRoZSBmb3JtICBcY29kZXskKFRfMSQgJGFfMSwgXGxkb3RzLCBUX24kICRhX24sIFtUX3tuKzF9JCAkeF97bisxfSA9IGRfMSwgXGxkb3RzLCBUX3tuK2t9JCAkeF97bitrfSA9IGRfa10pXHskIFxSRVRVUk57fSAkZSQ7XH19LgolfQoKJUEgZnVuY3Rpb24gZGVjbGFyYXRpb24gb2YgdGhlIGZvcm0gICRUXzAkICRpZChUXzEkICRhXzEsIFxsZG90cywgVF9uJCAkYV9uLCBce1Rfe24rMX0kICR4X3tuKzF9IDogZF8xLCBcbGRvdHMsIFRfe24ra30kICR4X3tuK2t9IDogZF9rXH0pXHtzXH0kIGlzIGVxdWl2YWxlbnQgdG8gYSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBvZiB0aGUgZm9ybSBcY29kZXtcRklOQUx7fSAkRiQgJGlkJCA9ICQoVF8xJCAkYV8xLCBcbGRvdHMsIFRfbiQgJGFfbiwgXHtUX3tuKzF9JCAkeF97bisxfSA6IGRfMSwgXGxkb3RzLCBUX3tuK2t9JCAkeF97bitrfSA6IGRfa1x9KVx7c1x9JH0sIHdoZXJlICRGJCBpcyB0aGUgZnVuY3Rpb24gdHlwZSBhbGlhcyAoXHJlZnt0eXBlZGVmfSkgXGNvZGV7XFRZUEVERUZ7fSAkVF8wJCAkRihUXzEkICRhXzEsIFxsZG90cywgVF9uJCAkYV9uLCBce1Rfe24rMX0kICR4X3tuKzF9LCBcbGRvdHMsIFRfe24ra30kICR4X3tuK2t9XVx9JH0uICBMaWtld2lzZSwgIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24gb2YgdGhlIGZvcm0gICRpZChUXzEkICRhXzEsIFxsZG90cywgVF9uJCAkYV9uLCBce1Rfe24rMX0kICR4X3tuKzF9IDogZF8xLCBcbGRvdHMsIFRfe24ra30kICR4X3tuK2t9IDogZF9rXH0pXHtzXH0kIGlzIGVxdWl2YWxlbnQgdG8gYSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBvZiB0aGUgZm9ybSBcY29kZXtcRklOQUx7fSAkRiQgJGlkJCA9ICQoVF8xJCAkYV8xLCBcbGRvdHMsIFRfbiQgJGFfbiwgXHtUX3tuKzF9JCAkeF97bisxfSA6IGRfMSwgXGxkb3RzLCBUX3tuK2t9JCAkeF97bitrfSA6IGRfa1x9KVx7c1x9JH0sIHdoZXJlICRGJCBpcyB0aGUgZnVuY3Rpb24gdHlwZSBhbGlhcyBcY29kZXtcVFlQRURFRnt9ICAkRihUXzEkICRhXzEsIFxsZG90cywgVF9uJCAkYV9uLCBce1Rfe24rMX0kICR4X3tuKzF9LCBcbGRvdHMsIFRfe24ra30kICR4X3tuK2t9XH0pJH0uCgpJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciB0byBwcmVmYWNlIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24gd2l0aCB0aGUgYnVpbHQtaW4gaWRlbnRpZmllciBcU1RBVElDe30uCgpXaGVuIHdlIHNheSB0aGF0IGEgZnVuY3Rpb24gJGZfMSQge1xlbSBmb3J3YXJkc30gdG8gYW5vdGhlciBmdW5jdGlvbiAkZl8yJCwgd2UgbWVhbiB0aGF0ICBpbnZva2luZyAkZl8xJCBjYXVzZXMgJGZfMiQgdG8gIGJlIGV4ZWN1dGVkIHdpdGggdGhlIHNhbWUgYXJndW1lbnRzIGFuZC9vciByZWNlaXZlciBhcyAkZl8xJCwgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBvZiBleGVjdXRpbmcgJGZfMiQgdG8gdGhlIGNhbGxlciBvZiAkZl8xJCwgdW5sZXNzICRmXzIkIHRocm93cyBhbiBleGNlcHRpb24sIGluIHdoaWNoIGNhc2UgJGZfMSQgdGhyb3dzIHRoZSBzYW1lIGV4Y2VwdGlvbi4gRnVydGhlcm1vcmUsIHdlIG9ubHkgdXNlIHRoZSB0ZXJtIGZvciBzeW50aGV0aWMgZnVuY3Rpb25zIGludHJvZHVjZWQgYnkgdGhlIHNwZWNpZmljYXRpb24uCgoKXHN1YnNlY3Rpb257Rm9ybWFsIFBhcmFtZXRlcnN9ClxsYWJlbHtmb3JtYWxQYXJhbWV0ZXJzfQoKRXZlcnkgZnVuY3Rpb24gaW5jbHVkZXMgYSB7XGVtIGZvcm1hbCBwYXJhbWV0ZXIgbGlzdH0sIHdoaWNoIGNvbnNpc3RzIG9mIGEgbGlzdCBvZiByZXF1aXJlZCBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgKFxyZWZ7cmVxdWlyZWRGb3JtYWxzfSksIGZvbGxvd2VkIGJ5IGFueSBvcHRpb25hbCBwYXJhbWV0ZXJzIChccmVme29wdGlvbmFsRm9ybWFsc30pLiBUaGUgb3B0aW9uYWwgcGFyYW1ldGVycyBtYXkgYmUgc3BlY2lmaWVkIGVpdGhlciBhcyBhIHNldCBvZiBuYW1lZCBwYXJhbWV0ZXJzIG9yIGFzIGEgbGlzdCBvZiBwb3NpdGlvbmFsIHBhcmFtZXRlcnMsIGJ1dCBub3QgYm90aC4KClRoZSBmb3JtYWwgcGFyYW1ldGVyIGxpc3Qgb2YgYSBmdW5jdGlvbiBpbnRyb2R1Y2VzIGEgbmV3IHNjb3BlIGtub3duIGFzIHRoZSBmdW5jdGlvbmBzIHtcZW0gZm9ybWFsIHBhcmFtZXRlciBzY29wZX0uIFRoZSBmb3JtYWwgcGFyYW1ldGVyIHNjb3BlIG9mIGEgZnVuY3Rpb24gJGYkICBpcyBlbmNsb3NlZCBpbiB0aGUgc2NvcGUgd2hlcmUgJGYkIGlzIGRlY2xhcmVkLiAgIEV2ZXJ5IGZvcm1hbCBwYXJhbWV0ZXIgaW50cm9kdWNlcyBhIGxvY2FsIHZhcmlhYmxlIGludG8gdGhlIGZvcm1hbCBwYXJhbWV0ZXIgc2NvcGUuIEhvd2V2ZXIsIHRoZSBzY29wZSBvZiBhIGZ1bmN0aW9uJ3Mgc2lnbmF0dXJlIGlzIHRoZSBmdW5jdGlvbidzIGVuY2xvc2luZyBzY29wZSwgbm90IHRoZSBmb3JtYWwgcGFyYW1ldGVyIHNjb3BlLgoKVGhlIGJvZHkgb2YgYSBmdW5jdGlvbiBpbnRyb2R1Y2VzIGEgbmV3IHNjb3BlIGtub3duIGFzIHRoZSBmdW5jdGlvbmBzIHtcZW0gIGJvZHkgc2NvcGV9LiBUaGUgYm9keSBzY29wZSBvZiBhIGZ1bmN0aW9uICRmJCAgaXMgZW5jbG9zZWQgIGluIHRoZSBzY29wZSBpbnRyb2R1Y2VkIGJ5IHRoZSBmb3JtYWwgcGFyYW1ldGVyIHNjb3BlIG9mICRmJC4KCgolVGhlIGZvcm1hbCBwYXJhbWV0ZXIgc2NvcGUgb2YgYSBmdW5jdGlvbiBtYXBzIHRoZSBuYW1lIG9mIGVhY2ggZm9ybWFsIHBhcmFtZXRlciAkcCQgdG8gdGhlIHZhbHVlICRwJCBpcyBib3VuZCB0by4gCgolIFRoZSBmb3JtYWwgcGFyYW1ldGVycyBvZiBhIGZ1bmN0aW9uIGFyZSBwcm9jZXNzZWQgaW4gdGhlIGVuY2xvc2luZyBzY29wZSBvZiB0aGUgZnVuY3Rpb24uIAolIFxjb21tZW50YXJ5e3RoaXMgbWVhbnMgdGhhdCB0aGUgcGFyYW1ldGVycyB0aGVtc2VsdmVzIG1heSBub3QgYmUgcmVmZXJlbmNlZCB3aXRoaW4gdGhlIGZvcm1hbCBwYXJhbWV0ZXIgbGlzdC59CgpJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBhIGZvcm1hbCBwYXJhbWV0ZXIgaXMgZGVjbGFyZWQgYXMgYSBjb25zdGFudCB2YXJpYWJsZSAoXHJlZnt2YXJpYWJsZXN9KS4KClxiZWdpbntncmFtbWFyfQp7XGJmIGZvcm1hbFBhcmFtZXRlckxpc3Q6fWAoJyBgKSc7CiBgKCcgbm9ybWFsRm9ybWFsUGFyYW1ldGVycyAoIGAsJyAgb3B0aW9uYWxGb3JtYWxQYXJhbWV0ZXJzKT8gYCknOwogIGAoJyBvcHRpb25hbEZvcm1hbFBhcmFtZXRlcnMgYCknCiAgIC4KJVxlbmR7Z3JhbW1hcn0KJX0KCiVcYmVnaW57Z3JhbW1hcn0KJWZvcm1hbFBhcmFtZXRlckxpc3Q6ICAgICAKJSAgICAgICcoJyByZXN0Rm9ybWFsUGFyYW1ldGVyPyAnKSc7CiUgICAgICAnKCcgbmFtZWRGb3JtYWxQYXJhbWV0ZXJzICcpJzsKICUgICAgICcoJyBub3JtYWxGb3JtYWxQYXJhbWV0ZXJzIG5vcm1hbEZvcm1hbFBhcmFtZXRlclRhaWw/ICcpJwogICUgIC4KCntcYmYgbm9ybWFsRm9ybWFsUGFyYW1ldGVyczp9CiAgICAgIG5vcm1hbEZvcm1hbFBhcmFtZXRlciAoYCwnIG5vcm1hbEZvcm1hbFBhcmFtZXRlcikqCiAgICAuCgp7XGJmIG9wdGlvbmFsRm9ybWFsUGFyYW1ldGVyczp9b3B0aW9uYWxQb3NpdGlvbmFsRm9ybWFsUGFyYW1ldGVyczsKICAgICAgbmFtZWRGb3JtYWxQYXJhbWV0ZXJzCiAgICAuCgp7XGJmIG9wdGlvbmFsUG9zaXRpb25hbEZvcm1hbFBhcmFtZXRlcnM6fQogICAgICBgWycgZGVmYXVsdEZvcm1hbFBhcmFtZXRlciAoYCwnIGRlZmF1bHRGb3JtYWxQYXJhbWV0ZXIpKiBgXScKICAgIC4Ke1xiZiBuYW1lZEZvcm1hbFBhcmFtZXRlcnM6fQogICAgICBgXHsnIGRlZmF1bHROYW1lZFBhcmFtZXRlciAoYCwnIGRlZmF1bHROYW1lZFBhcmFtZXRlcikqIGBcfScKICAgIC4KXGVuZHtncmFtbWFyfQoKJUZvcm1hbCBwYXJhbWV0ZXJzIGFyZSBhbHdheXMgXEZJTkFMe30uICAKJVxRe1dlJ3JlIGF3YWl0aW5nIHNvbWUgZGF0YSBvbiB3aGV0aGVyIGVuZm9yY2luZyB0aGlzIHdvdWxkIGNhdXNlIHdpZGVzcHJlYWQgcGFpbi59CiVBIGZvcm1hbCBwYXJhbWV0ZXIgaXMgYWx3YXlzIGNvbnNpZGVyZWQgdG8gYmUgaW5pdGlhbGl6ZWQuICBccmF0aW9uYWxle1RoaXMgaXMgYmVjYXVzZSBpdCB3aWxsIGFsd2F5cyBiZSBpbml0aWFsaXplZCBieSB0aGUgY2FsbCAtIGV2ZW4gaWYgaXQgaXMgb3B0aW9uYWwufQoKClxzdWJzdWJzZWN0aW9ue1JlcXVpcmVkIEZvcm1hbHN9IApcbGFiZWx7cmVxdWlyZWRGb3JtYWxzfQoKQSB7XGVtIHJlcXVpcmVkIGZvcm1hbCBwYXJhbWV0ZXJ9IG1heSBiZSBzcGVjaWZpZWQgaW4gb25lIG9mIHRocmVlIHdheXM6ClxiZWdpbntpdGVtaXplfQpcaXRlbSBCeSBtZWFucyBvZiBhIGZ1bmN0aW9uIHNpZ25hdHVyZSB0aGF0IG5hbWVzIHRoZSBwYXJhbWV0ZXIgYW5kIGRlc2NyaWJlcyBpdHMgdHlwZSBhcyBhIGZ1bmN0aW9uIHR5cGUgKFxyZWZ7ZnVuY3Rpb25UeXBlc30pLiAgSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgYW55IGRlZmF1bHQgdmFsdWVzIGFyZSBzcGVjaWZpZWQgaW4gdGhlIHNpZ25hdHVyZSBvZiBzdWNoIGEgZnVuY3Rpb24gdHlwZS4lIGV4cGxhaW4gd2hhdCB0aGUgdHlwZSBpcyBpbiB0aGlzIGNhc2U/IFdoZXJlIGlzIHRoaXMgZGVzY3JpYmVkIGluIGdlbmVyYWw/ClxpdGVtIEFzIGFuIGluaXRpYWxpemluZyBmb3JtYWwsIHdoaWNoIGlzIG9ubHkgdmFsaWQgYXMgYSBwYXJhbWV0ZXIgdG8gYSBnZW5lcmF0aXZlIGNvbnN0cnVjdG9yIChccmVme2dlbmVyYXRpdmVDb25zdHJ1Y3RvcnN9KS4gJSBkbyB3ZSBuZWVkIHRvIHNheSB0aGlzLCBvciBhbnl0aGluZyBtb3JlPwpcaXRlbSBWaWEgYW4gb3JkaW5hcnkgdmFyaWFibGUgZGVjbGFyYXRpb24gKFxyZWZ7dmFyaWFibGVzfSkuClxlbmR7aXRlbWl6ZX0KClxiZWdpbntncmFtbWFyfQp7XGJmIG5vcm1hbEZvcm1hbFBhcmFtZXRlcjp9ZnVuY3Rpb25TaWduYXR1cmU7CiAgICAgIGZpZWxkRm9ybWFsUGFyYW1ldGVyOwogICAgICBzaW1wbGVGb3JtYWxQYXJhbWV0ZXIKIC4KCntcYmYgc2ltcGxlRm9ybWFsUGFyYW1ldGVyOn1kZWNsYXJlZElkZW50aWZpZXI7CiAgICAgIG1ldGFkYXRhIGlkZW50aWZpZXIKICAgIC4KCntcYmYgZmllbGRGb3JtYWxQYXJhbWV0ZXI6fQogICBtZXRhZGF0YSBmaW5hbENvbnN0VmFyT3JUeXBlPyBcVEhJU3t9IGB7XGVzY2FwZWdyYW1tYXIgLn0nIGlkZW50aWZpZXIgZm9ybWFsUGFyYW1ldGVyTGlzdD8KICAgLgpcZW5ke2dyYW1tYXJ9CgolXHN1YnN1YnNlY3Rpb257UmVzdCBGb3JtYWxzfQoKJUEgcmVzdCBmb3JtYWwgJFIkIG11c3QgYmUgdGhlIGxhc3QgcGFyYW1ldGVyIGluIGEgZm9ybWFsIHBhcmFtZXRlciBsaXN0LiAgSWYgYSAgdHlwZSAkVCQgaXMgc3BlY2lmaWVkIGZvciAkUiQsIGl0IHNpZ25pZmllcyB0aGF0IHRoZSB0eXBlIG9mICRSJCBpcyAkVFtdJC4gCgolXGJlZ2lue2dyYW1tYXJ9CiVyZXN0Rm9ybWFsUGFyYW1ldGVyOgolICAgICAgZmluYWxDb25zdFZhck9yVHlwZT8gJ3tcZXNjYXBlZ3JhbW1hciAuLi59JyBpZGVudGlmaWVyCiAlXGVuZHtncmFtbWFyfQoKXHN1YnN1YnNlY3Rpb257T3B0aW9uYWwgRm9ybWFsc30KXGxhYmVse29wdGlvbmFsRm9ybWFsc30KCk9wdGlvbmFsIHBhcmFtZXRlcnMgbWF5IGJlIHNwZWNpZmllZCBhbmQgcHJvdmlkZWQgd2l0aCBkZWZhdWx0IHZhbHVlcy4KClxiZWdpbntncmFtbWFyfQp7XGJmIGRlZmF1bHRGb3JtYWxQYXJhbWV0ZXI6fQogICAgICBub3JtYWxGb3JtYWxQYXJhbWV0ZXIgKCc9JyBleHByZXNzaW9uKT8KICAgIC4gICAKICAgICAgICAKe1xiZiBkZWZhdWx0TmFtZWRQYXJhbWV0ZXI6fQogICAgICBub3JtYWxGb3JtYWxQYXJhbWV0ZXIgKCBge1xlc2NhcGVncmFtbWFyIDp9JyBleHByZXNzaW9uKT8KICAgIC4gICAKXGVuZHtncmFtbWFyfQoKSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIGlzIG5vdCBhIGNvbXBpbGUtdGltZSBjb25zdGFudCAoXHJlZntjb25zdGFudHN9KS4gSWYgbm8gZGVmYXVsdCBpcyBleHBsaWNpdGx5IHNwZWNpZmllZCBmb3IgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIGFuIGltcGxpY2l0IGRlZmF1bHQgb2YgXE5VTEx7fSBpcyBwcm92aWRlZC4KCkl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIHRoZSBuYW1lIG9mIGEgbmFtZWQgb3B0aW9uYWwgcGFyYW1ldGVyIGJlZ2lucyB3aXRoIGFuIGBcXycgY2hhcmFjdGVyLgoKXHJhdGlvbmFsZXsKVGhlIG5lZWQgZm9yIHRoaXMgIHJlc3RyaWN0aW9uIGlzIGEgZGlyZWN0IGNvbnNlcXVlbmNlIG9mIHRoZSBmYWN0IHRoYXQgbmFtaW5nIGFuZCBwcml2YWN5IGFyZSBub3Qgb3J0aG9nb25hbC4KSWYgd2UgYWxsb3dlZCBuYW1lZCBwYXJhbWV0ZXJzIHRvIGJlZ2luIHdpdGggYW4gdW5kZXJzY29yZSwgdGhleSB3b3VsZCBiZSBjb25zaWRlcmVkIHByaXZhdGUgYW5kIGluYWNjZXNzaWJsZSB0byBjYWxsZXJzIGZyb20gb3V0c2lkZSB0aGUgbGlicmFyeSB3aGVyZSBpdCB3YXMgZGVmaW5lZC4gSWYgYSBtZXRob2Qgb3V0c2lkZSB0aGUgbGlicmFyeSBvdmVycm9kZSBhIG1ldGhvZCB3aXRoIGEgcHJpdmF0ZSBvcHRpb25hbCBuYW1lLCBpdCB3b3VsZCBub3QgYmUgYSBzdWJ0eXBlIG9mIHRoZSBvcmlnaW5hbCBtZXRob2QuIFRoZSBzdGF0aWMgY2hlY2tlciB3b3VsZCBvZiBjb3Vyc2UgZmxhZyBzdWNoIHNpdHVhdGlvbnMsIGJ1dCB0aGUgY29uc2VxdWVuY2Ugd291bGQgYmUgdGhhdCBhZGRpbmcgYSBwcml2YXRlIG5hbWVkIGZvcm1hbCB3b3VsZCBicmVhayBjbGllbnRzIG91dHNpZGUgdGhlIGxpYnJhcnkgaW4gYSB3YXkgdGhleSBjb3VsZCBub3QgZWFzaWx5IGNvcnJlY3QuIAp9Cgpcc3Vic2VjdGlvbntUeXBlIG9mIGEgRnVuY3Rpb259ClxsYWJlbHt0eXBlT2ZBRnVuY3Rpb259CgpJZiBhIGZ1bmN0aW9uIGRvZXMgbm90IGRlY2xhcmUgYSByZXR1cm4gdHlwZSBleHBsaWNpdGx5LCBpdHMgcmV0dXJuIHR5cGUgaXMgXERZTkFNSUN7fSAoXHJlZnt0eXBlRHluYW1pY30pLgoKTGV0ICRGJCBiZSBhIGZ1bmN0aW9uIHdpdGggcmVxdWlyZWQgZm9ybWFsIHBhcmFtZXRlcnMgJFRfMSQgJHBfMSBcbGRvdHMsIFRfbiQgJHBfbiQsIHJldHVybiB0eXBlICRUXzAkIGFuZCBubyBvcHRpb25hbCBwYXJhbWV0ZXJzLiBUaGVuIHRoZSB0eXBlIG9mICRGJCBpcyAkKFRfMSAsXGxkb3RzLCBUX24pIFxyaWdodGFycm93IFRfMCQuCgpMZXQgJEYkIGJlIGEgZnVuY3Rpb24gd2l0aCByZXF1aXJlZCBmb3JtYWwgcGFyYW1ldGVycyAkVF8xJCAkcF8xIFxsZG90cywgVF9uJCAkcF9uJCwgcmV0dXJuIHR5cGUgJFRfMCQgYW5kIHBvc2l0aW9uYWwgb3B0aW9uYWwgcGFyYW1ldGVycyAkVF97bisxfSQgJHBfe24rMX0sIFxsZG90cywgVF97bitrfSQgJCBwX3tuK2t9JC4gVGhlbiB0aGUgdHlwZSBvZiAkRiQgaXMgJChUXzEgLFxsZG90cywgVF9uLCBbVF97bisxfSQgJHBfe24rMX0sIFxsZG90cywgVF97bitrfSQgICRwX3tuK2t9XSkgXHJpZ2h0YXJyb3cgVF8wJC4KCkxldCAkRiQgYmUgYSBmdW5jdGlvbiB3aXRoIHJlcXVpcmVkIGZvcm1hbCBwYXJhbWV0ZXJzICRUXzEkICRwXzEgXGxkb3RzLCBUX24kICRwX24kLCByZXR1cm4gdHlwZSAkVF8wJCBhbmQgbmFtZWQgb3B0aW9uYWwgcGFyYW1ldGVycyAkVF97bisxfSQgJHBfe24rMX0sIFxsZG90cywgVF97bitrfSQgJCBwX3tuK2t9JC4gVGhlbiB0aGUgdHlwZSBvZiAkRiQgaXMgJChUXzEgLFxsZG90cywgVF9uLCBce1Rfe24rMX0kICRwX3tuKzF9LCBcbGRvdHMsIFRfe24ra30kICAkcF97bitrfVx9KSBccmlnaHRhcnJvdyBUXzAkLgoKVGhlIHJ1biB0aW1lIHR5cGUgb2YgYSBmdW5jdGlvbiBvYmplY3QgYWx3YXlzIGltcGxlbWVudHMgdGhlIGNsYXNzIFxjZHtGdW5jdGlvbn0uIAoKXGNvbW1lbnRhcnl7Ck9uZSBjYW5ub3QgYXNzdW1lLCBiYXNlZCBvbiB0aGUgYWJvdmUsIHRoYXQgIGdpdmVuIGEgZnVuY3Rpb24gXGNke2Z9LCBcY2R7Zi5ydW50aW1lVHlwZX0gd2lsbCBhY3R1YWxseSBiZSBcY2R7RnVuY3Rpb259LCBvciB0aGF0IGFueSB0d28gZGlzdGluY3QgZnVuY3Rpb24gb2JqZWN0cyBuZWNlc3NhcmlseSBoYXZlIHRoZSBzYW1lIHJ1bnRpbWUgdHlwZS4KfQoKXHJhdGlvbmFsZXsKSXQgaXMgdXAgdG8gdGhlIGltcGxlbWVudGF0aW9uIHRvIGNob29zZSBhbiBhcHByb3ByaWF0ZSByZXByZXNlbnRhdGlvbiBmb3IgZnVuY3Rpb25zLgpGb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhhdCBhIGNsb3N1cmUgcHJvZHVjZWQgdmlhIHByb3BlcnR5IGV4dHJhY3Rpb24gdHJlYXRzIGVxdWFsaXR5IGRpZmZlcmVudCBmcm9tIG9yZGluYXJ5IGNsb3N1cmVzLCBhbmQgaXMgdGhlcmVmb3JlIGxpa2VseSBhIGRpZmZlcmVudCBjbGFzcy4gSW1wbGVtZW50YXRpb25zIG1heSBhbHNvIHVzZSBkaWZmZXJlbnQgY2xhc3NlcyBmb3IgZnVuY3Rpb25zIGJhc2VkIG9uIGFyaXR5IGFuZCBvciB0eXBlLiBBcml0eSBtYXkgYmUgaW1wbGljaXRseSBhZmZlY3RlZCBieSB3aGV0aGVyIGEgZnVuY3Rpb24gaXMgYW4gaW5zdGFuY2UgbWV0aG9kICh3aXRoIGFuIGltcGxpY2l0IHJlY2VpdmVyIHBhcmFtZXRlcikgb3Igbm90LiBUaGUgdmFyaWF0aW9ucyBhcmUgbWFuaWZvbGQsIGFuZCBzbyB0aGlzIHNwZWNpZmljYXRpb24gb25seSBndWFyYW50ZWVzIHRoYXQgZnVuY3Rpb24gb2JqZWN0cyBhcmUgaW5zdGFuY2VzIG9mIHNvbWUgY2xhc3MgdGhhdCBpcyBjb25zaWRlcmVkIHRvIGltcGxlbWVudCBcY2R7RnVuY3Rpb259LgoKfQoKXHN1YnNlY3Rpb257RXh0ZXJuYWwgRnVuY3Rpb25zfQpcbGFiZWx7ZXh0ZXJuYWxGdW5jdGlvbnN9CgpBbiB7XGVtIGV4dGVybmFsIGZ1bmN0aW9ufSBpcyBhIGZ1bmN0aW9uIHdob3NlIGJvZHkgaXMgcHJvdmlkZWQgc2VwYXJhdGVseSBmcm9tIGl0cyBkZWNsYXJhdGlvbi4gQW4gZXh0ZXJuYWwgZnVuY3Rpb24gbWF5IGJlIGEgdG9wLWxldmVsIGZ1bmN0aW9uIChccmVme2xpYnJhcmllc0FuZFNjcmlwdHN9KSwgYSBtZXRob2QgKFxyZWZ7aW5zdGFuY2VNZXRob2RzfSwgXHJlZntzdGF0aWNNZXRob2RzfSksIGEgZ2V0dGVyIChccmVme2dldHRlcnN9KSwgYSBzZXR0ZXIgKFxyZWZ7c2V0dGVyc30pIG9yIGEgbm9uLXJlZGlyZWN0aW5nIGNvbnN0cnVjdG9yIChccmVme2dlbmVyYXRpdmVDb25zdHJ1Y3RvcnN9LCBccmVme2ZhY3Rvcmllc30pLiBFeHRlcm5hbCBmdW5jdGlvbnMgYXJlIGludHJvZHVjZWQgdmlhIHRoZSBidWlsdC1pbiBpZGVudGlmaWVyIFxFWFRFUk5BTHt9ICAoXHJlZntpZGVudGlmaWVyUmVmZXJlbmNlfSkgZm9sbG93ZWQgYnkgdGhlIGZ1bmN0aW9uIHNpZ25hdHVyZS4gIAoKXHJhdGlvbmFsZXsKRXh0ZXJuYWwgZnVuY3Rpb25zIGFsbG93IHVzIHRvIGludHJvZHVjZSAgdHlwZSBpbmZvcm1hdGlvbiBmb3IgY29kZSB0aGF0IGlzIG5vdCBzdGF0aWNhbGx5IGtub3duIHRvIHRoZSBEYXJ0IGNvbXBpbGVyLiAKfQoKXGNvbW1lbnRhcnl7CkV4YW1wbGVzIG9mIGV4dGVybmFsIGZ1bmN0aW9ucyBtaWdodCBiZSBmb3JlaWduIGZ1bmN0aW9ucyAoZGVmaW5lZCBpbiBDLCBvciBKYXZhc2NyaXB0IGV0Yy4pLCBwcmltaXRpdmVzIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiAoYXMgZGVmaW5lZCBieSB0aGUgRGFydCBydW50aW1lKSwgb3IgY29kZSB0aGF0IHdhcyBkeW5hbWljYWxseSBnZW5lcmF0ZWQgYnV0IHdob3NlIGludGVyZmFjZSBpcyBzdGF0aWNhbGx5IGtub3duLiBIb3dldmVyLCBhbiBhYnN0cmFjdCBtZXRob2QgaXMgZGlmZmVyZW50IGZyb20gYW4gZXh0ZXJuYWwgZnVuY3Rpb24sIGFzIGl0IGhhcyB7XGVtIG5vfSBib2R5Lgp9CgpBbiBleHRlcm5hbCBmdW5jdGlvbiBpcyBjb25uZWN0ZWQgdG8gaXRzIGJvZHkgYnkgYW4gaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgbWVjaGFuaXNtLiBBdHRlbXB0aW5nIHRvIGludm9rZSBhbiBleHRlcm5hbCBmdW5jdGlvbiB0aGF0IGhhcyBub3QgYmVlbiBjb25uZWN0ZWQgdG8gaXRzIGJvZHkgd2lsbCByYWlzZSBhIFxjb2Rle05vU3VjaE1ldGhvZEVycm9yfSBvciBzb21lIHN1YmNsYXNzIHRoZXJlb2YuCgpUaGUgYWN0dWFsIHN5bnRheCBpcyBnaXZlbiBpbiBzZWN0aW9ucyBccmVme2NsYXNzZXN9IGFuZCBccmVme2xpYnJhcmllc0FuZFNjcmlwdHN9IGJlbG93LgoKXHNlY3Rpb257Q2xhc3Nlc30KXGxhYmVse2NsYXNzZXN9CgpBIHtcZW0gY2xhc3N9IGRlZmluZXMgdGhlIGZvcm0gYW5kIGJlaGF2aW9yIG9mIGEgc2V0IG9mIG9iamVjdHMgd2hpY2ggYXJlIGl0cyB7XGVtIGluc3RhbmNlc30uICBDbGFzc2VzIG1heSBiZSBkZWZpbmVkIGJ5IGNsYXNzIGRlY2xhcmF0aW9ucyBhcyBkZXNjcmliZWQgYmVsb3csIG9yIHZpYSBtaXhpbiBhcHBsaWNhdGlvbnMgKFxyZWZ7bWl4aW5BcHBsaWNhdGlvbn0pLgoKXGJlZ2lue2dyYW1tYXJ9CntcYmYgY2xhc3NEZWZpbml0aW9uOn0KbWV0YWRhdGEgXEFCU1RSQUNUe30/ICBcQ0xBU1N7fSBpZGVudGlmaWVyIHR5cGVQYXJhbWV0ZXJzPyAoc3VwZXJjbGFzcyBtaXhpbnM/KT8gaW50ZXJmYWNlcz8gXFwKICAgICAgIGBceycgKG1ldGFkYXRhIGNsYXNzTWVtYmVyRGVmaW5pdGlvbikqIGBcfSc7CiAgICAgICAKbWV0YWRhdGEgXEFCU1RSQUNUe30/ICBcQ0xBU1N7fSBtaXhpbkFwcGxpY2F0aW9uQ2xhc3MKICAgIC4KICAgIAp7XGJmIG1peGluczp9CiAgXFdJVEh7fSB0eXBlTGlzdAogIC4KCntcYmYgY2xhc3NNZW1iZXJEZWZpbml0aW9uOn1kZWNsYXJhdGlvbiBge1xlc2NhcGVncmFtbWFyIDt9JyA7CiAgICAgICBtZXRob2RTaWduYXR1cmUgZnVuY3Rpb25Cb2R5CiAgICAuCgp7XGJmIG1ldGhvZFNpZ25hdHVyZTp9Y29uc3RydWN0b3JTaWduYXR1cmUgaW5pdGlhbGl6ZXJzPzsKICAgICAgZmFjdG9yeUNvbnN0cnVjdG9yU2lnbmF0dXJlOwogICAgICBcU1RBVElDe30/IGZ1bmN0aW9uU2lnbmF0dXJlOwogICAgICBcU1RBVElDe30/IGdldHRlclNpZ25hdHVyZTsKICAgICAgXFNUQVRJQ3t9PyBzZXR0ZXJTaWduYXR1cmU7CiAgICAgIG9wZXJhdG9yU2lnbmF0dXJlCiAgICAuCgp7XGJmIGRlY2xhcmF0aW9uOn1jb25zdGFudENvbnN0cnVjdG9yU2lnbmF0dXJlIChyZWRpcmVjdGlvbiAkfCQgaW5pdGlhbGl6ZXJzKT87CiAgICAgIGNvbnN0cnVjdG9yU2lnbmF0dXJlIChyZWRpcmVjdGlvbiAkfCQgaW5pdGlhbGl6ZXJzKT87CiAgICAgIFxFWFRFUk5BTHt9IGNvbnN0YW50Q29uc3RydWN0b3JTaWduYXR1cmU7CiAgICAgIFxFWFRFUk5BTHt9IGNvbnN0cnVjdG9yU2lnbmF0dXJlOwogICAgICAoKFxFWFRFUk5BTHt9IFxTVEFUSUN7fSA/KSk/IGdldHRlclNpZ25hdHVyZTsKICAgICAgKChcRVhURVJOQUx7fSBcU1RBVElDe30/KSk/IHNldHRlclNpZ25hdHVyZTsKICAgICAgXEVYVEVSTkFMe30/IG9wZXJhdG9yU2lnbmF0dXJlOwogICAgICAgKChcRVhURVJOQUx7fSBcU1RBVElDe30/KSk/IGZ1bmN0aW9uU2lnbmF0dXJlOwogICAgICBcU1RBVElDe30gKFxGSU5BTHt9ICR8JCBcQ09OU1R7fSkgdHlwZT8gc3RhdGljRmluYWxEZWNsYXJhdGlvbkxpc3Q7CiUgICAgICBcQ09OU1R7fSB0eXBlPyBzdGF0aWNGaW5hbERlY2xhcmF0aW9uTGlzdDsKICAgICAgXEZJTkFMe30gdHlwZT8gaW5pdGlhbGl6ZWRJZGVudGlmaWVyTGlzdDsKICAgICAgXFNUQVRJQ3t9PyAoXFZBUnt9ICR8JCB0eXBlKSBpbml0aWFsaXplZElkZW50aWZpZXJMaXN0CiAgICAuCgp7XGJmIHN0YXRpY0ZpbmFsRGVjbGFyYXRpb25MaXN0On0KICAgIHN0YXRpY0ZpbmFsRGVjbGFyYXRpb24gKGAsJyBzdGF0aWNGaW5hbERlY2xhcmF0aW9uKSoKICAgIC4KCntcYmYgc3RhdGljRmluYWxEZWNsYXJhdGlvbjp9CiAgICAgIGlkZW50aWZpZXIgYD0nIGV4cHJlc3Npb24KICAgIC4KClxlbmR7Z3JhbW1hcn0KCkEgY2xhc3MgaGFzIGNvbnN0cnVjdG9ycywgIGluc3RhbmNlIG1lbWJlcnMgYW5kIHN0YXRpYyBtZW1iZXJzLiBUaGUgaW5zdGFuY2UgbWVtYmVycyBvZiBhIGNsYXNzIGFyZSBpdHMgaW5zdGFuY2UgbWV0aG9kcywgZ2V0dGVycywgc2V0dGVycyBhbmQgaW5zdGFuY2UgdmFyaWFibGVzLiBUaGUgc3RhdGljIG1lbWJlcnMgb2YgYSBjbGFzcyBhcmUgaXRzIHN0YXRpYyBtZXRob2RzLCBnZXR0ZXJzLCBzZXR0ZXJzIGFuZCBzdGF0aWMgdmFyaWFibGVzLiBUaGUgbWVtYmVycyBvZiBhIGNsYXNzIGFyZSBpdHMgc3RhdGljIGFuZCBpbnN0YW5jZSBtZW1iZXJzLgoKJSBBIGNsYXNzIGhhcyBhIHN0YXRpYyBzY29wZSBhbmQgYW4gaW5zdGFuY2Ugc2NvcGUuIFRoZSBlbmNsb3Npbmcgc2NvcGUgb2YgdGhlIHN0YXRpYyBzY29wZSBvZiBhIG5vbi1nZW5lcmljIGNsYXNzIGlzIHRoZSBlbmNsb3Npbmcgc2NvcGUgb2YgdGhlIGNsYXNzIGRlY2xhcmF0aW9uLiBUaGUgZW5jbG9zaW5nIHNjb3BlIG9mIHRoZSBzdGF0aWMgc2NvcGUgb2YgYSBnZW5lcmljIGNsYXNzIGlzIHRoZSB0eXBlIHBhcmFtZXRlciBzY29wZSAoXHJlZnt9KSBvZiB0aGUgZ2VuZXJpYyBjbGFzcyBkZWNsYXJhdGlvbi4KJVRoZSBlbmNsb3Npbmcgc2NvcGUgb2YgYSBjbGFzcycgaW5zdGFuY2Ugc2NvcGUgaXMgdGhlIGNsYXNzJyBzdGF0aWMgc2NvcGUuCgolVGhlIGVuY2xvc2luZyBzY29wZSBvZiBhbiBpbnN0YW5jZSBtZW1iZXIgZGVjbGFyYXRpb24gaXMgdGhlIGluc3RhbmNlIHNjb3BlIG9mIHRoZSBjbGFzcyBpbiB3aGljaCBpdCBpcyBkZWNsYXJlZC4KCiVUaGUgZW5jbG9zaW5nIHNjb3BlIG9mIGEgc3RhdGljIG1lbWJlciBkZWNsYXJhdGlvbiBpcyB0aGUgc3RhdGljIHNjb3BlIG9mIHRoZSBjbGFzcyBpbiB3aGljaCBpdCBpcyBkZWNsYXJlZC4KCgpFdmVyeSBjbGFzcyBoYXMgYSBzaW5nbGUgc3VwZXJjbGFzcyAgZXhjZXB0IGNsYXNzIFxjb2Rle09iamVjdH0gd2hpY2ggaGFzIG5vIHN1cGVyY2xhc3MuIEEgY2xhc3MgbWF5IGltcGxlbWVudCBhIG51bWJlciBvZiBpbnRlcmZhY2VzCiUsIGVpdGhlciAKYnkgZGVjbGFyaW5nIHRoZW0gaW4gaXRzIGltcGxlbWVudHMgY2xhdXNlICAoXHJlZntzdXBlcmludGVyZmFjZXN9KS4KJSBvciB2aWEgaW50ZXJmYWNlIGluamVjdGlvbiBkZWNsYXJhdGlvbnMgKFxyZWZ7aW50ZXJmYWNlSW5qZWN0aW9ufSkgb3V0c2lkZSB0aGUgY2xhc3MgZGVjbGFyYXRpb24KCgpBbiB7XGVtIGFic3RyYWN0IGNsYXNzfSBpcyAKJWVpdGhlciAKYSBjbGFzcyB0aGF0IGlzIGV4cGxpY2l0bHkgZGVjbGFyZWQgd2l0aCB0aGUgIFxBQlNUUkFDVHt9ICBtb2RpZmllciwgZWl0aGVyIGJ5IG1lYW5zIG9mIGEgY2xhc3MgZGVjbGFyYXRpb24gb3IgdmlhIGEgdHlwZSBhbGlhcyAoXHJlZnt0eXBlZGVmfSkgZm9yIGEgbWl4aW4gYXBwbGljYXRpb24gKFxyZWZ7bWl4aW5BcHBsaWNhdGlvbn0pLiBBIHtcZW0gY29uY3JldGUgY2xhc3N9IGlzIGEgY2xhc3MgdGhhdCBpcyBub3QgYWJzdHJhY3QuCiUsIG9yIGEgY2xhc3MgdGhhdCBkZWNsYXJlcyBhdCBsZWFzdCBvbmUgYWJzdHJhY3QgbWV0aG9kICAoXHJlZnthYnN0cmFjdEluc3RhbmNlTWVtYmVyc30pLgoKXHJhdGlvbmFsZXsKJVRoZSBhYnN0cmFjdCBtb2RpZmllciBmb3IgY2xhc3NlcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGluIHNjZW5hcmlvcyB3aGVyZSBhbiBhYnN0cmFjdCBjbGFzcyAkQSQgaW5oZXJpdHMgZnJvbSBhbm90aGVyIGFic3RyYWN0IGNsYXNzICRCJC4gSW4gc3VjaCBhIHNpdHVhdGlvbiwgaXQgbWF5IGJlIHRoYXQgQSQgJGl0c2VsZiBkb2VzIG5vdCBkZWNsYXJlIGFueSBhYnN0cmFjdCBtZXRob2RzLiBJbiB0aGUgYWJzZW5jZSBvZiBhbiBhYnN0cmFjdCBtb2RpZmllciBvbiB0aGUgY2xhc3MsIHRoZSBjbGFzcyB3b3VsZCBiZSBpbnRlcnByZXRlZCBhcyBhIGNvbmNyZXRlIGNsYXNzLiBIb3dldmVyLCB3CldlIHdhbnQgZGlmZmVyZW50IGJlaGF2aW9yIGZvciBjb25jcmV0ZSBjbGFzc2VzIGFuZCBhYnN0cmFjdCBjbGFzc2VzLiBJZiAkQSQgaXMgaW50ZW5kZWQgdG8gYmUgYWJzdHJhY3QsIHdlIHdhbnQgdGhlIHN0YXRpYyBjaGVja2VyIHRvIHdhcm4gYWJvdXQgYW55IGF0dGVtcHQgdG8gaW5zdGFudGlhdGUgJEEkLCBhbmQgd2UgZG8gbm90IHdhbnQgdGhlIGNoZWNrZXIgdG8gY29tcGxhaW4gYWJvdXQgdW5pbXBsZW1lbnRlZCBtZXRob2RzIGluICRBJC4gSW4gY29udHJhc3QsIGlmICRBJCBpcyBpbnRlbmRlZCB0byBiZSBjb25jcmV0ZSwgdGhlIGNoZWNrZXIgc2hvdWxkIHdhcm4gYWJvdXQgYWxsIHVuaW1wbGVtZW50ZWQgbWV0aG9kcywgYnV0IGFsbG93IGNsaWVudHMgdG8gaW5zdGFudGlhdGUgaXQgZnJlZWx5Lgp9CgpUaGUge1xlbSBpbnRlcmZhY2Ugb2YgY2xhc3MgJEMkfSBpcyBhbiBpbXBsaWNpdCBpbnRlcmZhY2UgdGhhdCBkZWNsYXJlcyBpbnN0YW5jZSBtZW1iZXJzIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgaW5zdGFuY2UgbWVtYmVycyBkZWNsYXJlZCBieSAkQyQsIGFuZCB3aG9zZSBkaXJlY3Qgc3VwZXJpbnRlcmZhY2VzIGFyZSB0aGUgZGlyZWN0IHN1cGVyaW50ZXJmYWNlcyBvZiAkQyQgKFxyZWZ7c3VwZXJpbnRlcmZhY2VzfSkuIFdoZW4gYSBjbGFzcyBuYW1lIGFwcGVhcnMgYXMgYSB0eXBlLCB0aGF0IG5hbWUgZGVub3RlcyB0aGUgaW50ZXJmYWNlIG9mIHRoZSBjbGFzcy4KCiUgbWFraW5nIGFuIGV4Y2VwdGlvbiBmb3IgdGhlIHNldHRlcnMgZ2VuZXJhdGVkIGZvciBmaW5hbCBmaWVsZHMgaXMgdGVtcHRpbmcgYnV0IHByb2JsZW1hdGljLgolIElmIGEgc3VwZXIgdHlwZSBkZWZpbmVzIGEgc2V0dGVyLCBpdCB3aWxsIGJlIG92ZXJyaWRkZW4geWV0IGhhdmUgbm8gaW1wYWN0IG9uIHRoZSBpbnRlcmZhY2UuCiUgTWF5YmUgdGhlIGZpbmFsIGZpZWxkIGhpZGVzIHRoZSBzZXR0ZXIgaW4gc2NvcGU/CiUgSSB0aGluayB0aGUgb3JpZ2luYWwgcnVsZXMgd2VyZSBiZXN0LgoKIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIGEgY2xhc3MgZGVjbGFyZXMgdHdvIG1lbWJlcnMgb2YgdGhlIHNhbWUgbmFtZS4KICUsIGV4Y2VwdCB0aGF0IGEgZ2V0dGVyIGFuZCBhIHNldHRlciBtYXkgYmUgZGVjbGFyZWQgd2l0aCB0aGUgc2FtZSBuYW1lIHByb3ZpZGVkIGJvdGggYXJlIGluc3RhbmNlIG1lbWJlcnMgb3IgYm90aCBhcmUgc3RhdGljIG1lbWJlcnMuCkl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIGEgY2xhc3MgaGFzIGFuIGluc3RhbmNlIG1lbWJlciBhbmQgYSBzdGF0aWMgbWVtYmVyICB3aXRoIHRoZSBzYW1lIG5hbWUuIAolIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIGEgZ2VuZXJpYyAoXHJlZntnZW5lcmljc30pIGNsYXNzIGRlY2xhcmVzIGEgbWVtYmVyIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvbmUgb2YgaXRzIHR5cGUgcGFyYW1ldGVycy4KClxjb21tZW50YXJ5e0hlcmUgYXJlIHNpbXBsZSBleGFtcGxlcywgdGhhdCBpbGx1c3RyYXRlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYGBoYXMgYSBtZW1iZXInJyBhbmQgYGBkZWNsYXJlcyBhIG1lbWJlcicnLiBGb3IgZXhhbXBsZSwgXGNvZGV7Qn0ge1xlbSBkZWNsYXJlc30gb25lIG1lbWJlciBuYW1lZCBcY29kZXtmfSwgYnV0IHtcZW0gaGFzfSB0d28gc3VjaCBtZW1iZXJzLiBUaGUgcnVsZXMgb2YgaW5oZXJpdGFuY2UgZGV0ZXJtaW5lIHdoYXQgbWVtYmVycyBhIGNsYXNzIGhhcy4KfQoKXGJlZ2lue2RhcnRDb2RlfQpcQ0xBU1N7fSBBIFx7CiAgXFZBUnt9IGkgPSAwOwogIFxWQVJ7fSBqOwogIGYoeCkgPSQ+JCAzOwpcfQoKXENMQVNTe30gQiBcRVhURU5EU3t9IEEgXHsKICBpbnQgaSA9IDE7IC8vICBnZXR0ZXIgaSBhbmQgc2V0dGVyIGk9IG92ZXJyaWRlIHZlcnNpb25zIGZyb20gQQogIFxTVEFUSUN7fSBqOyAvLyBjb21waWxlLXRpbWUgZXJyb3I6IHN0YXRpYyBnZXR0ZXIgXCYgc2V0dGVyIGNvbmZsaWN0IHdpdGggCiAgLy9pbnN0YW5jZSBnZXR0ZXIgXCYgc2V0dGVyCiAgCiAgLyogY29tcGlsZS10aW1lIGVycm9yOiBzdGF0aWMgbWV0aG9kIGNvbmZsaWN0cyB3aXRoIGluc3RhbmNlIG1ldGhvZCAqLwogIFxTVEFUSUN7fSBmKHgpID0kPiQgMzsgClx9ClxlbmR7ZGFydENvZGV9CgpJdCBpcyBhIGNvbXBpbGUgdGltZSBlcnJvciBpZiBhIGNsYXNzICRDJCBkZWNsYXJlcyBhIG1lbWJlciB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgJEMkLiBJdCBpcyBhIGNvbXBpbGUgdGltZSBlcnJvciBpZiBhIGdlbmVyaWMgY2xhc3MgZGVjbGFyZXMgYSB0eXBlIHZhcmlhYmxlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgY2xhc3Mgb3IgYW55IG9mIGl0cyBtZW1iZXJzIG9yIGNvbnN0cnVjdG9ycy4KClxzdWJzZWN0aW9ue0luc3RhbmNlIE1ldGhvZHN9ClxsYWJlbHtpbnN0YW5jZU1ldGhvZHN9CgpJbnN0YW5jZSBtZXRob2RzIGFyZSBmdW5jdGlvbnMgKFxyZWZ7ZnVuY3Rpb25zfSkgd2hvc2UgZGVjbGFyYXRpb25zIGFyZSBpbW1lZGlhdGVseSBjb250YWluZWQgd2l0aGluIGEgY2xhc3MgZGVjbGFyYXRpb24gYW5kIHRoYXQgYXJlIG5vdCBkZWNsYXJlZCBcU1RBVElDe30uIFRoZSBpbnN0YW5jZSBtZXRob2RzIG9mIGEgY2xhc3MgJEMkIGFyZSB0aG9zZSBpbnN0YW5jZSBtZXRob2RzIGRlY2xhcmVkIGJ5ICRDJCBhbmQgdGhlIGluc3RhbmNlIG1ldGhvZHMgaW5oZXJpdGVkIGJ5ICRDJCBmcm9tIGl0cyBzdXBlcmNsYXNzLgoKJW1ha2UgdGhlc2Ugd2FybmluZ3MgaWYgcG9zc2libGUKCkl0IGlzIGEgc3RhdGljIHdhcm5pbmcgaWYgYW4gaW5zdGFuY2UgbWV0aG9kICRtXzEkIG92ZXJyaWRlcyAgKFxyZWZ7aW5oZXJpdGFuY2VBbmRPdmVycmlkaW5nfSkgYW4gaW5zdGFuY2UgbWVtYmVyICRtXzIkIGFuZCAgJG1fMSQgaGFzIGEgZ3JlYXRlciBudW1iZXIgb2YgcmVxdWlyZWQgcGFyYW1ldGVycyB0aGFuICRtXzIkLiBJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmIGFuIGluc3RhbmNlIG1ldGhvZCAkbV8xJCBvdmVycmlkZXMgIGFuIGluc3RhbmNlIG1lbWJlciAkbV8yJCBhbmQgICRtXzEkIGhhcyBmZXdlciBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgdGhhbiAkbV8yJC4gIEl0IGlzIGEgc3RhdGljIHdhcm5pbmcgaWYgYW4gaW5zdGFuY2UgbWV0aG9kICRtXzEkIG92ZXJyaWRlcyAgYW4gaW5zdGFuY2UgbWVtYmVyICRtXzIkIGFuZCAgJG1fMSQgZG9lcyBub3QgZGVjbGFyZSBhbGwgdGhlIG5hbWVkIHBhcmFtZXRlcnMgZGVjbGFyZWQgYnkgJG1fMiQuIAoKJSBub3QgcXVpdGUgcmlnaHQuIEl0IHNob3VsZCBiZSBvayB0byBvdmVycmlkZSBhIG1ldGhvZCB0aGF0IHJlcXVpcmVzIE4gcGFyYW1ldGVycyB3aXRoIG9uZSB0aGF0IHJlcXVpcmVzIE0gPCBOIGJ1dCBhY2NlcHRzIHRoZSBvdGhlcnMgYXMgb3B0aW9uYWwuCgpJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmIGFuIGluc3RhbmNlIG1ldGhvZCAkbV8xJCBvdmVycmlkZXMgYW4gaW5zdGFuY2UgbWVtYmVyICRtXzIkIGFuZCB0aGUgdHlwZSBvZiAkbV8xJCBpcyBub3QgYSBzdWJ0eXBlIG9mIHRoZSB0eXBlIG9mICRtXzIkLiBJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmIGFuIGluc3RhbmNlIG1ldGhvZCAkbV8xJCBvdmVycmlkZXMgYW4gaW5zdGFuY2UgbWVtYmVyICRtXzIkLCAgdGhlIHNpZ25hdHVyZSBvZiAkbV8yJCBleHBsaWNpdGx5IHNwZWNpZmllcyBhIGRlZmF1bHQgdmFsdWUgZm9yIGEgZm9ybWFsIHBhcmFtZXRlciAkcCQgYW5kIHRoZSBzaWduYXR1cmUgb2YgJG1fMSQgc3BlY2lmaWVzIGEgZGlmZmVyZW50IGRlZmF1bHQgdmFsdWUgZm9yICRwJC4gSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiBhIGNsYXNzICRDJCBkZWNsYXJlcyBhbiBpbnN0YW5jZSBtZXRob2QgbmFtZWQgJG4kIGFuZCBoYXMgYSBzZXR0ZXIgbmFtZWQgJG49JC4gSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiBhIGNsYXNzICRDJCBkZWNsYXJlcyBhbiBpbnN0YW5jZSBtZXRob2QgbmFtZWQgJG4kIGFuZCBhbiBhY2Nlc3NpYmxlIHN0YXRpYyBtZW1iZXIgbmFtZWQgJG4kIGlzIGRlY2xhcmVkIGluIGEgc3VwZXJjbGFzcyBvZiAkQyQuCgolIFdvcmtzLiBJZiB0aGUgbmFtZSBpcyBwdWJsaWMsIG5vIGlzc3VlLiBJZiBpdCdzIHByaXZhdGUsIGlmIGEgc3ViY2xhc3MgaGFzIGEgY29uZmxpY3RpbmcgaW5zdCB2YXIsIGl0IGVpdGhlciBpcyBpbiB0aGUgc2FtZSBsaWIgYW5kIHdpbGwgYmUgZmxhZ2dlZCwgb3IgaXMgaW4gYW5vdGhlciBhbmQgaXMgbm90IGFuIGlzc3VlLgoKClxzdWJzdWJzZWN0aW9ue09wZXJhdG9yc30KXGxhYmVse29wZXJhdG9yc30KCntcZW0gT3BlcmF0b3JzfSBhcmUgaW5zdGFuY2UgbWV0aG9kcyB3aXRoIHNwZWNpYWwgbmFtZXMuIAoKXGJlZ2lue2dyYW1tYXJ9CntcYmYgb3BlcmF0b3JTaWduYXR1cmU6fQogICAgICAgcmV0dXJuVHlwZT8gXE9QRVJBVE9Se30gb3BlcmF0b3IgZm9ybWFsUGFyYW1ldGVyTGlzdAogICAgICAgLgogICAgICAgCiB7XGJmIG9wZXJhdG9yOn1gXH57fSc7CiAgICAgIGJpbmFyeU9wZXJhdG9yOwogICAgICBgWycgYF0nIDsKICAgICAgYFsnIGBdJyBgPScKICAgIC4KCntcYmYgYmluYXJ5T3BlcmF0b3I6fW11bHRpcGxpY2F0aXZlT3BlcmF0b3I7CiAgICAgIGFkZGl0aXZlT3BlcmF0b3I7CiAgICAgIHNoaWZ0T3BlcmF0b3I7CiAgICAgIHJlbGF0aW9uYWxPcGVyYXRvcjsKICAgICAgYD09JzsKICAgICAgYml0d2lzZU9wZXJhdG9yCiAgICAuCiBcZW5ke2dyYW1tYXJ9CgpBbiBvcGVyYXRvciBkZWNsYXJhdGlvbiBpcyBpZGVudGlmaWVkIHVzaW5nIHRoZSBidWlsdC1pbiBpZGVudGlmaWVyIChccmVme2lkZW50aWZpZXJSZWZlcmVuY2V9KSBcT1BFUkFUT1J7fS4KClRoZSBmb2xsb3dpbmcgbmFtZXMgYXJlIGFsbG93ZWQgZm9yIHVzZXItZGVmaW5lZCBvcGVyYXRvcnM6IFxjb2RleyQ8JCwgJD4kLCAkPCQ9LCAkPiQ9LCA9PSwgIC0sICssIC8sIFx+e30vLCAqLCBcJSwgJHwkLCBcXnt9LCBcJiwgJDw8JCwgJD4+JCwgIFtdPSwgW10sIFx+e30ufQoKCkl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIHRoZSBhcml0eSBvZiB0aGUgdXNlci1kZWNsYXJlZCBvcGVyYXRvciBcY29kZXtbXT19IGlzIG5vdCAyLiBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiB0aGUgYXJpdHkgb2YgYSB1c2VyLWRlY2xhcmVkIG9wZXJhdG9yIHdpdGggb25lIG9mIHRoZSBuYW1lczogIFxjb2RleyAkPCQsICQ+JCwgJDwkPSwgJD4kPSwgPT0sIC0sICssICBcfnt9LywgLywgKiwgXCUsICR8JCwgXF57fSwgXCYsICQ8PCQsICQ+PiQsIFtdfSBpcyBub3QgMS4gSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgdGhlIGFyaXR5IG9mIHRoZSB1c2VyLWRlY2xhcmVkIG9wZXJhdG9yICBcY29kZXstfSBpcyBub3QgMCBvciAxLiAKClxjb21tZW50YXJ5ewpUaGUgXGNvZGV7LX0gb3BlcmF0b3IgaXMgdW5pcXVlIGluIHRoYXQgdHdvIG92ZXJsb2FkZWQgdmVyc2lvbnMgYXJlIHBlcm1pdHRlZC4gSWYgdGhlIG9wZXJhdG9yIGhhcyBubyBhcmd1bWVudHMsIGl0IGRlbm90ZXMgdW5hcnkgbWludXMuIElmIGl0IGhhcyBhbiBhcmd1bWVudCwgaXQgZGVub3RlcyBiaW5hcnkgc3VidHJhY3Rpb24uIAp9CgpUaGUgbmFtZSBvZiB0aGUgdW5hcnkgb3BlcmF0b3IgXGNvZGV7LX0gaXMgXGNvZGV7dW5hcnktfS4KClxyYXRpb25hbGV7ClRoaXMgZGV2aWNlIGFsbG93cyB0aGUgdHdvIG1ldGhvZHMgdG8gYmUgZGlzdGluZ3Vpc2hlZCBmb3IgcHVycG9zZXMgb2YgbWV0aG9kIGxvb2t1cCwgb3ZlcnJpZGUgYW5kIHJlZmxlY3Rpb24uCn0KCkl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIHRoZSBhcml0eSBvZiB0aGUgdXNlci1kZWNsYXJlZCBvcGVyYXRvciAgXGNvZGV7IFx+e319IGlzIG5vdCAwLiAKCkl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIHRvIGRlY2xhcmUgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIGluIGFuIG9wZXJhdG9yLgoKSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIHVzZXItZGVjbGFyZWQgb3BlcmF0b3IgXGNvZGV7W109fSBpcyBleHBsaWNpdGx5IGRlY2xhcmVkIGFuZCBub3QgXFZPSUR7fS4KCgpcc3Vic2VjdGlvbntHZXR0ZXJzfSAKXGxhYmVse2dldHRlcnN9CgpHZXR0ZXJzIGFyZSBmdW5jdGlvbnMgKFxyZWZ7ZnVuY3Rpb25zfSkgIHRoYXQgYXJlIHVzZWQgdG8gcmV0cmlldmUgdGhlIHZhbHVlcyBvZiBvYmplY3QgcHJvcGVydGllcy4KClxiZWdpbntncmFtbWFyfQp7XGJmIGdldHRlclNpZ25hdHVyZTp9CiAgICAgICByZXR1cm5UeXBlPyBcR0VUe30gaWRlbnRpZmllciAKLgpcZW5ke2dyYW1tYXJ9CgolXFF7V2h5IGRvZXMgYSBnZXR0ZXIgaGF2ZSBhIGZvcm1hbCBwYXJhbWV0ZXIgbGlzdCBhdCBhbGw/fQoKSWYgbm8gcmV0dXJuIHR5cGUgaXMgc3BlY2lmaWVkLCB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIGdldHRlciBpcyAgXERZTkFNSUN7fS4KCkEgZ2V0dGVyIGRlZmluaXRpb24gdGhhdCBpcyBwcmVmaXhlZCB3aXRoIHRoZSBcU1RBVElDe30gbW9kaWZpZXIgZGVmaW5lcyBhIHN0YXRpYyBnZXR0ZXIuIE90aGVyd2lzZSwgaXQgZGVmaW5lcyBhbiBpbnN0YW5jZSBnZXR0ZXIuIFRoZSBuYW1lIG9mIHRoZSBnZXR0ZXIgaXMgZ2l2ZW4gYnkgdGhlIGlkZW50aWZpZXIgaW4gdGhlIGRlZmluaXRpb24uIFRoZSBlZmZlY3Qgb2YgYSBzdGF0aWMgZ2V0dGVyIGRlY2xhcmF0aW9uIGluIGNsYXNzICRDJCBpcyB0byBhZGQgYW4gaW5zdGFuY2UgZ2V0dGVyIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgc2lnbmF0dXJlIHRvIHRoZSBcY29kZXtUeXBlfSBvYmplY3QgZm9yIGNsYXNzICRDJCB0aGF0IGZvcndhcmRzIChccmVme2Z1bmN0aW9uRGVjbGFyYXRpb25zfSkgIHRvIHRoZSBzdGF0aWMgZ2V0dGVyLgoKJUl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIGEgZ2V0dGVyYHMgZm9ybWFsIHBhcmFtZXRlciBsaXN0IGlzIG5vdCBlbXB0eS4KClRoZSBpbnN0YW5jZSBnZXR0ZXJzIG9mIGEgY2xhc3MgJEMkIGFyZSB0aG9zZSBpbnN0YW5jZSBnZXR0ZXJzIGRlY2xhcmVkIGJ5ICRDJCwgZWl0aGVyIGltcGxpY2l0bHkgb3IgZXhwbGljaXRseSwgYW5kIHRoZSBpbnN0YW5jZSBnZXR0ZXJzIGluaGVyaXRlZCBieSAkQyQgZnJvbSBpdHMgc3VwZXJjbGFzcy4gVGhlIHN0YXRpYyBnZXR0ZXJzIG9mIGEgY2xhc3MgJEMkIGFyZSB0aG9zZSBzdGF0aWMgZ2V0dGVycyBkZWNsYXJlZCBieSAkQyQuCgpJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBhIGNsYXNzIGhhcyBib3RoIGEgZ2V0dGVyIGFuZCBhIG1ldGhvZCB3aXRoIHRoZSBzYW1lIG5hbWUuIFRoaXMgcmVzdHJpY3Rpb24gaG9sZHMgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBnZXR0ZXIgaXMgZGVmaW5lZCBleHBsaWNpdGx5IG9yIGltcGxpY2l0bHksIG9yIHdoZXRoZXIgdGhlIGdldHRlciBvciB0aGUgbWV0aG9kIGFyZSBpbmhlcml0ZWQgb3Igbm90LgoKXGNvbW1lbnRhcnl7ClRoaXMgaW1wbGllcyB0aGF0IGEgZ2V0dGVyIGNhbiBuZXZlciBvdmVycmlkZSBhIG1ldGhvZCwgYW5kIGEgbWV0aG9kIGNhbiBuZXZlciBvdmVycmlkZSBhIGdldHRlciBvciBmaWVsZC4gCn0KCkl0IGlzIGEgc3RhdGljIHdhcm5pbmcgaWYgdGhlIHJldHVybiB0eXBlIG9mIGEgZ2V0dGVyIGlzIFxWT0lELgpJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmIGEgZ2V0dGVyICRtXzEkIG92ZXJyaWRlcyAgKFxyZWZ7aW5oZXJpdGFuY2VBbmRPdmVycmlkaW5nfSkgYSBnZXR0ZXIgCiRtXzIkIGFuZCB0aGUgdHlwZSBvZiAkbV8xJCBpcyBub3QgYSBzdWJ0eXBlIG9mIHRoZSB0eXBlIG9mICRtXzIkLiAgIAoKSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiBhIGNsYXNzICBkZWNsYXJlcyBhIHN0YXRpYyBnZXR0ZXIgbmFtZWQgJHYkIGFuZCBhbHNvIGhhcyBhIG5vbi1zdGF0aWMgc2V0dGVyIG5hbWVkICR2PSQuIEl0IGlzIGEgc3RhdGljIHdhcm5pbmcgaWYgYSBjbGFzcyAkQyQgZGVjbGFyZXMgYW4gaW5zdGFuY2UgZ2V0dGVyIG5hbWVkICR2JCBhbmQgYW4gYWNjZXNzaWJsZSBzdGF0aWMgbWVtYmVyIG5hbWVkICR2JCBvciAkdj0kIGlzIGRlY2xhcmVkIGluIGEgc3VwZXJjbGFzcyBvZiAkQyQuIFRoZXNlIHdhcm5pbmdzIG11c3QgYmUgaXNzdWVkIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgZ2V0dGVycyBvciBzZXR0ZXJzIGFyZSBkZWNsYXJlZCBleHBsaWNpdGx5IG9yIGltcGxpY2l0bHkuCgpcc3Vic2VjdGlvbntTZXR0ZXJzfQpcbGFiZWx7c2V0dGVyc30KClNldHRlcnMgYXJlIGZ1bmN0aW9ucyAoXHJlZntmdW5jdGlvbnN9KSB0aGF0IGFyZSB1c2VkIHRvIHNldCB0aGUgdmFsdWVzIG9mIG9iamVjdCBwcm9wZXJ0aWVzLgoKJSB3aGF0IGFib3V0IHRvcCBsZXZlbCBvbmVzPyBTYW1lIGZvciBnZXR0ZXJzCgpcYmVnaW57Z3JhbW1hcn0Ke1xiZiBzZXR0ZXJTaWduYXR1cmU6fQogICAgICAgcmV0dXJuVHlwZT8gXFNFVHt9IGlkZW50aWZpZXIgZm9ybWFsUGFyYW1ldGVyTGlzdAouClxlbmR7Z3JhbW1hcn0KCklmIG5vIHJldHVybiB0eXBlIGlzIHNwZWNpZmllZCwgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBzZXR0ZXIgaXMgIFxEWU5BTUlDe30uCgpBIHNldHRlciBkZWZpbml0aW9uIHRoYXQgaXMgcHJlZml4ZWQgd2l0aCB0aGUgXFNUQVRJQ3t9IG1vZGlmaWVyIGRlZmluZXMgYSBzdGF0aWMgc2V0dGVyLiBPdGhlcndpc2UsIGl0IGRlZmluZXMgYW4gaW5zdGFuY2Ugc2V0dGVyLiBUaGUgbmFtZSBvZiBhIHNldHRlciBpcyAgb2J0YWluZWQgYnkgYXBwZW5kaW5nIHRoZSAgc3RyaW5nIGA9JyAgdG8gdGhlIGlkZW50aWZpZXIgZ2l2ZW4gaW4gaXRzIHNpZ25hdHVyZS4gVGhlIGVmZmVjdCBvZiBhIHN0YXRpYyBzZXR0ZXIgZGVjbGFyYXRpb24gaW4gY2xhc3MgJEMkIGlzIHRvIGFkZCBhbiBpbnN0YW5jZSBzZXR0ZXIgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZCBzaWduYXR1cmUgdG8gdGhlIFxjb2Rle1R5cGV9IG9iamVjdCBmb3IgY2xhc3MgJEMkIHRoYXQgZm9yd2FyZHMgKFxyZWZ7ZnVuY3Rpb25EZWNsYXJhdGlvbnN9KSAgdG8gdGhlIHN0YXRpYyBzZXR0ZXIuCgpcY29tbWVudGFyeXtIZW5jZSwgYSBzZXR0ZXIgbmFtZSBjYW4gbmV2ZXIgY29uZmxpY3Qgd2l0aCwgb3ZlcnJpZGUgb3IgYmUgb3ZlcnJpZGRlbiBieSBhIGdldHRlciBvciBtZXRob2QufQoKVGhlIGluc3RhbmNlIHNldHRlcnMgb2YgYSBjbGFzcyAkQyQgYXJlIHRob3NlIGluc3RhbmNlIHNldHRlcnMgZGVjbGFyZWQgYnkgJEMkIGVpdGhlciBpbXBsaWNpdGx5IG9yIGV4cGxpY2l0bHksIGFuZCB0aGUgaW5zdGFuY2Ugc2V0dGVycyBpbmhlcml0ZWQgYnkgJEMkIGZyb20gaXRzIHN1cGVyY2xhc3MuIFRoZSBzdGF0aWMgc2V0dGVycyBvZiBhIGNsYXNzICRDJCBhcmUgdGhvc2Ugc3RhdGljIHNldHRlcnMgZGVjbGFyZWQgYnkgJEMkLgoKSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgYSBzZXR0ZXIncyBmb3JtYWwgcGFyYW1ldGVyIGxpc3QgZG9lcyBub3QgY29uc2lzdCBvZiBleGFjdGx5IG9uZSByZXF1aXJlZCBmb3JtYWwgcGFyYW1ldGVyICRwJC4gIFxyYXRpb25hbGV7V2UgY291bGQgZW5mb3JjZSB0aGlzIHZpYSB0aGUgZ3JhbW1hciwgYnV0IHdlYGQgaGF2ZSB0byBzcGVjaWZ5IHRoZSBldmFsdWF0aW9uIHJ1bGVzIGluIHRoYXQgY2FzZS59CgolSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgYSBjbGFzcyBoYXMgYm90aCBhIHNldHRlciBhbmQgYSBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lLiBUaGlzIHJlc3RyaWN0aW9uIGhvbGRzIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgc2V0dGVyIGlzIGRlZmluZWQgZXhwbGljaXRseSBvciBpbXBsaWNpdGx5LCBvciB3aGV0aGVyIHRoZSBzZXR0ZXIgb3IgdGhlIG1ldGhvZCBhcmUgaW5oZXJpdGVkIG9yIG5vdC4KCkl0IGlzIGEgc3RhdGljIHdhcm5pbmcgaWYgYSBzZXR0ZXIgZGVjbGFyZXMgYSByZXR1cm4gdHlwZSBvdGhlciB0aGFuIFxWT0lEe30uCkl0IGlzIGEgc3RhdGljIHdhcm5pbmcgaWYgYSBzZXR0ZXIgJG1fMSQgb3ZlcnJpZGVzICAoXHJlZntpbmhlcml0YW5jZUFuZE92ZXJyaWRpbmd9KSBhIHNldHRlciAkbV8yJCBhbmQgdGhlIHR5cGUgb2YgJG1fMSQgaXMgbm90IGEgc3VidHlwZSBvZiB0aGUgdHlwZSBvZiAkbV8yJC4gSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiBhIGNsYXNzIGhhcyBhIHNldHRlciBuYW1lZCAkdj0kIHdpdGggYXJndW1lbnQgdHlwZSAkVCQgYW5kIGEgZ2V0dGVyIG5hbWVkICR2JCB3aXRoIHJldHVybiB0eXBlICRTJCwgYW5kICRUJCBtYXkgbm90IGJlIGFzc2lnbmVkIHRvICRTJC4gCgpJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmIGEgY2xhc3MgIGRlY2xhcmVzIGEgc3RhdGljIHNldHRlciBuYW1lZCAkdj0kIGFuZCBhbHNvIGhhcyBhIG5vbi1zdGF0aWMgbWVtYmVyIG5hbWVkICR2JC4gSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiBhIGNsYXNzICRDJCBkZWNsYXJlcyBhbiBpbnN0YW5jZSBzZXR0ZXIgbmFtZWQgJHY9JCBhbmQgYW4gYWNjZXNzaWJsZSBzdGF0aWMgbWVtYmVyIG5hbWVkICR2PSQgb3IgJHYkIGlzIGRlY2xhcmVkIGluIGEgc3VwZXJjbGFzcyBvZiAkQyQuCgpUaGVzZSB3YXJuaW5ncyBtdXN0IGJlIGlzc3VlZCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGdldHRlcnMgb3Igc2V0dGVycyBhcmUgZGVjbGFyZWQgZXhwbGljaXRseSBvciBpbXBsaWNpdGx5LgoKXHN1YnNlY3Rpb257QWJzdHJhY3QgSW5zdGFuY2UgTWVtYmVyc30KXGxhYmVse2Fic3RyYWN0SW5zdGFuY2VNZW1iZXJzfQoKQW4ge1xlbSBhYnN0cmFjdCBtZXRob2R9IChyZXNwZWN0aXZlbHksIHtcZW0gYWJzdHJhY3QgZ2V0dGVyfSBvciB7XGVtIGFic3RyYWN0IHNldHRlcil9IGlzIGFuIGluc3RhbmNlIG1ldGhvZCwgZ2V0dGVyIG9yIHNldHRlciB0aGF0IGlzIG5vdCBkZWNsYXJlZCBcRVhURVJOQUx7fSBhbmQgZG9lcyBub3QgIHByb3ZpZGUgYW4gaW1wbGVtZW50YXRpb24uIEEge1xlbSBjb25jcmV0ZSBtZXRob2R9IChyZXNwZWN0aXZlbHksIHtcZW0gY29uY3JldGUgZ2V0dGVyfSBvciB7XGVtIGNvbmNyZXRlIHNldHRlcil9IGlzIGFuIGluc3RhbmNlIG1ldGhvZCwgZ2V0dGVyIG9yIHNldHRlciB0aGF0IGlzIG5vdCBhYnN0cmFjdC4KJVRoZSBkZWNsYXJhdGlvbiBvZiBhbiBhYnN0cmFjdCBtZXRob2QgaXMgcHJlZml4ZWQgYnkgdGhlIGJ1aWx0LWluIGlkZW50aWZpZXIgKFxyZWZ7aWRlbnRpZmllclJlZmVyZW5jZX0pIFxBQlNUUkFDVHt9LgoKXHJhdGlvbmFsZXsKRWFybGllciB2ZXJzaW9ucyBvZiBEYXJ0IHJlcXVpcmVkIHRoYXQgYWJzdHJhY3QgbWVtYmVycyBiZSBpZGVudGlmaWVkIGJ5IHByZWZpeGluZyB0aGVtIHdpdGggdGhlIG1vZGlmaWVyIFxBQlNUUkFDVHt9LiAgVGhlIGVsaW1pbmF0aW9uIG9mIHRoaXMgcmVxdWlyZW1lbnQgaXMgbW90aXZhdGVkIGJ5IHRoZSBkZXNpcmUgdG8gdXNlIGFic3RyYWN0IGNsYXNzZXMgYXMgaW50ZXJmYWNlcy4gRXZlcnkgRGFydCBjbGFzcyBpbmR1Y2VzIGFuIGltcGxpY2l0IGludGVyZmFjZS4KClVzaW5nIGFuIGFic3RyYWN0IGNsYXNzIGluc3RlYWQgb2YgYW4gaW50ZXJmYWNlIGhhcyBpbXBvcnRhbnQgYWR2YW50YWdlcy4gQW4gYWJzdHJhY3QgY2xhc3MgY2FuIHByb3ZpZGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnM7IGl0IGNhbiBhbHNvIHByb3ZpZGUgc3RhdGljIG1ldGhvZHMsIG9idmlhdGluZyB0aGUgbmVlZCBmb3Igc2VydmljZSBjbGFzc2VzIHN1Y2ggYXMgXGNvZGV7Q29sbGVjdGlvbnN9IG9yIFxjb2Rle0xpc3RzfSwgd2hvc2UgZW50aXJlIHB1cnBvc2UgaXMgdG8gZ3JvdXAgdXRpbGl0aWVzIHJlbGF0ZWQgdG8gYSBnaXZlbiB0eXBlLgoKRWxpbWluYXRpbmcgdGhlIHJlcXVpcmVtZW50IGZvciBhbiBleHBsaWNpdCBtb2RpZmllciBvbiBtZW1iZXJzIG1ha2VzIGFic3RyYWN0IGNsYXNzZXMgbW9yZSBjb25jaXNlLCBtYWtpbmcgYWJzdHJhY3QgY2xhc3NlcyBhbiBhdHRyYWN0aXZlIHN1YnN0aXR1dGUgZm9yICBpbnRlcmZhY2UgZGVjbGFyYXRpb25zLgp9CgpcY29tbWVudGFyeSB7SW52b2tpbmcgYW4gYWJzdHJhY3QgbWV0aG9kLCBnZXR0ZXIgb3Igc2V0dGVyIHJlc3VsdHMgaW4gYW4gaW52b2NhdGlvbiBvZiAgXGNke25vU3VjaE1ldGhvZH0gZXhhY3RseSBhcyBpZiB0aGUgZGVjbGFyYXRpb24gZGlkIG5vdCBleGlzdCwgdW5sZXNzIGEgc3VpdGFibGUgbWVtYmVyICRhJCBpcyBhdmFpbGFibGUgaW4gYSBzdXBlcmNsYXNzLCBpbiB3aGljaCBjYXNlICRhJCBpcyBpbnZva2VkLiAgVGhlIG5vcm1hdGl2ZSBzcGVjaWZpY2F0aW9uIGZvciB0aGlzIGFwcGVhcnMgdW5kZXIgdGhlIGRlZmluaXRpb25zIG9mIGxvb2t1cCBmb3IgbWV0aG9kcywgZ2V0dGVycyBhbmQgc2V0dGVycy4KfQoKJSBzbyBkb2VzIGFuIGFic3RyYWN0IG1ldGhvZCBvdmVycmlkZSBhIG1ldGhvZCBpbiBhIHN1cGVyY2xhc3Mgb3Igbm90PyBEb2VzIHRoZSBzdXBlcmNsYXNzIG1ldGhvZCBnZXQgaW5oZXJpdGVkIG9yIG5vdD8gIFRoaXMgZ2VuZXJhbGx5IG1ha2VzIHRoZSBzcGVjIGluY29uc2lzdGVudCwgYXMgdGhlcmUgaXMgbm8gc2ltcGxlIGFuc3dlci4KJSBGb3IgZXhhbXBsZSAtIGlmIHdlIHNheSBpdCBkb2VzIG5vdCBvdmVycmlkZSwgdGhlbiB0aGUgc3VwZXJjbGFzcyBtZW1iZXIgaXMgaW5oZXJpdGVkLCBpbiB3aGljaCBjYXNlIHRoZSBydWxlcyBmb3Igd2FybmluZyBicmVhayBkb3duLCBhbmQgYWxzbyB0aGVyZSBpcyBxdWVzdGlvbiBvZiB3aGV0aGVyIHRoZXJlIGFyZSB0d28gZGVmaW5pdGlvbnMgb2YgdGhlIHNhbWUgbmFtZS4KJSBCdXQgaWYgd2UgZG8gb3ZlcnJpZGUsIG1ldGhvZCBsb29rdXAgcnVsZXMgYnJlYWsgZG93bi4gIFNvIHNldmVyYWwgdGhpbmdzIG5lZWQgcmV2aXNpdGluZy4KClxyYXRpb25hbGV7ClRoZSBwdXJwb3NlIG9mIGFuIGFic3RyYWN0IG1ldGhvZCBpcyB0byBwcm92aWRlIGEgZGVjbGFyYXRpb24gZm9yIHB1cnBvc2VzIHN1Y2ggYXMgdHlwZSBjaGVja2luZyBhbmQgcmVmbGVjdGlvbi4gSW4gY2xhc3NlcyB1c2VkIGFzIG1peGlucywgaXQgaXMgb2Z0ZW4gdXNlZnVsIHRvIGludHJvZHVjZSBzdWNoIGRlY2xhcmF0aW9ucyBmb3IgbWV0aG9kcyB0aGF0IHRoZSBtaXhpbiBleHBlY3RzIHdpbGwgYmUgcHJvdmlkZWQgYnkgdGhlIHN1cGVyY2xhc3MgdGhlIG1peGluIGlzIGFwcGxpZWQgdG8uCn0KJWFsd2F5cyByZXN1bHRzIGluIGEgcnVuLXRpbWUgZXJyb3IuIFRoaXMgbXVzdCBiZSBcY29kZXtOb1N1Y2hNZXRob2RFcnJvcn0gb3IgYW4gaW5zdGFuY2Ugb2YgYSBzdWJjbGFzcyBvZiBcY29kZXtOb1N1Y2hNZXRob2RFcnJvcn0sIHN1Y2ggYXMgXGNvZGV7QWJzdHJhY3RNZXRob2RFcnJvcn0uCgpJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmIGFuIGFic3RyYWN0IG1lbWJlciBpcyBkZWNsYXJlZCBvciBpbmhlcml0ZWQgaW4gYSBjb25jcmV0ZSBjbGFzcyB1bmxlc3MgdGhhdCBtZW1iZXIgb3ZlcnJpZGVzIGEgY29uY3JldGUgb25lLgoKXHJhdGlvbmFsZSB7CldlIHdpc2ggdG8gd2FybiBpZiBvbmUgZGVjbGFyZXMgYSBjb25jcmV0ZSBjbGFzcyB3aXRoIGFic3RyYWN0IG1lbWJlcnMuIEhvd2V2ZXIsICBjb2RlIGxpa2UgdGhlIGZvbGxvd2luZyBzaG91bGQgd29yayB3aXRob3V0IHdhcm5pbmdzOgp9CgpcYmVnaW57ZGFydENvZGV9CiBjbGFzcyBCYXNlIFx7CiAgICBpbnQgZ2V0IG9uZSA9JD4kIDE7CiAgXH0KCiAgYWJzdHJhY3QgY2xhc3MgTWl4IFx7CiAgICBpbnQgZ2V0IG9uZTsKICAgIGludCBnZXQgdHdvID0kPiQgb25lICsgb25lOwogIFx9CgogIGNsYXNzIEMgZXh0ZW5kcyBCYXNlIHdpdGggTWl4IFx7CiAgXH0KXH0KXGVuZHtkYXJ0Q29kZX0KClxyYXRpb25hbGV7QXQgcnVuIHRpbWUsIHRoZSBjb25jcmV0ZSBtZXRob2QgXGNke29uZX0gZGVjbGFyZWQgaW4gXGNke0Jhc2V9IHdpbGwgYmUgZXhlY3V0ZWQsIGFuZCBubyBwcm9ibGVtIHNob3VsZCBhcmlzZS4gVGhlcmVmb3JlIG5vIHdhcm5pbmcgc2hvdWxkIGJlIGlzc3VlZCBhbmQgc28gd2Ugc3VwcHJlc3Mgd2FybmluZ3MgaWYgYSBjb3JyZXNwb25kaW5nIGNvbmNyZXRlIG1lbWJlciBleGlzdHMgaW4gdGhlIGhpZXJhcmNoeS4gfQoKXHN1YnNlY3Rpb257SW5zdGFuY2UgVmFyaWFibGVzfQpcbGFiZWx7aW5zdGFuY2VWYXJpYWJsZXN9CgpJbnN0YW5jZSB2YXJpYWJsZXMgYXJlIHZhcmlhYmxlcyB3aG9zZSBkZWNsYXJhdGlvbnMgYXJlIGltbWVkaWF0ZWx5IGNvbnRhaW5lZCB3aXRoaW4gYSBjbGFzcyBkZWNsYXJhdGlvbiBhbmQgdGhhdCBhcmUgbm90IGRlY2xhcmVkIFxTVEFUSUN7fS4gVGhlIGluc3RhbmNlIHZhcmlhYmxlcyBvZiBhIGNsYXNzICRDJCBhcmUgdGhvc2UgaW5zdGFuY2UgdmFyaWFibGVzIGRlY2xhcmVkIGJ5ICRDJCBhbmQgdGhlIGluc3RhbmNlIHZhcmlhYmxlcyBpbmhlcml0ZWQgYnkgJEMkIGZyb20gaXRzIHN1cGVyY2xhc3MuCgpJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBhbiBpbnN0YW5jZSB2YXJpYWJsZSBpcyBkZWNsYXJlZCB0byBiZSBjb25zdGFudC4KClxyYXRpb25hbGV7ClRoZSBub3Rpb24gb2YgYSBjb25zdGFudCBpbnN0YW5jZSB2YXJpYWJsZSBpcyBzdWJ0bGUgYW5kIGNvbmZ1c2luZyB0byBwcm9ncmFtbWVycy4KQW4gaW5zdGFuY2UgdmFyaWFibGUgaXMgaW50ZW5kZWQgdG8gdmFyeSBwZXIgaW5zdGFuY2UuIEEgY29uc3RhbnQgaW5zdGFuY2UgdmFyaWFibGUgd291bGQgaGF2ZSB0aGUgc2FtZSB2YWx1ZSBmb3IgYWxsIGluc3RhbmNlcywgYW5kIGFzIHN1Y2ggaXMgYWxyZWFkeSBhIGR1YmlvdXMgaWRlYS4KClRoZSBsYW5ndWFnZSBjb3VsZCBpbnRlcnByZXQgY29uc3QgaW5zdGFuY2UgdmFyaWFibGUgZGVjbGFyYXRpb25zIGFzIGluc3RhbmNlIGdldHRlcnMgdGhhdCByZXR1cm4gYSBjb25zdGFudC4gIEhvd2V2ZXIsIGEgY29uc3RhbnQgaW5zdGFuY2UgdmFyaWFibGUgY291bGQgbm90IGJlIHRyZWF0ZWQgYXMgYSB0cnVlIGNvbXBpbGUgdGltZSBjb25zdGFudCwgYXMgaXRzIGdldHRlciB3b3VsZCBiZSBzdWJqZWN0IHRvIG92ZXJyaWRpbmcuICAgCgpHaXZlbiB0aGF0IHRoZSB2YWx1ZSBkb2VzIG5vdCBkZXBlbmQgb24gIHRoZSBpbnN0YW5jZSwgaXQgaXMgYmV0dGVyIHRvIHVzZSBhIHN0YXRpYyBjbGFzcyB2YXJpYWJsZS4KQW4gaW5zdGFuY2UgZ2V0dGVyIGZvciBpdCBjYW4gYWx3YXlzIGJlIGRlZmluZWQgbWFudWFsbHkgaWYgZGVzaXJlZC4KfQoKCiVBbiBpbnN0YW5jZSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBvZiBvbmUgb2YgdGhlIGZvcm1zIFxjb2RleyRUJCAkdiQ7fSwgXGNvZGV7XEZJTkFMe30gJFQkICR2JDt9ICwgIFxjb2RleyRUJCAkdiQgPSAkZSQ7fSAsICBcY29kZXtcQ09OU1R7fSAkVCQgJHYkID0gJGUkO30gb3IgXGNvZGV7XEZJTkFMe30gJFQkICR2JCA9ICRlJDt9ICBhbHdheXMgaW5kdWNlcyBhbiBpbXBsaWNpdCBnZXR0ZXIgZnVuY3Rpb24gKFxyZWZ7Z2V0dGVyc30pIHdpdGggc2lnbmF0dXJlIAoKJSRUJCBcR0VUe30gJHYkCgold2hvc2UgaW52b2NhdGlvbiBldmFsdWF0ZXMgdG8gdGhlIHZhbHVlIHN0b3JlZCBpbiAkdiQuCgolQW4gaW5zdGFuY2UgdmFyaWFibGUgZGVjbGFyYXRpb24gIG9mIG9uZSBvZiB0aGUgZm9ybXMgXGNvZGV7XFZBUnt9ICR2JDt9LCBcY29kZXtcRklOQUx7fSAkdiQ7fSwgXGNvZGV7XFZBUnt9ICR2JCA9ICRlJDt9ICwgIFxjb2Rle1xDT05TVHt9ICR2JCA9ICRlJDt9IG9yIFxjb2Rle1xGSU5BTHt9ICR2JCA9ICRlJDt9ICAgYWx3YXlzIGluZHVjZXMgYW4gaW1wbGljaXQgZ2V0dGVyIGZ1bmN0aW9uIHdpdGggc2lnbmF0dXJlIAoKJVxHRVR7fSAkdiQKCiV3aG9zZSBpbnZvY2F0aW9uIGV2YWx1YXRlcyB0byB0aGUgdmFsdWUgc3RvcmVkIGluICR2JC4KCiVcY29tbWVudGFyeXtHZXR0ZXJzIGFyZSBpbnRyb2R1Y2VkIGZvciBhbGwgaW5zdGFuY2UgYW5kIHN0YXRpYyB2YXJpYWJsZXMgKFxyZWZ7c3RhdGljVmFyaWFibGVzfSksIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGV5IGFyZSBjb25zdC9maW5hbCBvciBub3QufQoKJUEgbm9uLWZpbmFsIGluc3RhbmNlIHZhcmlhYmxlIGRlY2xhcmF0aW9uICBvZiB0aGUgZm9ybSBcY29kZXskVCQgJHYkO30gb3IgdGhlIGZvcm0gIFxjb2RleyRUJCAkdiQgPSAkZSQ7fSAgIGFsd2F5cyBpbmR1Y2VzIGFuIGltcGxpY2l0IHNldHRlciBmdW5jdGlvbiAoXHJlZntzZXR0ZXJzfSkgd2l0aCBzaWduYXR1cmUgCgolXFZPSUR7fSBcU0VUe30gJHY9KFQkICR4KSQKCiV3aG9zZSBleGVjdXRpb24gc2V0cyB0aGUgdmFsdWUgb2YgJHYkIHRvIHRoZSBpbmNvbWluZyBhcmd1bWVudCAkeCQuCgolQSBub24tZmluYWwgaW5zdGFuY2UgdmFyaWFibGUgZGVjbGFyYXRpb24gIG9mIHRoZSBmb3JtIFxjb2Rle1xWQVJ7fSAkdiQ7fSBvciB0aGUgZm9ybSAgXGNvZGV7XFZBUnt9ICR2JCA9ICRlJDt9ICAgYWx3YXlzIGluZHVjZXMgYW4gaW1wbGljaXQgc2V0dGVyIGZ1bmN0aW9uIHdpdGggc2lnbmF0dXJlIAoKJVxTRVR7fSAkdj0oeCkkCgold2hvc2UgZXhlY3V0aW9uIHNldHMgdGhlIHZhbHVlIG9mICR2JCB0byB0aGUgaW5jb21pbmcgYXJndW1lbnQgJHgkLgoKJSBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvci93YXJuaW5nIGlmIGEgY2xhc3MgJEMkIGRlY2xhcmVzIGEgZmluYWwgaW5zdGFuY2UgdmFyaWFibGUgJHYkIGFuZCAkQyQgaW5oZXJpdHMgYSBzZXR0ZXIgJHY9JC4KCgpcc3Vic2VjdGlvbntDb25zdHJ1Y3RvcnN9ClxsYWJlbHtjb25zdHJ1Y3RvcnN9CgpBIHtcZW0gY29uc3RydWN0b3J9IGlzIGEgc3BlY2lhbCBmdW5jdGlvbiB0aGF0IGlzIHVzZWQgaW4gaW5zdGFuY2UgY3JlYXRpb24gZXhwcmVzc2lvbnMgKFxyZWZ7aW5zdGFuY2VDcmVhdGlvbn0pIHRvIHByb2R1Y2Ugb2JqZWN0cy4gQ29uc3RydWN0b3JzIG1heSBiZSBnZW5lcmF0aXZlIChccmVme2dlbmVyYXRpdmVDb25zdHJ1Y3RvcnN9KSBvciB0aGV5IG1heSBiZSBmYWN0b3JpZXMgKFxyZWZ7ZmFjdG9yaWVzfSkuIAoKQSB7XGVtIGNvbnN0cnVjdG9yIG5hbWV9IGFsd2F5cyBiZWdpbnMgd2l0aCB0aGUgbmFtZSBvZiBpdHMgaW1tZWRpYXRlbHkgZW5jbG9zaW5nIGNsYXNzLCBhbmQgbWF5IG9wdGlvbmFsbHkgYmUgZm9sbG93ZWQgYnkgYSBkb3QgYW5kIGFuIGlkZW50aWZpZXIgJGlkJC4gSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgJGlkJCBpcyB0aGUgbmFtZSBvZiBhIG1lbWJlciAgZGVjbGFyZWQgaW4gdGhlIGltbWVkaWF0ZWx5IGVuY2xvc2luZyBjbGFzcy4gSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgdGhlIG5hbWUgb2YgYSAgY29uc3RydWN0b3IgaXMgbm90IGEgY29uc3RydWN0b3IgbmFtZS4gCgoKJSBJbiB3aGF0IHNjb3BlIGRvIGNvbnN0cnVjdG9ycyBnbz8gVGhlIHNpbXBsZSBuYW1lcyBvZiBuYW1lZCBjb25zdHJ1Y3RvcnMgZ28gIGluIHRoZSBzdGF0aWMgc2NvcGUgb2YgdGhlIGNsYXNzLiBVbm5hbWVkIG9uZXMgZ28gbm93aGVyZSwgYnV0IHdlIHVzZSB0aGUgY2xhc3MgbmFtZSB0byByZWZlciB0byB0aGVtOyB0aGUgY2xhc3MgbmFtZSBjb3VsZCBhbHNvIGluIHRoZSBzdGF0aWMgc2NvcGUgb2YgdGhlIGNsYXNzIGFzIHdlbGwgdG8gcHJldmVudCB3ZWlyZCBlcnJvcnMsIG9yIHdlIGNvdWxkIGJhbiBpdCBleHBsaWNpdGx5IGFuZCBhdm9pZGluZyBkdXBsaWNhdGlvbi4gU2ltaWxhcmx5LCB0aGUgaW5zdGFuY2Ugc2NvcGUgY291bGQgY29udGFpbiB0aGUgY29uc3RydWN0b3IgbmFtZXMgYW5kIGNsYXNzIG5hbWUsIG9yIHdlIGNvdWxkIGhhdmUgc3BlY2lhbCBydWxlcyB0byBwcmV2ZW50IGNvbGxpc2lvbnMgYmV0d2VlbiBpbnN0YW5jZSBtZW1iZXJzIGFuZCBjb25zdHJ1Y3RvcnMgb3IgdGhlIGNsYXNzLgoKJSBUaGUgZW5jbG9zaW5nIHNjb3BlIG9mIGEgZ2VuZXJhdGl2ZSBjb25zdHJ1Y3RvciBpcyB0aGUgaW5zdGFuY2Ugc2NvcGUgb2YgdGhlIGNsYXNzIGluIHdoaWNoIGl0IGlzIGRlY2xhcmVkIChidXQgd2hhdCBhYm91dCByZWRpcmVjdGluZz8pIAoKSWZmIG5vIGNvbnN0cnVjdG9yIGlzIHNwZWNpZmllZCBmb3IgYSBjbGFzcyAkQyQsIGl0IGltcGxpY2l0bHkgaGFzIGEgZGVmYXVsdCBjb25zdHJ1Y3RvciBcY29kZXtDKCkgOiBcU1VQRVJ7fSgpIFx7XH19LCB1bmxlc3MgJEMkIGlzIGNsYXNzIFxjb2Rle09iamVjdH0uCgpcc3Vic3Vic2VjdGlvbntHZW5lcmF0aXZlIENvbnN0cnVjdG9yc30KXGxhYmVse2dlbmVyYXRpdmVDb25zdHJ1Y3RvcnN9CgpBIHtcZW0gZ2VuZXJhdGl2ZSBjb25zdHJ1Y3Rvcn0gY29uc2lzdHMgb2YgYSBjb25zdHJ1Y3RvciBuYW1lLCBhIGNvbnN0cnVjdG9yIHBhcmFtZXRlciBsaXN0LCBhbmQgZWl0aGVyIGEgcmVkaXJlY3QgY2xhdXNlIG9yIGFuICBpbml0aWFsaXplciBsaXN0IGFuZCBhbiBvcHRpb25hbCBib2R5LgoKXGJlZ2lue2dyYW1tYXJ9CntcYmYgY29uc3RydWN0b3JTaWduYXR1cmU6fQogICAgICBpZGVudGlmaWVyIChge1xlc2NhcGVncmFtbWFyIC59JyBpZGVudGlmaWVyKT8gZm9ybWFsUGFyYW1ldGVyTGlzdAogICAgLgogXGVuZHtncmFtbWFyfQoKQSB7XGVtIGNvbnN0cnVjdG9yIHBhcmFtZXRlciBsaXN0fSBpcyBhIHBhcmVudGhlc2l6ZWQsIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGZvcm1hbCBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLiBBIHtcZW0gZm9ybWFsIGNvbnN0cnVjdG9yIHBhcmFtZXRlcn0gaXMgZWl0aGVyIGEgZm9ybWFsIHBhcmFtZXRlciAoXHJlZntmb3JtYWxQYXJhbWV0ZXJzfSkgb3IgYW4gaW5pdGlhbGl6aW5nIGZvcm1hbC4gQW4ge1xlbSBpbml0aWFsaXppbmcgZm9ybWFsfSBoYXMgdGhlIGZvcm0gXGNvZGV7XFRISVN7fS5pZH0sIHdoZXJlIFxjb2Rle2lkfSBpcyB0aGUgbmFtZSBvZiBhbiBpbnN0YW5jZSB2YXJpYWJsZSBvZiB0aGUgaW1tZWRpYXRlbHkgZW5jbG9zaW5nIGNsYXNzLiAgSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgXGNvZGV7aWR9IGlzIG5vdCBhbiBpbnN0YW5jZSB2YXJpYWJsZSBvZiB0aGUgaW1tZWRpYXRlbHkgZW5jbG9zaW5nIGNsYXNzLiBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBhbiBpbml0aWFsaXppbmcgZm9ybWFsIGlzIHVzZWQgYnkgYSBmdW5jdGlvbiBvdGhlciB0aGFuIGEgbm9uLXJlZGlyZWN0aW5nIGdlbmVyYXRpdmUgY29uc3RydWN0b3IuIAoKSWYgYW4gZXhwbGljaXQgdHlwZSBpcyBhdHRhY2hlZCB0byB0aGUgaW5pdGlhbGl6aW5nIGZvcm1hbCwgdGhhdCBpcyBpdHMgc3RhdGljIHR5cGUuIE90aGVyd2lzZSwgdGhlIHR5cGUgb2YgYW4gaW5pdGlhbGl6aW5nIGZvcm1hbCBuYW1lZCBcY29kZXtpZH0gaXMgJFRfe2lkfSQsIHdoZXJlICRUX3tpZH0kIGlzIHRoZSB0eXBlIG9mIHRoZSBmaWVsZCBuYW1lZCBcY29kZXtpZH0gaW4gdGhlIGltbWVkaWF0ZWx5IGVuY2xvc2luZyBjbGFzcy4gSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiB0aGUgc3RhdGljIHR5cGUgb2YgXGNvZGV7aWR9IGlzIG5vdCBhc3NpZ25hYmxlIHRvICRUX3tpZH0kLgoKVXNpbmcgYW4gaW5pdGlhbGl6aW5nIGZvcm1hbCBcY29kZXtcVEhJU3t9LmlkfSBpbiBhIGZvcm1hbCBwYXJhbWV0ZXIgbGlzdCBkb2VzIG5vdCBpbnRyb2R1Y2UgYSBmb3JtYWwgcGFyYW1ldGVyIG5hbWUgaW50byB0aGUgc2NvcGUgb2YgdGhlIGNvbnN0cnVjdG9yLiBIb3dldmVyLCB0aGUgaW5pdGlhbGl6aW5nIGZvcm1hbCBkb2VzIGVmZmVjdCB0aGUgdHlwZSBvZiB0aGUgY29uc3RydWN0b3IgZnVuY3Rpb24gZXhhY3RseSBhcyBpZiBhIGZvcm1hbCBwYXJhbWV0ZXIgIG5hbWVkIFxjb2Rle2lkfSAgb2YgdGhlIHNhbWUgdHlwZSB3ZXJlIGludHJvZHVjZWQgaW4gdGhlIHNhbWUgcG9zaXRpb24uIAoKSW5pdGlhbGl6aW5nIGZvcm1hbHMgYXJlIGV4ZWN1dGVkIGR1cmluZyB0aGUgZXhlY3V0aW9uIG9mIGdlbmVyYXRpdmUgY29uc3RydWN0b3JzIGRldGFpbGVkIGJlbG93LiBFeGVjdXRpbmcgYW4gaW5pdGlhbGl6aW5nIGZvcm1hbCAgXGNvZGV7XFRISVN7fS5pZH0gY2F1c2VzIHRoZSBmaWVsZCBcY29kZXtpZH0gb2YgdGhlIGltbWVkaWF0ZWx5IHN1cnJvdW5kaW5nIGNsYXNzIHRvIGJlIGFzc2lnbmVkIHRoZSB2YWx1ZSBvZiB0aGUgY29ycmVzcG9uZGluZyBhY3R1YWwgcGFyYW1ldGVyLCB1bmxlc3MgJGlkJCBpcyBhIGZpbmFsIHZhcmlhYmxlIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCwgaW4gd2hpY2ggY2FzZSBhIHJ1bnRpbWUgZXJyb3Igb2NjdXJzLgoKClxjb21tZW50YXJ5ewpUaGUgYWJvdmUgcnVsZSBhbGxvd3MgaW5pdGlhbGl6aW5nIGZvcm1hbHMgdG8gYmUgdXNlZCBhcyBvcHRpb25hbCBwYXJhbWV0ZXJzOgp9CgpcYmVnaW57ZGFydENvZGV9CmNsYXNzIEEgXHsKICBpbnQgeDsKICBBKFt0aGlzLnhdKTsKXH0KXGVuZHtkYXJ0Q29kZX0KClxjb21tZW50YXJ5e2lzIGxlZ2FsLCBhbmQgaGFzIHRoZSBzYW1lIGVmZmVjdCBhc30KClxiZWdpbntkYXJ0Q29kZX0KY2xhc3MgQSBceyAKICBpbnQgeDsKICBBKFtpbnQgeF0pOiB0aGlzLnggPSB4OwpcfQpcZW5ke2RhcnRDb2RlfQoKQSB7XGVtIGZyZXNoIGluc3RhbmNlfSBpcyBhbiBpbnN0YW5jZSB3aG9zZSBpZGVudGl0eSAgaXMgZGlzdGluY3QgZnJvbSBhbnkgcHJldmlvdXNseSBhbGxvY2F0ZWQgaW5zdGFuY2Ugb2YgaXRzIGNsYXNzLiBBIGdlbmVyYXRpdmUgY29uc3RydWN0b3IgYWx3YXlzIG9wZXJhdGVzIG9uIGEgZnJlc2ggaW5zdGFuY2Ugb2YgaXRzIGltbWVkaWF0ZWx5IGVuY2xvc2luZyBjbGFzcy4gCgpcY29tbWVudGFyeXsKVGhlIGFib3ZlIGhvbGRzIGlmIHRoZSBjb25zdHJ1Y3RvciBpcyBhY3R1YWxseSBydW4sIGFzIGl0IGlzIGJ5IFxORVd7fS4gSWYgYSBjb25zdHJ1Y3RvciAkYyQgaXMgcmVmZXJlbmNlZCBieSBcQ09OU1R7fSwgJGMkIG1heSBub3QgYmUgcnVuOyBpbnN0ZWFkLCBhIGNhbm9uaWNhbCBvYmplY3QgbWF5IGJlIGxvb2tlZCB1cC4gU2VlIHRoZSBzZWN0aW9uIG9uIGluc3RhbmNlIGNyZWF0aW9uIChccmVme2luc3RhbmNlQ3JlYXRpb259KS4KfQoKSWYgYSBnZW5lcmF0aXZlIGNvbnN0cnVjdG9yICRjJCAgaXMgbm90IGEgcmVkaXJlY3RpbmcgY29uc3RydWN0b3IgYW5kIG5vIGJvZHkgaXMgcHJvdmlkZWQsIHRoZW4gJGMkIGltcGxpY2l0bHkgaGFzIGFuIGVtcHR5IGJvZHkgXGNvZGV7XHtcfX0uCgoKXHBhcmFncmFwaHtSZWRpcmVjdGluZyBDb25zdHJ1Y3RvcnN9ClxsYWJlbHtyZWRpcmVjdGluZ0NvbnN0cnVjdG9yc30KCkEgZ2VuZXJhdGl2ZSBjb25zdHJ1Y3RvciBtYXkgYmUge1xlbSByZWRpcmVjdGluZ30sIGluIHdoaWNoIGNhc2UgaXRzIG9ubHkgYWN0aW9uIGlzIHRvIGludm9rZSBhbm90aGVyIGdlbmVyYXRpdmUgY29uc3RydWN0b3IuICBBIHJlZGlyZWN0aW5nIGNvbnN0cnVjdG9yIGhhcyBubyBib2R5OyBpbnN0ZWFkLCBpdCBoYXMgYSByZWRpcmVjdCBjbGF1c2UgdGhhdCBzcGVjaWZpZXMgd2hpY2ggY29uc3RydWN0b3IgdGhlIGludm9jYXRpb24gaXMgcmVkaXJlY3RlZCB0bywgYW5kIHdpdGggd2hhdCBhcmd1bWVudHMuCgpcYmVnaW57Z3JhbW1hcn0Ke1xiZiByZWRpcmVjdGlvbjp9CiAgICAgYHtcZXNjYXBlZ3JhbW1hciA6fScgXFRISVN7fSAoYHtcZXNjYXBlZ3JhbW1hciAufScgaWRlbnRpZmllcik/IGFyZ3VtZW50cwogICAgLgpcZW5ke2dyYW1tYXJ9CgolIE5lZWQgdG8gc3BlY2lmeSBleGFjdGx5IGhvdyBleGVjdXRpbmcgYSByZWRpcmVjdGluZyBjb25zdHJ1Y3RvciB3b3JrcwoKCiVcUXtXZSBub3cgaGF2ZSBnZW5lcmF0aXZlIGNvbnN0cnVjdG9ycyB3aXRoIG5vIGJvZGllcyBhcyB3ZWxsLn0KClxwYXJhZ3JhcGh7SW5pdGlhbGl6ZXIgTGlzdHN9CgpBbiBpbml0aWFsaXplciBsaXN0IGJlZ2lucyB3aXRoIGEgY29sb24sIGFuZCBjb25zaXN0cyBvZiBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGluZGl2aWR1YWwge1xlbSBpbml0aWFsaXplcnN9LiBUaGVyZSBhcmUgdHdvIGtpbmRzIG9mIGluaXRpYWxpemVycy4KXGJlZ2lue2l0ZW1pemV9ClxpdGVtIEEge1xlbSBzdXBlcmluaXRpYWxpemVyfSBpZGVudGlmaWVzIGEge1xlbSBzdXBlcmNvbnN0cnVjdG9yfSAtIHRoYXQgaXMsIGEgc3BlY2lmaWMgIGNvbnN0cnVjdG9yIG9mIHRoZSBzdXBlcmNsYXNzLiAgRXhlY3V0aW9uIG9mIHRoZSBzdXBlcmluaXRpYWxpemVyIGNhdXNlcyB0aGUgaW5pdGlhbGl6ZXIgbGlzdCBvZiB0aGUgc3VwZXJjb25zdHJ1Y3RvciB0byBiZSBleGVjdXRlZC4KClxpdGVtIEFuIHtcZW0gaW5zdGFuY2UgdmFyaWFibGUgaW5pdGlhbGl6ZXJ9IGFzc2lnbnMgYSB2YWx1ZSB0byBhbiBpbmRpdmlkdWFsIGluc3RhbmNlIHZhcmlhYmxlLiAKXGVuZHtpdGVtaXplfQoKXGJlZ2lue2dyYW1tYXJ9CntcYmYgaW5pdGlhbGl6ZXJzOn0KICAgICAgYHtcZXNjYXBlZ3JhbW1hciA6fScgc3VwZXJDYWxsT3JGaWVsZEluaXRpYWxpemVyIChgLCcgc3VwZXJDYWxsT3JGaWVsZEluaXRpYWxpemVyKSoKICAgIC4KCgp7XGJmIHN1cGVyQ2FsbE9yRmllbGRJbml0aWFsaXplcjp9XFNVUEVSe30gYXJndW1lbnRzOwogICAgICBcU1VQRVJ7fSBge1xlc2NhcGVncmFtbWFyIC59JyBpZGVudGlmaWVyIGFyZ3VtZW50czsKICAgICBmaWVsZEluaXRpYWxpemVyCiAgICAuCiAgICAKICAge1xiZiAgZmllbGRJbml0aWFsaXplcjp9CiAgICAgIChcVEhJU3t9IGB7XGVzY2FwZWdyYW1tYXIgLn0nKT8gaWRlbnRpZmllciBgPScgY29uZGl0aW9uYWxFeHByZXNzaW9uIGNhc2NhZGVTZWN0aW9uKgogICAgLgoKXGVuZHtncmFtbWFyfQoKTGV0ICRrJCBiZSBhIGdlbmVyYXRpdmUgY29uc3RydWN0b3IuICBUaGVuICRrJCBtYXkgaW5jbHVkZSBhdCBtb3N0IG9uZSAgc3VwZXJpbml0aWFsaXplciBpbiBpdHMgaW5pdGlhbGl6ZXIgbGlzdCBvciBhIGNvbXBpbGUtdGltZSBlcnJvciBvY2N1cnMuIElmIG5vIHN1cGVyaW5pdGlhbGl6ZXIgaXMgcHJvdmlkZWQsIGFuIGltcGxpY2l0IHN1cGVyaW5pdGlhbGl6ZXIgb2YgdGhlIGZvcm0gXFNVUEVSe30oKSBpcyBhZGRlZCBhdCB0aGUgZW5kIG9mICRrJCdzIGluaXRpYWxpemVyIGxpc3QsIHVubGVzcyB0aGUgZW5jbG9zaW5nIGNsYXNzIGlzIGNsYXNzIFxjb2Rle09iamVjdH0uIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIG1vcmUgdGhhbiBvbmUgaW5pdGlhbGl6ZXIgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIGluc3RhbmNlIHZhcmlhYmxlIGFwcGVhcnMgaW4gJGskJ3MgaW5pdGlhbGl6ZXIgbGlzdC4gSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgJGskJ3MgaW5pdGlhbGl6ZXIgbGlzdCBjb250YWlucyBhbiBpbml0aWFsaXplciBmb3IgYSB2YXJpYWJsZSB0aGF0IGlzIGluaXRpYWxpemVkIGJ5IG1lYW5zIG9mIGFuIGluaXRpYWxpemluZyBmb3JtYWwgb2YgJGskLiAlIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmICAkayQncyBpbml0aWFsaXplciBsaXN0IGNvbnRhaW5zIGFuIGluaXRpYWxpemVyIGZvciBhIGZpbmFsIHZhcmlhYmxlICRmJCB3aG9zZSBkZWNsYXJhdGlvbiBpbmNsdWRlcyBhbiBpbml0aWFsaXphdGlvbiBleHByZXNzaW9uLgogCkVhY2ggZmluYWwgaW5zdGFuY2UgdmFyaWFibGUgJGYkIGRlY2xhcmVkIGluIHRoZSBpbW1lZGlhdGVseSBlbmNsb3NpbmcgY2xhc3MgbXVzdCBoYXZlIGFuIGluaXRpYWxpemVyIGluICRrJCdzIGluaXRpYWxpemVyIGxpc3QgdW5sZXNzIGl0IGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgYnkgb25lIG9mIHRoZSBmb2xsb3dpbmcgbWVhbnM6CiBcYmVnaW57aXRlbWl6ZX0KIFxpdGVtIEluaXRpYWxpemF0aW9uIGF0IHRoZSBkZWNsYXJhdGlvbiBvZiAkZiQuCiBcaXRlbSBJbml0aWFsaXphdGlvbiBieSAgbWVhbnMgb2YgYW4gaW5pdGlhbGl6aW5nIGZvcm1hbCBvZiAkayQuCiBcZW5ke2l0ZW1pemV9CiAKb3IgYSBzdGF0aWMgd2FybmluZyBvY2N1cnMuIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmICRrJCdzIGluaXRpYWxpemVyIGxpc3QgY29udGFpbnMgYW4gaW5pdGlhbGl6ZXIgZm9yIGEgdmFyaWFibGUgdGhhdCBpcyBub3QgYW4gaW5zdGFuY2UgdmFyaWFibGUgZGVjbGFyZWQgaW4gdGhlIGltbWVkaWF0ZWx5IHN1cnJvdW5kaW5nIGNsYXNzLgoKIApcY29tbWVudGFyeXtUaGUgIGluaXRpYWxpemVyIGxpc3QgbWF5IG9mIGNvdXJzZSBjb250YWluIGFuIGluaXRpYWxpemVyIGZvciBhbnkgIGluc3RhbmNlIHZhcmlhYmxlIGRlY2xhcmVkIGJ5IHRoZSBpbW1lZGlhdGVseSBzdXJyb3VuZGluZyBjbGFzcywgZXZlbiBpZiBpdCBpcyBub3QgZmluYWwuIAp9CgogSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgYSAgZ2VuZXJhdGl2ZSBjb25zdHJ1Y3RvciBvZiBjbGFzcyBcY29kZXtPYmplY3R9IGluY2x1ZGVzIGEgc3VwZXJpbml0aWFsaXplci4gCgpFeGVjdXRpb24gb2YgYSBnZW5lcmF0aXZlIGNvbnN0cnVjdG9yICRrJCBpcyBhbHdheXMgZG9uZSB3aXRoIHJlc3BlY3QgdG8gYSBzZXQgb2YgYmluZGluZ3MgZm9yIGl0cyBmb3JtYWwgcGFyYW1ldGVycyBhbmQgd2l0aCAgXFRISVN7fSBib3VuZCB0byBhIGZyZXNoIGluc3RhbmNlICRpJCBhbmQgdGhlIHR5cGUgcGFyYW1ldGVycyBvZiB0aGUgaW1tZWRpYXRlbHkgZW5jbG9zaW5nIGNsYXNzIGJvdW5kIHRvIGEgc2V0IG9mIGFjdHVhbCB0eXBlIGFyZ3VtZW50cyAkVl8xLCBcbGRvdHMgLCBWX20kLiAKClxjb21tZW50YXJ5e1RoZXNlIGJpbmRpbmdzIGFyZSB1c3VhbGx5IGRldGVybWluZWQgYnkgdGhlIGluc3RhbmNlIGNyZWF0aW9uIGV4cHJlc3Npb24gdGhhdCBpbnZva2VkIHRoZSBjb25zdHJ1Y3RvciAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkuIEhvd2V2ZXIsIHRoZXkgbWF5IGFsc28gYmUgZGV0ZXJtaW5lZCBieSBhIHJlZmxlY3RpdmUgY2FsbCwuCn0KCklmICRrJCBpcyByZWRpcmVjdGluZyB0aGVuIGl0cyByZWRpcmVjdCBjbGF1c2UgaGFzIHRoZSBmb3JtIAoKXFRISVN7fSQuZyhhXzEsIFxsZG90cyAsIGFfbiwgeF97bisxfTogYV97bisxfSwgXGxkb3RzICwgeF97bitrfTogYV97bitrfSkkIAoKd2hlcmUgJGckIGlkZW50aWZpZXMgYW5vdGhlciAgZ2VuZXJhdGl2ZSBjb25zdHJ1Y3RvciBvZiB0aGUgaW1tZWRpYXRlbHkgc3Vycm91bmRpbmcgY2xhc3MuIFRoZW4gZXhlY3V0aW9uIG9mICRrJCBwcm9jZWVkcyBieSBldmFsdWF0aW5nIHRoZSBhcmd1bWVudCBsaXN0ICQoYV8xLCBcbGRvdHMgLCBhX24sIHhfe24rMX06IGFfe24rMX0sIFxsZG90cyAsIHhfe24ra306IGFfe24ra30pJCwgYW5kIHRoZW4gZXhlY3V0aW5nICRnJCB3aXRoIHJlc3BlY3QgdG8gdGhlIGJpbmRpbmdzIHJlc3VsdGluZyBmcm9tIHRoZSBldmFsdWF0aW9uIG9mICQoYV8xLCBcbGRvdHMgLCBhX24sIHhfe24rMX06IGFfe24rMX0sIFxsZG90cyAsIHhfe24ra306IGFfe24ra30pJCBhbmQgd2l0aCAgXFRISVN7fSBib3VuZCB0byAkaSQgYW5kIHRoZSB0eXBlIHBhcmFtZXRlcnMgb2YgdGhlIGltbWVkaWF0ZWx5IGVuY2xvc2luZyBjbGFzcyBib3VuZCB0byAkVl8xLCBcbGRvdHMgLCBWX20kLiAKCk90aGVyd2lzZSwgZXhlY3V0aW9uICBwcm9jZWVkcyBhcyBmb2xsb3dzOgoKJUZpcnN0LCBhIGZyZXNoIGluc3RhbmNlIChccmVme2dlbmVyYXRpdmVDb25zdHJ1Y3RvcnN9KSAkaSQgb2YgdGhlIGltbWVkaWF0ZWx5IGVuY2xvc2luZyBjbGFzcyBpcyBhbGxvY2F0ZWQuICBOZXh0LCB0aGUgaW5zdGFuY2UgdmFyaWFibGUgZGVjbGFyYXRpb25zIG9mIHRoZSBpbW1lZGlhdGVseSBlbmNsb3NpbmcgY2xhc3MgYXJlIHZpc2l0ZWQgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluIHRoZSBwcm9ncmFtIHRleHQuIEZvciBlYWNoIHN1Y2ggZGVjbGFyYXRpb24gJGQkLCBpZiAkZCQgaGFzIHRoZSBmb3JtICBcY29kZXskZmluYWxDb25zdFZhck9yVHlwZSQgJHYkID0gJGUkOyB9IHRoZW4gdGhlIGluc3RhbmNlIHZhcmlhYmxlICR2JCBvZiAkaSQgaXMgYm91bmQgdG8gdGhlIHZhbHVlIG9mICRlJCAod2hpY2ggaXMgbmVjZXNzYXJpbHkgYSBjb21waWxlLXRpbWUgY29uc3RhbnQpLgolTmV4dCwgYQpBbnkgaW5pdGlhbGl6aW5nIGZvcm1hbHMgZGVjbGFyZWQgaW4gJGskJ3MgcGFyYW1ldGVyIGxpc3QgYXJlIGV4ZWN1dGVkIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiB0aGUgcHJvZ3JhbSB0ZXh0LiAgCiUgSW4gZmFjdCwgdGhpcyBvcmRlciBpcyB1bm9ic2VydmFibGU7IHRoaXMgY291bGQgYmUgZG9uZSBhbnkgdGltZSBwcmlvciB0byBydW5uaW5nIHRoZSBib2R5LCBzaW5jZQolIHRoZXNlIG9ubHkgZWZmZWN0IFxUSElTe30uClRoZW4sICRrJCdzICBpbml0aWFsaXplcnMgYXJlIGV4ZWN1dGVkIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiB0aGUgcHJvZ3JhbS4KClxyYXRpb25hbGUge1dlIGNvdWxkIG9ic2VydmUgdGhlIG9yZGVyIGJ5IHNpZGUgIGVmZmVjdGluZyBleHRlcm5hbCByb3V0aW5lcyBjYWxsZWQuIFNvIHdlIG5lZWQgdG8gc3BlY2lmeSB0aGUgb3JkZXIufQoKQWZ0ZXIgYWxsIHRoZSBpbml0aWFsaXplcnMgIGhhdmUgY29tcGxldGVkLCB0aGUgYm9keSBvZiAkayQgaXMgZXhlY3V0ZWQgIGluIGEgc2NvcGUgd2hlcmUgXFRISVN7fSBpcyBib3VuZCB0byAkaSQuIEV4ZWN1dGlvbiBvZiB0aGUgYm9keSBiZWdpbnMgd2l0aCBleGVjdXRpb24gb2YgdGhlIGJvZHkgb2YgdGhlIHN1cGVyY29uc3RydWN0b3IgIHdpdGggXFRISVN7fSBib3VuZCB0byAkaSQsIHRoZSB0eXBlIHBhcmFtZXRlcnMgb2YgdGhlIGltbWVkaWF0ZWx5IGVuY2xvc2luZyBjbGFzcyBib3VuZCB0byBhIHNldCBvZiBhY3R1YWwgdHlwZSBhcmd1bWVudHMgJFZfMSwgXGxkb3RzICwgVl9tJCBhbmQgdGhlIGZvcm1hbCBwYXJhbWV0ZXJzIGJpbmRpbmdzIGRldGVybWluZWQgYnkgdGhlIGFyZ3VtZW50IGxpc3Qgb2YgdGhlIHN1cGVyaW5pdGlhbGl6ZXIgb2YgJGskLgoKXHJhdGlvbmFsZXsKVGhpcyBwcm9jZXNzIGVuc3VyZXMgdGhhdCBubyB1bmluaXRpYWxpemVkIGZpbmFsIGZpZWxkIGlzIGV2ZXIgc2VlbiBieSBjb2RlLiBOb3RlIHRoYXQgXFRISVN7fSBpcyBub3QgaW4gc2NvcGUgb24gdGhlIHJpZ2h0IGhhbmQgc2lkZSBvZiBhbiBpbml0aWFsaXplciAoc2VlIFxyZWZ7dGhpc30pIHNvIG5vIGluc3RhbmNlIG1ldGhvZCBjYW4gZXhlY3V0ZSBkdXJpbmcgaW5pdGlhbGl6YXRpb246IGFuIGluc3RhbmNlIG1ldGhvZCBjYW5ub3QgYmUgZGlyZWN0bHkgaW52b2tlZCwgbm9yIGNhbiAgXFRISVN7fSBiZSBwYXNzZWQgaW50byBhbnkgb3RoZXIgY29kZSBiZWluZyBpbnZva2VkIGluIHRoZSBpbml0aWFsaXplci4gCn0KCkV4ZWN1dGlvbiBvZiBhbiBpbml0aWFsaXplciBvZiB0aGUgZm9ybSBcY29kZXtcVEhJU3t9LiR2JCA9ICRlJH0gcHJvY2VlZHMgYXMgZm9sbG93czoKCkZpcnN0LCB0aGUgZXhwcmVzc2lvbiAkZSQgaXMgZXZhbHVhdGVkIHRvIGFuIG9iamVjdCAkbyQuIFRoZW4sIHRoZSBpbnN0YW5jZSB2YXJpYWJsZSAkdiQgb2YgdGhlIG9iamVjdCBkZW5vdGVkIGJ5IFxUSElTe30gaXMgYm91bmQgdG8gJG8kLCB1bmxlc3MgJHYkIGlzIGEgZmluYWwgdmFyaWFibGUgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLCBpbiB3aGljaCBjYXNlIGEgcnVudGltZSBlcnJvciBvY2N1cnMuIEluIGNoZWNrZWQgbW9kZSwgaXQgaXMgYSBkeW5hbWljIHR5cGUgZXJyb3IgaWYgJG8kIGlzIG5vdCBcTlVMTHt9IGFuZCB0aGUgaW50ZXJmYWNlIG9mIHRoZSBjbGFzcyBvZiAkbyQgaXMgbm90IGEgc3VidHlwZSBvZiB0aGUgYWN0dWFsIHR5cGUgb2YgdGhlIGZpZWxkICR2JC4KCkFuIGluaXRpYWxpemVyIG9mIHRoZSBmb3JtIFxjb2RleyR2JCA9ICRlJH0gaXMgZXF1aXZhbGVudCB0byBhbiBpbml0aWFsaXplciBvZiB0aGUgZm9ybSAgXGNvZGV7XFRISVN7fS4kdiQgPSAkZSR9LiAKCkV4ZWN1dGlvbiBvZiBhIHN1cGVyaW5pdGlhbGl6ZXIgb2YgdGhlIGZvcm0gCgpcU1VQRVJ7fSQoYV8xLCBcbGRvdHMsIGFfbiwgIHhfe24rMX06IGFfe24rMX0sIFxsZG90cywgeF97bitrfTogYV97bitrfSkkIAoKKHJlc3BlY3RpdmVseSAgXFNVUEVSe30kLmlkKGFfMSwgXGxkb3RzLCBhX24sIHhfe24rMX06IGFfe24rMX0sIFxsZG90cywgeF97bitrfTogYV97bitrfSkkIAoKcHJvY2VlZHMgYXMgZm9sbG93czoKCkZpcnN0LCB0aGUgYXJndW1lbnQgbGlzdCAkKGFfMSwgXGxkb3RzLCBhX24sIHhfe24rMX06IGFfe24rMX0sIFxsZG90cywgeF97bitrfTogYV97bitrfSkkIGlzIGV2YWx1YXRlZC4KCkxldCAkQyQgYmUgdGhlIGNsYXNzIGluIHdoaWNoIHRoZSBzdXBlcmluaXRpYWxpemVyIGFwcGVhcnMgYW5kIGxldCAkUyQgYmUgdGhlIHN1cGVyY2xhc3Mgb2YgJEMkLiAgSWYgJFMkIGlzIGdlbmVyaWMgKFxyZWZ7Z2VuZXJpY3N9KSwgbGV0ICRVXzEsICwgXGxkb3RzLCBVX20kIGJlIHRoZSBhY3R1YWwgdHlwZSBhcmd1bWVudHMgcGFzc2VkIHRvICRTJCBpbiB0aGUgc3VwZXJjbGFzcyBjbGF1c2Ugb2YgJEMkLgoKVGhlbiwgdGhlIGluaXRpYWxpemVyIGxpc3Qgb2YgdGhlIGNvbnN0cnVjdG9yICRTJCAocmVzcGVjdGl2ZWx5ICRTLmlkJCkgaXMgZXhlY3V0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBiaW5kaW5ncyB0aGF0IHJlc3VsdGVkIGZyb20gdGhlIGV2YWx1YXRpb24gb2YgdGhlIGFyZ3VtZW50IGxpc3QsICB3aXRoIFxUSElTe30gYm91bmQgdG8gdGhlIGN1cnJlbnQgYmluZGluZyBvZiBcVEhJU3t9LCBhbmQgIHRoZSB0eXBlIHBhcmFtZXRlcnMgKGlmIGFueSkgb2YgY2xhc3MgJFMkIGJvdW5kIHRvIHRoZSBjdXJyZW50IGJpbmRpbmdzIG9mICRVXzEsICwgXGxkb3RzLCBVX20kLgoKSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgY2xhc3MgJFMkIGRvZXMgbm90IGRlY2xhcmUgYSBnZW5lcmF0aXZlIGNvbnN0cnVjdG9yIG5hbWVkICRTJCAocmVzcGVjdGl2ZWx5ICRTLmlkJCkKClxzdWJzdWJzZWN0aW9ue0ZhY3Rvcmllc30KXGxhYmVse2ZhY3Rvcmllc30KCkEge1xlbSBmYWN0b3J5fSBpcyBhIGNvbnN0cnVjdG9yIHByZWZhY2VkIGJ5IHRoZSBidWlsdC1pbiBpZGVudGlmaWVyICAoXHJlZntpZGVudGlmaWVyUmVmZXJlbmNlfSkgICBcRkFDVE9SWXt9LiAKClxiZWdpbntncmFtbWFyfQp7XGJmIGZhY3RvcnlDb25zdHJ1Y3RvclNpZ25hdHVyZTp9CiAgICAgIFxGQUNUT1JZe30gaWRlbnRpZmllciAgKGB7XGVzY2FwZWdyYW1tYXIgLn0nIGlkZW50aWZpZXIpPyAgZm9ybWFsUGFyYW1ldGVyTGlzdAogICAgLgpcZW5ke2dyYW1tYXJ9CgoKJVRoZSBlbmNsb3Npbmcgc2NvcGUgb2YgYSBmYWN0b3J5IGNvbnN0cnVjdG9yIGlzIHRoZSBzdGF0aWMgc2NvcGUgXHJlZnt9IG9mIHRoZSBjbGFzcyBpbiB3aGljaCBpdCBpcyBkZWNsYXJlZC4KClRoZSB7XGVtIHJldHVybiB0eXBlfSBvZiBhIGZhY3Rvcnkgd2hvc2Ugc2lnbmF0dXJlIGlzIG9mIHRoZSBmb3JtIFxGQUNUT1JZe30gJE0kIG9yIHRoZSBmb3JtIFxGQUNUT1JZe30gJE0uaWQkIGlzICRNJCBpZiAkTSQgaXMgbm90IGEgZ2VuZXJpYyB0eXBlOyBvdGhlcndpc2UgdGhlIHJldHVybiB0eXBlIGlzICAkTSA8VF8xLCBcbGRvdHMsIFRfbj4kIHdoZXJlICRUXzEsIFxsZG90cywgVF9uJCBhcmUgdGhlIHR5cGUgcGFyYW1ldGVycyBvZiB0aGUgZW5jbG9zaW5nIGNsYXNzCgpJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiAkTSQgaXMgbm90IHRoZSBuYW1lIG9mIHRoZSBpbW1lZGlhdGVseSBlbmNsb3NpbmcgY2xhc3MuIAoKSW4gY2hlY2tlZCBtb2RlLCBpdCBpcyBhIGR5bmFtaWMgdHlwZSBlcnJvciBpZiBhIGZhY3RvcnkgcmV0dXJucyBhIG5vbi1udWxsIG9iamVjdCB3aG9zZSB0eXBlIGlzIG5vdCBhIHN1YnR5cGUgb2YgaXRzIGFjdHVhbCAoXHJlZnthY3R1YWxUeXBlT2ZBRGVjbGFyYXRpb259KSByZXR1cm4gdHlwZS4KClxyYXRpb25hbGV7SXQgc2VlbXMgdXNlbGVzcyB0byBhbGxvdyBhIGZhY3RvcnkgdG8gcmV0dXJuIG51bGwuIEJ1dCBpdCBpcyBtb3JlIHVuaWZvcm0gdG8gYWxsb3cgaXQsIGFzIHRoZSBydWxlcyBjdXJyZW50bHkgZG8ufQoKXHJhdGlvbmFsZXtGYWN0b3JpZXMgYWRkcmVzcyBjbGFzc2ljIHdlYWtuZXNzZXMgYXNzb2NpYXRlZCB3aXRoIGNvbnN0cnVjdG9ycyBpbiBvdGhlciBsYW5ndWFnZXMuCkZhY3RvcmllcyBjYW4gcHJvZHVjZSBpbnN0YW5jZXMgdGhhdCBhcmUgbm90IGZyZXNobHkgYWxsb2NhdGVkOiB0aGV5IGNhbiBjb21lIGZyb20gYSBjYWNoZS4gTGlrZXdpc2UsIGZhY3RvcmllcyBjYW4gcmV0dXJuIGluc3RhbmNlcyBvZiBkaWZmZXJlbnQgY2xhc3Nlcy4gCgp9CgpccGFyYWdyYXBoe1JlZGlyZWN0aW5nIEZhY3RvcnkgQ29uc3RydWN0b3JzfQpcbGFiZWx7cmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JzfQoKQSB7XGVtIHJlZGlyZWN0aW5nIGZhY3RvcnkgY29uc3RydWN0b3J9IHNwZWNpZmllcyBhIGNhbGwgdG8gYSBjb25zdHJ1Y3RvciBvZiBhbm90aGVyIGNsYXNzIHRoYXQgaXMgdG8gYmUgdXNlZCB3aGVuZXZlciB0aGUgcmVkaXJlY3RpbmcgY29uc3RydWN0b3IgaXMgY2FsbGVkLgoKXGJlZ2lue2dyYW1tYXJ9CntcYmYgcmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JTaWduYXR1cmU6fQogICAgICBcQ09OU1R7fT8gXEZBQ1RPUll7fSBpZGVudGlmaWVyIChge1xlc2NhcGVncmFtbWFyIC59JyBpZGVudGlmaWVyKT8gZm9ybWFsUGFyYW1ldGVyTGlzdCBgPScgdHlwZSAoYHtcZXNjYXBlZ3JhbW1hciAufScgaWRlbnRpZmllcik/CiAgICAuClxlbmR7Z3JhbW1hcn0KCkNhbGxpbmcgYSByZWRpcmVjdGluZyBmYWN0b3J5IGNvbnN0cnVjdG9yICRrJCBjYXVzZXMgdGhlIGNvbnN0cnVjdG9yICRrXlxwcmltZSQgZGVub3RlZCBieSAkdHlwZSQgKHJlc3BlY3RpdmVseSwgJHR5cGUuaWRlbnRpZmllciQpIHRvIGJlIGNhbGxlZCB3aXRoIHRoZSBhY3R1YWwgYXJndW1lbnRzIHBhc3NlZCB0byAkayQsIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgb2YgJGteXHByaW1lJCBhcyB0aGUgcmVzdWx0IG9mICRrJC4gIFRoZSByZXN1bHRpbmcgY29uc3RydWN0b3IgY2FsbCBpcyBnb3Zlcm5lZCBieSB0aGUgc2FtZSBydWxlcyBhcyBhbiBpbnN0YW5jZSBjcmVhdGlvbiBleHByZXNzaW9uIHVzaW5nIFxORVd7fSAoXHJlZntpbnN0YW5jZUNyZWF0aW9ufSkuIAoKXGNvbW1lbnRhcnl7Ckl0IGZvbGxvd3MgdGhhdCBpZiAkdHlwZSQgb3IgJHR5cGUuaWQkIGFyZSBub3QgZGVmaW5lZCwgb3IgZG8gbm90IHJlZmVyIHRvIGEgY2xhc3Mgb3IgY29uc3RydWN0b3IsIGEgZHluYW1pYyBlcnJvciBvY2N1cnMsIGFzIHdpdGggYW55IG90aGVyIHVuZGVmaW5lZCBjb25zdHJ1Y3RvciBjYWxsLiBUaGUgc2FtZSBob2xkcyBpZiAkayQgaXMgY2FsbGVkIHdpdGggZmV3ZXIgcmVxdWlyZWQgcGFyYW1ldGVycyBvciBtb3JlIHBvc2l0aW9uYWwgcGFyYW1ldGVycyB0aGFuICRrXlxwcmltZSQgZXhwZWN0cywgb3IgaWYgJGskICBpcyBjYWxsZWQgd2l0aCBhIG5hbWVkIHBhcmFtZXRlciB0aGF0IGlzIG5vdCBkZWNsYXJlZCBieSAka15ccHJpbWUkLgp9CgpJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiAkayQgZXhwbGljaXRseSBzcGVjaWZpZXMgYSBkZWZhdWx0IHZhbHVlIGZvciBhbiBvcHRpb25hbCBwYXJhbWV0ZXIuXGNvbW1lbnRhcnl7CkRlZmF1bHQgdmFsdWVzIHNwZWNpZmllZCBpbiAkayQgd291bGQgYmUgaWdub3JlZCwgc2luY2UgaXQgaXMgdGhlIHtcZW0gYWN0dWFsfSBwYXJhbWV0ZXJzIHRoYXQgYXJlIHBhc3NlZCB0byAka15ccHJpbWUkLiBIZW5jZSwgZGVmYXVsdCB2YWx1ZXMgYXJlIGRpc2FsbG93ZWQuCn0KCkl0IGlzIGEgcnVuLXRpbWUgZXJyb3IgaWYgYSByZWRpcmVjdGluZyBmYWN0b3J5IGNvbnN0cnVjdG9yIHJlZGlyZWN0cyB0byBpdHNlbGYsIGVpdGhlciBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHZpYSBhIHNlcXVlbmNlIG9mIHJlZGlyZWN0aW9ucy4gJWRvZXMgbm90IHJlZGlyZWN0IHRvIGEgbm9uLXJlZGlyZWN0aW5nIGZhY3RvcnkgY29uc3RydWN0b3Igb3IgdG8gYSBnZW5lcmF0aXZlIGNvbnN0cnVjdG9yIGluIGEgZmluaXRlIG51bWJlciBvZiBzdGVwcy4KCiUgTWFrZSB0aGlzIGEgcnVudGltZSBlcnJvciBzbyBkZWZlcnJlZCBsb2FkaW5nIHdvcmtzCgpccmF0aW9uYWxlewpJZiBhIHJlZGlyZWN0aW5nIGZhY3RvcnkgJEZfMSQgcmVkaXJlY3RzIHRvIGFub3RoZXIgcmVkaXJlY3RpbmcgZmFjdG9yeSAkRl8yJCBhbmQgJEZfMiQgdGhlbiByZWRpcmVjdHMgdG8gJEZfMSQsIHRoZW4gYm90aCAkRl8xJCBhbmQgJEZfMiQgYXJlIGlsbC1kZWZpbmVkLiBTdWNoIGN5Y2xlcyBhcmUgdGhlcmVmb3JlIGlsbGVnYWwuCn0gCgoKSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiAkdHlwZSQgZG9lcyBub3QgZGVub3RlIGEgY2xhc3MgYWNjZXNzaWJsZSBpbiB0aGUgY3VycmVudCBzY29wZTsgaWYgJHR5cGUkIGRvZXMgZGVub3RlIHN1Y2ggYSBjbGFzcyAkQyQgaXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiB0aGUgcmVmZXJlbmNlZCBjb25zdHJ1Y3RvciAoYmUgaXQgJHR5cGUkIG9yICR0eXBlLmlkJCkgaXMgbm90IGEgY29uc3RydWN0b3Igb2YgJEMkLgoKXGNvbW1lbnRhcnl7Ck5vdGUgdGhhdCBpdCBpcyBub3QgcG9zc2libGUgdG8gbW9kaWZ5IHRoZSBhcmd1bWVudHMgYmVpbmcgcGFzc2VkIHRvICAkayckLiAgCn0KJSBidXQgd2UgaGF2ZSB0aGUgc2FtZSBpc3N1ZSB3aXRoIG90aGVyIHJlZGlyZWN0aW5nIGNvbnN0cnVjdG9ycywgbm8/KQpccmF0aW9uYWxlewpBdCBmaXJzdCBnbGFuY2UsIG9uZSBtaWdodCB0aGluayB0aGF0IG9yZGluYXJ5IGZhY3RvcnkgY29uc3RydWN0b3JzIGNvdWxkIHNpbXBseSBjcmVhdGUgaW5zdGFuY2VzIG9mIG90aGVyIGNsYXNzZXMgYW5kIHJldHVybiB0aGVtLCBhbmQgdGhhdCByZWRpcmVjdGluZyBmYWN0b3JpZXMgYXJlIHVubmVjZXNzYXJ5LiBIb3dldmVyLCByZWRpcmVjdGluZyBmYWN0b3JpZXMgaGF2ZSBzZXZlcmFsIGFkdmFudGFnZXM6ClxiZWdpbntpdGVtaXplfQpcaXRlbSBBbiBhYnN0cmFjdCBjbGFzcyBtYXkgcHJvdmlkZSBhIGNvbnN0YW50IGNvbnN0cnVjdG9yIHRoYXQgdXRpbGl6ZXMgdGhlIGNvbnN0YW50IGNvbnN0cnVjdG9yIG9mIGFub3RoZXIgY2xhc3MuClxpdGVtIEEgcmVkaXJlY3RpbmcgZmFjdG9yeSBjb25zdHJ1Y3RvcnMgYXZvaWRzIHRoZSBuZWVkIGZvciBmb3J3YXJkZXJzIHRvIHJlcGVhdCB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIGZvcm1hbCBwYXJhbWV0ZXJzIGluIHRoZWlyIHNpZ25hdHVyZXMuCiVcaXRlbSBBIGdlbmVyaWMgZmFjdG9yeSBjbGFzcyB0aGF0IGFnZ3JlZ2F0ZXMgZmFjdG9yeSBjb25zdHJ1Y3RvcnMgZm9yIHR5cGVzIGl0IGRvZXMgbm90IGltcGxlbWVudCBjYW4gc3RpbGwgaGF2ZSBpdHMgdHlwZSBhcmd1bWVudHMgcGFzc2VkIGNvcnJlY3RseS4KXGVuZHtpdGVtaXplfQoKJUFuIGV4YW1wbGUgb2YgdGhlIGxhdHRlciBwb2ludDoKJX0KCgolXGJlZ2lue2RhcnRDb2RlfQolXENMQVNTe30gVyQ8JFQkPiQgXElNUExFTUVOVFN7fSBBJDwkVCQ+JCB7IFcodykgey4uLn0gLi4ufQolXENMQVNTe30gWCQ8JFQkPiQgXElNUExFTUVOVFN7fSBBJDwkVCQ+JCB7IFgoeCkgey4uLn0gLi4ufQolXENMQVNTe30gWSQ8JFQkPiQgXElNUExFTUVOVFN7fSBBJDwkVCQ+JCB7IFkoeSkgey4uLn0gLi4ufQolXENMQVNTe30gWiQ8JFQkPiQgXElNUExFTUVOVFN7fSBBJDwkVCQ+JCB7IFooeikgey4uLn0gLi4ufQoKCiVcQ0xBU1N7fSBGJDwkVCQ+JCB7IC8vIG5vdGUgdGhhdCBGIGRvZXMgbm90IGltcGxlbWVudCBBCiUgIFxTVEFUSUN7fSBGJDwkVCQ+JCBpZHcodykgJD0+JCBcTkVXe30gIFckPCRUJD4kKHcpOyAvLyBpbGxlZ2FsIC0gVCBub3QgaW4gc2NvcGUgaW4gaWR3CiUgIFxGQUNUT1JZe30gRi5pZHgoeCkgJD0+JCBcTkVXe30gWCQ8JFQkPiQoeCk7CiUgIFxGQUNUT1JZe30gRi5pZHkoeSkgJD0+JCBcTkVXe30gWSQ8JFQkPiQoeSk7CiUgIFxTVEFUSUN7fSBGIGlkeih6KSAkPT4kIFxORVd7fSAgWih6KTsgLy8gZG9lcyBub3QgY2FwdHVyZSB0aGUgdHlwZSBhcmd1bWVudAolfQoKJVxDTEFTU3t9IEEkPCRUJD4kewolICBcRkFDVE9SWXt9IEEuaWR3KHcpICQ9PiQgRiQ8JFQkPiQuaWR3KHcpOyAKJS8vIGlsbGVnYWwgLSBjYW5ub3QgcGFzcyB0eXBlIHBhcmFtZXRlciB0byBzdGF0aWMgbWV0aG9kCiUgIFxGQUNUT1JZe30gQS5pZHgoeCkgJD0+IFxORVd7fSAkRiQ8JFQkPiQuaWR4KHgpOyAvLyB3b3JrcywgYnV0IGFsbG9jYXRlcyBhIGdyYXR1aXRvdXMgaW5zdGFuY2Ugb2YgRgolICBcRkFDVE9SWXt9IEEuaWR5KHkpID0gWSQ8JFQkPiQ7IC8vIHdvcmtzCiUgIFxGQUNUT1JZe30gQS5pZHooeikgJD0+JCBGLmlkeih6KTsgLy8gd3JvbmcgLSByZXR1cm5zIFokPCREeW5hbWljJD4kOyBubyB3YXkgdG8gcGFzcyB0eXBlIGFyZ3VtZW50Cn0KJVxlbmR7ZGFydENvZGV9CgpJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiAkayQgaXMgcHJlZml4ZWQgd2l0aCB0aGUgXENPTlNUe30gbW9kaWZpZXIgYnV0ICRrXlxwcmltZSQgaXMgbm90IGEgY29uc3RhbnQgY29uc3RydWN0b3IgKFxyZWZ7Y29uc3RhbnRDb25zdHJ1Y3RvcnN9KS4KCkl0IGlzIGEgc3RhdGljIHdhcm5pbmcgaWYgdGhlIGZ1bmN0aW9uIHR5cGUgb2YgJGteXHByaW1lJCBpcyBub3QgYSBzdWJ0eXBlIG9mIHRoZSB0eXBlIG9mICRrJC4KClxjb21tZW50YXJ5ewpUaGlzIGltcGxpZXMgdGhhdCB0aGUgIHJlc3VsdGluZyBvYmplY3QgY29uZm9ybXMgdG8gdGhlIGludGVyZmFjZSBvZiB0aGUgaW1tZWRpYXRlbHkgZW5jbG9zaW5nIGNsYXNzIG9mICRrJC4KfQoKSXQgaXMgYSBzdGF0aWMgdHlwZSB3YXJuaW5nIGlmIGFueSBvZiB0aGUgdHlwZSBhcmd1bWVudHMgdG8gJGteXHByaW1lJCBhcmUgbm90IHN1YnR5cGVzIG9mIHRoZSBib3VuZHMgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZm9ybWFsIHR5cGUgcGFyYW1ldGVycyBvZiAkdHlwZSQuCgoKXHN1YnN1YnNlY3Rpb257Q29uc3RhbnQgQ29uc3RydWN0b3JzfQpcbGFiZWx7Y29uc3RhbnRDb25zdHJ1Y3RvcnN9CgpBIHtcZW0gY29uc3RhbnQgY29uc3RydWN0b3J9IG1heSBiZSB1c2VkIHRvIGNyZWF0ZSBjb21waWxlLXRpbWUgY29uc3RhbnQgIChccmVme2NvbnN0YW50c30pIG9iamVjdHMuIEEgY29uc3RhbnQgY29uc3RydWN0b3IgaXMgcHJlZml4ZWQgYnkgdGhlIHJlc2VydmVkIHdvcmQgXENPTlNUe30uIAoKXGJlZ2lue2dyYW1tYXJ9CntcYmYgY29uc3RhbnRDb25zdHJ1Y3RvclNpZ25hdHVyZTp9CiAgICAgIFxDT05TVHt9IHF1YWxpZmllZCBmb3JtYWxQYXJhbWV0ZXJMaXN0CiAgICAuClxlbmR7Z3JhbW1hcn0KCgolXGNvbW1lbnRhcnl7U3BlbGwgb3V0IHN1YnRsZXRpZXM6IGEgY29uc3RhbnQgY29uc3RydWN0b3IgY2FsbCB3aXRoaW4gdGhlIGluaXRpYWxpemVyIG9mIGEgY29uc3RhbnQgY29uc3RydWN0b3IgaXMgdHJlYXRlZCBhcyBhICBvcmRpbmFyeSBjb25zdHJ1Y3RvciBjYWxsIChhIG5ldyksIGJlY2F1c2UgdGhlIGFyZ3VtZW50cyBjYW5ub3QgYmUgYXNzdW1lZCBjb25zdGFudCBhbnltb3JlLiBJbiBwcmFjdGljZSwgdGhpcyBtZWFucyB0d28gdmVyc2lvbnMgYXJlIGNvbXBpbGVkIGFuZCBhbmFseXplZC4gT25lIGZvciBuZXcgYW5kIG9uZSBmb3IgY29uc3QufQoKJSBcUXtIb3cgdG8gc3BlY2lmeT99CgpcY29tbWVudGFyeXtBbGwgdGhlIHdvcmsgb2YgYSBjb25zdGFudCBjb25zdHJ1Y3RvciBtdXN0IGJlIGhhbmRsZWQgdmlhIGl0cyBpbml0aWFsaXplcnMufQoKSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgYSBjb25zdGFudCBjb25zdHJ1Y3RvciBpcyBkZWNsYXJlZCBieSBhIGNsYXNzIHRoYXQgaGFzIGEgbm9uLWZpbmFsIGluc3RhbmNlIHZhcmlhYmxlLiAgCgpcY29tbWVudGFyeXsKVGhlIGFib3ZlIHJlZmVycyB0byBib3RoIGxvY2FsbHkgZGVjbGFyZWQgYW5kIGluaGVyaXRlZCBpbnN0YW5jZSB2YXJpYWJsZXMuCn0KCkl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIGEgY29uc3RhbnQgY29uc3RydWN0b3IgaXMgZGVjbGFyZWQgYnkgYSBjbGFzcyAkQyQgaWYgYW55IGluc3RhbmNlIHZhcmlhYmxlIGRlY2xhcmVkIGluICRDJCBpcyBpbml0aWFsaXplZCB3aXRoIGFuIGV4cHJlc3Npb24gdGhhdCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uLgoKXGNvbW1lbnRhcnkgewpBIHN1cGVyY2xhc3Mgb2YgJEMkIGNhbm5vdCBkZWNsYXJlIHN1Y2ggYW4gaW5pdGlhbGl6ZXIgZWl0aGVyLCBiZWNhdXNlIGl0IG11c3QgbmVjZXNzYXJpbHkgZGVjbGFyZSBjb25zdGFudCBjb25zdHJ1Y3RvciBhcyB3ZWxsICh1bmxlc3MgaXQgaXMgXGNvZGV7T2JqZWN0fSwgd2hpY2ggZGVjbGFyZXMgbm8gaW5zdGFuY2UgdmFyaWFibGVzKS4KfQoKVGhlIHN1cGVyaW5pdGlhbGl6ZXIgdGhhdCBhcHBlYXJzLCBleHBsaWNpdGx5IG9yIGltcGxpY2l0bHksIGluIHRoZSBpbml0aWFsaXplciBsaXN0IG9mIGEgY29uc3RhbnQgY29uc3RydWN0b3IgbXVzdCBzcGVjaWZ5IGEgY29uc3RhbnQgY29uc3RydWN0b3Igb2YgdGhlIHN1cGVyY2xhc3Mgb2YgdGhlIGltbWVkaWF0ZWx5IGVuY2xvc2luZyBjbGFzcyBvciBhIGNvbXBpbGUtdGltZSBlcnJvciBvY2N1cnMuCgpBbnkgZXhwcmVzc2lvbiB0aGF0IGFwcGVhcnMgd2l0aGluIHRoZSBpbml0aWFsaXplciBsaXN0IG9mIGEgY29uc3RhbnQgY29uc3RydWN0b3IgbXVzdCBiZSBhIHBvdGVudGlhbGx5IGNvbnN0YW50IGV4cHJlc3Npb24sIG9yIGEgY29tcGlsZS10aW1lIGVycm9yIG9jY3Vycy4gCgpBIHtcZW0gcG90ZW50aWFsbHkgY29uc3RhbnQgZXhwcmVzc2lvbn0gaXMgYW4gZXhwcmVzc2lvbiAkZSQgdGhhdCB3b3VsZCBiZSBhIHZhbGlkIGNvbnN0YW50IGV4cHJlc3Npb24gaWYgYWxsIGZvcm1hbCBwYXJhbWV0ZXJzIG9mICRlJCdzIGltbWVkaWF0ZWx5IGVuY2xvc2luZyBjb25zdGFudCBjb25zdHJ1Y3RvciB3ZXJlIHRyZWF0ZWQgYXMgY29tcGlsZS10aW1lIGNvbnN0YW50cyB0aGF0IHdlcmUgZ3VhcmFudGVlZCB0byBldmFsdWF0ZSB0byBhbiBpbnRlZ2VyLCBib29sZWFuIG9yIHN0cmluZyB2YWx1ZSBhcyByZXF1aXJlZCBieSB0aGVpciBpbW1lZGlhdGVseSBlbmNsb3Npbmcgc3VwZXJleHByZXNzaW9uLgoKXGNvbW1lbnRhcnl7Ck5vdGUgdGhhdCBhIHBhcmFtZXRlciB0aGF0IGlzIG5vdCB1c2VkIGluIGEgc3VwZXJleHByZXNzaW9uIHRoYXQgaXMgcmVzdHJpY3RlZCB0byBjZXJ0YWluIHR5cGVzIGNhbiBiZSBhIGNvbnN0YW50IG9mIGFueSB0eXBlLiBGb3IgZXhhbXBsZX0KClxiZWdpbntkYXJ0Q29kZX0KXENMQVNTe30gQSBcewogIFxGSU5BTHt9IG07CiAgXENPTlNUe30gQSh0aGlzLm0pOwpcfQpcZW5ke2RhcnRDb2RlfQoKXGNvbW1lbnRhcnl7Y2FuIGJlIGluc3RhbnRpYXRlZCB2aWEgXGNke1xDT05TVHt9IEEoXENPTlNUIFtdKTt9fQoKCgpcY29tbWVudGFyeXsKVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIHBvdGVudGlhbGx5IGNvbnN0YW50IGV4cHJlc3Npb24gYW5kIGEgY29tcGlsZS10aW1lIGNvbnN0YW50IGV4cHJlc3Npb24gKFxyZWZ7Y29uc3R9KSBkZXNlcnZlcyBzb21lIGV4cGxhbmF0aW9uLiAKClRoZSBrZXkgaXNzdWUgaXMgd2hldGhlciBvbmUgdHJlYXRzIHRoZSBmb3JtYWwgcGFyYW1ldGVycyBvZiBhIGNvbnN0cnVjdG9yIGFzIGNvbXBpbGUtdGltZSBjb25zdGFudHMuIAoKSWYgYSBjb25zdGFudCBjb25zdHJ1Y3RvciBpcyBpbnZva2VkIGZyb20gYSBjb25zdGFudCBvYmplY3QgZXhwcmVzc2lvbiwgdGhlIGFjdHVhbCBhcmd1bWVudHMgd2lsbCBiZSByZXF1aXJlZCB0byBiZSBjb21waWxlLXRpbWUgY29uc3RhbnRzLiBUaGVyZWZvcmUsIGlmIHdlIHdlcmUgYXNzdXJlZCB0aGF0IGNvbnN0YW50IGNvbnN0cnVjdG9ycyB3ZXJlIGFsd2F5cyBpbnZva2VkIGZyb20gY29uc3RhbnQgb2JqZWN0IGV4cHJlc3Npb25zLCB3ZSBjb3VsZCBhc3N1bWUgdGhhdCB0aGUgZm9ybWFsIHBhcmFtZXRlcnMgb2YgYSBjb25zdHJ1Y3RvciB3ZXJlIGNvbXBpbGUtdGltZSBjb25zdGFudHMuCgpIb3dldmVyLCBjb25zdGFudCBjb25zdHJ1Y3RvcnMgY2FuIGFsc28gYmUgaW52b2tlZCBmcm9tIG9yZGluYXJ5IGluc3RhbmNlIGNyZWF0aW9uIGV4cHJlc3Npb25zIChccmVme25ld30pLCBhbmQgc28gdGhlIGFib3ZlIGFzc3VtcHRpb24gaXMgbm90IGdlbmVyYWxseSB2YWxpZC4KCk5ldmVydGhlbGVzcywgdGhlIHVzZSBvZiB0aGUgZm9ybWFsIHBhcmFtZXRlcnMgb2YgYSBjb25zdGFudCBjb25zdHJ1Y3RvciB3aXRoaW4gdGhlIGNvbnN0cnVjdG9yIGlzIG9mIGNvbnNpZGVyYWJsZSB1dGlsaXR5LiBUaGUgY29uY2VwdCBvZiBwb3RlbnRpYWxseSBjb25zdGFudCBleHByZXNzaW9ucyBpcyBpbnRyb2R1Y2VkIHRvIGZhY2lsaXRhdGUgbGltaXRlZCB1c2Ugb2Ygc3VjaCBmb3JtYWwgcGFyYW1ldGVycy4gU3BlY2lmaWNhbGx5LCB3ZSBhbGxvdyB0aGUgdXNhZ2Ugb2YgdGhlIGZvcm1hbCBwYXJhbWV0ZXJzIG9mIGEgY29uc3RhbnQgY29uc3RydWN0b3IgZm9yIGV4cHJlc3Npb25zIHRoYXQgaW52b2x2ZSBidWlsdC1pbiBvcGVyYXRvcnMsIGJ1dCBub3QgZm9yIGNvbnN0YW50IG9iamVjdHMsIGxpc3RzIGFuZCBtYXBzLiBUaGlzIGFsbG93cyBmb3IgY29uc3RydWN0b3JzIHN1Y2ggYXM6Cn0KClxiZWdpbntkYXJ0Q29kZX0KXENMQVNTe30gQyBcewogIFxGSU5BTHt9IHg7IFxGSU5BTHt9IHk7IFxGSU5BTHt9IHo7CiAgXENPTlNUe30gQyhwLCBxKTogeCA9IHEsIHkgPSBwICsgMTAwLCB6ID0gcCArIHE7CiAgJSB3aGF0IGFib3V0IAogJSAgXENPTlNUe30gQyhwLCBxKTogeCA9IHEsIHkgPSBwICsgMTAwLCB6ID0gcCArICdmb28nOwogJSBwZXJoYXBzIG1vb3QuIEN1cnJlbnQgc3BlYyBzYXlzIHRoYXQgd291bGQgYmUgb2s7IHR5cGUgY2hlY2tlciBjYW4gd29ycnksIGFzIGNhbiBleGVjdXRpb24sIHdoaWNoIGlzIGF0IGNvbXBpbGUgdGltZSBhbnl3YXkKXH0KXGVuZHtkYXJ0Q29kZX0KClxjb21tZW50YXJ5ewpUaGUgYXNzaWdubWVudCB0byBcY29kZXt4fSBpcyBhbGxvd2VkIHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgXGNvZGV7cX0gaXMgYSBjb21waWxlLXRpbWUgY29uc3RhbnQgKGV2ZW4gdGhvdWdoIFxjb2Rle3F9IGlzIG5vdCwgaW4gZ2VuZXJhbCBhIGNvbXBpbGUtdGltZSBjb25zdGFudCkuICBUaGUgYXNzaWdubWVudCB0byBcY29kZXt5fSBpcyBzaW1pbGFyLCBidXQgcmFpc2VzIGFkZGl0aW9uYWwgcXVlc3Rpb25zLiBJbiB0aGlzIGNhc2UsIHRoZSBzdXBlcmV4cHJlc3Npb24gb2YgXGNvZGV7cH0gaXMgXGNvZGV7cCArIDEwMH0sIGFuZCBpdCByZXF1aXJlcyB0aGF0IFxjb2Rle3B9IGJlIGEgbnVtZXJpYyBjb21waWxlLXRpbWUgY29uc3RhbnQgZm9yIHRoZSBlbnRpcmUgZXhwcmVzc2lvbiB0byBiZSBjb25zaWRlcmVkIGNvbnN0YW50LiAgVGhlIHdvcmRpbmcgb2YgdGhlIHNwZWNpZmljYXRpb24gYWxsb3dzIHVzIHRvIGFzc3VtZSB0aGF0IFxjb2Rle3B9IGV2YWx1YXRlcyB0byBhbiBpbnRlZ2VyLiBBIHNpbWlsYXIgYXJndW1lbnQgaG9sZHMgZm9yIFxjb2Rle3B9IGFuZCBcY29kZXtxfSBpbiB0aGUgYXNzaWdubWVudCB0byBcY29kZXt6fS4KCkhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgY29uc3RydWN0b3JzIGFyZSBkaXNhbGxvd2VkOgp9CgpcYmVnaW57ZGFydENvZGV9ClxDTEFTU3t9IEQgXHsKICBcRklOQUx7fSB3OwogIFxDT05TVHt9IEQubWFrZUxpc3QocCk6IHcgPSBcQ09OU1R7fSBbcF07ICAvLyBjb21waWxlLXRpbWUgZXJyb3IKICBcQ09OU1R7fSBELm1ha2VNYXAocCk6IHcgPSBcQ09OU1R7fSBce2BgaGVscCcnOiBxXH07IC8vIGNvbXBpbGUtdGltZSBlcnJvcgogIFxDT05TVHt9IEQubWFrZUMocCk6IHcgPSBcQ09OU1R7fSBDKHAsIDEyKTsgLy8gY29tcGlsZS10aW1lIGVycm9yClx9ClxlbmR7ZGFydENvZGV9CgpcY29tbWVudGFyeXsKVGhlIHByb2JsZW0gaXMgbm90IHRoYXQgdGhlIGFzc2lnbm1lbnRzIHRvIFxjb2Rle3d9IGFyZSBub3QgcG90ZW50aWFsbHkgY29uc3RhbnQ7IHRoZXkgYXJlLiAgSG93ZXZlciwgYWxsIHRoZXNlIHJ1biBhZm91bCBvZiB0aGUgcnVsZXMgZm9yIGNvbnN0YW50IGxpc3RzIChccmVme2xpc3RzfSksIG1hcHMgKFxyZWZ7bWFwc30pIGFuZCBvYmplY3RzIChccmVme2NvbnN0fSksIGFsbCBvZiB3aGljaCBpbmRlcGVuZGVudGx5IHJlcXVpcmUgdGhlaXIgc3ViZXhwcmVzc2lvbnMgdG8gYmUgY29uc3RhbnQgZXhwcmVzc2lvbnMuCn0KClxyYXRpb25hbGV7CkFsbCBvZiB0aGUgaWxsZWdhbCBjb25zdHJ1Y3RvcnMgb2YgXGNvZGV7RH0gYWJvdmUgY291bGQgbm90IGJlIHNlbnNpYmx5IGludm9rZWQgdmlhIFxORVd7fSwgYmVjYXVzZSBhbiBleHByZXNzaW9uIHRoYXQgbXVzdCBiZSBjb25zdGFudCBjYW5ub3QgZGVwZW5kIG9uIGEgZm9ybWFsIHBhcmFtZXRlciwgd2hpY2ggbWF5IG9yIG1heSBub3QgYmUgY29uc3RhbnQuIEluIGNvbnRyYXN0LCB0aGUgbGVnYWwgZXhhbXBsZXMgbWFrZSBzZW5zZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGNvbnN0cnVjdG9yIGlzIGludm9rZWQgdmlhIFxDT05TVHt9IG9yIHZpYSBcTkVXe30uCgpDYXJlZnVsIHJlYWRlcnMgd2lsbCBvZiBjb3Vyc2Ugd29ycnkgYWJvdXQgY2FzZXMgd2hlcmUgdGhlIGFjdHVhbCBhcmd1bWVudHMgdG8gXGNvZGV7QygpfSBhcmUgY29uc3RhbnRzLCBidXQgYXJlIG5vdCBudW1lcmljLiBUaGlzIGlzIHByZWNsdWRlZCBieSB0aGUgZm9sbG93aW5nIHJ1bGUsIGNvbWJpbmVkIHdpdGggdGhlIHJ1bGVzIGZvciBldmFsdWF0aW5nIGNvbnN0YW50IG9iamVjdHMgKFxyZWZ7Y29uc3R9KS4KfQoKV2hlbiBpbnZva2VkIGZyb20gYSBjb25zdGFudCBvYmplY3QgZXhwcmVzc2lvbiwgYSBjb25zdGFudCBjb25zdHJ1Y3RvciBtdXN0IHRocm93IGFuIGV4Y2VwdGlvbiBpZiBhbnkgb2YgaXRzIGFjdHVhbCBwYXJhbWV0ZXJzIGlzIGEgdmFsdWUgdGhhdCB3b3VsZCBwcmV2ZW50IG9uZSBvZiB0aGUgcG90ZW50aWFsbHkgY29uc3RhbnQgZXhwcmVzc2lvbnMgd2l0aGluIGl0IGZyb20gYmVpbmcgYSB2YWxpZCBjb21waWxlLXRpbWUgY29uc3RhbnQuCgolRGlzY3VzcyBFeHRlcm5hbCBDb25zdHJ1Y3RvcnMgaW4gbmUgc3Vic3Vic2VjdGlvbiBoZXJlCgpcc3Vic2VjdGlvbntTdGF0aWMgTWV0aG9kc30KXGxhYmVse3N0YXRpY01ldGhvZHN9Cgp7XGVtIFN0YXRpYyBtZXRob2RzfSBhcmUgZnVuY3Rpb25zLCBvdGhlciB0aGFuIGdldHRlcnMgb3Igc2V0dGVycywgd2hvc2UgZGVjbGFyYXRpb25zIGFyZSBpbW1lZGlhdGVseSBjb250YWluZWQgd2l0aGluIGEgY2xhc3MgZGVjbGFyYXRpb24gYW5kIHRoYXQgYXJlIGRlY2xhcmVkIFxTVEFUSUN7fS4gVGhlIHN0YXRpYyBtZXRob2RzIG9mIGEgY2xhc3MgJEMkIGFyZSB0aG9zZSBzdGF0aWMgbWV0aG9kcyBkZWNsYXJlZCBieSAkQyQuCgpUaGUgZWZmZWN0IG9mIGEgc3RhdGljIG1ldGhvZCBkZWNsYXJhdGlvbiBpbiBjbGFzcyAkQyQgaXMgdG8gYWRkIGFuIGluc3RhbmNlIG1ldGhvZCB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kIHNpZ25hdHVyZSB0byB0aGUgXGNvZGV7VHlwZX0gb2JqZWN0IGZvciBjbGFzcyAkQyQgdGhhdCBmb3J3YXJkcyAoXHJlZntmdW5jdGlvbkRlY2xhcmF0aW9uc30pICB0byB0aGUgc3RhdGljIG1ldGhvZC4KClxyYXRpb25hbGV7CkluaGVyaXRhbmNlIG9mIHN0YXRpYyBtZXRob2RzIGhhcyBsaXR0bGUgdXRpbGl0eSBpbiBEYXJ0LiBTdGF0aWMgbWV0aG9kcyBjYW5ub3QgYmUgb3ZlcnJpZGRlbi4gQW55IHJlcXVpcmVkIHN0YXRpYyBmdW5jdGlvbiBjYW4gYmUgb2J0YWluZWQgZnJvbSBpdHMgZGVjbGFyaW5nIGxpYnJhcnksIGFuZCB0aGVyZSBpcyBubyBuZWVkIHRvIGJyaW5nIGl0IGludG8gc2NvcGUgdmlhIGluaGVyaXRhbmNlLiBFeHBlcmllbmNlIHNob3dzIHRoYXQgZGV2ZWxvcGVycyBhcmUgY29uZnVzZWQgYnkgdGhlIGlkZWEgb2YgaW5oZXJpdGVkIG1ldGhvZHMgdGhhdCBhcmUgbm90IGluc3RhbmNlIG1ldGhvZHMuCgpPZiBjb3Vyc2UsIHRoZSBlbnRpcmUgbm90aW9uIG9mIHN0YXRpYyBtZXRob2RzIGlzIGRlYmF0YWJsZSwgYnV0IGl0IGlzIHJldGFpbmVkIGhlcmUgYmVjYXVzZSBzbyBtYW55IHByb2dyYW1tZXJzIGFyZSBmYW1pbGlhciB3aXRoIGl0LiBEYXJ0IHN0YXRpYyBtZXRob2RzIG1heSBiZSBzZWVuIGFzIGZ1bmN0aW9ucyBvZiB0aGUgZW5jbG9zaW5nIGxpYnJhcnkuIAp9CgpJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmIGEgY2xhc3MgJEMkIGRlY2xhcmVzIGEgc3RhdGljIG1ldGhvZCBuYW1lZCAkbiQgYW5kIGhhcyBhIHNldHRlciBuYW1lZCAkbj0kLiAKJUl0IGlzIGEgc3RhdGljIHdhcm5pbmcgaWYgYSBjbGFzcyBoYXMgYSBzdGF0aWMgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBhIHN0YXRpYyBtZW1iZXIgb2Ygb25lIG9mIGl0cyBzdXBlcmNsYXNzZXMuCgolXHJhdGlvbmFsZXsKJVRoaXMgbGFzdCByZXN0cmljdGlvbiBtYWtlcyBjbGFzc2VzIG1vcmUgYnJpdHRsZSB3aXRoIHJlc3BlY3QgdG8gY2hhbmdlcyBpbiB0aGUgY2xhc3MgaGllcmFyY2h5LiBJdCBzdGVtcyBmcm9tIGEgZ2VuZXJhbCBvYnNlcnZhdGlvbiB0aGF0IHNoYWRvd2luZyBvZiBuYW1lcyBpbiB0aGUgc2FtZSBzY29wZSBpcyBxdWVzdGlvbmFibGUgYW5kIHNob3VsZCBlbGljaXQgYSB3YXJuaW5nLiAKJX0KJVxjb21tZW50YXJ5ewolVGhlcmUgaXMgbm8gaGlkaW5nIG9mIHN0YXRpYyBtZXRob2RzLCBvciBvZiBzdGF0aWMgdmFyaWFibGVzLgolfQoKClxzdWJzZWN0aW9ue1N0YXRpYyBWYXJpYWJsZXN9ClxsYWJlbHtzdGF0aWNWYXJpYWJsZXN9Cgp7XGVtIFN0YXRpYyB2YXJpYWJsZXN9IGFyZSB2YXJpYWJsZXMgd2hvc2UgZGVjbGFyYXRpb25zIGFyZSBpbW1lZGlhdGVseSBjb250YWluZWQgd2l0aGluIGEgY2xhc3MgZGVjbGFyYXRpb24gYW5kIHRoYXQgYXJlIGRlY2xhcmVkIFxTVEFUSUN7fS4gVGhlIHN0YXRpYyB2YXJpYWJsZXMgb2YgYSBjbGFzcyAkQyQgYXJlIHRob3NlIHN0YXRpYyB2YXJpYWJsZXMgZGVjbGFyZWQgYnkgJEMkLgoKJUEgc3RhdGljIHZhcmlhYmxlIGRlY2xhcmF0aW9uICBvZiBvbmUgb2YgdGhlIGZvcm1zIFxjb2Rle1xTVEFUSUN7fSAkVCQgJHYkO30sICBcY29kZXtcU1RBVElDe30gJFQkICR2JCA9ICRlJDt9ICwgIFxjb2Rle1xTVEFUSUN7fSBcQ09OU1R7fSAkVCQgJHYkID0gJGUkO30gIG9yIFxjb2Rle1xTVEFUSUN7fSBcRklOQUx7fSAkVCQgJHYkID0gJGUkO30gYWx3YXlzIGluZHVjZXMgYW4gaW1wbGljaXQgc3RhdGljIGdldHRlciBmdW5jdGlvbiAoXHJlZntnZXR0ZXJzfSkgd2l0aCBzaWduYXR1cmUgCgolXFNUQVRJQ3t9ICRUJCBcR0VUe30gJHYkCgold2hvc2UgaW52b2NhdGlvbiBldmFsdWF0ZXMgYXMgZGVzY3JpYmVkIGJlbG93IChccmVme2V2YWx1YXRpb25PZlN0YXRpY1ZhcmlhYmxlR2V0dGVyc30pLiV0byB0aGUgdmFsdWUgc3RvcmVkIGluICR2JC4KCgolQSBzdGF0aWMgdmFyaWFibGUgZGVjbGFyYXRpb24gIG9mIG9uZSBvZiB0aGUgZm9ybXMgXGNvZGV7XFNUQVRJQ3t9IFxWQVJ7fSAkdiQ7fSwgIFxjb2Rle1xTVEFUSUN7fSBcVkFSe30gJHYkID0gJGUkO30gLCAgXGNvZGV7XFNUQVRJQ3t9IFxDT05TVHt9ICR2JCA9ICRlJDt9IG9yIFxjb2Rle1xTVEFUSUN7fSBcRklOQUx7fSAgJHYkID0gJGUkO30gIGFsd2F5cyBpbmR1Y2VzIGFuIGltcGxpY2l0IHN0YXRpYyBnZXR0ZXIgZnVuY3Rpb24gd2l0aCBzaWduYXR1cmUgCgolXFNUQVRJQ3t9IFxHRVR7fSAkdiQKCiV3aG9zZSAgaW52b2NhdGlvbiBldmFsdWF0ZXMgYXMgZGVzY3JpYmVkIGJlbG93IChccmVme2V2YWx1YXRpb25PZlN0YXRpY1ZhcmlhYmxlR2V0dGVyc30pLiV0byB0aGUgdmFsdWUgc3RvcmVkIGluICR2JC4KCiVBIG5vbi1maW5hbCBzdGF0aWMgdmFyaWFibGUgZGVjbGFyYXRpb24gIG9mIHRoZSBmb3JtIFxjb2Rle1xTVEFUSUN7fSAkVCQgJHYkO30gb3IgdGhlIGZvcm0gIFxjb2Rle1xTVEFUSUN7fSAkVCQgJHYkID0gJGUkO30gICBhbHdheXMgaW5kdWNlcyBhbiBpbXBsaWNpdCBzdGF0aWMgc2V0dGVyIGZ1bmN0aW9uIChccmVme3NldHRlcnN9KSB3aXRoIHNpZ25hdHVyZSAKCiVcU1RBVElDe30gXFZPSUR7fSBcU0VUe30gJHY9KFQkICR4KSQKCiV3aG9zZSBleGVjdXRpb24gc2V0cyB0aGUgdmFsdWUgb2YgJHYkIHRvIHRoZSBpbmNvbWluZyBhcmd1bWVudCAkeCQuCgolQSBzdGF0aWMgdmFyaWFibGUgZGVjbGFyYXRpb24gIG9mIHRoZSBmb3JtIFxjb2Rle1xTVEFUSUN7fSBcVkFSe30gJHYkO30gb3IgdGhlIGZvcm0gIFxjb2Rle1xTVEFUSUN7fSBcVkFSe30gJHYkID0gJGUkO30gICBhbHdheXMgaW5kdWNlcyBhbiBpbXBsaWNpdCBzdGF0aWMgc2V0dGVyIGZ1bmN0aW9uIHdpdGggc2lnbmF0dXJlIAoKJVxTVEFUSUN7fSBcU0VUe30gJHY9KHgpJAoKJXdob3NlIGV4ZWN1dGlvbiBzZXRzIHRoZSB2YWx1ZSBvZiAkdiQgdG8gdGhlIGluY29taW5nIGFyZ3VtZW50ICR4JC4KCiVFeHRyZXJuYWwgc3RhdGljIGZ1bmN0aW9ucywgZ2V0dGVycywgc2V0dGVycwoKJVxzdWJzdWJzZWN0aW9ue0V2YWx1YXRpb24gb2YgSW1wbGljaXQgU3RhdGljIFZhcmlhYmxlIEdldHRlcnN9CiVcbGFiZWx7ZXZhbHVhdGlvbk9mU3RhdGljVmFyaWFibGVHZXR0ZXJzfQoKJUxldCAkZCQgYmUgdGhlIGRlY2xhcmF0aW9uIG9mIGEgc3RhdGljIHZhcmlhYmxlICR2JC4gVGhlIGltcGxpY2l0IGdldHRlciBtZXRob2Qgb2YgJHYkIGV4ZWN1dGVzIGFzIGZvbGxvd3M6IAolXGJlZ2lue2l0ZW1pemV9CiVcaXRlbSBJZiAkZCQgaXMgb2Ygb25lIG9mIHRoZSBmb3JtcyBcY29kZXtcU1RBVElDe30gXFZBUnt9ICR2JCA9ICRlJDt9ICwgXGNvZGV7XFNUQVRJQ3t9ICRUJCAkdiQgPSAkZSQ7IH0sIFxjb2Rle1xTVEFUSUN7fSBcRklOQUx7fSAkdiQgPSAkZSQ7IH0gb3IgXGNvZGV7XFNUQVRJQ3t9IFxGSU5BTHt9ICRUJCAkdiQgPSAkZSQ7fSBhbmQgbm8gdmFsdWUgaGFzIHlldCBiZWVuIHN0b3JlZCBpbnRvICR2JCB0aGVuIHRoZSBpbml0aWFsaXplciBleHByZXNzaW9uICRlJCBpcyBldmFsdWF0ZWQuIElmLCBkdXJpbmcgdGhlIGV2YWx1YXRpb24gb2YgJGUkLCB0aGUgZ2V0dGVyIGZvciAkdiQgaXMgcmVmZXJlbmNlZCwgYSBcY29kZXtDeWNsaWNJbml0aWFsaXphdGlvbkVycm9yfSBpcyB0aHJvd24uIElmIHRoZSBldmFsdWF0aW9uIHN1Y2NlZWRlZCB5aWVsZGluZyBhbiBvYmplY3QgJG8kLCBsZXQgJHIgPSBvJCwgb3RoZXJ3aXNlIGxldCAkciA9IFxOVUxMe30kLiBJbiBhbnkgY2FzZSwgJHIkIGlzIHN0b3JlZCBpbnRvICR2JC4gVGhlIHJlc3VsdCBvZiBleGVjdXRpbmcgdGhlIGdldHRlciBpcyAkciQuIAolXGl0ZW0gIElmICRkJCBpcyBvZiBvbmUgb2YgdGhlIGZvcm1zIFxjb2Rle1xTVEFUSUN7fSBcQ09OU1R7fSAkdiQgPSAkZSQ7IH0gb3IgXGNvZGV7XFNUQVRJQ3t9IFxDT05TVHt9ICRUJCAkdiQgPSAkZSQ7fSB0aGUgcmVzdWx0IG9mIHRoZSBnZXR0ZXIgaXMgdGhlIHZhbHVlIG9mIHRoZSBjb21waWxlIHRpbWUgY29uc3RhbnQgJGUkLgolT3RoZXJ3aXNlCiVcaXRlbSBUaGUgcmVzdWx0IG9mIGV4ZWN1dGluZyB0aGUgZ2V0dGVyIG1ldGhvZCBpcyB0aGUgdmFsdWUgc3RvcmVkIGluICR2JC4gIAolXGVuZHtpdGVtaXplfQoKCgpcc3Vic2VjdGlvbntTdXBlcmNsYXNzZXN9ClxsYWJlbHtzdXBlcmNsYXNzZXN9CgpUaGUgc3VwZXJjbGFzcyBvZiBhIGNsYXNzICRDJCB0aGF0IGhhcyBhIHdpdGggY2xhdXNlIFxjb2Rle1xXSVRIe30gJE1fMSwgXGxkb3RzLCBNX2skfSBhbmQgYW4gZXh0ZW5kcyBjbGF1c2UgXGNvZGV7XEVYVEVORFN7fSBTfSBpcyB0aGUgYXBwbGljYXRpb24gb2YgbWl4aW4gKFxyZWZ7bWl4aW5zfSkgJE1fayogXGNkb3RzICogTV8xJCAgdG8gUy4gIElmIG5vIFxXSVRIe30gY2xhdXNlIGlzIHNwZWNpZmllZCB0aGVuICB0aGUgXEVYVEVORFN7fSBjbGF1c2Ugb2YgYSBjbGFzcyAkQyQgc3BlY2lmaWVzIGl0cyBzdXBlcmNsYXNzLiBJZiBubyBcRVhURU5EU3t9IGNsYXVzZSBpcyBzcGVjaWZpZWQsIHRoZW4gZWl0aGVyOgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gJEMkIGlzIFxjb2Rle09iamVjdH0sIHdoaWNoIGhhcyBubyBzdXBlcmNsYXNzLiBPUgpcaXRlbSBDbGFzcyAkQyQgaXMgIGRlZW1lZCB0byBoYXZlIGFuIFxFWFRFTkRTe30gY2xhdXNlIG9mIHRoZSBmb3JtIFxjb2Rle1xFWFRFTkRTe30gT2JqZWN0fSwgYW5kIHRoZSBydWxlcyBhYm92ZSBhcHBseS4gClxlbmR7aXRlbWl6ZX0KCkl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIHRvIHNwZWNpZnkgYW4gXEVYVEVORFN7fSBjbGF1c2UgZm9yIGNsYXNzIFxjb2Rle09iamVjdH0uCgpcYmVnaW57Z3JhbW1hcn0Ke1xiZiBzdXBlcmNsYXNzOn0KICAgICAgXEVYVEVORFN7fSB0eXBlCiAgICAuClxlbmR7Z3JhbW1hcn0KCiVUaGUgc3VwZXJjbGFzcyBjbGF1c2Ugb2YgYSBjbGFzcyBDIGlzIHByb2Nlc3NlZCB3aXRoaW4gdGhlIGVuY2xvc2luZyBzY29wZSBvZiB0aGUgc3RhdGljIHNjb3BlIG9mIEMuCiVcY29tbWVudGFyeXsKJVRoaXMgbWVhbnMgdGhhdCBpbiBhIGdlbmVyaWMgY2xhc3MsIHRoZSB0eXBlIHBhcmFtZXRlcnMgb2YgdGhlIGdlbmVyaWMgYXJlIGF2YWlsYWJsZSBpbiB0aGUgc3VwZXJjbGFzcyBjbGF1c2UuCiV9IAoKJUl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmICB0aGUgXEVYVEVORFN7fSBjbGF1c2Ugb2YgYSBjbGFzcyAkQyQgaW5jbHVkZXMgYSB0eXBlIGV4cHJlc3Npb24gdGhhdCBkb2VzIG5vdCBkZW5vdGUgYSBjbGFzcyBhdmFpbGFibGUgaW4gdGhlIGxleGljYWwgc2NvcGUgb2YgJEMkLiAKSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgIHRoZSBcRVhURU5EU3t9IGNsYXVzZSBvZiBhIGNsYXNzICRDJCBzcGVjaWZpZXMgYSBtYWxmb3JtZWQgIHR5cGUgb3IgYSBkZWZlcnJlZCB0eXBlIChccmVme3N0YXRpY1R5cGVzfSkgYXMgYSBzdXBlcmNsYXNzLgolIHRvbyBzdHJpY3Q/IERvIHdlIGUgd2FudCBleHRlbmRzIExpc3Q8VW5kZWNsYXJlZD4gdG8gd29yayBhcyBMaXN0PGR5bmFtaWM+PyAKClxjb21tZW50YXJ5eyBUaGUgdHlwZSBwYXJhbWV0ZXJzIG9mIGEgZ2VuZXJpYyBjbGFzcyBhcmUgYXZhaWxhYmxlIGluIHRoZSBsZXhpY2FsIHNjb3BlIG9mIHRoZSBzdXBlcmNsYXNzIGNsYXVzZSwgcG90ZW50aWFsbHkgc2hhZG93aW5nIGNsYXNzZXMgaW4gdGhlIHN1cnJvdW5kaW5nIHNjb3BlLiBUaGUgZm9sbG93aW5nIGNvZGUgaXMgdGhlcmVmb3JlIGlsbGVnYWwgYW5kIHNob3VsZCBjYXVzZSBhIGNvbXBpbGUtdGltZSBlcnJvcjoKfQoKXGJlZ2lue2RhcnRDb2RlfQpjbGFzcyBUIFx7XH0KCi8qIENvbXBpbGF0aW9uIGVycm9yOiBBdHRlbXB0IHRvIHN1YmNsYXNzIGEgdHlwZSBwYXJhbWV0ZXIgKi8KY2xhc3MgRyQ8JFQkPiQgZXh0ZW5kcyBUIFx7XH0gCgpcZW5ke2RhcnRDb2RlfQoKCkEgY2xhc3MgJFMkIGlzIHtcZW0gYSBzdXBlcmNsYXNzfSBvZiBhIGNsYXNzICRDJCBpZmYgZWl0aGVyOgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gJFMkIGlzIHRoZSBzdXBlcmNsYXNzIG9mICRDJCwgb3IgClxpdGVtICRTJCBpcyBhIHN1cGVyY2xhc3Mgb2YgYSBjbGFzcyAkU157XHByaW1lfSQgYW5kICRTXntccHJpbWV9JCBpcyBhIHN1cGVyY2xhc3Mgb2YgJEMkLiAKXGVuZHtpdGVtaXplfQoKSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgYSBjbGFzcyAkQyQgaXMgYSBzdXBlcmNsYXNzIG9mIGl0c2VsZi4KCgogICAgCiAKIFxzdWJzdWJzZWN0aW9ue0luaGVyaXRhbmNlIGFuZCBPdmVycmlkaW5nfQogXGxhYmVse2luaGVyaXRhbmNlQW5kT3ZlcnJpZGluZ30KCgolQSBjbGFzcyAkQyQgIHtcZW0gaW5oZXJpdHN9IGFueSBhY2Nlc3NpYmxlIGluc3RhbmNlIG1lbWJlcnMgb2YgaXRzIHN1cGVyY2xhc3MgdGhhdCBhcmUgbm90IG92ZXJyaWRkZW4gYnkgbWVtYmVycyBkZWNsYXJlZCBpbiAkQyQuIAoKTGV0ICRDJCBiZSBhIGNsYXNzLCAgbGV0ICRBJCBiZSBhIHN1cGVyY2xhc3Mgb2YgJEMkLCBhbmQgbGV0ICAkU18xIFxsZG90cyBTX2skIGJlIHN1cGVyY2xhc3NlcyBvZiAkQyQgdGhhdCBhcmUgYWxzbyBzdWJjbGFzc2VzIG9mICRBJC4gJEMkIHtcZW0gaW5oZXJpdHN9IGFsbCBhY2Nlc3NpYmxlIGluc3RhbmNlICBtZW1iZXJzIG9mICAkQSQgdGhhdCBoYXZlIG5vdCBiZWVuIG92ZXJyaWRkZW4gYnkgYSBkZWNsYXJhdGlvbiBpbiAkQyQgb3IgaW4gYXQgbGVhc3Qgb25lIG9mICRTXzEgXGxkb3RzIFNfayQuCgpccmF0aW9uYWxlIHsKSXQgd291bGQgYmUgIG1vcmUgYXR0cmFjdGl2ZSB0byBnaXZlIGEgcHVyZWx5IGxvY2FsIGRlZmluaXRpb24gb2YgaW5oZXJpdGFuY2UsIHRoYXQgZGVwZW5kZWQgb25seSBvbiB0aGUgbWVtYmVycyBvZiB0aGUgZGlyZWN0IHN1cGVyY2xhc3MgJFMkLiBIb3dldmVyLCBhIGNsYXNzICRDJCBjYW4gaW5oZXJpdCBhIG1lbWJlciAkbSQgdGhhdCAgaXMgbm90IGEgbWVtYmVyIG9mIGl0cyBzdXBlcmNsYXNzICAkUyQuIFRoaXMgY2FuIG9jY3VyIHdoZW4gdGhlIG1lbWJlciAkbSQgaXMgcHJpdmF0ZQp0byB0aGUgbGlicmFyeSAkTF8xJCBvZiAkQyQsIHdoZXJlYXMgJFMkIGNvbWVzIGZyb20gYSBkaWZmZXJlbnQgbGlicmFyeSAkTF8yJCwgYnV0IAp0aGUgc3VwZXJjbGFzcyBjaGFpbiBvZiAkUyQgaW5jbHVkZXMgYSBjbGFzcyBkZWNsYXJlZCBpbiAkTF8xJC4KfQoKQSBjbGFzcyBtYXkgb3ZlcnJpZGUgaW5zdGFuY2UgbWVtYmVycyB0aGF0IHdvdWxkIG90aGVyd2lzZSBoYXZlIGJlZW4gaW5oZXJpdGVkIGZyb20gaXRzIHN1cGVyY2xhc3MuIAoKTGV0ICRDID0gU18wJCBiZSBhIGNsYXNzIGRlY2xhcmVkIGluIGxpYnJhcnkgJEwkLCBhbmQgbGV0ICRce1NfMSBcbGRvdHMgU19rXH0kIGJlIHRoZSBzZXQgb2YgYWxsIHN1cGVyY2xhc3NlcyBvZiAkQyQsIHdoZXJlICRTX2kkIGlzIHRoZSBzdXBlcmNsYXNzIG9mICRTX3tpLTF9JCBmb3IgJGkgXGluIDEgLi4gayQuIExldCAkQyQgZGVjbGFyZSBhIG1lbWJlciAkbSQsIGFuZCBsZXQgICRtXlxwcmltZSQgYmUgYSBtZW1iZXIgb2YgJFNfaiwgaiAgXGluIDEgLi4gayQsICB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIGFzICRtJCwgc3VjaCB0aGF0ICRtXlxwcmltZSQgaXMgYWNjZXNzaWJsZSB0byAkTCQuICBUaGVuICRtJCBvdmVycmlkZXMgJG1eXHByaW1lJCBpZiAkbV5ccHJpbWUkIGlzIG5vdCBhbHJlYWR5IG92ZXJyaWRkZW4gYnkgYSBtZW1iZXIgb2YgYXQgbGVhc3Qgb25lIG9mICRTXzEgXGxkb3RzIFNfe2otMX0kIGFuZCBuZWl0aGVyICRtJCBub3IgJG1eXHByaW1lJCBhcmUgZmllbGRzLgoKJUxldCAkQyQgYmUgYSBjbGFzcyBkZWNsYXJlZCBpbiBsaWJyYXJ5ICRMJCwgd2l0aCBzdXBlcmNsYXNzICRTJCBhbmQgbGV0ICRDJCBkZWNsYXJlIGFuIGluc3RhbmNlIG1lbWJlciAkbSQsIGFuZCAgYXNzdW1lICRTJCBkZWNsYXJlcyBhbiBpbnN0YW5jZSBtZW1iZXIgJG1eXHByaW1lJCB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgJG0kLiBUaGVuICRtJCB7XGVtIG92ZXJyaWRlc30gJG1eXHByaW1lJCBpZmYgJG1eXHByaW1lJCBpcyBhY2Nlc3NpYmxlIChccmVme3ByaXZhY3l9KSB0byAkTCQsICRtJCBoYXMgdGhlIHNhbWUgbmFtZSBhcyAgJG1eXHByaW1lJCAgYW5kIG5laXRoZXIgJG0kIG5vciAkbV5ccHJpbWUkIGFyZSBmaWVsZHMuCgpcY29tbWVudGFyeXtGaWVsZHMgbmV2ZXIgb3ZlcnJpZGUgZWFjaCBvdGhlci4gVGhlIGdldHRlcnMgYW5kIHNldHRlcnMgaW5kdWNlZCBieSBmaWVsZHMgZG8ufQoKXHJhdGlvbmFsZXtBZ2FpbiwgYSBsb2NhbCBkZWZpbml0aW9uIG9mIG92ZXJyaWRpbmcgd291bGQgYmUgcHJlZmVyYWJsZSwgYnV0IGZhaWxzIHRvIGFjY291bnQgZm9yIGxpYnJhcnkgcHJpdmFjeS4KfQoKV2hldGhlciBhbiBvdmVycmlkZSBpcyBsZWdhbCBvciBub3QgaXMgZGVzY3JpYmVkIGVsc2V3aGVyZSBpbiB0aGlzIHNwZWNpZmljYXRpb24gKHNlZSBccmVme2luc3RhbmNlTWV0aG9kc30sIFxyZWZ7Z2V0dGVyc30gYW5kIFxyZWZ7c2V0dGVyc30pLiAKClxjb21tZW50YXJ5e0ZvciBleGFtcGxlIGdldHRlcnMgbWF5IG5vdCBsZWdhbGx5IG92ZXJyaWRlIG1ldGhvZHMgYW5kIHZpY2UgdmVyc2EuIFNldHRlcnMgbmV2ZXIgb3ZlcnJpZGUgbWV0aG9kcyBvciBnZXR0ZXJzLCBhbmQgdmljZSB2ZXJzYSwgYmVjYXVzZSB0aGVpciBuYW1lcyBhbHdheXMgZGlmZmVyLgp9ICAKClxyYXRpb25hbGV7Ckl0IGlzIG5ldmVydGhlbGVzcyBjb252ZW5pZW50IHRvIGRlZmluZSB0aGUgb3ZlcnJpZGUgcmVsYXRpb24gYmV0d2VlbiBtZW1iZXJzIGluIHRoaXMgd2F5LCBzbyB0aGF0IHdlIGNhbiBjb25jaXNlbHkgZGVzY3JpYmUgdGhlIGlsbGVnYWwgY2FzZXMuCn0KClxjb21tZW50YXJ5ewpOb3RlIHRoYXQgaW5zdGFuY2UgdmFyaWFibGVzIGRvIG5vdCBwYXJ0aWNpcGF0ZSBpbiB0aGUgb3ZlcnJpZGUgcmVsYXRpb24sIGJ1dCB0aGUgZ2V0dGVycyBhbmQgc2V0dGVycyB0aGV5IGluZHVjZSBkby4gQWxzbywgZ2V0dGVycyBkb25gdCBvdmVycmlkZSBzZXR0ZXJzIGFuZCB2aWNlIHZlcnNhLiAgRmluYWxseSwgc3RhdGljIG1lbWJlcnMgbmV2ZXIgb3ZlcnJpZGUgYW55dGhpbmcuCn0KCkl0IGlzIGEgc3RhdGljIHdhcm5pbmcgaWYgYSBub24tYWJzdHJhY3QgY2xhc3MgaW5oZXJpdHMgYW4gYWJzdHJhY3QgbWV0aG9kLgoKXGNvbW1lbnRhcnkgewpGb3IgY29udmVuaWVuY2UsIGhlcmUgaXMgYSBzdW1tYXJ5IG9mIHRoZSByZWxldmFudCBydWxlcy4gUmVtZW1iZXIgdGhhdCB0aGlzIGlzIG5vdCBub3JtYXRpdmUuIFRoZSBjb250cm9sbGluZyBsYW5ndWFnZSBpcyBpbiB0aGUgcmVsZXZhbnQgc2VjdGlvbnMgb2YgdGhlIHNwZWNpZmljYXRpb24uCgpcYmVnaW57ZW51bWVyYXRlfQoKXGl0ZW0gVGhlcmUgaXMgb25seSBvbmUgbmFtZXNwYWNlIGZvciBnZXR0ZXJzLCBzZXR0ZXJzLCBtZXRob2RzIGFuZCBjb25zdHJ1Y3RvcnMgKFxyZWZ7c2NvcGluZ30pLiBBIGZpZWxkICRmJCBpbnRyb2R1Y2VzIGEgZ2V0dGVyICRmJCBhbmQgYSBub24tZmluYWwgZmllbGQgJGYkIGFsc28gaW50cm9kdWNlcyBhIHNldHRlciAkZj0kIChccmVme2luc3RhbmNlVmFyaWFibGVzfSwgXHJlZntzdGF0aWNWYXJpYWJsZXN9KS4gV2hlbiB3ZSBzcGVhayBvZiBtZW1iZXJzIGhlcmUsIHdlIG1lYW4gYWNjZXNzaWJsZSBmaWVsZHMsIGdldHRlcnMsIHNldHRlcnMgYW5kIG1ldGhvZHMgKFxyZWZ7Y2xhc3Nlc30pLgpcaXRlbSBZb3UgY2Fubm90IGhhdmUgdHdvICBtZW1iZXJzIHdpdGggdGhlIHNhbWUgbmFtZSBpbiB0aGUgc2FtZSBjbGFzcyAtIGJlIHRoZXkgZGVjbGFyZWQgb3IgaW5oZXJpdGVkIChccmVme3Njb3Bpbmd9LCBccmVme2NsYXNzZXN9KS4KXGl0ZW0gU3RhdGljIG1lbWJlcnMgYXJlIG5ldmVyIGluaGVyaXRlZC4KXGl0ZW0gSXQgaXMgYSB3YXJuaW5nIGlmIHlvdSBoYXZlIGFuICBzdGF0aWMgbWVtYmVyIG5hbWVkICRtJCBpbiB5b3VyIGNsYXNzIG9yIGFueSBzdXBlcmNsYXNzIChldmVuIHRob3VnaCBpdCBpcyBub3QgaW5oZXJpdGVkKSBhbmQgYW4gIGluc3RhbmNlIG1lbWJlciBvZiB0aGUgc2FtZSBuYW1lIChccmVme2luc3RhbmNlTWV0aG9kc30sIFxyZWZ7Z2V0dGVyc30sIFxyZWZ7c2V0dGVyc30pLgpcaXRlbSBJdCBpcyBhIHdhcm5pbmcgaWYgeW91IGhhdmUgYSBzdGF0aWMgc2V0dGVyICR2PSQsIGFuZCBhbiBpbnN0YW5jZSBtZW1iZXIgJHYkIChccmVme3NldHRlcnN9KS4KXGl0ZW0gSXQgaXMgYSB3YXJuaW5nIGlmIHlvdSBoYXZlIGEgc3RhdGljIGdldHRlciAkdiQgYW5kIGFuIGluc3RhbmNlIHNldHRlciAkdj0kIChccmVme2dldHRlcnN9KS4KXGl0ZW0gSWYgeW91IGRlZmluZSBhbiBpbnN0YW5jZSBtZW1iZXIgbmFtZWQgJG0kLCBhbmQgeW91ciBzdXBlcmNsYXNzIGhhcyBhbiAgaW5zdGFuY2UgbWVtYmVyIG9mIHRoZSBzYW1lIG5hbWUsIHRoZXkgb3ZlcnJpZGUgZWFjaCBvdGhlci4gVGhpcyBtYXkgb3IgbWF5IG5vdCBiZSBsZWdhbC4KXGl0ZW0gXGxhYmVse3R5cGVTaWdBc3NpZ25hYmxlfQpJZiB0d28gbWVtYmVycyBvdmVycmlkZSBlYWNoIG90aGVyLCBpdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmIHRoZWlyIHR5cGUgc2lnbmF0dXJlcyBhcmUgbm90IGFzc2lnbmFibGUgdG8gZWFjaCBvdGhlciAoXHJlZntpbnN0YW5jZU1ldGhvZHN9LCBccmVme2dldHRlcnN9LCBccmVme3NldHRlcnN9KSAoYW5kICBzaW5jZSB0aGVzZSBhcmUgZnVuY3Rpb24gdHlwZXMsIHRoaXMgbWVhbnMgdGhlIHNhbWUgYXMgInN1YnR5cGVzIG9mIGVhY2ggb3RoZXIiKS4KXGl0ZW0gXGxhYmVse3JlcXVpcmVkUGFyYW1zfQpJZiB0d28gbWVtYmVycyBvdmVycmlkZSBlYWNoIG90aGVyLCBpdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmIHRoZSBvdmVycmlkaW5nIG1lbWJlciBoYXMgbW9yZSByZXF1aXJlZCBwYXJhbWV0ZXJzICB0aGFuIHRoZSBvdmVycmlkZGVuIG9uZSAoXHJlZntpbnN0YW5jZU1ldGhvZHN9KS4gClxpdGVtICBcbGFiZWx7b3B0aW9uYWxQb3NpdGlvbmFsc30KSWYgdHdvIG1lbWJlcnMgb3ZlcnJpZGUgZWFjaCBvdGhlciwgaXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiB0aGUgb3ZlcnJpZGluZyBtZW1iZXIgaGFzIGZld2VyICBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgdGhhbiB0aGUgdGhlIG92ZXJyaWRkZW4gb25lIChccmVme2luc3RhbmNlTWV0aG9kc30pLgpcaXRlbSAgXGxhYmVse25hbWVkUGFyYW1zfQpJZiB0d28gbWVtYmVycyBvdmVycmlkZSBlYWNoIG90aGVyLCBpdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmIHRoZSBvdmVycmlkaW5nIG1lbWJlciBkb2VzIG5vdCBoYXZlIGFsbCB0aGUgbmFtZWQgcGFyYW1ldGVycyB0aGF0IHRoZSB0aGUgb3ZlcnJpZGRlbiBvbmUgaGFzIChccmVme2luc3RhbmNlTWV0aG9kc30pLgpcaXRlbSBTZXR0ZXJzLCBnZXR0ZXJzIGFuZCBvcGVyYXRvcnMgbmV2ZXIgaGF2ZSBvcHRpb25hbCBwYXJhbWV0ZXJzIG9mIGFueSBraW5kOyBpdCdzIGEgY29tcGlsZS10aW1lIGVycm9yIChccmVme29wZXJhdG9yc30sIFxyZWZ7Z2V0dGVyc30sIFxyZWZ7c2V0dGVyc30pLgpcaXRlbSBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBhIG1lbWJlciBoYXMgdGhlIHNhbWUgbmFtZSBhcyBpdHMgZW5jbG9zaW5nIGNsYXNzIChccmVme2NsYXNzZXN9KS4KXGl0ZW0gQSBjbGFzcyBoYXMgYW4gaW1wbGljaXQgaW50ZXJmYWNlIChccmVme2NsYXNzZXN9KS4gClxpdGVtIFN1cGVyaW50ZXJmYWNlIG1lbWJlcnMgYXJlIG5vdCBpbmhlcml0ZWQgYnkgYSBjbGFzcywgYnV0IGFyZSBpbmhlcml0ZWQgYnkgaXRzIGltcGxpY2l0IGludGVyZmFjZS4gSW50ZXJmYWNlcyBoYXZlIHRoZWlyIG93biBpbmhlcml0YW5jZSBydWxlcyAoXHJlZntpbnRlcmZhY2VJbmhlcml0YW5jZUFuZE92ZXJyaWRpbmd9KS4KXGl0ZW0gQSBtZW1iZXIgaXMgYWJzdHJhY3QgaWYgaXQgaGFzIG5vIGJvZHkgYW5kIGlzIG5vdCBsYWJlbGVkIFxFWFRFUk5BTHt9IChccmVme2Fic3RyYWN0SW5zdGFuY2VNZW1iZXJzfSwgXHJlZntleHRlcm5hbEZ1bmN0aW9uc30pLgpcaXRlbSBBIGNsYXNzIGlzIGFic3RyYWN0IGlmZiBpdCBpcyBleHBsaWNpdGx5IGxhYmVsZWQgXEFCU1RSQUNUe30uJSBvciBpZiBpdCBkZWNsYXJlcyAobm90IGp1c3QgaW5oZXJpdHMpIGFuIGFic3RyYWN0IG1lbWJlciAoXHJlZntjbGFzc2VzfSkuClxpdGVtIEl0IGlzIGEgc3RhdGljIHdhcm5pbmcgYSBjb25jcmV0ZSBjbGFzcyBoYXMgYW4gYWJzdHJhY3QgbWVtYmVyIChkZWNsYXJlZCBvciBpbmhlcml0ZWQpLgpcaXRlbSBJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGFuZCBhIGR5bmFtaWMgZXJyb3IgdG8gY2FsbCBhIG5vbi1mYWN0b3J5IGNvbnN0cnVjdG9yIG9mIGFuIGFic3RyYWN0IGNsYXNzICAoXHJlZntuZXd9KS4gClxpdGVtIElmIGEgY2xhc3MgZGVmaW5lcyBhbiBpbnN0YW5jZSBtZW1iZXIgbmFtZWQgJG0kLCBhbmQgYW55IG9mIGl0cyBzdXBlcmludGVyZmFjZXMgaGF2ZSBhICBtZW1iZXIgbmFtZWQgJG0kLCB0aGUgaW50ZXJmYWNlIG9mIHRoZSBjbGFzcyBvdmVycmlkZXMgJG0kLgpcaXRlbSAgQW4gaW50ZXJmYWNlIGluaGVyaXRzIGFsbCAgbWVtYmVycyBvZiBpdHMgc3VwZXJpbnRlcmZhY2VzIHRoYXQgYXJlIG5vdCBvdmVycmlkZGVuIGFuZCBub3QgbWVtYmVycyBvZiBtdWx0aXBsZSBzdXBlcmludGVyZmFjZXMuClxpdGVtICBJZiBtdWx0aXBsZSBzdXBlcmludGVyZmFjZXMgb2YgYW4gaW50ZXJmYWNlIGRlZmluZSBhIG1lbWJlciB3aXRoIHRoZSBzYW1lIG5hbWUgJG0kLCB0aGVuIGF0IG1vc3Qgb25lIG1lbWJlciBpcyBpbmhlcml0ZWQuIFRoYXQgbWVtYmVyIChpZiBpdCBleGlzdHMpIGlzIHRoZSBvbmUgd2hvc2UgdHlwZSBpcyBhIHN1YnR5cGUgb2YgYWxsIHRoZSBvdGhlcnMuIElmIHRoZXJlIGlzIG5vIHN1Y2ggbWVtYmVyLCB0aGVuOgpcYmVnaW57aXRlbWl6ZX0KICBcaXRlbSAgQSBzdGF0aWMgd2FybmluZyBpcyBnaXZlbi4KICBcaXRlbSAgSWYgcG9zc2libGUgdGhlIGludGVyZmFjZSBnZXRzIGEgbWVtYmVyIG5hbWVkICRtJCB0aGF0IGhhcyB0aGUgbWluaW11bSBudW1iZXIgb2YgcmVxdWlyZWQgcGFyYW1ldGVycyBhbW9uZyBhbGwgdGhlIG1lbWJlcnMgaW4gdGhlIHN1cGVyaW50ZXJmYWNlcywgdGhlIG1heGltYWwgbnVtYmVyIG9mICAgIHBvc2l0aW9uYWxzLCBhbmQgdGhlIHN1cGVyc2V0IG9mIG5hbWVkIHBhcmFtZXRlcnMuICBUaGUgdHlwZXMgb2YgdGhlc2UgYXJlIGFsbCBcRFlOQU1JQ3t9LiBJZiB0aGlzIGlzIGltcG9zc2libGUgdGhlbiBubyBtZW1iZXIgJG0kIGFwcGVhcnMgaW4gdGhlIGludGVyZmFjZS4KICBcZW5ke2l0ZW1pemV9ICAoXHJlZntpbnRlcmZhY2VJbmhlcml0YW5jZUFuZE92ZXJyaWRpbmd9KQpcaXRlbSAgUnVsZSBccmVme3R5cGVTaWdBc3NpZ25hYmxlfSBhcHBsaWVzIHRvIGludGVyZmFjZXMgYXMgd2VsbCBhcyBjbGFzc2VzICAoXHJlZntpbnRlcmZhY2VJbmhlcml0YW5jZUFuZE92ZXJyaWRpbmd9KS4KXGl0ZW0gIEl0IGlzIGEgc3RhdGljIHdhcm5pbmcgaWYgYSBjb25jcmV0ZSBjbGFzcyBkb2VzIG5vdCBoYXZlIGFuIGltcGxlbWVudGF0aW9uIGZvciBhICBtZXRob2QgaW4gYW55IG9mIGl0cyBzdXBlcmludGVyZmFjZXMgIHVubGVzcyBpdCBkZWNsYXJlcyAgaXRzIG93biBcY2R7bm9TdWNoTWV0aG9kfSBtZXRob2QgKFxyZWZ7c3VwZXJpbnRlcmZhY2VzfSkuIApcaXRlbSBUaGUgaWRlbnRpZmllciBvZiBhIG5hbWVkIGNvbnN0cnVjdG9yIGNhbm5vdCBiZSB0aGUgc2FtZSBhcyB0aGUgbmFtZSBvZiBhIG1lbWJlciBkZWNsYXJlZCAoYXMgb3Bwb3NlZCB0byBpbmhlcml0ZWQpIGluIHRoZSBzYW1lIGNsYXNzIChccmVme2NvbnN0cnVjdG9yc30pLgpcZW5ke2VudW1lcmF0ZX0KfQoKCiVDYW4gd2UgaGF2ZSBhYnN0cmFjdCBnZXR0ZXJzIGFuZCBzZXR0ZXJzPwoKXHN1YnNlY3Rpb257U3VwZXJpbnRlcmZhY2VzfQpcbGFiZWx7c3VwZXJpbnRlcmZhY2VzfQolIHdoYXQgYWJvdXQgcnVsZXMgYWJvdXQgY2xhc3NlcyB0aGF0IGZhaWwgdG8gaW1wbGVtZW50IHRoZWlyIGludGVyZmFjZXM/CgpBIGNsYXNzIGhhcyBhIHNldCBvZiBkaXJlY3Qgc3VwZXJpbnRlcmZhY2VzLiBUaGlzIHNldCBpbmNsdWRlcyB0aGUgaW50ZXJmYWNlIG9mIGl0cyBzdXBlcmNsYXNzIGFuZCB0aGUgaW50ZXJmYWNlcyBzcGVjaWZpZWQgaW4gdGhlIHRoZSBcSU1QTEVNRU5UU3t9ICBjbGF1c2Ugb2YgdGhlIGNsYXNzLgolIGFuZCBhbnkgc3VwZXJpbnRlcmZhY2VzIHNwZWNpZmllZCBieSBpbnRlcmZhY2UgaW5qZWN0aW9uIChccmVme2ludGVyZmFjZUluamVjdGlvbn0pLiAgXFF7VGhlIGxhdHRlciBuZWVkcyB0byBiZSB3b3JkZWQgY2FyZWZ1bGx5IC0gd2hlbiBkbyBpbnRlcmZhY2UgaW5qZWN0aW9uIGNsYXVzZXMgZXhlY3V0ZSBhbmQgaW4gd2hhdCBzY29wZT99CgpcYmVnaW57Z3JhbW1hcn0Ke1xiZiBpbnRlcmZhY2VzOn0KICAgICAgXElNUExFTUVOVFN7fSB0eXBlTGlzdAogICAgLgpcZW5ke2dyYW1tYXJ9CgpJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiAgdGhlIFxJTVBMRU1FTlRTe30gIGNsYXVzZSBvZiBhIGNsYXNzICRDJCBzcGVjaWZpZXMgYSB0eXBlIHZhcmlhYmxlIGFzIGEgc3VwZXJpbnRlcmZhY2UuIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmICB0aGUgIFxJTVBMRU1FTlRTe30gY2xhdXNlIG9mIGEgY2xhc3MgJEMkIHNwZWNpZmllcyAgYSBtYWxmb3JtZWQgdHlwZSBvciBkZWZlcnJlZCB0eXBlIChccmVme3N0YXRpY1R5cGVzfSkgYXMgYSBzdXBlcmludGVyZmFjZSAgSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgdGhlIFxJTVBMRU1FTlRTe30gY2xhdXNlIG9mIGEgY2xhc3MgJEMkIHNwZWNpZmllcyB0eXBlIFxEWU5BTUlDe30gYXMgYSBzdXBlcmludGVyZmFjZS4gSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgIHRoZSAgXElNUExFTUVOVFN7fSBjbGF1c2Ugb2YgYSBjbGFzcyAkQyQgc3BlY2lmaWVzICBhIHR5cGUgJFQkIGFzIGEgc3VwZXJpbnRlcmZhY2UgbW9yZSB0aGFuIG9uY2UuCkl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIHRoZSBzdXBlcmNsYXNzIG9mIGEgY2xhc3MgJEMkIGlzIHNwZWNpZmllZCBhcyBhIHN1cGVyaW50ZXJmYWNlIG9mICRDJC4KClxyYXRpb25hbGV7Ck9uZSBtaWdodCBhcmd1ZSB0aGF0IGl0IGlzIGhhcm1sZXNzIHRvIHJlcGVhdCBhIHR5cGUgaW4gdGhlIHN1cGVyaW50ZXJmYWNlIGxpc3QsIHNvIHdoeSBtYWtlIGl0IGFuIGVycm9yPyBUaGUgaXNzdWUgaXMgbm90IHNvIG11Y2ggdGhhdCB0aGUgc2l0dWF0aW9uIGRlc2NyaWJlZCBpbiBwcm9ncmFtIHNvdXJjZSBpcyBlcnJvbmVvdXMsIGJ1dCB0aGF0IGl0IGlzIHBvaW50bGVzcy4gQXMgc3VjaCwgaXQgaXMgYW4gaW5kaWNhdGlvbiB0aGF0IHRoZSBwcm9ncmFtbWVyIG1heSB2ZXJ5IHdlbGwgaGF2ZSBtZWFudCB0byBzYXkgc29tZXRoaW5nIGVsc2UgLSBhbmQgdGhhdCBpcyBhIG1pc3Rha2UgdGhhdCBzaG91bGQgYmUgY2FsbGVkIHRvIGhlciBvciBoaXMgYXR0ZW50aW9uLiAgTmV2ZXJ0aGVsZXNzLCB3ZSBjb3VsZCBzaW1wbHkgaXNzdWUgYSB3YXJuaW5nOyBhbmQgcGVyaGFwcyB3ZSBzaG91bGQgYW5kIHdpbGwuIFRoYXQgc2FpZCwgcHJvYmxlbXMgbGlrZSB0aGVzZSBhcmUgbG9jYWwgYW5kIGVhc2lseSBjb3JyZWN0ZWQgb24gdGhlIHNwb3QsIHNvIHdlIGZlZWwganVzdGlmaWVkIGluIHRha2luZyBhIGhhcmRlciBsaW5lLiAKfQoKSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgdGhlIGludGVyZmFjZSBvZiBhIGNsYXNzICRDJCBpcyBhIHN1cGVyaW50ZXJmYWNlIG9mIGl0c2VsZi4KCkxldCAkQyQgYmUgYSBjb25jcmV0ZSBjbGFzcyB0aGF0IGRvZXMgbm90IGRlY2xhcmUgaXRzIG93biBcY29kZXtub1N1Y2hNZXRob2QoKX0gbWV0aG9kLgpJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmIHRoZSBpbXBsaWNpdCBpbnRlcmZhY2Ugb2YgICRDJCBpbmNsdWRlcyBhbiBpbnN0YW5jZSBtZW1iZXIgJG0kIG9mIHR5cGUgJEYkIGFuZCAkQyQgZG9lcyBub3QgZGVjbGFyZSBvciBpbmhlcml0IGEgY29ycmVzcG9uZGluZyBub24tYWJzdHJhY3QgaW5zdGFuY2UgbWVtYmVyICRtJCBvZiB0eXBlICRGJyQgc3VjaCB0aGF0ICRGJyA8OiBGJC4gCgpcY29tbWVudGFyeXtBIGNsYXNzIGRvZXMgbm90IGluaGVyaXQgbWVtYmVycyBmcm9tIGl0cyBzdXBlcmludGVyZmFjZXMuIEhvd2V2ZXIsIGl0cyBpbXBsaWNpdCBpbnRlcmZhY2UgZG9lcy4KfQoKClxyYXRpb25hbGUgewpXZSBjaG9vc2UgdG8gaXNzdWUgdGhlc2Ugd2FybmluZ3Mgb25seSBmb3IgY29uY3JldGUgY2xhc3NlczsgYW4gYWJzdHJhY3QgY2xhc3MgbWlnaHQgbGVnaXRpbWF0ZWx5IGJlIGRlc2lnbmVkIHdpdGggdGhlIGV4cGVjdGF0aW9uIHRoYXQgY29uY3JldGUgc3ViY2xhc3NlcyB3aWxsIGltcGxlbWVudCBwYXJ0IG9mICB0aGUgaW50ZXJmYWNlLgpXZSBhbHNvIGRpc2FibGUgdGhlc2Ugd2FybmluZ3MgaWYgYSBcY29kZXtub1N1Y2hNZXRob2QoKX0gZGVjbGFyYXRpb24gaXMgcHJlc2VudC4gSW4gc3VjaCBjYXNlcywgdGhlIHN1cHBvcnRlZCBpbnRlcmZhY2UgaXMgZ29pbmcgdG8gYmUgaW1wbGVtZW50ZWQgdmlhIFxjb2Rle25vU3VjaE1ldGhvZCgpfSBhbmQgbm8gYWN0dWFsIGRlY2xhcmF0aW9ucyBvZiB0aGUgaW1wbGVtZW50ZWQgaW50ZXJmYWNlJ3MgbWVtYmVycyBhcmUgbmVlZGVkLiBUaGlzIGFsbG93cyBwcm94eSBjbGFzc2VzIGZvciBzcGVjaWZpYyB0eXBlcyB0byBiZSBpbXBsZW1lbnRlZCB3aXRob3V0IHByb3Zva2luZyB0eXBlIHdhcm5pbmdzLgoKSW4gYWRkaXRpb24sIGl0IG1heSBiZSB1c2VmdWwgdG8gc3VwcHJlc3MgdGhlc2Ugd2FybmluZ3MgaWYgXGNvZGV7bm9TdWNoTWV0aG9kfSBpcyBpbmhlcml0ZWQsIEhvd2V2ZXIsIHRoaXMgbWF5IHN1cHByZXNzIG1lYW5pbmdmdWwgd2FybmluZ3MgYW5kIHNvIHdlIGNob29zZSBub3QgdG8gZG8gc28uIElmIG9uZSBkb2VzIHdhbnQgdG8gc3VwcHJlc3MgdGhlIHdhcm5pbmdzIGluIGEgc3ViY2xhc3MsIG9uZSBjYW4gZGVmaW5lIGEgc2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIFxjb2Rle25vU3VjaE1ldGhvZH0gaW4gdGhlIHN1YmNsYXNzOgp9CgpcYmVnaW57ZGFydENvZGV9Cm5vU3VjaE1ldGhvZChpbnYpID0kPiQgXFNVUEVSLm5vU3VjaE1ldGhvZChpbnYpOwpcZW5ke2RhcnRDb2RlfQoKSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiB0aGUgaW1wbGljaXQgaW50ZXJmYWNlIG9mICBhIGNsYXNzICRDJCBpbmNsdWRlcyBhbiBpbnN0YW5jZSBtZW1iZXIgJG0kIG9mIHR5cGUgJEYkIGFuZCAkQyQgZGVjbGFyZXMgb3IgaW5oZXJpdHMgYSBjb3JyZXNwb25kaW5nIGluc3RhbmNlIG1lbWJlciAkbSQgb2YgdHlwZSAkRickIGlmICAkRickIGlzIG5vdCBhIHN1YnR5cGUgb2YgJEYkLiAKClxyYXRpb25hbGV7Ckhvd2V2ZXIsIGlmIGEgY2xhc3MgZG9lcyBleHBsaWNpdGx5IGRlY2xhcmUgYSBtZW1iZXIgdGhhdCBjb25mbGljdHMgd2l0aCBpdHMgc3VwZXJpbnRlcmZhY2UsIHRoaXMgYWx3YXlzIHlpZWxkcyBhIHN0YXRpYyB3YXJuaW5nLgoKfQolSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiBhbiBpbXBvcnRlZCBzdXBlcmludGVyZmFjZSBvZiBhIGNsYXNzICRDJCBkZWNsYXJlcyBwcml2YXRlIG1lbWJlcnMuCgolIFNob3VsZCB3ZSBpZ25vcmUgdW5pbXBsZW1lbnRlZCBwcml2YXRlIG1lbWJlcnM/IAoKJVxyYXRpb25hbGV7VGhpcyBsYXN0IHJ1bGUgaXMgcHJvYmxlbWF0aWMuIEFzIGNvZGUgZXZvbHZlcyBpbiBvbmUgbGlicmFyeSAoJExfMSQpIGl0IG1heSBhZGQgcHJpdmF0ZSBtZW1iZXJzIHRvIGEgY2xhc3MgJElfMSQgaW1wbGVtZW50ZWQgb3IgaW5oZXJpdGVkIGluIGFub3RoZXIgIGxpYnJhcnkgJExfMiQgYnJlYWtpbmcgJExfMSQuICBUaGlzIGlzIGEgZGlyZWN0IHJlc3VsdCBvZiBjb3VwbGluZyBhbiBpbnRlcmZhY2UgYmFzZWQgdHlwZSBzeXN0ZW0gd2l0aCBsaWJyYXJ5IGJhc2VkIHByaXZhY3kuICBXZSBhcmUgY29uc2lkZXJpbmcgYWx0ZXJuYXRpdmUgc2VtYW50aWNzIHRoYXQgbWlnaHQgaGVscCByZXNvbHZlIHRoaXMgaXNzdWUuCiV9CgolXGNvbW1lbnRhcnl7SG93ZXZlciwgaXQgaXMgcGVyZmVjdGx5IGFjY2VwdGFibGUgaWYgYSB0eXBlIG1lbnRpb25lZCBpbiB0aGUgaW1wbGVtZW50cyBjbGF1c2UgaXMgbWVudGlvbmVkIGFzIGEgc3VwZXJpbnRlcmZhY2UgaW4gYW4gaW50ZXJmYWNlIGluamVjdGlvbiBjbGF1c2UuIAolfQoKJVxyYXRpb25hbGV7V2UgZGlzYWxsb3cgcmVwZXRpdGlvbiBvZiBhIHR5cGUgaW4gYSBnaXZlbiBpbXBsZW1lbnRzIGNsYXVzZSwgYXMgdGhhdCBpcyBhIGxvY2FsaXplZCBtaXN0YWtlLiBIb3dldmVyLCBzZXBhcmF0ZSBjbGF1c2VzICh0aGF0IGlzIHRoZSBvcmlnaW5hbCBjbGFzcyBhbmQgdmFyaW91cyBpbmplY3Rpb25zKSBtYXkgZXZvbHZlIHNlcGFyYXRlbHkgb3ZlciB0aW1lLCBhbmQgd2UgZG9uJ3Qgd2FudCB0byBjYXVzZSBicmVha2FnZS4gRm9yIGV4YW1wbGUKCiVjbGFzcyBDIGltcGxlbWVudHMgSTEgey4uLn07IC8vIGNsYXNzIGRlY2xhcmF0aW9uCgoKJXNvbWV3aGVyZSBzb21lb25lIHJlYWxpemVzIHRoYXQgQyBjb3VsZCBpbXBsZW1lbnQgSTIgY2xhc3MgQyBpbXBsZW1lbnRzIEkyOyAvLyBpbmplY3Rpb24KCiVsYXRlciwgdGhlIGF1dGhvciBvZiBDIGRlY2lkZXMgdG8gc3VwcG9ydCBJMgoKJWNsYXNzIEMgaW1wbGVtZW50cyBJMSwgSTIgey4uLn07IC8vIGNsYXNzIGRlY2xhcmF0aW9uCgoldGhpcyBzaG91bGQgbm90IGNhdXNlIGJyZWFrYWdlLgolfQoKJSBccmF0aW9uYWxle1RoaXMgYXZvaWRzIHRoZSBpc3N1ZXMgd2l0aCBzby1jYWxsZWQgbWlyYW5kYSBtZXRob2RzIGV0Yy4gfQoKClxzZWN0aW9ue0ludGVyZmFjZXN9ClxsYWJlbHtpbnRlcmZhY2VzfQoKQW4ge1xlbSBpbnRlcmZhY2V9IGRlZmluZXMgaG93IG9uZSBtYXkgaW50ZXJhY3Qgd2l0aCBhbiBvYmplY3QuIEFuIGludGVyZmFjZSBoYXMgbWV0aG9kcywgZ2V0dGVycyBhbmQgc2V0dGVycyBhbmQgYSBzZXQgb2Ygc3VwZXJpbnRlcmZhY2VzLgoKXHN1YnNlY3Rpb257U3VwZXJpbnRlcmZhY2VzfQpcbGFiZWx7aW50ZXJmYWNlU3VwZXJpbnRlcmZhY2VzfQoKQW4gaW50ZXJmYWNlIGhhcyBhIHNldCBvZiBkaXJlY3Qgc3VwZXJpbnRlcmZhY2VzLiAKCkFuIGludGVyZmFjZSAkSiQgaXMgYSBzdXBlcmludGVyZmFjZSBvZiBhbiBpbnRlcmZhY2UgJEkkIGlmZiBlaXRoZXIgJEokIGlzIGEgZGlyZWN0IHN1cGVyaW50ZXJmYWNlIG9mICRJJCBvciAkSiQgaXMgYSBzdXBlcmludGVyZmFjZSBvZiBhIGRpcmVjdCBzdXBlcmludGVyZmFjZSBvZiAkSSQuCgoKCgpcc3Vic3Vic2VjdGlvbntJbmhlcml0YW5jZSBhbmQgT3ZlcnJpZGluZ30KXGxhYmVse2ludGVyZmFjZUluaGVyaXRhbmNlQW5kT3ZlcnJpZGluZ30KCkxldCAkSiQgYmUgYW4gaW50ZXJmYWNlIGFuZCAkSyQgYmUgYSBsaWJyYXJ5LiBXZSBkZWZpbmUgJGluaGVyaXRlZChKLCBLKSQgIHRvIGJlIHRoZSBzZXQgb2YgbWVtYmVycyAkbSQgc3VjaCB0aGF0ICAgYWxsIG9mIHRoZSBmb2xsb3dpbmcgaG9sZDoKXGJlZ2lue2l0ZW1pemV9ClxpdGVtICRtJCBpcyBhY2Nlc3NpYmxlIHRvICRLJCBhbmQgClxpdGVtICRBJCBpcyBhIGRpcmVjdCBzdXBlcmludGVyZmFjZSBvZiAkSiQgYW5kIGVpdGhlciAKICBcYmVnaW57aXRlbWl6ZX0KICBcaXRlbSAkQSQgZGVjbGFyZXMgYSBtZW1iZXIgJG0kICBvcgogIFxpdGVtICRtJCBpcyBhIG1lbWJlciBvZiAkaW5oZXJpdGVkKEEsIEspJC4KICBcZW5ke2l0ZW1pemV9ClxpdGVtICRtJCBpcyBub3Qgb3ZlcnJpZGRlbiBieSAkSiQuClxlbmR7aXRlbWl6ZX0KCkZ1cnRoZXJtb3JlLCB3ZSBkZWZpbmUgJG92ZXJyaWRlcyhKLCBLKSQgIHRvIGJlIHRoZSBzZXQgb2YgbWVtYmVycyAkbV5ccHJpbWUkIHN1Y2ggdGhhdCAgYWxsIG9mIHRoZSBmb2xsb3dpbmcgaG9sZDoKXGJlZ2lue2l0ZW1pemV9ClxpdGVtICRKJCBpcyB0aGUgaW1wbGljaXQgaW50ZXJmYWNlIG9mIGEgY2xhc3MgJEMkLgpcaXRlbSAgJEMkIGRlY2xhcmVzIGEgbWVtYmVyICRtJC4KXGl0ZW0gJG1eXHByaW1lJCBoYXMgdGhlIHNhbWUgbmFtZSBhcyAkbSQuClxpdGVtICRtXlxwcmltZSQgaXMgYWNjZXNzaWJsZSB0byAkSyQuICAKXGl0ZW0gJEEkIGlzIGEgZGlyZWN0IHN1cGVyaW50ZXJmYWNlIG9mICRKJCBhbmQgZWl0aGVyCiAgXGJlZ2lue2l0ZW1pemV9CiAgXGl0ZW0gJEEkIGRlY2xhcmVzIGEgbWVtYmVyICRtXlxwcmltZSQgb3IgCiAgXGl0ZW0gJG1eXHByaW1lJCBpcyBhIG1lbWJlciBvZiAkaW5oZXJpdGVkKEEsIEspJC4KICBcZW5ke2l0ZW1pemV9ClxlbmR7aXRlbWl6ZX0KCgpMZXQgJEkkIGJlIHRoZSBpbXBsaWNpdCBpbnRlcmZhY2Ugb2YgYSBjbGFzcyAkQyQgZGVjbGFyZWQgaW4gbGlicmFyeSAkTCQuICAkSSQge1xlbSBpbmhlcml0c30gYWxsIG1lbWJlcnMgb2YgJGluaGVyaXRlZChJLCBMKSQgYW5kICRJJCB7XGVtIG92ZXJyaWRlc30gJG1eXHByaW1lJCBpZiAgJG1eXHByaW1lIFxpbiBvdmVycmlkZXMoSSwgTCkkLiAKCkFsbCB0aGUgc3RhdGljIHdhcm5pbmdzIHBlcnRhaW5pbmcgdG8gdGhlIG92ZXJyaWRpbmcgb2YgaW5zdGFuY2UgbWVtYmVycyBnaXZlbiBpbiBzZWN0aW9uIFxyZWZ7Y2xhc3Nlc30gYWJvdmUgaG9sZCBmb3Igb3ZlcnJpZGluZyBiZXR3ZWVuIGludGVyZmFjZXMgYXMgd2VsbC4KCkl0IGlzIGEgc3RhdGljIHdhcm5pbmcgaWYgJG0kIGlzIGEgbWV0aG9kIGFuZCAkbV5ccHJpbWUkIGlzIGEgZ2V0dGVyLCBvciBpZiAkbSQgaXMgYSBnZXR0ZXIgYW5kICRtXlxwcmltZSQgaXMgYSBtZXRob2QuCgoKCiVMZXQgJEkgPSBTXzAkIGJlIHRoZSBpbXBsaWNpdCBpbnRlcmZhY2Ugb2YgYSBjbGFzcyAkQyQgZGVjbGFyZWQgaW4gbGlicmFyeSAkTCQsIGFuZCBsZXQgJFx7U18xIFxsZG90cyBTX2tcfSQgYmUgdGhlIHNldCBvZiBhbGwgc3VwZXJpbnRlcmZhY2VzIG9mICRJJC4gCgolTGV0ICRJJCBiZSB0aGUgaW1wbGljaXQgaW50ZXJmYWNlIG9mIGEgY2xhc3MgJEMkLiAgJEkkIGluaGVyaXRzIGFueSBpbnN0YW5jZSBtZW1iZXJzIG9mIGl0cyBzdXBlcmludGVyZmFjZXMgdGhhdCBhcmUgbm90IG92ZXJyaWRkZW4gYnkgbWVtYmVycyBkZWNsYXJlZCBpbiAkQyQuIAoKJSB0aWdodGVuIGRlZmluaXRpb24/IGRvIHdlIG5lZWQgY2hhaW4gYXMgZm9yIGNsYXNzZXM/ICBEZWZpbml0aW9uIGZvciBpbnRlcmZhY2Ugb3ZlcnJpZGU/CgpIb3dldmVyLCBpZiB0aGUgYWJvdmUgcnVsZXMgd291bGQgY2F1c2UgbXVsdGlwbGUgbWVtYmVycyAkbV8xLCBcbGRvdHMsICBtX2skIHdpdGggdGhlIHNhbWUgbmFtZSAkbiQgdG8gYmUgaW5oZXJpdGVkIChiZWNhdXNlIGlkZW50aWNhbGx5IG5hbWVkIG1lbWJlcnMgZXhpc3RlZCBpbiBzZXZlcmFsIHN1cGVyaW50ZXJmYWNlcykgdGhlbiBhdCBtb3N0IG9uZSBtZW1iZXIgaXMgaW5oZXJpdGVkLiAKCklmIHNvbWUgYnV0IG5vdCBhbGwgb2YgdGhlICRtX2ksIDEgXGxlIGkgXGxlIGskIGFyZSBnZXR0ZXJzIG5vbmUgb2YgdGhlICRtX2kkIGFyZSBpbmhlcml0ZWQsIGFuZCBhIHN0YXRpYyB3YXJuaW5nIGlzIGlzc3VlZC4KCk90aGVyd2lzZSwgaWYgdGhlIHN0YXRpYyB0eXBlcyAkVF8xLCBcbGRvdHMsICBUX2skIG9mIHRoZSBtZW1iZXJzICRtXzEsIFxsZG90cywgIG1fayQgIGFyZSBub3QgaWRlbnRpY2FsLCB0aGVuIHRoZXJlIG11c3QgYmUgYSBtZW1iZXIgJG1feCQgc3VjaCB0aGF0ICRUX3ggPDogVF9pLCAxIFxsZSB4IFxsZSBrJCBmb3IgYWxsICAkaSAgXGluIDEuLmskLCBvciBhIHN0YXRpYyB0eXBlIHdhcm5pbmcgb2NjdXJzLiBUaGUgbWVtYmVyIHRoYXQgaXMgaW5oZXJpdGVkICBpcyAkbV94JCwgaWYgaXQgZXhpc3RzOyBvdGhlcndpc2U6CiBsZXQgJG51bWJlck9mUG9zaXRpb25hbHMoZikkIGRlbm90ZSB0aGUgbnVtYmVyIG9mIHBvc2l0aW9uYWwgcGFyYW1ldGVycyBvZiBhIGZ1bmN0aW9uICRmJCwgYW5kIGxldCAkbnVtYmVyT2ZSZXF1aXJlZFBhcmFtcyhmKSQgZGVub3RlIHRoZSBudW1iZXIgb2YgcmVxdWlyZWQgcGFyYW1ldGVycyBvZiBhIGZ1bmN0aW9uICRmJC4gRnVydGhlcm1vcmUsIGxldCAkcyQgZGVub3RlIHRoZSBzZXQgb2YgYWxsIG5hbWVkIHBhcmFtZXRlcnMgb2YgdGhlICRtXzEsIFxsZG90cywgIG1fayQuICBUaGVuIGxldCAKCiRoID0gbWF4KG51bWJlck9mUG9zaXRpb25hbHMobV9pKSksICQKCiRyID0gbWluKG51bWJlck9mUmVxdWlyZWRQYXJhbXMobV9pKSksIGkgXGluIDEuLmskLiAKClRoZW4gJEkkIGhhcyBhIG1ldGhvZCBuYW1lZCAkbiQsIHdpdGggJHIkIHJlcXVpcmVkIHBhcmFtZXRlcnMgb2YgdHlwZSBcRFlOQU1JQ3t9LCAkaCQgIHBvc2l0aW9uYWwgcGFyYW1ldGVycyBvZiB0eXBlIFxEWU5BTUlDe30sIG5hbWVkIHBhcmFtZXRlcnMgJHMkIG9mIHR5cGUgIFxEWU5BTUlDe30gYW5kICByZXR1cm4gdHlwZSAgXERZTkFNSUN7fS4gIAoKCgpcY29tbWVudGFyeXtUaGUgb25seSBzaXR1YXRpb24gd2hlcmUgdGhlIHJ1bnRpbWUgd291bGQgYmUgY29uY2VybmVkIHdpdGggdGhpcyB3b3VsZCBiZSBkdXJpbmcgcmVmbGVjdGlvbiwgaWYgYSBtaXJyb3IgYXR0ZW1wdGVkIHRvIG9idGFpbiB0aGUgc2lnbmF0dXJlIG9mIGFuIGludGVyZmFjZSBtZW1iZXIuIAp9CgpccmF0aW9uYWxlewpUaGUgY3VycmVudCBzb2x1dGlvbiBpcyBhIHRhZCBjb21wbGV4LCBidXQgaXMgcm9idXN0IGluIHRoZSBmYWNlIG9mIHR5cGUgYW5ub3RhdGlvbiBjaGFuZ2VzLiAgQWx0ZXJuYXRpdmVzOiAoYSkgTm8gbWVtYmVyIGlzIGluaGVyaXRlZCBpbiBjYXNlIG9mIGNvbmZsaWN0LiAoYikgVGhlIGZpcnN0IG0gaXMgc2VsZWN0ZWQgKGJhc2VkIG9uIG9yZGVyIG9mIHN1cGVyaW50ZXJmYWNlIGxpc3QpIChjKSBJbmhlcml0ZWQgbWVtYmVyIGNob3NlbiBhdCByYW5kb20uIAoKKGEpIG1lYW5zIHRoYXQgdGhlIHByZXNlbmNlIG9mIGFuIGluaGVyaXRlZCBtZW1iZXIgb2YgYW4gaW50ZXJmYWNlIHZhcmllcyBkZXBlbmRpbmcgb24gdHlwZSBzaWduYXR1cmVzLiAgKGIpIGlzIHNlbnNpdGl2ZSB0byBpcnJlbGV2YW50IGRldGFpbHMgb2YgdGhlIGRlY2xhcmF0aW9uIGFuZCAoYykgaXMgbGlhYmxlIHRvIGdpdmUgdW5wcmVkaWN0YWJsZSByZXN1bHRzIGJldHdlZW4gaW1wbGVtZW50YXRpb25zIG9yIGV2ZW4gYmV0d2VlbiBkaWZmZXJlbnQgY29tcGlsYXRpb24gc2Vzc2lvbnMuCn0KCiUgTmVlZCB3YXJuaW5ncyBpZiBvdmVycmlkZXIgY29uZmxpY3RzIHdpdGggb3ZlcnJpZGRlZSBlaXRoZXIgYmVjYXVzZSBzaWduYXR1cmVzIGFyZSBpbmNvbXBhdGlibGUgb3IgYmVjYXVzZSBkb25lIGlzIGEgbWV0aG9kIGFuZCBvbmUgaXMgYSBnZXR0ZXIgb3Igc2V0dGVyLgoKXHNlY3Rpb257TWl4aW5zfQpcbGFiZWx7bWl4aW5zfSAKCgpBIG1peGluIGRlc2NyaWJlcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgY2xhc3MgYW5kIGl0cyBzdXBlcmNsYXNzLiBBIG1peGluIGlzIGFsd2F5cyBkZXJpdmVkIGZyb20gYW4gZXhpc3RpbmcgY2xhc3MgZGVjbGFyYXRpb24uIAoKSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgYSBkZWNsYXJlZCBvciBkZXJpdmVkIG1peGluIHJlZmVycyB0byBcU1VQRVJ7fS4gSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgYSBkZWNsYXJlZCBvciBkZXJpdmVkIG1peGluIGV4cGxpY2l0bHkgZGVjbGFyZXMgYSBjb25zdHJ1Y3Rvci4gSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgYSBtaXhpbiBpcyBkZXJpdmVkIGZyb20gYSBjbGFzcyB3aG9zZSBzdXBlcmNsYXNzIGlzIG5vdCBcY29kZXtPYmplY3R9LgoKXHJhdGlvbmFsZXsKVGhlc2UgcmVzdHJpY3Rpb25zIGFyZSB0ZW1wb3JhcnkuICBXZSBleHBlY3QgdG8gcmVtb3ZlIHRoZW0gaW4gbGF0ZXIgdmVyc2lvbnMgb2YgRGFydC4KClRoZSByZXN0cmljdGlvbiBvbiB0aGUgdXNlIG9mIFxTVVBFUnt9IGF2b2lkcyB0aGUgcHJvYmxlbSBvZiByZWJpbmRpbmcgXFNVUEVSe30gd2hlbiB0aGUgbWl4aW4gaXMgYm91bmQgdG8gZGlmZmVyZW5jZSBzdXBlcmNsYXNzZXMuCgpUaGUgcmVzdHJpY3Rpb24gb24gY29uc3RydWN0b3JzIHNpbXBsaWZpZXMgdGhlIGNvbnN0cnVjdGlvbiBvZiBtaXhpbiBhcHBsaWNhdGlvbnMgYmVjYXVzZSB0aGUgcHJvY2VzcyBvZiBjcmVhdGluZyBpbnN0YW5jZXMgaXMgc2ltcGxlci4KClRoZSByZXN0cmljdGlvbiBvbiB0aGUgc3VwZXJjbGFzcyBtZWFucyB0aGF0IHRoZSB0eXBlIG9mIGEgY2xhc3MgIGZyb20gd2hpY2ggYSBtaXhpbiBpcyBkZXJpdmVkIGlzIGFsd2F5cyBpbXBsZW1lbnRlZCBieSBhbnkgY2xhc3MgdGhhdCBtaXhlcyBpdCBpbi4gVGhpcyBhbGxvd3MgdXMgdG8gZGVmZXIgdGhlIHF1ZXN0aW9uIG9mIHdoZXRoZXIgYW5kIGhvdyB0byBleHByZXNzIHRoZSB0eXBlIG9mIHRoZSBtaXhpbiBpbmRlcGVuZGVudGx5IG9mIGl0cyBzdXBlcmNsYXNzIGFuZCBzdXBlciBpbnRlcmZhY2UgdHlwZXMuCgpSZWFzb25hYmxlIGFuc3dlcnMgZXhpc3QgZm9yIGFsbCB0aGVzZSBpc3N1ZXMsIGJ1dCB0aGVpciBpbXBsZW1lbnRhdGlvbiBpcyBub24tdHJpdmlhbC4KfQoKXHN1YnNlY3Rpb257TWl4aW4gQXBwbGljYXRpb259ClxsYWJlbHttaXhpbkFwcGxpY2F0aW9ufQoKQSBtaXhpbiBtYXkgYmUgYXBwbGllZCB0byBhIHN1cGVyY2xhc3MsIHlpZWxkaW5nIGEgbmV3IGNsYXNzLiBNaXhpbiBhcHBsaWNhdGlvbiBvY2N1cnMgd2hlbiBhIG1peGluIGlzIG1peGVkIGludG8gYSBjbGFzcyBkZWNsYXJhdGlvbiB2aWEgaXRzIFxXSVRIe30gY2xhdXNlLiAgVGhlIG1peGluIGFwcGxpY2F0aW9uIG1heSBiZSB1c2VkIHRvIGV4dGVuZCBhIGNsYXNzIHBlciBzZWN0aW9uIChccmVme2NsYXNzZXN9KTsgYWx0ZXJuYXRlbHksIGEgY2xhc3MgbWF5IGJlIGRlZmluZWQgYXMgYSBtaXhpbiBhcHBsaWNhdGlvbiBhcyBkZXNjcmliZWQgaW4gdGhpcyBzZWN0aW9uLiAgIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIHRoZSBcV0lUSHt9IGNsYXVzZSBvZiBhIG1peGluIGFwcGxpY2F0aW9uICRDJCBpbmNsdWRlcyBhIGRlZmVycmVkIHR5cGUgZXhwcmVzc2lvbi4KCgpcYmVnaW57Z3JhbW1hcn0Ke1xiZiAgbWl4aW5BcHBsaWNhdGlvbkNsYXNzOn0KCWlkZW50aWZpZXIgdHlwZVBhcmFtZXRlcnM/IGA9JyAgbWl4aW5BcHBsaWNhdGlvbiBge1xlc2NhcGVncmFtbWFyIDt9JyAuCgkKe1xiZiBtaXhpbkFwcGxpY2F0aW9uOn0KICAgICB0eXBlIG1peGlucyBpbnRlcmZhY2VzPyAKICAgIC4KXGVuZHtncmFtbWFyfQoKQSAgbWl4aW4gYXBwbGljYXRpb24gb2YgdGhlIGZvcm0gIFxjb2RleyRTJCBcV0lUSHt9ICRNJDt9IGRlZmluZXMgYSBjbGFzcyAgJEMkIHdpdGggc3VwZXJjbGFzcyAgJFMkLiAKCkEgIG1peGluIGFwcGxpY2F0aW9uIG9mIHRoZSBmb3JtICBcY29kZXskUyQgXFdJVEh7fSAkTV8xLCBcbGRvdHMsIE1fayQ7fSBkZWZpbmVzIGEgY2xhc3MgICRDJCB3aG9zZSBzdXBlcmNsYXNzIGlzIHRoZSBhcHBsaWNhdGlvbiBvZiB0aGUgbWl4aW4gY29tcG9zaXRpb24gKFxyZWZ7bWl4aW5Db21wb3NpdGlvbn0pICRNX3trLTF9ICogXGxkb3RzICogTV8xJCB0byAkUyQuIAoKSW4gYm90aCBjYXNlcyBhYm92ZSwgJEMkIGRlY2xhcmVzIHRoZSBzYW1lIGluc3RhbmNlIG1lbWJlcnMgYXMgJE0kIChyZXNwZWN0aXZlbHksICRNX2skKS4gSWYgYW55IG9mIHRoZSBpbnN0YW5jZSBmaWVsZHMgb2YgJE0kIChyZXNwZWN0aXZlbHksICRNX2skKSBoYXZlIGluaXRpYWxpemVycywgdGhleSBhcmUgZXhlY3V0ZWQgaW4gdGhlIHNjb3BlIG9mICRNJCAocmVzcGVjdGl2ZWx5LCAkTV9rJCkgdG8gaW5pdGlhbGl6ZSB0aGUgY29ycmVzcG9uZGluZyBmaWVsZHMgb2YgJEMkLiAKCkZvciBlYWNoIGdlbmVyYXRpdmUgY29uc3RydWN0b3IgbmFtZWQgJHFfaShUX3tpMX0kICQgYV97aTF9LCBcbGRvdHMgLCBUX3tpa19pfSQgJCBhX3tpa19pfSksIGkgXGluIDEuLm4kIG9mICRTJCwgJEMkIGhhcyBhbiBpbXBsaWNpdGx5IGRlY2xhcmVkIGNvbnN0cnVjdG9yIG5hbWVkCiRxJ19pID0gW0MvU11xX2kkIG9mIHRoZSBmb3JtIAoKJHEnX2koYV97aTF9LCBcbGRvdHMgLCBhX3tpa19pfSk6XFNVUEVSKGFfe2kxfSwgXGxkb3RzICwgYV97aWtfaX0pOyQuCgpJZiB0aGUgbWl4aW4gYXBwbGljYXRpb24gZGVjbGFyZXMgc3VwcG9ydCBmb3IgaW50ZXJmYWNlcywgdGhlIHJlc3VsdGluZyBjbGFzcyBpbXBsZW1lbnRzIHRob3NlIGludGVyZmFjZXMuCgpJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiAkUyQgaXMgYSBtYWxmb3JtZWQgdHlwZS4gSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgJE0kIChyZXNwZWN0aXZlbHksIGFueSBvZiAkTV8xLCBcbGRvdHMsIE1fayQpIGlzIGEgbWFsZm9ybWVkIHR5cGUuIEl0IGlzIGEgY29tcGlsZSB0aW1lIGVycm9yIGlmIGEgd2VsbCBmb3JtZWQgbWl4aW4gY2Fubm90IGJlIGRlcml2ZWQgZnJvbSAkTSQgKHJlc3BlY3RpdmVseSwgZnJvbSBlYWNoIG9mICRNXzEsIFxsZG90cywgTV9rJCkuIAoKTGV0ICRLJCBiZSBhIGNsYXNzIGRlY2xhcmF0aW9uICB3aXRoIHRoZSBzYW1lIGNvbnN0cnVjdG9ycywgc3VwZXJjbGFzcyBhbmQgaW50ZXJmYWNlcyBhcyAkQyQsICBhbmQgdGhlIGluc3RhbmNlIG1lbWJlcnMgZGVjbGFyZWQgYnkgJE0kIChyZXNwZWN0aXZlbHkgJE1fMSwgXGxkb3RzLCBNX2skKS4gSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiB0aGUgZGVjbGFyYXRpb24gb2YgJEskIHdvdWxkIGNhdXNlIGEgc3RhdGljIHdhcm5pbmcuICBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiB0aGUgZGVjbGFyYXRpb24gb2YgJEskIHdvdWxkIGNhdXNlIGEgY29tcGlsZS10aW1lIGVycm9yLgoKXGNvbW1lbnRhcnl7CklmLCBmb3IgZXhhbXBsZSwgJE0kIGRlY2xhcmVzIGFuIGluc3RhbmNlIG1lbWJlciAkaW0kIHdob3NlIHR5cGUgaXMgYXQgb2RkcyB3aXRoIHRoZSB0eXBlIG9mIGEgbWVtYmVyIG9mIHRoZSBzYW1lIG5hbWUgaW4gJFMkLCB0aGlzIHdpbGwgcmVzdWx0IGluIGEgc3RhdGljIHdhcm5pbmcganVzdCBhcyBpZiB3ZSBoYWQgZGVmaW5lZCAkSyQgYnkgbWVhbnMgb2YgYW4gb3JkaW5hcnkgY2xhc3MgZGVjbGFyYXRpb24gZXh0ZW5kaW5nICRTJCwgd2l0aCBhIGJvZHkgdGhhdCBpbmNsdWRlZCAkaW0kLgoKfQoKVGhlIGVmZmVjdCBvZiBhIGNsYXNzIGRlZmluaXRpb24gb2YgdGhlIGZvcm0gXGNvZGV7XENMQVNTe30gJEMkID0gJE0kOyB9IG9yIHRoZSBmb3JtIAogXGNvZGV7XENMQVNTe30gJEM8VF8xLCBcbGRvdHMsIFRfbj4kID0gJE0kOyB9IGluIGxpYnJhcnkgJEwkICBpcyB0byBpbnRyb2R1Y2UgdGhlIG5hbWUgJEMkIGludG8gdGhlIHNjb3BlIG9mICRMJCwgYm91bmQgdG8gdGhlIGNsYXNzIChccmVme2NsYXNzZXN9KSBkZWZpbmVkIGJ5IHRoZSBtaXhpbiBhcHBsaWNhdGlvbiAkTSQuIFRoZSBuYW1lIG9mIHRoZSBjbGFzcyBpcyBhbHNvIHNldCB0byAkQyQuIElmZiB0aGUgIGNsYXNzIGlzIHByZWZpeGVkIGJ5IHRoZSBidWlsdC1pbiBpZGVudGlmaWVyIFxBQlNUUkFDVHt9LCB0aGUgY2xhc3MgYmVpbmcgZGVmaW5lZCBpcyBhbiBhYnN0cmFjdCBjbGFzcy4KIAoKXHN1YnNlY3Rpb257TWl4aW4gQ29tcG9zaXRpb259ClxsYWJlbHttaXhpbkNvbXBvc2l0aW9ufQoKXHJhdGlvbmFsZXsKRGFydCBkb2VzIG5vdCBkaXJlY3RseSBzdXBwb3J0IG1peGluIGNvbXBvc2l0aW9uLCBidXQgdGhlIGNvbmNlcHQgaXMgdXNlZnVsIHdoZW4gZGVmaW5pbmcgaG93IHRoZSBzdXBlcmNsYXNzIG9mIGEgY2xhc3Mgd2l0aCBhIG1peGluIGNsYXVzZSBpcyBjcmVhdGVkLgp9CgpUaGUge1xlbSBjb21wb3NpdGlvbiBvZiB0d28gbWl4aW5zfSwgJE1fMTxUXzEgXGxkb3RzIFRfe2tfe01fMX19PiQgYW5kICRNXzI8VV8xICBcbGRvdHMgVV97a197TV8yfX0+JCwgd3JpdHRlbiAkTV8xPFRfMSBcbGRvdHMgVF97a197TV8xfX0+ICogTV8yPFVfMSAgXGxkb3RzIFVfe2tfe01fMn19PiQgZGVmaW5lcyBhbiBhbm9ueW1vdXMgbWl4aW4gc3VjaCB0aGF0IGZvciBhbnkgY2xhc3MgJFM8Vl8xIFxsZG90cyBWX3trX1N9PiQsIHRoZSBhcHBsaWNhdGlvbiBvZiAKCiRNXzE8VF8xIFxsZG90cyBUX3trX3tNXzF9fT4gKiBNXzI8VV8xICBcbGRvdHMgVV97a197TV8yfX0+JCAgCgp0byAkUzxWXzEgXGxkb3RzIFZfe2tfU30+JCBpcyBlcXVpdmFsZW50IHRvIAoKXGJlZ2lue2RhcnRDb2RlfQpcQUJTVFJBQ1R7fSBcQ0xBU1N7fSAkSWRfMTxUXzEgIFxsZG90cyBUX3trX3tNXzF9fSwgVV8xICBcbGRvdHMgVV97a197TV8yfX0sIFZfMSAgXGxkb3RzIFZfe2tfU30+ID0gJAogICAgICAkSWRfMjxVXzEgIFxsZG90cyBVX3trX3tNXzJ9fSwgVl8xICBcbGRvdHMgVl97a19TfT4kIFxXSVRIe30gJE1fMSA8VF8xICBcbGRvdHMgVF97a197TV8xfX0+JDsKXGVuZHtkYXJ0Q29kZX0KCndoZXJlICRJZF8yJCBkZW5vdGVzIAoKXGJlZ2lue2RhcnRDb2RlfQpcQUJTVFJBQ1R7fSAgXENMQVNTe30gJElkXzI8VV8xIFxsZG90cyBVX3trX3tNXzJ9fSwgVl8xIFxsZG90cyBWX3trX1N9PiA9JAogICAgICAgICAgICAgICAgICAgICAgICAgJFM8Vl8xIFxsZG90cyBWX3trX1N9PiQgXFdJVEh7fSAkTV8yPFVfMSAgXGxkb3RzIFVfe2tfe01fMn19PiQ7IApcZW5ke2RhcnRDb2RlfQoKYW5kICRJZF8xJCBhbmQgJElkXzIkIGFyZSB1bmlxdWUgaWRlbnRpZmllcnMgdGhhdCBkbyBub3QgZXhpc3QgYW55d2hlcmUgaW4gdGhlIHByb2dyYW0uIAoKXHJhdGlvbmFsZXsKVGhlIGNsYXNzZXMgcHJvZHVjZWQgYnkgbWl4aW4gY29tcG9zaXRpb24gYXJlIHJlZ2FyZGVkIGFzIGFic3RyYWN0IGJlY2F1c2UgdGhleSBjYW5ub3QgYmUgaW5zdGFudGlhdGVkIGluZGVwZW5kZW50bHkuIFRoZXkgYXJlIG9ubHkgaW50cm9kdWNlZCBhcyBhbm9ueW1vdXMgc3VwZXJjbGFzc2VzIG9mIG9yZGluYXJ5IGNsYXNzIGRlY2xhcmF0aW9ucyBhbmQgbWl4aW4gYXBwbGljYXRpb25zLiBDb25zZXF1ZW50bHksIG5vIHdhcm5pbmcgaXMgZ2l2ZW4gaWYgYSBtaXhpbiBjb21wb3NpdGlvbiBpbmNsdWRlcyBhYnN0cmFjdCBtZW1iZXJzLCBvciBpbmNvbXBsZXRlbHkgaW1wbGVtZW50cyBhbiBpbnRlcmZhY2UuCn0KCk1peGluIGNvbXBvc2l0aW9uIGlzIGFzc29jaWF0aXZlLgoKClxjb21tZW50YXJ5ewpOb3RlIHRoYXQgYW55IHN1YnNldCBvZiAkTV8xJCwgJE1fMiQgYW5kICRTJCBtYXkgb3IgbWF5IG5vdCBiZSBnZW5lcmljLiBGb3IgYW55IG5vbi1nZW5lcmljIGRlY2xhcmF0aW9uLCB0aGUgY29ycmVzcG9uZGluZyB0eXBlIHBhcmFtZXRlcnMgbWF5IGJlIGVsaWRlZCwgYW5kIGlmIG5vIHR5cGUgcGFyYW1ldGVycyByZW1haW4gaW4gdGhlIGRlcml2ZWQgZGVjbGFyYXRpb25zICRJZF8xJCBhbmQvb3IgJElkXzIkIHRoZW4gdGhlIHRob3NlIGRlY2xhcmF0aW9ucyBuZWVkIG5vdCBiZSBnZW5lcmljIGVpdGhlci4KfQoKClxzZWN0aW9ue0dlbmVyaWNzfQpcbGFiZWx7Z2VuZXJpY3N9CgpBIGNsYXNzIGRlY2xhcmF0aW9uIChccmVme2NsYXNzZXN9KSBvciB0eXBlIGFsaWFzIChccmVme3R5cGVkZWZ9KSAKJEckIG1heSBiZSB7XGVtIGdlbmVyaWN9LCB0aGF0IGlzLCAkRyQgbWF5IGhhdmUgZm9ybWFsIHR5cGUgcGFyYW1ldGVycyBkZWNsYXJlZC4gQSBnZW5lcmljIGRlY2xhcmF0aW9uIGluZHVjZXMgYSBmYW1pbHkgb2YgZGVjbGFyYXRpb25zLCBvbmUgZm9yIGVhY2ggc2V0IG9mIGFjdHVhbCB0eXBlIHBhcmFtZXRlcnMgcHJvdmlkZWQgaW4gdGhlIHByb2dyYW0uIAoKXGJlZ2lue2dyYW1tYXJ9CntcYmYgdHlwZVBhcmFtZXRlcjp9CiAgICAgbWV0YWRhdGEgaWRlbnRpZmllciAoXEVYVEVORFN7fSB0eXBlKT8KICAgIC4Ke1xiZiB0eXBlUGFyYW1ldGVyczp9CiAgICAgYDwnIHR5cGVQYXJhbWV0ZXIgKGAsJyB0eXBlUGFyYW1ldGVyKSogYD4nCiAgICAuClxlbmR7Z3JhbW1hcn0KCkEgdHlwZSBwYXJhbWV0ZXIgJFQkIG1heSBiZSBzdWZmaXhlZCB3aXRoIGFuIFxFWFRFTkRTe30gY2xhdXNlIHRoYXQgc3BlY2lmaWVzIHRoZSB7XGVtIHVwcGVyIGJvdW5kfSBmb3IgJFQkLiBJZiBubyAgXEVYVEVORFN7fSBjbGF1c2UgaXMgcHJlc2VudCwgdGhlIHVwcGVyIGJvdW5kIGlzIFxjb2Rle09iamVjdH0uICBJdCBpcyBhIHN0YXRpYyB0eXBlIHdhcm5pbmcgaWYgYSB0eXBlIHBhcmFtZXRlciBpcyBhIHN1cGVydHlwZSBvZiBpdHMgdXBwZXIgYm91bmQuIFRoZSBib3VuZHMgb2YgdHlwZSB2YXJpYWJsZXMgYXJlIGEgZm9ybSBvZiB0eXBlIGFubm90YXRpb24gYW5kIGhhdmUgbm8gZWZmZWN0IG9uIGV4ZWN1dGlvbiBpbiBwcm9kdWN0aW9uIG1vZGUuCgpUaGUgdHlwZSBwYXJhbWV0ZXJzIG9mIGEgZ2VuZXJpYyAkRyQgYXJlIGluIHNjb3BlIGluIHRoZSBib3VuZHMgb2YgYWxsIG9mIHRoZSB0eXBlIHBhcmFtZXRlcnMgb2YgJEckLiBUaGUgdHlwZSBwYXJhbWV0ZXJzIG9mIGEgZ2VuZXJpYyBjbGFzcyBkZWNsYXJhdGlvbiAkRyQgYXJlIGFsc28gaW4gc2NvcGUgaW4gdGhlIFxFWFRFTkRTe30gYW5kIFxJTVBMRU1FTlRTe30gY2xhdXNlcyBvZiAkRyQgKGlmIHRoZXNlIGV4aXN0KSBhbmQgaW4gdGhlIGJvZHkgb2YgJEckLiAgIEhvd2V2ZXIsIGEgdHlwZSBwYXJhbWV0ZXIgaXMgY29uc2lkZXJlZCB0byBiZSBhIG1hbGZvcm1lZCB0eXBlIHdoZW4gcmVmZXJlbmNlZCBieSBhIHN0YXRpYyBtZW1iZXIuCgpccmF0aW9uYWxlewpUaGUgcmVzdHJpY3Rpb24gaXMgbmVjZXNzYXJ5IHNpbmNlIGEgdHlwZSB2YXJpYWJsZSBoYXMgbm8gbWVhbmluZyBpbiB0aGUgY29udGV4dCBvZiBhIHN0YXRpYyBtZW1iZXIsIGJlY2F1c2Ugc3RhdGljcyBhcmUgc2hhcmVkIGFtb25nIGFsbCBpbnN0YW50aWF0aW9ucyBvZiBhIGdlbmVyaWMuIEhvd2V2ZXIsIGEgdHlwZSB2YXJpYWJsZSBtYXkgYmUgcmVmZXJlbmNlZCBmcm9tIGFuIGluc3RhbmNlIGluaXRpYWxpemVyLCBldmVuIHRob3VnaCBcVEhJU3t9IGlzIG5vdCBhdmFpbGFibGUuIAp9CgpcY29tbWVudGFyeXsKQmVjYXVzZSB0eXBlIHBhcmFtZXRlcnMgYXJlIGluIHNjb3BlIGluIHRoZWlyIGJvdW5kcywgd2Ugc3VwcG9ydCBGLWJvdW5kZWQgcXVhbnRpZmljYXRpb24gKGlmIHlvdSBkb24ndCBrbm93IHdoYXQgdGhhdCBpcywgZG9uJ3QgYXNrKS4gVGhpcyBlbmFibGVzIHR5cGVjaGVja2luZyBjb2RlIHN1Y2ggYXM6Cn0KClxiZWdpbntkYXJ0Q29kZX0KXElOVEVSRkFDRXt9IE9yZGVyZWQkPCRUJD4kIFx7CiAgb3BlcmF0b3IgJD4kIChUIHgpOwpcfQoKXENMQVNTe30gU29ydGVyJDwkVCBcRVhURU5EU3t9IE9yZGVyZWQkPCRUJD4+JCBcewogICBzb3J0KExpc3QkPCRUJD4kIGwpIHsuLi4gbFtuXSAkPCQgbFtuKzFdIC4uLn0KXH0KClxlbmR7ZGFydENvZGV9CgpcY29tbWVudGFyeXsKRXZlbiB3aGVyZSB0eXBlIHBhcmFtZXRlcnMgYXJlIGluIHNjb3BlIHRoZXJlIGFyZSBudW1lcm91cyByZXN0cmljdGlvbnMgYXQgdGhpcyB0aW1lOgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gQSB0eXBlIHBhcmFtZXRlciBjYW5ub3QgYmUgdXNlZCB0byBuYW1lIGEgY29uc3RydWN0b3IgaW4gYW4gaW5zdGFuY2UgY3JlYXRpb24gZXhwcmVzc2lvbiAoXHJlZntpbnN0YW5jZUNyZWF0aW9ufSkuClxpdGVtIEEgdHlwZSBwYXJhbWV0ZXIgY2Fubm90IGJlIHVzZWQgYXMgYSBzdXBlcmNsYXNzIG9yIHN1cGVyaW50ZXJmYWNlIChccmVme3N1cGVyY2xhc3Nlc30sIFxyZWZ7c3VwZXJpbnRlcmZhY2VzfSwgXHJlZntpbnRlcmZhY2VTdXBlcmludGVyZmFjZXN9KS4KXGl0ZW0gQSB0eXBlIHBhcmFtZXRlciBjYW5ub3QgYmUgdXNlZCBhcyBhIGdlbmVyaWMgdHlwZS4KXGVuZHtpdGVtaXplfQoKVGhlIG5vcm1hdGl2ZSB2ZXJzaW9ucyBvZiB0aGVzZSAgYXJlIGdpdmVuIGluIHRoZSBhcHByb3ByaWF0ZSBzZWN0aW9ucyBvZiB0aGlzIHNwZWNpZmljYXRpb24uIFNvbWUgb2YgdGhlc2UgcmVzdHJpY3Rpb25zIG1heSBiZSBsaWZ0ZWQgaW4gdGhlIGZ1dHVyZS4KfQoKJVRoZSB7XGVtIGluZHVjZWQgdHlwZSBzZXR9LCAkUyQsIG9mIGEgcGFyYW1ldGVyaXplZCB0eXBlICRUJCBpcyB0aGUgc2V0IGNvbnNpc3Rpbmcgb2YgCiVcYmVnaW57aXRlbWl6ZX0KJVxpdGVtIFRoZSBzdXBlcnR5cGVzIG9mIGFueSB0eXBlIGluICRTJC4KJVxpdGVtIFRoZSB0eXBlIGFyZ3VtZW50cyBvZiBhbnkgcGFyYW1ldGVyaXplZCB0eXBlIGluICRTJC4KJVxlbmR7aXRlbWl6ZX0KCiVMZXQgJFAkIGJlIHRoZSBpbnN0YW50aWF0aW9uIG9mIGEgZ2VuZXJpYyB0eXBlIHdpdGggaXRzIG93biB0eXBlIHBhcmFtZXRlcnMuIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIHRoZSBpbmR1Y2VkIHR5cGUgc2V0IG9mICRQJCBpcyBub3QgZmluaXRlLgoKJVxyYXRpb25hbGUge0EgdHlwaWNhbCByZWN1cnNpdmUgdHlwZSBkZWNsYXJhdGlvbiBzdWNoIGFzfQoKJVxiZWdpbntkYXJ0Q29kZX0KJVxDTEFTU3t9IEIkPCRTJD4kIFx7XH0KJVxDTEFTU3t9IEQkPCRUJD4kIFxFWFRFTkRTe30gQiQ8JEQkPCRUJD4+JCBce1x9CiVcZW5ke2RhcnRDb2RlfQoKJVxyYXRpb25hbGV7CiVwb3NlcyBubyBwcm9ibGVtIHVuZGVyIHRoaXMgcnVsZS4gVGhlIGluc3RhbnRpYXRpb24gXGNke0QkPCRUJD4kfSBoYXMgYW4gaW5kdWNlZAolc2V0IGNvbnNpc3Rpbmcgb2Y6IFxjZHtCJDwkRCQ8JFQkPj4kLCBPYmplY3QsIEQkPCRUJD4kLCBUfS4gSG93ZXZlciwgdGhlIGZvbGxvd2luZyB2YXJpYW50CiV9CgolXGJlZ2lue2RhcnRDb2RlfQolXENMQVNTe30gQiQ8JFMkPiQgXHtcfQolXENMQVNTe30gRCQ8JFQkPiQgXEVYVEVORFN7fSBCJDwkRCQ8JEQkPCRUJD4+PiQgXHtcfQolXGVuZHtkYXJ0Q29kZX0KCiVccmF0aW9uYWxlewolaXMgZGlzYWxsb3dlZC4gQ29uc2lkZXIgYWdhaW4gdGhlIGluc3RhbnRpYXRpb24gXGNke0QkPCRUJD4kfS4gSXQgbGVhZHMgdG8gdGhlCiVzdXBlcmNsYXNzIFxjZHtCJDwkRCQ8JEQkPCRUJD4+PiR9LCBhbmQgc28gYWRkcyBcY2R7RCQ8JEQkPCAkVCQ+PiR9IHRvIHRoZSBpbmR1Y2VkIHNldC4gVGhlIGxhdHRlciBpbiB0dXJuIGxlYWRzIHRvICBcY2R7QiQ8JEQkPCREJDwkRCQ8JFQkPj4+PiR9IGFuZCBcY2R7RCQ8JEQkPCREJDwkVCQ+Pj4kfQolYW5kIHNvIG9uIGFkIGluZmluaXR1bS59CgolXGNvbW1lbnRhcnl7CiVUaGUgYWJvdmUgcmVxdWlyZW1lbnQgZG9lcyBub3QgcHJlY2x1ZGUgdGhlIHVzZSBvZiBhcmJpdHJhcnkgcmVjdXJzaXZlIHR5cGVzIGluIHRoZSBib2R5IG9mIGEgZ2VuZXJpYyBjbGFzcy4gfQolQSBnZW5lcmljIGhhcyBhIHR5cGUgcGFyYW1ldGVyIHNjb3BlLiBUaGUgZW5jbG9zaW5nIHNjb3BlIG9mIGEgdHlwZSBwYXJhbWV0ZXIgc2NvcGUgb2YgYSBnZW5lcmljIEcgIGlzIHRoZSBlbmNsb3Npbmcgc2NvcGUgb2YgRy4KCgolY2xhc3MgVCB7Li4ufQoKJWNsYXNzIEc8VD4gZXh0ZW5kcyBUOwoKJUJ5IGN1cnJlbnQgcnVsZXMsIHRoaXMgaXMgaWxsZWdhbC4gTWFrZSBzdXJlIHdlIHByZXNlcnZlIHRoaXMuCgoKJVxzdWJzZWN0aW9ue0ludGVyZmFjZSBJbmplY3Rpb259CiVcbGFiZWx7aW50ZXJmYWNlSW5qZWN0aW9ufQoKJUFuIHtcZW0gaW50ZXJmYWNlIGluamVjdGlvbiBkZWNsYXJhdGlvbn0gY2F1c2VzIGEgcHJlLWV4aXN0aW5nIGNsYXNzICRTJCB0byBiZSBjb25zaWRlcmVkIGEgc3ViaW50ZXJmYWNlIG9mIGFub3RoZXIgaW50ZXJmYWNlICRJJC4gSXQgaXMgYSBzdGF0aWMgdHlwZSB3YXJuaW5nIGlmICRTJCBpcyBub3QgYSBzdHJ1Y3R1cmFsIHN1YnR5cGUgb2YgJEkkLiBIb3dldmVyLCB0aGUgc3ViaW50ZXJmYWNlIHJlbGF0aW9ucyBpbXBsaWVkIGJ5IHRoZSBpbnRlcmZhY2UgaW5qZWN0aW9uIGRlY2xhcmF0aW9uIGFyZSBjb25zaWRlcmVkIHRvIGhvbGQgYnkgYm90aCB0aGUgdHlwZWNoZWNrZXIgYW5kIHRoZSBydW50aW1lLCByZWdhcmRsZXNzLgoKJVxiZWdpbntncmFtbWFyfQolY2xhc3NJbnRlcmZhY2VJbmplY3Rpb246CiAgICAgICVjbGFzcyBxdWFsaWZpZWQgdHlwZVBhcmFtZXRlcnM/IGludGVyZmFjZXMgJ3tcZXNjYXBlZ3JhbW1hciA7fScKICAgICAgJSAgLgoKCiVpbnRlcmZhY2VJbnRlcmZhY2VJbmplY3Rpb246CiAgICAgICVpbnRlcmZhY2UgcXVhbGlmaWVkIHR5cGVQYXJhbWV0ZXJzPyBzdXBlcmludGVyZmFjZXMgJ3tcZXNjYXBlZ3JhbW1hciA7fScKICAgICUuCiVcZW5ke2dyYW1tYXJ9CgolXHJhdGlvbmFsZXtTaW5jZSBzdWJpbnRlcmZhY2UgcmVsYXRpb25zIGNhbiBiZSB0ZXN0ZWQgZHluYW1pY2FsbHkgdmlhIFxJU3t9LCBpbnRlcmZhY2UgaW5qZWN0aW9uIGlzIG5vdCBqdXN0IGEgZGlyZWN0aXZlIHRvIHRoZSBzdGF0aWMgY2hlY2tlci4gVGhlIGR5bmFtaWMgcmVsYXRpb25zIGltcGxpZWQgbXVzdCAgaG9sZCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYSBzdGF0aWMgdHlwZWNoZWNrIGhhcyBzdWNjZWVkZWQsIG9yIGhhcyBiZWVuIHBlcmZvcm1lZCBhdCBhbGwuIFRoaXMgbWFrZXMgc2Vuc2UgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgcHJlc2VydmluZyBwcm9ncmFtbWVyIGludGVudC4gVGhlIGluamVjdGlvbiBkZXNjcmliZXMgYSBub21pbmFsIHR5cGUgcmVsYXRpb24gdGhhdCB0aGUgcHJvZ3JhbW1lciB3aXNoZXMgdG8gaG9sZC4gSnVzdCBhcyBhIHN1cGVydHlwZSBtZW50aW9uZWQgd2l0aGluIGEgY2xhc3MgZGVjbGFyYXRpb24gaXMgY29uc2lkZXJlZCBhIHN1cGVydHlwZSBldmVuIHRob3VnaCB0eXBlIGVycm9ycyBtaWdodCBhcmlzZSBhbW9uZyAoc2F5KSBvdmVycmlkZGVuIGFuZCBvdmVycmlkaW5nIG1ldGhvZHMsIHNvIGl0IG11c3QgYmUgdGhhdCB0aGUgcmVsYXRpb24gaW1wbGllZCBieSBhbiBpbmplY3Rpb24gaG9sZHMgcmVnYXJkbGVzcyBvZiB0eXBlIGVycm9ycy4gCiVJbiBhZGRpdGlvbiwgdGhpcyBkZWNpc2lvbiBoZWxwcyB0byBwcm9kdWNlIG1lYW5pbmdmdWwgYW5kIGxvY2FsaXplZCBlcnJvciBtZXNzYWdlcy4gQW55IGVycm9ycyBhcmUgcmVwb3J0ZWQgYXQgdGhlIHBvaW50IG9mIGluamVjdGlvbiByYXRoZXIgdGhhbiBhdCBwcm9ncmFtIHBvaW50cyB0aGF0IHJlbHkgb24gdGhlIHJlbGF0aW9uIChhIHdlbGwga25vd24gcHJvYmxlbSB3aXRoIHN0cnVjdHVyYWwgc3VidHlwaW5nIGluIE9PIHN5c3RlbXMpLgolfQoKJVxRe1doZW4gZG9lcyBhbiBpbnRlcmZhY2UgaW5qZWN0aW9uIHRha2UgZWZmZWN0PyBXaGVuIHRoZSBjb250YWluaW5nIGxpYnJhcnkgaXMgbG9hZGVkPwolV2hhdCBpcyB0aGUgc2NvcGUgb2Ygc3VjaCBhIGRlY2xhcmF0aW9uPyBJcyBpdCBnbG9iYWwsIG9yIG9ubHkgaW4gdGhlIHNjb3BlIG9mIHRoZSBjb250YWluaW5nIGxpYnJhcnk/IFRoZSBzY29wZSBvZiBzdWNoIGEgZGVjbGFyYXRpb24gaXMgZ2xvYmFsLiAKJUFuIGluamVjdGlvbiBtdXN0IGJlIGF0IHRvcCBsZXZlbC4gV2hvIGhhcyB0aGUgcmlnaHQgdG8gaW5qZWN0IGFuIGludGVyZmFjZSAkSSQgaW50byBhbm90aGVyIGNsYXNzICRDJD8gQW55Ym9keT8gQnV0IHNpbmNlIHRoaXMgYWZmZWN0cyBkeW5hbWljIGJlaGF2aW9yLCBpcyB0aGlzIGEgd2VpcmQgc2VjdXJpdHkgaXNzdWU/IAolVGhlIGN1cnJlbnQgdGhlb3J5IGlzIHRoYXQgdGhlcmUgaXMgbm8gc2VjdXJpdHkgd2l0aGluIGFuIGlzb2xhdGUsIGFuZCBvbmUgY2FuIG5ldmVyIHJlZmVyIHRvIGEgdHlwZSBmcm9tIGFub3RoZXIgaXNvbGF0ZSwgc28gc3VwcG9zZWRseSBub3QgYW4gaXNzdWUuIFRoaXMgYXNzdW1wdGlvbiAobm8gbXV0dWFsbHkgc3VzcGljaW91cyBjb2RlIGluIHRoZSBzYW1lIGlzb2xhdGUpIGlzIHN1c3BlY3QgYnV0IGl0IHNlZW1zIHRoZXJlIGlzIG5vdGhpbmcgdG8gYmUgZG9uZSBhdCB0aGlzIHBvaW50LgolSWYgbGlicyBhcmUgZmlyc3QgY2xhc3MsIHRoZXkgZ2V0IGNyZWF0ZWQgZHluYW1pY2FsbHkgaW4gb3JkZXIsIGFuZCBuZXcgbGlicyBtaWdodCBtb2RpZnkgdGhlIHR5cGUgcmVsYXRpb25zIGFtb25nIG90aGVyIGxpYnMgdHlwZXMgLSBidXQgdGhlbiBpdCBpcyBjbGVhciB3aGVuIHRoYXQgaGFwcGVuZWQgYW5kIG9yZGVyIGlzIG9rLgolfQoKJUl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIGEgdHlwZSAkVCQgYXBwZWFycyBtb3JlIHRoYW4gb25jZSBpbiB0aGUgaW1wbGVtZW50cyBvciBlZXh0ZW5kcyBjbGF1c2Ugb2YgIGFuIGludGVyZmFjZSAgaW5qZWN0aW9uLgoKClxzZWN0aW9ue01ldGFkYXRhfQpcbGFiZWx7bWV0YWRhdGF9CgpEYXJ0IHN1cHBvcnRzIG1ldGFkYXRhIHdoaWNoIGlzIHVzZWQgdG8gYXR0YWNoIHVzZXIgZGVmaW5lZCBhbm5vdGF0aW9ucyB0byBwcm9ncmFtIHN0cnVjdHVyZXMuICAKClxiZWdpbntncmFtbWFyfQp7XGJmIG1ldGFkYXRhOn0KICAgICAgKGBAJyBxdWFsaWZpZWQgKHtcZXNjYXBlZ3JhbW1hciBgLid9IGlkZW50aWZpZXIpPyAoYXJndW1lbnRzKT8pKgogICAgLgpcZW5ke2dyYW1tYXJ9CgpNZXRhZGF0YSBjb25zaXN0cyBvZiBhIHNlcmllcyBvZiBhbm5vdGF0aW9ucywgZWFjaCBvZiB3aGljaCBiZWdpbiB3aXRoIHRoZSBjaGFyYWN0ZXIgQCwgZm9sbG93ZWQgYnkgIGEgY29uc3RhbnQgZXhwcmVzc2lvbiB0aGF0IHN0YXJ0cyB3aXRoIGFuIGlkZW50aWZpZXIuIEl0IGlzIGEgY29tcGlsZSB0aW1lIGVycm9yIGlmIHRoZSBleHByZXNzaW9uIGlzIG5vdCBvbmUgb2YgdGhlIGZvbGxvd2luZzoKXGJlZ2lue2l0ZW1pemV9ClxpdGVtIEEgcmVmZXJlbmNlIHRvIGEgY29tcGlsZS10aW1lIGNvbnN0YW50IHZhcmlhYmxlLgpcaXRlbSBBIGNhbGwgdG8gYSBjb25zdGFudCBjb25zdHJ1Y3Rvci4KXGVuZHtpdGVtaXplfQoKTWV0YWRhdGEgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhYnN0cmFjdCBzeW50YXggdHJlZSBvZiB0aGUgcHJvZ3JhbSBjb25zdHJ1Y3QgJHAkIHRoYXQgaW1tZWRpYXRlbHkgZm9sbG93cyB0aGUgbWV0YWRhdGEsIGFzc3VtaW5nICRwJCBpcyBub3QgaXRzZWxmIG1ldGFkYXRhIG9yIGEgY29tbWVudC4gTWV0YWRhdGEgY2FuIGJlIHJldHJpZXZlZCBhdCBydW50aW1lIHZpYSBhIHJlZmxlY3RpdmUgY2FsbCwgcHJvdmlkZWQgdGhlIGFubm90YXRlZCBwcm9ncmFtIGNvbnN0cnVjdCAkcCQgaXMgYWNjZXNzaWJsZSB2aWEgcmVmbGVjdGlvbi4KClxjb21tZW50YXJ5ewpPYnZpb3VzbHksIG1ldGFkYXRhIGNhbiBhbHNvIGJlIHJldHJpZXZlZCBzdGF0aWNhbGx5IGJ5IHBhcnNpbmcgdGhlIHByb2dyYW0gYW5kIGV2YWx1YXRpbmcgdGhlIGNvbnN0YW50cyB2aWEgYSBzdWl0YWJsZSBpbnRlcnByZXRlci4gSW4gZmFjdCBtYW55IGlmIG5vdCBtb3N0IHVzZXMgb2YgbWV0YWRhdGEgYXJlIGVudGlyZWx5IHN0YXRpYy4KfQoKXHJhdGlvbmFsZXsKSXQgaXMgaW1wb3J0YW50IHRoYXQgbm8gcnVudGltZSBvdmVyaGVhZCBiZSBpbmN1cnJlZCBieSB0aGUgaW50cm9kdWN0aW9uIG9mIG1ldGFkYXRhIHRoYXQgaXMgbm90IGFjdHVhbGx5IHVzZWQuIEJlY2F1c2UgbWV0YWRhdGEgb25seSBpbnZvbHZlcyBjb25zdGFudHMsIHRoZSB0aW1lIGF0IHdoaWNoIGl0IGlzIGNvbXB1dGVkIGlzIGlycmVsZXZhbnQgc28gdGhhdCBpbXBsZW1lbnRhdGlvbnMgbWF5IHNraXAgdGhlIG1ldGFkYXRhIGR1cmluZyBvcmRpbmFyeSBwYXJzaW5nIGFuZCBleGVjdXRpb24gYW5kIGV2YWx1YXRlIGl0IGxhemlseS4KfQoKXGNvbW1lbnRhcnl7Ckl0IGlzIHBvc3NpYmxlIHRvIGFzc29jaWF0ZSBtZXRhZGF0YSB3aXRoIGNvbnN0cnVjdHMgdGhhdCBtYXkgbm90IGJlIGFjY2Vzc2libGUgdmlhIHJlZmxlY3Rpb24sIHN1Y2ggYXMgbG9jYWwgdmFyaWFibGVzICh0aG91Z2ggaXQgaXMgY29uY2VpdmFibGUgdGhhdCBpbiB0aGUgZnV0dXJlLCByaWNoZXIgcmVmbGVjdGl2ZSBsaWJyYXJpZXMgbWlnaHQgcHJvdmlkZSBhY2Nlc3MgdG8gdGhlc2UgYXMgd2VsbCkuICBUaGlzIGlzIG5vdCBhcyB1c2VsZXNzIGFzIGl0IG1pZ2h0IHNlZW0uIEFzIG5vdGVkIGFib3ZlLCB0aGUgZGF0YSBjYW4gYmUgcmV0cmlldmVkIHN0YXRpY2FsbHkgaWYgc291cmNlIGNvZGUgaXMgYXZhaWxhYmxlLgp9CgpNZXRhZGF0YSBjYW4gYXBwZWFyIGJlZm9yZSBhIGxpYnJhcnksIHBhcnQgaGVhZGVyLCBjbGFzcywgdHlwZWRlZiwgdHlwZSBwYXJhbWV0ZXIsIGNvbnN0cnVjdG9yLCBmYWN0b3J5LCBmdW5jdGlvbiwgZmllbGQsIHBhcmFtZXRlciwgb3IgdmFyaWFibGUgZGVjbGFyYXRpb24gYW5kIGJlZm9yZSBhbiBpbXBvcnQsIGV4cG9ydCBvciBwYXJ0IGRpcmVjdGl2ZS4KClRoZSBjb25zdGFudCBleHByZXNzaW9uIGdpdmVuIGluIGFuIGFubm90YXRpb24gIGlzIHR5cGUgY2hlY2tlZCBhbmQgZXZhbHVhdGVkIGluIHRoZSBzY29wZSBzdXJyb3VuZGluZyB0aGUgZGVjbGFyYXRpb24gYmVpbmcgYW5ub3RhdGVkLiAgCgoKXHNlY3Rpb257RXhwcmVzc2lvbnN9ClxsYWJlbHtleHByZXNzaW9uc30KCkFuIHtcZW0gZXhwcmVzc2lvbn0gaXMgYSBmcmFnbWVudCBvZiBEYXJ0IGNvZGUgdGhhdCBjYW4gYmUgZXZhbHVhdGVkIGF0IHJ1biB0aW1lIHRvIHlpZWxkIGEge1xlbSB2YWx1ZX0sIHdoaWNoIGlzIGFsd2F5cyBhbiBvYmplY3QuIEV2ZXJ5IGV4cHJlc3Npb24gaGFzIGFuIGFzc29jaWF0ZWQgc3RhdGljIHR5cGUgKFxyZWZ7c3RhdGljVHlwZXN9KS4gRXZlcnkgdmFsdWUgaGFzIGFuIGFzc29jaWF0ZWQgZHluYW1pYyB0eXBlIChccmVme2R5bmFtaWNUeXBlU3lzdGVtfSkuCgoKXGJlZ2lue2dyYW1tYXJ9Cgp7XGJmIGV4cHJlc3Npb246fWFzc2lnbmFibGVFeHByZXNzaW9uIGFzc2lnbm1lbnRPcGVyYXRvciBleHByZXNzaW9uOwogICAgICAgY29uZGl0aW9uYWxFeHByZXNzaW9uIGNhc2NhZGVTZWN0aW9uKjsKICAgICAgIHRocm93RXhwcmVzc2lvbiAgICAgCiAgICAuCiAgICAgCiAgICAKe1xiZiBleHByZXNzaW9uV2l0aG91dENhc2NhZGU6fWFzc2lnbmFibGVFeHByZXNzaW9uIGFzc2lnbm1lbnRPcGVyYXRvciBleHByZXNzaW9uV2l0aG91dENhc2NhZGU7CiAgICAgIGNvbmRpdGlvbmFsRXhwcmVzc2lvbjsKICAgICAgdGhyb3dFeHByZXNzaW9uV2l0aG91dENhc2NhZGUgICAgCiAgICAuCgp7XGJmIGV4cHJlc3Npb25MaXN0On0KICAgICAgZXhwcmVzc2lvbiAoYCwnIGV4cHJlc3Npb24pKiAlc2hvdWxkIHRoZXNlIGJlIHRvcCBsZXZlbCBleHByZXNzaW9ucz8KICAgIC4KXGVuZHtncmFtbWFyfSAgICAKClxiZWdpbntncmFtbWFyfQp7XGJmIHByaW1hcnk6fXRoaXNFeHByZXNzaW9uOwogICAgICBcU1VQRVJ7fSBhc3NpZ25hYmxlU2VsZWN0b3I7CiAgICAgIGZ1bmN0aW9uRXhwcmVzc2lvbjsKICAgICAgbGl0ZXJhbDsKICAgICAgaWRlbnRpZmllcjsKICAgICAgbmV3RXhwcmVzc2lvbjsKICAgICAgY29uc3RPYmplY3RFeHByZXNzaW9uOwogICAgICBgKCcgZXhwcmVzc2lvbiBgKScKICAgIC4KICAgIApcZW5ke2dyYW1tYXJ9ICAgCgpBbiBleHByZXNzaW9uICRlJCBtYXkgYWx3YXlzIGJlIGVuY2xvc2VkIGluIHBhcmVudGhlc2VzLCBidXQgdGhpcyBuZXZlciBoYXMgYW55IHNlbWFudGljIGVmZmVjdCBvbiAkZSQuCgpcY29tbWVudGFyeXsKU2FkbHksIGl0IG1heSBoYXZlIGFuIGVmZmVjdCBvbiB0aGUgc3Vycm91bmRpbmcgZXhwcmVzc2lvbi4gR2l2ZW4gYSBjbGFzcyAkQyQgd2l0aCBzdGF0aWMgbWV0aG9kICRtID0+IDQyJCwgJEMubSgpJCByZXR1cm5zIDQyLCBidXQgJChDKS5tKCkkIHByb2R1Y2VzIGEgXGNvZGV7Tm9TdWNoTWV0aG9kRXJyb3J9LiAgVGhpcyBhbm9tYWx5IGNhbiBiZSBjb3JyZWN0ZWQgYnkgcmVtb3ZpbmcgdGhlIHJlc3RyaWN0aW9ucyBvbiBjYWxsaW5nIHRoZSBtZW1iZXJzIG9mIGluc3RhbmNlcyBvZiBcY29kZXtUeXBlfS4gVGhpcyBpc3N1ZSBtYXkgYmUgYWRkcmVzc2VkIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiBEYXJ0Lgp9CgogXHN1YnN1YnNlY3Rpb257T2JqZWN0IElkZW50aXR5fQogXGxhYmVse29iamVjdElkZW50aXR5fQogClRoZSBwcmVkZWZpbmVkIERhcnQgZnVuY3Rpb24gXGNke2lkZW50aWNhbCgpfSBpcyBkZWZpbmVkIHN1Y2ggdGhhdCBcY29kZXtpZGVudGljYWwoJGNfMSQsICRjXzIkKX0gaWZmOgogXGJlZ2lue2l0ZW1pemV9CiBcaXRlbSAkY18xJCAgZXZhbHVhdGVzIHRvIGVpdGhlciBcTlVMTHt9IG9yICBhbiBpbnN0YW5jZSBvZiBcY29kZXtib29sfSBhbmQgXGNvZGV7JGNfMSQgPT0gJGNfMiR9LCBPUgogXGl0ZW0gJGNfMSQgYW5kICRjXzIkIGFyZSBpbnN0YW5jZXMgb2YgXGNvZGV7aW50fSBhbmQgXGNvZGV7JGNfMSQgPT0gJGNfMiR9LCBPUgogXGl0ZW0gJGNfMSQgYW5kICRjXzIkIGFyZSBjb25zdGFudCBzdHJpbmdzIGFuZCBcY29kZXskY18xJCA9PSAkY18yJH0sIE9SCiBcaXRlbSAkY18xJCAgYW5kICRjXzIkICBhcmUgaW5zdGFuY2VzIG9mIFxjZHtkb3VibGV9IGFuZCAgb25lIG9mIHRoZSBmb2xsb3dpbmcgaG9sZHM6CiBcYmVnaW57aXRlbWl6ZX0KICAgXGl0ZW0gJGNfMSQgYW5kICRjXzIkIGFyZSBub24temVybyBhbmQgXGNvZGV7JGNfMSQgPT0gJGNfMiR9LgogICBcaXRlbSAgQm90aCAkY18xJCBhbmQgJGNfMiQgYXJlICQrMC4wJC4KICAgXGl0ZW0gQm90aCAgJGNfMSQgYW5kICRjXzIkIGFyZSAkLTAuMCQuCiAgIFxpdGVtIEJvdGggJGNfMSQgYW5kICRjXzIkIHJlcHJlc2VudCBhIE5hTiB2YWx1ZSB3aXRoIHRoZSBzYW1lIHVuZGVybHlpbmcgYml0IHBhdHRlcm4uCiBcZW5ke2l0ZW1pemV9CiBPUgogXGl0ZW0gJGNfMSQgYW5kICRjXzIkIGFyZSBjb25zdGFudCBsaXN0cyB0aGF0IGFyZSBkZWZpbmVkIHRvIGJlIGlkZW50aWNhbCBpbiB0aGUgc3BlY2lmaWNhdGlvbiBvZiBsaXRlcmFsIGxpc3QgZXhwcmVzc2lvbnMgKFxyZWZ7bGlzdHN9KSwgT1IKIFxpdGVtICRjXzEkIGFuZCAkY18yJCBhcmUgY29uc3RhbnQgbWFwcyB0aGF0IGFyZSBkZWZpbmVkIHRvIGJlIGlkZW50aWNhbCBpbiB0aGUgc3BlY2lmaWNhdGlvbiBvZiBsaXRlcmFsIG1hcCBleHByZXNzaW9ucyAoXHJlZnttYXBzfSksIE9SCiBcaXRlbSAkY18xJCBhbmQgJGNfMiQgYXJlIGNvbnN0YW50IG9iamVjdHMgb2YgdGhlIHNhbWUgY2xhc3MgJEMkIGFuZCBlYWNoIG1lbWJlciBmaWVsZCBvZiAkY18xJCBpcyBpZGVudGljYWwgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgb2YgJGNfMiQuIE9SClxpdGVtICRjXzEkIGFuZCAkY18yJCBhcmUgdGhlIHNhbWUgb2JqZWN0LgpcZW5ke2l0ZW1pemV9CiAgICAKXGNvbW1lbnRhcnl7ClRoZSBkZWZpbml0aW9uIG9mIFxjZHtpZGVudGl0eX0gZm9yIGRvdWJsZXMgZGlmZmVycyBmcm9tIHRoYXQgb2YgZXF1YWxpdHkgaW4gdGhhdCBhIE5hTiBpcyBlcXVhbCB0byBpdHNlbGYsIGFuZCB0aGF0IG5lZ2F0aXZlIGFuZCBwb3NpdGl2ZSB6ZXJvIGFyZSBkaXN0aW5jdC4gIAp9CgpccmF0aW9uYWxlewpUaGUgZGVmaW5pdGlvbiBvZiBlcXVhbGl0eSBmb3IgZG91YmxlcyBpcyBkaWN0YXRlZCBieSB0aGUgSUVFRSA3NTQgc3RhbmRhcmQsIHdoaWNoIHBvc2l0cyB0aGF0IE5hTnMgZG8gbm90IG9iZXkgdGhlIGxhdyBvZiByZWZsZXhpdml0eS4gIEdpdmVuIHRoYXQgaGFyZHdhcmUgaW1wbGVtZW50cyB0aGVzZSBydWxlcywgaXQgaXMgbmVjZXNzYXJ5IHRvIHN1cHBvcnQgdGhlbSBmb3IgcmVhc29ucyBvZiBlZmZpY2llbmN5LgoKVGhlIGRlZmluaXRpb24gb2YgaWRlbnRpdHkgaXMgbm90IGNvbnN0cmFpbmVkIGluIHRoZSBzYW1lIHdheS4gSW5zdGVhZCwgaXQgYXNzdW1lcyB0aGF0IGJpdC1pZGVudGljYWwgZG91YmxlcyBhcmUgaWRlbnRpY2FsLgoKVGhlIHJ1bGVzIGZvciBpZGVudGl0eSBtYWtlIGl0IGltcG9zc2libGUgZm9yIGEgRGFydCBwcm9ncmFtbWVyIHRvIG9ic2VydmUgd2hldGhlciBhIGJvb2xlYW4gb3IgbnVtZXJpY2FsIHZhbHVlIGlzIGJveGVkIG9yIHVuYm94ZWQuCn0KICAgIAogICAgClxzdWJzZWN0aW9ue0NvbnN0YW50c30KXGxhYmVse2NvbnN0YW50c30KCkEge1xlbSBjb25zdGFudCBleHByZXNzaW9ufSBpcyBhbiBleHByZXNzaW9uIHdob3NlIHZhbHVlIGNhbiBuZXZlciBjaGFuZ2UsIGFuZCB0aGF0IGNhbiBiZSBldmFsdWF0ZWQgZW50aXJlbHkgYXQgY29tcGlsZSB0aW1lLiAKCkEgY29uc3RhbnQgZXhwcmVzc2lvbiBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKXGJlZ2lue2l0ZW1pemV9ClxpdGVtIEEgbGl0ZXJhbCBudW1iZXIgKFxyZWZ7bnVtYmVyc30pLgpcaXRlbSBBIGxpdGVyYWwgYm9vbGVhbiAoXHJlZntib29sZWFuc30pLgpcaXRlbSBBIGxpdGVyYWwgc3RyaW5nIChccmVme3N0cmluZ3N9KSB3aGVyZSBhbnkgaW50ZXJwb2xhdGVkIGV4cHJlc3Npb24gIChccmVme3N0cmluZ0ludGVycG9sYXRpb259KSBpcyBhIGNvbXBpbGUtdGltZSBjb25zdGFudCB0aGF0IGV2YWx1YXRlcyB0byBhIG51bWVyaWMsIHN0cmluZyBvciBib29sZWFuIHZhbHVlIG9yIHRvIFxOVUxMe30uClxyYXRpb25hbGV7SXQgd291bGQgYmUgdGVtcHRpbmcgdG8gYWxsb3cgc3RyaW5nIGludGVycG9sYXRpb24gd2hlcmUgdGhlIGludGVycG9sYXRlZCB2YWx1ZSBpcyBhbnkgY29tcGlsZS10aW1lIGNvbnN0YW50LiAgSG93ZXZlciwgdGhpcyB3b3VsZCByZXF1aXJlIHJ1bm5pbmcgdGhlIFxjb2Rle3RvU3RyaW5nKCl9IG1ldGhvZCBmb3IgY29uc3RhbnQgb2JqZWN0cywgd2hpY2ggY291bGQgY29udGFpbiBhcmJpdHJhcnkgY29kZS59ClxpdGVtIEEgbGl0ZXJhbCBzeW1ib2wgKFxyZWZ7c3ltYm9sc30pLgpcaXRlbSBcTlVMTHt9IChccmVme251bGx9KS4KXGl0ZW0gQSBxdWFsaWZpZWQgcmVmZXJlbmNlIHRvIGEgc3RhdGljIGNvbnN0YW50IHZhcmlhYmxlIChccmVme3ZhcmlhYmxlc30pIHRoYXQgaXMgbm90IHF1YWxpZmllZCBieSBhIGRlZmVycmVkIHByZWZpeC4gClxjb21tZW50YXJ5IHtGb3IgZXhhbXBsZSwgSWYgY2xhc3MgQyBkZWNsYXJlcyBhIGNvbnN0YW50IHN0YXRpYyB2YXJpYWJsZSB2LCBDLnYgaXMgYSBjb25zdGFudC4gVGhlIHNhbWUgaXMgdHJ1ZSBpZiBDIGlzIGFjY2Vzc2VkIHZpYSBhIHByZWZpeCBwOyBwLkMudiBpcyBhIGNvbnN0YW50ICB1bmxlc3MgcCBpcyBhIGRlZmVycmVkIHByZWZpeC4KfQpcaXRlbSBBbiBpZGVudGlmaWVyIGV4cHJlc3Npb24gdGhhdCBkZW5vdGVzIGEgY29uc3RhbnQgdmFyaWFibGUuIApcaXRlbSBBIHF1YWxpZmllZCByZWZlcmVuY2UgdG8gYSBzdGF0aWMgY29uc3RhbnQgdmFyaWFibGUgKFxyZWZ7dmFyaWFibGVzfSkgdGhhdCBpcyBub3QgcXVhbGlmaWVkIGJ5IGEgZGVmZXJyZWQgcHJlZml4LiAKXGNvbW1lbnRhcnkge0ZvciBleGFtcGxlLCBJZiBjbGFzcyBDIGRlY2xhcmVzIGEgY29uc3RhbnQgc3RhdGljIHZhcmlhYmxlIHYsIEMudiBpcyBhIGNvbnN0YW50LiBUaGUgc2FtZSBpcyB0cnVlIGlmIEMgaXMgYWNjZXNzZWQgdmlhIGEgcHJlZml4IHA7IHAuQy52IGlzIGEgY29uc3RhbnQgIHVubGVzcyBwIGlzIGEgZGVmZXJyZWQgcHJlZml4Lgp9ClxpdGVtIEEgY29uc3RhbnQgY29uc3RydWN0b3IgaW52b2NhdGlvbiAoXHJlZntjb25zdH0pIHRoYXQgaXMgbm90IHF1YWxpZmllZCBieSBhIGRlZmVycmVkIHByZWZpeC4gIApcaXRlbSBBIGNvbnN0YW50IGxpc3QgbGl0ZXJhbCAoXHJlZntsaXN0c30pLgpcaXRlbSBBIGNvbnN0YW50IG1hcCBsaXRlcmFsIChccmVme21hcHN9KS4KXGl0ZW0gQSBzaW1wbGUgb3IgcXVhbGlmaWVkIGlkZW50aWZpZXIgZGVub3RpbmcgYSB0b3AtbGV2ZWwgZnVuY3Rpb24gKFxyZWZ7ZnVuY3Rpb25zfSkgb3IgYSBzdGF0aWMgbWV0aG9kIChccmVme3N0YXRpY01ldGhvZHN9KSB0aGF0IGlzIG5vdCBxdWFsaWZpZWQgYnkgYSBkZWZlcnJlZCBwcmVmaXguClxpdGVtIEEgcGFyZW50aGVzaXplZCBleHByZXNzaW9uIFxjb2RleygkZSQpfSB3aGVyZSAkZSQgaXMgYSBjb25zdGFudCBleHByZXNzaW9uLgpcaXRlbSBBbiBleHByZXNzaW9uIG9mIHRoZSBmb3JtIFxjb2Rle2lkZW50aWNhbCgkZV8xJCwgJGVfMiQpfSB3aGVyZSAkZV8xJCBhbmQgJGVfMiQgYXJlIGNvbnN0YW50IGV4cHJlc3Npb25zICBhbmQgXGNvZGV7aWRlbnRpY2FsKCl9IGlzIHN0YXRpY2FsbHkgYm91bmQgdG8gdGhlIHByZWRlZmluZWQgZGFydCBmdW5jdGlvbiAgIFxjb2Rle2lkZW50aWNhbCgpfSBkaXNjdXNzZWQgYWJvdmUgKFxyZWZ7b2JqZWN0SWRlbnRpdHl9KS4KXGl0ZW0gQW4gZXhwcmVzc2lvbiBvZiBvbmUgb2YgdGhlIGZvcm1zICBcY29kZXskZV8xJCA9PSAkZV8yJH0gb3IgIFxjb2RleyRlXzEkICE9ICRlXzIkfSB3aGVyZSAkZV8xJCBhbmQgJGVfMiQgYXJlIGNvbnN0YW50IGV4cHJlc3Npb25zIHRoYXQgZXZhbHVhdGUgdG8gYSBudW1lcmljLCBzdHJpbmcgb3IgYm9vbGVhbiB2YWx1ZSBvciB0byBcTlVMTHt9LgpcaXRlbSBBbiBleHByZXNzaW9uIG9mIG9uZSBvZiB0aGUgZm9ybXMgXGNvZGV7ISRlJH0sIFxjb2RleyRlXzEkIFwmXCYgJGVfMiR9IG9yIFxjb2RleyRlXzEgfHwgZV8yJH0sIHdoZXJlICAkZSQsICRlXzEkIGFuZCAkZV8yJCBhcmUgY29uc3RhbnQgZXhwcmVzc2lvbnMgdGhhdCBldmFsdWF0ZSB0byBhIGJvb2xlYW4gdmFsdWUuClxpdGVtIEFuIGV4cHJlc3Npb24gb2Ygb25lIG9mIHRoZSBmb3JtcyBcfnt9JGUkLCAkZV8xJCBcXnt9ICRlXzIkLCBcY29kZXskZV8xJCBcJiAkZV8yJH0sICRlXzEgfCBlXzIkLCAkZV8xID4+IGVfMiQgb3IgJGVfMSA8PCAgZV8yJCwgd2hlcmUgICRlJCwgJGVfMSQgYW5kICRlXzIkIGFyZSBjb25zdGFudCBleHByZXNzaW9ucyB0aGF0IGV2YWx1YXRlIHRvIGFuIGludGVnZXIgdmFsdWUgIG9yIHRvIFxOVUxMe30uClxpdGVtIEFuIGV4cHJlc3Npb24gb2Ygb25lIG9mIHRoZSBmb3JtcyBcY29kZXskLWUkfSwgIFxjb2RleyRlXzEgKyBlXzIkfSwgXGNvZGV7JGVfMSQgLSAkZV8yJH0sIFxjb2RleyRlXzEkICogJGVfMiR9LCBcY29kZXskZV8xJCAvICRlXzIkLH0gXGNvZGV7JGVfMSQgXH57fS8gJGVfMiR9LCAgXGNvZGV7JGVfMSAgPiAgZV8yJH0sIFxjb2RleyRlXzEgIDwgIGVfMiR9LCBcY29kZXskZV8xJCAkPiQ9ICRlXzIkfSwgXGNvZGV7JGVfMSQgJDwkPSAkZV8yJH0gb3IgXGNvZGV7JGVfMSQgXCUgJGVfMiR9LCAgd2hlcmUgJGUkLCAkZV8xJCBhbmQgJGVfMiQgYXJlIGNvbnN0YW50IGV4cHJlc3Npb25zIHRoYXQgZXZhbHVhdGUgdG8gYSBudW1lcmljIHZhbHVlICBvciB0byBcTlVMTHt9LgpcaXRlbSBBbiBleHByZXNzaW9uIG9mIHRoZSBmb3JtIFxjb2RleyRlXzEkPyRlXzIkOiRlMyR9IHdoZXJlIHdoZXJlICRlXzEkLCAkZV8yJCBhbmQgJGVfMyQgYXJlIGNvbnN0YW50IGV4cHJlc3Npb25zIGFuZCAkZV8xJCBldmFsdWF0ZXMgdG8gYSBib29sZWFuIHZhbHVlLgpcZW5ke2l0ZW1pemV9CgolIG51bGwgaW4gYWxsIHRoZSBleHByZXNzaW9ucwoKJSBkZXNpZ25lZCBzbyBjb25zdGFudHMgZG8gbm90IGRlcGVuZCBvbiBjaGVjayBkaW9kZSBiZWluZyBvbiBvciBub3QuCgpJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBhbiBleHByZXNzaW9uIGlzIHJlcXVpcmVkIHRvIGJlIGEgY29uc3RhbnQgZXhwcmVzc2lvbiBidXQgaXRzIGV2YWx1YXRpb24gIHdvdWxkIHJhaXNlIGFuIGV4Y2VwdGlvbi4gCgolIHNvLCBjaGVja2VkIG1vZGU/IGFuYWx5emVycz8gZWRpdG9yL2RldmVsb3BtZW50IGNvbXBpbGVycz8KXGNvbW1lbnRhcnl7Ck5vdGUgdGhhdCB0aGVyZSBpcyBubyByZXF1aXJlbWVudCB0aGF0IGV2ZXJ5IGNvbnN0YW50IGV4cHJlc3Npb24gZXZhbHVhdGUgY29ycmVjdGx5LiBPbmx5IHdoZW4gYSBjb25zdGFudCBleHByZXNzaW9uIGlzIHJlcXVpcmVkIChlLmcuLCB0byBpbml0aWFsaXplIGEgY29uc3RhbnQgdmFyaWFibGUsIG9yIGFzIGEgZGVmYXVsdCB2YWx1ZSBvZiBhIGZvcm1hbCBwYXJhbWV0ZXIsIG9yIGFzIG1ldGFkYXRhKSBkbyB3ZSBpbnNpc3QgdGhhdCBhIGNvbnN0YW50IGV4cHJlc3Npb24gYWN0dWFsbHkgYmUgZXZhbHVhdGVkIHN1Y2Nlc3NmdWxseSBhdCBjb21waWxlIHRpbWUuCgpUaGUgYWJvdmUgaXMgbm90IGRlcGVuZGVudCBvbiBwcm9ncmFtIGNvbnRyb2wtZmxvdy4gVGhlIG1lcmUgcHJlc2VuY2Ugb2YgYSByZXF1aXJlZCBjb21waWxlIHRpbWUgY29uc3RhbnQgd2hvc2UgZXZhbHVhdGlvbiB3b3VsZCBmYWlsIHdpdGhpbiBhIHByb2dyYW0gaXMgYW4gZXJyb3IuICBUaGlzIGFsc28gaG9sZHMgcmVjdXJzaXZlbHk6IHNpbmNlIGNvbXBvdW5kIGNvbnN0YW50cyBhcmUgY29tcG9zZWQgb3V0IG9mIGNvbnN0YW50cywgaWYgYW55IHN1YnBhcnQgb2YgYSBjb25zdGFudCAgd291bGQgcmFpc2UgYW4gZXhjZXB0aW9uIHdoZW4gZXZhbHVhdGVkLCB0aGF0IGlzIGFuIGVycm9yLgoKT24gdGhlIG90aGVyIGhhbmQsIHNpbmNlIGltcGxlbWVudGF0aW9ucyBhcmUgZnJlZSB0byBjb21waWxlIGNvZGUgbGF0ZSwgc29tZSBjb21waWxlLXRpbWUgZXJyb3JzIG1heSBtYW5pZmVzdCBxdWl0ZSBsYXRlLgp9CgpcYmVnaW57ZGFydENvZGV9ClxDT05TVHt9IHggPSAxLzA7ClxGSU5BTHt9IHkgPSAxLzA7CgpcQ0xBU1N7fSBLIFx7CiAgbTEoKSBcewogICBcVkFSe30geiA9IFxGQUxTRXt9OwogICAgXElGe30gKHopIFx7XFJFVFVSTnt9IHg7IFx9CiAgICBcRUxTRXt9IFx7IFxSRVRVUk57fSAyO1x9CiAgXH0KICAKICBtMigpIFx7CiAgICBcSUZ7fSAoXFRSVUV7fSkgXHtcUkVUVVJOe30geTsgXH0KICAgIFxFTFNFe30gXHsgXFJFVFVSTnt9IDM7XH0KICBcfSAgClx9ClxlbmR7ZGFydENvZGV9CgpcY29tbWVudGFyeXtBbiBpbXBsZW1lbnRhdGlvbiBpcyBmcmVlIHRvIGltbWVkaWF0ZWx5IGlzc3VlIGEgY29tcGlsYXRpb24gZXJyb3IgZm9yICBcY29kZXt4fSwgYnV0IGl0IGlzIG5vdCByZXF1aXJlZCB0byBkbyBzby4gIEl0IGNvdWxkIGRlZmVyIGVycm9ycyBpZiBpdCBkb2VzIG5vdCBpbW1lZGlhdGVseSBjb21waWxlIHRoZSBkZWNsYXJhdGlvbnMgdGhhdCByZWZlcmVuY2UgXGNvZGV7eH0uIEZvciBleGFtcGxlLCBpdCBjb3VsZCBkZWxheSBnaXZpbmcgYSBjb21waWxhdGlvbiBlcnJvciBhYm91dCB0aGUgbWV0aG9kIFxjb2Rle20xfSB1bnRpbCB0aGUgZmlyc3QgaW52b2NhdGlvbiBvZiBcY29kZXttMX0uIEhvd2V2ZXIsIGl0IGNvdWxkIG5vdCBjaG9vc2UgdG8gZXhlY3V0ZSBcY29kZXttMX0sICBzZWUgdGhhdCB0aGUgYnJhbmNoIHRoYXQgcmVmZXJzIHRvIFxjb2Rle3h9IGlzIG5vdCB0YWtlbiBhbmQgcmV0dXJuIDIgc3VjY2Vzc2Z1bGx5LiAKClRoZSBzaXR1YXRpb24gd2l0aCByZXNwZWN0IHRvIGFuIGludm9jYXRpb24gXGNvZGV7bTJ9IGlzIGRpZmZlcmVudC4gQmVjYXVzZSBcY29kZXt5fSBpcyBub3QgYSBjb21waWxlLXRpbWUgY29uc3RhbnQgKGV2ZW4gdGhvdWdoIGl0cyB2YWx1ZSBpcyksIG9uZSBuZWVkIG5vdCBnaXZlIGEgY29tcGlsZS10aW1lIGVycm9yIHVwb24gY29tcGlsaW5nIFxjb2Rle20yfS4gQW4gaW1wbGVtZW50YXRpb24gbWF5IHJ1biB0aGUgY29kZSwgd2hpY2ggd2lsbCBjYXVzZSAgdGhlIGdldHRlciBmb3IgXGNvZGV7eX0gdG8gYmUgaW52b2tlZC4gQXQgdGhhdCBwb2ludCwgdGhlIGluaXRpYWxpemF0aW9uIG9mIFxjb2Rle3l9IG11c3QgdGFrZSBwbGFjZSwgd2hpY2ggcmVxdWlyZXMgdGhlIGluaXRpYWxpemVyIHRvIGJlIGNvbXBpbGVkLCB3aGljaCB3aWxsIGNhdXNlIGEgY29tcGlsYXRpb24gZXJyb3IuCn0KClxyYXRpb25hbGV7ClRoZSB0cmVhdG1lbnQgb2YgXE5VTEx7fSBtZXJpdHMgc29tZSBkaXNjdXNzaW9uLiBDb25zaWRlciBcY29kZXtcTlVMTHt9ICsgMn0uICBUaGlzIGV4cHJlc3Npb24gYWx3YXlzIGNhdXNlcyBhbiBlcnJvci4gV2UgY291bGQgaGF2ZSBjaG9zZW4gbm90IHRvIHRyZWF0IGl0IGFzIGEgY29uc3RhbnQgZXhwcmVzc2lvbiAoYW5kIGluIGdlbmVyYWwsIG5vdCB0byBhbGxvdyBcTlVMTHt9IGFzIGEgc3ViZXhwcmVzc2lvbiBvZiBudW1lcmljIG9yIGJvb2xlYW4gY29uc3RhbnQgZXhwcmVzc2lvbnMpLiAgVGhlcmUgYXJlIHR3byBhcmd1bWVudHMgZm9yIGluY2x1ZGluZyBpdDoKXGJlZ2lue2VudW1lcmF0ZX0KXGl0ZW0gSXQgaXMgY29uc3RhbnQuIFdlIGNhbiBldmFsdWF0ZSBpdCBhdCBjb21waWxlLXRpbWUuIApcaXRlbSBJdCBzZWVtcyBtb3JlIHVzZWZ1bCB0byBnaXZlIHRoZSBlcnJvciBzdGVtbWluZyBmcm9tIHRoZSBldmFsdWF0aW9uIGV4cGxpY2l0bHkuClxlbmR7ZW51bWVyYXRlfQp9CgpJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiB0aGUgdmFsdWUgb2YgYSBjb21waWxlLXRpbWUgY29uc3RhbnQgZXhwcmVzc2lvbiBkZXBlbmRzIG9uIGl0c2VsZi4KClxjb21tZW50YXJ5ewpBcyBhbiBleGFtcGxlLCBjb25zaWRlcjoKfQoKXGJlZ2lue2RhcnRDb2RlfQpcQ0xBU1N7fSBDaXJjdWxhckNvbnN0c1x7IAovLyBJbGxlZ2FsIHByb2dyYW0gLSBtdXR1YWxseSByZWN1cnNpdmUgY29tcGlsZS10aW1lIGNvbnN0YW50cwogIFxTVEFUSUN7fSBcQ09OU1R7fSBpID0gajsgLy8gYSBjb21waWxlLXRpbWUgY29uc3RhbnQKICBcU1RBVElDe30gXENPTlNUe30gaiA9IGk7IC8vIGEgY29tcGlsZS10aW1lIGNvbnN0YW50Clx9ClxlbmR7ZGFydENvZGV9CgoKXGJlZ2lue2dyYW1tYXJ9CntcYmYgbGl0ZXJhbDp9bnVsbExpdGVyYWw7CiAgICAgIGJvb2xlYW5MaXRlcmFsOwogICAgICBudW1lcmljTGl0ZXJhbDsKICAgICAgc3RyaW5nTGl0ZXJhbDsKICAgICAgc3ltYm9sTGl0ZXJhbDsKICAgICAgbWFwTGl0ZXJhbDsKICAgICAgbGlzdExpdGVyYWwKICAgIC4KIFxlbmR7Z3JhbW1hcn0KCgoKXHN1YnNlY3Rpb257TnVsbH0KXGxhYmVse251bGx9CgpUaGUgcmVzZXJ2ZWQgd29yZCBcTlVMTHt9IGRlbm90ZXMgdGhlIHtcZW0gbnVsbCBvYmplY3R9LgolXFF7QW55IG1ldGhvZHMsIHN1Y2ggYXMgXGNvZGV7aXNOdWxsfT99CgpcYmVnaW57Z3JhbW1hcn0Ke1xiZiBudWxsTGl0ZXJhbDp9CiAgICAgIFxOVUxMe30KLgpcZW5ke2dyYW1tYXJ9CgpUaGUgbnVsbCBvYmplY3QgaXMgdGhlIHNvbGUgaW5zdGFuY2Ugb2YgdGhlIGJ1aWx0LWluIGNsYXNzIFxjb2Rle051bGx9LiBBdHRlbXB0aW5nIHRvIGluc3RhbnRpYXRlIFxjb2Rle051bGx9IGNhdXNlcyBhIHJ1bi10aW1lIGVycm9yLiBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBmb3IgYSBjbGFzcyB0byBhdHRlbXB0IHRvIGV4dGVuZCBvciBpbXBsZW1lbnQgXGNvZGV7TnVsbH0uIApJbnZva2luZyBhIG1ldGhvZCBvbiBcTlVMTHt9ICB5aWVsZHMgYSBcY29kZXtOb1N1Y2hNZXRob2RFcnJvcn0gdW5sZXNzIHRoZSBtZXRob2QgaXMgZXhwbGljaXRseSBpbXBsZW1lbnRlZCBieSBjbGFzcyBcY29kZXtOdWxsfS4KClRoZSBzdGF0aWMgdHlwZSBvZiBcTlVMTHt9IGlzICRcYm90JC4KClxyYXRpb25hbGV7VGhlIGRlY2lzaW9uIHRvIHVzZSAkXGJvdCQgaW5zdGVhZCBvZiBcY29kZXtOdWxsfSBhbGxvd3MgXE5VTEx7fSB0byBiZSBiZSBhc3NpZ25lZCBldmVyeXdoZXJlIHdpdGhvdXQgY29tcGxhaW50IGJ5IHRoZSBzdGF0aWMgY2hlY2tlci4gCn0KCgpcc3Vic2VjdGlvbntOdW1iZXJzfQpcbGFiZWx7bnVtYmVyc30KCkEge1xlbSBudW1lcmljIGxpdGVyYWx9IGlzIGVpdGhlciBhIGRlY2ltYWwgb3IgaGV4YWRlY2ltYWwgaW50ZWdlciBvZiBhcmJpdHJhcnkgc2l6ZSwgb3IgYSBkZWNpbWFsIGRvdWJsZS4KClxiZWdpbntncmFtbWFyfQp7XGJmIG51bWVyaWNMaXRlcmFsOn1OVU1CRVI7CiAgICAgIEhFWFxfTlVNQkVSCiAgICAuCiAgICAKICB7XGJmIE5VTUJFUjp9IERJR0lUKyAoYHtcZXNjYXBlZ3JhbW1hci59JyBESUdJVCspPyBFWFBPTkVOVD87CiAgICAgIHtgXGVzY2FwZWdyYW1tYXIgLn0nIERJR0lUKyBFWFBPTkVOVD8KICAgIC4KCntcYmYgIEVYUE9ORU5UOn0KICAgICAgKGBlJyAkfCQgYEUnKSAoJysnICR8JCBgLWApPyBESUdJVCsKICAgIC4KCntcYmYgSEVYXF9OVU1CRVI6fWAweCcgSEVYXF9ESUdJVCs7CiAgICAgIGAwWCcgSEVYXF9ESUdJVCsKICAgIC4KCiB7XGJmIEhFWFxfRElHSVQ6fWBhJ3tcZXNjYXBlZ3JhbW1hciAuLn0nZic7CiAgICAgIGBBJ3tcZXNjYXBlZ3JhbW1hciAuLn0nRic7CiAgICAgIERJR0lUCiAgICAuCiBcZW5ke2dyYW1tYXJ9CiAKSWYgYSBudW1lcmljIGxpdGVyYWwgYmVnaW5zIHdpdGggdGhlIHByZWZpeCBgMHgnIG9yIGAwWCcsIGl0IGRlbm90ZXMgdGhlIGhleGFkZWNpbWFsIGludGVnZXIgcmVwcmVzZW50ZWQgYnkgdGhlIHBhcnQgb2YgdGhlIGxpdGVyYWwgZm9sbG93aW5nIGAweCcgKHJlc3BlY3RpdmVseSBgMFgnKS4gT3RoZXJ3aXNlLCBpZiB0aGUgbnVtZXJpYyBsaXRlcmFsIGRvZXMgbm90IGluY2x1ZGUgYSBkZWNpbWFsIHBvaW50ICBpdCBkZW5vdGVzIGEgZGVjaW1hbCBpbnRlZ2VyLiAgT3RoZXJ3aXNlLCB0aGUgbnVtZXJpYyBsaXRlcmFsICBkZW5vdGVzIGEgNjQgYml0IGRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGFzIHNwZWNpZmllZCBieSB0aGUgSUVFRSA3NTQgc3RhbmRhcmQuIAoKSW4gcHJpbmNpcGxlLCB0aGUgcmFuZ2Ugb2YgaW50ZWdlcnMgc3VwcG9ydGVkIGJ5IGEgRGFydCBpbXBsZW1lbnRhdGlvbnMgaXMgdW5saW1pdGVkLiBJbiBwcmFjdGljZSwgaXQgaXMgbGltaXRlZCBieSBhdmFpbGFibGUgbWVtb3J5LiBJbXBsZW1lbnRhdGlvbnMgbWF5IGFsc28gYmUgbGltaXRlZCBieSBvdGhlciBjb25zaWRlcmF0aW9ucy4KClxjb21tZW50YXJ5ewpGb3IgZXhhbXBsZSwgaW1wbGVtZW50YXRpb25zIG1heSBjaG9vc2UgdG8gbGltaXQgdGhlIHJhbmdlIHRvIGZhY2lsaXRhdGUgZWZmaWNpZW50IGNvbXBpbGF0aW9uIHRvIEphdmFzY3JpcHQuIFRoZXNlIGxpbWl0YXRpb25zIHNob3VsZCBiZSByZWxheGVkIGFzIHNvb24gYXMgdGVjaG5vbG9naWNhbGx5IGZlYXNpYmxlLgp9CgpJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBmb3IgYSBjbGFzcyB0byBhdHRlbXB0IHRvIGV4dGVuZCBvciBpbXBsZW1lbnQgXGNvZGV7aW50fS4gSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgZm9yIGEgY2xhc3MgdG8gYXR0ZW1wdCB0byBleHRlbmQgb3IgaW1wbGVtZW50IFxjb2Rle2RvdWJsZX0uIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGZvciBhbnkgdHlwZSBvdGhlciB0aGFuIHRoZSB0eXBlcyBcY29kZXtpbnR9IGFuZCBcY29kZXtkb3VibGV9IHRvIGF0dGVtcHQgdG8gZXh0ZW5kIG9yIGltcGxlbWVudCBcY29kZXtudW19LgoKQW4ge1xlbSBpbnRlZ2VyIGxpdGVyYWx9IGlzIGVpdGhlciBhIGhleGFkZWNpbWFsIGludGVnZXIgbGl0ZXJhbCBvciBhICBkZWNpbWFsIGludGVnZXIgbGl0ZXJhbC4gSW52b2tpbmcgdGhlIGdldHRlciBcY29kZXtydW50aW1lVHlwZX0gb24gYW4gaW50ZWdlciBsaXRlcmFsIHJldHVybnMgdGhlIFxjb2Rle1R5cGV9IG9iamVjdCB0aGF0IGlzIHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbiBcY29kZXtpbnR9LiBUaGUgc3RhdGljIHR5cGUgb2YgYW4gaW50ZWdlciBsaXRlcmFsIGlzIFxjb2Rle2ludH0uIAoKQSB7XGVtIGxpdGVyYWwgZG91YmxlfSBpcyBhIG51bWVyaWMgbGl0ZXJhbCB0aGF0IGlzIG5vdCBhbiBpbnRlZ2VyIGxpdGVyYWwuIEludm9raW5nIHRoZSBnZXR0ZXIgXGNvZGV7cnVudGltZVR5cGV9IG9uIGEgbGl0ZXJhbCBkb3VibGUgcmV0dXJucyB0aGUgXGNvZGV7VHlwZX0gb2JqZWN0IHRoYXQgaXMgdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uIFxjb2Rle2RvdWJsZX0uClRoZSBzdGF0aWMgdHlwZSBvZiBhIGxpdGVyYWwgZG91YmxlIGlzIFxjb2Rle2RvdWJsZX0uCiAgICAKXHN1YnNlY3Rpb257Qm9vbGVhbnN9ClxsYWJlbHtib29sZWFuc30KClRoZSByZXNlcnZlZCB3b3JkcyBcVFJVRXt9IGFuZCBcRkFMU0V7fSBkZW5vdGUgb2JqZWN0cyB0aGF0IHJlcHJlc2VudCB0aGUgYm9vbGVhbiB2YWx1ZXMgdHJ1ZSBhbmQgZmFsc2UgcmVzcGVjdGl2ZWx5LiBUaGV5IGFyZSB0aGUge1xlbSBib29sZWFuIGxpdGVyYWxzfS4KClxiZWdpbntncmFtbWFyfQp7XGJmIGJvb2xlYW5MaXRlcmFsOn1cVFJVRXt9OwogICAgICAgIFxGQUxTRXt9CiAgICAuClxlbmR7Z3JhbW1hcn0KCkJvdGggIFxUUlVFe30gYW5kIFxGQUxTRXt9IGltcGxlbWVudCB0aGUgYnVpbHQtaW4gY2xhc3MgXGNvZGV7Ym9vbH0uICBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBmb3IgYSBjbGFzcyB0byBhdHRlbXB0IHRvIGV4dGVuZCBvciBpbXBsZW1lbnRcY29kZXsgYm9vbH0uIAoKXGNvbW1lbnRhcnl7Ckl0IGZvbGxvd3MgdGhhdCB0aGUgdHdvIGJvb2xlYW4gbGl0ZXJhbHMgYXJlIHRoZSBvbmx5IHR3byBpbnN0YW5jZXMgb2YgXGNvZGV7Ym9vbH0uIAp9CgpJbnZva2luZyB0aGUgZ2V0dGVyIFxjb2Rle3J1bnRpbWVUeXBlfSBvbiBhIGJvb2xlYW4gbGl0ZXJhbCByZXR1cm5zIHRoZSBcY29kZXtUeXBlfSBvYmplY3QgdGhhdCBpcyB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gXGNvZGV7Ym9vbH0uIFRoZSBzdGF0aWMgdHlwZSBvZiBhIGJvb2xlYW4gbGl0ZXJhbCBpcyBcY29kZXtib29sfS4KClxzdWJzdWJzZWN0aW9ue0Jvb2xlYW4gQ29udmVyc2lvbn0KXGxhYmVse2Jvb2xlYW5Db252ZXJzaW9ufQoKe1xlbSBCb29sZWFuIGNvbnZlcnNpb259IG1hcHMgYW55IG9iamVjdCAkbyQgaW50byBhIGJvb2xlYW4uIEJvb2xlYW4gY29udmVyc2lvbiBpcyAgZGVmaW5lZCBieSB0aGUgZnVuY3Rpb24gYXBwbGljYXRpb24KClxiZWdpbntkYXJ0Q29kZX0KKGJvb2wgdilcewogICAgICAgICBcQVNTRVJUe30odiAhPSBcTlVMTHt9KTsKJQlcSUZ7fSAoXE5VTEx7fSA9PSB2KSBceyBcVEhST1d7fSBcTkVXe30gQXNzZXJ0aW9uRXJyb3IoJ251bGwgaXMgbm90IGEgYm9vbCcpXH07CiAgICAgICAgIFxSRVRVUk57fSBpZGVudGljYWwodiwgXFRSVUV7fSk7Clx9KG8pClxlbmR7ZGFydENvZGV9CgpccmF0aW9uYWxlewpCb29sZWFuIGNvbnZlcnNpb24gaXMgdXNlZCBhcyBwYXJ0IG9mIGNvbnRyb2wtZmxvdyBjb25zdHJ1Y3RzIGFuZCBib29sZWFuIGV4cHJlc3Npb25zLiAgSWRlYWxseSwgb25lIHdvdWxkIHNpbXBseSBpbnNpc3QgdGhhdCBjb250cm9sLWZsb3cgZGVjaXNpb25zIGJlIGJhc2VkIGV4Y2x1c2l2ZWx5IG9uIGJvb2xlYW5zLiAgVGhpcyBpcyBzdHJhaWdodGZvcndhcmQgaW4gYSBzdGF0aWNhbGx5IHR5cGVkIHNldHRpbmcuIEluIGEgZHluYW1pY2FsbHkgdHlwZWQgbGFuZ3VhZ2UsIGl0IHJlcXVpcmVzIGEgZHluYW1pYyBjaGVjay4gU29waGlzdGljYXRlZCB2aXJ0dWFsIG1hY2hpbmVzIGNhbiBtaW5pbWl6ZSB0aGUgcGVuYWx0eSBpbnZvbHZlZC4gQWxhcywgRGFydCBtdXN0IGJlIGNvbXBpbGVkIGludG8gSmF2YXNjcmlwdC4gQm9vbGVhbiBjb252ZXJzaW9uIGFsbG93cyB0aGlzIHRvIGJlIGRvbmUgZWZmaWNpZW50bHkuIAoKQXQgdGhlIHNhbWUgdGltZSwgdGhpcyBmb3JtdWxhdGlvbiBkaWZmZXJzIHJhZGljYWxseSBmcm9tIEphdmFzY3JpcHQsIHdoZXJlIG1vc3QgbnVtYmVycyBhbmQgb2JqZWN0cyBhcmUgaW50ZXJwcmV0ZWQgYXMgXFRSVUV7fS4gIERhcnQncyBhcHByb2FjaCBwcmV2ZW50cyB1c2FnZXMgc3VjaCBcY29kZXtcSUZ7fSAoYS1iKSAuLi4gOyB9YmVjYXVzZSBpdCBkb2VzIG5vdCBhZ3JlZSB3aXRoIHRoZSBsb3cgbGV2ZWwgY29udmVudGlvbnMgd2hlcmVieSBub24tbnVsbCBvYmplY3RzIG9yIG5vbi16ZXJvIG51bWJlcnMgYXJlIHRyZWF0ZWQgYXMgXFRSVUV7fS4gSW5kZWVkLCB0aGVyZSBpcyBubyB3YXkgdG8gZGVyaXZlIFxUUlVFe30gZnJvbSBhIG5vbi1ib29sZWFuIG9iamVjdCB2aWEgYm9vbGVhbiBjb252ZXJzaW9uLCBzbyB0aGlzIGtpbmQgb2YgbG93IGxldmVsIGhhY2tlcnkgaXMgbmlwcGVkIGluIHRoZSBidWQuCgpEYXJ0IGFsc28gYXZvaWRzIHRoZSBzdHJhbmdlIGJlaGF2aW9ycyB0aGF0IGNhbiBhcmlzZSBkdWUgdG8gdGhlIGludGVyYWN0aW9uIG9mIGJvb2xlYW4gY29udmVyc2lvbiB3aXRoIGF1dG9ib3hpbmcgaW4gSmF2YXNjcmlwdC4gQSBub3RvcmlvdXMgZXhhbXBsZSBpcyB0aGUgc2l0dWF0aW9uIHdoZXJlIFxGQUxTRXt9IGNhbiBiZSBpbnRlcnByZXRlZCBhcyBcVFJVRXt9LiBJbiBKYXZhc2NyaXB0LCBib29sZWFucyBhcmUgbm90IG9iamVjdHMsIGFuZCBpbnN0ZWFkIGFyZSBhdXRvYm94ZWQgaW50byBvYmplY3RzIHdoZXJlIGBgbmVlZGVkJycuICBJZiBcRkFMU0V7fSBnZXRzIGF1dG9ib3hlZCBpbnRvIGFuIG9iamVjdCwgdGhhdCBvYmplY3QgY2FuIGJlIGNvZXJjZWQgaW50byBcVFJVRXt9IChhcyBpdCBpcyBhIG5vbi1udWxsIG9iamVjdCkuIAp9CgpcY29tbWVudGFyeXtCZWNhdXNlIGJvb2xlYW4gY29udmVyc2lvbiByZXF1aXJlcyBpdHMgcGFyYW1ldGVyIHRvIGJlIGEgYm9vbGVhbiwgYW55IGNvbnN0cnVjdCB0aGF0IG1ha2VzIHVzZSBvZiBib29sZWFuIGNvbnZlcnNpb24gd2lsbCBjYXVzZSBhIGR5bmFtaWMgdHlwZSBlcnJvciBpbiBjaGVja2VkIG1vZGUgaWYgdGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZCBpcyBub3QgYSBib29sZWFuLgogfQogICAgClxzdWJzZWN0aW9ue1N0cmluZ3N9ClxsYWJlbHtzdHJpbmdzfQoKQSB7XGVtIHN0cmluZ30gaXMgYSBzZXF1ZW5jZSBvZiBVVEYtMTYgY29kZSB1bml0cy4gCgpccmF0aW9uYWxlewpUaGlzIGRlY2lzaW9uIHdhcyBtYWRlIGZvciBjb21wYXRpYmlsaXR5IHdpdGggd2ViIGJyb3dzZXJzIGFuZCBKYXZhc2NyaXB0LiBFYXJsaWVyIHZlcnNpb25zIG9mIHRoZSBzcGVjaWZpY2F0aW9uIHJlcXVpcmVkIGEgc3RyaW5nIHRvIGJlIGEgc2VxdWVuY2Ugb2YgdmFsaWQgVW5pY29kZSBjb2RlIHBvaW50cy4gIFByb2dyYW1tZXJzIHNob3VsZCBub3QgZGVwZW5kIG9uIHRoaXMgZGlzdGluY3Rpb24uCn0KClxiZWdpbntncmFtbWFyfQp7XGJmIHN0cmluZ0xpdGVyYWw6fShtdWx0aWxpbmVTdHJpbmcgJHwkIHNpbmdsZUxpbmVTdHJpbmcpKwogICAgLgpcZW5ke2dyYW1tYXJ9CgpBIHN0cmluZyBjYW4gYmUgZWl0aGVyIGEgc2VxdWVuY2Ugb2Ygc2luZ2xlIGxpbmUgc3RyaW5ncyBvciBhIG11bHRpbGluZSBzdHJpbmcuIAoKXGJlZ2lue2dyYW1tYXJ9CiB7XGJmIHNpbmdsZUxpbmVTdHJpbmc6fWB7XGVzY2FwZWdyYW1tYXIgXGNvZGV7In19JyBzdHJpbmdDb250ZW50RFEqIGB7XGVzY2FwZWdyYW1tYXIgXGNvZGV7In19JzsKICAgICAgIGB7XGVzY2FwZWdyYW1tYXIgXGNvZGV7J319JyBzdHJpbmdDb250ZW50U1EqIGB7XGVzY2FwZWdyYW1tYXIgXGNvZGV7J319JzsKICAgICAgYHInIGB7XGVzY2FwZWdyYW1tYXIgXGNvZGV7J319JyAoXH57fSggYHtcZXNjYXBlZ3JhbW1hciBcY29kZXsnfX0nICR8JCBORVdMSU5FICkpKiBge1xlc2NhcGVncmFtbWFyIFxjb2Rleyd9fSc7CiAgICAgIGByJyBge1xlc2NhcGVncmFtbWFyIFxjb2RleyJ9fScgKFx+e30oIGB7XGVzY2FwZWdyYW1tYXIgXGNvZGV7In19JyAkfCQgTkVXTElORSApKSogYHtcZXNjYXBlZ3JhbW1hciBcY29kZXsifX0nCiAgICAuClxlbmR7Z3JhbW1hcn0KCkEgc2luZ2xlIGxpbmUgc3RyaW5nIGlzIGRlbGltaXRlZCBieSBlaXRoZXIgbWF0Y2hpbmcgc2luZ2xlIHF1b3RlcyBvciBtYXRjaGluZyBkb3VibGUgcXVvdGVzLiAgCgpcY29tbWVudGFyeXsKSGVuY2UsIGBhYmMnIGFuZCBgYGFiYycnIGFyZSBib3RoIGxlZ2FsIHN0cmluZ3MsIGFzIGFyZSBgSGUgc2FpZCBgYFRvIGJlIG9yIG5vdCB0byBiZScnIGRpZCBoZSBub3Q/JyAgYW5kIGBgSGUgc2FpZCBgVG8gYmUgb3Igbm90IHRvIGJlJyBkaWRuJ3QgaGUnJy4gSG93ZXZlciAgYGBUaGlzIGAgaXMgbm90IGEgdmFsaWQgc3RyaW5nLCBub3IgaXMgYHRoaXMnJy4KfQoKXGNvbW1lbnRhcnl7VGhlIGdyYW1tYXIgZW5zdXJlcyB0aGF0IGEgc2luZ2xlIGxpbmUgc3RyaW5nIGNhbm5vdCBzcGFuIG1vcmUgdGhhbiBvbmUgbGluZSBvZiBzb3VyY2UgY29kZSwgdW5sZXNzIGl0IGluY2x1ZGVzIGFuIGludGVycG9sYXRlZCBleHByZXNzaW9uIHRoYXQgc3BhbnMgbXVsdGlwbGUgbGluZXMuCn0KCkFkamFjZW50IAolc2luZ2xlIGxpbmUgCnN0cmluZ3MgYXJlIGltcGxpY2l0bHkgY29uY2F0ZW5hdGVkIHRvIGZvcm0gYSBzaW5nbGUgc3RyaW5nIGxpdGVyYWwuCiUsIGFuZCBzbyBhcmUgYWRqYWNlbnQgbXVsdGlsaW5lIHN0cmluZ3MsIGJ1dCB0aGUgdHdvIGZvcm1zIG1heSBub3QgYmUgbWl4ZWQuCgoKXGNvbW1lbnRhcnl7SGVyZSBpcyBhbiBleGFtcGxlfQoKXGJlZ2lue2RhcnRDb2RlfQpwcmludCgiQSBzdHJpbmciICJhbmQgdGhlbiBhbm90aGVyIik7IC8vIHByaW50czogQSBzdHJpbmdhbmQgdGhlbiBhbm90aGVyClxlbmR7ZGFydENvZGV9CgpccmF0aW9uYWxle0RhcnQgYWxzbyBzdXBwb3J0cyB0aGUgb3BlcmF0b3IgKyBmb3Igc3RyaW5nIGNvbmNhdGVuYXRpb24uIAoKVGhlICsgb3BlcmF0b3Igb24gU3RyaW5ncyByZXF1aXJlcyBhIFN0cmluZyBhcmd1bWVudC4gSXQgZG9lcyBub3QgY29lcmNlIGl0cyBhcmd1bWVudCBpbnRvIGEgc3RyaW5nLiBUaGlzIGhlbHBzIGF2b2lkIHB1enpsZXJzIHN1Y2ggYXMKfQoKXGJlZ2lue2RhcnRDb2RlfQpwcmludCgiQSBzaW1wbGUgc3VtOiAyICsgMiA9ICIgKwogICAgICAgICAgICAyICsgMik7ClxlbmR7ZGFydENvZGV9CgpccmF0aW9uYWxleyB3aGljaCB0aGlzIHByaW50cyAgJ0Egc2ltcGxlIHN1bTogMiArIDIgPSAyMicgcmF0aGVyIHRoYW4gJ0Egc2ltcGxlIHN1bTogMiArIDIgPSA0Jy4KSG93ZXZlciwgdGhlIHVzZSB0aGUgY29uY2F0ZW5hdGlvbiBvcGVyYXRpb24gaXMgc3RpbGwgIGRpc2NvdXJhZ2VkIGZvciBlZmZpY2llbmN5IHJlYXNvbnMuIEluc3RlYWQsIHRoZSByZWNvbW1lbmRlZCBEYXJ0IGlkaW9tIGlzIHRvIHVzZSBzdHJpbmcgaW50ZXJwb2xhdGlvbi4KfQoKXGJlZ2lue2RhcnRDb2RlfQpwcmludCgiQSBzaW1wbGUgc3VtOiAyICsgMiA9ICBcJFx7MisyXH0iKTsKXGVuZHtkYXJ0Q29kZX0KCgpccmF0aW9uYWxle1N0cmluZyBpbnRlcnBvbGF0aW9uIHdvcmsgd2VsbCBmb3IgbW9zdCBjYXNlcy4gVGhlIG1haW4gc2l0dWF0aW9uIHdoZXJlIGl0IGlzIG5vdCBmdWxseSBzYXRpc2ZhY3RvcnkgaXMgZm9yIHN0cmluZyBsaXRlcmFscyB0aGF0IGFyZSB0b28gbGFyZ2UgdG8gZml0IG9uIGEgbGluZS4gTXVsdGlsaW5lIHN0cmluZ3MgY2FuIGJlIHVzZWZ1bCwgYnV0IGluIHNvbWUgY2FzZXMsIHdlIHdhbnQgdG8gdmlzdWFsbHkgYWxpZ24gdGhlIGNvZGUuIFRoaXMgY2FuIGJlIGV4cHJlc3NlZCBieSB3cml0aW5nIHNtYWxsZXIgc3RyaW5ncyBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZSwgYXMgc2hvd24gaGVyZTp9CgoKCgpcYmVnaW57ZGFydENvZGV9CidJbWFnaW5lIHRoaXMgaXMgYSB2ZXJ5IGxvbmcgc3RyaW5nIHRoYXQgZG9lcyBub3QgZml0IG9uIGEgbGluZS4gV2hhdCBzaGFsbCB3ZSBkbz8gJwonT2ggd2hhdCBzaGFsbCB3ZSBkbz8gJwonV2Ugc2hhbGwgc3BsaXQgaXQgaW50byBwaWVjZXMgJwonbGlrZSBzbycuClxlbmR7ZGFydENvZGV9CgoKCgoKXGJlZ2lue2dyYW1tYXJ9CiB7XGJmIG11bHRpbGluZVN0cmluZzp9YHtcZXNjYXBlZ3JhbW1hciBcdGV4dHR0eyIiIn19JyBzdHJpbmdDb250ZW50VERRKiAgIGB7XGVzY2FwZWdyYW1tYXIgXHRleHR0dHsiIiJ9fSc7CiAgICAgIGB7XGVzY2FwZWdyYW1tYXIgXGNvZGV7J31cY29kZXsnfVxjb2Rleyd9fScgc3RyaW5nQ29udGVudFRTUSogYHtcZXNjYXBlZ3JhbW1hciBcY29kZXsnfVxjb2Rleyd9XGNvZGV7J319JzsKICAgICAgYHInIGB7XGVzY2FwZWdyYW1tYXIgXHRleHR0dHsiIiJ9fScgIChcfnt9IGB7XGVzY2FwZWdyYW1tYXIgXHRleHR0dHsiIiJ9fScpKiAgIGB7XGVzY2FwZWdyYW1tYXIgXHRleHR0dHsiIiJ9fSc7CiAgICAgIGByJyBge1xlc2NhcGVncmFtbWFyIFxjb2Rleyd9XGNvZGV7J31cY29kZXsnfX0nIChcfnt9IGB7XGVzY2FwZWdyYW1tYXIgXGNvZGV7J31cY29kZXsnfVxjb2Rleyd9fScpKiBge1xlc2NhcGVncmFtbWFyIFxjb2Rleyd9XGNvZGV7J31cY29kZXsnfX0nCiAgICAuCiAgICAKICAgIAogICAge1xiZiBFU0NBUEVcX1NFUVVFTkNFOn0gYCRcYmFja3NsYXNoJCBuJzsKICAgIGAkXGJhY2tzbGFzaCQgcic7CiAgIGAkXGJhY2tzbGFzaCQgZic7CiAgIGAkXGJhY2tzbGFzaCQgYic7CiAgYCRcYmFja3NsYXNoJCB0JzsKICAgYCRcYmFja3NsYXNoJCB2JzsKICBgJFxiYWNrc2xhc2gkIHgnIEhFWFxfRElHSVQgSEVYXF9ESUdJVDsKICAgYCRcYmFja3NsYXNoJCB1JyBIRVhcX0RJR0lUIEhFWFxfRElHSVQgSEVYXF9ESUdJVCBIRVhcX0RJR0lUOwogICBgJFxiYWNrc2xhc2gkIHVceycgSEVYXF9ESUdJVFxfU0VRVUVOQ0UgYFx9JwogIC4KICAKe1xiZiBIRVhcX0RJR0lUXF9TRVFVRU5DRTp9CiAgICAgSEVYXF9ESUdJVCBIRVhcX0RJR0lUPyBIRVhcX0RJR0lUPyBIRVhcX0RJR0lUPyBIRVhcX0RJR0lUPyBIRVhcX0RJR0lUPyAKICAgIC4KICAgClxlbmR7Z3JhbW1hcn0KCk11bHRpbGluZSBzdHJpbmdzIGFyZSBkZWxpbWl0ZWQgYnkgZWl0aGVyIG1hdGNoaW5nIHRyaXBsZXMgb2Ygc2luZ2xlIHF1b3RlcyBvciBtYXRjaGluZyB0cmlwbGVzIG9mIGRvdWJsZSBxdW90ZXMuIElmIHRoZSBmaXJzdCBsaW5lIG9mIGEgbXVsdGlsaW5lIHN0cmluZyBjb25zaXN0cyBzb2xlbHkgb2YgdGhlIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBkZWZpbmVkIGJ5IHRoZSBwcm9kdWN0aW9uIHtcZW0gV0hJVEVTUEFDRX0gIFxyZWZ7bGV4aWNhbFJ1bGVzfSksIHBvc3NpYmx5IHByZWZpeGVkIGJ5ICRcYmFja3NsYXNoJCwgdGhlbiB0aGF0IGxpbmUgaXMgaWdub3JlZCwgaW5jbHVkaW5nIHRoZSBuZXcgbGluZSBhdCBpdHMgZW5kLgoKIAogXHJhdGlvbmFsZXsKIFRoZSBpZGVhIGlzIHRvIGlnbm9yZSB3aGl0ZXNwYWNlLCB3aGVyZSB3aGl0ZXNwYWNlIGlzIGRlZmluZWQgYXMgdGFicywgc3BhY2VzIGFuZCBuZXdsaW5lcy4gVGhlc2UgY2FuIGJlIHJlcHJlc2VudGVkIGRpcmVjdGx5LCBidXQgc2luY2UgZm9yIG1vc3QgY2hhcmFjdGVycyBwcmVmaXhpbmcgYnkgYmFja3NsYXNoIGlzIGFuIGlkZW50aXR5LCB3ZSBhbGxvdyB0aG9zZSBmb3JtcyBhcyB3ZWxsLgogfQoKU3RyaW5ncyBzdXBwb3J0IGVzY2FwZSBzZXF1ZW5jZXMgZm9yIHNwZWNpYWwgY2hhcmFjdGVycy4gVGhlIGVzY2FwZXMgYXJlOgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gICRcYmFja3NsYXNoJG4gZm9yIG5ld2xpbmUsIGVxdWl2YWxlbnQgdG8gJFxiYWNrc2xhc2gkeDBBLgpcaXRlbSAkXGJhY2tzbGFzaCRyIGZvciBjYXJyaWFnZSByZXR1cm4sIGVxdWl2YWxlbnQgdG8gJFxiYWNrc2xhc2gkeDBELgpcaXRlbSAkXGJhY2tzbGFzaCRmIGZvciBmb3JtIGZlZWQsIGVxdWl2YWxlbnQgdG8gJFxiYWNrc2xhc2gkeDBDLgpcaXRlbSAkXGJhY2tzbGFzaCRiIGZvciBiYWNrc3BhY2UsIGVxdWl2YWxlbnQgdG8gJFxiYWNrc2xhc2gkeDA4LgpcaXRlbSAkXGJhY2tzbGFzaCR0IGZvciB0YWIsIGVxdWl2YWxlbnQgdG8gJFxiYWNrc2xhc2gkeDA5LgpcaXRlbSAkXGJhY2tzbGFzaCR2IGZvciB2ZXJ0aWNhbCB0YWIsIGVxdWl2YWxlbnQgdG8gJFxiYWNrc2xhc2gkeDBCClxpdGVtICRcYmFja3NsYXNoJHggJEhFWFxfRElHSVRfMSQgJEhFWFxfRElHSVRfMiQsIGVxdWl2YWxlbnQgdG8gCgokXGJhY2tzbGFzaCR1XHskSEVYXF9ESUdJVF8xJCAkSEVYXF9ESUdJVF8yJFx9LgpcaXRlbSAkXGJhY2tzbGFzaCR1ICRIRVhcX0RJR0lUXzEkICRIRVhcX0RJR0lUXzIkICRIRVhcX0RJR0lUXzMkICRIRVhcX0RJR0lUXzQkLCBlcXVpdmFsZW50IHRvICRcYmFja3NsYXNoJHVceyRIRVhcX0RJR0lUXzEkICRIRVhcX0RJR0lUXzIkICRIRVhcX0RJR0lUXzMkICRIRVhcX0RJR0lUXzQkXH0uClxpdGVtICRcYmFja3NsYXNoJHVceyRIRVhcX0RJR0lUXF9TRVFVRU5DRSRcfSBpcyB0aGUgdW5pY29kZSBzY2FsYXIgdmFsdWUgcmVwcmVzZW50ZWQgYnkgdGhlICRIRVhcX0RJR0lUXF9TRVFVRU5DRSQuIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIHRoZSB2YWx1ZSBvZiB0aGUgJEhFWFxfRElHSVRcX1NFUVVFTkNFJCBpcyBub3QgYSB2YWxpZCB1bmljb2RlIHNjYWxhciB2YWx1ZS4KXGl0ZW0gXCQgaW5kaWNhdGluZyB0aGUgYmVnaW5uaW5nIG9mIGFuIGludGVycG9sYXRlZCBleHByZXNzaW9uLgpcaXRlbSBPdGhlcndpc2UsICRcYmFja3NsYXNoIGskIGluZGljYXRlcyB0aGUgY2hhcmFjdGVyICRrJCBmb3IgYW55ICRrJCBub3QgaW4gJFx7biwgciwgZiwgYiwgdCwgdiwgeCwgdVx9JC4KIFxlbmR7aXRlbWl6ZX0KCkFueSBzdHJpbmcgbWF5IGJlIHByZWZpeGVkIHdpdGggdGhlIGNoYXJhY3RlciBgcicsIGluZGljYXRpbmcgdGhhdCBpdCBpcyBhIHtcZW0gcmF3IHN0cmluZ30sIGluIHdoaWNoIGNhc2Ugbm8gZXNjYXBlcyBvciBpbnRlcnBvbGF0aW9ucyBhcmUgcmVjb2duaXplZC4KCkl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIGEgbm9uLXJhdyBzdHJpbmcgbGl0ZXJhbCBjb250YWlucyBhIGNoYXJhY3RlciBzZXF1ZW5jZSBvZiB0aGUgZm9ybSAkXGJhY2tzbGFzaCR4IHRoYXQgaXMgbm90IGZvbGxvd2VkIGJ5IGEgc2VxdWVuY2Ugb2YgdHdvIGhleGFkZWNpbWFsIGRpZ2l0cy4gSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgYSBub24tcmF3IHN0cmluZyBsaXRlcmFsICBjb250YWlucyBhIGNoYXJhY3RlciBzZXF1ZW5jZSBvZiB0aGUgZm9ybSAkXGJhY2tzbGFzaCR1IHRoYXQgaXMgbm90IGZvbGxvd2VkIGJ5IGVpdGhlciBhIHNlcXVlbmNlIG9mIGZvdXIgaGV4YWRlY2ltYWwgZGlnaXRzLCBvciBieSBjdXJseSBicmFjZSBkZWxpbWl0ZWQgc2VxdWVuY2Ugb2YgaGV4YWRlY2ltYWwgZGlnaXRzLgoKCgpcYmVnaW57Z3JhbW1hcn0KIHtcYmYgc3RyaW5nQ29udGVudERROn1cfnt9KCBgJFxiYWNrc2xhc2gkJyAkfCQgYHtcZXNjYXBlZ3JhbW1hciBcdGV4dHR0eyJ9fScgJHwkIGBcJCcgJHwkIE5FV0xJTkUgKTsKICAgICAgYCRcYmFja3NsYXNoJCcgIFx+e30oIE5FV0xJTkUgKTsKICAgICBzdHJpbmdJbnRlcnBvbGF0aW9uCiAgICAuCgoge1xiZiBzdHJpbmdDb250ZW50U1E6fVx+e30oIGAkXGJhY2tzbGFzaCQnICR8JCBge1xlc2NhcGVncmFtbWFyIFx0ZXh0dHR7J319JyAkfCQgYFwkJyAkfCQgTkVXTElORSApOwogICAgICBgJFxiYWNrc2xhc2gkJyAgXH57fSggTkVXTElORSApOwogICAgIHN0cmluZ0ludGVycG9sYXRpb24KICAgIC4KCiAgICAKIHtcYmYgc3RyaW5nQ29udGVudFREUTp9XH57fSggYCRcYmFja3NsYXNoJCcgJHwkICBge1xlc2NhcGVncmFtbWFyIFx0ZXh0dHR7IiIifX0nICR8JCBgXCQnKTsKICAgICBzdHJpbmdJbnRlcnBvbGF0aW9uCiAgICAuICAgIAoKIHtcYmYgc3RyaW5nQ29udGVudFRTUTp9XH57fSggYCRcYmFja3NsYXNoJCcgJHwkIGB7XGVzY2FwZWdyYW1tYXIgXGNvZGV7J31cY29kZXsnfVxjb2Rleyd9fScgJHwkIGBcJCcpOwogICAgIHN0cmluZ0ludGVycG9sYXRpb24KICAgIC4KICAgIAp7XGJmIE5FV0xJTkU6fSRcYmFja3NsYXNoJCBuOwogICAgICAkXGJhY2tzbGFzaCQgcgogICAgLgoKIFxlbmR7Z3JhbW1hcn0KIApBbGwgc3RyaW5nIGxpdGVyYWxzIGltcGxlbWVudCB0aGUgYnVpbHQtaW4gY2xhc3MgXGNvZGV7U3RyaW5nfS4gSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgZm9yIGEgY2xhc3MgdG8gYXR0ZW1wdCB0byBleHRlbmQgb3IgaW1wbGVtZW50IFxjb2Rle1N0cmluZ30uIEludm9raW5nIHRoZSBnZXR0ZXIgXGNvZGV7cnVudGltZVR5cGV9IG9uIGEgc3RyaW5nIGxpdGVyYWwgcmV0dXJucyB0aGUgXGNvZGV7VHlwZX0gb2JqZWN0IHRoYXQgaXMgdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uIFxjb2Rle1N0cmluZ30uIFRoZSBzdGF0aWMgdHlwZSBvZiBhIHN0cmluZyBsaXRlcmFsIGlzIFxjb2Rle1N0cmluZ30uCgpcc3Vic3Vic2VjdGlvbntTdHJpbmcgSW50ZXJwb2xhdGlvbn0KXGxhYmVse3N0cmluZ0ludGVycG9sYXRpb259CgpJdCBpcyBwb3NzaWJsZSB0byBlbWJlZCBleHByZXNzaW9ucyB3aXRoaW4gbm9uLXJhdyBzdHJpbmcgbGl0ZXJhbHMsIHN1Y2ggdGhhdCB0aGUgdGhlc2UgZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZCwgYW5kIHRoZSByZXN1bHRpbmcgdmFsdWVzIGFyZSBjb252ZXJ0ZWQgaW50byBzdHJpbmdzIGFuZCBjb25jYXRlbmF0ZWQgd2l0aCB0aGUgZW5jbG9zaW5nIHN0cmluZy4gVGhpcyBwcm9jZXNzIGlzIGtub3duIGFzIHtcZW0gc3RyaW5nIGludGVycG9sYXRpb259LgoKIFxiZWdpbntncmFtbWFyfQp7XGJmIHN0cmluZ0ludGVycG9sYXRpb246fWBcJCcgSURFTlRJRklFUlxfTk9cX0RPTExBUjsKICAgICAgYFwkJyBgXHsnIGV4cHJlc3Npb24gYFx9JyAlIGNvdWxkIGJlIHRvcCBsZXZlbCBleHByZXNzaW9uLCBubz8KICAgIC4KIFxlbmR7Z3JhbW1hcn0KIApcY29tbWVudGFyeXtUaGUgcmVhZGVyIHdpbGwgbm90ZSB0aGF0IHRoZSBleHByZXNzaW9uIGluc2lkZSB0aGUgaW50ZXJwb2xhdGlvbiBjb3VsZCBpdHNlbGYgaW5jbHVkZSBzdHJpbmdzLCB3aGljaCBjb3VsZCBhZ2FpbiBiZSBpbnRlcnBvbGF0ZWQgcmVjdXJzaXZlbHkuIAp9CgpBbiB1bmVzY2FwZWQgXCQgY2hhcmFjdGVyIGluIGEgc3RyaW5nIHNpZ25pZmllcyB0aGUgYmVnaW5uaW5nIG9mIGFuIGludGVycG9sYXRlZCBleHByZXNzaW9uLiAgVGhlIFwkIHNpZ24gbWF5IGJlIGZvbGxvd2VkIGJ5IGVpdGhlcjoKXGJlZ2lue2l0ZW1pemV9ClxpdGVtIEEgc2luZ2xlIGlkZW50aWZpZXIgJGlkJCB0aGF0IG11c3Qgbm90IGNvbnRhaW4gdGhlIFwkIGNoYXJhY3Rlci4gClxpdGVtIEFuIGV4cHJlc3Npb24gJGUkIGRlbGltaXRlZCBieSBjdXJseSBicmFjZXMuClxlbmR7aXRlbWl6ZX0KClRoZSBmb3JtIFxjb2Rle1wkaWR9IGlzIGVxdWl2YWxlbnQgdG8gdGhlIGZvcm0gXGNvZGV7XCRce2lkXH19LiAgQW4gaW50ZXJwb2xhdGVkIHN0cmluZyBcY29kZXtgJHNfMSRcJFx7JGUkXH0kc18yJCd9ICBpcyBlcXVpdmFsZW50IHRvIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSAgc3RyaW5ncyBcY29kZXtgJHNfMSQnfSwgIFxjb2RleyRlJC50b1N0cmluZygpfSBhbmQgIFxjb2RleyRgc18yJCd9LiBMaWtld2lzZSBhbiBpbnRlcnBvbGF0ZWQgc3RyaW5nIFxjb2Rle2BgJHNfMSRcJFx7ZVx9JHNfMiQnJ30gaXMgZXF1aXZhbGVudCB0byB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgc3RyaW5ncyBcY29kZXtgYCRzXzEkJyd9LCBcY29kZXskZSQudG9TdHJpbmcoKX0gYW5kICBcY29kZXtgYCRzXzIkJyd9LgoKXHN1YnNlY3Rpb257U3ltYm9sc30KXGxhYmVse3N5bWJvbHN9CgpBIHtcZW0gc3ltYm9sIGxpdGVyYWx9IGRlbm90ZXMgdGhlIG5hbWUgb2YgYSBkZWNsYXJhdGlvbiBpbiBhIERhcnQgcHJvZ3JhbS4gCgpcYmVnaW57Z3JhbW1hcn0Ke1xiZiBzeW1ib2xMaXRlcmFsOn0KICAgICAgYFwjJyAgKG9wZXJhdG9yICR8JCAoaWRlbnRpZmllciAoYHtcZXNjYXBlZ3JhbW1hciAufScgaWRlbnRpZmllcikqKSkgIC4KXGVuZHtncmFtbWFyfQoKQSBzeW1ib2wgbGl0ZXJhbCBcY29kZXtcI2lkfSB3aGVyZSBcY29kZXtpZH0gZG9lcyBub3QgYmVnaW4gd2l0aCBhbiB1bmRlcnNjb3JlICjUXGNvZGV7XF991SkgIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGV4cHJlc3Npb24gXGNvZGV7XENPTlNUe30gU3ltYm9sKNRpZNUpfS4gIAoKQSBzeW1ib2wgbGl0ZXJhbCBcY29kZXtcI1xfaWR9IGV2YWx1YXRlcyB0byB0aGUgb2JqZWN0IHRoYXQgd291bGQgYmUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgXGNvZGV7bWlycm9yLmdldFByaXZhdGVTeW1ib2wo1Glk1Sl9IHdoZXJlIG1pcnJvciBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgXGNvZGV7TGlicmFyeU1pcnJvcn0gZGVmaW5lZCBpbiB0aGUgbGlicmFyeSBcY29kZXtkYXJ0Om1pcnJvcnN9LCByZWZsZWN0aW5nIHRoZSBjdXJyZW50IGxpYnJhcnkuIAoKXHJhdGlvbmFsZXsKT25lIG1heSB3ZWxsIGFzayB3aGF0IGlzIHRoZSBtb3RpdmF0aW9uIGZvciBpbnRyb2R1Y2luZyBsaXRlcmFsIHN5bWJvbHM/IEluIHNvbWUgbGFuZ3VhZ2VzLCBzeW1ib2xzIGFyZSBjYW5vbmljYWxpemVkIHdoZXJlYXMgc3RyaW5ncyBhcmUgbm90LiBIb3dldmVyIGxpdGVyYWwgc3RyaW5ncyBhcmUgYWxyZWFkeSBjYW5vbmljYWxpemVkIGluIERhcnQuICBTeW1ib2xzIGFyZSBzbGlnaHRseSBlYXNpZXIgdG8gdHlwZSBjb21wYXJlZCB0byBzdHJpbmdzIGFuZCB0aGVpciB1c2UgY2FuIGJlY29tZSBzdHJhbmdlbHkgYWRkaWN0aXZlLCBidXQgdGhpcyBpcyBub3QgbmVhcmx5IHN1ZmZpY2llbnQganVzdGlmaWNhdGlvbiBmb3IgYWRkaW5nIGEgbGl0ZXJhbCBmb3JtIHRvIHRoZSBsYW5ndWFnZS4gVGhlIHByaW1hcnkgbW90aXZhdGlvbiBpcyByZWxhdGVkIHRvIHRoZSB1c2Ugb2YgcmVmbGVjdGlvbiBhbmQgYSB3ZWIgc3BlY2lmaWMgcHJhY3RpY2Uga25vd24gYXMgbWluaWZpY2F0aW9uLiAKCk1pbmlmaWNhdGlvbiBjb21wcmVzc2VzIGlkZW50aWZpZXJzIGNvbnNpc3RlbnRseSB0aHJvdWdob3V0IGEgcHJvZ3JhbSBpbiBvcmRlciB0byByZWR1Y2UgZG93bmxvYWQgc2l6ZS4gIFRoaXMgcHJhY3RpY2UgcG9zZXMgZGlmZmljdWx0aWVzIGZvciByZWZsZWN0aXZlIHByb2dyYW1zIHRoYXQgcmVmZXIgdG8gcHJvZ3JhbSBkZWNsYXJhdGlvbnMgdmlhIHN0cmluZ3MuIEEgc3RyaW5nIHdpbGwgcmVmZXIgdG8gYW4gaWRlbnRpZmllciBpbiB0aGUgc291cmNlLCBidXQgdGhlIGlkZW50aWZpZXIgd2lsbCBubyBsb25nZXIgYmUgdXNlZCBpbiB0aGUgbWluaWZpZWQgY29kZSwgYW5kIHJlZmxlY3RpdmUgY29kZSB1c2luZyB0aGVzZSB0cnVpbmcgd291bGQgZmFpbC4gIFRoZXJlZm9yZSwgRGFydCByZWZsZWN0aW9uIHVzZXMgIG9iamVjdHMgb2YgdHlwZSBcY29kZXtTeW1ib2x9IHJhdGhlciB0aGFuIHN0cmluZ3MuIEluc3RhbmNlcyBvZiBcY29kZXtTeW1ib2x9IGFyZSBndWFyYW50ZWVkIHRvIGJlIHN0YWJsZSB3aXRoIHJlcGVhdCB0byBtaW5pZmljYXRpb24uIFByb3ZpZGluZyBhIGxpdGVyYWwgZm9ybSBmb3Igc3ltYm9scyBtYWtlcyByZWZsZWN0aXZlIGNvZGUgZWFzaWVyIHRvIHJlYWQgYW5kIHdyaXRlLiBUaGUgZmFjdCB0aGF0IHN5bWJvbHMgYXJlIGVhc3kgdG8gdHlwZSBhbmQgY2FuIG9mdGVuIGFjdCBhcyBjb252ZW5pZW50IHN1YnN0aXR1dGVzIGZvciBlbnVtcyBhcmUgc2Vjb25kYXJ5IGJlbmVmaXRzLgp9CgpUaGUgc3RhdGljIHR5cGUgb2YgYSBzeW1ib2wgbGl0ZXJhbCBpcyBcY29kZXtTeW1ib2x9LgoKXHN1YnNlY3Rpb257TGlzdHN9ClxsYWJlbHtsaXN0c30KCkEge1xlbSBsaXN0IGxpdGVyYWx9IGRlbm90ZXMgYSBsaXN0LCB3aGljaCBpcyBhbiBpbnRlZ2VyIGluZGV4ZWQgY29sbGVjdGlvbiBvZiBvYmplY3RzLiAKClxiZWdpbntncmFtbWFyfQp7XGJmIGxpc3RMaXRlcmFsOn0KICAgICBcQ09OU1R7fT8gdHlwZUFyZ3VtZW50cz8gYFsnIChleHByZXNzaW9uTGlzdCBgLCc/KT8gYF0nCiAgICAuClxlbmR7Z3JhbW1hcn0KCkEgbGlzdCBtYXkgY29udGFpbiB6ZXJvIG9yIG1vcmUgb2JqZWN0cy4gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhIGxpc3QgaXMgaXRzIHNpemUuIEEgbGlzdCBoYXMgYW4gYXNzb2NpYXRlZCBzZXQgb2YgaW5kaWNlcy4gIEFuIGVtcHR5IGxpc3QgaGFzIGFuIGVtcHR5IHNldCBvZiBpbmRpY2VzLiBBIG5vbi1lbXB0eSBsaXN0IGhhcyB0aGUgaW5kZXggc2V0ICRcezAgXGxkb3RzIG4gLTFcfSQgd2hlcmUgJG4kIGlzIHRoZSBzaXplIG9mIHRoZSBsaXN0LiBJdCBpcyBhIHJ1bnRpbWUgZXJyb3IgdG8gYXR0ZW1wdCB0byBhY2Nlc3MgYSBsaXN0IHVzaW5nIGFuIGluZGV4IHRoYXQgaXMgbm90IGEgbWVtYmVyIG9mIGl0cyBzZXQgb2YgaW5kaWNlcy4KCgpJZiBhIGxpc3QgbGl0ZXJhbCBiZWdpbnMgd2l0aCB0aGUgcmVzZXJ2ZWQgd29yZCBcQ09OU1R7fSwgaXQgaXMgYSB7XGVtIGNvbnN0YW50IGxpc3QgbGl0ZXJhbH0gd2hpY2ggaXMgYSBjb21waWxlLXRpbWUgY29uc3RhbnQgKFxyZWZ7Y29uc3RhbnRzfSkgYW5kIHRoZXJlZm9yZSBldmFsdWF0ZWQgYXQgY29tcGlsZS10aW1lLiBPdGhlcndpc2UsIGl0IGlzIGEge1xlbSBydW4tdGltZSBsaXN0IGxpdGVyYWx9IGFuZCBpdCBpcyBldmFsdWF0ZWQgYXQgcnVuLXRpbWUuIE9ubHkgcnVuLXRpbWUgbGlzdCBsaXRlcmFscyBjYW4gYmUgbXV0YXRlZAphZnRlciB0aGV5IGFyZSBjcmVhdGVkLiBBdHRlbXB0aW5nIHRvIG11dGF0ZSBhIGNvbnN0YW50IGxpc3QgbGl0ZXJhbCB3aWxsIHJlc3VsdCBpbiBhIGR5bmFtaWMgZXJyb3IuCgpJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBhbiBlbGVtZW50IG9mIGEgY29uc3RhbnQgbGlzdCBsaXRlcmFsIGlzIG5vdCBhIGNvbXBpbGUtdGltZSBjb25zdGFudC4gSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgdGhlIHR5cGUgYXJndW1lbnQgb2YgYSBjb25zdGFudCBsaXN0IGxpdGVyYWwgaW5jbHVkZXMgYSB0eXBlIHBhcmFtZXRlci4KXHJhdGlvbmFsZXtUaGUgYmluZGluZyBvZiBhIHR5cGUgcGFyYW1ldGVyIGlzIG5vdCBrbm93biBhdCBjb21waWxlLXRpbWUsIHNvIHdlIGNhbm5vdCB1c2UgdHlwZSBwYXJhbWV0ZXJzIGluc2lkZSBjb21waWxlLXRpbWUgY29uc3RhbnRzLn0KClRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IGxpc3QgbGl0ZXJhbCAgXENPTlNUe30gJDxFPltlXzFcbGRvdHMgZV9uXSQgaXMgYW4gb2JqZWN0ICRhJCB3aG9zZSBjbGFzcyBpbXBsZW1lbnRzIHRoZSBidWlsdC1pbiBjbGFzcyAkTGlzdDxFPiQuIFRoZSAkaSR0aCBlbGVtZW50IG9mICRhJCBpcyAkdl97aSsxfSQsIHdoZXJlICR2X2kkIGlzIHRoZSB2YWx1ZSBvZiB0aGUgY29tcGlsZS10aW1lIGV4cHJlc3Npb24gJGVfaSQuICBUaGUgdmFsdWUgb2YgYSBjb25zdGFudCBsaXN0IGxpdGVyYWwgIFxDT05TVHt9ICRbZV8xIFxsZG90cyBlX25dJCBpcyBkZWZpbmVkIGFzIHRoZSB2YWx1ZSBvZiB0aGUgY29uc3RhbnQgbGlzdCBsaXRlcmFsIFxDT05TVHt9JCA8IFxEWU5BTUlDe30+W2VfMVxsZG90cyBlX25dJC4KCkxldCAkbGlzdF8xID0kIFxDT05TVHt9ICQ8Vj5bZV97MTF9IFxsZG90cyBlX3sxbn1dJCBhbmQgJGxpc3RfMiA9JCAgXENPTlNUe30gJDxVPltlX3syMX0gXGxkb3RzIGVfezJufV0kIGJlIHR3byBjb25zdGFudCBsaXN0IGxpdGVyYWxzIGFuZCBsZXQgdGhlICBlbGVtZW50cyBvZiAkbGlzdF8xJCBhbmQgJGxpc3RfMiQgIGV2YWx1YXRlIHRvICAkb197MTF9IFxsZG90cyBvX3sxbn0kIGFuZCAkb197MjF9IFxsZG90cyBvX3sybn0kIHJlc3BlY3RpdmVseS4gSWZmIFxjb2Rle2lkZW50aWNhbCgkb197MWl9JCwgJG9fezJpfSQpfSBmb3IgJGkgXGluIDEuLiBuJCBhbmQgJFYgPSBVJCB0aGVuIFxjb2Rle2lkZW50aWNhbCgkbGlzdF8xJCwgJGxpc3RfMiQpfS4gCgpcY29tbWVudGFyeXtJbiBvdGhlciB3b3JkcywgY29uc3RhbnQgbGlzdCBsaXRlcmFscyBhcmUgY2Fub25pY2FsaXplZC59CgpBIHJ1bi10aW1lIGxpc3QgbGl0ZXJhbCAkPEU+W2VfMSBcbGRvdHMgZV9uXSQgIGlzIGV2YWx1YXRlZCBhcyBmb2xsb3dzOgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0KRmlyc3QsIHRoZSBleHByZXNzaW9ucyAkZV8xIFxsZG90cyBlX24kIGFyZSBldmFsdWF0ZWQgaW4gb3JkZXIgdGhleSBhcHBlYXIgaW4gdGhlIHByb2dyYW0sIHlpZWxkaW5nIG9iamVjdHMgJG9fMSBcbGRvdHMgb19uJC4KXGl0ZW0gQSBmcmVzaCBpbnN0YW5jZSAgKFxyZWZ7Z2VuZXJhdGl2ZUNvbnN0cnVjdG9yc30pICRhJCwgb2Ygc2l6ZSAkbiQsICB3aG9zZSBjbGFzcyBpbXBsZW1lbnRzIHRoZSBidWlsdC1pbiBjbGFzcyAkTGlzdDxFPiQgaXMgYWxsb2NhdGVkLiAKXGl0ZW0KClRoZSBvcGVyYXRvciBcY29kZXtbXT19IGlzIGludm9rZWQgb24gJGEkIHdpdGggIGZpcnN0ICBhcmd1bWVudCAkaSQgYW5kIHNlY29uZCBhcmd1bWVudAolVGhlICRpJHRoIGVsZW1lbnQgb2YgJGEkIGlzIHNldCB0byAKJG9fe2krMX0sIDAgXGxlIGkgPCBuJC4KXGl0ZW0KVGhlIHJlc3VsdCBvZiB0aGUgZXZhbHVhdGlvbiBpcyAkYSQuClxlbmR7aXRlbWl6ZX0KCgpcY29tbWVudGFyeXsKTm90ZSB0aGF0IHRoaXMgZG9jdW1lbnQgZG9lcyBub3Qgc3BlY2lmeSBhbiBvcmRlciBpbiB3aGljaCB0aGUgZWxlbWVudHMgYXJlIHNldC4gVGhpcyBhbGxvd3MgZm9yIHBhcmFsbGVsIGFzc2lnbm1lbnRzIGludG8gdGhlIGxpc3QgaWYgYW4gaW1wbGVtZW50YXRpb24gc28gZGVzaXJlcy4gIFRoZSBvcmRlciBjYW4gb25seSBiZSBvYnNlcnZlZCBpbiBjaGVja2VkIG1vZGUgKGFuZCBtYXkgbm90IGJlIHJlbGllZCB1cG9uKTogaWYgZWxlbWVudCAkaSQgaXMgbm90IGEgc3VidHlwZSBvZiB0aGUgZWxlbWVudCB0eXBlIG9mIHRoZSBsaXN0LCBhIGR5bmFtaWMgdHlwZSBlcnJvciB3aWxsIG9jY3VyIHdoZW4gJGFbaV0kIGlzIGFzc2lnbmVkICRvX3tpLTF9JC4gCn0KCkEgcnVudGltZSBsaXN0IGxpdGVyYWwgICRbZV8xIFxsZG90cyBlX25dJCBpcyBldmFsdWF0ZWQgYXMgICQ8IFxEWU5BTUlDe30+W2VfMVxsZG90cyBlX25dJC4KCgpcY29tbWVudGFyeXsKVGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24gcHJlY2x1ZGluZyBuZXN0aW5nIG9mIGxpc3QgbGl0ZXJhbHMuIEl0IGZvbGxvd3MgZnJvbSB0aGUgcnVsZXMgYWJvdmUgdGhhdAokPExpc3Q8aW50Pj5bWzEsIDIsIDNdLCBbNCwgNSwgNl1dJCBpcyBhIGxpc3Qgd2l0aCB0eXBlIHBhcmFtZXRlciAkTGlzdDxpbnQ+JCwgY29udGFpbmluZyB0d28gbGlzdHMgd2l0aCB0eXBlIHBhcmFtZXRlciAgXERZTkFNSUN7fS4gCn0KClRoZSBzdGF0aWMgdHlwZSBvZiBhIGxpc3QgbGl0ZXJhbCBvZiB0aGUgZm9ybSAgXENPTlNUe30kIDxFPltlXzFcbGRvdHMgZV9uXSQgIG9yIHRoZSBmb3JtICQ8RT5bZV8xIFxsZG90cyBlX25dJCBpcyAkTGlzdDxFPiQuIFRoZSBzdGF0aWMgdHlwZSBhIGxpc3QgbGl0ZXJhbCBvZiB0aGUgZm9ybSAgXENPTlNUe30gJFtlXzEgXGxkb3RzIGVfbiRdICBvciB0aGUgZm9ybSAkW2VfMVxsZG90cyBlX24kXSBpcyAkTGlzdDwgXERZTkFNSUN7fT4kLgoKXHJhdGlvbmFsZXsKSXQgaXMgdGVtcHRpbmcgdG8gYXNzdW1lIHRoYXQgdGhlIHR5cGUgb2YgdGhlIGxpc3QgbGl0ZXJhbCB3b3VsZCBiZSBjb21wdXRlZCBiYXNlZCBvbiB0aGUgdHlwZXMgb2YgaXRzIGVsZW1lbnRzLiBIb3dldmVyLCBmb3IgbXV0YWJsZSBsaXN0cyB0aGlzIG1heSBiZSB1bndhcnJhbnRlZC4gRXZlbiBmb3IgY29uc3RhbnQgbGlzdHMsIHdlIGZvdW5kIHRoaXMgYmVoYXZpb3IgdG8gYmUgcHJvYmxlbWF0aWMuIFNpbmNlIGNvbXBpbGUtdGltZSBpcyBvZnRlbiBhY3R1YWxseSBydW50aW1lLCB0aGUgcnVudGltZSBzeXN0ZW0gbXVzdCBiZSBhYmxlIHRvIHBlcmZvcm0gYSBjb21wbGV4IGxlYXN0IHVwcGVyIGJvdW5kIGNvbXB1dGF0aW9uIHRvIGRldGVybWluZSBhIHJlYXNvbmFibHkgcHJlY2lzZSB0eXBlLiBJdCBpcyBiZXR0ZXIgdG8gbGVhdmUgdGhpcyB0YXNrIHRvIGEgdG9vbCBpbiB0aGUgSURFLiBJdCBpcyBhbHNvIG11Y2ggbW9yZSB1bmlmb3JtIChhbmQgdGhlcmVmb3JlIHByZWRpY3RhYmxlIGFuZCB1bmRlcnN0YW5kYWJsZSkgdG8gaW5zaXN0IHRoYXQgd2hlbmV2ZXIgdHlwZXMgYXJlIHVuc3BlY2lmaWVkIHRoZXkgYXJlIGFzc3VtZWQgdG8gYmUgdGhlIHVua25vd24gdHlwZSAgXERZTkFNSUN7fS4KfQoKJUludm9raW5nIHRoZSBnZXR0ZXIgXGNvZGV7cnVudGltZVR5cGV9IG9uIGEgbGlzdCBsaXRlcmFsIHJldHVybnMgdGhlIFxjb2Rle1R5cGV9IG9iamVjdCB0aGF0IGlzIHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbiBcY29kZXtMaXN0fS4gVGhlIHN0YXRpYyB0eXBlIG9mIGEgbGlzdCBsaXRlcmFsIGlzIFxjb2Rle0xpc3R9LgolIHdoYXQgYWJvdXQgZ2VuZXJpY3M/CiAgICAKXHN1YnNlY3Rpb257TWFwc30KXGxhYmVse21hcHN9CgpBIHtcZW0gbWFwIGxpdGVyYWx9IGRlbm90ZXMgYSBtYXAgb2JqZWN0LiAKClxiZWdpbntncmFtbWFyfQp7XGJmIG1hcExpdGVyYWw6fQogICAgICBcQ09OU1R7fT8gIHR5cGVBcmd1bWVudHM/IGBceycgKG1hcExpdGVyYWxFbnRyeSAoYCwnIG1hcExpdGVyYWxFbnRyeSkqIGAsJz8pPyBgXH0nCiAgICAuCgp7XGJmIG1hcExpdGVyYWxFbnRyeTp9CiAgICAgICAgJSBpZGVudGlmaWVyIGB7XGVzY2FwZWdyYW1tYXIgOn0nIGV4cHJlc3Npb247CglleHByZXNzaW9uIGB7XGVzY2FwZWdyYW1tYXIgOn0nIGV4cHJlc3Npb24gCiAgICAuClxlbmR7Z3JhbW1hcn0KCkEge1xlbSBtYXAgbGl0ZXJhbH0gY29uc2lzdHMgb2YgemVybyBvciBtb3JlIGVudHJpZXMuIEVhY2ggZW50cnkgaGFzIGEge1xlbSBrZXl9IGFuZCBhIHtcZW0gdmFsdWV9LiAgRWFjaCBrZXkgYW5kIGVhY2ggdmFsdWUgaXMgZGVub3RlZCBieSBhbiBleHByZXNzaW9uLiAKIApJZiBhIG1hcCBsaXRlcmFsIGJlZ2lucyB3aXRoIHRoZSByZXNlcnZlZCB3b3JkIFxDT05TVHt9LCBpdCBpcyBhIHtcZW0gY29uc3RhbnQgbWFwIGxpdGVyYWx9IHdoaWNoIGlzIGEgY29tcGlsZS10aW1lIGNvbnN0YW50IChccmVme2NvbnN0YW50c30pIGFuZCB0aGVyZWZvcmUgZXZhbHVhdGVkIGF0IGNvbXBpbGUtdGltZS4gT3RoZXJ3aXNlLCBpdCBpcyBhIHtcZW0gcnVuLXRpbWUgbWFwIGxpdGVyYWx9IGFuZCBpdCBpcyBldmFsdWF0ZWQgYXQgcnVuLXRpbWUuIE9ubHkgcnVuLXRpbWUgbWFwIGxpdGVyYWxzIGNhbiBiZSBtdXRhdGVkCmFmdGVyIHRoZXkgYXJlIGNyZWF0ZWQuIEF0dGVtcHRpbmcgdG8gbXV0YXRlIGEgY29uc3RhbnQgbWFwIGxpdGVyYWwgd2lsbCByZXN1bHQgaW4gYSBkeW5hbWljIGVycm9yLgoKSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgZWl0aGVyIGEga2V5IG9yIGEgdmFsdWUgb2YgYW4gZW50cnkgaW4gYSBjb25zdGFudCBtYXAgbGl0ZXJhbCBpcyBub3QgYSBjb21waWxlLXRpbWUgY29uc3RhbnQuIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIHRoZSBrZXkgb2YgYW4gZW50cnkgaW4gYSBjb25zdGFudCBtYXAgbGl0ZXJhbCBpcyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgb3BlcmF0b3IgJD09JCB1bmxlc3MgdGhlIGtleSBpcyBhIAolc3ltYm9sLCAKc3RyaW5nLCBhbiBpbnRlZ2VyLCBhIGxpdGVyYWwgc3ltYm9sIG9yIHRoZSByZXN1bHQgb2YgaW52b2tpbmcgYSBjb25zdGFudCBjb25zdHJ1Y3RvciBvZiBjbGFzcyBcY2R7U3ltYm9sfS4gCkl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIHRoZSB0eXBlIGFyZ3VtZW50cyBvZiBhIGNvbnN0YW50IG1hcCBsaXRlcmFsIGluY2x1ZGUgYSB0eXBlIHBhcmFtZXRlci4gCgpUaGUgdmFsdWUgb2YgYSBjb25zdGFudCBtYXAgbGl0ZXJhbCAgXENPTlNUe30kIDxLLCBWPlx7a18xOmVfMVxsZG90cyBrX24gOmVfblx9JCBpcyBhbiBvYmplY3QgJG0kIHdob3NlIGNsYXNzIGltcGxlbWVudHMgdGhlIGJ1aWx0LWluIGNsYXNzICRNYXA8SywgVj4kLiBUaGUgZW50cmllcyBvZiAkbSQgYXJlICR1X2k6dl9pLCBpIFxpbiAxIC4uIG4kLCB3aGVyZSAkdV9pJCBpcyB0aGUgdmFsdWUgb2YgdGhlIGNvbXBpbGUtdGltZSBleHByZXNzaW9uICRrX2kkIGFuZCAkdl9pJCBpcyB0aGUgdmFsdWUgb2YgdGhlIGNvbXBpbGUtdGltZSBleHByZXNzaW9uICRlX2kkLiAgVGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgbWFwIGxpdGVyYWwgIFxDT05TVHt9ICRce2tfMTplXzFcbGRvdHMga19uIDplX25cfSQgaXMgZGVmaW5lZCBhcyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCBtYXAgbGl0ZXJhbCBcQ09OU1R7fSAkPFxEWU5BTUlDe30sIFxEWU5BTUlDe30+XHtrXzE6ZV8xXGxkb3RzIGtfbiA6ZV9uXH0kLgoKTGV0ICRtYXBfMSA9JCBcQ09OU1R7fSQgPEssIFY+XHtrX3sxMX06ZV97MTF9IFxsZG90cyBrX3sxbn0gOmVfezFufVx9JCBhbmQgICRtYXBfMiA9JCAgXENPTlNUe30kIDxKLCBVPlx7a197MjF9OmVfezIxfSBcbGRvdHMga197Mm59IDplX3sybn1cfSQgYmUgdHdvIGNvbnN0YW50IG1hcCBsaXRlcmFscy4gTGV0IHRoZSBrZXlzIG9mICRtYXBfMSQgYW5kICRtYXBfMiQgZXZhbHVhdGUgdG8gICRzX3sxMX0gXGxkb3RzICBzX3sxbn0kICBhbmQgICAkc197MjF9IFxsZG90cyAgc197Mm59JCByZXNwZWN0aXZlbHksIGFuZCBsZXQgdGhlIGVsZW1lbnRzIG9mICRtYXBfMSQgYW5kICRtYXBfMiQgZXZhbHVhdGUgdG8gJG9fezExfSBcbGRvdHMgIG9fezFufSQgYW5kICRvX3syMX0gXGxkb3RzICBvX3sybn0kIHJlc3BlY3RpdmVseS4gSWZmIFxjb2Rle2lkZW50aWNhbCgkb197MWl9JCwgJG9fezJpfSQpfSAgYW5kIFxjb2Rle2lkZW50aWNhbCgkc197MWl9JCwgJHNfezJpfSQpfSBmb3IgJGkgXGluIDEuLiBuJCwgYW5kICRLID0gSiwgViA9IFUkIHRoZW4gXGNvZGV7aWRlbnRpY2FsKCRtYXBfMSQsICRtYXBfMiQpfS4gCgpcY29tbWVudGFyeXtJbiBvdGhlciB3b3JkcywgY29uc3RhbnQgbWFwIGxpdGVyYWxzIGFyZSBjYW5vbmljYWxpemVkLn0KCkEgcnVudGltZSBtYXAgbGl0ZXJhbCAkPEssIFY+XHtrXzE6ZV8xXGxkb3RzIGtfbiA6ZV9uXH0kICBpcyBldmFsdWF0ZWQgYXMgZm9sbG93czoKXGJlZ2lue2l0ZW1pemV9ClxpdGVtCkZpcnN0LCB0aGUgZXhwcmVzc2lvbiAka19pJCBpcyBldmFsdWF0ZWQgeWllbGRpbmcgb2JqZWN0ICR1X2kkLCB0aGUgJGVfaSQgaXMgdmF1bHRlZCB5aWVsZGluZyBvYmplY3QgJG9faSQsIGZvciAkaSBcaW4gMS4ubiQgaW4gbGVmdCB0byByaWdodCBvcmRlciwgeWllbGRpbmcgb2JqZWN0cyAkdV8xLCBvXzFcbGRvdHMgdV9uLCBvX24kLgpcaXRlbSAgQSBmcmVzaCBpbnN0YW5jZSAoXHJlZntnZW5lcmF0aXZlQ29uc3RydWN0b3JzfSkgJG0kIHdob3NlIGNsYXNzIGltcGxlbWVudHMgdGhlIGJ1aWx0LWluIGNsYXNzCiAKICRNYXA8SywgVj4kIGlzIGFsbG9jYXRlZC4gClxpdGVtClRoZSBvcGVyYXRvciBcY29kZXtbXT19IGlzIGludm9rZWQgb24gJG0kIHdpdGggIGZpcnN0ICBhcmd1bWVudCAkdV9pJCBhbmQgc2Vjb25kIGFyZ3VtZW50ICRvX2ksICBpIFxpbiAxLi4gbiQuClxpdGVtClRoZSByZXN1bHQgb2YgdGhlIGV2YWx1YXRpb24gaXMgJG0kLgpcZW5ke2l0ZW1pemV9CgoKQSBydW50aW1lIG1hcCBsaXRlcmFsICAkXHtrXzE6ZV8xXGxkb3RzIGtfbiA6ZV9uXH0kIGlzIGV2YWx1YXRlZCBhcyAgCgokPFxEWU5BTUlDe30sICBcRFlOQU1JQ3t9Plx7a18xOmVfMVxsZG90cyBrX24gOmVfblx9JC4KCklmZiBhbGwgdGhlIGtleXMgaW4gYSBtYXAgbGl0ZXJhbCBhcmUgY29tcGlsZS10aW1lIGNvbnN0YW50cywgaXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiB0aGUgdmFsdWVzIG9mIGFueSB0d28ga2V5cyBpbiBhIG1hcCBsaXRlcmFsIGFyZSBlcXVhbC4KCkEgbWFwIGxpdGVyYWwgaXMgb3JkZXJlZDogaXRlcmF0aW5nIG92ZXIgdGhlIGtleXMgYW5kL29yIHZhbHVlcyBvZiB0aGUgbWFwcyBhbHdheXMgaGFwcGVucyBpbiB0aGUgCiBvcmRlciB0aGUga2V5cyBhcHBlYXJlZCBpbiB0aGUgc291cmNlIGNvZGUuCgpcY29tbWVudGFyeXsKT2YgY291cnNlLCBpZiBhIGtleSByZXBlYXRzLCB0aGUgb3JkZXIgaXMgZGVmaW5lZCBieSBmaXJzdCBvY2N1cnJlbmNlLCBidXQgdGhlIHZhbHVlIGlzIGRlZmluZWQgYnkgdGhlIGxhc3QuCn0gCgpUaGUgc3RhdGljIHR5cGUgb2YgYSBtYXAgbGl0ZXJhbCBvZiB0aGUgZm9ybSAgXENPTlNUe30kIDxLLCBWPlx7a18xOmVfMVxsZG90cyBrX24gOmVfblx9JCBvciB0aGUgZm9ybSAkPEssIFY+XHtrXzE6ZV8xXGxkb3RzIGtfbiA6ZV9uXH0kIGlzICRNYXA8SywgVj4kLiBUaGUgc3RhdGljIHR5cGUgYSBtYXAgbGl0ZXJhbCBvZiB0aGUgZm9ybSAgXENPTlNUe30kXHtrXzE6ZV8xXGxkb3RzIGtfbiA6ZV9uXH0kIG9yIHRoZSBmb3JtICRce2tfMTplXzFcbGRvdHMga19uIDplX25cfSQgaXMgJE1hcDxcRFlOQU1JQ3t9LCAgXERZTkFNSUN7fT4kLiAKCgpcc3Vic2VjdGlvbntUaHJvd30KXGxhYmVse3Rocm93fQoKVGhlIHtcZW0gdGhyb3cgZXhwcmVzc2lvbn0gIGlzIHVzZWQgdG8gcmFpc2UgYW4gZXhjZXB0aW9uLgoKIFxiZWdpbntncmFtbWFyfQp7XGJmIHRocm93RXhwcmVzc2lvbjp9CiAgICAgXFRIUk9Xe30gZXhwcmVzc2lvbiAKICAgIC4KICAgIAogICB7XGJmIHRocm93RXhwcmVzc2lvbldpdGhvdXRDYXNjYWRlOn0KICAgICBcVEhST1d7fSBleHByZXNzaW9uV2l0aG91dENhc2NhZGUgCiAgICAuCiAKIFxlbmR7Z3JhbW1hcn0KIAogVGhlIHtcZW0gY3VycmVudCBleGNlcHRpb259IGlzIHRoZSBsYXN0IHVuaGFuZGxlZCBleGNlcHRpb24gdGhyb3duLiAKCiBFdmFsdWF0aW9uIG9mIGEgdGhyb3cgZXhwcmVzc2lvbiBvZiB0aGUgZm9ybSAgXGNvZGV7XFRIUk9Xe30gJGUkO30gcHJvY2VlZHMgYXMgZm9sbG93czoKIApUaGUgZXhwcmVzc2lvbiAkZSQgaXMgZXZhbHVhdGVkIHlpZWxkaW5nIGEgdmFsdWUgJHYkLiBJZiAkdiQgZXZhbHVhdGVzIHRvIFxOVUxMe30sIHRoZW4gYSBcY29kZXtOdWxsVGhyb3duRXJyb3J9IGlzIHRocm93bi4gT3RoZXJ3aXNlLCBjb250cm9sIGlzIHRyYW5zZmVycmVkIHRvIHRoZSBuZWFyZXN0IGR5bmFtaWNhbGx5IGVuY2xvc2luZyBleGNlcHRpb24gaGFuZGxlciAoXHJlZnt0cnl9KSwgd2l0aCB0aGUgY3VycmVudCBleGNlcHRpb24gc2V0IHRvICR2JC4KClxjb21tZW50YXJ5ewpUaGVyZSBpcyBubyByZXF1aXJlbWVudCB0aGF0IHRoZSBleHByZXNzaW9uICRlJCBldmFsdWF0ZSB0byBhIHNwZWNpYWwga2luZCBvZiBleGNlcHRpb24gb3IgZXJyb3Igb2JqZWN0Lgp9CgpJZiB0aGUgb2JqZWN0IGJlaW5nIHRocm93biBpcyBhbiBpbnN0YW5jZSBvZiBjbGFzcyBcY29kZXtFcnJvcn0gb3IgYSBzdWJjbGFzcyB0aGVyZW9mLCBpdHMgXGNvZGV7c3RhY2tUcmFjZX0gZ2V0dGVyIHdpbGwgcmV0dXJuIHRoZSBzdGFjayB0cmFjZSBjdXJyZW50IGF0IHRoZSBwb2ludCB3aGVyZSB0aGUgdGhlIG9iamVjdCB3YXMgZmlyc3QgdGhyb3duLgoKVGhlIHN0YXRpYyB0eXBlIG9mIGEgdGhyb3cgZXhwcmVzc2lvbiBpcyAkXGJvdCQuCgoKXHN1YnNlY3Rpb257IEZ1bmN0aW9uIEV4cHJlc3Npb25zfQpcbGFiZWx7ZnVuY3Rpb25FeHByZXNzaW9uc30KCkEge1xlbSBmdW5jdGlvbiBsaXRlcmFsfSBpcyBhbiBvYmplY3QgdGhhdCBlbmNhcHN1bGF0ZXMgYW4gZXhlY3V0YWJsZSB1bml0IG9mIGNvZGUuIAoKXGJlZ2lue2dyYW1tYXJ9CntcYmYgZnVuY3Rpb25FeHByZXNzaW9uOn0KICAgIGZvcm1hbFBhcmFtZXRlckxpc3QgZnVuY3Rpb25FeHByZXNzaW9uQm9keQogICAgLgoKCntcYmYgZnVuY3Rpb25FeHByZXNzaW9uQm9keTp9CiAgICAgIGA9e1xlc2NhcGVncmFtbWFyIFxndH0nIGV4cHJlc3Npb247CiAgICAgIGJsb2NrCiAgICAuCiBcZW5ke2dyYW1tYXJ9ICAgCiAKVGhlIGNsYXNzIG9mIGEgZnVuY3Rpb24gbGl0ZXJhbCBpbXBsZW1lbnRzIHRoZSBidWlsdC1pbiBjbGFzcyBcY29kZXtGdW5jdGlvbn0uICAgCiVJbnZva2luZyB0aGUgZ2V0dGVyIFxjb2Rle3J1bnRpbWVUeXBlfSBvbiBhIGZ1bmN0aW9uIGxpdGVyYWwgcmV0dXJucyB0aGUgXGNvZGV7VHlwZX0gb2JqZWN0IHRoYXQgaXMgdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uIFxjb2Rle0Z1bmN0aW9ufS4KJSBub3QgbmVjZXNzYXJpbHkKCgolUXtDYW4gYW55b25lIGltcGxlbWVudCBpdD8gVGhlbiB3ZSBzaG91bGQgZGVmaW5lIHRoaW5ncyB2aWEgY2FsbH0KClRoZSBzdGF0aWMgdHlwZSBvZiBhIGZ1bmN0aW9uIGxpdGVyYWwgb2YgdGhlIGZvcm0gCgokKFRfMSQgJGFfMSwgXGxkb3RzLCBUX24kICRhX24sIFtUX3tuKzF9JCAkeF97bisxfSA9IGRfMSwgXGxkb3RzLCAgVF97bitrfSQgJHhfe24ra30gPSBkX2tdKSA9PiBlJCAKCmlzICQoVF8xIFxsZG90cywgVF9uLCBbVF97bisxfSQgJHhfe24rMX0sIFxsZG90cywgVF97bitrfSQgJHhfe24ra31dKSBccmlnaHRhcnJvdyBUXzAkLCB3aGVyZSAkVF8wJCBpcyB0aGUgc3RhdGljIHR5cGUgb2YgJGUkLiBJbiBhbnkgY2FzZSB3aGVyZSAkVF9pLCAxIFxsZSBpIFxsZSBuK2skLCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBpcyBjb25zaWRlcmVkIHRvIGhhdmUgYmVlbiBzcGVjaWZpZWQgYXMgIFxEWU5BTUlDe30uCgpUaGUgc3RhdGljIHR5cGUgb2YgYSBmdW5jdGlvbiBsaXRlcmFsIG9mIHRoZSBmb3JtIAoKJChUXzEkICRhXzEsIFxsZG90cywgVF9uJCAkYV9uLCBce1Rfe24rMX0kICR4X3tuKzF9IDogZF8xLCBcbGRvdHMsICBUX3tuK2t9JCAkeF97bitrfSA6IGRfa1x9KSA9PiBlJCAKCmlzICQoVF8xIFxsZG90cywgVF9uLCBce1Rfe24rMX0kICR4X3tuKzF9LCBcbGRvdHMsIFRfe24ra30kICR4X3tuK2t9XH0pIFxyaWdodGFycm93IFRfMCQsIHdoZXJlICRUXzAkIGlzIHRoZSBzdGF0aWMgdHlwZSBvZiAkZSQuIEluIGFueSBjYXNlIHdoZXJlICRUX2ksIDEgXGxlIGkgXGxlIG4rayQsIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGlzIGNvbnNpZGVyZWQgdG8gaGF2ZSBiZWVuIHNwZWNpZmllZCBhcyAgXERZTkFNSUN7fS4KClRoZSBzdGF0aWMgdHlwZSBvZiBhIGZ1bmN0aW9uIGxpdGVyYWwgb2YgdGhlIGZvcm0gIAoKJChUXzEkICRhXzEsIFxsZG90cywgVF9uJCAkYV9uLCBbVF97bisxfSQgJHhfe24rMX0gPSBkXzEsIFxsZG90cywgIFRfe24ra30kICR4X3tuK2t9PSBkX2tdKVx7c1x9JCAKCmlzICQoVF8xIFxsZG90cywgVF9uLCBbVF97bisxfSQgJHhfe24rMX0sIFxsZG90cywgVF97bitrfSQgJHhfe24ra31dKSBccmlnaHRhcnJvdyAgXERZTkFNSUN7fSQuIEluIGFueSBjYXNlIHdoZXJlICRUX2ksIDEgXGxlIGkgXGxlIG4rayQsIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGlzIGNvbnNpZGVyZWQgdG8gaGF2ZSBiZWVuIHNwZWNpZmllZCBhcyAgXERZTkFNSUN7fS4KClRoZSBzdGF0aWMgdHlwZSBvZiBhIGZ1bmN0aW9uIGxpdGVyYWwgb2YgdGhlIGZvcm0gIAoKJChUXzEkICRhXzEsIFxsZG90cywgVF9uJCAkYV9uLCBce1Rfe24rMX0kICR4X3tuKzF9IDogZF8xLCBcbGRvdHMsICBUX3tuK2t9JCAkeF97bitrfSA6IGRfa1x9KVx7c1x9JCAKCmlzICQoVF8xIFxsZG90cywgVF9uLCBce1Rfe24rMX0kICR4X3tuKzF9LCBcbGRvdHMsIFRfe24ra30kICR4X3tuK2t9XH0pIFxyaWdodGFycm93ICBcRFlOQU1JQ3t9JC4gSW4gYW55IGNhc2Ugd2hlcmUgJFRfaSwgMSBcbGUgaSBcbGUgbitrJCwgaXMgbm90IHNwZWNpZmllZCwgaXQgaXMgY29uc2lkZXJlZCB0byBoYXZlIGJlZW4gc3BlY2lmaWVkIGFzICBcRFlOQU1JQ3t9LgoKJSoqIE5vdyB0aGF0IGRlY2xhcmVkIHJldHVybiB0eXBlcyBhcmUgcHJlY2x1ZGVkLCBkbyB3ZSBuZWVkIHNvbWUgYmV0dGVyIHJldHVybiB0eXBlIHJ1bGUgZm9yICh4KXtzfSBhbmQgZnJpZW5kcz8KCgoKXHN1YnNlY3Rpb257IFRoaXN9ClxsYWJlbHt0aGlzfQoKVGhlIHJlc2VydmVkIHdvcmQgXFRISVN7fSBkZW5vdGVzIHRoZSB0YXJnZXQgb2YgdGhlIGN1cnJlbnQgaW5zdGFuY2UgbWVtYmVyIGludm9jYXRpb24uCgpcYmVnaW57Z3JhbW1hcn0Ke1xiZiB0aGlzRXhwcmVzc2lvbjp9CiAgICAgIFxUSElTe30KICAgICAuClxlbmR7Z3JhbW1hcn0KClRoZSBzdGF0aWMgdHlwZSBvZiBcVEhJU3t9IGlzIHRoZSBpbnRlcmZhY2Ugb2YgdGhlIGltbWVkaWF0ZWx5IGVuY2xvc2luZyBjbGFzcy4KClxjb21tZW50YXJ5ewpXZSBkbyBub3Qgc3VwcG9ydCBzZWxmLXR5cGVzIGF0IHRoaXMgcG9pbnQuIAp9CgpJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBcVEhJU3t9IGFwcGVhcnMgaW4gYSB0b3AtbGV2ZWwgZnVuY3Rpb24gb3IgdmFyaWFibGUgaW5pdGlhbGl6ZXIsICBpbiBhIGZhY3RvcnkgY29uc3RydWN0b3IsIG9yIGluIGEgc3RhdGljIG1ldGhvZCBvciB2YXJpYWJsZSBpbml0aWFsaXplciwgb3IgaW4gdGhlIGluaXRpYWxpemVyIG9mIGFuIGluc3RhbmNlIHZhcmlhYmxlLiAKClxzdWJzZWN0aW9ueyBJbnN0YW5jZSBDcmVhdGlvbn0KXGxhYmVse2luc3RhbmNlQ3JlYXRpb259CgpJbnN0YW5jZSBjcmVhdGlvbiBleHByZXNzaW9ucyBpbnZva2UgY29uc3RydWN0b3JzIHRvIHByb2R1Y2UgaW5zdGFuY2VzLiAKCiVJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBhbnkgb2YgdGhlIHR5cGUgYXJndW1lbnRzIHRvIGEgY29uc3RydWN0b3Igb2YgYSBnZW5lcmljIHR5cGUgaW52b2tlZCBieSBhIG5ldyBleHByZXNzaW9uIG9yIGEgY29uc3RhbnQgb2JqZWN0IGV4cHJlc3Npb24gZG8gbm90IGRlbm90ZSB0eXBlcyBpbiB0aGUgZW5jbG9zaW5nIGxleGljYWwgc2NvcGUuIAoKJUl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIGEgY29uc3RydWN0b3Igb2YgYSBub24tZ2VuZXJpYyB0eXBlIGludm9rZWQgYnkgYSBuZXcgZXhwcmVzc2lvbiBvciBhIGNvbnN0YW50IG9iamVjdCBleHByZXNzaW9uIGlzIHBhc3NlZCBhbnkgdHlwZSBhcmd1bWVudHMuIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIGEgY29uc3RydWN0b3Igb2YgYSBnZW5lcmljIHR5cGUgd2l0aCAkbiQgdHlwZSBwYXJhbWV0ZXJzIGludm9rZWQgYnkgYSBuZXcgZXhwcmVzc2lvbiBvciBhIGNvbnN0YW50IG9iamVjdCBleHByZXNzaW9uIGlzIHBhc3NlZCAkbSQgdHlwZSBhcmd1bWVudHMgd2hlcmUgJG0gXG5lIG4kLCBvciBpZiBhbnkgb2YgaXRzIHR5cGUgYXJndW1lbnRzIGlzICBtaXNjb25zdHJ1Y3RlZCAoXHJlZntwYXJhbWV0ZXJpemVkVHlwZXN9KS4KCkl0IGlzIGEgc3RhdGljIHR5cGUgd2FybmluZyBpZgp0aGUgdHlwZSAkVCQgaW4gYW4gaW5zdGFuY2UgY3JlYXRpb24gZXhwcmVzc2lvbiBvZiBvbmUgb2YgIHRoZSBmb3JtcyAKClxORVd7fSAkVC5pZChhXzEsIFxsZG90cyAsIGFfbiwgeF97bisxfTogYV97bisxfSwgXGxkb3RzICwgeF97bitrfTogYV97bitrfSkkLCAgCgpcTkVXe30gJFQoYV8xLCBcbGRvdHMgLCBhX24sIHhfe24rMX06IGFfe24rMX0sIFxsZG90cyAsIHhfe24ra306IGFfe24ra30pJCwKClxDT05TVHt9ICRULmlkKGFfMSwgXGxkb3RzICwgYV9uLCB4X3tuKzF9OiBhX3tuKzF9LCBcbGRvdHMgLCB4X3tuK2t9OiBhX3tuK2t9KSQsICAKClxDT05TVHt9ICRUKGFfMSwgXGxkb3RzICwgYV9uLCB4X3tuKzF9OiBhX3tuKzF9LCBcbGRvdHMgLCB4X3tuK2t9OiBhX3tuK2t9KSQgaXMgbWFsZm9ybWVkIChccmVme2R5bmFtaWNUeXBlU3lzdGVtfSkgb3IgbWFsYm91bmRlZCAoXHJlZntwYXJhbWV0ZXJpemVkVHlwZXN9KS4KJWFueSBvZiB0aGUgdHlwZSBhcmd1bWVudHMgdG8gYSBjb25zdHJ1Y3RvciBvZiBhIGdlbmVyaWMgdHlwZSAkRyQgaW52b2tlZCBieSBhIG5ldyBleHByZXNzaW9uIG9yIGEgY29uc3RhbnQgb2JqZWN0IGV4cHJlc3Npb24gYXJlIG5vdCBzdWJ0eXBlcyBvZiB0aGUgYm91bmRzIG9mIHRoZSBjb3JyZXNwb25kaW5nIGZvcm1hbCB0eXBlIHBhcmFtZXRlcnMgb2YgJEckLgoKClxzdWJzdWJzZWN0aW9ueyBOZXd9ClxsYWJlbHtuZXd9CgpUaGUge1xlbSBuZXcgZXhwcmVzc2lvbn0gaW52b2tlcyBhIGNvbnN0cnVjdG9yIChccmVme2NvbnN0cnVjdG9yc30pLgoKXGJlZ2lue2dyYW1tYXJ9CntcYmYgbmV3RXhwcmVzc2lvbjp9ClxORVd7fSB0eXBlIChge1xlc2NhcGVncmFtbWFyIC59JyBpZGVudGlmaWVyKT8gYXJndW1lbnRzCi4KXGVuZHtncmFtbWFyfQoKTGV0ICRlJCBiZSBhIG5ldyBleHByZXNzaW9uIG9mIHRoZSBmb3JtICAKClxORVd7fSAkVC5pZChhXzEsIFxsZG90cyAsIGFfbiwgeF97bisxfTogYV97bisxfSwgXGxkb3RzICwgeF97bitrfTogYV97bitrfSkkIG9yIHRoZSBmb3JtICAKClxORVd7fSAkVChhXzEsIFxsZG90cyAsIGFfbiwgeF97bisxfTogYV97bisxfSwgXGxkb3RzICwgeF97bitrfTogYV97bitrfSkkLiAKCiVJdCBpcyBhIHJ1bnRpbWUgdHlwZSBlcnJvciBpZgoldGhlIHR5cGUgJFQkICBpcyBtYWxmb3JtZWQuCiVJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmICRUJCBpcyBhIG1hbGZvcm1lZCB0eXBlLgoKJW5vdCBhIGNsYXNzIGFjY2Vzc2libGUgaW4gdGhlIGN1cnJlbnQgc2NvcGUsICBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IHR5cGUgYXJndW1lbnRzLiAKCklmICRUJCBpcyAgYSBjbGFzcyBvciBwYXJhbWV0ZXJpemVkIHR5cGUgYWNjZXNzaWJsZSBpbiB0aGUgY3VycmVudCBzY29wZSB0aGVuOgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0KSWYgJGUkIGlzIG9mIHRoZSBmb3JtIFxORVd7fSAkVC5pZChhXzEsIFxsZG90cyAsIGFfbiwgeF97bisxfTogYV97bisxfSwgXGxkb3RzICwgeF97bitrfTogYV97bitrfSkkIGl0IGlzIGEgc3RhdGljIHdhcm5pbmcgaWYgJFQuaWQkIGlzIG5vdCB0aGUgbmFtZSBvZiBhIGNvbnN0cnVjdG9yIGRlY2xhcmVkIGJ5IHRoZSB0eXBlICRUJC4gSWYgJGUkIGlzIG9mIHRoZSBmb3JtICBcTkVXe30gJFQoYV8xLCBcbGRvdHMgLCBhX24sIHhfe24rMX06IGFfe24rMX0sIFxsZG90cyAsIHhfe24ra306IGFfe24ra30pJCBpdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmIHRoZSB0eXBlICRUJCBkb2VzIG5vdCBkZWNsYXJlIGEgY29uc3RydWN0b3Igd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBkZWNsYXJhdGlvbiBvZiAkVCQuIApcZW5ke2l0ZW1pemV9CgpJZiAkVCQgaXMgYSBwYXJhbWV0ZXJpemVkIHR5cGUgKFxyZWZ7cGFyYW1ldGVyaXplZFR5cGVzfSkgJFM8VV8xLCAgXGxkb3RzLCBVX20+JCwgbGV0ICRSID0gUyQuICAKJUl0IGlzIGEgCiVjb21waWxlLXRpbWUgQ0hBTkdFRAolcnVudGltZSB0eXBlCiVlcnJvciBpZiAkUyQgaXMgbm90IGEgZ2VuZXJpYyAoXHJlZntnZW5lcmljc30pIHR5cGUgd2l0aCAkbSQgdHlwZSBwYXJhbWV0ZXJzLiAKSWYgJFQkIGlzIG5vdCBhIHBhcmFtZXRlcml6ZWQgdHlwZSwgbGV0ICRSID0gVCQuCkZ1cnRoZXJtb3JlLCBpZiAkZSQgaXMgb2YgdGhlIGZvcm0gXE5FV3t9ICRULmlkKGFfMSwgXGxkb3RzICwgYV9uLCB4X3tuKzF9OiBhX3tuKzF9LCBcbGRvdHMgLCB4X3tuK2t9OiBhX3tuK2t9KSQgdGhlbiBsZXQgICRxJCBiZSB0aGUgY29uc3RydWN0b3IgICRULmlkJCwgb3RoZXJ3aXNlIGxldCAkcSQgYmUgdGhlIGNvbnN0cnVjdG9yICRUJC4gCgpJZiAkUiQgaXMgYSBnZW5lcmljIHdpdGggJGwgPSBtJCB0eXBlIHBhcmFtZXRlcnMgdGhlbgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gICRUJCBpcyBub3QgYSBwYXJhbWV0ZXJpemVkIHR5cGUsIHRoZW4gZm9yICQgaSBcaW4gMSAuLiBsJCwgbGV0ICRWX2kgPSAgXERZTkFNSUN7fSQuClxpdGVtICBJZiAkVCQgaXMgIGEgcGFyYW1ldGVyaXplZCB0eXBlIHRoZW4gbGV0ICRWX2kgPSBVX2kkIGZvciAkIGkgXGluIDEgLi4gbSQuICAKXGVuZHtpdGVtaXplfQoKSWYgJFIkIGlzIGEgZ2VuZXJpYyB3aXRoICRsIFxuZSBtJCB0eXBlIHBhcmFtZXRlcnMgdGhlbiBmb3IgJCBpIFxpbiAxIC4uIGwkLCBsZXQgJFZfaSA9ICBcRFlOQU1JQ3t9JC4gSW4gYW55IG90aGVyIGNhc2UsIGxldCAkVl9pID0gVV9pJCBmb3IgJCBpIFxpbiAxIC4uIG0kLiAgCgpFdmFsdWF0aW9uIG9mICRlJCBwcm9jZWVkcyBhcyBmb2xsb3dzOgoKRmlyc3QsIHRoZSBhcmd1bWVudCBsaXN0ICQoYV8xLCBcbGRvdHMgLCBhX24sIHhfe24rMX06IGFfe24rMX0sIFxsZG90cyAsIHhfe24ra306IGFfe24ra30pJCBpcyBldmFsdWF0ZWQuIAoKSWYgJFQkIGlzIGEgZGVmZXJyZWQgdHlwZSB3aXRoIHByZWZpeCAkcCQsIHRoZW4gaWYgJHAkIGhhcyBub3QgYmVlbiBzdWNjZXNzZnVsbHkgbG9hZGVkLCBhIGR5bmFtaWMgZXJyb3Igb2NjdXJzLgoKVGhlbiwgaWYgJHEkIGlzIGEgbm9uLWZhY3RvcnkgY29uc3RydWN0b3Igb2YgYW4gYWJzdHJhY3QgY2xhc3MgdGhlbiBhbiBcY29kZXtBYnN0cmFjdENsYXNzSW5zdGFudGlhdGlvbkVycm9yfSBpcyB0aHJvd24uCgpJZiAkVCQgIGlzIG1hbGZvcm1lZCBvciBpZiAkVCQgaXMgYSB0eXBlIHZhcmlhYmxlIGEgZHluYW1pYyBlcnJvciBvY2N1cnMuIEluIGNoZWNrZWQgbW9kZSwgaWYgJFQkIG9yIGFueSBvZiBpdHMgc3VwZXJjbGFzc2VzIGlzIG1hbGJvdW5kZWQgYSBkeW5hbWljIGVycm9yIG9jY3Vycy4KIE90aGVyd2lzZSwgaWYgJHEkIGlzIG5vdCBkZWZpbmVkIG9yIG5vdCBhY2Nlc3NpYmxlLCBhIFxjb2Rle05vU3VjaE1ldGhvZEVycm9yfSBpcyB0aHJvd24uICBJZiAkcSQgaGFzICBsZXNzIHRoYW4gJG4kIHBvc2l0aW9uYWwgcGFyYW1ldGVycyBvciBtb3JlIHRoYW4gJG4kIHJlcXVpcmVkIHBhcmFtZXRlcnMsIG9yIGlmICRxJCBsYWNrcyBhbnkgb2YgdGhlIGtleXdvcmQgcGFyYW1ldGVycyAkXHsgeF97bisxfSwgXGxkb3RzLCB4X3tuK2t9XH0kIGEgXGNvZGV7Tm9TdWNoTWV0aG9kRXJyb3J9IGlzIHRocm93bi4KCk90aGVyd2lzZSwgaWYgJHEkIGlzIGEgZ2VuZXJhdGl2ZSBjb25zdHJ1Y3RvciAoXHJlZntnZW5lcmF0aXZlQ29uc3RydWN0b3JzfSksIHRoZW46CgpcY29tbWVudGFyeXtOb3RlIHRoYXQgaXQgdGhpcyBwb2ludCB3ZSBhcmUgYXNzdXJlZCB0aGF0IHRoZSBudW1iZXIgb2YgYWN0dWFsIHR5cGUgYXJndW1lbnRzIG1hdGNoIHRoZSBudW1iZXIgb2YgZm9ybWFsIHR5cGUgcGFyYW1ldGVycy59CgpBIGZyZXNoIGluc3RhbmNlIChccmVme2dlbmVyYXRpdmVDb25zdHJ1Y3RvcnN9KSwgJGkkLCAgb2YgY2xhc3MgJFIkIGlzIGFsbG9jYXRlZC4gRm9yIGVhY2ggaW5zdGFuY2UgdmFyaWFibGUgJGYkIG9mICRpJCwgIGlmIHRoZSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBvZiAkZiQgaGFzIGFuIGluaXRpYWxpemVyIGV4cHJlc3Npb24gJGVfZiQsIHRoZW4gJGVfZiQgaXMgZXZhbHVhdGVkIHRvIGFuIG9iamVjdCAkb19mJCBhbmQgJGYkIGlzIGJvdW5kIHRvICRvX2YkLiBPdGhlcndpc2UgJGYkIGlzIGJvdW5kIHRvIFxOVUxMe30uCgpcY29tbWVudGFyeXsKT2JzZXJ2ZSB0aGF0IFxUSElTe30gaXMgbm90IGluIHNjb3BlIGluICRlX2YkLiBIZW5jZSwgdGhlIGluaXRpYWxpemF0aW9uIGNhbm5vdCBkZXBlbmQgb24gb3RoZXIgcHJvcGVydGllcyBvZiB0aGUgb2JqZWN0IGJlaW5nIGluc3RhbnRpYXRlZC4KfQoKTmV4dCwgICRxJCBpcyBleGVjdXRlZCAgd2l0aCBcVEhJU3t9IGJvdW5kIHRvICRpJCwgIHRoZSB0eXBlIHBhcmFtZXRlcnMgKGlmIGFueSkgb2YgJFIkIGJvdW5kIHRvIHRoZSBhY3R1YWwgdHlwZSBhcmd1bWVudHMgJFZfMSwgXGxkb3RzLCBWX2wkIGFuZCB0aGUgZm9ybWFsIHBhcmFtZXRlciBiaW5kaW5ncyB0aGF0IHJlc3VsdGVkIGZyb20gdGhlIGV2YWx1YXRpb24gb2YgdGhlIGFyZ3VtZW50IGxpc3QuIFRoZSByZXN1bHQgb2YgdGhlIGV2YWx1YXRpb24gb2YgJGUkIGlzICRpJC4KCk90aGVyd2lzZSwgJHEkIGlzIGEgZmFjdG9yeSBjb25zdHJ1Y3RvciAoXHJlZntmYWN0b3JpZXN9KS4gVGhlbjoKCklmICRxJCBpcyBhIHJlZGlyZWN0aW5nIGZhY3RvcnkgY29uc3RydWN0b3Igb2YgdGhlIGZvcm0gJFQocF8xLCBcbGRvdHMsIHBfe24ra30pID0gYzskIG9yIG9mIHRoZSBmb3JtICAkVC5pZChwXzEsIFxsZG90cywgcF97bitrfSkgPSBjOyQgdGhlbiB0aGUgcmVzdWx0IG9mIHRoZSBldmFsdWF0aW9uIG9mICRlJCBpcyBlcXVpdmFsZW50IHRvIGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb24gCgokW1ZfMSwgIFxsZG90cywgVl9tL1RfMSwgIFxsZG90cywgVF9tXSgkXGNvZGV7XE5FV3t9ICRjKGFfMSwgXGxkb3RzLCBhX24sIHhfe24rMX06IGFfe24rMX0sIFxsZG90cywgeF97bitrfTogYV97bitrfSkpJH0uICBJZiBldmFsdWF0aW9uIG9mICRxJCBjYXVzZXMgJHEkIHRvIGJlIHJlLWV2YWx1YXRlZCBjeWNsaWNhbGx5LCBhIHJ1bnRpbWUgZXJyb3Igb2NjdXJzLgoKCk90aGVyd2lzZSwgdGhlIGJvZHkgb2YgJHEkIGlzIGV4ZWN1dGVkIHdpdGggcmVzcGVjdCB0byB0aGUgYmluZGluZ3MgdGhhdCByZXN1bHRlZCBmcm9tIHRoZSBldmFsdWF0aW9uIG9mIHRoZSBhcmd1bWVudCBsaXN0IGFuZCB0aGUgdHlwZSBwYXJhbWV0ZXJzIChpZiBhbnkpIG9mICRxJCBib3VuZCB0byB0aGUgYWN0dWFsIHR5cGUgYXJndW1lbnRzICRWXzEsIFxsZG90cywgVl9sJCByZXN1bHRpbmcgaW4gYW4gb2JqZWN0ICRpJC4gVGhlIHJlc3VsdCBvZiB0aGUgZXZhbHVhdGlvbiBvZiAkZSQgaXMgJGkkLgoKSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiAkcSQgaXMgYSBjb25zdHJ1Y3RvciBvZiBhbiBhYnN0cmFjdCBjbGFzcyBhbmQgJHEkIGlzIG5vdCBhIGZhY3RvcnkgY29uc3RydWN0b3IuCgpcY29tbWVudGFyeXtUaGUgYWJvdmUgZ2l2ZXMgcHJlY2lzZSBtZWFuaW5nIHRvIHRoZSBpZGVhIHRoYXQgaW5zdGFudGlhdGluZyBhbiBhYnN0cmFjdCBjbGFzcyBsZWFkcyB0byBhIHdhcm5pbmcuIApBIHNpbWlsYXIgY2xhdXNlIGFwcGxpZXMgdG8gY29uc3RhbnQgb2JqZWN0IGNyZWF0aW9uIGluIHRoZSBuZXh0IHNlY3Rpb24uCn0gCgpccmF0aW9uYWxle0luIHBhcnRpY3VsYXIsIGEgZmFjdG9yeSBjb25zdHJ1Y3RvciBjYW4gYmUgZGVjbGFyZWQgaW4gYW4gYWJzdHJhY3QgY2xhc3MgYW5kIHVzZWQgc2FmZWx5LCBhcyBpdCB3aWxsIGVpdGhlciBwcm9kdWNlIGEgdmFsaWQgaW5zdGFuY2Ugb3IgbGVhZCB0byBhIHdhcm5pbmcgaW5zaWRlIGl0cyBvd24gZGVjbGFyYXRpb24uCn0KClRoZSBzdGF0aWMgdHlwZSBvZiBhbiBpbnN0YW5jZSBjcmVhdGlvbiBleHByZXNzaW9uIG9mIGVpdGhlciB0aGUgZm9ybSAKClxORVd7fSAkVC5pZChhXzEsIFxsZG90cyAsIGFfbiwgeF97bisxfTogYV97bisxfSwgXGxkb3RzICwgeF97bitrfTogYV97bitrfSkkIAoKb3IgdGhlIGZvcm0gCgpcTkVXe30gJFQoYV8xLCBcbGRvdHMgLCBhX24sIHhfe24rMX06IGFfe24rMX0sIFxsZG90cyAsIHhfe24ra306IGFfe24ra30pJCAKCmlzICRUJC4gIApJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmIHRoZSBzdGF0aWMgdHlwZSBvZiAkYV9pLCAxIFxsZSBpIFxsZSBuKyBrJCBtYXkgbm90IGJlIGFzc2lnbmVkIHRvIHRoZSB0eXBlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGZvcm1hbCBwYXJhbWV0ZXIgb2YgdGhlIGNvbnN0cnVjdG9yICRULmlkJCAocmVzcGVjdGl2ZWx5ICRUJCkuCgoKClxzdWJzdWJzZWN0aW9ueyBDb25zdH0KXGxhYmVse2NvbnN0fQoKQSB7XGVtIGNvbnN0YW50IG9iamVjdCBleHByZXNzaW9ufSBpbnZva2VzIGEgY29uc3RhbnQgY29uc3RydWN0b3IgKFxyZWZ7Y29uc3RhbnRDb25zdHJ1Y3RvcnN9KS4gCgpcYmVnaW57Z3JhbW1hcn0Ke1xiZiBjb25zdE9iamVjdEV4cHJlc3Npb246fQpcQ09OU1R7fSB0eXBlICgne1xlc2NhcGVncmFtbWFyIC59JyBpZGVudGlmaWVyKT8gYXJndW1lbnRzCi4KXGVuZHtncmFtbWFyfQoKTGV0ICRlJCBiZSBhIGNvbnN0YW50IG9iamVjdCBleHByZXNzaW9uIG9mIHRoZSBmb3JtICAKClxDT05TVHt9ICRULmlkKGFfMSwgXGxkb3RzICwgYV9uLCB4X3tuKzF9OiBhX3tuKzF9LCBcbGRvdHMgLCB4X3tuK2t9OiBhX3tuK2t9KSQgCgpvciB0aGUgZm9ybSAgXENPTlNUe30gJFQoYV8xLCBcbGRvdHMgLCBhX24sIHhfe24rMX06IGFfe24rMX0sIFxsZG90cyAsIHhfe24ra306IGFfe24ra30pJC4gSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgJFQkIGRvZXMgbm90IGRlbm90ZSBhIGNsYXNzIGFjY2Vzc2libGUgaW4gdGhlIGN1cnJlbnQgc2NvcGUuICBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiAkVCQgaXMgYSBkZWZlcnJlZCB0eXBlIChccmVme3N0YXRpY1R5cGVzfSkuCgpcY29tbWVudGFyeXtJbiBwYXJ0aWN1bGFyLCAkVCQgbWF5IG5vdCBiZSBhIHR5cGUgdmFyaWFibGUufQoKSWYgJFQkIGlzIGEgcGFyYW1ldGVyaXplZCB0eXBlLCBpdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiAkVCQgaW5jbHVkZXMgYSB0eXBlIHZhcmlhYmxlIGFtb25nIGl0cyB0eXBlIGFyZ3VtZW50cy4KCklmICRlJCBpcyBvZiB0aGUgZm9ybSBcQ09OU1R7fSAkVC5pZChhXzEsIFxsZG90cyAsIGFfbiwgeF97bisxfTogYV97bisxfSwgXGxkb3RzICwgeF97bitrfTogYV97bitrfSkkIGl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmICRULmlkJCBpcyBub3QgdGhlIG5hbWUgb2YgYSBjb25zdGFudCBjb25zdHJ1Y3RvciBkZWNsYXJlZCBieSB0aGUgdHlwZSAkVCQuIElmICRlJCBpcyBvZiB0aGUgZm9ybSAgXENPTlNUe30gJFQoYV8xLCBcbGRvdHMgLCBhX24sIHhfe24rMX06IGFfe24rMX0sIFxsZG90cyAsIHhfe24ra306IGFfe24ra30pJCBpdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiB0aGUgdHlwZSAkVCQgZG9lcyBub3QgZGVjbGFyZSBhIGNvbnN0YW50IGNvbnN0cnVjdG9yIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgZGVjbGFyYXRpb24gb2YgJFQkLiAKCkluIGFsbCBvZiB0aGUgYWJvdmUgY2FzZXMsIGl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmICRhX2ksICBpXGluIDEgLi4gbiArIGskLCBpcyBub3QgYSBjb21waWxlLXRpbWUgY29uc3RhbnQgZXhwcmVzc2lvbi4KCiVJZiAkVCQgaXMgYSBwYXJhbWV0ZXJpemVkIHR5cGUgKFxyZWZ7cGFyYW1ldGVyaXplZFR5cGVzfSkgJFM8VV8xLCAgXGxkb3RzLCBVX20+JCwgbGV0ICRSID0gUyQuICBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiAkVCQgaXMgaXMgbWFsZm9ybWVkLiBJZiAkVCQgaXMgbm90IGEgcGFyYW1ldGVyaXplZCB0eXBlLCBsZXQgJFIgPSBUJC4KICVGaW5hbGx5LCAKJSBJZiAkVCQgaXMgYSBnZW5lcmljIHdpdGggJGwkIHJldHlwZSBwYXJhbWV0ZXJzLCB0aGVuIGZvciBhbGwgJCBpIFxpbiAxIC4uIGwkLCBsZXQgJFZfaSA9ICBcRFlOQU1JQ3t9JC4gIAoKRXZhbHVhdGlvbiBvZiAkZSQgcHJvY2VlZHMgYXMgZm9sbG93czoKCkZpcnN0LCBpZiAkZSQgaXMgb2YgdGhlIGZvcm0gCgpcQ09OU1R7fSAkVC5pZChhXzEsIFxsZG90cyAsIGFfbiwgeF97bisxfTogYV97bisxfSwgXGxkb3RzICwgeF97bitrfTogYV97bitrfSkkIAoKdGhlbiBsZXQgJGkkIGJlIHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbiAKClxORVd7fSAkVC5pZChhXzEsIFxsZG90cyAsIGFfbiwgeF97bisxfTogYV97bisxfSwgXGxkb3RzICwgeF97bitrfTogYV97bitrfSkkLiAKCk90aGVyd2lzZSwgJGUkIG11c3QgYmUgb2YgdGhlIGZvcm0gIAoKXENPTlNUe30gJFQoYV8xLCBcbGRvdHMgLCBhX24sIHhfe24rMX06IGFfe24rMX0sIFxsZG90cyAsIHhfe24ra306IGFfe24ra30pJCwgCgppbiB3aGljaCBjYXNlIGxldCAkaSQgYmUgdGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nIAoKXE5FV3t9ICRUKGFfMSwgXGxkb3RzICwgYV9uLCB4X3tuKzF9OiBhX3tuKzF9LCBcbGRvdHMgLCB4X3tuK2t9OiBhX3tuK2t9KSQuIAoKVGhlbjoKXGJlZ2lue2l0ZW1pemV9ClxpdGVtIElmIGR1cmluZyBleGVjdXRpb24gb2YgdGhlIHByb2dyYW0sIGEgY29uc3RhbnQgb2JqZWN0IGV4cHJlc3Npb24gaGFzIGFscmVhZHkgZXZhbHVhdGVkIHRvIGFuIGluc3RhbmNlICRqJCBvZiBjbGFzcyAkUiQgd2l0aCB0eXBlIGFyZ3VtZW50cyAkVl9pLCAxIFxsZSBpIFxsZSBtJCwgdGhlbjogClxiZWdpbntpdGVtaXplfQpcaXRlbSBGb3IgZWFjaCBpbnN0YW5jZSB2YXJpYWJsZSAkZiQgb2YgJGkkLCBsZXQgJHZfe2lmfSQgYmUgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCAkZiQgaW4gJGkkLCBhbmQgbGV0ICR2X3tqZn0kIGJlIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgJGYkIGluICRqJC4gSWYgIFxjb2Rle2lkZW50aWNhbCgkdl97aWZ9JCwgJHZfe2pmfSQpfSBmb3IgYWxsIGZpZWxkcyAkZiQgaW4gJGkkLCB0aGVuIHRoZSB2YWx1ZSBvZiAkZSQgaXMgJGokLCBvdGhlcndpc2UgdGhlIHZhbHVlIG9mICRlJCBpcyAkaSQuClxlbmR7aXRlbWl6ZX0KXGl0ZW0gT3RoZXJ3aXNlIHRoZSB2YWx1ZSBvZiAkZSQgaXMgJGkkLgpcZW5ke2l0ZW1pemV9CgpcY29tbWVudGFyeXsKSW4gb3RoZXIgd29yZHMsIGNvbnN0YW50IG9iamVjdHMgYXJlIGNhbm9uaWNhbGl6ZWQuICBJbiBvcmRlciB0byBkZXRlcm1pbmUgaWYgYW4gb2JqZWN0IGlzIGFjdHVhbGx5IG5ldywgb25lIGhhcyB0byBjb21wdXRlIGl0OyB0aGVuIGl0IGNhbiBiZSBjb21wYXJlZCB0byBhbnkgY2FjaGVkIGluc3RhbmNlcy4gSWYgYW4gZXF1aXZhbGVudCBvYmplY3QgZXhpc3RzIGluIHRoZSBjYWNoZSwgd2UgdGhyb3cgYXdheSB0aGUgbmV3bHkgY3JlYXRlZCBvYmplY3QgYW5kIHVzZSB0aGUgY2FjaGVkIG9uZS4gT2JqZWN0cyBhcmUgZXF1aXZhbGVudCBpZiB0aGV5IGhhdmUgaWRlbnRpY2FsIGZpZWxkcyBhbmQgaWRlbnRpY2FsIHR5cGUgYXJndW1lbnRzLiBTaW5jZSB0aGUgY29uc3RydWN0b3IgY2Fubm90IGluZHVjZSBhbnkgc2lkZSBlZmZlY3RzLCB0aGUgZXhlY3V0aW9uIG9mIHRoZSBjb25zdHJ1Y3RvciBpcyB1bm9ic2VydmFibGUuICBUaGUgY29uc3RydWN0b3IgbmVlZCBvbmx5IGJlIGV4ZWN1dGVkIG9uY2UgcGVyIGNhbGwgc2l0ZSwgYXQgY29tcGlsZS10aW1lLgp9CgpUaGUgc3RhdGljIHR5cGUgb2YgYSBjb25zdGFudCBvYmplY3QgZXhwcmVzc2lvbiBvZiBlaXRoZXIgdGhlIGZvcm0gCgpcQ09OU1R7fSAkVC5pZChhXzEsIFxsZG90cyAsIGFfbiwgeF97bisxfTogYV97bisxfSwgXGxkb3RzICwgeF97bitrfTogYV97bitrfSkkIAoKb3IgdGhlIGZvcm0gIAoKXENPTlNUe30gJFQoYV8xLCBcbGRvdHMgLCBhX24sIHhfe24rMX06IGFfe24rMX0sIFxsZG90cyAsIHhfe24ra306IGFfe24ra30pJCAKCmlzICRUJC4gSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiB0aGUgc3RhdGljIHR5cGUgb2YgJGFfaSwgMSBcbGUgaSBcbGUgbisgayQgbWF5IG5vdCBiZSBhc3NpZ25lZCB0byB0aGUgdHlwZSBvZiB0aGUgY29ycmVzcG9uZGluZyBmb3JtYWwgcGFyYW1ldGVyIG9mIHRoZSBjb25zdHJ1Y3RvciAkVC5pZCQgKHJlc3BlY3RpdmVseSAkVCQpLgoKSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgZXZhbHVhdGlvbiBvZiBhIGNvbnN0YW50IG9iamVjdCByZXN1bHRzIGluIGFuIHVuY2F1Z2h0IGV4Y2VwdGlvbiBiZWluZyB0aHJvd24uCgpcY29tbWVudGFyeXsKVG8gc2VlIGhvdyBzdWNoIHNpdHVhdGlvbnMgbWlnaHQgYXJpc2UsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgZXhhbXBsZXM6Cn0KClxiZWdpbntkYXJ0Q29kZX0KXENMQVNTe30gQSBcewogICBcRklOQUx7fSAgeDsKICAgXENPTlNUe30gQShwKTogeCA9IHAgKiAxMDsKXH0KClxDT05TVHt9IEEoIngiKTsgLy8gY29tcGlsZS10aW1lIGVycm9yClxDT05TVHt9IEEoNSk7IC8vIGxlZ2FsCgoKXENMQVNTe30gSW50UGFpciBcewogXENPTlNUe30gSW50UGFpcihcVEhJU3t9LngsIFxUSElTe30ueSk7CiBcRklOQUx7fSBpbnQgeDsKIFxGSU5BTHt9IGludCB5OwogXE9QRVJBVE9SICoodikgJD0+JCBcTkVXe30gSW50UGFpcih4KnYsIHkqdik7Clx9CgpcQ09OU1R7fSBBKFxDT05TVHt9IEludFBhaXIoMSwyKSk7IC8vIGNvbXBpbGUtdGltZSBlcnJvcjogaWxsZWdhbCBpbiBhIHN1YnRsZXIgd2F5ClxlbmR7ZGFydENvZGV9CgpcY29tbWVudGFyeXsKRHVlIHRvIHRoZSBydWxlcyBnb3Zlcm5pbmcgY29uc3RhbnQgY29uc3RydWN0b3JzLCBldmFsdWF0aW5nIHRoZSBjb25zdHJ1Y3RvciBcY29kZXtBKCl9IHdpdGggdGhlIGFyZ3VtZW50IFxjb2RleycneCcnfSBvciB0aGUgYXJndW1lbnQgXGNvZGV7XENPTlNUe30gSW50UGFpcigxLCAyKX0gd291bGQgY2F1c2UgaXQgdG8gdGhyb3cgYW4gZXhjZXB0aW9uLCByZXN1bHRpbmcgaW4gYSBjb21waWxlLXRpbWUgZXJyb3IuCn0KCgpHaXZlbiBhbiBpbnN0YW5jZSBjcmVhdGlvbiBleHByZXNzaW9uIG9mIHRoZSBmb3JtIFxDT05TVHt9ICRxKGFfMSwgXGxkb3RzICwgYV9uKSQgaXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiAkcSQgaXMgYSBjb25zdHJ1Y3RvciBvZiBhbiBhYnN0cmFjdCBjbGFzcyAgKFxyZWZ7YWJzdHJhY3RJbnN0YW5jZU1lbWJlcnN9KSBidXQgJHEkIGlzIG5vdCBhIGZhY3RvcnkgY29uc3RydWN0b3IuICAKCgpcc3Vic2VjdGlvbnsgU3Bhd25pbmcgYW4gSXNvbGF0ZX0KXGxhYmVse3NwYXduaW5nQW5Jc29sYXRlfQoKU3Bhd25pbmcgYW4gaXNvbGF0ZSBpcyBhY2NvbXBsaXNoZWQgdmlhIHdoYXQgaXMgc3ludGFjdGljYWxseSBhbiBvcmRpbmFyeSBsaWJyYXJ5IGNhbGwsIGludm9raW5nIG9uZSBvZiB0aGUgZnVuY3Rpb25zIFxjb2Rle3NwYXduVXJpKCl9IG9yIFxjb2Rle3NwYXduRnVuY3Rpb24oKX1kZWZpbmVkIGluIHRoZSBcY29kZXtkYXJ0Omlzb2xhdGV9IGxpYnJhcnkuIEhvd2V2ZXIsIHN1Y2ggY2FsbHMgIGhhdmUgdGhlICBzZW1hbnRpYyBlZmZlY3Qgb2YgY3JlYXRpbmcgYSBuZXcgaXNvbGF0ZSB3aXRoIGl0cyBvd24gbWVtb3J5IGFuZCB0aHJlYWQgb2YgY29udHJvbC4KCkFuIGlzb2xhdGUncyBtZW1vcnkgaXMgZmluaXRlLCBhcyBpcyB0aGUgc3BhY2UgYXZhaWxhYmxlIHRvIGl0cyB0aHJlYWQncyBjYWxsIHN0YWNrLiBJdCBpcyBwb3NzaWJsZSBmb3IgYSBydW5uaW5nIGlzb2xhdGUgdG8gZXhoYXVzdCBpdHMgbWVtb3J5IG9yIHN0YWNrLCByZXN1bHRpbmcgaW4gYSBydW4tdGltZSBlcnJvciB0aGF0IGNhbm5vdCBiZSBlZmZlY3RpdmVseSBjYXVnaHQsIHdoaWNoIHdpbGwgZm9yY2UgdGhlIGlzb2xhdGUgdG8gYmUgc3VzcGVuZGVkLgoKXGNvbW1lbnRhcnl7CkFzIGRpc2N1c3NlZCBpbiBzZWN0aW9uIFxyZWZ7ZXJyb3JzQW5kV2FybmluZ3N9LCB0aGUgaGFuZGxpbmcgb2YgYSBzdXNwZW5kZWQgaXNvbGF0ZSBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGVtYmVkZGVyLgp9CgoKClxzdWJzZWN0aW9ueyBGdW5jdGlvbiBJbnZvY2F0aW9ufQpcbGFiZWx7ZnVuY3Rpb25JbnZvY2F0aW9ufQogCkZ1bmN0aW9uIGludm9jYXRpb24gb2NjdXJzIGluIHRoZSBmb2xsb3dpbmcgY2FzZXM6IHdoZW4gYSBmdW5jdGlvbiBleHByZXNzaW9uICAoXHJlZntmdW5jdGlvbkV4cHJlc3Npb25zfSkgaXMgaW52b2tlZCAoXHJlZntmdW5jdGlvbkV4cHJlc3Npb25JbnZvY2F0aW9ufSksIHdoZW4gYSBtZXRob2QgKFxyZWZ7bWV0aG9kSW52b2NhdGlvbn0pLCBnZXR0ZXIgKFxyZWZ7dG9wTGV2ZWxHZXR0ZXJJbnZvY2F0aW9ufSwgXHJlZntwcm9wZXJ0eUV4dHJhY3Rpb259KSBvciBzZXR0ZXIgKFxyZWZ7YXNzaWdubWVudH0pIGlzIGludm9rZWQgb3Igd2hlbiBhIGNvbnN0cnVjdG9yIGlzIGludm9rZWQgKGVpdGhlciB2aWEgaW5zdGFuY2UgY3JlYXRpb24gKFxyZWZ7aW5zdGFuY2VDcmVhdGlvbn0pLCBjb25zdHJ1Y3RvciByZWRpcmVjdGlvbiAoXHJlZntyZWRpcmVjdGluZ0NvbnN0cnVjdG9yc30pIG9yIHN1cGVyIGluaXRpYWxpemF0aW9uKS4gVGhlIHZhcmlvdXMga2luZHMgb2YgZnVuY3Rpb24gaW52b2NhdGlvbiBkaWZmZXIgYXMgdG8gaG93IHRoZSBmdW5jdGlvbiB0byBiZSBpbnZva2VkLCAkZiQsICBpcyBkZXRlcm1pbmVkLCBhcyB3ZWxsIGFzIHdoZXRoZXIgXFRISVN7fSBpcyBib3VuZC4gT25jZSAkZiQgaGFzIGJlZW4gZGV0ZXJtaW5lZCwgdGhlIGZvcm1hbCBwYXJhbWV0ZXJzIG9mICRmJCBhcmUgYm91bmQgdG8gY29ycmVzcG9uZGluZyBhY3R1YWwgYXJndW1lbnRzLiBUaGUgYm9keSBvZiAkZiQgaXMgdGhlbiBleGVjdXRlZCB3aXRoIHRoZSBhZm9yZW1lbnRpb25lZCBiaW5kaW5ncy4gRXhlY3V0aW9uIG9mIHRoZSBib2R5IHRlcm1pbmF0ZXMgd2hlbiB0aGUgZmlyc3Qgb2YgdGhlIGZvbGxvd2luZyBvY2N1cnM6ClxiZWdpbntpdGVtaXplfQpcaXRlbSBBbiBleGNlcHRpb24gaXMgdGhyb3duIGFuZCBub3QgY2F1Z2h0IHdpdGhpbiB0aGUgY3VycmVudCBmdW5jdGlvbiBhY3RpdmF0aW9uLiAKXGl0ZW0gQSByZXR1cm4gc3RhdGVtZW50IChccmVme3JldHVybn0pIGltbWVkaWF0ZWx5IG5lc3RlZCBpbiB0aGUgYm9keSBvZiAkZiQgaXMgZXhlY3V0ZWQuClxpdGVtIFRoZSBsYXN0IHN0YXRlbWVudCBvZiB0aGUgYm9keSBjb21wbGV0ZXMgZXhlY3V0aW9uLgpcZW5ke2l0ZW1pemV9CgoKCgpcc3Vic3Vic2VjdGlvbnsgQWN0dWFsIEFyZ3VtZW50IExpc3QgRXZhbHVhdGlvbn0KXGxhYmVse2FjdHVhbEFyZ3VtZW50c30KCkZ1bmN0aW9uIGludm9jYXRpb24gaW52b2x2ZXMgZXZhbHVhdGlvbiBvZiB0aGUgbGlzdCBvZiBhY3R1YWwgYXJndW1lbnRzIHRvIHRoZSBmdW5jdGlvbiBhbmQgYmluZGluZyBvZiB0aGUgcmVzdWx0cyB0byB0aGUgZnVuY3Rpb25gcyBmb3JtYWwgcGFyYW1ldGVycy4KClxiZWdpbntncmFtbWFyfQp7XGJmIGFyZ3VtZW50czp9CiAgICAgIGAoJyBhcmd1bWVudExpc3Q/IGApJwogICAgLgoKe1xiZiBhcmd1bWVudExpc3Q6fW5hbWVkQXJndW1lbnQgKGAsJyBuYW1lZEFyZ3VtZW50KSo7CiAgJSAgICBleHByZXNzaW9uTGlzdCAnLCcgc3ByZWFkQXJndW1lbnQ7CiAgICAgIGV4cHJlc3Npb25MaXN0IChgLCcgbmFtZWRBcmd1bWVudCkqCiUgICAgICBzcHJlYWRBcmd1bWVudAogICAgLgoKe1xiZiBuYW1lZEFyZ3VtZW50On0KICAgICAgbGFiZWwgZXhwcmVzc2lvbiAlIGNvdWxkIGJlIHRvcCBsZXZlbCBleHByZXNzaW9uPwogICAgLgogXGVuZHtncmFtbWFyfQoKRXZhbHVhdGlvbiBvZiBhbiBhY3R1YWwgYXJndW1lbnQgbGlzdCBvZiB0aGUgZm9ybSAKCiQoYV8xLCBcbGRvdHMsIGFfbSwgcV8xOiBhX3ttKzF9LCBcbGRvdHMsIHFfbDogYV97bStsfSkkIAoKcHJvY2VlZHMgYXMgZm9sbG93czoKClRoZSBhcmd1bWVudHMgJGFfMSwgXGxkb3RzLCBhX3ttK2x9JCBhcmUgZXZhbHVhdGVkIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiB0aGUgcHJvZ3JhbSwgeWllbGRpbmcgb2JqZWN0cyAkb18xLCBcbGRvdHMsIG9fe20rbH0kLgoKXGNvbW1lbnRhcnl7U2ltcGx5IHN0YXRlZCwgYW4gYXJndW1lbnQgbGlzdCBjb25zaXN0aW5nIG9mICRtJCBwb3NpdGlvbmFsIGFyZ3VtZW50cyBhbmQgJGwkIG5hbWVkIGFyZ3VtZW50cyBpcyBldmFsdWF0ZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0Lgp9CgoKXHN1YnN1YnNlY3Rpb257IEJpbmRpbmcgQWN0dWFscyB0byBGb3JtYWxzfQpcbGFiZWx7YmluZGluZ0FjdHVhbHNUb0Zvcm1hbHN9CgpMZXQgJGYkIGJlIGEgZnVuY3Rpb24gd2l0aCAkaCQgcmVxdWlyZWQgcGFyYW1ldGVycywgIGxldCAkcF8xIFxsZG90cyBwX24kIGJlIHRoZSBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgb2YgJGYkIGFuZCBsZXQgJHBfe2grMX0sIFxsZG90cywgcF97aCtrfSQgYmUgdGhlIG9wdGlvbmFsIHBhcmFtZXRlcnMgZGVjbGFyZWQgYnkgJGYkLgoKQW4gZXZhbHVhdGVkIGFjdHVhbCBhcmd1bWVudCBsaXN0ICRvXzEgXGxkb3RzIG9fe20rbH0kIGRlcml2ZWQgZnJvbSBhbiBhY3R1YWwgYXJndW1lbnQgbGlzdCBvZiB0aGUgZm9ybSAkKGFfMSwgXGxkb3RzLCBhX20sIHFfMTogYV97bSsxfSwgXGxkb3RzLCBxX2w6IGFfe20rbH0pJCBpcyBib3VuZCB0byB0aGUgZm9ybWFsIHBhcmFtZXRlcnMgb2YgJGYkIGFzIGZvbGxvd3M6CgpcY29tbWVudGFyeXsKV2UgaGF2ZSBhbiBhcmd1bWVudCBsaXN0IGNvbnNpc3Rpbmcgb2YgJG0kIHBvc2l0aW9uYWwgYXJndW1lbnRzIGFuZCAkbCQgbmFtZWQgYXJndW1lbnRzLiBXZSBoYXZlIGEgZnVuY3Rpb24gd2l0aCAkaCQgcmVxdWlyZWQgcGFyYW1ldGVycyBhbmQgJGskIG9wdGlvbmFsIHBhcmFtZXRlcnMuIFRoZSBudW1iZXIgb2YgcG9zaXRpb25hbCBhcmd1bWVudHMgbXVzdCBiZSBhdCBsZWFzdCBhcyBsYXJnZSBhcyB0aGUgbnVtYmVyIG9mIHJlcXVpcmVkIHBhcmFtZXRlcnMsIGFuZCBubyBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIHBvc2l0aW9uYWwgcGFyYW1ldGVycy4gQWxsIG5hbWVkIGFyZ3VtZW50cyBtdXN0IGhhdmUgYSBjb3JyZXNwb25kaW5nIG5hbWVkIHBhcmFtZXRlci4gWW91IG1heSBub3QgcHJvdmlkZSBhIGdpdmVuIG5hbWVkIGFyZ3VtZW50IG1vcmUgdGhhbiBvbmNlLiAgSWYgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIGhhcyBubyBjb3JyZXNwb25kaW5nIGFyZ3VtZW50LCBpdCBnZXRzIGl0cyBkZWZhdWx0IHZhbHVlLiBJbiBjaGVja2VkIG1vZGUsIGFsbCBhcmd1bWVudHMgbXVzdCBiZWxvbmcgdG8gc3VidHlwZXMgb2YgdGhlIHR5cGUgb2YgdGhlaXIgY29ycmVzcG9uZGluZyBmb3JtYWwuCn0KClxjb21tZW50YXJ5ewpJZiAkbCA+IDAkLCB0aGVuIGl0IGlzIG5lY2Vzc2FyaWx5IHRoZSBjYXNlIHRoYXQgJG4gPSBoJCwgYmVjYXVzZSBhIG1ldGhvZCBjYW5ub3QgaGF2ZSBib3RoIG9wdGlvbmFsIHBvc2l0aW9uYWwgcGFyYW1ldGVycyBhbmQgbmFtZWQgcGFyYW1ldGVycy4KfQoKCklmICAkbSA8IGgkLCBvciAkbSA+IG4kLCBhIFxjZHtOb1N1Y2hNZXRob2RFcnJvcn0gaXMgdGhyb3duLiBGdXJ0aGVybW9yZSwgZWFjaCAkcV9pLCAxIFxsZSBpIFxsZSBsJCwgIG11c3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgbmFtZWQgcGFyYW1ldGVyIGluIHRoZSBzZXQgJFx7cF97bisxfSwgXGxkb3RzLCBwX3tuICtrfVx9JCBvciBhIFxjZHtOb1N1Y2hNZXRob2RFcnJvcn0gaXMgdGhyb3duLiBUaGVuICRwX2kkIGlzIGJvdW5kIHRvICRvX2ksIGkgXGluIDEuLiBtJCwgYW5kICRxX2okICBpcyBib3VuZCB0byAkb197bStqfSwgaiBcaW4gMS4uIGwkLiAgQWxsIHJlbWFpbmluZyBmb3JtYWwgcGFyYW1ldGVycyBvZiAkZiQgIGFyZSBib3VuZCB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4gCgpcY29tbWVudGFyeXtBbGwgb2YgdGhlc2UgcmVtYWluaW5nIHBhcmFtZXRlcnMgYXJlIG5lY2Vzc2FyaWx5IG9wdGlvbmFsIGFuZCB0aHVzIGhhdmUgZGVmYXVsdCB2YWx1ZXMufQoKSW4gY2hlY2tlZCBtb2RlLCBpdCBpcyBhIGR5bmFtaWMgdHlwZSBlcnJvciBpZiAgJG9faSQgaXMgbm90IFxOVUxMe30gYW5kIHRoZSBhY3R1YWwgdHlwZSAgKFxyZWZ7YWN0dWFsVHlwZU9mQURlY2xhcmF0aW9ufSkgb2YgJHBfaSQgaXMgbm90IGEgc3VwZXJ0eXBlIG9mIHRoZSB0eXBlIG9mICRvX2ksIGkgXGluIDEuLiBtJC4gSW4gY2hlY2tlZCBtb2RlLCBpdCBpcyBhIGR5bmFtaWMgdHlwZSBlcnJvciBpZiAgJG9fe20ran0kIGlzIG5vdCBcTlVMTHt9IGFuZCB0aGUgYWN0dWFsIHR5cGUgIChccmVme2FjdHVhbFR5cGVPZkFEZWNsYXJhdGlvbn0pIG9mICRxX2okIGlzIG5vdCBhIHN1cGVydHlwZSBvZiB0aGUgdHlwZSBvZiAkb197bStqfSwgaiBcaW4gMS4uIGwkLgoKSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgJHFfaSA9IHFfaiQgZm9yIGFueSAkaSBcbmUgaiQuCgpMZXQgJFRfaSQgYmUgdGhlIHN0YXRpYyB0eXBlIG9mICRhX2kkLCBsZXQgJFNfaSQgYmUgdGhlIHR5cGUgb2YgJHBfaSwgaSBcaW4gMSAuLiBoK2skIGFuZCBsZXQgJFNfcSQgYmUgdGhlIHR5cGUgb2YgdGhlIG5hbWVkIHBhcmFtZXRlciAkcSQgb2YgJGYkLiAgSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiAkVF9qJCBtYXkgbm90IGJlIGFzc2lnbmVkIHRvICRTX2osIGogXGluIDEuLm0kLiAgSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiAkbSA8IGgkIG9yIGlmICRtID4gbiQuIEZ1cnRoZXJtb3JlLCBlYWNoICRxX2ksIDEgXGxlIGkgXGxlIGwkLCAgbXVzdCBoYXZlIGEgY29ycmVzcG9uZGluZyBuYW1lZCBwYXJhbWV0ZXIgaW4gdGhlIHNldCAkXHtwX3tuKzF9LCBcbGRvdHMsIHBfe24gK2t9XH0kIG9yIGEgc3RhdGljIHdhcm5pbmcgb2NjdXJzLiAgSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiAkVF97bStqfSQgbWF5IG5vdCBiZSBhc3NpZ25lZCB0byAkU197cV9qfSwgaiBcaW4gMSAuLiBsJC4KClxzdWJzdWJzZWN0aW9ueyBVbnF1YWxpZmllZCBJbnZvY2F0aW9ufQpcbGFiZWx7dW5xdWFsaWZpZWRJbnZvY2F0aW9ufQoKQW4gdW5xdWFsaWZpZWQgZnVuY3Rpb24gaW52b2NhdGlvbiAkaSQgaGFzIHRoZSBmb3JtIAoKJGlkKGFfMSwgXGxkb3RzLCBhX24sIHhfe24rMX06IGFfe24rMX0sIFxsZG90cywgeF97bitrfTogYV97bitrfSkkLCAKCndoZXJlICRpZCQgaXMgYW4gaWRlbnRpZmllci4gCgpJZiB0aGVyZSBleGlzdHMgYSBsZXhpY2FsbHkgdmlzaWJsZSBkZWNsYXJhdGlvbiBuYW1lZCAkaWQkLCBsZXQgJGZfe2lkfSQgYmUgdGhlIGlubmVybW9zdCBzdWNoIGRlY2xhcmF0aW9uLiBUaGVuOgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0KIElmICRmX3tpZH0kIGlzIGEgbG9jYWwgZnVuY3Rpb24sIGEgbGlicmFyeSBmdW5jdGlvbiwgYSBsaWJyYXJ5IG9yIHN0YXRpYyBnZXR0ZXIgb3IgYSB2YXJpYWJsZSB0aGVuICRpJCBpcyBpbnRlcnByZXRlZCBhcyBhIGZ1bmN0aW9uIGV4cHJlc3Npb24gaW52b2NhdGlvbiAoXHJlZntmdW5jdGlvbkV4cHJlc3Npb25JbnZvY2F0aW9ufSkuCiBcaXRlbQpPdGhlcndpc2UsIGlmICRmX3tpZH0kIGlzIGEgc3RhdGljIG1ldGhvZCBvZiB0aGUgZW5jbG9zaW5nIGNsYXNzICRDJCwgJGkkIGlzIGVxdWl2YWxlbnQgdG8gJEMuaWQoYV8xLCBcbGRvdHMgLCBhX24sIHhfe24rMX06IGFfe24rMX0sIFxsZG90cyAsIHhfe24ra306IGFfe24ra30pJC4KXGl0ZW0gT3RoZXJ3aXNlLCAkZl97aWR9JCBpcyBjb25zaWRlcmVkIGVxdWl2YWxlbnQgdG8gdGhlIG9yZGluYXJ5IG1ldGhvZCBpbnZvY2F0aW9uICRcVEhJU3t9LmlkKGFfMSwgXGxkb3RzICwgYV9uLCB4X3tuKzF9OiBhX3tuKzF9LCBcbGRvdHMgLCB4X3tuK2t9OiBhX3tuK2t9KSQuClxlbmR7aXRlbWl6ZX0KCiVPdGhlcndpc2UsIGlmIHRoZXJlIGlzIGFuIGFjY2Vzc2libGUgKFxyZWZ7cHJpdmFjeX0pIHN0YXRpYyBtZXRob2QgbmFtZWQgJGlkJCBkZWNsYXJlZCBpbiBhIHN1cGVyY2xhc3MgJFMkIG9mIHRoZSBpbW1lZGlhdGVseSBlbmNsb3NpbmcgY2xhc3MgJEMkIHRoZW4gaSBpcyBlcXVpdmFsZW50IHRvIHRoZSBzdGF0aWMgbWV0aG9kIGludm9jYXRpb24gJFMuaWQoYV8xLCBcbGRvdHMsIGFfbiwgeF97bisxfTogYV97bisxfSwgXGxkb3RzLCB4X3tuK2t9OiBhX3tuK2t9KSQuICAKCiVccmF0aW9uYWxlewolVW5xdWFsaWZpZWQgYWNjZXNzIHRvIHN0YXRpYyBtZXRob2RzIG9mIHN1cGVyY2xhc3NlcyBpcyBpbmNvbnNpc3RlbnQgd2l0aCB0aGUgaWRlYSB0aGF0IHN0YXRpYyBtZXRob2RzIGFyZSBub3QgaW5oZXJpdGVkLiBJdCBpcyBub3QgcGFydGljdWxhcmx5IG5lY2Vzc2FyeSBhbmQgIG1heSBiZSByZXN0cmljdGVkIGluIGZ1dHVyZSB2ZXJzaW9ucy4KJX0KCk90aGVyd2lzZSwgaWYgJGkkIG9jY3VycyBpbnNpZGUgYSB0b3AgbGV2ZWwgb3Igc3RhdGljIGZ1bmN0aW9uIChiZSBpdCBmdW5jdGlvbiwgbWV0aG9kLCBnZXR0ZXIsICBvciBzZXR0ZXIpIG9yIHZhcmlhYmxlIGluaXRpYWxpemVyLCBldmFsdWF0aW9uIG9mICRpJCBjYXVzZXMgYSBcY2R7Tm9TdWNoTWV0aG9kRXJyb3J9IHRvIGJlIHRocm93bi4KCklmICRpJCBkb2VzIG5vdCBvY2N1ciBpbnNpZGUgYSB0b3AgbGV2ZWwgb3Igc3RhdGljIGZ1bmN0aW9uLCAkaSQgaXMgZXF1aXZhbGVudCB0byAkXFRISVN7fS5pZChhXzEsIFxsZG90cyAsIGFfbiwgeF97bisxfTogYV97bisxfSwgXGxkb3RzICwgeF97bitrfTogYV97bitrfSkkLgoKJSBTaG91bGQgYWxzbyBzYXk6CiUgSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiAkaSQgIG9jY3VycyBpbnNpZGUgYSB0b3AgbGV2ZWwgb3Igc3RhdGljIGZ1bmN0aW9uIChiZSBpdCBmdW5jdGlvbiwgbWV0aG9kLCBnZXR0ZXIsICBvciBzZXR0ZXIpIG9yIHZhcmlhYmxlIGluaXRpYWxpemVyIGFuZCB0aGVyZSBpcyBubyBsZXhpY2FsbHkgdmlzaWJsZSBkZWNsYXJhdGlvbiBuYW1lZCAkaWQkIGluIHNjb3BlLgoKCgoKClxzdWJzdWJzZWN0aW9ueyBGdW5jdGlvbiBFeHByZXNzaW9uIEludm9jYXRpb259ClxsYWJlbHtmdW5jdGlvbkV4cHJlc3Npb25JbnZvY2F0aW9ufQoKQSBmdW5jdGlvbiBleHByZXNzaW9uIGludm9jYXRpb24gJGkkIGhhcyB0aGUgZm9ybSAKCiRlX2YoYV8xLCBcbGRvdHMgLCBhX24sIHhfe24rMX06IGFfe24rMX0sIFxsZG90cyAsIHhfe24ra306IGFfe24ra30pJCwgCgp3aGVyZSAkZV9mJCBpcyBhbiBleHByZXNzaW9uLiBJZiAkZV9mJCBpcyBhbiBpZGVudGlmaWVyICRpZCQsIHRoZW4gJGlkJCBtdXN0IG5lY2Vzc2FyaWx5IGRlbm90ZSBhIGxvY2FsIGZ1bmN0aW9uLCBhIGxpYnJhcnkgZnVuY3Rpb24sIGEgbGlicmFyeSBvciBzdGF0aWMgZ2V0dGVyIG9yIGEgdmFyaWFibGUgYXMgZGVzY3JpYmVkIGFib3ZlLCBvciAkaSQgaXMgbm90IGNvbnNpZGVyZWQgYSBmdW5jdGlvbiBleHByZXNzaW9uIGludm9jYXRpb24uIElmICRlX2YkIGlzIGEgcHJvcGVydHkgZXh0cmFjdGlvbiBleHByZXNzaW9uIChccmVme3Byb3BlcnR5RXh0cmFjdGlvbn0pLCB0aGVuICRpJCBpcyBpcyBub3QgYSBmdW5jdGlvbiBleHByZXNzaW9uIGludm9jYXRpb24gYW5kIGlzIGluc3RlYWQgcmVjb2duaXplZCBhcyBhbiBvcmRpbmFyeSBtZXRob2QgaW52b2NhdGlvbiAoXHJlZntvcmRpbmFyeUludm9jYXRpb259KS4gCgpcY29tbWVudGFyeXsKXGNvZGV7JGEuYih4KSR9IGlzIHBhcnNlZCBhcyBhIG1ldGhvZCBpbnZvY2F0aW9uIG9mIG1ldGhvZCBcY29kZXskYigpJH0gb24gb2JqZWN0IFxjb2RleyRhJH0sIG5vdCBhcyBhbiBpbnZvY2F0aW9uIG9mIGdldHRlciBcY29kZXskYiR9IG9uIFxjb2RleyRhJH0gZm9sbG93ZWQgYnkgYSBmdW5jdGlvbiBjYWxsIFxjb2RleyQoYS5iKSh4KSR9LiAgSWYgYSBtZXRob2Qgb3IgZ2V0dGVyIFxjb2RleyRiJH0gZXhpc3RzLCB0aGUgdHdvIHdpbGwgYmUgZXF1aXZhbGVudC4gSG93ZXZlciwgaWYgXGNvZGV7JGIkfSBpcyBub3QgZGVmaW5lZCBvbiBcY29kZXskYSR9LCB0aGUgcmVzdWx0aW5nIGludm9jYXRpb24gb2YgXGNvZGV7bm9TdWNoTWV0aG9kKCl9IHdvdWxkIGRpZmZlci4gIFRoZSBcY29kZXtJbnZvY2F0aW9ufSBwYXNzZWQgdG8gXGNvZGV7bm9TdWNoTWV0aG9kKCl9IHdvdWxkIGRlc2NyaWJlIGEgY2FsbCB0byBhIG1ldGhvZCBcY29kZXskYiR9IHdpdGggYXJndW1lbnQgXGNvZGV7JHgkfSBpbiB0aGUgZm9ybWVyIGNhc2UsIGFuZCBhIGNhbGwgdG8gYSBnZXR0ZXIgXGNvZGV7JGIkfSAod2l0aCBubyBhcmd1bWVudHMpIGluIHRoZSBsYXR0ZXIuCn0KCk90aGVyd2lzZToKCkEgZnVuY3Rpb24gZXhwcmVzc2lvbiBpbnZvY2F0aW9uICRlX2YoYV8xLCBcbGRvdHMgLCBhX24sIHhfe24rMX06IGFfe24rMX0sIFxsZG90cyAsIHhfe24ra306IGFfe24ra30pJCBpcyBlcXVpdmFsZW50IHRvICRlX2YuY2FsbChhXzEsIFxsZG90cyAsIGFfbiwgeF97bisxfTogYV97bisxfSwgXGxkb3RzICwgeF97bitrfTogYV97bitrfSkkLgoKXGNvbW1lbnRhcnl7ClRoZSBpbXBsaWNhdGlvbiBvZiB0aGlzIGRlZmluaXRpb24sIGFuZCB0aGUgb3RoZXIgZGVmaW5pdGlvbnMgaW52b2x2aW5nIHRoZSBtZXRob2QgXGNvZGV7Y2FsbCgpfSwgaXMgdGhhdCB1c2VyIGRlZmluZWQgdHlwZXMgY2FuIGJlIHVzZWQgYXMgZnVuY3Rpb24gdmFsdWVzIHByb3ZpZGVkIHRoZXkgZGVmaW5lIGEgXENBTEx7fSBtZXRob2QuIFRoZSBtZXRob2QgXENBTEx7fSBpcyBzcGVjaWFsIGluIHRoaXMgcmVnYXJkLiBUaGUgc2lnbmF0dXJlIG9mIHRoZSBcQ0FMTHt9IG1ldGhvZCBkZXRlcm1pbmVzIHRoZSBzaWduYXR1cmUgdXNlZCB3aGVuIHVzaW5nIHRoZSBvYmplY3QgdmlhIHRoZSBidWlsdC1pbiBpbnZvY2F0aW9uIHN5bnRheC4KfQoKSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiB0aGUgc3RhdGljIHR5cGUgJEYkIG9mICRlX2YkIG1heSBub3QgYmUgYXNzaWduZWQgdG8gYSBmdW5jdGlvbiB0eXBlLiAgSWYgJEYkIGlzIG5vdCBhIGZ1bmN0aW9uIHR5cGUsIHRoZSBzdGF0aWMgdHlwZSBvZiAkaSQgaXMgXERZTkFNSUN7fS4gT3RoZXJ3aXNlIAp0aGUgc3RhdGljIHR5cGUgb2YgJGkkIGlzIHRoZSBkZWNsYXJlZCByZXR1cm4gdHlwZSBvZiAgJEYkLiAgCiVcaXRlbSBMZXQgJFRfaSQgYmUgdGhlIHN0YXRpYyB0eXBlIG9mICRhX2ksIGkgXGluIDEgLi4gbitrJC4gSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiAkRiQgaXMgbm90IGEgc3VwZXJ0eXBlIG9mICAkKFRfMSwgXGxkb3RzLCBUX24sIFtUX3tuKzF9JCAkeF97bisxfSwgXGxkb3RzLCBUX3tuK2t9JCAkeF97bitrfV0pIFx0byBcYm90JC4KJVxlbmR7aXRlbWl6ZX0KClxzdWJzZWN0aW9ue0xvb2t1cH0KClxzdWJzdWJzZWN0aW9ue01ldGhvZCBMb29rdXB9ClxsYWJlbHttZXRob2RMb29rdXB9CgpUaGUgcmVzdWx0IG9mIGEgbG9va3VwIG9mIGEgbWV0aG9kICRtJCBpbiBvYmplY3QgJG8kIHdpdGggcmVzcGVjdCB0byBsaWJyYXJ5ICRMJCBpcyB0aGUgcmVzdWx0IG9mICBhIGxvb2t1cCBvZiBtZXRob2QgJG0kIGluIGNsYXNzICRDJCB3aXRoIHJlc3BlY3QgdG8gbGlicmFyeSAkTCQsIHdoZXJlICRDJCBpcyB0aGUgY2xhc3Mgb2YgJG8kLgoKVGhlIHJlc3VsdCBvZiAgYSBsb29rdXAgb2YgbWV0aG9kICRtJCBpbiBjbGFzcyAkQyQgd2l0aCByZXNwZWN0IHRvIGxpYnJhcnkgJEwkIGlzOgpJZiAkQyQgZGVjbGFyZXMgYSBjb25jcmV0ZSBpbnN0YW5jZSBtZXRob2QgbmFtZWQgJG0kIHRoYXQgaXMgYWNjZXNzaWJsZSB0byAkTCQsICB0aGVuIHRoYXQgbWV0aG9kIGlzIHRoZSByZXN1bHQgb2YgdGhlIGxvb2t1cC4gT3RoZXJ3aXNlLCBpZiAkQyQgaGFzIGEgc3VwZXJjbGFzcyAkUyQsIHRoZW4gdGhlIHJlc3VsdCBvZiB0aGUgbG9va3VwIGlzIHRoZSByZXN1bHQgb2YgbG9va2luZyB1cCAkbSQgIGluICRTJCB3aXRoIHJlc3BlY3QgdG8gJEwkLiBPdGhlcndpc2UsIHdlIHNheSB0aGF0IHRoZSBtZXRob2QgbG9va3VwIGhhcyBmYWlsZWQuCgpccmF0aW9uYWxlIHsKVGhlIG1vdGl2YXRpb24gZm9yIHNraXBwaW5nIGFic3RyYWN0IG1lbWJlcnMgZHVyaW5nIGxvb2t1cCBpcyBsYXJnZWx5IHRvIGFsbG93IHNtb290aGVyIG1peGluIGNvbXBvc2l0aW9uLiAKfQoKClxzdWJzdWJzZWN0aW9ueyBHZXR0ZXIgYW5kIFNldHRlciBMb29rdXB9ClxsYWJlbHtnZXR0ZXJBbmRTZXR0ZXJMb29rdXB9CgpUaGUgcmVzdWx0IG9mIGEgbG9va3VwIG9mIGEgZ2V0dGVyIChyZXNwZWN0aXZlbHkgc2V0dGVyKSAkbSQgaW4gb2JqZWN0ICRvJCAgd2l0aCByZXNwZWN0ICB0byAgbGlicmFyeSAkTCQgaXMgdGhlIHJlc3VsdCBvZiBsb29raW5nIHVwIGdldHRlciAocmVzcGVjdGl2ZWx5IHNldHRlcikgJG0kIGluIGNsYXNzICRDJCB3aXRoIHJlc3BlY3QgdG8gJEwkLCB3aGVyZSAkQyQgaXMgdGhlIGNsYXNzIG9mICRvJC4KClRoZSByZXN1bHQgb2YgYSBsb29rdXAgb2YgYSBnZXR0ZXIgKHJlc3BlY3RpdmVseSBzZXR0ZXIpICRtJCBpbiBjbGFzcyAkQyQgIHdpdGggcmVzcGVjdCB0byBsaWJyYXJ5ICRMJCBpczoKSWYgJEMkIGRlY2xhcmVzIGEgY29uY3JldGUgaW5zdGFuY2UgZ2V0dGVyIChyZXNwZWN0aXZlbHkgc2V0dGVyKSBuYW1lZCAkbSQgIHRoYXQgaXMgYWNjZXNzaWJsZSB0byAkTCQsICB0aGVuIHRoYXQgZ2V0dGVyIChyZXNwZWN0aXZlbHkgc2V0dGVyKSBpcyB0aGUgcmVzdWx0IG9mIHRoZSBsb29rdXAuIE90aGVyd2lzZSwgaWYgJEMkIGhhcyBhIHN1cGVyY2xhc3MgJFMkLCB0aGVuIHRoZSByZXN1bHQgb2YgdGhlIGxvb2t1cCBpcyB0aGUgcmVzdWx0IG9mIGxvb2tpbmcgdXAgZ2V0dGVyIChyZXNwZWN0aXZlbHkgc2V0dGVyKSAkbSQgaW4gJFMkIHdpdGggcmVzcGVjdCB0byAkTCQuIE90aGVyd2lzZSwgd2Ugc2F5IHRoYXQgdGhlIGxvb2t1cCBoYXMgZmFpbGVkLgoKXHJhdGlvbmFsZSB7ClRoZSBtb3RpdmF0aW9uIGZvciBza2lwcGluZyBhYnN0cmFjdCBtZW1iZXJzIGR1cmluZyBsb29rdXAgaXMgbGFyZ2VseSB0byBhbGxvdyBzbW9vdGhlciBtaXhpbiBjb21wb3NpdGlvbi4gCn0KCgpcc3Vic2VjdGlvbntUb3AgbGV2ZWwgR2V0dGVyIEludm9jYXRpb259ClxsYWJlbHt0b3BMZXZlbEdldHRlckludm9jYXRpb259CgpFdmFsdWF0aW9uIG9mIGEgdG9wLWxldmVsIGdldHRlciBpbnZvY2F0aW9uICRpJCBvZiB0aGUgZm9ybSAkbSQsIHdoZXJlICRtJCBpcyBhbiBpZGVudGlmaWVyLCBwcm9jZWVkcyBhcyBmb2xsb3dzOgoKVGhlIGdldHRlciBmdW5jdGlvbiAkbSQgaXMgaW52b2tlZC4gVGhlIHZhbHVlIG9mICRpJCBpcyB0aGUgcmVzdWx0IHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBnZXR0ZXIgZnVuY3Rpb24uClxjb21tZW50YXJ5ewpOb3RlIHRoYXQgdGhlIGludm9jYXRpb24gaXMgYWx3YXlzIGRlZmluZWQuIFBlciB0aGUgcnVsZXMgZm9yIGlkZW50aWZpZXIgcmVmZXJlbmNlcywgYW4gaWRlbnRpZmllciB3aWxsIG5vdCBiZSB0cmVhdGVkIGFzIGEgdG9wLWxldmVsIGdldHRlciBpbnZvY2F0aW9uIHVubGVzcyB0aGUgZ2V0dGVyICRpJCBpcyBkZWZpbmVkLiAKfQoKVGhlIHN0YXRpYyB0eXBlIG9mICRpJCBpcyB0aGUgZGVjbGFyZWQgcmV0dXJuIHR5cGUgb2YgJG0kLgoKXHN1YnNlY3Rpb257IE1ldGhvZCBJbnZvY2F0aW9ufQpcbGFiZWx7bWV0aG9kSW52b2NhdGlvbn0KCk1ldGhvZCBpbnZvY2F0aW9uIGNhbiB0YWtlIHNldmVyYWwgZm9ybXMgYXMgc3BlY2lmaWVkIGJlbG93LiAKClxzdWJzdWJzZWN0aW9ue09yZGluYXJ5IEludm9jYXRpb259ClxsYWJlbHtvcmRpbmFyeUludm9jYXRpb259CgpBbiBvcmRpbmFyeSBtZXRob2QgaW52b2NhdGlvbiAkaSQgaGFzIHRoZSBmb3JtIAoKJG8ubShhXzEsIFxsZG90cyAsIGFfbiwgeF97bisxfTogYV97bisxfSwgXGxkb3RzICwgeF97bitrfTogYV97bitrfSkkLgoKRXZhbHVhdGlvbiBvZiBhbiBvcmRpbmFyeSBtZXRob2QgaW52b2NhdGlvbiAkaSQgb2YgdGhlIGZvcm0gCgokby5tKGFfMSwgXGxkb3RzICwgYV9uLCB4X3tuKzF9OiBhX3tuKzF9LCBcbGRvdHMgLCB4X3tuK2t9OiBhX3tuK2t9KSQgCgpwcm9jZWVkcyBhcyBmb2xsb3dzOgoKRmlyc3QsIHRoZSBleHByZXNzaW9uICRvJCBpcyBldmFsdWF0ZWQgdG8gYSB2YWx1ZSAkdl9vJC4gTmV4dCwgdGhlIGFyZ3VtZW50IGxpc3QgJChhXzEsIFxsZG90cyAsIGFfbiwgeF97bisxfTogYV97bisxfSwgXGxkb3RzICwgeF97bitrfTogYV97bitrfSkkIGlzIGV2YWx1YXRlZCB5aWVsZGluZyBhY3R1YWwgYXJndW1lbnQgb2JqZWN0cyAkb18xLCBcbGRvdHMgLCBvX3tuK2t9JC4gTGV0ICRmJCBiZSB0aGUgcmVzdWx0IG9mIGxvb2tpbmcgdXAgKFxyZWZ7bWV0aG9kTG9va3VwfSkgbWV0aG9kICRtJCAgaW4gJHZfbyQgd2l0aCByZXNwZWN0IHRvIHRoZSBjdXJyZW50IGxpYnJhcnkgJEwkLiAKCkxldCAkcF8xIFxsZG90cyBwX2gkIGJlIHRoZSByZXF1aXJlZCBwYXJhbWV0ZXJzIG9mICRmJCwgIGxldCAkcF8xIFxsZG90cyBwX20kIGJlIHRoZSBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgb2YgJGYkIGFuZCBsZXQgJHBfe2grMX0sIFxsZG90cywgcF97aCtsfSQgYmUgdGhlIG9wdGlvbmFsIHBhcmFtZXRlcnMgZGVjbGFyZWQgYnkgJGYkLgoKXGNvbW1lbnRhcnl7CldlIGhhdmUgYW4gYXJndW1lbnQgbGlzdCBjb25zaXN0aW5nIG9mICRuJCBwb3NpdGlvbmFsIGFyZ3VtZW50cyBhbmQgJGskIG5hbWVkIGFyZ3VtZW50cy4gV2UgaGF2ZSBhIGZ1bmN0aW9uIHdpdGggJGgkIHJlcXVpcmVkIHBhcmFtZXRlcnMgYW5kICRsJCBvcHRpb25hbCBwYXJhbWV0ZXJzLiBUaGUgbnVtYmVyIG9mIHBvc2l0aW9uYWwgYXJndW1lbnRzIG11c3QgYmUgYXQgbGVhc3QgYXMgbGFyZ2UgYXMgdGhlIG51bWJlciBvZiByZXF1aXJlZCBwYXJhbWV0ZXJzLCBhbmQgbm8gbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiBwb3NpdGlvbmFsIHBhcmFtZXRlcnMuIEFsbCBuYW1lZCBhcmd1bWVudHMgbXVzdCBoYXZlIGEgY29ycmVzcG9uZGluZyBuYW1lZCBwYXJhbWV0ZXIuIAp9CgpJZiAgJG4gPCBoJCwgb3IgJG4gPiBtJCwgdGhlIG1ldGhvZCBsb29rdXAgaGFzIGZhaWxlZC4gRnVydGhlcm1vcmUsIGVhY2ggJHhfaSwgbisxIFxsZSBpIFxsZSBuK2skLCAgbXVzdCBoYXZlIGEgY29ycmVzcG9uZGluZyBuYW1lZCBwYXJhbWV0ZXIgaW4gdGhlIHNldCAkXHtwX3ttKzF9LCBcbGRvdHMsIHBfe2grbH1cfSQgb3IgdGhlIG1ldGhvZCBsb29rdXAgYWxzbyBmYWlscy4gIElmICR2X28kIGlzIGFuIGluc3RhbmNlIG9mIFxjb2Rle1R5cGV9IGJ1dCAkbyQgaXMgbm90IGEgY29uc3RhbnQgdHlwZSBsaXRlcmFsLCB0aGVuIGlmICRtJCBpcyBhIG1ldGhvZCB0aGF0IGZvcndhcmRzIChccmVme2Z1bmN0aW9uRGVjbGFyYXRpb25zfSkgdG8gYSBzdGF0aWMgbWV0aG9kLCBtZXRob2QgbG9va3VwIGZhaWxzLiBPdGhlcndpc2UgbWV0aG9kIGxvb2t1cCBoYXMgc3VjY2VlZGVkLgoKSWYgdGhlIG1ldGhvZCBsb29rdXAgc3VjY2VlZGVkLCB0aGUgYm9keSBvZiAkZiQgaXMgZXhlY3V0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBiaW5kaW5ncyB0aGF0IHJlc3VsdGVkIGZyb20gdGhlIGV2YWx1YXRpb24gb2YgdGhlIGFyZ3VtZW50IGxpc3QsIGFuZCB3aXRoIFxUSElTe30gYm91bmQgdG8gJHZfbyQuIFRoZSB2YWx1ZSBvZiAkaSQgaXMgdGhlIHZhbHVlIHJldHVybmVkIGFmdGVyICRmJCBpcyBleGVjdXRlZC4KCklmIHRoZSBtZXRob2QgbG9va3VwIGhhcyBmYWlsZWQsIHRoZW4gbGV0ICRnJCBiZSB0aGUgcmVzdWx0IG9mIGxvb2tpbmcgdXAgZ2V0dGVyIChccmVme2dldHRlckFuZFNldHRlckxvb2t1cH0pICRtJCBpbiAkdl9vJCB3aXRoIHJlc3BlY3QgdG8gJEwkLiAKZiAkdl9vJCBpcyBhbiBpbnN0YW5jZSBvZiBcY29kZXtUeXBlfSBidXQgJG8kIGlzIG5vdCBhIGNvbnN0YW50IHR5cGUgbGl0ZXJhbCwgdGhlbiBpZiAkZyQgaXMgYSBnZXR0ZXIgdGhhdCBmb3J3YXJkcyB0byBhIHN0YXRpYyBnZXR0ZXIsIGdldHRlciBsb29rdXAgZmFpbHMuCklmIHRoZSBnZXR0ZXIgbG9va3VwIHN1Y2NlZWRlZCwgbGV0ICR2X2ckIGJlIHRoZSB2YWx1ZSBvZiB0aGUgZ2V0dGVyIGludm9jYXRpb24gJG8ubSQuIFRoZW4gdGhlIHZhbHVlIG9mICRpJCBpcyB0aGUgcmVzdWx0IG9mIGludm9raW5nIAp0aGUgc3RhdGljIG1ldGhvZCBcY29kZXtGdW5jdGlvbi5hcHBseSgpfSB3aXRoIGFyZ3VtZW50cyAkdi5nLCBbb18xLCBcbGRvdHMgLCBvX25dLCBce3hfe24rMX06IG9fe24rMX0sIFxsZG90cyAsIHhfe24ra306IG9fe24ra31cfSQuCgpJZiAgZ2V0dGVyIGxvb2t1cCBoYXMgYWxzbyBmYWlsZWQsIHRoZW4gYSBuZXcgaW5zdGFuY2UgJGltJCAgb2YgdGhlIHByZWRlZmluZWQgY2xhc3MgIFxjb2Rle0ludm9jYXRpb259ICBpcyBjcmVhdGVkLCBzdWNoIHRoYXQgOgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gIFxjb2Rle2ltLmlzTWV0aG9kfSBldmFsdWF0ZXMgdG8gXGNvZGV7XFRSVUV7fX0uClxpdGVtICBcY29kZXtpbS5tZW1iZXJOYW1lfSBldmFsdWF0ZXMgdG8gXGNvZGV7J20nfS4KXGl0ZW0gXGNvZGV7aW0ucG9zaXRpb25hbEFyZ3VtZW50c30gZXZhbHVhdGVzIHRvIGFuIGltbXV0YWJsZSBsaXN0IHdpdGggdGhlIHNhbWUgdmFsdWVzIGFzICBcY29kZXtbJG9fMSwgXGxkb3RzLCBvX24kXX0uClxpdGVtIFxjb2Rle2ltLm5hbWVkQXJndW1lbnRzfSBldmFsdWF0ZXMgdG8gYW4gaW1tdXRhYmxlIG1hcCB3aXRoIHRoZSBzYW1lIGtleXMgYW5kIHZhbHVlcyBhcyBcY29kZXtceyR4X3tuKzF9OiBvX3tuKzF9LCBcbGRvdHMsIHhfe24ra30gOiBvX3tuK2t9JFx9fS4KXGVuZHtpdGVtaXplfQoKVGhlbiB0aGUgbWV0aG9kIFxjb2Rle25vU3VjaE1ldGhvZCgpfSBpcyBsb29rZWQgdXAgaW4gJHZfbyQgYW5kIGludm9rZWQgd2l0aCBhcmd1bWVudCAkaW0kLCBhbmQgdGhlIHJlc3VsdCBvZiB0aGlzIGludm9jYXRpb24gaXMgdGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nICRpJC4gSG93ZXZlciwgaWYgdGhlIGltcGxlbWVudGF0aW9uIGZvdW5kIGNhbm5vdCBiZSBpbnZva2VkIHdpdGggYSBzaW5nbGUgcG9zaXRpb25hbCBhcmd1bWVudCwgdGhlIGltcGxlbWVudGF0aW9uICBvZiBcY29kZXtub1N1Y2hNZXRob2QoKX0gaW4gY2xhc3MgXGNvZGV7T2JqZWN0fSBpcyBpbnZva2VkIG9uICR2X28kIHdpdGggYXJndW1lbnQgJGltJyQsIHdoZXJlICRpbSckIGlzIGFuIGluc3RhbmNlIG9mIFxjb2Rle0ludm9jYXRpb259IHN1Y2ggdGhhdCA6ClxiZWdpbntpdGVtaXplfQpcaXRlbSAgXGNvZGV7aW0uaXNNZXRob2R9IGV2YWx1YXRlcyB0byBcY29kZXtcVFJVRXt9fS4KXGl0ZW0gIFxjb2Rle2ltLm1lbWJlck5hbWV9IGV2YWx1YXRlcyB0byBcY29kZXtub1N1Y2hNZXRob2QnfS4KXGl0ZW0gXGNvZGV7aW0ucG9zaXRpb25hbEFyZ3VtZW50c30gZXZhbHVhdGVzIHRvIGFuIGltbXV0YWJsZSBsaXN0IHdob3NlIHNvbGUgZWxlbWVudCBpcyAgJGltJC4KXGl0ZW0gXGNvZGV7aW0ubmFtZWRBcmd1bWVudHN9IGV2YWx1YXRlcyB0byB0aGUgdmFsdWUgb2YgXGNvZGV7XENPTlNUe30gXHtcfX0uClxlbmR7aXRlbWl6ZX0KCmFuZCB0aGUgcmVzdWx0IG9mIHRoZSBsYXR0ZXIgaW52b2NhdGlvbiBpcyB0aGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgJGkkLgoKXHJhdGlvbmFsZSB7Ckl0IGlzIHBvc3NpYmxlIHRvIGJyaW5nIGFib3V0IHN1Y2ggYSBzaXR1YXRpb24gYnkgb3ZlcnJpZGluZyBcY29kZXtub1N1Y2hNZXRob2QoKX0gd2l0aCB0aGUgd3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50czp9CgpcYmVnaW57Y29kZX0KXENMQVNTe30gUGVydmVyc2UgXHsKICAgIG5vU3VjaE1ldGhvZCh4LHkpID0kPiQgeCArIHk7Clx9CgpcTkVXe30gUGVydmVyc2UudW5rbm93bk1ldGhvZCgpOyAKXGVuZHtjb2RlfQoKXGNvbW1lbnRhcnl7Tm90aWNlIHRoYXQgdGhlIHdvcmRpbmcgY2FyZWZ1bGx5IGF2b2lkcyByZS1ldmFsdWF0aW5nIHRoZSByZWNlaXZlciAkbyQgYW5kIHRoZSBhcmd1bWVudHMgJGFfaSQuIH0KCkxldCAkVCQgYmUgdGhlICBzdGF0aWMgdHlwZSBvZiAkbyQuIEl0IGlzIGEgc3RhdGljIHR5cGUgd2FybmluZyBpZiAkVCQgZG9lcyBub3QgaGF2ZSBhbiBhY2Nlc3NpYmxlICAoXHJlZntwcml2YWN5fSkgaW5zdGFuY2UgbWVtYmVyIG5hbWVkICRtJCB1bmxlc3MgIGVpdGhlcjoKXGJlZ2lue2l0ZW1pemV9ClxpdGVtCiRUJCBvciBhIHN1cGVyaW50ZXJmYWNlIG9mICRUJCBpcyBhbm5vdGF0ZWQgd2l0aCBhbiBhbm5vdGF0aW9uIGRlbm90aW5nIGEgY29uc3RhbnQgaWRlbnRpY2FsIHRvIHRoZSBjb25zdGFudCBcY29kZXtAcHJveHl9IGRlZmluZWQgaW4gXGNvZGV7ZGFydDpjb3JlfS4gIE9yClxpdGVtICAkVCQgaXMgXGNvZGV7VHlwZX0sICRlJCBpcyBhIGNvbnN0YW50IHR5cGUgbGl0ZXJhbCBhbmQgdGhlIGNsYXNzIGNvcnJlc3BvbmRpbmcgdG8gJGUkIGhhcyBhIHN0YXRpYyBnZXR0ZXIgbmFtZWQgJG0kLgpcZW5ke2l0ZW1pemV9CgpJZiAkVC5tJCBleGlzdHMsIGl0ICBpcyBhIHN0YXRpYyB0eXBlIHdhcm5pbmcgaWYgdGhlIHR5cGUgJEYkIG9mICRULm0kIG1heSBub3QgYmUgYXNzaWduZWQgdG8gYSBmdW5jdGlvbiB0eXBlLiBJZiAkVC5tJCBkb2VzIG5vdCBleGlzdCwgb3IgaWYgJEYkIGlzIG5vdCBhIGZ1bmN0aW9uIHR5cGUsIHRoZSBzdGF0aWMgdHlwZSBvZiAkaSQgaXMgXERZTkFNSUN7fTsgb3RoZXJ3aXNlIHRoZSBzdGF0aWMgdHlwZSBvZiAkaSQgaXMgdGhlIGRlY2xhcmVkIHJldHVybiB0eXBlIG9mICAkRiQuICAKCkl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIHRvIGludm9rZSBhbnkgb2YgdGhlIG1ldGhvZHMgb2YgY2xhc3MgXGNke09iamVjdH0gb24gYSBwcmVmaXggb2JqZWN0IChccmVme2ltcG9ydHN9KSBvciBvbiBhIGNvbnN0YW50IHR5cGUgbGl0ZXJhbCB0aGF0IGlzICBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSB0aGUgdG9rZW4gYC4nLgoKClxzdWJzdWJzZWN0aW9ue0Nhc2NhZGVkIEludm9jYXRpb25zfQpcbGFiZWx7Y2FzY2FkZWRJbnZvY2F0aW9uc30KCkEge1xlbSBjYXNjYWRlZCBtZXRob2QgaW52b2NhdGlvbn0gaGFzIHRoZSBmb3JtIHtcZW0gZS4uc3VmZml4fQp3aGVyZSAkZSQgaXMgYW4gZXhwcmVzc2lvbiBhbmQge1xlbSBzdWZmaXh9IGlzIGEgc2VxdWVuY2Ugb2Ygb3BlcmF0b3IsIG1ldGhvZCwgZ2V0dGVyIG9yIHNldHRlciBpbnZvY2F0aW9ucy4KClxiZWdpbntncmFtbWFyfQp7XGJmIGNhc2NhZGVTZWN0aW9uOn0KICAgICAgYHtcZXNjYXBlZ3JhbW1hciAuLn0nIChjYXNjYWRlU2VsZWN0b3IgYXJndW1lbnRzKikgKGFzc2lnbmFibGVTZWxlY3RvciBhcmd1bWVudHMqKSogKGFzc2lnbm1lbnRPcGVyYXRvciBleHByZXNzaW9uV2l0aG91dENhc2NhZGUpPwogICAgICAuCiAgICAgCntcYmYgY2FzY2FkZVNlbGVjdG9yOn1gWycgIGV4cHJlc3Npb24gYF0nOwogICAgICBpZGVudGlmaWVyCiAgICAgIC4KXGVuZHtncmFtbWFyfQoKQSBjYXNjYWRlZCBtZXRob2QgaW52b2NhdGlvbiBleHByZXNzaW9uIG9mIHRoZSBmb3JtIHtcZW0gZS4uc3VmZml4fSBpcyBlcXVpdmFsZW50IHRvIHRoZSBleHByZXNzaW9uIFxjb2Rleyh0KVx7dC57XGVtIHN1ZmZpeH07IFxSRVRVUk57fSB0O1x9KCRlJCl9LgoKXHN1YnN1YnNlY3Rpb257U3VwZXIgSW52b2NhdGlvbn0KXGxhYmVse3N1cGVySW52b2NhdGlvbn0KCkEgc3VwZXIgbWV0aG9kIGludm9jYXRpb24gJGkkIGhhcyB0aGUgZm9ybSAKCiRcU1VQRVJ7fS5tKGFfMSwgXGxkb3RzICwgYV9uLCB4X3tuKzF9OiBhX3tuKzF9LCBcbGRvdHMgLCB4X3tuK2t9OiBhX3tuK2t9KSQuCgpFdmFsdWF0aW9uIG9mICRpJCBwcm9jZWVkcyBhcyBmb2xsb3dzOgoKRmlyc3QsIHRoZSBhcmd1bWVudCBsaXN0ICQoYV8xLCBcbGRvdHMgLCBhX24sIHhfe24rMX06IGFfe24rMX0sIFxsZG90cyAsIHhfe24ra306IGFfe24ra30pJCBpcyBldmFsdWF0ZWQgIHlpZWxkaW5nIGFjdHVhbCBhcmd1bWVudCBvYmplY3RzICRvXzEsIFxsZG90cyAsIG9fe24ra30kLiBMZXQgJFMkIGJlIHRoZSBzdXBlcmNsYXNzIG9mIHRoZSBpbW1lZGlhdGVseSBlbmNsb3NpbmcgY2xhc3MsIGFuZCBsZXQgJGYkIGJlIHRoZSByZXN1bHQgb2YgbG9va2luZyB1cCBtZXRob2QgKFxyZWZ7b3JkaW5hcnlJbnZvY2F0aW9ufSkgICRtJCBpbiAkUyQgIHdpdGggcmVzcGVjdCB0byB0aGUgY3VycmVudCBsaWJyYXJ5ICRMJC4gCkxldCAkcF8xIFxsZG90cyBwX2gkIGJlIHRoZSByZXF1aXJlZCBwYXJhbWV0ZXJzIG9mICRmJCwgIGxldCAkcF8xIFxsZG90cyBwX20kIGJlIHRoZSBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgb2YgJGYkIGFuZCBsZXQgJHBfe2grMX0sIFxsZG90cywgcF97aCtsfSQgYmUgdGhlIG9wdGlvbmFsIHBhcmFtZXRlcnMgZGVjbGFyZWQgYnkgJGYkLgoKSWYgICRuIDwgaCQsIG9yICRuID4gbSQsIHRoZSBtZXRob2QgbG9va3VwIGhhcyBmYWlsZWQuIEZ1cnRoZXJtb3JlLCBlYWNoICR4X2ksIG4rMSBcbGUgaSBcbGUgbitrJCwgIG11c3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgbmFtZWQgcGFyYW1ldGVyIGluIHRoZSBzZXQgJFx7cF97bSsxfSwgXGxkb3RzLCBwX3toK2x9XH0kIG9yIHRoZSBtZXRob2QgbG9va3VwIGFsc28gZmFpbHMuICBPdGhlcndpc2UgbWV0aG9kIGxvb2t1cCBoYXMgc3VjY2VlZGVkLgoKSWYgdGhlIG1ldGhvZCBsb29rdXAgc3VjY2VlZGVkLCB0aGUgYm9keSBvZiAkZiQgaXMgZXhlY3V0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBiaW5kaW5ncyB0aGF0IHJlc3VsdGVkIGZyb20gdGhlIGV2YWx1YXRpb24gb2YgdGhlIGFyZ3VtZW50IGxpc3QsIGFuZCB3aXRoIFxUSElTe30gYm91bmQgdG8gdGhlIGN1cnJlbnQgdmFsdWUgb2YgXFRISVN7fS4gVGhlIHZhbHVlIG9mICRpJCBpcyB0aGUgdmFsdWUgcmV0dXJuZWQgYWZ0ZXIgJGYkIGlzIGV4ZWN1dGVkLgoKSWYgdGhlIG1ldGhvZCBsb29rdXAgaGFzIGZhaWxlZCwgdGhlbiBsZXQgJGckIGJlIHRoZSByZXN1bHQgb2YgbG9va2luZyB1cCBnZXR0ZXIgKFxyZWZ7Z2V0dGVyQW5kU2V0dGVyTG9va3VwfSkgJG0kIGluICRTJCB3aXRoIHJlc3BlY3QgdG8gJEwkLiBJZiB0aGUgZ2V0dGVyIGxvb2t1cCBzdWNjZWVkZWQsIGxldCAkdl9nJCBiZSB0aGUgdmFsdWUgb2YgdGhlIGdldHRlciBpbnZvY2F0aW9uICRcU1VQRVJ7fS5tJC4gVGhlbiB0aGUgdmFsdWUgb2YgJGkkIGlzIHRoZSByZXN1bHQgb2YgaW52b2tpbmcgCnRoZSBzdGF0aWMgbWV0aG9kIFxjb2Rle0Z1bmN0aW9uLmFwcGx5KCl9IHdpdGggYXJndW1lbnRzICR2LmcsIFtvXzEsIFxsZG90cyAsIG9fbl0sIFx7eF97bisxfTogb197bisxfSwgXGxkb3RzICwgeF97bitrfTogb197bitrfVx9JC4KIApJZiAgZ2V0dGVyIGxvb2t1cCBoYXMgYWxzbyBmYWlsZWQsIHRoZW4gYSBuZXcgaW5zdGFuY2UgJGltJCAgb2YgdGhlIHByZWRlZmluZWQgY2xhc3MgIFxjb2Rle0ludm9jYXRpb259ICBpcyBjcmVhdGVkLCBzdWNoIHRoYXQgOgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gIFxjb2Rle2ltLmlzTWV0aG9kfSBldmFsdWF0ZXMgdG8gXGNvZGV7XFRSVUV7fX0uClxpdGVtICBcY29kZXtpbS5tZW1iZXJOYW1lfSBldmFsdWF0ZXMgdG8gXGNvZGV7J20nfS4KXGl0ZW0gXGNvZGV7aW0ucG9zaXRpb25hbEFyZ3VtZW50c30gZXZhbHVhdGVzIHRvIGFuIGltbXV0YWJsZSBsaXN0IHdpdGggdGhlIHNhbWUgIHZhbHVlcyBhcyAgXGNvZGV7WyRvXzEsIFxsZG90cywgb19uJF19LgpcaXRlbSBcY29kZXtpbS5uYW1lZEFyZ3VtZW50c30gZXZhbHVhdGVzIHRvIGFuIGltbXV0YWJsZSBtYXAgd2l0aCB0aGUgc2FtZSBrZXlzIGFuZCB2YWx1ZXMgYXMgXGNvZGV7XHskeF97bisxfTogb197bisxfSwgXGxkb3RzLCB4X3tuK2t9IDogb197bitrfSRcfX0uClxlbmR7aXRlbWl6ZX0KVGhlbiB0aGUgbWV0aG9kIFxjb2Rle25vU3VjaE1ldGhvZCgpfSBpcyBsb29rZWQgdXAgaW4gJFMkIGFuZCBpbnZva2VkIG9uIFxUSElTe30gd2l0aCBhcmd1bWVudCAkaW0kLCBhbmQgdGhlIHJlc3VsdCBvZiB0aGlzIGludm9jYXRpb24gaXMgdGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nICRpJC4gSG93ZXZlciwgaWYgdGhlIGltcGxlbWVudGF0aW9uIGZvdW5kIGNhbm5vdCBiZSBpbnZva2VkIHdpdGggYSBzaW5nbGUgcG9zaXRpb25hbCBhcmd1bWVudCwgdGhlIGltcGxlbWVudGF0aW9uICBvZiBcY29kZXtub1N1Y2hNZXRob2QoKX0gaW4gY2xhc3MgXGNvZGV7T2JqZWN0fSBpcyBpbnZva2VkIG9uIFxUSElTe30gd2l0aCBhcmd1bWVudCAkaW0nJCwgd2hlcmUgJGltJyQgaXMgYW4gaW5zdGFuY2Ugb2YgXGNvZGV7SW52b2NhdGlvbn0gc3VjaCB0aGF0IDoKXGJlZ2lue2l0ZW1pemV9ClxpdGVtICBcY29kZXtpbS5pc01ldGhvZH0gZXZhbHVhdGVzIHRvIFxjb2Rle1xUUlVFe319LgpcaXRlbSAgXGNvZGV7aW0ubWVtYmVyTmFtZX0gZXZhbHVhdGVzIHRvIFxjb2Rle25vU3VjaE1ldGhvZH0uClxpdGVtIFxjb2Rle2ltLnBvc2l0aW9uYWxBcmd1bWVudHN9IGV2YWx1YXRlcyB0byBhbiBpbW11dGFibGUgbGlzdCB3aG9zZSBzb2xlIGVsZW1lbnQgaXMgICRpbSQuClxpdGVtIFxjb2Rle2ltLm5hbWVkQXJndW1lbnRzfSBldmFsdWF0ZXMgdG8gdGhlIHZhbHVlIG9mIFxjb2Rle1xDT05TVHt9IFx7XH19LgpcZW5ke2l0ZW1pemV9CgphbmQgdGhlIHJlc3VsdCBvZiB0aGlzIGxhdHRlciBpbnZvY2F0aW9uIGlzIHRoZSByZXN1bHQgb2YgZXZhbHVhdGluZyAkaSQuCgoKSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgYSBzdXBlciBtZXRob2QgaW52b2NhdGlvbiBvY2N1cnMgaW4gYSB0b3AtbGV2ZWwgZnVuY3Rpb24gb3IgdmFyaWFibGUgaW5pdGlhbGl6ZXIsIGluIGFuIGluc3RhbmNlIHZhcmlhYmxlIGluaXRpYWxpemVyIG9yIGluaXRpYWxpemVyIGxpc3QsIGluIGNsYXNzIFxjb2Rle09iamVjdH0sIGluIGEgZmFjdG9yeSBjb25zdHJ1Y3RvciBvciBpbiBhIHN0YXRpYyBtZXRob2Qgb3IgdmFyaWFibGUgaW5pdGlhbGl6ZXIuCgpJdCBpcyBhIHN0YXRpYyB0eXBlIHdhcm5pbmcgaWYgJFMkIGRvZXMgbm90IGhhdmUgYW4gYWNjZXNzaWJsZSAoXHJlZntwcml2YWN5fSkgaW5zdGFuY2UgbWVtYmVyIG5hbWVkICRtJCB1bmxlc3MgJFMkIG9yIGEgc3VwZXJpbnRlcmZhY2Ugb2YgJFMkIGlzIGFubm90YXRlZCB3aXRoIGFuIGFubm90YXRpb24gZGVub3RpbmcgYSBjb25zdGFudCBpZGVudGljYWwgdG8gdGhlIGNvbnN0YW50IFxjb2Rle0Bwcm94eX0gZGVmaW5lZCBpbiBcY29kZXtkYXJ0OmNvcmV9LiBJZiAkUy5tJCBleGlzdHMsIGl0ICBpcyBhIHN0YXRpYyB0eXBlIHdhcm5pbmcgaWYgdGhlIHR5cGUgJEYkIG9mICRTLm0kIG1heSBub3QgYmUgYXNzaWduZWQgdG8gYSBmdW5jdGlvbiB0eXBlLiBJZiAkUy5tJCBkb2VzIG5vdCBleGlzdCwgb3IgaWYgJEYkIGlzIG5vdCBhIGZ1bmN0aW9uIHR5cGUsIHRoZSBzdGF0aWMgdHlwZSBvZiAkaSQgaXMgXERZTkFNSUN7fTsgb3RoZXJ3aXNlIHRoZSBzdGF0aWMgdHlwZSBvZiAkaSQgaXMgdGhlIGRlY2xhcmVkIHJldHVybiB0eXBlIG9mICAkRiQuICAKJSBUaGUgZm9sbG93aW5nIGlzIG5vdCBuZWVkZWQgYmVjYXVzZSBpdCBpcyBzcGVjaWZpZWQgaW4gJ0JpbmRpbmcgQWN0dWFscyB0byBGb3JtYWxzIgolTGV0ICRUX2kkIGJlIHRoZSBzdGF0aWMgdHlwZSBvZiAkYV9pLCBpIFxpbiAxIC4uIG4rayQuIEl0IGlzIGEgc3RhdGljIHdhcm5pbmcgaWYgJEYkIGlzIG5vdCBhIHN1cGVydHlwZSBvZiAgJChUXzEsIFxsZG90cywgdF9uLCBce1Rfe24rMX0kICR4X3tuKzF9LCBcbGRvdHMsIFRfe24ra30kICR4X3tuK2t9XH0pIFx0byBcYm90JC4KCgoKClxzdWJzdWJzZWN0aW9ue1NlbmRpbmcgTWVzc2FnZXN9CgpcbGFiZWx7c2VuZGluZ01lc3NhZ2VzfQoKTWVzc2FnZXMgYXJlIHRoZSBzb2xlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gYW1vbmcgaXNvbGF0ZXMuIE1lc3NhZ2VzIGFyZSBzZW50IGJ5IGludm9raW5nIHNwZWNpZmljICBtZXRob2RzIGluIHRoZSBEYXJ0IGxpYnJhcmllczsgdGhlcmUgaXMgbm8gc3BlY2lmaWMgc3ludGF4IGZvciBzZW5kaW5nIGEgbWVzc2FnZS4gCgpcY29tbWVudGFyeXtJbiBvdGhlciB3b3JkcywgdGhlIG1ldGhvZHMgc3VwcG9ydGluZyBzZW5kaW5nIG1lc3NhZ2VzIGVtYm9keSBwcmltaXRpdmVzIG9mIERhcnQgdGhhdCBhcmUgbm90IGFjY2Vzc2libGUgdG8gb3JkaW5hcnkgY29kZSwgbXVjaCBsaWtlIHRoZSBtZXRob2RzIHRoYXQgc3Bhd24gaXNvbGF0ZXMuCn0KCgoKXHN1YnNlY3Rpb257IFByb3BlcnR5IEV4dHJhY3Rpb259ClxsYWJlbHtwcm9wZXJ0eUV4dHJhY3Rpb259Cgp7XGVtIFByb3BlcnR5IGV4dHJhY3Rpb259IGFsbG93cyBmb3IgYSBtZW1iZXIgb2YgYW4gb2JqZWN0IHRvIGJlIGNvbmNpc2VseSBleHRyYWN0ZWQgZnJvbSB0aGUgb2JqZWN0LgpBIHByb3BlcnR5IGV4dHJhY3Rpb24gY2FuIGJlIGVpdGhlcjoKXGJlZ2lue2VudW1lcmF0ZX0KXGl0ZW0gQSB7XGVtIGNsb3N1cml6YXRpb259IChccmVme2Nsb3N1cml6YXRpb259KSB3aGljaCBhbGxvd3MgYSBtZXRob2QgdG8gYmUgdHJlYXRlZCBhcyBpZiBpdCB3ZXJlIGEgZ2V0dGVyIGZvciBhIGZ1bmN0aW9uIHZhbHVlZCBvYmplY3QuIE9yClxpdGVtIEEge1xlbSBnZXR0ZXIgaW52b2NhdGlvbn0gd2hpY2ggcmV0dXJucyB0aGUgcmVzdWx0IG9mIGludm9raW5nIG9mIGEgZ2V0dGVyIG1ldGhvZC4KXGVuZHtlbnVtZXJhdGV9CgpFdmFsdWF0aW9uIG9mIGEgcHJvcGVydHkgZXh0cmFjdGlvbiAkaSQgb2YgdGhlIGZvcm0gJGUubSQgcHJvY2VlZHMgYXMgZm9sbG93czoKCkZpcnN0LCB0aGUgZXhwcmVzc2lvbiAkZSQgaXMgZXZhbHVhdGVkIHRvIGFuIG9iamVjdCAkbyQuIExldCAkZiQgYmUgdGhlIHJlc3VsdCBvZiBsb29raW5nIHVwIChccmVme21ldGhvZExvb2t1cH0pIG1ldGhvZCAgKFxyZWZ7aW5zdGFuY2VNZXRob2RzfSkgJG0kIGluICRvJCB3aXRoIHJlc3BlY3QgdG8gdGhlIGN1cnJlbnQgbGlicmFyeSAkTCQuICBJZiAkbyQgaXMgYW4gaW5zdGFuY2Ugb2YgXGNvZGV7VHlwZX0gYnV0ICRlJCBpcyBub3QgYSBjb25zdGFudCB0eXBlIGxpdGVyYWwsIHRoZW4gaWYgJG0kIGlzIGEgbWV0aG9kIHRoYXQgZm9yd2FyZHMgKFxyZWZ7ZnVuY3Rpb25EZWNsYXJhdGlvbnN9KSB0byBhIHN0YXRpYyBtZXRob2QsICBtZXRob2QgbG9va3VwIGZhaWxzLiBJZiBtZXRob2QgbG9va3VwIHN1Y2NlZWRzIGFuZCAkZiQgaXMgYSBjb25jcmV0ZSBtZXRob2QgdGhlbiAkaSQgZXZhbHVhdGVzIHRvIHRoZSBjbG9zdXJpemF0aW9uIG9mICRvLm0kLiAgCgpPdGhlcndpc2UsICRpJCBpcyBhIGdldHRlciBpbnZvY2F0aW9uLCBhbmQgdGhlIGdldHRlciBmdW5jdGlvbiAoXHJlZntnZXR0ZXJzfSkgJG0kIGlzIGxvb2tlZCB1cCAoXHJlZntnZXR0ZXJBbmRTZXR0ZXJMb29rdXB9KSBpbiAkbyQgIHdpdGggcmVzcGVjdCB0byAkTCQuIElmICRvJCBpcyBhbiBpbnN0YW5jZSBvZiBcY29kZXtUeXBlfSBidXQgJGUkIGlzIG5vdCBhIGNvbnN0YW50IHR5cGUgbGl0ZXJhbCwgdGhlbiBpZiAkbSQgaXMgYSBnZXR0ZXIgdGhhdCBmb3J3YXJkcyAgdG8gYSBzdGF0aWMgZ2V0dGVyLCAgZ2V0dGVyIGxvb2t1cCBmYWlscy4gT3RoZXJ3aXNlLCB0aGUgYm9keSBvZiAkbSQgaXMgZXhlY3V0ZWQgd2l0aCBcVEhJU3t9IGJvdW5kIHRvICRvJC4gIFRoZSB2YWx1ZSBvZiAkaSQgaXMgdGhlIHJlc3VsdCByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgZ2V0dGVyIGZ1bmN0aW9uLiAKCklmIHRoZSBnZXR0ZXIgbG9va3VwIGhhcyBmYWlsZWQsIHRoZW4gYSBuZXcgaW5zdGFuY2UgJGltJCAgb2YgdGhlIHByZWRlZmluZWQgY2xhc3MgIFxjb2Rle0ludm9jYXRpb259ICBpcyBjcmVhdGVkLCBzdWNoIHRoYXQgOgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gIFxjb2Rle2ltLmlzR2V0dGVyfSBldmFsdWF0ZXMgdG8gXGNvZGV7XFRSVUV7fX0uClxpdGVtICBcY29kZXtpbS5tZW1iZXJOYW1lfSBldmFsdWF0ZXMgdG8gXGNvZGV7J20nfS4KXGl0ZW0gXGNvZGV7aW0ucG9zaXRpb25hbEFyZ3VtZW50c30gZXZhbHVhdGVzIHRvIHRoZSB2YWx1ZSBvZiBcY29kZXtcQ09OU1R7fSBbXX0uClxpdGVtIFxjb2Rle2ltLm5hbWVkQXJndW1lbnRzfSBldmFsdWF0ZXMgdG8gdGhlIHZhbHVlIG9mIFxjb2Rle1xDT05TVHt9IFx7XH19LgpcZW5ke2l0ZW1pemV9ClRoZW4gdGhlIG1ldGhvZCBcY29kZXtub1N1Y2hNZXRob2QoKX0gaXMgbG9va2VkIHVwIGluICRvJCBhbmQgaW52b2tlZCAgd2l0aCBhcmd1bWVudCAkaW0kLCBhbmQgdGhlIHJlc3VsdCBvZiB0aGlzIGludm9jYXRpb24gaXMgdGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nICRpJC4gSG93ZXZlciwgaWYgdGhlIGltcGxlbWVudGF0aW9uIGZvdW5kIGNhbm5vdCBiZSBpbnZva2VkIHdpdGggYSBzaW5nbGUgcG9zaXRpb25hbCBhcmd1bWVudCwgdGhlIGltcGxlbWVudGF0aW9uICBvZiBcY29kZXtub1N1Y2hNZXRob2QoKX0gaW4gY2xhc3MgXGNvZGV7T2JqZWN0fSBpcyBpbnZva2VkIG9uICRvJCB3aXRoIGFyZ3VtZW50ICRpbSckLCB3aGVyZSAkaW0nJCBpcyBhbiBpbnN0YW5jZSBvZiBcY29kZXtJbnZvY2F0aW9ufSBzdWNoIHRoYXQgOgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gIFxjb2Rle2ltLmlzTWV0aG9kfSBldmFsdWF0ZXMgdG8gXGNvZGV7XFRSVUV7fX0uClxpdGVtICBcY29kZXtpbS5tZW1iZXJOYW1lfSBldmFsdWF0ZXMgdG8gXGNvZGV7bm9TdWNoTWV0aG9kfS4KXGl0ZW0gXGNvZGV7aW0ucG9zaXRpb25hbEFyZ3VtZW50c30gZXZhbHVhdGVzIHRvIGFuIGltbXV0YWJsZSBsaXN0IHdob3NlIHNvbGUgZWxlbWVudCBpcyAgJGltJC4KXGl0ZW0gXGNvZGV7aW0ubmFtZWRBcmd1bWVudHN9IGV2YWx1YXRlcyB0byB0aGUgdmFsdWUgb2YgXGNvZGV7XENPTlNUe30gXHtcfX0uClxlbmR7aXRlbWl6ZX0KCmFuZCB0aGUgcmVzdWx0IG9mIHRoaXMgbGF0dGVyIGludm9jYXRpb24gaXMgdGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nICRpJC4KCkl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmICRtJCBpcyBhIG1lbWJlciBvZiBjbGFzcyBcY2R7T2JqZWN0fSBhbmQgJGUkIGlzIGVpdGhlciBhIHByZWZpeCBvYmplY3QgKFxyZWZ7aW1wb3J0c30pIG9yIGEgY29uc3RhbnQgdHlwZSBsaXRlcmFsLgoKXGNvbW1lbnRhcnkgewpUaGlzIHByZWNsdWRlcyBcY29kZXtpbnQudG9TdHJpbmd9IGJ1dCBub3QgXGNvZGV7KGludCkudG9TdHJpbmd9IGJlY2F1c2UgaW4gdGhlIGxhdHRlciBjYXNlLCAkZSQgaXMgYSBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb24uCn0KCkxldCAkVCQgYmUgdGhlICBzdGF0aWMgdHlwZSBvZiAkZSQuIEl0IGlzIGEgc3RhdGljIHR5cGUgd2FybmluZyBpZiAkVCQgZG9lcyBub3QgaGF2ZSBhIG1ldGhvZCBvciBnZXR0ZXIgbmFtZWQgJG0kIHVubGVzcyBlaXRoZXI6ClxiZWdpbntpdGVtaXplfQpcaXRlbQokVCQgb3IgYSBzdXBlcmludGVyZmFjZSBvZiAkVCQgaXMgYW5ub3RhdGVkIHdpdGggYW4gYW5ub3RhdGlvbiBkZW5vdGluZyBhIGNvbnN0YW50IGlkZW50aWNhbCB0byB0aGUgY29uc3RhbnQgXGNvZGV7QHByb3h5fSBkZWZpbmVkIGluIFxjb2Rle2RhcnQ6Y29yZX0uICBPcgpcaXRlbSAgJFQkIGlzIFxjb2Rle1R5cGV9LCAkZSQgaXMgYSBjb25zdGFudCB0eXBlIGxpdGVyYWwgYW5kIHRoZSBjbGFzcyBjb3JyZXNwb25kaW5nIHRvICRlJCBoYXMgYSBzdGF0aWMgbWV0aG9kIG9yIGdldHRlciBuYW1lZCAkbSQuClxlbmR7aXRlbWl6ZX0KCklmICRpJCBpcyBhIGdldHRlciBpbnZvY2F0aW9uLCB0aGUgc3RhdGljIHR5cGUgb2YgJGkkIGlzOgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gVGhlIGRlY2xhcmVkIHJldHVybiB0eXBlIG9mICRULm0kLCBpZiAkVC5tJCBleGlzdHMuClxpdGVtIFRoZSBkZWNsYXJlZCByZXR1cm4gdHlwZSBvZiAkbSQsIGlmICAkVCQgaXMgXGNvZGV7VHlwZX0sICRlJCBpcyBhIGNvbnN0YW50IHR5cGUgbGl0ZXJhbCBhbmQgdGhlIGNsYXNzIGNvcnJlc3BvbmRpbmcgdG8gJGUkIGhhcyBhIHN0YXRpYyBtZXRob2Qgb3IgZ2V0dGVyIG5hbWVkICRtJC4KXGl0ZW0gIFRoZSB0eXBlIFxEWU5BTUlDe30gb3RoZXJ3aXNlLiAgClxlbmR7aXRlbWl6ZX0KCklmICRpJCBpcyBhIGNsb3N1cml6YXRpb24sIGl0cyBzdGF0aWMgdHlwZSBpcyBhcyBkZXNjcmliZWQgaW4gc2VjdGlvbiBccmVme2Nsb3N1cml6YXRpb259LgoKRXZhbHVhdGlvbiBvZiBhIHByb3BlcnR5IGV4dHJhY3Rpb24gJGkkIG9mIHRoZSBmb3JtICRcU1VQRVIubSQgcHJvY2VlZHMgYXMgZm9sbG93czoKCiBMZXQgJFMkIGJlIHRoZSBzdXBlcmNsYXNzIG9mIHRoZSBpbW1lZGlhdGVseSBlbmNsb3NpbmcgY2xhc3MuIExldCAkZiQgYmUgdGhlIHJlc3VsdCBvZiBsb29raW5nIHVwIG1ldGhvZCAkbSQgaW4gJFMkIHdpdGggcmVzcGVjdCB0byB0aGUgY3VycmVudCBsaWJyYXJ5ICRMJC4gIElmICRmJCBpcyBhIGNvbmNyZXRlIG1ldGhvZCB0aGVuICRpJCBldmFsdWF0ZXMgdG8gdGhlIGNsb3N1cml6YXRpb24gb2YgJFxTVVBFUi5tJCB3aXRoIHJlc3BlY3QgdG8gc3VwZXJjbGFzcyAkUyQoXHJlZntjbG9zdXJpemF0aW9ufSkuICAKIAogT3RoZXJ3aXNlLCAkaSQgaXMgYSBnZXR0ZXIgaW52b2NhdGlvbiBhbmQgdGhlIGdldHRlciBmdW5jdGlvbiAkbSQgaXMgbG9va2VkIHVwIGluICRTJCAgd2l0aCByZXNwZWN0IHRvICRMJCwgYW5kIGl0cyBib2R5IGlzIGV4ZWN1dGVkIHdpdGggXFRISVN7fSBib3VuZCB0byB0aGUgY3VycmVudCB2YWx1ZSBvZiAgXFRISVN7fS4gIFRoZSB2YWx1ZSBvZiAkaSQgaXMgdGhlIHJlc3VsdCByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgZ2V0dGVyIGZ1bmN0aW9uLiAKCklmIHRoZSBnZXR0ZXIgbG9va3VwIGhhcyBmYWlsZWQsIHRoZW4gYSBuZXcgaW5zdGFuY2UgJGltJCAgb2YgdGhlIHByZWRlZmluZWQgY2xhc3MgIFxjb2Rle0ludm9jYXRpb259ICBpcyBjcmVhdGVkLCBzdWNoIHRoYXQgOgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gIFxjb2Rle2ltLmlzR2V0dGVyfSBldmFsdWF0ZXMgdG8gXGNvZGV7XFRSVUV7fX0uClxpdGVtICBcY29kZXtpbS5tZW1iZXJOYW1lfSBldmFsdWF0ZXMgdG8gXGNvZGV7J20nfS4KXGl0ZW0gXGNvZGV7aW0ucG9zaXRpb25hbEFyZ3VtZW50c30gZXZhbHVhdGVzIHRvIHRoZSB2YWx1ZSBvZiBcY29kZXtcQ09OU1R7fSBbXX0uClxpdGVtIFxjb2Rle2ltLm5hbWVkQXJndW1lbnRzfSBldmFsdWF0ZXMgdG8gdGhlIHZhbHVlIG9mIFxjb2Rle1xDT05TVHt9IFx7XH19LgpcZW5ke2l0ZW1pemV9ClRoZW4gdGhlIG1ldGhvZCBcY29kZXtub1N1Y2hNZXRob2QoKX0gaXMgbG9va2VkIHVwIGluICRTJCBhbmQgaW52b2tlZCAgd2l0aCBhcmd1bWVudCAkaW0kLCBhbmQgdGhlIHJlc3VsdCBvZiB0aGlzIGludm9jYXRpb24gaXMgdGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nICRpJC4gSG93ZXZlciwgaWYgdGhlIGltcGxlbWVudGF0aW9uIGZvdW5kIGNhbm5vdCBiZSBpbnZva2VkIHdpdGggYSBzaW5nbGUgcG9zaXRpb25hbCBhcmd1bWVudCwgdGhlIGltcGxlbWVudGF0aW9uICBvZiBcY29kZXtub1N1Y2hNZXRob2QoKX0gaW4gY2xhc3MgXGNvZGV7T2JqZWN0fSBpcyBpbnZva2VkIG9uIFxUSElTe30gd2l0aCBhcmd1bWVudCAkaW0nJCwgd2hlcmUgJGltJyQgaXMgYW4gaW5zdGFuY2Ugb2YgXGNvZGV7SW52b2NhdGlvbn0gc3VjaCB0aGF0IDoKXGJlZ2lue2l0ZW1pemV9ClxpdGVtICBcY29kZXtpbS5pc01ldGhvZH0gZXZhbHVhdGVzIHRvIFxjb2Rle1xUUlVFe319LgpcaXRlbSAgXGNvZGV7aW0ubWVtYmVyTmFtZX0gZXZhbHVhdGVzIHRvIFxjb2Rle25vU3VjaE1ldGhvZH0uClxpdGVtIFxjb2Rle2ltLnBvc2l0aW9uYWxBcmd1bWVudHN9IGV2YWx1YXRlcyB0byBhbiBpbW11dGFibGUgbGlzdCB3aG9zZSBzb2xlIGVsZW1lbnQgaXMgICRpbSQuClxpdGVtIFxjb2Rle2ltLm5hbWVkQXJndW1lbnRzfSBldmFsdWF0ZXMgdG8gdGhlIHZhbHVlIG9mIFxjb2Rle1xDT05TVHt9IFx7XH19LgpcZW5ke2l0ZW1pemV9CgphbmQgdGhlIHJlc3VsdCBvZiB0aGlzIGxhdHRlciBpbnZvY2F0aW9uIGlzIHRoZSByZXN1bHQgb2YgZXZhbHVhdGluZyAkaSQuCgpJdCBpcyBhIHN0YXRpYyB0eXBlIHdhcm5pbmcgaWYgJFMkIGRvZXMgbm90IGhhdmUgYSBtZXRob2Qgb3IgZ2V0dGVyIG5hbWVkICRtJC4gIElmICRpJCBpcyBhIGdldHRlciBpbnZvY2F0aW9uLCB0aGUgc3RhdGljIHR5cGUgb2YgJGkkIGlzIHRoZSBkZWNsYXJlZCByZXR1cm4gdHlwZSBvZiAkUy5tJCwgaWYgJFMubSQgZXhpc3RzIGFuZCAgXERZTkFNSUN7fSBvdGhlcndpc2UuIElmICRpJCBpcyBhIGNsb3N1cml6YXRpb24sIGl0cyBzdGF0aWMgdHlwZSBpcyBhcyBkZXNjcmliZWQgaW4gc2VjdGlvbiBccmVme2Nsb3N1cml6YXRpb259LgoKClxzdWJzdWJzZWN0aW9ue0Nsb3N1cml6YXRpb259ClxsYWJlbHtjbG9zdXJpemF0aW9ufQoKVGhlIHtcZW0gY2xvc3VyaXphdGlvbiBvZiAkby5tJH0gaXMgZGVmaW5lZCB0byBiZSBlcXVpdmFsZW50IHRvOgoKXGJlZ2lue2l0ZW1pemV9CgpcaXRlbSAgClxiZWdpbntkYXJ0Q29kZX0KJChyXzEsIFxsZG90cywgcl9uLCBce3BfMSA6IGRfMSwgXGxkb3RzICwgcF9rIDogZF9rXH0pJCBcewogIFxSRVRVUk57fSAkIHUubShyXzEsIFxsZG90cywgcl9uLCBwXzE6IHBfMSwgXGxkb3RzLCBwX2s6IHBfayk7JApcfSAKXGVuZHtkYXJ0Q29kZX0KCmlmICRtJCBoYXMgcmVxdWlyZWQgcGFyYW1ldGVycyAkcl8xLCBcbGRvdHMsIHJfbiQsIGFuZCBuYW1lZCBwYXJhbWV0ZXJzICRwXzEsIFxsZG90cywgcF9rJCB3aXRoIGRlZmF1bHRzICRkXzEsIFxsZG90cywgZF9rJC4KXGl0ZW0gClxiZWdpbntkYXJ0Q29kZX0KJChyXzEsIFxsZG90cywgcl9uLCBbcF8xID0gZF8xLCBcbGRvdHMgLCBwX2sgPSBkX2tdKSRcewogIFxSRVRVUk57fSAkdS5tKHJfMSwgXGxkb3RzLCByX24sIHBfMSwgXGxkb3RzLCBwX2spJDsKXH0KXGVuZHtkYXJ0Q29kZX0KCmlmICRtJCBoYXMgcmVxdWlyZWQgcGFyYW1ldGVycyAkcl8xLCBcbGRvdHMsIHJfbiQsIGFuZCBvcHRpb25hbCBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgJHBfMSwgXGxkb3RzLCBwX2skIHdpdGggZGVmYXVsdHMgJGRfMSwgXGxkb3RzLCBkX2skLgpcZW5ke2l0ZW1pemV9Cgp3aGVyZSAkdSQgaXMgYSBmcmVzaCBmaW5hbCB2YXJpYWJsZSBib3VuZCB0byAkbyQsIGV4Y2VwdCB0aGF0OgpcYmVnaW57ZW51bWVyYXRlfQpcaXRlbSAgSWZmICBcY29kZXtpZGVudGljYWwoJG9fMSwgb18yJCl9ICB0aGVuIFxjZHskb18xLm0kID09ICRvXzIubSR9LgpcaXRlbSBUaGUgc3RhdGljIHR5cGUgb2YgdGhlIHByb3BlcnR5IGV4dHJhY3Rpb24gaXMgdGhlIHN0YXRpYyB0eXBlIG9mIGZ1bmN0aW9uICRULm0kLCB3aGVyZSAkVCQgaXMgdGhlIHN0YXRpYyB0eXBlIG9mICRlJCwgaWYgJFQubSQgaXMgZGVmaW5lZC4gT3RoZXJ3aXNlIHRoZSBzdGF0aWMgdHlwZSBvZiAkZS5tJCBpcyBcRFlOQU1JQ3t9LgpcZW5ke2VudW1lcmF0ZX0KClxjb21tZW50YXJ5ewpUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBcY2R7aWRlbnRpY2FsKCRvXzEubSwgb18yLm0kKX0uIERhcnQgaW1wbGVtZW50YXRpb25zIGFyZSBub3QgcmVxdWlyZWQgdG8gY2Fub25pY2FsaXplIHRoZXNlIG9yIGFueSBvdGhlciBjbG9zdXJlcy4KfQolIGxvY2FsIGZ1bmN0aW9ucyB0aGF0IGhhdmUgYSBjbG9zdXJlIGV4dHJhY3RlZCBhcmUgYWx3YXlzIGRpZmZlcmVudAoKXHJhdGlvbmFsZXsKVGhlIHNwZWNpYWwgdHJlYXRtZW50IG9mIGVxdWFsaXR5IGluIHRoaXMgY2FzZSBmYWNpbGl0YXRlcyB0aGUgdXNlIG9mIGV4dHJhY3RlZCBwcm9wZXJ0eSBmdW5jdGlvbnMgaW4gQVBJcyB3aGVyZSBjYWxsYmFja3Mgc3VjaCBhcyBldmVudCBsaXN0ZW5lcnMgbXVzdCBvZnRlbiBiZSByZWdpc3RlcmVkIGFuZCBsYXRlciB1bnJlZ2lzdGVyZWQuIEEgY29tbW9uIGV4YW1wbGUgaXMgdGhlIERPTSBBUEkgaW4gd2ViIGJyb3dzZXJzLgp9CgoKCgpcY29tbWVudGFyeXtPYnNlcnZhdGlvbnM6ClxiZWdpbntlbnVtZXJhdGV9ClxpdGVtIE9uZSBjYW5ub3QgY2xvc3VyaXplIGEgZ2V0dGVyIG9yIGEgc2V0dGVyLgpcaXRlbSBPbmUgY2FuIHRlbGwgd2hldGhlciBvbmUgaW1wbGVtZW50ZWQgYSBwcm9wZXJ0eSB2aWEgYSBtZXRob2Qgb3IgdmlhIGZpZWxkL2dldHRlciwgd2hpY2ggbWVhbnMgdGhhdCBvbmUgaGFzIHRvIHBsYW4gYWhlYWQgYXMgdG8gd2hhdCBjb25zdHJ1Y3QgdG8gdXNlLCBhbmQgdGhhdCBjaG9pY2UgaXMgcmVmbGVjdGVkIGluIHRoZSBpbnRlcmZhY2Ugb2YgdGhlIGNsYXNzLgpcZW5ke2VudW1lcmF0ZX0KfSAKCgogClRoZSBjbG9zdXJpemF0aW9uIG9mICRcU1VQRVJ7fS5tJCB3aXRoIHJlc3BlY3QgdG8gc3VwZXJjbGFzcyAkUyQgaXMgZGVmaW5lZCB0byBiZSBlcXVpdmFsZW50IHRvOgoKXGJlZ2lue2l0ZW1pemV9CiAlXGl0ZW0gJChyXzEsIFxsZG90cywgcl9uKVx7XFJFVFVSTnt9JCAkby5tKHJfMSwgXGxkb3RzLCByX24pO1x9JCBpZiAkbSQgaGFzIG9ubHkgcmVxdWlyZWQgcGFyYW1ldGVycyAkcl8xLCBcbGRvdHMgcl9uJC4KJVxpdGVtICQocl8xLCBcbGRvdHMsIHJfbiwgcmVzdClce3JldHVybiQgICRvLm0ocl8xLCBcbGRvdHMsIHJfbiwgcmVzdCk7XH0kIGlmICRtJCBoYXMgcmVxdWlyZWQgcGFyYW1ldGVycyAkcl8xLCBcbGRvdHMgcl9uJCwgYW5kIGEgcmVzdCBwYXJhbWV0ZXIgJHJlc3QkLgolXGl0ZW0KXGl0ZW0gIApcYmVnaW57ZGFydENvZGV9CiQocl8xLCBcbGRvdHMsIHJfbiwgXHtwXzEgOiBkXzEsIFxsZG90cyAsIHBfayA6IGRfa1x9KSRcewogICBcUkVUVVJOe30gXFNVUEVSe30kLm0ocl8xLCBcbGRvdHMsIHJfbiwgcF8xOiBwXzEsIFxsZG90cywgcF9rOiBwX2spJDsKXH0KXGVuZHtkYXJ0Q29kZX0KCmlmICRtJCBoYXMgcmVxdWlyZWQgcGFyYW1ldGVycyAkcl8xLCBcbGRvdHMsIHJfbiQsIGFuZCBuYW1lZCBwYXJhbWV0ZXJzICRwXzEsIFxsZG90cywgcF9rJCB3aXRoIGRlZmF1bHRzICRkXzEsIFxsZG90cywgZF9rJC4KXGl0ZW0gClxiZWdpbntkYXJ0Q29kZX0KJChyXzEsIFxsZG90cywgcl9uLCBbcF8xID0gZF8xLCBcbGRvdHMgLCBwX2sgPSBkX2tdKSRcewogICBcUkVUVVJOe30gXFNVUEVSe30kLm0ocl8xLCBcbGRvdHMsIHJfbiwgcF8xLCBcbGRvdHMsIHBfaykkOwpcfSAKXGVuZHtkYXJ0Q29kZX0KCmlmICRtJCBoYXMgcmVxdWlyZWQgcGFyYW1ldGVycyAkcl8xLCBcbGRvdHMsIHJfbiQsIGFuZCBvcHRpb25hbCBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgJHBfMSwgXGxkb3RzLCBwX2skIHdpdGggZGVmYXVsdHMgJGRfMSwgXGxkb3RzLCBkX2skLgpcZW5ke2l0ZW1pemV9CgpFeGNlcHQgdGhhdDoKXGJlZ2lue2VudW1lcmF0ZX0KXGl0ZW0gIGlmZiAgXGNvZGV7aWRlbnRpY2FsKCRvXzEsIG9fMiQpfSAgdGhlbiBcY2R7JG9fMS5tJCA9PSAkb18yLm0kfS4KXGl0ZW0gClRoZSBzdGF0aWMgdHlwZSBvZiB0aGUgcHJvcGVydHkgZXh0cmFjdGlvbiBpcyB0aGUgc3RhdGljIHR5cGUgb2YgdGhlIG1ldGhvZCAkUy5tJCwgIGlmICRTLm0kIGlzIGRlZmluZWQuIE90aGVyd2lzZSB0aGUgc3RhdGljIHR5cGUgb2YgJFxTVVBFUnt9Lm0kIGlzIFxEWU5BTUlDe30uClxlbmR7ZW51bWVyYXRlfQoKClxzdWJzZWN0aW9ueyBBc3NpZ25tZW50fQpcbGFiZWx7YXNzaWdubWVudH0KCkFuIGFzc2lnbm1lbnQgY2hhbmdlcyB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgbXV0YWJsZSB2YXJpYWJsZSBvciBwcm9wZXJ0eS4KClxiZWdpbntncmFtbWFyfQp7XGJmIGFzc2lnbm1lbnRPcGVyYXRvcjp9YD0nIDsKICAgICAgY29tcG91bmRBc3NpZ25tZW50T3BlcmF0b3IKICAgIC4KXGVuZHtncmFtbWFyfQoKRXZhbHVhdGlvbiBvZiBhbiBhc3NpZ25tZW50ICRhJCBvZiB0aGUgZm9ybSAkdiQgXGNvZGV7PX0gJGUkIHByb2NlZWRzIGFzIGZvbGxvd3M6CgoKJUlmIHRoZXJlIGlzIG5laXRoZXIgYSBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbiB3aXRoIG5hbWUgJHYkIG5vciBhIHNldHRlciBkZWNsYXJhdGlvbiB3aXRoIG5hbWUgJHY9JCBpbiB0aGUgbGV4aWNhbCBzY29wZSBlbmNsb3NpbmcgJGEkLCB0aGVuOgolXGJlZ2lue2l0ZW1pemV9CiUgXGl0ZW0gSWYgICRhJCBvY2N1cnMgaW5zaWRlIGEgdG9wIGxldmVsIG9yIHN0YXRpYyBmdW5jdGlvbiAoYmUgaXQgZnVuY3Rpb24sIG1ldGhvZCwgZ2V0dGVyLCAgb3Igc2V0dGVyKSBvciB2YXJpYWJsZSBpbml0aWFsaXplciwgZXZhbHVhdGlvbiBvZiAkYSQgY2F1c2VzICRlJCB0byBiZSBldmFsdWF0ZWQsIGFmdGVyIHdoaWNoIGEgXGNvZGV7Tm9TdWNoTWV0aG9kRXJyb3J9IGlzIHRocm93bi4gCiUgXGl0ZW0gT3RoZXJ3aXNlLCB0aGUgYXNzaWdubWVudCBpcyBlcXVpdmFsZW50IHRvIHRoZSBhc3NpZ25tZW50IFxjb2RleyBcVEhJU3t9LiR2JCA9ICRlJH0uIAolIFxlbmR7aXRlbWl6ZX0KIAolT3RoZXJ3aXNlLCAgCgpMZXQgJGQkIGJlIHRoZSBpbm5lcm1vc3QgZGVjbGFyYXRpb24gd2hvc2UgbmFtZSBpcyAkdiQgb3IgJHY9JCwgaWYgaXQgZXhpc3RzLgoKSWYgJGQkIGlzIHRoZSBkZWNsYXJhdGlvbiBvZiBhIGxvY2FsIHZhcmlhYmxlLCB0aGUgZXhwcmVzc2lvbiAkZSQgaXMgZXZhbHVhdGVkIHRvIGFuIG9iamVjdCAkbyQuIFRoZW4sIHRoZSB2YXJpYWJsZSAkdiQgaXMgYm91bmQgdG8gJG8kIHVubGVzcyAkdiQgaXMgXEZJTkFMe30gb3IgXENPTlNUe30sIGluIHdoaWNoIGNhc2UgYSBkeW5hbWljIGVycm9yIG9jY3Vycy4KSWYgbm8gZXJyb3Igb2NjdXJzLCB0aGUgdmFsdWUgb2YgdGhlIGFzc2lnbm1lbnQgZXhwcmVzc2lvbiBpcyAkbyQuICAKCklmICRkJCBpcyB0aGUgZGVjbGFyYXRpb24gb2YgYSBsaWJyYXJ5IHZhcmlhYmxlLCB0b3AgbGV2ZWwgZ2V0dGVyIG9yIHRvcCBsZXZlbCBzZXR0ZXIsIHRoZSBleHByZXNzaW9uICRlJCBpcyBldmFsdWF0ZWQgdG8gYW4gb2JqZWN0ICRvJC4gVGhlbiB0aGUgc2V0dGVyICR2PSQgaXMgaW52b2tlZCB3aXRoIGl0cyBmb3JtYWwgcGFyYW1ldGVyIGJvdW5kIHRvICRvJC4gVGhlIHZhbHVlIG9mIHRoZSBhc3NpZ25tZW50IGV4cHJlc3Npb24gaXMgJG8kLiAgCgpPdGhlcndpc2UsIGlmICRkJCBpcyB0aGUgZGVjbGFyYXRpb24gb2YgYSBzdGF0aWMgdmFyaWFibGUsIHN0YXRpYyBnZXR0ZXIgb3Igc3RhdGljIHNldHRlciBpbiBjbGFzcyAkQyQsIHRoZW4gdGhlIGFzc2lnbm1lbnQgaXMgZXF1aXZhbGVudCB0byB0aGUgYXNzaWdubWVudCBcY29kZXskQy52JCA9ICRlJH0uCgpPdGhlcndpc2UsIElmICAkYSQgb2NjdXJzIGluc2lkZSBhIHRvcCBsZXZlbCBvciBzdGF0aWMgZnVuY3Rpb24gKGJlIGl0IGZ1bmN0aW9uLCBtZXRob2QsIGdldHRlciwgIG9yIHNldHRlcikgb3IgdmFyaWFibGUgaW5pdGlhbGl6ZXIsIGV2YWx1YXRpb24gb2YgJGEkIGNhdXNlcyAkZSQgdG8gYmUgZXZhbHVhdGVkLCBhZnRlciB3aGljaCBhIFxjb2Rle05vU3VjaE1ldGhvZEVycm9yfSBpcyB0aHJvd24uIAoKT3RoZXJ3aXNlLCB0aGUgYXNzaWdubWVudCBpcyBlcXVpdmFsZW50IHRvIHRoZSBhc3NpZ25tZW50IFxjb2RleyBcVEhJU3t9LiR2JCA9ICRlJH0uIAoKSW4gY2hlY2tlZCBtb2RlLCBpdCBpcyBhIGR5bmFtaWMgdHlwZSBlcnJvciBpZiAkbyQgaXMgbm90IFxOVUxMe30gYW5kIHRoZSBpbnRlcmZhY2Ugb2YgdGhlIGNsYXNzIG9mICRvJCBpcyBub3QgYSBzdWJ0eXBlIG9mIHRoZSBhY3R1YWwgdHlwZSAoXHJlZnthY3R1YWxUeXBlT2ZBRGVjbGFyYXRpb259KSBvZiAkdiQuCgpJdCBpcyBhIHN0YXRpYyB0eXBlIHdhcm5pbmcgaWYgdGhlIHN0YXRpYyB0eXBlIG9mICRlJCBtYXkgbm90IGJlIGFzc2lnbmVkIHRvIHRoZSBzdGF0aWMgdHlwZSBvZiAkdiQuIFRoZSBzdGF0aWMgdHlwZSBvZiB0aGUgZXhwcmVzc2lvbiAkdiQgXGNvZGV7PX0gJGUkIGlzIHRoZSBzdGF0aWMgdHlwZSBvZiAkZSQuCgpFdmFsdWF0aW9uIG9mIGFuIGFzc2lnbm1lbnQgb2YgdGhlIGZvcm0gJGVfMS52JCBcY29kZXs9fSAkZV8yJCBwcm9jZWVkcyBhcyBmb2xsb3dzOgoKVGhlIGV4cHJlc3Npb24gJGVfMSQgaXMgZXZhbHVhdGVkIHRvIGFuIG9iamVjdCAkb18xJC4gVGhlbiwgdGhlIGV4cHJlc3Npb24gJGVfMiQgIGlzIGV2YWx1YXRlZCB0byBhbiBvYmplY3QgJG9fMiQuIFRoZW4sIHRoZSBzZXR0ZXIgJHY9JCBpcyBsb29rZWQgdXAgKFxyZWZ7Z2V0dGVyQW5kU2V0dGVyTG9va3VwfSkgaW4gJG9fMSQgd2l0aCByZXNwZWN0IHRvIHRoZSBjdXJyZW50IGxpYnJhcnkuICBJZiAkb18xJCBpcyBhbiBpbnN0YW5jZSBvZiBcY29kZXtUeXBlfSBidXQgJGVfMSQgaXMgbm90IGEgY29uc3RhbnQgdHlwZSBsaXRlcmFsLCB0aGVuIGlmICR2PSQgaXMgYSBzZXR0ZXIgdGhhdCBmb3J3YXJkcyAoXHJlZntmdW5jdGlvbkRlY2xhcmF0aW9uc30pIHRvIGEgc3RhdGljIHNldHRlciwgc2V0dGVyIGxvb2t1cCBmYWlscy4gT3RoZXJ3aXNlLCB0aGUgYm9keSAgb2YgJHY9JCBpcyBleGVjdXRlZCB3aXRoIGl0cyBmb3JtYWwgcGFyYW1ldGVyIGJvdW5kIHRvICRvXzIkIGFuZCBcVEhJU3t9IGJvdW5kIHRvICRvXzEkLiAKCklmIHRoZSBzZXR0ZXIgbG9va3VwIGhhcyBmYWlsZWQsIHRoZW4gYSBuZXcgaW5zdGFuY2UgJGltJCAgb2YgdGhlIHByZWRlZmluZWQgY2xhc3MgIFxjb2Rle0ludm9jYXRpb259ICBpcyBjcmVhdGVkLCBzdWNoIHRoYXQgOgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gIFxjb2Rle2ltLmlzU2V0dGVyfSBldmFsdWF0ZXMgdG8gXGNvZGV7XFRSVUV7fX0uClxpdGVtICBcY29kZXtpbS5tZW1iZXJOYW1lfSBldmFsdWF0ZXMgdG8gXGNvZGV7J3Y9J30uClxpdGVtIFxjb2Rle2ltLnBvc2l0aW9uYWxBcmd1bWVudHN9IGV2YWx1YXRlcyB0byBhbiBpbW11dGFibGUgbGlzdCB3aXRoIHRoZSBzYW1lIHZhbHVlcyBhcyBcY29kZXtbJG9fMiRdfS4KXGl0ZW0gXGNvZGV7aW0ubmFtZWRBcmd1bWVudHN9IGV2YWx1YXRlcyB0byB0aGUgdmFsdWUgb2YgXGNvZGV7XENPTlNUe30gXHtcfX0uClxlbmR7aXRlbWl6ZX0KClRoZW4gdGhlIG1ldGhvZCBcY29kZXtub1N1Y2hNZXRob2QoKX0gaXMgbG9va2VkIHVwIGluICRvXzEkIGFuZCBpbnZva2VkICB3aXRoIGFyZ3VtZW50ICRpbSQuIApIb3dldmVyLCBpZiB0aGUgaW1wbGVtZW50YXRpb24gZm91bmQgY2Fubm90IGJlIGludm9rZWQgd2l0aCBhIHNpbmdsZSBwb3NpdGlvbmFsIGFyZ3VtZW50LCB0aGUgaW1wbGVtZW50YXRpb24gIG9mIFxjb2Rle25vU3VjaE1ldGhvZCgpfSBpbiBjbGFzcyBcY29kZXtPYmplY3R9IGlzIGludm9rZWQgb24gJG9fMSQgd2l0aCBhcmd1bWVudCAkaW0nJCwgd2hlcmUgJGltJyQgaXMgYW4gaW5zdGFuY2Ugb2YgXGNvZGV7SW52b2NhdGlvbn0gc3VjaCB0aGF0IDoKXGJlZ2lue2l0ZW1pemV9ClxpdGVtICBcY29kZXtpbS5pc01ldGhvZH0gZXZhbHVhdGVzIHRvIFxjb2Rle1xUUlVFe319LgpcaXRlbSAgXGNvZGV7aW0ubWVtYmVyTmFtZX0gZXZhbHVhdGVzIHRvIFxjb2Rle25vU3VjaE1ldGhvZH0uClxpdGVtIFxjb2Rle2ltLnBvc2l0aW9uYWxBcmd1bWVudHN9IGV2YWx1YXRlcyB0byBhbiBpbW11dGFibGUgbGlzdCB3aG9zZSBzb2xlIGVsZW1lbnQgaXMgICRpbSQuClxpdGVtIFxjb2Rle2ltLm5hbWVkQXJndW1lbnRzfSBldmFsdWF0ZXMgdG8gdGhlIHZhbHVlIG9mIFxjb2Rle1xDT05TVHt9IFx7XH19LgpcZW5ke2l0ZW1pemV9CgpUaGUgdmFsdWUgb2YgdGhlIGFzc2lnbm1lbnQgZXhwcmVzc2lvbiBpcyAkb18yJCBpcnJlc3BlY3RpdmUgb2Ygd2hldGhlciBzZXR0ZXIgbG9va3VwIGhhcyBmYWlsZWQgb3Igc3VjY2VlZGVkLgoKSW4gY2hlY2tlZCBtb2RlLCBpdCBpcyBhIGR5bmFtaWMgdHlwZSBlcnJvciBpZiAkb18yJCBpcyBub3QgXE5VTEx7fSBhbmQgdGhlIGludGVyZmFjZSBvZiB0aGUgY2xhc3Mgb2YgJG9fMiQgaXMgbm90IGEgc3VidHlwZSBvZiB0aGUgYWN0dWFsIHR5cGUgb2YgJGVfMS52JC4KCkxldCAkVCQgYmUgdGhlIHN0YXRpYyB0eXBlIG9mICRlXzEkLiBJdCBpcyBhIHN0YXRpYyB0eXBlIHdhcm5pbmcgaWYgJFQkIGRvZXMgbm90IGhhdmUgYW4gYWNjZXNzaWJsZSBpbnN0YW5jZSBzZXR0ZXIgbmFtZWQgJHY9JCB1bmxlc3MgZWl0aGVyOgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gJFQkIG9yIGEgc3VwZXJpbnRlcmZhY2Ugb2YgJFQkIGlzIGFubm90YXRlZCB3aXRoIGFuIGFubm90YXRpb24gZGVub3RpbmcgYSBjb25zdGFudCBpZGVudGljYWwgdG8gdGhlIGNvbnN0YW50IFxjb2Rle0Bwcm94eX0gZGVmaW5lZCBpbiBcY29kZXtkYXJ0OmNvcmV9LiBPcgpcaXRlbSAkVCQgaXMgXGNvZGV7VHlwZX0sICRlXzEkIGlzIGEgY29uc3RhbnQgdHlwZSBsaXRlcmFsIGFuZCB0aGUgY2xhc3MgY29ycmVzcG9uZGluZyB0byAkZV8xJCBoYXMgYSBzdGF0aWMgc2V0dGVyIG5hbWVkICR2PSQuIApcZW5ke2l0ZW1pemV9CgoKCkl0IGlzIGEgc3RhdGljIHR5cGUgd2FybmluZyBpZiB0aGUgc3RhdGljIHR5cGUgb2YgJGVfMiQgbWF5IG5vdCBiZSBhc3NpZ25lZCB0byAkVCQuICAgVGhlIHN0YXRpYyB0eXBlIG9mIHRoZSBleHByZXNzaW9uICRlXzF2JCBcY29kZXs9fSAkZV8yJCBpcyB0aGUgc3RhdGljIHR5cGUgb2YgJGVfMiQuCgpFdmFsdWF0aW9uIG9mIGFuIGFzc2lnbm1lbnQgb2YgdGhlIGZvcm0gJGVfMVtlXzJdJCBcY29kZXs9fSAkZV8zJCBpcyBlcXVpdmFsZW50IHRvIHRoZSBldmFsdWF0aW9uIG9mIHRoZSBleHByZXNzaW9uIFxjb2RleyhhLCBpLCBlKVx7YS5bXT0oaSwgZSk7IFxSRVRVUk57fSBlOyBcfSAoJGVfMSwgZV8yLCBlXzMkKX0uICBUaGUgc3RhdGljIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24gJGVfMVtlXzJdJCBcY29kZXs9fSAkZV8zJCBpcyB0aGUgc3RhdGljIHR5cGUgb2YgJGVfMyQuCgolIFNob3VsZCB3ZSBhZGQ6IEl0IGlzIGEgZHluYW1pYyBlcnJvciBpZiAkZV8xJCBldmFsdWF0ZXMgdG8gYW4gIGNvbnN0YW50IGxpc3Qgb3IgbWFwLgoKSXQgaXMgYXMgc3RhdGljIHdhcm5pbmcgaWYgYW4gYXNzaWdubWVudCBvZiB0aGUgZm9ybSAkdiA9IGUkIG9jY3VycyBpbnNpZGUgYSB0b3AgbGV2ZWwgb3Igc3RhdGljIGZ1bmN0aW9uIChiZSBpdCBmdW5jdGlvbiwgbWV0aG9kLCBnZXR0ZXIsIG9yIHNldHRlcikgb3IgdmFyaWFibGUgaW5pdGlhbGl6ZXIgYW5kIHRoZXJlIGlzIG5laXRoZXIgYSBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbiB3aXRoIG5hbWUgJHYkICBub3Igc2V0dGVyIGRlY2xhcmF0aW9uIHdpdGggbmFtZSAkdj0kIGluIHRoZSBsZXhpY2FsIHNjb3BlIGVuY2xvc2luZyB0aGUgYXNzaWdubWVudC4KCkl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIHRvIGludm9rZSBhbnkgb2YgdGhlIHNldHRlcnMgb2YgY2xhc3MgXGNke09iamVjdH0gb24gYSBwcmVmaXggb2JqZWN0IChccmVme2ltcG9ydHN9KSBvciBvbiBhIGNvbnN0YW50IHR5cGUgbGl0ZXJhbCB0aGF0IGlzICBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSB0aGUgdG9rZW4gYC4nLgoKCgpcc3Vic3Vic2VjdGlvbntDb21wb3VuZCBBc3NpZ25tZW50fQpcbGFiZWx7Y29tcG91bmRBc3NpZ25tZW50fQoKQSBjb21wb3VuZCBhc3NpZ25tZW50IG9mIHRoZSBmb3JtICR2JCAkb3BcY29kZXs9fSBlJCBpcyBlcXVpdmFsZW50IHRvICR2IFxjb2Rlez19IHYkICRvcCQgJGUkLiBBIGNvbXBvdW5kIGFzc2lnbm1lbnQgb2YgdGhlIGZvcm0gJEMudiQgJG9wIFxjb2Rlez19IGUkIGlzIGVxdWl2YWxlbnQgdG8gJEMudiBcY29kZXs9fSBDLnYkICRvcCQgJGUkLiBBIGNvbXBvdW5kIGFzc2lnbm1lbnQgb2YgdGhlIGZvcm0gJGVfMS52JCAkb3AgPSBlXzIkIGlzIGVxdWl2YWxlbnQgdG8gXGNvZGV7KCh4KSAkPT4kIHgudiA9IHgudiAkb3AkICRlXzIkKSgkZV8xJCl9IHdoZXJlICR4JCBpcyBhIHZhcmlhYmxlIHRoYXQgaXMgbm90IHVzZWQgaW4gJGVfMiQuIEEgY29tcG91bmQgYXNzaWdubWVudCBvZiB0aGUgZm9ybSAgJGVfMVtlXzJdJCAkb3BcY29kZXs9fSBlXzMkIGlzIGVxdWl2YWxlbnQgdG8gClxjb2RleygoYSwgaSkgJD0+JCBhW2ldID0gYVtpXSAkb3AkICRlXzMkKSgkZV8xLCBlXzIkKX0gd2hlcmUgJGEkIGFuZCAkaSQgYXJlIGEgdmFyaWFibGVzIHRoYXQgYXJlIG5vdCB1c2VkIGluICRlXzMkLiAKCgpcYmVnaW57Z3JhbW1hcn0Ke1xiZiBjb21wb3VuZEFzc2lnbm1lbnRPcGVyYXRvcjp9YCo9JzsKICAgICAgYC89JzsKICAgICAgYFx+e30vPSc7CiAgICAgIGBcJT0nOwogICAgICBgKz0nOwogICAgICBgLT0nOwogICAgICBge1xlc2NhcGVncmFtbWFyIFxsdCBcbHR9PSc7CiAgICAgICBge1xlc2NhcGVncmFtbWFyIFxndCBcZ3R9PSc7CiAgICAgIGBcJj0nOwogICAgICBgXF57fT0nOwogICAgICBgJHwkPScKICAgIC4KXGVuZHtncmFtbWFyfQoKICAgIApcc3Vic2VjdGlvbnsgQ29uZGl0aW9uYWx9ClxsYWJlbHtjb25kaXRpb25hbH0KCkEge1xlbSBjb25kaXRpb25hbCBleHByZXNzaW9ufSBldmFsdWF0ZXMgb25lIG9mIHR3byBleHByZXNzaW9ucyBiYXNlZCBvbiBhIGJvb2xlYW4gY29uZGl0aW9uLgoKXGJlZ2lue2dyYW1tYXJ9CiAge1xiZiBjb25kaXRpb25hbEV4cHJlc3Npb246fQogICAgIGxvZ2ljYWxPckV4cHJlc3Npb24gKGA/JyBleHByZXNzaW9uV2l0aG91dENhc2NhZGUgYHtcZXNjYXBlZ3JhbW1hciA6fScgZXhwcmVzc2lvbldpdGhvdXRDYXNjYWRlKT8KICAgIC4gJSB0aGUgZmlyc3QgIGJyYW5jaGVzIGNvdWxkICB0b3AgbGV2ZWwgZXhwcmVzc2lvbnMsIGl0IHNlZW1zLCBidXQgY2VydGFpbmx5IE5PVCB0aGUgc2Vjb25kClxlbmR7Z3JhbW1hcn0KCkV2YWx1YXRpb24gb2YgYSBjb25kaXRpb25hbCBleHByZXNzaW9uICRjJCBvZiB0aGUgZm9ybSAkZV8xID8gZV8yIDogZV8zJCBwcm9jZWVkcyBhcyBmb2xsb3dzOgoKRmlyc3QsICRlXzEkIGlzIGV2YWx1YXRlZCB0byBhbiBvYmplY3QgJG9fMSQuICBUaGVuLCAkb18xJCBpcyAgc3ViamVjdGVkIHRvIGJvb2xlYW4gY29udmVyc2lvbiAoXHJlZntib29sZWFuQ29udmVyc2lvbn0pIHByb2R1Y2luZyBhbiBvYmplY3QgJHIkLiAgSWYgJHIkIGlzIHRydWUsIHRoZW4gdGhlIHZhbHVlIG9mICRjJCBpcyB0aGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb24gJGVfMiQuIE90aGVyd2lzZSB0aGUgdmFsdWUgb2YgJGMkIGlzIHRoZSByZXN1bHQgb2YgZXZhbHVhdGluZyB0aGUgZXhwcmVzc2lvbiAkZV8zJC4gCgpJZiBhbGwgb2YgdGhlIGZvbGxvd2luZyBob2xkOgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gJGVfMSQgc2hvd3MgdGhhdCBhIHZhcmlhYmxlICR2JCBoYXMgdHlwZSAkVCQuClxpdGVtICR2JCBpcyBub3QgcG90ZW50aWFsbHkgbXV0YXRlZCBpbiAkZV8yJCBvciB3aXRoaW4gYSBjbG9zdXJlLgpcaXRlbSBJZiB0aGUgdmFyaWFibGUgJHYkIGlzIGFjY2Vzc2VkIGJ5IGEgY2xvc3VyZSBpbiAkZV8yJCB0aGVuIHRoZSB2YXJpYWJsZSAkdiQgaXMgbm90IHBvdGVudGlhbGx5IG11dGF0ZWQgYW55d2hlcmUgaW4gdGhlIHNjb3BlIG9mICR2JC4KXGVuZHtpdGVtaXplfQoKdGhlbiB0aGUgdHlwZSBvZiAkdiQgaXMga25vd24gdG8gYmUgJFQkIGluICRlXzIkLgoKCiBJdCBpcyBhIHN0YXRpYyB0eXBlIHdhcm5pbmcgaWYgdGhlIHN0YXRpYyB0eXBlIG9mICRlXzEkIG1heSBub3QgYmUgYXNzaWduZWQgdG8gXGNvZGV7Ym9vbH0uICBUaGUgc3RhdGljIHR5cGUgb2YgJGMkIGlzIHRoZSBsZWFzdCB1cHBlciBib3VuZCAoXHJlZntsZWFzdFVwcGVyQm91bmRzfSkgb2YgdGhlIHN0YXRpYyB0eXBlIG9mICRlXzIkIGFuZCB0aGUgc3RhdGljIHR5cGUgb2YgJGVfMyQuCiAgCgpcc3Vic2VjdGlvbnsgTG9naWNhbCBCb29sZWFuIEV4cHJlc3Npb25zfQpcbGFiZWx7bG9naWNhbEJvb2xlYW5FeHByZXNzaW9uc30KClRoZSBsb2dpY2FsIGJvb2xlYW4gZXhwcmVzc2lvbnMgY29tYmluZSBib29sZWFuIG9iamVjdHMgdXNpbmcgdGhlIGJvb2xlYW4gY29uanVuY3Rpb24gYW5kIGRpc2p1bmN0aW9uIG9wZXJhdG9ycy4KClxiZWdpbntncmFtbWFyfQp7XGJmIGxvZ2ljYWxPckV4cHJlc3Npb246fQogICAgICBsb2dpY2FsQW5kRXhwcmVzc2lvbiAoYCR8fCQnIGxvZ2ljYWxBbmRFeHByZXNzaW9uKSoKICAgIC4KCgp7XGJmIGxvZ2ljYWxBbmRFeHByZXNzaW9uOn0KICAgICAgZXF1YWxpdHlFeHByZXNzaW9uIChgXCZcJicgZXF1YWxpdHlFeHByZXNzaW9uKSoKJSAgICAgIGJpdHdpc2VPckV4cHJlc3Npb24gKGBcJlwmJyBiaXR3aXNlT3JFeHByZXNzaW9uKSoKICAgIC4KIFxlbmR7Z3JhbW1hcn0KIApBIHtcZW0gbG9naWNhbCBib29sZWFuIGV4cHJlc3Npb259IGlzIGVpdGhlciBhbiBlcXVhbGl0eSBleHByZXNzaW9uIChccmVme2VxdWFsaXR5fSksIG9yIGFuIGludm9jYXRpb24gb2YgYSBsb2dpY2FsIGJvb2xlYW4gb3BlcmF0b3Igb24gYW4gZXhwcmVzc2lvbiAkZV8xJCB3aXRoIGFyZ3VtZW50ICRlXzIkLgogCkV2YWx1YXRpb24gb2YgYSBsb2dpY2FsIGJvb2xlYW4gZXhwcmVzc2lvbiAkYiQgb2YgdGhlIGZvcm0gJGVfMSB8fCBlXzIkIGNhdXNlcyB0aGUgZXZhbHVhdGlvbiBvZiAkZV8xJCB3aGljaCBpcyB0aGVuICBzdWJqZWN0ZWQgdG8gYm9vbGVhbiBjb252ZXJzaW9uLCB5aWVsZGluZyBhbiBvYmplY3QgJG9fMSQ7IGlmICRvXzEkIGlzIHRydWUsIHRoZSByZXN1bHQgb2YgZXZhbHVhdGluZyAkYiQgaXMgdHJ1ZSwgb3RoZXJ3aXNlICRlXzIkIGlzIGV2YWx1YXRlZCB0byBhbiBvYmplY3QgJG9fMiQsIHdoaWNoIGlzIHRoZW4gc3ViamVjdGVkIHRvIGJvb2xlYW4gY29udmVyc2lvbiAoXHJlZntib29sZWFuQ29udmVyc2lvbn0pIHByb2R1Y2luZyBhbiBvYmplY3QgJHIkLCB3aGljaCBpcyB0aGUgdmFsdWUgb2YgJGIkLiAKCkV2YWx1YXRpb24gb2YgYSBsb2dpY2FsIGJvb2xlYW4gZXhwcmVzc2lvbiAkYiQgb2YgdGhlIGZvcm0gJGVfMSBcJlwmIGVfMiQgY2F1c2VzIHRoZSBldmFsdWF0aW9uIG9mICRlXzEkIHdoaWNoIGlzIHRoZW4gc3ViamVjdGVkIHRvIGJvb2xlYW4gY29udmVyc2lvbiwgeWllbGRpbmcgYW4gb2JqZWN0ICRvXzEkOyBpZiAkb18xJCBpcyBub3QgIHRydWUsIHRoZSByZXN1bHQgb2YgZXZhbHVhdGluZyAkYiQgaXMgZmFsc2UsIG90aGVyd2lzZSAkZV8yJCBpcyBldmFsdWF0ZWQgdG8gYW4gb2JqZWN0ICRvXzIkLCB3aGljaCBpcyB0aGVuIHN1YmplY3RlZCB0byBib29sZWFuIGNvbnZlcnNpb24gcHJvZHVjaW5nIGFuIG9iamVjdCAkciQsIHdoaWNoIGlzIHRoZSB2YWx1ZSBvZiAkYiQuIAoKQSBsb2dpY2FsIGJvb2xlYW4gZXhwcmVzc2lvbiAkYiQgb2YgdGhlIGZvcm0gJGVfMSBcJlwmIGVfMiQgc2hvd3MgdGhhdCBhIHZhcmlhYmxlICR2JCBoYXMgdHlwZSAKJFQkIGlmIGFsbCBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaG9sZDoKXGJlZ2lue2l0ZW1pemV9ClxpdGVtIEVpdGhlciAkZV8xJCBzaG93cyB0aGF0ICR2JCBoYXMgdHlwZSAkVCQgb3IgJGVfMiQgc2hvd3MgdGhhdCAkdiQgaGFzIHR5cGUgJFQkLgpcaXRlbSAkdiQgaXMgYSBsb2NhbCB2YXJpYWJsZSBvciBmb3JtYWwgcGFyYW1ldGVyLgpcaXRlbSBUaGUgdmFyaWFibGUgJHYkIGlzIG5vdCBtdXRhdGVkIGluICRlXzIkIG9yIHdpdGhpbiBhIGNsb3N1cmUuClxlbmR7aXRlbWl6ZX0KCkZ1cnRoZXJtb3JlLCBpZiBhbGwgb2YgdGhlIGZvbGxvd2luZyBob2xkOgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gJGVfMSQgc2hvd3MgdGhhdCAkdiQgaGFzIHR5cGUgJFQkLgpcaXRlbSAkdiQgaXMgbm90IG11dGF0ZWQgaW4gZWl0aGVyICRlXzEkLCAkZV8yJCBvciB3aXRoaW4gYSBjbG9zdXJlLgpcaXRlbSBJZiB0aGUgdmFyaWFibGUgJHYkIGlzIGFjY2Vzc2VkIGJ5IGEgY2xvc3VyZSBpbiAkZV8yJCB0aGVuIHRoZSB2YXJpYWJsZSAkdiQgaXMgbm90IHBvdGVudGlhbGx5IG11dGF0ZWQgYW55d2hlcmUgaW4gdGhlIHNjb3BlIG9mICR2JC4gClxlbmR7aXRlbWl6ZX0KdGhlbiB0aGUgdHlwZSBvZiAkdiQgaXMga25vd24gdG8gYmUgJFQkIGluICRlXzIkLgoKSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiB0aGUgc3RhdGljIHR5cGUgb2YgJGVfMSQgbWF5IG5vdCBiZSBhc3NpZ25lZCB0byBcY2R7Ym9vbH0gb3IgaWYgdGhlIHN0YXRpYyB0eXBlIG9mICRlXzIkIG1heSBub3QgYmUgYXNzaWduZWQgdG8gXGNke2Jvb2x9LiBUaGUgc3RhdGljIHR5cGUgb2YgYSBsb2dpY2FsIGJvb2xlYW4gZXhwcmVzc2lvbiBpcyBcY29kZXtib29sfS4KCiAgICAgCiBcc3Vic2VjdGlvbnsgRXF1YWxpdHl9CiBcbGFiZWx7ZXF1YWxpdHl9CiAKRXF1YWxpdHkgZXhwcmVzc2lvbnMgdGVzdCBvYmplY3RzIGZvciBlcXVhbGl0eS4KCiBcYmVnaW57Z3JhbW1hcn0Ke1xiZiBlcXVhbGl0eUV4cHJlc3Npb246fXJlbGF0aW9uYWxFeHByZXNzaW9uIChlcXVhbGl0eU9wZXJhdG9yIHJlbGF0aW9uYWxFeHByZXNzaW9uKT87CiAgICAgIFxTVVBFUnt9IGVxdWFsaXR5T3BlcmF0b3IgcmVsYXRpb25hbEV4cHJlc3Npb24KICAgIC4KCntcYmYgZXF1YWxpdHlPcGVyYXRvcjp9YD09JzsKICAgICAgYCE9JwogICAgLgogXGVuZHtncmFtbWFyfQogCkFuIHtcZW0gZXF1YWxpdHkgZXhwcmVzc2lvbn0gaXMgZWl0aGVyIGEgcmVsYXRpb25hbCBleHByZXNzaW9uIChccmVme3JlbGF0aW9uYWxFeHByZXNzaW9uc30pLCBvciBhbiBpbnZvY2F0aW9uIG9mIGFuIGVxdWFsaXR5IG9wZXJhdG9yIG9uIGVpdGhlciBcU1VQRVJ7fSBvciBhbiBleHByZXNzaW9uICRlXzEkLCB3aXRoIGFyZ3VtZW50ICRlXzIkLgoKCkV2YWx1YXRpb24gb2YgYW4gZXF1YWxpdHkgZXhwcmVzc2lvbiAkZWUkIG9mIHRoZSBmb3JtIFxjb2RleyRlXzEkID09ICRlXzIkfSBwcm9jZWVkcyBhcyBmb2xsb3dzOgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gVGhlIGV4cHJlc3Npb24gJGVfMSQgaXMgZXZhbHVhdGVkIHRvIGFuIG9iamVjdCAkb18xJC4KXGl0ZW0gVGhlIGV4cHJlc3Npb24gJGVfMiQgaXMgZXZhbHVhdGVkIHRvIGFuIG9iamVjdCAkb18yJC4KXGl0ZW0gSWYgZWl0aGVyICRvXzEkIG9yICRvXzIkIGlzIFxOVUxMe30sIHRoZW4gJGVlJCBldmFsdWF0ZXMgdG8gXGNvZGV7aWRlbnRpY2FsKCRvXzEkLCAkb18yJCl9LiAgT3RoZXJ3aXNlLApcaXRlbSAkZWUkIGlzIGVxdWl2YWxlbnQgdG8gdGhlIG1ldGhvZCBpbnZvY2F0aW9uIFxjb2RleyRvXzEkLj09KCRvXzIkKX0uClxlbmR7aXRlbWl6ZX0KCgpFdmFsdWF0aW9uIG9mIGFuIGVxdWFsaXR5IGV4cHJlc3Npb24gJGVlJCBvZiB0aGUgZm9ybSBcY29kZXtcU1VQRVJ7fSA9PSAkZSR9IHByb2NlZWRzIGFzIGZvbGxvd3M6ClxiZWdpbntpdGVtaXplfQpcaXRlbSBUaGUgZXhwcmVzc2lvbiAkZSQgaXMgZXZhbHVhdGVkIHRvIGFuIG9iamVjdCAkbyQuClxpdGVtIElmIGVpdGhlciBcVEhJU3t9IG9yICRvJCBpcyBcTlVMTHt9LCB0aGVuICRlZSQgZXZhbHVhdGVzIHRvIFxjb2Rle2lkZW50aWNhbChcVEhJU3t9LCAkbyQpfS4gT3RoZXJ3aXNlLApcaXRlbSAkZWUkIGlzIGVxdWl2YWxlbnQgdG8gdGhlIG1ldGhvZCBpbnZvY2F0aW9uIFxjb2Rle1xTVVBFUnt9Lj09KCRvJCl9LgpcZW5ke2l0ZW1pemV9CgpcY29tbWVudGFyeXtBcyBhIHJlc3VsdCBvZiB0aGUgYWJvdmUgZGVmaW5pdGlvbiwgdXNlciBkZWZpbmVkIFxjb2Rlez09fSBtZXRob2RzIGNhbiBhc3N1bWUgdGhhdCB0aGVpciBhcmd1bWVudCBpcyBub24tbnVsbCwgYW5kIGF2b2lkIHRoZSBzdGFuZGFyZCBib2lsZXItcGxhdGUgcHJlbHVkZToKIAogXGNvZGV7aWYgKGlkZW50aWNhbChcTlVMTHt9LCBhcmcpKSByZXR1cm4gXEZBTFNFe307fQoKQW5vdGhlciBpbXBsaWNhdGlvbiBpcyB0aGF0IHRoZXJlIGlzIG5ldmVyIGEgbmVlZCB0byB1c2UgXGNvZGV7aWRlbnRpY2FsKCl9IHRvIHRlc3QgYWdhaW5zdCBcTlVMTHt9LCBub3Igc2hvdWxkIGFueW9uZSBldmVyIHdvcnJ5IGFib3V0IHdoZXRoZXIgdG8gd3JpdGUgXE5VTEx7fSA9PSAkZSQgb3IgJGUkID09IFxOVUxMe30uIAp9CgpBbiBlcXVhbGl0eSBleHByZXNzaW9uIG9mIHRoZSBmb3JtIFxjb2RleyRlXzEkICE9ICRlXzIkfSAgaXMgZXF1aXZhbGVudCB0byB0aGUgZXhwcmVzc2lvbiBcY29kZXshKCRlXzEkID09ICRlXzIkKX0uIEFuIGVxdWFsaXR5IGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gXGNvZGV7XFNVUEVSe30gIT0gJGUkfSBpcyBlcXVpdmFsZW50IHRvIHRoZSBleHByZXNzaW9uIFxjb2RleyEoXFNVUEVSe30gPT0gJGUkKX0uCgoKIAogJVRoZSBleHByZXNzaW9uICRlXzEkIGlzIGV2YWx1YXRlZCB0byBhbiBvYmplY3QgJG9fMSQ7IHRoZW4gdGhlIGV4cHJlc3Npb24gJGVfMiQgaXMgZXZhbHVhdGVkIHRvIGFuIG9iamVjdCAkb18yJC4gIE5leHQsIGlmICRvXzEkIGFuZCAkb18yJCBhcmUgdGhlIHNhbWUgb2JqZWN0LCB0aGVuICRlZSQgZXZhbHVhdGVzIHRvIFxUUlVFe30sIG90aGVyd2lzZSAkZWUkIGV2YWx1YXRlcyB0byBcRkFMU0V7fS4gCiAKCiBUaGUgc3RhdGljIHR5cGUgb2YgYW4gZXF1YWxpdHkgZXhwcmVzc2lvbiBpcyBcY29kZXtib29sfS4KIAogClxzdWJzZWN0aW9ueyBSZWxhdGlvbmFsIEV4cHJlc3Npb25zfQpcbGFiZWx7cmVsYXRpb25hbEV4cHJlc3Npb25zfQoKUmVsYXRpb25hbCBleHByZXNzaW9ucyBpbnZva2UgdGhlIHJlbGF0aW9uYWwgb3BlcmF0b3JzIG9uIG9iamVjdHMuCgogXGJlZ2lue2dyYW1tYXJ9CntcYmYgcmVsYXRpb25hbEV4cHJlc3Npb246fWJpdHdpc2VPckV4cHJlc3Npb24gKHR5cGVUZXN0ICR8JCB0eXBlQ2FzdCAkfCQgIHJlbGF0aW9uYWxPcGVyYXRvciBiaXR3aXNlT3JFeHByZXNzaW9uKT87CiAgICAgIFxTVVBFUnt9IHJlbGF0aW9uYWxPcGVyYXRvciBiaXR3aXNlT3JFeHByZXNzaW9uCiAgICAuCgoKe1xiZiByZWxhdGlvbmFsT3BlcmF0b3I6fWB7XGVzY2FwZWdyYW1tYXIgXGd0PX0nOwogICAgICBge1xlc2NhcGVncmFtbWFyIFxndH0nOwogICAgICBge1xlc2NhcGVncmFtbWFyIFxsdH09JzsKICAgICAgYHtcZXNjYXBlZ3JhbW1hciBcbHR9JwogICAgLgogXGVuZHtncmFtbWFyfQogCkEge1xlbSByZWxhdGlvbmFsIGV4cHJlc3Npb259IGlzIGVpdGhlciBhIGJpdHdpc2UgZXhwcmVzc2lvbiAoXHJlZntiaXR3aXNlRXhwcmVzc2lvbnN9KSwgb3IgYW4gaW52b2NhdGlvbiBvZiBhIHJlbGF0aW9uYWwgb3BlcmF0b3Igb24gZWl0aGVyIFxTVVBFUnt9IG9yIGFuIGV4cHJlc3Npb24gJGVfMSQsIHdpdGggYXJndW1lbnQgJGVfMiQuCiAKQSByZWxhdGlvbmFsIGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gICRlXzEkICRvcCQgJGVfMiQgaXMgZXF1aXZhbGVudCB0byB0aGUgbWV0aG9kIGludm9jYXRpb24gXGNvZGV7JGVfMSQuJG9wJCgkZV8yJCl9LiBBIHJlbGF0aW9uYWwgZXhwcmVzc2lvbiBvZiB0aGUgZm9ybSAgXFNVUEVSe30gJG9wJCAkZV8yJCBpcyBlcXVpdmFsZW50IHRvIHRoZSBtZXRob2QgaW52b2NhdGlvbiBcY29kZXtcU1VQRVJ7fS4kb3AkKCRlXzIkKX0uIAoKXHN1YnNlY3Rpb257IEJpdHdpc2UgRXhwcmVzc2lvbnN9ClxsYWJlbHtiaXR3aXNlRXhwcmVzc2lvbnN9CgpCaXR3aXNlIGV4cHJlc3Npb25zIGludm9rZSB0aGUgYml0d2lzZSBvcGVyYXRvcnMgb24gb2JqZWN0cy4KCiBcYmVnaW57Z3JhbW1hcn0Ke1xiZiBiaXR3aXNlT3JFeHByZXNzaW9uOn1iaXR3aXNlWG9yRXhwcmVzc2lvbiAoYCR8JCcgYml0d2lzZVhvckV4cHJlc3Npb24pKjsKICAgICAgXFNVUEVSe30gKGAkfCQnIGJpdHdpc2VYb3JFeHByZXNzaW9uKSsKICAgIC4KCntcYmYgYml0d2lzZVhvckV4cHJlc3Npb246fWJpdHdpc2VBbmRFeHByZXNzaW9uIChgXF57fScgYml0d2lzZUFuZEV4cHJlc3Npb24pKjsKICAgICAgXFNVUEVSe30gKGBcXnt9JyBiaXR3aXNlQW5kRXhwcmVzc2lvbikrCiAgICAuCgp7XGJmIGJpdHdpc2VBbmRFeHByZXNzaW9uOn1zaGlmdEV4cHJlc3Npb24gKGBcJicgc2hpZnRFeHByZXNzaW9uKSo7CiAgICAgIFxTVVBFUnt9IChgXCYnIHNoaWZ0RXhwcmVzc2lvbikrCiAgICAuCgp7XGJmIGJpdHdpc2VPcGVyYXRvcjp9YFwmJzsKICAgICAgYFxee30nOwogICAgICBgJHwkJwogICAgLgogXGVuZHtncmFtbWFyfQogCkEge1xlbSBiaXR3aXNlIGV4cHJlc3Npb259IGlzIGVpdGhlciBhIHNoaWZ0IGV4cHJlc3Npb24gKFxyZWZ7c2hpZnR9KSwgb3IgYW4gaW52b2NhdGlvbiBvZiBhIGJpdHdpc2Ugb3BlcmF0b3Igb24gZWl0aGVyIFxTVVBFUnt9IG9yIGFuIGV4cHJlc3Npb24gJGVfMSQsIHdpdGggYXJndW1lbnQgJGVfMiQuCiAKIEEgYml0d2lzZSBleHByZXNzaW9uIG9mIHRoZSBmb3JtICAkZV8xJCAkb3AkICRlXzIkIGlzIGVxdWl2YWxlbnQgdG8gdGhlIG1ldGhvZCBpbnZvY2F0aW9uICRlXzEub3AoZV8yKSQuCkEgYml0d2lzZSBleHByZXNzaW9uIG9mIHRoZSBmb3JtICBcY29kZXtcU1VQRVJ7fSAkb3AkICRlXzIkfSBpcyBlcXVpdmFsZW50IHRvIHRoZSBtZXRob2QgaW52b2NhdGlvbiBcY29kZXtcU1VQRVJ7fS5vcCgkZV8yJCl9LgoKXGNvbW1lbnRhcnl7Ckl0IHNob3VsZCBiZSBvYnZpb3VzIHRoYXQgdGhlIHN0YXRpYyB0eXBlIHJ1bGVzIGZvciB0aGVzZSBleHByZXNzaW9ucyBhcmUgZGVmaW5lZCBieSB0aGUgZXF1aXZhbGVuY2UgYWJvdmUgLSBlcmdvLCBieSB0aGUgdHlwZSBydWxlcyBmb3IgbWV0aG9kIGludm9jYXRpb24gYW5kIHRoZSBzaWduYXR1cmVzIG9mIHRoZSBvcGVyYXRvcnMgb24gdGhlIHR5cGUgJGVfMSQuIFRoZSBzYW1lIGhvbGRzIGluIHNpbWlsYXIgc2l0dWF0aW9ucyB0aHJvdWdob3V0IHRoaXMgc3BlY2lmaWNhdGlvbi4KfQoKIApcc3Vic2VjdGlvbnsgU2hpZnR9ClxsYWJlbHtzaGlmdH0KClNoaWZ0IGV4cHJlc3Npb25zIGludm9rZSB0aGUgc2hpZnQgb3BlcmF0b3JzIG9uIG9iamVjdHMuCgogXGJlZ2lue2dyYW1tYXJ9CntcYmYgc2hpZnRFeHByZXNzaW9uOn1hZGRpdGl2ZUV4cHJlc3Npb24gKHNoaWZ0T3BlcmF0b3IgYWRkaXRpdmVFeHByZXNzaW9uKSo7CiAgICAgIFxTVVBFUnt9IChzaGlmdE9wZXJhdG9yIGFkZGl0aXZlRXhwcmVzc2lvbikrCiAgICAuCgp7XGJmIHNoaWZ0T3BlcmF0b3I6fWB7XGVzY2FwZWdyYW1tYXIgXGx0XGx0J307CiAgICAgICBge1xlc2NhcGVncmFtbWFyIFxndCBcZ3R9JyAKICAgIC4KIFxlbmR7Z3JhbW1hcn0KIApBIHtcZW0gc2hpZnQgZXhwcmVzc2lvbn0gaXMgZWl0aGVyIGFuIGFkZGl0aXZlIGV4cHJlc3Npb24gKFxyZWZ7YWRkaXRpdmVFeHByZXNzaW9uc30pLCBvciBhbiBpbnZvY2F0aW9uIG9mIGEgc2hpZnQgb3BlcmF0b3Igb24gZWl0aGVyIFxTVVBFUnt9IG9yIGFuIGV4cHJlc3Npb24gJGVfMSQsIHdpdGggYXJndW1lbnQgJGVfMiQuCiAKIEEgc2hpZnQgZXhwcmVzc2lvbiBvZiB0aGUgZm9ybSAgJGVfMSQgJG9wJCAkZV8yJCBpcyBlcXVpdmFsZW50IHRvIHRoZSBtZXRob2QgaW52b2NhdGlvbiBcY29kZXskZV8xJC4kb3AkKCRlXzIkKX0uIEEgc2hpZnQgZXhwcmVzc2lvbiBvZiB0aGUgZm9ybSAgXFNVUEVSe30gJG9wJCAkZV8yJCBpcyBlcXVpdmFsZW50IHRvIHRoZSBtZXRob2QgaW52b2NhdGlvbiBcY29kZXtcU1VQRVJ7fS4kb3AkKCRlXzIkKX0uIAoKXGNvbW1lbnRhcnl7Ck5vdGUgdGhhdCB0aGlzIGRlZmluaXRpb24gaW1wbGllcyBsZWZ0LXRvLXJpZ2h0IGV2YWx1YXRpb24gb3JkZXIgYW1vbmcgc2hpZnQgZXhwcmVzc2lvbnM6IAoKJGVfMSA8PCBlXzIgPDwgZV8zJAoKaXMgZXZhbHVhdGVkIGFzICAkKGVfMSA8PCBlXzIgKS48PCAoZV8zKSQgIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gJChlXzEgPDwgZV8yKSA8PCBlXzMkLgpUaGUgc2FtZSBob2xkcyBmb3IgYWRkaXRpdmUgYW5kIG11bHRpcGxpY2F0aXZlIGV4cHJlc3Npb25zLgp9CiAgICAgCiBcc3Vic2VjdGlvbnsgQWRkaXRpdmUgRXhwcmVzc2lvbnN9ClxsYWJlbHthZGRpdGl2ZUV4cHJlc3Npb25zfQoKQWRkaXRpdmUgZXhwcmVzc2lvbnMgaW52b2tlIHRoZSBhZGRpdGlvbiBvcGVyYXRvcnMgb24gb2JqZWN0cy4KCiBcYmVnaW57Z3JhbW1hcn0Ke1xiZiBhZGRpdGl2ZUV4cHJlc3Npb246fW11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiAoYWRkaXRpdmVPcGVyYXRvciBtdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24pKjsKICAgICAgXFNVUEVSe30gKGFkZGl0aXZlT3BlcmF0b3IgbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKSsKICAgIC4KCntcYmYgYWRkaXRpdmVPcGVyYXRvcjp9YCsnOwogICAgICBgLScKICAgIC4KIFxlbmR7Z3JhbW1hcn0KIApBbiB7XGVtIGFkZGl0aXZlIGV4cHJlc3Npb259IGlzIGVpdGhlciBhIG11bHRpcGxpY2F0aXZlIGV4cHJlc3Npb24gKFxyZWZ7bXVsdGlwbGljYXRpdmVFeHByZXNzaW9uc30pLCBvciBhbiBpbnZvY2F0aW9uIG9mIGFuIGFkZGl0aXZlIG9wZXJhdG9yIG9uIGVpdGhlciBcU1VQRVJ7fSBvciBhbiBleHByZXNzaW9uICRlXzEkLCB3aXRoIGFyZ3VtZW50ICRlXzIkLgoKQW4gYWRkaXRpdmUgZXhwcmVzc2lvbiBvZiB0aGUgZm9ybSAgJGVfMSQgJG9wJCAkZV8yJCBpcyBlcXVpdmFsZW50IHRvIHRoZSBtZXRob2QgaW52b2NhdGlvbiBcY29kZXskZV8xJC4kb3AkKCRlXzIkKX0uIEFuIGFkZGl0aXZlIGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gIFxTVVBFUnt9ICRvcCQgJGVfMiQgaXMgZXF1aXZhbGVudCB0byB0aGUgbWV0aG9kIGludm9jYXRpb24gXGNvZGV7XFNVUEVSe30uJG9wJCgkZV8yJCl9LiAKClRoZSBzdGF0aWMgdHlwZSBvZiBhbiBhZGRpdGl2ZSBleHByZXNzaW9uIGlzIHVzdWFsbHkgZGV0ZXJtaW5lZCBieSB0aGUgc2lnbmF0dXJlIGdpdmVuIGluIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgb3BlcmF0b3IgdXNlZC4gSG93ZXZlciwgaW52b2NhdGlvbnMgb2YgdGhlIG9wZXJhdG9ycyBcY2R7K30gIGFuZCBcY2R7LX0gb2YgY2xhc3MgXGNke2ludH0gYXJlIHRyZWF0ZWQgc3BlY2lhbGx5IGJ5IHRoZSB0eXBlY2hlY2tlci4gVGhlIHN0YXRpYyB0eXBlIG9mIGFuIGV4cHJlc3Npb24gJGVfMSArIGVfMiQgd2hlcmUgJGVfMSQgaGFzIHN0YXRpYyB0eXBlIFxjZHtpbnR9IGlzIFxjZHtpbnR9IGlmIHRoZSBzdGF0aWMgdHlwZSBvZiAkZV8yJCBpcyBcY2R7aW50fSwgYW5kIFxjZHtkb3VibGV9IGlmIHRoZSBzdGF0aWMgdHlwZSBvZiAkZV8yJCBpcyBcY2R7ZG91YmxlfS4gVGhlIHN0YXRpYyB0eXBlIG9mIGFuIGV4cHJlc3Npb24gJGVfMSAtIGVfMiQgd2hlcmUgJGVfMSQgaGFzIHN0YXRpYyB0eXBlIFxjZHtpbnR9IGlzIFxjZHtpbnR9IGlmIHRoZSBzdGF0aWMgdHlwZSBvZiAkZV8yJCBpcyBcY2R7aW50fSwgYW5kIFxjZHtkb3VibGV9IGlmIHRoZSBzdGF0aWMgdHlwZSBvZiAkZV8yJCBpcyBcY2R7ZG91YmxlfS4KIAogClxzdWJzZWN0aW9ueyBNdWx0aXBsaWNhdGl2ZSBFeHByZXNzaW9uc30KXGxhYmVse211bHRpcGxpY2F0aXZlRXhwcmVzc2lvbnN9CgpNdWx0aXBsaWNhdGl2ZSBleHByZXNzaW9ucyBpbnZva2UgdGhlIG11bHRpcGxpY2F0aW9uIG9wZXJhdG9ycyBvbiBvYmplY3RzLgoKIFxiZWdpbntncmFtbWFyfQp7XGJmIG11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbjp9dW5hcnlFeHByZXNzaW9uIChtdWx0aXBsaWNhdGl2ZU9wZXJhdG9yIHVuYXJ5RXhwcmVzc2lvbikqOwogICAgICBcU1VQRVJ7fSAobXVsdGlwbGljYXRpdmVPcGVyYXRvciB1bmFyeUV4cHJlc3Npb24pKwogICAgLgoKe1xiZiBtdWx0aXBsaWNhdGl2ZU9wZXJhdG9yOn1gKic7CiAgICAgIGAvJzsKICAgICAgYFwlJzsKICAgICAgYFx+e30vJwogICAgLgogICAgCiBcZW5ke2dyYW1tYXJ9CiAgICAKIEEge1xlbSBtdWx0aXBsaWNhdGl2ZSBleHByZXNzaW9ufSBpcyBlaXRoZXIgYSB1bmFyeSBleHByZXNzaW9uIChccmVme3VuYXJ5RXhwcmVzc2lvbnN9KSwgb3IgYW4gaW52b2NhdGlvbiBvZiBhIG11bHRpcGxpY2F0aXZlIG9wZXJhdG9yIG9uIGVpdGhlciBcU1VQRVJ7fSBvciBhbiBleHByZXNzaW9uICRlXzEkLCB3aXRoIGFyZ3VtZW50ICRlXzIkLgogCiBBIG11bHRpcGxpY2F0aXZlIGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gICRlXzEkICRvcCQgJGVfMiQgaXMgZXF1aXZhbGVudCB0byB0aGUgbWV0aG9kIGludm9jYXRpb24gXGNvZGV7JGVfMSQuJG9wJCgkZV8yJCl9LiBBIG11bHRpcGxpY2F0aXZlIGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gIFxTVVBFUnt9ICRvcCQgJGVfMiQgaXMgZXF1aXZhbGVudCB0byB0aGUgbWV0aG9kIGludm9jYXRpb24gXGNvZGV7XFNVUEVSe30uJG9wJCgkZV8yJCl9LiAgIAogClRoZSBzdGF0aWMgdHlwZSBvZiBhbiBtdWx0aXBsaWNhdGl2ZSBleHByZXNzaW9uIGlzIHVzdWFsbHkgZGV0ZXJtaW5lZCBieSB0aGUgc2lnbmF0dXJlIGdpdmVuIGluIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgb3BlcmF0b3IgdXNlZC4gSG93ZXZlciwgaW52b2NhdGlvbnMgb2YgdGhlIG9wZXJhdG9ycyBcY2R7Kn0sIFxjZHtcJX0gIGFuZCBcY2R7XH57fS99IG9mIGNsYXNzIFxjZHtpbnR9IGFyZSB0cmVhdGVkIHNwZWNpYWxseSBieSB0aGUgdHlwZWNoZWNrZXIuIFRoZSBzdGF0aWMgdHlwZSBvZiBhbiBleHByZXNzaW9uICRlXzEgKiBlXzIkIHdoZXJlICRlXzEkIGhhcyBzdGF0aWMgdHlwZSBcY2R7aW50fSBpcyBcY2R7aW50fSBpZiB0aGUgc3RhdGljIHR5cGUgb2YgJGVfMiQgaXMgXGNke2ludH0sIGFuZCBcY2R7ZG91YmxlfSBpZiB0aGUgc3RhdGljIHR5cGUgb2YgJGVfMiQgaXMgXGNke2RvdWJsZX0uIFRoZSBzdGF0aWMgdHlwZSBvZiBhbiBleHByZXNzaW9uICRlXzEgXCUgZV8yJCB3aGVyZSAkZV8xJCBoYXMgc3RhdGljIHR5cGUgXGNke2ludH0gaXMgXGNke2ludH0gaWYgdGhlIHN0YXRpYyB0eXBlIG9mICRlXzIkIGlzIFxjZHtpbnR9LCBhbmQgXGNke2RvdWJsZX0gaWYgdGhlIHN0YXRpYyB0eXBlIG9mICRlXzIkIGlzIFxjZHtkb3VibGV9LiAgVGhlIHN0YXRpYyB0eXBlIG9mIGFuIGV4cHJlc3Npb24gXGNkeyRlXzEkIFx+e30vICRlXzIkfSB3aGVyZSAkZV8xJCBoYXMgc3RhdGljIHR5cGUgXGNke2ludH0gaXMgXGNke2ludH0gaWYgdGhlIHN0YXRpYyB0eXBlIG9mICRlXzIkIGlzIFxjZHtpbnR9LgogClxzdWJzZWN0aW9ueyBVbmFyeSBFeHByZXNzaW9uc30KXGxhYmVse3VuYXJ5RXhwcmVzc2lvbnN9CgpVbmFyeSBleHByZXNzaW9ucyBpbnZva2UgdW5hcnkgb3BlcmF0b3JzIG9uIG9iamVjdHMuCgpcYmVnaW57Z3JhbW1hcn0Ke1xiZiB1bmFyeUV4cHJlc3Npb246fXByZWZpeE9wZXJhdG9yIHVuYXJ5RXhwcmVzc2lvbjsKICAgICAgcG9zdGZpeEV4cHJlc3Npb247CiAgICAgIChtaW51c09wZXJhdG9yICR8JCB0aWxkZU9wZXJhdG9yKSBcU1VQRVJ7fTsKICAgICAgaW5jcmVtZW50T3BlcmF0b3IgYXNzaWduYWJsZUV4cHJlc3Npb24KICAgIC4KIAoge1xiZiBwcmVmaXhPcGVyYXRvcjp9bWludXNPcGVyYXRvcjsKICAgICAgbmVnYXRpb25PcGVyYXRvcjsKICAgICAgdGlsZGVPcGVyYXRvcgogICAgLgogICAgICAgCiAgICAgICAKICB7XGJmIG1pbnVzT3BlcmF0b3I6fWAtJzsgIC4KCgogICAge1xiZiBuZWdhdGlvbk9wZXJhdG9yOn1gIScgOwogICAgICAuCiAgICAgIAogICAge1xiZiB0aWxkZU9wZXJhdG9yOn0gIGBcfnt9JwogICAgLgogICAgCiAgICAKXGVuZHtncmFtbWFyfQoKQSB7XGVtIHVuYXJ5IGV4cHJlc3Npb259IGlzIGVpdGhlciBhIHBvc3RmaXggZXhwcmVzc2lvbiAgKFxyZWZ7cG9zdGZpeEV4cHJlc3Npb25zfSksIGFuIGludm9jYXRpb24gb2YgYSBwcmVmaXggb3BlcmF0b3Igb24gYW4gZXhwcmVzc2lvbiBvciBhbiBpbnZvY2F0aW9uIG9mIGEgdW5hcnkgb3BlcmF0b3Igb24gZWl0aGVyIFxTVVBFUnt9IG9yIGFuIGV4cHJlc3Npb24gJGUkLgoKVGhlIGV4cHJlc3Npb24gJCFlJCBpcyBlcXVpdmFsZW50IHRvIHRoZSBleHByZXNzaW9uICRlPyBcRkFMU0V7fSA6XFRSVUV7fSQuIAoKRXZhbHVhdGlvbiBvZiBhbiBleHByZXNzaW9uIG9mIHRoZSBmb3JtIFxjb2RleysrJGUkfSBpcyBlcXVpdmFsZW50IHRvIFxjb2RleyRlJCArPSAxfS4gIEV2YWx1YXRpb24gb2YgYW4gZXhwcmVzc2lvbiBvZiB0aGUgZm9ybSBcY29kZXste30tJGUkfSBpcyBlcXVpdmFsZW50IHRvIFxjb2RleyRlJCAtPSAxfS4gCgolVGhlIGV4cHJlc3Npb24gJC1lJCBpcyBlcXVpdmFsZW50IHRvIHRoZSBtZXRob2QgaW52b2NhdGlvbiBcY29kZXskZSQuLSgpfS4gIFRoZSBleHByZXNzaW9uIFxjb2Rley1cU1VQRVJ7fX0gaXMgZXF1aXZhbGVudCAgdG8gdGhlIG1ldGhvZCBpbnZvY2F0aW9uIFxjb2Rle1xTVVBFUnt9Li0oKX0uCgpBbiBleHByZXNzaW9uIG9mIHRoZSBmb3JtIFxjb2RleyRvcCQgJGUkfSBpcyBlcXVpdmFsZW50IHRvIHRoZSBtZXRob2QgaW52b2NhdGlvbiBcY29kZXskZS5vcCgpJH0uIEFuIGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gXGNvZGV7JG9wJCBcU1VQRVJ7fX0gaXMgZXF1aXZhbGVudCB0byB0aGUgbWV0aG9kIGludm9jYXRpb24gXGNvZGV7XFNVUEVSe30uJG9wKCkkfS4KCgogICAgIApcc3Vic2VjdGlvbnsgUG9zdGZpeCBFeHByZXNzaW9uc30KXGxhYmVse3Bvc3RmaXhFeHByZXNzaW9uc30KClBvc3RmaXggZXhwcmVzc2lvbnMgaW52b2tlIHRoZSBwb3N0Zml4IG9wZXJhdG9ycyBvbiBvYmplY3RzLgoKIFxiZWdpbntncmFtbWFyfQp7XGJmIHBvc3RmaXhFeHByZXNzaW9uOn1hc3NpZ25hYmxlRXhwcmVzc2lvbiBwb3N0Zml4T3BlcmF0b3I7CiAgICAgIHByaW1hcnkgc2VsZWN0b3IqCiAgICAuCgp7XGJmIHBvc3RmaXhPcGVyYXRvcjp9CiAgICAgIGluY3JlbWVudE9wZXJhdG9yCiAgICAuCgp7XGJmIHNlbGVjdG9yOn1hc3NpZ25hYmxlU2VsZWN0b3I7CiAgICAgIGFyZ3VtZW50cwogICAgLgoKe1xiZiBpbmNyZW1lbnRPcGVyYXRvcjp9YCsrJzsKICAgICAgYC17fS0nCiAgICAuCiAgICAgICAgCiBcZW5ke2dyYW1tYXJ9CiAKIEEge1xlbSBwb3N0Zml4IGV4cHJlc3Npb259IGlzIGVpdGhlciBhIHByaW1hcnkgZXhwcmVzc2lvbiwgYSBmdW5jdGlvbiwgbWV0aG9kIG9yIGdldHRlciBpbnZvY2F0aW9uLCBvciBhbiBpbnZvY2F0aW9uIG9mIGEgcG9zdGZpeCBvcGVyYXRvciBvbiBhbiBleHByZXNzaW9uICRlJC4KCkEgcG9zdGZpeCBleHByZXNzaW9uIG9mIHRoZSBmb3JtIFxjb2RleyR2JCsrfSwgd2hlcmUgJHYkIGlzIGFuIGlkZW50aWZpZXIsIGlzIGVxdWl2YWxlbnQgdG8gXGNvZGV7KClce3ZhciByID0gJHYkOyAkdiQgPSByICsgMTsgcmV0dXJuIHJcfSgpfS4KClxyYXRpb25hbGV7VGhlIGFib3ZlIGVuc3VyZXMgdGhhdCBpZiAkdiQgaXMgYSBmaWVsZCwgdGhlIGdldHRlciBnZXRzIGNhbGxlZCBleGFjdGx5IG9uY2UuIExpa2V3aXNlIGluIHRoZSBjYXNlcyBiZWxvdy4gCn0KCkEgcG9zdGZpeCBleHByZXNzaW9uIG9mIHRoZSBmb3JtIFxjb2RleyRDLnYkICsrfSBpcyBlcXVpdmFsZW50IHRvIAoKXGNvZGV7KClce3ZhciByID0gJEMudiQ7ICRDLnYkID0gciArIDE7IHJldHVybiByXH0oKX0uCgpBIHBvc3RmaXggZXhwcmVzc2lvbiBvZiB0aGUgZm9ybSBcY29kZXskZV8xLnYkKyt9IGlzIGVxdWl2YWxlbnQgdG8gCgpcY29kZXsoeClce3ZhciByID0geC52OyB4LnYgPSByICsgMTsgXFJFVFVSTnt9IHJcfSgkZV8xJCl9LgoKQSBwb3N0Zml4IGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gXGNvZGV7JGVfMVtlXzJdJCsrfSwgIGlzIGVxdWl2YWxlbnQgdG8gCgpcY29kZXsoYSwgaSlce3ZhciByID0gYVtpXTsgYVtpXSA9IHIgKyAxOyByZXR1cm4gclx9KCRlXzEkLCAkZV8yJCl9LgoKQSBwb3N0Zml4IGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gXGNvZGV7JHYkLXt9LX0sIHdoZXJlICR2JCBpcyBhbiBpZGVudGlmaWVyLCBpcyBlcXVpdmFsZW50IHRvIAoKXGNvZGV7KClce3ZhciByID0gJHYkOyAkdiQgPSByIC0gMTsgcmV0dXJuIHJcfSgpfS4KCkEgcG9zdGZpeCBleHByZXNzaW9uIG9mIHRoZSBmb3JtIFxjb2RleyRDLnYkLXt9LX0gaXMgZXF1aXZhbGVudCB0byAKClxjb2RleygpXHt2YXIgciA9ICRDLnYkOyAkQy52JCA9IHIgLSAxOyByZXR1cm4gclx9KCl9LgoKQSBwb3N0Zml4IGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gXGNvZGV7JGVfMS52JC17fS19IGlzIGVxdWl2YWxlbnQgdG8gCgpcY29kZXsoeClce3ZhciByID0geC52OyB4LnYgPSByIC0gMTsgXFJFVFVSTnt9IHJcfSgkZV8xJCl9LgoKQSBwb3N0Zml4IGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gXGNvZGV7JGVfMVtlXzJdJC17fS19LCAgaXMgZXF1aXZhbGVudCB0byAKClxjb2RleyhhLCBpKVx7dmFyIHIgPSBhW2ldOyBhW2ldID0gciAtIDE7IHJldHVybiByXH0oJGVfMSQsICRlXzIkKX0uCiAKClxzdWJzZWN0aW9ueyBBc3NpZ25hYmxlIEV4cHJlc3Npb25zfQpcbGFiZWx7YXNzaWduYWJsZUV4cHJlc3Npb25zfQoKQXNzaWduYWJsZSBleHByZXNzaW9ucyBhcmUgZXhwcmVzc2lvbnMgdGhhdCBjYW4gYXBwZWFyIG9uIHRoZSBsZWZ0IGhhbmQgc2lkZSBvZiBhbiBhc3NpZ25tZW50LgpUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIGhvdyB0byBldmFsdWF0ZSB0aGVzZSBleHByZXNzaW9ucyB3aGVuIHRoZXkgZG8gbm90IGNvbnN0aXR1dGUgdGhlIGNvbXBsZXRlIGxlZnQgaGFuZCBzaWRlIG9mIGFuIGFzc2lnbm1lbnQuCgpccmF0aW9uYWxlewpPZiBjb3Vyc2UsIGlmIGFzc2lnbmFibGUgZXhwcmVzc2lvbnMgYWx3YXlzIGFwcGVhcmVkIHtcZW0gYXN9IHRoZSBsZWZ0IGhhbmQgc2lkZSwgb25lIHdvdWxkIGhhdmUgbm8gbmVlZCBmb3IgdGhlaXIgdmFsdWUsIGFuZCB0aGUgcnVsZXMgZm9yIGV2YWx1YXRpbmcgdGhlbSB3b3VsZCBiZSB1bm5lY2Vzc2FyeS4gSG93ZXZlciwgIGFzc2lnbmFibGUgZXhwcmVzc2lvbnMgY2FuIGJlIHN1YmV4cHJlc3Npb25zIG9mIG90aGVyIGV4cHJlc3Npb25zIGFuZCB0aGVyZWZvcmUgbXVzdCBiZSBldmFsdWF0ZWQuCn0KCgoKXGJlZ2lue2dyYW1tYXJ9Cgp7XGJmIGFzc2lnbmFibGVFeHByZXNzaW9uOn1wcmltYXJ5IChhcmd1bWVudCogYXNzaWduYWJsZVNlbGVjdG9yKSs7CiAgICAgIFxTVVBFUnt9IGFzc2lnbmFibGVTZWxlY3RvcjsKICAgICAgaWRlbnRpZmllcgogICAgLgogICAgCntcYmYgYXNzaWduYWJsZVNlbGVjdG9yOn1gWycgZXhwcmVzc2lvbiBgXSc7ICUgYWdhaW4sIGNvdWxkIGJlIHRvcCBsZXZlbAogICAgICBge1xlc2NhcGVncmFtbWFyIC59JyBpZGVudGlmaWVyCiAgICAuCgpcZW5ke2dyYW1tYXJ9CgpBbiB7XGVtIGFzc2lnbmFibGUgZXhwcmVzc2lvbn0gaXMgZWl0aGVyOgpcYmVnaW57aXRlbWl6ZX0KIFxpdGVtIEFuIGlkZW50aWZpZXIuIApcaXRlbSBBbiBpbnZvY2F0aW9uIG9mIGEgZ2V0dGVyIChccmVme2dldHRlcnN9KSBvciBsaXN0IGFjY2VzcyBvcGVyYXRvciBvbiBhbiBleHByZXNzaW9uICRlJC4KXGl0ZW0gQW4gaW52b2NhdGlvbiBvZiBhIGdldHRlciBvciBsaXN0IGFjY2VzcyBvcGVyYXRvciBvbiAgXFNVUEVSe30uClxlbmR7aXRlbWl6ZX0KCgpBbiBhc3NpZ25hYmxlIGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gJGlkJCBpcyBldmFsdWF0ZWQgYXMgYW4gaWRlbnRpZmllciBleHByZXNzaW9uIChccmVme2lkZW50aWZpZXJSZWZlcmVuY2V9KS4KCiVBbiBhc3NpZ25hYmxlIGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gJGUuaWQoYV8xLCBcbGRvdHMsIGFfbikkIGlzIGV2YWx1YXRlZCBhcyBhIG1ldGhvZCBpbnZvY2F0aW9uIChccmVme21ldGhvZEludm9jYXRpb259KS4KCkFuIGFzc2lnbmFibGUgZXhwcmVzc2lvbiBvZiB0aGUgZm9ybSAkZS5pZCQgaXMgZXZhbHVhdGVkIGFzIGEgcHJvcGVydHkgZXh0cmFjdGlvbiAgKFxyZWZ7cHJvcGVydHlFeHRyYWN0aW9ufSkuCgpBbiBhc3NpZ25hYmxlIGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gXGNvZGV7JGVfMSRbJGVfMiRdfSBpcyBldmFsdWF0ZWQgYXMgYSBtZXRob2QgaW52b2NhdGlvbiBvZiB0aGUgb3BlcmF0b3IgbWV0aG9kIFxjb2Rle1tdfSBvbiAkZV8xJCB3aXRoIGFyZ3VtZW50ICRlXzIkLgoKQW4gYXNzaWduYWJsZSBleHByZXNzaW9uIG9mIHRoZSBmb3JtIFxjb2Rle1xTVVBFUnt9LmlkfSAgaXMgZXZhbHVhdGVkIGFzIGEgcHJvcGVydHkgZXh0cmFjdGlvbi4KCkFuIGFzc2lnbmFibGUgZXhwcmVzc2lvbiBvZiB0aGUgZm9ybSBcY29kZXtcU1VQRVJ7fVskZV8yJF19IGlzIGVxdWl2YWxlbnQgdG8gdGhlIG1ldGhvZCBpbnZvY2F0aW9uICBcY29kZXtcU1VQRVJ7fS5bXSgkZV8yJCl9LgoKXHN1YnNlY3Rpb257IElkZW50aWZpZXIgUmVmZXJlbmNlfQpcbGFiZWx7aWRlbnRpZmllclJlZmVyZW5jZX0KCkFuIHtcZW0gaWRlbnRpZmllciBleHByZXNzaW9ufSBjb25zaXN0cyBvZiBhIHNpbmdsZSBpZGVudGlmaWVyOyBpdCBwcm92aWRlcyBhY2Nlc3MgdG8gYW4gb2JqZWN0IHZpYSBhbiB1bnF1YWxpZmllZCBuYW1lLgoKXGJlZ2lue2dyYW1tYXJ9CntcYmYgaWRlbnRpZmllcjp9CiAgICAgSURFTlRJRklFUgogICAgIC4KICAgICAKICAgICAgICAgCiB7XGJmIElERU5USUZJRVJcX05PXF9ET0xMQVI6fQogICAgICBJREVOVElGSUVSXF9TVEFSVFxfTk9cX0RPTExBUiBJREVOVElGSUVSXF9QQVJUXF9OT1xfRE9MTEFSKgogICAgLgoKe1xiZiBJREVOVElGSUVSOn0KICAgICAgSURFTlRJRklFUlxfU1RBUlQgSURFTlRJRklFUlxfUEFSVCoKICAgIC4KCntcYmYgQlVJTFRcX0lOXF9JREVOVElGSUVSOn0gXEFCU1RSQUNUe307CiAgICAgXEFTe307CiAgICAgXERFRkVSUkVEe307CiAgICAgXERZTkFNSUN7fTsKICAgICBcRVhQT1JUe307CiAgICAgXEVYVEVSTkFMe307CiAgICAgXEZBQ1RPUll7fTsKICAgICBcR0VUe307CiAgICAgXElNUExFTUVOVFN7fTsKICAgICBcSU1QT1JUe307CiAgICAgXExJQlJBUll7fTsKICAgICBcT1BFUkFUT1J7fTsKICAgICBcUEFSVHt9OwogICAgICBcU0VUe307CiAgICAgIFxTVEFUSUN7fTsKICAgICBcVFlQRURFRnt9CiAgICAuCgoge1xiZiBJREVOVElGSUVSXF9TVEFSVDp9SURFTlRJRklFUlxfU1RBUlRcX05PXF9ET0xMQVI7CiAgICAgIGBcJCcKICAgIC4KCntcYmYgSURFTlRJRklFUlxfU1RBUlRcX05PXF9ET0xMQVI6fUxFVFRFUjsKICAgICAgYFxfJwogICAgLgoKe1xiZiAgSURFTlRJRklFUlxfUEFSVFxfTk9cX0RPTExBUjp9SURFTlRJRklFUlxfU1RBUlRcX05PXF9ET0xMQVI7CiAgICAgIERJR0lUCiAgICAuCgoKe1xiZiBJREVOVElGSUVSXF9QQVJUOn1JREVOVElGSUVSXF9TVEFSVDsKICAgICAgRElHSVQKICAgIC4KCgoKe1xiZiBxdWFsaWZpZWQ6fQogICAgICBpZGVudGlmaWVyIChge1xlc2NhcGVncmFtbWFyIC59JyBpZGVudGlmaWVyKT8gIAogICAgICAuIApcZW5ke2dyYW1tYXJ9CgpBIGJ1aWx0LWluIGlkZW50aWZpZXIgaXMgb25lIG9mIHRoZSBpZGVudGlmaWVycyBwcm9kdWNlZCBieSB0aGUgcHJvZHVjdGlvbiB7XGVtIEJVSUxUXF9JTlxfSURFTlRJRklFUn0uIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIGEgYnVpbHQtaW4gaWRlbnRpZmllciBpcyB1c2VkIGFzIHRoZSBkZWNsYXJlZCBuYW1lIG9mIGEgcHJlZml4LCBjbGFzcywgdHlwZSBwYXJhbWV0ZXIgb3IgdHlwZSBhbGlhcy4gSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgdG8gdXNlIGEgYnVpbHQtaW4gaWRlbnRpZmllciBvdGhlciB0aGFuIFxEWU5BTUlDe30gYXMgYSB0eXBlIGFubm90YXRpb24uCgpccmF0aW9uYWxlewpCdWlsdC1pbiBpZGVudGlmaWVycyBhcmUgaWRlbnRpZmllcnMgdGhhdCBhcmUgdXNlZCBhcyBrZXl3b3JkcyBpbiBEYXJ0LCBidXQgYXJlIG5vdCByZXNlcnZlZCB3b3JkcyBpbiBKYXZhc2NyaXB0LiBUbyBtaW5pbWl6ZSBpbmNvbXBhdGliaWxpdGllcyB3aGVuIHBvcnRpbmcgSmF2YXNjcmlwdCBjb2RlIHRvIERhcnQsIHdlIGRvIG5vdCBtYWtlIHRoZXNlIGludG8gcmVzZXJ2ZWQgd29yZHMuIEEgYnVpbHQtaW4gaWRlbnRpZmllciBtYXkgbm90IGJlIHVzZWQgdG8gbmFtZSBhIGNsYXNzIG9yIHR5cGUuIEluIG90aGVyIHdvcmRzLCB0aGV5IGFyZSB0cmVhdGVkIGFzIHJlc2VydmVkIHdvcmRzIHdoZW4gdXNlZCBhcyB0eXBlcy4gIFRoaXMgZWxpbWluYXRlcyBtYW55IGNvbmZ1c2luZyBzaXR1YXRpb25zIHdpdGhvdXQgY2F1c2luZyBjb21wYXRpYmlsaXR5IHByb2JsZW1zLiBBZnRlciBhbGwsIGEgSmF2YXNjcmlwdCBwcm9ncmFtIGhhcyBubyB0eXBlIGRlY2xhcmF0aW9ucyBvciBhbm5vdGF0aW9ucyBzbyBubyBjbGFzaCBjYW4gb2NjdXIuICBGdXJ0aGVybW9yZSwgdHlwZXMgc2hvdWxkIGJlZ2luIHdpdGggYW4gdXBwZXJjYXNlIGxldHRlciAoc2VlIHRoZSBhcHBlbmRpeCkgYW5kIHNvIG5vIGNsYXNoIHNob3VsZCBvY2N1ciBpbiBhbnkgRGFydCB1c2VyIHByb2dyYW0gYW55d2F5Lgp9CgpFdmFsdWF0aW9uIG9mIGFuIGlkZW50aWZpZXIgZXhwcmVzc2lvbiAkZSQgb2YgdGhlIGZvcm0gJGlkJCBwcm9jZWVkcyBhcyBmb2xsb3dzOgoKCkxldCAkZCQgYmUgdGhlIGlubmVybW9zdCBkZWNsYXJhdGlvbiBpbiB0aGUgZW5jbG9zaW5nIGxleGljYWwgc2NvcGUgd2hvc2UgbmFtZSBpcyAkaWQkIG9yICRpZD0kLiAgSWYgbm8gc3VjaCBkZWNsYXJhdGlvbiBleGlzdHMgaW4gdGhlIGxleGljYWwgc2NvcGUsIGxldCAkZCQgYmUgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBpbmhlcml0ZWQgbWVtYmVyIG5hbWVkICRpZCQgaWYgaXQgZXhpc3RzLiAKJUlmIG5vIHN1Y2ggbWVtYmVyIGV4aXN0cywgbGV0ICRkJCBiZSB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIHN0YXRpYyBtZW1iZXIgbmFtZSAkaWQkIGRlY2xhcmVkIGluIGEgc3VwZXJjbGFzcyBvZiB0aGUgY3VycmVudCBjbGFzcywgaWYgaXQgZXhpc3RzLgoKXGJlZ2lue2l0ZW1pemV9ClxpdGVtIGlmICRkJCBpcyBhIHByZWZpeCAkcCQsIGEgY29tcGlsZS10aW1lIGVycm9yIG9jY3VycyB1bmxlc3MgdGhlIHRva2VuIGltbWVkaWF0ZWx5IGZvbGxvd2luZyAkZCQgaXMgXGNvZGV7Jy4nfS4KXGl0ZW0gSWYgJGQkIGlzIGEgY2xhc3Mgb3IgdHlwZSBhbGlhcyAkVCQsIHRoZSB2YWx1ZSBvZiAkZSQgaXMgYW4gaW5zdGFuY2Ugb2YgIGNsYXNzIFxjb2Rle1R5cGV9IChvciBhIHN1YmNsYXNzIHRoZXJlb2YpIHJlaWZ5aW5nICRUJC4KXGl0ZW0gSWYgJGQkIGlzIGEgdHlwZSBwYXJhbWV0ZXIgJFQkLCB0aGVuIHRoZSB2YWx1ZSBvZiAkZSQgaXMgdGhlIHZhbHVlIG9mIHRoZSBhY3R1YWwgdHlwZSBhcmd1bWVudCBjb3JyZXNwb25kaW5nIHRvICRUJCB0aGF0IHdhcyAgcGFzc2VkIHRvIHRoZSBnZW5lcmF0aXZlIGNvbnN0cnVjdG9yIHRoYXQgY3JlYXRlZCB0aGUgY3VycmVudCBiaW5kaW5nIG9mIFxUSElTe30uIElmLCBob3dldmVyLCAkZSQgb2NjdXJzIGluc2lkZSBhIHN0YXRpYyBtZW1iZXIsIGEgY29tcGlsZS10aW1lIGVycm9yIG9jY3Vycy4KCiVcY29tbWVudGFyeXsgV2UgYXJlIGFzc3VyZWQgdGhhdCBcVEhJU3t9IGlzIHdlbGwgZGVmaW5lZCwgYmVjYXVzZSBpZiB3ZSB3ZXJlIGluIGEgc3RhdGljIG1lbWJlciB0aGUgcmVmZXJlbmNlIHRvICRUJCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciAoXHJlZntnZW5lcmljc30uKX0KJVxpdGVtIElmICRkJCBpcyBhIGxpYnJhcnkgdmFyaWFibGUgdGhlbjoKJSAgXGJlZ2lue2l0ZW1pemV9CiUgIFxpdGVtIElmICRkJCBpcyBvZiBvbmUgb2YgdGhlIGZvcm1zIFxjb2Rle1xWQVJ7fSAkdiQgPSAkZV9pJDt9ICwgXGNvZGV7JFQkICR2JCA9ICRlX2kkO30gLCBcY29kZXtcRklOQUx7fSAkdiQgPSAkZV9pJDt9ICBvciBcY29kZXtcRklOQUx7fSAkVCQgJHYkID0gJGVfaSQ7fSBhbmQgbm8gdmFsdWUgaGFzIHlldCBiZWVuIHN0b3JlZCBpbnRvICR2JCB0aGVuIHRoZSBpbml0aWFsaXplciBleHByZXNzaW9uICRlX2kkIGlzIGV2YWx1YXRlZC4gSWYsIGR1cmluZyB0aGUgZXZhbHVhdGlvbiBvZiAkZV9pJCwgdGhlIGdldHRlciBmb3IgJHYkIGlzIHJlZmVyZW5jZWQsIGEgXGNvZGV7Q3ljbGljSW5pdGlhbGl6YXRpb25FcnJvcn0gaXMgdGhyb3duLiBJZiB0aGUgZXZhbHVhdGlvbiBzdWNjZWVkZWQgeWllbGRpbmcgYW4gb2JqZWN0ICRvJCwgbGV0ICRyID0gbyQsIG90aGVyd2lzZSBsZXQgJHIgPSBcTlVMTHt9JC4gSW4gYW55IGNhc2UsICRyJCBpcyBzdG9yZWQgaW50byAkdiQuIFRoZSB2YWx1ZSBvZiAkZSQgaXMgJHIkLiAKIFxpdGVtICBJZiAkZCQgaXMgYSBjb25zdGFudCB2YXJpYWJsZSBvZiBvbmUgb2YgdGhlIGZvcm1zICBcY29kZXtcQ09OU1R7fSAkdiQgPSAkZSQ7fSBvciBcY29kZXtcQ09OU1R7fSAkVCQgJHYkID0gJGUkO30gdGhlbiB0aGUgdmFsdWUgJGlkJCBpcyB0aGUgdmFsdWUgb2YgdGhlIGNvbXBpbGUtdGltZSBjb25zdGFudCAkZSQuCiUgIE90aGVyd2lzZQolICBcaXRlbSAkZSQgZXZhbHVhdGVzIHRvIHRoZSBjdXJyZW50IGJpbmRpbmcgb2YgJGlkJC4gIAolICBcZW5ke2l0ZW1pemV9ClxpdGVtIElmICRkJCBpcyBhIGxvY2FsIHZhcmlhYmxlIG9yIGZvcm1hbCBwYXJhbWV0ZXIgdGhlbiAkZSQgZXZhbHVhdGVzIHRvIHRoZSBjdXJyZW50IGJpbmRpbmcgb2YgJGlkJC4gCiVcaXRlbSBJZiAkZCQgaXMgYSBsaWJyYXJ5IHZhcmlhYmxlLCBsb2NhbCB2YXJpYWJsZSwgb3IgZm9ybWFsIHBhcmFtZXRlciwgdGhlbiAkZSQgZXZhbHVhdGVzIHRvIHRoZSBjdXJyZW50IGJpbmRpbmcgb2YgJGlkJC4gXGNvbW1lbnRhcnl7VGhpcyBjYXNlIGFsc28gYXBwbGllcyBpZiBkIGlzIGEgbGlicmFyeSBvciBsb2NhbCBmdW5jdGlvbiBkZWNsYXJhdGlvbiwgYXMgdGhlc2UgYXJlIGVxdWl2YWxlbnQgdG8gZnVuY3Rpb24tdmFsdWVkIHZhcmlhYmxlIGRlY2xhcmF0aW9ucy59ClxpdGVtIElmICRkJCBpcyBhIHN0YXRpYyBtZXRob2QsIHRvcC1sZXZlbCBmdW5jdGlvbiBvciBsb2NhbCBmdW5jdGlvbiB0aGVuICRlJCBldmFsdWF0ZXMgdG8gdGhlIGZ1bmN0aW9uIGRlZmluZWQgYnkgJGQkLgpcaXRlbSBJZiAkZCQgaXMgdGhlIGRlY2xhcmF0aW9uIG9mIGEgc3RhdGljIHZhcmlhYmxlLCBzdGF0aWMgZ2V0dGVyIG9yIHN0YXRpYyBzZXR0ZXIgZGVjbGFyZWQgaW4gY2xhc3MgJEMkLCB0aGVuICRlJCBpcyBlcXVpdmFsZW50IHRvIHRoZSBwcm9wZXJ0eSBleHRyYWN0aW9uIChccmVme3Byb3BlcnR5RXh0cmFjdGlvbn0pICRDLmlkJC4gClxpdGVtIElmICRkJCBpcyB0aGUgZGVjbGFyYXRpb24gb2YgYSBsaWJyYXJ5IHZhcmlhYmxlLCB0b3AtbGV2ZWwgZ2V0dGVyIG9yIHRvcC1sZXZlbCBzZXR0ZXIsIHRoZW4gJGUkIGlzIGVxdWl2YWxlbnQgdG8gdGhlIHRvcCBsZXZlbCBnZXR0ZXIgaW52b2NhdGlvbiAoXHJlZnt0b3BMZXZlbEdldHRlckludm9jYXRpb259KSAkaWQkLiAKXGl0ZW0gT3RoZXJ3aXNlLCBpZiAkZSQgb2NjdXJzIGluc2lkZSBhIHRvcCBsZXZlbCBvciBzdGF0aWMgZnVuY3Rpb24gKGJlIGl0IGZ1bmN0aW9uLCBtZXRob2QsIGdldHRlciwgIG9yIHNldHRlcikgb3IgdmFyaWFibGUgaW5pdGlhbGl6ZXIsIGV2YWx1YXRpb24gb2YgJGUkIGNhdXNlcyBhIFxjb2Rle05vU3VjaE1ldGhvZH0gdG8gYmUgdGhyb3duLgpcaXRlbSBPdGhlcndpc2UsICRlJCBpcyBlcXVpdmFsZW50IHRvIHRoZSBwcm9wZXJ0eSBleHRyYWN0aW9uIChccmVme3Byb3BlcnR5RXh0cmFjdGlvbn0pIFxUSElTe30uJGlkJC4KJSBUaGlzIGltcGxpZXMgdGhhdCByZWZlcnJpbmcgdG8gYW4gdW5kZWZpbmVkIHN0YXRpYyBnZXR0ZXIgYnkgc2ltcGxlIG5hbWUgaXMgYW4gZXJyb3IsIHdoZXJlYXMgZG9pbmcgc28gYnkgcXVhbGlmaWVkIG5hbWUgaXMgb25seSBhIHdhcm5pbmcuIFNhbWUgd2l0aCBhc3NpZ25tZW50cy4gIFJldmlzZT8KXGVuZHtpdGVtaXplfQoKVGhlIHN0YXRpYyB0eXBlIG9mICRlJCBpcyBkZXRlcm1pbmVkIGFzIGZvbGxvd3M6CgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gSWYgJGQkIGlzIGEgY2xhc3MsIHR5cGUgYWxpYXMgb3IgdHlwZSBwYXJhbWV0ZXIgdGhlIHN0YXRpYyB0eXBlIG9mICRlJCBpcyBcY29kZXtUeXBlfS4KXGl0ZW0gSWYgJGQkIGlzIGEgbG9jYWwgdmFyaWFibGUgb3IgZm9ybWFsIHBhcmFtZXRlciB0aGUgc3RhdGljIHR5cGUgb2YgJGUkIGlzIHRoZSB0eXBlIG9mIHRoZSB2YXJpYWJsZSAkaWQkLCB1bmxlc3MgJGlkJCBpcyBrbm93biB0byBoYXZlIHNvbWUgdHlwZSAkVCQsIGluIHdoaWNoIGNhc2UgdGhlIHN0YXRpYyB0eXBlIG9mICRlJCBpcyAkVCQsIHByb3ZpZGVkIHRoYXQgJFQkIGlzIG1vcmUgc3BlY2lmaWMgdGhhbiBhbnkgb3RoZXIgdHlwZSAkUyQgc3VjaCB0aGF0ICR2JCBpcyBrbm93biB0byBoYXZlIHR5cGUgJFMkLiAKXGl0ZW0gSWYgJGQkIGlzIGEgc3RhdGljIG1ldGhvZCwgdG9wLWxldmVsIGZ1bmN0aW9uIG9yIGxvY2FsIGZ1bmN0aW9uIHRoZSBzdGF0aWMgdHlwZSBvZiAkZSQgaXMgdGhlIGZ1bmN0aW9uIHR5cGUgZGVmaW5lZCBieSAkZCQuClxpdGVtIElmICRkJCBpcyB0aGUgZGVjbGFyYXRpb24gb2YgYSBzdGF0aWMgdmFyaWFibGUsIHN0YXRpYyBnZXR0ZXIgb3Igc3RhdGljIHNldHRlciBkZWNsYXJlZCBpbiBjbGFzcyAkQyQsIHRoZSBzdGF0aWMgdHlwZSBvZiAkZSQgaXMgdGhlIHN0YXRpYyB0eXBlIG9mIHRoZSBnZXR0ZXIgaW52b2NhdGlvbiAoXHJlZntwcm9wZXJ0eUV4dHJhY3Rpb259KSAkQy5pZCQuClxpdGVtIElmICRkJCBpcyB0aGUgZGVjbGFyYXRpb24gb2YgYSBsaWJyYXJ5IHZhcmlhYmxlLCB0b3AtbGV2ZWwgZ2V0dGVyIG9yIHRvcC1sZXZlbCBzZXR0ZXIsIHRoZSBzdGF0aWMgdHlwZSBvZiAkZSQgIGlzIHRoZSBzdGF0aWMgdHlwZSBvZiB0aGUgdG9wIGxldmVsIGdldHRlciBpbnZvY2F0aW9uICRpZCQuIApcaXRlbSBPdGhlcndpc2UsIGlmICRlJCBvY2N1cnMgaW5zaWRlIGEgdG9wIGxldmVsIG9yIHN0YXRpYyBmdW5jdGlvbiAoYmUgaXQgZnVuY3Rpb24sIG1ldGhvZCwgZ2V0dGVyLCAgb3Igc2V0dGVyKSBvciB2YXJpYWJsZSBpbml0aWFsaXplciwgdGhlIHN0YXRpYyB0eXBlIG9mICRlJCBpcyBcRFlOQU1JQ3t9LgpcaXRlbSBPdGhlcndpc2UsIHRoZSBzdGF0aWMgdHlwZSBvZiAkZSQgaXMgdGhlIHR5cGUgb2YgdGhlIHByb3BlcnR5IGV4dHJhY3Rpb24gKFxyZWZ7cHJvcGVydHlFeHRyYWN0aW9ufSkgXFRISVN7fS4kaWQkLgpcZW5ke2l0ZW1pemV9CgogXGNvbW1lbnRhcnl7Tm90ZSB0aGF0IGlmIG9uZSBkZWNsYXJlcyBhIHNldHRlciwgd2UgYmluZCB0byB0aGUgY29ycmVzcG9uZGluZyBnZXR0ZXIgZXZlbiBpZiBpdCBkb2VzIG5vdCBleGlzdC59CiAKIFxyYXRpb25hbGV7CiBUaGlzIHByZXZlbnRzIHNpdHVhdGlvbnMgd2hlcmUgb25lIHVzZXMgdW5jb3JyZWxhdGVkIHNldHRlcnMgYW5kIGdldHRlcnMuIFRoZSBpbnRlbnQgaXMgdG8gcHJldmVudCBlcnJvcnMgd2hlbiBhICBnZXR0ZXIgaW4gYSBzdXJyb3VuZGluZyBzY29wZSBpcyB1c2VkIGFjY2lkZW50YWxseS4KIH0KIApJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmIGFuIGlkZW50aWZpZXIgZXhwcmVzc2lvbiAkaWQkIG9jY3VycyBpbnNpZGUgYSB0b3AgbGV2ZWwgb3Igc3RhdGljIGZ1bmN0aW9uIChiZSBpdCBmdW5jdGlvbiwgbWV0aG9kLCBnZXR0ZXIsIG9yIHNldHRlcikgb3IgdmFyaWFibGUgaW5pdGlhbGl6ZXIgYW5kIHRoZXJlIGlzIG5vIGRlY2xhcmF0aW9uICRkJCB3aXRoIG5hbWUgJGlkJCBpbiB0aGUgbGV4aWNhbCBzY29wZSBlbmNsb3NpbmcgdGhlIGV4cHJlc3Npb24uCgpcc3Vic2VjdGlvbnsgVHlwZSBUZXN0fQpcbGFiZWx7dHlwZVRlc3R9CgpUaGUge1xlbSBpcy1leHByZXNzaW9ufSB0ZXN0cyBpZiBhbiBvYmplY3QgaXMgYSBtZW1iZXIgb2YgYSB0eXBlLgoKIFxiZWdpbntncmFtbWFyfQoge1xiZiB0eXBlVGVzdDp9CiBpc09wZXJhdG9yIHR5cGUKIC4KIAogCntcYmYgaXNPcGVyYXRvcjp9ClxJU3t9IGAhJz8KICAgIC4KIFxlbmR7Z3JhbW1hcn0KIAogRXZhbHVhdGlvbiBvZiB0aGUgaXMtZXhwcmVzc2lvbiBcY29kZXskZSQgXElTe30gJFQkfSBwcm9jZWVkcyBhcyBmb2xsb3dzOgoKVGhlIGV4cHJlc3Npb24gJGUkIGlzIGV2YWx1YXRlZCB0byBhIHZhbHVlICR2JC4gVGhlbiwgaWYgJFQkIGlzIGEgbWFsZm9ybWVkIG9yIGRlZmVycmVkIHR5cGUgKFxyZWZ7c3RhdGljVHlwZXN9KSwgYSBkeW5hbWljIGVycm9yIG9jY3Vycy4gT3RoZXJ3aXNlLCBpZiB0aGUgaW50ZXJmYWNlIG9mIHRoZSBjbGFzcyBvZiAkdiQgaXMgYSBzdWJ0eXBlIG9mICRUJCwgdGhlIGlzLWV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIHRydWUuIE90aGVyd2lzZSBpdCBldmFsdWF0ZXMgdG8gZmFsc2UuCgpcY29tbWVudGFyeXtJdCBmb2xsb3dzIHRoYXQgXGNvZGV7JGUkIFxJU3t9IE9iamVjdH0gaXMgYWx3YXlzIHRydWUuIFRoaXMgbWFrZXMgc2Vuc2UgaW4gYSBsYW5ndWFnZSB3aGVyZSBldmVyeXRoaW5nIGlzIGFuIG9iamVjdC4gCgpBbHNvIG5vdGUgdGhhdCBcY29kZXtcTlVMTHt9IFxJU3t9ICRUJH0gaXMgZmFsc2UgdW5sZXNzICRUID0gXGNvZGV7T2JqZWN0fSQsICRUID0gXGNvZGV7XERZTkFNSUN7fX0kIG9yICRUID0gXGNvZGV7TnVsbH0kLiAgVGhlIGZvcm1lciB0d28gYXJlIHVzZWxlc3MsIGFzIGlzIGFueXRoaW5nIG9mIHRoZSBmb3JtIFxjb2RleyRlJCBcSVN7fSBPYmplY3R9IG9yIFxjb2RleyRlJCBcSVN7fSBcRFlOQU1JQ3t9fS4gIFVzZXJzIHNob3VsZCB0ZXN0IGZvciBhIG51bGwgdmFsdWUgZGlyZWN0bHkgcmF0aGVyIHRoYW4gdmlhIHR5cGUgdGVzdHMuCn0KClRoZSBpcy1leHByZXNzaW9uIFxjb2RleyRlJCBcSVN7fSEgJFQkfSBpcyBlcXVpdmFsZW50IHRvIFxjb2RleyEoJGUkIFxJU3t9ICRUJCl9LgoKJSBBZGQgZmxvdyBkZXBlbmRlbnQgdHlwZXMKCgpMZXQgJHYkICBiZSBhIGxvY2FsIHZhcmlhYmxlIG9yIGEgZm9ybWFsIHBhcmFtZXRlci4gQW4gaXMtZXhwcmVzc2lvbiBvZiB0aGUgZm9ybSBcY29kZXskdiQgXElTe30gJFQkfSBzaG93cyB0aGF0ICR2JCAgaGFzIHR5cGUgJFQkIGlmZiAkVCQgaXMgbW9yZSBzcGVjaWZpYyB0aGFuIHRoZSB0eXBlICRTJCBvZiB0aGUgZXhwcmVzc2lvbiAkdiQgYW5kICBib3RoICRUIFxuZSBcRFlOQU1JQ3t9JCBhbmQgJFMgXG5lIFxEWU5BTUlDe30kLgoKXHJhdGlvbmFsZXsKVGhlIG1vdGl2YXRpb24gZm9yIHRoZSBgYHNob3dzIHRoYXQgdiBoYXMgdHlwZSBUIiByZWxhdGlvbiBpcyB0byByZWR1Y2Ugc3B1cmlvdXMgd2FybmluZ3MgdGhlcmVieSBlbmFibGluZyBhIG1vcmUgbmF0dXJhbCBjb2Rpbmcgc3R5bGUuIFRoZSBydWxlcyBpbiB0aGUgY3VycmVudCBzcGVjaWZpY2F0aW9uIGFyZSBkZWxpYmVyYXRlbHkga2VwdCBzaW1wbGUuIEl0IHdvdWxkIGJlIHVwd2FyZGx5IGNvbXBhdGlibGUgdG8gcmVmaW5lIHRoZXNlIHJ1bGVzIGluIHRoZSBmdXR1cmU7IHN1Y2ggYSByZWZpbmVtZW50IHdvdWxkIGFjY2VwdCBtb3JlIGNvZGUgd2l0aG91dCB3YXJuaW5nLCBidXQgbm90IHJlamVjdCBhbnkgY29kZSBub3cgd2FybmluZy1mcmVlLgoKVGhlIHJ1bGUgb25seSBhcHBsaWVzIHRvIGxvY2FscyBhbmQgcGFyYW1ldGVycywgYXMgZmllbGRzIGNvdWxkIGJlIG1vZGlmaWVkIHZpYSBzaWRlLWVmZmVjdGluZyBmdW5jdGlvbnMgb3IgbWV0aG9kcyB0aGF0IGFyZSBub3QgYWNjZXNzaWJsZSB0byBhIGxvY2FsIGFuYWx5c2lzLgoKSXQgaXMgcG9pbnRsZXNzIHRvIGRlZHVjZSBhIHdlYWtlciB0eXBlIHRoYW4gd2hhdCBpcyBhbHJlYWR5IGtub3duLiBGdXJ0aGVybW9yZSwgdGhpcyB3b3VsZCBsZWFkIHRvIGEgc2l0dWF0aW9uIHdoZXJlIG11bHRpcGxlIHR5cGVzIGFyZSBhc3NvY2lhdGVkIHdpdGggYSB2YXJpYWJsZSBhdCBhIGdpdmVuIHBvaW50LCB3aGljaCBjb21wbGljYXRlcyB0aGUgc3BlY2lmaWNhdGlvbi4gSGVuY2UgdGhlIHJlcXVpcmVtZW50IHRoYXQgJFQgPDwgUyQgKHdlIHVzZSAkPDwkIHJhdGhlciB0aGFuIHN1YnR5cGluZyBiZWNhdXNlIHN1YnR5cGluZyBpcyBub3QgYSBwYXJ0aWFsIG9yZGVyKS4KCldlIGRvIG5vdCB3YW50IHRvIHJlZmluZSB0aGUgdHlwZSBvZiBhIHZhcmlhYmxlIG9mIHR5cGUgXERZTkFNSUN7fSwgYXMgdGhpcyBjb3VsZCBsZWFkIHRvIG1vcmUgd2FybmluZ3MgcmF0aGVyIHRoYW4gbGVzcy4gIFRoZSBvcHBvc2l0ZSByZXF1aXJlbWVudCwgdGhhdCAkVCBcbmUgXERZTkFNSUN7fSQgaXMgYSBzYWZlZ3VhcmQgbGVzdCAkUyQgZXZlciBiZSAkXGJvdCQuCn0KClRoZSBzdGF0aWMgdHlwZSBvZiBhbiBpcy1leHByZXNzaW9uIGlzIFxjb2Rle2Jvb2x9LiAKCgpcc3Vic2VjdGlvbnsgVHlwZSBDYXN0fQpcbGFiZWx7dHlwZUNhc3R9CgpUaGUge1xlbSBjYXN0IGV4cHJlc3Npb259IGVuc3VyZXMgdGhhdCBhbiBvYmplY3QgaXMgYSBtZW1iZXIgb2YgYSB0eXBlLgoKIFxiZWdpbntncmFtbWFyfQoge1xiZiB0eXBlQ2FzdDp9CiBhc09wZXJhdG9yIHR5cGUKIC4KIAogCntcYmYgYXNPcGVyYXRvcjp9ClxBU3t9CiAgICAuCiBcZW5ke2dyYW1tYXJ9CiAKIEV2YWx1YXRpb24gb2YgdGhlIGNhc3QgZXhwcmVzc2lvbiBcY29kZXskZSQgXEFTe30gJFQkfSBwcm9jZWVkcyBhcyBmb2xsb3dzOgoKVGhlIGV4cHJlc3Npb24gJGUkIGlzIGV2YWx1YXRlZCB0byBhIHZhbHVlICR2JC4gVGhlbiwgaWYgJFQkIGlzIGEgbWFsZm9ybWVkIG9yIGRlZmVycmVkIHR5cGUgKFxyZWZ7c3RhdGljVHlwZXN9KSwgYSBkeW5hbWljIGVycm9yIG9jY3Vycy4gT3RoZXJ3aXNlLCBpZiB0aGUgaW50ZXJmYWNlIG9mIHRoZSBjbGFzcyBvZiAkdiQgaXMgYSBzdWJ0eXBlIG9mICRUJCwgdGhlIGNhc3QgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gJHYkLiBPdGhlcndpc2UsIGlmICR2JCBpcyBcTlVMTHt9LCB0aGUgY2FzdCBleHByZXNzaW9uIGV2YWx1YXRlcyB0byAkdiQuIApJbiBhbGwgb3RoZXIgY2FzZXMsICBhIFxjb2Rle0Nhc3RFcnJvcn0gaXMgdGhyb3duLgogClRoZSBzdGF0aWMgdHlwZSBvZiBhIGNhc3QgZXhwcmVzc2lvbiAgXGNvZGV7JGUkIFxBU3t9ICRUJH0gIGlzICRUJC4gCgoKXHNlY3Rpb257U3RhdGVtZW50c30KXGxhYmVse3N0YXRlbWVudHN9CgogXGJlZ2lue2dyYW1tYXJ9CntcYmYgc3RhdGVtZW50czp9CiAgICAgIHN0YXRlbWVudCoKICAgIC4KCgp7XGJmIHN0YXRlbWVudDp9CiAgICAgIGxhYmVsKiBub25MYWJlbGxlZFN0YXRlbWVudAogICAgLgoKe1xiZiBub25MYWJlbGxlZFN0YXRlbWVudDp9YmxvY2s7IAogICAgICBsb2NhbFZhcmlhYmxlRGVjbGFyYXRpb247CiAgICAgIGZvclN0YXRlbWVudDsKICAgICAgd2hpbGVTdGF0ZW1lbnQ7CiAgICAgIGRvU3RhdGVtZW50OwogICAgICBzd2l0Y2hTdGF0ZW1lbnQ7CiAgICAgIGlmU3RhdGVtZW50OwogICAgICByZXRocm93U3RhdGVtZW50OwogICAgICB0cnlTdGF0ZW1lbnQ7CiAgICAgIGJyZWFrU3RhdGVtZW50OwogICAgICBjb250aW51ZVN0YXRlbWVudDsKICAgICAgcmV0dXJuU3RhdGVtZW50OwogICAgICBleHByZXNzaW9uU3RhdGVtZW50OwogICAgICBhc3NlcnRTdGF0ZW1lbnQ7CiAgICAgIGxvY2FsRnVuY3Rpb25EZWNsYXJhdGlvbgogICAgLgogXGVuZHtncmFtbWFyfQogCiBcc3Vic2VjdGlvbntCbG9ja3N9CiBcbGFiZWx7YmxvY2tzfQogCiBBIHtcZW0gYmxvY2sgc3RhdGVtZW50fSBzdXBwb3J0cyBzZXF1ZW5jaW5nIG9mIGNvZGUuCgpFeGVjdXRpb24gb2YgYSBibG9jayBzdGF0ZW1lbnQgJFx7c18xLCBcbGRvdHMsICBzX25cfSQgcHJvY2VlZHMgYXMgZm9sbG93czoKCkZvciAkaSBcaW4gMSAuLiBuLCBzX2kkIGlzIGV4ZWN1dGVkLgoKQSBibG9jayBzdGF0ZW1lbnQgaW50cm9kdWNlcyBhIG5ldyBzY29wZSwgd2hpY2ggaXMgbmVzdGVkIGluIHRoZSBsZXhpY2FsbHkgZW5jbG9zaW5nIHNjb3BlIGluIHdoaWNoIHRoZSBibG9jayBzdGF0ZW1lbnQgYXBwZWFycy4KCgoKIFxzdWJzZWN0aW9ue0V4cHJlc3Npb24gU3RhdGVtZW50c30KIFxsYWJlbHtleHByZXNzaW9uU3RhdGVtZW50c30KIApBbiB7XGVtIGV4cHJlc3Npb24gc3RhdGVtZW50fSBjb25zaXN0cyBvZiBhbiBleHByZXNzaW9uIG90aGVyIHRoYW4gYSBub24tY29uc3RhbnQgbWFwIGxpdGVyYWwgKFxyZWZ7bWFwc30pIHRoYXQgaGFzIG5vIGV4cGxpY2l0IHR5cGUgYXJndW1lbnRzLiAKClxyYXRpb25hbGV7ClRoZSByZXN0cmljdGlvbiBvbiBtYXBzICBpcyBkZXNpZ25lZCB0byByZXNvbHZlIGFuIGFtYmlndWl0eSBpbiB0aGUgZ3JhbW1hciwgd2hlbiBhIHN0YXRlbWVudCBiZWdpbnMgd2l0aCBcey4KfQoKIFxiZWdpbntncmFtbWFyfQp7XGJmIGV4cHJlc3Npb25TdGF0ZW1lbnQ6fQogIGV4cHJlc3Npb24/IGB7XGVzY2FwZWdyYW1tYXIgO30nCiAgLgogXGVuZHtncmFtbWFyfQogCkV4ZWN1dGlvbiBvZiBhbiBleHByZXNzaW9uIHN0YXRlbWVudCBcY29kZXskZSQ7fSBwcm9jZWVkcyBieSBldmFsdWF0aW5nICRlJC4gCgpJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBhIG5vbi1jb25zdGFudCBtYXAgbGl0ZXJhbCB0aGF0IGhhcyBubyBleHBsaWNpdCB0eXBlIGFyZ3VtZW50cyBhcHBlYXJzIGluIGEgcGxhY2Ugd2hlcmUgYSBzdGF0ZW1lbnQgaXMgZXhwZWN0ZWQuCgpcc3Vic2VjdGlvbntMb2NhbCBWYXJpYWJsZSBEZWNsYXJhdGlvbn0KXGxhYmVse2xvY2FsVmFyaWFibGVEZWNsYXJhdGlvbn0KCgpBIHtcZW0gdmFyaWFibGUgZGVjbGFyYXRpb24gc3RhdGVtZW50IH1kZWNsYXJlcyBhIG5ldyBsb2NhbCB2YXJpYWJsZS4KCiBcYmVnaW57Z3JhbW1hcn0Ke1xiZiBsb2NhbFZhcmlhYmxlRGVjbGFyYXRpb246fQogICAgaW5pdGlhbGl6ZWRWYXJpYWJsZURlY2xhcmF0aW9uIHtcZXNjYXBlZ3JhbW1hcic7J30KICAuCiBcZW5ke2dyYW1tYXJ9CiAKIEV4ZWN1dGluZyBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHN0YXRlbWVudCBvZiBvbmUgb2YgdGhlIGZvcm1zICBcVkFSe30gJHYgPSBlOyQsICRUJCAkdiA9IGU7ICQsIFxDT05TVHt9ICAkdiA9IGU7JCwgXENPTlNUe30gJFQkICR2ID0gZTskLCBcRklOQUx7fSAgJHYgPSBlOyQgb3IgXEZJTkFMe30gJFQkICR2ID0gZTskIHByb2NlZWRzIGFzIGZvbGxvd3M6CiAKIFRoZSBleHByZXNzaW9uICRlJCBpcyBldmFsdWF0ZWQgdG8gYW4gb2JqZWN0ICRvJC4gVGhlbiwgdGhlIHZhcmlhYmxlICR2JCBpcyBzZXQgdG8gJG8kLgogCiBBIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHN0YXRlbWVudCBvZiB0aGUgZm9ybSBcVkFSe30gJHY7JCBpcyBlcXVpdmFsZW50IHRvIFxWQVJ7fSAkdiA9IFxOVUxMe307JC4gQSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBzdGF0ZW1lbnQgb2YgdGhlIGZvcm0gJFQkICR2OyQgaXMgZXF1aXZhbGVudCB0byAkVCQgJHYgPSBcTlVMTHt9OyQuIAoKXGNvbW1lbnRhcnl7ClRoaXMgaG9sZHMgcmVnYXJkbGVzcyBvZiB0aGUgdHlwZSAkVCQuIEZvciBleGFtcGxlLCBcY29kZXtpbnQgaTt9IGRvZXMgbm90IGNhdXNlIFxjb2Rle2l9IHRvIGJlIGluaXRpYWxpemVkIHRvIHplcm8uIEluc3RlYWQsIFxjb2Rle2l9IGlzIGluaXRpYWxpemVkIHRvIFxOVUxMe30sIGp1c3QgYXMgaWYgd2UgaGFkIHdyaXR0ZW4gXFZBUnt9IFxjb2Rle2k7fSBvciBcY29kZXtPYmplY3QgaTt9IG9yIFxjb2Rle0NvbGxlY3Rpb24kPCRTdHJpbmckPiQgaTt9Lgp9CgpccmF0aW9uYWxlewpUbyBkbyBvdGhlcndpc2Ugd291bGQgdW5kZXJtaW5lIHRoZSBvcHRpb25hbGx5IHR5cGVkIG5hdHVyZSBvZiBEYXJ0LCBjYXVzaW5nIHR5cGUgYW5ub3RhdGlvbnMgdG8gbW9kaWZ5IHByb2dyYW0gYmVoYXZpb3IuCn0KCiVBIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHN0YXRlbWVudCBvZiBvbmUgb2YgdGhlIGZvcm1zICRUJCAkdjskLCAkVCQgJHYgPSBlOyQsIFxDT05TVHt9ICRUJCAkdiA9IGU7JCwgIG9yIFxGSU5BTHt9ICRUJCAkdiA9IGU7JCBjYXVzZXMgYSBuZXcgZ2V0dGVyIG5hbWVkICR2JCB3aXRoIHN0YXRpYyByZXR1cm4gdHlwZSAkVCQgdG8gYmUgYWRkZWQgdG8gdGhlIGlubmVybW9zdCBlbmNsb3Npbmcgc2NvcGUgYXQgdGhlIHBvaW50IGZvbGxvd2luZyB0aGUgdmFyaWFibGUgZGVjbGFyYXRpb24gc3RhdGVtZW50LiBUaGUgcmVzdWx0IG9mIGV4ZWN1dGluZyB0aGlzIGdldHRlciBpcyB0aGUgdmFsdWUgc3RvcmVkIGluICR2JC4gCgolQSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBzdGF0ZW1lbnQgXFZBUnt9ICR2OyQsIFxWQVJ7fSAkdiA9IGU7JCwgXENPTlNUe30gICR2ID0gZTskIG9yICBcRklOQUx7fSAgJHYgPSBlOyQgY2F1c2VzIGEgbmV3IGdldHRlciBuYW1lZCAkdiQgd2l0aCBzdGF0aWMgcmV0dXJuIHR5cGUgIFxEWU5BTUlDe30gdG8gYmUgYWRkZWQgdG8gdGhlIGlubmVybW9zdCBlbmNsb3Npbmcgc2NvcGUgYXQgdGhlIHBvaW50IGZvbGxvd2luZyB0aGUgdmFyaWFibGUgZGVjbGFyYXRpb24gc3RhdGVtZW50LiBUaGUgcmVzdWx0IG9mIGV4ZWN1dGluZyB0aGlzIGdldHRlciAgaXMgdGhlIHZhbHVlIHN0b3JlZCBpbiAkdiQuIAoKJUEgdmFyaWFibGUgZGVjbGFyYXRpb24gc3RhdGVtZW50IG9mIG9uZSBvZiB0aGUgZm9ybXMgJFQkICR2OyQsIG9yICRUJCAkdiA9IGU7JCBjYXVzZXMgYSBuZXcgc2V0dGVyIG5hbWVkICR2PSQgd2l0aCBhcmd1bWVudCB0eXBlICRUJCB0byBiZSBhZGRlZCB0byB0aGUgaW5uZXJtb3N0IGVuY2xvc2luZyBzY29wZSBhdCB0aGUgcG9pbnQgZm9sbG93aW5nIHRoZSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBzdGF0ZW1lbnQuIFRoZSBlZmZlY3Qgb2YgZXhlY3V0aW5nIHRoaXMgc2V0dGVyICBpcyB0byBzdG9yZSBpdHMgYXJndW1lbnQgaW4gJHYkLiAKCiVBIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHN0YXRlbWVudCBcVkFSe30gJHY7JCwgXFZBUnt9ICR2ID0gZTskLCBcQ09OU1R7fSAgJHYgPSBlOyQgb3IgIFxGSU5BTHt9ICAkdiA9IGU7JCBjYXVzZXMgYSBuZXcgc2V0dGVyIG5hbWVkICR2PSQgd2l0aCAgYXJndW1lbnQgdHlwZSAgXERZTkFNSUN7fSB0byBiZSBhZGRlZCB0byB0aGUgaW5uZXJtb3N0IGVuY2xvc2luZyBzY29wZSBhdCB0aGUgcG9pbnQgZm9sbG93aW5nIHRoZSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBzdGF0ZW1lbnQuIFRoZSBlZmZlY3Qgb2YgZXhlY3V0aW5nIHRoaXMgc2V0dGVyICBpcyB0byBzdG9yZSBpdHMgYXJndW1lbnQgaW4gJHYkLiAKCiVccmF0aW9uYWxlewogJVRoZSB1c2Ugb2YgZ2V0dGVycyBhbmQgc2V0dGVycyBoZXJlIGlzIGEgZGV2aWNlIHRvIGhlbHAgbWFrZSB0aGUgc3BlY2lmaWNhdGlvbiBtb3JlIHVuaWZvcm0uIEludHJvZHVjaW5nIGdldHRlcnMgYW5kIHNldHRlcnMgZm9yIGxvY2FsIHZhcmlhYmxlcyBoYXMgbm8gcGVyZm9ybWFuY2UgY29uc2VxdWVuY2VzLCBzaW5jZSB0aGV5IGNhbiBuZXZlciBiZSBvdmVycmlkZGVuLCBhbmQgc28gY2FuIGFsd2F5cyBiZSBvcHRpbWl6ZWQgYXdheS4gIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBkZWNsYXJlIGEgbG9jYWwgZ2V0dGVyIG9yIHNldHRlciBleHBsaWNpdGx5LCBzaW5jZSB0aGVyZSBpcyBsaXR0bGUgcmVhc29uIHRvIGV2ZXIgZG8gc28uCiV9CgoKXHN1YnNlY3Rpb257TG9jYWwgRnVuY3Rpb24gRGVjbGFyYXRpb259CgpcbGFiZWx7bG9jYWxGdW5jdGlvbkRlY2xhcmF0aW9ufQoKQSBmdW5jdGlvbiBkZWNsYXJhdGlvbiBzdGF0ZW1lbnQgZGVjbGFyZXMgYSBuZXcgbG9jYWwgZnVuY3Rpb24gKFxyZWZ7ZnVuY3Rpb25EZWNsYXJhdGlvbnN9KS4gCgogXGJlZ2lue2dyYW1tYXJ9CntcYmYgbG9jYWxGdW5jdGlvbkRlY2xhcmF0aW9uOn0KICAgIGZ1bmN0aW9uU2lnbmF0dXJlIGZ1bmN0aW9uQm9keQogIC4KIFxlbmR7Z3JhbW1hcn0KIApBIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIHN0YXRlbWVudCBvZiBvbmUgb2YgdGhlIGZvcm1zICRpZCQgJHNpZ25hdHVyZSQgJFx7IHN0YXRlbWVudHMgXH0kIG9yICRUJCAkaWQkICRzaWduYXR1cmUkICRceyBzdGF0ZW1lbnRzIFx9JCBjYXVzZXMgYSBuZXcgZnVuY3Rpb24gbmFtZWQgJGlkJCB0byBiZSBhZGRlZCB0byB0aGUgaW5uZXJtb3N0IGVuY2xvc2luZyBzY29wZS4gSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgdG8gcmVmZXJlbmNlIGEgbG9jYWwgZnVuY3Rpb24gYmVmb3JlIGl0cyBkZWNsYXJhdGlvbi4gCgoKXGNvbW1lbnRhcnl7IFRoaXMgaW1wbGllcyB0aGF0IGxvY2FsIGZ1bmN0aW9ucyBjYW4gYmUgZGlyZWN0bHkgcmVjdXJzaXZlLCBidXQgbm90IG11dHVhbGx5IHJlY3Vyc2l2ZS4gQ29uc2lkZXIgdGhlc2UgZXhhbXBsZXM6Cn0KClxiZWdpbntkYXJ0Q29kZX0KZih4KSA9JD4kIHgrKzsgIC8vIGEgdG9wIGxldmVsIGZ1bmN0aW9uCnRvcCgpIFx7IC8vIGFub3RoZXIgdG9wIGxldmVsIGZ1bmN0aW9uCiAgZigzKTsgLy8gaWxsZWdhbAogIGYoeCkgJD0+JCB4ICQ+JCAwPyB4KmYoeC0xKTogMTsgIC8vIHJlY3Vyc2lvbiBpcyBsZWdhbAogIGcxKHgpICQ9PiQgaCh4LCAxKTsgLy8gZXJyb3I6IGggaXMgbm90IGRlY2xhcmVkIHlldAogIGgoeCwgbikgJD0+JCB4ICQ+JCAxPyBoKHgtMSwgbip4KTogbjsgLy8gYWdhaW4sIHJlY3Vyc2lvbiBpcyBmaW5lCiAgZzIoeCkgJD0+JCBoKHgsIDEpOyAvLyBsZWdhbAogIAogIHAxKHgpICQ9PiQgcSh4LHgpOyAvLyBpbGxlZ2FsCiAgcTEoYSwgYikkID0+JCBhICQ+JCAwID8gcDEoYS0xKTogYjsgLy8gZmluZQoKICBxMihhLCBiKSAkPT4kIGEgJD4kIDAgPyBwMihhLTEpOiBiOyAvLyBpbGxlZ2FsCiAgcDEoeCkgJD0+JCBxMih4LHgpOyAvLyBmaW5lICAKXH0KXGVuZHtkYXJ0Q29kZX0KClxjb21tZW50YXJ5ewpUaGVyZSBpcyBubyB3YXkgdG8gd3JpdGUgYSBwYWlyIG9mIG11dHVhbGx5IHJlY3Vyc2l2ZSBsb2NhbCBmdW5jdGlvbnMsIGJlY2F1c2Ugb25lIGFsd2F5cyBoYXMgdG8gY29tZSBiZWZvcmUgdGhlIG90aGVyIGlzIGRlY2xhcmVkLiBUaGVzZSBjYXNlcyBhcmUgcXVpdGUgcmFyZSwgYW5kIGNhbiBhbHdheXMgYmUgbWFuYWdlZCBieSBkZWZpbmluZyBhIHBhaXIgb2YgdmFyaWFibGVzIGZpcnN0LCB0aGVuIGFzc2lnbmluZyB0aGVtIGFwcHJvcHJpYXRlIGNsb3N1cmVzOgp9CgpcYmVnaW57ZGFydENvZGV9CnRvcDIoKSBceyAvLyBhIHRvcCBsZXZlbCBmdW5jdGlvbgogXFZBUnt9IHAsIHE7ICAKICBwID0gKHgpICQ9PiQgcSh4LHgpOyAKICBxID0gKGEsIGIpICQ9PiQgYSAkPiQgMCA/IHAoYS0xKTogYjsgCgpcfQpcZW5ke2RhcnRDb2RlfQoKXHJhdGlvbmFsZXsKVGhlICBydWxlcyBmb3IgbG9jYWwgZnVuY3Rpb25zIGRpZmZlciBzbGlnaHRseSBmcm9tIHRob3NlIGZvciBsb2NhbCB2YXJpYWJsZXMgaW4gdGhhdCBhIGZ1bmN0aW9uIGNhbiBiZSBhY2Nlc3NlZCB3aXRoaW4gaXRzIGRlY2xhcmF0aW9uIGJ1dCBhIHZhcmlhYmxlIGNhbiBvbmx5IGJlIGFjY2Vzc2VkIGFmdGVyIGl0cyBkZWNsYXJhdGlvbi4gVGhpcyBpcyBiZWNhdXNlIHJlY3Vyc2l2ZSBmdW5jdGlvbnMgYXJlIHVzZWZ1bCB3aGVyZWFzIHJlY3Vyc2l2ZWx5IGRlZmluZWQgdmFyaWFibGVzIGFyZSBhbG1vc3QgYWx3YXlzIGVycm9ycy4gIEl0IHRoZXJlZm9yZSBtYWtlcyBzZW5zZSB0byBoYXJtb25pemUgdGhlIHJ1bGVzIGZvciBsb2NhbCBmdW5jdGlvbnMgd2l0aCB0aG9zZSBmb3IgZnVuY3Rpb25zIGluIGdlbmVyYWwgcmF0aGVyIHRoYW4gd2l0aCB0aGUgcnVsZXMgZm9yIGxvY2FsIHZhcmlhYmxlcy4KfQoKJSBlbGFib3JhdGUgb24gZnVuY3Rpb24gaWRlbnRpdHkgYW5kIGVxdWFsaXR5LCBydW50aW1lIHR5cGUuIExpa2V3c2llIGluIGZ1bmN0aW9uIGV4cHJlc3Npb25zIChjbG9zdXJlcykgYW5kIGRlY2xhcmF0aW9ucwoKXHN1YnNlY3Rpb257SWZ9ClxsYWJlbHtpZn0KClRoZSB7XGVtIGlmIHN0YXRlbWVudH0gYWxsb3dzIGZvciBjb25kaXRpb25hbCBleGVjdXRpb24gb2Ygc3RhdGVtZW50cy4KClxiZWdpbntncmFtbWFyfQp7XGJmIGlmU3RhdGVtZW50On0KICAgICAgXElGe30gYCgnIGV4cHJlc3Npb24gYCknIHN0YXRlbWVudCAoIFxFTFNFe30gc3RhdGVtZW50KT8gJSB3ZSBjb3VsZCBhbGxvdyB0b3AgbGV2ZWwgZXhwcmVzc2lvbgogICAgLgogXGVuZHtncmFtbWFyfQogCkV4ZWN1dGlvbiBvZiBhbiBpZiBzdGF0ZW1lbnQgb2YgdGhlIGZvcm0gIFxjb2RlIHtcSUZ7fSAofSRiJFxjb2Rleyl9JHNfMSQgXGNvZGV7XEVMU0V7fSB9ICRzXzIkIHByb2NlZWRzIGFzIGZvbGxvd3M6CiAKIEZpcnN0LCB0aGUgZXhwcmVzc2lvbiAkYiQgaXMgZXZhbHVhdGVkIHRvIGFuIG9iamVjdCAkbyQuIFRoZW4sICRvJCBpcyAgc3ViamVjdGVkIHRvIGJvb2xlYW4gY29udmVyc2lvbiAoXHJlZntib29sZWFuQ29udmVyc2lvbn0pLCBwcm9kdWNpbmcgYW4gb2JqZWN0ICRyJC4gSWYgJHIkIGlzIFxUUlVFe30sIHRoZW4gdGhlIHN0YXRlbWVudCAkXHtzXzFcfSQgaXMgZXhlY3V0ZWQsIG90aGVyd2lzZSBzdGF0ZW1lbnQgJFx7c18yXH0kIGlzIGV4ZWN1dGVkLgoKIAogXGNvbW1lbnRhcnkgewogUHV0IGFub3RoZXIgd2F5LCBcY29kZSB7XElGe30gKH0kYiRcY29kZXspfSRzXzEkIFxjb2Rle1xFTFNFe30gfSAkc18yJCBpcyBlcXVpdmFsZW50IHRvCiBcY29kZSB7XElGe30gKH0kYiRcY29kZXspfSRce3NfMVx9JCBcY29kZXtcRUxTRXt9IH0gJFx7c18yXH0kCiB9CiAKIFxyYXRpb25hbGUgewogVGhlIHJlYXNvbiBmb3IgdGhpcyBlcXVpdmFsZW5jZSBpcyB0byBjYXRjaCBlcnJvcnMgc3VjaCBhcwogfQogXGJlZ2lue2RhcnRDb2RlfQpcVk9JRHt9IG1haW4oKSBcewogIFxJRnt9IChzb21lUHJlZGljYXRlKSAKICAgIFxWQVJ7fSB2ID0gMjsKICBwcmludCh2KTsKXH0KXGVuZHtkYXJ0Q29kZX0KClxyYXRpb25hbGUgewpVbmRlciByZWFzb25hYmxlIHNjb3BlIHJ1bGVzICBzdWNoIGNvZGUgaXMgcHJvYmxlbWF0aWMuIElmIHdlIGFzc3VtZSB0aGF0IFxjb2Rle3Z9IGlzIGRlY2xhcmVkIGluIHRoZSBzY29wZSBvZiB0aGUgbWV0aG9kIFxjb2Rle21haW4oKX0sIHRoZW4gd2hlbiBcY29kZXtzb21lUHJlZGljYXRlfSBpcyBmYWxzZSwgXGNvZGV7dn0gd2lsbCBiZSB1bmluaXRpYWxpemVkIHdoZW4gYWNjZXNzZWQuICBUaGUgY2xlYW5lc3QgYXBwcm9hY2ggd291bGQgYmUgdG8gcmVxdWlyZSBhIGJsb2NrIGZvbGxvd2luZyB0aGUgdGVzdCwgcmF0aGVyIHRoYW4gYW4gYXJiaXRyYXJ5IHN0YXRlbWVudC4gSG93ZXZlciwgdGhpcyBnb2VzIGFnYWluc3QgbG9uZyBzdGFuZGluZyBjdXN0b20sIHVuZGVybWluaW5nIERhcnQncyBnb2FsIG9mIGZhbWlsaWFyaXR5LiAgSW5zdGVhZCwgd2UgY2hvb3NlIHRvIGluc2VydCBhIGJsb2NrLCBpbnRyb2R1Y2luZyBhIHNjb3BlLCAgYXJvdW5kIHRoZSBzdGF0ZW1lbnQgZm9sbG93aW5nIHRoZSBwcmVkaWNhdGUgKGFuZCBzaW1pbGFybHkgZm9yIFxFTFNFe30gYW5kIGxvb3BzKS4gVGhpcyB3aWxsIGNhdXNlIGJvdGggYSB3YXJuaW5nIGFuZCBhIHJ1bnRpbWUgZXJyb3IgaW4gdGhlIGNhc2UgYWJvdmUuICBPZiBjb3Vyc2UsIGlmIHRoZXJlIGlzIGEgZGVjbGFyYXRpb24gb2YgXGNvZGV7dn0gaW4gdGhlIHN1cnJvdW5kaW5nIHNjb3BlLCBwcm9ncmFtbWVycyBtaWdodCBzdGlsbCBiZSBzdXJwcmlzZWQuIFdlIGV4cGVjdCB0b29scyB0byBoaWdobGlnaHQgY2FzZXMgb2Ygc2hhZG93aW5nIHRvIGhlbHAgYXZvaWQgc3VjaCBzaXR1YXRpb25zLgogfQogCiAgSXQgaXMgYSBzdGF0aWMgdHlwZSB3YXJuaW5nIGlmIHRoZSB0eXBlIG9mIHRoZSBleHByZXNzaW9uICRiJCBtYXkgbm90IGJlIGFzc2lnbmVkIHRvIFxjb2Rle2Jvb2x9LiAgCiAgCklmOgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gICRiJCBzaG93cyB0aGF0IGEgdmFyaWFibGUgJHYkIGhhcyB0eXBlICRUJC4KXGl0ZW0gICR2JCBpcyBub3QgcG90ZW50aWFsbHkgbXV0YXRlZCBpbiAkc18xJCBvciB3aXRoaW4gYSBjbG9zdXJlLgpcaXRlbSBJZiB0aGUgdmFyaWFibGUgJHYkIGlzIGFjY2Vzc2VkIGJ5IGEgY2xvc3VyZSBpbiAkc18xJCB0aGVuIHRoZSB2YXJpYWJsZSAkdiQgaXMgbm90IHBvdGVudGlhbGx5IG11dGF0ZWQgYW55d2hlcmUgaW4gdGhlIHNjb3BlIG9mICR2JC4gClxlbmR7aXRlbWl6ZX0KdGhlbiB0aGUgdHlwZSBvZiAkdiQgaXMga25vd24gdG8gYmUgJFQkIGluICRzXzEkLiAgCgogQW4gaWYgc3RhdGVtZW50IG9mIHRoZSBmb3JtICBcY29kZSB7XElGe30gKH0kYiRcY29kZXspfSRzXzEkIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGlmIHN0YXRlbWVudCAgCiAKIFxjb2RlIHtcSUZ7fSAofSRiJFxjb2Rleyl9JHNfMSQgXGNvZGV7XEVMU0V7fSBce1x9fS4KICAgICAKCiAgICAKXHN1YnNlY3Rpb257Rm9yfQpcbGFiZWx7Zm9yfQoKVGhlIHtcZW0gZm9yIHN0YXRlbWVudH0gc3VwcG9ydHMgaXRlcmF0aW9uLgoKXGJlZ2lue2dyYW1tYXJ9CntcYmYgZm9yU3RhdGVtZW50On0KICAgICBcRk9Se30gYCgnIGZvckxvb3BQYXJ0cyBgKScgc3RhdGVtZW50CiAgICAuCgp7XGJmIGZvckxvb3BQYXJ0czp9Zm9ySW5pdGlhbGl6ZXJTdGF0ZW1lbnQgZXhwcmVzc2lvbj8gYHtcZXNjYXBlZ3JhbW1hciA7fScgZXhwcmVzc2lvbkxpc3Q/OwogICAgICBkZWNsYXJlZElkZW50aWZpZXIgXElOe30gZXhwcmVzc2lvbjsKICAgICAgaWRlbnRpZmllciBcSU57fSBleHByZXNzaW9uCiAgICAuCgp7XGJmIGZvckluaXRpYWxpemVyU3RhdGVtZW50On1sb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24gYHtcZXNjYXBlZ3JhbW1hciA7fSc7CiAgICAgIGV4cHJlc3Npb24/IGB7XGVzY2FwZWdyYW1tYXIgO30nCiAgICAuCiBcZW5ke2dyYW1tYXJ9CiAKIFRoZSBmb3Igc3RhdGVtZW50IGhhcyB0d28gZm9ybXMgLSB0aGUgdHJhZGl0aW9uYWwgZm9yIGxvb3AgYW5kIHRoZSBmb3ItaW4gc3RhdGVtZW50LgoKXHN1YnN1YnNlY3Rpb257Rm9yIExvb3B9ClxsYWJlbHtmb3JMb29wfQoKCkV4ZWN1dGlvbiBvZiBhIGZvciBzdGF0ZW1lbnQgb2YgdGhlIGZvcm0gICBcY29kZXsgXEZPUnt9IChcVkFSe30gJHYgPSBlXzAkIDsgJGMkOyAkZSQpICRzJH0gcHJvY2VlZHMgYXMgZm9sbG93czoKCklmICRjJCBpcyBlbXB0eSB0aGVuIGxldCAkY15ccHJpbWUkIGJlIFxUUlVFe30gb3RoZXJ3aXNlIGxldCAgJGNeXHByaW1lJCBiZSAkYyQuCgpGaXJzdCB0aGUgdmFyaWFibGUgZGVjbGFyYXRpb24gc3RhdGVtZW50IFxWQVJ7fSAkdiA9IGVfMCQgaXMgZXhlY3V0ZWQuIFRoZW46ClxiZWdpbntlbnVtZXJhdGV9ClxpdGVtClxsYWJlbHtiZWdpbkZvcn0KSWYgdGhpcyBpcyB0aGUgZmlyc3QgaXRlcmF0aW9uIG9mIHRoZSBmb3IgbG9vcCwgbGV0ICR2XlxwcmltZSQgYmUgJHYkLiBPdGhlcndpc2UsICBsZXQgJHZeXHByaW1lJCBiZSB0aGUgdmFyaWFibGUgJHZee1xwcmltZVxwcmltZX0kIGNyZWF0ZWQgaW4gdGhlIHByZXZpb3VzIGV4ZWN1dGlvbiBvZiBzdGVwIFxyZWZ7YWxsb2NhdGVGcmVzaFZhcn0uClxpdGVtClRoZSBleHByZXNzaW9uICRbdl5ccHJpbWUvdl1jJCBpcyBldmFsdWF0ZWQgYW5kIHN1YmplY3RlZCB0byBib29sZWFuIGNvbnZlcnNpb24gKFxyZWZ7Ym9vbGVhbnN9KS4gSWYgdGhlIHJlc3VsdCBpcyBcRkFMU0V7fSwgdGhlIGZvciBsb29wIGNvbXBsZXRlcy4gT3RoZXJ3aXNlLCBleGVjdXRpb24gY29udGludWVzIGF0IHN0ZXAgICAgClxyZWZ7YmVnaW5JdGVyYXRpb259LgpcaXRlbQpcbGFiZWx7YmVnaW5JdGVyYXRpb259ClRoZSBzdGF0ZW1lbnQgJFt2XlxwcmltZS92XVx7c1x9JCBpcyBleGVjdXRlZC4KXGl0ZW0KXGxhYmVse2FsbG9jYXRlRnJlc2hWYXJ9CkxldCAkdl57XHByaW1lXHByaW1lfSQgYmUgYSBmcmVzaCB2YXJpYWJsZS4gICR2XntccHJpbWVccHJpbWV9JCBpcyBib3VuZCB0byB0aGUgdmFsdWUgb2YgJHZeXHByaW1lJC4KXGl0ZW0KVGhlIGV4cHJlc3Npb24gJFt2XntccHJpbWVccHJpbWV9L3ZdZSQgaXMgZXZhbHVhdGVkLCBhbmQgdGhlIHByb2Nlc3MgcmVjdXJzZXMgYXQgc3RlcAogIFxyZWZ7YmVnaW5Gb3J9LgpcZW5ke2VudW1lcmF0ZX0KClxyYXRpb25hbGV7ClRoZSBkZWZpbml0aW9uIGFib3ZlIGlzIGludGVuZGVkIHRvIHByZXZlbnQgdGhlIGNvbW1vbiBlcnJvciB3aGVyZSB1c2VycyBjcmVhdGUgYSBjbG9zdXJlIGluc2lkZSBhIGZvciBsb29wLCBpbnRlbmRpbmcgdG8gY2xvc2Ugb3ZlciB0aGUgY3VycmVudCBiaW5kaW5nIG9mIHRoZSBsb29wIHZhcmlhYmxlLCBhbmQgZmluZCAodXN1YWxseSBhZnRlciBhIHBhaW5mdWwgcHJvY2VzcyBvZiBkZWJ1Z2dpbmcgYW5kIGxlYXJuaW5nKSB0aGF0IGFsbCB0aGUgY3JlYXRlZCBjbG9zdXJlcyBoYXZlIGNhcHR1cmVkIHRoZSBzYW1lIHZhbHVlIC0gdGhlIG9uZSBjdXJyZW50IGluIHRoZSBsYXN0IGl0ZXJhdGlvbiBleGVjdXRlZC4KCkluc3RlYWQsIGVhY2ggaXRlcmF0aW9uIGhhcyBpdHMgb3duIGRpc3RpbmN0IHZhcmlhYmxlLiAgVGhlIGZpcnN0IGl0ZXJhdGlvbiB1c2VzIHRoZSB2YXJpYWJsZSBjcmVhdGVkIGJ5IHRoZSBpbml0aWFsIGRlY2xhcmF0aW9uLiBUaGUgZXhwcmVzc2lvbiBleGVjdXRlZCBhdCB0aGUgZW5kIG9mIGVhY2ggaXRlcmF0aW9uIHVzZXMgYSBmcmVzaCB2YXJpYWJsZSAkdl57XHByaW1lXHByaW1lfSQsIGJvdW5kIHRvIHRoZSB2YWx1ZSBvZiB0aGUgY3VycmVudCBpdGVyYXRpb24gdmFyaWFibGUsIGFuZCB0aGVuIG1vZGlmaWVzICR2XntccHJpbWVccHJpbWV9JCBhcyByZXF1aXJlZCBmb3IgdGhlIG5leHQgaXRlcmF0aW9uLgp9CgpJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmIHRoZSBzdGF0aWMgdHlwZSBvZiAkYyQgbWF5IG5vdCBiZSBhc3NpZ25lZCB0byBcY2R7Ym9vbH0uCgolQSBmb3Igc3RhdGVtZW50IG9mIHRoZSBmb3JtIFxjb2RleyBcRk9Se30gKCRkJCA7ICRjJDsgJGUkKSAkcyR9IGlzIGVxdWl2YWxlbnQgdG8gdGhlIHRoZSBmb2xsb3dpbmcgY29kZToKCiVcY29kZXsKJVx7JGQkOwolXFdISUxFe30gKCRjJCkgXHsKJSAgIFx7JHMkXH0KJSAgICRlJDsKJVx9XH0KJX0KCiVJZiAkYyQgaXMgZW1wdHksIGl0IGlzIGludGVycHJldGVkIGFzIFxUUlVFe30uCgpcc3Vic3Vic2VjdGlvbntGb3ItaW59ClxsYWJlbHtmb3ItaW59CgpBIGZvciBzdGF0ZW1lbnQgb2YgdGhlIGZvcm0gXGNvZGV7IFxGT1J7fSAoJGZpbmFsQ29uc3RWYXJPclR5cGU/JCBpZCBcSU57fSAkZSQpICRzJH0gaXMgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nIGNvZGU6IAoKXGJlZ2lue2RhcnRDb2RlfQp2YXIgbjAgPSAkZSQuaXRlcmF0b3I7ClxXSElMRXt9IChuMC5tb3ZlTmV4dCgpKSBcewogICAkZmluYWxDb25zdFZhck9yVHlwZT8kIGlkID0gbjAuY3VycmVudDsKICAgJHMkIApcfQpcZW5ke2RhcnRDb2RlfQp3aGVyZSBcY29kZXtuMH0gaXMgYW4gaWRlbnRpZmllciB0aGF0IGRvZXMgbm90IG9jY3VyIGFueXdoZXJlIGluIHRoZSBwcm9ncmFtLgoKXGNvbW1lbnRhcnl7Ck5vdGUgdGhhdCBpbiBmYWN0LCB1c2luZyBhICBcQ09OU1R7fSB2YXJpYWJsZSB3b3VsZCBnaXZlIHJpc2UgdG8gYSBjb21waWxlIHRpbWUgZXJyb3Igc2luY2UgXGNke24wLmN1cnJlbnR9IGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24uICAKfQogClxzdWJzZWN0aW9ue1doaWxlfQpcbGFiZWx7d2hpbGV9CgpUaGUgd2hpbGUgc3RhdGVtZW50IHN1cHBvcnRzIGNvbmRpdGlvbmFsIGl0ZXJhdGlvbiwgd2hlcmUgdGhlIGNvbmRpdGlvbiBpcyBldmFsdWF0ZWQgcHJpb3IgdG8gdGhlIGxvb3AuCgpcYmVnaW57Z3JhbW1hcn0Ke1xiZiB3aGlsZVN0YXRlbWVudDp9CiAgICAgIFxXSElMRXt9IGAoJyBleHByZXNzaW9uIGApJyBzdGF0ZW1lbnQgICUgY291bGQgZG8gdG9wIGxldmVsIGhlcmUsIGFuZCBpbiBmb3IKLgogXGVuZHtncmFtbWFyfQogCiBFeGVjdXRpb24gb2YgYSB3aGlsZSBzdGF0ZW1lbnQgb2YgdGhlIGZvcm0gXGNvZGV7XFdISUxFe30gKCRlJCkgJHMkO30gcHJvY2VlZHMgYXMgZm9sbG93czogCgpUaGUgZXhwcmVzc2lvbiAkZSQgaXMgZXZhbHVhdGVkIHRvIGFuIG9iamVjdCAkbyQuIFRoZW4sICRvJCBpcyAgc3ViamVjdGVkIHRvIGJvb2xlYW4gY29udmVyc2lvbiAoXHJlZntib29sZWFuQ29udmVyc2lvbn0pLCBwcm9kdWNpbmcgYW4gb2JqZWN0ICRyJC4gIElmICRyJCBpcyBcVFJVRXt9LCB0aGVuIHRoZSBzdGF0ZW1lbnQgJFx7c1x9JCBpcyBleGVjdXRlZCBhbmQgdGhlbiB0aGUgd2hpbGUgc3RhdGVtZW50IGlzIHJlLWV4ZWN1dGVkIHJlY3Vyc2l2ZWx5LiBJZiAkciQgaXMgXEZBTFNFe30sIGV4ZWN1dGlvbiBvZiB0aGUgd2hpbGUgc3RhdGVtZW50IGlzIGNvbXBsZXRlLgoKSXQgaXMgYSBzdGF0aWMgdHlwZSB3YXJuaW5nIGlmIHRoZSBzdGF0aWMgdHlwZSBvZiAkZSQgbWF5IG5vdCBiZSBhc3NpZ25lZCB0byBcY29kZXtib29sfS4KICAgIAoKXHN1YnNlY3Rpb257RG99ClxsYWJlbHtkb30KClRoZSBkbyBzdGF0ZW1lbnQgc3VwcG9ydHMgY29uZGl0aW9uYWwgaXRlcmF0aW9uLCB3aGVyZSB0aGUgY29uZGl0aW9uIGlzIGV2YWx1YXRlZCBhZnRlciB0aGUgbG9vcC4KClxiZWdpbntncmFtbWFyfQp7XGJmIGRvU3RhdGVtZW50On0KICAgIFxET3t9IHN0YXRlbWVudCBcV0hJTEV7fSBgKCcgZXhwcmVzc2lvbiBgKScgYHtcZXNjYXBlZ3JhbW1hciA7fSclIGNvdWxkIGRvIHRvcCBsZXZlbCBoZXJlCiAgICAgIC4KIFxlbmR7Z3JhbW1hcn0KCiAgICAKRXhlY3V0aW9uIG9mIGEgZG8gc3RhdGVtZW50IG9mIHRoZSBmb3JtIFxjb2Rle1xET3t9ICRzJCBcV0hJTEV7fSAoJGUkKTt9IHByb2NlZWRzIGFzIGZvbGxvd3M6IAoKVGhlIHN0YXRlbWVudCAkXHtzXH0kIGlzIGV4ZWN1dGVkLiBUaGVuLCB0aGUgZXhwcmVzc2lvbiAkZSQgaXMgZXZhbHVhdGVkIHRvIGFuIG9iamVjdCAkbyQuIFRoZW4sICRvJCBpcyAgc3ViamVjdGVkIHRvIGJvb2xlYW4gY29udmVyc2lvbiAoXHJlZntib29sZWFuQ29udmVyc2lvbn0pLCBwcm9kdWNpbmcgYW4gb2JqZWN0ICRyJC4gSWYgJHIkIGlzIFxGQUxTRXt9LCBleGVjdXRpb24gb2YgdGhlIGRvIHN0YXRlbWVudCBpcyBjb21wbGV0ZS4gSWYgJHIkIGlzIFxUUlVFe30sIHRoZW4gdGhlIGRvIHN0YXRlbWVudCBpcyByZS1leGVjdXRlZCByZWN1cnNpdmVseS4gCgpJdCBpcyBhIHN0YXRpYyB0eXBlIHdhcm5pbmcgaWYgdGhlIHN0YXRpYyB0eXBlIG9mICRlJCBtYXkgbm90IGJlIGFzc2lnbmVkIHRvIFxjb2Rle2Jvb2x9LiAKClxzdWJzZWN0aW9ue1N3aXRjaH0KXGxhYmVse3N3aXRjaH0KClRoZSB7XGVtIHN3aXRjaCBzdGF0ZW1lbnR9IHN1cHBvcnRzIGRpc3BhdGNoaW5nIGNvbnRyb2wgYW1vbmcgYSBsYXJnZSBudW1iZXIgb2YgY2FzZXMuCgogXGJlZ2lue2dyYW1tYXJ9CntcYmYgc3dpdGNoU3RhdGVtZW50On0KICAgICAgXFNXSVRDSHt9IGAoJyBleHByZXNzaW9uIGApJyBgXHsnIHN3aXRjaENhc2UqIGRlZmF1bHRDYXNlPyBgXH0nJSBjb3VsZCBkbyB0b3AgbGV2ZWwgaGVyZSBhbmQgaW4gY2FzZXMKICAgIC4KCgp7XGJmIHN3aXRjaENhc2U6fQogICAgICBsYWJlbCogKFxDQVNFe30gZXhwcmVzc2lvbiBge1xlc2NhcGVncmFtbWFyIDp9Jykgc3RhdGVtZW50cwogICAgLgoKe1xiZiBkZWZhdWx0Q2FzZTp9CiAgICAgIGxhYmVsKiAgXERFRkFVTFR7fSBge1xlc2NhcGVncmFtbWFyIDp9JyBzdGF0ZW1lbnRzCiAgICAuCiBcZW5ke2dyYW1tYXJ9CiAKIEdpdmVuIGEgc3dpdGNoIHN0YXRlbWVudCBvZiB0aGUgZm9ybSAKIApcYmVnaW57ZGFydENvZGV9ClxTV0lUQ0h7fSAoJGUkKSBceyAKICAgXENBU0V7fSAkbGFiZWxfezExfSBcbGRvdHMgbGFiZWxfezFqXzF9JCAkZV8xOiBzXzEkIAogICAkXGxkb3RzJCAgCiAgIFxDQVNFe30gJGxhYmVsX3tuMX0gXGxkb3RzIGxhYmVsX3tual9ufSQgJGVfbjogc19uJCAKICAgXERFRkFVTFR7fTogJHNfe24rMX0kIApcfQpcZW5ke2RhcnRDb2RlfQogCiBvciB0aGUgZm9ybSAKIApcYmVnaW57ZGFydENvZGV9ClxTV0lUQ0h7fSAoJGUkKSBceyAKICAgXENBU0V7fSAkbGFiZWxfezExfSBcbGRvdHMgbGFiZWxfezFqXzF9JCAkZV8xOiBzXzEkCiAgICRcbGRvdHMkICAKICAgXENBU0V7fSAkbGFiZWxfe24xfSBcbGRvdHMgbGFiZWxfe25qX259JCAkZV9uOiBzX24kIApcfQpcZW5ke2RhcnRDb2RlfQogCiBpdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiB0aGUgZXhwcmVzc2lvbnMgJGVfayQgYXJlIG5vdCBjb21waWxlLXRpbWUgY29uc3RhbnRzIGZvciBhbGwgICRrIFxpbiAxLi5uJC4gIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIHRoZSB2YWx1ZXMgb2YgdGhlIGV4cHJlc3Npb25zICRlX2skIGFyZSBub3QgZWl0aGVyOgogXGJlZ2lue2l0ZW1pemV9CiBcaXRlbSBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgY2xhc3MgJEMkLCBmb3IgYWxsICRrIFxpbiAxLi5uJCwgIG9yIAogXGl0ZW0gaW5zdGFuY2VzIG9mIGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIFxjZHtpbnR9LCBmb3IgYWxsICRrIFxpbiAxLi5uJCwgIG9yIAogXGl0ZW0gaW5zdGFuY2VzIG9mIGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIFxjZHtTdHJpbmd9LCBmb3IgYWxsICRrIFxpbiAxLi5uJC4gCiBcZW5ke2l0ZW1pemV9CiAKXGNvbW1lbnRhcnl7SW4gb3RoZXIgd29yZHMsICBhbGwgdGhlIGV4cHJlc3Npb25zIGluIHRoZSBjYXNlcyBldmFsdWF0ZSB0byBjb25zdGFudHMgb2YgdGhlIGV4YWN0IHNhbWUgdXNlciBkZWZpbmVkIGNsYXNzIG9yIGFyZSBvZiBjZXJ0YWluIGtub3duIHR5cGVzLiAgTm90ZSB0aGF0IHRoZSB2YWx1ZXMgb2YgdGhlIGV4cHJlc3Npb25zIGFyZSBrbm93biBhdCBjb21waWxlLXRpbWUsIGFuZCBhcmUgaW5kZXBlbmRlbnQgb2YgYW55IHN0YXRpYyB0eXBlIGFubm90YXRpb25zLgp9CgpJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiB0aGUgY2xhc3MgJEMkIGhhcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgb3BlcmF0b3IgJD09JCBvdGhlciB0aGFuIHRoZSBvbmUgaW5oZXJpdGVkIGZyb20gXGNvZGV7T2JqZWN0fSB1bmxlc3MgdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uIGlzIGEgc3RyaW5nLCBhbiBpbnRlZ2VyLCBsaXRlcmFsIHN5bWJvbCBvciB0aGUgcmVzdWx0IG9mIGludm9raW5nIGEgY29uc3RhbnQgY29uc3RydWN0b3Igb2YgY2xhc3MgXGNke1N5bWJvbH0uCiAKIFxyYXRpb25hbGV7CiBUaGUgcHJvaGliaXRpb24gb24gdXNlciBkZWZpbmVkIGVxdWFsaXR5IGFsbG93cyB1cyB0byBpbXBsZW1lbnQgdGhlIHN3aXRjaCBlZmZpY2llbnRseSBmb3IgdXNlciBkZWZpbmVkIHR5cGVzLiBXZSBjb3VsZCBmb3JtdWxhdGUgbWF0Y2hpbmcgaW4gdGVybXMgb2YgaWRlbnRpdHkgaW5zdGVhZCB3aXRoIHRoZSBzYW1lIGVmZmljaWVuY3kuIEhvd2V2ZXIsIGlmIGEgdHlwZSBkZWZpbmVzIGFuIGVxdWFsaXR5IG9wZXJhdG9yLCBwcm9ncmFtbWVycyB3b3VsZCBmaW5kIGl0IHF1aXRlIHN1cnByaXNpbmcgdGhhdCBlcXVhbCBvYmplY3RzIGRpZCBub3QgbWF0Y2guCiAKIH0KClxjb21tZW50YXJ5ewpUaGUgXFNXSVRDSHt9ICBzdGF0ZW1lbnQgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiB2ZXJ5IGxpbWl0ZWQgc2l0dWF0aW9ucyAoZS5nLiwgaW50ZXJwcmV0ZXJzIG9yIHNjYW5uZXJzKS4gIAp9CgpFeGVjdXRpb24gb2YgYSBzd2l0Y2ggc3RhdGVtZW50IG9mIHRoZSBmb3JtCgpcYmVnaW57ZGFydENvZGV9ClxTV0lUQ0h7fSAoJGUkKSBceyAKICAgXENBU0V7fSAkbGFiZWxfezExfSBcbGRvdHMgbGFiZWxfezFqXzF9JCAkZV8xOiBzXzEkIAogICAkXGxkb3RzJCAgCiAgIFxDQVNFe30gJGxhYmVsX3tuMX0gXGxkb3RzIGxhYmVsX3tual9ufSQgJGVfbjogc19uJCAKICAgXERFRkFVTFR7fTogJHNfe24rMX0kIApcfQpcZW5ke2RhcnRDb2RlfQogCm9yIHRoZSBmb3JtIAogClxiZWdpbntkYXJ0Q29kZX0KXFNXSVRDSHt9ICgkZSQpIFx7IAogICBcQ0FTRXt9ICRsYWJlbF97MTF9IFxsZG90cyBsYWJlbF97MWpfMX0kICRlXzE6IHNfMSQKICAgJFxsZG90cyQgIAogICBcQ0FTRXt9ICRsYWJlbF97bjF9IFxsZG90cyBsYWJlbF97bmpfbn0kICRlX246IHNfbiQgClx9ClxlbmR7ZGFydENvZGV9Cgpwcm9jZWVkcyBhcyBmb2xsb3dzOgoKVGhlIHN0YXRlbWVudCBcY29kZXtcVkFSe30gaWQgPSAkZSQ7fSBpcyBldmFsdWF0ZWQsIHdoZXJlIFxjb2Rle2lkfSBpcyBhIHZhcmlhYmxlIHdob3NlIG5hbWUgaXMgZGlzdGluY3QgZnJvbSBhbnkgb3RoZXIgdmFyaWFibGUgaW4gdGhlIHByb2dyYW0uIEluIGNoZWNrZWQgbW9kZSwgaXQgaXMgYSBydW4gdGltZSBlcnJvciBpZiB0aGUgdmFsdWUgb2YgJGUkIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0aGUgc2FtZSBjbGFzcyBhcyB0aGUgY29uc3RhbnRzICRlXzEgXGxkb3RzIGVfbiQuIAoKXGNvbW1lbnRhcnl7Tm90ZSB0aGF0IGlmIHRoZXJlIGFyZSBubyBjYXNlIGNsYXVzZXMgKCRuID0gMCQpLCB0aGUgdHlwZSBvZiAkZSQgZG9lcyBub3QgbWF0dGVyLn0KCk5leHQsIHRoZSBjYXNlIGNsYXVzZSBcQ0FTRXt9ICRlX3sxfTogc197MX0kIGlzIGV4ZWN1dGVkIGlmIGl0IGV4aXN0cy4gSWYgXENBU0V7fSAkZV97MX06IHNfezF9JCBkb2VzIG5vdCBleGlzdCwgdGhlbiBpZiB0aGVyZSBpcyBhICBcREVGQVVMVHt9IGNsYXVzZSBpdCBpcyBleGVjdXRlZCBieSBleGVjdXRpbmcgJHNfe24rMX0kLgoKQSBjYXNlIGNsYXVzZSBpbnRyb2R1Y2VzIGEgbmV3IHNjb3BlLCBuZXN0ZWQgaW4gdGhlIGxleGljYWxseSBzdXJyb3VuZGluZyBzY29wZS4gVGhlIHNjb3BlIG9mIGEgY2FzZSBjbGF1c2UgZW5kcyBpbW1lZGlhdGVseSBhZnRlciB0aGUgY2FzZSBjbGF1c2UncyBzdGF0ZW1lbnQgbGlzdC4KCkV4ZWN1dGlvbiBvZiBhIFxDQVNFe30gY2xhdXNlIFxDQVNFe30gJGVfe2t9OiBzX3trfSQgb2YgYSAgc3dpdGNoIHN0YXRlbWVudCAgCgpcYmVnaW57ZGFydENvZGV9ClxTV0lUQ0h7fSAoJGUkKSBceyAKICAgXENBU0V7fSAkbGFiZWxfezExfSBcbGRvdHMgbGFiZWxfezFqXzF9JCAkZV8xOiBzXzEkIAogICAkXGxkb3RzJCAgCiAgIFxDQVNFe30gJGxhYmVsX3tuMX0gXGxkb3RzIGxhYmVsX3tual9ufSQgJGVfbjogc19uJCAKICAgXERFRkFVTFR7fTogJHNfe24rMX0kIApcfQpcZW5ke2RhcnRDb2RlfQoKcHJvY2VlZHMgYXMgZm9sbG93czoKClRoZSBleHByZXNzaW9uIFxjb2RleyRlX2skID09IGlkfSBpcyBldmFsdWF0ZWQgdG8gYW4gb2JqZWN0ICRvJCB3aGljaCBpcyB0aGVuIHN1YmplY3RlZCB0byBib29sZWFuIGNvbnZlcnNpb24geWllbGRpbmcgYSB2YWx1ZSAkdiQuIApJZiAkdiQgaXMgbm90ICBcVFJVRXt9IHRoZSBmb2xsb3dpbmcgY2FzZSwgIFxDQVNFe30gJGVfe2srMX06IHNfe2srMX0kIGlzIGV4ZWN1dGVkIGlmIGl0IGV4aXN0cy4gSWYgIFxDQVNFe30gJGVfe2srMX06IHNfe2srMX0kIGRvZXMgbm90IGV4aXN0LCB0aGVuIHRoZSBcREVGQVVMVHt9IGNsYXVzZSBpcyBleGVjdXRlZCBieSBleGVjdXRpbmcgJHNfe24rMX0kLgpJZiAkdiQgaXMgXFRSVUV7fSwgICBsZXQgJGgkIGJlIHRoZSBzbWFsbGVzdCBudW1iZXIgc3VjaCB0aGF0ICRoIFxnZSBrJCBhbmQgJHNfaCQgaXMgbm9uLWVtcHR5LiBJZiBubyBzdWNoICRoJCBleGlzdHMsIGxldCAkaCA9IG4gKyAxJC4gVGhlICBzZXF1ZW5jZSBvZiBzdGF0ZW1lbnRzICRzX2gkIGlzIHRoZW4gZXhlY3V0ZWQuCklmIGV4ZWN1dGlvbiByZWFjaGVzIHRoZSBwb2ludCBhZnRlciAkc19oJCAgdGhlbiAgYSBydW50aW1lIGVycm9yIG9jY3VycywgdW5sZXNzICRoID0gbisxJC4KCkV4ZWN1dGlvbiBvZiBhIFxDQVNFe30gY2xhdXNlIFxDQVNFe30gJGVfe2t9OiBzX3trfSQgb2YgYSAgc3dpdGNoIHN0YXRlbWVudCAgCgpcYmVnaW57ZGFydENvZGV9ClxTV0lUQ0h7fSAoJGUkKSBceyAKICAgXENBU0V7fSAkbGFiZWxfezExfSBcbGRvdHMgbGFiZWxfezFqXzF9JCAkZV8xOiBzXzEkCiAgICRcbGRvdHMkICAKICAgXENBU0V7fSAkbGFiZWxfe24xfSBcbGRvdHMgbGFiZWxfe25qX259JCAkZV9uOiBzX24kIApcfQpcZW5ke2RhcnRDb2RlfQoKcHJvY2VlZHMgYXMgZm9sbG93czoKClRoZSBleHByZXNzaW9uIFxjb2RleyRlX2skID09IGlkfSBpcyBldmFsdWF0ZWQgdG8gYW4gb2JqZWN0ICRvJCB3aGljaCBpcyB0aGVuIHN1YmplY3RlZCB0byBib29sZWFuIGNvbnZlcnNpb24geWllbGRpbmcgYSB2YWx1ZSAkdiQuIApJZiAkdiQgaXMgbm90ICBcVFJVRXt9IHRoZSBmb2xsb3dpbmcgY2FzZSwgIFxDQVNFe30gJGVfe2srMX06IHNfe2srMX0kIGlzIGV4ZWN1dGVkIGlmIGl0IGV4aXN0cy4gCklmICR2JCBpcyBcVFJVRXt9LCAgIGxldCAkaCQgYmUgdGhlIHNtYWxsZXN0IGludGVnZXIgc3VjaCB0aGF0ICRoIFxnZSBrJCBhbmQgJHNfaCQgaXMgbm9uLWVtcHR5LiBUaGUgIHNlcXVlbmNlIG9mIHN0YXRlbWVudHMgJHNfaCQgaXMgIGV4ZWN1dGVkIGlmIGl0IGV4aXN0cy4KSWYgZXhlY3V0aW9uIHJlYWNoZXMgdGhlIHBvaW50IGFmdGVyICRzX2gkICB0aGVuICBhIHJ1bnRpbWUgZXJyb3Igb2NjdXJzLCB1bmxlc3MgJGggPSBuJC4KCgpcY29tbWVudGFyeXsKSW4gb3RoZXIgd29yZHMsIHRoZXJlIGlzIG5vIGltcGxpY2l0IGZhbGwtdGhyb3VnaCBiZXR3ZWVuIGNhc2VzLiBUaGUgbGFzdCBjYXNlIGluIGEgc3dpdGNoIChkZWZhdWx0IG9yIG90aGVyd2lzZSkgY2FuIGBmYWxsLXRocm91Z2gnIHRvIHRoZSBlbmQgb2YgdGhlIHN0YXRlbWVudC4KfQoKSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiB0aGUgdHlwZSBvZiAkZSQgbWF5IG5vdCBiZSBhc3NpZ25lZCB0byB0aGUgdHlwZSBvZiAkZV9rJC4gSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiB0aGUgbGFzdCBzdGF0ZW1lbnQgb2YgdGhlIHN0YXRlbWVudCBzZXF1ZW5jZSAkc19rJCBpcyBub3QgYSBcQlJFQUt7fSwgXENPTlRJTlVFe30sIFxSRVRVUk57fSBvciBcVEhST1d7fSBzdGF0ZW1lbnQuCgpccmF0aW9uYWxlewpUaGUgYmVoYXZpb3Igb2Ygc3dpdGNoIGNhc2VzIGludGVudGlvbmFsbHkgZGlmZmVycyBmcm9tIHRoZSBDIHRyYWRpdGlvbi4gIEltcGxpY2l0IGZhbGwgdGhyb3VnaCBpcyBhIGtub3duIGNhdXNlIG9mIHByb2dyYW1taW5nIGVycm9ycyBhbmQgdGhlcmVmb3JlIGRpc2FsbG93ZWQuICBXaHkgbm90IHNpbXBseSBicmVhayB0aGUgZmxvdyBpbXBsaWNpdGx5IGF0IHRoZSBlbmQgb2YgZXZlcnkgY2FzZSwgcmF0aGVyIHRoYW4gcmVxdWlyaW5nIGV4cGxpY2l0IGNvZGUgdG8gZG8gc28/ICBUaGlzIHdvdWxkIGluZGVlZCBiZSBjbGVhbmVyLiAgSXQgd291bGQgYWxzbyBiZSBjbGVhbmVyIHRvIGluc2lzdCB0aGF0IGVhY2ggY2FzZSBoYXZlIGEgc2luZ2xlIChwb3NzaWJseSBjb21wb3VuZCkgc3RhdGVtZW50LiAgV2UgaGF2ZSBjaG9zZW4gbm90IHRvIGRvIHNvIGluIG9yZGVyIHRvIGZhY2lsaXRhdGUgcG9ydGluZyBvZiBzd2l0Y2ggc3RhdGVtZW50cyBmcm9tIG90aGVyIGxhbmd1YWdlcy4gIEltcGxpY2l0bHkgYnJlYWtpbmcgdGhlIGNvbnRyb2wgZmxvdyBhdCB0aGUgZW5kIG9mIGEgY2FzZSB3b3VsZCBzaWxlbnRseSBhbHRlciB0aGUgbWVhbmluZyBvZiBwb3J0ZWQgY29kZSB0aGF0IHJlbGllZCBvbiBmYWxsLXRocm91Z2gsIHBvdGVudGlhbGx5IGZvcmNpbmcgdGhlIHByb2dyYW1tZXIgdG8gZGVhbCB3aXRoIHN1YnRsZSBidWdzLiBPdXIgZGVzaWduIGVuc3VyZXMgdGhhdCB0aGUgZGlmZmVyZW5jZSBpcyBpbW1lZGlhdGVseSBicm91Z2h0IHRvIHRoZSBjb2RlcmBzIGF0dGVudGlvbi4gIFRoZSBwcm9ncmFtbWVyIHdpbGwgYmUgbm90aWZpZWQgYXQgY29tcGlsZS10aW1lIGlmIHRoZXkgZm9yZ2V0IHRvIGVuZCBhIGNhc2Ugd2l0aCBhIHN0YXRlbWVudCB0aGF0IHRlcm1pbmF0ZXMgdGhlIHN0cmFpZ2h0LWxpbmUgY29udHJvbCBmbG93LiBXZSBjb3VsZCBtYWtlIHRoaXMgd2FybmluZyBhIGNvbXBpbGUtdGltZSBlcnJvciwgYnV0IHJlZnJhaW4gZnJvbSBkb2luZyBzbyBiZWNhdXNlIGRvIG5vdCB3aXNoIHRvIGZvcmNlIHRoZSBwcm9ncmFtbWVyIHRvIGRlYWwgd2l0aCB0aGlzIGlzc3VlIGltbWVkaWF0ZWx5IHdoaWxlIHBvcnRpbmcgY29kZS4gIElmIGRldmVsb3BlcnMgaWdub3JlIHRoZSB3YXJuaW5nIGFuZCBydW4gdGhlaXIgY29kZSwgYSBydW4gdGltZSBlcnJvciB3aWxsIHByZXZlbnQgdGhlIHByb2dyYW0gZnJvbSBtaXNiZWhhdmluZyBpbiBoYXJkLXRvLWRlYnVnIHdheXMgKGF0IGxlYXN0IHdpdGggcmVzcGVjdCB0byB0aGlzIGlzc3VlKS4KClRoZSBzb3BoaXN0aWNhdGlvbiBvZiB0aGUgYW5hbHlzaXMgb2YgZmFsbC10aHJvdWdoIGlzIGFub3RoZXIgaXNzdWUuIEZvciBub3csIHdlIGhhdmUgb3B0ZWQgZm9yIGEgdmVyeSBzdHJhaWdodGZvcndhcmQgc3ludGFjdGljIHJlcXVpcmVtZW50LiBUaGVyZSBhcmUgb2J2aW91c2x5IHNpdHVhdGlvbnMgd2hlcmUgY29kZSBkb2VzIG5vdCBmYWxsIHRocm91Z2gsIGFuZCB5ZXQgZG9lcyBub3QgY29uZm9ybSB0byB0aGVzZSBzaW1wbGUgcnVsZXMsIGUuZy46Cn0KClxiZWdpbntkYXJ0Q29kZX0KXFNXSVRDSHt9ICh4KSBcewogIFxDQVNFe30gMTogXFRSWXt9IFx7ICRcbGRvdHMkIFxSRVRVUk57fTtcfSBcRklOQUxMWXt9IFx7ICRcbGRvdHMkIFxSRVRVUk57fTtcfQpcfQpcZW5ke2RhcnRDb2RlfQoKXHJhdGlvbmFsZXsKICBWZXJ5IGVsYWJvcmF0ZSBjb2RlIGluIGEgY2FzZSBjbGF1c2UgaXMgcHJvYmFibHkgYmFkIHN0eWxlIGluIGFueSBjYXNlLCBhbmQgc3VjaCBjb2RlIGNhbiBhbHdheXMgYmUgcmVmYWN0b3JlZC4KfQogCiAKXHN1YnNlY3Rpb257IFJldGhyb3d9ClxsYWJlbHtyZXRocm93fQoKClRoZSB7XGVtIHJldGhyb3cgc3RhdGVtZW50fSAgaXMgdXNlZCB0byByZS1yYWlzZSBhbiBleGNlcHRpb24uCgogXGJlZ2lue2dyYW1tYXJ9CntcYmYgcmV0aHJvd1N0YXRlbWVudDp9CiAgICAgXFJFVEhST1d7fQogICAgLgogXGVuZHtncmFtbWFyfQogCkV4ZWN1dGlvbiBvZiBhIFxjb2Rle1xSRVRIUk9Xe319IHN0YXRlbWVudCBwcm9jZWVkcyBhcyBmb2xsb3dzOgpDb250cm9sIGlzIHRyYW5zZmVycmVkIHRvIHRoZSBuZWFyZXN0IGlubmVybW9zdCBlbmNsb3NpbmcgZXhjZXB0aW9uIGhhbmRsZXIgKFxyZWZ7dHJ5fSkuCgpcY29tbWVudGFyeXtObyBjaGFuZ2UgaXMgbWFkZSB0byB0aGUgY3VycmVudCBleGNlcHRpb24ufQoKSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgYSAgXGNvZGV7XFJFVEhST1d7fX0gc3RhdGVtZW50IGlzIG5vdCBlbmNsb3NlZCB3aXRoaW4gYW4gb24tY2F0Y2ggY2xhdXNlLiAKCiVUaGUgc3RhdGljIHR5cGUgb2YgYSByZXRocm93IGV4cHJlc3Npb24gaXMgJFxib3QkLgoKCgpcc3Vic2VjdGlvbnsgVHJ5fQpcbGFiZWx7dHJ5fQoKVGhlIHRyeSBzdGF0ZW1lbnQgc3VwcG9ydHMgdGhlIGRlZmluaXRpb24gb2YgZXhjZXB0aW9uIGhhbmRsaW5nIGNvZGUgaW4gYSBzdHJ1Y3R1cmVkIHdheS4KClxiZWdpbntncmFtbWFyfQp7XGJmIHRyeVN0YXRlbWVudDp9CiAgICAgIFxUUll7fSBibG9jayAob25QYXJ0KyBmaW5hbGx5UGFydD8gJHwkIGZpbmFsbHlQYXJ0KQogICAgLgogICAgCiB7XGJmIG9uUGFydDp9Y2F0Y2hQYXJ0IGJsb2NrOwogICAgXE9Oe30gdHlwZSBjYXRjaFBhcnQ/IGJsb2NrCiAgIC4KCntcYmYgY2F0Y2hQYXJ0On0KICAgICAgXENBVENIe30gYCgnIGlkZW50aWZpZXIgKGAsJyBpZGVudGlmaWVyKT8gYCknIAogICAgLgoKe1xiZiBmaW5hbGx5UGFydDp9CiAgICAgIFxGSU5BTExZe30gYmxvY2sKICAgIC4KIFxlbmR7Z3JhbW1hcn0KIAogQSB0cnkgc3RhdGVtZW50IGNvbnNpc3RzIG9mIGEgYmxvY2sgc3RhdGVtZW50LCBmb2xsb3dlZCBieSBhdCBsZWFzdCBvbmUgb2Y6CiBcYmVnaW57ZW51bWVyYXRlfQogXGl0ZW0KQSBzZXQgb2YgXE9Oe30tXENBVENIe30gY2xhdXNlcywgZWFjaCBvZiB3aGljaCBzcGVjaWZpZXMgIChlaXRoZXIgZXhwbGljaXRseSBvciBpbXBsaWNpdGx5KSB0aGUgdHlwZSBvZiBleGNlcHRpb24gb2JqZWN0IHRvIGJlIGhhbmRsZWQsIG9uZSBvciB0d28gZXhjZXB0aW9uIHBhcmFtZXRlcnMgYW5kIGEgYmxvY2sgc3RhdGVtZW50LgpcaXRlbQpBIFxGSU5BTExZe30gY2xhdXNlLCB3aGljaCBjb25zaXN0cyBvZiBhIGJsb2NrIHN0YXRlbWVudC4gClxlbmR7ZW51bWVyYXRlfQoKXHJhdGlvbmFsZXsKVGhlIHN5bnRheCBpcyBkZXNpZ25lZCB0byBiZSB1cHdhcmQgY29tcGF0aWJsZSB3aXRoIGV4aXN0aW5nIEphdmFzY3JpcHQgcHJvZ3JhbXMuIFRoZSBcT057fSBjbGF1c2UgY2FuIGJlIG9taXR0ZWQsIGxlYXZpbmcgd2hhdCBsb29rcyBsaWtlIGEgSmF2YXNjcmlwdCBjYXRjaCBjbGF1c2UuCn0KCkFuIFxPTnt9LVxDQVRDSHt9IGNsYXVzZSBvZiB0aGUgZm9ybSAgIFxjb2Rle1xPTnt9ICRUJCBcQ0FUQ0h7fSAoJHBfMSwgcF8yJCkgJHMkfSAge1xlbSBtYXRjaGVzfSBhbiBvYmplY3QgJG8kICBpZiB0aGUgdHlwZSBvZiAkbyQgaXMgYSBzdWJ0eXBlIG9mICRUJC4gIElmICRUJCBpcyBhIG1hbGZvcm1lZCBvciBkZWZlcnJlZCB0eXBlICAoXHJlZntzdGF0aWNUeXBlc30pLCB0aGVuIHBlcmZvcm1pbmcgYSBtYXRjaCBjYXVzZXMgYSBydW4gdGltZSBlcnJvci4KClxjb21tZW50YXJ5IHsKSXQgaXMgb2YgY291cnNlIGEgc3RhdGljIHdhcm5pbmcgaWYgJFQkIGlzIGEgZGVmZXJyZWQgb3IgbWFsZm9ybWVkIHR5cGUuCn0KCkFuIFxPTnt9LVxDQVRDSHt9IGNsYXVzZSBvZiB0aGUgZm9ybSAgIFxjb2Rle1xPTnt9ICRUJCBcQ0FUQ0h7fSAoJHBfMSwgcF8yJCkgJHMkfSBpbnRyb2R1Y2VzIGEgbmV3IHNjb3BlICRDUyQgaW4gd2hpY2ggbG9jYWwgdmFyaWFibGVzIHNwZWNpZmllZCBieSAkcF8xJCBhbmQgJHBfMiQgYXJlIGRlZmluZWQuIFRoZSBzdGF0ZW1lbnQgJHMkIGlzIGVuY2xvc2VkIHdpdGhpbiAkQ1MkLgoKCkFuIFxPTnt9LVxDQVRDSHt9IGNsYXVzZSBvZiB0aGUgZm9ybSAgXGNvZGV7XE9Oe30gJFQkIFxDQVRDSHt9ICgkcF8xJCkgJHMkfSBpcyBlcXVpdmFsZW50IHRvIGFuIFxPTnt9LVxDQVRDSHt9IGNsYXVzZSAgXGNvZGV7XE9Oe30gJFQkIFxDQVRDSHt9ICgkcF8xLCBwXzIkKSAkcyR9IHdoZXJlICRwXzIkIGlzIGFuIGlkZW50aWZpZXIgdGhhdCBkb2VzIG5vdCBvY2N1ciBhbnl3aGVyZSBlbHNlIGluIHRoZSBwcm9ncmFtLiAKCgpBbiBcT057fS1cQ0FUQ0h7fSBjbGF1c2Ugb2YgdGhlIGZvcm0gIFxjb2Rle1xDQVRDSHt9ICgkcCQpICRzJH0gaXMgZXF1aXZhbGVudCB0byBhbiBcT057fS1cQ0FUQ0h7fSBjbGF1c2UgIFxjb2Rle1xPTnt9IFxEWU5BTUlDe30gXENBVENIe30gKCRwJCkgJHMkfS4gQW4gXE9Oe30tXENBVENIe30gY2xhdXNlIG9mIHRoZSBmb3JtICBcY29kZXtcQ0FUQ0h7fSAoJHBfMSwgcF8yJCkgJHMkfSBpcyBlcXVpdmFsZW50IHRvIGFuIFxPTnt9LVxDQVRDSHt9IGNsYXVzZSAgXGNvZGV7XE9Oe30gXERZTkFNSUN7fSBcQ0FUQ0h7fSAoJHBfMSwgcF8yJCkgJHMkfQoKCiVJZiBhbiBleHBsaWNpdCB0eXBlIGlzIGFzc29jaWF0ZWQgd2l0aCBvZiAkcF8yJCwgaXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiB0aGF0IHR5cGUgaXMgbm90IFxjb2Rle09iamVjdH0gb3IgXERZTkFNSUN7fS4KClRoZSB7XGVtIGFjdGl2ZSBzdGFjayB0cmFjZX0gaXMgYW4gb2JqZWN0IHdob3NlIFxjb2Rle3RvU3RyaW5nKCl9IG1ldGhvZCBwcm9kdWNlcyBhIHN0cmluZyB0aGF0IGlzIGEgcmVjb3JkIG9mIGV4YWN0bHkgdGhvc2UgZnVuY3Rpb24gYWN0aXZhdGlvbnMgd2l0aGluIHRoZSBjdXJyZW50IGlzb2xhdGUgdGhhdCBoYWQgbm90IGNvbXBsZXRlZCBleGVjdXRpb24gYXQgdGhlIHBvaW50IHdoZXJlIHRoZSBjdXJyZW50IGV4Y2VwdGlvbiB3YXMgdGhyb3duLgolXGJlZ2lue2VudW1lcmF0ZX0KJVxpdGVtIFN0YXJ0ZWQgZXhlY3V0aW9uIGFmdGVyIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIGZ1bmN0aW9uLgolXGl0ZW0gSGFkIG5vdCBjb21wbGV0ZWQgZXhlY3V0aW9uIGF0IHRoZSBwb2ludCB3aGVyZSB0aGUgZXhjZXB0aW9uIGNhdWdodCBieSB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyAgXE9Oe30tXENBVENIe30gY2xhdXNlIHdhcyBpbml0aWFsbHkgdGhyb3duLiAKJVxjb21tZW50YXJ5e1RoZSBhY3RpdmUgc3RhY2sgdHJhY2UgY29udGFpbnMgdGhlIGZyYW1lcyBiZXR3ZWVuIHRoZSBleGNlcHRpb24gaGFuZGxpbmcgY29kZSBhbmQgdGhlIG9yaWdpbmFsIHBvaW50IHdoZW4gYW4gZXhjZXB0aW9uIGlzIHRocm93biwgbm90IHdoZXJlIGl0IHdhcyByZXRocm93bi59CiVcZW5ke2VudW1lcmF0ZX0KCiBcY29tbWVudGFyeXsKVGhpcyBpbXBsaWVzIHRoYXQgbm8gc3ludGhldGljIGZ1bmN0aW9uIGFjdGl2YXRpb25zIG1heSBiZSBhZGRlZCB0byB0aGUgdHJhY2UsIG5vciBtYXkgYW55IHNvdXJjZSBsZXZlbCBhY3RpdmF0aW9ucyBiZSBvbWl0dGVkLiAKVGhpcyBtZWFucywgZm9yIGV4YW1wbGUsIHRoYXQgYW55IGlubGluaW5nIG9mIGZ1bmN0aW9ucyBkb25lIGFzIGFuIG9wdGltaXphdGlvbiBtdXN0IG5vdCBiZSB2aXNpYmxlIGluIHRoZSB0cmFjZS4gU2ltaWxhcmx5LCBhbnkgc3ludGhldGljIHJvdXRpbmVzIHVzZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uIG11c3Qgbm90IGFwcGVhciBpbiB0aGUgdHJhY2UuCgpOb3RoaW5nIGlzIHNhaWQgYWJvdXQgaG93IGFueSBuYXRpdmUgZnVuY3Rpb24gY2FsbHMgbWF5IGJlIHJlcHJlc2VudGVkIGluIHRoZSB0cmFjZS4KIH0KIApcY29tbWVudGFyeXsKTm90ZSB0aGF0IHdlIHNheSBub3RoaW5nIGFib3V0IHRoZSBpZGVudGl0eSBvZiB0aGUgc3RhY2sgdHJhY2UsIG9yIHdoYXQgbm90aW9uIG9mIGVxdWFsaXR5IGlzIGRlZmluZWQgZm9yIHN0YWNrIHRyYWNlcy4KfQogCiUgU2FkbHksIHRoZSBpbmZvIGJlbG93IGNhbm5vdCBiZSBjb21wdXRlZCBlZmZpY2llbnRseS4gSXQgd291bGQgbmVlZCB0byBiZSBjb21wdXRlZCBhdCB0aGUgdGhyb3cgcG9pbnQsIHNpbmNlIGF0IGxhdHRlIHBvaW50cyBpdCBtaWdodCBiZSBkZXN0cm95ZWQuIE5hdGl2ZSBjb2RlIGluIGNhbGxpbmcgZnJhbWVzIGV4ZWN1dGVzIHJlbGF0aXZlIHRvIHRoZSBzdGFjayBwb2ludGVyLCB3aGljaCB0aGVyZWZvcmUgbmVlZHMgdG8gYmUgcmVzZXQgYXMgZWFjaCBmcmFtZSBpcyB1bndvdW5kLiAgVGhpcyBtZWFucyB0aGF0IHRoZQolIE9TIGtlcm5lbCBjYW4gZGlzcG9zZSBvZiB0aGlzIHN0YWNrIG1lbW9yeSAtIGl0IGlzIG5vdCByZWxpYWJseSBwcmVzZXJ2ZWQuIEFuZCBzdWNoIGNvZGUgbXVzdCBleGVjdXRlIGlmIG9ubHkgdG8gdGVzdCBpZiB0aGUgZXhjZXB0aW9uIHNob3VsZCBiZSBjYXVnaHQgb3Igc2VudCBvbndhcmQuCgolIEZvciBlYWNoIHN1Y2ggZnVuY3Rpb24gYWN0aXZhdGlvbiwgdGhlIGFjdGl2ZSBzdGFjayB0cmFjZSBpbmNsdWRlcyB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24sIHRoZSBiaW5kaW5ncyBvZiBhbGwgaXRzIGZvcm1hbCBwYXJhbWV0ZXJzLCBsb2NhbCB2YXJpYWJsZXMgYW5kIFxUSElTe30sIGFuZCB0aGUgcG9zaXRpb24gYXQgd2hpY2ggdGhlIGZ1bmN0aW9uIHdhcyBleGVjdXRpbmcuCiAKICUgSXMgdGhpcyBjb250cm92ZXJzaWFsPyBXZSB3ZXJlIHRoaW5raW5nIG9mIHZpZXdpbmcgdGhlIHRyYWNlIGFzIGEgTGlzdDxJbnZvY2F0aW9uPiwKICUgYnV0IHRoYXQgd29uJ3QgY2FwdHVyZSB0aGUgcmVjZWl2ZXIgb3IgdGhlIGxvY2Fscy4gTW9yZSBnZW5lcmFsbHksIHdlIG5lZWQgYSBzdGFuZGFyZCBpbnRlcmZhY2UgdGhhdCBkZXNjcmliZXMgdGhlc2UgdHJhY2VzLCBzbyBvbmUgY2FuIHR5cGUgdGhlIHN0YWNrIHRyYWNlIHZhcmlhYmxlIGluIHRoZSBjYXRjaC4KIAogXGNvbW1lbnRhcnl7VGhlIHRlcm0gcG9zaXRpb24gc2hvdWxkIG5vdCBiZSBpbnRlcnByZXRlZCBhcyBhIGxpbmUgbnVtYmVyLCBidXQgcmF0aGVyIGFzIGEgcHJlY2lzZSBwb3NpdGlvbiAtIHRoZSBleGFjdCBjaGFyYWN0ZXIgaW5kZXggb2YgdGhlICBleHByZXNzaW9uIHRoYXQgcmFpc2VkICB0aGUgZXhjZXB0aW9uLiB9CiAKICUgQSBwb3NpdGlvbiBjYW4gYmUgcmVwcmVzZW50ZWQgdmlhIGEgVG9rZW4uIElmIHdlIG1ha2UgdGhhdCBwYXJ0IG9mIHRoZSBjb3JlIHJlZmxlY3Rpb24gZmFjaWxpdHksIHdlIGNhbiBzdGF0ZSB0aGlzIGhlcmUuCiAKIFxyYXRpb25hbGV7VGhlIGRlZmluaXRpb24gYmVsb3cgaXMgYW4gYXR0ZW1wdCB0byBjaGFyYWN0ZXJpemUgZXhjZXB0aW9uIGhhbmRsaW5nIHdpdGhvdXQgcmVzb3J0aW5nIHRvIGEgbm9ybWFsL2FicnVwdCBjb21wbGV0aW9uIGZvcm11bGF0aW9uLiBJdCBoYXMgdGhlIGFkdmFudGFnZSB0aGF0IG9uZSBuZWVkIG5vdCBzcGVjaWZ5IGFicnVwdCBjb21wbGV0aW9uIGJlaGF2aW9yIGZvciBldmVyeSBjb21wb3VuZCBzdGF0ZW1lbnQuICBPbiB0aGUgb3RoZXIgaGFuZCwgaXQgaXMgbmV3IGFuZCBkaWZmZXJlbnQgYW5kIG5lZWRzIG1vcmUgdGhvdWdodC4KfQoKJSBzbywgd2UgbmVlZCB0byBmaXggdGhpbmdzIHNvIHRoYXQgcmV0dXJucyBpbiB0aGUgdHJ5IHN0aWxsIGdvIHRocm91Z2ggdGhlIGZpbmFsbHkgY2xhdXNlIGFuZCBzbyB0aGF0CiUgdW5jYXVnaHQgb3IgcmV0aHJvd24gZXhjZXB0aW9ucyBwcm9wYWdhdGUgIGZyb20gdGhlIGZpbmFsbHkgY2xhdXNlIHVubGVzcyBpdCByZXR1cm5zLgoKJSBwbGFuOiByZXR1cm4gdHJhbnNmZXJzIGNvbnRyb2wgdG8gdGhlIGVuY2xvc2luZyBmaW5hbGx5IGNsYXVzZSBpZiBpdCBleGlzdHMgYW5kIGVyYXNlcwolIGFueSBjdXJyZW50IHN0YWNrIHRyYWNlICYgZXhjZXB0aW9uLgolIEJ1dCBob3cgdG8gZW5zdXJlIHJldHVybiBsZWF2ZXMgdGhlIGZpbmFsbHkgaWYgaXQgZG9lcyBub3QgdGhyb3c/IHNwZWNpYWwgdGV4dD8gc2F5IHJldHVybgolIGRvZXMgdGhlIGZpbmFsbHkgYW5kIHRoZW4geGZlcnMgY29udHJvbCA/CgpBIHRyeSBzdGF0ZW1lbnQgXFRSWXt9ICRzXzEkICRvbi1jYXRjaF8xIFxsZG90cyAgb24tY2F0Y2hfbiQgXEZJTkFMTFl7fSAkc19mJCAgZGVmaW5lcyBhbiBleGNlcHRpb24gaGFuZGxlciAkaCQgdGhhdCBleGVjdXRlcyBhcyBmb2xsb3dzOgoKVGhlIFxPTnt9LVxDQVRDSHt9IGNsYXVzZXMgYXJlIGV4YW1pbmVkIGluIG9yZGVyLCBzdGFydGluZyB3aXRoICRjYXRjaF8xJCwgdW50aWwgZWl0aGVyIGFuIFxPTnt9LVxDQVRDSHt9IGNsYXVzZSB0aGF0IG1hdGNoZXMgdGhlIGN1cnJlbnQgZXhjZXB0aW9uIChccmVme3Rocm93fSkgaXMgZm91bmQsIG9yIHRoZSBsaXN0IG9mIFxPTnt9LVxDQVRDSHt9IGNsYXVzZXMgaGFzIGJlZW4gZXhoYXVzdGVkLiBJZiBhbiBcT057fS1cQ0FUQ0h7fSBjbGF1c2UgJG9uLWNhdGNoX2skIGlzIGZvdW5kLCB0aGVuICRwX3trMX0kIGlzIGJvdW5kIHRvIHRoZSBjdXJyZW50IGV4Y2VwdGlvbiwgICRwX3trMn0kLCBpZiBkZWNsYXJlZCwgIGlzIGJvdW5kIHRvIHRoZSBhY3RpdmUgc3RhY2sgdHJhY2UsIGFuZCB0aGVuICRjYXRjaF9rJCBpcyBleGVjdXRlZC4gSWYgbm8gXE9Oe30tXENBVENIe30gY2xhdXNlIGlzIGZvdW5kLCB0aGUgXEZJTkFMTFl7fSBjbGF1c2UgaXMgZXhlY3V0ZWQuIFRoZW4sIGV4ZWN1dGlvbiByZXN1bWVzIGF0IHRoZSBlbmQgb2YgdGhlIHRyeSBzdGF0ZW1lbnQuCgoKQSBmaW5hbGx5IGNsYXVzZSBcRklOQUxMWXt9ICRzJCBkZWZpbmVzIGFuIGV4Y2VwdGlvbiBoYW5kbGVyICRoJCB0aGF0IGV4ZWN1dGVzIGJ5IGV4ZWN1dGluZyB0aGUgZmluYWxseSBjbGF1c2UuIAolIElmIHRoZSBjdXJyZW50IGV4Y2VwdGlvbiBpcyBkZWZpbmVkIAoKVGhlbiwgZXhlY3V0aW9uIHJlc3VtZXMgYXQgdGhlIGVuZCBvZiB0aGUgdHJ5IHN0YXRlbWVudC4KCkV4ZWN1dGlvbiBvZiBhbiBcT057fS1cQ0FUQ0h7fSBjbGF1c2UgXGNvZGV7XE9Oe30gJFQkIFxDQVRDSHt9ICgkcF8xJCwgJHBfMiQpfSAkcyQgb2YgYSB0cnkgc3RhdGVtZW50ICR0JCBwcm9jZWVkcyBhcyBmb2xsb3dzOiBUaGUgc3RhdGVtZW50ICRzJCBpcyBleGVjdXRlZCBpbiB0aGUgZHluYW1pYyBzY29wZSBvZiB0aGUgZXhjZXB0aW9uIGhhbmRsZXIgZGVmaW5lZCBieSB0aGUgZmluYWxseSBjbGF1c2Ugb2YgJHQkLiBUaGVuLCB0aGUgY3VycmVudCBleGNlcHRpb24gYW5kIGFjdGl2ZSBzdGFjayB0cmFjZSBib3RoIGJlY29tZSB1bmRlZmluZWQuCgpFeGVjdXRpb24gb2YgYSBcRklOQUxMWXt9IGNsYXVzZSBcRklOQUxMWXt9ICRzJCBvZiBhIHRyeSBzdGF0ZW1lbnQgcHJvY2VlZHMgYXMgZm9sbG93czogCgpUaGUgc3RhdGVtZW50ICRzJCBpcyBleGVjdXRlZC4gVGhlbiwgaWYgdGhlIGN1cnJlbnQgZXhjZXB0aW9uIGlzIGRlZmluZWQsIGNvbnRyb2wgaXMgdHJhbnNmZXJyZWQgdG8gdGhlIG5lYXJlc3QgZHluYW1pY2FsbHkgZW5jbG9zaW5nIGV4Y2VwdGlvbiBoYW5kbGVyLgoKRXhlY3V0aW9uIG9mIGEgdHJ5IHN0YXRlbWVudCBvZiB0aGUgZm9ybSBcY29kZXtcVFJZe30gJHNfMSQgJG9uLWNhdGNoXzEgXGxkb3RzIG9uLWNhdGNoX24kIFxGSU5BTExZe30gJHNfZiQ7fSAgcHJvY2VlZHMgYXMgZm9sbG93czoKClRoZSBzdGF0ZW1lbnQgJHNfMSQgaXMgZXhlY3V0ZWQgaW4gdGhlIGR5bmFtaWMgc2NvcGUgb2YgdGhlIGV4Y2VwdGlvbiBoYW5kbGVyIGRlZmluZWQgYnkgdGhlIHRyeSBzdGF0ZW1lbnQuIFRoZW4sIHRoZSBcRklOQUxMWXt9IGNsYXVzZSBpcyBleGVjdXRlZC4KClxjb21tZW50YXJ5ewpXaGV0aGVyIGFueSBvZiB0aGUgXE9Oe30tXENBVENIe30gY2xhdXNlcyBpcyBleGVjdXRlZCBkZXBlbmRzIG9uIHdoZXRoZXIgYSBtYXRjaGluZyBleGNlcHRpb24gaGFzIGJlZW4gcmFpc2VkIGJ5ICRzXzEkIChzZWUgdGhlIHNwZWNpZmljYXRpb24gb2YgdGhlIHRocm93IHN0YXRlbWVudCkuIAoKSWYgJHNfMSQgaGFzIHJhaXNlZCBhbiBleGNlcHRpb24sIGl0IHdpbGwgdHJhbnNmZXIgY29udHJvbCB0byB0aGUgdHJ5IHN0YXRlbWVudCdzIGhhbmRsZXIsIHdoaWNoIHdpbGwgZXhhbWluZSB0aGUgY2F0Y2ggY2xhdXNlcyBpbiBvcmRlciBmb3IgYSBtYXRjaCBhcyBzcGVjaWZpZWQgYWJvdmUuIElmIG5vIG1hdGNoZXMgYXJlIGZvdW5kLCB0aGUgaGFuZGxlciB3aWxsIGV4ZWN1dGUgdGhlIFxGSU5BTExZe30gY2xhdXNlLiAKCklmIGEgbWF0Y2hpbmcgXE9Oe30tXENBVENIe30gd2FzIGZvdW5kLCBpdCB3aWxsIGV4ZWN1dGUgZmlyc3QsIGFuZCB0aGVuIHRoZSBcRklOQUxMWXt9IGNsYXVzZSB3aWxsIGJlIGV4ZWN1dGVkLiAKCklmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZHVyaW5nIGV4ZWN1dGlvbiBvZiBhbiBcT057fS1cQ0FUQ0h7fSBjbGF1c2UsIHRoaXMgd2lsbCB0cmFuc2ZlciBjb250cm9sIHRvIHRoZSBoYW5kbGVyIGZvciB0aGUgXEZJTkFMTFl7fSBjbGF1c2UsIGNhdXNpbmcgdGhlIFxGSU5BTExZe30gY2xhdXNlIHRvIGV4ZWN1dGUgaW4gdGhpcyBjYXNlIGFzIHdlbGwuIAoKSWYgbm8gZXhjZXB0aW9uIHdhcyByYWlzZWQsIHRoZSBcRklOQUxMWXt9IGNsYXVzZSBpcyBhbHNvIGV4ZWN1dGVkLiBFeGVjdXRpb24gb2YgdGhlIFxGSU5BTExZe30gY2xhdXNlIGNvdWxkIGFsc28gcmFpc2UgYW4gZXhjZXB0aW9uLCB3aGljaCB3aWxsIGNhdXNlIHRyYW5zZmVyIG9mIGNvbnRyb2wgdG8gdGhlIG5leHQgZW5jbG9zaW5nIGhhbmRsZXIuIAp9CgpBIHRyeSBzdGF0ZW1lbnQgb2YgdGhlIGZvcm0gXGNvZGV7XFRSWXt9ICRzXzEkICRvbi1jYXRjaF8xIFxsZG90cyBvbi1jYXRjaF9uJDt9IGlzIGVxdWl2YWxlbnQgdG8gdGhlIHN0YXRlbWVudCBcY29kZXtcVFJZe30gJHNfMSQgJG9uLWNhdGNoXzEgXGxkb3RzIG9uLWNhdGNoX24kIFxGSU5BTExZe30gJFx7XH0kO30uCiAKClxzdWJzZWN0aW9ueyBSZXR1cm59ClxsYWJlbHtyZXR1cm59CgpUaGUge1xlbSByZXR1cm4gc3RhdGVtZW50fSByZXR1cm5zIGEgcmVzdWx0IHRvIHRoZSBjYWxsZXIgb2YgYSBmdW5jdGlvbi4KCiBcYmVnaW57Z3JhbW1hcn0Ke1xiZiByZXR1cm5TdGF0ZW1lbnQ6fQogICAgXFJFVFVSTnt9IGV4cHJlc3Npb24/ICd7XGVzY2FwZWdyYW1tYXIgO30nICUgY291bGQgZG8gdG9wIGxldmVsIGhlcmUKICAgIC4KIFxlbmR7Z3JhbW1hcn0KICAgIApFeGVjdXRpbmcgYSByZXR1cm4gc3RhdGVtZW50IAoKXGNvZGV7XFJFVFVSTnt9ICRlJDt9CgpmaXJzdCBjYXVzZXMgZXZhbHVhdGlvbiBvZiB0aGUgZXhwcmVzc2lvbiAkZSQsIHByb2R1Y2luZyBhbiBvYmplY3QgJG8kLiBOZXh0LCBjb250cm9sIGlzIHRyYW5zZmVycmVkIHRvIHRoZSBjYWxsZXIgb2YgdGhlIGN1cnJlbnQgZnVuY3Rpb24gYWN0aXZhdGlvbiwgYW5kIHRoZSBvYmplY3QgJG8kIGlzIHByb3ZpZGVkIHRvIHRoZSBjYWxsZXIgYXMgdGhlIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbC4KCkl0IGlzIGEgc3RhdGljIHR5cGUgd2FybmluZyBpZiB0aGUgdHlwZSBvZiAkZSQgbWF5IG5vdCBiZSBhc3NpZ25lZCB0byB0aGUgZGVjbGFyZWQgcmV0dXJuIHR5cGUgb2YgdGhlIGltbWVkaWF0ZWx5IGVuY2xvc2luZyBmdW5jdGlvbi4gCiVJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmIHRoZSBpbW1lZGlhdGVseSBlbmNsb3NpbmcgZnVuY3Rpb24gb2YgYSByZXR1cm4gc3RhdGVtZW50IG9mIHRoZSBmb3JtIFxjb2Rle1xSRVRVUk57fSAkZSQ7fSBpcyBcVk9JRHt9LgoKSW4gY2hlY2tlZCBtb2RlLCBpdCBpcyBhIGR5bmFtaWMgdHlwZSBlcnJvciBpZiAkbyQgaXMgbm90IFxOVUxMe30gYW5kIHRoZSBydW50aW1lIHR5cGUgb2YgJG8kIGlzIG5vdCBhIHN1YnR5cGUgb2YgdGhlIGFjdHVhbCByZXR1cm4gdHlwZSAoXHJlZnthY3R1YWxUeXBlT2ZBRGVjbGFyYXRpb259KSBvZiB0aGUgaW1tZWRpYXRlbHkgZW5jbG9zaW5nIGZ1bmN0aW9uLgoKSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgYSByZXR1cm4gc3RhdGVtZW50IG9mIHRoZSBmb3JtIFxjb2Rle1xSRVRVUk57fSAkZSQ7fSBhcHBlYXJzIGluIGEgZ2VuZXJhdGl2ZSBjb25zdHJ1Y3RvciAoXHJlZntnZW5lcmF0aXZlQ29uc3RydWN0b3JzfSkuCgpccmF0aW9uYWxlewpJdCBpcyBxdWl0ZSBlYXN5IHRvIGZvcmdldCB0byBhZGQgdGhlIGZhY3RvcnkgcHJlZml4IGZvciBhIGNvbnN0cnVjdG9yLCBhY2NpZGVudGFsbHkgY29udmVydGluZyBhIGZhY3RvcnkgaW50byBhIGdlbmVyYXRpdmUgY29uc3RydWN0b3IuIFRoZSBzdGF0aWMgY2hlY2tlciBtYXkgZGV0ZWN0IGEgdHlwZSBtaXNtYXRjaCBpbiBzb21lLCBidXQgbm90IGFsbCwgb2YgdGhlc2UgY2FzZXMuIFRoZSBydWxlIGFib3ZlIGhlbHBzIGNhdGNoIHN1Y2ggZXJyb3JzLCB3aGljaCBjYW4gb3RoZXJ3aXNlIGJlIHZlcnkgaGFyZCB0byByZWNvZ25pemUuIFRoZXJlIGlzIG5vIHJlYWwgZG93bnNpZGUgdG8gaXQsIGFzIHJldHVybmluZyBhIHZhbHVlIGZyb20gYSBnZW5lcmF0aXZlIGNvbnN0cnVjdG9yIGlzIG1lYW5pbmdsZXNzLgp9CgpMZXQgJGYkIGJlIHRoZSBmdW5jdGlvbiBpbW1lZGlhdGVseSBlbmNsb3NpbmcgYSByZXR1cm4gc3RhdGVtZW50IG9mIHRoZSBmb3JtIFxSRVRVUk57fTsgSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiBib3RoIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBob2xkOgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gICRmJCBpcyBub3QgYSBnZW5lcmF0aXZlIGNvbnN0cnVjdG9yLgpcaXRlbSBUaGUgcmV0dXJuIHR5cGUgb2YgJGYkIG1heSBub3QgYmUgYXNzaWduZWQgdG8gXFZPSUR7fS4gClxlbmR7aXRlbWl6ZX0KClxjb21tZW50YXJ5ewpIZW5jZSwgYSBzdGF0aWMgd2FybmluZyB3aWxsIG5vdCBiZSBpc3N1ZWQgaWYgJGYkIGhhcyBubyBkZWNsYXJlZCByZXR1cm4gdHlwZSwgc2luY2UgdGhlIHJldHVybiB0eXBlIHdvdWxkIGJlICBcRFlOQU1JQ3t9IGFuZCAgXERZTkFNSUN7fSBtYXkgYmUgYXNzaWduZWQgdG8gXFZPSUR7fS4gSG93ZXZlciwgYW55IGZ1bmN0aW9uIHRoYXQgZGVjbGFyZXMgYSByZXR1cm4gdHlwZSBtdXN0IHJldHVybiBhbiBleHByZXNzaW9uIGV4cGxpY2l0bHkuCn0KClxyYXRpb25hbGV7VGhpcyBoZWxwcyBjYXRjaCBzaXR1YXRpb25zIHdoZXJlIHVzZXJzIGZvcmdldCB0byByZXR1cm4gYSB2YWx1ZSBpbiBhIHJldHVybiBzdGF0ZW1lbnQufQoKQSByZXR1cm4gc3RhdGVtZW50IG9mIHRoZSBmb3JtIFxjb2Rle1xSRVRVUk57fTt9ICBpcyBleGVjdXRlZCBieSBleGVjdXRpbmcgdGhlIHN0YXRlbWVudCAgXGNvZGV7XFJFVFVSTnt9IFxOVUxMe307fSBpZiBpdCBvY2N1cnMgaW5zaWRlIGEgbWV0aG9kLCBnZXR0ZXIsIHNldHRlciBvciBmYWN0b3J5OyBvdGhlcndpc2UsIHRoZSByZXR1cm4gc3RhdGVtZW50IG5lY2Vzc2FyaWx5IG9jY3VycyBpbnNpZGUgYSBnZW5lcmF0aXZlIGNvbnN0cnVjdG9yLCBpbiB3aGljaCBjYXNlIGl0IGlzIGV4ZWN1dGVkIGJ5IGV4ZWN1dGluZyAgXGNvZGV7XFJFVFVSTnt9IFxUSElTe307fS4KClxjb21tZW50YXJ5e0Rlc3BpdGUgdGhlIGZhY3QgdGhhdCBcY29kZXtcUkVUVVJOe307fSBpcyBleGVjdXRlZCBhcyBpZiBieSBhIFxjb2Rle1xSRVRVUk57fSAkZSQ7fSwgaXQgaXMgaW1wb3J0YW50IHRvIHVuZGVyc3RhbmQgdGhhdCBpdCBpcyBub3QgYSBzdGF0aWMgd2FybmluZyB0byBpbmNsdWRlIGEgc3RhdGVtZW50IG9mIHRoZSBmb3JtIFxjb2Rle1xSRVRVUk57fTt9IAolaW4gYSBcVk9JRHt9IGZ1bmN0aW9uOyBuZWl0aGVyIGlzIGl0IGlsbGVnYWwgCmluIGEgZ2VuZXJhdGl2ZSBjb25zdHJ1Y3Rvci4gVGhlIHJ1bGVzIHJlbGF0ZSBvbmx5IHRvIHRoZSBzcGVjaWZpYyBzeW50YWN0aWMgZm9ybSBcY29kZXtcUkVUVVJOe30gJGUkO30uCn0KCgpccmF0aW9uYWxlewpUaGUgbW90aXZhdGlvbiBmb3IgZm9ybXVsYXRpbmcgXGNvZGV7XFJFVFVSTnt9O30gaW4gdGhpcyB3YXkgc3RlbXMgZnJvbSB0aGUgYmFzaWMgcmVxdWlyZW1lbnQgdGhhdCBhbGwgZnVuY3Rpb24gaW52b2NhdGlvbnMgaW5kZWVkIHJldHVybiBhIHZhbHVlLiBGdW5jdGlvbiBpbnZvY2F0aW9ucyBhcmUgZXhwcmVzc2lvbnMsIGFuZCB3ZSBjYW5ub3QgcmVseSBvbiBhIG1hbmRhdG9yeSB0eXBlY2hlY2tlciB0byBhbHdheXMgcHJvaGliaXQgdXNlIG9mIFxWT0lEe30gZnVuY3Rpb25zIGluIGV4cHJlc3Npb25zLiBIZW5jZSwgYSByZXR1cm4gc3RhdGVtZW50IG11c3QgYWx3YXlzIHJldHVybiBhIHZhbHVlLCBldmVuIGlmIG5vIGV4cHJlc3Npb24gaXMgc3BlY2lmaWVkLgoKVGhlIHF1ZXN0aW9uIHRoZW4gYmVjb21lcywgd2hhdCB2YWx1ZSBzaG91bGQgYSByZXR1cm4gc3RhdGVtZW50IHJldHVybiB3aGVuIG5vIHJldHVybiBleHByZXNzaW9uIGlzIGdpdmVuLiBJbiBhIGdlbmVyYXRpdmUgY29uc3RydWN0b3IsIGl0IGlzIG9idmlvdXNseSB0aGUgb2JqZWN0IGJlaW5nIGNvbnN0cnVjdGVkIChcVEhJU3t9KS4gQSB2b2lkIGZ1bmN0aW9uIGlzIG5vdCBleHBlY3RlZCB0byBwYXJ0aWNpcGF0ZSBpbiBhbiBleHByZXNzaW9uLCB3aGljaCBpcyB3aHkgaXQgaXMgbWFya2VkIFxWT0lEe30gaW4gdGhlIGZpcnN0IHBsYWNlLiBIZW5jZSwgdGhpcyBzaXR1YXRpb24gaXMgYSBtaXN0YWtlIHdoaWNoIHNob3VsZCBiZSBkZXRlY3RlZCBhcyBzb29uIGFzIHBvc3NpYmxlLiBUaGUgc3RhdGljIHJ1bGVzIGhlbHAgaGVyZSwgYnV0IGlmIHRoZSBjb2RlIGlzIGV4ZWN1dGVkLCB1c2luZyBcTlVMTHt9IGxlYWRzIHRvIGZhc3QgZmFpbHVyZSwgd2hpY2ggaXMgZGVzaXJhYmxlIGluIHRoaXMgY2FzZS4gVGhlIHNhbWUgcmF0aW9uYWxlIGFwcGxpZXMgZm9yIGZ1bmN0aW9uIGJvZGllcyB0aGF0IGRvIG5vdCBjb250YWluIGEgcmV0dXJuIHN0YXRlbWVudCBhdCBhbGwuCn0KCkl0IGlzIGEgc3RhdGljIHdhcm5pbmcgaWYgYSBmdW5jdGlvbiBjb250YWlucyBib3RoIG9uZSBvciBtb3JlIGV4cGxpY2l0IHJldHVybiBzdGF0ZW1lbnRzIG9mIHRoZSBmb3JtIFxjb2Rle1xSRVRVUk47fSBhbmQgb25lIG9yIG1vcmUgcmV0dXJuIHN0YXRlbWVudHMgb2YgdGhlIGZvcm0gXGNvZGV7XFJFVFVSTnt9ICRlJDt9LgoKClxzdWJzZWN0aW9ueyBMYWJlbHN9ClxsYWJlbHtsYWJlbHN9CgpBIHtcZW0gbGFiZWx9IGlzIGFuIGlkZW50aWZpZXIgZm9sbG93ZWQgYnkgYSBjb2xvbi4gQSB7XGVtIGxhYmVsZWQgc3RhdGVtZW50fSBpcyBhIHN0YXRlbWVudCBwcmVmaXhlZCBieSBhIGxhYmVsICRMJC4gIEEge1xlbSBsYWJlbGVkIGNhc2UgY2xhdXNlfSBpcyBhIGNhc2UgY2xhdXNlIHdpdGhpbiBhIHN3aXRjaCBzdGF0ZW1lbnQgKFxyZWZ7c3dpdGNofSkgcHJlZml4ZWQgYnkgYSBsYWJlbCAkTCQuCgpccmF0aW9uYWxle1RoZSBzb2xlIHJvbGUgb2YgbGFiZWxzIGlzIHRvIHByb3ZpZGUgdGFyZ2V0cyBmb3IgdGhlIGJyZWFrIChccmVme2JyZWFrfSkgYW5kIGNvbnRpbnVlIChccmVme2NvbnRpbnVlfSkgc3RhdGVtZW50cy59CgolXFF7QXJlIGxhYmVscyBpbiBhIHNlcGFyYXRlIG5hbWVzcGFjZT8gQnVnIDQ5Nzc0Mjk5fSAKCiBcYmVnaW57Z3JhbW1hcn0Ke1xiZiBsYWJlbDp9CiAgICAgIGlkZW50aWZpZXIgJ3tcZXNjYXBlZ3JhbW1hciA6fScKICAgIC4KIFxlbmR7Z3JhbW1hcn0KIAogVGhlIHNlbWFudGljcyBvZiBhIGxhYmVsZWQgc3RhdGVtZW50ICRMOiBzJCBhcmUgaWRlbnRpY2FsIHRvIHRob3NlIG9mIHRoZSBzdGF0ZW1lbnQgJHMkLiBUaGUgbmFtZXNwYWNlIG9mIGxhYmVscyBpcyBkaXN0aW5jdCBmcm9tIHRoZSBvbmUgdXNlZCBmb3IgdHlwZXMsIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzLgoKVGhlIHNjb3BlIG9mIGEgbGFiZWwgdGhhdCBsYWJlbHMgYSBzdGF0ZW1lbnQgJHMkIGlzICRzJC4gVGhlIHNjb3BlIG9mIGEgbGFiZWwgdGhhdCBsYWJlbHMgYSBjYXNlIGNsYXVzZSBvZiBhIHN3aXRjaCBzdGF0ZW1lbnQgJHMkIGlzICRzJC4KClxyYXRpb25hbGV7TGFiZWxzIHNob3VsZCBiZSBhdm9pZGVkIGJ5IHByb2dyYW1tZXJzIGF0IGFsbCBjb3N0cy4gVGhlIG1vdGl2YXRpb24gZm9yIGluY2x1ZGluZyBsYWJlbHMgaW4gdGhlIGxhbmd1YWdlIGlzIHByaW1hcmlseSBtYWtpbmcgRGFydCBhIGJldHRlciB0YXJnZXQgZm9yIGNvZGUgZ2VuZXJhdGlvbi4KfQoKIApcc3Vic2VjdGlvbnsgQnJlYWt9ClxsYWJlbHticmVha30KClRoZSB7XGVtIGJyZWFrIHN0YXRlbWVudH0gY29uc2lzdHMgb2YgdGhlIHJlc2VydmVkIHdvcmQgXEJSRUFLe30gYW5kIGFuIG9wdGlvbmFsIGxhYmVsIChccmVme2xhYmVsc30pLiAKClxiZWdpbntncmFtbWFyfQp7XGJmIGJyZWFrU3RhdGVtZW50On0KICAgICBcQlJFQUt7fSBpZGVudGlmaWVyPyAne1xlc2NhcGVncmFtbWFyIDt9JwogICAgLgogXGVuZHtncmFtbWFyfQogCkxldCAkc19iJCBiZSBhIFxCUkVBS3t9IHN0YXRlbWVudC4gSWYgJHNfYiQgaXMgb2YgdGhlIGZvcm0gIFxjb2Rle1xCUkVBS3t9ICRMJDt9LCB0aGVuIGxldCAkc19FJCBiZSB0aGUgdGhlIGlubmVybW9zdCBsYWJlbGVkIHN0YXRlbWVudCB3aXRoIGxhYmVsICRMJCBlbmNsb3NpbmcgJHNfYiQuIElmICRzX2IkIGlzIG9mIHRoZSBmb3JtIFxjb2Rle1xCUkVBS3t9O30sICB0aGVuIGxldCAkc19FJCBiZSB0aGUgdGhlIGlubmVybW9zdCAgXERPe30gKFxyZWZ7ZG99KSwgXEZPUnt9IChccmVme2Zvcn0pLCBcU1dJVENIe30gKFxyZWZ7c3dpdGNofSkgb3IgXFdISUxFe30gKFxyZWZ7d2hpbGV9KSBzdGF0ZW1lbnQgZW5jbG9zaW5nICAkc19iJC4gSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgbm8gc3VjaCBzdGF0ZW1lbnQgJHNfRSQgZXhpc3RzIHdpdGhpbiB0aGUgaW5uZXJtb3N0IGZ1bmN0aW9uIGluIHdoaWNoICAkc19iJCBvY2N1cnMuICBGdXJ0aGVybW9yZSwgbGV0ICRzXzEsIFxsZG90cywgc19uJCBiZSB0aG9zZSBcVFJZe30gc3RhdGVtZW50cyB0aGF0IGFyZSBib3RoIGVuY2xvc2VkIGluICRzX0UkIGFuZCB0aGF0IGVuY2xvc2UgICRzX2IkLCBhbmQgdGhhdCBoYXZlIGEgXEZJTkFMTFl7fSBjbGF1c2UuIExhc3RseSwgbGV0ICRmX2okIGJlIHRoZSBcRklOQUxMWXt9IGNsYXVzZSBvZiAkc19qLCAxIFxsZSBqIFxsZSBuJC4gICBFeGVjdXRpbmcgICRzX2IkIGZpcnN0IGV4ZWN1dGVzICRmXzEsIFxsZG90cywgIGZfbiQgaW4gaW5uZXJtb3N0LWNsYXVzZS1maXJzdCAgb3JkZXIgYW5kIHRoZW4gdGVybWluYXRlcyAkc19FJC4gCgoKXHN1YnNlY3Rpb257IENvbnRpbnVlfQpcbGFiZWx7Y29udGludWV9CgpUaGUge1xlbSBjb250aW51ZSBzdGF0ZW1lbnR9IGNvbnNpc3RzIG9mIHRoZSByZXNlcnZlZCB3b3JkIFxDT05USU5VRXt9IGFuZCBhbiBvcHRpb25hbCBsYWJlbCAoXHJlZntsYWJlbHN9KS4gCgpcYmVnaW57Z3JhbW1hcn0Ke1xiZiBjb250aW51ZVN0YXRlbWVudDp9CiAgICBcQ09OVElOVUV7fSBpZGVudGlmaWVyPyAne1xlc2NhcGVncmFtbWFyIDt9JwogICAgICAgIC4KIFxlbmR7Z3JhbW1hcn0gICAgICAKIAogTGV0ICRzX2MkIGJlIGEgXENPTlRJTlVFe30gc3RhdGVtZW50LiBJZiAkc19jJCBpcyBvZiB0aGUgZm9ybSAgXGNvZGV7XENPTlRJTlVFe30gJEwkO30sIHRoZW4gbGV0ICRzX0UkIGJlIHRoZSB0aGUgaW5uZXJtb3N0IGxhYmVsZWQgXERPe30gKFxyZWZ7ZG99KSwgXEZPUnt9IChccmVme2Zvcn0pIG9yIFxXSElMRXt9IChccmVme3doaWxlfSkgc3RhdGVtZW50IG9yIGNhc2UgY2xhdXNlIHdpdGggbGFiZWwgJEwkIGVuY2xvc2luZyAkc19jJC4gSWYgJHNfYyQgaXMgb2YgdGhlIGZvcm0gXGNvZGV7XENPTlRJTlVFe307fSAgdGhlbiBsZXQgJHNfRSQgYmUgdGhlIHRoZSBpbm5lcm1vc3QgIFxET3t9IChccmVme2RvfSksIFxGT1J7fSAoXHJlZntmb3J9KSBvciBcV0hJTEV7fSAoXHJlZnt3aGlsZX0pIHN0YXRlbWVudCBlbmNsb3NpbmcgICRzX2MkLiBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBubyBzdWNoIHN0YXRlbWVudCBvciBjYXNlIGNsYXVzZSAkc19FJCBleGlzdHMgd2l0aGluIHRoZSBpbm5lcm1vc3QgZnVuY3Rpb24gaW4gd2hpY2ggICRzX2MkIG9jY3Vycy4gIEZ1cnRoZXJtb3JlLCBsZXQgJHNfMSwgXGxkb3RzLCBzX24kIGJlIHRob3NlIFxUUll7fSBzdGF0ZW1lbnRzIHRoYXQgYXJlIGJvdGggZW5jbG9zZWQgaW4gJHNfRSQgYW5kIHRoYXQgZW5jbG9zZSAgJHNfYyQsIGFuZCB0aGF0IGhhdmUgYSBcRklOQUxMWXt9IGNsYXVzZS4gTGFzdGx5LCBsZXQgJGZfaiQgYmUgdGhlIFxGSU5BTExZe30gY2xhdXNlIG9mICRzX2osIDEgXGxlIGogXGxlIG4kLiAgIEV4ZWN1dGluZyAgJHNfYyQgZmlyc3QgZXhlY3V0ZXMgJGZfMSwgXGxkb3RzLCAgZl9uJCBpbiBpbm5lcm1vc3QtY2xhdXNlLWZpcnN0ICBvcmRlci4gVGhlbiwgaWYgJHNfRSQgaXMgYSBjYXNlIGNsYXVzZSwgY29udHJvbCBpcyB0cmFuc2ZlcnJlZCB0byB0aGUgY2FzZSBjbGF1c2UuIE90aGVyd2lzZSwgJHNfRSQgaXMgbmVjZXNzYXJpbHkgYSBsb29wIGFuZCBleGVjdXRpb24gcmVzdW1lcyBhZnRlciB0aGUgbGFzdCBzdGF0ZW1lbnQgaW4gdGhlIGxvb3AgYm9keS4KIAogXGNvbW1lbnRhcnl7CiBJbiBhIHdoaWxlIGxvb3AsIHRoYXQgd291bGQgYmUgdGhlIGJvb2xlYW4gZXhwcmVzc2lvbiBiZWZvcmUgdGhlIGJvZHkuIEluIGEgZG8gbG9vcCwgaXQgd291bGQgYmUgdGhlIGJvb2xlYW4gZXhwcmVzc2lvbiBhZnRlciB0aGUgYm9keS4gSW4gYSBmb3IgbG9vcCwgaXQgd291bGQgYmUgdGhlIGluY3JlbWVudCBjbGF1c2UuICBJbiBvdGhlciB3b3JkcywgZXhlY3V0aW9uIGNvbnRpbnVlcyB0byB0aGUgbmV4dCBpdGVyYXRpb24gb2YgdGhlIGxvb3AuCiB9CiAKClxzdWJzZWN0aW9ueyBBc3NlcnR9ClxsYWJlbHthc3NlcnR9CgpBbiB7XGVtIGFzc2VydCBzdGF0ZW1lbnR9IGlzIHVzZWQgdG8gZGlzcnVwdCBub3JtYWwgZXhlY3V0aW9uIGlmIGEgZ2l2ZW4gYm9vbGVhbiBjb25kaXRpb24gZG9lcyBub3QgaG9sZC4KClxiZWdpbntncmFtbWFyfQp7XGJmIGFzc2VydFN0YXRlbWVudDp9CiAgIGFzc2VydCAnKCcgY29uZGl0aW9uYWxFeHByZXNzaW9uICcpJyAne1xlc2NhcGVncmFtbWFyIDt9JwogICAgICAuClxlbmR7Z3JhbW1hcn0KICAgICAgClRoZSBhc3NlcnQgc3RhdGVtZW50IGhhcyBubyBlZmZlY3QgaW4gcHJvZHVjdGlvbiBtb2RlLiBJbiBjaGVja2VkIG1vZGUsIGV4ZWN1dGlvbiBvZiBhbiBhc3NlcnQgc3RhdGVtZW50IFxjb2Rle1xBU1NFUlR7fSgkZSQpO30gcHJvY2VlZHMgYXMgZm9sbG93czoKClRoZSBjb25kaXRpb25hbCBleHByZXNzaW9uICRlJCBpcyBldmFsdWF0ZWQgdG8gYW4gb2JqZWN0ICRvJC4gSWYgdGhlIGNsYXNzIG9mICRvJCBpcyBhIHN1YnR5cGUgb2YgXGNvZGV7RnVuY3Rpb259IHRoZW4gbGV0ICRyJCBiZSB0aGUgcmVzdWx0IG9mIGludm9raW5nICRvJCB3aXRoIG5vIGFyZ3VtZW50cy4gT3RoZXJ3aXNlLCBsZXQgJHIkIGJlICRvJC4gCkl0IGlzIGEgZHluYW1pYyB0eXBlIGVycm9yIGlmICRvJCBpcyBub3Qgb2YgdHlwZSBcY29kZXtib29sfSBvciBvZiB0eXBlIFxjb2Rle0Z1bmN0aW9ufSwgb3IgaWYgJHIkIGlzIG5vdCBvZiB0eXBlIFxjb2Rle2Jvb2x9LiAgSWYgJHIkIGlzIFxGQUxTRXt9LCB3ZSBzYXkgdGhhdCB0aGUgYXNzZXJ0aW9uIGZhaWxlZC4gSWYgJHIkIGlzIFxUUlVFe30sIHdlIHNheSB0aGF0IHRoZSBhc3NlcnRpb24gc3VjY2VlZGVkLiBJZiB0aGUgYXNzZXJ0aW9uIHN1Y2NlZWRlZCwgZXhlY3V0aW9uIG9mIHRoZSBhc3NlcnQgc3RhdGVtZW50IGlzIGNvbXBsZXRlLiBJZiB0aGUgYXNzZXJ0aW9uIGZhaWxlZCwgYW4gXGNvZGV7QXNzZXJ0aW9uRXJyb3J9IGlzIHRocm93bi4KCiVcUXtNaWdodCBiZSBjbGVhbmVyIHRvIGRlZmluZSBpdCBhcyBcY29kZXtpZiAoISRlJCkgXHtcVEhST1d7fSBcTkVXe30gQXNzZXJ0aW9uRXJyb3IoKTtcfX0gKGluIGNoZWNrZWQgbW9kZSBvbmx5KS4KJVdoYXQgYWJvdXQgYW4gZXJyb3IgbWVzc2FnZSBhcyBwYXJ0IG9mIHRoZSBhc3NlcnQ/fQoKIEl0IGlzIGEgc3RhdGljIHR5cGUgd2FybmluZyBpZiB0aGUgdHlwZSBvZiAkZSQgbWF5IG5vdCBiZSBhc3NpZ25lZCB0byBlaXRoZXIgIFxjb2Rle2Jvb2x9IG9yICQoKSBccmlnaHRhcnJvdyQgXGNvZGV7Ym9vbH0uICAKClxyYXRpb25hbGV7V2h5IGlzIHRoaXMgYSBzdGF0ZW1lbnQsIG5vdCBhIGJ1aWx0IGluIGZ1bmN0aW9uIGNhbGw/IEJlY2F1c2UgaXQgaXMgaGFuZGxlZCBtYWdpY2FsbHkgc28gaXQgaGFzIG5vIGVmZmVjdCBhbmQgbm8gb3ZlcmhlYWQgaW4gcHJvZHVjdGlvbiBtb2RlLiBBbHNvLCBpbiB0aGUgYWJzZW5jZSBvZiBmaW5hbCBtZXRob2RzLiBvbmUgY291bGQgbm90IHByZXZlbnQgaXQgYmVpbmcgb3ZlcnJpZGRlbiAodGhvdWdoIHRoZXJlIGlzIG5vIHJlYWwgaGFybSBpbiB0aGF0KS4gIEl0IGNhbm5vdCBiZSB2aWV3ZWQgYXMgYSBmdW5jdGlvbiBjYWxsIHRoYXQgaXMgYmVpbmcgb3B0aW1pemVkIGF3YXkgYmVjYXVzZSB0aGUgYXJndW1lbnQgbWlnaHQgaGF2ZSBzaWRlIGVmZmVjdHMuCn0KCiVJZiBhIGxleGljYWxseSB2aXNpYmxlIGRlY2xhcmF0aW9uIG5hbWVkIFxjb2Rle2Fzc2VydH0gaXMgaW4gc2NvcGUsIGFuIGFzc2VydCBzdGF0ZW1lbnQgCiVcY29kZXtcQVNTRVJUe30gKGUpOyB9CiVpcyBpbnRlcnByZXRlZCBhcyBhbiBleHByZXNzaW9uIHN0YXRlbWVudCBcY29kZXsoYXNzZXJ0KGUpKTt9IC4KCiVccmF0aW9uYWxlewolU2luY2UgXEFTU0VSVHt9IGlzIGEgYnVpbHQtaW4gaWRlbnRpZmllciwgb25lIG1pZ2h0IGRlZmluZSBhIGZ1bmN0aW9uIG9yIG1ldGhvZCB3aXRoIHRoaXMgbmFtZS4KJUl0IGlzIGltcG9zc2libGUgdG8gZGlzdGluZ3Vpc2ggYXMgXEFTU0VSVHt9IHN0YXRlbWVudCBmcm9tIGEgbWV0aG9kIGludm9jYXRpb24gaW4gc3VjaCBhIHNpdHVhdGlvbi4gCiVPbmUgY291bGQgY2hvb3NlIHRvIGFsd2F5cyBpbnRlcnByZXQgc3VjaCBjb2RlIGFzIGFuIFxBU1NFUlR7fSBzdGF0ZW1lbnQuIE9yIHdlIGNvdWxkIGNob29zZSB0byBnaXZlIHByaW9yaXR5IHRvIGFueSBsZXhpY2FsbHkgdmlzaWJsZSB1c2VyIGRlZmluZWQgZnVuY3Rpb24uICBUaGUgZm9ybWVyIGNhbiBjYXVzZSByYXRoZXIgcHV6emxpbmcgc2l0dWF0aW9ucywgZS5nLix9CgolXGJlZ2lue2RhcnRDb2RlfQolIGFzc2VydChib29sIGIpXHtwcmludCgnTXkgUGVyc29uYWwgQXNzZXJ0aW9uIFwkYicpO1x9CgolIGFzc2VydFxfcHV6emxlcigpIFx7CiUgICAoYXNzZXJ0KFxUUlVFe30pKTsgLy8gcHJpbnRzIHRydWUKJSAgIGFzc2VydChcVFJVRXt9KTsgLy8gd291bGQgZG8gbm90aGluZwolICAgKGFzc2VydChcRkFMU0V7fSkpOyAvLyBwcmludHMgZmFsc2UKJSAgIGFzc2VydChcRkFMU0V7fSk7IC8vIHdvdWxkIHRocm93IGlmIGFzc2VydHMgZW5hYmxlZCwgb3IgZG8gbm90aGluZyBvdGhlcndpc2UKJSBcfQoKJVxlbmR7ZGFydENvZGV9CgolXHJhdGlvbmFsZXt0aGVyZWZvcmUsIHdlIG9wdCBmb3IgdGhlIHNlY29uZCBvcHRpb24uIEFsdGVybmF0ZWx5LCBvbmUgY291bGQgaW5zaXN0IHRoYXQgYXNzZXJ0IGJlIGEgcmVzZXJ2ZWQgd29yZCwgd2hpY2ggbWF5IGhhdmUgYW4gdW5kZXNpcmFibGUgZWZmZWN0IHdpdGggcmVzcGVjdCB0byBjb21wYXRpYmlsaXR5IG9mIEphdmFzY3JpcHQgY29kZSBwb3J0ZWQgdG8gRGFydC59Cgpcc2VjdGlvbntMaWJyYXJpZXMgYW5kIFNjcmlwdHN9ClxsYWJlbHtsaWJyYXJpZXNBbmRTY3JpcHRzfQoKQSBEYXJ0IHByb2dyYW0gY29uc2lzdHMgb2Ygb25lIG9yIG1vcmUgbGlicmFyaWVzLCBhbmQgbWF5IGJlIGJ1aWx0IG91dCBvZiBvbmUgb3IgbW9yZSB7XGVtIGNvbXBpbGF0aW9uIHVuaXRzfS4gQSBjb21waWxhdGlvbiB1bml0IG1heSBiZSBhIGxpYnJhcnkgb3IgYSBwYXJ0IChccmVme3BhcnRzfSkuIAoKQSBsaWJyYXJ5IGNvbnNpc3RzIG9mIChhIHBvc3NpYmx5IGVtcHR5KSBzZXQgb2YgaW1wb3J0cywgYSBzZXQgb2YgZXhwb3J0cywgIGFuZCBhIHNldCBvZiB0b3AtbGV2ZWwgZGVjbGFyYXRpb25zLiBBIHRvcC1sZXZlbCBkZWNsYXJhdGlvbiBpcyBlaXRoZXIgYSBjbGFzcyAoXHJlZntjbGFzc2VzfSksIGEgdHlwZSBhbGlhcyBkZWNsYXJhdGlvbiAoXHJlZnt0eXBlZGVmfSksIGEgZnVuY3Rpb24gKFxyZWZ7ZnVuY3Rpb25zfSkgb3IgYSB2YXJpYWJsZSBkZWNsYXJhdGlvbiAoXHJlZnt2YXJpYWJsZXN9KS4gVGhlIG1lbWJlcnMgb2YgYSBsaWJyYXJ5ICRMJCBhcmUgdGhvc2UgdG9wIGxldmVsIGRlY2xhcmF0aW9ucyBnaXZlbiB3aXRoaW4gJEwkLgoKIFxiZWdpbntncmFtbWFyfQp7XGJmIHRvcExldmVsRGVmaW5pdGlvbjp9Y2xhc3NEZWZpbml0aW9uOwolICAgICAgY2xhc3NEZWZpbml0aW9uT3JJbnRlcmZhY2VJbmplY3Rpb247CiUgICAgICBpbnRlcmZhY2VEZWZpbml0aW9uT3JJbnRlcmZhY2VJbmplY3Rpb247CiAlICAgICBtaXhpbkFwcGxpY2F0aW9uOwogICAgICB0eXBlQWxpYXM7CiAgICAgIFxFWFRFUk5BTHt9PyBmdW5jdGlvblNpZ25hdHVyZSBge1xlc2NhcGVncmFtbWFyIDt9JzsKICAgICAgXEVYVEVSTkFMe30/IGdldHRlclNpZ25hdHVyZSBge1xlc2NhcGVncmFtbWFyIDt9JzsKICAgICAgXEVYVEVSTkFMe30/IHNldHRlclNpZ25hdHVyZSBge1xlc2NhcGVncmFtbWFyIDt9JzsgICAgICAKICAgICAgZnVuY3Rpb25TaWduYXR1cmUgZnVuY3Rpb25Cb2R5OwogICAgICByZXR1cm5UeXBlPyBcR0VUe30gaWRlbnRpZmllciBmdW5jdGlvbkJvZHk7CiAgICAgIHJldHVyblR5cGU/IFxTRVR7fSBpZGVudGlmaWVyIGZvcm1hbFBhcmFtZXRlckxpc3QgZnVuY3Rpb25Cb2R5OwogICAgICAoXEZJTkFMe30gJHwkIFxDT05TVHt9KSB0eXBlPyBzdGF0aWNGaW5hbERlY2xhcmF0aW9uTGlzdCBge1xlc2NhcGVncmFtbWFyIDt9JzsKICAgICAgdmFyaWFibGVEZWNsYXJhdGlvbiBge1xlc2NhcGVncmFtbWFyIDt9JwogICAgLgogICAgCiAgICB7XGJmIGdldE9yU2V0On0gXEdFVHt9OwogICAgICBcU0VUe30KICAgIC4KCiUgICAgY2xhc3NEZWZpbml0aW9uT3JJbnRlcmZhY2VJbmplY3Rpb246CiAlICAgICBjbGFzc0RlZmluaXRpb247CiAgJSAgICBjbGFzc0ludGVyZmFjZUluamVjdGlvbgogJSAgIC4KCiVpbnRlcmZhY2VEZWZpbml0aW9uT3JJbnRlcmZhY2VJbmplY3Rpb246CiAlICAgICBpbnRlcmZhY2VEZWZpbml0aW9uOwogICAgICUgaW50ZXJmYWNlSW50ZXJmYWNlSW5qZWN0aW9uCiAgJSAgLgoKe1xiZiBsaWJyYXJ5RGVmaW5pdGlvbjp9CiUgICAgICBsaWJyYXJ5ICdceycgbGlicmFyeUJvZHkgJ1x9JwogICAgICBzY3JpcHRUYWc/IGxpYnJhcnlOYW1lPyBpbXBvcnRPckV4cG9ydCogcGFydERpcmVjdGl2ZSogdG9wTGV2ZWxEZWZpbml0aW9uKgogICAgLgogICAgCiAgICB7XGJmICAgICBzY3JpcHRUYWc6fQogICBgXCMhJyB7XGVzY2FwZWdyYW1tYXIgKFx+e31ORVdMSU5FKSp9IE5FV0xJTkUKIC4gICAgCgp7XGJmIGxpYnJhcnlOYW1lOn0KICAgbWV0YWRhdGEgXExJQlJBUll7fSBpZGVudGlmaWVyIChge1xlc2NhcGVncmFtbWFyIC59JyBpZGVudGlmaWVyKSogYHtcZXNjYXBlZ3JhbW1hciA7fScKICAgLgoKe1xiZiBpbXBvcnRPckV4cG9ydDp9bGlicmFyeUltcG9ydCA7CiAgbGlicmFyeUV4cG9ydCAgIAogXGVuZHtncmFtbWFyfQogCiBMaWJyYXJpZXMgbWF5IGJlIHtcZW0gZXhwbGljaXRseSBuYW1lZH0gb3Ige1xlbSBpbXBsaWNpdGx5IG5hbWVkfS4gQW4gZXhwbGljaXRseSBuYW1lZCBsaWJyYXJ5IGJlZ2lucyB3aXRoICB0aGUgIHdvcmQgXExJQlJBUll7fSAocG9zc2libHkgcHJlZmFjZWQgd2l0aCBhbnkgYXBwbGljYWJsZSBtZXRhZGF0YSBhbm5vdGF0aW9ucyksIGZvbGxvd2VkIGJ5IGEgcXVhbGlmaWVkIGlkZW50aWZpZXIgdGhhdCBnaXZlcyB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeS4KIAogXGNvbW1lbnRhcnl7CiBUZWNobmljYWxseSwgZWFjaCBkb3QgYW5kIGlkZW50aWZpZXIgaXMgYSBzZXBhcmF0ZSB0b2tlbiBhbmQgc28gc3BhY2VzIGJldHdlZW4gdGhlbSBhcmUgYWNjZXB0YWJsZS4gSG93ZXZlciwgdGhlIGFjdHVhbCBsaWJyYXJ5IG5hbWUgaXMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIHNpbXBsZSBpZGVudGlmaWVycyBhbmQgZG90cyBhbmQgY29udGFpbnMgbm8gc3BhY2VzLgogfQogCkFuIGltcGxpY2l0bHkgbmFtZWQgbGlicmFyeSBoYXMgdGhlIGVtcHR5IHN0cmluZyBhcyBpdHMgbmFtZS4gCgogXHJhdGlvbmFsZXsKVGhlIG5hbWUgb2YgYSBsaWJyYXJ5IGlzIHVzZWQgdG8gdGllIGl0IHRvIHNlcGFyYXRlbHkgY29tcGlsZWQgcGFydHMgb2YgdGhlIGxpYnJhcnkgKGNhbGxlZCBwYXJ0cykgYW5kICBjYW4gYmUgdXNlZCBmb3IgcHJpbnRpbmcgYW5kLCBtb3JlIGdlbmVyYWxseSwgcmVmbGVjdGlvbi4gVGhlIG5hbWUgbWF5IGJlIHJlbGV2YW50IGZvciBmdXJ0aGVyIGxhbmd1YWdlIGV2b2x1dGlvbi4KIH0KIAogXGNvbW1lbnRhcnl7CkxpYnJhcmllcyBpbnRlbmRlZCBmb3Igd2lkZXNwcmVhZCB1c2Ugc2hvdWxkIGF2b2lkIG5hbWUgY29sbGlzaW9ucy4gIERhcnQncyBcY29kZXtwdWJ9IHBhY2thZ2UgbWFuYWdlbWVudCBzeXN0ZW0gcHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIGRvaW5nIHNvLiAgRWFjaCBwdWIgcGFja2FnZSBpcyBndWFyYW50ZWVkIGEgdW5pcXVlIG5hbWUsIGVmZmVjdGl2ZWx5IGVuZm9yY2luZyBhIGdsb2JhbCBuYW1lc3BhY2UuCiB9CiAKIEEgbGlicmFyeSBtYXkgb3B0aW9uYWxseSBiZWdpbiB3aXRoIGEge1xlbSBzY3JpcHQgdGFnfS4gU2NyaXB0IHRhZ3MgYXJlIGludGVuZGVkIGZvciB1c2Ugd2l0aCBzY3JpcHRzIChccmVme3NjcmlwdHN9KS4gIEEgc2NyaXB0IHRhZyBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSB0aGUgaW50ZXJwcmV0ZXIgb2YgdGhlIHNjcmlwdCB0byB3aGF0ZXZlciBjb21wdXRpbmcgZW52aXJvbm1lbnQgdGhlIHNjcmlwdCBpcyBlbWJlZGRlZCBpbi4gVGhlIHNjcmlwdCB0YWcgbXVzdCBhcHBlYXIgYmVmb3JlIGFueSB3aGl0ZXNwYWNlIG9yIGNvbW1lbnRzLiAgQSBzY3JpcHQgIHRhZyBiZWdpbnMgd2l0aCB0aGUgY2hhcmFjdGVycyBcIyEgYW5kIGVuZHMgYXQgdGhlIGVuZCBvZiB0aGUgbGluZS4gQW55IGNoYXJhY3RlcnMgdGhhdCBmb2xsb3cgXCMhICBpbiB0aGUgc2NyaXB0IHRhZyBhcmUgaWdub3JlZCBieSB0aGUgRGFydCBpbXBsZW1lbnRhdGlvbi4KIApMaWJyYXJpZXMgYXJlIHVuaXRzIG9mIHByaXZhY3kuIEEgcHJpdmF0ZSBkZWNsYXJhdGlvbiBkZWNsYXJlZCB3aXRoaW4gYSBsaWJyYXJ5ICRMJCBjYW4gb25seSBiZSBhY2Nlc3NlZCBieSBjb2RlIHdpdGhpbiAkTCQuIEFueSBhdHRlbXB0IHRvIGFjY2VzcyBhIHByaXZhdGUgbWVtYmVyIGRlY2xhcmF0aW9uIGZyb20gb3V0c2lkZSAkTCQgd2lsbCBjYXVzZSBhIG1ldGhvZCwgZ2V0dGVyIG9yIHNldHRlciBsb29rdXAgZmFpbHVyZS4KClxjb21tZW50YXJ5e1NpbmNlIHRvcCBsZXZlbCBwcml2YXRlcyBhcmUgbm90IGltcG9ydGVkLCB1c2luZyB0aGUgdG9wIGxldmVsIHByaXZhdGVzIG9mIGFub3RoZXIgbGlicmFyeSBpcyBuZXZlciBwb3NzaWJsZS4gfQoKVGhlIHtcZW0gcHVibGljIG5hbWVzcGFjZX0gb2YgbGlicmFyeSAkTCQgaXMgdGhlIG1hcHBpbmcgdGhhdCBtYXBzIHRoZSBzaW1wbGUgbmFtZSBvZiBlYWNoIHB1YmxpYyB0b3AtbGV2ZWwgbWVtYmVyICRtJCBvZiAkTCQgdG8gJG0kLiAKVGhlIHNjb3BlIG9mIGEgbGlicmFyeSAkTCQgY29uc2lzdHMgb2YgdGhlIG5hbWVzIGludHJvZHVjZWQgYnkgYWxsIHRvcC1sZXZlbCBkZWNsYXJhdGlvbnMgZGVjbGFyZWQgaW4gJEwkLCBhbmQgdGhlIG5hbWVzIGFkZGVkIGJ5ICRMJCdzIGltcG9ydHMgKFxyZWZ7aW1wb3J0c30pLgoKClxzdWJzZWN0aW9ue0ltcG9ydHN9ClxsYWJlbHtpbXBvcnRzfQoKQW4ge1xlbSBpbXBvcnR9IHNwZWNpZmllcyBhIGxpYnJhcnkgdG8gYmUgdXNlZCBpbiB0aGUgc2NvcGUgb2YgYW5vdGhlciBsaWJyYXJ5LiAKXGJlZ2lue2dyYW1tYXJ9CntcYmYgbGlicmFyeUltcG9ydDp9CiAgIG1ldGFkYXRhIGltcG9ydFNwZWNpZmljYXRpb24KICAgIC4KIAoge1xiZiBpbXBvcnRTcGVjaWZpY2F0aW9uOn0KICAgIFxJTVBPUlR7fSAgdXJpIChcQVN7fSBpZGVudGlmaWVyKT8gIGNvbWJpbmF0b3IqIGB7XGVzY2FwZWdyYW1tYXIgO30nOwogICAgIFxJTVBPUlR7fSAgdXJpIFxERUZFUlJFRHt9IFxBU3t9IGlkZW50aWZpZXIgIGNvbWJpbmF0b3IqIGB7XGVzY2FwZWdyYW1tYXIgO30nCiAgICAuCiAgICAgICAKe1xiZiBjb21iaW5hdG9yOn1cU0hPV3t9IGlkZW50aWZpZXJMaXN0OwpcSElERXt9IGlkZW50aWZpZXJMaXN0CiAgICAuCiAgICAKICAgIHtcYmYgaWRlbnRpZmllckxpc3Q6fQogICAgICBpZGVudGlmaWVyICgsIGlkZW50aWZpZXIpKgogXGVuZHtncmFtbWFyfQogCgpBbiBpbXBvcnQgc3BlY2lmaWVzIGEgVVJJICR4JCB3aGVyZSB0aGUgZGVjbGFyYXRpb24gb2YgYW4gaW1wb3J0ZWQgbGlicmFyeSBpcyB0byBiZSBmb3VuZC4gCgpJbXBvcnRzIG1heSBiZSB7XGVtIGRlZmVycmVkfSBvciB7XGVtIGltbWVkaWF0ZX0uIEEgZGVmZXJyZWQgaW1wb3J0IGlzIGRpc3Rpbmd1aXNoZWQgYnkgdGhlIGFwcGVhcmFuY2Ugb2YgdGhlIGJ1aWx0LWluIGlkZW50aWZpZXIgXERFRkVSUkVEe30gYWZ0ZXIgdGhlIFVSSS4gQW55IGltcG9ydCB0aGF0IGlzIG5vdCBkZWZlcnJlZCBpcyBpbW1lZGlhdGUuCgpJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiAgdGhlIHNwZWNpZmllZCBVUkkgb2YgYW4gaW1tZWRpYXRlIGltcG9ydCBkb2VzIG5vdCByZWZlciB0byBhIGxpYnJhcnkgZGVjbGFyYXRpb24uICBUaGUgaW50ZXJwcmV0YXRpb24gb2YgVVJJcyBpcyBkZXNjcmliZWQgaW4gc2VjdGlvbiBccmVme3VyaXN9IGJlbG93LgoKSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiB0aGUgc3BlY2lmaWVkIFVSSSBvZiBhIGRlZmVycmVkIGltcG9ydCBkb2VzIG5vdCByZWZlciB0byBhIGxpYnJhcnkgZGVjbGFyYXRpb24uCgpccmF0aW9uYWxlewogT25lIGNhbm5vdCBkZXRlY3QgdGhlIHByb2JsZW0gYXQgY29tcGlsZSB0aW1lIGJlY2F1c2UgY29tcGlsYXRpb24gb2Z0ZW4gb2NjdXJzIGR1cmluZyBleGVjdXRpb24gYW5kICBvbmUgZG9lcyBub3Qga25vdyB3aGF0IHRoZSBVUkkgcmVmZXJzIHRvLiAgSG93ZXZlciB0aGUgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgc2hvdWxkIGRldGVjdCB0aGUgcHJvYmxlbS4KIH0KCiAKVGhlIHtcZW0gY3VycmVudCBsaWJyYXJ5fSBpcyB0aGUgbGlicmFyeSBjdXJyZW50bHkgYmVpbmcgY29tcGlsZWQuIFRoZSBpbXBvcnQgbW9kaWZpZXMgdGhlICBuYW1lc3BhY2Ugb2YgdGhlIGN1cnJlbnQgbGlicmFyeSBpbiBhIG1hbm5lciB0aGF0IGlzIGRldGVybWluZWQgYnkgdGhlIGltcG9ydGVkIGxpYnJhcnkgYW5kIGJ5IHRoZSBvcHRpb25hbCBlbGVtZW50cyBvZiAgdGhlIGltcG9ydC4KICAgICAKQW4gaW1tZWRpYXRlIGltcG9ydCBkaXJlY3RpdmUgJEkkIG1heSBvcHRpb25hbGx5IGluY2x1ZGUgYSBwcmVmaXggY2xhdXNlIG9mIHRoZSBmb3JtIFxBU3t9IFxjb2Rle0lkfSB1c2VkIHRvIHByZWZpeCBuYW1lcyBpbXBvcnRlZCBieSAkSSQuIEEgZGVmZXJyZWQgaW1wb3J0IG11c3QgaW5jbHVkZSBhIHByZWZpeCBjbGF1c2Ugb3IgYSBjb21waWxlIHRpbWUgZXJyb3Igb2NjdXJzLiBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBhIHByZWZpeCB1c2VkIGluIGEgZGVmZXJyZWQgaW1wb3J0IGlzIHVzZWQgaW4gYW5vdGhlciBpbXBvcnQgY2xhdXNlLgoKQW4gaW1wb3J0IGRpcmVjdGl2ZSAkSSQgbWF5IG9wdGlvbmFsbHkgaW5jbHVkZSBhIG5hbWVzcGFjZSBjb21iaW5hdG9yIGNsYXVzZXMgdXNlZCB0byByZXN0cmljdCB0aGUgc2V0IG9mIG5hbWVzIGltcG9ydGVkIGJ5ICRJJC4gQ3VycmVudGx5LCB0d28gbmFtZXNwYWNlIGNvbWJpbmF0b3JzIGFyZSBzdXBwb3J0ZWQ6IFxISURFe30gYW5kIFxTSE9Xe30uCgpMZXQgJEkkIGJlIGFuIGltcG9ydCBkaXJlY3RpdmUgdGhhdCByZWZlcnMgdG8gYSBVUkkgdmlhIHRoZSBzdHJpbmcgJHNfMSQuIEV2YWx1YXRpb24gb2YgJEkkICBwcm9jZWVkcyBhcyBmb2xsb3dzOgoKSWYgJEkkIGlzIGEgZGVmZXJyZWQgaW1wb3J0LCBubyBldmFsdWF0aW9uIHRha2VzIHBsYWNlLiBJbnN0ZWFkLCBhbiBtYXBwaW5nIHRoZSBuYW1lIG9mIHRoZSBwcmVmaXgsICRwJCB0byBhIHtcZW0gZGVmZXJyZWQgcHJlZml4IG9iamVjdH0gaXMgYWRkZWQgdG8gdGhlIHNjb3BlIG9mICRMJC4KVGhlIGRlZmVycmVkIHByZWZpeCBvYmplY3QgaGFzIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKClxiZWdpbntpdGVtaXplfQpcaXRlbSBcY29kZXtsb2FkTGlicmFyeX0uIFRoaXMgbWV0aG9kIHJldHVybnMgYSBmdXR1cmUgJGYkLiBXaGVuIGNhbGxlZCwgdGhlIG1ldGhvZCBjYXVzZXMgYW4gaW1tZWRpYXRlIGltcG9ydCAkSdUkIHRvIGJlIGV4ZWN1dGVkIGF0IHNvbWUgZnV0dXJlIHRpbWUsIHdoZXJlICRJ1SQgaXMgaXMgZGVyaXZlZCBmcm9tICRJJCBieSBlbGlkaW5nIHRoZSB3b3JkIFxERUZFUlJFRHt9IGFuZCBhZGRpbmcgYSBcSElERXt9IFxjb2Rle2xvYWRMaWJyYXJ5fSAgY29tYmluYXRvciBjbGF1c2UuIFdoZW4gJEnVJCBleGVjdXRlcyB3aXRob3V0IGVycm9yLCAkZiQgY29tcGxldGVzIHN1Y2Nlc3NmdWxseS4gSWYgJEnVJCBleGVjdXRlcyB3aXRob3V0IGVycm9yLCB3ZSBzYXkgdGhhdCB0aGUgY2FsbCB0byBcY29kZXtsb2FkTGlicmFyeX0gaGFzIHN1Y2NlZWRlZCwgb3RoZXJ3aXNlIHdlIHNheSB0aGUgY2FsbCBoYXMgZmFpbGVkLgpcaXRlbSAgRm9yIGV2ZXJ5IHRvcCBsZXZlbCBmdW5jdGlvbiAkZiQgbmFtZWQgJGlkJCBpbiAkTCQsIGEgY29ycmVzcG9uZGluZyBtZXRob2QgbmFtZWQgJGlkJCB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZSBhcyAkZiQuIENhbGxpbmcgdGhlIG1ldGhvZCByZXN1bHRzIGluIGEgcnVudGltZSBlcnJvci4KXGl0ZW0gRm9yIGV2ZXJ5IHRvcCBsZXZlbCBnZXR0ZXIgJGckIG5hbWVkICRpZCQgaW4gJEwkLCBhIGNvcnJlc3BvbmRpbmcgZ2V0dGVyIG5hbWVkICRpZCQgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUgYXMgJGckLiAgQ2FsbGluZyB0aGUgbWV0aG9kIHJlc3VsdHMgaW4gYSBydW50aW1lIGVycm9yLgpcaXRlbSBGb3IgZXZlcnkgdG9wIGxldmVsIHNldHRlciAkcyQgbmFtZWQgJGlkJCBpbiAkTCQsIGEgY29ycmVzcG9uZGluZyBzZXR0ZXIgbmFtZWQgJGlkJCB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZSBhcyAkcyQuICBDYWxsaW5nIHRoZSBtZXRob2QgcmVzdWx0cyBpbiBhIHJ1bnRpbWUgZXJyb3IuClxpdGVtIEZvciBldmVyeSB0eXBlICRUJCBuYW1lZCAkaWQkIGluICRMJCwgYSBjb3JyZXNwb25kaW5nIGdldHRlciBuYW1lZCAkaWQkIHdpdGggcmV0dXJuIHR5cGUgXGNvZGV7VHlwZX0uICBDYWxsaW5nIHRoZSBtZXRob2QgcmVzdWx0cyBpbiBhIHJ1bnRpbWUgZXJyb3IuClxlbmR7aXRlbWl6ZX0KCkFmdGVyIGEgY2FsbCBzdWNjZWVkcywgdGhlIG5hbWUgJHAkIGlzIG1hcHBlZCB0byBhIG5vbi1kZWZlcnJlZCBwcmVmaXggb2JqZWN0IGFzIGRlc2NyaWJlZCBiZWxvdy4gSW4gYWRkaXRpb24sIHRoZSBwcmVmaXggb2JqZWN0IGFsc28gc3VwcG9ydHMgdGhlIFxjb2Rle2xvYWRMaWJyYXJ5fSBtZXRob2QsIGFuZCBzbyBpdCBpcyBwb3NzaWJsZSB0byBjYWxsIFxjb2Rle2xvYWRMaWJyYXJ5fSBhZ2Fpbi4gSWYgYSBjYWxsIGZhaWxzLCBub3RoaW5nIGhhcHBlbnMsIGFuZCBvbmUgYWdhaW4gaGFzIHRoZSBvcHRpb24gdG8gY2FsbCBcY29kZXtsb2FkTGlicmFyeX0gYWdhaW4uIFdoZXRoZXIgYSByZXBlYXRlZCBjYWxsIHRvIFxjb2Rle2xvYWRMaWJyYXJ5fSBzdWNjZWVkcyB3aWxsIHZhcnkgYXMgZGVzY3JpYmVkIGJlbG93LgoKVGhlIGVmZmVjdCBvZiBhIHJlcGVhdGVkIGNhbGwgdG8gXGNvZGV7JHAkLmxvYWRMaWJyYXJ5fSBpcyBhcyBmb2xsb3dzOgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0KSWYgYW5vdGhlciBjYWxsIHRvIFxjb2RleyRwJC5sb2FkTGlicmFyeX0gaGFzIGFscmVhZHkgc3VjY2VlZGVkLCB0aGUgcmVwZWF0ZWQgY2FsbCBhbHNvIHN1Y2NlZWRzLiAKT3RoZXJ3aXNlLApcaXRlbQpJZiBhbm90aGVyIGNhbGwgdG8gIHRvIFxjb2RleyRwJC5sb2FkTGlicmFyeX0gaGFzIGZhaWxlZDoKXGJlZ2lue2l0ZW1pemV9ClxpdGVtCklmIHRoZSBmYWlsdXJlIGlzIGR1ZSB0byBhIGNvbXBpbGF0aW9uIGVycm9yLCB0aGUgcmVwZWF0ZWQgY2FsbCBmYWlscyBmb3IgdGhlIHNhbWUgcmVhc29uLgpcaXRlbQpJZiB0aGUgZmFpbHVyZSBpcyBkdWUgdG8gb3RoZXIgY2F1c2VzLCB0aGUgcmVwZWF0ZWQgY2FsbCBiZWhhdmVzIGFzIGlmIG5vIHByZXZpb3VzIGNhbGwgaGFkIGJlZW4gbWFkZS4KXGVuZHtpdGVtaXplfQpcZW5ke2l0ZW1pemV9CgpcY29tbWVudGFyeXsKSW4gb3RoZXIgd29yZHMsIG9uZSBjYW4gcmV0cnkgYSBkZWZlcnJlZCBsb2FkIGFmdGVyIGEgbmV0d29yayBmYWlsdXJlIG9yIGJlY2F1c2UgYSBmaWxlIGlzIGFic2VudCwgYnV0IG9uY2Ugb25lIGZpbmRzIHNvbWUgY29udGVudCBhbmQgbG9hZHMgaXQsIG9uZSBjYW4gbm8gbG9uZ2VyIHJlbG9hZC4KCldlIGRvIG5vdCBzcGVjaWZ5IHdoYXQgdmFsdWUgdGhlIGZ1dHVyZSByZXR1cm5lZCByZXNvbHZlcyB0by4KfQoKSWYgJEkkIGlzIGFuIGltbWVkaWF0ZSBpbXBvcnQgdGhlbiwgZmlyc3QKCiBcYmVnaW57aXRlbWl6ZX0KIFxpdGVtCklmICB0aGUgVVJJIHRoYXQgaXMgdGhlIHZhbHVlIG9mICRzXzEkIGhhcyBub3QgeWV0IGJlZW4gYWNjZXNzZWQgYnkgYW4gaW1wb3J0IG9yIGV4cG9ydCAoXHJlZntleHBvcnRzfSkgZGlyZWN0aXZlICBpbiB0aGUgY3VycmVudCBpc29sYXRlIHRoZW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBVUkkgIGFyZSBjb21waWxlZCB0byB5aWVsZCBhIGxpYnJhcnkgJEIkLiBcY29tbWVudGFyeXtCZWNhdXNlIGxpYnJhcmllcyBtYXkgaGF2ZSBtdXR1YWxseSByZWN1cnNpdmUgaW1wb3J0cywgY2FyZSBtdXN0IGJlIHRha2VuIHRvIGF2b2lkIGFuIGluZmluaXRlIHJlZ3Jlc3MuCn0KXGl0ZW0gT3RoZXJ3aXNlLCB0aGUgY29udGVudHMgb2YgdGhlIFVSSSBkZW5vdGVkIGJ5ICRzXzEkIGhhdmUgYmVlbiBjb21waWxlZCBpbnRvIGEgbGlicmFyeSAkQiQgd2l0aGluIHRoZSBjdXJyZW50IGlzb2xhdGUuClxlbmR7aXRlbWl6ZX0KCgpMZXQgJE5TXzAkIGJlIHRoZSBleHBvcnRlZCBuYW1lc3BhY2UgKFxyZWZ7ZXhwb3J0c30pIG9mICRCJC4gVGhlbiwgZm9yIGVhY2ggY29tYmluYXRvciBjbGF1c2UgJENfaSwgaSBcaW4gMS4ubiQgaW4gJEkkOgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gSWYgJENfaSQgaXMgb2YgdGhlIGZvcm0gCgpcY29kZXtcU0hPV3t9ICRpZF8xLCBcbGRvdHMsIGlkX2skfSAKCnRoZW4gbGV0ICROU19pID0gXFNIT1d7fShbaWRfMSwgXGxkb3RzLCBpZF9rXSwgTlNfe2ktMX0kKQoKd2hlcmUgJHNob3cobCxuKSQgdGFrZXMgYSBsaXN0IG9mIGlkZW50aWZpZXJzICRsJCBhbmQgYSBuYW1lc3BhY2UgJG4kLCBhbmQgcHJvZHVjZXMgYSBuYW1lc3BhY2UgdGhhdCBtYXBzIGVhY2ggbmFtZSBpbiAkbCQgdG8gdGhlIHNhbWUgZWxlbWVudCB0aGF0ICRuJCBkb2VzLiBGdXJ0aGVybW9yZSwgZm9yIGVhY2ggbmFtZSAkeCQgaW4gJGwkLCBpZiAkbiQgZGVmaW5lcyB0aGUgbmFtZSAgJHg9JCB0aGVuIHRoZSBuZXcgbmFtZXNwYWNlIG1hcHMgJHg9JCB0byB0aGUgc2FtZSBlbGVtZW50IHRoYXQgJG4kIGRvZXMuIE90aGVyd2lzZSB0aGUgcmVzdWx0aW5nIG1hcHBpbmcgaXMgdW5kZWZpbmVkLgogIApcaXRlbSBJZiAkQ19pJCBpcyBvZiB0aGUgZm9ybSAKClxjb2Rle1xISURFe30gJGlkXzEsIFxsZG90cywgaWRfayR9IAoKdGhlbiBsZXQgJE5TX2kgPSBcSElERXt9KFtpZF8xLCBcbGRvdHMsIGlkX2tdLCBOU197aS0xfSQpIAoKd2hlcmUgJGhpZGUobCwgbikkIHRha2VzIGEgbGlzdCBvZiBpZGVudGZpZXJzICRsJCBhbmQgYSBuYW1lc3BhY2UgJG4kLCBhbmQgcHJvZHVjZXMgYSBuYW1lc3BhY2UgdGhhdCBpcyBpZGVudGljYWwgdG8gJG4kIGV4Y2VwdCB0aGF0IGZvciBlYWNoIG5hbWUgJGskIGluICRsJCwgJGskIGFuZCAkaz0kIGFyZSB1bmRlZmluZWQuIApcZW5ke2l0ZW1pemV9CiAKTmV4dCwgaWYgJEkkIGluY2x1ZGVzIGEgcHJlZml4IGNsYXVzZSBvZiB0aGUgZm9ybSBcQVN7fSAkcCQsIGxldCAkTlMgPSAgTlNfbiBcY3VwIFx7cDogcHJlZml4T2JqZWN0KE5TX24pXH0kIHdoZXJlICRwcmVmaXhPYmplY3QoTlNfbikkIGlzIGEge1xlbSBwcmVmaXggb2JqZWN0fSBmb3IgdGhlIG5hbWVzcGFjZSAkTlNfbiQsIHdoaWNoIGlzIGFuIG9iamVjdCB0aGF0IGhhcyB0aGUgZm9sbG93aW5nIG1lbWJlcnM6CgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gIEZvciBldmVyeSB0b3AgbGV2ZWwgZnVuY3Rpb24gJGYkIG5hbWVkICRpZCQgaW4gJE5TX24kLCBhIGNvcnJlc3BvbmRpbmcgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgc2lnbmF0dXJlIGFzICRmJCB0aGF0IGZvcndhcmRzICAoXHJlZntmdW5jdGlvbkRlY2xhcmF0aW9uc30pIHRvICRmJC4KXGl0ZW0gRm9yIGV2ZXJ5IHRvcCBsZXZlbCBnZXR0ZXIgIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgc2lnbmF0dXJlIGFzICRnJCBuYW1lZCAkaWQkIGluICROU19uJCwgYSBjb3JyZXNwb25kaW5nIGdldHRlciAgdGhhdCBmb3J3YXJkcyB0byAkZyQuClxpdGVtIEZvciBldmVyeSB0b3AgbGV2ZWwgc2V0dGVyICRzJCAgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZCBzaWduYXR1cmUgYXMgbmFtZWQgJGlkJCBpbiAkTlNfbiQsIGEgY29ycmVzcG9uZGluZyBzZXR0ZXIgIHRoYXQgZm9yd2FyZHMgdG8gICRzJC4KXGl0ZW0gRm9yIGV2ZXJ5IHR5cGUgJFQkIG5hbWVkICRpZCQgaW4gJE5TX24kLCBhIGNvcnJlc3BvbmRpbmcgZ2V0dGVyIG5hbWVkICRpZCQgd2l0aCByZXR1cm4gdHlwZSBcY29kZXtUeXBlfSwgdGhhdCwgd2hlbiBpbnZva2VkLCByZXR1cm5zIHRoZSB0eXBlIG9iamVjdCBmb3IgJFQkLgpcZW5ke2l0ZW1pemV9CgpPdGhlcndpc2UsIGxldCAkTlMgPSBOU19uJC4KSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgdGhlIGN1cnJlbnQgbGlicmFyeSBkZWNsYXJlcyBhIHRvcC1sZXZlbCBtZW1iZXIgbmFtZWQgJHAkLgoKJSBUaGlzIGlzIHByb2JsZW1hdGljLCBiZWNhdXNlIGl0IGltcGxpZXMgdGhhdCBwLlQgd291bGQgYmUgYXZhaWxhYmxlIGV2ZW4gaW4gYSBzY29wZSB0aGF0IGRlY2xhcmVkIHAuIFdlIHJlYWxseSBuZWVkIHRvIHRoaW5rIG9mIHAgYXMgYSBzaW5nbGUgb2JqZWN0IHdpdGggcHJvcGVydGllcyBwLlQgZXRjLiwgZXhjZXB0IGl0IGlzbid0IHJlYWxseSB0aGF0CiUgZWl0aGVyLiBBZnRlciBhbGwsIHAgaXNuJ3QgYWN0dWFsbHkgYXZhaWxhYmxlIGFzIGEgc3RhbmQgYWxvbmUgbmFtZS4KClRoZW4sIGZvciBlYWNoIGVudHJ5IG1hcHBpbmcga2V5ICRrJCB0byBkZWNsYXJhdGlvbiAkZCQgaW4gJE5TJCwgICRkJCBpcyBtYWRlIGF2YWlsYWJsZSBpbiB0aGUgdG9wIGxldmVsIHNjb3BlIG9mICRMJCB1bmRlciB0aGUgbmFtZSAkayQgdW5sZXNzIGVpdGhlcjoKXGJlZ2lue2l0ZW1pemV9ClxpdGVtCmEgdG9wLWxldmVsIGRlY2xhcmF0aW9uIHdpdGggdGhlIG5hbWUgJGskIGV4aXN0cyBpbiAkTCQsIE9SClxpdGVtIGEgcHJlZml4IGNsYXVzZSBvZiB0aGUgZm9ybSAgXEFTe30gJGskIGlzIHVzZWQgaW4gJEwkLgpcZW5ke2l0ZW1pemV9CgpccmF0aW9uYWxle1RoZSBncmVhdGx5IGluY3JlYXNlcyB0aGUgY2hhbmNlIHRoYXQgYSBtZW1iZXIgY2FuIGJlIGFkZGVkIHRvIGEgbGlicmFyeSB3aXRob3V0IGJyZWFraW5nIGl0cyBpbXBvcnRlcnMufQoKQSB7XGVtIHN5c3RlbSBsaWJyYXJ5fSBpcyBhIGxpYnJhcnkgdGhhdCBpcyBwYXJ0IG9mIHRoZSBEYXJ0IGltcGxlbWVudGF0aW9uLiBBbnkgb3RoZXIgbGlicmFyeSBpcyBhIHtcZW0gbm9uLXN5c3RlbSBsaWJyYXJ5fS4gSWYgYSBuYW1lICROJCBpcyByZWZlcmVuY2VkIGJ5IGEgbGlicmFyeSAkTCQgYW5kICROJCB3b3VsZCBiZSBpbnRyb2R1Y2VkIGludG8gdGhlIHRvcCBsZXZlbCBzY29wZSBvZiAkTCQgYnkgCmltcG9ydHMgb2YgdHdvIGxpYnJhcmllcywgJExfMSQgYW5kICRMXzIkLCBhbmQgdGhlIGV4cG9ydGVkIG5hbWVzcGFjZSBvZiAkTF8xJCBiaW5kcyAkTiQgdG8gYSBkZWNsYXJhdGlvbiBvcmlnaW5hdGluZyBpbiBhIHN5c3RlbSBsaWJyYXJ5OgoKJWFuIGltcG9ydCBvZiBhICBzeXN0ZW0gbGlicmFyeSBhbmQgYW4gaW1wb3J0IG9mIGEgbm9uLXN5c3RlbSBsaWJyYXJ5OgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gVGhlIGltcG9ydCBvZiAkTF8xJCBpcyBpbXBsaWNpdGx5IGV4dGVuZGVkIGJ5IGEgXGNvZGV7XEhJREV7fSAkTiR9IGNsYXVzZS4KXGl0ZW0gQSBzdGF0aWMgd2FybmluZyBpcyBpc3N1ZWQuClxlbmR7aXRlbWl6ZX0KClxyYXRpb25hbGUgewpXaGVyZWFzIG5vcm1hbCBjb25mbGljdHMgYXJlIHJlc29sdmVkIGF0IGRlcGxveW1lbnQgdGltZSwgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgXGNvZGV7ZGFydDp9IGxpYnJhcmllcyBpcyBpbmplY3RlZCBpbnRvIGFuIGFwcGxpY2F0aW9uIGF0IHJ1biB0aW1lLCBhbmQgbWF5IHZhcnkgb3ZlciB0aW1lIGFzIGJyb3dzZXJzIGFyZSB1cGdyYWRlZC4gIFRodXMsIGNvbmZsaWN0cyB3aXRoIFxjb2Rle2RhcnQ6fSBsaWJyYXJpZXMgY2FuIGFyaXNlIGF0IHJ1bnRpbWUsIG91dHNpZGUgdGhlIGRldmVsb3BlctVzIGNvbnRyb2wuIFRvIGF2b2lkIGJyZWFraW5nIGRlcGxveWVkIGFwcGxpY2F0aW9ucyBpbiB0aGlzIHdheSwgY29uZmxpY3RzIHdpdGggdGhlIFxjb2Rle2RhcnQ6fSBsaWJyYXJpZXMgYXJlIHRyZWF0ZWQgc3BlY2lhbGx5LgoKSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB0b29scyB0aGF0IGRlcGxveSBEYXJ0IGNvZGUgcHJvZHVjZSBvdXRwdXQgaW4gd2hpY2ggYWxsIGltcG9ydHMgdXNlIHNob3cgY2xhdXNlcyB0byBlbnN1cmUgdGhhdCBhZGRpdGlvbnMgdG8gdGhlIG5hbWVzcGFjZSBvZiBhIGxpYnJhcnkgbmV2ZXIgaW1wYWN0IGRlcGxveWVkIGNvZGUuCn0KCklmIGEgbmFtZSAkTiQgaXMgcmVmZXJlbmNlZCBieSBhIGxpYnJhcnkgJEwkIGFuZCAkTiQgaXMgIGludHJvZHVjZWQgaW50byAgdGhlIHRvcCBsZXZlbCBzY29wZSBvZiAkTCQgYnkgbW9yZSB0aGFuIG9uZSBpbXBvcnQsIGFuZCBub3QgYWxsIHRoZSBpbXBvcnRzIGRlbm90ZSB0aGUgc2FtZSBkZWNsYXJhdGlvbiwgdGhlbjoKXGJlZ2lue2l0ZW1pemV9ClxpdGVtIEEgc3RhdGljIHdhcm5pbmcgb2NjdXJzLgpcaXRlbSBJZiAkTiQgaXMgcmVmZXJlbmNlZCBhcyBhIGZ1bmN0aW9uLCBnZXR0ZXIgb3Igc2V0dGVyLCBhIFxjb2Rle05vU3VjaE1ldGhvZEVycm9yfSBpcyB0aHJvd24uIApcaXRlbSAgSWYgJE4kIGlzIHJlZmVyZW5jZWQgYXMgYSB0eXBlLCBpdCBpcyB0cmVhdGVkIGFzIGEgbWFsZm9ybWVkIHR5cGUuCgpcZW5ke2l0ZW1pemV9CgpXZSBzYXkgdGhhdCB0aGUgbmFtZXNwYWNlICROUyQge1xlbSBoYXMgYmVlbiBpbXBvcnRlZCBpbnRvfSAkTCQuCgpcY29tbWVudGFyeXsKSXQgaXMgbmVpdGhlciBhbiBlcnJvciBub3IgYSB3YXJuaW5nIGlmICAkTiQgaXMgaW50cm9kdWNlZCBieSB0d28gb3IgbW9yZSBpbXBvcnRzIGJ1dCBuZXZlciByZWZlcnJlZCB0by4KfQoKXHJhdGlvbmFsZXsKVGhlIHBvbGljeSBhYm92ZSBtYWtlcyBsaWJyYXJpZXMgbW9yZSByb2J1c3QgaW4gdGhlIGZhY2Ugb2YgYWRkaXRpb25zIG1hZGUgdG8gdGhlaXIgaW1wb3J0cy4gIAoKQSBjbGVhciBkaXN0aW5jdGlvbiBuZWVkcyB0byBiZSBtYWRlIGJldHdlZW4gdGhpcyBhcHByb2FjaCwgYW5kIHNlZW1pbmdseSBzaW1pbGFyIHBvbGljaWVzIHdpdGggcmVzcGVjdCB0byBjbGFzc2VzIG9yIGludGVyZmFjZXMuICBUaGUgdXNlIG9mIGEgY2xhc3Mgb3IgaW50ZXJmYWNlLCBhbmQgb2YgaXRzIG1lbWJlcnMsIGlzIHNlcGFyYXRlIGZyb20gaXRzIGRlY2xhcmF0aW9uLiBUaGUgdXNhZ2UgYW5kIGRlY2xhcmF0aW9uIG1heSBvY2N1ciBpbiB3aWRlbHkgc2VwYXJhdGVkIHBsYWNlcyBpbiB0aGUgY29kZSwgYW5kIG1heSBpbiBmYWN0IGJlIGF1dGhvcmVkIGJ5IGRpZmZlcmVudCBwZW9wbGUgb3Igb3JnYW5pemF0aW9ucy4gIEl0IGlzIGltcG9ydGFudCB0aGF0IGVycm9ycyBhcmUgZ2l2ZW4gYXQgdGhlIG9mZmVuZGluZyBkZWNsYXJhdGlvbiBzbyB0aGF0IHRoZSBwYXJ0eSB0aGF0IHJlY2VpdmVzIHRoZSBlcnJvciBjYW4gcmVzcG9uZCB0byBpdCBhIG1lYW5pbmdmdWwgd2F5LgoKSW4gY29udHJhc3QgYSBsaWJyYXJ5IGNvbXByaXNlcyBib3RoIGltcG9ydHMgYW5kIHRoZWlyIHVzYWdlOyB0aGUgbGlicmFyeSBpcyB1bmRlciB0aGUgY29udHJvbCBvZiBhIHNpbmdsZSBwYXJ0eSBhbmQgc28gYW55IHByb2JsZW0gc3RlbW1pbmcgZnJvbSB0aGUgaW1wb3J0IGNhbiBiZSByZXNvbHZlZCBldmVuIGlmIGl0IGlzIHJlcG9ydGVkIGF0IHRoZSB1c2Ugc2l0ZS4KCiVPbiBhIHJlbGF0ZWQgbm90ZSwgdGhlIHByb3ZlbmFuY2Ugb2YgdGhlIGNvbmZsaWN0aW5nIGVsZW1lbnRzIGlzIG5vdCBjb25zaWRlcmVkLiBBbiAgZWxlbWVudCB0aGF0IGlzIGltcG9ydGVkIHZpYSBkaXN0aW5jdCBwYXRocyBtYXkgY29uZmxpY3Qgd2l0aCBpdHNlbGYuIFRoaXMgYXZvaWRzIHZhcmlhbnRzIG9mIHRoZSB3ZWxsIGtub3duICJkaWFtb25kIiBwcm9ibGVtLgp9CgpJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIHRvIGltcG9ydCB0d28gZGlmZmVyZW50IGxpYnJhcmllcyB3aXRoIHRoZSBzYW1lIG5hbWUuCgpcY29tbWVudGFyeXsKQSB3aWRlbHkgZGlzc2VtaW5hdGVkIGxpYnJhcnkgc2hvdWxkIGJlIGdpdmVuIGEgbmFtZSB0aGF0IHdpbGwgbm90IGNvbmZsaWN0IHdpdGggb3RoZXIgc3VjaCBsaWJyYXJpZXMuIFRoZSBwcmVmZXJyZWQgbWVjaGFuaXNtIGZvciB0aGlzIGlzIHVzaW5nIHB1YiwgdGhlIERhcnQgcGFja2FnZSBtYW5hZ2VyLCB3aGljaCBwcm92aWRlcyBhIGdsb2JhbCBuYW1lc3BhY2UgZm9yIGxpYnJhcmllcywgYW5kIGNvbnZlbnRpb25zIHRoYXQgbGV2ZXJhZ2UgdGhhdCBuYW1lc3BhY2UuCn0KClxjb21tZW50YXJ5e05vdGUgdGhhdCBubyBlcnJvcnMgb3Igd2FybmluZ3MgYXJlIGdpdmVuIGlmIG9uZSBoaWRlcyBvciBzaG93cyBhIG5hbWUgdGhhdCBpcyBub3QgaW4gYSBuYW1lc3BhY2UufQpccmF0aW9uYWxleyAgClRoaXMgcHJldmVudHMgc2l0dWF0aW9ucyB3aGVyZSByZW1vdmluZyBhIG5hbWUgZnJvbSBhIGxpYnJhcnkgd291bGQgY2F1c2UgYnJlYWthZ2Ugb2YgYSBjbGllbnQgbGlicmFyeS4KfQoKVGhlIGRhcnQgY29yZSBsaWJyYXJ5IFxjb2Rle2RhcnQ6Y29yZX0gaXMgaW1wbGljaXRseSBpbXBvcnRlZCBpbnRvIGV2ZXJ5IGRhcnQgbGlicmFyeSBvdGhlciB0aGFuIGl0c2VsZiB2aWEgYW4gIGltcG9ydCBjbGF1c2Ugb2YgdGhlIGZvcm0KClxjb2Rle1xJTVBPUlR7fSAgYGRhcnQ6Y29yZSc7fSAKCnVubGVzcyB0aGUgaW1wb3J0aW5nIGxpYnJhcnkgZXhwbGljaXRseSBpbXBvcnRzIFxjb2Rle2RhcnQ6Y29yZX0uCgpcY29tbWVudGFyeXsKQW55IGltcG9ydCBvZiBcY29kZXtkYXJ0OmNvcmV9LCBldmVuIGlmIHJlc3RyaWN0ZWQgdmlhIFxTSE9Xe30sIFxISURFe30gb3IgXEFTe30sIHByZWVtcHRzIHRoZSBhdXRvbWF0aWMgaW1wb3J0Lgp9CgpccmF0aW9uYWxlewpJdCB3b3VsZCBiZSBuaWNlIGlmIHRoZXJlIHdhcyBub3RoaW5nIHNwZWNpYWwgYWJvdXQgXGNvZGV7ZGFydDpjb3JlfS4gSG93ZXZlciwgaXRzIHVzZSBpcyBwZXJ2YXNpdmUsIHdoaWNoIGxlYWRzIHRvIHRoZSBkZWNpc2lvbiB0byBpbXBvcnQgaXQgYXV0b21hdGljYWxseS4gIEhvd2V2ZXIsIHNvbWUgbGlicmFyeSAkTCQgIG1heSB3aXNoIHRvIGRlZmluZSBlbnRpdGllcyB3aXRoIG5hbWVzIHVzZWQgYnkgXGNvZGV7ZGFydDpjb3JlfSAod2hpY2ggaXQgY2FuIGVhc2lseSBkbywgYXMgdGhlIG5hbWVzIGRlY2xhcmVkIGJ5IGEgbGlicmFyeSB0YWtlIHByZWNlZGVuY2UpLiBPdGhlciBsaWJyYXJpZXMgbWF5IHdpc2ggdG8gdXNlICRMJCBhbmQgbWF5IHdhbnQgdG8gdXNlIG1lbWJlcnMgb2YgJEwkIHRoYXQgY29uZmxpY3Qgd2l0aCB0aGUgY29yZSBsaWJyYXJ5IHdpdGhvdXQgaGF2aW5nIHRvIHVzZSBhIHByZWZpeCBhbmQgd2l0aG91dCBlbmNvdW50ZXJpbmcgd2FybmluZ3MuIFRoZSBhYm92ZSBydWxlIG1ha2VzIHRoaXMgcG9zc2libGUsIGVzc2VudGlhbGx5IGNhbmNlbGluZyBcY29kZXtkYXJ0OmNvcmV9J3Mgc3BlY2lhbCB0cmVhdG1lbnQgYnkgbWVhbnMgb2YgeWV0IGFub3RoZXIgc3BlY2lhbCBydWxlLiAKfQoKXHN1YnNlY3Rpb257RXhwb3J0c30KXGxhYmVse2V4cG9ydHN9CgpBIGxpYnJhcnkgJEwkIGV4cG9ydHMgYSBuYW1lc3BhY2UgKFxyZWZ7c2NvcGluZ30pLCBtZWFuaW5nIHRoYXQgdGhlIGRlY2xhcmF0aW9ucyBpbiB0aGUgbmFtZXNwYWNlIGFyZSBtYWRlIGF2YWlsYWJsZSB0byBvdGhlciBsaWJyYXJpZXMgaWYgdGhleSBjaG9vc2UgdG8gaW1wb3J0ICRMJCAoXHJlZntpbXBvcnRzfSkuICBUaGUgbmFtZXNwYWNlIHRoYXQgJEwkIGV4cG9ydHMgaXMga25vd24gYXMgaXRzIHtcZW0gZXhwb3J0ZWQgbmFtZXNwYWNlfS4KClxiZWdpbntncmFtbWFyfQp7XGJmIGxpYnJhcnlFeHBvcnQ6fQogICBtZXRhZGF0YSBcRVhQT1JUe30gIHVyaSAgY29tYmluYXRvciogYHtcZXNjYXBlZ3JhbW1hciA7fScKICAgIC4KIFxlbmR7Z3JhbW1hcn0KIAogQW4gZXhwb3J0IHNwZWNpZmllcyBhIFVSSSAkeCQgd2hlcmUgdGhlIGRlY2xhcmF0aW9uIG9mIGFuIGV4cG9ydGVkIGxpYnJhcnkgaXMgdG8gYmUgZm91bmQuICBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiAgdGhlIHNwZWNpZmllZCBVUkkgZG9lcyBub3QgcmVmZXIgdG8gYSBsaWJyYXJ5IGRlY2xhcmF0aW9uLiAgCgpXZSBzYXkgdGhhdCBhIG5hbWUge1xlbSBpcyBleHBvcnRlZCBieSBhIGxpYnJhcnl9IChvciBlcXVpdmFsZW50bHksIHRoYXQgYSBsaWJyYXJ5IHtcZW0gZXhwb3J0cyBhIG5hbWV9KSBpZiB0aGUgbmFtZSBpcyBpbiB0aGUgbGlicmFyeSdzIGV4cG9ydGVkIG5hbWVzcGFjZS4gV2Ugc2F5IHRoYXQgYSBkZWNsYXJhdGlvbiB7XGVtIGlzIGV4cG9ydGVkIGJ5IGEgbGlicmFyeX0gKG9yIGVxdWl2YWxlbnRseSwgdGhhdCBhIGxpYnJhcnkge1xlbSBleHBvcnRzIGEgZGVjbGFyYXRpb259KSBpZiB0aGUgZGVjbGFyYXRpb24gaXMgaW4gdGhlIGxpYnJhcnlgcyBleHBvcnRlZCBuYW1lc3BhY2UuCgpBIGxpYnJhcnkgYWx3YXlzIGV4cG9ydHMgYWxsIG5hbWVzIGFuZCBhbGwgZGVjbGFyYXRpb25zIGluIGl0cyBwdWJsaWMgbmFtZXNwYWNlLiBJbiBhZGRpdGlvbiwgYSBsaWJyYXJ5IG1heSBjaG9vc2UgdG8gcmUtZXhwb3J0IGFkZGl0aW9uYWwgbGlicmFyaWVzIHZpYSB7XGVtIGV4cG9ydCBkaXJlY3RpdmVzfSwgb2Z0ZW4gcmVmZXJyZWQgdG8gc2ltcGx5IGFzIHtcZW0gZXhwb3J0c30uCgpMZXQgJEUkIGJlIGFuIGV4cG9ydCBkaXJlY3RpdmUgdGhhdCByZWZlcnMgdG8gYSBVUkkgdmlhIHRoZSBzdHJpbmcgJHNfMSQuIEV2YWx1YXRpb24gb2YgJEUkICBwcm9jZWVkcyBhcyBmb2xsb3dzOgoKRmlyc3QsCgogXGJlZ2lue2l0ZW1pemV9CiBcaXRlbQpJZiAgdGhlIFVSSSB0aGF0IGlzIHRoZSB2YWx1ZSBvZiAkc18xJCBoYXMgbm90IHlldCBiZWVuIGFjY2Vzc2VkIGJ5IGFuIGltcG9ydCBvciBleHBvcnQgZGlyZWN0aXZlICBpbiB0aGUgY3VycmVudCBpc29sYXRlIHRoZW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBVUkkgIGFyZSBjb21waWxlZCB0byB5aWVsZCBhIGxpYnJhcnkgJEIkLgpcaXRlbSBPdGhlcndpc2UsIHRoZSBjb250ZW50cyBvZiB0aGUgVVJJIGRlbm90ZWQgYnkgJHNfMSQgaGF2ZSBiZWVuIGNvbXBpbGVkIGludG8gYSBsaWJyYXJ5ICRCJCB3aXRoaW4gdGhlIGN1cnJlbnQgaXNvbGF0ZS4KXGVuZHtpdGVtaXplfQoKCkxldCAkTlNfMCQgYmUgdGhlIGV4cG9ydGVkIG5hbWVzcGFjZSBvZiAkQiQuIFRoZW4sIGZvciBlYWNoIGNvbWJpbmF0b3IgY2xhdXNlICRDX2ksIGkgXGluIDEuLm4kIGluICRFJDoKXGJlZ2lue2l0ZW1pemV9ClxpdGVtIElmICRDX2kkIGlzIG9mIHRoZSBmb3JtIFxjb2Rle1xTSE9Xe30gJGlkXzEsIFxsZG90cywgaWRfayR9IHRoZW4gbGV0IAoKJE5TX2kgPSBcU0hPV3t9KFtpZF8xLCBcbGRvdHMsIGlkX2tdLCBOU197aS0xfSQpLiAgClxpdGVtIElmICRDX2kkIGlzIG9mIHRoZSBmb3JtIFxjb2Rle1xISURFe30gJGlkXzEsIFxsZG90cywgaWRfayR9IAoKdGhlbiBsZXQgJE5TX2kgPSBcSElERXt9KFtpZF8xLCBcbGRvdHMsIGlkX2tdLCBOU197aS0xfSQpLiAKXGVuZHtpdGVtaXplfQoKRm9yIGVhY2gKZW50cnkgbWFwcGluZyBrZXkgJGskIHRvIGRlY2xhcmF0aW9uICRkJCBpbiAkTlNfbiQgYW4gZW50cnkgbWFwcGluZyAkayQgdG8gJGQkIGlzIGFkZGVkIHRvIHRoZSBleHBvcnRlZCBuYW1lc3BhY2Ugb2YgJEwkIHVubGVzcyBhICB0b3AtbGV2ZWwgZGVjbGFyYXRpb24gd2l0aCB0aGUgbmFtZSAkayQgZXhpc3RzIGluICRMJC4gIAoKSWYgYSBuYW1lICROJCBpcyByZWZlcmVuY2VkIGJ5IGEgbGlicmFyeSAkTCQgYW5kICROJCB3b3VsZCBiZSBpbnRyb2R1Y2VkIGludG8gdGhlIGV4cG9ydGVkIG5hbWVzcGFjZSBvZiAkTCQgYnkgZXhwb3J0cyBvZiB0d28gbGlicmFyaWVzLCAkTF8xJCBhbmQgJExfMiQsIGFuZCB0aGUgZXhwb3J0ZWQgbmFtZXNwYWNlIG9mICRMXzEkIGJpbmRzICROJCB0byBhIGRlY2xhcmF0aW9uIG9yaWdpbmF0aW5nIGluIGEgc3lzdGVtIGxpYnJhcnk6CiVhbiBleHBvcnQgb2YgYSBzeXN0ZW0gbGlicmFyeSBhbmQgYW4gZXhwb3J0IG9mIGEgbm9uLXN5c3RlbSBsaWJyYXJ5OgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gVGhlIGV4cG9ydCBvZiAkTF8xJCBpcyBpbXBsaWNpdGx5IGV4dGVuZGVkIGJ5IGEgXGNvZGV7XEhJREV7fSAkTiR9IGNsYXVzZS4KXGl0ZW0gQSBzdGF0aWMgd2FybmluZyBpcyBpc3N1ZWQuClxlbmR7aXRlbWl6ZX0KClxyYXRpb25hbGV7ClNlZSB0aGUgZGlzY3Vzc2lvbiBpbiBzZWN0aW9uIFxyZWZ7aW1wb3J0c30gZm9yIHRoZSByZWFzb25pbmcgYmVoaW5kIHRoaXMgcnVsZS4KfQoKV2Ugc2F5IHRoYXQgJEwkIHtcZW0gcmUtZXhwb3J0cyBsaWJyYXJ5IH0gJEIkLCBhbmQgYWxzbyB0aGF0ICRMJCB7XGVtIHJlLWV4cG9ydHMgbmFtZXNwYWNlIH0gJE5TX24kLiBXaGVuIG5vIGNvbmZ1c2lvbiBjYW4gYXJpc2UsIHdlIG1heSBzaW1wbHkgc3RhdGUgdGhhdCAkTCQge1xlbSByZS1leHBvcnRzIH0kQiQsIG9yIHRoYXQgJEwkIHtcZW0gcmUtZXhwb3J0cyB9JE5TX24kLgoKSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgYSBuYW1lICROJCBpcyByZS1leHBvcnRlZCBieSBhIGxpYnJhcnkgJEwkIGFuZCAkTiQgaXMgIGludHJvZHVjZWQgaW50byB0aGUgZXhwb3J0IG5hbWVzcGFjZSBvZiAkTCQgYnkgbW9yZSB0aGFuIG9uZSBleHBvcnQsIHVubGVzcyBhbGwgIGV4cG9ydHMgcmVmZXIgdG8gc2FtZSBkZWNsYXJhdGlvbiBmb3IgdGhlIG5hbWUgJE4kLiAgSXQgaXMgYSBzdGF0aWMgd2FybmluZyB0byBleHBvcnQgdHdvIGRpZmZlcmVudCBsaWJyYXJpZXMgd2l0aCB0aGUgc2FtZSBuYW1lLgoKCgpcc3Vic2VjdGlvbntQYXJ0c30KXGxhYmVse3BhcnRzfQoKQSBsaWJyYXJ5IG1heSBiZSBkaXZpZGVkIGludG8ge1xlbSBwYXJ0c30sIGVhY2ggb2Ygd2hpY2ggY2FuIGJlIHN0b3JlZCBpbiBhIHNlcGFyYXRlIGxvY2F0aW9uLiBBIGxpYnJhcnkgaWRlbnRpZmllcyBpdHMgcGFydHMgYnkgbGlzdGluZyB0aGVtIHZpYSBcUEFSVHt9IGRpcmVjdGl2ZXMuIAoKQSB7XGVtIHBhcnQgZGlyZWN0aXZlfSBzcGVjaWZpZXMgYSBVUkkgd2hlcmUgYSBEYXJ0IGNvbXBpbGF0aW9uIHVuaXQgdGhhdCBzaG91bGQgYmUgaW5jb3Jwb3JhdGVkIGludG8gdGhlIGN1cnJlbnQgbGlicmFyeSBtYXkgYmUgZm91bmQuCgpcYmVnaW57Z3JhbW1hcn0Ke1xiZiBwYXJ0RGlyZWN0aXZlOn0KICAgbWV0YWRhdGEgXFBBUlR7fSAgIHVyaSAne1xlc2NhcGVncmFtbWFyIDt9JyAKICAgIC4KCntcYmYgcGFydEhlYWRlcjp9CiAgICAgIG1ldGFkYXRhIFxQQVJUe30gXE9Ge30gaWRlbnRpZmllciAoYHtcZXNjYXBlZ3JhbW1hciAufScgaWRlbnRpZmllcikqIGB7XGVzY2FwZWdyYW1tYXIgO30nCiAgICAuCntcYmYgcGFydERlY2xhcmF0aW9uOn0KICAgICAgcGFydEhlYWRlciB0b3BMZXZlbERlZmluaXRpb24qIEVPRgogICAgLgpcZW5ke2dyYW1tYXJ9CgpBIHtcZW0gcGFydCBoZWFkZXJ9IGJlZ2lucyB3aXRoICBcUEFSVHt9IFxPRnt9ICBmb2xsb3dlZCBieSB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSB0aGUgcGFydCBiZWxvbmdzIHRvLiAgQSBwYXJ0IGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGEgcGFydCBoZWFkZXIgZm9sbG93ZWQgYnkgYSBzZXF1ZW5jZSBvZiB0b3AtbGV2ZWwgZGVjbGFyYXRpb25zLgoKQ29tcGlsaW5nIGEgcGFydCBkaXJlY3RpdmUgb2YgdGhlIGZvcm0gXGNvZGV7XFBBUlR7fSAkcyQ7fSBjYXVzZXMgdGhlIERhcnQgc3lzdGVtIHRvIGF0dGVtcHQgdG8gY29tcGlsZSB0aGUgY29udGVudHMgb2YgdGhlIFVSSSB0aGF0IGlzIHRoZSB2YWx1ZSBvZiAkcyQuIFRoZSB0b3AtbGV2ZWwgZGVjbGFyYXRpb25zIGF0IHRoYXQgVVJJIGFyZSB0aGVuIGNvbXBpbGVkIGJ5IHRoZSBEYXJ0IGNvbXBpbGVyIGluIHRoZSBzY29wZSBvZiB0aGUgY3VycmVudCBsaWJyYXJ5LiBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiB0aGUgY29udGVudHMgb2YgdGhlIFVSSSBhcmUgbm90IGEgdmFsaWQgcGFydCBkZWNsYXJhdGlvbi4gSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiB0aGUgcmVmZXJlbmNlZCBwYXJ0IGRlY2xhcmF0aW9uICRwJCBuYW1lcyBhIGxpYnJhcnkgb3RoZXIgdGhhbiB0aGUgY3VycmVudCBsaWJyYXJ5IGFzIHRoZSBsaWJyYXJ5IHRvIHdoaWNoICRwJCBiZWxvbmdzLgoKXHN1YnNlY3Rpb257U2NyaXB0c30KXGxhYmVse3NjcmlwdHN9CgpBIHtcZW0gc2NyaXB0fSBpcyBhIGxpYnJhcnkgd2hvc2UgZXhwb3J0ZWQgbmFtZXNwYWNlICAoXHJlZntleHBvcnRzfSkgaW5jbHVkZXMgYSB0b3AtbGV2ZWwgZnVuY3Rpb24gXGNvZGV7bWFpbn0uIApBIHNjcmlwdCAkUyQgbWF5IGJlIGV4ZWN1dGVkIGFzIGZvbGxvd3M6CgpGaXJzdCwgJFMkIGlzIGNvbXBpbGVkIGFzIGEgbGlicmFyeSBhcyBzcGVjaWZpZWQgYWJvdmUuIFRoZW4sIHRoZSB0b3AtbGV2ZWwgZnVuY3Rpb24gXGNvZGV7bWFpbn0gdGhhdCBpcyBpbiB0aGUgZXhwb3J0ZWQgbmFtZXNwYWNlIG9mICRTJCBpcyBpbnZva2VkLiBJZiBcY29kZXttYWlufSBoYXMgbm8gcG9zaXRpb25hbCBwYXJhbWV0ZXJzLCBpdCBpcyBpbnZva2VkIHdpdGggbm8gYXJndW1lbnRzLiBPdGhlcndpc2UgaWYgXGNvZGV7bWFpbn0gaGFzIGV4YWN0bHkgb25lIHBvc2l0aW9uYWwgcGFyYW1ldGVyLCBpdCBpcyBpbnZva2VkIHdpdGggYSBzaW5nbGUgYWN0dWFsIGFyZ3VtZW50IHdob3NlIHJ1bnRpbWUgdHlwZSBpbXBsZW1lbnRzIFxjb2Rle0xpc3QkPCRTdHJpbmckPiR9LiAgT3RoZXJ3aXNlIFxjb2Rle21haW59IGlzIGludm9rZWQgd2l0aCB0aGUgZm9sbG93aW5nIHR3byBhY3R1YWwgYXJndW1lbnRzOgpcYmVnaW57ZW51bWVyYXRlfQpcaXRlbSBBbiBvYmplY3Qgd2hvc2UgcnVudGltZSB0eXBlIGltcGxlbWVudHMgXGNvZGV7TGlzdCQ8JFN0cmluZyQ+JH0uClxpdGVtIFRoZSBpbml0aWFsIG1lc3NhZ2Ugb2YgdGhlIGN1cnJlbnQgaXNvbGF0ZSAkaSQgYXMgZGV0ZXJtaW5lZCBieSB0aGUgaW52b2NhdGlvbiBvZiBcY29kZXtJc29sYXRlLnNwYXduVXJpfSB0aGF0IHNwYXduZWQgJGkkLiAKXGVuZHtlbnVtZXJhdGV9CgpJdCBpcyBhIHJ1biB0aW1lIGVycm9yIGlmICRTJCBkb2VzIG5vdCBkZWNsYXJlIG9yIGltcG9ydCBhIHRvcC1sZXZlbCBmdW5jdGlvbiBcY29kZXttYWlufS4gSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiBcY29kZXttYWlufSBoYXMgbW9yZSB0aGFuIHR3byByZXF1aXJlZCBwYXJhbWV0ZXJzLgoKXGNvbW1lbnRhcnkgewpOb3RlIHRoYXQgaWYgXGNvZGV7bWFpbn0gcmVxdWlyZXMgbW9yZSB0aGFuIHR3byBhcmd1bWVudHMsIGEgcnVuIHRpbWUgZXJyb3Igd2lsbCBvY2N1ci4gCn0KClxyYXRpb25hbGV7ClRoZSBuYW1lcyBvZiBzY3JpcHRzIGFyZSBvcHRpb25hbCwgaW4gdGhlIGludGVyZXN0cyBvZiBpbnRlcmFjdGl2ZSwgaW5mb3JtYWwgdXNlLiBIb3dldmVyLCBhbnkgc2NyaXB0IG9mIGxvbmcgdGVybSB2YWx1ZSBzaG91bGQgYmUgZ2l2ZW4gYSBuYW1lIGFzIGEgbWF0dGVyIG9mIGdvb2QgcHJhY3RpY2UuIAp9CgpcY29tbWVudGFyeSB7CkEgRGFydCBwcm9ncmFtIHdpbGwgdHlwaWNhbGx5IGJlIGV4ZWN1dGVkIGJ5IGV4ZWN1dGluZyBhIHNjcmlwdC4KfQoKXHN1YnNlY3Rpb257VVJJc30KXGxhYmVse3VyaXN9CgpVUklzIGFyZSBzcGVjaWZpZWQgYnkgbWVhbnMgb2Ygc3RyaW5nIGxpdGVyYWxzOgoKXGJlZ2lue2dyYW1tYXJ9CntcYmYgdXJpOn0KICAgICAgc3RyaW5nTGl0ZXJhbAogICAgLgpcZW5ke2dyYW1tYXJ9CgpJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiAgdGhlIHN0cmluZyBsaXRlcmFsICR4JCB0aGF0IGRlc2NyaWJlcyBhIFVSSSBpcyBub3QgYSBjb21waWxlLXRpbWUgY29uc3RhbnQsIG9yIGlmICR4JCBpbnZvbHZlcyBzdHJpbmcgaW50ZXJwb2xhdGlvbi4KIApUaGlzIHNwZWNpZmljYXRpb24gZG9lcyBub3QgZGlzY3VzcyB0aGUgaW50ZXJwcmV0YXRpb24gb2YgVVJJcywgd2l0aCB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbnMuIAogCiBccmF0aW9uYWxlewogVGhlIGludGVycHJldGF0aW9uIG9mIFVSSXMgaXMgbW9zdGx5IGxlZnQgdG8gdGhlIHN1cnJvdW5kaW5nIGNvbXB1dGluZyBlbnZpcm9ubWVudC4gRm9yIGV4YW1wbGUsIGlmIERhcnQgaXMgcnVubmluZyBpbiBhIHdlYiBicm93c2VyLCB0aGF0IGJyb3dzZXIgd2lsbCBsaWtlbHkgaW50ZXJwcmV0IHNvbWUgVVJJcy4gV2hpbGUgaXQgbWlnaHQgc2VlbSBhdHRyYWN0aXZlIHRvIHNwZWNpZnksIHNheSwgdGhhdCBVUklzIGFyZSBpbnRlcnByZXRlZCB3aXRoIHJlc3BlY3QgdG8gYSBzdGFuZGFyZCBzdWNoIGFzIElFVEYgUkZDIDM5ODYsIGluIHByYWN0aWNlIHRoaXMgd2lsbCB1c3VhbGx5IGRlcGVuZCBvbiB0aGUgYnJvd3NlciBhbmQgY2Fubm90IGJlIHJlbGllZCB1cG9uLgogfQogCkEgVVJJIG9mIHRoZSBmb3JtIFxjb2Rle2RhcnQ6JHMkfSBpcyBpbnRlcnByZXRlZCBhcyBhIHJlZmVyZW5jZSB0byBhIHN5c3RlbSBsaWJyYXJ5IChccmVme2ltcG9ydHN9KSAkcyQuIAogCkEgVVJJIG9mIHRoZSBmb3JtIFxjb2Rle3BhY2thZ2U6JHMkfSBpcyBpbnRlcnByZXRlZCBhcyBhIFVSSSBvZiB0aGUgZm9ybSBcY29kZXtwYWNrYWdlcy9zfSByZWxhdGl2ZSB0byBhbiBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpZWQgbG9jYXRpb24uCgpcY29tbWVudGFyeXsgClRoaXMgbG9jYXRpb24gd2lsbCBvZnRlbiBiZSB0aGUgbG9jYXRpb24gb2YgdGhlIHJvb3QgbGlicmFyeSBwcmVzZW50ZWQgdG8gdGhlIERhcnQgY29tcGlsZXIuIEhvd2V2ZXIsIGltcGxlbWVudGF0aW9ucyBtYXkgc3VwcGx5IG1lYW5zIHRvIG92ZXJyaWRlIG9yIHJlcGxhY2UgdGhpcyBjaG9pY2UuCn0KClxyYXRpb25hbGV7ClRoZSBpbnRlbnQgaXMgdGhhdCwgZHVyaW5nIGRldmVsb3BtZW50LCBEYXJ0IHByb2dyYW1tZXJzIGNhbiByZWx5IG9uIGEgcGFja2FnZSBtYW5hZ2VyIHRvIGZpbmQgZWxlbWVudHMgb2YgdGhlaXIgcHJvZ3JhbS4gU3VjaCBwYWNrYWdlIG1hbmFnZXJzIG1heSBwcm92aWRlIGEgZGlyZWN0b3J5IHN0cnVjdHVyZSBzdGFydGluZyBhdCBhIGxvY2FsIGRpcmVjdG9yeSBcY29kZXtwYWNrYWdlc30gd2hlcmUgdGhleSBwbGFjZSB0aGUgcmVxdWlyZWQgZGFydCBjb2RlIChvciBsaW5rcyB0aGVyZXRvKS4KfQoKT3RoZXJ3aXNlLCBhbnkgcmVsYXRpdmUgVVJJIGlzIGludGVycHJldGVkIGFzIHJlbGF0aXZlIHRvIHRoZSB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbGlicmFyeS4gQWxsIGZ1cnRoZXIgaW50ZXJwcmV0YXRpb24gb2YgVVJJcyBpcyBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQuIAoKXGNvbW1lbnRhcnl7VGhpcyBtZWFucyBpdCBpcyBkZXBlbmRlbnQgb24gdGhlIGVtYmVkZGVyLn0KCgpcc2VjdGlvbntUeXBlc30KXGxhYmVse3R5cGVzfQoKRGFydCBzdXBwb3J0cyBvcHRpb25hbCB0eXBpbmcgYmFzZWQgb24gaW50ZXJmYWNlIHR5cGVzLgoKXHJhdGlvbmFsZXtUaGUgdHlwZSBzeXN0ZW0gaXMgdW5zb3VuZCwgZHVlIHRvIHRoZSBjb3ZhcmlhbmNlIG9mIGdlbmVyaWMgdHlwZXMuIFRoaXMgaXMgYSBkZWxpYmVyYXRlIGNob2ljZSAoYW5kIHVuZG91YnRlZGx5IGNvbnRyb3ZlcnNpYWwpLiAgRXhwZXJpZW5jZSBoYXMgc2hvd24gdGhhdCBzb3VuZCB0eXBlIHJ1bGVzIGZvciBnZW5lcmljcyBmbHkgaW4gdGhlIGZhY2Ugb2YgcHJvZ3JhbW1lciBpbnR1aXRpb24uIEl0IGlzIGVhc3kgZm9yIHRvb2xzIHRvIHByb3ZpZGUgYSBzb3VuZCB0eXBlIGFuYWx5c2lzIGlmIHRoZXkgY2hvb3NlLCB3aGljaCBtYXkgYmUgdXNlZnVsIGZvciB0YXNrcyBsaWtlIHJlZmFjdG9yaW5nLgp9Cgpcc3Vic2VjdGlvbntTdGF0aWMgVHlwZXN9ClxsYWJlbHtzdGF0aWNUeXBlc30KClN0YXRpYyB0eXBlIGFubm90YXRpb25zIGFyZSB1c2VkIGluIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyAoXHJlZnt2YXJpYWJsZXN9KSAoaW5jbHVkaW5nIGZvcm1hbCBwYXJhbWV0ZXJzIChccmVme2Zvcm1hbFBhcmFtZXRlcnN9KSksIGluIHRoZSByZXR1cm4gdHlwZXMgb2YgZnVuY3Rpb25zIChccmVme2Z1bmN0aW9uc30pIGFuZCBpbiB0aGUgYm91bmRzIG9mIHR5cGUgdmFyaWFibGVzLiAgU3RhdGljIHR5cGUgYW5ub3RhdGlvbnMgYXJlIHVzZWQgZHVyaW5nIHN0YXRpYyAgY2hlY2tpbmcgYW5kIHdoZW4gcnVubmluZyBwcm9ncmFtcyBpbiBjaGVja2VkIG1vZGUuIFRoZXkgaGF2ZSBubyBlZmZlY3Qgd2hhdHNvZXZlciBpbiBwcm9kdWN0aW9uIG1vZGUuCgogXGJlZ2lue2dyYW1tYXJ9CntcYmYgdHlwZTp9CiAgICAgIHR5cGVOYW1lIHR5cGVBcmd1bWVudHM/CiAgICAuCgp7XGJmIHR5cGVOYW1lOn0KICAgICAgcXVhbGlmaWVkIAogICAgLgoKe1xiZiB0eXBlQXJndW1lbnRzOn0KICAgICAgJzwnIHR5cGVMaXN0ICc+JwogICAgLgoKe1xiZiB0eXBlTGlzdDp9CiAgICAgIHR5cGUgKCcsJyB0eXBlKSoKICAgIC4KIFxlbmR7Z3JhbW1hcn0KCkEgRGFydCBpbXBsZW1lbnRhdGlvbiBtdXN0IHByb3ZpZGUgYSBzdGF0aWMgY2hlY2tlciB0aGF0IGRldGVjdHMgYW5kIHJlcG9ydHMgZXhhY3RseSB0aG9zZSBzaXR1YXRpb25zIHRoaXMgc3BlY2lmaWNhdGlvbiBpZGVudGlmaWVzIGFzIHN0YXRpYyB3YXJuaW5ncyBhbmQgb25seSB0aG9zZSBzaXR1YXRpb25zLiBIb3dldmVyOgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gUnVubmluZyAgdGhlIHN0YXRpYyBjaGVja2VyIG9uIGEgcHJvZ3JhbSAkUCQgaXMgbm90IHJlcXVpcmVkIGZvciBjb21waWxpbmcgYW5kIHJ1bm5pbmcgJFAkLiAgClxpdGVtIFJ1bm5pbmcgdGhlIHN0YXRpYyBjaGVja2VyIG9uIGEgcHJvZ3JhbSAkUCQgbXVzdCBub3QgcHJldmVudCBzdWNjZXNzZnVsIGNvbXBpbGF0aW9uIG9mICRQJCBub3IgbWF5IGl0IHByZXZlbnQgdGhlIGV4ZWN1dGlvbiBvZiAkUCQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBhbnkgc3RhdGljIHdhcm5pbmdzIG9jY3VyLgpcZW5ke2l0ZW1pemV9CgpcY29tbWVudGFyeXtOb3RoaW5nIHByZWNsdWRlcyBhZGRpdGlvbmFsIHRvb2xzIHRoYXQgaW1wbGVtZW50IGFsdGVybmF0aXZlIHN0YXRpYyBhbmFseXNlcyAoZS5nLiwgaW50ZXJwcmV0aW5nIHRoZSBleGlzdGluZyB0eXBlIGFubm90YXRpb25zIGluIGEgc291bmQgbWFubmVyIHN1Y2ggYXMgZWl0aGVyIG5vbi12YXJpYW50IGdlbmVyaWNzLCBvciBpbmZlcnJpbmcgZGVjbGFyYXRpb24gYmFzZWQgdmFyaWFuY2UgZnJvbSB0aGUgYWN0dWFsIGRlY2xhcmF0aW9ucykuIEhvd2V2ZXIsIHVzaW5nIHRoZXNlIHRvb2xzIG11c3Qgbm90IHByZWNsdWRlIHN1Y2Nlc3NmdWwgY29tcGlsYXRpb24gYW5kIGV4ZWN1dGlvbiBvZiBEYXJ0IGNvZGUuCn0KCiVcUXtTaG91bGQgd2UgZG8gc29tZXRoaW5nIHdpdGggcmVzcGVjdCB0byBub24tbnVsbGFibGUgdHlwZXM/fQoKQSB0eXBlICRUJCBpcyB7XGVtIG1hbGZvcm1lZH0gaWZmOgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gJFQkIGhhcyB0aGUgZm9ybSAkaWQkIG9yIHRoZSBmb3JtICRwcmVmaXguaWQkLCBhbmQgaW4gdGhlIGVuY2xvc2luZyBsZXhpY2FsIHNjb3BlLCB0aGUgbmFtZSAkaWQkIChyZXNwZWN0aXZlbHkgJHByZWZpeC5pZCQpIGRvZXMgbm90IGRlbm90ZSBhIHR5cGUuClxpdGVtICRUJCBkZW5vdGVzIGEgdHlwZSB2YXJpYWJsZSBpbiB0aGUgZW5jbG9zaW5nIGxleGljYWwgc2NvcGUsIGJ1dCBvY2N1cnMgaW4gdGhlIHNpZ25hdHVyZSBvciBib2R5IG9mIGEgc3RhdGljIG1lbWJlci4KXGl0ZW0gJFQkIGlzIGEgcGFyYW1ldGVyaXplZCB0eXBlIG9mIHRoZSBmb3JtICRHPFNfMSwgXGxkb3RzICwgU19uPiQsIGFuZCAgJEckIGlzIG1hbGZvcm1lZC4gClxpdGVtICRUJCBkZW5vdGVzIGRlY2xhcmF0aW9ucyB0aGF0IHdlcmUgaW1wb3J0ZWQgZnJvbSBtdWx0aXBsZSBpbXBvcnRzIGNsYXVzZXMuCiVFaXRoZXIgJEckIG9yICRTX2ksICBpIFxpbiAxLi4gbiQgYXJlIG1hbGZvcm1lZC4gCiAlIFxpdGVtICAkRyQgaXMgbm90IGEgZ2VuZXJpYyB0eXBlIHdpdGggJG4kIHR5cGUgcGFyYW1ldGVycy4KJSAgXGl0ZW0gTGV0ICRUX2kkIGJlIHRoZSB0eXBlIHBhcmFtZXRlcnMgb2YgJEckIChpZiBhbnkpIGFuZCBsZXQgJEJfaSQgYmUgdGhlIGJvdW5kIG9mICRUX2ksICBpIFxpbiAxLi4gbiQsIGFuZCAkU19pJCBpcyBub3QgYSBzdWJ0eXBlIG9mICRbU18xLCAgXGxkb3RzLCBTX24vVF8xLCBcbGRvdHMsIFRfbl1CX2ksICAgaSBcaW4gMS4uIG4kLiAKJSAgXGVuZHtpdGVtaXplfQpcZW5ke2l0ZW1pemV9CgogQW55IHVzZSBvZiBhIG1hbGZvcm1lZCAgdHlwZSBnaXZlcyByaXNlIHRvIGEgc3RhdGljIHdhcm5pbmcuIEEgbWFsZm9ybWVkIHR5cGUgaXMgdGhlbiBpbnRlcnByZXRlZCBhcyBcRFlOQU1JQ3t9IGJ5IHRoZSBzdGF0aWMgdHlwZSBjaGVja2VyIGFuZCB0aGUgcnVudGltZSB1bmxlc3MgZXhwbGljaXRseSBzcGVjaWZpZWQgb3RoZXJ3aXNlLgogIAogXHJhdGlvbmFsZXsKVGhpcyBlbnN1cmVzIHRoYXQgdGhlIGRldmVsb3BlciBpcyBzcGFyZWQgYSBzZXJpZXMgb2YgY2FzY2FkaW5nIHdhcm5pbmdzIGFzIHRoZSBtYWxmb3JtZWQgdHlwZSBpbnRlcmFjdHMgd2l0aCBvdGhlciB0eXBlcy4KfQoKQSB0eXBlICRUJCBpcyB7XGVtIGRlZmVycmVkfSBpZmYgaXQgaXMgb2YgdGhlIGZvcm0gJHAuVCQgd2hlcmUgJHAkIGlzIGEgZGVmZXJyZWQgcHJlZml4LgpJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIHRvIHVzZSBhIGRlZmVycmVkIHR5cGUgaW4gYSB0eXBlIGFubm90YXRpb24sIHR5cGUgdGVzdCwgdHlwZSBjYXN0IG9yIGFzIGEgdHlwZSBwYXJhbWV0ZXIuIEhvd2V2ZXIsIGFsbCBvdGhlciBzdGF0aWMgd2FybmluZ3MgbXVzdCBiZSBpc3N1ZWQgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCBhbGwgZGVmZXJyZWQgbGlicmFyaWVzIGhhdmUgc3VjY2Vzc2Z1bGx5IGJlZW4gbG9hZGVkLgoKClxzdWJzdWJzZWN0aW9ue1R5cGUgUHJvbW90aW9ufSAgIApcbGFiZWx7dHlwZVByb21vdGlvbn0KClRoZSBzdGF0aWMgdHlwZSBzeXN0ZW0gYXNjcmliZXMgYSBzdGF0aWMgdHlwZSB0byBldmVyeSBleHByZXNzaW9uLiAgSW4gc29tZSBjYXNlcywgdGhlIHR5cGVzIG9mIGxvY2FsIHZhcmlhYmxlcyBhbmQgZm9ybWFsIHBhcmFtZXRlcnMgbWF5IGJlIHByb21vdGVkIGZyb20gdGhlaXIgZGVjbGFyZWQgdHlwZXMgYmFzZWQgb24gY29udHJvbCBmbG93LiAKCldlIHNheSB0aGF0IGEgdmFyaWFibGUgJHYkIGlzIGtub3duIHRvIGhhdmUgdHlwZSAkVCQgd2hlbmV2ZXIgd2UgYWxsb3cgdGhlIHR5cGUgb2YgJHYkIHRvIGJlIHByb21vdGVkLiBUaGUgZXhhY3QgY2lyY3Vtc3RhbmNlcyB3aGVuIHR5cGUgcHJvbW90aW9uIGlzIGFsbG93ZWQgYXJlIGdpdmVuIGluIHRoZSByZWxldmFudCBzZWN0aW9ucyBvZiB0aGUgc3BlY2lmaWNhdGlvbiAoXHJlZntsb2dpY2FsQm9vbGVhbkV4cHJlc3Npb25zfSwgXHJlZntjb25kaXRpb25hbH0gYW5kIFxyZWZ7aWZ9KS4KClR5cGUgcHJvbW90aW9uIGZvciBhIHZhcmlhYmxlICR2JCBpcyBhbGxvd2VkIG9ubHkgd2hlbiB3ZSBjYW4gZGVkdWNlIHRoYXQgc3VjaCBwcm9tb3Rpb24gaXMgdmFsaWQgYmFzZWQgb24gYW4gYW5hbHlzaXMgb2YgY2VydGFpbiBib29sZWFuIGV4cHJlc3Npb25zLiBJbiBzdWNoIGNhc2VzLCB3ZSBzYXkgdGhhdCB0aGUgYm9vbGVhbiBleHByZXNzaW9uICRiJCBzaG93cyB0aGF0ICR2JCBoYXMgdHlwZSAkVCQuIEFzIGEgcnVsZSwgZm9yIGFsbCB2YXJpYWJsZXMgJHYkIGFuZCB0eXBlcyAkVCQsIGEgYm9vbGVhbiBleHByZXNzaW9uIGRvZXMgbm90IHNob3cgdGhhdCAkdiQgaGFzIHR5cGUgJFQkLiBUaG9zZSBzaXR1YXRpb25zIHdoZXJlIGFuIGV4cHJlc3Npb24gZG9lcyBzaG93IHRoYXQgYSB2YXJpYWJsZSBoYXMgYSB0eXBlIGFyZSBtZW50aW9uZWQgZXhwbGljaXRseSBpbiB0aGUgcmVsZXZhbnQgc2VjdGlvbnMgb2YgdGhpcyBzcGVjaWZpY2F0aW9uIChccmVme3R5cGVUZXN0fSBhbmQgXHJlZntsb2dpY2FsQm9vbGVhbkV4cHJlc3Npb25zfSkuCgoKXHN1YnNlY3Rpb257RHluYW1pYyBUeXBlIFN5c3RlbX0KXGxhYmVse2R5bmFtaWNUeXBlU3lzdGVtfQoKQSBEYXJ0IGltcGxlbWVudGF0aW9uIG11c3Qgc3VwcG9ydCBleGVjdXRpb24gaW4gYm90aCB7XGVtIHByb2R1Y3Rpb24gbW9kZX0gYW5kIHtcZW0gY2hlY2tlZCBtb2RlfS4gIFRob3NlIGR5bmFtaWMgY2hlY2tzIHNwZWNpZmllZCBhcyBvY2N1cnJpbmcgc3BlY2lmaWNhbGx5IGluIGNoZWNrZWQgbW9kZSBtdXN0IGJlIHBlcmZvcm1lZCBpZmYgdGhlIGNvZGUgaXMgZXhlY3V0ZWQgaW4gY2hlY2tlZCBtb2RlLgoKXGNvbW1lbnRhcnl7Ck5vdGUgdGhhdCB0aGlzIGlzIHRoZSBjYXNlIGV2ZW4gaWYgdGhlIGRlZmVycmVkIHR5cGUgYmVsb25ncyB0byBhIHByZWZpeCB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkLiBUaGlzIGlzIHJlZ3JldHRhYmxlLCBzaW5jZSBpdCBzdHJvbmdseSBkaXNjb3VyYWdlcyB0aGUgdXNlIG9mIHR5cGUgYW5ub3RhdGlvbnMgdGhhdCBpbnZvbHZlIGRlZmVycmVkIHR5cGVzIGJlY2F1c2UgRGFydCBwcm9ncmFtbWVycyB1c2UgY2hlY2tlZCBtb2RlIG11Y2ggb2YgdGhlIHRpbWUuCgpJbiBwcmFjdGljZSwgbWFueSBzY2VuYXJpb3MgaW52b2x2aW5nIGRlZmVycmVkIGxvYWRpbmcgaW52b2x2ZSBkZWZlcnJlZCBsb2FkaW5nIG9mIGNsYXNzZXMgdGhhdCBpbXBsZW1lbnQgZWFnZXJseSBsb2FkZWQgaW50ZXJmYWNlcywgc28gdGhlIHNpdHVhdGlvbiBpcyBvZnRlbiBsZXNzIG9uZXJvdXMgdGhhbiBpdCBzZWVtcy4gVGhlIGN1cnJlbnQgc2VtYW50aWNzIHdlcmUgYWRvcHRlZCBiYXNlZCBvbiBjb25zaWRlcmF0aW9ucyBvZiBlYXNlIG9mIGltcGxlbWVudGF0aW9uLgoKQ2xlYXJseSwgaWYgYSBkZWZlcnJlZCB0eXBlIGhhcyBub3QgeWV0IGJlZW4gbG9hZGVkLCBpdCBpcyBpbXBvc3NpYmxlIHRvIGRvIGEgY29ycmVjdCBzdWJ0eXBlIHRlc3QgaW52b2x2aW5nIGl0LCBhbmQgb25lIHdvdWxkIGV4cGVjdCBhIGR5bmFtaWMgZmFpbHVyZSwgYXMgaXMgdGhlIGNhc2Ugd2l0aCB0eXBlIHRlc3RzIGFuZCBjYXN0cy4gQnkgdGhlIHNhbWUgdG9rZW4sIG9uZSB3b3VsZCBleHBlY3QgY2hlY2tlZCBtb2RlIHRvIHdvcmsgc2VhbWxlc3NseSBvbmNlIGEgdHlwZSBoYWQgYmVlbiBsb2FkZWQuIFdlIGhvcGUgdG8gYWRvcHQgdGhlc2Ugc2VtYW50aWNzIGluIHRoZSBmdXR1cmU7IHN1Y2ggYSBjaGFuZ2Ugd291bGQgYmUgdXB3YXJkbHkgY29tcGF0aWJsZS4KCn0KCiVJdCBpcyBhIHJ1bi10aW1lIHR5cGUgZXJyb3IgdG8gYWNjZXNzIGFuIHVuZGVjbGFyZWQgdHlwZSBvdXRzaWRlIC4KCiVJdCBpcyBhIGR5bmFtaWMgdHlwZSBlcnJvciBpZiBhIG1hbGZvcm1lZCB0eXBlIGlzIHVzZWQgaW4gYSBzdWJ0eXBlIHRlc3QuICAKSW4gY2hlY2tlZCBtb2RlLCBpdCBpcyBhIGR5bmFtaWMgdHlwZSBlcnJvciBpZiBhIGRlZmVycmVkLCBtYWxmb3JtZWQgb3IgbWFsYm91bmRlZCAoXHJlZntwYXJhbWV0ZXJpemVkVHlwZXN9KSAKdHlwZSBpcyB1c2VkIGluIGEgc3VidHlwZSB0ZXN0LiAgCgolSW4gcHJvZHVjdGlvbiBtb2RlLCBhbiB1bmRlY2xhcmVkIHR5cGUgaXMgdHJlYXRlZCBhcyBhbiBpbnN0YW5jZSBvZiB0eXBlIFxEWU5BTUlDe30uIAoKXGNvbW1lbnRhcnl7Q29uc2lkZXIgdGhlIGZvbGxvd2luZyBwcm9ncmFtfQoKXGJlZ2lue2RhcnRDb2RlfQpcVFlQRURFRnt9IEYoYm9vbCB4KTsKZihmb28geCkgJD0+JCB4OwptYWluKCkgXHsKICBpZiAoZiBpcyBGKSBcewogICAgcHJpbnQoInlveW9tYSIpOwogIFx9Clx9ClxlbmR7ZGFydENvZGV9CgpcY29tbWVudGFyeXsKVGhlIHR5cGUgb2YgdGhlIGZvcm1hbCBwYXJhbWV0ZXIgb2YgJGYkIGlzICRmb28kLCB3aGljaCBpcyB1bmRlY2xhcmVkIGluIHRoZSBsZXhpY2FsIHNjb3BlLiBUaGlzIHdpbGwgbGVhZCB0byBhIHN0YXRpYyB0eXBlIHdhcm5pbmcuIEF0IHJ1bnRpbWUgdGhlIHByb2dyYW0gd2lsbCBwcmludCBcY2R7eW95b21hfSwgYmVjYXVzZSAkZm9vJCBpcyB0cmVhdGVkIGFzIFxEWU5BTUlDe30uCiVmYWlsIHdoZW4gZXhlY3V0aW5nIHRoZSB0eXBlIHRlc3Qgb24gdGhlIGZpcnN0IGxpbmUgb2YgJG1haW4oKSQgYmVjYXVzZSBpdCBsZWFkcyB0byBhIHN1YnR5cGUgY29tcGFyaXNvbiBpbnZvbHZpbmcgYSBtYWxmb3JtZWQgdHlwZSAoJGZvbyQpLiAKCkFzIGFub3RoZXIgZXhhbXBsZSB0YWtlfQoKXGJlZ2lue2RhcnRDb2RlfQpcVkFSe30gaTsKaSAgajsgLy8gIGEgdmFyaWFibGUgaiBvZiB0eXBlIGkgKHN1cHBvc2VkbHkpCm1haW4oKSBcewogICAgIGogPSAgJ0kgYW0gbm90IGFuIGknOyAKXH0KXGVuZHtkYXJ0Q29kZX0KClxjb21tZW50YXJ5ewpTaW5jZSAkaSQgaXMgbm90IGEgdHlwZSwgYSBzdGF0aWMgd2FybmluZyB3aWxsIGJlIGlzc3VlIGF0IHRoZSBkZWNsYXJhdGlvbiBvZiAkaiQuIEhvd2V2ZXIsIHRoZSBwcm9ncmFtIGNhbiBiZSBleGVjdXRlZCB3aXRob3V0IGluY2lkZW50IGluIHByb2R1Y3Rpb24gbW9kZSBiZWNhdXNlIGhlIHVuZGVjbGFyZWQgdHlwZSAkaSQgaXMgdHJlYXRlZCBhcyBcRFlOQU1JQ3t9LiBIb3dldmVyLCBpbiBjaGVja2VkIG1vZGUsIHRoZSBpbXBsaWNpdCBzdWJ0eXBlIHRlc3QgYXQgdGhlIGFzc2lnbm1lbnQgd2lsbCB0cmlnZ2VyIGFuIGVycm9yIGF0IHJ1bnRpbWUuCn0KCgpcY29tbWVudGFyeXsKSGVyZSBpcyBhbiBleGFtcGxlIGludm9sdmluZyBtYWxib3VuZGVkIHR5cGVzOgp9CgpcYmVnaW57ZGFydENvZGV9ClxDTEFTU3t9IEkkPCRUIFxFWFRFTkRTe30gbnVtJD4kIFx7XH0KXENMQVNTe30gSiBce1x9CgpcQ0xBU1N7fSBBJDwkVCQ+JCBcSU1QTEVNRU5UU3t9IEosICBJJDwkVCQ+JCAvLyB0eXBlIHdhcm5pbmc6IFQgaXMgbm90IGEgc3VidHlwZSBvZiBudW0KXHsgLi4uClx9IApcZW5ke2RhcnRDb2RlfQoKXGNvbW1lbnRhcnl7R2l2ZW4gdGhlIGRlY2xhcmF0aW9ucyBhYm92ZSwgdGhlIGZvbGxvd2luZ30KClxiZWdpbntkYXJ0Q29kZX0KSSB4ID0gXE5FV3t9IEEkPCRTdHJpbmckPiQoKTsgClxlbmR7ZGFydENvZGV9CgpcY29tbWVudGFyeXsKd2lsbCBjYXVzZSBhIGR5bmFtaWMgdHlwZSBlcnJvciBpbiBjaGVja2VkIG1vZGUsIGJlY2F1c2UgdGhlIGFzc2lnbm1lbnQgcmVxdWlyZXMgYSBzdWJ0eXBlIHRlc3QgQSQ8JFN0cmluZyQ+JCAkPCQ6IEkuIFRvIHNob3cgdGhhdCB0aGlzIGhvbGRzLCB3ZSBuZWVkIHRvIHNob3cgdGhhdCBBJDwkU3RyaW5nJD4kICAkPDwkIEkkPCRTdHJpbmckPiQsIGJ1dCBJJDwkU3RyaW5nJD4kIGlzIGEgbWFsYm91bmRlZCB0eXBlLCBjYXVzaW5nIHRoZSBkeW5hbWljIGVycm9yLiAgTm8gZXJyb3IgaXMgdGhyb3duIGluIHByb2R1Y3Rpb24gbW9kZS4gTm90ZSB0aGF0Cn0KClxiZWdpbntkYXJ0Q29kZX0KSiB4ID0gXE5FV3t9IEEkPCRTdHJpbmckPiQoKTsgClxlbmR7ZGFydENvZGV9CgpcY29tbWVudGFyeXsKZG9lcyBub3QgY2F1c2UgYSBkeW5hbWljIGVycm9yLCBhcyB0aGVyZSBpcyBubyBuZWVkIHRvIHRlc3QgYWdhaW5zdCBcY29kZXtJJDwkU3RyaW5nJD4kfSBpbiB0aGlzIGNhc2UuIApTaW1pbGFybHksIGluIHByb2R1Y3Rpb24gbW9kZQp9CgpcYmVnaW57ZGFydENvZGV9CkEgeCA9IFxORVd7fSBBJDwkU3RyaW5nJD4kKCk7CmJvb2wgYiA9IHggaXMgSTsKXGVuZHtkYXJ0Q29kZX0KClxjb21tZW50YXJ5ewpcY29kZXtifSBpcyBib3VuZCB0byB0cnVlLCBidXQgaW4gY2hlY2tlZCBtb2RlIHRoZSBzZWNvbmQgbGluZSBjYXVzZXMgYSBkeW5hbWljIHR5cGUgZXJyb3IuCn0KCgoKXHN1YnNlY3Rpb257VHlwZSBEZWNsYXJhdGlvbnN9ClxsYWJlbHt0eXBlRGVjbGFyYXRpb25zfQoKXHN1YnN1YnNlY3Rpb257VHlwZWRlZn0KXGxhYmVse3R5cGVkZWZ9CgpBIHtcZW0gdHlwZSBhbGlhc30gZGVjbGFyZXMgYSBuYW1lIGZvciBhIHR5cGUgZXhwcmVzc2lvbi4KCgpcYmVnaW57Z3JhbW1hcn0KCntcYmYgdHlwZUFsaWFzOn0KIAltZXRhZGF0YSAgXFRZUEVERUZ7fSB0eXBlQWxpYXNCb2R5CgkuCgkKe1xiZiB0eXBlQWxpYXNCb2R5On0KCWZ1bmN0aW9uVHlwZUFsaWFzCgkuCgp7XGJmIGZ1bmN0aW9uVHlwZUFsaWFzOn0KICAgICAgIGZ1bmN0aW9uUHJlZml4ICB0eXBlUGFyYW1ldGVycz8gZm9ybWFsUGFyYW1ldGVyTGlzdCAne1xlc2NhcGVncmFtbWFyIDt9JwogICAgLgogICAgCiAgICB7XGJmIGZ1bmN0aW9uUHJlZml4On0KICAgIHJldHVyblR5cGU/IGlkZW50aWZpZXIKICAgIC4KICAgIAogXGVuZHtncmFtbWFyfQogCiBUaGUgZWZmZWN0IG9mIGEgdHlwZSBhbGlhcyBvZiB0aGUgZm9ybSAgXGNvZGV7XFRZUEVERUZ7fSAkVCQgJGlkIChUXzEkICRwXzEsIFxsZG90cywgVF9uJCAkcF9uLCBbVF97bisxfSQgJHBfe24rMX0sIFxsZG90cywgVF97bitrfSQgJHBfe24ra31dKSR9IGRlY2xhcmVkIGluIGEgbGlicmFyeSAkTCQgaXMgaXMgdG8gaW50cm9kdWNlIHRoZSBuYW1lICRpZCQgaW50byB0aGUgc2NvcGUgb2YgJEwkLCBib3VuZCB0byB0aGUgZnVuY3Rpb24gdHlwZSAkKFRfMSwgXGxkb3RzLCBUX24sIFtUX3tuKzF9JCAkcF97bisxfSwgXGxkb3RzLCBUX3tuK2t9JCAkcF97bitrfV0pICBccmlnaHRhcnJvdyBUJC4gIFRoZSBlZmZlY3Qgb2YgYSB0eXBlIGFsaWFzIG9mIHRoZSBmb3JtICAgXGNvZGV7XFRZUEVERUZ7fSAkVCQgJGlkIChUXzEkICRwXzEsIFxsZG90cywgVF9uJCAkcF9uLCBce1Rfe24rMX0kICRwX3tuKzF9LCBcbGRvdHMsIFRfe24ra30kICRwX3tuK2t9XH0pJH0gZGVjbGFyZWQgaW4gYSBsaWJyYXJ5ICRMJCBpcyBpcyB0byBpbnRyb2R1Y2UgdGhlIG5hbWUgJGlkJCBpbnRvIHRoZSBzY29wZSBvZiAkTCQsIGJvdW5kIHRvIHRoZSBmdW5jdGlvbiB0eXBlICQoVF8xLCBcbGRvdHMsIFRfbiwgXHtUX3tuKzF9JCAkcF97bisxfSwgXGxkb3RzLCBUX3tuK2t9JCAkcF97bitrfVx9KSAgXHJpZ2h0YXJyb3cgVCQuIC4gSW4gZWl0aGVyIGNhc2UsIGlmZiBubyByZXR1cm4gdHlwZSBpcyBzcGVjaWZpZWQsIGl0IGlzIHRha2VuIHRvIGJlIFxEWU5BTUlDe30uIExpa2V3aXNlLCBpZiBhIHR5cGUgYW5ub3RhdGlvbiBpcyBvbWl0dGVkIG9uIGEgZm9ybWFsIHBhcmFtZXRlciwgaXQgaXMgdGFrZW4gdG8gYmUgXERZTkFNSUN7fS4KIApJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBhbnkgZGVmYXVsdCB2YWx1ZXMgYXJlIHNwZWNpZmllZCBpbiB0aGUgc2lnbmF0dXJlIG9mIGEgZnVuY3Rpb24gdHlwZSBhbGlhcy4gCiVBIHR5cGVkZWYgbWF5IG9ubHkgcmVmZXIgdG8gaXRzZWxmICB2aWEgdGhlIGJvdW5kcyBvZiBpdHMgZ2VuZXJpYyBwYXJhbWV0ZXJzLiAKQW55ICBzZWxmIHJlZmVyZW5jZSBpbiBhIHR5cGVkZWYsIGVpdGhlciBkaXJlY3RseSwgb3IgcmVjdXJzaXZlbHkgdmlhIGFub3RoZXIgdHlwZWRlZiwgaXMgYSBjb21waWxlIHRpbWUgZXJyb3IuCiV2aWEgYSBjaGFpbiBvZiByZWZlcmVuY2VzIHRoYXQgZG9lcyBub3QgaW5jbHVkZSBhIGNsYXNzIGRlY2xhcmF0aW9uLiAgCiAKCgpcc3Vic2VjdGlvbntJbnRlcmZhY2UgVHlwZXN9ClxsYWJlbHtpbnRlcmZhY2VUeXBlc30KClRoZSBpbXBsaWNpdCBpbnRlcmZhY2Ugb2YgY2xhc3MgJEkkIGlzIGEgZGlyZWN0IHN1cGVydHlwZSBvZiB0aGUgaW1wbGljaXQgaW50ZXJmYWNlIG9mIGNsYXNzICAkSiQgaWZmOgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0KSWYgJEkkIGlzIFxjb2Rle09iamVjdH0sIGFuZCAkSiQgaGFzIG5vIFxFWFRFTkRTe30gY2xhdXNlJSBhbmQgbm8gaW50ZXJmYWNlIGluamVjdGlvbiBkZWNsYXJhdGlvbiBoYXMgZXh0ZW5kZWQgJEouClxpdGVtCklmICRJJCBpcyBsaXN0ZWQgaW4gdGhlIFxFWFRFTkRTe30gY2xhdXNlIG9mICRKJCUgb3IgYW4gaW50ZXJmYWNlIGluamVjdGlvbiBkZWNsYXJhdGlvbiBoYXMgZXh0ZW5kZWQgJEokIHdpdGggJEkkCi4KXGl0ZW0gSWYgJEkkIGlzIGxpc3RlZCBpbiB0aGUgXElNUExFTUVOVFN7fSBjbGF1c2Ugb2YgJEokCgpcaXRlbSBJZiAkSSQgaXMgbGlzdGVkIGluIHRoZSBcV0lUSHt9IGNsYXVzZSBvZiAkSiQKClxpdGVtIElmICRKJCBpcyBhIG1peGluIGFwcGxpY2F0aW9uIChccmVme21peGluQXBwbGljYXRpb259KSBvZiB0aGUgbWl4aW4gb2YgJEkkLgpcZW5ke2l0ZW1pemV9CgpcY29tbWVudGFyeXsKCgp9CgolXFF7Q2FuIHdhY2t5IHN0dWZmIGhhcHBlbiB3aXRoIGludGVyZmFjZSBpbmplY3Rpb24sIGUuZy4sIGEgZGlyZWN0IHN1cGVyaW50ZXJmYWNlIGJlY29tZXMgaW5kaXJlY3Q/IFdoYXQgYWJvdXQgc2lkZSBlZmZlY3RzIC0gbG9hZGluZyBvcmRlciBjYW4gYWZmZWN0IHR5cGUgcmVsYXRpb25zaGlwcy4KJX0KCkEgdHlwZSAkVCQgaXMgbW9yZSBzcGVjaWZpYyB0aGFuIGEgdHlwZSAkUyQsIHdyaXR0ZW4gJFQgPDwgUyQsICBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIG1ldDoKXGJlZ2lue2l0ZW1pemV9ClxpdGVtICRUJCBpcyAkUyQuClxpdGVtIFQgaXMgJFxib3QkLgpcaXRlbSBTIGlzIFxEWU5BTUlDe30uClxpdGVtICRTJCBpcyBhIGRpcmVjdCBzdXBlcnR5cGUgb2YgJFQkLgpcaXRlbSAkVCQgaXMgYSB0eXBlIHBhcmFtZXRlciBhbmQgJFMkIGlzIHRoZSB1cHBlciBib3VuZCBvZiAkVCQuClxpdGVtICRUJCBpcyBhIHR5cGUgcGFyYW1ldGVyIGFuZCAkUyQgaXMgXGNke09iamVjdH0uClxpdGVtICRUJCBpcyBvZiB0aGUgZm9ybSAkSTxUXzEsIFxsZG90cywgVF9uPiQgYW5kICRTJCBpcyBvZiB0aGUgZm9ybSAkSTxTXzEsIFxsZG90cywgU19uPiQgYW5kOgokVF9pIDw8IFNfaSwgMSBcbGUgaSBcbGUgbiQKXGl0ZW0gJFQkIGFuZCAkUyQgYXJlIGJvdGggZnVuY3Rpb24gdHlwZXMsIGFuZCAkVCA8PCBTJCB1bmRlciB0aGUgcnVsZXMgb2Ygc2VjdGlvbiBccmVme2Z1bmN0aW9uVHlwZXN9LgpcaXRlbSAkVCQgaXMgYSBmdW5jdGlvbiB0eXBlIGFuZCAkUyQgaXMgXGNke0Z1bmN0aW9ufS4KXGl0ZW0gJFQgPDwgVSQgYW5kICRVIDw8IFMkLgpcZW5ke2l0ZW1pemV9CgokPDwkIGlzIGEgcGFydGlhbCBvcmRlciBvbiB0eXBlcy4KJFQkIGlzIGEgc3VidHlwZSBvZiAkUyQsIHdyaXR0ZW4gJFQgPDogUyQsIGlmZiAkW1xib3QvXERZTkFNSUN7fV1UIDw8IFMkLgoKXHJhdGlvbmFsZXsKTm90ZSB0aGF0ICQ8OiQgaXMgbm90IGEgcGFydGlhbCBvcmRlciBvbiB0eXBlcywgaXQgaXMgb25seSBiaW5hcnkgcmVsYXRpb24gb24gdHlwZXMuIFRoaXMgaXMgYmVjYXVzZSAkPDokIGlzIG5vdCB0cmFuc2l0aXZlLiBJZiBpdCB3YXMsIHRoZSBzdWJ0eXBlIHJ1bGUgd291bGQgaGF2ZSBhIGN5Y2xlLiBGb3IgZXhhbXBsZToKJExpc3QgPDogTGlzdDxTdHJpbmc+JCBhbmQgJExpc3Q8aW50PiA8OiBMaXN0JCwgYnV0ICRMaXN0PGludD4kIGlzIG5vdCBhIHN1YnR5cGUgb2YgJExpc3Q8U3RyaW5nPiQuCkFsdGhvdWdoICQ8OiQgaXMgbm90IGEgcGFydGlhbCBvcmRlciBvbiB0eXBlcywgaXQgZG9lcyBjb250YWluIGEgcGFydGlhbCBvcmRlciwgbmFtZWx5ICQ8PCQuIFRoaXMgbWVhbnMgdGhhdCwgYmFycmluZyByYXcgdHlwZXMsIGludHVpdGlvbiBhYm91dCBjbGFzc2ljYWwgc3VidHlwZSBydWxlcyBkb2VzIGFwcGx5Lgp9CgokUyQgaXMgYSBzdXBlcnR5cGUgb2YgJFQkLCB3cml0dGVuICRTIDo+IFQkLCBpZmYgJFQkIGlzIGEgc3VidHlwZSBvZiAkUyQuCgpcY29tbWVudGFyeXtUaGUgc3VwZXJ0eXBlcyBvZiBhbiBpbnRlcmZhY2UgYXJlIGl0cyBkaXJlY3Qgc3VwZXJ0eXBlcyBhbmQgdGhlaXIgc3VwZXJ0eXBlcy4gfQoKQW4gaW50ZXJmYWNlIHR5cGUgJFQkIG1heSBiZSBhc3NpZ25lZCB0byBhIHR5cGUgJFMkLCB3cml0dGVuICAkVCBcTG9uZ2xlZnRyaWdodGFycm93IFMkLCBpZmYgZWl0aGVyICRUIDw6IFMkIG9yICRTIDw6IFQkLiAKClxyYXRpb25hbGV7VGhpcyBydWxlIG1heSBzdXJwcmlzZSByZWFkZXJzIGFjY3VzdG9tZWQgdG8gY29udmVudGlvbmFsIHR5cGVjaGVja2luZy4gVGhlIGludGVudCBvZiB0aGUgJFxMb25nbGVmdHJpZ2h0YXJyb3ckIHJlbGF0aW9uIGlzIG5vdCB0byBlbnN1cmUgdGhhdCBhbiBhc3NpZ25tZW50IGlzIGNvcnJlY3QuIEluc3RlYWQsIGl0IGFpbXMgdG8gb25seSBmbGFnIGFzc2lnbm1lbnRzIHRoYXQgYXJlIGFsbW9zdCBjZXJ0YWluIHRvIGJlIGVycm9uZW91cywgd2l0aG91dCBwcmVjbHVkaW5nIGFzc2lnbm1lbnRzIHRoYXQgbWF5IHdvcmsuIAoKRm9yIGV4YW1wbGUsIGFzc2lnbmluZyBhIHZhbHVlIG9mIHN0YXRpYyB0eXBlIE9iamVjdCB0byBhIHZhcmlhYmxlIHdpdGggc3RhdGljIHR5cGUgU3RyaW5nLCB3aGlsZSBub3QgZ3VhcmFudGVlZCB0byBiZSBjb3JyZWN0LCBtaWdodCBiZSBmaW5lIGlmIHRoZSBydW50aW1lIHZhbHVlIGhhcHBlbnMgdG8gYmUgYSBzdHJpbmcuCn0KClxzdWJzZWN0aW9ue0Z1bmN0aW9uIFR5cGVzfQpcbGFiZWx7ZnVuY3Rpb25UeXBlc30KCkZ1bmN0aW9uIHR5cGVzIGNvbWUgaW4gdHdvIHZhcmlhbnRzOiAKXGJlZ2lue2VudW1lcmF0ZX0KXGl0ZW0KVGhlIHR5cGVzIG9mIGZ1bmN0aW9ucyB0aGF0IG9ubHkgaGF2ZSBwb3NpdGlvbmFsIHBhcmFtZXRlcnMuICBUaGVzZSBoYXZlIHRoZSBnZW5lcmFsIGZvcm0gJChUXzEsIFxsZG90cywgVF9uLCBbVF97bisxfSBcbGRvdHMsIFRfe24ra31dKSBccmlnaHRhcnJvdyBUJC4KXGl0ZW0KVGhlIHR5cGVzIG9mIGZ1bmN0aW9ucyB3aXRoIG5hbWVkICBwYXJhbWV0ZXJzLiBUaGVzZSBoYXZlIHRoZSBnZW5lcmFsIGZvcm0gJChUXzEsIFxsZG90cywgVF9uLCBce1Rfe3hfMX0kICR4XzEgXGxkb3RzLCBUX3t4X2t9JCAkeF9rXH0pIFxyaWdodGFycm93IFQkLgpcZW5ke2VudW1lcmF0ZX0KCiUkKFRfMSwgXGxkb3RzIFRfbikgXHJpZ2h0YXJyb3cgVCQgaXMgYSBzdWJ0eXBlIG9mICAkKFNfMSwgXGxkb3RzLCBTX24sICkgXHJpZ2h0YXJyb3cgUyQsIGlmIGFsbCBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKJVxiZWdpbntlbnVtZXJhdGV9CiVcaXRlbSBFaXRoZXIKJVxiZWdpbntpdGVtaXplfQolXGl0ZW0gJFMkIGlzIFxWT0lEe30sIE9yCiVcaXRlbSAgJFQgIFxMb25nbGVmdHJpZ2h0YXJyb3cgUyQuCiVcZW5ke2l0ZW1pemV9CiVcaXRlbSQgXGZvcmFsbCBpIFxpbiAxIC4uIG4sIFRfaSBcTG9uZ2xlZnRyaWdodGFycm93IFNfaSQuCiVcZW5ke2VudW1lcmF0ZX0KCiVBIGZ1bmN0aW9uIHR5cGUgJChUXzEsIFxsZG90cyBUX24sIFtUX3tuKzF9ICBcbGRvdHMsIFRfe24ra31dKSBccmlnaHRhcnJvdyBUJCBpcyBhIHN1YnR5cGUgb2YgdGhlIAolIHRoZSBsaW5lIGJlbG93IHJldmlzZXMgdGhlIHJ1bGUgdG8gYmUgbW9yZSBsaWJlcmFsCkEgZnVuY3Rpb24gdHlwZSAkKFRfMSwgXGxkb3RzIFRfe2t9LCBbVF97aysxfSAgXGxkb3RzLCBUX3tuK219XSkgXHJpZ2h0YXJyb3cgVCQgaXMgYSBzdWJ0eXBlIG9mIHRoZQpmdW5jdGlvbiB0eXBlICQoU18xLCBcbGRvdHMsIFNfe2sran0sIFtTX3trK2orMX0gXGxkb3RzLCBTX3tufV0pIFxyaWdodGFycm93IFMkLCBpZiBhbGwgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6ClxiZWdpbntlbnVtZXJhdGV9ClxpdGVtIEVpdGhlcgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gJFMkIGlzIFxWT0lEe30sIE9yClxpdGVtICAkVCAgXExvbmdsZWZ0cmlnaHRhcnJvdyBTJC4KXGVuZHtpdGVtaXplfQpcaXRlbSAkXGZvcmFsbCBpIFxpbiAxIC4uIG4sIFRfaSBcTG9uZ2xlZnRyaWdodGFycm93IFNfaSQuClxlbmR7ZW51bWVyYXRlfQoKCkEgZnVuY3Rpb24gdHlwZSAkKFRfMSwgXGxkb3RzIFRfbiwgXHtUX3t4XzF9JCAkeF8xLCBcbGRvdHMsIFRfe3hfa30kICR4X2tcfSkgXHJpZ2h0YXJyb3cgVCQgaXMgYSBzdWJ0eXBlIG9mIHRoZSBmdW5jdGlvbiB0eXBlICQoU18xLCBcbGRvdHMsIFNfbiwgXHtTX3t5XzF9JCAkeV8xLCBcbGRvdHMsIFNfe3lfbX0kICR5X21cfSkgXHJpZ2h0YXJyb3cgUyQsIGlmIGFsbCBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKXGJlZ2lue2VudW1lcmF0ZX0KXGl0ZW0gRWl0aGVyClxiZWdpbntpdGVtaXplfQpcaXRlbSAkUyQgaXMgXFZPSUR7fSwgT3IKXGl0ZW0gICRUICBcTG9uZ2xlZnRyaWdodGFycm93IFMkLgpcZW5ke2l0ZW1pemV9ClxpdGVtICRcZm9yYWxsIGkgXGluIDEgLi4gbiwgVF9pIFxMb25nbGVmdHJpZ2h0YXJyb3cgU19pJC4KXGl0ZW0gJGsgXGdlIG0kIGFuZCAkeV9pIFxpbiBce3hfMSwgIFxsZG90cywgeF9rXH0sIGkgXGluIDEgLi4gbSQuCiVce3hfMSwgIFxsZG90cywgeF9rXH0kIGlzIGEgc3VwZXJzZXQgb2YgJFx7eV8xLCAgXGxkb3RzLCB5X21cfSQuClxpdGVtIEZvciBhbGwgJHlfaSBcaW4gXHt5XzEsICBcbGRvdHMsIHlfbVx9LCB5X2kgPSB4X2ogXFJpZ2h0YXJyb3cgVF9qIFxMb25nbGVmdHJpZ2h0YXJyb3cgU19pJApcZW5ke2VudW1lcmF0ZX0KCiVJbiBhZGRpdGlvbiwgYSBmdW5jdGlvbiB0eXBlICQoVF8xLCBcbGRvdHMsIFRuLCBbVF97bisxfSB4X3tuKzF9LCBcbGRvdHMsIFRfe24ra30geF97bitrfV0pIFxyaWdodGFycm93IFQkIGlzIGEgc3VidHlwZSBvZiB0aGUgZnVuY3Rpb24gdHlwZSAkKFRfMSwgXGxkb3RzLCBUX24sIFRfe24rMX0gLCBbVF97bisyfSB4X3tuKzJ9LCBcbGRvdHMsIFRfe24ra30geF97bitrfV0pIFxyaWdodGFycm93IFQkLgoKJVxyYXRpb25hbGV7VGhpcyBzZWNvbmQgcnVsZSBpcyBhdHRyYWN0aXZlIHRvIHdlYiBkZXZlbG9wZXJzLCB3aG8gYXJlIHVzZWQgdG8gdGhpcyBzb3J0IG9mIGZsZXhpYmlsaXR5IGZyb20gSmF2YXNjcmlwdC4gSG93ZXZlciwgaXQgbWF5IGJlIGNvc3RseSB0byBpbXBsZW1lbnQgZWZmaWNpZW50bHkufSBcUXtTaG91bGQgd2UgZG8gdGhpcyBvciBub3Q/fQoKJVdlIHdyaXRlICQoVF8xLCBcbGRvdHMsIFRfbikgXHJpZ2h0YXJyb3cgVCQgYXMgYSBzaG9ydGhhbmQgZm9yIHRoZSB0eXBlICQoVF8xLCBcbGRvdHMsIFRfbiwgW10pIFxyaWdodGFycm93IFQkLgoKJVRoZSBydWxlcyBhYm92ZSBuZWVkIHRvIGJlIHNhbml0eSBjaGVja2VkLCBidXQgdGhlIGludGVudCBpcyB0aGF0IHdlIHZpZXcgZnVuY3Rpb25zIHdpdGggcmVzdCBwYXJhbWV0ZXJzIGFzIGhhdmluZyB0eXBlICQoVF8xLCAuLi4sIFRfbiwgW1xfe1RuKzF9W10gXF9dKSBccmlnaHRhcnJvdyBUJCwgd2hlcmUgXF8gaXMgc29tZSBtYWdpY2FsIGlkZW50aWZpZXIuIFRoZW4gdGhlIHJ1bGVzIGFib3ZlIG1heSBjb3ZlciBldmVyeXRoaW5nLgolIFRoaXMgaXMgd3JvbmcgLSBmcm9tIHRoZSBvdXRzaWRlLCB0aGUgdHlwZSB0YWtlcyBhbiB1bmJvdW5kZWQgc2VxdWVuY2Ugb2YgdHlwZXMsIG5vdCBhIGxpc3QuIFRoaXMgY2FuIGJlIG1vZGVsZWQgYXMgJChUXzEsIFxsZG90cywgVF9uLCBbVF97bisxfSwgXF8gXGxkb3RzLCBUX3tuK2t9IFxfXSkgXHJpZ2h0YXJyb3cgVCQgZm9yIHNvbWUgZmluaXRlICRrJC4gCgpJbiBhZGRpdGlvbiwgdGhlIGZvbGxvd2luZyBzdWJ0eXBlIHJ1bGVzIGFwcGx5OgoKCiQoVF8xLCBcbGRvdHMsIFRfbiwgW10pIFxyaWdodGFycm93IFQgPDogKFRfMSwgXGxkb3RzLCBUX24pIFxyaWdodGFycm93IFQkLgoKJChUXzEsIFxsZG90cywgVF9uKSBccmlnaHRhcnJvdyBUIDw6IChUXzEsIFxsZG90cywgVF9uLCBce1x9KSBccmlnaHRhcnJvdyBUJC4KCiQoVF8xLCBcbGRvdHMsIFRfbiwgXHtcfSkgXHJpZ2h0YXJyb3cgVCA8OiAoVF8xLCBcbGRvdHMsIFRfbikgXHJpZ2h0YXJyb3cgVCQuCgokKFRfMSwgXGxkb3RzLCBUX24pIFxyaWdodGFycm93IFQgPDogKFRfMSwgXGxkb3RzLCBUX24sIFtdKSBccmlnaHRhcnJvdyBUJC4KClxyYXRpb25hbGV7ClRoZSBuYWl2ZSByZWFkZXIgbWlnaHQgY29uY2x1ZGUgdGhhdCwgc2luY2UgaXQgaXMgbm90IGxlZ2FsIHRvIGRlY2xhcmUgYSBmdW5jdGlvbiB3aXRoIGFuIGVtcHR5IG9wdGlvbmFsIHBhcmFtZXRlciBsaXN0LCB0aGVzZSBydWxlcyBhcmUgcG9pbnRsZXNzLiBIb3dldmVyLCB0aGV5IGluZHVjZSAgdXNlZnVsIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBmdW5jdGlvbiB0eXBlcyB0aGF0IGRlY2xhcmUgbm8gb3B0aW9uYWwgcGFyYW1ldGVycyBhbmQgdGhvc2UgdGhhdCBkby4KfQoKQSBmdW5jdGlvbiB0eXBlICRUJCBtYXkgYmUgYXNzaWduZWQgdG8gYSBmdW5jdGlvbiB0eXBlICRTJCwgd3JpdHRlbiAgJFQgXExvbmdsZWZ0cmlnaHRhcnJvdyBTJCwgaWZmICAkVCA8OiBTJC4gCgolIGVuc3VyZSB0aGF0IE9iamVjdCAgYW5kIGR5bmFtaWMgbWF5IGJlIGFzc2lnbiBkb3QgYSBmdW5jdGlvbiB0eXBlCkEgZnVuY3Rpb24gaXMgYWx3YXlzIGFuIGluc3RhbmNlIG9mIHNvbWUgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBjbGFzcyBcY29kZXtGdW5jdGlvbn0gYW5kIGltcGxlbWVudHMgYSBcQ0FMTHt9IG1ldGhvZCB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZSBhcyB0aGUgZnVuY3Rpb24uIEFsbCBmdW5jdGlvbiB0eXBlcyBhcmUgc3VidHlwZXMgb2YgXGNvZGV7RnVuY3Rpb259LgpJZiBhIHR5cGUgJEkkIGluY2x1ZGVzIGFuIGluc3RhbmNlIG1ldGhvZCBuYW1lZCBcQ0FMTHt9LCBhbmQgdGhlIHR5cGUgb2YgXENBTEx7fSBpcyB0aGUgZnVuY3Rpb24gdHlwZSAkRiQsIHRoZW4gJEkkIGlzIGNvbnNpZGVyZWQgdG8gYmUgbW9yZSBzcGVjaWZpYyB0aGFuICRGJC4gIEl0IGlzIGEgc3RhdGljIHdhcm5pbmcgaWYgYSBjb25jcmV0ZSBjbGFzcyBpbXBsZW1lbnRzIFxjZHtGdW5jdGlvbn0gYW5kIGRvZXMgbm90IGhhdmUgYSBjb25jcmV0ZSBtZXRob2QgbmFtZWQgXENBTEx7fSB1bmxlc3MgdGhhdCBjbGFzcyBkZWNsYXJlcyBpdHMgb3duIGltcGxlbWVudGF0aW9uIG9mIFxjZHtub1N1Y2hNZXRob2QoKX0uCgoKCgolXGNvbW1lbnRhcnl7TmVlZCB0byBzcGVjaWZ5IGhvdyBhIGZ1bmN0aW9uIHZhbHVlcyBkeW5hbWljIHR5cGUgaXMgZGVyaXZlZCBmcm9tIGl0cyBzdGF0aWMgc2lnbmF0dXJlLn0KCkEgZnVuY3Rpb24gdHlwZSAkKFRfMSwgXGxkb3RzIFRfe2t9LCBbVF97aysxfSAgXGxkb3RzLCBUX3tuK219XSkgXHJpZ2h0YXJyb3cgVCQgaXMgYSBtb3JlIHNwZWNpZmljIHRoYW4gdGhlCmZ1bmN0aW9uIHR5cGUgJChTXzEsIFxsZG90cywgU197aytqfSwgW1Nfe2sraisxfSBcbGRvdHMsIFNfe259XSkgXHJpZ2h0YXJyb3cgUyQsIGlmIGFsbCBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKXGJlZ2lue2VudW1lcmF0ZX0KXGl0ZW0gRWl0aGVyClxiZWdpbntpdGVtaXplfQpcaXRlbSAkUyQgaXMgXFZPSUR7fSwgT3IKXGl0ZW0gICRUIDw8IFMkLgpcZW5ke2l0ZW1pemV9ClxpdGVtICRcZm9yYWxsIGkgXGluIDEgLi4gbiwgVF9pIDw8IFNfaSQuClxlbmR7ZW51bWVyYXRlfQoKCkEgZnVuY3Rpb24gdHlwZSAkKFRfMSwgXGxkb3RzIFRfbiwgXHtUX3t4XzF9JCAkeF8xLCBcbGRvdHMsIFRfe3hfa30kICR4X2tcfSkgXHJpZ2h0YXJyb3cgVCQgaXMgbW9yZSBzcGVjaWZpYyB0aGFuIHRoZSBmdW5jdGlvbiB0eXBlICQoU18xLCBcbGRvdHMsIFNfbiwgXHtTX3t5XzF9JCAkeV8xLCBcbGRvdHMsIFNfe3lfbX0kICR5X21cfSkgXHJpZ2h0YXJyb3cgUyQsIGlmIGFsbCBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKXGJlZ2lue2VudW1lcmF0ZX0KXGl0ZW0gRWl0aGVyClxiZWdpbntpdGVtaXplfQpcaXRlbSAkUyQgaXMgXFZPSUR7fSwgT3IKXGl0ZW0gICRUICA8PCBTJC4KXGVuZHtpdGVtaXplfQpcaXRlbSAkXGZvcmFsbCBpIFxpbiAxIC4uIG4sIFRfaSA8PCBTX2kkLgpcaXRlbSAkayBcZ2UgbSQgYW5kICR5X2kgXGluIFx7eF8xLCAgXGxkb3RzLCB4X2tcfSwgaSBcaW4gMSAuLiBtJC4KJVx7eF8xLCAgXGxkb3RzLCB4X2tcfSQgaXMgYSBzdXBlcnNldCBvZiAkXHt5XzEsICBcbGRvdHMsIHlfbVx9JC4KXGl0ZW0gRm9yIGFsbCAkeV9pIFxpbiBce3lfMSwgIFxsZG90cywgeV9tXH0sIHlfaSA9IHhfaiBcUmlnaHRhcnJvdyBUX2ogPDwgU19pJApcZW5ke2VudW1lcmF0ZX0KCkZ1cnRoZXJtb3JlLCBpZiAkRiQgaXMgYSBmdW5jdGlvbiB0eXBlLCAkRiA8PCBcY29kZXtGdW5jdGlvbn0kLgoKClxzdWJzZWN0aW9ue1R5cGUgXERZTkFNSUN7fX0KXGxhYmVse3R5cGVEeW5hbWljfQoKVGhlIHR5cGUgIFxEWU5BTUlDe30gIGRlbm90ZXMgdGhlIHVua25vd24gdHlwZS4gCgpJZiBubyBzdGF0aWMgdHlwZSBhbm5vdGF0aW9uIGhhcyBiZWVuIHByb3ZpZGVkIHRoZSB0eXBlIHN5c3RlbSBhc3N1bWVzIHRoZSBkZWNsYXJhdGlvbiBoYXMgdGhlIHVua25vd24gdHlwZS4gSWYgYSBnZW5lcmljIHR5cGUgaXMgdXNlZCBidXQgdHlwZSBhcmd1bWVudHMgYXJlIG5vdCBwcm92aWRlZCwgdGhlbiB0aGUgIHR5cGUgYXJndW1lbnRzIGRlZmF1bHQgdG8gdGhlIHVua25vd24gdHlwZS4KClxjb21tZW50YXJ5e1RoaXMgbWVhbnMgdGhhdCBnaXZlbiBhIGdlbmVyaWMgZGVjbGFyYXRpb24gJEc8VF8xLCBcbGRvdHMsIFRfbj4kLCB0aGUgdHlwZSAkRyQgaXMgZXF1aXZhbGVudCB0byAkRzwgXERZTkFNSUN7fSwgIFxsZG90cywgIFxEWU5BTUlDe30+JC4KfQoKVHlwZSAgXERZTkFNSUN7fSBoYXMgbWV0aG9kcyBmb3IgZXZlcnkgcG9zc2libGUgaWRlbnRpZmllciBhbmQgYXJpdHksIHdpdGggZXZlcnkgcG9zc2libGUgY29tYmluYXRpb24gb2YgbmFtZWQgcGFyYW1ldGVycy4gVGhlc2UgbWV0aG9kcyBhbGwgaGF2ZSAgXERZTkFNSUN7fSBhcyB0aGVpciByZXR1cm4gdHlwZSwgYW5kIHRoZWlyIGZvcm1hbCBwYXJhbWV0ZXJzIGFsbCBoYXZlIHR5cGUgIFxEWU5BTUlDe30uClR5cGUgIFxEWU5BTUlDe30gaGFzIHByb3BlcnRpZXMgZm9yIGV2ZXJ5IHBvc3NpYmxlIGlkZW50aWZpZXIuIFRoZXNlIHByb3BlcnRpZXMgYWxsIGhhdmUgdHlwZSAgXERZTkFNSUN7fS4KClxyYXRpb25hbGV7RnJvbSBhIHVzYWJpbGl0eSBwZXJzcGVjdGl2ZSwgd2Ugd2FudCB0byBlbnN1cmUgdGhhdCB0aGUgY2hlY2tlciBkb2VzIG5vdCBpc3N1ZSBlcnJvcnMgZXZlcnl3aGVyZSBhbiB1bmtub3duIHR5cGUgaXMgdXNlZC4gVGhlIGRlZmluaXRpb25zIGFib3ZlIGVuc3VyZSB0aGF0IG5vIHNlY29uZGFyeSBlcnJvcnMgYXJlIHJlcG9ydGVkIHdoZW4gYWNjZXNzaW5nIGFuIHVua25vd24gdHlwZS4gCgpUaGUgY3VycmVudCBydWxlcyBzYXkgdGhhdCBtaXNzaW5nIHR5cGUgYXJndW1lbnRzIGFyZSB0cmVhdGVkIGFzIGlmIHRoZXkgd2VyZSB0aGUgdHlwZSAgXERZTkFNSUN7fS4gIEFuIGFsdGVybmF0aXZlIGlzIHRvIGNvbnNpZGVyIHRoZW0gYXMgbWVhbmluZyBcY29kZXtPYmplY3R9LiAgVGhpcyB3b3VsZCBsZWFkIHRvIGVhcmxpZXIgZXJyb3IgZGV0ZWN0aW9uIGluIGNoZWNrZWQgbW9kZSwgYW5kIG1vcmUgYWdncmVzc2l2ZSBlcnJvcnMgZHVyaW5nIHN0YXRpYyB0eXBlY2hlY2tpbmcuIEZvciBleGFtcGxlOgoKKDEpICBcY29kZXt0eXBlZEFQSShHXGx0e1N0cmluZ31cZ3QgZylcey4uLlx9fSAKCgooMikgIFxjb2Rle3R5cGVkQVBJKG5ldyBHKCkpOyB9CgoKVW5kZXIgdGhlIGFsdGVybmF0aXZlIHJ1bGVzLCAoMikgd291bGQgY2F1c2UgYSBydW50aW1lIGVycm9yIGluIGNoZWNrZWQgbW9kZS4gVGhpcyBzZWVtcyBkZXNpcmFibGUgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgZXJyb3IgbG9jYWxpemF0aW9uLiBIb3dldmVyLCB3aGVuIGEgZHluYW1pYyBlcnJvciBpcyB0aHJvd24gYXQgKDIpLCB0aGUgb25seSB3YXkgdG8ga2VlcCBydW5uaW5nIGlzIHJld3JpdGluZyAoMikgaW50bwoKKDMpIFxjb2Rle3R5cGVkQVBJKG5ldyBHXGx0e1N0cmluZ31cZ3QoKSk7fQoKVGhpcyBmb3JjZXMgdXNlcnMgdG8gd3JpdGUgdHlwZSBpbmZvcm1hdGlvbiBpbiB0aGVpciBjbGllbnQgY29kZSBqdXN0IGJlY2F1c2UgdGhleSBhcmUgY2FsbGluZyBhIHR5cGVkIEFQSS4gIFdlIGRvIG5vdCB3YW50IHRvIGltcG9zZSB0aGlzIG9uIERhcnQgcHJvZ3JhbW1lcnMsIHNvbWUgb2Ygd2hpY2ggbWF5IGJlIGJsaXNzZnVsbHkgdW5hd2FyZSBvZiB0eXBlcyBpbiBnZW5lcmFsLCBhbmQgZ2VuZXJpY2l0eSBpbiBwYXJ0aWN1bGFyLgoKV2hhdCBvZiBzdGF0aWMgY2hlY2tpbmc/IFN1cmVseSB3ZSB3b3VsZCB3YW50IHRvIGZsYWcgKDIpIHdoZW4gdXNlcnMgaGF2ZSBleHBsaWNpdGx5IGFza2VkIGZvciBzdGF0aWMgdHlwZWNoZWNraW5nPyBZZXMsIGJ1dCB0aGUgcmVhbGl0eSBpcyB0aGF0IHRoZSBEYXJ0IHN0YXRpYyBjaGVja2VyIGlzIGxpa2VseSB0byBiZSBydW5uaW5nIGluIHRoZSBiYWNrZ3JvdW5kIGJ5IGRlZmF1bHQuIEVuZ2luZWVyaW5nIHRlYW1zIHR5cGljYWxseSBkZXNpcmUgYSBgYGNsZWFuIGJ1aWxkJycgZnJlZSBvZiB3YXJuaW5ncyBhbmQgc28gdGhlIGNoZWNrZXIgaXMgZGVzaWduZWQgdG8gYmUgZXh0cmVtZWx5IGNoYXJpdGFibGUuIE90aGVyIHRvb2xzIGNhbiBpbnRlcnByZXQgdGhlIHR5cGUgaW5mb3JtYXRpb24gbW9yZSBhZ2dyZXNzaXZlbHkgYW5kIHdhcm4gYWJvdXQgdmlvbGF0aW9ucyBvZiBjb252ZW50aW9uYWwgKGFuZCBzb3VuZCkgc3RhdGljIHR5cGUgZGlzY2lwbGluZS4KfQoKVGhlIG5hbWUgXERZTkFNSUN7fSBkZW5vdGVzIGEgXGNke1R5cGV9IG9iamVjdCBldmVuIHRob3VnaCBcRFlOQU1JQ3t9IGlzIG5vdCBhIGNsYXNzLgoKJVxyYXRpb25hbGUgewolVHlwZSBvYmplY3RzIHJlaWZ5IHRoZSBydW50aW1lIHR5cGVzIG9mIGluc3RhbmNlcy4gTm8gaW5zdGFuY2UgZXZlciBoYXMgdHlwZSBcRFlOQU1JQ3t9LiAKJX0KClxzdWJzZWN0aW9ue1R5cGUgVm9pZH0KXGxhYmVse3R5cGVWb2lkfQoKVGhlIHNwZWNpYWwgdHlwZSBcVk9JRHt9IG1heSBvbmx5IGJlIHVzZWQgYXMgdGhlIHJldHVybiB0eXBlIG9mIGEgZnVuY3Rpb246IGl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIHRvIHVzZSBcVk9JRHt9IGluIGFueSBvdGhlciBjb250ZXh0LiAKClxjb21tZW50YXJ5ewpGb3IgZXhhbXBsZSwgYXMgYSB0eXBlIGFyZ3VtZW50LCBvciBhcyB0aGUgdHlwZSBvZiBhIHZhcmlhYmxlIG9yIHBhcmFtZXRlcgoKVm9pZCBpcyBub3QgYW4gaW50ZXJmYWNlIHR5cGUuIAoKVGhlIG9ubHkgc3VidHlwZSByZWxhdGlvbnMgdGhhdCBwZXJ0YWluIHRvIHZvaWQgYXJlIHRoZXJlZm9yZToKXGJlZ2lue2l0ZW1pemV9ClxpdGVtCiRcVk9JRHt9IDw6IFxWT0lEe30kIChieSByZWZsZXhpdml0eSkKXGl0ZW0KJFxib3QgPDogXFZPSUR7fSQgKGFzIGJvdHRvbSBpcyBhIHN1YnR5cGUgb2YgYWxsIHR5cGVzKS4KXGl0ZW0KJFxWT0lEe30gPDogICBcRFlOQU1JQ3t9JCAoYXMgIFxEWU5BTUlDe30gaXMgYSBzdXBlcnR5cGUgb2YgYWxsIHR5cGVzKQpcZW5ke2l0ZW1pemV9CgpUaGUgYW5hbG9nb3VzIHJ1bGVzIGFsc28gaG9sZCBmb3IgdGhlICQ8PCQgcmVsYXRpb24gZm9yICBzaW1pbGFyIHJlYXNvbnMuCgpIZW5jZSwgdGhlIHN0YXRpYyBjaGVja2VyIHdpbGwgaXNzdWUgd2FybmluZ3MgaWYgb25lIGF0dGVtcHRzIHRvIGFjY2VzcyBhIG1lbWJlciBvZiB0aGUgcmVzdWx0IG9mIGEgdm9pZCBtZXRob2QgaW52b2NhdGlvbiAoZXZlbiBmb3IgbWVtYmVycyBvZiBcTlVMTHt9LCBzdWNoIGFzIFxjb2Rlez09fSkuICBMaWtld2lzZSwgcGFzc2luZyB0aGUgcmVzdWx0IG9mIGEgdm9pZCBtZXRob2QgYXMgYSBwYXJhbWV0ZXIgb3IgYXNzaWduaW5nIGl0IHRvIGEgdmFyaWFibGUgd2lsbCBjYXVzZSBhIHdhcm5pbmcgdW5sZXNzIHRoZSB2YXJpYWJsZS9mb3JtYWwgcGFyYW1ldGVyIGhhcyB0eXBlIGR5bmFtaWMuCgpPbiB0aGUgb3RoZXIgaGFuZCwgaXQgaXMgcG9zc2libGUgdG8gcmV0dXJuIHRoZSByZXN1bHQgb2YgYSB2b2lkIG1ldGhvZCBmcm9tIHdpdGhpbiBhIHZvaWQgbWV0aG9kLiBPbmUgY2FuIGFsc28gcmV0dXJuIFxOVUxMe307IG9yIGEgdmFsdWUgb2YgdHlwZSBcRFlOQU1JQ3t9LiBSZXR1cm5pbmcgYW55IG90aGVyIHJlc3VsdCB3aWxsIGNhdXNlIGEgdHlwZSB3YXJuaW5nLiBJbiBjaGVja2VkIG1vZGUsIGEgZHluYW1pYyB0eXBlIGVycm9yIHdvdWxkIGFyaXNlIGlmIGEgbm9uLW51bGwgb2JqZWN0IHdhcyByZXR1cm5lZCBmcm9tIGEgdm9pZCBtZXRob2QgKHNpbmNlIG5vIG9iamVjdCBoYXMgcnVudGltZSB0eXBlICBcRFlOQU1JQ3t9KS4KfQoKXGNvbW1lbnRhcnkge1RoZSBuYW1lIFxWT0lEe30gZG9lcyBub3QgZGVub3RlIGEgXGNke1R5cGV9IG9iamVjdC59CgpccmF0aW9uYWxlIHsKSXQgaXMgc3ludGFjdGljbHkgaWxsZWdhbCB0byB1c2UgXFZPSUR7fSBhcyBhbiBleHByZXNzaW9uLCBhbmQgaXQgd291bGQgbWFrZSBubyBzZW5zZSB0byBkbyBzby4KVHlwZSBvYmplY3RzIHJlaWZ5IHRoZSBydW50aW1lIHR5cGVzIG9mIGluc3RhbmNlcy4gTm8gaW5zdGFuY2UgZXZlciBoYXMgdHlwZSBcVk9JRHt9LiAgCn0KCgoKXHN1YnNlY3Rpb257UGFyYW1ldGVyaXplZCBUeXBlc30KXGxhYmVse3BhcmFtZXRlcml6ZWRUeXBlc30gCgpBIHtcZW0gcGFyYW1ldGVyaXplZCB0eXBlfSBpcyBhbiBpbnZvY2F0aW9uIG9mIGEgZ2VuZXJpYyB0eXBlIGRlY2xhcmF0aW9uLgoKTGV0ICRUJCBiZSBhIHBhcmFtZXRlcml6ZWQgdHlwZSAgJEc8U18xLCAgXGxkb3RzLCBTX24+JC4gSWYgJEckIGlzIG5vdCBhIGdlbmVyaWMgdHlwZSwgdGhlIHR5cGUgYXJndW1lbnRzICRTX2kkLCAkMSBcbGUgaSBcbGUgbiQgYXJlIGRpc2NhcmRlZC4gSWYgJEckIGhhcyAkbSBcbmUgbiQgdHlwZSBwYXJhbWV0ZXJzLCAkVCQgaXMgdHJlYXRlZCBhcyBhcyBhIHBhcmFtZXRlcml6ZWQgdHlwZSB3aXRoICRtJCBhcmd1bWVudHMsIGFsbCBvZiB3aGljaCBhcmUgXERZTkFNSUN7fS4gCgpcY29tbWVudGFyeXtJbiBzaG9ydCwgYW55IGFyaXR5IG1pc21hdGNoIHJlc3VsdHMgaW4gYWxsIHR5cGUgYXJndW1lbnRzIGJlaW5nIGRyb3BwZWQsIGFuZCByZXBsYWNlZCB3aXRoIHRoZSBjb3JyZWN0IG51bWJlciBvZiB0eXBlIGFyZ3VtZW50cywgYWxsIHNldCB0byBcRFlOQU1JQ3t9LiBPZiBjb3Vyc2UsIGEgc3RhdGljIHdhcm5pbmcgd2lsbCBiZSBpc3N1ZWQuIAp9CgpPdGhlcndpc2UsIGxldAogJFRfaSQgYmUgdGhlIHR5cGUgcGFyYW1ldGVycyBvZiAkRyQgYW5kIGxldCAkQl9pJCBiZSB0aGUgYm91bmQgb2YgJFRfaSwgIGkgXGluIDEuLiBuJCwuICRUJCBpcyB7XGVtIG1hbGJvdW5kZWR9IGlmZiBlaXRoZXIgJFNfaSQgaXMgbWFsYm91bmRlZCAgb3IgJFNfaSQgaXMgbm90IGEgc3VidHlwZSBvZiAkW1NfMSwgIFxsZG90cywgU19uL1RfMSwgXGxkb3RzLCBUX25dQl9pLCAgIGkgXGluIDEuLiBuJC4gCiAKXGNvbW1lbnRhcnl7Ck5vdGUsIHRoYXQsIGluIGNoZWNrZWQgbW9kZSwgaXQgaXMgYSBkeW5hbWljIHR5cGUgZXJyb3IgaWYgYSBtYWxib3VuZGVkIHR5cGUgaXMgdXNlZCBpbiBhIHR5cGUgdGVzdCBhcyBzcGVjaWZpZWQgaW4gXHJlZntkeW5hbWljVHlwZVN5c3RlbX0uCn0KIApBbnkgdXNlIG9mIGEgbWFsYm91bmRlZCB0eXBlIGdpdmVzIHJpc2UgdG8gYSBzdGF0aWMgd2FybmluZy4KCklmICRTJCBpcyB0aGUgc3RhdGljIHR5cGUgb2YgYSBtZW1iZXIgJG0kIG9mICRHJCwgdGhlbiB0aGUgc3RhdGljIHR5cGUgb2YgdGhlIG1lbWJlciAkbSQgb2YgICRHPEFfMSwgXGxkb3RzLCBBX24+JCAgaXMgJFtBXzEsICBcbGRvdHMsIEFfbi9UXzEsICBcbGRvdHMsIFRfbl1TJCB3aGVyZSAkVF8xLCAgXGxkb3RzLCBUX24kIGFyZSB0aGUgZm9ybWFsIHR5cGUgcGFyYW1ldGVycyBvZiAkRyQuICAgTGV0ICRCX2kkLCBiZSB0aGUgYm91bmRzIG9mICRUX2ksIDEgXGxlIGkgXGxlIG4kLiBJdCBpcyBhIHN0YXRpYyB0eXBlIHdhcm5pbmcgaWYgJEFfaSQgaXMgbm90IGEgc3VidHlwZSBvZiAgJFtBXzEsICBcbGRvdHMsIEFfbi9UXzEsICBcbGRvdHMsIFRfbl1CX2ksIGkgXGluIDEuLm4kLiBJdCBpcyBhIHN0YXRpYyB0eXBlIHdhcm5pbmcgaWYgJEckIGlzIG5vdCBhIGdlbmVyaWMgdHlwZSB3aXRoIGV4YWN0bHkgJG4kIHR5cGUgcGFyYW1ldGVycy4KCgoKCgpcc3Vic3Vic2VjdGlvbntBY3R1YWwgVHlwZSBvZiBEZWNsYXJhdGlvbn0KXGxhYmVse2FjdHVhbFR5cGVPZkFEZWNsYXJhdGlvbn0KCkEgdHlwZSAkVCQge1xlbSBkZXBlbmRzIG9uIGEgdHlwZSBwYXJhbWV0ZXJ9ICRVJCBpZmY6ClxiZWdpbntpdGVtaXplfQpcaXRlbSAkVCQgaXMgJFUkLgpcaXRlbSAkVCQgaXMgYSBwYXJhbWV0ZXJpemVkIHR5cGUsIGFuZCBvbmUgb2YgdGhlIHR5cGUgYXJndW1lbnRzIG9mICRUJCBkZXBlbmRzIG9uICRVJC4KXGVuZHtpdGVtaXplfQoKTGV0ICRUJCBiZSB0aGUgZGVjbGFyZWQgdHlwZSBvZiBhIGRlY2xhcmF0aW9uICRkJCwgYXMgaXQgYXBwZWFycyBpbiB0aGUgcHJvZ3JhbSBzb3VyY2UuIFRoZSB7XGVtIGFjdHVhbCB0eXBlfSBvZiAkZCQgaXMKClxiZWdpbntpdGVtaXplfQpcaXRlbSAgJFtBXzEsIFxsZG90cywgQV9uL1VfMSwgXGxkb3RzLCBVX25dVCQgaWYgJGQkIGRlcGVuZHMgb24gdHlwZSBwYXJhbWV0ZXJzICRVXzEsIFxsZG90cywgVV9uJCwgYW5kICRBX2kkIGlzIHRoZSB2YWx1ZSBvZiAkVV9pLCAxIFxsZSBpIFxsZSBuJC4KXGl0ZW0gJFQkIG90aGVyd2lzZS4KXGVuZHtpdGVtaXplfQoKXHN1YnN1YnNlY3Rpb257TGVhc3QgVXBwZXIgQm91bmRzfQpcbGFiZWx7bGVhc3RVcHBlckJvdW5kc30KCiUgZG9lcyB0aGlzIGRpdmVyZ2UgaW4gc29tZSBjYXNlcz8KR2l2ZW4gdHdvIGludGVyZmFjZXMgJEkkIGFuZCAkSiQsIGxldCAkU19JJCBiZSB0aGUgc2V0IG9mIHN1cGVyaW50ZXJmYWNlcyBvZiAkSSQsICBsZXQgJFNfSiQgYmUgdGhlIHNldCBvZiBzdXBlcmludGVyZmFjZXMgb2YgJEokIGFuZCBsZXQgJFMgPSAgKEkgXGN1cCBTX0kpIFxjYXAgKEogXGN1cCBTX0opJC4gIEZ1cnRoZXJtb3JlLCB3ZSBkZWZpbmUgJFNfbiA9IFx7VCB8IFQgXGluIFMgIFx3ZWRnZSBkZXB0aChUKSA9blx9JCBmb3IgYW55IGZpbml0ZSAkbiQgJSwgYW5kICRrPW1heChkZXB0aChUXzEpLCBcbGRvdHMsIGRlcHRoKFRfbSkpLCBUX2kgXGluIFMsIGkgXGluIDEuLm0kLCAKd2hlcmUgJGRlcHRoKFQpJCBpcyB0aGUgbnVtYmVyIG9mIHN0ZXBzIGluIHRoZSBsb25nZXN0IGluaGVyaXRhbmNlIHBhdGggZnJvbSAkVCQgdG8gXGNvZGV7T2JqZWN0fS4gTGV0ICRxJCBiZSB0aGUgbGFyZ2VzdCBudW1iZXIgc3VjaCB0aGF0ICRTX3EkIGhhcyBjYXJkaW5hbGl0eSBvbmUuIFRoZSBsZWFzdCB1cHBlciBib3VuZCBvZiAkSSQgYW5kICRKJCBpcyB0aGUgc29sZSBlbGVtZW50IG9mICAkU19xJC4KClRoZSBsZWFzdCB1cHBlciBib3VuZCBvZiBcRFlOQU1JQ3t9IGFuZCBhbnkgdHlwZSAkVCQgaXMgXERZTkFNSUN7fS4KVGhlIGxlYXN0IHVwcGVyIGJvdW5kIG9mIFxWT0lEe30gYW5kIGFueSB0eXBlICRUIFxuZSBcRFlOQU1JQ3t9JCBpcyBcVk9JRHt9LgpMZXQgJFUkIGJlIGEgdHlwZSB2YXJpYWJsZSB3aXRoIHVwcGVyIGJvdW5kICRCJC4gVGhlIGxlYXN0IHVwcGVyIGJvdW5kIG9mICRVJCBhbmQgYSB0eXBlICRUJCBpcyB0aGUgbGVhc3QgdXBwZXIgYm91bmQgb2YgJEIkIGFuZCAkVCQuIAoKVGhlIGxlYXN0IHVwcGVyIGJvdW5kIHJlbGF0aW9uIGlzIHN5bW1ldHJpYyBhbmQgcmVmbGV4aXZlLgoKJSBGdW5jdGlvbiB0eXBlcwoKVGhlIGxlYXN0IHVwcGVyIGJvdW5kIG9mIGEgZnVuY3Rpb24gdHlwZSBhbmQgYW4gaW50ZXJmYWNlIHR5cGUgJFQkIGlzIHRoZSBsZWFzdCB1cHBlciBib3VuZCBvZiBcY2R7RnVuY3Rpb259IGFuZCAkVCQuCkxldCAkRiQgYW5kICRHJCBiZSBmdW5jdGlvbiB0eXBlcy4gSWYgJEYkIGFuZCAkRyQgZGlmZmVyIGluIHRoZWlyIG51bWJlciBvZiByZXF1aXJlZCBwYXJhbWV0ZXJzLCB0aGVuIHRoZSBsZWFzdCB1cHBlciBib3VuZCBvZiAkRiQgYW5kICRHJCBpcyBcY2R7RnVuY3Rpb259LiAgT3RoZXJ3aXNlOgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gSWYgCgokRj0gKFRfMSBcbGRvdHMgVF9yLCBbVF97cisxfSwgXGxkb3RzLCBUX25dKSBcbG9uZ3JpZ2h0YXJyb3cgVF8wJCwgCgokRz0gKFNfMSBcbGRvdHMgU19yLCBbU197cisxfSwgXGxkb3RzLCBTX2tdKSBcbG9uZ3JpZ2h0YXJyb3cgU18wJCAKCndoZXJlICRrIFxsZSBuJCB0aGVuIHRoZSBsZWFzdCB1cHBlciBib3VuZCBvZiAkRiQgYW5kICRHJCBpcyAKCiQoTF8xIFxsZG90cyBMX3IsIFtMX3tyKzF9LCBcbGRvdHMsIExfa10pIFxsb25ncmlnaHRhcnJvdyBMXzAkIAoKd2hlcmUgJExfaSQgaXMgdGhlIGxlYXN0IHVwcGVyIGJvdW5kIG9mICRUX2kkIGFuZCAkU19pLCBpIFxpbiAwLi5rJC4KXGl0ZW0gSWYgCgokRj0gKFRfMSBcbGRvdHMgVF9yLCBbVF97cisxfSwgXGxkb3RzLCBUX25dKSBcbG9uZ3JpZ2h0YXJyb3cgVF8wJCwKCiRHPSAoU18xIFxsZG90cyBTX3IsIFx7IFxsZG90cyBcfSkgXGxvbmdyaWdodGFycm93IFNfMCQgCgp0aGVuIHRoZSBsZWFzdCB1cHBlciBib3VuZCBvZiAkRiQgYW5kICRHJCBpcyAKCiQoTF8xIFxsZG90cyBMX3IpIFxsb25ncmlnaHRhcnJvdyBMXzAkIAoKd2hlcmUgJExfaSQgCmlzIHRoZSBsZWFzdCB1cHBlciBib3VuZCBvZiAkVF9pJCBhbmQgJFNfaSwgaSBcaW4gMC4uciQuClxpdGVtIElmIAoKJEY9IChUXzEgXGxkb3RzIFRfciwgXHtUX3tyKzF9JCAgJHBfe3IrMX0sIFxsZG90cywgVF9mJCAkcF9mXH0pIFxsb25ncmlnaHRhcnJvdyBUXzAkLCAgCgokRz0gKFNfMSBcbGRvdHMgU19yLCBceyBTX3tyKzF9JCAgJHFfe3IrMX0sIFxsZG90cywgU19nJCAkcV9nXH0pIFxsb25ncmlnaHRhcnJvdyBTXzAkIAoKdGhlbiBsZXQgJFx7eF9tLCBcbGRvdHMgeF9uXH0gID0gXHtwX3tyKzF9LCBcbGRvdHMsIHBfZlx9IFxjYXAgXHtxX3tyKzF9LCBcbGRvdHMsIHFfZ1x9JCBhbmQgbGV0ICRYX2okIGJlIHRoZSBsZWFzdCB1cHBlciBib3VuZCBvZiB0aGUgdHlwZXMgb2YgJHhfaiQgaW4gJEYkIGFuZCAkRywgaiBcaW4gbS4ubiQuIFRoZW4KdGhlIGxlYXN0IHVwcGVyIGJvdW5kIG9mICRGJCBhbmQgJEckIGlzCgokKExfMSBcbGRvdHMgTF9yLCBceyBYX20kICR4X20sIFxsZG90cywgWF9uJCAkeF9uXH0pIFxsb25ncmlnaHRhcnJvdyBMXzAkIAoKd2hlcmUgJExfaSQgaXMgdGhlIGxlYXN0IHVwcGVyIGJvdW5kIG9mICRUX2kkIGFuZCAkU19pLCBpIFxpbiAwLi5yJCAKXGVuZHtpdGVtaXplfQoKClxzZWN0aW9ue1JlZmVyZW5jZX0KXGxhYmVse3JlZmVyZW5jZX0KClxzdWJzZWN0aW9ue0xleGljYWwgUnVsZXN9ClxsYWJlbHtsZXhpY2FsUnVsZXN9CgpEYXJ0IHNvdXJjZSB0ZXh0IGlzIHJlcHJlc2VudGVkIGFzIGEgc2VxdWVuY2Ugb2YgVW5pY29kZSBjb2RlIHBvaW50cy4gIFRoaXMgc2VxdWVuY2UgaXMgZmlyc3QgY29udmVydGVkIGludG8gYSBzZXF1ZW5jZSBvZiB0b2tlbnMgYWNjb3JkaW5nIHRvIHRoZSBsZXhpY2FsIHJ1bGVzIGdpdmVuIGluIHRoaXMgc3BlY2lmaWNhdGlvbi4gIEF0IGFueSBwb2ludCBpbiB0aGUgdG9rZW5pemF0aW9uIHByb2Nlc3MsIHRoZSBsb25nZXN0IHBvc3NpYmxlIHRva2VuIGlzIHJlY29nbml6ZWQuCgpcc3Vic3Vic2VjdGlvbntSZXNlcnZlZCBXb3Jkc30gClxsYWJlbHtyZXNlcnZlZFdvcmRzfQoKQSB7XGVtIHJlc2VydmVkIHdvcmR9IG1heSBub3QgYmUgdXNlZCBhcyBhbiBpZGVudGlmaWVyOyBpdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBhIHJlc2VydmVkIHdvcmQgaXMgdXNlZCB3aGVyZSBhbiBpZGVudGlmaWVyIGlzIGV4cGVjdGVkLgoKXEFTU0VSVHt9LCBcQlJFQUt7fSwgXENBU0V7fSwgXENBVENIe30sIFxDTEFTU3t9LCBcQ09OU1R7fSwgXENPTlRJTlVFe30sIFxERUZBVUxUe30sIFxET3t9LCBcRUxTRXt9LCBcRU5VTXt9LCBcRVhURU5EU3t9LCBcRkFMU0V7fSwgXEZJTkFMe30sIFxGSU5BTExZe30sIFxGT1J7fSwgXElGe30sIFxJTnt9LCBcSVN7fSwgXE5FV3t9LCBcTlVMTHt9LCBcUkVUSFJPVywgXFJFVFVSTnt9LCBcU1VQRVJ7fSwgXFNXSVRDSHt9LCBcVEhJU3t9LCBcVEhST1d7fSwgXFRSVUV7fSwgXFRSWXt9LCBcVkFSe30sIFxWT0lEe30sIFxXSElMRXt9LCBcV0lUSHt9LgoKCgolXFF7VW5pY29kZSBjaGFyYWN0ZXJzLn0KClxiZWdpbntncmFtbWFyfQoge1xiZiBMRVRURVI6fWBhJyB7XGVzY2FwZWdyYW1tYXIgLi59IGB6JzsKICAgICBgQScge1xlc2NhcGVncmFtbWFyIC4ufWBaJwogICAgLgoKe1xiZiBESUdJVDp9CiAgICAgIGAwJyB7XGVzY2FwZWdyYW1tYXIgLi59IGA5JwogICAgLgoKe1xiZiBXSElURVNQQUNFOn0KICAgICAgKGAkXGJhY2tzbGFzaCR0JyAkfCQgYCAnICR8JCBORVdMSU5FKSsKICAgIC4KXGVuZHtncmFtbWFyfQoKXHN1YnN1YnNlY3Rpb257Q29tbWVudHN9ClxsYWJlbHtjb21tZW50c30KCntcZW0gQ29tbWVudHN9IGFyZSBzZWN0aW9ucyBvZiBwcm9ncmFtIHRleHQgdGhhdCBhcmUgdXNlZCBmb3IgZG9jdW1lbnRhdGlvbi4KClxiZWdpbntncmFtbWFyfXtcYmYgU0lOR0xFXF9MSU5FXF9DT01NRU5UOn0KICAgICAgYC8vJyBcfnt9KE5FV0xJTkUpKiAoTkVXTElORSk/CiAgICAuCgp7XGJmIE1VTFRJXF9MSU5FXF9DT01NRU5UOn0KICAgICAgYC8qJyAoTVVMVElcX0xJTkVcX0NPTU1FTlQgJHwkIFx+e30gYCovJykqIGAqLycKICAgIC4KIFxlbmR7Z3JhbW1hcn0KICAKRGFydCBzdXBwb3J0cyBib3RoIHNpbmdsZS1saW5lIGFuZCBtdWx0aS1saW5lIGNvbW1lbnRzLiBBIHtcZW0gc2luZ2xlIGxpbmUgY29tbWVudH0gYmVnaW5zIHdpdGggdGhlIHRva2VuIFxjb2Rley8vfS4gRXZlcnl0aGluZyBiZXR3ZWVuIFxjb2Rley8vfSBhbmQgdGhlIGVuZCBvZiBsaW5lIG11c3QgYmUgaWdub3JlZCBieSB0aGUgRGFydCBjb21waWxlciB1bmxlc3MgdGhlIGNvbW1lbnQgaXMgYSBkb2N1bWVudGF0aW9uIGNvbW1lbnQuIC4gCgpBIHtcZW0gbXVsdGktbGluZSBjb21tZW50fSBiZWdpbnMgd2l0aCB0aGUgdG9rZW4gXGNvZGV7Lyp9IGFuZCBlbmRzIHdpdGggdGhlIHRva2VuIFxjb2RleyovfS4gIEV2ZXJ5dGhpbmcgYmV0d2VlbiBcY29kZXsvfSogYW5kIFxjb2Rleyp9LyBtdXN0IGJlIGlnbm9yZWQgYnkgdGhlIERhcnQgY29tcGlsZXIgdW5sZXNzIHRoZSBjb21tZW50IGlzIGEgZG9jdW1lbnRhdGlvbiBjb21tZW50LiBDb21tZW50cyBtYXkgbmVzdC4gCgp7XGVtIERvY3VtZW50YXRpb24gY29tbWVudHN9IGFyZSBjb21tZW50cyB0aGF0IGJlZ2luIHdpdGggdGhlIHRva2VucyAgXGNvZGV7Ly8vfSBvciAgXGNvZGV7LyoqfS4gRG9jdW1lbnRhdGlvbiBjb21tZW50cyBhcmUgaW50ZW5kZWQgdG8gYmUgcHJvY2Vzc2VkIGJ5IGEgdG9vbCB0aGF0IHByb2R1Y2VzIGh1bWFuIHJlYWRhYmxlIGRvY3VtZW50YXRpb24uIAoKVGhlIHNjb3BlIG9mIGEgZG9jdW1lbnRhdGlvbiBjb21tZW50ICBhbHdheXMgZXhjbHVkZXMgdGhlIGltcG9ydGVkIG5hbWVzcGFjZSBvZiB0aGUgZW5jbG9zaW5nIGxpYnJhcnkuIE9ubHkgbmFtZXMgZGVjbGFyZWQgaW4gdGhlIGVuY2xvc2luZyBsaWJyYXJ5IGFyZSBjb25zaWRlcmVkIGluIHNjb3BlIHdpdGhpbiBhIGRvY3VtZW50YXRpb24gY29tbWVudC4KClRoZSBzY29wZSBvZiBhIGRvY3VtZW50YXRpb24gY29tbWVudCBpbW1lZGlhdGVseSBwcmVjZWRpbmcgdGhlIGRlY2xhcmF0aW9uIG9mIGEgY2xhc3MgJEMkIGlzIHRoZSBpbnN0YW5jZSBzY29wZSBvZiAkQyQsIGV4Y2x1ZGluZyBhbnkgbmFtZXMgaW50cm9kdWNlZCB2aWEgdGhlIGltcG9ydCBuYW1lc3BhY2Ugb2YgdGhlIGVuY2xvc2luZyBsaWJyYXJ5LgoKVGhlIHNjb3BlIG9mIGEgZG9jdW1lbnRhdGlvbiBjb21tZW50IGltbWVkaWF0ZWx5IHByZWNlZGluZyB0aGUgZGVjbGFyYXRpb24gb2YgYSBmdW5jdGlvbiAkZiQgIGlzIHRoZSAgc2NvcGUgaW4gZm9yY2UgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHRoZSBib2R5IG9mICRmJCwgIGV4Y2x1ZGluZyBhbnkgbmFtZXMgaW50cm9kdWNlZCB2aWEgdGhlIGltcG9ydCBuYW1lc3BhY2Ugb2YgdGhlIGVuY2xvc2luZyBsaWJyYXJ5LgoKCgoKCiVcc3Vic2VjdGlvbntHcmFtbWFyfQpcc3Vic2VjdGlvbntPcGVyYXRvciBQcmVjZWRlbmNlfQpcbGFiZWx7b3BlcmF0b3JQcmVjZWRlbmNlfQoKT3BlcmF0b3IgcHJlY2VkZW5jZSBpcyBnaXZlbiBpbXBsaWNpdGx5IGJ5IHRoZSBncmFtbWFyLgoKXGNvbW1lbnRhcnl7VGhlIGZvbGxvd2luZyBub24tbm9ybWF0aXZlIHRhYmxlIG1heSBiZSBoZWxwZnVsClxuZXdsaW5lCgpcYmVnaW57dGFidWxhcn17fCByIHwgciB8IHIgfCByIHx9ClxobGluZQpEZXNjcmlwdGlvbiAmICBPcGVyYXRvciAmIEFzc29jaWF0aXZpdHkgJiBQcmVjZWRlbmNlIFxcIApcaGxpbmUKVW5hcnkgcG9zdGZpeCAmICAuLCBlKyssIGUtLSwgZTFbZTJdLCBlMSgpICwgKCkgJiBOb25lICYgMTUgXFwKXGhsaW5lClVuYXJ5IHByZWZpeCAmIC1lLCAhZSwgXH57fWUsICsrZSwgLS1lICYgTm9uZSAmIDE0XFwKXGhsaW5lCk11bHRpcGxpY2F0aXZlICYgKiwgLywgXH4vLCAgXCUgICYgTGVmdCAmIDEzXFwKXGhsaW5lCkFkZGl0aXZlICYgKywgLSAmIExlZnQgJiAxMlxcClxobGluZSAKU2hpZnQgJiAgJDw8JCwgJD4+JCYgIExlZnQgJiAxMVxcClxobGluZQpCaXR3aXNlIEFORCAmIFwmICYgTGVmdCAmIDEwXFwKXGhsaW5lCkJpdHdpc2UgWE9SICYgXF57fSAmIExlZnQgJiA5XFwKXGhsaW5lCkJpdHdpc2UgT3IgJiAgJHwkICYgTGVmdCAmIDhcXApcaGxpbmUKUmVsYXRpb25hbCAmICQ8JCwgJD4kLCAkPD0kLCAkPj0kLCBcQVN7fSwgXElTe30sIFxJU3t9ISAmICBOb25lICYgN1xcClxobGluZQpFcXVhbGl0eSAmICA9PSwgIT0gJiBOb25lICYgNlxcClxobGluZQpMb2dpY2FsIEFORCAmIFwmXCYgJiBMZWZ0ICYgNVxcClxobGluZQpMb2dpY2FsIE9yICYgICR8fCQgJiBMZWZ0ICYgNFxcClxobGluZQpDb25kaXRpb25hbCAmICBlMT8gZTI6IGUzICYgTm9uZSAmIDNcXApcaGxpbmUKQ2FzY2FkZSAmIC4uICAmIExlZnQgJiAyXFwKXGhsaW5lCkFzc2lnbm1lbnQgJiAgPSwgKj0sIC89LCArPSwgLT0gLFwmPSwgXF57fT0gZXRjLiAgJiAgUmlnaHQgJiAgMVxcClxobGluZQpcZW5ke3RhYnVsYXJ9Cn0KJVxzdWJzZWN0aW9ue0dsb3NzYXJ5fQoKJVxiaWJsaW9ncmFwaHlzdHlsZXthbHBoYX0KJVxiaWJsaW9ncmFwaHl7L3VzZXJzL2dpbGFkL3Jlc2VhcmNoL2JpYnMvbWFzdGVyfQpcc2VjdGlvbip7QXBwZW5kaXg6IE5hbWluZyBDb252ZW50aW9uc30KClxjb21tZW50YXJ5ewpUaGUgZm9sbG93aW5nIG5hbWluZyBjb252ZW50aW9ucyBhcmUgY3VzdG9tYXJ5IGluIERhcnQgcHJvZ3JhbXMuIApcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gVGhlIG5hbWVzIG9mIGNvbXBpbGUgdGltZSBjb25zdGFudCB2YXJpYWJsZXMgbmV2ZXIgdXNlIGxvd2VyIGNhc2UgbGV0dGVycy4gSWYgdGhleSBjb25zaXN0IG9mIG11bHRpcGxlIHdvcmRzLCB0aG9zZSB3b3JkcyBhcmUgc2VwYXJhdGVkIGJ5IHVuZGVyc2NvcmVzLiBFeGFtcGxlczogUEksICBJXF9BTVxfQVxfQ09OU1RBTlQuClxpdGVtIFRoZSBuYW1lcyBvZiBmdW5jdGlvbnMgKGluY2x1ZGluZyBnZXR0ZXJzLCBzZXR0ZXJzLCBtZXRob2RzIGFuZCBsb2NhbCBvciBsaWJyYXJ5IGZ1bmN0aW9ucykgYW5kIG5vbi1jb25zdGFudCB2YXJpYWJsZXMgYmVnaW4gd2l0aCBhIGxvd2VyY2FzZSBsZXR0ZXIuIElmIHRoZSBuYW1lIGNvbnNpc3RzIG9mIG11bHRpcGxlIHdvcmRzLCBlYWNoICB3b3JkIChleGNlcHQgdGhlIGZpcnN0KSBiZWdpbnMgd2l0aCBhbiB1cHBlcmNhc2UgbGV0dGVyLiAgTm8gb3RoZXIgdXBwZXJjYXNlIGxldHRlcnMgYXJlIHVzZWQuIEV4YW1wbGVzOiBjYW1sQ2FzZSwgZGFydDRUaGVXb3JsZApcaXRlbSBUaGUgbmFtZXMgb2YgdHlwZXMgKGluY2x1ZGluZyBjbGFzc2VzIGFuZCB0eXBlIGFsaWFzZXMpIGJlZ2luIHdpdGggYW4gdXBwZXIgY2FzZSBsZXR0ZXIuICBJZiB0aGUgbmFtZSBjb25zaXN0cyBvZiBtdWx0aXBsZSB3b3JkcywgZWFjaCAgd29yZCAgYmVnaW5zIHdpdGggYW4gdXBwZXJjYXNlIGxldHRlci4gIE5vIG90aGVyIHVwcGVyY2FzZSBsZXR0ZXJzIGFyZSB1c2VkLiBFeGFtcGxlczogQ2FtbENhc2UsIERhcnQ0VGhlV29ybGQuClxpdGVtIFRoZSBuYW1lcyBvZiB0eXBlIHZhcmlhYmxlcyBhcmUgc2hvcnQgKHByZWZlcmFibHkgc2luZ2xlIGxldHRlcikuIEV4YW1wbGVzOiBULCBTLCBLLCBWICwgRS4KXGl0ZW0gVGhlIG5hbWVzIG9mIGxpYnJhcmllcyBvciBsaWJyYXJ5IHByZWZpeGVzIG5ldmVyIHVzZSB1cHBlciBjYXNlIGxldHRlcnMuIElmIHRoZXkgY29uc2lzdCBvZiBtdWx0aXBsZSB3b3JkcywgdGhvc2Ugd29yZHMgYXJlIHNlcGFyYXRlZCBieSB1bmRlcnNjb3Jlcy4gRXhhbXBsZTogbXlcX2Zhdm9yaXRlXF9saWJyYXJ5LgpcZW5ke2l0ZW1pemV9Cn0KCgpcZW5ke2RvY3VtZW50fQo=