XGRvY3VtZW50Y2xhc3N7YXJ0aWNsZX0KXHVzZXBhY2thZ2V7ZXBzZmlnfQpcdXNlcGFja2FnZXtkYXJ0fQpcdXNlcGFja2FnZXtibmZ9Clx1c2VwYWNrYWdle2h5cGVycmVmfQpcbmV3Y29tbWFuZHtcY29kZX1bMV17e1xzZiAjMX19Clx0aXRsZXtEYXJ0IFByb2dyYW1taW5nIExhbmd1YWdlICBTcGVjaWZpY2F0aW9uIFxcCntcbGFyZ2UgVmVyc2lvbiAxLjZ9fQolXGF1dGhvcntUaGUgRGFydCBUZWFtfQpcYmVnaW57ZG9jdW1lbnR9ClxtYWtldGl0bGUKXHRhYmxlb2Zjb250ZW50cwoKClxuZXdwYWdlCgpccGFnZXN0eWxle215aGVhZGluZ3N9ClxtYXJrcmlnaHR7RGFydCBQcm9ncmFtbWluZyBMYW5ndWFnZSBTcGVjaWZpY2F0aW9ufQoKJSBiZWdpbiBFY21hIGJvaWxlcnBsYXRlClxzZWN0aW9ue1Njb3BlfQpcbGFiZWx7ZWNtYVNjb3BlfQoKVGhpcyBFY21hIHN0YW5kYXJkIHNwZWNpZmllcyB0aGUgc3ludGF4IGFuZCBzZW1hbnRpY3Mgb2YgdGhlIERhcnQgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuICBJdCBkb2VzIG5vdCBzcGVjaWZ5IHRoZSBBUElzIG9mIHRoZSBEYXJ0IGxpYnJhcmllcyBleGNlcHQgd2hlcmUgdGhvc2UgbGlicmFyeSBlbGVtZW50cyBhcmUgZXNzZW50aWFsIHRvIHRoZSBjb3JyZWN0IGZ1bmN0aW9uaW5nIG9mIHRoZSBsYW5ndWFnZSBpdHNlbGYgKGUuZy4sIHRoZSBleGlzdGVuY2Ugb2YgY2xhc3MgXGNke09iamVjdH0gd2l0aCBtZXRob2RzIHN1Y2ggYXMgXGNke25vU3VjaE1ldGhvZH0sIFxjZHtydW50aW1lVHlwZX0pLgoKXHNlY3Rpb257Q29uZm9ybWFuY2V9ClxsYWJlbHtlY21hQ29uZm9ybWFuY2V9CgpBIGNvbmZvcm1pbmcgIGltcGxlbWVudGF0aW9uIG9mIHRoZSBEYXJ0IHByb2dyYW1taW5nIGxhbmd1YWdlIG11c3QgcHJvdmlkZSBhbmQgc3VwcG9ydCBhbGwgdGhlICBBUElzIChsaWJyYXJpZXMsIHR5cGVzLCBmdW5jdGlvbnMsIGdldHRlcnMsIHNldHRlcnMsIHdoZXRoZXIgdG9wLWxldmVsLCBzdGF0aWMsIGluc3RhbmNlIG9yIGxvY2FsKSBtYW5kYXRlZCBpbiB0aGlzIHNwZWNpZmljYXRpb24uIAoKQSBjb25mb3JtaW5nIGltcGxlbWVudGF0aW9uIGlzIHBlcm1pdHRlZCB0byBwcm92aWRlIGFkZGl0aW9uYWwgQVBJcywgYnV0IG5vdCBhZGRpdGlvbmFsIHN5bnRheCwgZXhjZXB0IGZvciBleHBlcmltZW50YWwgZmVhdHVyZXMgaW4gc3VwcG9ydCBvZiBlbnVtZXJhdGVkIHR5cGVzIGFuZCBkZWZlcnJlZCBsb2FkaW5nIHdoaWNoIGFyZSBleHBlY3RlZCB0byBiZSBhZGRlZCBpbiB0aGUgbmV4dCByZXZpc2lvbiBvZiB0aGlzIHNwZWNpZmljYXRpb24uCgolIEEgY2xhaW0gb2YgY29uZm9ybWFuY2Ugd2l0aCB0aGlzIEVjbWEgU3RhbmRhcmQgc2hhbGwgc3BlY2lmeT8KClxzZWN0aW9ue05vcm1hdGl2ZSBSZWZlcmVuY2VzfQpcbGFiZWx7ZWNtYU5vcm1hdGl2ZVJlZmVyZW5jZXN9CgpUaGUgZm9sbG93aW5nIHJlZmVyZW5jZWQgZG9jdW1lbnRzIGFyZSBpbmRpc3BlbnNhYmxlIGZvciB0aGUgYXBwbGljYXRpb24gb2YgdGhpcyBkb2N1bWVudC4gRm9yIGRhdGVkIHJlZmVyZW5jZXMsIG9ubHkgdGhlIGVkaXRpb24gY2l0ZWQgYXBwbGllcy4gRm9yIHVuZGF0ZWQgcmVmZXJlbmNlcywgdGhlIGxhdGVzdCBlZGl0aW9uIG9mIHRoZSByZWZlcmVuY2VkIGRvY3VtZW50IChpbmNsdWRpbmcgYW55IGFtZW5kbWVudHMpIGFwcGxpZXMuCgpcYmVnaW57ZW51bWVyYXRlfQpcaXRlbQpUaGUgVW5pY29kZSBTdGFuZGFyZCwgVmVyc2lvbiA1LjAsIGFzIGFtZW5kZWQgYnkgVW5pY29kZSA1LjEuMCwgb3Igc3VjY2Vzc29yLgpcaXRlbQpEYXJ0IEFQSSBSZWZlcmVuY2UsIGh0dHBzOi8vYXBpLmRhcnRsYW5nLm9yZy8KXGVuZHtlbnVtZXJhdGV9CgoKXHNlY3Rpb257VGVybXMgYW5kIERlZmluaXRpb25zfQpcbGFiZWx7ZWNtYVRlcm1zQW5kRGVmaW5pdGlvbnN9CgpUZXJtcyBhbmQgZGVmaW5pdGlvbnMgdXNlZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gYXJlIGdpdmVuIGluIHRoZSBib2R5IG9mIHRoZSBzcGVjaWZpY2F0aW9uIHByb3Blci4gU3VjaCB0ZXJtcyBhcmUgaGlnaGxpZ2h0ZWQgaW4gaXRhbGljcyB3aGVuIHRoZXkgYXJlIGludHJvZHVjZWQsIGUuZy4sIGB3ZSB1c2UgdGhlIHRlcm0ge1xlbSB2ZXJib3NpdHl9IHRvIHJlZmVyIHRvIHRoZSBwcm9wZXJ0eSBvZiBleGNlc3MgdmVyYmlhZ2UnLgolIEVuZCBFY21hIEJvaWxlcnBsYXRlCgogIApcc2VjdGlvbntOb3RhdGlvbn0KXGxhYmVse25vdGF0aW9ufQoKV2UgZGlzdGluZ3Vpc2ggYmV0d2VlbiBub3JtYXRpdmUgYW5kIG5vbi1ub3JtYXRpdmUgdGV4dC4gTm9ybWF0aXZlIHRleHQgZGVmaW5lcyB0aGUgcnVsZXMgb2YgRGFydC4gSXQgaXMgZ2l2ZW4gaW4gdGhpcyBmb250LiBBdCB0aGlzIHRpbWUsIG5vbi1ub3JtYXRpdmUgdGV4dCBpbmNsdWRlczoKXGJlZ2lue2l0ZW1pemV9ClxpdGVtW1JhdGlvbmFsZV0gRGlzY3Vzc2lvbiBvZiB0aGUgbW90aXZhdGlvbiBmb3IgbGFuZ3VhZ2UgZGVzaWduIGRlY2lzaW9ucyBhcHBlYXJzIGluIGl0YWxpY3MuIFxyYXRpb25hbGV7RGlzdGluZ3Vpc2hpbmcgbm9ybWF0aXZlIGZyb20gbm9uLW5vcm1hdGl2ZSBoZWxwcyBjbGFyaWZ5IHdoYXQgcGFydCBvZiB0aGUgdGV4dCBpcyBiaW5kaW5nIGFuZCB3aGF0IHBhcnQgaXMgbWVyZWx5IGV4cG9zaXRvcnkufQpcaXRlbVtDb21tZW50YXJ5XSBDb21tZW50cyBzdWNoIGFzICBgYFxjb21tZW50YXJ5e1RoZSBjYXJlZnVsIHJlYWRlciB3aWxsIGhhdmUgbm90aWNlZCB0aGF0IHRoZSBuYW1lIERhcnQgaGFzIGZvdXIgY2hhcmFjdGVyc30nJyBzZXJ2ZSB0byBpbGx1c3RyYXRlIG9yIGNsYXJpZnkgdGhlIHNwZWNpZmljYXRpb24sIGJ1dCBhcmUgcmVkdW5kYW50IHdpdGggdGhlIG5vcm1hdGl2ZSB0ZXh0LiAgXGNvbW1lbnRhcnl7VGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBjb21tZW50YXJ5IGFuZCByYXRpb25hbGUgY2FuIGJlIHN1YnRsZS59IFxyYXRpb25hbGV7IENvbW1lbnRhcnkgaXMgbW9yZSBnZW5lcmFsIHRoYW4gcmF0aW9uYWxlLCBhbmQgbWF5IGluY2x1ZGUgaWxsdXN0cmF0aXZlIGV4YW1wbGVzIG9yIGNsYXJpZmljYXRpb25zLiB9ClxpdGVtW09wZW4gcXVlc3Rpb25zXSAoXFF7aW4gdGhpcyBmb250fSkuIE9wZW4gcXVlc3Rpb25zIGFyZSBwb2ludHMgdGhhdCBhcmUgdW5zZXR0bGVkIGluIHRoZSBtaW5kIG9mIHRoZSBhdXRob3Iocykgb2YgdGhlIHNwZWNpZmljYXRpb247IGV4cGVjdCB0aGVtICh0aGUgcXVlc3Rpb25zLCBub3QgdGhlIGF1dGhvcnM7IHByZWNpc2lvbiBpcyBpbXBvcnRhbnQgaW4gYSBzcGVjaWZpY2F0aW9uKSB0byBiZSBlbGltaW5hdGVkIGluIHRoZSBmaW5hbCBzcGVjaWZpY2F0aW9uLiBcUXtTaG91bGQgdGhlIHRleHQgYXQgdGhlIGVuZCBvZiB0aGUgcHJldmlvdXMgYnVsbGV0IGJlIHJhdGlvbmFsZSBvciBjb21tZW50YXJ5P30KXGVuZHtpdGVtaXplfQoKUmVzZXJ2ZWQgd29yZHMgYW5kIGJ1aWx0LWluIGlkZW50aWZpZXJzICAoXHJlZntpZGVudGlmaWVyUmVmZXJlbmNlfSkgYXBwZWFyIGluIHtcYmYgYm9sZH0uCgpcY29tbWVudGFyeXsKRXhhbXBsZXMgd291bGQgYmUgXFNXSVRDSHt9IG9yIFxDTEFTU3t9Lgp9CgoKR3JhbW1hciBwcm9kdWN0aW9ucyBhcmUgZ2l2ZW4gaW4gYSBjb21tb24gdmFyaWFudCBvZiBFQk5GLiAgVGhlIGxlZnQgaGFuZCBzaWRlIG9mIGEgcHJvZHVjdGlvbiBlbmRzIHdpdGggYSBjb2xvbi4gIE9uIHRoZSByaWdodCBoYW5kIHNpZGUsIGFsdGVybmF0aW9uIGlzIHJlcHJlc2VudGVkIGJ5IHZlcnRpY2FsIGJhcnMsIGFuZCBzZXF1ZW5jaW5nIGJ5IHNwYWNpbmcuICBBcyBpbiBQRUdzLCBhbHRlcm5hdGlvbiBnaXZlcyBwcmlvcml0eSB0byB0aGUgbGVmdC4gT3B0aW9uYWwgZWxlbWVudHMgb2YgYSBwcm9kdWN0aW9uIGFyZSBzdWZmaXhlZCBieSBhIHF1ZXN0aW9uIG1hcmsgbGlrZSBzbzogXGNvZGV7YW5FbGVwaGFudD99LiAgQXBwZW5kaW5nIGEgc3RhciB0byBhbiBlbGVtZW50IG9mIGEgcHJvZHVjdGlvbiBtZWFucyBpdCBtYXkgYmUgcmVwZWF0ZWQgemVybyBvciBtb3JlIHRpbWVzLiAgQXBwZW5kaW5nIGEgcGx1cyBzaWduIHRvIGEgcHJvZHVjdGlvbiBtZWFucyBpdCBvY2N1cnMgb25lIG9yIG1vcmUgdGltZXMuIFBhcmVudGhlc2VzIGFyZSB1c2VkIGZvciBncm91cGluZy4gTmVnYXRpb24gIGlzIHJlcHJlc2VudGVkIGJ5IHByZWZpeGluZyBhbiBlbGVtZW50IG9mIGEgcHJvZHVjdGlvbiB3aXRoIGEgdGlsZGUuIE5lZ2F0aW9uIGlzIHNpbWlsYXIgdG8gdGhlIG5vdCBjb21iaW5hdG9yIG9mIFBFR3MsIGJ1dCBpdCBjb25zdW1lcyBpbnB1dCBpZiBpdCBtYXRjaGVzLiBJbiB0aGUgY29udGV4dCBvZiBhIGxleGljYWwgcHJvZHVjdGlvbiBpdCBjb25zdW1lcyBhIHNpbmdsZSBjaGFyYWN0ZXIgaWYgdGhlcmUgaXMgb25lOyAgb3RoZXJ3aXNlLCBhIHNpbmdsZSB0b2tlbiBpZiB0aGVyZSBpcyBvbmUuCgpcY29tbWVudGFyeXsgQW4gZXhhbXBsZSB3b3VsZCBiZTp9CgpcYmVnaW57Z3JhbW1hcn0Ke1xzZgp7XGJmIEFQcm9kdWN0aW9uOn1BbkFsdGVybmF0aXZlOwogICAgQW5vdGhlckFsdGVybmF0aXZlOwogICAgT25lVGhpbmcgQWZ0ZXIgQW5vdGhlcjsKICAgIFplcm9Pck1vcmVUaGluZ3MqOwogICAgT25lT3JNb3JlVGhpbmdzKzsKICAgIEFuT3B0aW9uYWxUaGluZz87CiAgICAoU29tZSBHcm91cGVkIFRoaW5ncyk7CiAgICBcfnt9Tm90QVRoaW5nOwogICAgQVxfTEVYSUNBTFxfVEhJTkcKICAgIC4KICAgIH0KXGVuZHtncmFtbWFyfQoKJSBuZWVkIGEgbWF0Y2ggYW55dGhpbmcgb3IgYSBwcm9kdWN0aW9uIHRoYXQgZG9lcyB0aGF0LCBzbyB3ZSBjYW4gY29ycmVjdCBidWdzIHdydCB1c2UKJSB+LiB+IGRvZXMgbm90IGFjdHVhbGx5IHBhcnNlIHN0dWZmIC0gaXQganVzdCBsb29rcyBhaGVhZCBhbmQgY2hlY2tzLiBUbyBnZXQgdGhlIGVmZmVjdCBvZgolIHBhcnNpbmcgYW55dGhpbmcgYnV0IFgsIG9uZSBuZWVkcyB+WCBBTllUSElORywgbm90IGp1c3QgflguIFRoZXJlIGFyZSBidWdzIGluIHRoZQolIGdyYW1tYXIgcmVsYXRlZCB0byB0aGlzLiAKJSBUaGUgYWx0ZXJuYXRpdmUgaXMgdG8gZGVmaW5lIH5YIGFzIGFueXRoaW5nIGJ1dCBYLCBvciB0byBpbnRyb2R1Y2UgYW4gYW50aGluZ0J1dChYKSAKJSBjb21iaW5hdG9yLCBzdWNoIGFzICFYCgpCb3RoIHN5bnRhY3RpYyBhbmQgbGV4aWNhbCBwcm9kdWN0aW9ucyBhcmUgcmVwcmVzZW50ZWQgdGhpcyB3YXkuIExleGljYWwgcHJvZHVjdGlvbnMgYXJlIGRpc3Rpbmd1aXNoZWQgYnkgdGhlaXIgbmFtZXMuIFRoZSBuYW1lcyBvZiBsZXhpY2FsIHByb2R1Y3Rpb25zIGNvbnNpc3QgZXhjbHVzaXZlbHkgb2YgdXBwZXIgY2FzZSBjaGFyYWN0ZXJzIGFuZCB1bmRlcnNjb3Jlcy4gIEFzIGFsd2F5cywgd2l0aGluIGdyYW1tYXRpY2FsIHByb2R1Y3Rpb25zLCB3aGl0ZXNwYWNlIGFuZCBjb21tZW50cyBiZXR3ZWVuIGVsZW1lbnRzIG9mIHRoZSBwcm9kdWN0aW9uIGFyZSBpbXBsaWNpdGx5IGlnbm9yZWQgdW5sZXNzIHN0YXRlZCBvdGhlcndpc2UuIApQdW5jdHVhdGlvbiB0b2tlbnMgYXBwZWFyIGluIHF1b3Rlcy4gCgpQcm9kdWN0aW9ucyBhcmUgZW1iZWRkZWQsIGFzIG11Y2ggYXMgcG9zc2libGUsIGluIHRoZSBkaXNjdXNzaW9uIG9mIHRoZSBjb25zdHJ1Y3RzIHRoZXkgcmVwcmVzZW50LiAKCkEgbGlzdCAkeF8xLCBcbGRvdHMsIHhfbiQgZGVub3RlcyBhbnkgbGlzdCBvZiAkbiQgZWxlbWVudHMgb2YgdGhlIGZvcm0gJHhfaSwgMSBcbGUgaSBcbGUgbiQuIE5vdGUgdGhhdCAkbiQgbWF5IGJlIHplcm8sIGluIHdoaWNoIGNhc2UgdGhlIGxpc3QgaXMgZW1wdHkuIFdlIHVzZSBzdWNoIGxpc3RzIGV4dGVuc2l2ZWx5IHRocm91Z2hvdXQgdGhpcyBzcGVjaWZpY2F0aW9uLgoKVGhlIG5vdGF0aW9uICRbeF8xLCBcbGRvdHMsIHhfbi95XzEsIFxsZG90cywgeV9uXUUkIGRlbm90ZXMgYSBjb3B5IG9mICRFJCBpbiB3aGljaCBhbGwgb2NjdXJyZW5jZXMgb2YgJHlfaSwgMSBcbGUgaSBcbGUgbiQgaGF2ZSBiZWVuIHJlcGxhY2VkIHdpdGggJHhfaSQuCgpXZSBzb21ldGltZXMgYWJ1c2UgbGlzdCBvciBtYXAgbGl0ZXJhbCBzeW50YXgsIHdyaXRpbmcgJFtvXzEsIFxsZG90cywgb19uXSQgIChyZXNwZWN0aXZlbHkgJFx7a18xOiBvXzEsIFxsZG90cywga19uOiBvX25cfSQpIHdoZXJlIHRoZSAkb19pJCBhbmQgJGtfaSQgbWF5IGJlIG9iamVjdHMgcmF0aGVyIHRoYW4gZXhwcmVzc2lvbnMuIFRoZSBpbnRlbnQgaXMgdG8gZGVub3RlIGEgbGlzdCAocmVzcGVjdGl2ZWx5IG1hcCkgb2JqZWN0IHdob3NlIGVsZW1lbnRzIGFyZSB0aGUgJG9faSQgKHJlc3BlY3RpdmVseSwgd2hvc2Uga2V5cyBhcmUgdGhlICRrX2kkIGFuZCB2YWx1ZXMgYXJlIHRoZSAkb19pJCkuCgpUaGUgc3BlY2lmaWNhdGlvbnMgb2Ygb3BlcmF0b3JzIG9mdGVuIGludm9sdmUgc3RhdGVtZW50cyBzdWNoIGFzICR4JCAkb3AkICR5JCBpcyBlcXVpdmFsZW50IHRvIHRoZSBtZXRob2QgaW52b2NhdGlvbiAkeC5vcCh5KSQuIFN1Y2ggc3BlY2lmaWNhdGlvbnMgc2hvdWxkIGJlIHVuZGVyc3Rvb2QgYXMgYSBzaG9ydGhhbmQgZm9yOgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0KICR4JCAkb3AkICR5JCBpcyBlcXVpdmFsZW50IHRvIHRoZSBtZXRob2QgaW52b2NhdGlvbiAkeC5vcF5ccHJpbWUoeSkkLCBhc3N1bWluZyB0aGUgY2xhc3Mgb2YgJHgkIGFjdHVhbGx5IGRlY2xhcmVkIGEgbm9uLW9wZXJhdG9yIG1ldGhvZCBuYW1lZCAkb3BeXHByaW1lJCBkZWZpbmluZyB0aGUgc2FtZSBmdW5jdGlvbiBhcyB0aGUgb3BlcmF0b3IgJG9wJC4gCiBcZW5ke2l0ZW1pemV9CiAKIFxyYXRpb25hbGV7VGhpcyBjaXJjdW1sb2N1dGlvbiBpcyByZXF1aXJlZCBiZWNhdXNlIHgub3AoeSksIHdoZXJlIG9wIGlzIGFuIG9wZXJhdG9yLCBpcyBub3QgbGVnYWwgc3ludGF4LiBIb3dldmVyLCBpdCBpcyBwYWluZnVsbHkgdmVyYm9zZSwgYW5kIHdlIHByZWZlciB0byBzdGF0ZSB0aGlzIHJ1bGUgb25jZSBoZXJlLCBhbmQgdXNlIGEgY29uY2lzZSBhbmQgY2xlYXIgbm90YXRpb24gYWNyb3NzIHRoZSBzcGVjaWZpY2F0aW9uLgogfQoKV2hlbiB0aGUgc3BlY2lmaWNhdGlvbiByZWZlcnMgdG8gdGhlIG9yZGVyIGdpdmVuIGluIHRoZSBwcm9ncmFtLCBpdCBtZWFucyB0aGUgb3JkZXIgb2YgdGhlIHByb2dyYW0gc291cmNlIGNvZGUgdGV4dCwgc2Nhbm5pbmcgbGVmdC10by1yaWdodCBhbmQgdG9wLXRvLWJvdHRvbS4KClJlZmVyZW5jZXMgdG8gb3RoZXJ3aXNlIHVuc3BlY2lmaWVkIG5hbWVzIG9mIHByb2dyYW0gZW50aXRpZXMgKHN1Y2ggYXMgY2xhc3NlcyBvciBmdW5jdGlvbnMpIGFyZSBpbnRlcnByZXRlZCBhcyB0aGUgbmFtZXMgb2YgbWVtYmVycyBvZiB0aGUgRGFydCBjb3JlIGxpYnJhcnkuCgpcY29tbWVudGFyeXsKRXhhbXBsZXMgd291bGQgYmUgdGhlIGNsYXNzZXMgXGNvZGV7T2JqZWN0fSBhbmQgXGNvZGV7VHlwZX0gcmVwcmVzZW50aW5nIHRoZSByb290IG9mIHRoZSBjbGFzcyBoaWVyYXJjaHkgYW5kIHRoZSByZWlmaWNhdGlvbiBvZiBydW50aW1lIHR5cGVzIHJlc3BlY3RpdmVseS4gCn0KClxzZWN0aW9ue092ZXJ2aWV3fQpcbGFiZWx7b3ZlcnZpZXd9CgpEYXJ0IGlzIGEgY2xhc3MtYmFzZWQsIHNpbmdsZS1pbmhlcml0YW5jZSwgcHVyZSBvYmplY3Qtb3JpZW50ZWQgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuIERhcnQgaXMgb3B0aW9uYWxseSB0eXBlZCAoXHJlZnt0eXBlc30pIGFuZCBzdXBwb3J0cyByZWlmaWVkIGdlbmVyaWNzLiBUaGUgcnVuLXRpbWUgdHlwZSBvZiBldmVyeSBvYmplY3QgaXMgcmVwcmVzZW50ZWQgYXMgYW4gaW5zdGFuY2Ugb2YgY2xhc3MgXGNvZGV7VHlwZX0gIHdoaWNoIGNhbiBiZSBvYnRhaW5lZCBieSBjYWxsaW5nIHRoZSBnZXR0ZXIgIFxjb2Rle3J1bnRpbWVUeXBlfSBkZWNsYXJlZCBpbiBjbGFzcyBcY29kZXtPYmplY3R9LCB0aGUgcm9vdCBvZiB0aGUgRGFydCBjbGFzcyBoaWVyYXJjaHkuCgpEYXJ0IHByb2dyYW1zIG1heSBiZSBzdGF0aWNhbGx5IGNoZWNrZWQuIFRoZSBzdGF0aWMgY2hlY2tlciB3aWxsIHJlcG9ydCBzb21lIHZpb2xhdGlvbnMgb2YgdGhlIHR5cGUgcnVsZXMsIGJ1dCBzdWNoIHZpb2xhdGlvbnMgZG8gbm90IGFib3J0IGNvbXBpbGF0aW9uIG9yIHByZWNsdWRlIGV4ZWN1dGlvbi4gCgpEYXJ0IHByb2dyYW1zIG1heSBiZSBleGVjdXRlZCBpbiBvbmUgb2YgdHdvIG1vZGVzOiBwcm9kdWN0aW9uIG1vZGUgb3IgY2hlY2tlZCBtb2RlLiBJbiBwcm9kdWN0aW9uIG1vZGUsIHN0YXRpYyB0eXBlIGFubm90YXRpb25zIChccmVme3N0YXRpY1R5cGVzfSkgaGF2ZSBhYnNvbHV0ZWx5IG5vIGVmZmVjdCBvbiBleGVjdXRpb24gd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHJlZmxlY3Rpb24gYW5kIHN0cnVjdHVyYWwgdHlwZSB0ZXN0cy4gCgpcY29tbWVudGFyeXsKUmVmbGVjdGlvbiwgYnkgZGVmaW5pdGlvbiwgZXhhbWluZXMgdGhlIHByb2dyYW0gc3RydWN0dXJlLiBJZiB3ZSBwcm92aWRlIHJlZmxlY3RpdmUgYWNjZXNzIHRvIHRoZSB0eXBlIG9mIGEgZGVjbGFyYXRpb24sIG9yIHRvIHNvdXJjZSBjb2RlLCBpdCB3aWxsIGluZXZpdGFibHkgcHJvZHVjZSByZXN1bHRzIHRoYXQgZGVwZW5kIG9uIHRoZSB0eXBlcyB1c2VkIGluIHRoZSB1bmRlcmx5aW5nIGNvZGUuCgpUeXBlIHRlc3RzIGFsc28gZXhhbWluZSB0aGUgdHlwZXMgaW4gYSBwcm9ncmFtIGV4cGxpY2l0bHkuIE5ldmVydGhlbGVzcywgaW4gbW9zdCBjYXNlcywgdGhlc2Ugd2lsbCBub3QgZGVwZW5kIG9uIHR5cGUgYW5ub3RhdGlvbnMuIFRoZSBleGNlcHRpb25zIHRvIHRoaXMgcnVsZSBhcmUgdHlwZSB0ZXN0cyBpbnZvbHZpbmcgZnVuY3Rpb24gdHlwZXMuIEZ1bmN0aW9uIHR5cGVzIGFyZSBzdHJ1Y3R1cmFsLCBhbmQgc28gZGVwZW5kIG9uIHRoZSB0eXBlcyBkZWNsYXJlZCBmb3IgdGhlaXIgcGFyYW1ldGVycyBhbmQgb24gdGhlaXIgcmV0dXJuIHR5cGVzLiAKfQoKSW4gY2hlY2tlZCBtb2RlLCBhc3NpZ25tZW50cyBhcmUgZHluYW1pY2FsbHkgY2hlY2tlZCwgYW5kIGNlcnRhaW4gdmlvbGF0aW9ucyBvZiB0aGUgdHlwZSBzeXN0ZW0gcmFpc2UgZXhjZXB0aW9ucyBhdCBydW4gdGltZS4KClxjb21tZW50YXJ5ewpUaGUgY29leGlzdGVuY2UgYmV0d2VlbiBvcHRpb25hbCB0eXBpbmcgYW5kIHJlaWZpY2F0aW9uIGlzIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmc6ClxiZWdpbntlbnVtZXJhdGV9ClxpdGVtIFJlaWZpZWQgdHlwZSBpbmZvcm1hdGlvbiByZWZsZWN0cyB0aGUgdHlwZXMgb2Ygb2JqZWN0cyBhdCBydW50aW1lIGFuZCBtYXkgYWx3YXlzIGJlIHF1ZXJpZWQgYnkgZHluYW1pYyB0eXBlY2hlY2tpbmcgY29uc3RydWN0cyAodGhlIGFuYWxvZ3Mgb2YgaW5zdGFuY2VPZiwgY2FzdHMsIHR5cGVjYXNlIGV0Yy4gaW4gb3RoZXIgbGFuZ3VhZ2VzKS4gUmVpZmllZCB0eXBlIGluZm9ybWF0aW9uIGluY2x1ZGVzIGNsYXNzIGRlY2xhcmF0aW9ucywgdGhlIHJ1bnRpbWUgdHlwZSAoYWthIGNsYXNzKSBvZiBhbiBvYmplY3QsIGFuZCB0eXBlIGFyZ3VtZW50cyB0byBjb25zdHJ1Y3RvcnMuIApcaXRlbSBTdGF0aWMgdHlwZSBhbm5vdGF0aW9ucyBkZXRlcm1pbmUgdGhlIHR5cGVzIG9mIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb24gZGVjbGFyYXRpb25zIChpbmNsdWRpbmcgbWV0aG9kcyBhbmQgY29uc3RydWN0b3JzKS4gClxpdGVtIFByb2R1Y3Rpb24gbW9kZSByZXNwZWN0cyBvcHRpb25hbCB0eXBpbmcuIFN0YXRpYyB0eXBlIGFubm90YXRpb25zIGRvIG5vdCBhZmZlY3QgcnVudGltZSBiZWhhdmlvci4KXGl0ZW0gQ2hlY2tlZCBtb2RlIHV0aWxpemVzIHN0YXRpYyB0eXBlIGFubm90YXRpb25zIGFuZCBkeW5hbWljIHR5cGUgaW5mb3JtYXRpb24gYWdncmVzc2l2ZWx5IHlldCBzZWxlY3RpdmVseSB0byBwcm92aWRlIGVhcmx5IGVycm9yIGRldGVjdGlvbiBkdXJpbmcgZGV2ZWxvcG1lbnQuClxlbmR7ZW51bWVyYXRlfQp9CgpEYXJ0IHByb2dyYW1zIGFyZSBvcmdhbml6ZWQgaW4gYSBtb2R1bGFyIGZhc2hpb24gaW50byB1bml0cyBjYWxsZWQge1xlbSBsaWJyYXJpZXN9IChccmVme2xpYnJhcmllc0FuZFNjcmlwdHN9KS4gTGlicmFyaWVzIGFyZSB1bml0cyBvZiBlbmNhcHN1bGF0aW9uIGFuZCBtYXkgYmUgbXV0dWFsbHkgcmVjdXJzaXZlLiAKClxjb21tZW50YXJ5e0hvd2V2ZXIgdGhleSBhcmUgbm90IGZpcnN0IGNsYXNzLiAgVG8gZ2V0IG11bHRpcGxlIGNvcGllcyBvZiBhIGxpYnJhcnkgcnVubmluZyBzaW11bHRhbmVvdXNseSwgb25lIG5lZWRzIHRvIHNwYXduIGFuIGlzb2xhdGUuIAp9Cgpcc3Vic2VjdGlvbntTY29waW5nfQpcbGFiZWx7c2NvcGluZ30KCkEge1xlbSBuYW1lc3BhY2V9IGlzIGEgbWFwcGluZyBvZiBuYW1lcyBkZW5vdGluZyBkZWNsYXJhdGlvbnMgdG8gYWN0dWFsIGRlY2xhcmF0aW9ucy4gIExldCAkTlMkIGJlIGEgbmFtZXNwYWNlLiBXZSBzYXkgdGhhdCBhIG5hbWUgJG4kIHtcZW0gaXMgaW4gfSROUyQgaWYgJG4kIGlzIGEga2V5IG9mICROUyQuIFdlIHNheSBhIGRlY2xhcmF0aW9uICRkJCB7XGVtIGlzIGluIH0kTlMkIGlmIGEga2V5IG9mICROUyQgbWFwcyB0byAkZCQuCgpBIHNjb3BlICRTXzAkIGluZHVjZXMgYSBuYW1lc3BhY2UgJE5TXzAkIHRoYXQgbWFwcyB0aGUgc2ltcGxlIG5hbWUgb2YgZWFjaCB2YXJpYWJsZSwgdHlwZSBvciBmdW5jdGlvbiBkZWNsYXJhdGlvbiAkZCQgZGVjbGFyZWQgaW4gJFNfMCQgdG8gJGQkLiBMYWJlbHMgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgaW5kdWNlZCBuYW1lc3BhY2Ugb2YgYSBzY29wZTsgaW5zdGVhZCB0aGV5IGhhdmUgdGhlaXIgb3duIGRlZGljYXRlZCBuYW1lc3BhY2UuCgpcY29tbWVudGFyeXtJdCBpcyB0aGVyZWZvcmUgaW1wb3NzaWJsZSwgZS5nLiwgIHRvIGRlZmluZSBhIGNsYXNzIHRoYXQgZGVjbGFyZXMgYSBtZXRob2QgYW5kIGEgZmllbGQgd2l0aCB0aGUgc2FtZSBuYW1lIGluIERhcnQuIFNpbWlsYXJseSBvbmUgY2Fubm90IGRlY2xhcmUgYSB0b3AtbGV2ZWwgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSBuYW1lIGFzIGEgbGlicmFyeSB2YXJpYWJsZSBvciBjbGFzcy4KICB9CiAgCkl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgZW50aXR5IHdpdGggdGhlIHNhbWUgbmFtZSBkZWNsYXJlZCBpbiB0aGUgc2FtZSBzY29wZS4KClxjb21tZW50YXJ5ewpJbiBzb21lIGNhc2VzLCB0aGUgbmFtZSBvZiB0aGUgZGVjbGFyYXRpb24gZGlmZmVycyBmcm9tIHRoZSBpZGVudGlmaWVyIHVzZWQgdG8gZGVjbGFyZSBpdC4gIFNldHRlcnMgaGF2ZSBuYW1lcyB0aGF0IGFyZSBkaXN0aW5jdCBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIGdldHRlcnMgYmVjYXVzZSB0aGV5IGFsd2F5cyBoYXZlIGFuID0gYXV0b21hdGljYWxseSBhZGRlZCBhdCB0aGUgZW5kLCBhbmQgdW5hcnkgbWludXMgaGFzIHRoZSBzcGVjaWFsIG5hbWUgdW5hcnktLgp9CgpEYXJ0IGlzIGxleGljYWxseSBzY29wZWQuICAgIFNjb3BlcyBtYXkgbmVzdC4gIEEgbmFtZSBvciBkZWNsYXJhdGlvbiAkZCQgaXMge1xlbSBhdmFpbGFibGUgaW4gc2NvcGV9ICRTJCBpZiAkZCQgaXMgaW4gdGhlIG5hbWVzcGFjZSBpbmR1Y2VkIGJ5ICRTJCBvciBpZiAkZCQgaXMgYXZhaWxhYmxlIGluIHRoZSBsZXhpY2FsbHkgZW5jbG9zaW5nIHNjb3BlIG9mICRTJC4gV2UgIHNheSB0aGF0IGEgbmFtZSBvciBkZWNsYXJhdGlvbiAkZCQgaXMge1xlbSBpbiBzY29wZX0gaWYgJGQkIGlzIGF2YWlsYWJsZSBpbiB0aGUgY3VycmVudCBzY29wZS4gCgoKSWYgYSAgZGVjbGFyYXRpb24gJGQkIG5hbWVkICRuJCBpcyBpbiB0aGUgbmFtZXNwYWNlIGluZHVjZWQgYnkgYSBzY29wZSAkUyQsIHRoZW4gJGQkIHtcZW0gaGlkZXN9IGFueSBkZWNsYXJhdGlvbiBuYW1lZCAkbiQgdGhhdCBpcyBhdmFpbGFibGUgaW4gdGhlIGxleGljYWxseSBlbmNsb3Npbmcgc2NvcGUgb2YgJFMkLiAKClxjb21tZW50YXJ5IHsKQSBjb25zZXF1ZW5jZSBvZiB0aGVzZSBydWxlcyBpcyB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIGhpZGUgYSB0eXBlIHdpdGggYSBtZXRob2Qgb3IgdmFyaWFibGUuCk5hbWluZyBjb252ZW50aW9ucyB1c3VhbGx5IHByZXZlbnQgc3VjaCBhYnVzZXMuIE5ldmVydGhlbGVzcyx0aGUgZm9sbG93aW5nIHByb2dyYW0gaXMgbGVnYWw6Cn0KClxiZWdpbntkYXJ0Q29kZX0KXENMQVNTe30gSGlnaGx5U3RydW5nIFx7CiAgU3RyaW5nKCkgJD0+JCAiPyI7Clx9ClxlbmR7ZGFydENvZGV9CgpOYW1lcyBtYXkgYmUgaW50cm9kdWNlZCBpbnRvIGEgc2NvcGUgYnkgIGRlY2xhcmF0aW9ucyB3aXRoaW4gdGhlIHNjb3BlIG9yICBieSBvdGhlciBtZWNoYW5pc21zIHN1Y2ggYXMgaW1wb3J0cyBvciBpbmhlcml0YW5jZS4KClxyYXRpb25hbGV7ClRoZSBpbnRlcmFjdGlvbiBvZiBsZXhpY2FsIHNjb3BpbmcgYW5kIGluaGVyaXRhbmNlIGlzIGEgc3VidGxlIG9uZS4gIFVsdGltYXRlbHksIHRoZSBxdWVzdGlvbiBpcyB3aGV0aGVyIGxleGljYWwgc2NvcGluZyB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgaW5oZXJpdGFuY2Ugb3IgdmljZSB2ZXJzYS4gRGFydCBjaG9vc2VzIHRoZSBmb3JtZXIuCgpBbGxvd2luZyBpbmhlcml0ZWQgbmFtZXMgdG8gdGFrZSBwcmVjZWRlbmNlIG92ZXIgbG9jYWxseSBkZWNsYXJlZCBuYW1lcyBjYW4gY3JlYXRlIHVuZXhwZWN0ZWQgc2l0dWF0aW9ucyBhcyBjb2RlIGV2b2x2ZXMuIFNwZWNpZmljYWxseSwgdGhlIGJlaGF2aW9yIG9mIGNvZGUgaW4gYSBzdWJjbGFzcyBjYW4gY2hhbmdlIHdpdGhvdXQgd2FybmluZyAgaWYgYSBuZXcgbmFtZSBpcyBpbnRyb2R1Y2VkIGluIGEgc3VwZXJjbGFzcy4gIENvbnNpZGVyOgp9CgpcYmVnaW57ZGFydENvZGV9ClxMSUJSQVJZe30gTDE7ClxDTEFTU3t9IFMgXHtcfQoKXExJQlJBUll7fSBMMjsKXElNUE9SVHt9IGBMMS5kYXJ0JzsKZm9vKCkgPSQ+JCA0MjsKXENMQVNTe30gQyBcRVhURU5EU3t9IFNceyBiYXIoKSA9JD4kIGZvbygpO1x9ClxlbmR7ZGFydENvZGV9CgpccmF0aW9uYWxle05vdyBhc3N1bWUgYSBtZXRob2QgXGNvZGV7Zm9vKCl9IGlzIGFkZGVkIHRvIFxjb2Rle1N9LiB9CgpcYmVnaW57ZGFydENvZGV9ClxMSUJSQVJZe30gTDE7ClxDTEFTU3t9IFMgXHtmb28oKSA9JD4kIDkxO1x9ClxlbmR7ZGFydENvZGV9CgpccmF0aW9uYWxlewpJZiBpbmhlcml0YW5jZSB0b29rIHByZWNlZGVuY2Ugb3ZlciB0aGUgbGV4aWNhbCBzY29wZSwgdGhlIGJlaGF2aW9yIG9mIFxjb2Rle0N9IHdvdWxkIGNoYW5nZSBpbiBhbiB1bmV4cGVjdGVkIHdheS4gTmVpdGhlciB0aGUgYXV0aG9yIG9mIFxjb2Rle1N9IG5vciB0aGUgYXV0aG9yIG9mIFxjb2Rle0N9IGFyZSBuZWNlc3NhcmlseSBhd2FyZSBvZiB0aGlzLiBJbiBEYXJ0LCBpZiB0aGVyZSBpcyBhIGxleGljYWxseSB2aXNpYmxlIG1ldGhvZCBcY29kZXtmb28oKX0sIGl0IHdpbGwgYWx3YXlzIGJlIGNhbGxlZC4KCk5vdyBjb25zaWRlciB0aGUgb3Bwb3NpdGUgc2NlbmFyaW8uIFdlIHN0YXJ0IHdpdGggYSB2ZXJzaW9uIG9mIFxjb2Rle1N9IHRoYXQgY29udGFpbnMgXGNvZGV7Zm9vKCl9LCBidXQgZG8gbm90IGRlY2xhcmUgXGNvZGV7Zm9vKCl9IGluIGxpYnJhcnkgXGNvZGV7TDJ9LiAgQWdhaW4sIHRoZXJlIGlzIGEgY2hhbmdlIGluIGJlaGF2aW9yIC0gYnV0IHRoZSBhdXRob3Igb2YgXGNvZGV7TDJ9IGlzIHRoZSBvbmUgd2hvIGludHJvZHVjZWQgdGhlIGRpc2NyZXBhbmN5IHRoYXQgZWZmZWN0cyB0aGVpciBjb2RlLCBhbmQgdGhlIG5ldyBjb2RlIGlzIGxleGljYWxseSB2aXNpYmxlLiBCb3RoIHRoZXNlIGZhY3RvcnMgbWFrZSBpdCBtb3JlIGxpa2VseSB0aGF0IHRoZSBwcm9ibGVtIHdpbGwgYmUgZGV0ZWN0ZWQuCgpUaGVzZSBjb25zaWRlcmF0aW9ucyBiZWNvbWUgZXZlbiBtb3JlIGltcG9ydGFudCBpZiBvbmUgaW50cm9kdWNlcyBjb25zdHJ1Y3RzIHN1Y2ggYXMgbmVzdGVkIGNsYXNzZXMsIHdoaWNoIG1pZ2h0IGJlIGNvbnNpZGVyZWQgaW4gZnV0dXJlIHZlcnNpb25zIG9mIHRoZSBsYW5ndWFnZS4KCkdvb2QgdG9vbGluZyBzaG91bGQgb2YgY291cnNlIGVuZGVhdm9yIHRvIGluZm9ybSBwcm9ncmFtbWVycyBvZiBzdWNoIHNpdHVhdGlvbnMgKGRpc2NyZWV0bHkpLiBGb3IgZXhhbXBsZSwgYW4gaWRlbnRpZmllciB0aGF0IGlzIGJvdGggaW5oZXJpdGVkIGFuZCBsZXhpY2FsbHkgdmlzaWJsZSBjb3VsZCBiZSBoaWdobGlnaHRlZCAodmlhIHVuZGVybGluaW5nIG9yIGNvbG9yaXphdGlvbikuIEJldHRlciB5ZXQsIHRpZ2h0IGludGVncmF0aW9uIG9mIHNvdXJjZSBjb250cm9sIHdpdGggbGFuZ3VhZ2UgYXdhcmUgdG9vbHMgd291bGQgZGV0ZWN0IHN1Y2ggY2hhbmdlcyB3aGVuIHRoZXkgb2NjdXIuIAogCn0KCgoKClxzdWJzZWN0aW9ue1ByaXZhY3l9ClxsYWJlbHtwcml2YWN5fQoKRGFydCBzdXBwb3J0cyB0d28gbGV2ZWxzIG9mIHByaXZhY3k6IHtcZW0gcHVibGljfSBhbmQge1xlbSBwcml2YXRlfS4gIEEgZGVjbGFyYXRpb24gaXMge1xlbSBwcml2YXRlfSBpZmYgaXRzIG5hbWUgaXMgcHJpdmF0ZSwgb3RoZXJ3aXNlIGl0IGlzIHtcZW0gcHVibGljLn0gIEEgIG5hbWUgJHEkIGlzIHByaXZhdGUgaWZmIGFueSBvbmUgb2YgdGhlIGlkZW50aWZpZXJzIHRoYXQgY29tcHJpc2UgJHEkIGlzIHByaXZhdGUsICBvdGhlcndpc2UgaXQgaXMge1xlbSBwdWJsaWMufSAgQW4gaWRlbnRpZmllciBpcyBwcml2YXRlIGlmZiBpdApiZWdpbnMgd2l0aCBhbiB1bmRlcnNjb3JlICh0aGUgXF8gY2hhcmFjdGVyKSBvdGhlcndpc2UgaXQgaXMge1xlbSBwdWJsaWMufSAKCkEgZGVjbGFyYXRpb24gJG0kIGlzIHtcZW0gYWNjZXNzaWJsZSB0byBsaWJyYXJ5ICRMJH0gIGlmICRtJCBpcyBkZWNsYXJlZCBpbiAkTCQgb3IgaWYgJG0kIGlzIHB1YmxpYy4KClxjb21tZW50YXJ5ewpUaGlzIG1lYW5zIHByaXZhdGUgZGVjbGFyYXRpb25zIG1heSBvbmx5IGJlIGFjY2Vzc2VkIHdpdGhpbiB0aGUgbGlicmFyeSBpbiB3aGljaCB0aGV5IGFyZSBkZWNsYXJlZC4KfQoKUHJpdmFjeSBhcHBsaWVzIG9ubHkgdG8gZGVjbGFyYXRpb25zIHdpdGhpbiBhIGxpYnJhcnksIG5vdCB0byBsaWJyYXJ5IGRlY2xhcmF0aW9ucyB0aGVtc2VsdmVzLiAKClxyYXRpb25hbGV7TGlicmFyaWVzIGRvIG5vdCByZWZlcmVuY2UgZWFjaCBvdGhlciBieSBuYW1lIGFuZCBzbyB0aGUgaWRlYSBvZiBhIHByaXZhdGUgbGlicmFyeSBpcyBtZWFuaW5nbGVzcy4KVGh1cywgaWYgdGhlIG5hbWUgb2YgYSBsaWJyYXJ5IGJlZ2lucyB3aXRoIGFuIHVuZGVyc2NvcmUsIGl0IGhhcyBubyBlZmZlY3Qgb24gdGhlIGFjY2Vzc2liaWxpdHkgb2YgdGhlIGxpYnJhcnkgb3IgaXRzIG1lbWJlcnMuCn0KClxyYXRpb25hbGV7UHJpdmFjeSBpcywgYXQgdGhpcyBwb2ludCwgYSBzdGF0aWMgbm90aW9uIHRpZWQgdG8gYSBwYXJ0aWN1bGFyIHBpZWNlIG9mIGNvZGUgKGEgbGlicmFyeSkuIEl0IGlzIGRlc2lnbmVkIHRvIHN1cHBvcnQgc29mdHdhcmUgZW5naW5lZXJpbmcgY29uY2VybnMgcmF0aGVyIHRoYW4gc2VjdXJpdHkgY29uY2VybnMuIFVudHJ1c3RlZCBjb2RlIHNob3VsZCBhbHdheXMgcnVuIGluIGFuIGFub3RoZXIgaXNvbGF0ZS4gIEl0IGlzIHBvc3NpYmxlIHRoYXQgbGlicmFyaWVzIHdpbGwgYmVjb21lIGZpcnN0IGNsYXNzIG9iamVjdHMgYW5kIHByaXZhY3kgd2lsbCBiZSBhIGR5bmFtaWMgbm90aW9uIHRpZWQgdG8gYSBsaWJyYXJ5IGluc3RhbmNlLgoKUHJpdmFjeSBpcyBpbmRpY2F0ZWQgYnkgdGhlIG5hbWUgb2YgYSBkZWNsYXJhdGlvbiAtIGhlbmNlIHByaXZhY3kgYW5kIG5hbWluZyBhcmUgbm90IG9ydGhvZ29uYWwuIFRoaXMgaGFzIHRoZSBhZHZhbnRhZ2UgdGhhdCBib3RoIGh1bWFucyBhbmQgbWFjaGluZXMgY2FuIHJlY29nbml6ZSBhY2Nlc3MgdG8gcHJpdmF0ZSBkZWNsYXJhdGlvbnMgYXQgdGhlIHBvaW50IG9mIHVzZSB3aXRob3V0IGtub3dsZWRnZSBvZiB0aGUgY29udGV4dCBmcm9tIHdoaWNoIHRoZSBkZWNsYXJhdGlvbiBpcyBkZXJpdmVkLn0KClxzdWJzZWN0aW9ue0NvbmN1cnJlbmN5fQoKRGFydCBjb2RlIGlzIGFsd2F5cyBzaW5nbGUgdGhyZWFkZWQuIFRoZXJlIGlzIG5vIHNoYXJlZC1zdGF0ZSBjb25jdXJyZW5jeSBpbiBEYXJ0LiBDb25jdXJyZW5jeSBpcyBzdXBwb3J0ZWQgdmlhIGFjdG9yLWxpa2UgZW50aXRpZXMgY2FsbGVkIHtcZW0gaXNvbGF0ZXN9LgoKQW4gaXNvbGF0ZSBpcyBhIHVuaXQgb2YgY29uY3VycmVuY3kuIEl0IGhhcyBpdHMgb3duIG1lbW9yeSBhbmQgaXRzIG93biB0aHJlYWQgb2YgY29udHJvbC4gSXNvbGF0ZXMgY29tbXVuaWNhdGUgYnkgbWVzc2FnZSBwYXNzaW5nIChccmVme3NlbmRpbmdNZXNzYWdlc30pLiBObyBzdGF0ZSBpcyBldmVyIHNoYXJlZCBiZXR3ZWVuIGlzb2xhdGVzLiBJc29sYXRlcyBhcmUgY3JlYXRlZCBieSBzcGF3bmluZyAoXHJlZntzcGF3bmluZ0FuSXNvbGF0ZX0pLgoKClxzZWN0aW9ue0Vycm9ycyBhbmQgV2FybmluZ3N9ClxsYWJlbHtlcnJvcnNBbmRXYXJuaW5nc30KClRoaXMgc3BlY2lmaWNhdGlvbiBkaXN0aW5ndWlzaGVzIGJldHdlZW4gc2V2ZXJhbCBraW5kcyBvZiBlcnJvcnMuCgp7XGVtIENvbXBpbGUtdGltZSBlcnJvcnN9IGFyZSBlcnJvcnMgdGhhdCBwcmVjbHVkZSBleGVjdXRpb24uIEEgY29tcGlsZS10aW1lIGVycm9yIG11c3QgYmUgcmVwb3J0ZWQgYnkgYSBEYXJ0IGNvbXBpbGVyIGJlZm9yZSB0aGUgZXJyb25lb3VzIGNvZGUgaXMgZXhlY3V0ZWQuIAoKXHJhdGlvbmFsZXtBIERhcnQgaW1wbGVtZW50YXRpb24gaGFzIGNvbnNpZGVyYWJsZSBmcmVlZG9tIGFzIHRvIHdoZW4gY29tcGlsYXRpb24gdGFrZXMgcGxhY2UuIE1vZGVybiBwcm9ncmFtbWluZyBsYW5ndWFnZSBpbXBsZW1lbnRhdGlvbnMgb2Z0ZW4gaW50ZXJsZWF2ZSBjb21waWxhdGlvbiBhbmQgZXhlY3V0aW9uLCBzbyB0aGF0IGNvbXBpbGF0aW9uIG9mIGEgbWV0aG9kIG1heSBiZSBkZWxheWVkLCBlLmcuLCAgdW50aWwgaXQgaXMgZmlyc3QgaW52b2tlZC4gQ29uc2VxdWVudGx5LCBjb21waWxlLXRpbWUgZXJyb3JzIGluIGEgbWV0aG9kICRtJCBtYXkgYmUgcmVwb3J0ZWQgYXMgbGF0ZSBhcyB0aGUgdGltZSBvZiAkbSQncyBmaXJzdCBpbnZvY2F0aW9uLgoKQXMgYSB3ZWIgbGFuZ3VhZ2UsIERhcnQgaXMgb2Z0ZW4gbG9hZGVkIGRpcmVjdGx5IGZyb20gc291cmNlLCB3aXRoIG5vIGludGVybWVkaWF0ZSBiaW5hcnkgcmVwcmVzZW50YXRpb24uIEluIHRoZSBpbnRlcmVzdHMgb2YgcmFwaWQgbG9hZGluZywgRGFydCBpbXBsZW1lbnRhdGlvbnMgbWF5IGNob29zZSB0byBhdm9pZCBmdWxsIHBhcnNpbmcgb2YgbWV0aG9kIGJvZGllcywgZm9yIGV4YW1wbGUuIFRoaXMgY2FuIGJlIGRvbmUgYnkgdG9rZW5pemluZyB0aGUgaW5wdXQgYW5kIGNoZWNraW5nIGZvciBiYWxhbmNlZCBjdXJseSBicmFjZXMgb24gbWV0aG9kIGJvZHkgZW50cnkuIEluIHN1Y2ggYW4gaW1wbGVtZW50YXRpb24sIGV2ZW4gc3ludGF4IGVycm9ycyB3aWxsIGJlIGRldGVjdGVkIG9ubHkgd2hlbiB0aGUgbWV0aG9kIG5lZWRzIHRvIGJlIGV4ZWN1dGVkLCBhdCB3aGljaCB0aW1lIGl0IHdpbGwgYmUgY29tcGlsZWQgKEpJVGVkKS4KCkluIGEgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgYSBjb21waWxlciBzaG91bGQgb2YgY291cnNlIHJlcG9ydCBjb21waWxhdGlvbiBlcnJvcnMgZWFnZXJseSBzbyBhcyB0byAgYmVzdCBzZXJ2ZSB0aGUgcHJvZ3JhbW1lci4KfQoKSWYgYW4gdW5jYXVnaHQgY29tcGlsZS10aW1lIGVycm9yIG9jY3VycyB3aXRoaW4gdGhlIGNvZGUgb2YgYSBydW5uaW5nIGlzb2xhdGUgJEEkLCAkQSQgaXMgaW1tZWRpYXRlbHkgc3VzcGVuZGVkLiAgVGhlIG9ubHkgY2lyY3Vtc3RhbmNlIHdoZXJlIGEgY29tcGlsZS10aW1lIGVycm9yIGNvdWxkIGJlIGNhdWdodCB3b3VsZCBiZSB2aWEgY29kZSBydW4gcmVmbGVjdGl2ZWx5LCB3aGVyZSB0aGUgbWlycm9yIHN5c3RlbSBjYW4gY2F0Y2ggaXQuCgpccmF0aW9uYWxle1R5cGljYWxseSwgb25jZSBhIGNvbXBpbGUtdGltZSBlcnJvciBpcyB0aHJvd24gYW5kICRBJCBpcyBzdXNwZW5kZWQsICRBJCB3aWxsIHRoZW4gYmUgdGVybWluYXRlZC4gSG93ZXZlciwgdGhpcyBkZXBlbmRzIG9uIHRoZSBvdmVyYWxsIGVudmlyb25tZW50LiAKQSBEYXJ0IGVuZ2luZSBydW5zIGluIHRoZSBjb250ZXh0IG9mIGFuIHtcZW0gZW1iZWRkZXJ9LCAKYSBwcm9ncmFtIHRoYXQgaW50ZXJmYWNlcyBiZXR3ZWVuIHRoZSBlbmdpbmUgYW5kIHRoZSBzdXJyb3VuZGluZyBjb21wdXRpbmcgZW52aXJvbm1lbnQuIFRoZSBlbWJlZGRlciB3aWxsIG9mdGVuIGJlIGEgd2ViIGJyb3dzZXIsIGJ1dCBuZWVkIG5vdCBiZTsgaXQgbWF5IGJlIGEgQysrIHByb2dyYW0gb24gdGhlIHNlcnZlciBmb3IgZXhhbXBsZS4gV2hlbiBhbiBpc29sYXRlIGZhaWxzIHdpdGggYSBjb21waWxlLXRpbWUgZXJyb3IgYXMgZGVzY3JpYmVkIGFib3ZlLCBjb250cm9sIHJldHVybnMgdG8gdGhlIGVtYmVkZGVyLCBhbG9uZyB3aXRoIGFuIGV4Y2VwdGlvbiBkZXNjcmliaW5nIHRoZSBwcm9ibGVtLiAgVGhpcyBpcyBuZWNlc3Nhcnkgc28gdGhhdCB0aGUgZW1iZWRkZXIgY2FuIGNsZWFuIHVwIHJlc291cmNlcyBldGMuIEl0IGlzIHRoZW4gdGhlIGVtYmVkZGVyJ3MgZGVjaXNpb24gd2hldGhlciB0byB0ZXJtaW5hdGUgdGhlIGlzb2xhdGUgb3Igbm90Lgp9Cgp7XGVtIFN0YXRpYyAgd2FybmluZ3N9IGFyZSB0aG9zZSBlcnJvcnMgcmVwb3J0ZWQgYnkgdGhlIHN0YXRpYyBjaGVja2VyLiBUaGV5IGhhdmUgbm8gZWZmZWN0IG9uIGV4ZWN1dGlvbi4gTWFueSwgYnV0IG5vdCBhbGwsIHN0YXRpYyB3YXJuaW5ncyByZWxhdGUgdG8gdHlwZXMsIGluIHdoaWNoIGNhc2UgdGhleSBhcmUga25vd24gYXMge1xlbSBzdGF0aWMgdHlwZSB3YXJuaW5ncy59IFN0YXRpYyB3YXJuaW5ncyBtdXN0IGJlIHByb3ZpZGVkIGJ5IERhcnQgY29tcGlsZXJzIHVzZWQgZHVyaW5nIGRldmVsb3BtZW50IHN1Y2ggYXMgdGhvc2UgaW5jb3Jwb3JhdGVkIGluIElERXMgb3Igb3RoZXJ3aXNlIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgZGV2ZWxvcGVycyBmb3IgZGV2ZWxvcGluZyBjb2RlLiBDb21waWxlcnMgdGhhdCBhcmUgcGFydCBvZiBydW50aW1lIGV4ZWN1dGlvbiBlbnZpcm9ubWVudHMgc3VjaCBhcyB2aXJ0dWFsIG1hY2hpbmVzIHNob3VsZCBub3QgaXNzdWUgc3RhdGljIHdhcm5pbmdzLgoKe1xlbSBEeW5hbWljIHR5cGUgZXJyb3JzfSBhcmUgdHlwZSBlcnJvcnMgcmVwb3J0ZWQgaW4gY2hlY2tlZCBtb2RlLgoKe1xlbSBSdW4tdGltZSBlcnJvcnN9IGFyZSBleGNlcHRpb25zIHJhaXNlZCBkdXJpbmcgZXhlY3V0aW9uLiBXaGVuZXZlciB3ZSBzYXkgdGhhdCBhbiBleGNlcHRpb24gJGV4JCBpcyB7XGVtIHJhaXNlZH0gb3Ige1xlbSB0aHJvd259LCB3ZSBtZWFuIHRoYXQgYSB0aHJvdyBleHByZXNzaW9uICAoXHJlZnt0aHJvd30pIG9mIHRoZSBmb3JtOiBcY29kZXtcVEhST1d7fSAkZXgkO30gd2FzIGltcGxpY2l0bHkgZXZhbHVhdGVkIG9yIHRoYXQgYSByZXRocm93IHN0YXRlbWVudCAoXHJlZntyZXRocm93fSkgb2YgdGhlIGZvcm0gXGNvZGV7XFJFVEhST1d9IHdhcyBleGVjdXRlZC4gV2hlbiB3ZSBzYXkgdGhhdCB7XGVtIGF9ICRDJCB7XGVtIGlzIHRocm93bn0sIHdoZXJlICRDJCBpcyBhIGNsYXNzLCB3ZSBtZWFuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgY2xhc3MgJEMkIGlzIHRocm93bi4KCklmIGFuIHVuY2F1Z2h0IGV4Y2VwdGlvbiBpcyB0aHJvd24gYnkgYSBydW5uaW5nIGlzb2xhdGUgJEEkLCAkQSQgaXMgaW1tZWRpYXRlbHkgc3VzcGVuZGVkLiAKCgpcc2VjdGlvbntWYXJpYWJsZXN9ClxsYWJlbHt2YXJpYWJsZXN9CgpWYXJpYWJsZXMgYXJlIHN0b3JhZ2UgbG9jYXRpb25zIGluIG1lbW9yeS4gIAoKXGJlZ2lue2dyYW1tYXJ9CntcYmYgdmFyaWFibGVEZWNsYXJhdGlvbjp9CiAgICAgIGRlY2xhcmVkSWRlbnRpZmllciAoYCwnIGlkZW50aWZpZXIpKgogICAgICAuCiAgICAgIAp7XGJmIGRlY2xhcmVkSWRlbnRpZmllcjp9CiAgICAgIG1ldGFkYXRhIGZpbmFsQ29uc3RWYXJPclR5cGUgaWRlbnRpZmllcgogICAgLgoKe1xiZiBmaW5hbENvbnN0VmFyT3JUeXBlOn1cRklOQUx7fSB0eXBlPzsKICAgICAgICAgICBcQ09OU1R7fSB0eXBlPzsKCXZhck9yVHlwZQogICAgLgogICAgCiB7XGJmIHZhck9yVHlwZTp9XFZBUnt9OwoJdHlwZQogICAgLgoKIHtcYmYgaW5pdGlhbGl6ZWRWYXJpYWJsZURlY2xhcmF0aW9uOn0KICAgICAgZGVjbGFyZWRJZGVudGlmaWVyIChgPScgZXhwcmVzc2lvbik/IChgLCcgaW5pdGlhbGl6ZWRJZGVudGlmaWVyKSogJSBjb3VsZCBkbyB0b3AgbGV2ZWwgaGVyZQogICAgLgoKe1xiZiBpbml0aWFsaXplZElkZW50aWZpZXI6fQogICAgICBpZGVudGlmaWVyIChgPScgZXhwcmVzc2lvbik/ICUgY291bGQgZG8gdG9wLWxldmVsIGhlcmUKICAgIC4KICAgIAp7XGJmIGluaXRpYWxpemVkSWRlbnRpZmllckxpc3Q6fQogICAgICBpbml0aWFsaXplZElkZW50aWZpZXIgKGAsJyBpbml0aWFsaXplZElkZW50aWZpZXIpKgogICAgLgoKCgoKICBcZW5ke2dyYW1tYXJ9CgpBIHZhcmlhYmxlIHRoYXQgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIGhhcyB0aGUgaW5pdGlhbCB2YWx1ZSBcTlVMTHt9IChccmVme251bGx9KS4KCkEgdmFyaWFibGUgZGVjbGFyZWQgYXQgdGhlIHRvcC1sZXZlbCBvZiBhIGxpYnJhcnkgaXMgcmVmZXJyZWQgdG8gYXMgZWl0aGVyIGEge1xlbSBsaWJyYXJ5IHZhcmlhYmxlfSBvciBzaW1wbHkgYSB0b3AtbGV2ZWwgdmFyaWFibGUuIAoKQSB7XGVtIHN0YXRpYyB2YXJpYWJsZX0gaXMgYSB2YXJpYWJsZSB0aGF0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIGluc3RhbmNlLCBidXQgcmF0aGVyIHdpdGggYW4gZW50aXJlIGxpYnJhcnkgb3IgY2xhc3MuICBTdGF0aWMgdmFyaWFibGVzIGluY2x1ZGUgbGlicmFyeSB2YXJpYWJsZXMgYW5kIGNsYXNzIHZhcmlhYmxlcy4gQ2xhc3MgdmFyaWFibGVzIGFyZSB2YXJpYWJsZXMgd2hvc2UgZGVjbGFyYXRpb24gaXMgaW1tZWRpYXRlbHkgbmVzdGVkIGluc2lkZSBhIGNsYXNzIGRlY2xhcmF0aW9uIGFuZCBpbmNsdWRlcyB0aGUgbW9kaWZpZXIgXFNUQVRJQ3t9LiBBIGxpYnJhcnkgdmFyaWFibGUgaXMgaW1wbGljaXRseSBzdGF0aWMuIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIHRvIHByZWZhY2UgYSB0b3AtbGV2ZWwgdmFyaWFibGUgZGVjbGFyYXRpb24gd2l0aCB0aGUgYnVpbHQtaW4gaWRlbnRpZmllciAgKFxyZWZ7aWRlbnRpZmllclJlZmVyZW5jZX0pIFxTVEFUSUN7fS4gIAoKU3RhdGljIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBhcmUgaW5pdGlhbGl6ZWQgbGF6aWx5LiBXaGVuIGEgc3RhdGljIHZhcmlhYmxlICR2JCBpcyByZWFkLCBpZmYgaXQgaGFzIG5vdCB5ZXQgYmVlbiBhc3NpZ25lZCwgIGl0IGlzIHNldCB0byB0aGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgaXRzIGluaXRpYWxpemVyLiBUaGUgcHJlY2lzZSBydWxlcyBhcmUgZ2l2ZW4gaW4gc2VjdGlvbiBccmVme2V2YWx1YXRpb25PZkltcGxpY2l0VmFyaWFibGVHZXR0ZXJzfS4gCgpccmF0aW9uYWxle1RoZSBsYXp5IHNlbWFudGljcyBhcmUgZ2l2ZW4gYmVjYXVzZSB3ZSBkbyBub3Qgd2FudCBhIGxhbmd1YWdlIHdoZXJlIG9uZSB0ZW5kcyB0byBkZWZpbmUgZXhwZW5zaXZlIGluaXRpYWxpemF0aW9uIGNvbXB1dGF0aW9ucywgY2F1c2luZyBsb25nIGFwcGxpY2F0aW9uIHN0YXJ0dXAgdGltZXMuIFRoaXMgaXMgZXNwZWNpYWxseSBjcnVjaWFsIGZvciBEYXJ0LCB3aGljaCBtdXN0IHN1cHBvcnQgdGhlIGNvZGluZyBvZiAgY2xpZW50IGFwcGxpY2F0aW9ucy4KfQoKQSB7XGVtIGZpbmFsIHZhcmlhYmxlfSBpcyBhIHZhcmlhYmxlIHdob3NlIGJpbmRpbmcgaXMgZml4ZWQgdXBvbiBpbml0aWFsaXphdGlvbjsgYSBmaW5hbCB2YXJpYWJsZSAkdiQgd2lsbCBhbHdheXMgcmVmZXIgdG8gdGhlIHNhbWUgb2JqZWN0IGFmdGVyICR2JCBoYXMgYmVlbiBpbml0aWFsaXplZC4gVGhlIGRlY2xhcmF0aW9uIG9mIGEgZmluYWwgdmFyaWFibGUgbXVzdCAgaW5jbHVkZSB0aGUgbW9kaWZpZXIgXEZJTkFMe30uIAoKSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiBhIGZpbmFsIGluc3RhbmNlIHZhcmlhYmxlIHRoYXQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYXQgaXRzIHBvaW50IG9mIGRlY2xhcmF0aW9uICBpcyAgYWxzbyBpbml0aWFsaXplZCBpbiBhIGNvbnN0cnVjdG9yLiAKJSBJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmIGEgZmluYWwgaW5zdGFuY2UgdmFyaWFibGUgdGhhdCBoYXMgYmVlbiBpbml0aWFsaXplZCBieSBtZWFucyBvZiBhbiBpbml0aWFsaXppbmcgZm9ybWFsIG9mIGEgY29uc3RydWN0b3IgaXMgIGFsc28gaW5pdGlhbGl6ZWQgZWxzZXdoZXJlIGluIHRoZSBzYW1lIGNvbnN0cnVjdG9yLgpJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBhIGxvY2FsIHZhcmlhYmxlICR2JCBpcyBmaW5hbCBhbmQgJHYkIGlzIG5vdCBpbml0aWFsaXplZCBhdCBpdHMgcG9pbnQgb2YgZGVjbGFyYXRpb24uCgpcY29tbWVudGFyeXsKCkEgbGlicmFyeSBvciBzdGF0aWMgdmFyaWFibGUgaXMgZ3VhcmFudGVlZCB0byBoYXZlIGFuIGluaXRpYWxpemVyIGF0IGl0cyBkZWNsYXJhdGlvbiBieSB0aGUgZ3JhbW1hci4KCkF0dGVtcHRpbmcgdG8gYXNzaWduIHRvIGEgZmluYWwgdmFyaWFibGUgYW55d2hlcmUgZXhjZXB0IGluIGl0cyBkZWNsYXJhdGlvbiBvciBpbiBhIGNvbnN0cnVjdG9yIGhlYWRlciAgd2lsbCBjYXVzZSBhIHJ1bnRpbWUgZXJyb3IgdG8gYmUgdGhyb3duIGFzIGRpc2N1c3NlZCBiZWxvdy4gVGhlIGFzc2lnbm1lbnQgd2lsbCBhbHNvIGdpdmUgcmlzZSB0byBhIHN0YXRpYyB3YXJuaW5nLiBBbnkgcmVwZWF0ZWQgYXNzaWdubWVudCB0byBhIGZpbmFsIHZhcmlhYmxlIHdpbGwgYWxzbyBsZWFkIHRvIGEgcnVudGltZSBlcnJvci4KClRha2VuIGFzIGEgd2hvbGUsIHRoZSBydWxlcyBlbnN1cmUgdGhhdCBhbnkgYXR0ZW1wdCB0byBleGVjdXRlIG11bHRpcGxlIGFzc2lnbm1lbnRzIHRvIGEgZmluYWwgdmFyaWFibGUgd2lsbCB5aWVsZCBzdGF0aWMgd2FybmluZ3MgYW5kIHJlcGVhdGVkIGFzc2lnbm1lbnRzIHdpbGwgZmFpbCBkeW5hbWljYWxseS4KfQoKQSB7XGVtIGNvbnN0YW50IHZhcmlhYmxlfSBpcyBhIHZhcmlhYmxlIHdob3NlIGRlY2xhcmF0aW9uIGluY2x1ZGVzIHRoZSBtb2RpZmllciBcQ09OU1R7fS4gQSBjb25zdGFudCB2YXJpYWJsZSBpcyBhbHdheXMgaW1wbGljaXRseSBmaW5hbC4gQSBjb25zdGFudCB2YXJpYWJsZSBtdXN0IGJlIGluaXRpYWxpemVkIHRvIGEgY29tcGlsZS10aW1lIGNvbnN0YW50IChccmVme2NvbnN0YW50c30pIG9yIGEgY29tcGlsZS10aW1lIGVycm9yIG9jY3Vycy4KCldlIHNheSB0aGF0IGEgdmFyaWFibGUgJHYkIGlzIHtcZW0gcG90ZW50aWFsbHkgbXV0YXRlZH0gaW4gc29tZSBzY29wZSAkcyQgaWYgJHYkIGlzIG5vdCBmaW5hbCBvciBjb25zdGFudCBhbmQgYW4gYXNzaWdubWVudCB0byAkdiQgb2NjdXJzIGluICRzJC4KCklmIGEgdmFyaWFibGUgZGVjbGFyYXRpb24gZG9lcyBub3QgZXhwbGljaXRseSBzcGVjaWZ5IGEgdHlwZSwgdGhlIHR5cGUgb2YgdGhlIGRlY2xhcmVkIHZhcmlhYmxlKHMpIGlzICBcRFlOQU1JQ3t9LCB0aGUgdW5rbm93biB0eXBlIChccmVme3R5cGVEeW5hbWljfSkuIAoKQSB2YXJpYWJsZSBpcyB7XGVtIG11dGFibGV9IGlmIGl0IGlzIG5vdCBmaW5hbC4KU3RhdGljIGFuZCBpbnN0YW5jZSB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgYWx3YXlzIGluZHVjZSBpbXBsaWNpdCBnZXR0ZXJzLiBJZiB0aGUgdmFyaWFibGUgaXMgbXV0YWJsZSBpdCBhbHNvIGludHJvZHVjZXMgYW4gaW1wbGljaXQgc2V0dGVyLgpUaGUgc2NvcGUgaW50byB3aGljaCB0aGUgaW1wbGljaXQgZ2V0dGVycyBhbmQgc2V0dGVycyBhcmUgaW50cm9kdWNlZCBkZXBlbmRzIG9uIHRoZSBraW5kIG9mIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGludm9sdmVkLiAKCkEgbGlicmFyeSB2YXJpYWJsZSBpbnRyb2R1Y2VzIGEgZ2V0dGVyIGludG8gdGhlIHRvcCBsZXZlbCBzY29wZSBvZiB0aGUgZW5jbG9zaW5nIGxpYnJhcnkuIEEgc3RhdGljIGNsYXNzIHZhcmlhYmxlIGludHJvZHVjZXMgYSBzdGF0aWMgZ2V0dGVyIGludG8gdGhlIGltbWVkaWF0ZWx5IGVuY2xvc2luZyBjbGFzcy4gQW4gaW5zdGFuY2UgdmFyaWFibGUgaW50cm9kdWNlcyBhbiBpbnN0YW5jZSBnZXR0ZXIgaW50byB0aGUgaW1tZWRpYXRlbHkgZW5jbG9zaW5nIGNsYXNzLiAKCkEgbXV0YWJsZSBsaWJyYXJ5IHZhcmlhYmxlIGludHJvZHVjZXMgYSBzZXR0ZXIgaW50byB0aGUgdG9wIGxldmVsIHNjb3BlIG9mIHRoZSBlbmNsb3NpbmcgbGlicmFyeS4gQSBtdXRhYmxlIHN0YXRpYyBjbGFzcyB2YXJpYWJsZSBpbnRyb2R1Y2VzIGEgc3RhdGljIHNldHRlciBpbnRvIHRoZSBpbW1lZGlhdGVseSBlbmNsb3NpbmcgY2xhc3MuIEEgbXV0YWJsZSBpbnN0YW5jZSB2YXJpYWJsZSBpbnRyb2R1Y2VzIGFuIGluc3RhbmNlIHNldHRlciBpbnRvIHRoZSBpbW1lZGlhdGVseSBlbmNsb3NpbmcgY2xhc3MuIAoKTG9jYWwgdmFyaWFibGVzIGFyZSBhZGRlZCB0byB0aGUgaW5uZXJtb3N0IGVuY2xvc2luZyBzY29wZS4gIFRoZXkgZG8gbm90IGluZHVjZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzLiAgQSBsb2NhbCB2YXJpYWJsZSBtYXkgb25seSBiZSByZWZlcmVuY2VkIGF0IGEgc291cmNlIGNvZGUgbG9jYXRpb24gdGhhdCBpcyBhZnRlciBpdHMgaW5pdGlhbGl6ZXIsIGlmIGFueSwgaXMgY29tcGxldGUsIG9yIGEgY29tcGlsZS10aW1lIGVycm9yIG9jY3Vycy4gIFRoZSBlcnJvciBtYXkgYmUgcmVwb3J0ZWQgZWl0aGVyIGF0IHRoZSBwb2ludCB3aGVyZSB0aGUgcHJlbWF0dXJlIHJlZmVyZW5jZSBvY2N1cnMsIG9yIGF0IHRoZSB2YXJpYWJsZSBkZWNsYXJhdGlvbi4KClxyYXRpb25hbGUgewpXZSBhbGxvdyB0aGUgZXJyb3IgdG8gYmUgcmVwb3J0ZWQgYXQgdGhlIGRlY2xhcmF0aW9uIHRvIGFsbG93IGltcGxlbWVudGF0aW9ucyB0byBhdm9pZCBhbiBleHRyYSBwcm9jZXNzaW5nIHBoYXNlLiAKfQoKXGNvbW1lbnRhcnl7ClRoZSBleGFtcGxlIGJlbG93IGlsbHVzdHJhdGVzIHRoZSBleHBlY3RlZCBiZWhhdmlvci4gIEEgdmFyaWFibGUgJHgkIGlzIGRlY2xhcmVkIGF0IHRoZSBsaWJyYXJ5IGxldmVsLCBhbmQgYW5vdGhlciAkeCQgaXMgZGVjbGFyZWQgaW5zaWRlIHRoZSBmdW5jdGlvbiAkZiQuCn0KClxiZWdpbntkYXJ0Q29kZX0KXFZBUnt9IHggPSAwOwoKZih5KSBcewogIFxWQVJ7fSB6ID0geDsgLy8gY29tcGlsZS10aW1lIGVycm9yIAogIGlmICh5KSBcewogICAgeCA9IHggKyAxOyAvLyB0d28gY29tcGlsZSB0aW1lIGVycm9ycwogICAgcHJpbnQoeCk7IC8vIGNvbXBpbGUgdGltZSBlcnJvcgogIFx9CiBcVkFSe30geCA9IHgrKzsgLy8gY29tcGlsZSB0aW1lIGVycm9yCiBwcmludCh4KTsKXH0KXGVuZHtkYXJ0Q29kZX0KClxjb21tZW50YXJ5ewpUaGUgZGVjbGFyYXRpb24gaW5zaWRlICRmJCBoaWRlcyB0aGUgZW5jbG9zaW5nIG9uZS4gIFNvIGFsbCByZWZlcmVuY2VzIHRvICR4JCBpbnNpZGUgJGYkIHJlZmVyIHRvIHRoZSBpbm5lciBkZWNsYXJhdGlvbiBvZiAkeCQuIEhvd2V2ZXIsIG1hbnkgb2YgdGhlc2UgcmVmZXJlbmNlcyBhcmUgaWxsZWdhbCwgYmVjYXVzZSB0aGV5IGFwcGVhciBiZWZvcmUgdGhlIGRlY2xhcmF0aW9uLiBUaGUgYXNzaWdubWVudCB0byAkeiQgaXMgb25lIHN1Y2ggY2FzZS4gVGhlIGFzc2lnbm1lbnQgdG8gJHgkIGluIHRoZSBcSUZ7fSBzdGF0ZW1lbnQgc3VmZmVycyBmcm9tIG11bHRpcGxlIHByb2JsZW1zLiBUaGUgcmlnaHQgaGFuZCBzaWRlIHJlYWRzICR4JCBiZWZvcmUgaXRzIGRlY2xhcmF0aW9uLCBhbmQgdGhlIGxlZnQgaGFuZCBzaWRlIGFzc2lnbnMgdG8gJHgkIGJlZm9yZSBpdHMgZGVjbGFyYXRpb24uIEVhY2ggb2YgdGhlc2UgYXJlLCBpbmRlcGVuZGVudGx5LCBjb21waWxlIHRpbWUgZXJyb3JzLiAgVGhlIHByaW50IHN0YXRlbWVudCBpbnNpZGUgdGhlIFxJRnt9IGlzIGFsc28gaWxsZWdhbC4KClRoZSBpbm5lciBkZWNsYXJhdGlvbiBvZiAkeCQgaXMgaXRzZWxmIGVycm9uZW91cyBiZWNhdXNlIGl0cyByaWdodCBoYW5kIHNpZGUgYXR0ZW1wdHMgdG8gcmVhZCAkeCQgYmVmb3JlIHRoZSBkZWNsYXJhdGlvbiBoYXMgdGVybWluYXRlZC4gIFRoZSBsZWZ0IGhhbmQgc2lkZSBpcyBub3QsIHRlY2huaWNhbGx5LCBhIHJlZmVyZW5jZSBvciBhbiBhc3NpZ25tZW50IGJ1dCBhIGRlY2xhcmF0aW9uIGFuZCBzbyBpcyBsZWdhbC4gIFRoZSBsYXN0IHByaW50IHN0YXRlbWVudCBpcyBwZXJmZWN0bHkgbGVnYWwgYXMgd2VsbC4KfQoKXGNvbW1lbnRhcnkgewpBcyBhbm90aGVyIGV4YW1wbGUgIFxjb2Rle1xWQVJ7fSB4ID0gMywgeSA9IHg7fSBpcyBsZWdhbCwgYmVjYXVzZSBcY29kZXt4fSBpcyByZWZlcmVuY2VkIGFmdGVyIGl0cyBpbml0aWFsaXplci4gCgpBIHBhcnRpY3VsYXJseSBwZXJ2ZXJzZSBleGFtcGxlIGludm9sdmVzIGEgbG9jYWwgdmFyaWFibGUgbmFtZSBzaGFkb3dpbmcgYSB0eXBlLiBUaGlzIGlzIHBvc3NpYmxlIGJlY2F1c2UgRGFydCBoYXMgYSBzaW5nbGUgbmFtZXNwYWNlIGZvciB0eXBlcywgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMuCn0KClxiZWdpbntkYXJ0Q29kZX0KXENMQVNTe30gQyBce1x9CnBlcnZlcnNlKCkgXHsKICAgXFZBUnt9IHYgPSBcTkVXe30gQygpOyAvLyBjb21waWxlLXRpbWUgZXJyb3IKICAgQyBhQzsgLy8gY29tcGlsZS10aW1lIGVycm9yCiAgIFxWQVJ7fSBDID0gMTA7Clx9CgpcY29tbWVudGFyeSB7CiBJbnNpZGUgXGNke3BlcnZlcnNlKCl9LCBcY2R7Q30gZGVub3RlcyBhIGxvY2FsIHZhcmlhYmxlLiBUaGUgdHlwZSBcY2R7Q30gaXMgaGlkZGVuIGJ5IHRoZSB2YXJpYWJsZSBvZiB0aGUgc2FtZSBuYW1lLiBUaGUgYXR0ZW1wdCB0byBpbnN0YW50aWF0ZSBcY2R7Q30gY2F1c2VzIGEgY29tcGlsZS10aW1lIGVycm9yIGJlY2F1c2UgaXQgcmVmZXJlbmNlcyBhIGxvY2FsIHZhcmlhYmxlIHByaW9yIHRvIGl0cyBkZWNsYXJhdGlvbi4gU2ltaWxhcmx5LCBmb3IgdGhlIGRlY2xhcmF0aW9uIG9mIFxjZHthQ30gKGV2ZW4gdGhvdWdoIGl0IGlzIG9ubHkgYSB0eXBlIGFubm90YXRpb24pLgp9CgpccmF0aW9uYWxlewpBcyBhIHJ1bGUsIHR5cGUgYW5ub3RhdGlvbnMgYXJlIGlnbm9yZWQgaW4gcHJvZHVjdGlvbiBtb2RlLiBIb3dldmVyLCB3ZSBkbyAKIG5vdCB3YW50IHRvIGFsbG93IHByb2dyYW1zIHRvIGNvbXBpbGUgbGVnYWxseSBpbiBvbmUgbW9kZSBhbmQgbm90IGFub3RoZXIsIGFuZCBpbiB0aGlzIGV4dHJlbWVseSBvZGQgc2l0dWF0aW9uLCB0aGF0IGNvbnNpZGVyYXRpb24gdGFrZXMgcHJlY2VkZW5jZS4KfQoKXGVuZHtkYXJ0Q29kZX0KCiUgdGhlIGdyYW1tYXIgZG9lcyBub3Qgc3VwcG9ydCBsb2NhbCBnZXR0ZXJzIGFuZCBzZXR0ZXJzLiBUaGUgbG9jYWwgdmFyIGRpc2N1c3Npb24gZG9lcyBub3Qgc2VlbSB0byBtZW50aW9uIGdldHRlcnMgYW5kIHNldHRlcnMgYmFzZWQgc2VtYW50aWNzLiBJdCBzaW1wbHkgZGlzY3Vzc2VzIHRoZSBjcmVhdGlvbiBvZiB0aGUgdmFyaWFibGUsIG5vdCBpdHMgYWNjZXNzLiBBY2Nlc3MgaXMgZWl0aGVyIGFzc2lnbm1lbnQgb3IgaWRlbnRpZmllcnMuIElkZW50aWZpZXJzIGlnbm9yZSB0aGUgZ2V0dGVyIHN0b3J5LiAKClRoZSBmb2xsb3dpbmcgcnVsZXMgYXBwbHkgdG8gYWxsIHN0YXRpYyBhbmQgaW5zdGFuY2UgdmFyaWFibGVzLgoKQSAgdmFyaWFibGUgZGVjbGFyYXRpb24gIG9mIG9uZSBvZiB0aGUgZm9ybXMgXGNvZGV7JFQkICR2JDt9LCAgXGNvZGV7JFQkICR2JCA9ICRlJDt9ICwgIFxjb2Rle1xDT05TVHt9ICRUJCAkdiQgPSAkZSQ7fSwgXGNvZGV7XEZJTkFMe30gJFQkICR2JDt9ICBvciBcY29kZXtcRklOQUx7fSAkVCQgJHYkID0gJGUkO30gYWx3YXlzIGluZHVjZXMgYW4gaW1wbGljaXQgIGdldHRlciBmdW5jdGlvbiAoXHJlZntnZXR0ZXJzfSkgd2l0aCBzaWduYXR1cmUgCgokVCQgXEdFVHt9ICR2JAoKd2hvc2UgaW52b2NhdGlvbiBldmFsdWF0ZXMgYXMgZGVzY3JpYmVkIGJlbG93IChccmVme2V2YWx1YXRpb25PZkltcGxpY2l0VmFyaWFibGVHZXR0ZXJzfSkuCgoKQSAgdmFyaWFibGUgZGVjbGFyYXRpb24gIG9mIG9uZSBvZiB0aGUgZm9ybXMgXGNvZGV7XFZBUnt9ICR2JDt9LCAgXGNvZGV7XFZBUnt9ICR2JCA9ICRlJDt9ICwgIFxjb2Rle1xDT05TVHt9ICR2JCA9ICRlJDt9LCBcY29kZXtcRklOQUx7fSAkdiQ7fSBvciBcY29kZXtcRklOQUx7fSAgJHYkID0gJGUkO30gIGFsd2F5cyBpbmR1Y2VzIGFuIGltcGxpY2l0ICBnZXR0ZXIgZnVuY3Rpb24gd2l0aCBzaWduYXR1cmUgCgogXEdFVHt9ICR2JAoKd2hvc2UgIGludm9jYXRpb24gZXZhbHVhdGVzIGFzIGRlc2NyaWJlZCBiZWxvdyAoXHJlZntldmFsdWF0aW9uT2ZJbXBsaWNpdFZhcmlhYmxlR2V0dGVyc30pLgoKQSBub24tZmluYWwgIHZhcmlhYmxlIGRlY2xhcmF0aW9uICBvZiB0aGUgZm9ybSBcY29kZXt7fSAkVCQgJHYkO30gb3IgdGhlIGZvcm0gIFxjb2RleyRUJCAkdiQgPSAkZSQ7fSAgIGFsd2F5cyBpbmR1Y2VzIGFuIGltcGxpY2l0ICBzZXR0ZXIgZnVuY3Rpb24gKFxyZWZ7c2V0dGVyc30pIHdpdGggc2lnbmF0dXJlIAoKIFxWT0lEe30gXFNFVHt9ICR2PShUJCAkeCkkCgp3aG9zZSBleGVjdXRpb24gc2V0cyB0aGUgdmFsdWUgb2YgJHYkIHRvIHRoZSBpbmNvbWluZyBhcmd1bWVudCAkeCQuCgpBICBub24tZmluYWwgdmFyaWFibGUgZGVjbGFyYXRpb24gIG9mIHRoZSBmb3JtIFxjb2Rle1xWQVJ7fSAkdiQ7fSBvciB0aGUgZm9ybSAgXGNvZGV7XFZBUnt9ICR2JCA9ICRlJDt9ICAgYWx3YXlzIGluZHVjZXMgYW4gaW1wbGljaXQgIHNldHRlciBmdW5jdGlvbiB3aXRoIHNpZ25hdHVyZSAKClxTRVR7fSAkdj0oeCkkCgp3aG9zZSBleGVjdXRpb24gc2V0cyB0aGUgdmFsdWUgb2YgJHYkIHRvIHRoZSBpbmNvbWluZyBhcmd1bWVudCAkeCQuCgoKXHN1YnNlY3Rpb257RXZhbHVhdGlvbiBvZiBJbXBsaWNpdCAgVmFyaWFibGUgR2V0dGVyc30KXGxhYmVse2V2YWx1YXRpb25PZkltcGxpY2l0VmFyaWFibGVHZXR0ZXJzfQoKTGV0ICRkJCBiZSB0aGUgZGVjbGFyYXRpb24gb2YgYSBzdGF0aWMgb3IgaW5zdGFuY2UgdmFyaWFibGUgJHYkLiAgSWYgJGQkIGlzIGFuIGluc3RhbmNlIHZhcmlhYmxlLCB0aGVuIHRoZSBpbnZvY2F0aW9uIG9mIHRoZSBpbXBsaWNpdCBnZXR0ZXIgIG9mICR2JCBldmFsdWF0ZXMgdG8gdGhlIHZhbHVlIHN0b3JlZCBpbiAkdiQuCklmICRkJCBpcyBhIHN0YXRpYyBvciBsaWJyYXJ5IHZhcmlhYmxlIHRoZW4gdGhlIGltcGxpY2l0IGdldHRlciBtZXRob2Qgb2YgJHYkIGV4ZWN1dGVzIGFzIGZvbGxvd3M6IApcYmVnaW57aXRlbWl6ZX0KXGl0ZW0ge1xiZiBOb24tY29uc3RhbnQgdmFyaWFibGUgZGVjbGFyYXRpb24gd2l0aCBpbml0aWFsaXplcn0uIElmICRkJCBpcyBvZiBvbmUgb2YgdGhlIGZvcm1zIFxjb2Rle1xWQVJ7fSAkdiQgPSAkZSQ7fSAsICBcY29kZXskVCQgJHYkID0gJGUkO30gLCAgIFxjb2Rle1xGSU5BTHt9ICR2JCA9ICRlJDt9ICwgIFxjb2Rle1xGSU5BTHt9ICRUJCAkdiQgPSAkZSQ7fSwgXGNvZGV7XFNUQVRJQ3t9ICR2JCA9ICRlJDsgfSwgXGNvZGV7XFNUQVRJQ3t9ICRUJCAkdiQgPSAkZSQ7IH0sIFxjb2Rle1xTVEFUSUN7fSBcRklOQUx7fSAkdiQgPSAkZSQ7IH0gb3IgXGNvZGV7XFNUQVRJQ3t9IFxGSU5BTHt9ICRUJCAkdiQgPSAkZSQ7fSBhbmQgbm8gdmFsdWUgaGFzIHlldCBiZWVuIHN0b3JlZCBpbnRvICR2JCB0aGVuIHRoZSBpbml0aWFsaXplciBleHByZXNzaW9uICRlJCBpcyBldmFsdWF0ZWQuIElmLCBkdXJpbmcgdGhlIGV2YWx1YXRpb24gb2YgJGUkLCB0aGUgZ2V0dGVyIGZvciAkdiQgaXMgaW52b2tlZCwgYSBcY29kZXtDeWNsaWNJbml0aWFsaXphdGlvbkVycm9yfSBpcyB0aHJvd24uIElmIHRoZSBldmFsdWF0aW9uIHN1Y2NlZWRlZCB5aWVsZGluZyBhbiBvYmplY3QgJG8kLCBsZXQgJHIgPSBvJCwgb3RoZXJ3aXNlIGxldCAkciA9IFxOVUxMe30kLiBJbiBhbnkgY2FzZSwgJHIkIGlzIHN0b3JlZCBpbnRvICR2JC4gVGhlIHJlc3VsdCBvZiBleGVjdXRpbmcgdGhlIGdldHRlciBpcyAkciQuIApcaXRlbSAge1xiZiBDb25zdGFudCB2YXJpYWJsZSBkZWNsYXJhdGlvbn0uIElmICRkJCBpcyBvZiBvbmUgb2YgdGhlIGZvcm1zIFxjb2Rle1xDT05TVHt9ICR2JCA9ICRlJDsgfSAsICBcY29kZXtcQ09OU1R7fSAkVCQgICR2JCA9ICRlJDsgfSwgIFxjb2Rle1xTVEFUSUN7fSBcQ09OU1R7fSAkdiQgPSAkZSQ7IH0gIG9yIFxjb2Rle1xTVEFUSUN7fSBcQ09OU1R7fSAkVCQgJHYkID0gJGUkO30gdGhlIHJlc3VsdCBvZiB0aGUgZ2V0dGVyIGlzIHRoZSB2YWx1ZSBvZiB0aGUgY29tcGlsZSB0aW1lIGNvbnN0YW50ICRlJC4gXGNvbW1lbnRhcnl7Tm90ZSB0aGF0IGEgY29tcGlsZSB0aW1lIGNvbnN0YW50IGNhbm5vdCBkZXBlbmQgb24gaXRzZWxmLCBzbyBubyBjeWNsaWMgcmVmZXJlbmNlcyBjYW4gb2NjdXIufSAKT3RoZXJ3aXNlClxpdGVtIHtcYmYgVmFyaWFibGUgZGVjbGFyYXRpb24gd2l0aG91dCBpbml0aWFsaXplcn0uIFRoZSByZXN1bHQgb2YgZXhlY3V0aW5nIHRoZSBnZXR0ZXIgbWV0aG9kIGlzIHRoZSB2YWx1ZSBzdG9yZWQgaW4gJHYkLiAgClxlbmR7aXRlbWl6ZX0KCgoKCgpcc2VjdGlvbntGdW5jdGlvbnN9ClxsYWJlbHtmdW5jdGlvbnN9CgpGdW5jdGlvbnMgYWJzdHJhY3Qgb3ZlciBleGVjdXRhYmxlIGFjdGlvbnMuCgpcYmVnaW57Z3JhbW1hcn0Ke1xiZiBmdW5jdGlvblNpZ25hdHVyZTp9CiAgICBtZXRhZGF0YSByZXR1cm5UeXBlPyBpZGVudGlmaWVyIGZvcm1hbFBhcmFtZXRlckxpc3QKICAgIC4KICAgIAp7XGJmIHJldHVyblR5cGU6fQogICAgICBcVk9JRHt9OwogICAgICB0eXBlCiAgICAuCgp7XGJmIGZ1bmN0aW9uQm9keTp9YD17XGVzY2FwZWdyYW1tYXIgXGd0fScgZXhwcmVzc2lvbiBge1xlc2NhcGVncmFtbWFyIDt9JzsKICAgICBibG9jawogICAgLgoKe1xiZiBibG9jazp9CiAgICAgIGBceycgc3RhdGVtZW50cyBgXH0nCiAgICAuCgpcZW5ke2dyYW1tYXJ9CgpGdW5jdGlvbnMgaW5jbHVkZSAgZnVuY3Rpb24gZGVjbGFyYXRpb25zIChccmVme2Z1bmN0aW9uRGVjbGFyYXRpb25zfSksIG1ldGhvZHMgKFxyZWZ7aW5zdGFuY2VNZXRob2RzfSwgIFxyZWZ7c3RhdGljTWV0aG9kc30pLCBnZXR0ZXJzICAoXHJlZntnZXR0ZXJzfSksIHNldHRlcnMgIChccmVme3NldHRlcnN9KSwgY29uc3RydWN0b3JzICAoXHJlZntjb25zdHJ1Y3RvcnN9KSBhbmQgZnVuY3Rpb24gbGl0ZXJhbHMgIChccmVme2Z1bmN0aW9uRXhwcmVzc2lvbnN9KS4gIAoKQWxsIGZ1bmN0aW9ucyBoYXZlIGEgc2lnbmF0dXJlIGFuZCBhIGJvZHkuIFRoZSBzaWduYXR1cmUgZGVzY3JpYmVzIHRoZSBmb3JtYWwgcGFyYW1ldGVycyBvZiB0aGUgZnVuY3Rpb24sIGFuZCBwb3NzaWJseSBpdHMgbmFtZSBhbmQgcmV0dXJuIHR5cGUuICBBIGZ1bmN0aW9uIGJvZHkgaXMgZWl0aGVyOgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gQSBibG9jayBzdGF0ZW1lbnQgIChccmVme2Jsb2Nrc30pIGNvbnRhaW5pbmcgdGhlIHN0YXRlbWVudHMgIChccmVme3N0YXRlbWVudHN9KSBleGVjdXRlZCBieSB0aGUgZnVuY3Rpb24uIEluIHRoaXMgY2FzZSwgaWYgdGhlIGxhc3Qgc3RhdGVtZW50IG9mIGEgZnVuY3Rpb24gaXMgbm90IGEgcmV0dXJuIHN0YXRlbWVudCwgdGhlIHN0YXRlbWVudCBcY29kZXtcUkVUVVJOe307fSBpcyBpbXBsaWNpdGx5IGFwcGVuZGVkIHRvIHRoZSBmdW5jdGlvbiBib2R5LgoKXHJhdGlvbmFsZXsKQmVjYXVzZSBEYXJ0IGlzIG9wdGlvbmFsbHkgdHlwZWQsIHdlIGNhbm5vdCBndWFyYW50ZWUgdGhhdCBhIGZ1bmN0aW9uIHRoYXQgZG9lcyBub3QgcmV0dXJuIGEgdmFsdWUgd2lsbCBub3QgYmUgdXNlZCBpbiB0aGUgY29udGV4dCBvZiBhbiBleHByZXNzaW9uLiBUaGVyZWZvcmUsIGV2ZXJ5IGZ1bmN0aW9uIG11c3QgcmV0dXJuIGEgdmFsdWUuIEEgXFJFVFVSTnt9IHdpdGhvdXQgYW4gZXhwcmVzc2lvbiByZXR1cm5zIFxOVUxMe30uIFNlZSBmdXJ0aGVyIGRpc2N1c3Npb24gaW4gc2VjdGlvbiBccmVme3JldHVybn0uCn0KCk9SClxpdGVtIG9mIHRoZSBmb3JtICAgXGNvZGV7PSQ+JCAkZSR9IHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gYSBib2R5IG9mIHRoZSBmb3JtIFxjb2Rle1x7XFJFVFVSTnt9ICRlJDtcfX0uClxlbmR7aXRlbWl6ZX0KCgoKJSBBIGZ1bmN0aW9uIGhhcyBhIGZvcm1hbCBwYXJhbWV0ZXIgc2NvcGUgYW5kIGEgIGJvZHkgc2NvcGUuIFRoZSBlbmNsb3Npbmcgc2NvcGUgb2YgYSBmdW5jdGlvbidzIGJvZHkgc2NvcGUgaXMgaXRzIGZvcm1hbCBwYXJhbWV0ZXIgc2NvcGUuIFRoZSBlbmNsb3Npbmcgc2NvcGUgb2YgdGhlICBmb3JtYWwgcGFyYW1ldGVyIHNjb3BlIG9mIGEgZnVuY3Rpb24gaXMgdGhlIGVuY2xvc2luZyBzY29wZSBvZiB0aGUgZnVuY3Rpb24uCgolIFRoZSBib2R5IG9mIGEgZnVuY3Rpb24gJGYkIGlzIHByb2Nlc3NlZCB3aXRoaW4gdGhlIGJvZHkgc2NvcGUgb2YgJGYkLgolXHJhdGlvbmFsZXtUaGlzIG1heSBzZWVtIG9idmlvdXMsIGJ1dCBuZWVkcyB0byBiZSBzdGF0ZWQufQolIFxjb21tZW50YXJ5e0l0IGZvbGxvd3MgZnJvbSB0aGUgYWJvdmUgcnVsZXMgdGhhdCB0aGUgZm9ybWFsIHBhcmFtZXRlcnMgb2YgYSBmdW5jdGlvbiBtYXkgYmUgcmVmZXJlbmNlZCB3aXRoaW4gaXRzIGJvZHkuICB9Cgpcc3Vic2VjdGlvbntGdW5jdGlvbiBEZWNsYXJhdGlvbnN9ClxsYWJlbHtmdW5jdGlvbkRlY2xhcmF0aW9uc30KCkEge1xlbSBmdW5jdGlvbiBkZWNsYXJhdGlvbn0gaXMgYSBmdW5jdGlvbiB0aGF0IGlzIG5laXRoZXIgYSBtZW1iZXIgb2YgYSBjbGFzcyBub3IgYSBmdW5jdGlvbiBsaXRlcmFsLiBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgaW5jbHVkZSB7XGVtIGxpYnJhcnkgZnVuY3Rpb25zfSwgd2hpY2ggYXJlIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyAKJShpbmNsdWRpbmcgZ2V0dGVycyBhbmQgc2V0dGVycykgCmF0IHRoZSB0b3AgbGV2ZWwgb2YgYSBsaWJyYXJ5LCBhbmQge1xlbSBsb2NhbCBmdW5jdGlvbnN9LCB3aGljaCBhcmUgZnVuY3Rpb24gZGVjbGFyYXRpb25zIGRlY2xhcmVkIGluc2lkZSBvdGhlciBmdW5jdGlvbnMuIExpYnJhcnkgZnVuY3Rpb25zIGFyZSBvZnRlbiByZWZlcnJlZCB0byBzaW1wbHkgYXMgdG9wLWxldmVsIGZ1bmN0aW9ucy4KCkEgZnVuY3Rpb24gZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4gaWRlbnRpZmllciBpbmRpY2F0aW5nIHRoZSBmdW5jdGlvbidzIG5hbWUsIHBvc3NpYmx5IHByZWZhY2VkIGJ5IGEgcmV0dXJuIHR5cGUuIFRoZSBmdW5jdGlvbiBuYW1lIGlzIGZvbGxvd2VkIGJ5IGEgc2lnbmF0dXJlIGFuZCBib2R5LiBGb3IgZ2V0dGVycywgdGhlIHNpZ25hdHVyZSAgaXMgZW1wdHkuIFRoZSBib2R5IGlzIGVtcHR5IGZvciBmdW5jdGlvbnMgdGhhdCBhcmUgZXh0ZXJuYWwuCgpUaGUgc2NvcGUgb2YgYSBsaWJyYXJ5IGZ1bmN0aW9uIGlzIHRoZSBzY29wZSBvZiB0aGUgZW5jbG9zaW5nIGxpYnJhcnkuIFRoZSBzY29wZSBvZiBhIGxvY2FsIGZ1bmN0aW9uIGlzICBkZXNjcmliZWQgaW4gc2VjdGlvbiBccmVme2xvY2FsRnVuY3Rpb25EZWNsYXJhdGlvbn0uIEluIGJvdGggY2FzZXMsIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiBpcyBpbiBzY29wZSBpbiBpdHMgZm9ybWFsIHBhcmFtZXRlciBzY29wZSAoXHJlZntmb3JtYWxQYXJhbWV0ZXJzfSkuCgolQSBmdW5jdGlvbiBkZWNsYXJhdGlvbiBvZiB0aGUgZm9ybSAgJFRfMCQgJGlkKFRfMSQgJGFfMSwgXGxkb3RzLCBUX24kICRhX24sIFtUX3tuKzF9JCAkeF97bisxfSA9IGRfMSwgXGxkb3RzLCBUX3tuK2t9JCAkeF97bitrfSA9IGRfa10pXHtzXH0kIGlzIGVxdWl2YWxlbnQgdG8gYSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBvZiB0aGUgZm9ybSBcY29kZXtcRklOQUx7fSAkRiQgJGlkJCA9ICQoVF8xJCAkYV8xLCBcbGRvdHMsIFRfbiQgJGFfbiwgW1Rfe24rMX0kICR4X3tuKzF9ID0gZF8xLCBcbGRvdHMsIFRfe24ra30kICR4X3tuK2t9PSBkX2tdKVx7c1x9JH0sIHdoZXJlICRGJCBpcyB0aGUgZnVuY3Rpb24gdHlwZSBhbGlhcyAoXHJlZnt0eXBlZGVmfSkgXGNvZGV7XFRZUEVERUZ7fSAkVF8wJCAkRihUXzEkICRhXzEsIFxsZG90cywgVF9uJCAkYV9uLCBbVF97bisxfSQgJHhfe24rMX0sIFxsZG90cywgVF97bitrfSQgJHhfe24ra31dKSR9LiAgTGlrZXdpc2UsICBhIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIG9mIHRoZSBmb3JtICAkaWQoVF8xJCAkYV8xLCBcbGRvdHMsIFRfbiQgJGFfbiwgW1Rfe24rMX0kICR4X3tuKzF9ID0gZF8xLCBcbGRvdHMsIFRfe24ra30kICR4X3tuK2t9ID0gZF9rXSlce3NcfSQgaXMgZXF1aXZhbGVudCB0byBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uIG9mIHRoZSBmb3JtIFxjb2Rle1xGSU5BTHt9ICRGJCAkaWQkID0gJChUXzEkICRhXzEsIFxsZG90cywgVF9uJCAkYV9uLCBbVF97bisxfSQgJHhfe24rMX0gPSBkXzEsIFxsZG90cywgVF97bitrfSQgJHhfe24ra30gPSBkX2tdKVx7c1x9JH0sIHdoZXJlICRGJCBpcyB0aGUgZnVuY3Rpb24gdHlwZSBhbGlhcyBcY29kZXtcVFlQRURFRnt9ICAkRihUXzEkICRhXzEsIFxsZG90cywgVF9uJCAkYV9uLCBbVF97bisxfSQgJHhfe24rMX0sIFxsZG90cywgVF97bitrfSQgJHhfe24ra31dKSR9LiAKCiVcUXtXZSBuZWVkIHRvIGNvdmVyIGxpYnJhcnkgZ2V0dGVycyBhcyB3ZWxsLn0KCiVcUXsgVGhlIGRlZmluaXRpb24gaW4gdGVybXMgb2YgdmFyaWFibGVzIGlzIHVudHJ1ZSwgYmVjYXVzZSB0aGUgY29kZSB3b3VsZCBiZSBpbGxlZ2FsLiBUaGUgaW5pdGlhbGl6ZXIgY2Fubm90IHJlZmVyIHRvIHRoZSBmdW5jdGlvbiBuYW1lIGluIHRoaXMgY2FzZS4gIEkgYmVsaWV2ZSB0aGUgYmVzdCBmaXggaXMgdG8gcmVsYXggdGhpcwolcmVxdWlyZW1lbnQgaW4gdGhlIGNhc2Ugb2YgY2xvc3VyZXMuIFNlZSBidWcgMzE1LgolfQoKJVxjb21tZW50YXJ5ewolU29tZSBvYnZpb3VzIGNvbmNsdXNpb25zOgoKJUEgZnVuY3Rpb24gZGVjbGFyYXRpb24gb2YgdGhlIGZvcm0gJGlkKFRfMSQgJGFfMSwgXGxkb3RzLCBUX24kICRhX24sIFtUX3tuKzF9JCAkeF97bisxfSA9IGRfMSwgXGxkb3RzLCBUX3tuK2t9JCAkeF97bitrfSA9IGRfa10pID0+IGUkIGlzIGVxdWl2YWxlbnQgdG8gYSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBvZiB0aGUgZm9ybSBcY29kZXtcRklOQUx7fSAgJGlkJCA9ICgkKFRfMSQgJGFfMSwgXGxkb3RzLCBUX24kICRhX24sIFtUX3tuKzF9JCAkeF97bisxfSA9IGRfMSwgXGxkb3RzLCBUX3tuK2t9JCAkeF97bitrfSA9IGRfa10pPT4gZSR9LgoKJUEgZnVuY3Rpb24gbGl0ZXJhbCBvZiB0aGUgZm9ybSAkKFRfMSQgJGFfMSwgXGxkb3RzLCBUX24kICRhX24sIFtUX3tuKzF9JCAkeF97bisxfSA9IGRfMSwgXGxkb3RzLCBUX3tuK2t9JCAkeF97bitrfSA9IGRfa10pID0+IGUkIGlzIGVxdWl2YWxlbnQgdG8gYSBmdW5jdGlvbiBsaXRlcmFsIG9mIHRoZSBmb3JtICBcY29kZXskKFRfMSQgJGFfMSwgXGxkb3RzLCBUX24kICRhX24sIFtUX3tuKzF9JCAkeF97bisxfSA9IGRfMSwgXGxkb3RzLCBUX3tuK2t9JCAkeF97bitrfSA9IGRfa10pXHskIFxSRVRVUk57fSAkZSQ7XH19LgolfQoKJUEgZnVuY3Rpb24gZGVjbGFyYXRpb24gb2YgdGhlIGZvcm0gICRUXzAkICRpZChUXzEkICRhXzEsIFxsZG90cywgVF9uJCAkYV9uLCBce1Rfe24rMX0kICR4X3tuKzF9IDogZF8xLCBcbGRvdHMsIFRfe24ra30kICR4X3tuK2t9IDogZF9rXH0pXHtzXH0kIGlzIGVxdWl2YWxlbnQgdG8gYSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBvZiB0aGUgZm9ybSBcY29kZXtcRklOQUx7fSAkRiQgJGlkJCA9ICQoVF8xJCAkYV8xLCBcbGRvdHMsIFRfbiQgJGFfbiwgXHtUX3tuKzF9JCAkeF97bisxfSA6IGRfMSwgXGxkb3RzLCBUX3tuK2t9JCAkeF97bitrfSA6IGRfa1x9KVx7c1x9JH0sIHdoZXJlICRGJCBpcyB0aGUgZnVuY3Rpb24gdHlwZSBhbGlhcyAoXHJlZnt0eXBlZGVmfSkgXGNvZGV7XFRZUEVERUZ7fSAkVF8wJCAkRihUXzEkICRhXzEsIFxsZG90cywgVF9uJCAkYV9uLCBce1Rfe24rMX0kICR4X3tuKzF9LCBcbGRvdHMsIFRfe24ra30kICR4X3tuK2t9XVx9JH0uICBMaWtld2lzZSwgIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24gb2YgdGhlIGZvcm0gICRpZChUXzEkICRhXzEsIFxsZG90cywgVF9uJCAkYV9uLCBce1Rfe24rMX0kICR4X3tuKzF9IDogZF8xLCBcbGRvdHMsIFRfe24ra30kICR4X3tuK2t9IDogZF9rXH0pXHtzXH0kIGlzIGVxdWl2YWxlbnQgdG8gYSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBvZiB0aGUgZm9ybSBcY29kZXtcRklOQUx7fSAkRiQgJGlkJCA9ICQoVF8xJCAkYV8xLCBcbGRvdHMsIFRfbiQgJGFfbiwgXHtUX3tuKzF9JCAkeF97bisxfSA6IGRfMSwgXGxkb3RzLCBUX3tuK2t9JCAkeF97bitrfSA6IGRfa1x9KVx7c1x9JH0sIHdoZXJlICRGJCBpcyB0aGUgZnVuY3Rpb24gdHlwZSBhbGlhcyBcY29kZXtcVFlQRURFRnt9ICAkRihUXzEkICRhXzEsIFxsZG90cywgVF9uJCAkYV9uLCBce1Rfe24rMX0kICR4X3tuKzF9LCBcbGRvdHMsIFRfe24ra30kICR4X3tuK2t9XH0pJH0uCgpJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciB0byBwcmVmYWNlIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24gd2l0aCB0aGUgYnVpbHQtaW4gaWRlbnRpZmllciBcU1RBVElDe30uCgpcc3Vic2VjdGlvbntGb3JtYWwgUGFyYW1ldGVyc30KXGxhYmVse2Zvcm1hbFBhcmFtZXRlcnN9CgpFdmVyeSBmdW5jdGlvbiBpbmNsdWRlcyBhIHtcZW0gZm9ybWFsIHBhcmFtZXRlciBsaXN0fSwgd2hpY2ggY29uc2lzdHMgb2YgYSBsaXN0IG9mIHJlcXVpcmVkIHBvc2l0aW9uYWwgcGFyYW1ldGVycyAoXHJlZntyZXF1aXJlZEZvcm1hbHN9KSwgZm9sbG93ZWQgYnkgYW55IG9wdGlvbmFsIHBhcmFtZXRlcnMgKFxyZWZ7b3B0aW9uYWxGb3JtYWxzfSkuIFRoZSBvcHRpb25hbCBwYXJhbWV0ZXJzIG1heSBiZSBzcGVjaWZpZWQgZWl0aGVyIGFzIGEgc2V0IG9mIG5hbWVkIHBhcmFtZXRlcnMgb3IgYXMgYSBsaXN0IG9mIHBvc2l0aW9uYWwgcGFyYW1ldGVycywgYnV0IG5vdCBib3RoLgoKVGhlIGZvcm1hbCBwYXJhbWV0ZXIgbGlzdCBvZiBhIGZ1bmN0aW9uIGludHJvZHVjZXMgYSBuZXcgc2NvcGUga25vd24gYXMgdGhlIGZ1bmN0aW9uYHMge1xlbSBmb3JtYWwgcGFyYW1ldGVyIHNjb3BlfS4gVGhlIGZvcm1hbCBwYXJhbWV0ZXIgc2NvcGUgb2YgYSBmdW5jdGlvbiAkZiQgIGlzIGVuY2xvc2VkIGluIHRoZSBzY29wZSB3aGVyZSAkZiQgaXMgZGVjbGFyZWQuICAgRXZlcnkgZm9ybWFsIHBhcmFtZXRlciBpbnRyb2R1Y2VzIGEgbG9jYWwgdmFyaWFibGUgaW50byB0aGUgZm9ybWFsIHBhcmFtZXRlciBzY29wZS4gSG93ZXZlciwgdGhlIHNjb3BlIG9mIGEgZnVuY3Rpb24ncyBzaWduYXR1cmUgaXMgdGhlIGZ1bmN0aW9uJ3MgZW5jbG9zaW5nIHNjb3BlLCBub3QgdGhlIGZvcm1hbCBwYXJhbWV0ZXIgc2NvcGUuCgpUaGUgYm9keSBvZiBhIGZ1bmN0aW9uIGludHJvZHVjZXMgYSBuZXcgc2NvcGUga25vd24gYXMgdGhlIGZ1bmN0aW9uYHMge1xlbSAgYm9keSBzY29wZX0uIFRoZSBib2R5IHNjb3BlIG9mIGEgZnVuY3Rpb24gJGYkICBpcyBlbmNsb3NlZCAgaW4gdGhlIHNjb3BlIGludHJvZHVjZWQgYnkgdGhlIGZvcm1hbCBwYXJhbWV0ZXIgc2NvcGUgb2YgJGYkLgoKCiVUaGUgZm9ybWFsIHBhcmFtZXRlciBzY29wZSBvZiBhIGZ1bmN0aW9uIG1hcHMgdGhlIG5hbWUgb2YgZWFjaCBmb3JtYWwgcGFyYW1ldGVyICRwJCB0byB0aGUgdmFsdWUgJHAkIGlzIGJvdW5kIHRvLiAKCiUgVGhlIGZvcm1hbCBwYXJhbWV0ZXJzIG9mIGEgZnVuY3Rpb24gYXJlIHByb2Nlc3NlZCBpbiB0aGUgZW5jbG9zaW5nIHNjb3BlIG9mIHRoZSBmdW5jdGlvbi4gCiUgXGNvbW1lbnRhcnl7dGhpcyBtZWFucyB0aGF0IHRoZSBwYXJhbWV0ZXJzIHRoZW1zZWx2ZXMgbWF5IG5vdCBiZSByZWZlcmVuY2VkIHdpdGhpbiB0aGUgZm9ybWFsIHBhcmFtZXRlciBsaXN0Ln0KCkl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIGEgZm9ybWFsIHBhcmFtZXRlciBpcyBkZWNsYXJlZCBhcyBhIGNvbnN0YW50IHZhcmlhYmxlIChccmVme3ZhcmlhYmxlc30pLgoKXGJlZ2lue2dyYW1tYXJ9CntcYmYgZm9ybWFsUGFyYW1ldGVyTGlzdDp9YCgnIGApJzsKIGAoJyBub3JtYWxGb3JtYWxQYXJhbWV0ZXJzICggYCwnICBvcHRpb25hbEZvcm1hbFBhcmFtZXRlcnMpPyBgKSc7CiAgYCgnIG9wdGlvbmFsRm9ybWFsUGFyYW1ldGVycyBgKScKICAgLgolXGVuZHtncmFtbWFyfQolfQoKJVxiZWdpbntncmFtbWFyfQolZm9ybWFsUGFyYW1ldGVyTGlzdDogICAgIAolICAgICAgJygnIHJlc3RGb3JtYWxQYXJhbWV0ZXI/ICcpJzsKJSAgICAgICcoJyBuYW1lZEZvcm1hbFBhcmFtZXRlcnMgJyknOwogJSAgICAgJygnIG5vcm1hbEZvcm1hbFBhcmFtZXRlcnMgbm9ybWFsRm9ybWFsUGFyYW1ldGVyVGFpbD8gJyknCiAgJSAgLgoKe1xiZiBub3JtYWxGb3JtYWxQYXJhbWV0ZXJzOn0KICAgICAgbm9ybWFsRm9ybWFsUGFyYW1ldGVyIChgLCcgbm9ybWFsRm9ybWFsUGFyYW1ldGVyKSoKICAgIC4KCntcYmYgb3B0aW9uYWxGb3JtYWxQYXJhbWV0ZXJzOn1vcHRpb25hbFBvc2l0aW9uYWxGb3JtYWxQYXJhbWV0ZXJzOwogICAgICBuYW1lZEZvcm1hbFBhcmFtZXRlcnMKICAgIC4KCntcYmYgb3B0aW9uYWxQb3NpdGlvbmFsRm9ybWFsUGFyYW1ldGVyczp9CiAgICAgIGBbJyBkZWZhdWx0Rm9ybWFsUGFyYW1ldGVyIChgLCcgZGVmYXVsdEZvcm1hbFBhcmFtZXRlcikqIGBdJwogICAgLgp7XGJmIG5hbWVkRm9ybWFsUGFyYW1ldGVyczp9CiAgICAgIGBceycgZGVmYXVsdE5hbWVkUGFyYW1ldGVyIChgLCcgZGVmYXVsdE5hbWVkUGFyYW1ldGVyKSogYFx9JwogICAgLgpcZW5ke2dyYW1tYXJ9CgolRm9ybWFsIHBhcmFtZXRlcnMgYXJlIGFsd2F5cyBcRklOQUx7fS4gIAolXFF7V2UncmUgYXdhaXRpbmcgc29tZSBkYXRhIG9uIHdoZXRoZXIgZW5mb3JjaW5nIHRoaXMgd291bGQgY2F1c2Ugd2lkZXNwcmVhZCBwYWluLn0KJUEgZm9ybWFsIHBhcmFtZXRlciBpcyBhbHdheXMgY29uc2lkZXJlZCB0byBiZSBpbml0aWFsaXplZC4gIFxyYXRpb25hbGV7VGhpcyBpcyBiZWNhdXNlIGl0IHdpbGwgYWx3YXlzIGJlIGluaXRpYWxpemVkIGJ5IHRoZSBjYWxsIC0gZXZlbiBpZiBpdCBpcyBvcHRpb25hbC59CgoKXHN1YnN1YnNlY3Rpb257UmVxdWlyZWQgRm9ybWFsc30gClxsYWJlbHtyZXF1aXJlZEZvcm1hbHN9CgpBIHtcZW0gcmVxdWlyZWQgZm9ybWFsIHBhcmFtZXRlcn0gbWF5IGJlIHNwZWNpZmllZCBpbiBvbmUgb2YgdGhyZWUgd2F5czoKXGJlZ2lue2l0ZW1pemV9ClxpdGVtIEJ5IG1lYW5zIG9mIGEgZnVuY3Rpb24gc2lnbmF0dXJlIHRoYXQgbmFtZXMgdGhlIHBhcmFtZXRlciBhbmQgZGVzY3JpYmVzIGl0cyB0eXBlIGFzIGEgZnVuY3Rpb24gdHlwZSAoXHJlZntmdW5jdGlvblR5cGVzfSkuICBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBhbnkgZGVmYXVsdCB2YWx1ZXMgYXJlIHNwZWNpZmllZCBpbiB0aGUgc2lnbmF0dXJlIG9mIHN1Y2ggYSBmdW5jdGlvbiB0eXBlLiUgZXhwbGFpbiB3aGF0IHRoZSB0eXBlIGlzIGluIHRoaXMgY2FzZT8gV2hlcmUgaXMgdGhpcyBkZXNjcmliZWQgaW4gZ2VuZXJhbD8KXGl0ZW0gQXMgYW4gaW5pdGlhbGl6aW5nIGZvcm1hbCwgd2hpY2ggaXMgb25seSB2YWxpZCBhcyBhIHBhcmFtZXRlciB0byBhIGdlbmVyYXRpdmUgY29uc3RydWN0b3IgKFxyZWZ7Z2VuZXJhdGl2ZUNvbnN0cnVjdG9yc30pLiAlIGRvIHdlIG5lZWQgdG8gc2F5IHRoaXMsIG9yIGFueXRoaW5nIG1vcmU/ClxpdGVtIFZpYSBhbiBvcmRpbmFyeSB2YXJpYWJsZSBkZWNsYXJhdGlvbiAoXHJlZnt2YXJpYWJsZXN9KS4KXGVuZHtpdGVtaXplfQoKXGJlZ2lue2dyYW1tYXJ9CntcYmYgbm9ybWFsRm9ybWFsUGFyYW1ldGVyOn1mdW5jdGlvblNpZ25hdHVyZTsKICAgICAgZmllbGRGb3JtYWxQYXJhbWV0ZXI7CiAgICAgIHNpbXBsZUZvcm1hbFBhcmFtZXRlcgogLgoKe1xiZiBzaW1wbGVGb3JtYWxQYXJhbWV0ZXI6fWRlY2xhcmVkSWRlbnRpZmllcjsKICAgICAgbWV0YWRhdGEgaWRlbnRpZmllcgogICAgLgoKe1xiZiBmaWVsZEZvcm1hbFBhcmFtZXRlcjp9CiAgIG1ldGFkYXRhIGZpbmFsQ29uc3RWYXJPclR5cGU/IFxUSElTe30gYHtcZXNjYXBlZ3JhbW1hciAufScgaWRlbnRpZmllciBmb3JtYWxQYXJhbWV0ZXJMaXN0PwogICAuClxlbmR7Z3JhbW1hcn0KCiVcc3Vic3Vic2VjdGlvbntSZXN0IEZvcm1hbHN9CgolQSByZXN0IGZvcm1hbCAkUiQgbXVzdCBiZSB0aGUgbGFzdCBwYXJhbWV0ZXIgaW4gYSBmb3JtYWwgcGFyYW1ldGVyIGxpc3QuICBJZiBhICB0eXBlICRUJCBpcyBzcGVjaWZpZWQgZm9yICRSJCwgaXQgc2lnbmlmaWVzIHRoYXQgdGhlIHR5cGUgb2YgJFIkIGlzICRUW10kLiAKCiVcYmVnaW57Z3JhbW1hcn0KJXJlc3RGb3JtYWxQYXJhbWV0ZXI6CiUgICAgICBmaW5hbENvbnN0VmFyT3JUeXBlPyAne1xlc2NhcGVncmFtbWFyIC4uLn0nIGlkZW50aWZpZXIKICVcZW5ke2dyYW1tYXJ9Cgpcc3Vic3Vic2VjdGlvbntPcHRpb25hbCBGb3JtYWxzfQpcbGFiZWx7b3B0aW9uYWxGb3JtYWxzfQoKT3B0aW9uYWwgcGFyYW1ldGVycyBtYXkgYmUgc3BlY2lmaWVkIGFuZCBwcm92aWRlZCB3aXRoIGRlZmF1bHQgdmFsdWVzLgoKXGJlZ2lue2dyYW1tYXJ9CntcYmYgZGVmYXVsdEZvcm1hbFBhcmFtZXRlcjp9CiAgICAgIG5vcm1hbEZvcm1hbFBhcmFtZXRlciAoJz0nIGV4cHJlc3Npb24pPwogICAgLiAgIAogICAgICAgIAp7XGJmIGRlZmF1bHROYW1lZFBhcmFtZXRlcjp9CiAgICAgIG5vcm1hbEZvcm1hbFBhcmFtZXRlciAoIGB7XGVzY2FwZWdyYW1tYXIgOn0nIGV4cHJlc3Npb24pPwogICAgLiAgIApcZW5ke2dyYW1tYXJ9CgpJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgaXMgbm90IGEgY29tcGlsZS10aW1lIGNvbnN0YW50IChccmVme2NvbnN0YW50c30pLiBJZiBubyBkZWZhdWx0IGlzIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGZvciBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgYW4gaW1wbGljaXQgZGVmYXVsdCBvZiBcTlVMTHt9IGlzIHByb3ZpZGVkLgoKSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgdGhlIG5hbWUgb2YgYSBuYW1lZCBvcHRpb25hbCBwYXJhbWV0ZXIgYmVnaW5zIHdpdGggYW4gYFxfJyBjaGFyYWN0ZXIuCgpccmF0aW9uYWxlewpUaGUgbmVlZCBmb3IgdGhpcyAgcmVzdHJpY3Rpb24gaXMgYSBkaXJlY3QgY29uc2VxdWVuY2Ugb2YgdGhlIGZhY3QgdGhhdCBuYW1pbmcgYW5kIHByaXZhY3kgYXJlIG5vdCBvcnRob2dvbmFsLgpJZiB3ZSBhbGxvd2VkIG5hbWVkIHBhcmFtZXRlcnMgdG8gYmVnaW4gd2l0aCBhbiB1bmRlcnNjb3JlLCB0aGV5IHdvdWxkIGJlIGNvbnNpZGVyZWQgcHJpdmF0ZSBhbmQgaW5hY2Nlc3NpYmxlIHRvIGNhbGxlcnMgZnJvbSBvdXRzaWRlIHRoZSBsaWJyYXJ5IHdoZXJlIGl0IHdhcyBkZWZpbmVkLiBJZiBhIG1ldGhvZCBvdXRzaWRlIHRoZSBsaWJyYXJ5IG92ZXJyb2RlIGEgbWV0aG9kIHdpdGggYSBwcml2YXRlIG9wdGlvbmFsIG5hbWUsIGl0IHdvdWxkIG5vdCBiZSBhIHN1YnR5cGUgb2YgdGhlIG9yaWdpbmFsIG1ldGhvZC4gVGhlIHN0YXRpYyBjaGVja2VyIHdvdWxkIG9mIGNvdXJzZSBmbGFnIHN1Y2ggc2l0dWF0aW9ucywgYnV0IHRoZSBjb25zZXF1ZW5jZSB3b3VsZCBiZSB0aGF0IGFkZGluZyBhIHByaXZhdGUgbmFtZWQgZm9ybWFsIHdvdWxkIGJyZWFrIGNsaWVudHMgb3V0c2lkZSB0aGUgbGlicmFyeSBpbiBhIHdheSB0aGV5IGNvdWxkIG5vdCBlYXNpbHkgY29ycmVjdC4gCn0KClxzdWJzZWN0aW9ue1R5cGUgb2YgYSBGdW5jdGlvbn0KXGxhYmVse3R5cGVPZkFGdW5jdGlvbn0KCklmIGEgZnVuY3Rpb24gZG9lcyBub3QgZGVjbGFyZSBhIHJldHVybiB0eXBlIGV4cGxpY2l0bHksIGl0cyByZXR1cm4gdHlwZSBpcyBcRFlOQU1JQ3t9IChccmVme3R5cGVEeW5hbWljfSkuCgpMZXQgJEYkIGJlIGEgZnVuY3Rpb24gd2l0aCByZXF1aXJlZCBmb3JtYWwgcGFyYW1ldGVycyAkVF8xJCAkcF8xIFxsZG90cywgVF9uJCAkcF9uJCwgcmV0dXJuIHR5cGUgJFRfMCQgYW5kIG5vIG9wdGlvbmFsIHBhcmFtZXRlcnMuIFRoZW4gdGhlIHR5cGUgb2YgJEYkIGlzICQoVF8xICxcbGRvdHMsIFRfbikgXHJpZ2h0YXJyb3cgVF8wJC4KCkxldCAkRiQgYmUgYSBmdW5jdGlvbiB3aXRoIHJlcXVpcmVkIGZvcm1hbCBwYXJhbWV0ZXJzICRUXzEkICRwXzEgXGxkb3RzLCBUX24kICRwX24kLCByZXR1cm4gdHlwZSAkVF8wJCBhbmQgcG9zaXRpb25hbCBvcHRpb25hbCBwYXJhbWV0ZXJzICRUX3tuKzF9JCAkcF97bisxfSwgXGxkb3RzLCBUX3tuK2t9JCAkIHBfe24ra30kLiBUaGVuIHRoZSB0eXBlIG9mICRGJCBpcyAkKFRfMSAsXGxkb3RzLCBUX24sIFtUX3tuKzF9JCAkcF97bisxfSwgXGxkb3RzLCBUX3tuK2t9JCAgJHBfe24ra31dKSBccmlnaHRhcnJvdyBUXzAkLgoKTGV0ICRGJCBiZSBhIGZ1bmN0aW9uIHdpdGggcmVxdWlyZWQgZm9ybWFsIHBhcmFtZXRlcnMgJFRfMSQgJHBfMSBcbGRvdHMsIFRfbiQgJHBfbiQsIHJldHVybiB0eXBlICRUXzAkIGFuZCBuYW1lZCBvcHRpb25hbCBwYXJhbWV0ZXJzICRUX3tuKzF9JCAkcF97bisxfSwgXGxkb3RzLCBUX3tuK2t9JCAkIHBfe24ra30kLiBUaGVuIHRoZSB0eXBlIG9mICRGJCBpcyAkKFRfMSAsXGxkb3RzLCBUX24sIFx7VF97bisxfSQgJHBfe24rMX0sIFxsZG90cywgVF97bitrfSQgICRwX3tuK2t9XH0pIFxyaWdodGFycm93IFRfMCQuCgpUaGUgcnVuIHRpbWUgdHlwZSBvZiBhIGZ1bmN0aW9uIG9iamVjdCBhbHdheXMgaW1wbGVtZW50cyB0aGUgY2xhc3MgXGNke0Z1bmN0aW9ufS4gCgpcY29tbWVudGFyeXsKT25lIGNhbm5vdCBhc3N1bWUsIGJhc2VkIG9uIHRoZSBhYm92ZSwgdGhhdCAgZ2l2ZW4gYSBmdW5jdGlvbiBcY2R7Zn0sIFxjZHtmLnJ1bnRpbWVUeXBlfSB3aWxsIGFjdHVhbGx5IGJlIFxjZHtGdW5jdGlvbn0sIG9yIHRoYXQgYW55IHR3byBkaXN0aW5jdCBmdW5jdGlvbiBvYmplY3RzIG5lY2Vzc2FyaWx5IGhhdmUgdGhlIHNhbWUgcnVudGltZSB0eXBlLgp9CgpccmF0aW9uYWxlewpJdCBpcyB1cCB0byB0aGUgaW1wbGVtZW50YXRpb24gdG8gY2hvb3NlIGFuIGFwcHJvcHJpYXRlIHJlcHJlc2VudGF0aW9uIGZvciBmdW5jdGlvbnMuCkZvciBleGFtcGxlLCBjb25zaWRlciB0aGF0IGEgY2xvc3VyZSBwcm9kdWNlZCB2aWEgcHJvcGVydHkgZXh0cmFjdGlvbiB0cmVhdHMgZXF1YWxpdHkgZGlmZmVyZW50IGZyb20gb3JkaW5hcnkgY2xvc3VyZXMsIGFuZCBpcyB0aGVyZWZvcmUgbGlrZWx5IGEgZGlmZmVyZW50IGNsYXNzLiBJbXBsZW1lbnRhdGlvbnMgbWF5IGFsc28gdXNlIGRpZmZlcmVudCBjbGFzc2VzIGZvciBmdW5jdGlvbnMgYmFzZWQgb24gYXJpdHkgYW5kIG9yIHR5cGUuIEFyaXR5IG1heSBiZSBpbXBsaWNpdGx5IGFmZmVjdGVkIGJ5IHdoZXRoZXIgYSBmdW5jdGlvbiBpcyBhbiBpbnN0YW5jZSBtZXRob2QgKHdpdGggYW4gaW1wbGljaXQgcmVjZWl2ZXIgcGFyYW1ldGVyKSBvciBub3QuIFRoZSB2YXJpYXRpb25zIGFyZSBtYW5pZm9sZCwgYW5kIHNvIHRoaXMgc3BlY2lmaWNhdGlvbiBvbmx5IGd1YXJhbnRlZXMgdGhhdCBmdW5jdGlvbiBvYmplY3RzIGFyZSBpbnN0YW5jZXMgb2Ygc29tZSBjbGFzcyB0aGF0IGlzIGNvbnNpZGVyZWQgdG8gaW1wbGVtZW50IFxjZHtGdW5jdGlvbn0uCgp9Cgpcc3Vic2VjdGlvbntFeHRlcm5hbCBGdW5jdGlvbnN9ClxsYWJlbHtleHRlcm5hbEZ1bmN0aW9uc30KCkFuIHtcZW0gZXh0ZXJuYWwgZnVuY3Rpb259IGlzIGEgZnVuY3Rpb24gd2hvc2UgYm9keSBpcyBwcm92aWRlZCBzZXBhcmF0ZWx5IGZyb20gaXRzIGRlY2xhcmF0aW9uLiBBbiBleHRlcm5hbCBmdW5jdGlvbiBtYXkgYmUgYSB0b3AtbGV2ZWwgZnVuY3Rpb24gKFxyZWZ7bGlicmFyaWVzQW5kU2NyaXB0c30pLCBhIG1ldGhvZCAoXHJlZntpbnN0YW5jZU1ldGhvZHN9LCBccmVme3N0YXRpY01ldGhvZHN9KSwgYSBnZXR0ZXIgKFxyZWZ7Z2V0dGVyc30pLCBhIHNldHRlciAoXHJlZntzZXR0ZXJzfSkgb3IgYSBub24tcmVkaXJlY3RpbmcgY29uc3RydWN0b3IgKFxyZWZ7Z2VuZXJhdGl2ZUNvbnN0cnVjdG9yc30sIFxyZWZ7ZmFjdG9yaWVzfSkuIEV4dGVybmFsIGZ1bmN0aW9ucyBhcmUgaW50cm9kdWNlZCB2aWEgdGhlIGJ1aWx0LWluIGlkZW50aWZpZXIgXEVYVEVSTkFMe30gIChccmVme2lkZW50aWZpZXJSZWZlcmVuY2V9KSBmb2xsb3dlZCBieSB0aGUgZnVuY3Rpb24gc2lnbmF0dXJlLiAgCgpccmF0aW9uYWxlewpFeHRlcm5hbCBmdW5jdGlvbnMgYWxsb3cgdXMgdG8gaW50cm9kdWNlICB0eXBlIGluZm9ybWF0aW9uIGZvciBjb2RlIHRoYXQgaXMgbm90IHN0YXRpY2FsbHkga25vd24gdG8gdGhlIERhcnQgY29tcGlsZXIuIAp9CgpcY29tbWVudGFyeXsKRXhhbXBsZXMgb2YgZXh0ZXJuYWwgZnVuY3Rpb25zIG1pZ2h0IGJlIGZvcmVpZ24gZnVuY3Rpb25zIChkZWZpbmVkIGluIEMsIG9yIEphdmFzY3JpcHQgZXRjLiksIHByaW1pdGl2ZXMgb2YgdGhlIGltcGxlbWVudGF0aW9uIChhcyBkZWZpbmVkIGJ5IHRoZSBEYXJ0IHJ1bnRpbWUpLCBvciBjb2RlIHRoYXQgd2FzIGR5bmFtaWNhbGx5IGdlbmVyYXRlZCBidXQgd2hvc2UgaW50ZXJmYWNlIGlzIHN0YXRpY2FsbHkga25vd24uIEhvd2V2ZXIsIGFuIGFic3RyYWN0IG1ldGhvZCBpcyBkaWZmZXJlbnQgZnJvbSBhbiBleHRlcm5hbCBmdW5jdGlvbiwgYXMgaXQgaGFzIHtcZW0gbm99IGJvZHkuCn0KCkFuIGV4dGVybmFsIGZ1bmN0aW9uIGlzIGNvbm5lY3RlZCB0byBpdHMgYm9keSBieSBhbiBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBtZWNoYW5pc20uIEF0dGVtcHRpbmcgdG8gaW52b2tlIGFuIGV4dGVybmFsIGZ1bmN0aW9uIHRoYXQgaGFzIG5vdCBiZWVuIGNvbm5lY3RlZCB0byBpdHMgYm9keSB3aWxsIHJhaXNlIGEgXGNvZGV7Tm9TdWNoTWV0aG9kRXJyb3J9IG9yIHNvbWUgc3ViY2xhc3MgdGhlcmVvZi4KClRoZSBhY3R1YWwgc3ludGF4IGlzIGdpdmVuIGluIHNlY3Rpb25zIFxyZWZ7Y2xhc3Nlc30gYW5kIFxyZWZ7bGlicmFyaWVzQW5kU2NyaXB0c30gYmVsb3cuCgpcc2VjdGlvbntDbGFzc2VzfQpcbGFiZWx7Y2xhc3Nlc30KCkEge1xlbSBjbGFzc30gZGVmaW5lcyB0aGUgZm9ybSBhbmQgYmVoYXZpb3Igb2YgYSBzZXQgb2Ygb2JqZWN0cyB3aGljaCBhcmUgaXRzIHtcZW0gaW5zdGFuY2VzfS4gIENsYXNzZXMgbWF5IGJlIGRlZmluZWQgYnkgY2xhc3MgZGVjbGFyYXRpb25zIGFzIGRlc2NyaWJlZCBiZWxvdywgb3IgdmlhIG1peGluIGFwcGxpY2F0aW9ucyAoXHJlZnttaXhpbkFwcGxpY2F0aW9ufSkuCgpcYmVnaW57Z3JhbW1hcn0Ke1xiZiBjbGFzc0RlZmluaXRpb246fQptZXRhZGF0YSBcQUJTVFJBQ1R7fT8gIFxDTEFTU3t9IGlkZW50aWZpZXIgdHlwZVBhcmFtZXRlcnM/IChzdXBlcmNsYXNzIG1peGlucz8pPyBpbnRlcmZhY2VzPyBcXAogICAgICAgYFx7JyAobWV0YWRhdGEgY2xhc3NNZW1iZXJEZWZpbml0aW9uKSogYFx9JzsKICAgICAgIAptZXRhZGF0YSBcQUJTVFJBQ1R7fT8gIFxDTEFTU3t9IG1peGluQXBwbGljYXRpb25DbGFzcwogICAgLgogICAgCntcYmYgbWl4aW5zOn0KICBcV0lUSHt9IHR5cGVMaXN0CiAgLgoKe1xiZiBjbGFzc01lbWJlckRlZmluaXRpb246fWRlY2xhcmF0aW9uIGB7XGVzY2FwZWdyYW1tYXIgO30nIDsKICAgICAgIG1ldGhvZFNpZ25hdHVyZSBmdW5jdGlvbkJvZHkKICAgIC4KCntcYmYgbWV0aG9kU2lnbmF0dXJlOn1jb25zdHJ1Y3RvclNpZ25hdHVyZSBpbml0aWFsaXplcnM/OwogICAgICBmYWN0b3J5Q29uc3RydWN0b3JTaWduYXR1cmU7CiAgICAgIFxTVEFUSUN7fT8gZnVuY3Rpb25TaWduYXR1cmU7CiAgICAgIFxTVEFUSUN7fT8gZ2V0dGVyU2lnbmF0dXJlOwogICAgICBcU1RBVElDe30/IHNldHRlclNpZ25hdHVyZTsKICAgICAgb3BlcmF0b3JTaWduYXR1cmUKICAgIC4KCntcYmYgZGVjbGFyYXRpb246fWNvbnN0YW50Q29uc3RydWN0b3JTaWduYXR1cmUgKHJlZGlyZWN0aW9uICR8JCBpbml0aWFsaXplcnMpPzsKICAgICAgY29uc3RydWN0b3JTaWduYXR1cmUgKHJlZGlyZWN0aW9uICR8JCBpbml0aWFsaXplcnMpPzsKICAgICAgXEVYVEVSTkFMe30gY29uc3RhbnRDb25zdHJ1Y3RvclNpZ25hdHVyZTsKICAgICAgXEVYVEVSTkFMe30gY29uc3RydWN0b3JTaWduYXR1cmU7CiAgICAgICgoXEVYVEVSTkFMe30gXFNUQVRJQ3t9ID8pKT8gZ2V0dGVyU2lnbmF0dXJlOwogICAgICAoKFxFWFRFUk5BTHt9IFxTVEFUSUN7fT8pKT8gc2V0dGVyU2lnbmF0dXJlOwogICAgICBcRVhURVJOQUx7fT8gb3BlcmF0b3JTaWduYXR1cmU7CiAgICAgICAoKFxFWFRFUk5BTHt9IFxTVEFUSUN7fT8pKT8gZnVuY3Rpb25TaWduYXR1cmU7CiAgICAgIFxTVEFUSUN7fSAoXEZJTkFMe30gJHwkIFxDT05TVHt9KSB0eXBlPyBzdGF0aWNGaW5hbERlY2xhcmF0aW9uTGlzdDsKJSAgICAgIFxDT05TVHt9IHR5cGU/IHN0YXRpY0ZpbmFsRGVjbGFyYXRpb25MaXN0OwogICAgICBcRklOQUx7fSB0eXBlPyBpbml0aWFsaXplZElkZW50aWZpZXJMaXN0OwogICAgICBcU1RBVElDe30/IChcVkFSe30gJHwkIHR5cGUpIGluaXRpYWxpemVkSWRlbnRpZmllckxpc3QKICAgIC4KCntcYmYgc3RhdGljRmluYWxEZWNsYXJhdGlvbkxpc3Q6fQogICAgc3RhdGljRmluYWxEZWNsYXJhdGlvbiAoYCwnIHN0YXRpY0ZpbmFsRGVjbGFyYXRpb24pKgogICAgLgoKe1xiZiBzdGF0aWNGaW5hbERlY2xhcmF0aW9uOn0KICAgICAgaWRlbnRpZmllciBgPScgZXhwcmVzc2lvbgogICAgLgoKXGVuZHtncmFtbWFyfQoKQSBjbGFzcyBoYXMgY29uc3RydWN0b3JzLCAgaW5zdGFuY2UgbWVtYmVycyBhbmQgc3RhdGljIG1lbWJlcnMuIFRoZSBpbnN0YW5jZSBtZW1iZXJzIG9mIGEgY2xhc3MgYXJlIGl0cyBpbnN0YW5jZSBtZXRob2RzLCBnZXR0ZXJzLCBzZXR0ZXJzIGFuZCBpbnN0YW5jZSB2YXJpYWJsZXMuIFRoZSBzdGF0aWMgbWVtYmVycyBvZiBhIGNsYXNzIGFyZSBpdHMgc3RhdGljIG1ldGhvZHMsIGdldHRlcnMsIHNldHRlcnMgYW5kIHN0YXRpYyB2YXJpYWJsZXMuIFRoZSBtZW1iZXJzIG9mIGEgY2xhc3MgYXJlIGl0cyBzdGF0aWMgYW5kIGluc3RhbmNlIG1lbWJlcnMuCgolIEEgY2xhc3MgaGFzIGEgc3RhdGljIHNjb3BlIGFuZCBhbiBpbnN0YW5jZSBzY29wZS4gVGhlIGVuY2xvc2luZyBzY29wZSBvZiB0aGUgc3RhdGljIHNjb3BlIG9mIGEgbm9uLWdlbmVyaWMgY2xhc3MgaXMgdGhlIGVuY2xvc2luZyBzY29wZSBvZiB0aGUgY2xhc3MgZGVjbGFyYXRpb24uIFRoZSBlbmNsb3Npbmcgc2NvcGUgb2YgdGhlIHN0YXRpYyBzY29wZSBvZiBhIGdlbmVyaWMgY2xhc3MgaXMgdGhlIHR5cGUgcGFyYW1ldGVyIHNjb3BlIChccmVme30pIG9mIHRoZSBnZW5lcmljIGNsYXNzIGRlY2xhcmF0aW9uLgolVGhlIGVuY2xvc2luZyBzY29wZSBvZiBhIGNsYXNzJyBpbnN0YW5jZSBzY29wZSBpcyB0aGUgY2xhc3MnIHN0YXRpYyBzY29wZS4KCiVUaGUgZW5jbG9zaW5nIHNjb3BlIG9mIGFuIGluc3RhbmNlIG1lbWJlciBkZWNsYXJhdGlvbiBpcyB0aGUgaW5zdGFuY2Ugc2NvcGUgb2YgdGhlIGNsYXNzIGluIHdoaWNoIGl0IGlzIGRlY2xhcmVkLgoKJVRoZSBlbmNsb3Npbmcgc2NvcGUgb2YgYSBzdGF0aWMgbWVtYmVyIGRlY2xhcmF0aW9uIGlzIHRoZSBzdGF0aWMgc2NvcGUgb2YgdGhlIGNsYXNzIGluIHdoaWNoIGl0IGlzIGRlY2xhcmVkLgoKCkV2ZXJ5IGNsYXNzIGhhcyBhIHNpbmdsZSBzdXBlcmNsYXNzICBleGNlcHQgY2xhc3MgXGNvZGV7T2JqZWN0fSB3aGljaCBoYXMgbm8gc3VwZXJjbGFzcy4gQSBjbGFzcyBtYXkgaW1wbGVtZW50IGEgbnVtYmVyIG9mIGludGVyZmFjZXMKJSwgZWl0aGVyIApieSBkZWNsYXJpbmcgdGhlbSBpbiBpdHMgaW1wbGVtZW50cyBjbGF1c2UgIChccmVme3N1cGVyaW50ZXJmYWNlc30pLgolIG9yIHZpYSBpbnRlcmZhY2UgaW5qZWN0aW9uIGRlY2xhcmF0aW9ucyAoXHJlZntpbnRlcmZhY2VJbmplY3Rpb259KSBvdXRzaWRlIHRoZSBjbGFzcyBkZWNsYXJhdGlvbgoKCkFuIHtcZW0gYWJzdHJhY3QgY2xhc3N9IGlzIAolZWl0aGVyIAphIGNsYXNzIHRoYXQgaXMgZXhwbGljaXRseSBkZWNsYXJlZCB3aXRoIHRoZSAgXEFCU1RSQUNUe30gIG1vZGlmaWVyLCBlaXRoZXIgYnkgbWVhbnMgb2YgYSBjbGFzcyBkZWNsYXJhdGlvbiBvciB2aWEgYSB0eXBlIGFsaWFzIChccmVme3R5cGVkZWZ9KSBmb3IgYSBtaXhpbiBhcHBsaWNhdGlvbiAoXHJlZnttaXhpbkFwcGxpY2F0aW9ufSkuIEEge1xlbSBjb25jcmV0ZSBjbGFzc30gaXMgYSBjbGFzcyB0aGF0IGlzIG5vdCBhYnN0cmFjdC4KJSwgb3IgYSBjbGFzcyB0aGF0IGRlY2xhcmVzIGF0IGxlYXN0IG9uZSBhYnN0cmFjdCBtZXRob2QgIChccmVme2Fic3RyYWN0SW5zdGFuY2VNZW1iZXJzfSkuCgpccmF0aW9uYWxlewolVGhlIGFic3RyYWN0IG1vZGlmaWVyIGZvciBjbGFzc2VzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgaW4gc2NlbmFyaW9zIHdoZXJlIGFuIGFic3RyYWN0IGNsYXNzICRBJCBpbmhlcml0cyBmcm9tIGFub3RoZXIgYWJzdHJhY3QgY2xhc3MgJEIkLiBJbiBzdWNoIGEgc2l0dWF0aW9uLCBpdCBtYXkgYmUgdGhhdCBBJCAkaXRzZWxmIGRvZXMgbm90IGRlY2xhcmUgYW55IGFic3RyYWN0IG1ldGhvZHMuIEluIHRoZSBhYnNlbmNlIG9mIGFuIGFic3RyYWN0IG1vZGlmaWVyIG9uIHRoZSBjbGFzcywgdGhlIGNsYXNzIHdvdWxkIGJlIGludGVycHJldGVkIGFzIGEgY29uY3JldGUgY2xhc3MuIEhvd2V2ZXIsIHcKV2Ugd2FudCBkaWZmZXJlbnQgYmVoYXZpb3IgZm9yIGNvbmNyZXRlIGNsYXNzZXMgYW5kIGFic3RyYWN0IGNsYXNzZXMuIElmICRBJCBpcyBpbnRlbmRlZCB0byBiZSBhYnN0cmFjdCwgd2Ugd2FudCB0aGUgc3RhdGljIGNoZWNrZXIgdG8gd2FybiBhYm91dCBhbnkgYXR0ZW1wdCB0byBpbnN0YW50aWF0ZSAkQSQsIGFuZCB3ZSBkbyBub3Qgd2FudCB0aGUgY2hlY2tlciB0byBjb21wbGFpbiBhYm91dCB1bmltcGxlbWVudGVkIG1ldGhvZHMgaW4gJEEkLiBJbiBjb250cmFzdCwgaWYgJEEkIGlzIGludGVuZGVkIHRvIGJlIGNvbmNyZXRlLCB0aGUgY2hlY2tlciBzaG91bGQgd2FybiBhYm91dCBhbGwgdW5pbXBsZW1lbnRlZCBtZXRob2RzLCBidXQgYWxsb3cgY2xpZW50cyB0byBpbnN0YW50aWF0ZSBpdCBmcmVlbHkuCn0KClRoZSB7XGVtIGludGVyZmFjZSBvZiBjbGFzcyAkQyR9IGlzIGFuIGltcGxpY2l0IGludGVyZmFjZSB0aGF0IGRlY2xhcmVzIGluc3RhbmNlIG1lbWJlcnMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBpbnN0YW5jZSBtZW1iZXJzIGRlY2xhcmVkIGJ5ICRDJCwgYW5kIHdob3NlIGRpcmVjdCBzdXBlcmludGVyZmFjZXMgYXJlIHRoZSBkaXJlY3Qgc3VwZXJpbnRlcmZhY2VzIG9mICRDJCAoXHJlZntzdXBlcmludGVyZmFjZXN9KS4gV2hlbiBhIGNsYXNzIG5hbWUgYXBwZWFycyBhcyBhIHR5cGUsIHRoYXQgbmFtZSBkZW5vdGVzIHRoZSBpbnRlcmZhY2Ugb2YgdGhlIGNsYXNzLgoKJSBtYWtpbmcgYW4gZXhjZXB0aW9uIGZvciB0aGUgc2V0dGVycyBnZW5lcmF0ZWQgZm9yIGZpbmFsIGZpZWxkcyBpcyB0ZW1wdGluZyBidXQgcHJvYmxlbWF0aWMuCiUgSWYgYSBzdXBlciB0eXBlIGRlZmluZXMgYSBzZXR0ZXIsIGl0IHdpbGwgYmUgb3ZlcnJpZGRlbiB5ZXQgaGF2ZSBubyBpbXBhY3Qgb24gdGhlIGludGVyZmFjZS4KJSBNYXliZSB0aGUgZmluYWwgZmllbGQgaGlkZXMgdGhlIHNldHRlciBpbiBzY29wZT8KJSBJIHRoaW5rIHRoZSBvcmlnaW5hbCBydWxlcyB3ZXJlIGJlc3QuCgogSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgYSBjbGFzcyBkZWNsYXJlcyB0d28gbWVtYmVycyBvZiB0aGUgc2FtZSBuYW1lLgogJSwgZXhjZXB0IHRoYXQgYSBnZXR0ZXIgYW5kIGEgc2V0dGVyIG1heSBiZSBkZWNsYXJlZCB3aXRoIHRoZSBzYW1lIG5hbWUgcHJvdmlkZWQgYm90aCBhcmUgaW5zdGFuY2UgbWVtYmVycyBvciBib3RoIGFyZSBzdGF0aWMgbWVtYmVycy4KSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgYSBjbGFzcyBoYXMgYW4gaW5zdGFuY2UgbWVtYmVyIGFuZCBhIHN0YXRpYyBtZW1iZXIgIHdpdGggdGhlIHNhbWUgbmFtZS4gCiUgSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgYSBnZW5lcmljIChccmVme2dlbmVyaWNzfSkgY2xhc3MgZGVjbGFyZXMgYSBtZW1iZXIgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG9uZSBvZiBpdHMgdHlwZSBwYXJhbWV0ZXJzLgoKXGNvbW1lbnRhcnl7SGVyZSBhcmUgc2ltcGxlIGV4YW1wbGVzLCB0aGF0IGlsbHVzdHJhdGUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBgYGhhcyBhIG1lbWJlcicnIGFuZCBgYGRlY2xhcmVzIGEgbWVtYmVyJycuIEZvciBleGFtcGxlLCBcY29kZXtCfSB7XGVtIGRlY2xhcmVzfSBvbmUgbWVtYmVyIG5hbWVkIFxjb2Rle2Z9LCBidXQge1xlbSBoYXN9IHR3byBzdWNoIG1lbWJlcnMuIFRoZSBydWxlcyBvZiBpbmhlcml0YW5jZSBkZXRlcm1pbmUgd2hhdCBtZW1iZXJzIGEgY2xhc3MgaGFzLgp9CgpcYmVnaW57ZGFydENvZGV9ClxDTEFTU3t9IEEgXHsKICBcVkFSe30gaSA9IDA7CiAgXFZBUnt9IGo7CiAgZih4KSA9JD4kIDM7Clx9CgpcQ0xBU1N7fSBCIFxFWFRFTkRTe30gQSBcewogIGludCBpID0gMTsgLy8gIGdldHRlciBpIGFuZCBzZXR0ZXIgaT0gb3ZlcnJpZGUgdmVyc2lvbnMgZnJvbSBBCiAgXFNUQVRJQ3t9IGo7IC8vIGNvbXBpbGUtdGltZSBlcnJvcjogc3RhdGljIGdldHRlciBcJiBzZXR0ZXIgY29uZmxpY3Qgd2l0aCAKICAvL2luc3RhbmNlIGdldHRlciBcJiBzZXR0ZXIKICAKICAvKiBjb21waWxlLXRpbWUgZXJyb3I6IHN0YXRpYyBtZXRob2QgY29uZmxpY3RzIHdpdGggaW5zdGFuY2UgbWV0aG9kICovCiAgXFNUQVRJQ3t9IGYoeCkgPSQ+JCAzOyAKXH0KXGVuZHtkYXJ0Q29kZX0KCkl0IGlzIGEgY29tcGlsZSB0aW1lIGVycm9yIGlmIGEgY2xhc3MgJEMkIGRlY2xhcmVzIGEgbWVtYmVyIHdpdGggdGhlIHNhbWUgbmFtZSBhcyAkQyQuIEl0IGlzIGEgY29tcGlsZSB0aW1lIGVycm9yIGlmIGEgZ2VuZXJpYyBjbGFzcyBkZWNsYXJlcyBhIHR5cGUgdmFyaWFibGUgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBjbGFzcyBvciBhbnkgb2YgaXRzIG1lbWJlcnMgb3IgY29uc3RydWN0b3JzLgoKXHN1YnNlY3Rpb257SW5zdGFuY2UgTWV0aG9kc30KXGxhYmVse2luc3RhbmNlTWV0aG9kc30KCkluc3RhbmNlIG1ldGhvZHMgYXJlIGZ1bmN0aW9ucyAoXHJlZntmdW5jdGlvbnN9KSB3aG9zZSBkZWNsYXJhdGlvbnMgYXJlIGltbWVkaWF0ZWx5IGNvbnRhaW5lZCB3aXRoaW4gYSBjbGFzcyBkZWNsYXJhdGlvbiBhbmQgdGhhdCBhcmUgbm90IGRlY2xhcmVkIFxTVEFUSUN7fS4gVGhlIGluc3RhbmNlIG1ldGhvZHMgb2YgYSBjbGFzcyAkQyQgYXJlIHRob3NlIGluc3RhbmNlIG1ldGhvZHMgZGVjbGFyZWQgYnkgJEMkIGFuZCB0aGUgaW5zdGFuY2UgbWV0aG9kcyBpbmhlcml0ZWQgYnkgJEMkIGZyb20gaXRzIHN1cGVyY2xhc3MuCgolbWFrZSB0aGVzZSB3YXJuaW5ncyBpZiBwb3NzaWJsZQoKSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiBhbiBpbnN0YW5jZSBtZXRob2QgJG1fMSQgb3ZlcnJpZGVzICAoXHJlZntpbmhlcml0YW5jZUFuZE92ZXJyaWRpbmd9KSBhbiBpbnN0YW5jZSBtZW1iZXIgJG1fMiQgYW5kICAkbV8xJCBoYXMgYSBncmVhdGVyIG51bWJlciBvZiByZXF1aXJlZCBwYXJhbWV0ZXJzIHRoYW4gJG1fMiQuIEl0IGlzIGEgc3RhdGljIHdhcm5pbmcgaWYgYW4gaW5zdGFuY2UgbWV0aG9kICRtXzEkIG92ZXJyaWRlcyAgYW4gaW5zdGFuY2UgbWVtYmVyICRtXzIkIGFuZCAgJG1fMSQgaGFzIGZld2VyIHBvc2l0aW9uYWwgcGFyYW1ldGVycyB0aGFuICRtXzIkLiAgSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiBhbiBpbnN0YW5jZSBtZXRob2QgJG1fMSQgb3ZlcnJpZGVzICBhbiBpbnN0YW5jZSBtZW1iZXIgJG1fMiQgYW5kICAkbV8xJCBkb2VzIG5vdCBkZWNsYXJlIGFsbCB0aGUgbmFtZWQgcGFyYW1ldGVycyBkZWNsYXJlZCBieSAkbV8yJC4gCgolIG5vdCBxdWl0ZSByaWdodC4gSXQgc2hvdWxkIGJlIG9rIHRvIG92ZXJyaWRlIGEgbWV0aG9kIHRoYXQgcmVxdWlyZXMgTiBwYXJhbWV0ZXJzIHdpdGggb25lIHRoYXQgcmVxdWlyZXMgTSA8IE4gYnV0IGFjY2VwdHMgdGhlIG90aGVycyBhcyBvcHRpb25hbC4KCkl0IGlzIGEgc3RhdGljIHdhcm5pbmcgaWYgYW4gaW5zdGFuY2UgbWV0aG9kICRtXzEkIG92ZXJyaWRlcyBhbiBpbnN0YW5jZSBtZW1iZXIgJG1fMiQgYW5kIHRoZSB0eXBlIG9mICRtXzEkIGlzIG5vdCBhIHN1YnR5cGUgb2YgdGhlIHR5cGUgb2YgJG1fMiQuIEl0IGlzIGEgc3RhdGljIHdhcm5pbmcgaWYgYW4gaW5zdGFuY2UgbWV0aG9kICRtXzEkIG92ZXJyaWRlcyBhbiBpbnN0YW5jZSBtZW1iZXIgJG1fMiQsICB0aGUgc2lnbmF0dXJlIG9mICRtXzIkIGV4cGxpY2l0bHkgc3BlY2lmaWVzIGEgZGVmYXVsdCB2YWx1ZSBmb3IgYSBmb3JtYWwgcGFyYW1ldGVyICRwJCBhbmQgdGhlIHNpZ25hdHVyZSBvZiAkbV8xJCBzcGVjaWZpZXMgYSBkaWZmZXJlbnQgZGVmYXVsdCB2YWx1ZSBmb3IgJHAkLiBJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmIGEgY2xhc3MgJEMkIGRlY2xhcmVzIGFuIGluc3RhbmNlIG1ldGhvZCBuYW1lZCAkbiQgYW5kIGhhcyBhIHNldHRlciBuYW1lZCAkbj0kLiBJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmIGEgY2xhc3MgJEMkIGRlY2xhcmVzIGFuIGluc3RhbmNlIG1ldGhvZCBuYW1lZCAkbiQgYW5kIGFuIGFjY2Vzc2libGUgc3RhdGljIG1lbWJlciBuYW1lZCAkbiQgaXMgZGVjbGFyZWQgaW4gYSBzdXBlcmNsYXNzIG9mICRDJC4KCiUgV29ya3MuIElmIHRoZSBuYW1lIGlzIHB1YmxpYywgbm8gaXNzdWUuIElmIGl0J3MgcHJpdmF0ZSwgaWYgYSBzdWJjbGFzcyBoYXMgYSBjb25mbGljdGluZyBpbnN0IHZhciwgaXQgZWl0aGVyIGlzIGluIHRoZSBzYW1lIGxpYiBhbmQgd2lsbCBiZSBmbGFnZ2VkLCBvciBpcyBpbiBhbm90aGVyIGFuZCBpcyBub3QgYW4gaXNzdWUuCgoKXHN1YnN1YnNlY3Rpb257T3BlcmF0b3JzfQpcbGFiZWx7b3BlcmF0b3JzfQoKe1xlbSBPcGVyYXRvcnN9IGFyZSBpbnN0YW5jZSBtZXRob2RzIHdpdGggc3BlY2lhbCBuYW1lcy4gCgpcYmVnaW57Z3JhbW1hcn0Ke1xiZiBvcGVyYXRvclNpZ25hdHVyZTp9CiAgICAgICByZXR1cm5UeXBlPyBcT1BFUkFUT1J7fSBvcGVyYXRvciBmb3JtYWxQYXJhbWV0ZXJMaXN0CiAgICAgICAuCiAgICAgICAKIHtcYmYgb3BlcmF0b3I6fWBcfnt9JzsKICAgICAgYmluYXJ5T3BlcmF0b3I7CiAgICAgIGBbJyBgXScgOwogICAgICBgWycgYF0nIGA9JwogICAgLgoKe1xiZiBiaW5hcnlPcGVyYXRvcjp9bXVsdGlwbGljYXRpdmVPcGVyYXRvcjsKICAgICAgYWRkaXRpdmVPcGVyYXRvcjsKICAgICAgc2hpZnRPcGVyYXRvcjsKICAgICAgcmVsYXRpb25hbE9wZXJhdG9yOwogICAgICBgPT0nOwogICAgICBiaXR3aXNlT3BlcmF0b3IKICAgIC4KIFxlbmR7Z3JhbW1hcn0KCkFuIG9wZXJhdG9yIGRlY2xhcmF0aW9uIGlzIGlkZW50aWZpZWQgdXNpbmcgdGhlIGJ1aWx0LWluIGlkZW50aWZpZXIgKFxyZWZ7aWRlbnRpZmllclJlZmVyZW5jZX0pIFxPUEVSQVRPUnt9LgoKVGhlIGZvbGxvd2luZyBuYW1lcyBhcmUgYWxsb3dlZCBmb3IgdXNlci1kZWZpbmVkIG9wZXJhdG9yczogXGNvZGV7JDwkLCAkPiQsICQ8JD0sICQ+JD0sID09LCAgLSwgKywgLywgXH57fS8sICosIFwlLCAkfCQsIFxee30sIFwmLCAkPDwkLCAkPj4kLCAgW109LCBbXSwgXH57fS59CgoKSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgdGhlIGFyaXR5IG9mIHRoZSB1c2VyLWRlY2xhcmVkIG9wZXJhdG9yIFxjb2Rle1tdPX0gaXMgbm90IDIuIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIHRoZSBhcml0eSBvZiBhIHVzZXItZGVjbGFyZWQgb3BlcmF0b3Igd2l0aCBvbmUgb2YgdGhlIG5hbWVzOiAgXGNvZGV7ICQ8JCwgJD4kLCAkPCQ9LCAkPiQ9LCA9PSwgLSwgKywgIFx+e30vLCAvLCAqLCBcJSwgJHwkLCBcXnt9LCBcJiwgJDw8JCwgJD4+JCwgW119IGlzIG5vdCAxLiBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiB0aGUgYXJpdHkgb2YgdGhlIHVzZXItZGVjbGFyZWQgb3BlcmF0b3IgIFxjb2Rley19IGlzIG5vdCAwIG9yIDEuIAoKXGNvbW1lbnRhcnl7ClRoZSBcY29kZXstfSBvcGVyYXRvciBpcyB1bmlxdWUgaW4gdGhhdCB0d28gb3ZlcmxvYWRlZCB2ZXJzaW9ucyBhcmUgcGVybWl0dGVkLiBJZiB0aGUgb3BlcmF0b3IgaGFzIG5vIGFyZ3VtZW50cywgaXQgZGVub3RlcyB1bmFyeSBtaW51cy4gSWYgaXQgaGFzIGFuIGFyZ3VtZW50LCBpdCBkZW5vdGVzIGJpbmFyeSBzdWJ0cmFjdGlvbi4gCn0KClRoZSBuYW1lIG9mIHRoZSB1bmFyeSBvcGVyYXRvciBcY29kZXstfSBpcyBcY29kZXt1bmFyeS19LgoKXHJhdGlvbmFsZXsKVGhpcyBkZXZpY2UgYWxsb3dzIHRoZSB0d28gbWV0aG9kcyB0byBiZSBkaXN0aW5ndWlzaGVkIGZvciBwdXJwb3NlcyBvZiBtZXRob2QgbG9va3VwLCBvdmVycmlkZSBhbmQgcmVmbGVjdGlvbi4KfQoKSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgdGhlIGFyaXR5IG9mIHRoZSB1c2VyLWRlY2xhcmVkIG9wZXJhdG9yICBcY29kZXsgXH57fX0gaXMgbm90IDAuIAoKSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgdG8gZGVjbGFyZSBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgaW4gYW4gb3BlcmF0b3IuCgpJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgdXNlci1kZWNsYXJlZCBvcGVyYXRvciBcY29kZXtbXT19IGlzIGV4cGxpY2l0bHkgZGVjbGFyZWQgYW5kIG5vdCBcVk9JRHt9LgoKClxzdWJzZWN0aW9ue0dldHRlcnN9IApcbGFiZWx7Z2V0dGVyc30KCkdldHRlcnMgYXJlIGZ1bmN0aW9ucyAoXHJlZntmdW5jdGlvbnN9KSAgdGhhdCBhcmUgdXNlZCB0byByZXRyaWV2ZSB0aGUgdmFsdWVzIG9mIG9iamVjdCBwcm9wZXJ0aWVzLgoKXGJlZ2lue2dyYW1tYXJ9CntcYmYgZ2V0dGVyU2lnbmF0dXJlOn0KICAgICAgIHJldHVyblR5cGU/IFxHRVR7fSBpZGVudGlmaWVyIAouClxlbmR7Z3JhbW1hcn0KCiVcUXtXaHkgZG9lcyBhIGdldHRlciBoYXZlIGEgZm9ybWFsIHBhcmFtZXRlciBsaXN0IGF0IGFsbD99CgpJZiBubyByZXR1cm4gdHlwZSBpcyBzcGVjaWZpZWQsIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgZ2V0dGVyIGlzICBcRFlOQU1JQ3t9LgoKQSBnZXR0ZXIgZGVmaW5pdGlvbiB0aGF0IGlzIHByZWZpeGVkIHdpdGggdGhlIFxTVEFUSUN7fSBtb2RpZmllciBkZWZpbmVzIGEgc3RhdGljIGdldHRlci4gT3RoZXJ3aXNlLCBpdCBkZWZpbmVzIGFuIGluc3RhbmNlIGdldHRlci4gVGhlIG5hbWUgb2YgdGhlIGdldHRlciBpcyBnaXZlbiBieSB0aGUgaWRlbnRpZmllciBpbiB0aGUgZGVmaW5pdGlvbi4KCiVJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBhIGdldHRlcmBzIGZvcm1hbCBwYXJhbWV0ZXIgbGlzdCBpcyBub3QgZW1wdHkuCgpUaGUgaW5zdGFuY2UgZ2V0dGVycyBvZiBhIGNsYXNzICRDJCBhcmUgdGhvc2UgaW5zdGFuY2UgZ2V0dGVycyBkZWNsYXJlZCBieSAkQyQsIGVpdGhlciBpbXBsaWNpdGx5IG9yIGV4cGxpY2l0bHksIGFuZCB0aGUgaW5zdGFuY2UgZ2V0dGVycyBpbmhlcml0ZWQgYnkgJEMkIGZyb20gaXRzIHN1cGVyY2xhc3MuIFRoZSBzdGF0aWMgZ2V0dGVycyBvZiBhIGNsYXNzICRDJCBhcmUgdGhvc2Ugc3RhdGljIGdldHRlcnMgZGVjbGFyZWQgYnkgJEMkLgoKSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgYSBjbGFzcyBoYXMgYm90aCBhIGdldHRlciBhbmQgYSBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lLiBUaGlzIHJlc3RyaWN0aW9uIGhvbGRzIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgZ2V0dGVyIGlzIGRlZmluZWQgZXhwbGljaXRseSBvciBpbXBsaWNpdGx5LCBvciB3aGV0aGVyIHRoZSBnZXR0ZXIgb3IgdGhlIG1ldGhvZCBhcmUgaW5oZXJpdGVkIG9yIG5vdC4KClxjb21tZW50YXJ5ewpUaGlzIGltcGxpZXMgdGhhdCBhIGdldHRlciBjYW4gbmV2ZXIgb3ZlcnJpZGUgYSBtZXRob2QsIGFuZCBhIG1ldGhvZCBjYW4gbmV2ZXIgb3ZlcnJpZGUgYSBnZXR0ZXIgb3IgZmllbGQuIAp9CgpJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdldHRlciBpcyBcVk9JRC4KSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiBhIGdldHRlciAkbV8xJCBvdmVycmlkZXMgIChccmVme2luaGVyaXRhbmNlQW5kT3ZlcnJpZGluZ30pIGEgZ2V0dGVyIAokbV8yJCBhbmQgdGhlIHR5cGUgb2YgJG1fMSQgaXMgbm90IGEgc3VidHlwZSBvZiB0aGUgdHlwZSBvZiAkbV8yJC4gICAKCkl0IGlzIGEgc3RhdGljIHdhcm5pbmcgaWYgYSBjbGFzcyAgZGVjbGFyZXMgYSBzdGF0aWMgZ2V0dGVyIG5hbWVkICR2JCBhbmQgYWxzbyBoYXMgYSBub24tc3RhdGljIHNldHRlciBuYW1lZCAkdj0kLiBJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmIGEgY2xhc3MgJEMkIGRlY2xhcmVzIGFuIGluc3RhbmNlIGdldHRlciBuYW1lZCAkdiQgYW5kIGFuIGFjY2Vzc2libGUgc3RhdGljIG1lbWJlciBuYW1lZCAkdiQgb3IgJHY9JCBpcyBkZWNsYXJlZCBpbiBhIHN1cGVyY2xhc3Mgb2YgJEMkLiBUaGVzZSB3YXJuaW5ncyBtdXN0IGJlIGlzc3VlZCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGdldHRlcnMgb3Igc2V0dGVycyBhcmUgZGVjbGFyZWQgZXhwbGljaXRseSBvciBpbXBsaWNpdGx5LgoKXHN1YnNlY3Rpb257U2V0dGVyc30KXGxhYmVse3NldHRlcnN9CgpTZXR0ZXJzIGFyZSBmdW5jdGlvbnMgKFxyZWZ7ZnVuY3Rpb25zfSkgdGhhdCBhcmUgdXNlZCB0byBzZXQgdGhlIHZhbHVlcyBvZiBvYmplY3QgcHJvcGVydGllcy4KCiUgd2hhdCBhYm91dCB0b3AgbGV2ZWwgb25lcz8gU2FtZSBmb3IgZ2V0dGVycwoKXGJlZ2lue2dyYW1tYXJ9CntcYmYgc2V0dGVyU2lnbmF0dXJlOn0KICAgICAgIHJldHVyblR5cGU/IFxTRVR7fSBpZGVudGlmaWVyIGZvcm1hbFBhcmFtZXRlckxpc3QKLgpcZW5ke2dyYW1tYXJ9CgpJZiBubyByZXR1cm4gdHlwZSBpcyBzcGVjaWZpZWQsIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgc2V0dGVyIGlzICBcRFlOQU1JQ3t9LgoKQSBzZXR0ZXIgZGVmaW5pdGlvbiB0aGF0IGlzIHByZWZpeGVkIHdpdGggdGhlIFxTVEFUSUN7fSBtb2RpZmllciBkZWZpbmVzIGEgc3RhdGljIHNldHRlci4gT3RoZXJ3aXNlLCBpdCBkZWZpbmVzIGFuIGluc3RhbmNlIHNldHRlci4gVGhlIG5hbWUgb2YgYSBzZXR0ZXIgaXMgIG9idGFpbmVkIGJ5IGFwcGVuZGluZyB0aGUgIHN0cmluZyBgPScgIHRvIHRoZSBpZGVudGlmaWVyIGdpdmVuIGluIGl0cyBzaWduYXR1cmUuCgpcY29tbWVudGFyeXtIZW5jZSwgYSBzZXR0ZXIgbmFtZSBjYW4gbmV2ZXIgY29uZmxpY3Qgd2l0aCwgb3ZlcnJpZGUgb3IgYmUgb3ZlcnJpZGRlbiBieSBhIGdldHRlciBvciBtZXRob2QufQoKVGhlIGluc3RhbmNlIHNldHRlcnMgb2YgYSBjbGFzcyAkQyQgYXJlIHRob3NlIGluc3RhbmNlIHNldHRlcnMgZGVjbGFyZWQgYnkgJEMkIGVpdGhlciBpbXBsaWNpdGx5IG9yIGV4cGxpY2l0bHksIGFuZCB0aGUgaW5zdGFuY2Ugc2V0dGVycyBpbmhlcml0ZWQgYnkgJEMkIGZyb20gaXRzIHN1cGVyY2xhc3MuIFRoZSBzdGF0aWMgc2V0dGVycyBvZiBhIGNsYXNzICRDJCBhcmUgdGhvc2Ugc3RhdGljIHNldHRlcnMgZGVjbGFyZWQgYnkgJEMkLgoKSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgYSBzZXR0ZXIncyBmb3JtYWwgcGFyYW1ldGVyIGxpc3QgZG9lcyBub3QgY29uc2lzdCBvZiBleGFjdGx5IG9uZSByZXF1aXJlZCBmb3JtYWwgcGFyYW1ldGVyICRwJC4gIFxyYXRpb25hbGV7V2UgY291bGQgZW5mb3JjZSB0aGlzIHZpYSB0aGUgZ3JhbW1hciwgYnV0IHdlYGQgaGF2ZSB0byBzcGVjaWZ5IHRoZSBldmFsdWF0aW9uIHJ1bGVzIGluIHRoYXQgY2FzZS59CgolSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgYSBjbGFzcyBoYXMgYm90aCBhIHNldHRlciBhbmQgYSBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lLiBUaGlzIHJlc3RyaWN0aW9uIGhvbGRzIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgc2V0dGVyIGlzIGRlZmluZWQgZXhwbGljaXRseSBvciBpbXBsaWNpdGx5LCBvciB3aGV0aGVyIHRoZSBzZXR0ZXIgb3IgdGhlIG1ldGhvZCBhcmUgaW5oZXJpdGVkIG9yIG5vdC4KCkl0IGlzIGEgc3RhdGljIHdhcm5pbmcgaWYgYSBzZXR0ZXIgZGVjbGFyZXMgYSByZXR1cm4gdHlwZSBvdGhlciB0aGFuIFxWT0lEe30uCkl0IGlzIGEgc3RhdGljIHdhcm5pbmcgaWYgYSBzZXR0ZXIgJG1fMSQgb3ZlcnJpZGVzICAoXHJlZntpbmhlcml0YW5jZUFuZE92ZXJyaWRpbmd9KSBhIHNldHRlciAkbV8yJCBhbmQgdGhlIHR5cGUgb2YgJG1fMSQgaXMgbm90IGEgc3VidHlwZSBvZiB0aGUgdHlwZSBvZiAkbV8yJC4gSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiBhIGNsYXNzIGhhcyBhIHNldHRlciBuYW1lZCAkdj0kIHdpdGggYXJndW1lbnQgdHlwZSAkVCQgYW5kIGEgZ2V0dGVyIG5hbWVkICR2JCB3aXRoIHJldHVybiB0eXBlICRTJCwgYW5kICRUJCBtYXkgbm90IGJlIGFzc2lnbmVkIHRvICRTJC4gCgpJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmIGEgY2xhc3MgIGRlY2xhcmVzIGEgc3RhdGljIHNldHRlciBuYW1lZCAkdj0kIGFuZCBhbHNvIGhhcyBhIG5vbi1zdGF0aWMgbWVtYmVyIG5hbWVkICR2JC4gSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiBhIGNsYXNzICRDJCBkZWNsYXJlcyBhbiBpbnN0YW5jZSBzZXR0ZXIgbmFtZWQgJHY9JCBhbmQgYW4gYWNjZXNzaWJsZSBzdGF0aWMgbWVtYmVyIG5hbWVkICR2PSQgb3IgJHYkIGlzIGRlY2xhcmVkIGluIGEgc3VwZXJjbGFzcyBvZiAkQyQuCgpUaGVzZSB3YXJuaW5ncyBtdXN0IGJlIGlzc3VlZCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGdldHRlcnMgb3Igc2V0dGVycyBhcmUgZGVjbGFyZWQgZXhwbGljaXRseSBvciBpbXBsaWNpdGx5LgoKXHN1YnNlY3Rpb257QWJzdHJhY3QgSW5zdGFuY2UgTWVtYmVyc30KXGxhYmVse2Fic3RyYWN0SW5zdGFuY2VNZW1iZXJzfQoKQW4ge1xlbSBhYnN0cmFjdCBtZXRob2R9IChyZXNwZWN0aXZlbHksIHtcZW0gYWJzdHJhY3QgZ2V0dGVyfSBvciB7XGVtIGFic3RyYWN0IHNldHRlcil9IGlzIGFuIGluc3RhbmNlIG1ldGhvZCwgZ2V0dGVyIG9yIHNldHRlciB0aGF0IGlzIG5vdCBkZWNsYXJlZCBcRVhURVJOQUx7fSBhbmQgZG9lcyBub3QgIHByb3ZpZGUgYW4gaW1wbGVtZW50YXRpb24uIEEge1xlbSBjb25jcmV0ZSBtZXRob2R9IChyZXNwZWN0aXZlbHksIHtcZW0gY29uY3JldGUgZ2V0dGVyfSBvciB7XGVtIGNvbmNyZXRlIHNldHRlcil9IGlzIGFuIGluc3RhbmNlIG1ldGhvZCwgZ2V0dGVyIG9yIHNldHRlciB0aGF0IGlzIG5vdCBhYnN0cmFjdC4KJVRoZSBkZWNsYXJhdGlvbiBvZiBhbiBhYnN0cmFjdCBtZXRob2QgaXMgcHJlZml4ZWQgYnkgdGhlIGJ1aWx0LWluIGlkZW50aWZpZXIgKFxyZWZ7aWRlbnRpZmllclJlZmVyZW5jZX0pIFxBQlNUUkFDVHt9LgoKXHJhdGlvbmFsZXsKRWFybGllciB2ZXJzaW9ucyBvZiBEYXJ0IHJlcXVpcmVkIHRoYXQgYWJzdHJhY3QgbWVtYmVycyBiZSBpZGVudGlmaWVkIGJ5IHByZWZpeGluZyB0aGVtIHdpdGggdGhlIG1vZGlmaWVyIFxBQlNUUkFDVHt9LiAgVGhlIGVsaW1pbmF0aW9uIG9mIHRoaXMgcmVxdWlyZW1lbnQgaXMgbW90aXZhdGVkIGJ5IHRoZSBkZXNpcmUgdG8gdXNlIGFic3RyYWN0IGNsYXNzZXMgYXMgaW50ZXJmYWNlcy4gRXZlcnkgRGFydCBjbGFzcyBpbmR1Y2VzIGFuIGltcGxpY2l0IGludGVyZmFjZS4KClVzaW5nIGFuIGFic3RyYWN0IGNsYXNzIGluc3RlYWQgb2YgYW4gaW50ZXJmYWNlIGhhcyBpbXBvcnRhbnQgYWR2YW50YWdlcy4gQW4gYWJzdHJhY3QgY2xhc3MgY2FuIHByb3ZpZGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnM7IGl0IGNhbiBhbHNvIHByb3ZpZGUgc3RhdGljIG1ldGhvZHMsIG9idmlhdGluZyB0aGUgbmVlZCBmb3Igc2VydmljZSBjbGFzc2VzIHN1Y2ggYXMgXGNvZGV7Q29sbGVjdGlvbnN9IG9yIFxjb2Rle0xpc3RzfSwgd2hvc2UgZW50aXJlIHB1cnBvc2UgaXMgdG8gZ3JvdXAgdXRpbGl0aWVzIHJlbGF0ZWQgdG8gYSBnaXZlbiB0eXBlLgoKRWxpbWluYXRpbmcgdGhlIHJlcXVpcmVtZW50IGZvciBhbiBleHBsaWNpdCBtb2RpZmllciBvbiBtZW1iZXJzIG1ha2VzIGFic3RyYWN0IGNsYXNzZXMgbW9yZSBjb25jaXNlLCBtYWtpbmcgYWJzdHJhY3QgY2xhc3NlcyBhbiBhdHRyYWN0aXZlIHN1YnN0aXR1dGUgZm9yICBpbnRlcmZhY2UgZGVjbGFyYXRpb25zLgp9CgpcY29tbWVudGFyeSB7SW52b2tpbmcgYW4gYWJzdHJhY3QgbWV0aG9kLCBnZXR0ZXIgb3Igc2V0dGVyIHJlc3VsdHMgaW4gYW4gaW52b2NhdGlvbiBvZiAgXGNke25vU3VjaE1ldGhvZH0gZXhhY3RseSBhcyBpZiB0aGUgZGVjbGFyYXRpb24gZGlkIG5vdCBleGlzdCwgdW5sZXNzIGEgc3VpdGFibGUgbWVtYmVyICRhJCBpcyBhdmFpbGFibGUgaW4gYSBzdXBlcmNsYXNzLCBpbiB3aGljaCBjYXNlICRhJCBpcyBpbnZva2VkLiAgVGhlIG5vcm1hdGl2ZSBzcGVjaWZpY2F0aW9uIGZvciB0aGlzIGFwcGVhcnMgdW5kZXIgdGhlIGRlZmluaXRpb25zIG9mIGxvb2t1cCBmb3IgbWV0aG9kcywgZ2V0dGVycyBhbmQgc2V0dGVycy4KfQoKJSBzbyBkb2VzIGFuIGFic3RyYWN0IG1ldGhvZCBvdmVycmlkZSBhIG1ldGhvZCBpbiBhIHN1cGVyY2xhc3Mgb3Igbm90PyBEb2VzIHRoZSBzdXBlcmNsYXNzIG1ldGhvZCBnZXQgaW5oZXJpdGVkIG9yIG5vdD8gIFRoaXMgZ2VuZXJhbGx5IG1ha2VzIHRoZSBzcGVjIGluY29uc2lzdGVudCwgYXMgdGhlcmUgaXMgbm8gc2ltcGxlIGFuc3dlci4KJSBGb3IgZXhhbXBsZSAtIGlmIHdlIHNheSBpdCBkb2VzIG5vdCBvdmVycmlkZSwgdGhlbiB0aGUgc3VwZXJjbGFzcyBtZW1iZXIgaXMgaW5oZXJpdGVkLCBpbiB3aGljaCBjYXNlIHRoZSBydWxlcyBmb3Igd2FybmluZyBicmVhayBkb3duLCBhbmQgYWxzbyB0aGVyZSBpcyBxdWVzdGlvbiBvZiB3aGV0aGVyIHRoZXJlIGFyZSB0d28gZGVmaW5pdGlvbnMgb2YgdGhlIHNhbWUgbmFtZS4KJSBCdXQgaWYgd2UgZG8gb3ZlcnJpZGUsIG1ldGhvZCBsb29rdXAgcnVsZXMgYnJlYWsgZG93bi4gIFNvIHNldmVyYWwgdGhpbmdzIG5lZWQgcmV2aXNpdGluZy4KClxyYXRpb25hbGV7ClRoZSBwdXJwb3NlIG9mIGFuIGFic3RyYWN0IG1ldGhvZCBpcyB0byBwcm92aWRlIGEgZGVjbGFyYXRpb24gZm9yIHB1cnBvc2VzIHN1Y2ggYXMgdHlwZSBjaGVja2luZyBhbmQgcmVmbGVjdGlvbi4gSW4gY2xhc3NlcyB1c2VkIGFzIG1peGlucywgaXQgaXMgb2Z0ZW4gdXNlZnVsIHRvIGludHJvZHVjZSBzdWNoIGRlY2xhcmF0aW9ucyBmb3IgbWV0aG9kcyB0aGF0IHRoZSBtaXhpbiBleHBlY3RzIHdpbGwgYmUgcHJvdmlkZWQgYnkgdGhlIHN1cGVyY2xhc3MgdGhlIG1peGluIGlzIGFwcGxpZWQgdG8uCn0KJWFsd2F5cyByZXN1bHRzIGluIGEgcnVuLXRpbWUgZXJyb3IuIFRoaXMgbXVzdCBiZSBcY29kZXtOb1N1Y2hNZXRob2RFcnJvcn0gb3IgYW4gaW5zdGFuY2Ugb2YgYSBzdWJjbGFzcyBvZiBcY29kZXtOb1N1Y2hNZXRob2RFcnJvcn0sIHN1Y2ggYXMgXGNvZGV7QWJzdHJhY3RNZXRob2RFcnJvcn0uCgpJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmIGFuIGFic3RyYWN0IG1lbWJlciBpcyBkZWNsYXJlZCBvciBpbmhlcml0ZWQgaW4gYSBjb25jcmV0ZSBjbGFzcyB1bmxlc3MgdGhhdCBtZW1iZXIgb3ZlcnJpZGVzIGEgY29uY3JldGUgb25lLgoKXHJhdGlvbmFsZSB7CldlIHdpc2ggdG8gd2FybiBpZiBvbmUgZGVjbGFyZXMgYSBjb25jcmV0ZSBjbGFzcyB3aXRoIGFic3RyYWN0IG1lbWJlcnMuIEhvd2V2ZXIsICBjb2RlIGxpa2UgdGhlIGZvbGxvd2luZyBzaG91bGQgd29yayB3aXRob3V0IHdhcm5pbmdzOgp9CgpcYmVnaW57ZGFydENvZGV9CiBjbGFzcyBCYXNlIFx7CiAgICBpbnQgZ2V0IG9uZSA9JD4kIDE7CiAgXH0KCiAgYWJzdHJhY3QgY2xhc3MgTWl4IFx7CiAgICBpbnQgZ2V0IG9uZTsKICAgIGludCBnZXQgdHdvID0kPiQgb25lICsgb25lOwogIFx9CgogIGNsYXNzIEMgZXh0ZW5kcyBCYXNlIHdpdGggTWl4IFx7CiAgXH0KXH0KXGVuZHtkYXJ0Q29kZX0KClxyYXRpb25hbGV7QXQgcnVuIHRpbWUsIHRoZSBjb25jcmV0ZSBtZXRob2QgXGNke29uZX0gZGVjbGFyZWQgaW4gXGNke0Jhc2V9IHdpbGwgYmUgZXhlY3V0ZWQsIGFuZCBubyBwcm9ibGVtIHNob3VsZCBhcmlzZS4gVGhlcmVmb3JlIG5vIHdhcm5pbmcgc2hvdWxkIGJlIGlzc3VlZCBhbmQgc28gd2Ugc3VwcHJlc3Mgd2FybmluZ3MgaWYgYSBjb3JyZXNwb25kaW5nIGNvbmNyZXRlIG1lbWJlciBleGlzdHMgaW4gdGhlIGhpZXJhcmNoeS4gfQoKXHN1YnNlY3Rpb257SW5zdGFuY2UgVmFyaWFibGVzfQpcbGFiZWx7aW5zdGFuY2VWYXJpYWJsZXN9CgpJbnN0YW5jZSB2YXJpYWJsZXMgYXJlIHZhcmlhYmxlcyB3aG9zZSBkZWNsYXJhdGlvbnMgYXJlIGltbWVkaWF0ZWx5IGNvbnRhaW5lZCB3aXRoaW4gYSBjbGFzcyBkZWNsYXJhdGlvbiBhbmQgdGhhdCBhcmUgbm90IGRlY2xhcmVkIFxTVEFUSUN7fS4gVGhlIGluc3RhbmNlIHZhcmlhYmxlcyBvZiBhIGNsYXNzICRDJCBhcmUgdGhvc2UgaW5zdGFuY2UgdmFyaWFibGVzIGRlY2xhcmVkIGJ5ICRDJCBhbmQgdGhlIGluc3RhbmNlIHZhcmlhYmxlcyBpbmhlcml0ZWQgYnkgJEMkIGZyb20gaXRzIHN1cGVyY2xhc3MuCgpJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBhbiBpbnN0YW5jZSB2YXJpYWJsZSBpcyBkZWNsYXJlZCB0byBiZSBjb25zdGFudC4KClxyYXRpb25hbGV7ClRoZSBub3Rpb24gb2YgYSBjb25zdGFudCBpbnN0YW5jZSB2YXJpYWJsZSBpcyBzdWJ0bGUgYW5kIGNvbmZ1c2luZyB0byBwcm9ncmFtbWVycy4KQW4gaW5zdGFuY2UgdmFyaWFibGUgaXMgaW50ZW5kZWQgdG8gdmFyeSBwZXIgaW5zdGFuY2UuIEEgY29uc3RhbnQgaW5zdGFuY2UgdmFyaWFibGUgd291bGQgaGF2ZSB0aGUgc2FtZSB2YWx1ZSBmb3IgYWxsIGluc3RhbmNlcywgYW5kIGFzIHN1Y2ggaXMgYWxyZWFkeSBhIGR1YmlvdXMgaWRlYS4KClRoZSBsYW5ndWFnZSBjb3VsZCBpbnRlcnByZXQgY29uc3QgaW5zdGFuY2UgdmFyaWFibGUgZGVjbGFyYXRpb25zIGFzIGluc3RhbmNlIGdldHRlcnMgdGhhdCByZXR1cm4gYSBjb25zdGFudC4gIEhvd2V2ZXIsIGEgY29uc3RhbnQgaW5zdGFuY2UgdmFyaWFibGUgY291bGQgbm90IGJlIHRyZWF0ZWQgYXMgYSB0cnVlIGNvbXBpbGUgdGltZSBjb25zdGFudCwgYXMgaXRzIGdldHRlciB3b3VsZCBiZSBzdWJqZWN0IHRvIG92ZXJyaWRpbmcuICAgCgpHaXZlbiB0aGF0IHRoZSB2YWx1ZSBkb2VzIG5vdCBkZXBlbmQgb24gIHRoZSBpbnN0YW5jZSwgaXQgaXMgYmV0dGVyIHRvIHVzZSBhIHN0YXRpYyBjbGFzcyB2YXJpYWJsZS4KQW4gaW5zdGFuY2UgZ2V0dGVyIGZvciBpdCBjYW4gYWx3YXlzIGJlIGRlZmluZWQgbWFudWFsbHkgaWYgZGVzaXJlZC4KfQoKCiVBbiBpbnN0YW5jZSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBvZiBvbmUgb2YgdGhlIGZvcm1zIFxjb2RleyRUJCAkdiQ7fSwgXGNvZGV7XEZJTkFMe30gJFQkICR2JDt9ICwgIFxjb2RleyRUJCAkdiQgPSAkZSQ7fSAsICBcY29kZXtcQ09OU1R7fSAkVCQgJHYkID0gJGUkO30gb3IgXGNvZGV7XEZJTkFMe30gJFQkICR2JCA9ICRlJDt9ICBhbHdheXMgaW5kdWNlcyBhbiBpbXBsaWNpdCBnZXR0ZXIgZnVuY3Rpb24gKFxyZWZ7Z2V0dGVyc30pIHdpdGggc2lnbmF0dXJlIAoKJSRUJCBcR0VUe30gJHYkCgold2hvc2UgaW52b2NhdGlvbiBldmFsdWF0ZXMgdG8gdGhlIHZhbHVlIHN0b3JlZCBpbiAkdiQuCgolQW4gaW5zdGFuY2UgdmFyaWFibGUgZGVjbGFyYXRpb24gIG9mIG9uZSBvZiB0aGUgZm9ybXMgXGNvZGV7XFZBUnt9ICR2JDt9LCBcY29kZXtcRklOQUx7fSAkdiQ7fSwgXGNvZGV7XFZBUnt9ICR2JCA9ICRlJDt9ICwgIFxjb2Rle1xDT05TVHt9ICR2JCA9ICRlJDt9IG9yIFxjb2Rle1xGSU5BTHt9ICR2JCA9ICRlJDt9ICAgYWx3YXlzIGluZHVjZXMgYW4gaW1wbGljaXQgZ2V0dGVyIGZ1bmN0aW9uIHdpdGggc2lnbmF0dXJlIAoKJVxHRVR7fSAkdiQKCiV3aG9zZSBpbnZvY2F0aW9uIGV2YWx1YXRlcyB0byB0aGUgdmFsdWUgc3RvcmVkIGluICR2JC4KCiVcY29tbWVudGFyeXtHZXR0ZXJzIGFyZSBpbnRyb2R1Y2VkIGZvciBhbGwgaW5zdGFuY2UgYW5kIHN0YXRpYyB2YXJpYWJsZXMgKFxyZWZ7c3RhdGljVmFyaWFibGVzfSksIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGV5IGFyZSBjb25zdC9maW5hbCBvciBub3QufQoKJUEgbm9uLWZpbmFsIGluc3RhbmNlIHZhcmlhYmxlIGRlY2xhcmF0aW9uICBvZiB0aGUgZm9ybSBcY29kZXskVCQgJHYkO30gb3IgdGhlIGZvcm0gIFxjb2RleyRUJCAkdiQgPSAkZSQ7fSAgIGFsd2F5cyBpbmR1Y2VzIGFuIGltcGxpY2l0IHNldHRlciBmdW5jdGlvbiAoXHJlZntzZXR0ZXJzfSkgd2l0aCBzaWduYXR1cmUgCgolXFZPSUR7fSBcU0VUe30gJHY9KFQkICR4KSQKCiV3aG9zZSBleGVjdXRpb24gc2V0cyB0aGUgdmFsdWUgb2YgJHYkIHRvIHRoZSBpbmNvbWluZyBhcmd1bWVudCAkeCQuCgolQSBub24tZmluYWwgaW5zdGFuY2UgdmFyaWFibGUgZGVjbGFyYXRpb24gIG9mIHRoZSBmb3JtIFxjb2Rle1xWQVJ7fSAkdiQ7fSBvciB0aGUgZm9ybSAgXGNvZGV7XFZBUnt9ICR2JCA9ICRlJDt9ICAgYWx3YXlzIGluZHVjZXMgYW4gaW1wbGljaXQgc2V0dGVyIGZ1bmN0aW9uIHdpdGggc2lnbmF0dXJlIAoKJVxTRVR7fSAkdj0oeCkkCgold2hvc2UgZXhlY3V0aW9uIHNldHMgdGhlIHZhbHVlIG9mICR2JCB0byB0aGUgaW5jb21pbmcgYXJndW1lbnQgJHgkLgoKJSBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvci93YXJuaW5nIGlmIGEgY2xhc3MgJEMkIGRlY2xhcmVzIGEgZmluYWwgaW5zdGFuY2UgdmFyaWFibGUgJHYkIGFuZCAkQyQgaW5oZXJpdHMgYSBzZXR0ZXIgJHY9JC4KCgpcc3Vic2VjdGlvbntDb25zdHJ1Y3RvcnN9ClxsYWJlbHtjb25zdHJ1Y3RvcnN9CgpBIHtcZW0gY29uc3RydWN0b3J9IGlzIGEgc3BlY2lhbCBmdW5jdGlvbiB0aGF0IGlzIHVzZWQgaW4gaW5zdGFuY2UgY3JlYXRpb24gZXhwcmVzc2lvbnMgKFxyZWZ7aW5zdGFuY2VDcmVhdGlvbn0pIHRvIHByb2R1Y2Ugb2JqZWN0cy4gQ29uc3RydWN0b3JzIG1heSBiZSBnZW5lcmF0aXZlIChccmVme2dlbmVyYXRpdmVDb25zdHJ1Y3RvcnN9KSBvciB0aGV5IG1heSBiZSBmYWN0b3JpZXMgKFxyZWZ7ZmFjdG9yaWVzfSkuIAoKQSB7XGVtIGNvbnN0cnVjdG9yIG5hbWV9IGFsd2F5cyBiZWdpbnMgd2l0aCB0aGUgbmFtZSBvZiBpdHMgaW1tZWRpYXRlbHkgZW5jbG9zaW5nIGNsYXNzLCBhbmQgbWF5IG9wdGlvbmFsbHkgYmUgZm9sbG93ZWQgYnkgYSBkb3QgYW5kIGFuIGlkZW50aWZpZXIgJGlkJC4gSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgJGlkJCBpcyB0aGUgbmFtZSBvZiBhIG1lbWJlciAgZGVjbGFyZWQgaW4gdGhlIGltbWVkaWF0ZWx5IGVuY2xvc2luZyBjbGFzcy4gSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgdGhlIG5hbWUgb2YgYSAgY29uc3RydWN0b3IgaXMgbm90IGEgY29uc3RydWN0b3IgbmFtZS4gCgoKJSBJbiB3aGF0IHNjb3BlIGRvIGNvbnN0cnVjdG9ycyBnbz8gVGhlIHNpbXBsZSBuYW1lcyBvZiBuYW1lZCBjb25zdHJ1Y3RvcnMgZ28gIGluIHRoZSBzdGF0aWMgc2NvcGUgb2YgdGhlIGNsYXNzLiBVbm5hbWVkIG9uZXMgZ28gbm93aGVyZSwgYnV0IHdlIHVzZSB0aGUgY2xhc3MgbmFtZSB0byByZWZlciB0byB0aGVtOyB0aGUgY2xhc3MgbmFtZSBjb3VsZCBhbHNvIGluIHRoZSBzdGF0aWMgc2NvcGUgb2YgdGhlIGNsYXNzIGFzIHdlbGwgdG8gcHJldmVudCB3ZWlyZCBlcnJvcnMsIG9yIHdlIGNvdWxkIGJhbiBpdCBleHBsaWNpdGx5IGFuZCBhdm9pZGluZyBkdXBsaWNhdGlvbi4gU2ltaWxhcmx5LCB0aGUgaW5zdGFuY2Ugc2NvcGUgY291bGQgY29udGFpbiB0aGUgY29uc3RydWN0b3IgbmFtZXMgYW5kIGNsYXNzIG5hbWUsIG9yIHdlIGNvdWxkIGhhdmUgc3BlY2lhbCBydWxlcyB0byBwcmV2ZW50IGNvbGxpc2lvbnMgYmV0d2VlbiBpbnN0YW5jZSBtZW1iZXJzIGFuZCBjb25zdHJ1Y3RvcnMgb3IgdGhlIGNsYXNzLgoKJSBUaGUgZW5jbG9zaW5nIHNjb3BlIG9mIGEgZ2VuZXJhdGl2ZSBjb25zdHJ1Y3RvciBpcyB0aGUgaW5zdGFuY2Ugc2NvcGUgb2YgdGhlIGNsYXNzIGluIHdoaWNoIGl0IGlzIGRlY2xhcmVkIChidXQgd2hhdCBhYm91dCByZWRpcmVjdGluZz8pIAoKSWZmIG5vIGNvbnN0cnVjdG9yIGlzIHNwZWNpZmllZCBmb3IgYSBjbGFzcyAkQyQsIGl0IGltcGxpY2l0bHkgaGFzIGEgZGVmYXVsdCBjb25zdHJ1Y3RvciBcY29kZXtDKCkgOiBcU1VQRVJ7fSgpIFx7XH19LCB1bmxlc3MgJEMkIGlzIGNsYXNzIFxjb2Rle09iamVjdH0uCgpcc3Vic3Vic2VjdGlvbntHZW5lcmF0aXZlIENvbnN0cnVjdG9yc30KXGxhYmVse2dlbmVyYXRpdmVDb25zdHJ1Y3RvcnN9CgpBIHtcZW0gZ2VuZXJhdGl2ZSBjb25zdHJ1Y3Rvcn0gY29uc2lzdHMgb2YgYSBjb25zdHJ1Y3RvciBuYW1lLCBhIGNvbnN0cnVjdG9yIHBhcmFtZXRlciBsaXN0LCBhbmQgZWl0aGVyIGEgcmVkaXJlY3QgY2xhdXNlIG9yIGFuICBpbml0aWFsaXplciBsaXN0IGFuZCBhbiBvcHRpb25hbCBib2R5LgoKXGJlZ2lue2dyYW1tYXJ9CntcYmYgY29uc3RydWN0b3JTaWduYXR1cmU6fQogICAgICBpZGVudGlmaWVyIChge1xlc2NhcGVncmFtbWFyIC59JyBpZGVudGlmaWVyKT8gZm9ybWFsUGFyYW1ldGVyTGlzdAogICAgLgogXGVuZHtncmFtbWFyfQoKQSB7XGVtIGNvbnN0cnVjdG9yIHBhcmFtZXRlciBsaXN0fSBpcyBhIHBhcmVudGhlc2l6ZWQsIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGZvcm1hbCBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLiBBIHtcZW0gZm9ybWFsIGNvbnN0cnVjdG9yIHBhcmFtZXRlcn0gaXMgZWl0aGVyIGEgZm9ybWFsIHBhcmFtZXRlciAoXHJlZntmb3JtYWxQYXJhbWV0ZXJzfSkgb3IgYW4gaW5pdGlhbGl6aW5nIGZvcm1hbC4gQW4ge1xlbSBpbml0aWFsaXppbmcgZm9ybWFsfSBoYXMgdGhlIGZvcm0gXGNvZGV7XFRISVN7fS5pZH0sIHdoZXJlIFxjb2Rle2lkfSBpcyB0aGUgbmFtZSBvZiBhbiBpbnN0YW5jZSB2YXJpYWJsZSBvZiB0aGUgaW1tZWRpYXRlbHkgZW5jbG9zaW5nIGNsYXNzLiAgSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgXGNvZGV7aWR9IGlzIG5vdCBhbiBpbnN0YW5jZSB2YXJpYWJsZSBvZiB0aGUgaW1tZWRpYXRlbHkgZW5jbG9zaW5nIGNsYXNzLiBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBhbiBpbml0aWFsaXppbmcgZm9ybWFsIGlzIHVzZWQgYnkgYSBmdW5jdGlvbiBvdGhlciB0aGFuIGEgbm9uLXJlZGlyZWN0aW5nIGdlbmVyYXRpdmUgY29uc3RydWN0b3IuIAoKSWYgYW4gZXhwbGljaXQgdHlwZSBpcyBhdHRhY2hlZCB0byB0aGUgaW5pdGlhbGl6aW5nIGZvcm1hbCwgdGhhdCBpcyBpdHMgc3RhdGljIHR5cGUuIE90aGVyd2lzZSwgdGhlIHR5cGUgb2YgYW4gaW5pdGlhbGl6aW5nIGZvcm1hbCBuYW1lZCBcY29kZXtpZH0gaXMgJFRfe2lkfSQsIHdoZXJlICRUX3tpZH0kIGlzIHRoZSB0eXBlIG9mIHRoZSBmaWVsZCBuYW1lZCBcY29kZXtpZH0gaW4gdGhlIGltbWVkaWF0ZWx5IGVuY2xvc2luZyBjbGFzcy4gSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiB0aGUgc3RhdGljIHR5cGUgb2YgXGNvZGV7aWR9IGlzIG5vdCBhc3NpZ25hYmxlIHRvICRUX3tpZH0kLgoKVXNpbmcgYW4gaW5pdGlhbGl6aW5nIGZvcm1hbCBcY29kZXtcVEhJU3t9LmlkfSBpbiBhIGZvcm1hbCBwYXJhbWV0ZXIgbGlzdCBkb2VzIG5vdCBpbnRyb2R1Y2UgYSBmb3JtYWwgcGFyYW1ldGVyIG5hbWUgaW50byB0aGUgc2NvcGUgb2YgdGhlIGNvbnN0cnVjdG9yLiBIb3dldmVyLCB0aGUgaW5pdGlhbGl6aW5nIGZvcm1hbCBkb2VzIGVmZmVjdCB0aGUgdHlwZSBvZiB0aGUgY29uc3RydWN0b3IgZnVuY3Rpb24gZXhhY3RseSBhcyBpZiBhIGZvcm1hbCBwYXJhbWV0ZXIgIG5hbWVkIFxjb2Rle2lkfSAgb2YgdGhlIHNhbWUgdHlwZSB3ZXJlIGludHJvZHVjZWQgaW4gdGhlIHNhbWUgcG9zaXRpb24uIAoKSW5pdGlhbGl6aW5nIGZvcm1hbHMgYXJlIGV4ZWN1dGVkIGR1cmluZyB0aGUgZXhlY3V0aW9uIG9mIGdlbmVyYXRpdmUgY29uc3RydWN0b3JzIGRldGFpbGVkIGJlbG93LiBFeGVjdXRpbmcgYW4gaW5pdGlhbGl6aW5nIGZvcm1hbCAgXGNvZGV7XFRISVN7fS5pZH0gY2F1c2VzIHRoZSBmaWVsZCBcY29kZXtpZH0gb2YgdGhlIGltbWVkaWF0ZWx5IHN1cnJvdW5kaW5nIGNsYXNzIHRvIGJlIGFzc2lnbmVkIHRoZSB2YWx1ZSBvZiB0aGUgY29ycmVzcG9uZGluZyBhY3R1YWwgcGFyYW1ldGVyLCB1bmxlc3MgJGlkJCBpcyBhIGZpbmFsIHZhcmlhYmxlIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCwgaW4gd2hpY2ggY2FzZSBhIHJ1bnRpbWUgZXJyb3Igb2NjdXJzLgoKClxjb21tZW50YXJ5ewpUaGUgYWJvdmUgcnVsZSBhbGxvd3MgaW5pdGlhbGl6aW5nIGZvcm1hbHMgdG8gYmUgdXNlZCBhcyBvcHRpb25hbCBwYXJhbWV0ZXJzOgp9CgpcYmVnaW57ZGFydENvZGV9CmNsYXNzIEEgXHsKICBpbnQgeDsKICBBKFt0aGlzLnhdKTsKXH0KXGVuZHtkYXJ0Q29kZX0KClxjb21tZW50YXJ5e2lzIGxlZ2FsLCBhbmQgaGFzIHRoZSBzYW1lIGVmZmVjdCBhc30KClxiZWdpbntkYXJ0Q29kZX0KY2xhc3MgQSBceyAKICBpbnQgeDsKICBBKFtpbnQgeF0pOiB0aGlzLnggPSB4OwpcfQpcZW5ke2RhcnRDb2RlfQoKQSB7XGVtIGZyZXNoIGluc3RhbmNlfSBpcyBhbiBpbnN0YW5jZSB3aG9zZSBpZGVudGl0eSAgaXMgZGlzdGluY3QgZnJvbSBhbnkgcHJldmlvdXNseSBhbGxvY2F0ZWQgaW5zdGFuY2Ugb2YgaXRzIGNsYXNzLiBBIGdlbmVyYXRpdmUgY29uc3RydWN0b3IgYWx3YXlzIG9wZXJhdGVzIG9uIGEgZnJlc2ggaW5zdGFuY2Ugb2YgaXRzIGltbWVkaWF0ZWx5IGVuY2xvc2luZyBjbGFzcy4gCgpcY29tbWVudGFyeXsKVGhlIGFib3ZlIGhvbGRzIGlmIHRoZSBjb25zdHJ1Y3RvciBpcyBhY3R1YWxseSBydW4sIGFzIGl0IGlzIGJ5IFxORVd7fS4gSWYgYSBjb25zdHJ1Y3RvciAkYyQgaXMgcmVmZXJlbmNlZCBieSBcQ09OU1R7fSwgJGMkIG1heSBub3QgYmUgcnVuOyBpbnN0ZWFkLCBhIGNhbm9uaWNhbCBvYmplY3QgbWF5IGJlIGxvb2tlZCB1cC4gU2VlIHRoZSBzZWN0aW9uIG9uIGluc3RhbmNlIGNyZWF0aW9uIChccmVme2luc3RhbmNlQ3JlYXRpb259KS4KfQoKSWYgYSBnZW5lcmF0aXZlIGNvbnN0cnVjdG9yICRjJCAgaXMgbm90IGEgcmVkaXJlY3RpbmcgY29uc3RydWN0b3IgYW5kIG5vIGJvZHkgaXMgcHJvdmlkZWQsIHRoZW4gJGMkIGltcGxpY2l0bHkgaGFzIGFuIGVtcHR5IGJvZHkgXGNvZGV7XHtcfX0uCgoKXHBhcmFncmFwaHtSZWRpcmVjdGluZyBDb25zdHJ1Y3RvcnN9ClxsYWJlbHtyZWRpcmVjdGluZ0NvbnN0cnVjdG9yc30KCkEgZ2VuZXJhdGl2ZSBjb25zdHJ1Y3RvciBtYXkgYmUge1xlbSByZWRpcmVjdGluZ30sIGluIHdoaWNoIGNhc2UgaXRzIG9ubHkgYWN0aW9uIGlzIHRvIGludm9rZSBhbm90aGVyIGdlbmVyYXRpdmUgY29uc3RydWN0b3IuICBBIHJlZGlyZWN0aW5nIGNvbnN0cnVjdG9yIGhhcyBubyBib2R5OyBpbnN0ZWFkLCBpdCBoYXMgYSByZWRpcmVjdCBjbGF1c2UgdGhhdCBzcGVjaWZpZXMgd2hpY2ggY29uc3RydWN0b3IgdGhlIGludm9jYXRpb24gaXMgcmVkaXJlY3RlZCB0bywgYW5kIHdpdGggd2hhdCBhcmd1bWVudHMuCgpcYmVnaW57Z3JhbW1hcn0Ke1xiZiByZWRpcmVjdGlvbjp9CiAgICAgYHtcZXNjYXBlZ3JhbW1hciA6fScgXFRISVN7fSAoYHtcZXNjYXBlZ3JhbW1hciAufScgaWRlbnRpZmllcik/IGFyZ3VtZW50cwogICAgLgpcZW5ke2dyYW1tYXJ9CgolIE5lZWQgdG8gc3BlY2lmeSBleGFjdGx5IGhvdyBleGVjdXRpbmcgYSByZWRpcmVjdGluZyBjb25zdHJ1Y3RvciB3b3JrcwoKCiVcUXtXZSBub3cgaGF2ZSBnZW5lcmF0aXZlIGNvbnN0cnVjdG9ycyB3aXRoIG5vIGJvZGllcyBhcyB3ZWxsLn0KClxwYXJhZ3JhcGh7SW5pdGlhbGl6ZXIgTGlzdHN9CgpBbiBpbml0aWFsaXplciBsaXN0IGJlZ2lucyB3aXRoIGEgY29sb24sIGFuZCBjb25zaXN0cyBvZiBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGluZGl2aWR1YWwge1xlbSBpbml0aWFsaXplcnN9LiBUaGVyZSBhcmUgdHdvIGtpbmRzIG9mIGluaXRpYWxpemVycy4KXGJlZ2lue2l0ZW1pemV9ClxpdGVtIEEge1xlbSBzdXBlcmluaXRpYWxpemVyfSBpZGVudGlmaWVzIGEge1xlbSBzdXBlcmNvbnN0cnVjdG9yfSAtIHRoYXQgaXMsIGEgc3BlY2lmaWMgIGNvbnN0cnVjdG9yIG9mIHRoZSBzdXBlcmNsYXNzLiAgRXhlY3V0aW9uIG9mIHRoZSBzdXBlcmluaXRpYWxpemVyIGNhdXNlcyB0aGUgaW5pdGlhbGl6ZXIgbGlzdCBvZiB0aGUgc3VwZXJjb25zdHJ1Y3RvciB0byBiZSBleGVjdXRlZC4KClxpdGVtIEFuIHtcZW0gaW5zdGFuY2UgdmFyaWFibGUgaW5pdGlhbGl6ZXJ9IGFzc2lnbnMgYSB2YWx1ZSB0byBhbiBpbmRpdmlkdWFsIGluc3RhbmNlIHZhcmlhYmxlLiAKXGVuZHtpdGVtaXplfQoKXGJlZ2lue2dyYW1tYXJ9CntcYmYgaW5pdGlhbGl6ZXJzOn0KICAgICAgYHtcZXNjYXBlZ3JhbW1hciA6fScgc3VwZXJDYWxsT3JGaWVsZEluaXRpYWxpemVyIChgLCcgc3VwZXJDYWxsT3JGaWVsZEluaXRpYWxpemVyKSoKICAgIC4KCgp7XGJmIHN1cGVyQ2FsbE9yRmllbGRJbml0aWFsaXplcjp9XFNVUEVSe30gYXJndW1lbnRzOwogICAgICBcU1VQRVJ7fSBge1xlc2NhcGVncmFtbWFyIC59JyBpZGVudGlmaWVyIGFyZ3VtZW50czsKICAgICBmaWVsZEluaXRpYWxpemVyCiAgICAuCiAgICAKICAge1xiZiAgZmllbGRJbml0aWFsaXplcjp9CiAgICAgIChcVEhJU3t9IGB7XGVzY2FwZWdyYW1tYXIgLn0nKT8gaWRlbnRpZmllciBgPScgY29uZGl0aW9uYWxFeHByZXNzaW9uIGNhc2NhZGVTZWN0aW9uKgogICAgLgoKXGVuZHtncmFtbWFyfQoKTGV0ICRrJCBiZSBhIGdlbmVyYXRpdmUgY29uc3RydWN0b3IuICBUaGVuICRrJCBtYXkgaW5jbHVkZSBhdCBtb3N0IG9uZSAgc3VwZXJpbml0aWFsaXplciBpbiBpdHMgaW5pdGlhbGl6ZXIgbGlzdCBvciBhIGNvbXBpbGUtdGltZSBlcnJvciBvY2N1cnMuIElmIG5vIHN1cGVyaW5pdGlhbGl6ZXIgaXMgcHJvdmlkZWQsIGFuIGltcGxpY2l0IHN1cGVyaW5pdGlhbGl6ZXIgb2YgdGhlIGZvcm0gXFNVUEVSe30oKSBpcyBhZGRlZCBhdCB0aGUgZW5kIG9mICRrJCdzIGluaXRpYWxpemVyIGxpc3QsIHVubGVzcyB0aGUgZW5jbG9zaW5nIGNsYXNzIGlzIGNsYXNzIFxjb2Rle09iamVjdH0uIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIG1vcmUgdGhhbiBvbmUgaW5pdGlhbGl6ZXIgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIGluc3RhbmNlIHZhcmlhYmxlIGFwcGVhcnMgaW4gJGskJ3MgaW5pdGlhbGl6ZXIgbGlzdC4gSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgJGskJ3MgaW5pdGlhbGl6ZXIgbGlzdCBjb250YWlucyBhbiBpbml0aWFsaXplciBmb3IgYSB2YXJpYWJsZSB0aGF0IGlzIGluaXRpYWxpemVkIGJ5IG1lYW5zIG9mIGFuIGluaXRpYWxpemluZyBmb3JtYWwgb2YgJGskLiAlIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmICAkayQncyBpbml0aWFsaXplciBsaXN0IGNvbnRhaW5zIGFuIGluaXRpYWxpemVyIGZvciBhIGZpbmFsIHZhcmlhYmxlICRmJCB3aG9zZSBkZWNsYXJhdGlvbiBpbmNsdWRlcyBhbiBpbml0aWFsaXphdGlvbiBleHByZXNzaW9uLgogCkVhY2ggZmluYWwgaW5zdGFuY2UgdmFyaWFibGUgJGYkIGRlY2xhcmVkIGluIHRoZSBpbW1lZGlhdGVseSBlbmNsb3NpbmcgY2xhc3MgbXVzdCBoYXZlIGFuIGluaXRpYWxpemVyIGluICRrJCdzIGluaXRpYWxpemVyIGxpc3QgdW5sZXNzIGl0IGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgYnkgb25lIG9mIHRoZSBmb2xsb3dpbmcgbWVhbnM6CiBcYmVnaW57aXRlbWl6ZX0KIFxpdGVtIEluaXRpYWxpemF0aW9uIGF0IHRoZSBkZWNsYXJhdGlvbiBvZiAkZiQuCiBcaXRlbSBJbml0aWFsaXphdGlvbiBieSAgbWVhbnMgb2YgYW4gaW5pdGlhbGl6aW5nIGZvcm1hbCBvZiAkayQuCiBcZW5ke2l0ZW1pemV9CiAKb3IgYSBzdGF0aWMgd2FybmluZyBvY2N1cnMuIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmICRrJCdzIGluaXRpYWxpemVyIGxpc3QgY29udGFpbnMgYW4gaW5pdGlhbGl6ZXIgZm9yIGEgdmFyaWFibGUgdGhhdCBpcyBub3QgYW4gaW5zdGFuY2UgdmFyaWFibGUgZGVjbGFyZWQgaW4gdGhlIGltbWVkaWF0ZWx5IHN1cnJvdW5kaW5nIGNsYXNzLgoKIApcY29tbWVudGFyeXtUaGUgIGluaXRpYWxpemVyIGxpc3QgbWF5IG9mIGNvdXJzZSBjb250YWluIGFuIGluaXRpYWxpemVyIGZvciBhbnkgIGluc3RhbmNlIHZhcmlhYmxlIGRlY2xhcmVkIGJ5IHRoZSBpbW1lZGlhdGVseSBzdXJyb3VuZGluZyBjbGFzcywgZXZlbiBpZiBpdCBpcyBub3QgZmluYWwuIAp9CgogSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgYSAgZ2VuZXJhdGl2ZSBjb25zdHJ1Y3RvciBvZiBjbGFzcyBcY29kZXtPYmplY3R9IGluY2x1ZGVzIGEgc3VwZXJpbml0aWFsaXplci4gCgpFeGVjdXRpb24gb2YgYSBnZW5lcmF0aXZlIGNvbnN0cnVjdG9yICRrJCBpcyBhbHdheXMgZG9uZSB3aXRoIHJlc3BlY3QgdG8gYSBzZXQgb2YgYmluZGluZ3MgZm9yIGl0cyBmb3JtYWwgcGFyYW1ldGVycyBhbmQgd2l0aCAgXFRISVN7fSBib3VuZCB0byBhIGZyZXNoIGluc3RhbmNlICRpJCBhbmQgdGhlIHR5cGUgcGFyYW1ldGVycyBvZiB0aGUgaW1tZWRpYXRlbHkgZW5jbG9zaW5nIGNsYXNzIGJvdW5kIHRvIGEgc2V0IG9mIGFjdHVhbCB0eXBlIGFyZ3VtZW50cyAkVl8xLCBcbGRvdHMgLCBWX20kLiAKClxjb21tZW50YXJ5e1RoZXNlIGJpbmRpbmdzIGFyZSB1c3VhbGx5IGRldGVybWluZWQgYnkgdGhlIGluc3RhbmNlIGNyZWF0aW9uIGV4cHJlc3Npb24gdGhhdCBpbnZva2VkIHRoZSBjb25zdHJ1Y3RvciAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkuIEhvd2V2ZXIsIHRoZXkgbWF5IGFsc28gYmUgZGV0ZXJtaW5lZCBieSBhIHJlZmxlY3RpdmUgY2FsbCwuCn0KCklmICRrJCBpcyByZWRpcmVjdGluZyB0aGVuIGl0cyByZWRpcmVjdCBjbGF1c2UgaGFzIHRoZSBmb3JtIAoKXFRISVN7fSQuZyhhXzEsIFxsZG90cyAsIGFfbiwgeF97bisxfTogYV97bisxfSwgXGxkb3RzICwgeF97bitrfTogYV97bitrfSkkIAoKd2hlcmUgJGckIGlkZW50aWZpZXMgYW5vdGhlciAgZ2VuZXJhdGl2ZSBjb25zdHJ1Y3RvciBvZiB0aGUgaW1tZWRpYXRlbHkgc3Vycm91bmRpbmcgY2xhc3MuIFRoZW4gZXhlY3V0aW9uIG9mICRrJCBwcm9jZWVkcyBieSBldmFsdWF0aW5nIHRoZSBhcmd1bWVudCBsaXN0ICQoYV8xLCBcbGRvdHMgLCBhX24sIHhfe24rMX06IGFfe24rMX0sIFxsZG90cyAsIHhfe24ra306IGFfe24ra30pJCwgYW5kIHRoZW4gZXhlY3V0aW5nICRnJCB3aXRoIHJlc3BlY3QgdG8gdGhlIGJpbmRpbmdzIHJlc3VsdGluZyBmcm9tIHRoZSBldmFsdWF0aW9uIG9mICQoYV8xLCBcbGRvdHMgLCBhX24sIHhfe24rMX06IGFfe24rMX0sIFxsZG90cyAsIHhfe24ra306IGFfe24ra30pJCBhbmQgd2l0aCAgXFRISVN7fSBib3VuZCB0byAkaSQgYW5kIHRoZSB0eXBlIHBhcmFtZXRlcnMgb2YgdGhlIGltbWVkaWF0ZWx5IGVuY2xvc2luZyBjbGFzcyBib3VuZCB0byAkVl8xLCBcbGRvdHMgLCBWX20kLiAKCk90aGVyd2lzZSwgZXhlY3V0aW9uICBwcm9jZWVkcyBhcyBmb2xsb3dzOgoKJUZpcnN0LCBhIGZyZXNoIGluc3RhbmNlIChccmVme2dlbmVyYXRpdmVDb25zdHJ1Y3RvcnN9KSAkaSQgb2YgdGhlIGltbWVkaWF0ZWx5IGVuY2xvc2luZyBjbGFzcyBpcyBhbGxvY2F0ZWQuICBOZXh0LCB0aGUgaW5zdGFuY2UgdmFyaWFibGUgZGVjbGFyYXRpb25zIG9mIHRoZSBpbW1lZGlhdGVseSBlbmNsb3NpbmcgY2xhc3MgYXJlIHZpc2l0ZWQgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluIHRoZSBwcm9ncmFtIHRleHQuIEZvciBlYWNoIHN1Y2ggZGVjbGFyYXRpb24gJGQkLCBpZiAkZCQgaGFzIHRoZSBmb3JtICBcY29kZXskZmluYWxDb25zdFZhck9yVHlwZSQgJHYkID0gJGUkOyB9IHRoZW4gdGhlIGluc3RhbmNlIHZhcmlhYmxlICR2JCBvZiAkaSQgaXMgYm91bmQgdG8gdGhlIHZhbHVlIG9mICRlJCAod2hpY2ggaXMgbmVjZXNzYXJpbHkgYSBjb21waWxlLXRpbWUgY29uc3RhbnQpLgolTmV4dCwgYQpBbnkgaW5pdGlhbGl6aW5nIGZvcm1hbHMgZGVjbGFyZWQgaW4gJGskJ3MgcGFyYW1ldGVyIGxpc3QgYXJlIGV4ZWN1dGVkIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiB0aGUgcHJvZ3JhbSB0ZXh0LiAgCiUgSW4gZmFjdCwgdGhpcyBvcmRlciBpcyB1bm9ic2VydmFibGU7IHRoaXMgY291bGQgYmUgZG9uZSBhbnkgdGltZSBwcmlvciB0byBydW5uaW5nIHRoZSBib2R5LCBzaW5jZQolIHRoZXNlIG9ubHkgZWZmZWN0IFxUSElTe30uClRoZW4sICRrJCdzICBpbml0aWFsaXplcnMgYXJlIGV4ZWN1dGVkIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiB0aGUgcHJvZ3JhbS4KClxyYXRpb25hbGUge1dlIGNvdWxkIG9ic2VydmUgdGhlIG9yZGVyIGJ5IHNpZGUgIGVmZmVjdGluZyBleHRlcm5hbCByb3V0aW5lcyBjYWxsZWQuIFNvIHdlIG5lZWQgdG8gc3BlY2lmeSB0aGUgb3JkZXIufQoKQWZ0ZXIgYWxsIHRoZSBpbml0aWFsaXplcnMgIGhhdmUgY29tcGxldGVkLCB0aGUgYm9keSBvZiAkayQgaXMgZXhlY3V0ZWQgIGluIGEgc2NvcGUgd2hlcmUgXFRISVN7fSBpcyBib3VuZCB0byAkaSQuIEV4ZWN1dGlvbiBvZiB0aGUgYm9keSBiZWdpbnMgd2l0aCBleGVjdXRpb24gb2YgdGhlIGJvZHkgb2YgdGhlIHN1cGVyY29uc3RydWN0b3IgIHdpdGggXFRISVN7fSBib3VuZCB0byAkaSQsIHRoZSB0eXBlIHBhcmFtZXRlcnMgb2YgdGhlIGltbWVkaWF0ZWx5IGVuY2xvc2luZyBjbGFzcyBib3VuZCB0byBhIHNldCBvZiBhY3R1YWwgdHlwZSBhcmd1bWVudHMgJFZfMSwgXGxkb3RzICwgVl9tJCBhbmQgdGhlIGZvcm1hbCBwYXJhbWV0ZXJzIGJpbmRpbmdzIGRldGVybWluZWQgYnkgdGhlIGFyZ3VtZW50IGxpc3Qgb2YgdGhlIHN1cGVyaW5pdGlhbGl6ZXIgb2YgJGskLgoKXHJhdGlvbmFsZXsKVGhpcyBwcm9jZXNzIGVuc3VyZXMgdGhhdCBubyB1bmluaXRpYWxpemVkIGZpbmFsIGZpZWxkIGlzIGV2ZXIgc2VlbiBieSBjb2RlLiBOb3RlIHRoYXQgXFRISVN7fSBpcyBub3QgaW4gc2NvcGUgb24gdGhlIHJpZ2h0IGhhbmQgc2lkZSBvZiBhbiBpbml0aWFsaXplciAoc2VlIFxyZWZ7dGhpc30pIHNvIG5vIGluc3RhbmNlIG1ldGhvZCBjYW4gZXhlY3V0ZSBkdXJpbmcgaW5pdGlhbGl6YXRpb246IGFuIGluc3RhbmNlIG1ldGhvZCBjYW5ub3QgYmUgZGlyZWN0bHkgaW52b2tlZCwgbm9yIGNhbiAgXFRISVN7fSBiZSBwYXNzZWQgaW50byBhbnkgb3RoZXIgY29kZSBiZWluZyBpbnZva2VkIGluIHRoZSBpbml0aWFsaXplci4gCn0KCkV4ZWN1dGlvbiBvZiBhbiBpbml0aWFsaXplciBvZiB0aGUgZm9ybSBcY29kZXtcVEhJU3t9LiR2JCA9ICRlJH0gcHJvY2VlZHMgYXMgZm9sbG93czoKCkZpcnN0LCB0aGUgZXhwcmVzc2lvbiAkZSQgaXMgZXZhbHVhdGVkIHRvIGFuIG9iamVjdCAkbyQuIFRoZW4sIHRoZSBpbnN0YW5jZSB2YXJpYWJsZSAkdiQgb2YgdGhlIG9iamVjdCBkZW5vdGVkIGJ5IFxUSElTe30gaXMgYm91bmQgdG8gJG8kLCB1bmxlc3MgJHYkIGlzIGEgZmluYWwgdmFyaWFibGUgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLCBpbiB3aGljaCBjYXNlIGEgcnVudGltZSBlcnJvciBvY2N1cnMuIEluIGNoZWNrZWQgbW9kZSwgaXQgaXMgYSBkeW5hbWljIHR5cGUgZXJyb3IgaWYgJG8kIGlzIG5vdCBcTlVMTHt9IGFuZCB0aGUgaW50ZXJmYWNlIG9mIHRoZSBjbGFzcyBvZiAkbyQgaXMgbm90IGEgc3VidHlwZSBvZiB0aGUgYWN0dWFsIHR5cGUgb2YgdGhlIGZpZWxkICR2JC4KCkFuIGluaXRpYWxpemVyIG9mIHRoZSBmb3JtIFxjb2RleyR2JCA9ICRlJH0gaXMgZXF1aXZhbGVudCB0byBhbiBpbml0aWFsaXplciBvZiB0aGUgZm9ybSAgXGNvZGV7XFRISVN7fS4kdiQgPSAkZSR9LiAKCkV4ZWN1dGlvbiBvZiBhIHN1cGVyaW5pdGlhbGl6ZXIgb2YgdGhlIGZvcm0gCgpcU1VQRVJ7fSQoYV8xLCBcbGRvdHMsIGFfbiwgIHhfe24rMX06IGFfe24rMX0sIFxsZG90cywgeF97bitrfTogYV97bitrfSkkIAoKKHJlc3BlY3RpdmVseSAgXFNVUEVSe30kLmlkKGFfMSwgXGxkb3RzLCBhX24sIHhfe24rMX06IGFfe24rMX0sIFxsZG90cywgeF97bitrfTogYV97bitrfSkkIAoKcHJvY2VlZHMgYXMgZm9sbG93czoKCkZpcnN0LCB0aGUgYXJndW1lbnQgbGlzdCAkKGFfMSwgXGxkb3RzLCBhX24sIHhfe24rMX06IGFfe24rMX0sIFxsZG90cywgeF97bitrfTogYV97bitrfSkkIGlzIGV2YWx1YXRlZC4KCkxldCAkQyQgYmUgdGhlIGNsYXNzIGluIHdoaWNoIHRoZSBzdXBlcmluaXRpYWxpemVyIGFwcGVhcnMgYW5kIGxldCAkUyQgYmUgdGhlIHN1cGVyY2xhc3Mgb2YgJEMkLiAgSWYgJFMkIGlzIGdlbmVyaWMgKFxyZWZ7Z2VuZXJpY3N9KSwgbGV0ICRVXzEsICwgXGxkb3RzLCBVX20kIGJlIHRoZSBhY3R1YWwgdHlwZSBhcmd1bWVudHMgcGFzc2VkIHRvICRTJCBpbiB0aGUgc3VwZXJjbGFzcyBjbGF1c2Ugb2YgJEMkLgoKVGhlbiwgdGhlIGluaXRpYWxpemVyIGxpc3Qgb2YgdGhlIGNvbnN0cnVjdG9yICRTJCAocmVzcGVjdGl2ZWx5ICRTLmlkJCkgaXMgZXhlY3V0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBiaW5kaW5ncyB0aGF0IHJlc3VsdGVkIGZyb20gdGhlIGV2YWx1YXRpb24gb2YgdGhlIGFyZ3VtZW50IGxpc3QsICB3aXRoIFxUSElTe30gYm91bmQgdG8gdGhlIGN1cnJlbnQgYmluZGluZyBvZiBcVEhJU3t9LCBhbmQgIHRoZSB0eXBlIHBhcmFtZXRlcnMgKGlmIGFueSkgb2YgY2xhc3MgJFMkIGJvdW5kIHRvIHRoZSBjdXJyZW50IGJpbmRpbmdzIG9mICRVXzEsICwgXGxkb3RzLCBVX20kLgoKSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgY2xhc3MgJFMkIGRvZXMgbm90IGRlY2xhcmUgYSBnZW5lcmF0aXZlIGNvbnN0cnVjdG9yIG5hbWVkICRTJCAocmVzcGVjdGl2ZWx5ICRTLmlkJCkKClxzdWJzdWJzZWN0aW9ue0ZhY3Rvcmllc30KXGxhYmVse2ZhY3Rvcmllc30KCkEge1xlbSBmYWN0b3J5fSBpcyBhIGNvbnN0cnVjdG9yIHByZWZhY2VkIGJ5IHRoZSBidWlsdC1pbiBpZGVudGlmaWVyICAoXHJlZntpZGVudGlmaWVyUmVmZXJlbmNlfSkgICBcRkFDVE9SWXt9LiAKClxiZWdpbntncmFtbWFyfQp7XGJmIGZhY3RvcnlDb25zdHJ1Y3RvclNpZ25hdHVyZTp9CiAgICAgIFxGQUNUT1JZe30gaWRlbnRpZmllciAgKGB7XGVzY2FwZWdyYW1tYXIgLn0nIGlkZW50aWZpZXIpPyAgZm9ybWFsUGFyYW1ldGVyTGlzdAogICAgLgpcZW5ke2dyYW1tYXJ9CgoKJVRoZSBlbmNsb3Npbmcgc2NvcGUgb2YgYSBmYWN0b3J5IGNvbnN0cnVjdG9yIGlzIHRoZSBzdGF0aWMgc2NvcGUgXHJlZnt9IG9mIHRoZSBjbGFzcyBpbiB3aGljaCBpdCBpcyBkZWNsYXJlZC4KClRoZSB7XGVtIHJldHVybiB0eXBlfSBvZiBhIGZhY3Rvcnkgd2hvc2Ugc2lnbmF0dXJlIGlzIG9mIHRoZSBmb3JtIFxGQUNUT1JZe30gJE0kIG9yIHRoZSBmb3JtIFxGQUNUT1JZe30gJE0uaWQkIGlzICRNJCBpZiAkTSQgaXMgbm90IGEgZ2VuZXJpYyB0eXBlOyBvdGhlcndpc2UgdGhlIHJldHVybiB0eXBlIGlzICAkTSA8VF8xLCBcbGRvdHMsIFRfbj4kIHdoZXJlICRUXzEsIFxsZG90cywgVF9uJCBhcmUgdGhlIHR5cGUgcGFyYW1ldGVycyBvZiB0aGUgZW5jbG9zaW5nIGNsYXNzCgpJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiAkTSQgaXMgbm90IHRoZSBuYW1lIG9mIHRoZSBpbW1lZGlhdGVseSBlbmNsb3NpbmcgY2xhc3MuIAoKSW4gY2hlY2tlZCBtb2RlLCBpdCBpcyBhIGR5bmFtaWMgdHlwZSBlcnJvciBpZiBhIGZhY3RvcnkgcmV0dXJucyBhIG5vbi1udWxsIG9iamVjdCB3aG9zZSB0eXBlIGlzIG5vdCBhIHN1YnR5cGUgb2YgaXRzIGFjdHVhbCAoXHJlZnthY3R1YWxUeXBlT2ZBRGVjbGFyYXRpb259KSByZXR1cm4gdHlwZS4KClxyYXRpb25hbGV7SXQgc2VlbXMgdXNlbGVzcyB0byBhbGxvdyBhIGZhY3RvcnkgdG8gcmV0dXJuIG51bGwuIEJ1dCBpdCBpcyBtb3JlIHVuaWZvcm0gdG8gYWxsb3cgaXQsIGFzIHRoZSBydWxlcyBjdXJyZW50bHkgZG8ufQoKXHJhdGlvbmFsZXtGYWN0b3JpZXMgYWRkcmVzcyBjbGFzc2ljIHdlYWtuZXNzZXMgYXNzb2NpYXRlZCB3aXRoIGNvbnN0cnVjdG9ycyBpbiBvdGhlciBsYW5ndWFnZXMuCkZhY3RvcmllcyBjYW4gcHJvZHVjZSBpbnN0YW5jZXMgdGhhdCBhcmUgbm90IGZyZXNobHkgYWxsb2NhdGVkOiB0aGV5IGNhbiBjb21lIGZyb20gYSBjYWNoZS4gTGlrZXdpc2UsIGZhY3RvcmllcyBjYW4gcmV0dXJuIGluc3RhbmNlcyBvZiBkaWZmZXJlbnQgY2xhc3Nlcy4gCgp9CgpccGFyYWdyYXBoe1JlZGlyZWN0aW5nIEZhY3RvcnkgQ29uc3RydWN0b3JzfQpcbGFiZWx7cmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JzfQoKQSB7XGVtIHJlZGlyZWN0aW5nIGZhY3RvcnkgY29uc3RydWN0b3J9IHNwZWNpZmllcyBhIGNhbGwgdG8gYSBjb25zdHJ1Y3RvciBvZiBhbm90aGVyIGNsYXNzIHRoYXQgaXMgdG8gYmUgdXNlZCB3aGVuZXZlciB0aGUgcmVkaXJlY3RpbmcgY29uc3RydWN0b3IgaXMgY2FsbGVkLgoKXGJlZ2lue2dyYW1tYXJ9CntcYmYgcmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JTaWduYXR1cmU6fQogICAgICBcQ09OU1R7fT8gXEZBQ1RPUll7fSBpZGVudGlmaWVyIChge1xlc2NhcGVncmFtbWFyIC59JyBpZGVudGlmaWVyKT8gZm9ybWFsUGFyYW1ldGVyTGlzdCBgPScgdHlwZSAoYHtcZXNjYXBlZ3JhbW1hciAufScgaWRlbnRpZmllcik/CiAgICAuClxlbmR7Z3JhbW1hcn0KCkNhbGxpbmcgYSByZWRpcmVjdGluZyBmYWN0b3J5IGNvbnN0cnVjdG9yICRrJCBjYXVzZXMgdGhlIGNvbnN0cnVjdG9yICRrXlxwcmltZSQgZGVub3RlZCBieSAkdHlwZSQgKHJlc3BlY3RpdmVseSwgJHR5cGUuaWRlbnRpZmllciQpIHRvIGJlIGNhbGxlZCB3aXRoIHRoZSBhY3R1YWwgYXJndW1lbnRzIHBhc3NlZCB0byAkayQsIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgb2YgJGteXHByaW1lJCBhcyB0aGUgcmVzdWx0IG9mICRrJC4gIFRoZSByZXN1bHRpbmcgY29uc3RydWN0b3IgY2FsbCBpcyBnb3Zlcm5lZCBieSB0aGUgc2FtZSBydWxlcyBhcyBhbiBpbnN0YW5jZSBjcmVhdGlvbiBleHByZXNzaW9uIHVzaW5nIFxORVd7fSAoXHJlZntpbnN0YW5jZUNyZWF0aW9ufSkuIAoKXGNvbW1lbnRhcnl7Ckl0IGZvbGxvd3MgdGhhdCBpZiAkdHlwZSQgb3IgJHR5cGUuaWQkIGFyZSBub3QgZGVmaW5lZCwgb3IgZG8gbm90IHJlZmVyIHRvIGEgY2xhc3Mgb3IgY29uc3RydWN0b3IsIGEgZHluYW1pYyBlcnJvciBvY2N1cnMsIGFzIHdpdGggYW55IG90aGVyIHVuZGVmaW5lZCBjb25zdHJ1Y3RvciBjYWxsLiBUaGUgc2FtZSBob2xkcyBpZiAkayQgaXMgY2FsbGVkIHdpdGggZmV3ZXIgcmVxdWlyZWQgcGFyYW1ldGVycyBvciBtb3JlIHBvc2l0aW9uYWwgcGFyYW1ldGVycyB0aGFuICRrXlxwcmltZSQgZXhwZWN0cywgb3IgaWYgJGskICBpcyBjYWxsZWQgd2l0aCBhIG5hbWVkIHBhcmFtZXRlciB0aGF0IGlzIG5vdCBkZWNsYXJlZCBieSAka15ccHJpbWUkLgp9CgpJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiAkayQgZXhwbGljaXRseSBzcGVjaWZpZXMgYSBkZWZhdWx0IHZhbHVlIGZvciBhbiBvcHRpb25hbCBwYXJhbWV0ZXIuXGNvbW1lbnRhcnl7CkRlZmF1bHQgdmFsdWVzIHNwZWNpZmllZCBpbiAkayQgd291bGQgYmUgaWdub3JlZCwgc2luY2UgaXQgaXMgdGhlIHtcZW0gYWN0dWFsfSBwYXJhbWV0ZXJzIHRoYXQgYXJlIHBhc3NlZCB0byAka15ccHJpbWUkLiBIZW5jZSwgZGVmYXVsdCB2YWx1ZXMgYXJlIGRpc2FsbG93ZWQuCn0KCkl0IGlzIGEgcnVuLXRpbWUgZXJyb3IgaWYgYSByZWRpcmVjdGluZyBmYWN0b3J5IGNvbnN0cnVjdG9yIHJlZGlyZWN0cyB0byBpdHNlbGYsIGVpdGhlciBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHZpYSBhIHNlcXVlbmNlIG9mIHJlZGlyZWN0aW9ucy4gJWRvZXMgbm90IHJlZGlyZWN0IHRvIGEgbm9uLXJlZGlyZWN0aW5nIGZhY3RvcnkgY29uc3RydWN0b3Igb3IgdG8gYSBnZW5lcmF0aXZlIGNvbnN0cnVjdG9yIGluIGEgZmluaXRlIG51bWJlciBvZiBzdGVwcy4KCiUgTWFrZSB0aGlzIGEgcnVudGltZSBlcnJvciBzbyBkZWZlcnJlZCBsb2FkaW5nIHdvcmtzCgpccmF0aW9uYWxlewpJZiBhIHJlZGlyZWN0aW5nIGZhY3RvcnkgJEZfMSQgcmVkaXJlY3RzIHRvIGFub3RoZXIgcmVkaXJlY3RpbmcgZmFjdG9yeSAkRl8yJCBhbmQgJEZfMiQgdGhlbiByZWRpcmVjdHMgdG8gJEZfMSQsIHRoZW4gYm90aCAkRl8xJCBhbmQgJEZfMiQgYXJlIGlsbC1kZWZpbmVkLiBTdWNoIGN5Y2xlcyBhcmUgdGhlcmVmb3JlIGlsbGVnYWwuCn0gCgoKSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiAkdHlwZSQgZG9lcyBub3QgZGVub3RlIGEgY2xhc3MgYWNjZXNzaWJsZSBpbiB0aGUgY3VycmVudCBzY29wZTsgaWYgJHR5cGUkIGRvZXMgZGVub3RlIHN1Y2ggYSBjbGFzcyAkQyQgaXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiB0aGUgcmVmZXJlbmNlZCBjb25zdHJ1Y3RvciAoYmUgaXQgJHR5cGUkIG9yICR0eXBlLmlkJCkgaXMgbm90IGEgY29uc3RydWN0b3Igb2YgJEMkLgoKXGNvbW1lbnRhcnl7Ck5vdGUgdGhhdCBpdCBpcyBub3QgcG9zc2libGUgdG8gbW9kaWZ5IHRoZSBhcmd1bWVudHMgYmVpbmcgcGFzc2VkIHRvICAkayckLiAgCn0KJSBidXQgd2UgaGF2ZSB0aGUgc2FtZSBpc3N1ZSB3aXRoIG90aGVyIHJlZGlyZWN0aW5nIGNvbnN0cnVjdG9ycywgbm8/KQpccmF0aW9uYWxlewpBdCBmaXJzdCBnbGFuY2UsIG9uZSBtaWdodCB0aGluayB0aGF0IG9yZGluYXJ5IGZhY3RvcnkgY29uc3RydWN0b3JzIGNvdWxkIHNpbXBseSBjcmVhdGUgaW5zdGFuY2VzIG9mIG90aGVyIGNsYXNzZXMgYW5kIHJldHVybiB0aGVtLCBhbmQgdGhhdCByZWRpcmVjdGluZyBmYWN0b3JpZXMgYXJlIHVubmVjZXNzYXJ5LiBIb3dldmVyLCByZWRpcmVjdGluZyBmYWN0b3JpZXMgaGF2ZSBzZXZlcmFsIGFkdmFudGFnZXM6ClxiZWdpbntpdGVtaXplfQpcaXRlbSBBbiBhYnN0cmFjdCBjbGFzcyBtYXkgcHJvdmlkZSBhIGNvbnN0YW50IGNvbnN0cnVjdG9yIHRoYXQgdXRpbGl6ZXMgdGhlIGNvbnN0YW50IGNvbnN0cnVjdG9yIG9mIGFub3RoZXIgY2xhc3MuClxpdGVtIEEgcmVkaXJlY3RpbmcgZmFjdG9yeSBjb25zdHJ1Y3RvcnMgYXZvaWRzIHRoZSBuZWVkIGZvciBmb3J3YXJkZXJzIHRvIHJlcGVhdCB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIGZvcm1hbCBwYXJhbWV0ZXJzIGluIHRoZWlyIHNpZ25hdHVyZXMuCiVcaXRlbSBBIGdlbmVyaWMgZmFjdG9yeSBjbGFzcyB0aGF0IGFnZ3JlZ2F0ZXMgZmFjdG9yeSBjb25zdHJ1Y3RvcnMgZm9yIHR5cGVzIGl0IGRvZXMgbm90IGltcGxlbWVudCBjYW4gc3RpbGwgaGF2ZSBpdHMgdHlwZSBhcmd1bWVudHMgcGFzc2VkIGNvcnJlY3RseS4KXGVuZHtpdGVtaXplfQoKJUFuIGV4YW1wbGUgb2YgdGhlIGxhdHRlciBwb2ludDoKJX0KCgolXGJlZ2lue2RhcnRDb2RlfQolXENMQVNTe30gVyQ8JFQkPiQgXElNUExFTUVOVFN7fSBBJDwkVCQ+JCB7IFcodykgey4uLn0gLi4ufQolXENMQVNTe30gWCQ8JFQkPiQgXElNUExFTUVOVFN7fSBBJDwkVCQ+JCB7IFgoeCkgey4uLn0gLi4ufQolXENMQVNTe30gWSQ8JFQkPiQgXElNUExFTUVOVFN7fSBBJDwkVCQ+JCB7IFkoeSkgey4uLn0gLi4ufQolXENMQVNTe30gWiQ8JFQkPiQgXElNUExFTUVOVFN7fSBBJDwkVCQ+JCB7IFooeikgey4uLn0gLi4ufQoKCiVcQ0xBU1N7fSBGJDwkVCQ+JCB7IC8vIG5vdGUgdGhhdCBGIGRvZXMgbm90IGltcGxlbWVudCBBCiUgIFxTVEFUSUN7fSBGJDwkVCQ+JCBpZHcodykgJD0+JCBcTkVXe30gIFckPCRUJD4kKHcpOyAvLyBpbGxlZ2FsIC0gVCBub3QgaW4gc2NvcGUgaW4gaWR3CiUgIFxGQUNUT1JZe30gRi5pZHgoeCkgJD0+JCBcTkVXe30gWCQ8JFQkPiQoeCk7CiUgIFxGQUNUT1JZe30gRi5pZHkoeSkgJD0+JCBcTkVXe30gWSQ8JFQkPiQoeSk7CiUgIFxTVEFUSUN7fSBGIGlkeih6KSAkPT4kIFxORVd7fSAgWih6KTsgLy8gZG9lcyBub3QgY2FwdHVyZSB0aGUgdHlwZSBhcmd1bWVudAolfQoKJVxDTEFTU3t9IEEkPCRUJD4kewolICBcRkFDVE9SWXt9IEEuaWR3KHcpICQ9PiQgRiQ8JFQkPiQuaWR3KHcpOyAKJS8vIGlsbGVnYWwgLSBjYW5ub3QgcGFzcyB0eXBlIHBhcmFtZXRlciB0byBzdGF0aWMgbWV0aG9kCiUgIFxGQUNUT1JZe30gQS5pZHgoeCkgJD0+IFxORVd7fSAkRiQ8JFQkPiQuaWR4KHgpOyAvLyB3b3JrcywgYnV0IGFsbG9jYXRlcyBhIGdyYXR1aXRvdXMgaW5zdGFuY2Ugb2YgRgolICBcRkFDVE9SWXt9IEEuaWR5KHkpID0gWSQ8JFQkPiQ7IC8vIHdvcmtzCiUgIFxGQUNUT1JZe30gQS5pZHooeikgJD0+JCBGLmlkeih6KTsgLy8gd3JvbmcgLSByZXR1cm5zIFokPCREeW5hbWljJD4kOyBubyB3YXkgdG8gcGFzcyB0eXBlIGFyZ3VtZW50Cn0KJVxlbmR7ZGFydENvZGV9CgpJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiAkayQgaXMgcHJlZml4ZWQgd2l0aCB0aGUgXENPTlNUe30gbW9kaWZpZXIgYnV0ICRrXlxwcmltZSQgaXMgbm90IGEgY29uc3RhbnQgY29uc3RydWN0b3IgKFxyZWZ7Y29uc3RhbnRDb25zdHJ1Y3RvcnN9KS4KCkl0IGlzIGEgc3RhdGljIHdhcm5pbmcgaWYgdGhlIGZ1bmN0aW9uIHR5cGUgb2YgJGteXHByaW1lJCBpcyBub3QgYSBzdWJ0eXBlIG9mIHRoZSB0eXBlIG9mICRrJC4KClxjb21tZW50YXJ5ewpUaGlzIGltcGxpZXMgdGhhdCB0aGUgIHJlc3VsdGluZyBvYmplY3QgY29uZm9ybXMgdG8gdGhlIGludGVyZmFjZSBvZiB0aGUgaW1tZWRpYXRlbHkgZW5jbG9zaW5nIGNsYXNzIG9mICRrJC4KfQoKSXQgaXMgYSBzdGF0aWMgdHlwZSB3YXJuaW5nIGlmIGFueSBvZiB0aGUgdHlwZSBhcmd1bWVudHMgdG8gJGteXHByaW1lJCBhcmUgbm90IHN1YnR5cGVzIG9mIHRoZSBib3VuZHMgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZm9ybWFsIHR5cGUgcGFyYW1ldGVycyBvZiAkdHlwZSQuCgoKXHN1YnN1YnNlY3Rpb257Q29uc3RhbnQgQ29uc3RydWN0b3JzfQpcbGFiZWx7Y29uc3RhbnRDb25zdHJ1Y3RvcnN9CgpBIHtcZW0gY29uc3RhbnQgY29uc3RydWN0b3J9IG1heSBiZSB1c2VkIHRvIGNyZWF0ZSBjb21waWxlLXRpbWUgY29uc3RhbnQgIChccmVme2NvbnN0YW50c30pIG9iamVjdHMuIEEgY29uc3RhbnQgY29uc3RydWN0b3IgaXMgcHJlZml4ZWQgYnkgdGhlIHJlc2VydmVkIHdvcmQgXENPTlNUe30uIAoKXGJlZ2lue2dyYW1tYXJ9CntcYmYgY29uc3RhbnRDb25zdHJ1Y3RvclNpZ25hdHVyZTp9CiAgICAgIFxDT05TVHt9IHF1YWxpZmllZCBmb3JtYWxQYXJhbWV0ZXJMaXN0CiAgICAuClxlbmR7Z3JhbW1hcn0KCgolXGNvbW1lbnRhcnl7U3BlbGwgb3V0IHN1YnRsZXRpZXM6IGEgY29uc3RhbnQgY29uc3RydWN0b3IgY2FsbCB3aXRoaW4gdGhlIGluaXRpYWxpemVyIG9mIGEgY29uc3RhbnQgY29uc3RydWN0b3IgaXMgdHJlYXRlZCBhcyBhICBvcmRpbmFyeSBjb25zdHJ1Y3RvciBjYWxsIChhIG5ldyksIGJlY2F1c2UgdGhlIGFyZ3VtZW50cyBjYW5ub3QgYmUgYXNzdW1lZCBjb25zdGFudCBhbnltb3JlLiBJbiBwcmFjdGljZSwgdGhpcyBtZWFucyB0d28gdmVyc2lvbnMgYXJlIGNvbXBpbGVkIGFuZCBhbmFseXplZC4gT25lIGZvciBuZXcgYW5kIG9uZSBmb3IgY29uc3QufQoKJSBcUXtIb3cgdG8gc3BlY2lmeT99CgpcY29tbWVudGFyeXtBbGwgdGhlIHdvcmsgb2YgYSBjb25zdGFudCBjb25zdHJ1Y3RvciBtdXN0IGJlIGhhbmRsZWQgdmlhIGl0cyBpbml0aWFsaXplcnMufQoKSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgYSBjb25zdGFudCBjb25zdHJ1Y3RvciBpcyBkZWNsYXJlZCBieSBhIGNsYXNzIHRoYXQgaGFzIGEgbm9uLWZpbmFsIGluc3RhbmNlIHZhcmlhYmxlLiAgCgpcY29tbWVudGFyeXsKVGhlIGFib3ZlIHJlZmVycyB0byBib3RoIGxvY2FsbHkgZGVjbGFyZWQgYW5kIGluaGVyaXRlZCBpbnN0YW5jZSB2YXJpYWJsZXMuCn0KCkl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIGEgY29uc3RhbnQgY29uc3RydWN0b3IgaXMgZGVjbGFyZWQgYnkgYSBjbGFzcyAkQyQgaWYgYW55IGluc3RhbmNlIHZhcmlhYmxlIGRlY2xhcmVkIGluICRDJCBpcyBpbml0aWFsaXplZCB3aXRoIGFuIGV4cHJlc3Npb24gdGhhdCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uLgoKXGNvbW1lbnRhcnkgewpBIHN1cGVyY2xhc3Mgb2YgJEMkIGNhbm5vdCBkZWNsYXJlIHN1Y2ggYW4gaW5pdGlhbGl6ZXIgZWl0aGVyLCBiZWNhdXNlIGl0IG11c3QgbmVjZXNzYXJpbHkgZGVjbGFyZSBjb25zdGFudCBjb25zdHJ1Y3RvciBhcyB3ZWxsICh1bmxlc3MgaXQgaXMgXGNvZGV7T2JqZWN0fSwgd2hpY2ggZGVjbGFyZXMgbm8gaW5zdGFuY2UgdmFyaWFibGVzKS4KfQoKVGhlIHN1cGVyaW5pdGlhbGl6ZXIgdGhhdCBhcHBlYXJzLCBleHBsaWNpdGx5IG9yIGltcGxpY2l0bHksIGluIHRoZSBpbml0aWFsaXplciBsaXN0IG9mIGEgY29uc3RhbnQgY29uc3RydWN0b3IgbXVzdCBzcGVjaWZ5IGEgY29uc3RhbnQgY29uc3RydWN0b3Igb2YgdGhlIHN1cGVyY2xhc3Mgb2YgdGhlIGltbWVkaWF0ZWx5IGVuY2xvc2luZyBjbGFzcyBvciBhIGNvbXBpbGUtdGltZSBlcnJvciBvY2N1cnMuCgpBbnkgZXhwcmVzc2lvbiB0aGF0IGFwcGVhcnMgd2l0aGluIHRoZSBpbml0aWFsaXplciBsaXN0IG9mIGEgY29uc3RhbnQgY29uc3RydWN0b3IgbXVzdCBiZSBhIHBvdGVudGlhbGx5IGNvbnN0YW50IGV4cHJlc3Npb24sIG9yIGEgY29tcGlsZS10aW1lIGVycm9yIG9jY3Vycy4gCgpBIHtcZW0gcG90ZW50aWFsbHkgY29uc3RhbnQgZXhwcmVzc2lvbn0gaXMgYW4gZXhwcmVzc2lvbiAkZSQgdGhhdCB3b3VsZCBiZSBhIHZhbGlkIGNvbnN0YW50IGV4cHJlc3Npb24gaWYgYWxsIGZvcm1hbCBwYXJhbWV0ZXJzIG9mICRlJCdzIGltbWVkaWF0ZWx5IGVuY2xvc2luZyBjb25zdGFudCBjb25zdHJ1Y3RvciB3ZXJlIHRyZWF0ZWQgYXMgY29tcGlsZS10aW1lIGNvbnN0YW50cyB0aGF0IHdlcmUgZ3VhcmFudGVlZCB0byBldmFsdWF0ZSB0byBhbiBpbnRlZ2VyLCBib29sZWFuIG9yIHN0cmluZyB2YWx1ZSBhcyByZXF1aXJlZCBieSB0aGVpciBpbW1lZGlhdGVseSBlbmNsb3Npbmcgc3VwZXJleHByZXNzaW9uLgoKXGNvbW1lbnRhcnl7Ck5vdGUgdGhhdCBhIHBhcmFtZXRlciB0aGF0IGlzIG5vdCB1c2VkIGluIGEgc3VwZXJleHByZXNzaW9uIHRoYXQgaXMgcmVzdHJpY3RlZCB0byBjZXJ0YWluIHR5cGVzIGNhbiBiZSBhIGNvbnN0YW50IG9mIGFueSB0eXBlLiBGb3IgZXhhbXBsZX0KClxiZWdpbntkYXJ0Q29kZX0KXENMQVNTe30gQSBcewogIFxGSU5BTHt9IG07CiAgXENPTlNUe30gQSh0aGlzLm0pOwpcfQpcZW5ke2RhcnRDb2RlfQoKXGNvbW1lbnRhcnl7Y2FuIGJlIGluc3RhbnRpYXRlZCB2aWEgXGNke1xDT05TVHt9IEEoXENPTlNUIFtdKTt9fQoKCgpcY29tbWVudGFyeXsKVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIHBvdGVudGlhbGx5IGNvbnN0YW50IGV4cHJlc3Npb24gYW5kIGEgY29tcGlsZS10aW1lIGNvbnN0YW50IGV4cHJlc3Npb24gKFxyZWZ7Y29uc3R9KSBkZXNlcnZlcyBzb21lIGV4cGxhbmF0aW9uLiAKClRoZSBrZXkgaXNzdWUgaXMgd2hldGhlciBvbmUgdHJlYXRzIHRoZSBmb3JtYWwgcGFyYW1ldGVycyBvZiBhIGNvbnN0cnVjdG9yIGFzIGNvbXBpbGUtdGltZSBjb25zdGFudHMuIAoKSWYgYSBjb25zdGFudCBjb25zdHJ1Y3RvciBpcyBpbnZva2VkIGZyb20gYSBjb25zdGFudCBvYmplY3QgZXhwcmVzc2lvbiwgdGhlIGFjdHVhbCBhcmd1bWVudHMgd2lsbCBiZSByZXF1aXJlZCB0byBiZSBjb21waWxlLXRpbWUgY29uc3RhbnRzLiBUaGVyZWZvcmUsIGlmIHdlIHdlcmUgYXNzdXJlZCB0aGF0IGNvbnN0YW50IGNvbnN0cnVjdG9ycyB3ZXJlIGFsd2F5cyBpbnZva2VkIGZyb20gY29uc3RhbnQgb2JqZWN0IGV4cHJlc3Npb25zLCB3ZSBjb3VsZCBhc3N1bWUgdGhhdCB0aGUgZm9ybWFsIHBhcmFtZXRlcnMgb2YgYSBjb25zdHJ1Y3RvciB3ZXJlIGNvbXBpbGUtdGltZSBjb25zdGFudHMuCgpIb3dldmVyLCBjb25zdGFudCBjb25zdHJ1Y3RvcnMgY2FuIGFsc28gYmUgaW52b2tlZCBmcm9tIG9yZGluYXJ5IGluc3RhbmNlIGNyZWF0aW9uIGV4cHJlc3Npb25zIChccmVme25ld30pLCBhbmQgc28gdGhlIGFib3ZlIGFzc3VtcHRpb24gaXMgbm90IGdlbmVyYWxseSB2YWxpZC4KCk5ldmVydGhlbGVzcywgdGhlIHVzZSBvZiB0aGUgZm9ybWFsIHBhcmFtZXRlcnMgb2YgYSBjb25zdGFudCBjb25zdHJ1Y3RvciB3aXRoaW4gdGhlIGNvbnN0cnVjdG9yIGlzIG9mIGNvbnNpZGVyYWJsZSB1dGlsaXR5LiBUaGUgY29uY2VwdCBvZiBwb3RlbnRpYWxseSBjb25zdGFudCBleHByZXNzaW9ucyBpcyBpbnRyb2R1Y2VkIHRvIGZhY2lsaXRhdGUgbGltaXRlZCB1c2Ugb2Ygc3VjaCBmb3JtYWwgcGFyYW1ldGVycy4gU3BlY2lmaWNhbGx5LCB3ZSBhbGxvdyB0aGUgdXNhZ2Ugb2YgdGhlIGZvcm1hbCBwYXJhbWV0ZXJzIG9mIGEgY29uc3RhbnQgY29uc3RydWN0b3IgZm9yIGV4cHJlc3Npb25zIHRoYXQgaW52b2x2ZSBidWlsdC1pbiBvcGVyYXRvcnMsIGJ1dCBub3QgZm9yIGNvbnN0YW50IG9iamVjdHMsIGxpc3RzIGFuZCBtYXBzLiBUaGlzIGFsbG93cyBmb3IgY29uc3RydWN0b3JzIHN1Y2ggYXM6Cn0KClxiZWdpbntkYXJ0Q29kZX0KXENMQVNTe30gQyBcewogIFxGSU5BTHt9IHg7IFxGSU5BTHt9IHk7IFxGSU5BTHt9IHo7CiAgXENPTlNUe30gQyhwLCBxKTogeCA9IHEsIHkgPSBwICsgMTAwLCB6ID0gcCArIHE7CiAgJSB3aGF0IGFib3V0IAogJSAgXENPTlNUe30gQyhwLCBxKTogeCA9IHEsIHkgPSBwICsgMTAwLCB6ID0gcCArICdmb28nOwogJSBwZXJoYXBzIG1vb3QuIEN1cnJlbnQgc3BlYyBzYXlzIHRoYXQgd291bGQgYmUgb2s7IHR5cGUgY2hlY2tlciBjYW4gd29ycnksIGFzIGNhbiBleGVjdXRpb24sIHdoaWNoIGlzIGF0IGNvbXBpbGUgdGltZSBhbnl3YXkKXH0KXGVuZHtkYXJ0Q29kZX0KClxjb21tZW50YXJ5ewpUaGUgYXNzaWdubWVudCB0byBcY29kZXt4fSBpcyBhbGxvd2VkIHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgXGNvZGV7cX0gaXMgYSBjb21waWxlLXRpbWUgY29uc3RhbnQgKGV2ZW4gdGhvdWdoIFxjb2Rle3F9IGlzIG5vdCwgaW4gZ2VuZXJhbCBhIGNvbXBpbGUtdGltZSBjb25zdGFudCkuICBUaGUgYXNzaWdubWVudCB0byBcY29kZXt5fSBpcyBzaW1pbGFyLCBidXQgcmFpc2VzIGFkZGl0aW9uYWwgcXVlc3Rpb25zLiBJbiB0aGlzIGNhc2UsIHRoZSBzdXBlcmV4cHJlc3Npb24gb2YgXGNvZGV7cH0gaXMgXGNvZGV7cCArIDEwMH0sIGFuZCBpdCByZXF1aXJlcyB0aGF0IFxjb2Rle3B9IGJlIGEgbnVtZXJpYyBjb21waWxlLXRpbWUgY29uc3RhbnQgZm9yIHRoZSBlbnRpcmUgZXhwcmVzc2lvbiB0byBiZSBjb25zaWRlcmVkIGNvbnN0YW50LiAgVGhlIHdvcmRpbmcgb2YgdGhlIHNwZWNpZmljYXRpb24gYWxsb3dzIHVzIHRvIGFzc3VtZSB0aGF0IFxjb2Rle3B9IGV2YWx1YXRlcyB0byBhbiBpbnRlZ2VyLiBBIHNpbWlsYXIgYXJndW1lbnQgaG9sZHMgZm9yIFxjb2Rle3B9IGFuZCBcY29kZXtxfSBpbiB0aGUgYXNzaWdubWVudCB0byBcY29kZXt6fS4KCkhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgY29uc3RydWN0b3JzIGFyZSBkaXNhbGxvd2VkOgp9CgpcYmVnaW57ZGFydENvZGV9ClxDTEFTU3t9IEQgXHsKICBcRklOQUx7fSB3OwogIFxDT05TVHt9IEQubWFrZUxpc3QocCk6IHcgPSBcQ09OU1R7fSBbcF07ICAvLyBjb21waWxlLXRpbWUgZXJyb3IKICBcQ09OU1R7fSBELm1ha2VNYXAocCk6IHcgPSBcQ09OU1R7fSBce2BgaGVscCcnOiBxXH07IC8vIGNvbXBpbGUtdGltZSBlcnJvcgogIFxDT05TVHt9IEQubWFrZUMocCk6IHcgPSBcQ09OU1R7fSBDKHAsIDEyKTsgLy8gY29tcGlsZS10aW1lIGVycm9yClx9ClxlbmR7ZGFydENvZGV9CgpcY29tbWVudGFyeXsKVGhlIHByb2JsZW0gaXMgbm90IHRoYXQgdGhlIGFzc2lnbm1lbnRzIHRvIFxjb2Rle3d9IGFyZSBub3QgcG90ZW50aWFsbHkgY29uc3RhbnQ7IHRoZXkgYXJlLiAgSG93ZXZlciwgYWxsIHRoZXNlIHJ1biBhZm91bCBvZiB0aGUgcnVsZXMgZm9yIGNvbnN0YW50IGxpc3RzIChccmVme2xpc3RzfSksIG1hcHMgKFxyZWZ7bWFwc30pIGFuZCBvYmplY3RzIChccmVme2NvbnN0fSksIGFsbCBvZiB3aGljaCBpbmRlcGVuZGVudGx5IHJlcXVpcmUgdGhlaXIgc3ViZXhwcmVzc2lvbnMgdG8gYmUgY29uc3RhbnQgZXhwcmVzc2lvbnMuCn0KClxyYXRpb25hbGV7CkFsbCBvZiB0aGUgaWxsZWdhbCBjb25zdHJ1Y3RvcnMgb2YgXGNvZGV7RH0gYWJvdmUgY291bGQgbm90IGJlIHNlbnNpYmx5IGludm9rZWQgdmlhIFxORVd7fSwgYmVjYXVzZSBhbiBleHByZXNzaW9uIHRoYXQgbXVzdCBiZSBjb25zdGFudCBjYW5ub3QgZGVwZW5kIG9uIGEgZm9ybWFsIHBhcmFtZXRlciwgd2hpY2ggbWF5IG9yIG1heSBub3QgYmUgY29uc3RhbnQuIEluIGNvbnRyYXN0LCB0aGUgbGVnYWwgZXhhbXBsZXMgbWFrZSBzZW5zZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGNvbnN0cnVjdG9yIGlzIGludm9rZWQgdmlhIFxDT05TVHt9IG9yIHZpYSBcTkVXe30uCgpDYXJlZnVsIHJlYWRlcnMgd2lsbCBvZiBjb3Vyc2Ugd29ycnkgYWJvdXQgY2FzZXMgd2hlcmUgdGhlIGFjdHVhbCBhcmd1bWVudHMgdG8gXGNvZGV7QygpfSBhcmUgY29uc3RhbnRzLCBidXQgYXJlIG5vdCBudW1lcmljLiBUaGlzIGlzIHByZWNsdWRlZCBieSB0aGUgZm9sbG93aW5nIHJ1bGUsIGNvbWJpbmVkIHdpdGggdGhlIHJ1bGVzIGZvciBldmFsdWF0aW5nIGNvbnN0YW50IG9iamVjdHMgKFxyZWZ7Y29uc3R9KS4KfQoKV2hlbiBpbnZva2VkIGZyb20gYSBjb25zdGFudCBvYmplY3QgZXhwcmVzc2lvbiwgYSBjb25zdGFudCBjb25zdHJ1Y3RvciBtdXN0IHRocm93IGFuIGV4Y2VwdGlvbiBpZiBhbnkgb2YgaXRzIGFjdHVhbCBwYXJhbWV0ZXJzIGlzIGEgdmFsdWUgdGhhdCB3b3VsZCBwcmV2ZW50IG9uZSBvZiB0aGUgcG90ZW50aWFsbHkgY29uc3RhbnQgZXhwcmVzc2lvbnMgd2l0aGluIGl0IGZyb20gYmVpbmcgYSB2YWxpZCBjb21waWxlLXRpbWUgY29uc3RhbnQuCgolRGlzY3VzcyBFeHRlcm5hbCBDb25zdHJ1Y3RvcnMgaW4gbmUgc3Vic3Vic2VjdGlvbiBoZXJlCgpcc3Vic2VjdGlvbntTdGF0aWMgTWV0aG9kc30KXGxhYmVse3N0YXRpY01ldGhvZHN9Cgp7XGVtIFN0YXRpYyBtZXRob2RzfSBhcmUgZnVuY3Rpb25zLCBvdGhlciB0aGFuIGdldHRlcnMgb3Igc2V0dGVycywgd2hvc2UgZGVjbGFyYXRpb25zIGFyZSBpbW1lZGlhdGVseSBjb250YWluZWQgd2l0aGluIGEgY2xhc3MgZGVjbGFyYXRpb24gYW5kIHRoYXQgYXJlIGRlY2xhcmVkIFxTVEFUSUN7fS4gVGhlIHN0YXRpYyBtZXRob2RzIG9mIGEgY2xhc3MgJEMkIGFyZSB0aG9zZSBzdGF0aWMgbWV0aG9kcyBkZWNsYXJlZCBieSAkQyQuCgpccmF0aW9uYWxlewpJbmhlcml0YW5jZSBvZiBzdGF0aWMgbWV0aG9kcyBoYXMgbGl0dGxlIHV0aWxpdHkgaW4gRGFydC4gU3RhdGljIG1ldGhvZHMgY2Fubm90IGJlIG92ZXJyaWRkZW4uIEFueSByZXF1aXJlZCBzdGF0aWMgZnVuY3Rpb24gY2FuIGJlIG9idGFpbmVkIGZyb20gaXRzIGRlY2xhcmluZyBsaWJyYXJ5LCBhbmQgdGhlcmUgaXMgbm8gbmVlZCB0byBicmluZyBpdCBpbnRvIHNjb3BlIHZpYSBpbmhlcml0YW5jZS4gRXhwZXJpZW5jZSBzaG93cyB0aGF0IGRldmVsb3BlcnMgYXJlIGNvbmZ1c2VkIGJ5IHRoZSBpZGVhIG9mIGluaGVyaXRlZCBtZXRob2RzIHRoYXQgYXJlIG5vdCBpbnN0YW5jZSBtZXRob2RzLgoKT2YgY291cnNlLCB0aGUgZW50aXJlIG5vdGlvbiBvZiBzdGF0aWMgbWV0aG9kcyBpcyBkZWJhdGFibGUsIGJ1dCBpdCBpcyByZXRhaW5lZCBoZXJlIGJlY2F1c2Ugc28gbWFueSBwcm9ncmFtbWVycyBhcmUgZmFtaWxpYXIgd2l0aCBpdC4gRGFydCBzdGF0aWMgbWV0aG9kcyBtYXkgYmUgc2VlbiBhcyBmdW5jdGlvbnMgb2YgdGhlIGVuY2xvc2luZyBsaWJyYXJ5LiAKfQoKSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiBhIGNsYXNzICRDJCBkZWNsYXJlcyBhIHN0YXRpYyBtZXRob2QgbmFtZWQgJG4kIGFuZCBoYXMgYSBzZXR0ZXIgbmFtZWQgJG49JC4gCiVJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmIGEgY2xhc3MgaGFzIGEgc3RhdGljIG1ldGhvZCB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgYSBzdGF0aWMgbWVtYmVyIG9mIG9uZSBvZiBpdHMgc3VwZXJjbGFzc2VzLgoKJVxyYXRpb25hbGV7CiVUaGlzIGxhc3QgcmVzdHJpY3Rpb24gbWFrZXMgY2xhc3NlcyBtb3JlIGJyaXR0bGUgd2l0aCByZXNwZWN0IHRvIGNoYW5nZXMgaW4gdGhlIGNsYXNzIGhpZXJhcmNoeS4gSXQgc3RlbXMgZnJvbSBhIGdlbmVyYWwgb2JzZXJ2YXRpb24gdGhhdCBzaGFkb3dpbmcgb2YgbmFtZXMgaW4gdGhlIHNhbWUgc2NvcGUgaXMgcXVlc3Rpb25hYmxlIGFuZCBzaG91bGQgZWxpY2l0IGEgd2FybmluZy4gCiV9CiVcY29tbWVudGFyeXsKJVRoZXJlIGlzIG5vIGhpZGluZyBvZiBzdGF0aWMgbWV0aG9kcywgb3Igb2Ygc3RhdGljIHZhcmlhYmxlcy4KJX0KCgpcc3Vic2VjdGlvbntTdGF0aWMgVmFyaWFibGVzfQpcbGFiZWx7c3RhdGljVmFyaWFibGVzfQoKe1xlbSBTdGF0aWMgdmFyaWFibGVzfSBhcmUgdmFyaWFibGVzIHdob3NlIGRlY2xhcmF0aW9ucyBhcmUgaW1tZWRpYXRlbHkgY29udGFpbmVkIHdpdGhpbiBhIGNsYXNzIGRlY2xhcmF0aW9uIGFuZCB0aGF0IGFyZSBkZWNsYXJlZCBcU1RBVElDe30uIFRoZSBzdGF0aWMgdmFyaWFibGVzIG9mIGEgY2xhc3MgJEMkIGFyZSB0aG9zZSBzdGF0aWMgdmFyaWFibGVzIGRlY2xhcmVkIGJ5ICRDJC4KCiVBIHN0YXRpYyB2YXJpYWJsZSBkZWNsYXJhdGlvbiAgb2Ygb25lIG9mIHRoZSBmb3JtcyBcY29kZXtcU1RBVElDe30gJFQkICR2JDt9LCAgXGNvZGV7XFNUQVRJQ3t9ICRUJCAkdiQgPSAkZSQ7fSAsICBcY29kZXtcU1RBVElDe30gXENPTlNUe30gJFQkICR2JCA9ICRlJDt9ICBvciBcY29kZXtcU1RBVElDe30gXEZJTkFMe30gJFQkICR2JCA9ICRlJDt9IGFsd2F5cyBpbmR1Y2VzIGFuIGltcGxpY2l0IHN0YXRpYyBnZXR0ZXIgZnVuY3Rpb24gKFxyZWZ7Z2V0dGVyc30pIHdpdGggc2lnbmF0dXJlIAoKJVxTVEFUSUN7fSAkVCQgXEdFVHt9ICR2JAoKJXdob3NlIGludm9jYXRpb24gZXZhbHVhdGVzIGFzIGRlc2NyaWJlZCBiZWxvdyAoXHJlZntldmFsdWF0aW9uT2ZTdGF0aWNWYXJpYWJsZUdldHRlcnN9KS4ldG8gdGhlIHZhbHVlIHN0b3JlZCBpbiAkdiQuCgoKJUEgc3RhdGljIHZhcmlhYmxlIGRlY2xhcmF0aW9uICBvZiBvbmUgb2YgdGhlIGZvcm1zIFxjb2Rle1xTVEFUSUN7fSBcVkFSe30gJHYkO30sICBcY29kZXtcU1RBVElDe30gXFZBUnt9ICR2JCA9ICRlJDt9ICwgIFxjb2Rle1xTVEFUSUN7fSBcQ09OU1R7fSAkdiQgPSAkZSQ7fSBvciBcY29kZXtcU1RBVElDe30gXEZJTkFMe30gICR2JCA9ICRlJDt9ICBhbHdheXMgaW5kdWNlcyBhbiBpbXBsaWNpdCBzdGF0aWMgZ2V0dGVyIGZ1bmN0aW9uIHdpdGggc2lnbmF0dXJlIAoKJVxTVEFUSUN7fSBcR0VUe30gJHYkCgold2hvc2UgIGludm9jYXRpb24gZXZhbHVhdGVzIGFzIGRlc2NyaWJlZCBiZWxvdyAoXHJlZntldmFsdWF0aW9uT2ZTdGF0aWNWYXJpYWJsZUdldHRlcnN9KS4ldG8gdGhlIHZhbHVlIHN0b3JlZCBpbiAkdiQuCgolQSBub24tZmluYWwgc3RhdGljIHZhcmlhYmxlIGRlY2xhcmF0aW9uICBvZiB0aGUgZm9ybSBcY29kZXtcU1RBVElDe30gJFQkICR2JDt9IG9yIHRoZSBmb3JtICBcY29kZXtcU1RBVElDe30gJFQkICR2JCA9ICRlJDt9ICAgYWx3YXlzIGluZHVjZXMgYW4gaW1wbGljaXQgc3RhdGljIHNldHRlciBmdW5jdGlvbiAoXHJlZntzZXR0ZXJzfSkgd2l0aCBzaWduYXR1cmUgCgolXFNUQVRJQ3t9IFxWT0lEe30gXFNFVHt9ICR2PShUJCAkeCkkCgold2hvc2UgZXhlY3V0aW9uIHNldHMgdGhlIHZhbHVlIG9mICR2JCB0byB0aGUgaW5jb21pbmcgYXJndW1lbnQgJHgkLgoKJUEgc3RhdGljIHZhcmlhYmxlIGRlY2xhcmF0aW9uICBvZiB0aGUgZm9ybSBcY29kZXtcU1RBVElDe30gXFZBUnt9ICR2JDt9IG9yIHRoZSBmb3JtICBcY29kZXtcU1RBVElDe30gXFZBUnt9ICR2JCA9ICRlJDt9ICAgYWx3YXlzIGluZHVjZXMgYW4gaW1wbGljaXQgc3RhdGljIHNldHRlciBmdW5jdGlvbiB3aXRoIHNpZ25hdHVyZSAKCiVcU1RBVElDe30gXFNFVHt9ICR2PSh4KSQKCiV3aG9zZSBleGVjdXRpb24gc2V0cyB0aGUgdmFsdWUgb2YgJHYkIHRvIHRoZSBpbmNvbWluZyBhcmd1bWVudCAkeCQuCgolRXh0cmVybmFsIHN0YXRpYyBmdW5jdGlvbnMsIGdldHRlcnMsIHNldHRlcnMKCiVcc3Vic3Vic2VjdGlvbntFdmFsdWF0aW9uIG9mIEltcGxpY2l0IFN0YXRpYyBWYXJpYWJsZSBHZXR0ZXJzfQolXGxhYmVse2V2YWx1YXRpb25PZlN0YXRpY1ZhcmlhYmxlR2V0dGVyc30KCiVMZXQgJGQkIGJlIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHN0YXRpYyB2YXJpYWJsZSAkdiQuIFRoZSBpbXBsaWNpdCBnZXR0ZXIgbWV0aG9kIG9mICR2JCBleGVjdXRlcyBhcyBmb2xsb3dzOiAKJVxiZWdpbntpdGVtaXplfQolXGl0ZW0gSWYgJGQkIGlzIG9mIG9uZSBvZiB0aGUgZm9ybXMgXGNvZGV7XFNUQVRJQ3t9IFxWQVJ7fSAkdiQgPSAkZSQ7fSAsIFxjb2Rle1xTVEFUSUN7fSAkVCQgJHYkID0gJGUkOyB9LCBcY29kZXtcU1RBVElDe30gXEZJTkFMe30gJHYkID0gJGUkOyB9IG9yIFxjb2Rle1xTVEFUSUN7fSBcRklOQUx7fSAkVCQgJHYkID0gJGUkO30gYW5kIG5vIHZhbHVlIGhhcyB5ZXQgYmVlbiBzdG9yZWQgaW50byAkdiQgdGhlbiB0aGUgaW5pdGlhbGl6ZXIgZXhwcmVzc2lvbiAkZSQgaXMgZXZhbHVhdGVkLiBJZiwgZHVyaW5nIHRoZSBldmFsdWF0aW9uIG9mICRlJCwgdGhlIGdldHRlciBmb3IgJHYkIGlzIHJlZmVyZW5jZWQsIGEgXGNvZGV7Q3ljbGljSW5pdGlhbGl6YXRpb25FcnJvcn0gaXMgdGhyb3duLiBJZiB0aGUgZXZhbHVhdGlvbiBzdWNjZWVkZWQgeWllbGRpbmcgYW4gb2JqZWN0ICRvJCwgbGV0ICRyID0gbyQsIG90aGVyd2lzZSBsZXQgJHIgPSBcTlVMTHt9JC4gSW4gYW55IGNhc2UsICRyJCBpcyBzdG9yZWQgaW50byAkdiQuIFRoZSByZXN1bHQgb2YgZXhlY3V0aW5nIHRoZSBnZXR0ZXIgaXMgJHIkLiAKJVxpdGVtICBJZiAkZCQgaXMgb2Ygb25lIG9mIHRoZSBmb3JtcyBcY29kZXtcU1RBVElDe30gXENPTlNUe30gJHYkID0gJGUkOyB9IG9yIFxjb2Rle1xTVEFUSUN7fSBcQ09OU1R7fSAkVCQgJHYkID0gJGUkO30gdGhlIHJlc3VsdCBvZiB0aGUgZ2V0dGVyIGlzIHRoZSB2YWx1ZSBvZiB0aGUgY29tcGlsZSB0aW1lIGNvbnN0YW50ICRlJC4KJU90aGVyd2lzZQolXGl0ZW0gVGhlIHJlc3VsdCBvZiBleGVjdXRpbmcgdGhlIGdldHRlciBtZXRob2QgaXMgdGhlIHZhbHVlIHN0b3JlZCBpbiAkdiQuICAKJVxlbmR7aXRlbWl6ZX0KCgoKXHN1YnNlY3Rpb257U3VwZXJjbGFzc2VzfQpcbGFiZWx7c3VwZXJjbGFzc2VzfQoKVGhlIHN1cGVyY2xhc3Mgb2YgYSBjbGFzcyAkQyQgdGhhdCBoYXMgYSB3aXRoIGNsYXVzZSBcY29kZXtcV0lUSHt9ICRNXzEsIFxsZG90cywgTV9rJH0gYW5kIGFuIGV4dGVuZHMgY2xhdXNlIFxjb2Rle1xFWFRFTkRTe30gU30gaXMgdGhlIGFwcGxpY2F0aW9uIG9mIG1peGluIChccmVme21peGluc30pICRNX2sqIFxjZG90cyAqIE1fMSQgIHRvIFMuICBJZiBubyBcV0lUSHt9IGNsYXVzZSBpcyBzcGVjaWZpZWQgdGhlbiAgdGhlIFxFWFRFTkRTe30gY2xhdXNlIG9mIGEgY2xhc3MgJEMkIHNwZWNpZmllcyBpdHMgc3VwZXJjbGFzcy4gSWYgbm8gXEVYVEVORFN7fSBjbGF1c2UgaXMgc3BlY2lmaWVkLCB0aGVuIGVpdGhlcjoKXGJlZ2lue2l0ZW1pemV9ClxpdGVtICRDJCBpcyBcY29kZXtPYmplY3R9LCB3aGljaCBoYXMgbm8gc3VwZXJjbGFzcy4gT1IKXGl0ZW0gQ2xhc3MgJEMkIGlzICBkZWVtZWQgdG8gaGF2ZSBhbiBcRVhURU5EU3t9IGNsYXVzZSBvZiB0aGUgZm9ybSBcY29kZXtcRVhURU5EU3t9IE9iamVjdH0sIGFuZCB0aGUgcnVsZXMgYWJvdmUgYXBwbHkuIApcZW5ke2l0ZW1pemV9CgpJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciB0byBzcGVjaWZ5IGFuIFxFWFRFTkRTe30gY2xhdXNlIGZvciBjbGFzcyBcY29kZXtPYmplY3R9LgoKXGJlZ2lue2dyYW1tYXJ9CntcYmYgc3VwZXJjbGFzczp9CiAgICAgIFxFWFRFTkRTe30gdHlwZQogICAgLgpcZW5ke2dyYW1tYXJ9CgolVGhlIHN1cGVyY2xhc3MgY2xhdXNlIG9mIGEgY2xhc3MgQyBpcyBwcm9jZXNzZWQgd2l0aGluIHRoZSBlbmNsb3Npbmcgc2NvcGUgb2YgdGhlIHN0YXRpYyBzY29wZSBvZiBDLgolXGNvbW1lbnRhcnl7CiVUaGlzIG1lYW5zIHRoYXQgaW4gYSBnZW5lcmljIGNsYXNzLCB0aGUgdHlwZSBwYXJhbWV0ZXJzIG9mIHRoZSBnZW5lcmljIGFyZSBhdmFpbGFibGUgaW4gdGhlIHN1cGVyY2xhc3MgY2xhdXNlLgolfSAKCiVJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiAgdGhlIFxFWFRFTkRTe30gY2xhdXNlIG9mIGEgY2xhc3MgJEMkIGluY2x1ZGVzIGEgdHlwZSBleHByZXNzaW9uIHRoYXQgZG9lcyBub3QgZGVub3RlIGEgY2xhc3MgYXZhaWxhYmxlIGluIHRoZSBsZXhpY2FsIHNjb3BlIG9mICRDJC4gCkl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmICB0aGUgXEVYVEVORFN7fSBjbGF1c2Ugb2YgYSBjbGFzcyAkQyQgc3BlY2lmaWVzIGEgbWFsZm9ybWVkICB0eXBlIG9yIGEgZGVmZXJyZWQgdHlwZSAoXHJlZntzdGF0aWNUeXBlc30pIGFzIGEgc3VwZXJjbGFzcy4KJSB0b28gc3RyaWN0PyBEbyB3ZSBlIHdhbnQgZXh0ZW5kcyBMaXN0PFVuZGVjbGFyZWQ+IHRvIHdvcmsgYXMgTGlzdDxkeW5hbWljPj8gCgpcY29tbWVudGFyeXsgVGhlIHR5cGUgcGFyYW1ldGVycyBvZiBhIGdlbmVyaWMgY2xhc3MgYXJlIGF2YWlsYWJsZSBpbiB0aGUgbGV4aWNhbCBzY29wZSBvZiB0aGUgc3VwZXJjbGFzcyBjbGF1c2UsIHBvdGVudGlhbGx5IHNoYWRvd2luZyBjbGFzc2VzIGluIHRoZSBzdXJyb3VuZGluZyBzY29wZS4gVGhlIGZvbGxvd2luZyBjb2RlIGlzIHRoZXJlZm9yZSBpbGxlZ2FsIGFuZCBzaG91bGQgY2F1c2UgYSBjb21waWxlLXRpbWUgZXJyb3I6Cn0KClxiZWdpbntkYXJ0Q29kZX0KY2xhc3MgVCBce1x9CgovKiBDb21waWxhdGlvbiBlcnJvcjogQXR0ZW1wdCB0byBzdWJjbGFzcyBhIHR5cGUgcGFyYW1ldGVyICovCmNsYXNzIEckPCRUJD4kIGV4dGVuZHMgVCBce1x9IAoKXGVuZHtkYXJ0Q29kZX0KCgpBIGNsYXNzICRTJCBpcyB7XGVtIGEgc3VwZXJjbGFzc30gb2YgYSBjbGFzcyAkQyQgaWZmIGVpdGhlcjoKXGJlZ2lue2l0ZW1pemV9ClxpdGVtICRTJCBpcyB0aGUgc3VwZXJjbGFzcyBvZiAkQyQsIG9yIApcaXRlbSAkUyQgaXMgYSBzdXBlcmNsYXNzIG9mIGEgY2xhc3MgJFNee1xwcmltZX0kIGFuZCAkU157XHByaW1lfSQgaXMgYSBzdXBlcmNsYXNzIG9mICRDJC4gClxlbmR7aXRlbWl6ZX0KCkl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIGEgY2xhc3MgJEMkIGlzIGEgc3VwZXJjbGFzcyBvZiBpdHNlbGYuCgoKICAgIAogCiBcc3Vic3Vic2VjdGlvbntJbmhlcml0YW5jZSBhbmQgT3ZlcnJpZGluZ30KIFxsYWJlbHtpbmhlcml0YW5jZUFuZE92ZXJyaWRpbmd9CgoKJUEgY2xhc3MgJEMkICB7XGVtIGluaGVyaXRzfSBhbnkgYWNjZXNzaWJsZSBpbnN0YW5jZSBtZW1iZXJzIG9mIGl0cyBzdXBlcmNsYXNzIHRoYXQgYXJlIG5vdCBvdmVycmlkZGVuIGJ5IG1lbWJlcnMgZGVjbGFyZWQgaW4gJEMkLiAKCkxldCAkQyQgYmUgYSBjbGFzcywgIGxldCAkQSQgYmUgYSBzdXBlcmNsYXNzIG9mICRDJCwgYW5kIGxldCAgJFNfMSBcbGRvdHMgU19rJCBiZSBzdXBlcmNsYXNzZXMgb2YgJEMkIHRoYXQgYXJlIGFsc28gc3ViY2xhc3NlcyBvZiAkQSQuICRDJCB7XGVtIGluaGVyaXRzfSBhbGwgYWNjZXNzaWJsZSBpbnN0YW5jZSAgbWVtYmVycyBvZiAgJEEkIHRoYXQgaGF2ZSBub3QgYmVlbiBvdmVycmlkZGVuIGJ5IGEgZGVjbGFyYXRpb24gaW4gJEMkIG9yIGluIGF0IGxlYXN0IG9uZSBvZiAkU18xIFxsZG90cyBTX2skLgoKXHJhdGlvbmFsZSB7Ckl0IHdvdWxkIGJlICBtb3JlIGF0dHJhY3RpdmUgdG8gZ2l2ZSBhIHB1cmVseSBsb2NhbCBkZWZpbml0aW9uIG9mIGluaGVyaXRhbmNlLCB0aGF0IGRlcGVuZGVkIG9ubHkgb24gdGhlIG1lbWJlcnMgb2YgdGhlIGRpcmVjdCBzdXBlcmNsYXNzICRTJC4gSG93ZXZlciwgYSBjbGFzcyAkQyQgY2FuIGluaGVyaXQgYSBtZW1iZXIgJG0kIHRoYXQgIGlzIG5vdCBhIG1lbWJlciBvZiBpdHMgc3VwZXJjbGFzcyAgJFMkLiBUaGlzIGNhbiBvY2N1ciB3aGVuIHRoZSBtZW1iZXIgJG0kIGlzIHByaXZhdGUKdG8gdGhlIGxpYnJhcnkgJExfMSQgb2YgJEMkLCB3aGVyZWFzICRTJCBjb21lcyBmcm9tIGEgZGlmZmVyZW50IGxpYnJhcnkgJExfMiQsIGJ1dCAKdGhlIHN1cGVyY2xhc3MgY2hhaW4gb2YgJFMkIGluY2x1ZGVzIGEgY2xhc3MgZGVjbGFyZWQgaW4gJExfMSQuCn0KCkEgY2xhc3MgbWF5IG92ZXJyaWRlIGluc3RhbmNlIG1lbWJlcnMgdGhhdCB3b3VsZCBvdGhlcndpc2UgaGF2ZSBiZWVuIGluaGVyaXRlZCBmcm9tIGl0cyBzdXBlcmNsYXNzLiAKCkxldCAkQyA9IFNfMCQgYmUgYSBjbGFzcyBkZWNsYXJlZCBpbiBsaWJyYXJ5ICRMJCwgYW5kIGxldCAkXHtTXzEgXGxkb3RzIFNfa1x9JCBiZSB0aGUgc2V0IG9mIGFsbCBzdXBlcmNsYXNzZXMgb2YgJEMkLCB3aGVyZSAkU19pJCBpcyB0aGUgc3VwZXJjbGFzcyBvZiAkU197aS0xfSQgZm9yICRpIFxpbiAxIC4uIGskLiBMZXQgJEMkIGRlY2xhcmUgYSBtZW1iZXIgJG0kLCBhbmQgbGV0ICAkbV5ccHJpbWUkIGJlIGEgbWVtYmVyIG9mICRTX2osIGogIFxpbiAxIC4uIGskLCAgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSBhcyAkbSQsIHN1Y2ggdGhhdCAkbV5ccHJpbWUkIGlzIGFjY2Vzc2libGUgdG8gJEwkLiAgVGhlbiAkbSQgb3ZlcnJpZGVzICRtXlxwcmltZSQgaWYgJG1eXHByaW1lJCBpcyBub3QgYWxyZWFkeSBvdmVycmlkZGVuIGJ5IGEgbWVtYmVyIG9mIGF0IGxlYXN0IG9uZSBvZiAkU18xIFxsZG90cyBTX3tqLTF9JCBhbmQgbmVpdGhlciAkbSQgbm9yICRtXlxwcmltZSQgYXJlIGZpZWxkcy4KCiVMZXQgJEMkIGJlIGEgY2xhc3MgZGVjbGFyZWQgaW4gbGlicmFyeSAkTCQsIHdpdGggc3VwZXJjbGFzcyAkUyQgYW5kIGxldCAkQyQgZGVjbGFyZSBhbiBpbnN0YW5jZSBtZW1iZXIgJG0kLCBhbmQgIGFzc3VtZSAkUyQgZGVjbGFyZXMgYW4gaW5zdGFuY2UgbWVtYmVyICRtXlxwcmltZSQgd2l0aCB0aGUgc2FtZSBuYW1lIGFzICRtJC4gVGhlbiAkbSQge1xlbSBvdmVycmlkZXN9ICRtXlxwcmltZSQgaWZmICRtXlxwcmltZSQgaXMgYWNjZXNzaWJsZSAoXHJlZntwcml2YWN5fSkgdG8gJEwkLCAkbSQgaGFzIHRoZSBzYW1lIG5hbWUgYXMgICRtXlxwcmltZSQgIGFuZCBuZWl0aGVyICRtJCBub3IgJG1eXHByaW1lJCBhcmUgZmllbGRzLgoKXGNvbW1lbnRhcnl7RmllbGRzIG5ldmVyIG92ZXJyaWRlIGVhY2ggb3RoZXIuIFRoZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzIGluZHVjZWQgYnkgZmllbGRzIGRvLn0KClxyYXRpb25hbGV7QWdhaW4sIGEgbG9jYWwgZGVmaW5pdGlvbiBvZiBvdmVycmlkaW5nIHdvdWxkIGJlIHByZWZlcmFibGUsIGJ1dCBmYWlscyB0byBhY2NvdW50IGZvciBsaWJyYXJ5IHByaXZhY3kuCn0KCldoZXRoZXIgYW4gb3ZlcnJpZGUgaXMgbGVnYWwgb3Igbm90IGlzIGRlc2NyaWJlZCBlbHNld2hlcmUgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIChzZWUgXHJlZntpbnN0YW5jZU1ldGhvZHN9LCBccmVme2dldHRlcnN9IGFuZCBccmVme3NldHRlcnN9KS4gCgpcY29tbWVudGFyeXtGb3IgZXhhbXBsZSBnZXR0ZXJzIG1heSBub3QgbGVnYWxseSBvdmVycmlkZSBtZXRob2RzIGFuZCB2aWNlIHZlcnNhLiBTZXR0ZXJzIG5ldmVyIG92ZXJyaWRlIG1ldGhvZHMgb3IgZ2V0dGVycywgYW5kIHZpY2UgdmVyc2EsIGJlY2F1c2UgdGhlaXIgbmFtZXMgYWx3YXlzIGRpZmZlci4KfSAgCgpccmF0aW9uYWxlewpJdCBpcyBuZXZlcnRoZWxlc3MgY29udmVuaWVudCB0byBkZWZpbmUgdGhlIG92ZXJyaWRlIHJlbGF0aW9uIGJldHdlZW4gbWVtYmVycyBpbiB0aGlzIHdheSwgc28gdGhhdCB3ZSBjYW4gY29uY2lzZWx5IGRlc2NyaWJlIHRoZSBpbGxlZ2FsIGNhc2VzLgp9CgpcY29tbWVudGFyeXsKTm90ZSB0aGF0IGluc3RhbmNlIHZhcmlhYmxlcyBkbyBub3QgcGFydGljaXBhdGUgaW4gdGhlIG92ZXJyaWRlIHJlbGF0aW9uLCBidXQgdGhlIGdldHRlcnMgYW5kIHNldHRlcnMgdGhleSBpbmR1Y2UgZG8uIEFsc28sIGdldHRlcnMgZG9uYHQgb3ZlcnJpZGUgc2V0dGVycyBhbmQgdmljZSB2ZXJzYS4gIEZpbmFsbHksIHN0YXRpYyBtZW1iZXJzIG5ldmVyIG92ZXJyaWRlIGFueXRoaW5nLgp9CgpJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmIGEgbm9uLWFic3RyYWN0IGNsYXNzIGluaGVyaXRzIGFuIGFic3RyYWN0IG1ldGhvZC4KClxjb21tZW50YXJ5IHsKRm9yIGNvbnZlbmllbmNlLCBoZXJlIGlzIGEgc3VtbWFyeSBvZiB0aGUgcmVsZXZhbnQgcnVsZXMuIFJlbWVtYmVyIHRoYXQgdGhpcyBpcyBub3Qgbm9ybWF0aXZlLiBUaGUgY29udHJvbGxpbmcgbGFuZ3VhZ2UgaXMgaW4gdGhlIHJlbGV2YW50IHNlY3Rpb25zIG9mIHRoZSBzcGVjaWZpY2F0aW9uLgoKXGJlZ2lue2VudW1lcmF0ZX0KClxpdGVtIFRoZXJlIGlzIG9ubHkgb25lIG5hbWVzcGFjZSBmb3IgZ2V0dGVycywgc2V0dGVycywgbWV0aG9kcyBhbmQgY29uc3RydWN0b3JzIChccmVme3Njb3Bpbmd9KS4gQSBmaWVsZCAkZiQgaW50cm9kdWNlcyBhIGdldHRlciAkZiQgYW5kIGEgbm9uLWZpbmFsIGZpZWxkICRmJCBhbHNvIGludHJvZHVjZXMgYSBzZXR0ZXIgJGY9JCAoXHJlZntpbnN0YW5jZVZhcmlhYmxlc30sIFxyZWZ7c3RhdGljVmFyaWFibGVzfSkuIFdoZW4gd2Ugc3BlYWsgb2YgbWVtYmVycyBoZXJlLCB3ZSBtZWFuIGFjY2Vzc2libGUgZmllbGRzLCBnZXR0ZXJzLCBzZXR0ZXJzIGFuZCBtZXRob2RzIChccmVme2NsYXNzZXN9KS4KXGl0ZW0gWW91IGNhbm5vdCBoYXZlIHR3byAgbWVtYmVycyB3aXRoIHRoZSBzYW1lIG5hbWUgaW4gdGhlIHNhbWUgY2xhc3MgLSBiZSB0aGV5IGRlY2xhcmVkIG9yIGluaGVyaXRlZCAoXHJlZntzY29waW5nfSwgXHJlZntjbGFzc2VzfSkuClxpdGVtIFN0YXRpYyBtZW1iZXJzIGFyZSBuZXZlciBpbmhlcml0ZWQuClxpdGVtIEl0IGlzIGEgd2FybmluZyBpZiB5b3UgaGF2ZSBhbiAgc3RhdGljIG1lbWJlciBuYW1lZCAkbSQgaW4geW91ciBjbGFzcyBvciBhbnkgc3VwZXJjbGFzcyAoZXZlbiB0aG91Z2ggaXQgaXMgbm90IGluaGVyaXRlZCkgYW5kIGFuICBpbnN0YW5jZSBtZW1iZXIgb2YgdGhlIHNhbWUgbmFtZSAoXHJlZntpbnN0YW5jZU1ldGhvZHN9LCBccmVme2dldHRlcnN9LCBccmVme3NldHRlcnN9KS4KXGl0ZW0gSXQgaXMgYSB3YXJuaW5nIGlmIHlvdSBoYXZlIGEgc3RhdGljIHNldHRlciAkdj0kLCBhbmQgYW4gaW5zdGFuY2UgbWVtYmVyICR2JCAoXHJlZntzZXR0ZXJzfSkuClxpdGVtIEl0IGlzIGEgd2FybmluZyBpZiB5b3UgaGF2ZSBhIHN0YXRpYyBnZXR0ZXIgJHYkIGFuZCBhbiBpbnN0YW5jZSBzZXR0ZXIgJHY9JCAoXHJlZntnZXR0ZXJzfSkuClxpdGVtIElmIHlvdSBkZWZpbmUgYW4gaW5zdGFuY2UgbWVtYmVyIG5hbWVkICRtJCwgYW5kIHlvdXIgc3VwZXJjbGFzcyBoYXMgYW4gIGluc3RhbmNlIG1lbWJlciBvZiB0aGUgc2FtZSBuYW1lLCB0aGV5IG92ZXJyaWRlIGVhY2ggb3RoZXIuIFRoaXMgbWF5IG9yIG1heSBub3QgYmUgbGVnYWwuClxpdGVtIFxsYWJlbHt0eXBlU2lnQXNzaWduYWJsZX0KSWYgdHdvIG1lbWJlcnMgb3ZlcnJpZGUgZWFjaCBvdGhlciwgaXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiB0aGVpciB0eXBlIHNpZ25hdHVyZXMgYXJlIG5vdCBhc3NpZ25hYmxlIHRvIGVhY2ggb3RoZXIgKFxyZWZ7aW5zdGFuY2VNZXRob2RzfSwgXHJlZntnZXR0ZXJzfSwgXHJlZntzZXR0ZXJzfSkgKGFuZCAgc2luY2UgdGhlc2UgYXJlIGZ1bmN0aW9uIHR5cGVzLCB0aGlzIG1lYW5zIHRoZSBzYW1lIGFzICJzdWJ0eXBlcyBvZiBlYWNoIG90aGVyIikuClxpdGVtIFxsYWJlbHtyZXF1aXJlZFBhcmFtc30KSWYgdHdvIG1lbWJlcnMgb3ZlcnJpZGUgZWFjaCBvdGhlciwgaXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiB0aGUgb3ZlcnJpZGluZyBtZW1iZXIgaGFzIG1vcmUgcmVxdWlyZWQgcGFyYW1ldGVycyAgdGhhbiB0aGUgb3ZlcnJpZGRlbiBvbmUgKFxyZWZ7aW5zdGFuY2VNZXRob2RzfSkuIApcaXRlbSAgXGxhYmVse29wdGlvbmFsUG9zaXRpb25hbHN9CklmIHR3byBtZW1iZXJzIG92ZXJyaWRlIGVhY2ggb3RoZXIsIGl0IGlzIGEgc3RhdGljIHdhcm5pbmcgaWYgdGhlIG92ZXJyaWRpbmcgbWVtYmVyIGhhcyBmZXdlciAgcG9zaXRpb25hbCBwYXJhbWV0ZXJzIHRoYW4gdGhlIHRoZSBvdmVycmlkZGVuIG9uZSAoXHJlZntpbnN0YW5jZU1ldGhvZHN9KS4KXGl0ZW0gIFxsYWJlbHtuYW1lZFBhcmFtc30KSWYgdHdvIG1lbWJlcnMgb3ZlcnJpZGUgZWFjaCBvdGhlciwgaXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiB0aGUgb3ZlcnJpZGluZyBtZW1iZXIgZG9lcyBub3QgaGF2ZSBhbGwgdGhlIG5hbWVkIHBhcmFtZXRlcnMgdGhhdCB0aGUgdGhlIG92ZXJyaWRkZW4gb25lIGhhcyAoXHJlZntpbnN0YW5jZU1ldGhvZHN9KS4KXGl0ZW0gU2V0dGVycywgZ2V0dGVycyBhbmQgb3BlcmF0b3JzIG5ldmVyIGhhdmUgb3B0aW9uYWwgcGFyYW1ldGVycyBvZiBhbnkga2luZDsgaXQncyBhIGNvbXBpbGUtdGltZSBlcnJvciAoXHJlZntvcGVyYXRvcnN9LCBccmVme2dldHRlcnN9LCBccmVme3NldHRlcnN9KS4KXGl0ZW0gSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgYSBtZW1iZXIgaGFzIHRoZSBzYW1lIG5hbWUgYXMgaXRzIGVuY2xvc2luZyBjbGFzcyAoXHJlZntjbGFzc2VzfSkuClxpdGVtIEEgY2xhc3MgaGFzIGFuIGltcGxpY2l0IGludGVyZmFjZSAoXHJlZntjbGFzc2VzfSkuIApcaXRlbSBTdXBlcmludGVyZmFjZSBtZW1iZXJzIGFyZSBub3QgaW5oZXJpdGVkIGJ5IGEgY2xhc3MsIGJ1dCBhcmUgaW5oZXJpdGVkIGJ5IGl0cyBpbXBsaWNpdCBpbnRlcmZhY2UuIEludGVyZmFjZXMgaGF2ZSB0aGVpciBvd24gaW5oZXJpdGFuY2UgcnVsZXMgKFxyZWZ7aW50ZXJmYWNlSW5oZXJpdGFuY2VBbmRPdmVycmlkaW5nfSkuClxpdGVtIEEgbWVtYmVyIGlzIGFic3RyYWN0IGlmIGl0IGhhcyBubyBib2R5IGFuZCBpcyBub3QgbGFiZWxlZCBcRVhURVJOQUx7fSAoXHJlZnthYnN0cmFjdEluc3RhbmNlTWVtYmVyc30sIFxyZWZ7ZXh0ZXJuYWxGdW5jdGlvbnN9KS4KXGl0ZW0gQSBjbGFzcyBpcyBhYnN0cmFjdCBpZmYgaXQgaXMgZXhwbGljaXRseSBsYWJlbGVkIFxBQlNUUkFDVHt9LiUgb3IgaWYgaXQgZGVjbGFyZXMgKG5vdCBqdXN0IGluaGVyaXRzKSBhbiBhYnN0cmFjdCBtZW1iZXIgKFxyZWZ7Y2xhc3Nlc30pLgpcaXRlbSBJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGEgY29uY3JldGUgY2xhc3MgaGFzIGFuIGFic3RyYWN0IG1lbWJlciAoZGVjbGFyZWQgb3IgaW5oZXJpdGVkKS4KXGl0ZW0gSXQgaXMgYSBzdGF0aWMgd2FybmluZyBhbmQgYSBkeW5hbWljIGVycm9yIHRvIGNhbGwgYSBub24tZmFjdG9yeSBjb25zdHJ1Y3RvciBvZiBhbiBhYnN0cmFjdCBjbGFzcyAgKFxyZWZ7bmV3fSkuIApcaXRlbSBJZiBhIGNsYXNzIGRlZmluZXMgYW4gaW5zdGFuY2UgbWVtYmVyIG5hbWVkICRtJCwgYW5kIGFueSBvZiBpdHMgc3VwZXJpbnRlcmZhY2VzIGhhdmUgYSAgbWVtYmVyIG5hbWVkICRtJCwgdGhlIGludGVyZmFjZSBvZiB0aGUgY2xhc3Mgb3ZlcnJpZGVzICRtJC4KXGl0ZW0gIEFuIGludGVyZmFjZSBpbmhlcml0cyBhbGwgIG1lbWJlcnMgb2YgaXRzIHN1cGVyaW50ZXJmYWNlcyB0aGF0IGFyZSBub3Qgb3ZlcnJpZGRlbiBhbmQgbm90IG1lbWJlcnMgb2YgbXVsdGlwbGUgc3VwZXJpbnRlcmZhY2VzLgpcaXRlbSAgSWYgbXVsdGlwbGUgc3VwZXJpbnRlcmZhY2VzIG9mIGFuIGludGVyZmFjZSBkZWZpbmUgYSBtZW1iZXIgd2l0aCB0aGUgc2FtZSBuYW1lICRtJCwgdGhlbiBhdCBtb3N0IG9uZSBtZW1iZXIgaXMgaW5oZXJpdGVkLiBUaGF0IG1lbWJlciAoaWYgaXQgZXhpc3RzKSBpcyB0aGUgb25lIHdob3NlIHR5cGUgaXMgYSBzdWJ0eXBlIG9mIGFsbCB0aGUgb3RoZXJzLiBJZiB0aGVyZSBpcyBubyBzdWNoIG1lbWJlciwgdGhlbjoKXGJlZ2lue2l0ZW1pemV9CiAgXGl0ZW0gIEEgc3RhdGljIHdhcm5pbmcgaXMgZ2l2ZW4uCiAgXGl0ZW0gIElmIHBvc3NpYmxlIHRoZSBpbnRlcmZhY2UgZ2V0cyBhIG1lbWJlciBuYW1lZCAkbSQgdGhhdCBoYXMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIHJlcXVpcmVkIHBhcmFtZXRlcnMgYW1vbmcgYWxsIHRoZSBtZW1iZXJzIGluIHRoZSBzdXBlcmludGVyZmFjZXMsIHRoZSBtYXhpbWFsIG51bWJlciBvZiAgICBwb3NpdGlvbmFscywgYW5kIHRoZSBzdXBlcnNldCBvZiBuYW1lZCBwYXJhbWV0ZXJzLiAgVGhlIHR5cGVzIG9mIHRoZXNlIGFyZSBhbGwgXERZTkFNSUN7fS4gSWYgdGhpcyBpcyBpbXBvc3NpYmxlIHRoZW4gbm8gbWVtYmVyICRtJCBhcHBlYXJzIGluIHRoZSBpbnRlcmZhY2UuCiAgXGVuZHtpdGVtaXplfSAgKFxyZWZ7aW50ZXJmYWNlSW5oZXJpdGFuY2VBbmRPdmVycmlkaW5nfSkKXGl0ZW0gIFJ1bGUgXHJlZnt0eXBlU2lnQXNzaWduYWJsZX0gYXBwbGllcyB0byBpbnRlcmZhY2VzIGFzIHdlbGwgYXMgY2xhc3NlcyAgKFxyZWZ7aW50ZXJmYWNlSW5oZXJpdGFuY2VBbmRPdmVycmlkaW5nfSkuClxpdGVtICBJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmIGEgY29uY3JldGUgY2xhc3MgZG9lcyBub3QgaGF2ZSBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgYSAgbWV0aG9kIGluIGFueSBvZiBpdHMgc3VwZXJpbnRlcmZhY2VzICB1bmxlc3MgaXQgZGVjbGFyZXMgIGl0cyBvd24gXGNke25vU3VjaE1ldGhvZH0gbWV0aG9kIChccmVme3N1cGVyaW50ZXJmYWNlc30pLiAKXGl0ZW0gVGhlIGlkZW50aWZpZXIgb2YgYSBuYW1lZCBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgdGhlIHNhbWUgYXMgdGhlIG5hbWUgb2YgYSBtZW1iZXIgZGVjbGFyZWQgKGFzIG9wcG9zZWQgdG8gaW5oZXJpdGVkKSBpbiB0aGUgc2FtZSBjbGFzcyAoXHJlZntjb25zdHJ1Y3RvcnN9KS4KXGVuZHtlbnVtZXJhdGV9Cn0KCgolQ2FuIHdlIGhhdmUgYWJzdHJhY3QgZ2V0dGVycyBhbmQgc2V0dGVycz8KClxzdWJzZWN0aW9ue1N1cGVyaW50ZXJmYWNlc30KXGxhYmVse3N1cGVyaW50ZXJmYWNlc30KJSB3aGF0IGFib3V0IHJ1bGVzIGFib3V0IGNsYXNzZXMgdGhhdCBmYWlsIHRvIGltcGxlbWVudCB0aGVpciBpbnRlcmZhY2VzPwoKQSBjbGFzcyBoYXMgYSBzZXQgb2YgZGlyZWN0IHN1cGVyaW50ZXJmYWNlcy4gVGhpcyBzZXQgaW5jbHVkZXMgdGhlIGludGVyZmFjZSBvZiBpdHMgc3VwZXJjbGFzcyBhbmQgdGhlIGludGVyZmFjZXMgc3BlY2lmaWVkIGluIHRoZSB0aGUgXElNUExFTUVOVFN7fSAgY2xhdXNlIG9mIHRoZSBjbGFzcy4KJSBhbmQgYW55IHN1cGVyaW50ZXJmYWNlcyBzcGVjaWZpZWQgYnkgaW50ZXJmYWNlIGluamVjdGlvbiAoXHJlZntpbnRlcmZhY2VJbmplY3Rpb259KS4gIFxRe1RoZSBsYXR0ZXIgbmVlZHMgdG8gYmUgd29yZGVkIGNhcmVmdWxseSAtIHdoZW4gZG8gaW50ZXJmYWNlIGluamVjdGlvbiBjbGF1c2VzIGV4ZWN1dGUgYW5kIGluIHdoYXQgc2NvcGU/fQoKXGJlZ2lue2dyYW1tYXJ9CntcYmYgaW50ZXJmYWNlczp9CiAgICAgIFxJTVBMRU1FTlRTe30gdHlwZUxpc3QKICAgIC4KXGVuZHtncmFtbWFyfQoKSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgIHRoZSBcSU1QTEVNRU5UU3t9ICBjbGF1c2Ugb2YgYSBjbGFzcyAkQyQgc3BlY2lmaWVzIGEgdHlwZSB2YXJpYWJsZSBhcyBhIHN1cGVyaW50ZXJmYWNlLiBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiAgdGhlICBcSU1QTEVNRU5UU3t9IGNsYXVzZSBvZiBhIGNsYXNzICRDJCBzcGVjaWZpZXMgIGEgbWFsZm9ybWVkIHR5cGUgb3IgZGVmZXJyZWQgdHlwZSAoXHJlZntzdGF0aWNUeXBlc30pIGFzIGEgc3VwZXJpbnRlcmZhY2UgIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIHRoZSBcSU1QTEVNRU5UU3t9IGNsYXVzZSBvZiBhIGNsYXNzICRDJCBzcGVjaWZpZXMgdHlwZSBcRFlOQU1JQ3t9IGFzIGEgc3VwZXJpbnRlcmZhY2UuIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmICB0aGUgIFxJTVBMRU1FTlRTe30gY2xhdXNlIG9mIGEgY2xhc3MgJEMkIHNwZWNpZmllcyAgYSB0eXBlICRUJCBhcyBhIHN1cGVyaW50ZXJmYWNlIG1vcmUgdGhhbiBvbmNlLgpJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiB0aGUgc3VwZXJjbGFzcyBvZiBhIGNsYXNzICRDJCBpcyBzcGVjaWZpZWQgYXMgYSBzdXBlcmludGVyZmFjZSBvZiAkQyQuCgpccmF0aW9uYWxlewpPbmUgbWlnaHQgYXJndWUgdGhhdCBpdCBpcyBoYXJtbGVzcyB0byByZXBlYXQgYSB0eXBlIGluIHRoZSBzdXBlcmludGVyZmFjZSBsaXN0LCBzbyB3aHkgbWFrZSBpdCBhbiBlcnJvcj8gVGhlIGlzc3VlIGlzIG5vdCBzbyBtdWNoIHRoYXQgdGhlIHNpdHVhdGlvbiBkZXNjcmliZWQgaW4gcHJvZ3JhbSBzb3VyY2UgaXMgZXJyb25lb3VzLCBidXQgdGhhdCBpdCBpcyBwb2ludGxlc3MuIEFzIHN1Y2gsIGl0IGlzIGFuIGluZGljYXRpb24gdGhhdCB0aGUgcHJvZ3JhbW1lciBtYXkgdmVyeSB3ZWxsIGhhdmUgbWVhbnQgdG8gc2F5IHNvbWV0aGluZyBlbHNlIC0gYW5kIHRoYXQgaXMgYSBtaXN0YWtlIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCB0byBoZXIgb3IgaGlzIGF0dGVudGlvbi4gIE5ldmVydGhlbGVzcywgd2UgY291bGQgc2ltcGx5IGlzc3VlIGEgd2FybmluZzsgYW5kIHBlcmhhcHMgd2Ugc2hvdWxkIGFuZCB3aWxsLiBUaGF0IHNhaWQsIHByb2JsZW1zIGxpa2UgdGhlc2UgYXJlIGxvY2FsIGFuZCBlYXNpbHkgY29ycmVjdGVkIG9uIHRoZSBzcG90LCBzbyB3ZSBmZWVsIGp1c3RpZmllZCBpbiB0YWtpbmcgYSBoYXJkZXIgbGluZS4gCn0KCkl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIHRoZSBpbnRlcmZhY2Ugb2YgYSBjbGFzcyAkQyQgaXMgYSBzdXBlcmludGVyZmFjZSBvZiBpdHNlbGYuCgpMZXQgJEMkIGJlIGEgY29uY3JldGUgY2xhc3MgdGhhdCBkb2VzIG5vdCBkZWNsYXJlIGl0cyBvd24gXGNvZGV7bm9TdWNoTWV0aG9kKCl9IG1ldGhvZC4KSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiB0aGUgaW1wbGljaXQgaW50ZXJmYWNlIG9mICAkQyQgaW5jbHVkZXMgYW4gaW5zdGFuY2UgbWVtYmVyICRtJCBvZiB0eXBlICRGJCBhbmQgJEMkIGRvZXMgbm90IGRlY2xhcmUgb3IgaW5oZXJpdCBhIGNvcnJlc3BvbmRpbmcgbm9uLWFic3RyYWN0IGluc3RhbmNlIG1lbWJlciAkbSQgb2YgdHlwZSAkRickIHN1Y2ggdGhhdCAkRicgPDogRiQuIAoKXGNvbW1lbnRhcnl7QSBjbGFzcyBkb2VzIG5vdCBpbmhlcml0IG1lbWJlcnMgZnJvbSBpdHMgc3VwZXJpbnRlcmZhY2VzLiBIb3dldmVyLCBpdHMgaW1wbGljaXQgaW50ZXJmYWNlIGRvZXMuCn0KCgpccmF0aW9uYWxlIHsKV2UgY2hvb3NlIHRvIGlzc3VlIHRoZXNlIHdhcm5pbmdzIG9ubHkgZm9yIGNvbmNyZXRlIGNsYXNzZXM7IGFuIGFic3RyYWN0IGNsYXNzIG1pZ2h0IGxlZ2l0aW1hdGVseSBiZSBkZXNpZ25lZCB3aXRoIHRoZSBleHBlY3RhdGlvbiB0aGF0IGNvbmNyZXRlIHN1YmNsYXNzZXMgd2lsbCBpbXBsZW1lbnQgcGFydCBvZiAgdGhlIGludGVyZmFjZS4KV2UgYWxzbyBkaXNhYmxlIHRoZXNlIHdhcm5pbmdzIGlmIGEgXGNvZGV7bm9TdWNoTWV0aG9kKCl9IGRlY2xhcmF0aW9uIGlzIHByZXNlbnQuIEluIHN1Y2ggY2FzZXMsIHRoZSBzdXBwb3J0ZWQgaW50ZXJmYWNlIGlzIGdvaW5nIHRvIGJlIGltcGxlbWVudGVkIHZpYSBcY29kZXtub1N1Y2hNZXRob2QoKX0gYW5kIG5vIGFjdHVhbCBkZWNsYXJhdGlvbnMgb2YgdGhlIGltcGxlbWVudGVkIGludGVyZmFjZSdzIG1lbWJlcnMgYXJlIG5lZWRlZC4gVGhpcyBhbGxvd3MgcHJveHkgY2xhc3NlcyBmb3Igc3BlY2lmaWMgdHlwZXMgdG8gYmUgaW1wbGVtZW50ZWQgd2l0aG91dCBwcm92b2tpbmcgdHlwZSB3YXJuaW5ncy4KCkluIGFkZGl0aW9uLCBpdCBtYXkgYmUgdXNlZnVsIHRvIHN1cHByZXNzIHRoZXNlIHdhcm5pbmdzIGlmIFxjb2Rle25vU3VjaE1ldGhvZH0gaXMgaW5oZXJpdGVkLCBIb3dldmVyLCB0aGlzIG1heSBzdXBwcmVzcyBtZWFuaW5nZnVsIHdhcm5pbmdzIGFuZCBzbyB3ZSBjaG9vc2Ugbm90IHRvIGRvIHNvLiBJZiBvbmUgZG9lcyB3YW50IHRvIHN1cHByZXNzIHRoZSB3YXJuaW5ncyBpbiBhIHN1YmNsYXNzLCBvbmUgY2FuIGRlZmluZSBhIHNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBcY29kZXtub1N1Y2hNZXRob2R9IGluIHRoZSBzdWJjbGFzczoKfQoKXGJlZ2lue2RhcnRDb2RlfQpub1N1Y2hNZXRob2QoaW52KSA9JD4kIFxTVVBFUi5ub1N1Y2hNZXRob2QoaW52KTsKXGVuZHtkYXJ0Q29kZX0KCkl0IGlzIGEgc3RhdGljIHdhcm5pbmcgaWYgdGhlIGltcGxpY2l0IGludGVyZmFjZSBvZiAgYSBjbGFzcyAkQyQgaW5jbHVkZXMgYW4gaW5zdGFuY2UgbWVtYmVyICRtJCBvZiB0eXBlICRGJCBhbmQgJEMkIGRlY2xhcmVzIG9yIGluaGVyaXRzIGEgY29ycmVzcG9uZGluZyBpbnN0YW5jZSBtZW1iZXIgJG0kIG9mIHR5cGUgJEYnJCBpZiAgJEYnJCBpcyBub3QgYSBzdWJ0eXBlIG9mICRGJC4gCgpccmF0aW9uYWxlewpIb3dldmVyLCBpZiBhIGNsYXNzIGRvZXMgZXhwbGljaXRseSBkZWNsYXJlIGEgbWVtYmVyIHRoYXQgY29uZmxpY3RzIHdpdGggaXRzIHN1cGVyaW50ZXJmYWNlLCB0aGlzIGFsd2F5cyB5aWVsZHMgYSBzdGF0aWMgd2FybmluZy4KCn0KJUl0IGlzIGEgc3RhdGljIHdhcm5pbmcgaWYgYW4gaW1wb3J0ZWQgc3VwZXJpbnRlcmZhY2Ugb2YgYSBjbGFzcyAkQyQgZGVjbGFyZXMgcHJpdmF0ZSBtZW1iZXJzLgoKJSBTaG91bGQgd2UgaWdub3JlIHVuaW1wbGVtZW50ZWQgcHJpdmF0ZSBtZW1iZXJzPyAKCiVccmF0aW9uYWxle1RoaXMgbGFzdCBydWxlIGlzIHByb2JsZW1hdGljLiBBcyBjb2RlIGV2b2x2ZXMgaW4gb25lIGxpYnJhcnkgKCRMXzEkKSBpdCBtYXkgYWRkIHByaXZhdGUgbWVtYmVycyB0byBhIGNsYXNzICRJXzEkIGltcGxlbWVudGVkIG9yIGluaGVyaXRlZCBpbiBhbm90aGVyICBsaWJyYXJ5ICRMXzIkIGJyZWFraW5nICRMXzEkLiAgVGhpcyBpcyBhIGRpcmVjdCByZXN1bHQgb2YgY291cGxpbmcgYW4gaW50ZXJmYWNlIGJhc2VkIHR5cGUgc3lzdGVtIHdpdGggbGlicmFyeSBiYXNlZCBwcml2YWN5LiAgV2UgYXJlIGNvbnNpZGVyaW5nIGFsdGVybmF0aXZlIHNlbWFudGljcyB0aGF0IG1pZ2h0IGhlbHAgcmVzb2x2ZSB0aGlzIGlzc3VlLgolfQoKJVxjb21tZW50YXJ5e0hvd2V2ZXIsIGl0IGlzIHBlcmZlY3RseSBhY2NlcHRhYmxlIGlmIGEgdHlwZSBtZW50aW9uZWQgaW4gdGhlIGltcGxlbWVudHMgY2xhdXNlIGlzIG1lbnRpb25lZCBhcyBhIHN1cGVyaW50ZXJmYWNlIGluIGFuIGludGVyZmFjZSBpbmplY3Rpb24gY2xhdXNlLiAKJX0KCiVccmF0aW9uYWxle1dlIGRpc2FsbG93IHJlcGV0aXRpb24gb2YgYSB0eXBlIGluIGEgZ2l2ZW4gaW1wbGVtZW50cyBjbGF1c2UsIGFzIHRoYXQgaXMgYSBsb2NhbGl6ZWQgbWlzdGFrZS4gSG93ZXZlciwgc2VwYXJhdGUgY2xhdXNlcyAodGhhdCBpcyB0aGUgb3JpZ2luYWwgY2xhc3MgYW5kIHZhcmlvdXMgaW5qZWN0aW9ucykgbWF5IGV2b2x2ZSBzZXBhcmF0ZWx5IG92ZXIgdGltZSwgYW5kIHdlIGRvbid0IHdhbnQgdG8gY2F1c2UgYnJlYWthZ2UuIEZvciBleGFtcGxlCgolY2xhc3MgQyBpbXBsZW1lbnRzIEkxIHsuLi59OyAvLyBjbGFzcyBkZWNsYXJhdGlvbgoKCiVzb21ld2hlcmUgc29tZW9uZSByZWFsaXplcyB0aGF0IEMgY291bGQgaW1wbGVtZW50IEkyIGNsYXNzIEMgaW1wbGVtZW50cyBJMjsgLy8gaW5qZWN0aW9uCgolbGF0ZXIsIHRoZSBhdXRob3Igb2YgQyBkZWNpZGVzIHRvIHN1cHBvcnQgSTIKCiVjbGFzcyBDIGltcGxlbWVudHMgSTEsIEkyIHsuLi59OyAvLyBjbGFzcyBkZWNsYXJhdGlvbgoKJXRoaXMgc2hvdWxkIG5vdCBjYXVzZSBicmVha2FnZS4KJX0KCiUgXHJhdGlvbmFsZXtUaGlzIGF2b2lkcyB0aGUgaXNzdWVzIHdpdGggc28tY2FsbGVkIG1pcmFuZGEgbWV0aG9kcyBldGMuIH0KCgpcc2VjdGlvbntJbnRlcmZhY2VzfQpcbGFiZWx7aW50ZXJmYWNlc30KCkFuIHtcZW0gaW50ZXJmYWNlfSBkZWZpbmVzIGhvdyBvbmUgbWF5IGludGVyYWN0IHdpdGggYW4gb2JqZWN0LiBBbiBpbnRlcmZhY2UgaGFzIG1ldGhvZHMsIGdldHRlcnMgYW5kIHNldHRlcnMgYW5kIGEgc2V0IG9mIHN1cGVyaW50ZXJmYWNlcy4KClxzdWJzZWN0aW9ue1N1cGVyaW50ZXJmYWNlc30KXGxhYmVse2ludGVyZmFjZVN1cGVyaW50ZXJmYWNlc30KCkFuIGludGVyZmFjZSBoYXMgYSBzZXQgb2YgZGlyZWN0IHN1cGVyaW50ZXJmYWNlcy4gCgpBbiBpbnRlcmZhY2UgJEokIGlzIGEgc3VwZXJpbnRlcmZhY2Ugb2YgYW4gaW50ZXJmYWNlICRJJCBpZmYgZWl0aGVyICRKJCBpcyBhIGRpcmVjdCBzdXBlcmludGVyZmFjZSBvZiAkSSQgb3IgJEokIGlzIGEgc3VwZXJpbnRlcmZhY2Ugb2YgYSBkaXJlY3Qgc3VwZXJpbnRlcmZhY2Ugb2YgJEkkLgoKCgoKXHN1YnN1YnNlY3Rpb257SW5oZXJpdGFuY2UgYW5kIE92ZXJyaWRpbmd9ClxsYWJlbHtpbnRlcmZhY2VJbmhlcml0YW5jZUFuZE92ZXJyaWRpbmd9CgpMZXQgJEokIGJlIGFuIGludGVyZmFjZSBhbmQgJEskIGJlIGEgbGlicmFyeS4gV2UgZGVmaW5lICRpbmhlcml0ZWQoSiwgSykkICB0byBiZSB0aGUgc2V0IG9mIG1lbWJlcnMgJG0kIHN1Y2ggdGhhdCAgIGFsbCBvZiB0aGUgZm9sbG93aW5nIGhvbGQ6ClxiZWdpbntpdGVtaXplfQpcaXRlbSAkbSQgaXMgYWNjZXNzaWJsZSB0byAkSyQgYW5kIApcaXRlbSAkQSQgaXMgYSBkaXJlY3Qgc3VwZXJpbnRlcmZhY2Ugb2YgJEokIGFuZCBlaXRoZXIgCiAgXGJlZ2lue2l0ZW1pemV9CiAgXGl0ZW0gJEEkIGRlY2xhcmVzIGEgbWVtYmVyICRtJCAgb3IKICBcaXRlbSAkbSQgaXMgYSBtZW1iZXIgb2YgJGluaGVyaXRlZChBLCBLKSQuCiAgXGVuZHtpdGVtaXplfQpcaXRlbSAkbSQgaXMgbm90IG92ZXJyaWRkZW4gYnkgJEokLgpcZW5ke2l0ZW1pemV9CgpGdXJ0aGVybW9yZSwgd2UgZGVmaW5lICRvdmVycmlkZXMoSiwgSykkICB0byBiZSB0aGUgc2V0IG9mIG1lbWJlcnMgJG1eXHByaW1lJCBzdWNoIHRoYXQgIGFsbCBvZiB0aGUgZm9sbG93aW5nIGhvbGQ6ClxiZWdpbntpdGVtaXplfQpcaXRlbSAkSiQgaXMgdGhlIGltcGxpY2l0IGludGVyZmFjZSBvZiBhIGNsYXNzICRDJC4KXGl0ZW0gICRDJCBkZWNsYXJlcyBhIG1lbWJlciAkbSQuClxpdGVtICRtXlxwcmltZSQgaGFzIHRoZSBzYW1lIG5hbWUgYXMgJG0kLgpcaXRlbSAkbV5ccHJpbWUkIGlzIGFjY2Vzc2libGUgdG8gJEskLiAgClxpdGVtICRBJCBpcyBhIGRpcmVjdCBzdXBlcmludGVyZmFjZSBvZiAkSiQgYW5kIGVpdGhlcgogIFxiZWdpbntpdGVtaXplfQogIFxpdGVtICRBJCBkZWNsYXJlcyBhIG1lbWJlciAkbV5ccHJpbWUkIG9yIAogIFxpdGVtICRtXlxwcmltZSQgaXMgYSBtZW1iZXIgb2YgJGluaGVyaXRlZChBLCBLKSQuCiAgXGVuZHtpdGVtaXplfQpcZW5ke2l0ZW1pemV9CgoKTGV0ICRJJCBiZSB0aGUgaW1wbGljaXQgaW50ZXJmYWNlIG9mIGEgY2xhc3MgJEMkIGRlY2xhcmVkIGluIGxpYnJhcnkgJEwkLiAgJEkkIHtcZW0gaW5oZXJpdHN9IGFsbCBtZW1iZXJzIG9mICRpbmhlcml0ZWQoSSwgTCkkIGFuZCAkSSQge1xlbSBvdmVycmlkZXN9ICRtXlxwcmltZSQgaWYgICRtXlxwcmltZSBcaW4gb3ZlcnJpZGVzKEksIEwpJC4gCgpBbGwgdGhlIHN0YXRpYyB3YXJuaW5ncyBwZXJ0YWluaW5nIHRvIHRoZSBvdmVycmlkaW5nIG9mIGluc3RhbmNlIG1lbWJlcnMgZ2l2ZW4gaW4gc2VjdGlvbiBccmVme2NsYXNzZXN9IGFib3ZlIGhvbGQgZm9yIG92ZXJyaWRpbmcgYmV0d2VlbiBpbnRlcmZhY2VzIGFzIHdlbGwuCgpJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmICRtJCBpcyBhIG1ldGhvZCBhbmQgJG1eXHByaW1lJCBpcyBhIGdldHRlciwgb3IgaWYgJG0kIGlzIGEgZ2V0dGVyIGFuZCAkbV5ccHJpbWUkIGlzIGEgbWV0aG9kLgoKCgolTGV0ICRJID0gU18wJCBiZSB0aGUgaW1wbGljaXQgaW50ZXJmYWNlIG9mIGEgY2xhc3MgJEMkIGRlY2xhcmVkIGluIGxpYnJhcnkgJEwkLCBhbmQgbGV0ICRce1NfMSBcbGRvdHMgU19rXH0kIGJlIHRoZSBzZXQgb2YgYWxsIHN1cGVyaW50ZXJmYWNlcyBvZiAkSSQuIAoKJUxldCAkSSQgYmUgdGhlIGltcGxpY2l0IGludGVyZmFjZSBvZiBhIGNsYXNzICRDJC4gICRJJCBpbmhlcml0cyBhbnkgaW5zdGFuY2UgbWVtYmVycyBvZiBpdHMgc3VwZXJpbnRlcmZhY2VzIHRoYXQgYXJlIG5vdCBvdmVycmlkZGVuIGJ5IG1lbWJlcnMgZGVjbGFyZWQgaW4gJEMkLiAKCiUgdGlnaHRlbiBkZWZpbml0aW9uPyBkbyB3ZSBuZWVkIGNoYWluIGFzIGZvciBjbGFzc2VzPyAgRGVmaW5pdGlvbiBmb3IgaW50ZXJmYWNlIG92ZXJyaWRlPwoKSG93ZXZlciwgaWYgdGhlIGFib3ZlIHJ1bGVzIHdvdWxkIGNhdXNlIG11bHRpcGxlIG1lbWJlcnMgJG1fMSwgXGxkb3RzLCAgbV9rJCB3aXRoIHRoZSBzYW1lIG5hbWUgJG4kIHRvIGJlIGluaGVyaXRlZCAoYmVjYXVzZSBpZGVudGljYWxseSBuYW1lZCBtZW1iZXJzIGV4aXN0ZWQgaW4gc2V2ZXJhbCBzdXBlcmludGVyZmFjZXMpIHRoZW4gYXQgbW9zdCBvbmUgbWVtYmVyIGlzIGluaGVyaXRlZC4gCgpJZiBzb21lIGJ1dCBub3QgYWxsIG9mIHRoZSAkbV9pLCAxIFxsZSBpIFxsZSBrJCBhcmUgZ2V0dGVycyBub25lIG9mIHRoZSAkbV9pJCBhcmUgaW5oZXJpdGVkLCBhbmQgYSBzdGF0aWMgd2FybmluZyBpcyBpc3N1ZWQuCgpPdGhlcndpc2UsIGlmIHRoZSBzdGF0aWMgdHlwZXMgJFRfMSwgXGxkb3RzLCAgVF9rJCBvZiB0aGUgbWVtYmVycyAkbV8xLCBcbGRvdHMsICBtX2skICBhcmUgbm90IGlkZW50aWNhbCwgdGhlbiB0aGVyZSBtdXN0IGJlIGEgbWVtYmVyICRtX3gkIHN1Y2ggdGhhdCAkVF94IDw6IFRfaSwgMSBcbGUgeCBcbGUgayQgZm9yIGFsbCAgJGkgIFxpbiAxLi5rJCwgb3IgYSBzdGF0aWMgdHlwZSB3YXJuaW5nIG9jY3Vycy4gVGhlIG1lbWJlciB0aGF0IGlzIGluaGVyaXRlZCAgaXMgJG1feCQsIGlmIGl0IGV4aXN0czsgb3RoZXJ3aXNlOgogbGV0ICRudW1iZXJPZlBvc2l0aW9uYWxzKGYpJCBkZW5vdGUgdGhlIG51bWJlciBvZiBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgb2YgYSBmdW5jdGlvbiAkZiQsIGFuZCBsZXQgJG51bWJlck9mUmVxdWlyZWRQYXJhbXMoZikkIGRlbm90ZSB0aGUgbnVtYmVyIG9mIHJlcXVpcmVkIHBhcmFtZXRlcnMgb2YgYSBmdW5jdGlvbiAkZiQuIEZ1cnRoZXJtb3JlLCBsZXQgJHMkIGRlbm90ZSB0aGUgc2V0IG9mIGFsbCBuYW1lZCBwYXJhbWV0ZXJzIG9mIHRoZSAkbV8xLCBcbGRvdHMsICBtX2skLiAgVGhlbiBsZXQgCgokaCA9IG1heChudW1iZXJPZlBvc2l0aW9uYWxzKG1faSkpLCAkCgokciA9IG1pbihudW1iZXJPZlJlcXVpcmVkUGFyYW1zKG1faSkpLCBpIFxpbiAxLi5rJC4gCgpUaGVuICRJJCBoYXMgYSBtZXRob2QgbmFtZWQgJG4kLCB3aXRoICRyJCByZXF1aXJlZCBwYXJhbWV0ZXJzIG9mIHR5cGUgXERZTkFNSUN7fSwgJGgkICBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgb2YgdHlwZSBcRFlOQU1JQ3t9LCBuYW1lZCBwYXJhbWV0ZXJzICRzJCBvZiB0eXBlICBcRFlOQU1JQ3t9IGFuZCAgcmV0dXJuIHR5cGUgIFxEWU5BTUlDe30uICAKCgoKXGNvbW1lbnRhcnl7VGhlIG9ubHkgc2l0dWF0aW9uIHdoZXJlIHRoZSBydW50aW1lIHdvdWxkIGJlIGNvbmNlcm5lZCB3aXRoIHRoaXMgd291bGQgYmUgZHVyaW5nIHJlZmxlY3Rpb24sIGlmIGEgbWlycm9yIGF0dGVtcHRlZCB0byBvYnRhaW4gdGhlIHNpZ25hdHVyZSBvZiBhbiBpbnRlcmZhY2UgbWVtYmVyLiAKfQoKXHJhdGlvbmFsZXsKVGhlIGN1cnJlbnQgc29sdXRpb24gaXMgYSB0YWQgY29tcGxleCwgYnV0IGlzIHJvYnVzdCBpbiB0aGUgZmFjZSBvZiB0eXBlIGFubm90YXRpb24gY2hhbmdlcy4gIEFsdGVybmF0aXZlczogKGEpIE5vIG1lbWJlciBpcyBpbmhlcml0ZWQgaW4gY2FzZSBvZiBjb25mbGljdC4gKGIpIFRoZSBmaXJzdCBtIGlzIHNlbGVjdGVkIChiYXNlZCBvbiBvcmRlciBvZiBzdXBlcmludGVyZmFjZSBsaXN0KSAoYykgSW5oZXJpdGVkIG1lbWJlciBjaG9zZW4gYXQgcmFuZG9tLiAKCihhKSBtZWFucyB0aGF0IHRoZSBwcmVzZW5jZSBvZiBhbiBpbmhlcml0ZWQgbWVtYmVyIG9mIGFuIGludGVyZmFjZSB2YXJpZXMgZGVwZW5kaW5nIG9uIHR5cGUgc2lnbmF0dXJlcy4gIChiKSBpcyBzZW5zaXRpdmUgdG8gaXJyZWxldmFudCBkZXRhaWxzIG9mIHRoZSBkZWNsYXJhdGlvbiBhbmQgKGMpIGlzIGxpYWJsZSB0byBnaXZlIHVucHJlZGljdGFibGUgcmVzdWx0cyBiZXR3ZWVuIGltcGxlbWVudGF0aW9ucyBvciBldmVuIGJldHdlZW4gZGlmZmVyZW50IGNvbXBpbGF0aW9uIHNlc3Npb25zLgp9CgolIE5lZWQgd2FybmluZ3MgaWYgb3ZlcnJpZGVyIGNvbmZsaWN0cyB3aXRoIG92ZXJyaWRkZWUgZWl0aGVyIGJlY2F1c2Ugc2lnbmF0dXJlcyBhcmUgaW5jb21wYXRpYmxlIG9yIGJlY2F1c2UgZG9uZSBpcyBhIG1ldGhvZCBhbmQgb25lIGlzIGEgZ2V0dGVyIG9yIHNldHRlci4KClxzZWN0aW9ue01peGluc30KXGxhYmVse21peGluc30gCgoKQSBtaXhpbiBkZXNjcmliZXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIGNsYXNzIGFuZCBpdHMgc3VwZXJjbGFzcy4gQSBtaXhpbiBpcyBhbHdheXMgZGVyaXZlZCBmcm9tIGFuIGV4aXN0aW5nIGNsYXNzIGRlY2xhcmF0aW9uLiAKCkl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIGEgZGVjbGFyZWQgb3IgZGVyaXZlZCBtaXhpbiByZWZlcnMgdG8gXFNVUEVSe30uIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIGEgZGVjbGFyZWQgb3IgZGVyaXZlZCBtaXhpbiBleHBsaWNpdGx5IGRlY2xhcmVzIGEgY29uc3RydWN0b3IuIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIGEgbWl4aW4gaXMgZGVyaXZlZCBmcm9tIGEgY2xhc3Mgd2hvc2Ugc3VwZXJjbGFzcyBpcyBub3QgXGNvZGV7T2JqZWN0fS4KClxyYXRpb25hbGV7ClRoZXNlIHJlc3RyaWN0aW9ucyBhcmUgdGVtcG9yYXJ5LiAgV2UgZXhwZWN0IHRvIHJlbW92ZSB0aGVtIGluIGxhdGVyIHZlcnNpb25zIG9mIERhcnQuCgpUaGUgcmVzdHJpY3Rpb24gb24gdGhlIHVzZSBvZiBcU1VQRVJ7fSBhdm9pZHMgdGhlIHByb2JsZW0gb2YgcmViaW5kaW5nIFxTVVBFUnt9IHdoZW4gdGhlIG1peGluIGlzIGJvdW5kIHRvIGRpZmZlcmVuY2Ugc3VwZXJjbGFzc2VzLgoKVGhlIHJlc3RyaWN0aW9uIG9uIGNvbnN0cnVjdG9ycyBzaW1wbGlmaWVzIHRoZSBjb25zdHJ1Y3Rpb24gb2YgbWl4aW4gYXBwbGljYXRpb25zIGJlY2F1c2UgdGhlIHByb2Nlc3Mgb2YgY3JlYXRpbmcgaW5zdGFuY2VzIGlzIHNpbXBsZXIuCgpUaGUgcmVzdHJpY3Rpb24gb24gdGhlIHN1cGVyY2xhc3MgbWVhbnMgdGhhdCB0aGUgdHlwZSBvZiBhIGNsYXNzICBmcm9tIHdoaWNoIGEgbWl4aW4gaXMgZGVyaXZlZCBpcyBhbHdheXMgaW1wbGVtZW50ZWQgYnkgYW55IGNsYXNzIHRoYXQgbWl4ZXMgaXQgaW4uIFRoaXMgYWxsb3dzIHVzIHRvIGRlZmVyIHRoZSBxdWVzdGlvbiBvZiB3aGV0aGVyIGFuZCBob3cgdG8gZXhwcmVzcyB0aGUgdHlwZSBvZiB0aGUgbWl4aW4gaW5kZXBlbmRlbnRseSBvZiBpdHMgc3VwZXJjbGFzcyBhbmQgc3VwZXIgaW50ZXJmYWNlIHR5cGVzLgoKUmVhc29uYWJsZSBhbnN3ZXJzIGV4aXN0IGZvciBhbGwgdGhlc2UgaXNzdWVzLCBidXQgdGhlaXIgaW1wbGVtZW50YXRpb24gaXMgbm9uLXRyaXZpYWwuCn0KClxzdWJzZWN0aW9ue01peGluIEFwcGxpY2F0aW9ufQpcbGFiZWx7bWl4aW5BcHBsaWNhdGlvbn0KCkEgbWl4aW4gbWF5IGJlIGFwcGxpZWQgdG8gYSBzdXBlcmNsYXNzLCB5aWVsZGluZyBhIG5ldyBjbGFzcy4gTWl4aW4gYXBwbGljYXRpb24gb2NjdXJzIHdoZW4gYSBtaXhpbiBpcyBtaXhlZCBpbnRvIGEgY2xhc3MgZGVjbGFyYXRpb24gdmlhIGl0cyBcV0lUSHt9IGNsYXVzZS4gIFRoZSBtaXhpbiBhcHBsaWNhdGlvbiBtYXkgYmUgdXNlZCB0byBleHRlbmQgYSBjbGFzcyBwZXIgc2VjdGlvbiAoXHJlZntjbGFzc2VzfSk7IGFsdGVybmF0ZWx5LCBhIGNsYXNzIG1heSBiZSBkZWZpbmVkIGFzIGEgbWl4aW4gYXBwbGljYXRpb24gYXMgZGVzY3JpYmVkIGluIHRoaXMgc2VjdGlvbi4gICBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiB0aGUgXFdJVEh7fSBjbGF1c2Ugb2YgYSBtaXhpbiBhcHBsaWNhdGlvbiAkQyQgaW5jbHVkZXMgYSBkZWZlcnJlZCB0eXBlIGV4cHJlc3Npb24uCgoKXGJlZ2lue2dyYW1tYXJ9CntcYmYgIG1peGluQXBwbGljYXRpb25DbGFzczp9CglpZGVudGlmaWVyIHR5cGVQYXJhbWV0ZXJzPyBgPScgIG1peGluQXBwbGljYXRpb24gYHtcZXNjYXBlZ3JhbW1hciA7fScgLgoJCntcYmYgbWl4aW5BcHBsaWNhdGlvbjp9CiAgICAgdHlwZSBtaXhpbnMgaW50ZXJmYWNlcz8gCiAgICAuClxlbmR7Z3JhbW1hcn0KCkEgIG1peGluIGFwcGxpY2F0aW9uIG9mIHRoZSBmb3JtICBcY29kZXskUyQgXFdJVEh7fSAkTSQ7fSBkZWZpbmVzIGEgY2xhc3MgICRDJCB3aXRoIHN1cGVyY2xhc3MgICRTJC4gCgpBICBtaXhpbiBhcHBsaWNhdGlvbiBvZiB0aGUgZm9ybSAgXGNvZGV7JFMkIFxXSVRIe30gJE1fMSwgXGxkb3RzLCBNX2skO30gZGVmaW5lcyBhIGNsYXNzICAkQyQgd2hvc2Ugc3VwZXJjbGFzcyBpcyB0aGUgYXBwbGljYXRpb24gb2YgdGhlIG1peGluIGNvbXBvc2l0aW9uIChccmVme21peGluQ29tcG9zaXRpb259KSAkTV97ay0xfSAqIFxsZG90cyAqIE1fMSQgdG8gJFMkLiAKCkluIGJvdGggY2FzZXMgYWJvdmUsICRDJCBkZWNsYXJlcyB0aGUgc2FtZSBpbnN0YW5jZSBtZW1iZXJzIGFzICRNJCAocmVzcGVjdGl2ZWx5LCAkTV9rJCkuIElmIGFueSBvZiB0aGUgaW5zdGFuY2UgZmllbGRzIG9mICRNJCAocmVzcGVjdGl2ZWx5LCAkTV9rJCkgaGF2ZSBpbml0aWFsaXplcnMsIHRoZXkgYXJlIGV4ZWN1dGVkIGluIHRoZSBzY29wZSBvZiAkTSQgKHJlc3BlY3RpdmVseSwgJE1fayQpIHRvIGluaXRpYWxpemUgdGhlIGNvcnJlc3BvbmRpbmcgZmllbGRzIG9mICRDJC4gCgpGb3IgZWFjaCBnZW5lcmF0aXZlIGNvbnN0cnVjdG9yIG5hbWVkICRxX2koVF97aTF9JCAkIGFfe2kxfSwgXGxkb3RzICwgVF97aWtfaX0kICQgYV97aWtfaX0pLCBpIFxpbiAxLi5uJCBvZiAkUyQsICRDJCBoYXMgYW4gaW1wbGljaXRseSBkZWNsYXJlZCBjb25zdHJ1Y3RvciBuYW1lZAokcSdfaSA9IFtDL1NdcV9pJCBvZiB0aGUgZm9ybSAKCiRxJ19pKGFfe2kxfSwgXGxkb3RzICwgYV97aWtfaX0pOlxTVVBFUihhX3tpMX0sIFxsZG90cyAsIGFfe2lrX2l9KTskLgoKSWYgdGhlIG1peGluIGFwcGxpY2F0aW9uIGRlY2xhcmVzIHN1cHBvcnQgZm9yIGludGVyZmFjZXMsIHRoZSByZXN1bHRpbmcgY2xhc3MgaW1wbGVtZW50cyB0aG9zZSBpbnRlcmZhY2VzLgoKSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgJFMkIGlzIGEgbWFsZm9ybWVkIHR5cGUuIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmICRNJCAocmVzcGVjdGl2ZWx5LCBhbnkgb2YgJE1fMSwgXGxkb3RzLCBNX2skKSBpcyBhIG1hbGZvcm1lZCB0eXBlLiBJdCBpcyBhIGNvbXBpbGUgdGltZSBlcnJvciBpZiBhIHdlbGwgZm9ybWVkIG1peGluIGNhbm5vdCBiZSBkZXJpdmVkIGZyb20gJE0kIChyZXNwZWN0aXZlbHksIGZyb20gZWFjaCBvZiAkTV8xLCBcbGRvdHMsIE1fayQpLiAKCkxldCAkSyQgYmUgYSBjbGFzcyBkZWNsYXJhdGlvbiAgd2l0aCB0aGUgc2FtZSBjb25zdHJ1Y3RvcnMsIHN1cGVyY2xhc3MgYW5kIGludGVyZmFjZXMgYXMgJEMkLCAgYW5kIHRoZSBpbnN0YW5jZSBtZW1iZXJzIGRlY2xhcmVkIGJ5ICRNJCAocmVzcGVjdGl2ZWx5ICRNXzEsIFxsZG90cywgTV9rJCkuIEl0IGlzIGEgc3RhdGljIHdhcm5pbmcgaWYgdGhlIGRlY2xhcmF0aW9uIG9mICRLJCB3b3VsZCBjYXVzZSBhIHN0YXRpYyB3YXJuaW5nLiAgSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgdGhlIGRlY2xhcmF0aW9uIG9mICRLJCB3b3VsZCBjYXVzZSBhIGNvbXBpbGUtdGltZSBlcnJvci4KClxjb21tZW50YXJ5ewpJZiwgZm9yIGV4YW1wbGUsICRNJCBkZWNsYXJlcyBhbiBpbnN0YW5jZSBtZW1iZXIgJGltJCB3aG9zZSB0eXBlIGlzIGF0IG9kZHMgd2l0aCB0aGUgdHlwZSBvZiBhIG1lbWJlciBvZiB0aGUgc2FtZSBuYW1lIGluICRTJCwgdGhpcyB3aWxsIHJlc3VsdCBpbiBhIHN0YXRpYyB3YXJuaW5nIGp1c3QgYXMgaWYgd2UgaGFkIGRlZmluZWQgJEskIGJ5IG1lYW5zIG9mIGFuIG9yZGluYXJ5IGNsYXNzIGRlY2xhcmF0aW9uIGV4dGVuZGluZyAkUyQsIHdpdGggYSBib2R5IHRoYXQgaW5jbHVkZWQgJGltJC4KCn0KClRoZSBlZmZlY3Qgb2YgYSBjbGFzcyBkZWZpbml0aW9uIG9mIHRoZSBmb3JtIFxjb2Rle1xDTEFTU3t9ICRDJCA9ICRNJDsgfSBvciB0aGUgZm9ybSAKIFxjb2Rle1xDTEFTU3t9ICRDPFRfMSwgXGxkb3RzLCBUX24+JCA9ICRNJDsgfSBpbiBsaWJyYXJ5ICRMJCAgaXMgdG8gaW50cm9kdWNlIHRoZSBuYW1lICRDJCBpbnRvIHRoZSBzY29wZSBvZiAkTCQsIGJvdW5kIHRvIHRoZSBjbGFzcyAoXHJlZntjbGFzc2VzfSkgZGVmaW5lZCBieSB0aGUgbWl4aW4gYXBwbGljYXRpb24gJE0kLiBUaGUgbmFtZSBvZiB0aGUgY2xhc3MgaXMgYWxzbyBzZXQgdG8gJEMkLiBJZmYgdGhlICBjbGFzcyBpcyBwcmVmaXhlZCBieSB0aGUgYnVpbHQtaW4gaWRlbnRpZmllciBcQUJTVFJBQ1R7fSwgdGhlIGNsYXNzIGJlaW5nIGRlZmluZWQgaXMgYW4gYWJzdHJhY3QgY2xhc3MuCiAKClxzdWJzZWN0aW9ue01peGluIENvbXBvc2l0aW9ufQpcbGFiZWx7bWl4aW5Db21wb3NpdGlvbn0KClxyYXRpb25hbGV7CkRhcnQgZG9lcyBub3QgZGlyZWN0bHkgc3VwcG9ydCBtaXhpbiBjb21wb3NpdGlvbiwgYnV0IHRoZSBjb25jZXB0IGlzIHVzZWZ1bCB3aGVuIGRlZmluaW5nIGhvdyB0aGUgc3VwZXJjbGFzcyBvZiBhIGNsYXNzIHdpdGggYSBtaXhpbiBjbGF1c2UgaXMgY3JlYXRlZC4KfQoKVGhlIHtcZW0gY29tcG9zaXRpb24gb2YgdHdvIG1peGluc30sICRNXzE8VF8xIFxsZG90cyBUX3trX3tNXzF9fT4kIGFuZCAkTV8yPFVfMSAgXGxkb3RzIFVfe2tfe01fMn19PiQsIHdyaXR0ZW4gJE1fMTxUXzEgXGxkb3RzIFRfe2tfe01fMX19PiAqIE1fMjxVXzEgIFxsZG90cyBVX3trX3tNXzJ9fT4kIGRlZmluZXMgYW4gYW5vbnltb3VzIG1peGluIHN1Y2ggdGhhdCBmb3IgYW55IGNsYXNzICRTPFZfMSBcbGRvdHMgVl97a19TfT4kLCB0aGUgYXBwbGljYXRpb24gb2YgCgokTV8xPFRfMSBcbGRvdHMgVF97a197TV8xfX0+ICogTV8yPFVfMSAgXGxkb3RzIFVfe2tfe01fMn19PiQgIAoKdG8gJFM8Vl8xIFxsZG90cyBWX3trX1N9PiQgaXMgZXF1aXZhbGVudCB0byAKClxiZWdpbntkYXJ0Q29kZX0KXEFCU1RSQUNUe30gXENMQVNTe30gJElkXzE8VF8xICBcbGRvdHMgVF97a197TV8xfX0sIFVfMSAgXGxkb3RzIFVfe2tfe01fMn19LCBWXzEgIFxsZG90cyBWX3trX1N9PiA9ICQKICAgICAgJElkXzI8VV8xICBcbGRvdHMgVV97a197TV8yfX0sIFZfMSAgXGxkb3RzIFZfe2tfU30+JCBcV0lUSHt9ICRNXzEgPFRfMSAgXGxkb3RzIFRfe2tfe01fMX19PiQ7ClxlbmR7ZGFydENvZGV9Cgp3aGVyZSAkSWRfMiQgZGVub3RlcyAKClxiZWdpbntkYXJ0Q29kZX0KXEFCU1RSQUNUe30gIFxDTEFTU3t9ICRJZF8yPFVfMSBcbGRvdHMgVV97a197TV8yfX0sIFZfMSBcbGRvdHMgVl97a19TfT4gPSQKICAgICAgICAgICAgICAgICAgICAgICAgICRTPFZfMSBcbGRvdHMgVl97a19TfT4kIFxXSVRIe30gJE1fMjxVXzEgIFxsZG90cyBVX3trX3tNXzJ9fT4kOyAKXGVuZHtkYXJ0Q29kZX0KCmFuZCAkSWRfMSQgYW5kICRJZF8yJCBhcmUgdW5pcXVlIGlkZW50aWZpZXJzIHRoYXQgZG8gbm90IGV4aXN0IGFueXdoZXJlIGluIHRoZSBwcm9ncmFtLiAKClxyYXRpb25hbGV7ClRoZSBjbGFzc2VzIHByb2R1Y2VkIGJ5IG1peGluIGNvbXBvc2l0aW9uIGFyZSByZWdhcmRlZCBhcyBhYnN0cmFjdCBiZWNhdXNlIHRoZXkgY2Fubm90IGJlIGluc3RhbnRpYXRlZCBpbmRlcGVuZGVudGx5LiBUaGV5IGFyZSBvbmx5IGludHJvZHVjZWQgYXMgYW5vbnltb3VzIHN1cGVyY2xhc3NlcyBvZiBvcmRpbmFyeSBjbGFzcyBkZWNsYXJhdGlvbnMgYW5kIG1peGluIGFwcGxpY2F0aW9ucy4gQ29uc2VxdWVudGx5LCBubyB3YXJuaW5nIGlzIGdpdmVuIGlmIGEgbWl4aW4gY29tcG9zaXRpb24gaW5jbHVkZXMgYWJzdHJhY3QgbWVtYmVycywgb3IgaW5jb21wbGV0ZWx5IGltcGxlbWVudHMgYW4gaW50ZXJmYWNlLgp9CgpNaXhpbiBjb21wb3NpdGlvbiBpcyBhc3NvY2lhdGl2ZS4KCgpcY29tbWVudGFyeXsKTm90ZSB0aGF0IGFueSBzdWJzZXQgb2YgJE1fMSQsICRNXzIkIGFuZCAkUyQgbWF5IG9yIG1heSBub3QgYmUgZ2VuZXJpYy4gRm9yIGFueSBub24tZ2VuZXJpYyBkZWNsYXJhdGlvbiwgdGhlIGNvcnJlc3BvbmRpbmcgdHlwZSBwYXJhbWV0ZXJzIG1heSBiZSBlbGlkZWQsIGFuZCBpZiBubyB0eXBlIHBhcmFtZXRlcnMgcmVtYWluIGluIHRoZSBkZXJpdmVkIGRlY2xhcmF0aW9ucyAkSWRfMSQgYW5kL29yICRJZF8yJCB0aGVuIHRoZSB0aG9zZSBkZWNsYXJhdGlvbnMgbmVlZCBub3QgYmUgZ2VuZXJpYyBlaXRoZXIuCn0KCgpcc2VjdGlvbntHZW5lcmljc30KXGxhYmVse2dlbmVyaWNzfQoKQSBjbGFzcyBkZWNsYXJhdGlvbiAoXHJlZntjbGFzc2VzfSkgb3IgdHlwZSBhbGlhcyAoXHJlZnt0eXBlZGVmfSkgCiRHJCBtYXkgYmUge1xlbSBnZW5lcmljfSwgdGhhdCBpcywgJEckIG1heSBoYXZlIGZvcm1hbCB0eXBlIHBhcmFtZXRlcnMgZGVjbGFyZWQuIEEgZ2VuZXJpYyBkZWNsYXJhdGlvbiBpbmR1Y2VzIGEgZmFtaWx5IG9mIGRlY2xhcmF0aW9ucywgb25lIGZvciBlYWNoIHNldCBvZiBhY3R1YWwgdHlwZSBwYXJhbWV0ZXJzIHByb3ZpZGVkIGluIHRoZSBwcm9ncmFtLiAKClxiZWdpbntncmFtbWFyfQp7XGJmIHR5cGVQYXJhbWV0ZXI6fQogICAgIG1ldGFkYXRhIGlkZW50aWZpZXIgKFxFWFRFTkRTe30gdHlwZSk/CiAgICAuCntcYmYgdHlwZVBhcmFtZXRlcnM6fQogICAgIGA8JyB0eXBlUGFyYW1ldGVyIChgLCcgdHlwZVBhcmFtZXRlcikqIGA+JwogICAgLgpcZW5ke2dyYW1tYXJ9CgpBIHR5cGUgcGFyYW1ldGVyICRUJCBtYXkgYmUgc3VmZml4ZWQgd2l0aCBhbiBcRVhURU5EU3t9IGNsYXVzZSB0aGF0IHNwZWNpZmllcyB0aGUge1xlbSB1cHBlciBib3VuZH0gZm9yICRUJC4gSWYgbm8gIFxFWFRFTkRTe30gY2xhdXNlIGlzIHByZXNlbnQsIHRoZSB1cHBlciBib3VuZCBpcyBcY29kZXtPYmplY3R9LiAgSXQgaXMgYSBzdGF0aWMgdHlwZSB3YXJuaW5nIGlmIGEgdHlwZSBwYXJhbWV0ZXIgaXMgYSBzdXBlcnR5cGUgb2YgaXRzIHVwcGVyIGJvdW5kLiBUaGUgYm91bmRzIG9mIHR5cGUgdmFyaWFibGVzIGFyZSBhIGZvcm0gb2YgdHlwZSBhbm5vdGF0aW9uIGFuZCBoYXZlIG5vIGVmZmVjdCBvbiBleGVjdXRpb24gaW4gcHJvZHVjdGlvbiBtb2RlLgoKVGhlIHR5cGUgcGFyYW1ldGVycyBvZiBhIGdlbmVyaWMgJEckIGFyZSBpbiBzY29wZSBpbiB0aGUgYm91bmRzIG9mIGFsbCBvZiB0aGUgdHlwZSBwYXJhbWV0ZXJzIG9mICRHJC4gVGhlIHR5cGUgcGFyYW1ldGVycyBvZiBhIGdlbmVyaWMgY2xhc3MgZGVjbGFyYXRpb24gJEckIGFyZSBhbHNvIGluIHNjb3BlIGluIHRoZSBcRVhURU5EU3t9IGFuZCBcSU1QTEVNRU5UU3t9IGNsYXVzZXMgb2YgJEckIChpZiB0aGVzZSBleGlzdCkgYW5kIGluIHRoZSBib2R5IG9mICRHJC4gICBIb3dldmVyLCBhIHR5cGUgcGFyYW1ldGVyIGlzIGNvbnNpZGVyZWQgdG8gYmUgYSBtYWxmb3JtZWQgdHlwZSB3aGVuIHJlZmVyZW5jZWQgYnkgYSBzdGF0aWMgbWVtYmVyLgoKXHJhdGlvbmFsZXsKVGhlIHJlc3RyaWN0aW9uIGlzIG5lY2Vzc2FyeSBzaW5jZSBhIHR5cGUgdmFyaWFibGUgaGFzIG5vIG1lYW5pbmcgaW4gdGhlIGNvbnRleHQgb2YgYSBzdGF0aWMgbWVtYmVyLCBiZWNhdXNlIHN0YXRpY3MgYXJlIHNoYXJlZCBhbW9uZyBhbGwgaW5zdGFudGlhdGlvbnMgb2YgYSBnZW5lcmljLiBIb3dldmVyLCBhIHR5cGUgdmFyaWFibGUgbWF5IGJlIHJlZmVyZW5jZWQgZnJvbSBhbiBpbnN0YW5jZSBpbml0aWFsaXplciwgZXZlbiB0aG91Z2ggXFRISVN7fSBpcyBub3QgYXZhaWxhYmxlLiAKfQoKXGNvbW1lbnRhcnl7CkJlY2F1c2UgdHlwZSBwYXJhbWV0ZXJzIGFyZSBpbiBzY29wZSBpbiB0aGVpciBib3VuZHMsIHdlIHN1cHBvcnQgRi1ib3VuZGVkIHF1YW50aWZpY2F0aW9uIChpZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHRoYXQgaXMsIGRvbid0IGFzaykuIFRoaXMgZW5hYmxlcyB0eXBlY2hlY2tpbmcgY29kZSBzdWNoIGFzOgp9CgpcYmVnaW57ZGFydENvZGV9ClxJTlRFUkZBQ0V7fSBPcmRlcmVkJDwkVCQ+JCBcewogIG9wZXJhdG9yICQ+JCAoVCB4KTsKXH0KClxDTEFTU3t9IFNvcnRlciQ8JFQgXEVYVEVORFN7fSBPcmRlcmVkJDwkVCQ+PiQgXHsKICAgc29ydChMaXN0JDwkVCQ+JCBsKSB7Li4uIGxbbl0gJDwkIGxbbisxXSAuLi59Clx9CgpcZW5ke2RhcnRDb2RlfQoKXGNvbW1lbnRhcnl7CkV2ZW4gd2hlcmUgdHlwZSBwYXJhbWV0ZXJzIGFyZSBpbiBzY29wZSB0aGVyZSBhcmUgbnVtZXJvdXMgcmVzdHJpY3Rpb25zIGF0IHRoaXMgdGltZToKXGJlZ2lue2l0ZW1pemV9ClxpdGVtIEEgdHlwZSBwYXJhbWV0ZXIgY2Fubm90IGJlIHVzZWQgdG8gbmFtZSBhIGNvbnN0cnVjdG9yIGluIGFuIGluc3RhbmNlIGNyZWF0aW9uIGV4cHJlc3Npb24gKFxyZWZ7aW5zdGFuY2VDcmVhdGlvbn0pLgpcaXRlbSBBIHR5cGUgcGFyYW1ldGVyIGNhbm5vdCBiZSB1c2VkIGFzIGEgc3VwZXJjbGFzcyBvciBzdXBlcmludGVyZmFjZSAoXHJlZntzdXBlcmNsYXNzZXN9LCBccmVme3N1cGVyaW50ZXJmYWNlc30sIFxyZWZ7aW50ZXJmYWNlU3VwZXJpbnRlcmZhY2VzfSkuClxpdGVtIEEgdHlwZSBwYXJhbWV0ZXIgY2Fubm90IGJlIHVzZWQgYXMgYSBnZW5lcmljIHR5cGUuClxlbmR7aXRlbWl6ZX0KClRoZSBub3JtYXRpdmUgdmVyc2lvbnMgb2YgdGhlc2UgIGFyZSBnaXZlbiBpbiB0aGUgYXBwcm9wcmlhdGUgc2VjdGlvbnMgb2YgdGhpcyBzcGVjaWZpY2F0aW9uLiBTb21lIG9mIHRoZXNlIHJlc3RyaWN0aW9ucyBtYXkgYmUgbGlmdGVkIGluIHRoZSBmdXR1cmUuCn0KCiVUaGUge1xlbSBpbmR1Y2VkIHR5cGUgc2V0fSwgJFMkLCBvZiBhIHBhcmFtZXRlcml6ZWQgdHlwZSAkVCQgaXMgdGhlIHNldCBjb25zaXN0aW5nIG9mIAolXGJlZ2lue2l0ZW1pemV9CiVcaXRlbSBUaGUgc3VwZXJ0eXBlcyBvZiBhbnkgdHlwZSBpbiAkUyQuCiVcaXRlbSBUaGUgdHlwZSBhcmd1bWVudHMgb2YgYW55IHBhcmFtZXRlcml6ZWQgdHlwZSBpbiAkUyQuCiVcZW5ke2l0ZW1pemV9CgolTGV0ICRQJCBiZSB0aGUgaW5zdGFudGlhdGlvbiBvZiBhIGdlbmVyaWMgdHlwZSB3aXRoIGl0cyBvd24gdHlwZSBwYXJhbWV0ZXJzLiBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiB0aGUgaW5kdWNlZCB0eXBlIHNldCBvZiAkUCQgaXMgbm90IGZpbml0ZS4KCiVccmF0aW9uYWxlIHtBIHR5cGljYWwgcmVjdXJzaXZlIHR5cGUgZGVjbGFyYXRpb24gc3VjaCBhc30KCiVcYmVnaW57ZGFydENvZGV9CiVcQ0xBU1N7fSBCJDwkUyQ+JCBce1x9CiVcQ0xBU1N7fSBEJDwkVCQ+JCBcRVhURU5EU3t9IEIkPCREJDwkVCQ+PiQgXHtcfQolXGVuZHtkYXJ0Q29kZX0KCiVccmF0aW9uYWxlewolcG9zZXMgbm8gcHJvYmxlbSB1bmRlciB0aGlzIHJ1bGUuIFRoZSBpbnN0YW50aWF0aW9uIFxjZHtEJDwkVCQ+JH0gaGFzIGFuIGluZHVjZWQKJXNldCBjb25zaXN0aW5nIG9mOiBcY2R7QiQ8JEQkPCRUJD4+JCwgT2JqZWN0LCBEJDwkVCQ+JCwgVH0uIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgdmFyaWFudAolfQoKJVxiZWdpbntkYXJ0Q29kZX0KJVxDTEFTU3t9IEIkPCRTJD4kIFx7XH0KJVxDTEFTU3t9IEQkPCRUJD4kIFxFWFRFTkRTe30gQiQ8JEQkPCREJDwkVCQ+Pj4kIFx7XH0KJVxlbmR7ZGFydENvZGV9CgolXHJhdGlvbmFsZXsKJWlzIGRpc2FsbG93ZWQuIENvbnNpZGVyIGFnYWluIHRoZSBpbnN0YW50aWF0aW9uIFxjZHtEJDwkVCQ+JH0uIEl0IGxlYWRzIHRvIHRoZQolc3VwZXJjbGFzcyBcY2R7QiQ8JEQkPCREJDwkVCQ+Pj4kfSwgYW5kIHNvIGFkZHMgXGNke0QkPCREJDwgJFQkPj4kfSB0byB0aGUgaW5kdWNlZCBzZXQuIFRoZSBsYXR0ZXIgaW4gdHVybiBsZWFkcyB0byAgXGNke0IkPCREJDwkRCQ8JEQkPCRUJD4+Pj4kfSBhbmQgXGNke0QkPCREJDwkRCQ8JFQkPj4+JH0KJWFuZCBzbyBvbiBhZCBpbmZpbml0dW0ufQoKJVxjb21tZW50YXJ5ewolVGhlIGFib3ZlIHJlcXVpcmVtZW50IGRvZXMgbm90IHByZWNsdWRlIHRoZSB1c2Ugb2YgYXJiaXRyYXJ5IHJlY3Vyc2l2ZSB0eXBlcyBpbiB0aGUgYm9keSBvZiBhIGdlbmVyaWMgY2xhc3MuIH0KJUEgZ2VuZXJpYyBoYXMgYSB0eXBlIHBhcmFtZXRlciBzY29wZS4gVGhlIGVuY2xvc2luZyBzY29wZSBvZiBhIHR5cGUgcGFyYW1ldGVyIHNjb3BlIG9mIGEgZ2VuZXJpYyBHICBpcyB0aGUgZW5jbG9zaW5nIHNjb3BlIG9mIEcuCgoKJWNsYXNzIFQgey4uLn0KCiVjbGFzcyBHPFQ+IGV4dGVuZHMgVDsKCiVCeSBjdXJyZW50IHJ1bGVzLCB0aGlzIGlzIGlsbGVnYWwuIE1ha2Ugc3VyZSB3ZSBwcmVzZXJ2ZSB0aGlzLgoKCiVcc3Vic2VjdGlvbntJbnRlcmZhY2UgSW5qZWN0aW9ufQolXGxhYmVse2ludGVyZmFjZUluamVjdGlvbn0KCiVBbiB7XGVtIGludGVyZmFjZSBpbmplY3Rpb24gZGVjbGFyYXRpb259IGNhdXNlcyBhIHByZS1leGlzdGluZyBjbGFzcyAkUyQgdG8gYmUgY29uc2lkZXJlZCBhIHN1YmludGVyZmFjZSBvZiBhbm90aGVyIGludGVyZmFjZSAkSSQuIEl0IGlzIGEgc3RhdGljIHR5cGUgd2FybmluZyBpZiAkUyQgaXMgbm90IGEgc3RydWN0dXJhbCBzdWJ0eXBlIG9mICRJJC4gSG93ZXZlciwgdGhlIHN1YmludGVyZmFjZSByZWxhdGlvbnMgaW1wbGllZCBieSB0aGUgaW50ZXJmYWNlIGluamVjdGlvbiBkZWNsYXJhdGlvbiBhcmUgY29uc2lkZXJlZCB0byBob2xkIGJ5IGJvdGggdGhlIHR5cGVjaGVja2VyIGFuZCB0aGUgcnVudGltZSwgcmVnYXJkbGVzcy4KCiVcYmVnaW57Z3JhbW1hcn0KJWNsYXNzSW50ZXJmYWNlSW5qZWN0aW9uOgogICAgICAlY2xhc3MgcXVhbGlmaWVkIHR5cGVQYXJhbWV0ZXJzPyBpbnRlcmZhY2VzICd7XGVzY2FwZWdyYW1tYXIgO30nCiAgICAgICUgIC4KCgolaW50ZXJmYWNlSW50ZXJmYWNlSW5qZWN0aW9uOgogICAgICAlaW50ZXJmYWNlIHF1YWxpZmllZCB0eXBlUGFyYW1ldGVycz8gc3VwZXJpbnRlcmZhY2VzICd7XGVzY2FwZWdyYW1tYXIgO30nCiAgICAlLgolXGVuZHtncmFtbWFyfQoKJVxyYXRpb25hbGV7U2luY2Ugc3ViaW50ZXJmYWNlIHJlbGF0aW9ucyBjYW4gYmUgdGVzdGVkIGR5bmFtaWNhbGx5IHZpYSBcSVN7fSwgaW50ZXJmYWNlIGluamVjdGlvbiBpcyBub3QganVzdCBhIGRpcmVjdGl2ZSB0byB0aGUgc3RhdGljIGNoZWNrZXIuIFRoZSBkeW5hbWljIHJlbGF0aW9ucyBpbXBsaWVkIG11c3QgIGhvbGQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGEgc3RhdGljIHR5cGVjaGVjayBoYXMgc3VjY2VlZGVkLCBvciBoYXMgYmVlbiBwZXJmb3JtZWQgYXQgYWxsLiBUaGlzIG1ha2VzIHNlbnNlIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHByZXNlcnZpbmcgcHJvZ3JhbW1lciBpbnRlbnQuIFRoZSBpbmplY3Rpb24gZGVzY3JpYmVzIGEgbm9taW5hbCB0eXBlIHJlbGF0aW9uIHRoYXQgdGhlIHByb2dyYW1tZXIgd2lzaGVzIHRvIGhvbGQuIEp1c3QgYXMgYSBzdXBlcnR5cGUgbWVudGlvbmVkIHdpdGhpbiBhIGNsYXNzIGRlY2xhcmF0aW9uIGlzIGNvbnNpZGVyZWQgYSBzdXBlcnR5cGUgZXZlbiB0aG91Z2ggdHlwZSBlcnJvcnMgbWlnaHQgYXJpc2UgYW1vbmcgKHNheSkgb3ZlcnJpZGRlbiBhbmQgb3ZlcnJpZGluZyBtZXRob2RzLCBzbyBpdCBtdXN0IGJlIHRoYXQgdGhlIHJlbGF0aW9uIGltcGxpZWQgYnkgYW4gaW5qZWN0aW9uIGhvbGRzIHJlZ2FyZGxlc3Mgb2YgdHlwZSBlcnJvcnMuIAolSW4gYWRkaXRpb24sIHRoaXMgZGVjaXNpb24gaGVscHMgdG8gcHJvZHVjZSBtZWFuaW5nZnVsIGFuZCBsb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZXMuIEFueSBlcnJvcnMgYXJlIHJlcG9ydGVkIGF0IHRoZSBwb2ludCBvZiBpbmplY3Rpb24gcmF0aGVyIHRoYW4gYXQgcHJvZ3JhbSBwb2ludHMgdGhhdCByZWx5IG9uIHRoZSByZWxhdGlvbiAoYSB3ZWxsIGtub3duIHByb2JsZW0gd2l0aCBzdHJ1Y3R1cmFsIHN1YnR5cGluZyBpbiBPTyBzeXN0ZW1zKS4KJX0KCiVcUXtXaGVuIGRvZXMgYW4gaW50ZXJmYWNlIGluamVjdGlvbiB0YWtlIGVmZmVjdD8gV2hlbiB0aGUgY29udGFpbmluZyBsaWJyYXJ5IGlzIGxvYWRlZD8KJVdoYXQgaXMgdGhlIHNjb3BlIG9mIHN1Y2ggYSBkZWNsYXJhdGlvbj8gSXMgaXQgZ2xvYmFsLCBvciBvbmx5IGluIHRoZSBzY29wZSBvZiB0aGUgY29udGFpbmluZyBsaWJyYXJ5PyBUaGUgc2NvcGUgb2Ygc3VjaCBhIGRlY2xhcmF0aW9uIGlzIGdsb2JhbC4gCiVBbiBpbmplY3Rpb24gbXVzdCBiZSBhdCB0b3AgbGV2ZWwuIFdobyBoYXMgdGhlIHJpZ2h0IHRvIGluamVjdCBhbiBpbnRlcmZhY2UgJEkkIGludG8gYW5vdGhlciBjbGFzcyAkQyQ/IEFueWJvZHk/IEJ1dCBzaW5jZSB0aGlzIGFmZmVjdHMgZHluYW1pYyBiZWhhdmlvciwgaXMgdGhpcyBhIHdlaXJkIHNlY3VyaXR5IGlzc3VlPyAKJVRoZSBjdXJyZW50IHRoZW9yeSBpcyB0aGF0IHRoZXJlIGlzIG5vIHNlY3VyaXR5IHdpdGhpbiBhbiBpc29sYXRlLCBhbmQgb25lIGNhbiBuZXZlciByZWZlciB0byBhIHR5cGUgZnJvbSBhbm90aGVyIGlzb2xhdGUsIHNvIHN1cHBvc2VkbHkgbm90IGFuIGlzc3VlLiBUaGlzIGFzc3VtcHRpb24gKG5vIG11dHVhbGx5IHN1c3BpY2lvdXMgY29kZSBpbiB0aGUgc2FtZSBpc29sYXRlKSBpcyBzdXNwZWN0IGJ1dCBpdCBzZWVtcyB0aGVyZSBpcyBub3RoaW5nIHRvIGJlIGRvbmUgYXQgdGhpcyBwb2ludC4KJUlmIGxpYnMgYXJlIGZpcnN0IGNsYXNzLCB0aGV5IGdldCBjcmVhdGVkIGR5bmFtaWNhbGx5IGluIG9yZGVyLCBhbmQgbmV3IGxpYnMgbWlnaHQgbW9kaWZ5IHRoZSB0eXBlIHJlbGF0aW9ucyBhbW9uZyBvdGhlciBsaWJzIHR5cGVzIC0gYnV0IHRoZW4gaXQgaXMgY2xlYXIgd2hlbiB0aGF0IGhhcHBlbmVkIGFuZCBvcmRlciBpcyBvay4KJX0KCiVJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBhIHR5cGUgJFQkIGFwcGVhcnMgbW9yZSB0aGFuIG9uY2UgaW4gdGhlIGltcGxlbWVudHMgb3IgZWV4dGVuZHMgY2xhdXNlIG9mICBhbiBpbnRlcmZhY2UgIGluamVjdGlvbi4KCgpcc2VjdGlvbntNZXRhZGF0YX0KXGxhYmVse21ldGFkYXRhfQoKRGFydCBzdXBwb3J0cyBtZXRhZGF0YSB3aGljaCBpcyB1c2VkIHRvIGF0dGFjaCB1c2VyIGRlZmluZWQgYW5ub3RhdGlvbnMgdG8gcHJvZ3JhbSBzdHJ1Y3R1cmVzLiAgCgpcYmVnaW57Z3JhbW1hcn0Ke1xiZiBtZXRhZGF0YTp9CiAgICAgIChgQCcgcXVhbGlmaWVkICh7XGVzY2FwZWdyYW1tYXIgYC4nfSBpZGVudGlmaWVyKT8gKGFyZ3VtZW50cyk/KSoKICAgIC4KXGVuZHtncmFtbWFyfQoKTWV0YWRhdGEgY29uc2lzdHMgb2YgYSBzZXJpZXMgb2YgYW5ub3RhdGlvbnMsIGVhY2ggb2Ygd2hpY2ggYmVnaW4gd2l0aCB0aGUgY2hhcmFjdGVyIEAsIGZvbGxvd2VkIGJ5ICBhIGNvbnN0YW50IGV4cHJlc3Npb24gdGhhdCBzdGFydHMgd2l0aCBhbiBpZGVudGlmaWVyLiBJdCBpcyBhIGNvbXBpbGUgdGltZSBlcnJvciBpZiB0aGUgZXhwcmVzc2lvbiBpcyBub3Qgb25lIG9mIHRoZSBmb2xsb3dpbmc6ClxiZWdpbntpdGVtaXplfQpcaXRlbSBBIHJlZmVyZW5jZSB0byBhIGNvbXBpbGUtdGltZSBjb25zdGFudCB2YXJpYWJsZS4KXGl0ZW0gQSBjYWxsIHRvIGEgY29uc3RhbnQgY29uc3RydWN0b3IuClxlbmR7aXRlbWl6ZX0KCk1ldGFkYXRhIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWJzdHJhY3Qgc3ludGF4IHRyZWUgb2YgdGhlIHByb2dyYW0gY29uc3RydWN0ICRwJCB0aGF0IGltbWVkaWF0ZWx5IGZvbGxvd3MgdGhlIG1ldGFkYXRhLCBhc3N1bWluZyAkcCQgaXMgbm90IGl0c2VsZiBtZXRhZGF0YSBvciBhIGNvbW1lbnQuIE1ldGFkYXRhIGNhbiBiZSByZXRyaWV2ZWQgYXQgcnVudGltZSB2aWEgYSByZWZsZWN0aXZlIGNhbGwsIHByb3ZpZGVkIHRoZSBhbm5vdGF0ZWQgcHJvZ3JhbSBjb25zdHJ1Y3QgJHAkIGlzIGFjY2Vzc2libGUgdmlhIHJlZmxlY3Rpb24uCgpcY29tbWVudGFyeXsKT2J2aW91c2x5LCBtZXRhZGF0YSBjYW4gYWxzbyBiZSByZXRyaWV2ZWQgc3RhdGljYWxseSBieSBwYXJzaW5nIHRoZSBwcm9ncmFtIGFuZCBldmFsdWF0aW5nIHRoZSBjb25zdGFudHMgdmlhIGEgc3VpdGFibGUgaW50ZXJwcmV0ZXIuIEluIGZhY3QgbWFueSBpZiBub3QgbW9zdCB1c2VzIG9mIG1ldGFkYXRhIGFyZSBlbnRpcmVseSBzdGF0aWMuCn0KClxyYXRpb25hbGV7Ckl0IGlzIGltcG9ydGFudCB0aGF0IG5vIHJ1bnRpbWUgb3ZlcmhlYWQgYmUgaW5jdXJyZWQgYnkgdGhlIGludHJvZHVjdGlvbiBvZiBtZXRhZGF0YSB0aGF0IGlzIG5vdCBhY3R1YWxseSB1c2VkLiBCZWNhdXNlIG1ldGFkYXRhIG9ubHkgaW52b2x2ZXMgY29uc3RhbnRzLCB0aGUgdGltZSBhdCB3aGljaCBpdCBpcyBjb21wdXRlZCBpcyBpcnJlbGV2YW50IHNvIHRoYXQgaW1wbGVtZW50YXRpb25zIG1heSBza2lwIHRoZSBtZXRhZGF0YSBkdXJpbmcgb3JkaW5hcnkgcGFyc2luZyBhbmQgZXhlY3V0aW9uIGFuZCBldmFsdWF0ZSBpdCBsYXppbHkuCn0KClxjb21tZW50YXJ5ewpJdCBpcyBwb3NzaWJsZSB0byBhc3NvY2lhdGUgbWV0YWRhdGEgd2l0aCBjb25zdHJ1Y3RzIHRoYXQgbWF5IG5vdCBiZSBhY2Nlc3NpYmxlIHZpYSByZWZsZWN0aW9uLCBzdWNoIGFzIGxvY2FsIHZhcmlhYmxlcyAodGhvdWdoIGl0IGlzIGNvbmNlaXZhYmxlIHRoYXQgaW4gdGhlIGZ1dHVyZSwgcmljaGVyIHJlZmxlY3RpdmUgbGlicmFyaWVzIG1pZ2h0IHByb3ZpZGUgYWNjZXNzIHRvIHRoZXNlIGFzIHdlbGwpLiAgVGhpcyBpcyBub3QgYXMgdXNlbGVzcyBhcyBpdCBtaWdodCBzZWVtLiBBcyBub3RlZCBhYm92ZSwgdGhlIGRhdGEgY2FuIGJlIHJldHJpZXZlZCBzdGF0aWNhbGx5IGlmIHNvdXJjZSBjb2RlIGlzIGF2YWlsYWJsZS4KfQoKTWV0YWRhdGEgY2FuIGFwcGVhciBiZWZvcmUgYSBsaWJyYXJ5LCBwYXJ0IGhlYWRlciwgY2xhc3MsIHR5cGVkZWYsIHR5cGUgcGFyYW1ldGVyLCBjb25zdHJ1Y3RvciwgZmFjdG9yeSwgZnVuY3Rpb24sIGZpZWxkLCBwYXJhbWV0ZXIsIG9yIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGFuZCBiZWZvcmUgYW4gaW1wb3J0LCBleHBvcnQgb3IgcGFydCBkaXJlY3RpdmUuCgpUaGUgY29uc3RhbnQgZXhwcmVzc2lvbiBnaXZlbiBpbiBhbiBhbm5vdGF0aW9uICBpcyB0eXBlIGNoZWNrZWQgYW5kIGV2YWx1YXRlZCBpbiB0aGUgc2NvcGUgc3Vycm91bmRpbmcgdGhlIGRlY2xhcmF0aW9uIGJlaW5nIGFubm90YXRlZC4gIAoKClxzZWN0aW9ue0V4cHJlc3Npb25zfQpcbGFiZWx7ZXhwcmVzc2lvbnN9CgpBbiB7XGVtIGV4cHJlc3Npb259IGlzIGEgZnJhZ21lbnQgb2YgRGFydCBjb2RlIHRoYXQgY2FuIGJlIGV2YWx1YXRlZCBhdCBydW4gdGltZSB0byB5aWVsZCBhIHtcZW0gdmFsdWV9LCB3aGljaCBpcyBhbHdheXMgYW4gb2JqZWN0LiBFdmVyeSBleHByZXNzaW9uIGhhcyBhbiBhc3NvY2lhdGVkIHN0YXRpYyB0eXBlIChccmVme3N0YXRpY1R5cGVzfSkuIEV2ZXJ5IHZhbHVlIGhhcyBhbiBhc3NvY2lhdGVkIGR5bmFtaWMgdHlwZSAoXHJlZntkeW5hbWljVHlwZVN5c3RlbX0pLgoKClxiZWdpbntncmFtbWFyfQoKe1xiZiBleHByZXNzaW9uOn1hc3NpZ25hYmxlRXhwcmVzc2lvbiBhc3NpZ25tZW50T3BlcmF0b3IgZXhwcmVzc2lvbjsKICAgICAgIGNvbmRpdGlvbmFsRXhwcmVzc2lvbiBjYXNjYWRlU2VjdGlvbio7CiAgICAgICB0aHJvd0V4cHJlc3Npb24gICAgIAogICAgLgogICAgIAogICAgCntcYmYgZXhwcmVzc2lvbldpdGhvdXRDYXNjYWRlOn1hc3NpZ25hYmxlRXhwcmVzc2lvbiBhc3NpZ25tZW50T3BlcmF0b3IgZXhwcmVzc2lvbldpdGhvdXRDYXNjYWRlOwogICAgICBjb25kaXRpb25hbEV4cHJlc3Npb247CiAgICAgIHRocm93RXhwcmVzc2lvbldpdGhvdXRDYXNjYWRlICAgIAogICAgLgoKe1xiZiBleHByZXNzaW9uTGlzdDp9CiAgICAgIGV4cHJlc3Npb24gKGAsJyBleHByZXNzaW9uKSogJXNob3VsZCB0aGVzZSBiZSB0b3AgbGV2ZWwgZXhwcmVzc2lvbnM/CiAgICAuClxlbmR7Z3JhbW1hcn0gICAgCgpcYmVnaW57Z3JhbW1hcn0Ke1xiZiBwcmltYXJ5On10aGlzRXhwcmVzc2lvbjsKICAgICAgXFNVUEVSe30gYXNzaWduYWJsZVNlbGVjdG9yOwogICAgICBmdW5jdGlvbkV4cHJlc3Npb247CiAgICAgIGxpdGVyYWw7CiAgICAgIGlkZW50aWZpZXI7CiAgICAgIG5ld0V4cHJlc3Npb247CiAgICAgIGNvbnN0T2JqZWN0RXhwcmVzc2lvbjsKICAgICAgYCgnIGV4cHJlc3Npb24gYCknCiAgICAuCiAgICAKXGVuZHtncmFtbWFyfSAgIAoKQW4gZXhwcmVzc2lvbiAkZSQgbWF5IGFsd2F5cyBiZSBlbmNsb3NlZCBpbiBwYXJlbnRoZXNlcywgYnV0IHRoaXMgbmV2ZXIgaGFzIGFueSBzZW1hbnRpYyBlZmZlY3Qgb24gJGUkLgoKXGNvbW1lbnRhcnl7ClNhZGx5LCBpdCBtYXkgaGF2ZSBhbiBlZmZlY3Qgb24gdGhlIHN1cnJvdW5kaW5nIGV4cHJlc3Npb24uIEdpdmVuIGEgY2xhc3MgJEMkIHdpdGggc3RhdGljIG1ldGhvZCAkbSA9PiA0MiQsICRDLm0oKSQgcmV0dXJucyA0MiwgYnV0ICQoQykubSgpJCBwcm9kdWNlcyBhIFxjb2Rle05vU3VjaE1ldGhvZEVycm9yfS4gIFRoaXMgYW5vbWFseSBjYW4gYmUgY29ycmVjdGVkIGJ5IGVuc3VyaW5nIHRoYXQgZXZlcnkgaW5zdGFuY2Ugb2YgXGNvZGV7VHlwZX0gaGFzIGluc3RhbmNlIG1lbWJlcnMgY29ycmVzcG9uZGluZyB0byBpdHMgc3RhdGljIG1lbWJlcnMuIFRoaXMgaXNzdWUgbWF5IGJlIGFkZHJlc3NlZCBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgRGFydCAuCn0KCiBcc3Vic3Vic2VjdGlvbntPYmplY3QgSWRlbnRpdHl9CiBcbGFiZWx7b2JqZWN0SWRlbnRpdHl9CiAKVGhlIHByZWRlZmluZWQgRGFydCBmdW5jdGlvbiBcY2R7aWRlbnRpY2FsKCl9IGlzIGRlZmluZWQgc3VjaCB0aGF0IFxjb2Rle2lkZW50aWNhbCgkY18xJCwgJGNfMiQpfSBpZmY6CiBcYmVnaW57aXRlbWl6ZX0KIFxpdGVtICRjXzEkICBldmFsdWF0ZXMgdG8gZWl0aGVyIFxOVUxMe30gb3IgIGFuIGluc3RhbmNlIG9mIFxjb2Rle2Jvb2x9IGFuZCBcY29kZXskY18xJCA9PSAkY18yJH0sIE9SCiBcaXRlbSAkY18xJCBhbmQgJGNfMiQgYXJlIGluc3RhbmNlcyBvZiBcY29kZXtpbnR9IGFuZCBcY29kZXskY18xJCA9PSAkY18yJH0sIE9SCiBcaXRlbSAkY18xJCBhbmQgJGNfMiQgYXJlIGNvbnN0YW50IHN0cmluZ3MgYW5kIFxjb2RleyRjXzEkID09ICRjXzIkfSwgT1IKIFxpdGVtICRjXzEkICBhbmQgJGNfMiQgIGFyZSBpbnN0YW5jZXMgb2YgXGNke2RvdWJsZX0gYW5kICBvbmUgb2YgdGhlIGZvbGxvd2luZyBob2xkczoKIFxiZWdpbntpdGVtaXplfQogICBcaXRlbSAkY18xJCBhbmQgJGNfMiQgYXJlIG5vbi16ZXJvIGFuZCBcY29kZXskY18xJCA9PSAkY18yJH0uCiAgIFxpdGVtICBCb3RoICRjXzEkIGFuZCAkY18yJCBhcmUgJCswLjAkLgogICBcaXRlbSBCb3RoICAkY18xJCBhbmQgJGNfMiQgYXJlICQtMC4wJC4KICAgXGl0ZW0gQm90aCAkY18xJCBhbmQgJGNfMiQgcmVwcmVzZW50IGEgTmFOIHZhbHVlIHdpdGggdGhlIHNhbWUgdW5kZXJseWluZyBiaXQgcGF0dGVybi4KIFxlbmR7aXRlbWl6ZX0KIE9SCiBcaXRlbSAkY18xJCBhbmQgJGNfMiQgYXJlIGNvbnN0YW50IGxpc3RzIHRoYXQgYXJlIGRlZmluZWQgdG8gYmUgaWRlbnRpY2FsIGluIHRoZSBzcGVjaWZpY2F0aW9uIG9mIGxpdGVyYWwgbGlzdCBleHByZXNzaW9ucyAoXHJlZntsaXN0c30pLCBPUgogXGl0ZW0gJGNfMSQgYW5kICRjXzIkIGFyZSBjb25zdGFudCBtYXBzIHRoYXQgYXJlIGRlZmluZWQgdG8gYmUgaWRlbnRpY2FsIGluIHRoZSBzcGVjaWZpY2F0aW9uIG9mIGxpdGVyYWwgbWFwIGV4cHJlc3Npb25zIChccmVme21hcHN9KSwgT1IKIFxpdGVtICRjXzEkIGFuZCAkY18yJCBhcmUgY29uc3RhbnQgb2JqZWN0cyBvZiB0aGUgc2FtZSBjbGFzcyAkQyQgYW5kIGVhY2ggbWVtYmVyIGZpZWxkIG9mICRjXzEkIGlzIGlkZW50aWNhbCB0byB0aGUgY29ycmVzcG9uZGluZyBmaWVsZCBvZiAkY18yJC4gT1IKXGl0ZW0gJGNfMSQgYW5kICRjXzIkIGFyZSB0aGUgc2FtZSBvYmplY3QuClxlbmR7aXRlbWl6ZX0KICAgIApcY29tbWVudGFyeXsKVGhlIGRlZmluaXRpb24gb2YgXGNke2lkZW50aXR5fSBmb3IgZG91YmxlcyBkaWZmZXJzIGZyb20gdGhhdCBvZiBlcXVhbGl0eSBpbiB0aGF0IGEgTmFOIGlzIGVxdWFsIHRvIGl0c2VsZiwgYW5kIHRoYXQgbmVnYXRpdmUgYW5kIHBvc2l0aXZlIHplcm8gYXJlIGRpc3RpbmN0LiAgCn0KClxyYXRpb25hbGV7ClRoZSBkZWZpbml0aW9uIG9mIGVxdWFsaXR5IGZvciBkb3VibGVzIGlzIGRpY3RhdGVkIGJ5IHRoZSBJRUVFIDc1NCBzdGFuZGFyZCwgd2hpY2ggcG9zaXRzIHRoYXQgTmFOcyBkbyBub3Qgb2JleSB0aGUgbGF3IG9mIHJlZmxleGl2aXR5LiAgR2l2ZW4gdGhhdCBoYXJkd2FyZSBpbXBsZW1lbnRzIHRoZXNlIHJ1bGVzLCBpdCBpcyBuZWNlc3NhcnkgdG8gc3VwcG9ydCB0aGVtIGZvciByZWFzb25zIG9mIGVmZmljaWVuY3kuCgpUaGUgZGVmaW5pdGlvbiBvZiBpZGVudGl0eSBpcyBub3QgY29uc3RyYWluZWQgaW4gdGhlIHNhbWUgd2F5LiBJbnN0ZWFkLCBpdCBhc3N1bWVzIHRoYXQgYml0LWlkZW50aWNhbCBkb3VibGVzIGFyZSBpZGVudGljYWwuCgpUaGUgcnVsZXMgZm9yIGlkZW50aXR5IG1ha2UgaXQgaW1wb3NzaWJsZSBmb3IgYSBEYXJ0IHByb2dyYW1tZXIgdG8gb2JzZXJ2ZSB3aGV0aGVyIGEgYm9vbGVhbiBvciBudW1lcmljYWwgdmFsdWUgaXMgYm94ZWQgb3IgdW5ib3hlZC4KfQogICAgCiAgICAKXHN1YnNlY3Rpb257Q29uc3RhbnRzfQpcbGFiZWx7Y29uc3RhbnRzfQoKQSB7XGVtIGNvbnN0YW50IGV4cHJlc3Npb259IGlzIGFuIGV4cHJlc3Npb24gd2hvc2UgdmFsdWUgY2FuIG5ldmVyIGNoYW5nZSwgYW5kIHRoYXQgY2FuIGJlIGV2YWx1YXRlZCBlbnRpcmVseSBhdCBjb21waWxlIHRpbWUuIAoKQSBjb25zdGFudCBleHByZXNzaW9uIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gQSBsaXRlcmFsIG51bWJlciAoXHJlZntudW1iZXJzfSkuClxpdGVtIEEgbGl0ZXJhbCBib29sZWFuIChccmVme2Jvb2xlYW5zfSkuClxpdGVtIEEgbGl0ZXJhbCBzdHJpbmcgKFxyZWZ7c3RyaW5nc30pIHdoZXJlIGFueSBpbnRlcnBvbGF0ZWQgZXhwcmVzc2lvbiAgKFxyZWZ7c3RyaW5nSW50ZXJwb2xhdGlvbn0pIGlzIGEgY29tcGlsZS10aW1lIGNvbnN0YW50IHRoYXQgZXZhbHVhdGVzIHRvIGEgbnVtZXJpYywgc3RyaW5nIG9yIGJvb2xlYW4gdmFsdWUgb3IgdG8gXE5VTEx7fS4KXHJhdGlvbmFsZXtJdCB3b3VsZCBiZSB0ZW1wdGluZyB0byBhbGxvdyBzdHJpbmcgaW50ZXJwb2xhdGlvbiB3aGVyZSB0aGUgaW50ZXJwb2xhdGVkIHZhbHVlIGlzIGFueSBjb21waWxlLXRpbWUgY29uc3RhbnQuICBIb3dldmVyLCB0aGlzIHdvdWxkIHJlcXVpcmUgcnVubmluZyB0aGUgXGNvZGV7dG9TdHJpbmcoKX0gbWV0aG9kIGZvciBjb25zdGFudCBvYmplY3RzLCB3aGljaCBjb3VsZCBjb250YWluIGFyYml0cmFyeSBjb2RlLn0KXGl0ZW0gQSBsaXRlcmFsIHN5bWJvbCAoXHJlZntzeW1ib2xzfSkuClxpdGVtIFxOVUxMe30gKFxyZWZ7bnVsbH0pLgpcaXRlbSBBIHF1YWxpZmllZCByZWZlcmVuY2UgdG8gYSBzdGF0aWMgY29uc3RhbnQgdmFyaWFibGUgKFxyZWZ7dmFyaWFibGVzfSkgdGhhdCBpcyBub3QgcXVhbGlmaWVkIGJ5IGEgZGVmZXJyZWQgcHJlZml4LiAKXGNvbW1lbnRhcnkge0ZvciBleGFtcGxlLCBJZiBjbGFzcyBDIGRlY2xhcmVzIGEgY29uc3RhbnQgc3RhdGljIHZhcmlhYmxlIHYsIEMudiBpcyBhIGNvbnN0YW50LiBUaGUgc2FtZSBpcyB0cnVlIGlmIEMgaXMgYWNjZXNzZWQgdmlhIGEgcHJlZml4IHA7IHAuQy52IGlzIGEgY29uc3RhbnQgIHVubGVzcyBwIGlzIGEgZGVmZXJyZWQgcHJlZml4Lgp9ClxpdGVtIEFuIGlkZW50aWZpZXIgZXhwcmVzc2lvbiB0aGF0IGRlbm90ZXMgYSBjb25zdGFudCB2YXJpYWJsZS4gJUNIQU5HRSBpbiBnb29nbGVkb2MKXGl0ZW0gQSBzaW1wbGUgb3IgcXVhbGlmaWVkIGlkZW50aWZpZXIgZGVub3RpbmcgYSBjbGFzcyBvciBhIHR5cGUgYWxpYXMuIApcY29tbWVudGFyeSB7Rm9yIGV4YW1wbGUsIGlmIEMgaXMgYSBjbGFzcyBvciB0eXBlZGVmIEMgaXMgYSBjb25zdGFudCwgYW5kIGlmIEMgaXMgaW1wb3J0ZWQgd2l0aCBhIHByZWZpeCBwLCAgcC5DIGlzIGEgY29uc3RhbnQuCn0KXGl0ZW0gQSBjb25zdGFudCBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uIChccmVme2NvbnN0fSkgdGhhdCBpcyBub3QgcXVhbGlmaWVkIGJ5IGEgZGVmZXJyZWQgcHJlZml4LiAgClxpdGVtIEEgY29uc3RhbnQgbGlzdCBsaXRlcmFsIChccmVme2xpc3RzfSkuClxpdGVtIEEgY29uc3RhbnQgbWFwIGxpdGVyYWwgKFxyZWZ7bWFwc30pLgpcaXRlbSBBIHNpbXBsZSBvciBxdWFsaWZpZWQgaWRlbnRpZmllciBkZW5vdGluZyBhIHRvcC1sZXZlbCBmdW5jdGlvbiAoXHJlZntmdW5jdGlvbnN9KSBvciBhIHN0YXRpYyBtZXRob2QgKFxyZWZ7c3RhdGljTWV0aG9kc30pIHRoYXQgaXMgbm90IHF1YWxpZmllZCBieSBhIGRlZmVycmVkIHByZWZpeC4KXGl0ZW0gQSBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb24gXGNvZGV7KCRlJCl9IHdoZXJlICRlJCBpcyBhIGNvbnN0YW50IGV4cHJlc3Npb24uClxpdGVtIEFuIGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gXGNvZGV7aWRlbnRpY2FsKCRlXzEkLCAkZV8yJCl9IHdoZXJlICRlXzEkIGFuZCAkZV8yJCBhcmUgY29uc3RhbnQgZXhwcmVzc2lvbnMgIGFuZCBcY29kZXtpZGVudGljYWwoKX0gaXMgc3RhdGljYWxseSBib3VuZCB0byB0aGUgcHJlZGVmaW5lZCBkYXJ0IGZ1bmN0aW9uICAgXGNvZGV7aWRlbnRpY2FsKCl9IGRpc2N1c3NlZCBhYm92ZSAoXHJlZntvYmplY3RJZGVudGl0eX0pLgpcaXRlbSBBbiBleHByZXNzaW9uIG9mIG9uZSBvZiB0aGUgZm9ybXMgIFxjb2RleyRlXzEkID09ICRlXzIkfSBvciAgXGNvZGV7JGVfMSQgIT0gJGVfMiR9IHdoZXJlICRlXzEkIGFuZCAkZV8yJCBhcmUgY29uc3RhbnQgZXhwcmVzc2lvbnMgdGhhdCBldmFsdWF0ZSB0byBhIG51bWVyaWMsIHN0cmluZyBvciBib29sZWFuIHZhbHVlIG9yIHRvIFxOVUxMe30uClxpdGVtIEFuIGV4cHJlc3Npb24gb2Ygb25lIG9mIHRoZSBmb3JtcyBcY29kZXshJGUkfSwgXGNvZGV7JGVfMSQgXCZcJiAkZV8yJH0gb3IgXGNvZGV7JGVfMSB8fCBlXzIkfSwgd2hlcmUgICRlJCwgJGVfMSQgYW5kICRlXzIkIGFyZSBjb25zdGFudCBleHByZXNzaW9ucyB0aGF0IGV2YWx1YXRlIHRvIGEgYm9vbGVhbiB2YWx1ZS4KXGl0ZW0gQW4gZXhwcmVzc2lvbiBvZiBvbmUgb2YgdGhlIGZvcm1zIFx+e30kZSQsICRlXzEkIFxee30gJGVfMiQsIFxjb2RleyRlXzEkIFwmICRlXzIkfSwgJGVfMSB8IGVfMiQsICRlXzEgPj4gZV8yJCBvciAkZV8xIDw8ICBlXzIkLCB3aGVyZSAgJGUkLCAkZV8xJCBhbmQgJGVfMiQgYXJlIGNvbnN0YW50IGV4cHJlc3Npb25zIHRoYXQgZXZhbHVhdGUgdG8gYW4gaW50ZWdlciB2YWx1ZSAgb3IgdG8gXE5VTEx7fS4KXGl0ZW0gQW4gZXhwcmVzc2lvbiBvZiBvbmUgb2YgdGhlIGZvcm1zIFxjb2RleyQtZSR9LCAgXGNvZGV7JGVfMSArIGVfMiR9LCBcY29kZXskZV8xJCAtICRlXzIkfSwgXGNvZGV7JGVfMSQgKiAkZV8yJH0sIFxjb2RleyRlXzEkIC8gJGVfMiQsfSBcY29kZXskZV8xJCBcfnt9LyAkZV8yJH0sICBcY29kZXskZV8xICA+ICBlXzIkfSwgXGNvZGV7JGVfMSAgPCAgZV8yJH0sIFxjb2RleyRlXzEkICQ+JD0gJGVfMiR9LCBcY29kZXskZV8xJCAkPCQ9ICRlXzIkfSBvciBcY29kZXskZV8xJCBcJSAkZV8yJH0sICB3aGVyZSAkZSQsICRlXzEkIGFuZCAkZV8yJCBhcmUgY29uc3RhbnQgZXhwcmVzc2lvbnMgdGhhdCBldmFsdWF0ZSB0byBhIG51bWVyaWMgdmFsdWUgIG9yIHRvIFxOVUxMe30uClxpdGVtIEFuIGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gXGNvZGV7JGVfMSQ/JGVfMiQ6JGUzJH0gd2hlcmUgd2hlcmUgJGVfMSQsICRlXzIkIGFuZCAkZV8zJCBhcmUgY29uc3RhbnQgZXhwcmVzc2lvbnMgYW5kICRlXzEkIGV2YWx1YXRlcyB0byBhIGJvb2xlYW4gdmFsdWUuClxlbmR7aXRlbWl6ZX0KCiUgbnVsbCBpbiBhbGwgdGhlIGV4cHJlc3Npb25zCgolIGRlc2lnbmVkIHNvIGNvbnN0YW50cyBkbyBub3QgZGVwZW5kIG9uIGNoZWNrIGRpb2RlIGJlaW5nIG9uIG9yIG5vdC4KCkl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIGFuIGV4cHJlc3Npb24gaXMgcmVxdWlyZWQgdG8gYmUgYSBjb25zdGFudCBleHByZXNzaW9uIGJ1dCBpdHMgZXZhbHVhdGlvbiAgd291bGQgcmFpc2UgYW4gZXhjZXB0aW9uLiAKCiUgc28sIGNoZWNrZWQgbW9kZT8gYW5hbHl6ZXJzPyBlZGl0b3IvZGV2ZWxvcG1lbnQgY29tcGlsZXJzPwpcY29tbWVudGFyeXsKTm90ZSB0aGF0IHRoZXJlIGlzIG5vIHJlcXVpcmVtZW50IHRoYXQgZXZlcnkgY29uc3RhbnQgZXhwcmVzc2lvbiBldmFsdWF0ZSBjb3JyZWN0bHkuIE9ubHkgd2hlbiBhIGNvbnN0YW50IGV4cHJlc3Npb24gaXMgcmVxdWlyZWQgKGUuZy4sIHRvIGluaXRpYWxpemUgYSBjb25zdGFudCB2YXJpYWJsZSwgb3IgYXMgYSBkZWZhdWx0IHZhbHVlIG9mIGEgZm9ybWFsIHBhcmFtZXRlciwgb3IgYXMgbWV0YWRhdGEpIGRvIHdlIGluc2lzdCB0aGF0IGEgY29uc3RhbnQgZXhwcmVzc2lvbiBhY3R1YWxseSBiZSBldmFsdWF0ZWQgc3VjY2Vzc2Z1bGx5IGF0IGNvbXBpbGUgdGltZS4KClRoZSBhYm92ZSBpcyBub3QgZGVwZW5kZW50IG9uIHByb2dyYW0gY29udHJvbC1mbG93LiBUaGUgbWVyZSBwcmVzZW5jZSBvZiBhIHJlcXVpcmVkIGNvbXBpbGUgdGltZSBjb25zdGFudCB3aG9zZSBldmFsdWF0aW9uIHdvdWxkIGZhaWwgd2l0aGluIGEgcHJvZ3JhbSBpcyBhbiBlcnJvci4gIFRoaXMgYWxzbyBob2xkcyByZWN1cnNpdmVseTogc2luY2UgY29tcG91bmQgY29uc3RhbnRzIGFyZSBjb21wb3NlZCBvdXQgb2YgY29uc3RhbnRzLCBpZiBhbnkgc3VicGFydCBvZiBhIGNvbnN0YW50ICB3b3VsZCByYWlzZSBhbiBleGNlcHRpb24gd2hlbiBldmFsdWF0ZWQsIHRoYXQgaXMgYW4gZXJyb3IuCgpPbiB0aGUgb3RoZXIgaGFuZCwgc2luY2UgaW1wbGVtZW50YXRpb25zIGFyZSBmcmVlIHRvIGNvbXBpbGUgY29kZSBsYXRlLCBzb21lIGNvbXBpbGUtdGltZSBlcnJvcnMgbWF5IG1hbmlmZXN0IHF1aXRlIGxhdGUuCn0KClxiZWdpbntkYXJ0Q29kZX0KXENPTlNUe30geCA9IDEvMDsKXEZJTkFMe30geSA9IDEvMDsKClxDTEFTU3t9IEsgXHsKICBtMSgpIFx7CiAgIFxWQVJ7fSB6ID0gXEZBTFNFe307CiAgICBcSUZ7fSAoeikgXHtcUkVUVVJOe30geDsgXH0KICAgIFxFTFNFe30gXHsgXFJFVFVSTnt9IDI7XH0KICBcfQogIAogIG0yKCkgXHsKICAgIFxJRnt9IChcVFJVRXt9KSBce1xSRVRVUk57fSB5OyBcfQogICAgXEVMU0V7fSBceyBcUkVUVVJOe30gMztcfQogIFx9ICAKXH0KXGVuZHtkYXJ0Q29kZX0KClxjb21tZW50YXJ5e0FuIGltcGxlbWVudGF0aW9uIGlzIGZyZWUgdG8gaW1tZWRpYXRlbHkgaXNzdWUgYSBjb21waWxhdGlvbiBlcnJvciBmb3IgIFxjb2Rle3h9LCBidXQgaXQgaXMgbm90IHJlcXVpcmVkIHRvIGRvIHNvLiAgSXQgY291bGQgZGVmZXIgZXJyb3JzIGlmIGl0IGRvZXMgbm90IGltbWVkaWF0ZWx5IGNvbXBpbGUgdGhlIGRlY2xhcmF0aW9ucyB0aGF0IHJlZmVyZW5jZSBcY29kZXt4fS4gRm9yIGV4YW1wbGUsIGl0IGNvdWxkIGRlbGF5IGdpdmluZyBhIGNvbXBpbGF0aW9uIGVycm9yIGFib3V0IHRoZSBtZXRob2QgXGNvZGV7bTF9IHVudGlsIHRoZSBmaXJzdCBpbnZvY2F0aW9uIG9mIFxjb2Rle20xfS4gSG93ZXZlciwgaXQgY291bGQgbm90IGNob29zZSB0byBleGVjdXRlIFxjb2Rle20xfSwgIHNlZSB0aGF0IHRoZSBicmFuY2ggdGhhdCByZWZlcnMgdG8gXGNvZGV7eH0gaXMgbm90IHRha2VuIGFuZCByZXR1cm4gMiBzdWNjZXNzZnVsbHkuIAoKVGhlIHNpdHVhdGlvbiB3aXRoIHJlc3BlY3QgdG8gYW4gaW52b2NhdGlvbiBcY29kZXttMn0gaXMgZGlmZmVyZW50LiBCZWNhdXNlIFxjb2Rle3l9IGlzIG5vdCBhIGNvbXBpbGUtdGltZSBjb25zdGFudCAoZXZlbiB0aG91Z2ggaXRzIHZhbHVlIGlzKSwgb25lIG5lZWQgbm90IGdpdmUgYSBjb21waWxlLXRpbWUgZXJyb3IgdXBvbiBjb21waWxpbmcgXGNvZGV7bTJ9LiBBbiBpbXBsZW1lbnRhdGlvbiBtYXkgcnVuIHRoZSBjb2RlLCB3aGljaCB3aWxsIGNhdXNlICB0aGUgZ2V0dGVyIGZvciBcY29kZXt5fSB0byBiZSBpbnZva2VkLiBBdCB0aGF0IHBvaW50LCB0aGUgaW5pdGlhbGl6YXRpb24gb2YgXGNvZGV7eX0gbXVzdCB0YWtlIHBsYWNlLCB3aGljaCByZXF1aXJlcyB0aGUgaW5pdGlhbGl6ZXIgdG8gYmUgY29tcGlsZWQsIHdoaWNoIHdpbGwgY2F1c2UgYSBjb21waWxhdGlvbiBlcnJvci4KfQoKXHJhdGlvbmFsZXsKVGhlIHRyZWF0bWVudCBvZiBcTlVMTHt9IG1lcml0cyBzb21lIGRpc2N1c3Npb24uIENvbnNpZGVyIFxjb2Rle1xOVUxMe30gKyAyfS4gIFRoaXMgZXhwcmVzc2lvbiBhbHdheXMgY2F1c2VzIGFuIGVycm9yLiBXZSBjb3VsZCBoYXZlIGNob3NlbiBub3QgdG8gdHJlYXQgaXQgYXMgYSBjb25zdGFudCBleHByZXNzaW9uIChhbmQgaW4gZ2VuZXJhbCwgbm90IHRvIGFsbG93IFxOVUxMe30gYXMgYSBzdWJleHByZXNzaW9uIG9mIG51bWVyaWMgb3IgYm9vbGVhbiBjb25zdGFudCBleHByZXNzaW9ucykuICBUaGVyZSBhcmUgdHdvIGFyZ3VtZW50cyBmb3IgaW5jbHVkaW5nIGl0OgpcYmVnaW57ZW51bWVyYXRlfQpcaXRlbSBJdCBpcyBjb25zdGFudC4gV2UgY2FuIGV2YWx1YXRlIGl0IGF0IGNvbXBpbGUtdGltZS4gClxpdGVtIEl0IHNlZW1zIG1vcmUgdXNlZnVsIHRvIGdpdmUgdGhlIGVycm9yIHN0ZW1taW5nIGZyb20gdGhlIGV2YWx1YXRpb24gZXhwbGljaXRseS4KXGVuZHtlbnVtZXJhdGV9Cn0KCkl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIHRoZSB2YWx1ZSBvZiBhIGNvbXBpbGUtdGltZSBjb25zdGFudCBleHByZXNzaW9uIGRlcGVuZHMgb24gaXRzZWxmLgoKXGNvbW1lbnRhcnl7CkFzIGFuIGV4YW1wbGUsIGNvbnNpZGVyOgp9CgpcYmVnaW57ZGFydENvZGV9ClxDTEFTU3t9IENpcmN1bGFyQ29uc3RzXHsgCi8vIElsbGVnYWwgcHJvZ3JhbSAtIG11dHVhbGx5IHJlY3Vyc2l2ZSBjb21waWxlLXRpbWUgY29uc3RhbnRzCiAgXFNUQVRJQ3t9IFxDT05TVHt9IGkgPSBqOyAvLyBhIGNvbXBpbGUtdGltZSBjb25zdGFudAogIFxTVEFUSUN7fSBcQ09OU1R7fSBqID0gaTsgLy8gYSBjb21waWxlLXRpbWUgY29uc3RhbnQKXH0KXGVuZHtkYXJ0Q29kZX0KCgpcYmVnaW57Z3JhbW1hcn0Ke1xiZiBsaXRlcmFsOn1udWxsTGl0ZXJhbDsKICAgICAgYm9vbGVhbkxpdGVyYWw7CiAgICAgIG51bWVyaWNMaXRlcmFsOwogICAgICBzdHJpbmdMaXRlcmFsOwogICAgICBzeW1ib2xMaXRlcmFsOwogICAgICBtYXBMaXRlcmFsOwogICAgICBsaXN0TGl0ZXJhbAogICAgLgogXGVuZHtncmFtbWFyfQoKCgpcc3Vic2VjdGlvbntOdWxsfQpcbGFiZWx7bnVsbH0KClRoZSByZXNlcnZlZCB3b3JkIFxOVUxMe30gZGVub3RlcyB0aGUge1xlbSBudWxsIG9iamVjdH0uCiVcUXtBbnkgbWV0aG9kcywgc3VjaCBhcyBcY29kZXtpc051bGx9P30KClxiZWdpbntncmFtbWFyfQp7XGJmIG51bGxMaXRlcmFsOn0KICAgICAgXE5VTEx7fQouClxlbmR7Z3JhbW1hcn0KClRoZSBudWxsIG9iamVjdCBpcyB0aGUgc29sZSBpbnN0YW5jZSBvZiB0aGUgYnVpbHQtaW4gY2xhc3MgXGNvZGV7TnVsbH0uIEF0dGVtcHRpbmcgdG8gaW5zdGFudGlhdGUgXGNvZGV7TnVsbH0gY2F1c2VzIGEgcnVuLXRpbWUgZXJyb3IuIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGZvciBhIGNsYXNzIHRvIGF0dGVtcHQgdG8gZXh0ZW5kIG9yIGltcGxlbWVudCBcY29kZXtOdWxsfS4gCkludm9raW5nIGEgbWV0aG9kIG9uIFxOVUxMe30gIHlpZWxkcyBhIFxjb2Rle05vU3VjaE1ldGhvZEVycm9yfSB1bmxlc3MgdGhlIG1ldGhvZCBpcyBleHBsaWNpdGx5IGltcGxlbWVudGVkIGJ5IGNsYXNzIFxjb2Rle051bGx9LgoKVGhlIHN0YXRpYyB0eXBlIG9mIFxOVUxMe30gaXMgJFxib3QkLgoKXHJhdGlvbmFsZXtUaGUgZGVjaXNpb24gdG8gdXNlICRcYm90JCBpbnN0ZWFkIG9mIFxjb2Rle051bGx9IGFsbG93cyBcTlVMTHt9IHRvIGJlIGJlIGFzc2lnbmVkIGV2ZXJ5d2hlcmUgd2l0aG91dCBjb21wbGFpbnQgYnkgdGhlIHN0YXRpYyBjaGVja2VyLiAKfQoKClxzdWJzZWN0aW9ue051bWJlcnN9ClxsYWJlbHtudW1iZXJzfQoKQSB7XGVtIG51bWVyaWMgbGl0ZXJhbH0gaXMgZWl0aGVyIGEgZGVjaW1hbCBvciBoZXhhZGVjaW1hbCBpbnRlZ2VyIG9mIGFyYml0cmFyeSBzaXplLCBvciBhIGRlY2ltYWwgZG91YmxlLgoKXGJlZ2lue2dyYW1tYXJ9CntcYmYgbnVtZXJpY0xpdGVyYWw6fU5VTUJFUjsKICAgICAgSEVYXF9OVU1CRVIKICAgIC4KICAgIAogIHtcYmYgTlVNQkVSOn0gRElHSVQrIChge1xlc2NhcGVncmFtbWFyLn0nIERJR0lUKyk/IEVYUE9ORU5UPzsKICAgICAge2BcZXNjYXBlZ3JhbW1hciAufScgRElHSVQrIEVYUE9ORU5UPwogICAgLgoKe1xiZiAgRVhQT05FTlQ6fQogICAgICAoYGUnICR8JCBgRScpICgnKycgJHwkIGAtYCk/IERJR0lUKwogICAgLgoKe1xiZiBIRVhcX05VTUJFUjp9YDB4JyBIRVhcX0RJR0lUKzsKICAgICAgYDBYJyBIRVhcX0RJR0lUKwogICAgLgoKIHtcYmYgSEVYXF9ESUdJVDp9YGEne1xlc2NhcGVncmFtbWFyIC4ufSdmJzsKICAgICAgYEEne1xlc2NhcGVncmFtbWFyIC4ufSdGJzsKICAgICAgRElHSVQKICAgIC4KIFxlbmR7Z3JhbW1hcn0KIApJZiBhIG51bWVyaWMgbGl0ZXJhbCBiZWdpbnMgd2l0aCB0aGUgcHJlZml4IGAweCcgb3IgYDBYJywgaXQgZGVub3RlcyB0aGUgaGV4YWRlY2ltYWwgaW50ZWdlciByZXByZXNlbnRlZCBieSB0aGUgcGFydCBvZiB0aGUgbGl0ZXJhbCBmb2xsb3dpbmcgYDB4JyAocmVzcGVjdGl2ZWx5IGAwWCcpLiBPdGhlcndpc2UsIGlmIHRoZSBudW1lcmljIGxpdGVyYWwgZG9lcyBub3QgaW5jbHVkZSBhIGRlY2ltYWwgcG9pbnQgIGl0IGRlbm90ZXMgYSBkZWNpbWFsIGludGVnZXIuICBPdGhlcndpc2UsIHRoZSBudW1lcmljIGxpdGVyYWwgIGRlbm90ZXMgYSA2NCBiaXQgZG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBudW1iZXIgYXMgc3BlY2lmaWVkIGJ5IHRoZSBJRUVFIDc1NCBzdGFuZGFyZC4gCgpJbiBwcmluY2lwbGUsIHRoZSByYW5nZSBvZiBpbnRlZ2VycyBzdXBwb3J0ZWQgYnkgYSBEYXJ0IGltcGxlbWVudGF0aW9ucyBpcyB1bmxpbWl0ZWQuIEluIHByYWN0aWNlLCBpdCBpcyBsaW1pdGVkIGJ5IGF2YWlsYWJsZSBtZW1vcnkuIEltcGxlbWVudGF0aW9ucyBtYXkgYWxzbyBiZSBsaW1pdGVkIGJ5IG90aGVyIGNvbnNpZGVyYXRpb25zLgoKXGNvbW1lbnRhcnl7CkZvciBleGFtcGxlLCBpbXBsZW1lbnRhdGlvbnMgbWF5IGNob29zZSB0byBsaW1pdCB0aGUgcmFuZ2UgdG8gZmFjaWxpdGF0ZSBlZmZpY2llbnQgY29tcGlsYXRpb24gdG8gSmF2YXNjcmlwdC4gVGhlc2UgbGltaXRhdGlvbnMgc2hvdWxkIGJlIHJlbGF4ZWQgYXMgc29vbiBhcyB0ZWNobm9sb2dpY2FsbHkgZmVhc2libGUuCn0KCkl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGZvciBhIGNsYXNzIHRvIGF0dGVtcHQgdG8gZXh0ZW5kIG9yIGltcGxlbWVudCBcY29kZXtpbnR9LiBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBmb3IgYSBjbGFzcyB0byBhdHRlbXB0IHRvIGV4dGVuZCBvciBpbXBsZW1lbnQgXGNvZGV7ZG91YmxlfS4gSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgZm9yIGFueSB0eXBlIG90aGVyIHRoYW4gdGhlIHR5cGVzIFxjb2Rle2ludH0gYW5kIFxjb2Rle2RvdWJsZX0gdG8gYXR0ZW1wdCB0byBleHRlbmQgb3IgaW1wbGVtZW50IFxjb2Rle251bX0uCgpBbiB7XGVtIGludGVnZXIgbGl0ZXJhbH0gaXMgZWl0aGVyIGEgaGV4YWRlY2ltYWwgaW50ZWdlciBsaXRlcmFsIG9yIGEgIGRlY2ltYWwgaW50ZWdlciBsaXRlcmFsLiBJbnZva2luZyB0aGUgZ2V0dGVyIFxjb2Rle3J1bnRpbWVUeXBlfSBvbiBhbiBpbnRlZ2VyIGxpdGVyYWwgcmV0dXJucyB0aGUgXGNvZGV7VHlwZX0gb2JqZWN0IHRoYXQgaXMgdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uIFxjb2Rle2ludH0uIFRoZSBzdGF0aWMgdHlwZSBvZiBhbiBpbnRlZ2VyIGxpdGVyYWwgaXMgXGNvZGV7aW50fS4gCgpBIHtcZW0gbGl0ZXJhbCBkb3VibGV9IGlzIGEgbnVtZXJpYyBsaXRlcmFsIHRoYXQgaXMgbm90IGFuIGludGVnZXIgbGl0ZXJhbC4gSW52b2tpbmcgdGhlIGdldHRlciBcY29kZXtydW50aW1lVHlwZX0gb24gYSBsaXRlcmFsIGRvdWJsZSByZXR1cm5zIHRoZSBcY29kZXtUeXBlfSBvYmplY3QgdGhhdCBpcyB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gXGNvZGV7ZG91YmxlfS4KVGhlIHN0YXRpYyB0eXBlIG9mIGEgbGl0ZXJhbCBkb3VibGUgaXMgXGNvZGV7ZG91YmxlfS4KICAgIApcc3Vic2VjdGlvbntCb29sZWFuc30KXGxhYmVse2Jvb2xlYW5zfQoKVGhlIHJlc2VydmVkIHdvcmRzIFxUUlVFe30gYW5kIFxGQUxTRXt9IGRlbm90ZSBvYmplY3RzIHRoYXQgcmVwcmVzZW50IHRoZSBib29sZWFuIHZhbHVlcyB0cnVlIGFuZCBmYWxzZSByZXNwZWN0aXZlbHkuIFRoZXkgYXJlIHRoZSB7XGVtIGJvb2xlYW4gbGl0ZXJhbHN9LgoKXGJlZ2lue2dyYW1tYXJ9CntcYmYgYm9vbGVhbkxpdGVyYWw6fVxUUlVFe307CiAgICAgICAgXEZBTFNFe30KICAgIC4KXGVuZHtncmFtbWFyfQoKQm90aCAgXFRSVUV7fSBhbmQgXEZBTFNFe30gaW1wbGVtZW50IHRoZSBidWlsdC1pbiBjbGFzcyBcY29kZXtib29sfS4gIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGZvciBhIGNsYXNzIHRvIGF0dGVtcHQgdG8gZXh0ZW5kIG9yIGltcGxlbWVudFxjb2RleyBib29sfS4gCgpcY29tbWVudGFyeXsKSXQgZm9sbG93cyB0aGF0IHRoZSB0d28gYm9vbGVhbiBsaXRlcmFscyBhcmUgdGhlIG9ubHkgdHdvIGluc3RhbmNlcyBvZiBcY29kZXtib29sfS4gCn0KCkludm9raW5nIHRoZSBnZXR0ZXIgXGNvZGV7cnVudGltZVR5cGV9IG9uIGEgYm9vbGVhbiBsaXRlcmFsIHJldHVybnMgdGhlIFxjb2Rle1R5cGV9IG9iamVjdCB0aGF0IGlzIHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbiBcY29kZXtib29sfS4gVGhlIHN0YXRpYyB0eXBlIG9mIGEgYm9vbGVhbiBsaXRlcmFsIGlzIFxjb2Rle2Jvb2x9LgoKXHN1YnN1YnNlY3Rpb257Qm9vbGVhbiBDb252ZXJzaW9ufQpcbGFiZWx7Ym9vbGVhbkNvbnZlcnNpb259Cgp7XGVtIEJvb2xlYW4gY29udmVyc2lvbn0gbWFwcyBhbnkgb2JqZWN0ICRvJCBpbnRvIGEgYm9vbGVhbi4gQm9vbGVhbiBjb252ZXJzaW9uIGlzICBkZWZpbmVkIGJ5IHRoZSBmdW5jdGlvbiBhcHBsaWNhdGlvbgoKXGJlZ2lue2RhcnRDb2RlfQooYm9vbCB2KVx7CiAgICAgICAgIFxBU1NFUlR7fSh2ICE9IFxOVUxMe30pOwolCVxJRnt9IChcTlVMTHt9ID09IHYpIFx7IFxUSFJPV3t9IFxORVd7fSBBc3NlcnRpb25FcnJvcignbnVsbCBpcyBub3QgYSBib29sJylcfTsKICAgICAgICAgXFJFVFVSTnt9IGlkZW50aWNhbCh2LCBcVFJVRXt9KTsKXH0obykKXGVuZHtkYXJ0Q29kZX0KClxyYXRpb25hbGV7CkJvb2xlYW4gY29udmVyc2lvbiBpcyB1c2VkIGFzIHBhcnQgb2YgY29udHJvbC1mbG93IGNvbnN0cnVjdHMgYW5kIGJvb2xlYW4gZXhwcmVzc2lvbnMuICBJZGVhbGx5LCBvbmUgd291bGQgc2ltcGx5IGluc2lzdCB0aGF0IGNvbnRyb2wtZmxvdyBkZWNpc2lvbnMgYmUgYmFzZWQgZXhjbHVzaXZlbHkgb24gYm9vbGVhbnMuICBUaGlzIGlzIHN0cmFpZ2h0Zm9yd2FyZCBpbiBhIHN0YXRpY2FsbHkgdHlwZWQgc2V0dGluZy4gSW4gYSBkeW5hbWljYWxseSB0eXBlZCBsYW5ndWFnZSwgaXQgcmVxdWlyZXMgYSBkeW5hbWljIGNoZWNrLiBTb3BoaXN0aWNhdGVkIHZpcnR1YWwgbWFjaGluZXMgY2FuIG1pbmltaXplIHRoZSBwZW5hbHR5IGludm9sdmVkLiBBbGFzLCBEYXJ0IG11c3QgYmUgY29tcGlsZWQgaW50byBKYXZhc2NyaXB0LiBCb29sZWFuIGNvbnZlcnNpb24gYWxsb3dzIHRoaXMgdG8gYmUgZG9uZSBlZmZpY2llbnRseS4gCgpBdCB0aGUgc2FtZSB0aW1lLCB0aGlzIGZvcm11bGF0aW9uIGRpZmZlcnMgcmFkaWNhbGx5IGZyb20gSmF2YXNjcmlwdCwgd2hlcmUgbW9zdCBudW1iZXJzIGFuZCBvYmplY3RzIGFyZSBpbnRlcnByZXRlZCBhcyBcVFJVRXt9LiAgRGFydCdzIGFwcHJvYWNoIHByZXZlbnRzIHVzYWdlcyBzdWNoIFxjb2Rle1xJRnt9IChhLWIpIC4uLiA7IH1iZWNhdXNlIGl0IGRvZXMgbm90IGFncmVlIHdpdGggdGhlIGxvdyBsZXZlbCBjb252ZW50aW9ucyB3aGVyZWJ5IG5vbi1udWxsIG9iamVjdHMgb3Igbm9uLXplcm8gbnVtYmVycyBhcmUgdHJlYXRlZCBhcyBcVFJVRXt9LiBJbmRlZWQsIHRoZXJlIGlzIG5vIHdheSB0byBkZXJpdmUgXFRSVUV7fSBmcm9tIGEgbm9uLWJvb2xlYW4gb2JqZWN0IHZpYSBib29sZWFuIGNvbnZlcnNpb24sIHNvIHRoaXMga2luZCBvZiBsb3cgbGV2ZWwgaGFja2VyeSBpcyBuaXBwZWQgaW4gdGhlIGJ1ZC4KCkRhcnQgYWxzbyBhdm9pZHMgdGhlIHN0cmFuZ2UgYmVoYXZpb3JzIHRoYXQgY2FuIGFyaXNlIGR1ZSB0byB0aGUgaW50ZXJhY3Rpb24gb2YgYm9vbGVhbiBjb252ZXJzaW9uIHdpdGggYXV0b2JveGluZyBpbiBKYXZhc2NyaXB0LiBBIG5vdG9yaW91cyBleGFtcGxlIGlzIHRoZSBzaXR1YXRpb24gd2hlcmUgXEZBTFNFe30gY2FuIGJlIGludGVycHJldGVkIGFzIFxUUlVFe30uIEluIEphdmFzY3JpcHQsIGJvb2xlYW5zIGFyZSBub3Qgb2JqZWN0cywgYW5kIGluc3RlYWQgYXJlIGF1dG9ib3hlZCBpbnRvIG9iamVjdHMgd2hlcmUgYGBuZWVkZWQnJy4gIElmIFxGQUxTRXt9IGdldHMgYXV0b2JveGVkIGludG8gYW4gb2JqZWN0LCB0aGF0IG9iamVjdCBjYW4gYmUgY29lcmNlZCBpbnRvIFxUUlVFe30gKGFzIGl0IGlzIGEgbm9uLW51bGwgb2JqZWN0KS4gCn0KClxjb21tZW50YXJ5e0JlY2F1c2UgYm9vbGVhbiBjb252ZXJzaW9uIHJlcXVpcmVzIGl0cyBwYXJhbWV0ZXIgdG8gYmUgYSBib29sZWFuLCBhbnkgY29uc3RydWN0IHRoYXQgbWFrZXMgdXNlIG9mIGJvb2xlYW4gY29udmVyc2lvbiB3aWxsIGNhdXNlIGEgZHluYW1pYyB0eXBlIGVycm9yIGluIGNoZWNrZWQgbW9kZSBpZiB0aGUgdmFsdWUgdG8gYmUgY29udmVydGVkIGlzIG5vdCBhIGJvb2xlYW4uCiB9CiAgICAKXHN1YnNlY3Rpb257U3RyaW5nc30KXGxhYmVse3N0cmluZ3N9CgpBIHtcZW0gc3RyaW5nfSBpcyBhIHNlcXVlbmNlIG9mIFVURi0xNiBjb2RlIHVuaXRzLiAKClxyYXRpb25hbGV7ClRoaXMgZGVjaXNpb24gd2FzIG1hZGUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB3ZWIgYnJvd3NlcnMgYW5kIEphdmFzY3JpcHQuIEVhcmxpZXIgdmVyc2lvbnMgb2YgdGhlIHNwZWNpZmljYXRpb24gcmVxdWlyZWQgYSBzdHJpbmcgdG8gYmUgYSBzZXF1ZW5jZSBvZiB2YWxpZCBVbmljb2RlIGNvZGUgcG9pbnRzLiAgUHJvZ3JhbW1lcnMgc2hvdWxkIG5vdCBkZXBlbmQgb24gdGhpcyBkaXN0aW5jdGlvbi4KfQoKXGJlZ2lue2dyYW1tYXJ9CntcYmYgc3RyaW5nTGl0ZXJhbDp9KG11bHRpbGluZVN0cmluZyAkfCQgc2luZ2xlTGluZVN0cmluZykrCiAgICAuClxlbmR7Z3JhbW1hcn0KCkEgc3RyaW5nIGNhbiBiZSBlaXRoZXIgYSBzZXF1ZW5jZSBvZiBzaW5nbGUgbGluZSBzdHJpbmdzIG9yIGEgbXVsdGlsaW5lIHN0cmluZy4gCgpcYmVnaW57Z3JhbW1hcn0KIHtcYmYgc2luZ2xlTGluZVN0cmluZzp9YHtcZXNjYXBlZ3JhbW1hciBcY29kZXsifX0nIHN0cmluZ0NvbnRlbnREUSogYHtcZXNjYXBlZ3JhbW1hciBcY29kZXsifX0nOwogICAgICAgYHtcZXNjYXBlZ3JhbW1hciBcY29kZXsnfX0nIHN0cmluZ0NvbnRlbnRTUSogYHtcZXNjYXBlZ3JhbW1hciBcY29kZXsnfX0nOwogICAgICBgcicgYHtcZXNjYXBlZ3JhbW1hciBcY29kZXsnfX0nIChcfnt9KCBge1xlc2NhcGVncmFtbWFyIFxjb2Rleyd9fScgJHwkIE5FV0xJTkUgKSkqIGB7XGVzY2FwZWdyYW1tYXIgXGNvZGV7J319JzsKICAgICAgYHInIGB7XGVzY2FwZWdyYW1tYXIgXGNvZGV7In19JyAoXH57fSggYHtcZXNjYXBlZ3JhbW1hciBcY29kZXsifX0nICR8JCBORVdMSU5FICkpKiBge1xlc2NhcGVncmFtbWFyIFxjb2RleyJ9fScKICAgIC4KXGVuZHtncmFtbWFyfQoKQSBzaW5nbGUgbGluZSBzdHJpbmcgaXMgZGVsaW1pdGVkIGJ5IGVpdGhlciBtYXRjaGluZyBzaW5nbGUgcXVvdGVzIG9yIG1hdGNoaW5nIGRvdWJsZSBxdW90ZXMuICAKClxjb21tZW50YXJ5ewpIZW5jZSwgYGFiYycgYW5kIGBgYWJjJycgYXJlIGJvdGggbGVnYWwgc3RyaW5ncywgYXMgYXJlIGBIZSBzYWlkIGBgVG8gYmUgb3Igbm90IHRvIGJlJycgZGlkIGhlIG5vdD8nICBhbmQgYGBIZSBzYWlkIGBUbyBiZSBvciBub3QgdG8gYmUnIGRpZG4ndCBoZScnLiBIb3dldmVyICBgYFRoaXMgYCBpcyBub3QgYSB2YWxpZCBzdHJpbmcsIG5vciBpcyBgdGhpcycnLgp9CgpcY29tbWVudGFyeXtUaGUgZ3JhbW1hciBlbnN1cmVzIHRoYXQgYSBzaW5nbGUgbGluZSBzdHJpbmcgY2Fubm90IHNwYW4gbW9yZSB0aGFuIG9uZSBsaW5lIG9mIHNvdXJjZSBjb2RlLCB1bmxlc3MgaXQgaW5jbHVkZXMgYW4gaW50ZXJwb2xhdGVkIGV4cHJlc3Npb24gdGhhdCBzcGFucyBtdWx0aXBsZSBsaW5lcy4KfQoKQWRqYWNlbnQgCiVzaW5nbGUgbGluZSAKc3RyaW5ncyBhcmUgaW1wbGljaXRseSBjb25jYXRlbmF0ZWQgdG8gZm9ybSBhIHNpbmdsZSBzdHJpbmcgbGl0ZXJhbC4KJSwgYW5kIHNvIGFyZSBhZGphY2VudCBtdWx0aWxpbmUgc3RyaW5ncywgYnV0IHRoZSB0d28gZm9ybXMgbWF5IG5vdCBiZSBtaXhlZC4KCgpcY29tbWVudGFyeXtIZXJlIGlzIGFuIGV4YW1wbGV9CgpcYmVnaW57ZGFydENvZGV9CnByaW50KCJBIHN0cmluZyIgImFuZCB0aGVuIGFub3RoZXIiKTsgLy8gcHJpbnRzOiBBIHN0cmluZ2FuZCB0aGVuIGFub3RoZXIKXGVuZHtkYXJ0Q29kZX0KClxyYXRpb25hbGV7RGFydCBhbHNvIHN1cHBvcnRzIHRoZSBvcGVyYXRvciArIGZvciBzdHJpbmcgY29uY2F0ZW5hdGlvbi4gCgpUaGUgKyBvcGVyYXRvciBvbiBTdHJpbmdzIHJlcXVpcmVzIGEgU3RyaW5nIGFyZ3VtZW50LiBJdCBkb2VzIG5vdCBjb2VyY2UgaXRzIGFyZ3VtZW50IGludG8gYSBzdHJpbmcuIFRoaXMgaGVscHMgYXZvaWQgcHV6emxlcnMgc3VjaCBhcwp9CgpcYmVnaW57ZGFydENvZGV9CnByaW50KCJBIHNpbXBsZSBzdW06IDIgKyAyID0gIiArCiAgICAgICAgICAgIDIgKyAyKTsKXGVuZHtkYXJ0Q29kZX0KClxyYXRpb25hbGV7IHdoaWNoIHRoaXMgcHJpbnRzICAnQSBzaW1wbGUgc3VtOiAyICsgMiA9IDIyJyByYXRoZXIgdGhhbiAnQSBzaW1wbGUgc3VtOiAyICsgMiA9IDQnLgpIb3dldmVyLCB0aGUgdXNlIHRoZSBjb25jYXRlbmF0aW9uIG9wZXJhdGlvbiBpcyBzdGlsbCAgZGlzY291cmFnZWQgZm9yIGVmZmljaWVuY3kgcmVhc29ucy4gSW5zdGVhZCwgdGhlIHJlY29tbWVuZGVkIERhcnQgaWRpb20gaXMgdG8gdXNlIHN0cmluZyBpbnRlcnBvbGF0aW9uLgp9CgpcYmVnaW57ZGFydENvZGV9CnByaW50KCJBIHNpbXBsZSBzdW06IDIgKyAyID0gIFwkXHsyKzJcfSIpOwpcZW5ke2RhcnRDb2RlfQoKClxyYXRpb25hbGV7U3RyaW5nIGludGVycG9sYXRpb24gd29yayB3ZWxsIGZvciBtb3N0IGNhc2VzLiBUaGUgbWFpbiBzaXR1YXRpb24gd2hlcmUgaXQgaXMgbm90IGZ1bGx5IHNhdGlzZmFjdG9yeSBpcyBmb3Igc3RyaW5nIGxpdGVyYWxzIHRoYXQgYXJlIHRvbyBsYXJnZSB0byBmaXQgb24gYSBsaW5lLiBNdWx0aWxpbmUgc3RyaW5ncyBjYW4gYmUgdXNlZnVsLCBidXQgaW4gc29tZSBjYXNlcywgd2Ugd2FudCB0byB2aXN1YWxseSBhbGlnbiB0aGUgY29kZS4gVGhpcyBjYW4gYmUgZXhwcmVzc2VkIGJ5IHdyaXRpbmcgc21hbGxlciBzdHJpbmdzIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlLCBhcyBzaG93biBoZXJlOn0KCgoKClxiZWdpbntkYXJ0Q29kZX0KJ0ltYWdpbmUgdGhpcyBpcyBhIHZlcnkgbG9uZyBzdHJpbmcgdGhhdCBkb2VzIG5vdCBmaXQgb24gYSBsaW5lLiBXaGF0IHNoYWxsIHdlIGRvPyAnCidPaCB3aGF0IHNoYWxsIHdlIGRvPyAnCidXZSBzaGFsbCBzcGxpdCBpdCBpbnRvIHBpZWNlcyAnCidsaWtlIHNvJy4KXGVuZHtkYXJ0Q29kZX0KCgoKCgpcYmVnaW57Z3JhbW1hcn0KIHtcYmYgbXVsdGlsaW5lU3RyaW5nOn1ge1xlc2NhcGVncmFtbWFyIFx0ZXh0dHR7IiIifX0nIHN0cmluZ0NvbnRlbnRURFEqICAgYHtcZXNjYXBlZ3JhbW1hciBcdGV4dHR0eyIiIn19JzsKICAgICAgYHtcZXNjYXBlZ3JhbW1hciBcY29kZXsnfVxjb2Rleyd9XGNvZGV7J319JyBzdHJpbmdDb250ZW50VFNRKiBge1xlc2NhcGVncmFtbWFyIFxjb2Rleyd9XGNvZGV7J31cY29kZXsnfX0nOwogICAgICBgcicgYHtcZXNjYXBlZ3JhbW1hciBcdGV4dHR0eyIiIn19JyAgKFx+e30gYHtcZXNjYXBlZ3JhbW1hciBcdGV4dHR0eyIiIn19JykqICAgYHtcZXNjYXBlZ3JhbW1hciBcdGV4dHR0eyIiIn19JzsKICAgICAgYHInIGB7XGVzY2FwZWdyYW1tYXIgXGNvZGV7J31cY29kZXsnfVxjb2Rleyd9fScgKFx+e30gYHtcZXNjYXBlZ3JhbW1hciBcY29kZXsnfVxjb2Rleyd9XGNvZGV7J319JykqIGB7XGVzY2FwZWdyYW1tYXIgXGNvZGV7J31cY29kZXsnfVxjb2Rleyd9fScKICAgIC4KICAgIAogICAgCiAgICB7XGJmIEVTQ0FQRVxfU0VRVUVOQ0U6fSBgJFxiYWNrc2xhc2gkIG4nOwogICAgYCRcYmFja3NsYXNoJCByJzsKICAgYCRcYmFja3NsYXNoJCBmJzsKICAgYCRcYmFja3NsYXNoJCBiJzsKICBgJFxiYWNrc2xhc2gkIHQnOwogICBgJFxiYWNrc2xhc2gkIHYnOwogIGAkXGJhY2tzbGFzaCQgeCcgSEVYXF9ESUdJVCBIRVhcX0RJR0lUOwogICBgJFxiYWNrc2xhc2gkIHUnIEhFWFxfRElHSVQgSEVYXF9ESUdJVCBIRVhcX0RJR0lUIEhFWFxfRElHSVQ7CiAgIGAkXGJhY2tzbGFzaCQgdVx7JyBIRVhcX0RJR0lUXF9TRVFVRU5DRSBgXH0nCiAgLgogIAp7XGJmIEhFWFxfRElHSVRcX1NFUVVFTkNFOn0KICAgICBIRVhcX0RJR0lUIEhFWFxfRElHSVQ/IEhFWFxfRElHSVQ/IEhFWFxfRElHSVQ/IEhFWFxfRElHSVQ/IEhFWFxfRElHSVQ/IAogICAgLgogICAKXGVuZHtncmFtbWFyfQoKTXVsdGlsaW5lIHN0cmluZ3MgYXJlIGRlbGltaXRlZCBieSBlaXRoZXIgbWF0Y2hpbmcgdHJpcGxlcyBvZiBzaW5nbGUgcXVvdGVzIG9yIG1hdGNoaW5nIHRyaXBsZXMgb2YgZG91YmxlIHF1b3Rlcy4gSWYgdGhlIGZpcnN0IGxpbmUgb2YgYSBtdWx0aWxpbmUgc3RyaW5nIGNvbnNpc3RzIHNvbGVseSBvZiB0aGUgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGRlZmluZWQgYnkgdGhlIHByb2R1Y3Rpb24ge1xlbSBXSElURVNQQUNFfSAgXHJlZntsZXhpY2FsUnVsZXN9KSwgcG9zc2libHkgcHJlZml4ZWQgYnkgJFxiYWNrc2xhc2gkLCB0aGVuIHRoYXQgbGluZSBpcyBpZ25vcmVkLCBpbmNsdWRpbmcgdGhlIG5ldyBsaW5lIGF0IGl0cyBlbmQuCgogCiBccmF0aW9uYWxlewogVGhlIGlkZWEgaXMgdG8gaWdub3JlIHdoaXRlc3BhY2UsIHdoZXJlIHdoaXRlc3BhY2UgaXMgZGVmaW5lZCBhcyB0YWJzLCBzcGFjZXMgYW5kIG5ld2xpbmVzLiBUaGVzZSBjYW4gYmUgcmVwcmVzZW50ZWQgZGlyZWN0bHksIGJ1dCBzaW5jZSBmb3IgbW9zdCBjaGFyYWN0ZXJzIHByZWZpeGluZyBieSBiYWNrc2xhc2ggaXMgYW4gaWRlbnRpdHksIHdlIGFsbG93IHRob3NlIGZvcm1zIGFzIHdlbGwuCiB9CgpTdHJpbmdzIHN1cHBvcnQgZXNjYXBlIHNlcXVlbmNlcyBmb3Igc3BlY2lhbCBjaGFyYWN0ZXJzLiBUaGUgZXNjYXBlcyBhcmU6ClxiZWdpbntpdGVtaXplfQpcaXRlbSAgJFxiYWNrc2xhc2gkbiBmb3IgbmV3bGluZSwgZXF1aXZhbGVudCB0byAkXGJhY2tzbGFzaCR4MEEuClxpdGVtICRcYmFja3NsYXNoJHIgZm9yIGNhcnJpYWdlIHJldHVybiwgZXF1aXZhbGVudCB0byAkXGJhY2tzbGFzaCR4MEQuClxpdGVtICRcYmFja3NsYXNoJGYgZm9yIGZvcm0gZmVlZCwgZXF1aXZhbGVudCB0byAkXGJhY2tzbGFzaCR4MEMuClxpdGVtICRcYmFja3NsYXNoJGIgZm9yIGJhY2tzcGFjZSwgZXF1aXZhbGVudCB0byAkXGJhY2tzbGFzaCR4MDguClxpdGVtICRcYmFja3NsYXNoJHQgZm9yIHRhYiwgZXF1aXZhbGVudCB0byAkXGJhY2tzbGFzaCR4MDkuClxpdGVtICRcYmFja3NsYXNoJHYgZm9yIHZlcnRpY2FsIHRhYiwgZXF1aXZhbGVudCB0byAkXGJhY2tzbGFzaCR4MEIKXGl0ZW0gJFxiYWNrc2xhc2gkeCAkSEVYXF9ESUdJVF8xJCAkSEVYXF9ESUdJVF8yJCwgZXF1aXZhbGVudCB0byAKCiRcYmFja3NsYXNoJHVceyRIRVhcX0RJR0lUXzEkICRIRVhcX0RJR0lUXzIkXH0uClxpdGVtICRcYmFja3NsYXNoJHUgJEhFWFxfRElHSVRfMSQgJEhFWFxfRElHSVRfMiQgJEhFWFxfRElHSVRfMyQgJEhFWFxfRElHSVRfNCQsIGVxdWl2YWxlbnQgdG8gJFxiYWNrc2xhc2gkdVx7JEhFWFxfRElHSVRfMSQgJEhFWFxfRElHSVRfMiQgJEhFWFxfRElHSVRfMyQgJEhFWFxfRElHSVRfNCRcfS4KXGl0ZW0gJFxiYWNrc2xhc2gkdVx7JEhFWFxfRElHSVRcX1NFUVVFTkNFJFx9IGlzIHRoZSB1bmljb2RlIHNjYWxhciB2YWx1ZSByZXByZXNlbnRlZCBieSB0aGUgJEhFWFxfRElHSVRcX1NFUVVFTkNFJC4gSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgdGhlIHZhbHVlIG9mIHRoZSAkSEVYXF9ESUdJVFxfU0VRVUVOQ0UkIGlzIG5vdCBhIHZhbGlkIHVuaWNvZGUgc2NhbGFyIHZhbHVlLgpcaXRlbSBcJCBpbmRpY2F0aW5nIHRoZSBiZWdpbm5pbmcgb2YgYW4gaW50ZXJwb2xhdGVkIGV4cHJlc3Npb24uClxpdGVtIE90aGVyd2lzZSwgJFxiYWNrc2xhc2ggayQgaW5kaWNhdGVzIHRoZSBjaGFyYWN0ZXIgJGskIGZvciBhbnkgJGskIG5vdCBpbiAkXHtuLCByLCBmLCBiLCB0LCB2LCB4LCB1XH0kLgogXGVuZHtpdGVtaXplfQoKQW55IHN0cmluZyBtYXkgYmUgcHJlZml4ZWQgd2l0aCB0aGUgY2hhcmFjdGVyIGByJywgaW5kaWNhdGluZyB0aGF0IGl0IGlzIGEge1xlbSByYXcgc3RyaW5nfSwgaW4gd2hpY2ggY2FzZSBubyBlc2NhcGVzIG9yIGludGVycG9sYXRpb25zIGFyZSByZWNvZ25pemVkLgoKSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgYSBub24tcmF3IHN0cmluZyBsaXRlcmFsIGNvbnRhaW5zIGEgY2hhcmFjdGVyIHNlcXVlbmNlIG9mIHRoZSBmb3JtICRcYmFja3NsYXNoJHggdGhhdCBpcyBub3QgZm9sbG93ZWQgYnkgYSBzZXF1ZW5jZSBvZiB0d28gaGV4YWRlY2ltYWwgZGlnaXRzLiBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBhIG5vbi1yYXcgc3RyaW5nIGxpdGVyYWwgIGNvbnRhaW5zIGEgY2hhcmFjdGVyIHNlcXVlbmNlIG9mIHRoZSBmb3JtICRcYmFja3NsYXNoJHUgdGhhdCBpcyBub3QgZm9sbG93ZWQgYnkgZWl0aGVyIGEgc2VxdWVuY2Ugb2YgZm91ciBoZXhhZGVjaW1hbCBkaWdpdHMsIG9yIGJ5IGN1cmx5IGJyYWNlIGRlbGltaXRlZCBzZXF1ZW5jZSBvZiBoZXhhZGVjaW1hbCBkaWdpdHMuCgoKClxiZWdpbntncmFtbWFyfQoge1xiZiBzdHJpbmdDb250ZW50RFE6fVx+e30oIGAkXGJhY2tzbGFzaCQnICR8JCBge1xlc2NhcGVncmFtbWFyIFx0ZXh0dHR7In19JyAkfCQgYFwkJyAkfCQgTkVXTElORSApOwogICAgICBgJFxiYWNrc2xhc2gkJyAgXH57fSggTkVXTElORSApOwogICAgIHN0cmluZ0ludGVycG9sYXRpb24KICAgIC4KCiB7XGJmIHN0cmluZ0NvbnRlbnRTUTp9XH57fSggYCRcYmFja3NsYXNoJCcgJHwkIGB7XGVzY2FwZWdyYW1tYXIgXHRleHR0dHsnfX0nICR8JCBgXCQnICR8JCBORVdMSU5FICk7CiAgICAgIGAkXGJhY2tzbGFzaCQnICBcfnt9KCBORVdMSU5FICk7CiAgICAgc3RyaW5nSW50ZXJwb2xhdGlvbgogICAgLgoKICAgIAoge1xiZiBzdHJpbmdDb250ZW50VERROn1cfnt9KCBgJFxiYWNrc2xhc2gkJyAkfCQgIGB7XGVzY2FwZWdyYW1tYXIgXHRleHR0dHsiIiJ9fScgJHwkIGBcJCcpOwogICAgIHN0cmluZ0ludGVycG9sYXRpb24KICAgIC4gICAgCgoge1xiZiBzdHJpbmdDb250ZW50VFNROn1cfnt9KCBgJFxiYWNrc2xhc2gkJyAkfCQgYHtcZXNjYXBlZ3JhbW1hciBcY29kZXsnfVxjb2Rleyd9XGNvZGV7J319JyAkfCQgYFwkJyk7CiAgICAgc3RyaW5nSW50ZXJwb2xhdGlvbgogICAgLgogICAgCntcYmYgTkVXTElORTp9JFxiYWNrc2xhc2gkIG47CiAgICAgICRcYmFja3NsYXNoJCByCiAgICAuCgogXGVuZHtncmFtbWFyfQogCkFsbCBzdHJpbmcgbGl0ZXJhbHMgaW1wbGVtZW50IHRoZSBidWlsdC1pbiBjbGFzcyBcY29kZXtTdHJpbmd9LiBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBmb3IgYSBjbGFzcyB0byBhdHRlbXB0IHRvIGV4dGVuZCBvciBpbXBsZW1lbnQgXGNvZGV7U3RyaW5nfS4gSW52b2tpbmcgdGhlIGdldHRlciBcY29kZXtydW50aW1lVHlwZX0gb24gYSBzdHJpbmcgbGl0ZXJhbCByZXR1cm5zIHRoZSBcY29kZXtUeXBlfSBvYmplY3QgdGhhdCBpcyB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gXGNvZGV7U3RyaW5nfS4gVGhlIHN0YXRpYyB0eXBlIG9mIGEgc3RyaW5nIGxpdGVyYWwgaXMgXGNvZGV7U3RyaW5nfS4KClxzdWJzdWJzZWN0aW9ue1N0cmluZyBJbnRlcnBvbGF0aW9ufQpcbGFiZWx7c3RyaW5nSW50ZXJwb2xhdGlvbn0KCkl0IGlzIHBvc3NpYmxlIHRvIGVtYmVkIGV4cHJlc3Npb25zIHdpdGhpbiBub24tcmF3IHN0cmluZyBsaXRlcmFscywgc3VjaCB0aGF0IHRoZSB0aGVzZSBleHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkLCBhbmQgdGhlIHJlc3VsdGluZyB2YWx1ZXMgYXJlIGNvbnZlcnRlZCBpbnRvIHN0cmluZ3MgYW5kIGNvbmNhdGVuYXRlZCB3aXRoIHRoZSBlbmNsb3Npbmcgc3RyaW5nLiBUaGlzIHByb2Nlc3MgaXMga25vd24gYXMge1xlbSBzdHJpbmcgaW50ZXJwb2xhdGlvbn0uCgogXGJlZ2lue2dyYW1tYXJ9CntcYmYgc3RyaW5nSW50ZXJwb2xhdGlvbjp9YFwkJyBJREVOVElGSUVSXF9OT1xfRE9MTEFSOwogICAgICBgXCQnIGBceycgZXhwcmVzc2lvbiBgXH0nICUgY291bGQgYmUgdG9wIGxldmVsIGV4cHJlc3Npb24sIG5vPwogICAgLgogXGVuZHtncmFtbWFyfQogClxjb21tZW50YXJ5e1RoZSByZWFkZXIgd2lsbCBub3RlIHRoYXQgdGhlIGV4cHJlc3Npb24gaW5zaWRlIHRoZSBpbnRlcnBvbGF0aW9uIGNvdWxkIGl0c2VsZiBpbmNsdWRlIHN0cmluZ3MsIHdoaWNoIGNvdWxkIGFnYWluIGJlIGludGVycG9sYXRlZCByZWN1cnNpdmVseS4gCn0KCkFuIHVuZXNjYXBlZCBcJCBjaGFyYWN0ZXIgaW4gYSBzdHJpbmcgc2lnbmlmaWVzIHRoZSBiZWdpbm5pbmcgb2YgYW4gaW50ZXJwb2xhdGVkIGV4cHJlc3Npb24uICBUaGUgXCQgc2lnbiBtYXkgYmUgZm9sbG93ZWQgYnkgZWl0aGVyOgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gQSBzaW5nbGUgaWRlbnRpZmllciAkaWQkIHRoYXQgbXVzdCBub3QgY29udGFpbiB0aGUgXCQgY2hhcmFjdGVyLiAKXGl0ZW0gQW4gZXhwcmVzc2lvbiAkZSQgZGVsaW1pdGVkIGJ5IGN1cmx5IGJyYWNlcy4KXGVuZHtpdGVtaXplfQoKVGhlIGZvcm0gXGNvZGV7XCRpZH0gaXMgZXF1aXZhbGVudCB0byB0aGUgZm9ybSBcY29kZXtcJFx7aWRcfX0uICBBbiBpbnRlcnBvbGF0ZWQgc3RyaW5nIFxjb2Rle2Akc18xJFwkXHskZSRcfSRzXzIkJ30gIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlICBzdHJpbmdzIFxjb2Rle2Akc18xJCd9LCAgXGNvZGV7JGUkLnRvU3RyaW5nKCl9IGFuZCAgXGNvZGV7JGBzXzIkJ30uIExpa2V3aXNlIGFuIGludGVycG9sYXRlZCBzdHJpbmcgXGNvZGV7YGAkc18xJFwkXHtlXH0kc18yJCcnfSBpcyBlcXVpdmFsZW50IHRvIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBzdHJpbmdzIFxjb2Rle2BgJHNfMSQnJ30sIFxjb2RleyRlJC50b1N0cmluZygpfSBhbmQgIFxjb2Rle2BgJHNfMiQnJ30uCgpcc3Vic2VjdGlvbntTeW1ib2xzfQpcbGFiZWx7c3ltYm9sc30KCkEge1xlbSBzeW1ib2wgbGl0ZXJhbH0gZGVub3RlcyB0aGUgbmFtZSBvZiBhIGRlY2xhcmF0aW9uIGluIGEgRGFydCBwcm9ncmFtLiAKClxiZWdpbntncmFtbWFyfQp7XGJmIHN5bWJvbExpdGVyYWw6fQogICAgICBgXCMnICAob3BlcmF0b3IgJHwkIChpZGVudGlmaWVyIChge1xlc2NhcGVncmFtbWFyIC59JyBpZGVudGlmaWVyKSopKSAgLgpcZW5ke2dyYW1tYXJ9CgpBIHN5bWJvbCBsaXRlcmFsIFxjb2Rle1wjaWR9IHdoZXJlIFxjb2Rle2lkfSBkb2VzIG5vdCBiZWdpbiB3aXRoIGFuIHVuZGVyc2NvcmUgKNRcY29kZXtcX33VKSAgaXMgZXF1aXZhbGVudCB0byB0aGUgZXhwcmVzc2lvbiBcY29kZXtcQ09OU1R7fSBTeW1ib2wo1Glk1Sl9LiAgCgpBIHN5bWJvbCBsaXRlcmFsIFxjb2Rle1wjXF9pZH0gZXZhbHVhdGVzIHRvIHRoZSBvYmplY3QgdGhhdCB3b3VsZCBiZSByZXR1cm5lZCBieSB0aGUgY2FsbCBcY29kZXttaXJyb3IuZ2V0UHJpdmF0ZVN5bWJvbCjUaWTVKX0gd2hlcmUgbWlycm9yIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyBcY29kZXtMaWJyYXJ5TWlycm9yfSBkZWZpbmVkIGluIHRoZSBsaWJyYXJ5IFxjb2Rle2RhcnQ6bWlycm9yc30sIHJlZmxlY3RpbmcgdGhlIGN1cnJlbnQgbGlicmFyeS4gCgpccmF0aW9uYWxlewpPbmUgbWF5IHdlbGwgYXNrIHdoYXQgaXMgdGhlIG1vdGl2YXRpb24gZm9yIGludHJvZHVjaW5nIGxpdGVyYWwgc3ltYm9scz8gSW4gc29tZSBsYW5ndWFnZXMsIHN5bWJvbHMgYXJlIGNhbm9uaWNhbGl6ZWQgd2hlcmVhcyBzdHJpbmdzIGFyZSBub3QuIEhvd2V2ZXIgbGl0ZXJhbCBzdHJpbmdzIGFyZSBhbHJlYWR5IGNhbm9uaWNhbGl6ZWQgaW4gRGFydC4gIFN5bWJvbHMgYXJlIHNsaWdodGx5IGVhc2llciB0byB0eXBlIGNvbXBhcmVkIHRvIHN0cmluZ3MgYW5kIHRoZWlyIHVzZSBjYW4gYmVjb21lIHN0cmFuZ2VseSBhZGRpY3RpdmUsIGJ1dCB0aGlzIGlzIG5vdCBuZWFybHkgc3VmZmljaWVudCBqdXN0aWZpY2F0aW9uIGZvciBhZGRpbmcgYSBsaXRlcmFsIGZvcm0gdG8gdGhlIGxhbmd1YWdlLiBUaGUgcHJpbWFyeSBtb3RpdmF0aW9uIGlzIHJlbGF0ZWQgdG8gdGhlIHVzZSBvZiByZWZsZWN0aW9uIGFuZCBhIHdlYiBzcGVjaWZpYyBwcmFjdGljZSBrbm93biBhcyBtaW5pZmljYXRpb24uIAoKTWluaWZpY2F0aW9uIGNvbXByZXNzZXMgaWRlbnRpZmllcnMgY29uc2lzdGVudGx5IHRocm91Z2hvdXQgYSBwcm9ncmFtIGluIG9yZGVyIHRvIHJlZHVjZSBkb3dubG9hZCBzaXplLiAgVGhpcyBwcmFjdGljZSBwb3NlcyBkaWZmaWN1bHRpZXMgZm9yIHJlZmxlY3RpdmUgcHJvZ3JhbXMgdGhhdCByZWZlciB0byBwcm9ncmFtIGRlY2xhcmF0aW9ucyB2aWEgc3RyaW5ncy4gQSBzdHJpbmcgd2lsbCByZWZlciB0byBhbiBpZGVudGlmaWVyIGluIHRoZSBzb3VyY2UsIGJ1dCB0aGUgaWRlbnRpZmllciB3aWxsIG5vIGxvbmdlciBiZSB1c2VkIGluIHRoZSBtaW5pZmllZCBjb2RlLCBhbmQgcmVmbGVjdGl2ZSBjb2RlIHVzaW5nIHRoZXNlIHRydWluZyB3b3VsZCBmYWlsLiAgVGhlcmVmb3JlLCBEYXJ0IHJlZmxlY3Rpb24gdXNlcyAgb2JqZWN0cyBvZiB0eXBlIFxjb2Rle1N5bWJvbH0gcmF0aGVyIHRoYW4gc3RyaW5ncy4gSW5zdGFuY2VzIG9mIFxjb2Rle1N5bWJvbH0gYXJlIGd1YXJhbnRlZWQgdG8gYmUgc3RhYmxlIHdpdGggcmVwZWF0IHRvIG1pbmlmaWNhdGlvbi4gUHJvdmlkaW5nIGEgbGl0ZXJhbCBmb3JtIGZvciBzeW1ib2xzIG1ha2VzIHJlZmxlY3RpdmUgY29kZSBlYXNpZXIgdG8gcmVhZCBhbmQgd3JpdGUuIFRoZSBmYWN0IHRoYXQgc3ltYm9scyBhcmUgZWFzeSB0byB0eXBlIGFuZCBjYW4gb2Z0ZW4gYWN0IGFzIGNvbnZlbmllbnQgc3Vic3RpdHV0ZXMgZm9yIGVudW1zIGFyZSBzZWNvbmRhcnkgYmVuZWZpdHMuCn0KClRoZSBzdGF0aWMgdHlwZSBvZiBhIHN5bWJvbCBsaXRlcmFsIGlzIFxjb2Rle1N5bWJvbH0uCgpcc3Vic2VjdGlvbntMaXN0c30KXGxhYmVse2xpc3RzfQoKQSB7XGVtIGxpc3QgbGl0ZXJhbH0gZGVub3RlcyBhIGxpc3QsIHdoaWNoIGlzIGFuIGludGVnZXIgaW5kZXhlZCBjb2xsZWN0aW9uIG9mIG9iamVjdHMuIAoKXGJlZ2lue2dyYW1tYXJ9CntcYmYgbGlzdExpdGVyYWw6fQogICAgIFxDT05TVHt9PyB0eXBlQXJndW1lbnRzPyBgWycgKGV4cHJlc3Npb25MaXN0IGAsJz8pPyBgXScKICAgIC4KXGVuZHtncmFtbWFyfQoKQSBsaXN0IG1heSBjb250YWluIHplcm8gb3IgbW9yZSBvYmplY3RzLiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGEgbGlzdCBpcyBpdHMgc2l6ZS4gQSBsaXN0IGhhcyBhbiBhc3NvY2lhdGVkIHNldCBvZiBpbmRpY2VzLiAgQW4gZW1wdHkgbGlzdCBoYXMgYW4gZW1wdHkgc2V0IG9mIGluZGljZXMuIEEgbm9uLWVtcHR5IGxpc3QgaGFzIHRoZSBpbmRleCBzZXQgJFx7MCBcbGRvdHMgbiAtMVx9JCB3aGVyZSAkbiQgaXMgdGhlIHNpemUgb2YgdGhlIGxpc3QuIEl0IGlzIGEgcnVudGltZSBlcnJvciB0byBhdHRlbXB0IHRvIGFjY2VzcyBhIGxpc3QgdXNpbmcgYW4gaW5kZXggdGhhdCBpcyBub3QgYSBtZW1iZXIgb2YgaXRzIHNldCBvZiBpbmRpY2VzLgoKCklmIGEgbGlzdCBsaXRlcmFsIGJlZ2lucyB3aXRoIHRoZSByZXNlcnZlZCB3b3JkIFxDT05TVHt9LCBpdCBpcyBhIHtcZW0gY29uc3RhbnQgbGlzdCBsaXRlcmFsfSB3aGljaCBpcyBhIGNvbXBpbGUtdGltZSBjb25zdGFudCAoXHJlZntjb25zdGFudHN9KSBhbmQgdGhlcmVmb3JlIGV2YWx1YXRlZCBhdCBjb21waWxlLXRpbWUuIE90aGVyd2lzZSwgaXQgaXMgYSB7XGVtIHJ1bi10aW1lIGxpc3QgbGl0ZXJhbH0gYW5kIGl0IGlzIGV2YWx1YXRlZCBhdCBydW4tdGltZS4gT25seSBydW4tdGltZSBsaXN0IGxpdGVyYWxzIGNhbiBiZSBtdXRhdGVkCmFmdGVyIHRoZXkgYXJlIGNyZWF0ZWQuIEF0dGVtcHRpbmcgdG8gbXV0YXRlIGEgY29uc3RhbnQgbGlzdCBsaXRlcmFsIHdpbGwgcmVzdWx0IGluIGEgZHluYW1pYyBlcnJvci4KCkl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIGFuIGVsZW1lbnQgb2YgYSBjb25zdGFudCBsaXN0IGxpdGVyYWwgaXMgbm90IGEgY29tcGlsZS10aW1lIGNvbnN0YW50LiBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiB0aGUgdHlwZSBhcmd1bWVudCBvZiBhIGNvbnN0YW50IGxpc3QgbGl0ZXJhbCBpbmNsdWRlcyBhIHR5cGUgcGFyYW1ldGVyLgpccmF0aW9uYWxle1RoZSBiaW5kaW5nIG9mIGEgdHlwZSBwYXJhbWV0ZXIgaXMgbm90IGtub3duIGF0IGNvbXBpbGUtdGltZSwgc28gd2UgY2Fubm90IHVzZSB0eXBlIHBhcmFtZXRlcnMgaW5zaWRlIGNvbXBpbGUtdGltZSBjb25zdGFudHMufQoKVGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgbGlzdCBsaXRlcmFsICBcQ09OU1R7fSAkPEU+W2VfMVxsZG90cyBlX25dJCBpcyBhbiBvYmplY3QgJGEkIHdob3NlIGNsYXNzIGltcGxlbWVudHMgdGhlIGJ1aWx0LWluIGNsYXNzICRMaXN0PEU+JC4gVGhlICRpJHRoIGVsZW1lbnQgb2YgJGEkIGlzICR2X3tpKzF9JCwgd2hlcmUgJHZfaSQgaXMgdGhlIHZhbHVlIG9mIHRoZSBjb21waWxlLXRpbWUgZXhwcmVzc2lvbiAkZV9pJC4gIFRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IGxpc3QgbGl0ZXJhbCAgXENPTlNUe30gJFtlXzEgXGxkb3RzIGVfbl0kIGlzIGRlZmluZWQgYXMgdGhlIHZhbHVlIG9mIHRoZSBjb25zdGFudCBsaXN0IGxpdGVyYWwgXENPTlNUe30kIDwgXERZTkFNSUN7fT5bZV8xXGxkb3RzIGVfbl0kLgoKTGV0ICRsaXN0XzEgPSQgXENPTlNUe30gJDxWPltlX3sxMX0gXGxkb3RzIGVfezFufV0kIGFuZCAkbGlzdF8yID0kICBcQ09OU1R7fSAkPFU+W2VfezIxfSBcbGRvdHMgZV97Mm59XSQgYmUgdHdvIGNvbnN0YW50IGxpc3QgbGl0ZXJhbHMgYW5kIGxldCB0aGUgIGVsZW1lbnRzIG9mICRsaXN0XzEkIGFuZCAkbGlzdF8yJCAgZXZhbHVhdGUgdG8gICRvX3sxMX0gXGxkb3RzIG9fezFufSQgYW5kICRvX3syMX0gXGxkb3RzIG9fezJufSQgcmVzcGVjdGl2ZWx5LiBJZmYgXGNvZGV7aWRlbnRpY2FsKCRvX3sxaX0kLCAkb197Mml9JCl9IGZvciAkaSBcaW4gMS4uIG4kIGFuZCAkViA9IFUkIHRoZW4gXGNvZGV7aWRlbnRpY2FsKCRsaXN0XzEkLCAkbGlzdF8yJCl9LiAKClxjb21tZW50YXJ5e0luIG90aGVyIHdvcmRzLCBjb25zdGFudCBsaXN0IGxpdGVyYWxzIGFyZSBjYW5vbmljYWxpemVkLn0KCkEgcnVuLXRpbWUgbGlzdCBsaXRlcmFsICQ8RT5bZV8xIFxsZG90cyBlX25dJCAgaXMgZXZhbHVhdGVkIGFzIGZvbGxvd3M6ClxiZWdpbntpdGVtaXplfQpcaXRlbQpGaXJzdCwgdGhlIGV4cHJlc3Npb25zICRlXzEgXGxkb3RzIGVfbiQgYXJlIGV2YWx1YXRlZCBpbiBvcmRlciB0aGV5IGFwcGVhciBpbiB0aGUgcHJvZ3JhbSwgeWllbGRpbmcgb2JqZWN0cyAkb18xIFxsZG90cyBvX24kLgpcaXRlbSBBIGZyZXNoIGluc3RhbmNlICAoXHJlZntnZW5lcmF0aXZlQ29uc3RydWN0b3JzfSkgJGEkLCBvZiBzaXplICRuJCwgIHdob3NlIGNsYXNzIGltcGxlbWVudHMgdGhlIGJ1aWx0LWluIGNsYXNzICRMaXN0PEU+JCBpcyBhbGxvY2F0ZWQuIApcaXRlbQoKVGhlIG9wZXJhdG9yIFxjb2Rle1tdPX0gaXMgaW52b2tlZCBvbiAkYSQgd2l0aCAgZmlyc3QgIGFyZ3VtZW50ICRpJCBhbmQgc2Vjb25kIGFyZ3VtZW50CiVUaGUgJGkkdGggZWxlbWVudCBvZiAkYSQgaXMgc2V0IHRvIAokb197aSsxfSwgMCBcbGUgaSA8IG4kLgpcaXRlbQpUaGUgcmVzdWx0IG9mIHRoZSBldmFsdWF0aW9uIGlzICRhJC4KXGVuZHtpdGVtaXplfQoKClxjb21tZW50YXJ5ewpOb3RlIHRoYXQgdGhpcyBkb2N1bWVudCBkb2VzIG5vdCBzcGVjaWZ5IGFuIG9yZGVyIGluIHdoaWNoIHRoZSBlbGVtZW50cyBhcmUgc2V0LiBUaGlzIGFsbG93cyBmb3IgcGFyYWxsZWwgYXNzaWdubWVudHMgaW50byB0aGUgbGlzdCBpZiBhbiBpbXBsZW1lbnRhdGlvbiBzbyBkZXNpcmVzLiAgVGhlIG9yZGVyIGNhbiBvbmx5IGJlIG9ic2VydmVkIGluIGNoZWNrZWQgbW9kZSAoYW5kIG1heSBub3QgYmUgcmVsaWVkIHVwb24pOiBpZiBlbGVtZW50ICRpJCBpcyBub3QgYSBzdWJ0eXBlIG9mIHRoZSBlbGVtZW50IHR5cGUgb2YgdGhlIGxpc3QsIGEgZHluYW1pYyB0eXBlIGVycm9yIHdpbGwgb2NjdXIgd2hlbiAkYVtpXSQgaXMgYXNzaWduZWQgJG9fe2ktMX0kLiAKfQoKQSBydW50aW1lIGxpc3QgbGl0ZXJhbCAgJFtlXzEgXGxkb3RzIGVfbl0kIGlzIGV2YWx1YXRlZCBhcyAgJDwgXERZTkFNSUN7fT5bZV8xXGxkb3RzIGVfbl0kLgoKClxjb21tZW50YXJ5ewpUaGVyZSBpcyBubyByZXN0cmljdGlvbiBwcmVjbHVkaW5nIG5lc3Rpbmcgb2YgbGlzdCBsaXRlcmFscy4gSXQgZm9sbG93cyBmcm9tIHRoZSBydWxlcyBhYm92ZSB0aGF0CiQ8TGlzdDxpbnQ+PltbMSwgMiwgM10sIFs0LCA1LCA2XV0kIGlzIGEgbGlzdCB3aXRoIHR5cGUgcGFyYW1ldGVyICRMaXN0PGludD4kLCBjb250YWluaW5nIHR3byBsaXN0cyB3aXRoIHR5cGUgcGFyYW1ldGVyICBcRFlOQU1JQ3t9LiAKfQoKVGhlIHN0YXRpYyB0eXBlIG9mIGEgbGlzdCBsaXRlcmFsIG9mIHRoZSBmb3JtICBcQ09OU1R7fSQgPEU+W2VfMVxsZG90cyBlX25dJCAgb3IgdGhlIGZvcm0gJDxFPltlXzEgXGxkb3RzIGVfbl0kIGlzICRMaXN0PEU+JC4gVGhlIHN0YXRpYyB0eXBlIGEgbGlzdCBsaXRlcmFsIG9mIHRoZSBmb3JtICBcQ09OU1R7fSAkW2VfMSBcbGRvdHMgZV9uJF0gIG9yIHRoZSBmb3JtICRbZV8xXGxkb3RzIGVfbiRdIGlzICRMaXN0PCBcRFlOQU1JQ3t9PiQuCgpccmF0aW9uYWxlewpJdCBpcyB0ZW1wdGluZyB0byBhc3N1bWUgdGhhdCB0aGUgdHlwZSBvZiB0aGUgbGlzdCBsaXRlcmFsIHdvdWxkIGJlIGNvbXB1dGVkIGJhc2VkIG9uIHRoZSB0eXBlcyBvZiBpdHMgZWxlbWVudHMuIEhvd2V2ZXIsIGZvciBtdXRhYmxlIGxpc3RzIHRoaXMgbWF5IGJlIHVud2FycmFudGVkLiBFdmVuIGZvciBjb25zdGFudCBsaXN0cywgd2UgZm91bmQgdGhpcyBiZWhhdmlvciB0byBiZSBwcm9ibGVtYXRpYy4gU2luY2UgY29tcGlsZS10aW1lIGlzIG9mdGVuIGFjdHVhbGx5IHJ1bnRpbWUsIHRoZSBydW50aW1lIHN5c3RlbSBtdXN0IGJlIGFibGUgdG8gcGVyZm9ybSBhIGNvbXBsZXggbGVhc3QgdXBwZXIgYm91bmQgY29tcHV0YXRpb24gdG8gZGV0ZXJtaW5lIGEgcmVhc29uYWJseSBwcmVjaXNlIHR5cGUuIEl0IGlzIGJldHRlciB0byBsZWF2ZSB0aGlzIHRhc2sgdG8gYSB0b29sIGluIHRoZSBJREUuIEl0IGlzIGFsc28gbXVjaCBtb3JlIHVuaWZvcm0gKGFuZCB0aGVyZWZvcmUgcHJlZGljdGFibGUgYW5kIHVuZGVyc3RhbmRhYmxlKSB0byBpbnNpc3QgdGhhdCB3aGVuZXZlciB0eXBlcyBhcmUgdW5zcGVjaWZpZWQgdGhleSBhcmUgYXNzdW1lZCB0byBiZSB0aGUgdW5rbm93biB0eXBlICBcRFlOQU1JQ3t9Lgp9CgolSW52b2tpbmcgdGhlIGdldHRlciBcY29kZXtydW50aW1lVHlwZX0gb24gYSBsaXN0IGxpdGVyYWwgcmV0dXJucyB0aGUgXGNvZGV7VHlwZX0gb2JqZWN0IHRoYXQgaXMgdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uIFxjb2Rle0xpc3R9LiBUaGUgc3RhdGljIHR5cGUgb2YgYSBsaXN0IGxpdGVyYWwgaXMgXGNvZGV7TGlzdH0uCiUgd2hhdCBhYm91dCBnZW5lcmljcz8KICAgIApcc3Vic2VjdGlvbntNYXBzfQpcbGFiZWx7bWFwc30KCkEge1xlbSBtYXAgbGl0ZXJhbH0gZGVub3RlcyBhIG1hcCBvYmplY3QuIAoKXGJlZ2lue2dyYW1tYXJ9CntcYmYgbWFwTGl0ZXJhbDp9CiAgICAgIFxDT05TVHt9PyAgdHlwZUFyZ3VtZW50cz8gYFx7JyAobWFwTGl0ZXJhbEVudHJ5IChgLCcgbWFwTGl0ZXJhbEVudHJ5KSogYCwnPyk/IGBcfScKICAgIC4KCntcYmYgbWFwTGl0ZXJhbEVudHJ5On0KICAgICAgICAlIGlkZW50aWZpZXIgYHtcZXNjYXBlZ3JhbW1hciA6fScgZXhwcmVzc2lvbjsKCWV4cHJlc3Npb24gYHtcZXNjYXBlZ3JhbW1hciA6fScgZXhwcmVzc2lvbiAKICAgIC4KXGVuZHtncmFtbWFyfQoKQSB7XGVtIG1hcCBsaXRlcmFsfSBjb25zaXN0cyBvZiB6ZXJvIG9yIG1vcmUgZW50cmllcy4gRWFjaCBlbnRyeSBoYXMgYSB7XGVtIGtleX0gYW5kIGEge1xlbSB2YWx1ZX0uICBFYWNoIGtleSBhbmQgZWFjaCB2YWx1ZSBpcyBkZW5vdGVkIGJ5IGFuIGV4cHJlc3Npb24uIAogCklmIGEgbWFwIGxpdGVyYWwgYmVnaW5zIHdpdGggdGhlIHJlc2VydmVkIHdvcmQgXENPTlNUe30sIGl0IGlzIGEge1xlbSBjb25zdGFudCBtYXAgbGl0ZXJhbH0gd2hpY2ggaXMgYSBjb21waWxlLXRpbWUgY29uc3RhbnQgKFxyZWZ7Y29uc3RhbnRzfSkgYW5kIHRoZXJlZm9yZSBldmFsdWF0ZWQgYXQgY29tcGlsZS10aW1lLiBPdGhlcndpc2UsIGl0IGlzIGEge1xlbSBydW4tdGltZSBtYXAgbGl0ZXJhbH0gYW5kIGl0IGlzIGV2YWx1YXRlZCBhdCBydW4tdGltZS4gT25seSBydW4tdGltZSBtYXAgbGl0ZXJhbHMgY2FuIGJlIG11dGF0ZWQKYWZ0ZXIgdGhleSBhcmUgY3JlYXRlZC4gQXR0ZW1wdGluZyB0byBtdXRhdGUgYSBjb25zdGFudCBtYXAgbGl0ZXJhbCB3aWxsIHJlc3VsdCBpbiBhIGR5bmFtaWMgZXJyb3IuCgpJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBlaXRoZXIgYSBrZXkgb3IgYSB2YWx1ZSBvZiBhbiBlbnRyeSBpbiBhIGNvbnN0YW50IG1hcCBsaXRlcmFsIGlzIG5vdCBhIGNvbXBpbGUtdGltZSBjb25zdGFudC4gSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgdGhlIGtleSBvZiBhbiBlbnRyeSBpbiBhIGNvbnN0YW50IG1hcCBsaXRlcmFsIGlzIGFuIGluc3RhbmNlIG9mIGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBvcGVyYXRvciAkPT0kIHVubGVzcyB0aGUga2V5IGlzIGEgCiVzeW1ib2wsIApzdHJpbmcsIGFuIGludGVnZXIsIGEgbGl0ZXJhbCBzeW1ib2wgb3IgdGhlIHJlc3VsdCBvZiBpbnZva2luZyBhIGNvbnN0YW50IGNvbnN0cnVjdG9yIG9mIGNsYXNzIFxjZHtTeW1ib2x9LiAKSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgdGhlIHR5cGUgYXJndW1lbnRzIG9mIGEgY29uc3RhbnQgbWFwIGxpdGVyYWwgaW5jbHVkZSBhIHR5cGUgcGFyYW1ldGVyLiAKClRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IG1hcCBsaXRlcmFsICBcQ09OU1R7fSQgPEssIFY+XHtrXzE6ZV8xXGxkb3RzIGtfbiA6ZV9uXH0kIGlzIGFuIG9iamVjdCAkbSQgd2hvc2UgY2xhc3MgaW1wbGVtZW50cyB0aGUgYnVpbHQtaW4gY2xhc3MgJE1hcDxLLCBWPiQuIFRoZSBlbnRyaWVzIG9mICRtJCBhcmUgJHVfaTp2X2ksIGkgXGluIDEgLi4gbiQsIHdoZXJlICR1X2kkIGlzIHRoZSB2YWx1ZSBvZiB0aGUgY29tcGlsZS10aW1lIGV4cHJlc3Npb24gJGtfaSQgYW5kICR2X2kkIGlzIHRoZSB2YWx1ZSBvZiB0aGUgY29tcGlsZS10aW1lIGV4cHJlc3Npb24gJGVfaSQuICBUaGUgdmFsdWUgb2YgYSBjb25zdGFudCBtYXAgbGl0ZXJhbCAgXENPTlNUe30gJFx7a18xOmVfMVxsZG90cyBrX24gOmVfblx9JCBpcyBkZWZpbmVkIGFzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IG1hcCBsaXRlcmFsIFxDT05TVHt9ICQ8XERZTkFNSUN7fSwgXERZTkFNSUN7fT5ce2tfMTplXzFcbGRvdHMga19uIDplX25cfSQuCgpMZXQgJG1hcF8xID0kIFxDT05TVHt9JCA8SywgVj5ce2tfezExfTplX3sxMX0gXGxkb3RzIGtfezFufSA6ZV97MW59XH0kIGFuZCAgJG1hcF8yID0kICBcQ09OU1R7fSQgPEosIFU+XHtrX3syMX06ZV97MjF9IFxsZG90cyBrX3sybn0gOmVfezJufVx9JCBiZSB0d28gY29uc3RhbnQgbWFwIGxpdGVyYWxzLiBMZXQgdGhlIGtleXMgb2YgJG1hcF8xJCBhbmQgJG1hcF8yJCBldmFsdWF0ZSB0byAgJHNfezExfSBcbGRvdHMgIHNfezFufSQgIGFuZCAgICRzX3syMX0gXGxkb3RzICBzX3sybn0kIHJlc3BlY3RpdmVseSwgYW5kIGxldCB0aGUgZWxlbWVudHMgb2YgJG1hcF8xJCBhbmQgJG1hcF8yJCBldmFsdWF0ZSB0byAkb197MTF9IFxsZG90cyAgb197MW59JCBhbmQgJG9fezIxfSBcbGRvdHMgIG9fezJufSQgcmVzcGVjdGl2ZWx5LiBJZmYgXGNvZGV7aWRlbnRpY2FsKCRvX3sxaX0kLCAkb197Mml9JCl9ICBhbmQgXGNvZGV7aWRlbnRpY2FsKCRzX3sxaX0kLCAkc197Mml9JCl9IGZvciAkaSBcaW4gMS4uIG4kLCBhbmQgJEsgPSBKLCBWID0gVSQgdGhlbiBcY29kZXtpZGVudGljYWwoJG1hcF8xJCwgJG1hcF8yJCl9LiAKClxjb21tZW50YXJ5e0luIG90aGVyIHdvcmRzLCBjb25zdGFudCBtYXAgbGl0ZXJhbHMgYXJlIGNhbm9uaWNhbGl6ZWQufQoKQSBydW50aW1lIG1hcCBsaXRlcmFsICQ8SywgVj5ce2tfMTplXzFcbGRvdHMga19uIDplX25cfSQgIGlzIGV2YWx1YXRlZCBhcyBmb2xsb3dzOgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0KRmlyc3QsIHRoZSBleHByZXNzaW9uICRrX2kkIGlzIGV2YWx1YXRlZCB5aWVsZGluZyBvYmplY3QgJHVfaSQsIHRoZSAkZV9pJCBpcyB2YXVsdGVkIHlpZWxkaW5nIG9iamVjdCAkb19pJCwgZm9yICRpIFxpbiAxLi5uJCBpbiBsZWZ0IHRvIHJpZ2h0IG9yZGVyLCB5aWVsZGluZyBvYmplY3RzICR1XzEsIG9fMVxsZG90cyB1X24sIG9fbiQuClxpdGVtICBBIGZyZXNoIGluc3RhbmNlIChccmVme2dlbmVyYXRpdmVDb25zdHJ1Y3RvcnN9KSAkbSQgd2hvc2UgY2xhc3MgaW1wbGVtZW50cyB0aGUgYnVpbHQtaW4gY2xhc3MKIAogJE1hcDxLLCBWPiQgaXMgYWxsb2NhdGVkLiAKXGl0ZW0KVGhlIG9wZXJhdG9yIFxjb2Rle1tdPX0gaXMgaW52b2tlZCBvbiAkbSQgd2l0aCAgZmlyc3QgIGFyZ3VtZW50ICR1X2kkIGFuZCBzZWNvbmQgYXJndW1lbnQgJG9faSwgIGkgXGluIDEuLiBuJC4KXGl0ZW0KVGhlIHJlc3VsdCBvZiB0aGUgZXZhbHVhdGlvbiBpcyAkbSQuClxlbmR7aXRlbWl6ZX0KCgpBIHJ1bnRpbWUgbWFwIGxpdGVyYWwgICRce2tfMTplXzFcbGRvdHMga19uIDplX25cfSQgaXMgZXZhbHVhdGVkIGFzICAKCiQ8XERZTkFNSUN7fSwgIFxEWU5BTUlDe30+XHtrXzE6ZV8xXGxkb3RzIGtfbiA6ZV9uXH0kLgoKSWZmIGFsbCB0aGUga2V5cyBpbiBhIG1hcCBsaXRlcmFsIGFyZSBjb21waWxlLXRpbWUgY29uc3RhbnRzLCBpdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmIHRoZSB2YWx1ZXMgb2YgYW55IHR3byBrZXlzIGluIGEgbWFwIGxpdGVyYWwgYXJlIGVxdWFsLgoKQSBtYXAgbGl0ZXJhbCBpcyBvcmRlcmVkOiBpdGVyYXRpbmcgb3ZlciB0aGUga2V5cyBhbmQvb3IgdmFsdWVzIG9mIHRoZSBtYXBzIGFsd2F5cyBoYXBwZW5zIGluIHRoZSAKIG9yZGVyIHRoZSBrZXlzIGFwcGVhcmVkIGluIHRoZSBzb3VyY2UgY29kZS4KClxjb21tZW50YXJ5ewpPZiBjb3Vyc2UsIGlmIGEga2V5IHJlcGVhdHMsIHRoZSBvcmRlciBpcyBkZWZpbmVkIGJ5IGZpcnN0IG9jY3VycmVuY2UsIGJ1dCB0aGUgdmFsdWUgaXMgZGVmaW5lZCBieSB0aGUgbGFzdC4KfSAKClRoZSBzdGF0aWMgdHlwZSBvZiBhIG1hcCBsaXRlcmFsIG9mIHRoZSBmb3JtICBcQ09OU1R7fSQgPEssIFY+XHtrXzE6ZV8xXGxkb3RzIGtfbiA6ZV9uXH0kIG9yIHRoZSBmb3JtICQ8SywgVj5ce2tfMTplXzFcbGRvdHMga19uIDplX25cfSQgaXMgJE1hcDxLLCBWPiQuIFRoZSBzdGF0aWMgdHlwZSBhIG1hcCBsaXRlcmFsIG9mIHRoZSBmb3JtICBcQ09OU1R7fSRce2tfMTplXzFcbGRvdHMga19uIDplX25cfSQgb3IgdGhlIGZvcm0gJFx7a18xOmVfMVxsZG90cyBrX24gOmVfblx9JCBpcyAkTWFwPFxEWU5BTUlDe30sICBcRFlOQU1JQ3t9PiQuIAoKClxzdWJzZWN0aW9ue1Rocm93fQpcbGFiZWx7dGhyb3d9CgpUaGUge1xlbSB0aHJvdyBleHByZXNzaW9ufSAgaXMgdXNlZCB0byByYWlzZSBhbiBleGNlcHRpb24uCgogXGJlZ2lue2dyYW1tYXJ9CntcYmYgdGhyb3dFeHByZXNzaW9uOn0KICAgICBcVEhST1d7fSBleHByZXNzaW9uIAogICAgLgogICAgCiAgIHtcYmYgdGhyb3dFeHByZXNzaW9uV2l0aG91dENhc2NhZGU6fQogICAgIFxUSFJPV3t9IGV4cHJlc3Npb25XaXRob3V0Q2FzY2FkZSAKICAgIC4KIAogXGVuZHtncmFtbWFyfQogCiBUaGUge1xlbSBjdXJyZW50IGV4Y2VwdGlvbn0gaXMgdGhlIGxhc3QgdW5oYW5kbGVkIGV4Y2VwdGlvbiB0aHJvd24uIAoKIEV2YWx1YXRpb24gb2YgYSB0aHJvdyBleHByZXNzaW9uIG9mIHRoZSBmb3JtICBcY29kZXtcVEhST1d7fSAkZSQ7fSBwcm9jZWVkcyBhcyBmb2xsb3dzOgogClRoZSBleHByZXNzaW9uICRlJCBpcyBldmFsdWF0ZWQgeWllbGRpbmcgYSB2YWx1ZSAkdiQuIElmICR2JCBldmFsdWF0ZXMgdG8gXE5VTEx7fSwgdGhlbiBhIFxjb2Rle051bGxUaHJvd25FcnJvcn0gaXMgdGhyb3duLiBPdGhlcndpc2UsIGNvbnRyb2wgaXMgdHJhbnNmZXJyZWQgdG8gdGhlIG5lYXJlc3QgZHluYW1pY2FsbHkgZW5jbG9zaW5nIGV4Y2VwdGlvbiBoYW5kbGVyIChccmVme3RyeX0pLCB3aXRoIHRoZSBjdXJyZW50IGV4Y2VwdGlvbiBzZXQgdG8gJHYkLgoKXGNvbW1lbnRhcnl7ClRoZXJlIGlzIG5vIHJlcXVpcmVtZW50IHRoYXQgdGhlIGV4cHJlc3Npb24gJGUkIGV2YWx1YXRlIHRvIGEgc3BlY2lhbCBraW5kIG9mIGV4Y2VwdGlvbiBvciBlcnJvciBvYmplY3QuCn0KCklmIHRoZSBvYmplY3QgYmVpbmcgdGhyb3duIGlzIGFuIGluc3RhbmNlIG9mIGNsYXNzIFxjb2Rle0Vycm9yfSBvciBhIHN1YmNsYXNzIHRoZXJlb2YsIGl0cyBcY29kZXtzdGFja1RyYWNlfSBnZXR0ZXIgd2lsbCByZXR1cm4gdGhlIHN0YWNrIHRyYWNlIGN1cnJlbnQgYXQgdGhlIHBvaW50IHdoZXJlIHRoZSB0aGUgb2JqZWN0IHdhcyBmaXJzdCB0aHJvd24uCgpUaGUgc3RhdGljIHR5cGUgb2YgYSB0aHJvdyBleHByZXNzaW9uIGlzICRcYm90JC4KCgpcc3Vic2VjdGlvbnsgRnVuY3Rpb24gRXhwcmVzc2lvbnN9ClxsYWJlbHtmdW5jdGlvbkV4cHJlc3Npb25zfQoKQSB7XGVtIGZ1bmN0aW9uIGxpdGVyYWx9IGlzIGFuIG9iamVjdCB0aGF0IGVuY2Fwc3VsYXRlcyBhbiBleGVjdXRhYmxlIHVuaXQgb2YgY29kZS4gCgpcYmVnaW57Z3JhbW1hcn0Ke1xiZiBmdW5jdGlvbkV4cHJlc3Npb246fQogICAgZm9ybWFsUGFyYW1ldGVyTGlzdCBmdW5jdGlvbkV4cHJlc3Npb25Cb2R5CiAgICAuCgoKe1xiZiBmdW5jdGlvbkV4cHJlc3Npb25Cb2R5On0KICAgICAgYD17XGVzY2FwZWdyYW1tYXIgXGd0fScgZXhwcmVzc2lvbjsKICAgICAgYmxvY2sKICAgIC4KIFxlbmR7Z3JhbW1hcn0gICAKIApUaGUgY2xhc3Mgb2YgYSBmdW5jdGlvbiBsaXRlcmFsIGltcGxlbWVudHMgdGhlIGJ1aWx0LWluIGNsYXNzIFxjb2Rle0Z1bmN0aW9ufS4gICAKJUludm9raW5nIHRoZSBnZXR0ZXIgXGNvZGV7cnVudGltZVR5cGV9IG9uIGEgZnVuY3Rpb24gbGl0ZXJhbCByZXR1cm5zIHRoZSBcY29kZXtUeXBlfSBvYmplY3QgdGhhdCBpcyB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gXGNvZGV7RnVuY3Rpb259LgolIG5vdCBuZWNlc3NhcmlseQoKCiVRe0NhbiBhbnlvbmUgaW1wbGVtZW50IGl0PyBUaGVuIHdlIHNob3VsZCBkZWZpbmUgdGhpbmdzIHZpYSBjYWxsfQoKVGhlIHN0YXRpYyB0eXBlIG9mIGEgZnVuY3Rpb24gbGl0ZXJhbCBvZiB0aGUgZm9ybSAKCiQoVF8xJCAkYV8xLCBcbGRvdHMsIFRfbiQgJGFfbiwgW1Rfe24rMX0kICR4X3tuKzF9ID0gZF8xLCBcbGRvdHMsICBUX3tuK2t9JCAkeF97bitrfSA9IGRfa10pID0+IGUkIAoKaXMgJChUXzEgXGxkb3RzLCBUX24sIFtUX3tuKzF9JCAkeF97bisxfSwgXGxkb3RzLCBUX3tuK2t9JCAkeF97bitrfV0pIFxyaWdodGFycm93IFRfMCQsIHdoZXJlICRUXzAkIGlzIHRoZSBzdGF0aWMgdHlwZSBvZiAkZSQuIEluIGFueSBjYXNlIHdoZXJlICRUX2ksIDEgXGxlIGkgXGxlIG4rayQsIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGlzIGNvbnNpZGVyZWQgdG8gaGF2ZSBiZWVuIHNwZWNpZmllZCBhcyAgXERZTkFNSUN7fS4KClRoZSBzdGF0aWMgdHlwZSBvZiBhIGZ1bmN0aW9uIGxpdGVyYWwgb2YgdGhlIGZvcm0gCgokKFRfMSQgJGFfMSwgXGxkb3RzLCBUX24kICRhX24sIFx7VF97bisxfSQgJHhfe24rMX0gOiBkXzEsIFxsZG90cywgIFRfe24ra30kICR4X3tuK2t9IDogZF9rXH0pID0+IGUkIAoKaXMgJChUXzEgXGxkb3RzLCBUX24sIFx7VF97bisxfSQgJHhfe24rMX0sIFxsZG90cywgVF97bitrfSQgJHhfe24ra31cfSkgXHJpZ2h0YXJyb3cgVF8wJCwgd2hlcmUgJFRfMCQgaXMgdGhlIHN0YXRpYyB0eXBlIG9mICRlJC4gSW4gYW55IGNhc2Ugd2hlcmUgJFRfaSwgMSBcbGUgaSBcbGUgbitrJCwgaXMgbm90IHNwZWNpZmllZCwgaXQgaXMgY29uc2lkZXJlZCB0byBoYXZlIGJlZW4gc3BlY2lmaWVkIGFzICBcRFlOQU1JQ3t9LgoKVGhlIHN0YXRpYyB0eXBlIG9mIGEgZnVuY3Rpb24gbGl0ZXJhbCBvZiB0aGUgZm9ybSAgCgokKFRfMSQgJGFfMSwgXGxkb3RzLCBUX24kICRhX24sIFtUX3tuKzF9JCAkeF97bisxfSA9IGRfMSwgXGxkb3RzLCAgVF97bitrfSQgJHhfe24ra309IGRfa10pXHtzXH0kIAoKaXMgJChUXzEgXGxkb3RzLCBUX24sIFtUX3tuKzF9JCAkeF97bisxfSwgXGxkb3RzLCBUX3tuK2t9JCAkeF97bitrfV0pIFxyaWdodGFycm93ICBcRFlOQU1JQ3t9JC4gSW4gYW55IGNhc2Ugd2hlcmUgJFRfaSwgMSBcbGUgaSBcbGUgbitrJCwgaXMgbm90IHNwZWNpZmllZCwgaXQgaXMgY29uc2lkZXJlZCB0byBoYXZlIGJlZW4gc3BlY2lmaWVkIGFzICBcRFlOQU1JQ3t9LgoKVGhlIHN0YXRpYyB0eXBlIG9mIGEgZnVuY3Rpb24gbGl0ZXJhbCBvZiB0aGUgZm9ybSAgCgokKFRfMSQgJGFfMSwgXGxkb3RzLCBUX24kICRhX24sIFx7VF97bisxfSQgJHhfe24rMX0gOiBkXzEsIFxsZG90cywgIFRfe24ra30kICR4X3tuK2t9IDogZF9rXH0pXHtzXH0kIAoKaXMgJChUXzEgXGxkb3RzLCBUX24sIFx7VF97bisxfSQgJHhfe24rMX0sIFxsZG90cywgVF97bitrfSQgJHhfe24ra31cfSkgXHJpZ2h0YXJyb3cgIFxEWU5BTUlDe30kLiBJbiBhbnkgY2FzZSB3aGVyZSAkVF9pLCAxIFxsZSBpIFxsZSBuK2skLCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBpcyBjb25zaWRlcmVkIHRvIGhhdmUgYmVlbiBzcGVjaWZpZWQgYXMgIFxEWU5BTUlDe30uCgolKiogTm93IHRoYXQgZGVjbGFyZWQgcmV0dXJuIHR5cGVzIGFyZSBwcmVjbHVkZWQsIGRvIHdlIG5lZWQgc29tZSBiZXR0ZXIgcmV0dXJuIHR5cGUgcnVsZSBmb3IgKHgpe3N9IGFuZCBmcmllbmRzPwoKCgpcc3Vic2VjdGlvbnsgVGhpc30KXGxhYmVse3RoaXN9CgpUaGUgcmVzZXJ2ZWQgd29yZCBcVEhJU3t9IGRlbm90ZXMgdGhlIHRhcmdldCBvZiB0aGUgY3VycmVudCBpbnN0YW5jZSBtZW1iZXIgaW52b2NhdGlvbi4KClxiZWdpbntncmFtbWFyfQp7XGJmIHRoaXNFeHByZXNzaW9uOn0KICAgICAgXFRISVN7fQogICAgIC4KXGVuZHtncmFtbWFyfQoKVGhlIHN0YXRpYyB0eXBlIG9mIFxUSElTe30gaXMgdGhlIGludGVyZmFjZSBvZiB0aGUgaW1tZWRpYXRlbHkgZW5jbG9zaW5nIGNsYXNzLgoKXGNvbW1lbnRhcnl7CldlIGRvIG5vdCBzdXBwb3J0IHNlbGYtdHlwZXMgYXQgdGhpcyBwb2ludC4gCn0KCkl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIFxUSElTe30gYXBwZWFycyBpbiBhIHRvcC1sZXZlbCBmdW5jdGlvbiBvciB2YXJpYWJsZSBpbml0aWFsaXplciwgIGluIGEgZmFjdG9yeSBjb25zdHJ1Y3Rvciwgb3IgaW4gYSBzdGF0aWMgbWV0aG9kIG9yIHZhcmlhYmxlIGluaXRpYWxpemVyLCBvciBpbiB0aGUgaW5pdGlhbGl6ZXIgb2YgYW4gaW5zdGFuY2UgdmFyaWFibGUuIAoKXHN1YnNlY3Rpb257IEluc3RhbmNlIENyZWF0aW9ufQpcbGFiZWx7aW5zdGFuY2VDcmVhdGlvbn0KCkluc3RhbmNlIGNyZWF0aW9uIGV4cHJlc3Npb25zIGludm9rZSBjb25zdHJ1Y3RvcnMgdG8gcHJvZHVjZSBpbnN0YW5jZXMuIAoKJUl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIGFueSBvZiB0aGUgdHlwZSBhcmd1bWVudHMgdG8gYSBjb25zdHJ1Y3RvciBvZiBhIGdlbmVyaWMgdHlwZSBpbnZva2VkIGJ5IGEgbmV3IGV4cHJlc3Npb24gb3IgYSBjb25zdGFudCBvYmplY3QgZXhwcmVzc2lvbiBkbyBub3QgZGVub3RlIHR5cGVzIGluIHRoZSBlbmNsb3NpbmcgbGV4aWNhbCBzY29wZS4gCgolSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgYSBjb25zdHJ1Y3RvciBvZiBhIG5vbi1nZW5lcmljIHR5cGUgaW52b2tlZCBieSBhIG5ldyBleHByZXNzaW9uIG9yIGEgY29uc3RhbnQgb2JqZWN0IGV4cHJlc3Npb24gaXMgcGFzc2VkIGFueSB0eXBlIGFyZ3VtZW50cy4gSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgYSBjb25zdHJ1Y3RvciBvZiBhIGdlbmVyaWMgdHlwZSB3aXRoICRuJCB0eXBlIHBhcmFtZXRlcnMgaW52b2tlZCBieSBhIG5ldyBleHByZXNzaW9uIG9yIGEgY29uc3RhbnQgb2JqZWN0IGV4cHJlc3Npb24gaXMgcGFzc2VkICRtJCB0eXBlIGFyZ3VtZW50cyB3aGVyZSAkbSBcbmUgbiQsIG9yIGlmIGFueSBvZiBpdHMgdHlwZSBhcmd1bWVudHMgaXMgIG1pc2NvbnN0cnVjdGVkIChccmVme3BhcmFtZXRlcml6ZWRUeXBlc30pLgoKSXQgaXMgYSBzdGF0aWMgdHlwZSB3YXJuaW5nIGlmCnRoZSB0eXBlICRUJCBpbiBhbiBpbnN0YW5jZSBjcmVhdGlvbiBleHByZXNzaW9uIG9mIG9uZSBvZiAgdGhlIGZvcm1zIAoKXE5FV3t9ICRULmlkKGFfMSwgXGxkb3RzICwgYV9uLCB4X3tuKzF9OiBhX3tuKzF9LCBcbGRvdHMgLCB4X3tuK2t9OiBhX3tuK2t9KSQsICAKClxORVd7fSAkVChhXzEsIFxsZG90cyAsIGFfbiwgeF97bisxfTogYV97bisxfSwgXGxkb3RzICwgeF97bitrfTogYV97bitrfSkkLAoKXENPTlNUe30gJFQuaWQoYV8xLCBcbGRvdHMgLCBhX24sIHhfe24rMX06IGFfe24rMX0sIFxsZG90cyAsIHhfe24ra306IGFfe24ra30pJCwgIAoKXENPTlNUe30gJFQoYV8xLCBcbGRvdHMgLCBhX24sIHhfe24rMX06IGFfe24rMX0sIFxsZG90cyAsIHhfe24ra306IGFfe24ra30pJCBpcyBtYWxmb3JtZWQgKFxyZWZ7ZHluYW1pY1R5cGVTeXN0ZW19KSBvciBtYWxib3VuZGVkIChccmVme3BhcmFtZXRlcml6ZWRUeXBlc30pLgolYW55IG9mIHRoZSB0eXBlIGFyZ3VtZW50cyB0byBhIGNvbnN0cnVjdG9yIG9mIGEgZ2VuZXJpYyB0eXBlICRHJCBpbnZva2VkIGJ5IGEgbmV3IGV4cHJlc3Npb24gb3IgYSBjb25zdGFudCBvYmplY3QgZXhwcmVzc2lvbiBhcmUgbm90IHN1YnR5cGVzIG9mIHRoZSBib3VuZHMgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZm9ybWFsIHR5cGUgcGFyYW1ldGVycyBvZiAkRyQuCgoKXHN1YnN1YnNlY3Rpb257IE5ld30KXGxhYmVse25ld30KClRoZSB7XGVtIG5ldyBleHByZXNzaW9ufSBpbnZva2VzIGEgY29uc3RydWN0b3IgKFxyZWZ7Y29uc3RydWN0b3JzfSkuCgpcYmVnaW57Z3JhbW1hcn0Ke1xiZiBuZXdFeHByZXNzaW9uOn0KXE5FV3t9IHR5cGUgKGB7XGVzY2FwZWdyYW1tYXIgLn0nIGlkZW50aWZpZXIpPyBhcmd1bWVudHMKLgpcZW5ke2dyYW1tYXJ9CgpMZXQgJGUkIGJlIGEgbmV3IGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gIAoKXE5FV3t9ICRULmlkKGFfMSwgXGxkb3RzICwgYV9uLCB4X3tuKzF9OiBhX3tuKzF9LCBcbGRvdHMgLCB4X3tuK2t9OiBhX3tuK2t9KSQgb3IgdGhlIGZvcm0gIAoKXE5FV3t9ICRUKGFfMSwgXGxkb3RzICwgYV9uLCB4X3tuKzF9OiBhX3tuKzF9LCBcbGRvdHMgLCB4X3tuK2t9OiBhX3tuK2t9KSQuIAoKJUl0IGlzIGEgcnVudGltZSB0eXBlIGVycm9yIGlmCiV0aGUgdHlwZSAkVCQgIGlzIG1hbGZvcm1lZC4KJUl0IGlzIGEgc3RhdGljIHdhcm5pbmcgaWYgJFQkIGlzIGEgbWFsZm9ybWVkIHR5cGUuCgolbm90IGEgY2xhc3MgYWNjZXNzaWJsZSBpbiB0aGUgY3VycmVudCBzY29wZSwgIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgdHlwZSBhcmd1bWVudHMuIAoKSWYgJFQkIGlzICBhIGNsYXNzIG9yIHBhcmFtZXRlcml6ZWQgdHlwZSBhY2Nlc3NpYmxlIGluIHRoZSBjdXJyZW50IHNjb3BlIHRoZW46ClxiZWdpbntpdGVtaXplfQpcaXRlbQpJZiAkZSQgaXMgb2YgdGhlIGZvcm0gXE5FV3t9ICRULmlkKGFfMSwgXGxkb3RzICwgYV9uLCB4X3tuKzF9OiBhX3tuKzF9LCBcbGRvdHMgLCB4X3tuK2t9OiBhX3tuK2t9KSQgaXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiAkVC5pZCQgaXMgbm90IHRoZSBuYW1lIG9mIGEgY29uc3RydWN0b3IgZGVjbGFyZWQgYnkgdGhlIHR5cGUgJFQkLiBJZiAkZSQgaXMgb2YgdGhlIGZvcm0gIFxORVd7fSAkVChhXzEsIFxsZG90cyAsIGFfbiwgeF97bisxfTogYV97bisxfSwgXGxkb3RzICwgeF97bitrfTogYV97bitrfSkkIGl0IGlzIGEgc3RhdGljIHdhcm5pbmcgaWYgdGhlIHR5cGUgJFQkIGRvZXMgbm90IGRlY2xhcmUgYSBjb25zdHJ1Y3RvciB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGRlY2xhcmF0aW9uIG9mICRUJC4gClxlbmR7aXRlbWl6ZX0KCklmICRUJCBpcyBhIHBhcmFtZXRlcml6ZWQgdHlwZSAoXHJlZntwYXJhbWV0ZXJpemVkVHlwZXN9KSAkUzxVXzEsICBcbGRvdHMsIFVfbT4kLCBsZXQgJFIgPSBTJC4gIAolSXQgaXMgYSAKJWNvbXBpbGUtdGltZSBDSEFOR0VECiVydW50aW1lIHR5cGUKJWVycm9yIGlmICRTJCBpcyBub3QgYSBnZW5lcmljIChccmVme2dlbmVyaWNzfSkgdHlwZSB3aXRoICRtJCB0eXBlIHBhcmFtZXRlcnMuIApJZiAkVCQgaXMgbm90IGEgcGFyYW1ldGVyaXplZCB0eXBlLCBsZXQgJFIgPSBUJC4KRnVydGhlcm1vcmUsIGlmICRlJCBpcyBvZiB0aGUgZm9ybSBcTkVXe30gJFQuaWQoYV8xLCBcbGRvdHMgLCBhX24sIHhfe24rMX06IGFfe24rMX0sIFxsZG90cyAsIHhfe24ra306IGFfe24ra30pJCB0aGVuIGxldCAgJHEkIGJlIHRoZSBjb25zdHJ1Y3RvciAgJFQuaWQkLCBvdGhlcndpc2UgbGV0ICRxJCBiZSB0aGUgY29uc3RydWN0b3IgJFQkLiAKCklmICRSJCBpcyBhIGdlbmVyaWMgd2l0aCAkbCA9IG0kIHR5cGUgcGFyYW1ldGVycyB0aGVuClxiZWdpbntpdGVtaXplfQpcaXRlbSAgJFQkIGlzIG5vdCBhIHBhcmFtZXRlcml6ZWQgdHlwZSwgdGhlbiBmb3IgJCBpIFxpbiAxIC4uIGwkLCBsZXQgJFZfaSA9ICBcRFlOQU1JQ3t9JC4KXGl0ZW0gIElmICRUJCBpcyAgYSBwYXJhbWV0ZXJpemVkIHR5cGUgdGhlbiBsZXQgJFZfaSA9IFVfaSQgZm9yICQgaSBcaW4gMSAuLiBtJC4gIApcZW5ke2l0ZW1pemV9CgpJZiAkUiQgaXMgYSBnZW5lcmljIHdpdGggJGwgXG5lIG0kIHR5cGUgcGFyYW1ldGVycyB0aGVuIGZvciAkIGkgXGluIDEgLi4gbCQsIGxldCAkVl9pID0gIFxEWU5BTUlDe30kLiBJbiBhbnkgb3RoZXIgY2FzZSwgbGV0ICRWX2kgPSBVX2kkIGZvciAkIGkgXGluIDEgLi4gbSQuICAKCkV2YWx1YXRpb24gb2YgJGUkIHByb2NlZWRzIGFzIGZvbGxvd3M6CgpGaXJzdCwgdGhlIGFyZ3VtZW50IGxpc3QgJChhXzEsIFxsZG90cyAsIGFfbiwgeF97bisxfTogYV97bisxfSwgXGxkb3RzICwgeF97bitrfTogYV97bitrfSkkIGlzIGV2YWx1YXRlZC4gCgpJZiAkVCQgaXMgYSBkZWZlcnJlZCB0eXBlIHdpdGggcHJlZml4ICRwJCwgdGhlbiBpZiAkcCQgaGFzIG5vdCBiZWVuIHN1Y2Nlc3NmdWxseSBsb2FkZWQsIGEgZHluYW1pYyBlcnJvciBvY2N1cnMuCgpUaGVuLCBpZiAkcSQgaXMgYSBub24tZmFjdG9yeSBjb25zdHJ1Y3RvciBvZiBhbiBhYnN0cmFjdCBjbGFzcyB0aGVuIGFuIFxjb2Rle0Fic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uRXJyb3J9IGlzIHRocm93bi4KCklmICRUJCAgaXMgbWFsZm9ybWVkIG9yIGlmICRUJCBpcyBhIHR5cGUgdmFyaWFibGUgYSBkeW5hbWljIGVycm9yIG9jY3Vycy4gSW4gY2hlY2tlZCBtb2RlLCBpZiAkVCQgb3IgYW55IG9mIGl0cyBzdXBlcmNsYXNzZXMgaXMgbWFsYm91bmRlZCBhIGR5bmFtaWMgZXJyb3Igb2NjdXJzLgogT3RoZXJ3aXNlLCBpZiAkcSQgaXMgbm90IGRlZmluZWQgb3Igbm90IGFjY2Vzc2libGUsIGEgXGNvZGV7Tm9TdWNoTWV0aG9kRXJyb3J9IGlzIHRocm93bi4gIElmICRxJCBoYXMgIGxlc3MgdGhhbiAkbiQgcG9zaXRpb25hbCBwYXJhbWV0ZXJzIG9yIG1vcmUgdGhhbiAkbiQgcmVxdWlyZWQgcGFyYW1ldGVycywgb3IgaWYgJHEkIGxhY2tzIGFueSBvZiB0aGUga2V5d29yZCBwYXJhbWV0ZXJzICRceyB4X3tuKzF9LCBcbGRvdHMsIHhfe24ra31cfSQgYSBcY29kZXtOb1N1Y2hNZXRob2RFcnJvcn0gaXMgdGhyb3duLgoKT3RoZXJ3aXNlLCBpZiAkcSQgaXMgYSBnZW5lcmF0aXZlIGNvbnN0cnVjdG9yIChccmVme2dlbmVyYXRpdmVDb25zdHJ1Y3RvcnN9KSwgdGhlbjoKClxjb21tZW50YXJ5e05vdGUgdGhhdCBpdCB0aGlzIHBvaW50IHdlIGFyZSBhc3N1cmVkIHRoYXQgdGhlIG51bWJlciBvZiBhY3R1YWwgdHlwZSBhcmd1bWVudHMgbWF0Y2ggdGhlIG51bWJlciBvZiBmb3JtYWwgdHlwZSBwYXJhbWV0ZXJzLn0KCkEgZnJlc2ggaW5zdGFuY2UgKFxyZWZ7Z2VuZXJhdGl2ZUNvbnN0cnVjdG9yc30pLCAkaSQsICBvZiBjbGFzcyAkUiQgaXMgYWxsb2NhdGVkLiBGb3IgZWFjaCBpbnN0YW5jZSB2YXJpYWJsZSAkZiQgb2YgJGkkLCAgaWYgdGhlIHZhcmlhYmxlIGRlY2xhcmF0aW9uIG9mICRmJCBoYXMgYW4gaW5pdGlhbGl6ZXIgZXhwcmVzc2lvbiAkZV9mJCwgdGhlbiAkZV9mJCBpcyBldmFsdWF0ZWQgdG8gYW4gb2JqZWN0ICRvX2YkIGFuZCAkZiQgaXMgYm91bmQgdG8gJG9fZiQuIE90aGVyd2lzZSAkZiQgaXMgYm91bmQgdG8gXE5VTEx7fS4KClxjb21tZW50YXJ5ewpPYnNlcnZlIHRoYXQgXFRISVN7fSBpcyBub3QgaW4gc2NvcGUgaW4gJGVfZiQuIEhlbmNlLCB0aGUgaW5pdGlhbGl6YXRpb24gY2Fubm90IGRlcGVuZCBvbiBvdGhlciBwcm9wZXJ0aWVzIG9mIHRoZSBvYmplY3QgYmVpbmcgaW5zdGFudGlhdGVkLgp9CgpOZXh0LCAgJHEkIGlzIGV4ZWN1dGVkICB3aXRoIFxUSElTe30gYm91bmQgdG8gJGkkLCAgdGhlIHR5cGUgcGFyYW1ldGVycyAoaWYgYW55KSBvZiAkUiQgYm91bmQgdG8gdGhlIGFjdHVhbCB0eXBlIGFyZ3VtZW50cyAkVl8xLCBcbGRvdHMsIFZfbCQgYW5kIHRoZSBmb3JtYWwgcGFyYW1ldGVyIGJpbmRpbmdzIHRoYXQgcmVzdWx0ZWQgZnJvbSB0aGUgZXZhbHVhdGlvbiBvZiB0aGUgYXJndW1lbnQgbGlzdC4gVGhlIHJlc3VsdCBvZiB0aGUgZXZhbHVhdGlvbiBvZiAkZSQgaXMgJGkkLgoKT3RoZXJ3aXNlLCAkcSQgaXMgYSBmYWN0b3J5IGNvbnN0cnVjdG9yIChccmVme2ZhY3Rvcmllc30pLiBUaGVuOgoKSWYgJHEkIGlzIGEgcmVkaXJlY3RpbmcgZmFjdG9yeSBjb25zdHJ1Y3RvciBvZiB0aGUgZm9ybSAkVChwXzEsIFxsZG90cywgcF97bitrfSkgPSBjOyQgb3Igb2YgdGhlIGZvcm0gICRULmlkKHBfMSwgXGxkb3RzLCBwX3tuK2t9KSA9IGM7JCB0aGVuIHRoZSByZXN1bHQgb2YgdGhlIGV2YWx1YXRpb24gb2YgJGUkIGlzIGVxdWl2YWxlbnQgdG8gZXZhbHVhdGluZyB0aGUgZXhwcmVzc2lvbiAKCiRbVl8xLCAgXGxkb3RzLCBWX20vVF8xLCAgXGxkb3RzLCBUX21dKCRcY29kZXtcTkVXe30gJGMoYV8xLCBcbGRvdHMsIGFfbiwgeF97bisxfTogYV97bisxfSwgXGxkb3RzLCB4X3tuK2t9OiBhX3tuK2t9KSkkfS4gIElmIGV2YWx1YXRpb24gb2YgJHEkIGNhdXNlcyAkcSQgdG8gYmUgcmUtZXZhbHVhdGVkIGN5Y2xpY2FsbHksIGEgcnVudGltZSBlcnJvciBvY2N1cnMuCgoKT3RoZXJ3aXNlLCB0aGUgYm9keSBvZiAkcSQgaXMgZXhlY3V0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBiaW5kaW5ncyB0aGF0IHJlc3VsdGVkIGZyb20gdGhlIGV2YWx1YXRpb24gb2YgdGhlIGFyZ3VtZW50IGxpc3QgYW5kIHRoZSB0eXBlIHBhcmFtZXRlcnMgKGlmIGFueSkgb2YgJHEkIGJvdW5kIHRvIHRoZSBhY3R1YWwgdHlwZSBhcmd1bWVudHMgJFZfMSwgXGxkb3RzLCBWX2wkIHJlc3VsdGluZyBpbiBhbiBvYmplY3QgJGkkLiBUaGUgcmVzdWx0IG9mIHRoZSBldmFsdWF0aW9uIG9mICRlJCBpcyAkaSQuCgpJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmICRxJCBpcyBhIGNvbnN0cnVjdG9yIG9mIGFuIGFic3RyYWN0IGNsYXNzIGFuZCAkcSQgaXMgbm90IGEgZmFjdG9yeSBjb25zdHJ1Y3Rvci4KClxjb21tZW50YXJ5e1RoZSBhYm92ZSBnaXZlcyBwcmVjaXNlIG1lYW5pbmcgdG8gdGhlIGlkZWEgdGhhdCBpbnN0YW50aWF0aW5nIGFuIGFic3RyYWN0IGNsYXNzIGxlYWRzIHRvIGEgd2FybmluZy4gCkEgc2ltaWxhciBjbGF1c2UgYXBwbGllcyB0byBjb25zdGFudCBvYmplY3QgY3JlYXRpb24gaW4gdGhlIG5leHQgc2VjdGlvbi4KfSAKClxyYXRpb25hbGV7SW4gcGFydGljdWxhciwgYSBmYWN0b3J5IGNvbnN0cnVjdG9yIGNhbiBiZSBkZWNsYXJlZCBpbiBhbiBhYnN0cmFjdCBjbGFzcyBhbmQgdXNlZCBzYWZlbHksIGFzIGl0IHdpbGwgZWl0aGVyIHByb2R1Y2UgYSB2YWxpZCBpbnN0YW5jZSBvciBsZWFkIHRvIGEgd2FybmluZyBpbnNpZGUgaXRzIG93biBkZWNsYXJhdGlvbi4KfQoKVGhlIHN0YXRpYyB0eXBlIG9mIGFuIGluc3RhbmNlIGNyZWF0aW9uIGV4cHJlc3Npb24gb2YgZWl0aGVyIHRoZSBmb3JtIAoKXE5FV3t9ICRULmlkKGFfMSwgXGxkb3RzICwgYV9uLCB4X3tuKzF9OiBhX3tuKzF9LCBcbGRvdHMgLCB4X3tuK2t9OiBhX3tuK2t9KSQgCgpvciB0aGUgZm9ybSAKClxORVd7fSAkVChhXzEsIFxsZG90cyAsIGFfbiwgeF97bisxfTogYV97bisxfSwgXGxkb3RzICwgeF97bitrfTogYV97bitrfSkkIAoKaXMgJFQkLiAgCkl0IGlzIGEgc3RhdGljIHdhcm5pbmcgaWYgdGhlIHN0YXRpYyB0eXBlIG9mICRhX2ksIDEgXGxlIGkgXGxlIG4rIGskIG1heSBub3QgYmUgYXNzaWduZWQgdG8gdGhlIHR5cGUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZm9ybWFsIHBhcmFtZXRlciBvZiB0aGUgY29uc3RydWN0b3IgJFQuaWQkIChyZXNwZWN0aXZlbHkgJFQkKS4KCgoKXHN1YnN1YnNlY3Rpb257IENvbnN0fQpcbGFiZWx7Y29uc3R9CgpBIHtcZW0gY29uc3RhbnQgb2JqZWN0IGV4cHJlc3Npb259IGludm9rZXMgYSBjb25zdGFudCBjb25zdHJ1Y3RvciAoXHJlZntjb25zdGFudENvbnN0cnVjdG9yc30pLiAKClxiZWdpbntncmFtbWFyfQp7XGJmIGNvbnN0T2JqZWN0RXhwcmVzc2lvbjp9ClxDT05TVHt9IHR5cGUgKCd7XGVzY2FwZWdyYW1tYXIgLn0nIGlkZW50aWZpZXIpPyBhcmd1bWVudHMKLgpcZW5ke2dyYW1tYXJ9CgpMZXQgJGUkIGJlIGEgY29uc3RhbnQgb2JqZWN0IGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gIAoKXENPTlNUe30gJFQuaWQoYV8xLCBcbGRvdHMgLCBhX24sIHhfe24rMX06IGFfe24rMX0sIFxsZG90cyAsIHhfe24ra306IGFfe24ra30pJCAKCm9yIHRoZSBmb3JtICBcQ09OU1R7fSAkVChhXzEsIFxsZG90cyAsIGFfbiwgeF97bisxfTogYV97bisxfSwgXGxkb3RzICwgeF97bitrfTogYV97bitrfSkkLiBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiAkVCQgZG9lcyBub3QgZGVub3RlIGEgY2xhc3MgYWNjZXNzaWJsZSBpbiB0aGUgY3VycmVudCBzY29wZS4gIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmICRUJCBpcyBhIGRlZmVycmVkIHR5cGUgKFxyZWZ7c3RhdGljVHlwZXN9KS4KClxjb21tZW50YXJ5e0luIHBhcnRpY3VsYXIsICRUJCBtYXkgbm90IGJlIGEgdHlwZSB2YXJpYWJsZS59CgpJZiAkVCQgaXMgYSBwYXJhbWV0ZXJpemVkIHR5cGUsIGl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmICRUJCBpbmNsdWRlcyBhIHR5cGUgdmFyaWFibGUgYW1vbmcgaXRzIHR5cGUgYXJndW1lbnRzLgoKSWYgJGUkIGlzIG9mIHRoZSBmb3JtIFxDT05TVHt9ICRULmlkKGFfMSwgXGxkb3RzICwgYV9uLCB4X3tuKzF9OiBhX3tuKzF9LCBcbGRvdHMgLCB4X3tuK2t9OiBhX3tuK2t9KSQgaXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgJFQuaWQkIGlzIG5vdCB0aGUgbmFtZSBvZiBhIGNvbnN0YW50IGNvbnN0cnVjdG9yIGRlY2xhcmVkIGJ5IHRoZSB0eXBlICRUJC4gSWYgJGUkIGlzIG9mIHRoZSBmb3JtICBcQ09OU1R7fSAkVChhXzEsIFxsZG90cyAsIGFfbiwgeF97bisxfTogYV97bisxfSwgXGxkb3RzICwgeF97bitrfTogYV97bitrfSkkIGl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIHRoZSB0eXBlICRUJCBkb2VzIG5vdCBkZWNsYXJlIGEgY29uc3RhbnQgY29uc3RydWN0b3Igd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBkZWNsYXJhdGlvbiBvZiAkVCQuIAoKSW4gYWxsIG9mIHRoZSBhYm92ZSBjYXNlcywgaXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgJGFfaSwgIGlcaW4gMSAuLiBuICsgayQsIGlzIG5vdCBhIGNvbXBpbGUtdGltZSBjb25zdGFudCBleHByZXNzaW9uLgoKJUlmICRUJCBpcyBhIHBhcmFtZXRlcml6ZWQgdHlwZSAoXHJlZntwYXJhbWV0ZXJpemVkVHlwZXN9KSAkUzxVXzEsICBcbGRvdHMsIFVfbT4kLCBsZXQgJFIgPSBTJC4gIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmICRUJCBpcyBpcyBtYWxmb3JtZWQuIElmICRUJCBpcyBub3QgYSBwYXJhbWV0ZXJpemVkIHR5cGUsIGxldCAkUiA9IFQkLgogJUZpbmFsbHksIAolIElmICRUJCBpcyBhIGdlbmVyaWMgd2l0aCAkbCQgcmV0eXBlIHBhcmFtZXRlcnMsIHRoZW4gZm9yIGFsbCAkIGkgXGluIDEgLi4gbCQsIGxldCAkVl9pID0gIFxEWU5BTUlDe30kLiAgCgpFdmFsdWF0aW9uIG9mICRlJCBwcm9jZWVkcyBhcyBmb2xsb3dzOgoKRmlyc3QsIGlmICRlJCBpcyBvZiB0aGUgZm9ybSAKClxDT05TVHt9ICRULmlkKGFfMSwgXGxkb3RzICwgYV9uLCB4X3tuKzF9OiBhX3tuKzF9LCBcbGRvdHMgLCB4X3tuK2t9OiBhX3tuK2t9KSQgCgp0aGVuIGxldCAkaSQgYmUgdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uIAoKXE5FV3t9ICRULmlkKGFfMSwgXGxkb3RzICwgYV9uLCB4X3tuKzF9OiBhX3tuKzF9LCBcbGRvdHMgLCB4X3tuK2t9OiBhX3tuK2t9KSQuIAoKT3RoZXJ3aXNlLCAkZSQgbXVzdCBiZSBvZiB0aGUgZm9ybSAgCgpcQ09OU1R7fSAkVChhXzEsIFxsZG90cyAsIGFfbiwgeF97bisxfTogYV97bisxfSwgXGxkb3RzICwgeF97bitrfTogYV97bitrfSkkLCAKCmluIHdoaWNoIGNhc2UgbGV0ICRpJCBiZSB0aGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgCgpcTkVXe30gJFQoYV8xLCBcbGRvdHMgLCBhX24sIHhfe24rMX06IGFfe24rMX0sIFxsZG90cyAsIHhfe24ra306IGFfe24ra30pJC4gCgpUaGVuOgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gSWYgZHVyaW5nIGV4ZWN1dGlvbiBvZiB0aGUgcHJvZ3JhbSwgYSBjb25zdGFudCBvYmplY3QgZXhwcmVzc2lvbiBoYXMgYWxyZWFkeSBldmFsdWF0ZWQgdG8gYW4gaW5zdGFuY2UgJGokIG9mIGNsYXNzICRSJCB3aXRoIHR5cGUgYXJndW1lbnRzICRWX2ksIDEgXGxlIGkgXGxlIG0kLCB0aGVuOiAKXGJlZ2lue2l0ZW1pemV9ClxpdGVtIEZvciBlYWNoIGluc3RhbmNlIHZhcmlhYmxlICRmJCBvZiAkaSQsIGxldCAkdl97aWZ9JCBiZSB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkICRmJCBpbiAkaSQsIGFuZCBsZXQgJHZfe2pmfSQgYmUgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCAkZiQgaW4gJGokLiBJZiAgXGNvZGV7aWRlbnRpY2FsKCR2X3tpZn0kLCAkdl97amZ9JCl9IGZvciBhbGwgZmllbGRzICRmJCBpbiAkaSQsIHRoZW4gdGhlIHZhbHVlIG9mICRlJCBpcyAkaiQsIG90aGVyd2lzZSB0aGUgdmFsdWUgb2YgJGUkIGlzICRpJC4KXGVuZHtpdGVtaXplfQpcaXRlbSBPdGhlcndpc2UgdGhlIHZhbHVlIG9mICRlJCBpcyAkaSQuClxlbmR7aXRlbWl6ZX0KClxjb21tZW50YXJ5ewpJbiBvdGhlciB3b3JkcywgY29uc3RhbnQgb2JqZWN0cyBhcmUgY2Fub25pY2FsaXplZC4gIEluIG9yZGVyIHRvIGRldGVybWluZSBpZiBhbiBvYmplY3QgaXMgYWN0dWFsbHkgbmV3LCBvbmUgaGFzIHRvIGNvbXB1dGUgaXQ7IHRoZW4gaXQgY2FuIGJlIGNvbXBhcmVkIHRvIGFueSBjYWNoZWQgaW5zdGFuY2VzLiBJZiBhbiBlcXVpdmFsZW50IG9iamVjdCBleGlzdHMgaW4gdGhlIGNhY2hlLCB3ZSB0aHJvdyBhd2F5IHRoZSBuZXdseSBjcmVhdGVkIG9iamVjdCBhbmQgdXNlIHRoZSBjYWNoZWQgb25lLiBPYmplY3RzIGFyZSBlcXVpdmFsZW50IGlmIHRoZXkgaGF2ZSBpZGVudGljYWwgZmllbGRzIGFuZCBpZGVudGljYWwgdHlwZSBhcmd1bWVudHMuIFNpbmNlIHRoZSBjb25zdHJ1Y3RvciBjYW5ub3QgaW5kdWNlIGFueSBzaWRlIGVmZmVjdHMsIHRoZSBleGVjdXRpb24gb2YgdGhlIGNvbnN0cnVjdG9yIGlzIHVub2JzZXJ2YWJsZS4gIFRoZSBjb25zdHJ1Y3RvciBuZWVkIG9ubHkgYmUgZXhlY3V0ZWQgb25jZSBwZXIgY2FsbCBzaXRlLCBhdCBjb21waWxlLXRpbWUuCn0KClRoZSBzdGF0aWMgdHlwZSBvZiBhIGNvbnN0YW50IG9iamVjdCBleHByZXNzaW9uIG9mIGVpdGhlciB0aGUgZm9ybSAKClxDT05TVHt9ICRULmlkKGFfMSwgXGxkb3RzICwgYV9uLCB4X3tuKzF9OiBhX3tuKzF9LCBcbGRvdHMgLCB4X3tuK2t9OiBhX3tuK2t9KSQgCgpvciB0aGUgZm9ybSAgCgpcQ09OU1R7fSAkVChhXzEsIFxsZG90cyAsIGFfbiwgeF97bisxfTogYV97bisxfSwgXGxkb3RzICwgeF97bitrfTogYV97bitrfSkkIAoKaXMgJFQkLiBJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmIHRoZSBzdGF0aWMgdHlwZSBvZiAkYV9pLCAxIFxsZSBpIFxsZSBuKyBrJCBtYXkgbm90IGJlIGFzc2lnbmVkIHRvIHRoZSB0eXBlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGZvcm1hbCBwYXJhbWV0ZXIgb2YgdGhlIGNvbnN0cnVjdG9yICRULmlkJCAocmVzcGVjdGl2ZWx5ICRUJCkuCgpJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBldmFsdWF0aW9uIG9mIGEgY29uc3RhbnQgb2JqZWN0IHJlc3VsdHMgaW4gYW4gdW5jYXVnaHQgZXhjZXB0aW9uIGJlaW5nIHRocm93bi4KClxjb21tZW50YXJ5ewpUbyBzZWUgaG93IHN1Y2ggc2l0dWF0aW9ucyBtaWdodCBhcmlzZSwgY29uc2lkZXIgdGhlIGZvbGxvd2luZyBleGFtcGxlczoKfQoKXGJlZ2lue2RhcnRDb2RlfQpcQ0xBU1N7fSBBIFx7CiAgIFxGSU5BTHt9ICB4OwogICBcQ09OU1R7fSBBKHApOiB4ID0gcCAqIDEwOwpcfQoKXENPTlNUe30gQSgieCIpOyAvLyBjb21waWxlLXRpbWUgZXJyb3IKXENPTlNUe30gQSg1KTsgLy8gbGVnYWwKCgpcQ0xBU1N7fSBJbnRQYWlyIFx7CiBcQ09OU1R7fSBJbnRQYWlyKFxUSElTe30ueCwgXFRISVN7fS55KTsKIFxGSU5BTHt9IGludCB4OwogXEZJTkFMe30gaW50IHk7CiBcT1BFUkFUT1IgKih2KSAkPT4kIFxORVd7fSBJbnRQYWlyKHgqdiwgeSp2KTsKXH0KClxDT05TVHt9IEEoXENPTlNUe30gSW50UGFpcigxLDIpKTsgLy8gY29tcGlsZS10aW1lIGVycm9yOiBpbGxlZ2FsIGluIGEgc3VidGxlciB3YXkKXGVuZHtkYXJ0Q29kZX0KClxjb21tZW50YXJ5ewpEdWUgdG8gdGhlIHJ1bGVzIGdvdmVybmluZyBjb25zdGFudCBjb25zdHJ1Y3RvcnMsIGV2YWx1YXRpbmcgdGhlIGNvbnN0cnVjdG9yIFxjb2Rle0EoKX0gd2l0aCB0aGUgYXJndW1lbnQgXGNvZGV7Jyd4Jyd9IG9yIHRoZSBhcmd1bWVudCBcY29kZXtcQ09OU1R7fSBJbnRQYWlyKDEsIDIpfSB3b3VsZCBjYXVzZSBpdCB0byB0aHJvdyBhbiBleGNlcHRpb24sIHJlc3VsdGluZyBpbiBhIGNvbXBpbGUtdGltZSBlcnJvci4KfQoKCkdpdmVuIGFuIGluc3RhbmNlIGNyZWF0aW9uIGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gXENPTlNUe30gJHEoYV8xLCBcbGRvdHMgLCBhX24pJCBpdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmICRxJCBpcyBhIGNvbnN0cnVjdG9yIG9mIGFuIGFic3RyYWN0IGNsYXNzICAoXHJlZnthYnN0cmFjdEluc3RhbmNlTWVtYmVyc30pIGJ1dCAkcSQgaXMgbm90IGEgZmFjdG9yeSBjb25zdHJ1Y3Rvci4gIAoKClxzdWJzZWN0aW9ueyBTcGF3bmluZyBhbiBJc29sYXRlfQpcbGFiZWx7c3Bhd25pbmdBbklzb2xhdGV9CgpTcGF3bmluZyBhbiBpc29sYXRlIGlzIGFjY29tcGxpc2hlZCB2aWEgd2hhdCBpcyBzeW50YWN0aWNhbGx5IGFuIG9yZGluYXJ5IGxpYnJhcnkgY2FsbCwgaW52b2tpbmcgb25lIG9mIHRoZSBmdW5jdGlvbnMgXGNvZGV7c3Bhd25VcmkoKX0gb3IgXGNvZGV7c3Bhd25GdW5jdGlvbigpfWRlZmluZWQgaW4gdGhlIFxjb2Rle2RhcnQ6aXNvbGF0ZX0gbGlicmFyeS4gSG93ZXZlciwgc3VjaCBjYWxscyAgaGF2ZSB0aGUgIHNlbWFudGljIGVmZmVjdCBvZiBjcmVhdGluZyBhIG5ldyBpc29sYXRlIHdpdGggaXRzIG93biBtZW1vcnkgYW5kIHRocmVhZCBvZiBjb250cm9sLgoKQW4gaXNvbGF0ZSdzIG1lbW9yeSBpcyBmaW5pdGUsIGFzIGlzIHRoZSBzcGFjZSBhdmFpbGFibGUgdG8gaXRzIHRocmVhZCdzIGNhbGwgc3RhY2suIEl0IGlzIHBvc3NpYmxlIGZvciBhIHJ1bm5pbmcgaXNvbGF0ZSB0byBleGhhdXN0IGl0cyBtZW1vcnkgb3Igc3RhY2ssIHJlc3VsdGluZyBpbiBhIHJ1bi10aW1lIGVycm9yIHRoYXQgY2Fubm90IGJlIGVmZmVjdGl2ZWx5IGNhdWdodCwgd2hpY2ggd2lsbCBmb3JjZSB0aGUgaXNvbGF0ZSB0byBiZSBzdXNwZW5kZWQuCgpcY29tbWVudGFyeXsKQXMgZGlzY3Vzc2VkIGluIHNlY3Rpb24gXHJlZntlcnJvcnNBbmRXYXJuaW5nc30sIHRoZSBoYW5kbGluZyBvZiBhIHN1c3BlbmRlZCBpc29sYXRlIGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgZW1iZWRkZXIuCn0KClxzdWJzZWN0aW9ueyBQcm9wZXJ0eSBFeHRyYWN0aW9ufQpcbGFiZWx7cHJvcGVydHlFeHRyYWN0aW9ufQoKe1xlbSBQcm9wZXJ0eSBleHRyYWN0aW9ufSBhbGxvd3MgZm9yIGEgbWVtYmVyIG9mIGFuIG9iamVjdCB0byBiZSBjb25jaXNlbHkgZXh0cmFjdGVkIGZyb20gdGhlIG9iamVjdC4KSWYgJGUkIGlzIGFuIGV4cHJlc3Npb24gdGhhdCBldmFsdWF0ZXMgdG8gYW4gb2JqZWN0ICRvJCwgYW5kIGlmICRtJCBpcyB0aGUgbmFtZSBvZiBhIGNvbmNyZXRlIG1ldGhvZCBtZW1iZXIgb2YgJGUkLCB0aGVuICRlLm0kIGlzIGRlZmluZWQgdG8gYmUgZXF1aXZhbGVudCB0bzoKClxiZWdpbntpdGVtaXplfQoKXGl0ZW0gIApcYmVnaW57ZGFydENvZGV9CiQocl8xLCBcbGRvdHMsIHJfbiwgXHtwXzEgOiBkXzEsIFxsZG90cyAsIHBfayA6IGRfa1x9KSQgXHsKICBcUkVUVVJOe30gJCB1Lm0ocl8xLCBcbGRvdHMsIHJfbiwgcF8xOiBwXzEsIFxsZG90cywgcF9rOiBwX2spOyQKXH0gClxlbmR7ZGFydENvZGV9CgppZiAkbSQgaGFzIHJlcXVpcmVkIHBhcmFtZXRlcnMgJHJfMSwgXGxkb3RzLCByX24kLCBhbmQgbmFtZWQgcGFyYW1ldGVycyAkcF8xLCBcbGRvdHMsIHBfayQgd2l0aCBkZWZhdWx0cyAkZF8xLCBcbGRvdHMsIGRfayQuClxpdGVtIApcYmVnaW57ZGFydENvZGV9CiQocl8xLCBcbGRvdHMsIHJfbiwgW3BfMSA9IGRfMSwgXGxkb3RzICwgcF9rID0gZF9rXSkkXHsKICBcUkVUVVJOe30gJHUubShyXzEsIFxsZG90cywgcl9uLCBwXzEsIFxsZG90cywgcF9rKSQ7Clx9ClxlbmR7ZGFydENvZGV9CgppZiAkbSQgaGFzIHJlcXVpcmVkIHBhcmFtZXRlcnMgJHJfMSwgXGxkb3RzLCByX24kLCBhbmQgb3B0aW9uYWwgcG9zaXRpb25hbCBwYXJhbWV0ZXJzICRwXzEsIFxsZG90cywgcF9rJCB3aXRoIGRlZmF1bHRzICRkXzEsIFxsZG90cywgZF9rJC4KXGVuZHtpdGVtaXplfQoKd2hlcmUgJHUkIGlzIGEgZnJlc2ggZmluYWwgdmFyaWFibGUgYm91bmQgdG8gJG8kLCBleGNlcHQgdGhhdDoKXGJlZ2lue2VudW1lcmF0ZX0KXGl0ZW0gIGlmZiAgXGNvZGV7aWRlbnRpY2FsKCRvXzEsIG9fMiQpfSAgdGhlbiBcY2R7JG9fMS5tJCA9PSAkb18yLm0kfS4KXGl0ZW0gVGhlIHN0YXRpYyB0eXBlIG9mIHRoZSBwcm9wZXJ0eSBleHRyYWN0aW9uIGlzIHRoZSBzdGF0aWMgdHlwZSBvZiBmdW5jdGlvbiAkVC5tJCwgd2hlcmUgJFQkIGlzIHRoZSBzdGF0aWMgdHlwZSBvZiAkZSQsIGlmICRULm0kIGlzIGRlZmluZWQuIE90aGVyd2lzZSB0aGUgc3RhdGljIHR5cGUgb2YgJGUubSQgaXMgXERZTkFNSUN7fS4KXGVuZHtlbnVtZXJhdGV9CgpcY29tbWVudGFyeXsKVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgXGNke2lkZW50aWNhbCgkb18xLm0sIG9fMi5tJCl9LiBEYXJ0IGltcGxlbWVudGF0aW9ucyBhcmUgbm90IHJlcXVpcmVkIHRvIGNhbm9uaWNhbGl6ZSB0aGVzZSBvciBhbnkgb3RoZXIgY2xvc3VyZXMuCn0KJSBsb2NhbCBmdW5jdGlvbnMgdGhhdCBoYXZlIGEgY2xvc3VyZSBleHRyYWN0ZWQgYXJlIGFsd2F5cyBkaWZmZXJlbnQKClxyYXRpb25hbGV7ClRoZSBzcGVjaWFsIHRyZWF0bWVudCBvZiBlcXVhbGl0eSBpbiB0aGlzIGNhc2UgZmFjaWxpdGF0ZXMgdGhlIHVzZSBvZiBleHRyYWN0ZWQgcHJvcGVydHkgZnVuY3Rpb25zIGluIEFQSXMgd2hlcmUgY2FsbGJhY2tzIHN1Y2ggYXMgZXZlbnQgbGlzdGVuZXJzIG11c3Qgb2Z0ZW4gYmUgcmVnaXN0ZXJlZCBhbmQgbGF0ZXIgdW5yZWdpc3RlcmVkLiBBIGNvbW1vbiBleGFtcGxlIGlzIHRoZSBET00gQVBJIGluIHdlYiBicm93c2Vycy4KfQoKT3RoZXJ3aXNlCiUsIGlmICRtJCBpcyB0aGUgbmFtZSBvZiBhIGdldHRlciAoXHJlZntnZXR0ZXJzfSkgbWVtYmVyIG9mICRlJCAoZGVjbGFyZWQgaW1wbGljaXRseSBvciBleHBsaWNpdGx5KSB0aGVuIAokZS5tJCBpcyB0cmVhdGVkIGFzIGEgZ2V0dGVyIGludm9jYXRpb24gKFxyZWZ7Z2V0dGVySW52b2NhdGlvbn0pKS4KCgpcY29tbWVudGFyeXtPYnNlcnZhdGlvbnM6ClxiZWdpbntlbnVtZXJhdGV9ClxpdGVtIE9uZSBjYW5ub3QgZXh0cmFjdCBhIGdldHRlciBvciBhIHNldHRlci4KXGl0ZW0gT25lIGNhbiB0ZWxsIHdoZXRoZXIgb25lIGltcGxlbWVudGVkIGEgcHJvcGVydHkgdmlhIGEgbWV0aG9kIG9yIHZpYSBmaWVsZC9nZXR0ZXIsIHdoaWNoIG1lYW5zIHRoYXQgb25lIGhhcyB0byBwbGFuIGFoZWFkIGFzIHRvIHdoYXQgY29uc3RydWN0IHRvIHVzZSwgYW5kIHRoYXQgY2hvaWNlIGlzIHJlZmxlY3RlZCBpbiB0aGUgaW50ZXJmYWNlIG9mIHRoZSBjbGFzcy4KXGVuZHtlbnVtZXJhdGV9Cn0gCgpMZXQgJFMkIGJlIHRoZSBzdXBlcmNsYXNzIG9mIHRoZSBpbW1lZGlhdGVseSBlbmNsb3NpbmcgY2xhc3MuIElmICRtJCBpcyB0aGUgbmFtZSBvZiBhIGNvbmNyZXRlIG1ldGhvZCBtZW1iZXIgb2YgJFMkLCB0aGVuIHRoZSBleHByZXNzaW9uICAkXFNVUEVSe30ubSQgaXMgZGVmaW5lZCB0byBiZSBlcXVpdmFsZW50IHRvOgoKXGJlZ2lue2l0ZW1pemV9CiAlXGl0ZW0gJChyXzEsIFxsZG90cywgcl9uKVx7XFJFVFVSTnt9JCAkby5tKHJfMSwgXGxkb3RzLCByX24pO1x9JCBpZiAkbSQgaGFzIG9ubHkgcmVxdWlyZWQgcGFyYW1ldGVycyAkcl8xLCBcbGRvdHMgcl9uJC4KJVxpdGVtICQocl8xLCBcbGRvdHMsIHJfbiwgcmVzdClce3JldHVybiQgICRvLm0ocl8xLCBcbGRvdHMsIHJfbiwgcmVzdCk7XH0kIGlmICRtJCBoYXMgcmVxdWlyZWQgcGFyYW1ldGVycyAkcl8xLCBcbGRvdHMgcl9uJCwgYW5kIGEgcmVzdCBwYXJhbWV0ZXIgJHJlc3QkLgolXGl0ZW0KXGl0ZW0gIApcYmVnaW57ZGFydENvZGV9CiQocl8xLCBcbGRvdHMsIHJfbiwgXHtwXzEgOiBkXzEsIFxsZG90cyAsIHBfayA6IGRfa1x9KSRcewogICBcUkVUVVJOe30gXFNVUEVSe30kLm0ocl8xLCBcbGRvdHMsIHJfbiwgcF8xOiBwXzEsIFxsZG90cywgcF9rOiBwX2spJDsKXH0KXGVuZHtkYXJ0Q29kZX0KCmlmICRtJCBoYXMgcmVxdWlyZWQgcGFyYW1ldGVycyAkcl8xLCBcbGRvdHMsIHJfbiQsIGFuZCBuYW1lZCBwYXJhbWV0ZXJzICRwXzEsIFxsZG90cywgcF9rJCB3aXRoIGRlZmF1bHRzICRkXzEsIFxsZG90cywgZF9rJC4KXGl0ZW0gClxiZWdpbntkYXJ0Q29kZX0KJChyXzEsIFxsZG90cywgcl9uLCBbcF8xID0gZF8xLCBcbGRvdHMgLCBwX2sgPSBkX2tdKSRcewogICBcUkVUVVJOe30gXFNVUEVSe30kLm0ocl8xLCBcbGRvdHMsIHJfbiwgcF8xLCBcbGRvdHMsIHBfaykkOwpcfSAKXGVuZHtkYXJ0Q29kZX0KCmlmICRtJCBoYXMgcmVxdWlyZWQgcGFyYW1ldGVycyAkcl8xLCBcbGRvdHMsIHJfbiQsIGFuZCBvcHRpb25hbCBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgJHBfMSwgXGxkb3RzLCBwX2skIHdpdGggZGVmYXVsdHMgJGRfMSwgXGxkb3RzLCBkX2skLgpcZW5ke2l0ZW1pemV9CgpFeGNlcHQgdGhhdDoKXGJlZ2lue2VudW1lcmF0ZX0KXGl0ZW0gIGlmZiAgXGNvZGV7aWRlbnRpY2FsKCRvXzEsIG9fMiQpfSAgdGhlbiBcY2R7JG9fMS5tJCA9PSAkb18yLm0kfS4KXGl0ZW0gClRoZSBzdGF0aWMgdHlwZSBvZiB0aGUgcHJvcGVydHkgZXh0cmFjdGlvbiBpcyB0aGUgc3RhdGljIHR5cGUgb2YgdGhlIG1ldGhvZCAkUy5tJCwgIGlmICRTLm0kIGlzIGRlZmluZWQuIE90aGVyd2lzZSB0aGUgc3RhdGljIHR5cGUgb2YgJFxTVVBFUnt9Lm0kIGlzIFxEWU5BTUlDe30uClxlbmR7ZW51bWVyYXRlfQoKT3RoZXJ3aXNlCiUsIGlmICRtJCBpcyB0aGUgbmFtZSBvZiBhIGdldHRlciAoXHJlZntnZXR0ZXJzfSkgbWVtYmVyIG9mICRTJCAoZGVjbGFyZWQgaW1wbGljaXRseSBvciBleHBsaWNpdGx5KSB0aGVuIAokXFNVUEVSe30ubSQgaXMgdHJlYXRlZCBhcyBhIGdldHRlciBpbnZvY2F0aW9uIChccmVme2dldHRlckludm9jYXRpb259KSkuCgpcc3Vic2VjdGlvbnsgRnVuY3Rpb24gSW52b2NhdGlvbn0KXGxhYmVse2Z1bmN0aW9uSW52b2NhdGlvbn0KIApGdW5jdGlvbiBpbnZvY2F0aW9uIG9jY3VycyBpbiB0aGUgZm9sbG93aW5nIGNhc2VzOiB3aGVuIGEgZnVuY3Rpb24gZXhwcmVzc2lvbiAgKFxyZWZ7ZnVuY3Rpb25FeHByZXNzaW9uc30pIGlzIGludm9rZWQgKFxyZWZ7ZnVuY3Rpb25FeHByZXNzaW9uSW52b2NhdGlvbn0pLCB3aGVuIGEgbWV0aG9kIChccmVme21ldGhvZEludm9jYXRpb259KSwgZ2V0dGVyIChccmVme2dldHRlckludm9jYXRpb259KSBvciBzZXR0ZXIgKFxyZWZ7YXNzaWdubWVudH0pIGlzIGludm9rZWQgb3Igd2hlbiBhIGNvbnN0cnVjdG9yIGlzIGludm9rZWQgKGVpdGhlciB2aWEgaW5zdGFuY2UgY3JlYXRpb24gKFxyZWZ7aW5zdGFuY2VDcmVhdGlvbn0pLCBjb25zdHJ1Y3RvciByZWRpcmVjdGlvbiAoXHJlZntyZWRpcmVjdGluZ0NvbnN0cnVjdG9yc30pIG9yIHN1cGVyIGluaXRpYWxpemF0aW9uKS4gVGhlIHZhcmlvdXMga2luZHMgb2YgZnVuY3Rpb24gaW52b2NhdGlvbiBkaWZmZXIgYXMgdG8gaG93IHRoZSBmdW5jdGlvbiB0byBiZSBpbnZva2VkLCAkZiQsICBpcyBkZXRlcm1pbmVkLCBhcyB3ZWxsIGFzIHdoZXRoZXIgXFRISVN7fSBpcyBib3VuZC4gT25jZSAkZiQgaGFzIGJlZW4gZGV0ZXJtaW5lZCwgdGhlIGZvcm1hbCBwYXJhbWV0ZXJzIG9mICRmJCBhcmUgYm91bmQgdG8gY29ycmVzcG9uZGluZyBhY3R1YWwgYXJndW1lbnRzLiBUaGUgYm9keSBvZiAkZiQgaXMgdGhlbiBleGVjdXRlZCB3aXRoIHRoZSBhZm9yZW1lbnRpb25lZCBiaW5kaW5ncy4gRXhlY3V0aW9uIG9mIHRoZSBib2R5IHRlcm1pbmF0ZXMgd2hlbiB0aGUgZmlyc3Qgb2YgdGhlIGZvbGxvd2luZyBvY2N1cnM6ClxiZWdpbntpdGVtaXplfQpcaXRlbSBBbiB1bmNhdWdodCBleGNlcHRpb24gaXMgdGhyb3duLiAKXGl0ZW0gQSByZXR1cm4gc3RhdGVtZW50IChccmVme3JldHVybn0pIGltbWVkaWF0ZWx5IG5lc3RlZCBpbiB0aGUgYm9keSBvZiAkZiQgaXMgZXhlY3V0ZWQuClxpdGVtIFRoZSBsYXN0IHN0YXRlbWVudCBvZiB0aGUgYm9keSBjb21wbGV0ZXMgZXhlY3V0aW9uLgpcZW5ke2l0ZW1pemV9CgoKCgpcc3Vic3Vic2VjdGlvbnsgQWN0dWFsIEFyZ3VtZW50IExpc3QgRXZhbHVhdGlvbn0KXGxhYmVse2FjdHVhbEFyZ3VtZW50c30KCkZ1bmN0aW9uIGludm9jYXRpb24gaW52b2x2ZXMgZXZhbHVhdGlvbiBvZiB0aGUgbGlzdCBvZiBhY3R1YWwgYXJndW1lbnRzIHRvIHRoZSBmdW5jdGlvbiBhbmQgYmluZGluZyBvZiB0aGUgcmVzdWx0cyB0byB0aGUgZnVuY3Rpb25gcyBmb3JtYWwgcGFyYW1ldGVycy4KClxiZWdpbntncmFtbWFyfQp7XGJmIGFyZ3VtZW50czp9CiAgICAgIGAoJyBhcmd1bWVudExpc3Q/IGApJwogICAgLgoKe1xiZiBhcmd1bWVudExpc3Q6fW5hbWVkQXJndW1lbnQgKGAsJyBuYW1lZEFyZ3VtZW50KSo7CiAgJSAgICBleHByZXNzaW9uTGlzdCAnLCcgc3ByZWFkQXJndW1lbnQ7CiAgICAgIGV4cHJlc3Npb25MaXN0IChgLCcgbmFtZWRBcmd1bWVudCkqCiUgICAgICBzcHJlYWRBcmd1bWVudAogICAgLgoKe1xiZiBuYW1lZEFyZ3VtZW50On0KICAgICAgbGFiZWwgZXhwcmVzc2lvbiAlIGNvdWxkIGJlIHRvcCBsZXZlbCBleHByZXNzaW9uPwogICAgLgogXGVuZHtncmFtbWFyfQoKRXZhbHVhdGlvbiBvZiBhbiBhY3R1YWwgYXJndW1lbnQgbGlzdCBvZiB0aGUgZm9ybSAKCiQoYV8xLCBcbGRvdHMsIGFfbSwgcV8xOiBhX3ttKzF9LCBcbGRvdHMsIHFfbDogYV97bStsfSkkIAoKcHJvY2VlZHMgYXMgZm9sbG93czoKClRoZSBhcmd1bWVudHMgJGFfMSwgXGxkb3RzLCBhX3ttK2x9JCBhcmUgZXZhbHVhdGVkIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiB0aGUgcHJvZ3JhbSwgeWllbGRpbmcgb2JqZWN0cyAkb18xLCBcbGRvdHMsIG9fe20rbH0kLgoKXGNvbW1lbnRhcnl7U2ltcGx5IHN0YXRlZCwgYW4gYXJndW1lbnQgbGlzdCBjb25zaXN0aW5nIG9mICRtJCBwb3NpdGlvbmFsIGFyZ3VtZW50cyBhbmQgJGwkIG5hbWVkIGFyZ3VtZW50cyBpcyBldmFsdWF0ZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0Lgp9CgoKXHN1YnN1YnNlY3Rpb257IEJpbmRpbmcgQWN0dWFscyB0byBGb3JtYWxzfQpcbGFiZWx7YmluZGluZ0FjdHVhbHNUb0Zvcm1hbHN9CgpMZXQgJGYkIGJlIGEgZnVuY3Rpb24gd2l0aCAkaCQgcmVxdWlyZWQgcGFyYW1ldGVycywgIGxldCAkcF8xIFxsZG90cyBwX24kIGJlIHRoZSBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgb2YgJGYkIGFuZCBsZXQgJHBfe2grMX0sIFxsZG90cywgcF97aCtrfSQgYmUgdGhlIG9wdGlvbmFsIHBhcmFtZXRlcnMgZGVjbGFyZWQgYnkgJGYkLgoKQW4gZXZhbHVhdGVkIGFjdHVhbCBhcmd1bWVudCBsaXN0ICRvXzEgXGxkb3RzIG9fe20rbH0kIGRlcml2ZWQgZnJvbSBhbiBhY3R1YWwgYXJndW1lbnQgbGlzdCBvZiB0aGUgZm9ybSAkKGFfMSwgXGxkb3RzLCBhX20sIHFfMTogYV97bSsxfSwgXGxkb3RzLCBxX2w6IGFfe20rbH0pJCBpcyBib3VuZCB0byB0aGUgZm9ybWFsIHBhcmFtZXRlcnMgb2YgJGYkIGFzIGZvbGxvd3M6CgpcY29tbWVudGFyeXsKV2UgaGF2ZSBhbiBhcmd1bWVudCBsaXN0IGNvbnNpc3Rpbmcgb2YgJG0kIHBvc2l0aW9uYWwgYXJndW1lbnRzIGFuZCAkbCQgbmFtZWQgYXJndW1lbnRzLiBXZSBoYXZlIGEgZnVuY3Rpb24gd2l0aCAkaCQgcmVxdWlyZWQgcGFyYW1ldGVycyBhbmQgJGskIG9wdGlvbmFsIHBhcmFtZXRlcnMuIFRoZSBudW1iZXIgb2YgcG9zaXRpb25hbCBhcmd1bWVudHMgbXVzdCBiZSBhdCBsZWFzdCBhcyBsYXJnZSBhcyB0aGUgbnVtYmVyIG9mIHJlcXVpcmVkIHBhcmFtZXRlcnMsIGFuZCBubyBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIHBvc2l0aW9uYWwgcGFyYW1ldGVycy4gQWxsIG5hbWVkIGFyZ3VtZW50cyBtdXN0IGhhdmUgYSBjb3JyZXNwb25kaW5nIG5hbWVkIHBhcmFtZXRlci4gWW91IG1heSBub3QgcHJvdmlkZSBhIGdpdmVuIG5hbWVkIGFyZ3VtZW50IG1vcmUgdGhhbiBvbmNlLiAgSWYgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIGhhcyBubyBjb3JyZXNwb25kaW5nIGFyZ3VtZW50LCBpdCBnZXRzIGl0cyBkZWZhdWx0IHZhbHVlLiBJbiBjaGVja2VkIG1vZGUsIGFsbCBhcmd1bWVudHMgbXVzdCBiZWxvbmcgdG8gc3VidHlwZXMgb2YgdGhlIHR5cGUgb2YgdGhlaXIgY29ycmVzcG9uZGluZyBmb3JtYWwuCn0KClxjb21tZW50YXJ5ewpJZiAkbCA+IDAkLCB0aGVuIGl0IGlzIG5lY2Vzc2FyaWx5IHRoZSBjYXNlIHRoYXQgJG4gPSBoJCwgYmVjYXVzZSBhIG1ldGhvZCBjYW5ub3QgaGF2ZSBib3RoIG9wdGlvbmFsIHBvc2l0aW9uYWwgcGFyYW1ldGVycyBhbmQgbmFtZWQgcGFyYW1ldGVycy4KfQoKCklmICAkbSA8IGgkLCBvciAkbSA+IG4kLCBhIFxjZHtOb1N1Y2hNZXRob2RFcnJvcn0gaXMgdGhyb3duLiBGdXJ0aGVybW9yZSwgZWFjaCAkcV9pLCAxIFxsZSBpIFxsZSBsJCwgIG11c3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgbmFtZWQgcGFyYW1ldGVyIGluIHRoZSBzZXQgJFx7cF97bisxfSwgXGxkb3RzLCBwX3tuICtrfVx9JCBvciBhIFxjZHtOb1N1Y2hNZXRob2RFcnJvcn0gaXMgdGhyb3duLiBUaGVuICRwX2kkIGlzIGJvdW5kIHRvICRvX2ksIGkgXGluIDEuLiBtJCwgYW5kICRxX2okICBpcyBib3VuZCB0byAkb197bStqfSwgaiBcaW4gMS4uIGwkLiAgQWxsIHJlbWFpbmluZyBmb3JtYWwgcGFyYW1ldGVycyBvZiAkZiQgIGFyZSBib3VuZCB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4gCgpcY29tbWVudGFyeXtBbGwgb2YgdGhlc2UgcmVtYWluaW5nIHBhcmFtZXRlcnMgYXJlIG5lY2Vzc2FyaWx5IG9wdGlvbmFsIGFuZCB0aHVzIGhhdmUgZGVmYXVsdCB2YWx1ZXMufQoKSW4gY2hlY2tlZCBtb2RlLCBpdCBpcyBhIGR5bmFtaWMgdHlwZSBlcnJvciBpZiAgJG9faSQgaXMgbm90IFxOVUxMe30gYW5kIHRoZSBhY3R1YWwgdHlwZSAgKFxyZWZ7YWN0dWFsVHlwZU9mQURlY2xhcmF0aW9ufSkgb2YgJHBfaSQgaXMgbm90IGEgc3VwZXJ0eXBlIG9mIHRoZSB0eXBlIG9mICRvX2ksIGkgXGluIDEuLiBtJC4gSW4gY2hlY2tlZCBtb2RlLCBpdCBpcyBhIGR5bmFtaWMgdHlwZSBlcnJvciBpZiAgJG9fe20ran0kIGlzIG5vdCBcTlVMTHt9IGFuZCB0aGUgYWN0dWFsIHR5cGUgIChccmVme2FjdHVhbFR5cGVPZkFEZWNsYXJhdGlvbn0pIG9mICRxX2okIGlzIG5vdCBhIHN1cGVydHlwZSBvZiB0aGUgdHlwZSBvZiAkb197bStqfSwgaiBcaW4gMS4uIGwkLgoKSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgJHFfaSA9IHFfaiQgZm9yIGFueSAkaSBcbmUgaiQuCgpMZXQgJFRfaSQgYmUgdGhlIHN0YXRpYyB0eXBlIG9mICRhX2kkLCBsZXQgJFNfaSQgYmUgdGhlIHR5cGUgb2YgJHBfaSwgaSBcaW4gMSAuLiBoK2skIGFuZCBsZXQgJFNfcSQgYmUgdGhlIHR5cGUgb2YgdGhlIG5hbWVkIHBhcmFtZXRlciAkcSQgb2YgJGYkLiAgSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiAkVF9qJCBtYXkgbm90IGJlIGFzc2lnbmVkIHRvICRTX2osIGogXGluIDEuLm0kLiAgSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiAkbSA8IGgkIG9yIGlmICRtID4gbiQuIEZ1cnRoZXJtb3JlLCBlYWNoICRxX2ksIDEgXGxlIGkgXGxlIGwkLCAgbXVzdCBoYXZlIGEgY29ycmVzcG9uZGluZyBuYW1lZCBwYXJhbWV0ZXIgaW4gdGhlIHNldCAkXHtwX3tuKzF9LCBcbGRvdHMsIHBfe24gK2t9XH0kIG9yIGEgc3RhdGljIHdhcm5pbmcgb2NjdXJzLiAgSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiAkVF97bStqfSQgbWF5IG5vdCBiZSBhc3NpZ25lZCB0byAkU197cV9qfSwgaiBcaW4gMSAuLiBsJC4KClxzdWJzdWJzZWN0aW9ueyBVbnF1YWxpZmllZCBJbnZvY2F0aW9ufQpcbGFiZWx7dW5xdWFsaWZpZWRJbnZvY2F0aW9ufQoKQW4gdW5xdWFsaWZpZWQgZnVuY3Rpb24gaW52b2NhdGlvbiAkaSQgaGFzIHRoZSBmb3JtIAoKJGlkKGFfMSwgXGxkb3RzLCBhX24sIHhfe24rMX06IGFfe24rMX0sIFxsZG90cywgeF97bitrfTogYV97bitrfSkkLCAKCndoZXJlICRpZCQgaXMgYW4gaWRlbnRpZmllciBvciBhbiBpZGVudGlmaWVyIHF1YWxpZmllZCB3aXRoIGEgbGlicmFyeSBwcmVmaXguIAoKSWYgJGlkJCBpcyBxdWFsaWZpZWQgd2l0aCBhIGRlZmVycmVkIHByZWZpeCAkcCQgYW5kICRwJCBoYXMgbm90IGJlZW4gc3VjY2Vzc2Z1bGx5IGxvYWRlZCwgdGhlbjoKXGJlZ2lue2l0ZW1pemV9ClxpdGVtCklmIHRoZSBpbnZvY2F0aW9uIGhhcyB0aGUgZm9ybSAkcCRcY29kZXsubG9hZExpYnJhcnkoKX0gdGhlbiBhbiBhdHRlbXB0IHRvIGxvYWQgdGhlIGxpYnJhcnkgcmVwcmVzZW50ZWQgYnkgdGhlIHByZWZpeCAkcCQgaXMgaW5pdGlhdGVkIGFzIGRpc2N1c3NlZCBpbiBzZWN0aW9uIFxyZWZ7aW1wb3J0c30uIApcaXRlbQogT3RoZXJ3aXNlLCBhIFxjb2Rle05vU3VjaE1ldGhvZEVycm9yfSBpcyB0aHJvd24uCiBcZW5ke2l0ZW1pemV9CgpJZiB0aGVyZSBleGlzdHMgYSBsZXhpY2FsbHkgdmlzaWJsZSBkZWNsYXJhdGlvbiBuYW1lZCAkaWQkLCBsZXQgJGZfe2lkfSQgYmUgdGhlIGlubmVybW9zdCBzdWNoIGRlY2xhcmF0aW9uLiBUaGVuOgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0KIElmICRmX3tpZH0kIGlzIGEgbG9jYWwgZnVuY3Rpb24sIGEgbGlicmFyeSBmdW5jdGlvbiwgYSBsaWJyYXJ5IG9yIHN0YXRpYyBnZXR0ZXIgb3IgYSB2YXJpYWJsZSB0aGVuICRpJCBpcyBpbnRlcnByZXRlZCBhcyBhIGZ1bmN0aW9uIGV4cHJlc3Npb24gaW52b2NhdGlvbiAoXHJlZntmdW5jdGlvbkV4cHJlc3Npb25JbnZvY2F0aW9ufSkuCiBcaXRlbQpPdGhlcndpc2UsIGlmICRmX3tpZH0kIGlzIGEgc3RhdGljIG1ldGhvZCBvZiB0aGUgZW5jbG9zaW5nIGNsYXNzICRDJCwgJGkkIGlzIGVxdWl2YWxlbnQgdG8gJEMuaWQoYV8xLCBcbGRvdHMgLCBhX24sIHhfe24rMX06IGFfe24rMX0sIFxsZG90cyAsIHhfe24ra306IGFfe24ra30pJC4KXGl0ZW0gT3RoZXJ3aXNlLCAkZl97aWR9JCBpcyBjb25zaWRlcmVkIGVxdWl2YWxlbnQgdG8gdGhlIG9yZGluYXJ5IG1ldGhvZCBpbnZvY2F0aW9uICRcVEhJU3t9LmlkKGFfMSwgXGxkb3RzICwgYV9uLCB4X3tuKzF9OiBhX3tuKzF9LCBcbGRvdHMgLCB4X3tuK2t9OiBhX3tuK2t9KSQuClxlbmR7aXRlbWl6ZX0KCiVPdGhlcndpc2UsIGlmIHRoZXJlIGlzIGFuIGFjY2Vzc2libGUgKFxyZWZ7cHJpdmFjeX0pIHN0YXRpYyBtZXRob2QgbmFtZWQgJGlkJCBkZWNsYXJlZCBpbiBhIHN1cGVyY2xhc3MgJFMkIG9mIHRoZSBpbW1lZGlhdGVseSBlbmNsb3NpbmcgY2xhc3MgJEMkIHRoZW4gaSBpcyBlcXVpdmFsZW50IHRvIHRoZSBzdGF0aWMgbWV0aG9kIGludm9jYXRpb24gJFMuaWQoYV8xLCBcbGRvdHMsIGFfbiwgeF97bisxfTogYV97bisxfSwgXGxkb3RzLCB4X3tuK2t9OiBhX3tuK2t9KSQuICAKCiVccmF0aW9uYWxlewolVW5xdWFsaWZpZWQgYWNjZXNzIHRvIHN0YXRpYyBtZXRob2RzIG9mIHN1cGVyY2xhc3NlcyBpcyBpbmNvbnNpc3RlbnQgd2l0aCB0aGUgaWRlYSB0aGF0IHN0YXRpYyBtZXRob2RzIGFyZSBub3QgaW5oZXJpdGVkLiBJdCBpcyBub3QgcGFydGljdWxhcmx5IG5lY2Vzc2FyeSBhbmQgIG1heSBiZSByZXN0cmljdGVkIGluIGZ1dHVyZSB2ZXJzaW9ucy4KJX0KCk90aGVyd2lzZSwgaWYgJGkkIG9jY3VycyBpbnNpZGUgYSB0b3AgbGV2ZWwgb3Igc3RhdGljIGZ1bmN0aW9uIChiZSBpdCBmdW5jdGlvbiwgbWV0aG9kLCBnZXR0ZXIsICBvciBzZXR0ZXIpIG9yIHZhcmlhYmxlIGluaXRpYWxpemVyLCBldmFsdWF0aW9uIG9mICRpJCBjYXVzZXMgYSBcY2R7Tm9TdWNoTWV0aG9kRXJyb3J9IHRvIGJlIHRocm93bi4KCklmICRpJCBkb2VzIG5vdCBvY2N1ciBpbnNpZGUgYSB0b3AgbGV2ZWwgb3Igc3RhdGljIGZ1bmN0aW9uLCAkaSQgaXMgZXF1aXZhbGVudCB0byAkXFRISVN7fS5pZChhXzEsIFxsZG90cyAsIGFfbiwgeF97bisxfTogYV97bisxfSwgXGxkb3RzICwgeF97bitrfTogYV97bitrfSkkLgoKJSBTaG91bGQgYWxzbyBzYXk6CiUgSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiAkaSQgIG9jY3VycyBpbnNpZGUgYSB0b3AgbGV2ZWwgb3Igc3RhdGljIGZ1bmN0aW9uIChiZSBpdCBmdW5jdGlvbiwgbWV0aG9kLCBnZXR0ZXIsICBvciBzZXR0ZXIpIG9yIHZhcmlhYmxlIGluaXRpYWxpemVyIGFuZCB0aGVyZSBpcyBubyBsZXhpY2FsbHkgdmlzaWJsZSBkZWNsYXJhdGlvbiBuYW1lZCAkaWQkIGluIHNjb3BlLgoKCgoKClxzdWJzdWJzZWN0aW9ueyBGdW5jdGlvbiBFeHByZXNzaW9uIEludm9jYXRpb259ClxsYWJlbHtmdW5jdGlvbkV4cHJlc3Npb25JbnZvY2F0aW9ufQoKQSBmdW5jdGlvbiBleHByZXNzaW9uIGludm9jYXRpb24gJGkkIGhhcyB0aGUgZm9ybSAKCiRlX2YoYV8xLCBcbGRvdHMgLCBhX24sIHhfe24rMX06IGFfe24rMX0sIFxsZG90cyAsIHhfe24ra306IGFfe24ra30pJCwgCgp3aGVyZSAkZV9mJCBpcyBhbiBleHByZXNzaW9uLiBJZiAkZV9mJCBpcyBhbiBpZGVudGlmaWVyICRpZCQsIHRoZW4gJGlkJCBtdXN0IG5lY2Vzc2FyaWx5IGRlbm90ZSBhIGxvY2FsIGZ1bmN0aW9uLCBhIGxpYnJhcnkgZnVuY3Rpb24sIGEgbGlicmFyeSBvciBzdGF0aWMgZ2V0dGVyIG9yIGEgdmFyaWFibGUgYXMgZGVzY3JpYmVkIGFib3ZlLCBvciAkaSQgaXMgbm90IGNvbnNpZGVyZWQgYSBmdW5jdGlvbiBleHByZXNzaW9uIGludm9jYXRpb24uIElmICRlX2YkIGlzIGEgcHJvcGVydHkgZXh0cmFjdGlvbiBleHByZXNzaW9uIChccmVme3Byb3BlcnR5RXh0cmFjdGlvbn0pLCB0aGVuICRpJCBpcyBpcyBub3QgYSBmdW5jdGlvbiBleHByZXNzaW9uIGludm9jYXRpb24gYW5kIGlzIGluc3RlYWQgcmVjb2duaXplZCBhcyBhbiBvcmRpbmFyeSBtZXRob2QgaW52b2NhdGlvbiAoXHJlZntvcmRpbmFyeUludm9jYXRpb259KS4gCgpcY29tbWVudGFyeXsKXGNvZGV7JGEuYih4KSR9IGlzIHBhcnNlZCBhcyBhIG1ldGhvZCBpbnZvY2F0aW9uIG9mIG1ldGhvZCBcY29kZXskYigpJH0gb24gb2JqZWN0IFxjb2RleyRhJH0sIG5vdCBhcyBhbiBpbnZvY2F0aW9uIG9mIGdldHRlciBcY29kZXskYiR9IG9uIFxjb2RleyRhJH0gZm9sbG93ZWQgYnkgYSBmdW5jdGlvbiBjYWxsIFxjb2RleyQoYS5iKSh4KSR9LiAgSWYgYSBtZXRob2Qgb3IgZ2V0dGVyIFxjb2RleyRiJH0gZXhpc3RzLCB0aGUgdHdvIHdpbGwgYmUgZXF1aXZhbGVudC4gSG93ZXZlciwgaWYgXGNvZGV7JGIkfSBpcyBub3QgZGVmaW5lZCBvbiBcY29kZXskYSR9LCB0aGUgcmVzdWx0aW5nIGludm9jYXRpb24gb2YgXGNvZGV7bm9TdWNoTWV0aG9kKCl9IHdvdWxkIGRpZmZlci4gIFRoZSBcY29kZXtJbnZvY2F0aW9ufSBwYXNzZWQgdG8gXGNvZGV7bm9TdWNoTWV0aG9kKCl9IHdvdWxkIGRlc2NyaWJlIGEgY2FsbCB0byBhIG1ldGhvZCBcY29kZXskYiR9IHdpdGggYXJndW1lbnQgXGNvZGV7JHgkfSBpbiB0aGUgZm9ybWVyIGNhc2UsIGFuZCBhIGNhbGwgdG8gYSBnZXR0ZXIgXGNvZGV7JGIkfSAod2l0aCBubyBhcmd1bWVudHMpIGluIHRoZSBsYXR0ZXIuCn0KCk90aGVyd2lzZToKCkEgZnVuY3Rpb24gZXhwcmVzc2lvbiBpbnZvY2F0aW9uICRlX2YoYV8xLCBcbGRvdHMgLCBhX24sIHhfe24rMX06IGFfe24rMX0sIFxsZG90cyAsIHhfe24ra306IGFfe24ra30pJCBpcyBlcXVpdmFsZW50IHRvICRlX2YuY2FsbChhXzEsIFxsZG90cyAsIGFfbiwgeF97bisxfTogYV97bisxfSwgXGxkb3RzICwgeF97bitrfTogYV97bitrfSkkLgoKXGNvbW1lbnRhcnl7ClRoZSBpbXBsaWNhdGlvbiBvZiB0aGlzIGRlZmluaXRpb24sIGFuZCB0aGUgb3RoZXIgZGVmaW5pdGlvbnMgaW52b2x2aW5nIHRoZSBtZXRob2QgXGNvZGV7Y2FsbCgpfSwgaXMgdGhhdCB1c2VyIGRlZmluZWQgdHlwZXMgY2FuIGJlIHVzZWQgYXMgZnVuY3Rpb24gdmFsdWVzIHByb3ZpZGVkIHRoZXkgZGVmaW5lIGEgXENBTEx7fSBtZXRob2QuIFRoZSBtZXRob2QgXENBTEx7fSBpcyBzcGVjaWFsIGluIHRoaXMgcmVnYXJkLiBUaGUgc2lnbmF0dXJlIG9mIHRoZSBcQ0FMTHt9IG1ldGhvZCBkZXRlcm1pbmVzIHRoZSBzaWduYXR1cmUgdXNlZCB3aGVuIHVzaW5nIHRoZSBvYmplY3QgdmlhIHRoZSBidWlsdC1pbiBpbnZvY2F0aW9uIHN5bnRheC4KfQoKSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiB0aGUgc3RhdGljIHR5cGUgJEYkIG9mICRlX2YkIG1heSBub3QgYmUgYXNzaWduZWQgdG8gYSBmdW5jdGlvbiB0eXBlLiAgSWYgJEYkIGlzIG5vdCBhIGZ1bmN0aW9uIHR5cGUsIHRoZSBzdGF0aWMgdHlwZSBvZiAkaSQgaXMgXERZTkFNSUN7fS4gT3RoZXJ3aXNlIAp0aGUgc3RhdGljIHR5cGUgb2YgJGkkIGlzIHRoZSBkZWNsYXJlZCByZXR1cm4gdHlwZSBvZiAgJEYkLiAgCiVcaXRlbSBMZXQgJFRfaSQgYmUgdGhlIHN0YXRpYyB0eXBlIG9mICRhX2ksIGkgXGluIDEgLi4gbitrJC4gSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiAkRiQgaXMgbm90IGEgc3VwZXJ0eXBlIG9mICAkKFRfMSwgXGxkb3RzLCBUX24sIFtUX3tuKzF9JCAkeF97bisxfSwgXGxkb3RzLCBUX3tuK2t9JCAkeF97bitrfV0pIFx0byBcYm90JC4KJVxlbmR7aXRlbWl6ZX0KCgpcc3Vic2VjdGlvbnsgTWV0aG9kIEludm9jYXRpb259ClxsYWJlbHttZXRob2RJbnZvY2F0aW9ufQoKTWV0aG9kIGludm9jYXRpb24gY2FuIHRha2Ugc2V2ZXJhbCBmb3JtcyBhcyBzcGVjaWZpZWQgYmVsb3cuIAoKXHN1YnN1YnNlY3Rpb257T3JkaW5hcnkgSW52b2NhdGlvbn0KXGxhYmVse29yZGluYXJ5SW52b2NhdGlvbn0KCkFuIG9yZGluYXJ5IG1ldGhvZCBpbnZvY2F0aW9uICRpJCBoYXMgdGhlIGZvcm0gCgokby5tKGFfMSwgXGxkb3RzICwgYV9uLCB4X3tuKzF9OiBhX3tuKzF9LCBcbGRvdHMgLCB4X3tuK2t9OiBhX3tuK2t9KSQgd2hlcmUgJG8kIGlzIG5vdCB0aGUgbmFtZSBvZiBhIGNsYXNzIG9yIGEgbGlicmFyeSBwcmVmaXguCgpNZXRob2QgaW52b2NhdGlvbiBpbnZvbHZlcyBtZXRob2QgbG9va3VwLCBkZWZpbmVkIG5leHQuClRoZSByZXN1bHQgb2YgYSBsb29rdXAgb2YgYSBtZXRob2QgJG0kIGluIG9iamVjdCAkbyQgd2l0aCByZXNwZWN0IHRvIGxpYnJhcnkgJEwkIGlzIHRoZSByZXN1bHQgb2YgIGEgbG9va3VwIG9mIG1ldGhvZCAkbSQgaW4gY2xhc3MgJEMkIHdpdGggcmVzcGVjdCB0byBsaWJyYXJ5ICRMJCwgd2hlcmUgJEMkIGlzIHRoZSBjbGFzcyBvZiAkbyQuCgpUaGUgcmVzdWx0IG9mICBhIGxvb2t1cCBvZiBtZXRob2QgJG0kIGluIGNsYXNzICRDJCB3aXRoIHJlc3BlY3QgdG8gbGlicmFyeSAkTCQgaXM6CklmICRDJCBkZWNsYXJlcyBhIGNvbmNyZXRlIGluc3RhbmNlIG1ldGhvZCBuYW1lZCAkbSQgdGhhdCBpcyBhY2Nlc3NpYmxlIHRvICRMJCwgIHRoZW4gdGhhdCBtZXRob2QgaXMgdGhlIHJlc3VsdCBvZiB0aGUgbG9va3VwLiBPdGhlcndpc2UsIGlmICRDJCBoYXMgYSBzdXBlcmNsYXNzICRTJCwgdGhlbiB0aGUgcmVzdWx0IG9mIHRoZSBsb29rdXAgaXMgdGhlIHJlc3VsdCBvZiBsb29raW5nIHVwICRtJCAgaW4gJFMkIHdpdGggcmVzcGVjdCB0byAkTCQuIE90aGVyd2lzZSwgd2Ugc2F5IHRoYXQgdGhlIG1ldGhvZCBsb29rdXAgaGFzIGZhaWxlZC4KClxyYXRpb25hbGUgewpUaGUgbW90aXZhdGlvbiBmb3Igc2tpcHBpbmcgYWJzdHJhY3QgbWVtYmVycyBkdXJpbmcgbG9va3VwIGlzIGxhcmdlbHkgdG8gYWxsb3cgc21vb3RoZXIgbWl4aW4gY29tcG9zaXRpb24uIAp9CgpFdmFsdWF0aW9uIG9mIGFuIG9yZGluYXJ5IG1ldGhvZCBpbnZvY2F0aW9uICRpJCBvZiB0aGUgZm9ybSAKCiRvLm0oYV8xLCBcbGRvdHMgLCBhX24sIHhfe24rMX06IGFfe24rMX0sIFxsZG90cyAsIHhfe24ra306IGFfe24ra30pJCAKCnByb2NlZWRzIGFzIGZvbGxvd3M6CgpGaXJzdCwgdGhlIGV4cHJlc3Npb24gJG8kIGlzIGV2YWx1YXRlZCB0byBhIHZhbHVlICR2X28kLiBOZXh0LCB0aGUgYXJndW1lbnQgbGlzdCAkKGFfMSwgXGxkb3RzICwgYV9uLCB4X3tuKzF9OiBhX3tuKzF9LCBcbGRvdHMgLCB4X3tuK2t9OiBhX3tuK2t9KSQgaXMgZXZhbHVhdGVkIHlpZWxkaW5nIGFjdHVhbCBhcmd1bWVudCBvYmplY3RzICRvXzEsIFxsZG90cyAsIG9fe24ra30kLiBMZXQgJGYkIGJlIHRoZSByZXN1bHQgb2YgbG9va2luZyB1cCBtZXRob2QgJG0kICBpbiAkdl9vJCB3aXRoIHJlc3BlY3QgdG8gdGhlIGN1cnJlbnQgbGlicmFyeSAkTCQuIAoKTGV0ICRwXzEgXGxkb3RzIHBfaCQgYmUgdGhlIHJlcXVpcmVkIHBhcmFtZXRlcnMgb2YgJGYkLCAgbGV0ICRwXzEgXGxkb3RzIHBfbSQgYmUgdGhlIHBvc2l0aW9uYWwgcGFyYW1ldGVycyBvZiAkZiQgYW5kIGxldCAkcF97aCsxfSwgXGxkb3RzLCBwX3toK2x9JCBiZSB0aGUgb3B0aW9uYWwgcGFyYW1ldGVycyBkZWNsYXJlZCBieSAkZiQuCgpcY29tbWVudGFyeXsKV2UgaGF2ZSBhbiBhcmd1bWVudCBsaXN0IGNvbnNpc3Rpbmcgb2YgJG4kIHBvc2l0aW9uYWwgYXJndW1lbnRzIGFuZCAkayQgbmFtZWQgYXJndW1lbnRzLiBXZSBoYXZlIGEgZnVuY3Rpb24gd2l0aCAkaCQgcmVxdWlyZWQgcGFyYW1ldGVycyBhbmQgJGwkIG9wdGlvbmFsIHBhcmFtZXRlcnMuIFRoZSBudW1iZXIgb2YgcG9zaXRpb25hbCBhcmd1bWVudHMgbXVzdCBiZSBhdCBsZWFzdCBhcyBsYXJnZSBhcyB0aGUgbnVtYmVyIG9mIHJlcXVpcmVkIHBhcmFtZXRlcnMsIGFuZCBubyBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIHBvc2l0aW9uYWwgcGFyYW1ldGVycy4gQWxsIG5hbWVkIGFyZ3VtZW50cyBtdXN0IGhhdmUgYSBjb3JyZXNwb25kaW5nIG5hbWVkIHBhcmFtZXRlci4gCn0KCklmICAkbiA8IGgkLCBvciAkbiA+IG0kLCB0aGUgbWV0aG9kIGxvb2t1cCBoYXMgZmFpbGVkLiBGdXJ0aGVybW9yZSwgZWFjaCAkeF9pLCBuKzEgXGxlIGkgXGxlIG4rayQsICBtdXN0IGhhdmUgYSBjb3JyZXNwb25kaW5nIG5hbWVkIHBhcmFtZXRlciBpbiB0aGUgc2V0ICRce3Bfe20rMX0sIFxsZG90cywgcF97aCtsfVx9JCBvciB0aGUgbWV0aG9kIGxvb2t1cCBhbHNvIGZhaWxzLiAgT3RoZXJ3aXNlIG1ldGhvZCBsb29rdXAgaGFzIHN1Y2NlZWRlZC4KCklmIHRoZSBtZXRob2QgbG9va3VwIHN1Y2NlZWRlZCwgdGhlIGJvZHkgb2YgJGYkIGlzIGV4ZWN1dGVkIHdpdGggcmVzcGVjdCB0byB0aGUgYmluZGluZ3MgdGhhdCByZXN1bHRlZCBmcm9tIHRoZSBldmFsdWF0aW9uIG9mIHRoZSBhcmd1bWVudCBsaXN0LCBhbmQgd2l0aCBcVEhJU3t9IGJvdW5kIHRvICR2X28kLiBUaGUgdmFsdWUgb2YgJGkkIGlzIHRoZSB2YWx1ZSByZXR1cm5lZCBhZnRlciAkZiQgaXMgZXhlY3V0ZWQuCgpJZiB0aGUgbWV0aG9kIGxvb2t1cCBoYXMgZmFpbGVkLCB0aGVuIGxldCAkZyQgYmUgdGhlIHJlc3VsdCBvZiBsb29raW5nIHVwIGdldHRlciAoXHJlZntnZXR0ZXJBbmRTZXR0ZXJMb29rdXB9KSAkbSQgaW4gJHZfbyQgd2l0aCByZXNwZWN0IHRvICRMJC4gSWYgdGhlIGdldHRlciBsb29rdXAgc3VjY2VlZGVkLCBsZXQgJHZfZyQgYmUgdGhlIHZhbHVlIG9mIHRoZSBnZXR0ZXIgaW52b2NhdGlvbiAkby5tJC4gVGhlbiB0aGUgdmFsdWUgb2YgJGkkIGlzIHRoZSByZXN1bHQgb2YgaW52b2tpbmcgCnRoZSBzdGF0aWMgbWV0aG9kIFxjb2Rle0Z1bmN0aW9uLmFwcGx5KCl9IHdpdGggYXJndW1lbnRzICR2LmcsIFtvXzEsIFxsZG90cyAsIG9fbl0sIFx7eF97bisxfTogb197bisxfSwgXGxkb3RzICwgeF97bitrfTogb197bitrfVx9JC4KCklmICBnZXR0ZXIgbG9va3VwIGhhcyBhbHNvIGZhaWxlZCwgdGhlbiBhIG5ldyBpbnN0YW5jZSAkaW0kICBvZiB0aGUgcHJlZGVmaW5lZCBjbGFzcyAgXGNvZGV7SW52b2NhdGlvbn0gIGlzIGNyZWF0ZWQsIHN1Y2ggdGhhdCA6ClxiZWdpbntpdGVtaXplfQpcaXRlbSAgXGNvZGV7aW0uaXNNZXRob2R9IGV2YWx1YXRlcyB0byBcY29kZXtcVFJVRXt9fS4KXGl0ZW0gIFxjb2Rle2ltLm1lbWJlck5hbWV9IGV2YWx1YXRlcyB0byBcY29kZXsnbSd9LgpcaXRlbSBcY29kZXtpbS5wb3NpdGlvbmFsQXJndW1lbnRzfSBldmFsdWF0ZXMgdG8gYW4gaW1tdXRhYmxlIGxpc3Qgd2l0aCB0aGUgc2FtZSB2YWx1ZXMgYXMgIFxjb2Rle1skb18xLCBcbGRvdHMsIG9fbiRdfS4KXGl0ZW0gXGNvZGV7aW0ubmFtZWRBcmd1bWVudHN9IGV2YWx1YXRlcyB0byBhbiBpbW11dGFibGUgbWFwIHdpdGggdGhlIHNhbWUga2V5cyBhbmQgdmFsdWVzIGFzIFxjb2Rle1x7JHhfe24rMX06IG9fe24rMX0sIFxsZG90cywgeF97bitrfSA6IG9fe24ra30kXH19LgpcZW5ke2l0ZW1pemV9CgpUaGVuIHRoZSBtZXRob2QgXGNvZGV7bm9TdWNoTWV0aG9kKCl9IGlzIGxvb2tlZCB1cCBpbiAkbyQgYW5kIGludm9rZWQgd2l0aCBhcmd1bWVudCAkaW0kLCBhbmQgdGhlIHJlc3VsdCBvZiB0aGlzIGludm9jYXRpb24gaXMgdGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nICRpJC4KClxjb21tZW50YXJ5e05vdGljZSB0aGF0IHRoZSB3b3JkaW5nIGNhcmVmdWxseSBhdm9pZHMgcmUtZXZhbHVhdGluZyB0aGUgcmVjZWl2ZXIgJG8kIGFuZCB0aGUgYXJndW1lbnRzICRhX2kkLiB9CgpMZXQgJFQkIGJlIHRoZSAgc3RhdGljIHR5cGUgb2YgJG8kLiBJdCBpcyBhIHN0YXRpYyB0eXBlIHdhcm5pbmcgaWYgJFQkIGRvZXMgbm90IGhhdmUgYW4gYWNjZXNzaWJsZSAgKFxyZWZ7cHJpdmFjeX0pIGluc3RhbmNlIG1lbWJlciBuYW1lZCAkbSQgdW5sZXNzICRUJCBvciBhIHN1cGVyaW50ZXJmYWNlIG9mICRUJCBpcyBhbm5vdGF0ZWQgd2l0aCBhbiBhbm5vdGF0aW9uIGRlbm90aW5nIGEgY29uc3RhbnQgaWRlbnRpY2FsIHRvIHRoZSBjb25zdGFudCBcY29kZXtAcHJveHl9IGRlZmluZWQgaW4gXGNvZGV7ZGFydDpjb3JlfS4gICBJZiAkVC5tJCBleGlzdHMsIGl0ICBpcyBhIHN0YXRpYyB0eXBlIHdhcm5pbmcgaWYgdGhlIHR5cGUgJEYkIG9mICRULm0kIG1heSBub3QgYmUgYXNzaWduZWQgdG8gYSBmdW5jdGlvbiB0eXBlLiBJZiAkVC5tJCBkb2VzIG5vdCBleGlzdCwgb3IgaWYgJEYkIGlzIG5vdCBhIGZ1bmN0aW9uIHR5cGUsIHRoZSBzdGF0aWMgdHlwZSBvZiAkaSQgaXMgXERZTkFNSUN7fTsgb3RoZXJ3aXNlIHRoZSBzdGF0aWMgdHlwZSBvZiAkaSQgaXMgdGhlIGRlY2xhcmVkIHJldHVybiB0eXBlIG9mICAkRiQuICAKJSBUaGUgZm9sbG93aW5nIGlzIG5vdCBuZWVkZWQgYmVjYXVzZSBpdCBpcyBzcGVjaWZpZWQgaW4gJ0JpbmRpbmcgQWN0dWFscyB0byBGb3JtYWxzIiBMZXQgJFRfaSQgYmUgdGhlIHN0YXRpYyB0eXBlIG9mICRhX2ksIGkgXGluIDEgLi4gbitrJC4gSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiAkRiQgaXMgbm90IGEgc3VwZXJ0eXBlIG9mICAkKFRfMSwgXGxkb3RzLCBUX24sIFx7VF97bisxfSQgJHhfe24rMX0sIFxsZG90cywgVF97bitrfSQgJHhfe24ra31cfSkgXHRvIFxib3QkLgoKCgolXHN1YnN1YnNlY3Rpb257VGhpcyBJbnZvY2F0aW9ufQolIE1heWJlIHRoaXMgaGFzIG5vIHNpZ25pZmljYW5jZSB0aGUgd2F5IHRoZSBsYW5ndWFnZSBpcyBzZXQgdXA/CgoKXHN1YnN1YnNlY3Rpb257Q2FzY2FkZWQgSW52b2NhdGlvbnN9ClxsYWJlbHtjYXNjYWRlZEludm9jYXRpb25zfQoKQSB7XGVtIGNhc2NhZGVkIG1ldGhvZCBpbnZvY2F0aW9ufSBoYXMgdGhlIGZvcm0ge1xlbSBlLi5zdWZmaXh9CndoZXJlICRlJCBpcyBhbiBleHByZXNzaW9uIGFuZCB7XGVtIHN1ZmZpeH0gaXMgYSBzZXF1ZW5jZSBvZiBvcGVyYXRvciwgbWV0aG9kLCBnZXR0ZXIgb3Igc2V0dGVyIGludm9jYXRpb25zLgoKXGJlZ2lue2dyYW1tYXJ9CntcYmYgY2FzY2FkZVNlY3Rpb246fQogICAgICBge1xlc2NhcGVncmFtbWFyIC4ufScgKGNhc2NhZGVTZWxlY3RvciBhcmd1bWVudHMqKSAoYXNzaWduYWJsZVNlbGVjdG9yIGFyZ3VtZW50cyopKiAoYXNzaWdubWVudE9wZXJhdG9yIGV4cHJlc3Npb25XaXRob3V0Q2FzY2FkZSk/CiAgICAgIC4KICAgICAKe1xiZiBjYXNjYWRlU2VsZWN0b3I6fWBbJyAgZXhwcmVzc2lvbiBgXSc7CiAgICAgIGlkZW50aWZpZXIKICAgICAgLgpcZW5ke2dyYW1tYXJ9CgpBIGNhc2NhZGVkIG1ldGhvZCBpbnZvY2F0aW9uIGV4cHJlc3Npb24gb2YgdGhlIGZvcm0ge1xlbSBlLi5zdWZmaXh9IGlzIGVxdWl2YWxlbnQgdG8gdGhlIGV4cHJlc3Npb24gXGNvZGV7KHQpXHt0LntcZW0gc3VmZml4fTsgXFJFVFVSTnt9IHQ7XH0oJGUkKX0uCgpcc3Vic3Vic2VjdGlvbntTdGF0aWMgSW52b2NhdGlvbn0KXGxhYmVse3N0YXRpY0ludm9jYXRpb259CgpBIHN0YXRpYyBtZXRob2QgaW52b2NhdGlvbiAkaSQgaGFzIHRoZSBmb3JtIAoKJEMubShhXzEsIFxsZG90cyAsIGFfbiwgeF97bisxfTogYV97bisxfSwgXGxkb3RzICwgeF97bitrfTogYV97bitrfSkkIAoKd2hlcmUgJEMkIGRlbm90ZXMgYSBjbGFzcyBpbiB0aGUgY3VycmVudCBzY29wZS4KCkl0IGlzIGEgc3RhdGljIHdhcm5pbmcgaWYgJEMkIGRvZXMgbm90IGRlY2xhcmUgYSBzdGF0aWMgbWV0aG9kIG9yIGdldHRlciAkbSQuCgpccmF0aW9uYWxlewpOb3RlIHRoYXQgdGhlIGFic2VuY2Ugb2YgJEMubSQgaXMgc3RhdGljYWxseSBkZXRlY3RhYmxlLiBOZXZlcnRoZWxlc3MsIHdlIGNob29zZSBub3QgdG8gZGVmaW5lIHRoaXMgc2l0dWF0aW9uIGFzIGFuIGVycm9yLiAgVGhlIGdvYWwgaXMgdG8gYWxsb3cgY29kaW5nIHRvIHByb2NlZWQgaW4gdGhlIG9yZGVyIHRoYXQgc3VpdHMgdGhlIGRldmVsb3BlciByYXRoZXIgdGhhbiBlYWdlcmx5IGluc2lzdGluZyBvbiBjb25zaXN0ZW5jeS4gVGhlIHdhcm5pbmdzIGFyZSBnaXZlbiBzdGF0aWNhbGx5IGF0IGNvbXBpbGUtdGltZSB0byBoZWxwIGRldmVsb3BlcnMgY2F0Y2ggZXJyb3JzLiBIb3dldmVyLCBkZXZlbG9wZXJzIG5lZWQgbm90IGNvcnJlY3QgdGhlc2UgcHJvYmxlbXMgaW1tZWRpYXRlbHkgaW4gb3JkZXIgdG8gbWFrZSBwcm9ncmVzcy4KfQoKXGNvbW1lbnRhcnl7Ck5vdGUgdGhlIHJlcXVpcmVtZW50IHRoYXQgJEMkIHtcZW0gZGVjbGFyZX0gdGhlIG1ldGhvZC4gVGhpcyBtZWFucyB0aGF0IHN0YXRpYyBtZXRob2RzIGRlY2xhcmVkIGluIHN1cGVyY2xhc3NlcyBvZiAkQyQgY2Fubm90IGJlIGludm9rZWQgdmlhICRDJC4KfQoKCkV2YWx1YXRpb24gb2YgJGkkIHByb2NlZWRzIGFzIGZvbGxvd3M6CgpJZiAkQyQgaXMgYSBkZWZlcnJlZCB0eXBlICAoXHJlZntzdGF0aWNUeXBlc30pIHdpdGggcHJlZml4ICRwJCwgYW5kICRwJCBoYXMgbm90IGJlZW4gc3VjY2Vzc2Z1bGx5IGxvYWRlZCwgb3IKaWYgJEMkIGRvZXMgbm90IGRlY2xhcmUgYSBzdGF0aWMgbWV0aG9kIG9yIGdldHRlciAkbSQgdGhlbiB0aGUgYXJndW1lbnQgbGlzdCAkKGFfMSwgXGxkb3RzICwgYV9uLCB4X3tuKzF9OiBhX3tuKzF9LCBcbGRvdHMgLCB4X3tuK2t9OiBhX3tuK2t9KSQgaXMgZXZhbHVhdGVkLCBhZnRlciB3aGljaCBhIFxjb2Rle05vU3VjaE1ldGhvZEVycm9yfSBpcyB0aHJvd24uIAoKT3RoZXJ3aXNlLCBldmFsdWF0aW9uIHByb2NlZWRzIGFzIGZvbGxvd3M6ClxiZWdpbntpdGVtaXplfQpcaXRlbQpJZiB0aGUgbWVtYmVyICRtJCBkZWNsYXJlZCBieSAkQyQgaXMgYSBnZXR0ZXIsIHRoZW4gJGkkIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGV4cHJlc3Npb24gJChDLm0pKGFfMSwgXGxkb3RzICwgYV9uLCB4X3tuKzF9OiBhX3tuKzF9LCBcbGRvdHMgLCB4X3tuK2t9OiBhX3tuK2t9KSQuIApcaXRlbSBPdGhlcndpc2UsIGxldCAkZiQgYmUgdGhlIHRoZSBtZXRob2QgJG0kIGRlY2xhcmVkIGluIGNsYXNzICRDJC4gTmV4dCwgdGhlIGFyZ3VtZW50IGxpc3QgJChhXzEsIFxsZG90cyAsIGFfbiwgeF97bisxfTogYV97bisxfSwgXGxkb3RzICwgeF97bitrfTogYV97bitrfSkkIGlzIGV2YWx1YXRlZC4KVGhlIGJvZHkgb2YgJGYkIGlzIHRoZW4gZXhlY3V0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBiaW5kaW5ncyB0aGF0IHJlc3VsdGVkIGZyb20gdGhlIGV2YWx1YXRpb24gb2YgdGhlIGFyZ3VtZW50IGxpc3QuIFRoZSB2YWx1ZSBvZiAkaSQgaXMgdGhlIHZhbHVlIHJldHVybmVkIGFmdGVyIHRoZSBib2R5IG9mICRmJCBpcyBleGVjdXRlZC4KXGVuZHtpdGVtaXplfQoKSXQgaXMgYSBzdGF0aWMgdHlwZSB3YXJuaW5nIGlmIHRoZSB0eXBlICRGJCBvZiAkQy5tJCBtYXkgbm90IGJlIGFzc2lnbmVkIHRvIGEgZnVuY3Rpb24gdHlwZS4gIElmICRGJCBpcyBub3QgYSBmdW5jdGlvbiB0eXBlLCBvciBpZiAkQy5tJCBkb2VzIG5vdCBleGlzdCwgdGhlIHN0YXRpYyB0eXBlIG9mICRpJCBpcyBcRFlOQU1JQ3t9LiBPdGhlcndpc2UgCnRoZSBzdGF0aWMgdHlwZSBvZiAkaSQgaXMgdGhlIGRlY2xhcmVkIHJldHVybiB0eXBlIG9mICAkRiQuICAKJSBUaGUgZm9sbG93aW5nIGlzIG5vdCBuZWVkZWQgYmVjYXVzZSBpdCBpcyBzcGVjaWZpZWQgaW4gJ0JpbmRpbmcgQWN0dWFscyB0byBGb3JtYWxzIkxldCAkVF9pJCBiZSB0aGUgc3RhdGljIHR5cGUgb2YgJGFfaSwgaSBcaW4gMSAuLiBuK2skLiBJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmICRGJCBpcyBub3QgYSBzdXBlcnR5cGUgb2YgICQoVF8xLCBcbGRvdHMsIFRfbiwgXHtUX3tuKzF9JCAkeF97bisxfSwgXGxkb3RzLCBUX3tuK2t9JCAkeF97bitrfVx9KSBcdG8gXGJvdCQuCgogCgoKXHN1YnN1YnNlY3Rpb257U3VwZXIgSW52b2NhdGlvbn0KXGxhYmVse3N1cGVySW52b2NhdGlvbn0KCkEgc3VwZXIgbWV0aG9kIGludm9jYXRpb24gJGkkIGhhcyB0aGUgZm9ybSAKCiRcU1VQRVJ7fS5tKGFfMSwgXGxkb3RzICwgYV9uLCB4X3tuKzF9OiBhX3tuKzF9LCBcbGRvdHMgLCB4X3tuK2t9OiBhX3tuK2t9KSQuCgpFdmFsdWF0aW9uIG9mICRpJCBwcm9jZWVkcyBhcyBmb2xsb3dzOgoKRmlyc3QsIHRoZSBhcmd1bWVudCBsaXN0ICQoYV8xLCBcbGRvdHMgLCBhX24sIHhfe24rMX06IGFfe24rMX0sIFxsZG90cyAsIHhfe24ra306IGFfe24ra30pJCBpcyBldmFsdWF0ZWQgIHlpZWxkaW5nIGFjdHVhbCBhcmd1bWVudCBvYmplY3RzICRvXzEsIFxsZG90cyAsIG9fe24ra30kLiBMZXQgJFMkIGJlIHRoZSBzdXBlcmNsYXNzIG9mIHRoZSBpbW1lZGlhdGVseSBlbmNsb3NpbmcgY2xhc3MsIGFuZCBsZXQgJGYkIGJlIHRoZSByZXN1bHQgb2YgbG9va2luZyB1cCBtZXRob2QgKFxyZWZ7b3JkaW5hcnlJbnZvY2F0aW9ufSkgICRtJCBpbiAkUyQgIHdpdGggcmVzcGVjdCB0byB0aGUgY3VycmVudCBsaWJyYXJ5ICRMJC4gCkxldCAkcF8xIFxsZG90cyBwX2gkIGJlIHRoZSByZXF1aXJlZCBwYXJhbWV0ZXJzIG9mICRmJCwgIGxldCAkcF8xIFxsZG90cyBwX20kIGJlIHRoZSBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgb2YgJGYkIGFuZCBsZXQgJHBfe2grMX0sIFxsZG90cywgcF97aCtsfSQgYmUgdGhlIG9wdGlvbmFsIHBhcmFtZXRlcnMgZGVjbGFyZWQgYnkgJGYkLgoKSWYgICRuIDwgaCQsIG9yICRuID4gbSQsIHRoZSBtZXRob2QgbG9va3VwIGhhcyBmYWlsZWQuIEZ1cnRoZXJtb3JlLCBlYWNoICR4X2ksIG4rMSBcbGUgaSBcbGUgbitrJCwgIG11c3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgbmFtZWQgcGFyYW1ldGVyIGluIHRoZSBzZXQgJFx7cF97bSsxfSwgXGxkb3RzLCBwX3toK2x9XH0kIG9yIHRoZSBtZXRob2QgbG9va3VwIGFsc28gZmFpbHMuICBPdGhlcndpc2UgbWV0aG9kIGxvb2t1cCBoYXMgc3VjY2VlZGVkLgoKSWYgdGhlIG1ldGhvZCBsb29rdXAgc3VjY2VlZGVkLCB0aGUgYm9keSBvZiAkZiQgaXMgZXhlY3V0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBiaW5kaW5ncyB0aGF0IHJlc3VsdGVkIGZyb20gdGhlIGV2YWx1YXRpb24gb2YgdGhlIGFyZ3VtZW50IGxpc3QsIGFuZCB3aXRoIFxUSElTe30gYm91bmQgdG8gdGhlIGN1cnJlbnQgdmFsdWUgb2YgXFRISVN7fS4gVGhlIHZhbHVlIG9mICRpJCBpcyB0aGUgdmFsdWUgcmV0dXJuZWQgYWZ0ZXIgJGYkIGlzIGV4ZWN1dGVkLgoKSWYgdGhlIG1ldGhvZCBsb29rdXAgaGFzIGZhaWxlZCwgdGhlbiBsZXQgJGckIGJlIHRoZSByZXN1bHQgb2YgbG9va2luZyB1cCBnZXR0ZXIgKFxyZWZ7Z2V0dGVyQW5kU2V0dGVyTG9va3VwfSkgJG0kIGluICRTJCB3aXRoIHJlc3BlY3QgdG8gJEwkLiBJZiB0aGUgZ2V0dGVyIGxvb2t1cCBzdWNjZWVkZWQsIGxldCAkdl9nJCBiZSB0aGUgdmFsdWUgb2YgdGhlIGdldHRlciBpbnZvY2F0aW9uICRcU1VQRVJ7fS5tJC4gVGhlbiB0aGUgdmFsdWUgb2YgJGkkIGlzIHRoZSByZXN1bHQgb2YgaW52b2tpbmcgCnRoZSBzdGF0aWMgbWV0aG9kIFxjb2Rle0Z1bmN0aW9uLmFwcGx5KCl9IHdpdGggYXJndW1lbnRzICR2LmcsIFtvXzEsIFxsZG90cyAsIG9fbl0sIFx7eF97bisxfTogb197bisxfSwgXGxkb3RzICwgeF97bitrfTogb197bitrfVx9JC4KIApJZiAgZ2V0dGVyIGxvb2t1cCBoYXMgYWxzbyBmYWlsZWQsIHRoZW4gYSBuZXcgaW5zdGFuY2UgJGltJCAgb2YgdGhlIHByZWRlZmluZWQgY2xhc3MgIFxjb2Rle0ludm9jYXRpb259ICBpcyBjcmVhdGVkLCBzdWNoIHRoYXQgOgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gIFxjb2Rle2ltLmlzTWV0aG9kfSBldmFsdWF0ZXMgdG8gXGNvZGV7XFRSVUV7fX0uClxpdGVtICBcY29kZXtpbS5tZW1iZXJOYW1lfSBldmFsdWF0ZXMgdG8gXGNvZGV7J20nfS4KXGl0ZW0gXGNvZGV7aW0ucG9zaXRpb25hbEFyZ3VtZW50c30gZXZhbHVhdGVzIHRvIGFuIGltbXV0YWJsZSBsaXN0IHdpdGggdGhlIHNhbWUgIHZhbHVlcyBhcyAgXGNvZGV7WyRvXzEsIFxsZG90cywgb19uJF19LgpcaXRlbSBcY29kZXtpbS5uYW1lZEFyZ3VtZW50c30gZXZhbHVhdGVzIHRvIGFuIGltbXV0YWJsZSBtYXAgd2l0aCB0aGUgc2FtZSBrZXlzIGFuZCB2YWx1ZXMgYXMgXGNvZGV7XHskeF97bisxfTogb197bisxfSwgXGxkb3RzLCB4X3tuK2t9IDogb197bitrfSRcfX0uClxlbmR7aXRlbWl6ZX0KVGhlbiB0aGUgbWV0aG9kIFxjb2Rle25vU3VjaE1ldGhvZCgpfSBpcyBsb29rZWQgdXAgaW4gJFMkIGFuZCBpbnZva2VkIG9uIFxUSElTe30gd2l0aCBhcmd1bWVudCAkaW0kLCBhbmQgdGhlIHJlc3VsdCBvZiB0aGlzIGludm9jYXRpb24gaXMgdGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nICRpJC4KCkl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIGEgc3VwZXIgbWV0aG9kIGludm9jYXRpb24gb2NjdXJzIGluIGEgdG9wLWxldmVsIGZ1bmN0aW9uIG9yIHZhcmlhYmxlIGluaXRpYWxpemVyLCBpbiBhbiBpbnN0YW5jZSB2YXJpYWJsZSBpbml0aWFsaXplciBvciBpbml0aWFsaXplciBsaXN0LCBpbiBjbGFzcyBcY29kZXtPYmplY3R9LCBpbiBhIGZhY3RvcnkgY29uc3RydWN0b3Igb3IgaW4gYSBzdGF0aWMgbWV0aG9kIG9yIHZhcmlhYmxlIGluaXRpYWxpemVyLgoKSXQgaXMgYSBzdGF0aWMgdHlwZSB3YXJuaW5nIGlmICRTJCBkb2VzIG5vdCBoYXZlIGFuIGFjY2Vzc2libGUgKFxyZWZ7cHJpdmFjeX0pIGluc3RhbmNlIG1lbWJlciBuYW1lZCAkbSQgdW5sZXNzICRTJCBvciBhIHN1cGVyaW50ZXJmYWNlIG9mICRTJCBpcyBhbm5vdGF0ZWQgd2l0aCBhbiBhbm5vdGF0aW9uIGRlbm90aW5nIGEgY29uc3RhbnQgaWRlbnRpY2FsIHRvIHRoZSBjb25zdGFudCBcY29kZXtAcHJveHl9IGRlZmluZWQgaW4gXGNvZGV7ZGFydDpjb3JlfS4gSWYgJFMubSQgZXhpc3RzLCBpdCAgaXMgYSBzdGF0aWMgdHlwZSB3YXJuaW5nIGlmIHRoZSB0eXBlICRGJCBvZiAkUy5tJCBtYXkgbm90IGJlIGFzc2lnbmVkIHRvIGEgZnVuY3Rpb24gdHlwZS4gSWYgJFMubSQgZG9lcyBub3QgZXhpc3QsIG9yIGlmICRGJCBpcyBub3QgYSBmdW5jdGlvbiB0eXBlLCB0aGUgc3RhdGljIHR5cGUgb2YgJGkkIGlzIFxEWU5BTUlDe307IG90aGVyd2lzZSB0aGUgc3RhdGljIHR5cGUgb2YgJGkkIGlzIHRoZSBkZWNsYXJlZCByZXR1cm4gdHlwZSBvZiAgJEYkLiAgCiUgVGhlIGZvbGxvd2luZyBpcyBub3QgbmVlZGVkIGJlY2F1c2UgaXQgaXMgc3BlY2lmaWVkIGluICdCaW5kaW5nIEFjdHVhbHMgdG8gRm9ybWFscyIKJUxldCAkVF9pJCBiZSB0aGUgc3RhdGljIHR5cGUgb2YgJGFfaSwgaSBcaW4gMSAuLiBuK2skLiBJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmICRGJCBpcyBub3QgYSBzdXBlcnR5cGUgb2YgICQoVF8xLCBcbGRvdHMsIHRfbiwgXHtUX3tuKzF9JCAkeF97bisxfSwgXGxkb3RzLCBUX3tuK2t9JCAkeF97bitrfVx9KSBcdG8gXGJvdCQuCgoKCgpcc3Vic3Vic2VjdGlvbntTZW5kaW5nIE1lc3NhZ2VzfQoKXGxhYmVse3NlbmRpbmdNZXNzYWdlc30KCk1lc3NhZ2VzIGFyZSB0aGUgc29sZSBtZWFucyBvZiBjb21tdW5pY2F0aW9uIGFtb25nIGlzb2xhdGVzLiBNZXNzYWdlcyBhcmUgc2VudCBieSBpbnZva2luZyBzcGVjaWZpYyAgbWV0aG9kcyBpbiB0aGUgRGFydCBsaWJyYXJpZXM7IHRoZXJlIGlzIG5vIHNwZWNpZmljIHN5bnRheCBmb3Igc2VuZGluZyBhIG1lc3NhZ2UuIAoKXGNvbW1lbnRhcnl7SW4gb3RoZXIgd29yZHMsIHRoZSBtZXRob2RzIHN1cHBvcnRpbmcgc2VuZGluZyBtZXNzYWdlcyBlbWJvZHkgcHJpbWl0aXZlcyBvZiBEYXJ0IHRoYXQgYXJlIG5vdCBhY2Nlc3NpYmxlIHRvIG9yZGluYXJ5IGNvZGUsIG11Y2ggbGlrZSB0aGUgbWV0aG9kcyB0aGF0IHNwYXduIGlzb2xhdGVzLgp9CgoKXHN1YnNlY3Rpb257IEdldHRlciBhbmQgU2V0dGVyIExvb2t1cH0KXGxhYmVse2dldHRlckFuZFNldHRlckxvb2t1cH0KClRoZSByZXN1bHQgb2YgYSBsb29rdXAgb2YgYSBnZXR0ZXIgKHJlc3BlY3RpdmVseSBzZXR0ZXIpICRtJCBpbiBvYmplY3QgJG8kICB3aXRoIHJlc3BlY3QgIHRvICBsaWJyYXJ5ICRMJCBpcyB0aGUgcmVzdWx0IG9mIGxvb2tpbmcgdXAgZ2V0dGVyIChyZXNwZWN0aXZlbHkgc2V0dGVyKSAkbSQgaW4gY2xhc3MgJEMkIHdpdGggcmVzcGVjdCB0byAkTCQsIHdoZXJlICRDJCBpcyB0aGUgY2xhc3Mgb2YgJG8kLgoKVGhlIHJlc3VsdCBvZiBhIGxvb2t1cCBvZiBhIGdldHRlciAocmVzcGVjdGl2ZWx5IHNldHRlcikgJG0kIGluIGNsYXNzICRDJCAgd2l0aCByZXNwZWN0IHRvIGxpYnJhcnkgJEwkIGlzOgpJZiAkQyQgZGVjbGFyZXMgYSBjb25jcmV0ZSBpbnN0YW5jZSBnZXR0ZXIgKHJlc3BlY3RpdmVseSBzZXR0ZXIpIG5hbWVkICRtJCAgdGhhdCBpcyBhY2Nlc3NpYmxlIHRvICRMJCwgIHRoZW4gdGhhdCBnZXR0ZXIgKHJlc3BlY3RpdmVseSBzZXR0ZXIpIGlzIHRoZSByZXN1bHQgb2YgdGhlIGxvb2t1cC4gT3RoZXJ3aXNlLCBpZiAkQyQgaGFzIGEgc3VwZXJjbGFzcyAkUyQsIHRoZW4gdGhlIHJlc3VsdCBvZiB0aGUgbG9va3VwIGlzIHRoZSByZXN1bHQgb2YgbG9va2luZyB1cCBnZXR0ZXIgKHJlc3BlY3RpdmVseSBzZXR0ZXIpICRtJCBpbiAkUyQgd2l0aCByZXNwZWN0IHRvICRMJC4gT3RoZXJ3aXNlLCB3ZSBzYXkgdGhhdCB0aGUgbG9va3VwIGhhcyBmYWlsZWQuCgpccmF0aW9uYWxlIHsKVGhlIG1vdGl2YXRpb24gZm9yIHNraXBwaW5nIGFic3RyYWN0IG1lbWJlcnMgZHVyaW5nIGxvb2t1cCBpcyBsYXJnZWx5IHRvIGFsbG93IHNtb290aGVyIG1peGluIGNvbXBvc2l0aW9uLiAKfQoKXHN1YnNlY3Rpb257IEdldHRlciBJbnZvY2F0aW9ufQpcbGFiZWx7Z2V0dGVySW52b2NhdGlvbn0KCkEgZ2V0dGVyIGludm9jYXRpb24gcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5LgoKRXZhbHVhdGlvbiBvZiBhIGdldHRlciBpbnZvY2F0aW9uICRpJCBvZiB0aGUgZm9ybSAkZS5tJCBwcm9jZWVkcyBhcyBmb2xsb3dzOgoKRmlyc3QsIHRoZSBleHByZXNzaW9uICRlJCBpcyBldmFsdWF0ZWQgdG8gYW4gb2JqZWN0ICRvJC4gVGhlbiwgdGhlIGdldHRlciBmdW5jdGlvbiAoXHJlZntnZXR0ZXJzfSkgJG0kIGlzIGxvb2tlZCB1cCAoXHJlZntnZXR0ZXJBbmRTZXR0ZXJMb29rdXB9KSBpbiAkbyQgIHdpdGggcmVzcGVjdCB0byAgdGhlIGN1cnJlbnQgbGlicmFyeSwgYW5kIGl0cyBib2R5IGlzIGV4ZWN1dGVkIHdpdGggXFRISVN7fSBib3VuZCB0byAkbyQuICBUaGUgdmFsdWUgb2YgdGhlIGdldHRlciBpbnZvY2F0aW9uIGV4cHJlc3Npb24gaXMgdGhlIHJlc3VsdCByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgZ2V0dGVyIGZ1bmN0aW9uLiAKCgpJZiB0aGUgZ2V0dGVyIGxvb2t1cCBoYXMgZmFpbGVkLCB0aGVuIGEgbmV3IGluc3RhbmNlICRpbSQgIG9mIHRoZSBwcmVkZWZpbmVkIGNsYXNzICBcY29kZXtJbnZvY2F0aW9ufSAgaXMgY3JlYXRlZCwgc3VjaCB0aGF0IDoKXGJlZ2lue2l0ZW1pemV9ClxpdGVtICBcY29kZXtpbS5pc0dldHRlcn0gZXZhbHVhdGVzIHRvIFxjb2Rle1xUUlVFe319LgpcaXRlbSAgXGNvZGV7aW0ubWVtYmVyTmFtZX0gZXZhbHVhdGVzIHRvIFxjb2RleydtJ30uClxpdGVtIFxjb2Rle2ltLnBvc2l0aW9uYWxBcmd1bWVudHN9IGV2YWx1YXRlcyB0byB0aGUgdmFsdWUgb2YgXGNvZGV7XENPTlNUe30gW119LgpcaXRlbSBcY29kZXtpbS5uYW1lZEFyZ3VtZW50c30gZXZhbHVhdGVzIHRvIHRoZSB2YWx1ZSBvZiBcY29kZXtcQ09OU1R7fSBce1x9fS4KXGVuZHtpdGVtaXplfQpUaGVuIHRoZSBtZXRob2QgXGNvZGV7bm9TdWNoTWV0aG9kKCl9IGlzIGxvb2tlZCB1cCBpbiAkbyQgYW5kIGludm9rZWQgIHdpdGggYXJndW1lbnQgJGltJCwgYW5kIHRoZSByZXN1bHQgb2YgdGhpcyBpbnZvY2F0aW9uIGlzIHRoZSByZXN1bHQgb2YgZXZhbHVhdGluZyAkaSQuCgpMZXQgJFQkIGJlIHRoZSAgc3RhdGljIHR5cGUgb2YgJGUkLiBJdCBpcyBhIHN0YXRpYyB0eXBlIHdhcm5pbmcgaWYgJFQkIGRvZXMgbm90IGhhdmUgYSBnZXR0ZXIgbmFtZWQgJG0kIHVubGVzcyAkVCQgb3IgYSBzdXBlcmludGVyZmFjZSBvZiAkVCQgaXMgYW5ub3RhdGVkIHdpdGggYW4gYW5ub3RhdGlvbiBkZW5vdGluZyBhIGNvbnN0YW50IGlkZW50aWNhbCB0byB0aGUgY29uc3RhbnQgXGNvZGV7QHByb3h5fSBkZWZpbmVkIGluIFxjb2Rle2RhcnQ6Y29yZX0uIFRoZSBzdGF0aWMgdHlwZSBvZiAkaSQgaXMgdGhlIGRlY2xhcmVkIHJldHVybiB0eXBlIG9mICRULm0kLCBpZiAkVC5tJCBleGlzdHM7IG90aGVyd2lzZSB0aGUgc3RhdGljIHR5cGUgb2YgJGkkICBpcyAgXERZTkFNSUN7fS4gCgpFdmFsdWF0aW9uIG9mIGEgZ2V0dGVyIGludm9jYXRpb24gJGkkIG9mIHRoZSBmb3JtICRDLm0kIHByb2NlZWRzIGFzIGZvbGxvd3M6CgpJZiAgdGhlcmUgaXMgbm8gY2xhc3MgJEMkIGluIHRoZSBlbmNsb3NpbmcgbGV4aWNhbCBzY29wZSBvZiAkaSQsIG9yIGlmICAkQyQgZG9lcyBub3QgZGVjbGFyZSwgaW1wbGljaXRseSBvciBleHBsaWNpdGx5LCBhIGdldHRlciBuYW1lZCAkbSQsIHRoZW4gYSBcY29kZXtOb1N1Y2hNZXRob2RFcnJvcn0gaXMgdGhyb3duLiAKT3RoZXJ3aXNlLCB0aGUgZ2V0dGVyIGZ1bmN0aW9uICRDLm0kIGlzIGludm9rZWQuIFRoZSB2YWx1ZSBvZiAkaSQgaXMgdGhlIHJlc3VsdCByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgZ2V0dGVyIGZ1bmN0aW9uLiAKCkl0IGlzIGEgc3RhdGljIHdhcm5pbmcgIGlmIHRoZXJlIGlzIG5vIGNsYXNzICRDJCBpbiB0aGUgZW5jbG9zaW5nIGxleGljYWwgc2NvcGUgb2YgJGkkLCBvciBpZiAgJEMkIGRvZXMgbm90IGRlY2xhcmUsIGltcGxpY2l0bHkgb3IgZXhwbGljaXRseSwgYSBnZXR0ZXIgbmFtZWQgJG0kLiBUaGUgc3RhdGljIHR5cGUgb2YgJGkkIGlzIHRoZSBkZWNsYXJlZCByZXR1cm4gdHlwZSBvZiAkQy5tJCBpZiBpdCBleGlzdHMgb3IgXERZTkFNSUN7fSBvdGhlcndpc2UuIAoKRXZhbHVhdGlvbiBvZiBhIHRvcC1sZXZlbCBnZXR0ZXIgaW52b2NhdGlvbiAkaSQgb2YgdGhlIGZvcm0gJG0kLCB3aGVyZSAkbSQgaXMgYW4gaWRlbnRpZmllciwgcHJvY2VlZHMgYXMgZm9sbG93czoKClRoZSBnZXR0ZXIgZnVuY3Rpb24gJG0kIGlzIGludm9rZWQuIFRoZSB2YWx1ZSBvZiAkaSQgaXMgdGhlIHJlc3VsdCByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgZ2V0dGVyIGZ1bmN0aW9uLgpcY29tbWVudGFyeXsKTm90ZSB0aGF0IHRoZSBpbnZvY2F0aW9uIGlzIGFsd2F5cyBkZWZpbmVkLiBQZXIgdGhlIHJ1bGVzIGZvciBpZGVudGlmaWVyIHJlZmVyZW5jZXMsIGFuIGlkZW50aWZpZXIgd2lsbCBub3QgYmUgdHJlYXRlZCBhcyBhIHRvcC1sZXZlbCBnZXR0ZXIgaW52b2NhdGlvbiB1bmxlc3MgdGhlIGdldHRlciAkaSQgaXMgZGVmaW5lZC4gCn0KClRoZSBzdGF0aWMgdHlwZSBvZiAkaSQgaXMgdGhlIGRlY2xhcmVkIHJldHVybiB0eXBlIG9mICRtJC4KCkV2YWx1YXRpb24gb2Ygc3VwZXIgZ2V0dGVyIGludm9jYXRpb24gJGkkIG9mIHRoZSBmb3JtICRcU1VQRVJ7fS5tJCBwcm9jZWVkcyBhcyBmb2xsb3dzOgoKTGV0ICRTJCBiZSB0aGUgc3VwZXJjbGFzcyBvZiB0aGUgaW1tZWRpYXRlbHkgZW5jbG9zaW5nIGNsYXNzLiBUaGUgZ2V0dGVyIGZ1bmN0aW9uIChccmVme2dldHRlcnN9KSAkbSQgaXMgbG9va2VkIHVwIChccmVme2dldHRlckFuZFNldHRlckxvb2t1cH0pIGluICRTJCAgd2l0aCByZXNwZWN0IHRvICB0aGUgY3VycmVudCBsaWJyYXJ5LCBhbmQgaXRzIGJvZHkgaXMgZXhlY3V0ZWQgd2l0aCBcVEhJU3t9IGJvdW5kIHRvIHRoZSBjdXJyZW50IHZhbHVlIG9mICBcVEhJU3t9LiAgVGhlIHZhbHVlIG9mIHRoZSBnZXR0ZXIgaW52b2NhdGlvbiBleHByZXNzaW9uIGlzIHRoZSByZXN1bHQgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIGdldHRlciBmdW5jdGlvbi4gCgpJZiB0aGUgZ2V0dGVyIGxvb2t1cCBoYXMgZmFpbGVkLCB0aGVuIGEgbmV3IGluc3RhbmNlICRpbSQgIG9mIHRoZSBwcmVkZWZpbmVkIGNsYXNzICBcY29kZXtJbnZvY2F0aW9ufSAgaXMgY3JlYXRlZCwgc3VjaCB0aGF0IDoKXGJlZ2lue2l0ZW1pemV9ClxpdGVtICBcY29kZXtpbS5pc0dldHRlcn0gZXZhbHVhdGVzIHRvIFxjb2Rle1xUUlVFe319LgpcaXRlbSAgXGNvZGV7aW0ubWVtYmVyTmFtZX0gZXZhbHVhdGVzIHRvIFxjb2RleydtJ30uClxpdGVtIFxjb2Rle2ltLnBvc2l0aW9uYWxBcmd1bWVudHN9IGV2YWx1YXRlcyB0byB0aGUgdmFsdWUgb2YgXGNvZGV7XENPTlNUe30gW119LgpcaXRlbSBcY29kZXtpbS5uYW1lZEFyZ3VtZW50c30gZXZhbHVhdGVzIHRvIHRoZSB2YWx1ZSBvZiBcY29kZXtcQ09OU1R7fSBce1x9fS4KXGVuZHtpdGVtaXplfQpUaGVuIHRoZSBtZXRob2QgXGNvZGV7bm9TdWNoTWV0aG9kKCl9IGlzIGxvb2tlZCB1cCBpbiAkUyQgYW5kIGludm9rZWQgIHdpdGggYXJndW1lbnQgJGltJCwgYW5kIHRoZSByZXN1bHQgb2YgdGhpcyBpbnZvY2F0aW9uIGlzIHRoZSByZXN1bHQgb2YgZXZhbHVhdGluZyAkaSQuCgoKCkl0IGlzIGEgc3RhdGljIHR5cGUgd2FybmluZyBpZiAkUyQgZG9lcyBub3QgaGF2ZSBhIGdldHRlciBuYW1lZCAkbSQuICBUaGUgc3RhdGljIHR5cGUgb2YgJGkkIGlzIHRoZSBkZWNsYXJlZCByZXR1cm4gdHlwZSBvZiAkUy5tJCwgaWYgJFMubSQgZXhpc3RzOyBvdGhlcndpc2UgdGhlIHN0YXRpYyB0eXBlIG9mICRpJCAgaXMgIFxEWU5BTUlDe30uIAoKRXZhbHVhdGlvbiBvZiBhIGdldHRlciBpbnZvY2F0aW9uIG9mIHRoZSBmb3JtICRwLkMudiQsIHdoZXJlICRwJCBpcyBhIGRlZmVycmVkIHByZWZpeCwgcHJvY2VlZHMgYXMgZm9sbG93czoKCklmICRwJCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgbG9hZGVkLCB0aGUgYXNzaWdubWVudCBpcyBldmFsdWF0ZWQgZXhhY3RseSBsaWtlIHRoZSBpbnZvY2F0aW9uICRLLnYkLCB3aGVyZSAkSyQgZGVub3RlcyB0aGUgdG9wIGxldmVsIG1lbWJlciAkQyQgb2YgdGhlIGxpYnJhcnkgcmVwcmVzZW50ZWQgYnkgJHAkLiBPdGhlcndpc2UgYSBcY29kZXtOb1N1Y2hNZXRob2RFcnJvcn0gaXMgdGhyb3duLgoKCkV2YWx1YXRpb24gb2YgYSB0b3AtbGV2ZWwgZ2V0dGVyIGludm9jYXRpb24gJGkkIG9mIHRoZSBmb3JtICRwLm0kLCB3aGVyZSAkcCQgaXMgYSBkZWZlcnJlZCBwcmVmaXggYW5kICAkbSQgaXMgYW4gaWRlbnRpZmllciwgcHJvY2VlZHMgYXMgZm9sbG93czoKCklmICRwJCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgbG9hZGVkLCB0aGUgaW52b2NhdGlvbiBpcyBldmFsdWF0ZWQgZXhhY3RseSBsaWtlIHRoZSBpbnZvY2F0aW9uICR3JCwgd2hlcmUgJHckIGRlbm90ZXMgdGhlIHRvcCBsZXZlbCBtZW1iZXIgbmFtZWQgJG0kIG9mIHRoZSBsaWJyYXJ5IHJlcHJlc2VudGVkIGJ5ICRwJC4gT3RoZXJ3aXNlIGEgXGNvZGV7Tm9TdWNoTWV0aG9kRXJyb3J9IGlzIHRocm93bi4KIAoKClxzdWJzZWN0aW9ueyBBc3NpZ25tZW50fQpcbGFiZWx7YXNzaWdubWVudH0KCkFuIGFzc2lnbm1lbnQgY2hhbmdlcyB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgbXV0YWJsZSB2YXJpYWJsZSBvciBwcm9wZXJ0eS4KClxiZWdpbntncmFtbWFyfQp7XGJmIGFzc2lnbm1lbnRPcGVyYXRvcjp9YD0nIDsKICAgICAgY29tcG91bmRBc3NpZ25tZW50T3BlcmF0b3IKICAgIC4KXGVuZHtncmFtbWFyfQoKRXZhbHVhdGlvbiBvZiBhbiBhc3NpZ25tZW50ICRhJCBvZiB0aGUgZm9ybSAkdiQgXGNvZGV7PX0gJGUkIHByb2NlZWRzIGFzIGZvbGxvd3M6CgoKJUlmIHRoZXJlIGlzIG5laXRoZXIgYSBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbiB3aXRoIG5hbWUgJHYkIG5vciBhIHNldHRlciBkZWNsYXJhdGlvbiB3aXRoIG5hbWUgJHY9JCBpbiB0aGUgbGV4aWNhbCBzY29wZSBlbmNsb3NpbmcgJGEkLCB0aGVuOgolXGJlZ2lue2l0ZW1pemV9CiUgXGl0ZW0gSWYgICRhJCBvY2N1cnMgaW5zaWRlIGEgdG9wIGxldmVsIG9yIHN0YXRpYyBmdW5jdGlvbiAoYmUgaXQgZnVuY3Rpb24sIG1ldGhvZCwgZ2V0dGVyLCAgb3Igc2V0dGVyKSBvciB2YXJpYWJsZSBpbml0aWFsaXplciwgZXZhbHVhdGlvbiBvZiAkYSQgY2F1c2VzICRlJCB0byBiZSBldmFsdWF0ZWQsIGFmdGVyIHdoaWNoIGEgXGNvZGV7Tm9TdWNoTWV0aG9kRXJyb3J9IGlzIHRocm93bi4gCiUgXGl0ZW0gT3RoZXJ3aXNlLCB0aGUgYXNzaWdubWVudCBpcyBlcXVpdmFsZW50IHRvIHRoZSBhc3NpZ25tZW50IFxjb2RleyBcVEhJU3t9LiR2JCA9ICRlJH0uIAolIFxlbmR7aXRlbWl6ZX0KIAolT3RoZXJ3aXNlLCAgCgpMZXQgJGQkIGJlIHRoZSBpbm5lcm1vc3QgZGVjbGFyYXRpb24gd2hvc2UgbmFtZSBpcyAkdiQgb3IgJHY9JCwgaWYgaXQgZXhpc3RzLgoKSWYgJGQkIGlzIHRoZSBkZWNsYXJhdGlvbiBvZiBhIGxvY2FsIHZhcmlhYmxlLCB0aGUgZXhwcmVzc2lvbiAkZSQgaXMgZXZhbHVhdGVkIHRvIGFuIG9iamVjdCAkbyQuIFRoZW4sIHRoZSB2YXJpYWJsZSAkdiQgaXMgYm91bmQgdG8gJG8kIHVubGVzcyAkdiQgaXMgXEZJTkFMe30gb3IgXENPTlNUe30sIGluIHdoaWNoIGNhc2UgYSBkeW5hbWljIGVycm9yIG9jY3Vycy4KSWYgbm8gZXJyb3Igb2NjdXJzLCB0aGUgdmFsdWUgb2YgdGhlIGFzc2lnbm1lbnQgZXhwcmVzc2lvbiBpcyAkbyQuICAKCklmICRkJCBpcyB0aGUgZGVjbGFyYXRpb24gb2YgYSBsaWJyYXJ5IHZhcmlhYmxlLCB0b3AgbGV2ZWwgZ2V0dGVyIG9yIHRvcCBsZXZlbCBzZXR0ZXIsIHRoZSBleHByZXNzaW9uICRlJCBpcyBldmFsdWF0ZWQgdG8gYW4gb2JqZWN0ICRvJC4gVGhlbiB0aGUgc2V0dGVyICR2PSQgaXMgaW52b2tlZCB3aXRoIGl0cyBmb3JtYWwgcGFyYW1ldGVyIGJvdW5kIHRvICRvJC4gVGhlIHZhbHVlIG9mIHRoZSBhc3NpZ25tZW50IGV4cHJlc3Npb24gaXMgJG8kLiAgCgpPdGhlcndpc2UsIGlmICRkJCBpcyB0aGUgZGVjbGFyYXRpb24gb2YgYSBzdGF0aWMgdmFyaWFibGUsIHN0YXRpYyBnZXR0ZXIgb3Igc3RhdGljIHNldHRlciBpbiBjbGFzcyAkQyQsIHRoZW4gdGhlIGFzc2lnbm1lbnQgaXMgZXF1aXZhbGVudCB0byB0aGUgYXNzaWdubWVudCBcY29kZXskQy52JCA9ICRlJH0uCgpPdGhlcndpc2UsIElmICAkYSQgb2NjdXJzIGluc2lkZSBhIHRvcCBsZXZlbCBvciBzdGF0aWMgZnVuY3Rpb24gKGJlIGl0IGZ1bmN0aW9uLCBtZXRob2QsIGdldHRlciwgIG9yIHNldHRlcikgb3IgdmFyaWFibGUgaW5pdGlhbGl6ZXIsIGV2YWx1YXRpb24gb2YgJGEkIGNhdXNlcyAkZSQgdG8gYmUgZXZhbHVhdGVkLCBhZnRlciB3aGljaCBhIFxjb2Rle05vU3VjaE1ldGhvZEVycm9yfSBpcyB0aHJvd24uIAoKT3RoZXJ3aXNlLCB0aGUgYXNzaWdubWVudCBpcyBlcXVpdmFsZW50IHRvIHRoZSBhc3NpZ25tZW50IFxjb2RleyBcVEhJU3t9LiR2JCA9ICRlJH0uIAoKSW4gY2hlY2tlZCBtb2RlLCBpdCBpcyBhIGR5bmFtaWMgdHlwZSBlcnJvciBpZiAkbyQgaXMgbm90IFxOVUxMe30gYW5kIHRoZSBpbnRlcmZhY2Ugb2YgdGhlIGNsYXNzIG9mICRvJCBpcyBub3QgYSBzdWJ0eXBlIG9mIHRoZSBhY3R1YWwgdHlwZSAoXHJlZnthY3R1YWxUeXBlT2ZBRGVjbGFyYXRpb259KSBvZiAkdiQuCgpJdCBpcyBhIHN0YXRpYyB0eXBlIHdhcm5pbmcgaWYgdGhlIHN0YXRpYyB0eXBlIG9mICRlJCBtYXkgbm90IGJlIGFzc2lnbmVkIHRvIHRoZSBzdGF0aWMgdHlwZSBvZiAkdiQuIFRoZSBzdGF0aWMgdHlwZSBvZiB0aGUgZXhwcmVzc2lvbiAkdiQgXGNvZGV7PX0gJGUkIGlzIHRoZSBzdGF0aWMgdHlwZSBvZiAkZSQuCgpFdmFsdWF0aW9uIG9mIGFuIGFzc2lnbm1lbnQgb2YgdGhlIGZvcm0gJEMudiQgXGNvZGV7PX0gJGUkIHByb2NlZWRzIGFzIGZvbGxvd3M6CgpJZiAkQyQgZG9lcyBub3QgZGVub3RlIGEgY2xhc3MgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IHNjb3BlLCB0aGUgYXNzaWdubWVudCBpcyB0cmVhdGVkIGFzIGFuIGFzc2lnbm1lbnQgICRlXzEudj0gZSQsIHdoZXJlICRlXzEkIGlzIHRoZSBleHByZXNzaW9uICRDJC4gT3RoZXJ3aXNlLCAKdGhlIGV4cHJlc3Npb24gJGUkIGlzIGV2YWx1YXRlZCB0byBhbiBvYmplY3QgJG8kLiAgCklmIAoldGhlcmUgaXMgbm8gY2xhc3MgJEMkIGluIHRoZSBlbmNsb3NpbmcgbGV4aWNhbCBzY29wZSBvZiB0aGUgYXNzaWdubWVudCwgb3IgaWYgCiRDJCBkb2VzIG5vdCBkZWNsYXJlLCBpbXBsaWNpdGx5IG9yIGV4cGxpY2l0bHksIGEgc2V0dGVyICR2PSQsIHRoZW4gYSBcY29kZXtOb1N1Y2hNZXRob2RFcnJvcn0gaXMgdGhyb3duLiBPdGhlcndpc2UsIHRoZSBzZXR0ZXIgJEMudj0kIGlzIGludm9rZWQgd2l0aCBpdHMgZm9ybWFsIHBhcmFtZXRlciBib3VuZCB0byAkbyQuIFRoZSB2YWx1ZSBvZiB0aGUgYXNzaWdubWVudCBleHByZXNzaW9uIGlzICRvJC4gCgpJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmIAolIHRoZXJlIGlzIG5vIGNsYXNzICRDJCBpbiB0aGUgZW5jbG9zaW5nIGxleGljYWwgc2NvcGUgb2YgdGhlIGFzc2lnbm1lbnQsIG9yIGlmIAokQyQgZG9lcyBub3QgZGVjbGFyZSwgaW1wbGljaXRseSBvciBleHBsaWNpdGx5LCBhIHNldHRlciAkdj0kLgoKJVxjb21tZW50YXJ5e0FzIG9mIHRoaXMgd3JpdGluZywgaW1wbGVtZW50YXRpb25zIHRyZWF0IHRoZSBhYm92ZSBzaXR1YXRpb24gYXMgYSBjb21waWxlLXRpbWUgZXJyb3IufQoKSW4gY2hlY2tlZCBtb2RlLCBpdCBpcyBhIGR5bmFtaWMgdHlwZSBlcnJvciBpZiAkbyQgaXMgbm90IFxOVUxMe30gYW5kIHRoZSBpbnRlcmZhY2Ugb2YgdGhlIGNsYXNzIG9mICRvJCBpcyBub3QgYSBzdWJ0eXBlIG9mIHRoZSBkZWNsYXJlZCBzdGF0aWMgdHlwZSBvZiAkQy52JC4KCkl0IGlzIGEgc3RhdGljIHR5cGUgd2FybmluZyBpZiB0aGUgc3RhdGljIHR5cGUgb2YgJGUkIG1heSBub3QgYmUgYXNzaWduZWQgdG8gdGhlIHN0YXRpYyB0eXBlIG9mICRDLnYkLiAgVGhlIHN0YXRpYyB0eXBlIG9mIHRoZSBleHByZXNzaW9uICRDLnYkIFxjb2Rlez19ICRlJCBpcyB0aGUgc3RhdGljIHR5cGUgb2YgJGUkLgoKRXZhbHVhdGlvbiBvZiBhbiBhc3NpZ25tZW50IG9mIHRoZSBmb3JtICRlXzEudiQgXGNvZGV7PX0gJGVfMiQgcHJvY2VlZHMgYXMgZm9sbG93czoKClRoZSBleHByZXNzaW9uICRlXzEkIGlzIGV2YWx1YXRlZCB0byBhbiBvYmplY3QgJG9fMSQuIFRoZW4sIHRoZSBleHByZXNzaW9uICRlXzIkICBpcyBldmFsdWF0ZWQgdG8gYW4gb2JqZWN0ICRvXzIkLiBUaGVuLCB0aGUgc2V0dGVyICR2PSQgaXMgbG9va2VkIHVwIChccmVme2dldHRlckFuZFNldHRlckxvb2t1cH0pIGluICRvXzEkIHdpdGggcmVzcGVjdCB0byB0aGUgY3VycmVudCBsaWJyYXJ5LCBhbmQgaXRzIGJvZHkgaXMgZXhlY3V0ZWQgd2l0aCBpdHMgZm9ybWFsIHBhcmFtZXRlciBib3VuZCB0byAkb18yJCBhbmQgXFRISVN7fSBib3VuZCB0byAkb18xJC4gCgpJZiB0aGUgc2V0dGVyIGxvb2t1cCBoYXMgZmFpbGVkLCB0aGVuIGEgbmV3IGluc3RhbmNlICRpbSQgIG9mIHRoZSBwcmVkZWZpbmVkIGNsYXNzICBcY29kZXtJbnZvY2F0aW9ufSAgaXMgY3JlYXRlZCwgc3VjaCB0aGF0IDoKXGJlZ2lue2l0ZW1pemV9ClxpdGVtICBcY29kZXtpbS5pc1NldHRlcn0gZXZhbHVhdGVzIHRvIFxjb2Rle1xUUlVFe319LgpcaXRlbSAgXGNvZGV7aW0ubWVtYmVyTmFtZX0gZXZhbHVhdGVzIHRvIFxjb2Rleyd2PSd9LgpcaXRlbSBcY29kZXtpbS5wb3NpdGlvbmFsQXJndW1lbnRzfSBldmFsdWF0ZXMgdG8gYW4gaW1tdXRhYmxlIGxpc3Qgd2l0aCB0aGUgc2FtZSB2YWx1ZXMgYXMgXGNvZGV7WyRvXzIkXX0uClxpdGVtIFxjb2Rle2ltLm5hbWVkQXJndW1lbnRzfSBldmFsdWF0ZXMgdG8gdGhlIHZhbHVlIG9mIFxjb2Rle1xDT05TVHt9IFx7XH19LgpcZW5ke2l0ZW1pemV9CgpUaGVuIHRoZSBtZXRob2QgXGNvZGV7bm9TdWNoTWV0aG9kKCl9IGlzIGxvb2tlZCB1cCBpbiAkb18xJCBhbmQgaW52b2tlZCAgd2l0aCBhcmd1bWVudCAkaW0kLiBUaGUgdmFsdWUgb2YgdGhlIGFzc2lnbm1lbnQgZXhwcmVzc2lvbiBpcyAkb18yJCBpcnJlc3BlY3RpdmUgb2Ygd2hldGhlciBzZXR0ZXIgbG9va3VwIGhhcyBmYWlsZWQgb3Igc3VjY2VlZGVkLgoKRXZhbHVhdGlvbiBvZiBhbiBhc3NpZ25tZW50IG9mIHRoZSBmb3JtICRwLnYgXGNvZGV7PX0gZSQsIHdoZXJlICRwJCBpcyBhIGRlZmVycmVkIHByZWZpeCwgcHJvY2VlZHMgYXMgZm9sbG93czoKCklmICRwJCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgbG9hZGVkLCB0aGUgYXNzaWdubWVudCBpcyBldmFsdWF0ZWQgZXhhY3RseSBsaWtlIHRoZSBhc3NpZ25tZW50ICR3IFxjb2Rlez19IGUkLCB3aGVyZSAkdyQgZGVub3RlcyB0aGUgdG9wIGxldmVsIG1lbWJlciBuYW1lZCAkdiQgb2YgdGhlIGxpYnJhcnkgcmVwcmVzZW50ZWQgYnkgJHAkLiBPdGhlcndpc2UsICRlJCBpcyBldmFsdWF0ZWQgYW5kIHRoZW4gYSBcY29kZXtOb1N1Y2hNZXRob2RFcnJvcn0gaXMgdGhyb3duLgoKRXZhbHVhdGlvbiBvZiBhbiBhc3NpZ25tZW50IG9mIHRoZSBmb3JtICRwLkMudiBcY29kZXs9fSBlJCwgd2hlcmUgJHAkIGlzIGEgZGVmZXJyZWQgcHJlZml4LCBwcm9jZWVkcyBhcyBmb2xsb3dzOgoKSWYgJHAkIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBsb2FkZWQsIHRoZSBhc3NpZ25tZW50IGlzIGV2YWx1YXRlZCBleGFjdGx5IGxpa2UgdGhlIGFzc2lnbm1lbnQgJEsudiA9IGUkLCB3aGVyZSAkSyQgZGVub3RlcyB0aGUgdG9wIGxldmVsIG1lbWJlciAkQyQgb2YgdGhlIGxpYnJhcnkgcmVwcmVzZW50ZWQgYnkgJHAkLiBPdGhlcndpc2UgJGUkIGlzIGV2YWx1YXRlZCBhbmQgdGhlbiBhIFxjb2Rle05vU3VjaE1ldGhvZEVycm9yfSBpcyB0aHJvd24uCgpJbiBjaGVja2VkIG1vZGUsIGl0IGlzIGEgZHluYW1pYyB0eXBlIGVycm9yIGlmICRvXzIkIGlzIG5vdCBcTlVMTHt9IGFuZCB0aGUgaW50ZXJmYWNlIG9mIHRoZSBjbGFzcyBvZiAkb18yJCBpcyBub3QgYSBzdWJ0eXBlIG9mIHRoZSBhY3R1YWwgdHlwZSBvZiAkZV8xLnYkLgoKTGV0ICRUJCBiZSB0aGUgc3RhdGljIHR5cGUgb2YgJGVfMSQuIEl0IGlzIGEgc3RhdGljIHR5cGUgd2FybmluZyBpZiAkVCQgZG9lcyBub3QgaGF2ZSBhbiBhY2Nlc3NpYmxlIGluc3RhbmNlIHNldHRlciBuYW1lZCAkdj0kIHVubGVzcyAkVCQgb3IgYSBzdXBlcmludGVyZmFjZSBvZiAkVCQgaXMgYW5ub3RhdGVkIHdpdGggYW4gYW5ub3RhdGlvbiBkZW5vdGluZyBhIGNvbnN0YW50IGlkZW50aWNhbCB0byB0aGUgY29uc3RhbnQgXGNvZGV7QHByb3h5fSBkZWZpbmVkIGluIFxjb2Rle2RhcnQ6Y29yZX0uIEl0IGlzIGEgc3RhdGljIHR5cGUgd2FybmluZyBpZiB0aGUgc3RhdGljIHR5cGUgb2YgJGVfMiQgbWF5IG5vdCBiZSBhc3NpZ25lZCB0byAkVCQuICAgVGhlIHN0YXRpYyB0eXBlIG9mIHRoZSBleHByZXNzaW9uICRlXzF2JCBcY29kZXs9fSAkZV8yJCBpcyB0aGUgc3RhdGljIHR5cGUgb2YgJGVfMiQuCgpFdmFsdWF0aW9uIG9mIGFuIGFzc2lnbm1lbnQgb2YgdGhlIGZvcm0gJGVfMVtlXzJdJCBcY29kZXs9fSAkZV8zJCBpcyBlcXVpdmFsZW50IHRvIHRoZSBldmFsdWF0aW9uIG9mIHRoZSBleHByZXNzaW9uIFxjb2RleyhhLCBpLCBlKVx7YS5bXT0oaSwgZSk7IFxSRVRVUk57fSBlOyBcfSAoJGVfMSwgZV8yLCBlXzMkKX0uICBUaGUgc3RhdGljIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24gJGVfMVtlXzJdJCBcY29kZXs9fSAkZV8zJCBpcyB0aGUgc3RhdGljIHR5cGUgb2YgJGVfMyQuCgolIFNob3VsZCB3ZSBhZGQ6IEl0IGlzIGEgZHluYW1pYyBlcnJvciBpZiAkZV8xJCBldmFsdWF0ZXMgdG8gYW4gIGNvbnN0YW50IGxpc3Qgb3IgbWFwLgoKSXQgaXMgYXMgc3RhdGljIHdhcm5pbmcgaWYgYW4gYXNzaWdubWVudCBvZiB0aGUgZm9ybSAkdiA9IGUkIG9jY3VycyBpbnNpZGUgYSB0b3AgbGV2ZWwgb3Igc3RhdGljIGZ1bmN0aW9uIChiZSBpdCBmdW5jdGlvbiwgbWV0aG9kLCBnZXR0ZXIsIG9yIHNldHRlcikgb3IgdmFyaWFibGUgaW5pdGlhbGl6ZXIgYW5kIHRoZXJlIGlzIG5laXRoZXIgYSBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbiB3aXRoIG5hbWUgJHYkICBub3Igc2V0dGVyIGRlY2xhcmF0aW9uIHdpdGggbmFtZSAkdj0kIGluIHRoZSBsZXhpY2FsIHNjb3BlIGVuY2xvc2luZyB0aGUgYXNzaWdubWVudC4KCgoKXHN1YnN1YnNlY3Rpb257Q29tcG91bmQgQXNzaWdubWVudH0KXGxhYmVse2NvbXBvdW5kQXNzaWdubWVudH0KCkEgY29tcG91bmQgYXNzaWdubWVudCBvZiB0aGUgZm9ybSAkdiQgJG9wXGNvZGV7PX0gZSQgaXMgZXF1aXZhbGVudCB0byAkdiBcY29kZXs9fSB2JCAkb3AkICRlJC4gQSBjb21wb3VuZCBhc3NpZ25tZW50IG9mIHRoZSBmb3JtICRDLnYkICRvcCBcY29kZXs9fSBlJCBpcyBlcXVpdmFsZW50IHRvICRDLnYgXGNvZGV7PX0gQy52JCAkb3AkICRlJC4gQSBjb21wb3VuZCBhc3NpZ25tZW50IG9mIHRoZSBmb3JtICRlXzEudiQgJG9wID0gZV8yJCBpcyBlcXVpdmFsZW50IHRvIFxjb2RleygoeCkgJD0+JCB4LnYgPSB4LnYgJG9wJCAkZV8yJCkoJGVfMSQpfSB3aGVyZSAkeCQgaXMgYSB2YXJpYWJsZSB0aGF0IGlzIG5vdCB1c2VkIGluICRlXzIkLiBBIGNvbXBvdW5kIGFzc2lnbm1lbnQgb2YgdGhlIGZvcm0gICRlXzFbZV8yXSQgJG9wXGNvZGV7PX0gZV8zJCBpcyBlcXVpdmFsZW50IHRvIApcY29kZXsoKGEsIGkpICQ9PiQgYVtpXSA9IGFbaV0gJG9wJCAkZV8zJCkoJGVfMSwgZV8yJCl9IHdoZXJlICRhJCBhbmQgJGkkIGFyZSBhIHZhcmlhYmxlcyB0aGF0IGFyZSBub3QgdXNlZCBpbiAkZV8zJC4gQSBjb21wb3VuZCBhc3NpZ25tZW50IG9mIHRoZSBmb3JtICRwLnYkICRvcFxjb2Rlez19IGUkLCB3aGVyZSAkcCQgaXMgYSBkZWZlcnJlZCBwcmVmaXgsICBpcyBlcXVpdmFsZW50IHRvICRwLnYgXGNvZGV7PX0gcC52JCAkb3AkICRlJC4gQSBjb21wb3VuZCBhc3NpZ25tZW50IG9mIHRoZSBmb3JtICRwLkMudiQgJG9wXGNvZGV7PX0gZSQsIHdoZXJlICRwJCBpcyBhIGRlZmVycmVkIHByZWZpeCwgIGlzIGVxdWl2YWxlbnQgdG8gJHAuQy52IFxjb2Rlez19IHAuQy52JCAkb3AkICRlJC4KCgpcYmVnaW57Z3JhbW1hcn0Ke1xiZiBjb21wb3VuZEFzc2lnbm1lbnRPcGVyYXRvcjp9YCo9JzsKICAgICAgYC89JzsKICAgICAgYFx+e30vPSc7CiAgICAgIGBcJT0nOwogICAgICBgKz0nOwogICAgICBgLT0nOwogICAgICBge1xlc2NhcGVncmFtbWFyIFxsdCBcbHR9PSc7CiAgICAgICBge1xlc2NhcGVncmFtbWFyIFxndCBcZ3R9PSc7CiAgICAgIGBcJj0nOwogICAgICBgXF57fT0nOwogICAgICBgJHwkPScKICAgIC4KXGVuZHtncmFtbWFyfQoKICAgIApcc3Vic2VjdGlvbnsgQ29uZGl0aW9uYWx9ClxsYWJlbHtjb25kaXRpb25hbH0KCkEge1xlbSBjb25kaXRpb25hbCBleHByZXNzaW9ufSBldmFsdWF0ZXMgb25lIG9mIHR3byBleHByZXNzaW9ucyBiYXNlZCBvbiBhIGJvb2xlYW4gY29uZGl0aW9uLgoKXGJlZ2lue2dyYW1tYXJ9CiAge1xiZiBjb25kaXRpb25hbEV4cHJlc3Npb246fQogICAgIGxvZ2ljYWxPckV4cHJlc3Npb24gKGA/JyBleHByZXNzaW9uV2l0aG91dENhc2NhZGUgYHtcZXNjYXBlZ3JhbW1hciA6fScgZXhwcmVzc2lvbldpdGhvdXRDYXNjYWRlKT8KICAgIC4gJSB0aGUgZmlyc3QgIGJyYW5jaGVzIGNvdWxkICB0b3AgbGV2ZWwgZXhwcmVzc2lvbnMsIGl0IHNlZW1zLCBidXQgY2VydGFpbmx5IE5PVCB0aGUgc2Vjb25kClxlbmR7Z3JhbW1hcn0KCkV2YWx1YXRpb24gb2YgYSBjb25kaXRpb25hbCBleHByZXNzaW9uICRjJCBvZiB0aGUgZm9ybSAkZV8xID8gZV8yIDogZV8zJCBwcm9jZWVkcyBhcyBmb2xsb3dzOgoKRmlyc3QsICRlXzEkIGlzIGV2YWx1YXRlZCB0byBhbiBvYmplY3QgJG9fMSQuICBUaGVuLCAkb18xJCBpcyAgc3ViamVjdGVkIHRvIGJvb2xlYW4gY29udmVyc2lvbiAoXHJlZntib29sZWFuQ29udmVyc2lvbn0pIHByb2R1Y2luZyBhbiBvYmplY3QgJHIkLiAgSWYgJHIkIGlzIHRydWUsIHRoZW4gdGhlIHZhbHVlIG9mICRjJCBpcyB0aGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb24gJGVfMiQuIE90aGVyd2lzZSB0aGUgdmFsdWUgb2YgJGMkIGlzIHRoZSByZXN1bHQgb2YgZXZhbHVhdGluZyB0aGUgZXhwcmVzc2lvbiAkZV8zJC4gCgpJZiBhbGwgb2YgdGhlIGZvbGxvd2luZyBob2xkOgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gJGVfMSQgc2hvd3MgdGhhdCBhIHZhcmlhYmxlICR2JCBoYXMgdHlwZSAkVCQuClxpdGVtICR2JCBpcyBub3QgcG90ZW50aWFsbHkgbXV0YXRlZCBpbiAkZV8yJCBvciB3aXRoaW4gYSBjbG9zdXJlLgpcaXRlbSBJZiB0aGUgdmFyaWFibGUgJHYkIGlzIGFjY2Vzc2VkIGJ5IGEgY2xvc3VyZSBpbiAkZV8yJCB0aGVuIHRoZSB2YXJpYWJsZSAkdiQgaXMgbm90IHBvdGVudGlhbGx5IG11dGF0ZWQgYW55d2hlcmUgaW4gdGhlIHNjb3BlIG9mICR2JC4KXGVuZHtpdGVtaXplfQoKdGhlbiB0aGUgdHlwZSBvZiAkdiQgaXMga25vd24gdG8gYmUgJFQkIGluICRlXzIkLgoKCiBJdCBpcyBhIHN0YXRpYyB0eXBlIHdhcm5pbmcgaWYgdGhlIHN0YXRpYyB0eXBlIG9mICRlXzEkIG1heSBub3QgYmUgYXNzaWduZWQgdG8gXGNvZGV7Ym9vbH0uICBUaGUgc3RhdGljIHR5cGUgb2YgJGMkIGlzIHRoZSBsZWFzdCB1cHBlciBib3VuZCAoXHJlZntsZWFzdFVwcGVyQm91bmRzfSkgb2YgdGhlIHN0YXRpYyB0eXBlIG9mICRlXzIkIGFuZCB0aGUgc3RhdGljIHR5cGUgb2YgJGVfMyQuCiAgCgpcc3Vic2VjdGlvbnsgTG9naWNhbCBCb29sZWFuIEV4cHJlc3Npb25zfQpcbGFiZWx7bG9naWNhbEJvb2xlYW5FeHByZXNzaW9uc30KClRoZSBsb2dpY2FsIGJvb2xlYW4gZXhwcmVzc2lvbnMgY29tYmluZSBib29sZWFuIG9iamVjdHMgdXNpbmcgdGhlIGJvb2xlYW4gY29uanVuY3Rpb24gYW5kIGRpc2p1bmN0aW9uIG9wZXJhdG9ycy4KClxiZWdpbntncmFtbWFyfQp7XGJmIGxvZ2ljYWxPckV4cHJlc3Npb246fQogICAgICBsb2dpY2FsQW5kRXhwcmVzc2lvbiAoYCR8fCQnIGxvZ2ljYWxBbmRFeHByZXNzaW9uKSoKICAgIC4KCgp7XGJmIGxvZ2ljYWxBbmRFeHByZXNzaW9uOn0KICAgICAgZXF1YWxpdHlFeHByZXNzaW9uIChgXCZcJicgZXF1YWxpdHlFeHByZXNzaW9uKSoKJSAgICAgIGJpdHdpc2VPckV4cHJlc3Npb24gKGBcJlwmJyBiaXR3aXNlT3JFeHByZXNzaW9uKSoKICAgIC4KIFxlbmR7Z3JhbW1hcn0KIApBIHtcZW0gbG9naWNhbCBib29sZWFuIGV4cHJlc3Npb259IGlzIGVpdGhlciBhbiBlcXVhbGl0eSBleHByZXNzaW9uIChccmVme2VxdWFsaXR5fSksIG9yIGFuIGludm9jYXRpb24gb2YgYSBsb2dpY2FsIGJvb2xlYW4gb3BlcmF0b3Igb24gYW4gZXhwcmVzc2lvbiAkZV8xJCB3aXRoIGFyZ3VtZW50ICRlXzIkLgogCkV2YWx1YXRpb24gb2YgYSBsb2dpY2FsIGJvb2xlYW4gZXhwcmVzc2lvbiAkYiQgb2YgdGhlIGZvcm0gJGVfMSB8fCBlXzIkIGNhdXNlcyB0aGUgZXZhbHVhdGlvbiBvZiAkZV8xJCB3aGljaCBpcyB0aGVuICBzdWJqZWN0ZWQgdG8gYm9vbGVhbiBjb252ZXJzaW9uLCB5aWVsZGluZyBhbiBvYmplY3QgJG9fMSQ7IGlmICRvXzEkIGlzIHRydWUsIHRoZSByZXN1bHQgb2YgZXZhbHVhdGluZyAkYiQgaXMgdHJ1ZSwgb3RoZXJ3aXNlICRlXzIkIGlzIGV2YWx1YXRlZCB0byBhbiBvYmplY3QgJG9fMiQsIHdoaWNoIGlzIHRoZW4gc3ViamVjdGVkIHRvIGJvb2xlYW4gY29udmVyc2lvbiAoXHJlZntib29sZWFuQ29udmVyc2lvbn0pIHByb2R1Y2luZyBhbiBvYmplY3QgJHIkLCB3aGljaCBpcyB0aGUgdmFsdWUgb2YgJGIkLiAKCkV2YWx1YXRpb24gb2YgYSBsb2dpY2FsIGJvb2xlYW4gZXhwcmVzc2lvbiAkYiQgb2YgdGhlIGZvcm0gJGVfMSBcJlwmIGVfMiQgY2F1c2VzIHRoZSBldmFsdWF0aW9uIG9mICRlXzEkIHdoaWNoIGlzIHRoZW4gc3ViamVjdGVkIHRvIGJvb2xlYW4gY29udmVyc2lvbiwgeWllbGRpbmcgYW4gb2JqZWN0ICRvXzEkOyBpZiAkb18xJCBpcyBub3QgIHRydWUsIHRoZSByZXN1bHQgb2YgZXZhbHVhdGluZyAkYiQgaXMgZmFsc2UsIG90aGVyd2lzZSAkZV8yJCBpcyBldmFsdWF0ZWQgdG8gYW4gb2JqZWN0ICRvXzIkLCB3aGljaCBpcyB0aGVuIHN1YmplY3RlZCB0byBib29sZWFuIGNvbnZlcnNpb24gcHJvZHVjaW5nIGFuIG9iamVjdCAkciQsIHdoaWNoIGlzIHRoZSB2YWx1ZSBvZiAkYiQuIAoKQSBsb2dpY2FsIGJvb2xlYW4gZXhwcmVzc2lvbiAkYiQgb2YgdGhlIGZvcm0gJGVfMSBcJlwmIGVfMiQgc2hvd3MgdGhhdCBhIHZhcmlhYmxlICR2JCBoYXMgdHlwZSAKJFQkIGlmIGFsbCBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaG9sZDoKXGJlZ2lue2l0ZW1pemV9ClxpdGVtIEVpdGhlciAkZV8xJCBzaG93cyB0aGF0ICR2JCBoYXMgdHlwZSAkVCQgb3IgJGVfMiQgc2hvd3MgdGhhdCAkdiQgaGFzIHR5cGUgJFQkLgpcaXRlbSAkdiQgaXMgYSBsb2NhbCB2YXJpYWJsZSBvciBmb3JtYWwgcGFyYW1ldGVyLgpcaXRlbSBUaGUgdmFyaWFibGUgJHYkIGlzIG5vdCBtdXRhdGVkIGluICRlXzIkIG9yIHdpdGhpbiBhIGNsb3N1cmUuClxlbmR7aXRlbWl6ZX0KCkZ1cnRoZXJtb3JlLCBpZiBhbGwgb2YgdGhlIGZvbGxvd2luZyBob2xkOgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gJGVfMSQgc2hvd3MgdGhhdCAkdiQgaGFzIHR5cGUgJFQkLgpcaXRlbSAkdiQgaXMgbm90IG11dGF0ZWQgaW4gZWl0aGVyICRlXzEkLCAkZV8yJCBvciB3aXRoaW4gYSBjbG9zdXJlLgpcaXRlbSBJZiB0aGUgdmFyaWFibGUgJHYkIGlzIGFjY2Vzc2VkIGJ5IGEgY2xvc3VyZSBpbiAkZV8yJCB0aGVuIHRoZSB2YXJpYWJsZSAkdiQgaXMgbm90IHBvdGVudGlhbGx5IG11dGF0ZWQgYW55d2hlcmUgaW4gdGhlIHNjb3BlIG9mICR2JC4gClxlbmR7aXRlbWl6ZX0KdGhlbiB0aGUgdHlwZSBvZiAkdiQgaXMga25vd24gdG8gYmUgJFQkIGluICRlXzIkLgoKSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiB0aGUgc3RhdGljIHR5cGUgb2YgJGVfMSQgbWF5IG5vdCBiZSBhc3NpZ25lZCB0byBcY2R7Ym9vbH0gb3IgaWYgdGhlIHN0YXRpYyB0eXBlIG9mICRlXzIkIG1heSBub3QgYmUgYXNzaWduZWQgdG8gXGNke2Jvb2x9LiBUaGUgc3RhdGljIHR5cGUgb2YgYSBsb2dpY2FsIGJvb2xlYW4gZXhwcmVzc2lvbiBpcyBcY29kZXtib29sfS4KCiAgICAgCiBcc3Vic2VjdGlvbnsgRXF1YWxpdHl9CiBcbGFiZWx7ZXF1YWxpdHl9CiAKRXF1YWxpdHkgZXhwcmVzc2lvbnMgdGVzdCBvYmplY3RzIGZvciBlcXVhbGl0eS4KCiBcYmVnaW57Z3JhbW1hcn0Ke1xiZiBlcXVhbGl0eUV4cHJlc3Npb246fXJlbGF0aW9uYWxFeHByZXNzaW9uIChlcXVhbGl0eU9wZXJhdG9yIHJlbGF0aW9uYWxFeHByZXNzaW9uKT87CiAgICAgIFxTVVBFUnt9IGVxdWFsaXR5T3BlcmF0b3IgcmVsYXRpb25hbEV4cHJlc3Npb24KICAgIC4KCntcYmYgZXF1YWxpdHlPcGVyYXRvcjp9YD09JzsKICAgICAgYCE9JwogICAgLgogXGVuZHtncmFtbWFyfQogCkFuIHtcZW0gZXF1YWxpdHkgZXhwcmVzc2lvbn0gaXMgZWl0aGVyIGEgcmVsYXRpb25hbCBleHByZXNzaW9uIChccmVme3JlbGF0aW9uYWxFeHByZXNzaW9uc30pLCBvciBhbiBpbnZvY2F0aW9uIG9mIGFuIGVxdWFsaXR5IG9wZXJhdG9yIG9uIGVpdGhlciBcU1VQRVJ7fSBvciBhbiBleHByZXNzaW9uICRlXzEkLCB3aXRoIGFyZ3VtZW50ICRlXzIkLgoKCkV2YWx1YXRpb24gb2YgYW4gZXF1YWxpdHkgZXhwcmVzc2lvbiAkZWUkIG9mIHRoZSBmb3JtIFxjb2RleyRlXzEkID09ICRlXzIkfSBwcm9jZWVkcyBhcyBmb2xsb3dzOgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gVGhlIGV4cHJlc3Npb24gJGVfMSQgaXMgZXZhbHVhdGVkIHRvIGFuIG9iamVjdCAkb18xJC4KXGl0ZW0gVGhlIGV4cHJlc3Npb24gJGVfMiQgaXMgZXZhbHVhdGVkIHRvIGFuIG9iamVjdCAkb18yJC4KXGl0ZW0gSWYgZWl0aGVyICRvXzEkIG9yICRvXzIkIGlzIFxOVUxMe30sIHRoZW4gJGVlJCBldmFsdWF0ZXMgdG8gXGNvZGV7aWRlbnRpY2FsKCRvXzEkLCAkb18yJCl9LiAgT3RoZXJ3aXNlLApcaXRlbSAkZWUkIGlzIGVxdWl2YWxlbnQgdG8gdGhlIG1ldGhvZCBpbnZvY2F0aW9uIFxjb2RleyRvXzEkLj09KCRvXzIkKX0uClxlbmR7aXRlbWl6ZX0KCgpFdmFsdWF0aW9uIG9mIGFuIGVxdWFsaXR5IGV4cHJlc3Npb24gJGVlJCBvZiB0aGUgZm9ybSBcY29kZXtcU1VQRVJ7fSA9PSAkZSR9IHByb2NlZWRzIGFzIGZvbGxvd3M6ClxiZWdpbntpdGVtaXplfQpcaXRlbSBUaGUgZXhwcmVzc2lvbiAkZSQgaXMgZXZhbHVhdGVkIHRvIGFuIG9iamVjdCAkbyQuClxpdGVtIElmIGVpdGhlciBcVEhJU3t9IG9yICRvJCBpcyBcTlVMTHt9LCB0aGVuICRlZSQgZXZhbHVhdGVzIHRvIFxjb2Rle2lkZW50aWNhbChcVEhJU3t9LCAkbyQpfS4gT3RoZXJ3aXNlLApcaXRlbSAkZWUkIGlzIGVxdWl2YWxlbnQgdG8gdGhlIG1ldGhvZCBpbnZvY2F0aW9uIFxjb2Rle1xTVVBFUnt9Lj09KCRvJCl9LgpcZW5ke2l0ZW1pemV9CgpcY29tbWVudGFyeXtBcyBhIHJlc3VsdCBvZiB0aGUgYWJvdmUgZGVmaW5pdGlvbiwgdXNlciBkZWZpbmVkIFxjb2Rlez09fSBtZXRob2RzIGNhbiBhc3N1bWUgdGhhdCB0aGVpciBhcmd1bWVudCBpcyBub24tbnVsbCwgYW5kIGF2b2lkIHRoZSBzdGFuZGFyZCBib2lsZXItcGxhdGUgcHJlbHVkZToKIAogXGNvZGV7aWYgKGlkZW50aWNhbChcTlVMTHt9LCBhcmcpKSByZXR1cm4gXEZBTFNFe307fQoKQW5vdGhlciBpbXBsaWNhdGlvbiBpcyB0aGF0IHRoZXJlIGlzIG5ldmVyIGEgbmVlZCB0byB1c2UgXGNvZGV7aWRlbnRpY2FsKCl9IHRvIHRlc3QgYWdhaW5zdCBcTlVMTHt9LCBub3Igc2hvdWxkIGFueW9uZSBldmVyIHdvcnJ5IGFib3V0IHdoZXRoZXIgdG8gd3JpdGUgXE5VTEx7fSA9PSAkZSQgb3IgJGUkID09IFxOVUxMe30uIAp9CgpBbiBlcXVhbGl0eSBleHByZXNzaW9uIG9mIHRoZSBmb3JtIFxjb2RleyRlXzEkICE9ICRlXzIkfSAgaXMgZXF1aXZhbGVudCB0byB0aGUgZXhwcmVzc2lvbiBcY29kZXshKCRlXzEkID09ICRlXzIkKX0uIEFuIGVxdWFsaXR5IGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gXGNvZGV7XFNVUEVSe30gIT0gJGUkfSBpcyBlcXVpdmFsZW50IHRvIHRoZSBleHByZXNzaW9uIFxjb2RleyEoXFNVUEVSe30gPT0gJGUkKX0uCgoKIAogJVRoZSBleHByZXNzaW9uICRlXzEkIGlzIGV2YWx1YXRlZCB0byBhbiBvYmplY3QgJG9fMSQ7IHRoZW4gdGhlIGV4cHJlc3Npb24gJGVfMiQgaXMgZXZhbHVhdGVkIHRvIGFuIG9iamVjdCAkb18yJC4gIE5leHQsIGlmICRvXzEkIGFuZCAkb18yJCBhcmUgdGhlIHNhbWUgb2JqZWN0LCB0aGVuICRlZSQgZXZhbHVhdGVzIHRvIFxUUlVFe30sIG90aGVyd2lzZSAkZWUkIGV2YWx1YXRlcyB0byBcRkFMU0V7fS4gCiAKCiBUaGUgc3RhdGljIHR5cGUgb2YgYW4gZXF1YWxpdHkgZXhwcmVzc2lvbiBpcyBcY29kZXtib29sfS4KIAogClxzdWJzZWN0aW9ueyBSZWxhdGlvbmFsIEV4cHJlc3Npb25zfQpcbGFiZWx7cmVsYXRpb25hbEV4cHJlc3Npb25zfQoKUmVsYXRpb25hbCBleHByZXNzaW9ucyBpbnZva2UgdGhlIHJlbGF0aW9uYWwgb3BlcmF0b3JzIG9uIG9iamVjdHMuCgogXGJlZ2lue2dyYW1tYXJ9CntcYmYgcmVsYXRpb25hbEV4cHJlc3Npb246fWJpdHdpc2VPckV4cHJlc3Npb24gKHR5cGVUZXN0ICR8JCB0eXBlQ2FzdCAkfCQgIHJlbGF0aW9uYWxPcGVyYXRvciBiaXR3aXNlT3JFeHByZXNzaW9uKT87CiAgICAgIFxTVVBFUnt9IHJlbGF0aW9uYWxPcGVyYXRvciBiaXR3aXNlT3JFeHByZXNzaW9uCiAgICAuCgoKe1xiZiByZWxhdGlvbmFsT3BlcmF0b3I6fWB7XGVzY2FwZWdyYW1tYXIgXGd0PX0nOwogICAgICBge1xlc2NhcGVncmFtbWFyIFxndH0nOwogICAgICBge1xlc2NhcGVncmFtbWFyIFxsdH09JzsKICAgICAgYHtcZXNjYXBlZ3JhbW1hciBcbHR9JwogICAgLgogXGVuZHtncmFtbWFyfQogCkEge1xlbSByZWxhdGlvbmFsIGV4cHJlc3Npb259IGlzIGVpdGhlciBhIGJpdHdpc2UgZXhwcmVzc2lvbiAoXHJlZntiaXR3aXNlRXhwcmVzc2lvbnN9KSwgb3IgYW4gaW52b2NhdGlvbiBvZiBhIHJlbGF0aW9uYWwgb3BlcmF0b3Igb24gZWl0aGVyIFxTVVBFUnt9IG9yIGFuIGV4cHJlc3Npb24gJGVfMSQsIHdpdGggYXJndW1lbnQgJGVfMiQuCiAKQSByZWxhdGlvbmFsIGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gICRlXzEkICRvcCQgJGVfMiQgaXMgZXF1aXZhbGVudCB0byB0aGUgbWV0aG9kIGludm9jYXRpb24gXGNvZGV7JGVfMSQuJG9wJCgkZV8yJCl9LiBBIHJlbGF0aW9uYWwgZXhwcmVzc2lvbiBvZiB0aGUgZm9ybSAgXFNVUEVSe30gJG9wJCAkZV8yJCBpcyBlcXVpdmFsZW50IHRvIHRoZSBtZXRob2QgaW52b2NhdGlvbiBcY29kZXtcU1VQRVJ7fS4kb3AkKCRlXzIkKX0uIAoKXHN1YnNlY3Rpb257IEJpdHdpc2UgRXhwcmVzc2lvbnN9ClxsYWJlbHtiaXR3aXNlRXhwcmVzc2lvbnN9CgpCaXR3aXNlIGV4cHJlc3Npb25zIGludm9rZSB0aGUgYml0d2lzZSBvcGVyYXRvcnMgb24gb2JqZWN0cy4KCiBcYmVnaW57Z3JhbW1hcn0Ke1xiZiBiaXR3aXNlT3JFeHByZXNzaW9uOn1iaXR3aXNlWG9yRXhwcmVzc2lvbiAoYCR8JCcgYml0d2lzZVhvckV4cHJlc3Npb24pKjsKICAgICAgXFNVUEVSe30gKGAkfCQnIGJpdHdpc2VYb3JFeHByZXNzaW9uKSsKICAgIC4KCntcYmYgYml0d2lzZVhvckV4cHJlc3Npb246fWJpdHdpc2VBbmRFeHByZXNzaW9uIChgXF57fScgYml0d2lzZUFuZEV4cHJlc3Npb24pKjsKICAgICAgXFNVUEVSe30gKGBcXnt9JyBiaXR3aXNlQW5kRXhwcmVzc2lvbikrCiAgICAuCgp7XGJmIGJpdHdpc2VBbmRFeHByZXNzaW9uOn1zaGlmdEV4cHJlc3Npb24gKGBcJicgc2hpZnRFeHByZXNzaW9uKSo7CiAgICAgIFxTVVBFUnt9IChgXCYnIHNoaWZ0RXhwcmVzc2lvbikrCiAgICAuCgp7XGJmIGJpdHdpc2VPcGVyYXRvcjp9YFwmJzsKICAgICAgYFxee30nOwogICAgICBgJHwkJwogICAgLgogXGVuZHtncmFtbWFyfQogCkEge1xlbSBiaXR3aXNlIGV4cHJlc3Npb259IGlzIGVpdGhlciBhIHNoaWZ0IGV4cHJlc3Npb24gKFxyZWZ7c2hpZnR9KSwgb3IgYW4gaW52b2NhdGlvbiBvZiBhIGJpdHdpc2Ugb3BlcmF0b3Igb24gZWl0aGVyIFxTVVBFUnt9IG9yIGFuIGV4cHJlc3Npb24gJGVfMSQsIHdpdGggYXJndW1lbnQgJGVfMiQuCiAKIEEgYml0d2lzZSBleHByZXNzaW9uIG9mIHRoZSBmb3JtICAkZV8xJCAkb3AkICRlXzIkIGlzIGVxdWl2YWxlbnQgdG8gdGhlIG1ldGhvZCBpbnZvY2F0aW9uICRlXzEub3AoZV8yKSQuCkEgYml0d2lzZSBleHByZXNzaW9uIG9mIHRoZSBmb3JtICBcY29kZXtcU1VQRVJ7fSAkb3AkICRlXzIkfSBpcyBlcXVpdmFsZW50IHRvIHRoZSBtZXRob2QgaW52b2NhdGlvbiBcY29kZXtcU1VQRVJ7fS5vcCgkZV8yJCl9LgoKXGNvbW1lbnRhcnl7Ckl0IHNob3VsZCBiZSBvYnZpb3VzIHRoYXQgdGhlIHN0YXRpYyB0eXBlIHJ1bGVzIGZvciB0aGVzZSBleHByZXNzaW9ucyBhcmUgZGVmaW5lZCBieSB0aGUgZXF1aXZhbGVuY2UgYWJvdmUgLSBlcmdvLCBieSB0aGUgdHlwZSBydWxlcyBmb3IgbWV0aG9kIGludm9jYXRpb24gYW5kIHRoZSBzaWduYXR1cmVzIG9mIHRoZSBvcGVyYXRvcnMgb24gdGhlIHR5cGUgJGVfMSQuIFRoZSBzYW1lIGhvbGRzIGluIHNpbWlsYXIgc2l0dWF0aW9ucyB0aHJvdWdob3V0IHRoaXMgc3BlY2lmaWNhdGlvbi4KfQoKIApcc3Vic2VjdGlvbnsgU2hpZnR9ClxsYWJlbHtzaGlmdH0KClNoaWZ0IGV4cHJlc3Npb25zIGludm9rZSB0aGUgc2hpZnQgb3BlcmF0b3JzIG9uIG9iamVjdHMuCgogXGJlZ2lue2dyYW1tYXJ9CntcYmYgc2hpZnRFeHByZXNzaW9uOn1hZGRpdGl2ZUV4cHJlc3Npb24gKHNoaWZ0T3BlcmF0b3IgYWRkaXRpdmVFeHByZXNzaW9uKSo7CiAgICAgIFxTVVBFUnt9IChzaGlmdE9wZXJhdG9yIGFkZGl0aXZlRXhwcmVzc2lvbikrCiAgICAuCgp7XGJmIHNoaWZ0T3BlcmF0b3I6fWB7XGVzY2FwZWdyYW1tYXIgXGx0XGx0J307CiAgICAgICBge1xlc2NhcGVncmFtbWFyIFxndCBcZ3R9JyAKICAgIC4KIFxlbmR7Z3JhbW1hcn0KIApBIHtcZW0gc2hpZnQgZXhwcmVzc2lvbn0gaXMgZWl0aGVyIGFuIGFkZGl0aXZlIGV4cHJlc3Npb24gKFxyZWZ7YWRkaXRpdmVFeHByZXNzaW9uc30pLCBvciBhbiBpbnZvY2F0aW9uIG9mIGEgc2hpZnQgb3BlcmF0b3Igb24gZWl0aGVyIFxTVVBFUnt9IG9yIGFuIGV4cHJlc3Npb24gJGVfMSQsIHdpdGggYXJndW1lbnQgJGVfMiQuCiAKIEEgc2hpZnQgZXhwcmVzc2lvbiBvZiB0aGUgZm9ybSAgJGVfMSQgJG9wJCAkZV8yJCBpcyBlcXVpdmFsZW50IHRvIHRoZSBtZXRob2QgaW52b2NhdGlvbiBcY29kZXskZV8xJC4kb3AkKCRlXzIkKX0uIEEgc2hpZnQgZXhwcmVzc2lvbiBvZiB0aGUgZm9ybSAgXFNVUEVSe30gJG9wJCAkZV8yJCBpcyBlcXVpdmFsZW50IHRvIHRoZSBtZXRob2QgaW52b2NhdGlvbiBcY29kZXtcU1VQRVJ7fS4kb3AkKCRlXzIkKX0uIAoKXGNvbW1lbnRhcnl7Ck5vdGUgdGhhdCB0aGlzIGRlZmluaXRpb24gaW1wbGllcyBsZWZ0LXRvLXJpZ2h0IGV2YWx1YXRpb24gb3JkZXIgYW1vbmcgc2hpZnQgZXhwcmVzc2lvbnM6IAoKJGVfMSA8PCBlXzIgPDwgZV8zJAoKaXMgZXZhbHVhdGVkIGFzICAkKGVfMSA8PCBlXzIgKS48PCAoZV8zKSQgIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gJChlXzEgPDwgZV8yKSA8PCBlXzMkLgpUaGUgc2FtZSBob2xkcyBmb3IgYWRkaXRpdmUgYW5kIG11bHRpcGxpY2F0aXZlIGV4cHJlc3Npb25zLgp9CiAgICAgCiBcc3Vic2VjdGlvbnsgQWRkaXRpdmUgRXhwcmVzc2lvbnN9ClxsYWJlbHthZGRpdGl2ZUV4cHJlc3Npb25zfQoKQWRkaXRpdmUgZXhwcmVzc2lvbnMgaW52b2tlIHRoZSBhZGRpdGlvbiBvcGVyYXRvcnMgb24gb2JqZWN0cy4KCiBcYmVnaW57Z3JhbW1hcn0Ke1xiZiBhZGRpdGl2ZUV4cHJlc3Npb246fW11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiAoYWRkaXRpdmVPcGVyYXRvciBtdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24pKjsKICAgICAgXFNVUEVSe30gKGFkZGl0aXZlT3BlcmF0b3IgbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKSsKICAgIC4KCntcYmYgYWRkaXRpdmVPcGVyYXRvcjp9YCsnOwogICAgICBgLScKICAgIC4KIFxlbmR7Z3JhbW1hcn0KIApBbiB7XGVtIGFkZGl0aXZlIGV4cHJlc3Npb259IGlzIGVpdGhlciBhIG11bHRpcGxpY2F0aXZlIGV4cHJlc3Npb24gKFxyZWZ7bXVsdGlwbGljYXRpdmVFeHByZXNzaW9uc30pLCBvciBhbiBpbnZvY2F0aW9uIG9mIGFuIGFkZGl0aXZlIG9wZXJhdG9yIG9uIGVpdGhlciBcU1VQRVJ7fSBvciBhbiBleHByZXNzaW9uICRlXzEkLCB3aXRoIGFyZ3VtZW50ICRlXzIkLgoKQW4gYWRkaXRpdmUgZXhwcmVzc2lvbiBvZiB0aGUgZm9ybSAgJGVfMSQgJG9wJCAkZV8yJCBpcyBlcXVpdmFsZW50IHRvIHRoZSBtZXRob2QgaW52b2NhdGlvbiBcY29kZXskZV8xJC4kb3AkKCRlXzIkKX0uIEFuIGFkZGl0aXZlIGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gIFxTVVBFUnt9ICRvcCQgJGVfMiQgaXMgZXF1aXZhbGVudCB0byB0aGUgbWV0aG9kIGludm9jYXRpb24gXGNvZGV7XFNVUEVSe30uJG9wJCgkZV8yJCl9LiAKClRoZSBzdGF0aWMgdHlwZSBvZiBhbiBhZGRpdGl2ZSBleHByZXNzaW9uIGlzIHVzdWFsbHkgZGV0ZXJtaW5lZCBieSB0aGUgc2lnbmF0dXJlIGdpdmVuIGluIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgb3BlcmF0b3IgdXNlZC4gSG93ZXZlciwgaW52b2NhdGlvbnMgb2YgdGhlIG9wZXJhdG9ycyBcY2R7K30gIGFuZCBcY2R7LX0gb2YgY2xhc3MgXGNke2ludH0gYXJlIHRyZWF0ZWQgc3BlY2lhbGx5IGJ5IHRoZSB0eXBlY2hlY2tlci4gVGhlIHN0YXRpYyB0eXBlIG9mIGFuIGV4cHJlc3Npb24gJGVfMSArIGVfMiQgd2hlcmUgJGVfMSQgaGFzIHN0YXRpYyB0eXBlIFxjZHtpbnR9IGlzIFxjZHtpbnR9IGlmIHRoZSBzdGF0aWMgdHlwZSBvZiAkZV8yJCBpcyBcY2R7aW50fSwgYW5kIFxjZHtkb3VibGV9IGlmIHRoZSBzdGF0aWMgdHlwZSBvZiAkZV8yJCBpcyBcY2R7ZG91YmxlfS4gVGhlIHN0YXRpYyB0eXBlIG9mIGFuIGV4cHJlc3Npb24gJGVfMSAtIGVfMiQgd2hlcmUgJGVfMSQgaGFzIHN0YXRpYyB0eXBlIFxjZHtpbnR9IGlzIFxjZHtpbnR9IGlmIHRoZSBzdGF0aWMgdHlwZSBvZiAkZV8yJCBpcyBcY2R7aW50fSwgYW5kIFxjZHtkb3VibGV9IGlmIHRoZSBzdGF0aWMgdHlwZSBvZiAkZV8yJCBpcyBcY2R7ZG91YmxlfS4KIAogClxzdWJzZWN0aW9ueyBNdWx0aXBsaWNhdGl2ZSBFeHByZXNzaW9uc30KXGxhYmVse211bHRpcGxpY2F0aXZlRXhwcmVzc2lvbnN9CgpNdWx0aXBsaWNhdGl2ZSBleHByZXNzaW9ucyBpbnZva2UgdGhlIG11bHRpcGxpY2F0aW9uIG9wZXJhdG9ycyBvbiBvYmplY3RzLgoKIFxiZWdpbntncmFtbWFyfQp7XGJmIG11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbjp9dW5hcnlFeHByZXNzaW9uIChtdWx0aXBsaWNhdGl2ZU9wZXJhdG9yIHVuYXJ5RXhwcmVzc2lvbikqOwogICAgICBcU1VQRVJ7fSAobXVsdGlwbGljYXRpdmVPcGVyYXRvciB1bmFyeUV4cHJlc3Npb24pKwogICAgLgoKe1xiZiBtdWx0aXBsaWNhdGl2ZU9wZXJhdG9yOn1gKic7CiAgICAgIGAvJzsKICAgICAgYFwlJzsKICAgICAgYFx+e30vJwogICAgLgogICAgCiBcZW5ke2dyYW1tYXJ9CiAgICAKIEEge1xlbSBtdWx0aXBsaWNhdGl2ZSBleHByZXNzaW9ufSBpcyBlaXRoZXIgYSB1bmFyeSBleHByZXNzaW9uIChccmVme3VuYXJ5RXhwcmVzc2lvbnN9KSwgb3IgYW4gaW52b2NhdGlvbiBvZiBhIG11bHRpcGxpY2F0aXZlIG9wZXJhdG9yIG9uIGVpdGhlciBcU1VQRVJ7fSBvciBhbiBleHByZXNzaW9uICRlXzEkLCB3aXRoIGFyZ3VtZW50ICRlXzIkLgogCiBBIG11bHRpcGxpY2F0aXZlIGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gICRlXzEkICRvcCQgJGVfMiQgaXMgZXF1aXZhbGVudCB0byB0aGUgbWV0aG9kIGludm9jYXRpb24gXGNvZGV7JGVfMSQuJG9wJCgkZV8yJCl9LiBBIG11bHRpcGxpY2F0aXZlIGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gIFxTVVBFUnt9ICRvcCQgJGVfMiQgaXMgZXF1aXZhbGVudCB0byB0aGUgbWV0aG9kIGludm9jYXRpb24gXGNvZGV7XFNVUEVSe30uJG9wJCgkZV8yJCl9LiAgIAogClRoZSBzdGF0aWMgdHlwZSBvZiBhbiBtdWx0aXBsaWNhdGl2ZSBleHByZXNzaW9uIGlzIHVzdWFsbHkgZGV0ZXJtaW5lZCBieSB0aGUgc2lnbmF0dXJlIGdpdmVuIGluIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgb3BlcmF0b3IgdXNlZC4gSG93ZXZlciwgaW52b2NhdGlvbnMgb2YgdGhlIG9wZXJhdG9ycyBcY2R7Kn0sIFxjZHtcJX0gIGFuZCBcY2R7XH57fS99IG9mIGNsYXNzIFxjZHtpbnR9IGFyZSB0cmVhdGVkIHNwZWNpYWxseSBieSB0aGUgdHlwZWNoZWNrZXIuIFRoZSBzdGF0aWMgdHlwZSBvZiBhbiBleHByZXNzaW9uICRlXzEgKiBlXzIkIHdoZXJlICRlXzEkIGhhcyBzdGF0aWMgdHlwZSBcY2R7aW50fSBpcyBcY2R7aW50fSBpZiB0aGUgc3RhdGljIHR5cGUgb2YgJGVfMiQgaXMgXGNke2ludH0sIGFuZCBcY2R7ZG91YmxlfSBpZiB0aGUgc3RhdGljIHR5cGUgb2YgJGVfMiQgaXMgXGNke2RvdWJsZX0uIFRoZSBzdGF0aWMgdHlwZSBvZiBhbiBleHByZXNzaW9uICRlXzEgXCUgZV8yJCB3aGVyZSAkZV8xJCBoYXMgc3RhdGljIHR5cGUgXGNke2ludH0gaXMgXGNke2ludH0gaWYgdGhlIHN0YXRpYyB0eXBlIG9mICRlXzIkIGlzIFxjZHtpbnR9LCBhbmQgXGNke2RvdWJsZX0gaWYgdGhlIHN0YXRpYyB0eXBlIG9mICRlXzIkIGlzIFxjZHtkb3VibGV9LiAgVGhlIHN0YXRpYyB0eXBlIG9mIGFuIGV4cHJlc3Npb24gXGNkeyRlXzEkIFx+e30vICRlXzIkfSB3aGVyZSAkZV8xJCBoYXMgc3RhdGljIHR5cGUgXGNke2ludH0gaXMgXGNke2ludH0gaWYgdGhlIHN0YXRpYyB0eXBlIG9mICRlXzIkIGlzIFxjZHtpbnR9LgogClxzdWJzZWN0aW9ueyBVbmFyeSBFeHByZXNzaW9uc30KXGxhYmVse3VuYXJ5RXhwcmVzc2lvbnN9CgpVbmFyeSBleHByZXNzaW9ucyBpbnZva2UgdW5hcnkgb3BlcmF0b3JzIG9uIG9iamVjdHMuCgpcYmVnaW57Z3JhbW1hcn0Ke1xiZiB1bmFyeUV4cHJlc3Npb246fXByZWZpeE9wZXJhdG9yIHVuYXJ5RXhwcmVzc2lvbjsKICAgICAgcG9zdGZpeEV4cHJlc3Npb247CiAgICAgIChtaW51c09wZXJhdG9yICR8JCB0aWxkZU9wZXJhdG9yKSBcU1VQRVJ7fTsKICAgICAgaW5jcmVtZW50T3BlcmF0b3IgYXNzaWduYWJsZUV4cHJlc3Npb24KICAgIC4KIAoge1xiZiBwcmVmaXhPcGVyYXRvcjp9bWludXNPcGVyYXRvcjsKICAgICAgbmVnYXRpb25PcGVyYXRvcjsKICAgICAgdGlsZGVPcGVyYXRvcgogICAgLgogICAgICAgCiAgICAgICAKICB7XGJmIG1pbnVzT3BlcmF0b3I6fWAtJzsgIC4KCgogICAge1xiZiBuZWdhdGlvbk9wZXJhdG9yOn1gIScgOwogICAgICAuCiAgICAgIAogICAge1xiZiB0aWxkZU9wZXJhdG9yOn0gIGBcfnt9JwogICAgLgogICAgCiAgICAKXGVuZHtncmFtbWFyfQoKQSB7XGVtIHVuYXJ5IGV4cHJlc3Npb259IGlzIGVpdGhlciBhIHBvc3RmaXggZXhwcmVzc2lvbiAgKFxyZWZ7cG9zdGZpeEV4cHJlc3Npb25zfSksIGFuIGludm9jYXRpb24gb2YgYSBwcmVmaXggb3BlcmF0b3Igb24gYW4gZXhwcmVzc2lvbiBvciBhbiBpbnZvY2F0aW9uIG9mIGEgdW5hcnkgb3BlcmF0b3Igb24gZWl0aGVyIFxTVVBFUnt9IG9yIGFuIGV4cHJlc3Npb24gJGUkLgoKVGhlIGV4cHJlc3Npb24gJCFlJCBpcyBlcXVpdmFsZW50IHRvIHRoZSBleHByZXNzaW9uICRlPyBcRkFMU0V7fSA6XFRSVUV7fSQuIAoKRXZhbHVhdGlvbiBvZiBhbiBleHByZXNzaW9uIG9mIHRoZSBmb3JtIFxjb2RleysrJGUkfSBpcyBlcXVpdmFsZW50IHRvIFxjb2RleyRlJCArPSAxfS4gIEV2YWx1YXRpb24gb2YgYW4gZXhwcmVzc2lvbiBvZiB0aGUgZm9ybSBcY29kZXste30tJGUkfSBpcyBlcXVpdmFsZW50IHRvIFxjb2RleyRlJCAtPSAxfS4gCgolVGhlIGV4cHJlc3Npb24gJC1lJCBpcyBlcXVpdmFsZW50IHRvIHRoZSBtZXRob2QgaW52b2NhdGlvbiBcY29kZXskZSQuLSgpfS4gIFRoZSBleHByZXNzaW9uIFxjb2Rley1cU1VQRVJ7fX0gaXMgZXF1aXZhbGVudCAgdG8gdGhlIG1ldGhvZCBpbnZvY2F0aW9uIFxjb2Rle1xTVVBFUnt9Li0oKX0uCgpBbiBleHByZXNzaW9uIG9mIHRoZSBmb3JtIFxjb2RleyRvcCQgJGUkfSBpcyBlcXVpdmFsZW50IHRvIHRoZSBtZXRob2QgaW52b2NhdGlvbiBcY29kZXskZS5vcCgpJH0uIEFuIGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gXGNvZGV7JG9wJCBcU1VQRVJ7fX0gaXMgZXF1aXZhbGVudCB0byB0aGUgbWV0aG9kIGludm9jYXRpb24gXGNvZGV7XFNVUEVSe30uJG9wKCkkfS4KCgogICAgIApcc3Vic2VjdGlvbnsgUG9zdGZpeCBFeHByZXNzaW9uc30KXGxhYmVse3Bvc3RmaXhFeHByZXNzaW9uc30KClBvc3RmaXggZXhwcmVzc2lvbnMgaW52b2tlIHRoZSBwb3N0Zml4IG9wZXJhdG9ycyBvbiBvYmplY3RzLgoKIFxiZWdpbntncmFtbWFyfQp7XGJmIHBvc3RmaXhFeHByZXNzaW9uOn1hc3NpZ25hYmxlRXhwcmVzc2lvbiBwb3N0Zml4T3BlcmF0b3I7CiAgICAgIHByaW1hcnkgc2VsZWN0b3IqCiAgICAuCgp7XGJmIHBvc3RmaXhPcGVyYXRvcjp9CiAgICAgIGluY3JlbWVudE9wZXJhdG9yCiAgICAuCgp7XGJmIHNlbGVjdG9yOn1hc3NpZ25hYmxlU2VsZWN0b3I7CiAgICAgIGFyZ3VtZW50cwogICAgLgoKe1xiZiBpbmNyZW1lbnRPcGVyYXRvcjp9YCsrJzsKICAgICAgYC17fS0nCiAgICAuCiAgICAgICAgCiBcZW5ke2dyYW1tYXJ9CiAKIEEge1xlbSBwb3N0Zml4IGV4cHJlc3Npb259IGlzIGVpdGhlciBhIHByaW1hcnkgZXhwcmVzc2lvbiwgYSBmdW5jdGlvbiwgbWV0aG9kIG9yIGdldHRlciBpbnZvY2F0aW9uLCBvciBhbiBpbnZvY2F0aW9uIG9mIGEgcG9zdGZpeCBvcGVyYXRvciBvbiBhbiBleHByZXNzaW9uICRlJC4KCkEgcG9zdGZpeCBleHByZXNzaW9uIG9mIHRoZSBmb3JtIFxjb2RleyR2JCsrfSwgd2hlcmUgJHYkIGlzIGFuIGlkZW50aWZpZXIsIGlzIGVxdWl2YWxlbnQgdG8gXGNvZGV7KClce3ZhciByID0gJHYkOyAkdiQgPSByICsgMTsgcmV0dXJuIHJcfSgpfS4KClxyYXRpb25hbGV7VGhlIGFib3ZlIGVuc3VyZXMgdGhhdCBpZiAkdiQgaXMgYSBmaWVsZCwgdGhlIGdldHRlciBnZXRzIGNhbGxlZCBleGFjdGx5IG9uY2UuIExpa2V3aXNlIGluIHRoZSBjYXNlcyBiZWxvdy4gCn0KCkEgcG9zdGZpeCBleHByZXNzaW9uIG9mIHRoZSBmb3JtIFxjb2RleyRDLnYkICsrfSBpcyBlcXVpdmFsZW50IHRvIAoKXGNvZGV7KClce3ZhciByID0gJEMudiQ7ICRDLnYkID0gciArIDE7IHJldHVybiByXH0oKX0uCgpBIHBvc3RmaXggZXhwcmVzc2lvbiBvZiB0aGUgZm9ybSBcY29kZXskZV8xLnYkKyt9IGlzIGVxdWl2YWxlbnQgdG8gCgpcY29kZXsoeClce3ZhciByID0geC52OyB4LnYgPSByICsgMTsgXFJFVFVSTnt9IHJcfSgkZV8xJCl9LgoKQSBwb3N0Zml4IGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gXGNvZGV7JGVfMVtlXzJdJCsrfSwgIGlzIGVxdWl2YWxlbnQgdG8gCgpcY29kZXsoYSwgaSlce3ZhciByID0gYVtpXTsgYVtpXSA9IHIgKyAxOyByZXR1cm4gclx9KCRlXzEkLCAkZV8yJCl9LgoKQSBwb3N0Zml4IGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gXGNvZGV7JHYkLXt9LX0sIHdoZXJlICR2JCBpcyBhbiBpZGVudGlmaWVyLCBpcyBlcXVpdmFsZW50IHRvIAoKXGNvZGV7KClce3ZhciByID0gJHYkOyAkdiQgPSByIC0gMTsgcmV0dXJuIHJcfSgpfS4KCkEgcG9zdGZpeCBleHByZXNzaW9uIG9mIHRoZSBmb3JtIFxjb2RleyRDLnYkLXt9LX0gaXMgZXF1aXZhbGVudCB0byAKClxjb2RleygpXHt2YXIgciA9ICRDLnYkOyAkQy52JCA9IHIgLSAxOyByZXR1cm4gclx9KCl9LgoKQSBwb3N0Zml4IGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gXGNvZGV7JGVfMS52JC17fS19IGlzIGVxdWl2YWxlbnQgdG8gCgpcY29kZXsoeClce3ZhciByID0geC52OyB4LnYgPSByIC0gMTsgXFJFVFVSTnt9IHJcfSgkZV8xJCl9LgoKQSBwb3N0Zml4IGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gXGNvZGV7JGVfMVtlXzJdJC17fS19LCAgaXMgZXF1aXZhbGVudCB0byAKClxjb2RleyhhLCBpKVx7dmFyIHIgPSBhW2ldOyBhW2ldID0gciAtIDE7IHJldHVybiByXH0oJGVfMSQsICRlXzIkKX0uCiAKClxzdWJzZWN0aW9ueyBBc3NpZ25hYmxlIEV4cHJlc3Npb25zfQpcbGFiZWx7YXNzaWduYWJsZUV4cHJlc3Npb25zfQoKQXNzaWduYWJsZSBleHByZXNzaW9ucyBhcmUgZXhwcmVzc2lvbnMgdGhhdCBjYW4gYXBwZWFyIG9uIHRoZSBsZWZ0IGhhbmQgc2lkZSBvZiBhbiBhc3NpZ25tZW50LgpUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIGhvdyB0byBldmFsdWF0ZSB0aGVzZSBleHByZXNzaW9ucyB3aGVuIHRoZXkgZG8gbm90IGNvbnN0aXR1dGUgdGhlIGNvbXBsZXRlIGxlZnQgaGFuZCBzaWRlIG9mIGFuIGFzc2lnbm1lbnQuCgpccmF0aW9uYWxlewpPZiBjb3Vyc2UsIGlmIGFzc2lnbmFibGUgZXhwcmVzc2lvbnMgYWx3YXlzIGFwcGVhcmVkIHtcZW0gYXN9IHRoZSBsZWZ0IGhhbmQgc2lkZSwgb25lIHdvdWxkIGhhdmUgbm8gbmVlZCBmb3IgdGhlaXIgdmFsdWUsIGFuZCB0aGUgcnVsZXMgZm9yIGV2YWx1YXRpbmcgdGhlbSB3b3VsZCBiZSB1bm5lY2Vzc2FyeS4gSG93ZXZlciwgIGFzc2lnbmFibGUgZXhwcmVzc2lvbnMgY2FuIGJlIHN1YmV4cHJlc3Npb25zIG9mIG90aGVyIGV4cHJlc3Npb25zIGFuZCB0aGVyZWZvcmUgbXVzdCBiZSBldmFsdWF0ZWQuCn0KCgoKXGJlZ2lue2dyYW1tYXJ9Cgp7XGJmIGFzc2lnbmFibGVFeHByZXNzaW9uOn1wcmltYXJ5IChhcmd1bWVudCogYXNzaWduYWJsZVNlbGVjdG9yKSs7CiAgICAgIFxTVVBFUnt9IGFzc2lnbmFibGVTZWxlY3RvcjsKICAgICAgaWRlbnRpZmllcgogICAgLgogICAgCntcYmYgYXNzaWduYWJsZVNlbGVjdG9yOn1gWycgZXhwcmVzc2lvbiBgXSc7ICUgYWdhaW4sIGNvdWxkIGJlIHRvcCBsZXZlbAogICAgICBge1xlc2NhcGVncmFtbWFyIC59JyBpZGVudGlmaWVyCiAgICAuCgpcZW5ke2dyYW1tYXJ9CgpBbiB7XGVtIGFzc2lnbmFibGUgZXhwcmVzc2lvbn0gaXMgZWl0aGVyOgpcYmVnaW57aXRlbWl6ZX0KIFxpdGVtIEFuIGlkZW50aWZpZXIuIApcaXRlbSBBbiBpbnZvY2F0aW9uIG9mIGEgZ2V0dGVyIChccmVme2dldHRlcnN9KSBvciBsaXN0IGFjY2VzcyBvcGVyYXRvciBvbiBhbiBleHByZXNzaW9uICRlJC4KXGl0ZW0gQW4gaW52b2NhdGlvbiBvZiBhIGdldHRlciBvciBsaXN0IGFjY2VzcyBvcGVyYXRvciBvbiAgXFNVUEVSe30uClxlbmR7aXRlbWl6ZX0KCgpBbiBhc3NpZ25hYmxlIGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gJGlkJCBpcyBldmFsdWF0ZWQgYXMgYW4gaWRlbnRpZmllciBleHByZXNzaW9uIChccmVme2lkZW50aWZpZXJSZWZlcmVuY2V9KS4KCiVBbiBhc3NpZ25hYmxlIGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gJGUuaWQoYV8xLCBcbGRvdHMsIGFfbikkIGlzIGV2YWx1YXRlZCBhcyBhIG1ldGhvZCBpbnZvY2F0aW9uIChccmVme21ldGhvZEludm9jYXRpb259KS4KCkFuIGFzc2lnbmFibGUgZXhwcmVzc2lvbiBvZiB0aGUgZm9ybSAkZS5pZCQgaXMgZXZhbHVhdGVkIGFzIGEgZ2V0dGVyIGludm9jYXRpb24gIChccmVme2dldHRlckludm9jYXRpb259KS4KCkFuIGFzc2lnbmFibGUgZXhwcmVzc2lvbiBvZiB0aGUgZm9ybSBcY29kZXskZV8xJFskZV8yJF19IGlzIGV2YWx1YXRlZCBhcyBhIG1ldGhvZCBpbnZvY2F0aW9uIG9mIHRoZSBvcGVyYXRvciBtZXRob2QgXGNvZGV7W119IG9uICRlXzEkIHdpdGggYXJndW1lbnQgJGVfMiQuCgpBbiBhc3NpZ25hYmxlIGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gXGNvZGV7XFNVUEVSe30uaWR9ICBpcyBldmFsdWF0ZWQgYXMgYSBnZXR0ZXIgaW52b2NhdGlvbi4KCkFuIGFzc2lnbmFibGUgZXhwcmVzc2lvbiBvZiB0aGUgZm9ybSBcY29kZXtcU1VQRVJ7fVskZV8yJF19IGlzIGVxdWl2YWxlbnQgdG8gdGhlIG1ldGhvZCBpbnZvY2F0aW9uICBcY29kZXtcU1VQRVJ7fS5bXSgkZV8yJCl9LgoKXHN1YnNlY3Rpb257IElkZW50aWZpZXIgUmVmZXJlbmNlfQpcbGFiZWx7aWRlbnRpZmllclJlZmVyZW5jZX0KCkFuIHtcZW0gaWRlbnRpZmllciBleHByZXNzaW9ufSBjb25zaXN0cyBvZiBhIHNpbmdsZSBpZGVudGlmaWVyOyBpdCBwcm92aWRlcyBhY2Nlc3MgdG8gYW4gb2JqZWN0IHZpYSBhbiB1bnF1YWxpZmllZCBuYW1lLgoKXGJlZ2lue2dyYW1tYXJ9CntcYmYgaWRlbnRpZmllcjp9CiAgICAgSURFTlRJRklFUgogICAgIC4KICAgICAKICAgICAgICAgCiB7XGJmIElERU5USUZJRVJcX05PXF9ET0xMQVI6fQogICAgICBJREVOVElGSUVSXF9TVEFSVFxfTk9cX0RPTExBUiBJREVOVElGSUVSXF9QQVJUXF9OT1xfRE9MTEFSKgogICAgLgoKe1xiZiBJREVOVElGSUVSOn0KICAgICAgSURFTlRJRklFUlxfU1RBUlQgSURFTlRJRklFUlxfUEFSVCoKICAgIC4KCntcYmYgQlVJTFRcX0lOXF9JREVOVElGSUVSOn0gXEFCU1RSQUNUe307CiAgICAgXEFTe307CiAgICAgXERFRkVSUkVEe307CiAgICAgXERZTkFNSUN7fTsKICAgICBcRVhQT1JUe307CiAgICAgXEVYVEVSTkFMe307CiAgICAgXEZBQ1RPUll7fTsKICAgICBcR0VUe307CiAgICAgXElNUExFTUVOVFN7fTsKICAgICBcSU1QT1JUe307CiAgICAgXExJQlJBUll7fTsKICAgICBcT1BFUkFUT1J7fTsKICAgICBcUEFSVHt9OwogICAgICBcU0VUe307CiAgICAgIFxTVEFUSUN7fTsKICAgICBcVFlQRURFRnt9CiAgICAuCgoge1xiZiBJREVOVElGSUVSXF9TVEFSVDp9SURFTlRJRklFUlxfU1RBUlRcX05PXF9ET0xMQVI7CiAgICAgIGBcJCcKICAgIC4KCntcYmYgSURFTlRJRklFUlxfU1RBUlRcX05PXF9ET0xMQVI6fUxFVFRFUjsKICAgICAgYFxfJwogICAgLgoKe1xiZiAgSURFTlRJRklFUlxfUEFSVFxfTk9cX0RPTExBUjp9SURFTlRJRklFUlxfU1RBUlRcX05PXF9ET0xMQVI7CiAgICAgIERJR0lUCiAgICAuCgoKe1xiZiBJREVOVElGSUVSXF9QQVJUOn1JREVOVElGSUVSXF9TVEFSVDsKICAgICAgRElHSVQKICAgIC4KCgoKe1xiZiBxdWFsaWZpZWQ6fQogICAgICBpZGVudGlmaWVyIChge1xlc2NhcGVncmFtbWFyIC59JyBpZGVudGlmaWVyKT8gIAogICAgICAuIApcZW5ke2dyYW1tYXJ9CgpBIGJ1aWx0LWluIGlkZW50aWZpZXIgaXMgb25lIG9mIHRoZSBpZGVudGlmaWVycyBwcm9kdWNlZCBieSB0aGUgcHJvZHVjdGlvbiB7XGVtIEJVSUxUXF9JTlxfSURFTlRJRklFUn0uIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIGEgYnVpbHQtaW4gaWRlbnRpZmllciBpcyB1c2VkIGFzIHRoZSBkZWNsYXJlZCBuYW1lIG9mIGEgY2xhc3MsIHR5cGUgcGFyYW1ldGVyIG9yIHR5cGUgYWxpYXMuIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIHRvIHVzZSBhIGJ1aWx0LWluIGlkZW50aWZpZXIgb3RoZXIgdGhhbiBcRFlOQU1JQ3t9IGFzIGEgdHlwZSBhbm5vdGF0aW9uLgoKXHJhdGlvbmFsZXsKQnVpbHQtaW4gaWRlbnRpZmllcnMgYXJlIGlkZW50aWZpZXJzIHRoYXQgYXJlIHVzZWQgYXMga2V5d29yZHMgaW4gRGFydCwgYnV0IGFyZSBub3QgcmVzZXJ2ZWQgd29yZHMgaW4gSmF2YXNjcmlwdC4gVG8gbWluaW1pemUgaW5jb21wYXRpYmlsaXRpZXMgd2hlbiBwb3J0aW5nIEphdmFzY3JpcHQgY29kZSB0byBEYXJ0LCB3ZSBkbyBub3QgbWFrZSB0aGVzZSBpbnRvIHJlc2VydmVkIHdvcmRzLiBBIGJ1aWx0LWluIGlkZW50aWZpZXIgbWF5IG5vdCBiZSB1c2VkIHRvIG5hbWUgYSBjbGFzcyBvciB0eXBlLiBJbiBvdGhlciB3b3JkcywgdGhleSBhcmUgdHJlYXRlZCBhcyByZXNlcnZlZCB3b3JkcyB3aGVuIHVzZWQgYXMgdHlwZXMuICBUaGlzIGVsaW1pbmF0ZXMgbWFueSBjb25mdXNpbmcgc2l0dWF0aW9ucyB3aXRob3V0IGNhdXNpbmcgY29tcGF0aWJpbGl0eSBwcm9ibGVtcy4gQWZ0ZXIgYWxsLCBhIEphdmFzY3JpcHQgcHJvZ3JhbSBoYXMgbm8gdHlwZSBkZWNsYXJhdGlvbnMgb3IgYW5ub3RhdGlvbnMgc28gbm8gY2xhc2ggY2FuIG9jY3VyLiAgRnVydGhlcm1vcmUsIHR5cGVzIHNob3VsZCBiZWdpbiB3aXRoIGFuIHVwcGVyY2FzZSBsZXR0ZXIgKHNlZSB0aGUgYXBwZW5kaXgpIGFuZCBzbyBubyBjbGFzaCBzaG91bGQgb2NjdXIgaW4gYW55IERhcnQgdXNlciBwcm9ncmFtIGFueXdheS4KfQoKRXZhbHVhdGlvbiBvZiBhbiBpZGVudGlmaWVyIGV4cHJlc3Npb24gJGUkIG9mIHRoZSBmb3JtICRpZCQgcHJvY2VlZHMgYXMgZm9sbG93czoKCgpMZXQgJGQkIGJlIHRoZSBpbm5lcm1vc3QgZGVjbGFyYXRpb24gaW4gdGhlIGVuY2xvc2luZyBsZXhpY2FsIHNjb3BlIHdob3NlIG5hbWUgaXMgJGlkJCBvciAkaWQ9JC4gIElmIG5vIHN1Y2ggZGVjbGFyYXRpb24gZXhpc3RzIGluIHRoZSBsZXhpY2FsIHNjb3BlLCBsZXQgJGQkIGJlIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgaW5oZXJpdGVkIG1lbWJlciBuYW1lZCAkaWQkIGlmIGl0IGV4aXN0cy4gCiVJZiBubyBzdWNoIG1lbWJlciBleGlzdHMsIGxldCAkZCQgYmUgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBzdGF0aWMgbWVtYmVyIG5hbWUgJGlkJCBkZWNsYXJlZCBpbiBhIHN1cGVyY2xhc3Mgb2YgdGhlIGN1cnJlbnQgY2xhc3MsIGlmIGl0IGV4aXN0cy4KClxiZWdpbntpdGVtaXplfQpcaXRlbSBJZiAkZCQgaXMgYSBjbGFzcyBvciB0eXBlIGFsaWFzICRUJCwgdGhlIHZhbHVlIG9mICRlJCBpcyBhbiBpbnN0YW5jZSBvZiBjbGFzcyBcY29kZXtUeXBlfSByZWlmeWluZyAkVCQuClxpdGVtIElmICRkJCBpcyBhIHR5cGUgcGFyYW1ldGVyICRUJCwgdGhlbiB0aGUgdmFsdWUgb2YgJGUkIGlzIHRoZSB2YWx1ZSBvZiB0aGUgYWN0dWFsIHR5cGUgYXJndW1lbnQgY29ycmVzcG9uZGluZyB0byAkVCQgdGhhdCB3YXMgIHBhc3NlZCB0byB0aGUgZ2VuZXJhdGl2ZSBjb25zdHJ1Y3RvciB0aGF0IGNyZWF0ZWQgdGhlIGN1cnJlbnQgYmluZGluZyBvZiBcVEhJU3t9LiBJZiwgaG93ZXZlciwgJGUkIG9jY3VycyBpbnNpZGUgYSBzdGF0aWMgbWVtYmVyLCBhIGNvbXBpbGUtdGltZSBlcnJvciBvY2N1cnMuCgolXGNvbW1lbnRhcnl7IFdlIGFyZSBhc3N1cmVkIHRoYXQgXFRISVN7fSBpcyB3ZWxsIGRlZmluZWQsIGJlY2F1c2UgaWYgd2Ugd2VyZSBpbiBhIHN0YXRpYyBtZW1iZXIgdGhlIHJlZmVyZW5jZSB0byAkVCQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgKFxyZWZ7Z2VuZXJpY3N9Lil9CiVcaXRlbSBJZiAkZCQgaXMgYSBsaWJyYXJ5IHZhcmlhYmxlIHRoZW46CiUgIFxiZWdpbntpdGVtaXplfQolICBcaXRlbSBJZiAkZCQgaXMgb2Ygb25lIG9mIHRoZSBmb3JtcyBcY29kZXtcVkFSe30gJHYkID0gJGVfaSQ7fSAsIFxjb2RleyRUJCAkdiQgPSAkZV9pJDt9ICwgXGNvZGV7XEZJTkFMe30gJHYkID0gJGVfaSQ7fSAgb3IgXGNvZGV7XEZJTkFMe30gJFQkICR2JCA9ICRlX2kkO30gYW5kIG5vIHZhbHVlIGhhcyB5ZXQgYmVlbiBzdG9yZWQgaW50byAkdiQgdGhlbiB0aGUgaW5pdGlhbGl6ZXIgZXhwcmVzc2lvbiAkZV9pJCBpcyBldmFsdWF0ZWQuIElmLCBkdXJpbmcgdGhlIGV2YWx1YXRpb24gb2YgJGVfaSQsIHRoZSBnZXR0ZXIgZm9yICR2JCBpcyByZWZlcmVuY2VkLCBhIFxjb2Rle0N5Y2xpY0luaXRpYWxpemF0aW9uRXJyb3J9IGlzIHRocm93bi4gSWYgdGhlIGV2YWx1YXRpb24gc3VjY2VlZGVkIHlpZWxkaW5nIGFuIG9iamVjdCAkbyQsIGxldCAkciA9IG8kLCBvdGhlcndpc2UgbGV0ICRyID0gXE5VTEx7fSQuIEluIGFueSBjYXNlLCAkciQgaXMgc3RvcmVkIGludG8gJHYkLiBUaGUgdmFsdWUgb2YgJGUkIGlzICRyJC4gCiBcaXRlbSAgSWYgJGQkIGlzIGEgY29uc3RhbnQgdmFyaWFibGUgb2Ygb25lIG9mIHRoZSBmb3JtcyAgXGNvZGV7XENPTlNUe30gJHYkID0gJGUkO30gb3IgXGNvZGV7XENPTlNUe30gJFQkICR2JCA9ICRlJDt9IHRoZW4gdGhlIHZhbHVlICRpZCQgaXMgdGhlIHZhbHVlIG9mIHRoZSBjb21waWxlLXRpbWUgY29uc3RhbnQgJGUkLgolICBPdGhlcndpc2UKJSAgXGl0ZW0gJGUkIGV2YWx1YXRlcyB0byB0aGUgY3VycmVudCBiaW5kaW5nIG9mICRpZCQuICAKJSAgXGVuZHtpdGVtaXplfQpcaXRlbSBJZiAkZCQgaXMgYSBsb2NhbCB2YXJpYWJsZSBvciBmb3JtYWwgcGFyYW1ldGVyIHRoZW4gJGUkIGV2YWx1YXRlcyB0byB0aGUgY3VycmVudCBiaW5kaW5nIG9mICRpZCQuIAolXGl0ZW0gSWYgJGQkIGlzIGEgbGlicmFyeSB2YXJpYWJsZSwgbG9jYWwgdmFyaWFibGUsIG9yIGZvcm1hbCBwYXJhbWV0ZXIsIHRoZW4gJGUkIGV2YWx1YXRlcyB0byB0aGUgY3VycmVudCBiaW5kaW5nIG9mICRpZCQuIFxjb21tZW50YXJ5e1RoaXMgY2FzZSBhbHNvIGFwcGxpZXMgaWYgZCBpcyBhIGxpYnJhcnkgb3IgbG9jYWwgZnVuY3Rpb24gZGVjbGFyYXRpb24sIGFzIHRoZXNlIGFyZSBlcXVpdmFsZW50IHRvIGZ1bmN0aW9uLXZhbHVlZCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMufQpcaXRlbSBJZiAkZCQgaXMgYSBzdGF0aWMgbWV0aG9kLCB0b3AtbGV2ZWwgZnVuY3Rpb24gb3IgbG9jYWwgZnVuY3Rpb24gdGhlbiAkZSQgZXZhbHVhdGVzIHRvIHRoZSBmdW5jdGlvbiBkZWZpbmVkIGJ5ICRkJC4KXGl0ZW0gSWYgJGQkIGlzIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHN0YXRpYyB2YXJpYWJsZSwgc3RhdGljIGdldHRlciBvciBzdGF0aWMgc2V0dGVyIGRlY2xhcmVkIGluIGNsYXNzICRDJCwgdGhlbiAkZSQgaXMgZXF1aXZhbGVudCB0byB0aGUgZ2V0dGVyIGludm9jYXRpb24gKFxyZWZ7Z2V0dGVySW52b2NhdGlvbn0pICRDLmlkJC4gClxpdGVtIElmICRkJCBpcyB0aGUgZGVjbGFyYXRpb24gb2YgYSBsaWJyYXJ5IHZhcmlhYmxlLCB0b3AtbGV2ZWwgZ2V0dGVyIG9yIHRvcC1sZXZlbCBzZXR0ZXIsIHRoZW4gJGUkIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGdldHRlciBpbnZvY2F0aW9uICRpZCQuIApcaXRlbSBPdGhlcndpc2UsIGlmICRlJCBvY2N1cnMgaW5zaWRlIGEgdG9wIGxldmVsIG9yIHN0YXRpYyBmdW5jdGlvbiAoYmUgaXQgZnVuY3Rpb24sIG1ldGhvZCwgZ2V0dGVyLCAgb3Igc2V0dGVyKSBvciB2YXJpYWJsZSBpbml0aWFsaXplciwgZXZhbHVhdGlvbiBvZiAkZSQgY2F1c2VzIGEgXGNvZGV7Tm9TdWNoTWV0aG9kfSB0byBiZSB0aHJvd24uClxpdGVtIE90aGVyd2lzZSwgJGUkIGlzIGVxdWl2YWxlbnQgdG8gdGhlIHByb3BlcnR5IGV4dHJhY3Rpb24gKFxyZWZ7cHJvcGVydHlFeHRyYWN0aW9ufSkgXFRISVN7fS4kaWQkLgolIFRoaXMgaW1wbGllcyB0aGF0IHJlZmVycmluZyB0byBhbiB1bmRlZmluZWQgc3RhdGljIGdldHRlciBieSBzaW1wbGUgbmFtZSBpcyBhbiBlcnJvciwgd2hlcmVhcyBkb2luZyBzbyBieSBxdWFsaWZpZWQgbmFtZSBpcyBvbmx5IGEgd2FybmluZy4gU2FtZSB3aXRoIGFzc2lnbm1lbnRzLiAgUmV2aXNlPwpcZW5ke2l0ZW1pemV9CgpUaGUgc3RhdGljIHR5cGUgb2YgJGUkIGlzIGRldGVybWluZWQgYXMgZm9sbG93czoKClxiZWdpbntpdGVtaXplfQpcaXRlbSBJZiAkZCQgaXMgYSBjbGFzcywgdHlwZSBhbGlhcyBvciB0eXBlIHBhcmFtZXRlciB0aGUgc3RhdGljIHR5cGUgb2YgJGUkIGlzIFxjb2Rle1R5cGV9LgpcaXRlbSBJZiAkZCQgaXMgYSBsb2NhbCB2YXJpYWJsZSBvciBmb3JtYWwgcGFyYW1ldGVyIHRoZSBzdGF0aWMgdHlwZSBvZiAkZSQgaXMgdGhlIHR5cGUgb2YgdGhlIHZhcmlhYmxlICRpZCQsIHVubGVzcyAkaWQkIGlzIGtub3duIHRvIGhhdmUgc29tZSB0eXBlICRUJCwgaW4gd2hpY2ggY2FzZSB0aGUgc3RhdGljIHR5cGUgb2YgJGUkIGlzICRUJCwgcHJvdmlkZWQgdGhhdCAkVCQgaXMgbW9yZSBzcGVjaWZpYyB0aGFuIGFueSBvdGhlciB0eXBlICRTJCBzdWNoIHRoYXQgJHYkIGlzIGtub3duIHRvIGhhdmUgdHlwZSAkUyQuIApcaXRlbSBJZiAkZCQgaXMgYSBzdGF0aWMgbWV0aG9kLCB0b3AtbGV2ZWwgZnVuY3Rpb24gb3IgbG9jYWwgZnVuY3Rpb24gdGhlIHN0YXRpYyB0eXBlIG9mICRlJCBpcyB0aGUgZnVuY3Rpb24gdHlwZSBkZWZpbmVkIGJ5ICRkJC4KXGl0ZW0gSWYgJGQkIGlzIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHN0YXRpYyB2YXJpYWJsZSwgc3RhdGljIGdldHRlciBvciBzdGF0aWMgc2V0dGVyIGRlY2xhcmVkIGluIGNsYXNzICRDJCwgdGhlIHN0YXRpYyB0eXBlIG9mICRlJCBpcyB0aGUgc3RhdGljIHR5cGUgb2YgdGhlIGdldHRlciBpbnZvY2F0aW9uIChccmVme2dldHRlckludm9jYXRpb259KSAkQy5pZCQuClxpdGVtIElmICRkJCBpcyB0aGUgZGVjbGFyYXRpb24gb2YgYSBsaWJyYXJ5IHZhcmlhYmxlLCB0b3AtbGV2ZWwgZ2V0dGVyIG9yIHRvcC1sZXZlbCBzZXR0ZXIsIHRoZSBzdGF0aWMgdHlwZSBvZiAkZSQgIGlzIHRoZSBzdGF0aWMgdHlwZSBvZiB0aGUgZ2V0dGVyIGludm9jYXRpb24gJGlkJC4gClxpdGVtIE90aGVyd2lzZSwgaWYgJGUkIG9jY3VycyBpbnNpZGUgYSB0b3AgbGV2ZWwgb3Igc3RhdGljIGZ1bmN0aW9uIChiZSBpdCBmdW5jdGlvbiwgbWV0aG9kLCBnZXR0ZXIsICBvciBzZXR0ZXIpIG9yIHZhcmlhYmxlIGluaXRpYWxpemVyLCB0aGUgc3RhdGljIHR5cGUgb2YgJGUkIGlzIFxEWU5BTUlDe30uClxpdGVtIE90aGVyd2lzZSwgdGhlIHN0YXRpYyB0eXBlIG9mICRlJCBpcyB0aGUgdHlwZSBvZiB0aGUgcHJvcGVydHkgZXh0cmFjdGlvbiAoXHJlZntwcm9wZXJ0eUV4dHJhY3Rpb259KSBcVEhJU3t9LiRpZCQuClxlbmR7aXRlbWl6ZX0KCiBcY29tbWVudGFyeXtOb3RlIHRoYXQgaWYgb25lIGRlY2xhcmVzIGEgc2V0dGVyLCB3ZSBiaW5kIHRvIHRoZSBjb3JyZXNwb25kaW5nIGdldHRlciBldmVuIGlmIGl0IGRvZXMgbm90IGV4aXN0Ln0KIAogXHJhdGlvbmFsZXsKIFRoaXMgcHJldmVudHMgc2l0dWF0aW9ucyB3aGVyZSBvbmUgdXNlcyB1bmNvcnJlbGF0ZWQgc2V0dGVycyBhbmQgZ2V0dGVycy4gVGhlIGludGVudCBpcyB0byBwcmV2ZW50IGVycm9ycyB3aGVuIGEgIGdldHRlciBpbiBhIHN1cnJvdW5kaW5nIHNjb3BlIGlzIHVzZWQgYWNjaWRlbnRhbGx5LgogfQogCkl0IGlzIGEgc3RhdGljIHdhcm5pbmcgaWYgYW4gaWRlbnRpZmllciBleHByZXNzaW9uICRpZCQgb2NjdXJzIGluc2lkZSBhIHRvcCBsZXZlbCBvciBzdGF0aWMgZnVuY3Rpb24gKGJlIGl0IGZ1bmN0aW9uLCBtZXRob2QsIGdldHRlciwgb3Igc2V0dGVyKSBvciB2YXJpYWJsZSBpbml0aWFsaXplciBhbmQgdGhlcmUgaXMgbm8gZGVjbGFyYXRpb24gJGQkIHdpdGggbmFtZSAkaWQkIGluIHRoZSBsZXhpY2FsIHNjb3BlIGVuY2xvc2luZyB0aGUgZXhwcmVzc2lvbi4KClxzdWJzZWN0aW9ueyBUeXBlIFRlc3R9ClxsYWJlbHt0eXBlVGVzdH0KClRoZSB7XGVtIGlzLWV4cHJlc3Npb259IHRlc3RzIGlmIGFuIG9iamVjdCBpcyBhIG1lbWJlciBvZiBhIHR5cGUuCgogXGJlZ2lue2dyYW1tYXJ9CiB7XGJmIHR5cGVUZXN0On0KIGlzT3BlcmF0b3IgdHlwZQogLgogCiAKe1xiZiBpc09wZXJhdG9yOn0KXElTe30gYCEnPwogICAgLgogXGVuZHtncmFtbWFyfQogCiBFdmFsdWF0aW9uIG9mIHRoZSBpcy1leHByZXNzaW9uIFxjb2RleyRlJCBcSVN7fSAkVCR9IHByb2NlZWRzIGFzIGZvbGxvd3M6CgpUaGUgZXhwcmVzc2lvbiAkZSQgaXMgZXZhbHVhdGVkIHRvIGEgdmFsdWUgJHYkLiBUaGVuLCBpZiAkVCQgaXMgYSBtYWxmb3JtZWQgb3IgZGVmZXJyZWQgdHlwZSAoXHJlZntzdGF0aWNUeXBlc30pLCBhIGR5bmFtaWMgZXJyb3Igb2NjdXJzLiBPdGhlcndpc2UsIGlmIHRoZSBpbnRlcmZhY2Ugb2YgdGhlIGNsYXNzIG9mICR2JCBpcyBhIHN1YnR5cGUgb2YgJFQkLCB0aGUgaXMtZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gdHJ1ZS4gT3RoZXJ3aXNlIGl0IGV2YWx1YXRlcyB0byBmYWxzZS4KClxjb21tZW50YXJ5e0l0IGZvbGxvd3MgdGhhdCBcY29kZXskZSQgXElTe30gT2JqZWN0fSBpcyBhbHdheXMgdHJ1ZS4gVGhpcyBtYWtlcyBzZW5zZSBpbiBhIGxhbmd1YWdlIHdoZXJlIGV2ZXJ5dGhpbmcgaXMgYW4gb2JqZWN0LiAKCkFsc28gbm90ZSB0aGF0IFxjb2Rle1xOVUxMe30gXElTe30gJFQkfSBpcyBmYWxzZSB1bmxlc3MgJFQgPSBcY29kZXtPYmplY3R9JCwgJFQgPSBcY29kZXtcRFlOQU1JQ3t9fSQgb3IgJFQgPSBcY29kZXtOdWxsfSQuICBUaGUgZm9ybWVyIHR3byBhcmUgdXNlbGVzcywgYXMgaXMgYW55dGhpbmcgb2YgdGhlIGZvcm0gXGNvZGV7JGUkIFxJU3t9IE9iamVjdH0gb3IgXGNvZGV7JGUkIFxJU3t9IFxEWU5BTUlDe319LiAgVXNlcnMgc2hvdWxkIHRlc3QgZm9yIGEgbnVsbCB2YWx1ZSBkaXJlY3RseSByYXRoZXIgdGhhbiB2aWEgdHlwZSB0ZXN0cy4KfQoKVGhlIGlzLWV4cHJlc3Npb24gXGNvZGV7JGUkIFxJU3t9ISAkVCR9IGlzIGVxdWl2YWxlbnQgdG8gXGNvZGV7ISgkZSQgXElTe30gJFQkKX0uCgolIEFkZCBmbG93IGRlcGVuZGVudCB0eXBlcwoKCkxldCAkdiQgIGJlIGEgbG9jYWwgdmFyaWFibGUgb3IgYSBmb3JtYWwgcGFyYW1ldGVyLiBBbiBpcy1leHByZXNzaW9uIG9mIHRoZSBmb3JtIFxjb2RleyR2JCBcSVN7fSAkVCR9IHNob3dzIHRoYXQgJHYkICBoYXMgdHlwZSAkVCQgaWZmICRUJCBpcyBtb3JlIHNwZWNpZmljIHRoYW4gdGhlIHR5cGUgJFMkIG9mIHRoZSBleHByZXNzaW9uICR2JCBhbmQgIGJvdGggJFQgXG5lIFxEWU5BTUlDe30kIGFuZCAkUyBcbmUgXERZTkFNSUN7fSQuCgpccmF0aW9uYWxlewpUaGUgbW90aXZhdGlvbiBmb3IgdGhlIGBgc2hvd3MgdGhhdCB2IGhhcyB0eXBlIFQiIHJlbGF0aW9uIGlzIHRvIHJlZHVjZSBzcHVyaW91cyB3YXJuaW5ncyB0aGVyZWJ5IGVuYWJsaW5nIGEgbW9yZSBuYXR1cmFsIGNvZGluZyBzdHlsZS4gVGhlIHJ1bGVzIGluIHRoZSBjdXJyZW50IHNwZWNpZmljYXRpb24gYXJlIGRlbGliZXJhdGVseSBrZXB0IHNpbXBsZS4gSXQgd291bGQgYmUgdXB3YXJkbHkgY29tcGF0aWJsZSB0byByZWZpbmUgdGhlc2UgcnVsZXMgaW4gdGhlIGZ1dHVyZTsgc3VjaCBhIHJlZmluZW1lbnQgd291bGQgYWNjZXB0IG1vcmUgY29kZSB3aXRob3V0IHdhcm5pbmcsIGJ1dCBub3QgcmVqZWN0IGFueSBjb2RlIG5vdyB3YXJuaW5nLWZyZWUuCgpUaGUgcnVsZSBvbmx5IGFwcGxpZXMgdG8gbG9jYWxzIGFuZCBwYXJhbWV0ZXJzLCBhcyBmaWVsZHMgY291bGQgYmUgbW9kaWZpZWQgdmlhIHNpZGUtZWZmZWN0aW5nIGZ1bmN0aW9ucyBvciBtZXRob2RzIHRoYXQgYXJlIG5vdCBhY2Nlc3NpYmxlIHRvIGEgbG9jYWwgYW5hbHlzaXMuCgpJdCBpcyBwb2ludGxlc3MgdG8gZGVkdWNlIGEgd2Vha2VyIHR5cGUgdGhhbiB3aGF0IGlzIGFscmVhZHkga25vd24uIEZ1cnRoZXJtb3JlLCB0aGlzIHdvdWxkIGxlYWQgdG8gYSBzaXR1YXRpb24gd2hlcmUgbXVsdGlwbGUgdHlwZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCBhIHZhcmlhYmxlIGF0IGEgZ2l2ZW4gcG9pbnQsIHdoaWNoIGNvbXBsaWNhdGVzIHRoZSBzcGVjaWZpY2F0aW9uLiBIZW5jZSB0aGUgcmVxdWlyZW1lbnQgdGhhdCAkVCA8PCBTJCAod2UgdXNlICQ8PCQgcmF0aGVyIHRoYW4gc3VidHlwaW5nIGJlY2F1c2Ugc3VidHlwaW5nIGlzIG5vdCBhIHBhcnRpYWwgb3JkZXIpLgoKV2UgZG8gbm90IHdhbnQgdG8gcmVmaW5lIHRoZSB0eXBlIG9mIGEgdmFyaWFibGUgb2YgdHlwZSBcRFlOQU1JQ3t9LCBhcyB0aGlzIGNvdWxkIGxlYWQgdG8gbW9yZSB3YXJuaW5ncyByYXRoZXIgdGhhbiBsZXNzLiAgVGhlIG9wcG9zaXRlIHJlcXVpcmVtZW50LCB0aGF0ICRUIFxuZSBcRFlOQU1JQ3t9JCBpcyBhIHNhZmVndWFyZCBsZXN0ICRTJCBldmVyIGJlICRcYm90JC4KfQoKVGhlIHN0YXRpYyB0eXBlIG9mIGFuIGlzLWV4cHJlc3Npb24gaXMgXGNvZGV7Ym9vbH0uIAoKClxzdWJzZWN0aW9ueyBUeXBlIENhc3R9ClxsYWJlbHt0eXBlQ2FzdH0KClRoZSB7XGVtIGNhc3QgZXhwcmVzc2lvbn0gZW5zdXJlcyB0aGF0IGFuIG9iamVjdCBpcyBhIG1lbWJlciBvZiBhIHR5cGUuCgogXGJlZ2lue2dyYW1tYXJ9CiB7XGJmIHR5cGVDYXN0On0KIGFzT3BlcmF0b3IgdHlwZQogLgogCiAKe1xiZiBhc09wZXJhdG9yOn0KXEFTe30KICAgIC4KIFxlbmR7Z3JhbW1hcn0KIAogRXZhbHVhdGlvbiBvZiB0aGUgY2FzdCBleHByZXNzaW9uIFxjb2RleyRlJCBcQVN7fSAkVCR9IHByb2NlZWRzIGFzIGZvbGxvd3M6CgpUaGUgZXhwcmVzc2lvbiAkZSQgaXMgZXZhbHVhdGVkIHRvIGEgdmFsdWUgJHYkLiBUaGVuLCBpZiAkVCQgaXMgYSBtYWxmb3JtZWQgb3IgZGVmZXJyZWQgdHlwZSAoXHJlZntzdGF0aWNUeXBlc30pLCBhIGR5bmFtaWMgZXJyb3Igb2NjdXJzLiBPdGhlcndpc2UsIGlmIHRoZSBpbnRlcmZhY2Ugb2YgdGhlIGNsYXNzIG9mICR2JCBpcyBhIHN1YnR5cGUgb2YgJFQkLCB0aGUgY2FzdCBleHByZXNzaW9uIGV2YWx1YXRlcyB0byAkdiQuIE90aGVyd2lzZSwgaWYgJHYkIGlzIFxOVUxMe30sIHRoZSBjYXN0IGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvICR2JC4gCkluIGFsbCBvdGhlciBjYXNlcywgIGEgXGNvZGV7Q2FzdEVycm9yfSBpcyB0aHJvd24uCiAKVGhlIHN0YXRpYyB0eXBlIG9mIGEgY2FzdCBleHByZXNzaW9uICBcY29kZXskZSQgXEFTe30gJFQkfSAgaXMgJFQkLiAKCgpcc2VjdGlvbntTdGF0ZW1lbnRzfQpcbGFiZWx7c3RhdGVtZW50c30KCiBcYmVnaW57Z3JhbW1hcn0Ke1xiZiBzdGF0ZW1lbnRzOn0KICAgICAgc3RhdGVtZW50KgogICAgLgoKCntcYmYgc3RhdGVtZW50On0KICAgICAgbGFiZWwqIG5vbkxhYmVsbGVkU3RhdGVtZW50CiAgICAuCgp7XGJmIG5vbkxhYmVsbGVkU3RhdGVtZW50On1ibG9jazsgCiAgICAgIGxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbjsKICAgICAgZm9yU3RhdGVtZW50OwogICAgICB3aGlsZVN0YXRlbWVudDsKICAgICAgZG9TdGF0ZW1lbnQ7CiAgICAgIHN3aXRjaFN0YXRlbWVudDsKICAgICAgaWZTdGF0ZW1lbnQ7CiAgICAgIHJldGhyb3dTdGF0ZW1lbnQ7CiAgICAgIHRyeVN0YXRlbWVudDsKICAgICAgYnJlYWtTdGF0ZW1lbnQ7CiAgICAgIGNvbnRpbnVlU3RhdGVtZW50OwogICAgICByZXR1cm5TdGF0ZW1lbnQ7CiAgICAgIGV4cHJlc3Npb25TdGF0ZW1lbnQ7CiAgICAgIGFzc2VydFN0YXRlbWVudDsKICAgICAgbG9jYWxGdW5jdGlvbkRlY2xhcmF0aW9uCiAgICAuCiBcZW5ke2dyYW1tYXJ9CiAKIFxzdWJzZWN0aW9ue0Jsb2Nrc30KIFxsYWJlbHtibG9ja3N9CiAKIEEge1xlbSBibG9jayBzdGF0ZW1lbnR9IHN1cHBvcnRzIHNlcXVlbmNpbmcgb2YgY29kZS4KCkV4ZWN1dGlvbiBvZiBhIGJsb2NrIHN0YXRlbWVudCAkXHtzXzEsIFxsZG90cywgIHNfblx9JCBwcm9jZWVkcyBhcyBmb2xsb3dzOgoKRm9yICRpIFxpbiAxIC4uIG4sIHNfaSQgaXMgZXhlY3V0ZWQuCgpBIGJsb2NrIHN0YXRlbWVudCBpbnRyb2R1Y2VzIGEgbmV3IHNjb3BlLCB3aGljaCBpcyBuZXN0ZWQgaW4gdGhlIGxleGljYWxseSBlbmNsb3Npbmcgc2NvcGUgaW4gd2hpY2ggdGhlIGJsb2NrIHN0YXRlbWVudCBhcHBlYXJzLgoKCgogXHN1YnNlY3Rpb257RXhwcmVzc2lvbiBTdGF0ZW1lbnRzfQogXGxhYmVse2V4cHJlc3Npb25TdGF0ZW1lbnRzfQogCkFuIHtcZW0gZXhwcmVzc2lvbiBzdGF0ZW1lbnR9IGNvbnNpc3RzIG9mIGFuIGV4cHJlc3Npb24gb3RoZXIgdGhhbiBhIG5vbi1jb25zdGFudCBtYXAgbGl0ZXJhbCAoXHJlZnttYXBzfSkgdGhhdCBoYXMgbm8gZXhwbGljaXQgdHlwZSBhcmd1bWVudHMuIAoKXHJhdGlvbmFsZXsKVGhlIHJlc3RyaWN0aW9uIG9uIG1hcHMgIGlzIGRlc2lnbmVkIHRvIHJlc29sdmUgYW4gYW1iaWd1aXR5IGluIHRoZSBncmFtbWFyLCB3aGVuIGEgc3RhdGVtZW50IGJlZ2lucyB3aXRoIFx7Lgp9CgogXGJlZ2lue2dyYW1tYXJ9CntcYmYgZXhwcmVzc2lvblN0YXRlbWVudDp9CiAgZXhwcmVzc2lvbj8gYHtcZXNjYXBlZ3JhbW1hciA7fScKICAuCiBcZW5ke2dyYW1tYXJ9CiAKRXhlY3V0aW9uIG9mIGFuIGV4cHJlc3Npb24gc3RhdGVtZW50IFxjb2RleyRlJDt9IHByb2NlZWRzIGJ5IGV2YWx1YXRpbmcgJGUkLiAKCkl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIGEgbm9uLWNvbnN0YW50IG1hcCBsaXRlcmFsIHRoYXQgaGFzIG5vIGV4cGxpY2l0IHR5cGUgYXJndW1lbnRzIGFwcGVhcnMgaW4gYSBwbGFjZSB3aGVyZSBhIHN0YXRlbWVudCBpcyBleHBlY3RlZC4KClxzdWJzZWN0aW9ue0xvY2FsIFZhcmlhYmxlIERlY2xhcmF0aW9ufQpcbGFiZWx7bG9jYWxWYXJpYWJsZURlY2xhcmF0aW9ufQoKCkEge1xlbSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBzdGF0ZW1lbnQgfWRlY2xhcmVzIGEgbmV3IGxvY2FsIHZhcmlhYmxlLgoKIFxiZWdpbntncmFtbWFyfQp7XGJmIGxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbjp9CiAgICBpbml0aWFsaXplZFZhcmlhYmxlRGVjbGFyYXRpb24ge1xlc2NhcGVncmFtbWFyJzsnfQogIC4KIFxlbmR7Z3JhbW1hcn0KIAogRXhlY3V0aW5nIGEgdmFyaWFibGUgZGVjbGFyYXRpb24gc3RhdGVtZW50IG9mIG9uZSBvZiB0aGUgZm9ybXMgIFxWQVJ7fSAkdiA9IGU7JCwgJFQkICR2ID0gZTsgJCwgXENPTlNUe30gICR2ID0gZTskLCBcQ09OU1R7fSAkVCQgJHYgPSBlOyQsIFxGSU5BTHt9ICAkdiA9IGU7JCBvciBcRklOQUx7fSAkVCQgJHYgPSBlOyQgcHJvY2VlZHMgYXMgZm9sbG93czoKIAogVGhlIGV4cHJlc3Npb24gJGUkIGlzIGV2YWx1YXRlZCB0byBhbiBvYmplY3QgJG8kLiBUaGVuLCB0aGUgdmFyaWFibGUgJHYkIGlzIHNldCB0byAkbyQuCiAKIEEgdmFyaWFibGUgZGVjbGFyYXRpb24gc3RhdGVtZW50IG9mIHRoZSBmb3JtIFxWQVJ7fSAkdjskIGlzIGVxdWl2YWxlbnQgdG8gXFZBUnt9ICR2ID0gXE5VTEx7fTskLiBBIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHN0YXRlbWVudCBvZiB0aGUgZm9ybSAkVCQgJHY7JCBpcyBlcXVpdmFsZW50IHRvICRUJCAkdiA9IFxOVUxMe307JC4gCgpcY29tbWVudGFyeXsKVGhpcyBob2xkcyByZWdhcmRsZXNzIG9mIHRoZSB0eXBlICRUJC4gRm9yIGV4YW1wbGUsIFxjb2Rle2ludCBpO30gZG9lcyBub3QgY2F1c2UgXGNvZGV7aX0gdG8gYmUgaW5pdGlhbGl6ZWQgdG8gemVyby4gSW5zdGVhZCwgXGNvZGV7aX0gaXMgaW5pdGlhbGl6ZWQgdG8gXE5VTEx7fSwganVzdCBhcyBpZiB3ZSBoYWQgd3JpdHRlbiBcVkFSe30gXGNvZGV7aTt9IG9yIFxjb2Rle09iamVjdCBpO30gb3IgXGNvZGV7Q29sbGVjdGlvbiQ8JFN0cmluZyQ+JCBpO30uCn0KClxyYXRpb25hbGV7ClRvIGRvIG90aGVyd2lzZSB3b3VsZCB1bmRlcm1pbmUgdGhlIG9wdGlvbmFsbHkgdHlwZWQgbmF0dXJlIG9mIERhcnQsIGNhdXNpbmcgdHlwZSBhbm5vdGF0aW9ucyB0byBtb2RpZnkgcHJvZ3JhbSBiZWhhdmlvci4KfQoKJUEgdmFyaWFibGUgZGVjbGFyYXRpb24gc3RhdGVtZW50IG9mIG9uZSBvZiB0aGUgZm9ybXMgJFQkICR2OyQsICRUJCAkdiA9IGU7JCwgXENPTlNUe30gJFQkICR2ID0gZTskLCAgb3IgXEZJTkFMe30gJFQkICR2ID0gZTskIGNhdXNlcyBhIG5ldyBnZXR0ZXIgbmFtZWQgJHYkIHdpdGggc3RhdGljIHJldHVybiB0eXBlICRUJCB0byBiZSBhZGRlZCB0byB0aGUgaW5uZXJtb3N0IGVuY2xvc2luZyBzY29wZSBhdCB0aGUgcG9pbnQgZm9sbG93aW5nIHRoZSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBzdGF0ZW1lbnQuIFRoZSByZXN1bHQgb2YgZXhlY3V0aW5nIHRoaXMgZ2V0dGVyIGlzIHRoZSB2YWx1ZSBzdG9yZWQgaW4gJHYkLiAKCiVBIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHN0YXRlbWVudCBcVkFSe30gJHY7JCwgXFZBUnt9ICR2ID0gZTskLCBcQ09OU1R7fSAgJHYgPSBlOyQgb3IgIFxGSU5BTHt9ICAkdiA9IGU7JCBjYXVzZXMgYSBuZXcgZ2V0dGVyIG5hbWVkICR2JCB3aXRoIHN0YXRpYyByZXR1cm4gdHlwZSAgXERZTkFNSUN7fSB0byBiZSBhZGRlZCB0byB0aGUgaW5uZXJtb3N0IGVuY2xvc2luZyBzY29wZSBhdCB0aGUgcG9pbnQgZm9sbG93aW5nIHRoZSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBzdGF0ZW1lbnQuIFRoZSByZXN1bHQgb2YgZXhlY3V0aW5nIHRoaXMgZ2V0dGVyICBpcyB0aGUgdmFsdWUgc3RvcmVkIGluICR2JC4gCgolQSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBzdGF0ZW1lbnQgb2Ygb25lIG9mIHRoZSBmb3JtcyAkVCQgJHY7JCwgb3IgJFQkICR2ID0gZTskIGNhdXNlcyBhIG5ldyBzZXR0ZXIgbmFtZWQgJHY9JCB3aXRoIGFyZ3VtZW50IHR5cGUgJFQkIHRvIGJlIGFkZGVkIHRvIHRoZSBpbm5lcm1vc3QgZW5jbG9zaW5nIHNjb3BlIGF0IHRoZSBwb2ludCBmb2xsb3dpbmcgdGhlIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHN0YXRlbWVudC4gVGhlIGVmZmVjdCBvZiBleGVjdXRpbmcgdGhpcyBzZXR0ZXIgIGlzIHRvIHN0b3JlIGl0cyBhcmd1bWVudCBpbiAkdiQuIAoKJUEgdmFyaWFibGUgZGVjbGFyYXRpb24gc3RhdGVtZW50IFxWQVJ7fSAkdjskLCBcVkFSe30gJHYgPSBlOyQsIFxDT05TVHt9ICAkdiA9IGU7JCBvciAgXEZJTkFMe30gICR2ID0gZTskIGNhdXNlcyBhIG5ldyBzZXR0ZXIgbmFtZWQgJHY9JCB3aXRoICBhcmd1bWVudCB0eXBlICBcRFlOQU1JQ3t9IHRvIGJlIGFkZGVkIHRvIHRoZSBpbm5lcm1vc3QgZW5jbG9zaW5nIHNjb3BlIGF0IHRoZSBwb2ludCBmb2xsb3dpbmcgdGhlIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHN0YXRlbWVudC4gVGhlIGVmZmVjdCBvZiBleGVjdXRpbmcgdGhpcyBzZXR0ZXIgIGlzIHRvIHN0b3JlIGl0cyBhcmd1bWVudCBpbiAkdiQuIAoKJVxyYXRpb25hbGV7CiAlVGhlIHVzZSBvZiBnZXR0ZXJzIGFuZCBzZXR0ZXJzIGhlcmUgaXMgYSBkZXZpY2UgdG8gaGVscCBtYWtlIHRoZSBzcGVjaWZpY2F0aW9uIG1vcmUgdW5pZm9ybS4gSW50cm9kdWNpbmcgZ2V0dGVycyBhbmQgc2V0dGVycyBmb3IgbG9jYWwgdmFyaWFibGVzIGhhcyBubyBwZXJmb3JtYW5jZSBjb25zZXF1ZW5jZXMsIHNpbmNlIHRoZXkgY2FuIG5ldmVyIGJlIG92ZXJyaWRkZW4sIGFuZCBzbyBjYW4gYWx3YXlzIGJlIG9wdGltaXplZCBhd2F5LiAgSXQgaXMgbm90IHBvc3NpYmxlIHRvIGRlY2xhcmUgYSBsb2NhbCBnZXR0ZXIgb3Igc2V0dGVyIGV4cGxpY2l0bHksIHNpbmNlIHRoZXJlIGlzIGxpdHRsZSByZWFzb24gdG8gZXZlciBkbyBzby4KJX0KCgpcc3Vic2VjdGlvbntMb2NhbCBGdW5jdGlvbiBEZWNsYXJhdGlvbn0KClxsYWJlbHtsb2NhbEZ1bmN0aW9uRGVjbGFyYXRpb259CgpBIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIHN0YXRlbWVudCBkZWNsYXJlcyBhIG5ldyBsb2NhbCBmdW5jdGlvbiAoXHJlZntmdW5jdGlvbkRlY2xhcmF0aW9uc30pLiAKCiBcYmVnaW57Z3JhbW1hcn0Ke1xiZiBsb2NhbEZ1bmN0aW9uRGVjbGFyYXRpb246fQogICAgZnVuY3Rpb25TaWduYXR1cmUgZnVuY3Rpb25Cb2R5CiAgLgogXGVuZHtncmFtbWFyfQogCkEgZnVuY3Rpb24gZGVjbGFyYXRpb24gc3RhdGVtZW50IG9mIG9uZSBvZiB0aGUgZm9ybXMgJGlkJCAkc2lnbmF0dXJlJCAkXHsgc3RhdGVtZW50cyBcfSQgb3IgJFQkICRpZCQgJHNpZ25hdHVyZSQgJFx7IHN0YXRlbWVudHMgXH0kIGNhdXNlcyBhIG5ldyBmdW5jdGlvbiBuYW1lZCAkaWQkIHRvIGJlIGFkZGVkIHRvIHRoZSBpbm5lcm1vc3QgZW5jbG9zaW5nIHNjb3BlLiBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciB0byByZWZlcmVuY2UgYSBsb2NhbCBmdW5jdGlvbiBiZWZvcmUgaXRzIGRlY2xhcmF0aW9uLiAKCgpcY29tbWVudGFyeXsgVGhpcyBpbXBsaWVzIHRoYXQgbG9jYWwgZnVuY3Rpb25zIGNhbiBiZSBkaXJlY3RseSByZWN1cnNpdmUsIGJ1dCBub3QgbXV0dWFsbHkgcmVjdXJzaXZlLiBDb25zaWRlciB0aGVzZSBleGFtcGxlczoKfQoKXGJlZ2lue2RhcnRDb2RlfQpmKHgpID0kPiQgeCsrOyAgLy8gYSB0b3AgbGV2ZWwgZnVuY3Rpb24KdG9wKCkgXHsgLy8gYW5vdGhlciB0b3AgbGV2ZWwgZnVuY3Rpb24KICBmKDMpOyAvLyBpbGxlZ2FsCiAgZih4KSAkPT4kIHggJD4kIDA/IHgqZih4LTEpOiAxOyAgLy8gcmVjdXJzaW9uIGlzIGxlZ2FsCiAgZzEoeCkgJD0+JCBoKHgsIDEpOyAvLyBlcnJvcjogaCBpcyBub3QgZGVjbGFyZWQgeWV0CiAgaCh4LCBuKSAkPT4kIHggJD4kIDE/IGgoeC0xLCBuKngpOiBuOyAvLyBhZ2FpbiwgcmVjdXJzaW9uIGlzIGZpbmUKICBnMih4KSAkPT4kIGgoeCwgMSk7IC8vIGxlZ2FsCiAgCiAgcDEoeCkgJD0+JCBxKHgseCk7IC8vIGlsbGVnYWwKICBxMShhLCBiKSQgPT4kIGEgJD4kIDAgPyBwMShhLTEpOiBiOyAvLyBmaW5lCgogIHEyKGEsIGIpICQ9PiQgYSAkPiQgMCA/IHAyKGEtMSk6IGI7IC8vIGlsbGVnYWwKICBwMSh4KSAkPT4kIHEyKHgseCk7IC8vIGZpbmUgIApcfQpcZW5ke2RhcnRDb2RlfQoKXGNvbW1lbnRhcnl7ClRoZXJlIGlzIG5vIHdheSB0byB3cml0ZSBhIHBhaXIgb2YgbXV0dWFsbHkgcmVjdXJzaXZlIGxvY2FsIGZ1bmN0aW9ucywgYmVjYXVzZSBvbmUgYWx3YXlzIGhhcyB0byBjb21lIGJlZm9yZSB0aGUgb3RoZXIgaXMgZGVjbGFyZWQuIFRoZXNlIGNhc2VzIGFyZSBxdWl0ZSByYXJlLCBhbmQgY2FuIGFsd2F5cyBiZSBtYW5hZ2VkIGJ5IGRlZmluaW5nIGEgcGFpciBvZiB2YXJpYWJsZXMgZmlyc3QsIHRoZW4gYXNzaWduaW5nIHRoZW0gYXBwcm9wcmlhdGUgY2xvc3VyZXM6Cn0KClxiZWdpbntkYXJ0Q29kZX0KdG9wMigpIFx7IC8vIGEgdG9wIGxldmVsIGZ1bmN0aW9uCiBcVkFSe30gcCwgcTsgIAogIHAgPSAoeCkgJD0+JCBxKHgseCk7IAogIHEgPSAoYSwgYikgJD0+JCBhICQ+JCAwID8gcChhLTEpOiBiOyAKClx9ClxlbmR7ZGFydENvZGV9CgpccmF0aW9uYWxlewpUaGUgIHJ1bGVzIGZvciBsb2NhbCBmdW5jdGlvbnMgZGlmZmVyIHNsaWdodGx5IGZyb20gdGhvc2UgZm9yIGxvY2FsIHZhcmlhYmxlcyBpbiB0aGF0IGEgZnVuY3Rpb24gY2FuIGJlIGFjY2Vzc2VkIHdpdGhpbiBpdHMgZGVjbGFyYXRpb24gYnV0IGEgdmFyaWFibGUgY2FuIG9ubHkgYmUgYWNjZXNzZWQgYWZ0ZXIgaXRzIGRlY2xhcmF0aW9uLiBUaGlzIGlzIGJlY2F1c2UgcmVjdXJzaXZlIGZ1bmN0aW9ucyBhcmUgdXNlZnVsIHdoZXJlYXMgcmVjdXJzaXZlbHkgZGVmaW5lZCB2YXJpYWJsZXMgYXJlIGFsbW9zdCBhbHdheXMgZXJyb3JzLiAgSXQgdGhlcmVmb3JlIG1ha2VzIHNlbnNlIHRvIGhhcm1vbml6ZSB0aGUgcnVsZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucyB3aXRoIHRob3NlIGZvciBmdW5jdGlvbnMgaW4gZ2VuZXJhbCByYXRoZXIgdGhhbiB3aXRoIHRoZSBydWxlcyBmb3IgbG9jYWwgdmFyaWFibGVzLgp9CgolIGVsYWJvcmF0ZSBvbiBmdW5jdGlvbiBpZGVudGl0eSBhbmQgZXF1YWxpdHksIHJ1bnRpbWUgdHlwZS4gTGlrZXdzaWUgaW4gZnVuY3Rpb24gZXhwcmVzc2lvbnMgKGNsb3N1cmVzKSBhbmQgZGVjbGFyYXRpb25zCgpcc3Vic2VjdGlvbntJZn0KXGxhYmVse2lmfQoKVGhlIHtcZW0gaWYgc3RhdGVtZW50fSBhbGxvd3MgZm9yIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbiBvZiBzdGF0ZW1lbnRzLgoKXGJlZ2lue2dyYW1tYXJ9CntcYmYgaWZTdGF0ZW1lbnQ6fQogICAgICBcSUZ7fSBgKCcgZXhwcmVzc2lvbiBgKScgc3RhdGVtZW50ICggXEVMU0V7fSBzdGF0ZW1lbnQpPyAlIHdlIGNvdWxkIGFsbG93IHRvcCBsZXZlbCBleHByZXNzaW9uCiAgICAuCiBcZW5ke2dyYW1tYXJ9CiAKRXhlY3V0aW9uIG9mIGFuIGlmIHN0YXRlbWVudCBvZiB0aGUgZm9ybSAgXGNvZGUge1xJRnt9ICh9JGIkXGNvZGV7KX0kc18xJCBcY29kZXtcRUxTRXt9IH0gJHNfMiQgcHJvY2VlZHMgYXMgZm9sbG93czoKIAogRmlyc3QsIHRoZSBleHByZXNzaW9uICRiJCBpcyBldmFsdWF0ZWQgdG8gYW4gb2JqZWN0ICRvJC4gVGhlbiwgJG8kIGlzICBzdWJqZWN0ZWQgdG8gYm9vbGVhbiBjb252ZXJzaW9uIChccmVme2Jvb2xlYW5Db252ZXJzaW9ufSksIHByb2R1Y2luZyBhbiBvYmplY3QgJHIkLiBJZiAkciQgaXMgXFRSVUV7fSwgdGhlbiB0aGUgc3RhdGVtZW50ICRce3NfMVx9JCBpcyBleGVjdXRlZCwgb3RoZXJ3aXNlIHN0YXRlbWVudCAkXHtzXzJcfSQgaXMgZXhlY3V0ZWQuCgogCiBcY29tbWVudGFyeSB7CiBQdXQgYW5vdGhlciB3YXksIFxjb2RlIHtcSUZ7fSAofSRiJFxjb2Rleyl9JHNfMSQgXGNvZGV7XEVMU0V7fSB9ICRzXzIkIGlzIGVxdWl2YWxlbnQgdG8KIFxjb2RlIHtcSUZ7fSAofSRiJFxjb2Rleyl9JFx7c18xXH0kIFxjb2Rle1xFTFNFe30gfSAkXHtzXzJcfSQKIH0KIAogXHJhdGlvbmFsZSB7CiBUaGUgcmVhc29uIGZvciB0aGlzIGVxdWl2YWxlbmNlIGlzIHRvIGNhdGNoIGVycm9ycyBzdWNoIGFzCiB9CiBcYmVnaW57ZGFydENvZGV9ClxWT0lEe30gbWFpbigpIFx7CiAgXElGe30gKHNvbWVQcmVkaWNhdGUpIAogICAgXFZBUnt9IHYgPSAyOwogIHByaW50KHYpOwpcfQpcZW5ke2RhcnRDb2RlfQoKXHJhdGlvbmFsZSB7ClVuZGVyIHJlYXNvbmFibGUgc2NvcGUgcnVsZXMgIHN1Y2ggY29kZSBpcyBwcm9ibGVtYXRpYy4gSWYgd2UgYXNzdW1lIHRoYXQgXGNvZGV7dn0gaXMgZGVjbGFyZWQgaW4gdGhlIHNjb3BlIG9mIHRoZSBtZXRob2QgXGNvZGV7bWFpbigpfSwgdGhlbiB3aGVuIFxjb2Rle3NvbWVQcmVkaWNhdGV9IGlzIGZhbHNlLCBcY29kZXt2fSB3aWxsIGJlIHVuaW5pdGlhbGl6ZWQgd2hlbiBhY2Nlc3NlZC4gIFRoZSBjbGVhbmVzdCBhcHByb2FjaCB3b3VsZCBiZSB0byByZXF1aXJlIGEgYmxvY2sgZm9sbG93aW5nIHRoZSB0ZXN0LCByYXRoZXIgdGhhbiBhbiBhcmJpdHJhcnkgc3RhdGVtZW50LiBIb3dldmVyLCB0aGlzIGdvZXMgYWdhaW5zdCBsb25nIHN0YW5kaW5nIGN1c3RvbSwgdW5kZXJtaW5pbmcgRGFydCdzIGdvYWwgb2YgZmFtaWxpYXJpdHkuICBJbnN0ZWFkLCB3ZSBjaG9vc2UgdG8gaW5zZXJ0IGEgYmxvY2ssIGludHJvZHVjaW5nIGEgc2NvcGUsICBhcm91bmQgdGhlIHN0YXRlbWVudCBmb2xsb3dpbmcgdGhlIHByZWRpY2F0ZSAoYW5kIHNpbWlsYXJseSBmb3IgXEVMU0V7fSBhbmQgbG9vcHMpLiBUaGlzIHdpbGwgY2F1c2UgYm90aCBhIHdhcm5pbmcgYW5kIGEgcnVudGltZSBlcnJvciBpbiB0aGUgY2FzZSBhYm92ZS4gIE9mIGNvdXJzZSwgaWYgdGhlcmUgaXMgYSBkZWNsYXJhdGlvbiBvZiBcY29kZXt2fSBpbiB0aGUgc3Vycm91bmRpbmcgc2NvcGUsIHByb2dyYW1tZXJzIG1pZ2h0IHN0aWxsIGJlIHN1cnByaXNlZC4gV2UgZXhwZWN0IHRvb2xzIHRvIGhpZ2hsaWdodCBjYXNlcyBvZiBzaGFkb3dpbmcgdG8gaGVscCBhdm9pZCBzdWNoIHNpdHVhdGlvbnMuCiB9CiAKICBJdCBpcyBhIHN0YXRpYyB0eXBlIHdhcm5pbmcgaWYgdGhlIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24gJGIkIG1heSBub3QgYmUgYXNzaWduZWQgdG8gXGNvZGV7Ym9vbH0uICAKICAKSWY6ClxiZWdpbntpdGVtaXplfQpcaXRlbSAgJGIkIHNob3dzIHRoYXQgYSB2YXJpYWJsZSAkdiQgaGFzIHR5cGUgJFQkLgpcaXRlbSAgJHYkIGlzIG5vdCBwb3RlbnRpYWxseSBtdXRhdGVkIGluICRzXzEkIG9yIHdpdGhpbiBhIGNsb3N1cmUuClxpdGVtIElmIHRoZSB2YXJpYWJsZSAkdiQgaXMgYWNjZXNzZWQgYnkgYSBjbG9zdXJlIGluICRzXzEkIHRoZW4gdGhlIHZhcmlhYmxlICR2JCBpcyBub3QgcG90ZW50aWFsbHkgbXV0YXRlZCBhbnl3aGVyZSBpbiB0aGUgc2NvcGUgb2YgJHYkLiAKXGVuZHtpdGVtaXplfQp0aGVuIHRoZSB0eXBlIG9mICR2JCBpcyBrbm93biB0byBiZSAkVCQgaW4gJHNfMSQuICAKCiBBbiBpZiBzdGF0ZW1lbnQgb2YgdGhlIGZvcm0gIFxjb2RlIHtcSUZ7fSAofSRiJFxjb2Rleyl9JHNfMSQgaXMgZXF1aXZhbGVudCB0byB0aGUgaWYgc3RhdGVtZW50ICAKIAogXGNvZGUge1xJRnt9ICh9JGIkXGNvZGV7KX0kc18xJCBcY29kZXtcRUxTRXt9IFx7XH19LgogICAgIAoKICAgIApcc3Vic2VjdGlvbntGb3J9ClxsYWJlbHtmb3J9CgpUaGUge1xlbSBmb3Igc3RhdGVtZW50fSBzdXBwb3J0cyBpdGVyYXRpb24uCgpcYmVnaW57Z3JhbW1hcn0Ke1xiZiBmb3JTdGF0ZW1lbnQ6fQogICAgIFxGT1J7fSBgKCcgZm9yTG9vcFBhcnRzIGApJyBzdGF0ZW1lbnQKICAgIC4KCntcYmYgZm9yTG9vcFBhcnRzOn1mb3JJbml0aWFsaXplclN0YXRlbWVudCBleHByZXNzaW9uPyBge1xlc2NhcGVncmFtbWFyIDt9JyBleHByZXNzaW9uTGlzdD87CiAgICAgIGRlY2xhcmVkSWRlbnRpZmllciBcSU57fSBleHByZXNzaW9uOwogICAgICBpZGVudGlmaWVyIFxJTnt9IGV4cHJlc3Npb24KICAgIC4KCntcYmYgZm9ySW5pdGlhbGl6ZXJTdGF0ZW1lbnQ6fWxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbiBge1xlc2NhcGVncmFtbWFyIDt9JzsKICAgICAgZXhwcmVzc2lvbj8gYHtcZXNjYXBlZ3JhbW1hciA7fScKICAgIC4KIFxlbmR7Z3JhbW1hcn0KIAogVGhlIGZvciBzdGF0ZW1lbnQgaGFzIHR3byBmb3JtcyAtIHRoZSB0cmFkaXRpb25hbCBmb3IgbG9vcCBhbmQgdGhlIGZvci1pbiBzdGF0ZW1lbnQuCgpcc3Vic3Vic2VjdGlvbntGb3IgTG9vcH0KXGxhYmVse2Zvckxvb3B9CgoKRXhlY3V0aW9uIG9mIGEgZm9yIHN0YXRlbWVudCBvZiB0aGUgZm9ybSAgIFxjb2RleyBcRk9Se30gKFxWQVJ7fSAkdiA9IGVfMCQgOyAkYyQ7ICRlJCkgJHMkfSBwcm9jZWVkcyBhcyBmb2xsb3dzOgoKSWYgJGMkIGlzIGVtcHR5IHRoZW4gbGV0ICRjXlxwcmltZSQgYmUgXFRSVUV7fSBvdGhlcndpc2UgbGV0ICAkY15ccHJpbWUkIGJlICRjJC4KCkZpcnN0IHRoZSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBzdGF0ZW1lbnQgXFZBUnt9ICR2ID0gZV8wJCBpcyBleGVjdXRlZC4gVGhlbjoKXGJlZ2lue2VudW1lcmF0ZX0KXGl0ZW0KXGxhYmVse2JlZ2luRm9yfQpJZiB0aGlzIGlzIHRoZSBmaXJzdCBpdGVyYXRpb24gb2YgdGhlIGZvciBsb29wLCBsZXQgJHZeXHByaW1lJCBiZSAkdiQuIE90aGVyd2lzZSwgIGxldCAkdl5ccHJpbWUkIGJlIHRoZSB2YXJpYWJsZSAkdl57XHByaW1lXHByaW1lfSQgY3JlYXRlZCBpbiB0aGUgcHJldmlvdXMgZXhlY3V0aW9uIG9mIHN0ZXAgXHJlZnthbGxvY2F0ZUZyZXNoVmFyfS4KXGl0ZW0KVGhlIGV4cHJlc3Npb24gJFt2XlxwcmltZS92XWMkIGlzIGV2YWx1YXRlZCBhbmQgc3ViamVjdGVkIHRvIGJvb2xlYW4gY29udmVyc2lvbiAoXHJlZntib29sZWFuc30pLiBJZiB0aGUgcmVzdWx0IGlzIFxGQUxTRXt9LCB0aGUgZm9yIGxvb3AgY29tcGxldGVzLiBPdGhlcndpc2UsIGV4ZWN1dGlvbiBjb250aW51ZXMgYXQgc3RlcCAgICAKXHJlZntiZWdpbkl0ZXJhdGlvbn0uClxpdGVtClxsYWJlbHtiZWdpbkl0ZXJhdGlvbn0KVGhlIHN0YXRlbWVudCAkW3ZeXHByaW1lL3ZdXHtzXH0kIGlzIGV4ZWN1dGVkLgpcaXRlbQpcbGFiZWx7YWxsb2NhdGVGcmVzaFZhcn0KTGV0ICR2XntccHJpbWVccHJpbWV9JCBiZSBhIGZyZXNoIHZhcmlhYmxlLiAgJHZee1xwcmltZVxwcmltZX0kIGlzIGJvdW5kIHRvIHRoZSB2YWx1ZSBvZiAkdl5ccHJpbWUkLgpcaXRlbQpUaGUgZXhwcmVzc2lvbiAkW3Zee1xwcmltZVxwcmltZX0vdl1lJCBpcyBldmFsdWF0ZWQsIGFuZCB0aGUgcHJvY2VzcyByZWN1cnNlcyBhdCBzdGVwCiAgXHJlZntiZWdpbkZvcn0uClxlbmR7ZW51bWVyYXRlfQoKXHJhdGlvbmFsZXsKVGhlIGRlZmluaXRpb24gYWJvdmUgaXMgaW50ZW5kZWQgdG8gcHJldmVudCB0aGUgY29tbW9uIGVycm9yIHdoZXJlIHVzZXJzIGNyZWF0ZSBhIGNsb3N1cmUgaW5zaWRlIGEgZm9yIGxvb3AsIGludGVuZGluZyB0byBjbG9zZSBvdmVyIHRoZSBjdXJyZW50IGJpbmRpbmcgb2YgdGhlIGxvb3AgdmFyaWFibGUsIGFuZCBmaW5kICh1c3VhbGx5IGFmdGVyIGEgcGFpbmZ1bCBwcm9jZXNzIG9mIGRlYnVnZ2luZyBhbmQgbGVhcm5pbmcpIHRoYXQgYWxsIHRoZSBjcmVhdGVkIGNsb3N1cmVzIGhhdmUgY2FwdHVyZWQgdGhlIHNhbWUgdmFsdWUgLSB0aGUgb25lIGN1cnJlbnQgaW4gdGhlIGxhc3QgaXRlcmF0aW9uIGV4ZWN1dGVkLgoKSW5zdGVhZCwgZWFjaCBpdGVyYXRpb24gaGFzIGl0cyBvd24gZGlzdGluY3QgdmFyaWFibGUuICBUaGUgZmlyc3QgaXRlcmF0aW9uIHVzZXMgdGhlIHZhcmlhYmxlIGNyZWF0ZWQgYnkgdGhlIGluaXRpYWwgZGVjbGFyYXRpb24uIFRoZSBleHByZXNzaW9uIGV4ZWN1dGVkIGF0IHRoZSBlbmQgb2YgZWFjaCBpdGVyYXRpb24gdXNlcyBhIGZyZXNoIHZhcmlhYmxlICR2XntccHJpbWVccHJpbWV9JCwgYm91bmQgdG8gdGhlIHZhbHVlIG9mIHRoZSBjdXJyZW50IGl0ZXJhdGlvbiB2YXJpYWJsZSwgYW5kIHRoZW4gbW9kaWZpZXMgJHZee1xwcmltZVxwcmltZX0kIGFzIHJlcXVpcmVkIGZvciB0aGUgbmV4dCBpdGVyYXRpb24uCn0KCkl0IGlzIGEgc3RhdGljIHdhcm5pbmcgaWYgdGhlIHN0YXRpYyB0eXBlIG9mICRjJCBtYXkgbm90IGJlIGFzc2lnbmVkIHRvIFxjZHtib29sfS4KCiVBIGZvciBzdGF0ZW1lbnQgb2YgdGhlIGZvcm0gXGNvZGV7IFxGT1J7fSAoJGQkIDsgJGMkOyAkZSQpICRzJH0gaXMgZXF1aXZhbGVudCB0byB0aGUgdGhlIGZvbGxvd2luZyBjb2RlOgoKJVxjb2RlewolXHskZCQ7CiVcV0hJTEV7fSAoJGMkKSBcewolICAgXHskcyRcfQolICAgJGUkOwolXH1cfQolfQoKJUlmICRjJCBpcyBlbXB0eSwgaXQgaXMgaW50ZXJwcmV0ZWQgYXMgXFRSVUV7fS4KClxzdWJzdWJzZWN0aW9ue0Zvci1pbn0KXGxhYmVse2Zvci1pbn0KCkEgZm9yIHN0YXRlbWVudCBvZiB0aGUgZm9ybSBcY29kZXsgXEZPUnt9ICgkZmluYWxDb25zdFZhck9yVHlwZT8kIGlkIFxJTnt9ICRlJCkgJHMkfSBpcyBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmcgY29kZTogCgpcYmVnaW57ZGFydENvZGV9CnZhciBuMCA9ICRlJC5pdGVyYXRvcjsKXFdISUxFe30gKG4wLm1vdmVOZXh0KCkpIFx7CiAgICRmaW5hbENvbnN0VmFyT3JUeXBlPyQgaWQgPSBuMC5jdXJyZW50OwogICAkcyQgClx9ClxlbmR7ZGFydENvZGV9CndoZXJlIFxjb2Rle24wfSBpcyBhbiBpZGVudGlmaWVyIHRoYXQgZG9lcyBub3Qgb2NjdXIgYW55d2hlcmUgaW4gdGhlIHByb2dyYW0uCgpcY29tbWVudGFyeXsKTm90ZSB0aGF0IGluIGZhY3QsIHVzaW5nIGEgIFxDT05TVHt9IHZhcmlhYmxlIHdvdWxkIGdpdmUgcmlzZSB0byBhIGNvbXBpbGUgdGltZSBlcnJvciBzaW5jZSBcY2R7bjAuY3VycmVudH0gaXMgbm90IGEgY29uc3RhbnQgZXhwcmVzc2lvbi4gIAp9CiAKXHN1YnNlY3Rpb257V2hpbGV9ClxsYWJlbHt3aGlsZX0KClRoZSB3aGlsZSBzdGF0ZW1lbnQgc3VwcG9ydHMgY29uZGl0aW9uYWwgaXRlcmF0aW9uLCB3aGVyZSB0aGUgY29uZGl0aW9uIGlzIGV2YWx1YXRlZCBwcmlvciB0byB0aGUgbG9vcC4KClxiZWdpbntncmFtbWFyfQp7XGJmIHdoaWxlU3RhdGVtZW50On0KICAgICAgXFdISUxFe30gYCgnIGV4cHJlc3Npb24gYCknIHN0YXRlbWVudCAgJSBjb3VsZCBkbyB0b3AgbGV2ZWwgaGVyZSwgYW5kIGluIGZvcgouCiBcZW5ke2dyYW1tYXJ9CiAKIEV4ZWN1dGlvbiBvZiBhIHdoaWxlIHN0YXRlbWVudCBvZiB0aGUgZm9ybSBcY29kZXtcV0hJTEV7fSAoJGUkKSAkcyQ7fSBwcm9jZWVkcyBhcyBmb2xsb3dzOiAKClRoZSBleHByZXNzaW9uICRlJCBpcyBldmFsdWF0ZWQgdG8gYW4gb2JqZWN0ICRvJC4gVGhlbiwgJG8kIGlzICBzdWJqZWN0ZWQgdG8gYm9vbGVhbiBjb252ZXJzaW9uIChccmVme2Jvb2xlYW5Db252ZXJzaW9ufSksIHByb2R1Y2luZyBhbiBvYmplY3QgJHIkLiAgSWYgJHIkIGlzIFxUUlVFe30sIHRoZW4gdGhlIHN0YXRlbWVudCAkXHtzXH0kIGlzIGV4ZWN1dGVkIGFuZCB0aGVuIHRoZSB3aGlsZSBzdGF0ZW1lbnQgaXMgcmUtZXhlY3V0ZWQgcmVjdXJzaXZlbHkuIElmICRyJCBpcyBcRkFMU0V7fSwgZXhlY3V0aW9uIG9mIHRoZSB3aGlsZSBzdGF0ZW1lbnQgaXMgY29tcGxldGUuCgpJdCBpcyBhIHN0YXRpYyB0eXBlIHdhcm5pbmcgaWYgdGhlIHN0YXRpYyB0eXBlIG9mICRlJCBtYXkgbm90IGJlIGFzc2lnbmVkIHRvIFxjb2Rle2Jvb2x9LgogICAgCgpcc3Vic2VjdGlvbntEb30KXGxhYmVse2RvfQoKVGhlIGRvIHN0YXRlbWVudCBzdXBwb3J0cyBjb25kaXRpb25hbCBpdGVyYXRpb24sIHdoZXJlIHRoZSBjb25kaXRpb24gaXMgZXZhbHVhdGVkIGFmdGVyIHRoZSBsb29wLgoKXGJlZ2lue2dyYW1tYXJ9CntcYmYgZG9TdGF0ZW1lbnQ6fQogICAgXERPe30gc3RhdGVtZW50IFxXSElMRXt9IGAoJyBleHByZXNzaW9uIGApJyBge1xlc2NhcGVncmFtbWFyIDt9JyUgY291bGQgZG8gdG9wIGxldmVsIGhlcmUKICAgICAgLgogXGVuZHtncmFtbWFyfQoKICAgIApFeGVjdXRpb24gb2YgYSBkbyBzdGF0ZW1lbnQgb2YgdGhlIGZvcm0gXGNvZGV7XERPe30gJHMkIFxXSElMRXt9ICgkZSQpO30gcHJvY2VlZHMgYXMgZm9sbG93czogCgpUaGUgc3RhdGVtZW50ICRce3NcfSQgaXMgZXhlY3V0ZWQuIFRoZW4sIHRoZSBleHByZXNzaW9uICRlJCBpcyBldmFsdWF0ZWQgdG8gYW4gb2JqZWN0ICRvJC4gVGhlbiwgJG8kIGlzICBzdWJqZWN0ZWQgdG8gYm9vbGVhbiBjb252ZXJzaW9uIChccmVme2Jvb2xlYW5Db252ZXJzaW9ufSksIHByb2R1Y2luZyBhbiBvYmplY3QgJHIkLiBJZiAkciQgaXMgXEZBTFNFe30sIGV4ZWN1dGlvbiBvZiB0aGUgZG8gc3RhdGVtZW50IGlzIGNvbXBsZXRlLiBJZiAkciQgaXMgXFRSVUV7fSwgdGhlbiB0aGUgZG8gc3RhdGVtZW50IGlzIHJlLWV4ZWN1dGVkIHJlY3Vyc2l2ZWx5LiAKCkl0IGlzIGEgc3RhdGljIHR5cGUgd2FybmluZyBpZiB0aGUgc3RhdGljIHR5cGUgb2YgJGUkIG1heSBub3QgYmUgYXNzaWduZWQgdG8gXGNvZGV7Ym9vbH0uIAoKXHN1YnNlY3Rpb257U3dpdGNofQpcbGFiZWx7c3dpdGNofQoKVGhlIHtcZW0gc3dpdGNoIHN0YXRlbWVudH0gc3VwcG9ydHMgZGlzcGF0Y2hpbmcgY29udHJvbCBhbW9uZyBhIGxhcmdlIG51bWJlciBvZiBjYXNlcy4KCiBcYmVnaW57Z3JhbW1hcn0Ke1xiZiBzd2l0Y2hTdGF0ZW1lbnQ6fQogICAgICBcU1dJVENIe30gYCgnIGV4cHJlc3Npb24gYCknIGBceycgc3dpdGNoQ2FzZSogZGVmYXVsdENhc2U/IGBcfSclIGNvdWxkIGRvIHRvcCBsZXZlbCBoZXJlIGFuZCBpbiBjYXNlcwogICAgLgoKCntcYmYgc3dpdGNoQ2FzZTp9CiAgICAgIGxhYmVsKiAoXENBU0V7fSBleHByZXNzaW9uIGB7XGVzY2FwZWdyYW1tYXIgOn0nKSBzdGF0ZW1lbnRzCiAgICAuCgp7XGJmIGRlZmF1bHRDYXNlOn0KICAgICAgbGFiZWwqICBcREVGQVVMVHt9IGB7XGVzY2FwZWdyYW1tYXIgOn0nIHN0YXRlbWVudHMKICAgIC4KIFxlbmR7Z3JhbW1hcn0KIAogR2l2ZW4gYSBzd2l0Y2ggc3RhdGVtZW50IG9mIHRoZSBmb3JtIAogClxiZWdpbntkYXJ0Q29kZX0KXFNXSVRDSHt9ICgkZSQpIFx7IAogICBcQ0FTRXt9ICRsYWJlbF97MTF9IFxsZG90cyBsYWJlbF97MWpfMX0kICRlXzE6IHNfMSQgCiAgICRcbGRvdHMkICAKICAgXENBU0V7fSAkbGFiZWxfe24xfSBcbGRvdHMgbGFiZWxfe25qX259JCAkZV9uOiBzX24kIAogICBcREVGQVVMVHt9OiAkc197bisxfSQgClx9ClxlbmR7ZGFydENvZGV9CiAKIG9yIHRoZSBmb3JtIAogClxiZWdpbntkYXJ0Q29kZX0KXFNXSVRDSHt9ICgkZSQpIFx7IAogICBcQ0FTRXt9ICRsYWJlbF97MTF9IFxsZG90cyBsYWJlbF97MWpfMX0kICRlXzE6IHNfMSQKICAgJFxsZG90cyQgIAogICBcQ0FTRXt9ICRsYWJlbF97bjF9IFxsZG90cyBsYWJlbF97bmpfbn0kICRlX246IHNfbiQgClx9ClxlbmR7ZGFydENvZGV9CiAKIGl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIHRoZSBleHByZXNzaW9ucyAkZV9rJCBhcmUgbm90IGNvbXBpbGUtdGltZSBjb25zdGFudHMgZm9yIGFsbCAgJGsgXGluIDEuLm4kLiAgSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgdGhlIHZhbHVlcyBvZiB0aGUgZXhwcmVzc2lvbnMgJGVfayQgYXJlIG5vdCBlaXRoZXI6CiBcYmVnaW57aXRlbWl6ZX0KIFxpdGVtIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBjbGFzcyAkQyQsIGZvciBhbGwgJGsgXGluIDEuLm4kLCAgb3IgCiBcaXRlbSBpbnN0YW5jZXMgb2YgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgXGNke2ludH0sIGZvciBhbGwgJGsgXGluIDEuLm4kLCAgb3IgCiBcaXRlbSBpbnN0YW5jZXMgb2YgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgXGNke1N0cmluZ30sIGZvciBhbGwgJGsgXGluIDEuLm4kLiAKIFxlbmR7aXRlbWl6ZX0KIApcY29tbWVudGFyeXtJbiBvdGhlciB3b3JkcywgIGFsbCB0aGUgZXhwcmVzc2lvbnMgaW4gdGhlIGNhc2VzIGV2YWx1YXRlIHRvIGNvbnN0YW50cyBvZiB0aGUgZXhhY3Qgc2FtZSB1c2VyIGRlZmluZWQgY2xhc3Mgb3IgYXJlIG9mIGNlcnRhaW4ga25vd24gdHlwZXMuICBOb3RlIHRoYXQgdGhlIHZhbHVlcyBvZiB0aGUgZXhwcmVzc2lvbnMgYXJlIGtub3duIGF0IGNvbXBpbGUtdGltZSwgYW5kIGFyZSBpbmRlcGVuZGVudCBvZiBhbnkgc3RhdGljIHR5cGUgYW5ub3RhdGlvbnMuCn0KCkl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIHRoZSBjbGFzcyAkQyQgaGFzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBvcGVyYXRvciAkPT0kIG90aGVyIHRoYW4gdGhlIG9uZSBpbmhlcml0ZWQgZnJvbSBcY29kZXtPYmplY3R9IHVubGVzcyB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gaXMgYSBzdHJpbmcsIGFuIGludGVnZXIsIGxpdGVyYWwgc3ltYm9sIG9yIHRoZSByZXN1bHQgb2YgaW52b2tpbmcgYSBjb25zdGFudCBjb25zdHJ1Y3RvciBvZiBjbGFzcyBcY2R7U3ltYm9sfS4KIAogXHJhdGlvbmFsZXsKIFRoZSBwcm9oaWJpdGlvbiBvbiB1c2VyIGRlZmluZWQgZXF1YWxpdHkgYWxsb3dzIHVzIHRvIGltcGxlbWVudCB0aGUgc3dpdGNoIGVmZmljaWVudGx5IGZvciB1c2VyIGRlZmluZWQgdHlwZXMuIFdlIGNvdWxkIGZvcm11bGF0ZSBtYXRjaGluZyBpbiB0ZXJtcyBvZiBpZGVudGl0eSBpbnN0ZWFkIHdpdGggdGhlIHNhbWUgZWZmaWNpZW5jeS4gSG93ZXZlciwgaWYgYSB0eXBlIGRlZmluZXMgYW4gZXF1YWxpdHkgb3BlcmF0b3IsIHByb2dyYW1tZXJzIHdvdWxkIGZpbmQgaXQgcXVpdGUgc3VycHJpc2luZyB0aGF0IGVxdWFsIG9iamVjdHMgZGlkIG5vdCBtYXRjaC4KIAogfQoKXGNvbW1lbnRhcnl7ClRoZSBcU1dJVENIe30gIHN0YXRlbWVudCBzaG91bGQgb25seSBiZSB1c2VkIGluIHZlcnkgbGltaXRlZCBzaXR1YXRpb25zIChlLmcuLCBpbnRlcnByZXRlcnMgb3Igc2Nhbm5lcnMpLiAgCn0KCkV4ZWN1dGlvbiBvZiBhIHN3aXRjaCBzdGF0ZW1lbnQgb2YgdGhlIGZvcm0KClxiZWdpbntkYXJ0Q29kZX0KXFNXSVRDSHt9ICgkZSQpIFx7IAogICBcQ0FTRXt9ICRsYWJlbF97MTF9IFxsZG90cyBsYWJlbF97MWpfMX0kICRlXzE6IHNfMSQgCiAgICRcbGRvdHMkICAKICAgXENBU0V7fSAkbGFiZWxfe24xfSBcbGRvdHMgbGFiZWxfe25qX259JCAkZV9uOiBzX24kIAogICBcREVGQVVMVHt9OiAkc197bisxfSQgClx9ClxlbmR7ZGFydENvZGV9CiAKb3IgdGhlIGZvcm0gCiAKXGJlZ2lue2RhcnRDb2RlfQpcU1dJVENIe30gKCRlJCkgXHsgCiAgIFxDQVNFe30gJGxhYmVsX3sxMX0gXGxkb3RzIGxhYmVsX3sxal8xfSQgJGVfMTogc18xJAogICAkXGxkb3RzJCAgCiAgIFxDQVNFe30gJGxhYmVsX3tuMX0gXGxkb3RzIGxhYmVsX3tual9ufSQgJGVfbjogc19uJCAKXH0KXGVuZHtkYXJ0Q29kZX0KCnByb2NlZWRzIGFzIGZvbGxvd3M6CgpUaGUgc3RhdGVtZW50IFxjb2Rle1xWQVJ7fSBpZCA9ICRlJDt9IGlzIGV2YWx1YXRlZCwgd2hlcmUgXGNvZGV7aWR9IGlzIGEgdmFyaWFibGUgd2hvc2UgbmFtZSBpcyBkaXN0aW5jdCBmcm9tIGFueSBvdGhlciB2YXJpYWJsZSBpbiB0aGUgcHJvZ3JhbS4gSW4gY2hlY2tlZCBtb2RlLCBpdCBpcyBhIHJ1biB0aW1lIGVycm9yIGlmIHRoZSB2YWx1ZSBvZiAkZSQgaXMgbm90IGFuIGluc3RhbmNlIG9mIHRoZSBzYW1lIGNsYXNzIGFzIHRoZSBjb25zdGFudHMgJGVfMSBcbGRvdHMgZV9uJC4gCgpcY29tbWVudGFyeXtOb3RlIHRoYXQgaWYgdGhlcmUgYXJlIG5vIGNhc2UgY2xhdXNlcyAoJG4gPSAwJCksIHRoZSB0eXBlIG9mICRlJCBkb2VzIG5vdCBtYXR0ZXIufQoKTmV4dCwgdGhlIGNhc2UgY2xhdXNlIFxDQVNFe30gJGVfezF9OiBzX3sxfSQgaXMgZXhlY3V0ZWQgaWYgaXQgZXhpc3RzLiBJZiBcQ0FTRXt9ICRlX3sxfTogc197MX0kIGRvZXMgbm90IGV4aXN0LCB0aGVuIGlmIHRoZXJlIGlzIGEgIFxERUZBVUxUe30gY2xhdXNlIGl0IGlzIGV4ZWN1dGVkIGJ5IGV4ZWN1dGluZyAkc197bisxfSQuCgpBIGNhc2UgY2xhdXNlIGludHJvZHVjZXMgYSBuZXcgc2NvcGUsIG5lc3RlZCBpbiB0aGUgbGV4aWNhbGx5IHN1cnJvdW5kaW5nIHNjb3BlLiBUaGUgc2NvcGUgb2YgYSBjYXNlIGNsYXVzZSBlbmRzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjYXNlIGNsYXVzZSdzIHN0YXRlbWVudCBsaXN0LgoKRXhlY3V0aW9uIG9mIGEgXENBU0V7fSBjbGF1c2UgXENBU0V7fSAkZV97a306IHNfe2t9JCBvZiBhICBzd2l0Y2ggc3RhdGVtZW50ICAKClxiZWdpbntkYXJ0Q29kZX0KXFNXSVRDSHt9ICgkZSQpIFx7IAogICBcQ0FTRXt9ICRsYWJlbF97MTF9IFxsZG90cyBsYWJlbF97MWpfMX0kICRlXzE6IHNfMSQgCiAgICRcbGRvdHMkICAKICAgXENBU0V7fSAkbGFiZWxfe24xfSBcbGRvdHMgbGFiZWxfe25qX259JCAkZV9uOiBzX24kIAogICBcREVGQVVMVHt9OiAkc197bisxfSQgClx9ClxlbmR7ZGFydENvZGV9Cgpwcm9jZWVkcyBhcyBmb2xsb3dzOgoKVGhlIGV4cHJlc3Npb24gXGNvZGV7JGVfayQgPT0gaWR9IGlzIGV2YWx1YXRlZCB0byBhbiBvYmplY3QgJG8kIHdoaWNoIGlzIHRoZW4gc3ViamVjdGVkIHRvIGJvb2xlYW4gY29udmVyc2lvbiB5aWVsZGluZyBhIHZhbHVlICR2JC4gCklmICR2JCBpcyBub3QgIFxUUlVFe30gdGhlIGZvbGxvd2luZyBjYXNlLCAgXENBU0V7fSAkZV97aysxfTogc197aysxfSQgaXMgZXhlY3V0ZWQgaWYgaXQgZXhpc3RzLiBJZiAgXENBU0V7fSAkZV97aysxfTogc197aysxfSQgZG9lcyBub3QgZXhpc3QsIHRoZW4gdGhlIFxERUZBVUxUe30gY2xhdXNlIGlzIGV4ZWN1dGVkIGJ5IGV4ZWN1dGluZyAkc197bisxfSQuCklmICR2JCBpcyBcVFJVRXt9LCAgIGxldCAkaCQgYmUgdGhlIHNtYWxsZXN0IG51bWJlciBzdWNoIHRoYXQgJGggXGdlIGskIGFuZCAkc19oJCBpcyBub24tZW1wdHkuIElmIG5vIHN1Y2ggJGgkIGV4aXN0cywgbGV0ICRoID0gbiArIDEkLiBUaGUgIHNlcXVlbmNlIG9mIHN0YXRlbWVudHMgJHNfaCQgaXMgdGhlbiBleGVjdXRlZC4KSWYgZXhlY3V0aW9uIHJlYWNoZXMgdGhlIHBvaW50IGFmdGVyICRzX2gkICB0aGVuICBhIHJ1bnRpbWUgZXJyb3Igb2NjdXJzLCB1bmxlc3MgJGggPSBuKzEkLgoKRXhlY3V0aW9uIG9mIGEgXENBU0V7fSBjbGF1c2UgXENBU0V7fSAkZV97a306IHNfe2t9JCBvZiBhICBzd2l0Y2ggc3RhdGVtZW50ICAKClxiZWdpbntkYXJ0Q29kZX0KXFNXSVRDSHt9ICgkZSQpIFx7IAogICBcQ0FTRXt9ICRsYWJlbF97MTF9IFxsZG90cyBsYWJlbF97MWpfMX0kICRlXzE6IHNfMSQKICAgJFxsZG90cyQgIAogICBcQ0FTRXt9ICRsYWJlbF97bjF9IFxsZG90cyBsYWJlbF97bmpfbn0kICRlX246IHNfbiQgClx9ClxlbmR7ZGFydENvZGV9Cgpwcm9jZWVkcyBhcyBmb2xsb3dzOgoKVGhlIGV4cHJlc3Npb24gXGNvZGV7JGVfayQgPT0gaWR9IGlzIGV2YWx1YXRlZCB0byBhbiBvYmplY3QgJG8kIHdoaWNoIGlzIHRoZW4gc3ViamVjdGVkIHRvIGJvb2xlYW4gY29udmVyc2lvbiB5aWVsZGluZyBhIHZhbHVlICR2JC4gCklmICR2JCBpcyBub3QgIFxUUlVFe30gdGhlIGZvbGxvd2luZyBjYXNlLCAgXENBU0V7fSAkZV97aysxfTogc197aysxfSQgaXMgZXhlY3V0ZWQgaWYgaXQgZXhpc3RzLiAKSWYgJHYkIGlzIFxUUlVFe30sICAgbGV0ICRoJCBiZSB0aGUgc21hbGxlc3QgaW50ZWdlciBzdWNoIHRoYXQgJGggXGdlIGskIGFuZCAkc19oJCBpcyBub24tZW1wdHkuIFRoZSAgc2VxdWVuY2Ugb2Ygc3RhdGVtZW50cyAkc19oJCBpcyAgZXhlY3V0ZWQgaWYgaXQgZXhpc3RzLgpJZiBleGVjdXRpb24gcmVhY2hlcyB0aGUgcG9pbnQgYWZ0ZXIgJHNfaCQgIHRoZW4gIGEgcnVudGltZSBlcnJvciBvY2N1cnMsIHVubGVzcyAkaCA9IG4kLgoKClxjb21tZW50YXJ5ewpJbiBvdGhlciB3b3JkcywgdGhlcmUgaXMgbm8gaW1wbGljaXQgZmFsbC10aHJvdWdoIGJldHdlZW4gY2FzZXMuIFRoZSBsYXN0IGNhc2UgaW4gYSBzd2l0Y2ggKGRlZmF1bHQgb3Igb3RoZXJ3aXNlKSBjYW4gYGZhbGwtdGhyb3VnaCcgdG8gdGhlIGVuZCBvZiB0aGUgc3RhdGVtZW50Lgp9CgpJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmIHRoZSB0eXBlIG9mICRlJCBtYXkgbm90IGJlIGFzc2lnbmVkIHRvIHRoZSB0eXBlIG9mICRlX2skLiBJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmIHRoZSBsYXN0IHN0YXRlbWVudCBvZiB0aGUgc3RhdGVtZW50IHNlcXVlbmNlICRzX2skIGlzIG5vdCBhIFxCUkVBS3t9LCBcQ09OVElOVUV7fSwgXFJFVFVSTnt9IG9yIFxUSFJPV3t9IHN0YXRlbWVudC4KClxyYXRpb25hbGV7ClRoZSBiZWhhdmlvciBvZiBzd2l0Y2ggY2FzZXMgaW50ZW50aW9uYWxseSBkaWZmZXJzIGZyb20gdGhlIEMgdHJhZGl0aW9uLiAgSW1wbGljaXQgZmFsbCB0aHJvdWdoIGlzIGEga25vd24gY2F1c2Ugb2YgcHJvZ3JhbW1pbmcgZXJyb3JzIGFuZCB0aGVyZWZvcmUgZGlzYWxsb3dlZC4gIFdoeSBub3Qgc2ltcGx5IGJyZWFrIHRoZSBmbG93IGltcGxpY2l0bHkgYXQgdGhlIGVuZCBvZiBldmVyeSBjYXNlLCByYXRoZXIgdGhhbiByZXF1aXJpbmcgZXhwbGljaXQgY29kZSB0byBkbyBzbz8gIFRoaXMgd291bGQgaW5kZWVkIGJlIGNsZWFuZXIuICBJdCB3b3VsZCBhbHNvIGJlIGNsZWFuZXIgdG8gaW5zaXN0IHRoYXQgZWFjaCBjYXNlIGhhdmUgYSBzaW5nbGUgKHBvc3NpYmx5IGNvbXBvdW5kKSBzdGF0ZW1lbnQuICBXZSBoYXZlIGNob3NlbiBub3QgdG8gZG8gc28gaW4gb3JkZXIgdG8gZmFjaWxpdGF0ZSBwb3J0aW5nIG9mIHN3aXRjaCBzdGF0ZW1lbnRzIGZyb20gb3RoZXIgbGFuZ3VhZ2VzLiAgSW1wbGljaXRseSBicmVha2luZyB0aGUgY29udHJvbCBmbG93IGF0IHRoZSBlbmQgb2YgYSBjYXNlIHdvdWxkIHNpbGVudGx5IGFsdGVyIHRoZSBtZWFuaW5nIG9mIHBvcnRlZCBjb2RlIHRoYXQgcmVsaWVkIG9uIGZhbGwtdGhyb3VnaCwgcG90ZW50aWFsbHkgZm9yY2luZyB0aGUgcHJvZ3JhbW1lciB0byBkZWFsIHdpdGggc3VidGxlIGJ1Z3MuIE91ciBkZXNpZ24gZW5zdXJlcyB0aGF0IHRoZSBkaWZmZXJlbmNlIGlzIGltbWVkaWF0ZWx5IGJyb3VnaHQgdG8gdGhlIGNvZGVyYHMgYXR0ZW50aW9uLiAgVGhlIHByb2dyYW1tZXIgd2lsbCBiZSBub3RpZmllZCBhdCBjb21waWxlLXRpbWUgaWYgdGhleSBmb3JnZXQgdG8gZW5kIGEgY2FzZSB3aXRoIGEgc3RhdGVtZW50IHRoYXQgdGVybWluYXRlcyB0aGUgc3RyYWlnaHQtbGluZSBjb250cm9sIGZsb3cuIFdlIGNvdWxkIG1ha2UgdGhpcyB3YXJuaW5nIGEgY29tcGlsZS10aW1lIGVycm9yLCBidXQgcmVmcmFpbiBmcm9tIGRvaW5nIHNvIGJlY2F1c2UgZG8gbm90IHdpc2ggdG8gZm9yY2UgdGhlIHByb2dyYW1tZXIgdG8gZGVhbCB3aXRoIHRoaXMgaXNzdWUgaW1tZWRpYXRlbHkgd2hpbGUgcG9ydGluZyBjb2RlLiAgSWYgZGV2ZWxvcGVycyBpZ25vcmUgdGhlIHdhcm5pbmcgYW5kIHJ1biB0aGVpciBjb2RlLCBhIHJ1biB0aW1lIGVycm9yIHdpbGwgcHJldmVudCB0aGUgcHJvZ3JhbSBmcm9tIG1pc2JlaGF2aW5nIGluIGhhcmQtdG8tZGVidWcgd2F5cyAoYXQgbGVhc3Qgd2l0aCByZXNwZWN0IHRvIHRoaXMgaXNzdWUpLgoKVGhlIHNvcGhpc3RpY2F0aW9uIG9mIHRoZSBhbmFseXNpcyBvZiBmYWxsLXRocm91Z2ggaXMgYW5vdGhlciBpc3N1ZS4gRm9yIG5vdywgd2UgaGF2ZSBvcHRlZCBmb3IgYSB2ZXJ5IHN0cmFpZ2h0Zm9yd2FyZCBzeW50YWN0aWMgcmVxdWlyZW1lbnQuIFRoZXJlIGFyZSBvYnZpb3VzbHkgc2l0dWF0aW9ucyB3aGVyZSBjb2RlIGRvZXMgbm90IGZhbGwgdGhyb3VnaCwgYW5kIHlldCBkb2VzIG5vdCBjb25mb3JtIHRvIHRoZXNlIHNpbXBsZSBydWxlcywgZS5nLjoKfQoKXGJlZ2lue2RhcnRDb2RlfQpcU1dJVENIe30gKHgpIFx7CiAgXENBU0V7fSAxOiBcVFJZe30gXHsgJFxsZG90cyQgXFJFVFVSTnt9O1x9IFxGSU5BTExZe30gXHsgJFxsZG90cyQgXFJFVFVSTnt9O1x9Clx9ClxlbmR7ZGFydENvZGV9CgpccmF0aW9uYWxlewogIFZlcnkgZWxhYm9yYXRlIGNvZGUgaW4gYSBjYXNlIGNsYXVzZSBpcyBwcm9iYWJseSBiYWQgc3R5bGUgaW4gYW55IGNhc2UsIGFuZCBzdWNoIGNvZGUgY2FuIGFsd2F5cyBiZSByZWZhY3RvcmVkLgp9CiAKIApcc3Vic2VjdGlvbnsgUmV0aHJvd30KXGxhYmVse3JldGhyb3d9CgoKVGhlIHtcZW0gcmV0aHJvdyBzdGF0ZW1lbnR9ICBpcyB1c2VkIHRvIHJlLXJhaXNlIGFuIGV4Y2VwdGlvbi4KCiBcYmVnaW57Z3JhbW1hcn0Ke1xiZiByZXRocm93U3RhdGVtZW50On0KICAgICBcUkVUSFJPV3t9CiAgICAuCiBcZW5ke2dyYW1tYXJ9CiAKRXhlY3V0aW9uIG9mIGEgXGNvZGV7XFJFVEhST1d7fX0gc3RhdGVtZW50IHByb2NlZWRzIGFzIGZvbGxvd3M6CkNvbnRyb2wgaXMgdHJhbnNmZXJyZWQgdG8gdGhlIG5lYXJlc3QgaW5uZXJtb3N0IGVuY2xvc2luZyBleGNlcHRpb24gaGFuZGxlciAoXHJlZnt0cnl9KS4KClxjb21tZW50YXJ5e05vIGNoYW5nZSBpcyBtYWRlIHRvIHRoZSBjdXJyZW50IGV4Y2VwdGlvbi59CgpJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBhICBcY29kZXtcUkVUSFJPV3t9fSBzdGF0ZW1lbnQgaXMgbm90IGVuY2xvc2VkIHdpdGhpbiBhbiBvbi1jYXRjaCBjbGF1c2UuIAoKJVRoZSBzdGF0aWMgdHlwZSBvZiBhIHJldGhyb3cgZXhwcmVzc2lvbiBpcyAkXGJvdCQuCgoKClxzdWJzZWN0aW9ueyBUcnl9ClxsYWJlbHt0cnl9CgpUaGUgdHJ5IHN0YXRlbWVudCBzdXBwb3J0cyB0aGUgZGVmaW5pdGlvbiBvZiBleGNlcHRpb24gaGFuZGxpbmcgY29kZSBpbiBhIHN0cnVjdHVyZWQgd2F5LgoKXGJlZ2lue2dyYW1tYXJ9CntcYmYgdHJ5U3RhdGVtZW50On0KICAgICAgXFRSWXt9IGJsb2NrIChvblBhcnQrIGZpbmFsbHlQYXJ0PyAkfCQgZmluYWxseVBhcnQpCiAgICAuCiAgICAKIHtcYmYgb25QYXJ0On1jYXRjaFBhcnQgYmxvY2s7CiAgICBcT057fSB0eXBlIGNhdGNoUGFydD8gYmxvY2sKICAgLgoKe1xiZiBjYXRjaFBhcnQ6fQogICAgICBcQ0FUQ0h7fSBgKCcgaWRlbnRpZmllciAoYCwnIGlkZW50aWZpZXIpPyBgKScgCiAgICAuCgp7XGJmIGZpbmFsbHlQYXJ0On0KICAgICAgXEZJTkFMTFl7fSBibG9jawogICAgLgogXGVuZHtncmFtbWFyfQogCiBBIHRyeSBzdGF0ZW1lbnQgY29uc2lzdHMgb2YgYSBibG9jayBzdGF0ZW1lbnQsIGZvbGxvd2VkIGJ5IGF0IGxlYXN0IG9uZSBvZjoKIFxiZWdpbntlbnVtZXJhdGV9CiBcaXRlbQpBIHNldCBvZiBcT057fS1cQ0FUQ0h7fSBjbGF1c2VzLCBlYWNoIG9mIHdoaWNoIHNwZWNpZmllcyAgKGVpdGhlciBleHBsaWNpdGx5IG9yIGltcGxpY2l0bHkpIHRoZSB0eXBlIG9mIGV4Y2VwdGlvbiBvYmplY3QgdG8gYmUgaGFuZGxlZCwgb25lIG9yIHR3byBleGNlcHRpb24gcGFyYW1ldGVycyBhbmQgYSBibG9jayBzdGF0ZW1lbnQuClxpdGVtCkEgXEZJTkFMTFl7fSBjbGF1c2UsIHdoaWNoIGNvbnNpc3RzIG9mIGEgYmxvY2sgc3RhdGVtZW50LiAKXGVuZHtlbnVtZXJhdGV9CgpccmF0aW9uYWxlewpUaGUgc3ludGF4IGlzIGRlc2lnbmVkIHRvIGJlIHVwd2FyZCBjb21wYXRpYmxlIHdpdGggZXhpc3RpbmcgSmF2YXNjcmlwdCBwcm9ncmFtcy4gVGhlIFxPTnt9IGNsYXVzZSBjYW4gYmUgb21pdHRlZCwgbGVhdmluZyB3aGF0IGxvb2tzIGxpa2UgYSBKYXZhc2NyaXB0IGNhdGNoIGNsYXVzZS4KfQoKQW4gXE9Oe30tXENBVENIe30gY2xhdXNlIG9mIHRoZSBmb3JtICAgXGNvZGV7XE9Oe30gJFQkIFxDQVRDSHt9ICgkcF8xLCBwXzIkKSAkcyR9ICB7XGVtIG1hdGNoZXN9IGFuIG9iamVjdCAkbyQgIGlmIHRoZSB0eXBlIG9mICRvJCBpcyBhIHN1YnR5cGUgb2YgJFQkLiAgSWYgJFQkIGlzIGEgbWFsZm9ybWVkIG9yIGRlZmVycmVkIHR5cGUgIChccmVme3N0YXRpY1R5cGVzfSksIHRoZW4gcGVyZm9ybWluZyBhIG1hdGNoIGNhdXNlcyBhIHJ1biB0aW1lIGVycm9yLgoKXGNvbW1lbnRhcnkgewpJdCBpcyBvZiBjb3Vyc2UgYSBzdGF0aWMgd2FybmluZyBpZiAkVCQgaXMgYSBkZWZlcnJlZCBvciBtYWxmb3JtZWQgdHlwZS4KfQoKQW4gXE9Oe30tXENBVENIe30gY2xhdXNlIG9mIHRoZSBmb3JtICAgXGNvZGV7XE9Oe30gJFQkIFxDQVRDSHt9ICgkcF8xLCBwXzIkKSAkcyR9IGludHJvZHVjZXMgYSBuZXcgc2NvcGUgJENTJCBpbiB3aGljaCBsb2NhbCB2YXJpYWJsZXMgc3BlY2lmaWVkIGJ5ICRwXzEkIGFuZCAkcF8yJCBhcmUgZGVmaW5lZC4gVGhlIHN0YXRlbWVudCAkcyQgaXMgZW5jbG9zZWQgd2l0aGluICRDUyQuCgoKQW4gXE9Oe30tXENBVENIe30gY2xhdXNlIG9mIHRoZSBmb3JtICBcY29kZXtcT057fSAkVCQgXENBVENIe30gKCRwXzEkKSAkcyR9IGlzIGVxdWl2YWxlbnQgdG8gYW4gXE9Oe30tXENBVENIe30gY2xhdXNlICBcY29kZXtcT057fSAkVCQgXENBVENIe30gKCRwXzEsIHBfMiQpICRzJH0gd2hlcmUgJHBfMiQgaXMgYW4gaWRlbnRpZmllciB0aGF0IGRvZXMgbm90IG9jY3VyIGFueXdoZXJlIGVsc2UgaW4gdGhlIHByb2dyYW0uIAoKCkFuIFxPTnt9LVxDQVRDSHt9IGNsYXVzZSBvZiB0aGUgZm9ybSAgXGNvZGV7XENBVENIe30gKCRwJCkgJHMkfSBpcyBlcXVpdmFsZW50IHRvIGFuIFxPTnt9LVxDQVRDSHt9IGNsYXVzZSAgXGNvZGV7XE9Oe30gXERZTkFNSUN7fSBcQ0FUQ0h7fSAoJHAkKSAkcyR9LiBBbiBcT057fS1cQ0FUQ0h7fSBjbGF1c2Ugb2YgdGhlIGZvcm0gIFxjb2Rle1xDQVRDSHt9ICgkcF8xLCBwXzIkKSAkcyR9IGlzIGVxdWl2YWxlbnQgdG8gYW4gXE9Oe30tXENBVENIe30gY2xhdXNlICBcY29kZXtcT057fSBcRFlOQU1JQ3t9IFxDQVRDSHt9ICgkcF8xLCBwXzIkKSAkcyR9CgoKJUlmIGFuIGV4cGxpY2l0IHR5cGUgaXMgYXNzb2NpYXRlZCB3aXRoIG9mICRwXzIkLCBpdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmIHRoYXQgdHlwZSBpcyBub3QgXGNvZGV7T2JqZWN0fSBvciBcRFlOQU1JQ3t9LgoKVGhlIHtcZW0gYWN0aXZlIHN0YWNrIHRyYWNlfSBpcyBhbiBvYmplY3Qgd2hvc2UgXGNvZGV7dG9TdHJpbmcoKX0gbWV0aG9kIHByb2R1Y2VzIGEgc3RyaW5nIHRoYXQgaXMgYSByZWNvcmQgb2YgZXhhY3RseSB0aG9zZSBmdW5jdGlvbiBhY3RpdmF0aW9ucyB3aXRoaW4gdGhlIGN1cnJlbnQgaXNvbGF0ZSB0aGF0IGhhZCBub3QgY29tcGxldGVkIGV4ZWN1dGlvbiBhdCB0aGUgcG9pbnQgd2hlcmUgdGhlIGN1cnJlbnQgZXhjZXB0aW9uIHdhcyB0aHJvd24uCiVcYmVnaW57ZW51bWVyYXRlfQolXGl0ZW0gU3RhcnRlZCBleGVjdXRpb24gYWZ0ZXIgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgZnVuY3Rpb24uCiVcaXRlbSBIYWQgbm90IGNvbXBsZXRlZCBleGVjdXRpb24gYXQgdGhlIHBvaW50IHdoZXJlIHRoZSBleGNlcHRpb24gY2F1Z2h0IGJ5IHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nICBcT057fS1cQ0FUQ0h7fSBjbGF1c2Ugd2FzIGluaXRpYWxseSB0aHJvd24uIAolXGNvbW1lbnRhcnl7VGhlIGFjdGl2ZSBzdGFjayB0cmFjZSBjb250YWlucyB0aGUgZnJhbWVzIGJldHdlZW4gdGhlIGV4Y2VwdGlvbiBoYW5kbGluZyBjb2RlIGFuZCB0aGUgb3JpZ2luYWwgcG9pbnQgd2hlbiBhbiBleGNlcHRpb24gaXMgdGhyb3duLCBub3Qgd2hlcmUgaXQgd2FzIHJldGhyb3duLn0KJVxlbmR7ZW51bWVyYXRlfQoKIFxjb21tZW50YXJ5ewpUaGlzIGltcGxpZXMgdGhhdCBubyBzeW50aGV0aWMgZnVuY3Rpb24gYWN0aXZhdGlvbnMgbWF5IGJlIGFkZGVkIHRvIHRoZSB0cmFjZSwgbm9yIG1heSBhbnkgc291cmNlIGxldmVsIGFjdGl2YXRpb25zIGJlIG9taXR0ZWQuIApUaGlzIG1lYW5zLCBmb3IgZXhhbXBsZSwgdGhhdCBhbnkgaW5saW5pbmcgb2YgZnVuY3Rpb25zIGRvbmUgYXMgYW4gb3B0aW1pemF0aW9uIG11c3Qgbm90IGJlIHZpc2libGUgaW4gdGhlIHRyYWNlLiBTaW1pbGFybHksIGFueSBzeW50aGV0aWMgcm91dGluZXMgdXNlZCBieSB0aGUgaW1wbGVtZW50YXRpb24gbXVzdCBub3QgYXBwZWFyIGluIHRoZSB0cmFjZS4KCk5vdGhpbmcgaXMgc2FpZCBhYm91dCBob3cgYW55IG5hdGl2ZSBmdW5jdGlvbiBjYWxscyBtYXkgYmUgcmVwcmVzZW50ZWQgaW4gdGhlIHRyYWNlLgogfQogClxjb21tZW50YXJ5ewpOb3RlIHRoYXQgd2Ugc2F5IG5vdGhpbmcgYWJvdXQgdGhlIGlkZW50aXR5IG9mIHRoZSBzdGFjayB0cmFjZSwgb3Igd2hhdCBub3Rpb24gb2YgZXF1YWxpdHkgaXMgZGVmaW5lZCBmb3Igc3RhY2sgdHJhY2VzLgp9CiAKJSBTYWRseSwgdGhlIGluZm8gYmVsb3cgY2Fubm90IGJlIGNvbXB1dGVkIGVmZmljaWVudGx5LiBJdCB3b3VsZCBuZWVkIHRvIGJlIGNvbXB1dGVkIGF0IHRoZSB0aHJvdyBwb2ludCwgc2luY2UgYXQgbGF0dGUgcG9pbnRzIGl0IG1pZ2h0IGJlIGRlc3Ryb3llZC4gTmF0aXZlIGNvZGUgaW4gY2FsbGluZyBmcmFtZXMgZXhlY3V0ZXMgcmVsYXRpdmUgdG8gdGhlIHN0YWNrIHBvaW50ZXIsIHdoaWNoIHRoZXJlZm9yZSBuZWVkcyB0byBiZSByZXNldCBhcyBlYWNoIGZyYW1lIGlzIHVud291bmQuICBUaGlzIG1lYW5zIHRoYXQgdGhlCiUgT1Mga2VybmVsIGNhbiBkaXNwb3NlIG9mIHRoaXMgc3RhY2sgbWVtb3J5IC0gaXQgaXMgbm90IHJlbGlhYmx5IHByZXNlcnZlZC4gQW5kIHN1Y2ggY29kZSBtdXN0IGV4ZWN1dGUgaWYgb25seSB0byB0ZXN0IGlmIHRoZSBleGNlcHRpb24gc2hvdWxkIGJlIGNhdWdodCBvciBzZW50IG9ud2FyZC4KCiUgRm9yIGVhY2ggc3VjaCBmdW5jdGlvbiBhY3RpdmF0aW9uLCB0aGUgYWN0aXZlIHN0YWNrIHRyYWNlIGluY2x1ZGVzIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiwgdGhlIGJpbmRpbmdzIG9mIGFsbCBpdHMgZm9ybWFsIHBhcmFtZXRlcnMsIGxvY2FsIHZhcmlhYmxlcyBhbmQgXFRISVN7fSwgYW5kIHRoZSBwb3NpdGlvbiBhdCB3aGljaCB0aGUgZnVuY3Rpb24gd2FzIGV4ZWN1dGluZy4KIAogJSBJcyB0aGlzIGNvbnRyb3ZlcnNpYWw/IFdlIHdlcmUgdGhpbmtpbmcgb2Ygdmlld2luZyB0aGUgdHJhY2UgYXMgYSBMaXN0PEludm9jYXRpb24+LAogJSBidXQgdGhhdCB3b24ndCBjYXB0dXJlIHRoZSByZWNlaXZlciBvciB0aGUgbG9jYWxzLiBNb3JlIGdlbmVyYWxseSwgd2UgbmVlZCBhIHN0YW5kYXJkIGludGVyZmFjZSB0aGF0IGRlc2NyaWJlcyB0aGVzZSB0cmFjZXMsIHNvIG9uZSBjYW4gdHlwZSB0aGUgc3RhY2sgdHJhY2UgdmFyaWFibGUgaW4gdGhlIGNhdGNoLgogCiBcY29tbWVudGFyeXtUaGUgdGVybSBwb3NpdGlvbiBzaG91bGQgbm90IGJlIGludGVycHJldGVkIGFzIGEgbGluZSBudW1iZXIsIGJ1dCByYXRoZXIgYXMgYSBwcmVjaXNlIHBvc2l0aW9uIC0gdGhlIGV4YWN0IGNoYXJhY3RlciBpbmRleCBvZiB0aGUgIGV4cHJlc3Npb24gdGhhdCByYWlzZWQgIHRoZSBleGNlcHRpb24uIH0KIAogJSBBIHBvc2l0aW9uIGNhbiBiZSByZXByZXNlbnRlZCB2aWEgYSBUb2tlbi4gSWYgd2UgbWFrZSB0aGF0IHBhcnQgb2YgdGhlIGNvcmUgcmVmbGVjdGlvbiBmYWNpbGl0eSwgd2UgY2FuIHN0YXRlIHRoaXMgaGVyZS4KIAogXHJhdGlvbmFsZXtUaGUgZGVmaW5pdGlvbiBiZWxvdyBpcyBhbiBhdHRlbXB0IHRvIGNoYXJhY3Rlcml6ZSBleGNlcHRpb24gaGFuZGxpbmcgd2l0aG91dCByZXNvcnRpbmcgdG8gYSBub3JtYWwvYWJydXB0IGNvbXBsZXRpb24gZm9ybXVsYXRpb24uIEl0IGhhcyB0aGUgYWR2YW50YWdlIHRoYXQgb25lIG5lZWQgbm90IHNwZWNpZnkgYWJydXB0IGNvbXBsZXRpb24gYmVoYXZpb3IgZm9yIGV2ZXJ5IGNvbXBvdW5kIHN0YXRlbWVudC4gIE9uIHRoZSBvdGhlciBoYW5kLCBpdCBpcyBuZXcgYW5kIGRpZmZlcmVudCBhbmQgbmVlZHMgbW9yZSB0aG91Z2h0Lgp9CgolIHNvLCB3ZSBuZWVkIHRvIGZpeCB0aGluZ3Mgc28gdGhhdCByZXR1cm5zIGluIHRoZSB0cnkgc3RpbGwgZ28gdGhyb3VnaCB0aGUgZmluYWxseSBjbGF1c2UgYW5kIHNvIHRoYXQKJSB1bmNhdWdodCBvciByZXRocm93biBleGNlcHRpb25zIHByb3BhZ2F0ZSAgZnJvbSB0aGUgZmluYWxseSBjbGF1c2UgdW5sZXNzIGl0IHJldHVybnMuCgolIHBsYW46IHJldHVybiB0cmFuc2ZlcnMgY29udHJvbCB0byB0aGUgZW5jbG9zaW5nIGZpbmFsbHkgY2xhdXNlIGlmIGl0IGV4aXN0cyBhbmQgZXJhc2VzCiUgYW55IGN1cnJlbnQgc3RhY2sgdHJhY2UgJiBleGNlcHRpb24uCiUgQnV0IGhvdyB0byBlbnN1cmUgcmV0dXJuIGxlYXZlcyB0aGUgZmluYWxseSBpZiBpdCBkb2VzIG5vdCB0aHJvdz8gc3BlY2lhbCB0ZXh0PyBzYXkgcmV0dXJuCiUgZG9lcyB0aGUgZmluYWxseSBhbmQgdGhlbiB4ZmVycyBjb250cm9sID8KCkEgdHJ5IHN0YXRlbWVudCBcVFJZe30gJHNfMSQgJG9uLWNhdGNoXzEgXGxkb3RzICBvbi1jYXRjaF9uJCBcRklOQUxMWXt9ICRzX2YkICBkZWZpbmVzIGFuIGV4Y2VwdGlvbiBoYW5kbGVyICRoJCB0aGF0IGV4ZWN1dGVzIGFzIGZvbGxvd3M6CgpUaGUgXE9Oe30tXENBVENIe30gY2xhdXNlcyBhcmUgZXhhbWluZWQgaW4gb3JkZXIsIHN0YXJ0aW5nIHdpdGggJGNhdGNoXzEkLCB1bnRpbCBlaXRoZXIgYW4gXE9Oe30tXENBVENIe30gY2xhdXNlIHRoYXQgbWF0Y2hlcyB0aGUgY3VycmVudCBleGNlcHRpb24gKFxyZWZ7dGhyb3d9KSBpcyBmb3VuZCwgb3IgdGhlIGxpc3Qgb2YgXE9Oe30tXENBVENIe30gY2xhdXNlcyBoYXMgYmVlbiBleGhhdXN0ZWQuIElmIGFuIFxPTnt9LVxDQVRDSHt9IGNsYXVzZSAkb24tY2F0Y2hfayQgaXMgZm91bmQsIHRoZW4gJHBfe2sxfSQgaXMgYm91bmQgdG8gdGhlIGN1cnJlbnQgZXhjZXB0aW9uLCAgJHBfe2syfSQsIGlmIGRlY2xhcmVkLCAgaXMgYm91bmQgdG8gdGhlIGFjdGl2ZSBzdGFjayB0cmFjZSwgYW5kIHRoZW4gJGNhdGNoX2skIGlzIGV4ZWN1dGVkLiBJZiBubyBcT057fS1cQ0FUQ0h7fSBjbGF1c2UgaXMgZm91bmQsIHRoZSBcRklOQUxMWXt9IGNsYXVzZSBpcyBleGVjdXRlZC4gVGhlbiwgZXhlY3V0aW9uIHJlc3VtZXMgYXQgdGhlIGVuZCBvZiB0aGUgdHJ5IHN0YXRlbWVudC4KCgpBIGZpbmFsbHkgY2xhdXNlIFxGSU5BTExZe30gJHMkIGRlZmluZXMgYW4gZXhjZXB0aW9uIGhhbmRsZXIgJGgkIHRoYXQgZXhlY3V0ZXMgYnkgZXhlY3V0aW5nIHRoZSBmaW5hbGx5IGNsYXVzZS4gCiUgSWYgdGhlIGN1cnJlbnQgZXhjZXB0aW9uIGlzIGRlZmluZWQgCgpUaGVuLCBleGVjdXRpb24gcmVzdW1lcyBhdCB0aGUgZW5kIG9mIHRoZSB0cnkgc3RhdGVtZW50LgoKRXhlY3V0aW9uIG9mIGFuIFxPTnt9LVxDQVRDSHt9IGNsYXVzZSBcY29kZXtcT057fSAkVCQgXENBVENIe30gKCRwXzEkLCAkcF8yJCl9ICRzJCBvZiBhIHRyeSBzdGF0ZW1lbnQgJHQkIHByb2NlZWRzIGFzIGZvbGxvd3M6IFRoZSBzdGF0ZW1lbnQgJHMkIGlzIGV4ZWN1dGVkIGluIHRoZSBkeW5hbWljIHNjb3BlIG9mIHRoZSBleGNlcHRpb24gaGFuZGxlciBkZWZpbmVkIGJ5IHRoZSBmaW5hbGx5IGNsYXVzZSBvZiAkdCQuIFRoZW4sIHRoZSBjdXJyZW50IGV4Y2VwdGlvbiBhbmQgYWN0aXZlIHN0YWNrIHRyYWNlIGJvdGggYmVjb21lIHVuZGVmaW5lZC4KCkV4ZWN1dGlvbiBvZiBhIFxGSU5BTExZe30gY2xhdXNlIFxGSU5BTExZe30gJHMkIG9mIGEgdHJ5IHN0YXRlbWVudCBwcm9jZWVkcyBhcyBmb2xsb3dzOiAKClRoZSBzdGF0ZW1lbnQgJHMkIGlzIGV4ZWN1dGVkLiBUaGVuLCBpZiB0aGUgY3VycmVudCBleGNlcHRpb24gaXMgZGVmaW5lZCwgY29udHJvbCBpcyB0cmFuc2ZlcnJlZCB0byB0aGUgbmVhcmVzdCBkeW5hbWljYWxseSBlbmNsb3NpbmcgZXhjZXB0aW9uIGhhbmRsZXIuCgpFeGVjdXRpb24gb2YgYSB0cnkgc3RhdGVtZW50IG9mIHRoZSBmb3JtIFxjb2Rle1xUUll7fSAkc18xJCAkb24tY2F0Y2hfMSBcbGRvdHMgb24tY2F0Y2hfbiQgXEZJTkFMTFl7fSAkc19mJDt9ICBwcm9jZWVkcyBhcyBmb2xsb3dzOgoKVGhlIHN0YXRlbWVudCAkc18xJCBpcyBleGVjdXRlZCBpbiB0aGUgZHluYW1pYyBzY29wZSBvZiB0aGUgZXhjZXB0aW9uIGhhbmRsZXIgZGVmaW5lZCBieSB0aGUgdHJ5IHN0YXRlbWVudC4gVGhlbiwgdGhlIFxGSU5BTExZe30gY2xhdXNlIGlzIGV4ZWN1dGVkLgoKXGNvbW1lbnRhcnl7CldoZXRoZXIgYW55IG9mIHRoZSBcT057fS1cQ0FUQ0h7fSBjbGF1c2VzIGlzIGV4ZWN1dGVkIGRlcGVuZHMgb24gd2hldGhlciBhIG1hdGNoaW5nIGV4Y2VwdGlvbiBoYXMgYmVlbiByYWlzZWQgYnkgJHNfMSQgKHNlZSB0aGUgc3BlY2lmaWNhdGlvbiBvZiB0aGUgdGhyb3cgc3RhdGVtZW50KS4gCgpJZiAkc18xJCBoYXMgcmFpc2VkIGFuIGV4Y2VwdGlvbiwgaXQgd2lsbCB0cmFuc2ZlciBjb250cm9sIHRvIHRoZSB0cnkgc3RhdGVtZW50J3MgaGFuZGxlciwgd2hpY2ggd2lsbCBleGFtaW5lIHRoZSBjYXRjaCBjbGF1c2VzIGluIG9yZGVyIGZvciBhIG1hdGNoIGFzIHNwZWNpZmllZCBhYm92ZS4gSWYgbm8gbWF0Y2hlcyBhcmUgZm91bmQsIHRoZSBoYW5kbGVyIHdpbGwgZXhlY3V0ZSB0aGUgXEZJTkFMTFl7fSBjbGF1c2UuIAoKSWYgYSBtYXRjaGluZyBcT057fS1cQ0FUQ0h7fSB3YXMgZm91bmQsIGl0IHdpbGwgZXhlY3V0ZSBmaXJzdCwgYW5kIHRoZW4gdGhlIFxGSU5BTExZe30gY2xhdXNlIHdpbGwgYmUgZXhlY3V0ZWQuIAoKSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgZXhlY3V0aW9uIG9mIGFuIFxPTnt9LVxDQVRDSHt9IGNsYXVzZSwgdGhpcyB3aWxsIHRyYW5zZmVyIGNvbnRyb2wgdG8gdGhlIGhhbmRsZXIgZm9yIHRoZSBcRklOQUxMWXt9IGNsYXVzZSwgY2F1c2luZyB0aGUgXEZJTkFMTFl7fSBjbGF1c2UgdG8gZXhlY3V0ZSBpbiB0aGlzIGNhc2UgYXMgd2VsbC4gCgpJZiBubyBleGNlcHRpb24gd2FzIHJhaXNlZCwgdGhlIFxGSU5BTExZe30gY2xhdXNlIGlzIGFsc28gZXhlY3V0ZWQuIEV4ZWN1dGlvbiBvZiB0aGUgXEZJTkFMTFl7fSBjbGF1c2UgY291bGQgYWxzbyByYWlzZSBhbiBleGNlcHRpb24sIHdoaWNoIHdpbGwgY2F1c2UgdHJhbnNmZXIgb2YgY29udHJvbCB0byB0aGUgbmV4dCBlbmNsb3NpbmcgaGFuZGxlci4gCn0KCkEgdHJ5IHN0YXRlbWVudCBvZiB0aGUgZm9ybSBcY29kZXtcVFJZe30gJHNfMSQgJG9uLWNhdGNoXzEgXGxkb3RzIG9uLWNhdGNoX24kO30gaXMgZXF1aXZhbGVudCB0byB0aGUgc3RhdGVtZW50IFxjb2Rle1xUUll7fSAkc18xJCAkb24tY2F0Y2hfMSBcbGRvdHMgb24tY2F0Y2hfbiQgXEZJTkFMTFl7fSAkXHtcfSQ7fS4KIAoKXHN1YnNlY3Rpb257IFJldHVybn0KXGxhYmVse3JldHVybn0KClRoZSB7XGVtIHJldHVybiBzdGF0ZW1lbnR9IHJldHVybnMgYSByZXN1bHQgdG8gdGhlIGNhbGxlciBvZiBhIGZ1bmN0aW9uLgoKIFxiZWdpbntncmFtbWFyfQp7XGJmIHJldHVyblN0YXRlbWVudDp9CiAgICBcUkVUVVJOe30gZXhwcmVzc2lvbj8gJ3tcZXNjYXBlZ3JhbW1hciA7fScgJSBjb3VsZCBkbyB0b3AgbGV2ZWwgaGVyZQogICAgLgogXGVuZHtncmFtbWFyfQogICAgCkV4ZWN1dGluZyBhIHJldHVybiBzdGF0ZW1lbnQgCgpcY29kZXtcUkVUVVJOe30gJGUkO30KCmZpcnN0IGNhdXNlcyBldmFsdWF0aW9uIG9mIHRoZSBleHByZXNzaW9uICRlJCwgcHJvZHVjaW5nIGFuIG9iamVjdCAkbyQuIE5leHQsIGNvbnRyb2wgaXMgdHJhbnNmZXJyZWQgdG8gdGhlIGNhbGxlciBvZiB0aGUgY3VycmVudCBmdW5jdGlvbiBhY3RpdmF0aW9uLCBhbmQgdGhlIG9iamVjdCAkbyQgaXMgcHJvdmlkZWQgdG8gdGhlIGNhbGxlciBhcyB0aGUgcmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsLgoKSXQgaXMgYSBzdGF0aWMgdHlwZSB3YXJuaW5nIGlmIHRoZSB0eXBlIG9mICRlJCBtYXkgbm90IGJlIGFzc2lnbmVkIHRvIHRoZSBkZWNsYXJlZCByZXR1cm4gdHlwZSBvZiB0aGUgaW1tZWRpYXRlbHkgZW5jbG9zaW5nIGZ1bmN0aW9uLiAKJUl0IGlzIGEgc3RhdGljIHdhcm5pbmcgaWYgdGhlIGltbWVkaWF0ZWx5IGVuY2xvc2luZyBmdW5jdGlvbiBvZiBhIHJldHVybiBzdGF0ZW1lbnQgb2YgdGhlIGZvcm0gXGNvZGV7XFJFVFVSTnt9ICRlJDt9IGlzIFxWT0lEe30uCgpJbiBjaGVja2VkIG1vZGUsIGl0IGlzIGEgZHluYW1pYyB0eXBlIGVycm9yIGlmICRvJCBpcyBub3QgXE5VTEx7fSBhbmQgdGhlIHJ1bnRpbWUgdHlwZSBvZiAkbyQgaXMgbm90IGEgc3VidHlwZSBvZiB0aGUgYWN0dWFsIHJldHVybiB0eXBlIChccmVme2FjdHVhbFR5cGVPZkFEZWNsYXJhdGlvbn0pIG9mIHRoZSBpbW1lZGlhdGVseSBlbmNsb3NpbmcgZnVuY3Rpb24uCgpJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBhIHJldHVybiBzdGF0ZW1lbnQgb2YgdGhlIGZvcm0gXGNvZGV7XFJFVFVSTnt9ICRlJDt9IGFwcGVhcnMgaW4gYSBnZW5lcmF0aXZlIGNvbnN0cnVjdG9yIChccmVme2dlbmVyYXRpdmVDb25zdHJ1Y3RvcnN9KS4KClxyYXRpb25hbGV7Ckl0IGlzIHF1aXRlIGVhc3kgdG8gZm9yZ2V0IHRvIGFkZCB0aGUgZmFjdG9yeSBwcmVmaXggZm9yIGEgY29uc3RydWN0b3IsIGFjY2lkZW50YWxseSBjb252ZXJ0aW5nIGEgZmFjdG9yeSBpbnRvIGEgZ2VuZXJhdGl2ZSBjb25zdHJ1Y3Rvci4gVGhlIHN0YXRpYyBjaGVja2VyIG1heSBkZXRlY3QgYSB0eXBlIG1pc21hdGNoIGluIHNvbWUsIGJ1dCBub3QgYWxsLCBvZiB0aGVzZSBjYXNlcy4gVGhlIHJ1bGUgYWJvdmUgaGVscHMgY2F0Y2ggc3VjaCBlcnJvcnMsIHdoaWNoIGNhbiBvdGhlcndpc2UgYmUgdmVyeSBoYXJkIHRvIHJlY29nbml6ZS4gVGhlcmUgaXMgbm8gcmVhbCBkb3duc2lkZSB0byBpdCwgYXMgcmV0dXJuaW5nIGEgdmFsdWUgZnJvbSBhIGdlbmVyYXRpdmUgY29uc3RydWN0b3IgaXMgbWVhbmluZ2xlc3MuCn0KCkxldCAkZiQgYmUgdGhlIGZ1bmN0aW9uIGltbWVkaWF0ZWx5IGVuY2xvc2luZyBhIHJldHVybiBzdGF0ZW1lbnQgb2YgdGhlIGZvcm0gXFJFVFVSTnt9OyBJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmIGJvdGggb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGhvbGQ6ClxiZWdpbntpdGVtaXplfQpcaXRlbSAgJGYkIGlzIG5vdCBhIGdlbmVyYXRpdmUgY29uc3RydWN0b3IuClxpdGVtIFRoZSByZXR1cm4gdHlwZSBvZiAkZiQgbWF5IG5vdCBiZSBhc3NpZ25lZCB0byBcVk9JRHt9LiAKXGVuZHtpdGVtaXplfQoKXGNvbW1lbnRhcnl7CkhlbmNlLCBhIHN0YXRpYyB3YXJuaW5nIHdpbGwgbm90IGJlIGlzc3VlZCBpZiAkZiQgaGFzIG5vIGRlY2xhcmVkIHJldHVybiB0eXBlLCBzaW5jZSB0aGUgcmV0dXJuIHR5cGUgd291bGQgYmUgIFxEWU5BTUlDe30gYW5kICBcRFlOQU1JQ3t9IG1heSBiZSBhc3NpZ25lZCB0byBcVk9JRHt9LiBIb3dldmVyLCBhbnkgZnVuY3Rpb24gdGhhdCBkZWNsYXJlcyBhIHJldHVybiB0eXBlIG11c3QgcmV0dXJuIGFuIGV4cHJlc3Npb24gZXhwbGljaXRseS4KfQoKXHJhdGlvbmFsZXtUaGlzIGhlbHBzIGNhdGNoIHNpdHVhdGlvbnMgd2hlcmUgdXNlcnMgZm9yZ2V0IHRvIHJldHVybiBhIHZhbHVlIGluIGEgcmV0dXJuIHN0YXRlbWVudC59CgpBIHJldHVybiBzdGF0ZW1lbnQgb2YgdGhlIGZvcm0gXGNvZGV7XFJFVFVSTnt9O30gIGlzIGV4ZWN1dGVkIGJ5IGV4ZWN1dGluZyB0aGUgc3RhdGVtZW50ICBcY29kZXtcUkVUVVJOe30gXE5VTEx7fTt9IGlmIGl0IG9jY3VycyBpbnNpZGUgYSBtZXRob2QsIGdldHRlciwgc2V0dGVyIG9yIGZhY3Rvcnk7IG90aGVyd2lzZSwgdGhlIHJldHVybiBzdGF0ZW1lbnQgbmVjZXNzYXJpbHkgb2NjdXJzIGluc2lkZSBhIGdlbmVyYXRpdmUgY29uc3RydWN0b3IsIGluIHdoaWNoIGNhc2UgaXQgaXMgZXhlY3V0ZWQgYnkgZXhlY3V0aW5nICBcY29kZXtcUkVUVVJOe30gXFRISVN7fTt9LgoKXGNvbW1lbnRhcnl7RGVzcGl0ZSB0aGUgZmFjdCB0aGF0IFxjb2Rle1xSRVRVUk57fTt9IGlzIGV4ZWN1dGVkIGFzIGlmIGJ5IGEgXGNvZGV7XFJFVFVSTnt9ICRlJDt9LCBpdCBpcyBpbXBvcnRhbnQgdG8gdW5kZXJzdGFuZCB0aGF0IGl0IGlzIG5vdCBhIHN0YXRpYyB3YXJuaW5nIHRvIGluY2x1ZGUgYSBzdGF0ZW1lbnQgb2YgdGhlIGZvcm0gXGNvZGV7XFJFVFVSTnt9O30gCiVpbiBhIFxWT0lEe30gZnVuY3Rpb247IG5laXRoZXIgaXMgaXQgaWxsZWdhbCAKaW4gYSBnZW5lcmF0aXZlIGNvbnN0cnVjdG9yLiBUaGUgcnVsZXMgcmVsYXRlIG9ubHkgdG8gdGhlIHNwZWNpZmljIHN5bnRhY3RpYyBmb3JtIFxjb2Rle1xSRVRVUk57fSAkZSQ7fS4KfQoKClxyYXRpb25hbGV7ClRoZSBtb3RpdmF0aW9uIGZvciBmb3JtdWxhdGluZyBcY29kZXtcUkVUVVJOe307fSBpbiB0aGlzIHdheSBzdGVtcyBmcm9tIHRoZSBiYXNpYyByZXF1aXJlbWVudCB0aGF0IGFsbCBmdW5jdGlvbiBpbnZvY2F0aW9ucyBpbmRlZWQgcmV0dXJuIGEgdmFsdWUuIEZ1bmN0aW9uIGludm9jYXRpb25zIGFyZSBleHByZXNzaW9ucywgYW5kIHdlIGNhbm5vdCByZWx5IG9uIGEgbWFuZGF0b3J5IHR5cGVjaGVja2VyIHRvIGFsd2F5cyBwcm9oaWJpdCB1c2Ugb2YgXFZPSUR7fSBmdW5jdGlvbnMgaW4gZXhwcmVzc2lvbnMuIEhlbmNlLCBhIHJldHVybiBzdGF0ZW1lbnQgbXVzdCBhbHdheXMgcmV0dXJuIGEgdmFsdWUsIGV2ZW4gaWYgbm8gZXhwcmVzc2lvbiBpcyBzcGVjaWZpZWQuCgpUaGUgcXVlc3Rpb24gdGhlbiBiZWNvbWVzLCB3aGF0IHZhbHVlIHNob3VsZCBhIHJldHVybiBzdGF0ZW1lbnQgcmV0dXJuIHdoZW4gbm8gcmV0dXJuIGV4cHJlc3Npb24gaXMgZ2l2ZW4uIEluIGEgZ2VuZXJhdGl2ZSBjb25zdHJ1Y3RvciwgaXQgaXMgb2J2aW91c2x5IHRoZSBvYmplY3QgYmVpbmcgY29uc3RydWN0ZWQgKFxUSElTe30pLiBBIHZvaWQgZnVuY3Rpb24gaXMgbm90IGV4cGVjdGVkIHRvIHBhcnRpY2lwYXRlIGluIGFuIGV4cHJlc3Npb24sIHdoaWNoIGlzIHdoeSBpdCBpcyBtYXJrZWQgXFZPSUR7fSBpbiB0aGUgZmlyc3QgcGxhY2UuIEhlbmNlLCB0aGlzIHNpdHVhdGlvbiBpcyBhIG1pc3Rha2Ugd2hpY2ggc2hvdWxkIGJlIGRldGVjdGVkIGFzIHNvb24gYXMgcG9zc2libGUuIFRoZSBzdGF0aWMgcnVsZXMgaGVscCBoZXJlLCBidXQgaWYgdGhlIGNvZGUgaXMgZXhlY3V0ZWQsIHVzaW5nIFxOVUxMe30gbGVhZHMgdG8gZmFzdCBmYWlsdXJlLCB3aGljaCBpcyBkZXNpcmFibGUgaW4gdGhpcyBjYXNlLiBUaGUgc2FtZSByYXRpb25hbGUgYXBwbGllcyBmb3IgZnVuY3Rpb24gYm9kaWVzIHRoYXQgZG8gbm90IGNvbnRhaW4gYSByZXR1cm4gc3RhdGVtZW50IGF0IGFsbC4KfQoKSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiBhIGZ1bmN0aW9uIGNvbnRhaW5zIGJvdGggb25lIG9yIG1vcmUgZXhwbGljaXQgcmV0dXJuIHN0YXRlbWVudHMgb2YgdGhlIGZvcm0gXGNvZGV7XFJFVFVSTjt9IGFuZCBvbmUgb3IgbW9yZSByZXR1cm4gc3RhdGVtZW50cyBvZiB0aGUgZm9ybSBcY29kZXtcUkVUVVJOe30gJGUkO30uCgoKXHN1YnNlY3Rpb257IExhYmVsc30KXGxhYmVse2xhYmVsc30KCkEge1xlbSBsYWJlbH0gaXMgYW4gaWRlbnRpZmllciBmb2xsb3dlZCBieSBhIGNvbG9uLiBBIHtcZW0gbGFiZWxlZCBzdGF0ZW1lbnR9IGlzIGEgc3RhdGVtZW50IHByZWZpeGVkIGJ5IGEgbGFiZWwgJEwkLiAgQSB7XGVtIGxhYmVsZWQgY2FzZSBjbGF1c2V9IGlzIGEgY2FzZSBjbGF1c2Ugd2l0aGluIGEgc3dpdGNoIHN0YXRlbWVudCAoXHJlZntzd2l0Y2h9KSBwcmVmaXhlZCBieSBhIGxhYmVsICRMJC4KClxyYXRpb25hbGV7VGhlIHNvbGUgcm9sZSBvZiBsYWJlbHMgaXMgdG8gcHJvdmlkZSB0YXJnZXRzIGZvciB0aGUgYnJlYWsgKFxyZWZ7YnJlYWt9KSBhbmQgY29udGludWUgKFxyZWZ7Y29udGludWV9KSBzdGF0ZW1lbnRzLn0KCiVcUXtBcmUgbGFiZWxzIGluIGEgc2VwYXJhdGUgbmFtZXNwYWNlPyBCdWcgNDk3NzQyOTl9IAoKIFxiZWdpbntncmFtbWFyfQp7XGJmIGxhYmVsOn0KICAgICAgaWRlbnRpZmllciAne1xlc2NhcGVncmFtbWFyIDp9JwogICAgLgogXGVuZHtncmFtbWFyfQogCiBUaGUgc2VtYW50aWNzIG9mIGEgbGFiZWxlZCBzdGF0ZW1lbnQgJEw6IHMkIGFyZSBpZGVudGljYWwgdG8gdGhvc2Ugb2YgdGhlIHN0YXRlbWVudCAkcyQuIFRoZSBuYW1lc3BhY2Ugb2YgbGFiZWxzIGlzIGRpc3RpbmN0IGZyb20gdGhlIG9uZSB1c2VkIGZvciB0eXBlcywgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMuCgpUaGUgc2NvcGUgb2YgYSBsYWJlbCB0aGF0IGxhYmVscyBhIHN0YXRlbWVudCAkcyQgaXMgJHMkLiBUaGUgc2NvcGUgb2YgYSBsYWJlbCB0aGF0IGxhYmVscyBhIGNhc2UgY2xhdXNlIG9mIGEgc3dpdGNoIHN0YXRlbWVudCAkcyQgaXMgJHMkLgoKXHJhdGlvbmFsZXtMYWJlbHMgc2hvdWxkIGJlIGF2b2lkZWQgYnkgcHJvZ3JhbW1lcnMgYXQgYWxsIGNvc3RzLiBUaGUgbW90aXZhdGlvbiBmb3IgaW5jbHVkaW5nIGxhYmVscyBpbiB0aGUgbGFuZ3VhZ2UgaXMgcHJpbWFyaWx5IG1ha2luZyBEYXJ0IGEgYmV0dGVyIHRhcmdldCBmb3IgY29kZSBnZW5lcmF0aW9uLgp9CgogClxzdWJzZWN0aW9ueyBCcmVha30KXGxhYmVse2JyZWFrfQoKVGhlIHtcZW0gYnJlYWsgc3RhdGVtZW50fSBjb25zaXN0cyBvZiB0aGUgcmVzZXJ2ZWQgd29yZCBcQlJFQUt7fSBhbmQgYW4gb3B0aW9uYWwgbGFiZWwgKFxyZWZ7bGFiZWxzfSkuIAoKXGJlZ2lue2dyYW1tYXJ9CntcYmYgYnJlYWtTdGF0ZW1lbnQ6fQogICAgIFxCUkVBS3t9IGlkZW50aWZpZXI/ICd7XGVzY2FwZWdyYW1tYXIgO30nCiAgICAuCiBcZW5ke2dyYW1tYXJ9CiAKTGV0ICRzX2IkIGJlIGEgXEJSRUFLe30gc3RhdGVtZW50LiBJZiAkc19iJCBpcyBvZiB0aGUgZm9ybSAgXGNvZGV7XEJSRUFLe30gJEwkO30sIHRoZW4gbGV0ICRzX0UkIGJlIHRoZSB0aGUgaW5uZXJtb3N0IGxhYmVsZWQgc3RhdGVtZW50IHdpdGggbGFiZWwgJEwkIGVuY2xvc2luZyAkc19iJC4gSWYgJHNfYiQgaXMgb2YgdGhlIGZvcm0gXGNvZGV7XEJSRUFLe307fSwgIHRoZW4gbGV0ICRzX0UkIGJlIHRoZSB0aGUgaW5uZXJtb3N0ICBcRE97fSAoXHJlZntkb30pLCBcRk9Se30gKFxyZWZ7Zm9yfSksIFxTV0lUQ0h7fSAoXHJlZntzd2l0Y2h9KSBvciBcV0hJTEV7fSAoXHJlZnt3aGlsZX0pIHN0YXRlbWVudCBlbmNsb3NpbmcgICRzX2IkLiBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBubyBzdWNoIHN0YXRlbWVudCAkc19FJCBleGlzdHMgd2l0aGluIHRoZSBpbm5lcm1vc3QgZnVuY3Rpb24gaW4gd2hpY2ggICRzX2IkIG9jY3Vycy4gIEZ1cnRoZXJtb3JlLCBsZXQgJHNfMSwgXGxkb3RzLCBzX24kIGJlIHRob3NlIFxUUll7fSBzdGF0ZW1lbnRzIHRoYXQgYXJlIGJvdGggZW5jbG9zZWQgaW4gJHNfRSQgYW5kIHRoYXQgZW5jbG9zZSAgJHNfYiQsIGFuZCB0aGF0IGhhdmUgYSBcRklOQUxMWXt9IGNsYXVzZS4gTGFzdGx5LCBsZXQgJGZfaiQgYmUgdGhlIFxGSU5BTExZe30gY2xhdXNlIG9mICRzX2osIDEgXGxlIGogXGxlIG4kLiAgIEV4ZWN1dGluZyAgJHNfYiQgZmlyc3QgZXhlY3V0ZXMgJGZfMSwgXGxkb3RzLCAgZl9uJCBpbiBpbm5lcm1vc3QtY2xhdXNlLWZpcnN0ICBvcmRlciBhbmQgdGhlbiB0ZXJtaW5hdGVzICRzX0UkLiAKCgpcc3Vic2VjdGlvbnsgQ29udGludWV9ClxsYWJlbHtjb250aW51ZX0KClRoZSB7XGVtIGNvbnRpbnVlIHN0YXRlbWVudH0gY29uc2lzdHMgb2YgdGhlIHJlc2VydmVkIHdvcmQgXENPTlRJTlVFe30gYW5kIGFuIG9wdGlvbmFsIGxhYmVsIChccmVme2xhYmVsc30pLiAKClxiZWdpbntncmFtbWFyfQp7XGJmIGNvbnRpbnVlU3RhdGVtZW50On0KICAgIFxDT05USU5VRXt9IGlkZW50aWZpZXI/ICd7XGVzY2FwZWdyYW1tYXIgO30nCiAgICAgICAgLgogXGVuZHtncmFtbWFyfSAgICAgIAogCiBMZXQgJHNfYyQgYmUgYSBcQ09OVElOVUV7fSBzdGF0ZW1lbnQuIElmICRzX2MkIGlzIG9mIHRoZSBmb3JtICBcY29kZXtcQ09OVElOVUV7fSAkTCQ7fSwgdGhlbiBsZXQgJHNfRSQgYmUgdGhlIHRoZSBpbm5lcm1vc3QgbGFiZWxlZCBcRE97fSAoXHJlZntkb30pLCBcRk9Se30gKFxyZWZ7Zm9yfSkgb3IgXFdISUxFe30gKFxyZWZ7d2hpbGV9KSBzdGF0ZW1lbnQgb3IgY2FzZSBjbGF1c2Ugd2l0aCBsYWJlbCAkTCQgZW5jbG9zaW5nICRzX2MkLiBJZiAkc19jJCBpcyBvZiB0aGUgZm9ybSBcY29kZXtcQ09OVElOVUV7fTt9ICB0aGVuIGxldCAkc19FJCBiZSB0aGUgdGhlIGlubmVybW9zdCAgXERPe30gKFxyZWZ7ZG99KSwgXEZPUnt9IChccmVme2Zvcn0pIG9yIFxXSElMRXt9IChccmVme3doaWxlfSkgc3RhdGVtZW50IGVuY2xvc2luZyAgJHNfYyQuIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIG5vIHN1Y2ggc3RhdGVtZW50IG9yIGNhc2UgY2xhdXNlICRzX0UkIGV4aXN0cyB3aXRoaW4gdGhlIGlubmVybW9zdCBmdW5jdGlvbiBpbiB3aGljaCAgJHNfYyQgb2NjdXJzLiAgRnVydGhlcm1vcmUsIGxldCAkc18xLCBcbGRvdHMsIHNfbiQgYmUgdGhvc2UgXFRSWXt9IHN0YXRlbWVudHMgdGhhdCBhcmUgYm90aCBlbmNsb3NlZCBpbiAkc19FJCBhbmQgdGhhdCBlbmNsb3NlICAkc19jJCwgYW5kIHRoYXQgaGF2ZSBhIFxGSU5BTExZe30gY2xhdXNlLiBMYXN0bHksIGxldCAkZl9qJCBiZSB0aGUgXEZJTkFMTFl7fSBjbGF1c2Ugb2YgJHNfaiwgMSBcbGUgaiBcbGUgbiQuICAgRXhlY3V0aW5nICAkc19jJCBmaXJzdCBleGVjdXRlcyAkZl8xLCBcbGRvdHMsICBmX24kIGluIGlubmVybW9zdC1jbGF1c2UtZmlyc3QgIG9yZGVyLiBUaGVuLCBpZiAkc19FJCBpcyBhIGNhc2UgY2xhdXNlLCBjb250cm9sIGlzIHRyYW5zZmVycmVkIHRvIHRoZSBjYXNlIGNsYXVzZS4gT3RoZXJ3aXNlLCAkc19FJCBpcyBuZWNlc3NhcmlseSBhIGxvb3AgYW5kIGV4ZWN1dGlvbiByZXN1bWVzIGFmdGVyIHRoZSBsYXN0IHN0YXRlbWVudCBpbiB0aGUgbG9vcCBib2R5LgogCiBcY29tbWVudGFyeXsKIEluIGEgd2hpbGUgbG9vcCwgdGhhdCB3b3VsZCBiZSB0aGUgYm9vbGVhbiBleHByZXNzaW9uIGJlZm9yZSB0aGUgYm9keS4gSW4gYSBkbyBsb29wLCBpdCB3b3VsZCBiZSB0aGUgYm9vbGVhbiBleHByZXNzaW9uIGFmdGVyIHRoZSBib2R5LiBJbiBhIGZvciBsb29wLCBpdCB3b3VsZCBiZSB0aGUgaW5jcmVtZW50IGNsYXVzZS4gIEluIG90aGVyIHdvcmRzLCBleGVjdXRpb24gY29udGludWVzIHRvIHRoZSBuZXh0IGl0ZXJhdGlvbiBvZiB0aGUgbG9vcC4KIH0KIAoKXHN1YnNlY3Rpb257IEFzc2VydH0KXGxhYmVse2Fzc2VydH0KCkFuIHtcZW0gYXNzZXJ0IHN0YXRlbWVudH0gaXMgdXNlZCB0byBkaXNydXB0IG5vcm1hbCBleGVjdXRpb24gaWYgYSBnaXZlbiBib29sZWFuIGNvbmRpdGlvbiBkb2VzIG5vdCBob2xkLgoKXGJlZ2lue2dyYW1tYXJ9CntcYmYgYXNzZXJ0U3RhdGVtZW50On0KICAgYXNzZXJ0ICcoJyBjb25kaXRpb25hbEV4cHJlc3Npb24gJyknICd7XGVzY2FwZWdyYW1tYXIgO30nCiAgICAgIC4KXGVuZHtncmFtbWFyfQogICAgICAKVGhlIGFzc2VydCBzdGF0ZW1lbnQgaGFzIG5vIGVmZmVjdCBpbiBwcm9kdWN0aW9uIG1vZGUuIEluIGNoZWNrZWQgbW9kZSwgZXhlY3V0aW9uIG9mIGFuIGFzc2VydCBzdGF0ZW1lbnQgXGNvZGV7XEFTU0VSVHt9KCRlJCk7fSBwcm9jZWVkcyBhcyBmb2xsb3dzOgoKVGhlIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gJGUkIGlzIGV2YWx1YXRlZCB0byBhbiBvYmplY3QgJG8kLiBJZiB0aGUgY2xhc3Mgb2YgJG8kIGlzIGEgc3VidHlwZSBvZiBcY29kZXtGdW5jdGlvbn0gdGhlbiBsZXQgJHIkIGJlIHRoZSByZXN1bHQgb2YgaW52b2tpbmcgJG8kIHdpdGggbm8gYXJndW1lbnRzLiBPdGhlcndpc2UsIGxldCAkciQgYmUgJG8kLiAKSXQgaXMgYSBkeW5hbWljIHR5cGUgZXJyb3IgaWYgJG8kIGlzIG5vdCBvZiB0eXBlIFxjb2Rle2Jvb2x9IG9yIG9mIHR5cGUgXGNvZGV7RnVuY3Rpb259LCBvciBpZiAkciQgaXMgbm90IG9mIHR5cGUgXGNvZGV7Ym9vbH0uICBJZiAkciQgaXMgXEZBTFNFe30sIHdlIHNheSB0aGF0IHRoZSBhc3NlcnRpb24gZmFpbGVkLiBJZiAkciQgaXMgXFRSVUV7fSwgd2Ugc2F5IHRoYXQgdGhlIGFzc2VydGlvbiBzdWNjZWVkZWQuIElmIHRoZSBhc3NlcnRpb24gc3VjY2VlZGVkLCBleGVjdXRpb24gb2YgdGhlIGFzc2VydCBzdGF0ZW1lbnQgaXMgY29tcGxldGUuIElmIHRoZSBhc3NlcnRpb24gZmFpbGVkLCBhbiBcY29kZXtBc3NlcnRpb25FcnJvcn0gaXMgdGhyb3duLgoKJVxRe01pZ2h0IGJlIGNsZWFuZXIgdG8gZGVmaW5lIGl0IGFzIFxjb2Rle2lmICghJGUkKSBce1xUSFJPV3t9IFxORVd7fSBBc3NlcnRpb25FcnJvcigpO1x9fSAoaW4gY2hlY2tlZCBtb2RlIG9ubHkpLgolV2hhdCBhYm91dCBhbiBlcnJvciBtZXNzYWdlIGFzIHBhcnQgb2YgdGhlIGFzc2VydD99CgogSXQgaXMgYSBzdGF0aWMgdHlwZSB3YXJuaW5nIGlmIHRoZSB0eXBlIG9mICRlJCBtYXkgbm90IGJlIGFzc2lnbmVkIHRvIGVpdGhlciAgXGNvZGV7Ym9vbH0gb3IgJCgpIFxyaWdodGFycm93JCBcY29kZXtib29sfS4gIAoKXHJhdGlvbmFsZXtXaHkgaXMgdGhpcyBhIHN0YXRlbWVudCwgbm90IGEgYnVpbHQgaW4gZnVuY3Rpb24gY2FsbD8gQmVjYXVzZSBpdCBpcyBoYW5kbGVkIG1hZ2ljYWxseSBzbyBpdCBoYXMgbm8gZWZmZWN0IGFuZCBubyBvdmVyaGVhZCBpbiBwcm9kdWN0aW9uIG1vZGUuIEFsc28sIGluIHRoZSBhYnNlbmNlIG9mIGZpbmFsIG1ldGhvZHMuIG9uZSBjb3VsZCBub3QgcHJldmVudCBpdCBiZWluZyBvdmVycmlkZGVuICh0aG91Z2ggdGhlcmUgaXMgbm8gcmVhbCBoYXJtIGluIHRoYXQpLiAgSXQgY2Fubm90IGJlIHZpZXdlZCBhcyBhIGZ1bmN0aW9uIGNhbGwgdGhhdCBpcyBiZWluZyBvcHRpbWl6ZWQgYXdheSBiZWNhdXNlIHRoZSBhcmd1bWVudCBtaWdodCBoYXZlIHNpZGUgZWZmZWN0cy4KfQoKJUlmIGEgbGV4aWNhbGx5IHZpc2libGUgZGVjbGFyYXRpb24gbmFtZWQgXGNvZGV7YXNzZXJ0fSBpcyBpbiBzY29wZSwgYW4gYXNzZXJ0IHN0YXRlbWVudCAKJVxjb2Rle1xBU1NFUlR7fSAoZSk7IH0KJWlzIGludGVycHJldGVkIGFzIGFuIGV4cHJlc3Npb24gc3RhdGVtZW50IFxjb2Rleyhhc3NlcnQoZSkpO30gLgoKJVxyYXRpb25hbGV7CiVTaW5jZSBcQVNTRVJUe30gaXMgYSBidWlsdC1pbiBpZGVudGlmaWVyLCBvbmUgbWlnaHQgZGVmaW5lIGEgZnVuY3Rpb24gb3IgbWV0aG9kIHdpdGggdGhpcyBuYW1lLgolSXQgaXMgaW1wb3NzaWJsZSB0byBkaXN0aW5ndWlzaCBhcyBcQVNTRVJUe30gc3RhdGVtZW50IGZyb20gYSBtZXRob2QgaW52b2NhdGlvbiBpbiBzdWNoIGEgc2l0dWF0aW9uLiAKJU9uZSBjb3VsZCBjaG9vc2UgdG8gYWx3YXlzIGludGVycHJldCBzdWNoIGNvZGUgYXMgYW4gXEFTU0VSVHt9IHN0YXRlbWVudC4gT3Igd2UgY291bGQgY2hvb3NlIHRvIGdpdmUgcHJpb3JpdHkgdG8gYW55IGxleGljYWxseSB2aXNpYmxlIHVzZXIgZGVmaW5lZCBmdW5jdGlvbi4gIFRoZSBmb3JtZXIgY2FuIGNhdXNlIHJhdGhlciBwdXp6bGluZyBzaXR1YXRpb25zLCBlLmcuLH0KCiVcYmVnaW57ZGFydENvZGV9CiUgYXNzZXJ0KGJvb2wgYilce3ByaW50KCdNeSBQZXJzb25hbCBBc3NlcnRpb24gXCRiJyk7XH0KCiUgYXNzZXJ0XF9wdXp6bGVyKCkgXHsKJSAgIChhc3NlcnQoXFRSVUV7fSkpOyAvLyBwcmludHMgdHJ1ZQolICAgYXNzZXJ0KFxUUlVFe30pOyAvLyB3b3VsZCBkbyBub3RoaW5nCiUgICAoYXNzZXJ0KFxGQUxTRXt9KSk7IC8vIHByaW50cyBmYWxzZQolICAgYXNzZXJ0KFxGQUxTRXt9KTsgLy8gd291bGQgdGhyb3cgaWYgYXNzZXJ0cyBlbmFibGVkLCBvciBkbyBub3RoaW5nIG90aGVyd2lzZQolIFx9CgolXGVuZHtkYXJ0Q29kZX0KCiVccmF0aW9uYWxle3RoZXJlZm9yZSwgd2Ugb3B0IGZvciB0aGUgc2Vjb25kIG9wdGlvbi4gQWx0ZXJuYXRlbHksIG9uZSBjb3VsZCBpbnNpc3QgdGhhdCBhc3NlcnQgYmUgYSByZXNlcnZlZCB3b3JkLCB3aGljaCBtYXkgaGF2ZSBhbiB1bmRlc2lyYWJsZSBlZmZlY3Qgd2l0aCByZXNwZWN0IHRvIGNvbXBhdGliaWxpdHkgb2YgSmF2YXNjcmlwdCBjb2RlIHBvcnRlZCB0byBEYXJ0Ln0KClxzZWN0aW9ue0xpYnJhcmllcyBhbmQgU2NyaXB0c30KXGxhYmVse2xpYnJhcmllc0FuZFNjcmlwdHN9CgpBIERhcnQgcHJvZ3JhbSBjb25zaXN0cyBvZiBvbmUgb3IgbW9yZSBsaWJyYXJpZXMsIGFuZCBtYXkgYmUgYnVpbHQgb3V0IG9mIG9uZSBvciBtb3JlIHtcZW0gY29tcGlsYXRpb24gdW5pdHN9LiBBIGNvbXBpbGF0aW9uIHVuaXQgbWF5IGJlIGEgbGlicmFyeSBvciBhIHBhcnQgKFxyZWZ7cGFydHN9KS4gCgpBIGxpYnJhcnkgY29uc2lzdHMgb2YgKGEgcG9zc2libHkgZW1wdHkpIHNldCBvZiBpbXBvcnRzLCBhIHNldCBvZiBleHBvcnRzLCAgYW5kIGEgc2V0IG9mIHRvcC1sZXZlbCBkZWNsYXJhdGlvbnMuIEEgdG9wLWxldmVsIGRlY2xhcmF0aW9uIGlzIGVpdGhlciBhIGNsYXNzIChccmVme2NsYXNzZXN9KSwgYSB0eXBlIGFsaWFzIGRlY2xhcmF0aW9uIChccmVme3R5cGVkZWZ9KSwgYSBmdW5jdGlvbiAoXHJlZntmdW5jdGlvbnN9KSBvciBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uIChccmVme3ZhcmlhYmxlc30pLiBUaGUgbWVtYmVycyBvZiBhIGxpYnJhcnkgJEwkIGFyZSB0aG9zZSB0b3AgbGV2ZWwgZGVjbGFyYXRpb25zIGdpdmVuIHdpdGhpbiAkTCQuCgogXGJlZ2lue2dyYW1tYXJ9CntcYmYgdG9wTGV2ZWxEZWZpbml0aW9uOn1jbGFzc0RlZmluaXRpb247CiUgICAgICBjbGFzc0RlZmluaXRpb25PckludGVyZmFjZUluamVjdGlvbjsKJSAgICAgIGludGVyZmFjZURlZmluaXRpb25PckludGVyZmFjZUluamVjdGlvbjsKICUgICAgIG1peGluQXBwbGljYXRpb247CiAgICAgIHR5cGVBbGlhczsKICAgICAgXEVYVEVSTkFMe30/IGZ1bmN0aW9uU2lnbmF0dXJlIGB7XGVzY2FwZWdyYW1tYXIgO30nOwogICAgICBcRVhURVJOQUx7fT8gZ2V0dGVyU2lnbmF0dXJlIGB7XGVzY2FwZWdyYW1tYXIgO30nOwogICAgICBcRVhURVJOQUx7fT8gc2V0dGVyU2lnbmF0dXJlIGB7XGVzY2FwZWdyYW1tYXIgO30nOyAgICAgIAogICAgICBmdW5jdGlvblNpZ25hdHVyZSBmdW5jdGlvbkJvZHk7CiAgICAgIHJldHVyblR5cGU/IFxHRVR7fSBpZGVudGlmaWVyIGZ1bmN0aW9uQm9keTsKICAgICAgcmV0dXJuVHlwZT8gXFNFVHt9IGlkZW50aWZpZXIgZm9ybWFsUGFyYW1ldGVyTGlzdCBmdW5jdGlvbkJvZHk7CiAgICAgIChcRklOQUx7fSAkfCQgXENPTlNUe30pIHR5cGU/IHN0YXRpY0ZpbmFsRGVjbGFyYXRpb25MaXN0IGB7XGVzY2FwZWdyYW1tYXIgO30nOwogICAgICB2YXJpYWJsZURlY2xhcmF0aW9uIGB7XGVzY2FwZWdyYW1tYXIgO30nCiAgICAuCiAgICAKICAgIHtcYmYgZ2V0T3JTZXQ6fSBcR0VUe307CiAgICAgIFxTRVR7fQogICAgLgoKJSAgICBjbGFzc0RlZmluaXRpb25PckludGVyZmFjZUluamVjdGlvbjoKICUgICAgIGNsYXNzRGVmaW5pdGlvbjsKICAlICAgIGNsYXNzSW50ZXJmYWNlSW5qZWN0aW9uCiAlICAgLgoKJWludGVyZmFjZURlZmluaXRpb25PckludGVyZmFjZUluamVjdGlvbjoKICUgICAgIGludGVyZmFjZURlZmluaXRpb247CiAgICAgJSBpbnRlcmZhY2VJbnRlcmZhY2VJbmplY3Rpb24KICAlICAuCgp7XGJmIGxpYnJhcnlEZWZpbml0aW9uOn0KJSAgICAgIGxpYnJhcnkgJ1x7JyBsaWJyYXJ5Qm9keSAnXH0nCiAgICAgIHNjcmlwdFRhZz8gbGlicmFyeU5hbWU/IGltcG9ydE9yRXhwb3J0KiBwYXJ0RGlyZWN0aXZlKiB0b3BMZXZlbERlZmluaXRpb24qCiAgICAuCiAgICAKICAgIHtcYmYgICAgIHNjcmlwdFRhZzp9CiAgIGBcIyEnIHtcZXNjYXBlZ3JhbW1hciAoXH57fU5FV0xJTkUpKn0gTkVXTElORQogLiAgICAKCntcYmYgbGlicmFyeU5hbWU6fQogICBtZXRhZGF0YSBcTElCUkFSWXt9IGlkZW50aWZpZXIgKGB7XGVzY2FwZWdyYW1tYXIgLn0nIGlkZW50aWZpZXIpKiBge1xlc2NhcGVncmFtbWFyIDt9JwogICAuCgp7XGJmIGltcG9ydE9yRXhwb3J0On1saWJyYXJ5SW1wb3J0IDsKICBsaWJyYXJ5RXhwb3J0ICAgCiBcZW5ke2dyYW1tYXJ9CiAKIExpYnJhcmllcyBtYXkgYmUge1xlbSBleHBsaWNpdGx5IG5hbWVkfSBvciB7XGVtIGltcGxpY2l0bHkgbmFtZWR9LiBBbiBleHBsaWNpdGx5IG5hbWVkIGxpYnJhcnkgYmVnaW5zIHdpdGggIHRoZSAgd29yZCBcTElCUkFSWXt9IChwb3NzaWJseSBwcmVmYWNlZCB3aXRoIGFueSBhcHBsaWNhYmxlIG1ldGFkYXRhIGFubm90YXRpb25zKSwgZm9sbG93ZWQgYnkgYSBxdWFsaWZpZWQgaWRlbnRpZmllciB0aGF0IGdpdmVzIHRoZSBuYW1lIG9mIHRoZSBsaWJyYXJ5LgogCiBcY29tbWVudGFyeXsKIFRlY2huaWNhbGx5LCBlYWNoIGRvdCBhbmQgaWRlbnRpZmllciBpcyBhIHNlcGFyYXRlIHRva2VuIGFuZCBzbyBzcGFjZXMgYmV0d2VlbiB0aGVtIGFyZSBhY2NlcHRhYmxlLiBIb3dldmVyLCB0aGUgYWN0dWFsIGxpYnJhcnkgbmFtZSBpcyB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgc2ltcGxlIGlkZW50aWZpZXJzIGFuZCBkb3RzIGFuZCBjb250YWlucyBubyBzcGFjZXMuCiB9CiAKQW4gaW1wbGljaXRseSBuYW1lZCBsaWJyYXJ5IGhhcyB0aGUgZW1wdHkgc3RyaW5nIGFzIGl0cyBuYW1lLiAKCiBccmF0aW9uYWxlewpUaGUgbmFtZSBvZiBhIGxpYnJhcnkgaXMgdXNlZCB0byB0aWUgaXQgdG8gc2VwYXJhdGVseSBjb21waWxlZCBwYXJ0cyBvZiB0aGUgbGlicmFyeSAoY2FsbGVkIHBhcnRzKSBhbmQgIGNhbiBiZSB1c2VkIGZvciBwcmludGluZyBhbmQsIG1vcmUgZ2VuZXJhbGx5LCByZWZsZWN0aW9uLiBUaGUgbmFtZSBtYXkgYmUgcmVsZXZhbnQgZm9yIGZ1cnRoZXIgbGFuZ3VhZ2UgZXZvbHV0aW9uLgogfQogCiBcY29tbWVudGFyeXsKTGlicmFyaWVzIGludGVuZGVkIGZvciB3aWRlc3ByZWFkIHVzZSBzaG91bGQgYXZvaWQgbmFtZSBjb2xsaXNpb25zLiAgRGFydCdzIFxjb2Rle3B1Yn0gcGFja2FnZSBtYW5hZ2VtZW50IHN5c3RlbSBwcm92aWRlcyBhIG1lY2hhbmlzbSBmb3IgZG9pbmcgc28uICBFYWNoIHB1YiBwYWNrYWdlIGlzIGd1YXJhbnRlZWQgYSB1bmlxdWUgbmFtZSwgZWZmZWN0aXZlbHkgZW5mb3JjaW5nIGEgZ2xvYmFsIG5hbWVzcGFjZS4KIH0KIAogQSBsaWJyYXJ5IG1heSBvcHRpb25hbGx5IGJlZ2luIHdpdGggYSB7XGVtIHNjcmlwdCB0YWd9LiBTY3JpcHQgdGFncyBhcmUgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIHNjcmlwdHMgKFxyZWZ7c2NyaXB0c30pLiAgQSBzY3JpcHQgdGFnIGNhbiBiZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBpbnRlcnByZXRlciBvZiB0aGUgc2NyaXB0IHRvIHdoYXRldmVyIGNvbXB1dGluZyBlbnZpcm9ubWVudCB0aGUgc2NyaXB0IGlzIGVtYmVkZGVkIGluLiBUaGUgc2NyaXB0IHRhZyBtdXN0IGFwcGVhciBiZWZvcmUgYW55IHdoaXRlc3BhY2Ugb3IgY29tbWVudHMuICBBIHNjcmlwdCAgdGFnIGJlZ2lucyB3aXRoIHRoZSBjaGFyYWN0ZXJzIFwjISBhbmQgZW5kcyBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lLiBBbnkgY2hhcmFjdGVycyB0aGF0IGZvbGxvdyBcIyEgIGluIHRoZSBzY3JpcHQgdGFnIGFyZSBpZ25vcmVkIGJ5IHRoZSBEYXJ0IGltcGxlbWVudGF0aW9uLgogCkxpYnJhcmllcyBhcmUgdW5pdHMgb2YgcHJpdmFjeS4gQSBwcml2YXRlIGRlY2xhcmF0aW9uIGRlY2xhcmVkIHdpdGhpbiBhIGxpYnJhcnkgJEwkIGNhbiBvbmx5IGJlIGFjY2Vzc2VkIGJ5IGNvZGUgd2l0aGluICRMJC4gQW55IGF0dGVtcHQgdG8gYWNjZXNzIGEgcHJpdmF0ZSBtZW1iZXIgZGVjbGFyYXRpb24gZnJvbSBvdXRzaWRlICRMJCB3aWxsIGNhdXNlIGEgbWV0aG9kLCBnZXR0ZXIgb3Igc2V0dGVyIGxvb2t1cCBmYWlsdXJlLgoKXGNvbW1lbnRhcnl7U2luY2UgdG9wIGxldmVsIHByaXZhdGVzIGFyZSBub3QgaW1wb3J0ZWQsIHVzaW5nIHRoZSB0b3AgbGV2ZWwgcHJpdmF0ZXMgb2YgYW5vdGhlciBsaWJyYXJ5IGlzIG5ldmVyIHBvc3NpYmxlLiB9CgpUaGUge1xlbSBwdWJsaWMgbmFtZXNwYWNlfSBvZiBsaWJyYXJ5ICRMJCBpcyB0aGUgbWFwcGluZyB0aGF0IG1hcHMgdGhlIHNpbXBsZSBuYW1lIG9mIGVhY2ggcHVibGljIHRvcC1sZXZlbCBtZW1iZXIgJG0kIG9mICRMJCB0byAkbSQuIApUaGUgc2NvcGUgb2YgYSBsaWJyYXJ5ICRMJCBjb25zaXN0cyBvZiB0aGUgbmFtZXMgaW50cm9kdWNlZCBieSBhbGwgdG9wLWxldmVsIGRlY2xhcmF0aW9ucyBkZWNsYXJlZCBpbiAkTCQsIGFuZCB0aGUgbmFtZXMgYWRkZWQgYnkgJEwkJ3MgaW1wb3J0cyAoXHJlZntpbXBvcnRzfSkuCgoKXHN1YnNlY3Rpb257SW1wb3J0c30KXGxhYmVse2ltcG9ydHN9CgpBbiB7XGVtIGltcG9ydH0gc3BlY2lmaWVzIGEgbGlicmFyeSB0byBiZSB1c2VkIGluIHRoZSBzY29wZSBvZiBhbm90aGVyIGxpYnJhcnkuIApcYmVnaW57Z3JhbW1hcn0Ke1xiZiBsaWJyYXJ5SW1wb3J0On0KICAgbWV0YWRhdGEgaW1wb3J0U3BlY2lmaWNhdGlvbgogICAgLgogCiB7XGJmIGltcG9ydFNwZWNpZmljYXRpb246fQogICAgXElNUE9SVHt9ICB1cmkgKFxBU3t9IGlkZW50aWZpZXIpPyAgY29tYmluYXRvciogYHtcZXNjYXBlZ3JhbW1hciA7fSc7CiAgICAgXElNUE9SVHt9ICB1cmkgXERFRkVSUkVEe30gXEFTe30gaWRlbnRpZmllciAgY29tYmluYXRvciogYHtcZXNjYXBlZ3JhbW1hciA7fScKICAgIC4KICAgICAgIAp7XGJmIGNvbWJpbmF0b3I6fVxTSE9Xe30gaWRlbnRpZmllckxpc3Q7ClxISURFe30gaWRlbnRpZmllckxpc3QKICAgIC4KICAgIAogICAge1xiZiBpZGVudGlmaWVyTGlzdDp9CiAgICAgIGlkZW50aWZpZXIgKCwgaWRlbnRpZmllcikqCiBcZW5ke2dyYW1tYXJ9CiAKCkFuIGltcG9ydCBzcGVjaWZpZXMgYSBVUkkgJHgkIHdoZXJlIHRoZSBkZWNsYXJhdGlvbiBvZiBhbiBpbXBvcnRlZCBsaWJyYXJ5IGlzIHRvIGJlIGZvdW5kLiAKCkltcG9ydHMgbWF5IGJlIHtcZW0gZGVmZXJyZWR9IG9yIHtcZW0gaW1tZWRpYXRlfS4gQSBkZWZlcnJlZCBpbXBvcnQgaXMgZGlzdGluZ3Vpc2hlZCBieSB0aGUgYXBwZWFyYW5jZSBvZiB0aGUgYnVpbHQtaW4gaWRlbnRpZmllciBcREVGRVJSRUR7fSBhZnRlciB0aGUgVVJJLiBBbnkgaW1wb3J0IHRoYXQgaXMgbm90IGRlZmVycmVkIGlzIGltbWVkaWF0ZS4KCkl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmICB0aGUgc3BlY2lmaWVkIFVSSSBvZiBhbiBpbW1lZGlhdGUgaW1wb3J0IGRvZXMgbm90IHJlZmVyIHRvIGEgbGlicmFyeSBkZWNsYXJhdGlvbi4gIFRoZSBpbnRlcnByZXRhdGlvbiBvZiBVUklzIGlzIGRlc2NyaWJlZCBpbiBzZWN0aW9uIFxyZWZ7dXJpc30gYmVsb3cuCgpJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmIHRoZSBzcGVjaWZpZWQgVVJJIG9mIGEgZGVmZXJyZWQgaW1wb3J0IGRvZXMgbm90IHJlZmVyIHRvIGEgbGlicmFyeSBkZWNsYXJhdGlvbi4KClxyYXRpb25hbGV7CiBPbmUgY2Fubm90IGRldGVjdCB0aGUgcHJvYmxlbSBhdCBjb21waWxlIHRpbWUgYmVjYXVzZSBjb21waWxhdGlvbiBvZnRlbiBvY2N1cnMgZHVyaW5nIGV4ZWN1dGlvbiBhbmQgIG9uZSBkb2VzIG5vdCBrbm93IHdoYXQgdGhlIFVSSSByZWZlcnMgdG8uICBIb3dldmVyIHRoZSBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCBzaG91bGQgZGV0ZWN0IHRoZSBwcm9ibGVtLgogfQoKIApUaGUge1xlbSBjdXJyZW50IGxpYnJhcnl9IGlzIHRoZSBsaWJyYXJ5IGN1cnJlbnRseSBiZWluZyBjb21waWxlZC4gVGhlIGltcG9ydCBtb2RpZmllcyB0aGUgIG5hbWVzcGFjZSBvZiB0aGUgY3VycmVudCBsaWJyYXJ5IGluIGEgbWFubmVyIHRoYXQgaXMgZGV0ZXJtaW5lZCBieSB0aGUgaW1wb3J0ZWQgbGlicmFyeSBhbmQgYnkgdGhlIG9wdGlvbmFsIGVsZW1lbnRzIG9mICB0aGUgaW1wb3J0LgogICAgIApBbiBpbW1lZGlhdGUgaW1wb3J0IGRpcmVjdGl2ZSAkSSQgbWF5IG9wdGlvbmFsbHkgaW5jbHVkZSBhIHByZWZpeCBjbGF1c2Ugb2YgdGhlIGZvcm0gXEFTe30gXGNvZGV7SWR9IHVzZWQgdG8gcHJlZml4IG5hbWVzIGltcG9ydGVkIGJ5ICRJJC4gQSBkZWZlcnJlZCBpbXBvcnQgbXVzdCBpbmNsdWRlIGEgcHJlZml4IGNsYXVzZSBvciBhIGNvbXBpbGUgdGltZSBlcnJvciBvY2N1cnMuIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIGEgcHJlZml4IHVzZWQgaW4gYSBkZWZlcnJlZCBpbXBvcnQgaXMgdXNlZCBpbiBhbm90aGVyIGltcG9ydCBjbGF1c2UuCgpBbiBpbXBvcnQgZGlyZWN0aXZlICRJJCBtYXkgb3B0aW9uYWxseSBpbmNsdWRlIGEgbmFtZXNwYWNlIGNvbWJpbmF0b3IgY2xhdXNlcyB1c2VkIHRvIHJlc3RyaWN0IHRoZSBzZXQgb2YgbmFtZXMgaW1wb3J0ZWQgYnkgJEkkLiBDdXJyZW50bHksIHR3byBuYW1lc3BhY2UgY29tYmluYXRvcnMgYXJlIHN1cHBvcnRlZDogXEhJREV7fSBhbmQgXFNIT1d7fS4KCkxldCAkSSQgYmUgYW4gaW1wb3J0IGRpcmVjdGl2ZSB0aGF0IHJlZmVycyB0byBhIFVSSSB2aWEgdGhlIHN0cmluZyAkc18xJC4gRXZhbHVhdGlvbiBvZiAkSSQgIHByb2NlZWRzIGFzIGZvbGxvd3M6CgpJZiAkSSQgaXMgYSBkZWZlcnJlZCBpbXBvcnQsIG5vIGV2YWx1YXRpb24gdGFrZXMgcGxhY2UuIEluc3RlYWQsIHRoZSBmb2xsb3dpbmcgbmFtZXMgYXJlIGFkZGVkIHRvIHRoZSBzY29wZSBvZiAkTCQ6ClxiZWdpbntpdGVtaXplfQpcaXRlbQpUaGUgbmFtZSBvZiB0aGUgcHJlZml4LCAkcCQgZGVub3RpbmcgYSBkZWZlcnJlZCBwcmVmaXggZGVjbGFyYXRpb24uClxpdGVtClRoZSBuYW1lIFxjb2RleyRwJC5sb2FkTGlicmFyeX0sIGRlbm90aW5nIGEgdG9wIGxldmVsIGZ1bmN0aW9uIHdpdGggbm8gYXJndW1lbnRzLCB3aG9zZSBzZW1hbnRpY3MgYXJlIGRlc2NyaWJlZCBiZWxvdy4KXGVuZHtpdGVtaXplfQogCkEgZGVmZXJyZWQgcHJlZml4ICRwJCBtYXkgYmUgbG9hZGVkIGV4cGxpY2l0bHkgdmlhIHRoZSBmdW5jdGlvbiBjYWxsIFxjb2RleyRwJC5sb2FkTGlicmFyeX0sIHdoaWNoIHJldHVybnMgYSBmdXR1cmUgJGYkLiBUaGUgZWZmZWN0IG9mIHRoZSBjYWxsIGlzIHRvIGNhdXNlIGFuIGltbWVkaWF0ZSBpbXBvcnQgJEnVJCB0byBiZSBleGVjdXRlZCBhdCBzb21lIGZ1dHVyZSB0aW1lLCB3aGVyZSAkSdUkIGlzIGlzIGRlcml2ZWQgZnJvbSAkSSQgYnkgZWxpZGluZyB0aGUgd29yZCBcREVGRVJSRUR7fSBhbmQgYWRkaW5nIGEgXEhJREV7fSBcY29kZXtsb2FkTGlicmFyeX0gIGNvbWJpbmF0b3IgY2xhdXNlLiBXaGVuICRJ1SQgZXhlY3V0ZXMgd2l0aG91dCBlcnJvciwgJGYkIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHkuIElmICRJ1SQgZXhlY3V0ZXMgd2l0aG91dCBlcnJvciwgd2Ugc2F5IHRoYXQgdGhlIGNhbGwgdG8gXGNvZGV7JHAkLmxvYWRMaWJyYXJ5fSBoYXMgc3VjY2VlZGVkLCBvdGhlcndpc2Ugd2Ugc2F5IHRoZSBjYWxsIGhhcyBmYWlsZWQuCgpBZnRlciBhIGNhbGwgc3VjY2VlZHMsIHRoZSBuYW1lcyAkcCQgYW5kIFxjb2RleyRwJC5sb2FkTGlicmFyeX0gcmVtYWluIGluIHRoZSB0b3AtbGV2ZWwgc2NvcGUgb2YgJEwkLCBhbmQgc28gaXQgaXMgcG9zc2libGUgdG8gY2FsbCBcY29kZXtsb2FkTGlicmFyeX0gYWdhaW4uIElmIGEgY2FsbCBmYWlscywgbm90aGluZyBoYXBwZW5zLCBhbmQgb25lIGFnYWluIGhhcyB0aGUgb3B0aW9uIHRvIGNhbGwgXGNvZGV7bG9hZExpYnJhcnl9IGFnYWluLiBXaGV0aGVyIGEgcmVwZWF0ZWQgY2FsbCB0byBcY29kZXtsb2FkTGlicmFyeX0gc3VjY2VlZHMgd2lsbCB2YXJ5IGFzIGRlc2NyaWJlZCBiZWxvdy4KClRoZSBlZmZlY3Qgb2YgYSByZXBlYXRlZCBjYWxsIHRvIFxjb2RleyRwJC5sb2FkTGlicmFyeX0gaXMgYXMgZm9sbG93czoKXGJlZ2lue2l0ZW1pemV9ClxpdGVtCklmIGFub3RoZXIgY2FsbCB0byBcY29kZXskcCQubG9hZExpYnJhcnl9IGhhcyBhbHJlYWR5IHN1Y2NlZWRlZCwgdGhlIHJlcGVhdGVkIGNhbGwgYWxzbyBzdWNjZWVkcy4gCk90aGVyd2lzZSwKXGl0ZW0KSWYgYW5vdGhlciBjYWxsIHRvICB0byBcY29kZXskcCQubG9hZExpYnJhcnl9IGhhcyBmYWlsZWQ6ClxiZWdpbntpdGVtaXplfQpcaXRlbQpJZiB0aGUgZmFpbHVyZSBpcyBkdWUgdG8gYSBjb21waWxhdGlvbiBlcnJvciwgdGhlIHJlcGVhdGVkIGNhbGwgZmFpbHMgZm9yIHRoZSBzYW1lIHJlYXNvbi4KXGl0ZW0KSWYgdGhlIGZhaWx1cmUgaXMgZHVlIHRvIG90aGVyIGNhdXNlcywgdGhlIHJlcGVhdGVkIGNhbGwgYmVoYXZlcyBhcyBpZiBubyBwcmV2aW91cyBjYWxsIGhhZCBiZWVuIG1hZGUuClxlbmR7aXRlbWl6ZX0KXGVuZHtpdGVtaXplfQoKXGNvbW1lbnRhcnl7CkluIG90aGVyIHdvcmRzLCBvbmUgY2FuIHJldHJ5IGEgZGVmZXJyZWQgbG9hZCBhZnRlciBhIG5ldHdvcmsgZmFpbHVyZSBvciBiZWNhdXNlIGEgZmlsZSBpcyBhYnNlbnQsIGJ1dCBvbmNlIG9uZSBmaW5kcyBzb21lIGNvbnRlbnQgYW5kIGxvYWRzIGl0LCBvbmUgY2FuIG5vIGxvbmdlciByZWxvYWQuCgpXZSBkbyBub3Qgc3BlY2lmeSB3aGF0IHZhbHVlIHRoZSBmdXR1cmUgcmV0dXJuZWQgcmVzb2x2ZXMgdG8uCn0KCklmICRJJCBpcyBhbiBpbW1lZGlhdGUgaW1wb3J0IHRoZW4sIGZpcnN0CgogXGJlZ2lue2l0ZW1pemV9CiBcaXRlbQpJZiAgdGhlIFVSSSB0aGF0IGlzIHRoZSB2YWx1ZSBvZiAkc18xJCBoYXMgbm90IHlldCBiZWVuIGFjY2Vzc2VkIGJ5IGFuIGltcG9ydCBvciBleHBvcnQgKFxyZWZ7ZXhwb3J0c30pIGRpcmVjdGl2ZSAgaW4gdGhlIGN1cnJlbnQgaXNvbGF0ZSB0aGVuIHRoZSBjb250ZW50cyBvZiB0aGUgVVJJICBhcmUgY29tcGlsZWQgdG8geWllbGQgYSBsaWJyYXJ5ICRCJC4gXGNvbW1lbnRhcnl7QmVjYXVzZSBsaWJyYXJpZXMgbWF5IGhhdmUgbXV0dWFsbHkgcmVjdXJzaXZlIGltcG9ydHMsIGNhcmUgbXVzdCBiZSB0YWtlbiB0byBhdm9pZCBhbiBpbmZpbml0ZSByZWdyZXNzLgp9ClxpdGVtIE90aGVyd2lzZSwgdGhlIGNvbnRlbnRzIG9mIHRoZSBVUkkgZGVub3RlZCBieSAkc18xJCBoYXZlIGJlZW4gY29tcGlsZWQgaW50byBhIGxpYnJhcnkgJEIkIHdpdGhpbiB0aGUgY3VycmVudCBpc29sYXRlLgpcZW5ke2l0ZW1pemV9CgoKTGV0ICROU18wJCBiZSB0aGUgZXhwb3J0ZWQgbmFtZXNwYWNlIChccmVme2V4cG9ydHN9KSBvZiAkQiQuIFRoZW4sIGZvciBlYWNoIGNvbWJpbmF0b3IgY2xhdXNlICRDX2ksIGkgXGluIDEuLm4kIGluICRJJDoKXGJlZ2lue2l0ZW1pemV9ClxpdGVtIElmICRDX2kkIGlzIG9mIHRoZSBmb3JtIAoKXGNvZGV7XFNIT1d7fSAkaWRfMSwgXGxkb3RzLCBpZF9rJH0gCgp0aGVuIGxldCAkTlNfaSA9IFxTSE9Xe30oW2lkXzEsIFxsZG90cywgaWRfa10sIE5TX3tpLTF9JCkKCndoZXJlICRzaG93KGwsbikkIHRha2VzIGEgbGlzdCBvZiBpZGVudGlmaWVycyAkbCQgYW5kIGEgbmFtZXNwYWNlICRuJCwgYW5kIHByb2R1Y2VzIGEgbmFtZXNwYWNlIHRoYXQgbWFwcyBlYWNoIG5hbWUgaW4gJGwkIHRvIHRoZSBzYW1lIGVsZW1lbnQgdGhhdCAkbiQgZG9lcy4gRnVydGhlcm1vcmUsIGZvciBlYWNoIG5hbWUgJHgkIGluICRsJCwgaWYgJG4kIGRlZmluZXMgdGhlIG5hbWUgICR4PSQgdGhlbiB0aGUgbmV3IG5hbWVzcGFjZSBtYXBzICR4PSQgdG8gdGhlIHNhbWUgZWxlbWVudCB0aGF0ICRuJCBkb2VzLiBPdGhlcndpc2UgdGhlIHJlc3VsdGluZyBtYXBwaW5nIGlzIHVuZGVmaW5lZC4KICAKXGl0ZW0gSWYgJENfaSQgaXMgb2YgdGhlIGZvcm0gCgpcY29kZXtcSElERXt9ICRpZF8xLCBcbGRvdHMsIGlkX2skfSAKCnRoZW4gbGV0ICROU19pID0gXEhJREV7fShbaWRfMSwgXGxkb3RzLCBpZF9rXSwgTlNfe2ktMX0kKSAKCndoZXJlICRoaWRlKGwsIG4pJCB0YWtlcyBhIGxpc3Qgb2YgaWRlbnRmaWVycyAkbCQgYW5kIGEgbmFtZXNwYWNlICRuJCwgYW5kIHByb2R1Y2VzIGEgbmFtZXNwYWNlIHRoYXQgaXMgaWRlbnRpY2FsIHRvICRuJCBleGNlcHQgdGhhdCBmb3IgZWFjaCBuYW1lICRrJCBpbiAkbCQsICRrJCBhbmQgJGs9JCBhcmUgdW5kZWZpbmVkLiAKXGVuZHtpdGVtaXplfQogCk5leHQsIGlmICRJJCBpbmNsdWRlcyBhIHByZWZpeCBjbGF1c2Ugb2YgdGhlIGZvcm0gXEFTe30gJHAkLCBsZXQgJE5TID0gIHByZWZpeChwLCBOU19uKSQgd2hlcmUgJHByZWZpeChpZCwgbikkLCB0YWtlcyBhbiBpZGVudGlmaWVyICRpZCQgYW5kIHByb2R1Y2VzIGEgbmFtZXNwYWNlIHRoYXQgaGFzLCBmb3IgZWFjaCBlbnRyeSBtYXBwaW5nIGtleSAkayQgdG8gZGVjbGFyYXRpb24gJGQkIGluICRuJCwgIGFuIGVudHJ5IG1hcHBpbmcgJGlkLmskIHRvICRkJC4gT3RoZXJ3aXNlLCBsZXQgJE5TID0gTlNfbiQuCkl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIHRoZSBjdXJyZW50IGxpYnJhcnkgZGVjbGFyZXMgYSB0b3AtbGV2ZWwgbWVtYmVyIG5hbWVkICRwJC4KCiUgVGhpcyBpcyBwcm9ibGVtYXRpYywgYmVjYXVzZSBpdCBpbXBsaWVzIHRoYXQgcC5UIHdvdWxkIGJlIGF2YWlsYWJsZSBldmVuIGluIGEgc2NvcGUgdGhhdCBkZWNsYXJlZCBwLiBXZSByZWFsbHkgbmVlZCB0byB0aGluayBvZiBwIGFzIGEgc2luZ2xlIG9iamVjdCB3aXRoIHByb3BlcnRpZXMgcC5UIGV0Yy4sIGV4Y2VwdCBpdCBpc24ndCByZWFsbHkgdGhhdAolIGVpdGhlci4gQWZ0ZXIgYWxsLCBwIGlzbid0IGFjdHVhbGx5IGF2YWlsYWJsZSBhcyBhIHN0YW5kIGFsb25lIG5hbWUuCgpUaGVuLCBmb3IgZWFjaCBlbnRyeSBtYXBwaW5nIGtleSAkayQgdG8gZGVjbGFyYXRpb24gJGQkIGluICROUyQsICAkZCQgaXMgbWFkZSBhdmFpbGFibGUgaW4gdGhlIHRvcCBsZXZlbCBzY29wZSBvZiAkTCQgdW5kZXIgdGhlIG5hbWUgJGskIHVubGVzcyBlaXRoZXI6ClxiZWdpbntpdGVtaXplfQpcaXRlbQphIHRvcC1sZXZlbCBkZWNsYXJhdGlvbiB3aXRoIHRoZSBuYW1lICRrJCBleGlzdHMgaW4gJEwkLCBPUgpcaXRlbSBhIHByZWZpeCBjbGF1c2Ugb2YgdGhlIGZvcm0gIFxBU3t9ICRrJCBpcyB1c2VkIGluICRMJC4KXGVuZHtpdGVtaXplfQoKXHJhdGlvbmFsZXtUaGUgZ3JlYXRseSBpbmNyZWFzZXMgdGhlIGNoYW5jZSB0aGF0IGEgbWVtYmVyIGNhbiBiZSBhZGRlZCB0byBhIGxpYnJhcnkgd2l0aG91dCBicmVha2luZyBpdHMgaW1wb3J0ZXJzLn0KCkEge1xlbSBzeXN0ZW0gbGlicmFyeX0gaXMgYSBsaWJyYXJ5IHRoYXQgaXMgcGFydCBvZiB0aGUgRGFydCBpbXBsZW1lbnRhdGlvbi4gQW55IG90aGVyIGxpYnJhcnkgaXMgYSB7XGVtIG5vbi1zeXN0ZW0gbGlicmFyeX0uIElmIGEgbmFtZSAkTiQgaXMgcmVmZXJlbmNlZCBieSBhIGxpYnJhcnkgJEwkIGFuZCAkTiQgd291bGQgYmUgaW50cm9kdWNlZCBpbnRvIHRoZSB0b3AgbGV2ZWwgc2NvcGUgb2YgJEwkIGJ5IAppbXBvcnRzIG9mIHR3byBsaWJyYXJpZXMsICRMXzEkIGFuZCAkTF8yJCwgYW5kIHRoZSBleHBvcnRlZCBuYW1lc3BhY2Ugb2YgJExfMSQgYmluZHMgJE4kIHRvIGEgZGVjbGFyYXRpb24gb3JpZ2luYXRpbmcgaW4gYSBzeXN0ZW0gbGlicmFyeToKCiVhbiBpbXBvcnQgb2YgYSAgc3lzdGVtIGxpYnJhcnkgYW5kIGFuIGltcG9ydCBvZiBhIG5vbi1zeXN0ZW0gbGlicmFyeToKXGJlZ2lue2l0ZW1pemV9ClxpdGVtIFRoZSBpbXBvcnQgb2YgJExfMSQgaXMgaW1wbGljaXRseSBleHRlbmRlZCBieSBhIFxjb2Rle1xISURFe30gJE4kfSBjbGF1c2UuClxpdGVtIEEgc3RhdGljIHdhcm5pbmcgaXMgaXNzdWVkLgpcZW5ke2l0ZW1pemV9CgpccmF0aW9uYWxlIHsKV2hlcmVhcyBub3JtYWwgY29uZmxpY3RzIGFyZSByZXNvbHZlZCBhdCBkZXBsb3ltZW50IHRpbWUsIHRoZSBmdW5jdGlvbmFsaXR5IG9mIFxjb2Rle2RhcnQ6fSBsaWJyYXJpZXMgaXMgaW5qZWN0ZWQgaW50byBhbiBhcHBsaWNhdGlvbiBhdCBydW4gdGltZSwgYW5kIG1heSB2YXJ5IG92ZXIgdGltZSBhcyBicm93c2VycyBhcmUgdXBncmFkZWQuICBUaHVzLCBjb25mbGljdHMgd2l0aCBcY29kZXtkYXJ0On0gbGlicmFyaWVzIGNhbiBhcmlzZSBhdCBydW50aW1lLCBvdXRzaWRlIHRoZSBkZXZlbG9wZXLVcyBjb250cm9sLiBUbyBhdm9pZCBicmVha2luZyBkZXBsb3llZCBhcHBsaWNhdGlvbnMgaW4gdGhpcyB3YXksIGNvbmZsaWN0cyB3aXRoIHRoZSBcY29kZXtkYXJ0On0gbGlicmFyaWVzIGFyZSB0cmVhdGVkIHNwZWNpYWxseS4KCkl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdG9vbHMgdGhhdCBkZXBsb3kgRGFydCBjb2RlIHByb2R1Y2Ugb3V0cHV0IGluIHdoaWNoIGFsbCBpbXBvcnRzIHVzZSBzaG93IGNsYXVzZXMgdG8gZW5zdXJlIHRoYXQgYWRkaXRpb25zIHRvIHRoZSBuYW1lc3BhY2Ugb2YgYSBsaWJyYXJ5IG5ldmVyIGltcGFjdCBkZXBsb3llZCBjb2RlLgp9CgpJZiBhIG5hbWUgJE4kIGlzIHJlZmVyZW5jZWQgYnkgYSBsaWJyYXJ5ICRMJCBhbmQgJE4kIGlzICBpbnRyb2R1Y2VkIGludG8gIHRoZSB0b3AgbGV2ZWwgc2NvcGUgb2YgJEwkIGJ5IG1vcmUgdGhhbiBvbmUgaW1wb3J0LCBhbmQgbm90IGFsbCB0aGUgaW1wb3J0cyBkZW5vdGUgdGhlIHNhbWUgZGVjbGFyYXRpb24sIHRoZW46ClxiZWdpbntpdGVtaXplfQpcaXRlbSBBIHN0YXRpYyB3YXJuaW5nIG9jY3Vycy4KXGl0ZW0gSWYgJE4kIGlzIHJlZmVyZW5jZWQgYXMgYSBmdW5jdGlvbiwgZ2V0dGVyIG9yIHNldHRlciwgYSBcY29kZXtOb1N1Y2hNZXRob2RFcnJvcn0gaXMgdGhyb3duLiAKXGl0ZW0gIElmICROJCBpcyByZWZlcmVuY2VkIGFzIGEgdHlwZSwgaXQgaXMgdHJlYXRlZCBhcyBhIG1hbGZvcm1lZCB0eXBlLgoKXGVuZHtpdGVtaXplfQoKV2Ugc2F5IHRoYXQgdGhlIG5hbWVzcGFjZSAkTlMkIHtcZW0gaGFzIGJlZW4gaW1wb3J0ZWQgaW50b30gJEwkLgoKXGNvbW1lbnRhcnl7Ckl0IGlzIG5laXRoZXIgYW4gZXJyb3Igbm9yIGEgd2FybmluZyBpZiAgJE4kIGlzIGludHJvZHVjZWQgYnkgdHdvIG9yIG1vcmUgaW1wb3J0cyBidXQgbmV2ZXIgcmVmZXJyZWQgdG8uCn0KClxyYXRpb25hbGV7ClRoZSBwb2xpY3kgYWJvdmUgbWFrZXMgbGlicmFyaWVzIG1vcmUgcm9idXN0IGluIHRoZSBmYWNlIG9mIGFkZGl0aW9ucyBtYWRlIHRvIHRoZWlyIGltcG9ydHMuICAKCkEgY2xlYXIgZGlzdGluY3Rpb24gbmVlZHMgdG8gYmUgbWFkZSBiZXR3ZWVuIHRoaXMgYXBwcm9hY2gsIGFuZCBzZWVtaW5nbHkgc2ltaWxhciBwb2xpY2llcyB3aXRoIHJlc3BlY3QgdG8gY2xhc3NlcyBvciBpbnRlcmZhY2VzLiAgVGhlIHVzZSBvZiBhIGNsYXNzIG9yIGludGVyZmFjZSwgYW5kIG9mIGl0cyBtZW1iZXJzLCBpcyBzZXBhcmF0ZSBmcm9tIGl0cyBkZWNsYXJhdGlvbi4gVGhlIHVzYWdlIGFuZCBkZWNsYXJhdGlvbiBtYXkgb2NjdXIgaW4gd2lkZWx5IHNlcGFyYXRlZCBwbGFjZXMgaW4gdGhlIGNvZGUsIGFuZCBtYXkgaW4gZmFjdCBiZSBhdXRob3JlZCBieSBkaWZmZXJlbnQgcGVvcGxlIG9yIG9yZ2FuaXphdGlvbnMuICBJdCBpcyBpbXBvcnRhbnQgdGhhdCBlcnJvcnMgYXJlIGdpdmVuIGF0IHRoZSBvZmZlbmRpbmcgZGVjbGFyYXRpb24gc28gdGhhdCB0aGUgcGFydHkgdGhhdCByZWNlaXZlcyB0aGUgZXJyb3IgY2FuIHJlc3BvbmQgdG8gaXQgYSBtZWFuaW5nZnVsIHdheS4KCkluIGNvbnRyYXN0IGEgbGlicmFyeSBjb21wcmlzZXMgYm90aCBpbXBvcnRzIGFuZCB0aGVpciB1c2FnZTsgdGhlIGxpYnJhcnkgaXMgdW5kZXIgdGhlIGNvbnRyb2wgb2YgYSBzaW5nbGUgcGFydHkgYW5kIHNvIGFueSBwcm9ibGVtIHN0ZW1taW5nIGZyb20gdGhlIGltcG9ydCBjYW4gYmUgcmVzb2x2ZWQgZXZlbiBpZiBpdCBpcyByZXBvcnRlZCBhdCB0aGUgdXNlIHNpdGUuCgolT24gYSByZWxhdGVkIG5vdGUsIHRoZSBwcm92ZW5hbmNlIG9mIHRoZSBjb25mbGljdGluZyBlbGVtZW50cyBpcyBub3QgY29uc2lkZXJlZC4gQW4gIGVsZW1lbnQgdGhhdCBpcyBpbXBvcnRlZCB2aWEgZGlzdGluY3QgcGF0aHMgbWF5IGNvbmZsaWN0IHdpdGggaXRzZWxmLiBUaGlzIGF2b2lkcyB2YXJpYW50cyBvZiB0aGUgd2VsbCBrbm93biAiZGlhbW9uZCIgcHJvYmxlbS4KfQoKSXQgaXMgYSBzdGF0aWMgd2FybmluZyB0byBpbXBvcnQgdHdvIGRpZmZlcmVudCBsaWJyYXJpZXMgd2l0aCB0aGUgc2FtZSBuYW1lLgoKXGNvbW1lbnRhcnl7CkEgd2lkZWx5IGRpc3NlbWluYXRlZCBsaWJyYXJ5IHNob3VsZCBiZSBnaXZlbiBhIG5hbWUgdGhhdCB3aWxsIG5vdCBjb25mbGljdCB3aXRoIG90aGVyIHN1Y2ggbGlicmFyaWVzLiBUaGUgcHJlZmVycmVkIG1lY2hhbmlzbSBmb3IgdGhpcyBpcyB1c2luZyBwdWIsIHRoZSBEYXJ0IHBhY2thZ2UgbWFuYWdlciwgd2hpY2ggcHJvdmlkZXMgYSBnbG9iYWwgbmFtZXNwYWNlIGZvciBsaWJyYXJpZXMsIGFuZCBjb252ZW50aW9ucyB0aGF0IGxldmVyYWdlIHRoYXQgbmFtZXNwYWNlLgp9CgpcY29tbWVudGFyeXtOb3RlIHRoYXQgbm8gZXJyb3JzIG9yIHdhcm5pbmdzIGFyZSBnaXZlbiBpZiBvbmUgaGlkZXMgb3Igc2hvd3MgYSBuYW1lIHRoYXQgaXMgbm90IGluIGEgbmFtZXNwYWNlLn0KXHJhdGlvbmFsZXsgIApUaGlzIHByZXZlbnRzIHNpdHVhdGlvbnMgd2hlcmUgcmVtb3ZpbmcgYSBuYW1lIGZyb20gYSBsaWJyYXJ5IHdvdWxkIGNhdXNlIGJyZWFrYWdlIG9mIGEgY2xpZW50IGxpYnJhcnkuCn0KClRoZSBkYXJ0IGNvcmUgbGlicmFyeSBcY29kZXtkYXJ0OmNvcmV9IGlzIGltcGxpY2l0bHkgaW1wb3J0ZWQgaW50byBldmVyeSBkYXJ0IGxpYnJhcnkgb3RoZXIgdGhhbiBpdHNlbGYgdmlhIGFuICBpbXBvcnQgY2xhdXNlIG9mIHRoZSBmb3JtCgpcY29kZXtcSU1QT1JUe30gIGBkYXJ0OmNvcmUnO30gCgp1bmxlc3MgdGhlIGltcG9ydGluZyBsaWJyYXJ5IGV4cGxpY2l0bHkgaW1wb3J0cyBcY29kZXtkYXJ0OmNvcmV9LgoKXGNvbW1lbnRhcnl7CkFueSBpbXBvcnQgb2YgXGNvZGV7ZGFydDpjb3JlfSwgZXZlbiBpZiByZXN0cmljdGVkIHZpYSBcU0hPV3t9LCBcSElERXt9IG9yIFxBU3t9LCBwcmVlbXB0cyB0aGUgYXV0b21hdGljIGltcG9ydC4KfQoKXHJhdGlvbmFsZXsKSXQgd291bGQgYmUgbmljZSBpZiB0aGVyZSB3YXMgbm90aGluZyBzcGVjaWFsIGFib3V0IFxjb2Rle2RhcnQ6Y29yZX0uIEhvd2V2ZXIsIGl0cyB1c2UgaXMgcGVydmFzaXZlLCB3aGljaCBsZWFkcyB0byB0aGUgZGVjaXNpb24gdG8gaW1wb3J0IGl0IGF1dG9tYXRpY2FsbHkuICBIb3dldmVyLCBzb21lIGxpYnJhcnkgJEwkICBtYXkgd2lzaCB0byBkZWZpbmUgZW50aXRpZXMgd2l0aCBuYW1lcyB1c2VkIGJ5IFxjb2Rle2RhcnQ6Y29yZX0gKHdoaWNoIGl0IGNhbiBlYXNpbHkgZG8sIGFzIHRoZSBuYW1lcyBkZWNsYXJlZCBieSBhIGxpYnJhcnkgdGFrZSBwcmVjZWRlbmNlKS4gT3RoZXIgbGlicmFyaWVzIG1heSB3aXNoIHRvIHVzZSAkTCQgYW5kIG1heSB3YW50IHRvIHVzZSBtZW1iZXJzIG9mICRMJCB0aGF0IGNvbmZsaWN0IHdpdGggdGhlIGNvcmUgbGlicmFyeSB3aXRob3V0IGhhdmluZyB0byB1c2UgYSBwcmVmaXggYW5kIHdpdGhvdXQgZW5jb3VudGVyaW5nIHdhcm5pbmdzLiBUaGUgYWJvdmUgcnVsZSBtYWtlcyB0aGlzIHBvc3NpYmxlLCBlc3NlbnRpYWxseSBjYW5jZWxpbmcgXGNvZGV7ZGFydDpjb3JlfSdzIHNwZWNpYWwgdHJlYXRtZW50IGJ5IG1lYW5zIG9mIHlldCBhbm90aGVyIHNwZWNpYWwgcnVsZS4gCn0KClxzdWJzZWN0aW9ue0V4cG9ydHN9ClxsYWJlbHtleHBvcnRzfQoKQSBsaWJyYXJ5ICRMJCBleHBvcnRzIGEgbmFtZXNwYWNlIChccmVme3Njb3Bpbmd9KSwgbWVhbmluZyB0aGF0IHRoZSBkZWNsYXJhdGlvbnMgaW4gdGhlIG5hbWVzcGFjZSBhcmUgbWFkZSBhdmFpbGFibGUgdG8gb3RoZXIgbGlicmFyaWVzIGlmIHRoZXkgY2hvb3NlIHRvIGltcG9ydCAkTCQgKFxyZWZ7aW1wb3J0c30pLiAgVGhlIG5hbWVzcGFjZSB0aGF0ICRMJCBleHBvcnRzIGlzIGtub3duIGFzIGl0cyB7XGVtIGV4cG9ydGVkIG5hbWVzcGFjZX0uCgpcYmVnaW57Z3JhbW1hcn0Ke1xiZiBsaWJyYXJ5RXhwb3J0On0KICAgbWV0YWRhdGEgXEVYUE9SVHt9ICB1cmkgIGNvbWJpbmF0b3IqIGB7XGVzY2FwZWdyYW1tYXIgO30nCiAgICAuCiBcZW5ke2dyYW1tYXJ9CiAKIEFuIGV4cG9ydCBzcGVjaWZpZXMgYSBVUkkgJHgkIHdoZXJlIHRoZSBkZWNsYXJhdGlvbiBvZiBhbiBleHBvcnRlZCBsaWJyYXJ5IGlzIHRvIGJlIGZvdW5kLiAgSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgIHRoZSBzcGVjaWZpZWQgVVJJIGRvZXMgbm90IHJlZmVyIHRvIGEgbGlicmFyeSBkZWNsYXJhdGlvbi4gIAoKV2Ugc2F5IHRoYXQgYSBuYW1lIHtcZW0gaXMgZXhwb3J0ZWQgYnkgYSBsaWJyYXJ5fSAob3IgZXF1aXZhbGVudGx5LCB0aGF0IGEgbGlicmFyeSB7XGVtIGV4cG9ydHMgYSBuYW1lfSkgaWYgdGhlIG5hbWUgaXMgaW4gdGhlIGxpYnJhcnkncyBleHBvcnRlZCBuYW1lc3BhY2UuIFdlIHNheSB0aGF0IGEgZGVjbGFyYXRpb24ge1xlbSBpcyBleHBvcnRlZCBieSBhIGxpYnJhcnl9IChvciBlcXVpdmFsZW50bHksIHRoYXQgYSBsaWJyYXJ5IHtcZW0gZXhwb3J0cyBhIGRlY2xhcmF0aW9ufSkgaWYgdGhlIGRlY2xhcmF0aW9uIGlzIGluIHRoZSBsaWJyYXJ5YHMgZXhwb3J0ZWQgbmFtZXNwYWNlLgoKQSBsaWJyYXJ5IGFsd2F5cyBleHBvcnRzIGFsbCBuYW1lcyBhbmQgYWxsIGRlY2xhcmF0aW9ucyBpbiBpdHMgcHVibGljIG5hbWVzcGFjZS4gSW4gYWRkaXRpb24sIGEgbGlicmFyeSBtYXkgY2hvb3NlIHRvIHJlLWV4cG9ydCBhZGRpdGlvbmFsIGxpYnJhcmllcyB2aWEge1xlbSBleHBvcnQgZGlyZWN0aXZlc30sIG9mdGVuIHJlZmVycmVkIHRvIHNpbXBseSBhcyB7XGVtIGV4cG9ydHN9LgoKTGV0ICRFJCBiZSBhbiBleHBvcnQgZGlyZWN0aXZlIHRoYXQgcmVmZXJzIHRvIGEgVVJJIHZpYSB0aGUgc3RyaW5nICRzXzEkLiBFdmFsdWF0aW9uIG9mICRFJCAgcHJvY2VlZHMgYXMgZm9sbG93czoKCkZpcnN0LAoKIFxiZWdpbntpdGVtaXplfQogXGl0ZW0KSWYgIHRoZSBVUkkgdGhhdCBpcyB0aGUgdmFsdWUgb2YgJHNfMSQgaGFzIG5vdCB5ZXQgYmVlbiBhY2Nlc3NlZCBieSBhbiBpbXBvcnQgb3IgZXhwb3J0IGRpcmVjdGl2ZSAgaW4gdGhlIGN1cnJlbnQgaXNvbGF0ZSB0aGVuIHRoZSBjb250ZW50cyBvZiB0aGUgVVJJICBhcmUgY29tcGlsZWQgdG8geWllbGQgYSBsaWJyYXJ5ICRCJC4KXGl0ZW0gT3RoZXJ3aXNlLCB0aGUgY29udGVudHMgb2YgdGhlIFVSSSBkZW5vdGVkIGJ5ICRzXzEkIGhhdmUgYmVlbiBjb21waWxlZCBpbnRvIGEgbGlicmFyeSAkQiQgd2l0aGluIHRoZSBjdXJyZW50IGlzb2xhdGUuClxlbmR7aXRlbWl6ZX0KCgpMZXQgJE5TXzAkIGJlIHRoZSBleHBvcnRlZCBuYW1lc3BhY2Ugb2YgJEIkLiBUaGVuLCBmb3IgZWFjaCBjb21iaW5hdG9yIGNsYXVzZSAkQ19pLCBpIFxpbiAxLi5uJCBpbiAkRSQ6ClxiZWdpbntpdGVtaXplfQpcaXRlbSBJZiAkQ19pJCBpcyBvZiB0aGUgZm9ybSBcY29kZXtcU0hPV3t9ICRpZF8xLCBcbGRvdHMsIGlkX2skfSB0aGVuIGxldCAKCiROU19pID0gXFNIT1d7fShbaWRfMSwgXGxkb3RzLCBpZF9rXSwgTlNfe2ktMX0kKS4gIApcaXRlbSBJZiAkQ19pJCBpcyBvZiB0aGUgZm9ybSBcY29kZXtcSElERXt9ICRpZF8xLCBcbGRvdHMsIGlkX2skfSAKCnRoZW4gbGV0ICROU19pID0gXEhJREV7fShbaWRfMSwgXGxkb3RzLCBpZF9rXSwgTlNfe2ktMX0kKS4gClxlbmR7aXRlbWl6ZX0KCkZvciBlYWNoCmVudHJ5IG1hcHBpbmcga2V5ICRrJCB0byBkZWNsYXJhdGlvbiAkZCQgaW4gJE5TX24kIGFuIGVudHJ5IG1hcHBpbmcgJGskIHRvICRkJCBpcyBhZGRlZCB0byB0aGUgZXhwb3J0ZWQgbmFtZXNwYWNlIG9mICRMJCB1bmxlc3MgYSAgdG9wLWxldmVsIGRlY2xhcmF0aW9uIHdpdGggdGhlIG5hbWUgJGskIGV4aXN0cyBpbiAkTCQuICAKCklmIGEgbmFtZSAkTiQgaXMgcmVmZXJlbmNlZCBieSBhIGxpYnJhcnkgJEwkIGFuZCAkTiQgd291bGQgYmUgaW50cm9kdWNlZCBpbnRvIHRoZSBleHBvcnRlZCBuYW1lc3BhY2Ugb2YgJEwkIGJ5IGV4cG9ydHMgb2YgdHdvIGxpYnJhcmllcywgJExfMSQgYW5kICRMXzIkLCBhbmQgdGhlIGV4cG9ydGVkIG5hbWVzcGFjZSBvZiAkTF8xJCBiaW5kcyAkTiQgdG8gYSBkZWNsYXJhdGlvbiBvcmlnaW5hdGluZyBpbiBhIHN5c3RlbSBsaWJyYXJ5OgolYW4gZXhwb3J0IG9mIGEgc3lzdGVtIGxpYnJhcnkgYW5kIGFuIGV4cG9ydCBvZiBhIG5vbi1zeXN0ZW0gbGlicmFyeToKXGJlZ2lue2l0ZW1pemV9ClxpdGVtIFRoZSBleHBvcnQgb2YgJExfMSQgaXMgaW1wbGljaXRseSBleHRlbmRlZCBieSBhIFxjb2Rle1xISURFe30gJE4kfSBjbGF1c2UuClxpdGVtIEEgc3RhdGljIHdhcm5pbmcgaXMgaXNzdWVkLgpcZW5ke2l0ZW1pemV9CgpccmF0aW9uYWxlewpTZWUgdGhlIGRpc2N1c3Npb24gaW4gc2VjdGlvbiBccmVme2ltcG9ydHN9IGZvciB0aGUgcmVhc29uaW5nIGJlaGluZCB0aGlzIHJ1bGUuCn0KCldlIHNheSB0aGF0ICRMJCB7XGVtIHJlLWV4cG9ydHMgbGlicmFyeSB9ICRCJCwgYW5kIGFsc28gdGhhdCAkTCQge1xlbSByZS1leHBvcnRzIG5hbWVzcGFjZSB9ICROU19uJC4gV2hlbiBubyBjb25mdXNpb24gY2FuIGFyaXNlLCB3ZSBtYXkgc2ltcGx5IHN0YXRlIHRoYXQgJEwkIHtcZW0gcmUtZXhwb3J0cyB9JEIkLCBvciB0aGF0ICRMJCB7XGVtIHJlLWV4cG9ydHMgfSROU19uJC4KCkl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIGEgbmFtZSAkTiQgaXMgcmUtZXhwb3J0ZWQgYnkgYSBsaWJyYXJ5ICRMJCBhbmQgJE4kIGlzICBpbnRyb2R1Y2VkIGludG8gdGhlIGV4cG9ydCBuYW1lc3BhY2Ugb2YgJEwkIGJ5IG1vcmUgdGhhbiBvbmUgZXhwb3J0LCB1bmxlc3MgYWxsICBleHBvcnRzIHJlZmVyIHRvIHNhbWUgZGVjbGFyYXRpb24gZm9yIHRoZSBuYW1lICROJC4gIEl0IGlzIGEgc3RhdGljIHdhcm5pbmcgdG8gZXhwb3J0IHR3byBkaWZmZXJlbnQgbGlicmFyaWVzIHdpdGggdGhlIHNhbWUgbmFtZS4KCgoKXHN1YnNlY3Rpb257UGFydHN9ClxsYWJlbHtwYXJ0c30KCkEgbGlicmFyeSBtYXkgYmUgZGl2aWRlZCBpbnRvIHtcZW0gcGFydHN9LCBlYWNoIG9mIHdoaWNoIGNhbiBiZSBzdG9yZWQgaW4gYSBzZXBhcmF0ZSBsb2NhdGlvbi4gQSBsaWJyYXJ5IGlkZW50aWZpZXMgaXRzIHBhcnRzIGJ5IGxpc3RpbmcgdGhlbSB2aWEgXFBBUlR7fSBkaXJlY3RpdmVzLiAKCkEge1xlbSBwYXJ0IGRpcmVjdGl2ZX0gc3BlY2lmaWVzIGEgVVJJIHdoZXJlIGEgRGFydCBjb21waWxhdGlvbiB1bml0IHRoYXQgc2hvdWxkIGJlIGluY29ycG9yYXRlZCBpbnRvIHRoZSBjdXJyZW50IGxpYnJhcnkgbWF5IGJlIGZvdW5kLgoKXGJlZ2lue2dyYW1tYXJ9CntcYmYgcGFydERpcmVjdGl2ZTp9CiAgIG1ldGFkYXRhIFxQQVJUe30gICB1cmkgJ3tcZXNjYXBlZ3JhbW1hciA7fScgCiAgICAuCgp7XGJmIHBhcnRIZWFkZXI6fQogICAgICBtZXRhZGF0YSBcUEFSVHt9IFxPRnt9IGlkZW50aWZpZXIgKGB7XGVzY2FwZWdyYW1tYXIgLn0nIGlkZW50aWZpZXIpKiBge1xlc2NhcGVncmFtbWFyIDt9JwogICAgLgp7XGJmIHBhcnREZWNsYXJhdGlvbjp9CiAgICAgIHBhcnRIZWFkZXIgdG9wTGV2ZWxEZWZpbml0aW9uKiBFT0YKICAgIC4KXGVuZHtncmFtbWFyfQoKQSB7XGVtIHBhcnQgaGVhZGVyfSBiZWdpbnMgd2l0aCAgXFBBUlR7fSBcT0Z7fSAgZm9sbG93ZWQgYnkgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgdGhlIHBhcnQgYmVsb25ncyB0by4gIEEgcGFydCBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhIHBhcnQgaGVhZGVyIGZvbGxvd2VkIGJ5IGEgc2VxdWVuY2Ugb2YgdG9wLWxldmVsIGRlY2xhcmF0aW9ucy4KCkNvbXBpbGluZyBhIHBhcnQgZGlyZWN0aXZlIG9mIHRoZSBmb3JtIFxjb2Rle1xQQVJUe30gJHMkO30gY2F1c2VzIHRoZSBEYXJ0IHN5c3RlbSB0byBhdHRlbXB0IHRvIGNvbXBpbGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBVUkkgdGhhdCBpcyB0aGUgdmFsdWUgb2YgJHMkLiBUaGUgdG9wLWxldmVsIGRlY2xhcmF0aW9ucyBhdCB0aGF0IFVSSSBhcmUgdGhlbiBjb21waWxlZCBieSB0aGUgRGFydCBjb21waWxlciBpbiB0aGUgc2NvcGUgb2YgdGhlIGN1cnJlbnQgbGlicmFyeS4gSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgdGhlIGNvbnRlbnRzIG9mIHRoZSBVUkkgYXJlIG5vdCBhIHZhbGlkIHBhcnQgZGVjbGFyYXRpb24uIEl0IGlzIGEgc3RhdGljIHdhcm5pbmcgaWYgdGhlIHJlZmVyZW5jZWQgcGFydCBkZWNsYXJhdGlvbiAkcCQgbmFtZXMgYSBsaWJyYXJ5IG90aGVyIHRoYW4gdGhlIGN1cnJlbnQgbGlicmFyeSBhcyB0aGUgbGlicmFyeSB0byB3aGljaCAkcCQgYmVsb25ncy4KClxzdWJzZWN0aW9ue1NjcmlwdHN9ClxsYWJlbHtzY3JpcHRzfQoKQSB7XGVtIHNjcmlwdH0gaXMgYSBsaWJyYXJ5IHdob3NlIGV4cG9ydGVkIG5hbWVzcGFjZSAgKFxyZWZ7ZXhwb3J0c30pIGluY2x1ZGVzIGEgdG9wLWxldmVsIGZ1bmN0aW9uIFxjb2Rle21haW59LiAKQSBzY3JpcHQgJFMkIG1heSBiZSBleGVjdXRlZCBhcyBmb2xsb3dzOgoKRmlyc3QsICRTJCBpcyBjb21waWxlZCBhcyBhIGxpYnJhcnkgYXMgc3BlY2lmaWVkIGFib3ZlLiBUaGVuLCB0aGUgdG9wLWxldmVsIGZ1bmN0aW9uIFxjb2Rle21haW59IHRoYXQgaXMgaW4gdGhlIGV4cG9ydGVkIG5hbWVzcGFjZSBvZiAkUyQgaXMgaW52b2tlZC4gSWYgXGNvZGV7bWFpbn0gaGFzIG5vIHBvc2l0aW9uYWwgcGFyYW1ldGVycywgaXQgaXMgaW52b2tlZCB3aXRoIG5vIGFyZ3VtZW50cy4gT3RoZXJ3aXNlIGlmIFxjb2Rle21haW59IGhhcyBleGFjdGx5IG9uZSBwb3NpdGlvbmFsIHBhcmFtZXRlciwgaXQgaXMgaW52b2tlZCB3aXRoIGEgc2luZ2xlIGFjdHVhbCBhcmd1bWVudCB3aG9zZSBydW50aW1lIHR5cGUgaW1wbGVtZW50cyBcY29kZXtMaXN0JDwkU3RyaW5nJD4kfS4gIE90aGVyd2lzZSBcY29kZXttYWlufSBpcyBpbnZva2VkIHdpdGggdGhlIGZvbGxvd2luZyB0d28gYWN0dWFsIGFyZ3VtZW50czoKXGJlZ2lue2VudW1lcmF0ZX0KXGl0ZW0gQW4gb2JqZWN0IHdob3NlIHJ1bnRpbWUgdHlwZSBpbXBsZW1lbnRzIFxjb2Rle0xpc3QkPCRTdHJpbmckPiR9LgpcaXRlbSBUaGUgaW5pdGlhbCBtZXNzYWdlIG9mIHRoZSBjdXJyZW50IGlzb2xhdGUgJGkkIGFzIGRldGVybWluZWQgYnkgdGhlIGludm9jYXRpb24gb2YgXGNvZGV7SXNvbGF0ZS5zcGF3blVyaX0gdGhhdCBzcGF3bmVkICRpJC4gClxlbmR7ZW51bWVyYXRlfQoKSXQgaXMgYSBydW4gdGltZSBlcnJvciBpZiAkUyQgZG9lcyBub3QgZGVjbGFyZSBvciBpbXBvcnQgYSB0b3AtbGV2ZWwgZnVuY3Rpb24gXGNvZGV7bWFpbn0uIEl0IGlzIGEgc3RhdGljIHdhcm5pbmcgaWYgXGNvZGV7bWFpbn0gaGFzIG1vcmUgdGhhbiB0d28gcmVxdWlyZWQgcGFyYW1ldGVycy4KClxjb21tZW50YXJ5IHsKTm90ZSB0aGF0IGlmIFxjb2Rle21haW59IHJlcXVpcmVzIG1vcmUgdGhhbiB0d28gYXJndW1lbnRzLCBhIHJ1biB0aW1lIGVycm9yIHdpbGwgb2NjdXIuIAp9CgpccmF0aW9uYWxlewpUaGUgbmFtZXMgb2Ygc2NyaXB0cyBhcmUgb3B0aW9uYWwsIGluIHRoZSBpbnRlcmVzdHMgb2YgaW50ZXJhY3RpdmUsIGluZm9ybWFsIHVzZS4gSG93ZXZlciwgYW55IHNjcmlwdCBvZiBsb25nIHRlcm0gdmFsdWUgc2hvdWxkIGJlIGdpdmVuIGEgbmFtZSBhcyBhIG1hdHRlciBvZiBnb29kIHByYWN0aWNlLiAKfQoKXGNvbW1lbnRhcnkgewpBIERhcnQgcHJvZ3JhbSB3aWxsIHR5cGljYWxseSBiZSBleGVjdXRlZCBieSBleGVjdXRpbmcgYSBzY3JpcHQuCn0KClxzdWJzZWN0aW9ue1VSSXN9ClxsYWJlbHt1cmlzfQoKVVJJcyBhcmUgc3BlY2lmaWVkIGJ5IG1lYW5zIG9mIHN0cmluZyBsaXRlcmFsczoKClxiZWdpbntncmFtbWFyfQp7XGJmIHVyaTp9CiAgICAgIHN0cmluZ0xpdGVyYWwKICAgIC4KXGVuZHtncmFtbWFyfQoKSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgIHRoZSBzdHJpbmcgbGl0ZXJhbCAkeCQgdGhhdCBkZXNjcmliZXMgYSBVUkkgaXMgbm90IGEgY29tcGlsZS10aW1lIGNvbnN0YW50LCBvciBpZiAkeCQgaW52b2x2ZXMgc3RyaW5nIGludGVycG9sYXRpb24uCiAKVGhpcyBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGRpc2N1c3MgdGhlIGludGVycHJldGF0aW9uIG9mIFVSSXMsIHdpdGggdGhlIGZvbGxvd2luZyBleGNlcHRpb25zLiAKIAogXHJhdGlvbmFsZXsKIFRoZSBpbnRlcnByZXRhdGlvbiBvZiBVUklzIGlzIG1vc3RseSBsZWZ0IHRvIHRoZSBzdXJyb3VuZGluZyBjb21wdXRpbmcgZW52aXJvbm1lbnQuIEZvciBleGFtcGxlLCBpZiBEYXJ0IGlzIHJ1bm5pbmcgaW4gYSB3ZWIgYnJvd3NlciwgdGhhdCBicm93c2VyIHdpbGwgbGlrZWx5IGludGVycHJldCBzb21lIFVSSXMuIFdoaWxlIGl0IG1pZ2h0IHNlZW0gYXR0cmFjdGl2ZSB0byBzcGVjaWZ5LCBzYXksIHRoYXQgVVJJcyBhcmUgaW50ZXJwcmV0ZWQgd2l0aCByZXNwZWN0IHRvIGEgc3RhbmRhcmQgc3VjaCBhcyBJRVRGIFJGQyAzOTg2LCBpbiBwcmFjdGljZSB0aGlzIHdpbGwgdXN1YWxseSBkZXBlbmQgb24gdGhlIGJyb3dzZXIgYW5kIGNhbm5vdCBiZSByZWxpZWQgdXBvbi4KIH0KIApBIFVSSSBvZiB0aGUgZm9ybSBcY29kZXtkYXJ0OiRzJH0gaXMgaW50ZXJwcmV0ZWQgYXMgYSByZWZlcmVuY2UgdG8gYSBzeXN0ZW0gbGlicmFyeSAoXHJlZntpbXBvcnRzfSkgJHMkLiAKIApBIFVSSSBvZiB0aGUgZm9ybSBcY29kZXtwYWNrYWdlOiRzJH0gaXMgaW50ZXJwcmV0ZWQgYXMgYSBVUkkgb2YgdGhlIGZvcm0gXGNvZGV7cGFja2FnZXMvc30gcmVsYXRpdmUgdG8gYW4gaW1wbGVtZW50YXRpb24gc3BlY2lmaWVkIGxvY2F0aW9uLgoKXGNvbW1lbnRhcnl7IApUaGlzIGxvY2F0aW9uIHdpbGwgb2Z0ZW4gYmUgdGhlIGxvY2F0aW9uIG9mIHRoZSByb290IGxpYnJhcnkgcHJlc2VudGVkIHRvIHRoZSBEYXJ0IGNvbXBpbGVyLiBIb3dldmVyLCBpbXBsZW1lbnRhdGlvbnMgbWF5IHN1cHBseSBtZWFucyB0byBvdmVycmlkZSBvciByZXBsYWNlIHRoaXMgY2hvaWNlLgp9CgpccmF0aW9uYWxlewpUaGUgaW50ZW50IGlzIHRoYXQsIGR1cmluZyBkZXZlbG9wbWVudCwgRGFydCBwcm9ncmFtbWVycyBjYW4gcmVseSBvbiBhIHBhY2thZ2UgbWFuYWdlciB0byBmaW5kIGVsZW1lbnRzIG9mIHRoZWlyIHByb2dyYW0uIFN1Y2ggcGFja2FnZSBtYW5hZ2VycyBtYXkgcHJvdmlkZSBhIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgc3RhcnRpbmcgYXQgYSBsb2NhbCBkaXJlY3RvcnkgXGNvZGV7cGFja2FnZXN9IHdoZXJlIHRoZXkgcGxhY2UgdGhlIHJlcXVpcmVkIGRhcnQgY29kZSAob3IgbGlua3MgdGhlcmV0bykuCn0KCk90aGVyd2lzZSwgYW55IHJlbGF0aXZlIFVSSSBpcyBpbnRlcnByZXRlZCBhcyByZWxhdGl2ZSB0byB0aGUgdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IGxpYnJhcnkuIEFsbCBmdXJ0aGVyIGludGVycHJldGF0aW9uIG9mIFVSSXMgaXMgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50LiAKClxjb21tZW50YXJ5e1RoaXMgbWVhbnMgaXQgaXMgZGVwZW5kZW50IG9uIHRoZSBlbWJlZGRlci59CgoKXHNlY3Rpb257VHlwZXN9ClxsYWJlbHt0eXBlc30KCkRhcnQgc3VwcG9ydHMgb3B0aW9uYWwgdHlwaW5nIGJhc2VkIG9uIGludGVyZmFjZSB0eXBlcy4KClxyYXRpb25hbGV7VGhlIHR5cGUgc3lzdGVtIGlzIHVuc291bmQsIGR1ZSB0byB0aGUgY292YXJpYW5jZSBvZiBnZW5lcmljIHR5cGVzLiBUaGlzIGlzIGEgZGVsaWJlcmF0ZSBjaG9pY2UgKGFuZCB1bmRvdWJ0ZWRseSBjb250cm92ZXJzaWFsKS4gIEV4cGVyaWVuY2UgaGFzIHNob3duIHRoYXQgc291bmQgdHlwZSBydWxlcyBmb3IgZ2VuZXJpY3MgZmx5IGluIHRoZSBmYWNlIG9mIHByb2dyYW1tZXIgaW50dWl0aW9uLiBJdCBpcyBlYXN5IGZvciB0b29scyB0byBwcm92aWRlIGEgc291bmQgdHlwZSBhbmFseXNpcyBpZiB0aGV5IGNob29zZSwgd2hpY2ggbWF5IGJlIHVzZWZ1bCBmb3IgdGFza3MgbGlrZSByZWZhY3RvcmluZy4KfQoKXHN1YnNlY3Rpb257U3RhdGljIFR5cGVzfQpcbGFiZWx7c3RhdGljVHlwZXN9CgpTdGF0aWMgdHlwZSBhbm5vdGF0aW9ucyBhcmUgdXNlZCBpbiB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgKFxyZWZ7dmFyaWFibGVzfSkgKGluY2x1ZGluZyBmb3JtYWwgcGFyYW1ldGVycyAoXHJlZntmb3JtYWxQYXJhbWV0ZXJzfSkpLCBpbiB0aGUgcmV0dXJuIHR5cGVzIG9mIGZ1bmN0aW9ucyAoXHJlZntmdW5jdGlvbnN9KSBhbmQgaW4gdGhlIGJvdW5kcyBvZiB0eXBlIHZhcmlhYmxlcy4gIFN0YXRpYyB0eXBlIGFubm90YXRpb25zIGFyZSB1c2VkIGR1cmluZyBzdGF0aWMgIGNoZWNraW5nIGFuZCB3aGVuIHJ1bm5pbmcgcHJvZ3JhbXMgaW4gY2hlY2tlZCBtb2RlLiBUaGV5IGhhdmUgbm8gZWZmZWN0IHdoYXRzb2V2ZXIgaW4gcHJvZHVjdGlvbiBtb2RlLgoKIFxiZWdpbntncmFtbWFyfQp7XGJmIHR5cGU6fQogICAgICB0eXBlTmFtZSB0eXBlQXJndW1lbnRzPwogICAgLgoKe1xiZiB0eXBlTmFtZTp9CiAgICAgIHF1YWxpZmllZCAKICAgIC4KCntcYmYgdHlwZUFyZ3VtZW50czp9CiAgICAgICc8JyB0eXBlTGlzdCAnPicKICAgIC4KCntcYmYgdHlwZUxpc3Q6fQogICAgICB0eXBlICgnLCcgdHlwZSkqCiAgICAuCiBcZW5ke2dyYW1tYXJ9CgpBIERhcnQgaW1wbGVtZW50YXRpb24gbXVzdCBwcm92aWRlIGEgc3RhdGljIGNoZWNrZXIgdGhhdCBkZXRlY3RzIGFuZCByZXBvcnRzIGV4YWN0bHkgdGhvc2Ugc2l0dWF0aW9ucyB0aGlzIHNwZWNpZmljYXRpb24gaWRlbnRpZmllcyBhcyBzdGF0aWMgd2FybmluZ3MgYW5kIG9ubHkgdGhvc2Ugc2l0dWF0aW9ucy4gSG93ZXZlcjoKXGJlZ2lue2l0ZW1pemV9ClxpdGVtIFJ1bm5pbmcgIHRoZSBzdGF0aWMgY2hlY2tlciBvbiBhIHByb2dyYW0gJFAkIGlzIG5vdCByZXF1aXJlZCBmb3IgY29tcGlsaW5nIGFuZCBydW5uaW5nICRQJC4gIApcaXRlbSBSdW5uaW5nIHRoZSBzdGF0aWMgY2hlY2tlciBvbiBhIHByb2dyYW0gJFAkIG11c3Qgbm90IHByZXZlbnQgc3VjY2Vzc2Z1bCBjb21waWxhdGlvbiBvZiAkUCQgbm9yIG1heSBpdCBwcmV2ZW50IHRoZSBleGVjdXRpb24gb2YgJFAkLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYW55IHN0YXRpYyB3YXJuaW5ncyBvY2N1ci4KXGVuZHtpdGVtaXplfQoKXGNvbW1lbnRhcnl7Tm90aGluZyBwcmVjbHVkZXMgYWRkaXRpb25hbCB0b29scyB0aGF0IGltcGxlbWVudCBhbHRlcm5hdGl2ZSBzdGF0aWMgYW5hbHlzZXMgKGUuZy4sIGludGVycHJldGluZyB0aGUgZXhpc3RpbmcgdHlwZSBhbm5vdGF0aW9ucyBpbiBhIHNvdW5kIG1hbm5lciBzdWNoIGFzIGVpdGhlciBub24tdmFyaWFudCBnZW5lcmljcywgb3IgaW5mZXJyaW5nIGRlY2xhcmF0aW9uIGJhc2VkIHZhcmlhbmNlIGZyb20gdGhlIGFjdHVhbCBkZWNsYXJhdGlvbnMpLiBIb3dldmVyLCB1c2luZyB0aGVzZSB0b29scyBtdXN0IG5vdCBwcmVjbHVkZSBzdWNjZXNzZnVsIGNvbXBpbGF0aW9uIGFuZCBleGVjdXRpb24gb2YgRGFydCBjb2RlLgp9CgolXFF7U2hvdWxkIHdlIGRvIHNvbWV0aGluZyB3aXRoIHJlc3BlY3QgdG8gbm9uLW51bGxhYmxlIHR5cGVzP30KCkEgdHlwZSAkVCQgaXMge1xlbSBtYWxmb3JtZWR9IGlmZjoKXGJlZ2lue2l0ZW1pemV9ClxpdGVtICRUJCBoYXMgdGhlIGZvcm0gJGlkJCBvciB0aGUgZm9ybSAkcHJlZml4LmlkJCwgYW5kIGluIHRoZSBlbmNsb3NpbmcgbGV4aWNhbCBzY29wZSwgdGhlIG5hbWUgJGlkJCAocmVzcGVjdGl2ZWx5ICRwcmVmaXguaWQkKSBkb2VzIG5vdCBkZW5vdGUgYSB0eXBlLgpcaXRlbSAkVCQgZGVub3RlcyBhIHR5cGUgdmFyaWFibGUgaW4gdGhlIGVuY2xvc2luZyBsZXhpY2FsIHNjb3BlLCBidXQgb2NjdXJzIGluIHRoZSBzaWduYXR1cmUgb3IgYm9keSBvZiBhIHN0YXRpYyBtZW1iZXIuClxpdGVtICRUJCBpcyBhIHBhcmFtZXRlcml6ZWQgdHlwZSBvZiB0aGUgZm9ybSAkRzxTXzEsIFxsZG90cyAsIFNfbj4kLCBhbmQgICRHJCBpcyBtYWxmb3JtZWQuIApcaXRlbSAkVCQgZGVub3RlcyBkZWNsYXJhdGlvbnMgdGhhdCB3ZXJlIGltcG9ydGVkIGZyb20gbXVsdGlwbGUgaW1wb3J0cyBjbGF1c2VzLgolRWl0aGVyICRHJCBvciAkU19pLCAgaSBcaW4gMS4uIG4kIGFyZSBtYWxmb3JtZWQuIAogJSBcaXRlbSAgJEckIGlzIG5vdCBhIGdlbmVyaWMgdHlwZSB3aXRoICRuJCB0eXBlIHBhcmFtZXRlcnMuCiUgIFxpdGVtIExldCAkVF9pJCBiZSB0aGUgdHlwZSBwYXJhbWV0ZXJzIG9mICRHJCAoaWYgYW55KSBhbmQgbGV0ICRCX2kkIGJlIHRoZSBib3VuZCBvZiAkVF9pLCAgaSBcaW4gMS4uIG4kLCBhbmQgJFNfaSQgaXMgbm90IGEgc3VidHlwZSBvZiAkW1NfMSwgIFxsZG90cywgU19uL1RfMSwgXGxkb3RzLCBUX25dQl9pLCAgIGkgXGluIDEuLiBuJC4gCiUgIFxlbmR7aXRlbWl6ZX0KXGVuZHtpdGVtaXplfQoKIEFueSB1c2Ugb2YgYSBtYWxmb3JtZWQgIHR5cGUgZ2l2ZXMgcmlzZSB0byBhIHN0YXRpYyB3YXJuaW5nLiBBIG1hbGZvcm1lZCB0eXBlIGlzIHRoZW4gaW50ZXJwcmV0ZWQgYXMgXERZTkFNSUN7fSBieSB0aGUgc3RhdGljIHR5cGUgY2hlY2tlciBhbmQgdGhlIHJ1bnRpbWUgdW5sZXNzIGV4cGxpY2l0bHkgc3BlY2lmaWVkIG90aGVyd2lzZS4KICAKIFxyYXRpb25hbGV7ClRoaXMgZW5zdXJlcyB0aGF0IHRoZSBkZXZlbG9wZXIgaXMgc3BhcmVkIGEgc2VyaWVzIG9mIGNhc2NhZGluZyB3YXJuaW5ncyBhcyB0aGUgbWFsZm9ybWVkIHR5cGUgaW50ZXJhY3RzIHdpdGggb3RoZXIgdHlwZXMuCn0KCkEgdHlwZSAkVCQgaXMge1xlbSBkZWZlcnJlZH0gaWZmIGl0IGlzIG9mIHRoZSBmb3JtICRwLlQkIHdoZXJlICRwJCBpcyBhIGRlZmVycmVkIHByZWZpeC4KSXQgaXMgYSBzdGF0aWMgd2FybmluZyB0byB1c2UgYSBkZWZlcnJlZCB0eXBlIGluIGEgdHlwZSBhbm5vdGF0aW9uLCB0eXBlIHRlc3QsIHR5cGUgY2FzdCBvciBhcyBhIHR5cGUgcGFyYW1ldGVyLiBIb3dldmVyLCBhbGwgb3RoZXIgc3RhdGljIHdhcm5pbmdzIG11c3QgYmUgaXNzdWVkIHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgYWxsIGRlZmVycmVkIGxpYnJhcmllcyBoYXZlIHN1Y2Nlc3NmdWxseSBiZWVuIGxvYWRlZC4KCgpcc3Vic3Vic2VjdGlvbntUeXBlIFByb21vdGlvbn0gICAKXGxhYmVse3R5cGVQcm9tb3Rpb259CgpUaGUgc3RhdGljIHR5cGUgc3lzdGVtIGFzY3JpYmVzIGEgc3RhdGljIHR5cGUgdG8gZXZlcnkgZXhwcmVzc2lvbi4gIEluIHNvbWUgY2FzZXMsIHRoZSB0eXBlcyBvZiBsb2NhbCB2YXJpYWJsZXMgYW5kIGZvcm1hbCBwYXJhbWV0ZXJzIG1heSBiZSBwcm9tb3RlZCBmcm9tIHRoZWlyIGRlY2xhcmVkIHR5cGVzIGJhc2VkIG9uIGNvbnRyb2wgZmxvdy4gCgpXZSBzYXkgdGhhdCBhIHZhcmlhYmxlICR2JCBpcyBrbm93biB0byBoYXZlIHR5cGUgJFQkIHdoZW5ldmVyIHdlIGFsbG93IHRoZSB0eXBlIG9mICR2JCB0byBiZSBwcm9tb3RlZC4gVGhlIGV4YWN0IGNpcmN1bXN0YW5jZXMgd2hlbiB0eXBlIHByb21vdGlvbiBpcyBhbGxvd2VkIGFyZSBnaXZlbiBpbiB0aGUgcmVsZXZhbnQgc2VjdGlvbnMgb2YgdGhlIHNwZWNpZmljYXRpb24gKFxyZWZ7bG9naWNhbEJvb2xlYW5FeHByZXNzaW9uc30sIFxyZWZ7Y29uZGl0aW9uYWx9IGFuZCBccmVme2lmfSkuCgpUeXBlIHByb21vdGlvbiBmb3IgYSB2YXJpYWJsZSAkdiQgaXMgYWxsb3dlZCBvbmx5IHdoZW4gd2UgY2FuIGRlZHVjZSB0aGF0IHN1Y2ggcHJvbW90aW9uIGlzIHZhbGlkIGJhc2VkIG9uIGFuIGFuYWx5c2lzIG9mIGNlcnRhaW4gYm9vbGVhbiBleHByZXNzaW9ucy4gSW4gc3VjaCBjYXNlcywgd2Ugc2F5IHRoYXQgdGhlIGJvb2xlYW4gZXhwcmVzc2lvbiAkYiQgc2hvd3MgdGhhdCAkdiQgaGFzIHR5cGUgJFQkLiBBcyBhIHJ1bGUsIGZvciBhbGwgdmFyaWFibGVzICR2JCBhbmQgdHlwZXMgJFQkLCBhIGJvb2xlYW4gZXhwcmVzc2lvbiBkb2VzIG5vdCBzaG93IHRoYXQgJHYkIGhhcyB0eXBlICRUJC4gVGhvc2Ugc2l0dWF0aW9ucyB3aGVyZSBhbiBleHByZXNzaW9uIGRvZXMgc2hvdyB0aGF0IGEgdmFyaWFibGUgaGFzIGEgdHlwZSBhcmUgbWVudGlvbmVkIGV4cGxpY2l0bHkgaW4gdGhlIHJlbGV2YW50IHNlY3Rpb25zIG9mIHRoaXMgc3BlY2lmaWNhdGlvbiAoXHJlZnt0eXBlVGVzdH0gYW5kIFxyZWZ7bG9naWNhbEJvb2xlYW5FeHByZXNzaW9uc30pLgoKClxzdWJzZWN0aW9ue0R5bmFtaWMgVHlwZSBTeXN0ZW19ClxsYWJlbHtkeW5hbWljVHlwZVN5c3RlbX0KCkEgRGFydCBpbXBsZW1lbnRhdGlvbiBtdXN0IHN1cHBvcnQgZXhlY3V0aW9uIGluIGJvdGgge1xlbSBwcm9kdWN0aW9uIG1vZGV9IGFuZCB7XGVtIGNoZWNrZWQgbW9kZX0uICBUaG9zZSBkeW5hbWljIGNoZWNrcyBzcGVjaWZpZWQgYXMgb2NjdXJyaW5nIHNwZWNpZmljYWxseSBpbiBjaGVja2VkIG1vZGUgbXVzdCBiZSBwZXJmb3JtZWQgaWZmIHRoZSBjb2RlIGlzIGV4ZWN1dGVkIGluIGNoZWNrZWQgbW9kZS4KClxjb21tZW50YXJ5ewpOb3RlIHRoYXQgdGhpcyBpcyB0aGUgY2FzZSBldmVuIGlmIHRoZSBkZWZlcnJlZCB0eXBlIGJlbG9uZ3MgdG8gYSBwcmVmaXggdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZC4gVGhpcyBpcyByZWdyZXR0YWJsZSwgc2luY2UgaXQgc3Ryb25nbHkgZGlzY291cmFnZXMgdGhlIHVzZSBvZiB0eXBlIGFubm90YXRpb25zIHRoYXQgaW52b2x2ZSBkZWZlcnJlZCB0eXBlcyBiZWNhdXNlIERhcnQgcHJvZ3JhbW1lcnMgdXNlIGNoZWNrZWQgbW9kZSBtdWNoIG9mIHRoZSB0aW1lLgoKSW4gcHJhY3RpY2UsIG1hbnkgc2NlbmFyaW9zIGludm9sdmluZyBkZWZlcnJlZCBsb2FkaW5nIGludm9sdmUgZGVmZXJyZWQgbG9hZGluZyBvZiBjbGFzc2VzIHRoYXQgaW1wbGVtZW50IGVhZ2VybHkgbG9hZGVkIGludGVyZmFjZXMsIHNvIHRoZSBzaXR1YXRpb24gaXMgb2Z0ZW4gbGVzcyBvbmVyb3VzIHRoYW4gaXQgc2VlbXMuIFRoZSBjdXJyZW50IHNlbWFudGljcyB3ZXJlIGFkb3B0ZWQgYmFzZWQgb24gY29uc2lkZXJhdGlvbnMgb2YgZWFzZSBvZiBpbXBsZW1lbnRhdGlvbi4KCkNsZWFybHksIGlmIGEgZGVmZXJyZWQgdHlwZSBoYXMgbm90IHlldCBiZWVuIGxvYWRlZCwgaXQgaXMgaW1wb3NzaWJsZSB0byBkbyBhIGNvcnJlY3Qgc3VidHlwZSB0ZXN0IGludm9sdmluZyBpdCwgYW5kIG9uZSB3b3VsZCBleHBlY3QgYSBkeW5hbWljIGZhaWx1cmUsIGFzIGlzIHRoZSBjYXNlIHdpdGggdHlwZSB0ZXN0cyBhbmQgY2FzdHMuIEJ5IHRoZSBzYW1lIHRva2VuLCBvbmUgd291bGQgZXhwZWN0IGNoZWNrZWQgbW9kZSB0byB3b3JrIHNlYW1sZXNzbHkgb25jZSBhIHR5cGUgaGFkIGJlZW4gbG9hZGVkLiBXZSBob3BlIHRvIGFkb3B0IHRoZXNlIHNlbWFudGljcyBpbiB0aGUgZnV0dXJlOyBzdWNoIGEgY2hhbmdlIHdvdWxkIGJlIHVwd2FyZGx5IGNvbXBhdGlibGUuCgp9CgolSXQgaXMgYSBydW4tdGltZSB0eXBlIGVycm9yIHRvIGFjY2VzcyBhbiB1bmRlY2xhcmVkIHR5cGUgb3V0c2lkZSAuCgolSXQgaXMgYSBkeW5hbWljIHR5cGUgZXJyb3IgaWYgYSBtYWxmb3JtZWQgdHlwZSBpcyB1c2VkIGluIGEgc3VidHlwZSB0ZXN0LiAgCkluIGNoZWNrZWQgbW9kZSwgaXQgaXMgYSBkeW5hbWljIHR5cGUgZXJyb3IgaWYgYSBkZWZlcnJlZCwgbWFsZm9ybWVkIG9yIG1hbGJvdW5kZWQgKFxyZWZ7cGFyYW1ldGVyaXplZFR5cGVzfSkgCnR5cGUgaXMgdXNlZCBpbiBhIHN1YnR5cGUgdGVzdC4gIAoKJUluIHByb2R1Y3Rpb24gbW9kZSwgYW4gdW5kZWNsYXJlZCB0eXBlIGlzIHRyZWF0ZWQgYXMgYW4gaW5zdGFuY2Ugb2YgdHlwZSBcRFlOQU1JQ3t9LiAKClxjb21tZW50YXJ5e0NvbnNpZGVyIHRoZSBmb2xsb3dpbmcgcHJvZ3JhbX0KClxiZWdpbntkYXJ0Q29kZX0KXFRZUEVERUZ7fSBGKGJvb2wgeCk7CmYoZm9vIHgpICQ9PiQgeDsKbWFpbigpIFx7CiAgaWYgKGYgaXMgRikgXHsKICAgIHByaW50KCJ5b3lvbWEiKTsKICBcfQpcfQpcZW5ke2RhcnRDb2RlfQoKXGNvbW1lbnRhcnl7ClRoZSB0eXBlIG9mIHRoZSBmb3JtYWwgcGFyYW1ldGVyIG9mICRmJCBpcyAkZm9vJCwgd2hpY2ggaXMgdW5kZWNsYXJlZCBpbiB0aGUgbGV4aWNhbCBzY29wZS4gVGhpcyB3aWxsIGxlYWQgdG8gYSBzdGF0aWMgdHlwZSB3YXJuaW5nLiBBdCBydW50aW1lIHRoZSBwcm9ncmFtIHdpbGwgcHJpbnQgXGNke3lveW9tYX0sIGJlY2F1c2UgJGZvbyQgaXMgdHJlYXRlZCBhcyBcRFlOQU1JQ3t9LgolZmFpbCB3aGVuIGV4ZWN1dGluZyB0aGUgdHlwZSB0ZXN0IG9uIHRoZSBmaXJzdCBsaW5lIG9mICRtYWluKCkkIGJlY2F1c2UgaXQgbGVhZHMgdG8gYSBzdWJ0eXBlIGNvbXBhcmlzb24gaW52b2x2aW5nIGEgbWFsZm9ybWVkIHR5cGUgKCRmb28kKS4gCgpBcyBhbm90aGVyIGV4YW1wbGUgdGFrZX0KClxiZWdpbntkYXJ0Q29kZX0KXFZBUnt9IGk7CmkgIGo7IC8vICBhIHZhcmlhYmxlIGogb2YgdHlwZSBpIChzdXBwb3NlZGx5KQptYWluKCkgXHsKICAgICBqID0gICdJIGFtIG5vdCBhbiBpJzsgClx9ClxlbmR7ZGFydENvZGV9CgpcY29tbWVudGFyeXsKU2luY2UgJGkkIGlzIG5vdCBhIHR5cGUsIGEgc3RhdGljIHdhcm5pbmcgd2lsbCBiZSBpc3N1ZSBhdCB0aGUgZGVjbGFyYXRpb24gb2YgJGokLiBIb3dldmVyLCB0aGUgcHJvZ3JhbSBjYW4gYmUgZXhlY3V0ZWQgd2l0aG91dCBpbmNpZGVudCBpbiBwcm9kdWN0aW9uIG1vZGUgYmVjYXVzZSBoZSB1bmRlY2xhcmVkIHR5cGUgJGkkIGlzIHRyZWF0ZWQgYXMgXERZTkFNSUN7fS4gSG93ZXZlciwgaW4gY2hlY2tlZCBtb2RlLCB0aGUgaW1wbGljaXQgc3VidHlwZSB0ZXN0IGF0IHRoZSBhc3NpZ25tZW50IHdpbGwgdHJpZ2dlciBhbiBlcnJvciBhdCBydW50aW1lLgp9CgoKXGNvbW1lbnRhcnl7CkhlcmUgaXMgYW4gZXhhbXBsZSBpbnZvbHZpbmcgbWFsYm91bmRlZCB0eXBlczoKfQoKXGJlZ2lue2RhcnRDb2RlfQpcQ0xBU1N7fSBJJDwkVCBcRVhURU5EU3t9IG51bSQ+JCBce1x9ClxDTEFTU3t9IEogXHtcfQoKXENMQVNTe30gQSQ8JFQkPiQgXElNUExFTUVOVFN7fSBKLCAgSSQ8JFQkPiQgLy8gdHlwZSB3YXJuaW5nOiBUIGlzIG5vdCBhIHN1YnR5cGUgb2YgbnVtClx7IC4uLgpcfSAKXGVuZHtkYXJ0Q29kZX0KClxjb21tZW50YXJ5e0dpdmVuIHRoZSBkZWNsYXJhdGlvbnMgYWJvdmUsIHRoZSBmb2xsb3dpbmd9CgpcYmVnaW57ZGFydENvZGV9CkkgeCA9IFxORVd7fSBBJDwkU3RyaW5nJD4kKCk7IApcZW5ke2RhcnRDb2RlfQoKXGNvbW1lbnRhcnl7CndpbGwgY2F1c2UgYSBkeW5hbWljIHR5cGUgZXJyb3IgaW4gY2hlY2tlZCBtb2RlLCBiZWNhdXNlIHRoZSBhc3NpZ25tZW50IHJlcXVpcmVzIGEgc3VidHlwZSB0ZXN0IEEkPCRTdHJpbmckPiQgJDwkOiBJLiBUbyBzaG93IHRoYXQgdGhpcyBob2xkcywgd2UgbmVlZCB0byBzaG93IHRoYXQgQSQ8JFN0cmluZyQ+JCAgJDw8JCBJJDwkU3RyaW5nJD4kLCBidXQgSSQ8JFN0cmluZyQ+JCBpcyBhIG1hbGJvdW5kZWQgdHlwZSwgY2F1c2luZyB0aGUgZHluYW1pYyBlcnJvci4gIE5vIGVycm9yIGlzIHRocm93biBpbiBwcm9kdWN0aW9uIG1vZGUuIE5vdGUgdGhhdAp9CgpcYmVnaW57ZGFydENvZGV9CkogeCA9IFxORVd7fSBBJDwkU3RyaW5nJD4kKCk7IApcZW5ke2RhcnRDb2RlfQoKXGNvbW1lbnRhcnl7CmRvZXMgbm90IGNhdXNlIGEgZHluYW1pYyBlcnJvciwgYXMgdGhlcmUgaXMgbm8gbmVlZCB0byB0ZXN0IGFnYWluc3QgXGNvZGV7SSQ8JFN0cmluZyQ+JH0gaW4gdGhpcyBjYXNlLiAKU2ltaWxhcmx5LCBpbiBwcm9kdWN0aW9uIG1vZGUKfQoKXGJlZ2lue2RhcnRDb2RlfQpBIHggPSBcTkVXe30gQSQ8JFN0cmluZyQ+JCgpOwpib29sIGIgPSB4IGlzIEk7ClxlbmR7ZGFydENvZGV9CgpcY29tbWVudGFyeXsKXGNvZGV7Yn0gaXMgYm91bmQgdG8gdHJ1ZSwgYnV0IGluIGNoZWNrZWQgbW9kZSB0aGUgc2Vjb25kIGxpbmUgY2F1c2VzIGEgZHluYW1pYyB0eXBlIGVycm9yLgp9CgoKClxzdWJzZWN0aW9ue1R5cGUgRGVjbGFyYXRpb25zfQpcbGFiZWx7dHlwZURlY2xhcmF0aW9uc30KClxzdWJzdWJzZWN0aW9ue1R5cGVkZWZ9ClxsYWJlbHt0eXBlZGVmfQoKQSB7XGVtIHR5cGUgYWxpYXN9IGRlY2xhcmVzIGEgbmFtZSBmb3IgYSB0eXBlIGV4cHJlc3Npb24uCgoKXGJlZ2lue2dyYW1tYXJ9Cgp7XGJmIHR5cGVBbGlhczp9CiAJbWV0YWRhdGEgIFxUWVBFREVGe30gdHlwZUFsaWFzQm9keQoJLgoJCntcYmYgdHlwZUFsaWFzQm9keTp9CglmdW5jdGlvblR5cGVBbGlhcwoJLgoKe1xiZiBmdW5jdGlvblR5cGVBbGlhczp9CiAgICAgICBmdW5jdGlvblByZWZpeCAgdHlwZVBhcmFtZXRlcnM/IGZvcm1hbFBhcmFtZXRlckxpc3QgJ3tcZXNjYXBlZ3JhbW1hciA7fScKICAgIC4KICAgIAogICAge1xiZiBmdW5jdGlvblByZWZpeDp9CiAgICByZXR1cm5UeXBlPyBpZGVudGlmaWVyCiAgICAuCiAgICAKIFxlbmR7Z3JhbW1hcn0KIAogVGhlIGVmZmVjdCBvZiBhIHR5cGUgYWxpYXMgb2YgdGhlIGZvcm0gIFxjb2Rle1xUWVBFREVGe30gJFQkICRpZCAoVF8xJCAkcF8xLCBcbGRvdHMsIFRfbiQgJHBfbiwgW1Rfe24rMX0kICRwX3tuKzF9LCBcbGRvdHMsIFRfe24ra30kICRwX3tuK2t9XSkkfSBkZWNsYXJlZCBpbiBhIGxpYnJhcnkgJEwkIGlzIGlzIHRvIGludHJvZHVjZSB0aGUgbmFtZSAkaWQkIGludG8gdGhlIHNjb3BlIG9mICRMJCwgYm91bmQgdG8gdGhlIGZ1bmN0aW9uIHR5cGUgJChUXzEsIFxsZG90cywgVF9uLCBbVF97bisxfSQgJHBfe24rMX0sIFxsZG90cywgVF97bitrfSQgJHBfe24ra31dKSAgXHJpZ2h0YXJyb3cgVCQuICBUaGUgZWZmZWN0IG9mIGEgdHlwZSBhbGlhcyBvZiB0aGUgZm9ybSAgIFxjb2Rle1xUWVBFREVGe30gJFQkICRpZCAoVF8xJCAkcF8xLCBcbGRvdHMsIFRfbiQgJHBfbiwgXHtUX3tuKzF9JCAkcF97bisxfSwgXGxkb3RzLCBUX3tuK2t9JCAkcF97bitrfVx9KSR9IGRlY2xhcmVkIGluIGEgbGlicmFyeSAkTCQgaXMgaXMgdG8gaW50cm9kdWNlIHRoZSBuYW1lICRpZCQgaW50byB0aGUgc2NvcGUgb2YgJEwkLCBib3VuZCB0byB0aGUgZnVuY3Rpb24gdHlwZSAkKFRfMSwgXGxkb3RzLCBUX24sIFx7VF97bisxfSQgJHBfe24rMX0sIFxsZG90cywgVF97bitrfSQgJHBfe24ra31cfSkgIFxyaWdodGFycm93IFQkLiAuIEluIGVpdGhlciBjYXNlLCBpZmYgbm8gcmV0dXJuIHR5cGUgaXMgc3BlY2lmaWVkLCBpdCBpcyB0YWtlbiB0byBiZSBcRFlOQU1JQ3t9LiBMaWtld2lzZSwgaWYgYSB0eXBlIGFubm90YXRpb24gaXMgb21pdHRlZCBvbiBhIGZvcm1hbCBwYXJhbWV0ZXIsIGl0IGlzIHRha2VuIHRvIGJlIFxEWU5BTUlDe30uCiAKSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgYW55IGRlZmF1bHQgdmFsdWVzIGFyZSBzcGVjaWZpZWQgaW4gdGhlIHNpZ25hdHVyZSBvZiBhIGZ1bmN0aW9uIHR5cGUgYWxpYXMuIAolQSB0eXBlZGVmIG1heSBvbmx5IHJlZmVyIHRvIGl0c2VsZiAgdmlhIHRoZSBib3VuZHMgb2YgaXRzIGdlbmVyaWMgcGFyYW1ldGVycy4gCkFueSAgc2VsZiByZWZlcmVuY2UgaW4gYSB0eXBlZGVmLCBlaXRoZXIgZGlyZWN0bHksIG9yIHJlY3Vyc2l2ZWx5IHZpYSBhbm90aGVyIHR5cGVkZWYsIGlzIGEgY29tcGlsZSB0aW1lIGVycm9yLgoldmlhIGEgY2hhaW4gb2YgcmVmZXJlbmNlcyB0aGF0IGRvZXMgbm90IGluY2x1ZGUgYSBjbGFzcyBkZWNsYXJhdGlvbi4gIAogCgoKXHN1YnNlY3Rpb257SW50ZXJmYWNlIFR5cGVzfQpcbGFiZWx7aW50ZXJmYWNlVHlwZXN9CgpUaGUgaW1wbGljaXQgaW50ZXJmYWNlIG9mIGNsYXNzICRJJCBpcyBhIGRpcmVjdCBzdXBlcnR5cGUgb2YgdGhlIGltcGxpY2l0IGludGVyZmFjZSBvZiBjbGFzcyAgJEokIGlmZjoKXGJlZ2lue2l0ZW1pemV9ClxpdGVtCklmICRJJCBpcyBcY29kZXtPYmplY3R9LCBhbmQgJEokIGhhcyBubyBcRVhURU5EU3t9IGNsYXVzZSUgYW5kIG5vIGludGVyZmFjZSBpbmplY3Rpb24gZGVjbGFyYXRpb24gaGFzIGV4dGVuZGVkICRKLgpcaXRlbQpJZiAkSSQgaXMgbGlzdGVkIGluIHRoZSBcRVhURU5EU3t9IGNsYXVzZSBvZiAkSiQlIG9yIGFuIGludGVyZmFjZSBpbmplY3Rpb24gZGVjbGFyYXRpb24gaGFzIGV4dGVuZGVkICRKJCB3aXRoICRJJAouClxpdGVtIElmICRJJCBpcyBsaXN0ZWQgaW4gdGhlIFxJTVBMRU1FTlRTe30gY2xhdXNlIG9mICRKJAoKXGl0ZW0gSWYgJEkkIGlzIGxpc3RlZCBpbiB0aGUgXFdJVEh7fSBjbGF1c2Ugb2YgJEokCgpcaXRlbSBJZiAkSiQgaXMgYSBtaXhpbiBhcHBsaWNhdGlvbiAoXHJlZnttaXhpbkFwcGxpY2F0aW9ufSkgb2YgdGhlIG1peGluIG9mICRJJC4KXGVuZHtpdGVtaXplfQoKXGNvbW1lbnRhcnl7CgoKfQoKJVxRe0NhbiB3YWNreSBzdHVmZiBoYXBwZW4gd2l0aCBpbnRlcmZhY2UgaW5qZWN0aW9uLCBlLmcuLCBhIGRpcmVjdCBzdXBlcmludGVyZmFjZSBiZWNvbWVzIGluZGlyZWN0PyBXaGF0IGFib3V0IHNpZGUgZWZmZWN0cyAtIGxvYWRpbmcgb3JkZXIgY2FuIGFmZmVjdCB0eXBlIHJlbGF0aW9uc2hpcHMuCiV9CgpBIHR5cGUgJFQkIGlzIG1vcmUgc3BlY2lmaWMgdGhhbiBhIHR5cGUgJFMkLCB3cml0dGVuICRUIDw8IFMkLCAgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyBtZXQ6ClxiZWdpbntpdGVtaXplfQpcaXRlbSAkVCQgaXMgJFMkLgpcaXRlbSBUIGlzICRcYm90JC4KXGl0ZW0gUyBpcyBcRFlOQU1JQ3t9LgpcaXRlbSAkUyQgaXMgYSBkaXJlY3Qgc3VwZXJ0eXBlIG9mICRUJC4KXGl0ZW0gJFQkIGlzIGEgdHlwZSBwYXJhbWV0ZXIgYW5kICRTJCBpcyB0aGUgdXBwZXIgYm91bmQgb2YgJFQkLgpcaXRlbSAkVCQgaXMgYSB0eXBlIHBhcmFtZXRlciBhbmQgJFMkIGlzIFxjZHtPYmplY3R9LgpcaXRlbSAkVCQgaXMgb2YgdGhlIGZvcm0gJEk8VF8xLCBcbGRvdHMsIFRfbj4kIGFuZCAkUyQgaXMgb2YgdGhlIGZvcm0gJEk8U18xLCBcbGRvdHMsIFNfbj4kIGFuZDoKJFRfaSA8PCBTX2ksIDEgXGxlIGkgXGxlIG4kClxpdGVtICRUJCBhbmQgJFMkIGFyZSBib3RoIGZ1bmN0aW9uIHR5cGVzLCBhbmQgJFQgPDwgUyQgdW5kZXIgdGhlIHJ1bGVzIG9mIHNlY3Rpb24gXHJlZntmdW5jdGlvblR5cGVzfS4KXGl0ZW0gJFQkIGlzIGEgZnVuY3Rpb24gdHlwZSBhbmQgJFMkIGlzIFxjZHtGdW5jdGlvbn0uClxpdGVtICRUIDw8IFUkIGFuZCAkVSA8PCBTJC4KXGVuZHtpdGVtaXplfQoKJDw8JCBpcyBhIHBhcnRpYWwgb3JkZXIgb24gdHlwZXMuCiRUJCBpcyBhIHN1YnR5cGUgb2YgJFMkLCB3cml0dGVuICRUIDw6IFMkLCBpZmYgJFtcYm90L1xEWU5BTUlDe31dVCA8PCBTJC4KClxyYXRpb25hbGV7Ck5vdGUgdGhhdCAkPDokIGlzIG5vdCBhIHBhcnRpYWwgb3JkZXIgb24gdHlwZXMsIGl0IGlzIG9ubHkgYmluYXJ5IHJlbGF0aW9uIG9uIHR5cGVzLiBUaGlzIGlzIGJlY2F1c2UgJDw6JCBpcyBub3QgdHJhbnNpdGl2ZS4gSWYgaXQgd2FzLCB0aGUgc3VidHlwZSBydWxlIHdvdWxkIGhhdmUgYSBjeWNsZS4gRm9yIGV4YW1wbGU6CiRMaXN0IDw6IExpc3Q8U3RyaW5nPiQgYW5kICRMaXN0PGludD4gPDogTGlzdCQsIGJ1dCAkTGlzdDxpbnQ+JCBpcyBub3QgYSBzdWJ0eXBlIG9mICRMaXN0PFN0cmluZz4kLgpBbHRob3VnaCAkPDokIGlzIG5vdCBhIHBhcnRpYWwgb3JkZXIgb24gdHlwZXMsIGl0IGRvZXMgY29udGFpbiBhIHBhcnRpYWwgb3JkZXIsIG5hbWVseSAkPDwkLiBUaGlzIG1lYW5zIHRoYXQsIGJhcnJpbmcgcmF3IHR5cGVzLCBpbnR1aXRpb24gYWJvdXQgY2xhc3NpY2FsIHN1YnR5cGUgcnVsZXMgZG9lcyBhcHBseS4KfQoKJFMkIGlzIGEgc3VwZXJ0eXBlIG9mICRUJCwgd3JpdHRlbiAkUyA6PiBUJCwgaWZmICRUJCBpcyBhIHN1YnR5cGUgb2YgJFMkLgoKXGNvbW1lbnRhcnl7VGhlIHN1cGVydHlwZXMgb2YgYW4gaW50ZXJmYWNlIGFyZSBpdHMgZGlyZWN0IHN1cGVydHlwZXMgYW5kIHRoZWlyIHN1cGVydHlwZXMuIH0KCkFuIGludGVyZmFjZSB0eXBlICRUJCBtYXkgYmUgYXNzaWduZWQgdG8gYSB0eXBlICRTJCwgd3JpdHRlbiAgJFQgXExvbmdsZWZ0cmlnaHRhcnJvdyBTJCwgaWZmIGVpdGhlciAkVCA8OiBTJCBvciAkUyA8OiBUJC4gCgpccmF0aW9uYWxle1RoaXMgcnVsZSBtYXkgc3VycHJpc2UgcmVhZGVycyBhY2N1c3RvbWVkIHRvIGNvbnZlbnRpb25hbCB0eXBlY2hlY2tpbmcuIFRoZSBpbnRlbnQgb2YgdGhlICRcTG9uZ2xlZnRyaWdodGFycm93JCByZWxhdGlvbiBpcyBub3QgdG8gZW5zdXJlIHRoYXQgYW4gYXNzaWdubWVudCBpcyBjb3JyZWN0LiBJbnN0ZWFkLCBpdCBhaW1zIHRvIG9ubHkgZmxhZyBhc3NpZ25tZW50cyB0aGF0IGFyZSBhbG1vc3QgY2VydGFpbiB0byBiZSBlcnJvbmVvdXMsIHdpdGhvdXQgcHJlY2x1ZGluZyBhc3NpZ25tZW50cyB0aGF0IG1heSB3b3JrLiAKCkZvciBleGFtcGxlLCBhc3NpZ25pbmcgYSB2YWx1ZSBvZiBzdGF0aWMgdHlwZSBPYmplY3QgdG8gYSB2YXJpYWJsZSB3aXRoIHN0YXRpYyB0eXBlIFN0cmluZywgd2hpbGUgbm90IGd1YXJhbnRlZWQgdG8gYmUgY29ycmVjdCwgbWlnaHQgYmUgZmluZSBpZiB0aGUgcnVudGltZSB2YWx1ZSBoYXBwZW5zIHRvIGJlIGEgc3RyaW5nLgp9Cgpcc3Vic2VjdGlvbntGdW5jdGlvbiBUeXBlc30KXGxhYmVse2Z1bmN0aW9uVHlwZXN9CgpGdW5jdGlvbiB0eXBlcyBjb21lIGluIHR3byB2YXJpYW50czogClxiZWdpbntlbnVtZXJhdGV9ClxpdGVtClRoZSB0eXBlcyBvZiBmdW5jdGlvbnMgdGhhdCBvbmx5IGhhdmUgcG9zaXRpb25hbCBwYXJhbWV0ZXJzLiAgVGhlc2UgaGF2ZSB0aGUgZ2VuZXJhbCBmb3JtICQoVF8xLCBcbGRvdHMsIFRfbiwgW1Rfe24rMX0gXGxkb3RzLCBUX3tuK2t9XSkgXHJpZ2h0YXJyb3cgVCQuClxpdGVtClRoZSB0eXBlcyBvZiBmdW5jdGlvbnMgd2l0aCBuYW1lZCAgcGFyYW1ldGVycy4gVGhlc2UgaGF2ZSB0aGUgZ2VuZXJhbCBmb3JtICQoVF8xLCBcbGRvdHMsIFRfbiwgXHtUX3t4XzF9JCAkeF8xIFxsZG90cywgVF97eF9rfSQgJHhfa1x9KSBccmlnaHRhcnJvdyBUJC4KXGVuZHtlbnVtZXJhdGV9CgolJChUXzEsIFxsZG90cyBUX24pIFxyaWdodGFycm93IFQkIGlzIGEgc3VidHlwZSBvZiAgJChTXzEsIFxsZG90cywgU19uLCApIFxyaWdodGFycm93IFMkLCBpZiBhbGwgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CiVcYmVnaW57ZW51bWVyYXRlfQolXGl0ZW0gRWl0aGVyCiVcYmVnaW57aXRlbWl6ZX0KJVxpdGVtICRTJCBpcyBcVk9JRHt9LCBPcgolXGl0ZW0gICRUICBcTG9uZ2xlZnRyaWdodGFycm93IFMkLgolXGVuZHtpdGVtaXplfQolXGl0ZW0kIFxmb3JhbGwgaSBcaW4gMSAuLiBuLCBUX2kgXExvbmdsZWZ0cmlnaHRhcnJvdyBTX2kkLgolXGVuZHtlbnVtZXJhdGV9CgolQSBmdW5jdGlvbiB0eXBlICQoVF8xLCBcbGRvdHMgVF9uLCBbVF97bisxfSAgXGxkb3RzLCBUX3tuK2t9XSkgXHJpZ2h0YXJyb3cgVCQgaXMgYSBzdWJ0eXBlIG9mIHRoZSAKJSB0aGUgbGluZSBiZWxvdyByZXZpc2VzIHRoZSBydWxlIHRvIGJlIG1vcmUgbGliZXJhbApBIGZ1bmN0aW9uIHR5cGUgJChUXzEsIFxsZG90cyBUX3trfSwgW1Rfe2srMX0gIFxsZG90cywgVF97bittfV0pIFxyaWdodGFycm93IFQkIGlzIGEgc3VidHlwZSBvZiB0aGUKZnVuY3Rpb24gdHlwZSAkKFNfMSwgXGxkb3RzLCBTX3trK2p9LCBbU197aytqKzF9IFxsZG90cywgU197bn1dKSBccmlnaHRhcnJvdyBTJCwgaWYgYWxsIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgpcYmVnaW57ZW51bWVyYXRlfQpcaXRlbSBFaXRoZXIKXGJlZ2lue2l0ZW1pemV9ClxpdGVtICRTJCBpcyBcVk9JRHt9LCBPcgpcaXRlbSAgJFQgIFxMb25nbGVmdHJpZ2h0YXJyb3cgUyQuClxlbmR7aXRlbWl6ZX0KXGl0ZW0gJFxmb3JhbGwgaSBcaW4gMSAuLiBuLCBUX2kgXExvbmdsZWZ0cmlnaHRhcnJvdyBTX2kkLgpcZW5ke2VudW1lcmF0ZX0KCgpBIGZ1bmN0aW9uIHR5cGUgJChUXzEsIFxsZG90cyBUX24sIFx7VF97eF8xfSQgJHhfMSwgXGxkb3RzLCBUX3t4X2t9JCAkeF9rXH0pIFxyaWdodGFycm93IFQkIGlzIGEgc3VidHlwZSBvZiB0aGUgZnVuY3Rpb24gdHlwZSAkKFNfMSwgXGxkb3RzLCBTX24sIFx7U197eV8xfSQgJHlfMSwgXGxkb3RzLCBTX3t5X219JCAkeV9tXH0pIFxyaWdodGFycm93IFMkLCBpZiBhbGwgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6ClxiZWdpbntlbnVtZXJhdGV9ClxpdGVtIEVpdGhlcgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gJFMkIGlzIFxWT0lEe30sIE9yClxpdGVtICAkVCAgXExvbmdsZWZ0cmlnaHRhcnJvdyBTJC4KXGVuZHtpdGVtaXplfQpcaXRlbSAkXGZvcmFsbCBpIFxpbiAxIC4uIG4sIFRfaSBcTG9uZ2xlZnRyaWdodGFycm93IFNfaSQuClxpdGVtICRrIFxnZSBtJCBhbmQgJHlfaSBcaW4gXHt4XzEsICBcbGRvdHMsIHhfa1x9LCBpIFxpbiAxIC4uIG0kLgolXHt4XzEsICBcbGRvdHMsIHhfa1x9JCBpcyBhIHN1cGVyc2V0IG9mICRce3lfMSwgIFxsZG90cywgeV9tXH0kLgpcaXRlbSBGb3IgYWxsICR5X2kgXGluIFx7eV8xLCAgXGxkb3RzLCB5X21cfSwgeV9pID0geF9qIFxSaWdodGFycm93IFRfaiBcTG9uZ2xlZnRyaWdodGFycm93IFNfaSQKXGVuZHtlbnVtZXJhdGV9CgolSW4gYWRkaXRpb24sIGEgZnVuY3Rpb24gdHlwZSAkKFRfMSwgXGxkb3RzLCBUbiwgW1Rfe24rMX0geF97bisxfSwgXGxkb3RzLCBUX3tuK2t9IHhfe24ra31dKSBccmlnaHRhcnJvdyBUJCBpcyBhIHN1YnR5cGUgb2YgdGhlIGZ1bmN0aW9uIHR5cGUgJChUXzEsIFxsZG90cywgVF9uLCBUX3tuKzF9ICwgW1Rfe24rMn0geF97bisyfSwgXGxkb3RzLCBUX3tuK2t9IHhfe24ra31dKSBccmlnaHRhcnJvdyBUJC4KCiVccmF0aW9uYWxle1RoaXMgc2Vjb25kIHJ1bGUgaXMgYXR0cmFjdGl2ZSB0byB3ZWIgZGV2ZWxvcGVycywgd2hvIGFyZSB1c2VkIHRvIHRoaXMgc29ydCBvZiBmbGV4aWJpbGl0eSBmcm9tIEphdmFzY3JpcHQuIEhvd2V2ZXIsIGl0IG1heSBiZSBjb3N0bHkgdG8gaW1wbGVtZW50IGVmZmljaWVudGx5Ln0gXFF7U2hvdWxkIHdlIGRvIHRoaXMgb3Igbm90P30KCiVXZSB3cml0ZSAkKFRfMSwgXGxkb3RzLCBUX24pIFxyaWdodGFycm93IFQkIGFzIGEgc2hvcnRoYW5kIGZvciB0aGUgdHlwZSAkKFRfMSwgXGxkb3RzLCBUX24sIFtdKSBccmlnaHRhcnJvdyBUJC4KCiVUaGUgcnVsZXMgYWJvdmUgbmVlZCB0byBiZSBzYW5pdHkgY2hlY2tlZCwgYnV0IHRoZSBpbnRlbnQgaXMgdGhhdCB3ZSB2aWV3IGZ1bmN0aW9ucyB3aXRoIHJlc3QgcGFyYW1ldGVycyBhcyBoYXZpbmcgdHlwZSAkKFRfMSwgLi4uLCBUX24sIFtcX3tUbisxfVtdIFxfXSkgXHJpZ2h0YXJyb3cgVCQsIHdoZXJlIFxfIGlzIHNvbWUgbWFnaWNhbCBpZGVudGlmaWVyLiBUaGVuIHRoZSBydWxlcyBhYm92ZSBtYXkgY292ZXIgZXZlcnl0aGluZy4KJSBUaGlzIGlzIHdyb25nIC0gZnJvbSB0aGUgb3V0c2lkZSwgdGhlIHR5cGUgdGFrZXMgYW4gdW5ib3VuZGVkIHNlcXVlbmNlIG9mIHR5cGVzLCBub3QgYSBsaXN0LiBUaGlzIGNhbiBiZSBtb2RlbGVkIGFzICQoVF8xLCBcbGRvdHMsIFRfbiwgW1Rfe24rMX0sIFxfIFxsZG90cywgVF97bitrfSBcX10pIFxyaWdodGFycm93IFQkIGZvciBzb21lIGZpbml0ZSAkayQuIAoKSW4gYWRkaXRpb24sIHRoZSBmb2xsb3dpbmcgc3VidHlwZSBydWxlcyBhcHBseToKCgokKFRfMSwgXGxkb3RzLCBUX24sIFtdKSBccmlnaHRhcnJvdyBUIDw6IChUXzEsIFxsZG90cywgVF9uKSBccmlnaHRhcnJvdyBUJC4KCiQoVF8xLCBcbGRvdHMsIFRfbikgXHJpZ2h0YXJyb3cgVCA8OiAoVF8xLCBcbGRvdHMsIFRfbiwgXHtcfSkgXHJpZ2h0YXJyb3cgVCQuCgokKFRfMSwgXGxkb3RzLCBUX24sIFx7XH0pIFxyaWdodGFycm93IFQgPDogKFRfMSwgXGxkb3RzLCBUX24pIFxyaWdodGFycm93IFQkLgoKJChUXzEsIFxsZG90cywgVF9uKSBccmlnaHRhcnJvdyBUIDw6IChUXzEsIFxsZG90cywgVF9uLCBbXSkgXHJpZ2h0YXJyb3cgVCQuCgpccmF0aW9uYWxlewpUaGUgbmFpdmUgcmVhZGVyIG1pZ2h0IGNvbmNsdWRlIHRoYXQsIHNpbmNlIGl0IGlzIG5vdCBsZWdhbCB0byBkZWNsYXJlIGEgZnVuY3Rpb24gd2l0aCBhbiBlbXB0eSBvcHRpb25hbCBwYXJhbWV0ZXIgbGlzdCwgdGhlc2UgcnVsZXMgYXJlIHBvaW50bGVzcy4gSG93ZXZlciwgdGhleSBpbmR1Y2UgIHVzZWZ1bCByZWxhdGlvbnNoaXBzIGJldHdlZW4gZnVuY3Rpb24gdHlwZXMgdGhhdCBkZWNsYXJlIG5vIG9wdGlvbmFsIHBhcmFtZXRlcnMgYW5kIHRob3NlIHRoYXQgZG8uCn0KCkEgZnVuY3Rpb24gdHlwZSAkVCQgbWF5IGJlIGFzc2lnbmVkIHRvIGEgZnVuY3Rpb24gdHlwZSAkUyQsIHdyaXR0ZW4gICRUIFxMb25nbGVmdHJpZ2h0YXJyb3cgUyQsIGlmZiAgJFQgPDogUyQuIAoKJSBlbnN1cmUgdGhhdCBPYmplY3QgIGFuZCBkeW5hbWljIG1heSBiZSBhc3NpZ24gZG90IGEgZnVuY3Rpb24gdHlwZQpBIGZ1bmN0aW9uIGlzIGFsd2F5cyBhbiBpbnN0YW5jZSBvZiBzb21lIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgY2xhc3MgXGNvZGV7RnVuY3Rpb259IGFuZCBpbXBsZW1lbnRzIGEgXENBTEx7fSBtZXRob2Qgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUgYXMgdGhlIGZ1bmN0aW9uLiBBbGwgZnVuY3Rpb24gdHlwZXMgYXJlIHN1YnR5cGVzIG9mIFxjb2Rle0Z1bmN0aW9ufS4KSWYgYSB0eXBlICRJJCBpbmNsdWRlcyBhbiBpbnN0YW5jZSBtZXRob2QgbmFtZWQgXENBTEx7fSwgYW5kIHRoZSB0eXBlIG9mIFxDQUxMe30gaXMgdGhlIGZ1bmN0aW9uIHR5cGUgJEYkLCB0aGVuICRJJCBpcyBjb25zaWRlcmVkIHRvIGJlIG1vcmUgc3BlY2lmaWMgdGhhbiAkRiQuICBJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmIGEgY29uY3JldGUgY2xhc3MgaW1wbGVtZW50cyBcY2R7RnVuY3Rpb259IGFuZCBkb2VzIG5vdCBoYXZlIGEgY29uY3JldGUgbWV0aG9kIG5hbWVkIFxDQUxMe30gdW5sZXNzIHRoYXQgY2xhc3MgZGVjbGFyZXMgaXRzIG93biBpbXBsZW1lbnRhdGlvbiBvZiBcY2R7bm9TdWNoTWV0aG9kKCl9LgoKCgoKJVxjb21tZW50YXJ5e05lZWQgdG8gc3BlY2lmeSBob3cgYSBmdW5jdGlvbiB2YWx1ZXMgZHluYW1pYyB0eXBlIGlzIGRlcml2ZWQgZnJvbSBpdHMgc3RhdGljIHNpZ25hdHVyZS59CgpBIGZ1bmN0aW9uIHR5cGUgJChUXzEsIFxsZG90cyBUX3trfSwgW1Rfe2srMX0gIFxsZG90cywgVF97bittfV0pIFxyaWdodGFycm93IFQkIGlzIGEgbW9yZSBzcGVjaWZpYyB0aGFuIHRoZQpmdW5jdGlvbiB0eXBlICQoU18xLCBcbGRvdHMsIFNfe2sran0sIFtTX3trK2orMX0gXGxkb3RzLCBTX3tufV0pIFxyaWdodGFycm93IFMkLCBpZiBhbGwgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6ClxiZWdpbntlbnVtZXJhdGV9ClxpdGVtIEVpdGhlcgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gJFMkIGlzIFxWT0lEe30sIE9yClxpdGVtICAkVCA8PCBTJC4KXGVuZHtpdGVtaXplfQpcaXRlbSAkXGZvcmFsbCBpIFxpbiAxIC4uIG4sIFRfaSA8PCBTX2kkLgpcZW5ke2VudW1lcmF0ZX0KCgpBIGZ1bmN0aW9uIHR5cGUgJChUXzEsIFxsZG90cyBUX24sIFx7VF97eF8xfSQgJHhfMSwgXGxkb3RzLCBUX3t4X2t9JCAkeF9rXH0pIFxyaWdodGFycm93IFQkIGlzIG1vcmUgc3BlY2lmaWMgdGhhbiB0aGUgZnVuY3Rpb24gdHlwZSAkKFNfMSwgXGxkb3RzLCBTX24sIFx7U197eV8xfSQgJHlfMSwgXGxkb3RzLCBTX3t5X219JCAkeV9tXH0pIFxyaWdodGFycm93IFMkLCBpZiBhbGwgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6ClxiZWdpbntlbnVtZXJhdGV9ClxpdGVtIEVpdGhlcgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gJFMkIGlzIFxWT0lEe30sIE9yClxpdGVtICAkVCAgPDwgUyQuClxlbmR7aXRlbWl6ZX0KXGl0ZW0gJFxmb3JhbGwgaSBcaW4gMSAuLiBuLCBUX2kgPDwgU19pJC4KXGl0ZW0gJGsgXGdlIG0kIGFuZCAkeV9pIFxpbiBce3hfMSwgIFxsZG90cywgeF9rXH0sIGkgXGluIDEgLi4gbSQuCiVce3hfMSwgIFxsZG90cywgeF9rXH0kIGlzIGEgc3VwZXJzZXQgb2YgJFx7eV8xLCAgXGxkb3RzLCB5X21cfSQuClxpdGVtIEZvciBhbGwgJHlfaSBcaW4gXHt5XzEsICBcbGRvdHMsIHlfbVx9LCB5X2kgPSB4X2ogXFJpZ2h0YXJyb3cgVF9qIDw8IFNfaSQKXGVuZHtlbnVtZXJhdGV9CgpGdXJ0aGVybW9yZSwgaWYgJEYkIGlzIGEgZnVuY3Rpb24gdHlwZSwgJEYgPDwgXGNvZGV7RnVuY3Rpb259JC4KCgpcc3Vic2VjdGlvbntUeXBlIFxEWU5BTUlDe319ClxsYWJlbHt0eXBlRHluYW1pY30KClRoZSB0eXBlICBcRFlOQU1JQ3t9ICBkZW5vdGVzIHRoZSB1bmtub3duIHR5cGUuIAoKSWYgbm8gc3RhdGljIHR5cGUgYW5ub3RhdGlvbiBoYXMgYmVlbiBwcm92aWRlZCB0aGUgdHlwZSBzeXN0ZW0gYXNzdW1lcyB0aGUgZGVjbGFyYXRpb24gaGFzIHRoZSB1bmtub3duIHR5cGUuIElmIGEgZ2VuZXJpYyB0eXBlIGlzIHVzZWQgYnV0IHR5cGUgYXJndW1lbnRzIGFyZSBub3QgcHJvdmlkZWQsIHRoZW4gdGhlICB0eXBlIGFyZ3VtZW50cyBkZWZhdWx0IHRvIHRoZSB1bmtub3duIHR5cGUuCgpcY29tbWVudGFyeXtUaGlzIG1lYW5zIHRoYXQgZ2l2ZW4gYSBnZW5lcmljIGRlY2xhcmF0aW9uICRHPFRfMSwgXGxkb3RzLCBUX24+JCwgdGhlIHR5cGUgJEckIGlzIGVxdWl2YWxlbnQgdG8gJEc8IFxEWU5BTUlDe30sICBcbGRvdHMsICBcRFlOQU1JQ3t9PiQuCn0KClR5cGUgIFxEWU5BTUlDe30gaGFzIG1ldGhvZHMgZm9yIGV2ZXJ5IHBvc3NpYmxlIGlkZW50aWZpZXIgYW5kIGFyaXR5LCB3aXRoIGV2ZXJ5IHBvc3NpYmxlIGNvbWJpbmF0aW9uIG9mIG5hbWVkIHBhcmFtZXRlcnMuIFRoZXNlIG1ldGhvZHMgYWxsIGhhdmUgIFxEWU5BTUlDe30gYXMgdGhlaXIgcmV0dXJuIHR5cGUsIGFuZCB0aGVpciBmb3JtYWwgcGFyYW1ldGVycyBhbGwgaGF2ZSB0eXBlICBcRFlOQU1JQ3t9LgpUeXBlICBcRFlOQU1JQ3t9IGhhcyBwcm9wZXJ0aWVzIGZvciBldmVyeSBwb3NzaWJsZSBpZGVudGlmaWVyLiBUaGVzZSBwcm9wZXJ0aWVzIGFsbCBoYXZlIHR5cGUgIFxEWU5BTUlDe30uCgpccmF0aW9uYWxle0Zyb20gYSB1c2FiaWxpdHkgcGVyc3BlY3RpdmUsIHdlIHdhbnQgdG8gZW5zdXJlIHRoYXQgdGhlIGNoZWNrZXIgZG9lcyBub3QgaXNzdWUgZXJyb3JzIGV2ZXJ5d2hlcmUgYW4gdW5rbm93biB0eXBlIGlzIHVzZWQuIFRoZSBkZWZpbml0aW9ucyBhYm92ZSBlbnN1cmUgdGhhdCBubyBzZWNvbmRhcnkgZXJyb3JzIGFyZSByZXBvcnRlZCB3aGVuIGFjY2Vzc2luZyBhbiB1bmtub3duIHR5cGUuIAoKVGhlIGN1cnJlbnQgcnVsZXMgc2F5IHRoYXQgbWlzc2luZyB0eXBlIGFyZ3VtZW50cyBhcmUgdHJlYXRlZCBhcyBpZiB0aGV5IHdlcmUgdGhlIHR5cGUgIFxEWU5BTUlDe30uICBBbiBhbHRlcm5hdGl2ZSBpcyB0byBjb25zaWRlciB0aGVtIGFzIG1lYW5pbmcgXGNvZGV7T2JqZWN0fS4gIFRoaXMgd291bGQgbGVhZCB0byBlYXJsaWVyIGVycm9yIGRldGVjdGlvbiBpbiBjaGVja2VkIG1vZGUsIGFuZCBtb3JlIGFnZ3Jlc3NpdmUgZXJyb3JzIGR1cmluZyBzdGF0aWMgdHlwZWNoZWNraW5nLiBGb3IgZXhhbXBsZToKCigxKSAgXGNvZGV7dHlwZWRBUEkoR1xsdHtTdHJpbmd9XGd0IGcpXHsuLi5cfX0gCgoKKDIpICBcY29kZXt0eXBlZEFQSShuZXcgRygpKTsgfQoKClVuZGVyIHRoZSBhbHRlcm5hdGl2ZSBydWxlcywgKDIpIHdvdWxkIGNhdXNlIGEgcnVudGltZSBlcnJvciBpbiBjaGVja2VkIG1vZGUuIFRoaXMgc2VlbXMgZGVzaXJhYmxlIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIGVycm9yIGxvY2FsaXphdGlvbi4gSG93ZXZlciwgd2hlbiBhIGR5bmFtaWMgZXJyb3IgaXMgdGhyb3duIGF0ICgyKSwgdGhlIG9ubHkgd2F5IHRvIGtlZXAgcnVubmluZyBpcyByZXdyaXRpbmcgKDIpIGludG8KCigzKSBcY29kZXt0eXBlZEFQSShuZXcgR1xsdHtTdHJpbmd9XGd0KCkpO30KClRoaXMgZm9yY2VzIHVzZXJzIHRvIHdyaXRlIHR5cGUgaW5mb3JtYXRpb24gaW4gdGhlaXIgY2xpZW50IGNvZGUganVzdCBiZWNhdXNlIHRoZXkgYXJlIGNhbGxpbmcgYSB0eXBlZCBBUEkuICBXZSBkbyBub3Qgd2FudCB0byBpbXBvc2UgdGhpcyBvbiBEYXJ0IHByb2dyYW1tZXJzLCBzb21lIG9mIHdoaWNoIG1heSBiZSBibGlzc2Z1bGx5IHVuYXdhcmUgb2YgdHlwZXMgaW4gZ2VuZXJhbCwgYW5kIGdlbmVyaWNpdHkgaW4gcGFydGljdWxhci4KCldoYXQgb2Ygc3RhdGljIGNoZWNraW5nPyBTdXJlbHkgd2Ugd291bGQgd2FudCB0byBmbGFnICgyKSB3aGVuIHVzZXJzIGhhdmUgZXhwbGljaXRseSBhc2tlZCBmb3Igc3RhdGljIHR5cGVjaGVja2luZz8gWWVzLCBidXQgdGhlIHJlYWxpdHkgaXMgdGhhdCB0aGUgRGFydCBzdGF0aWMgY2hlY2tlciBpcyBsaWtlbHkgdG8gYmUgcnVubmluZyBpbiB0aGUgYmFja2dyb3VuZCBieSBkZWZhdWx0LiBFbmdpbmVlcmluZyB0ZWFtcyB0eXBpY2FsbHkgZGVzaXJlIGEgYGBjbGVhbiBidWlsZCcnIGZyZWUgb2Ygd2FybmluZ3MgYW5kIHNvIHRoZSBjaGVja2VyIGlzIGRlc2lnbmVkIHRvIGJlIGV4dHJlbWVseSBjaGFyaXRhYmxlLiBPdGhlciB0b29scyBjYW4gaW50ZXJwcmV0IHRoZSB0eXBlIGluZm9ybWF0aW9uIG1vcmUgYWdncmVzc2l2ZWx5IGFuZCB3YXJuIGFib3V0IHZpb2xhdGlvbnMgb2YgY29udmVudGlvbmFsIChhbmQgc291bmQpIHN0YXRpYyB0eXBlIGRpc2NpcGxpbmUuCn0KClRoZSBuYW1lIFxEWU5BTUlDe30gZGVub3RlcyBhIFxjZHtUeXBlfSBvYmplY3QgZXZlbiB0aG91Z2ggXERZTkFNSUN7fSBpcyBub3QgYSBjbGFzcy4KCiVccmF0aW9uYWxlIHsKJVR5cGUgb2JqZWN0cyByZWlmeSB0aGUgcnVudGltZSB0eXBlcyBvZiBpbnN0YW5jZXMuIE5vIGluc3RhbmNlIGV2ZXIgaGFzIHR5cGUgXERZTkFNSUN7fS4gCiV9Cgpcc3Vic2VjdGlvbntUeXBlIFZvaWR9ClxsYWJlbHt0eXBlVm9pZH0KClRoZSBzcGVjaWFsIHR5cGUgXFZPSUR7fSBtYXkgb25seSBiZSB1c2VkIGFzIHRoZSByZXR1cm4gdHlwZSBvZiBhIGZ1bmN0aW9uOiBpdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciB0byB1c2UgXFZPSUR7fSBpbiBhbnkgb3RoZXIgY29udGV4dC4gCgpcY29tbWVudGFyeXsKRm9yIGV4YW1wbGUsIGFzIGEgdHlwZSBhcmd1bWVudCwgb3IgYXMgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBvciBwYXJhbWV0ZXIKClZvaWQgaXMgbm90IGFuIGludGVyZmFjZSB0eXBlLiAKClRoZSBvbmx5IHN1YnR5cGUgcmVsYXRpb25zIHRoYXQgcGVydGFpbiB0byB2b2lkIGFyZSB0aGVyZWZvcmU6ClxiZWdpbntpdGVtaXplfQpcaXRlbQokXFZPSUR7fSA8OiBcVk9JRHt9JCAoYnkgcmVmbGV4aXZpdHkpClxpdGVtCiRcYm90IDw6IFxWT0lEe30kIChhcyBib3R0b20gaXMgYSBzdWJ0eXBlIG9mIGFsbCB0eXBlcykuClxpdGVtCiRcVk9JRHt9IDw6ICAgXERZTkFNSUN7fSQgKGFzICBcRFlOQU1JQ3t9IGlzIGEgc3VwZXJ0eXBlIG9mIGFsbCB0eXBlcykKXGVuZHtpdGVtaXplfQoKVGhlIGFuYWxvZ291cyBydWxlcyBhbHNvIGhvbGQgZm9yIHRoZSAkPDwkIHJlbGF0aW9uIGZvciAgc2ltaWxhciByZWFzb25zLgoKSGVuY2UsIHRoZSBzdGF0aWMgY2hlY2tlciB3aWxsIGlzc3VlIHdhcm5pbmdzIGlmIG9uZSBhdHRlbXB0cyB0byBhY2Nlc3MgYSBtZW1iZXIgb2YgdGhlIHJlc3VsdCBvZiBhIHZvaWQgbWV0aG9kIGludm9jYXRpb24gKGV2ZW4gZm9yIG1lbWJlcnMgb2YgXE5VTEx7fSwgc3VjaCBhcyBcY29kZXs9PX0pLiAgTGlrZXdpc2UsIHBhc3NpbmcgdGhlIHJlc3VsdCBvZiBhIHZvaWQgbWV0aG9kIGFzIGEgcGFyYW1ldGVyIG9yIGFzc2lnbmluZyBpdCB0byBhIHZhcmlhYmxlIHdpbGwgY2F1c2UgYSB3YXJuaW5nIHVubGVzcyB0aGUgdmFyaWFibGUvZm9ybWFsIHBhcmFtZXRlciBoYXMgdHlwZSBkeW5hbWljLgoKT24gdGhlIG90aGVyIGhhbmQsIGl0IGlzIHBvc3NpYmxlIHRvIHJldHVybiB0aGUgcmVzdWx0IG9mIGEgdm9pZCBtZXRob2QgZnJvbSB3aXRoaW4gYSB2b2lkIG1ldGhvZC4gT25lIGNhbiBhbHNvIHJldHVybiBcTlVMTHt9OyBvciBhIHZhbHVlIG9mIHR5cGUgXERZTkFNSUN7fS4gUmV0dXJuaW5nIGFueSBvdGhlciByZXN1bHQgd2lsbCBjYXVzZSBhIHR5cGUgd2FybmluZy4gSW4gY2hlY2tlZCBtb2RlLCBhIGR5bmFtaWMgdHlwZSBlcnJvciB3b3VsZCBhcmlzZSBpZiBhIG5vbi1udWxsIG9iamVjdCB3YXMgcmV0dXJuZWQgZnJvbSBhIHZvaWQgbWV0aG9kIChzaW5jZSBubyBvYmplY3QgaGFzIHJ1bnRpbWUgdHlwZSAgXERZTkFNSUN7fSkuCn0KClxjb21tZW50YXJ5IHtUaGUgbmFtZSBcVk9JRHt9IGRvZXMgbm90IGRlbm90ZSBhIFxjZHtUeXBlfSBvYmplY3QufQoKXHJhdGlvbmFsZSB7Ckl0IGlzIHN5bnRhY3RpY2x5IGlsbGVnYWwgdG8gdXNlIFxWT0lEe30gYXMgYW4gZXhwcmVzc2lvbiwgYW5kIGl0IHdvdWxkIG1ha2Ugbm8gc2Vuc2UgdG8gZG8gc28uClR5cGUgb2JqZWN0cyByZWlmeSB0aGUgcnVudGltZSB0eXBlcyBvZiBpbnN0YW5jZXMuIE5vIGluc3RhbmNlIGV2ZXIgaGFzIHR5cGUgXFZPSUR7fS4gIAp9CgoKClxzdWJzZWN0aW9ue1BhcmFtZXRlcml6ZWQgVHlwZXN9ClxsYWJlbHtwYXJhbWV0ZXJpemVkVHlwZXN9IAoKQSB7XGVtIHBhcmFtZXRlcml6ZWQgdHlwZX0gaXMgYW4gaW52b2NhdGlvbiBvZiBhIGdlbmVyaWMgdHlwZSBkZWNsYXJhdGlvbi4KCkxldCAkVCQgYmUgYSBwYXJhbWV0ZXJpemVkIHR5cGUgICRHPFNfMSwgIFxsZG90cywgU19uPiQuIElmICRHJCBpcyBub3QgYSBnZW5lcmljIHR5cGUsIHRoZSB0eXBlIGFyZ3VtZW50cyAkU19pJCwgJDEgXGxlIGkgXGxlIG4kIGFyZSBkaXNjYXJkZWQuIElmICRHJCBoYXMgJG0gXG5lIG4kIHR5cGUgcGFyYW1ldGVycywgJFQkIGlzIHRyZWF0ZWQgYXMgYXMgYSBwYXJhbWV0ZXJpemVkIHR5cGUgd2l0aCAkbSQgYXJndW1lbnRzLCBhbGwgb2Ygd2hpY2ggYXJlIFxEWU5BTUlDe30uIAoKXGNvbW1lbnRhcnl7SW4gc2hvcnQsIGFueSBhcml0eSBtaXNtYXRjaCByZXN1bHRzIGluIGFsbCB0eXBlIGFyZ3VtZW50cyBiZWluZyBkcm9wcGVkLCBhbmQgcmVwbGFjZWQgd2l0aCB0aGUgY29ycmVjdCBudW1iZXIgb2YgdHlwZSBhcmd1bWVudHMsIGFsbCBzZXQgdG8gXERZTkFNSUN7fS4gT2YgY291cnNlLCBhIHN0YXRpYyB3YXJuaW5nIHdpbGwgYmUgaXNzdWVkLiAKfQoKT3RoZXJ3aXNlLCBsZXQKICRUX2kkIGJlIHRoZSB0eXBlIHBhcmFtZXRlcnMgb2YgJEckIGFuZCBsZXQgJEJfaSQgYmUgdGhlIGJvdW5kIG9mICRUX2ksICBpIFxpbiAxLi4gbiQsLiAkVCQgaXMge1xlbSBtYWxib3VuZGVkfSBpZmYgZWl0aGVyICRTX2kkIGlzIG1hbGJvdW5kZWQgIG9yICRTX2kkIGlzIG5vdCBhIHN1YnR5cGUgb2YgJFtTXzEsICBcbGRvdHMsIFNfbi9UXzEsIFxsZG90cywgVF9uXUJfaSwgICBpIFxpbiAxLi4gbiQuIAogClxjb21tZW50YXJ5ewpOb3RlLCB0aGF0LCBpbiBjaGVja2VkIG1vZGUsIGl0IGlzIGEgZHluYW1pYyB0eXBlIGVycm9yIGlmIGEgbWFsYm91bmRlZCB0eXBlIGlzIHVzZWQgaW4gYSB0eXBlIHRlc3QgYXMgc3BlY2lmaWVkIGluIFxyZWZ7ZHluYW1pY1R5cGVTeXN0ZW19Lgp9CiAKQW55IHVzZSBvZiBhIG1hbGJvdW5kZWQgdHlwZSBnaXZlcyByaXNlIHRvIGEgc3RhdGljIHdhcm5pbmcuCgpJZiAkUyQgaXMgdGhlIHN0YXRpYyB0eXBlIG9mIGEgbWVtYmVyICRtJCBvZiAkRyQsIHRoZW4gdGhlIHN0YXRpYyB0eXBlIG9mIHRoZSBtZW1iZXIgJG0kIG9mICAkRzxBXzEsIFxsZG90cywgQV9uPiQgIGlzICRbQV8xLCAgXGxkb3RzLCBBX24vVF8xLCAgXGxkb3RzLCBUX25dUyQgd2hlcmUgJFRfMSwgIFxsZG90cywgVF9uJCBhcmUgdGhlIGZvcm1hbCB0eXBlIHBhcmFtZXRlcnMgb2YgJEckLiAgIExldCAkQl9pJCwgYmUgdGhlIGJvdW5kcyBvZiAkVF9pLCAxIFxsZSBpIFxsZSBuJC4gSXQgaXMgYSBzdGF0aWMgdHlwZSB3YXJuaW5nIGlmICRBX2kkIGlzIG5vdCBhIHN1YnR5cGUgb2YgICRbQV8xLCAgXGxkb3RzLCBBX24vVF8xLCAgXGxkb3RzLCBUX25dQl9pLCBpIFxpbiAxLi5uJC4gSXQgaXMgYSBzdGF0aWMgdHlwZSB3YXJuaW5nIGlmICRHJCBpcyBub3QgYSBnZW5lcmljIHR5cGUgd2l0aCBleGFjdGx5ICRuJCB0eXBlIHBhcmFtZXRlcnMuCgoKCgoKXHN1YnN1YnNlY3Rpb257QWN0dWFsIFR5cGUgb2YgRGVjbGFyYXRpb259ClxsYWJlbHthY3R1YWxUeXBlT2ZBRGVjbGFyYXRpb259CgpBIHR5cGUgJFQkIHtcZW0gZGVwZW5kcyBvbiBhIHR5cGUgcGFyYW1ldGVyfSAkVSQgaWZmOgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gJFQkIGlzICRVJC4KXGl0ZW0gJFQkIGlzIGEgcGFyYW1ldGVyaXplZCB0eXBlLCBhbmQgb25lIG9mIHRoZSB0eXBlIGFyZ3VtZW50cyBvZiAkVCQgZGVwZW5kcyBvbiAkVSQuClxlbmR7aXRlbWl6ZX0KCkxldCAkVCQgYmUgdGhlIGRlY2xhcmVkIHR5cGUgb2YgYSBkZWNsYXJhdGlvbiAkZCQsIGFzIGl0IGFwcGVhcnMgaW4gdGhlIHByb2dyYW0gc291cmNlLiBUaGUge1xlbSBhY3R1YWwgdHlwZX0gb2YgJGQkIGlzCgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gICRbQV8xLCBcbGRvdHMsIEFfbi9VXzEsIFxsZG90cywgVV9uXVQkIGlmICRkJCBkZXBlbmRzIG9uIHR5cGUgcGFyYW1ldGVycyAkVV8xLCBcbGRvdHMsIFVfbiQsIGFuZCAkQV9pJCBpcyB0aGUgdmFsdWUgb2YgJFVfaSwgMSBcbGUgaSBcbGUgbiQuClxpdGVtICRUJCBvdGhlcndpc2UuClxlbmR7aXRlbWl6ZX0KClxzdWJzdWJzZWN0aW9ue0xlYXN0IFVwcGVyIEJvdW5kc30KXGxhYmVse2xlYXN0VXBwZXJCb3VuZHN9CgolIGRvZXMgdGhpcyBkaXZlcmdlIGluIHNvbWUgY2FzZXM/CkdpdmVuIHR3byBpbnRlcmZhY2VzICRJJCBhbmQgJEokLCBsZXQgJFNfSSQgYmUgdGhlIHNldCBvZiBzdXBlcmludGVyZmFjZXMgb2YgJEkkLCAgbGV0ICRTX0okIGJlIHRoZSBzZXQgb2Ygc3VwZXJpbnRlcmZhY2VzIG9mICRKJCBhbmQgbGV0ICRTID0gIChJIFxjdXAgU19JKSBcY2FwIChKIFxjdXAgU19KKSQuICBGdXJ0aGVybW9yZSwgd2UgZGVmaW5lICRTX24gPSBce1QgfCBUIFxpbiBTICBcd2VkZ2UgZGVwdGgoVCkgPW5cfSQgZm9yIGFueSBmaW5pdGUgJG4kICUsIGFuZCAkaz1tYXgoZGVwdGgoVF8xKSwgXGxkb3RzLCBkZXB0aChUX20pKSwgVF9pIFxpbiBTLCBpIFxpbiAxLi5tJCwgCndoZXJlICRkZXB0aChUKSQgaXMgdGhlIG51bWJlciBvZiBzdGVwcyBpbiB0aGUgbG9uZ2VzdCBpbmhlcml0YW5jZSBwYXRoIGZyb20gJFQkIHRvIFxjb2Rle09iamVjdH0uIExldCAkcSQgYmUgdGhlIGxhcmdlc3QgbnVtYmVyIHN1Y2ggdGhhdCAkU19xJCBoYXMgY2FyZGluYWxpdHkgb25lLiBUaGUgbGVhc3QgdXBwZXIgYm91bmQgb2YgJEkkIGFuZCAkSiQgaXMgdGhlIHNvbGUgZWxlbWVudCBvZiAgJFNfcSQuCgpUaGUgbGVhc3QgdXBwZXIgYm91bmQgb2YgXERZTkFNSUN7fSBhbmQgYW55IHR5cGUgJFQkIGlzIFxEWU5BTUlDe30uClRoZSBsZWFzdCB1cHBlciBib3VuZCBvZiBcVk9JRHt9IGFuZCBhbnkgdHlwZSAkVCBcbmUgXERZTkFNSUN7fSQgaXMgXFZPSUR7fS4KTGV0ICRVJCBiZSBhIHR5cGUgdmFyaWFibGUgd2l0aCB1cHBlciBib3VuZCAkQiQuIFRoZSBsZWFzdCB1cHBlciBib3VuZCBvZiAkVSQgYW5kIGEgdHlwZSAkVCQgaXMgdGhlIGxlYXN0IHVwcGVyIGJvdW5kIG9mICRCJCBhbmQgJFQkLiAKClRoZSBsZWFzdCB1cHBlciBib3VuZCByZWxhdGlvbiBpcyBzeW1tZXRyaWMgYW5kIHJlZmxleGl2ZS4KCiUgRnVuY3Rpb24gdHlwZXMKClRoZSBsZWFzdCB1cHBlciBib3VuZCBvZiBhIGZ1bmN0aW9uIHR5cGUgYW5kIGFuIGludGVyZmFjZSB0eXBlICRUJCBpcyB0aGUgbGVhc3QgdXBwZXIgYm91bmQgb2YgXGNke0Z1bmN0aW9ufSBhbmQgJFQkLgpMZXQgJEYkIGFuZCAkRyQgYmUgZnVuY3Rpb24gdHlwZXMuIElmICRGJCBhbmQgJEckIGRpZmZlciBpbiB0aGVpciBudW1iZXIgb2YgcmVxdWlyZWQgcGFyYW1ldGVycywgdGhlbiB0aGUgbGVhc3QgdXBwZXIgYm91bmQgb2YgJEYkIGFuZCAkRyQgaXMgXGNke0Z1bmN0aW9ufS4gIE90aGVyd2lzZToKXGJlZ2lue2l0ZW1pemV9ClxpdGVtIElmIAoKJEY9IChUXzEgXGxkb3RzIFRfciwgW1Rfe3IrMX0sIFxsZG90cywgVF9uXSkgXGxvbmdyaWdodGFycm93IFRfMCQsIAoKJEc9IChTXzEgXGxkb3RzIFNfciwgW1Nfe3IrMX0sIFxsZG90cywgU19rXSkgXGxvbmdyaWdodGFycm93IFNfMCQgCgp3aGVyZSAkayBcbGUgbiQgdGhlbiB0aGUgbGVhc3QgdXBwZXIgYm91bmQgb2YgJEYkIGFuZCAkRyQgaXMgCgokKExfMSBcbGRvdHMgTF9yLCBbTF97cisxfSwgXGxkb3RzLCBMX2tdKSBcbG9uZ3JpZ2h0YXJyb3cgTF8wJCAKCndoZXJlICRMX2kkIGlzIHRoZSBsZWFzdCB1cHBlciBib3VuZCBvZiAkVF9pJCBhbmQgJFNfaSwgaSBcaW4gMC4uayQuClxpdGVtIElmIAoKJEY9IChUXzEgXGxkb3RzIFRfciwgW1Rfe3IrMX0sIFxsZG90cywgVF9uXSkgXGxvbmdyaWdodGFycm93IFRfMCQsCgokRz0gKFNfMSBcbGRvdHMgU19yLCBceyBcbGRvdHMgXH0pIFxsb25ncmlnaHRhcnJvdyBTXzAkIAoKdGhlbiB0aGUgbGVhc3QgdXBwZXIgYm91bmQgb2YgJEYkIGFuZCAkRyQgaXMgCgokKExfMSBcbGRvdHMgTF9yKSBcbG9uZ3JpZ2h0YXJyb3cgTF8wJCAKCndoZXJlICRMX2kkIAppcyB0aGUgbGVhc3QgdXBwZXIgYm91bmQgb2YgJFRfaSQgYW5kICRTX2ksIGkgXGluIDAuLnIkLgpcaXRlbSBJZiAKCiRGPSAoVF8xIFxsZG90cyBUX3IsIFx7VF97cisxfSQgICRwX3tyKzF9LCBcbGRvdHMsIFRfZiQgJHBfZlx9KSBcbG9uZ3JpZ2h0YXJyb3cgVF8wJCwgIAoKJEc9IChTXzEgXGxkb3RzIFNfciwgXHsgU197cisxfSQgICRxX3tyKzF9LCBcbGRvdHMsIFNfZyQgJHFfZ1x9KSBcbG9uZ3JpZ2h0YXJyb3cgU18wJCAKCnRoZW4gbGV0ICRce3hfbSwgXGxkb3RzIHhfblx9ICA9IFx7cF97cisxfSwgXGxkb3RzLCBwX2ZcfSBcY2FwIFx7cV97cisxfSwgXGxkb3RzLCBxX2dcfSQgYW5kIGxldCAkWF9qJCBiZSB0aGUgbGVhc3QgdXBwZXIgYm91bmQgb2YgdGhlIHR5cGVzIG9mICR4X2okIGluICRGJCBhbmQgJEcsIGogXGluIG0uLm4kLiBUaGVuCnRoZSBsZWFzdCB1cHBlciBib3VuZCBvZiAkRiQgYW5kICRHJCBpcwoKJChMXzEgXGxkb3RzIExfciwgXHsgWF9tJCAkeF9tLCBcbGRvdHMsIFhfbiQgJHhfblx9KSBcbG9uZ3JpZ2h0YXJyb3cgTF8wJCAKCndoZXJlICRMX2kkIGlzIHRoZSBsZWFzdCB1cHBlciBib3VuZCBvZiAkVF9pJCBhbmQgJFNfaSwgaSBcaW4gMC4uciQgClxlbmR7aXRlbWl6ZX0KCgpcc2VjdGlvbntSZWZlcmVuY2V9ClxsYWJlbHtyZWZlcmVuY2V9Cgpcc3Vic2VjdGlvbntMZXhpY2FsIFJ1bGVzfQpcbGFiZWx7bGV4aWNhbFJ1bGVzfQoKRGFydCBzb3VyY2UgdGV4dCBpcyByZXByZXNlbnRlZCBhcyBhIHNlcXVlbmNlIG9mIFVuaWNvZGUgY29kZSBwb2ludHMuICBUaGlzIHNlcXVlbmNlIGlzIGZpcnN0IGNvbnZlcnRlZCBpbnRvIGEgc2VxdWVuY2Ugb2YgdG9rZW5zIGFjY29yZGluZyB0byB0aGUgbGV4aWNhbCBydWxlcyBnaXZlbiBpbiB0aGlzIHNwZWNpZmljYXRpb24uICBBdCBhbnkgcG9pbnQgaW4gdGhlIHRva2VuaXphdGlvbiBwcm9jZXNzLCB0aGUgbG9uZ2VzdCBwb3NzaWJsZSB0b2tlbiBpcyByZWNvZ25pemVkLgoKXHN1YnN1YnNlY3Rpb257UmVzZXJ2ZWQgV29yZHN9IApcbGFiZWx7cmVzZXJ2ZWRXb3Jkc30KCkEge1xlbSByZXNlcnZlZCB3b3JkfSBtYXkgbm90IGJlIHVzZWQgYXMgYW4gaWRlbnRpZmllcjsgaXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgYSByZXNlcnZlZCB3b3JkIGlzIHVzZWQgd2hlcmUgYW4gaWRlbnRpZmllciBpcyBleHBlY3RlZC4KClxBU1NFUlR7fSwgXEJSRUFLe30sIFxDQVNFe30sIFxDQVRDSHt9LCBcQ0xBU1N7fSwgXENPTlNUe30sIFxDT05USU5VRXt9LCBcREVGQVVMVHt9LCBcRE97fSwgXEVMU0V7fSwgXEVOVU17fSwgXEVYVEVORFN7fSwgXEZBTFNFe30sIFxGSU5BTHt9LCBcRklOQUxMWXt9LCBcRk9Se30sIFxJRnt9LCBcSU57fSwgXElTe30sIFxORVd7fSwgXE5VTEx7fSwgXFJFVEhST1csIFxSRVRVUk57fSwgXFNVUEVSe30sIFxTV0lUQ0h7fSwgXFRISVN7fSwgXFRIUk9Xe30sIFxUUlVFe30sIFxUUll7fSwgXFZBUnt9LCBcVk9JRHt9LCBcV0hJTEV7fSwgXFdJVEh7fS4KCgoKJVxRe1VuaWNvZGUgY2hhcmFjdGVycy59CgpcYmVnaW57Z3JhbW1hcn0KIHtcYmYgTEVUVEVSOn1gYScge1xlc2NhcGVncmFtbWFyIC4ufSBgeic7CiAgICAgYEEnIHtcZXNjYXBlZ3JhbW1hciAuLn1gWicKICAgIC4KCntcYmYgRElHSVQ6fQogICAgICBgMCcge1xlc2NhcGVncmFtbWFyIC4ufSBgOScKICAgIC4KCntcYmYgV0hJVEVTUEFDRTp9CiAgICAgIChgJFxiYWNrc2xhc2gkdCcgJHwkIGAgJyAkfCQgTkVXTElORSkrCiAgICAuClxlbmR7Z3JhbW1hcn0KClxzdWJzdWJzZWN0aW9ue0NvbW1lbnRzfQpcbGFiZWx7Y29tbWVudHN9Cgp7XGVtIENvbW1lbnRzfSBhcmUgc2VjdGlvbnMgb2YgcHJvZ3JhbSB0ZXh0IHRoYXQgYXJlIHVzZWQgZm9yIGRvY3VtZW50YXRpb24uCgpcYmVnaW57Z3JhbW1hcn17XGJmIFNJTkdMRVxfTElORVxfQ09NTUVOVDp9CiAgICAgIGAvLycgXH57fShORVdMSU5FKSogKE5FV0xJTkUpPwogICAgLgoKe1xiZiBNVUxUSVxfTElORVxfQ09NTUVOVDp9CiAgICAgIGAvKicgKE1VTFRJXF9MSU5FXF9DT01NRU5UICR8JCBcfnt9IGAqLycpKiBgKi8nCiAgICAuCiBcZW5ke2dyYW1tYXJ9CiAgCkRhcnQgc3VwcG9ydHMgYm90aCBzaW5nbGUtbGluZSBhbmQgbXVsdGktbGluZSBjb21tZW50cy4gQSB7XGVtIHNpbmdsZSBsaW5lIGNvbW1lbnR9IGJlZ2lucyB3aXRoIHRoZSB0b2tlbiBcY29kZXsvL30uIEV2ZXJ5dGhpbmcgYmV0d2VlbiBcY29kZXsvL30gYW5kIHRoZSBlbmQgb2YgbGluZSBtdXN0IGJlIGlnbm9yZWQgYnkgdGhlIERhcnQgY29tcGlsZXIgdW5sZXNzIHRoZSBjb21tZW50IGlzIGEgZG9jdW1lbnRhdGlvbiBjb21tZW50LiAuIAoKQSB7XGVtIG11bHRpLWxpbmUgY29tbWVudH0gYmVnaW5zIHdpdGggdGhlIHRva2VuIFxjb2Rley8qfSBhbmQgZW5kcyB3aXRoIHRoZSB0b2tlbiBcY29kZXsqL30uICBFdmVyeXRoaW5nIGJldHdlZW4gXGNvZGV7L30qIGFuZCBcY29kZXsqfS8gbXVzdCBiZSBpZ25vcmVkIGJ5IHRoZSBEYXJ0IGNvbXBpbGVyIHVubGVzcyB0aGUgY29tbWVudCBpcyBhIGRvY3VtZW50YXRpb24gY29tbWVudC4gQ29tbWVudHMgbWF5IG5lc3QuIAoKe1xlbSBEb2N1bWVudGF0aW9uIGNvbW1lbnRzfSBhcmUgY29tbWVudHMgdGhhdCBiZWdpbiB3aXRoIHRoZSB0b2tlbnMgIFxjb2Rley8vL30gb3IgIFxjb2Rley8qKn0uIERvY3VtZW50YXRpb24gY29tbWVudHMgYXJlIGludGVuZGVkIHRvIGJlIHByb2Nlc3NlZCBieSBhIHRvb2wgdGhhdCBwcm9kdWNlcyBodW1hbiByZWFkYWJsZSBkb2N1bWVudGF0aW9uLiAKClRoZSBzY29wZSBvZiBhIGRvY3VtZW50YXRpb24gY29tbWVudCAgYWx3YXlzIGV4Y2x1ZGVzIHRoZSBpbXBvcnRlZCBuYW1lc3BhY2Ugb2YgdGhlIGVuY2xvc2luZyBsaWJyYXJ5LiBPbmx5IG5hbWVzIGRlY2xhcmVkIGluIHRoZSBlbmNsb3NpbmcgbGlicmFyeSBhcmUgY29uc2lkZXJlZCBpbiBzY29wZSB3aXRoaW4gYSBkb2N1bWVudGF0aW9uIGNvbW1lbnQuCgpUaGUgc2NvcGUgb2YgYSBkb2N1bWVudGF0aW9uIGNvbW1lbnQgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIHRoZSBkZWNsYXJhdGlvbiBvZiBhIGNsYXNzICRDJCBpcyB0aGUgaW5zdGFuY2Ugc2NvcGUgb2YgJEMkLCBleGNsdWRpbmcgYW55IG5hbWVzIGludHJvZHVjZWQgdmlhIHRoZSBpbXBvcnQgbmFtZXNwYWNlIG9mIHRoZSBlbmNsb3NpbmcgbGlicmFyeS4KClRoZSBzY29wZSBvZiBhIGRvY3VtZW50YXRpb24gY29tbWVudCBpbW1lZGlhdGVseSBwcmVjZWRpbmcgdGhlIGRlY2xhcmF0aW9uIG9mIGEgZnVuY3Rpb24gJGYkICBpcyB0aGUgIHNjb3BlIGluIGZvcmNlIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiB0aGUgYm9keSBvZiAkZiQsICBleGNsdWRpbmcgYW55IG5hbWVzIGludHJvZHVjZWQgdmlhIHRoZSBpbXBvcnQgbmFtZXNwYWNlIG9mIHRoZSBlbmNsb3NpbmcgbGlicmFyeS4KCgoKCgolXHN1YnNlY3Rpb257R3JhbW1hcn0KXHN1YnNlY3Rpb257T3BlcmF0b3IgUHJlY2VkZW5jZX0KXGxhYmVse29wZXJhdG9yUHJlY2VkZW5jZX0KCk9wZXJhdG9yIHByZWNlZGVuY2UgaXMgZ2l2ZW4gaW1wbGljaXRseSBieSB0aGUgZ3JhbW1hci4KClxjb21tZW50YXJ5e1RoZSBmb2xsb3dpbmcgbm9uLW5vcm1hdGl2ZSB0YWJsZSBtYXkgYmUgaGVscGZ1bApcbmV3bGluZQoKXGJlZ2lue3RhYnVsYXJ9e3wgciB8IHIgfCByIHwgciB8fQpcaGxpbmUKRGVzY3JpcHRpb24gJiAgT3BlcmF0b3IgJiBBc3NvY2lhdGl2aXR5ICYgUHJlY2VkZW5jZSBcXCAKXGhsaW5lClVuYXJ5IHBvc3RmaXggJiAgLiwgZSsrLCBlLS0sIGUxW2UyXSwgZTEoKSAsICgpICYgTm9uZSAmIDE1IFxcClxobGluZQpVbmFyeSBwcmVmaXggJiAtZSwgIWUsIFx+e31lLCArK2UsIC0tZSAmIE5vbmUgJiAxNFxcClxobGluZQpNdWx0aXBsaWNhdGl2ZSAmICosIC8sIFx+LywgIFwlICAmIExlZnQgJiAxM1xcClxobGluZQpBZGRpdGl2ZSAmICssIC0gJiBMZWZ0ICYgMTJcXApcaGxpbmUgClNoaWZ0ICYgICQ8PCQsICQ+PiQmICBMZWZ0ICYgMTFcXApcaGxpbmUKQml0d2lzZSBBTkQgJiBcJiAmIExlZnQgJiAxMFxcClxobGluZQpCaXR3aXNlIFhPUiAmIFxee30gJiBMZWZ0ICYgOVxcClxobGluZQpCaXR3aXNlIE9yICYgICR8JCAmIExlZnQgJiA4XFwKXGhsaW5lClJlbGF0aW9uYWwgJiAkPCQsICQ+JCwgJDw9JCwgJD49JCwgXEFTe30sIFxJU3t9LCBcSVN7fSEgJiAgTm9uZSAmIDdcXApcaGxpbmUKRXF1YWxpdHkgJiAgPT0sICE9ICYgTm9uZSAmIDZcXApcaGxpbmUKTG9naWNhbCBBTkQgJiBcJlwmICYgTGVmdCAmIDVcXApcaGxpbmUKTG9naWNhbCBPciAmICAkfHwkICYgTGVmdCAmIDRcXApcaGxpbmUKQ29uZGl0aW9uYWwgJiAgZTE/IGUyOiBlMyAmIE5vbmUgJiAzXFwKXGhsaW5lCkNhc2NhZGUgJiAuLiAgJiBMZWZ0ICYgMlxcClxobGluZQpBc3NpZ25tZW50ICYgID0sICo9LCAvPSwgKz0sIC09ICxcJj0sIFxee309IGV0Yy4gICYgIFJpZ2h0ICYgIDFcXApcaGxpbmUKXGVuZHt0YWJ1bGFyfQp9CiVcc3Vic2VjdGlvbntHbG9zc2FyeX0KCiVcYmlibGlvZ3JhcGh5c3R5bGV7YWxwaGF9CiVcYmlibGlvZ3JhcGh5ey91c2Vycy9naWxhZC9yZXNlYXJjaC9iaWJzL21hc3Rlcn0KXHNlY3Rpb24qe0FwcGVuZGl4OiBOYW1pbmcgQ29udmVudGlvbnN9CgpcY29tbWVudGFyeXsKVGhlIGZvbGxvd2luZyBuYW1pbmcgY29udmVudGlvbnMgYXJlIGN1c3RvbWFyeSBpbiBEYXJ0IHByb2dyYW1zLiAKXGJlZ2lue2l0ZW1pemV9ClxpdGVtIFRoZSBuYW1lcyBvZiBjb21waWxlIHRpbWUgY29uc3RhbnQgdmFyaWFibGVzIG5ldmVyIHVzZSBsb3dlciBjYXNlIGxldHRlcnMuIElmIHRoZXkgY29uc2lzdCBvZiBtdWx0aXBsZSB3b3JkcywgdGhvc2Ugd29yZHMgYXJlIHNlcGFyYXRlZCBieSB1bmRlcnNjb3Jlcy4gRXhhbXBsZXM6IFBJLCAgSVxfQU1cX0FcX0NPTlNUQU5ULgpcaXRlbSBUaGUgbmFtZXMgb2YgZnVuY3Rpb25zIChpbmNsdWRpbmcgZ2V0dGVycywgc2V0dGVycywgbWV0aG9kcyBhbmQgbG9jYWwgb3IgbGlicmFyeSBmdW5jdGlvbnMpIGFuZCBub24tY29uc3RhbnQgdmFyaWFibGVzIGJlZ2luIHdpdGggYSBsb3dlcmNhc2UgbGV0dGVyLiBJZiB0aGUgbmFtZSBjb25zaXN0cyBvZiBtdWx0aXBsZSB3b3JkcywgZWFjaCAgd29yZCAoZXhjZXB0IHRoZSBmaXJzdCkgYmVnaW5zIHdpdGggYW4gdXBwZXJjYXNlIGxldHRlci4gIE5vIG90aGVyIHVwcGVyY2FzZSBsZXR0ZXJzIGFyZSB1c2VkLiBFeGFtcGxlczogY2FtbENhc2UsIGRhcnQ0VGhlV29ybGQKXGl0ZW0gVGhlIG5hbWVzIG9mIHR5cGVzIChpbmNsdWRpbmcgY2xhc3NlcyBhbmQgdHlwZSBhbGlhc2VzKSBiZWdpbiB3aXRoIGFuIHVwcGVyIGNhc2UgbGV0dGVyLiAgSWYgdGhlIG5hbWUgY29uc2lzdHMgb2YgbXVsdGlwbGUgd29yZHMsIGVhY2ggIHdvcmQgIGJlZ2lucyB3aXRoIGFuIHVwcGVyY2FzZSBsZXR0ZXIuICBObyBvdGhlciB1cHBlcmNhc2UgbGV0dGVycyBhcmUgdXNlZC4gRXhhbXBsZXM6IENhbWxDYXNlLCBEYXJ0NFRoZVdvcmxkLgpcaXRlbSBUaGUgbmFtZXMgb2YgdHlwZSB2YXJpYWJsZXMgYXJlIHNob3J0IChwcmVmZXJhYmx5IHNpbmdsZSBsZXR0ZXIpLiBFeGFtcGxlczogVCwgUywgSywgViAsIEUuClxpdGVtIFRoZSBuYW1lcyBvZiBsaWJyYXJpZXMgb3IgbGlicmFyeSBwcmVmaXhlcyBuZXZlciB1c2UgdXBwZXIgY2FzZSBsZXR0ZXJzLiBJZiB0aGV5IGNvbnNpc3Qgb2YgbXVsdGlwbGUgd29yZHMsIHRob3NlIHdvcmRzIGFyZSBzZXBhcmF0ZWQgYnkgdW5kZXJzY29yZXMuIEV4YW1wbGU6IG15XF9mYXZvcml0ZVxfbGlicmFyeS4KXGVuZHtpdGVtaXplfQp9CgoKXGVuZHtkb2N1bWVudH0K