U1dJRyAoU2ltcGxpZmllZCBXcmFwcGVyIGFuZCBJbnRlcmZhY2UgR2VuZXJhdG9yKQoKU2VlIHRoZSBDSEFOR0VTLmN1cnJlbnQgZmlsZSBmb3IgY2hhbmdlcyBpbiB0aGUgY3VycmVudCB2ZXJzaW9uLgpTZWUgdGhlIFJFTEVBU0VOT1RFUyBmaWxlIGZvciBhIHN1bW1hcnkgb2YgY2hhbmdlcyBpbiBlYWNoIHJlbGVhc2UuCgpWZXJzaW9uIDMuMC44ICgzMSBEZWMgMjAxNSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDE1LTEyLTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBUaGUgcGRmIGRvY3VtZW50YXRpb24gaXMgbm93IGdlbmVyYXRlZCBieSB3a2h0bWx0b3BkZiBhbmQgaGFzIGNvbG91cgogICAgICAgICAgICBmb3IgdGhlIGNvZGUgc25pcHBldHMganVzdCBsaWtlIHRoZSBodG1sIGRvY3VtZW50YXRpb24hCgoyMDE1LTEyLTIzOiBhaG5vbGRzCiAgICAgICAgICAgIFtQeXRob25dIEZpeGVzIGZvciBjb252ZXJzaW9uIG9mIHNpZ25lZCBhbmQgdW5zaWduZWQgaW50ZWdlciB0eXBlczoKCiAgICAgICAgICAgIE5vIGxvbmdlciBjaGVjayBmb3IgUHlJbnQgb2JqZWN0cyBpbiBQeXRob24zLiBCZWNhdXNlIFB5SW50X0NoZWNrCiAgICAgICAgICAgIGFuZCBmcmllbmRzIGFyZSAjZGVmaW5lZCB0byB0aGUgY29ycmVzcG9uZGluZyBQeUxvbmcgbWV0aG9kcywgdGhpcwogICAgICAgICAgICBoYWQgY2F1c2VkIGVycm9ycyBpbiBQeXRob24zIHdoZXJlIHZhbHVlcyBncmVhdGVyIHRoYW4gd2hhdCBjb3VsZCBiZQogICAgICAgICAgICBzdG9yZWQgaW4gYSBsb25nIHdlcmUgaW5jb3JyZWN0bHkgaW50ZXJwcmV0ZWQgYXMgdGhlIHZhbHVlIC0xIHdpdGgKICAgICAgICAgICAgdGhlIFB5dGhvbiBlcnJvciBpbmRpY2F0b3Igc2V0IHRvIE92ZXJmbG93RXJyb3IuIFRoaXMgYXBwbGllcyB0bwogICAgICAgICAgICBib3RoIHRoZSBjb252ZXJzaW9ucyBQeUxvbmctPmxvbmcgYW5kIFB5TG9uZy0+ZG91YmxlLgoKICAgICAgICAgICAgQ29udmVyc2lvbiBmcm9tIFB5TG9uZyB0byBsb25nLCB1bnNpZ25lZCBsb25nLCBsb25nIGxvbmcsIGFuZAogICAgICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgbm93IHJhaXNlIE92ZXJmbG93RXJyb3IgaW5zdGVhZCBvZiBUeXBlRXJyb3IgaW4KICAgICAgICAgICAgYm90aCBQeXRob24yIGFuZCBQeXRob24zIGZvciBQeUxvbmcgdmFsdWVzIG91dHNpZGUgdGhlIHJhbmdlCiAgICAgICAgICAgIGV4cHJlc3NpYmxlIGJ5IHRoZSBjb3JyZXNwb25kaW5nIEMgdHlwZS4gVGhpcyBtYXRjaGVzIHRoZSBleGlzdGluZwogICAgICAgICAgICBiZWhhdmlvciBmb3Igb3RoZXIgaW50ZWdyYWwgdHlwZXMgKHNpZ25lZCBhbmQgdW5zaWduZWQgaW50cywgc2hvcnRzLAogICAgICAgICAgICBhbmQgY2hhcnMpLCBhcyB3ZWxsIGFzIHRoZSBjb252ZXJzaW9uIGZvciBQeUludCB0byBhbGwgbnVtZXJpYwogICAgICAgICAgICB0eXBlcy4gVGhpcyBhbHNvIGluZGlyZWN0bHkgYXBwbGllcyB0byB0aGUgc2l6ZV90IGFuZCBwdHJkaWZmX3QKICAgICAgICAgICAgdHlwZXMsIHdoaWNoIGRlcGVuZCBvbiB0aGUgY29udmVyc2lvbnMgZm9yIHVuc2lnbmVkIGxvbmcgYW5kIGxvbmcuCgoyMDE1LTEyLTE5OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBQeXRob24gMiBVbmljb2RlIFVURi04IHN0cmluZ3MgY2FuIGJlIHVzZWQgYXMgaW5wdXRzIHRvIGNoYXIgKiBvcgogICAgICAgICAgICBzdGQ6OnN0cmluZyB0eXBlcyBpZiB0aGUgZ2VuZXJhdGVkIEMvQysrIGNvZGUgaGFzIFNXSUdfUFlUSE9OXzJfVU5JQ09ERSBkZWZpbmVkLgoKMjAxNS0xMi0xNzogd3NmdWx0b24KICAgICAgICAgICAgSXNzdWVzICMyODYsICMxMjgKICAgICAgICAgICAgUmVtb3ZlIGNjYWNoZS1zd2lnLjEgbWFuIHBhZ2UgLSBwbGVhc2UgdXNlIHRoZSBDQ2FjaGUuaHRtbCBkb2NzIGluc3RlYWQuCiAgICAgICAgICAgIFRoZSB5b2RsMm1hbiBhbmQgeW9kbDJodG1sIHRvb2xzIGFyZSBubyBsb25nZXIgdXNlZCBhbmQgc28gU1dJRyBubwogICAgICAgICAgICBsb25nZXIgaGFzIGEgZGVwZW5kZW5jeSBvbiB0aGVzZSBwYWNrYWdlcyB3aGljaCB3ZXJlIHJlcXVpcmVkIHdoZW4KICAgICAgICAgICAgYnVpbGRpbmcgZnJvbSBnaXQuCgoyMDE1LTEyLTE2OiB6dHVybmVyL2NvbGViCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBQeXRob24zLjUgaW50ZXJwcmV0ZXIgYXNzZXJ0aW9ucyB3aGVuIG9iamVjdHMgYXJlIGJlaW5nCiAgICAgICAgICAgIGRlbGV0ZWQgZHVlIHRvIGFuIGV4aXN0aW5nIGV4Y2VwdGlvbi4gTW9zdCBub3RhYmx5IGluIGdlbmVyYXRvcnMKICAgICAgICAgICAgd2hpY2ggdGVybWluYXRlIHVzaW5nIGEgU3RvcEl0ZXJhdGlvbiBleGNlcHRpb24uIEZpeGVzICM1NTkgIzU2MCAjNTczLgogICAgICAgICAgICBJZiBhIGZ1cnRoZXIgZXhjZXB0aW9uIGlzIHJhaXNlZCBkdXJpbmcgYW4gb2JqZWN0IGRlc3RydWN0aW9uLAogICAgICAgICAgICBQeUVycl9Xcml0ZVVucmFpc2FibGUgaXMgdXNlZCBvbiB0aGlzIHNlY29uZCBleGNlcHRpb24gYW5kIHRoZQogICAgICAgICAgICBvcmlnaW5hbCBleGNlcHRpb24gYnViYmxlcyB0aHJvdWdoLgoKMjAxNS0xMi0xNDogYWhub2xkcy93c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBZGQgaW4gbWlzc2luZyBpbml0aWFsaXplcnMgZm9yIHRwX2ZpbmFsaXplLAogICAgICAgICAgICBuYl9tYXRyaXhfbXVsdGlwbHksIG5iX2lucGxhY2VfbWF0cml4X211bHRpcGx5LCBodF9xdWFsbmFtZQogICAgICAgICAgICBodF9jYWNoZWRfa2V5cyBhbmQgdHBfcHJldi4KCjIwMTUtMTItMTI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBTVEwgd3JhcHBlcnMgdG8gbm90IGdlbmVyYXRlIDw6IGRpZ3JhcGhzLgogICAgICAgICAgICBGb3IgZXhhbXBsZSBzdGQ6OnZlY3Rvcjw6Olg6Olk+IHdhcyBzb21ldGltZXMgZ2VuZXJhdGVkLCBub3cKICAgICAgICAgICAgY29ycmVjdGVkIHRvIHN0ZDo6dmVjdG9yPCA6Olg6OlkgPi4KCjIwMTUtMTEtMjU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBTVEwgcmFuZ2VzIGFuZCBzbGljZXMgZml4ZXMuCgogICAgICAgICAgICBSdWJ5IFNUTCBjb250YWluZXIgc2V0dGluZyBzbGljZXMgZml4ZXM6CgogICAgICAgICAgICBTZXR0aW5nIGFuIFNUTCBjb250YWluZXIgd3JhcHBlciBzbGljZSBiZXR0ZXIgbWF0Y2hlcyB0aGUgd2F5IFJ1YnkKICAgICAgICAgICAgYXJyYXlzIHdvcmsuIFRoZSBiZWhhdmlvdXIgaXMgbm93IHRoZSBzYW1lIGFzIFJ1YnkgYXJyYXlzLiBUaGUgb25seQogICAgICAgICAgICBleGNlcHRpb24gaXMgdGhlIGRlZmF1bHQgdmFsdWUgdXNlZCB3aGVuIGV4cGFuZGluZyBhIGNvbnRhaW5lcgogICAgICAgICAgICBjYW5ub3QgYmUgbmlsIGFzIHRoaXMgaXMgbm90IGEgdmFsaWQgdHlwZS92YWx1ZSBmb3IgQysrIGNvbnRhaW5lcgogICAgICAgICAgICBlbGVtZW50cy4KCiAgICAgICAgICAgIE9idGFpbmluZyBhIFJ1YnkgU1RMIGNvbnRhaW5lciByYW5nZXMgYW5kIHNsaWNlcyBmaXhlczoKCiAgICAgICAgICAgIEFjY2VzcyB2aWEgcmFuZ2VzIGFuZCBzbGljZXMgbm93IGJlaGF2ZSBpZGVudGljYWxseSB0byBSdWJ5IGFycmF5cy4KICAgICAgICAgICAgVGhlIGZpeGVzIGFyZSBtb3N0bHkgZm9yIG91dCBvZiByYW5nZSBpbmRpY2VzIGFuZCBsZW5ndGhzLgogICAgICAgICAgICAtIFplcm8gbGVuZ3RoIHNsaWNlIHJlcXVlc3RzIHJldHVybiBhbiBlbXB0eSBjb250YWluZXIgaW5zdGVhZCBvZiBuaWwuCiAgICAgICAgICAgIC0gU2xpY2VzIHdoaWNoIHJlcXVlc3QgYSBsZW5ndGggZ3JlYXRlciB0aGFuIHRoZSBzaXplIG9mIHRoZSBjb250YWluZXIKICAgICAgICAgICAgICBubyBsb25nZXIgY2hvcCBvZmYgdGhlIGxhc3QgZWxlbWVudC4KICAgICAgICAgICAgLSBSYW5nZXMgd2hpY2ggdXNlZCB0byByZXR1cm4gbmlsIG5vdyByZXR1cm4gYW4gZW1wdHkgYXJyYXkgd2hlbiB0aGUKICAgICAgICAgICAgICB0aGUgc3RhcnQgZWxlbWVudCBpcyBhIHZhbGlkIGluZGV4LgoKICAgICAgICAgICAgUnVieSBTVEwgY29udGFpbmVyIG5lZ2F0aXZlIGluZGV4aW5nIHN1cHBvcnQgaW1wcm92ZWQuCgogICAgICAgICAgICBVc2luZyBuZWdhdGl2ZSBpbmRleGVzIHRvIHNldCB2YWx1ZXMgd29ya3MgdGhlIHNhbWUgYXMgUnVieSBhcnJheXMsIGVnCgogICAgICAgICAgICAldGVtcGxhdGUoSW50VmVjdG9yKSBzdGQ6OnZlY3RvcjxpbnQ+OwoKICAgICAgICAgICAgaXYgPSBJbnRWZWN0b3IubmV3KFsxLDIsMyw0XSkKICAgICAgICAgICAgaXZbLTRdID0gOSAjID0+IFsxLDIsMyw5XQogICAgICAgICAgICBpdlstNV0gPSA5ICMgPT4gSW5kZXhFcnJvcgoKMjAxNS0xMS0yMTogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnksIFB5dGhvbl0gQWRkIHN0ZDo6YXJyYXkgY29udGFpbmVyIHdyYXBwZXJzLgoKICAgICAgICAgICAgVGhlc2Ugd29yayBtdWNoIGxpa2UgYW55IG9mIHRoZSBvdGhlciBTVEwgY29udGFpbmVycyBleGNlcHQgUHl0aG9uL1J1Ynkgc2xpY2luZwogICAgICAgICAgICBpcyBzb21ld2hhdCBsaW1pdGVkIGJlY2F1c2UgdGhlIGFycmF5IGlzIGEgZml4ZWQgc2l6ZS4gT25seSBzbGljZXMgb2YKICAgICAgICAgICAgdGhlIGZ1bGwgc2l6ZSBhcmUgc3VwcG9ydGVkLgoKMjAxNS0xMC0xMDogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gIzUzOSAtIFN1cHBvcnQgUHl0aG9uIDMuNSBhbmQgLWJ1aWx0aW4uICBQeUFzeW5jTWV0aG9kcyBpcyBhIG5ldwogICAgICAgICAgICBtZW1iZXIgaW4gUHlIZWFwVHlwZU9iamVjdC4KCjIwMTUtMTAtMDY6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBEb24ndCBlbWl0IGEgY29uc3RydWN0b3IgZnVuY3Rpb24gZm9yIGEgZGlyZWN0b3IKCSAgICBjbGFzcyB3aXRoIGFuIGFic3RyYWN0IG1ldGhvZCwgc2luY2UgdGhlIGZ1bmN0aW9uIHdpbGwKCSAgICBhbHdheXMgcGFuaWMuCgoyMDE1LTEwLTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJXNoYXJlZF9wdHIgc3VwcG9ydCBmb3IgcHJpdmF0ZSBhbmQgcHJvdGVjdGVkIGluaGVyaXRhbmNlLgogICAgICAgICAgICAtIFJlbW92ZSB1bm5lY2Vzc2FyeSBXYXJuaW5nIDUyMDogRGVyaXZlZCBjbGFzcyAnRGVyaXZlZCcgb2YgJ0Jhc2UnCiAgICAgICAgICAgICAgaXMgbm90IHNpbWlsYXJseSBtYXJrZWQgYXMgYSBzbWFydCBwb2ludGVyCiAgICAgICAgICAgIC0gRG8gbm90IGdlbmVyYXRlIGNvZGUgdGhhdCBhdHRlbXB0cyB0byBjYXN0IHVwIHRoZSBpbmhlcml0YW5jZSBjaGFpbiBpbiB0aGUKICAgICAgICAgICAgICB0eXBlIHN5c3RlbSBydW50aW1lIGluIHN1Y2ggY2FzZXMgYXMgaXQgZG9lc24ndCBjb21waWxlIGFuZCBjYW4ndCBiZSB1c2VkLgogICAgICAgICAgICBSZW1vdmUgdW5uZWNlc3Nhcnkgd2FybmluZyA1MjAgZm9yICVzaGFyZWRfcHRyIHdoZW4gdGhlIGJhc2UgY2xhc3MgaXMgaWdub3JlZC4KCjIwMTUtMTAtMDE6IHZrYWxpbmluCiAgICAgICAgICAgIEZpeCAjNTA4OiBGaXggc2VnZmF1bHQgcGFyc2luZyBhbm9ueW1vdXMgdHlwZWRlZiBuZXN0ZWQgY2xhc3Nlcy4KCjIwMTUtMDktMjY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBBZGQgc2hhcmVkX3B0ciBzdXBwb3J0CgoyMDE1LTA5LTEzOiBra2FlbXBmCiAgICAgICAgICAgIFtSdWJ5XSBSZXNvbHZlIHRyYWNraW5nIGJ1ZyAtIGlzc3VlICMyMjUuCiAgICAgICAgICAgIFRoZSBidWcgaXMgdGhhdCB0aGUgdHJhY2tpbmcgY29kZSB1c2VzIGEgcnVieSBoYXNoIGFuZCB0aHVzIG1heQogICAgICAgICAgICBhbGxvY2F0ZSBvYmplY3RzIChCaWdudW0pIHdoaWxlIHJ1bm5pbmcgdGhlIEdDLiBUaGlzIHdhcyB0b2xlcmF0ZWQgaW4KICAgICAgICAgICAgMS44IGJ1dCBpcyBpbnZhbGlkIChyYWlzZXMgYW4gZXhjZXB0aW9uKSBpbiAxLjkuCiAgICAgICAgICAgIFRoZSBwYXRjaCB1c2VzIGEgQyBoYXNoIChhbHNvIHVzZWQgYnkgcnVieSkgaW5zdGVhZC4KCjIwMTUtMDktMDk6IGx5emUKICAgICAgICAgICAgW0NGRkldIEV4dGVuZCB0aGUgImV4cG9ydCIgZmVhdHVyZSBpbiB0aGUgQ0ZGSSBtb2R1bGUgdG8gc3VwcG9ydAogICAgICAgICAgICBleHBvcnRpbmcgdG8gYSBzcGVjaWZpZWQgcGFja2FnZS4KCjIwMTUtMDktMDQ6IG9sbHkKCSAgICBbUHl0aG9uXSBGaXggZG9jc3RyaW5ncyBmb3IgJWNhbGxiYWNrIGZ1bmN0aW9ucy4KCjIwMTUtMDktMDM6IGRlbWktcmx1ZGR5CiAgICAgICAgICAgIFtHb10gUmVtb3ZlZCBnb2xhbmcgc3RyaW5naW5nIGZvciBzaWduZWQvdW5zaWduZWQgY2hhcgoKICAgICAgICAgICAgQ2hhbmdlZCBkZWZhdWx0IGhhbmRsaW5nIG9mIHNpZ25lZCBjaGFyKiBhbmQgdW5zaWduZWQgY2hhciogdG8gYmUKICAgICAgICAgICAgb3BhcXVlIHBvaW50ZXJzIHJhdGhlciB0aGFuIHN0cmluZ3MsIHNpbWlsYXJseSB0byBob3cgb3RoZXIKICAgICAgICAgICAgbGFuZ3VhZ2VzIHdvcmsuCgogICAgICAgICAgICBBbnkgZXhpc3RpbmcgY29kZSByZWx5aW5nIG9uIHRyZWF0aW5nIHNpZ25lZCBjaGFyKiBvciB1bnNpZ25lZAogICAgICAgICAgICBjaGFyKiBhcyBhIHN0cmluZyBjYW4gcmVzdG9yZSB0aGUgb2xkIGJlaGF2aW9yIHdpdGggdHlwZW1hcHMuaSBieQogICAgICAgICAgICB1c2luZyAlYXBwbHkgdG8gY29weSB0aGUgW3VuY2hhbmdlZF0gY2hhciogYmVoYXZpb3IuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTUtMDgtMDc6IHRhbGJ5CiAgICAgICAgICAgIFtQZXJsXSB0aWR5IC1XdGF1dG9sb2dpY2FsLWNvbnN0YW50LW91dC1vZi1yYW5nZS1jb21wYXJlIHdhcm5pbmdzIHdoZW4gYnVpbGRpbmcgZ2VuZXJhdGVkIGNvZGUgdW5kZXIgY2xhbmcKCjIwMTUtMDgtMDc6IHhhbnRhcmVzCiAgICAgICAgICAgIFtQeXRob25dIHBlcDI1NyAmIG51bXB5ZG9jIGNvbmZvcm1pbmcgZG9jc3RyaW5nczoKICAgICAgICAgICAgLSBNb25vLWxpbmUgbW9kdWxlIGRvY3NzdHJpbmcKICAgICAgICAgICAgLSBSZXdyaXRlIGF1dG9kb2MgcGFyYW1ldGVycyBzZWN0aW9uIGluIG51bXB5ZG9jIHN0eWxlOgogICAgICAgICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9udW1weS9udW1weS9ibG9iL21hc3Rlci9kb2MvSE9XVE9fRE9DVU1FTlQucnN0LnR4dAogICAgICAgICAgICAtIE9uZSBsaW5lIHN1bW1hcnkgc2hvdWxkIGVuZCB3aXRoICIuIgogICAgICAgICAgICAtIEFkZHMgYSBibGFuayBsaW5lIGFmdGVyIGNsYXNzIGRvY3N0cmluZwoKMjAxNS0wOC0wNTogdmFkegogICAgICAgICAgICBbSmF2YV0gTWFrZSAoY2hhciogU1RSSU5HLCBzaXplX3QgTEVOR1RIKSB0eXBlbWFwcyB1c2FibGUgZm9yCiAgICAgICAgICAgIHN0cmluZ3Mgb2Ygb3RoZXIgdHlwZXMsIGUuZy4gInVuc2lnbmVkIGNoYXIqIi4KClZlcnNpb24gMy4wLjcgKDMgQXVnIDIwMTUpCj09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDE1LTA4LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IHBvdGVudGlhbCBzZWN1cml0eSBleHBsb2l0IGluIGdlbmVyYXRlZCBKYXZhIGNsYXNzZXMuCiAgICAgICAgICAgIFRoZSBzd2lnQ1B0ciBhbmQgc3dpZ0NNZW1Pd24gbWVtYmVyIHZhcmlhYmxlcyBpbiB0aGUgZ2VuZXJhdGVkIEphdmEKICAgICAgICAgICAgY2xhc3NlcyBhcmUgbm93IGRlY2xhcmVkICd0cmFuc2llbnQnIGJ5IGRlZmF1bHQuIEZ1cnRoZXIgZGV0YWlscyBvZiB0aGUgZXhwbG9pdAogICAgICAgICAgICBpbiBBbmRyb2lkIGlzIGJlaW5nIHB1Ymxpc2hlZCBpbiBhbiBhY2FkZW1pYyBwYXBlciBhcyBwYXJ0IG9mIFVTRU5JWCBXT09UICcxNToKICAgICAgICAgICAgaHR0cHM6Ly93d3cudXNlbml4Lm9yZy9jb25mZXJlbmNlL3dvb3QxNS93b3Jrc2hvcC1wcm9ncmFtL3ByZXNlbnRhdGlvbi9wZWxlcy4KCiAgICAgICAgICAgIEluIHRoZSB1bmxpa2VseSBldmVudCB0aGF0IHlvdSBhcmUgcmVseWluZyBvbiB0aGVzZSBtZW1iZXJzIGJlaW5nIHNlcmlhbGl6YWJsZSwKICAgICAgICAgICAgdGhlbiB5b3Ugd2lsbCBuZWVkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGphdmFib2R5IGFuZCBqYXZhYm9keV9kZXJpdmVkIHR5cGVtYXBzCiAgICAgICAgICAgIHRvIGdlbmVyYXRlIHRoZSBvbGQgZ2VuZXJhdGVkIGNvZGUuIFRoZSByZWxldmFudCB0eXBlbWFwcyBhcmUgaW4gdGhlIExpYiBkaXJlY3RvcnkKICAgICAgICAgICAgaW4gdGhlIGphdmEuc3dnLCBib29zdF9zaGFyZWRfcHRyLmkgYW5kIGJvb3N0X2ludHJ1c2l2ZV9wdHIuaSBmaWxlcy4gQ29weSB0aGUKICAgICAgICAgICAgcmVsZXZhbnQgZGVmYXVsdCB0eXBlbWFwcyBpbnRvIHlvdXIgaW50ZXJmYWNlIGZpbGUgYW5kIHJlbW92ZSB0aGUgJ3RyYW5zaWVudCcga2V5d29yZC4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxNS0wOC0wMTogdmFkegogICAgICAgICAgICBNYWtlIGNvbmZpZ3VyZSAtLXdpdGhvdXQtYWxsbGFuZyBvcHRpb24gbW9yZSB1c2VmdWw6IGl0IGNhbiBub3cgYmUgb3ZlcnJpZGRlbiBieSB0aGUgZm9sbG93aW5nCiAgICAgICAgICAgIC0td2l0aC14eHggb3B0aW9ucywgYWxsb3dpbmcgdG8gZWFzaWx5IGVuYWJsZSBqdXN0IG9uZSBvciB0d28gbGFuZ3VhZ2VzLgoKMjAxNS0wNy0zMDogd3NmdWx0b24KICAgICAgICAgICAgRml4ICM0NDAgLSBJbml0aWFsaXNlIGFsbCBuZXdseSBjcmVhdGVkIGFycmF5cyB3aGVuIHVzaW5nICVhcnJheV9mdW5jdGlvbnMgYW5kICVhcnJheV9jbGFzcwogICAgICAgICAgICBpbiB0aGUgY2FycmF5cy5pIGxpYnJhcnkgLSBidWcgaXMgb25seSByZWxldmFudCB3aGVuIHVzaW5nIEMrKy4KCjIwMTUtMDctMjk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEltcHJvdmUgaW5kZW50YXRpb24gd2FybmluZyBhbmQgZXJyb3IgbWVzc2FnZXMgZm9yIGNvZGUgaW4gdGhlIGZvbGxvd2luZyBkaXJlY3RpdmVzOgoKICAgICAgICAgICAgICAlcHl0aG9ucHJlcGVuZAogICAgICAgICAgICAgICVweXRob25hcHBlbmQKICAgICAgICAgICAgICAlcHl0aG9uY29kZQogICAgICAgICAgICAgICVweXRob25iZWdpbgogICAgICAgICAgICAgICVmZWF0dXJlKCJzaGFkb3ciKQoKICAgICAgICAgICAgT2xkIGVycm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgRXJyb3I6IExpbmUgaW5kZW50ZWQgbGVzcyB0aGFuIGV4cGVjdGVkIChsaW5lIDMgb2YgcHl0aG9uY29kZSkKCiAgICAgICAgICAgIE5ldyBlcnJvciBleGFtcGxlOgogICAgICAgICAgICAgIEVycm9yOiBMaW5lIGluZGVudGVkIGxlc3MgdGhhbiBleHBlY3RlZCAobGluZSAzIG9mICVweXRob25jb2RlIG9yICVpbnNlcnQoInB5dGhvbiIpIGJsb2NrKQogICAgICAgICAgICAgIGFzIG5vIGxpbmUgc2hvdWxkIGJlIGluZGVudGVkIGxlc3MgdGhhbiB0aGUgaW5kZW50YXRpb24gaW4gbGluZSAxCgogICAgICAgICAgICBPbGQgd2FybmluZyBleGFtcGxlOgogICAgICAgICAgICAgIFdhcm5pbmcgNzQwOiBXaGl0ZXNwYWNlIHByZWZpeCBkb2Vzbid0IG1hdGNoIChsaW5lIDIgb2YgJXB5dGhvbmNvZGUgb3IgJWluc2VydCgicHl0aG9uIikgYmxvY2spCgogICAgICAgICAgICBOZXcgd2FybmluZyBleGFtcGxlOgogICAgICAgICAgICAgIFdhcm5pbmcgNzQwOiBXaGl0ZXNwYWNlIGluZGVudGF0aW9uIGlzIGluY29uc2lzdGVudCBjb21wYXJlZCB0byBlYXJsaWVyIGxpbmVzIChsaW5lIDMgb2YKICAgICAgICAgICAgICAlcHl0aG9uY29kZSBvciAlaW5zZXJ0KCJweXRob24iKSBibG9jaykKCiAgICAgICAgICAgIAoyMDE1LTA3LTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggIzQ3NS4gSW1wcm92ZSBkb2NzdHJpbmcgaW5kZW50YXRpb24gaGFuZGxpbmcuCiAgICAgICAgICAgIAogICAgICAgICAgICBTV0lHLTMuMC41IGFuZCBlYXJsaWVyIHNvbWV0aW1lcyB0cnVuY2F0ZWQgdGV4dCBwcm92aWRlZCBpbiB0aGUgZG9jc3RyaW5nIGZlYXR1cmUuCiAgICAgICAgICAgIFRoaXMgb2NjdXJyZWQgd2hlbiB0aGUgaW5kZW50YXRpb24gKHdoaXRlc3BhY2UpIGluIHRoZSBkb2NzdHJpbmcgd2FzIGxlc3MgaW4gdGhlCiAgICAgICAgICAgIHNlY29uZCBvciBsYXRlciBsaW5lcyB3aGVuIGNvbXBhcmVkIHRvIHRoZSBmaXJzdCBsaW5lLgogICAgICAgICAgICBTV0lHLTMuMC42IGdhdmUgYSAnTGluZSBpbmRlbnRlZCBsZXNzIHRoYW4gZXhwZWN0ZWQnIGVycm9yIGluc3RlYWQgb2YgdHJ1bmNhdGluZwogICAgICAgICAgICB0aGUgZG9jc3RyaW5nIHRleHQuCiAgICAgICAgICAgIE5vdyB0aGUgaW5kZW50YXRpb24gZm9yIHRoZSAnZG9jc3RyaW5nJyBmZWF0dXJlIGlzIHNtYXJ0ZXIgYW5kIGlzIGFwcHJvcHJpYXRlbHkKICAgICAgICAgICAgYWRqdXN0ZWQgc28gdGhhdCBubyB0cnVuY2F0aW9uIG9jY3Vycy4KCjIwMTUtMDctMjI6IHdzZnVsdG9uCiAgICAgICAgICAgIFN1cHBvcnQgZm9yIHNwZWNpYWwgdmFyaWFibGUgZXhwYW5zaW9uIGluIHR5cGVtYXAgYXR0cmlidXRlcy4gRXhhbXBsZSB1c2FnZSBleHBhbnNpb24KICAgICAgICAgICAgaW4gdGhlICdvdXQnIGF0dHJpYnV0ZSAoQyMgc3BlY2lmaWMpOgoKICAgICAgICAgICAgICAldHlwZW1hcChjdHlwZSwgb3V0PSIkKjFfbHR5cGUiKSB1bnNpZ25lZCBpbnQmICIkKjFfbHR5cGUiCgogICAgICAgICAgICBpcyBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmcgYXMgJCoxX2x0eXBlIGV4cGFuZHMgdG8gJ3Vuc2lnbmVkIGludCc6CgogICAgICAgICAgICAgICV0eXBlbWFwKGN0eXBlLCBvdXQ9InVuc2lnbmVkIGludCIpIHVuc2lnbmVkIGludCYgInVuc2lnbmVkIGludCIKCiAgICAgICAgICAgIFNwZWNpYWwgdmFyaWFibGVzIGNhbiBiZSB1c2VkIHdpdGhpbiBzcGVjaWFsIHZhcmlhYmxlIG1hY3JvcyB0b28uIEV4YW1wbGUgdXNhZ2UgZXhwYW5zaW9uOgoKICAgICAgICAgICAgICAldHlwZW1hcChjc3R5cGUpIHVuc2lnbmVkIGludCAidWludCIKICAgICAgICAgICAgICAldHlwZW1hcChjc3R5cGUsIG91dD0iJHR5cGVtYXAoY3N0eXBlLCAkKjFfbHR5cGUpIikgdW5zaWduZWQgaW50JiAiJHR5cGVtYXAoY3N0eXBlLCAkKjFfbHR5cGUpIgoKICAgICAgICAgICAgU3BlY2lhbCB2YXJpYWJsZXMgYXJlIGV4cGFuZGVkIGZpcnN0IGFuZCBoZW5jZSB0aGUgYWJvdmUgaXMgZXF1aXZhbGVudCB0bzoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoY3N0eXBlLCBvdXQ9IiR0eXBlbWFwKGNzdHlwZSwgdW5zaWduZWQgaW50KSIpIHVuc2lnbmVkIGludCYgIiR0eXBlbWFwKGNzdHlwZSwgdW5zaWduZWQgaW50KSIKCiAgICAgICAgICAgIHdoaWNoIHRoZW4gZXhwYW5kcyB0bzoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoY3N0eXBlLCBvdXQ9InVpbnQiKSB1bnNpZ25lZCBpbnQmICJ1aW50IgoKMjAxNS0wNy0yMjogbGluZGxleWYKCSAgICBBcHBseSBwYXRjaCAjNDM5IC0gc3VwcG9ydCBmb3IgJHR5cGVtYXAoKSAoYWthIGVtYmVkZGVkIHR5cGVtYXBzIG9yIHNwZWNpYWwgdmFyaWFibGUKICAgICAgICAgICAgbWFjcm9zKSBpbiB0eXBlbWFwIGF0dHJpYnV0ZXMuIEEgc2ltcGxlIGV4YW1wbGUgd2hlcmUgJHR5cGVtYXAoKSBpcyBleHBhbmRlZCBpbiB0aGUKICAgICAgICAgICAgJ291dCcgYXR0cmlidXRlIChDIyBzcGVjaWZpYyk6CgogICAgICAgICAgICAgICV0eXBlbWFwKGNzdHlwZSkgdW5zaWduZWQgaW50ICJ1aW50IgogICAgICAgICAgICAgICV0eXBlbWFwKGNzdHlwZSwgb3V0PSIkdHlwZW1hcChjc3R5cGUsIHVuc2lnbmVkIGludCkiKSB1bnNpZ25lZCBpbnQmICIkdHlwZW1hcChjc3R5cGUsIHVuc2lnbmVkIGludCkiCgogICAgICAgICAgICBpcyBlcXVpdmFsZW50IHRvOgoKICAgICAgICAgICAgICAldHlwZW1hcChjc3R5cGUsIG91dD0idWludCIpIHVuc2lnbmVkIGludCYgInVpbnQiCgoyMDE1LTA3LTE4OiBtN3Rob24KCSAgICBbUHl0aG9uXSBEb2NzdHJpbmdzIHByb3ZpZGVkIHZpYSAlZmVhdHVyZSgiZG9jc3RyaW5nIikgYXJlIG5vdyBxdW90ZWQgYW5kIGFkZGVkIHRvCiAgICAgICAgICAgIHRoZSB0cF9kb2Mgc2xvdCB3aGVuIHVzaW5nIHB5dGhvbiBidWlsdGluIGNsYXNzZXMgKC1idWlsdGluKS4gV2hlbiBubyBkb2NzdHJpbmcgaXMKICAgICAgICAgICAgcHJvdmlkZWQsIHRoZSB0cF9kb2Mgc2xvdCBpcyBzZXQgdG8gdGhlIGZ1bGx5IHF1YWxpZmllZCBDL0MrKyBjbGFzcyBuYW1lLgogICAgICAgICAgICBHaXRodWIgaXNzdWVzICM0NDUgYW5kICM0NjEuCgoyMDE1LTA3LTE3OiBrd3dldHRlCiAgICAgICAgICAgIFtvY3RhdmVdIFN1cHBvcnQgT2N0YXZlIHZlcnNpb24gNC4wLjAgKHRoYW5rcyB0byBwYXRjaGVzIGZyb20gT3Jpb24gUG9wbGF3c2tpKS4KCjIwMTUtMDctMDc6IHdzZnVsdG9uCgkgICAgU1dJRyBubyBsb25nZXIgZ2VuZXJhdGVzIGEgd3JhcHBlciBmb3IgYSBjbGFzcycgY29uc3RydWN0b3IgaWYgdGhhdCBjbGFzcyBoYXMKICAgICAgICAgICAgYW55IGJhc2UgY2xhc3Mgd2l0aCBhIHByaXZhdGUgZGVzdHJ1Y3Rvci4gVGhpcyBpcyBiZWNhdXNlIHlvdXIgY29tcGlsZXIgc2hvdWxkCiAgICAgICAgICAgIG5vdCBhbGxvdyBhIGNsYXNzIHRvIGJlIGluc3RhbnRpYXRlZCBpZiBhIGJhc2UgaGFzIGEgcHJpdmF0ZSBkZXN0cnVjdG9yLiBTb21lCiAgICAgICAgICAgIGNvbXBpbGVycyBkbywgc28gaWYgeW91IG5lZWQgdGhlIG9sZCBiZWhhdmlvdXIsIHVzZSB0aGUgIm5vdGFic3RyYWN0IiBmZWF0dXJlLCBlZzoKCiAgICAgICAgICAgICAgJWZlYXR1cmUoIm5vdGFic3RyYWN0IikgRGVyaXZlZDsKICAgICAgICAgICAgICBjbGFzcyBCYXNlIHsKICAgICAgICAgICAgICAgIH5CYXNlKCkge30KICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIHN0cnVjdCBEZXJpdmVkIDogQmFzZSB7fTsKClZlcnNpb24gMy4wLjYgKDUgSnVsIDIwMTUpCj09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDE1LTA3LTAyOiB3c2Z1bHRvbgoJICAgIEZpeCBzeW50YXggZXJyb3Igd2hlbiB0aGUgdGVtcGxhdGUga2V5d29yZCBpcyB1c2VkIGluIHR5cGVzLCBlZzoKCiAgICAgICAgICAgICAgc3RkOjp0ZW1wbGF0ZSB2ZWN0b3I8aW50PiB2OwoKMjAxNS0wNy0wMjogbmdsYWRpdHoKCSAgICBbTHVhXSBQdXNoIGNoYXJhY3RlcnMgYXMgdW5mb3JtYXR0ZWQgMS1jaGFyYWN0ZXIgc3RyaW5ncyB0byBhdm9pZAoJICAgIHVucHJpbnRhYmxlIGNoYXJhY3RlcnMgc3VjaCBhcyAoY2hhcikxMjcgYmVpbmcgY29udmVydGVkIHRvCgkgICAgIjxcMTI3PiIgd2l0aCBMdWEgNS4zIGFuZCBsYXRlci4gIChnaXRodWIgUFIgIzQ1MikKCjIwMTUtMDYtMjk6IG9sbHkKCSAgICBbUHl0aG9uXSBJbXByb3ZlIGhhbmRsaW5nIG9mIHdoaXRlc3BhY2UgaW4gJXB5dGhvbmNvZGUuCgoJICAgIFByZXZpb3VzbHkgU1dJRyBsb29rZWQgYXQgdGhlIGluZGVudGF0aW9uIG9mIHRoZSBmaXJzdCBsaW5lIGFuZAoJICAgIHJlbW92ZWQgdGhhdCBtYW55IGNoYXJhY3RlcnMgZnJvbSBlYWNoIHN1YnNlcXVlbnQgbGluZSwgcmVnYXJkbGVzcwoJICAgIG9mIHdoYXQgdGhvc2UgY2hhcmFjdGVycyB3ZXJlLiAgVGhpcyB3YXMgbWFkZSB3b3JzZSBiZWNhdXNlIFNXSUcncwoJICAgIHByZXByb2Nlc3NvciByZW1vdmVzIGFueSB3aGl0ZXNwYWNlIGJlZm9yZSBhICcjJy4gIEZpeGVzIGdpdGh1YgoJICAgIGlzc3VlICMzNzksIHJlcG9ydGVkIGJ5IEpvZSBPcnRvbi4KCjIwMTUtMDYtMTI6IHdzZnVsdG9uCgkgICAgW1JdIEZpeCAjNDMwIC0gY2FsbCB0byBTV0lHX2NyZWF0ZU5ld1JlZiBpbiBjb3B5VG9DIHdhcyBpbmNvcnJlY3RseSBuYW1lZC4KCjIwMTUtMDYtMTE6IHNnaGlyYXRlCgkgICAgW0MjXSBQYXRjaCAjNDI3IGFkZHMgaW4gbmV3IGNvbW1hbmQgbGluZSBvcHRpb24gLW91dGZpbGUgdG8gY29tYmluZSBhbGwgdGhlCiAgICAgICAgICAgIGdlbmVyYXRlZCBDIyBjb2RlIGludG8gYSBzaW5nbGUgZmlsZS4KCjIwMTUtMDYtMDk6IHdzZnVsdG9uCgkgICAgRml4IHNlZyBmYXVsdCBwcm9jZXNzaW5nIEMrKzExIHR5cGUgYWxpYXNpbmcuIElzc3VlICM0MjQuCgoyMDE1LTA1LTI4OiB3c2Z1bHRvbgoJICAgIFtQeXRob25dIEFkZCBuZXcgZmVhdHVyZSAicHl0aG9uOmNkZWZhdWx0YXJncyIgdG8gY29udHJvbCBkZWZhdWx0IGFyZ3VtZW50CiAgICAgICAgICAgIGNvZGUgZ2VuZXJhdGlvbi4gQnkgZGVmYXVsdCwgU1dJRyBhdHRlbXB0cyB0byBjb252ZXJ0IEMvQysrIGRlZmF1bHQgYXJndW1lbnQgdmFsdWVzCiAgICAgICAgICAgIGludG8gUHl0aG9uIHZhbHVlcyBhbmQgZ2VuZXJhdGVzIGNvZGUgaW50byB0aGUgUHl0aG9uIGxheWVyIHdpdGggdGhlc2UgdmFsdWVzLgogICAgICAgICAgICBSZWNlbnQgdmVyc2lvbnMgb2YgU1dJRyBhcmUgYWJsZSB0byBjb252ZXJ0IG1vcmUgb2YgdGhlc2UgdmFsdWVzLCBob3dldmVyLCB0aGUKICAgICAgICAgICAgbmV3IGJlaGF2aW91ciBjYW4gYmUgY2lyY3VtdmVudGVkIGlmIGRlc2lyZWQgdmlhIHRoaXMgbmV3IGZlYXR1cmUsIHN1Y2ggdGhhdAogICAgICAgICAgICB0aGUgZGVmYXVsdCBhcmd1bWVudCB2YWx1ZXMgYXJlIG9idGFpbmVkIGZyb20gdGhlIEMgbGF5ZXIgYW5kIG5vdCB0aGUgUHl0aG9uIGxheWVyLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgc3RydWN0IENEQSB7CiAgICAgICAgICAgICAgICBpbnQgZmZmKGludCBhID0gMSwgYm9vbCBiID0gZmFsc2UpOwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGUgZGVmYXVsdCBjb2RlIGdlbmVyYXRpb24gaW4gdGhlIFB5dGhvbiBsYXllciBpczoKCiAgICAgICAgICAgICAgY2xhc3MgQ0RBKF9vYmplY3QpOgogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgZGVmIGZmZihzZWxmLCBhPTEsIGI9RmFsc2UpOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9kZWZhdWx0X2FyZ3MuQ0RBX2ZmZihzZWxmLCBhLCBiKQoKICAgICAgICAgICAgQWRkaW5nIHRoZSBmZWF0dXJlOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgicHl0aG9uOmNkZWZhdWx0YXJncyIpIENEQTo6ZmZmOwoKICAgICAgICAgICAgUmVzdWx0cyBpbjoKCiAgICAgICAgICAgICAgY2xhc3MgQ0RBKF9vYmplY3QpOgogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgZGVmIGZmZihzZWxmLCAqYXJncyk6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2RlZmF1bHRfYXJncy5DREFfZmZmKHNlbGYsICphcmdzKQoKICAgICAgICAgICAgU29tZSBjb2RlIGdlbmVyYXRpb24gbW9kZXMsIGVnIC1idWlsdGluIGFuZCAtZmFzdHByb3h5LCBhcmUgdW5hZmZlY3RlZCBieSB0aGlzIGFzCiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHZhbHVlcyBhcmUgYWx3YXlzIG9idGFpbmVkIGZyb20gdGhlIEMgbGF5ZXIuCgoyMDE1LTA1LTI3OiB3c2Z1bHRvbgoJICAgIFtQeXRob25dIERlYWwgd2l0aCBhbiBpbnRlZ2VyIGFzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIGEgdHlwZWRlZiB0byBib29sCgkgICAgcGFyYW1ldGVyIGluIHRoZSBDKysgcHJvdG90eXBlLiAgU2VlICMzMjcuIFJlZ3Jlc3Npb24gZnJvbSAzLjAuMCBvbndhcmRzLgoKMjAxNS0wNS0xOTogb2xseQoJICAgIFtQeXRob25dIEZpeCB3YXJuaW5nIHdoZW4gY29tcGlsaW5nIGdlbmVyYXRlZCBjb2RlIHdpdGggTVNWQy4KCSAgICAoRml4ZXMgaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcC9zd2lnL3BhdGNoZXMvMzUxLyByZXBvcnRlZCBieQoJICAgIE1hdGV1c3ogU3p5bWG/c2tpKS4KCjIwMTUtMDUtMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzZWcgZmF1bHQgd3JhcHBpbmcgc2hhcmVkX3B0ciBvZiBjbGFzc2VzIHdpdGggcHJpdmF0ZSBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzLiAKICAgICAgICAgICAgVGhpcyBhbHNvIGZpeGVzIHRoZSAidW5yZWYiIGZlYXR1cmUgd2hlbiB1c2VkIG9uIGNsYXNzZXMgd2l0aCBwcml2YXRlIGRlc3RydWN0b3JzLgoKMjAxNS0wNS0xMDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCBtdWx0aS1hcmd1bWVudCB0eXBlbWFwcyAoY2hhciAqU1RSSU5HLCBzaXplX3QgTEVOR1RIKQogICAgICAgICAgICBzbyB0aGF0IHRoZXkgY2FuIGJlIGFwcGxpZWQgdG8gYSB3aWRlciByYW5nZSBvZiB0eXBlcy4gRml4ZXMgIzM4NS4KCjIwMTUtMDUtMDc6IG9sbHkKCSAgICBbUHl0aG9uXSBEZWFsIHdpdGggYW4gaW50ZWdlciBhcyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhIGJvb2wKCSAgICBwYXJhbWV0ZXIgaW4gdGhlIEMrKyBwcm90b3R5cGUuICBGaXhlcyBnaXRodWIgIzMyNywgcmVwb3J0ZWQgYnkKCSAgICBHcmVnIEFsbGVuLgoKMjAxNS0wNS0wNzogTGluZGxleUYKCSAgICBbSmF2YV0gQWxsb3cgZmVhdHVyZSgiZGlyZWN0b3IiKSBhbmQgZmVhdHVyZSgicmVmIikgdG8gYmUgdXNlZAoJICAgIHRvZ2V0aGVyLiAgR2l0aHViIFBSIzQwMy4KCjIwMTUtMDUtMDU6IG9sbHkKCSAgICBTdXBwcmVzcyB3YXJuaW5nIDMyNSAiTmVzdGVkIGNsYXNzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIChGb28KCSAgICBpZ25vcmVkKSIgd2hlbiBGb28gaGFzIGFscmVhZHkgYmVlbiBleHBsaWNpdGx5IGlnbm9yZWQgd2l0aCAiJWlnbm9yZSIuCgoyMDE1LTA1LTA0OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgc3VwcG9ydCBmb3IgZnJpZW5kIHRlbXBsYXRlcywgaW5jbHVkaW5nIG9wZXJhdG9yIG92ZXJsb2FkaW5nIC0gZml4ZXMgIzE5Ni4gQ29uc2lkZXJpbmcKICAgICAgICAgICAgdGhlIGV4YW1wbGUgYmVsb3csIHByZXZpb3VzbHkgdGhlIG9wZXJhdG9yIGdhdmUgYSBzeW50YXggZXJyb3IgYW5kIGZyaWVuZGZ1bmMgaW5jb3JyZWN0bHkKICAgICAgICAgICAgd2FybmVkIHdpdGg6CgogICAgICAgICAgICAgIldhcm5pbmcgNTAzOiBDYW4ndCB3cmFwICdmcmllbmRmdW5jPChUeXBlKT4nIHVubGVzcyByZW5hbWVkIHRvIGEgdmFsaWQgaWRlbnRpZmllci4iCgogICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBUeXBlPiBjbGFzcyBNeUNsYXNzIHsKICAgICAgICAgICAgICAgIGZyaWVuZCBpbnQgZnJpZW5kZnVuYyA8VHlwZT4oZG91YmxlIGlzLCBNeUNsYXNzIDxUeXBlPiAmIHgpOwogICAgICAgICAgICAgICAgZnJpZW5kIGludCBvcGVyYXRvcjw8IDxUeXBlPihkb3VibGUgdW4sIGNvbnN0IE15Q2xhc3MgPFR5cGU+ICZ4KTsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBhbHNvIHByZXZpb3VzbHkgaW5jb3JyZWN0bHkgd2FybmVkIHdpdGg6CgogICAgICAgICAgICAgICJXYXJuaW5nIDMwMjogSWRlbnRpZmllciAndGVtcGxhdGVfZnJpZW5kJyByZWRlZmluZWQgKGlnbm9yZWQpLCIKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gVCB0ZW1wbGF0ZV9mcmllbmQoVCk7CiAgICAgICAgICAgICAgc3RydWN0IE15VGVtcGxhdGUgewogICAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gZnJpZW5kIFQgdGVtcGxhdGVfZnJpZW5kKFQpOwogICAgICAgICAgICAgIH07CgoyMDE1LTA1LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggaGFuZGxpbmcgb2YgY29udmVyc2lvbiBvcGVyYXRvcnMgd2hlcmUgdGhlIG9wZXJhdG9yIGlzIHNwbGl0IG92ZXIgbXVsdGlwbGUKICAgICAgICAgICAgbGluZXMgb3IgaGFzIGNvbW1lbnRzIHdpdGhpbiB0aGUgb3BlcmF0b3IgdHlwZS4gRml4ZXMgIzQwMS4KCiAgICAgICAgICAgIEFsc28gZml4IHNpbWlsYXIgcHJvYmxlbSB3aXRoIG5vcm1hbCBvcGVyYXRvcnMgd2hpY2ggZ2F2ZSBhIHN5bnRheCBlcnJvciBpZiBzcGxpdCBvdmVyCiAgICAgICAgICAgIG11bHRpcGxlIGxpbmVzIG9yIGhhZCBhIGNvbW1lbnQgd2l0aGluIHRoZSBvcGVyYXRvciBkZWNsYXJhdGlvbi4KCjIwMTUtMDQtMzA6IG9sbHkKCSAgICBJZ25vcmUgdW5rbm93biBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcyB3aGljaCBhcmUgaW5zaWRlIGFuIGluYWN0aXZlCgkgICAgY29uZGl0aW9uYWwgKGdpdGh1YiBpc3N1ZSAjMzk0LCByZXBvcnRlZCBieSBEYW4gV2lsY294KS4KCSAgICBSZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gMy4wLjMuCgoyMDE1LTA0LTI3OiB2YWR6CiAgICAgICAgICAgIFtQeXRob25dIEZpeCAiZGVmYXVsdCIgdHlwZW1hcCB1c2VkIGFmdGVyIGFuIGFyZ3VtZW50IHdpdGggIm51bWlucHV0cz0wIiAoIzM3NykuCgoyMDE1LTA0LTI0OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggIzI1Ni4gQ29kZSBnZW5lcmF0ZWQgd2l0aCAnLWJ1aWx0aW4gLW1vZGVybmFyZ3MnIHNlZ2ZhdWx0cyBmb3IgYW55CiAgICAgICAgICAgIG1ldGhvZCB0YWtpbmcgemVybyBhcmd1bWVudHMuCgogICAgICAgICAgICBBbHNvIGZpeGVzOiAiU3lzdGVtRXJyb3I6IGVycm9yIHJldHVybiB3aXRob3V0IGV4Y2VwdGlvbiBzZXQiIGR1cmluZyBlcnJvciBjaGVja2luZwogICAgICAgICAgICB3aGVuIHVzaW5nIGp1c3QgLWJ1aWx0aW4gYW5kIHRoZSBpbmNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50cyBpcyBwYXNzZWQgdG8gYSBjbGFzcwogICAgICAgICAgICBtZXRob2QgZXhwZWN0aW5nIHplcm8gYXJndW1lbnRzLgoKMjAxNS0wNC0yMzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEJ1ZyAjMzg2IC0gTWVtb3J5IGxlYWsgZml4IGluIChjaGFyICpTVFJJTkcsIHNpemVfdCBMRU5HVEgpIHR5cGVtYXBzLgoKMjAxNS0wNC0yMzogdmFkegogICAgICAgICAgICBbUHl0aG9uXSBNYWtlICJkZWZhdWx0IiB0eXBlbWFwIHdvcmsgYWdhaW4gKCMzMzAsICMzNzcpLgoKMjAxNS0wNC0yMzogdmFkegogICAgICAgICAgICBbUHl0aG9uXSBGaXggdGhlIHVzZSBvZiBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIHBvaW50ZXIgdHlwZXMgKCMzNjUsICMzNzYpLgoKMjAxNS0wNC0yMzogd3NmdWx0b24KICAgICAgICAgICAgRml4ICdtYWtlIGNoZWNrLWNjYWNoZScgd2hpY2ggaXMgcGFydCBvZiAnbWFrZSBjaGVjaycgd2hlbiBvbmUgb2YgdGhlIENDQUNIRV8KICAgICAgICAgICAgZW52aXJvbm1lbnQgdmFyaWFibGVzLCBmb3IgZXhhbXBsZSBDQ0FDSEVfRElTQUJMRSwgaXMgc2V0LgoKMjAxNS0wNC0xNDogd3NmdWx0b24KICAgICAgICAgICAgQ2xlYXJlciB3YXJuaW5nIG1lc3NhZ2UgZm9yIGJhZGx5IGNvbnN0cnVjdGVkIHR5cGVjaGVjayB0eXBlbWFwcy4gRm9yIGV4YW1wbGUsIHdhczoKCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjM6IFdhcm5pbmcgNDY3OiBPdmVybG9hZGVkIGZvbyhpbnQpIG5vdCBzdXBwb3J0ZWQgKG5vIHR5cGUgY2hlY2tpbmcKICAgICAgICAgICAgICBydWxlIGZvciAnaW50JykuCgogICAgICAgICAgICBOb3c6CgogICAgICAgICAgICAgIGV4YW1wbGUuaTozOiBXYXJuaW5nIDQ2NzogT3ZlcmxvYWRlZCBmb28oaW50KSBub3Qgc3VwcG9ydGVkIChpbmNvbXBsZXRlIHR5cGUgY2hlY2tpbmcKICAgICAgICAgICAgICBydWxlIC0gbm8gcHJlY2VkZW5jZSBsZXZlbCBpbiB0eXBlY2hlY2sgdHlwZW1hcCBmb3IgJ2ludCcpLgoKMjAxNS0wNC0xMTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCAjMzUzIC0gTGlua2VyIG11bHRpcGxlIGRlZmluaXRpb24gb2YgJ0V4Y2VwdGlvbk1hdGNoZXMnIHdoZW4KICAgICAgICAgICAgdXNpbmcgZGlyZWN0b3JzIGFuZCBtdWx0aXBsZSBtb2R1bGVzLgoKMjAxNS0wNC0xMTogd3NmdWx0b24KICAgICAgICAgICAgTWVyZ2UgIzMyMCAtIE1ha2UgX19kaWN0X18gYWNjZXNzaWJsZSBmb3IgUHl0aG9uIGJ1aWx0aW4gY2xhc3Nlcy4KCjIwMTUtMDQtMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMzc1IC0gcGFyc2luZyBvZiBleHRlcm4gIkMiIGFuZCB0eXBlZGVmIGZvciBleGFtcGxlOgogICAgICAgICAgICAgIGV4dGVybiAiQyIgdHlwZWRlZiB2b2lkICgqSG9vazJfdCkoaW50LCBjb25zdCBjaGFyICopOwogICAgICAgICAgICAgIGV4dGVybiAiQyIgdHlwZWRlZiBpbnQgSW50ZWdlcjsKCjIwMTUtMDMtMTI6IG9sbHkKCSAgICAtRFNXSUdfRElSRUNUT1JfU1RBVElDIGlzIG5vdyBzdXBwb3J0ZWQgZm9yIGFsbCBsYW5ndWFnZXMgd2l0aAoJICAgIGRpcmVjdG9yIHN1cHBvcnQsIG5vdCBvbmx5IFB5dGhvbiBhbmQgUEhQLgoKMjAxNS0wMy0wMjogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIEFkZCAtY2dvIG9wdGlvbiwgcmVxdWlyZWQgZm9yIEdvIHZlcnNpb25zIDEuNSBhbmQKCSAgICBsYXRlci4KCjIwMTUtMDItMjY6IG9sbHkKCSAgICBGaXggc2VnbWVudGF0aW9uIGZhdWx0IHdoZW4gdG9wPT1OVUxMLCBpbnRyb2R1Y2VkIGJ5IG5lc3RlZCBjbGFzcwoJICAgIGhhbmRsaW5nIChyZXBvcnRlZCBpbiBpc3N1ZSMzNDYgYnkgUGF3Zb8gVG9tdWxpaykuCgoyMDE1LTAyLTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBbR3VpbGVdIEZpeCBnZW5lcmF0ZWQgY29kZSBmb3Igc3RhdGljIGNvbnN0IGNoYXIgbWVtYmVyIHZhcmlhYmxlcyB3aGVuCiAgICAgICAgICAgIGRlZmluZWQgYW5kIGRlY2xhcmVkIGlubGluZS4KCjIwMTUtMDItMDk6IG1pc2hhcwogICAgICAgICAgICBbR29dIEZpeCAlaW1wb3J0IG9mIGZpbGVzIGluIHN1YiBkaXJlY3Rvcmllcy4KCjIwMTUtMDItMDU6IGlhbmxhbmNldGF5bG9yCiAgICAgICAgICAgIFtHb10gSWdub3JlIEdvIHNwZWNpZmljIHR5cGUgbWFwcyAoZ29pbiwgZ29vdXQsIGV0Yy4pIGlmIHRoZXkgYXJlIGVtcHR5LgoKMjAxNS0wMi0wNTogaWFubGFuY2V0YXlsb3IKICAgICAgICAgICAgW0dvXSBHZW5lcmF0ZWQgR28gY29kZSBubyBsb25nZXIgY2FsbHMgX3N3aWdfZ29hbGxvY2F0ZSBvcgogICAgICAgICAgICBfc3dpZ19tYWtlZ29zdHJpbmcsIGFzIHRoZXkgd2lsbCBubyBsb25nZXIgd29yayBhcyBvZiBHbyAxLjUuCgpWZXJzaW9uIDMuMC41ICgzMSBKYW4gMjAxNSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDE1LTAxLTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggUHl0aG9uIC1jbGFzc2ljIGFuZCBwcm9wZXJ0eSBzZXR0aW5nLiBTZXR0aW5nIHByb3BlcnRpZXMgb24gY2xhc3NpYyBjbGFzc2VzCiAgICAgICAgICAgIHdhcyBicm9rZW4gaW4gc3dpZy0zLjAuMyBieSBhdHRlbXB0aW5nIHRvIHVzZSBfX3NldGF0dHJfXy4gVGhpcyByZWdyZXNzaW9uIGlzIGZpeGVkIG5vdwogICAgICAgICAgICBieSB1c2luZyBfX2RpY3RfXyBhZ2FpbiB3aGVuIHVzaW5nIC1jbGFzc2ljLgogICAgICAgICAgICBGaXhlcyBwYXRjaCAjMjMyLgoKMjAxNS0wMS0yNzogc21hcmNoZXR0bwoJICAgIFtTY2lsYWJdIFN1cHBvcnQgZm9yIHRoZSBTY2lsYWIgbGFuZ3VhZ2UgaGFzIGJlZW4gYWRkZWQKCjIwMTUtMDEtMjM6IG9sbHkKCSAgICBbUEhQXSBXaGVuIHdyYXBwaW5nIGEgcmV0dXJuZWQgcmVzb3VyY2UgYXMgYW4gb2JqZWN0LCBjaGVjayBpZiBhbGwKCSAgICBjYXNlcyB3cmFwIGl0IGluIHRoZSBzYW1lIGNsYXNzLCBhbmQgaWYgc28gZWxpbWluYXRlIHRoZSBwb2ludGxlc3MKCSAgICBzd2l0Y2ggc3RhdGVtZW50IHdyYXBwZXIgd2UgcHJldmlvdXNseSBnZW5lcmF0ZWQuCgoyMDE1LTAxLTIyOiB3c2Z1bHRvbgogICAgICAgICAgICBbT2N0YXZlXSBNZXJnZSBwYXRjaCAjMjk3IGZvciBTRiBidWcgIzEyNzcgLSBPY3RhdmUgc2hhcmVkX3B0ciBzdXBwb3J0CgoyMDE1LTAxLTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBNZXJnZSBwYXRjaCAjMjUwIC0gRml4ZXMgZm9yIHVzaW5nICVjb25zdGFudCBhbmQgb2JqZWN0cyAobm9uLXByaW1pdGl2ZSB0eXBlcykKCjIwMTUtMDEtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIyBHb10gTWVyZ2UgcGF0Y2ggIzMwOCBhbmQgZml4ICMzMDcgLSBDKysxMSBzdHJvbmdseSB0eXBlZCBlbnVtIHN1cHBvcnQKICAgICAgICAgICAgaW4gZGlyZWN0b3JzCgoyMDE1LTAxLTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBTZWNvbmQgZml4IGZvciAjMjk0ICMyOTYgLSBSZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gU1dJRy0zLjAuMyB3aGVuCiAgICAgICAgICAgIHdyYXBwaW5nIGZ1bmN0aW9ucyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzLCB0aGlzIHRpbWUgd2hlbiB1c2luZyBrd2FyZ3MuCgpWZXJzaW9uIDMuMC40ICgxNCBKYW4gMjAxNSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDE1LTAxLTEyOiBvbGx5CgkgICAgW1BIUF0gRml4IHNlZ2ZhdWx0IGluIGRpcmVjdG9yIHVwY2FsbCBjaGVjayB3aGVuIHVzaW5nIFBIUCBidWlsdCB3aXRoCgkgICAgWlRTIGVuYWJsZWQuICBGaXhlcyAjMTU1LCByZXBvcnRlZCBieSBQaWVycmUgTGFiYXN0aWUuCgoyMDE1LTAxLTEyOiB2YWR6CiAgICAgICAgICAgIFtQeXRob25dIEZpeCAjMjk0ICMyOTYgLSBSZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gU1dJRy0zLjAuMyB3aGVuCiAgICAgICAgICAgIHdyYXBwaW5nIGZ1bmN0aW9ucyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzLiBJbnZhbGlkIG9yIG1pc3NpbmcgZGVmYXVsdAogICAgICAgICAgICBhcmd1bWVudHMgd2VyZSBzb21ldGltZXMgYmVpbmcgZ2VuZXJhdGVkIGludG8gdGhlIHB5dGhvbiBsYXllci4KCjIwMTUtMDEtMDg6IG9sbHkKCSAgICBBbGxvdyBDKysxMSAiZXhwbGljaXQgY29uc3RleHByIi4gIEZpeGVzIGdpdGh1YiBpc3N1ZSAjMjg0IHJlcG9ydGVkCgkgICAgYnkgUGF3ZWwgVG9tdWxpay4gIEFsc28gaGFuZGxlICJjb25zdGV4cHIgZXhwbGljaXQiIGFuZCAiY29uc3RleHByCgkgICAgc3RhdGljIi4KCjIwMTUtMDEtMDg6IG9sbHkKCSAgICBXaGVuIHJlcG9ydGluZyBhbiBlcnJvciBmb3IgYSBjb25zdHJ1Y3Qgd2hpY2ggaGFzbid0IGJlZW4KCSAgICB0ZXJtaW5hdGVkIHdoZW4gdGhlIGVuZCBvZiB0aGUgZmlsZSBpcyByZWFjaGVkLCByZXBvcnQgaXQgYXQgdGhlCgkgICAgc3RhcnQgbGluZSByYXRoZXIgdGhhbiAiRU9GIiBhcyB0aGVuIHRvb2xzIGxpa2UgZWRpdG9ycyBhbmQgSURFcwoJICAgIHdpbGwgdGFrZSB5b3UgdG8gYSBnZW5lcmFsbHkgbW9yZSB1c2VmdWwgcGxhY2UgZm9yIGZpeGluZyB0aGUKCSAgICBwcm9ibGVtLgoKMjAxNS0wMS0wODogb2xseQoJICAgIEltcHJvdmUgZXJyb3IgbWVzc2FnZXMgZm9yIGEgZmV3IGNhc2VzIHdoaWNoIHByZXZpb3VzbHkgZ2F2ZSB0aGUKCSAgICBvbmUgb2YgdGhlIGNyeXB0aWMgY2F0Y2gtYWxsIGVycm9ycyAiU3ludGF4IGVycm9yIGluIGlucHV0Ii4KCjIwMTUtMDEtMDg6IG9sbHkKCSAgICBQcm92aWRlIC1jcHBleHQgYXMgYSBnZW5lcmFsIGNvbW1hbmQgbGluZSBvcHRpb24gZm9yIHNldHRpbmcgdGhlCgkgICAgZXh0ZW5zaW9uIHVzZWQgZm9yIGdlbmVyYXRlZCBDKysgZmlsZXMgKHByZXZpb3VzbHkgaXQgd2FzIHNwZWNpZmljCgkgICAgdG8gdGhlIFBIUCBiYWNrZW5kKS4gIERlcHJlY2F0ZSB0aGUgZXF1aXZhbGVudCAtc3VmZml4IG9wdGlvbgoJICAgIHByb3ZpZGVkIGJ5IHRoZSBPY2FtbCBiYWNrZW5kLCBidXQgY29udGludWUgdG8gc3VwcG9ydCB0aGF0IGZvcgoJICAgIG5vdy4KClZlcnNpb24gMy4wLjMgKDMwIERlYyAyMDE0KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTQtMTItMjc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMjgwIC0gYWJvcnQgdXNpbmcgYWxsIGRlZmF1bHQgdGVtcGxhdGUgcGFyYW1ldGVycyB3aXRoaW4gb3RoZXIgdGVtcGxhdGUKICAgICAgICAgICAgcGFyYW1ldGVycy4KCjIwMTQtMTItMjc6IHRhbGJ5CiAgICAgICAgICAgIFtQZXJsXSBJc3N1ZSAjMjgyIHBlcmw1IGFyY2hsaWIgdnMgYXJjaGxpYmV4cAogICAgICAgICAgICBbUGVybF0gdGlkeSAid2FybmluZzogZHVwbGljYXRlICdleHRlcm4nIGRlY2xhcmF0aW9uIHNwZWNpZmllciIgd2hlbiBidWlsZGluZyBnZW5lcmF0ZWQgY29kZQogICAgICAgICAgICB1bmRlciBjbGFuZwoKMjAxNC0xMi0xODogd3NmdWx0b24KICAgICAgICAgICAgQWRkIHN1cHBvcnQgZm9yICVjb25zdGFudCBhbmQgc3RydWN0cy9jbGFzc2VzIC0gaXNzdWUgIzI3MgoKMjAxNC0xMi0wOTogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMyNDUgLSByZWdyZXNzaW9uIChzaW5jZSBzd2lnLTMuMC4wKSBpbiB0ZW1wbGF0ZWQgY29uc3RydWN0b3JzLgogICAgICAgICAgICBUZW1wbGF0ZWQgY29uc3RydWN0b3JzIGNvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQgLSB0aGV5IHdlcmUgaW5jb3JyZWN0bHkgaWdub3JlZCB3aXRoIGEgd2FybmluZyA1MDQ6CiAgICAgICAgICAgICJGdW5jdGlvbjogeHl6IG11c3QgaGF2ZSBhIHJldHVybiB0eXBlLiBJZ25vcmVkLiIKCjIwMTQtMTItMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBzdXBwb3J0IGZvciBDKysxMSBzdHJvbmdseSB0eXBlZCBlbnVtZXJhdGlvbnMuCgoyMDE0LTExLTIxOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSBDI10gRml4IG11bHRpcGx5IGRlZmluZWQgZXJyb3Igd2hlbiB1c2luZyAlcmVuYW1lIG9mIGVudW0gaXRlbXMgd2hlbiB1c2luZyB0aGUgInNpbXBsZSBlbnVtIgogICAgICAgICAgICB3cmFwcGVycy4KCjIwMTQtMTAtMjg6IHZhZHoKICAgICAgICAgICAgW1B5dGhvbl0gUGF0Y2ggIzIwMSBUaGUgZ2VuZXJhdGVkIC5weSBmaWxlIG5vIGxvbmdlciB1c2VzICphcmdzIGZvciBhbGwgUHl0aG9uIHBhcmFtZXRlcnMuCiAgICAgICAgICAgIEluc3RlYWQsIHRoZSBwYXJhbWV0ZXJzIGFyZSBuYW1lZCB1c2luZyB0aGUgQysrIHBhcmFtZXRlciBuYW1lcy4KCiAgICAgICAgICAgICJjb21wYWN0ZGVmYXVsdGFyZ3MiIGZlYXR1cmUgY2FuIGJlIGVuYWJsZWQgdG8gcmVzdG9yZSB0aGUgb2xkIGJlaGF2aW91ci4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxNC0xMC0yNDogdGltb3RoZWVjb3VyCiAgICAgICAgICAgIFtEXSBQYXRjaCAjMjA0IFVzZSBjb3JlLmF0b21pYy5hdG9taWNPcCB0byBtdXRhdGUgc2hhcmVkIHZhcmlhYmxlcwoKMjAxNC0xMC0yMTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGlzc3VlICMyNDIgLSBVc2Ugb2YgdGhlICJrd2FyZ3MiIGZlYXR1cmUgbm8gbG9uZ2VyIGF1dG9tYXRpY2FsbHkgdHVybnMgb24gdGhlCiAgICAgICAgICAgICJjb21wYWN0ZGVmYXVsdGFyZ3MiIGZlYXR1cmUgaWYgdGhlIHRhcmdldCBsYW5ndWFnZSBkb2VzIG5vdCBzdXBwb3J0IGt3YXJncy4KICAgICAgICAgICAgT25seSBKYXZhIGFuZCBSdWJ5IHN1cHBvcnQga3dhcmdzLCBzbyB0aGlzIGFmZmVjdHMgYWxsIHRoZSBvdGhlciBsYW5ndWFnZXMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDE0LTEwLTEwOiBkaW9yY2V0eQogICAgICAgICAgICBbUHl0aG9uXSBQYXRjaCAjMjMyIEZpeCBwcm9wZXJ0eSBhY2Nlc3MgdXNpbmcgZGlyZWN0b3JzCgoyMDE0LTEwLTA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXhlcyB3aGVuIHVzaW5nIC1idWlsdGluIGFuZCBzdGQ6OnZlY3Rvci9zdGQ6Omxpc3Qgd3JhcHBlcnMgdG8gYWxsb3cgZGVsZXRpb24KICAgICAgICAgICAgb2Ygc2luZ2xlIGVsZW1lbnRzLCBzdWNoIGFzICdkZWwgdmVjWzBdJy4KCjIwMTQtMDktMzA6IG9saXZlcmIKICAgICAgICAgICAgW0phdmFzY3JpcHRdIE1lcmdlIHBhdGNoICMyMTYgYnkgUmljaGllNzY1IC0gQWRkZWQgc3VwcG9ydCBmb3IgbWFueSB2ZXJzaW9ucyBvZiB2OCBqYXZhc2NyaXB0LgoKMjAxNC0wOS0zMDogb2xpdmVyYgogICAgICAgICAgICBbSmF2YXNjcmlwdF0gTWVyZ2UgcGF0Y2ggIzE5NSBieSB6aXR0aXggLSBGaXhlZCBKU0NsYXNzUmVmIGRlY2xhcmF0aW9uIG5vdCB1c2luZyB0aGUgc3RhdGljIG9uZS4KCjIwMTQtMDktMzA6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBJbiBjb25maWd1cmUgc2NyaXB0LCByZXF1aXJlIEdvIDEuMSBvciBsYXRlci4KCjIwMTQtMDktMzA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIFBhdGNoICMyMDcgLSBGaXggTm8gbW9kdWxlIGVycm9yIHdpdGggLXJlbGF0aXZlaW1wb3J0IHdoZW4gdXNpbmcgc2luZ2xlCiAgICAgICAgICAgIGhlYWRlciBmaWxlIGltcG9ydC4KCjIwMTQtMDktMjc6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoICMyMDggLSBJbml0aWFsaXNlIG5ld2x5IGNyZWF0ZWQgYXJyYXkgd2hlbiB1c2luZyBhcnJheV9mdW5jdGlvbnMgaW4gdGhlCiAgICAgICAgICAgIGNhcnJheXMuaSBsaWJyYXJ5IChDKysgdXNhZ2UpLgoKMjAxNC0wOS0yNzogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIFBhdGNoICMxODcgLSBGaXggY3Jhc2ggb24gc2h1dGRvd24gb2YgdGhlIFJ1YnkgaW50ZXJwcmV0ZXIgaWYgbW9yZSB0aGFuIG9uZQogICAgICAgICAgICBtb2R1bGUgd2FzIGxvYWRlZCBhdCBhIHRpbWUgd2hlbiBkYXRhIGlzIGJlaW5nIHNoYXJlZCBiZXR3ZWVuIG1vZHVsZXMuCgoyMDE0LTA5LTI3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUGF0Y2ggIzE2OCAtIEZpeCBsZWFrIGluIEphdmEgZGlyZWN0b3Igc3RyaW5nIGhhbmRsaW5nIGFmdGVyIHRoZSBKYXZhCiAgICAgICAgICAgIHVwY2FsbCB3aGVuIGNhbGxlZCBmcm9tIGEgbmF0aXZlIHRocmVhZC4KCjIwMTQtMDktMjU6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBBZGp1c3QgZ2VuZXJhdGVkIGNvZGUgdG8gd29yayB3aXRoIHVwY29taW5nIEdvIDEuNAoJICAgIHJlbGVhc2UuCgoyMDE0LTA5LTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBZGQgcGF0Y2ggZnJvbSBUaG9tYXMgTWFzbGFjaCB0byBmaXggY3Jhc2ggaW4gd3JhcHBlcnMgd2hlbiB1c2luZyAtdGhyZWFkcyBpbgogICAgICAgICAgICB0aGUgU1RMIGl0ZXJhdG9ycyAoU3dpZ1B5SXRlcmF0b3IgZGVzdHJ1Y3RvcikuCgoyMDE0LTA5LTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIE1lcmdlIHBhdGNoICMyMjkgZnJvbSBjb250cmUgLSBBZGQgYm9vbCBhcnJheSB0eXBlcyB0byBhcnJheXNfY3NoYXJwLmkKCjIwMTQtMDktMTI6IG9sbHkKCSAgICBbUEhQXSBBZGQgc3VwcG9ydCBmb3Igc3BlY2lmeWluZyBhbnkgUEhQIGludGVyZmFjZXMgYSB3cmFwcGVkIGNsYXNzCgkgICAgaW1wbGVtZW50cywgZS5nLjogJXR5cGVtYXAoInBocGludGVyZmFjZXMiKSBNeUl0ZXJhdG9yICJJdGVyYXRvciI7CgoyMDE0LTA5LTExOiBvbGx5CgkgICAgW1BIUF0gRml4IHRocm93aW5nIGEgUEhQIGV4Y2VwdGlvbiB0aHJvdWdoIEMrKyBmcm9tIGEgc3ViY2xhc3NlZAoJICAgIGRpcmVjdG9yIG1ldGhvZCAtIFBIUCBOVUxMIGdldHMgcmV0dXJuZWQgYnkgdGhlIHN1YmNsYXNzZWQgbWV0aG9kCgkgICAgaW4gdGhpcyBjYXNlLCBzbyB0aGUgZGlyZWN0b3JvdXQgdHlwZW1hcCBuZWVkcyB0byBhbGxvdyB0aGF0IChhdAoJICAgIGxlYXN0IGlmIGFuIGV4Y2VwdGlvbiBpcyBhY3RpdmUpLgoKMjAxNC0wOS0wOTogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIEFkZCBnb2FyZ291dCB0eXBlbWFwLgoKMjAxNC0wOS0wOTogb2xseQoJICAgIFtQSFBdIEZpeCBzZWdtZW50YXRpb24gZmF1bHRzIHdpdGggZGlyZWN0b3JzIGluIFBIUCA+PSA1LjQsIGFuZAoJICAgIHJlZW5hYmxlIHJ1bm1lIHRlc3RzIGZvciBkaXJlY3Rvcl9iYXNpYyB0ZXN0Y2FzZS4gIEZpeCBmcm9tCgkgICAgcGF2ZWwtY2hhcnZhdCBpbiBpc3N1ZSMxNjQuCgoyMDE0LTA5LTA1OiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gQWRkIGltdHlwZSwgZ29pbiwgZ29vdXQsIGdvZGlyZWN0b3JpbiwgYW5kCgkgICAgZ29kaXJlY3Rvcm91dCB0eXBlbWFwcywgdG8gc3VwcG9ydCB3cml0aW5nIEdvIGNvZGUgdG8KCSAgICBjb252ZXJ0IGJldHdlZW4gdHlwZXMuCgoyMDE0LTA5LTAyOiBvbGx5CgkgICAgW1B5dGhvbl0gRml4IHJlZ3Jlc3Npb24gaW4gaW5kZW50YXRpb24gb2YgcHl0aG9uIGNvZGUgcHJvZHVjZWQgd2l0aAoJICAgIC1tb2Rlcm4sIGludHJvZHVjZWQgYnkgY2hhbmdlcyBpbiAjMTg4LiAgUmVwb3J0ZWQgYnkgZmFiaWVuY2FzdGFuCgkgICAgaW4gIzIxOC4KCjIwMTQtMDktMDE6IG9sbHkKCSAgICBJc3N1ZSBhbiBlcnJvciBmb3IgdW5rbm93biBTV0lHIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzLCByYXRoZXIKCSAgICB0aGFuIHF1aWV0bHkgaWdub3JpbmcgdGhlbS4gIFJlcG9ydGVkIGJ5IGpyaGVsc2V5IGluIGlzc3VlIzIxNy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjIwMTQtMDgtMTU6IHRhbGJ5CiAgICAgICAgICAgIFtQZXJsXSBJbmNsdWRlIGd1YXJkIGZpeCBmb3IgbmVzdGVkIG1vZHVsZXMgZnJvbSBBbnRob255IEhlYWRpbmcgKFNGIFBhdGNoICMzNTApLgoKMjAxNC0wOC0wNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBNZXJnZSBwYXRjaCAjMjAwIGZyb20gZ3BldHJvdSAtIENoYW5nZWQgQ1NoYXJwIGxpY2Vuc2UgaGVhZGVyIHRvIGluY2x1ZGUgYXV0by1nZW5lcmF0ZWQKICAgICAgICAgICAgdGFnIHNvIHRoYXQgU3R5bGVDb3AgaWdub3JlcyB0aGUgZmlsZXMuCgoyMDE0LTA4LTA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gTWVyZ2UgcGF0Y2ggIzE5OCBmcm9tIFl1dmFsIEthc2h0YW4gLSBTdXBwb3J0IGZvciBqYXZhLm5pby5CeXRlQnVmZmVyIG1hcHBpbmcgdG8KICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqIGluIHZhcmlvdXMuaSBpbiBOSU9CVUZGRVIgdHlwZW1hcHMuCgoyMDE0LTA3LTE0OiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gQ2hhbmdlIHN0cnVjdCBkZWZpbml0aW9uIHRvIHVzZSB2b2lkICosIG5vdCB1aW50OCwgc28KCSAgICB0aGF0IHRoZSB0eXBlIGlzIHJlY29yZGVkIGFzIHBvc3NpYmx5IGNvbnRhaW5pbmcKCSAgICBwb2ludGVycy4gIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSAxLjMgZ2FyYmFnZSBjb2xsZWN0b3IKCSAgICBkb2VzIG5vdCBjb2xsZWN0IHBvaW50ZXJzIHBhc3NlZCB0byBDKysgY29kZS4KCjIwMTQtMDctMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBTRiBCdWcgIzEzNzUgLSBFeHBhbnNpb24gb2YgdGhlICRwYXJlbnRjbGFzc25hbWUgc3BlY2lhbCB2YXJpYWJsZSBpbmNvcnJlY3RseSBjb250YWlucwogICAgICAgICAgICBicmFja2V0cyBpbiB0aGUgZXhwYW5kZWQgbmFtZS4KClZlcnNpb24gMy4wLjIgKDQgSnVuIDIwMTQpCj09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDE0LTA2LTAyOiB2LWZvci12YW5kYWwKICAgICAgICAgICAgW0x1YV0gUHVsbCByZXF1ZXN0ICMxNzY6CiAgICAgICAgICAgIElmIGNsYXNzIGhhcyBubyBfX2VxIGltcGxlbWVudGVkLCB0aGVuIGRlZmF1bHQgX19lcSBpcyBnZW5lcmF0ZWQuIAogICAgICAgICAgICBEZWZhdWx0IF9fZXEgY29tcGFyZXMgYWN0dWFsIHBvaW50ZXJzIHN0b3JlZCBpbnNpZGUgTHVhIHVzZXJkYXRhLgoKMjAxNC0wNi0wMjogdmthbGluaW4KICAgICAgICAgICAgRml4ICMxODMgLSAlZXh0ZW5kIGFuZCB1bm5hbWVkIG5lc3RlZCBzdHJ1Y3RzCgoyMDE0LTA1LTI4OiBrd3dldHRlCiAgICAgICAgICAgIEZpeCBpbnN0YWxsIGZhaWx1cmUgd2hlbiB1c2luZyBhbiAnb3V0IG9mIHNvdXJjZScgYnVpbGQgdXNpbmcgdGhlIHNoaXBwZWQKICAgICAgICAgICAgdGFyYmFsbCAtIHJlZ3Jlc3Npb24gaW50cm9kdWNlZCBpbiBzd2lnLTMuMC4xLgoKMjAxNC0wNS0yNDoga3d3ZXR0ZQogICAgICAgICAgICBbT2N0YXZlXSBSZW1vdmUgZGVwcmVjYXRlZCAtZ2xvYmFsLy1ub2dsb2JhbCBjb21tYW5kLWxpbmUgYXJndW1lbnRzCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgpWZXJzaW9uIDMuMC4xICgyNyBNYXkgMjAxNCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDE0LTA1LTI1OiBoZmFsY2ljCgkgICAgW1B5dGhvbl0gUHl0aG9uIDMgYnl0ZSBzdHJpbmcgb3V0cHV0OiB1c2UgZXJyb3JzPSJzdXJyb2dhdGVlc2NhcGUiCiAgICAgICAgICAgIGlmIGF2YWlsYWJsZSBvbiB0aGUgdmVyc2lvbiBvZiBQeXRob24gdGhhdCdzIGluIHVzZS4gVGhpcyBhbGxvd3MKICAgICAgICAgICAgb2J0YWluaW5nIHRoZSBvcmlnaW5hbCBieXRlIHN0cmluZyAoYW5kIHBvdGVudGlhbGx5IHRyeWluZyBhIGZhbGxiYWNrCiAgICAgICAgICAgIGVuY29kaW5nKSBpZiB0aGUgYnl0ZXMgY2FuJ3QgYmUgZGVjb2RlZCBhcyBVVEYtOC4KCiAgICAgICAgICAgIFByZXZpb3VzbHksIGEgVW5pY29kZURlY29kZUVycm9yIHdvdWxkIGJlIHJhaXNlZCB3aXRoIG5vIHdheSB0byB0cmVhdAogICAgICAgICAgICB0aGUgZGF0YSBhcyBieXRlcyBvciB0cnkgYW5vdGhlciBjb2RlYy4KCjIwMTQtMDUtMTg6IHZrYWxpbmluCgkgICAgQnVnICMxNzUgLSBSZXN0b3JlICVleHRlbmQgdG8gd29yayBmb3IgdW5uYW1lZCBuZXN0ZWQgc3RydWN0dXJlcyBieSB1c2luZyBhIEMKICAgICAgICAgICAgc3ltYm9sIGNvbXByaXNpbmcgdGhlIG91dGVyIHN0cnVjdHVyZSBuYW1lIGFuZCB1bm5hbWVkIHZhcmlhYmxlIGluc3RhbmNlIG5hbWUuCgoyMDE0LTA1LTE1OiBrd3dldHRlCgkgICAgQWRkICMxNjYgLSAnbWFrZSBjaGVjaycgbm93IHdvcmtzIG91dCBvZiBzb3VyY2UuIFRoaXMgcmVxdWlyZWQgdGhlIGV4YW1wbGVzIHRvIGJ1aWxkCiAgICAgICAgICAgIG91dCBvZiBzb3VyY2UuIFRoZSBtYWluIGxhbmd1YWdlcyBoYXZlIGJlZW4gdGVzdGVkIC0gQyMsIEdvLCBHdWlsZSwgSmF2YSwgSmF2YXNjcmlwdCwKICAgICAgICAgICAgTHVhLCBPY3RhdmUsIFBlcmwsIFBIUCwgUHl0aG9uLCBSdWJ5IGFuZCBUY2wuCgoyMDE0LTA1LTAxOiBPbGl2ZXIgQnVjaHRhbGEKCSAgICBKYXZhc2NyaXB0IHN1cHBvcnQgYWRkZWQsIHNlZSBKYXZhc2NyaXB0IGNoYXB0ZXIgaW4gdGhlIGRvY3VtZW50YXRpb24uCgoyMDE0LTA1LTAxOiBvbGx5CgkgICAgW1BIUF0gVGhlIGdlbmVyYXRlZCBfX2lzc2V0KCkgbWV0aG9kIG5vdyByZXR1cm5zIHRydWUgZm9yIHJlYWQtb25seSBwcm9wZXJ0aWVzLgoKMjAxNC0wNC0yNDoga3d3ZXR0ZQogICAgICAgICAgICBbR29dIEZpeCBnbyAuL2NvbmZpZ3VyZSBwYXJzaW5nIG9mIGdjY2dvIC0tdmVyc2lvbiwgYW5kCiAgICAgICAgICAgIGdvcnVudGltZS5zd2cgdHlwbyBpbiBfX0dOVUNfUEFUQ0hMRVZFTF9fIChTRiBCdWcgIzEyOTgpCgoyMDE0LTA0LTI0OiBrd3dldHRlCiAgICAgICAgICAgIEZpeCB7cHl0aG9ufHBlcmw1fHJ1Ynl8dGNsfS9qYXZhIGV4YW1wbGVzCgogICAgICAgICAgICBJbiBMaWIvZ2NqL2NuaS5pLCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5ld2VyIGdjaiB2ZXJzaW9uczoKCiAgICAgICAgICAgIC0gcmVtb3ZlIEp2QWxsb2NPYmplY3QoKSB3aGljaCBnY2ogbm8gbG9uZ2VyIGRlZmluZXMsIGZyb20gZ2NqIENoYW5nZWxvZzoKICAgICAgICAgICAgICAyMDA0LTA0LTE2ICBCcnljZSBNY0tpbmxheSAgPG1ja2lubGF5QHJlZGhhdC5jb20+CiAgICAgICAgICAgICAgICAqIGdjai9jbmkuaCAoSnZBbGxvY09iamVjdCk6IFJlbW92ZSB0aGVzZSBvYnNvbGV0ZSwKICAgICAgICAgICAgICAgIHVuZG9jdW1lbnRlZCBDTkkgY2FsbHMuCgogICAgICAgICAgICAtIGNoYW5nZSBKdkNyZWF0ZUphdmFWTSgpIGFyZ3VtZW50IGZyb20gdm9pZCogdG8gSnZWTUluaXRBcmdzKiwgZnJvbSBnY2ogQ2hhbmdlbG9nOgogICAgICAgICAgICAgIDIwMDUtMDItMjMgIFRob21hcyBGaXR6c2ltbW9ucyAgPGZpdHpzaW1AcmVkaGF0LmNvbT4KICAgICAgICAgICAgICBQUiBsaWJnY2ovMTY5MjMKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAoSnZDcmVhdGVKYXZhVk0pOiBEZWNsYXJlIHZtX2FyZ3MgYXMgSnZWTUluaXRBcmdzKiByYXRoZXIgdGhhbiB2b2lkKi4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjIwMTQtMDQtMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFNGIEJ1ZyAjMTM2NiAtIFJlbW92ZSBkdXBsaWNhdGUgZGVjbGFyYXRpb25zIG9mIHN0cnRvaW1heCBhbmQgc3RydG91bWF4IGluIGludHR5cGVzLmkKCjIwMTQtMDQtMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhIEMjXSBFbnVtcyB3aGljaCBoYXZlIGJlZW4gaWdub3JlZCB2aWEgJWlnbm9yZSBhbmQgYXJlIHN1YnNlcXVlbnRseQogICAgICAgICAgICB1c2VkIGFyZSBoYW5kbGVkIHNsaWdodGx5IGRpZmZlcmVudGx5LiBUeXBlIHdyYXBwZXIgY2xhc3NlcyBhcmUgbm93IGdlbmVyYXRlZAogICAgICAgICAgICB3aGljaCBhcmUgZWZmZWN0aXZlbHkgYSB3cmFwcGVyIG9mIGFuIGVtcHR5IGVudW0uIFByZXZpb3VzbHkgaW4gSmF2YSB1bmNvbXBpbGFibGUKICAgICAgICAgICAgY29kZSB3YXMgZ2VuZXJhdGVkIGFuZCBpbiBDIyBhbiBpbnQgd2FzIHVzZWQuCgoyMDE0LTA0LTA0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggcmVncmVzc2lvbiBpbiAzLjAuMCB3aGVyZSBsZWdhbCBjb2RlIGZvbGxvd2luZyBhbiBvcGVyYXRvcjw8IGRlZmluaXRpb24gbWlnaHQKICAgICAgICAgICAgZ2l2ZSBhIHN5bnRheCBlcnJvci4gU0YgQnVnICMxMzY1LgoKMjAxNC0wNC0wMzogb2xseQoJICAgIFtQSFBdIEZpeCB3cmFwcGluZyBkaXJlY3RvciBjb25zdHJ1Y3RvcnMgd2l0aCBkZWZhdWx0IHBhcmFtZXRlcnMKCSAgICB3aXRoIGEgWlRTLWVuYWJsZWQgYnVpbGQgb2YgUEhQLgoKMjAxNC0wNC0wMjogb2xseQoJICAgIFtQSFBdIFBhc3MgdGhlIFpUUyBjb250ZXh0IHdlIGFscmVhZHkgaGF2ZSB0byBhdm9pZCBuZWVkaW5nIHRvCgkgICAgY2FsbCBUU1JNTFNfRkVUQ0gsIHdoaWNoIGlzIHJlbGF0aXZlbHkgZXhwZW5zaXZlLgoKMjAxNC0wNC0wMjogb2xseQoJICAgIFtQSFBdIFBhc3MgWlRTIGNvbnRleHQgdGhyb3VnaCB0byB0X291dHB1dF9oZWxwZXIoKSBzbyBpdCB3b3JrcwoJICAgIHdpdGggYSBaVFMtZW5hYmxlZCBidWlsZCBvZiBQSFAuICBSZXBvcnRlZCBieSBQaWVycmUgTGFiYXN0aWUgaW4KCSAgICBnaXRodWIgUFIjMTU1LgoKMjAxNC0wMy0yODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEgQyMgRCBHb10gRml4ZXMgZm9yIEMgZW51bXMgdXNlZCBpbiBhbiBBUEkgYW5kIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBlbnVtCiAgICAgICAgICAgIGhhcyBub3QgYmVlbiBwYXJzZWQuIEZvciBELCB0aGlzIGZpeGVzIGEgc2VnZmF1bHQgaW4gU1dJRy4gVGhlIG90aGVyIGxhbmd1YWdlcwogICAgICAgICAgICBub3cgcHJvZHVjZSBjb2RlIHRoYXQgY29tcGlsZXMsIGFsdGhvdWdoIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBlbnVtIGlzIG5lZWRlZAogICAgICAgICAgICBpbiBvcmRlciB0byB1c2UgdGhlIGVudW0gcHJvcGVybHkgZnJvbSB0aGUgdGFyZ2V0IGxhbmd1YWdlLgoKMjAxNC0wMy0yMzogdi1mb3ItdmFuZGFsCiAgICAgICAgICAgIFtMdWFdIEZpeCBmb3IgdXNhZ2Ugb2Ygc25wcmludGYgaW4gTHVhIHJ1bnRpbWUgd2hpY2ggVmlzdWFsIFN0dWRpbyBkb2VzIG5vdCBoYXZlLgoKVmVyc2lvbiAzLjAuMCAoMTYgTWFyIDIwMTQpCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxNC0wMy0xNjogd3NmdWx0b24KICAgICAgICAgICAgQysrMTEgc3VwcG9ydCBpbml0aWFsbHkgZGV2ZWxvcGVkIGFzIEMrKzB4IHN1cHBvcnQgYnkgTWF0ZXZ6IEpla292ZWMgYXMgYSBHb29nbGUgU3VtbWVyIG9mIENvZGUKICAgICAgICAgICAgcHJvamVjdCBoYXMgYmVlbiBmdXJ0aGVyIGV4dGVuZGVkLiBUaGUgQysrMTEgc3VwcG9ydCBpcyBjb21wcmVoZW5zaXZlLCBidXQgYnkgbm8gbWVhbnMgY29tcGxldGUKICAgICAgICAgICAgb3Igd2l0aG91dCBsaW1pdGF0aW9ucy4gRnVsbCBkZXRhaWxzIGZvciBlYWNoIG5ldyBmZWF0dXJlIGluIEMrKzExIGlzIGNvdmVyZWQgaW4gdGhlCiAgICAgICAgICAgIENQbHVzUGx1czExLmh0bWwgY2hhcHRlciBpbiB0aGUgZG9jdW1lbnRhdGlvbiB3aGljaCBpcyBpbmNsdWRlZCBpbiBTV0lHIGFuZCBhbHNvIGF2YWlsYWJsZQogICAgICAgICAgICBvbmxpbmUgYXQgaHR0cDovL3d3dy5zd2lnLm9yZy9Eb2MzLjAvQ1BsdXNQbHVzMTEuaHRtbC4KCjIwMTQtMDMtMTQ6IHYtZm9yLXZhbmRhbAogICAgICAgICAgICBbTHVhXSBOdW1lcm91cyBMdWEgaW1wcm92ZW1lbnRzOgogICAgICAgICAgICAxLiAlbnNwYWNlIHN1cHBvcnQgaGFzIGJlZW4gYWRkZWQuIE5hbWVzcGFjZXMgYXJlIG1hcHBlZCB0byB0YWJsZXMgaW4gdGhlIG1vZHVsZSwgd2l0aCB0aGUgc2FtZQogICAgICAgICAgICAgICBuYW1lIGFzIHRoZSBDKysgbmFtZXNwYWNlLgogICAgICAgICAgICAyLiBJbmhlcml0YW5jZSBpcyBub3cgaGFuZGxlZCBkaWZmZXJlbnRseS4gRWFjaCBjbGFzcyBtZXRhdGFibGUga2VlcHMgYSBsaXN0IG9mIGNsYXNzIGJhc2VzIGluc3RlYWQKICAgICAgICAgICAgICAgb2YgbWVyZ2luZyBhbGwgbWVtYmVycyBvZiBhbGwgYmFzZXMgaW50byB0aGUgZGVyaXZlZCBjbGFzcy4KICAgICAgICAgICAgMy4gVGhlIG5ldyBtZXRhdGFibGVzIHJlc3VsdCBpbiBkaWZmZXJlbmNlcyBpbiBhY2Nlc3NpbmcgY2xhc3MgbWVtYmVycy4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICVtb2R1bGUgZXhhbXBsZQogICAgICAgICAgICAgICAgIHN0cnVjdCBUZXN0IHsKICAgICAgICAgICAgICAgICAgICAgZW51bSB7IFRFU1QxID0gMTAsIFRFU1QyID0gMjAgfTsKICAgICAgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludCBJQ09OU1QgPSAxMjsKICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICBOb3cgdGhpcyBjYW4gYmUgdXNlZCBhcyBmb2xsb3dzOgogICAgICAgICAgICAgICAgICAgcHJpbnQoZXhhbXBsZS5UZXN0LlRFU1QxKQogICAgICAgICAgICAgICAgICAgcHJpbnQoZXhhbXBsZS5UZXN0LklDT05TVCkKICAgICAgICAgICAgICAgICBUaGUgb2xkIHdheSB3YXM6CiAgICAgICAgICAgICAgICAgICBwcmludChleGFtcGxlLlRlc3RfVEVTVDEpCiAgICAgICAgICAgICAgICAgICBwcmludChleGFtcGxlLlRlc3RfSUNPTlNUKQoKICAgICAgICAgICAgNC4gVGhlIHNwZWNpYWwgY2xhc3MgbWV0YXRhYmxlIG1lbWJlciAiLmNvbnN0cnVjdG9yIiB3YXMgcmVtb3ZlZC4gTm93IFNXSUcgZ2VuZXJhdGVzIHRoZSBwcm94eQogICAgICAgICAgICAgICBmdW5jdGlvbiBieSBpdHNlbGYgYW5kIGFzc2lnbnMgaXQgZGlyZWN0bHkgdG8gdGhlIGNsYXNzIHRhYmxlICJfX2NhbGwiIG1ldGhvZC4KICAgICAgICAgICAgNS4gZUx1YSBzaG91bGQgYWxzbyBub3cgc3VwcG9ydCBpbmhlcml0YW5jZS4KICAgICAgICAgICAgNi4gJ2NvbnN0JyBzdWJ0YWJsZSBpbiBlTHVhIGlzIGNvbnNpZGVyZWQgZGVwcmVjYXRlZC4KCiAgICAgICAgICAgIENoYW5nZXMgaW4gYmVoYXZpb3VyOgogICAgICAgICAgICBhLiBZb3UgY2FuIG5vIGxvbmdlciBhc3NpZ24gdG8gbm9uLWV4aXN0aW5nIGNsYXNzIG1lbWJlcnMgaW4gY2xhc3NlcyB3aXRob3V0IGEgX19zZXRpdGVtX18gbWV0aG9kLgogICAgICAgICAgICAgICBJdCB3aWxsIGNhdXNlIGEgTHVhIGVycm9yLgogICAgICAgICAgICBiLiBZb3UgY2FuIG5vIGxvbmdlciBpdGVyYXRlIG92ZXIgYSBtb2R1bGUgdGFibGUgYW5kIGNvcHkgZXZlcnl0aGluZyBpbnRvIHRoZSBnbG9iYWwgbmFtZXNwYWNlLgogICAgICAgICAgICAgICBBY3R1YWxseSwgdGhpcyB3YXMgbmV2ZXIgdGhlIGNhc2UsIGJ1dCBpdCBpcyBub3cgZXhwbGljaXRseSBwcm9oaWJpdGVkLgogICAgICAgICAgICBjLiBOb3cgY2hhbmdpbmcgYSBiYXNlIGNsYXNzIHdpbGwgaW1tZWRpYXRlbHkgYWZmZWN0IGFsbCBkZXJpdmVkIGNsYXNzZXMuCiAgICAgICAgICAgIGQuIFRoZXJlIG1pZ2h0IGJlIHNvbWUgaXNzdWVzIHdpdGggaW5oZXJpdGFuY2UuIEFsdGhvdWdoIHRoZSBiYXNlcyBpdGVyYXRpb24gc2NoZW1lIGlzIHRoZSBzYW1lCiAgICAgICAgICAgICAgIGFzIHdhcyB1c2VkIGZvciBtZXJnaW5nIGJhc2UgY2xhc3NlcyBpbnRvIGRlcml2ZWQgb25lLCBzb21lIHVua25vd24gaXNzdWVzIG1heSBhcmlzZS4KCiAgICAgICAgICAgIFRoZSBvbGQgbWV0YXRhYmxlIGJlaGF2aW91ciBjYW4gYmUgcmVzdG9yZWQgYnkgdXNpbmcgdGhlIC1uby1vbGQtbWV0YXRhYmxlLWJpbmRpbmdzIG9wdGlvbi4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjIwMTQtMDMtMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIENoYW5nZSBpbiBkZWZhdWx0IGJlaGF2aW91ciB3cmFwcGluZyBDKysgYm9vbC4gT25seSBhIFB5dGhvbiBUcnVlIG9yIEZhbHNlCiAgICAgICAgICAgIHdpbGwgbm93IHdvcmsgZm9yIEMrKyBib29sIHBhcmFtZXRlcnMuIFRoaXMgZml4ZXMgb3ZlcmxvYWRpbmcgYm9vbCB3aXRoIG90aGVyIHR5cGVzLgogICAgICAgICAgICBQeXRob24gMi4zIG1pbmltdW0gaXMgbm93IHJlcXVpcmVkIGZvciB3cmFwcGluZyBib29sLgoKICAgICAgICAgICAgV2hlbiB3cmFwcGluZzoKCiAgICAgICAgICAgICAgY29uc3QgY2hhciogb3ZlcmxvYWRlZChib29sIHZhbHVlKSB7IHJldHVybiAiYm9vbCI7IH0KICAgICAgICAgICAgICBjb25zdCBjaGFyKiBvdmVybG9hZGVkKGludCB2YWx1ZSkgeyByZXR1cm4gImludCI7IH0KCiAgICAgICAgICAgIFByZXZpb3VzIGJlaGF2aW91cjoKICAgICAgICAgICAgICA+Pj4gb3ZlcmxvYWRlZChGYWxzZSkKICAgICAgICAgICAgICAnaW50JwogICAgICAgICAgICAgID4+PiBvdmVybG9hZGVkKFRydWUpCiAgICAgICAgICAgICAgJ2ludCcKICAgICAgICAgICAgICA+Pj4gb3ZlcmxvYWRlZCgwKQogICAgICAgICAgICAgICdpbnQnCgogICAgICAgICAgICBOb3cgd2UgZ2V0IHRoZSBleHBlY3RlZCBiZWhhdmlvdXI6CiAgICAgICAgICAgICAgPj4+IG92ZXJsb2FkZWQoRmFsc2UpCiAgICAgICAgICAgICAgJ2Jvb2wnCiAgICAgICAgICAgICAgPj4+IG92ZXJsb2FkZWQoMCkKICAgICAgICAgICAgICAnaW50JwoKICAgICAgICAgICAgVGhlIGNvbnNlcXVlbmNlIGlzIHdoZW4gd3JhcHBpbmcgYm9vbCBpbiBub24tb3ZlcmxvYWRlZCBmdW5jdGlvbnM6CgogICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGJvb2xmdW5jdGlvbihib29sIHZhbHVlKSB7IHJldHVybiB2YWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSI7IH0KCiAgICAgICAgICAgIFRoZSBwcmV2aW91cyBiZWhhdmlvdXIgd2FzIHZlcnkgUHl0aG9uaWM6CiAgICAgICAgICAgICAgPj4+IGJvb2xmdW5jdGlvbigiIikKICAgICAgICAgICAgICAnZmFsc2UnCiAgICAgICAgICAgICAgPj4+IGJvb2xmdW5jdGlvbigiaGkiKQogICAgICAgICAgICAgICd0cnVlJwogICAgICAgICAgICAgID4+PiBib29sZnVuY3Rpb24oMTIuMzQpCiAgICAgICAgICAgICAgJ3RydWUnCiAgICAgICAgICAgICAgPj4+IGJvb2xmdW5jdGlvbigwKQogICAgICAgICAgICAgICdmYWxzZScKICAgICAgICAgICAgICA+Pj4gYm9vbGZ1bmN0aW9uKDEpCiAgICAgICAgICAgICAgJ3RydWUnCgogICAgICAgICAgICBOb3cgdGhlIG5ldyBiZWhhdmlvdXIgbW9yZSBhbG9uZyB0aGUgbGluZXMgb2YgQysrIGR1ZSB0byBzdHJpY3RlciB0eXBlIGNoZWNraW5nLiBUaGUKICAgICAgICAgICAgYWJvdmUgY2FsbHMgcmVzdWx0IGluIGFuIGV4Y2VwdGlvbiBhbmQgbmVlZCB0byBiZSBleHBsaWNpdGx5IGNvbnZlcnRlZCBpbnRvIGEgYm9vbCBhcwogICAgICAgICAgICBmb2xsb3dzOgogICAgICAgICAgICAgID4+PiBib29sZnVuY3Rpb24oMCkKICAgICAgICAgICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAgICAgICAgICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA8bW9kdWxlPgogICAgICAgICAgICAgIFR5cGVFcnJvcjogaW4gbWV0aG9kICdib29sZnVuY3Rpb24nLCBhcmd1bWVudCAxIG9mIHR5cGUgJ2Jvb2wnCiAgICAgICAgICAgICAgPj4+IGJvb2xmdW5jdGlvbihib29sKDApKQogICAgICAgICAgICAgICdmYWxzZScKCiAgICAgICAgICAgIFRoZSBvbGQgYmVoYXZpb3VyIGNhbiBiZSByZXN1cnJlY3RlZCBieSBwYXNzaW5nIHRoZSAtRFNXSUdfUFlUSE9OX0xFR0FDWV9CT09MIGNvbW1hbmQgbGluZQogICAgICAgICAgICBwYXJhbWV0ZXIgd2hlbiBleGVjdXRpbmcgU1dJRy4gVHlwZW1hcHMgY2FuIG9mIGNvdXJzZSBiZSB3cml0dGVuIHRvIGN1c3RvbWlzZSB0aGUgYmVoYXZpb3VyCiAgICAgICAgICAgIGZvciBzcGVjaWZpYyBwYXJhbWV0ZXJzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMjAxNC0wMy0wNjogd3NmdWx0b24KCSAgICBGaXggU0YgQnVnICMxMzYzIC0gUHJvYmxlbSB3aXRoIG1ldGhvZCBvdmVybG9hZGluZyB3aGVuIHNvbWUgbWV0aG9kcyBhcmUgYWRkZWQgYnkgJWV4dGVuZAogICAgICAgICAgICBhbmQgb3RoZXJzIGFyZSByZWFsIG1ldGhvZHMgYW5kIHVzaW5nIHRlbXBsYXRlIGRlZmF1bHQgcGFyYW1ldGVycyB3aXRoIHNtYXJ0IHBvaW50ZXJzLgogICAgICAgICAgICBUaGlzIGlzIG5vdGljZWFibGUgYXMgYSByZWdyZXNzaW9uIHNpbmNlIDIuMC4xMiB3aGVuIHVzaW5nIHRoZSBkZWZhdWx0IHNtYXJ0IHBvaW50ZXIKICAgICAgICAgICAgaGFuZGxpbmcgZm9yIHNvbWUgbGFuZ3VhZ2VzIHdoZW4gdGhlIHNtYXJ0IHBvaW50ZXIgd3JhcHMgc3RkOjptYXAgYW5kIG90aGVyIFNUTCBjb250YWluZXJzLgoKMjAxNC0wMy0wMjogd3NmdWx0b24KCSAgICBbUHl0aG9uXSBTRiBQYXRjaCAjMzQ2IGZyb20gSmVucyBLcnVlZ2VyLiBDb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gYXR0ZW1wdGluZyB0bwogICAgICAgICAgICBhY2Nlc3MgYSBub24tZXhpc3RlbnQgQy9DKysgZ2xvYmFsIHZhcmlhYmxlIG9uIHRoZSAnY3Zhcicgb2JqZWN0LiBUaGUgZXhjZXB0aW9uIHRocm93bgogICAgICAgICAgICB1c2VkIHRvIGJlIGEgTmFtZUVycm9yLiBIb3dldmVyLCBhcyB0aGlzIGFjY2VzcyBpcyB2aWEgYSBwcmltYXJ5LCBhbiBBdHRyaWJ1dGVFcnJvcgogICAgICAgICAgICBpcyBtb3JlIGNvcnJlY3QgYW5kIHNvIHRoZSBleGNlcHRpb24gdGhyb3duIG5vdyBpcyBhbiBBdHRyaWJ1dGVFcnJvci4gUmVmZXJlbmNlOgogICAgICAgICAgICBodHRwOi8vZG9jcy5weXRob24ub3JnLzIvcmVmZXJlbmNlL2V4cHJlc3Npb25zLmh0bWwjYXR0cmlidXRlLXJlZmVyZW5jZXMKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjIwMTQtMDMtMDE6IHdzZnVsdG9uCgkgICAgW1B5dGhvbl0gUGF0Y2ggIzE0MyBGaXggdHlwZSBzaG93biB3aGVuIHVzaW5nIHR5cGUoKSB0byBpbmNsdWRlIHRoZSBtb2R1bGUgYW5kIHBhY2thZ2UKICAgICAgICAgICAgbmFtZSB3aGVuIHVzaW5nIC1idWlsdGluLgoKMjAxNC0wMy0wMTogd3NmdWx0b24KCSAgICBbUHl0aG9uXSBTRiBwYXRjaCAjMzQ3IEZpeCBtaXNzaW5nIGFyZ3VtZW50IGNvdW50IGNoZWNraW5nIHdpdGggLW1vZGVybi4KICAgICAgICAgICAgRml4ZXMgcmVncmVzc2lvbiBpbnRyb2R1Y2VkIHdoZW4gYnVpbHRpbiBjaGFuZ2VzIHdlcmUgaW50cm9kdWNlZCBpbiBTV0lHLTIuMC4zLgoKMjAxNC0wMi0yMTogd3NmdWx0b24KCSAgICBbUEhQXSBGaXggd2FybmluZyBzdXBwcmVzc2lvbiB1c2luZyAld2FybmZpbHRlciBmb3IgUEhQIHJlc2VydmVkIGNsYXNzIG5hbWVzLgoKMjAxNC0wMi0xOTogb2xseQoJICAgIFtMdWFdIEFkZCBrZXl3b3JkIHdhcm5pbmdzIGZvciBMdWEga2V5d29yZHMgYW5kIEJhc2ljIEZ1bmN0aW9ucy4KCjIwMTQtMDItMTk6IG9sbHkKCSAgICAtV2FsbGt3IG5vdyBpbmNsdWRlcyBrZXl3b3JkcyBmb3IgYWxsIGxhbmd1YWdlcyB3aXRoIGtleXdvcmQKCSAgICB3YXJuaW5ncyAocHJldmlvdXNseSBHbyBhbmQgUiB3ZXJlIG1pc3NpbmcpLgoKMjAxNC0wMi0xOTogb2xseQoJICAgIFtQSFBdIFVwZGF0ZSB0aGUgbGlzdHMgb2YgUEhQIGtleXdvcmRzIHdpdGggbmV3IG9uZXMgZnJvbSBQSFAgNS40CgkgICAgYW5kIG5ld2VyIChhbmQgc29tZSBtaXNzaW5nIG9uZXMgZnJvbSA1LjMpLiAgUmVzZXJ2ZWQgUEhQIGNvbnN0YW50cwoJICAgIG5hbWVzIGFyZSBub3cgY2hlY2tlZCBhZ2FpbnN0IGVudW0gdmFsdWVzIGFuZCBjb25zdGFudHMsIGluc3RlYWQKCSAgICBvZiBhZ2FpbnN0IGZ1bmN0aW9uIGFuZCBtZXRob2QgbmFtZXMuICBCdWlsdC1pbiBQSFAgZnVuY3Rpb24gbmFtZXMKCSAgICBubyBsb25nZXIgbWF0Y2ggbWV0aG9kcyBhZGRlZCBieSAlZXh0ZW5kLiAgRnVuY3Rpb25zIGFuZCBtZXRob2RzCgkgICAgbmFtZWQgJ19fc2xlZXAnLCAnX193YWtldXAnLCAnbm90JywgJ3BhcmVudCcsIG9yICd2aXJ0dWFsJyBhcmUgbm8KCSAgICBsb25nZXIgbmVlZGxlc3NseSByZW5hbWVkLgoKMjAxNC0wMi0xNTogd3NmdWx0b24KCSAgICBGaXggdGhlICUkaXNtZW1iZXIgJXJlbmFtZSBwcmVkaWNhdGVzIHRvIGFsc28gYXBwbHkgdG8gbWVtYmVycyBhZGRlZCB2aWEgJWV4dGVuZC4KCiAgICAgICAgICAgIEFkZCAlJGlzZXh0ZW5kbWVtYmVyIGZvciAlcmVuYW1lIG9mIG1lbWJlcnMgYWRkZWQgdmlhICVleHRlbmQuIFRoaXMgY2FuIGJlIHVzZWQgdG8KICAgICAgICAgICAgZGlzdGluZ3Vpc2ggYmV0d2VlbiBub3JtYWwgY2xhc3Mvc3RydWN0IG1lbWJlcnMgYW5kICVleHRlbmQgbWVtYmVycy4gRm9yIGV4YW1wbGUKICAgICAgICAgICAgJyUkaXNtZW1iZXIsICUkbm90ICUkaXNleHRlbmRtZW1iZXInIHdpbGwgbm93IGlkZW50aWZ5IGp1c3QgY2xhc3Mvc3RydWN0IG1lbWJlcnMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDE0LTAyLTE2OiBoZmFsY2ljCiAgICAgICAgICAgIFtQeXRob25dIFBhdGNoICMxMzcgLSBmaXggY3Jhc2hlcy9leGNlcHRpb25zIGluIGV4Y2VwdGlvbiBoYW5kbGluZyBpbiBQeXRob24gMy4zCgoyMDE0LTAyLTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gQWRkIHN1cHBvcnQgZm9yIHRoZSBjZGF0YSBsaWJyYXJ5LgoKMjAxNC0wMi0wODogdmthbGluaW4KICAgICAgICAgICAgTmVzdGVkIGNsYXNzIHN1cHBvcnQgYWRkZWQuIFRoaXMgcHJpbWFyaWx5IGFsbG93cyBTV0lHIHRvIHByb3Blcmx5IHBhcnNlIG5lc3RlZAogICAgICAgICAgICBjbGFzc2VzIGFuZCBrZWVwIHRoZSBuZXN0ZWQgY2xhc3MgaW5mb3JtYXRpb24gaW4gdGhlIHBhcnNlIHRyZWUuIEphdmEgYW5kIEMjCiAgICAgICAgICAgIGhhdmUgdXRpbGlzZWQgdGhpcyBpbmZvcm1hdGlvbiB3cmFwcGluZyB0aGUgQysrIG5lc3RlZCBjbGFzc2VzIGFzIEphdmEvQyMKICAgICAgICAgICAgbmVzdGVkIGNsYXNzZXMuIFRoZSByZW1haW5pbmcgdGFyZ2V0IGxhbmd1YWdlcyBpZ25vcmUgbmVzdGVkIGNsYXNzZXMgYXMgaW4KICAgICAgICAgICAgcHJldmlvdXMgdmVyc2lvbnMuIEhlbHAgaXMgbmVlZGVkIGJ5IHVzZXJzIG9mIHRoZXNlIHJlbWFpbmluZyBsYW5ndWFnZXMgdG8KICAgICAgICAgICAgZGVzaWduIGhvdyBDKysgbmVzdGVkIGNsYXNzZXMgY2FuIGJlIGJlc3Qgd3JhcHBlZC4gUGxlYXNlIHRhbGsgdG8gdXMgb24gdGhlCiAgICAgICAgICAgIHN3aWctZGV2ZWwgbWFpbGluZyBsaXN0IGlmIHlvdSB0aGluayB5b3UgY2FuIGhlbHAuCgogICAgICAgICAgICBQcmV2aW91c2x5LCB0aGVyZSB3YXMgbGltaXRlZCBuZXN0ZWQgY2xhc3Mgc3VwcG9ydC4gTmVzdGVkIGNsYXNzZXMgd2VyZSB0cmVhdGVkCiAgICAgICAgICAgIGFzIG9wYXF1ZSBwb2ludGVycy4gSG93ZXZlciwgdGhlICJuZXN0ZWR3b3JrYXJvdW5kIiBmZWF0dXJlIHByb3ZpZGVkIGEgd2F5IHRvCiAgICAgICAgICAgIHdyYXAgYSBuZXN0ZWQgY2xhc3MgYXMgaWYgaXQgd2FzIGEgZ2xvYmFsIGNsYXNzLiBUaGlzIGZlYXR1cmUgbm8gbG9uZ2VyIGV4aXN0cwogICAgICAgICAgICBhbmQgaXMgcmVwbGFjZWQgYnkgdGhlIG5ldyAiZmxhdG5lc3RlZCIgZmVhdHVyZS4gVGhpcyBlZmZlY3RpdmVseSBkb2VzIHRoZSBzYW1lCiAgICAgICAgICAgIHRoaW5nIHdpdGggbGVzcyBtYW51YWwgY29kZSB0byBiZSB3cml0dGVuLiBQbGVhc2Ugc2VlIHRoZSAnTmVzdGVkIGNsYXNzZXMnCiAgICAgICAgICAgIHNlY3Rpb24gaW4gdGhlIGRvY3VtZW50YXRpb24gaW4gU1dJR1BsdXMuaHRtbCBpZiB5b3Ugd2VyZSBwcmV2aW91c2x5IHVzaW5nIHRoaXMKICAgICAgICAgICAgZmVhdHVyZS4KCiAgICAgICAgICAgIFNXSUcgbm93IHBhcnNlcyB0aGUgY29udGVudHMgb2YgbmVzdGVkIGNsYXNzZXMgd2hlcmUgcHJldmlvdXNseSBpdCBkaWQgbm90LiBZb3UKICAgICAgICAgICAgbWF5IGZpbmQgdGhhdCB5b3Ugd2lsbCBuZWVkIHRvIG1ha2UgYWRqdXN0bWVudHMgdG8geW91ciBpbnRlcmZhY2UgZmlsZSBhcwogICAgICAgICAgICBlZmZlY3RpdmVseSBleHRyYSBjb2RlIGlzIGJlaW5nIHdyYXBwZWQuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDE0LTAyLTA2OiBnamFuc3NlbnMKICAgICAgICAgICAgW0d1aWxlXSBQYXRjaCAjMTMzLiBNYWtlIHNjbSB0byBzdHJpbmcgY29udmVyc2lvbiB3b3JrIHdpdGggbm9uLWFzY2lpIHN0cmluZ3MuCiAgICAgICAgICAgIEd1aWxlIDIgaGFzIGEgY29tcGxldGVseSByZXdyaXR0ZW4gc3RyaW5nIGltcGxlbWVudGF0aW9uLiBTV0lHIG1hZGUgc29tZSBhc3N1bXB0aW9ucwogICAgICAgICAgICB0aGF0IGFyZSBubyBsb25nZXIgdmFsaWQgYXMgdG8gdGhlIGludGVybmFscyBvZiBndWlsZSdzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KCjIwMTQtMDEtMzA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQWRkIG5ldyBzd2lndHlwZV9pbm91dC5pIGxpYnJhcnkgY29udGFpbmluZyBTV0lHVFlQRSAqJiBPVVRQVVQgdHlwZW1hcHMuCgogICAgICAgICAgICBFeGFtcGxlIHVzYWdlIHdyYXBwaW5nOgoKICAgICAgICAgICAgICB2b2lkIGYoWFhYIComIHgpIHsgeCA9IG5ldyBYWFgoMTExKTsgfQoKICAgICAgICAgICAgd291bGQgYmU6CgogICAgICAgICAgICAgIFhYWCB4ID0gbnVsbDsKICAgICAgICAgICAgICBmKG91dCB4KTsKICAgICAgICAgICAgICAvLyB1c2UgeAogICAgICAgICAgICAgIHguRGlzcG9zZSgpOyAvLyBtYW51YWxseSBjbGVhciBtZW1vcnkgb3Igb3RoZXJ3aXNlIGxlYXZlIG91dCBhbmQgbGVhdmUgaXQgdG8gdGhlIGdhcmJhZ2UgY29sbGVjdG9yCgoyMDE0LTAxLTIxOiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gQWRkICVnb19pbXBvcnQgZGlyZWN0aXZlLgoKMjAxNC0wMS0yMTogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIEFkZCBzdXBwb3J0IGZvciBHbyAxLjMsIG5vdCB5ZXQgcmVsZWFzZWQuCgoyMDE0LTAxLTIwOiB3c2Z1bHRvbgogICAgICAgICAgICBEaXJlY3RvciBleGNlcHRpb25zIChTd2lnOjpEaXJlY3RvckV4Y2VwdGlvbikgbm93IGRlcml2ZSBmcm9tIHN0ZDo6ZXhjZXB0aW9uCiAgICAgICAgICAgIGFuZCBoZW5jZSBwcm92aWRlIHRoZSB3aGF0KCkgbWV0aG9kLiBJbiBQeXRob24gYW5kIFJ1YnksIHRoaXMgcmVwbGFjZXMgdGhlIG5vdwogICAgICAgICAgICBkZXByZWNhdGVkIERpcmVjdG9yRXhjZXB0aW9uOjpnZXRNZXNzYWdlKCkgbWV0aG9kLgoKMjAxNC0wMS0xNDogZGlvcmNldHkKICAgICAgICAgICAgUGF0Y2ggIzExMiAtIEZpeCBzeW1ib2wgcmVzb2x1dGlvbiBpbnZvbHZpbmcgc2NvcGVzIHRoYXQgaGF2ZSBtdWx0aXBsZSBsZXZlbHMKICAgICAgICAgICAgb2YgdHlwZWRlZnMgLSBmaXhlcyBzb21lIHRlbXBsYXRlIHJlc29sdXRpb25zIGFzIHdlbGwgYXMgc29tZSB0eXBlbWFwIHNlYXJjaGVzLgoKMjAxNC0wMS0xMTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGFuZCBkb2N1bWVudCB0aGUgbmF0dXJhbHZhciBmZWF0dXJlIG92ZXJyaWRlIGJlaGF2aW91ciAtIHRoZSBuYXR1cmFsdmFyCiAgICAgICAgICAgIGZlYXR1cmUgYXR0YWNoZWQgdG8gYSB2YXJpYWJsZSBuYW1lIGhhcyBwcmVjZWRlbmNlIG92ZXIgdGhlIG5hdHVyYWx2YXIKICAgICAgICAgICAgZmVhdHVyZSBhdHRhY2hlZCB0byB0aGUgdmFyaWFibGUncyB0eXBlLiBUaGUgb3ZlcnJpZGluZyB3YXMgbm90IHdvcmtpbmcKICAgICAgICAgICAgd2hlbiB0dXJuaW5nIHRoZSBmZWF0dXJlIG9mZiBvbiB0aGUgdmFyaWFibGUncyBuYW1lLgoKICAgICAgICAgICAgRml4IHNvIHRoYXQgYW55IHVzZSBvZiB0aGUgbmF0dXJhbHZhciBmZWF0dXJlIHdpbGwgb3ZlcnJpZGUgdGhlIGdsb2JhbAogICAgICAgICAgICBzZXR0aW5nLiBQcmV2aW91c2x5IHdoZW4gc2V0IGdsb2JhbGx5IGJ5IC1uYXR1cmFsdmFyIG9yICVtb2R1bGUobmF0dXJhbHZhcj0xKSwKICAgICAgICAgICAgdXNlIG9mIHRoZSBuYXR1cmFsdmFyIGZlYXR1cmUgd2FzIG5vdCBhbHdheXMgaG9ub3VyZWQuCgoyMDE0LTAxLTA2OiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gRml4IGJ1ZyB0aGF0IGJyb2tlIHVzaW5nIGRpcmVjdG9ycyBmcm9tIGEgdGhyZWFkIG5vdAoJICAgIGNyZWF0ZWQgYnkgR28uCgoyMDEzLTEyLTI0OiBwdG9tdWxpawogICAgICAgICAgICBbUHl0aG9uXSBTRiBCdWcgIzEyOTcKCiAgICAgICAgICAgIFJlc29sdmUgc2V2ZXJhbCBpc3N1ZXMgcmVsYXRlZCB0byBweXRob24gaW1wb3J0cy4KICAgICAgICAgICAgRm9yIGV4YW1wbGUsIGl0J3Mgbm93IHBvc3NpYmxlIHRvIGltcG9ydCBtb2R1bGVzIGhhdmluZyB0aGUgc2FtZSBtb2R1bGUKICAgICAgICAgICAgbmFtZXMsIGJ1dCBiZWxvbmdpbmcgaW4gZGlmZmVyZW50IHBhY2thZ2VzLgogICAgICAgICAgICAKICAgICAgICAgICAgRnJvbSB0aGUgdXNlcidzIHZpZXdwb2ludCwgdGhpcyBwYXRjaCBnaXZlcyBhIGxpdHRsZSBiaXQgbW9yZSBjb250cm9sIG9uCiAgICAgICAgICAgIGltcG9ydCBzdGF0ZW1lbnRzIGdlbmVyYXRlZCBieSBTV0lHLiBUaGUgdXNlciBtYXkgY2hvb3NlIHRvIHVzZSByZWxhdGl2ZQogICAgICAgICAgICBvciBhYnNvbHV0ZSBpbXBvcnRzLgogICAgICAgICAgICAKICAgICAgICAgICAgU29tZSBkZXRhaWxzOgogICAgICAgICAgICAgIC0gd2UgKHN0aWxsKSBnZW5lcmF0ZSBpbXBvcnQgc3RhdGVtZW50cyBpbiB0aGUgZm9ybSAnaW1wb3J0IGEuYi5jJyB3aGljaAogICAgICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gYWJzb2x1dGUgaW1wb3J0cyBpbiBweXRob24zIGFuZCAodGhlIG9ubHkgYXZhaWxhYmxlKQogICAgICAgICAgICAgICAgYW1iaWd1b3VzIG9uZSBpbiBweXRob24yLgogICAgICAgICAgICAgIC0gYWRkZWQgLXJlbGF0aXZlaW1wb3J0IG9wdGlvbiB0byB1c2UgZXhwbGljaXQgcmVsYXRpdmUgaW1wb3J0IHN5bnRheAogICAgICAgICAgICAgICAgKHB5dGhvbjMpLAoKICAgICAgICAgICAgVGhlICJQeXRob24gUGFja2FnZXMiIHNlY3Rpb24gaW4gdGhlIGRvY3VtZW50YXRpb24gZGlzY3Vzc2VzIGhvdyB0byB3b3JrCiAgICAgICAgICAgIHdpdGggaW1wb3J0aW5nIHBhY2thZ2VzIGluY2x1ZGluZyB0aGUgbmV3IC1yZWxhdGl2ZWltcG9ydCBjb21tYW5kIGxpbmUgb3B0aW9uLgoKMjAxMy0xMi0yMzogdmFkegogICAgICAgICAgICBbT2N0YXZlLCBQZXJsLCBQeXRob24sIFIsIFJ1YnksIFRjbF0gQ2hhbmdlIHRoZSBsZW5ndGggb2Ygc3RyaW5ncyBjcmVhdGVkIGZyb20gZml4ZWQtc2l6ZSBjaGFyCiAgICAgICAgICAgIGJ1ZmZlcnMgaW4gQyBjb2RlLgoKICAgICAgICAgICAgVGhpcyBpcyBhIHBvdGVudGlhbCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBicmVhazogYSAiY2hhciBidWZbNV0iIGNvbnRhaW5pbmcgImhvXDBsYSIgd2FzCiAgICAgICAgICAgIHJldHVybmVkIGFzIGEgc3RyaW5nIG9mIGxlbmd0aCA1IGJlZm9yZSwgYnV0IGlzIHJldHVybmVkIGFzIGEgc3RyaW5nIG9mIGxlbmd0aCAyIG5vdy4gQWxzbywKICAgICAgICAgICAgaXQgd2FzIHBvc3NpYmxlIHRvIGFzc2lnbiBhIChub24tTlVMLXRlcm1pbmF0ZWQpIHN0cmluZyAiaGVsbG8iIHRvIHN1Y2ggYSBidWZmZXIgYmVmb3JlIGJ1dAogICAgICAgICAgICBub3cgdGhpcyBmYWlscyBhbmQgb25seSAiaGVsbyIgY2FuIGZpdC4KCiAgICAgICAgICAgIEFwcGx5ICJjaGFyIEZJWFNJWkVbQU5ZXSIgdHlwZW1hcHMgdG8gZXhwbGljaXRseSBjaG9vc2UgdGhlIG9sZCBiZWhhdmlvdXIuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDEzLTEyLTIzOiB0YWxieQogICAgICAgICAgICBbUGVybF0gQWRkIHN1cHBvcnQgZm9yIGRpcmVjdG9ycy4KCjIwMTMtMTItMTg6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBEb24ndCByZXF1aXJlIHRoYXQgR28gZW52aXJvbm1lbnQgdmFyaWFibGVzIGJlIHNldAoJICAgIHdoZW4gcnVubmluZyBleGFtcGxlcyBvciB0ZXN0c3VpdGUgd2hlbiB1c2luZyBHbyAxIG9yCgkgICAgbGF0ZXIuCgoyMDEzLTEyLTE3OiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gUmVtb3ZlIC1sb25nc2l6ZSBvcHRpb24gKGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LAoJICAgIGlnbm9yZSBpdCBpZiBzZWVuKS4KCjIwMTMtMTItMTc6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBBZGQgLWdvLXBrZ3BhdGggb3B0aW9uLgoKMjAxMy0xMi0xNjogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIFVwZGF0ZSBmb3IgR28gMS4yIHJlbGVhc2UuICBBZGQgc3VwcG9ydCBmb3IgbGlua2luZwoJICAgIFNXSUcgY29kZSBkaXJlY3RseSBpbnRvIGV4ZWN1dGFibGUsIHJhdGhlciB0aGFuIHVzaW5nIGEKCSAgICBzaGFyZWQgbGlicmFyeS4KCjIwMTMtMTItMTM6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBBZGQgU1dJRyBzb3VyY2UgZmlsZSBuYW1lIGFzIGNvbW1lbnRzIGluIGdlbmVyYXRlZAoJICAgIGZpbGVzLiAgVGhpcyBjYW4gYmUgdXNlZCBieSBHbyBkb2N1bWVudGF0aW9uIHRvb2xzLgoKMjAxMy0xMi0xMjogamxldmVxdWUKCSAgICBbTHVhXSBGaXggdHlwbyAod2NoYXIgaW5zdGVhZCBvZiB3Y2hhcl90KSB3aGljaCBtYWRlIHdjaGFyLmkKCSAgICBmb3IgTHVhIHVzZWxlc3MuCgoyMDEzLTEyLTEyOiB2bWlrbG9zCgkgICAgW1BIUF0gUEhQJ3MgcGVjdWxpYXIgY2FsbC10aW1lIHBhc3MtYnktcmVmZXJlbmNlIGZlYXR1cmUgd2FzCgkgICAgZGVwcmVjYXRlZCBpbiBQSFAgNS4zIGFuZCByZW1vdmVkIGluIFBIUCA1LjQsIHNvIHVwZGF0ZSB0aGUgUkVGCgkgICAgdHlwZW1hcHMgaW4gcGhwcG9pbnRlcnMuaSB0byBzcGVjaWZ5IHBhc3MtYnktcmVmZXJlbmNlIGluIHRoZQoJICAgIGZ1bmN0aW9uIGRlZmluaXRpb24uICBFeGFtcGxlcy9waHAvcG9pbnRlciBoYXMgYmVlbiB1cGRhdGVkCgkgICAgYWNjb3JkaW5nbHkuCgoyMDEzLTEyLTEyOiBvbGx5CgkgICAgW1BIUF0gVGhlIHVzYWdlIG9mICRpbnB1dCBpbiBQSFAgZGlyZWN0b3JvdXQgdHlwZW1hcHMgaGFzIGJlZW4KCSAgICBjaGFuZ2VkIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBvdGhlciBsYW5ndWFnZXMuICBUaGUgdHlwZW1hcHMKCSAgICBwcm92aWRlZCBieSBTV0lHIGhhdmUgYmVlbiB1cGRhdGVkIGFjY29yZGluZ2x5LCBidXQgaWYgeW91CgkgICAgaGF2ZSB3cml0dGVuIHlvdXIgb3duIGRpcmVjdG9yb3V0IHR5cGVtYXBzLCB5b3UnbGwgbmVlZCB0bwoJICAgIHVwZGF0ZSAkaW5wdXQgdG8gJiRpbnB1dCAob3IgbWFrZSBlcXVpdmFsZW50IGNoYW5nZXMpLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMjAxMy0xMS0yNzogdmFkegogICAgICAgICAgICBbQyMsIEphdmEsIFB5dGhvbl0gQWRkIHN0ZF9hdXRvX3B0ci5pIGRlZmluaW5nIHR5cGVtYXBzIGZvciByZXR1cm5pbmcgc3RkOjphdXRvX3B0cjw+LgoKMjAxMy0xMS0wOTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBcHBseSBwYXRjaCAjNzkgZnJvbSBCcmFudCBLeXNlcgogICAgICAgICAgICAgIC0gUmVtb3ZlIHVzaW5nIGRpcmVjdGl2ZXMgZnJvbSB0aGUgZ2VuZXJhdGVkIEMjIGNvZGUgYW5kIGZ1bGx5IHF1YWxpZnkgdGhlIHVzZSBvZiBhbGwgLk5FVAogICAgICAgICAgICAgICAgZnJhbWV3b3JrIHR5cGVzIGluIG9yZGVyIHRvIG1pbmltaXplIHBvdGVudGlhbCBuYW1lIGNvbGxpc2lvbnMgZnJvbSBpbnB1dCBmaWxlcyBkZWZpbmluZwogICAgICAgICAgICAgICAgdHlwZXMsIG5hbWVzcGFjZSwgZXRjIHdpdGggdGhlIHNhbWUgbmFtZSBhcyAuTkVUIGZyYW1ld29yayBtZW1iZXJzLgogICAgICAgICAgICAgIC0gR2xvYmFsbHkgcXVhbGlmeSB0aGUgdXNlIG9mIC5ORVQgZnJhbWV3b3JrIHR5cGVzIGluIHRoZSBTeXN0ZW0gbmFtZXNwYWNlCiAgICAgICAgICAgICAgLSBSZW1vdmUgLk5FVCAxLjEgc3VwcG9ydCwgLk5FVCAyIGlzIHRoZSBtaW5pbXVtIGZvciB0aGUgQyMgbW9kdWxlCgogICAgICAgICAgICBUaGlzIGlzIGEgcG90ZW50aWFsIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGJyZWFrIGlmIGNvZGUgaGFzIGJlZW4gYWRkZWQgcmVseWluZyBvbiB0aGVzZSB1c2luZwogICAgICAgICAgICBzdGF0ZW1lbnRzIHRoYXQgdXNlZCB0byBiZSBnZW5lcmF0ZWQ6CgogICAgICAgICAgICAgIHVzaW5nIFN5c3RlbTsKICAgICAgICAgICAgICB1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CgogICAgICAgICAgICBUaGUgcXVpY2sgZml4IHRvIGFkZCB0aGVzZSBiYWNrIGluIGlzIHRvIGFkZCB0aGUgLURTV0lHMl9DU0hBUlAgY29tbWFuZCBsaW5lIG9wdGlvbiB3aGVuCiAgICAgICAgICAgIGV4ZWN1dGluZyBTV0lHLiBTZWUgQ1NoYXJwLmh0bWwgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMjAxMy0xMS0wNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCBzb21lIGNvcm5lciBjYXNlcyBmb3IgdGhlICRwYWNrYWdlcGF0aC8kamF2YWNsYXNzbmFtZSBzcGVjaWFsIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KCjIwMTMtMTEtMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBBcHBseSBwYXRjaCAjOTEgZnJvbSBNYXJ2aW4gR3JlZW5iZXJnIC0gQWRkIGRpcmVjdG9yOmV4Y2VwdCBmZWF0dXJlIGZvciBpbXByb3ZlZAogICAgICAgICAgICBleGNlcHRpb24gaGFuZGxpbmcgaW4gZGlyZWN0b3IgbWV0aG9kcyBmb3IgSmF2YS4KCjIwMTMtMTAtMTU6IHZhZHoKICAgICAgICAgICAgQWxsb3cgdXNpbmcgXGwsIFxMLCBcdSwgXFUgYW5kIFxFIGluIHRoZSBzdWJzdGl0dXRpb24gcGFydCBvZiAlKHJlZ2V4Oi9wYXR0ZXJuL3N1YnN0LykKICAgICAgICAgICAgaW5zaWRlICVyZW5hbWUgdG8gY2hhbmdlIHRoZSBjYXNlIG9mIHRoZSB0ZXh0IGJlaW5nIHJlcGxhY2VkLgoKMjAxMy0xMC0xMjogd3NmdWx0b24KICAgICAgICAgICAgW0NGRkldIEFwcGx5ICM5NiAtIHN1cGVyY2xhc3Mgbm90IGxpc3BpZnkKCjIwMTMtMTAtMTI6IHdzZnVsdG9uCiAgICAgICAgICAgIE1lcmdlIGluIEMrKzExIHN1cHBvcnQgZnJvbSB0aGUgZ3NvYzIwMDktbWF0ZXZ6IGJyYW5jaCB3aGVyZSBNYXRldnogSmVrb3ZlYyBmaXJzdAogICAgICAgICAgICBzdGFydGVkIHRoZSBDKysweCBhZGRpdGlvbnMuIERvY3VtZW50YXRpb24gb2YgdGhlIEMrKzExIGZlYXR1cmVzIHN1cHBvcnRlZCBpcyBpbiBhCiAgICAgICAgICAgIG5ldyBDaGFwdGVyIG9mIHRoZSBkb2N1bWVudGF0aW9uLCAiU1dJRyBhbmQgQysrMTEiIGluIERvYy9NYW51YWwvQ1BsdXNQbHVzMTEuaHRtbC4KCjIwMTMtMTAtMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAlbmF0dXJhbHZhciBub3QgaGF2aW5nIGFueSBhZmZlY3Qgb24gdGVtcGxhdGVkIGNsYXNzZXMgaW5zdGFudGlhdGVkIHdpdGggYW4KICAgICAgICAgICAgZW51bSBhcyB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIHR5cGUuIFByb2JsZW0gcmVwb3J0ZWQgYnkgVmFkaW0gWmVpdGxpbi4KCjIwMTMtMDktMjA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggYSBtZW1vcnkgbGVhayBmb3IgdGhlIGphdmEgY2hhciAqKlNUUklOR19BUlJBWSB0eXBlbWFwcy4KClZlcnNpb24gMi4wLjEyICg5IEZlYiAyMDE0KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTQtMDEtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQSFBdIEZpeCBjb21waWxhdGlvbiBlcnJvciBpbiBaVFMgbW9kZSAoNjQgYml0IHdpbmRvd3MpIGR1ZSB0byBpbmNvcnJlY3QgcGxhY2VtZW50CiAgICAgICAgICAgIG9mIFRTUk1MU19GRVRDSCgpIGluIFNXSUdfUGhwX0dldE1vZHVsZSgpIGFzIHJlcG9ydGVkIGJ5IE1hcmsgRGF3c29uLUJ1dHRlcndvcnRoLgoKMjAxNC0wMS0xMzoga3d3ZXR0ZQogICAgICAgICAgICBbT2N0YXZlXSB1cGRhdGUgc3VwcG9ydCB0byBPY3RhdmUgdmVyc2lvbiAzLjguMAoKICAgICAgICAgICAgLSBPY3RhdmUgMy44LjAgbm8gbG9uZ2VyIGRlZmluZXMgT0NUQVZFX0FQSV9WRVJTSU9OX05VTUJFUiwgYnV0IDMuOC4xCiAgICAgICAgICAgICAgd2lsbCBkZWZpbmUgT0NUQVZFX3tNQUpPUixNSU5PUixQQVRDSH1fVkVSU0lPTiBpbnN0ZWFkOiBzZWUKICAgICAgICAgICAgICAgIGh0dHA6Ly9oZy5zYXZhbm5haC5nbnUub3JnL2hnd2ViL29jdGF2ZS9yZXYvYjZiNmUwZGM3MDBlCiAgICAgICAgICAgICAgU28gd2Ugbm93IHVzZSBhIG5ldyBtYWNybyBTV0lHX09DVEFWRV9QUkVSRVEobWFqb3IsbWlub3IscGF0Y2gpIHRvCiAgICAgICAgICAgICAgZW5hYmxlIGZlYXR1cmVzIHJlcXVpcmluZyBPY3RhdmUgdmVyc2lvbiBtYWpvci5taW5vci5wYXRjaCBvciBsYXRlci4KCiAgICAgICAgICAgICAgRm9yIE9jdGF2ZSB2ZXJzaW9ucyBwcmlvciB0byAzLjguMSwgd2UgcmVjb25zdHJ1Y3QgdmFsdWVzIGZvcgogICAgICAgICAgICAgIE9DVEFWRV97TUFKT1IsTUlOT1IsUEFUQ0h9X1ZFUlNJT04gYmFzZWQgb24gT0NUQVZFX0FQSV9WRVJTSU9OX05VTUJFUiwKICAgICAgICAgICAgICBleHRyYWN0ZWQgZnJvbSBPY3RhdmUncyBDaGFuZ2VMb2dzLiBBbiBhZGRpdGlvbmFsIGhhY2sgaXMgbmVlZGVkIHRvCiAgICAgICAgICAgICAgZGlzdGluZ3Vpc2ggYmV0d2VlbiBPY3RhdmUgPD0gMy4yLnggYW5kIDMuOC4wLCBuZWl0aGVyIG9mIHdoaWNoIGRlZmluZQogICAgICAgICAgICAgIE9DVEFWRV9BUElfVkVSU0lPTl9OVU1CRVIuCgogICAgICAgICAgICAtIE9jdGF2ZSAzLjguMCBkZXByZWNhdGVzIHN5bWJvbF90YWJsZTo6dmFycmVmKCksIHNvIHJlbW92ZSBpdHMgdXNlCiAgICAgICAgICAgICAgZm9yIHRoaXMgYW5kIGZ1dHVyZSB2ZXJzaW9ucyBvZiBPY3RhdmUuCgogICAgICAgICAgICAtIE9jdGF2ZSAzLjguMCByZW1vdmVzIG9jdGF2ZV92YWx1ZTo6aXNfcmVhbF9uZF9hcnJheSgpLCB1c2VkIGluCiAgICAgICAgICAgICAgb2N0YXZlX3N3aWdfdHlwZTo6ZGltcygpLiBJdHMgdXNlIGlzIG5vdCByZXF1aXJlZCBoZXJlLCBzbyByZW1vdmUgaXQuCgogICAgICAgICAgICAtIFJldGVzdGVkIGFnYWluc3QgT2N0YXZlIHZlcnNpb25zIDMuMC41LCAzLjIuNCwgMy40LjMsIDMuNi40LCBhbmQgMy44LjAuCgogICAgICAgICAgICAtIFVwZGF0ZWQgT2N0YXZlIGRvY3VtZW50YXRpb24gd2l0aCB0ZXN0ZWQgT2N0YXZlIHZlcnNpb25zLCBhbmQgYWRkZWQgYQogICAgICAgICAgICAgIHdhcm5pbmcgYWdhaW5zdCB1c2luZyB2ZXJzaW9ucyA8PSAzLngueCwgd2hpY2ggYXJlIG5vIGxvbmdlciB0ZXN0ZWQuCgoyMDEzLTEyLTIyOiB3c2Z1bHRvbgogICAgICAgICAgICBDKysxMSBzdXBwb3J0IGZvciBuZXcgdmVyc2lvbnMgb2YgZXJhc2UgYW5kIGluc2VydCBpbiB0aGUgU1RMIGNvbnRhaW5lcnMuCgogICAgICAgICAgICBUaGUgZXJhc2UgYW5kIGluc2VydCBtZXRob2RzIGluIHRoZSBjb250YWluZXJzIHVzZSBjb25zdF9pdGVyYXRvciBpbnN0ZWFkCiAgICAgICAgICAgIG9mIGl0ZXJhdG9yIGluIEMrKzExLiAgVGhlcmUgYXJlIHRpbWVzIHdoZW4gdGhlIG1ldGhvZHMgd3JhcHBlZCBtdXN0IG1hdGNoCiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXJzIGV4YWN0bHkuIFNwZWNpZmljYWxseSB3aGVuIGZ1bGwgdHlwZSBpbmZvcm1hdGlvbiBmb3IKICAgICAgICAgICAgdGVtcGxhdGUgdHlwZXMgaXMgbWlzc2luZyBvciBTV0lHIGZhaWxzIHRvIGxvb2sgdXAgdGhlIHR5cGUgY29ycmVjdGx5LAogICAgICAgICAgICBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWluY2x1ZGUgPHN0ZF92ZWN0b3IuaT4KICAgICAgICAgICAgICB0eXBlZGVmIGZsb2F0IFJlYWw7CiAgICAgICAgICAgICAgJXRlbXBsYXRlKFJlYWxWZWN0b3IpIHN0ZDo6dmVjdG9yPFJlYWw+OwoKICAgICAgICAgICAgU1dJRyBkb2VzIG5vdCBmaW5kIHN0ZDo6dmVjdG9yPFJlYWw+OjppdGVyYXRvciBiZWNhdXNlICV0ZW1wbGF0ZSB1c2luZwogICAgICAgICAgICB0eXBlZGVmcyBkb2VzIG5vdCBhbHdheXMgd29yayBhbmQgc28gU1dJRyBkb2Vzbid0IGtub3cgaWYgdGhlIHR5cGUgaXMKICAgICAgICAgICAgY29weWFibGUgYW5kIHNvIHVzZXMgU3dpZ1ZhbHVlV3JhcHBlcjxpdGVyYXRvcj4gd2hpY2ggZG9lcwogICAgICAgICAgICBub3Qgc3VwcG9ydCBjb252ZXJzaW9uIHRvIGFub3RoZXIgdHlwZSAoY29uc3RfaXRlcmF0b3IpLiBUaGlzIHJlc3VsdGVkCiAgICAgICAgICAgIGluIGNvbXBpbGF0aW9uIGVycm9ycyB3aGVuIHVzaW5nIHRoZSBDKysxMSB2ZXJzaW9uIG9mIHRoZSBjb250YWluZXJzLgoKICAgICAgICAgICAgQ2xvc2VzICM3MwoKMjAxMy0xMC0xNzogd3NmdWx0b24KICAgICAgICAgICAgW1JdIEZpeCBTRiAjMTM0MCAtIFZpc3VhbCBTdHVkaW8gY29tcGlsZSBlcnJvciBpbiBDKysgd3JhcHBlcnMgZHVlIHRvICNpbmNsdWRlIDxleGNlcHRpb24+CiAgICAgICAgICAgIHdpdGhpbiBleHRlcm4gIkMiIGJsb2NrLgoKMjAxMy0xMC0xNzogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4IFNGICMxMzQ1IC0gTWlzc2luZyAjaW5jbHVkZSA8c3RkZGVmLmg+IGZvciBvZmZzZXRvZiB3aGVuIHVzaW5nIC1idWlsdGluLgoKMjAxMy0xMC0xMjogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gQXBwbHkgIzkyIC0gbWlzc2luZyByZXR1cm4gc3RhdGVtZW50cyBmb3IgU1dJR19MdWFfYWRkX25hbWVzcGFjZV9kZXRhaWxzKCkKICAgICAgICAgICAgYW5kIFNXSUdfTHVhX25hbWVzcGFjZV9yZWdpc3RlcigpLgoKVmVyc2lvbiAyLjAuMTEgKDE1IFNlcCAyMDEzKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDEzLTA5LTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gRml4IGF0dGVtcHQgdG8gZnJlZSBhIG5vbi1oZWFwIG9iamVjdCBpbiBPVVRQVVQgdHlwZW1hcHMgZm9yOgogICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0ICpPVVRQVVQKICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICpPVVRQVVQKICAgICAgICAgICAgICBzaWduZWQgbG9uZyBsb25nICpPVVRQVVQKICAgICAgICAgICAgICBjaGFyICpPVVRQVVQKICAgICAgICAgICAgICBzaWduZWQgY2hhcipPVVRQVVQKICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKk9VVFBVVAoKMjAxMy0wOS0xMjogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gUHVsbCBHaXQgcGF0Y2ggIzYyLgogICAgICAgICAgICAgIDEpIFN0YXRpYyBtZW1iZXJzIGFuZCBzdGF0aWMgZnVuY3Rpb25zIGluc2lkZSBjbGFzcyBjYW4gYmUgYWNjZXNzZWQgYXMKICAgICAgICAgICAgICAgICBNb2R1bGVOYW1lLkNsYXNzTmFtZS5GdW5jdGlvbk5hbWUgKE1lbWJlck5hbWUgcmVzcGVjdGl2ZWx5KS4gT2xkIHdheSBzdWNoIGFzCiAgICAgICAgICAgICAgICAgTW9kdWxlTmFtZS5DbGFzc05hbWVfRnVuY3Rpb25OYW1lIHN0aWxsIHdvcmtzLgogICAgICAgICAgICAgIDIpIFNhbWUgZ29lcyBmb3IgZW51bXMgaW5zaWRlIGNsYXNzZXM6IE1vZHVsZU5hbWUuQ2xhc3NOYW1lLkVudW1WYWx1ZTEgZXRjLgoKMjAxMy0wOS0xMjogd3NmdWx0b24KICAgICAgICAgICAgW1VUTF0gSW5maW5pdHkgaXMgbm93IGJ5IGRlZmF1bHQgYW4gYWNjZXB0YWJsZSB2YWx1ZSBmb3IgdHlwZSAnZmxvYXQnLiBUaGlzIGZpeCBtYWtlcwogICAgICAgICAgICB0aGUgaGFuZGxpbmcgb2YgdHlwZSAnZmxvYXQnIGFuZCAnZG91YmxlJyB0aGUgc2FtZS4gVGhlIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHRoZQogICAgICAgICAgICBDOTkgaXNmaW5pdGUoKSBtYWNybywgb3Igb3RoZXJ3aXNlIHNvbWUgcGxhdGZvcm0gZGVwZW5kZW50IGVxdWl2YWxlbnRzLCB0byBiZSBhdmFpbGFibGUuCgogICAgICAgICAgICBVc2VycyByZXF1aXJpbmcgdGhlIG9sZCBiZWhhdmlvdXIgb2Ygbm90IGFjY2VwdGluZyBpbmZpbml0eSwgY2FuIGRlZmluZSBhICdjaGVjaycgdHlwZW1hcAogICAgICAgICAgICB3aGVyZXZlciBhIGZsb2F0IGlzIHVzZWQsIHN1Y2ggYXM6CgogICAgICAgICAgICAgICV0eXBlbWFwKGNoZWNrLGZyYWdtZW50PSI8ZmxvYXQuaD4iKSBmbG9hdCwgY29uc3QgZmxvYXQgJiAlewogICAgICAgICAgICAgICAgaWYgKCQxIDwgLUZMVF9NQVggfHwgJDEgPiBGTFRfTUFYKSB7CiAgICAgICAgICAgICAgICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19UeXBlRXJyb3IsICJPdmVyZmxvdyBpbiB0eXBlIGZsb2F0Iik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjIwMTMtMDgtMzA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIFB1bGwgR2l0IHBhdGNoICM4MTogSW5jbHVkZSBMdWEgZXJyb3IgbG9jdXMgaW4gU1dJRyBlcnJvciBtZXNzYWdlcy4gIAogICAgICAgICAgICBUaGlzIGlzIHN0YW5kYXJkIGluZm9ybWF0aW9uIGluIEx1YSBlcnJvciBtZXNzYWdlcywgYW5kIG1ha2VzIGl0IG11Y2gKICAgICAgICAgICAgZWFzaWVyIHRvIGZpbmQgYnVncy4KCjIwMTMtMDgtMjk6IHdzZnVsdG9uCiAgICAgICAgICAgIFB1bGwgR2l0IHBhdGNoICM3NTogSGFuZGxlIFVURi04IGZpbGVzIHdpdGggQk9NIGF0IGJlZ2lubmluZyBvZiBmaWxlLiBXYXMgZ2l2aW5nIGFuCiAgICAgICAgICAgICdJbGxlZ2FsIHRva2VuJyBzeW50YXggZXJyb3IuCgoyMDEzLTA4LTI5OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFB1bGwgR2l0IHBhdGNoICM3NzogQWxsb3cgZXhwb3J0aW5nIHN0ZDo6bWFwIHVzaW5nIG5vbi1kZWZhdWx0IGNvbXBhcmlzb24gZnVuY3Rpb24uCgoyMDEzLTA4LTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAlaW1wbGljaXRjb252IGlzIGltcHJvdmVkIGZvciBvdmVybG9hZGVkIGZ1bmN0aW9ucy4gTGlrZSBpbiBDKyssIHRoZSBtZXRob2RzCiAgICAgICAgICAgIHdpdGggdGhlIGFjdHVhbCB0eXBlcyBhcmUgY29uc2lkZXJlZCBiZWZvcmUgdHJ5aW5nIGltcGxpY2l0IGNvbnZlcnNpb25zLiBFeGFtcGxlOgoKICAgICAgICAgICAgICAlaW1wbGljaXRjb252IEE7CiAgICAgICAgICAgICAgc3RydWN0IEEgewogICAgICAgICAgICAgICAgQShpbnQgaSk7CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICBjbGFzcyBDQ0MgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICBpbnQgeHgoaW50IGkpIHsgcmV0dXJuIDExOyB9CiAgICAgICAgICAgICAgICAgIGludCB4eChjb25zdCBBJiBpKSB7IHJldHVybiAyMjsgfQogICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIHB5dGhvbiBjb2RlOgoKICAgICAgICAgICAgICBDQ0MoKS54eCgtMSkKCiAgICAgICAgICAgIHdpbGwgbm93IHJldHVybiAxMSBpbnN0ZWFkIG9mIDIyIC0gdGhlIGltcGxpY2l0IGNvbnZlcnNpb24gaXMgbm90IGRvbmUuCgoyMDEzLTA4LTIzOiBvbGx5CgkgICAgW1B5dGhvbl0gRml4IGNsYW5nKysgd2FybmluZyBpbiBnZW5lcmF0ZWQgd3JhcHBlciBjb2RlLgoKMjAxMy0wOC0xNjogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gJWltcGxpY2l0Y29udiB3aWxsIG5vdyBhY2NlcHQgTm9uZSB3aGVyZSB0aGUgaW1wbGljaXQgY29udmVyc2lvbiB0YWtlcyBhIEMvQysrIHBvaW50ZXIuCiAgICAgICAgICAgIFByb2JsZW0gaGlnaGxpZ2h0ZWQgYnkgQm8gUGVuZy4gQ2xvc2VzIFNGIHBhdGNoICMyMzAuCgoyMDEzLTA4LTA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBTRiBQYXRjaCAjMzI2IGZyb20gS3JpcyBUaGllbGVtYW5zIC0gUmVtb3ZlIFN3aWdQeU9iamVjdF9wcmludCBhbmQgU3dpZ1B5T2JqZWN0X3N0ciBhbmQKICAgICAgICAgICAgbWFrZSB0aGUgZ2VuZXJhdGVkIHdyYXBwZXIgdXNlIHRoZSBkZWZhdWx0IHB5dGhvbiBpbXBsZW1lbnRhdGlvbnMsIHdoaWNoIHdpbGwgZmFsbCBiYWNrIHRvIHJlcHIKICAgICAgICAgICAgKGZvciAtYnVpbHRpbiBvcHRpb24pLgoKICAgICAgICAgICAgQWR2YW50YWdlczoKICAgICAgICAgICAgLSBpdCBhdm9pZHMgdGhlIHN3aWcgdXNlciBoYXZpbmcgdG8ganVtcCB0aHJvdWdoIGhvb3BzIHRvIGdldCBwcmludCB0byB3b3JrIGFzIGV4cGVjdGVkIHdoZW4KICAgICAgICAgICAgICByZWRlZmluaW5nIHJlcHIvc3RyIHNsb3RzLgogICAgICAgICAgICAtIHR5cGluZyB0aGUgbmFtZSBvZiBhIHZhcmlhYmxlIG9uIHRoZSBweXRob24gcHJvbXB0IG5vdyBwcmludHMgdGhlIHJlc3VsdCBvZiBhIChwb3NzaWJseSByZWRlZmluZWQpCiAgICAgICAgICAgICAgcmVwciwgd2l0aG91dCB0aGUgc3dpZyB1c2VyIGhhdmluZyB0byBkbyBhbnkgZXh0cmEgd29yay4KICAgICAgICAgICAgLSB3aGVuIHJlZGVmaW5pbmcgcmVwciwgdGhlIHN3aWcgdXNlciBkb2Vzbid0IG5lY2Vzc2FyaWx5IGhhdmUgdG8gcmVkZWZpbmUgc3RyIGFzIGl0IHdpbGwgY2FsbCB0aGUKICAgICAgICAgICAgICByZWRlZmluZWQgcmVwcgogICAgICAgICAgICAtIHRoZSBiZWhhdmlvdXIgaXMgZXhhY3RseSB0aGUgc2FtZSBhcyB3aXRob3V0IHRoZSAtYnVpbHRpbiBvcHRpb24gd2hpbGUgcmVxdWlyaW5nIG5vIGV4dHJhIHdvcmsKICAgICAgICAgICAgICBieSB0aGUgdXNlciAoYXNpZGUgZnJvbSBhZGRpbmcgdGhlICVmZWF0dXJlKCJweXRob246c2xvdC4uLikgc3RhdGVtZW50cyBvZiBjb3Vyc2UpCgogICAgICAgICAgICBEaXNhZHZhbnRhZ2U6CiAgICAgICAgICAgIC0gZGVmYXVsdCBzdHIoKSB3aWxsIGdpdmUgZGlmZmVyZW50IChidXQgY2xlYXJlcj8pIG91dHB1dCBvbiBzd2lnZ2VkIGNsYXNzZXMKCjIwMTMtMDctMzA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob24sIFJ1YnldIEZpeCAjNjQgIzY1OiBNaXNzaW5nIGNvZGUgaW4gc3RkOjptdWx0aW1hcCB3cmFwcGVycy4gUHJldmlvdXNseSBhbiBpbnN0YW50aWF0aW9uCiAgICAgICAgICAgIG9mIGEgc3RkOjptYXAgd2FzIGVycm9uZW91c2x5IHJlcXVpcmVkIGluIGFkZGl0aW9uIHRvIGFuIGluc3RhbnRpYXRpb24gb2Ygc3RkOjptdWx0aW1hcCB3aXRoIHRoZQogICAgICAgICAgICBzYW1lIHRlbXBsYXRlIHBhcmFtZXRlcnMgdG8gcHJldmVudCBjb21waWxhdGlvbiBlcnJvcnMgZm9yIHRoZSB3cmFwcGVycyBvZiBhIHN0ZDo6bXVsdGltYXAuCgoyMDEzLTA3LTE0OiBqb2VxdWFudAogICAgICAgICAgICBbUl0gQ2hhbmdlIHR5cGVzIGZpbGUgdG8gYWxsb3cgZm9yIFNFWFAgcmV0dXJuIHZhbHVlcwoKMjAxMy0wNy0wNTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQWRkICVweXRob25iZWdpbiBkaXJlY3RpdmUgd2hpY2ggd29ya3MgbGlrZSAlcHl0aG9uY29kZSwgZXhjZXB0IHRoZSBzcGVjaWZpZWQgY29kZSBpcwogICAgICAgICAgICBhZGRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBnZW5lcmF0ZWQgLnB5IGZpbGUuIFRoaXMgaXMgcHJpbWFyaWx5IG5lZWRlZCBmb3IgaW1wb3J0aW5nIGZyb20KICAgICAgICAgICAgX19mdXR1cmVfXyBzdGF0ZW1lbnRzIHJlcXVpcmVkIHRvIGJlIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiB0aGUgZmlsZS4gRXhhbXBsZToKCiAgICAgICAgICAgICAgJXB5dGhvbmJlZ2luICV7CiAgICAgICAgICAgICAgZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgogICAgICAgICAgICAgIHByaW50KCJMb2FkaW5nIiwgIldoaXp6IiwgIkJhbmciLCBzZXA9JyAuLi4gJykKICAgICAgICAgICAgICAlfQoKMjAxMy0wNy0wMTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQXBwbHkgU0YgcGF0Y2ggIzM0MCAtIFVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgZml4IGluIFNXSUdfUHl0aG9uX05vbkR5bmFtaWNTZXRBdHRyCiAgICAgICAgICAgIHdoZW4gdXNpbmcgLWJ1aWx0aW4uCgoyMDEzLTA3LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uLCBSdWJ5LCBPY2FtbF0gQXBwbHkgU0YgcGF0Y2ggIzM0MSAtIGZpeCBhIGNvbnN0X2Nhc3QgaW4gZ2VuZXJhdGVkIGNvZGUgdGhhdCB3YXMgZ2VuZXJhdGluZwogICAgICAgICAgICBhIDw6OiBkaWdyYXBoIHdoZW4gdXNpbmcgdGhlIHVuYXJ5IHNjb3BlIG9wZXJhdG9yICg6OikgKGdsb2JhbCBzY29wZSkgaW4gYSB0ZW1wbGF0ZSB0eXBlLgoKMjAxMy0wNy0wMTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQWRkIFNGIHBhdGNoICMzNDIgZnJvbSBDaHJpc3RpYW4gRGVsYmFlcmUgdG8gZml4IHNvbWUgZGlyZWN0b3IgY2xhc3NlcyBjcmFzaGluZyBvbgogICAgICAgICAgICBvYmplY3QgZGVsZXRpb24gd2hlbiB1c2luZyAtYnVpbHRpbi4gRml4ZXMgU0YgYnVnICMxMzAxLgoKMjAxMy0wNi0xMTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQWRkIFNXSUdfUFlUSE9OX0lOVEVSUFJFVEVSX05PX0RFQlVHIG1hY3JvIHdoaWNoIGNhbiBiZSBkZWZpbmVkIHRvIHVzZSB0aGUgUmVsZWFzZSB2ZXJzaW9uCiAgICAgICAgICAgIG9mIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgaW4gRGVidWcgYnVpbGRzIG9mIHRoZSB3cmFwcGVycy4gVGhlIFZpc3VhbCBTdHVkaW8gLmRzcCBleGFtcGxlCiAgICAgICAgICAgIGZpbGVzIGhhdmUgYmVlbiBtb2RpZmllZCB0byB1c2UgdGhpcyBzbyB0aGF0IERlYnVnIGJ1aWxkcyB3aWxsIG5vdyB3b3JrIHdpdGhvdXQgaGF2aW5nCiAgICAgICAgICAgIHRvIGluc3RhbGwgb3IgYnVpbGQgYSBEZWJ1ZyBidWlsZCBvZiB0aGUgaW50ZXJwcmV0ZXIuCgoyMDEzLTA2LTA3OiB3c2Z1bHRvbgoJICAgIFtSdWJ5XSBHaXQgaXNzdWUgIzUyLiBGaXggcmVncmVzc2lvbiB3aXRoIG1pc3NpbmcgcmJfY29tcGxleF9uZXcgZnVuY3Rpb24gZm9yIFJ1YnkKICAgICAgICAgICAgdmVyc2lvbnMgcHJpb3IgdG8gMS45IHVzaW5nIHN0ZDo6Y29tcGxleCB3cmFwcGVycyBpZiBqdXN0IHVzaW5nIHN0ZDo6Y29tcGxleCBhcyBhbiBvdXRwdXQgdHlwZS4KICAgICAgICAgICAgQWxzbyBmaXggdGhlIENvbXBsZXggaGVscGVyIGZ1bmN0aW9ucyBleHRlcm5hbCB2aXNpYmlsaXR5ICh0byBzdGF0aWMgYnkgZGVmYXVsdCkuCgoyMDEzLTA2LTA0OiBvbGx5CgkgICAgW1BIUF0gRml4IFNXSUdfWlRTX0NvbnZlcnRSZXNvdXJjZVB0cigpIG5vdCB0byBkZXJlZmVyZW5jZSBOVUxMCgkgICAgaWYgdGhlIHR5cGUgbG9va3VwIGZhaWxzLgoKVmVyc2lvbiAyLjAuMTAgKDI3IE1heSAyMDEzKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDEzLTA1LTI1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggUHl0aG9uIDMgaW5jb25zaXN0ZW5jeSB3aGVuIG5lZ2F0aXZlIG51bWJlcnMgYXJlIHBhc3NlZAogICAgICAgICAgICB3aGVyZSBhIHBhcmFtZXRlciBleHBlY3RzIGFuIHVuc2lnbmVkIEMgdHlwZS4gQW4gT3ZlckZsb3cgZXJyb3IgaXMKICAgICAgICAgICAgbm93IGNvbnNpc3RlbnRseSB0aHJvd24gaW5zdGVhZCBvZiBhIFR5cGVFcnJvci4KCjIwMTMtMDUtMjU6IEFydGVtIFNlcmVicml5c2tpeQogICAgICAgICAgICBTVk4gUGF0Y2ggdGlja2V0ICMzMzggLSBmaXhlcyB0byAlYXR0cmlidXRlIG1hY3JvcyBmb3IgdGVtcGxhdGUgdXNhZ2UKICAgICAgICAgICAgd2l0aCAlYXJnLgoKMjAxMy0wNS0xOTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGNjYWNoZS1zd2lnIGludGVybmFsIGVycm9yIGJ1ZyBkdWUgdG8gcHJlbWF0dXJlIGZpbGUgY2xlYW51cC4KCiAgICAgICAgICAgIEZpeGVzIFNGIGJ1ZyAxMzE5IHdoaWNoIHNob3dzIHVwIGFzIGEgZmFpbHVyZSBpbiB0aGUgY2NhY2hlIHRlc3RzIG9uCiAgICAgICAgICAgIERlYmlhbiA2NCBiaXQgV2hlZXp5LCBwb3NzaWJseSBiZWNhdXNlIEVOQUJMRV9aTElCIGlzIGRlZmluZWQuCgogICAgICAgICAgICBUaGlzIGlzIGEgY29ybmVyIGNhc2Ugd2hpY2ggd2lsbCBiZSBoaXQgd2hlbiB0aGUgbWF4aW11bSBudW1iZXIgb2YgZmlsZXMKICAgICAgICAgICAgaW4gdGhlIGNhY2hlIGlzIHNldCB0byBiZSBxdWl0ZSBsb3cgKC1GIG9wdGlvbiksIHJlc3VsdGluZyBpbiBhIGNhY2hlIG1pc3MuCgoyMDEzLTA1LTA5OiBrd3dldHRlCiAgICAgICAgICAgIFtPY3RhdmVdIEZpeCBidWdzIGluIE9jdGF2ZSBtb2R1bGUgbG9hZGluZzoKICAgICAgICAgICAgLSBmaXggYSBtZW1vcnkgbGVhayBpbiBzZXR0aW5nIG9mIGdsb2JhbCB2YXJpYWJsZXMKICAgICAgICAgICAgLSBpbnN0YWxsIGZ1bmN0aW9ucyBvbmx5IG9uY2UsIHRvIHNwZWVkIHVwIG1vZHVsZSBsb2FkcwoKMjAxMy0wNC0yODogZ2phbnNzZW5zCiAgICAgICAgICAgIFtHdWlsZV0gVXBkYXRlcyBpbiBndWlsZSBtb2R1bGU6CiAgICAgICAgICAgIC0gQWRkIHN1cHBvcnQgZm9yIGd1aWxlIDIuMAogICAgICAgICAgICAtIERyb3Agc3VwcG9ydCBmb3IgZ3VpbGUgMS42CiAgICAgICAgICAgIC0gRHJvcCBzdXBwb3J0IGZvciBnZW5lcmF0aW5nIHdyYXBwZXJzIHVzaW5nIGd1aWxlJ3MgZ2ggaW50ZXJmYWNlLgogICAgICAgICAgICAgIEFsbCBnZW5lcmF0ZWQgd3JhcHBlcnMgd2lsbCB1c2UgdGhlIHNjbSBpbnRlcmZhY2UgZnJvbSBub3cgb24uCiAgICAgICAgICAgIC0gRGVwcmVjYXRlIC1naCBhbmQgLXNjbSBvcHRpb25zLiBUaGV5IGFyZSBubyBsb25nZXIgbmVlZGVkLgogICAgICAgICAgICAgIEEgd2FybmluZyB3aWxsIGJlIGlzc3VlZCB3aGVuIHRoZXNlIG9wdGlvbnMgYXJlIHN0aWxsIHVzZWQuCiAgICAgICAgICAgIC0gRml4IGFsbCB0ZXN0cyBhbmQgZXhhbXBsZXMgdG8gaGF2ZSBhIHN1Y2Nlc3NmdWwgdHJhdmlzIHRlc3QKCjIwMTMtMDQtMTg6IHdzZnVsdG9uCiAgICAgICAgICAgIEFwcGx5IFBhdGNoICMzNiBmcm9tIEplc3VzIExvcGV6IHRvIGFkZCBzdXBwb3J0IGZvciAkZGVzY3JpcHRvcigpIHNwZWNpYWwgdmFyaWFibGUgbWFjcm8gZXhwYW5zaW9uIAogICAgICAgICAgICBpbiBmcmFnbWVudHMuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlZnJhZ21lbnQoIm5hbWVEZXNjcmlwdG9yIiwgImhlYWRlciIpCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyICpuYW1lRGVzY3JpcHRvciA9ICIkZGVzY3JpcHRvcihOYW1lKSI7CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIHdoaWNoIHdpbGwgZ2VuZXJhdGUgaW50byB0aGUgd3JhcHBlciBpZiB0aGUgZnJhZ21lbnQgaXMgdXNlZDoKCiAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKm5hbWVEZXNjcmlwdG9yID0gIlNXSUdUWVBFX05hbWUiOwoKMjAxMy0wNC0xODogd3NmdWx0b24KICAgICAgICAgICAgRml4IFNGIEJ1ZyAjNDI4IC0gU3ludGF4IGVycm9yIHdoZW4gcHJlcHJvY2Vzc29yIG1hY3JvcyBhcmUgZGVmaW5lZCBpbnNpZGUgb2YgZW51bSBsaXN0cywgc3VjaCBhczoKCiAgICAgICAgICAgICAgdHlwZWRlZiBlbnVtIHsKICAgICAgICAgICAgICAgIGVaZXJvID0gMAogICAgICAgICAgICAgICNkZWZpbmUgT05FIDEKICAgICAgICAgICAgICB9IEVGb287CgogICAgICAgICAgICBUaGUgbWFjcm9zIGFyZSBzaWxlbnRseSBpZ25vcmVkLgoKMjAxMy0wNC0xNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBQdWxsIHBhdGNoICMzNCBmcm9tIEJyYW50S3lzZXIgdG8gZml4IHNtYXJ0IHBvaW50ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggZGlyZWN0b3JzLgoKMjAxMy0wNC0xNToga3d3ZXR0ZQogICAgICAgICAgICBbT2N0YXZlXSBGaXggYnVncyBpbiBvdXRwdXQgb2YgY2xlYW51cCBjb2RlLgogICAgICAgICAgICAtIENsZWFudXAgY29kZSBpcyBub3cgd3JpdHRlbiBhbHNvIGFmdGVyIHRoZSAiZmFpbDoiIGxhYmVsLCBzbyBpdCB3aWxsIGJlIGNhbGxlZCBpZgogICAgICAgICAgICAgIGEgU1dJR19leGNlcHRpb24gaXMgcmFpc2VkIGJ5IHRoZSB3cmFwcGluZyBmdW5jdGlvbiwgY29uc2lzdGVudCB3aXRoIG90aGVyIG1vZHVsZXMuCiAgICAgICAgICAgIC0gT2N0YXZlIG1vZHVsZSBub3cgYWxzbyByZWNvZ25pc2VzIHRoZSAiJGNsZWFudXAiIHNwZWNpYWwgdmFyaWFibGUsIGlmIG5lZWRlZC4KCjIwMTMtMDQtMDg6IGt3d2V0dGUKICAgICAgICAgICAgQWRkIC1NUCBvcHRpb24gdG8gU1dJRyBmb3IgZ2VuZXJhdGluZyBwaG9ueSB0YXJnZXRzIGZvciBhbGwgZGVwZW5kZW5jaWVzLgogICAgICAgICAgICAtIFByZXZlbnRzIG1ha2UgZnJvbSBjb21wbGFpbmluZyBpZiBoZWFkZXIgZmlsZXMgaGF2ZSBiZWVuIGRlbGV0ZWQgYmVmb3JlCiAgICAgICAgICAgICAgdGhlIGRlcGVuZGVuY3kgZmlsZSBoYXMgYmVlbiB1cGRhdGVkLgogICAgICAgICAgICAtIE1vZGVsbGVkIG9uIHNpbWlsYXIgb3B0aW9uIGluIEdDQy4KCjIwMTMtMDQtMDk6IG9sbHkKCSAgICBbUEhQXSBBZGQgbWlzc2luZyBkaXJlY3RvcmluIHR5cGVtYXAgZm9yIGNoYXIqIGFuZCBjaGFyW10gd2hpY2gKCSAgICBmaXhlcyBkaXJlY3Rvcl9zdHJpbmcgdGVzdGNhc2UgZmFpbHVyZS4KCjIwMTMtMDQtMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBTRiBCdWcgIzEyOTIgLSBSdW50aW1lIGZpeGVzIGZvciBQcm9jIGNoYW5nZXMgaW4gcnVieS0xLjkgd2hlbiB1c2luZyBTVEwKICAgICAgICAgICAgd3JhcHBlcnMgdGhhdCBvdmVycmlkZSB0aGUgZGVmYXVsdCBwcmVkaWNhdGUsIHN1Y2ggYXM6CgogICAgICAgICAgICAgICV0ZW1wbGF0ZShNYXApIHN0ZDo6bWFwPHN3aWc6OkxBTkdVQUdFX09CSiwgc3dpZzo6TEFOR1VBR0VfT0JKLCBzd2lnOjpCaW5hcnlQcmVkaWNhdGU8PiA+OwoKMjAxMy0wNC0wNTogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIFNGIEJ1ZyAjMTE1OSAtIENvcnJlY3RseSBjaGVjayByYl9yZXNwb25kX3RvIGNhbGwgcmV0dXJuIHZhbHVlcyB0byBmaXggc29tZQogICAgICAgICAgICBmdXJ0aGVyIDEuOSBwcm9ibGVtcyB3aXRoIGZ1bmN0b3JzIGFuZCB1c2Ugb2YgQ29tcGxleCB3cmFwcGVycy4KCjIwMTMtMDQtMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBSdW50aW1lIGZpeGVzIGZvciBzdGQ6OmNvbXBsZXggd3JhcHBlcnMgZm9yIHJ1YnktMS45IC0gbmV3IG5hdGl2ZSBSdWJ5IGNvbXBsZXggbnVtYmVycyBhcmUgdXNlZC4KCjIwMTMtMDMtMzA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBGaXggc2VnIGZhdWx0IHdoZW4gdXNpbmcgU1RMIGNvbnRhaW5lcnMgb2YgZ2VuZXJpYyBSdWJ5IHR5cGVzLCBHQ19WQUxVRSBvciBMQU5HVUFHRV9PQkpFQ1QsCiAgICAgICAgICAgIG9uIGV4aXQgb2YgdGhlIFJ1YnkgaW50ZXJwcmV0ZXIuIE1vcmUgZnJlcXVlbnRseSBvYnNlcnZlZCBpbiBydWJ5LTEuOS4KCjIwMTMtMDMtMjk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBGaXggZGVsZXRlX2lmIChyZWplY3QhKSBmb3IgdGhlIFNUTCBjb250YWluZXIgd3JhcHBlcnMgd2hpY2ggcHJldmlvdXNseSB3b3VsZAogICAgICAgICAgICBzb21ldGltZXMgc2VnIGZhdWx0IG9yIG5vdCB3b3JrLgoKMjAxMy0wMy0yNTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4IHNvbWUgdW5kZWZpbmVkIGJlaGF2aW91ciBkZWxldGluZyBzbGljZXMgaW4gdGhlIFNUTCBjb250YWluZXJzLgoKMjAxMy0wMy0xOTogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhLCBEXSBGaXggc2VnIGZhdWx0IGluIFNXSUcgdXNpbmcgZGlyZWN0b3JzIHdoZW4gY2xhc3MgYW5kIHZpcnR1YWwgbWV0aG9kIG5hbWVzIGFyZQogICAgICAgICAgICB0aGUgc2FtZSBleGNlcHQgYmVpbmcgaW4gZGlmZmVyZW50IG5hbWVzcGFjZXMgd2hlbiB0aGUgJW5zcGFjZSBmZWF0dXJlIGlzIG5vdCBiZWluZyB1c2VkLgoKMjAxMy0wMi0xOToga3d3ZXR0ZQogICAgICAgICAgICBGaXggYnVnIGluIFNXSUcncyBoYW5kbGluZyBvZiBxdWFsaWZpZWQgKGUuZy4gY29uc3QpIHZhcmlhYmxlcyBvZiBhcnJheSB0eXBlLiBHaXZlbiB0aGUgdHlwZWRlZgogICAgICAgICAgICAgIGEoNykucSh2b2xhdGlsZSkuZG91YmxlIG15YXJyYXkgICAgIC8vIHR5cGVkZWYgdm9sYXRpbGUgZG91YmxlWzddIG15YXJyYXk7CiAgICAgICAgICAgIHRoZSB0eXBlCiAgICAgICAgICAgICAgcShjb25zdCkubXlhcnJheSAgICAgICAgICAgICAgICAgICAgLy8gY29uc3QgbXlhcnJheQogICAgICAgICAgICBiZWNvbWVzCiAgICAgICAgICAgICAgYSg3KS5xKGNvbnN0IHZvbGF0aWxlKS5kb3VibGUgICAgICAgLy8gY29uc3Qgdm9sYXRpbGUgZG91YmxlWzddCiAgICAgICAgICAgIFByZXZpb3VzbHksIFN3aWdUeXBlX3R5cGVkZWZfcmVzb2x2ZSgpIHByb2R1Y2VzIHRoZSB0eXBlCiAgICAgICAgICAgICAgcShjb25zdCkuYSg3KS5xKHZvbGF0aWxlKS5kb3VibGUgICAgLy8gbm9uLXNlbnNpY2FsIHR5cGUKICAgICAgICAgICAgd2hpY2ggd291bGQgbmV2ZXIgbWF0Y2ggJXR5cGVtYXAgZGVjbGFyYXRpb25zLCB3aG9zZSB0eXBlcyB3ZXJlIHBhcnNlZCBjb3JyZWN0bHkuCiAgICAgICAgICAgIEFkZCB0eXBlbWFwX2FycmF5X3F1YWxpZmllcnMuaSB0byB0aGUgdGVzdCBzdWl0ZSB3aGljaCBjaGVja3MgZm9yIHRoZSBjb3JyZWN0IGJlaGF2aW91ci4KCjIwMTMtMDItMTg6IHdzZnVsdG9uCiAgICAgICAgICAgIERlcHJlY2F0ZSB0eXBlZGVmIG5hbWVzIHVzZWQgYXMgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgbmFtZXMgaW4gJWV4dGVuZC4gVGhlIHJlYWwKICAgICAgICAgICAgY2xhc3Mvc3RydWN0IG5hbWUgc2hvdWxkIGJlIHVzZWQuCgogICAgICAgICAgICAgIHR5cGVkZWYgc3RydWN0IHRhZ0VTdHJ1Y3QgewogICAgICAgICAgICAgICAgaW50IGl2YXI7CiAgICAgICAgICAgICAgfSBFU3RydWN0OwoKICAgICAgICAgICAgICAlZXh0ZW5kIHRhZ0VTdHJ1Y3QgewogICAgICAgICAgICAgICAgRVN0cnVjdCgpIC8vIGlsbGVnYWwgbmFtZSwgc2hvdWxkIGJlIHRhZ0VTdHJ1Y3QoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBFU3RydWN0ICpzID0gbmV3IEVTdHJ1Y3QoKTsKICAgICAgICAgICAgICAgICAgcy0+aXZhciA9IGl2YXIwOwogICAgICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH5FU3RydWN0KCkgLy8gaWxsZWdhbCBuYW1lLCBzaG91bGQgYmUgfnRhZ0VTdHJ1Y3QoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBkZWxldGUgJHNlbGY7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgRm9yIG5vdyB0aGVzZSB0cmlnZ2VyIGEgd2FybmluZzoKCiAgICAgICAgICAgICAgZXh0ZW5kX2NvbnN0cnVjdG9yX2Rlc3RydWN0b3IuaToxMDc6IFdhcm5pbmcgNTIyOiBVc2Ugb2YgYW4gaWxsZWdhbCBjb25zdHJ1Y3RvciBuYW1lICdFU3RydWN0JyBpbgogICAgICAgICAgICAgICVleHRlbmQgaXMgZGVwcmVjYXRlZCwgdGhlIGNvbnN0cnVjdG9yIG5hbWUgc2hvdWxkIGJlICd0YWdFU3RydWN0Jy4KICAgICAgICAgICAgICBleHRlbmRfY29uc3RydWN0b3JfZGVzdHJ1Y3Rvci5pOjExMTogV2FybmluZyA1MjM6IFVzZSBvZiBhbiBpbGxlZ2FsIGRlc3RydWN0b3IgbmFtZSAnRVN0cnVjdCcgaW4KICAgICAgICAgICAgICAlZXh0ZW5kIGlzIGRlcHJlY2F0ZWQsIHRoZSBkZXN0cnVjdG9yIG5hbWUgc2hvdWxkIGJlICd0YWdFU3RydWN0Jy4KCiAgICAgICAgICAgIFRoZXNlICVleHRlbmQgZGVzdHJ1Y3RvciBhbmQgY29uc3RydWN0b3IgbmFtZXMgd2VyZSB2YWxpZCB1cCB0byBzd2lnLTIuMC40LCBob3dldmVyIHN3aWctMi4wLjUgaWdub3JlZAogICAgICAgICAgICB0aGVtIGFsdG9nZXRoZXIgZm9yIEMgY29kZSBhcyByZXBvcnRlZCBpbiBTRiBidWcgIzEzMDYuIFRoZSBvbGQgYmVoYXZpb3VyIG9mIHVzaW5nIHRoZW0gaGFzIGJlZW4KICAgICAgICAgICAgcmVzdG9yZWQgZm9yIG5vdywgYnV0IGlzIG9mZmljaWFsbHkgZGVwcmVjYXRlZC4gVGhpcyBkb2VzIG5vdCBhcHBseSB0byBhbm9ueW1vdXNseSBkZWZpbmVkIHR5cGVkZWYKICAgICAgICAgICAgY2xhc3Nlcy9zdHJ1Y3RzIHN1Y2ggYXM6CgogICAgICAgICAgICAgIHR5cGVkZWYgc3RydWN0IHsuLi59IFg7CgoyMDEzLTAyLTE3OiBrd3dldHRlCiAgICAgICAgICAgIFdoZW4gZ2VuZXJhdGluZyBmdW5jdGlvbnMgcHJvdmlkZWQgYnkgJWV4dGVuZCwgdXNlICIodm9pZCkiIGZvciBuby1hcmd1bWVudCBmdW5jdGlvbnMKICAgICAgICAgICAgaW5zdGVhZCBvZiAiKCkiLiBUaGlzIHByZXZlbnRzIHdhcm5pbmdzIHdoZW4gY29tcGlsaW5nIHdpdGggImdjYyAtV3N0cmljdC1wcm90b3R5cGVzIi4KCjIwMTMtMDItMTc6IGt3d2V0dGUKICAgICAgICAgICAgW09jdGF2ZV0gTWlub3IgZml4IHRvIGF1dG9kb2MgZ2VuZXJhdGlvbjogZ2V0IHRoZSByaWdodCB0eXBlIGZvciBmdW5jdGlvbnMgcmV0dXJuaW5nIHN0cnVjdHMuCgoyMDEzLTAyLTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBEZXByZWNhdGUgdHlwZWRlZiBuYW1lcyB1c2VkIGluICVleHRlbmQgdGhhdCBhcmUgbm90IHRoZSByZWFsIGNsYXNzL3N0cnVjdCBuYW1lLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgU3RydWN0Qk5hbWUgewogICAgICAgICAgICAgICAgaW50IG15aW50OwogICAgICAgICAgICAgIH0gU3RydWN0QjsKCiAgICAgICAgICAgICAgJWV4dGVuZCBTdHJ1Y3RCIHsKICAgICAgICAgICAgICAgIHZvaWQgbWV0aG9kKCkge30KICAgICAgICAgICAgICB9CgogICAgICAgICAgICB3aWxsIG5vdyB0cmlnZ2VyIGEgd2FybmluZzoKCiAgICAgICAgICAgICAgc3dpZ19leHRlbmQuaToxOTogV2FybmluZyAzMjY6IERlcHJlY2F0ZWQgJWV4dGVuZCBuYW1lIHVzZWQgLSB0aGUgc3RydWN0IG5hbWUgU3RydWN0Qk5hbWUKICAgICAgICAgICAgICBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSB0eXBlZGVmIG5hbWUgU3RydWN0Qi4KCiAgICAgICAgICAgIFRoaXMgaXMgb25seSBwYXJ0aWFsbHkgd29ya2luZyBhbnl3YXkgKHRoZSAlZXh0ZW5kIG9ubHkgd29ya2VkIGlmIHBsYWNlZCBhZnRlciB0aGUgY2xhc3MKICAgICAgICAgICAgZGVmaW5pdGlvbikuIAoKMjAxMy0wMi0wOTogd3NmdWx0b24KICAgICAgICAgICAgW0NGRkldIEFwcGx5IHBhdGNoICMyMiAtIEZpeCBtaXNzaW5nIHBhY2thZ2UgYmVmb3JlICZib2R5CgoyMDEzLTAxLTI5OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRW5zdXJlICdqYXZhcGFja2FnZScgdHlwZW1hcCBpcyB1c2VkIGFzIGl0IHN0b3BwZWQgd29ya2luZyBmcm9tIHZlcnNpb24gMi4wLjUuCgoyMDEzLTAxLTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBcHBseSBwYXRjaCBTRiAjMzM0IC0gRml4IGRlZmF1bHQgdmFsdWUgY29udmVyc2lvbnMgIlRSVUUiLT5UcnVlLCAiRkFMU0UiLT5GYWxzZS4KCjIwMTMtMDEtMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBBcHBseSBwYXRjaCBTRiAjMzM1IC0gVHJ1bHkgaWdub3JlIGNvbnN0cnVjdG9ycyBpbiBkaXJlY3RvcnMgd2l0aCAlaWdub3JlLgoKMjAxMy0wMS0xODogQnJhbnQgS3lzZXIKICAgICAgICAgICAgW0phdmFdIFBhdGNoICMxNSAtIEFsbG93IHRoZSB1c2Ugb2YgdGhlIG5zcGFjZSBmZWF0dXJlIHdpdGhvdXQgdGhlIC1wYWNrYWdlIGNvbW1hbmRsaW5lIG9wdGlvbi4KICAgICAgICAgICAgVGhpcyB3b3JrcyBhcyBsb25nIGFuZCB0aGUgbmV3IGpuaWNsYXNzcGFja2FnZSBwcmFnbWEgaXMgdXNlZCB0byBwbGFjZSB0aGUgSk5JIGludGVybWVkaWF0ZSBjbGFzcwogICAgICAgICAgICBpbnRvIGEgcGFja2FnZSBhbmQgdGhlIG5zcGFjZSBmZWF0dXJlIGlzIHVzZWQgdG8gcGxhY2UgYWxsIGV4cG9zZWQgdHlwZXMgaW50byBhIHBhY2thZ2UuCgoyMDEzLTAxLTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggVmlzdWFsIFN0dWRpbyBleGFtcGxlcyB0byB3b3JrIHdoZW4gU1dJRyBpcyB1bnppcHBlZCBpbnRvIGEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgc3BhY2VzLgoKMjAxMy0wMS0xNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggY3N0eXBlIHR5cGVtYXAgbG9va3VwIGZvciBtZW1iZXIgdmFyaWFibGVzIHNvIHRoYXQgYSBmdWxseSBxdWFsaWZpZWQgdmFyaWFibGUgbmFtZQogICAgICAgICAgICBtYXRjaGVzLiBGb3IgZXhhbXBsZToKICAgICAgICAgICAgICAldHlwZW1hcChjc3R5cGUpIGJvb2wgTVZhcjo6bXZhciAiTXlCb29sIgogICAgICAgICAgICAgIHN0cnVjdCBNVmFyIHsKICAgICAgICAgICAgICAgIGJvb2wgbXZhcjsKICAgICAgICAgICAgICB9OwoKMjAxMy0wMS0xMTogQnJhbnQgS3lzZXIKCSAgICBbSmF2YSwgQyMsIERdIFNGIEJ1ZyAjMTI5OSAtIEZpeCBnZW5lcmF0ZWQgbmFtZXMgZm9yIHdoZW4gJW5zcGFjZSBpcyB1c2VkIG9uCiAgICAgICAgICAgIGNsYXNzZXMgd2l0aCB0aGUgc2FtZSBuYW1lIGluIHR3byBkaWZmZXJlbnQgbmFtZXNwYWNlcy4KCjIwMTMtMDEtMTE6IFZsYWRpbWlyIEthbGluaW4KCSAgICBbQyNdIEFkZCBzdXBwb3J0IGZvciBjc2RpcmVjdG9yaW4gJ3ByZScsICdwb3N0JyBhbmQgJ3Rlcm1pbmF0b3InIGF0dHJpYnV0ZXMuCgoyMDEzLTAxLTA4OiBvbGx5CgkgICAgW1BIUF0gRml4IHRvIHdvcmsgd2l0aCBhIFpUUyBidWlsZCBvZiBQSFAgKGJyb2tlbiBpbiAyLjAuNykuCgoyMDEzLTAxLTA3OiBvbGx5CgkgICAgRml4IGJhc2hpc20gaW4gY29uZmlndXJlLCBpbnRyb2R1Y2VkIGluIDIuMC45LgoKMjAxMy0wMS0wNjogd3NmdWx0b24KICAgICAgICAgICAgUHVsbCBwYXRjaCAjNCBmcm9tIHB0b211bGlrIHRvIGZpeCBTRiBCdWcgIzEyOTYgLSBGaXggaW5jb3JyZWN0IHdhcm5pbmcgZm9yIHZpcnR1YWwgZGVzdHJ1Y3RvcnMKICAgICAgICAgICAgaW4gdGVtcGxhdGVzLCBzdWNoIGFzOgogICAgICAgICAgICAgV2FybmluZyA1MjE6IElsbGVnYWwgZGVzdHJ1Y3RvciBuYW1lIEI8IEEgPjo6fkIoKS4gSWdub3JlZC4KCjIwMTMtMDEtMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIFB1bGwgcGF0Y2ggIzMgZnJvbSBwdG9tdWxpayB0byBmaXggU0YgQnVnICMxMjk1IC0gc3RhbmRhcmQgZXhjZXB0aW9ucyBhcwogICAgICAgICAgICBjbGFzc2VzIHVzaW5nIHRoZSBTV0lHX1NURF9FWENFUFRJT05TX0FTX0NMQVNTRVMgbWFjcm8uCgoyMDEzLTAxLTA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUHVsbCBwYXRjaCAjMiBmcm9tIEJyYW50S3lzZXIgdG8gZml4IFNGIEJ1ZyAjMTI4MyAtIGZpeCBzbWFydCBwb2ludGVycyBpbiBjb25qdWN0aW9uCiAgICAgICAgICAgIHdpdGggZGlyZWN0b3JzLgoKMjAxMy0wMS0wMzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFB1bGwgcGF0Y2ggIzEgZnJvbSBCcmFudEt5c2VyIHRvIGZpeCBTRiBCdWcgIzEyNzggLSBmaXggZGlyZWN0b3JzIGFuZCBuc3BhY2UgZmVhdHVyZSB3aGVuCiAgICAgICAgICAgIG11bHRpbGV2ZWwgbmFtZXNwYWNlcyBhcmUgdXNlZC4KClZlcnNpb24gMi4wLjkgKDE2IERlY2VtYmVyIDIwMTIpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDEyLTEyLTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZ2FyYmFnZSBsaW5lIG51bWJlciAvIGVtcHR5IGZpbGUgbmFtZSByZXBvcnRpbmcgZm9yIHNvbWUgbWlzc2luZwogICAgICAgICAgICAnfScgb3IgJyknIGVycm9yIG1lc3NhZ2VzLgoKMjAxMi0xMi0xNToga2thZW1wZgogICAgICAgICAgICBbUnVieV0gQXBwbHkgcGF0Y2ggMzUzMDQ0NCwgQ2xhc3MjbWV0aG9kcyBhbmQgQ2xhc3MjY29uc3RhbnRzIHJldHVybnMgYXJyYXkgb2YKICAgICAgICAgICAgc3ltYm9scyBpbiBSdWJ5IDEuOSsKCjIwMTItMTItMTQ6IGtrYWVtcGYKICAgICAgICAgICAgW1J1YnldIEFwcGx5IHBhdGNoIDM1MzA0MzkgYW5kIGZpbmFsbHkgcmVwbGFjZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIFNUUjJDU1RSKCkgbWFjcm8KICAgICAgICAgICAgd2l0aCBTdHJpbmdWYWx1ZVB0cigpLiBTVFIyQ1NUUiB3YXMgZGVwcmVjYXRlZCBzaW5jZSB5ZWFycyBhbmQgZ290IHJlbW92ZWQgaW4gUnVieSAxLjkKCjIwMTItMTItMTQ6IGtrYWVtcGYKICAgICAgICAgICAgW1J1YnldIEFwcGxpZWQgcGF0Y2hlcyAjMzUzMDQ0MiBhbmQgMzUzMDQ0MyB0byBhZGFwdCBjb21waWxlIGFuZCBydW50aW1lIGluY2x1ZGUKICAgICAgICAgICAgcGF0aHMgdG8gbWF0Y2ggUnVieSAxLjkrCgoyMDEyLTEyLTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQ0ZGSV0gRml4ICMzMTYxNjE0IC0gU29tZSBzdHJpbmcgY29uc3RhbnRzIGFyZSBpbmNvcnJlY3QKCjIwMTItMTItMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDRkZJXSBGaXggIzM1Mjk2OTAgLSBGaXggaW5jb3JyZWN0IGNvbnN0YW50IG5hbWVzLgoKMjAxMi0xMi0xMjogZHJqb2UKCSAgICBbUl0gYWRkIGZpeCB0byBmaW5hbGl6ZXIgdGhhdCB3YXMgbWlzc2VkIGVhcmxpZXIKCjIwMTItMTItMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFwcGx5IHBhdGNoICMzNTkwNTIyIC0gZnVsbHkgcXVhbGlmaWVkIHBhY2thZ2UgcGF0aHMgZm9yIFB5dGhvbiAzIGV2ZW4gaWYgYSBtb2R1bGUgaXMgaW4gdGhlCiAgICAgICAgICAgIHNhbWUgcGFja2FnZS4KCjIwMTItMTItMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEJ1ZyAjMzU2MzY0NyAtIFB5SW50X0Zyb21TaXplX3QgdW5hdmFpbGFibGUgcHJpb3IgdG8gUHl0aG9uIDIuNSBmb3IgdW5zaWduZWQgaW50IHR5cGVzLgoKMjAxMi0xMi0wODogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIEZpeCBidWcgIzM1NzEzNjEgLSBDKysgY29tbWVudCBpbiBDIHdyYXBwZXJzLgoKMjAxMi0xMi0wNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBcHBseSBwYXRjaCAjMzU3MTAyOSB3aGljaCBhZGRzIG1pc3NpbmcgZGlyZWN0b3Igc3VwcG9ydCBmb3IgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICYuCgoyMDEyLTExLTI4OiBrd3dldHRlCiAgICAgICAgICAgIFtPY3RhdmVdIFNpbXBsaWZpZWQgbW9kdWxlIGxvYWRpbmc6IG5vdyBqdXN0IHRoZSBzeW50YXgKICAgICAgICAgICAgJCBleGFtcGxlOwogICAgICAgICAgICBpcyBhY2NlcHRlZCwgd2hpY2ggbG9hZHMgZnVuY3Rpb25zIGdsb2JhbGx5IGJ1dCBjb25zdGFudHMgYW5kIHZhcmlhYmxlcyByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBzY29wZS4KICAgICAgICAgICAgVGhpcyBtYWtlIG1vZHVsZSBsb2FkaW5nIGJlaGF2aW91ciByZWxpYWJseSBjb25zaXN0ZW50LCBhbmQgcmVkdWNlcyBwcm9ibGVtcyB3aGVuIGxvYWRpbmcgbW9kdWxlcyB3aGljaAogICAgICAgICAgICBkZXBlbmQgb24gb3RoZXIgbW9kdWxlcyB3aGljaCBtYXkgbm90IGhhdmUgYmVlbiBwcmV2aW91c2x5IGxvYWRlZC4KCjIwMTItMTEtMjc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtjZmZpXSBGaXgganVuayBvdXRwdXQgd2hlbiB3cmFwcGluZyBzaW5nbGUgY2hhcmFjdGVyIGxpdGVyYWwgY29uc3RhbnRzLgoKMjAxMi0xMS0xNzogd3NmdWx0b24KICAgICAgICAgICAgW1RjbCwgTW9kdWxhM10gQWRkIG1pc3Npbmcgc3VwcG9ydCBmb3IgLW91dGRpci4KCjIwMTItMTEtMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzZWdmYXVsdHMgd2hlbiB1c2luZyBmaWxlbmFtZSBwYXRocyBncmVhdGVyIHRoYW4gMTAyNCBjaGFyYWN0ZXJzIGluIGxlbmd0aC4KCjIwMTItMTEtMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtjY2FjaGUtc3dpZ10gQXBwbHkgcGF0Y2ggIzM1ODYzOTIgZnJvbSBGcmVkZXJpayBEZXdlZXJkdCB0byBmaXggc29tZSBlcnJvciBjYXNlcyAtIGluY29ycmVjdGx5IHVzaW5nCiAgICAgICAgICAgIG1lbW9yeSBhZnRlciBpdCBoYXMgYmVlbiBkZWxldGVkLgoKMjAxMi0xMS0wOTogdnplaXRsaW4KICAgICAgICAgICAgW1B5dGhvbl0gRml4IG92ZXJmbG93IHdoZW4gcGFzc2luZyB2YWx1ZXMgZ3JlYXRlciB0aGFuIExPTkdfTUFYIGZyb20gUHl0aG9uIDMgZm9yIHBhcmFtZXRlcnMgd2l0aCB1bnNpZ25lZCBsb25nIEMgdHlwZS4KCjIwMTItMTEtMDk6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzb21lIGZlYXR1cmUgbWF0Y2hpbmcgaXNzdWVzIGZvciBpbXBsaWNpdCBkZXN0cnVjdG9ycyBhbmQgaW1wbGljaXQgY29uc3RydWN0b3JzIGFuZCBpbXBsaWNpdAogICAgICAgICAgICBjb3B5IGNvbnN0cnVjdG9ycyBhZGRlZCB3aXRoICVjb3B5Y3Rvci4gUHJldmlvdXNseSBhIGZlYXR1cmUgZm9yIHRoZXNlIGhhZCB0byBiZSBmdWxseSBxdWFsaWZpZWQKICAgICAgICAgICAgaW4gb3JkZXIgdG8gbWF0Y2guIE5vdyB0aGUgZm9sbG93aW5nIHdpbGwgYWxzbyBtYXRjaDoKCiAgICAgICAgICAgICAgJWZlYXR1cmUoInh5eiIpIH5YWFgoKTsKICAgICAgICAgICAgICBzdHJ1Y3QgWFhYIHt9OwoKMjAxMi0xMS0wOTogd3NmdWx0b24KICAgICAgICAgICAgRnVydGhlciBjb25zaXN0ZW5jeSBpbiBuYW1lZCBvdXRwdXQgdHlwZW1hcCBsb29rdXBzIGZvciBpbXBsaWNpdCBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGFuZAogICAgICAgICAgICBpbXBsaWNpdCBjb3B5IGNvbnN0cnVjdG9ycyBhZGRlZCB3aXRoICVjb3B5Y3Rvci4gUHJldmlvdXNseSBvbmx5IHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSB3YXMgYmVpbmcKICAgICAgICAgICAgdXNlZCwgbm93IHRoZSB1bnF1YWxpZmllZCBuYW1lIHdpbGwgYWxzbyBiZSB1c2VkLiBGb3IgZXhhbXBsZSwgcHJldmlvdXNseToKCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjM4OiBTZWFyY2hpbmcgZm9yIGEgc3VpdGFibGUgJ291dCcgdHlwZW1hcCBmb3I6IHZvaWQgU3BhY2U6Ok1vcmU6On5Nb3JlCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogdm9pZCBTcGFjZTo6TW9yZTo6fk1vcmUKICAgICAgICAgICAgICAgIExvb2tpbmcgZm9yOiB2b2lkCgogICAgICAgICAgICBOb3cgdGhlIHVucXVhbGlmaWVkIG5hbWUgaXMgYWxzbyB1c2VkOgoKICAgICAgICAgICAgICBleGFtcGxlLmk6Mzg6IFNlYXJjaGluZyBmb3IgYSBzdWl0YWJsZSAnb3V0JyB0eXBlbWFwIGZvcjogdm9pZCBTcGFjZTo6TW9yZTo6fk1vcmUKICAgICAgICAgICAgICAgIExvb2tpbmcgZm9yOiB2b2lkIFNwYWNlOjpNb3JlOjp+TW9yZQogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IHZvaWQgfk1vcmUKICAgICAgICAgICAgICAgIExvb2tpbmcgZm9yOiB2b2lkCgoyMDEyLTExLTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc29tZSBzdWJ0bGUgbmFtZWQgb3V0cHV0IHR5cGVtYXAgbG9va3VwIG1pc3NlcywgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIHdhcyBub3QgYWx3YXlzIGJlaW5nCiAgICAgICAgICAgIHVzZWQgZm9yIHZhcmlhYmxlcywgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHN0cnVjdCBHbG9iIHsKICAgICAgICAgICAgICAgIGludCBNeVZhcjsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgUHJldmlvdXNseSB0aGUgc2VhcmNoIHJ1bGVzIChhcyBzaG93biBieSAtZGVidWctdG1zZWFyY2gpIGZvciB0aGUgZ2V0dGVyIHdyYXBwZXIgd2VyZToKCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjQ0OiBTZWFyY2hpbmcgZm9yIGEgc3VpdGFibGUgJ291dCcgdHlwZW1hcCBmb3I6IGludCBNeVZhcgogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IGludCBNeVZhcgogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IGludAoKICAgICAgICAgICAgTm93IHRoZSBzY29wZSBpcyBuYW1lZCBjb3JyZWN0bHk6CgogICAgICAgICAgICAgIGV4YW1wbGUuaTo0NDogU2VhcmNoaW5nIGZvciBhIHN1aXRhYmxlICdvdXQnIHR5cGVtYXAgZm9yOiBpbnQgR2xvYjo6TXlWYXIKICAgICAgICAgICAgICAgIExvb2tpbmcgZm9yOiBpbnQgR2xvYjo6TXlWYXIKICAgICAgICAgICAgICAgIExvb2tpbmcgZm9yOiBpbnQgTXlWYXIKICAgICAgICAgICAgICAgIExvb2tpbmcgZm9yOiBpbnQKCjIwMTItMTAtMjY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBkaXJlY3RvciB0eXBlbWFwIHNlYXJjaGluZyBzbyB0aGF0IGEgdHlwZW1hcCBzcGVjaWZpZWQgd2l0aCBhIG5hbWUgd2lsbCBiZSBjb3JyZWN0bHkgbWF0Y2hlZC4gUHJldmlvdXNseQogICAgICAgICAgICB0aGUgbmFtZSB3YXMgaWdub3JlZCBkdXJpbmcgdGhlIHR5cGVtYXAgc2VhcmNoLiBBcHBsaWVzIHRvIHRoZSBmb2xsb3dpbmcgbGlzdCBvZiB0eXBlbWFwczogCiAgICAgICAgICAgIGRpcmVjdG9yb3V0LCBjc2RpcmVjdG9yb3V0LCBjc3R5cGUsIGltdHlwZSwgY3R5cGUsIGRkaXJlY3Rvcm91dCwgZHR5cGUsIGdvdHlwZSwganR5cGUsIGpuaSwgamF2YWRpcmVjdG9yb3V0LgoKMjAxMi0xMC0xMTogd3NmdWx0b24KICAgICAgICAgICAgTW9zdCBvZiB0aGUgc3BlY2lhbCB2YXJpYWJsZXMgYXZhaWxhYmxlIGZvciB1c2UgaW4gJWV4Y2VwdGlvbiBhcmUgbm93IGFsc28gYXZhaWxhYmxlIGZvciBleHBhbnNpb24gaW4KICAgICAgICAgICAgJWV4dGVuZCBibG9ja3MuIFRoZXNlIGFyZTogJG5hbWUgJHN5bW5hbWUgJG92ZXJuYW1lICRkZWNsICRmdWxsZGVjbCAkcGFyZW50Y2xhc3NuYW1lICRwYXJlbnRjbGFzc3N5bW5hbWUsIHNlZSBkb2NzCiAgICAgICAgICAgIG9uICJDbGFzcyBleHRlbnNpb24iIGluIFNXSUdQbHVzLmh0bWwuIFBhdGNoIGJhc2VkIG9uIHN1Ym1pc3Npb24gZnJvbSBLcmlzIFRoaWVsZW1hbnMuCgoyMDEyLTEwLTEwOiB3c2Z1bHRvbgogICAgICAgICAgICBBZGRpdGlvbmFsIG5ldyBzcGVjaWFsIHZhcmlhYmxlcyBpbiAlZXhjZXB0aW9uIGFyZSBleHBhbmRlZCBhcyBmb2xsb3dzOgogICAgICAgICAgICAgICRwYXJlbnRjbGFzc25hbWUgLSBUaGUgcGFyZW50IGNsYXNzIG5hbWUgKGlmIGFueSkgZm9yIGEgbWV0aG9kLgogICAgICAgICAgICAgICRwYXJlbnRjbGFzc3N5bW5hbWUgLSBUaGUgdGFyZ2V0IGxhbmd1YWdlIHBhcmVudCBjbGFzcyBuYW1lIChpZiBhbnkpIGZvciBhIG1ldGhvZC4KCjIwMTItMTAtMDg6IGlhbnQKCSAgICBbR29dIEdlbmVyYXRpbmcgR28gY29kZSBub3cgcmVxdWlyZXMgdXNpbmcgdGhlIC1pbnRnb3NpemUgb3B0aW9uIHRvCgkgICAgaW5kaWNhdGUgdGhlIHNpemUgb2YgdGhlICdpbnQnIHR5cGUgaW4gR28uICBUaGlzIGlzIGJlY2F1c2UgdGhlCgkgICAgc2l6ZSBvZiB0aGUgdHlwZSBpcyBjaGFuZ2luZyBmcm9tIEdvIDEuMCB0byBHbyAxLjEgZm9yIHg4Nl82NC4gCgoyMDEyLTA5LTE0OiB3c2Z1bHRvbgoJICAgIEFkZCBuZXcgd2FybmluZyBpZiB0aGUgZW1wdHkgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiBpcyB1c2VkIGFzIGEgYmFzZSBjbGFzcywgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBCYXNlIHt9OwogICAgICAgICAgICAgICV0ZW1wbGF0ZSgpIEJhc2U8aW50PjsKICAgICAgICAgICAgICBjbGFzcyBEZXJpdmVkIDogcHVibGljIEJhc2U8aW50PiB7fTsKCiAgICAgICAgICAgIGdpdmVzIHRoZSBmb2xsb3dpbmcgd2FybmluZyBpbnN0ZWFkIG9mIHNpbGVudGx5IGlnbm9yaW5nIHRoZSBiYXNlOgoKICAgICAgICAgICAgY3BwX2luaGVyaXQuaTo1MjogV2FybmluZyA0MDE6IEJhc2UgY2xhc3MgJ0Jhc2U8IGludCA+JyBoYXMgbm8gbmFtZSBhcyBpdCBpcyBhbiBlbXB0eSB0ZW1wbGF0ZSBpbnN0YW50aWF0ZWQgd2l0aCAnJXRlbXBsYXRlKCknLiBJZ25vcmVkLgogICAgICAgICAgICBjcHBfaW5oZXJpdC5pOjUxOiBXYXJuaW5nIDQwMTogVGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgbXVzdCBiZSB3cml0dGVuIGJlZm9yZSAnQmFzZTwgaW50ID4nIGlzIHVzZWQgYXMgYSBiYXNlIGNsYXNzIGFuZCBiZSBkZWNsYXJlZCB3aXRoIGEgbmFtZS4KCgoyMDEyLTA5LTExOiB3c2Z1bHRvbgoJICAgIFtKYXZhXSBGaXggIzM1MzUzMDQgLSBEaXJlY3QgdXNlIG9mIGEgd2VhayBnbG9iYWwgcmVmZXJlbmNlIGluIGRpcmVjdG9ycwogICAgICAgICAgICBzb21ldGltZXMgY2F1c2luZyBzZWcgZmF1bHRzIGVzcGVjaWFsbHkgb24gQW5kcm9pZC4KCjIwMTItMDktMDY6IHdzZnVsdG9uCgkgICAgW0phdmFdIEZpeCAoY2hhciAqU1RSSU5HLCBzaXplX3QgTEVOR1RIKSB0eXBlbWFwcyB0byBhY2NlcHQgTlVMTCBzdHJpbmcuCgoyMDEyLTA4LTI2OiBkcmpvZQoJICAgIFtSXSBtYWtlIEV4dGVybmFsUmVmZXJlbmNlIHNsb3QgcmVmIHRvIGNvbnRhaW4gcmVmZXJlbmNlCgoyMDEyLTA4LTI2OiBkcmpvZQoJICAgIFtSXSBmaXggRXhhbXBsZXMvTWFrZWZpbGUgdG8gdXNlIEMgaW4gJChDQykgcmF0aGVyIHRoYW4gJChDWFgpCgpWZXJzaW9uIDIuMC44ICgyMCBBdWd1c3QgMjAxMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDEyLTA4LTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gQWRkIHNpemVfdHlwZSwgdmFsdWVfdHlwZSwgY29uc3RfcmVmZXJlbmNlIHRvIHRoZSBTVEwgY29udGFpbmVycy4KCjIwMTItMDgtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFkZCBkaXNjYXJkIGFuZCBhZGQgbWV0aG9kcyB0byBzdGQ6OnNldCB3cmFwcGVycyBzbyB0aGF0IHB5YWJjLmkgY2FuIGJlIHVzZWQgZW5zdXJpbmcKICAgICAgICAgICAgTXV0YWJsZVNldCBpcyBhIHZhbGlkIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHN0ZDo6c2V0LiBBcyByZXBvcnRlZCBieSBBbGV4ZXkgU29rb2xvdi4KICAgICAgICAgICAgU2ltaWxhcmx5IGZvciBzdGQ6Om11bHRpc2V0LgoKMjAxMi0wOC0xNTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4ICMzNTQxNzQ0IC0gTWlzc2luZyBQeUludF9Gcm9tU2l6ZV90IGNhbGxzIGZvciBQeXRob24gMy4KCjIwMTItMDgtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBQYXRjaCBmcm9tIERhdmlkIEJhdW0gdG8gYWRkIHRoZSBhc3N1bWVvdmVycmlkZSBmZWF0dXJlIGZvciBKYXZhIGRpcmVjdG9ycyB0bwogICAgICAgICAgICBpbXByb3ZlIHBlcmZvcm1hbmNlIHdoZW4gYWxsIG92ZXJyaWRkZW4gbWV0aG9kcyBjYW4gYmUgYXNzdW1lZCB0byBiZSBvdmVycmlkZGVuLgoKMjAxMi0wOC0wNTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gIzM1MzAwMjEgRml4IHVudXNlZCB2YXJpYWJsZSB3YXJuaW5nLgoKMjAxMi0wOC0wNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggIzM1MzYzNjAgLSBJbnZhbGlkIGNvZGUgc29tZXRpbWVzIGJlaW5nIGdlbmVyYXRlZCBmb3IgZGlyZWN0b3IgbWV0aG9kcwogICAgICAgICAgICB3aXRoIG1hbnkgYXJndW1lbnRzLgoKMjAxMi0wOC0wNTogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdICMzNTQ1ODc3IC0gRG9uJ3QgdW5kZWZpbmUgYm9vbCBpZiBkZWZpbmVkIGJ5IEM5OSBzdGRib29sLmggLSBwcm9ibGVtIHVzaW5nIAogICAgICAgICAgICBQZXJsIDUuMTYgYW5kIGxhdGVyLgoKMjAxMi0wOC0wNDogd3NmdWx0b24KICAgICAgICAgICAgUmVtb3ZlIGluY29ycmVjdCB3YXJuaW5nICgzMTQpIGFib3V0IHRhcmdldCBsYW5ndWFnZSBrZXl3b3JkcyB3aGljaCB3ZXJlIHRyaWdnZXJlZAogICAgICAgICAgICBieSB1c2luZyBkZWNsYXJhdGlvbnMgYW5kIHVzaW5nIGRpcmVjdGl2ZXMuIEZvciBleGFtcGxlICdzdHJpbmcnIGlzIGEga2V5d29yZCBpbiBDIzoKICAgICAgICAgICAgICBuYW1lc3BhY2Ugc3RkIHsgY2xhc3Mgc3RyaW5nOyB9CiAgICAgICAgICAgICAgdXNpbmcgc3RkOjpzdHJpbmc7CgoyMDEyLTA3LTIxOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZGlzcGxheSBvZiBwb2ludGVycyBpbiB2YXJpb3VzIHBsYWNlcyBvbiA2NCBiaXQgc3lzdGVtcyAtIG9ubHkgMzIgYml0cyB3ZXJlIGJlaW5nIHNob3duLgoKMjAxMi0wNy0yMTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGdkYiBkZWJ1Z2dlciBmdW5jdGlvbnMgJ3N3aWdwcmludCcgYW5kICdsb2Nzd2lncHJpbnQnIHRvIGRpc3BsYXkgdG8gdGhlIGdkYiBvdXRwdXQgd2luZG93CiAgICAgICAgICAgIHJhdGhlciB0aGFuIHN0ZG91dC4gVGhpcyBmaXhlcyBkaXNwbGF5IHByb2JsZW1zIGluIGdkYnR1aSBhbmQgdGhlIGVuc3VyZXMgdGhlIG91dHB1dAogICAgICAgICAgICBhcHBlYXJzIHdoZXJlIGV4cGVjdGVkIGluIG90aGVyIGdkYiBiYXNlZCBkZWJ1Z2dlcnMgc3VjaCBhcyBFY2xpcHNlIENEVC4KCjIwMTItMDctMjA6IGt3d2V0dGUKICAgICAgICAgICAgW09jdGF2ZV0gc2VnZmF1bHQtb24tZXhpdCBwcmV2ZW50aW9uIGhhY2sgbm93IHByZXNlcnZlcyBleGl0IHN0YXR1cywgYW5kIHVzZXMgQzk5IF9FeGl0KCkuCgoyMDEyLTA3LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggRGViaWFuIGJ1ZyBodHRwOi8vYnVncy5kZWJpYW4ub3JnLzY3MjAzNSwgdHlwZW1hcCBjb3B5IGZhaWx1cmUgLSByZWdyZXNzaW9uIGludHJvZHVjZWQgCiAgICAgICAgICAgIGluIHN3aWctMi4wLjU6CiAgICAgICAgICAgICAgJWluY2x1ZGU8c3RsLmk+CiAgICAgICAgICAgICAgdXNpbmcgc3RkOjpwYWlyOwogICAgICAgICAgICAgICV0ZW1wbGF0ZShTdHJQYWlyKSBwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz47CgoyMDEyLTA3LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggdXNpbmcgZGVjbGFyYXRpb25zIGNvbWJpbmVkIHdpdGggdXNpbmcgZGlyZWN0aXZlcyB3aXRoIGZvcndhcmQgY2xhc3MgZGVjbGFyYXRpb25zIHNvIHRoYXQKICAgICAgICAgICAgdHlwZXMgYXJlIGNvcnJlY3RseSBmb3VuZCBpbiBzY29wZSBmb3IgdGVtcGxhdGVzLiBFeGFtcGxlOgoKICAgICAgICAgICAgICBuYW1lc3BhY2UgT3V0ZXIyIHsKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBTcGFjZTIgewogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBUaGluZzI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBPdXRlcjI7CiAgICAgICAgICAgICAgdXNpbmcgU3BhY2UyOjpUaGluZzI7CiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgVGhpbmcyIHt9OwogICAgICAgICAgICAgIC8vIFNUSUxMIEJST0tFTiB2b2lkIHVzZWl0MihUaGluZzI8aW50PiB0KSB7fQogICAgICAgICAgICAgIHZvaWQgdXNlaXQyYShPdXRlcjI6OlNwYWNlMjo6VGhpbmcyPGludD4gdCkge30KICAgICAgICAgICAgICB2b2lkIHVzZWl0MmIoOjpPdXRlcjI6OlNwYWNlMjo6VGhpbmcyPGludD4gdCkge30KICAgICAgICAgICAgICB2b2lkIHVzZWl0MmMoU3BhY2UyOjpUaGluZzI8aW50PiB0KSB7fQogICAgICAgICAgICAgIG5hbWVzcGFjZSBPdXRlcjIgewogICAgICAgICAgICAgICAgdm9pZCB1c2VpdDJkKFNwYWNlMjo6VGhpbmcyPGludD4gdCkge30KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICV0ZW1wbGF0ZShUaGluZzJJbnQpIFRoaW5nMjxpbnQ+OwoKCjIwMTItMDYtMzA6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB0ZW1wbGF0ZSBuYW1lc3BhY2UgcHJvYmxlbXMgZm9yIHN5bWJvbHMgZGVjbGFyZWQgd2l0aCBhIGZvcndhcmQgY2xhc3MgZGVjbGFyYXRpb25zLCBzdWNoIGFzOgoKICAgICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2UxIHsKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBTcGFjZTIgewogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgWVlZOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IFNwYWNlMjo6WVlZIHsKICAgICAgICAgICAgICAgICAgVCB5eXkoVCBoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGg7CiAgICAgICAgICAgICAgICAgIH0gICAgCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdm9pZCB0ZXN0WVlZMShTcGFjZTE6OlNwYWNlMjo6WVlZPGludD4geXkpIHt9CiAgICAgICAgICAgICAgICB2b2lkIHRlc3RZWVkyKFNwYWNlMjo6WVlZPGludD4geXkpIHt9CiAgICAgICAgICAgICAgICB2b2lkIHRlc3RZWVkzKDo6U3BhY2UxOjpTcGFjZTI6OllZWTxpbnQ+IHl5KSB7fQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgJXRlbXBsYXRlKFlZWUludCkgU3BhY2UxOjpTcGFjZTI6OllZWTxpbnQ+OwoKMjAxMi0wNi0zMDogd3NmdWx0b24KICAgICAgICAgICAgRml4IG5hbWVzcGFjZSBwcm9ibGVtcyBmb3Igc3ltYm9scyBkZWNsYXJlZCB3aXRoIGEgZm9yd2FyZCBjbGFzcyBkZWNsYXJhdGlvbnMsIHN1Y2ggYXM6CgogICAgICAgICAgICAgIG5hbWVzcGFjZSBTcGFjZTEgewogICAgICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlMiB7CiAgICAgICAgICAgICAgICAgIHN0cnVjdCBYWFg7CiAgICAgICAgICAgICAgICAgIHN0cnVjdCBZWVk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc3RydWN0IFNwYWNlMjo6WVlZIHt9OwogICAgICAgICAgICAgICAgc3RydWN0IFNwYWNlMTo6U3BhY2UyOjpYWFgge307CgogICAgICAgICAgICAgICAgdm9pZCB0ZXN0WFhYMihTcGFjZTI6OlhYWCB4eCkge30KICAgICAgICAgICAgICAgIHZvaWQgdGVzdFlZWTIoU3BhY2UyOjpZWVkgeXkpIHt9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgd2hlcmUgeHggYW5kIHl5IHdlcmUgbm90IHJlY29nbmlzZWQgYXMgdGhlIHByb3h5IGNsYXNzZXMgWFhYIGFuZCBZWVkuCgoyMDEyLTA2LTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggdXNpbmcgZGVjbGFyYXRpb25zIGNvbWJpbmVkIHdpdGggdXNpbmcgZGlyZWN0aXZlcyB3aXRoIGZvcndhcmQgY2xhc3MgZGVjbGFyYXRpb25zIHNvIHRoYXQKICAgICAgICAgICAgdHlwZXMgYXJlIGNvcnJlY3RseSBmb3VuZCBpbiBzY29wZS4gCgogICAgICAgICAgICAgIG5hbWVzcGFjZSBPdXRlcjIgewogICAgICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlMiB7CiAgICAgICAgICAgICAgICAgIGNsYXNzIFRoaW5nMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdXNpbmcgbmFtZXNwYWNlIE91dGVyMjsKICAgICAgICAgICAgICB1c2luZyBTcGFjZTI6OlRoaW5nMjsKICAgICAgICAgICAgICBjbGFzcyBUaGluZzIge307CiAgICAgICAgICAgICAgLy8gTm9uZSBvZiB0aGUgbWV0aG9kcyBiZWxvdyBjb3JyZWN0bHkgdXNlZCB0aGUgVGhpbmcyIHByb3h5IGNsYXNzCiAgICAgICAgICAgICAgdm9pZCB1c2VpdDIoVGhpbmcyIHQpIHt9CiAgICAgICAgICAgICAgdm9pZCB1c2VpdDJhKE91dGVyMjo6U3BhY2UyOjpUaGluZzIgdCkge30KICAgICAgICAgICAgICB2b2lkIHVzZWl0MmIoOjpPdXRlcjI6OlNwYWNlMjo6VGhpbmcyIHQpIHt9CiAgICAgICAgICAgICAgdm9pZCB1c2VpdDJjKFNwYWNlMjo6VGhpbmcyIHQpIHt9CiAgICAgICAgICAgICAgbmFtZXNwYWNlIE91dGVyMiB7CiAgICAgICAgICAgICAgICB2b2lkIHVzZWl0MmQoU3BhY2UyOjpUaGluZzIgdCkge30KICAgICAgICAgICAgICB9CgoyMDEyLTA2LTI1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggdXNpbmcgZGVjbGFyYXRpb25zIGNvbWJpbmVkIHdpdGggdXNpbmcgZGlyZWN0aXZlcyBzbyB0aGF0IHR5cGVzIGFyZSBjb3JyZWN0bHkgZm91bmQgaW4gc2NvcGUuCiAgICAgICAgICAgIEV4YW1wbGU6CgogICAgICAgICAgICAgIG5hbWVzcGFjZSBPdXRlcjIgewogICAgICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlMiB7CiAgICAgICAgICAgICAgICAgIGNsYXNzIFRoaW5nMiB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdXNpbmcgbmFtZXNwYWNlIE91dGVyMjsgLy8gdXNpbmcgZGlyZWN0aXZlCiAgICAgICAgICAgICAgdXNpbmcgU3BhY2UyOjpUaGluZzI7IC8vIHVzaW5nIGRlY2xhcmF0aW9uCiAgICAgICAgICAgICAgdm9pZCB1c2VpdDIoVGhpbmcyIHQpIHt9CgogICAgICAgICAgICBTaW1pbGFybHkgZm9yIHRlbXBsYXRlZCBjbGFzc2VzLgoKMjAxMi0wNS0yOTogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMzNTI5NjAxIC0gc2VnIGZhdWx0IHdoZW4gYSBwcm90ZWN0ZWQgbWV0aG9kIGhhcyB0aGUgImRpcmVjdG9yIgogICAgICAgICAgICBmZWF0dXJlIGJ1dCB0aGUgcGFyZW50IGNsYXNzIGRvZXMgbm90LiBBbHNvIGZpeCBzaW1pbGFyIHByb2JsZW1zIHdpdGgKICAgICAgICAgICAgdGhlIGFsbHByb3RlY3RlZCBmZWF0dXJlLgoKMjAxMi0wNS0yODogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNlZyBmYXVsdCB3aGVuIGF0dGVtcHRpbmcgdG8gd2FybiBhYm91dCBhbiBpbGxlZ2FsIGRlc3RydWN0b3IgLSAjMzUzMDA1NSwgMzUzMDA3OCBhbmQgIzM1MzAxMTguCgpWZXJzaW9uIDIuMC43ICgyNiBNYXkgMjAxMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09CjIwMTItMDUtMjY6IHdzZnVsdG9uCiAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHR5cGVtYXAgbW9kaWZpY2F0aW9ucyBzbyB0aGV5IGNhbiBiZSB1c2VkIHdpdGggJWFwcGx5IGZvciBvdGhlciBzdHJpbmcKICAgICAgICAgICAgY2xhc3Nlcy4KCjIwMTItMDUtMjU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIEZpeGVzIGZvciAtZXh0ZXJuYWwtcnVudGltZSB0byB3b3JrIGFnYWluLgoKMjAxMi0wNS0yMjogc3phZ2VyCgkgICAgW3B5dGhvbl0gRGlzYW1iaWd1YXRlIFNXSUdfRnJvbV91bnNpZ25lZF9TU19pbnQgYW5kIFNXSUdfRnJvbV91bnNpZ25lZF9TU19sb25nLgoKMjAxMi0wNS0xODogb2xseQoJICAgIFtQSFBdIEZpeCBnZXR0ZXJzIGZvciB0ZW1wbGF0ZSBtZW1iZXJzLiAoU0YjMzQyODgzMywgU0YjMzUyODAzNSkKCjIwMTItMDUtMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzb21lIGxhbmd1YWdlJ3Mgc3RkOjptYXAgd3JhcHBlcnMgdG8gcmVjb2duaXNlIGRpZmZlcmVuY2VfdHlwZSwgc2l6ZV90eXBlLCBrZXlfdHlwZQogICAgICAgICAgICBhbmQgbWFwcGVkX3R5cGUuCgoyMDEyLTA1LTE0OiBrd3dldHRlIChzaWduZWQgb2ZmIGJ5IHhhdmllcjk4KQogICAgICAgICAgICBbT2N0YXZlXSBQcmV2ZW50IE9jdGF2ZSBmcm9tIHNlZy1mYXVsdGluZyBhdCBleGl0IHdoZW4gU1dJRwogICAgICAgICAgICBtb2R1bGVzIGFyZSBsb2FkZWQsIGR1ZSB0byBidWdzIGluIE9jdGF2ZSdzIGNsZWFudXAgY29kZToKICAgICAgICAgICAgKiBXcmFwcGluZyBmdW5jdGlvbnMgbm93IGRlY2xhcmVkIHdpdGggT2N0YXZlIERFRlVOX0RMRCBtYWNybywKICAgICAgICAgICAgICBhbmQgbG9hZGVkIHRocm91Z2ggT2N0YXZlJ3MgZHluYW1pYyBtb2R1bGUgbG9hZGVyCiAgICAgICAgICAgICogR2xvYmFsIHZhcmlhYmxlcyBvZiBzd2lncmVmIHR5cGUgYXJlIG5vdyBhc3NpZ25lZCBhIG5ldygpCiAgICAgICAgICAgICAgY29weSBvZiB0aGUgc3dpZ3JlZiBjbGFzcywgdG8gcHJldmVudCBkb3VibGUtZnJlZSBlcnJvcnMKICAgICAgICAgICAgKiBTV0lHIG1vZHVsZSBhdC1leGl0IGNsZWFudXAgZnVuY3Rpb24gbm93IGNyZWF0ZWQgaW4gT2N0YXZlCiAgICAgICAgICAgICAgdGhyb3VnaCBldmFsKCksIHNvIG5vdCBkZXBlbmRlbnQgb24gbG9hZGVkIC5vY3QgbGlicmFyeQogICAgICAgICAgICAqIEZvciBPY3RhdmUgdmVyc2lvbnMgMy4xLiogdG8gMy4zLiosIHJlZ2lzdGVyIEMtbGV2ZWwgYXQtZXhpdAogICAgICAgICAgICAgIGZ1bmN0aW9uIHdoaWNoIHRlcm1pbmF0ZXMgT2N0YXZlIGltbWVkaWF0ZWx5ICh3aXRoIGNvcnJlY3QKICAgICAgICAgICAgICBzdGF0dXMgY29kZSkgd2l0aG91dCBwZXJmb3JtaW5nIG1lbW9yeSBjbGVhbnVwLiBUaGlzIGZ1bmN0aW9uCiAgICAgICAgICAgICAgY2FuIGJlIGNvbnRyb2xsZWQgd2l0aCBtYWNyb3MgaW4gTGliL29jdGF2ZS9vY3RydW50aW1lLnN3ZwoKICAgICAgICAgICAgW09jdGF2ZV0gTmV3IHN5bnRheCBmb3IgZGV0ZXJtaW5nIHdoZXRoZXIgU1dJRyBtb2R1bGUgc2hvdWxkIGJlCiAgICAgICAgICAgIGxvYWRlZCBnbG9iYWxseSBvciBub24tZ2xvYmFsbHkuIFRvIGxvYWQgbW9kdWxlICJleGFtcGxlIiBnbG9iYWxseSwKICAgICAgICAgICAgdHlwZSB0aGUgbW9kdWxlIG5hbWUKICAgICAgICAgICAgJCBleGFtcGxlOwogICAgICAgICAgICBhcyBiZWZvcmU7IHRvIGxvYWQgbW9kdWxlIG5vbi1nbG9iYWxseSwgYXNzaWduIGl0IHRvIGEgdmFyaWFibGU6CiAgICAgICAgICAgICQgZXhhbXBsZSA9IGV4YW1wbGU7CiAgICAgICAgICAgIG9yCiAgICAgICAgICAgICQgZXggPSBleGFtcGxlOwogICAgICAgICAgICBmb3IgYSBzaG9ydGVyIChsb2NhbCkgbW9kdWxlIG5hbWUuIC1nbG9iYWwvLW5vZ2xvYmFsIGNvbW1hbmQtbGluZQogICAgICAgICAgICBvcHRpb25zIGFuZCBtb2R1bGUgY29tbWFuZCBsaW5lIGFyZSBkZXByZWNhdGVkLiBBZGRlZCB1c2FnZSBpbmZvCiAgICAgICAgICAgIHRvIG1vZHVsZSwgc28gdHlwaW5nCiAgICAgICAgICAgICQgaGVscCBleGFtcGxlCiAgICAgICAgICAgIG9yIGluY29ycmVjdCB1c2FnZSBzaG91bGQgZGlzcGxheSBwcm9wZXIgdXNhZ2UsIHdpdGggZXhhbXBsZXMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDEyLTA1LTEyOiBvbGx5CgkgICAgW1BIUF0gRml4IG1lbW9yeSBsZWFrIGluIGNvZGUgZ2VuZXJhdGVkIGZvciBhIGNhbGxiYWNrLiAgUGF0Y2ggZnJvbQoJICAgIFNGIGJ1ZyAjMzUxMDgwNi4KCjIwMTItMDUtMTI6IG9sbHkKCSAgICBbUEhQXSBBdm9pZCB1c2luZyB6ZW5kX2Vycm9yX25vcmV0dXJuKCkgYXMgaXQgZG9lc24ndCB3b3JrIHdpdGggYWxsCgkgICAgYnVpbGRzIG9mIFBIUCAoU0YgYnVnICMzMTY2NDIzKS4gIEluc3RlYWQgd2Ugbm93IHdyYXAgaXQgaW4gYQoJICAgIFNXSUdfRkFJTCgpIGZ1bmN0aW9uIHdoaWNoIHdlIGFubm90YXRlIGFzICJub3JldHVybiIgZm9yIEdDQyB0bwoJICAgIGF2b2lkcyB3YXJuaW5ncy4gIFRoaXMgYWxzbyByZWR1Y2VzIHRoZSBzaXplIG9mIHRoZSBjb21waWxlZAoJICAgIHdyYXBwZXIgKGUuZy4gdGhlIHN0cmlwcGVkIHNpemUgaXMgcmVkdWNlZCBieSA2JSBmb3IgWGFwaWFuJ3MgUEhQCgkgICAgYmluZGluZ3MpLgoKMjAxMi0wNS0xMTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFNGIHBhdGNoICMzNTIyODU1IEZpeCB1bmludGVuZGVkIHVuaW5pdGlhbGlzZWQgbWVtb3J5IGFjY2VzcyBpbiBPVVRQVVQgdHlwZW1hcHMuCgoyMDEyLTA1LTExOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gU0YgcGF0Y2ggIzM1MjI2NzQgRml4IHBvc3NpYmxlIHVuaW5pdGlhbGlzZWQgbWVtb3J5IGFjY2VzcyBpbiBjaGFyICoqU1RSSU5HX09VVAogICAgICAgICAgICB0eXBlbWFwLgoKMjAxMi0wNS0xMTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFNGIHBhdGNoICMzNTIyNjExIEZpeCB1bmluaXRpYWxpc2VkIHNpemUgcmVncmVzc2lvbiBpbiBjaGFyICoqU1RSSU5HX0FSUkFZCiAgICAgICAgICAgIGludHJvZHVjZWQgaW4gc3dpZy0yLjAuNi4KCjIwMTItMDUtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIFNGIGJ1ZyAjMzUyNTA1MCAtIEZpeCByZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gc3dpZy0yLjAuNSB3aGVyZWJ5IGRlZmluaW5nIG9uZSB0eXBlbWFwCiAgICAgICAgICAgIG1ldGhvZCBzdWNoIGFzIGFuICdvdXQnIHR5cGVtYXAgbWF5IGhpZGUgYW5vdGhlciB0eXBlbWFwIG1ldGhvZCBzdWNoIGFzIGFuICdpbicgdHlwZW1hcCAtCiAgICAgICAgICAgIG9ubHkgb2NjdXJzIHdoZW4gdGhlIHR5cGUgaXMgYSB0ZW1wbGF0ZSB0eXBlIHdoZXJlIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGFyZSB0aGUgc2FtZQogICAgICAgICAgICB2aWEgYSB0eXBlZGVmLgoKMjAxMi0wNS0xMDogb2xseQoJICAgIFtQSFBdIEZpeCB0aGUgY29uc3RhbnQgdHlwZW1hcHMgZm9yIFNXSUdUWVBFLCBldGMgLSBwcmV2aW91c2x5CgkgICAgdGhlc2UgdXNlZCB0aGUgd3JvbmcgbmFtZSBmb3IgcmVuYW1lZCBjb25zdGFudHMuICBBZGQKCSAgICBhdXRvZG9jX3J1bm1lLnBocCB0byB0aGUgdGVzdHN1aXRlIGFzIGEgcmVncmVzc2lvbiB0ZXN0IGZvciB0aGlzLgoKMjAxMi0wNS0wMjogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIFJlbW92ZSBjb21wYXRpYmlsaXR5IHN1cHBvcnQgZm9yIGdjY2dvIDQuNi4gIFVzaW5nCgkgICAgU1dJRyB3aXRoIGdjY2dvIHdpbGwgbm93IHJlcXVpcmUgZ2NjZ28gNC43LiAgVXNpbmcgU1dJRwoJICAgIHdpdGggdGhlIG1vcmUgY29tbW9ubHkgdXNlZCBnYyBjb21waWxlciBpcyB1bmFmZmVjdGVkLgoKMjAxMi0wNS0wMTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGdlbmVyYXRlZCBjb2RlIGZvciBDIGZvcndhcmQgZW51bSBkZWNsYXJhdGlvbnMgaW4gc29tZSBsYW5ndWFnZXMuCgpWZXJzaW9uIDIuMC42ICgzMCBBcHJpbCAyMDEyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxMi0wNC0yNTogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gRml4IHVuaW5pdGlhbGlzZWQgdmFyaWFibGUgaW4gU1dJR1RZUEUgKipPVVRQVVQgdHlwZW1hcHMgYXMgcmVwb3J0ZWQgYnkgSmltIEFuZGVyc29uLgoKMjAxMi0wNC0yODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4IGNvbXBpbGF0aW9uIGVycm9ycyB3aGVuIHdyYXBwaW5nIFNUTCBjb250YWluZXJzIG9uIE1hYyBPUyBYIGFuZCBwb3NzaWJseSBvdGhlciBzeXN0ZW1zLgoKMjAxMi0wNC0yODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFBhdGNoIDM1MjE4MTEgZnJvbSBMZW8gRGF2aXMgLSBjaGFyICoqU1RSSU5HX0FSUkFZIHR5cGVtYXBzIGZpeGVkIHRvIGhhbmRsZQogICAgICAgICAgICBudWxsIHBvaW50ZXJzLgoKVmVyc2lvbiAyLjAuNSAoMTkgQXByaWwgMjAxMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTItMDQtMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIEFwcGx5IHBhdGNoICMzNTE3NDM1IGZyb20gTWlsZXMgQmFkZXIgLSBwcmVmZXIgdG8gdXNlIEx1YV9wdXNoZ2xvYmFsdGFibGUKCjIwMTItMDQtMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBBcHBseSBwYXRjaCAjMzUxNzc2OSBmcm9tIFJvYmluIFN0b2NrZXIgdG8gZml4IGNvbXBpbGUgZXJyb3Igb24gTWFjUnVieSB1c2luZyBSU1RSSU5HX1BUUi4KCjIwMTItMDQtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIEFwcGx5IHBhdGNoICMzNTExMDA5IGZyb20gTGVpZiBNaWRkZWxzY2h1bHRlIGZvciBzbGlnaHRseSBvcHRpbWlzZWQgY2hhciAqIHZhcmlhYmxlIHdyYXBwZXJzLgoKMjAxMi0wNC0xMzogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gQXBwbHkgIzMyMTk2NzYgZnJvbSBTaGFuZSBMaWVzZWdhbmcgd2hpY2ggYWRkczoKICAgICAgICAgICAgLSBzdXBwb3J0IGZvciAlZmFjdG9yeQogICAgICAgICAgICAtIGEgX190b3N0cmluZyBtZXRob2QKICAgICAgICAgICAgLSBhIF9fZGlzb3duIG1ldGhvZAoKMjAxMi0wNC0xMzogd3NmdWx0b24KICAgICAgICAgICAgW1htbF0gQXBwbHkgIzM1MTM1Njkgd2hpY2ggYWRkcyBhIGNhdGNobGlzdCB0byB0aGUgeG1sIG91dHB1dC4KCjIwMTItMDQtMDU6IG9sbHkKCSAgICBbTHVhXSBBZGQgc3VwcG9ydCBmb3IgTHVhIDUuMiAocGF0Y2ggU0YjMzUxNDU5MyBmcm9tIE1pbGVzIEJhZGVyKQoKMjAxMi0wMy0yNjogeGF2aWVyOTgKCSAgICBbb2N0YXZlXSBBcHBseSBwYXRjaCAjMzQyNTk5MyBmcm9tIGpnaWxsaXM6IGFkZCBleHRyYSBsb2dpYyB0byB0aGUgb2N0YXZlX3N3aWdfdHlwZTo6ZGltcyh2b2lkKSBtZXRob2Q6IGl0IGNoZWNrcyBpZiB0aGUgdXNlciBoYXMgZGVmaW5lZCBhIF9fZGltc19fIG1ldGhvZCBhbmQgdXNlcyB0aGlzIGluIHN0ZWFkIG9mIHJldHVybmluZyAoMSwxKQoJICAgIFtvY3RhdmVdIEFwcGx5IHBhdGNoICMzNDI0ODMzIGZyb20gamdpbGxpczogbWFrZSBpc19vYmplY3QgcmV0dXJuIHRydWUgZm9yIHN3aWcgdHlwZXMKCjIwMTItMDMtMjQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtEXSBBcHBseSAjMzUwMjQzMSB0byBmaXggZHVwbGljYXRlIHN5bWJvbHMgaW4gbXVsdGlwbGUgbW9kdWxlcy4KCjIwMTItMDMtMjE6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMzQ5NDc5MSAtICUkaXNnbG9iYWwgZm9yICVyZW5hbWUgbWF0Y2hpbmcuCgoyMDEyLTAzLTIwOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzM0ODc3MDYgYW5kICMzMzkxOTA2IC0gbWlzc2luZyBzdGRkZWYuaCBpbmNsdWRlIGZvciBwdHJkaWZmX3Qgd2hlbiB1c2luZyAlaW1wb3J0CiAgICAgICAgICAgIGZvciBTVEwgY29udGFpbmVycyBhbmQgY29tcGlsaW5nIHdpdGggZysrLTQuNi4gQW4gaW5jbHVkZSBvZiBzdGRkZWYuaCBpcyBub3cgb25seQogICAgICAgICAgICBnZW5lcmF0ZWQgd2hlbiBTV0lHIGdlbmVyYXRlcyBTVEwgaGVscGVyIHRlbXBsYXRlcyB3aGljaCByZXF1aXJlIHB0cmRpZmZfdC4gSWYgeW91IAogICAgICAgICAgICB3ZXJlIHByZXZpb3VzbHkgcmVseWluZyBvbiAiI2luY2x1ZGUgPHN0ZGRlZi5oPiIgYWx3YXlzIGJlaW5nIGdlbmVyYXRlZCB3aGVuIHVzaW5nIGEKICAgICAgICAgICAgJWluY2x1ZGUgb2YgYW4gU1RMIGhlYWRlciwgeW91IG1heSBub3cgbmVlZCB0byBhZGQgdGhpcyBpbiBtYW51YWxseS4KCjIwMTItMDMtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIEFwcGx5IHBhdGNoICMzMzkyMjY0IGZyb20gU2ViYXN0aWVuIEJpbmUgdG8gcGFyc2UgKHVuc2lnbmVkKSBsb25nIGxvbmcgdHlwZXMgaW4gZW51bSB2YWx1ZSBhc3NpZ25tZW50LgoKMjAxMi0wMy0xNjogd3NmdWx0b24KICAgICAgICAgICAgQXBwbHkgcGF0Y2ggIzM1MDU1MzAgZnJvbSBLYXJsIFdldHRlIHRvIGFsbG93IGN1c3RvbSBhbGxvY2F0b3JzIGluIFNUTCBzdHJpbmcgY2xhc3NlcyBmb3IgdGhlIFVUTCBsYW5ndWFnZXMuCgoyMDEyLTAzLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBBcHBseSBwYXRjaCAjMzQ2ODM2MiBmcm9tIEthcmwgV2V0dGUgdG8gZml4ICVpbmNsdWRlIGluc2lkZSAlZGVmaW5lLgoKMjAxMi0wMy0xMzogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbiwgUnVieSwgT2N0YXZlLCBSXSBGaXggIzM0NzU0OTIgLSBpdGVyYXRpbmcgdGhyb3VnaCBzdGQ6OnZlY3RvciB3cmFwcGVycyBvZiBlbnVtZXJhdGlvbnMuCgoyMDEyLTAyLTI3OiB4YXZpZXI5OCAocGF0Y2hlcyBmcm9tIEthcmwgV2V0dGUpCgkgICAgW09jdGF2ZV0gVXNlIC1nbG9iYWxzIC4gdG8gbG9hZCBnbG9iYWwgdmFyaWFibGVzIGluIG1vZHVsZSBuYW1lc3BhY2UKCSAgICBbT2N0YXZlXSBDb21tZW50IGRlY2xhcmF0aW9uIG9mIHVuaW1wbGVtZW50ZWQgZnVuY3Rpb24gc3dpZ19yZWdpc3Rlcl9kaXJlY3RvcgoJICAgIFtPY3RhdmVdIEZpeCBPQ1RBVkVfUEFUSCBpbiBvY3RhdmUgTWFrZWZpbGVzCgkgICAgW09jdGF2ZV0gQWRkIHN1cHBvcnQgZm9yIHN0ZDo6bGlzdCAtIGZpeCBsaV9zdGRfY29udGFpbmVyc19pbnQgdGVzdAoJICAgIFtPY3RhdmVdIEZpeCBpbXBvcnRzIHRlc3QKCjIwMTItMDItMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBNYWtlIGdlbmVyYXRlZCBzdXBwb3J0IGZ1bmN0aW9ucyBpbiBhcnJheXNfamF2YS5pIHN0YXRpYyBzbyB0aGF0IGdlbmVyYXRlZCBjb2RlCiAgICAgICAgICAgIGZyb20gbXVsdGlwbGUgaW5zdGFuY2VzIG9mIFNXSUcgY2FuIGJlIGNvbXBpbGVkIGFuZCBsaW5rZWQgdG9nZXRoZXIgLSBwcm9ibGVtIHJlcG9ydGVkIGJ5CiAgICAgICAgICAgIEV2YW4gS3JhdXNlLgoKMjAxMi0wMS0yNDogd3NmdWx0b24KICAgICAgICAgICAgRml4IGNyYXNoIHdpdGggYmFkIHJlZ2V4IC0gYnVnICMzNDc0MjUwLgoKMjAxMi0wMS0yNDogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQWRkIFB5dGhvbiBzdGVwcGVkIHNsaWNpbmcgc3VwcG9ydCB0byB0aGUgU1RMIHdyYXBwZXJzIChzdGQ6OnZlY3Rvciwgc3RkOjpsaXN0KS4KICAgICAgICAgICAgQXNzaWduaW5nIHRvIGEgc2xpY2UsIHJlYWRpbmcgYSBzbGljZSBhbmQgZGVsZXRpbmcgYSBzbGljZSB3aXRoIHN0ZXBzIG5vdyB3b3JrLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWN0b3JfaSkgc3RkOjp2ZWN0b3I8aW50PgoKICAgICAgICAgICAgICB2aSA9IHZlY3Rvcl9pKHJhbmdlKDEwKSkKICAgICAgICAgICAgICBwcmludCBsaXN0KHZpKQogICAgICAgICAgICAgIHZpWzE6NDoyXSA9IFsxMTEsIDMzM10KICAgICAgICAgICAgICBwcmludCBsaXN0KHZpKQogICAgICAgICAgICAgIGRlbCB2aVszOjEwOjNdCiAgICAgICAgICAgICAgcHJpbnQgbGlzdCh2aSkKICAgICAgICAgICAgICBwcmludCBsaXN0KHZpWzo6LTFdKQoKICAgICAgICAgICAgZ2l2ZXMgKHNhbWUgYmVoYXZpb3VyIGFzIG5hdGl2ZSBQeXRob24gc2VxdWVuY2VzIHN1Y2ggYXMgbGlzdCk6CgogICAgICAgICAgICAgIFswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5XQogICAgICAgICAgICAgIFswLCAxMTEsIDIsIDMzMywgNCwgNSwgNiwgNywgOCwgOV0KICAgICAgICAgICAgICBbMCwgMTExLCAyLCA0LCA1LCA3LCA4XQogICAgICAgICAgICAgIFs4LCA3LCA1LCA0LCAyLCAxMTEsIDBdCgoyMDEyLTAxLTIzOiBrbGlja3ZlcmJvdAogICAgICAgICAgICBbRF0gQ29ycmVjdGx5IGFubm90YXRlIGZ1bmN0aW9uIHBvaW50ZXJzIHdpdGggQyBsaW5rYWdlLgogICAgICAgICAgICBbRF0gRXhjZXB0aW9uIGFuZCBFcnJvciBoYXZlIGJlY29tZSBibGVzc2VkIG5hbWVzOyByZW1vdmVkIGRfZXhjZXB0aW9uX25hbWUgdGVzdCBjYXNlLgoKMjAxMi0wMS0yMDogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4IHNvbWUgaW5kZXhpbmcgYnVncyBpbiBQeXRob24gU1RMIHdyYXBwZXJzIHdoZW4gdGhlIGluZGV4IGlzIG5lZ2F0aXZlLCBlZzoKCiAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWN0b3JfaSkgc3RkOjp2ZWN0b3I8aW50PgoKICAgICAgICAgICAgICBpdj12ZWN0b3JfaShbMCwxLDIsMyw0LDVdKQogICAgICAgICAgICAgIGl2Wy03Ol0KCiAgICAgICAgICAgIG5vdyByZXR1cm5zIFswLCAxLCAyLCAzLCA0LCA1XSBpbnN0ZWFkIG9mIFs1XS4KCiAgICAgICAgICAgICAgdnZbNzo5XSA9IFsyMiwzM10KCiAgICAgICAgICAgIG5vdyByZXR1cm5zIFswLCAxLCAyLCAzLCA0LCA1LCAyMiwgMzNdIGluc3RlYWQgb2YgImluZGV4IG91dCByYW5nZSIgZXJyb3IuCgogICAgICAgICAgICBBbHNvIGZpeCBzb21lIHNlZ2ZhdWx0cyB3aGVuIHJlcGxhY2luZyByYW5nZXMsIGVnIHdoZW4gaWwgaXMgYSBzdGQ6Omxpc3Qgd3JhcHBlcjoKCiAgICAgICAgICAgICAgaWxbMDoyXSA9IFsxMV0KCjIwMTItMDEtMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtHb10gRml4IGZvcndhcmQgY2xhc3MgZGVjbGFyYXRpb24gd2l0aGluIGEgY2xhc3Mgd2hlbiB1c2VkIGFzIGEgYmFzZS4KCjIwMTItMDEtMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQWRkIHN1cHBvcnQgZm9yICVuc3BhY2Ugd2hlbiB1c2luZyBkaXJlY3RvcnMuCgoyMDEyLTAxLTA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUGF0Y2ggIzM0NTI1NjAgZnJvbSBCcmFudCBLeXNlciAtIGFkZCBzdXBwb3J0IGZvciAlbnNwYWNlIHdoZW4gdXNpbmcgZGlyZWN0b3JzLgoKMjAxMS0xMi0yMTogd3NmdWx0b24KICAgICAgICAgICAgVGhlICdkaXJlY3RvcmluJyB0eXBlbWFwIG5vdyBhY2NlcHRzICQxLCAkMiBldGMgZXhwYW5zaW9ucyBpbnN0ZWFkIG9mIGhhdmluZyB0byB1c2Ugd29ya2Fyb3VuZHMgLQogICAgICAgICAgICAkMV9uYW1lLCAkMl9uYW1lIGV0Yy4KCjIwMTEtMTItMjA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBBZGQgKGNoYXIgKlNUUklORywgc2l6ZV90IExFTkdUSCkgZGlyZWN0b3IgdHlwZW1hcHMuCgoyMDExLTEyLTIwOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEdvLCBKYXZhLCBEXSBBZGQgc3VwcG9ydCBmb3IgdGhlICdkaXJlY3RvcmFyZ291dCcgdHlwZW1hcC4KCjIwMTEtMTItMjA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtPY2FtbCwgT2N0YXZlLCBQSFAsIFB5dGhvbiwgUnVieV0gQ29ycmVjdCBzcGVjaWFsIHZhcmlhYmxlcyBpbiAnZGlyZWN0b3JhcmdvdXQnIHR5cGVtYXAuCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIHdpbGwgYnJlYWsgYW55ICdkaXJlY3RvcmFyZ291dCcgdHlwZW1hcHMgeW91IG1heSBoYXZlIHdyaXR0ZW4uIFBsZWFzZSBjaGFuZ2U6CiAgICAgICAgICAgICAgJHJlc3VsdCB0byAkMQogICAgICAgICAgICAgICRpbnB1dCB0byAkcmVzdWx0CgogICAgICAgICAgICBBbHNvIGZpeCB0aGUgbmFtZWQgJ2RpcmVjdG9yYXJnb3V0JyBESVJFQ1RPUk9VVCB0eXBlbWFwcyBmb3IgdGhlc2UgbGFuZ3VhZ2VzIHdoaWNoIGRpZG4ndAogICAgICAgICAgICBwcmV2aW91c2x5IGNvbXBpbGUgYW5kIGFkZCBpbiAkMSwgJDIgZXRjIGV4cGFuc2lvbi4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjIwMTEtMTItMTA6IHRhbGJ5CiAgICAgICAgICAgIFtwZXJsNV0gU1dJR19lcnJvcigpIG5vdyBnZXRzIGRlY29yYXRlZCB3aXRoIHBlcmwgc291cmNlIGZpbGUvbGluZSBudW1iZXIuCiAgICAgICAgICAgIFtwZXJsNV0gZXJyb3IgaGFuZGxpbmcgbm93IGNvbmZvcm1zIHRvIHB1YmxpYyBYUyBhcGkgKGZpeGVzIHBlcmwgdjUuMTQgaXNzdWUpLgoKMjAxMS0xMi0xMDogd3NmdWx0b24KICAgICAgICAgICAgW0FuZHJvaWQvSmF2YV0gRml4IGRpcmVjdG9ycyB0byBjb21waWxlIG9uIEFuZHJvaWQuCgogICAgICAgICAgICBBZGRlZCBkb2N1bWVudGF0aW9uIGFuZCBleGFtcGxlcyBmb3IgQW5kcm9pZC4KCjIwMTEtMTItMDg6IHZhZHoKCSAgICBCdWcgZml4OiBIYW5kbGUgbWV0aG9kcyByZW5hbWVkIG9yIGlnbm9yZWQgaW4gdGhlIGJhc2UgY2xhc3MgY29ycmVjdGx5IGluIHRoZSBkZXJpdmVkIGNsYXNzZXMKCSAgICAodGhleSBjb3VsZCBiZSBzb21ldGltZXMgbXlzdGVyaW91c2x5IG5vdCByZW5hbWVkIG9yIGlnbm9yZWQgdGhlcmUgYmVmb3JlKS4KCjIwMTEtMTItMDM6IGtsaWNrdmVyYm90CiAgICAgICAgICAgIFtEXSBGaXggZXhjZXB0aW9uIGdsdWUgY29kZSBmb3IgbmV3ZXIgRE1EIDIgdmVyc2lvbnMuCiAgICAgICAgICAgIFtEXSBEbyBub3QgZGVmYXVsdCB0byAzMiBiaXQgZ2x1ZSBjb2RlIGZvciBETUQgYW55bW9yZS4KICAgICAgICAgICAgW0RdIFVzZSBzdGRjLmNvbmZpZy5jX2xvbmcvY191bG9uZyB0byByZXByZXNlbnQgQyBsb25nIHR5cGVzLgoKMjAxMS0xMi0wMTogc3phZ2VyCgkgICAgW3B5dGhvbl0gRml4ZWQgYnVnIDM0NDc0MjY6IG1lbW9yeSBsZWFrIGluIHZlY3Rvci5fX2dldGl0ZW1fXy4KCjIwMTEtMTEtMzA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSXSBSZW1vdmUgQysrIGNvbW1lbnRzIGZyb20gZ2VuZXJhdGVkIEMgY29kZS4KCjIwMTEtMTEtMjc6IG9sbHkKCSAgICBbUHl0aG9uXSBGaXggc29tZSB3YXJuaW5ncyB3aGVuIGNvbXBpbGluZyBnZW5lcmF0ZWQgd3JhcHBlcnMgd2l0aAoJICAgIGNlcnRhaW4gR0NDIHdhcm5pbmcgb3B0aW9ucyAoRGViaWFuIGJ1ZyAjNjUwMjQ2KS4KCjIwMTEtMTEtMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMzQzMzU0MSAldHlwZW1hcChpbiwgbnVtaW5wdXRzPTApIHdpdGggMTArIGFyZ3VtZW50cy4KCjIwMTEtMTEtMjg6IG9sbHkKCSAgICBbUGVybF0gRml4IHdhcm5pbmdzIHdoZW4gY29tcGlsaW5nIGdlbmVyYXRlZCB3cmFwcGVycyB3aXRoIGNlcnRhaW4KCSAgICBHQ0Mgd2FybmluZyBvcHRpb25zIChEZWJpYW4gYnVnICM0MzY3MTEpLgoKMjAxMS0xMS0yODogb2xseQoJICAgIFtQSFBdIFVwZGF0ZSBrZXl3b3JkIGxpc3QgdG8gaW5jbHVkZSBrZXl3b3JkcyBhZGRlZCBpbiBQSFAgcmVsZWFzZXMgdXAgdG8gNS4zLgoKMjAxMS0xMS0yNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBQcm92aWRlIGFuIGVhc3kgd2F5IHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHZpc2liaWxpdHkgZm9yIHRoZSBwcm94eSBjbGFzcyBwb2ludGVyCiAgICAgICAgICAgIGNvbnN0cnVjdG9ycyBhbmQgZ2V0Q1B0cigpIG1ldGhvZC4gVGhlIHZpc2liaWxpdHkgaXMgJ2ludGVybmFsJyBieSBkZWZhdWx0IGFuZCBpZiBtdWx0aXBsZQogICAgICAgICAgICBTV0lHIG1vZHVsZXMgYXJlIGJlaW5nIHVzZWQgYW5kIGNvbXBpbGVkIGludG8gZGlmZmVyZW50IGFzc2VtYmxpZXMsIHRoZW4gdGhleSBuZWVkIHRvIGJlIAogICAgICAgICAgICAncHVibGljJyBpbiBvcmRlciB0byB1c2UgdGhlIGNvbnN0cnVjdG9yIG9yIGdldENQdHIoKSBtZXRob2QgZnJvbSBhIGRpZmZlcmVudCBhc3NlbWJseS4KICAgICAgICAgICAgVXNlIHRoZSBmb2xsb3dpbmcgbWFjcm9zIHRvIGNoYW5nZSB0aGUgdmlzaWJpbGl0aWVzIGluIHRoZSBwcm94eSBhbmQgdHlwZSB3cmFwcGVyIGNsYXNzOgoKICAgICAgICAgICAgICBTV0lHX0NTQk9EWV9QUk9YWShwdWJsaWMsIHB1YmxpYywgU1dJR1RZUEUpCiAgICAgICAgICAgICAgU1dJR19DU0JPRFlfVFlQRVdSQVBQRVIocHVibGljLCBwdWJsaWMsIHB1YmxpYywgU1dJR1RZUEUpCgogICAgICAgICAgICBbSmF2YV0gUHJvdmlkZSBhbiBlYXN5IHdheSB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCB2aXNpYmlsaXR5IGZvciB0aGUgcHJveHkgY2xhc3MgcG9pbnRlcgogICAgICAgICAgICBjb25zdHJ1Y3RvcnMgYW5kIGdldENQdHIoKSBtZXRob2QuIFRoZSB2aXNpYmlsaXR5IGlzICdwcm90ZWN0ZWQnIGJ5IGRlZmF1bHQgYW5kIGlmIG11bHRpcGxlCiAgICAgICAgICAgIFNXSUcgbW9kdWxlcyBhcmUgYmVpbmcgdXNlZCBhbmQgY29tcGlsZWQgaW50byBkaWZmZXJlbnQgcGFja2FnZXMsIHRoZW4gdGhleSBuZWVkIHRvIGJlIAogICAgICAgICAgICAncHVibGljJyBpbiBvcmRlciB0byB1c2UgdGhlIGNvbnN0cnVjdG9yIG9yIGdldENQdHIoKSBtZXRob2QgZnJvbSBhIGRpZmZlcmVudCBwYWNrYWdlLgogICAgICAgICAgICBVc2UgdGhlIGZvbGxvd2luZyBtYWNyb3MgdG8gY2hhbmdlIHRoZSB2aXNpYmlsaXRpZXMgaW4gdGhlIHByb3h5IGFuZCB0eXBlIHdyYXBwZXIgY2xhc3M6CgogICAgICAgICAgICAgIFNXSUdfSkFWQUJPRFlfUFJPWFkocHVibGljLCBwdWJsaWMsIFNXSUdUWVBFKQogICAgICAgICAgICAgIFNXSUdfSkFWQUJPRFlfVFlQRVdSQVBQRVIocHVibGljLCBwdWJsaWMsIHB1YmxpYywgU1dJR1RZUEUpCgogICAgICAgICAgICBUaGUgZGVmYXVsdCBmb3IgSmF2YSBoYXMgY2hhbmdlZCBmcm9tIHB1YmxpYyB0byBwcm90ZWN0ZWQgZm9yIHRoZSBwcm94eSBjbGFzc2VzLiBVc2UgdGhlCiAgICAgICAgICAgIFNXSUdfSkFWQUJPRFlfUFJPWFkgbWFjcm8gYWJvdmUgdG8gcmVzdG9yZSB0byB0aGUgcHJldmlvdXMgdmlzaWJpbGl0aWVzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMjAxMS0xMS0yMjogc3phZ2VyCgkgICAgW3B5dGhvbl0gQnVnIDM0NDAwNDQ6ICNpZmRlZiBvdXQgU1dJR19QeXRob25fTm9uRHluYW1pY1NldEF0dHIgaWYgLWJ1aWx0aW4KCSAgICBpc24ndCBiZWluZyB1c2VkLCB0byBhdm9pZCB1bm5lY2Vzc2FyeSBiaW5hcnkgaW5jb21wYXRpYmlsaXRpZXMgYmV0d2VlbgoJICAgIHB5dGhvbiBpbnN0YWxsYXRpb25zLgoKMjAxMS0xMS0xNzogd3NmdWx0b24KICAgICAgICAgICAgQnVnIGZpeDogUmVtb3ZlIHJvb3QgZGlyZWN0b3J5IGZyb20gZGlyZWN0b3J5IHNlYXJjaCBsaXN0IGluIFdpbmRvd3MuCgoyMDExLTExLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gQXBwbHkgcGF0Y2ggIzM0MjE4NzYgZnJvbSBSb2JpbiBTdG9ja2VyIHRvIGZpeCAjMzQxNjgxOCAtIHNhbWUgY2xhc3MgbmFtZSBpbiAKICAgICAgICAgICAgZGlmZmVyZW50IG5hbWVzcGFjZXMgY29uZnVzaW9uIHdoZW4gdXNpbmcgbXVsdGlwbGUgbW9kdWxlcy4KCjIwMTEtMTEtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBwY3JlLWJ1aWxkLnNoIHRvIHdvcmsgd2l0aCBub24tY29tcHJlc3NlZCB0YXJiYWxscyAtIHByb2JsZW0gcmVwb3J0ZWQgYnkgQWRyaWFuIEJsYWtlbHkuCgoyMDExLTExLTAzOiB3c2Z1bHRvbgogICAgICAgICAgICBFeHBhbmQgc3BlY2lhbCB2YXJpYWJsZXMgaW4gdHlwZW1hcCB3YXJuaW5ncywgZWc6CgogICAgICAgICAgICAgICV0eXBlbWFwKGluLCB3YXJuaW5nPSIxMDAwOlRlc3Qgd2FybmluZyBmb3IgJ2luJyB0eXBlbWFwIGZvciAkMV90eXBlICQxX25hbWUiKSBpbnQgIi4uLiIKCjIwMTEtMTEtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBuYW1lZCBvdXRwdXQgdHlwZW1hcHMgbm90IGJlaW5nIHVzZWQgd2hlbiB0aGUgc3ltYm9sIHVzZXMgYSBxdWFsaWZpZXIgYW5kIGNvbnRhaW5zCiAgICAgICAgICAgIGEgbnVtYmVyLCBlZzoKCiAgICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBkb3VibGUgQUJDOjptMSAiLi4uIgoKMjAxMS0xMC0yNDogdGFsYnkKICAgICAgICAgICAgW3Blcmw1XSBTRiBidWcgIzM0MjMxMTkgLSBvdmVybG9hZCBkaXNwYXRjaCBzdGFjayBjb3JydXB0aW9uIGZpeC4gIEJldHRlciwgYnV0IG1vcmUgcmVzZWFyY2gKICAgICAgICAgICAgaXMgbmVlZGVkIG9uIGEgc3RhYmxlIHBhdGggZm9yIHRhaWwgY2FsbHMgaW4gWFMuCgogICAgICAgICAgICBBbHNvLCBmaXggZm9yIGxhcmdlIGxvbmcgbG9uZ3MgaW4gMzIgYml0IHBlcmwuCgoyMDExLTEwLTEzOiB4YXZpZXI5OAoJICAgIFtvY3RhdmVdIEFsbG93IE9jdGF2ZSBtb2R1bGVzIHRvIGJlIHJlLWxvYWRlZCBhZnRlciBhICJjbGVhciBhbGwiLgoKMjAxMS0wOS0xOTogd3NmdWx0b24KICAgICAgICAgICAgRml4IHJlZ3Jlc3Npb24gaW50cm9kdWNlZCBpbiBzd2lnLTIuMC4xIHJlcG9ydGVkIGJ5IFRlZW11IElrb25vbmUgbGVhZGluZyB0byB1bmNvbXBpbGFibGUgY29kZQogICAgICAgICAgICB3aGVuIHVzaW5nIHR5cGVkZWYgYW5kIGZ1bmN0aW9uIHBvaW50ZXIgcmVmZXJlbmNlcywgZm9yIGV4YW1wbGU6IAoKICAgICAgICAgICAgICB0eXBlZGVmIGludCBGTihjb25zdCBpbnQgJmEsIGludCBiKTsKICAgICAgICAgICAgICB2b2lkICp0eXBlZGVmX2NhbGwxKEZOIComIHByZWNhbGxiYWNrLCBGTiAqIHBvc3RjYWxsYmFjayk7CgoyMDExLTA5LTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBQYXRjaCAjMzQwODAxMiBmcm9tIFJhbWFuIEdvcGFsYW4gLSBhZGQgc3VwcG9ydCBmb3IgZW1iZWRkZWQgTHVhIChlTHVhKQogICAgICAgICAgICBpbmNsdWRpbmcgb3B0aW9ucyBmb3IgdGFyZ2V0aW5nIEx1YSBUaW55IFJBTSAoTFRSKS4KCjIwMTEtMDktMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQWRkIGJvb3N0X2ludHJ1c2l2ZV9wdHIuaSBsaWJyYXJ5IGNvbnRyaWJ1dGlvbiBmcm9tIHBhdGNoICMzNDAxNTcxLgoKMjAxMS0wOS0xMzogd3NmdWx0b24KICAgICAgICAgICAgQWRkIHdhcm5pbmdzIGZvciBiYWRseSBuYW1lZCBkZXN0cnVjdG9ycywgZWc6CgogICAgICAgICAgICAgIHN0cnVjdCBLU3RydWN0IHsKICAgICAgICAgICAgICAgIH5OT1RfS1N0cnVjdCgpIHt9CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGNwcF9leHRlbmRfZGVzdHJ1Y3RvcnMuaTo5MjogV2FybmluZyA1MjE6IElsbGVnYWwgZGVzdHJ1Y3RvciBuYW1lIH5OT1RfS1N0cnVjdC4gSWdub3JlZC4KCjIwMTEtMDktMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAlZXh0ZW5kIGFuZCBkZXN0cnVjdG9ycyBmb3IgdGVtcGxhdGVzLiBUaGUgZGVzdHJ1Y3RvciBpbiAlZXh0ZW5kIHdhcyBub3QgYWx3YXlzIHdyYXBwZWQsCiAgICAgICAgICAgIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlZXh0ZW5kIEZvb1QgewogICAgICAgICAgICAgICAgfkZvb1QoKSB7IGRlbGV0ZSAkc2VsZjsgfSAvLyB3YXMgbm90IHdyYXBwZWQgYXMgZXhwZWN0ZWQKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIEZvb1Qge307CiAgICAgICAgICAgICAgJXRlbXBsYXRlKEZvb1RpKSBGb29UPGludD47CgoyMDExLTA5LTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc3BlY2lhbCB2YXJpYWJsZXMgc3VjaCBhcyAiJGRlY2wiIGFuZCAiJGZ1bGxkZWNsIiBpbiBkZXN0cnVjdG9ycyB0byBpbmNsdWRlIHRoZSB+IGNoYXJhY3Rlci4KCjIwMTEtMDktMTA6IHRhbGJ5CiAgICAgICAgICAgIFtwZXJsNV0gU0YgYnVnICMxNDgxOTU4IC0gSW1wcm92ZSByYW5nZSBjaGVja2luZyBmb3IgaW50ZWdlciB0eXBlcy4KICAgICAgICAgICAgRW5oYW5jZSBsaV90eXBlbWFwc19ydW5tZS5wbAoKMjAxMS0wOS0wODogd3NmdWx0b24KICAgICAgICAgICAgRml4ICVleHRlbmQgb24gdHlwZWRlZiBjbGFzc2VzIGluIGEgbmFtZXNwYWNlIHVzaW5nIHRoZSB0eXBlZGVmIG5hbWUsIGZvciBleGFtcGxlOgogICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2UgewogICAgICAgICAgICAgICVleHRlbmQgQ1N0cnVjdCB7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgdGFnQ1N0cnVjdCB7IC4uLiB9IENTdHJ1Y3Q7CiAgICAgICAgICAgIH0KCjIwMTEtMDgtMzE6IHhhdmllcjk4CgkgICAgW29jdGF2ZV0gcGF0Y2hlcyBmcm9tIEthcmwgV2V0dGU6IGltcHJvdmVtZW50cyB0byBtb2R1bGUgbG9hZGluZyBiZWhhdmlvcjsKCSAgICBhZGRlZCBleGFtcGxlIG9mIGZyaWVuZCBvcGVyYXRvciB0byBvcGVyYXRvciBleGFtcGxlOyBmaXhlZCBvY3RhdmUgcGFuaWMvY3Jhc2ggaW4gMy4wLjU7CgkgICAgZG9jdW1lbnRhdGlvbiBpbXByb3ZlbWVudHMKCjIwMTEtMDgtMzA6IHN6YWdlcgoJICAgIFtweXRob25dIEJ1ZyAzNDAwNDg2LCBmaXggZXJyb3Igc2lnbmFsbGluZyBmb3IgYnVpbHQtaW4gY29uc3RydWN0b3JzLgoKMjAxMS0wOC0yNjogd3NmdWx0b24KICAgICAgICAgICAgW0dvXSBGaXggZmlsZS9saW5lIG51bWJlciBkaXNwbGF5IGZvciAiZ290eXBlIiB3aGVuIHVzaW5nIHR5cGVtYXAgZGVidWdnaW5nIG9wdGlvbnMKICAgICAgICAgICAgLXRtc2VhcmNoIGFuZCAtdG11c2VkLgoKMjAxMS0wOC0yNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBEXSBGaXggJWNhbGxiYWNrIHdoaWNoIHdhcyBnZW5lcmF0aW5nIHVuY29tcGlsYWJsZSBjb2RlLgoKMjAxMS0wOC0yNTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGNvbnN0cnVjdG9ycyBpbiBuYW1lZCB0eXBlZGVmIGNsYXNzIGRlY2xhcmF0aW9ucyBhcyByZXBvcnRlZCBieSBHcmVnb3J5IEJyb25uZXI6CgogICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCBBIHsKICAgICAgICAgICAgICBBKCl7fSAvLyBDb25zdHJ1Y3RvciB3aGljaCB3YXMgbm90IGFjY2VwdGVkIGJ5IFNXSUcKICAgICAgICAgICAgICBCKCl7fSAvLyBOT1QgYSBjb25zdHJ1Y3RvciAtLWlsbGVnYWwsIGJ1dCB3YXMgYWNjZXB0ZWQgYnkgU1dJRwogICAgICAgICAgICB9IEI7CgogICAgICAgICAgICBGb3IgQyBjb2RlLCB0aGUgZml4IG5vdyByZXN1bHRzIGluIHRoZSB1c2Ugb2YgJ3N0cnVjdCBBIConIGluc3RlYWQgb2YganVzdCAnQiAqJyBpbgogICAgICAgICAgICB0aGUgZ2VuZXJhdGVkIGNvZGUgd2hlbiB3cmFwcGluZyBtZW1iZXJzIGluIEEsIGJ1dCB1bHRpbWF0ZWx5IHRoaXMgZG9lcyBub3QgbWF0dGVyLCBhcwogICAgICAgICAgICB0aGV5IGFyZSB0aGUgc2FtZSB0aGluZy4KCjIwMTEtMDgtMjM6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAlbmV3b2JqZWN0IHdoZW4gdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoICVmZWF0dXJlKCJyZWYiKSBhcyByZXBvcnRlZCBieSBKYW4gQmVja2VyLiBUaGUKICAgICAgICAgICAgY29kZSBmcm9tIHRoZSAicmVmIiBmZWF0dXJlIHdhcyBub3QgYWx3YXlzIGJlaW5nIGdlbmVyYXRlZCBmb3IgdGhlIGZ1bmN0aW9uIHNwZWNpZmllZCBieSAlbmV3b2JqZWN0LgogICAgICAgICAgICBEb2N1bWVudGF0aW9uIGZvciAicmVmIiBhbmQgInVucmVmIiBtb3ZlZCBmcm9tIFB5dGhvbiB0byB0aGUgQysrIGNoYXB0ZXIuCgoyMDExLTA4LTIyOiBzemFnZXIKCSAgICBbcHl0aG9uXSBGaXhlZCBtZW1vcnkgbGVhayB3aXRoIC0tYnVpbHRpbiBvcHRpb24gKGJ1ZyAzMzg1MDg5KS4KCjIwMTEtMDgtMjI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIFNGIHBhdGNoICMzMzk0MzM5IGZyb20gVG9yc3RlbiBMYW5kc2Nob2ZmIC0gbmV3IG9wdGlvbiAtbm9tb2R1bGVnbG9iYWwgdG8gZGlzYWJsZSBpbnN0YWxsaW5nIAogICAgICAgICAgICB0aGUgbW9kdWxlIHRhYmxlIGludG8gdGhlIGdsb2JhbCBuYW1lc3BhY2UuIFJlcXVpcmUgY2FsbCBhbHNvIHJldHVybnMgdGhlIG1vZHVsZSB0YWJsZSBpbnN0ZWFkIAogICAgICAgICAgICBvZiBhIHN0cmluZy4KCjIwMTEtMDgtMDk6IHhhdmllcjk4CiAgICAgICAgICAgIEZpeCBidWcgMzM4NzM5NDsgT2N0YXZlIHBhdGNoZXMgZm9yIDMuNC4wIGNvbXBhdGliaWxpdHksIGV0Yy4gKGZyb20gS2FybCBXZXR0ZSkKCjIwMTEtMDgtMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBpbiAkc3ltbmFtZSBleHBhbnNpb24gZm9yIGRpcmVjdG9yIG1ldGhvZHMuCgoyMDExLTA3LTI5OiBvbGx5CgkgICAgW1BIUF0gRG9uJ3QgZ2VuZXJhdGUgInJldHVybiAkcjsiIGluIGNhc2VzIHdoZXJlICRyIGhhc24ndCBiZWVuIHNldC4KCSAgICBUaGlzIHdhcyBiYXNpY2FsbHkgaGFybWxlc3MsIGV4Y2VwdCBpdCBnZW5lcmF0ZWQgYSBQSFAgRV9OT1RJQ0UgaWYKCSAgICB0aGUgY2FsbGluZyBjb2RlIGhhZCBlbmFibGVkIHRoZW0uCgoyMDExLTA3LTI2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc2NvcGluZyBvZiBmb3J3YXJkIGNsYXNzIGRlY2xhcmF0aW9ucyBuZXN0ZWQgd2l0aGluIGEgY2xhc3MgKGZvciBDKyspLiBQcmV2aW91c2x5IHRoZSBzeW1ib2wKICAgICAgICAgICAgd2FzIGluY29ycmVjdGx5IHB1dCBpbnRvIHRoZSBvdXRlciBuYW1lc3BhY2UsIGVnCgogICAgICAgICAgICBuYW1lc3BhY2Ugc3RkIHsKICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBLZXksIGNsYXNzIFQ+IHN0cnVjdCBtYXAgewogICAgICAgICAgICAgICAgY2xhc3MgaXRlcmF0b3I7CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaXRlcmF0b3Igd2FzIHNjb3BlZCBhcyBzdGQ6Oml0ZXJhdG9yLCBidXQgbm93IGl0IGlzIGNvcnJlY3RseSBzdGQ6Om1hcDxLZXksIFQ+OjppdGVyYXRvcjsKCiAgICAgICAgICAgIEFsc28gZml4ZWQgaXMgJXRlbXBsYXRlIGFuZCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIHRoYXQgYXJlIGEgdHlwZWRlZiB3aGVuIHRoZSB0ZW1wbGF0ZSBjb250YWlucwogICAgICAgICAgICBkZWZhdWx0IHRlbXBsYXRlIHBhcmFtZXRlcnMsIGVnOgoKICAgICAgICAgICAgbmFtZXNwYWNlIFN0ZCB7CiAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgS2V5LCBjbGFzcyBULCBjbGFzcyBDID0gaW50PiBzdHJ1Y3QgTWFwIHsKICAgICAgICAgICAgICAgIHR5cGVkZWYgS2V5IGtleV90eXBlOwogICAgICAgICAgICAgICAgdHlwZWRlZiBUIG1hcHBlZF90eXBlOwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHlwZWRlZiBkb3VibGUgRE9VQkxFOwogICAgICAgICAgICAldGVtcGxhdGUoTU0pIFN0ZDo6TWFwPGludCwgRE9VQkxFPjsKCiAgICAgICAgICAgIEFsbCBzeW1ib2xzIHdpdGhpbiBNYXAgd2lsbCBiZSByZXNvbHZlZCBjb3JyZWN0bHksIGVnIGtleV90eXBlIGFuZCBtYXBwZWRfdHlwZSBubyBtYXR0ZXIgaWYgdGhlCiAgICAgICAgICAgIHdyYXBwZWQgY29kZSB1c2VzIFN0ZDo6TWFwPGludCwgZG91YmxlPiBvciBzdGQ6Ok1hcDxpbnQsIERPVUJMRT4gb3IgU3RkOjpNYXA8aW50LCBkb3VibGUsIGludD4KCiAgICAgICAgICAgIEFsc28gZml4ZXMgYnVnICMzMzc4MTQ1IC0gcmVncmVzc2lvbiBpbnRyb2R1Y2VkIGluIDIuMC40IC0gJXRlbXBsYXRlIHVzaW5nIHRyYWl0cy4KCjIwMTEtMDctMjAgIHN6YWdlcgoJICAgIFtweXRob25dIEZpeCBjbG9zdXJlIGZvciB0cF9jYWxsIHNsb3QuCgoyMDExLTA3LTE2OiB3c2Z1bHRvbgoJICAgIFtweXRob25dIEZpeCBkaXJlY3RvciB0eXBlbWFwIHVzaW5nIFB5T2JqZWN0ICouCgoyMDExLTA3LTEzOiBzemFnZXIKCSAgICBbcHl0aG9uXSBTRiBwYXRjaCAjMzM2NTkwOCAtIEFkZCBhbGwgdGVtcGxhdGUgcGFyYW1ldGVycyB0byBtYXAgc3VwcG9ydCBjb2RlIGluIHN0ZF9tYXAuaQoKMjAxMS0wNy0xMzogc3phZ2VyCgkgICAgW3B5dGhvbl0gRml4IGZvciBidWcgMzMyNDc1MzogJXJlbmFtZSBtZW1iZXIgdmFyaWFibGVzIHdpdGggLWJ1aWx0aW4uCgoyMDExLTA3LTAxOiB3c2Z1bHRvbgoJICAgIEZpeCBzb21lIHNjb3BlIGFuZCBzeW1ib2wgbG9va3VwIHByb2JsZW1zIHdoZW4gdGVtcGxhdGUgZGVmYXVsdCBwYXJhbWV0ZXJzIGFyZSBiZWluZwogICAgICAgICAgICB1c2VkIHdpdGggdHlwZWRlZi4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBYWCwgdHlwZW5hbWUgVFQgPSBTb21lVHlwZT4gc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgdHlwZWRlZiBYWCBYOwogICAgICAgICAgICAgIHR5cGVkZWYgVFQgVDsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVFQ+IHN0cnVjdCBVc2VzRm9vIHsKICAgICAgICAgICAgICB2b2lkIHgodHlwZW5hbWUgRm9vPFRUPjo6VCwgdHlwZW5hbWUgRm9vPFRUPjo6WCk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBBbHNvIGZpeGVzIHVzZSBvZiBzdGQ6OnZlY3RvcjxpbnQ+OjpzaXplX3R5cGUgZm9yIFB5dGhvbiBhcyByZXBvcnRlZCBieSBBdWJyZXkgQmFybmFyZC4KCjIwMTEtMDYtMjM6IG9sbHkKCSAgICBbUEhQXSBGaXggZGlyZWN0b3IgY29kZSB0byB3b3JrIHdoZW4gUEhQIGlzIGJ1aWx0IHdpdGggWlRTIGVuYWJsZWQsCgkgICAgd2hpY2ggaXMgdGhlIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gb24gTWljcm9zb2Z0IFdpbmRvd3MuCgoyMDExLTA2LTIxOiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgLSB2YXJpb3VzIHNtYWxsIHR3ZWFrcyBhbmQgYnVnIGZpeGVzLgoJICAgIC0gQXZvaWQgbmFtZSBjb25mbGljdHMgYmV0d2VlbiBzbWFydCBwb2ludGVyIHdyYXBwZXJzIGFuZCB0aGUgd3JhcHBlcnMgZm9yCgkgICAgdGhlIGFjdHVhbCBjbGFzcy4KCSAgICAtIEZpeCBkZWZhdWx0IHR5cGVtYXBzIGZvciBDIGJpbmRpbmdzLCB3aGljaCB3ZXJlIGluY29ycmVjdGx5IGF0dGVtcHRpbmcgdG8KCSAgICBjYWxsIG5vbi1leGlzdGVudCBkZXN0cnVjdG9ycyBvbiB1c2VyLWRlZmluZWQgdHlwZXMuCgkgICAgLSBOZXcgZmVhdHVyZSwgZmVhdHVyZTphY2xtaXhpbnMsIGZvciBhZGRpbmcgc3VwZXJjbGFzcyB0byB0aGUgZm9yZWlnbiBjbGFzcwoJICAgIHdyYXBwZXJzLgoJICAgIC0gSW1wcm92ZSBsb25nbG9uZyB0eXBlbWFwcy4KCjIwMTEtMDYtMTk6IHdzZnVsdG9uCgkgICAgRml4IGluY29ycmVjdCB0eXBlbWFwcyBiZWluZyB1c2VkIGZvciBhIHN5bWJvbCB3aXRoaW4gYSB0ZW1wbGF0ZWQgdHlwZSwgZWc6CiAgICAgICAgICAgIEE8aW50Pjo6dmFsdWVfdHlwZSB3b3VsZCBpbmNvcnJlY3RseSB1c2UgYSB0eXBlbWFwIGZvciB0eXBlIEEuCgoyMDExLTA2LTE4OiBvbGx5CgkgICAgW1RjbF0gRml4IHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBpbiBtaWRkbGUgb2YgYmxvY2tzIHdoaWNoIGlzbid0CgkgICAgcGVybWl0dGVkIGluIEM5MCAoaXNzdWUgcHJvYmFibHkgaW50cm9kdWNlZCBpbiAyLjAuMyBieSBwYXRjaCAjMzIyNDY2MykuCgkgICAgUmVwb3J0ZWQgYnkgUGF1bCBPYmVybWVpZXIgaW4gU0YjMzI4ODU4Ni4KCjIwMTEtMDYtMTc6IHdzZnVsdG9uCgkgICAgW0phdmFdIFNGICMzMzEyNTA1IC0gc2xpZ2h0bHkgZWFzaWVyIHRvIHdyYXAgY2hhcltdIG9yIGNoYXJbQU5ZXSB3aXRoIGEgSmF2YSBieXRlW10KICAgICAgICAgICAgdXNpbmcgYXJyYXlzX2phdmEuaS4KCjIwMTEtMDYtMTM6IHdzZnVsdG9uCgkgICAgW1J1YnksIE9jdGF2ZV0gU0YgIzMzMTA1MjggQXV0b2RvYyBmaXhlcyBzaW1pbGFyIHRvIHRob3NlIGRlc2NyaWJlZCBiZWxvdyBmb3IgUHl0aG9uLgoKMjAxMS0wNi0xMDogd3NmdWx0b24KCSAgICBbUHl0aG9uXSBGZXcgc3VidGxlIGJ1Z2ZpeGVzIGluIGF1dG9kb2MgZG9jdW1lbnRhdGlvbiBnZW5lcmF0aW9uLAogICAgICAgICAgICAtIFVubmFtZWQgYXJndW1lbnQgbmFtZXMgZml4IGZvciBhdXRvZG9jIGxldmVscyA+IDAuCiAgICAgICAgICAgIC0gRGlzcGxheSBvZiB0ZW1wbGF0ZSB0eXBlcyBmaXhlZCBmb3IgYXV0b2RvYyBsZXZlbHMgPiAxLgogICAgICAgICAgICAtIEZpeCBTRiAjMzMxMDUyOCAtIGRpc3BsYXkgb2YgdHlwZWRlZiBzdHJ1Y3RzIGZvciBhdXRvZG9jIGxldmVscyA+IDEuCiAgICAgICAgICAgIC0gQWRkIG1pc3NpbmcgdHlwZSBmb3Igc2VsZiBmb3IgYXV0b2RvYyBsZXZlbHMgMSBhbmQgMy4KICAgICAgICAgICAgLSBhdXRvZG9jIGxldmVscyAyIGFuZCAzIGRvY3VtZW50ZWQuCiAgICAgICAgICAgIC0gTWlub3IgdHdlYWtzIHRvIGF1dG9kb2Mgc3R5bGUgdG8gY29uZm9ybSB3aXRoIFBFUDguCgoyMDExLTA1LTMwOiBvbGx5CgkgICAgW1BIUF0gRml4IGhhbmRsaW5nIG9mIGRpcmVjdG9ycyB3aGVuIC1wcmVmaXggaXMgdXNlZC4KCjIwMTEtMDUtMjQ6IG9sbHkKCSAgICBbUEhQXSBGaXggaGFuZGxpbmcgb2YgbWV0aG9kcyBvZiBjbGFzc2VzIHdpdGggYSB2aXJ0dWFsIGJhc2UgY2xhc3MgKFNGIzMxMjQ2NjUpLgoKVmVyc2lvbiAyLjAuNCAoMjEgTWF5IDIwMTEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxMS0wNS0xOTogd3NmdWx0b24KCSAgICBbR3VpbGVdIFBhdGNoICMzMTkxNjI1IGZpeGluZyBvdmVybG9hZGluZyBvZiBpbnRlZ2VyIHR5cGVzLgoKMjAxMS0wNS0xOTogd3NmdWx0b24KCSAgICBbUGVybF0gUGF0Y2ggIzMyNjAyNjUgZml4aW5nIG92ZXJsb2FkaW5nIG9mIG5vbi1wcmltaXRpdmUgdHlwZXMgYW5kIGludGVnZXJzIGluIAogICAgICAgICAgICBQZXJsIDUuMTIgYW5kIGxhdGVyLgoKMjAxMS0wNS0xOTogd3NmdWx0b24KCSAgICBbUnVieV0gRml4ICVpbXBvcnQgd2hlcmUgb25lIG9mIHRoZSBpbXBvcnRlZCBmaWxlcyAlaW5jbHVkZSBvbmUgb2YgdGhlIFNUTCBpbmNsdWRlCiAgICAgICAgICAgIGZpbGVzIHN1Y2ggYXMgc3RkX3ZlY3Rvci5pLgoKMjAxMS0wNS0xNzogd3NmdWx0b24KCSAgICBbSmF2YV0gQXBwbHkgIzMyODk4NTEgZnJvbSBBbGFuIEhhcmRlciB0byBmaXggbWVtb3J5IGxlYWsgaW4gZGlyZWN0b3JzIHdoZW4gY2hlY2tpbmcKICAgICAgICAgICAgZm9yIHBlbmRpbmcgZXhjZXB0aW9ucy4KCjIwMTEtMDUtMTc6IHdzZnVsdG9uCgkgICAgW1RjbF0gQXBwbHkgIzMzMDAwNzIgZnJvbSBDaHJpc3RpYW4gRGVsYmFlcmUgdG8gZml4IG11bHRpcGxlIG1vZHVsZSBsb2FkaW5nIG5vdAogICAgICAgICAgICBhbHdheXMgc2hhcmluZyB2YXJpYWJsZXMgYWNyb3NzIG1vZHVsZXMuCgoyMDExLTA1LTE2OiB4YXZpZXI5OAoJICAgIFtvY3RhdmVdIEZpeCBhbiBpbmNvbXBhdGliaWxpdHkgd2l0aCBuZXZlciB2ZXJzaW9ucyBvZiBPY3RhdmUuIENhc2Ugb24gT2N0YXZlCgkgICAgQVBJID49IDQwIHRvIGhhbmRsZSByZW5hbWUgb2YgT2N0YXZlX21hcCB0byBvY3RhdmVfbWFwLgoJICAgIFtvY3RhdmVdIEFkZCBzdXBwb3J0IGZvciB5Ll9fcm9wX18oeCkgb3BlcmF0b3JzIHdoZW4geC5fX29wX18oeSkgZG9lc24ndCBleGlzdC4KCSAgICBbb2N0YXZlXSBBbGxvdyBnbG9iYWwgb3BlcmF0b3JzIHRvIGJlIGRlZmluZWQgYnkgU1dJRy13cmFwcGVkIGZ1bmN0aW9ucy4KCSAgICBbb2N0YXZlXSBGaXggc2V2ZXJhbCBidWdzIGFyb3VuZCBtb2R1bGUgbmFtZXNwYWNlczsgYWRkIC1nbG9iYWwsIC1ub2dsb2JhbCwKCSAgICAtZ2xvYmFscyA8bmFtZT4gY29tbWFuZCBsaW5lIG9wdGlvbnMgdG8gdGhlIG1vZHVsZS4KCjIwMTEtMDUtMTQ6IHdzZnVsdG9uCgkgICAgJXZhcmFyZ3Mgd2hlbiB1c2VkIHdpdGggYSBudW1lcmljIGFyZ3VtZW50IHVzZWQgdG8gY3JlYXRlIGFuIGFkZGl0aW9uYWwgYXJndW1lbnQgCiAgICAgICAgICAgIHdoaWNoIHdhcyBpbnRlbmRlZCB0byBwcm92aWRlIGEgZ3VhcmFudGVlZCBzZW50aW5lbCB2YWx1ZS4gVGhpcyBuZXZlciB3b3JrZWQgYW5kIG5vdwogICAgICAgICAgICB0aGUgYWRkaXRpb25hbCBhcmd1bWVudCBpcyBub3QgZ2VuZXJhdGVkLgoKMjAxMS0wNS0xMzogd3NmdWx0b24KCSAgICBbcHl0aG9uXSBBZGRpdGlvbmFsIGZpeGVzIGZvciBweXRob24zLjIgc3VwcG9ydC4KCjIwMTEtMDUtMDc6IHN6YWdlcgoJICAgIFtweXRob25dIEZpeGVkIFB5R2V0U2V0RGVzY3IgZm9yIHB5dGhvbjMuMi4KCjIwMTEtMDUtMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWEsIFB5dGhvbiwgVGNsXSBDL0MrKyBwcm90b3R5cGVzIHNob3duIGluIGVycm9yIG1lc3NhZ2Ugd2hlbiBjYWxsaW5nIGFuIG92ZXJsb2FkZWQKICAgICAgICAgICAgbWV0aG9kIHdpdGggaW5jb3JyZWN0IGFyZ3VtZW50cyBpbXByb3ZlZCB0byBzaG93IGFsd2F5cyBzaG93IGZ1bGx5IHF1YWxpZmllZCBuYW1lCiAgICAgICAgICAgIGFuZCBpZiBhIGNvbnN0IG1ldGhvZC4gCgogICAgICAgICAgICBBbHNvIGZpeGVkIG90aGVyIEx1YSBlcnJvciBtZXNzYWdlcyBpbiBnZW5lcmF0ZWQgY29kZSB3aGljaCB3ZXJlbid0IGNvbnNpc3RlbnRseQogICAgICAgICAgICB1c2luZyB0aGUgZnVsbHkgcXVhbGlmaWVkIEMrKyBuYW1lIC0gcmVxdWVzdGVkIGJ5IEdlZGFsaWEgUGFzdGVybmFrLgoKMjAxMS0wNC0yOTogc3phZ2VyCgkgICAgQnVnIDI2MzU5MTk6IENvbnZlbmllbmNlIG1ldGhvZCB0byBjb252ZXJ0IHN0ZDo6bWFwIHRvIGEgcHl0aG9uIGRpY3QuCgoyMDExLTA0LTI5OiBzemFnZXIKCSAgICBbUHl0aG9uXSBGaXhlZCBidWcgMjgxMTU0OTogcmV0dXJuIG5vbi1jb25zdCBpdGVyYXRvcnMgZnJvbSBTVEwKCSAgICBtZXRob2RzIGJlZ2luKCksIGVuZCgpLCByYmVnaW4oKSwgcmVuZCgpLgoKMjAxMS0wNC0yNTogc3phZ2VyCgkgICAgW1B5dGhvbl0gRml4ZWQgYnVnIDE0OTg5Mjk6IEFjY2VzcyB0byBtZW1iZXIgZmllbGRzIGluIG1hcCBlbGVtZW50cwoKMjAxMS0wNC0yMzoga2xpY2t2ZXJib3QKICAgICAgICAgICAgW0RdIG5zcGFjZTogQ29ycmVjdGx5IGdlbmVyYXRlIGlkZW50aWZpZXJzIGZvciBiYXNlIGNsYXNzZXMgd2hlbgogICAgICAgICAgICBub3QgaW4gc3BsaXQgcHJveHkgbW9kZS4KCjIwMTEtMDQtMTM6IHN6YWdlcgoJICAgIEZpeGVkIGJ1ZyAzMjg2MzMzOiBpbmZpbml0ZSByZWN1cnNpb24gd2l0aCBtdXR1YWwgJ3VzaW5nIG5hbWVzcGFjZScgY2xhdXNlcy4KCjIwMTEtMDQtMTI6IHN6YWdlcgoJICAgIEZpeGVkIGJ1ZyAxMTYzNDQwOiB2YXJhcmcgdHlwZW1hcHMuCgoyMDExLTA0LTEyOiBzemFnZXIKCSAgICBGaXhlZCBidWcgIzMyODUzODY6IHBhcnNlIGVycm9yIGZyb20gJ29wZXJhdG9yIFQqJigpJy4gIEFkZGVkIG9wZXJhdG9yX3BvaW50ZXJfcmVmCgkgICAgdGVzdCBjYXNlIHRvIGRlbW9uc3RyYXRlLgoKMjAxMS0wNC0xMTogc3phZ2VyCgkgICAgW1B5dGhvbl0gRml4ZWQgUHlWYXJPYmplY3RfSEVBRF9JTklUIHRvIGVsaW1pbmF0ZSBWQysrIGNvbXBpbGVyIGVycm9ycyBhYm91dAoJICAgIHN0YXRpYyBpbml0aWFsaXphdGlvbiBvZiBzdHJ1Y3QgbWVtYmVycyB3aXRoIHBvaW50ZXJzLgoKMjAxMS0wNC0xMTogd3NmdWx0b24KICAgICAgICAgICAgW1RjbF0gQXBwbHkgcGF0Y2ggIzMyODQzMjYgZnJvbSBDb2xpbiBNY0RvbmFsZCB0byBmaXggc29tZSBjb21waWxlciB3YXJuaW5ncy4KCjIwMTEtMDQtMTE6IHN6YWdlcgoJICAgIFtQeXRob25dIEZpeGVkIFB5VmFyT2JqZWN0X0hFQURfSU5JVCB0byBlbGltaW5hdGUgVkMrKyBjb21waWxlciBlcnJvcnMgYWJvdXQKCSAgICBzdGF0aWMgaW5pdGlhbGl6YXRpb24gb2Ygc3RydWN0IG1lbWJlcnMgd2l0aCBwb2ludGVycy4KCjIwMTEtMDQtMTA6IGtsaWNrdmVyYm90CiAgICAgICAgICAgIFtEXSBGaXhlZCB3cmFwcGluZyBvZiBlbnVtcyB0aGF0IGFyZSB0eXBlIGNoYXIsIGZvciBleGFtcGxlOgogICAgICAgICAgICBlbnVtIHsgWCA9ICdYJzsgfSAodGhpcyB3YXMgYWxyZWFkeSBpbiAyLjAuMyBmb3IgQyMgYW5kIEphdmEpCgoyMDExLTA0LTEwOiBrbGlja3ZlcmJvdAogICAgICAgICAgICBbRF0gbnNwYWNlOiBGaXhlZCByZWZlcmVuY2luZyB0eXBlcyBpbiB0aGUgcm9vdCBuYW1lc3BhY2Ugd2hlbgogICAgICAgICAgICBub3QgaW4gc3BsaXQgcHJveHkgbW9kZS4KCjIwMTEtMDQtMDk6IHN6YWdlcgoJICAgIFtQeXRob25dIEFwcGxpZWQgcGF0Y2ggIzE5MzI0ODQ6IG1pZ3JhdGUgUHlDT2JqZWN0IHRvIFB5Q2Fwc3VsZS4KCjIwMTEtMDQtMDk6IHN6YWdlcgoJICAgIFtQeXRob25dIEFkZGVkIHByZXByb2Nlc3NvciBndWFyZHMgZm9yIHB5dGhvbiBmdW5jdGlvbnMgUHlVbmljb2RlX0FzV2lkZUNoYXIgYW5kCgkgICAgUHlTbGljZV9HZXRJbmRpY2VzLCB3aGljaCBjaGFuZ2VkIHNpZ25hdHVyZXMgaW4gcHl0aG9uMy4yLgoKMjAxMS0wNC0wNzogd3NmdWx0b24KICAgICAgICAgICAgRml4IHdyYXBwaW5nIG9mIGNvbnN0IGFycmF5IHR5cGVkZWZzIHdoaWNoIHdlcmUgZ2VuZXJhdGluZyB1bmNvbXBpbGFibGUgY29kZSBhcwogICAgICAgICAgICByZXBvcnRlZCBieSBLYXJsIFdldHRlLgoKMjAxMS0wNC0wMzogc3phZ2VyCgkgICAgW1B5dGhvbl0gRml4ZWQgdGhlIGJlaGF2aW9yIG9mICVweXRob25ub25keW5hbWljIHRvIGNvbmZvcm0gdG8gdGhlIHNwZWMgaW4gTGliL3B5dXNlcmRpci5zd2cuCgoyMDExLTA0LTAzOiBzemFnZXIKCSAgICBbUHl0aG9uXSBNZXJnZWQgaW4gdGhlIHN6YWdlci1weXRob24tYnVpbHRpbiBicmFuY2gsIGFkZGluZyB0aGUgLWJ1aWx0aW4gZmVhdHVyZQoJICAgIGZvciBweXRob24uICBUaGUgLWJ1aWx0aW4gb3B0aW9uIG1heSBwcm92aWRlIGEgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgZ2FpbgoJICAgIGluIHB5dGhvbiB3cmFwcGVycy4gIEZvciBmdWxsIGRldGFpbHMgYW5kIGxpbWl0YXRpb25zLCByZWZlciB0byBEb2MvTWFudWFsL1B5dGhvbi5odG1sLgoJICAgIEEgc21hbGwgdGVzdCBzdWl0ZSBkZXNpZ25lZCB0byBkZW1vbnN0cmF0ZSB0aGUgcGVyZm9ybWFuY2UgZ2FpbiBpcyBpbgoJICAgIEV4YW1wbGVzL3B5dGhvbi9wZXJmb3JtYW5jZS4KCjIwMTEtMDQtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBpbiBtaXNzaW5nIHdyYXBwZXJzIGZvciBmcmllbmQgZnVuY3Rpb25zIGZvciBzb21lIHRhcmdldCBsYW5ndWFnZXMsIG1vc3RseQogICAgICAgICAgICB0aGUgbm9uLXNjcmlwdGluZyBsYW5ndWFnZXMgbGlrZSBKYXZhIGFuZCBDIy4KClZlcnNpb24gMi4wLjMgKDI5IE1hcmNoIDIwMTEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDExLTAzLTI5OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gQXBwbHkgcGF0Y2ggIzMyMzkwNzYgZnJvbSBNYXJpZSBXaGl0ZSBmaXhpbmcgc3RyaW5ncyBmb3IgUiA+PSAyLjcuMAoKMjAxMS0wMy0yOTogd3NmdWx0b24KICAgICAgICAgICAgW1RjbF0gQXBwbHkgcGF0Y2ggIzMyNDgyODAgZnJvbSBDaHJpc3RpYW4gRGVsYmFlcmUgd2hpY2ggYWRkcyBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMgd2hlbgogICAgICAgICAgICB0aGUgaW5jb3JyZWN0IG51bWJlciBvciB0eXBlIG9mIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRvIG92ZXJsb2FkZWQgbWV0aG9kcy4KCjIwMTEtMDMtMjk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtUY2xdIEFwcGx5IHBhdGNoICMzMjI0NjYzIGZyb20gQ2hyaXN0aWFuIERlbGJhZXJlLgogICAgICAgICAgICAxLiBGaXggd2hlbiBmdW5jdGlvbiByZXR1cm5zIGEgTlVMTCB2YWx1ZSwgYSAiTlVMTCIgY29tbWFuZCB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIFRjbCBpbnRlcnByZXRlcgogICAgICAgICAgICBhbmQgY2FsbGluZyB0aGlzIGNvbW1hbmQgd2lsbCBjYXVzZSBhIHNlZ21lbnRhdGlvbiBmYXVsdC4gCgogICAgICAgICAgICAyLiBQcmV2aW91cyBpbXBsZW1lbnRhdGlvbiBzZWFyY2hlcyBmb3IgY2xhc3MgbWV0aG9kcyB1c2luZyBhIGxpbmVhciBzZWFyY2ggY2F1c2luZyBwZXJmb3JtYW5jZSBpc3N1ZXMKICAgICAgICAgICAgaW4gd3JhcHBlcnMgZm9yIGNsYXNzZXMgd2l0aCBtYW55IG1lbWJlciBmdW5jdGlvbnMuIFRoZSBwYXRjaCBhZGRzIGEgbWV0aG9kIGhhc2ggdGFibGUgdG8gY2xhc3NlcyBhbmQKICAgICAgICAgICAgY2hhbmdlcyBtZXRob2QgbmFtZSBsb29rdXAgdG8gdXNlIHRoZSBoYXNoIHRhYmxlIGluc3RlYWQgb2YgZG9pbmcgYSBsaW5lYXIgc2VhcmNoLgoKMjAxMS0wMy0yNjogd3NmdWx0b24KCSAgICBbQyMsIEphdmFdIFNGIGJ1ZyAjMzE5NTExMiAtIGZpeCB3cmFwcGluZyBvZiBlbnVtcyB0aGF0IGFyZSB0eXBlIGNoYXIsIGZvciBleGFtcGxlOgogICAgICAgICAgICAgIGVudW0geyBYID0gJ1gnOyB9CgoyMDExLTAzLTIxOiB2YWR6CgkgICAgQWxsb3cgc2V0dGluZyBQQ1JFX0NGTEFHUyBhbmQgUENSRV9MSUJTIGR1cmluZyBjb25maWd1cmF0aW9uIHRvIG92ZXJyaWRlIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkKCSAgICBwY3JlLWNvbmZpZywgZS5nLiB0byBhbGxvdyB1c2luZyBhIHN0YXRpYyB2ZXJzaW9uIG9mIFBDUkUgbGlicmFyeS4KCjIwMTEtMDMtMTc6IHdzZnVsdG9uCgkgICAgW1VUTF0gQWRkIG1pc3NpbmcgaGVhZGVycyBpbiBnZW5lcmF0ZWQgU1RMIHdyYXBwZXJzIHRvIGZpeCBjb21waWxhdGlvbiB3aXRoIGdjYy00LjYuCgoyMDExLTAzLTE3OiB3c2Z1bHRvbgoJICAgIEZpeCByZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gc3dpZy0yLjAuMiB3aGVyZSBmaWxlbmFtZXMgd2l0aCBzcGFjZXMgd2VyZSBub3QgZm91bmQKCSAgICB3aGVuIHVzZWQgd2l0aCAlaW5jbHVkZSBhbmQgJWltcG9ydC4gUmVwb3J0ZWQgYnkgU2hhbmUgTGllc2VnYW5nLgoKMjAxMS0wMy0xNTogd3NmdWx0b24KCSAgICBbVVRMXSBGaXggb3ZlcmxvYWRpbmcgd2hlbiB1c2luZyBjb25zdCBjaGFyW10sIHByb2JsZW0gcmVwb3J0ZWQgYnkgRGF2aWQgTWF4d2VsbC4KICAgICAgICAgICAgU2ltaWxhcmx5IGZvciBjaGFyW0FOWV0gYW5kIGNvbnN0IGNoYXJbQU5ZXS4KCjIwMTEtMDMtMTU6IHdzZnVsdG9uCgkgICAgW0MjXSBBcHBseSBwYXRjaCAjMzIxMjYyNCBmaXhpbmcgc3RkOjptYXAgS2V5cyBwcm9wZXJ0eS4KCjIwMTEtMDMtMTQ6IG9sbHkKCSAgICBbUEhQXSBGaXggaGFuZGxpbmcgb2Ygb3ZlcmxvYWRlZCBtZXRob2RzL2Z1bmN0aW9ucyB3aGVyZSBzb21lCgkgICAgcmV0dXJuIHZvaWQgYW5kIG90aGVycyBkb24ndCAtIHdoZXRoZXIgdGhpcyB3b3JrZWQgb3Igbm90IGRlcGVuZGVkCgkgICAgb24gdGhlIG9yZGVyIHRoZXkgd2VyZSBlbmNvdW50ZXJlZCBpbiAoU0YjMzIwODI5OSkuCgkKMjAxMS0wMy0xMzoga2xpY2t2ZXJib3QKICAgICAgICAgICAgW0RdIEV4dGVuZGVkIHN1cHBvcnQgZm9yIEMrKyBuYW1lc3BhY2VzIChuc3BhY2UgZmVhdHVyZSkuCgoyMDExLTAzLTEyOiBvbGx5CgkgICAgW1BIUF0gRml4IHNoYXJpbmcgb2YgdHlwZSBpbmZvcm1hdGlvbiBiZXR3ZWVuIG11bHRpcGxlIFNXSUctd3JhcHBlZAoJICAgIG1vZHVsZXMgKFNGIzMyMDI0NjMpLgoKMjAxMS0wMy0wOTogd3NmdWx0b24KCSAgICBbUHl0aG9uXSBGaXggU0YgIzMxOTQyOTQgLSBjb3JuZXIgY2FzZSBidWcgd2hlbiAnTlVMTCcgaXMgdXNlZCBhcyB0aGUgZGVmYXVsdCB2YWx1ZQogICAgICAgICAgICBmb3IgYSBwcmltaXRpdmUgdHlwZSBwYXJhbWV0ZXIgaW4gYSBtZXRob2QgZGVjbGFyYXRpb24uCgoyMDExLTAzLTA3OiBvbGx5CgkgICAgW1BIUF0gRG9uJ3QgdXNlIHplbmRfZXJyb3Jfbm9yZXR1cm4oKSBmb3IgY2FzZXMgd2hlcmUgdGhlIGZ1bmN0aW9uCgkgICAgcmV0dXJucyB2b2lkIC0gbm93IHRoaXMgaXNzdWUgY2FuIG9ubHkgbWF0dGVyIGlmIHlvdSBoYXZlIGEgZnVuY3Rpb24KCSAgICBvciBtZXRob2Qgd2hpY2ggaXMgZGlyZWN0ZWQgYW5kIHJldHVybnMgbm9uLXZvaWQuCgoyMDExLTAzLTA2OiBvbGx5CgkgICAgW1BIUF0gQWRkIGNhc3RzIHRvIHRoZSB0eXBlbWFwcyBmb3IgbG9uZyBsb25nIGFuZCB1bnNpZ25lZCBsb25nCgkgICAgbG9uZyB0byBhdm9pZCBpc3N1ZXMgd2hlbiB0aGV5IGFyZSB1c2VkIHdpdGggc2hvcnRlciB0eXBlcyB2aWEKCSAgICAlYXBwbHkuCgoyMDExLTAzLTAyOiB3c2Z1bHRvbgoJICAgIFRlbXBsYXRlZCBzbWFydCBwb2ludGVycyBvdmVybG9hZGVkIHdpdGggYm90aCBjb25zdCBhbmQgbm9uIGNvbnN0IG9wZXJhdG9yLT4gZ2VuZXJhdGVkIHVuY29tcGlsYWJsZQoJICAgIGNvZGUgd2hlbiB0aGUgcG9pbnRlZSB3YXMgYSBjbGFzcyB3aXRoIGVpdGhlciBwdWJsaWMgbWVtYmVyIHZhcmlhYmxlcyBvciBzdGF0aWMgbWV0aG9kcy4KCSAgICBSZWdyZXNzaW9uIGluIDIuMC54IHJlcG9ydGVkIGFzIHdvcmtpbmcgaW4gMS4zLjQwIGJ5IHhhbnRhcmVzIG9uIHN3aWctdXNlciBtYWlsaW5nIGxpc3QuCgpWZXJzaW9uIDIuMC4yICgyMCBGZWJydWFyeSAyMDExKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxMS0wMi0xOTogd3NmdWx0b24KCSAgICBbUEhQXSBBZGQgbWlzc2luZyBJTlBVVCwgT1VUUFVUIGFuZCBJTk9VVCB0eXBlbWFwcyBpbiB0aGUgdHlwZW1hcHMuaSBsaWJyYXJ5CiAgICAgICAgICAgIGZvciBwcmltaXRpdmUgcmVmZXJlbmNlIHR5cGVzIGFzIHdlbGwgYXMgc2lnbmVkIGNoYXIgKiBhbmQgYm9vbCAqLgoKMjAxMS0wMi0xOTogb2xseQoJICAgIFtQSFBdIEFkZHJlc3MgYnVnIGluIFBIUCBvbiBzb21lIHBsYXRmb3Jtcy9hcmNoaXRlY3R1cmVzIHdoaWNoCgkgICAgcmVzdWx0cyBpbiB6ZW5kX2Vycm9yX25vcmV0dXJuKCkgbm90IGJlaW5nIGF2YWlsYWJsZSB1c2luZwoJICAgIFNXSUdfWkVORF9FUlJPUl9OT1JFVFVSTiB3aGljaCBkZWZhdWx0cyB0byB6ZW5kX2Vycm9yX25vcmV0dXJuIGJ1dAoJICAgIGNhbiBiZSBvdmVycmlkZGVuIHdoZW4gYnVpbGRpbmcgdGhlIG1vZHVsZSBieSBwYXNzaW5nCgkgICAgLURTV0lHX1pFTkRfRVJST1JfTk9SRVRVUk49emVuZF9lcnJvciB0byB0aGUgY29tcGlsZXIuICBUaGlzIG1heQoJICAgIHJlc3VsdCBpbiBjb21waWxlciB3YXJuaW5ncywgYnV0IHNob3VsZCBhdCBsZWFzdCBhbGxvdyBhIG1vZHVsZQoJICAgIHRvIGJlIGJ1aWx0IG9uIHRob3NlIHBsYXRmb3Jtcy9hcmNoaXRlY3R1cmVzIChTRiMzMTY2NDIzKS4KCjIwMTEtMDItMTg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMzE4NDU0OSAtIHZhcmFyZyBmdW5jdGlvbnMgYW5kIGZ1bmN0aW9uIG92ZXJsb2FkaW5nIHdoZW4gdXNpbmcgdGhlIC1mYXN0ZGlzcGF0Y2ggb3B0aW9uLgoKMjAxMS0wMi0xODogb2xseQoJICAgIFtQSFBdIEFuIG92ZXJsb2FkZWQgbWV0aG9kIHdoaWNoIGNhbiByZXR1cm4gYW4gb2JqZWN0IG9yIGEKCSAgICBwcmltaXRpdmUgdHlwZSBubyBsb25nZXIgY2F1c2VzIFNXSUcgdG8gc2VnZmF1bHQuICBSZXBvcnRlZCBieSBQYXVsCgkgICAgQ29sYnkgaW4gU0YjMzE2ODUzMS4KCjIwMTEtMDItMTg6IG9sbHkKCSAgICBbUEhQXSBGaXggaW52YWxpZCBlcmFzZSBkdXJpbmcgaXRlcmF0aW9uIG9mIHN0ZDo6bWFwIGluIGdlbmVyYXRlZAoJICAgIGRpcmVjdG9yIGNvZGUuICBSZXBvcnRlZCBieSBDb3J5IEJlbm5ldHQgaW4gU0YjMzE3NTgyMC4KCjIwMTEtMDItMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIFByZXByb2Nlc3Npbmcgbm93IHdhcm5zIGlmIGV4dHJhIHRva2VucyBhcHBlYXIgYWZ0ZXIgI2Vsc2UgYW5kICNlbmQuCgoyMDExLTAyLTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzE2NTMwOTIgUHJlcHJvY2Vzc29yIGRvZXMgbm90IGVycm9yIG91dCB3aGVuICNlbGlmIGlzIG1pc3NpbmcgYW4gZXhwcmVzc2lvbi4KICAgICAgICAgICAgVGhpcyBhbmQgb3RoZXIgY2FzZXMgb2YgbWlzc2luZyBwcmVwcm9jZXNzb3IgZXhwcmVzc2lvbnMgbm93IHJlc3VsdCBpbiBhbiBlcnJvci4KCjIwMTEtMDItMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtPY2FtbF0gQXBwbHkgcGF0Y2ggIzMxNTE3ODggZnJvbSBKb2VsIFJleW1vbnQuIEJyaW5ncyBPY2FtbCBzdXBwb3J0IHVwIHRvIGRhdGUgCiAgICAgICAgICAgICh2ZXIgMy4xMSBhbmQgMy4xMiksIGluY2x1ZGluZyBzdGQ6OnN0cmluZy4KCjIwMTEtMDItMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBBcHBseSBwYXRjaCAjMzE3NjI3NCBmcm9tIEphbWVzIE1hc3RlcnMgLSB0eXBlY2hlY2sgdHlwZW1hcCBmb3IgdGltZV90LgoKMjAxMS0wMi0xMzogd3NmdWx0b24KICAgICAgICAgICAgQXBwbHkgcGF0Y2ggIzMxNzE3OTMgZnJvbSBzemFnZXIgLSBwcm90ZWN0ZWQgZGlyZWN0b3IgbWV0aG9kcyBmYWlsaW5nIHdoZW4gLWZ2aXJ0dWFsIGlzIHVzZWQuCgoyMDExLTAyLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzE5Mjc4NTIgLSAjaW5jbHVkZSBkaXJlY3RpdmVzIGRvbid0IHByZXByb2Nlc3MgdGhlIGZpbGUgcGFzc2VkIHRvIGl0LiBUaGUgZml4IGlzIGZvcgogICAgICAgICAgICAjaW5jbHVkZSB3aXRoIC1pbXBvcnRhbGwgb3IgLWluY2x1ZGVhbGwsICVpbmNsdWRlIGFuZCAlaW1wb3J0LCBmb3IgZXhhbXBsZToKICAgICAgICAgICAgICAjZGVmaW5lIEZJTEVOQU1FICJhYmMuaCIKICAgICAgICAgICAgICAlaW5jbHVkZSBGSUxFTkFNRQoKMjAxMS0wMi0xMjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxOTQwNTM2LCBvdmVyYWN0aXZlIHByZXByb2Nlc3NvciB3aGljaCB3YXMgZXhwYW5kaW5nIGRlZmluZWQoLi4uKSBvdXRzaWRlIG9mICNpZiBhbmQgI2VsaWYKICAgICAgICAgICAgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMuCgoyMDExLTAyLTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbTXpTY2hlbWVdIFNGICMyOTQyODk5IEFkZCB1c2VyIHN1cHBsaWVkIGRvY3VtZW50YXRpb24gdG8gaGVscCBnZXR0aW5nIHN0YXJ0ZWQgd2l0aCBNelNjaGVtZS4KICAgICAgICAgICAgVXBkYXRlIGNoYXB0ZXIgbmFtZSB0byBNelNjaGVtZS9SYWNrZXQgYWNjb3VudGluZyBmb3IgdGhlIHJlbmFtZSBvZiBNelNjaGVtZSB0byBSYWNrZXQuCgoyMDExLTAyLTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFNGICMzMDg1OTA2IC0gUG9zc2libGUgZml4IHJ1bm5pbmcgdGVzdC1zdWl0ZSBvbiBNYWMgT1MgWC4KCjIwMTEtMDItMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFNGICMzMTczMzY3IEJldHRlciBpbmZvcm1hdGlvbiBkdXJpbmcgY29uZmlndXJlIGFib3V0IEJvb3N0IHByZXJlcXVpc2l0ZSBmb3IgcnVubmluZwogICAgICAgICAgICB0aGUgdGVzdC1zdWl0ZS4KCjIwMTEtMDItMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFNGICMzMTI3NjMzIEZpeCBpbmZpbml0ZSBsb29wIGluIHJlY3Vyc2l2ZSB0eXBlZGVmIHJlc29sdXRpb24uCgoyMDExLTAyLTA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gU0YgIzMxNjg2NzYgRml4ICVyZW5hbWUgbm90IHdvcmtpbmcgZm9yIG1lbWJlciB2YXJpYWJsZXMgYW5kIG1ldGhvZHMuCgoyMDExLTAyLTA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbY2xpc3BdIFNGICMzMTQ4MjAwIEZpeCBzZWdmYXVsdCBwYXJzaW5nIG5lc3RlZCB1bmlvbnMuCgoyMDExLTAyLTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIERpcmVjdG9ycyAtIGEgY2FsbCB0byBhIG1ldGhvZCBiZWluZyBkZWZpbmVkIGluIHRoZSBiYXNlIGNsYXNzLCBub3QKICAgICAgICAgICAgb3ZlcnJpZGRlbiBpbiBhIHN1YmNsYXNzLCBidXQgYWdhaW4gb3ZlcnJpZGRlbiBpbiBhIGNsYXNzIGRlcml2ZWQgZnJvbQogICAgICAgICAgICB0aGUgZmlyc3Qgc3ViY2xhc3Mgd2FzIG5vdCBiZWluZyBkaXNwYXRjaGVkIGNvcnJlY3RseSB0byB0aGUgbW9zdCBkZXJpdmVkIGNsYXNzLgogICAgICAgICAgICBTZWUgZGlyZWN0b3JfYWx0ZXJuYXRpbmcuaSBmb3IgYW4gZXhhbXBsZS4KCjIwMTEtMDItMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gQW55ICd1c2luZycgc3RhdGVtZW50cyBpbiB0aGUgcHJvdGVjdGVkIHNlY3Rpb24gb2YgYSBjbGFzcyB3ZXJlIHByZXZpb3VzbHkKICAgICAgICAgICAgaWdub3JlZCB3aXRoIGRpcmVjdG9yIHByb3RlY3RlZCAoZGlycHJvdCkgbW9kZS4KCjIwMTEtMDEtMzA6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBvdmVybG9hZGluZyB3aXRoIGNvbnN0IHBvaW50ZXIgcmVmZXJlbmNlIChTV0lHVFlQRSAqY29uc3QmKSBwYXJhbWV0ZXJzIGZvciBhCiAgICAgICAgICAgIG51bWJlciBvZiBzY3JpcHRpbmcgbGFuZ3VhZ2VzLgoKMjAxMS0wMS0xNzogd3NmdWx0b24KICAgICAgICAgICAgTmV3IHdhcm5pbmcgZm9yIHNtYXJ0IHBvaW50ZXJzIGlmIG9ubHkgc29tZSBvZiB0aGUgY2xhc3NlcyBpbiB0aGUgaW5oZXJpdGFuY2UKICAgICAgICAgICAgY2hhaW4gYXJlIG1hcmtlZCBhcyBzbWFydCBwb2ludGVyLCBlZywgJXNoYXJlZF9wdHIgc2hvdWxkIGJlIHVzZWQgZm9yIGFsbCBjbGFzc2VzCiAgICAgICAgICAgIGluIGFuIGluaGVyaXRhbmNlIGhpZXJhcmNoeSwgc28gdGhpcyBuZXcgd2FybmluZyBoaWdobGlnaHRzIGNvZGUgd2hlcmUgdGhpcyBpcwogICAgICAgICAgICBub3QgdGhlIGNhc2UuCgogICAgICAgICAgICAgIGV4YW1wbGUuaToxMjogV2FybmluZyA1MjA6IEJhc2UgY2xhc3MgJ0EnIG9mICdCJyBpcyBub3Qgc2ltaWxhcmx5IG1hcmtlZCBhcyBhIHNtYXJ0IHBvaW50ZXIuCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjE2OiBXYXJuaW5nIDUyMDogRGVyaXZlZCBjbGFzcyAnQycgb2YgJ0InIGlzIG5vdCBzaW1pbGFybHkgbWFya2VkIGFzIGEgc21hcnQgcG9pbnRlci4KCjIwMTEtMDEtMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZGVkIHNvbWUgbWlzc2luZyBtdWx0aS1hcmd1bWVudCB0eXBlbWFwczogKGNoYXIgKlNUUklORywgc2l6ZV90IExFTkdUSCkgYW5kIAogICAgICAgICAgICAoY2hhciAqU1RSSU5HLCBpbnQgTEVOR1RIKS4gRG9jdW1lbnRhdGlvbiBmb3IgdGhpcyB1cGRhdGVkLiBKYXZhIHBhdGNoIGZyb20KICAgICAgICAgICAgVm9sa2VyIEdyYWJzY2guCgoyMDExLTAxLTExOiBpYW50CgkgICAgUmVxdWlyZSBHbyB2ZXJzaW9uIDcwNzcgb3IgbGF0ZXIuCgoyMDEwLTEyLTMwOiBrbGlja3ZlcmJvdAogICAgICAgICAgICBbQyMsIEQsIEphdmFdIENoZWNrIGZvciBjb2xsaXNpb24gb2YgcGFyYW1ldGVyIG5hbWVzIHdpdGggdGFyZ2V0CiAgICAgICAgICAgIGxhbmd1YWdlIGtleXdvcmRzIHdoZW4gZ2VuZXJhdGluZyB0aGUgZGlyZWN0b3IgZ2x1ZSBjb2RlLgogICAgICAgICAgICAKICAgICAgICAgICAgVGhlIHNpdHVhdGlvbiBpbiB3aGljaCB0aGUgZ2VuZXJhdGVkIGNvdWxkIHdvdWxkIHByZXZpb3VzbHkgYmUKICAgICAgICAgICAgaW52YWxpZCBpcyBpbGx1c3RyYXRlZCBpbiB0aGUgbmV3ICdkaXJlY3Rvcl9rZXl3b3JkcycgdGVzdCBjYXNlLgoKMjAxMC0xMi0yMzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggJGNzaW5wdXQgc3BlY2lhbCB2YXJpYWJsZSBub3QgYmVpbmcgZXhwYW5kZWQgZm9yIGNzdmFyaW4gdHlwZW1hcHMKICAgICAgICAgICAgd2hlbiB1c2VkIGZvciBnbG9iYWwgdmFyaWFibGVzLiBSZXBvcnRlZCBieSBWYWRpbSBaZWl0bGluLgoKMjAxMC0xMi0xNDogd3NmdWx0b24KICAgICAgICAgICAgRml4ICRiYXNlbWFuZ2xlIGV4cGFuc2lvbiBpbiBhcnJheSB0eXBlbWFwcy4gRm9yIGV4YW1wbGUgaWYgdHlwZSBpcyBpbnQgKlszXSwKICAgICAgICAgICAgJGJhc2VtYW5nbGUgZXhwYW5kcyB0byBfcF9pbnQuCgoyMDEwLTEyLTA3OiBpYW50CgkgICAgQ2hlY2sgdGhhdCB3ZSBhcmUgdXNpbmcgYSBzdWZmaWNpZW50bHkgbmV3IHZlcnNpb24gb2YgdGhlCgkgICAgNmcgb3IgOGcgR28gY29tcGlsZXIgZHVyaW5nIGNvbmZpZ3VyZSB0aW1lLiBJZiBub3QsIGRpc2FibGUgR28uCiAgICAgICAgICAgIE1pbmltdW0gdmVyc2lvbiBpcyBub3cgNjcwNy4KCgkgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDEwLTEyLTA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzMxMjczOTQgLSB1c2Ugb2YgbmV0d29yayBwYXRocyBvbiBXaW5kb3dzL01TeXMuCgoyMDEwLTExLTE4OiBrbGlja3ZlcmJvdAoJICAgIFtEXSBBZGRlZCB0aGUgRCBsYW5ndWFnZSBtb2R1bGUuCgoyMDEwLTExLTEyOiB2YWR6CgkgICAgRml4IGhhbmRsaW5nIG9mIG11bHRpcGxlIHJlZ2V4LXVzaW5nICVyZW5hbWVzIGF0dGFjaGVkIHRvIHRoZSBzYW1lCgkgICAgZGVjbGFyYXRpb24uIEZvciBleGFtcGxlLCBub3cKCgkgICAgICAlcmVuYW1lKCIlKHJlZ2V4Oi9eU2V0KC4qKS9wdXRcXDEvKXMiKSAiIjsKCSAgICAgICVyZW5hbWUoIiUocmVnZXg6L15HZXQoLiopL2dldFxcMS8pcyIpICIiOwoKCSAgICB3b3JrcyBhcyBleHBlY3RlZCB3aGVyZWFzIGJlZm9yZSBvbmx5IHRoZSBsYXN0IGFub255bW91cyByZW5hbWUgd2FzCgkgICAgdGFrZW4gaW50byBhY2NvdW50LgoKMjAxMC0xMC0xNzogZHJqb2UKCSAgICBbUl0gRml4IGZhaWx1cmUgaW4gb3ZlcmxvYWRlZCBmdW5jdGlvbnMgd2hpY2ggd2FzIGJyZWFraW5nCgkgICAgUXVhbnRMaWItU1dJRwoKMjAxMC0xMC0xNDogb2xseQoJICAgIFtQSFBdIEFsbG93IGNvbXBpbGF0aW9uIG9uIG5vbi1jb25mb3JtaW5nIE1pY3Jvc29mdCBDKysgY29tcGlsZXJzCgkgICAgd2hpY2ggZG9uJ3QgYWNjZXB0OiByZXR1cm4gZnVuY3Rpb25fcmV0dXJuaW5nX3ZvaWQoKTsKCSAgICBSZXBvcnRlZCBieSBGcmFuayBWYW5kZW4gQmVyZ2hlbiBvbiB0aGUgU1dJRyBtYWlsaW5nIGxpc3QuCgoyMDEwLTEwLTEyOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggdW5hcnkgc2NvcGUgb3BlcmF0b3IgKDo6KSAoZ2xvYmFsIHNjb3BlKSByZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gMi4wLjAsIHJlcG9ydGVkIGJ5CiAgICAgICAgICAgIEJlbiBXYWxrZXIuIFRoZSBtYW5nbGVkIHN5bWJvbCBuYW1lcyB3ZXJlIGluY29ycmVjdCwgc29tZXRpbWVzIHJlc3VsdGluZyBpbiB0eXBlcyBiZWluZwogICAgICAgICAgICBpbmNvcnJlY3RseSB0cmVhdGVkIGFzIG9wYXF1ZSB0eXBlcy4KCiAgICAgICAgICAgIEFsc28gZml4ZXMgIzI5NTg3ODEgYW5kIHNvbWUgb3RoZXIgdHlwZSBwcm9ibGVtcyBkdWUgdG8gYmV0dGVyIHR5cGVkZWYgcmVzb2x1dGlvbiwgZWcgCiAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFQgKj46OnZhbHVlX3R5cGUgZGlkbid0IHJlc29sdmUgdG8gVCAqIHdoZW4gaXQgc2hvdWxkIGhhdmUuIFRoZSBtYW5nbGVkIHR5cGUKICAgICAgICAgICAgd2FzIGluY29ycmVjdGx5IFNXSUdUWVBFX3N0ZF9fdmVjdG9yVF9UZXN0X3Bfc3RkX19hbGxvY2F0b3JUX1Rlc3RfcF90X3RfX3ZhbHVlX3R5cGUgYW5kIG5vdwogICAgICAgICAgICBpdCBpcyBjb3JyZWN0bHkgU1dJR1RZUEVfcF9UZXN0LgoKVmVyc2lvbiAyLjAuMSAoNCBPY3RvYmVyIDIwMTApCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxMC0xMC0wMzogd3NmdWx0b24KICAgICAgICAgICAgQXBwbHkgcGF0Y2ggIzMwNjY5NTggZnJvbSBNaWthZWwgSm9oYW5zc29uIHRvIGZpeCBkZWZhdWx0IHNtYXJ0IHBvaW50ZXIKICAgICAgICAgICAgaGFuZGxpbmcgd2hlbiB0aGUgc21hcnQgcG9pbnRlciBjb250YWlucyBib3RoIGEgY29uc3QgYW5kIG5vbi1jb25zdCBvcGVyYXRvci0+LgoKMjAxMC0xMC0wMTogd3NmdWx0b24KICAgICAgICAgICAgQWRkIC1wY3JldmVyc2lvbiBvcHRpb24gdG8gZGlzcGxheSBQQ1JFIHZlcnNpb24gaW5mb3JtYXRpb24uCgoyMDEwLTEwLTAxOiBvbGx5CgkgICAgW1J1YnldIEF2b2lkIHNlZ2ZhdWx0IHdoZW4gYSBtZXRob2Qgbm9kZSBoYXMgbm8gcGFyZW50Tm9kZQoJICAgIChTRiMzMDM0MDU0KS4KCjIwMTAtMTAtMDE6IG9sbHkKCSAgICBbUHl0aG9uXSBBbGxvdyByZWluaXRpYWxpc2F0aW9uIHRvIHdvcmsgd2l0aCBhbiBlbWJlZGRlZCBQeXRob24KCSAgICBpbnRlcnByZXRlciAocGF0Y2ggZnJvbSBKaW0gQ2Fycm9sbCBpbiBTRiMzMDc1MTc4KS4KCjIwMTAtMDktMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQXBwbHkgcGF0Y2ggZnJvbSBUb21hcyBEaXJ2YW5hdXNrYXMgZm9yIHN0ZDo6bWFwIHdyYXBwZXJzIHRvIGF2b2lkCiAgICAgICAgICAgIHRocm93aW5nIGV4Y2VwdGlvbnMgd2l0aCBub3JtYWwgdXNhZ2Ugb2YgaXRlcmF0b3JzLgoKMjAxMC0wOS0yNzogb2xseQoJICAgIFtQeXRob25dIEltcHJvdmUgZXJyb3IgbWVzc2FnZSBnaXZlbiB3aGVuIGEgcGFyYW1ldGVyIG9mIHRoZSB3cm9uZwoJICAgIHR5cGUgaXMgcGFzc2VkIHRvIGFuIG92ZXJsb2FkZWQgbWV0aG9kIChTRiMzMDI3MzU1KS4KCjIwMTAtMDktMjU6IHdzZnVsdG9uCiAgICAgICAgICAgIEFwcGx5IFNGIHBhdGNoICMzMDc1MTUwIC0gSmF2YSBkaXJlY3RvcnMgdXNpbmcgc3RhdGljIHZhcmlhYmxlcyBpbgogICAgICAgICAgICBuYW1lZCBuYW1lc3BhY2UuCgoyMDEwLTA5LTI0OiB3c2Z1bHRvbgogICAgICAgICAgICBNb3JlIGZpbGUgYW5kIGxpbmUgZXJyb3Ivd2FybmluZyByZXBvcnRpbmcgZml4ZXMgd2hlcmUgU1dJRyBtYWNyb3MKICAgICAgICAgICAgYXJlIHVzZWQgd2l0aGluIHt9IGJyYWNlcyAod2hlcmUgdGhlIHByZXByb2Nlc3NvciBleHBhbmRzIG1hY3JvcyksCiAgICAgICAgICAgIGZvciBleGFtcGxlIG1hY3JvcyB3aXRoaW4gJWlubGluZSB7Li4ufSBhbmQgJWZyYWdtZW50KC4uLikgey4uLn0KICAgICAgICAgICAgYW5kIG5lc3RlZCBzdHJ1Y3RzLgoKMjAxMC0wOS0xODogd3NmdWx0b24KICAgICAgICAgICAgTW9yZSBmaWxlIGFuZCBsaW5lIGVycm9yL3dhcm5pbmcgcmVwb3J0aW5nIGZpeGVzIGZvciB2YXJpb3VzIGluaGVyaXRlZAogICAgICAgICAgICBjbGFzcyBwcm9ibGVtcy4KCjIwMTAtMDktMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIEEgbXVjaCBpbXByb3ZlZCBkZWJ1Z2dpbmcgb2YgU1dJRyBzb3VyY2UgZXhwZXJpZW5jZSBpcyBub3cgYXZhaWxhYmxlIGFuZAogICAgICAgICAgICBkb2N1bWVudGVkIGluIHRoZSAiRGVidWdnaW5nIFNXSUciIHNlY3Rpb24gaW4gdGhlIERvYy9EZXZlbC9pbnRlcm5hbHMuaHRtbAogICAgICAgICAgICBmaWxlLCBpbmNsdWRpbmcgYSBzd2lnLmRiZyBzdXBwb3J0IGZpbGUgZm9yIHRoZSBnZGIgZGVidWdnZXIuCgoyMDEwLTA5LTExOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggaW5jb3JyZWN0IGxpbmUgbnVtYmVyIHJlcG9ydGluZyBpbiBlcnJvcnMvd2FybmluZ3Mgd2hlbiBhIG1hY3JvCiAgICAgICAgICAgIGRlZmluaXRpb24gZW5kcyB3aXRoICcvJyBhbmQgaXQgaXMgbm90IHRoZSBlbmQgb2YgYSBDIGNvbW1lbnQuCgoyMDEwLTA5LTExOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggaW5jb3JyZWN0IGxpbmUgbnVtYmVyIHJlcG9ydGluZyBpbiBlcnJvcnMvd2FybmluZ3MgYWZ0ZXIgcGFyc2luZwogICAgICAgICAgICBtYWNybyBpbnZvY2F0aW9ucyB3aXRoIHBhcmFtZXRlcnMgZ2l2ZW4gb3ZlciBtb3JlIHRoYW4gb25lIGxpbmUuCgoyMDEwLTA5LTEwOiB3c2Z1bHRvbgogICAgICAgICAgICBSZW1vdmUgZXh0cmFuZW91cyBleHRyYSBsaW5lIGluIHByZXByb2Nlc3NlZCBvdXRwdXQgYWZ0ZXIgaW5jbHVkaW5nIGZpbGVzCiAgICAgICAgICAgIHdoaWNoIHdvdWxkIHNvbWV0aW1lcyBsZWFkIHRvIGVycm9yL3dhcm5pbmcgbWVzc2FnZXMgdHdvIGxpbmVzIGFmdGVyIHRoZQogICAgICAgICAgICBlbmQgb2YgdGhlIGZpbGUuCgoyMDEwLTA5LTEwOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzIxNDk1MjMgLSBJbmNvcnJlY3QgbGluZSBudW1iZXIgcmVwb3J0aW5nIGluIGVycm9ycyBhZnRlciBwYXJzaW5nIG1hY3JvcwogICAgICAgICAgICBjb250YWluaW5nIEMrKyBjb21tZW50cy4KCjIwMTAtMDktMDg6IG9sbHkKCSAgICBbUEhQXSBGaXggaGFuZGxpbmcgb2YgT1VUUFVUIHR5cGVtYXBzIChQYXRjaCBmcm9tIFJ5YW4gaW4gU0YjMzA1ODM5NCkuCgoyMDEwLTA5LTAzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZXJyb25lb3VzIGxpbmUgbnVtYmVycyBpbiBlcnJvciBtZXNzYWdlcyBmb3IgbWFjcm8gZXhwYW5zaW9ucywgZm9yIGV4YW1wbGUsCiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlIG5vdyBwb2ludHMgdG8gaW5zdGFudGlhdGlvbiBvZiB0aGUgbWFjcm8sIGllIHRoZSBsYXN0IGxpbmUgaGVyZToKCiAgICAgICAgICAgICAgI2RlZmluZSBNQUNSTzIoYSwgYikgCgogICAgICAgICAgICAgICNkZWZpbmUgTUFDUk8xKE5BTUUpIE1BQ1JPMihOQU1FLDIsMykgCgogICAgICAgICAgICAgIE1BQ1JPMShhYmMpCgoyMDEwLTA5LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggbGluZSBudW1iZXJzIGluIGVycm9yIGFuZCB3YXJuaW5nIG1lc3NhZ2VzIGZvciBwcmVwcm9jZXNzb3IgbWVzc2FnZXMgd2l0aGluCiAgICAgICAgICAgICVpbmxpbmUsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlaW5saW5lICV7CiAgICAgICAgICAgICAgI2RlZmluZSBGT09CQVIgMQogICAgICAgICAgICAgICNkZWZpbmUgRk9PQkFSICJoaSIKICAgICAgICAgICAgICAlfQoKMjAxMC0wOS0wMjogd3NmdWx0b24KICAgICAgICAgICAgRml4IGxpbmUgbnVtYmVycyBpbiBlcnJvciBhbmQgd2FybmluZyBtZXNzYWdlcyB3aGljaCB3ZXJlIGN1bXVsYXRpdmVseSBvbmUKICAgICAgICAgICAgbGVzcyB0aGFuIHRoZXkgc2hvdWxkIGhhdmUgYmVlbiBhZnRlciBwYXJzaW5nIGVhY2ggJWluY2x1ZGUvJWltcG9ydCAtIGJ1ZwogICAgICAgICAgICBpbnRyb2R1Y2VkIGluIHN3aWctMS4zLjMyLiBBbHNvIGZpeCBsaW5lIG51bWJlcnMgaW4gZXJyb3IgYW5kIHdhcm5pbmcgbWVzc2FnZXMKICAgICAgICAgICAgd2hlbiBuZXcgbGluZSBjaGFyYWN0ZXJzIGFwcGVhciBiZXR3ZWVuIHRoZSAlaW5jbHVkZSAvICVpbXBvcnQgc3RhdGVtZW50IGFuZAogICAgICAgICAgICB0aGUgZmlsZW5hbWUuCgoyMDEwLTA4LTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggbGluZSBudW1iZXIgYW5kIGZpbGUgbmFtZSByZXBvcnRpbmcgZm9yIHNvbWUgbWFjcm8gcHJlcHJvY2Vzc29yIHdhcm5pbmdzLgogICAgICAgICAgICBUaGUgbGluZSBudW1iZXIgb2YgdGhlIG1hY3JvIGFyZ3VtZW50IGhhcyBiZWVuIGNvcnJlY3RlZCBhbmQgdGhlIGxpbmUgbnVtYmVyCiAgICAgICAgICAgIG9mIHRoZSBzdGFydCBvZiB0aGUgbWFjcm8gaW5zdGVhZCBvZiBvbmUgcGFzdCB0aGUgZW5kIG9mIHRoZSBtYWNybyBpcyB1c2VkLgogICAgICAgICAgICBTb21lIGV4YW1wbGVzOgogICAgICAgICAgICAgIGZpbGUuaDoxMTogRXJyb3I6IElsbGVnYWwgbWFjcm8gYXJndW1lbnQgbmFtZSAnLi4nCiAgICAgICAgICAgICAgZmlsZS5oOjE5OiBFcnJvcjogTWFjcm8gJ0RVUExJQ0FURScgcmVkZWZpbmVkLAogICAgICAgICAgICAgIGZpbGUuaDoxNTogRXJyb3I6IHByZXZpb3VzIGRlZmluaXRpb24gb2YgJ0RVUExJQ0FURScuCiAgICAgICAgICAgICAgZmlsZS5oOjI1OiBFcnJvcjogVmFyaWFibGUtbGVuZ3RoIG1hY3JvIGFyZ3VtZW50IG11c3QgYmUgbGFzdCBwYXJhbWV0ZXIKICAgICAgICAgICAgICBmaWxlLmg6MzI6IEVycm9yOiBJbGxlZ2FsIGNoYXJhY3RlciBpbiBtYWNybyBhcmd1bWVudCBuYW1lCiAgICAgICAgICAgICAgZmlsZS5pOjM3OiBFcnJvcjogTWFjcm8gJ1NJVCcgZXhwZWN0cyAyIGFyZ3VtZW50cwoKMjAxMC0wOC0yNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IF9fTElORV9fIGFuZCBfX0ZJTEVfXyBleHBhbnNpb24gcmVwb3J0ZWQgYnkgQ2FtaWxsZSBHaWxsb3QuIE1vc3RseSB0aGlzCiAgICAgICAgICAgIGRpZCBub3Qgd29yayBhdCBhbGwuIEFsc28gZml4ZXMgU0YgIzI4MjI4MjIuCgoyMDEwLTA4LTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gRml4IGNvcm5lciBjYXNlIG1hcnNoYWxsaW5nIG9mIGRvdWJsZXMgLSBlcnJubyB3YXMgbm90IGJlaW5nIGNvcnJlY3RseQogICAgICAgICAgICBzZXQgYmVmb3JlIGNhbGxpbmcgc3RydG9kIC0gcGF0Y2ggZnJvbSBKdXN0aW4gVmFsbG9uIC0gU0YgQnVnICMzMDM4OTM2LgoKMjAxMC0wOC0xNzogd3NmdWx0b24KICAgICAgICAgICAgRml4IG1ha2UgZGlzdGNsZWFuIHdoZW4gc29tZSBvZiB0aGUgbW9yZSBvYnNjdXJlIGxhbmd1YWdlcyBhcmUgZGV0ZWN0ZWQgYnkKICAgICAgICAgICAgY29uZmlndXJlIC0gZml4ZXMgZnJvbSBUb3JzdGVuIExhbmRzY2hvZmYuCgoyMDEwLTA3LTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBSZXN0b3JlIGNvbmZpZ3VyaW5nIG91dCBvZiBzb3VyY2UgZm9yIHRoZSB0ZXN0LXN1aXRlIHNpbmNlIGl0IGJyb2tlIGluIDEuMy4zNy4KICAgICAgICAgICAgQXMgcHJldmlvdXNseSwgaWYgcnVubmluZyAnbWFrZSBjaGVjay10ZXN0LXN1aXRlJyBvdXQgb2Ygc291cmNlLCBpdCBuZWVkcyB0byBiZQogICAgICAgICAgICBkb25lIGJ5IGludm9raW5nIGNvbmZpZ3VyZSB3aXRoIGEgcmVsYXRpdmUgcGF0aC4gSW52b2tpbmcgY29uZmlndXJlIHdpdGggYW4KICAgICAgICAgICAgYWJzb2x1dGUgcGF0aCB3aWxsIG5vdCB3b3JrLiBSdW5uaW5nIHRoZSBmdWxsICdtYWtlIGNoZWNrJyBzdGlsbCBuZWVkcyB0byBiZQogICAgICAgICAgICBkb25lIGluIHRoZSBzb3VyY2UgdHJlZS4KCjIwMTAtMDctMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB3cmFwcGluZyBvZiBmdW5jdGlvbiBwb2ludGVycyBhbmQgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzIHdoZW4gdGhlIGZ1bmN0aW9uCiAgICAgICAgICAgIHJldHVybnMgYnkgcmVmZXJlbmNlLgoKMjAxMC0wNy0xMzogdmFkegogICAgICAgICAgICBSZW1vdmVkIHN1cHBvcnQgZm9yIHRoZSBvbGQgZXhwZXJpbWVudGFsICJyeHNwZW5jZXIiIGVuY29kZXIgYW5kCiAgICAgICAgICAgICJbbm90XXJ4c21hdGNoIiBpbiAlcmVuYW1lIChzZWUgdGhlIDAxLzE2LzIwMDYgZW50cnkpLiBUaGUgbmV3IGFuZAogICAgICAgICAgICBvZmZpY2lhbGx5IHN1cHBvcnRlZCAicmVnZXgiIGVuY29kZXIgYW5kICJbbm90XXJlZ2V4bWF0Y2giIGNoZWNrcwogICAgICAgICAgICBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIChzZWUgdGhlIHR3byBwcmV2aW91cyBlbnRyaWVzKS4gUGxlYXNlCiAgICAgICAgICAgIHJlcGxhY2UgIiUocnhzcGVuY2VyOltwYXRdW3N1YnN0XSlzIiB3aXRoICIlKHJlZ2V4Oi9wYXQvc3Vic3QvKXMiCiAgICAgICAgICAgIHdoZW4gdXBncmFkaW5nLiBOb3RpY2UgdGhhdCB5b3Ugd2lsbCBhbHNvIG5lZWQgdG8gcmVwbGFjZSB0aGUgYmFjay0KICAgICAgICAgICAgcmVmZXJlbmNlcyBvZiBmb3JtICJAMSIgd2l0aCB0aGUgbW9yZSBzdGFuZGFyZCAiXFwxIiBhbmQgbWF5IG5lZWQgdG8KICAgICAgICAgICAgYWRqdXN0IHlvdXIgcmVndWxhciBleHByZXNzaW9ucyBzeW50YXggYXMgdGhlIG5ldyByZWdleCBlbmNvZGVyIHVzZXMKICAgICAgICAgICAgUGVybC1jb21wYXRpYmxlIHN5bnRheCBhbmQgbm90IChleHRlbmRlZCkgUE9TSVggc3ludGF4IGFzIHRoZSBvbGQgb25lLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDEwLTA3LTEzOiB2YWR6CiAgICAgICAgICAgIEFkZCAicmVnZXhtYXRjaCIsICJyZWdleHRhcmdldCIgYW5kICJub3RyZWdleG1hdGNoIiB3aGljaCBjYW4gYmUKICAgICAgICAgICAgdXNlZCB0byBhcHBseSAlcmVuYW1lIGRpcmVjdGl2ZXMgdG8gdGhlIGRlY2xhcmF0aW9ucyBtYXRjaGluZyB0aGUKICAgICAgICAgICAgc3BlY2lmaWVkIHJlZ3VsYXIgZXhwcmVzc2lvbiBvbmx5LiBUaGUgZmlyc3QgdHdvIGNhbiBiZSB1c2VkCiAgICAgICAgICAgIGludGVyY2hhbmdlYWJseSwgYm90aCBvZiB0aGUgJXJlbmFtZXMgYmVsb3cgZG8gdGhlIHNhbWUgdGhpbmc6CgogICAgICAgICAgICAgICAgJXJlbmFtZSgiJGlnbm9yZSIsIHJlZ2V4bWF0Y2gkbmFtZT0iT2xkJCIpICIiOwogICAgICAgICAgICAgICAgJXJlbmFtZSgiJGlnbm9yZSIsIHJlZ2V4dGFyZ2V0PTEpICJPbGQkIjsKCiAgICAgICAgICAgIChuYW1lbHkgaWdub3JlIHRoZSBkZWNsYXJhdGlvbnMgaGF2aW5nICJPbGQiIHN1ZmZpeCkuCgogICAgICAgICAgICAibm90cmVnZXhtYXRjaCIgcmVzdHJpY3RzIHRoZSBtYXRjaCB0byBvbmx5IHRoZSBkZWNsYXJhdGlvbnMgd2hpY2gKICAgICAgICAgICAgZG8gbm90IG1hdGNoIHRoZSByZWd1bGFyIGV4cHJlc3Npb24sIGUuZy4gaGVyZSBpcyBob3cgdG8gcmVuYW1lIHRvCiAgICAgICAgICAgIGxvd2VyIGNhc2UgdmVyc2lvbnMgYWxsIGRlY2xhcmF0aW9ucyBleGNlcHQgdGhvc2UgY29uc2lzdGluZyBmcm9tCiAgICAgICAgICAgIGNhcGl0YWwgbGV0dGVycyBvbmx5OgoKICAgICAgICAgICAgICAgICVyZW5hbWUoIiQobG93ZXJjYXNlKXMiLCBub3RyZWdleG1hdGNoJG5hbWU9Il5bQS1aXSskIikgIiI7CgoyMDEwLTA3LTEzOiB2YWR6CiAgICAgICAgICAgIEFkZCB0aGUgbmV3ICJyZWdleCIgZW5jb2RlciB0aGF0IGNhbiBiZSB1c2VkIGluICVyZW5hbWUsIGUuZy4KCiAgICAgICAgICAgICAgICAlcmVuYW1lKCJyZWdleDovKFxcdyspXyguKikvXFwyLyIpICIiOwoKICAgICAgICAgICAgdG8gcmVtb3ZlIGFueSBhbHBoYWJldGljYWwgcHJlZml4IGZyb20gYWxsIGlkZW50aWZpZXJzLiBUaGUgc3ludGF4CiAgICAgICAgICAgIG9mIHRoZSByZWd1bGFyIGV4cHJlc3Npb25zIGlzIFBlcmwtbGlrZSBhbmQgUENSRSBsaWJyYXJ5CiAgICAgICAgICAgIChodHRwOi8vd3d3LnBjcmUub3JnLykgaXMgdXNlZCB0byBpbXBsZW1lbnQgdGhpcyBmZWF0dXJlIGJ1dCBub3RpY2UKICAgICAgICAgICAgdGhhdCBiYWNrc2xhc2hlcyBuZWVkIHRvIGJlIGVzY2FwZWQgYXMgdXN1YWwgaW5zaWRlIEMgc3RyaW5ncy4KCiAgICAgICAgICAgIE9yaWdpbmFsIHBhdGNoIGZyb20gVG9yc3RlbiBMYW5kc2Nob2ZmLgoKMjAxMC0wNy0wODogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMzMDI0ODc1IC0gc2hhcmVkX3B0ciBvZiBjbGFzc2VzIHdpdGggbm9uLXB1YmxpYyBkZXN0cnVjdG9ycy4gVGhpcyBhbHNvIGZpeGVzCiAgICAgICAgICAgIHRoZSAidW5yZWYiIGZlYXR1cmUgd2hlbiB1c2VkIG9uIGNsYXNzZXMgd2l0aCBub24tcHVibGljIGRlc3RydWN0b3JzLgoKMjAxMC0wNi0xNzogaWFubGFuY2V0YXlsb3IKICAgICAgICAgICAgW0dvXSBBZGQgdGhlIEdvIGxhbmd1YWdlIG1vZHVsZS4KCjIwMTAtMDYtMTA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIEZpeCBTV0lHX2x1YV9pc25pbHN0cmluZyBtdWx0aXBseSBkZWZpbmVkIHdoZW4gdXNpbmcgbXVsdGlwbGUKICAgICAgICAgICAgbW9kdWxlcyBhbmQgd3JhcHBpbmcgc3RyaW5ncy4gUGF0Y2ggZnJvbSAnTnVtYmVyIENydW5jaGVyJy4KCjIwMTAtMDYtMTA6IG9sbHkKCSAgICBbUEhQXSBGaXggZGlyZWN0b3JzIHRvIGNvcnJlY3RseSBjYWxsIGEgbWV0aG9kIHdpdGggaGFzIGEKCSAgICBkaWZmZXJlbnQgbmFtZSBpbiBQSFAgdG8gQysrICh3ZSB3ZXJlIGFsd2F5cyB1c2luZyB0aGUgQysrIG5hbWUKCSAgICBpbiB0aGlzIGNhc2UpLgoKMjAxMC0wNi0wMzogd3NmdWx0b24KICAgICAgICAgICAgRml4IHVuY29tcGlsYWJsZSBjb2RlIHdoZW4gJXJlbmFtZSByZXN1bHRzIGluIHR3byBlbnVtIGl0ZW1zCiAgICAgICAgICAgIHdpdGggdGhlIHNhbWUgbmFtZS4gUmVwb3J0ZWQgYnkgVmFkaW0gWmVpdGxpbi4KClZlcnNpb24gMi4wLjAgKDIgSnVuZSAyMDEwKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTAtMDYtMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IFNXSUdfU1REX1ZFQ1RPUl9FTkhBTkNFRCBtYWNybyB1c2VkIGluIHN0ZDo6dmVjdG9yIHRvIHdvcmsgd2l0aAogICAgICAgICAgICB0eXBlcyBjb250YWluaW5nIGNvbW1hcywgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIFNXSUdfU1REX1ZFQ1RPUl9FTkhBTkNFRChzdGQ6OnBhaXI8IGRvdWJsZSwgc3RkOjpzdHJpbmcgPikKCjIwMTAtMDYtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBpbiBzdGRfc2hhcmVkX3B0ci5pIGZvciB3cmFwcGluZyBzdGQ6OnNoYXJlZF9wdHIuIFJlcXVpcmVzIHRoZSAlc2hhcmVkX3B0cgogICAgICAgICAgICBtYWNybyBsaWtlIGluIHRoZSBib29zdF9zaGFyZWRfcHRyLmkgbGlicmFyeS4gc3RkOjp0cjE6OnNoYXJlZF9wdHIgY2FuIGFsc28gYmUKICAgICAgICAgICAgd3JhcHBlZCBpZiB0aGUgZm9sbG93aW5nIG1hY3JvIGlzIGRlZmluZWQ6CgogICAgICAgICAgICAgICNkZWZpbmUgU1dJR19TSEFSRURfUFRSX1NVQk5BTUVTUEFDRSB0cjEKICAgICAgICAgICAgICAlaW5jbHVkZSA8c3RkX3NoYXJlZF9wdHIuaT4KCiAgICAgICAgICAgIHNoYXJlZF9wdHIgaXMgYWxzbyBkb2N1bWVudGVkIGluIExpYnJhcnkuaHRtbCBub3cuCgoyMDEwLTA1LTI3OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgdGhlIGFiaWxpdHkgZm9yICR0eXBlbWFwIHNwZWNpYWwgdmFyaWFibGUgbWFjcm9zIHRvIGNhbGwgb3RoZXIgJHR5cGVtYXAKICAgICAgICAgICAgc3BlY2lhbCB2YXJpYWJsZSBtYWNyb3MsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAldHlwZW1hcChjc3R5cGUpIENDICJDQyIKICAgICAgICAgICAgICAldHlwZW1hcChjc3R5cGUpIEJCICIkdHlwZW1hcChjc3R5cGUsIENDKSIKICAgICAgICAgICAgICAldHlwZW1hcChjc3R5cGUpIEFBICIkdHlwZW1hcChjc3R5cGUsIEJCKSIKICAgICAgICAgICAgICB2b2lkIGhhaChBQSBhYSk7CgogICAgICAgICAgICBUaGlzIGFsc28gZml4ZXMgQyMgc3RkOjp2ZWN0b3IgY29udGFpbmVycyBvZiBzaGFyZWRfcHRyIGFuZCAlc2hhcmVkX3B0ci4KCiAgICAgICAgICAgIEFsc28gYWRkZWQgZGlhZ25vc3RpY3MgZm9yICR0eXBlbWFwIHdpdGggLWRlYnVnLXRtc2VhcmNoLCBmb3IgZXhhbXBsZSwgdGhlCiAgICAgICAgICAgIGFib3ZlIGRpc3BsYXlzIGFkZGl0aW9uYWwgZGlhZ25vc3RpYyBsaW5lcyBzdGFydGluZyAiQ29udGFpbmluZzogIjoKCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjM0OiBTZWFyY2hpbmcgZm9yIGEgc3VpdGFibGUgJ2NzdHlwZScgdHlwZW1hcCBmb3I6IEFBIGFhCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogQUEgYWEKICAgICAgICAgICAgICAgIExvb2tpbmcgZm9yOiBBQQogICAgICAgICAgICAgICAgVXNpbmc6ICV0eXBlbWFwKGNzdHlwZSkgQUEKICAgICAgICAgICAgICAgIENvbnRhaW5pbmc6ICR0eXBlbWFwKGNzdHlwZSwgQkIpCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjMxOiBTZWFyY2hpbmcgZm9yIGEgc3VpdGFibGUgJ2NzdHlwZScgdHlwZW1hcCBmb3I6IEJCCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogQkIKICAgICAgICAgICAgICAgIFVzaW5nOiAldHlwZW1hcChjc3R5cGUpIEJCCiAgICAgICAgICAgICAgICBDb250YWluaW5nOiAkdHlwZW1hcChjc3R5cGUsIENDKQogICAgICAgICAgICAgIGV4YW1wbGUuaToyOTogU2VhcmNoaW5nIGZvciBhIHN1aXRhYmxlICdjc3R5cGUnIHR5cGVtYXAgZm9yOiBDQwogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IENDCiAgICAgICAgICAgICAgICBVc2luZzogJXR5cGVtYXAoY3N0eXBlKSBDQwoKMjAxMC0wNS0yNjogb2xseQoJICAgIEZpeCAlYXR0cmlidXRlMnJlZiBub3QgdG8gcHJvZHVjZSBhIHN5bnRheCBlcnJvciBpZiB0aGUgbGFzdAoJICAgIGFyZ3VtZW50IChBY2Nlc3Nvck1ldGhvZCkgaXMgb21pdHRlZC4gIFBhdGNoIGZyb20gRGF2aWQgUGllcGdyYXMKCSAgICBpbiBTRiMyMjM1NzU2LgoKMjAxMC0wNS0yNjogb2xseQoJICAgIFtQSFBdIFdoZW4gdXNpbmcgJXRocm93cyBvciAlY2F0Y2hlcywgU1dJRy1nZW5lcmF0ZWQgUEhQNSB3cmFwcGVycwoJICAgIG5vdyB0aHJvdyBQSFAgRXhjZXB0aW9uIG9iamVjdHMgaW5zdGVhZCBvZiBnaXZpbmcgYSBQSFAgZXJyb3Igb2YKCSAgICB0eXBlIEVfRVJST1IuCgoJICAgIFRoaXMgY2hhbmdlIHNob3VsZG4ndCBjYXVzZSBpbmNvbXBhdGliaWxpdHkgaXNzdWVzLCBzaW5jZSB5b3UgY2FuJ3QKCSAgICBzZXQgYW4gZXJyb3IgaGFuZGxlciBmb3IgRV9FUlJPUiwgc28gcHJldmlvdXNseSBQSFAgd291bGQganVzdCBleGl0CgkgICAgd2hpY2ggYWxzbyBoYXBwZW5zIGZvciB1bmhhbmRsZWQgZXhjZXB0aW9ucy4gIFRoZSBiZW5lZml0IGlzIHlvdSBjYW4KCSAgICBub3cgY2F0Y2ggdGhlbSBpZiB5b3Ugd2FudCB0by4KCgkgICAgRml4ZXMgU0YjMjU0NTU3OCBhbmQgU0YjMjk1NTUyMi4KCjIwMTAtMDUtMjU6IG9sbHkKCSAgICBbUEhQXSBBZGQgbWlzc2luZyBkaXJlY3RvcmluIHR5cGVtYXAgZm9yIGNvbnN0IHN0ZDo6c3RyaW5nICYuCgkgICAgRml4ZXMgU0YjMzAwNjQwNCByZXBvcnRlZCBieSB0LUxlZ2lhdy4KCjIwMTAtMDUtMjM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4ICMyOTU3Mzc1IC0gU1dJR1N0cmluZ0hlbHBlciBhbmQgU1dJR0V4Y2VwdGlvbkhlbHBlciBub3QgYWx3YXlzIGJlaW5nCiAgICAgICAgICAgIGluaXRpYWxpemVkIGJlZm9yZSB1c2UgaW4gLk5FVCA0IGFzIHRoZSBjbGFzc2VzIHdlcmUgbm90IG1hcmtlZCBiZWZvcmVmaWVsZGluaXQuCiAgICAgICAgICAgIEEgc3RhdGljIGNvbnN0cnVjdG9yIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBpbnRlcm1lZGlhcnkgY2xhc3MgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAlcHJhZ21hKGNzaGFycCkgaW1jbGFzc2NvZGU9JXsKICAgICAgICAgICAgICAgIHN0YXRpYyAkaW1jbGFzc25hbWUoKSB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIElmIHlvdSBoYWQgYWRkZWQgeW91ciBvd24gY3VzdG9tIHN0YXRpYyBjb25zdHJ1Y3RvciB0byB0aGUgaW50ZXJtZWRpYXJ5IGNsYXNzIGluCiAgICAgICAgICAgIHRoZSBzYW1lIHdheSBhcyBhYm92ZSwgeW91IHdpbGwgaGF2ZSB0byBtb2RpZnkgeW91ciBhcHByb2FjaCB0byB1c2Ugc3RhdGljIHZhcmlhYmxlCiAgICAgICAgICAgIGluaXRpYWxpemF0aW9uIG9yIGRlZmluZSBTV0lHX0NTSEFSUF9OT19JTUNMQVNTX1NUQVRJQ19DT05TVFJVQ1RPUiAtIFNlZSBjc2hhcnBoZWFkLnN3Zy4KCgkgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDEwLTA1LTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzI0MDgyMzIuIEltcHJvdmUgc2hhcmVkX3B0ciBhbmQgaW50cnVzaXZlX3B0ciB3cmFwcGVycyBmb3IgY2xhc3NlcyBpbiBhbgogICAgICAgICAgICBpbmhlcml0YW5jZSBoaWVyYXJjaHkuIE5vIHNwZWNpYWwgdHJlYXRtZW50IGlzIG5lZWRlZCBmb3IgZGVyaXZlZCBjbGFzc2VzLgogICAgICAgICAgICBUaGUgcHJveHkgY2xhc3MgYWxzbyBubyBsb25nZXIgbmVlZHMgdG8gYmUgc3BlY2lmaWVkLCBpdCBpcyBhdXRvbWF0aWNhbGx5CiAgICAgICAgICAgIGRlZHVjZWQuIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGFyZSBkZXByZWNhdGVkOgogICAgICAgICAgICAgIFNXSUdfU0hBUkVEX1BUUihQUk9YWUNMQVNTLCBUWVBFKQogICAgICAgICAgICAgIFNXSUdfU0hBUkVEX1BUUl9ERVJJVkVEKFBST1hZQ0xBU1MsIEJBU0VDTEFTU1RZUEUsIFRZUEUpCiAgICAgICAgICAgIGFuZCBoYXZlIGJlZW4gcmVwbGFjZWQgYnkKICAgICAgICAgICAgICAlc2hhcmVkX3B0cihUWVBFKQogICAgICAgICAgICBTaW1pbGFybHkgZm9yIGludHJ1c2l2ZV9wdHIgd3JhcHBlcnMsIHRoZSBmb2xsb3dpbmcgbWFjcm8gaXMgZGVwcmVjYXRlZDoKICAgICAgICAgICAgICBTV0lHX0lOVFJVU0lWRV9QVFIoUFJPWFlDTEFTUywgVFlQRSkKICAgICAgICAgICAgICBTV0lHX0lOVFJVU0lWRV9QVFJfREVSSVZFRChQUk9YWUNMQVNTLCBCQVNFQ0xBU1NUWVBFLCBUWVBFKQogICAgICAgICAgICBhbmQgaGF2ZSBiZWVuIHJlcGxhY2VkIGJ5CiAgICAgICAgICAgICAgJWludHJ1c2l2ZV9wdHIoVFlQRSkKCjIwMTAtMDUtMjE6IG9sbHkKCSAgICBbUEhQXSBTdG9wIGdlbmVyYXRpbmcgYSBib2d1cyBsaW5lIG9mIGNvZGUgaW4gY2VydGFpbiBjb25zdHJ1Y3RvcnMuCgkgICAgVGhpcyB3YXMgbW9zdGx5IGhhcm1sZXNzLCBidXQgY2F1c2VkIGEgUEhQIG5vdGljZSB0byBiZSBpc3N1ZWQsIGlmCgkgICAgZW5hYmxlZCAoU0YjMjk4NTY4NCkuCgoyMDEwLTA1LTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IG1lbWJlciBwb2ludGVycyBvbiA2NCBiaXQgcGxhdGZvcm1zLgoKMjAxMC0wNS0xNDogd3NmdWx0b24KICAgICAgICAgICAgRml4IHdyYXBwaW5nIG9mIEMrKyBlbnVtIGJvb2xlYW4gdmFsdWVzIHJlcG9ydGVkIGJ5IFRvcnN0ZW4gTGFuZHNjaG9mZjoKICAgICAgICAgICAgICB0eXBlZGVmIGVudW0geyBQTEFZID0gdHJ1ZSwgU1RPUCA9IGZhbHNlIH0gcGxheV9zdGF0ZTsKCjIwMTAtMDUtMTQ6IG9sbHkKCSAgICBbUEhQXSBGaXggd3JhcHBpbmcgb2YgZ2xvYmFsIHZhcmlhYmxlcyB3aGljaCB3YXMgcHJvZHVjaW5nCgkgICAgdW5jb21waWxhYmxlIGNvZGUgaW4gc29tZSBjYXNlcy4KCjIwMTAtMDUtMTI6IGRyam9lCgkgICAgW1JdIEFkZCB0d28gbW9yZSBjaGFuZ2VzIGZyb20gV2lsIE5vbGFuLiAgR2V0IGdhcmJhZ2UKCSAgICBjb2xsZWN0aW9uIHRvIHdvcmsuICBJbXBsZW1lbnQgbmV3ZnJlZQoKMjAxMC0wNS0wOTogZHJqb2UKICAgICAgICAgICAgRml4IGJ1ZyByZXBvcnRlZCBieSBXaWwgTm9sYW4gY2hhbmdlIGNyZWF0aW9uIG9mIHN0cmluZyBzbwogICAgICAgICAgICB0aGF0IFIgMi43LjArIGNhbiB1c2UgY2hhciBoYXNoZXMKCjIwMTAtMDUtMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIEFwcGx5IHBhdGNoICMyOTU1MTQ2IGZyb20gU2VyZ2V5IFNhdHNraXkgdG8gZml4IGV4cHJlc3Npb25zIGNvbnRhaW5pbmcgZGl2aWRlIGJ5CiAgICAgICAgICAgIG9wZXJhdG9yIGluIGNvbnN0cnVjdG9yIGluaXRpYWxpemF0aW9uIGxpc3RzLgoKMjAxMC0wNS0wNTogd3NmdWx0b24KICAgICAgICAgICAgW1JdIE1lbW9yeSBsZWFrIGZpeCBoYW5kbGluZyBjb25zdCBzdGQ6OnN0cmluZyAmIGlucHV0cywgcmVwb3J0ZWQgYnkgV2lsbCBOb2xhbi4KCjIwMTAtMDUtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIFR5cGVtYXAgbWF0Y2hpbmcgZW5oYW5jZW1lbnQgZm9yIG5vbi1kZWZhdWx0IHR5cGVtYXBzLiBQcmV2aW91c2x5IGFsbAogICAgICAgICAgICBxdWFsaWZpZXJzIHdlcmUgc3RyaXBwZWQgaW4gb25lIHN0ZXAsIG5vdyB0aGV5IGFyZSBzdHJpcHBlZCBvbmUgYXQgYSB0aW1lCiAgICAgICAgICAgIHN0YXJ0aW5nIHdpdGggdGhlIGxlZnQgbW9zdCBxdWFsaWZpZXIuIEZvciBleGFtcGxlLCBpbnQgY29uc3QqY29uc3QgCiAgICAgICAgICAgIGlzIGZpcnN0IHN0cmlwcGVkIHRvIGludCAqY29uc3QgdGhlbiBpbnQgKi4KCgkgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDEwLTA0LTI1OiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4ICMyOTg1NjU1IC0gYnJva2VuIGNvbnN0cnVjdG9yIHJlbmFtaW5nLgoKMjAxMC0wNC0xNDogd3NmdWx0b24KICAgICAgICAgICAgVHlwZW1hcCBmcmFnbWVudHMgYXJlIG5vdyBvZmZpY2lhbCBhbmQgZG9jdW1lbnRlZCBpbiBUeXBlbWFwcy5odG1sLgoKMjAxMC0wNC0wOTogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEZpeCAjMjA0ODA2NCBhbmQgIzI0MDgwMjAuCiAgICAgICAgICAgIEFwcGx5IFVidW50dSBwYXRjaCB0byBmaXggUnVieSBhbmQgc3RkOjp2ZWN0b3Igd3JhcHBlcnMgd2l0aCAtbWluaGVyaXQuCiAgICAgICAgICAgIGh0dHBzOi8vYnVncy5sYXVuY2hwYWQubmV0L3VidW50dS8rc291cmNlL3N3aWcxLjMvK2J1Zy81MjI4NzQKCjIwMTAtMDQtMDk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtNenNjaGVtZV0gQXBwbHkgVWJ1bnR1IHBhdGNoIHRvIGZpeCBzdGQ6Om1hcCB3cmFwcGVyczoKICAgICAgICAgICAgaHR0cHM6Ly9idWdzLmxhdW5jaHBhZC5uZXQvdWJ1bnR1Lytzb3VyY2Uvc3dpZzEuMy8rYnVnLzIwMzg3NgoKMjAxMC0wNC0wOTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQXBwbHkgcGF0Y2ggIzI5NTIzNzQgLSBmaXggZGlyZWN0b3JzIGFuZCB0aGUgLW5vcnR0aSBvcHRpb24uCgoyMDEwLTA0LTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBGaXggIzI4ODcyNTQgYW5kICMyOTQ2MDMyIC0gU1dJR19MdWFfdHlwZW5hbWUgdXNpbmcgd3Jvbmcgc3RhY2sgaW5kZXguCgoyMDEwLTA0LTAzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggZXhjZXB0aW9ucyBiZWluZyB0aHJvd24gd2l0aCB0aGUgLXRocmVhZHMgb3B0aW9uIGJhc2VkIG9uIHBhdGNoIGZyb20gQXJ0byBWdW9yaS4KICAgICAgICAgICAgRml4ZXMgYnVnICMyODE4NDk5LgoKMjAxMC0wNC0wMzogd3NmdWx0b24KICAgICAgICAgICAgRml4IE1ha2VmaWxlIHRhcmdldHM6IGRpc3RjbGVhbiBhbmQgbWFpbnRhaW5lci1jbGVhbgoKMjAxMC0wNC0wMjogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gRml4IGNoYXIgcG9pbnRlcnMsIHdjaGFyX3QgcG9pbnRlcnMgYW5kIGNoYXIgYXJyYXlzIHNvIHRoYXQgbmlsIGNhbiBiZSBwYXNzZWQgYXMgYQogICAgICAgICAgICB2YWxpZCB2YWx1ZS4gQnVnIHJlcG9ydGVkIGJ5IEdlZGFsaWEgUGFzdGVybmFrLgoKMjAxMC0wNC0wMTogd3NmdWx0b24KICAgICAgICAgICAgTnVtZXJvdXMgc3VidGxlIHR5cGVtYXAgbWF0Y2hpbmcgcnVsZSBmaXhlcyB3aGVuIHVzaW5nIHRoZSBkZWZhdWx0IHR5cGUuIFRoZSB0eXBlbWFwCiAgICAgICAgICAgIG1hdGNoaW5nIHJ1bGVzIGFyZSB0byB0YWtlIGEgdHlwZSBhbmQgZmluZCB0aGUgYmVzdCBkZWZhdWx0IHR5cGVtYXAgKFNXSUdUWVBFLCBTV0lHVFlQRSogZXRjKSwKICAgICAgICAgICAgdGhlbiBsb29rIGZvciB0aGUgbmV4dCBiZXN0IG1hdGNoIGJ5IHJlZHVjaW5nIHRoZSBjaG9zZW4gZGVmYXVsdCB0eXBlLiBUaGUgdHlwZSBkZWR1Y3Rpb24KICAgICAgICAgICAgbm93IGZvbGxvd3MgQysrIGNsYXNzIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gbWF0Y2hpbmcgcnVsZXMuCgogICAgICAgICAgICBCZWxvdyBhcmUgdGhlIHNldCBvZiBjaGFuZ2VzIG1hZGUgc2hvd2luZyB0aGUgZGVmYXVsdCB0eXBlIGRlZHVjdGlvbgogICAgICAgICAgICBhbG9uZyB3aXRoIHRoZSBvbGQgcmVkdWNlZCB0eXBlIGFuZCB0aGUgbmV3IHZlcnNpb24gb2YgdGhlIHJlZHVjZWQgdHlwZToKCiAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSBjb25zdCAmW0FOWV0KICAgICAgICAgICAgICBuZXc6IFNXSUdUWVBFIGNvbnN0ICZbXQogICAgICAgICAgICAgIG9sZDogU1dJR1RZUEUgKCYpW0FOWV0KCiAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSAqY29uc3QgW0FOWV0KICAgICAgICAgICAgICBuZXc6IFNXSUdUWVBFIGNvbnN0IFtBTlldCiAgICAgICAgICAgICAgb2xkOiBTV0lHVFlQRSAqW0FOWV0KCiAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSBjb25zdCAqY29uc3QgW0FOWV0KICAgICAgICAgICAgICBuZXc6IFNXSUdUWVBFICpjb25zdCBbQU5ZXQogICAgICAgICAgICAgIG9sZDogU1dJR1RZUEUgY29uc3QgKltBTlldCgogICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgY29uc3QgKmNvbnN0ICYKICAgICAgICAgICAgICBuZXc6IFNXSUdUWVBFICpjb25zdCAmCiAgICAgICAgICAgICAgb2xkOiBTV0lHVFlQRSBjb25zdCAqJgoKICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFICpjb25zdCAqCiAgICAgICAgICAgICAgbmV3OiBTV0lHVFlQRSBjb25zdCAqCiAgICAgICAgICAgICAgb2xkOiBTV0lHVFlQRSAqKgoKICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFICpjb25zdCAmCiAgICAgICAgICAgICAgbmV3OiBTV0lHVFlQRSBjb25zdCAmCiAgICAgICAgICAgICAgb2xkOiBTV0lHVFlQRSAqJgoKICAgICAgICAgICAgQWRkaXRpb25hbGx5LCBhIGNvbnN0IFNXSUdUWVBFIGxvb2t1cCBpcyB1c2VkIG5vdyBmb3IgYW55IGNvbnN0YW50IHR5cGUuIFNvbWUgZXhhbXBsZXMsIHdoZXJlCiAgICAgICAgICAgIFQgaXMgc29tZSByZWR1Y2VkIHR5cGUsIGVnIGludCwgc3RydWN0IEZvbzoKCiAgICAgICAgICAgICAgICAgICBUIGNvbnN0CiAgICAgICAgICAgICAgbmV3OiBTV0lHVFlQRSBjb25zdAogICAgICAgICAgICAgIG9sZDogU1dJR1RZUEUKCiAgICAgICAgICAgICAgICAgICBUICpjb25zdAogICAgICAgICAgICAgIG5ldzogU1dJR1RZUEUgKmNvbnN0CiAgICAgICAgICAgICAgb2xkOiBTV0lHVFlQRSAqCgogICAgICAgICAgICAgICAgICAgVCBjb25zdFtdCiAgICAgICAgICAgICAgbmV3OiBTV0lHVFlQRSBjb25zdFtdCiAgICAgICAgICAgICAgb2xkOiBTV0lHVFlQRVtdCgogICAgICAgICAgICAgICAgICAgZW51bSBUIGNvbnN0CiAgICAgICAgICAgICAgbmV3OiBlbnVtIFNXSUdUWVBFIGNvbnN0CiAgICAgICAgICAgICAgb2xkOiBlbnVtIFNXSUdUWVBFCgogICAgICAgICAgICAgICAgICAgVCAoKmNvbnN0IClbXQogICAgICAgICAgICAgIG5ldzogU1dJR1RZUEUgKCpjb25zdCApW10KICAgICAgICAgICAgICBvbGQ6IFNXSUdUWVBFICgqKVtdCgogICAgICAgICAgICBSZW1pbmRlcjogdGhlIHR5cGVtYXAgbWF0Y2hpbmcgcnVsZXMgY2FuIG5vdyBiZSBzZWVuIGZvciBhbnkgdHlwZXMgYmVpbmcgd3JhcHBlZCBieSB1c2luZwogICAgICAgICAgICBlaXRoZXIgdGhlIC1kZWJ1Zy10bXNlYXJjaCBvciAtZGVidWctdG11c2VkIG9wdGlvbnMuCgogICAgICAgICAgICBJbiBwcmFjdGljZSB0aGlzIGxlYWRzIHRvIHNvbWUgc3VidGxlIG1hdGNoaW5nIHJ1bGUgY2hhbmdlcyBhbmQgdGhlIG1ham9yaXR5IG9mIHVzZXJzCiAgICAgICAgICAgIHdvbid0IG5vdGljZSBhbnkgY2hhbmdlcywgZXhjZXB0IGluIHRoZSBwcmltZSBhcmVhIG9mIG1vdGl2YXRpb24gZm9yIHRoaXMgY2hhbmdlOiBJbXByb3ZlCiAgICAgICAgICAgIFNUTCBjb250YWluZXJzIG9mIGNvbnN0IHBvaW50ZXJzIGFuZCBwYXNzaW5nIGNvbnN0IHBvaW50ZXJzIGJ5IHJlZmVyZW5jZS4gVGhpcyBpcyBmaXhlZAogICAgICAgICAgICBiZWNhdXNlIG1hbnkgb2YgdGhlIFNUTCBjb250YWluZXJzIHVzZSBhIHR5cGUgJ1QgY29uc3QmJyBhcyBwYXJhbWV0ZXJzIGFuZCB3aGVuIFQgaXMgCiAgICAgICAgICAgIGEgY29uc3QgcG9pbnRlciwgZm9yIGV4YW1wbGUsICdLIGNvbnN0KicsIHRoZW4gdGhlIGZ1bGwgdHlwZSBpcyAnSyBjb25zdCpjb25zdCYnLiBUaGlzCiAgICAgICAgICAgIG1lYW5zIHRoYXQgdGhlICdTV0lHVFlQRSAqY29uc3QmJyB0eXBlbWFwcyBub3cgbWF0Y2ggd2hlbiBUIGlzIGVpdGhlciBhIG5vbi1jb25zdCBvcgogICAgICAgICAgICBjb25zdCBwb2ludGVyLiBGdXJ0aGVybW9yZSwgc29tZSB0YXJnZXQgbGFuZ3VhZ2VzIGluY29ycmVjdGx5IGhhZCAnU1dJR1RZUEUgKiYnIHR5cGVtYXBzCiAgICAgICAgICAgIHdoZW4gdGhlc2Ugc2hvdWxkIGhhdmUgYmVlbiAnU1dJR1RZUEUgKmNvbnN0JicuIFRoZXNlIGhhdmUgYmVlbiBjb3JyZWN0ZWQgKEphdmEsIEMjLCBMdWEsIFBIUCkuCgoJICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxMC0wMy0xMzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFNvbWUgdmVyeSBvbGQgZGVwcmVjYXRlZCBwcmFnbWEgd2FybmluZ3MgYXJlIG5vdyBlcnJvcnMuCgoyMDEwLTAzLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBJbXByb3ZlIGhhbmRsaW5nIG9mIGZpbGUgbmFtZXMgYW5kIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgZG91YmxlL211bHRpcGxlIHBhdGggc2VwYXJhdG9ycy4KCjIwMTAtMDMtMTA6IG11dGFuZGl6IChNaWtlbCBCYW5jcm9mdCkKCSAgICBbYWxsZWdyb2NsXSBVc2UgZnVsbHkgcXVhbGlmaWVkIHN5bWJvbCBuYW1lIG9mIGNsOjppZGVudGl0eSBpbiBlbWl0X2RlZnVuKCkuCgoyMDEwLTAzLTA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gVGhlIGludGVybWVkaWFyeSBKTkkgY2xhc3MgbW9kaWZpZXJzIGFyZSBub3cgcHVibGljIGJ5IGRlZmF1bHQgbWVhbmluZyB0aGVzZQogICAgICAgICAgICBpbnRlcm1lZGlhcnkgbG93IGxldmVsIGZ1bmN0aW9ucyBhcmUgbm93IGFjY2Vzc2libGUgYnkgZGVmYXVsdCBmcm9tIG91dHNpZGUgYW55IHBhY2thZ2UKICAgICAgICAgICAgdXNlZC4gVGhlIHByb3h5IGNsYXNzIHBvaW50ZXIgY29uc3RydWN0b3IgYW5kIGdldENQdHIoKSBtZXRob2RzIGFyZSBhbHNvIG5vdyBwdWJsaWMuCiAgICAgICAgICAgIFRoZXNlIGFyZSBuZWVkZWQgaW4gb3JkZXIgZm9yIHRoZSBuc3BhY2Ugb3B0aW9uIHRvIHdvcmsgd2l0aG91dCBhbnkgb3RoZXIgbW9kcy4KICAgICAgICAgICAgVGhlIHByZXZpb3VzIGRlZmF1bHQgb2YgcHJvdGVjdGVkIGFjY2VzcyBjYW4gYmUgcmVzdG9yZWQgdXNpbmc6CgogICAgICAgICAgICAgIFNXSUdfSkFWQUJPRFlfTUVUSE9EUyhwcm90ZWN0ZWQsIHByb3RlY3RlZCwgU1dJR1RZUEUpCiAgICAgICAgICAgICAgJXByYWdtYShqYXZhKSBqbmljbGFzc2NsYXNzbW9kaWZpZXJzID0gImNsYXNzIgoKMjAxMC0wMy0wNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBZGRlZCB0aGUgbnNwYWNlIGZlYXR1cmUgZm9yIEMjLiBEb2N1bWVudGF0aW9uIGZvciB0aGUgbnNwYWNlIGZlYXR1cmUgaXMgbm93IGF2YWlsYWJsZS4KCjIwMTAtMDMtMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZGVkIHRoZSBuc3BhY2UgZmVhdHVyZS4gVGhpcyBhZGRzIHNvbWUgaW1wcm92ZWQgbmFtZXNwYWNlIHN1cHBvcnQuIEN1cnJlbnRseSBvbmx5IEphdmEKICAgICAgICAgICAgaXMgc3VwcG9ydGVkIGZvciB0YXJnZXQgbGFuZ3VhZ2VzLCB3aGVyZSBDKysgbmFtZXNwYWNlcyBhcmUgYXV0b21hdGljYWxseSB0cmFuc2xhdGVkIGludG8KICAgICAgICAgICAgSmF2YSBwYWNrYWdlcy4gVGhlIGZlYXR1cmUgb25seSBhcHBsaWVzIHRvIGNsYXNzZXMsc3RydWN0LHVuaW9ucyBhbmQgZW51bXMgZGVjbGFyZWQgd2l0aGluCiAgICAgICAgICAgIGEgbmFtZXNwYWNlLiBNZXRob2RzIGFuZCB2YXJpYWJsZXMgZGVjbGFyZWQgaW4gbmFtZXNwYWNlcyBzdGlsbCBlZmZlY3RpdmVseSBoYXZlIHRoZWlyCiAgICAgICAgICAgIG5hbWVzcGFjZXMgZmxhdHRlbmVkLiBFeGFtcGxlIHVzYWdlOgoKICAgICAgICAgICAgICAlZmVhdHVyZShuc3BhY2UpIE91dGVyOjpJbm5lcjE6OkNvbG9yOwogICAgICAgICAgICAgICVmZWF0dXJlKG5zcGFjZSkgT3V0ZXI6OklubmVyMjo6Q29sb3I7CgogICAgICAgICAgICAgIG5hbWVzcGFjZSBPdXRlciB7CiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgSW5uZXIxIHsKICAgICAgICAgICAgICAgICAgc3RydWN0IENvbG9yIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBJbm5lcjIgewogICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ29sb3IgewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEZvciBKYXZhLCB0aGUgLXBhY2thZ2Ugb3B0aW9uIGlzIGFsc28gcmVxdWlyZWQgd2hlbiB1c2luZyB0aGUgbnNwYWNlIGZlYXR1cmUuIFNheQogICAgICAgICAgICB3ZSB1c2UgLXBhY2thZ2UgY29tLm15Y28sIHRoZSB0d28gY2xhc3NlcyBjYW4gdGhlbiBiZSBhY2Nlc3NlZCBhcyBmb2xsb3dzIGZyb20gSmF2YToKCiAgICAgICAgICAgICAgY29tLm15Y28uT3V0ZXIuSW5uZXIxLkNvbG9yIGFuZCBjb20ubXljby5PdXRlci5Jbm5lcjIuQ29sb3IuCgoyMDEwLTAyLTI3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBSZW1vdmUgLWRpcnZ0YWJsZSBmcm9tIHRoZSBvcHRpbWl6YXRpb25zIGluY2x1ZGVkIGJ5IC1PIGFzIGl0IHRoaXMgb3B0aW9uCiAgICAgICAgICAgIGN1cnJlbnRseSBsZWFkcyB0byBtZW1vcnkgbGVha3MgYXMgcmVwb3J0ZWQgYnkgSm9oYW4gQmxha2UuCgoyMDEwLTAyLTI3OiB3c2Z1bHRvbgogICAgICAgICAgICBMaWNlbnNlIGNvZGUgY2hhbmdlczogU1dJRyBTb3VyY2UgaXMgR1BMLXYzIGFuZCBsaWJyYXJ5IGNvZGUgbGljZW5zZSBpcyBub3cgY2xlYXJlcgogICAgICAgICAgICBhbmQgaXMgcHJvdmlkZWQgdW5kZXIgYSB2ZXJ5IHBlcm1pc3NpdmUgbGljZW5zZS4gU2VlIGh0dHA6Ly93d3cuc3dpZy5vcmcvbGVnYWwuaHRtbC4KCjIwMTAtMDItMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBBIGZldyBmaXhlcyBmb3IgY29tcGlsaW5nIHVuZGVyIHJ1YnktMS45LnggaW5jbHVkaW5nIHBhdGNoIGZyb20gJ05pYmJsZScuCgoyMDEwLTAyLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gQXBwbHkgcGF0Y2ggZnJvbSBQYXRyaWNrIEJlbm5ldHQgdG8gZml4IFJBUlJBWV9MRU4gYW5kIFJBUlJBWV9QVFIgdXNhZ2UgZm9yIFJ1YnkgMS45LngKICAgICAgICAgICAgdXNlZCBpbiB2YXJpb3VzIFNUTCB3cmFwcGVycy4KCjIwMTAtMDItMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gRml4IGluY29ycmVjdCBtdWx0aXBseSBkZWZpbmVkIHN5bWJvbCBuYW1lIGVycm9yIHdoZW4gYW4gZW51bSBpdGVtCiAgICAgICAgICAgIGFuZCBjbGFzcyBuYW1lIGhhdmUgdGhlIHNhbWUgbmFtZSwgYXMgcmVwb3J0ZWQgYnkgTmF0aGFuIEtyaWVnZXIuIEV4YW1wbGU6CgogICAgICAgICAgICAgIGNsYXNzIFZlY3RvciB7fTsKICAgICAgICAgICAgICBuYW1lc3BhY2UgVGV4dCB7CiAgICAgICAgICAgICAgICBlbnVtIFByZWZlcmVuY2UgeyBWZWN0b3IgfTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGlzIGFsc28gZml4ZXMgb3RoZXIgaW5jb3JyZWN0IGNvcm5lciBjYXNlIHRhcmdldCBsYW5ndWFnZSBzeW1ib2wgbmFtZSBjbGFzaGVzLgoKMjAxMC0wMi0xMTogd3NmdWx0b24KICAgICAgICAgICAgQWRkIHRoZSAtZGVidWctbHN5bWJvbHMgb3B0aW9uIGZvciBkaXNwbGF5aW5nIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgbGF5ZXIgc3ltYm9scy4KCjIwMTAtMDItMDk6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAtTU0gYW5kIC1NTUQgb3B0aW9ucyBvbiBXaW5kb3dzLiBUaGV5IHdlcmUgbm90IG9taXR0aW5nIGZpbGVzIGluIHRoZSBTV0lHIGxpYnJhcnkgYXMKICAgICAgICAgICAgdGhleSBzaG91bGQgYmUuCgoyMDEwLTAyLTA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzE4MDczMjkgLSBXaGVuIE1ha2VmaWxlIGRlcGVuZGVuY2llcyBhcmUgYmVpbmcgZ2VuZXJhdGVkIHVzaW5nIHRoZSAtTSBmYW1pbHkgb2Ygb3B0aW9ucwogICAgICAgICAgICBvbiBXaW5kb3dzLCB0aGUgZmlsZSBwYXRocyBoYXZlIGJlZW4gY29ycmVjdGVkIHRvIHVzZSBzaW5nbGUgYmFja3NsYXNoZXMgcmF0aGVyIHRoYW4gZG91YmxlCiAgICAgICAgICAgIGJhY2tzbGFzaGVzIGFzIHBhdGggc2VwYXJhdG9ycy4KCjIwMTAtMDItMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMjkxODkwMiAtIGxhbmd1YWdlIHNwZWNpZmljIGZpbGVzIG5vdCBiZWluZyBnZW5lcmF0ZWQgaW4gY29ycmVjdCBkaXJlY3Rvcnkgb24KICAgICAgICAgICAgV2luZG93cyB3aGVuIHVzaW5nIGZvcndhcmQgc2xhc2hlcyBmb3IgLW8sIGZvciBleGFtcGxlOgogICAgICAgICAgICAgIHN3aWcgLXB5dGhvbiAtYysrIC1vIHN1YmRpcmVjdG9yeS90aGVpbnRlcmZhY2Vfd3JhcC5jcHAgc3ViZGlyZWN0b3J5L3RoZWludGVyZmFjZS5pCgoyMDEwLTAyLTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzI4OTQ0MDUgLSBhc3NlcnRpb24gd2hlbiB1c2luZyAteG1sb3V0LgoKMjAxMC0wMS0yODogd3NmdWx0b24KICAgICAgICAgICAgRml4IHR5cGVtYXAgbWF0Y2hpbmcgYnVnIHdoZW4gYSB0ZW1wbGF0ZWQgdHlwZSBoYXMgYSB0eXBlbWFwIGJvdGggc3BlY2lhbGl6ZWQgYW5kIG5vdAogICAgICAgICAgICBzcGVjaWFsaXplZC4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBYWCB7IC4uLiB9OwogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBjb25zdCBYWCAmICIuLi4iCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGNvbnN0IFhYPCBpbnQgPiAmICIuLi4iCgogICAgICAgICAgICByZXN1bHRlZCBpbiB0aGUgMm5kIHR5cGVtYXAgYmVpbmcgYXBwbGllZCBmb3IgYWxsIFQgaW4gWFg8IFQgPi4KCjIwMTAtMDEtMjI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMjkzMzEyOSAtIHR5cGVtYXBzIG5vdCBiZWluZyBmb3VuZCB3aGVuIHRoZSB1bmFyeSBzY29wZSBvcGVyYXRvciAoOjopIGlzIHVzZWQgdG8gZGVub3RlCiAgICAgICAgICAgIGdsb2JhbCBzY29wZSwgdGhlIHR5cGVtYXAgaXMgbm93IHVzZWQgaW4gc2l0dWF0aW9ucyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgIHN0cnVjdCBYIHt9OwogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBjb25zdCBYICYgIi4uLiIKICAgICAgICAgICAgICB2b2lkIG0oY29uc3QgOjpYICYpOwoKICAgICAgICAgICAgYW5kIHRoaXM6CgogICAgICAgICAgICAgIHN0cnVjdCBYIHt9OwogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBjb25zdCA6OlggJiAiLi4uIgogICAgICAgICAgICAgIHZvaWQgbShjb25zdCBYICYpOwoKMjAxMC0wMS0yMDogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNvbWUgdW5hcnkgc2NvcGUgb3BlcmF0b3IgKDo6KSBkZW5vdGluZyBnbG9iYWwgc2NvcGUgcHJvYmxlbXMgaW4gdGhlIHR5cGVzIGdlbmVyYXRlZAogICAgICAgICAgICBpbnRvIHRoZSBDKysgbGF5ZXIuIFByZXZpb3VzbHkgdGhlIHVuYXJ5IHNjb3BlIG9wZXJhdG9yIHdhcyBkcm9wcGVkIGluIHRoZSBnZW5lcmF0ZWQgY29kZQogICAgICAgICAgICBpZiB0aGUgdHlwZSBoYWQgYW55IHNvcnQgb2YgcXVhbGlmaWVyLCBmb3IgZXhhbXBsZSB3aGVuIHVzaW5nIHBvaW50ZXJzLCByZWZlcmVuY2VzLCBsaWtlCiAgICAgICAgICAgIDo6Zm9vKiwgOjpmb28mLCBiYXI8IDo6Zm9vKiA+LgoKMjAxMC0wMS0xMzogb2xseQoJICAgIFtQSFBdIEFkZCBkYXRldGltZSB0byB0aGUgbGlzdCBvZiBQSFAgcHJlZGVmaW5lZCBjbGFzc2VzIChwYXRjaAoJICAgIGZyb20gRGF2aWQgRmxldGNoZXIgaW4gU0YjMjkzMTA0MikuCgoyMDEwLTAxLTExOiB3c2Z1bHRvbgogICAgICAgICAgICBTbGlnaHQgY2hhbmdlIHRvIHdhcm5pbmcsIGVycm9yIGFuZCBkaWFnbm9zdGljIHJlcG9ydGluZy4gVGhlIHdhcm5pbmcgbnVtYmVyIGlzIG5vIAogICAgICAgICAgICBsb25nZXIgc2hvd24gd2l0aGluIGJyYWNrZXRzLiBUaGlzIGlzIHRvIGhlbHAgZGVmYXVsdCBwYXJzaW5nIG9mIHdhcm5pbmcgbWVzc2FnZXMgYnkKICAgICAgICAgICAgb3RoZXIgdG9vbHMsIHZpbSBvbiBVbml4IGluIHBhcnRpY3VsYXIuCgogICAgICAgICAgICBFeGFtcGxlIG9yaWdpbmFsIGRpc3BsYXkgdXNpbmcgLUZzdGFuZGFyZDoKICAgICAgICAgICAgICBleGFtcGxlLmk6MjA6IFdhcm5pbmcoNDAxKTogTm90aGluZyBrbm93biBhYm91dCBiYXNlIGNsYXNzICdCJy4gSWdub3JlZC4KICAgICAgICAgICAgTmV3IGRpc3BsYXk6CiAgICAgICAgICAgICAgZXhhbXBsZS5pOjIwOiBXYXJuaW5nIDQwMTogTm90aGluZyBrbm93biBhYm91dCBiYXNlIGNsYXNzICdCJy4gSWdub3JlZC4KCiAgICAgICAgICAgIEFsc28gc3VidGxlIGZpeCB0byAtRm1pY3Jvc29mdCBmb3JtYXQgYWRkaW5nIGluIG1pc3Npbmcgc3BhY2UuIEV4YW1wbGUgb3JpZ2luYWwgZGlzcGxheToKICAgICAgICAgICAgICBleGFtcGxlLmkoMjApOiBXYXJuaW5nKDQwMSk6IE5vdGhpbmcga25vd24gYWJvdXQgYmFzZSBjbGFzcyAnQmFzZScuIElnbm9yZWQuCiAgICAgICAgICAgIE5ldyBkaXNwbGF5OgogICAgICAgICAgICAgIGV4YW1wbGUuaSgyMCkgOiBXYXJuaW5nIDQwMTogTm90aGluZyBrbm93biBhYm91dCBiYXNlIGNsYXNzICdCYXNlJy4gSWdub3JlZC4KCjIwMTAtMDEtMTA6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBhIGZldyBpbmNvbnNpc3RlbmNpZXMgaW4gcmVwb3J0aW5nIG9mIGZpbGUvbGluZSBudW1iZXJpbmdzIGluY2x1ZGluZyBtb2RpZnlpbmcKICAgICAgICAgICAgdGhlIG92ZXJsb2FkIHdhcm5pbmdzIDUwOSwgNTEyLCA1MTYsIDQ3NCwgNDc1IHRvIG5vdyBiZSB0d28gbGluZSB3YXJuaW5ncy4KCjIwMTAtMDEtMTA6IHdzZnVsdG9uCiAgICAgICAgICAgIE1vZGlmeSAtZGVidWctdGFncyBvdXRwdXQgdG8gdXNlIHN0YW5kYXJkIGZpbGUgbmFtZS9saW5lIHJlcG9ydGluZyBzbyB0aGF0IGVkaXRvcnMKICAgICAgICAgICAgY2FuIGVhc2lseSBuYXZpZ2F0ZSB0byB0aGUgYXBwcm9wcmlhdGUgbGluZXMuCiAgICAgICAgICAgIFdhcyB0eXBpY2FsbHk6CiAgICAgICAgICAgICAgLiB0b3AgLiBpbmNsdWRlIC4gaW5jbHVkZSAoL3Vzci9zaGFyZS9zd2lnL3RlbXAvdHJ1bmsvTGliL3N3aWcuc3dnOjMxMikKICAgICAgICAgICAgICAuIHRvcCAuIGluY2x1ZGUgLiBpbmNsdWRlIC4gaW5jbHVkZSAoL3Vzci9zaGFyZS9zd2lnL3RlbXAvdHJ1bmsvTGliL3N3aWd3YXJuaW5ncy5zd2c6MzkpCiAgICAgICAgICAgIG5vdzoKICAgICAgICAgICAgICAvdXNyL3NoYXJlL3N3aWcvdGVtcC90cnVuay9MaWIvc3dpZy5zd2c6MzEyOiAgLiB0b3AgLiBpbmNsdWRlIC4gaW5jbHVkZQogICAgICAgICAgICAgIC91c3Ivc2hhcmUvc3dpZy90ZW1wL3RydW5rL0xpYi9zd2lnd2FybmluZ3Muc3dnOjM5OiAgLiB0b3AgLiBpbmNsdWRlIC4gaW5jbHVkZSAuIGluY2x1ZGUKCjIwMTAtMDEtMDM6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBtaXNzaW5nIGZpbGUvbGluZSBudW1iZXJzIGZvciB0eXBlbWFwIHdhcm5pbmdzIGFuZCBpbiBvdXRwdXQgZnJvbSB0aGUKICAgICAgICAgICAtZGVidWctdG1zZWFyY2gvLWRlYnVnLXRtdXNlZCBvcHRpb25zLgoKMjAxMC0wMS0wMzogd3NmdWx0b24KICAgICAgICAgICAgQWRkIHR5cGVtYXBzIHVzZWQgZGVidWdnaW5nIG9wdGlvbiAoLWRlYnVnLXRtdXNlZCkuIFdoZW4gdXNlZCBlYWNoIGxpbmUgZGlzcGxheXMKICAgICAgICAgICAgdGhlIHR5cGVtYXAgdXNlZCBmb3IgZWFjaCB0eXBlIGZvciB3aGljaCBjb2RlIGlzIGJlaW5nIGdlbmVyYXRlZCBpbmNsdWRpbmcgdGhlIGZpbGUKICAgICAgICAgICAgYW5kIGxpbmUgbnVtYmVyIHJlbGF0ZWQgdG8gdGhlIHR5cGUuIFRoaXMgaXMgZWZmZWN0aXZlbHkgYSBjb25kZW5zZWQgZm9ybSBvZiB0aGUKICAgICAgICAgICAgLWRlYnVnLXRtc2VhcmNoIG9wdGlvbi4gRG9jdW1lbnRlZCBpbiBUeXBlbWFwcy5odG1sLgoKMjAwOS0xMi0yMzogd3NmdWx0b24KICAgICAgICAgICAgRml4IGZvciAlamF2YWV4Y2VwdGlvbiBhbmQgZGlyZWN0b3JzIHNvIHRoYXQgYWxsIHRoZSBhcHByb3ByaWF0ZSB0aHJvd3MgY2xhdXNlcyAKICAgICAgICAgICAgYXJlIGdlbmVyYXRlZC4gUHJvYmxlbSByZXBvcnRlZCBieSBQZXRlciBHcmVlbndvb2QuCgoyMDA5LTEyLTIwOiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgLWRlYnVnLXRtc2VhcmNoIG9wdGlvbiBmb3IgZGVidWdnaW5nIHRoZSB0eXBlbWFwIHBhdHRlcm4gbWF0Y2hpbmcgcnVsZXMuCiAgICAgICAgICAgIERvY3VtZW50ZWQgaW4gVHlwZW1hcHMuaHRtbC4KCjIwMDktMTItMTI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtPY3RhdmVdIFJlbW92ZSB0aGUgLWFwaSBvcHRpb24gYW5kIHVzZSB0aGUgbmV3IE9DVEFWRV9BUElfVkVSU0lPTl9OVU1CRVIKICAgICAgICAgICAgbWFjcm8gcHJvdmlkZWQgaW4gdGhlIG9jdGF2ZSBoZWFkZXJzIGZvciBkZXRlcm1pbmluZyB0aGUgYXBpIHZlcnNpb24gaW5zdGVhZC4KCjIwMDktMTItMDQ6IG9sbHkKCSAgICBbUnVieV0gSW1wcm92ZSBzdXBwb3J0IGZvciBSdWJ5IDEuOSB1bmRlciBHQ0MuICBBZGRyZXNzZXMgcGFydCBvZgoJICAgIFNGIzI4NTk2MTQuCgoyMDA5LTEyLTA0OiBvbGx5CgkgICAgRml4IGhhbmRsaW5nIG9mIG1vZHVsbyBvcGVyYXRvciAoJSkgaW4gY29uc3RhbnQgZXhwcmVzc2lvbnMKCSAgICAoU0YjMjgxODU2MikuCgoyMDA5LTEyLTA0OiBvbGx5CgkgICAgW1BIUF0gImVtcHR5IiBpcyBhIHJlc2VydmVkIHdvcmQgaW4gUEhQLCBzbyByZW5hbWUgZW1wdHkoKSBtZXRob2QKCSAgICBvbiBTVEwgY2xhc3NlcyB0byAiaXNfZW1wdHkoKSIgKHByZXZpb3VzbHkgdGhpcyB3YXMgYXV0b21hdGljYWxseQoJICAgIHJlbmFtZWQgdG8gImNfZW1wdHkoKSIpLgoJICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAwOS0xMi0wMzogb2xseQoJICAgIFtQSFBdIEFkZCB0eXBlbWFwcyBmb3IgbG9uZyBsb25nIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcsIGFuZCBmb3IKCSAgICBwb2ludGVyIHRvIG1ldGhvZC4KCjIwMDktMTItMDI6IG9sbHkKCSAgICBbUEhQXSBGaXggd2FybmluZyBhbmQgcmVuYW1lIG9mIHJlc2VydmVkIGNsYXNzIG5hbWUgdG8gYmUgY2FzZQoJICAgIGluc2Vuc2l0aXZlLgoKMjAwOS0xMi0wMTogd3NmdWx0b24KICAgICAgICAgICAgUmV2ZXJ0IHN1cHBvcnQgZm9yICVleHRlbmQgYW5kIG1lbWJlcmluIHR5cGVtYXBzIGFkZGVkIGluIHN3aWctMS4zLjM5LiBUaGUKCSAgICBtZW1iZXJpbiB0eXBlbWFwcyBhcmUgaWdub3JlZCBhZ2FpbiBmb3IgbWVtYmVyIHZhcmlhYmxlcyB3aXRoaW4gYSAlZXh0ZW5kIGJsb2NrLgogICAgICAgICAgICBEb2N1bWVudGF0aW9uIGluY29uc2lzdGVuY3kgcmVwb3J0ZWQgYnkgVG9yc3RlbiBMYW5kc2Nob2ZmLgoKMjAwOS0xMS0yOTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBGaXggZ2VuZXJhdGVkIHF1b3Rpbmcgd2hlbiB1c2luZyAlamF2YWNvbnN0KDEpLyVjc2NvbnN0KDEpIGZvciAKICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbWVtYmVyIHZhcmlhYmxlcy4KCiAgICAgICAgICAgICAgJWphdmFjb25zdCgxKSBBOwogICAgICAgICAgICAgICVjc2NvbnN0KDEpIEE7CiAgICAgICAgICAgICAgc3RydWN0IFggewogICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgQSA9ICdBJzsgCiAgICAgICAgICAgICAgfTsKCjIwMDktMTEtMjY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gRml4ICVqYXZhY29uc3QoMSkvJWNzY29uc3QoMSkgZm9yIHN0YXRpYyBjb25zdCBtZW1iZXIgdmFyaWFibGVzIHRvCiAgICAgICAgICAgIHVzZSB0aGUgYWN0dWFsIGNvbnN0YW50IHZhbHVlIGlmIGl0IGlzIHNwZWNpZmllZCwgcmF0aGVyIHRoYW4gdGhlIEMrKyBjb2RlIHRvCiAgICAgICAgICAgIGFjY2VzcyB0aGUgbWVtYmVyLgoKICAgICAgICAgICAgICAlamF2YWNvbnN0KDEpIEVOOwogICAgICAgICAgICAgICVjc2NvbnN0KDEpIEVOOwogICAgICAgICAgICAgIHN0cnVjdCBYIHsKICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgRU4gPSAyOwogICAgICAgICAgICAgIH07CgoyMDA5LTExLTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBDKysgbmVzdGVkIHR5cGVkZWYgY2xhc3NlcyBjYW4gbm93IGJlIGhhbmRsZWQgdG9vLCBmb3IgZXhhbXBsZToKICAgICAgICAgICAgICBzdHJ1Y3QgT3V0ZXIgewogICAgICAgICAgICAgICAgdHlwZWRlZiBGb28geyB9IEZvb1R5cGVkZWYxLCBGb29UeXBlZGVmMjsKICAgICAgICAgICAgICB9OwoKMjAwOS0xMS0xODogd3NmdWx0b24KICAgICAgICAgICAgVGhlIHdyYXBwZXJzIGZvciBDIG5lc3RlZCBzdHJ1Y3RzIGFyZSBub3cgZ2VuZXJhdGVkIGluIHRoZSBzYW1lIG9yZGVyIGFzIGRlY2xhcmVkIAogICAgICAgICAgICBpbiB0aGUgcGFyc2VkIGNvZGUuCgoyMDA5LTExLTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzQ5MTQ3NiAtIG11bHRpcGxlIGRlY2xhcmF0aW9ucyBvZiBuZXN0ZWQgc3RydWN0cywgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgc3RydWN0IE91dGVyIHsKICAgICAgICAgICAgICAgIHN0cnVjdCB7CiAgICAgICAgICAgICAgICAgIGludCB2YWw7CiAgICAgICAgICAgICAgICB9IGlubmVyMSwgaW5uZXIyLCAqaW5uZXIzLCBpbm5lcjRbMV07CiAgICAgICAgICAgICAgfSBvdXRlcjsKCjIwMDktMTEtMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBwYXJzaW5nIG9mIGVudW0gZGVjbGFyYXRpb24gYW5kIGluaXRpYWxpemF0aW9uLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgZW51bSBBQkMgewogICAgICAgICAgICAgICAgYSwKICAgICAgICAgICAgICAgIGIsCiAgICAgICAgICAgICAgICBjCiAgICAgICAgICAgICAgfSBBID0gYSwgKnBDID0gJkMsIGFycmF5WzNdID0ge2EsIGIsIGN9OwoKMjAwOS0xMS0xNzogd3NmdWx0b24KICAgICAgICAgICAgRml4IHBhcnNpbmcgb2Ygc3RydWN0IGRlY2xhcmF0aW9uIGFuZCBpbml0aWFsaXphdGlvbiwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHN0cnVjdCBTIHsKICAgICAgICAgICAgICAgICBpbnQgeDsKICAgICAgICAgICAgICB9IGluc3RhbmNlID0geyAxMCB9OwoKMjAwOS0xMS0xNTogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxOTYwOTc3IC0gU3ludGF4IGVycm9yIHBhcnNpbmcgZGVyaXZlZCBuZXN0ZWQgY2xhc3MgZGVjbGFyYXRpb24gYW5kIG1lbWJlcgogICAgICAgICAgICB2YXJpYWJsZSBpbnN0YW5jZS4KCjIwMDktMTEtMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMjMxMDQ4MyAtIGZ1bmN0aW9uIHBvaW50ZXIgdHlwZWRlZiB3aXRoaW4gZXh0ZXJuICJDIiBibG9jay4KCjIwMDktMTEtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB1c2FnZSBvZiBuZXN0ZWQgdGVtcGxhdGUgY2xhc3NlcyB3aXRoaW4gdGVtcGxhdGVkIGNsYXNzZXMgc28gdGhhdCBjb21waWxhYmxlIGNvZGUgCiAgICAgICAgICAgIGlzIGdlbmVyYXRlZC4KCjIwMDktMTEtMTM6IG9sbHkKCSAgICBbcGhwXSBGaXggcGxhY2Ugd2hlcmUgY2xhc3MgcHJlZml4IChhcyBzcGVjaWZpZWQgd2l0aCAtcHJlZml4KQoJICAgIHdhc24ndCBiZWluZyB1c2VkLiAgUGF0Y2ggZnJvbSBndmVyYnJ1Z2dlbiBpbiBTRiMyODkyNjQ3LgoKMjAwOS0xMS0xMjogd3NmdWx0b24KICAgICAgICAgICAgRml4IHVzYWdlIG9mIG5lc3RlZCB0ZW1wbGF0ZSBjbGFzc2VzIHNvIHRoYXQgY29tcGlsYWJsZSBjb2RlIGlzIGdlbmVyYXRlZCAtIHRoZSBuZXN0ZWQKICAgICAgICAgICAgdGVtcGxhdGUgY2xhc3MgaXMgbm93IHRyZWF0ZWQgbGlrZSBhIG5vcm1hbCBuZXN0ZWQgY2xhc3NlcywgdGhhdCBpcywgYXMgYW4gb3BhcXVlIHR5cGUKICAgICAgICAgICAgdW5sZXNzIHRoZSBuZXN0ZWR3b3JrYXJvdW5kIGZlYXR1cmUgaXMgdXNlZC4KCjIwMDktMTEtMTI6IHdzZnVsdG9uCiAgICAgICAgICAgIFJlcGxhY2UgU1dJR1dBUk5fUEFSU0VfTkVTVEVEX0NMQVNTIHdpdGggU1dJR1dBUk5fUEFSU0VfTkFNRURfTkVTVEVEX0NMQVNTIGFuZAogICAgICAgICAgICBTV0lHV0FSTl9QQVJTRV9VTk5BTUVEX05FU1RFRF9DTEFTUyBmb3IgbmFtZWQgYW5kIHVubmFtZWQgbmVzdGVkIGNsYXNzZXMgcmVzcGVjdGl2ZWx5LgoKICAgICAgICAgICAgTmFtZWQgbmVzdGVkIGNsYXNzIGlnbm9yZWQgd2FybmluZ3MgY2FuIG5vdyBiZSBzdXBwcmVzc2VkIGJ5IG5hbWUgdXNpbmcgJXdhcm5maWx0ZXIsIGVnOgoKICAgICAgICAgICAgICAld2FybmZpbHRlcihTV0lHV0FSTl9QQVJTRV9OQU1FRF9ORVNURURfQ0xBU1MpIE91dGVyOjpJbm5lcjsKCiAgICAgICAgICAgIGJ1dCBjbGVhcmx5IHVubmFtZWQgbmVzdGVkIGNsYXNzZXMgY2Fubm90IGFuZCB0aGUgZ2xvYmFsIHN1cHByZXNzaW9uIGlzIHN0aWxsIHJlcXVpcmVkLCBlZzoKCiAgICAgICAgICAgICAgI3ByYWdtYSBTV0lHIG5vd2Fybj1TV0lHV0FSTl9QQVJTRV9VTk5BTUVEX05FU1RFRF9DTEFTUwoKMjAwOS0xMS0xMTogd3NmdWx0b24KICAgICAgICAgICAgQWRkZWQgdGhlIG5lc3RlZHdvcmthcm91bmQgZmVhdHVyZSBhcyBhIHdheSB0byB1c2UgdGhlIGZ1bGwgZnVuY3Rpb25hbGl0eSBvZiBhIG5lc3RlZCBjbGFzcyAKICAgICAgICAgICAgKEMrKyBtb2RlIG9ubHkpLiBJdCByZW1vdmVzIHRoZSBuZXN0ZWQgY2xhc3MgZnJvbSBTV0lHJ3MgdHlwZSBpbmZvcm1hdGlvbiBzbyBpdCBpcyBhcyBpZiBTV0lHCiAgICAgICAgICAgIGhhZCBuZXZlciBwYXJzZWQgdGhlIG5lc3RlZCBjbGFzcy4gVGhlIGRvY3VtZW50ZWQgbmVzdGVkIGNsYXNzIHdvcmthcm91bmRzIHVzaW5nIGEgZ2xvYmFsCiAgICAgICAgICAgIGZha2UgY2xhc3Mgc3RvcHBlZCB3b3JraW5nIHdoZW4gU1dJRyB0cmVhdGVkIHRoZSBuZXN0ZWQgY2xhc3MgYXMgYW4gb3BhcXVlIHBvaW50ZXIsIGFuZAogICAgICAgICAgICB0aGlzIGZlYXR1cmUgcmV2ZXJ0cyB0aGlzIGJlaGF2aW91ci4gVGhlIGRvY3VtZW50YXRpb24gaGFzIGJlZW4gdXBkYXRlZCB3aXRoIGRldGFpbHMgb2YgaG93CiAgICAgICAgICAgIHRvIHVzZSBhbmQgaW1wbGVtZW50IGl0LCBzZWUgdGhlICJOZXN0ZWQgY2xhc3NlcyIgc2VjdGlvbiBpbiBTV0lHUGx1cy5odG1sLgoKMjAwOS0xMS0xMTogd3NmdWx0b24KICAgICAgICAgICAgVGhlcmUgd2VyZSBhIG51bWJlciBvZiBDKysgY2FzZXMgd2hlcmUgbmVzdGVkIGNsYXNzZXMvc3RydWN0cy91bmlvbnMgd2VyZSBiZWluZyBoYW5kbGVkCiAgICAgICAgICAgIGFzIGlmIEMgY29kZSB3YXMgYmVpbmcgcGFyc2VkIHdoaWNoIHdvdWxkIG9mdGVudGltZXMgbGVhZCB0byB1bmNvbXBpbGFibGUgY29kZSBhcyBhbgogICAgICAgICAgICBhdHRlbXB0IHdhcyBtYWRlIHRvIHdyYXAgdGhlIG5lc3RlZCBzdHJ1Y3RzIGxpa2UgaXQgaXMgZG9jdW1lbnRlZCBmb3IgQyBjb2RlLiBOb3cgYWxsCiAgICAgICAgICAgIG5lc3RlZCBzdHJ1Y3RzL2NsYXNzZXMvdW5pb25zIGFyZSBpZ25vcmVkIGluIEMrKyBtb2RlLCBhcyB3YXMgYWx3YXlzIGRvY3VtZW50ZWQuIEhvd2V2ZXIsCiAgICAgICAgICAgIHRoZXJlIGlzIGFuIGltcHJvdmVtZW50IGFzIHVzYWdlIG9mIG5lc3RlZCBzdHJ1Y3RzL2NsYXNzZXMvdW5pb25zIGlzIG5vdyBhbHdheXMgdHJlYXRlZAogICAgICAgICAgICBhcyBhbiBvcGFxdWUgdHlwZSBieSBkZWZhdWx0LCByZXN1bHRpbmcgaW4gZ2VuZXJhdGVkIGNvZGUgdGhhdCBzaG91bGQgYWx3YXlzIGNvbXBpbGUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMDktMTEtMDk6IGRyam9lCgkgICAgRml4IFIgZm9yIC1mY29tcGFjdCBhbmQgYWRkIHN0ZF9tYXAuaQoKMjAwOS0xMS0wODogd3NmdWx0b24KICAgICAgICAgICAgRml4IGluY29uc2lzdGVuY3kgZm9yIG5lc3RlZCBzdHJ1Y3RzL3VuaW9ucy9jbGFzc2VzLiBVbmNvbXBpbGFibGUgY29kZSB3YXMgYmVpbmcKICAgICAgICAgICAgZ2VuZXJhdGVkIHdoZW4gaW5uZXIgc3RydWN0IGFuZCB1bmlvbiBkZWNsYXJhdGlvbnMgd2VyZSB1c2VkIGFzIHR5cGVzIHdpdGhpbiB0aGUKICAgICAgICAgICAgaW5uZXIgc3RydWN0LiBUaGUgaW5uZXIgc3RydWN0L3VuaW9uIGlzIG5vdyB0cmVhdGVkIGFzIGEgZm9yd2FyZCBkZWNsYXJhdGlvbiBtYWtpbmcgdGhlCiAgICAgICAgICAgIGJlaGF2aW91ciB0aGUgc2FtZSBhcyBhbiBpbm5lciBjbGFzcy4gKEMrKyBjb2RlKSwgZWc6CgogICAgICAgICAgICAgIHN0cnVjdCBPdXRlciB7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgSW5uZXJTdHJ1Y3QgeyBpbnQgeDsgfTsKICAgICAgICAgICAgICAgIElubmVyU3RydWN0KiBnZXRJbm5lclN0cnVjdCgpOwogICAgICAgICAgICAgIH07CgoyMDA5LTExLTA4OiB3c2Z1bHRvbgoJICAgIElnbm9yZWQgbmVzdGVkIGNsYXNzL3N0cnVjdCB3YXJuaW5ncyBub3cgZGlzcGxheSB0aGUgbmFtZSBvZiB0aGUgaWdub3JlZCBjbGFzcy9zdHJ1Y3QuCgoyMDA5LTExLTA3OiB3c2Z1bHRvbgoJICAgIEJ1ZyAjMTUxNDY4MSAtIEZpeCBuZXN0ZWQgdGVtcGxhdGUgY2xhc3NlcyB3aXRoaW4gYSBuYW1lc3BhY2UgZ2VuZXJhdGVkIHVuY29tcGlsYWJsZQogICAgICAgICAgICBjb2RlIGFuZCBpbnRyb2R1Y2VkIHN0cmFuZ2Ugc2lkZSBlZmZlY3RzIHRvIG90aGVyIHdyYXBwZXIgY29kZSBlc3BlY2lhbGx5IGNvZGUKICAgICAgICAgICAgYWZ0ZXIgdGhlIG5lc3RlZCB0ZW1wbGF0ZSBjbGFzcy4gTm90ZSB0aGF0IG5lc3RlZCB0ZW1wbGF0ZSBjbGFzc2VzIGFyZSBzdGlsbCBpZ25vcmVkLgoKMjAwOS0xMS0wNzogd3NmdWx0b24KCSAgICBBZGQgbmV3IGRlYnVnIG9wdGlvbnM6CiAgICAgICAgICAgICAgLWRlYnVnLXN5bXRhYnMgICAgLSBEaXNwbGF5IHN5bWJvbCB0YWJsZXMgaW5mb3JtYXRpb24KICAgICAgICAgICAgICAtZGVidWctc3ltYm9scyAgICAtIERpc3BsYXkgdGFyZ2V0IGxhbmd1YWdlIHN5bWJvbHMgaW4gdGhlIHN5bWJvbCB0YWJsZXMKICAgICAgICAgICAgICAtZGVidWctY3N5bWJvbHMgICAtIERpc3BsYXkgQyBzeW1ib2xzIGluIHRoZSBzeW1ib2wgdGFibGVzCgoyMDA5LTExLTAzOiB3c2Z1bHRvbgoJICAgIEZpeCBzb21lIHVzYWdlIG9mIHVuYXJ5IHNjb3BlIG9wZXJhdG9yICg6OikgZGVub3RpbmcgZ2xvYmFsIHNjb3BlLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgbmFtZXNwYWNlIEFBIHsgLyogLi4uICovIH0KICAgICAgICAgICAgICB1c2luZyBuYW1lc3BhY2UgOjpBQTsKCiAgICAgICAgICAgIGFuZCBidWcgIzE4MTY4MDIgLSBTd2lnVmFsdWVXcmFwcGVyIHNob3VsZCBiZSB1c2VkOgoKICAgICAgICAgICAgICBzdHJ1Y3QgQ0MgewogICAgICAgICAgICAgICAgQ0MoaW50KTsgLy8gbm8gZGVmYXVsdCBjb25zdHJ1Y3RvcgogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgOjpDQyB4KCk7CgogICAgICAgICAgICBhbmQgaW4gdGVtcGxhdGUgcGFyYW1ldGVyIHNwZWNpYWxpemF0aW9uczoKCiAgICAgICAgICAgICAgc3RydWN0IFMge307CiAgICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBYIHsgdm9pZCBhKCkge30gfTsKICAgICAgICAgICAgICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgWDxTPiB7IHZvaWQgYigpIHt9IH07CiAgICAgICAgICAgICAgJXRlbXBsYXRlKE15VENvbmNyZXRlKSBYPCA6OlMgPjsKCiAgICAgICAgICAgIHBsdXMgcHJvYmFibHkgc29tZSBvdGhlciBjb3JuZXIgY2FzZSB1c2FnZSBvZiA6Oi4KCjIwMDktMTEtMDI6IG9sbHkKCSAgICBbUHl0aG9uXSBGaXggcG90ZW50aWFsIG1lbW9yeSBsZWFrIGluIGluaXRpYWxpc2F0aW9uIGNvZGUgZm9yIHRoZQoJICAgIGdlbmVyYXRlZCBtb2R1bGUuCgoyMDA5LTEwLTIzOiB3c2Z1bHRvbgoJICAgIEZpeCBzZWcgZmF1bHQgd2hlbiB1c2luZyBhIG5hbWVkIG5lc3RlZCB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIHVzaW5nICV0ZW1wbGF0ZShuYW1lKSAKICAgICAgICAgICAgd2l0aGluIGEgY2xhc3MuIEEgd2FybmluZyB0aGF0IHRoZXNlIGFyZSBub3Qgc3VwcG9ydGVkIGlzIG5vdyBpc3N1ZWQgcGx1cyBwcm9jZXNzaW5nIAogICAgICAgICAgICBjb250aW51ZXMgYXMgaWYgbm8gbmFtZSB3YXMgZ2l2ZW4uCgoyMDA5LTEwLTIwOiB3c2Z1bHRvbgoJICAgIFtQeXRob25dIEZpeCBzdGQ6OnZlY3Rvcjxjb25zdCBUKj4uIFRoaXMgd291bGQgcHJldmlvdXNseSBjb21waWxlLCBidXQgbm90IHJ1biBjb3JyZWN0bHkuCgoyMDA5LTEwLTIwOiB3c2Z1bHRvbgoJICAgIEZpeGVkIHByZXZpb3VzbHkgZmFpcmx5IHBvb3IgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBhbmQgZXhwbGljaXQgCiAgICAgICAgICAgIHNwZWNpYWxpemF0aW9uIHN1cHBvcnQuIE51bWVyb3VzIGJ1Z3MgaW4gdGhpcyBhcmVhIGhhdmUgYmVlbiBmaXhlZCBpbmNsdWRpbmc6CgogICAgICAgICAgICAtIFRlbXBsYXRlIGFyZ3VtZW50IGRlZHVjdGlvbiBpbXBsZW1lbnRlZCBmb3IgdGVtcGxhdGUgdHlwZSBhcmd1bWVudHMsIGVnIHRoaXMgbm93CiAgICAgICAgICAgICAgd29ya3M6CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBYICAgICAge307CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBYPFQgKj4ge307CiAgICAgICAgICAgICAgICAldGVtcGxhdGUoWDEpIFg8Y29uc3QgaW50ICo+OyAvLyBDaG9vc2VzIFQgKiBzcGVjaWFsaXphdGlvbgoKICAgICAgICAgICAgICBhbmQgbW9yZSBjb21wbGV4IGNhc2VzIHdpdGggbXVsdGlwbGUgcGFyYW1ldGVycyBhbmQgYSBtaXggb2YgdGVtcGxhdGUgYXJndW1lbnQKICAgICAgICAgICAgICBkZWR1Y3Rpb24gYW5kIGV4cGxpY2l0bHkgc3BlY2lhbGlzZWQgcGFyYW1ldGVycywgZWc6CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPiBzdHJ1Y3QgVHdvUGFybSAgICAgICAgICAgICAgIHsgdm9pZCBhKCkge30gfTsKICAgICAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMT4gICAgICAgICAgICAgIHN0cnVjdCBUd29QYXJtPFQxICosIGludCAqPiAgeyB2b2lkIGUoKSB7fSB9OwogICAgICAgICAgICAgICAgJXRlbXBsYXRlKEUpIFR3b1Bhcm08aW50ICoqLCBpbnQgKj47CgogICAgICAgICAgICBOb3RlIHRoYXQgdGhlIHByaW1hcnkgdGVtcGxhdGUgbXVzdCBub3cgYmUgaW4gc2NvcGUsIGxpa2UgaW4gQysrLCB3aGVuCiAgICAgICAgICAgIGFuIGV4cGxpY2l0IG9yIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gaXMgaW5zdGFudGlhdGVkIHdpdGggJXRlbXBsYXRlLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDA5LTA5LTE0OiB3c2Z1bHRvbgoJICAgIFtDI10gQWRkICVjc2F0dHJpYnV0ZXMgZm9yIGFkZGluZyBDIyBhdHRyaWJ1dGVzIHRvIGVudW0gdmFsdWVzLCBzZWUgZG9jcyBmb3IgZXhhbXBsZS4KCjIwMDktMDktMTE6IHdzZnVsdG9uCgkgICAgRml4IG1lbW1vdmUgcmVncmVzc2lvbiBpbiBjZGF0YS5pIGFzIHJlcG9ydGVkIGJ5IEFkcmlhYW4gUmVudGluZy4KCjIwMDktMDktMDc6IHdzZnVsdG9uCgkgICAgRml4IGNvbnN0YW50IGV4cHJlc3Npb25zIGNvbnRhaW5pbmcgPD0gb3IgPj0uCgoyMDA5LTA5LTAyOiB3c2Z1bHRvbgoJICAgIFRoZSBmb2xsb3dpbmcgb3BlcmF0b3JzIGluIGNvbnN0YW50IGV4cHJlc3Npb25zIG5vdyByZXN1bHQgaW4gdHlwZSBib29sIGZvciBDKysgCiAgICAgICAgICAgIHdyYXBwZXJzIGFuZCByZW1haW4gYXMgdHlwZSBpbnQgZm9yIEMgd3JhcHBlcnMsIGFzIHBlciBlYWNoIHN0YW5kYXJkOiAKCiAgICAgICAgICAgICAgJiYgfHwgPT0gIT0gPCA+IDw9ID49IChBY3R1YWxseSB0aGUgbGFzdCA0IGFyZSBzdGlsbCBicm9rZW4pLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgI2RlZmluZSBBIDEwCiAgICAgICAgICAgICAgI2RlZmluZSBCIDEwCiAgICAgICAgICAgICAgI2RlZmluZSBBX0VRX0IgIEEgPT0gQiAvLyBub3cgd3JhcHBlZCBhcyB0eXBlIGJvb2wgZm9yIEMrKwogICAgICAgICAgICAgICNkZWZpbmUgQV9BTkRfQiBBICYmIEIgLy8gbm93IHdyYXBwZWQgYXMgdHlwZSBib29sIGZvciBDKysKCjIwMDktMDktMDI6IHdzZnVsdG9uCgkgICAgRml4ICMyODQ1NzQ2LiB0cnVlIGFuZCBmYWxzZSBhcmUgbm93IHJlY29nbmlzZWQga2V5d29yZHMgKG9ubHkgd2hlbiB3cmFwcGluZyBDKyspLgogICAgICAgICAgICBDb25zdGFudHMgc3VjaCBhcyB0aGUgZm9sbG93aW5nIGFyZSBub3cgd3JhcHBlZCAoYXMgdHlwZSBib29sKToKICAgICAgICAgICAgICAjZGVmaW5lIEZPTyB0cnVlCiAgICAgICAgICAgICAgI2RlZmluZSBCQVIgRk9PICYmIGZhbHNlCgpWZXJzaW9uIDEuMy40MCAoMTggQXVndXN0IDIwMDkpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMDktMDgtMTc6IG9sbHkKCSAgICBbUGVybF0gQWRkICIjdW5kZWYgZG9fZXhlYyIgdG8gb3VyIGNsZWFuIHVwIG9mIFBlcmwgZ2xvYmFsCgkgICAgbmFtZXNwYWNlIHBvbGx1dGlvbi4KCjIwMDktMDgtMTc6IG9sbHkKCSAgICBbUEhQXSBGaXggdG8gd3JhcCBhIHJlc291cmNlIHJldHVybmVkIGJ5IF9fZ2V0KCkgaW4gYSBQSFAgb2JqZWN0IChTRiMyNTQ5MjE3KS4KCjIwMDktMDgtMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMjc5NzQ4NSBBZnRlciBkb2luZyBhICdtYWtlIGNsZWFuJywgaW5zdGFsbCBmYWlscyBpZiB5b2RsMm1hbiBvciB5b2RsMmh0bWwgCiAgICAgICAgICAgIGlzIG5vdCBhdmFpbGFibGUuCgoyMDA5LTA4LTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBbT2N0YXZlXSBDYXVnaHQgZXhjZXB0aW9ucyBkaXNwbGF5IHRoZSB0eXBlIG9mIHRoZSBDKysgZXhjZXB0aW9uIGluc3RlYWQgb2YgdGhlCiAgICAgICAgICAgIGdlbmVyaWMgImMrKy1zaWRlIHRocmV3IGFuIGV4Y2VwdGlvbiIgbWVzc2FnZS4KCjIwMDktMDgtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBXaGVuICVjYXRjaGVzIGlzIHVzZWQsIGZpeCBzbyB0aGF0IGFueSBjbGFzc2VzIHNwZWNpZmllZCBpbiB0aGUgInRocm93cyIKICAgICAgICAgICAgYXR0cmlidXRlIG9mIHRoZSAidGhyb3dzIiB0eXBlbWFwIGFyZSBnZW5lcmF0ZWQgaW50byB0aGUgSmF2YSBtZXRob2QncyB0aHJvd3MgY2xhdXNlLgoKMjAwOS0wOC0xNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggZXhjZXB0aW9uIGhhbmRsaW5nIHdoZW4gJWNhdGNoZXMgaXMgdXNlZCwgcmVwb3J0ZWQgYnkgSnVhbiBNYW51ZWwgQWx2YXJlei4KCjIwMDktMDgtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAldGVtcGxhdGUgc2VnIGZhdWx0IG9uIHNvbWUgY2FzZXMgb2Ygb3ZlcmxvYWRpbmcgdGhlIHRlbXBsYXRlZCBtZXRob2QuCiAgICAgICAgICAgIEJ1ZyByZXBvcnRlZCBieSBKYW4gS3VwZWMuCgoyMDA5LTA4LTE1OiB3c2Z1bHRvbgoJICAgIFtSdWJ5XSBBZGQgbnVtZXJvdXMgbWlzc2luZyB3cmFwcGVkIG1ldGhvZHMgZm9yIHN0ZDo6dmVjdG9yPGJvb2w+IHNwZWNpYWxpemF0aW9uCiAgICAgICAgICAgIGFzIHJlcG9ydGVkIGJ5IFlvdXNzZWYgSm9uZXMuCgoyMDA5LTA4LTE0OiB3c2Z1bHRvbgoJICAgIFtQZXJsXSBBZGQgU1dJR19Db252ZXJ0UHRyQW5kT3duKCkgbWV0aG9kIGludG8gdGhlIHJ1bnRpbWUgZm9yIHNtYXJ0IHBvaW50ZXIgCiAgICAgICAgICAgIG1lbW9yeSBvd25lcnNoaXAgY29udHJvbC4gc2hhcmVkX3B0ciBzdXBwb3J0IHN0aWxsIHRvIGJlIGFkZGVkLiBQYXRjaCBmcm9tIAogICAgICAgICAgICBEYXZpZCBGbGV0Y2hlci4KCjIwMDktMDgtMTQ6IG9sbHkKCSAgICBbUEhQXSBQSFA1IG5vdyB3cmFwcyBzdGF0aWMgbWVtYmVyIHZhcmlhYmxlcyBhcyBkb2N1bWVudGVkLgoKMjAwOS0wOC0xNDogb2xseQoJICAgIFtQSFBdIFVwZGF0ZSB0aGUgUEhQICJjbGFzcyIgZXhhbXBsZSB0byB3b3JrIHdpdGggUEhQNSBhbmQgdXNlCgkgICAgbW9kZXJuIHdyYXBwaW5nIGZlYXR1cmVzLgoKMjAwOS0wOC0xMzogd3NmdWx0b24KCSAgICBbUEhQXSBzdGQ6OnZlY3RvciB3cmFwcGVycyBvdmVyaGF1bC4gVGhleSBubyBsb25nZXIgcmVxdWlyZSB0aGUgCiAgICAgICAgICAgIHNwZWNpYWxpemVfc3RkX3ZlY3RvcigpIG1hY3JvLiBBZGRlZCB3cmFwcGVycyBmb3IgY2FwYWNpdHkoKSBhbmQgcmVzZXJ2ZSgpLgoKMjAwOS0wOC0xMzogd3NmdWx0b24KCSAgICBbUEhQXSBBZGQgY29uc3QgcmVmZXJlbmNlIHR5cGVtYXBzLiBjb25zdCByZWZlcmVuY2UgcHJpbWl0aXZlIHR5cGVzIGFyZQogICAgICAgICAgICBub3cgcGFzc2VkIGJ5IHZhbHVlIHJhdGhlciB0aGFuIHBvaW50ZXIgbGlrZSB0aGUgb3RoZXIgdGFyZ2V0IGxhbmd1YWdlcy4KCSAgICBGaXhlcyBTRiMyNTI0MDI5LgoKMjAwOS0wOC0wODogd3NmdWx0b24KCSAgICBbUHl0aG9uXSBNb3JlIHVzZXIgZnJpZW5kbHkgQXR0cmlidXRlRXJyb3IgaXMgcmFpc2VkIHdoZW4gdGhlcmUgYXJlCiAgICAgICAgICAgIG5vIGNvbnN0cnVjdG9ycyBnZW5lcmF0ZWQgZm9yIHRoZSBwcm94eSBjbGFzcyBpbiB0aGUgZXZlbnQgdGhhdCB0aGUKICAgICAgICAgICAgY2xhc3MgaXMgYWJzdHJhY3QgLSB0aGUgZXJyb3IgbWVzc2FnZSBpcyBub3cgCiAgICAgICAgICAgICJObyBjb25zdHJ1Y3RvciBkZWZpbmVkIC0gY2xhc3MgaXMgYWJzdHJhY3QiIHdoZXJlYXMgaWYgdGhlcmUgYXJlIG5vCiAgICAgICAgICAgIHB1YmxpYyBjb25zdHJ1Y3RvcnMgZm9yIGFueSBvdGhlciByZWFzb24gYW5kIHRoZSBjbGFzcyBpcyBub3QgYWJzdHJhY3QsCiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHJlbWFpbnMKICAgICAgICAgICAgIk5vIGNvbnN0cnVjdG9yIGRlZmluZWQiLgogICAgICAgICAgICBbdGNsXSBTaW1pbGFybHkgZm9yIHRjbCB3aGVuIHVzaW5nIC1pdGNsLgoKMjAwOS0wOC0wNDogb2xseQoJICAgIFtQSFBdIEZpeCBnZW5lcmF0ZWQgY29kZSB0byB3b3JrIHdpdGggUEhQIDUuMy4KCjIwMDktMDgtMDQ6IHZtaWtsb3MKICAgICAgICAgICAgW1BIUF0gVmFyaW91cyBtYXRoZW1hdGljYWwgZnVuY3Rpb25zICh3aGljaCB3b3VsZCBjb25mbGljdAogICAgICAgICAgICB3aXRoIHRoZSBidWlsdC1pbiBQSFAgb25lcykgYXJlIG5vdyBhdXRvbWF0aWNhbGx5IGhhbmRsZWQgYnkKICAgICAgICAgICAgYWRkaW5nIGEgJ2NfJyBwcmVmaXguCgoyMDA5LTA4LTAzOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFRoZSBzdGQ6OnZlY3RvcjxUPiBpbXBsZW1lbnRhdGlvbiBpcyBpbXByb3ZlZCBhbmQgbm93IHVzZXMgJHR5cGVtYXAgc3VjaAogICAgICAgICAgICB0aGF0IHRoZSBwcm94eSBjbGFzcyBmb3IgVCBubyBsb25nZXIgaGFzIHRvIGJlIHNwZWNpZmllZCBpbiBzb21lIG1hY3JvcwogICAgICAgICAgICBmb3IgY29ycmVjdCBDIyBjb21waWxhdGlvbjsgdGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIGRlcHJlY2F0ZWQsIHdoZXJlCiAgICAgICAgICAgIENTVFlQRSB3YXMgdGhlIEMjIHR5cGUgZm9yIHRoZSBDKysgY2xhc3MgQ1RZUEU6CgogICAgICAgICAgICBTV0lHX1NURF9WRUNUT1JfU1BFQ0lBTElaRV9NSU5JTVVNKENTVFlQRSwgQ1RZUEUpCiAgICAgICAgICAgICAgdXNhZ2Ugc2hvdWxkIGJlIHJlbW92ZWQgYWx0b2dldGhlcgoKICAgICAgICAgICAgU1dJR19TVERfVkVDVE9SX1NQRUNJQUxJWkUoQ1NUWVBFLCBDVFlQRSkKICAgICAgICAgICAgICBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aDoKICAgICAgICAgICAgU1dJR19TVERfVkVDVE9SX0VOSEFOQ0VEKENUWVBFKQoKICAgICAgICAgICAgU29tZSBtb3JlIGRldGFpbHMgaW4gY3NoYXJwL3N0ZF92ZWN0b3IuaQoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDA5LTA3LTMxOiBvbGx5CgkgICAgW1B5dGhvbl0gRml4IGluZGVudGF0aW9uIHNvIHRoYXQgd2UgZ2l2ZSBhIHVzZWZ1bCBlcnJvciBpZiB0aGUKCSAgICBtb2R1bGUgY2FuJ3QgYmUgbG9hZGVkLiAgUGF0Y2ggZnJvbSBHYWV0YW4gTGVobWFubiBpbiBTRiMyODI5ODUzLgoKMjAwOS0wNy0yOTogd3NmdWx0b24KICAgICAgICAgICAgQWRkICR0eXBlbWFwKG1ldGhvZCwgdHlwZWxpc3QpIHNwZWNpYWwgdmFyaWFibGUgbWFjcm8uIFRoaXMgYWxsb3dzCiAgICAgICAgICAgIHRoZSBjb250ZW50cyBvZiBhIHR5cGVtYXAgdG8gYmUgaW5zZXJ0ZWQgd2l0aGluIGFub3RoZXIgdHlwZW1hcC4KICAgICAgICAgICAgRnVsbHkgZG9jdW1lbnRlZCBpbiBUeXBlbWFwcy5odG1sLgoKMjAwOS0wNy0yOTogdm1pa2xvcwogICAgICAgICAgICBbUEhQXSBTdGF0aWMgbWVtYmVyIHZhcmlhYmxlcyBhcmUgbm93IHByZWZpeGVkIHdpdGggdGhlCiAgICAgICAgICAgIGNsYXNzIG5hbWUuIFRoaXMgYWxsb3dzIHN0YXRpYyBtZW1iZXIgdmFyaWFibGVzIHdpdGggdGhlCiAgICAgICAgICAgIHNhbWUgbmFtZSBpbiBkaWZmZXJlbnQgY2xhc3Nlcy4KCjIwMDktMDctMjk6IG9sbHkKCSAgICBbUHl0aG9uXSBBZGQgbWlzc2luZyBsb2NrcyB0byBzdGQ6Om1hcCB3cmFwcGVycy4gIFBhdGNoIGZyb20gCgkgICAgUGF1bCBIYW1wc29uIGluIFNGIzI4MTM4MzYuCgoyMDA5LTA3LTI5OiBvbGx5CgkgICAgW1BIUF0gRml4IG1lbW9yeSBsZWFrIGluIFBIUCBPVVRQVVQgdHlwZW1hcHMuICBSZXBvcnRlZCBieSBIaXRvc2hpCgkgICAgQW1hbm8gaW4gU0YjMjgyNjMyMi4KCjIwMDktMDctMjk6IG9sbHkKCSAgICBbUEhQXSBGaXggbWVtb3J5IGxlYWsgaW4gUEhQIHJlc291cmNlIGRlc3RydWN0b3IgZm9yIGNsYXNzZXMKCSAgICB3aXRob3V0IGEgZGVzdHJ1Y3RvciBhbmQgbm9uLWNsYXNzIHR5cGVzLiAgUGF0Y2ggZnJvbSBIaXRvc2hpIEFtYW5vCgkgICAgaW4gU0YjMjgyNTMwMy4KCjIwMDktMDctMjg6IG9sbHkKCSAgICBbUEhQXSBVcGRhdGUgd2FybmluZ3MgYWJvdXQgY2xhc2hlcyBiZXR3ZWVuIGlkZW50aWZpZXJzIGFuZCBQSFAKCSAgICBrZXl3b3JkcyBhbmQgYXV0b21hdGljIHJlbmFtaW5nIHRvIHdvcmsgd2l0aCB0aGUgUEhQNSBjbGFzcwoJICAgIHdyYXBwZXJzLiAgRml4ZXMgU0YjMTYxMzY3OS4KCjIwMDktMDctMjg6IHZtaWtsb3MKICAgICAgICAgICAgW1BIUF0gSWYgYSBtZW1iZXIgZnVuY3Rpb24gaXMgbm90IHB1YmxpYyBidXQgaXQgaGFzIGEgYmFzZQogICAgICAgICAgICB3aGljaCBpcyBwdWJsaWMsIHRoZW4gbm93IGEgd2FybmluZyBpcyBpc3N1ZWQgYW5kIHRoZSBtZW1iZXIKICAgICAgICAgICAgZnVuY3Rpb24gd2lsbCBiZSBwdWJsaWMsIGFzIFBIUCByZXF1aXJlcyB0aGlzLgoKMjAwOS0wNy0yMTogdm1pa2xvcwogICAgICAgICAgICBbUEhQXSBEaXJlY3RvciBzdXBwb3J0IGFkZGVkLgoKMjAwOS0wNy0xNTogb2xseQoJICAgIFtQZXJsXSBEb24ndCBzcGVjaWZ5IFBlcmwgcHJvdG90eXBlICIoKSIgZm9yIGEgY29uc3RydWN0b3Igd2l0aCBhCgkgICAgZGlmZmVyZW50IG5hbWUgdG8gdGhlIGNsYXNzLCBhcyBzdWNoIGNvbnN0cnVjdG9ycyBjYW4gc3RpbGwgdGFrZQoJICAgIHBhcmFtZXRlcnMuCgoyMDA5LTA3LTEyOiB4YXZpZXI5OAoJICAgIFtPY3RhdmVdIEFkZCBzdXBwb3J0IGZvciBPY3RhdmUgMy4yIEFQSQoKMjAwOS0wNy0wNTogb2xseQoJICAgIFtQSFBdIFVwZGF0ZSB0aGUgbGlzdCBvZiBQSFAga2V5d29yZHMgLSAiY2Z1bmN0aW9uIiBpcyBubyBsb25nZXIgYQoJICAgIGtleXdvcmQgaW4gUEhQNSBhbmQgUEhQIDUuMyBhZGRlZCAiZ290byIsICJuYW1lc3BhY2UiLCAiX19ESVJfXyIsCgkgICAgYW5kICJfX05BTUVTUEFDRV9fIi4KCjIwMDktMDctMDM6IG9sbHkKCSAgICBbVGNsXSBUbyBjb21wbGVtZW50IFVTRV9UQ0xfU1RVQlMsIGFkZCBzdXBwb3J0IGZvciBVU0VfVEtfU1RVQlMKCSAgICBhbmQgU1dJR19UQ0xfU1RVQlNfVkVSU0lPTi4gIERvY3VtZW50IGFsbCB0aHJlZSBpbiB0aGUgVGNsIGNoYXB0ZXIKCSAgICBvZiB0aGUgbWFudWFsLiAgQmFzZWQgb24gcGF0Y2ggZnJvbSBTRiMyODEwMzgwIGJ5IENocmlzdGlhbgoJICAgIEdvbGx3aXR6ZXIuCgoyMDA5LTA3LTAyOiB2bWlrbG9zCiAgICAgICAgICAgIFtQSFBdIEFkZGVkIGZhY3RvcnkuaSBmb3IgUEhQLCBzZWUgdGhlIGxpX2ZhY3RvcnkgdGVzdGNhc2UKICAgICAgICAgICAgZm9yIG1vcmUgaW5mbyBvbiBob3cgdG8gdXNlIGl0LgoKMjAwOS0wNy0wMjogd3NmdWx0b24KICAgICAgICAgICAgRml4IC1XYWxsa3cgb3B0aW9uIGFzIHJlcG9ydGVkIGJ5IFNvbG9tb24gR2liYnMuCgoyMDA5LTA3LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc3ludGF4IGVycm9yIHdoZW4gYSBuZXN0ZWQgc3RydWN0IGNvbnRhaW5zIGEgY29tbWVudCBjb250YWluaW5nIGEgKiBmb2xsb3dlZCAKICAgICAgICAgICAgZXZlbnR1YWxseSBieSBhIC8uIFJlZ3Jlc3Npb24gZnJvbSAxLjMuMzcsIHJlcG9ydGVkIGJ5IFNvbG9tb24gR2liYnMuCgoyMDA5LTA3LTAxOiB2bWlrbG9zCiAgICAgICAgICAgIFtQSFBdIFVua25vd24gcHJvcGVydGllcyBhcmUgbm8gbG9uZ2VyIGlnbm9yZWQgaW4gcHJveHkKICAgICAgICAgICAgY2xhc3Nlcy4KCjIwMDktMDctMDE6IHZtaWtsb3MKICAgICAgICAgICAgW1BIUF0gRml4ZWQgJW5ld29iamVjdCBiZWhhdmlvdXIsIHByZXZpb3VzbHkgYW55IG1ldGhvZAogICAgICAgICAgICBtYXJrZWQgd2l0aCAlbmV3b2JqZWN0IHdhcyBoYW5kbGVkIGFzIGEgY29uc3RydWN0b3IuCgoyMDA5LTA2LTMwOiBvbGx5CgkgICAgW1J1YnldIFVuZGVmaW5lIGNsb3NlIGFuZCBjb25uZWN0IG1hY3JvcyBkZWZpbmVkIGJ5IFJ1YnkgQVBJCgkgICAgaGVhZGVycyBhcyB3ZSBkb24ndCBuZWVkIHRoZW0gYW5kIHRoZXkgY2FuIGNsYXNoIHdpdGggQysrIG1ldGhvZHMKCSAgICBiZWluZyB3cmFwcGVkLiAgUGF0Y2ggZnJvbSBWaXQgT25kcnVjaCBpbiBTRiMyODE0NDMwLgoKMjAwOS0wNi0yNjogb2xseQoJICAgIFtSdWJ5XSBGaXggdG8gaGFuZGxlIEZJWE5VTSB2YWx1ZXMgZ3JlYXRlciB0aGFuIE1BWElOVCBwYXNzZWQgZm9yIGEKCSAgICBkb3VibGUgcGFyYW1ldGVyLgoKMjAwOS0wNi0yNDogd3NmdWx0b24KICAgICAgICAgICAgRml4IHdyYXBwaW5nIG1ldGhvZHMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyBhbmQgdGhlIGNvbXBhY3RkZWZhdWx0YXJncyBmZWF0dXJlIAogICAgICAgICAgICB3aGVyZSBhIGNsYXNzIGlzIHBhc3NlZCBieSB2YWx1ZSBhbmQgaXMgYXNzaWduZWQgYSBkZWZhdWx0IHZhbHVlLiBUaGUgU3dpZ1ZhbHVlV3JhcHBlcgogICAgICAgICAgICB0ZW1wbGF0ZSB3b3JrYXJvdW5kIGZvciBhIG1pc3NpbmcgZGVmYXVsdCBjb25zdHJ1Y3RvciBpcyBubyBsb25nZXIgdXNlZCBhcyB0aGUgY29kZSAKICAgICAgICAgICAgZ2VuZXJhdGVkIGRvZXMgbm90IGNhbGwgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IuCgoyMDA5LTA2LTE2OiB3c2Z1bHRvbgoJICAgIFtKYXZhLEMjXSBGaXggZW51bSBtYXJzaGFsbGluZyB3aGVuICVpZ25vcmUgaXMgdXNlZCBvbiBvbmUgb2YgdGhlIGVudW0gaXRlbXMuCiAgICAgICAgICAgIEluY29ycmVjdCBlbnVtIHZhbHVlcyB3ZXJlIGJlaW5nIHBhc3NlZCB0byB0aGUgQysrIGxheWVyIG9yIGNvbXBpbGF0aW9uIGVycm9ycyByZXN1bHRlZC4KCjIwMDktMDYtMDI6IHRhbGJ5CgkgICAgW1BlcmxdIFJlc29sdmVkIHJlZmVyZW5jZS5pIG92ZXJsb2FkIHN1cHBvcnQgcHJvYmxlbQoJICAgIGlkZW50aWZpZWQgYnkgSm9obiBQb3Rvd3NreS4KCjIwMDktMDUtMjY6IHdzZnVsdG9uCgkgICAgW0MjXSBJbXByb3ZlZCBzdGQ6Om1hcCB3cmFwcGVycyBiYXNlZCBvbiBwYXRjaCBmcm9tIFl1dmFsIEJhcm9yLiBUaGUgQyMgcHJveHkKICAgICAgICAgICAgbm93IGltcGxlbWVudHMgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSURpY3Rpb25hcnk8Pi4KCgkgICAgVGhlc2Ugc3RkOm1hcCB3cmFwcGVycyBoYXZlIGEgbm9uLWJhY2t3YXJkcyBjb21wYXRpYmxlIG92ZXJoYXVsIHRvIG1ha2UgdGhlbQogICAgICAgICAgICBsaWtlIGEgLk5FVCBJRGljdGlvbmFyeS4gU29tZSBtZXRob2QgbmFtZXMgaGF2ZSBjaGFuZ2VkIGFzIGZvbGxvd2luZzoKICAgICAgICAgICAgICBzZXQgLT4gc2V0aXRlbSAodXNlIHRoaXNbXSBwcm9wZXJ0eSBub3cpCiAgICAgICAgICAgICAgZ2V0IC0+IGdldGl0ZW0gKHVzZSB0aGlzW10gcHJvcGVydHkgbm93KQogICAgICAgICAgICAgIGhhc19rZXkgLT4gQ29udGFpbnNLZXkKICAgICAgICAgICAgICBkZWwgLT4gUmVtb3ZlCiAgICAgICAgICAgICAgY2xlYXIgLT4gQ2xlYXIKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgbWFjcm9zIHVzZWQgZm9yIHN0ZDo6bWFwIHdyYXBwZXJzIGFyZSBkZXByZWNhdGVkIGFuZCB3aWxsIG5vIGxvbmdlciB3b3JrOgogICAgICAgICAgICAgIHNwZWNpYWxpemVfc3RkX21hcF9vbl9rZXkKICAgICAgICAgICAgICBzcGVjaWFsaXplX3N0ZF9tYXBfb25fdmFsdWUKICAgICAgICAgICAgICBzcGVjaWFsaXplX3N0ZF9tYXBfb25fYm90aAoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDA5LTA1LTIwOiB2bWlrbG9zCiAgICAgICAgICAgIFtQSFBdIEFkZCB0aGUgJ3RoaXNvd24nIG1lbWJlciB0byBjbGFzc2VzLiBUaGUgdXNhZ2Ugb2YgaXQKICAgICAgICAgICAgaXMgdGhlIHNhbWUgYXMgdGhlIFB5dGhvbiB0aGlzb3duIG9uZTogaXQncyAxIGJ5IGRlZmF1bHQgYW5kCiAgICAgICAgICAgIHlvdSBjYW4gc2V0IGl0IHRvIDAgaWYgeW91IHdhbnQgdG8gcHJldmVudCBmcmVlaW5nIGl0LiAoRm9yCiAgICAgICAgICAgIGV4YW1wbGUgdG8gcHJldmVudCBhIGRvdWJsZSBmcmVlLikKCjIwMDktMDUtMTQ6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBGaXggdGhlIHdyb25nIHBvaW50ZXIgdmFsdWUgcmV0dXJuZWQgYnkgU3dpZ1B5T2JqZWN0X3JlcHIoKS4KCjIwMDktMDUtMTM6IG11dGFuZGl6IChNaWtlbCBCYW5jcm9mdCkKCSAgICBbYWxsZWdyb2NsXSBNaW5vciB0d2VhayB3aGVuIHdyYXBwaW5nIGluIC1ub2N3cmFwIG1vZGUuCgoyMDA5LTA1LTExOiB3c2Z1bHRvbgoJICAgIFtDI10gSW1wcm92ZWQgc3RkOjp2ZWN0b3Igd3JhcHBlcnMgb24gdGhlIEMjIHByb3h5IHNpZGUgZnJvbSBZdXZhbCBCYXJvci4gVGhlc2UKCSAgICBpbXBsZW1lbnQgSUxpc3Q8PiBpbnN0ZWFkIG9mIElFbnVtZXJhYmxlPD4gd2hlcmUgcG9zc2libGUuCgoyMDA5LTA0LTI5OiB3c2Z1bHRvbgoJICAgIFtKYXZhLCBDI10gQWRkIHRoZSAnbm90ZGVyaXZlZCcgYXR0cmlidXRlIHRvIHRoZSBqYXZhYmFzZSBhbmQgY3NiYXNlIHR5cGVtYXBzLgoJICAgIFdoZW4gdGhpcyBhdHRyaWJ1dGUgaXMgc2V0LCB0aGUgdHlwZW1hcCB3aWxsIG5vdCBhcHBseSB0byBjbGFzc2VzIHRoYXQgYXJlIGRlcml2ZWQKCSAgICBmcm9tIGEgQysrIGJhc2UgY2xhc3MsIGVnIAoJICAgICAgJXR5cGVtYXAoY3NiYXNlLCBub3RkZXJpdmVkPSIxIikgU1dJR1RZUEUgIkNvbW1vbkJhc2UiCgoyMDA5LTA0LTI5OiBvbGx5CgkgICAgW1B5dGhvbl0gRG9uJ3QgYXR0ZW1wdCB0byBhY3F1aXJlIHRoZSBHSUwgaW4gc2l0dWF0aW9ucyB3aGVyZSB3ZQoJICAgIGtub3cgdGhhdCBpdCB3aWxsIGFscmVhZHkgYmUgbG9ja2VkLiAgVGhpcyBhdm9pZHMgc29tZSBkZWFkLWxvY2tzCgkgICAgd2l0aCBtb2RfcHl0aG9uIChkdWUgdG8gbW9kX3B5dGhvbiBidWdzIHdoaWNoIGFyZSBhcHBhcmVudGx5CgkgICAgdW5saWtlbHkgdG8gZXZlciBiZSBmaXhlZCksIGFuZCByZXN1bHRzIGluIHNtYWxsZXIgd3JhcHBlcnMgd2hpY2gKCSAgICBydW4gYSBsaXR0bGUgZmFzdGVyIChpbiB0ZXN0cyB3aXRoIFhhcGlhbiBvbiB4ODYtNjQgVWJ1bnR1IDkuMDQsCgkgICAgdGhlIHN0cmlwcGVkIHdyYXBwZXIgbGlicmFyeSB3YXMgMTElIHNtYWxsZXIgYW5kIHJhbiAyLjclIGZhc3RlcikuCgoyMDA5LTA0LTIxOiB3c2Z1bHRvbgoJICAgIFtDI10gRml4ICMyNzUzNDY5IC0gYm9vbCAmT1VUUFVUIGFuZCBib29sICpPVVRQVVQgdHlwZW1hcHMgaW5pdGlhbGlzYXRpb24uCgoyMDA5LTA0LTA5OiB3c2Z1bHRvbgoJICAgIEZpeCAjMjc0Njg1OCAtIEMgbWFjcm8gZXhwcmVzc2lvbiB1c2luZyBmbG9hdGluZyBwb2ludCBudW1iZXJzCgoyMDA5LTAzLTMwOiBvbGx5CgkgICAgW1BIUF0gVGhlIGRlZmF1bHQgb3V0IHR5cGVtYXAgZm9yIGNoYXJbQU5ZXSBub3cgcmV0dXJucyB0aGUgc3RyaW5nIHVwIHRvIGEKCSAgICB6ZXJvIGJ5dGUsIG9yIHRoZSBlbmQgb2YgdGhlIGFycmF5IGlmIHRoZXJlIGlzIG5vIHplcm8gYnl0ZS4gIFRoaXMKCSAgICBpcyB0aGUgc2FtZSBhcyBQeXRob24gZG9lcywgYW5kIHNlZW1zIG1vcmUgZ2VuZXJhbGx5IHVzZWZ1bCB0aGFuCgkgICAgdGhlIHByZXZpb3VzIGJlaGF2aW91ciBvZiByZXR1cm5pbmcgdGhlIHdob2xlIGNvbnRlbnRzIG9mIHRoZSBhcnJheQoJICAgIGluY2x1ZGluZyBhbnkgemVybyBieXRlcy4gIElmIHlvdSB3YW50IHRoZSBvbGQgYmVoYXZpb3VyLCB5b3UgY2FuIHByb3ZpZGUKCSAgICB5b3VyIG93biB0eXBlbWFwIHRvIGRvIHRoaXM6CgoJICAgICV0eXBlbWFwKG91dCkgY2hhciBbQU5ZXQoJICAgICV7CgkJUkVUVkFMX1NUUklOR0woJDEsICQxX2RpbTAsIDEpOwoJICAgICV9CgpWZXJzaW9uIDEuMy4zOSAoMjEgTWFyY2ggMjAwOSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDA5LTAzLTE5OiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4IHRoZSBtZW1vcnkgbGVhayByZWxhdGVkIHRvIFB5dGhvbiAzIHVuaWNvZGUgYW5kIEMgY2hhciogY29udmVyc2lvbiwKICAgICAgICAgICAgd2hpY2ggY2FuIGJlIHNob3duIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBiZWZvcmUgdGhpcyBmaXg6CiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICBmcm9tIGxpX2NzdHJpbmcgaW1wb3J0ICoKICAgICAgICAgICAgICAgICAgaT0wCiAgICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICAgICAgICBpICs9IDEKICAgICAgICAgICAgICAgICAgICAgIG4gPSBzdHIoaSkqMTAKICAgICAgICAgICAgICAgICAgICAgIHRlc3QzKG4pCgogICAgICAgICAgICBUaGlzIGZpeCBhZmZlY3RlZCBTV0lHX0FzQ2hhclB0ckFuZFNpemUoKSBzbyB5b3UgY2Fubm90IGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoCiAgICAgICAgICAgIGEgbnVsbCBhbGxvYyBhbmQgbm9uLW51bGwgY3B0ciBhcmd1bWVudCBpbiBQeXRob24gMywgb3RoZXJ3aXNlIGEgcnVudGltZSBlcnJvcgogICAgICAgICAgICB3aWxsIGJlIHJhaXNlZC4KCjIwMDktMDMtMTg6IHdzZnVsdG9uCgkgICAgW0MjXSBzdGQ6OnZlY3RvcjxUPiB3cmFwcGVyIGltcHJvdmVtZW50cyBmb3IgLk5FVCAyIGFuZCBhbHNvIHByb3ZpZGluZyB0aGUKCSAgICBuZWNlc3NhcnkgbWFjaGluZXJ5IHRvIHVzZSB0aGUgc3RkOjp2ZWN0b3I8VD4gd3JhcHBlcnMgd2l0aCBtb3JlIGFkdmFuY2VkIGZlYXR1cmVzIHN1Y2gKCSAgICBhcyBMSU5RIC0gdGhlIEMjIHByb3h5IGNsYXNzIG5vdyBkZXJpdmVzIGZyb20gSUVudW1lcmFibGU8Pi4gVGhlIGRlZmF1bHQgaXMgbm93IHRvIAoJICAgIGdlbmVyYXRlIGNvZGUgcmVxdWlyaW5nIC5ORVQgMiBhcyBhIG1pbmltdW0sIGFsdGhvdWdoIHRoZSBDIyBjb2RlIGNhbiBiZSBjb21waWxlZCAKCSAgICBmb3IgLk5FVCAxIGJ5IGRlZmluaW5nIHRoZSBTV0lHX0RPVE5FVF8xIEMjIHByZXByb2Nlc3NvciBjb25zdGFudC4gU2VlIHRoZSAKCSAgICBzdGRfdmVjdG9yLmkgZmlsZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDA5LTAzLTEyOiB3c2Z1bHRvbgoJICAgIFtSdWJ5XSBGaXggIzI2NzY3MzggU1dJRyBnZW5lcmF0ZWQgc3ltYm9sIG5hbWUgY2xhc2hlcy4KCjIwMDktMDMtMDE6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBTb21lIGZpeGVzIGZvciBQeXRob24gMy4wLjEgYW5kIGhpZ2hlciBzdXBwb3J0LiBJbiAzLjAuMSwgdGhlIEMgQVBJIGZ1bmN0aW9uCiAgICAgICAgICAgIFB5T2JqZWN0X0NvbXBhcmUgaXMgcmVtb3ZlZCwgc28gUHlPYmplY3RfUmljaENvbXBhcmVCb29sIGlzIHVzZWQgZm9yIHJlcGxhY2VtZW50LgogICAgICAgICAgICBTdHJ1Y3QgaW5pdGlsaXphdGlvbiBvZiBTd2lnUHlPYmplY3QgYW5kIFN3aWdQeU9iamVjdF9hc19udW1iZXIgY2hhbmdlZCB0byByZWZsZWN0CiAgICAgICAgICAgIHRoZSBkcm9wIG9mIHRwX2NvbXBhcmUgYW5kIG5iX2xvbmcuCgoyMDA5LTAzLTAxOiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4IFNGIzI1ODMxNjAuIE5vdyB0aGUgaW1wb3J0ZXIgaW4gUHl0aG9uIHNoYWRvdyB3cmFwcGVyIHRha2UgY2FyZSBvZiB0aGUKICAgICAgICAgICAgY2FzZSB0aGF0IG1vZHVsZSBhbHJlYWR5IGltcG9ydGVkIGF0IG90aGVyIHBsYWNlLgoKMjAwOS0wMi0yODogYmh5CiAgICAgICAgICAgIFtQeXRob25dIEZpeCBTRiMyNjM3MzUyLiBNb3ZlIHN0cnVjdCBkZWNsYXJhdGlvbiBvZiBTV0lHX21vZHVsZSBpbiBweWluaXQuc3dnIGJlZm9yZQogICAgICAgICAgICB0aGUgbWV0aG9kIGNhbGxzLCBzaW5jZSBzb21lIEMgY29tcGlsZXIgZG9uJ3QgYWxsb3cgZGVjbGFyYXRpb24gaW4gbWlkZGxlIG9mIGZ1bmN0aW9uCiAgICAgICAgICAgIGJvZHkuCgoyMDA5LTAyLTIxOiB3c2Z1bHRvbgoJICAgIFtBbGxlZ3JvY2xdIEZpeCBzZWcgZmF1bHQgd3JhcHBpbmcgc29tZSBjb25zdGFudCB2YXJpYWJsZSAoJWNvbnN0YW50KSB0eXBlcy4KCjIwMDktMDItMjA6IHdzZnVsdG9uCgkgICAgW0NGRkldIEZpeCBzZWcgZmF1bHRzIHdoZW4gZm9yICVleHRlbmQgYW5kIHVzaW5nIHN0YXRlbWVudHMuCgoyMDA5LTAyLTIwOiB3c2Z1bHRvbgoJICAgIEZpeCBTRiAjMjYwNTk1NTogLWNvIG9wdGlvbiB3aGljaCBicm9rZSBpbiAxLjMuMzcuIAoKMjAwOS0wMi0yMDogd3NmdWx0b24KCSAgICBOZXcgJWluc2VydCgiYmVnaW4iKSBzZWN0aW9uIGFkZGVkLiBBbHNvIGNhbiBiZSB1c2VkIGFzICViZWdpbi4gVGhpcyBpcyBhIG5ldwoJICAgIGNvZGUgc2VjdGlvbiByZXNlcnZlZCBlbnRpcmVseSBmb3IgdXNlcnMgYW5kIHRoZSBjb2RlIHdpdGhpbiB0aGUgc2VjdGlvbiBpcyBnZW5lcmF0ZWQKCSAgICBhdCB0aGUgdG9wIG9mIHRoZSBDL0MrKyB3cmFwcGVyIGZpbGUgYW5kIHNvIHByb3ZpZGVzIGEgbWVhbnMgdG8gcHV0IGN1c3RvbSBjb2RlCgkgICAgaW50byB0aGUgd3JhcHBlciBmaWxlIGJlZm9yZSBhbnl0aGluZyBlbHNlIHRoYXQgU1dJRyBnZW5lcmF0ZXMuCgoyMDA5LTAyLTE3OiB3c2Z1bHRvbgoJICAgICdtYWtlIGNsZWFuLXRlc3Qtc3VpdGUnIHdpbGwgbm93IHJ1biBjbGVhbiBvbiBBTEwgbGFuZ3VhZ2VzLiBQcmV2aW91c2x5IGl0IG9ubHkKCSAgICByYW4gdGhlIGNvcnJlY3RseSBjb25maWd1cmVkIGxhbmd1YWdlcy4gVGhpcyB3YXkgaXQgaXMgbm93IHBvc3NpYmxlIHRvIGNsZWFuIHVwCgkgICAgcHJvcGVybHkgYWZ0ZXIgcnVubmluZyAnbWFrZSBwYXJ0aWFsY2hlY2stdGVzdC1zdWl0ZScuCgoyMDA5LTAyLTE0OiB3c2Z1bHRvbgoJICAgIEV4dGVuZCBhdHRyaWJ1dGUgbGlicmFyeSBzdXBwb3J0IGZvciBzdHJ1Y3RzL2NsYXNzZXMgYW5kIHRoZSBhY2Nlc3NvciBmdW5jdGlvbnMgdXNlCgkgICAgcGFzcy9yZXR1cm4gYnkgdmFsdWUgc2VtYW50aWNzLiBUd28gbmV3IG1hY3JvcyBhcmUgYXZhaWxhYmxlIGFuZCB1c2FnZSBpcyBpZGVudGljYWwKCSAgICB0byAlYXR0cmlidXRlLiBUaGVzZSBhcmUgJWF0dHJpYnV0ZXZhbCBmb3Igc3RydWN0cy9jbGFzc2VzIGFuZCAlYXR0cmlidXRlc3RyaW5nIGZvcgoJICAgIHN0cmluZyBjbGFzc2VzLCBsaWtlIHN0ZDo6c3RyaW5nLiBTZWUgYXR0cmlidXRlLnN3ZyBmb3IgbW9yZSBkZXRhaWxzLgoKMjAwOS0wMi0xMzogd3NmdWx0b24KCSAgICBBZGQgc3VwcG9ydCBmb3IgJWV4dGVuZCBhbmQgbWVtYmVyaW4gdHlwZW1hcHMuIFByZXZpb3VzbHkgdGhlIG1lbWJlcmluIHR5cGVtYXBzIHdlcmUKCSAgICBpZ25vcmVkIGZvciBtZW1iZXIgdmFyaWFibGVzIHdpdGhpbiBhICVleHRlbmQgYmxvY2suCgoyMDA5LTAyLTEyOiB3c2Z1bHRvbgoJICAgIFJlbW92ZSB1bm5lY2Vzc2FyeSB0ZW1wb3JhcnkgdmFyaWFibGUgd2hlbiB3cmFwcGluZyByZXR1cm4gdmFsdWVzIHRoYXQgYXJlIHJlZmVyZW5jZXMuIAoJICAgIEV4YW1wbGUgb2YgZ2VuZXJhdGVkIGNvZGUgZm9yIHdyYXBwaW5nOgoKCSAgICAgIHN0cnVjdCBYWVogewoJCXN0ZDo6c3RyaW5nJiByZWZSZXR1cm4oKTsKCSAgICAgIH07CgoJICAgIHVzZWQgdG8gYmU6CgogICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpyZXN1bHQgPSAwIDsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmX3Jlc3VsdF9yZWYgPSAoYXJnMSktPnJlZlJldHVybigpOwogICAgICAgICAgICAgICAgcmVzdWx0ID0gKHN0ZDo6c3RyaW5nICopICZfcmVzdWx0X3JlZjsKICAgICAgICAgICAgICB9CgoJICAgICBOb3cgaXQgaXM6CgogICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpyZXN1bHQgPSAwIDsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICByZXN1bHQgPSAoc3RkOjpzdHJpbmcgKikgJihhcmcxKS0+cmVmUmV0dXJuKCk7CgoyMDA5LTAyLTA4OiBiaHkKICAgICAgICAgICAgQ2hhbmdlIHRoZSBTSVpFIG1hcHBlZCBieSAlcHlidWZmZXJfbXV0YWJsZV9iaW5hcnkgYW5kICVweWJ1ZmZlcl9iaW5hcnkgaW4gcHlidWZmZXIuaSBmcm9tCiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciB0byB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBidWZmZXIuCgoyMDA5LTAyLTA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJWZlYXR1cmUgbm90IHdvcmtpbmcgZm9yIGNvbnZlcnNpb24gb3BlcmF0b3JzLCByZXBvcnRlZCBieSBNYXR0IFNwcmFndWUsIGZvciBleGFtcGxlOgoJICAgICAgJWZlYXR1cmUoImNzOm1ldGhvZG1vZGlmaWVycyIpIG9wZXJhdG9yIGJvb2wgInByb3RlY3RlZCI7CgoyMDA5LTAyLTA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbTXpTY2hlbWVdIEFwcGx5ICMyMDgxOTY3IGNvbmZpZ3VyZSBjaGFuZ2VzIGZvciBleGFtcGxlcyB0byBidWlsZCB3aXRoIHJlY2VudCBQTFQgdmVyc2lvbnMuCgkgICAgQWxzbyBmaXhlcyBNYWtlZmlsZSBlcnJvcnMgYnVpbGRpbmcgU1dJRyBleGVjdXRhYmxlIHdoZW4gbXpzY2hlbWUgcGFja2FnZSBpcyBpbnN0YWxsZWQgCgkgICAgKHZlcnNpb24gMy43MiBhcHByb3ggYW5kIGxhdGVyKS4KCjIwMDktMDItMDQ6IHRhbGJ5CiAgICAgICAgICAgIFtQZXJsXSBGaXggU0YjMjU2NDE5MiByZXBvcnRlZCBieSBEYXZpZCBLb2xvdnJhdG5rLgogICAgICAgICAgICBTV0lHX0FzQ2hhclB0ckFuZFNpemUoKSBub3cgaGFuZGxlcyAiZ2V0IiBtYWdpYy4KClZlcnNpb24gMS4zLjM4ICgzMSBKYW51YXJ5IDIwMDkpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDA5LTAxLTMxOiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4IFNGIzI1NTI0ODggcmVwb3J0ZWQgYnkgR2FldGFuIExlaG1hbm4uIE5vdyAlcHl0aG9ucHJlcGVuZAogICAgICAgICAgICBhbmQgJXB5dGhvbmFwcGVuZCBoYXZlIGNvcnJlY3QgaW5kZW50YXRpb24uCgoyMDA5LTAxLTMxOiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4IFNGIzI1NTIwNDggcmVwb3J0ZWQgYnkgR2FldGFuIExlaG1hbm4uIFRoZSBwYXJhbWV0ZXIgbGlzdAogICAgICAgICAgICBvZiBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9uIGluIGdlbmVyYXRlZCBwcm94eSBjb2RlIHNob3VsZCBub3QgaGF2ZSB0aGUKICAgICAgICAgICAgJ3NlbGYnIHBhcmFtZXRlci4KCjIwMDktMDEtMjk6IHdzZnVsdG9uCgkgICAgRml4IHJlZ3Jlc3Npb24gaW50cm9kdWNlZCBpbiAxLjMuMzcgd2hlcmUgdGhlIGRlZmF1bHQgb3V0cHV0IGRpcmVjdG9yeQoJICAgIGZvciB0YXJnZXQgbGFuZ3VhZ2Ugc3BlY2lmaWMgZmlsZXMgKGluIHRoZSBhYnNlbmNlIG9mIC1vdXRkaXIpIHdhcyBubwoJICAgIGxvbmdlciB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGdlbmVyYXRlZCBjL2MrKyBmaWxlLgoKMjAwOS0wMS0yODogd3NmdWx0b24KCSAgICBbSmF2YSwgQyNdIEZpeCBwcm94eSBjbGFzcyBub3QgYmVpbmcgdXNlZCB3aGVuIHRoZSBnbG9iYWwgc2NvcGUgb3BlcmF0b3IKCSAgICB3YXMgdXNlZCBmb3IgcGFyYW1ldGVycyBwYXNzZWQgYnkgdmFsdWUuIFJlcG9ydGVkIGJ5IERhdmlkIFBpZXBncmFzcy4KCjIwMDktMDEtMTU6IHdzZnVsdG9uCgkgICAgW1BlcmxdIEZpeCBzZWcgZmF1bHQgd2hlbiBydW5uaW5nIHdpdGggLXYgb3B0aW9uLCByZXBvcnRlZCBieSBKb2huIEt5LgoKVmVyc2lvbiAxLjMuMzcgKDEzIEphbnVhcnkgMjAwOSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMDktMDEtMTM6IG1nb3NzYWdlCgkgICAgW0x1YV0gQWRkZWQgY29udHJhY3Qgc3VwcG9ydCBmb3IgcmVxdWlyaW5nIHRoYXQgdW5zaWduZWQgbnVtYmVycyBhcmUgPj0wCgkgICAgUmV3cm90ZSBtdWNoIG9mIEV4YW1wbGVzL0x1YS9lbWJlZDMuIAoJICAgIEFkZGVkIGEgbG90IHRvIHRoZSBMdWEgZG9jdW1lbnRhdGlvbi4KCjIwMDktMDEtMTM6IHdzZnVsdG9uCgkgICAgRml4IGNvbXBpbGF0aW9uIGVycm9yIHdoZW4gdXNpbmcgZGlyZWN0b3JzIG9uIHByb3RlY3RlZCB2aXJ0dWFsIG92ZXJsb2FkZWQgCgkgICAgbWV0aG9kcyByZXBvcnRlZCBieSBTYW0gSGVuZGxleS4KCjIwMDktMDEtMTI6IGRyam9lCiAgICAgICAgICAgIFtSXSBGaXhlZCBoYW5kbGluZyBvZiBpbnRlZ2VyIGFycmF5cwoKMjAwOS0wMS0xMDogZHJqb2UKCSAgICBbUl0gRml4IGludGVnZXIgaGFuZGxpbmcgaW4gciB0byBkZWFsIGNvcnJlY3RseSB3aXRoIHNpZ25lZAoJICAgIGFuZCB1bnNpZ25lZCBpc3N1ZXMKCjIwMDktMDEtMTA6IHdzZnVsdG9uCgkgICAgUGF0Y2ggICMxOTkyNzU2IGZyb20gQ29saW4gTWNEb25hbGQgLSAlY29udHJhY3Qgbm90IHdvcmtpbmcgZm9yIGNsYXNzZXMgCgkgICAgaW4gbmFtZXNwYWNlCgoyMDA5LTAxLTA1OiBvbGx5CgkgICAgTWFyayBTV0lHUEVSTDUsIFNXSUdQSFA1LCBhbmQgU1dJR1RDTDggYXMgZGVwcmVjYXRlZCBpbiB0aGUgc291cmNlCgkgICAgY29kZSBhbmQgcmVtb3ZlIGRvY3VtZW50YXRpb24gb2YgdGhlbS4KCjIwMDgtMTItMzA6IHdzZnVsdG9uCgkgICAgQnVnICMyNDMwNzU2LiBBbGwgdGhlIGxhbmd1YWdlcyBub3cgZGVmaW5lIGEgbWFjcm8gaW4gdGhlIGdlbmVyYXRlZCBDL0MrKwoJICAgIHdyYXBwZXIgZmlsZSBpbmRpY2F0aW5nIHdoaWNoIGxhbmd1YWdlIGlzIGJlaW5nIHdyYXBwZWQuIFRoZSBtYWNybyBuYW1lIGlzIHRoZQoJICAgIHNhbWUgYXMgdGhvc2UgZGVmaW5lZCB3aGVuIFNXSUcgaXMgcnVuLCBlZyBTV0lHSkFWQSwgU1dJR09DVEFWRSwgU1dJR0NTSEFSUCBldGMKCSAgICBhbmQgYXJlIGxpc3RlZCBpbiB0aGUgIkNvbmRpdGlvbmFsIENvbXBpbGF0aW9uIiBzZWN0aW9uIGluIHRoZSBkb2N1bWVudGF0aW9uLgoKMjAwOC0xMi0yMzogd3NmdWx0b24KCSAgICBbSmF2YV0gRml4ICMyMTUzNzczIC0gJW5vamF2YWV4Y2VwdGlvbiB3YXMgY2xlYXJpbmcgdGhlIGV4Y2VwdGlvbiBmZWF0dXJlCiAgICAgICAgICAgIGluc3RlYWQgb2YgZGlzYWJsaW5nIGl0LiBDbGVhcmluZyBjaGVja2VkIEphdmEgZXhjZXB0aW9ucyBhbHNvIGRpZG4ndCB3b3JrLiAKCSAgICBUaGUgbmV3ICVjbGVhcmphdmFleGNlcHRpb24gY2FuIGJlIHVzZWQgZm9yIGNsZWFyaW5nIHRoZSBleGNlcHRpb24gZmVhdHVyZS4KCjIwMDgtMTItMjI6IHdzZnVsdG9uCgkgICAgRml4ICMyNDMyODAxIC0gTWFrZSBTd2lnVmFsdWVXcmFwcGVyIGV4Y2VwdGlvbiBzYWZlIGZvciB3aGVuIGNvcHkgY29uc3RydWN0b3JzCgkgICAgdGhyb3cgZXhjZXB0aW9ucy4KCjIwMDgtMTItMjE6IHdzZnVsdG9uCgkgICAgQXBwbHkgcGF0Y2ggIzI0NDAwNDYgd2hpY2ggZml4ZXMgcG9zc2libGUgc2VnIGZhdWx0cyBmb3IgbWVtYmVyIGFuZCBnbG9iYWwKCSAgICB2YXJpYWJsZSBjaGFyIGFycmF5cyB3aGVuIHRoZSBzdHJpbmdzIGFyZSBsYXJnZXIgdGhhbiB0aGUgc3RyaW5nIGFycmF5IHNpemUuCgoyMDA4LTEyLTIwOiB3c2Z1bHRvbgoJICAgIFRoZSBjY2FjaGUgY29tcGlsZXIgY2FjaGUgaGFzIGJlZW4gYWRhcHRlZCB0byB3b3JrIHdpdGggU1dJRyBhbmQKCSAgICBuYW1lZCBjY2FjaGUtc3dpZy4gSXQgbm93IHdvcmtzIHdpdGggQy9DKysgY29tcGlsZXJzIGFzIHdlbGwgYXMgU1dJRwoJICAgIGFuZCBjYW4gcmVzdWx0IGluIGltcHJlc3NpdmUgc3BlZWR1cHMgd2hlbiB1c2VkIHRvIHJlY29tcGlsZSB1bmNoYW5nZWQKCSAgICBjb2RlIHdpdGggZWl0aGVyIGEgQy9DKysgY29tcGlsZXIgb3IgU1dJRy4gRG9jdW1lbnRhdGlvbiBpcyBpbiBDQ2FjaGUuaHRtbAoJICAgIG9yIHRoZSBpbnN0YWxsZWQgY2NhY2hlLXN3aWcgbWFuIHBhZ2UuCgoyMDA4LTEyLTEyOiB3c2Z1bHRvbgoJICAgIEFwcGx5IHBhdGNoIGZyb20gS2FseWFub3YgRG1pdHJ5IHdoaWNoIGZpeGVzIHBhcnNpbmcgb2YgbmVzdGVkIHN0cnVjdHMKCSAgICBjb250YWluaW5nIGNvbW1lbnRzLgoKMjAwOC0xMi0xMjogd3NmdWx0b24KCSAgICBGaXggZXJyb3IgbWVzc2FnZSBpbiBzb21lIG5lc3RlZCBzdHJ1Y3QgYW5kICVpbmxpbmUgcGFyc2luZyBlcnJvciBzaXR1YXRpb25zCgkgICAgc3VjaCBhcyB1bnRlcm1pbmF0ZWQgc3RyaW5ncyBhbmQgY29tbWVudHMuCgoyMDA4LTEyLTA3OiBvbGx5CgkgICAgW1BIUF0gRml4IHdhcm5pbmdzIHdoZW4gY29tcGlsaW5nIGdlbmVyYXRlZCB3cmFwcGVyIHdpdGggR0NDIDQuMy4KCjIwMDgtMTItMDY6IHdzZnVsdG9uCgkgICAgW1BIUF0gRGVwcmVjYXRlICVwcmFnbWEocGhwNCkuIFBsZWFzZSB1c2UgJXByYWdtYShwaHApIGluc3RlYWQuCgkgICAgVGhlIGZvbGxvd2luZyB0d28gd2FybmluZ3MgaGF2ZSBiZWVuIHJlbmFtZWQ6CgkgICAgV0FSTl9QSFA0X01VTFRJUExFX0lOSEVSSVRBTkNFIC0+IFdBUk5fUEhQX01VTFRJUExFX0lOSEVSSVRBTkNFCgkgICAgV0FSTl9QSFA0X1VOS05PV05fUFJBR01BICAgICAgIC0+IFdBUk5fUEhQX1VOS05PV05fUFJBR01BCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMDgtMTItMDQ6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBBcHBsaWVkIHBhdGNoIFNGIzIxNTg5Mzg6IGFsbCB0aGUgU1dJRyBzeW1ib2wgbmFtZXMgc3RhcnRlZCB3aXRoIFB5CiAgICAgICAgICAgIGFyZSBjaGFuZ2VkLCBzaW5jZSB0aGV5IGFyZSBpbmFwcHJvcHJpYXRlIGFuZCBkaXNjb3VyYWdlZCBpbiBQeXRob24KICAgICAgICAgICAgZG9jdW1lbnRhdGlvbiAoZnJvbSBodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG9jLzIuNS4yL2FwaS9pbmNsdWRlcy5odG1sKToKCiAgICAgICAgICAgICJBbGwgdXNlciB2aXNpYmxlIG5hbWVzIGRlZmluZWQgYnkgUHl0aG9uLmggKGV4Y2VwdCB0aG9zZSBkZWZpbmVkIGJ5CiAgICAgICAgICAgIHRoZSBpbmNsdWRlZCBzdGFuZGFyZCBoZWFkZXJzKSBoYXZlIG9uZSBvZiB0aGUgcHJlZml4ZXMgIlB5IiBvciAiX1B5Ii4KICAgICAgICAgICAgTmFtZXMgYmVnaW5uaW5nIHdpdGggIl9QeSIgYXJlIGZvciBpbnRlcm5hbCB1c2UgYnkgdGhlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbgogICAgICAgICAgICBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGV4dGVuc2lvbiB3cml0ZXJzLiBTdHJ1Y3R1cmUgbWVtYmVyIG5hbWVzIGRvCiAgICAgICAgICAgIG5vdCBoYXZlIGEgcmVzZXJ2ZWQgcHJlZml4LgoKICAgICAgICAgICAgSW1wb3J0YW50OiB1c2VyIGNvZGUgc2hvdWxkIG5ldmVyIGRlZmluZSBuYW1lcyB0aGF0IGJlZ2luIHdpdGggIlB5IiBvciAiX1B5Ii4KICAgICAgICAgICAgVGhpcyBjb25mdXNlcyB0aGUgcmVhZGVyLCBhbmQgamVvcGFyZGl6ZXMgdGhlIHBvcnRhYmlsaXR5IG9mIHRoZSB1c2VyCiAgICAgICAgICAgIGNvZGUgdG8gZnV0dXJlIFB5dGhvbiB2ZXJzaW9ucywgd2hpY2ggbWF5IGRlZmluZSBhZGRpdGlvbmFsIG5hbWVzIGJlZ2lubmluZwogICAgICAgICAgICB3aXRoIG9uZSBvZiB0aGVzZSBwcmVmaXhlcy4iCgogICAgICAgICAgICBIZXJlIGlzIGEgYnJpZWYgbGlzdCBvZiB3aGF0IGNoYW5nZWQ6CgogICAgICAgICAgICAgICAgUHlTd2lnKiAtPiBTd2lnUHkqCiAgICAgICAgICAgICAgICBQeU9iamVjdF9wdHIgLT4gU3dpZ1B0cl9QeU9iamVjdAogICAgICAgICAgICAgICAgUHlPYmplY3RfdmFyIC0+IFN3aWdWYXJfUHlPYmplY3QKICAgICAgICAgICAgICAgIFB5U2VxdWVuY2VfQmFzZSwgUHlTZXF1ZW5jZV9Db250LCBQeVNlcXVlbmNlX1JlZiAtPgogICAgICAgICAgICAgICAgICAgICAgICBTd2lnUHlTZXF1ZW5jZV9CYXNlLCBTd2lnUHlTZXF1ZW5jZV9Db250LCBTd2lnUHlTZXF1ZW5jZV9SZWYKICAgICAgICAgICAgICAgIFB5TWFwKiAtPiBTd2lnUHlNYXAqCgogICAgICAgICAgICBXZSBwcm92aWRlZCBhIHB5bmFtZV9jb21wYXQuaSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gVXNlcnMgd2hvc2UgY29kZSBoYXZpbmcKICAgICAgICAgICAgdGhlc2Ugc3ltYm9scyBhbmQgZG8gbm90IHdhbnQgdG8gY2hhbmdlIGl0IGNvdWxkIHNpbXBseSBpbmNsdWRlIHRoaXMgZmlsZQogICAgICAgICAgICBhdCBmcm9udCBvZiB5b3VyIGNvZGUuIEEgYmV0dGVyIHNvbHV0aW9uIGlzIHRvIHJ1biB0aGUgY29udmVydGluZyB0b29sIG9uCiAgICAgICAgICAgIHlvdXIgY29kZSwgd2hpY2ggaGFzIGJlZW4gcHV0IGluIFNXSUcncyBTVk4gdHJ1bmsgKFRvb2xzL3B5bmFtZV9wYXRjaC5weSkgYW5kCiAgICAgICAgICAgIHlvdSBjYW4gZG93bmxvYWQgaXQgaGVyZToKICAgICAgICAgICAgaHR0cHM6Ly9zd2lnLnN2bi5zb3VyY2Vmb3JnZS5uZXQvc3Zucm9vdC9zd2lnL3RydW5rL1Rvb2xzL3B5bmFtZV9wYXRjaC5weSAKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAwOC0xMi0wMjogd3NmdWx0b24KCSAgICBbUHl0aG9uXSBBcHBseSBwYXRjaCAjMjE0MzcyNyBmcm9tIFNlcmdlIE1vbmtld2l0eiB0byBmaXggaW1wb3J0aW5nIGJhc2UgY2xhc3NlcyAKCSAgICB3aGVuIHRoZSBwYWNrYWdlIG9wdGlvbiBpcyBzcGVjaWZpZWQgaW4gJW1vZHVsZSBhbmQgdGhhdCBtb2R1bGUgaXMgJWltcG9ydCdlZC4KCjIwMDgtMTEtMjg6IHdzZnVsdG9uCgkgICAgW1VUTF0gRml4ICMyMDgwNDk3LiBTb21lIGluY29ycmVjdCBhY2NlcHRhbmNlIG9mIHR5cGVzIGluIHRoZSBTVEwsIGVnIGEgZG91YmxlICogZWxlbWVudAoJICAgIHBhc3NlZCBpbnRvIGEgdmVjdG9yPGludCAqPiBjb25zdHJ1Y3RvciB3b3VsZCBiZSBhY2NlcHRlZCwgYnV0IHRoZSBlbnN1aW5nIGJlaGF2aW91cgoJICAgIHdhcyB1bmRlZmluZWQuIE5vdyB0aGUgdHlwZSBjb252ZXJzaW9uIGNvcnJlY3RseSByYWlzZXMgYW4gZXhjZXB0aW9uLgoKMjAwOC0xMS0yNDogd3NmdWx0b24KCSAgICBBZGQgLW91dGN1cnJlbnRkaXIgb3B0aW9uLiBUaGlzIHNldHMgdGhlIGRlZmF1bHQgb3V0cHV0IGRpcmVjdG9yeSB0byB0aGUgY3VycmVudCAKCSAgICBkaXJlY3RvcnkgaW5zdGVhZCBvZiB0aGUgcGF0aCBzcGVjaWZpZWQgYnkgdGhlIGlucHV0IGZpbGUuIFRoaXMgb3B0aW9uIGVuYWJsZXMKCSAgICBiZWhhdmlvdXIgc2ltaWxhciB0byBjL2MrKyBjb21waWxlcnMuIE5vdGUgdGhhdCB0aGlzIGNvbnRyb2xzIHRoZSBvdXRwdXQgZGlyZWN0b3J5LAoJICAgIGJ1dCBvbmx5IGluIHRoZSBhYnNlbmNlIG9mIHRoZSAtbyBhbmQvb3IgLW91dGRpciBvcHRpb25zLgoKMjAwOC0xMS0yMzogd3NmdWx0b24KCSAgICBbcnVieV0gQXBwbHkgcGF0Y2ggIzIyNjM4NTAgdG8gZml4IHJ1YnkvZmlsZS5pIC4uLiBydWJ5aW8uaCBmaWxlbmFtZSBjaGFuZ2UgaW4gCgkgICAgcnVieSAxLjkuCgoyMDA4LTExLTIzOiB3c2Z1bHRvbgoJICAgIEFwcGx5IHBhdGNoICMyMzE5NzkwIGZyb20gSm9oYW4gSGFrZSB0byBmaXggc2hhcmVkX3B0ciB1c2FnZSBpbiBzdGQ6OnRyMSBuYW1lc3BhY2UuCgoyMDA4LTExLTIxOiB3c2Z1bHRvbgoJICAgIFRoZSB1c2Ugb2YgdGhlIGluY2x1ZGUgcGF0aCB0byBmaW5kIHRoZSBpbnB1dCBmaWxlIGlzIG5vdyBkZXByZWNhdGVkLgoJICAgIFRoaXMgbWFrZXMgdGhlIGJlaGF2aW91ciBvZiBTV0lHIHRoZSBzYW1lIGFzIEMvQysrIGNvbXBpbGVycyBpbiBwcmVwYXJhdGlvbgoJICAgIGZvciB1c2Ugd2l0aCBjY2FjaGUuCgoyMDA4LTExLTE2OiB3c2Z1bHRvbgoJICAgIEZpeCAtbm9wcmVwcm9jZXNzIG9wdGlvbiB0bzoKCSAgICAtIGNvcnJlY3RseSByZXBvcnQgZmlsZSBuYW1lcyBpbiB3YXJuaW5nIGFuZCBlcnJvciBtZXNzYWdlcy4KCSAgICAtIHVzZSB0aGUgb3JpZ2luYWwgaW5wdXQgZmlsZW5hbWUgdGhhdCBjcmVhdGVkIHRoZSBwcmVwcm9jZXNzZWQgb3V0cHV0IHdoZW4gCgkgICAgICBkZXRlcm1pbmluZyB0aGUgQysrIHdyYXBwZXIgZmlsZSBuYW1lIChpbiB0aGUgYWJzZW5jZSBvZiAtbykuIFByZXZpb3VzbHkgCgkgICAgICB0aGUgbmFtZSBvZiB0aGUgaW5wdXQgZmlsZSBjb250YWluaW5nIHRoZSBwcmVwcm9jZXNzZWQgb3V0cHV0IHdhcyB1c2VkLgoKMjAwOC0xMS0xMTogd3NmdWx0b24KCSAgICBbSmF2YV0gQWRkIHBhdGNoICMyMTUyNjkxIGZyb20gTUFUU1VVUkEgVGFrYW5vcmkgd2hpY2ggZml4ZXMgY29tcGlsZXMgdXNpbmcgdGhlCgkgICAgSW50ZWwgY29tcGlsZXIKCjIwMDgtMTEtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBwYXRjaCAjMjEyODI0OSBmcm9tIEFuYXRvbHkgVGVjaHRvbmlrIHdoaWNoIGNvcnJlY3RzIHRoZSBDL0MrKyBwcm94eQogICAgICAgICAgICBjbGFzcyBiZWluZyByZXBvcnRlZCBmb3IgUHl0aG9uIGRvY3N0cmluZ3Mgd2hlbiAlcmVuYW1lIGlzIHVzZWQuCgoyMDA4LTExLTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgdGhlIHN0cmlwIGVuY29kZXIgcGF0Y2ggZnJvbSBBbmF0b2x5IFRlY2h0b25payAjMjEzMDAxNi4gVGhpcyBlbmFibGVzIGFuIAogICAgICAgICAgICBlYXN5IHdheSB0byByZW5hbWUgc3ltYm9scyBieSBzdHJpcHBpbmcgYSBjb21tb25seSB1c2VkIHByZWZpeCBpbiBhbGwgdGhlCiAgICAgICAgICAgIGZ1bmN0aW9uL3N0cnVjdCBuYW1lcy4gSXQgd29ya3MgaW4gdGhlIHNhbWUgd2F5IGFzIHRoZSBvdGhlciBlbmNvZGVycywgc3VjaCBhcwogICAgICAgICAgICB0aXRsZSwgbG93ZXIsIGNvbW1hbmQgZXRjIG91dGxpbmVkIGluIENIQU5HRVMgZmlsZSBkYXRlZCAxMi8zMC8yMDA1LiBFeGFtcGxlCiAgICAgICAgICAgIGJlbG93IHdpbGwgcmVuYW1lIHd4QW5vdGhlcldpZGdldCB0byBBbm90aGVyV2lkZ2V0IGFuZCB3eERvU29tZXRoaW5nIHRvIAogICAgICAgICAgICBEb1NvbWV0aGluZzoKCiAgICAgICAgICAgICAgJXJlbmFtZSgiJShzdHJpcDpbd3hdKXMiKSAiIjsgCgogICAgICAgICAgICAgIHN0cnVjdCB3eEFub3RoZXJXaWRnZXQgewogICAgICAgICAgICAgICAgICB2b2lkIHd4RG9Tb21ldGhpbmcoKTsKICAgICAgICAgICAgICB9OwoKMjAwOC0wOS0yNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIExvdHMgb2YgdGVzdC1zdWl0ZSB3b3JrLgoJICAgIC0gRml4IG9yZGVyaW5nIG9mIHdyYXBwZXIgb3V0cHV0IGFuZCAleyAlfSBoZWFkZXIgb3V0cHV0LgoJICAgIC0gRml4IGRlY2xhcmF0aW9ucyBvZiBsb2NhbCB2YXJzIGluIEMgd3JhcHBlcnMuCgkgICAgLSBGaXggZGVjbGFyYXRpb24gb2YgZGVmaW5lZCBjb25zdGFudHMgaW4gQyB3cmFwcGVycy4KCSAgICAtIEZpeCBkZWNsYXJhdGlvbiBvZiBFbnVtVmFsdWVzIGluIEMgd3JhcHBlcnMuCgkgICAgLSBhZGQgc29tZSBjb25zdCB0eXBlbWFwcyB0byBhbGxlZ3JvY2wuc3dnCgkgICAgLSBhZGQgcmVuYW1lIGZvciBvcGVyYXRvciBib29sKCkgb3ZlcmxvYWRzLgoJCjIwMDgtMDktMjU6IG9sbHkKCSAgICBbUEhQNV0gRmlsbCBpbiB0eXBlbWFwcyBmb3IgU1dJR1RZUEUgYW5kIHZvaWQgKiAoU0YjMjA5NTE4NikuCgoyMDA4LTA5LTIyOiBtdXRhbmRpeiAoTWlrZWwgQmFuY3JvZnQpCgkgICAgW2FsbGVncm9jbF0KCSAgICAtIFN1cHBvcnQgd3JhcHBpbmcgb2YgdHlwZXMgd2hvc2UgZGVmaW5pdGlvbnMgYXJlIG5vdCBzZWVuIGJ5CgkgICAgU1dJRy4gVGhleSBhcmUgdHJlYXRlZCBhcyBmb3J3YXJkLXJlZmVyZW5jZWQgY2xhc3NlcyBhbmQgaWYgYQoJICAgIGRlZmluaXRpb24gaXMgbm90IHNlZW4gYXJlIHRyZWF0ZWQgYXMgKCogOnZvaWQpLgoJICAgIC0gRG9uJ3Qgd3JhcCB0aGUgY29udGVudHMgb2YgdW5uYW1lZCBuYW1lc3BhY2VzLgoJICAgIC0gTW9yZSBjb2RlIGNsZWFudXAuIFJlbW92ZWQgc29tZSBleHRyYW5lb3VzIHdhcm5pbmdzLgoJICAgIC0gc3RhcnQgd29yayBvbiBoYXZpbmcgdGhlIGFsbGVncm9jbCBtb2QgcGFzcyB0aGUgY3BwIHRlc3Qtc3VpdGUuCgoyMDA4LTA5LTE5OiBvbGx5CgkgICAgW1BIUDVdIEFkZCB0eXBlbWFwcyBmb3IgbG9uZyBsb25nIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcuCgoyMDA4LTA5LTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFkZGVkIEMjIGFycmF5IHR5cGVtYXBzIHByb3ZpZGVkIGJ5IEFudHRpIEthcmFudGEuCiAgICAgICAgICAgIFRoZSBhcnJheXMgcHJvdmlkZSBhIHdheSB0byB1c2UgTWFyc2hhbEFzKFVubWFuYWdlZFR5cGUuTFBBcnJheSkKICAgICAgICAgICAgYW5kIHBpbm5pbmcgdGhlIGFycmF5IHVzaW5nICdmaXhlZCcuIFNlZSBhcnJheXNfY3NoYXJwLmkgbGlicmFyeSBmaWxlCiAgICAgICAgICAgIGZvciBkZXRhaWxzLgoKMjAwOC0wOS0xODogd3NmdWx0b24KCSAgICBEb2N1bWVudCB0aGUgb3B0aW9uYWwgbW9kdWxlIGF0dHJpYnV0ZSBpbiB0aGUgJWltcG9ydCBkaXJlY3RpdmUsCiAgICAgICAgICAgIHNlZSBNb2R1bGVzLmh0bWwuIEFkZCBhIHdhcm5pbmcgZm9yIFB5dGhvbiB3cmFwcGVycyB3aGVuIHRoZQogICAgICAgICAgICBtb2R1bGUgbmFtZSBmb3IgYW4gaW1wb3J0ZWQgYmFzZSBjbGFzcyBpcyBtaXNzaW5nLCByZXF1aXJpbmcgdGhlCiAgICAgICAgICAgIG1vZHVsZSBhdHRyaWJ1dGUgdG8gYmUgYWRkZWQgdG8gJWltcG9ydCwgZWcgCgogICAgICAgICAgICAgICVpbXBvcnQobW9kdWxlPSJGb29Nb2R1bGUiKSBmb28uaAoKMjAwOC0wOS0xODogb2xseQoJICAgIFtQSFA1XSBDaGFuZ2UgdGhlIGRlZmF1bHQgaW5wdXQgdHlwZW1hcCBmb3IgY2hhciAqIHRvIHR1cm4gUEhQCgkgICAgTnVsbCBpbnRvIEMgTlVMTCAocHJldmlvdXNseSBpdCB3YXMgY29udmVydGVkIHRvIGFuIGVtcHR5IHN0cmluZykuCgkgICAgVGhlIG5ldyBiZWhhdmlvdXIgaXMgY29uc2lzdGVudCB3aXRoIGhvdyB0aGUgY29ycmVzcG9uZGluZyBvdXRwdXQKCSAgICB0eXBlbWFwIHdvcmtzIChTRiMyMDI1NzE5KS4KCgkgICAgSWYgeW91IHdhbnQgdG8ga2VlcCB0aGUgb2xkIGJlaGF2aW91ciwgYWRkIHRoZSBmb2xsb3dpbmcgdHlwZW1hcAoJICAgIHRvIHlvdXIgaW50ZXJmYWNlIGZpbGUgKFBIUCdzIGNvbnZlcnRfdG9fc3RyaW5nX2V4KCkgZnVuY3Rpb24gZG9lcwoJICAgIHRoZSBjb252ZXJ0aW5nIGZyb20gUEhQIE51bGwgdG8gYW4gZW1wdHkgc3RyaW5nKToKCgkgICAgJXR5cGVtYXAoaW4pIGNoYXIgKiB7CgkJY29udmVydF90b19zdHJpbmdfZXgoJGlucHV0KTsKCQkkMSA9IFpfU1RSVkFMX1BQKCRpbnB1dCk7CgkgICAgfQoKMjAwOC0wOS0xODogb2xseQoJICAgIFtQSFA1XSBGaXggZXh0cmEgY29kZSBhZGRlZCB0byBwcm94eSBjbGFzcyBjb25zdHJ1Y3RvcnMgaW4gdGhlIGNhc2UKCSAgICB3aGVyZSB0aGUgb25seSBjb25zdHJ1Y3RvciB0YWtlcyBubyBhcmd1bWVudHMuCgoyMDA4LTA5LTE4OiBvbGx5CgkgICAgW1BIUDVdIEZpeCB3cmFwcGluZyBvZiBhIHJlbmFtZWQgZW51bWVyYXRlZCB2YWx1ZSBvZiBhbiBlbnVtIGNsYXNzCgkgICAgbWVtYmVyIChTRiMyMDk1MjczKS4KCjIwMDgtMDktMTc6IG11dGFuZGl6IChNaWtlbCBCYW5jcm9mdCkKCSAgICBbYWxsZWdyb2NsXQoJICAgIC0gRml4IGhvdyBmb3J3YXJkIHJlZmVyZW5jZSB0eXBlZGVmcyBhcmUgaGFuZGxlZCwgc28gYXMgbm90IHRvIGNvbmZsaWN0CgkgICAgd2l0aCBvdGhlciBsZWdpdCB0eXBlZGVmcy4KCSAgICAtIERvbid0IChmb3Igbm93KSBwZXJmb3JtIGFuIGZmaXR5cGUgdHlwZW1hcCBsb29rdXAgd2hlbiB0cnlpbmcgdG8KCSAgICB3aGVuIGNhbGxpbmcgY29tcG9zZV9mb3JlaWduX3R5cGUoKS4gVGhpcyBpcyBhY3R1YWxseSBhIHVzZWZ1bCB0aGluZwoJICAgIHRvIGRvIGluIGNlcnRhaW4gY2FzZXMsIHRoZSB0ZXN0IGNhc2VzIGZvciB3aGljaCBJIGNhbid0IGN1cnJlbnRseQoJICAgIGxvY2F0ZSA6Ly4gSXQncyBicmVha2luZyBzb21lIHdyYXBwaW5nIGJlaGF2aW9yIHRoYXQgaXMgbW9yZSBjb21tb25seQoJICAgIHNlZW4sIGhvd2V2ZXIuIEknbGwgcmVhZGQgaW4gYSBtb3JlIGFwcHJvcHJpYXRlIHdheSB3aGVuIEkgY2FuCgkgICAgcmVjcmVhdGUgdGhlIG5lZWRlZCB0ZXN0IGNhc2UsIG9yIGEgdXNlciBjb21wbGFpbnMgKHdoaWNoIG1lYW5zCgkgICAgdGhleSBwcm9iYWJseSBoYXZlIGEgdGVzdCBjYXNlKS4KCSAgICAtIGRvY3VtZW50IHRoZSAtaXNvbGF0ZSBjb21tYW5kLWxpbmUgYXJnIGluIHRoZSAnc3dpZyAtaGVscCcgb3V0cHV0LgoJICAgIEl0IHdhcyBpbiB0aGUgaHRtbCBkb2NzLCBidXQgbm90IHRoZXJlLgoJICAgIC0gc21hbGwgYW1vdW50IG9mIGNvZGUgY2xlYW51cCwgcmVtb3ZlZCBzb21lIHVudXNlZCBjb2RlLgoJICAgIC0gc29tZSBtaW5vciBhZXN0aGV0aWMgY2hhbmdlcy4KCjIwMDgtMDktMTI6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBQeXRob24gMy4wIHN1cHBvcnQgYnJhbmNoIG1lcmdlZCBpbnRvIFNXSUcgdHJ1bmsuIFRoYW5rcyB0bwogICAgICAgICAgICBHb29nbGUgU3VtbWVyIG9mIENvZGUgMjAwOCBmb3Igc3VwcG9ydGluZyB0aGlzIHByb2plY3QhIEJ5IGRlZmF1bHQKICAgICAgICAgICAgU1dJRyB3aWxsIGdlbmVyYXRlIGludGVyZmFjZSBmaWxlcyBjb21wYXRpYmxlIHdpdGggYm90aCBQeXRob24gMi54CiAgICAgICAgICAgIGFuZCAzLjAuIEFuZCB0aGVyZSdzIGFsc28gc29tZSBQeXRob24gMyBuZXcgZmVhdHVyZXMgdGhhdCBjYW4gYmUKICAgICAgICAgICAgZW5hYmxlZCBieSBwYXNzaW5nIGEgIi1weTMiIGNvbW1hbmQgbGluZSBvcHRpb24gdG8gU1dJRy4gVGhlc2UKICAgICAgICAgICAgZmVhdHVyZXMgYXJlOgoKICAgICAgICAgICAgICAtIEZ1bmN0aW9uIGFubm90YXRpb24gc3VwcG9ydAogICAgICAgICAgICAgICAgICBBbHNvLCB0aGUgcGFyYW1ldGVyIGxpc3Qgb2YgcHJveHkgZnVuY3Rpb24gd2lsbCBiZSBnZW5lcmF0ZWQsCiAgICAgICAgICAgICAgICAgIGV2ZW4gd2l0aG91dCB0aGUgIi1weTMiIG9wdGlvbi4gSG93ZXZlciwgdGhlIHBhcmFtZXRlciBsaXN0CiAgICAgICAgICAgICAgICAgIHdpbGwgZmFsbGJhY2sgdG8gKmFyZ3MgaWYgdGhlIGZ1bmN0aW9uIChvciBtZXRob2QpIGlzIG92ZXJsb2FkZWQuCiAgICAgICAgICAgICAgLSBCdWZmZXIgaW50ZXJmYWNlIHN1cHBvcnQKICAgICAgICAgICAgICAtIEFic3RyYWN0IGJhc2UgY2xhc3Mgc3VwcG9ydAoKICAgICAgICAgICAgRm9yIGRldGFpbHMgb2YgUHl0aG9uIDMgc3VwcG9ydCBhbmQgdGhlc2UgZmVhdHVyZXMsIHBsZWFzZSBzZWUgdGhlCiAgICAgICAgICAgICJQeXRob24gMyBTdXBwb3J0IiBzZWN0aW9uIGluIHRoZSAiU1dJRyBhbmQgUHl0aG9uIiBjaGFwdGVyIG9mIHRoZSBTV0lHCiAgICAgICAgICAgIGRvY3VtZW50YXRpb24uCgogICAgICAgICAgICBUaGUgIi1hcHBseSIgY29tbWFuZCBsaW5lIG9wdGlvbiBhbmQgc3VwcG9ydCBvZiBnZW5lcmF0aW5nIGNvZGVzCiAgICAgICAgICAgIHVzaW5nIGFwcGx5KCkgaXMgcmVtb3ZlZC4gU2luY2UgdGhpcyBpcyBvbmx5IHJlcXVpcmVkIGJ5IHZlcnkgb2xkCiAgICAgICAgICAgIFB5dGhvbi4KCiAgICAgICAgICAgIFRoaXMgbWVyZ2UgYWxzbyBwYXRjaGVkIFNXSUcncyBwYXJzZXIgdG8gc29sdmUgYSBidWcuIEJ5IHRoaXMgcGF0Y2gsCiAgICAgICAgICAgIFNXSUcgZmVhdHVyZXMgYWJsZSB0byBiZSBjb3JyZWN0bHkgYXBwbGllZCBvbiBDKysgY29udmVyc2lvbiBvcGVyYXRvciwKICAgICAgICAgICAgc3VjaCBsaWtlIHRoaXM6CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgJWZlYXR1cmUoInNoYWRvdyIpICAqOjpvcGVyYXRvciBib29sICV7IC4uLiAlfQoKMjAwOC0wOS0wMjogcmljaGFyZGIKCSAgICBbUHl0aG9uXSBDb21taXQgcGF0Y2ggIzIwODkxNDk6IERpcmVjdG9yIGV4Y2VwdGlvbiBoYW5kbGluZyBtYW5nbGVzCgkgICAgcmV0dXJuZWQgZXhjZXB0aW9uLiAgRXhjZXB0aW9ucyByYWlzZWQgYnkgUHl0aG9uIGNvZGUgaW4gZGlyZWN0b3JzCgkgICAgYXJlIG5vdyBwYXNzZWQgdGhyb3VnaCB0byB0aGUgY2FsbGVyIHdpdGhvdXQgY2hhbmdlLiAgQWxzbywgcmVtb3ZlCgkgICAgdGhlICI6ICIgcHJlZml4IHdoaWNoIHVzZWQgdG8gYmUgYWRkZWQgdG8gb3RoZXIgZGlyZWN0b3IgZXhjZXB0aW9ucwoJICAgIChlZywgdGhvc2UgZHVlIHRvIGluY29ycmVjdCByZXR1cm4gdHlwZXMpLgoKMjAwOC0wOS0wMjogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQ29tbWl0IHBhdGNoICMxOTg4Mjk2IEdDSXRlbSBtdWx0aXBsZSBtb2R1bGUgbGlua2luZyBpc3N1ZSB3aGVuIHVzaW5nIAogICAgICAgICAgICBkaXJlY3RvcnMuCgoyMDA4LTA5LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFN1cHBvcnQgZm9yICd1c2luZycgYW5kICdmaXhlZCcgYmxvY2tzIGluIHRoZSAnY3NpbicgdHlwZW1hcCBpcyBub3cKICAgICAgICAgICAgcG9zc2libGUgdGhyb3VnaCB0aGUgdXNlIG9mIHRoZSBwcmUgYXR0cmlidXRlIGFuZCB0aGUgbmV3IHRlcm1pbmF0b3IgYXR0cmlidXRlLCBlZwoKICAgICAgICAgICAgICAldHlwZW1hcChjc2luLCAKICAgICAgICAgICAgICAgICAgICAgICBwcmU9IiAgICB1c2luZyAoQ0RhdGUgdGVtcCRjc2lucHV0ID0gbmV3IENEYXRlKCRjc2lucHV0KSkgeyIsCiAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYXRvcj0iICAgIH0gLy8gdGVybWluYXRlIHRlbXAkY3NpbnB1dCB1c2luZyBibG9jayIsCiAgICAgICAgICAgICAgICAgICAgICApIGNvbnN0IENEYXRlICYKICAgICAgICAgICAgICAgICAgICAgICAiJGNzY2xhc3NuYW1lLmdldENQdHIodGVtcCRjc2lucHV0KSIKCiAgICAgICAgICAgIFNlZSBDU2hhcnAuaHRtbCBmb3IgbW9yZSBpbmZvLgoKMjAwOC0wOS0wMTogd3NmdWx0b24KICAgICAgICAgICAgW0NGRkldIENvbW1pdCBwYXRjaCAjMjA3OTM4MSBzdWJtaXR0ZWQgYnkgQm9yaXMgU21pbGdhIC0gY29uc3RhbnQgZXhwcnMgcHV0IGludG8gCiAgICAgICAgICAgIG5vLWV2YWwgY29udGV4dCBpbiBERUZDRU5VTQoKMjAwOC0wOC0wMjogd3V6emViCiAgICAgICAgICAgIFtDaGlja2VuLEFsbGVncm9dIENvbW1pdCBQYXRjaCAyMDE5MzE0CiAgICAgICAgICAgIEZpeGVzIGEgYnVpbGQgZXJyb3IgaW4gY2hpY2tlbiwgYW5kIHNldmVyYWwgYnVpbGQgZXJyb3JzIGFuZCBvdGhlciBlcnJvcnMKICAgICAgICAgICAgaW4gQWxsZWdybyBDTAoKMjAwOC0wNy0xOTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGJ1aWxkaW5nIG9mIFRjbCBleGFtcGxlcy90ZXN0LXN1aXRlIG9uIE1hYyBPUyBYIHJlcG9ydGVkIGJ5IEdpZGVvbiBTaW1wc29uLgoKMjAwOC0wNy0xNzogd3NmdWx0b24KICAgICAgICAgICAgRml4IFNGICMyMDE5MTU2IENvbmZpZ3VyaW5nIHdpdGggLS13aXRob3V0LW9jdGF2ZSBvciAtLXdpdGhvdXQtYWxsbGFuZwogICAgICAgICAgICBkaWQgbm90IGRpc2FibGUgb2N0YXZlLgoKMjAwOC0wNy0xNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBGaXggZGlyZWN0b3IgdHlwZW1hcHMgZm9yIHBvaW50ZXJzIHNvIHRoYXQgTlVMTCBwb2ludGVycyBhcmUgY29ycmVjdGx5IAogICAgICAgICAgICBtYXJzaGFsbGVkIHRvIEMjL0phdmEgbnVsbCBpbiBkaXJlY3RvciBtZXRob2RzLgoKMjAwOC0wNy0wNDogb2xseQoJICAgIFtQSFBdIEZvciBzdGRfdmVjdG9yLmkgYW5kIHN0ZF9tYXAuaSwgcmVuYW1lIGVtcHR5KCkgdG8gaXNfZW1wdHkoKQoJICAgIHNpbmNlICJlbXB0eSIgaXMgYSBQSFAgcmVzZXJ2ZWQgd29yZC4gIEJhc2VkIG9uIHBhdGNoIGZyb20gTWFyayBLbGVpbgoJICAgIGluIFNGIzE5NDM0MTcuCgoyMDA4LTA3LTA0OiBvbGx5CgkgICAgW1BIUF0gVGhlIGRlcHJlY2F0ZWQgY29tbWFuZCBsaW5lIG9wdGlvbiAiLW1ha2UiIGhhcyBiZWVuIHJlbW92ZWQuICAKCSAgICBTZWFyY2hlcyBvbiBHb29nbGUgY29kZXNlYXJjaCBzdWdnZXN0IHRoYXQgbm9ib2R5IGlzIHVzaW5nIGl0IG5vdwoJICAgIGFueXdheS4KCjIwMDgtMDctMDQ6IG9sbHkKCSAgICBbUEhQXSBUaGUgU1dJRyBjZGF0YS5pIGxpYnJhcnkgbW9kdWxlIGlzIG5vdyBzdXBwb3J0ZWQuCgoyMDA4LTA3LTAzOiBvbGx5CgkgICAgW1BIUF0gVGhlIGRlcHJlY2F0ZWQgY29tbWFuZCBsaW5lIG9wdGlvbiAiLXBocGZ1bGwiIGhhcyBiZWVuCgkgICAgcmVtb3ZlZC4gIFdlIHJlY29tbWVuZCBidWlsZGluZyB5b3VyIGV4dGVuc2lvbiBhcyBhIGR5bmFtaWNhbGx5CgkgICAgbG9hZGFibGUgbW9kdWxlLgoKMjAwOC0wNy0wMjogb2xseQoJICAgIFtQSFA0XSBTdXBwb3J0IGZvciBQSFA0IGhhcyBiZWVuIHJlbW92ZWQuICBUaGUgUEhQIGRldmVsb3BlcnMgYXJlCgkgICAgbm8gbG9uZ2VyIG1ha2luZyBuZXcgUEhQNCByZWxlYXNlcywgYW5kIHdvbid0IGV2ZW4gYmUgcHJvdmlkaW5nCgkgICAgcGF0Y2hlcyBmb3IgY3JpdGljYWwgc2VjdXJpdHkgaXNzdWVzIGFmdGVyIDIwMDgtMDgtMDguCgoyMDA4LTA3LTAyOiBvbGx5CgkgICAgW1B5dGhvbl0gSW1wb3J0IHRoZSBDIGV4dGVuc2lvbiBkaWZmZXJlbnRseSBmb3IgUHl0aG9uIDIuNiBhbmQKCSAgICBsYXRlciBzbyB0aGF0IGFuIGltcGxpY2l0IHJlbGF0aXZlIGltcG9ydCBkb2Vzbid0IHByb2R1Y2UgYQoJICAgIGRlcHJlY2F0aW9uIHdhcm5pbmcgZm9yIDIuNiBhbmQgYSBmYWlsdXJlIGZvciAyLjcgYW5kIGxhdGVyLgoJICAgIFBhdGNoIGZyb20gUmljaGFyZCBCb3VsdG9uIGluIFNGIzIwMDgyMjksIHBsdXMgZm9sbG93LXVwIHBhdGNoZXMKCSAgICBmcm9tIFJpY2hhcmQgYW5kIEhhb3l1IEJhaS4KClZlcnNpb24gMS4zLjM2ICgyNCBKdW5lIDIwMDgpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowNi8yNC8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBSZW1vdmUgZGVwcmVjYXRlZCAtYyBjb21tYW5kbGluZSBvcHRpb24gKHJ1bnRpbWUgbGlicmFyeSBnZW5lcmF0aW9uKS4KCjA2LzI0LzIwMDg6IG9sbHkKCSAgICBbUEhQXSBGaXggYXNzZXJ0aW9uIGZhaWx1cmUgd2hlbiBoYW5kbGluZyAldHlwZW1hcChpbixudW1pbnB1dHM9MCkKCSAgICAodGVzdGNhc2UgaWdub3JlX3BhcmFtZXRlcikuCgowNi8yNC8yMDA4OiBvbGx5CgkgICAgW1BIUF0gRml4IHNlZ2ZhdWx0IHdoZW4gd3JhcHBpbmcgYSBub24tY2xhc3MgZnVuY3Rpb24gbWFya2VkIHdpdGgKCSAgICAlbmV3b2JqZWN0ICh0ZXN0Y2FzZSBjaGFyX3N0cmluZ3MpLgoKMDYvMjIvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEFkZCBhIHdheSB0byB1c2UgQXR0YWNoQ3VycmVudFRocmVhZEFzRGFlbW9uIGluc3RlYWQgb2YgQXR0YWNoQ3VycmVudFRocmVhZAogICAgICAgICAgICBpbiBkaXJlY3RvciBjb2RlLiBEZWZpbmUgdGhlIFNXSUdfSkFWQV9BVFRBQ0hfQ1VSUkVOVF9USFJFQURfQVNfREFFTU9OIG1hY3JvLCBzZWUKICAgICAgICAgICAgTGliL2phdmEvZGlyZWN0b3Iuc3dnLgoKMDYvMjEvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEZpeCBjcmFzaGluZyBpbiB0aGUgU1RMIHdyYXBwZXJzIChyZWplY3QhIGFuZCBkZWxldGVfaWYgbWV0aG9kcykKCjA2LzE5LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gQyMgYW5kIEphdmEga2V5d29yZHMgd2lsbCBiZSByZW5hbWVkIGluc3RlYWQgb2YganVzdCBpc3N1aW5nIGEgd2FybmluZwogICAgICAgICAgICBhbmQgdGhlbiBnZW5lcmF0aW5nIHVuY29tcGlsYWJsZSBjb2RlLiBXYXJuaW5nIDMxNCBnaXZlcyB0aGUgbmV3IG5hbWUgd2hlbiBhIAogICAgICAgICAgICBrZXl3b3JkIGlzIGZvdW5kLgoKMDYvMTkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1JdIEtleXdvcmQgaGFuZGxpbmcgYWRkZWQuIFIgS2V5d29yZHMgd2lsbCBiZSByZW5hbWVkIGFzIG5lY2Vzc2FyeS4KICAgICAgICAgICAgV2FybmluZyAzMTQgZ2l2ZXMgdGhlIG5ldyBuYW1lIHdoZW4gYSBrZXl3b3JkIGlzIGZvdW5kLgoKMDYvMTcvMjAwODogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gQWRkZWQgbWlzc2luZyBzdXBwb3J0IGZvciBib29sJiBhbmQgYm9vbCouIEFkZGVkIHJ1bnRlc3QgZm9yIGxpX3R5cGVtYXBzIHRlc3RjYXNlLgogICAgICAgICAgICAoQnVnICMxOTM4MTQyKQoKMDYvMDcvMjAwODogYmh5CiAgICAgICAgICAgIEFkZGVkIHRlc3QgY2FzZSBrZXl3b3JkX3JlbmFtZSwgdGhlbiBtYWRlIHRoZSBrZXl3b3JkIHJlbmFtaW5nIHdvcmtzIHByb3Blcmx5CiAgICAgICAgICAgIGJ5IGZpeGluZyBTd2lnX25hbWVfbWFrZSgpIGZvciBhIGluY29tcGxldGUgY29uZGl0aW9uIGNoZWNraW5nLgoKMDYvMDIvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBGaXggZW51bSB3cmFwcGVycyB3aGVuIHVzaW5nIC1ub3Byb3h5LgoKMDUvMzAvMjAwODogYmh5CiAgICAgICAgICAgIEFkZGVkIHN0ZDo6d3N0cmluZyBpbnRvIExpYi90eXBlbWFwcy9wcmltdHlwZXMuc3dnLCBzaW5jZSBpdCBpcyBhbHNvIGEgcHJpbWl0aXZlIAogICAgICAgICAgICB0eXBlIGluIFNXSUcgLSBmaXhlZCBTRiAjMTk3Njk3OC4KCjA1LzI5LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gRml4IHZhcmlhYmxlIHdyYXBwZXJzIHdoZW4gdXNpbmcgLW5vcHJveHkuCgowNS8yOS8yMDA4OiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4ZWQgYSB0eXBvIG9mICUjaWZkZWYgaW4gTGliL3B5dGhvbi9weWNvbnRhaW5lci5zd2csIHdoaWNoIGlzIHJlbGF0ZWQgCiAgICAgICAgICAgIHRvIC1leHRyYW5hdGl2ZSBTV0lHIG9wdGlvbiAtIFNGICMxOTcxOTc3LgoKMDUvMjAvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgTmV3IHBhcnRpYWxjaGVjayBtYWtlZmlsZSB0YXJnZXRzIGZvciBwYXJ0aWFsIHRlc3Rpbmcgb2YgdGhlIHRlc3Qtc3VpdGUuIFRoZXNlCiAgICAgICAgICAgIGp1c3QgaW52b2tlIFNXSUcsIGllIG5vIGNvbXBpbGF0aW9uIGFuZCBubyBydW50aW1lIHRlc3RpbmcuIEl0IGNhbiBiZSBmYXN0ZXIKICAgICAgICAgICAgd2hlbiBkZXZlbG9waW5nIGJ5IGp1c3QgZG9pbmcgYSBkaXJlY3RvcnkgZGlmZiBvZiB0aGUgZmlsZXMgU1dJRyBnZW5lcmF0ZXMKICAgICAgICAgICAgYWdhaW5zdCB0aG9zZSBmcm9tIGEgcHJldmlvdXMgcnVuLiBFeGFtcGxlIHVzYWdlIGZyb20gdGhlIHRvcCBsZXZlbCBkaXJlY3Rvcnk6CgogICAgICAgICAgICAgIG1ha2UgcGFydGlhbGNoZWNrLXRlc3Qtc3VpdGUKICAgICAgICAgICAgICBtYWtlIHBhcnRpYWxjaGVjay1qYXZhLXRlc3Qtc3VpdGUKCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIGFsc28gZW5jb21wYXNzZXMgbW9yZSBmbGV4aWJpbGl0eSBpbiBydW5uaW5nIHRoZSB0ZXN0LXN1aXRlLCBlZwogICAgICAgICAgICBpdCBpcyBwb3NzaWJsZSB0byBwcmVmaXggdGhlIGNvbW1hbmQgbGluZSB3aGljaCBydW5zIGFueSB0YXJnZXQgbGFuZ3VhZ2UgdGVzdAogICAgICAgICAgICB3aXRoIGEgdG9vbC4gU2VlIHRoZSBSVU5UT09MLCBDT01QSUxFVE9PTCBhbmQgU1dJR1RPT0wgdGFyZ2V0cyBpbiB0aGUgY29tbW9uLm1rCiAgICAgICAgICAgIGZpbGUgYW5kIG1ha2VmaWxlcyBpbiB0aGUgdGVzdC1zdWl0ZSBkaXJlY3RvcnkuIEZvciBleGFtcGxlIGl0IGlzIHBvc3NpYmxlIHRvIAogICAgICAgICAgICBydW4gdGhlIHJ1bnRpbWUgdGVzdHMgdGhyb3VnaCB2YWxncmluZCB1c2luZzoKCiAgICAgICAgICAgICAgbWFrZSBjaGVjayBSVU5UT09MPSJ2YWxncmluZCAtLWxlYWstY2hlY2s9ZnVsbCIKCiAgICAgICAgICAgIG9yIGludm9rZSBTV0lHIHVuZGVyIHZhbGdyaW5kIHVzaW5nOgoKICAgICAgICAgICAgICBtYWtlIGNoZWNrIFNXSUdUT09MPSJ2YWxncmluZCAtLXRvb2w9bWVtY2hlY2siCgowNS8xOS8yMDA4OiBkcmpvZQogICAgICAgICAgICBbUl0gRml4ZWQgZGVmaW5lIHRoYXQgd2FzIGJyZWFraW5nIHByZS0yLjcuICBDaGVja2VkIGluCiAgICAgICAgICAgIHBhdGNoIGZyb20gU29yZW4gU29ubmVuYnVyZyB0aGF0IGNyZWF0ZXMgc3RyaW5ncyBpbiAgCgkgICAgdmVyc2lvbiBpbmRlcGVuZGVudCB3YXkKCjA1LzE1LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggdmFyaWFibGUgbmFtZSBjbGFzaCBpbiBkaXJlY3RvcnMgLSBTRiAjMTk2MzMxNiByZXBvcnRlZCBieSBUcmlzdGFuLgoKMDUvMTQvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgQWRkIGFuIG9wdGltaXNhdGlvbiBmb3IgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIG9iamVjdHMgYnkgdmFsdWUsIHJlZHVjaW5nCiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29waWVzIG9mIHRoZSBvYmplY3QgdGhhdCBhcmUgbWFkZS4gSW1wbGVtZW50ZWQgdXNpbmcgYW4KICAgICAgICAgICAgb3B0aW9uYWwgYXR0cmlidXRlIGluIHRoZSAib3V0IiB0eXBlbWFwIGNhbGxlZCAib3B0aW1hbCIuIERldGFpbHMgaW4gCiAgICAgICAgICAgIFR5cGVtYXBzLmh0bWwuCgowNS8xMS8yMDA4OiBvbGx5CgkgICAgW1BIUF0gQ2hlY2sgZm9yICVmZWF0dXJlKCJub3RhYnN0cmFjdCIpIHdoZW4gZ2VuZXJhdGluZyBQSFA1IGNsYXNzCgkgICAgd3JhcHBlci4KCjA1LzExLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBTRiAjMTk0MzYwOCAtICRzZWxmIHN1YnN0aXR1dGlvbiBpbiAlY29udHJhY3QsIHBhdGNoIHN1Ym1pdHRlZCBieQogICAgICAgICAgICBUb29uIFZlcnN0cmFlbGVuLgoKMDUvMDkvMjAwODogb2xseQoJICAgIFtQSFBdIEZpeCBjaGFyICogdHlwZW1hcHMgdG8gd29yayB3aGVuIGFwcGxpZWQgdG8gc2lnbmVkIGNoYXIgKiBhbmQKCSAgICB1bnNpZ25lZCBjaGFyICogKHVuY292ZXJlZCBieSB0ZXN0Y2FzZSBhcHBseV9zdHJpbmdzKS4KCjA1LzA5LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB3cmFwcGluZyBvZiBjaGFyICogbWVtYmVyIHZhcmlhYmxlcyB3aGVuIHVzaW5nIGFsbHByb3RlY3RlZCBtb2RlLgogICAgICAgICAgICBCdWcgcmVwb3J0ZWQgYnkgV2FycmVuIFdhbmcuCgowNS8wOS8yMDA4OiBvbGx5CgkgICAgW1BIUF0gRml4IGJhZCBQSFAgY29kZSBnZW5lcmF0ZWQgd2hlbiB3cmFwcGluZyBhbiBlbnVtIGluIGEKCSAgICBuYW1lc3BhY2UgKHVuY292ZXJlZCBieSB0ZXN0Y2FzZSBhcnJheXNfc2NvcGUpLgoKMDUvMDkvMjAwODogb2xseQoJICAgIFtQSFBdIFNXSUcgbm93IHJ1bnMgdGhlIFBIUCB0ZXN0c3VpdGUgdXNpbmcgUEhQNSwgbm90IFBIUDQuICBQSFA0CgkgICAgaXMgZXNzZW50aWFsbHkgb2Jzb2xldGUgbm93LCBzbyB3ZSBjYXJlIG11Y2ggbW9yZSBhYm91dCBzb2xpZCBQSFA1CgkgICAgc3VwcG9ydC4KCjA1LzA3LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFNUTCBmaXhlcyB3aGVuIHVzaW5nICVpbXBvcnQgcmF0aGVyIHRoYW4gJWluY2x1ZGUgYW5kIHRoZSBTb2xhcmlzIFdvcmtzaG9wCiAgICAgICAgICAgIGNvbXBpbGVyIGFuZCB0aGUgUm9ndWV3YXZlIFNUTC4KCjA1LzA3LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB3cmFwcGluZyBvZiBvdmVybG9hZGVkIHByb3RlY3RlZCBtZXRob2RzIHdoZW4gdXNpbmcgYWxscHJvdGVjdGVkIG1vZGUuCiAgICAgICAgICAgIEJ1ZyByZXBvcnRlZCBieSBXYXJyZW4gV2FuZy4KCjA1LzAzLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIENvbW1pdCBwYXRjaCAjMTk1NjYwNyB0byBhZGQgLU1UIHN1cHBvcnQgZnJvbSBSaWNoYXJkIEJvdWx0b24uCiAgICAgICAgICAgIFRoaXMgcGF0Y2ggbWlycm9ycyB0aGUgZ2NjIC1NVCBvcHRpb24gd2hpY2ggYWxsb3dzIG9uZSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQKICAgICAgICAgICAgTWFrZWZpbGUgdGFyZ2V0IGJlaW5nIGdlbmVyYXRlZCB3aGVuIGdlbmVyYXRpbmcgbWFrZWZpbGVzIHdpdGggdGhlIC1NIGZhbWlseQogICAgICAgICAgICBvZiBvcHRpb25zLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJCBzd2lnIC1qYXZhIC1NTSAtTVQgb3ZlcnJpZGRlbm5hbWUgLWMrKyAgZXhhbXBsZS5pCiAgICAgICAgICAgICAgb3ZlcnJpZGRlbm5hbWU6IFwKICAgICAgICAgICAgICAgZXhhbXBsZS5pIFwKICAgICAgICAgICAgICAgZXhhbXBsZS5oIAoKMDQvMzAvMjAwODogbWdvc3NhZ2UKCSAgICBbTHVhXSBSZW1vdmVkIGdlbmVyYXRpb24gb2YgX3dyYXBfZGVsZXRlX1hYWFhYICh3cmFwcGVyZWQgZGVzdHJ1Y3RvcikKCSAgICB3aGljaCB3YXMgdW51c2VkIGFuZCBjYXVzaW5nIHdhcm5pbmcgd2l0aCBnKysgLVdhbGwuCgkgICAgUmVtb3ZlZCBvdGhlciB1bnVzZWQgd2FybmluZyBpbiB0eXBlbWFwcy5pIGFuZCBvdGhlciBwbGFjZXMuCgkgICAgQWRkZWQgRXhhbXBsZXMvbHVhL2VtYmVkMywgYW5kIHJ1biB0ZXN0cyBhIGZldyB0ZXN0IGNhc2VzLgoKMDQvMjQvMjAwODogb2xseQoJICAgIFtQeXRob25dIEZpeCBnZW5lcmF0ZWQgY29kZSBmb3IgSUJNJ3MgQysrIGNvbXBpbGVyIG9uIEFJWCAocGF0Y2gKCSAgICBmcm9tIEdvZXJhbiBVZGRlYm9yZyBpbiBTRiMxOTI4MDQ4KS4KCjA0LzI0LzIwMDg6IG9sbHkKCSAgICBSZW5hbWUgQlNJWkUgaW4gRXhhbXBsZXMvdGVzdC1zdWl0ZS9hcnJheXNfc2NvcGUuaSB0byBCQlNJWkUgdG8KCSAgICBhdm9pZCBhIGNsYXNoIHdpdGggQlNJWkUgZGVmaW5lZCBieSBoZWFkZXJzIG9uIEFJWCB3aXRoIFBlcmwKCSAgICAocmVwb3J0ZWQgaW4gU0YjMTkyODA0OCkuCgowNC8yMC8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgdGhlIGFiaWxpdHkgdG8gd3JhcCBhbGwgcHJvdGVjdGVkIG1lbWJlcnMgd2hlbiB1c2luZyBkaXJlY3RvcnMuCiAgICAgICAgICAgIFByZXZpb3VzbHkgb25seSB0aGUgdmlydHVhbCBtZXRob2RzIHdlcmUgYXZhaWxhYmxlIHRvIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuCiAgICAgICAgICAgIE5vdyBhbGwgcHJvdGVjdGVkIG1lbWJlcnMsIChzdGF0aWMgYW5kIG5vbi1zdGF0aWMgdmFyaWFibGVzLCBub24tdmlydHVhbCBtZXRob2RzCiAgICAgICAgICAgIGFuZCBzdGF0aWMgbWV0aG9kcykgYXJlIHdyYXBwZWQgd2hlbiB1c2luZyB0aGUgYWxscHJvdGVjdGVkIG1vZGUuIFRoZSBhbGxwcm90ZWN0ZWQKICAgICAgICAgICAgbW9kZSBpcyB0dXJuZWQgb24gaW4gdGhlIG1vZHVsZSBkZWNsYXJhdGlvbjoKCiAgICAgICAgICAgICAgJW1vZHVsZShkaXJlY3RvcnM9IjEiLCBhbGxwcm90ZWN0ZWQ9IjEiKSBtb2R1bGVuYW1lCgpWZXJzaW9uIDEuMy4zNSAoNyBBcHJpbCAyMDA4KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDQvMDcvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gQWRkIG1pc3NpbmcgcG9pbnRlciByZWZlcmVuY2UgdHlwZW1hcHMKCjA0LzA2LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzdGFjayBvdmVyZmxvdyB3aGVuIHVzaW5nIHR5cGVtYXAgd2FybmluZyBzdXBwcmVzc2lvbiwgZWcgCiAgICAgICAgICAgICAgJXdhcm5maWx0ZXIoU1dJR1dBUk5fVFlQRU1BUF9DSEFSTEVBS19NU0cpCgowNC8wNS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggc2hhcmVkX3B0ciB0eXBlbWFwcyBzbyB0aGF0ICVweXRob25ub25keW5hbWljIGNhbiBiZSB1c2VkLiBBbHNvIGNvcnJlY3RzCiAgICAgICAgICAgIGRpc3BsYXkgb2YgdGhlIHByb3h5IGNsYXNzIHR5cGUuIFJlcG9ydGVkIGJ5IFJvYmVydCBMdXB0b24uCgowNC8wNC8yMDA4OiBvbGx5CgkgICAgW1B5dGhvbl0gQWRkICVuZXdvYmplY3QgcmVmZXJlbmNlIHRvIHB5dGhvbiBtZW1vcnkgbWFuYWdlbWVudCBzdWJzZWN0aW9uIG9mIG1hbnVhbAoJICAgIChwYXRjaCBmcm9tIG1kYmVhY2h5IGluIFNGIzE4OTQ2MTApLgoKMDMvMjcvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4IHNoYXJlZF9wdHIgdHlwZW1hcHMgd2hlcmUgdGhlIHBvaW50ZXIgdHlwZSBpcyBhIHRlbXBsYXRlZCB0eXBlIHdpdGgKICAgICAgICAgICAgd2l0aCBtb3JlIHRoYW4gb25lIHBhcmFtZXRlci4gUmVwb3J0ZWQgYnkgUm9iZXJ0IEx1cHRvbi4KCjAzLzI3LzIwMDg6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEFkZGVkIGEgdHlwZW1hcCBESVNPV04gZm9yIFNXSUdUWVBFKiBhbmQgU1dJR1RZUEVbXSwgYW5kIHN1cHBvcnQgZm9yICVkZWxvYmplY3QgZmVhdHVyZS4KICAgICAgICAgICAgQWRkZWQgRXhhbXBsZXMvbHVhL293bmVyIHdoaWNoIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIHRoZSBtZW1vcnkgbWFuYWdlbWVudC4KCjAzLzI2LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBBcHBseSBwYXRjaCAjMTg0NDMwMSBmcm9tIE1vbnR5IFRheWxvciB0byBzdXBwcmVzcyBlbnVtIGNvbnN0cnVjdG9yCiAgICAgICAgICAgIHVudXNlZCB3YXJuaW5ncy4KCjAzLzI2LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFwcGx5IHBhdGNoICMxOTI0NTI0IGZyb20gQ2FzZXkgUmF5bW9uZHNvbiB3aGljaCBlbnN1cmVzIHRoZQogICAgICAgICAgICAiTm8gY29uc3RydWN0b3IgZGVmaW5lZCIgbWVzc2FnZSBpcyBkaXNwbGF5ZWQgd2hlbiBhdHRlbXB0aW5nIHRvIGNhbGwgYQogICAgICAgICAgICBjb25zdHJ1Y3RvciBvbiBhIGNsYXNzIHRoYXQgZG9lc24ndCBoYXZlIGEgY29uc3RydWN0b3Igd3JhcHBlciwgZWcgaWYKICAgICAgICAgICAgdGhlIEMrKyBjbGFzcyBpcyBhYnN0cmFjdC4KCjAzLzI2LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFwcGx5IHBhdGNoICMxOTI1NzAyIGZyb20gQ2FzZXkgUmF5bW9uZHNvbiB3aGljaCByZW1vdmVzIHdhcm5pbmcgNTEyCiAgICAgICAgICAgIGZvciBzdGQ6OnZlY3RvciB3cmFwcGVycy4KCjAzLzI2LzIwMDg6IG9sbHkKCSAgICBbUHl0aG9uXSBBcHBseSBHQ0MgNC4zIHdhcm5pbmdzIHBhdGNoIGZyb20gUGhpbGlwcCBUaG9tYXMKCSAgICAoU0YjMTkyNTEyMikuCgowMy8yMS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBUaHJlYWQgc2FmZXR5IHBhdGNoIGZvciBTVEwgaXRlcmF0b3JzIGZyb20gQWJoaW5hbmRhbiBKYWluLgoKMDMvMTcvMjAwODogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gQWRkZWQgJWx1YWNvZGUgZmVhdHVyZSB0byBhZGQgc291cmNlIGNvZGUgaW50byB3cmFwcGVycy4KICAgICAgICAgICAgVXBkYXRlZCBkb2N1bWVudGF0aW9uIHRvIGRvY3VtZW50IHRoaXMuCiAgICAgICAgICAgIEFkZGVkIEV4YW1wbGVzL2x1YS9hcnJheXMgdG8gc2hvdyBpdHMgdXNlIChhbmQgdHlwZW1hcHMpCgowMy8xNy8yMDA4OiBvbGx5CgkgICAgRml4IG5vbnBvcnRhYmxlIHNlZCB1c2FnZSB3aGljaCBmYWlsZWQgb24gTWFjIE9TIFggKGFuZCBwcm9iYWJseQoJICAgIG90aGVyIHBsYXRmb3JtcykuICBGaXhlcyBTRiMxOTAzNjEyLgoKMDMvMTcvMjAwODogb2xseQoJICAgIEZpeCBtZW1vcnkgbGVhayBpbiBTV0lHJ3MgcGFyc2VyIChiYXNlZCBvbiBwYXRjaCBmcm9tIFJ1c3NlbGwKCSAgICBCcnlhbnQgaW4gU0YjMTkxNDAyMykuCgowMy8xMi8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggYnVnICMxODc4Mjg1IC0gdW5uZWNlc3NhcnkgY2FzdCBmb3IgQyBzdHJ1Y3QgY3JlYXRpb24gd3JhcHBlcnMuCgowMy8xMi8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBSZW1vdmUgZGVidWdnaW5nIGluZm8gd2hlbiB1c2luZyBzaGFyZWRfcHRyIHN1cHBvcnQKCjAzLzA2LzIwMDg6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIFVwZGF0ZWQgZG9jdW1lbnRhdGlvbiBmb3IgTHVhIGV4Y2VwdGlvbnMuCiAgICAgICAgICAgIEFkZGVkIEV4YW1wbGVzL2x1YS9leGNlcHRpb24gYW5kIEV4YW1wbGVzL2x1YS9lbWJlZDIuCiAgICAgICAgICAgIFNtYWxsIHVwZGF0ZXMgdG8gdGhlIHR5cGVtYXBzLgoKMDMvMDQvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBBZGQgY2hhciAqJiB0eXBlbWFwcy4KCjAzLzA0LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBvY2Nhc2lvbmFsIHNlZyBmYXVsdCB3aGVuIGF0dGVtcHRpbmcgdG8gcmVwb3J0IG92ZXJsb2FkZWQgbWV0aG9kcyBhcyBiZWluZyBpZ25vcmVkLgoKMDIvMjkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIEZpeCAjMTkwNDUzNyBTd2lnIGNhdXNlcyBhIFBlcmwgd2FybmluZyAieCB1c2VkIG9ubHkgb25jZSIgaW4gUGVybCA1LjEwCiAgICAgICAgICAgIHJlcG9ydGVkIGJ5IEFyaSBKb2xtYQoKMDIvMjkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQWRkIHNoYXJlZF9wdHIgdmFyaW4vdmFyb3V0IHR5cGVtYXBzIGZvciB3cmFwcGluZyBnbG9iYWwgdmFyaWFibGVzLgoKMDIvMjUvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgRml4ICR3cmFwbmFtZSB0byB3b3JrIGluICVleGNlcHRpb24gKGZpeGVzIHNvbWUgd3JhcDpuYW1lIGFzc2VydGlvbnMpCgpWZXJzaW9uIDEuMy4zNCAoMjcgRmVicnVhcnkgMjAwOCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowMi8xMy8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gRml4IHdyYXBwaW5nIG9mIGdsb2JhbCBmdW5jdGlvbiBwb2ludGVyIHZhcmlhYmxlcy4KCjAyLzEzLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBuZXcgc3BlY2lhbCB2YXJpYWJsZXMgZm9yIHVzZSB3aXRoaW4gJWV4Y2VwdGlvbjoKICAgICAgICAgICAgICAkd3JhcG5hbWUgLSBsYW5ndWFnZSBzcGVjaWZpYyB3cmFwcGVyIG5hbWUKICAgICAgICAgICAgICAkb3Zlcm5hbWUgLSBpZiBhIG1ldGhvZCBpcyBvdmVybG9hZGVkIHRoaXMgY29udGFpbnMgdGhlIGV4dHJhIG1hbmdsaW5nIHVzZWQgb24gCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG92ZXJsb2FkZWQgbWV0aG9kCiAgICAgICAgICAgICAgJGRlY2wgICAgIC0gdGhlIGZ1bGx5IHF1YWxpZmllZCBDL0MrKyBkZWNsYXJhdGlvbiBvZiB0aGUgbWV0aG9kIGJlaW5nIHdyYXBwZWQgCiAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aG91dCB0aGUgcmV0dXJuIHR5cGUKICAgICAgICAgICAgICAkZnVsbGRlY2wgLSB0aGUgZnVsbHkgcXVhbGlmaWVkIEMvQysrIGRlY2xhcmF0aW9uIG9mIHRoZSBtZXRob2QgYmVpbmcgd3JhcHBlZCAKICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRpbmcgdGhlIHJldHVybiB0eXBlCgowMi8xMi8yMDA4OiBkcmpvZQogICAgICAgICAgICBbUl0gTm93IHNldHRpbmcgUzQgZmxhZyBpbiBTV0lHIGNyZWF0ZWQgb2JqZWN0cy4gIFRoaXMKICAgICAgICAgICAgZml4ZXMgUi1TV0lHIGZvciAyLjYgYW5kIHdhcm5pbmcgZm9yIDIuNiBmYWlsdXJlIGhhcyBiZWVuIHJlbW92ZWQuCgowMi8xMS8yMDA4OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBBZGRlZCBhIHBhdGNoIGJ5IFRvcnN0ZW4gTGFuZHNjaG9mZiB0byBmaXggdGhlIHVuYXJ5IG1pbnVzIGlzc3VlCiAgICAgICAgICAgIFJhbiAnYXN0eWxlIC0tc3R5bGU9a3IgLTInIGFjcm9zcyBsdWEuY3h4IHRvIG5lYXRlbiBpdCB1cAoKMDIvMTAvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgQnVtcCBTV0lHX1JVTlRJTUVfVkVSU0lPTiB0byA0LiBUaGlzIGlzIGJlY2F1c2Ugb2YgdGhlIHJlY2VudGx5IGludHJvZHVjZWQgQVBJIAogICAgICAgICAgICBjaGFuZ2UgaW4gdGhlIGNvbnZlcnNpb24gZnVuY3Rpb25zLCBpZSBjaGFuZ2UgaW4gZGVmaW5pdGlvbiBvZiBzd2lnX2NvbnZlcnRlcl9mdW5jLgogICAgICAgICAgICBBbnlvbmUgY2FsbGluZyBTV0lHX1R5cGVDYXN0IG11c3QgcGFzcyBpbiBhIHZhbGlkIHZhbHVlIGZvciB0aGUgbmV3IGFkZGl0aW9uYWwKICAgICAgICAgICAgKHRoaXJkKSBwYXJhbWV0ZXIgYW5kIHRoZW4gaGFuZGxlIHRoZSBuZXdseSBjcmVhdGVkIG1lbW9yeSBpZiB0aGUgcmV0dXJuZWQgdmFsdWUKICAgICAgICAgICAgaXMgc2V0IHRvIFNXSUdfQ0FTVF9ORVdfTUVNT1JZIGVsc2UgYSBtZW1vcnkgbGVhayB3aWxsIGVuc3VlLgoKMDIvMDkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRXhwZXJpbWVudGFsIHNoYXJlZF9wdHIgdHlwZW1hcHMgYWRkZWQuIFVzYWdlIGlzIHRoZSBzYW1lIGFzIHRoZSByZWNlbnRseQogICAgICAgICAgICBhZGRlZCBKYXZhIGFuZCBDIyBzaGFyZWRfcHRyIHR5cGVtYXBzLiBUd28gbWFjcm9zIGFyZSBhdmFpbGFibGUsIGFsdGhvdWdoIHRoZXNlCiAgICAgICAgICAgIG1heSB3ZWxsIGNoYW5nZSBpbiBhIGZ1dHVyZSB2ZXJzaW9uOgoKICAgICAgICAgICAgRm9yIGJhc2UgY2xhc3NlcyBvciBjbGFzc2VzIG5vdCBpbiBhbiBpbmhlcml0YW5jZSBjaGFpbjoKICAgICAgICAgICAgICBTV0lHX1NIQVJFRF9QVFIoUFJPWFlDTEFTUywgVFlQRSkKICAgICAgICAgICAgRm9yIGRlcml2ZWQgY2xhc3NlczoKICAgICAgICAgICAgICBTV0lHX1NIQVJFRF9QVFJfREVSSVZFRChQUk9YWUNMQVNTLCBCQVNFQ0xBU1NUWVBFLCBUWVBFKQoKICAgICAgICAgICAgVGhlIFBST1hZQ0xBU1MgaXMgdGhlIG5hbWUgb2YgdGhlIHByb3h5IGNsYXNzLCBidXQgaXMgb25seSByZXF1aXJlZCBmb3IgSmF2YS9DIy4KICAgICAgICAgICAgRXhhbXBsZSB1c2FnZToKCiAgICAgICAgICAgICAgJWluY2x1ZGUgImJvb3N0X3NoYXJlZF9wdHIuaSIKCiAgICAgICAgICAgICAgU1dJR19TSEFSRURfUFRSKEtsYXNzLCBTcGFjZTo6S2xhc3MpCiAgICAgICAgICAgICAgU1dJR19TSEFSRURfUFRSX0RFUklWRUQoS2xhc3NEZXJpdmVkLCBTcGFjZTo6S2xhc3MsIFNwYWNlOjpLbGFzc0Rlcml2ZWQpCgogICAgICAgICAgICAgIG5hbWVzcGFjZSBTcGFjZSB7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgS2xhc3MgeyAuLi4gfTsKICAgICAgICAgICAgICAgIHN0cnVjdCBLbGFzc0Rlcml2ZWQgOiBLbGFzcyB7IC4uLiB9OwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEZ1cnRoZXIgZGV0YWlscyB0byBmb2xsb3cgaW4gZnV0dXJlIGRvY3VtZW50YXRpb24sIGJ1dCB0aGUgZm9sbG93aW5nIGZlYXR1cmVzCiAgICAgICAgICAgIHNob3VsZCBiZSBub3RlZDoKCiAgICAgICAgICAgIC0gTm90IHJlc3RyaWN0ZWQgdG8gYm9vc3Q6OnNoYXJlZF9wdHIsIGVnIHN0ZDo6dHIxOjpzaGFyZWRfcHRyIGNhbiBhbHNvIGJlIHVzZWQuCiAgICAgICAgICAgIC0gQXZhaWxhYmxlIHR5cGVtYXAgZ3JvdXBzOgogICAgICAgICAgICAgIChhKSBUeXBlbWFwcyBmb3Igc2hhcmVkX3B0ciBwYXNzZWQgYnkgdmFsdWUsIHJlZmVyZW5jZSwgcG9pbnRlciBhbmQgcG9pbnRlciAKICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlLgogICAgICAgICAgICAtIChiKSBUeXBlbWFwcyBmb3IgcGFzc2luZyBieSByYXcgdmFsdWUsIHJhdyBwb2ludGVyLCByYXcgcmVmZXJlbmNlLCByYXcgcG9pbnRlcgogICAgICAgICAgICAgICAgICByZWZlcmVuY2UuIAogICAgICAgICAgICAtIFRoZSBjb2RlIGJlaW5nIHdyYXBwZWQgZG9lcyBub3QgZXZlbiBoYXZlIHRvIHVzZSBzaGFyZWRfcHRyLCBTV0lHIGNhbiB1c2UKICAgICAgICAgICAgICBzaGFyZWRfcHRyIGFzIHRoZSB1bmRlcmx5aW5nIHN0b3JhZ2UgbWVjaGFuaXNtIGluc3RlYWQgb2YgYSByYXcgcG9pbnRlciBkdWUgdG8gCiAgICAgICAgICAgICAgdGhlIHR5cGVtYXBzIGluIGdyb3VwIChiKSBhYm92ZS4KICAgICAgICAgICAgLSBObyBhcnJheSBzdXBwb3J0IGFzIHNoYXJlZF9wdHIgZG9lcyBub3Qgc3VwcG9ydCBhcnJheXMuCiAgICAgICAgICAgIC0gVGhpcyB3b3JrcyBxdWl0ZSBkaWZmZXJlbnRseSB0byB0aGUgdXN1YWwgU1dJRyBzbWFydCBwb2ludGVyIHN1cHBvcnQgd2hlbgogICAgICAgICAgICAgIG9wZXJhdG9yLT4gaXMgcGFyc2VkIGJ5IFNXSUc6CiAgICAgICAgICAgICAgLSBBbiBhZGRpdGlvbmFsIHNtYXJ0IHBvaW50ZXIgY2xhc3MgaXMgbm90IGdlbmVyYXRlZCByZWR1Y2luZyBjb2RlIGJsb2F0IGluCiAgICAgICAgICAgICAgICB0aGUgd3JhcHBlcnMuCiAgICAgICAgICAgICAgLSBVc2luZyBzbWFydCBwb2ludGVycyBhbmQgcmF3IHBvaW50ZXJzIGNhbiBiZSBtaXhlZCBzZWFtbGVzc2x5LgogICAgICAgICAgICAgIC0gTWlzc2luZyBjb25zdHJ1Y3RvcnMgZm9yIHRoZSBzbWFydCBwb2ludGVycyBpcyBubyBsb25nZXIgYSBwcm9ibGVtIGFuZCBzbwogICAgICAgICAgICAgICAgc2VwYXJhdGUgZmFjdG9yeSB0eXBlIGZ1bmN0aW9ucyBkbyBub3QgaGF2ZSB0byBiZSB3cml0dGVuIGFuZCB3cmFwcGVkLgogICAgICAgICAgICAgIC0gVGhlIGltcGxpY2l0IEMrKyBzaGFyZWRfcHRyPCBkZXJpdmVkIGNsYXNzID4gdG8gc2hhcmVkX3B0cjwgYmFzZSBjbGFzcyA+CiAgICAgICAgICAgICAgICBjYXN0IGFsc28gd29ya3MgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4gVGhpcyBuZWdhdGVzIHRoZSBuZWNlc3NpdHkgdG8gd3JpdGUKICAgICAgICAgICAgICAgIGFuIGV4cGxpY2l0IGhlbHBlciBjYXN0IGZ1bmN0aW9uIHByb3ZpZGluZyB0aGUgdXBjYXN0IHdoaWNoIHdvdWxkIG5lZWQKICAgICAgICAgICAgICAgIGNhbGxpbmcgcHJpb3IgdG8gcGFzc2luZyBhIGRlcml2ZWQgY2xhc3MgdG8gYSBtZXRob2QgdGFraW5nIGEgc2hhcmVkX3B0ciB0bwogICAgICAgICAgICAgICAgYSBiYXNlIGNsYXNzLgoKMDIvMDkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQWRkIHN1cHBvcnQgZm9yIG92ZXJyaWRpbmcgdGhlIGNsYXNzIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbiB2aWEgYSBuZXcKICAgICAgICAgICAgInNtYXJ0cHRyIiBmZWF0dXJlLiBUaGlzIGlzIGEgdmVyeSBsb3cgbGV2ZWwgb2YgY3VzdG9taXNhdGlvbiBtb3N0IHVzZXJzCiAgICAgICAgICAgIHdvdWxkIG5ldmVyIG5lZWQgdG8ga25vdy4gVGhlIGZlYXR1cmUgd2lsbCB0eXBpY2FsbHkgYmUgdXNlZCBmb3IgaW50cnVzaXZlIAogICAgICAgICAgICBzbWFydCBwb2ludGVycyBhbG9uZyB3aXRoIGFkZGl0aW9uYWwgdHlwZW1hcHMuIEV4YW1wbGUgdXNhZ2Ugb2YgdGhlIGZlYXR1cmU6CgogICAgICAgICAgICAgICVmZWF0dXJlKCJzbWFydHB0ciIsIG5vYmxvY2s9MSkgRm9vIHsgYm9vc3Q6OnNoYXJlZF9wdHI8IEZvbyA+IH0KICAgICAgICAgICAgICBjbGFzcyBGb28ge307CgogICAgICAgICAgICBUaGUgZ2VuZXJhdGVkIEZvb19zd2lncmVnaXN0ZXIgZnVuY3Rpb24gd2lsbCB0aGVuIHJlZ2lzdGVyIGJvb3N0OjpzaGFyZWQgPCBGb28gPgogICAgICAgICAgICAoU1dJR1RZUEVfcF9ib29zdF9fc2hhcmVkX3B0clRGb29fdCBpbnN0ZWFkIG9mIFNXSUdUWVBFX3BfRm9vKSBhcyB0aGUgdW5kZXJseWluZwogICAgICAgICAgICB0eXBlIGZvciBpbnN0YW50aWF0aW9ucyBvZiBGb28uCgowMi8wOS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGZWF0dXJlcyBub3cgc3VwcG9ydHMgdGhlIG9wdGlvbmFsICdub2Jsb2NrJyBhdHRyaWJ1dGUgZm9yIGFsbCB1c2FnZSBvZiAlZmVhdHVyZS4gCiAgICAgICAgICAgIFdoZW4gc3BlY2lmaWVkLCB0aGUgeyB9IGJyYWNlcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBmZWF0dXJlIGNvZGUuIFRoaXMgaXMgaWRlbnRpY2FsCiAgICAgICAgICAgIGluIGJlaGF2aW91ciB0byB1c2FnZSBvZiAnbm9ibG9jaycgaW4gdHlwZW1hcHMgYW5kIGlzIHVzZWQgd2hlbiB0aGUgcHJlcHJvY2Vzc29yCiAgICAgICAgICAgIGlzIHJlcXVpcmVkIHRvIG9wZXJhdGUgb24gdGhlIGNvZGUgaW4gdGhlIGZlYXR1cmUgYW5kIHRoZSBlbmNsb3NpbmcgeyB9IGJyYWNlcwogICAgICAgICAgICBhcmUgbm90IHJlcXVpcmVkLiBFeGFtcGxlOgoKICAgICAgICAgICAgICAjZGVmaW5lIEZPTyBmb28KICAgICAgICAgICAgICAlZmVhdHVyZSgic21hcnRwdHIiLCBub2Jsb2NrPSIxIikgeyBGT086OmJhciB9CgogICAgICAgICAgICBUaGUgcHJlcHJvY2Vzc29yIHRoZW4gcmVkdWNlcyB0aGlzIGFzIGlmIHRoaXMgaGFkIGJlZW4gdXNlZCBpbnN0ZWFkOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgic21hcnRwdHIiKSAiZm9vOjpiYXIiCgowMi8wMS8yMDA4OiBvbGx5CgkgICAgW1B5dGhvbl0gRml4IGZvcm1hdCBzdHJpbmcgYnVnIChTRiMxODgyMjIwKS4KCjAxLzMxLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZGl0aW9ucyB0byB0aGUgJXR5cGVzIGRpcmVjdGl2ZS4gTm93IHRoZSBjb252ZXJzaW9uIC8gY2FzdGluZyBjb2RlIGNhbiBiZQogICAgICAgICAgICBvdmVycmlkZGVuIHRvIHNvbWUgY3VzdG9tIGNvZGUgaW4gdGhlICV0eXBlcyBkaXJlY3RpdmUsIGxpa2Ugc286CgogICAgICAgICAgICAgICV0eXBlcyhmcm9tdHlwZSA9IHRvdHlwZSkgJXsKICAgICAgICAgICAgICAgIC4uLiBjb2RlIHRvIGNvbnZlcnQgZnJvbXR5cGUgdG8gdG90eXBlIGFuZCByZXR1cm4gLi4uCiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFRoZSBzcGVjaWFsIHZhcmlhYmxlICRmcm9tIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciBvZiB0aGUKICAgICAgICAgICAgdHlwZSBiZWluZyBjb252ZXJ0ZWQgZnJvbS4gVGhlIGNvZGUgbXVzdCByZXR1cm4gdGhlIHRvdHlwZSBjYXN0IHRvIHZvaWQgKi4gRXhhbXBsZToKCiAgICAgICAgICAgICAgY2xhc3MgVGltZTsKICAgICAgICAgICAgICBjbGFzcyBEYXRlOwogICAgICAgICAgICAgIERhdGUgJlRpbWU6OmRhdGVGcm9tVGltZSgpOwoKICAgICAgICAgICAgICAldHlwZXMoVGltZSA9IERhdGUpICV7CiAgICAgICAgICAgICAgICBUaW1lICp0ID0gKFRpbWUgKikkZnJvbTsKICAgICAgICAgICAgICAgIERhdGUgJmQgPSB0LT5kYXRlRnJvbVRpbWUoKTsKICAgICAgICAgICAgICAgIHJldHVybiAodm9pZCAqKSAmZDsKICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgcmVzdWx0aW5nIGluIHRoZSBjb252ZXJzaW9uIC8gY2FzdGluZyBjb2RlIGxvb2tpbmcgc29tZXRoaW5nIGxpa2U6CgogICAgICAgICAgICAgIHN0YXRpYyB2b2lkICpfcF9UaW1lVG9fcF9EYXRlKHZvaWQgKngpIHsKICAgICAgICAgICAgICAgIFRpbWUgKnQgPSAoVGltZSAqKXg7CiAgICAgICAgICAgICAgICBEYXRlICZkID0gdC0+ZGF0ZUZyb21UaW1lKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gKHZvaWQgKikgJmQ7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhpcyBpcyBhZHZhbmNlZCB1c2FnZSwgcGxlYXNlIHVzZSBvbmx5IGlmIHlvdSB1bmRlcnN0YW5kIHRoZSBydW50aW1lIHR5cGUgc3lzdGVtLgoKMDEvMzAvMjAwODogbWdvc3NhZ2UKCSAgICBTbWFsbCB1cGRhdGUgdG8gZG9jdW1lbnRhdGlvbiBpbiBUeXBlbWFwcy5odG1sLCB0byB3YXJuIGFib3V0IHVzZSBvZiBsb2NhbCAKCSAgICB2YXJpYWJsZXMgaW4gdHlwZW1hcHMgZm9yIG11bHRpcGxlIHR5cGVzLgoKMDEvMjUvMjAwODogd3NmdWx0b24KCSAgICBbSmF2YV0gRml4IGJ1ZyByZXBvcnRlZCBieSBLZXZpbiBNaWxscyBpbiBBUlJBWVNPRkNMQVNTRVMgdHlwZW1hcHMgd2hlcmUgYW55CiAgICAgICAgICAgIGNoYW5nZXMgbWFkZSB0byBhbiBhcnJheSBlbGVtZW50IHBhc3NlZCBmcm9tIEphdmEgdG8gQyBhcmUgbm90IHJlZmxlY3RlZCBiYWNrCiAgICAgICAgICAgIGludG8gSmF2YS4KCjAxLzI0LzIwMDg6IG1nb3NzYWdlCgkgICAgTW9yZSB1cGRhdGVzIHRvIHRoZSBjb25maWd1cmUgc2NyaXB0IGZvciBkZXRlY3RpbmcgbHVhLgoJICAgIEFsc28gbG9va3MgaW4gL3Vzci9pbmNsdWRlL2x1YSoKCSAgICBBbHNvIGNoYW5nZWQgdHlwZW1hcHMuaSBub3QgdG8gY2hlY2sgZm9yIE5VTEwgYmVmb3JlIGZyZWVpbmcgYSBwb2ludGVyCgowMS8yMS8yMDA4OiB3c2Z1bHRvbgoJICAgIFtQeXRob25dIEZvciBTVEwgY29udGFpbmVycywgU1dJRyBubyBsb25nZXIgYXR0ZW1wdHMgdG8gY29udmVydCBmcm9tIG9uZQogICAgICAgICAgICBTVEwgY29udGFpbmVyIHRvIGFub3RoZXIsIGVnIGZyb20gc3RkOjp2ZWN0b3I8aW50PiB0byBzdGQ6OnZlY3Rvcjxkb3VibGU+CiAgICAgICAgICAgIG9yIHN0ZDo6bGlzdDxpbnQ+IHRvIHN0ZDo6dmVjdG9yPGludD4gb3IgZXZlbiBzdGQ6OnZlY3RvcjxGb28+IHRvCiAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEJhcj4gYXMgaXQgcHJldmlvdXNseSBkaWQuIEluIGZhY3QgU1dJRyBubyBsb25nZXIgYXR0ZW1wdHMgdG8KICAgICAgICAgICAgY29udmVydCBhbnkgU1dJRyB3cmFwcGVkIEMrKyBwcm94eSBjbGFzcyB0aGF0IGlzIGFsc28gYSBQeXRob24gc2VxdWVuY2UsCiAgICAgICAgICAgIHdoZXJlYXMgcHJldmlvdXNseSBpdCB3b3VsZC4gQW55IG5vbi1TV0lHIFB5dGhvbiBzZXF1ZW5jZSB3aWxsIHN0aWxsIGJlCiAgICAgICAgICAgIGFjY2VwdGVkIHdoZXJldmVyIGFuIFNUTCBjb250YWluZXIgaXMgYWNjZXB0ZWQuIE92ZXJsb2FkZWQgbWV0aG9kcyB1c2luZwogICAgICAgICAgICBjb250YWluZXJzIHNob3VsZCBiZSBmYXN0ZXIuCgowMS8xOC8yMDA4OiB3c2Z1bHRvbgoJICAgIFtDI10gQWRkICdkaXJlY3RvcmluYXR0cmlidXRlcycgYW5kICdkaXJlY3Rvcm91dGF0dHJpYnV0ZXMnIHR5cGVtYXAgYXR0cmlidXRlcwogICAgICAgICAgICBmb3IgdGhlIGltdHlwZSB0eXBlbWFwLiBUaGVzZSBzaG91bGQgY29udGFpbiBDIyBhdHRyaWJ1dGVzIHdoaWNoIHdpbGwKICAgICAgICAgICAgYmUgZ2VuZXJhdGVkIGludG8gdGhlIEMjIGRpcmVjdG9yIGRlbGVnYXRlIG1ldGhvZHMuCgowMS8xOC8yMDA4OiBvbGx5CgkgICAgRml4IGhhbmRsaW5nIG9mIGJ5dGUgdmFsdWUgMjU1IGluIGlucHV0IGZpbGVzIG9uIHBsYXRmb3JtcyB3aGVyZQoJICAgIGNoYXIgaXMgc2lnbmVkIChpdCB3YXMgZ2V0dGluZyBtYXBwZWQgdG8gRU9GKS4gIEZpeGVzIFNGIzE1MTgyMTkuCgowMS8xNi8yMDA4OiB3c2Z1bHRvbgoJICAgIEZpeCB0ZW1wbGF0ZSBtZW1iZXIgdmFyaWFibGVzIHdyYXBwZWQgYnkgYSBzbWFydCBwb2ludGVyLiBCdWcgcmVwb3J0ZWQgCiAgICAgICAgICAgIGJ5IFJvYmVydCBMdXB0b24uCgowMS8xNC8yMDA4OiBtZ29zc2FnZQoJICAgIFN1YnN0YW50aWFsIGNoYW5nZXMgdG8gY29uZmlndXJlIHNjcmlwdCBmb3IgZGV0ZWN0aW5nIGx1YS4KCSAgICAgIENvZGUgY2FuIG5vdyBsaW5rIHRvIGxpYmx1YS5hLCBsaWJsdWE1MC5hIG9yIGxpYmx1YTUxLmEKCSAgICAgIEl0J3MgYWxzbyBhIGxvdCBuZWF0ZXIgbm93LgoKMTIvMTYvMjAwNzogd3NmdWx0b24KCSAgICBbUGVybF0gQmFja2VkIG91dCAjMTc5ODcyOCAtIG51bWJlcnMgY2FuIGJlIHBhc3NlZCB0byBmdW5jdGlvbnMgdGFraW5nIGNoYXIgKgoKMTIvMTYvMjAwNzogd3NmdWx0b24KCSAgICBGaXggIzE4MzI2MTMgLSBUZW1wbGF0ZXMgYW5kIHNvbWUgdHlwZWRlZnMgaW52b2x2aW5nIHBvaW50ZXJzIG9yIGZ1bmN0aW9uIHBvaW50ZXJzCgoxMi8xMi8yMDA3OiB3c2Z1bHRvbgoJICAgIFtKYXZhXSBGaXggIzE2MzI2MjUgLSBDb21waWxhdGlvbiBlcnJvcnMgb24gVmlzdWFsIEMrKyA2IHdoZW4gdXNpbmcgZGlyZWN0b3JzLgoKMTIvMTIvMjAwNzogd3NmdWx0b24KCSAgICBbUGVybF0gRml4ICMxNzk4NzI4IC0gbnVtYmVycyBjYW4gYmUgcGFzc2VkIHRvIGZ1bmN0aW9ucyB0YWtpbmcgY2hhciAqLgoKMTIvMTIvMjAwNzogd3NmdWx0b24KCSAgICBGaXggIzE4MTk4NDcgJXRlbXBsYXRlIHdpdGgganVzdCBvbmUgZGVmYXVsdCB0ZW1wbGF0ZSBwYXJhbWV0ZXIgCgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQgPSBpbnQ+IGNsYXNzIEZvbyB7Li4ufTsKICAgICAgICAgICAgICAldGVtcGxhdGUoRm9vRGVmYXVsdCkgRm9vPD47CgoxMi8xMi8yMDA3OiBtZ29zc2FnZQoJICAgIFtMdWFdIFNtYWxsIGNvcnJlY3Rpb24gb24gTHVhLmh0bWwKCjEyLzA5LzIwMDc6IHdzZnVsdG9uCgkgICAgQXBwbHkgcGF0Y2ggIzE4MzgyNDggZnJvbSBNb250eSBUYXlsb3IgZm9yIHZwYXRoIGJ1aWxkcyBvZiBTV0lHLgoKMTIvMDgvMjAwNzogd3NmdWx0b24KCSAgICBbTHVhXSBGaXhlcyB0byByZW1vdmUgZ2NjLTQuMiB3YXJuaW5ncwoKMTIvMDYvMjAwNzogd3NmdWx0b24KCSAgICBGaXggIzE3MzQ0MTUgLSB0ZW1wbGF0ZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgc3VjaCBhczoKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgdF9pdGVtLCB0ZW1wbGF0ZTx0eXBlbmFtZT4gY2xhc3MgdF9hbGxvYyA9IHBmYzo6YWxsb2NfZmFzdCA+CiAgICAgICAgICAgICAgICBjbGFzcyBsaXN0X3QgOiBwdWJsaWMgbGlzdF9pbXBsX3Q8dF9pdGVtLHBmYzo6YXJyYXlfdDx0X2l0ZW0sdF9hbGxvYz4gPiB7IC4uLiB9OwoKMTIvMDQvMjAwNzogbWdvc3NhZ2UKCSAgICBbbHVhXSBGaXggYSBidWcgaW4gdGhlIGNsYXNzIGhpZXJhY2h5IGNvZGUsIHdoZXJlIHRoZSBtZXRob2RzIHdlcmUgbm90IHByb3BhZ2F0ZWQsIAoJICAgIGlmIHRoZSBuYW1lIG9yZGVyaW5nIHdhcyBpbiBhIGNlcnRhaW4gb3JkZXIuCgkgICAgQWRkZWQgbmV3IGV4YW1wbGUgcHJvZ3JhbXMgKGR1YWwsIGVtYmVkKSBhbmQgcnVudGltZSB0ZXN0cyBmb3IgdGVzdC1zdWl0ZS4KCjExLzMwLzIwMDc6IHdzZnVsdG9uCgkgICAgRml4IHVzaW5nIHN0YXRlbWVudHMgdXNpbmcgYSBiYXNlIGNsYXNzIG1ldGhvZCB3aGVyZSB0aGUgbWV0aG9kcyB3ZXJlIG92ZXJsb2FkZWQuCiAgICAgICAgICAgIERlcGVuZGluZyBvbiB0aGUgb3JkZXIgb2YgdGhlIHVzaW5nIHN0YXRlbWVudHMgYW5kIG1ldGhvZCBkZWNsYXJhdGlvbnMsIHRoZXNlCiAgICAgICAgICAgIHdlcmUgcHJldmlvdXNseSBnZW5lcmF0aW5nIHVuY29tcGlsYWJsZSB3cmFwcGVycywgZWc6CgogICAgICAgICAgICAgIHN0cnVjdCBEZXJpdmVkIDogQmFzZSB7CiAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZnVuaygpOwogICAgICAgICAgICAgICAgdXNpbmcgQmFzZTo6ZnVuazsKICAgICAgICAgICAgICB9OwoKVmVyc2lvbiAxLjMuMzMgKE5vdmVtYmVyIDIzLCAyMDA3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMS8yMS8yMDA3OiBtaWtlbAoJICAgIFthbGxlZ3JvY2xdIG9taXQgcHJpdmF0ZSBzbG90IHR5cGUgaW5mbyBpbiB0aGUgY2xhc3Nlcy90eXBlcwoJICAgIGRlZmluZWQgb24gdGhlIGxpc3Agc2lkZS4gRml4IGJ1ZyBpbiBtYXBwaW5nIG9mIEMvKysgdHlwZXMKCSAgICB0byBsaXNwIHR5cGVzLiBGaXggdHlwbyBpbiBtb2R1bGVzIGdlbmVyYXRlZCBkZWZwYWNrYWdlIGZvcm0uCgkgICAgSGF2ZSBzdGQ6OnN0cmluZyAqJ3MgYXV0b21hdGljYWxseSBtYXJzaGFsbGVkIGJldHdlZW4gZm9yZWlnbgoJICAgIGFuZCBsaXNwIHN0cmluZ3MuCgkKMTEvMjAvMjAwNzogb2xseQoJICAgIFtQeXRob25dIEZpbGwgaW4gUHl0aG9uIERpY3Rpb25hcnkgZnVuY3Rpb25zIGxpc3QgKHBhdGNoIGZyb20KCSAgICBKZWxtZXIgVmVybm9vaWogcG9zdGVkIHRvIHN3aWctZGV2ZWwpLgoKMTEvMjAvMjAwNzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIGJ1ZyBpbiB0aGUgQyBzY2FubmVyIHJlbGF0ZWQgdG8gYmFja3NsYXNoIGNoYXJhY3RlcnMuCgoxMS8xOS8yMDA3OiB3c2Z1bHRvbgoJICAgIFtQZXJsXSBGaXggYnJva2VuIGNvbXBpbGF0aW9uIG9mIEMrKyB3cmFwcGVycyBvbiBzb21lIGNvbXBpbGVycy4KCjExLzE2LzIwMDc6IG9sbHkKCSAgICBbUHl0aG9uXSBEb24ndCBwYXNzIFB5X3NzaXplX3QgZm9yIGEgJWQgcHJpbnRmLWxpa2UgZm9ybWF0IGFzCgkgICAgdGhhdCdzIHVuZGVmaW5lZCBiZWhhdmlvdXIgd2hlbiBzaXplb2YoUHlfc3NpemVfdCkgIT0gc2l6ZW9mKGludCkuCgpWZXJzaW9uIDEuMy4zMiAoTm92ZW1iZXIgMTUsIDIwMDcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjExLzE0LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSXSBQYWNrYWdlIG5hbWUgYW5kIGRsbCBuYW1lIGlzIG5vdyB0aGUgc2FtZSBhcyB0aGUgU1dJRyBtb2R1bGUKICAgICAgICAgICAgbmFtZS4gSXQgdXNlZCB0byBiZSB0aGUgbW9kdWxlIG5hbWUgd2l0aCBfd3JhcCBhcyBhIHN1ZmZpeC4gVGhlIHBhY2thZ2UKICAgICAgICAgICAgYW5kIGRsbCBuYW1lcyBjYW4gYmUgbW9kaWZpZWQgdXNpbmcgdGhlIC1wYWNrYWdlIGFuZCAtZGxsIGNvbW1hbmRsaW5lCiAgICAgICAgICAgIG9wdGlvbnMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjExLzExLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSXSBBZGQgc3VwcG9ydCBmb3IgV2luZG93cyAoVmlzdWFsIEMrKyA4IHRlc3RlZCkKCjExLzEwLzIwMDc6IG9sbHkKCSAgICBbcGhwXSBGaXggbWFrZWZpbGUgZ2VuZXJhdGVkIGJ5IC1tYWtlIChTRiMxNjMzNjc5KS4gIFVwZGF0ZQoJICAgIGRvY3VtZW50YXRpb24gdG8gbWFyayAiLW1ha2UiIGFzIGRlcHJlY2F0ZWQgKG5vbmUgb2YgdGhlIG90aGVyCgkgICAgU1dJRyBiYWNrZW5kcyBzZWVtIHRvIG9mZmVyIHN1Y2ggYSBmZWF0dXJlLCBpdCBjYW4ndCByZWFsaXN0aWNhbGx5CgkgICAgZ2VuZXJhdGUgYSBmdWxseSBwb3J0YWJsZSBtYWtlZmlsZSwgYW5kIHRoZSBjb21tYW5kcyB0byBidWlsZCBhbgoJICAgIGV4dGVuc2lvbiBhcmUgZWFzeSBlbm91Z2ggdG8gd3JpdGUgZm9yIHRoZSB1c2VyJ3MgcHJlZmVycmVkIGJ1aWxkCgkgICAgdG9vbCkuICBBbHNvIHJlY29tbWVuZCBhZ2FpbnN0IHRoZSB1c2Ugb2YgIi1waHBmdWxsIiAoaXQncyBvbmx5CgkgICAgcmVhbGx5IHVzZWZ1bCB3aGVuIHN0YXRpYyBsaW5raW5nLCBhbmQgYSBkeW5hbWljYWxseSBsb2FkYWJsZQoJICAgIG1vZHVsZSBpcyB2aXJ0dWFsbHkgYWx3YXlzIHRoZSBiZXR0ZXIgYXBwcm9hY2gpLgoKMTEvMDkvMjAwNzogb2xseQoJICAgIEZpeCAtLWhlbHAgb3V0cHV0IHRvIG5vdGUgdGhhdCBgZXhwb3J0IFNXSUdfRkVBVFVSRVMnIGlzIHJlcXVpcmVkLgoKMTAvMjkvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW1JdIEZpeCBzZWcgZmF1bHQgb24gV2luZG93cwogICAgICAgICAgICBbUl0gRXhhbXBsZXMgUiBzY3JpcHRzIGFyZSBub3cgcGxhdGZvcm0gaW5kZXBlbmRlbnQKCjEwLzMwLzIwMDc6IG1nb3NzYWdlCgkgICAgW2x1YV0gZml4ZWQgYnVnIGluIHRlbXBsYXRlIGNsYXNzZXMgd2hpY2ggY2FzZXMgdGVtcGxhdGVfZGVmYXVsdDIKCSAgICBhbmQgdGVtcGxhdGVfc3BlY2lhbGl6YXRpb25fZGVmYXJnIHRvIGZhaWwuCgkgICAgQWRkZWQgc2V2ZXJhbCB3YXJuaW5nIGZpbHRlcnMgaW50byB0aGUgb3ZlcmxvYWQncyB0ZXN0IGNhc2VzLgoJICAgIEFkZGVkIHJ1bnRpbWUgdGVzdHMgZm9yIHNldmVyYWwgY29kZXMuCgkgICAgWW91IGNhbiBub3cgbWFrZSBjaGVjay1sdWEtdGVzdC1zdWl0ZSB3aXRoIG5vIGVycm9ycyBhbmQgb25seSBhIGZldyB3YXJuaW5ncy4KCjEwLzMwLzIwMDc6IG9sbHkKCSAgICBbZ3VpbGVdIEZpeCB0aGUgY29uZmlndXJlIHRlc3QgdG8gcHV0IEdVSUxFTElOSyBpbiBMSUJTIG5vdCBMREZMQUdTCgkgICAgKFNGIzE4MjI0MzApLgoKMTAvMzAvMjAwNzogb2xseQoJICAgIFtndWlsZV0gRml4IHRoZSBndWlsZSBleGFtcGxlcyBvbiA2NC1iaXQgcGxhdGZvcm1zLgoKMTAvMjkvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggbWVtYmVyIHBvaW50ZXJzIG9uIDY0IGJpdCBwbGF0Zm9ybXMuCgoxMC8yOC8yMDA3OiBvbGx5CgkgICAgW2x1YV0gRml4IHN3aWdfbHVhX2NsYXNzIGluc3RhbmNlcyB0byBiZSBzdGF0aWMgdG8gYWxsb3cgbXVsdGlwbGUKCSAgICBTV0lHIHdyYXBwZXJzIHRvIGJlIGNvbXBpbGVkIGludG8gdGhlIHNhbWUgZXhlY3V0YWJsZSBzdGF0aWNhbGx5LgoJICAgIFBhdGNoIGZyb20gQW5kcmVhcyBGcmVkcmlrc3NvbiAocG9zdGVkIHRvIHRoZSBzd2lnIG1haWxpbmcgbGlzdCkuCgoxMC8yOC8yMDA3OiBvbGx5CgkgICAgW2x1YV0gRml4IEV4YW1wbGVzL2x1YSB0byBwYXNzIFNSQ1MgZm9yIEMgdGVzdHMgcmF0aGVyIHRoYW4gQ1hYU1JDUy4KCSAgICBUaGUgY29kZSBhcyBpdCB3YXMgaGFwcGVuZWQgdG8gd29yayBvbiB4ODYsIGJ1dCBicm9rZSBvbiB4ODZfNjQgKGFuZAoJICAgIHByb2JhYmx5IGFueSBvdGhlciBwbGF0Zm9ybXMgd2hpY2ggcmVxdWlyZSAtZlBJQykuCgoxMC8yOC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIE5ldyBhcHByb2FjaCBmb3IgZml4aW5nIHVuaW5pdGlhbGlzZWQgdmFyaWFibGUgdXNhZ2Ugb24gZXJyb3IgaW4gZGlyZWN0b3IKICAgICAgICAgICAgbWV0aG9kcyB1c2luZyB0aGUgbmV3IHRlbXBsYXRlZCBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbiBTd2lnVmFsdWVJbml0KCkuCgoxMC8yOC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gVXNlIG1vcmUgZWZmaWNpZW50IFN2UFZfbm9sZW4oeCkgaW5zdGVhZCBvZiBTdlBWKHgsUExfbmEpIGlmIFN2UFZfbm9sZW4gaXMKICAgICAgICAgICAgc3VwcG9ydGVkLgoKMTAvMjYvMjAwNzogd3V6emViCgkgICAgW0NoaWNrZW5dIEZpeCBnbG9iYWwgdmFyaWFibGVzIG9mIGNsYXNzIG1lbWJlciBmdW5jdGlvbiBwb2ludGVycy4KCSAgICBPdGhlciBtaW5vciBmaXhlcywgc28gYWxsIHRlc3RzIGluIHRoZSBjaGlja2VuIHRlc3Qgc3VpdGUgbm93IHBhc3MKCjEwLzI1LzIwMDc6IG9sbHkKCSAgICBGaXggVVRMIHR5cGVjaGVjayBtYWNybyBmb3IgYSBmdW5jdGlvbiB0YWtpbmcgY2hhcltdIG9yIGNvbnN0CgkgICAgY2hhcltdIChTRiMxODIwMTMyKS4KCjEwLzIyLzIwMDc6IG1rb2VwcGUKCSAgICBbR3VpbGVdIEZpbHRlciBvdXQgLWFuc2kgLXBlZGFudGljIGZyb20gQ0ZMQUdTIHdoaWxlIGNvbXBpbGluZyB0ZXN0IHByb2dyYW1zIGZvciBHdWlsZQoJICAgIGluIGNvbmZpZ3VyZS4gIFRoaXMgZW5hYmxlcyBydW5uaW5nIHRoZSB0ZXN0IHN1aXRlIGZvciBHdWlsZSBpZiBpdCBpcyBpbnN0YWxsZWQgYW5kCgkgICAgdXNhYmxlLgoKMTAvMjIvMjAwNzogbWtvZXBwZQoJICAgIFtHdWlsZSAtc2NtXSBGaXggdGVzdGNhc2VzIGFwcGx5X3NpZ25lZF9jaGFyIGFuZCBhcHBseV9zdHJpbmdzCgkgICAgYnkgYWRkaW5nIGV4cGxpY2l0IGNhc3RzIHRvIHRoZSBhcHByb3ByaWF0ZSAkbHR5cGUuCgoxMC8yMi8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEZpeCB1bmluaXRpYWxpc2VkIHZhcmlhYmxlIHVzYWdlIG9uIGVycm9yIGluIGRpcmVjdG9yIG1ldGhvZHMuCgoxMC8xOS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEJ1ZyAjMTc5NDI0NyAtIGZpeCBnZW5lcmF0ZWQgY29kZSBmb3IgZGVyaXZlZCBjbGFzc2VzIHdoZW4gY3NiYXNlIG9yIGphdmFiYXNlCiAgICAgICAgICAgIHR5cGVtYXBzIGFyZSB1c2VkIHdpdGggdGhlIHJlcGxhY2U9IjEiIGF0dHJpYnV0ZS4KCjEwLzE5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIERvY3MgdXBkYXRlZCB0byBzdWdnZXN0IHVzaW5nIGRpc3R1dGlscy4gUGF0Y2ggIzE3OTY2ODEgZnJvbSBDaHJpc3RvcGhlciBCYXJrZXIuCgoxMC8xOS8yMDA3OiBvbGx5CgkgICAgW3Blcmw1XSBDbGVhciBlcnJubyBiZWZvcmUgY2FsbHMgdG8gc3RydG9sKCksIHN0cnRvdWwoKSwgc3RydG9sbCgpCgkgICAgYW5kIHN0cnRvdWxsKCkgd2hpY2ggd2UgY2hlY2sgZXJybm8gYWZ0ZXIgdG8gYXZvaWQgc2VlaW5nIGEganVuawoJICAgIHZhbHVlIG9mIGVycm5vIGlmIHRoZXJlIGlzbid0IGFuIGVycm9yIGluIHRoZSBjYWxsLgoKMTAvMTYvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgRGVwcmVjYXRlICVhdHRyaWJ1dGVfcmVmIGFuZCByZXBsYWNlIHdpdGggJWF0dHJpYnV0ZXJlZi4gVGhlcmUgaXMganVzdCBhbiBhcmd1bWVudAogICAgICAgICAgICBvcmRlciBjaGFuZ2UgaW4gb3JkZXIgdG8gbWFpbnRhaW4gY29uc2lzdGVuY3kgd2l0aCAlYXR0cmlidXRlLCBmcm9tOgoKICAgICAgICAgICAgICAlYXR0cmlidXRlX3JlZihDbGFzcywgQXR0cmlidXRlVHlwZSwgQWNjZXNzb3JNZXRob2QsIEF0dHJpYnV0ZU5hbWUpCiAgICAgICAgICAgIHRvCiAgICAgICAgICAgICAgJWF0dHJpYnV0ZXJlZihDbGFzcywgQXR0cmlidXRlVHlwZSwgQXR0cmlidXRlTmFtZSwgQWNjZXNzb3JNZXRob2QpCgoxMC8xNi8yMDA3OiBvbGx5CgkgICAgW1RjbF0gRml4IHNldmVyYWwgb2NjdXJyZW5jZXMgb2YgIndhcm5pbmc6IGRlcHJlY2F0ZWQgY29udmVyc2lvbgoJICAgIGZyb20gc3RyaW5nIGNvbnN0YW50IHRvICdjaGFyKiciIGZyb20gR0NDIDQuMiBpbiBnZW5lcmF0ZWQgQy9DKysKCSAgICBjb2RlLgoKMTAvMTYvMjAwNzogb2xseQoJICAgIFtQSFBdIEZpeCBtYW55IG9jY3VycmVuY2VzIG9mICJ3YXJuaW5nOiBkZXByZWNhdGVkIGNvbnZlcnNpb24gZnJvbQoJICAgIHN0cmluZyBjb25zdGFudCB0byAnY2hhcionIiBmcm9tIEdDQyA0LjIgaW4gZ2VuZXJhdGVkIEMvQysrIGNvZGUKCSAgICB3aGVuIGNvbXBpbGluZyB3aXRoIGEgbmV3IGVub3VnaCB2ZXJzaW9uIG9mIFBIUCA1ICh0ZXN0ZWQgd2l0aAoJICAgIFBIUCA1LjIuMywgYnV0IFBIUCA1LjIuMSBpcyBwcm9iYWJseSB0aGUgbWluaW11bSByZXF1aXJlbWVudCkuCgoxMC8xNS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCAjMTc5NzEzMyBmcm9tIERhdmlkIFBpZXBncmFzcyBmaXhlcyAlYXR0cmlidXRlIHdoZW4gdGhlIGdldHRlciBoYXMgdGhlIHNhbWUgbmFtZQogICAgICAgICAgICBhcyB0aGUgYXR0cmlidXRlIG5hbWUgYW5kIG5vIGxvbmdlciBnZW5lcmF0ZSBub24tZnVuY3Rpb25hbCBzZXR0ZXIgZm9yIHJlYWQtb25seSBhdHRyaWJ1dGVzLgoKMTAvMTUvMjAwNzogb2xseQoJICAgIFtUY2xdIFByZXZlbnQgU1dJR19UY2xfQ29udmVydFB0ciBmcm9tIGNhbGxpbmcgdGhlIHVua25vd24gcHJvYy4KCSAgICBBZGQgRXhhbXBsZXMvdGNsL3N0ZF92ZWN0b3IvIHdoaWNoIHRoaXMgY2hhbmdlIGZpeGVzLiAgUGF0Y2gKCSAgICBpcyBmcm9tICJDbGlmZiBDIiBpbiBTRiMxODA5ODE5LgoKMTAvMTIvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEFkZCBEZXRhY2hDdXJyZW50VGhyZWFkIGJhY2sgaW4gZm9yIGRpcmVjdG9ycy4gU2VlIGVudHJ5IGRhdGVkIDA4LzExLzIwMDYgYW5kCiAgICAgICAgICAgIHNlYXJjaCBmb3IgRGV0YWNoQ3VycmVudFRocmVhZCBvbiB0aGUgbWFpbGluZyBsaXN0cyBmb3IgZGV0YWlscy4gVGhlIGNyYXNoZXMgb24gU29sYXJpcwogICAgICAgICAgICBzZWVtIHRvIGJlIG9ubHkgcHJlc2VudCBpbiBqZGstMS40LjIgYW5kIGxvd2VyIChqZGstMS41LjAgYW5kIGpkay0xLjYuMCBhcmUgb2theSksIHNvCiAgICAgICAgICAgIGFueW9uZSB1c2luZyBkaXJlY3RvcnMgc2hvdWxkIHVzZSBhIHJlY2VudCBqZGsgb24gU29sYXJpcywgb3IgZGVmaW5lIChzZWUgZGlyZWN0b3Iuc3dnKQogICAgICAgICAgICBTV0lHX0pBVkFfTk9fREVUQUNIX0NVUlJFTlRfVEhSRUFEIHRvIHRoZSBDKysgY29tcGlsZXIgdG8gZ2V0IG9sZCBiZWhhdmlvdXIuCgoxMC8xMi8yMDA3OiB3c2Z1bHRvbgoJICAgIFtKYXZhXSBFbnN1cmUgdGhlIHByZW1hdHVyZSBnYXJiYWdlIGNvbGxlY3Rpb24gcHJldmVudGlvbiBwYXJhbWV0ZXIgKHBnY3BwKSBpcyBnZW5lcmF0ZWQKICAgICAgICAgICAgd2hlbiB0aGVyZSBhcmUgQyBjb21tZW50cyBpbiB0aGUganR5cGUgYW5kIGpzdHlwZSB0eXBlbWFwcy4KCjEwLzEyLzIwMDc6IHd1enplYgoJICAgIEFkZGVkIGEgdGVzdHN1aXRlIGVudHJ5IGZvciBCdWcgIzE3MzU5MzEKCjEwLzA5LzIwMDc6IG9sbHkKCSAgICBBdXRvbWF0aWNhbGx5IHJlcnVuIGF1dG9nZW4uc2ggaWYgY29uZmlndXJlLmluIGlzIG1vZGlmaWVkLgoKMTAvMDkvMjAwNzogb2xseQoJICAgIEVuaGFuY2UgY2hlY2stJS10ZXN0LXN1aXRlIHJ1bGUgYW5kIGZyaWVuZHMgdG8gZ2l2ZSBhIG1vcmUgaGVscGZ1bAoJICAgIGVycm9yIG1lc3NhZ2UgaWYgeW91IHRyeSB0aGVtIGZvciBhIGxhbmd1YWdlIHdoaWNoIGRvZXNuJ3QgZXhpc3QKCSAgICAoZS5nLiAibWFrZSBjaGVjay1waHAtdGVzdC1zdWl0ZSIgcmF0aGVyIHRoYW4gdGhlIGNvcnJlY3QKCSAgICAibWFrZSBjaGVjay1waHA0LXRlc3Qtc3VpdGUiKS4KCjEwLzA5LzIwMDc6IG9sbHkKCSAgICBBZGQgbWFrZSBydWxlIHRvIHJlZ2VuZXJhdGUgTWFrZWZpbGUgZnJvbSBNYWtlZmlsZS5pbiBpZiBpdCBoYXMKCSAgICBjaGFuZ2VkLgoKMTAvMDkvMjAwNzogb2xseQoJICAgIFtwaHBdIEZpeCBsb25nLXN0YW5kaW5nIG1lbW9yeSBsZWFrIGluIHdyYXBwZWQgY29uc3RydWN0b3JzIGFuZAoJICAgIHdyYXBwZWQgZnVuY3Rpb25zL21ldGhvZHMgd2hpY2ggcmV0dXJuIGFuIG9iamVjdC4KCjEwLzA4LzIwMDc6IG9sbHkKCSAgICBGaXggTWFrZWZpbGUuaW4gdG8gcmVhZCBjaGVjay5saXN0IGZpbGVzIGNvcnJlY3RseSBpbiBhIFZQQVRICgkgICAgYnVpbGQuCgoxMC8wNy8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIEV4cGVyaW1lbnRhbCBzaGFyZWRfcHRyIHR5cGVtYXBzIGFkZGVkCgowOS8yNy8yMDA3OiBtZ29zc2FnZQoJICAgIFtsdWFdIGFkZGVkIG1vcmUgdmVyYm9zZSBlcnJvciBtZXNzYWdlcyBmb3IgaW5jb3JyZWN0IHR5cGVjaGVja3MuCgkgICAgQWRkZWQgYSByb3V0aW5lIHdoaWNoIGNoZWNrcyB0aGUgZXhhY3QgbnVtYmVyIG9mIHBhcmFtZXRlcnMgcGFzc2VkIHRvIGEgZnVuY3Rpb24KCSAgICAoYnJlYWtzIG9wZXJhdG9yX292ZXJsb2FkaW5nIGZvciB1bmFyeSBtaW51cyBvcGVyYXRvciwgY3VycmVudGx5IGRpc2FibGVkKS4KCSAgICBSZW9yZ2FuaXNlZCB0aGUgbHVhdHlwZW1hcHMuc3dnIHRvIHRpZHkgaXQgdXAuCgkgICAgQWRkZWQgYSBsb3Qgb2YgJWlnbm9yZXMgb24gdGhlIG9wZXJhdG9ycyBub3Qgc3VwcG9ydGVkIGJ5IGx1YS4KCSAgICBBZGRlZCBzdXBwb3J0IGZvciBjb25zdGFudCBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMgJiBydW50ZXN0IGZvciBtZW1iZXJfcG9pbnRlci5pCgkgICAgQWRkZWQgZmlyc3QgdmVyc2lvbiBvZiB3Y2hhci5pCgowOS8yNS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIHRocm93cyB0eXBlbWFwcyBmb3Igc3RkOjp3c3RyaW5nIHVzaW5nIEMjIHBhdGNoICMxNzk5MDY0IGZyb20gRGF2aWQgUGllcGdyYXNzCgowOS8yNC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbVGNsXSBBcHBseSAjMTc3MTMxMyB0byBmaXggYnVnICMxNjUwMjI5IC0gZml4ZXMgbG9uZyBsb25nIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcKICAgICAgICAgICAgaGFuZGxpbmcuCgowOS8yMC8yMDA3OiBvbGx5CgkgICAgW0phdmFdIEVsaW1pbmF0ZSBzb21lIHVubmVjZXNzYXJ5IHVzZXMgb2YgYSB0ZW1wb3JhcnkgYnVmZmVyCgkgICAgYWxsb2NhdGVkIHVzaW5nIG5ld1tdLiAgU0YjMTc5NjYwOS4KCjA5LzE5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gVGhlICRjc2lucHV0IHNwZWNpYWwgdmFyaWFibGUgY2FuIGJlIHVzZWQgaW4gdGhlIGNzdmFyaW4gdHlwZW1hcCB3aGVyZSBpdCBpcyBhbHdheXMKICAgICAgICAgICAgZXhwYW5kZWQgdG8gJ3ZhbHVlJy4KCjA5LzE5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IGJ1ZyByZXBvcnRlZCBieSBHbGVubiBBIFdhdHNvbiBhbmQgIzE3OTUyNjAgd2hlcmUgdGhlIGNzdHlwZSB0eXBlbWFwIHVzZWQgdGhlICdyZWYnCiAgICAgICAgICAgIGtleXdvcmQgaW4gdGhlIHR5cGVtYXAgYm9keSwgaXQgcHJvZHVjZWQgdW5jb21waWxhYmxlIEMjIHByb3BlcnRpZXMgKHZhcmlhYmxlIHdyYXBwZXJzKS4KICAgICAgICAgICAgVGhlIHR5cGUgZm9yIHRoZSBwcm9wZXJ0eSBub3cgY29ycmVjdGx5IGNvbWVzIGZyb20gdGhlICdvdXQnIGF0dHJpYnV0ZSBpbiB0aGUgY3N0eXBlIHR5cGVtYXAuCgowOS8xOS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IGNvbnN0IHN0ZDo6d3N0cmluZyYgdHlwZW1hcHMKCjA5LzE5LzIwMDc6IHdzZnVsdG9uCgkgICAgW0phdmFdIEVuc3VyZSB0aGUgcHJlbWF0dXJlIGdhcmJhZ2UgY29sbGVjdGlvbiBwcmV2ZW50aW9uIHBhcmFtZXRlciAocGdjcHApIGlzIGdlbmVyYXRlZAogICAgICAgICAgICB3aGVyZSBhIHBhcmFtZXRlciBpcyBwYXNzZWQgYnkgcG9pbnRlciByZWZlcmVuY2UsIGVnIGluIHRoZSBzdGQ6OnZlY3RvciB3cmFwcGVycy4gVGhlIHBnY3BwCiAgICAgICAgICAgIGlzIGFsc28gZ2VuZXJhdGVkIG5vdyB3aGVuIHVzZXIncyBjdXN0b20gdHlwZW1hcHMgdXNlIGEgcHJveHkgY2xhc3MgaW4gdGhlIGpzdHlwZSB0eXBlbWFwCiAgICAgICAgICAgIGFuZCBhICdsb25nJyBpbiB0aGUganR5cGUgdHlwZW1hcC4KCjA5LzE4LzIwMDc6IG9sbHkKCSAgICBbcGhwXSBBZGQgdHlwZW1hcHMgZm9yIGhhbmRsaW5nIHBhcmFtZXRlcnMgb2YgdHlwZSBzdGQ6OnN0cmluZyAmCgkgICAgd2hpY2ggYXJlIG1vZGlmaWVkIGJ5IHRoZSB3cmFwcGVkIGZ1bmN0aW9uLgoKMDkvMTcvMjAwNzogb2xseQoJICAgIFtweXRob25dIFNwbGl0IHBvdGVudGlhbGx5IGxvbmcgc3RyaW5nIGxpdGVyYWxzIHRvIGF2b2lkIGhpdHRpbmcKCSAgICBNU1ZDJ3MgbG93IGZpeGVkIGxpbWl0IG9uIHN0cmluZyBsaXRlcmFsIGxlbmd0aCAtIHBhdGNoIGZyb20KCSAgICBTRiMxNzIzNzcwLCBhbHNvIHJlcG9ydGVkIGFzIFNGIzE2MzA4NTUuCgowOS8xNy8yMDA3OiBvbGx5CgkgICAgW29jYW1sXSBGaXggcmVuYW1pbmcgb2Ygb3ZlcmxvYWRlZCBtZXRob2RzIGluIHRoZSBtZXRob2RfdGFibGUgLQoJICAgIG15IHBhdGNoIGZyb20gU0YjOTQwMzk5LgoKMDkvMTcvMjAwNzogb2xseQoJICAgIFtweXRob25dIFNpbXBsZXIgY29kZSBmb3IgU1dJR19Bc1ZhbF9ib29sKCkgd2hpY2ggZml4ZXMgYSAic3RyaWN0CgkgICAgYWxpYXNpbmciIHdhcm5pbmcgZnJvbSBHQ0MgLSBwYXRjaCBmcm9tIFNGIzE3MjQ1ODEgYnkgQW5kcmV3CgkgICAgQmF1bWFubi4KCjA5LzE3LzIwMDc6IG9sbHkKCSAgICBbcGVybDVdIFVzZSBzdl9zZXRwdm4oKSB0byBzZXQgYSBzY2FsYXIgZnJvbSBhIHBvaW50ZXIgYW5kIGxlbmd0aAoJICAgIC0gcGF0Y2ggZnJvbSBTRiMxNzQ0NjAgYnkgIm1hdHN1YmFyYXkiLgoKMDkvMTcvMjAwNzogb2xseQoJICAgIFdoZW4gd3JhcHBpbmcgQysrIGNvZGUsIGdlbmVyYXRlIGNvZGUgd2hpY2ggdXNlcwoJICAgIHN0ZDo6c3RyaW5nOjphc3NpZ24oUFRSLCBMRU4pIHJhdGhlciB0aGFuIGFzc2lnbmluZwoJICAgIHN0ZDo6c3RyaW5nKFBUUiwgTEVOKS4gIFVzaW5nIGFzc2lnbiBnZW5lcmF0ZXMgbW9yZSBlZmZpY2llbnQgY29kZQoJICAgICh0ZXN0ZWQgd2l0aCBHQ0MgNC4xLjIpLgoKMDkvMDcvMjAwNzogd3NmdWx0b24KCSAgICBGaXggJWlnbm9yZSBvbiBjb25zdHJ1Y3RvcnMgd2hpY2ggYXJlIG5vdCBleHBsaWNpdGx5IGRlY2xhcmVkIFtTRiAjMTc3NzcxMl0KCjA5LzA1LzIwMDc6IHd1enplYiAoSm9obiBMZW56KQoJICAgIC0gQ2hhbmdlIHJfbHR5cGUgaW4gdHlwZXN5cy5jIHRvIHN0b3JlIGEgaGFzaHRhYmxlIGluc3RlYWQgb2YgYSBzaW5nbGUgdmFsdWUuCgkgICAgICBzZXZlcmFsIHZlcnkgc3VidGxlIGJ1Z3Mgd2VyZSBiZWluZyBjYXVzZWQgYnkgbXVsdGlwbGUgbHR5cGVzIGJlaW5nIG1hcHBlZAoJICAgICAgdG8gYSBzaW5nbGUgbWFuZ2xlZCB0eXBlLCBtb3N0bHkgd2hlbiB1c2luZyB0eXBlZGVmZWQgdGVtcGxhdGUgcGFyYW1ldGVycy4KCSAgICAgIE5vdywgcl9sdHlwZSBzdG9yZXMgYSBoYXNodGFibGUgb2YgcG9zc2libGUgbHR5cGVzLCBhbmQgd2hlbiBnZW5lcmF0aW5nIHRoZQoJICAgICAgdHlwZSB0YWJsZSwgYWxsIHRoZSBsdHlwZXMgYXJlIGFkZGVkIGludG8gdGhlIHN3aWdfdHlwZV9pbmZvIHN0cnVjdHVyZS4KCjA4LzMxLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFNGICMxNzU0OTY3IGZyb20gSmFtZXMgQmlnbGVyLgogICAgICAgICAgICAtIEZpeCBidWcgaW4gdHVybmluZyBvbiB3YXJuaW5ncyB0aGF0IHdlcmUgdHVybmVkIG9mZiBieSBkZWZhdWx0LiBFZyAnc3dpZyAtdyszMDknIHdpbGwgbm93CiAgICAgICAgICAgICAgdHVybiBvbiB0aGUgbm9ybWFsbHkgc3VwcHJlc3NlZCB3YXJuaW5nIDMwOS4KCiAgICAgICAgICAgIC0gTmV3IC1XZXh0cmEgY29tbWFuZGxpbmUgb3B0aW9uIHdoaWNoIGVuYWJsZXMgdGhlIGV4dHJhIHdhcm5pbmcgbnVtYmVyczoKICAgICAgICAgICAgICAyMDIsMzA5LDQwMyw1MTIsMzIxLDMyMiAodGhpcyBpcyB0aGUgbGlzdCBvZiB3YXJuaW5ncyB0aGF0IGhhdmUgYWx3YXlzIGJlZW4gc3VwcHJlc3NlZCBieQogICAgICAgICAgICAgIGRlZmF1bHQpLiBCeSBzcGVjaWZ5aW5nIC1XZXh0cmEsIGFsbCB3YXJuaW5ncyB3aWxsIGJlIHR1cm5lZCBvbiwgYnV0IHVubGlrZSAtV2FsbCwKICAgICAgICAgICAgICB3YXJuaW5ncyBjYW4gc3RpbGwgYmUgc2VsZWN0aXZlbHkgdHVybmVkIG9uL29mZiB1c2luZyAld2FybmZpbHRlciwKICAgICAgICAgICAgICAjcHJhZ21hIFNXSUcgbm93YXJuIG9yIGZ1cnRoZXIgLXcgY29tbWFuZGxpbmUgb3B0aW9ucywgZWc6CiAgICAgICAgICAgICAgICBzd2lnIC1XZXh0cmEgLXczMDkKICAgICAgICAgICAgICB3aWxsIHR1cm4gb24gYWxsIHdhcm5pbmdzIGV4Y2VwdCAzMDkuCgowOC8yOC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICAtIE5ldyBkZWJ1Z2dpbmcgb3B0aW9ucywgLWRlYnVnLW1vZHVsZSA8bj4gYW5kIC1kZWJ1Zy10b3AgPG4+IHRvIGRpc3BsYXkgdGhlIHBhcnNlIHRyZWUgYXQKICAgICAgICAgICAgICB2YXJpb3VzIHN0YWdlcywgd2hlcmUgPG4+IGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2Ygc3RhZ2VzIDEtNC5Gb3IgZXhhbXBsZSwgdG8KICAgICAgICAgICAgICBkaXNwbGF5IHRvcCBvZiBwYXJzZSB0cmVlIGF0IHN0YWdlcyAxIGFuZCAzOgogICAgICAgICAgICAgICAgc3dpZyAtZGVidWctdG9wIDEsMwoKICAgICAgICAgICAgLSBEZXByZWNhdGUgdGhlIGZvbGxvd2luZyBvcHRpb25zIHdoaWNoIGhhdmUgZXF1aXZhbGVudHMgYmVsb3c6CiAgICAgICAgICAgICAgLWR1bXBfcGFyc2VfbW9kdWxlICAgID0+ICAgLWRlYnVnLW1vZHVsZSAxCiAgICAgICAgICAgICAgLWR1bXBfbW9kdWxlICAgICAgICAgID0+ICAgLWRlYnVnLW1vZHVsZSA0CiAgICAgICAgICAgICAgLWR1bXBfcGFyc2VfdG9wICAgICAgID0+ICAgLWRlYnVnLXRvcCAxCiAgICAgICAgICAgICAgLWR1bXBfdG9wICAgICAgICAgICAgID0+ICAgLWRlYnVnLXRvcCA0CgogICAgICAgICAgICAtIFJlbmFtZWQgc29tZSBjb21tYW5kbGluZSBvcHRpb25zIGZvciBuYW1pbmcgY29uc2lzdGVuY3kgYWNyb3NzIGFsbCBvcHRpb25zOgogICAgICAgICAgICAgIC1kZWJ1Z190ZW1wbGF0ZSAgPT4gICAtZGVidWctdGVtcGxhdGUKICAgICAgICAgICAgICAtZGVidWdfdHlwZW1hcCAgID0+ICAgLWRlYnVnLXR5cGVtYXAKICAgICAgICAgICAgICAtZHVtcF9jbGFzc2VzICAgID0+ICAgLWRlYnVnLWNsYXNzZXMKICAgICAgICAgICAgICAtZHVtcF90YWdzICAgICAgID0+ICAgLWRlYnVnLXRhZ3MKICAgICAgICAgICAgICAtZHVtcF90eXBlZGVmICAgID0+ICAgLWRlYnVnLXR5cGVkZWYKICAgICAgICAgICAgICAtZHVtcF9tZW1vcnkgICAgID0+ICAgLWRlYnVnLW1lbW9yeQoKMDgvMjUvMjAwNzogb2xseQoJICAgIFtQSFA1XSBGaXggaGFuZGxpbmcgb2YgZG91YmxlIG9yIGZsb2F0IHBhcmFtZXRlcnMgd2l0aCBhbiBpbnRlZ2VyCgkgICAgZGVmYXVsdCB2YWx1ZS4KCjA4LzI1LzIwMDc6IG9sbHkKCSAgICBbUEhQNV0gR2VuZXJhdGUgX19pc3NldCgpIG1ldGhvZHMgZm9yIHNldHRlcnMgZm9yIFBIUCA1LjEgYW5kIGxhdGVyLgoKMDgvMjAvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEgQyNdIEZpeCBkaXJlY3RvciBidWcgIzE3NzY2NTEgcmVwb3J0ZWQgYnkgU3RlcGhhbmUgUm91dGVsb3VzIHdoaWNoIG9jY3VycmVkIHdoZW4KICAgICAgICAgICAgdGhlIGRpcmVjdG9yIGNsYXNzIG5hbWUgaXMgdGhlIHNhbWUgYXMgdGhlIHN0YXJ0IG9mIHNvbWUgb3RoZXIgc3ltYm9scyB1c2VkIHdpdGhpbgogICAgICAgICAgICB0aGUgZGlyZWN0b3IgY2xhc3MuCgowOC8xNy8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBDb3JyZWN0IGJlaGF2aW91ciBmb3IgdGVtcGxhdGVkIG1ldGhvZHMgdXNlZCB3aXRoICVyZW5hbWUgb3IgJWlnbm9yZSBhbmQgdGhlIGVtcHR5CiAgICAgICAgICAgIHRlbXBsYXRlIGRlY2xhcmF0aW9uIC0gJXRlbXBsYXRlKCkuIEEgd2FybmluZyBpcyBpc3N1ZWQgaWYgdGhlIG1ldGhvZCBoYXMgbm90IGJlZW4KICAgICAgICAgICAgcmVuYW1lZC4KCjA4LzE2LzIwMDc6IG11dGFuZGl6IChNaWtlbCBCYW5jcm9mdCkKCSAgICBbYWxsZWdyb2NsXSBOYW1lIGdlbmVyYXRlZCBjbCBmaWxlIGJhc2VkIG9uIGlucHV0IGZpbGUgcmF0aGVyIHRoYW4gYnkKCSAgICBtb2R1bGUgbmFtZS4gSXQgd2FzIHBvc3NpYmxlIHRvIGVuZCB1cCB3aXRoIGEgbXlwYWNrYWdlLmNsIGFuZCBhIHRlc3Rfd3JhcC5jCgkgICAgd2hlbiBwYXJzaW5nIGEgdGVzdC5pIGlucHV0IGZpbGUuIENvbmZ1c2luZy4gQWxzbywgaW5jbHVkZSBleHRlcm5hbC1mb3JtYXQKCSAgICB0ZW1wbGF0ZXMgZm9yIDpmYXQgYW5kIDpmYXQtbGUgYXV0b21hdGljYWxseSB0byBhdm9pZCB0aGVzZSBiZWluZyBjb21waWxlZAoJICAgIGF0IHJ1bnRpbWUuCgowOC8xNS8yMDA3OiBlZnV6enlvbmUKICAgICAgICAgICAgW2NmZmldIEFwcGx5IHBhdGNoICMxNzY2MDc2IGZyb20gTGVpZ2ggU21pdGggYWRkaW5nIHN1cHBvcnQgZm9yIG5ld2x5IGludHJvZHVjZWQKICAgICAgICAgICAgaW4gY2ZmaSA6bG9uZy1sb25nIGFuZCA6dW5zaWduZWQtbG9uZy1sb25nLgoKMDgvMTAvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEFkZCBkb2N1bWVudGF0aW9uIHBhdGNoICMxNzQzNTczIGZyb20gSmVmZnJleSBTb3JlbnNlbi4gSXQgY29udGFpbnMgYSBuZWF0CiAgICAgICAgICAgIGlkZWEgd2l0aCByZXNwZWN0IHRvIGJldHRlciBtZW1vcnkgbWFuYWdlbWVudCBieSB0aGUgSlZNIG9mIEMrKyBhbGxvY2F0ZWQgbWVtb3J5LgoKMDgvMTAvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIEFwcGx5IHBhdGNoICMxNzcxNDEwIGZyb20gV2FkZSBCcmFpbmVyZCB0byBmaXggdHlwZWRlZiBYUyhTd2lnUGVybFdyYXBwZXIpIGluCiAgICAgICAgICAgIHBlcmxydW4uc3dnIGZvciBBY3RpdmVTdGF0ZSBQZXJsIGJ1aWxkIDgyMiBhbmQgUGVybCA1LjguOSBhbmQgNS4xMCBicmFuY2hlcy4KCjA4LzEwLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIGNvbnN0IGVudW0gcmVmZXJlbmNlIHR5cGVtYXBzIGZpeGVkLgoKMDgvMDkvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBZGRlZCBtaXNzaW5nIHN1cHBvcnQgZm9yIEMrKyBjbGFzcyBtZW1iZXIgcG9pbnRlcnMuCgowOC8wOS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIEFkZCBzdXBwb3J0IGZvciAkb3duZXIgaW4gdGhlICJvdXQiIHR5cGVtYXBzIGxpa2UgaW4gdGhlIHNjcmlwdGluZwogICAgICAgICAgICBsYW5ndWFnZSBtb2R1bGVzLiBOb3RlIHRoYXQgJG93bmVyIGhhcyBhbHdheXMgYmVlbiBzdXBwb3J0ZWQgaW4gdGhlICJqYXZhb3V0IiAvICJjc291dCIKICAgICAgICAgICAgdHlwZW1hcHMuCgowOC8wMS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc21hcnQgcG9pbnRlciBoYW5kbGluZyBmb3IgY2xhc3NlcyB0aGF0IGhhdmUgdGVtcGxhdGVkIG1ldGhvZHMgd2l0aGluIHRoZSBzbWFydAogICAgICAgICAgICBwb2ludGVyIHR5cGUuIFByb2JsZW0gcmVwb3J0ZWQgYnkgY3JhaWdkbyBhdCBlZS53YXNoaW5ndG9uLmVkdS4KCjA3LzMxLzIwMDc6IGVmdXp6eW9uZQogICAgICAgICAgICBbY2ZmaV0gZml4ZWQgbWVtb3J5IGFjY2VzcyBhZnRlciBiZWluZyBmcmVlZCBidWcuIHRoYW5rcyB0byBNYXJ0aW4gUGVyY29zc2kuCiAgICAgICAgICAgIHBhY2thZ2UgbmFtZSBjbG9zIGNoYW5nZWQgdG8gY2wuIHRoYW5rcyB0byBSYWxmIE1hdHRlcwoKMDcvMjQvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgUGFyYWxsZWwgbWFrZSBzdXBwb3J0IGFkZGVkIGZvciB0aGUgZXhhbXBsZXMgYW5kIHRlc3Qtc3VpdGUgZm9yIGRldmVsb3BlcnMgd2hvIGhhdmUKICAgICAgICAgICAgbW9yZSB0aGFuIG9uZSBDUFUuIE5vdyBwYXJhbGxlbCBtYWtlIGNhbiBiZSB1c2VkIGZvciBjaGVja2luZyBpbiBhZGRpdGlvbiB0byBidWlsZGluZwogICAgICAgICAgICB0aGUgU1dJRyBleGVjdXRhYmxlLiBTb21lIHR5cGljYWwgY2hlY2tpbmcgZXhhbXBsZXM6CgogICAgICAgICAgICAgIG1ha2UgLWo4IC1rIGNoZWNrCiAgICAgICAgICAgICAgbWFrZSAtajQgY2hlY2stamF2YS10ZXN0LXN1aXRlCiAgICAgICAgICAgICAgbWFrZSAtajIgY2hlY2stamF2YS1leGFtcGxlcwoKMDcvMTkvMjAwNzogbWdvc3NhZ2UKICAgICAgICAgICAgRml4ZWQgYnVnIHRoYXQgc3RvcHBlZCBjb25maWd1cmUgd29ya2luZyBvbiBtaW5ndyAoYXBwbGllZCBkb3MydW5peCB0byBjb25maWd1cmUuaW4pCgowNy8xMC8yMDA3OiBtZ29zc2FnZQogICAgICAgICAgICBbbHVhXSBFeHRyYSBjb21wYXRpYmlsaXR5IHdpdGggTHVhIDUuMSAodXBkYXRlZCBTV0lHX2luaXQsIGRvY3MsIGV4YW1wbGVzLCB0ZXN0IHN1aXRlKQoJICAgIFJlbW92ZWQgbmFtZSBjbGFzaCBmb3Igc3RhdGljIGxpbmsgb2YgbXVsdGlwbGUgbW9kdWxlcwoKMDcvMDUvMjAwNzogbWdvc3NhZ2UKICAgICAgICAgICAgW2x1YV0gRml4IGEgYnVnIGluIFNXSUdfQUxMT0NfQVJSQVkoKQogICAgICAgICAgICBpbXByb3ZlZCB0aGUgZXJyb3IgbWVzc2FnZXMgZm9yIGluY29ycmVjdCBhcmd1bWVudHMuCiAgICAgICAgICAgIENoYW5nZWQgdGhlIG91dHB1dCBvZiBzd2lnX3R5cGUoKSB0byB1c2UgdGhlIGh1bWFuIHJlYWRhYmxlIGZvcm0gb2YgdGhlIHR5cGUsCgkgICAgcmF0aGVyIHRoYW4gdGhlIHJhdyBzd2lnIHR5cGUuCgowNy8wMy8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCBkaXJlY3RvcnMgZm9yIHNvbWUgb3ZlcmxvYWRlZCBtZXRob2RzIHdoZXJlIHRoZSBpbXR5cGUgcmVzdWx0ZWQgaW4gaWRlbnRpY2FsCiAgICAgICAgICAgIG1ldGhvZHMgYmVpbmcgZ2VuZXJhdGVkIGluIHRoZSBDIyBkaXJlY3RvciBjbGFzcywgZWcgdm9pZCBmb28oaW50ICopIGFuZCB2b2lkIGZvbyhkb3VibGUgKikKICAgICAgICAgICAgdXNlZCB0byBnZW5lcmF0ZWQgdHdvIG9mIHRoZXNlOgoKICAgICAgICAgICAgICBwcml2YXRlIHZvaWQgU3dpZ0RpcmVjdG9yZm9vKEludFB0ciBwKSB7IC4uLiB9CgowNi8yNS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIFNvbWUgcGFyYW1ldGVyIG5hbWUgY2hhbmdlcyBpbiBzdGRfdmVjdG9yLmkgYWxsb3dpbmcgYmV0dGVyIHRhcmdldGluZwogICAgICAgICAgICBvZiB0eXBlbWFwcyBmb3IgbWV0aG9kIHBhcmFtZXRlcnMgKGZvciBtZW1vcnkgbWFuYWdlbWVudCBvZiBjb250YWluZXJzIG9mIHBvaW50ZXJzKS4KCjA2LzA3LzIwMDc6IG11dGFuZGl6IChNaWtlbCBCYW5jcm9mdCkKCSAgICBbYWxsZWdyb2NsXQoJICAgIGZpeCBmb3JlaWduLXR5cGUgY29uc3RydWN0b3IgdG8gcHJvcGVybHkgbG9vayBmb3IgZmZpdHlwZSB0eXBlbWFwCgkgICAgYmluZGluZ3MuIGZpeCBpbm91dF90eXBlbWFwcy5pIGZvciBzdHJpbmdzLgoKMDYvMDYvMjAwNzogb2xseQoJICAgIFtSdWJ5XQoJICAgIFVzZSB3aGljaGV2ZXIgb2YgImxvbmciIG9yICJsb25nIGxvbmciIGlzIHRoZSBzYW1lIHNpemUgYXMgInZvaWQqIgoJICAgIHRvIGhvbGQgcG9pbnRlcnMgYXMgaW50ZWdlcnMsIHJhdGhlciB0aGFuIHdoaWNoZXZlciBtYXRjaGVzIG9mZl90LgoJICAgIEZpeGVzIGNvbXBpbGF0aW9uIG9uIE9TIFggYW5kIEdDQyB3YXJuaW5ncyBvbiBwbGF0Zm9ybXMgd2hlcmUKCSAgICBzaXplb2Yodm9pZCopIDwgc2l6ZW9mKG9mZl90KSAoU0YgcGF0Y2ggIzE3MzE5NzkpLgoKMDYvMDYvMjAwNzogb2xseQoJICAgIFtQSFA1XQoJICAgIEZpeCBoYW5kbGluZyBvZiBhIHBhcnRpY3VsYXIgY2FzZSBpbnZvbHZpbmcgb3ZlcmxvYWRlZCBmdW5jdGlvbnMKCSAgICB3aXRoIGRlZmF1bHQgcGFyYW1ldGVycy4KCjA2LzA1LzIwMDc6IG11dGFuZGl6IChNaWtlbCBCYW5jcm9mdCkKCSAgICBbYWxsZWdyb2NsXQoJICAgIEZpeCBjYXNlIHdoZXJlIHdlJ2QgcGFzcyBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllcnMKCSAgICAoaS5lLiBOUzE6Ok5TMjo6Rk9PKSB0byBzd2lnLWluc2VydC1pZC4gQWxsIG5hbWVzcGFjZXMKCSAgICBzaG91bGQgYmUgc3RyaXBwZWQuCgoJICAgIEZpeCBidWcgaW4gVHlwZWRlZkhhbmRsZXIgaW50cm9kdWNlZCBieSBsYXN0IGZpeC4KCjA2LzA1LzIwMDc6IG9sbHkKCSAgICBGaXggcmVwb3J0aW5nIG9mIGZpbGVuYW1lcyBpbiBlcnJvcnMgYWZ0ZXIgJWluY2x1ZGUgKHBhdGNoIGZyb20KCSAgICBMZWlnaCBTbWl0aCBpbiAjMTczMTA0MDsgYWxzbyByZXBvcnRlZCBhcyAjMTY5OTk0MCkuCgowNS8zMS8yMDA3OiBvbGx5CgkgICAgW1B5dGhvbl0KCSAgICBGaXggIm1pc3NpbmcgaW5pdGlhbGlzZXIiIHdhcm5pbmcgd2hlbiBjb21waWxpbmcgZ2VuZXJhdGVkIEMvQysrCgkgICAgd3JhcHBlciBjb2RlIHdpdGggUHl0aG9uIDIuNSB3aXRoIHdhcm5pbmdzIGVuYWJsZWQgKHBhdGNoIGZyb20KCSAgICBidWcjMTcyNzY2OCBmcm9tIEx1a2UgTW9vcmUpLgoKMDUvMjkvMjAwNzogb2xseQoJICAgIFtQeXRob25dCgkgICAgU3BsaXQgZG9jc3RyaW5ncyBpbnRvIHNlcGFyYXRlIHN0cmluZyBsaXRlcmFscyBhdCBlYWNoIG5ld2xpbmUgd2hlbgoJICAgIGdlbmVyYXRpbmcgQy9DKysgd3JhcHBlciBjb2RlICh0aGUgQy9DKysgY29tcGlsZXIgd2lsbCBqdXN0IGNvbWJpbmUKCSAgICB0aGVtIGJhY2sgaW50byBhIHNpbmdsZSBzdHJpbmcgbGl0ZXJhbCkuICBUaGlzIGF2b2lkcyBNU1ZDCgkgICAgY29tcGxhaW5pbmcgdGhhdCB0aGUgc3RyaW5ncyBhcmUgdG9vIGxvbmcgKHByb2JsZW0gcmVwb3J0ZWQgYnkKCSAgICBCbyBQZW5nIG9uIHRoZSBtYWlsaW5nIGxpc3QpLgoKMDUvMjgvMjAwNzogb2xseQoJICAgIFtQeXRob25dCgkgICAgRXNjYXBlIGJhY2tzbGFzaGVzIGluIGRvY3N0cmluZ3MuCgowNS8yNi8yMDA3OiBvbGx5CgkgICAgW1B5dGhvbl0KCSAgICBGaXggYXV0b2RvYyBnZW5lcmF0aW9uIG9mIGVudW1zIHRvIGJlIG1vcmUgY29uc2lzdGVudCB3aXRoIGhvdyB0aGUKCSAgICBlbnVtcyBhcmUgd3JhcHBlZCAtIHBhdGNoICMxNjk3MjI2IGZyb20gSm9zaCBDaGVycnkuCgowNS8yNi8yMDA3OiBvbGx5CgkgICAgW1BIUDVdCgkgICAgRml4IHdyYXBwaW5nIG9mIG1ldGhvZHMgYW5kIGZ1bmN0aW9ucyB3aGljaCByZXR1cm4gYSBwb2ludGVyIHRvIGEKCSAgICBjbGFzcyAoYnVnIzE3MDA3ODgpIGFuZCB0aG9zZSB3aGljaCBoYXZlIG92ZXJsb2FkZWQgZm9ybXMgcmV0dXJuaW5nCgkgICAgYm90aCBjbGFzc2VzIGFuZCBub24tY2xhc3NlcyAoYnVnIzE3MTI3MTcsIHRoYW5rcyB0byBTaW1vbgoJICAgIEJlcnRoaWF1bWUgZm9yIHRoZSBwYXRjaCkuCgowNS8yNS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlZCAlcmVuYW1lIGluY29uc2lzdGVuY3kgaW4gY29udmVyc2lvbiBvcGVyYXRvcnMgYXMgcmVwb3J0ZWQgYnkgWmhvbmcgUmVuLiBUaGUgbWF0Y2hpbmcKICAgICAgICAgICAgaXMgbm93IGRvbmUgb24gdGhlIG9wZXJhdG9yIG5hbWUgaW4gdGhlIHNhbWUgd2F5IGFzIGl0IGlzIGRvbmUgZm9yIHBhcmFtZXRlcnMuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlcmVuYW1lKG9wQUJDKSBTcGFjZTo6QUJDOjpvcGVyYXRvciBBQkMoKSBjb25zdDsKICAgICAgICAgICAgICAlcmVuYW1lKG1ldGhvZEFCQykgU3BhY2U6OkFCQzo6bWV0aG9kKEFCQyBhKSBjb25zdDsKICAgICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2UgewogICAgICAgICAgICAgICAgY2xhc3MgQUJDIHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIHZvaWQgbWV0aG9kKEFCQyBhKSBjb25zdCB7fQogICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yIEFCQygpIGNvbnN0IHsgQUJDIGE7IHJldHVybiBhOyB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIE5vdGUgdGhhdCBxdWFsaWZ5aW5nIHRoZSBjb252ZXJzaW9uIG9wZXJhdG9yIHByZXZpb3VzbHkgbWF5IG9yIG1heSBub3QgaGF2ZSBtYXRjaGVkLgogICAgICAgICAgICBOb3cgaXQgZGVmaW5pdGVseSB3b24ndCwgc28gdGhpcyB3aWxsIG5vdCBtYXRjaDoKCiAgICAgICAgICAgICAgJXJlbmFtZShvcEFCQykgU3BhY2U6OkFCQzo6b3BlcmF0b3IgU3BhY2U6OkFCQygpIGNvbnN0OwoKICAgICAgICAgICAgaW4gdGhlIHNhbWUgd2F5IHRoYXQgdGhpcyBkb2VzIG5vdCBtYXRjaDoKCiAgICAgICAgICAgICAgJXJlbmFtZShtZXRob2RBQkMpIFNwYWNlOjpBQkM6Om1ldGhvZChTcGFjZTo6QUJDIGEpIGNvbnN0OwoKICAgICAgICAgICAgVGhlIGRvY3VtZW50YXRpb24gaGFzIGJlZW4gaW1wcm92ZWQgd2l0aCByZXNwZWN0IHRvICVyZW5hbWUsIG5hbWVzcGFjZXMgYW5kIHRlbXBsYXRlcy4KICAgICAgICAgICAgQ29udmVyc2lvbiBvcGVyYXRvcnMgZG9jdW1lbnRhdGlvbiB0b28uCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjA1LzE2LzIwMDc6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBGaXggYmFkIGdlbmVyYXRpb24gb2YgbG9jYWwgdmFyIGx0eXBlJ3MgaW4gZnVuY3Rpb25XcmFwcGVyKCkuCgkgICAgVHJ5IHRvIHdvcmsgYmV0dGVyIHdpdGggdGhlIGJhY2t3YXJkIG9yZGVyIGluIHdoaWNoIHN3aWcKCSAgICB1bnJvbGxzIG5lc3RlZCBjbGFzcyBkZWZpbml0aW9ucy4KCSAgICBjbGVhbmVkIHVwIGEgbGl0dGxlIHVubmVjZXNzYXJ5IGNvZGUvZGVidWcgcHJpbnRmJ3MuCgkgICAgUmVtb3ZlIHdhcm5pbmcgd2hlbiByZXBsYWNpbmcgJGxkZXN0cnVjdG9yIGZvciBmZjpmb3JlaWduLXBvaW50ZXIKCjA1LzEyLzIwMDc6IG9sbHkKCSAgICBbUHl0aG9uXQoJICAgIHN3aWcgLXB5dGhvbiAtdGhyZWFkcyBub3cgZ2VuZXJhdGVzIEMvQysrIGNvZGUgd2hpY2ggdXNlcyBQeXRob24ncwoJICAgIG93biB0aHJlYWRpbmcgYWJzdHJhY3Rpb24gKGZyb20gcHl0aHJlYWQuaCkgcmF0aGVyIHRoYW4gT1Mgc3BlY2lmaWMKCSAgICBjb2RlLiAgVGhlIG9sZCBjb2RlIGZhaWxlZCB0byBjb21waWxlIG9uIE1TIFdpbmRvd3MuICAoU2VlIFNGIHBhdGNoCgkgICAgdHJhY2tlciAjMTcxMDM0MSkuCgowNS8wNC8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBDaGFuZ2VkIFNUTCByZW5hbWVzIHRvIGJlIGdsb2JhbCByZW5hbWVzLiAgVGhpcyBmaXhlcwoJICAgIFNUTCBmdW5jdGlvbnMgbm90IGJlaW5nIHJlbmFtZWQgd2hlbiBhdXRvcmVuYW1lIGlzIG9uLgogICAgICAgICAgICBUaGlzIGlzIGEgbm90IGEgdG90YWxseSBwZXJmZWN0IHdvcmstYXJvdW5kLCBidXQgYmV0dGVyLgoJICAgIFNvbWVvbmUgcmVhbGx5IG5lZWRzIHRvIGZpeCB0aGUgdGVtcGxhdGUgcmVuYW1pbmcgY29kZS4KCSAgICAoU2VlIGJ1ZyAjMTU0NTYzNCkKCjA1LzA0LzIwMDcgIGdnYQoJICAgIFtBbGxdCiAgICAgICAgICAgIENoYW5nZWQgJXJlbmFtZSgiJSh1bmRlcmNhc2UpcyIpIGEgbGl0dGxlIHNvIHRoYXQgc2luZ2xlCgkgICAgbnVtYmVycyBhdCB0aGUgZW5kIG9mIGEgZnVuY3Rpb24gYXJlIG5vdCB1bmRlcmNhc2VkLiAgVGhhdCBpczoKCQlnZXRTb21ldGhpbmcgLT4gZ2V0X3NvbWV0aGluZwoJCWdldDJECSAgICAgLT4gZ2V0XzJkCgkJZ2V0MjM0CSAgICAgLT4gZ2V0XzIzNAoJICAgIEJVVDoKCQlhc0Zsb2F0MiAgICAgLT4gYXNfZmxvYXQyCgkgICAgKEJ1ZyAjMTY5OTcxNCkKCjA1LzAzLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIE1hZGUgX19zd2lndHlwZV9fID0+IEBfX3N3aWd0eXBlX18gc28gaXQgY2FuIGJlIGFjY2Vzc2VkCgkgICAgZnJvbSB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlIChhbmQgZm9sbG93cyBSdWJ5J3Mgb2ZmaWNpYWwKICAgICAgICAgICAgZG9jdW1lbnRhdGlvbiwganVzdCBpbiBjYXNlKS4KCSAgICBNYWRlIHRyYWNraW5nID0+IEBfX3RyYWNraW5nc19fIGZvciBzYW1lIHJlYXNvbi4KCSAgICBDdXJyZW50bHkgc3RvcmluZyBpdmFycyB3aXRob3V0IHRoZSBAIHNlZW1zIHZhbGlkLCBidXQKCSAgICB0aGUgUGlja0F4ZSBzYXlzIHRoaXMgaXMgbm90IGNvcnJlY3QsIHNvIGp1c3QgaW4gY2FzZS4uLgoKMDUvMDMvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgQXBwbGllZCBwYXRjaCBmb3IgLW1pbmhlcml0IGJ1ZyBhbmQgZXhjZXB0aW9uIGNsYXNzZXMuCgkgICAgVGhpcyBpc3N1ZSBzaG91bGQgYmUgcmV2aXNpdGVkIG1vcmUgY2xvc2VseSwgYXMgTXVsdGlwbGUKCSAgICBJbmhlcml0YW5jZSBpbiBSdWJ5IGlzIHN0aWxsIHByb2JsZW1hdGljLgoJICAgIChwYXRjaC9idWcgIzE2MDQ4NzgpCgowNS8wMy8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBPdmVybG9hZGVkIGZ1bmN0aW9ucyBpbiBydWJ5IHdpbGwgbm93IHJlcG9ydCB0byB0aGUgdXNlcgogICAgICAgICAgICB0aGUgcG9zc2libGUgcHJvdG90eXBlcyB3aGVuIHRoZSB1c2VyIG1pc3R5cGVzIHRoZSBudW1iZXIgb3IKICAgICAgICAgICAgdHlwZSBvZiBhIHBhcmFtZXRlci4KCjA1LzAzLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEZvcmdvdCB0byBkb2N1bWVudCB0aGUgYnVnIGZpeGluZyBvZiBhbiBvbGQgYnVnIHJlZ2FyZGluZwoJICAgIGV4Y2VwdGlvbnMuCgkgICAgKGJ1ZyAjMTQ1ODI0NykKCjA1LzAzLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEZpeGVkIFJ1YnkgZG9jdW1lbnRhdGlvbiB0byB1c2UgdGhlIHByb3BlciBjc3Mgc3R5bGVzIGZvcgoJICAgIGVhY2ggc2VjdGlvbi4gQWRkZWQgYXV0b2RvYyBzZWN0aW9uIHRvIFJ1YnkncyBkb2NzIHRvCgkgICAgZG9jdW1lbnQgdGhlIGZlYXR1cmVzIHN1cHBvcnRlZCBieSBSdWJ5IGluIGRvY3VtZW50aW5nIGl0cyBtb2R1bGVzLgoJICAgIE1hZGUgcmRvYyBkb2N1bWVudGF0aW9uIHNwaXQgb3V0IHRoZSBmdWxsIG5hbWUgb2YgdGhlIGNsYXNzICsKCSAgICBtZXRob2QgbmFtZS4gIEFsYmVpdCB0aGlzIHdpbGwgbWFrZSB0aGUgY3VycmVudCByZG9jIG5vdCByZWNvZ25pemUKICAgICAgICAgICAgdGhlIG1ldGhvZCwgdGhpcyBpcyBzdGlsbCBuZWVkZWQgdG8gZGlzYW1iaWd1YXRlIGJldHdlZW4gZGlmZmVyZW50CiAgICAgICAgICAgIGNsYXNzZXMgd2l0aCBzaW1pbGFyIG1ldGhvZHMgKHJkb2Mgd2FzIGNyZWF0ZWQgdG8gZG9jdW1lbnQgdGhlCgkgICAgcnVieSBzb3VyY2Ugd2hpY2ggb25seSBjb250YWlucyBvbmUgY2xhc3MgcGVyIGMgZmlsZSwgdW5saWtlIHN3aWcpCiAgICAgICAgICAgIEkgaGF2ZSBwYXRjaGVkIHJkb2MgdG8gbWFrZSBpdCBtb3JlIGZyaWVuZGx5IHRvIHN3aWcuICBUaGlzCiAgICAgICAgICAgIHBhdGNoIG5lZWRzIHRvIGJlIG1lcmdlZCBpbiB0aGUgcnVieSBzdGQgbGlicmFyeSBub3cuCgowNS8wMy8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBDaGFuZ2VkIGZsYWcgLWZlYXR1cmUgdG8gYmUgLWluaXRfbmFtZSB0byBiZXR0ZXIgcmVmbGVjdCBpdHMKCSAgICBwdXJwb3NlIGFuZCBhdm9pZCBjb25mdXNpb24gd2l0aCAtZmVhdHVyZXMuCgowNS8wMy8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBJbXByb3ZlZCBhdXRvZG9jIGdlbmVyYXRpb24uCgkgICAgQWRkZWQgYXV0b2RvYyAuc3dnIGZpbGVzIHRvIFJ1YnkgbGlicmFyeSBmb3IgZWFzaWx5IGFkZGluZwoJICAgIGRvY3VtZW50YXRpb24gdG8gY29tbW9uIFJ1YnkgbWV0aG9kcyBhbmQgU1RMIG1ldGhvZHMuCgkgICAgRml4ZWQgYXV0b2RvYyBkb2N1bWVudGluZyBvZiBnZXR0ZXJzIGFuZCBzZXR0ZXJzIGFuZCBtb2R1bGUuCgkgICAgTWFkZSB0ZXN0IHN1aXRlIGFsd2F5cyBnZW5lcmF0ZSBhdXRvZG9jcy4KCjA1LzAzLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIFJlbW92ZWQgc29tZSB3YXJuaW5ncyBmcm9tIFNUTCBhbmQgdGVzdCBzdWl0ZS4KCjA1LzAyLzIwMDc6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEZpeGVkIGlzc3VlcyB3aXRoIEMrKyBjbGFzc2VzIGFuZCBoaWVyYWNoaWVzIGFjcm9zcyBtdWx0aXBsZQoJICAgIHNvdXJjZSBmaWxlcy4gRml4ZWQgaW1wb3J0cyB0ZXN0IGNhc2UgJiBhZGRlZCBydW4gdGVzdC4KCSAgICBBZGRlZCBFeGFtcGxlcy9pbXBvcnRzLgoJICAgIEFkZGVkIHR5cGVuYW1lIGZvciByYXcgbHVhX1N0YXRlKgoJICAgIEFkZGVkIGRvY3VtZW50YXRpb24gb24gbmF0aXZlIGZ1bmN0aW9ucy4KCjA1LzAyLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIERvY3N0cmluZ3MgYXJlIG5vdyBzdXBwb3J0ZWQuCgkgICAgJWZlYXR1cmUoImF1dG9kb2MiKSBhbmQgJWZlYXR1cmUoImRvY3N0cmluZyIpIGFyZSBub3cKCSAgICBwcm9wZXJseSBzdXBwb3J0ZWQgaW4gUnVieS4gIFRoZXNlIGZlYXR1cmVzIHdpbGwgZ2VuZXJhdGUKCSAgICBhIF93cmFwLmN4eCBmaWxlIHdpdGggcmRvYyBjb21tZW50cyBpbiB0aGVtLgoKMDUvMDIvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgU1RMIGZpbGVzIGhhdmUgYmVlbiB1cGdyYWRlZCB0byBmb2xsb3cgdGhlIG5ldyBzd2lnL3B5dGhvbgoJICAgIExpYi9zdGQgY29udmVudGlvbnMuCgkgICAgVGhpcyBtZWFucyBzdGQ6OnZlY3Rvciwgc3RkOjpzZXQsIHN0ZDo6bWFwLCBzZXQ6Om11bHRpbWFwLAoJICAgIHN0ZDo6bXVsdGlzZXQsIHN0ZDo6ZGVxdWUgYW5kIHN0ZDo6c3RyaW5nIGFyZSBub3cgcHJvcGVybHkKCSAgICBzdXBwb3J0ZWQsIGluY2x1ZGluZyB0aGVpciBpdGVyYXRvcnMsIHN1cHBvcnQgZm9yIGNvbnRhaW5pbmcKCSAgICBydWJ5IG9iamVjdHMgKHN3aWc6OkdDX1ZBTFVFKSBhbmQgc2V2ZXJhbCBvdGhlciBydWJ5CgkgICAgZW5oYW5jZW1lbnRzLgoJICAgIHN0ZDo6Y29tcGxleCwgc3RkOjppb3MsIHN0ZDo6aW9zdHJlYW0sIHN0ZDo6aW9zdHJlYW1idWYgYW5kCgkgICAgc3RkOjpzc3RyZWFtIGFyZSBub3cgYWxzbyBzdXBwb3J0ZWQuCgkgICAgc3RkOjp3c3RyaW5nLCBzdGQ6Ondpb3MsIHN0ZDo6d2lvc3RyZWFtLCBzdGQ6Ondpb3N0cmVhbWJ1ZgoJICAgIGFuZCBzdGQ6Ondzc3RyZWFtIGFyZSBzdXBwb3J0ZWQgdmVyYmF0aW0gd2l0aCBubyB1bmljb2RlCgkgICAgY29udmVyc2lvbi4KCgkgICAgc3RkX3ZlY3Rvci5pIG5vdyBtaW1pY3MgdGhlIGJlaGF2aW9yIG9mIFJ1YnkgQXJyYXlzIG11Y2ggbW9yZQoJICAgIGNsb3NlbHksIHN1cHBvcnRpbmcgc2xpY2luZywgc2hpZnRpbmcsIHVuc2hpZnRpbmcsCiAgICAgICAgICAgIG11bHRpcGxlIGluZGV4aW5nIGFuZCBwcm9wZXIgcmV0dXJuIHZhbHVlcyBvbiBhc3NpZ25tZW50LgoKCSAgICBDT01QQVRBQklMSVRZIE5PVEU6IHRoaXMgY2hhbmdlcyB0aGUgb2xkZXIgYXBpIGEgbGl0dGxlIGJpdCBpbgoJICAgIHRoYXQgaW1wcm9wZXIgaW5kZXhpbmcgd291bGQgcHJldmlvdXNseSAoaW5jb3JyZWN0bHkpIHJhaXNlCgkgICAgZXhjZXB0aW9ucy4gIE5vdywgbmlsIGlzIHJldHVybmVkIGluc3RlYWQsIGZvbGxvd2luZyBydWJ5J3MKCSAgICBzdGFuZGFyZCBBcnJheSBiZWhhdmlvci4KCjA1LzAyLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIENoYW5nZWQgdGhlIHZhbHVlIG9mIFNXSUdfVFlQRUNIRUNLX0JPT0wgdG8gYmUgMTAwMDAgKGllLiBoaWdoZXIKCSAgICB0aGFuIHRoYXQgb2YgYWxsIGludGVnZXJzKS4KCSAgICBUaGlzIGlzIGJlY2F1c2UgUnVieSBhbGxvd3MgdHlwZWNhc3RpbmcKCSAgICBpbnRlZ2VycyBkb3duIHRvIGJvb2xlYW5zIHdoaWNoIGNhbiBtYWtlIG92ZXJsb2FkZWQgZnVuY3Rpb25zIG9uCgkgICAgYm9vbHMgYW5kIGludGVnZXJzIHRvIGZhaWwuCgkgICAgKGJ1ZyMgMTQ4ODE0MikKCjA1LzAyLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEZpeGVkIGEgc3VidGxlIGJ1ZyBpbiBtdWx0aXBsZSBhcmdvdXRzIHRoYXQgY291bGQgZ2V0IHRyaWdnZXJlZCBpZgoJICAgIHRoZSB1c2VyIHJldHVybmVkIHR3byBvciBtb3JlIGFyZ3VtZW50cyBhbmQgdGhlIGZpcnN0IG9uZSB3YXMgYW4KCSAgICBhcnJheS4KCjA1LzAxLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEltcHJvdmVkIHRoZSBkb2N1bWVudGF0aW9uIHRvIGRvY3VtZW50IHRoZSBuZXcgZmVhdHVyZXMKICAgICAgICAgICAgYWRkZWQsIGFkZCBkaXJlY3RvcmluL291dC9hcmdvdXQgdHlwZW1hcHMsIGV0Yy4KCjA1LzAxLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEFkZGVkICVpbml0c3RhY2sgYW5kICVpZ25vcmVzdGFjayBkaXJlY3RpdmVzIGZvciBkaXJlY3RvcgoJICAgIGZ1bmN0aW9ucy4gIFRoZXNlIGFsbG93IHlvdSB0byBjb250cm9sIHdoZXRoZXIgYSBkaXJlY3RvcgoJICAgIGZ1bmN0aW9uIHNob3VsZCByZS1pbml0IHRoZSBSdWJ5IHN0YWNrLgoJICAgIFRoaXMgaXMgc29tZXRpbWVzIG5lZWRlZCBmb3IgYW4gZW1iZWRkZWQgUnVieSB3aGVyZSB0aGUKCSAgICBkaXJlY3RvciBtZXRob2QgaXMgdXNlZCBhcyBhIEMrKyBjYWxsYmFjayBhbmQgbm90IGNhbGxlZAogICAgICAgICAgICBieSB0aGUgdXNlciBmcm9tIHJ1YnkgY29kZS4KCSAgICBFeHBsYW5hdGlvbjoKCSAgICBSdWJ5J3MgR0MgbmVlZHMgdG8gYmUgYXdhcmUgb2YgdGhlIHJ1bm5pbmcgT1Mgc3RhY2sgaW4gb3JkZXIgdG8KCSAgICBtYXJrIGFueSBWQUxVRSAoUnVieSBvYmplY3RzKSBpdCBmaW5kcyB0aGVyZSB0byBhdm9pZCBjb2xsZWN0aW9uCgkgICAgb2YgdGhlbS4gIFRoaXMgYWxsb3dzIHRoZSBydWJ5IEFQSSB0byBiZSB2ZXJ5IHNpbXBsZSBhbmQgYWxsb3dzCgkgICAgeW91IHRvIHdyaXRlIGNvZGUgbGlrZSAiVkFMVUUgYSA9IHN0aCIgYW55d2hlcmUgd2l0aG91dCBuZWVkaW5nCgkgICAgdG8gZG8gdGhpbmdzIGxpa2UgcmVmY291bnRpbmcgbGlrZSBweXRob24uCgkgICAgQnkgZGVmYXVsdCwgdGhlIHN0YXJ0IG9mIHRoZSBzdGFjayBpcyBzZXQgd2hlbiBydWJ5X2luaXQoKSBpcwoJICAgIGNhbGxlZC4gICBJZiBydWJ5IGlzIGluaXRlZCB3aXRoaW4gbWFpbigpLCBhcyBpdCB1c3VhbGx5IGlzIHRoZQoJICAgIGNhc2Ugd2l0aCB0aGUgbWFpbiBydWJ5IGV4ZWN1dGFibGUsIHJ1Ynkgd2lsbCBiZSBhYmxlIHRvIGNhbGN1bGF0ZQoJICAgIGl0cyBzdGFjayBwcm9wZXJseS4gIEhvd2V2ZXIsIHdoZW4gdGhpcyBpcyBub3QgcG9zc2libGUsIGFzIHdoZW4KCSAgICBydWJ5IGlzIGVtYmVkZGVkIGFzIGEgcGx1Z2luIHRvIGFuIGFwcGxpY2F0aW9uIHdoZXJlIG1haW4gaXMgbm90CgkgICAgYXZhaWxhYmxlLCBydWJ5X2luaXQoKSB3aWxsIGJlIGNhbGxlZCBpbiB0aGUgd3JvbmcgcGxhY2UsIGFuZAoJICAgIHJ1Ynkgd2lsbCBiZSBpbmNvcnJlY3RseSB0cmFja2luZyB0aGUgc3RhY2sgZnJvbSB0aGUgZnVuY3Rpb24KCSAgICB0aGF0IGNhbGxlZCBydWJ5X2luaXQoKSBmb3J3YXJkcyBvbmx5LCB3aGljaCBjYW4gbGVhZCB0bwoJICAgIGFsbCBzb3J0cyBvZiB3ZWlyZCBjcmFzaGVzIG9yIHRvIHJ1YnkgdGhpbmtpbmcgaXQgaGFzIHJ1biBvdXQgb2YKCSAgICBzdGFjayBzcGFjZSBpbmNvcnJlY3RseS4KCSAgICBUbyBhdm9pZCB0aGlzLCBkaXJlY3RvciAoY2FsbGJhY2spIGZ1bmN0aW9ucyBjYW4gbm93IGJlIHRhZ2dlZAoJICAgIHRvIHRyeSB0byByZXNldCB0aGUgcnVieSBzdGFjaywgd2hpY2ggd2lsbCBzb2x2ZSB0aGUgaXNzdWVzLgoJICAgIE5PVEU6IHJ1YnkxLjguNiBzdGlsbCBjb250YWlucyBhIGJ1ZyBpbiBpdCBpbiB0aGF0IGl0cyBmdW5jdGlvbgoJICAgIHRvIHJlc2V0IHRoZSBzdGFjayB3aWxsIG5vdCBhbHdheXMgZG8gc28uICBUaGlzIGJ1ZyBpcyB0cmlnZ2VyZWQKCSAgICB2ZXJ5IHJhcmVseSwgd2hlbiBydWJ5IGlzIGNhbGxlZCBmcm9tIHR3byB2ZXJ5IGRpc3RpbmN0IHBsYWNlcwoJICAgIGluIG1lbW9yeSwgbGlrZSBhIGJyYW5jaCBvZiBtYWluKCkgYW5kIGFub3RoZXIgZHNvLiAgVGhpcyBidWcKCSAgICBoYXMgbm93IGJlZW4gcmVwb3J0ZWQgdG8gcnVieS1jb3JlIGFuZCBpcyBwZW5kaW5nIGZ1cnRoZXIKCSAgICBpbnZlc3RpZ2F0aW9uLgoJICAgIChidWcgIzE3MDA1MzUgYW5kIHBhdGNoICMxNzAyOTA3KQoKMDQvMzAvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxNzA3NTgyIC0gUmVzdG9yZSBidWlsZGluZyBmcm9tIHJlYWQtb25seSBzb3VyY2UgZGlyZWN0b3JpZXMuCgowNC8zMC8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBSdWJ5IHdpbGwgbm93IHJlcG9ydCB0aGUgcGFyYW1ldGVyIGluZGV4IHByb3Blcmx5IG9uIHR5cGUKCSAgICBlcnJvcnMgYXMgd2VsbCBhcyB0aGUgY2xhc3MgYW5kIHZhbHVlIG9mIHRoZSBpbmNvcnJlY3QKCSAgICBhcmd1bWVudCBwYXNzZWQuCgkgICAgKGZlYXR1cmUgcmVxdWVzdCAjMTY5OTY3MCkKCjA0LzMwLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIFJ1Ynkgbm8gbG9uZ2VyIGNyZWF0ZXMgdGhlIGZyZWVfQ2xhc3MgZnVuY3Rpb24gaWYgdGhlIGNsYXNzCgkgICAgY29udGFpbnMgaXRzIG93biB1c2VyIGRlZmluZWQgZnJlZSBmdW5jdGlvbiAoJWZyZWVmdW5jKS4KCSAgICAoYnVnICMxNzAyODgyKQoKMDQvMzAvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgTWFkZSBkaXJlY3RvcnMgcmFpc2UgYSBydWJ5IGV4Y2VwdGlvbiBmb3IgaW5jb3JyZWN0IGFyZ291dAoJICAgIHJldHVybmVkIHZhbHVlcyBpZiBSVUJZX0VNQkVEREVEIGlzIHNldCwgaW5zdGVhZCBvZiB0aHJvd2luZwoJICAgIGFuIGFjdHVhbCBTd2lnRGlyZWN0b3IgZXhjZXB0aW9uLgoJICAgIFRoaXMgd2lsbCBwcmV2ZW50IGNyYXNoZXMgd2hlbiBydWJ5IGlzIGVtYmVkZGVkIGFuZCB1bmF3YXJlCgkgICAgb2YgdGhlIFN3aWdEaXJlY3RvciBleGNlcHRpb24uCgowNC8zMC8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBSZW1vdmVkIHRoZSBuZWVkIGZvciAtRFNXSUdFWFRFUk4uCgkgICAgQ2hhbmdlZCBzd2lnX3J1YnlfdHJhY2tpbmdzIHRvIGJlIGEgc3RhdGljIHZhcmlhYmxlLCBidXQgYWxzbwoJICAgIGJlIGtlcHQgd2l0aGluIGEgaGlkZGVuIGluc3RhbmNlIHZhcmlhYmxlIGluIHRoZSBTV0lHIG1vZHVsZS4KCSAgICBUaGlzIGFsbG93cyBwcm9wZXJseSBkZWFsaW5nIHdpdGggdHJhY2tpbmdzIGFjcm9zcyBtdWx0aXBsZQoJICAgIERTT3MsIHdoaWNoIHdhcyBwcmV2aW91c2x5IGJyb2tlbi4KCSAgICAoYnVnICMxNzAwNTM1IGFuZCBpbXByb3ZlbWVudCB0byBwYXRjaCAjMTcwMjkwNykKCjA0LzI5LzIwMDc6IGdnYQoJICAgIFtSdWJ5XSBGaXhlZCBHQyBtZW1vcnkgaXNzdWVzIHdpdGggdHJhY2tpbmdzIHRoYXQgY291bGQgbGVhZAoJICAgIHRvIHNlZ2ZhdWx0cyB3aGVuIGRlYWxpbmcsIG1haW5seSwgd2l0aCBzdGF0aWMgdmFyaWFibGVzLgoJICAgIChidWcgIzE3MDA1MzUgYW5kIHBhdGNoICMxNzAyOTA3KQoKMDQvMjkvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgRml4ZWQgU3RyaW5nIGNvbnZlcnNpb24gdXNpbmcgb2xkIHJ1YnkxLjYgbWFjcm9zLiAgTm93CgkgICAgU3RyaW5nVmFsdWVQdHIoKSBpcyB1c2VkIGlmIGF2YWlsYWJsZS4gIFRoaXMgcmVtb3ZlcyB3YXJuaW5ncwoJICAgIHdoZW4gY29udmVydGluZyBzdHJpbmdzIHdpdGggXDAgaW4gdGhlbS4KCSAgICAoYnVnICMxNzAwNTM1IGFuZCBwYXRjaCAjMTcwMjkwNykKCjA0LzI5LzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEZpeGVkIHRoZSBhcmdvdXQgY291bnQgaW4gZGlyZWN0b3JzIGZvciBSdWJ5LiAgUHJldmlvdXNseSwKCSAgICBpZ25vcmVkIG9yICJudW1pbnB1dHM9MCIgdHlwZW1hcHMgd291bGQgaW5jb3JyZWN0bHkgbm90IGdldAoJICAgIGNvdW50ZWQgdG93YXJkcyB0aGUgYXJnb3V0IGNvdW50LgoJICAgIChidWcvcGF0Y2ggIzE1NDU1ODUpCgowNC8yOS8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBVcGdyYWRlZCBSdWJ5IGNvbnZlcnRlciB0byByZWNvZ25pemUgIm51bWlucHV0cz0wIi4gIFByZXZpb3VzbHksCgkgICAgb25seSB0aGUgb2xkICJpZ25vcmUiIGZsYWcgd2FzIGNoZWNrZWQgKHdoaWNoIHdvdWxkIGN1cnJlbnRseQoJICAgIHN0aWxsIHdvcmsgcHJvcGVybHksIGJ1dCBpcyBkZXByZWNhdGVkKS4KCjA0LzI5LzIwMDc6IGdnYQoJICAgIFtSdWJ5IC0gYnV0IHNob3VsZCBiZSBtYWRlIGdlbmVyaWNdCgoJICAgICVmZWF0dXJlKCJudW1vdXRwdXRzIiwiMCIpIGFkZGVkLgoKCSAgICBUaGlzIGZlYXR1cmUgYWxsb3dzIHlvdSB0byBpZ25vcmUgdGhlIG91dHB1dCBvZiBhIGZ1bmN0aW9uIHNvCgkgICAgdGhhdCBpdCBpcyBub3QgYWRkZWQgdG8gYSBsaXN0IG9mIG91dHB1dCB2YWx1ZXMKCSAgICAoIGllLiBhcmdvdXRzICkuCgkgICAgVGhpcyBzaG91bGQgYWxzbyBiZWNvbWUgYSBmZWF0dXJlIG9mICV0eXBlbWFwKGRpcmVjdG9yb3V0KQoJICAgIGFzICJudW1vdXRwdXRzIj0wLCBqdXN0IGxpa2UgIm51bWlucHV0cyI9MCBleGlzdHMuCgoJICAgICVmZWF0dXJlKCJkaXJlY3RvcnMiPTEpCgoJICAgICVpbmNsdWRlIDx0eXBlbWFwcy5pPgoKCSAgICAlZmVhdHVyZSgibnVtb3V0cHV0cyIsIjAiKSB7IENsYXNzOjptZW1iZXJfZnVuY3Rpb24xIH07CgkgICAgJXR5cGVtYXAob3V0KSBNU3RhdHVzIHsgLy8gc29tZSBjb2RlLCBsaWtlIGNoZWNrIG1zdGF0dXMKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgcmFpc2UgZXhjZXB0aW9uIGlmIHdyb25nIH07CgoJICAgICVpbmxpbmUgJXsKCSAgICAgIHR5cGVkZWYgaW50IE1TdGF0dXM7CgkgICAgICBjbGFzcyBDbGFzcyB7CgoJICAgICAgLy8gb25lIGFyZ3VtZW50IHJldHVybmVkLCBidXQgZGlyZWN0b3Igb3V0IGNvZGUgYWRkZWQKCSAgICAgIC8vIE1TdGF0dXMgaXMgZGlzY2FyZGVkIGFzIGEgcmV0dXJuIChvdXQpIHBhcmFtZXRlci4KCSAgICAgIHZpcnR1YWwgTVN0YXR1cyBtZW1iZXJfZnVuY3Rpb24xKCBpbnQmIE9VVFBVVCApOwoKCSAgICAgIC8vIHR3byBhcmd1bWVudHMgcmV0dXJuZWQsIGRpcmVjdG9yIG91dCBjb2RlIGFkZGVkCgkgICAgICAvLyBNU3RhdHVzIGlzIG5vdCBkaXNjYXJkZWQKCSAgICAgIHZpcnR1YWwgTVN0YXR1cyBtZW1iZXJfZnVuY3Rpb24yKCBpbnQmIE9VVFBVVCApOwoJICAgICAgfTsKICAgICAgICAgICAgJX0KCgowNC8yMS8yMDA3OiBvbGx5CgkgICAgRml4IHBhcnNpbmcgb2YgZmxvYXQgY29uc3RhbnRzIHdpdGggYW4gZXhwb25lbnQgKGUuZy4gMWUtMDJmKQoJICAgIChidWcgIzE2OTk2NDYpLgoKMDQvMjAvMjAwNzogb2xseQoJICAgIFtQeXRob25dIEZpeCBsYWNrIG9mIGdlbmVyYXRpb24gb2YgZG9jc3RyaW5ncyB3aGVuIC1PIGlzIHVzZWQuCgkgICAgQWxzbywgZml4IGdlbmVyYXRpb24gb2YgZG9jc3RyaW5ncyBjb250YWluaW5nIGEgZG91YmxlIHF1b3RlCgkgICAgY2hhcmFjdGVyLiAgUGF0Y2ggZnJvbSBSaWNoYXJkIEJvdWx0b24gaW4gYnVnIzE3MDAxNDYuCgowNC8xNy8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIFN1cHBvcnQgZm9yIGFkZGluZyBpbiBKYXZhL0MjIGNvZGUgYmVmb3JlIGFuZCBhZnRlciB0aGUgaW50ZXJtZWRpYXJ5IGNhbGwsCiAgICAgICAgICAgIHNwZWNpZmljYWxseSByZWxhdGVkIHRvIHRoZSBtYXJzaGFsbGluZyBvZiB0aGUgcHJveHkgdHlwZSB0byB0aGUgaW50ZXJtZWRpYXJ5IHR5cGUuCiAgICAgICAgICAgIFRoZSBqYXZhaW4vY3NpbiB0eXBlbWFwIG5vdyBzdXBwb3J0cyB0aGUgJ3ByZScgYW5kICdwb3N0JyBhdHRyaWJ1dGVzIHRvIGFjaGlldmUgdGhpcy4KICAgICAgICAgICAgVGhlIGphdmFpbiB0eXBlbWFwIGFsc28gc3VwcG9ydHMgYW4gb3B0aW9uYWwgJ3BnY3BwbmFtZScgYXR0cmlidXRlIGZvciBwcmVtYXR1cmUgZ2FyYmFnZQogICAgICAgICAgICBjb2xsZWN0aW9uIHByZXZlbnRpb24gcGFyYW1ldGVyIG5hbWluZyBhbmQgdGhlIGNzaW4gdHlwZW1hcCBzdXBwb3J0cyBhbiBvcHRpb25hbCAnY3NoaW4nCiAgICAgICAgICAgIGF0dHJpYnV0ZSBmb3IgdGhlIHBhcmFtZXRlciB0eXBlIHVzZWQgaW4gYSBjb25zdHJ1Y3RvciBoZWxwZXIgZ2VuZXJhdGVkIHdoZW4gdGhlIHR5cGUgaXMgdXNlZAogICAgICAgICAgICBpbiBhIGNvbnN0cnVjdG9yLiBEZXRhaWxzIGluIHRoZSBKYXZhLmh0bWwgYW5kIENTaGFycC5odG1sIGRvY3VtZW50YXRpb24uCgowNC8xNi8yMDA3OiBvbGx5CgkgICAgRG9uJ3QgdHJlYXQgYHJlc3RyaWN0JyBhcyBhIHJlc2VydmVkIGlkZW50aWZpZXIgaW4gQysrIG1vZGUKCSAgICAoYnVnIzE2ODU1MzQpLgoKMDQvMTYvMjAwNzogb2xseQoJICAgIFtQSFA1XSBGaXggaG93IHplbmRfdGhyb3dfZXhjZXB0aW9uKCkgaXMgY2FsbGVkIChidWcgIzE3MDA3ODUpLgoKMDQvMTAvMjAwNzogb2xseQoJICAgIERlZmluZSBTV0lHVEVNUExBVEVESVNBTUJJR1VBVE9SIHRvIHRlbXBsYXRlIGZvciBhQ0MgKHJlcG9ydGVkIG9uCgkgICAgc3dpZy11c2VyIHRoYXQgdGhpcyBpcyBuZWVkZWQpLgoKMDQvMDQvMjAwNzogb2xseQoJICAgIFtQSFA1XSBJZiBaVFMgaXMgZW5hYmxlZCwgcmVsZWFzZSA8bW9kdWxlPl9nbG9iYWxzX2lkIGluIE1TSFVURE9XTgoJICAgIHRvIGF2b2lkIFBIUCBpbnRlcnByZXRlciBjcmFzaCBvbiBzaHV0ZG93bi4gIFRoaXMgc29sdXRpb24gd2FzCgkgICAgc3VnZ2VzdGVkIGhlcmU6IGh0dHA6Ly9idWdzLnBocC5uZXQvYnVnLnBocD9pZD00MDk4NQoKMDQvMDMvMjAwNzogb2xseQoJICAgIFtQSFA0XSBBZGQgbWlzc2luZyBaVFMgYW5ub3RhdGlvbnMgdG8gZ2VuZXJhdGVkIEMrKyB3cmFwcGVyIGNvZGUKCSAgICB0byBmaXggY29tcGlsYXRpb24gZmFpbHVyZXMgd2hlbiB1c2luZyBaVFMgZW5hYmxlZCBTV0lHIChMaW51eAoJICAgIGRpc3RyaWJ1dGlvbnMgdGVuZCB0byBkaXNhYmxlIFpUUywgYnV0IG5vdGFibHkgdGhlIFdpbmRvd3MgYnVpbGQKCSAgICB1c2VzIGl0IGJ5IGRlZmF1bHQpLgoKMDQvMDEvMjAwNzogZWZ1enp5b25lCiAgICAgICAgICAgIFtDRkZJXSBQYXRjaCAjMTY4NDI2MTogZml4ZXMgaGFuZGxpbmcgb2YgdW5zaWduZWQgaW50IGxpdGVyYWxzLCB0aGFua3MgTGVpZ2ggU21pdGguCiAgICAgICAgICAgIEFsc28sIGltcHJvdmVkIGRvY3VtZW50YXRpb24uCgowMy8zMC8yMDA3OiBvbGx5CgkgICAgQXZvaWQgZ2VuZXJhdGluZyAnPDonIHRva2VuIHdoZW4gdXNpbmcgU3dpZ1ZhbHVlV3JhcHBlcjw+IG9uIGEgdHlwZQoJICAgIHdoaWNoIHN0YXJ0cyB3aXRoICc6OicgKHBhdGNoICMxNjkwOTQ4KS4KCjAzLzI1LzIwMDc6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtwZXJsNV0gQWRkIFNXSUdfZmFpbCB0byB0aGUgU1dJR19leGNlcHRpb24gbWFjcm8uICBGaXhlcyBhIGZldyBwcm9ibGVtcyByZXBvcnRlZAoJICAgIG9uIHRoZSBtYWlsaW5nIGxpc3QuCgowMy8yMy8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBTdHJpbmcgY29weWluZyBwYXRjaCBmcm9tIEpvc2ggQ2hlcnJ5IHJlZHVjaW5nIG1lbW9yeSBjb25zdW1wdGlvbiBieSBhYm91dCAyNSUuCgowMy8yMS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gQXBwbHkgcGF0Y2ggIzE2MzE5ODcgZnJvbSBVbHJpayBQZXRlcnNvbiAtIGJvb2wgSU5PVVQgdHlwZW1hcHMKICAgICAgICAgICAgZmFpbCBvbiBiaWcgZW5kaWFuIG1hY2hpbmVzLgoKMDMvMTYvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNlZyBmYXVsdCBnaXZlbiBkb2RneSBDKysgY29kZTogbmFtZXNwYWNlIGFiYzo6ZGVmIHsgfQoKMDMvMTYvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeGVzIHNvIHRoYXQgQVJSQVlTT0ZDTEFTU0VTIGFuZCBBUlJBWVNPRkVOVU1TIGluIGFycmF5c19qYXZhLmkgY2FuIGJlIGFwcGxpZWQKICAgICAgICAgICAgdG8gcG9pbnRlciB0eXBlcy4KCjAzLzAzLzIwMDc6IG9sbHkKCSAgICBbUEhQNV0gV2hlbiB3ZSBrbm93IHRoZSBsaXRlcmFsIG51bWVyaWMgdmFsdWUgZm9yIGEgY29uc3RhbnQsIHVzZQoJICAgIHRoYXQgdG8gaW5pdGlhbGlzZSB0aGUgY29uc3QgbWVtYmVyIGluIHRoZSBQSFAgd3JhcHBlciBjbGFzcy4KCjAzLzAyLzIwMDc6IG9sbHkKCSAgICBbUEhQNV0gRml4IFBIUCB3cmFwcGVyIGNvZGUgZ2VuZXJhdGVkIGZvciBjZXJ0YWluIGNhc2VzIG9mCgkgICAgb3ZlcmxvYWRlZCBmb3JtcyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzLgoKMDIvMjYvMjAwNzogZWZ1enp5b25lCiAgICAgICAgICAgIFtDRkZJXSBQYXRjaCAjMTY1NjM5NTogZml4ZWQgaGV4IGFuZCBvY3RhbCB2YWx1ZXMgYnVnLCB0aGFua3MgdG8gQXJ0aHVyIFNteWxlcy4KCjAyLzIyLzIwMDc6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEZpeGVkIGJ1ZyBpbiB0eXBlbWFwcyB3aGljaCBjYXVzZWQgZGVyaXZlZF9ieXZhbHVlIGFuZCBybmFtZSB0ZXN0IGNhc2VzIHRvIGZhaWwuCgkgICAgVXBkYXRlZCBkZXJpdmVkX2J5dmFsdWUuaSB0byBleHBsYWluIGhvdyB0byBmaW5kIGFuZCBmaXggdGhlIHByb2JsZW0KCjAxLzI1LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTUzODUyMiBhbmQgIzEzMzg1MjcsIGZvcndhcmQgdGVtcGxhdGVkIGNsYXNzIGRlY2xhcmF0aW9ucyB3aXRob3V0IGEKICAgICAgICAgICAgbmFtZSBmb3IgdGhlIHRlbXBsYXRlZCBjbGFzcyBwYXJhbWV0ZXJzLCBzdWNoIGFzOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIGNsYXNzPiBjbGFzcyBYOwoKMDEvMjMvMjAwNzogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gUGF0Y2ggIzE2NDA4NjI6IDxtYWxsb2MuaD4gcmVwbGFjZWQgYnkgPHN0ZGxpYi5oPgoJICAgIFBhdGNoICMxNTk4MDYzIFR5cG8gaW4gdHlwZW1hcHMuaQoKMDEvMjIvMjAwNzogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gQWRkZWQgYSBsdWEgc3BlY2lmaWMgY2FycmF5cy5pIHdoaWNoIGFkZHMgdGhlIG9wZXJhdG9yW10gc3VwcG9ydC4KCSAgICBtb2RpZmllZCB0aGUgbWFpbiBjb2RlIHRvIG1ha2UgaXQgbm90IGVtaXQgYWxsIHRoZSBjbGFzcyBtZW1iZXIgZnVuY3Rpb25zICYgYWNjZXNzb3JzCgkgICAgTm90ZTogQyBzdHJ1Y3RzIGFyZSBjcmVhdGVkIHVzaW5nIG5ld19YWFgoKSB3aGlsZSBDKysgY2xhc3NlcyB1c2UgWFhYKCkgKHNob3VsZCBiZSBzdGFuZGFyZGlzZWQpCgkgICAgVXBkYXRlZCB0ZXN0IGNhc2U6IGxpX2NhcnJheXMKCSAgICBVcGRhdGVkIHRoZSBkb2N1bWVudGF0aW9uLgoKMDEvMTIvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW1BocF0gQWRkIHN1cHBvcnQgZm9yIG5ld2ZyZWUgdHlwZW1hcHMgKHNvbWV0aW1lcyB1c2VkIGJ5ICVuZXdvYmplY3QpCgowMS8xMi8yMDA3OiBiZWF6bGV5CiAgICAgICAgICAgIE5ldyBjb21tYW5kIGxpbmUgb3B0aW9uIC1tYWNyb2Vycm9ycy4gICBXaGVuIHN1cHBsaWVkLCB0aGlzIHdpbGwgZm9yY2UKICAgICAgICAgICAgdGhlIEMgc2Nhbm5lci9wYXJzZXIgdG8gcmVwb3J0IHByb3BlciBsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgY29kZSBjb250YWluZWQKICAgICAgICAgICAgaW5zaWRlIFNXSUcgbWFjcm9zIChkZWZpbmVkIHdpdGggJWRlZmluZSkuICBCeSBkZWZhdWx0LCBTV0lHIG1lcmVseSByZXBvcnRzCiAgICAgICAgICAgIGVycm9ycyBvbiB0aGUgbGluZSBhdCB3aGljaCBhIG1hY3JvIGlzIHVzZWQuICBXaXRoIHRoaXMgb3B0aW9uLCB5b3UKICAgICAgICAgICAgY2FuIGV4cGFuZCB0aGUgZXJyb3IgYmFjayB0byBpdHMgc291cmNlLS0tc29tZXRoaW5nIHdoaWNoIG1heSBzaW1wbGlmeQogICAgICAgICAgICBkZWJ1Z2dpbmcuCgowMS8xMi8yMDA3OiBiZWF6bGV5CiAgICAgICAgICAgIFtJbnRlcm5hbHNdIE1ham9yIG92ZXJoYXVsIG9mIEMvQysrIHNjYW5uaW5nIGltcGxlbWVudGF0aW9uLiAgRm9yIHF1aXRlCiAgICAgICAgICAgIHNvbWUgdGltZSwgU1dJRyBjb250YWluZWQgdHdvIGNvbXBsZXRlbHkgaW5kZXBlbmRlbnQgQy9DKysgdG9rZW5pemVycy0tCiAgICAgICAgICAgIHRoZSBsZWdhY3kgc2Nhbm5lciBpbiBDUGFyc2UvY3NjYW5uZXIuYyBhbmQgYSBnZW5lcmFsIHB1cnBvc2Ugc2Nhbm5lcgogICAgICAgICAgICBpbiBTd2lnL3NjYW5uZXIuYy4gU1dJRyBzdGlsbCBoYXMgdHdvIHNjYW5uaW5nIG1vZHVsZXMsIGJ1dCB0aGUgQyBwYXJzZXIKICAgICAgICAgICAgc2Nhbm5lciAoQ1BhcnNlL2NzY2FubmVyLmMpIG5vdyByZWxpZXMgdXBvbiB0aGUgZ2VuZXJhbCBwdXJwb3NlCiAgICAgICAgICAgIHNjYW5uZXIgZm91bmQgaW4gU3dpZy9zY2FubmVyLmMuICBBcyBhIHJlc3VsdCwgaXQgaXMgbXVjaCBzbWFsbGVyIGFuZAogICAgICAgICAgICBsZXNzIGNvbXBsaWNhdGVkLiAgVGhpcyBjaGFuZ2UgYWxzbyBtYWtlcyBpdCBwb3NzaWJsZSB0byBtYWludGFpbiBhbGwKICAgICAgICAgICAgb2YgdGhlIGxvdy1sZXZlbCBDIHRva2VuaXppbmcgaW4gb25lIGNlbnRyYWwgbG9jYXRpb24gaW5zdGVhZCBvZiB0d28KICAgICAgICAgICAgcGxhY2VzIGFzIGJlZm9yZS4KCiAgICAgICAgICAgICoqKlBPVEVOVElBTCBGTEFLSU5FU1MqKioKICAgICAgICAgICAgVGhpcyBjaGFuZ2UgbWF5IGNhdXNlIHByb2JsZW1zIHdpdGggYWNjdXJhdGUgbGluZSBudW1iZXIgcmVwb3J0aW5nCiAgICAgICAgICAgIGFzIHdlbGwgYXMgZXJyb3IgcmVwb3J0aW5nIG1vcmUgZ2VuZXJhbGx5LiBJIGhhdmUgdHJpZWQgdG8gcmVzb2x2ZSB0aGlzCiAgICAgICAgICAgIGFzIG11Y2ggYXMgcG9zc2libGUsIGJ1dCB0aGVyZSBtaWdodCBiZSBzb21lIGNvcm5lciBjYXNlcy4KCjAxLzEyLzIwMDc6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEFkZGVkIHR5cGVtYXAgdGhyb3dzIGZvciBzdGQ6OnN0cmluZyosIHR5cGVtYXAgZm9yIFNXSUdUWVBFIERZTkFNSUMsCgkgICAgY2hhbmdlZCB0aGUgZXhpc3RpbmcgdGhyb3dzIHR5cGVtYXAgdG8gdGhyb3cgYSBzdHJpbmcgaW5zdGVhZCBvZiBtYWtpbmcgYSBjb3B5IG9mCgkgICAgdGhlIG9iamVjdCAodXBkYXRpbmcgYSBmZXcgdGVzdCBjYXNlcyB0byBkZWFsIHdpdGggdGhlIGNoYW5nZSkuCgkgICAgZml4ZWQgdGVzdCBjYXNlOiBkeW5hbWljX2Nhc3RzLCBleGNlcHRpb25fcGFydGlhbF9pbmZvLCBsaV9zdGRfc3RyaW5nLCBzaXplX3QKCjAxLzAzLzIwMDc6IGJlYXpsZXkKICAgICAgICAgICAgW0ludGVybmFsc10uICBVc2Ugb2Ygc3dpZ2tleXMuYy8uaCB2YXJpYWJsZXMgaXMgcmV2b2tlZC4gIFBsZWFzZSB1c2UKICAgICAgICAgICAgc2ltcGxlIHN0cmluZ3MgZm9yIGF0dHJpYnV0ZSBuYW1lcy4KCjEyLzMwLzIwMDY6IGJlYXpsZXkKICAgICAgICAgICAgSW50ZXJuYWwgQVBJIGZ1bmN0aW9ucyBIYXNoR2V0QXR0cigpIGFuZCBIYXNoQ2hlY2tBdHRyKCkgaGF2ZSBiZWVuIHJldm9rZWQuCiAgICAgICAgICAgIFBsZWFzZSB1c2UgR2V0YXR0cigpIHRvIHJldHJpZXZlIGF0dHJpYnV0ZXMuICBUaGUgZnVuY3Rpb24gQ2hlY2thdHRyKCkgY2FuCiAgICAgICAgICAgIGJlIHVzZWQgdG8gY2hlY2sgYXR0cmlidXRlcy4gIE5vdGU6ICBUaGVzZSBmdW5jdGlvbnMgaGF2ZSBiZWVuIHJldm9rZWQKICAgICAgICAgICAgYmVjYXVzZSB0aGV5IG9ubHkgYWRkZWQgYSBtYXJnaW5hbCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBhdCB0aGUgZXhwZW5zZQogICAgICAgICAgICBjb2RlIGNsYXJpdHkuCgoxMi8yNi8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBBZGRlZCBtb3JlIFNUTCAobW9yZSBleGNlcHRpb25zLCBtYXAsIHNpemVfdCksCgkgICAgZml4ZWQgdGVzdCBjYXNlOiBjb252ZXJzaW9uX25zX3RlbXBsYXRlLgoKMTIvMjEvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gVXBkYXRlIHRvIHRocm93IGVycm9ycyB3aGVuIHNldHRpbmcgaW1tdXRhYmxlcywKCSAgICBhbmQgYWxsb3dpbmcgdXNlciBhZGRpdGlvbiBvZiBtb2R1bGUgdmFyaWFibGVzLgoKMTIvMjAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IHR5cGVkZWYnZCB2YXJpYWJsZSB3cmFwcGVycyB0aGF0IHVzZSAlbmF0dXJhbHZhciwgZWcsIHN0ZDo6c3RyaW5nLgoKMTIvMTQvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBZGQgc3RkOjp3c3RyaW5nIGFuZCB3Y2hhcl90IHR5cGVtYXBzCgoxMi8xNC8yMDA2OiBvbGx5CgkgICAgW3BocF0gRml4IGJ1ZyAjMTYxMzY3MyAoYmFkIFBIUDUgY29kZSBnZW5lcmF0ZWQgZm9yIGdldHRlcnMgYW5kCgkgICAgc2V0dGVycykuCgoxMi8wMi8yMDA2OiB3c2Z1bHRvbiwgSm9obiBMZW56LCBEYXZlIEJlYXpsZXkKICAgICAgICAgICAgTW92ZSBmcm9tIGN2cyB0byBTdWJ2ZXJzaW9uIGZvciBzb3VyY2UgY29udHJvbAoKMTEvMzAvMjAwNjogYmVhemxleQogICAgICAgICAgICBDbGVhbmVkIHVwIHN3aWd3YXJuaW5ncy5zd2cgZmlsZSBub3QgdG8gdXNlIG5lc3RlZCBtYWNybwogICAgICAgICAgICBkZWZpbml0aW9ucy4KCjExLzEyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gRml4IGZvciAlZXh0ZW5kIHRvIHdvcmsgZm9yIHN0YXRpYyBtZW1iZXIgdmFyaWFibGVzLgoKVmVyc2lvbiAxLjMuMzEgKE5vdmVtYmVyIDIwLCAyMDA2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMS8xMi8yMDA2OiBMdWlnaSBCYWxsYWJpbwogICAgICAgICAgICBbUHl0aG9uXSBBbHRlcm5hdGUgZml4IGZvciBQeXRob24gZXhjZXB0aW9ucyBidWcgIzE1NzgzNDYgKHRoZSBwcmV2aW91cyBvbmUgYnJva2UgUHl0aG9uCiAgICAgICAgICAgIHByb3BlcnRpZXMgaW4gbW9kZXJuIGNsYXNzZXMpCgoxMS8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICAtZmFrZXZlcnNpb24gY29tbWFuZGxpbmUgb3B0aW9uIG5vdyBnZW5lcmF0ZXMgdGhlIGZha2UgdmVyc2lvbiBpbnRvIHRoZSBnZW5lcmF0ZWQgd3JhcHBlcnMKICAgICAgICAgICAgYXMgd2VsbCBhcyBkaXNwbGF5aW5nIGl0IHdoZW4gdGhlIC12ZXJzaW9uIGNvbW1hbmRsaW5lIG9wdGlvbiBpcyB1c2VkLgoKMTQvMTEvMjAwNjogbWdvc3NhZ2UKCSAgICBbbHVhXSB1cGRhdGUgdG8gdHlwZW1hcCBmb3Igb2JqZWN0IGJ5IHZhbHVlLCB0byBtYWtlIGl0IGM4OSBjb21wbGlhbnQKClZlcnNpb24gMS4zLjMwIChOb3ZlbWJlciAxMywgMjAwNikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTEvMTIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW2phdmFdIFJlbW92ZSBEZXRhY2hDdXJyZW50VGhyZWFkIHBhdGNoIGZyb20gIDA4LzExLzIwMDYgLSBpdCBjYXVzZXMgc2VnZmF1bHRzCiAgICAgICAgICAgIG9uIHNvbWUgc3lzdGVtcy4KCjExLzEyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtweXRob25dIEZpeCAjMTU3ODM0NiAtIFB5dGhvbiBleGNlcHRpb25zIHdpdGggLW1vZGVybgoKMTEvMTAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxNTkzMjkxIC0gU21hcnQgcG9pbnRlcnMgYW5kIGluaGVyaXRpbmcgZnJvbSB0ZW1wbGF0ZXMgCgoxMS8wOS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZGlyZWN0b3Igb3BlcmF0b3IgcG9pbnRlci9yZWZlcmVuY2UgY2FzdHMgLSAjMTU5MjE3My4KCjExLzA3LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCAkc2VsZiBzcGVjaWFsIHZhcmlhYmxlIGZvciAlZXh0ZW5kIG1ldGhvZHMuIFBsZWFzZSB1c2UgdGhpcyBpbnN0ZWFkIG9mIGp1c3QgJ3NlbGYnCiAgICAgICAgICAgIGFzIHRoZSBDKysgJ3RoaXMnIHBvaW50ZXIuCgoxMS8wNy8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdIAoJICAgIGFsbGVncm9jbC5zd2c6IHN3aWctZGVmdmFyIHVwZGF0ZWQgdG8gYWxsb3cgc3BlY2lmeWluZyBvZgoJICAgIAkJICAgbm9uLWRlZmF1bHQgZm9yZWlnbiB0eXBlICh2aWEgOmZ0eXBlIGtleXdvcmQgYXJnKS4KCSAgICBhbGxlZ3JvY2wuY3h4OiBTcGVjaWZ5IHByb3BlciBhY2Nlc3MgdHlwZSBmb3IgZW51bSB2YWx1ZXMuCgoxMS8wMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YS9DI10gRml4IGNvbnN0IHN0ZDo6c3RyaW5nJiByZXR1cm4gdHlwZXMgZm9yIGRpcmVjdG9ycyBhcyByZXBvcnRlZCBieQogICAgICAgICAgICBNYXJrIERvbnNlbHptYW5uCgoxMC8yOS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUmVtb3ZlIERlbGV0ZUxvY2FsUmVmIGZyb20gZW5kIG9mIGRpcmVjdG9yIG1ldGhvZHMgZm9yIG5vdyBhcyBpdCBpcyBjYXVzaW5nIGEKICAgICAgICAgICAgc2VnIGZhdWx0IHdoZW4gcnVuIG9uIFNvbGFyaXMgOC4KCjEwLzI5LzIwMDY6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtHdWlsZV0gUGF0Y2ggZnJvbSBDaHJpcyBTaG9lbWFrZXIgdG8gY2xlYW4gdXAgc29tZSB3YXJuaW5ncyBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUuCgoxMC8yOS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gSW1wb3J0YW50IGZpeCB0byBwcmV2ZW50IGVhcmx5IGdhcmJhZ2UgY29sbGVjdGlvbiBvZiB0aGUgSmF2YSBwcm94eSBjbGFzcwogICAgICAgICAgICB3aGlsZSBpdCBpcyBiZWluZyB1c2VkIGluIGEgbmF0aXZlIG1ldGhvZC4gVGhlIGZpbmFsaXplciBjb3VsZCBkZXN0cm95IHRoZSB1bmRlcmx5aW5nCiAgICAgICAgICAgIEMrKyBvYmplY3Qgd2hpbGUgaXQgd2FzIGJlaW5nIHVzZWQuIFRoZSBwcm9ibGVtIG9jY3VycyB3aGVuIHRoZSBwcm94eSBjbGFzcyBpcyBubwogICAgICAgICAgICBsb25nZXIgc3Ryb25nbHkgcmVhY2hhYmxlIGFmdGVyIGEgbmF0aXZlIGNhbGwuICBUaGUgcHJvYmxlbSBzZWVtcyB0byBvY2N1ciBpbgogICAgICAgICAgICBtZW1vcnkgc3RyZXNzIHNpdHVhdGlvbnMgb24gc29tZSBKVk1zLiBJdCBkb2VzIG5vdCBzZWVtIHRvIG9jY3VyIG9uIHRoZQogICAgICAgICAgICBTdW4gY2xpZW50IEpWTSB1cCB0byBqZGsgMS41LiBIb3dldmVyIHRoZSAxLjYgY2xpZW50IGpkayBoYXMgYSBtb3JlIGFnZ3Jlc3NpdmUgZ2FyYmFnZQogICAgICAgICAgICBjb2xsZWN0b3IgYW5kIHNvIHRoZSBwcm9ibGVtIGRvZXMgb2NjdXIuIEl0IGRvZXMgb2NjdXIgb24gdGhlIFN1biBzZXJ2ZXIKICAgICAgICAgICAgSlZNcyAoY2VydGFpbmx5IDEuNCBvbndhcmRzKS4gVGhlIGZpeCBlbnRhaWxzIHBhc3NpbmcgdGhlIHByb3h5IGNsYXNzIGludG8gdGhlIG5hdGl2ZQogICAgICAgICAgICBtZXRob2QgaW4gYWRkaXRpb24gdG8gdGhlIEMrKyBwb2ludGVyIGluIHRoZSBsb25nIHBhcmFtZXRlciwgYXMgSmF2YSBjbGFzc2VzIGFyZSBub3QKICAgICAgICAgICAgY29sbGVjdGVkIHdoZW4gdGhleSBhcmUgcGFzc2VkIGludG8gSk5JIG1ldGhvZHMuIFRoZSBleHRyYSBwYXJhbWV0ZXIgY2FuIGJlIHN1cHByZXNzZWQKICAgICAgICAgICAgYnkgc2V0dGluZyB0aGUgbm9wZ2NwcCBhdHRyaWJ1dGUgaW4gdGhlIGp0eXBlIHR5cGVtYXAgdG8gIjEiIG9yIHVzaW5nIHRoZSBuZXcgLW5vcGdjcHAKICAgICAgICAgICAgY29tbWFuZGxpbmUgb3B0aW9uLgoKICAgICAgICAgICAgU2VlIEphdmEuaHRtbCNqYXZhX3BnY3BwIGZvciBmdXJ0aGVyIGRldGFpbHMgb24gdGhpcyB0b3BpYy4KCjEwLzI0LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IHNtYXJ0IHBvaW50ZXIgd3JhcHBlcnMuIFRoZSB2aXJ0dWFsL292ZXJyaWRlL25ldyBrZXl3b3JkIGlzIG5vdCBnZW5lcmF0ZWQKICAgICAgICAgICAgZm9yIGVhY2ggbWV0aG9kIGFzIHRoZSBzbWFydCBwb2ludGVyIGNsYXNzIGRvZXMgbm90IG1pcnJvciB0aGUgdW5kZXJseWluZyBwb2ludGVyCiAgICAgICAgICAgIGNsYXNzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4gU0YgIzE0OTY1MzUKCjEwLzI0LzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtsdWFdIGFkZGVkIHN1cHBvcnQgZm9yIG5hdGl2ZSBtZXRob2RzICYgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzLgogICAgICAgICAgICBmaXhlZCB0ZXN0IGNhc2VzIGFycmF5c19kaW1lbnNpb25sZXNzICYgY3BwX2Jhc2ljLiBBZGRlZCBuZXcgZXhhbXBsZSAoZnVuY3RvcikuCiAgICAgICAgICAgIHRpZGllZCB1cCBhIGxpdHRsZSBvZiB0aGUgY29kZSAoYXJvdW5kIGNsYXNzSGFuZGxlcikuCgoxMC8xNy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIGRpcmVjdG9yb3V0IHR5cGVtYXAgY2hhbmdlcyB0byBmYWxsIGluIGxpbmUgd2l0aCB0aGUgb3RoZXIgZGlyZWN0b3IKICAgICAgICAgICAgbGFuZ3VhZ2VzLiAkcmVzdWx0IGlzIG5vdyB1c2VkIHdoZXJlICQxIHVzZWQgdG8gYmUgdXNlZC4gUGxlYXNlIGNoYW5nZSB5b3VyIHR5cGVtYXBzCiAgICAgICAgICAgIGlmIHlvdSBoYXZlIGEgY3VzdG9tIGRpcmVjdG9yb3V0IHR5cGVtYXAuCgoxMC8xOC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBTb21lIGZpeGVzIGZvciBhcHBseWluZyB0aGUgY2hhciBhcnJheSB0eXBlbWFwcyB0byB1bnNpZ25lZCBjaGFyIGFycmF5cy4KCjEwLzE3LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gQWRkIGluIGNvbnN0IHNpemVfdCYgYW5kIGNvbnN0IHN0ZDo6c2l6ZV90JiB0eXBlbWFwcy4KCjEwLzE1LzIwMDY6IGVmdXp6eW9uZSAKICAgICAgICAgICAgW0NGRkldIFN1cHByZXNzIGdlbmVyYXRpbmcgZGVmY3R5cGUgZm9yIGVudW1zLCB0aGFua3MgdG8gQXJ0aHVyIFNteWxlcy4gUGF0Y2ggMTU2MDk4My4gCgoxMC8xNC8yMDA2OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW0NoaWNrZW5dIE1pbm9yIGZpeCB0byBtYWtlIFNXSUcgd29yayB3aXRoIHRoZSAoYXMgeWV0IHVucmVsZWFzZWQpIGNoaWNrZW4gMi41CgogICAgICAgICAgICBbR3VpbGUsQ2hpY2tlbl0gRml4IFNGIEJ1ZyAxNTczODkyLiAgQWRkZWQgYW4gZXh0X3Rlc3QgdG8gdGhlIHRlc3Qgc3VpdGUgdG8gdGVzdAogICAgICAgICAgICB0aGlzIGJ1ZywgYnV0IHRoaXMgdGVzdCBjYW4gbm90IHJlYWxseSBiZSBtYWRlIGdlbmVyaWMgYmVjYXVzZSB0aGUgZXh0ZXJuYWwgY29kZSBtdXN0CiAgICAgICAgICAgIHBsdWcgaW50byB0aGUgdGFyZ2V0IGxhbmd1YWdlIGludGVycHJldGVyIGRpcmVjdGx5LgogICAgICAgICAgICBTZWUgRXhhbXBsZXMvdGVzdC1zdWl0ZS9jaGlja2VuL2V4dF90ZXN0LmkgYW5kIGV4dF90ZXN0X2V4dGVybmFsLmN4eAoKICAgICAgICAgICAgQWRkZWQgYSAlLmV4dGVybmFsdGVzdCB0byBjb21tb24ubWssIGFuZCBhbnkgaW50ZXJlc3RlZCBsYW5ndWFnZSBtb2R1bGVzIGNhbgogICAgICAgICAgICBjb3B5IGFuZCBzbGlnaHRseSBtb2RpZnkgZWl0aGVyIHRoZSBjaGlja2VuIG9yIHRoZSBndWlsZSBleHRfdGVzdC5pCgoxMC8xNC8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBhZGRlZCBPVVRQVVQmIGZvciBhbGwgbnVtYmVyIHR5cGVzLCBhZGRlZCBhIGxvbmcgbG9uZyB0eXBlCiAgICAgICAgICAgIGZpeGVkIHNldmVyYWwgdGVzdCBjYXNlcy4KICAgICAgICAgICAgdXBkYXRlOiBjaGFuZ2VkIHR5cGVtYXBzIHRvIHVzZSBTV0lHX0NvbnZlcnRQdHIgcmF0aGVyIHRoYW4gU1dJR19NdXN0R2V0UG9pbnRlcgogICAgICAgICAgICBzdGFydGVkIHNwbGl0aW5nIGx1YS5zd2cgaW50byBzbWFsbGVyIHBhcnRzIHRvIG1ha2UgaXQgbmVhdGVyCgoxMC8xMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIE1hcmdpbmFsbHkgYmV0dGVyIHN1cHBvcnQgZm9yIG11bHRpcGxlIGluaGVyaXRhbmNlIG9ubHkgaW4gdGhhdCB5b3UgY2FuCiAgICAgICAgICAgIGNvbnRyb2wgd2hhdCB0aGUgYmFzZSBjbGFzcyBpcy4gVGhpcyBpcyBkb25lIHVzaW5nIHRoZSBuZXcgJ3JlcGxhY2UnIGF0dHJpYnV0ZSBpbiB0aGUgCiAgICAgICAgICAgIGphdmFiYXNlL2NzYmFzZSB0eXBlbWFwLCBlZyBpbiB0aGUgZm9sbG93aW5nLCAnTWUnIHdpbGwgYmUgdGhlIGJhc2UgY2xhc3MsCiAgICAgICAgICAgIG5vIG1hdHRlciB3aGF0IEZvbyBpcyByZWFsbHkgZGVyaXZlZCBmcm9tIGluIHRoZSBDKysgbGF5ZXIuCgogICAgICAgICAgICAgICV0eXBlbWFwKGphdmFiYXNlLCByZXBsYWNlPSIxIikgRm9vICJNZSI7CiAgICAgICAgICAgICAgJXR5cGVtYXAoY3NiYXNlLCByZXBsYWNlPSIxIikgRm9vICJNZSI7CgogICAgICAgICAgICBQcmV2aW91c2x5IGl0IHdhcyBub3QgcG9zc2libGUgZm9yIHRoZSBqYXZhYmFzZS9jc2Jhc2UgdHlwZW1hcHMgdG8gb3ZlcnJpZGUgdGhlIEMrKyBiYXNlLgoKMTAvMTIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFJlbW92ZSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb24gb24gdGhlIHByb3h5IGNsYXNzJyBkZWxldGUoKSBtZXRob2QgCiAgICAgICAgICAgIChpdCBpcyBub3cgYSBzeW5jaHJvbml6ZWQgbWV0aG9kLCBidXQgaXMgbm93IGN1c3RvbWlzYWJsZSBieSBjaGFuZ2luZyB0aGUgCiAgICAgICAgICAgIG1ldGhvZG1vZGlmaWVycyBhdHRyaWJ1dGUgaW4gdGhlIGphdmFkZXN0cnVjdCBvciBqYXZhZGVzdHJ1Y3RfZGVyaXZlZCB0eXBlbWFwKQoKICAgICAgICAgICAgW0MjXSBSZW1vdmUgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9uIG9uIHRoZSBwcm94eSBjbGFzcycgRGlzcG9zZSgpIG1ldGhvZCwgCiAgICAgICAgICAgIHNpbWlsYXIgdG8gSmF2YSdzIGRlbGV0ZSgpIGFib3ZlLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMC8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieSwgUHl0aG9uXSBSZW1vdmUgcmVkdW5kYW50IGRpcmVjdG9yIGNvZGUgaW4gJWV4dGVuZCBtZXRob2RzICglZXh0ZW5kCiAgICAgICAgICAgIG1ldGhvZHMgY2Fubm90IGJlIGRpcmVjdG9yIG1ldGhvZHMpCgoxMC8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieSwgUHl0aG9uXSBGaXggIzE1MDU1OTQgLSBkaXJlY3RvciBvYmplY3RzIG5vdCByZXR1cm5lZCBhcyBkaXJlY3RvciBvYmplY3RzCiAgICAgICAgICAgIGluICVleHRlbmQgbWV0aG9kcy4KCjEwLzExLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggIzEyMzg3OTggLSBEaXJlY3RvcnMgdXNpbmcgdW5zaWduZWQgbG9uZyBsb25nIG9yIGFueSBvdGhlciB0eXBlCiAgICAgICAgICAgIG1hcnNoYWxsZWQgYWNyb3NzIHRoZSBKTkkgYm91bmRhcnkgdXNpbmcgYSBKYXZhIGNsYXNzICh3aGVyZSB0aGUgam5pIHR5cGVtYXAgCiAgICAgICAgICAgIGNvbnRhaW5zIGpvYmplY3QpLgoKMTAvMDYvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxMTYyMTk0IC0gI2luY2x1ZGUvJWluY2x1ZGUgd2l0aGluIGEgc3RydWN0dXJlCgoxMC8wNi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzE0NTA2NjEsIHN0cmluZyB0cnVuY2F0aW9uIGluIFN0cmluZ19zZWVrIHRydW5jYXRpbmcgSmF2YS9DIyBlbnVtcy4KCjEwLzA2LzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEZpeCAjMTU2OTU4Ny4gVGhlIG5hbWUgaXMgbm93IGNvcnJlY3QuCgoxMC8wNC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBEaXJlY3RvciBmaXhlcyBmb3IgdmlydHVhbCBjb252ZXJzaW9uIG9wZXJhdG9ycwoKMTAvMDQvMjAwNjogb2xseQoJICAgIFtwaHBdIEZpeCAjMTU2OTU4NyBmb3IgUEhQLiAgRG9uJ3QgdXNlIHNpemVvZigpIGV4Y2VwdCB3aXRoIHN0cmluZwoJICAgIGxpdGVyYWxzLiAgQ2hhbmdlIHNvbWUgIi8vIiBjb21tZW50cyB0byAiLyogKi8iIGZvciBwb3J0YWJpbGl0eS4KCjEwLzA0LzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIFBhcnRpYWwgRml4ICMxNTY5NTg3LiBUaGUgdHlwZSBpcyBub3cgY29ycmVjdCwgYnV0IHRoZSBuYW1lIGlzIHN0aWxsIG5vdCBjb3JyZWN0LgoKMTAvMDMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEZpeCAjMTUyNzg4NSAtIE92ZXJsb2FkZWQgZGlyZWN0b3IgdmlydHVhbCBtZXRob2RzIHNvbWV0aW1lcyBwcm9kdWNlZAogICAgICAgICAgICB1bmNvbXBpbGFibGUgY29kZSB3aGVuIHVzZWQgd2l0aCB0aGUgZGlyZWN0b3I6ZXhjZXB0IGZlYXR1cmUuCgoxMC8wMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBEaXJlY3RvcnM6IERpcmVjdG9ycyBhcmUgb3V0cHV0IGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFyZSBkZWNsYXJlZCBpbiAKICAgICAgICAgICAgdGhlIEMrKyBjbGFzcyByYXRoZXIgdGhhbiBpbiBzb21lIHBzZXVkby1yYW5kb20gb3JkZXIuCgoxMC8wMy8yMDA2OiBtbWF0dXMKICAgICAgICAgICAgRml4ICMxNDg2MjgxIGFuZCAjMTQ3MTAzOS4KCjEwLzAzLzIwMDY6IG9sbHkKCSAgICBbUGVybF0gRml4IGZvciBoYW5kbGluZyBzdHJpbmdzIHdpdGggemVybyBieXRlcyBmcm9tIFN0ZXBoZW4gSHV0c2FsLgoKMDkvMzAvMjAwNjogZWZ1enp5b25lCiAgICAgICAgICAgIFtDRkZJXSBCaXRmaWVsZCBzdXBwb3J0IGFuZCB2YXJhcmcgc3VwcG9ydCBkdWUgdG8gQXJ0aHVyIFNteWxlcy4KICAgICAgICAgICAgQyBleHByZXNzaW9uIHRvIExpc3AgY29udmVyc2lvbiwgdGhhbmtzIHRvIEFydGh1ciBTbXlsZXMgZm9yIHRoZSBpbml0aWFsCiAgICAgICAgICAgIGlkZWEsIGl0IG5vdyBzdXBwb3J0cyBjb252ZXJzaW9uIGZvciBhIHdob2xlIHJhbmdlIG9mIEMgZXhwcmVzc2lvbnMuIAoKMDkvMjgvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxNTA4MzI3IC0gT3ZlcmxvYWRlZCBtZXRob2RzIGFyZSBoaWRkZW4gd2hlbiB1c2luZyAtZnZpcnR1YWwgb3B0aW1pc2F0aW9uLgogICAgICAgICAgICBPdmVybG9hZGVkIG1ldGhvZHMgYXJlIG5vIGxvbmdlciBjYW5kaWRhdGVzIGZvciBlbGltaW5hdGlvbiAtIHRoaXMgbWltaWNzCiAgICAgICAgICAgIEMrKyBiZWhhdmlvdXIgd2hlcmUgYWxsIG92ZXJsb2FkZWQgbWV0aG9kcyBtdXN0IGJlIGRlZmluZWQgYW5kIGltcGxlbWVudGVkCiAgICAgICAgICAgIGluIGEgZGVyaXZlZCBjbGFzcyBpbiBvcmRlciBmb3IgdGhlbSB0byBiZSBhdmFpbGFibGUuCgowOS8yNS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieSwgUHl0aG9uLCBPY2FtbF0gRml4ICMxNTA1NTkxIFRocm93aW5nIGV4Y2VwdGlvbnMgaW4gZXh0ZW5kZWQgZGlyZWN0b3JzCgowOS8yNS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzEwNTYxMDAgLSB2aXJ0dWFsIG9wZXJhdG9ycy4gCgowOS8yNC8yMDA2OiBvbGx5CgkgICAgRG9uJ3QgYWNjaWRlbnRhbGx5IGNyZWF0ZSBhICI8OiIgdG9rZW4gKHdoaWNoIGlzIHRoZSBzYW1lIGFzICJbIiBpbiBDKyspLgoJICAgIEZpeGVzIGJ1ZyAjIDE1MjE3ODguCgowOS8yMy8yMDA2OiBvbGx5CgkgICAgW1J1YnldIFN1cHBvcnQgYnVpbGRpbmcgd2l0aCByZWNlbnQgdmVyc2lvbnMgb2YgdGhlIFJ1YnkgMS45CgkgICAgZGV2ZWxvcG1lbnQgYnJhbmNoLiAgRml4ZXMgYnVnICMxNTYwMDkyLgoKMDkvMjMvMjAwNjogb2xseQoJICAgIFRlbXBsYXRlcyBjYW4gbm93IGJlIGluc3RhbnRpYXRlZCB1c2luZyBuZWdhdGl2ZSBudW1iZXJzIGFuZAoJICAgIGNvbnN0YW50IGV4cHJlc3Npb25zLCBlLmcuOgoKCSAgICB0ZW1wbGF0ZTxpbnQgcT4gY2xhc3MgeCB7fTsKCSAgICAldGVtcGxhdGUoeF9taW51czEpIHg8LTE+OwoJICAgICV0ZW1wbGF0ZSh4XzFwbHVzMikgeDwxKzI+OwoKCSAgICBBbHNvLCBjb25zdGFudCBleHByZXNzaW9ucyBjYW4gbm93IGluY2x1ZGUgY29tcGFyaXNvbnMgKD4sIDwsID49LAoJICAgIDw9LCAhPSwgPT0pLCBtb2R1bHVzICglKSwgYW5kIHRlcm5hcnkgY29uZGl0aW9uYWxzIChhID8gYiA6IGMpLgoKCSAgICBGaXhlcyBidWdzICM2NDYyNzUsICM5MjU1NTUsICM5NTYyODIsICM5OTQzMDEuCgowOS8yMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJWlnbm9yZSBvbiBkaXJlY3RvciBtZXRob2RzIC0gQnVncyAjMTU0NjI1NCwgIzE1NDM1MzMKCjA5LzIwLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAlaWdub3JlIG9uIGRpcmVjdG9yIGNvbnN0cnVjdG9ycwoKMDkvMjAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNlZyBmYXVsdHMgYW5kIGFzc2VydHMgd2hlbiBkaXJlY3RvciBtZXRob2RzIGFyZSBpZ25vcmVkICgjMTU0MzUzMykKCjA5LzIwLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBvdXQgb2Ygc291cmNlIGJ1aWxkcyAtIGJ1ZyAjMTU0NDcxOAoKMDkvMjAvMjAwNjogb2xseQoJICAgIFRyZWF0IGEgbmVzdGVkIGNsYXNzIGRlZmluaXRpb24gYXMgYSBmb3J3YXJkIGRlY2xhcmF0aW9uIHJhdGhlcgoJICAgIHRoYW4gaWdub3JpbmcgaXQgY29tcGxldGVseSwgc28gdGhhdCB3ZSBnZW5lcmF0ZSBjb3JyZWN0IGNvZGUgZm9yCgkgICAgcGFzc2luZyBvcGFxdWUgcG9pbnRlcnMgdG8gdGhlIG5lc3RlZCBjbGFzcyAoZml4ZXMgU0YgYnVnICM5MDkzODcpLgoKMDkvMjAvMjAwNjogb2xseQogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCSAgICBbcGhwXSBPdmVybG9hZCByZXNvbHV0aW9uIG5vdyB3b3Jrcy4gIEhvd2V2ZXIgdG8gYWxsb3cgdGhpcywgU1dJRwoJICAgIGdlbmVyYXRlZCB3cmFwcGVycyBubyBsb25nZXIgY29lcmNlIFBIUCB0eXBlcyAod2hpY2ggcmV2ZXJ0cyBhIGNoYW5nZQoJICAgIG1hZGUgaW4gMS4zLjI2KS4gIFNvIGZvciBleGFtcGxlLCBpZiBhIG1ldGhvZCB0YWtlcyBhIHN0cmluZywgeW91CgkgICAgY2FuIG5vIGxvbmdlciBwYXNzIGEgbnVtYmVyIHdpdGhvdXQgZXhwbGljaXRseSBjb252ZXJ0aW5nIGl0IHRvIGEKCSAgICBzdHJpbmcgaW4gUEhQIHVzaW5nOiAoc3RyaW5nKXgKCjA5LzE4LzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtBTExdIGZpeCBvbiBzd2lnaW5pdC5zd2csIGhhcyBiZWVuIHJlcG9ydGVkIHRvIGNyYXNoIG9uIHNldmVyYWwgdGVzdCBjYXNlcwoJICAgIGZvdW5kIGFuZCBmaXhlZCBwcm9ibGVtIGluIGltcG9ydHMgdW5kZXIgcHl0aG9uIChtaW5ndykKCjA5LzE2LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIFBhdGNoIGZyb20gTWljaGFsIE1hcmVrIGZvciBQeXRob24gMi41IHRvIGZpeCA2NCBiaXQgYXJyYXkgaW5kZXhlcyBvbgogICAgICAgICAgICA2NCBiaXQgbWFjaGluZXMuCgowOS8xMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBUaGUgZXhwbGljaXRjYWxsIGZlYXR1cmUgaGFzIGJlZW4gc2NyYXBwZWQuIFRoaXMgZmVhdHVyZSB3YXMgaW50cm9kdWNlZCBwcmltYXJpbHkKICAgICAgICAgICAgdG8gc29sdmUgcmVjdXJzaXZlIGRpcmVjdG9yIG1ldGhvZCBjYWxscy4gRGlyZWN0b3IgdXBjYWxsIGltcHJvdmVtZW50cyBtYWRlIGluc3RlYWQ6CgogICAgICAgICAgICBbUHl0aG9uLCBSdWJ5LCBPY2FtbF0gVGhlIHN3aWdfdXAgZmxhZyBpcyBubyBsb25nZXIgdXNlZC4gVGhlIHJlcXVpcmVkIG11dGV4ZXMKICAgICAgICAgICAgd3JhcHBpbmcgdGhpcyBmbGFnIGFyZSBhbHNvIG5vIGxvbmdlciBuZWVkZWQuIFRoZSByZWN1cnNpdmUgY2FsbHMgZ29pbmcgZnJvbSBDKysKICAgICAgICAgICAgdG8gdGhlIHRhcmdldCBsYW5ndWFnZSBhbmQgYmFjayBhZ2FpbiBldGMgYXJlIG5vdyBhdm9pZGVkIGJ5IGEgc3VidGxlbHkgZGlmZmVyZW50CiAgICAgICAgICAgIGFwcHJvYWNoLiBJbnN0ZWFkIG9mIHVzaW5nIHRoZSBzd2lnX3VwIGZsYWcgaW4gZWFjaCBkaXJlY3RvciBtZXRob2QgdG8gaW5kaWNhdGUKICAgICAgICAgICAgd2hldGhlciB0aGUgZXhwbGljaXQgQysrIGNhbGwgdG8gdGhlIGFwcHJvcHJpYXRlIGJhc2UgY2xhc3MgbWV0aG9kIG9yIGEgbm9ybWFsCiAgICAgICAgICAgIHBvbHltb3JwaGljIEMrKyBjYWxsIHNob3VsZCBiZSBtYWRlLCB0aGUgbmV3IGFwcHJvYWNoIG1ha2VzIG9uZSBvZiB0aGVzZSBjYWxscwogICAgICAgICAgICBkaXJlY3RseSBmcm9tIHRoZSB3cmFwcGVyIG1ldGhvZC4KCiAgICAgICAgICAgIFtKYXZhLCBDI10gVGhlIHJlY3Vyc2l2ZSBjYWxsIHByb2JsZW0gd2hlbiBjYWxsaW5nIGEgQysrIGJhc2UgY2xhc3MgbWV0aG9kIGZyb20KICAgICAgICAgICAgSmF2YS9DIyBpcyBub3cgZml4ZWQuIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBzbGlnaHRseSBkaWZmZXJlbnQgdG8gdGhlIG90aGVyIGxhbmd1YWdlcwogICAgICAgICAgICBhcyB0aGUgZGV0ZWN0aW9uIGFzIHRvIHdoZXRoZXIgdGhlIGV4cGxpY2l0IGNhbGwgb3IgYSBub3JtYWwgcG9seW1vcnBoaWMgY2FsbCBpcyBtYWRlCiAgICAgICAgICAgIGluIHRoZSBKYXZhL0MjIGxheWVyIHJhdGhlciB0aGFuIGluIHRoZSBDKysgbGF5ZXIuCgowOS8xMS8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbQUxMXSB1cGRhdGVkIHN3aWdpbml0LnN3ZyB0byBhbGxvdyBtdWx0aXBsZSBpbnRlcnByZXRlcnMgdG8gdXNlIG11bHRpcGxlCgkgICAgc3dpZyBtb2R1bGVzIGF0IG9uY2UuIFRoaXMgaGFzIGJlZW4gdGVzdGVkIGluIEx1YSAobWluZ3cgJiBsaW51eCksCgkgICAgcGVybDUgJiBweXRob24gKGxpbnV4KSBvbmx5LgoKMDkvMTEvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW2x1YV0gYWRkZWQgc3VwcG9ydCBmb3IgcGFzc2luZyBmdW5jdGlvbiBwb2ludGVycyBhcyB3ZWxsIGFzIG5hdGl2ZSBsdWEgb2JqZWN0CiAgICAgICAgICAgIGludG8gd3JhcHBlcmVkIGZ1bmN0aW9uLgogICAgICAgICAgICBBZGRlZCBleGFtcGxlIGZ1bmNwdHIzIHRvIGRlbW9uc3RyYXRlIHRoaXMgZmVhdHVyZQoKMDkvMDUvMjAwNjogb2xseQoJICAgIFtwaHBdIFJlbmFtZSBFcnJvckNvZGUgYW5kIEVycm9yTXNnICNkZWZpbmUtcyB0byBTV0lHX0Vycm9yQ29kZQoJICAgIGFuZCBTV0lHX0Vycm9yTXNnIHRvIGF2b2lkIGNsYXNoZXMgd2l0aCBjb2RlIHRoZSB1c2VyIG1pZ2h0IGJlCgkgICAgd3JhcHBpbmcgKHBhdGNoIGZyb20gRGFycmVuIFdhcm5lciBpbiBTRiBidWcgIzE0NjYwODYpLiAgQW55CgkgICAgdXNlciB0eXBlbWFwcyB3aGljaCB1c2UgRXJyb3JDb2RlIGFuZC9vciBFcnJvck1zZyBkaXJlY3RseSB3aWxsCgkgICAgbmVlZCBhZGp1c3RpbmcgLSB5b3UgY2FuIGVhc2lseSBmaXggdGhlbSB0byB3b3JrIHdpdGggYm90aCBvbGQKCSAgICBhbmQgbmV3IFNXSUcgYnkgY2hhbmdpbmcgdG8gdXNlIFNXSUdfRXJyb3JNc2cgYW5kIGFkZGluZzoKCgkJI2lmbmRlZiBTV0lHX0Vycm9yTXNnCgkJI2RlZmluZSBTV0lHX0Vycm9yTXNnKCkgRXJyb3JNc2coKQoJCSNlbmRpZgoKMDgvMjkvMjAwNjogb2xseQoJICAgIFtwaHBdIE1vdmUgY29uc3RhbnQgaW5pdGlhbGlzYXRpb24gZnJvbSBSSU5JVCB0byBNSU5JVCB0byBmaXggYQoJICAgIHdhcm5pbmcgd2hlbiB1c2luZyBBcGFjaGUgYW5kIG1vZF9waHAuICBXZSBvbmx5IG5lZWQgdG8gY3JlYXRlCgkgICAgUEhQIGNvbnN0YW50cyBvbmNlIHdoZW4gd2UncmUgZmlyc3QgaW5pdGlhbGlzZWQsIG5vdCBmb3IgZXZlcnkgSFRUUAoJICAgIHJlcXVlc3QuCgowOC8yMS8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXQoJICAgIEJ1Z2ZpeCAjMTU0MjQ2NiBhZGRlZCBjb2RlIHRvIGFsbG93IG1hcHBpbmcgTHVhIG5pbCdzIDwtPiBDL0MrKyBOVUxMJ3MKCSAgICB1cGRhdGVkIHZhcmlvdXMgdHlwZW1hcHMgdG8gd29yayBjb3JyZWN0bHkgd2l0aCB0aGUgY2hhbmdlcwoJICAgIGFkZGVkIHZvaWR0ZXN0X3J1bm1lLmx1YSB0byBzaG93IHRoZSBmZWF0dXJlcyB3b3JraW5nCgowOC8xOS8yMDA2OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbR3VpbGVdIEFkZCBmZWF0dXJlOmNvbnN0YXN2YXIgdG8gZXhwb3J0IGNvbnN0YW50cyBhcyB2YXJpYWJsZXMgaW5zdGVhZCBvZiBmdW5jdGlvbnMKICAgICAgICAgICAgdGhhdCByZXR1cm4gdGhlIGNvbnN0YW50IHZhbHVlLgoKMDgvMTEvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIERldGFjaEN1cnJlbnRUaHJlYWQgY2FsbHMgaGF2ZSBiZWVuIGFkZGVkIHNvIHRoYXQgbmF0aXZlbHkgY3JlYXRlZCB0aHJlYWRzCiAgICAgICAgICAgIG5vIGxvbmdlciBwcmV2ZW50IHRoZSBKVk0gZnJvbSBleGl0aW5nLiBCdWcgcmVwb3J0ZWQgYnkgVGhvbWFzIER1ZHppYWsgYW5kCiAgICAgICAgICAgIFBhdWwgTm9sbC4KCjA4LzEwLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IGRpcmVjdG9yIHByb3RlY3RlZCBtZXRob2RzIHNvIHRoZXkgd29yawoKMDcvMjUvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIG1vcmUgYWRkaXRpb25zIHRvIHN0ZDo6c3RyaW5nLCBzb21lIHR3ZWFrcyBhbmQgc21hbGwgYnVnIGZpeGVzCgkgICAgLW5vY3dyYXAgbW9kZS4KCjA3LzIxLzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdCgkgICAgQnVnZml4ICMxNTI2MDIyIHBkYXRlZCBzdGQ6OnN0cmluZyB0byBzdXBwb3J0IHN0cmluZ3Mgd2l0aCAnXDAnIGluc2lkZSB0aGVtCgkgICAgdXBkYXRlZCB0eXBlbWFwcy5pIHRvIGFkZCBzdXBwb3J0IGZvciBwb2ludGVyIHRvIHBvaW50ZXJzCgowNy8xOS8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgLSBBZGQgc3RkX3N0cmluZy5pIHN1cHBvcnQuCgkgICAgLSBBZGQgbmV3b2JqZWN0IHBhdGNoIHN1Ym1pdHRlZCBieSBta29lcHBlICh0aGFua3MhKQoJICAgIC0gRml4IHR5cGUgbmFtZSBtaXNtYXRjaCBpc3N1ZSBmb3IgbmVzdGVkIHR5cGUgZGVmaW5pdGlvbnMuCgkgICAgICBzcGVjaWZpY2FsbHkgdHlwZWRlZnMgaW4gdGVtcGxhdGVkIGNsYXNzIGRlZm5zLgoKMDcvMTgvMjAwNjogbWdvc3NhZ2UKCSAgICBCdWdmaXggIzE1MjI4NTgKCSAgICB1cGRhdGVkIGx1YS5jeHggdG8gc3VwcG9ydCAtZXh0ZXJuYWwtcnVudGltZSBjb21tYW5kCgowNy8xNC8yMDA2OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBJbmNyZW1lbnQgdGhlIFNXSUdfUlVOVElNRV9WRVJTSU9OIHRvIDMsIGJlY2F1c2Ugb2YgdGhlCgkgICAgYWRkaXRpb24gb2YgdGhlIG93bmRhdGEgbWVtYmVyIGluIHN3aWdfdHlwZV9pbmZvLgoJICAgIFJlcG9ydGVkIGJ5OiBQcmFiaHUgUmFtYWNoYW5kcmFuCgowNy8wNS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBTZWFyY2ggcGF0aCBmaXhlczoKICAgICAgICAgICAgLSBGaXggc2VhcmNoIHBhdGggZm9yIGxpYnJhcnkgZmlsZXMgdG8gYmVoYXZlIGFzIGRvY3VtZW50ZWQgaW4gTGlicmFyeS5odG1sLgogICAgICAgICAgICAtIEZpeCBtaW5ndy9tc3lzIGJ1aWxkcyB3aGljaCBkaWQgbm90IGZpbmQgdGhlIFNXSUcgbGlicmFyeSB3aGVuIGluc3RhbGxlZC4KICAgICAgICAgICAgLSBXaW5kb3dzIGJ1aWxkcyBhbHNvIG91dHB1dCB0aGUgbWluZ3cvbXN5cyBpbnN0YWxsIGxvY2F0aW9uIHdoZW4gcnVubmluZwogICAgICAgICAgICAgIHN3aWcgLXN3aWdsaWIuCiAgICAgICAgICAgIC0gVGhlIG5vbi1leGlzdGVudCBhbmQgdW5kb2N1bWVudGVkIGNvbmZpZyBkaXJlY3RvcnkgaW4gdGhlIHNlYXJjaCBwYXRoIGhhcwogICAgICAgICAgICAgIGJlZW4gcmVtb3ZlZC4KCjA3LzA1LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAkc3ltbmFtZSBzcGVjaWFsIHZhcmlhYmxlIGV4cGFuc2lvbi4KCjA3LzA0LzIwMDY6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtDaGlja2VuXQoJICAgIEFkZCAlZmVhdHVyZSgiY29uc3Rhc3ZhciIpLCB3aGljaCBpbnN0ZWFkIG9mIGV4cG9ydGluZyBhIGNvbnN0YW50IGFzIGEKCSAgICBzY2hlbWUgZnVuY3Rpb24sIGV4cG9ydHMgdGhlIGNvbnN0YW50IGFzIGEgc2NoZW1lIHZhcmlhYmxlLiAgVXBkYXRlIHRoZQoJICAgIGRvY3VtZW50YXRpb24gYXMgd2VsbC4KCjA3LzA0LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtTZWUgZW50cnkgb2YgMDkvMTMvMjAwNiAtIGV4cGxpY2l0Y2FsbCBmZWF0dXJlIGFuZCBkb2N1bWVudGF0aW9uIHRvIGl0IHJlbW92ZWRdCiAgICAgICAgICAgIE5ldyBleHBsaWNpdGNhbGwgZmVhdHVyZSB3aGljaCBnZW5lcmF0ZXMgYWRkaXRpb25hbCB3cmFwcGVycyBmb3IgdmlydHVhbCBtZXRob2RzCiAgICAgICAgICAgIHRoYXQgY2FsbCB0aGUgbWV0aG9kIGV4cGxpY2l0bHksIG5vdCByZWx5aW5nIG9uIHBvbHltb3JwaGlzbSB0byBtYWtlIHRoZSBtZXRob2QKICAgICAgICAgICAgY2FsbC4gVGhlIGZlYXR1cmUgaXMgYSBmZWF0dXJlIGZsYWcgYW5kIGlzIGVuYWJsZWQgbGlrZSBhbnkgb3RoZXIgZmVhdHVyZSBmbGFnLgogICAgICAgICAgICBJdCBhbHNvIHJlY29nbmlzZXMgYW4gYXR0cmlidXRlLCAic3VmZml4IiBmb3IgbWFuZ2xpbmcgdGhlIGZlYXR1cmUgbmFtZSwgc2VlCiAgICAgICAgICAgIFNXSUdQbHVzLmh0bWwjU1dJR1BsdXNfZXhwbGljaXRjYWxsIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgZGV0YWlscy4KCiAgICAgICAgICAgIFtKYXZhLCBDI10KICAgICAgICAgICAgVGhlIGV4cGxpY2l0Y2FsbCBmZWF0dXJlIGlzIGFsc28gYSB3b3JrYXJvdW5kIGZvciBzb2x2aW5nIHRoZSByZWN1cnNpdmUgY2FsbHMKICAgICAgICAgICAgcHJvYmxlbSB3aGVuIGEgZGlyZWN0b3IgbWV0aG9kIG1ha2VzIGEgY2FsbCB0byBhIGJhc2UgY2xhc3MgbWV0aG9kLiBTZWUKICAgICAgICAgICAgSmF2YS5odG1sI2phdmFfZGlyZWN0b3JzX2V4cGxpY2l0Y2FsbCBmb3IgdXBkYXRlZCBkb2N1bWVudGF0aW9uLgoKMDYvMjgvMjAwNjogam9lIChKb3NlcGggV2FuZykKCSAgICBbcl0gSW5pdGlhbCBzdXBwb3J0IGZvciBSCgowNi8yMC8yMDA2OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbQ2hpY2tlbl0KICAgICAgICAgICAgTWlub3IgZml4ZXMgdG8gZ2V0IGFwcGx5X3N0cmluZ3MuaSB0ZXN0c3VpdGUgdG8gcGFzcwoJICAgIFJlbW92ZSBpbnRlZ2Vyc19ydW5tZS5zY20gZnJvbSB0aGUgdGVzdHN1aXRlLCBiZWNhdXNlIFNXSUcgYW5kIENoaWNrZW4gZG9lcwogICAgICAgICAgICBoYW5kbGUgb3ZlcmZsb3dzLgoKMDYvMTkvMjAwNTogb2xseQoJICAgIFtwaHBdIEFkZCBzdXBwb3J0IGZvciBnZW5lcmF0aW5nIFBIUDUgY2xhc3Mgd3JhcHBlcnMgZm9yIEMrKwoJICAgIGNsYXNzZXMgKHVzZSAic3dpZyAtcGhwNSIpLgoKMDYvMTcvMjAwNjogb2xseQoJICAgIFtwaHBdIEFkZGVkIHNvbWUgbWlzc2luZyBrZXl3b3JkcyB0byB0aGUgUEhQNCBrZXl3b3JkIGxpc3QsIGFuZAoJICAgIGZpeGVkIF9fTElORV9fIGFuZCBfX0ZJTEVfXyB3aGljaCB3ZXJlIGluIHRoZSB3cm9uZyBjYXRlZ29yeS4KCSAgICBBbHNvIGFkZGVkIGFsbCB0aGUga2V5d29yZHMgbmV3IGluIFBIUDUsIGFuZCBhZGRlZCBjb21tZW50cwoJICAgIG5vdGluZyB0aGUgUEhQNCBrZXl3b3JkcyB3aGljaCBhcmVuJ3Qga2V5d29yZHMgaW4gUEhQNS4KCjA2LzE3LzIwMDY6IG9sbHkKCSAgICBbcGhwXSBEb24ndCBzZWdmYXVsdCBpZiBQSFAgTnVsbCBpcyBwYXNzZWQgYXMgdGhpcyBwb2ludGVyIChlLmcuCgkgICAgQ2xhc3NfbWV0aG9kKE51bGwpKSAtIGdpdmUgYSBQSFAgRXJyb3IgaW5zdGVhZC4KCjA2LzE1LzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBBZGQgaW5pdGlhbCBzdXBwb3J0IGZvciBzdGQ6Omxpc3QgY29udGFpbmVyIGNsYXNzLgoJICAgIEZpeCBhIGZldyBidWdzIGluIGhlbHBlciBmdW5jdGlvbnMuCgowNS8xMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUmVwbGFjZSBKTklFWFBPUlQgd2l0aCBTV0lHRVhQT1JULCB0aGVyZWJ5IGVuYWJsaW5nIHRoZSBwb3NzaWJpbGl0eQogICAgICAgICAgICBvZiB1c2luZyBnY2MgLWZ2aXNpYmlsaXR5PWhpZGRlbiBmb3IgcG90ZW50aWFsbHkgc21hbGxlciBmYXN0ZXIgbG9hZGluZyB3cmFwcGVycy4KCjA1LzEzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBmb3IgTWFrZWZpbGVzIGZvciBhdXRvY29uZi0yLjYwIGJldGEKCjA1LzEzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFZsYWRpbWlyIE1lbnNoYWtvdiBwYXRjaCBmb3IgY29tcGlsaW5nIHdyYXBwZXJzIHdpdGggcHl0aG9uLTIuNSBhbHBoYS4KCjA1LzEyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBidWZmZXIgb3ZlcmZsb3cgZXJyb3Igd2hlbiB1c2luZyBsYXJnZSAlZmVhdHVyZShkb2NzdHJpbmcpIHJlcG9ydGVkCiAgICAgICAgICAgIGJ5IEpvc2VwaCBXaW5zdG9uLgoKMDUvMTIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIE9wZXJhdG9yIG92ZXJsb2FkIGZpeCBmcm9tIERhbmllbCBNb29yZS4KCjA1LzI1LzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBGaXggYnVnIGluIGdlbmVyYXRpb24gb2YgQ0xPUyB0eXBlIGRlY2xhcmF0aW9ucyBmb3IgdW5pb25zCgkgICAgYW5kIGVxdWl2YWxlbnQgdHlwZXMuCgowNS8yNC8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgRG9uJ3QgcmVxdWlyZSBhIGZ1bGwgY2xhc3MgZGVmaW5pdGlvbiB0byBnZW5lcmF0ZSBhIENMT1Mgd3JhcHBlci4KCjA1LzIwLzIwMDY6IG9sbHkKCSAgICBbcGhwXSBHQ0MgVmlzaWJpbGl0eSBzdXBwb3J0IG5vdyB3b3JrcyB3aXRoIFBIUC4KCjA1LzE5LzIwMDY6IG9sbHkKCSAgICBbcGhwXSBSZW1vdmVkIHN1cHBvcnQgZm9yIC1kbG5hbWUgKHVzZSAtbW9kdWxlIGluc3RlYWQpLiAgRml4ZWQKCSAgICBuYW1pbmcgb2YgUEhQIGV4dGVuc2lvbiBtb2R1bGUgdG8gYmUgY29uc2lzdGVudCB3aXRoIFBIUAoJICAgIGNvbnZlbnRpb25zIChubyAicGhwXyIgcHJlZml4IG9uIFVuaXg7IG9uIFBIUCA+PSA0LjMuMCwgaGFuZGxlIFVuaXgKCSAgICBwbGF0Zm9ybXMgd2hpY2ggdXNlIHNvbWV0aGluZyBvdGhlciB0aGFuICIuc28iIGFzIHRoZSBleHRlbnNpb24uKQoKMDUvMTMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBEaXJlY3RvciBzdXBwb3J0IGFkZGVkCgowNS8wNy8yMDA2OiBvbGx5CgkgICAgW3BocF0gRG9uJ3Qgc2VnZmF1bHQgaWYgUEhQIE51bGwgaXMgcGFzc2VkIHdoZXJlIGEgQysrIHJlZmVyZW5jZQoJICAgIGlzIHdhbnRlZC4KCjA1LzA1LzIwMDY6IG9sbHkKCSAgICBbcGhwXSBGaXggd3JhcHBlcnMgZ2VuZXJhdGVkIGZvciBnbG9iYWwgJ2NoYXInIHZhcmlhYmxlcyB0byBub3QKCSAgICBpbmNsdWRlIGEgdGVybWluYXRpbmcgemVybyBieXRlIGluIHRoZSBQSFAgc3RyaW5nLgoKMDUvMDMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgTW9kaWZ5IHR5cGVtYXBzIHNvIHRoYXQgY2hhciAqIGNhbiBiZSBhcHBsaWVkIHRvIHVuc2lnbmVkIGNoYXIgKiBvciBzaWduZWQgY2hhciAqCiAgICAgICAgICAgIHR5cGVzIGFuZCB2aXNhIHZlcnNhLgoKMDUvMDMvMjAwNjogZWZ1enp5b25lCgkgICAgW2NmZmldVGhhbmtzIHRvIEx1a2UgSiBDcm9vayBmb3IgdGhpcyBpZGVhLgogICAgICAgICAgICAgLSBhIHN0cnVjdC9lbnVtL3VuaW9uIGlzIHJlcGxhY2VkIHdpdGggOnBvaW50ZXIgb25seSBpZgogICAgICAgICAgICAgICB0aGF0IHNsb3QgaXMgYWN0dWFsbHkgYSBwb2ludGVyIHRvIHRoYXQgdHlwZS4gU28sOiAKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYV9zdHJ1Y3QgeyBpbnQgeDsgfSBhbmQKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYl9zdHJ1Y3QgeyBhX3N0cnVjdCBzdHJ1Y3RfMTsgfTsgCiAgICAgICAgICAgICAgIHdpbGwgYmUgY29udmVydGVkIGFzOgogICAgICAgICAgICAgICAgICAgKGNmZmk6ZGVmY3N0cnVjdCBiX3N0cnVjdAogICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0XzEgYV9zdHJ1Y3QpKQogICAgICAgICAgICAgLSBPdGhlciBtaW5vciBmaXhlcyBpbiBsaXNwaWZ5aW5nIG5hbWVzLgoKMDUvMDIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IHBvc3NpYmxlIHJlZGVmaW5pdGlvbiBvZiBfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUgZm9yIFZDKysuCgowNC8xNC8yMDA2OiBlZnV6enlvbmUKCSAgICBbY2ZmaV0KICAgICAgICAgICAgVGhhbmtzIHRvIFRob21hcyBXZWlkbmVyIGZvciB0aGUgcGF0Y2guCiAgICAgICAgICAgIC0gd2hlbiBmZWF0dXJlIGV4cG9ydCBpcyBzZXQgKGV4cG9ydCAnZm9vKSBpcyAKICAgICAgICAgICAgICBnZW5lcmF0ZWQgZm9yIGV2ZXJ5IHN5bWJvbAogICAgICAgICAgICAtIHdoZW4gZmVhdHVyZSBpbmxpbmUgaXMgc2V0IChkZWNsYWltIChpbmxpbmUgZm9vKSkgaXMgCiAgICAgICAgICAgICAgZ2VuZXJhdGVkIGJlZm9yZSBldmVyeSBmdW5jdGlvbiBkZWZpbml0aW9uCiAgICAgICAgICAgIC0gd2hlbiBmZWF0dXJlIGludGVybl9mdW5jdGlvbiBpcyBzZXQgCiAgICAgICAgICAgICAgIy4odmFsdWUtb2YtaW50ZXJuLWZ1bmN0aW9uICJuYW1lIiAibm9kZVR5cGUiIHBhY2thZ2UpCiAgICAgICAgICAgICAgaXMgZW1pdHRlZCBpbnN0ZWFkIG9mIHRoZSBwbGFpbiBzeW1ib2wuIEEgc2FtcGxlIHN3aWctbGlzcGlmeSAKICAgICAgICAgICAgICBpcyBwcm92aWRlZC4KICAgICAgICAgICAgLSBldmVyeSBzeW1ib2wgaXMgcHJlZml4ZWQgYnkgaXQncyBwYWNrYWdlLgoKMDQvMTMvMjAwNjogZWZ1enp5b25lCgkgICAgW2NmZmldCgkgICAgRml4ZWQgdGhlIGdlbmVyYXRpb24gb2Ygd3JhcHBlcnMgZm9yIGdsb2JhbCB2YXJpYWJsZXMuIAogICAgICAgICAgICBBZGRlZCB0aGUgb3B0aW9uIFtub11zd2lnLWxpc3Agd2hpY2ggdHVybnMgb24vb2ZmIGdlbmVyYXRpb24gCiAgICAgICAgICAgIG9mIGNvZGUgZm9yIHN3aWcgaGVscGVyIGxpc3AgbWFjcm8sIGZ1bmN0aW9ucywgZXRjLgoKVmVyc2lvbiAxLjMuMjkgKE1hcmNoIDIxLCAyMDA2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowNC8wNS8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgRml4IG91dHB1dCB0eXBlbWFwIG9mIGNoYXIgc28gaXQgcHJvZHVjZXMgYSBjaGFyYWN0ZXIgaW5zdGVhZAoJICAgIG9mIGFuIGludGVnZXIuIEFsc28gYWRkcyBpbnB1dC9vdXRwdXQgdHlwZW1hcHMgZm9yICdjaGFyIConLgoKCSAgICBhZGQgY29tbWFuZC1saW5lIGFyZ3VtZW50IC1pc29sYXRlIHRvIGdlbmVyYXRlIGFuIGludGVyZmFjZQoJICAgIGZpbGUgdGhhdCB3b24ndCBpbnRlcmZlcmUgd2l0aCBvdGhlciBTV0lHIGdlbmVyYXRlZCBmaWxlcyB0aGF0CgkgICAgbWF5IGJlIHVzZWQgaW4gdGhlIHNhbWUgYXBwbGljYXRpb24uCgowMy8yMC8yMDA1OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgTW9yZSB0d2Vha3MgdG8gSU5QVVQvT1VUUFVUIHR5cGVtYXBzIGZvciBib29sLgoKCSAgICBGaXggY29uc3RhbnRXcmFwcGVyIGZvciBjaGFyIGFuZCBzdHJpbmcgbGl0ZXJhbHMuCgoJICAgIGZpbmQtZGVmaW5pdGlvbiBrZXliaW5kaW5ncyBzaG91bGQgd29yayBpbiBFTEkvU0xJTUUuCgkgICAgT3V0cHV0IChpbi1wYWNrYWdlIDxtb2R1bGUtbmFtZT4pIHRvIGxpc3Agd3JhcHBlcgoJICAgIGluc3RlYWQgb2YgKGluLXBhY2thZ2UgIy4qc3dpZy1tb2R1bGUtbmFtZSopLgoKCSAgICBzbGlnaHQgcmV3b3JrIG9mIG11bHRpcGxlIHJldHVybiB2YWx1ZXMuCgoJICAgIGRvYyB1cGRhdGVzLgoKMDMvMTcvMjAwNTogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIG1hbmdsZSBuYW1lcyBvZiBjb25zdGFudHMgZ2VuZXJhdGVkIHZpYSBjb25zdGFudFdyYXBwZXIuCgkgICAgCgkgICAgV2hlbiB1c2luZyBPVVRQVVQgdHlwZW1hcHMgYW5kIHRoZSBmdW5jdGlvbiBoYXMgYSBub24tdm9pZAoJICAgIHJldHVybiB2YWx1ZSwgaXQgc2hvdWxkIGJlIGZpcnN0IGluIHRoZSB2YWx1ZXMtbGlzdCwgZm9sbG93ZWQKCSAgICBieSB0aGUgT1VUUFVUIG1hcHBlZCB2YWx1ZXMuCgoJICAgIEZpeCBidWcgd2l0aCBib29sZWFuIHBhcmFtZXRlcnMsIHdoaWNoIG5lZWRlZCB0byBiZQoJICAgIHBhc3NlZCBpbiBhcyBpbnQgdmFsdWVzLCByYXRoZXIgdGhhbiBUIG9yIE5JTC4KCjAzLzE1LzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBHZW5lcmF0ZSB3cmFwcGVycyBmb3IgY29uc3RhbnRzIHdoZW4gaW4gQysrIG9yIC1jd3JhcCBtb2RlLgoJICAgIE1ha2UgLWN3cmFwIHRoZSBkZWZhdWx0LCBzaW5jZSBpdCBpcyBtb3N0IGNvcnJlY3QuIFVzZXJzCgkgICAgY2FuIHVzZSB0aGUgLW5vY3dyYXAgb3B0aW9uIHRvIGF2b2lkIHRoZSBjcmVhdGlvbiBvZiBhIC5jeHgKCSAgICBmaWxlIHdoZW4gaW50ZXJmYWNpbmcgdG8gQyBjb2RlLgoKCSAgICBXaGVuIGluIC1ub2N3cmFwIG1vZGUsIGltcHJvdmUgdGhlIGhhbmRsaW5nIG9mIGNvbnZlcnRpbmcKIAkgICAgaW5maXggbGl0ZXJhbHMgdG8gcHJlZml4IG5vdGF0aW9uIGZvciBsaXNwLiBUaGlzIGlzIHZlcnkKCSAgICBiYXNpYyBhbmQgbm90IGxpa2VseSB0byBiZSBpbXByb3ZlZCB1cG9uIHNpbmNlIHRoaXMgb25seQoJICAgIGFwcGxpZXMgdG8gdGhlIC1ub2N3cmFwIGNhc2UuIExpdGVyYWxzIHdlIGNhbid0IGZpZ3VyZSBvdXQKCSAgICB3aWxsIHJlc3VsdCBpbiBhIHdhcm5pbmcgYW5kIGJlIGluY2x1ZGVkIGluIHRoZSBnZW5lcmF0ZWQKCSAgICBjb2RlLgoKCSAgICB2YWxpZElkZW50aWZpZXIgbm93IG1vcmUgY2xvc2VseSBhcHByb3hpbWF0ZXMgd2hhdCBtYXkgYmUKCSAgICBhIGxlZ2FsIGNvbW1vbiBsaXNwIHN5bWJvbC4KCgkgICAgRml4IHR5cGVtYXAgZXJyb3IgaW4gYWxsZWdyb2NsLnN3ZwoJICAgIAowMy8xMi8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgZml4IHVwIElOUFVUL09VVFBVVCB0eXBlbWFwcyBmb3IgYm9vbC4KCSAgICBHZW5lcmF0ZSBjKysgc3R5bGUgd3JhcHBlciBmdW5jdGlvbnMgZm9yIHN0cnVjdC91bmlvbiBtZW1iZXJzCgkgICAgd2hlbiAtY3dyYXAgb3B0aW9uIHNwZWNpZmllZC4KCjAzLzEwLzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBGaXggYnVnIGluIEMgd3JhcHBlciBnZW5lcmF0aW9uIGludHJvZHVjZWQgYnkgbGFzdCBhbGxlZ3JvY2wKCSAgICBjb21taXQuCgowMy8xMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0KICAgICAgICAgICAgQ29tbWl0ICMxNDQ3MzM3IC0gRGVsZXRlIExvY2FsUmVmcyBhdCB0aGUgZW5kIG9mIGRpcmVjdG9yIG1ldGhvZHMgdG8gZml4IHBvdGVudGlhbCBsZWFrCgowMy8xMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzE0NDQ5NDkgLSBjb25maWd1cmUgZG9lcyBub3QgaG9ub3IgLS1wcm9ncmFtLXByZWZpeC4KICAgICAgICAgICAgUmVtb3ZlZCBub24tc3RhbmRhcmQgY29uZmlndXJlIG9wdGlvbiAtLXdpdGgtcmVsZWFzZS1zdWZmaXguIEZpeCB0aGUgYXV0b2NvbmYgc3RhbmRhcmQKICAgICAgICAgICAgb3B0aW9ucyAtLXByb2dyYW0tcHJlZml4IGFuZCAtLXByb2dyYW0tc3VmZml4IHdoaWNoIHdlcmUgYmVpbmcgc2hvd24gaW4gdGhlIGhlbHAsCiAgICAgICAgICAgIGJ1dCB3ZXJlIGJlaW5nIGlnbm9yZWQuIFVzZSAtLXByb2dyYW0tc3VmZml4IGluc3RlYWQgb2YgLS13aXRoLXJlbGVhc2Utc3VmZml4IG5vdy4KCjAzLzEwLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXQogICAgICAgICAgICBGaXggIzE0NDYzMTkgd2l0aCBwYXRjaCBmcm9tIGFuZHJlYXN0aCAtIG1vcmUgdGhhbiBvbmUgd3N0cmluZyBwYXJhbWV0ZXIgaW4gZGlyZWN0b3IgbWV0aG9kcwoKMDMvMDcvMjAwNjogbWtvZXBwZQoJICAgIFtHdWlsZV0gCgkgICAgRml4IGZvciBtb2R1bGUgbmFtZXMgY29udGFpbmluZyBhICItIiBpbiBub24tInNoYWRvdyIgbW9kZS4KCSAgICBQYXRjaCBmcm9tIEFhcm9uIFZhbkRldmVuZGVyICgjMTQ0MTQ3NCkuCgowMy8wNC8yMDA2OiBtbWF0dXMKCSAgICAtIEFkZCAtTyB0byB0aGUgbWFpbiBwcm9ncmFtLCB3aGljaCBub3cgZW5hYmxlcyAtZmFzdGRpc3BhdGNoCgkgICAgCgkgICAgW1B5dGhvbl0KCgkgICAgLSBBZGQgdGhlIC1mYXN0aW5pdCBvcHRpb24gdG8gZW5hYmxlIGZhc3RlciBfX2luaXRfXwogICAgICAgICAgICAgIG1ldGhvZHMuIFNldHRpbmcgJ3RoaXMnIGFzICdzZWxmLnRoaXMuYXBwZW5kKHRoaXMpJyBpbiB0aGUgcHl0aG9uCgkgICAgICBjb2RlIGNvbmZ1c2VzIFB5THVjZW5lLiBOb3cgdGhlIGluaXRpYWxpemF0aW9uIGlzIGRvbmUgaW4gdGhlCgkgICAgICB0aGUgQysrIHNpZGUsIGFzIHJlcG9ydGVkIGJ5IEFuZGkgYW5kIFJvYmluLgoKCSAgICAtIEFkZCB0aGUgLWZhc3RxdWVyeSBvcHRpb24gdG8gZW5hYmxlIGZhc3RlciBTV0lHX1R5cGVRdWVyeSB2aWEgYQogICAgICAgICAgICAgIHB5dGhvbiBkaWN0IGNhY2hlLCBhcyBwcm9wb3NlZCBieSBBbmRpIFZhamRhCgoJICAgIC0gQXZvaWQgdG8gY2FsbCBQeU9iamVjdF9HZXRBdHRyIGluc2lkZSBTV0lHX1B5dGhvbl9HZXRTd2lnVGhpcywKCSAgICAgIHNpbmNlIHRoaXMgY29uZnVzZXMgUHlMdWNlbmUsIGFzIHJlcG9ydGVkIGJ5IEFuZGkgVmFqZGEuCgkgICAgCjAzLzAyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXQogICAgICAgICAgICBSZW1vdmVkIGV4dHJhICh2b2lkICopIGNhc3Qgd2hlbiBjYXN0aW5nIHBvaW50ZXJzIHRvIGFuZCBmcm9tIGpsb25nIGFzIHRoaXMKICAgICAgICAgICAgd2FzIHN1cHByZXNzaW5nIGdjYydzICJkZXJlZmVyZW5jaW5nIHR5cGUtcHVubmVkIHBvaW50ZXIgd2lsbCBicmVhayBzdHJpY3QtYWxpYXNpbmcgcnVsZXMiCiAgICAgICAgICAgIHdhcm5pbmcuIFRoaXMgd2FybmluZyBjb3VsZCBiZSBpZ25vcmVkIGluIHZlcnNpb25zIG9mIGdjYyBwcmlvciB0byA0LjAsIGJ1dCBub3cgdGhlCiAgICAgICAgICAgIHdhcm5pbmcgaXMgdXNlZnVsIGFzIGdjYyAtTzIgYW5kIGhpZ2hlciBvcHRpbWlzYXRpb24gbGV2ZWxzIGluY2x1ZGVzIC1mc3RyaWN0LWFsaWFzaW5nIHdoaWNoCiAgICAgICAgICAgIGdlbmVyYXRlcyBjb2RlIHRoYXQgZG9lc24ndCB3b3JrIHdpdGggdGhlc2UgY2FzdHMuIFRoZSBhc3NpZ25tZW50IGlzIHNpbXBseSBuZXZlciBtYWRlLgogICAgICAgICAgICBQbGVhc2UgdXNlIC1mbm8tc3RyaWN0LWFsaWFzaW5nIHRvIGJvdGggc3VwcHJlc3MgdGhlIHdhcm5pbmcgYW5kIGZpeCB0aGUgYmFkIGFzc2VtYmx5CiAgICAgICAgICAgIGNvZGUgZ2VuZXJhdGVkLiBOb3RlIHRoYXQgdGhlIHdhcm5pbmcgaXMgb25seSBnZW5lcmF0ZWQgYnkgdGhlIEMgY29tcGlsZXIsIGJ1dCBub3QKICAgICAgICAgICAgdGhlIEMrKyBjb21waWxlciwgeWV0IHRoZSBDKysgY29tcGlsZXIgd2lsbCBhbHNvIGdlbmVyYXRlIGJyb2tlbiBjb2RlLiBBbHRlcm5hdGl2ZWx5IHVzZSAKICAgICAgICAgICAgLVduby1zdHJpY3QtYWxpYXNpbmcgdG8gc3VwcHJlc3MgdGhlIHdhcm5pbmcgZm9yIGdjYy0zLnguIFRoZSB0eXBlbWFwcyBhZmZlY3RlZAogICAgICAgICAgICBhcmUgdGhlICJpbiIgYW5kICJvdXQiIHR5cGVtYXBzIGluIGphdmEuc3dnIGFuZCBhcnJheXNfamF2YS5zd2cuIFVzZXJzIG91Z2h0IHRvIGZpeAogICAgICAgICAgICB0aGVpciBvd24gdHlwZW1hcHMgdG8gZG8gdGhlIHNhbWUuIE5vdGUgdGhhdCByZW1vdmFsIG9mIHRoZSB2b2lkICogY2FzdCBzaW1wbHkgcHJldmVudHMKICAgICAgICAgICAgc3VwcHJlc3Npb24gb2YgdGhlIHdhcm5pbmcgZm9yIHRoZSBDIGNvbXBpbGVyIGFuZCBub3RoaW5nIGVsc2UuIFR5cGljYWwgY2hhbmdlOgoKICAgICAgICAgICAgRnJvbToKICAgICAgICAgICAgICAldHlwZW1hcChpbikgU1dJR1RZUEUgKiAleyAkMSA9ICooJCYxX2x0eXBlKSh2b2lkICopJiRpbnB1dDsgJX0KICAgICAgICAgICAgVG86CiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIFNXSUdUWVBFICogJXsgJDEgPSAqKCQmMV9sdHlwZSkmJGlucHV0OyAlfQoKICAgICAgICAgICAgRnJvbToKICAgICAgICAgICAgICAldHlwZW1hcChvdXQpIFNXSUdUWVBFICogJXsgKigkJjFfbHR5cGUpKHZvaWQgKikmJHJlc3VsdCA9ICQxOyAlfSAKICAgICAgICAgICAgVG86CiAgICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBTV0lHVFlQRSAqICV7ICooJCYxX2x0eXBlKSYkcmVzdWx0ID0gJDE7ICV9IAoKMDMvMDIvMjAwNjogbWtvZXBwZQoJICAgIFtHdWlsZSAtc2NtXQoJICAgIEFkZCB0eXBlbWFwcyBmb3IgImxvbmcgbG9uZyI7IHdoZXRoZXIgdGhlIGdlbmVyYXRlZCBjb2RlIGNvbXBpbGVzLCBob3dldmVyLCBkZXBlbmRzCgkgICAgb24gdGhlIHZlcnNpb24gYW5kIGNvbmZpZ3VyYXRpb24gb2YgR3VpbGUuCgowMy8wMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdCiAgICAgICAgICAgIEFkZCBzdXBwb3J0IGZvciBpbm5lciBleGNlcHRpb25zLiBJZiBhbnkgb2YgdGhlIGRlbGVnYXRlcyBhcmUgY2FsbGVkIHdoaWNoIGNvbnN0cnVjdAogICAgICAgICAgICBhIHBlbmRpbmcgZXhjZXB0aW9uIGFuZCB0aGVyZSBpcyBhbHJlYWR5IGEgcGVuZGluZyBleGNlcHRpb24sIGl0IHdpbGwgY3JlYXRlIHRoZSBuZXcKICAgICAgICAgICAgZXhjZXB0aW9uIHdpdGggdGhlIHBlbmRpbmcgZXhjZXB0aW9uIGFzIGFuIGlubmVyIGV4Y2VwdGlvbi4KCjAzLzAyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQaHBdCiAgICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIFBocDUgZXhjZXB0aW9ucyBpZiBjb21waWxpbmcgYWdhaW5zdCBQaHA1IChwYXRjaCBmcm9tIE9sbHkgQmV0dHMpLgoKMDMvMDEvMjAwNjogbW1hdHVzCgkgICAgVXNlIHRoZSBHQ0MgdmlzaWJpbGl0eSBhdHRyaWJ1dGUgaW4gU1dJR0VYUE9SVC4KCgkgICAgTm93IHlvdSBjYW4gY29tcGlsZSAod2l0aCBnY2MgMy40IG9yIGxhdGVyKSB1c2luZwoJICAgIENGTEFHUz0iLWZ2aXNpYmlsaXR5PWhpZGRlbiIuCgkgICAgCgkgICAgQ2hlY2sgdGhlIGRpZmZlcmVuY2UgZm9yIHRoZSAnc3RkX2NvbnRhaW5lcnMuaScgcHl0aG9uIAoJICAgIHRlc3QgY2FzZToKIAogICAgICAgICAgICBTaXplczoKCgkgICAgICAzMzA1NDMyIF9zdGRfY29udGFpbmVycy5zbwoJICAgICAgMjM4Mzk5MiBfc3RkX2NvbnRhaW5lcnMuc28uaGlkZGVuCgoJICAgIEV4cG9ydGVkIHN5bWJvbHMgKG5tIC1EIDxmaWxlPi5zbyB8IHdjIC1sKToKCiAgICAgICAgICAgICAgNjE0NiBfc3RkX2NvbnRhaW5lcnMuc28gCiAgICAgICAgICAgICAgMTc0ICBfc3RkX2NvbnRhaW5lcnMuc28uaGlkZGVuIAoKCSAgICBFeGVjdXRpb24gdGltZXM6CgoJICAgICAgcmVhbCAwbTAuMDUwcyB1c2VyIDBtMC4wMzlzIHN5cyAwbTAuMDA1cyAgIF9zdGRfY29udGFpbmVycy5zbwogICAgICAgICAgICAgIHJlYWwgMG0wLjAzOXMgdXNlciAwbTAuMDI2cyBzeXMgMG0wLjAwN3MgICBfc3RkX2NvbnRhaW5lcnMuc28uaGlkZGVuCgoJICAgIFJlYWQgaHR0cDovL2djYy5nbnUub3JnL3dpa2kvVmlzaWJpbGl0eSBmb3IgbW9yZSBkZXRhaWxzLgoKCjAyLzI3LzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBBZGQgc3VwcG9ydCBmb3IgSU5QVVQsIE9VVFBVVCwgYW5kIElOT1VUIHR5cGVtYXBzLgoJICAgIEZvciBPVVRQVVQgdmFyaWFibGVzLCB0aGUgbGlzcCB3cmFwcGVyIHJldHVybnMgbXVsdGlwbGUKCSAgICB2YWx1ZXMuCgowMi8yNi8yMDA2OiBtbWF0dXMKCgkgICAgW1J1YnldIGFkZCBhcmdjYXJndi5pIGxpYnJhcnkgZmlsZS4KCSAgICAKCSAgICBVc2UgaXQgYXMgZm9sbG93OgoKCQklaW5jbHVkZSBhcmdjYXJndi5pCgkgICAgICAJCQkJCQkJCQkgCiAgIAkgICAgICAgICVhcHBseSAoaW50IEFSR0MsIGNoYXIgKipBUkdWKSB7IChzaXplX3QgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpIH0gCgkgICAgICAJCQkJCQkJCQkgCiAgIAkgICAgICAgICVpbmxpbmUgewkJCQkKICAgCSAgICAgICAgICBpbnQgbWFpbkFwcChzaXplX3QgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpIAkKICAgCSAgICAgICAgICB7CQkJCQkJCiAgIAkgICAgICAgICAgICByZXR1cm4gYXJnYzsJCQkJCQogICAJICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0JCQkJCQkJCgkgICAgICAJCQkJCQkJCiAgIAkgICAgdGhlbiBpbiB0aGUgcnVieSBzaWRlOgkJCQkJCgkgICAgICAJCQkJCQkJCQogICAJICAgICAgICBhcmdzID0gWyJhc2RmIiwgImFzZGYyIl0JCQkJCiAgIAkgICAgICAgIG4gPSBtYWluQXBwKGFyZ3MpOwoJCgoJICAgIFRoaXMgaXMgdGhlIHNpbWlsYXIgdG8gdGhlIHB5dGhvbiB2ZXJzaW9uIExpYi9weXRob24vYXJnY2FyZ3YuaQoKMDIvMjQvMjAwNjogbWdvc3NhZ2UKCgkgICAgU21hbGwgdXBkYXRlIEx1YSBkb2N1bWVudHMgb24gdHJvdWJsZXNob290aW5nIHByb2JsZW1zCgkgICAgCjAyLzIyLzIwMDY6IG1tYXR1cyAKCgkgICAgRml4IGFsbCB0aGUgZXJyb3JzIHJlcG9ydGVkIGZvciAxLjMuMjguCgkgICAgLSBmaXggYnVnICMxMTU4MTc4CgkgICAgLSBmaXggYnVnICMxMDYwNzg5CgkgICAgLSBmaXggYnVnICMxMjYzNDU3CgkgICAgLSBmaXggJ2NvbnN0ICBjaGFyKiYnIHR5cGVtYXAgaW4gdGhlIFVUTCwgcmVwb3J0ZWQgYnkgR2VvZmYgSHV0Y2hpc29uCgkgICAgLSBmaXhlcyBmb3IgcHl0aG9uIDIuMSBhbmQgdGhlIHJ1bnRpbWUgbGlicmFyeQoJICAgIC0gZml4IGNvcHljdG9yICsgdGVtcGxhdGUgYnVnICMxNDMyMTI1CgkgICAgLSBmaXggWyAxNDMyMTUyIF0gJXJlbmFtZSBmcmllbmQgb3BlcmF0b3JzIGluIG5hbWVzcGFjZQoJICAgIC0gZml4IGdjYyB3YXJuaW5nIHJlcG9ydGVkIGJ5IFIuIEJlcm5zdGVpbgoJICAgIC0gYXZvaWQgYXNzZXJ0IHdoZW4gZmluZGluZyBhIHJlY3Vyc2l2ZSBzY29wZSBpbmhlcml0YW5jZSwKCSAgICAgIGVtaXQgYSB3YXJuaW5nIGluIHRoZSB3b3JzdCBjYXNlLCByZXBvcnRlZCBieSBOaXRybyAKCSAgICAtIGZpeCBwcmVtYXR1cmUgb2JqZWN0IGRlbGV0aW9uIHJlcG9ydGVkIGJ5IFBhdWwgaW4gdGNsM2QKCSAgICAtIGZpeCB3YXJuaW5nIHJlcG9ydGVkIGJ5IE5pdHJvIGluIFZDNwoJICAgIC0gbW9yZSBmaXhlcyBmb3Igb2xkIFNvbGFyaXMgY29tcGlsZXIKCSAgICAtIGZpeCBmb3IgcHl0aG9uIDIuMyBhbmQgZ2NfcmVmcyBpc3N1ZSByZXBvcnRlZCBieSBMdWlnaQoJICAgIC0gZml4IGZhc3Rwcm94eSBmb3IgbWV0aG9kcyB1c2luZyBrd2FyZ3MKCSAgICAtIGZpeCBvdmVybG9hZCArIHByb3RlY3RlZCBtZW1iZXIgaXNzdWUgcmVwb3J0ZWQgYnkgQ29saW4gTWNEb25hbGQKCSAgICAtIGZpeCBzZXRlcnJvcm1zZyBhcyByZXBvcnRlZCBieSBDb2xpbiBNY0RvbmFsZAoJICAgIC0gZml4IGRpcmVjdG9ycywgbm93IHRoZSB0ZXN0LXN1aXRlIHJ1bnMgYWdhaW4gdXNpbmcgLWRpcmVjdG9ycwoJICAgIC0gZml4IGZvciBmcmllbmQgb3BlcmF0b3IgYW5kIFZpc3VhbCBzdHVkaW8gYW5kIGJ1ZyAxNDMyMTUyCgkgICAgLSBmaXggYnVnICMxNDM1MDkwCgkgICAgLSBmaXggdXNpbmcgKyAlZXh0ZW5kIGFzIHJlcG9ydGVkIGJ5IFdpbGxpYW0KCSAgICAtIGZpeCBidWcgIzEwOTQ5NjQKCSAgICAtIGZpeCBmb3IgUHlfTm90SW1wbGVtZW50ZWQgYXMgcmVwb3J0ZWQgYnkgT2xseSBhbmQgQW1hdXJ5CgkgICAgLSBmaXggbmVzdGVkIG5hbWVzcGFjZSBpc3N1ZSByZXBvcnRlZCBieSBDaGFybGllCgoJICAgIGFuZCBhbHNvOgoJICAgIAoJICAgIC0gYWxsb3cgZGlyZWN0b3IgcHJvdGVjdGVkIG1lbWJlcnMgYnkgZGVmYXVsdAoJICAgIC0gZGVsZXRlIGV4dHJhIG5ldyBsaW5lcyBpbiBzd2lnbWFjcm9zW1VUTF0KCSAgICAtIGNvc21ldGljIGZvciBnZW5lcmF0ZWQgcHl0aG9uIGNvZGUKCSAgICAtIGFkZCB0aGUgZmFjdG9yeS5pIGxpYnJhcnkgZm9yIFVUTAoJICAgIC0gYWRkIHN3aWdyZWdpc3RlciBwcm94eSBtZXRob2QgYW5kIG1vdmUgX19yZXByX18gdG8gYQoJICAgICAgc2luZ2xlIGdsb2JhbCBtb2R1bGUgIFtweXRob25dCgowMi8yMi8yMDA2OiBtbWF0dXMgCgoJICAgIFdoZW4gdXNpbmcgZGlyZWN0b3JzLCBub3cgc3dpZyB3aWxsIGVtaXQgYWxsIHRoZSB2aXJ0dWFsCgkgICAgcHJvdGVjdGVkIG1ldGhvZHMgYnkgZGVmYXVsdC4gCgoJICAgIEluIHByZXZpb3VzIHJlbGVhc2VzLCB5b3UgbmVlZGVkIHRvIHVzZSB0aGUgJ2RpcnByb3QnCgkgICAgb3B0aW9uIHRvIGFjaGlldmUgdGhlIHNhbWUuCgoJICAgIElmIHlvdSB3YW50LCB5b3UgY2FuIGRpc2FibGUgdGhlIG5ldyBkZWZhdWx0IGJlaGF2aW91ciwKCSAgICB1c2UgdGhlICdub2RpcnByb3QnIG9wdGlvbjogCgoJICAgICAgIHN3aWcgLW5vZGlycHJvdCAuLi4KCgkgICAgYW5kL29yIHRoZSAlbm9kaXJlY3RvciBmZWF0dXJlIGZvciBzcGVjaWZpYyBtZXRob2RzLCBpLmUuOgoKCSAgICAgICAlbm9kaXJlY3RvciBGb286OmJhcjsKCgkgICAgICAgc3RydWN0IEZvbyB7CgkgICAgICAgICB2aXJ0dWFsIH5Gb28oKTsKCgkgICAgICAgcHJvdGVjdGVkOgoJICAgICAgICAgdmlydHVhbCB2b2lkIGJhcigpOwoJICAgICAgIH07CgkgICAgCgoJICAgIEFzIGJlZm9yZSwgcHVyZSBhYnN0cmFjdCBwcm90ZWN0ZWQgbWVtYmVycyBhcmUgYWxsd2F5cwoJICAgIGVtaXR0ZWQsIGluZGVwZW5kZW50IG9mIHRoZSAnZGlycHJvdC9ub2RpcnByb3QnIG9wdGlvbnMuCgoKMDIvMjIvMjAwNjogbW1hdHVzCgkgICAgQWRkIHRoZSBmYWN0b3J5LmkgbGlicmFyeSBmb3IgbGFuZ3VhZ2VzIHVzaW5nIHRoZSBVVEwgKHB5dGhvbix0Y2wscnVieSxwZXJsKS4KCSAgICAKICAgICAgICAgICAgZmFjdG9yeS5pIGltcGxlbWVudHMgYSBtb3JlIG5hdHVyYWwgd3JhcCBmb3IgZmFjdG9yeSBtZXRob2RzLiAKCgkgICAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlOgkJCQkJCQkgICAgCgkgICAgCQkJCQkJCQkgICAgCiAgCSAgICAtLS0tICBnZW9tZXRyeS5oIC0tLS0tLS0tCQkJCQkgICAgCiAgCSAgICAgICAgIHN0cnVjdCBHZW9tZXRyeSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAJCSAgICAKICAJICAgICAgICAgICBlbnVtIEdlb21UeXBlewkJCSAgICAgCQkJICAgIAogIAkgICAgICAgICAgICAgUE9JTlQsCQkJCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgICBDSVJDTEUJCQkJICAgICAJCSAgICAKICAJICAgICAgICAgICB9OwkJCQkJICAgICAJCSAgICAKICAJICAgICAgICAgICAJCQkJCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgdmlydHVhbCB+R2VvbWV0cnkoKSB7fSAgICAJCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgdmlydHVhbCBpbnQgZHJhdygpID0gMDsJCQkJICAgIAogIAkgICAgCSAJCQkJCQkJICAgIAogIAkgICAgCSAvLwkJCQkJCQkgICAgCiAgCSAgICAJIC8vIEZhY3RvcnkgbWV0aG9kIGZvciBhbGwgdGhlIEdlb21ldHJ5IG9iamVjdHMJCSAgICAKICAJICAgIAkgLy8JCQkJCQkJICAgIAogIAkgICAgICAgICAgIHN0YXRpYyBHZW9tZXRyeSAqY3JlYXRlKEdlb21UeXBlIGkpOyAgICAgCQkgICAgCiAgCSAgICAgICAgIH07CQkJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAJCQkJCSAgICAgCQkJICAgIAogIAkgICAgICAgICBzdHJ1Y3QgUG9pbnQgOiBHZW9tZXRyeSAgewkJICAgICAJCSAgICAKICAJICAgICAgICAgICBpbnQgZHJhdygpIHsgcmV0dXJuIDE7IH0JCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgZG91YmxlIHdpZHRoKCkgeyByZXR1cm4gMS4wOyB9ICAgIAkgICAgIAkJICAgIAogIAkgICAgICAgICB9OwkJCQkJICAgICAJCSAgICAKICAJICAgICAgICAgCQkJCQkgICAgIAkJCSAgICAKICAJICAgICAgICAgc3RydWN0IENpcmNsZSA6IEdlb21ldHJ5ICB7CQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIGludCBkcmF3KCkgeyByZXR1cm4gMjsgfQkJICAgICAJCSAgICAKICAJICAgICAgICAgICBkb3VibGUgcmFkaXVzKCkgeyByZXR1cm4gMS41OyB9ICAgICAgICAgIAkJICAgIAogIAkgICAgICAgICB9OyAJCQkJCSAgICAgCQkgICAgCiAgCSAgICAgICAgIAkJCQkJCQkJICAgIAogIAkgICAgICAgICAvLwkJCQkJCQkgICAgCiAgCSAgICAgICAgIC8vIEZhY3RvcnkgbWV0aG9kIGZvciBhbGwgdGhlIEdlb21ldHJ5IG9iamVjdHMJCSAgICAKICAJICAgICAgICAgLy8JCQkJCQkJICAgIAogIAkgICAgICAgICBHZW9tZXRyeSAqR2VvbWV0cnk6OmNyZWF0ZShHZW9tVHlwZSB0eXBlKSB7CQkgICAgCiAgCSAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CQkJICAgICAJCSAgICAKICAJICAgICAgICAgICBjYXNlIFBPSU5UOiByZXR1cm4gbmV3IFBvaW50KCk7CSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgY2FzZSBDSVJDTEU6IHJldHVybiBuZXcgQ2lyY2xlKCk7IAkgICAgIAkJICAgIAogIAkgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiAwOwkJCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgfQkJCQkJICAgICAJCSAgICAKICAJICAgICAgICAgfQkJCQkJICAgIAkJICAgIAogIAkgICAgLS0tLSAgZ2VvbWV0cnkuaCAtLS0tLS0tLQkJCQkJICAgIAoJICAgIAkJCQkJCQkJICAgIAoJICAgIAkJCQkJCQkJICAgIAoJICAgIFlvdSBjYW4gdXNlIHRoZSAlZmFjdG9yeSB3aXRoIHRoZSBHZW9tZXRyeTo6Y3JlYXRlIG1ldGhvZCBhcyBmb2xsb3dzOgoJICAgIAkJCQkJCQkJICAgIAogIAkgICAgICAlbmV3b2JqZWN0IEdlb21ldHJ5OjpjcmVhdGU7CQkJCSAgICAKICAJICAgICAgJWZhY3RvcnkoR2VvbWV0cnkgKkdlb21ldHJ5OjpjcmVhdGUsIFBvaW50LCBDaXJjbGUpOwkgICAgCiAgCSAgICAgICVpbmNsdWRlICJnZW9tZXRyeS5oIgkJCQkJICAgIAoJICAgIAkJCQkJCQkJICAgIAogIAkgICAgYW5kIEdlb21ldHJ5OjpjcmVhdGUgd2lsbCByZXR1cm4gYSAnUG9pbnQnIG9yICdDaXJjbGUnIGluc3RhbmNlICAgCiAgCSAgICBpbnN0ZWFkIG9mIHRoZSBwbGFpbiAnR2VvbWV0cnknIHR5cGUuIEZvciBleGFtcGxlLCBpbiBweXRob246CSAgICAKCSAgICAJCQkJCQkJCSAgICAKICAJICAgICAgY2lyY2xlID0gR2VvbWV0cnkuY3JlYXRlKEdlb21ldHJ5LkNJUkNMRSkJCQkgICAgCiAgCSAgICAgIHIgPSBjaXJjbGUucmFkaXVzKCkJCQkJCQkgICAgCgkgICAgCQkJCQkJCQkgICAgCiAgCSAgICB3aGVyZSAnY2lyY2xlJyBub3cgaXMgYSBDaXJjbGUgcHJveHkgaW5zdGFuY2UuCSAgICAJCSAgICAKCgowMi8xNy8yMDA2OiBta29lcHBlCgkgICAgW016U2NoZW1lXSBUeXBlbWFwcyBmb3IgYWxsIGludGVncmFsIHR5cGVzIG5vdyBhY2NlcHQgdGhlIGZ1bGwgcmFuZ2Ugb2YgaW50ZWdyYWwKCSAgICB2YWx1ZXMsIGFuZCB0aGV5IHNpZ25hbCBhbiBlcnJvciB3aGVuIGEgdmFsdWUgb3V0c2lkZSB0aGUgdmFsaWQgcmFuZ2UgaXMgcGFzc2VkLgoJICAgIFtHdWlsZV0gVHlwZW1hcHMgZm9yIGFsbCBpbnRlZ3JhbCB0eXBlcyBub3cgc2lnbmFsIGFuIGVycm9yIHdoZW4gYSB2YWx1ZSBvdXRzaWRlCgkgICAgdGhlIHZhbGlkIHJhbmdlIGlzIHBhc3NlZC4KCjAyLzEzLzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtEb2N1bWVudHNdIHVwZGF0ZWQgdGhlIGV4dGVuZGluZyBkb2N1bWVudHMgdG8gZ2l2ZSBhIHNrZWxldG9uIHN3aWdnaW5nIGNvZGUKICAgICAgICAgICAgd2l0aCBhIGZldyB0eXBlbWFwcy4KICAgICAgICAgICAgW0x1YV0gYWRkZWQgYW4gZXh0cmEgdHlwZW1hcCBmb3Igdm9pZCogW2luXSwgc28gYSBmdW5jdGlvbiB3aGljaCByZXF1aXJlcyBhIHZvaWQqCiAgICAgICAgICAgIGNhbiB0YWtlIGFueSBraW5kIG9mIHBvaW50ZXIKClZlcnNpb24gMS4zLjI4IChGZWJydWFyeSAxMiwgMjAwNikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDIvMTEvMjAwNjogbW1hdHVzCgkgICAgRml4IG1hbnkgaXNzdWVzIHdpdGggbGluZSBjb3VudGluZyBhbmQgZXJyb3IgcmVwb3J0cy4KCjAyLzExLzIwMDY6IG1tYXR1cwoJICAgIFtQeXRob25dIEJldHRlciBzdGF0aWMgZGF0YSBtZW1iZXIgc3VwcG9ydCwgaWYgeW91IGhhdmUKCSAgICAKICAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICBzdGF0aWMgaW50IGJhcjsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICB0aGVuIG5vdyBpcyB2YWxpZCB0byBhY2Nlc3MgdGhlIHN0YXRpYyBkYXRhIG1lbWJlciwgaWU6CgogICAgICAgICAgICAgICAgZiA9IEZvbygpCiAgICAgICAgICAgICAgICBmLmJhciA9IDMKCgkgICAganVzdCBhcyBpbiBDKysuCgoKMDIvMTEvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdCiAgICAgICAgICAgIEZpeGVkIGNvZGUgZ2VuZXJhdGlvbiB0byB3b3JrIGFnYWluIHdpdGggb2xkIHZlcnNpb25zIG9mIFBlcmwKICAgICAgICAgICAgKDUuMDA0IGFuZCBsYXRlciB0ZXN0ZWQpCgowMi8wNC8yMDA2OiBtbWF0dXMKCSAgICBbUHl0aG9uXSBBZGQgdGhlICVleHRlbmRfc21hcnRfcG9pbnRlcigpIGRpcmVjdGl2ZSB0byBleHRlbmQKCSAgICBTV0lHIHNtYXJ0IHBvaW50ZXIgc3VwcG9ydCBpbiBweXRob24uIAoKCSAgICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBzbWFydCBwb2ludGVyIGFzOgoJICAgIAoJICAgICAgdGVtcGxhdGUgPGNsYXNzIFR5cGU+IGNsYXNzIFJDUHRyIHsKCSAgICAgIHB1YmxpYzoKCSAgICAgICAgLi4uCgkgICAgICAgIFJDUHRyKFR5cGUgKnApOwoJCVR5cGUgKiBvcGVyYXRvci0+KCkgY29uc3Q7CgkJLi4uCgkgICAgICB9OwoJICAgICAgCgkgICAgeW91IHVzZSB0aGUgJWV4dGVuZF9zbWFydF9wb2ludGVyIGRpcmVjdGl2ZSBhczoKCSAgICAKCSAgICAgICVleHRlbmRfc21hcnRfcG9pbnRlcihSQ1B0cjxBPik7CgkgICAgICAldGVtcGxhdGUoUkNQdHJfQSkgIFJDUHRyPEE+OwoJICAgIAoJICAgIHRoZW4sIGlmIHlvdSBoYXZlIHNvbWV0aGluZyBsaWtlOgoKCSAgICAgIFJDUHRyPEE+IG1ha2VfcHRyKCk7CgkgICAgICBpbnQgZm9vKEEgKik7CgoJICAgIHlvdSBjYW4gZG8gdGhlIGZvbGxvd2luZzoKCgkgICAgICBhID0gbWFrZV9wdHIoKTsKCSAgICAgIGIgPSBmb28oYSk7CgogICAgICAgICAgICBpZSwgc3dpZyB3aWxsIGFjY2VwdCBhIFJDUHRyPEE+IG9iamVjdCB3aGVyZSBhICdBIConIGlzCiAgICAgICAgICAgIGV4cGVjdGVkLgoKCSAgICBBbHNvLCB3aGVuIHVzaW5nIHZlY3RvcnMKCSAgICAKCSAgICAgICVleHRlbmRfc21hcnRfcG9pbnRlcihSQ1B0cjxBPik7CgkgICAgICAldGVtcGxhdGUoUkNQdHJfQSkgUkNQdHI8QT47CgkgICAgICAldGVtcGxhdGUodmVjdG9yX0EpIHN0ZDo6dmVjdG9yPFJDUHRyPEE+ID47CgkJCgkgICAgeW91IGNhbiB0eXBlCgoJICAgICAgYSA9IEEoKTsKCSAgICAgIHYgPSB2ZWN0b3JfQSgyKQoJICAgICAgdlswXSA9IGEKCiAgICAgICAgICAgIGllLCBhbiAnQSAqJyBvYmplY3QgaXMgYWNjZXB0ZWQsIHZpYSBpbXBsaWNpdCBjb252ZXJzaW9uLCAKCSAgICB3aGVyZSBhIFJDUHRyPEE+IG9iamVjdCBpcyBleHBlY3RlZC4gQWRkaXRpb25hbGx5CgoJICAgICAgeCA9IHZbMF0KCgkgICAgcmV0dXJucyAoYW5kIHNldHMgJ3gnIGFzKSBhIGNvcHkgb2YgdlswXSwgbWFraW5nIHJlZmVyZW5jZQoJICAgIGNvdW50aW5nIHBvc3NpYmxlIGFuZCBjb25zaXN0ZW50LgoKCSAgICAlZXh0ZW5kX3NtYXJ0X3BvaW50ZXIgaXMganVzdCBhIGNvbGxlY3Rpb25zIG9mIG5ldy9vbGQKCSAgICB0cmlja3MsIGluY2x1ZGluZyAldHlwZW1hcHMgYW5kIHRoZSBuZXcgJWltcGxpY2l0Y29udgoJICAgIGRpcmVjdGl2ZS4KCjAyLzAyLzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIGJ1Z2ZpeCAjMTM1NjU3NywgY2hhbmdlZCBkb3VibGU9Pmx1YV9udW1iZXIgaW4gYSBmZXcgcGxhY2VzLgogICAgICAgICAgICBhZGRlZCB0aGUgc3RkOjpwYWlyIHdyYXBwaW5nCgowMS8zMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBzdGQ6OnN0cmluZyBhbmQgc3RkOjp3c3RyaW5nIG1lbWJlciB2YXJpYWJsZXMgYW5kIGdsb2JhbCB2YXJpYWJsZXMgbm93IHVzZQogICAgICAgICAgICAlbmF0dXJhbHZhciBieSBkZWZhdWx0LCBtZWFuaW5nIHRoZXkgd2lsbCBub3cgYmUgd3JhcHBlZCBhcyBleHBlY3RlZCBpbiBhbGwgbGFuZ3VhZ2VzLgogICAgICAgICAgICBQcmV2aW91c2x5IHRoZXNlIHdlcmUgd3JhcHBlZCBhcyBhIHBvaW50ZXIgcmF0aGVyIHRoYW4gYSB0YXJnZXQgbGFuZ3VhZ2Ugc3RyaW5nLgogICAgICAgICAgICBJdCBpcyBubyBsb25nZXIgbmVjZXNzYXJ5IHRvIGFkZCB0aGUgZm9sbG93aW5nIHdvcmthcm91bmQgdG8gd3JhcCB0aGVzZSBhcyBzdHJpbmdzOgoKCQklYXBwbHkgY29uc3Qgc3RkOjpzdHJpbmcgJiB7IHN0ZDo6c3RyaW5nICp9CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgowMS8yOC8yMDA2OiBta29lcHBlCgkgICAgW0d1aWxlIC1zY21dIAoJICAgIEFkZCB0eXBlbWFwcyBmb3IgaGFuZGxpbmcgb2YgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzLgoKMDEvMjQvMjAwNjogbW1hdHVzCgkgICAgLSBCZXR0ZXIgc3VwcG9ydCBmb3IgdGhlICVuYXR1cmFsdmFyIGRpcmVjdGl2ZSwgbm93IGl0CgkgICAgICB3b3JrcyB3aXRoIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2VzIGFzIHdlbGwgYXMKCSAgICAgIEphdmEvQyMuCgkgICAgICAKCSAgICAgIE5vdywgaXQgY2FuIGFsc28gYmUgYXBwbGllZCB0byBjbGFzcyB0eXBlczoKCgkgICAgICAgICVuYXR1cmFsdmFyIHN0ZDo6c3RyaW5nOwoJICAgICAgICAlaW5jbHVkZSA8c3RkX3N0cmluZy5pPgoJICAgICAgCiAgICAgICAgICAgICAgdGhhdCB3aWxsIHRlbGwgc3dpZyB0byB1c2UgdGhlICduYXR1cmFsJyB3cmFwcGluZwogICAgICAgICAgICAgIG1lY2hhbmlzbSB0byBhbGwgc3RkOjpzdHJpbmcgZ2xvYmFsIGFuZCBtZW1iZXIKICAgICAgICAgICAgICB2YXJpYWJsZXMuCgoJICAgIC0gQWRkIHN1cHBvcnQgZm9yIHRoZSAlYWxsb3dleGNlcHQgZmVhdHVyZSBhbG9uZyB0aGUKICAgICAgICAgICAgICBzY3JpcHRpbmcgbGFuZ3VhZ2VzLCB3aGljaCBhbGxvd3MgdGhlICVleGNlcHRpb24gZmVhdHVyZQogICAgICAgICAgICAgIHRvIGJlIGFwcGxpZWQgdG8gdGhlIHZhcmlhYmxlIGFjY2VzcyBtZXRob2RzLiBBbHNvLCBhZGQKICAgICAgICAgICAgICB0aGUgJWV4Y2VwdGlvbnZhciBkaXJlY3RpdmUgdG8gc3BlY2lmeSBhIGRpc3RpbnRpYwogICAgICAgICAgICAgIGV4Y2VwdGlvbiBtZWNoYW5pc20gb25seSBmb3IgdmFyaWFibGVzLgoJICAgICAgCgkgICAgCgkgICAgLSBBZGQgbW9yZSBkb2NzIGZvciB0aGUgJWRlbG9iamVjdCBkaXJlY3RpdmUgdG8gbWFyayBhIG1ldGhvZCBhcyBhCgkgICAgICBkZXN0cnVjdG9yLCAnZGlzb3duaW5nJyB0aGUgZmlyc3QgYXJndW1lbnQuIEZvciBleGFtcGxlOgoKCSAgICAgICAgJW5ld29iamVjdCBjcmVhdGVfZm9vOwoJICAgICAgICAlZGVsb2JqZWN0IGRlc3Ryb3lfZm9vOwoKCSAgICAgICAgRm9vICpjcmVhdGVfZm9vKCkgeyByZXR1cm4gbmV3IEZvbygpOyB9CgkgICAgICAgIHZvaWQgZGVzdHJveV9mb28oRm9vICpmb28pIHsgZGVsZXRlIGZvbzsgfQoKCSAgICAgIG9yIGluIGEgbWVtYmVyIG1ldGhvZCBhczoKCgkgICAgICAgICVkZWxvYmplY3QgRm9vOjpkZXN0cm95OwoKCSAgICAgICAgY2xhc3MgRm9vIHsKCSAgICAgICAgcHVibGljOgoJICAgICAgICAgIHZvaWQgZGVzdHJveSgpIHsgZGVsZXRlIHRoaXM7fQoKCSAgICAgICAgcHJpdmF0ZToKCSAgICAgICAgICB+Rm9vKCk7CiAgICAgICAgICAgICAgIH07CgoKMDEvMjQvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0KCSAgICAtIFJlbW92ZWQgdGhlIHR5cGUgc3dpZ19sdWFfY29tbWFuZF9pbmZvICYgcmVwbGFjZSB3aXRoIGx1YUxfcmVnCgkgICAgICAod2hpY2ggdGhlbiBicm9rZSB0aGUgY29kZSksIGZpeGVkIHRoaXMKCSAgICAtIGFkZGVkIGFuIGFkZGl0aW9uYWwgY2FzdCBpbiB0aGUgdHlwZW1hcHMgZm9yIGVudW0ncwoJICAgICAgZHVlIHRvIHRoZSBpc3N1ZSB0aGF0IFZDLk5ldCB3aWxsIG5vdCBhbGxvdyBjYXN0aW5nIG9mCgkgICAgICBhIGRvdWJsZSB0byBhbiBlbnVtIGRpcmVjdGx5LiBUaGVyZWZvcmUgY2FzdCB0byBpbnQgdGhlbiB0byBlbnVtCgkgICAgICAodGhhbmtzIHRvIEphc29uIFJlZ28gZm9yIHRoaXMgb2JzZXJ2YXRpb24pCgowMS8xNi8yMDA2OiBtbWF0dXMgKENoYW5nZSBkaXNhYmxlZC4uLiB3aWxsIGJlIGJhY2sgaW4gQ1ZTIHNvb24pCgkgICAgQWRkIGluaXRpYWwgc3VwcG9ydCBmb3IgcmVnZXhwIHZpYSB0aGUgZXh0ZXJuYWwgbGlicmFyeQoJICAgIFJ4U3BlbmNlci4gU1dJRyBkb2Vzbid0IHJlcXVpcmUgdGhpcyBsaWJyYXJ5IHRvIGNvbXBpbGUKCSAgICBhbmQvb3IgcnVuLiBCdXQgaWYgeW91IHNwZWNpZnkgLS13aXRoLXJ4c3BlbmNlciwgYW5kIHRoZQoJICAgIGxpYnJhcnkgaXMgZm91bmQgZHVyaW5nIGluc3RhbGxhdGlvbiwgdGhlbiBzd2lnIHdpbGwgdXNlCgkgICAgaXQgaW4gdGhyZWUgcGxhY2VzOgoKCSAgICAtIEluICVyZW5hbWVzIHJ1bGVzLCB2aWEgdGhlIG5ldyByeHNtYXRjaCBydWxlcywgZm9yIGV4YW1wbGU6CgkgICAgCSAgCgkgICAgCSAgJXJlbmFtZSgiJShsb3dlcmNhc2UpIixyeHNtYXRjaCRuYW1lPSJHU0xfLioiKSAiIjsKCSAgICAJICAlcmVuYW1lKCIlKGxvd2VyY2FzZSkiLHJ4c21hdGNoJG5vZGVUeXBlPSJlbnVtIEdTTF8uKiIpICIiOwoJICAgIAkgCiAgICAgICAgICAgICAgcnhzbWF0Y2ggaXMgc2ltaWxhciB0byB0aGUgbWF0Y2ggcnVsZSwgaXQganVzdCB1c2VzCiAgICAgICAgICAgICAgdGhlIFJ4U3BlbmNlciByZWdleHAgbGlicmFyeSB0byBkZWNpZGUgaWYgdGhlcmUgaXMgYQogICAgICAgICAgICAgIG1hdGNoIHdpdGggdGhlIHByb3ZpZGVkIHJlZ2V4cC4gQXMgd2l0aCB0aGUgbWF0Y2gKICAgICAgICAgICAgICBydWxlLCB5b3UgY2FuIGFsc28gdXNlIHRoZSBuZWdhdGUgcnVsZSBub3RyeHNtYXRjaC4KCgkgICAgLSBJbiB0aGUgJXJlbmFtZSB0YXJnZXQgbmFtZSB2aWEgdGhlIHJ4c3RhcmdldCBvcHRpb24sIGZvciBleGFtcGxlOgoJICAgIAkJIAoJICAgIAkgICVyZW5hbWUoIiUobG93ZXJjYXNlKSIscnhzdGFyZ2V0PTEpICJHU0xfLioiOwoKCSAgICAJd2hlcmUgdGhlIHRhcmdldCBuYW1lICJHU0wuKiIgaXMgbm93IHVuZGVyc3Rvb2QgYXMgYQoJICAgIAlyZWdleHAgdG8gYmUgbWF0Y2hlZC4gIAoJICAgIAkgCiAgICAgICAgICAgIC0gSW4gdGhlIG5ldyBlbmNvZGVyICJyeHNwZW5jZXIiLCB3aGljaCBsb29rcyBsaWtlOgoKCSAgICAJICAlKHJ4c3BlbmNlcjpbcmVnZXhwXVtyZXBsYWNlXSlzCgoJICAgIAl3aGVyZSAicmVnZXhwIiBpcyB0aGUgcmVndWxhciBleHByZXNzaW9uIGFuZCAicmVwbGFjZSIKCSAgICAJaXMgYSBzdHJpbmcgdXNlZCBhcyBhIHJlcGxhY2VtZW50LCB3aGVyZSB0aGUgQDAsQDEsLi4uLEA5CgkgICAgCXBzZXVkbyBhcmd1bWVudHMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IHRoZQoJICAgIAljb3JyZXNwb25kaW5nIG1hdGNoaW5nIGl0ZW1zIGluIHRoZSByZWcgZXhwcmVzc2lvbi4KCgkgICAgCUZvciBleGFtcGxlOgoJICAgIAkJICAgICAgCgkgICAgICAgICUocnhzcGVuY2VyOltHU0wuKl1bQDBdKXMgICAgICAgPC0gSGVsbG8gICAgLT4gCgkgICAgICAgICUocnhzcGVuY2VyOltHU0wuKl1bQDBdKXMgICAgICAgPC0gR1NMSGVsbG8gLT4gR1NMSGVsbG8KCSAgICAgICAgJShyeHNwZW5jZXI6W0dTTCguKildW0AxXSlzICAgICA8LSBHU0xIZWxsbyAtPiBIZWxsbwoJICAgICAgICAlKHJ4c3BlbmNlcjpbR1NMKC4qKV1bZ3NsQDFdKXMgIDwtIEdTTEhlbGxvIC0+IGdzbEhlbGxvCgoJICAgIAlBbm90aGVyIGV4YW1wbGUgY291bGQgYmU6CgogICAgICAgICAgICAgICAgJXJlbmFtZSgiJShsb3dlcmNhc2UpcyIsc291cmNlZm10PSIlKHJ4c3BlbmNlcjpbR1NMXyguKildW0AxXSlzIiwlJGlzZnVuY3Rpb24pICIiOwoKCSAgICAJd2hpY2ggdGFrZSBvdXQgdGhlIHByZWZpeCAiR1NMXyIgYW5kIHJldHVybnMgYWxsIHRoZQoJICAgIAlmdW5jdGlvbiBuYW1lcyBpbiBsb3dlciBjYXNlcywgYXMgZm9sbG93aW5nOgoKCSAgICAJICAgIHZvaWQgR1NMX0hlbGxvKCk7ICAgLT4gICBoZWxsbygpOwoJICAgIAkgICAgdm9pZCBHU0xfSGkoKTsgICAgICAtPiAgIGhpKCk7CgkgICAgCSAgICBjb25zdCBpbnQgR1NMX01BWDsgIC0+ICAgR1NMX01BWDsgIC8vIG5vIGNoYW5nZSwgaXMgbm90IGEgZnVuY3Rpb24KCQoJICAgIFdlIHVzZSB0aGUgUnhTcGVuY2VyIGFzIGFuIGluaXRpYWwgdGVzdCBiZWQgdG8KICAgICAgICAgICAgaW1wbGVtZW50aW9uIHdoaWxlIHdlIGRlY2lkZSB3aGljaCBsaWJyYXJ5IHdpbGwgYmUKICAgICAgICAgICAgZmluYWxseSBhZGRlZCB0byBzd2lnLgoKICAgICAgICAgICAgWW91IGNhbiBvYnRhaW4gdGhlIFJ4U3BlbmNlciBsaWJyYXJ5IGZyb20gCgkgICAgCgkgICAgICBodHRwOi8vYXJnbGlzdC5jb20vcmVnZXggKFVuaXgpCgoJICAgIG9yCgkgICAgIAoJICAgICAgaHR0cDovL2dudXdpbjMyLnNvdXJjZWZvcmdlLm5ldC9wYWNrYWdlcy5odG1sIChXaW5kb3dzKQoKCSAgICBPbmNlIGluc3RhbGxlZCwgdXNlICJtYW4gcnhzcGVuY2VyIiB0byBnZXQgbW9yZSBpbmZvCgkgICAgYWJvdXQgdGhlIHJlZ2V4cCBmb3JtYXQsIG9yIGp1c3QgZ29vZ2xlIHJ4c3BlbmNlci4KCgkgICAgU2luY2Ugbm93IHlvdSBjYW4gZW5hYmxlIHRoZSByeHNtYXRjaCBydWxlcyAoc2VlIGFib3ZlKSwKICAgICAgICAgICAgdGhlIHNpbXBsZSBvciAnfCcgc3VwcG9ydCBmb3IgdGhlIG1hdGNoIHJ1bGVzCiAgICAgICAgICAgICgwMS8xMi8yMDA2OiBtbWF0dXMpIGlzIGRpc2FibGVkLiBTdGlsbCwgaWYgeW91IGhhdmUKICAgICAgICAgICAgcHJvYmxlbXMgd2l0aCB0aGUgcnhzcGVuY2VyIGxpYnJhcnksIHlvdSBjYW4gcmUtZW5hYmxlCiAgICAgICAgICAgIHRoZSBzaW1wbGUgJ21hdGNoIG9yJyBzdXBwb3J0IHVzaW5nCiAgICAgICAgICAgIC1EU1dJR19VU0VfU0lNUExFX01BVENIT1IuCgkgIAoKMDEvMTYvMjAwNjogbW1hdHVzCgkgICAgQ2hhbmdlIHRoZSAlcmVuYW1lIHByZWRpY2F0ZXMgdG8gdXNlIHRoZSBwcmVmaXggJyUkJywgYXMgaW46CgkgICAgCgkgICAgICAlcmVuYW1lKCIlKHV0aXRsZSlzIiwlJGlzZnVuY3Rpb24sJSRpc21lbWJlcikgIiI7IAoJICAgCQogICAgICAgICAgICB0byBhdm9pZCBjbGFzaGVzIHdpdGggb3RoZXIgc3dpZyBtYWNyb3MvZGlyZWN0aXZlcy4KCjAxLzE0LzIwMDY6IGNmaXNhdmFnZQogICAgICAgICAgICBbUnVieV0KCSAgICBBZGRlZCBzdXBwb3J0IGZvciBSdWJ5IGJhbmchIG1ldGhvZHMgdmlhIGEgbmV3ICViYW5nIGZlYXR1cmUuCgkgICAgQmFuZyBtZXRob2RzIGVuZCBpbiBleGNsYW1hdGlvbiBwb2ludHMgYW5kIGluZGljYXRlIHRoYXQgdGhlCgkgICAgb2JqZWN0IGJlaW5nIHByb2Nlc3NlZCB3aWxsIGJlIG1vZGlmaWVkIGluLXBsYWNlIGFzIAoJICAgIG9wcG9zZWQgdG8gYmVpbmcgY29waWVkLgoKMDEvMTIvMjAwNjogY2Zpc2F2YWdlCiAgICAgICAgICAgIFtSdWJ5XQoJICAgIFVwZGF0ZWQgdGhlIFJ1YnkgbW9kdWxlIHRvIGF1dG9tYXRpY2FsbHkgY29udmVydAoJICAgIG1ldGhvZCBuYW1lcyB0byBsb3dlcl9jYXNlX3dpdGhfdW5kZXJzY29yZXMgdXNpbmcgdGhlCgkgICAgbmV3ICVyZW5hbWUgZnVuY3Rpb25hbGl0eS4KCjAxLzEyLzIwMDY6IG1tYXR1cwoJICAgIC0gQWRkIGFsaWFzZXMgZm9yICdjYXNlJyBlbmNvZGVycyB1c2VkIHdpdGggJXJlbmFtZS8lbmFtZXdhcm4KCgkgICAgICAlKHVwcGVyY2FzZSlzICAgaGVsbG9fd29ybGQgLT4gSEVMTE9fV09STEQKCSAgICAgICUobG93ZXJjYXNlKXMgICBIZWxsb1dvcmxkICAtPiBoZWxsb3dvcmxkCgkgICAgICAlKGNhbWVsY2FzZSlzICAgaGVsbG9fd29ybGQgLT4gSGVsbG9Xb3JsZAoJICAgICAgJSh1bmRlcmNhc2UpcyAgIEhlbGxvV29ybGQgIC0+IGhlbGxvX3dvcmxkCgoKMDEvMTIvMjAwNjogbW1hdHVzCgkgICAgLSBBZGQgdGhlIC1kdW1wX3BhcnNlX21vZHVsZSBhbmQgLWR1bXBfcGFyc2VfdG9wIG9wdGlvbnMsCgkgICAgd2hpY2ggYXJlIHNpbWlsYXIgdG8gLWR1bXBfbW9kdWxlIGFuZCAtZHVtcF90b3AsIGJ1dCB0aGV5CgkgICAgZHVtcCB0aGUgbm9kZSB0cmVlcyBqdXN0IGFmdGVyIHBhcnNpbmcsIHNob3dpbmcgb25seSB0aGUgCgkgICAgYXR0cmlidXRlcyB2aXNpYmxlIGF0IHRoZSBwYXJzaW5nIHN0YWdlLCBhbmQgbm90IHRoZSBhZGRlZAoJICAgIGxhdGVyIGluIHR5cGVtYXAuY3h4LCBhbGxvY2F0ZS5jeHgsIGxhbmcuY3h4IG9yIGVsc2V3aGVyZS4KCSAgICAKCSAgICBCZXNpZGVzIGRlYnVnZ2luZyBwb3JwdXNlcywgdGhlc2Ugb3B0aW9ucyBhcmUgdmVyeSB1c2VmdWwKCSAgICBpZiB5b3UgcGxhbiB0byB1c2UgJXJlbmFtZSBpbiBhbiAiYWR2YW5jZSB3YXkiLCBzaW5jZSBpdAoJICAgIHNob3dzIG9ubHkgYW5kIGFsbCB0aGUgbm9kZSdzIGF0dHJpYnV0ZXMgeW91IGNhbiB1c2UKCSAgICBpbnNpZGUgdGhlIG1hdGNoIHJ1bGVzLgoKCjAxLzEyLzIwMDY6IG1tYXR1cwoJICAgIC0gQWRkIHByZWRpY2F0ZXMgdG8gJXJlbmFtZSwgc28sIHlvdSBkb24ndCBuZWVkIHRvCgkgICAgICByZW1lbWJlciwgZm9yIGV4YW1wbGUsIGhvdyB0byBtYXRjaCBhIG1lbWJlciBmdW5jdGlvbi4KCgkgICAgICBOb3cgaXQgaXMgZWFzeSwgZm9yIGV4YW1wbGUgdG8gdXNlIHRoZSAndXRpdGxlJyBlbmNvZGVyIAoJICAgICAgaW4gYWxsIHRoZSBtZW1iZXIgbWV0aG9kcywgeW91IHR5cGU6CgoJICAgICAgICAlcmVuYW1lKCIlKHV0aXRsZSlzIiwlaXNmdW5jdGlvbiwlaXNtZW1iZXIpICIiOwoKCSAgICAgIG9yIHRvIGlnbm9yZSBhbGwgdGhlIGVudW1pdGVtcyBpbiBhIGdpdmVuIGNsYXNzOgoKCSAgICAgICAgJXJlbmFtZSgiJGlnbm9yZSIsICVpc2VudW1pdGVtLCAlY2xhc3NuYW1lPSJNeUNsYXNzIikgIiI7ICAKCgkgICAgICBBdmFpbGFibGUgcHJlZGljYXRlcyBhcmUgKHNlZSBzd2lnLnN3Zyk6CgogICAgICAgICAgICAgICAgJWlzZW51bSAgICAgICAgIAoJCSVpc2VudW1pdGVtICAgICAKCQklaXNhY2Nlc3MgICAgICAgCgkJJWlzY2xhc3MgICAgICAgIAoJCSVpc2V4dGVuZCAgICAgICAKCQklaXNleHRlbmQgICAgICAgCgkJJWlzY29uc3RydWN0b3IgIAoJCSVpc2Rlc3RydWN0b3IgICAKCQklaXNuYW1lc3BhY2UgICAgCgkJJWlzdGVtcGxhdGUgICAgIAoJCSVpc2NvbnN0YW50ICAgICAKCQkJCQkKCQklaXN1bmlvbiAgICAgICAgCgkJJWlzZnVuY3Rpb24gICAgIAoJCSVpc3ZhcmlhYmxlICAgICAKCQklaXNpbW11dGFibGUgICAgCgkJCQkJCgkJJWlzc3RhdGljICAgICAgIAoJCSVpc2ZyaWVuZCAgICAgICAKCQklaXN0eXBlZGVmICAgICAgCgkJJWlzdmlydHVhbCAgICAgIAoJCSVpc2V4cGxpY2l0ICAgICAKCQklaXNleHRlcm4gICAgICAgCgkJCQkJCgkJJWlzbWVtYmVyICAgICAgIAoJCSVpc2dsb2JhbCAKCQklaW5uYW1lc3BhY2UKCgkJJWlzcHVibGljICAgIAoJCSVpc3Byb3RlY3RlZCAKCQklaXNwcml2YXRlICAgCgkJCQkgICAgIAoJCSVjbGFzc25hbWUgICAKCiAgICAgICAgICAgICAgVGhlc2UgcHJlZGljYXRlcyBjb3JyZXNwb25kIHRvIHNwZWNpZmljICdtYXRjaCcKICAgICAgICAgICAgICBkZWNsYXJhdGlvbnMsIHdoaWNoIHNvbWV0aW1lcyBhcmUgbm90IGFzIGV2aWRlbnQgYXMgdGhlCiAgICAgICAgICAgICAgcHJlZGljYXRlcyBuYW1lcy4KCgogICAgICAgICAgICAtIEFkZCB0aGUgb3IgJ3wnIG9wZXJhdGlvbiBpbiAlcmVuYW1lIG1hdGNoLCBmb3IKICAgICAgICAgICAgICBleGFtcGxlIHRvIGNhcGl0YWxpemUgYWxsIHRoZSBjb25zdGFudHMgKCVjb25zdGFudCBvcgogICAgICAgICAgICAgIGNvbnN0IGNkZWNsKToKCiAgICAgICAgICAgICAgICAgJXJlbmFtZSgiJSh1cHBlcilzIixtYXRjaD0iY2RlY2x8Y29uc3RhbnQiLCVpc2ltbXV0YWJsZSkgIiI7CiAgICAgICAgICAgICAgICAKCgowMS8xMi8yMDA2OiBtZ29zc2FnZQoJICAgIC0JUGFydGlhbCBmaXhlZCBvZiBlcnJvcnMgdW5kZXIgQzg5LCBidWcgIzEzNTY1NzQKCSAgICAJKGNvbnZlcnRlZCBDKysgc3R5bGUgY29tbWVudHMgdG8gQyBzdHlsZSkKCSAgICAtCUFkZGVkIHBhdGNoZXMgZnJvbSBuZW9tYW50cmFAdXNlcnMuc2YubmV0ICMxMzc5OTg4IGFuZCAjMTM4ODM0MwoJICAgIAltaXNzaW5nIGEgJ3JldHVybicgc3RhdGVtZW50IGZvciBlcnJvciBjb25kaXRpb25zCgkgICAgCWFsc28gdXBkYXRlZCB0aGUgJWluaXQgYmxvY2sgYnVnICMxMzU2NTg2CgkJIAowMS8xMC8yMDA2OiBtbWF0dXMKCSAgICAtIEFkZCB0aGUgJ3V0aXRsZScgZW5jb2RlciwgYXMgYW4gZXhhbXBsZSBvZiBob3cgdG8gYWRkCgkgICAgICB5b3VyIG93biBlbmNvZGVyLiBJIGFkZGVkIHRoZSBlbmNvZGVyIG1ldGhvZCBpbiBtaXNjLmMgCgkgICAgICBidXQgZGV2ZWxvcGVycyBjYW4gYWRkIG90aGVycywgdGhlIHNhbWUgd2F5LCBpbnNpZGUgYW55CgkgICAgICB0YXJnZXQgbGFuZ3VhZ2UuCgkgICAgICAKCSAgICAgIFdlbGwsICd1dGl0bGUnIGlzIHRoZSByZXZlcnNlIG9mICdjdGl0bGUnLCBpZToKCgkgICAgICAgICAlcmVuYW1lKCIlKGN0aXRsZSlzIikgY2FtZWxfY2FzZTsgIC0+IENhbWVsQ2FzZTsKCSAgICAgICAgICVyZW5hbWUoIiUodXRpdGxlKXMiKSBDYW1lbENhc2U7ICAgLT4gY2FtZWxfY2FzZTsKCQkgCgowMS8xMC8yMDA2OiBjZmlzYXZhZ2UKICAgICAgICAgICAgW1J1YnldCiAgICAgICAgICAgIFVwZGF0ZWQgUnVieSBFeGNlcHRpb24gaGFuZGxpbmcuICBDbGFzc2VzIHRoYXQgYXJlIHNwZWNpZmllZCBpbiB0aHJvd3MgY2xhdXNlcywgCiAgICAgICAgICAgIG9yIGFyZSBtYXJrZWQgYXMgJWV4Y2VwdGlvbmNsYXNzLCBhcmUgbm93IGluaGVyaXRlZCBmcm9tIHJiX2VSdW50aW1lRXJyb3IuIAogICAgICAgICAgICBUaGlzIGFsbG93cyBpbnN0YW5jZXMgb2YgdGhlc2UgY2xhc3NlcyB0byBiZSByZXR1cm5lZCB0byBSdWJ5IGFzIGV4Y2VwdGlvbnMuIAogICAgICAgICAgICBUaHVzIGlmIGEgQysrIG1ldGhvZCB0aHJvd3MgYW4gaW5zdGFuY2Ugb2YgTXlFeGNlcHRpb24sIHRoZSBjYWxsaW5nIFJ1YnkgCiAgICAgICAgICAgIG1ldGhvZCB3aWxsIGdldCBiYWNrIGEgTXlFeGNlcHRpb24gb2JqZWN0LiAgVG8gc2VlIGFuIGV4YW1wbGUsIAogICAgICAgICAgICBsb29rIGF0IHJ1YnkvZXhhbXBsZXMvZXhjZXB0aW9uX2NsYXNzLgoKMDEvMTAvMjAwNjogbW1hdHVzCgkgICAgCiAgICAgICAgICAgIC0gQWRkIHRoZSAlY2F0Y2hlcyBkaXJlY3RpdmUsIHdoaWNoIGNvbXBsZW1lbnRzIHRoZSAlZXhjZXB0aW9uCgkgICAgZGlyZWN0aXZlIGluIGEgbW9yZSBhdXRvbWF0aWMgd2F5LiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUKCiAgICAgICAgICAgICAgICBpbnQgZm9vKCkgdGhyb3coRTEpOwoKICAgICAgICAgICAgc3dpZyBnZW5lcmF0ZXMgdGhlIHByb3BlciB0cnkvY2F0Y2ggY29kZSB0byBkaXNwYXRjaCBFMS4KCSAgICAKCSAgICBCdXQgaWYgeW91IGhhdmU6CgoKCSAgICAgICAgICBpbnQgYmFyZm9vKGludCBpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gMSkgewoJICAgICAgICAgICAgICAgdGhyb3cgRTEoKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICB0aHJvdyBFMigpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWUsIHdoZXJlIHRoZXJlIGlzIG5vIGV4cGxpY2l0IGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIGluIHRoZSBkZWNsLCB5b3UgCgkgICAgZW5kIHVwIGRvaW5nOgoJCSAgCiAgICAgICAgICAgICAgICVleGNlcHRpb24gYmFyZm9vIHsJCQkKCSAgICAgICAgIHRyeSB7CQkJCQoJICAgICAgICAgICAkYWN0aW9uCQkJCgkgICAgICAgICB9IGNhdGNoKEUxKSB7CS4uLiB9CQkJCSAgCgkgICAgICAgICB9IGNhdGNoKEUyKSB7CS4uLiB9CQkJCSAgCgkgICAgICAgfQkJCQkKCSAgICAKCSAgICB3aGljaCBpcyB2ZXJ5IHRlZGlvdXMuIFdlbGwsIHRoZSAlY2F0Y2hlcyBkaXJlY3RpdmUgZGVmaW5lcwoJICAgIHRoZSBsaXN0IG9mIGV4Y2VwdGlvbnMgdG8gY2F0Y2gsIGFuZCBmcm9tIHN3aWc6CiAJCgkgICAgICAgJWNhdGNoZXMoRTEsRTIpIGJhcmZvbyhpbnQgaSk7CgkgICAgICAgaW50IGJhcmZvbyhpbnQgaSk7CgogICAgICAgICAgICBpcyBlcXVpdmFsZW50IHRvIAoKCSAgICAgICBpbnQgYmFyZm9vKGludCBpKSB0aHJvdyhFMSxFMik7CgoJICAgIE5vdGUsIGhvd2V2ZXIsIHRoYXQgdGhlICVjYXRjaGVzIGxpc3QgZG9lc24ndCBoYXZlIHRvCgkgICAgY29ycmVzcG9uZCB0byB0aGUgQysrIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uLiBGb3IgZXhhbXBsZSwgaWYgeW91CgkgICAgaGF2ZToKCgkJc3RydWN0IEUge307CgkJc3RydWN0IEUxIDogRSB7fTsKCQlzdHJ1Y3QgRTIgOiBFIHt9OwoKICAJICAgICAgICBpbnQgYmFyZm9vKGludCBpKSB0aHJvdyhFMSxFMik7CgogICAgICAgICAgICB5b3UgY2FuIGRlZmluZQoJICAgICAgICAKCQklY2F0Y2hlcyhFKSBiYXJmb28oaW50IGkpOwoJCgkgICAgYW5kIHN3aWcgd2lsbCBnZW5lcmF0ZSBhbiBhY3Rpb24gY29kZSBlcXVpdmFsZW50IHRvCgoJICAgICAgICAgdHJ5IHsJCQkJCgkgICAgICAgICAgICRhY3Rpb24JCQkKCSAgICAgICAgIH0gY2F0Y2goRSAmX2UpIHsgCgkJICAgPHJhaXNlIF9lPjsKCQkgfQkKCiAgICAgICAgICAgIE9mIGNvdXJzZSwgeW91IHN0aWxsIGhhdmUgdG8gc2F0aXNmeSB0aGUgQysrIHJlc3RyaWN0aW9ucywKCSAgICBhbmQgdGhlIGNhdGNoZXMgbGlzdCBtdXN0IGJlIGNvbXBhdGlibGUgKG5vdCB0aGUgc2FtZSkKCSAgICBhcyB0aGUgb3JpZ2luYWwgbGlzdCBvZiB0eXBlcyBpbiB0aGUgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24uCgoJICAgIEFsc28sIHlvdSBjYW4gbm93IHNwZWNpZnkgdGhhdCB5b3Ugd2FudCB0byBjYXRjaCB0aGUKCSAgICB1bmtub3duIGV4Y2VwdGlvbiAnLi4uJywgZm9yIGV4YW1wbGU6CgoJICAgICAgICVjYXRjaGVzKEUxLEUyLC4uLikgYmFyZm9vKGludCk7CgoJICAgIEluIGFueSBjYXNlLCB0aGUgJWNhdGNoZXMgZGlyZWN0aXZlIHdpbGwgZW1pdCB0aGUKCSAgICBjb2RlIHRvIGNvbnZlcnQgaW50byB0aGUgdGFyZ2V0IGxhbmd1YWdlIGVycm9yL2V4Y2VwdGlvbgogICAgICAgICAgICB1c2luZyB0aGUgJ3Rocm93cycgdHlwZW1hcC4KCgkgICAgRm9yIHRoZSAnLi4uJyBjYXNlIHRvIHdvcmssIHlvdSBuZWVkIHRvCgkgICAgd3JpdGUgdGhlIHByb3BlciB0eXBlbWFwIGluIHlvdXIgdGFyZ2V0IGxhbmd1YWdlLiBJbiB0aGUKCSAgICBVVEwsIHRoaXMgbG9va3MgbGlrZToKCgkgICAgICAldHlwZW1hcCh0aHJvd3MpICguLi4pIHsKCSAgICAgICAgU1dJR19leGNlcHRpb24oU1dJR19SdW50aW1lRXJyb3IsInVua25vd24gZXhjZXB0aW9uIik7CiAgICAgICAgICAgICAgfQoKMDEvMDkvMjAwNjogbXV0YW5kaXoKCSAgICBbQWxsZWdyb2NsXQoKICAgICAgICAgICAgRml4ZXMgYSBudW1iZXIgb2YgU0VHVnMgcHJpbWFyaWx5IGluIHRoZSBoYW5kbGluZyBvZgogICAgICAgICAgICB2YXJpb3VzIGFub255bW91cyB0eXBlcy4gRm91bmQgaW4gYSBwYXNzIHRocm91Z2ggdGhlCiAgICAgICAgICAgIHN3aWcgdGVzdC1zdWl0ZS4gU3RpbGwgbW9yZSB0byBkbyBoZXJlLCBidXQgdGhpcyBpcyBhCiAgICAgICAgICAgIGdvb2QgY2hlY2twb2ludC4KCiAgICAgICAgICAgIEFkZHMgLWN3cmFwIGFuZCAtbm9jd3JhcCBhcyBhbiBhbGxlZ3JvY2wgc3BlY2lmaWMKICAgICAgICAgICAgY29tbWFuZC1saW5lIGFyZ3VtZW50LiBDb250cm9scyBnZW5lcmF0aW5nIG9mIGEgQwogICAgICAgICAgICB3cmFwcGVyIGZpbGUgd2hlbiB3cmFwcGluZyBDIGNvZGUuIEJ5IGRlZmF1bHQgb25seSBhCiAgICAgICAgICAgIGxpc3AgZmlsZSBpcyBjcmVhdGVkIGZvciBDIGNvZGUgd3JhcHBpbmcuCgogICAgICAgICAgICBEb2MgdXBkYXRlcyBmb3IgdGhlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgYW5kIGZpeGVzIGFzCiAgICAgICAgICAgIHBvaW50ZWQgb3V0IG9uIHN3aWctZGV2ZWwKCjAxLzA1LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggdW5zaWduZWQgbG9uZyBsb25nIGFuZCBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgJiB0eXBlbWFwcwogICAgICAgICAgICAtIEJ1ZyAjMTM5ODM5NCAgd2l0aCBwYXRjaCBmcm9tIERyaWVzIERlY29jawoKMDEvMDYvMjAwNjogbW1hdHVzCgkgICAgQWRkICduYW1lZCcgd2FybmluZyBjb2Rlcywgbm93IGluIGFkZGl0aW9uIHRvOgoJICAgIAoJICAgICAgJXdhcm5maWx0ZXIoODEzKTsKCSAgIAoJICAgIHlvdSBjYW4gdXNlCgoJICAgICAgJXdhcm5maWx0ZXIoU1dJR1dBUk5fSkFWQV9NVUxUSVBMRV9JTkhFUklUQU5DRSk7CgoJICAgIGp1c3QgdXNlIHRoZSBzYW1lIGNvZGUgbmFtZSBmb3VuZCBpbiAgU291cmNlL0luY2x1ZGUvc3dpZ3dhcm4uaCAKCSAgICBwbHVzIHRoZSAnU1dJRycgcHJlZml4LgoKCSAgICBJZiBhIGRldmVsb3BlciBhZGRzIGEgbmV3IHdhcm5pbmcgY29kZSwgdGhlIExpYi9zd2lnd2Fybi5zd2cgZmlsZQogICAgICAgICAgICB3aWxsIGJlIGdlbmVyYXRlZCB3aGVuIHJ1bm5pbmcgdGhlIHRvcCBsZXZlbCBtYWtlLgoKMDEvMDUvMjAwNjogY2Zpc2F2YWdlCiAgICAgICAgICAgIFtSdWJ5XQoJICAgIFJlaW1wbGVtZW50ZWQgb2JqZWN0IHRyYWNraW5nIGZvciBSdWJ5LiAgVGhlIG5ldyBpbXBsZW1lbnRhdGlvbiB3b3JrcwoJICAgIGJ5IGV4cGFuZGluZyB0aGUgc3dpZ19jbGFzcyBzdHJ1Y3R1cmUgZm9yIFJ1YnkgYnkgYWRkaW5nIGEgdHJhY2tPYmplY3RzCgkgICAgZmllbGQuICBUaGlzIGZpZWxkIGNhbiBiZSBzZXQvdW5zZXQgdmlhICV0cmFja29iamVjdHMgYXMgZXhwbGFpbmVkCgkgICAgaW4gdGhlIFJ1YnkgZG9jdW1lbnRhdGlvbi4gIFRoZSBuZXcgaW1wbGVtZW50YXRpb24gaXMgbW9yZSByb2J1c3QKCSAgICBhbmQgdGFrZXMgbGVzcyBjb2RlIHRvIGltcGxlbWVudC4KCQkKMDEvMDUvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IGZvciAlZXh0ZW5kIGFuZCBzdGF0aWMgY29uc3QgaW50ZWdyYWwgdHlwZXMsIGVnOgoKICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgJWV4dGVuZCB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludCBiYXIgPSA0MjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9OyAKCjEyLzMwLzIwMDU6IG1tYXR1cwoKCSAgLSBBZGQgaW5mbyBmb3Igb2xkIGFuZCBuZXcgZGVidWcgb3B0aW9uczoKICAgICAgICAgICAgICAKICAgICAgICAgICAgLWR1bXBfdG9wICAgICAgIC0gUHJpbnQgaW5mb3JtYXRpb24gb2YgdGhlIGVudGlyZSBub2RlIHRyZWUsIGluY2x1ZGluZyBzeXN0ZW0gbm9kZXMgICAgCiAgICAgCSAgICAtZHVtcF9tb2R1bGUgICAgLSBQcmludCBpbmZvcm1hdGlvbiBvZiB0aGUgbW9kdWxlIG5vZGUgdHJlZSwgYXZvaWRpbmcgc3lzdGVtIG5vZGVzICAgICAKICAgICAJICAgIC1kdW1wX2NsYXNzZXMgICAtIFByaW50IGluZm9ybWF0aW9uIGFib3V0IHRoZSBjbGFzc2VzIGZvdW5kIGluIHRoZSBpbnRlcmZhY2UJICAgICAgIAogICAgIAkgICAgLWR1bXBfdHlwZWRlZiAgIC0gUHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGVzIGFuZCB0eXBlZGVmcyBmb3VuZCBpbiB0aGUgaW50ZXJmYWNlCiAgICAgCSAgICAtZHVtcF90YWdzICAgICAgLSBQcmludCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGFncyBmb3VuZCBpbiB0aGUgaW50ZXJmYWNlCSAgICAgICAKICAgICAJICAgIC1kZWJ1Z190eXBlbWFwICAtIFByaW50IGluZm9ybWF0aW9uIGZvciBkZWJ1Z2dpbmcgdHlwZW1hcHMJCQkgICAgICAgCiAgICAgICAgICAgIC1kZWJ1Z190ZW1wbGF0ZSAtIFByaW50IGluZm9ybWF0aW9uIGZvciBkZWJ1Z2dpbmcgdGVtcGxhdGVzCQkJICAgICAgICAKCgkgIC0gQWRkIHRoZSBmYWtldmVyc2lvbi4gSWYgeW91IGhhdmUgYSBwcm9qZWN0IHRoYXQgdXNlcwogICAgICAgICAgICBjb25maWd1cmUvc2V0dXAucHksIG9yIGFub3RoZXIgYXV0b21hdGljIGJ1aWxkaW5nIHN5c3RlbQogICAgICAgICAgICBhbmQgcmVxdWlyZXMgYSBzcGVjaWZpYyBzd2lnIHZlcnNpb24sIGxldCBzYXkgMS4zLjIyIAoJICAgIHlvdSBjYW4gdXNlOgoKCSAgICAgICBTV0lHX0ZFQVRVUkVTPSItZmFrZXZlcnNpb24gMS4zLjIyIgoKCSAgICAgb3IKIAogICAgICAgICAgICAgICBzd2lnIC1mYWtldmVyc2lvbiAxLjMuMjIKCiAgICAgICAgICAgICBhbmQgdGhlbiBzd2lnIC12ZXJzaW9uIHdpbGwgcmVwb3J0IDEuMy4yMiBpbnN0ZWFkIG9mIHRoZQogICAgICAgICAgICAgY3VycmVudCB2ZXJzaW9uLgoKCSAgICAgVHlwaWNhbCB1c2Ugd291bGQgYmUKCgkgICAgICAgU1dJR19GRUFUVVJFUz0iLWZha2V2ZXJzaW9uIDEuMy4yMiIgLi9jb25maWd1cmUgCSAgICAgCgoxMi8zMC8yMDA1OiBtbWF0dXMKCgkgIC0gQWRkIG9wdGlvbi9mb3JtYXQgc3VwcG9ydCB0byAlcmVuYW1lIGFuZCAlbmFtZXdhcm4uCQoJICAgIE5vdyAlbmFtZXdhcm4gY2FuIGZvcmNlIHJlbmFtaW5nLCBmb3IgZXhhbXBsZToKCgkgICAgICAlbmFtZXdhcm4oIjMxNDogaW1wb3J0IGlzIGEga2V5d29yZCIscmVuYW1lPSJfJXMiKSAiaW1wb3J0IjsKCSAgICAKCSAgICBhbmQgcmVuYW1lIGNhbiBhbHNvIHN1cHBvcnQgZm9ybWF0IGZvcm1zOgoKCSAgICAgICAlcmVuYW1lKCJzd2lnXyVzIikgaW1wb3J0OwoKCSAgICBOb3csIHNpbmNlIHRoZSBmb3JtYXQgaXMgcHJvY2Vzc2VkIHZpYSBzd2lnIFByaW50ZiwgeW91CgkgICAgY2FuIHVzZSBlbmNvZGVycyBhcyBmb2xsb3dzOgoKCSAgICAgICAlcmVuYW1lKCIlKHRpdGxlKXMiKSAgaW1wb3J0OyAgICAgLT4gSW1wb3J0CgkgICAgICAgJXJlbmFtZSgiJSh1cHBlcilzIikgIGltcG9ydDsgICAgIC0+IElNUE9SVAoJICAgICAgICVyZW5hbWUoIiUobG93ZXIpcyIpICBJbXBvcnQ7ICAgICAtPiBpbXBvcnQKCSAgICAgICAlcmVuYW1lKCIlKGN0aXRsZSlzIikgY2FtZWxfY2FzZTsgLT4gQ2FtZWxDYXNlCgkgICAgICAgCgkgICAgVGhpcyB3aWxsIGFsbG93IHVzIHRvIGFkZCBtb3JlIGVuY29kZXJzLCBhcyB0aGUgCgkgICAgZXhwZWN0ZWQgb25lIGZvciByZWd1bGFyIGV4cHJlc3Npb25zLiAKCgkgIC0gQWRkIHRoZSBhYm92ZSAnY3RpdGxlJyBlbmNvZGVyLCB3aGljaCBkb2VzIHRoZSBjYW1lbCBjYXNlOgoKCSAgICAgICAgY2FtZWxfY2FzZSAtPiBDYW1lbENhc2UKICAKCSAgLSBBbHNvLCB3aGlsZSB3ZSBnZXQgdGhlIHJlZ2V4cCBzdXBwb3J0LCBhZGQgdGhlICdjb21tYW5kJyBlbmNvZGVyLAogICAgICAgICAgICB5b3UgY2FuIHVzZSBpdCBhcyBmb2xsb3dzCgogICAgICAgICAgICAgICAlcmVuYW1lKCIlKGNvbW1hbmQ6c2VkIC1lICdzL1woW2Etel1cKS9cVVxcMS8nIDw8PCApcyIpIGltcG9ydDsgCgoJICAgIHRoZW4gc3dpZyB3aWxsIHBvcGVuIHRoZSBjb21tYW5kCgkgICAgCgkJInNlZCAtZSAncy9cKFthLXpdXCkvXFVcXDEvJyA8PDwgaW1wb3J0IgoJCQogICAgICAgICAgICBzZWUgYmVsb3cgZm9yIGFub255bW91cyByZW5hbWVzIGZvciBiZXR0ZXIgZXhhbXBsZXMuCQkKCiAgICAgICAgICAtIFRoZSByZW5hbWUgZGlyZWN0aXZlIG5vdyBhbHNvIGFsbG93czoKCgkgICAgLSBzaW1wbGUgbWF0Y2g6IG9ubHkgYXBwbHkgdGhlIHJlbmFtZSBpZiBhIHR5cGUgbWF0Y2gKCSAgICAgIGhhcHBlbiwgZm9yIGV4YW1wbGUKCgkJICVyZW5hbWUoJSh0aXRsZSlzLG1hdGNoPSJlbnVtaXRlbSIpIGhlbGxvOwoKCQkgZW51bSBIZWxsbyB7CgkJICAgaGksIGhlbGxvICAtPiAgaGksIEhlbGxvICAKCQkgfTsKCQkgaW50IGhlbGxvKCkgIC0+ICBoZWxsbzsgCgoJICAgIC0gZXh0ZW5kZWQgbWF0Y2g6IG9ubHkgYXBwbHkgdGhlIHJlbmFtZSBpZiB0aGUgJ2V4dGVuZGVkIGF0dHJpYnV0ZScgbWF0Y2gKCSAgICAgIG9jY3VycmVkLCBmb3IgZXhhbXBsZTogCgoJICAgICAgICAgLy8gc2FtZSBhcyBzaW1wbGUgbWF0Y2ggCQkKCQkgJXJlbmFtZSglKHRpdGxlKXMsbWF0Y2gkbm9kZVR5cGU9ImVudW1pdGVtIikgaGVsbG87IAoKCQkgZW51bSBIZWxsbyB7CgkJICAgaGksIGhlbGxvICAtPiAgaGksIEhlbGxvICAKCQkgfTsKCgkgICAgICAgTm90ZSB0aGF0IHRoZSBzeW1ib2wgJyQnIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBhdHRyaWJ1dGUgbmFtZSBpbgoJICAgICAgIGEgJ3JlY3Vyc2l2ZScgd2F5LCBmb3IgZXhhbXBsZToKCgkJIC8vIG1hdGNoIG9ubHkgaGVsbG8gaW4gJ2VudW0gSGVsbG8nCgkJICVyZW5hbWUoJSh0aXRsZSlzLG1hdGNoJHBhcmVudE5vZGUkdHlwZT0iZW51bSBIZWxsbyIpIGhlbGxvOyAKCgkJIGVudW0gSGVsbG8gewogCQkgICBoaSwgaGVsbG8gIC0+ICBoaSwgSGVsbG8gICAvLyBtYXRjaAoJCSB9OwoKCQkgZW51bSBIaSB7CiAJCSAgIGhpLCBoZWxsbyAgLT4gIGhpLCBoZWxsbyAgIC8vIG5vIG1hdGNoCgkJIH07CgogICAgICAgICAgICAgICBoZXJlLCBmb3IgSGVsbG86OmhpLCB0aGUgInBhcmVudE5vZGUiIGlzICJIZWxsbyIsIGFuZCBpdHMgInR5cGUiCiAgICAgICAgICAgICAgIGlzICJlbnVtIEhlbGxvIi4KCSAgICAgICAKCSAgICAgICAKICAgICAgICAgICAgLSBBbm9ueW1vdXMgcmVuYW1lczogeW91IGNhbiB1c2UgJ2Fub255bW91cycgcmVuYW1lIGRpcmVjdGl2ZXMsIGZvciBleGFtcGxlOiAKCgkgICAgICAgICAvLyByZW5hbWUgYWxsIHRoZSBlbnVtIGl0ZW1zIGluIEhlbGxvCgkJICVyZW5hbWUoJSh0aXRsZSlzLG1hdGNoJHBhcmVudE5vZGUkdHlwZT0iZW51bSBIZWxsbyIpICIiOyAKCgkJIGVudW0gSGVsbG8gewogCQkgICBoaSwgaGVsbG8gIC0+ICBIaSwgSGVsbG8gICAvLyBtYXRjaCBib3RoCgkJIH07CgoJCSBlbnVtIEhpIHsKIAkJICAgaGksIGhlbGxvICAtPiAgaGksIGhlbGxvICAgLy8gbm8gbWF0Y2gKCQkgfTsKCQkgCgkgICAgICAgICAvLyByZW5hbWUgYWxsIHRoZSBlbnVtIGl0ZW1zIAoJCSAlcmVuYW1lKCUodGl0bGUpcyxtYXRjaCRub2RlVHlwZT0iZW51bWl0ZW0iKSAiIjsgCgoJICAgICAgICAgLy8gcmVuYW1lIGFsbCB0aGUgaXRlbXMgaW4gZ2l2ZW4gY29tbWFuZCAoc2xvb29vdywgYnV0Li4uKQoJCSAlcmVuYW1lKCUoY29tbWFuZDo8bXkgZXh0ZXJuYWwgY21kPilzKSAiIjsgCgoJCgkgICAgICBBbm9ueW1vdXMgcmVuYW1lcyB3aXRoIGNvbW1hbmRzIGNhbiBiZSB2ZXJ5IHBvd2VyZnVsLCBzaW5jZSB5b3UKCSAgICAgIGNhbiAnb3V0c291cmNlJyBhbGwgdGhlIHJlbmFtaW5nIG1lY2hhbmlzbSAob3IgcGFydCBvZiBpdCkgdG8gYW4KCSAgICAgIGV4dGVybmFsIHByb2dyYW06CgkgICAgICAKCSAgICAgICAgLy8gVXBwZXJjYXNlIGFsbCAoYW5kIG9ubHkpIHRoZSBuYW1lcyB0aGF0IHN0YXJ0IHdpdGggJ2knCgkgICAgICAgICVyZW5hbWUoIiUoY29tbWFuZDphd2sgJy9eaS97cHJpbnQgdG91cHBlcigkMSl9JyA8PDwpcyIpICIiOyAgIAoJICAgICAgIAoJICAgICAgICBpbnQgaW1wb3J0ZWQoKSAtPiBJTVBPUlRFRDsKCSAgICAgICAgaW50IGhlbGxvKCkgICAgLT4gaGVsbG8KCgkgICAgICBOb3RlIHRoYXQgaWYgdGhlICdjb21tYW5kJyBlbmNvZGVyIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLCBzd2lnCgkgICAgICB1bmRlcnN0YW5kcyB0aGF0IG5vIHJlbmFtZSBpcyBuZWNlc3NhcnkuCgoJICAgICAgQWxzbyBub3RlIHRoYXQgJXJlbmFtZSAncGFzc2VzJyB0aGUgbWF0Y2hlZCBuYW1lLiBGb3IgZXhhbXBsZSwgaW4KCSAgICAgIHRoaXMgY2FzZQoKCSAgICAgICAgbmFtZXNwYWNlIG5zMSB7CgkJICBpbnQgZm9vKCk7CgkJfQoKCSAgICAgICAgbmFtZXNwYWNlIG5zMiB7CgkJICBpbnQgYmFyKCk7CgkJfQoKCSAgICAgIHRoZSBleHRlcm5hbCBwcm9ncmFtIG9ubHkgcmVjZWl2ZXMgImZvbyIgYW5kICJiYXIiLiBJZiBuZWVkZWQsCgkgICAgICBob3dldmVyLCB5b3UgY2FuIHJlcXVlc3QgdGhlICdmdWxsbmFtZScgCgkgICAgICAgCQoJICAgICAgICAlcmVuYW1lKCIlKGNvbW1hbmQ6YXdrICdhd2sgJy9uczE6Oi97bD1zcGxpdCgkMSxhLCI6OiIpOyBwcmludCB0b3VwcGVyKGFbbF0pfScnIDw8PClzIixmdWxsbmFtZT0xKSAiIjsgICAKICAgICAgICAgICAgICAgIAoJCW5zMTo6Zm9vIC0+IEZPTwoJCW5zMjo6YmFyIC0+IGJhcgkKCQoJICAgIC0gTWl4aW5nIGVuY29kZXJzIGFuZCBtYXRjaGluZzogb2YgY291cnNlLCB5b3UgY2FuIGRvIG1peCBjb21tYW5kcwoJICAgICAgYW5kIG1hdGNoIGZpZWxkcywgZm9yIGV4YW1wbGU6CgoJICAgICAgICAlcmVuYW1lKCIlKDxteSBlbmNvZGVyIGZvciBmbmNzPikiLG1hdGNoPSJjZGVjbCIpICIiOwoJICAgICAgICAlcmVuYW1lKCIlKDxteSBlbmNvZGVyIGZvciBlbnVtcz4pIixtYXRjaD0iZW51bWl0ZW0iKSAiIjsKCSAgICAgICAgJXJlbmFtZSgiJSg8bXkgZW5jb2RlciBmb3IgZW51bXMgaW5zaWRlIGEgY2xhc3M+KSIsbWF0Y2g9ImVudW1pdGVtIiwKCQkgICAgICAgIG1hdGNoJHBhcmVudE5vZGUkcGFyZW50Tm9kZSRub2RlVHlwZT0iY2xhc3MiKSAiIjsKCQkKCSAgICAgIFVzZSAic3dpZyAtZHVtcF9wYXJzZV9tb2R1bGUiIHRvIHNlZSB0aGUgYXR0cmlidXRlIG5hbWVzIHlvdSBjYW4gdXNlIHRvCgkgICAgICBtYXRjaCBhIHNwZWNpZmljIGNhc2UuCgkKICAgICAgICAgICAgLSAnc291cmNlZm10JyBhbmQgJ3RhcmdldGZtdCc6IHNvbWV0aW1lcyB5b3UgbmVlZCB0bwogICAgICAgICAgICAgIHByb2Nlc3MgdGhlICdzb3VyY2UnIG5hbWUgYmVmb3JlIGNvbXBhcmluZywgZm9yIGV4YW1wbGUKCgkgICAgICAgICVuYW1ld2FybigiMzE0OiBlbXB0eSBpcyBhIGtleXdvcmQiLHNvdXJjZWZtdD0iJShsb3dlcilzIikgImVtcHR5IjsKCgkgICAgICB0aGVuIGlmIHlvdSBoYXZlCgoJICAgICAgICBpbnQgRW1wdHkoKTsgIC8vICJFbXB0eSIgaXMgdGhlIHNvdXJjZSAKCQkKCSAgICAgIHlvdSB3aWxsIGdldCB0aGUga2V5d29yZCB3YXJuaW5nIHNpbmNlICdFbXB0eScgd2lsbCBiZQoJICAgICAgbG93ZXIgY2FzZWQsIHZpYSB0aGUgc291cmNlZm10PSIlKGxvd2VyKXMiIG9wdGlvbiwKCSAgICAgIGJlZm9yZSBiZWVuIGNvbXBhcmVkIHRvIHRoZSAndGFyZ2V0JyAiZW1wdHkiLgoKCSAgICAgIFRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgJ3RhcmdldGZtdCcgb3B0aW9uIHRvIHByb2Nlc3MgdGhlCgkgICAgICAndGFyZ2V0JyBiZWZvcmUgY29tcGFyaW5nLgoKCSAgICAtIGNvbXBsZW1lbnRpbmcgJ21hdGNoJzogeW91IGNhbiB1c2UgJ25vdG1hdGNoJywgZm9yIGV4YW1wbGUKCSAgICAgIAoJICAgICAgICAlbmFtZXdhcm4oIjMxNDogZW1wdHkgaXMgYSBrZXl3b3JkIixzb3VyY2VmbXQ9IiUobG93ZXIpcyIsbm90bWF0Y2g9Im5hbWVzcGFjZSIpICJlbXB0eSI7CgoJICAgICAgaGVyZSwgdGhlIG5hbWUgd2FybmluZyB3aWxsIGJlIGFwcGxpZWQgdG8gYWxsIHRoZSBzeW1ib2xzIGV4Y2VwdCBuYW1lc3BhY2VzLgoJICAgIAogICAgICAJCjEyLzMwLzIwMDU6IG1tYXR1cwoKCSAgLSBBZGQgaW5pdGlhbCBzdXBwb3J0IGZvciBnY2ogYW5kIEphdmEgLT4gPHRhcmdldCBsYW5ndWFnZT4gbWVjaGFuaXNtLgoKCSAgICBTZWUJZXhhbXBsZXMgaW46ICAKCSAgCgkJRXhhbXBsZXMvcHl0aG9uL2phdmEKCQlFeGFtcGxlcy9ydWJ5L2phdmEKCQlFeGFtcGxlcy90Y2wvamF2YQoKICAgICAgICAgICAgdG8gc2VlIGhvdyB0byB1c2UgZ2NqK3N3aWcgdG8gZXhwb3J0IGphdmEgY2xhc3NlcyBpbnRvCiAgICAgICAgICAgIHB5dGhvbi9ydWJ5L3RjbC4KCSAgICAKCSAgICBUaGUgaWRlYSBpcyB0byBwdXQgYWxsIHRoZSBjb21tb24gY29kZSBmb3IgZ2NqIGluc2lkZQoKCSAgICAgICAgICBMaWIvZ2NqCgogICAgICAgICAgICBhbmQgbG9jYWxpemUgc3BlY2lmaWMgdHlwZXMgc3VjaCBhcyBqc3RyaW5nLCBhcyBjYW4gYmUgZm91bmQKICAgICAgICAgICAgaW4KCgkgICAgICAgICBMaWIvcHl0aG9uL2pzdHJpbmcuaQoJICAgICAgICAgTGliL3J1YnkvanN0cmluZy5pCgkgICAgICAgICBMaWIvdGNsL2pzdHJpbmcuaQoKICAgICAgICAgICAgVXNpbmcgdGhlIFVUTCwgdGhpcyBpcyB2ZXJ5IGVhc3ksIGFuZCB0aGUgcGVybCB2ZXJzaW9uIGZvcgogICAgICAgICAgICBqc3RyaW5nLmkgd2lsbCBiZSBuZXh0LgoJCSAJICAgIAoKMTIvMjkvMjAwNTogbW1hdHVzCgkgIC0gQWRkIHRoZSBjb3B5Y3RvciBmZWF0dXJlL2RpcmVjdGl2ZS9vcHRpb24gdG8gZW5hYmxlIHRoZSBhdXRvbWF0aWMKCSAgICBnZW5lcmF0aW9uIG9mIGNvcHkgY29uc3RydWN0b3JzLiBVc2UgYXMgaW46CgoJICAgICAgJWNvcHljdG9yIEE7CgoJICAgICAgc3RydWN0IEEgewoKICAgICAgICAgICAgICB9OwoKCSAgICB0aGVuIHRoaXMgd2lsbCB3b3JrCgoJICAgICAgYTEgPSBBKCk7CgkgICAgICBhMiA9IEEoYTEpOwoKCSAgICBBbHNvLCBzaW5jZSBpdCBpcyBhIGZlYXR1cmUsIGlmIHlvdSBqdXN0IHR5cGUKCgkgICAgICAlY29weWN0b3I7CgoJICAgIHRoYXQgd2lsbCAgZW5hYmxlIHRoZSBhdXRvbWF0aWMgZ2VuZXJhdGlvbiBmb3IgYWxsIHRoZQoJICAgIGNsYXNzZXMuIEl0IGlzIGFsc28gZXF1aXZhbGVudCB0bwoKCSAgICAgICBzd2lnIC1jb3B5Y3RvciAtYysrIC4uLgoKCSAgICBOb3RlczogCgoJICAgIDEuLSBUaGUgZmVhdHVyZSBvbmx5IHdvcmtzIGluIEMrKyBtb2RlLgoKCSAgICAyLi0gVGhlIGF1dG9tYXRpYyBjcmVhdGlvbiBvZiB0aGUgY29weSBjb25zdHJ1Y3RvciB3aWxsCgkgICAgICAgIHVzdWFsbHkgcHJvZHVjZSBvdmVybG9hZGluZy4gSGVuY2UsIGlmIHRoZSB0YXJnZXQKCSAgICAgICAgbGFuZ3VhZ2UgZG9lc24ndCBzdXBwb3J0IG92ZXJsb2FkaW5nLCBhIHNwZWNpYWwgbmFtZQoJICAgICAgICB3aWxsIGJlIHVzZWQgKEFfY29weSkuCgkgICAgCgkgICAgMy4tIEZvciB0aGUgb3ZlcmxvYWRpbmcgcmVhc29ucyBhYm92ZSwgaXQgaXMgcHJvYmFibHkgbm90CiAgICAgICAgICAgICAgICBhIGdvb2QgaWRlYSB0byB1c2UgdGhlIGZsYWcgd2hlbiwgZm9yIGV4YW1wbGUsIHlvdSBhcmUKCQl1c2luZyBrZXl3b3JkcyBpbiBQeXRob24uCgogICAgICAgICAgICA0Li0gVGhlIGNvcHljdG9yIGF1dG9tYXRpYyBtZWNoYW5pc20gZm9sbG93cyBtb3JlIG9yIGxlc3MKCSAgICAgICAgdGhlIHNhbWUgcnVsZXMgYXMgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IgbWVjaGFuaXNtLAoJICAgICAgICBpLmUuLCBhIGNvcHkgY29uc3RydWN0b3Igd2lsbCBub3QgYmUgYWRkZWQgaWYgdGhlCgkgICAgICAgIGNsYXNzIGlzIGFic3RyYWN0IG9yIGlmIHRoZXJlIGlzIGEgcGVydGluZW50IG5vbi1wdWJsaWMgCgkJY29weSBjdG9yIGluIHRoZSBjbGFzcyBvciBpdHMgaGllcmFyY2h5LgoKCQlIZW5jZSwgaXQgbWlnaHQgYmUgbmVjZXNzYXJ5IGZvciB5b3UgdG8gY29tcGxldGUgdGhlCgkJY2xhc3MgZGVjbGFyYXRpb24gd2l0aCB0aGUgcHJvcGVyIG5vbi1wdWJsaWMgY29weSBjdG9yCgkJdG8gYXZvaWQgYSB3cm9uZyBjb25zdHJ1Y3RvciBhZGRpdGlvbi4KCQkKICAgICAgICAgIC0gRml4IGZlYXR1cmVzL3JlbmFtZSBmb3IgdGVtcGxhdGVzIGN0b3IvZHRvciBhbmQgb3RoZXIKICAgICAgICAgICAgdGhpbmdzIGFyb3VuZCB3aGlsZSBhZGRpbmcgdGhlIGNvcHljdG9yIG1lY2hhbmlzbS4KCSAgICAKCjEyLzI3LzIwMDU6IG1tYXR1cwoJICAtIEFkZCB0aGUgJ21hdGNoJyBvcHRpb24gdG8gdHlwZW1hcHMuIEFzc3VtZSB5b3UgaGF2ZToKCgkgICAgICAldHlwZW1hcChpbikgU1dJR1RZUEUgKiAoaW50IHJlcykgey4ufQoJICAgICAgJXR5cGVtYXAoZnJlZWFyZykgU1dJR1RZUEUgKiB7IGlmIChyZXMkYXJnbnVtKSAuLi59CgoJICAgIHRoZW4gaWYgeW91IGRvCiAKCSAgICAgICV0eXBlbWFwKGluKSBBICogey4uLn0KCgkgICAgc3dpZyB3aWxsICdvdmVybG9hZCB0aGUgJ2luJyB0eXBlbWFwLCBidXQgdGhlICdmcmVlYXJnJyAKCSAgICB0eXBlbWFwIHdpbGwgYmUgYWxzbyBhcHBsaWVkLCBldmVuIHdoZW4gdGhpcyBpcyB3cm9uZy4gVGhlIG9sZAoJICAgIHNvbHV0aW9ucyBpcyB0byB3cml0ZToKCgkgICAgICAldHlwZW1hcChpbikgQSAqIHsuLi59CiAgCSAgICAgICV0eXBlbWFwKGZyZWVhZykgQSAqICIiOwoKCSAgICBvdmVybG9hZCAnZnJlZWFyZycgd2l0aCBhbiBlbXB0eSBkZWZpbml0aW9uLgoKCSAgICBUaGUgcHJvYmxlbSBpcywgaG93ZXZlciwgdGhlcmUgaXMgbm8gd2F5IHRvIGtub3cgeW91IG5lZWQKCSAgICB0byBkbyB0aGF0IHVudGlsIHlvdSBzdGFydCBnZXR0aW5nIGJyb2tlbiBDKysgY29kZSwgb3IKCSAgICB3b3JzZSwgYnJva2VuIHJ1bnRpbWUgY29kZS4KCgkgICAgVGhlIHNhbWUgYXBwbGllcyB0byB0aGUgaW5mYW1vdXMgJ3R5cGVjaGVjaycgdHlwZW1hcCwKCSAgICB3aGljaCBhbHdheXMgY29uZnVzZXMgcGVvcGxlLCBzaW5jZSB0aGUgZmlyc3QgdGhpbmcgeW91IGRvCgkgICAgaXMgdG8ganVzdCB3cml0ZSB0aGUgJ2luJyB0eXBlbWFwLgoKCSAgICBUaGUgJ21hdGNoJyBvcHRpb24gc29sdmVzIHRoZSBwcm9ibGVtLCBhbmQgaWYgaW5zdGVhZCB5b3Ugd3JpdGU6CgoJICAgICAgJXR5cGVtYXAoaW4pIFNXSUdUWVBFICogKGludCByZXMpIHsuLn0KCSAgICAgICV0eXBlbWFwKGZyZWVhcmcsbWF0Y2g9ImluIikgU1dJR1RZUEUgKiB7IGlmIChyZXMkYXJnbnVtKSAuLi59CgkgICAgICAldHlwZW1hcCh0eXBlY2hlY2ssbWF0Y2g9ImluIixwcmVjZWRlbmNlLi4uKSBTV0lHVFlQRSAqIHsuLi59CgkgICAgCgkgICAgaXQgd2lsbCB0ZWxsIHN3aWcgdG8gYXBwbHkgdGhlICdmcmVlYXJnL3R5cGVjaGVjaycKCSAgICB0eXBlbWFwcyBvbmx5IGlmIHRoZXkgJ21hdGNoJyB0aGUgdHlwZSBvZiB0aGUgJ2luJwoJICAgIHR5cGVtYXAuIFRoZSBzYW1lIGNhbiBiZSBkb25lIHdpdGggb3RoZXIgdHlwZW1hcHMgYXM6CgoJICAgICAgJXR5cGVtYXAoZGlyZWN0b3JvdXQpIFNXSUdUWVBFICogey4uLn0KCSAgICAgICV0eXBlbWFwKGRpcmVjdG9yZnJlZSxtYXRjaD0iZGlyZWN0b3JvdXQiKSBTV0lHVFlQRSAqIHsuLi59CgkgICAgCgoxMi8yNy8yMDA1OiBtbWF0dXMKCSAgLSBBZGQgdGhlICduYXR1cmFsdmFyJyBvcHRpb24vbW9kZS9mZWF0dXJlIHRvIHRyZWF0IG1lbWJlcgoJICAgIHZhcmlhYmxlcyBpbiBhIG1vcmUgbmF0dXJhbCB3YXksIGllLCBzaW1pbGFyIHRvIHRoZSBnbG9iYWwKCSAgICB2YXJpYWJsZSBiZWhhdmlvci4KCgkgICAgWW91IGNhbiB1c2UgaXQgaW4gYSBnbG9iYWwgd2F5IHZpYSB0aGUgY29tbWFuZCBsaW5lCgoJICAgICAgc3dpZyAtbmF0dXJhbHZhciAuLi4KCgkgICAgb3IgdGhlIG1vZHVsZSBtb2RlIG9wdGlvbgogCgkgICAgICAlbW9kdWxlKG5hdHVyYWx2YXI9MSkKCgkgICAgYm90aCBmb3JtcyBtYWtlIHN3aWcgdHJlYXQgYWxsIHRoZSBtZW1iZXIgdmFyaWFibGVzIGluIHRoZQoJICAgIHNhbWUgd2F5IGl0IHRyZWF0cyBnbG9iYWwgdmFyaWFibGVzLiAKCgkgICAgQWxzbywgeW91IGNhbiB1c2UgaXQgaW4gYSBjYXNlIGJ5IGNhc2UgYXBwcm9hY2ggZm9yCgkgICAgc3BlY2lmaWMgbWVtYmVyIHZhcmlhYmxlcyB1c2luZyB0aGUgZGlyZWN0aXZlIGZvcm06CgoJICAgICAgJW5hdHVyYWx2YXIgQmFyOjpzOwoJICAgIAoJICAgIFRoZW4sIGluIHRoZSBmb2xsb3dpbmcgY2FzZSBmb3IgZXhhbXBsZToKCgkgICAgICAgc3RkOjpzdHJpbmcgczsKCSAgICAgICBzdHJ1Y3QgQmFyIHsKCQkgc3RkOjpzdHJpbmcgczsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHlvdSBjYW4gZG86ICAKCgkgICAgICAgYiA9IEJhcigpCgkgICAgICAgYi5zID0iaGVsbG8iCgkgICAgICAgY3Zhci5zID0gImhlbGxvIgoJICAgICAgIAoJICAgICAgIGlmIChiLnMgIT0gY3Zhci5zKToKCSAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IKCgkJICAKICAgICAgICAgICAgVGhpcyBpcyB2YWxpZCBmb3IgYWxsIHRoZSBsYW5ndWFnZXMsIGFuZCB0aGUKICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gZm9yY2luZyB0aGUgdXNlIG9mIHRoZSAKICAgICAgICAgICAgY29uc3QgU1dJR1RZUEUmIChDKyspL1NXSUdUWVBFIChDKSB0eXBlbWFwcyBmb3IgdGhlCiAgICAgICAgICAgIGdldC9zZXQgbWV0aG9kcyBpbnN0ZWFkIG9mIHRoZSBTV0lHVFlQRSAqIHR5cGVtYXBzLgoJICAgIEhlbmNlLCBmb3IgJ25hdHVyYWx2YXInIHRvIHdvcmssIGVhY2ggdGFyZ2V0IGxhbmd1YWdlCgkgICAgbXVzdCBpbXBsZW1lbnQgJ3R5cGVtYXAoaW4vb3V0KSBjb25zdCBUeXBlJicgcHJvcGVybHkuCgoJICAgIFRoZSAnbmF0dXJhbHZhcicgb3B0aW9uIHJlcGxhY2VzIG9yIG1ha2VzIHdvcmthcm91bmRzIHN1Y2ggIGFzOgoJICAgIAoJCSVhcHBseSBjb25zdCBzdGQ6OnN0cmluZyAmIHsgc3RkOjpzdHJpbmcgKn0KCiAgICAgICAgICAgIHVubmVjZXNzYXJ5LgoKCSAgICBOb3RlMTogSWYgeW91ciBpbnRlcmZhY2UgaGFzIG90aGVyIGtpbmRzIG9mIHdvcmthcm91bmRzIHRvCgkgICAgZGVhbCB3aXRoIHRoZSBvbGQgJ3VubmF0dXJhbCcgd2F5IHRvIGRlYWwgd2l0aCBtZW1iZXIKCSAgICB2YXJpYWJsZXMgKHJldHVybmluZy9leHBlY3RpbmcgcG9pbnRlcnMpLCB0aGUKCSAgICAnbmF0dXJhbHZhcicgb3B0aW9uIGNvdWxkIGJyZWFrIHRoZW0uCgkgICAgCgkgICAgTm90ZTI6IHRoZSBvcHRpb24gaGFzIG5vIGVmZmVjdCBvbiB1bm5hbWVkIHR5cGVzLCBzdWNoCgkgICAgYXMgdW5uYW1lZCBuZXN0ZWQgdW5pb25zLgoJICAgIAoJICAKMTIvMjcvMjAwNTogbW1hdHVzCgkgIC0gQWRkIG1vcmUgJ2V4cHJlc3NpdmUnIHJlc3VsdCBzdGF0ZXMgZm9yIHRoZSB0eXBlbWFwCiAgICAgICAgICAgIGxpYnJhcmllcy4KCgkgICAgSW4gdGhlIHBhc3QsIGZvciBzY3JpcHRpbmcgbGFuZ3VhZ2VzLCB5b3Ugd291bGQgZG8gY2hlY2tpbmcgc29tZXRoaW5nIGxpa2U6CgoJICAgICAgaWYgKENvbnZlcnRQdHIob2JqLCZ2cHRyLHR5LGZsYWdzKSAhPSAtMSkgewoJICAgICAgICAvLyBzdWNjZXNzCiAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgLy8gZXJyb3IKCSAgICAgIH0KCgkgICAgTm93IHRoZSByZXN1bHQgc3RhdGUgY2FuIGNhcnJ5IG1vcmUgaW5mb3JtYXRpb24sCgkgICAgaW5jbHVkaW5nOgoKCSAgICAgIC0gRXJyb3Igc3RhdGU6IGxpa2UgdGhlIG9sZCAtMS8wLCBidXQgd2l0aCBlcnJvciBjb2RlcyBmcm9tIHN3aWdlcnJvcnMuc3dnLgoKCSAgICAgICAgIGludCByZXMgPSBDb252ZXJ0UHRyKG9iaiwmdnB0cix0eSxmbGFncyk7CgkJIGlmIChTV0lHX0lzT0socmVzKSkgewoJCSAgIC8vIHN1Y2Nlc3MgY29kZQogICAgICAgICAgICAgICAgIH0gZWxzZSB7CgkJICAgU1dJR19FcnJvcihyZXMpOyAvLyByZXMgY2FycmllcyB0aGUgZXJyb3IgY29kZQogICAgICAgICAgICAgICAgIH0KCgkgICAgICAtIENhc3QgcmFuazogd2hlbiByZXR1cm5pbmcgYSBzaW1wbGUgc3VjY2Vzc2Z1bAogICAgICAgICAgICAgICAgY29udmVyc2lvbiwgeW91IGp1c3QgcmV0dXJuIFNXSUdfT0ssIGJ1dCBpZiB5b3UgbmVlZAogICAgICAgICAgICAgICAgdG8gZG8gYSAnY2FzdCcsIHlvdSBjYW4gYWRkIHRoZSBjYXN0aW5nIHJhbmssIGllOgoJCQoJCSAgaWYgKFB5RmxvYXRfQ2hlY2sob2JqKSkgewoJCSAgICB2YWx1ZSA9IFB5RmxvYXRfQXNEb3VibGUob2JqKTsKCQkgICAgcmV0dXJuIFNXSUdfT0s7CgkJICB9IGVsc2UgaWYgKFB5SW50X0NoZWNrKG9iaikpIHsKCQkgICAgdmFsdWUgPSAoZG91YmxlKSBQeUludF9Bc0xvbmcob2JqKTsKCQkgICAgcmV0dXJuIFNXSUdfQWRkQ2FzdChTV0lHX09LKTsJCSAgICAKICAgICAgICAgICAgICAgICAgfQoJCQoJCWxhdGVyLCB0aGUgY2FzdGluZyByYW5rIGlzIHVzZWQgdG8gcHJvcGVybHkgZGlzcGF0Y2gKCQl0aGUgb3ZlcmxvYWRlZCBmdW5jdGlvbiwgZm9yIGV4YW1wbGUuIFRoaXMgb2YgY291cnNlCgkJcmVxdWlyZXMgeW91ciBsYW5ndWFnZSB0byBzdXBwb3J0IGFuZCB1c2UgdGhlIG5ldwoJCWRpc3BhdGNoIGNhc3QvcmFuayBtZWNoYW5pc20gKE5vdyBtYWlubHkgc3VwcG9ydGVkIGluCgkJcGVybCBhbmQgcHl0aG9uLCBhbmQgZWFzaWx5IGV4cGFuZGFibGUgdG8gcnVieSBhbmQgdGNsKS4KCSAgICAgIAoJICAtIFtVVExdIEFkZCBzdXBwb3J0IGZvciB0aGUgbmV3ICdleHByZXNzaXZlJyByZXN1bHQgc3RhdGVzLgoKMTIvMjcvMjAwNTogbW1hdHVzCgkgIC0gQWRkIHN1cHBvcnQgZm9yIHRoZSBDKysgaW1wbGljaXQgY29udmVyc2lvbiBtZWNoYW5pc20sIHdoaWNoCiAgICAgICAgICAgIHJlcXVpcmVkIHNvbWUgbW9kaWZpY2F0aW9ucyBpbiBwYXJzZXIueSAodG8gcmVjb2duaXplCiAgICAgICAgICAgICdleHBsaWNpdCcpIGFuZCBvdmVybG9hZC5jeHggKHRvIHJlcGxhY2UgJGltcGxpY2l0Y29udiBhcwogICAgICAgICAgICBuZWVkZWQpLgoJICAgIAoJICAgIFN0aWxsLCByZWFsIHN1cHBvcnQgaW4gZWFjaCB0YXJnZXQgbGFuZ3VhZ2UgcmVxdWlyZXMgZWFjaAoJICAgIHRhcmdldCBsYW5ndWFnZSB0byBiZSBtb2RpZmllZC4gUHl0aG9uIHByb3ZpZGVzIGFuIGV4YW1wbGUsCiAgICAgICAgICAgIHNlZSBiZWxvdy4KCgoJICAtIEFkZCBzdXBwb3J0IGZvciBuYXRpdmUgQysrIGltcGxpY2l0IGNvbnZlcnNpb25zLCBpZSwgaWYgeW91CiAgICAgICAgICAgIGhhdmUKCgkgICAgICAgICVpbXBsaWNpdGNvbnYgQTsKCgkgICAgICAgIHN0cnVjdCBBIHsKCQkgICBpbnQgaWk7CgkJICAgQSgpIHtpaSA9IDE7fQoJCSAgIEEoaW50KSB7aWkgPSAyO30KCQkgICBBKGRvdWJsZSkge2lpID0gMzt9CgkJICAgZXhwbGljaXQgQShjaGFyICpzKSB7aWkgPSA0O30KCQl9OwoJCQoJCWludCBnZXQoY29uc3QgQSYgYSkge3JldHVybiBhLmlpO30KCiAgICAgICAgICAgIHlvdSBjYW4gY2FsbDoKCgkgICAgICAgIGEgPSBBKCkKCSAgICAgICAgYWkgPSBBKDEpCgkgICAgICAgIGFkID0gQSgxLjApCgkgICAgICAgIGFzID0gQSgiaGVsbG8iKQoJCQoJCSMgb2xkIGZvcm1zCgkgICAgICAgIGdldChhKSAgLT4gMQoJICAgICAgICBnZXQoYWkpIC0+IDIKCSAgICAgICAgZ2V0KGFkKSAtPiAzCgkgICAgICAgIGdldChhcykgLT4gNAoJCQoJCSNpbXBsaWNpdCBjb252ZXJzaW9ucwoJICAgICAgICBnZXQoMSkgICAgICAgLT4gMgoJICAgICAgICBnZXQoMS4wKSAgICAgLT4gMwoJICAgICAgICBnZXQoImhlbGxvIikgLT4gRXJyb3IsIGV4cGxpY2l0IGNvbnN0cnVjdG9yCgogICAgICAgICAgICBBbHNvLCBhcyBpbiBDKyssIG5vdyBpbXBsaWNpdCBjb252ZXJzaW9ucyBhcmUgc3VwcG9ydGVkIGluCiAgICAgICAgICAgIHZhcmlhYmxlIGFzc2lnbWVudHMsIGFuZCBpZiB5b3UgaGF2ZToKCgkgICAgICBBIGdhOwoJICAgICAgc3RydWN0IEJhciB7CgkgICAgICAgIEEgYTsKICAgICAgICAgICAgICB9OwoKCSAgICB5b3UgY2FuIGRvOgoKCSAgICAgIGN2YXIuZ2EgPSBBKDEpCgkgICAgICBjdmFyLmdhID0gMQoJICAgICAgY3Zhci5nYSA9IDEuMAoJICAgICAgY3Zhci5nYSA9IEEoImhlbGxvIikgCgkgICAgICBjdmFyLmdhID0gImhlbGxvIiAtPiBlcnJvciwgZXhwbGljaXQgY29uc3RydWN0b3IKCgkgICAgICBiID0gQmFyKCkKCSAgICAgIGIuYSA9IEEoImhlbGxvIikKCSAgICAgIGIuYSA9IDEKCSAgICAgIGIuYSA9IDEuMAoJICAgICAgYi5hID0gImhlbGxvIiAtPiBlcnJvciwgZXhwbGljaXQgY29uc3RydWN0b3IKCgkgICAgTm90ZSB0aGF0IHRoZSBsYXN0IGNhc2UsIGFzc2lnbmluZyBhIG1lbWJlciB2YXIgZGlyZWN0bHksIAoJICAgIGFsc28gcmVxdWlyZXMgdGhlICduYXR1cmFsdmFyJyBvcHRpb24uCgoJICAgIFRoaXMgc3VwcG9ydCBub3cgbWFrZXMgdGhlIG9sZCAnJWltcGxpY2l0JyBtYWNybywgd2hpY2gKCSAgICB3YXMgZm91bmQgaW4gJ2ltcGxpY2l0LmknIGFuZCBpdCB3YXMgZnJhZ2lsZSBpbiBtYW55IHdheXMsCgkgICAgb2Jzb2xldGUsIGFuZCB5b3Ugc2hvdWxkIHVzZSB0aGUgbmV3ICclaW1wbGljaXRjb252JwoJICAgIGRpcmVjdGl2ZSBpbnN0ZWFkLgoKCSAgICBOb3RlIHRoYXQgd2UgZm9sbG93IHRoZSBDKysgY29udmVudGlvbnMsIGllLCBpbiB0aGUKCSAgICBmb2xsb3dpbmcgdGhlIGltcGxpY2l0IGNvbnZlcnNpb24gaXMgYWxsb3dlZDoKCgkJaW50IGdldChBIGEpIHtyZXR1cm4gYS5paTt9CgkJaW50IGdldChjb25zdCBBJiBhKSB7cmV0dXJuIGEuaWk7fQoJICAgIAoJICAgIGJ1dCBub3QgaW4gdGhlc2UgY2FzZXM6CgoJCWludCBnZXQoQSAqYSkge3JldHVybiBhLT5paTt9CgkJaW50IGdldChBJiBhKSB7cmV0dXJuIGEuaWk7fQoJCQoJICAgIEFsc28sIGl0IHdvcmtzIGZvciBkaXJlY3RvciBtZXRob2RzIHRoYXQgcmV0dXJuIGEgYnkgdmFsdWUKCSAgICByZXN1bHQsIGllLCB0aGUgZm9sbG93aW5nIHdpbGwgd29yazoKCiAgICAgICAgICAgICAgICB2aXJ0dWFsIEEgZ2V0X2EoKSA9IDA7CgoJCWRlZiBnZXRfYShzZWxmKToKCQkgICByZXR1cm4gMQoKICAgICAgICAgICAgYnV0IG5vdCBpbiB0aGlzIGNhc2U6CgogICAgICAgICAgICAgICAgdmlydHVhbCBjb25zdCBBJiBnZXRfYSgpID0gMDsKICAgICAgICAgICAgICAgIHZpcnR1YWwgQSYgZ2V0X2EoKSA9IDA7CiAgICAgICAgICAgICAgICB2aXJ0dWFsIEEqIGdldF9hKCkgPSAwOwoJICAgIAoJICBOb3RlczoKCgkgIC0gdGhlIGltcGxpY2l0Y29udiBtZWNoYW5pc20gaXMgaW1wbGVtZW50ZWQgYnkgZGlyZWN0bHkKCSAgICBjYWxsaW5nL2Rpc3BhdGNoaW5nIHRoZSBweXRob24gY29uc3RydWN0b3IsIHRyaWdnZXJpbmcgYQoJICAgIGNhbGwgdG8gdGhlIF9faW5pdF9fbWV0aG9kLiBIZW5jZSwgaWYgeW91IGV4cGFuZGVkIHRoZQoJICAgIF9faW5pdF9fIG1ldGhvZCwgbGlrZSBpbjoKCgkgICAgICAgIGNsYXNzIEE6CgkJICAgZGVmIF9faW5pdF9fKHNlbGYsYXJncyk6CgkJICAgICAgPHN3aWcgY29kZT4KCQkgICAgICA8bXkgY29kZSBoZXJlPgoKICAgICAgICAgICAgdGhlbiAnbXkgY29kZScgd2lsbCBhbHNvIGJlIGV4ZWN1dGVkLgoJICAgIAoJICAtIFNpbmNlIHRoZSAlaW1wbGljaXRjb252IGRpcmVjdGl2ZSBpcyBhIFNXSUcgZmVhdHVyZSwgaWYgeW91IHR5cGU6CgkgICAgCiAgCSAgICAgICAlaW1wbGljaXRjb252OyAgCgoJICAgIHRoYXQgd2lsbCBlbmFibGUgaW1wbGljaXQgY29udmVyc2lvbiBmb3IgYWxsIHRoZSBjbGFzc2VzIGluCgkgICAgeW91ciBtb2R1bGUuCgoJICAgIEJ1dCBpZiB5b3UgYXJlIHdvcnJpZWQgYWJvdXQgcGVyZm9ybWFuY2UsIG1heWJlIHRoYXQgd2lsbCBiZQoJICAgIHRvbyBtdWNoLCBlc3BlY2lhbGx5IGlmIHlvdSBoYXZlIG92ZXJsb2FkZWQgbWV0aG9kcywgc2luY2UKCSAgICB0byByZXNvbHZlIHRoZSBkaXNwYXRjaGluZyBwcm9ibGVtLCBweXRob24gd2lsbCBlZmVjdGl2ZWx5CgkgICAgdHJ5IHRvIGNhbGwgYWxsIHRoZSBpbXBsaWNpdCBjb25zdHJ1Y3RvcnMgYXMgbmVlZGVkLgoKCSAgLSBGb3IgdGhlIHNhbWUgcmVhc29uLCBpdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCB5b3UgdXNlCiAgICAgICAgICAgIHRoZSBuZXcgJ2Nhc3Rtb2RlJyB3aGVuIG1peGluZyBpbXBsaWNpdCBjb252ZXJzaW9uIGFuZAogICAgICAgICAgICBvdmVybG9hZGluZy4KCgkgLSBbcHl0aG9uXSBUaGUgJWltcGxpY2l0IGRpcmVjdGl2ZSBpcyBkZWNsYXJlZCBvYnNvbGV0ZSwgYW5kCiAgICAgICAgICAgeW91IHNob3VsZCB1c2UgJWltcGxpY2l0Y29udiBpbnN0ZWFkLiBJZiB5b3UgaW5jbHVkZQoJICAgdGhlIGltcGxpY2l0LmkgZmlsZSwgYSB3YXJuaW5nIHdpbGwgcmVtaW5kIHlvdSBvZiB0aGlzLgoKCSAgIE5vdGU6IFNpbmNlICVpbXBsaWNpdCBpcyBmcmFnaWxlLCBqdXN0IHJlcGxhY2luZyBpdCBieQoJICAgJWltcGxpY2l0Y29udiBjb3VsZCBsZWFkIHRvIGRpZmZlcmVudCBiZWhhdmlvci4gSGVuY2UsIHdlCgkgICBkb24ndCBhdXRvbWF0aWNhbGx5IHN3aXRjaCBmcm9tIHRvIHRoZSBvdGhlciwgYW5kIHRoZSB1c2VyCgkgICBtdXN0IG1pZ3JhdGUgdG8gdGhlIG5ldyAlaW1wbGljaXRjb252IGRpcmVjdGl2ZSBtYW51YWxseS4KCgoxMi8yNi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdCiAgICAgICAgICAgIE1vZGlmeSBzdGQ6OnZlY3RvciB3cmFwcGVycyB0byB1c2Ugc3RkOjp2ZWN0b3I6OnZhbHVlX3R5cGUgYXMgdGhpcyBpcwogICAgICAgICAgICBjbG9zZXIgdG8gdGhlIHJlYWwgU1RMIGRlY2xhcmF0aW9ucyBmb3Igc29tZSBtZXRob2RzLCBlZyBmb3IgcHVzaF9iYWNrKCkuCiAgICAgICAgICAgIEZpeGVzIHNvbWUgY29tcGlsYXRpb24gZXJyb3JzIGZvciBzb21lIGNvbXBpbGVycyBlZyB3aGVuIHRoZSB0ZW1wbGF0ZWQKICAgICAgICAgICAgdHlwZSBpcyBhIHBvaW50ZXIuCgogICAgICAgICAgICBbSmF2YV0KICAgICAgICAgICAgc3RkOjp2ZWN0b3IgaW1wcm92ZW1lbnRzIC0gYSBmZXcgbW9yZSBtZXRob2RzIGFyZSB3cmFwcGVkIGFuZCBzcGVjaWFsaXphdGlvbnMgYXJlCiAgICAgICAgICAgIG5vIGxvbmdlciByZXF1aXJlZC4gVGhlIHNwZWNpYWxpemVfc3RkX3ZlY3RvciBtYWNybyBpcyBubyBsb25nZXIgbmVlZGVkIChhCiAgICAgICAgICAgIHdhcm5pbmcgaXMgaXNzdWVkIGlmIGFuIGF0dGVtcHQgaXMgbWFkZSB0byB1c2UgaXQpLgoKMTIvMjYvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXQogICAgICAgICAgICBBZGQgaW4gcG9pbnRlciByZWZlcmVuY2UgdHlwZW1hcHMuIFRoaXMgYWxzbyBlbmFibGVzIG9uZSB0byBlYXNpbHkgd3JhcAogICAgICAgICAgICBzdGQ6OnZlY3RvcjxUPiB3aGVyZSBUIGlzIGEgcG9pbnRlci4KCjEyLzI0LzIwMDU6IGVmdXp6eW9uZQogICAgICAgICAgICBbQ0ZGSV0gVGhlIGNmZmkgbW9kdWxlIGZvciBTV0lHOgogICAgICAgICAgICAgIC0gRnVsbHkgc3VwcG9ydHMgQywgYnV0IHByb3ZpZGVzIGxpbWl0ZWQgc3VwcG9ydHMgZm9yIEMrKywgaW4KICAgICAgICAgICAgICAgcGFydGljdWxhciBDKysgc3VwcG9ydCBmb3IgdGVtcGxhdGVzIGFuZCBvdmVybG9hZGluZyBuZWVkcyB0bwogICAgICAgICAgICAgICBiZSB3b3JrZWQgdXBvbi4gCgoxMi8yMy8yMDA1OiBtbWF0dXMKCSAgICBbcHl0aG9uXSBBZGQgdGhlIGNhc3Rtb2RlIHRoYXQgYWxsb3dzIHRoZSBweXRob24KCSAgICB0eXBlIGNhc3RpbmcgdG8gb2NjdXIuCgoJICAgIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSAnaW50IGZvbyhpbnQpJywgbm93CgkgICAgCgkgICAgICBjbGFzcyBBaSgpOgoJICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYseCk6IAoJCSAgICBzZWxmLnggPSB4CgkgICAgICAgICBkZWYgX19pbnRfXyhzZWxmKTogCgkJICAgIHJldHVybiBzZWxmLngKCgkgICAgICBmb28oMSkgICAvLyBPawoJICAgICAgZm9vKDEuMCkgLy8gT2sKCSAgICAgIGZvbygxLjMpIC8vIEVycm9yCgkgICAgICBhID0gQWkoNCkKICAgICAgICAgICAgICBmb28oYWkpICAvLyBPawoKICAgICAgICAgICAgVGhlIGNhc3Rtb2RlLCB3aGljaCBjYW4gYmUgZW5hYmxlZCBlaXRoZXIgd2l0aCB0aGUKICAgICAgICAgICAgJy1jYXN0bW9kZScgb3B0aW9uIG9yIHRoZSAlbW9kdWxlKCJjYXN0bW9kZSIpIG9wdGlvbiwgdXNlcwogICAgICAgICAgICB0aGUgbmV3IGNhc3QvcmFuayBkaXNwYXRjaCBtZWNoYW5pc20uIEhlbmNlLCBub3cgaWYgeW91CiAgICAgICAgICAgIGhhdmUgJ2ludCBmb28oaW50KTsgaW50IGZvbyhkb3VibGUpOycsIHRoZSBmb2xsb3dpbmcgd29ya3MKICAgICAgICAgICAgYXMgZXhwZWN0ZWQ6CgoJICAgICAgZm9vKDEpICAgLT4gZm9vKGludCkKCSAgICAgIGZvbygxLjApIC0+IGZvbyhkb3VibGUpCgkgICAgICBhaSA9IEFpKDQpCgkgICAgICBmb28oYWkpICAtPiBmb28oaW50KQoKCSAgICBOb3RlMTogdGhlICdjYXN0bW9kZScgY291bGQgZGlzcnVwdCBzb21lIHNwZWNpYWxpemVkCgkgICAgdHlwZW1hcHMuIEluIHBhcnRpY3VsYXIsIHRoZSAiaW1wbGljaXQuaSIgbGlicmFyeSBzZWVtcyB0bwoJICAgIGhhdmUgcHJvYmxlbSB3aXRoIHRoZSBjYXN0bW9kZS4gQnV0IGJlc2lkZXMgdGhhdCBvbmUsIHRoZQoJICAgIGVudGlyZSB0ZXN0LXN1aXRlIGNvbXBpbGVzIGZpbmUgd2l0aCBhbmQgd2l0aG91dCB0aGUKCSAgICBjYXN0bW9kZS4KCiAJICAgIE5vdGUyOiB0aGUgY2FzdCBtb2RlIGNhbid0IGJlIGNvbWJpbmVkIHdpdGggdGhlIGZhc3QKCSAgICBkaXNwYXRjaCBtb2RlLCBpZSwgdGhlIC1mYXN0ZGlzcGF0Y2ggb3B0aW9uIGhhcyBubyBlZmZlY3QKCSAgICB3aGVuIHRoZSBjYXN0IG1vZGUgaXMgc2VsZWN0ZWQuIFRoZSBwZW5hbHRpZXMsIGhvd2V2ZXIsCgkgICAgYXJlIG1pbmltdW0gc2luY2UgdGhlIGNhc3QgZGlzcGF0Y2ggY29kZSBpcyBhbHJlYWR5IGJhc2VkCgkgICAgb24gdGhlIHNhbWUgZmFzdCBkaXNwYXRjaCBtZWNoYW5pc20uCgoJICAgIFNlZSB0aGUgZmlsZSBvdmVybG9hZF9kaXNwYXRjaF9jYXN0X3J1bm1lLnB5IGZpbGUgZm9yCgkgICAgbmV3IGNhc2VzIGFuZCBleGFtcGxlcy4KCjEyLzIyLzIwMDU6IG1tYXR1cwoJICAgIEFkZCB0aGUgY2FzdCBhbmQgcmFuayBtZWNoYW5pc20gdG8gZGlzcGF0Y2ggb3ZlcmxvYWRpbmcKCSAgICBmdW5jdGlvbnMuIFRoZSBVVEYgc3VwcG9ydHMgaXQgbm93LCBidXQgZm9yIGVhY2ggbGFuZ3VhZ2UKCSAgICBpdCBtdXN0IGJlIGRlY2lkZWQgaG93IHRvIGltcGxlbWVudCBhbmQvb3Igd2hlbiB0byB1c2UgaXQuCgoJICAgIFtwZXJsXSBOb3cgcGVybCB1c2VzIHRoZSBuZXcgY2FzdCBhbmQgcmFuayBkaXNwYXRjaAoJICAgIG1lY2hhbmlzbSwgd2hpY2ggc29sdmVzIGFsbCB0aGUgcGFzdCBwcm9ibGVtcyBrbm93biAKCSAgICBpbiBwZXJsLCBzdWNoIGFzIHRoZSBvbGQgJysgMScgcHJvYmxlbToKCgkgICAgICAgIGludCBmb28oaW50KTsKCSAgICAKCQkkbiA9IDEKICAgICAgICAgICAgICAgICRuID0gJG4gKyAxCiAgICAgICAgICAgICAgICAkciA9IGZvbyhuKQoKICAgICAgICAgICAgYWxzbyB3b3JrczoKCiAgICAgICAgICAgICAgICAgZm9vKDEpOwogICAgICAgICAgICAgICAgIGZvbygiMSIpOwogICAgICAgICAgICAgICAgIGZvbygxLjApOwogICAgICAgICAgICAgICAgIGZvbygiMS4wIik7CgogICAgICAgICAgICAgYnV0IGZhaWxzCgogICAgICAgICAgICAgICAgIGZvbygibCIpOwoKICAgICAgICAgICAgIGFuZCB3aGVuIG92ZXJsb2FkaW5nICBmb28oaW50KSBhbmQgZm9vKGRvdWJsZSk7CgogICAgICAgICAgICAgICAgIGZvbygxKSAtPiBmb28oaW50KQogICAgICAgICAgICAgICAgIGZvbygxLjApIC0+IGZvbyhkb3VibGUpCiAgICAgICAgICAgICAgICAgZm9vKCIxIikgLT4gZm9vKGludCkKICAgICAgICAgICAgICAgICBmb28oIjEuMCIpIC0+IGZvbyhkb3VibGUpCiAgICAgICAgICAgICAgICAgZm9vKCJsIikgLT4gZXJyb3IKCQkgZm9vKCRuKSAtPiBmb28oaW50KSAgZm9yIGdvb2QgcGVybCB2ZXJzaW9ucwoJCSBmb28oJG4pIC0+IGZvbyhkb3VibGUpICBmb3Igb2xkIGJhZCBwZXJsIHZlcnNpb25zCgoJICAgICB3aGVuIG92ZXJsb2FkaW5nIGZvbyhpbnQpLCBmb28oY2hhciopIGFuZCBmb28oZG91YmxlKToKCiAgICAgICAgICAgICAgICAgZm9vKDEpIC0+IGZvbyhpbnQpCiAgICAgICAgICAgICAgICAgZm9vKDEuMCkgLT4gZm9vKGRvdWJsZSkKICAgICAgICAgICAgICAgICBmb28oIjEiKSAtPiBmb28oY2hhciopCiAgICAgICAgICAgICAgICAgZm9vKCIxLjAiKSAtPiBmb28oY2hhciopCiAgICAgICAgICAgICAgICAgZm9vKCJsIikgLT4gZm9vKGNoYXIqKQoKICAgICAgICAgICAgIE5vdGU6IEluIHBlcmwgdGhlIG9sZCBkaXNwYXRjaCBtZWNoYW5pc20gd2FzIGJyb2tlbiwKICAgICAgICAgICAgIHNvLCB3ZSBkb24ndCBwcm92aWRlIGFuIG9wdGlvbiB0byBlbmFibGUgdGhlIG9sZCBvbmUKCSAgICAgc2luY2UsIGFnYWluLCBpdCB3YXMgcmVhbGx5IHJlYWxseSBicm9rZW4uCgoJICAgICBTZWUgJ292ZXJsb2FkX3NpbXBsZV9ydW5tZS5wbCcgZm9yIG1vcmUgY2FzZXMgYW5kIHRlc3RzLgoKCSAgICAgUFM6IGFsbCB0aGUgb2xkIGtub3duIGlzc3VlcyBhcmUgZGVjbGFyZWQgcmVzb2x2ZWQsIGFueQoJICAgICBuZXcgInByb2JsZW0iIHRoYXQgY291bGQgYmUgZGlzY292ZXJlZCBpcyBkZWNsYXJlZCwgCgkgICAgIGEgcHJpb3JpLCBhcyAiZmVhdHVyZXMiIG9mIHRoZSBuZXcgZGlzcGF0Y2ggbWVjaGFuaXNtCgkgICAgICh1bnRpbCB3ZSBmaW5kIGFub3RoZXIgc29sdXRpb24gYXQgbGVhc3QpLgoJICAgICAKCSAgICAgCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCgkgICAgQXMgd2l0aCB0aGUgaW50cm9kdWN0aW9uIG9mIHRoZSBVVEYsIHNvbWUgdGhpbmdzIGNvdWxkCgkgICAgbm93IHN0YXJ0IHRvIHdvcmsgYXMgZXhwZWN0ZWQsIGFuZCBwZW9wbGUgdXNlZCB0byBkZWFsIG9yCgkgICAgd29ya2Fyb3VuZCBwcmV2aW91cyBidWdzIHJlbGF0ZWQgdG8gdGhlIGRpc3BhdGNoCgkgICAgbWVjaGFuaXNtLCBjb3VsZCBzZWUgbm93IGEgZGlmZmVyZW5jZSBpbiBwZXJsIGJlaGF2aW9yLgoKMTIvMjEvMjAwNTogbW1hdHVzCgkgIC0gVGhlICctbm9kZWZhdWx0JyBmbGFnIChwcmFnbWEgYW5kIGZlYXR1cmUpIG5vdyBnZW5lcmF0ZXMKCSAgICBhIHdhcm5pbmcsIGFuZCByZWNvbW1lbmRzIHRvIHVzZSB0aGUgZXhwbGljaXQKCSAgICAtbm9kZWZhdWx0Y3RvciBhbmQgIC1ub2RlZmF1bHRkdG9yIG9wdGlvbnMuCgkgICAgCgkgICAgVGhlIHJlYXNvbiB0byBzcGxpdCB0aGUgJ25vZGVmYXVsdCcgYmVoYXZpb3IgaXMgdGhhdCwgaW4KCSAgICBnZW5lcmFsLCBpZ25vcmluZyB0aGUgZGVmYXVsdCBkZXN0cnVjdG9yIGdlbmVyYXRlcyBtZW1vcnkKCSAgICBsZWFrcyBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLiBIZW5jZSwgaXMgdG9vIHJpc2t5IGp1c3QgdG8KCSAgICBkaXNhYmxlIGJvdGggdGhlIGRlZmF1bHQgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IKCSAgICBhdCB0aGUgc2FtZSB0aW1lLgoKCSAgICBJZiB5b3UgbmVlZCB0byBkaXNhYmxlIHRoZSBkZWZhdWx0IGRlc3RydWN0b3IsIGl0IGlzCgkgICAgYWxzbyByZWNvbW1lbmRlZCB5b3UgdXNlIHRoZSBkaXJlY3RpdmUgZm9ybToKCgkgICAgICAgJW5vZGVmYXVsdGR0b3IgIE15VmVyeVNwZWNpYWxDbGFzczsKCiAgICAgICAgICAgIGZvciBzcGVjaWZpYyBjbGFzc2VzLCBhbmQgYWx3YXlzIGF2b2lkIHVzaW5nIHRoZSBnbG9iYWwKICAgICAgICAgICAgLW5vZGVmYXVsdCBhbmQgLW5vZGVmYXVsdGR0b3Igb3B0aW9ucy4KCSAgICAKMTIvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXQogICAgICAgICAgICBGaXggaW5jb3JyZWN0IGNvZGUgZ2VuZXJhdGlvbiB3aGVuIHRoZSBpbnRlcm1lZGlhcnkgY2xhc3NuYW1lIGlzIGNoYW5nZWQKICAgICAgICAgICAgaW4gdGhlIG1vZHVsZSBkaXJlY3RpdmUgZnJvbSBpdHMgZGVmYXVsdC4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVtb2R1bGUoam5pY2xhc3NuYW1lPSJteWltY2xhc3NuZXduYW1lIikgIm15bW9kdWxlIiAvLyBKYXZhCiAgICAgICAgICAgICAgJW1vZHVsZShpbWNsYXNzbmFtZT0ibXlpbWNsYXNzbmV3bmFtZSIpICJteW1vZHVsZSIgLy8gQyMKCiAgICAgICAgICAgIEFkZCBpbiBuZXcgc3BlY2lhbCB2YXJpYWJsZSAkaW1jbGFzc25hbWUuIFNlZSBkb2NzLgoKMTIvMTcvMjAwNTogbW1hdHVzCgkgIFtQeXRob25dCgkgIC0gQWRkIHRoZSAtYWxpYXNvYmowLy1ub2FsaWFzb2JqMCBvcHRpb25zIHRvIHVzZSB3aXRoCgkgICAgLWZhc3R1bnBhY2sgYW5kL29yIC1PIGFuZCBvbGQgdHlwZW1hcHMgdGhhdCB1c2UgJ29iajAnCgkgICAgZGlyZWN0bHkuCgoJICAgIFNvLCBpZiB5b3UgY29tcGlsZSB5b3VyIGNvZGUgdXNpbmcgLU8gYW5kIGdldCBlcnJvcnMgYWJvdXQKCSAgICB0aGUgdW5kZWNsYXJlZCAnb2JqMCcgdmFyaWFibGUsIHJ1biBhZ2FpbiB1c2luZyAKCgkJc3dpZyAtTyAtYWxpYXNvYmowIC1weXRob24gLi4uLgoJICAgIAoJICAgIEZvciBuZXcgdHlwZW1hcHMsIG5ldmVyIHVzZSAnb2JqMCcgZGlyZWN0bHksIGlmIG5lZWRlZCwKCSAgICB1c2UgdGhlICckc2VsZicgbmFtZSB0aGF0IHdpbGwgYmUgcHJvcGVybHkgIGV4cGFuZGVkIHRvCgkgICAgJ29iajAnIChub2Zhc3R1bnBhY2spIG9yICdzd2lnX29ialswXScgKGZhc3R1bnBhY2spLiAKICAKCSAgICBJZiB5b3UgaGF2ZSBubyBpZGVhIHdoYXQgSSBhbSB0YWxraW5nIGFib3V0LCBiZXR0ZXIsIHRoYXQKCSAgICBtZWFucyB5b3UgaGF2ZSBubyB0eXBlbWFwIHdpdGggdGhpcyBwcm9ibGVtLgoKCjEyLzE0LzIwMDU6IG1tYXR1cyAJIAoJICBbUHl0aG9uXQoJICAtIEFkZCB0aGUgLWZhc3R1bnBhY2svLW5vZmFzdHVucGFjayBvcHRpb25zIHRvIGVuYWJsZS9kaXNhYmxlCgkgICAgdGhlIHVzZSBvZiB0aGUgaW50ZXJuYWwgVW5wYWNrVHVwbGUgbWV0aG9kLCBpbnN0ZWFkIG9mCgkgICAgY2FsbGluZyB0aGUgb25lIGZyb20gdGhlIHB5dGhvbiBDIEFQSS4KCgkgICAgVGhlIG9wdGlvbiAtTyBub3cgYWxzbyBpbXBsaWVzIC1mYXN0dW5wYWNrLgoJICAgIAoKMTIvMTEvMjAwNTogbW1hdHVzIAoJICBbUHl0aG9uXQoJICAtIEFkZCB0aGUgLXByb3h5ZGVsLy1ub3Byb3h5ZGVsIG9wdGlvbnMgdG8gZW5hYmxlL2Rpc2FibGUKCSAgICB0aGUgZ2VuZXJhdGlvbiBvZiBwcm94eS9zaGFkb3cgX19kZWxfXyBtZXRob2RzLCBldmVuCgkgICAgd2hlbiBub3cgdGhleSBhcmUgcmVkdW5kYW50LCBzaW5jZSB0aGV5IGFyZSBlbXB0eS4KCSAgICBIb3dldmVyLCBvbGQgaW50ZXJmYWNlcyBjb3VsZCByZWx5IG9uIGNhbGxpbmcgdGhlbS4KCgkgICAgVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gZ2VuZXJhdGUgdGhlIF9fZGVsX18gbWV0aG9kcwoJICAgIGFzIGluIDEuMy4yNyBvciBvbGRlciBzd2lnIHZlcnNpb25zLgoKCSAgICBUaGUgb3B0aW9uIC1PIG5vdyBhbHNvIGltcGxpZXMgLW5vcHJveHlkZWwuCgoxMi8xMC8yMDA1OiBtbWF0dXMgCgkgIFtVVEZdCiAgICAgICAgICAtIEZpeCB1bm5lY2Vzc2FyeSBjYWxscyB0byBTV0lHX1R5cGVRdWVyeSBmb3IgJ2NoYXIgKicKCSAgICBhbmQgJ3djaGFyX3QgKicsIHByb2JsZW0gZm91bmQgYnkgQ2xheSBDdWx2ZXIgd2hpbGUKCSAgICBwcm9maWxpbmcgdGhlIFB5T2dyZSBwcm9qZWN0LgoKCSAgCgkgIFtQeXRob25dIAoJICAtIEFkZCB0aGUgLWRpcnZ0YWJsZS8tbm9kaXJ2dGFibGUgdG8gZW5hYmxlL2Rpc2FibGUKCSAgICBhIHBzZXVkbyB2aXJ0dWFsIHRhYmxlIHVzZWQgZm9yIGRpcmVjdG9ycywgYXZvaWRpbmcKCSAgICB0aGUgbmVlZCB0byByZXNvbHZlIHRoZSBweXRob24gbWV0aG9kIGF0IGVhY2ggY2FsbC4KCSAgICAKCSAgLSBBZGQgdGhlIC1zYWZlY3N0cmluZ3MvLW5vc2FmZWNzdHJpbmdzIG9wdGlvbnMgdG8KCSAgICBlbmFibGUvZGlzYWJsZSB0aGUgdXNlIG9mIHNhZmUgY29udmVyc2lvbnMgZnJvbSBQeVN0cmluZwoJICAgIHRvIGNoYXIgKi4gUHl0aG9uIHJlcXVpcmVzIHlvdSB0byBuZXZlciBjaGFuZ2UgdGhlIGludGVybmFsCgkgICAgYnVmZmVyIGRpcmVjdGx5LCBhbmQgaGVuY2UgJ3NhZmVjdHJpbmdzJyB3YXJyYW50aWVzIHRoYXQKCSAgICBidXQgcmV0dXJuaW5nIGEgY29weSBvZiB0aGUgaW50ZXJuYWwgcHl0aG9uIHN0cmluZyBidWZmZXIuCgoJICAgIFRoZSBkZWZhdWx0LCBhcyBpbiBwcmV2aW91cyByZWxlYXNlcywgaXMgdG8gcmV0dXJuIGEKCSAgICBwb2ludGVyIHRvIHRoZSBidWZmZXIgKG5vc2FmZWNzdHJpbmdzKSwgc28sIGl0IGlzIHRoZSB1c2VyJ3MKCSAgICByZXNwb25zaWJpbGl0eSB0byBhdm9pZCBpdHMgbW9kaWZpY2F0aW9uLgoJICAgIAoJICAtIEFkZCB0aGUgLU8gb3B0aW9uIHRvIGVuYWJsZSBhbGwgdGhlIG9wdGltaXphdGlvbiBvcHRpb25zCgkgICAgYXQgb25jZSwgaW5pdGlhbGx5IGVxdWl2YWxlbnQgdG8KCgkgICAgLW1vZGVybiAtZmFzdGRpc3BhdGNoIC1kaXJ2dGFibGUgLW5vc2FmZWNzdHJpbmdzIC1mdmlydHVhbAoKMTIvMDgvMjAwNTogbW1hdHVzIAoKCSAgLSBBZGQgdGhlIC1mYXN0ZGlzcGF0Y2ggb3B0aW9uIChmYXN0ZGlzcGF0Y2ggZmVhdHVyZSkuIFRoaXMKCSAgICBlbmFibGVzIHRoZSAiZmFzdCBkaXNwYXRjaCIgbWVjaGFuaXNtIGZvciBvdmVybG9hZGVkCgkgICAgbWV0aG9kcyBwcm92aWRlZCBieSBTYWx2YWRvciBGYW5kaX5ubyBHYXJjJ2lhICgjOTMwNTg2KS4KCgkgICAgVGhlIHJlc3VsdGluZyBjb2RlIGlzIHNtYWxsZXIgYW5kIGZhc3RlciBzaW5jZSBsZXNzIHR5cGUKCSAgICBjaGVja2luZyBpcyBwZXJmb3JtZWQuIEhvd2V2ZXIsIHRoZSBlcnJvciBtZXNzYWdlcyB5b3UKCSAgICBnZXQgd2hlbiB0aGUgb3ZlcmxvYWRpbmcgaXMgbm90IHJlc29sdmVkIGNvdWxkIGJlCgkgICAgZGlmZmVyZW50IGZyb20gd2hhdCB0aGUgdHJhZGl0aW9uYWwgbWV0aG9kIHJldHVybnMuCgoJICAgIFdpdGggdGhlIG9sZCBtZXRob2QgeW91IGFsd2F5cyBnZXQgYW4gZXJyb3Igc3VjaCBhcyAKCgkgICAgICAgIk5vIG1hdGNoaW5nIGZ1bmN0aW9uIGZvciBvdmVybG9hZGVkIC4uLiIKCiAgICAgICAgICAgIHdpdGggdGhlIG5ldyBtZXRob2QgeW91IGNhbiBhbHNvIGdldCBlcnJvcnMgc3VjaCBhcwoKCSAgICAgICAiVHlwZSBlcnJvciBpbiBhcmd1bWVudCAxIG9mIHR5cGUgLi4uIgoKCSAgICBTZWUgYnVnIHJlcG9ydCAjOTMwNTg2IGZvciBtb3JlIGRldGFpbHMuCiAgICAgICAgICAgIAogIAkgICAgU28sIHRoaXMgb3B0aW1pemF0aW9uIG11c3QgYmUgZXhwbGljaXRseSBlbmFibGVkIGJ5IHVzZXJzLgoKCSAgICBUaGUgbmV3IG1lY2hhbmlzbSBjYW4gYmUgdXNlZCBhczoKCiAgICAgICAgICAgICAgc3dpZyAtZmFzdGRpc3BhdGNoCgogICAgICAgICAgICBvciB1c2luZyB0aGUgZmVhdHVyZSBmb3JtCgoJICAgICAgJWZlYXR1cmUoImZhc3RkaXNwYXRjaCIpIG1ldGhvZDsKICAgICAgICAgICAgb3IKICAgICAgICAgICAgICAlZmFzdGRpc3BhdGNoIG1ldGhvZDsKCSAgICAKCjEyLzA2LzIwMDU6IG1tYXR1cyAKCiAgICAgICAgICAtIFNldmVyYWwgbWVtb3J5IGFuZCBzcGVlZCBpbXByb3ZlbWVudHMsIHNwZWNpYWxseSBmb3IKCSAgICB0ZW1wbGF0ZXMuIE5vdyBzd2lnIGlzIHVwIHRvIDIwIGZhc3RlciB0aGFuIGJlZm9yZSBmb3IKCSAgICBsYXJnZSB0ZW1wbGF0ZSBpbnRlcmZhY2VzLCBzdWNoIGFzIHRoZSBzdGRfY29udGFpbmVycy5pCgkgICAgYW5kIHRlbXBsYXRlX21hdHJpeC5pIGZpbGVzIGluIHRoZSBweXRob24gdGVzdC1zdWl0ZS4KCgkgICAgTWVtb3J5IGZvb3RwcmludCBpcyBhbHNvIHJlZHVjZWQgaW4gY29uc2lkZXJhdGlvbiBvZiBzbWFsbAoJICAgIHBjcy9hcmNoaXRlY3R1cmVzLgoKCSAgLSBhZGQgY29tbWFuZGxpbmUgb3B0aW9ucyAtY3BwZXJyYXN3YXJuIGFuZCAtbm9jcHBlcnJhc3dhcm4iIHRvIGZvcmNlCiAgICAgICAgICAgIHRoZSBzd2lnIHByZXByb2Nlc3NvciB0byB0cmVhdCB0aGUgI2Vycm9yIGRpcmVjdGl2ZSBhcyBhICN3YXJuaW5nLgoJICAgIAoJICAgIHRoZSBwcmFnbWFzCgogICAgICAgICAgICAgICAjcHJhZ21hIFNXSUcgY3BwZXJyYXN3YXJuPTEKICAgICAgICAgICAgICAgI3ByYWdtYSBTV0lHIGNwcGVycmFzd2Fybj0wCgkgICAgICAgCgkgICAgYXJlIGVxdWl2YWxlbnQgdG8gdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zLCByZXNwZWN0aXZlbHkuCiAgICAgICAgICAgICAKCjEyLzA2LzIwMDU6IG1tYXR1cwoJICAgIFtQeXRob25dIFRoZSBnZW5lcmF0ZWQgY29kZSBpcyBub3cgbW9yZSBwb3J0YWJsZSwgZXNwZWNpYWxseQoJICAgIGZvciBXaW5kb3dzLiBGb2xsb3dpbmcgCgogICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cucHl0aG9uLm9yZy9kb2MvZmFxL3dpbmRvd3MuaHRtbAoKICAgICAgICAgICAgUHlfTm9uZSBpcyBuZXZlciBhY2Nlc3NlZCBhcyBhIHN0cnVjdHVyZSwgcGx1cyBvdGhlcgogICAgICAgICAgICB0cmlja3MgbWVudGlvbmVkIHRoZXJlLgoKMTIvMDYvMjAwNTogbW1hdHVzCgkgICAgW1B5dGhvbl0gQWRkZWQgaW5pdGlhbCBzdXBwb3J0IGZvciB0aHJlYWRzIGJhc2VkIGluIHRoZQoJICAgIHByb3Bvc2FsIGJ5IEpvc2VwaCBXaW5zdG9uLgoKCSAgICBUaGUgdXNlciBpbnRlcmZhY2UgaXMgYXMgZm9sbG93czoKCgkgICAgMS4tIHRoZSBtb2R1bGUgdGhyZWFkIHN1cHBvcnQgaXMgZW5hYmxlIHZpYSB0aGUgInRocmVhZHMiIG1vZHVsZQogICAgICAgICAgICAgICAgb3B0aW9uLCBpLmUuCgogICAgICAgICAgICAgICAgICAlbW9kdWxlKCJ0aHJlYWRzIj0xKQoKICAgICAgICAgICAgMi4tIEVxdWl2YWxlbnQgdG8gdGhhdCwgaXMgdGhlIG5ldyAnLXRocmVhZHMnIHN3aWcgb3B0aW9uCgogICAgICAgICAgICAgICAgICBzd2lnIC10aHJlYWRzIC1weXRob24gLi4uCgogICAgICAgICAgICAzLi0gWW91IGNhbiBwYXJ0aWFsbHkgZGlzYWJsZSB0aHJlYWQgc3VwcG9ydCBmb3IgYSBnaXZlbgogICAgICAgICAgICAgICAgbWV0aG9kIHVzaW5nOgoKICAgICAgICAgICAgICAgICAgJWZlYXR1cmUoIm5vdGhyZWFkIikgbWV0aG9kOwogICAgICAgICAgICAgICAgb3IKCQkgICVub3RocmVhZCBtZXRob2Q7CgogICAgICAgICAgICAgICAgYWxzbywgeW91IGNhbiBkaXNhYmxlIHNlY3Rpb25zIG9mIHRoZSB0aHJlYWQgc3VwcG9ydCwgCiAgICAgICAgICAgICAgICBmb3IgZXhhbXBsZQoKICAgICAgICAgICAgICAgICAgJWZlYXR1cmUoIm5vdGhyZWFkYmxvY2siKSBtZXRob2Q7CiAgICAgICAgICAgICAgICBvcgoJCSAgJW5vdGhyZWFkYmxvY2sgbWV0aG9kOwoKICAgICAgICAgICAgICAgICAgJWZlYXR1cmUoIm5vdGhyZWFkYWxsb3ciKSBtZXRob2Q7CiAgICAgICAgICAgICAgICBvcgoJCSAgJW5vdGhyZWFkYWxsb3cgbWV0aG9kOwoKICAgICAgICAgICAgICAgIHRoZSBmaXJzdCBkaXNhYmxlcyB0aGUgQysrL3B5dGhvbiB0aHJlYWQgcHJvdGVjdGlvbiwgYW5kIHRoZQogICAgICAgICAgICAgICAgc2Vjb25kIGRpc2FibGVzIHRoZSBweXRob24vQysrIHRocmVhZCBwcm90ZWN0aW9uLiAKCiAgICAgICAgICAgIDQuLSBUaGUgY3VycmVudCB0aHJlYWQgc3VwcG9ydCBpcyBiYXNlZCBpbiB0aGUgUHlHSUwKICAgICAgICAgICAgICAgIGV4dGVuc2lvbiBwcmVzZW50IGluIHB5dGhvbiB2ZXJzaW9uIDIuMyBvciBsYXRlciwgYnV0CiAgICAgICAgICAgICAgICB5b3UgY2FuIHByb3ZpZGUgdGhlIHRocmVhZCBjb2RlIGZvciBvbGRlciB2ZXJzaW9ucyBieQogICAgICAgICAgICAgICAgZGVmaW5pbmcgdGhlIG1hY3JvcyBpbiBweXRocmVhZHMuc3dnLgoKCQlJZiB5b3UgZ2V0IGEgd29ya2luZyBpbXBsZW1lbnRhdGlvbiBmb3Igb2xkZXIgdmVyc2lvbnMsCgkJcGxlYXNlIHNlbmQgdXMgYSBwYXRjaC4KCiAgICAgICAgICAgIEZvciB0aGUgY3VyaW91cyBhYm91dCBwZXJmb3JtYW5jZSwgaGVyZSBhcmUgc29tZSBudW1iZXJzCiAgICAgICAgICAgIGZvciB0aGUgcHJvZmlsZXRlc3QuaSB0ZXN0LCB3aGljaCBpcyB1c2VkIHRvIGNoZWNrIHRoZSBzcGVlZAoJICAgIG9mIHRoZSB3cmFwcGVkIGNvZGU6CgoJICAgICAgICBub3RocmVhZCAgICAgICAgICAgOS42cyAgKG5vIHRocmVhZCBjb2RlKQoJCW5vdGhyZWFkYmxvY2sgICAgIDEyLjJzICAob25seSAnYWxsb3cnIGNvZGUpCgkJbm90aHJlYWRhbGxvdyAgICAgMTMuNnMgIChvbmx5ICdibG9jaycgY29kZSkKICAgICAgICAgICAgICAgIGZ1bGwgdGhyZWFkICAgICAgIDE1LjVzICAoJ2FsbG93JyArICdibG9jaycgY29kZSkKCSAgICAKCSAgICBpLmUuLCBmdWxsIHRocmVhZCBjb2RlIGRlY3JlYXNlcyB0aGUgd3JhcHBpbmcgcGVyZm9ybWFuY2UgYnkKCSAgICBhcm91bmQgNjAlLiBJZiB0aGF0IGlzIGltcG9ydGFudCB0byB5b3VyIGFwcGxpY2F0aW9uLCB5b3UKCSAgICBjYW4gdHVuZSBlYWNoIG1ldGhvZCB1c2luZyB0aGUgZGlmZmVyZW50ICdub3RocmVhZCcsCgkgICAgJ25vdGhyZWFkYmxvY2snIG9yICdub3RocmVhZGFsbG93JyBmZWF0dXJlcyBhcwoJICAgIG5lZWRlZC4gTm90ZSB0aGF0IGZvciBzb21lIG1ldGhvZHMgZGVhY3RpdmF0aW5nIHRoZQoJICAgICd0aHJlYWQgYmxvY2snIG9yICd0aHJlYWQgYWxsb3cnIGNvZGUgaXMgbm90IGFuIG9wdGlvbiwKCSAgICBzbywgYmUgY2FyZWZ1bC4KCSAgICAKCjExLzI2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFNXSUcgbGlicmFyeSBmaWxlcyB1c2Ugc3lzdGVtIGFuZ2xlIGJyYWNrZXRzIGV2ZXJ5d2hlcmUgZm9yICVpbmNsdWRlLCBlZwogICAgICAgICAgICAgICVpbmNsdWRlICJzdGRfY29tbW9uLmkiCiAgICAgICAgICAgIGJlY29tZXMKICAgICAgICAgICAgICAlaW5jbHVkZSA8c3RkX2NvbW1vbi5pPgoKMTEvMjYvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXQogICAgICAgICAgICBUeXBlc2FmZSBlbnVtcyBhbmQgcHJvcGVyIGVudW1zIGhhdmUgYW4gZXh0cmEgY29uc3RydWN0b3Igc28gdGhhdCBlbnVtIGl0ZW0gdmFsdWVzIHRoYXQKICAgICAgICAgICAgYXJlIGluaXRpYWxpc2VkIGJ5IGFub3RoZXIgZW51bSBpdGVtIHZhbHVlIGNhbiBiZSB3cmFwcGVkIHdpdGhvdXQgaGF2aW5nIHRvIHVzZSAlamF2YWNvbnN0dmFsdWUvCiAgICAgICAgICAgICVjc2NvbnN0dmFsdWUgZm9yIHdoZW4gdXNpbmcgJWphdmFjb25zdCgxKS8lY3Njb25zdCgxKS4gU3VnZ2VzdGlvbiBieQogICAgICAgICAgICBCb2IgTWFyaW5pZXIvRG91Z2xhcyBQZWFyc29uLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgdHlwZWRlZiBlbnVtCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHh5eiwKICAgICAgICAgICAgICAgICBsYXN0ID0geHl6CiAgICAgICAgICAgICAgfSByZXBlYXQ7CgoxMS8yMS8yMDA1OiBtbWF0dXMKCSAgICBbcnVieSArIHB5dGhvbl0KCgkgICAgRml4ZXMgZm9yIGRpcmVjdG9ycyArIHBvaW50ZXJzLiBUaGlzIGlzIGFuIHVnbHkgcHJvYmxlbSB3aXRob3V0IGFuIGVhc3kKCSAgICBzb2x1dGlvbi4gQmVmb3JlIHdlIGlkZW50aWZpZWQgdGhpcyBjYXNlIGFzIHByb2JsZW1hdGljOgoKCSAgICAgICAgICB2aXJ0dWFsIGNvbnN0IE15Q2xhc3MmIG15X21ldGhvZCgpOwoKICAgICAgICAgICAgYnV0IGl0IHR1cm5zIG91dCB0aGF0IGFsbCB0aGUgY2FzZXMgd2hlcmUgYSBwb2ludGVyLCBhcnJheSBvcgogICAgICAgICAgICByZWZlcmVuY2UgaXMgcmV0dXJuZWQsIGFyZSBwcm9ibGVtYXRpYywgZXZlbiBmb3IgCgkgICAgcHJpbWl0aXZlIHR5cGVzIChhcyBpbnQsIGRvdWJsZSwgY2hhciosIGV0YykuCgoJICAgIFRvIHRyeSB0byBmaXggdGhlIGlzc3VlLCBhIG5ldyB0eXBlbWFwIHdhcyBhZGRlZCwKCSAgICAnZGlyZWN0b3JmcmVlJywgd2hpY2ggaXMgdXNlZCB0byAnZnJlZScgdGhlIHJlc291cmNlcwoJICAgIGFsbG9jYXRlZCBkdXJpbmcgdGhlICdkaXJlY3Rvcm91dCcgcGhhc2UuIEF0IHRoZSBzYW1lCgkgICAgdGltZSwgYSBwcmltaXRpdmUgZ2FyYmFnZSBjb2xsZWN0b3IgZW5naW5lIHdhcyBhZGRlZCB0bwoJICAgIGRlYWwgd2l0aCBvcnBoYW5lZCBhZGRyZXNzZXMsIHdoZW4gbmVlZGVkLgoJICAgIAoJICAgIFRoZSBzaXR1YXRpb24gaXMgbXVjaCBiZXR0ZXIgbm93LCBidXQgc3RpbGwgaXQgaXMgcG9zc2libGUgdG8gaGF2ZQoJICAgIG1lbW9yeSBleGhhdXN0YXRpb24gaWYgcmVjdXJzaW9uIGlzIHVzZWQuCgoJICAgIFNvLCBzdGlsbCB5b3UgbmVlZCB0byBhdm9pZCByZXR1cm5pbmcgcG9pbnRlcnMsIGFycmF5cyBvcgoJICAgIHJlZmVyZW5jZXMgd2hlbiB1c2luZyBkaXJlY3RvciBtZXRob2RzLgoKCSAgICAtIEFkZGVkIHN0ZGludC5pIC0gdHlwZW1hcHMgZm9yIGxhdGVzdCBDOTkgaW50ZWdyYWwgdHlwZXMgZm91bmQgaW4gc3RkaW50LmguCgkgICAgCjExLzE0LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIE1vcmUgdHlwZXMgYWRkZWQgdG8gd2luZG93cy5pLCBlZyBVSU5UOCwgV09SRCwgQllURSBldGMuIAogICAgICAgICAgICBJbmNsdWRpbmcgd2luZG93cy5pIHdpbGwgYWxzbyBlbmFibGUgU1dJRyB0byBwYXJzZSB0aGUgX19kZWNsc3BlYyBNaWNyb3NvZnQKICAgICAgICAgICAgZXh0ZW5zaW9uLCBlZyBfX2RlY2xzcGVjKGRsbGltcG9ydCkuIEFsc28gb3RoZXIgV2luZG93cyBjYWxsaW5nIGNvbnZlbnRpb25zCiAgICAgICAgICAgIHN1Y2ggYXMgX19zdGRjYWxsLgoKMTEvMTAvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgTmV3IGxpYnJhcnkgZmlsZSBmb3IgV2luZG93cyAtIHdpbmRvd3MuaS4gVGhpcyBmaWxlIHdpbGwgY29udGFpbiB1c2VmdWwgdHlwZQogICAgICAgICAgICBpbmZvcm1hdGlvbiBmb3IgdXNlcnMgd2hvIGluY2x1ZGUgd2luZG93cy5oLiBJbml0aWFsIHN1cHBvcnQgaXMgZm9yIHRoZQogICAgICAgICAgICBub24gSVNPIGludGVncmFsIHR5cGVzOiBfX2ludDgsIF9faW50MTYsIF9faW50MzIsIF9faW50NjQgYW5kIHVuc2lnbmVkIHZlcnNpb25zLgogICAgICAgICAgICBUaGUgdW5zaWduZWQgdmVyc2lvbnMgcHJldmlvdXNseSBjb3VsZCBub3QgYmUgcGFyc2VkIGJ5IFNXSUcuICBTRiAjODcyMDEzLgoKMTEvMDkvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBQb3J0YWJpbGl0eSB3YXJuaW5nIGZvciBmaWxlcyB3aGljaCB3aWxsIG92ZXJ3cml0ZSBlYWNoIG90aGVyIG9uIGNhc2UKICAgICAgICAgICAgaW5zZW5zaXRpdmUgZmlsZSBzeXN0ZW1zIHN1Y2ggYXMgRkFUMzIvTlRGUy4gVGhpcyB3aWxsIG9jY3VyLCBmb3IgZXhhbXBsZSwgd2hlbiB0d28KICAgICAgICAgICAgY2xhc3MgbmFtZXMgYXJlIHRoZSBzYW1lIGJhcnJpbmcgY2FzZS4gVGhlIHdhcm5pbmcgaXMgaXNzdWVkIG9uIGFsbCBwbGF0Zm9ybXMgYW5kCiAgICAgICAgICAgIGNhbiBiZSBzdXBwcmVzc2VkIHdpdGggdGhlIHVzdWFsIHdhcm5pbmcgc3VwcHJlc3Npb24gdGVjaG5pcXVlcy4gU0YgYnVnICMxMDg0NTA3LgoKMTEvMDkvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgLi9jb25maWd1cmUgLS13aXRoLXB5dGhvbiAtLXdpdGgtcnVieSAtLXdpdGgtcGVybDUgZXRjIGVuYWJsZSB0aGVzZSBsYW5ndWFnZXMsCiAgICAgICAgICAgIGllIHRoZSAtLXdpdGgteHh4eCBvcHRpb25zLCB3aGVyZSBubyBwYXRoIGlzIHNwZWNpZmllZCwgd29yayB0aGUgc2FtZSBhcyBpZiAKICAgICAgICAgICAgdGhlIG9wdGlvbiB3YXMgbm90IHNwZWNpZmllZCBhdCBhbGwuIEJhc2VkIG9uIHBhdGNoZXMgIzEzMzUwNDIgIzEzMjkwNDggIzEzMjkwNDcuCgoxMS8wOS8yMDA1OiBkYW5jeQoKCSAgICBbQWxsZWdyb2NsXQoJICAgIEFkZCBDKysgc3VwcG9ydCB0byB0aGUgQWxsZWdyb2NsIG1vZHVsZS4gRnVydGhlcgoJICAgIGVuaGFuY2VzIHRoZSBDIHN1cHBvcnQgYXMgd2VsbC4gU29tZSBvZiB0aGUKCSAgICBmZWF0dXJlczoKCgkgICAgLSBNVUNIIGJldHRlciBnZW5lcmF0aW9uIG9mIGZvcmVpZ24gdHlwZXMgYmFzZWQgb24KCSAgICB0aGUgQy9DKysgdHlwZXMgZm9yIHVzZSBpbiBkZWZpbmluZyB0aGUgRkZJIG9uCgkgICAgdGhlIGxpc3Agc2lkZS4gV2UgZG9uJ3QgcGFzcyBldmVyeXRoaW5nIGFzIGEgKCogOnZvaWQpCgkgICAgYW55IGxvbmdlci4KCgkgICAgLSBVc2VzIHR5cGVtYXBzIGZvciBiZXR0ZXIgY29udHJvbCBvZiB0eXBlIGNvbnZlcnNpb25zCgkgICAgYW5kIGNvZGUgZ2VuZXJhdGlvbiBpbiB0aGUgZ2VuZXJhdGVkIGxpc3AgYW5kIGMrKyB3cmFwcGVyCgkgICAgY29kZS4KCgkgICAgLSBDTE9TIHdyYXBwaW5nIG9mIHBvaW50ZXJzIHJldHVybmVkIGZyb20gZm9yZWlnbiBzcGFjZQoJICAgIG1ha2VzIGl0IGVhc2llciB0byBkaWZmZXJlbnRpYXRlIHBvaW50ZXJzIGluIHVzZXIgY29kZS4KCSAgICBUaGUgd3JhcHBpbmcgb2JqZWN0cyBjYW4gYmUgcGFzc2VkIGRpcmVjdGx5IHRvIEZGIGNhbGxzLgoKCSAgICAtIERlZnVuIHdyYXBwaW5nIG9mIEZGIGNhbGxzLCBhbGxvd2luZyBmb3IgbW9yZSBsaXNweQoJICAgIGludGVyZmFjZS4gQ29udmVyc2lvbiwgR0NpbmcsIG9mIGxpc3Agb2JqZWN0cyB0byAKCSAgICBmb3JlaWduIG9iamVjdHMgY2FuIGJlIGRvbmUgaW4gdGhlIHdyYXBwaW5nIGRlZnVuIHZpYQoJICAgIHRoZSB1c2Ugb2YgdHlwZW1hcHMuCgkgICAgCgkgICAgLSBvdmVybG9hZCBkaXNwYXRjaGluZyBpbXBsZW1lbnRlZCBvbiB0aGUgbGlzcCBzaWRlCgkgICAgdXNpbmcgZ2VuZXJpYyBmdW5jdGlvbnMuCgoJICAgIC0gVGVtcGxhdGVzIGFuZCBzeW5vbnltb3VzIHR5cGVzIHN1cHBvcnRlZC4KCjExLzA3LzIwMDU6IG1tYXR1cwoKCSAgICBbUHl0aG9uXSBBZGRpbmcgcHJvcGVyIHN1cHBvcnQgZm9yIG11bHRpLWluaGVyaXRhbmNlIGluCgkgICAgdGhlIHB5dGhvbiBzaWRlLCBpZSwgaWYgeW91IGhhdmUgdHdvIEMrKyB3cmFwcGVkIGNsYXNzLCBGb28KCSAgICBhbmQgQmFyLCBub3c6CgoJICAgICAgIGNsYXNzIE15UHl0aG9uQ2xhc3MoRm9vLEJhcik6CgkgICAgICAgICAgLi4uLgoKICAgICAgICAgICAgd2lsbCBwcm9wZXJseSB3b3JrLCBldmVuIHdpdGggZGlyZWN0b3JzLCBhbmQgdGhlCiAgICAgICAgICAgIGRlYWxsb2NhdGlvbiBvZiBGb28udGhpcyBhbmQgQmFyLnRoaXMgd2lsbCBmb2xsb3cKICAgICAgICAgICAgY29ycmVjdGx5LiBCZWZvcmUsIGEgY2xhc3MgY291bGQgb25seSBoYXZlIG9uZSAndGhpcycKICAgICAgICAgICAgaW5zdGFuY2UgKHVubGlrZSBDKyspLCBvbmx5IHRoZSBsYXN0IGJhc2UgY2xhc3Mgd2FzCiAgICAgICAgICAgIHByb3Blcmx5IGRlbGV0ZWQsIG9yIGRldGVjdGVkIHdpdGggZGlyZWN0b3JzLgoKCSAgICBOb3cgJ3NlbGYudGhpcycgY2FuIGJlIGEgbGlzdCwgd2hpY2ggd2lsbCBjb250YWluIHRoZSBDKysKCSAgICBpbnN0YW5jZSBwb2ludGVycyBmb3IgYWxsIHRoZSBiYXNlIGNsYXNzZXMuCgkgICAgCgkgICAgQWxzbywgc3dpZy50aGlzIGlzIHJlc3BvbnNpYmxlIGZvciBkZWFsbG9jYXRpbmcgdGhlIEMrKwoJICAgIGluc3RhbmNlKHMpLCBhbmQgdGhlIF9fZGVsX18gbWV0aG9kIGlzIG5vdCBlbWl0dGVkIHVubGVzcwoJICAgIHRoZSB1c2VyIHByZXBwZW5kL2FwcGVuZCBzb21lIGNvZGUgdG8gaXQuCgoJICAtIFN3aWcgY2FuIG5vdyBkZXRlY3QgbWVtb3J5IGxlYWtzLCBpZSwgaWYgeW91IHN0aWxsCgkgICAgZG9uJ3QgdXNlIHByb3h5L3NoYWRvdyBjbGFzc2VzLCBhbmQgdHlwZSBzb21ldGhpbmcgbGlrZQoJICAgIAoJICAgICAgICAgaW1wb3J0IF9leGFtcGxlCgkgICAgICAgICBmID0gX2V4YW1wbGUubmV3X0ZvbygpCgoJICAgIGFuZCBmb3JnZXQgdG8gY2FsbCBfZXhhbXBsZS5kZWxldGVfRm9vKGYpLCB0aGVuIHN3aWcgd2lsbAoJICAgIHRlbGwgeW91IHRoYXQgdGhlcmUgaXMgYSBtZW1vcnkgbGVhay4KCgkgICAgT3RoZXJ3aXNlLCBpZiB5b3UgYWx3YXlzIHVzZSB0aGUgcHJveHkgY2xhc3NlcywgeW91IHByb2JhYmx5CgkgICAgeW91IHdpbGwgbmV2ZXIgZXZlciBzZWUgdGhpcyB3YXJuaW5nIHVubGVzcyB0aGVyZSBpcwoJICAgIHNvbWV0aGluZyB3cm9uZyBpbnNpZGUgdGhlIHN3aWcgd3JhcHBpbmcgY29kZS4KCSAgICAgICAKCQogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCSAgICAKCSAgICBJZiB5b3Ugb3ZlcmxvYWRlZCB0aGUgX19kZWxfXyBtZXRob2QsIGFuZCBjYWxsIHRoZSBiYXNlCgkgICAgb25lCSB3aXRob3V0IGEgdHJ5IGJsb2NrLCBhcyBpbgoKCSAgICAgICAgICAgY2xhc3MgTXlDbGFzcyhTd2lnQ2xhc3MpOgoKCSAgICAgICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CgkJICAgICAgICAgIDx5b3VyIGNvZGUgaGVyZT4KCQkgICAgICAgICAgU3dpZ0NsYXNzLl9fZGVsX18oc2VsZikKCQkJICAKICAgICAgICAgICAgcHl0aG9uIGNvdWxkIGNvbXBsYWluIHRoYXQgdGhlIG1ldGhvZCBTd2lnQ2xhc3MuX19kZWxfXyBpcwogICAgICAgICAgICB1bmRlZmluZWQuIFRyeSB0byB1c2UgaW5zdGVhZDoKCSAgICAKCSAgICAgICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CgkJICAgICAgICAgIDx5b3VyIGNvZGUgaGVyZT4KCQkgICAgICAgICAgdHJ5OiBTd2lnQ2xhc3MuX19kZWxfXyhzZWxmKQoJCQkgIGV4Y2VwdDogcGFzcwoKCSAgICBvciBzaW1wbHkgCQkgIAoKCSAgICAgICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CgkJICAgICAgICAgIDx5b3VyIGNvZGUgaGVyZT4KCjExLzAyLzIwMDU6IG1tYXR1cwoKCSAgICBbUHl0aG9uXSBBZGRpbmcgbW9yZSBmdW4gdG8gU1RML1NURCBjb250YWluZXJzLCBub3cgeW91CgkgICAgY2FuIGRvCgoJICAgICAgICV0ZW1wbGF0ZShweXNldCkgc3RkOjpzZXQ8UHlPYmplY3QgKj47CQkKCSAgICAgICAldGVtcGxhdGUocHl2ZWN0b3IpIHN0ZDo6dmVjdG9yPFB5T2JqZWN0ICo+OwkKCSAgICAgICAldGVtcGxhdGUoKSBzdGQ6OnBhaXI8UHlPYmplY3QgKixQeU9iamVjdCAqPjsJCgkgICAgICAgJXRlbXBsYXRlKHB5dmVjdG9yKSBzdGQ6Om1hcDxQeU9iamVjdCAqLFB5T2JqZWN0ICo+OwoJICAgICAgIC4uLi4KCgkgICAgVGhlIHNhbWUgIGFwcGxpZXMgdG8gc3RkOjpsaXN0LCBzdGQ6OmRlcXVlLCBzdGQ6Om11bHRpc2V0LCBldGMuCgoJICAgIFRoZW4sIGF0IHRoZSBweXRob24gc2lkZSB5b3UgY2FuIGRvIG5vdzoKCgkgICAgICAgIyBDKysgc3RkOjp2ZWN0b3IgYXMgbmF0aXZlIHB5dGhvbiBzZXF1ZW5jZQoJICAgICAgIHYgPSBweXZlY3RvcihbMSwiaGVsbG8iLCgxLDIpXSkKCSAgICAgICBwcmludCB2WzFdCgkgICAgICAgPj4gJ2hlbGxvJwoJICAgICAgIHByaW50IHZbMl0KCSAgICAgICA+PiAoMSwyKQoJICAgICAgIAkJCQkJICAgCgkgICAgICAgIyBDKysgc3RkOjpzZXQgYXMgbmF0aXZlIHB5dGhvbiBzZXF1ZW5jZQoJICAgICAgIHMgPSBweXNldCgpCQkJICAgCgkgICAgICAgcy5pbnNlcnQoKDEsMikpCQkgICAKCSAgICAgICBzLmluc2VydCgxKQkJCSAgIAoJICAgICAgIHMuaW5zZXJ0KCJoZWxsbyIpCgkgICAgICAgc3VtPSgpCgkgICAgICAgZm9yIGkgaW4gczoKCSAgICAgICAgIHN1bSArPShpLCkKCSAgICAgICBwcmludCBzdW0KCSAgICAgICA+Pj4gKDEsICdoZWxsbycsICgxLCAyKSkKCSAgICAgICAJCQkJICAgCgkgICAgICAgIyBDKysgc3RkOjptYXAgYXMgbmF0aXZlIHB5dGhvbiBzZXF1ZW5jZQoJICAgICAgIG0gPSBweW1hcCgpCQkJICAgCgkgICAgICAgbVsiZm9vIl0gPSAiaGVsbG8iCQkgICAKCSAgICAgICBtWzFdID0gKDEsMikKCSAgICAgICBwbSA9IHt9CgkgICAgICAgZm9yIGsgaW4gbToJICAgIAkgICAKCSAgICAgICAgIHBtW2tdID0gbVtrXQoJICAgICAgIHByaW50IHBtCgkgICAgICAgPj4+IHsxOiAoMSwgMiksICdmb28nOiAnaGVsbG8nfQoKCSAgICBpZSwgdGhlIFNURC9TVEwgY29udGFpbmVycyB3b3JrIGFzIHJlYWwgbmF0aXZlIHB5dGhvbgoJICAgIGNvbnRhaW5lciwgd2l0aCBhcmJpdHJhcnkgaXRlbSB0eXBlcyBhbmQgc28uCgoJICAgIEJ1dCBzaW5jZSBub3JtYWwgQysrIGNvbnRhaW5lcnMgZG8gbm90IHByb3Blcmx5IHJlZi91bnJlZgoJICAgIHRoZWlyIGl0ZW1zLCB5b3Ugc2hvdWxkIHVzZSB0aGUgc2FmZXIgdmVyc2lvbnM6CgkgICAgCgkgICAgICAldGVtcGxhdGUocHlzZXQpIHN0ZDo6c2V0PHN3aWc6OlB5T2JqZWN0X3B0cj47CgkgICAgICAldGVtcGxhdGUocHl2ZWN0b3IpIHN0ZDo6dmVjdG9yPHN3aWc6OlB5T2JqZWN0X3B0cj47CgkgICAgICAldGVtcGxhdGUoKSBzdGQ6OnBhaXI8c3dpZzo6UHlPYmplY3RfcHRyLCBzd2lnOjpQeU9iamVjdF9wdHI+OwoJICAgICAgJXRlbXBsYXRlKHB5dmVjdG9yKSBzdGQ6Om1hcDxzd2lnOjpQeU9iamVjdF9wdHIsc3dpZzo6UHlPYmplY3RfcHRyPjsKCSAgICAgIC4uLi4KCgkgICAgd2hlcmUgc3dpZzo6UHlPYmplY3RfcHRyIGlzIGEgUHlPYmplY3QgKiBlbnZlbG9wZSBjbGFzcyBwcm92aWRlZAoJICAgIHRvIHNhZmVseSBpbmNyZWYvZGVjcmVmIHRoZSBweXRob24gb2JqZWN0LiAKCSAgICAKCSAgICBTbywgbm93IHlvdSBjYW4gdXNlIGFsbCB0aGUgU1RML1NURCBjb250YWluZXJzIGFzIG5hdGl2ZQoJICAgIFB5dGhvbiBjb250YWluZXJzLiAKCgkgICAgTm90ZSAxOiBzdGQ6Om1hcCwgc3RkOjpzZXQgYW5kIHRoZSBvdGhlciAnb3JkZXJlZCcKCSAgICBjb250YWluZXJzIHdpbGwgcHJvcGVybHkgdXNlIFB5T2JqZWN0X0NvbXBhcmUgZm9yIHNvcnRpbmcsCgkgICAgd2hlbiBuZWVkZWQuCgoJICAgIE5vdGUgMjogYWxsIHRoZSBTVEwvU1REIGNvbnRhaW5lcnMgaGF2ZSBhIGxpbWl0IHNpemUgb2YKCSAgICBTSVpFX01BWCwgaWUsIHlvdSBjYW4gaGF2ZSBtYW5hZ2UgY29udGFpbmVycyBsYXJnZXIgdGhhbgoJICAgIElOVF9NQVgsIHRoZSBweXRob24gbGltaXQuCgkgICAgCgkgICAgICAKMTEvMDIvMjAwNTogbW1hdHVzCgoJICAgIFtQeXRob25dCgkgICAgLSBhZGQgJ2l0ZXJhdG9yKCknIG1ldGhvZCBmb3IgYWxsIHNlcXVlbmNlcyBhbmQgYWRkaXRpb25hbGx5CgkgICAgICAna2V5X2l0ZXJhdG9yKCknIGZvciBtYXBzLgoKCSAgICAgICdpdGVyYXRvcigpJyB3aWxsIGFsd2F5cyByZXR1cm4gdGhlIG5hdGl2ZSBDKysgaXRlcmF0b3IuCgkgICAgICBBZGRpdGlvbmFsbHksIGluIG1hcHMsICdrZXlfaXRlcmF0b3IoKScgd2lsbCByZXR1cm4gYSBweXRob24KCSAgICAgIGl0ZXJhdG9yIHVzaW5nIG9ubHkgdGhlIG1hcCBrZXlzLgoJICAgICAgCgkgICAgICBJbiBnZW5lcmFsIHRoZSBzZXF1ZW5jZSBtZXRob2QgX19pdGVyX18gd2lsbCBjYWxsCgkgICAgICAnaXRlcmF0b3IoKScsIHJldHVybmluZyB0aGUgbmF0aXZlIEMrKyBpdGVyYXRvciwgYnV0IGluCgkgICAgICBtYXBzIGl0IHdpbGwgY2FsbCAna2V5X2l0ZXJhdG9yKCknLCBtYWludGFpbmluZwoJICAgICAgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KCgkgICAgICBIZW5jZSwgZm9yIHN0ZDo6bWFwcywgeW91IGNhbiBwbGF5IHRoZW4gd2l0aCB0aGUgbmF0aXZlCgkgICAgICBDKysgaXRlcmF0b3IsIHdoaWNoIHZhbHVlIGlzIGEgKGtleSwgdmFsdWUpIHBhaXIsIGJ5CgkgICAgICBjYWxsaW5nIG1hcC5pdGVyYXRvcigpLCBhcyB3aXRoIG1hcC5iZWdpbigpLCBtYXAuZW5kKCksIGV0Yy4KCgkgICAgICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IG1hcC5pdGVyYXRvcigpIHJldHVybnMgYSBzYWZlCgkgICAgICAnY2xvc2VkJyBpdGVyYXRvciwgd2hpbGUgbWFwLmJlZ2luKCkgYW5kIG1hcC5lbmQoKSBhcmUKCSAgICAgICdvcGVuJyBpdGVyYXRvcnMuCgoJICAgICAgQSAnY2xvc2VkJyBpdGVyYXRvciBrbm93cyB0aGUgYmVnaW4gYW5kIHRoZSBlbmQgb2YgdGhlCgkgICAgICBzZXF1ZW5jZSwgYW5kIGl0IG5ldmVyIGNhbiBzZWcuIGZhdWx0LiBBbiAnb3BlbicKCSAgICAgIGl0ZXJhdG9yLCBhcyBpbiBDKyssIGNhbiBzZWcuIGZhdWx0IGF0IHRoZSBDKysgc2lkZS4KCgkgICAgICAgICAjIGEgY2xvc2VkIGl0ZXJhdG9yIGlzIHNhZmUgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLgoJCSAjIHRoZSBuZXh0KCkgbWV0aG9kIHdpbGwgdGhyb3cgYSBTdG9wSXRlcmF0aW9uCgkgICAgICAgICAjIGV4Y2VwdGlvbiBhcyBuZWVkZWQKCQoJICAgICAgICAgaSA9IHNlcS5pdGVyYXRvcigpCgkJIHRyeToKICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CgkJICAgICAgICBzdW0gKz0gaS5uZXh0KCkKCQkgZXhjZXB0OiBwYXNzCgkJIAoJCSAjIGFuIG9wZW4gaXRlcmF0b3IgYWx3YXlzIG5lZWQgdG8gYmUgY2hlY2tlZCwKCQkgIyBvciBpdCB3aWxsIGNyYXNoIGF0IHRoZSBDKysgc2lkZQoKCSAgICAgICAgIGN1cnJlbnQgPSBzZXEuYmVnaW4oKQogICAgICAgICAgICAgICAgIGVuZCA9IHNlcS5lbmQoKQoJCSB3aGlsZSAoY3VycmVudCAhPSBlbmQpOgoJCSAgICBzdW0gKz0gY3VycmVudC5uZXh0KCkKCSAgICAgIAoJICAgICAgCgkgICAgW1B5dGhvbl0KCSAgICAtIEZpbmFsbHksIHdoZW4gd2UgY2FsbCAKCgkgICAgICAgIGYgPSBGb28oKQoKCSAgICAgIHRoZSBjb25zdHJ1Y3Rpb24gaXMgJ29uZS13YXknLiBCZWZvcmUgY29uc3RydWN0aW9uICB3YXMgZG9uZQoJICAgICAgc29tZXRoaW5nIGxpa2UKCgkgICAgICAgICAgRm9vKCkgKHB5dGhvbikgLT4gX25ld19Gb28oKSAoQysrKSAKICAgICAgICAgICAgICAgICAgbmV3X0ZvbygpIChDKyspIC0+IEZvb1B0cigpIChweXRob24pIAogICAgICAgICAgICAgICAgICBGb29QdHIoKSAocHl0aG9uKSAtPiBGb28oKSAocHl0aG9uKQoKICAgICAgICAgICAgICBhbmQgcmV0dXJuaW5nIGEgcG9pbnRlciB3YXMgZG9uZSBsaWtlCgogICAgICAgICAgICAgICAgICBOZXdQb2ludGVyT2JqKCkgKEMrKykgLT4gRm9vUHRyKCkgKHB5dGhvbikKICAgICAgICAgICAgICAgICAgRm9vUHRyKHB5dGhvbikgLT4gRm9vKCkgKHB5dGhvbikKICAgICAgICAgICAgICAgICAgCQkgIAoKCSAgICAgIGllLCB3ZSB3aGVuIGdvaW5nIGJhY2sgYW5kIGZvcndhcmQgYmV0d2VlbiB0aGUgQysrIGFuZAoJICAgICAgcHl0aG9uIHNpZGUuCgoJICAgICAgTm93IHNpbmNlIHRoZXJlIGlzIG5vIEZvb1B0ciB0aGUgY29uc3RydWN0aW9uIHByb2Nlc3MgaXMKCgkgICAgICAgICAgRm9vKCkgKHB5dGhvbikgLT4gX25ld19Gb28oKSAoQysrKQogICAgICAgICAgICAgICAgICBfbmV3X0ZvbygpIChDKyspIC0+IE5ld1BvaW50ZXJPYmooKSAoQysrKSAobm8gc2hhZG93IGNsYXNzKQoKICAgICAgICAgICAgICBhbmQgcmV0dXJuaW5nIGEgcG9pbnRlciBpcyBkb25lCgogICAgICAgICAgICAgICAgICBOZXdQb2ludGVyT2JqKCkgKEMrKykgKHdpdGggc2hhZG93IGNsYXNzKSAtPiBOZXdJbnN0YWNlT2JqKCkgKEMrKykKCgkgICAgICB3aGVyZSBOZXdJbnN0YW5jZU9iaiBjcmVhdGVzIGEgbmV3IGluc3RhbmNlIHdpdGhvdXQKCSAgICAgIGNhbGxpbmcgX19pbml0X18gYW5kIGl0IGRvZXNuJ3QgZ28gJ2JhY2snIHRvIHB5dGhvbiwgaXMKCSAgICAgICdwdXJlJyBDIEFQSS4KCgkgICAgIC0gV2l0aCB0aGlzIGNoYW5nZSwgYW5kIHRoZSBvdGhlciBvbmVzIGluIHRoZQogICAgICAgICAgICAgICBQeVN3aWdPYmplY3QgdHlwZSwgd2hpY2ggbm93IGNhcnJpZXMgdGhlIHRoaXNvd24gYW5kCiAgICAgICAgICAgICAgIHN3aWdfdHlwZV9pbmZvIHBvaW50ZXIsIHRoZSBnZW5lcmF0ZWQgY29kZSBzaG91bGQgYmUgYXMKICAgICAgICAgICAgICAgZmFzdCBhcyBib29zdDo6UHl0aG9uIGFuZC9vciB0aGUgb3RoZXIgcHl0aG9uIHdyYXBwZXJzCiAgICAgICAgICAgICAgIGJhc2VkIGluIHB1cmUgUHl0aG9uL0MgQVBJIGNhbGxzLgoKCSAgICAgICBBcyBhIHJlZmVyZW5jZSwgdGhlIHByb2ZpbGV0ZXN0X3J1bm1lLnB5IGV4YW1wbGUsIHdoaWNoCgkgICAgICAgZG9lcyBhIHNpbXBsZSBjYWxsIGZ1bmN0aW9uIG1hbnkgdGltZXMsIHN1Y2ggYXMgdGhpcyBjb2RlOgoKICAgICAgICAgICAgICAgICAgICBpbXBvcnQgcHJvZmlsZXRlc3QgICAgICAgCgkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCQkgICAgYSA9IHByb2ZpbGV0ZXN0LkEoKSAgICAgIAoJCSAgICBiID0gcHJvZmlsZXRlc3QuQigpICAgICAgCgkJICAgIGZvciBpIGluIHJhbmdlKDAsMTAwMDAwMCkKCSAgICAgICAgICAgICAgYSA9IGIuZm4oYSkgICAgICAgICAgICAKCgoJICAgICAgIHdoZXJlIGZuIGlzIGRlZmluZWQgYXMgJ0EqIEI6OmZuKEEgKmEpIHtyZXR1cm4gYTt9JywKCSAgICAgICBwcm9kdWNlcyAgdGhlIGZvbGxvd2luZyB0aW1lcwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbW9kZXJuICAgIG1vZGVybgoJICAgICAgICAgc3dpZy0xLjMuMjYgICAgMTkuNzBzICAgICAgNS45OHMKICAgICAgICAgICAgICAgICBzd2lnLUNWUyAgICAgICAgMC45OXMgICAgICAwLjk4cwoJICAgICAgIAoKCSAgICAgICBDbGVhcmx5LCB0aGVyZSBpcyBhIGxhcmdlIGltcHJvdmVtZW50IGZvciB0aGUgcHl0aG9uCgkgICAgICAgJ25vbW9kZXJuJyBtb2RlLiBTdGlsbCwgdGhlICdtb2Rlcm4nIG1vZGUgaXMgYXJvdW5kCgkgICAgICAgNiB0aW1lcyBmYXN0ZXIgdGhhbiBiZWZvcmUuIEZvciB0aGUgc2FtZSB0ZXN0LCBidXQKCSAgICAgICB1c2luZyB0aGUgbm9uLXNoYWRvdyB2ZXJzaW9uIG9mIHRoZSBtb2R1bGUsIHdlIGdldAoKCSAgICAgICAgICAgICAgICAgICAgICAgX3Byb2ZpbGV0ZXN0IChub24tc2hhZG93KQoJICAgICAgICAgc3dpZy0xLjMuMjYgICAgIDAuODBzIAogICAgICAgICAgICAgICAgIHN3aWctQ1ZTICAgICAgICAwLjYwcyAKCgkgICAgICAgSGVuY2UsIG5vdyBmb3IgcHJhY3RpY2FsIHB1cnBvc2VzLCB0aGUgcHJveHkgb3ZlcmhlYWQKCSAgICAgICBpcyBpbnNpZ25pZmljYW50LgoKCSAgICAgICBOb3RlIHRoYXQgdGhlIHBlcmZvcm1hbmNlIG51bWJlcnMgd2UgYXJlIHNob3dpbmcgaXMgZm9yCgkgICAgICAgYSBzaW1wbGUgbW9kdWxlICh0d28gdHlwZXMpIGFuZCBhIHNpbXBsZSBmdW5jdGlvbiAob25lCgkgICAgICAgYXJndW1lbnQpLiBGb3IgcmVhbCBzaXR1YXRpb25zLCBmb3IgbW9kdWxlcyB3aXRoIG1hbnkKCSAgICAgICBtb3JlIHR5cGVzIGFuZC9vciBmdW5jdGlvbnMgd2l0aCBtYW55IG1vcmUgcGFyYW1ldGVycywKCSAgICAgICB5b3Ugd2lsbCBzZWUgZXZlbiBiZXR0ZXIgcmVzdWx0cy4KCSAgICAgICAKCQkgIAkgICAgICAKMTAvMzEvMjAwNTogbW1hdHVzCgkgICAgW1B5dGhvbl0KCgkgICAgLSBGaW5hbGx5LCBubyBtb3JlIENsYXNzUHRyIHByb3h5IGNsYXNzZXMuIFlvdSB3aWxsIHNlZQoJICAgICAgb25seSBhIGNsZWFuIENsYXNzIHByb3h5IGNsYXNzIGluIHRoZSAucHkgZmlsZS4KCgkgICAgLSBObyBtb3JlICdyZWFsJyB0aGlzb3duIGF0dHJpYnV0ZSBlaXRoZXIsIHRoZSBQeVN3aWdPYmplY3Qgbm93CiAgICAgICAgICAgICAgY2FycmllcyB0aGUgb3duZXJzaGlwIGluZm8uCgoJICAgICAgWW91IGNhbiBhbHNvIGRvIHNvbWV0aGluZyBsaWtlCgoJICAgICAgICAgIHByaW50IHNlbGYudGhpcy5vd24oKSAKCQkgID4+PiBUcnVlCgkJICAKCQkgIHNlbGYudGhpcy5kaXNvd24oKQoJCSAgc2VsZi50aGlzLm93bigwKQoJICAgICAgICAgIHByaW50IHNlbGYudGhpcy5vd24oKSAKCQkgID4+PiBGYWxzZQkJICAKCgkJICBzZWxmLnRoaXMuYWNxdWlyZSgpCgkJICBzZWxmLnRoaXMub3duKDEpCgkgICAgICAgICAgcHJpbnQgc2VsZi50aGlzLm93bigpIAoJCSAgPj4+IFRydWUKCgkgICAgICBTdGlsbCB0aGUgb2xkIHdheSwKCSAgICAgIAoJICAgICAgICAgIHByaW50IHNlbGYudGhpc293bgoJCSAgPj4+IFRydWUKCgkJICBzZWxmLnRoaXNvd24gPSAwCgkgICAgICAgICAgcHJpbnQgc2VsZi50aGlzb3duCgkJICA+Pj4gRmFsc2UJCSAgCgoJCSAgc2VsZi50aGlzb3duID0gMQoJICAgICAgICAgIHByaW50IHNlbGYudGhpc293bgoJCSAgPj4+IFRydWUKCiAgICAgICAgICAgICAgaXMgc3VwcG9ydGVkLCBhbmQgcHl0aG9uIGRpc3BhdGNoZXMgdGhlIHByb3BlciBtZXRob2QKICAgICAgICAgICAgICBjYWxscyBhcyBuZWVkZWQuIAkJICAKCSAgICAgICAKCgkgICAgLSBTdXBwb3J0IGZvciBpdGVyYXRvcnMgaW4gU1RML1NURCBjb250YWluZXJzLCBmb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUKCiAgICAgICAgICAgICAgICAgICAgJXRlbXBsYXRlPHNldF9zdHJpbmc+IHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPjsKCSAgICAgICAgICAKICAgICAgICAgICAgICAgeW91IGNhbiB1c2UgdGhlIEMrKyBpdGVyYXRvcnMgYXM6ICAKCiAgICAgICAgICAgICAgICAgICAgIHMgPSBzZXRfc3RyaW5nKCkKCQkgICAgICAgICAgICAgICAgICAgICAKCQkgICAgIHMuYXBwZW5kKCJjIikgICAKCQkgICAgIHMuYXBwZW5kKCJhIikgICAKCSAgICAgICAgICAgICBzLmFwcGVuZCgiYiIpCgogICAgICAgICAgICAgICAgICAgICBiID0gcy5iZWdpbigpICAgICAgCgkJICAgICBlID0gcy5lbmQoKSAgICAgICAgCgkJICAgICBzdW0gPSAiIiAgICAgICAgICAgCgkJICAgICB3aGlsZSAoYiAhPSBlKTogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gKz0gYi5uZXh0KCkgICAgICAgIAogICAgICAgICAgICAgICAgICAgICBwcmludCBzdW0KCiAgICAgICAgICAgICAgICAgICAgID4+PiAiYWJjIiAKCgkJYWR2YW5jZSB0aGUgaXRlcmF0b3IgYXMgaW4gQysrCgogICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gcy5iZWdpbigpICAgICAgCgkJICAgICBjdXJyZW50ICs9IDEKICAgICAgICAgICAgICAgICAgICAgcHJpbnQgY3VycmVudC52YWx1ZSgpCgkJICAgICA+Pj4gImIiCgkJICAgICAKCQlub3cgdXNpbmcgdGhlIHJldmVyc2Ugb3BlcmF0b3JzCgogICAgICAgICAgICAgICAgICAgICBiID0gcy5yYmVnaW4oKSAgICAgIAoJCSAgICAgZSA9IHMucmVuZCgpICAgICAgICAKCQkgICAgIHN1bSA9ICIiICAgICAgICAgICAKCQkgICAgIHdoaWxlIChiICE9IGUpOiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSBiLm5leHQoKSAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIHByaW50IHN1bQoKICAgICAgICAgICAgICAgICAgICAgPj4+ICJjYmEiIAoKCSAgICAgICAgb3IgdGhlICdwcmV2aW91cycgbWV0aG9kCgogICAgICAgICAgICAgICAgICAgICBiID0gcy5iZWdpbigpICAgICAgCgkJICAgICBlID0gcy5lbmQoKSAgICAgICAgCgkJICAgICBzdW0gPSAiIiAgICAgICAgICAgCgkJICAgICB3aGlsZSAoYiAhPSBlKTogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gKz0gZS5wcmV2aW91cygpCiAgICAgICAgICAgICAgICAgICAgIHByaW50IHN1bQoKICAgICAgICAgICAgICAgICAgICAgPj4+ICJjYmEiIAoKICAgICAgICAgICAgICAgIG9yIGp1c3QgYXMgaW4gYSBweXRob24gZmFzaGlvbgoKICAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gczoKICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSBpICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBOb3RlIDE6IEl0ZXJhdG9ycyBpbiBDKysgYXJlIHZlcnkgcG93ZXJmdWwsIGJ1dAogICAgICAgICAgICAgICAgZGFuZ2Vyb3VzIHRvby4gQW5kIGluIHB5dGhvbiB5b3UgY2FuIHNob290IHlvdXJzZWxmIGluIHRoZSBmb290CiAgICAgICAgICAgICAgICBqdXN0IGxpa2UgaW4gQysrLCBzbywgYmUgY2FyZWZ1bC4KCQkKCQlOb3RlIDI6IHRoZSBpdGVyYXRvcnMgYXJlICdsaWdodCcsIGllLCB0aGV5IGRvIG5vdAoJCWNvbnZlcnQgc2VxdWVuY2UgZWxlbWVudHMgdW50aWwgeW91IHJlcXVlc3QgdG8gZG8gc28sIHZpYQoJCW5leHQoKSwgdmFsdWUoKSBvciBwcmV2aW91cygpLiBJZiB5b3UganVzdCBpbmNyZW1lbnQvZGVjcmVtZW50IG9uZQoJCW5vIGNvbnZlcnNpb24gaXMgcGVyZm9ybWVkLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgYiA9IHMuYmVnaW4oKSAgICAgIAoJICAgICAgICAgICAgIGIgKz0gMQogICAgICAgICAgICAgICAgICAgICBiLmluY3IoKQogICAgICAgICAgICAgICAgICAgICBiLmluY3IoMikKCQkgICAgIGIuZGVjcigyKQogICAgICAgICAgICAgICAgICAgICBiLmRlY3IoKQogICAgICAgICAgICAgICAgICAgICBiIC09IDEKCgkJIG9ubHkgdGhlIGl0ZXJhdG9yIGlzIG1vZGlmaWVkLCBhbmQgbm90IHZhbHVlIHdyYXBwZXIKCQkgaXMgZ2VuZXJhdGVkLiBPdGhlciB0eXBpY2FsIEMrKyBvcGVyYXRpb25zIGFyZSBhbHNvIAoJCSBhdmFpbGFibGUsIHN1Y2ggYXM6CgoJCSAgICAgcHJpbnQgcy5lbmQoKSAtIHMuYmVnaW4oKQoJCSAgICAgPj4+IDMKCQkgICAgIGYgPSBzLmJlZ2luKCkgKyAxCgkJICAgICBwcmludCBmLnZhbHVlKCkKCQkgICAgID4+PiAiYiIKCQkgICAgIGwgPSBzLmVuZCgpIC0gMQoJCSAgICAgcHJpbnQgbC52YWx1ZSgpCgkJICAgICA+Pj4gImMiCgkJIAoJCSBldGMuICBPZiBjb3Vyc2UsIHRoZSAnZmluZCcsICdpbnNlcnQnLCAnZXJhc2UnLCBhbmQKCQkgc28gb24gbWV0aG9kcyBhbHNvIHN1cHBvcnRzIGl0ZXJhdG9ycyBub3csIGllOgoKCQkgICAgICBpID0gcy5iZWdpbigpCgkJICAgICAgaSArPSAxCgkJICAgICAgcy5lcmFzZShpKQogICAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gczoKICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSBpCgkJICAgICAgcHJpbnQgc3VtCgkJICAgICAgPj4+ICJhYyIKCQkgICAgICAKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoJICAgIFRoZXJlIGlzIG5vIG1vcmUgJ3RoaXNvd24nIGF0dHJpYnV0ZS4gSWYgeW91IHVzZSBpdCwgcHl0aG9uCgkgICAgd2lsbCB0cmFuc2xhdGUgdGhlIGZvbGxvd2luZyBjb2RlIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICAgaWYgKHNlbGYudGhpc293bik6ICAgPT0+ICAgaWYgKHNlbGYudGhpcy5vd24oKSk6CgkJc2VsZi50aGlzb3duID0gMSAgICAgPT0+ICAgc2VsZi50aGlzLm93bigxKQogICAgICAgICAgICAgICAgc2VsZi50aGlzb3duID0gMCAgICAgPT0+ICAgc2VsZi50aGlzLm93bigwKQoKCSAgICBTdGlsbCwgbWF5YmUgaW4gc29tZSB1bnVzdWFsIGNhc2VzIHRoZSB0cmFuc2xhdGlvbiB3aWxsIG5vdCBiZQoJICAgIDEwMCUgY29ycmVjdCwgc28gaWYgeW91IGhhdmUgYSBwcm9ibGVtLCBwbGVhc2UgcmVwb3J0IGl0CgkgICAgYW5kL29yIHVzZSB0aGUgbmV3ICdzZWxmLnRoaXMub3duKCknIGFjY2Vzc29yLgoJICAgIAoJICAgIAogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCSAgICAKCSAgICBUaGVyZSBpcyBubyBtb3JlIENsYXNzUHRyIGNsYXNzZXMgaW4gdGhlIHB5dGhvbiBjb2RlLiBIZW5jZSwKCSAgICBpZiBpbiB0aGUgcGFzdCB5b3UgbmVlZGVkIHRvIHJlc29ydCB0byBzb21lIGtpbmQgb2YgdHJpY2tlcnkKCSAgICB3aXRoIHRoZW0sIG9yIG92ZXJjb21lIHRoZWlyIHByZXNlbmNlLCBpdCBpcyBubyBsb25nZXIKCSAgICByZXF1aXJlZCwgYnV0IHRoZSBleHRyYSBjb2RlIHlvdSBhZGRlZCBjb3VsZCBub3cgYnJlYWsKCSAgICB0aGluZ3MuCgoJICAgIElmIG5lZWRlZCwgeW91IGNhbiB1c2UgdGhlIG9wdGlvbiAtY2xhc3NwdHIsIGkuZS4sCgogICAgICAgICAgICAgICBzd2lnIC1jbGFzc3B0ciAtcHl0aG9uIC4uLgoKCSAgICB0byBnZW5lcmF0ZSB0aGUgb2xkIENsYXNzUHRyIGNsYXNzZXMuCgoKMTAvMzAvMjAwNTogbWtvZXBwZSAKCSAgICBbR3VpbGVdIE1ha2UgZGVjbGFyZWQgYW5kIGRlZmluZWQgbGlua2FnZSBvZiBTV0lHX2luaXQgY29uc2lzdGVudC4gIAoJICAgIFJlcG9ydGVkIGJ5IFN0ZXZlbiBHLiBKb2huc29uIChTRiBwYXRjaCAxMzE1NDk4KS4KCjEwLzI2LzIwMDU6IG1tYXR1cwoKCSAgLSBBZGRlZCB0aGUgYXR0cmlidXRlLmkgZmlsZSB0byB0aGUgZ2xvYmFsIGxpYnJhcnkgZGlyZWN0b3IuCgkgICAgTm93IGl0IGNhbiBiZSB1c2VkIGZyb20gb3RoZXIgbGFuZ3VhZ2VzIHRoYXQgZG8gbm90IHVzZQoJICAgIHRoZSB1bmlmaWVkIHR5cGVtYXAgbGlicmFyeSBhcyB3ZWxsLgoKCSAgICBTbywgaWYgeW91IGhhdmUgc29tZXRoaW5nIGxpa2U6CgoJICAgICAgICVpbmNsdWRlIGF0dHJpYnV0ZS5pCgogICAgICAgICAgICAgICAlYXR0cmlidXRlKEEsIGludCwgYSwgZ2V0X2EsIHNldF9hKTsKCSAgICAgICAJCQkJICAgICAgCSAgCgkgICAgICAgc3RydWN0IEEJCQkgICAgICAJICAKCSAgICAgICB7ICAgIAkJCQkgIAoJICAgICAgICAgaW50IGdldF9hKCkgY29uc3Q7IAkJICAKCSAgICAgICAgIHZvaWQgc2V0X2EoaW50IGFhKTsgCQkgIAoJICAgICAgIH07CQkJCSAgCgogICAgICAgICAgICAgICAlYXR0cmlidXRlX3JlZihCLCBpbnQsIGMpOwoJICAgICAgIAkJCQkKCSAgICAgICBzdHJ1Y3QgQgkJCQoJICAgICAgIHsgICAgCQkJCgkgICAgICAgICBpbnQmIGMoKTsgCQkKCSAgICAgICB9OyAKCgkgICAgdGhlbiBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlIHRoZSAnQS5hJyBhbmQgJ0IuYycgYXR0cmlidXRlcyB3aWxsCgkgICAgYmUgdmlzaWJsZSwgaWUsIHlvdSBjYW4gYWNjZXNzIHRoZW0gYXMgcGxhaW4gdmFyaWFibGVzOgoKICAgICAgICAgICAgICAgZiAgID0gQSgpCiAgICAgICAgICAgICAgIGYuYSA9IDMKICAgICAgICAgICAgICAgZyAgID0gQigpCiAgICAgICAgICAgICAgIGcuYyA9IDMgCiAgICAgICAgICAgCgkgICAgICAgaCAgID0gZi5hICsgZy5jCgoJICAgIGFuZCB0aGUgcHJvcGVyIGdldC9zZXQgbWV0aG9kcyB3aWxsIGJlIGRpc3BhdGNoZWQuIFNlZQoJICAgIGF0dHJpYnV0ZS5pIGZvciBtb3JlIGluZm8uCiAgIAogICAgICAgICAgLSBNb3JlIGNsZWFudXBzIGFyb3VuZCBhbmQgYWRkaW5nIG1vcmUgdGVzdC1jYXNlcy4gVGhlCiAgICAgICAgICAgIERJU09XTiB0eXBlbWFwIG5vdyBpcyB0ZXN0ZWQgYW5kIHdvcmtpbmcgaW4gYWxsIHRoZQogICAgICAgICAgICBsYW5ndWFnZXMgdGhhdCB1c2UgdGhlIHVuaWZpZWQgdHlwZW1hcCBsaWJyYXJ5LCBpZSwgdGNsLAogICAgICAgICAgICBydWJ5LCBwZXJsIGFuZCBweXRob24uCgkgICAgCgoxMC8yNS8yMDA1OiBtbWF0dXMKCgkgICAgLSBQZXJsLCBjb21wbGV0ZSB0aGUgRElTT1dOIHR5cGVtYXAuCgkgICAgCgkgICAgLSBhZGRlZCB0aGUgYXR0cmlidXRlLmkgZmlsZSB0byB0aGUgdW5pZmllZCB0eXBlbWFwCiAgICAgICAgICAgICAgbGlicmFyeSAoYmVmb3JlIHdhcyBvbmx5IHVzYWJsZSBmcm9tIHB5dGhvbikuCgoJICAgIC0gdW5pZnkgdGhlIG5hbWVzIGZvciB0aGUgc2V0dGVyIGFuZCBnZXR0ZXIgbWV0aG9kcyBpbgoJICAgICAgcGVybCx0Y2wscnVieSBhbmQgcHl0aG9uLCBzbywgdGhlIGF0dHJpYnV0ZS5pIGxpYnJhcnkKCSAgICAgIGNhbiB3b3JrIGFjcm9zcyB0aGVtLgoJICAgICAgCgkgICAgLSBzZWUgdGhlIGxpX2F0dHJpYnV0ZS5pIHRlc3QtY2FzZSBvciB0aGUgbGlicmFyeSBmaWxlCgogCSAgICAgICAgTGliL3R5cGVtYXBzL2F0dHJpYnV0ZS5zd2cKCiAgICAgICAgICAgICAgZm9yIG1vcmUgaW5mbyBhYm91dCBob3cgdG8gdXNlIGl0LgoKIAoJICAgICAgCgoxMC8yNC8yMDA1OiBtbWF0dXMKCgkgICAgLSBQZXJsIG5vdyB1c2VzIHRoZSB1bmlmaWVkIHR5cGVtYXAgbGlicmFyeS4KCgkgICAgLSBDaGFuZ2VzIGluIHJ1YnkgdG8gdXNlIHRoZSAkdHJhY2sgb3B0aW9uIGluIHR5cGVtYXBzLgoKCSAgICAtIENoYW5nZXMgaW4gdGhlIHVuaWZpZWQgdHlwZW1hcCBsaWJyYXJ5IHRvIGZvbGxvdyB0aGUKCSAgICAgIGNvbnZlbnRpb24gdGhhdCBhbGwgbWFjcm9zIHRoYXQgYXJlIG5vdCB1c2VkIGluIHRoZQoJICAgICAgQy9DKysgc2lkZSBzdGFydHMgd2l0aCAlLCBzdWNoIGFzCgoJICAgICAgICAgICAlZGVsZXRlCgkJICAgJW5ld19hcnJheQoKICAgICAgICAgICAgICBldGMuCgkgICAgICAKCSAgICAtIERvY3VtZW50aW5nIGZyYWdtZW50cywgc2VlIGZyYWdtZW50cy5zd2cuCgoJICAgIC0gQ2xlYW5lciB3YXkgdG8gdXNlIHRoZSB1bmlmaWVkIHR5cGVtYXAgbGlicmFyeSwgaW5jbHVkZQoJICAgICAganVzdCA8dHlwZW1hcHMvc3dpZ3R5cGVzLnN3Zz4uCgoJICAgICAgQ2hlY2sgc29tZSBvZiB0aGUgc3VwcG9ydGVkIGxhbmd1YWdlczogcGVybCwgdGNsLCBydWJ5LAoJICAgICAgcHl0aG9uLgoKCSAgICAgIEFsd2F5cyBzdGFydCB3aXRoIHRoZSBoZWFkIGZpbGUsIHN1Y2ggYXMKCgkgICAgICAgICBweXRob24vcHl0aG9uLnN3ZwoJICAgICAgICAgdGNsL3RjbDguc3dnCgkgICAgICAgICBydWJ5L3J1Ynkuc3dnCgkgICAgICAgICBwZXJsNS9wZXJsNS5zd2cKCiAgICAgICAgICAgICAgYW5kIHRoZSBwcmluY2lwYWwgZmlsZSB0aGF0IGludm9rZXMgdGhlIHVuaWZpZWQgbGlicmFyeSwgc3VjaCBhcwoKCSAgICAgICAgIHB5dGhvbi9weXR5cGVtYXBzLnN3ZwkgICAgCgkgICAgICAgICB0Y2wvdGNsdHlwZW1hcHMuc3dnCSAgICAKCSAgICAgICAgIHJ1YnkvcnVieXR5cGVtYXBzLnN3ZwkgICAgCgkgICAgICAgICBwZXJsL3Blcmx0eXBlbWFwcy5zd2cJICAgIAoJICAgIAoJICAgICAgVGhlIGZpbGUgdGhhdCBwcm92aWRlIHRoZSBzcGVjaWFsaXphdGlvbiBmb3IgZWFjaAoJICAgICAgbGFuZ3VhZ2UgYXJlIHRoZSBvbmUgdGhhdCBwcm92aWRlcyB0aGUgYmFzaWMgdHlwZXM6CgoJICAgICAgICAgcHl0aG9uL3B5cHJpbXR5cGVzLnN3ZwkKCSAgICAgICAgIHJ1YnkvcnVieXByaW10eXBlcy5zd2cJCgkgICAgICAgICB0Y2wvdGNscHJpbXR5cGVzLnN3ZwkKCSAgICAgICAgIHBlcmw1L3BlcmxwcmltdHlwZXMuc3dnCgoJICAgICAgYW5kIHRoZSBzdHJpbmcgbWFuaXB1bGF0aW9uOiAgCSAKCSAgICAKCSAgICAgICAgIHB5dGhvbi9weXN0cmluZ3Muc3dnCQoJICAgICAgICAgcnVieS9ydWJ5c3RyaW5ncy5zd2cJCgkgICAgICAgICB0Y2wvdGNsc3RyaW5ncy5zd2cJCgkgICAgICAgICBwZXJsNS9wZXJsc3RyaW5ncy5zd2cKCgkJIAoJICAgICAgVGhlIHJlc3Qgb2YgdGhlIGZpbGVzLCBzdWNoIGFzIGNhcnJheS5pLCBhcmUgbW9zdGx5IG9uZSAKCSAgICAgIGxpbmUgZmlsZXMgdGhhdCBpbmNsdWRlIHRoZSBwcm9wZXIgdHlwZW1hcCBsaWJyYXJ5CgkgICAgICB2ZXJzaW9uLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgaW4gUGVybCAqKioKCgkgICAgU29tZSBtaXNzaW5nL3dyb25nIHR5cGVtYXBzIGNvdWxkIHN0YXJ0IHdvcmtpbmcgcHJvcGVybHksCgkgICAgYW5kIGNoYW5nZSB0aGUgb2xkIGV4cGVjdGVkIGJlaGF2aW9yIGluIFBlcmwuCgoxMC8yMy8yMDA1OiB3dXp6ZWIKICAgICAgICAgICAgQ2hpY2tlbjoKICAgICAgICAgICAgICArIHBvaW50ZXJzIHRvIG1lbWJlciBmdW5jdGlvbnMgZmluYWxseSB3b3JrIHByb3Blcmx5CiAgICAgICAgICAgICAgKyBhZGQgdGVzdCBvZiBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMgdG8gY3BwX2Jhc2ljLmkKCjEwLzIwLzIwMDU6IGRhbmN5CgkgICAgW2FsbGVncm9jbF0gQWRkZWQgQysrIHN1cHBvcnQuIExhcmdlIHVwZGF0ZSwgbWFueSBjaGFuZ2VzLiBTZWUKCSAgICBuZXdseSBhZGRlZCBBbGxlZ3JvIENvbW1vbiBMaXNwIHNlY3Rpb24gaW4gbGlzcC5odG1sCgoxMC8yMC8yMDA1OiBtbWF0dXMKCSAgICBSdWJ5LCBUY2wsIFB5dGhvbjoKCgkgICAgLSBVbmlmb3JtIHdheSB0byBmYWlsIChsYWJlbCBmYWlsOiksIG5vdyBmaW5hbGx5CgkgICAgICBTV0lHX2V4Y2VwdGlvbiB3b3JrcyBhY3Jvc3MgdGhlIHRocmVlIGxhbmd1YWdlcyBhbmQgYWxsCgkgICAgICB0aGUgdHlwZW1hcHMuCgoJICAgIC0gQWRkIHByb3BlciBjbGVhbnVwIGNvZGUgdG8gcnVieQoKCSAgICAtIE1vcmUgdmFsZ3JpbmQgZml4ZXMKCgkgICAgLSBTaW1wbGlmeSB0aGUgaW5saW5lIHVzZSwgaXQgc2VlbXMgYSBzbWFsbCBpbnRlcmZhY2Ugb2YKCSAgICAgIDIwLDAwMCBsaW5lcyAocGx1cyBtYW55IG1hbnkgdGVtcGxhdGVzKSBjYW4gYnJlYWsgCgkgICAgICBnY2MgLU8zIGVhc2lseS4KCgkgICAgLSBGaW5hbGl6ZSB0aGUgdHlwZW1hcHMgbGlicmFyeS4gQWxsIHRoZSBvbGQgICouaSBmaWxlcwoJICAgICAgKGNhcnJheS5pLCBjcG9pbnRlci5pLCBleGNlcHRpb24uaSkgaGFkIGJlZW4gaW1wbGVtZW50ZWQKCSAgICAgIGluIHRoZSBuZXcgdHlwZW1hcHMgbGlicmFyeS4KCSAgICAKCjEwLzE5LzIwMDU6IHd1enplYgoJICAgIFVwZGF0ZSB0aGUgUnVudGltZSBUeXBlbWFwIGRvY3VtZW50YXRpb24gaW4gVHlwZW1hcHMuaHRtbAoKMTAvMTgvMjAwNTogd3V6emViCgkgICAgQ2hpY2tlbjoKCSAgICAgIC0gQ29ycmVjdGx5IGhhbmRsZSAlaWdub3JlZCBjbGFzc2VzCiAgICAgICAgICAgICAgLSBDb3JyZWN0bHkgY29udmVydCBsb25nLCBsb25nIGxvbmcsIHVuc2lnbmVkIGxvbmcsIGV0YwogICAgICAgICAgICAgICAgdG8gY2hpY2tlbiBwcmltaXRpdmVzLiAoVGhhbmtzIHRvIEZlbGl4IFdpbmtlbG1hbm4pCiAgICAgICAgICAgICAgLSBVc2luZyBhcmdvdXQgcGFyYW1ldGVycyB3aGVuIHRoZSByZXR1cm4gdmFsdWUgd2FzIGEKICAgICAgICAgICAgICAgIHdyYXBwZWQgcG9pbnRlciBjYXVzZWQgYSBtZW1vcnkgY29ycnVwdGlvbi4gIFRoZSBjaGlja2VuCiAgICAgICAgICAgICAgICBnYXJiYWdlIGNvbGxlY3RvciBtb3ZlZCBhIHBvaW50ZXIgb3V0IGZyb20gdW5kZXIgdXMuCiAgICAgICAgICAgICAgICBUaGlzIGlzIG5vdyBmaXhlZCBieSBydW5uaW5nIGFsbCB0aGUgcHJveHkgY3JlYXRpb24KICAgICAgICAgICAgICAgIGZ1bmN0aW9ucyBhcyBjb250aW51YXRpb25zIGFmdGVyIHRoZSB3cmFwcGVyIGZ1bmN0aW9uCiAgICAgICAgICAgICAgICByZXR1cm5zLiAgQXMgcGFydCBvZiB0aGlzLCB3ZSBubyBsb25nZXIgbmVlZCB0aGUKICAgICAgICAgICAgICAgIGNoaWNrZW5mYXN0cHJveHkgZmxhZyBvbiBvdXRwdXQgdHlwZW1hcHMuCiAgICAgICAgICAgICAgLSB1c2luZyAtcHJveHkgYW5kIC1ub2NvbGxlY3Rpb24gdG9nZXRoZXIgd29ya3Mgbm93CiAgICAgICAgICAgICAgICBCZWZvcmUsIGl0IHdhcyBub3QgZXhwb3J0aW5nIHRoZSBkZXN0cnVjdG9yIGluIHRoZSBwcm94eQogICAgICAgICAgICAgICAgd3JhcHBlci4KCjEwLzE4LzIwMDU6IG1tYXR1cwoJICAgIAoJICAgIEFkZGVkIHRoZSBVbmlmaWVkIFR5cGVtYXAgTGlicmFyeSAoVVRMKS4gSXQgdW5pZmllcyB0aGUgdHlwZW1hcHMgZm9yCgogCSAgICAgICAgcHl0aG9uLCBydWJ5LCB0Y2wKCgkgICAgYW5kIGluIHRoZSBwcm9jZXNzLCBmaXhlcyBzZXZlcmFsIHByb2JsZW1zIGluIGVhY2ggb2YgdGhlIHRocmVlCgkgICAgbGFuZ3VhZ2VzIHRvIHdvcmsgaW4gYSAiY2Fub25pY2FsIiB3YXkgbm93IGVzdGFibGlzaGVkIGluCgkgICAgdGhlIHR5cGVtYXAgbGlicmFyeQoJICAgIAoJICAgICAgIFNXSUcvTGliL3R5cGVtcGFzCgoJICAgIFRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgdW5pZmljYXRpb24gaXMgdGhhdCBldmVyeXRoaW5nCgkgICAgY29tcGlsZXMgYW5kIHJ1bnMgaW5zaWRlIHRoZSB0ZXN0LXN1aXRlIGFuZCBleGFtcGxlcwoJICAgIGRpcmVjdG9yaWVzLiBBbmQgZm9yIHRoZSBmaXJzdCB0aW1lIHdlIGhhdmUgdGhyZWUKCSAgICBsYW5ndWFnZXMgdGhhbiBwYXNzIHRoZSBwcmltaXRpdmVfdHlwZXMuaSBjYXNlLgoKCSAgICBBbHNvLCB3ZSBoYXZlIGEgdW5pZm9ybSB3YXkgdG8gdHJlYXQgdGhlIGVycm9ycywgZm9yIGV4YW1wbGUKCSAgICBpZiB5b3UgZG8gc29tZXRoaW5nIGxpa2UKCgkgICAgICA+Pj4gZnJvbSBwcmltaXRpdmVfdHlwZXMgaW1wb3J0ICoKICAgICAgICAgICAgICA+Pj4gcHJpbnQgdmFsX3VjaGFyKDEwKQogICAgICAgICAgICAgIDEwCgkgICAgICA+Pj4gcHJpbnQgdmFsX3VjaGFyKDEwMDApCiAgICAgICAgICAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgkJICAgICAgCgkgICAgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8JCQkgICAgCgkgICAgICBPdmVyZmxvd0Vycm9yOiBpbiBhcmd1bWVudCAxIG9mIHR5cGUgJ3Vuc2lnbmVkIGNoYXInCgoJICAgIHlvdSBnZXQgdGhlIHNhbWUgZXhjZXB0aW9uIGluIGFsbCB0aGUgdGhyZWUgbGFuZ3VhZ2VzLgoJICAgIAoJICAgIEFuZCB3ZWxsLCBtYW55IG1vcmUgZ29vZCB0aGluZ3Mgd2lsbCBjb21lIGZyb20gdGhpcwoJICAgIHVuaWZpY2F0aW9uLCBmb3IgZXhhbXBsZSwgcHJvcGVyIHN1cHBvcnQgb2YgdGhlIFNUTC9TVEQgY2xhc3NlcwoJICAgIGZvciBhbGwgdGhlIGxhbmd1YWdlcywgYW5kIGhvcGVmdWxseSwgd2UgY2FuIGtlZXAKCSAgICBhZGRpbmcgb3RoZXIgbGFuZ3VhZ2VzLgoKCSAgICBUaGUgaGFyZGVzdCBwYXJ0LCB3cml0aW5nIGEgY29tbW9uIHR5cGVtYXAgbGlicmFyeQoJICAgIHRoYXQgc3VpdGVzIHRoZSB0aHJlZSBkaWZmZXJlbnQgbGFuZ3VhZ2VzLCBpcyBkb25lLAoJICAgIGFuZCBhZGRpbmcgYW5vdGhlciBsYW5ndWFnZSBzaG91bGQgbm93IGJlIGVhc3kuIAoKCSAgICBTdGlsbCB0aGUgZ2xvYmFsIHVuaWZpY2F0aW9uIGlzIG5vdCBjb21wbGV0ZSwgdGhlIFNUTC9TVEQgCgkgICAgcGFydCBpcyBuZXh0LCBhbmQgcHJvYmFibHkgYXMgd2VsbCBhcyBhZGRpbmcgb25lIG9yIHR3byBtb3JlCgkgICAgbGFuZ3VhZ2VzLgoKCSAgICBJZiB5b3UgYXJlIGN1cmlvdXMsIGxvb2sgYXQgdGhlIHB5dGhvbiwgcnVieSBhbmQvb3IgdGNsCgkgICAgZGlyZWN0b3JpZXMgdG8gc2VlIHdoYXQgaXMgbmVlZGVkIHRvIHN1cHBvcnQgdGhlIG5ldwoJICAgIGNvbW1vbiB0eXBlbWFwcyBsaWJyYXJ5LiAgU3RpbGwsIHRoZSBmaW5hbCB3YXkgdG8KCSAgICBpbnRlZ3JhdGUgYSBuZXcgbGFuZ3VhZ2UgY291bGQgY2hhbmdlIGFzIHdlIG1vdmUgdG8KCSAgICBpbnRlZ3JhdGUgdGhlIFNURC9TVEwuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBpbiBSdWJ5L1RjbCAqKioKCgkgICAgU29tZSBtaXNzaW5nL3dyb25nIHR5cGVtYXBzIGNvdWxkIHN0YXJ0IHdvcmtpbmcgcHJvcGVybHksCgkgICAgYW5kIGNoYW5nZSB0aGUgb2xkIGJlaGF2aW9yLCBzcGVjaWFsbHkgaW4gcnVieSBhbmQgdGNsLgoKVmVyc2lvbiAxLjMuMjcgKE9jdG9iZXIgMTUsIDIwMDUpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTAvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgdHlwZXNhZmUgZW51bSB3cmFwcGluZyBzbyB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvCiAgICAgICAgICAgIG92ZXJsb2FkIGEgbWV0aG9kIHdpdGggMiBkaWZmZXJlbnQgZW51bSB0eXBlcy4KCjEwLzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBmb3IgJWZlYXR1cmUoImltbXV0YWJsZSIsIjAiKSBhdHRlbXB0aW5nIHRvIGdlbmVyYXRlIHNldHRlcnMKICAgICAgICAgICAgZm9yIGNvbnN0YW50cy4KCiAgICAgICAgICAgIFJlc3RvcmVkICVpbW11dGFibGUgYW5kICVtYWtlZGVmYXVsdCB0byBjbGVhciB0aGUgZmVhdHVyZSBhcyBpdAogICAgICAgICAgICBiZWhhdmVkIGluIFNXSUctMS4zLjI1IGFuZCBlYXJsaWVyLgoKMTAvMTQvMjAwNTogbW1hdHVzCiAgICAgICAgICAgIEZpeCBidWcgaW4gYW5vbnltb3VzIHR5cGVkZWYgc3RydWN0dXJlcyB3aGljaCB3YXMgbGVhZGluZyB0bwogICAgICAgICAgICBzdHJhbmdlIGJlaGF2aW91ci4KCjEwLzEzLzIwMDU6IG1tYXR1cwoJICAgIFNldmVyYWwgbWlub3IgY2hhbmdlczoKCSAgICAKCSAgICAtIEltcHJvdmUgdGhlIHdjaGFyX3QgdHlwZSBzdXBwb3J0CgkgICAgLSBBZGQgYSB3YXJuaW5nIGZvciB3aGVuIHlvdSBkZWZpbmUgdGhlICdpbicgdHlwZW1hcCBidXQKCSAgICAgIHlvdSBkb24ndCBkZWZpbmUgdGhlICd0eXBlY2hlY2snIG9uZS4gVmVyeSBjb21tb24gbWlzdGFrZS4KCSAgICAtIEFkZCBwcm9wZXIgZGVmYXVsdCBydWxlIGZvciBmdW5jdGlvbiBwb2ludGVycywgbm93IHlvdQoJICAgICAgY2FuIGRlZmluZSBhIHR5cGVtYXAgc3VjaCBhczoKCgkgICAgICAldHlwZW1hcChpbikgU1dJR1RZUEUgKCgqKShBTlkpKSB7Li4ufQoKCSAgICAgIFRoYXQgd2lsbCBhcHBseSB0byBhbGwgdGhlIHBvaW50ZXIgdG8gZnVuY3Rpb25zLiBUaGUKCSAgICAgIHJ1bGUgaW4gQysrIGFsc28gYXBwbHkgdG8gdGhlIGZ1bmN0aW9uICdyZWZlcmVuY2UnLCBpZSwKCSAgICAgIGluIGJvdGggY2FzZXMKCgkgICAgICAgIHR5cGVkZWYgIGludCAoKmZwdHIpKGludCBhKTsKCSAgICAgICAgdHlwZWRlZiAgaW50IChmdW5jKShpbnQgYSk7CgoJICAgICAgVGhpcyB3YXMgbmVlZGVkIHNpbmNlIGl0IHNlZW1zIHRvIGJlICdpbGxlZ2FsJyBpbiBDKysgdG8KCSAgICAgIGRvIHNvbWV0aGluZyBsaWtlOgoKCSAgICAgICAgIHZvaWQgKnB0ciA9IHN0YXRpY19jYXN0PHZvaWQgKj4oZnB0cik7CgoJICAgICAgYW5kIHByb2JhYmx5LCBhcyBmb3IgbWVtYmVyIGZ1bmN0aW9ucywgaXQgaXMgbm90CgkgICAgICB3YXJyYW50aWVkIHRoYXQgdGhlIHBvaW50ZXIgc2l6ZXMgd2lsbCBtYXRjaC4KCgkgICAgLSBBZGQgdGhlICNlcnJvci8jd2FybmluZyBkaXJlY3RpdmVzIHRvIHN3aWcncyBjcHAuCgoJICAgIC0gQWRkIHRoZSBub2Jsb2NrIG9wdGlvbiBmb3IgdHlwZW1hcHMsIHdoaWNoIGlzIHVzZWQgYXMKICAgICAgICAgICAgICBmb2xsb3dzOiBzdXBwb3NlZCB5b3UgYSB0eXBlbWFwLCBsaWtlIHRoaXMKCgkgICAgICAKCSAgICAgICV0eXBlbWFwKGluLG5vYmxvY2s9MSkgSGVsbG8gewkJCSAgIAoJICAgICAgICAgLi4uLgogICAgICAgICAgICAgIH0KCgkgICAgICB0aGVuIHRoZSB0eXBlbWFwIHdpbGwgYmUgaW5zZXJ0ZWQgd2l0aG91dCB0aGUgYmxvY2sKCSAgICAgIGltcG9zZWQgYnkgdGhlIGJyYWNrZXRzLCBzaW1pbGFyIHRvCgoJICAgICAgICV0eXBlbWFwKGluKSBIZWxsbyAiLi4uIjsKCgkgICAgICBTbywgd2h5IHlvdSBkb24ndCBqdXN0IHVzZSB0aGUgcXVvdGUgc3R5bGU/LCBiZWNhdXNlOgoJICAgICAgCgkgICAgICAgICAxLi0gVGhlIHF1b3RlIHN0eWxlIGRvZXNuJ3QgZ2V0IHByZXByb2Nlc3NlZCwgZm9yIGV4YW1wbGUKCSAgICAgIAoJICAgICAgICAgICAgICAldHlwZW1hcChpbikgSGVsbG8gIiQxPSBTV0lHX21hY3JvKCQxKTsiOwoJICAgICAgCgkgICAgICAgICAgICAgaGVyZSwgU1dJR19tYWNybyBkb2Vzbid0IGdldCBleHBhbmRlZAoKICAgICAgICAgICAgICAgICAyLi0gSW5zaWRlIGEgcXVvdGUgdHlwZW1hcCwgeW91IGhhdmUgdG8gdXNlIAogICAgICAgICAgICAgICAgICAgICBxdW90ZXMgY2FyZWZ1bGx5CgoJCSAgICAgICV0eXBlbWFwKGluKSBIZWxsbyAiJDEgPSBcImhlbGxvXCIgIjsKCgkJIDMuLSBZb3UgY2FuJ3QgbWFrZSBlbWFjcyBhbmQvb3Igb3RoZXIgZWRpdG9ycwoJCSAgICAgdG8gaW5kZW50IGluc2lkZSBhIHN0cmluZyEuIAoKCgkgICAgICBTbywgd2h5IGRvIHlvdSB3YW50IHRvIHJlbW92ZSB0aGUgYmxvY2s/LCBiZWNhdXNlIGFuIGV4dHJhCgkgICAgICBibG9jayB3aGVuIG5vdCBuZWVkZWQgKG5vIGxvY2FsIHZhcmlhYmxlcyBpbiBpdCk6CgoJICAgICAgICAgIDEuLSBtYWtlcyB0aGUgY29kZSBoYXJkZXIgdG8gcmVhZAogICAgICAgICAgICAgICAgICAyLi0gbWFrZXMgdGhlIGNvZGUgbGFyZ2VyCiAgICAgICAgICAgICAgICAgIDMuLSBvciBpbiBzaG9ydCwgZm9yIHRoZSBzYW1lIHJlYXNvbiB3ZSBoYXZlIHRoZSBxdW90ZSBzdHlsZS4KClZlcnNpb24gMS4zLjI2IChPY3RvYmVyIDksIDIwMDUpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMC8wOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGhwXSBBZGRlZCAndGhyb3dzJyB0eXBlbWFwcy4KCjEwLzA4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeGVzIGZvciBsYW5ndWFnZXMgdGhhdCBkb24ndCBzdXBwb3J0IG11bHRpcGxlIGluaGVyaXRhbmNlLiBUaGUKICAgICAgICAgICAgZmlyc3Qgbm9uLWlnbm9yZWQgY2xhc3MgaW4gdGhlIHB1YmxpYyBiYXNlIGNsYXNzIGxpc3QgaXMgdXNlZCBmb3IgaW5oZXJpdGFuY2UuCiAgICAgICAgICAgIGJ5IHRoZSBwcm94eSBjbGFzcy4gUHJldmlvdXNseSwgaWYgdGhlIGZpcnN0IGNsYXNzIGluIHRoZSBsaXN0IHdhcyBpZ25vcmVkLCB0aGVuCiAgICAgICAgICAgIHRoZSBwcm94eSBjbGFzcyB3b3VsZG4ndCBoYXZlIGFueSBiYXNlIGNsYXNzZXMuCgoxMC8wNy8yMDA1OiBtbWF0dXMKCSAgICAgVXBkYXRlIG1vcmUgZmVhdHVyZXMgdG8gZm9sbG93IG5ldyBjb252ZW50aW9uLCBpbmNsdWRpbmc6CgoJICAgICAgIGNhbGxiYWNrCgkgICAgICAgcmVmL3VucmVmCgkgICAgICAgZXhjZXB0CgkgICAgCgkgICAgIEFsbCBvZiB0aGVtIHVzZSBub3Qgb25seSB0aGUgZmVhdHVyZSBhcyBhIGZsYWcsIGJ1dCBhbHNvCgkgICAgIGFzIGNvZGUgdmFsdWUuIFRvIGRlYWwgd2l0aCB0aG9zZSBmZWF0dXJlcywgd2UgdXNlIG5vdwoJICAgICBHZXRGbGFnQXR0ciwgd2hpY2ggaXMgc2ltaWxhciB0byBHZXRGbGFnLCBidXQgaW5zdGVhZCBvcgoJICAgICByZXR1cm5pbmcgMSBvciAwLCBpdCByZXR1cm5zIHRoZSBhdHRyIHZhbHVlLCBpZiBoYXBwZW5zCgkgICAgIHRvIGJlIGRpZmZlcmVudCBvZiAiMCIgb2YgY291cnNlLgoKCSAgICAgTm93IHRoZXJlIGFyZSBhbHNvIG1vcmUgdW5pZm9ybSBkaXJlY3RpdmUgbmFtZXMgZm9yIHRoZSAKCSAgICAgb25lcyBiYXNlZCBpbiBmZWF0dXJlcywgZm9yIGV4YW1wbGUsIGZvciB0aGUgb2xkCgkgICAgICVuZXdvYmplY3QgZGlyZWN0aXZlIG5vdyB3ZSBoYXZlIHRyZWUgZGlyZWN0aXZlcyBkZWZpbmVkOgoJICAgICAKCgkgICAgICNkZWZpbmUgJW5ld29iamVjdCAgICAgICAgJWZlYXR1cmUoIm5ldyIpCgkgICAgICNkZWZpbmUgJW5vbmV3b2JqZWN0ICAgICAgJWZlYXR1cmUoIm5ldyIsIjAiKQoJICAgICAjZGVmaW5lICVjbGVhcm5ld29iamVjdCAgICVmZWF0dXJlKCJuZXciLCIiKQoKCSAgICAgYW5kIHNvIG9uIGZvciBhbGwgdGhlIG90aGVyIGZlYXR1cmUgZGlyZWN0aXZlcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMDkvMzAvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgU3VidGxlIGNoYW5nZSB0byBzb21lIGZlYXR1cmVzLiBQcmV2aW91c2x5IGl0IHdhcyBub3QgcG9zc2libGUgdG8gZGlzYWJsZSBtYW55CiAgICAgICAgICAgIGZlYXR1cmVzIG9uY2UgdGhleSBoYWQgYmVlbiBlbmFibGVkLiBUaGlzIHdhcyBmb3IgbW9zdCBmZWF0dXJlcyB0aGF0IGJlaGF2ZSBhcwogICAgICAgICAgICBmbGFncy4gVGhlc2UgZmVhdHVyZXMgbm93IHdvcmsgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgJWZlYXR1cmUoIm5hbWUiKSAgICAgICAgICAgICAgLy8gZW5hYmxlcyB0aGUgZmVhdHVyZQogICAgICAgICAgICAgICVmZWF0dXJlKCJuYW1lIiwgIjEiKSAgICAgICAgIC8vIGVuYWJsZXMgdGhlIGZlYXR1cmUKICAgICAgICAgICAgICAlZmVhdHVyZSgibmFtZSIsICIwIikgICAgICAgICAvLyBkaXNhYmxlcyB0aGUgZmVhdHVyZQogICAgICAgICAgICAgICVmZWF0dXJlKCJuYW1lIiwgIiIpICAgICAgICAgIC8vIGNsZWFycyB0aGUgZmVhdHVyZQoKICAgICAgICAgICAgSW4gZmFjdCBhbnkgbm9uLWVtcHR5IHZhbHVlIG90aGVyIHRoYW4gIjAiIHdpbGwgZW5hYmxlIHRoZSBmZWF0dXJlIChsaWtlIEMgYm9vbGVhbiBsb2dpYykuCiAgICAgICAgICAgIFByZXZpb3VzbHkgIjEiLCAiMCIgb3IgYW55IG90aGVyIG5vbi1lbXB0eSB2YWx1ZSB3b3VsZCBlbmFibGUgdGhlIGZlYXR1cmUgYW5kIGl0IHdvdWxkCiAgICAgICAgICAgIG9ubHkgYmUgcG9zc2libGUgdG8gZGlzYWJsZSB0aGUgZmVhdHVyZSBieSBjbGVhcmluZyBpdCAoYXNzdW1pbmcgdGhlcmUgd2FzIG5vIGdsb2JhbCBlbmFibGUpLgoKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgYWZmZWN0ZWQ6CgogICAgICAgICAgICAgIGFsbG93ZXhjZXB0CiAgICAgICAgICAgICAgY29tcGFjdGRlZmF1bHRhcmdzCiAgICAgICAgICAgICAgY2xhc3NpYyAgICAgICAgICAgICAgICAoUHl0aG9uKQogICAgICAgICAgICAgIGNzOmNvbnN0ICAgICAgICAgICAgICAgKEMjKQogICAgICAgICAgICAgIGRpcmVjdG9yCiAgICAgICAgICAgICAgZXhjZXB0aW9uY2xhc3MgICAgICAgICAoUHl0aG9uKQogICAgICAgICAgICAgIGlnbm9yZQogICAgICAgICAgICAgIGltbXV0YWJsZQogICAgICAgICAgICAgIGphdmE6Y29uc3QgICAgICAgICAgICAgKEphdmEpCiAgICAgICAgICAgICAgamF2YTpkb3duY2FzdCAgICAgICAgICAoSmF2YSkKICAgICAgICAgICAgICBrd2FyZ3MKICAgICAgICAgICAgICBtb2Rlcm4gICAgICAgICAgICAgICAgIChQeXRob24pCiAgICAgICAgICAgICAgbmV3CiAgICAgICAgICAgICAgbm9hdXRvZG9jICAgICAgICAgICAgICAoUHl0aG9uKQogICAgICAgICAgICAgIG5vZGVmYXVsdAogICAgICAgICAgICAgIG5vZGlyZWN0b3IKICAgICAgICAgICAgICBub3JlZgogICAgICAgICAgICAgIG5vdGFic3RyYWN0CiAgICAgICAgICAgICAgbm91bnJlZgogICAgICAgICAgICAgIG5vdmFsdWV3cmFwcGVyCiAgICAgICAgICAgICAgcHl0aG9uOm1heWJlY2FsbCAgICAgICAoUHl0aG9uKQogICAgICAgICAgICAgIHB5dGhvbjpub25keW5hbWljICAgICAgKFB5dGhvbikKICAgICAgICAgICAgICBtb2R1bGEzOm11bHRpcmV0dmFsICAgIChNb2R1bGEzKQogICAgICAgICAgICAgIHByZWRpY2F0ZSAgICAgICAgICAgICAgKFJ1YnkpCiAgICAgICAgICAgICAgdHJhY2tvYmplY3RzICAgICAgICAgICAoUnVieSkKICAgICAgICAgICAgICB2YWx1ZXdyYXBwZXIKCiAgICAgICAgICAgIEl0IGlzIG5vdyBwb3NzaWJsZSwgZm9yIGV4YW1wbGUgdG8gaWdub3JlIGFsbCBtZXRob2RzL2NsYXNzZXMgaW4gYSBoZWFkZXIgZmlsZSwgZXhjZXB0IGZvciBhCiAgICAgICAgICAgIGZldyB0YXJnZXR0ZWQgbWV0aG9kcywgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVmZWF0dXJlKCJpZ25vcmUiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBhbGwgbWV0aG9kcy9jbGFzc2VzCiAgICAgICAgICAgICAgJWZlYXR1cmUoImlnbm9yZSIsIjAiKSBzb21lX2Z1bmN0aW9uKGludCwgZG91YmxlKTsgLy8gZG8gbm90IGlnbm9yZSB0aGlzIGZ1bmN0aW9uCiAgICAgICAgICAgICAgJWZlYXR1cmUoImlnbm9yZSIsIjAiKSBTb21lQ2xhc3M7ICAgICAgICAgICAgICAgICAgLy8gZG8gbm90IGlnbm9yZSB0aGlzIENsYXNzCiAgICAgICAgICAgICAgJWZlYXR1cmUoImlnbm9yZSIsIjAiKSBTb21lQ2xhc3M6Om1ldGhvZDsgICAgICAgICAgLy8gZG8gbm90IGlnbm9yZSB0aGlzIG1ldGhvZAogICAgICAgICAgICAgICVpbmNsdWRlICJiaWdoZWFkZXIuaCIKCiAgICAgICAgICAgIFJlbW92ZWQgJXB5dGhvbmR5bmFtaWMgLSBpdCBuZXZlciB3b3JrZWQgcHJvcGVybHkuIFVzZSAlcHl0aG9ubm9uZHluYW1pYyBpbnN0ZWFkLgogICAgICAgICAgICBSZW1vdmVkICVmZWF0dXJlKCJub2t3YXJncyIpIC0gaXQgd2Fzbid0IGZ1bGx5IGltcGxlbWVudGVkICAtIHVzZSAlZmVhdHVyZSgia3dhcmdzIiwiMCIpIGluc3RlYWQuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjA5LzI1LzIwMDU6IG1rb2VwcGUKCSAgICBbR3VpbGVdIEFkZCAidGhyb3dzIiB0eXBlbWFwcy4KCjA5LzI0LzIwMDU6IGNmaXNhdmFnZQogICAgICAgICAgICBbUnVieV0gQWRkcyBuZXcgJXRyYWNrb2JqZWN0cyBmdW5jdGlvbmFsaXR5IHRoYXQgbWFwcyBDKysgb2JqZWN0cyB0bwogICAgICAgICAgICBSdWJ5IG9iamVjdHMuICBUaGlzIGZ1bmN0aW9uYWxpdHkgbWFrZXMgaXQgbXVjaCBlYXNpZXIgdG8gaW1wbGVtZW50CiAgICAgICAgICAgIG1hcmsgZnVuY3Rpb25zIGZvciB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IuICBGb3IgbW9yZSBpbmZvcm1hdGlvbgogICAgICAgICAgICByZWZlciB0byB0aGUgdXBkYXRlIGRvY3VtZW50YXRpb24gYW5kIGV4YW1wbGVzLgogICAgICAgICAgICAKMDkvMjAvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIFBhdGNoIDExMTY0MzEgZnJvbSBKb3NoIENoZXJyeS4gRml4ZXMgbm9uIG1lbWJlciBmdW5jdGlvbnMgaW5hZHZlcnRlbnRseQogICAgICAgICAgICBiZWluZyBjYWxsZWQgaW5zdGVhZCBvZiBtZW1iZXIgZnVuY3Rpb25zLgoKMDkvMjAvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gUGF0Y2ggZnJvbSBNYXJrIEdvc3NhZ2UgdG8gYWRkIHN1cHBvcnQgZm9yIEx1YS01LjEsIHN0ZDo6c3RyaW5nLAogICAgICAgICAgICBzdGQ6OnZlY3Rvciwgc3RkOjpleGNlcHRpb24gYW5kIGRvY3VtZW50YXRpb24uCgowOS8xNC8yMDA1OiBtbWF0dXMKCSAgICBbUHl0aG9uXSBBZGQgLW5vY3BwY2FzdC4gTm93IHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvCgkgICAgYWx3YXlzIHVzZSB0aGUgY3BwY2FzdCBvcGVyYXRvcnMuIEJlZm9yZSB0aGF0IHdhcyB0aGUgY2FzZQoJICAgIG9ubHkgd2hlbiB5b3UgdXNlZCB0aGUgLWNwcGNhc3Qgb3B0aW9uLgoKICAgICAgICAgICAgSWYgdGhpcyBzZWVtcyB0byBicmVhayB5b3VyIGNvZGUuLi4geW91ciB3ZWxjb21lISwgaXQKCSAgICBtZWFucyBpdCB3YXMgYnJva2VuIGJlZm9yZSwgYW5kIHlvdSBuZXZlciBub3RpY2UuIAoKCSAgICBJZiB5b3UgdGhpbmcgdGhlIGVycm9yIGlzIGR1ZSB0byBvbmUgb2YgdGhlIFNXSUcgdHlwZW1hcHMsCgkgICAgc2VuZCB1cyBhbiBleGFtcGxlLgoKCSAgICBVc2UgLW5vY3BwY2FzdCBvbmx5IHdpdGggdmVyeSBvbGQgQysrIGNvbXBpbGVycyB0aGF0CgkgICAgZG8gbm90IHN1cHBvcnQgdGhlIGNwcGNhc3Qgb3BlcmF0aW9ucy4gCgoJICAgIFNvLCBoZXJlIGFwcGxpZXM6CgoJCVRoaXMgY2hhbmdlIGRvZXNuJ3QgYnJlYWsgY29tcGF0aWJpbGl0eSwgaXQgd2FzIGJyb2tlbiBiZWZvcmUuCgowOS8xMy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IGZvciBkaXJlY3RvciBtZXRob2RzIHdoZW4gYSBjbGFzcyBpcyBwYXNzZWQgYnkgdmFsdWUgYXMgYQogICAgICAgICAgICBwYXJhbWV0ZXIuCgowOS8xMS8yMDA1OiBtbWF0dXMKICAgICAgICAgICAgQWRkaW5nIHRoZSBtb2R1bGUgb3B0aW9uIHRvIHRoZSAlaW1wb3J0IGRpcmVjdGl2ZS4gTm93IHlvdQogICAgICAgICAgICBjYW4gdXNlIGl0IGFzCgoJICAgICAgICAlaW1wb3J0KG1vZHVsZT0iQmlnTW9kdWxlIikgZm9vLmkKCgkgICAgd2hlcmUgc3ViZmlsZSBjb3VsZCAob3Igbm90KSBkZWZpbmUgdGhlIG1vZHVsZSBuYW1lIHZpYQoJICAgIHRoZSAlbW9kdWxlIGRpcmVjdGl2ZS4gVGhlIG1vZHVsZSBvcHRpb24gdGFrZSBwcmVjZWRlbmNlCgkgICAgYW5kIGl0IGhhcyB0aGUgc2FtZSBlZmZlY3RzIHRoYW4gaGF2aW5nIHRoZSBkaXJlY3RpdmUgCgoJICAgICAgICAlbW9kdWxlIEJpZ01vZHVsZSAgCgoJICAgIGluc2lkZSB0aGUgaW1wb3J0ZWQgZmlsZSBmb28uaS4KCgkgICAgWW91IGNhbiB1c2UgdGhlIG9wdGlvbiBpbiBtYWlubHkgdHdvIGNhc2VzOgoKCSAgICAxLi0gWW91IHVzZWQgdGhlIC1tb2R1bGUgb3B0aW9uIHdoZW4geW91IGdlbmVyYXRlZCB0aGUKICAgICAgICAgICAgICAgIG1vZHVsZSB0byBiZSBpbXBvcnRlZCwgYW5kIGhlbmNlIHRoZSBtb2R1bGUgbmFtZSBpbgogICAgICAgICAgICAgICAgdGhlIGltcG9ydGVkICVtb2R1bGUgZGlyZWN0aXZlIGlzIG5vdCByZWFsbHkgdXNlZnVsLgoKCSAgICAyLi0gVGhlIG1vZHVsZSB5b3Ugd2FudCB0byBpbXBvcnQgaXMgdmVyeSBsYXJnZSwgYW5kIGl0CiAgICAgICAgICAgICAgICBoYXMgc2V2ZXJhbCAuaS8uaCBmaWxlcy4gVGhlbiwgaWYgeW91IGp1c3Qgb25lIHRvCiAgICAgICAgICAgICAgICBpbXBvcnQgYSBjbGFzcyBvciBzbyBmcm9tIHRoZSBtb2R1bGUsIHNheXMgJ2ZvbycsIGFuZAogICAgICAgICAgICAgICAgbm90IHRoZSBlbnRpcmUgbW9kdWxlIHZpYSBpbXBvcnRpbmcgdGhlIG1haW4KICAgICAgICAgICAgICAgIEJpZ01vZHVsZS5pIGZpbGUsIHRoZW4geW91IGp1c3QgZG86CgogCQkgICAgJWltcG9ydChtb2R1bGU9IkJpZ01vZHVsZSIpIGZvby5oCgogICAJICAgICAgICBvcgoJCQogCQkgICAgJWltcG9ydChtb2R1bGU9IkJpZ01vZHVsZSIpIGZvby5pCgoJCXdoZXJlIGZvby5pIGNvbnRhaW5zIHRoZSAnZm9vJyBkZWNsYXJhdGlvbiBhbmQgbWF5YmUgYQoJCWNvdXBsZSBvZiBleHRyYSAlaW5jbHVkZSBkaXJlY3RpdmVzLCBhcyBuZWVkZWQuCgoJICAgIAowOS8xMS8yMDA1OiBtbWF0dXMKCSAgICBGaXggYnVnICMxMjgyNjM3LCBhYm91dCB0aGUgLW1vZHVsZSBvcHRpb24gbm90IGhhdmluZyBlZmZlY3QKCSAgICBpbiBwbGFjZXMgd2hlcmUgaXQgd2FzIG5lZWRlZC4KCjA5LzExLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFdoZW4gd3JhcHBpbmcgdmFyaWFibGVzLCBlbnN1cmUgdGhhdCBub25lIG9mIHRoZSB0eXBlbWFwcyB1c2VkIGZvciB0aGUKICAgICAgICAgICAgc2V0IHdyYXBwZXJzIGFyZSB1c2VkIHdoZW4gZ2VuZXJhdGluZyB0aGUgZ2V0IHdyYXBwZXJzLiBJIGRvdWJ0IHRoaXMgd2FzIGEKICAgICAgICAgICAgcHJvYmxlbSBmb3IgYW55IGxhbmd1YWdlcyBleGNlcHQgZm9yIHRoZSByZWNlbnRseSBpbnRyb2R1Y2VkIG51bGwgYXR0cmlidXRlCiAgICAgICAgICAgIGluIHRoZSBvdXQgdHlwZW1hcCAoQyMgb25seSkuCgowOS8wOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBNb3JlIGRlc2NyaXB0aXZlIGVycm9yIG1lc3NhZ2VzIHdoZW4gZmlsZXMgZmFpbCB0byBvcGVuLgoKMDkvMDYvMjAwNTogbW1hdHVzIAoKCSAgICBBbGxvdyBhICVkZWZpbmUgYSBtYWNybyBpbnNpZGUgYW5vdGhlciAlZGVmaW5lIG1hY3JvLCBmb3IgZXhhbXBsZQoKCSAgICAgICVkZWZpbmUgaGVsbG8obmFtZSwgVHlwZSkKCSAgICAgICVkZWZpbmUgbmFtZSAjIyBhKFR5cGUpCgkgICAgICAldHlwZW1hcChpbikgVHlwZSAiaGVsbG87IjsKCSAgICAgICVlbmRkZWYKCSAgICAgICVlbmRkZWYKCSAgICAgIAoJICAgIFRvIGxlYXJuIGhvdyB0byB1c2UgdGhpcyBuZXcgZmVhdHVyZXMgaW4geW91ciBvd24gdHlwZW1hcHMgbGlicmFyeSwgc2VlCgkgICAgcHl0aG9uL2NzdHJpbmcuaSwgcHl0aG9uL2N3c3RyaW5nLmkgYW5kIHB5dGhvbi9jd3N0cmJhc2UuaS4JICAgIAoKICAgICAgICAgICAgW1B5dGhvbl0gTm9ybWFsaXplIHRoZSBjc3RyaW5nLmkgaW1wbGVtZW50YXRpb24gdG8gdXNlIGZyYWdtZW50cywgYW5kIGFkZAogICAgICAgICAgICBjd3N0cmluZy5pLCB3aGljaCBpbXBsZW1lbnRzIHRoZSBzYW1lIHR5cGVtYXBzIGJ1dCBmb3Igd2NoYXJfdCBzdHJpbmdzLgoKCSAgICBbUHl0aG9uXSBCdWcgZml4ZWQ6IDEyNDc0NzcsIDEyNDU1OTEsIDEyNDk4NzggYW5kIG90aGVycy4KCjA4LzE4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBJbXBsZW1lbnQgc3VwcG9ydCBmb3IgU1dJR1RZUEUqIERJU09XTiB0eXBlbWFwIChsaWtlIGluIFB5dGhvbikgZm9yCiAgICAgICAgICAgIGJldHRlciBjb250cm9sIG9mIG1lbW9yeSBtYW5hZ2VtZW50LCBlZyB3aGVuIGFkZGluZyBhbiBvYmplY3QgY3JlYXRlZCBpbiBSdWJ5CiAgICAgICAgICAgIHRvIGEgQysrIGNvbnRhaW5lci4gUGF0Y2ggIzEyNjE2OTIgZnJvbSBDaGFybGllIFNhdmFnZS4KCjA4LzE4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtUY2xdIDY0IGJpdCBwbGF0Zm9ybSBmaXhlcyBmb3IgdGhlIHZhcmFyZ3MgaGFuZGxpbmcgaW4gU1dJR19HZXRBcmdzLiBUaGlzIGlzIGFuCiAgICAgICAgICAgIGltcHJvdmVkIGZpeCBmb3IgYnVnICMxMDExNjA0IGFzIHN1Z2dlc3RlZCBieSBKZXJlbXkgTGluLgoKMDgvMTgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1RjbF0gQnVnICMxMjQwNDY5IC0gJW5ld29iamVjdCBzdXBwb3J0IGZvciBUY2wuIFBhdGNoIGZyb20gQm9iIE1hcmluaWVyLgoKMDgvMTYvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIEJ1ZyAjMTI1NDQ5NCAtIEZpeCBmb3IgZ2xvYmFsIG5hbWVzcGFjZSBwb2xsdXRpb24gYnkgcGVybCBoZWFkZXIgZmlsZXMKICAgICAgICAgICAgKGJvb2wgZGVmaW5lKSBwcmV2ZW50ZWQgU1RMIGhlYWRlcnMgZnJvbSBiZWluZyB1c2VkIG9uIHNvbWUgc3lzdGVtcywgZWcKICAgICAgICAgICAgV2luZG93cyB3aXRoIFZpc3VhbCBTdHVkaW8uCgowOC8xNi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gQnVnICMxMjQwOTM3IC0gUmVkZWZpbml0aW9uIG9mIF9faW50NjQgdHlwZWRlZiBmb3IgSW50ZWwgY29tcGlsZXJzLgoKMDgvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1htbF0gQnVnICMxMjUxODMyIC0gIEMrKyB0ZW1wbGF0ZSBtYXkgZ2VuZXJhdGUgaW52YWxpZCBYTUwgZmlsZQoKMDgvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gU3VwcG9ydCBhZGRlZCBmb3IgTHVhLiBQYXRjaCAjMTI0Mjc3MiBmcm9tIE1hcmsgR29zc2FnZS4KICAgICAgICAgICAgSXQgc3VwcG9ydHMgbW9zdCBDL0MrKyBmZWF0dXJlcyAoZnVuY3Rpb25zLCBzdHJ1Y3QsIGNsYXNzZXMsIGFycmF5cywgcG9pbnRlcnMsCiAgICAgICAgICAgIGV4Y2VwdGlvbnMpLCBhcyB3ZWxsIGFzIGxvdHMgb2YgZG9jdW1lbnRhdGlvbiBhbmQgYSBmZXcgdGVzdCBjYXNlcyAmIGV4YW1wbGVzLgoKMDgvMTQvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1htbF0gRml4IGluY29ycmVjdCB4bWwgZXNjYXBpbmcgaW4gYmFzZSBjbGFzcyBuYW1lIHdoZW4gYmFzZSBjbGFzcyBpcyBhIHRlbXBsYXRlLgoKMDgvMTMvMjAwNTogZWZ1enp5b25lCgkgICAgW0NMSVNQXSBBZGRlZCBzdXBwb3J0IGZvciBoYW5kbGluZyBlbnVtcy4gRG9lcyBub3QgYWRkcyB0aGUgcmV0dXJuIHR5cGUgZGVjbGFyYXRpb24KCSAgICB0byB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbiwgaWYgYSBmdW5jdGlvbiByZXR1cm5zIHZvaWQuCgowOC8wOS8yMDA1OiBta29lcHBlCgkgICAgTmV3IGxhbmd1YWdlIG1vZHVsZSwgQ29tbW9uIExpc3Agd2l0aCBVRkZJLCBmcm9tIFV0ei1Vd2UgSGF1cy4KCjA4LzA5LzIwMDU6IG1rb2VwcGUKCSAgICBGaXggdGhlIExpc3Agcy1leHByZXNzaW9uIG91dHB1dCBtb2R1bGU7IGl0IG5vIGxvbmdlciBjb21wbGFpbnMgYWJvdXQgInVua25vd24gdGFyZ2V0cyIuCgowNy8yNy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBNb2RpZmljYXRpb25zIHRvIFNUTCB3cmFwcGVycyBzbyB0aGF0IGl0IGlzIHBvc3NpYmxlIGZvciBhIHVzZXIncyAlZXhjZXB0aW9uIGRpcmVjdGl2ZQogICAgICAgICAgICB0byBiZSBhcHBsaWVkIHRvIHRoZSBTVEwgd3JhcHBlciBtZXRob2RzLiBQcmV2aW91c2x5IHRoZSBmb2xsb3dpbmcgZ2xvYmFsICVleGNlcHRpb24KICAgICAgICAgICAgZGlyZWN0aXZlIHdvdWxkIG5vdCBiZSB1c2VkIG9uIHRoZSB3cmFwcGVyIG1ldGhvZHM6CgogICAgICAgICAgICAgICAgJWV4Y2VwdGlvbiB7IAogICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICRhY3Rpb24KICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoLi4uKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIHVuY2F1Z2h0IGV4Y2VwdGlvbnMKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhpcyBoYXMgYmVlbiBpbXBsZW1lbnRlZCBieSByZXBsYWNpbmcgJWV4Y2VwdGlvbiBkaXJlY3RpdmVzIGZvciBzcGVjaWZpYyBTVEwgd3JhcHBlcgogICAgICAgICAgICBtZXRob2RzIHdpdGggYW4gZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gZGVjbGFyZWQgb24gdGhlIHdyYXBwZXIgbWV0aG9kcy4gdGhyb3dzIHR5cGVtYXBzCiAgICAgICAgICAgIGFyZSBub3cgc3VwcGxpZWQgZm9yIGhhbmRsaW5nIHRoZSBTVEwgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24uIFRoZXNlIGNhbiBhbHNvIGJlIGVhc2lseQogICAgICAgICAgICBvdmVycmlkZGVuLCBmb3IgZXhhbXBsZSB0aGUgc3RkOjpvdXRfb2ZfcmFuZ2UgZXhjZXB0aW9uLCB3aGljaCBpcyB1c2VkIGEgbG90IGluIHRoZSBTVEwKICAgICAgICAgICAgd3JhcHBlcnMsIGNhbiBiZSBjdXN0b21pc2VkIGVhc2lseToKCiAgICAgICAgICAgICAgJWluY2x1ZGUgInN0ZF92ZWN0b3IuaSIKICAgICAgICAgICAgICAldHlwZW1hcCh0aHJvd3MpIHN0ZDo6b3V0X29mX3JhbmdlIHsKICAgICAgICAgICAgICAgIC8vIGN1c3RvbSBleGNlcHRpb24gaGFuZGxlcgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAldGVtcGxhdGUoVmVjdEludCkgc3RkOjp2ZWN0b3I8aW50PjsKCjA3LzIyLzIwMDU6IGVmdXp6eW9uZQogICAgICAgICAgICBbQ0xJU1BdIFRoZSBjbGlzcCBtb2R1bGUgZm9yIFNXSUc6CiAgICAgICAgICAgICAgLSBJdCBjYW4gb25seSBoYW5kbGUgQywgY2xpc3AgY3VycmVudGx5IGRvZXMgbm90IHN1cHBvcnRzIGZmaSBiaW5kaW5ncyB0byBDKysuCiAgICAgICAgICAgICAgLSBJdCBoYXMgdHdvIG9wdGlvbnMsIChhKSAtZXh0ZXJuLWFsbCB0aGlzIHdpbGwgZ2VuZXJhdGUgd3JhcHBlcnMgZm9yIGFsbCBmdW5jdGlvbnMKICAgICAgICAJYW5kIHZhcmlhYmxlc3Rpb25zLCAoYikgLWdlbmVyYXRlLXR5cGVkZWYgdGhpcyB3aWxsIGdlbmVyYXRlIHdyYXBwZXJzICJkZWYtYy10eXBlIgoJICAgICAgICB3cmFwcGVycyBmb3IgdHlwZWRlZnMKCSAgICAgIC0gQ2FuIGhhbmRsZSBwb2ludGVycyB0byBmdW5jdGlvbnMsIGNvbXBsZXggdHlwZXMgc3VjaCBhcyBuLWRpbWVuc2lvbmFsIGFycmF5cyBvZiAKCSAJcG9pbnRlcnMgb2YgZGVwdGggZAoJICAgICAgLSBHZW5lcmF0ZXMgd3JhcHBlcnMgZm9yIGNvbnN0YW50cyBhcyB3ZWxsIGFzIHZhcmlhYmxlcwoJICAgICAgLSBDb3JyZWN0bHkgZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIHRoZSBkZWNsYXJhdGlvbiBvZiB2YXJpYWJsZXMgaW4gc3RydWN0dXJlcyBhbmQgZnVuY3Rpb25zCgkgICAgICAtIENyZWF0ZXMgYSBkZWZwYWNrYWdlICJkZWNsYXJhdGlvbiIgd2l0aCB0aGUgbW9kdWxlIG5hbWUgYXMgdGhlIHBhY2thZ2UgbmFtZSwgdGhlIGNyZWF0ZWQgCgkgICAgCXBhY2thZ2UgZXhwb3J0cyBib3RoIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzCgkgICAgICAtIHRyaWVzIHRvIGd1ZXNzIHdoZW4gc2hvdWxkIGEgcG9pbnRlciB2YXJpYWJsZSBiZSBkZWNsYXJlZCBhcyBjLXB0ciBvciBjLXBvaW50ZXIKCjA3LzIyLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQ2hhbmdlcyB0byBzdXBwb3J0IEMjIHN0cnVjdHMgcmV0dXJuZWQgYnkgdmFsdWUuIFRoZSBjaGFuZ2VzIHJlcXVpcmVkIGFyZToKICAgICAgICAgICAgICAtIFVzaW5nIGFuIG9wdGlvbmFsICdudWxsJyBhdHRyaWJ1dGUgaW4gdGhlIG91dCB0eXBlbWFwLiBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQsCiAgICAgICAgICAgICAgICB0aGVuIGl0IGlzIHVzZWQgZm9yIHRoZSAkbnVsbCBzcGVjaWFsIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KICAgICAgICAgICAgICAtIFRoZSBjdHlwZSB1c2VkIGluIHRoZSBDL0MrKyB3cmFwcGVycyBpcyBubyBsb25nZXIgaW5pdGlhbGlzZWQgdG8gMCBvbiBkZWNsYXJhdGlvbi4KICAgICAgICAgICAgQm90aCBvZiB0aGVzZSBjaGFuZ2VzIGZpeCB0aGUgc2l0dWF0aW9ucyB3aGVyZSBhbiBhdHRlbXB0IHdhcyBtYWRlIHRvIGFzc2lnbiAwIHRvIHRoZQogICAgICAgICAgICByZXR1cm5lZCBzdHJ1Y3QuIE1hcnNoYWxsaW5nIHN0cnVjdHMgYXMgdmFsdWUgdHlwZXMgc3RpbGwgcmVxdWlyZXMgdXNlciBkZWZpbmVkIHR5cGVtYXBzLgogICAgICAgICAgICBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgYW4gZXhhbXBsZS4KCjA3LzIyLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gRml4IFNXSUdfZXhjZXB0aW9uIHVzYWdlIHRvIHdvcmsgd2l0aCBjb21waWxlcnMgdGhhdCBkb24ndCBzdXBwb3J0IGVtcHR5IG1hY3JvCiAgICAgICAgICAgIGFyZ3VtZW50cy4gVW5mb3J0dW5hdGVseSB0aGlzIGZpeCB3aWxsIHN0b3AgdXNhZ2Ugb2YgU1dJR19leGNlcHRpb24gYmVpbmcgdXNlZCB3aXRoaW4gdHlwZW1hcHMKICAgICAgICAgICAgdGhhdCB1c2UgIiIgb3IgJXsgJX0gZGVsaW1pdGVycywgYnV0IGNvbnRpbnVlcyB0byB3b3JrIHdpdGggdHlwZW1hcHMgdXNpbmcge30gZGVsaW1pdGVycy4KICAgICAgICAgICAgUGxlYXNlIHVzZSB0aGUgU1dJR19DU2hhcnBTZXRQZW5kaW5nRXhjZXB0aW9uQXJndW1lbnQgb3IgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24gbWV0aG9kcyBpbnN0ZWFkCiAgICAgICAgICAgIGFzIFNXSUdfZXhjZXB0aW9uIGlzIHJlYWxseSBpbnRlbmRlZCBhcyBhIHBsYXRmb3JtIGluZGVwZW5kZW50IG1hY3JvIGZvciB0aGUgU1dJRyBsaWJyYXJ5IHdyaXRlcnMuCgowNy8xNi8yMDA1OiBta29lcHBlCgkgICAgW0FsbGVncm8gQ0xdIFVzZSBzcGVjaWZpYyBmb3JlaWduIHR5cGVzIHJhdGhlciB0aGFuICgqIDp2b2lkKS4gCgkgICAgVXNlICpzd2lnLWlkZW50aWZpZXItY29udmVydGVyKi4KCjA2LzI3LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZ1bmN0aW9ucyBkZWNsYXJlZCBhcyAnZXh0ZXJuJyBubyBsb25nZXIgaGF2ZSBhbiBhZGRpdGlvbmFsIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGFkZGVkIHRvIHRoZSAKICAgICAgICAgICAgd3JhcHBlciBmaWxlcy4gVGhlcmUgYXJlIHNvbWUgY2FzZXMgd2hlcmUgU1dJRyBkb2VzIG5vdCBnZXQgdGhpcyByaWdodCwgZWcgYnVnICMxMjA1ODU5IChleHRlcm4KICAgICAgICAgICAgZnVuY3Rpb25zIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgZGVjbGFyZWQgaW4gYSBuYW1lc3BhY2UpLiBBbHNvIFNXSUcgY2Fubm90IGdldCBub24tc3RhbmRhcmQKICAgICAgICAgICAgY2FsbGluZyBjb252ZW50aW9ucyBjb3JyZWN0LCBlZyBXaW5kb3dzIGNhbGxpbmcgY29udmVudGlvbnMgYXJlIHVzdWFsbHkgaGFuZGxlZCBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgI2RlZmluZSBETExJTVBPUlQgX19kZWNsc3BlYyhkbGxpbXBvcnQpCiAgICAgICAgICAgICAgI2RlZmluZSBTVERDQUxMIF9fc3RkY2FsbAogICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgI2RlZmluZSBETExJTVBPUlQKICAgICAgICAgICAgICAjZGVmaW5lIFNURENBTEwKICAgICAgICAgICAgICAlaW5saW5lICV7CiAgICAgICAgICAgICAgRExMSU1QT1JUIGV4dGVybiBTVERDQUxMIHZvaWQgZnVuY3Rpb24oaW50KTsKICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgU1dJRyBpbmNvcnJlY3RseSBnZW5lcmF0ZXM6CgogICAgICAgICAgICBleHRlcm4gdm9pZCBmdW5jdGlvbihpbnQpOwoKICAgICAgICAgICAgVG8gd2hpY2ggdGhlcmUgaXMgbm8gc29sdXRpb24gYXMgU1dJRyBkb2Vzbid0IGhhbmRsZSBub24tc3RhbmRhcmQgY2FsbGluZyBjb252ZW50aW9ucy4gVGhlIGV4dHJhCiAgICAgICAgICAgICdleHRlcm4nIGZ1bmN0aW9uIHRoYXQgU1dJRyBnZW5lcmF0ZXMgaXMgc3VwZXJmbHVvdXMgdW5sZXNzIGEgdXNlciBoYXMgZm9yZ290dGVuIHRvIGFkZCB0aGUgZnVuY3Rpb24KICAgICAgICAgICAgZGVjbGFyYXRpb24gaW50byB0aGUgd3JhcHBlcnMuCgogICAgICAgICAgICBUaGUgLW5vZXh0ZXJuIGNvbW1hbmRsaW5lIGFyZ3VtZW50IGlzIG5vdyByZWR1bmRhbnQgYW5kIGEgbmV3IGNvbW1hbmRsaW5lIGFyZ3VtZW50IC1hZGRleHRlcm4gY2FuCiAgICAgICAgICAgIGJlIHVzZWQgdG8gb2J0YWluIHRoZSBvcmlnaW5hbCBiZWhhdmlvdXIuIFRoaXMgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSB1bmxlc3MgdGhlIGhlYWRlciBmaWxlCiAgICAgICAgICAgIGNvbnRhaW5pbmcgdGhlIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIHdhcyBpbmFkdmVydGVudGx5IG5vdCBhZGRlZCB0byB0aGUgd3JhcHBlcnMuIFRvIGZpeCB0aGlzCiAgICAgICAgICAgIGFkZCB0aGUgZnVuY3Rpb24gZGVjbGFyYXRpb24gaW50byB5b3VyIHdyYXBwZXJzLCBGb3IgZXhhbXBsZSwgcmVwbGFjZToKCiAgICAgICAgICAgICAgZXh0ZXJuIHZvaWQgZm9vKGludCk7CgogICAgICAgICAgICB3aXRoOgoKICAgICAgICAgICAgICAlaW5saW5lICV7CiAgICAgICAgICAgICAgZXh0ZXJuIHZvaWQgZm9vKGludCk7CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMDYvMjIvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhLCBNb2R1bGEzLCBPY2FtbF0KICAgICAgICAgICAgVGhlIGludGVybWVkaWFyeSBmdW5jdGlvbiBuYW1lcyBoYXZlIGJlZW4gY2hhbmdlZCB3aGVuIHdyYXBwaW5nIHZhcmlhYmxlcyB0bwogICAgICAgICAgICBtYXRjaCB0aGUgb3RoZXIgbGFuZ3VhZ2UgbW9kdWxlcyBzbyB0aGF0ICVleHRlbmQgZm9yIGEgbWVtYmVyIHZhcmlhYmxlIHdvcmtzCiAgICAgICAgICAgIHVuaWZvcm1seSBhY3Jvc3MgYWxsIGxhbmd1YWdlIG1vZHVsZXMsIGVnOgoKICAgICAgICAgICAgICAlZXh0ZW5kIEV4dGVuZE1lIHsKICAgICAgICAgICAgICAgIFZhcjsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgICAgdm9pZCBFeHRlbmRNZV9WYXJfc2V0KEV4dGVuZE1lICosIGRvdWJsZSkgey4uLn0KICAgICAgICAgICAgICAgIGRvdWJsZSBFeHRlbmRNZV9WYXJfZ2V0KEV4dGVuZE1lICopIHsuLi59CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFRoZSBtZXRob2RzIGltcGxlbWVudGluZyB0aGUgZ2V0L3NldCB1c2VkIHRvIGJlOgoKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgICAgdm9pZCBzZXRfRXh0ZW5kTWVfVmFyKEV4dGVuZE1lICosIGRvdWJsZSkgey4uLn0KICAgICAgICAgICAgICAgIGRvdWJsZSBnZXRfRXh0ZW5kTWVfVmFyKEV4dGVuZE1lICopIHsuLi59CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFRoaXMgYWxzbyBjaGFuZ2VzIHRoZSBuYW1lIG9mIHZhcmlhYmxlIHdyYXBwZXIgZnVuY3Rpb25zIHdoZW4gdXNpbmcgLW5vcHJveHkuCiAgICAgICAgICAgIFRoZSBvcmlnaW5hbCBuYW1lcyBjYW4gYmUgZ2VuZXJhdGVkIHdpdGggdGhlIC1vbGR2YXJuYW1lcyBjb21tYW5kbGluZSBvcHRpb24uCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKClZlcnNpb24gMS4zLjI1IChKdW5lIDExLCAyMDA1KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjA2LzExLzIwMDY6IG1rb2VwcGUKCSAgICBbR3VpbGVdIEZpeCBoYW5kbGluZyBvZiBhbm9ueW1vdXMtZW51bSB2YXJpYWJsZXMuCgowNi8xMC8yMDA1OiBta29lcHBlCgkgICAgW0d1aWxlXSBGaXggZm9yIGZ1bmN0aW9uIGFyZ3VtZW50cyB0aGF0IGFyZSBwYXNzZWQgYnkKCSAgICBjb3B5LW9mLXZhbHVlLiAgRml4IGZvciBnbG9iYWwgImNvbnN0IGNoYXIgKiIgdmFyaWFibGVzLgoJICAgIEZpeCB0ZXN0Y2FzZXMgYXJyYXlzX2RpbWVuc2lvbmxlc3MsIGFycmF5c19nbG9iYWwuCgowNi8wOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yIHdoZW4gYSBiYXNlIGNsYXNzIGRlZmluZXMgYSBzeW1ib2wgYXMgYSBtZW1iZXIgdmFyaWFibGUgYW5kIGEgZGVyaXZlZCBjbGFzcyBkZWZpbmVzCiAgICAgICAgICAgIHRoZSBzYW1lIHN5bWJvbCBhcyBhIG1lbWJlciBtZXRob2QuCgowNi8wOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIE1vcmUgZml4ZXMgZm9yIHZpcnR1YWwvbmV3L292ZXJyaWRlIG1vZGlmaWVycyAtIHdoZW4gYSBtZXRob2QgaGFzIHByb3RlY3RlZCBhY2Nlc3MgCiAgICAgICAgICAgIGluIGJhc2UgYW5kIHB1YmxpYyBhY2Nlc3MgaW4gZGVyaXZlZCBjbGFzcy4KCjA2LzAyLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTA2NjM2MyAtIEZvbGxvdyBjb252ZW50aW9uIG9mIHJlbGVhc2UgdGFyYmFsbCBuYW1lIG1hdGNoaW5nIGRpcmVjdG9yeSBuYW1lLgoKMDYvMDIvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBGaXggIzEyMTEzNTMgLSB0eXBlc2FmZSBlbnVtcyAoYW5kIEphdmEgcHJvcGVyIGVudW1zKSB3cmFwcGVycyB3aGVuIGVudW0gdmFsdWUKICAgICAgICAgICAgaXMgbmVnYXRpdmUuCgowNS8yNy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBNb2Rlcm5pc2VkIGFuZCB0aWRpZWQgdXAgV2luZG93cyBtYWNyb3MgLS0+IFNXSUdFWFBPUlQsIFNXSUdTVERDQUxMLiBUaGV5IGNhbiBiZSBvdmVycmlkZGVuCiAgICAgICAgICAgIGJ5IHVzZXJzIHZpYSAtRCBjb21waWxlciBkaXJlY3RpdmVzIGlmIG5lZWQgYmUuCgowNS8yNi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICAlY3NtZXRob2Rtb2RpZmllcnMgY2FuIGJlIGFwcGxpZWQgdG8gdmFyaWFibGVzIGFzIHdlbGwgYXMgbWV0aG9kcyBub3cuCgogICAgICAgICAgICBJbiBhZGRpdGlvbiB0byB0aGUgZGVmYXVsdCAncHVibGljJyBtb2RpZmllciB0aGF0IFNXSUcgZ2VuZXJhdGVzLCAlY3NtZXRob2Rtb2RpZmllcnMgd2lsbCBhbHNvCiAgICAgICAgICAgIHJlcGxhY2UgdGhlIHZpcnR1YWwvbmV3L292ZXJyaWRlIG1vZGlmaWVycyB0aGF0IFNXSUcgdGhpbmtzIGlzIGFwcHJvcHJpYXRlLiBUaGlzIGZlYXR1cmUgaXMKICAgICAgICAgICAgdXNlZnVsIGZvciBzb21lIG9ic2N1cmUgY2FzZXMgd2hlcmUgU1dJRyBtaWdodCBnZXQgdGhlIG1vZGlmaWVycyBpbmNvcnJlY3QsIGZvciBleGFtcGxlCiAgICAgICAgICAgIHdpdGggbXVsdGlwbGUgaW5oZXJpdGFuY2UgYW5kIG92ZXJyaWRpbmcgYSBtZXRob2QgaW4gdGhlIGJhc2UgY2xhc3MuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgQyMgTU9EVUxFICoqKgoKMDUvMjUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgQWRkZWQgbWlzc2luZyBjb25zdHJ1Y3RvcnMgdG8gc3RkOjpwYWlyIHdyYXBwZXJzIChzdGRfcGFpci5pKSBmb3IgYWxsIGxhbmd1YWdlcy4KCjA1LzI1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQWRkZWQgc3RkOjpwYWlyIHdyYXBwZXJzIGluIHN0ZF9wYWlyLmkKCjA1LzI1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gVGhlIEMjICduZXcnIGFuZCAnb3ZlcnJpZGUnIG1vZGlmaWVycyB3aWxsIGJlIGdlbmVyYXRlZCB3aGVuIGEgQysrIGNsYXNzIGluaGVyaXRzIG1ldGhvZHMKICAgICAgICAgICAgdmlhIGEgQysrICd1c2luZycgZGVjbGFyYXRpb24uCgowNS8yNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9ucyBwcmV2aW91c2x5IGJlaW5nIGlnbm9yZWQgaW4gY2xhc3NlcyB0aGF0IGluaGVyaXRlZCBtZXRob2RzCiAgICAgICAgICAgIGZyb20gJ3VzaW5nJyBkZWNsYXJhdGlvbnMsIGVnIGNhbGxzIHRvIERlcml2ZWQ6OmJhciBiZWxvdyB3aWxsIGNvbnZlcnQgQysrIGV4Y2VwdGlvbnMgaW50bwogICAgICAgICAgICBhIHRhcmdldCBsYW5ndWFnZSBleGNlcHRpb24vZXJyb3IsIGxpa2UgaXQgYWx3YXlzIGhhcyBkb25lIGZvciBCYXNlOjpCYXIuCgogICAgICAgICAgICBjbGFzcyBCYXNlIHsKICAgICAgICAgICAgICB2aXJ0dWFsIGJhcigpIHRocm93IChzdGQ6OnN0cmluZyk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGNsYXNzIERlcml2ZWQgOiBwdWJsaWMgQmFzZSB7CiAgICAgICAgICAgICAgdXNpbmcgQmFzZTo6YmFyOwogICAgICAgICAgICB9OwoKMDUvMjMvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4ZXMgZm9yIGRldGVjdGluZyB2aXJ0dWFsIG1ldGhvZHMgaW4gJWV4dGVuZCBmb3IgdGhlIC1mdmlydHVhbCBvcHRpb24gYW5kIEMjIG92ZXJyaWRlIGFuZCBuZXcKICAgICAgICAgICAgbWV0aG9kIG1vZGlmaWVycy4KCjA1LzIzLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gVGhlICduZXcnIG1vZGlmaWVyIGlzIG5vdyBnZW5lcmF0ZWQgb24gdGhlIHByb3h5IG1ldGhvZCB3aGVuIGEgbWV0aG9kIGluIGEgZGVyaXZlZAogICAgICAgICAgICBjbGFzcyBpcyBub3QgcG9seW1vcnBoaWMgYW5kIHRoZSBzYW1lIG1ldGhvZCBleGlzdHMgaW4gdGhlIGRlcml2ZWQgY2xhc3MgKGllIGl0IGhpZGVzCiAgICAgICAgICAgIHRoZSBiYXNlIGNsYXNzJyBub24tdmlydHVhbCBtZXRob2QpLgoKMDUvMjMvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBGaXhlcyB0byBkZXRlY3Rpb24gb2YgY292YXJpYW50IHJldHVybiB0eXBlcyAtIHdoZW4gdGhlIGNsYXNzIGhpZXJhcmNoeSBpcyBtb3JlCiAgICAgICAgICAgIHRoYW4gMiBjbGFzc2VzIGRlZXAuCgowNS8yMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gc3RkOjp3c3RyaW5nIHR5cGVtYXBzIG1vdmVkIGZyb20gc3RkX3N0cmluZy5pIHRvIHN0ZF93c3RyaW5nLmkKCjA1LzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBmb3IgY3Jhc2ggaW4gRG9oU3Ryc3RyLCBidWcgIzExOTA5MjEKCjA1LzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtUQ0xdIEZpeCBmb3IgbWV0aG9kcyB3aXRoIHNpbWlsYXIgbmFtZXMgd2hlbiBzaG93aW5nIGxpc3Qgb2YgbmFtZXMgb24gZXJyb3IgLSBidWcgIzExOTE4MjguCiAgICAgICAgICAgIFBhdGNoIGZyb20gSmVyb2VuIERvYmJlbGFlcmUuCgowNS8yMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbVENMXSBsb25nIGxvbmcgb3ZlcmxvYWRpbmcgZml4IC0gYnVnICMxMTkxODM1LCBwYXRjaCBmcm9tIEplcm9lbiBEb2JiZWxhZXJlLgoKMDUvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGJ1ZyAjMTE5Njc1NSB0byByZW1vdmUgZGVidWcgZnJvbSBzd2lndGNsOC5zd2cuCgowNS8xOS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMgYW5kIC1mdmlydHVhbCBvcHRpb25dIEZpeCBmb3IgdGhlIG92ZXJyaWRlIGtleSBub3QgYmVpbmcgZ2VuZXJhdGVkIGluIHRoZSBkZXJpdmVkIGNsYXNzIHdoZW4gYQogICAgICAgICAgICB2aXJ0dWFsIG1ldGhvZCdzIHJldHVybiB0eXBlIHdhcyBhIHR5cGVkZWYgaW4gZWl0aGVyIHRoZSBiYXNlIG9yIGRlcml2ZWQgY2xhc3MuIEFsc28gZW5zdXJlcyB0aGUKICAgICAgICAgICAgbWV0aG9kIGlzIGVsaW1pbmF0ZWQgd2hlbiB1c2luZyB0aGUgLWZ2aXJ0dWFsIG9wdGlvbi4gRm9yIGV4YW1wbGUsIERlcml2ZWQubWV0aG9kIG5vdyBoYXMgdGhlIEMjCiAgICAgICAgICAgIG92ZXJyaWRlIGtleXdvcmQgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgICB0eXBlZGVmIGludCogSW50ZWdlclB0cjsKCiAgICAgICAgICAgICAgc3RydWN0IEJhc2UgewogICAgICAgICAgICAgICAgdmlydHVhbCBJbnRlZ2VyUHRyIG1ldGhvZCgpOwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgIHN0cnVjdCBEZXJpdmVkIDogQmFzZSB7CiAgICAgICAgICAgICAgICBpbnQgKiBtZXRob2QoKSBjb25zdDsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgW0MjXSBGaXggZm9yIHRoZSBvdmVycmlkZSBrZXkgYmVpbmcgaW5jb3JyZWN0bHkgZ2VuZXJhdGVkIGZvciB2aXJ0dWFsIG1ldGhvZHMgd2hlbiBhIGJhc2UgY2xhc3MKICAgICAgICAgICAgaXMgaWdub3JlZCB3aXRoICVpZ25vcmUuCgowNS8xMy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4ZXMgdG8gcmVtb3ZlICJkZXJlZmVyZW5jaW5nIHR5cGUtcHVubmVkIHBvaW50ZXIgd2lsbCBicmVhayBzdHJpY3QtYWxpYXNpbmcgcnVsZXMiCiAgICAgICAgICAgIHdhcm5pbmdzIGluIEMgd3JhcHBlcnMgd2hlbiBjb21waWxpbmcgQyBjb2RlIHdpdGggJ2djYyAtV2FsbCAtZnN0cmljdC1hbGlhc2luZycuIFBhdGNoIGZyb20KICAgICAgICAgICAgTWljaGFlbCBDYWhpbGwuIFRoaXMgbW9kaWZpZXMgbWFueSBvZiB0aGUgY2FzdHMgc2xpZ2h0bHksIGZvciBleGFtcGxlCiAgICAgICAgICAgICAgYXJnMSA9ICooREJfRU5WICoqKSZqYXJnMTsKICAgICAgICAgICAgdG8KICAgICAgICAgICAgICBhcmcxID0gKihEQl9FTlYgKiopKHZvaWQgKikmamFyZzE7CgowNS8xMi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFN1cHBvcnQgZm9yIEMjIGF0dHJpYnV0ZXMuIEMjIGF0dHJpYnV0ZXMgY2FuIGJlIGdlbmVyYXRlZDoKICAgICAgICAgICAgMSkgT24gYSBDL0MrKyB0eXBlIGJhc2lzIGJ5IHNwZWNpZnlpbmcgYW4gaW5hdHRyaWJ1dGVzIGFuZC9vciBvdXRhdHRyaWJ1dGVzIHR5cGVtYXAgYXR0cmlidXRlCiAgICAgICAgICAgICAgIGluIHRoZSBpbXR5cGUgb3IgY3N0eXBlIHR5cGVtYXBzIChmb3IgQyMgcmV0dXJuIHR5cGUgb3IgQyMgcGFyYW1ldGVyIHR5cGUgYXR0cmlidXRlcykuCiAgICAgICAgICAgIDIpIE9uIGEgd3JhcHBlZCBtZXRob2Qgb3IgdmFyaWFibGUgYnkgc3BlY2lmeWluZyBhIGNzYXR0cmlidXRlcyBmZWF0dXJlICglZmVhdHVyZSkuCiAgICAgICAgICAgIDMpIE9uIGEgd3JhcHBlZCBwcm94eSBjbGFzcyBvciBlbnVtIGJ5IHNwZWNpZnlpbmcgYSBjc2F0dHJpYnV0ZXMgdHlwZW1hcC4KCiAgICAgICAgICAgIEV4YW1wbGVzIGFyZSBpbiB0aGUgQyMgZG9jdW1lbnRhdGlvbiAoQ1NoYXJwLmh0bWwpLgoKMDQvMjkvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgTmV3IGNvbmZpZ3VyZSBvcHRpb24gdG8gdHVybiBvZmYgdGhlIGRlZmF1bHQgbWF4aW11bSBjb21waWxlciB3YXJuaW5nIGFzCiAgICAgICAgICAgIHRoZXkgY291bGRuJ3QgYmUgcmVtb3ZlZCBldmVuIHdoZW4gb3ZlcnJpZGluZyBDRkxBR1MgYW5kIENYWEZMQUdTIHdpdGggY29uZmlndXJlCiAgICAgICAgICAgICguL2NvbmZpZ3VyZSBDRkxBR1M9IENYWEZMQUdTPSkuIFRvIHR1cm4gdGhlIG1heGltdW0gd2FybmluZ3Mgb2ZmLCBydW46ICAKCiAgICAgICAgICAgICAgLi9jb25maWd1cmUgLS13aXRob3V0LW1heGltdW0tY29tcGlsZS13YXJuaW5ncwoKMDQvMjgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggZnJvbSBTY290dCBNaWNoZWwgd2hpY2ggcmV3b3JrcyB0aGUgSmF2YSBjb25zdHJ1Y3RvciBhbmQgZmluYWxpemUvZGVzdHJ1Y3RvciB0eXBlbWFwcywKICAgICAgICAgICAgZm9yIGRpcmVjdG9ycyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBvdmVyYWxsIEphdmEgdHlwZW1hcHMuIEFkZGVkIHRoZSBkaXJlY3Rvcl90YWtlIGFuZCAKICAgICAgICAgICAgZGlyZWN0b3JfcmVsZWFzZSB0eXBlbWFwcyB0byBlbXVsYXRlIG90aGVyIG1vZHVsZXMnIF9fZGlzb3duX18gZnVuY3Rpb25hbGl0eS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIERJUkVDVE9SUyAqKioKCjA0LzI4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4ZWQgcHJvYmxlbXMgZHVlIHRvIHRoZSBvdmVyIGVhZ2VyIGdhcmJhZ2UgY29sbGVjdG9yLiBPY2Nhc2lvbmFsbHkgdGhlCiAgICAgICAgICAgIGdhcmJhZ2UgY29sbGVjdG9yIHdvdWxkIGNvbGxlY3QgYSBDIyBwcm94eSBjbGFzcyBpbnN0YW5jZSB3aGlsZSBpdCB3YXMgYmVpbmcgdXNlZAogICAgICAgICAgICBpbiB1bm1hbmFnZWQgY29kZSBpZiB0aGUgb2JqZWN0IHdhcyBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIgdG8gYSB3cmFwcGVkIGZ1bmN0aW9uLgogICAgICAgICAgICBOZWVkbGVzcyB0byBzYXkgdGhpcyBjYXVzZWQgaGF2b2MgYXMgdGhlIEMjIHByb3h5IGNsYXNzIGNhbGxzIHRoZSBDKysgZGVzdHJ1Y3RvcgogICAgICAgICAgICB3aGVuIGl0IGlzIGNvbGxlY3RlZC4gUHJveHkgY2xhc3NlcyBhbmQgdHlwZSB3cmFwcGVyIGNsYXNzZXMgbm93IHVzZSBhIEhhbmRsZVJlZiwKICAgICAgICAgICAgd2hpY2ggaG9sZHMgYW4gSW50UHRyLCBpbnN0ZWFkIG9mIGEgcGxhaW4gSW50UHRyIHRvIG1hcnNoYWwgdGhlIEMrKyBwb2ludGVyIHRvIHVubWFuYWdlZAogICAgICAgICAgICBjb2RlLiBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhbnkgcGVyZm9ybWFuY2UgZGVncmFkYXRpb24gYXMgYSByZXN1bHQgb2YgdGhpcwogICAgICAgICAgICBtb2RpZmljYXRpb24uCgogICAgICAgICAgICBUaGUgY2hhbmdlcyBhcmUgaW4gdGhlIHByb3h5IGFuZCB0eXBlIHdyYXBwZXIgY2xhc3Nlcy4gVGhlIHN3aWdDUHRyIGlzIG5vdyBvZiB0eXBlIEhhbmRsZVJlZgogICAgICAgICAgICBpbnN0ZWFkIG9mIEludFB0ciBhbmQgY29uc2VxdWVudGx5IHRoZSBnZXRDUHRyIG1ldGhvZCByZXR1cm4gdHlwZSBoYXMgYWxzbyBjaGFuZ2VkLiBUaGUgbmV0CiAgICAgICAgICAgIGVmZmVjdCBpcyB0aGF0IGFueSBjdXN0b20gd3JpdHRlbiB0eXBlbWFwcyBtaWdodCBoYXZlIHRvIGJlIG1vZGlmaWVkIHRvIHN1aXRlLiBBZmZlY3RlZCB1c2VycwogICAgICAgICAgICBzaG91bGQgbm90ZSB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSBuZXcgJ291dCcgYXR0cmlidXRlIGluIHRoZSBpbXR5cGUgdHlwZW1hcCBhcyB0aGUKICAgICAgICAgICAgaW5wdXQgdHlwZSBpcyBub3cgYSBIYW5kbGVSZWYgYW5kIHRoZSBvdXRwdXQgdHlwZSBpcyBzdGlsbCBhbiBJbnRQdHIuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgQyMgTU9EVUxFICoqKgoKMDQvMjgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBTdXBwb3J0IGZvciBhc3ltbWV0cmljIHR5cGUgbWFyc2hhbGxpbmcgYWRkZWQuIFNvbWV0aW1lcyB0aGUgb3V0cHV0IHR5cGUgbmVlZHMgdG8gYmUKICAgICAgICAgICAgZGlmZmVyZW50IHRvIHRoZSBpbnB1dCB0eXBlLiBTdXBwb3J0IGZvciB0aGlzIGNvbWVzIGluIHRoZSBmb3JtIG9mIGEgbmV3IG9wdGlvbmFsICdvdXQnCiAgICAgICAgICAgIGF0dHJpYnV0ZSBmb3IgdGhlIGN0eXBlLCBpbXR5cGUgYW5kIGNzdHlwZSB0eXBlbWFwcy4gSWYgdGhpcyB0eXBlbWFwIGF0dHJpYnV0ZSBpcyBub3QKICAgICAgICAgICAgc3BlY2lmaWVkLCB0aGVuIHRoZSB0eXBlIHVzZWQgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dCBpcyB0aGUgdHlwZSBzcGVjaWZpZWQgaW4gdGhlCiAgICAgICAgICAgIHR5cGVtYXAsIGFzIGhhcyBhbHdheXMgcHJldmlvdXNseSBiZWVuIHRoZSBjYXNlLiBJZiB0aGlzIHR5cGVtYXAgYXR0cmlidXRlIGlzIHNwZWNpZmllZCwKICAgICAgICAgICAgdGhlbiB0aGUgdHlwZSBzcGVjaWZpZWQgaW4gdGhlIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBvdXRwdXQgdHlwZXMgYW5kIHRoZSB0eXBlIHNwZWNpZmllZAogICAgICAgICAgICBpbiB0aGUgdHlwZW1hcCBpdHNlbGYgaXMgdXNlZCBmb3IgdGhlIGlucHV0IHR5cGUuIEFuIG91dHB1dCB0eXBlIGlzIGEgcmV0dXJuIHZhbHVlIGZyb20KICAgICAgICAgICAgYSB3cmFwcGVkIG1ldGhvZCBvciB3cmFwcGVkIGNvbnN0YW50IGFuZCBhbiBpbnB1dCB0eXBlIGlzIGEgcGFyYW1ldGVyIGluIGEgd3JhcHBlZCBtZXRob2QuCgogICAgICAgICAgICBBbiBleGFtcGxlIHNob3dzIHRoYXQgY2hhciAqIGNvdWxkIGJlIG1hcnNoYWxsZWQgaW4gZGlmZmVyZW50IHdheXMsIAoKICAgICAgICAgICAgICAldHlwZW1hcChpbXR5cGUsIG91dD0iSW50UHRyIikgY2hhciAqICJzdHJpbmciCiAgICAgICAgICAgICAgY2hhciAqIGZ1bmN0aW9uKGNoYXIgKik7CgogICAgICAgICAgICBUaGUgb3V0cHV0IHR5cGUgaXMgdGh1cyBJbnRQdHIgYW5kIHRoZSBpbnB1dCB0eXBlIGlzIHN0cmluZy4gVGhlIHJlc3VsdGluZyBpbnRlcm1lZGlhcnkgQyMgY29kZSBpczoKCiAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBleHRlcm4gSW50UHRyIGZ1bmN0aW9uKHN0cmluZyBqYXJnMSk7CgowNC8yMi8yMDA1OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBGaXggZ2VuZXJhdGlvbiBvZiAiZGVmaW5lLW1ldGhvZCIgZm9yIG1ldGhvZHMgb2YKCSAgICBjbGFzc2VzIHdpdGggYSBjb25zdHJ1Y3Rvci4gIFJlcG9ydGVkIGJ5IEx1aWdpIEJhbGxhYmlvLgoKMDQvMTUvMjAwNTogd3V6emViIChKb2huIExlbnopCgkgICAgW0NoaWNrZW5dCgkgICAgRm9yIHdyYXBwZWQgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIG11bHRpcGxlIHZhbHVlcyAodXNpbmcgYXJnb3V0KSwKCSAgICBTV0lHIENISUNLRU4gbm93IHJldHVybnMgdGhlbSBhcyBtdWx0aXBsZSB2YWx1ZXMgaW5zdGVhZCBvZiBhcwoJICAgIGEgbGlzdC4gIFRoZXkgY2FuIHRoZW4gYmUgYWNjZXNzZWQgdXNpbmcgKGNhbGwtd2l0aC12YWx1ZXMpLgoKMDQvMTQvMjAwNTogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtDaGlja2VuXQogICAgICAgICAgICArIEFkZGVkIGEgd2hvbGUgYnVuY2ggb2YgbmV3IF9ydW5tZSBzY3JpcHRzIGludG8gdGhlIGNoaWNrZW4gdGVzdAogICAgICAgICAgICBzdWl0ZS4gIEFsc28gZml4IHNvbWUgYnVncyB0aGVzZSBuZXcgc2NyaXB0cyB0dXJuZWQgdXAuCgogICAgICAgICAgICArIEFkZGVkIG9wdGltaXphdGlvbiB3aGVuIHJldHVybmluZyBhIHdyYXBwZWQgcHJveHkgY2xhc3MuICBCZWZvcmUsCiAgICAgICAgICAgIGEgbWlub3IgZ2FyYmFnZSBjb2xsZWN0aW9uIHdhcyBpbnZva2VkIGV2ZXJ5IHRpbWUgYSBmdW5jdGlvbiByZXR1cm5lZC4KCgkgICAgKyBBbGwgdGhlIGNoaWNrZW4gRXhhbXBsZXMgc2hvdWxkIG5vdyBydW4gY29ycmVjdGx5CgowNC8xNC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIE1vcmUgZml4ZXMgZm9yIHR5cGVtYXAgbWF0Y2hpbmcgd2hlbiB3cmFwcGluZyB2YXJpYWJsZXMsIGluIHBhcnRpY3VsYXIKICAgICAgICAgICAgc3RkOjpzdHJpbmcsIHNvIHRoYXQgc3RkOjpzdHJpbmcgdmFyaWFibGVzIGNhbiBiZSBlYXNpbHkgbWFyc2hhbGxlZCB3aXRoCiAgICAgICAgICAgIGEgQyMgc3RyaW5nIHByb3BlcnR5IHVzaW5nOgoKICAgICAgICAgICAgICAlaW5jbHVkZSAic3RkX3N0cmluZy5pIgogICAgICAgICAgICAgICVhcHBseSBjb25zdCBzdGQ6OnN0cmluZyAmIHsgc3RkOjpzdHJpbmcgKnZhcmlhYmxlX25hbWUgfTsKICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2YXJpYWJsZV9uYW1lOwoKICAgICAgICAgICAgKFJlY2FsbCB0aGF0IGFsbCBjbGFzcyB2YXJpYWJsZXMgYXJlIHdyYXBwZWQgdXNpbmcgcG9pbnRlcnMpCgowNC8wNS8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbQ2hpY2tlbl0KCSAgICArIEFkZGVkIEV4YW1wbGVzL2NoaWNrZW4vZWdnLCBhbiBleGFtcGxlIG9uIGhvdyB0byBidWlsZCBhIGNoaWNrZW4KCSAgICAgIGV4dGVuc2lvbiBsaWJyYXJ5IGluIHRoZSBmb3JtIG9mIGFuIGVnZy4gIEFsc28gdXBkYXRlZCB0aGUKCSAgICAgIGRvY3VtZW50YXRpb24gb24gdGhlIGRpZmZlcmVudCBsaW5raW5nIG9wdGlvbnMuCgoJICAgICsgY2hpY2tlbiB0ZXN0LXN1aXRlIG5vdyBoYXMgc3VwcG9ydCB0byBjaGVjayBTV0lHIHdpdGggdGhlIC1wcm94eQoJICAgICAgYXJndW1lbnQgaWYgdGhlcmUgZXhpc3RzIGEgX3Byb3h5X3J1bm1lLnNzIGZpbGUuCgoJICAgICsgTW9yZSBmaXhlcyBmb3Igb3ZlcmxvYWRlZCBmdW5jdGlvbnMgYW5kIC1wcm94eQoKMDMvMzEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgVHVybmVkIG9uIGV4dHJhIHRlbXBsYXRlIGZlYXR1cmVzIGZvciBhbGwgbGFuZ3VhZ2VzIHdoaWNoIHdlcmUKICAgICAgICAgICAgcHJldmlvdXNseSBvbmx5IGF2YWlsYWJsZSB0byBQeXRob24uCgogICAgICAgICAgICBUaGlzIGVuYWJsZXMgdHlwZW1hcHMgZGVmaW5lZCB3aXRoaW4gYSB0ZW1wbGF0ZWQgY2xhc3MgdG8gYmUgdXNlZCBhcwogICAgICAgICAgICBleHBlY3RlZC4gUmVxdWlyZXMgJXRlbXBsYXRlIG9uIHRoZSB0ZW1wbGF0ZWQgY2xhc3MsICV0ZW1wbGF0ZSgpIHdpbGwKICAgICAgICAgICAgYWxzbyBwaWNrIHVwIHRoZSB0eXBlbWFwcy4gRXhhbXBsZToKCiAgICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgRm9vICJpbiB0eXBlbWFwIGZvciBGb288VD4gIgogICAgICAgICAgICAgICAgb3IKICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBGb288VD4gImluIHR5cGVtYXAgZm9yIEZvbzxUPiAiCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAKICAgICAgICAgICAgICAldGVtcGxhdGUoRm9vX2kpIEZvbzxpbnQ+OwogICAgICAgICAgICAgICV0ZW1wbGF0ZSgpIEZvbzxkb3VibGU+OwogICAgICAgICAgICAgIAogICAgICAgICAgICB3aWxsIGdlbmVyYXRlIHRoZSBwcm9wZXIgJ2luJyB0eXBlbWFwcyB3aGVyZXZlciBGb288aW50PiBhbmQgRm9vPGRvdWJsZT4KICAgICAgICAgICAgYXJlIHVzZWQuCgowMy8zMC8yMDA1OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW016U2NoZW1lXSBQYXRjaCBmcm9tIEhhbnMgT2VzdGVyaG9sdCBmb3Igc3VwcG9ydGluZyBNelNjaGVtZSAzMHguCgowMy8yOS8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbQ2hpY2tlbl0KCSAgICArIFJlYWxsb3cgb2xkZXIgdmVyc2lvbnMgb2YgY2hpY2tlbiAoMS40MCB0byAxLjg5KSBieSBwYXNzaW5nIC1ub2NvbGxlY3Rpb24KCSAgICAgIGFyZ3VtZW50IHRvIFNXSUcKCSAgICArICVpbXBvcnQgbm93IHdvcmtzIGNvcnJlY3RseSB3aXRoIHRpbnljbG9zLiAgKGRlY2xhcmUgKHVzZXMgLi4uKSkgd2lsbCBiZQoJICAgICAgZXhwb3J0ZWQgY29ycmVjdGx5LgoJICAgICsgVGlueUNMT1MgcHJveHkgY2xhc3NlcyBub3cgd29yayBjb3JyZWN0bHkgd2l0aCBvdmVybG9hZGVkIGZ1bmN0aW9ucwoJICAgICAgYW5kIGNvbnN0cnVjdG9ycy4KCjAzLzI5LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBQYXRjaCBmcm9tIFNjb3R0IE1pY2hlbCBmb3IgZGlyZWN0b3JvdXQgdHlwZW1hcHMuIEphdmEgZGlyZWN0b3JzCiAgICAgICAgICAgIHJlcXVpcmUgdGhlIGRpcmVjdG9yb3V0IHR5cGVtYXBzIGxpa2UgdGhlIG90aGVyIGxhbmd1YWdlcyBub3cuIFRoZSBuZXcKICAgICAgICAgICAgdHlwZW1hcHMgcHJvdmlkZSBmaXhlcyBmb3IgbWV0aG9kcyB3aGVyZSB0aGUgcmV0dXJuIHR5cGUgaXMgcmV0dXJuZWQKICAgICAgICAgICAgYnkgcmVmZXJlbmNlICh0aGlzIGNhbm5vdCBhdXRvbWF0aWNhbGx5IGJlIG1hZGUgdGhyZWFkIHNhZmUgdGhvdWdoKS4KCjAzLzIyLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEVudW0gY2FzdGluZyBmaXhlcy4gVmlzdWFsIEMrKyBkaWRuJ3QgbGlrZSB0aGUgQyB0eXBlIGNhc3RpbmcgU1dJRyBwcm9kdWNlZAogICAgICAgICAgICB3aGVuIHdyYXBwaW5nIEMrKyBlbnVtIHJlZmVyZW5jZXMsIGFzIHJlcG9ydGVkIGJ5IEFkbWlyZSBLYW5kYXdhc3Zpa2EuCgowMy8yMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gU0YgIzExMjQ0OTAuIEZpeCBQZXJsIG1hY3JvIGNsYXNoZXMgd2hlbiB1c2luZyBWaXN1YWwgU3R1ZGlvJ3MgU1RMIHN0cmluZywKICAgICAgICAgICAgc28gbm93IHByb2plY3RzIGNhbiAjaW5jbHVkZSA8c3RyaW5nPi4KCjAzLzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeGVkICV2YXJhcmdzIHdoaWNoIGdvdCBicm9rZW4gd2l0aCB0aGUgcmVjZW50IGRlZmF1bHQgYXJndW1lbnQgY2hhbmdlcy4KICAgICAgICAgICAgQWxzbyB3b3JrcyBmb3IgSmF2YSBhbmQgQyMgZm9yIHRoZSBmaXJzdCB0aW1lIG5vdy4KCjAzLzE3LzIwMDU6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBbQ2hpY2tlbl0gCgkgICAgKyBGaXggYSB3aG9sZSBidW5jaCBvZiBidWdzIGluIHRoZSBjaGlja2VuIG1vZHVsZS4gIFRoZSBlbnRpcmUKICAgICAgICAgICAgICB0ZXN0IHN1aXRlIG5vdyBjb21waWxlcywgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSB0ZXN0cyB0aGF0IHJlcXVpcmUKCSAgICAgIHN0ZF92ZWN0b3IuaSwgc3RkX2RlcXVlLmksIGFuZCBzbyBvbiwgd2hpY2ggY2hpY2tlbiBkb2VzIG5vdCBoYXZlIHlldC4KCgkgICAgKyBBZGQgc3VwcG9ydCBmb3IgJWV4Y2VwdGlvbiBhbmQgJXR5cGVtYXAoZXhjZXB0aW9ucykuICBFeGNlcHRpb25zIGFyZQoJICAgICAgdGhyb3duIHdpdGggYSBjYWxsIHRvIChhYm9ydCkgYW5kIGNhbiBiZSBoYW5kbGVkIGJ5IChoYW5kbGUtZXhjZXB0aW9ucykKCjAzLzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBQYXRjaCBmcm9tIFNjb3R0IE1pY2hlbCBmb3IgZGlyZWN0b3JzLiBNb2RpZmljYXRpb25zIHRvIHRoZSB0eXBlbWFwcwogICAgICAgICAgICBnaXZpbmcgdXNlcnMgZmluZSBjb250cm9sIG92ZXIgbWVtb3J5IG93bmVyc2hpcCBhbmQgbGlmZXRpbWUgb2YgZGlyZWN0b3IgY2xhc3Nlcy4KICAgICAgICAgICAgRGlyZWN0b3IgY2xhc3NlcyBubyBsb25nZXIgbGl2ZSBmb3JldmVyIGJ5IGRlZmF1bHQgYXMgdGhleSBhcmUgbm93IGNvbGxlY3RhYmxlCiAgICAgICAgICAgIGJ5IHRoZSBHQy4KCjAzLzE1LzIwMDU6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtDaGlja2VuXSBBZGQgc3VwcG9ydCBmb3IgYWRkaW5nIGZpbmFsaXplcnMgZ2FyYmFnZSBjb2xsZWN0ZWQgb2JqZWN0cy4KCSAgICBGdW5jdGlvbnMgdGhhdCByZXR1cm4gbmV3IG9iamVjdHMgc2hvdWxkIGJlIG1hcmtlZCB3aXRoICVuZXdvYmplY3QgYW5kCgkgICAgaW5wdXQgYXJndW1lbnRzIHdoaWNoIGNvbnN1bWUgKG9yIHRha2Ugb3duZXJzaGlwKSBvZiBhIHBvaW50ZXIgc2hvdWxkCgkgICAgYmUgbWFya2VkIHdpdGggdGhlIERJU09XTiB0eXBlbWFwLgoKCSAgICBBbHNvIGFkZCBzdXBwb3J0IGZvciBjb3JyZWN0bHkgY2hlY2tpbmcgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgcGFzc2VkCgkgICAgdG8gYSBmdW5jdGlvbiwgYW5kIHJhaXNpbmcgYW4gZXJyb3IgaWYgdGhlIHdyb25nIG51bWJlciBhcmUgcGFzc2VkLgoKMDMvMTQvMjAwNTogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIEFkZCAtLXdpdGhvdXQtYWxsbGFuZyBvcHRpb24gdG8gY29uZmlndXJlLmluLCB3aGljaCBpcyB0aGUgc2FtZSBhcwogICAgICAgICAgICBwYXNzaW5nIGFsbCB0aGUgLS13aXRob3V0LXB5dGhvbiAtLXdpdGhvdXQtcGVybDUgZXRjLi4uIHRoYXQgTWF0dGhpYXMgYWRkZWQuCgowMy8wOS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGhwXSBNZW1vcnkgbGVhayBmaXggZm9yIGZ1bmN0aW9ucyByZXR1cm5pbmcgY2xhc3Nlcy9zdHJ1Y3RzIGJ5IHZhbHVlLgoKMDMvMDgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIEZpeCBmb3IgUGVybCBpbmNvcnJlY3RseSB0YWtpbmcgbWVtb3J5IG93bmVyc2hpcCBmb3IgcmV0dXJuIHR5cGVzIHRoYXQKICAgICAgICAgICAgYXJlIHR5cGVkZWZzIHRvIGEgc3RydWN0L2NsYXNzIHBvaW50ZXIuIFJlcG9ydGVkIGJ5IEpvc2ggQ2hlcnJ5LgoKMDMvMDcvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBWYXJpb3VzIGV4Y2VwdGlvbiBjaGFuZ2VzIGZvciB0aGUgc3RkOjp2ZWN0b3Igd3JhcHBlcnMuIFRoZXNlIG5vdyBtb3JlCiAgICAgICAgICAgIGFjY3VyYXRlbHkgbWlycm9yIHRoZSBzYW1lIGV4Y2VwdGlvbnMgdGhhdCBTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0IHRocm93LgoKMDMvMDcvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggdW5kZWZpbmVkIGJlaGF2aW91ciBhZnRlciBhbnkgb2YgdGhlIHN0ZDo6dmVjdG9yIG1ldGhvZHMKICAgICAgICAgICAgdGhyb3cgYW4gZXhjZXB0aW9uLgoKMDMvMDcvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBXaGVuIG51bGwgaXMgcGFzc2VkIGZvciBhIEMrKyByZWZlcmVuY2Ugb3IgdmFsdWUgcGFyYW1ldGVyLCB0aGUgCiAgICAgICAgICAgIGV4Y2VwdGlvbiB0aHJvd24gaGFzIGJlZW4gY29ycmVjdGVkIHRvIGFuIEFyZ3VtZW50TnVsbEV4Y2VwdGlvbiBpbnN0ZWFkCiAgICAgICAgICAgIG9mIE51bGxSZWZlcmVuY2VFeGNlcHRpb24gYXMgcmVjb21tZW5kZWQgaW4gdGhlIC5ORVQgRnJhbWV3b3JrIGRvY3VtZW50YXRpb24uCgogICAgICAgICAgICBUaGUgZGVmYXVsdCB0aHJvd3MgdHlwZW1hcHMgdHVybiBhIEMrKyBleGNlcHRpb24gaW50byBhbiBBcHBsaWNhdGlvbkV4Y2VwdGlvbiwKICAgICAgICAgICAgbm90IGEgU3lzdGVtRXhjZXB0aW9uIG5vdy4KCjAzLzA3LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gTnVtZXJvdXMgY2hhbmdlcyBpbiBDIyBleGNlcHRpb24gaGFuZGxpbmcgaGF2ZSBiZWVuIG1hZGUgb3ZlciB0aGUgcGFzdAogICAgICAgICAgICBmZXcgd2Vla3MuIEEgc3VtbWFyeSBmb2xsb3dzOgoKICAgICAgICAgICAgVGhlIHdheSBpbiB3aGljaCBDKysgZXhjZXB0aW9ucyBhcmUgbWFwcGVkIHRvIEMjIGV4Y2VwdGlvbnMgaXMgcXVpdGUgZGlmZmVyZW50LgogICAgICAgICAgICBUaGUgY2hhbmdlIGlzIHRvIGZpeCBDIyBleGNlcHRpb25zIHNvIHRoYXQgdGhlIEMrKyBleGNlcHRpb24gc3RhY2sgaXMgY29ycmVjdGx5CiAgICAgICAgICAgIHVud291bmQgYXMgcHJldmlvdXNseSBDKysgZXhjZXB0aW9ucyB3ZXJlIGJlaW5nIHRocm93biBhY3Jvc3MgdGhlIEMgUEludm9rZSBsYXllcgogICAgICAgICAgICBpbnRvIHRoZSBtYW5hZ2VkIHdvcmxkLgoKICAgICAgICAgICAgTmV3IHR5cGVtYXAgYXR0cmlidXRlcyAoY2FudGhyb3cgYW5kIGV4Y29kZSkgaGF2ZSBiZWVuIGludHJvZHVjZWQgdG8gY29udHJvbCB0aGUKICAgICAgICAgICAgbWFwcGluZyBvZiBDKysgdG8gQyMgZXhjZXB0aW9ucy4gRXNzZW50aWFsbHkgYSBjYWxsYmFjayBpbnRvIHRoZSB1bm1hbmFnZWQgd29ybGQKICAgICAgICAgICAgaXMgbWFkZSB0byBzZXQgYSBwZW5kaW5nIGV4Y2VwdGlvbi4gVGhlIGV4Y2VwdGlvbiB0byB0aHJvdyBpcyBzdG9yZWQgaW4gdGhyZWFkIGxvY2FsCiAgICAgICAgICAgIHN0b3JhZ2UgKHNvIHRoZSBhcHByb2FjaCBpcyB0aHJlYWQtc2FmZSkuIFRoZSB0eXBlbWFwcyBhcmUgZXhwZWN0ZWQgdG8gcmV0dXJuCiAgICAgICAgICAgIGZyb20gdW5tYW5hZ2VkIGNvZGUgYXMgc29vbiBhcyB0aGUgcGVuZGluZyBleGNlcHRpb24gaXMgc2V0LiBBbnkgcGVuZGluZyBleGNlcHRpb25zCiAgICAgICAgICAgIGFyZSBjaGVja2VkIGZvciBhbmQgdGhyb3duIG9uY2UgbWFuYWdlZCBjb2RlIHN0YXJ0cyBleGVjdXRpbmcuIFRoZXJlIHNob3VsZAogICAgICAgICAgICBiZSBtaW5pbWFsIGltcGFjdCBvbiBleGVjdXRpb24gc3BlZWQgZHVyaW5nIG5vcm1hbCBiZWhhdmlvdXIuIEZ1bGwgZGV0YWlscyB3aWxsIGJlCiAgICAgICAgICAgIGRvY3VtZW50ZWQgaW4gQ1NoYXJwLmh0bWwuCgogICAgICAgICAgICBUaGUgU1dJR19DU2hhcnBUaHJvd0V4Y2VwdGlvbigpIGZ1bmN0aW9uIGhhcyBiZWVuIHJlbW92ZWQgYW5kIHJlcGxhY2VkIHdpdGggdGhlCiAgICAgICAgICAgIFNXSUdfQ1NoYXJwU2V0UGVuZGluZ0V4Y2VwdGlvbkFyZ3VtZW50KCkgYW5kIFNXSUdfQ1NoYXJwU2V0UGVuZGluZ0V4Y2VwdGlvbigpCiAgICAgICAgICAgIGZ1bmN0aW9ucy4gVGhlIG9yaWdpbmFsIG5hbWUgaGFzIGJlZW4gZGVsaWJlcmF0ZWx5IGNoYW5nZWQgdG8gYnJlYWsgb2xkIGNvZGUgYXMKICAgICAgICAgICAgdGhlIG9sZCBhcHByb2FjaCB3YXMgc29tZXdoYXQgZmxhd2VkLiBBbnkgdXNlciBkZWZpbmVkIGV4Y2VwdGlvbnMgdGhhdCBmb2xsb3cgdGhlCiAgICAgICAgICAgIHNhbWUgcGF0dGVybiBhcyB0aGUgb2xkIGFwcHJvYWNoIHNob3VsZCBhbHNvIGJlIGZpeGVkLgoKICAgICAgICAgICAgTnVtZXJvdXMgbmV3IC5ORVQgZnJhbWV3b3JrIGV4Y2VwdGlvbnMgYXJlIG5vdyBhdmFpbGFibGUgZm9yIGVhc3kgdGhyb3dpbmcgZnJvbSAKICAgICAgICAgICAgdW5tYW5hZ2VkIGNvZGUuIFRoZSBjb21wbGV0ZSBsaXN0IGlzOiAKCiAgICAgICAgICAgICAgQXBwbGljYXRpb25FeGNlcHRpb24sIEFyaXRobWV0aWNFeGNlcHRpb24sIERpdmlkZUJ5WmVyb0V4Y2VwdGlvbiwgCiAgICAgICAgICAgICAgSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uLCBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgCiAgICAgICAgICAgICAgTnVsbFJlZmVyZW5jZUV4Y2VwdGlvbiwgT3V0T2ZNZW1vcnlFeGNlcHRpb24sIE92ZXJmbG93RXhjZXB0aW9uLCAKICAgICAgICAgICAgICBTeXN0ZW1FeGNlcHRpb24sIEFyZ3VtZW50RXhjZXB0aW9uLCBBcmd1bWVudE51bGxFeGNlcHRpb24gYW5kCiAgICAgICAgICAgICAgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEMjIE1PRFVMRSAqKioKCjA1LzA1LzIwMDU6IG1tYXR1cwoJICAgIAoJICAgIEZpeCBzZXZlcmFsIG1lbW9yeSBsZWFrcyBhcm91bmQuIEV2ZW4gd2hlbiB3ZSBzdXJ2aXZlICBrbm93bmluZwoJICAgIHN3aWcgaXMgYSBtZW1vcnkgbGVhayBmYWN0b3J5LCBpdCB3YXMgYSBsaXR0bGUgb3V0IG9mCgkgICAgY29udHJvbC4gVG8gcnVuIHN0ZF9jb250YWluZXJzLmkgaW4gdGhlIHB5dGhvbiB0ZXN0LXN1aXRlLAoJICAgIHN3aWcgd2FzIHVzaW5nIH4yNjBNQiwgbm93IGl0IHVzZXMgJ29ubHknIH40ME1CLCB3aGljaCBpcwoJICAgIHRoZSBzYW1lIGFtbW91bnQgdGhhdCBnKysgdXNlcywgc28sIGlzIG5vdCB0aGF0IGJhZC4KCSAgICBJbiB0aGUgcHJvY2VzcywgSSBmb3VuZCBhIGNvdXBsZSBvZiBleHRyYSBEZWxldGVzLCB3aGljaAoJICAgIGluIHNvbWUgY2FzZXMgY291bGQgdHJpZ2dlciBzZWcuIGZhdWx0cyBhbmQvb3IKCSAgICBET0gvYXNzZXJ0cy4KCSAgICAKCSAgICBbcHl0aG9uXSBCZXR0ZXIgc3VwcG9ydCBmb3IgZGlyZWN0b3JzICsgZXhjZXB0aW9uLiBNb3JlCgkgICAgdmVyYm9zZSBlcnJvcnMgYW5kIGFkZGVkIGFuIHVuZXhwZWN0ZWQgZXhjZXB0aW9uIGhhbmRsZXIuCgoJICAgIFtweXRob25dIEZpeCBtZW1vcnkgbGVhayBmb3IgdGhlCgoJICAgIAkgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8aW50PiA+IAoKCSAgICBjYXNlLHJlcG9ydGVkIGJ5IEJvIFBlbmcuCgoJICAgIFtweXRob25dIEZpeCBTd2lnUHlPYmplY3QgY29tcGFyZSBwcm9ibGVtIHJlcG9ydGUgYnkKCSAgICBDYW1lcm9uIFBhdHJpY2suIAoKCSAgICBbcHl0aG9uXSBGaXggc2V2ZXJhbCB3YXJuaW5ncyBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUgCgkgICAgZm9yIGdudS1nY2MsIEludGVsIGFuZCBWQzcuMSAgY29tcGlsZXJzLgoKCjAyLzI1LzIwMDU6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFVwZGF0ZSBkb2N1bWVudGF0aW9uIHRvIHVzZSBDU1MgYW5kIDxkaXY+IGluc3RlYWQgb2YgPGJsb2NrcXVvdGU+CgkgICAgSSB1c2VkIGEgc2NyaXB0IHRvIGNvbnZlcnQgdGhlIGRvY3MsIGFuZCBpdCBzZXQgYWxsIHRoZSBib3ggY2xhc3NlcwoJICAgIHRvIGJlICJjb2RlIi4gIFRoZXJlIGFyZSBhY3R1YWxseSA0IGRpZmZlcmVudCBjbGFzc2VzLAoJICAgICJzaGVsbCIsICJjb2RlIiwgInRhcmdldGxhbmciLCBhbmQgImRpYWdyYW0iLiAgV2UgbmVlZCB0byBnbyB0aHJvdWdoCgkgICAgYW5kIGNvbnZlcnQgdGhlIGRpdnMgZGVwZW5kaW5nIG9uIHdoYXQgdGhleSBjb250YWluLgoKMDIvMjMvMjAwNTogbW1hdHVzCgoJICAgIFtQeXRob25dIEFkZGVkIG9wdGlvbiAtbm9ydHRpIHRvIGRpc2FibGUgdGhlIHVzZSBvZiBuYXRpdmUKCSAgICBDKysgUlRUSSB3aXRoIGRpcmVjdG9ycyAoZHluYW1pY19jYXN0PD4gaXMgbm90IHVzZWQpLgoKCSAgICBBZGQgbW9yZSBjb2RlIGZvciBkaXJlY3RvcnMgdG8gZGV0ZWN0IGFuZCByZXBvcnQgZXJyb3JzIGluCgkgICAgdGhlIHB5dGhvbiBzaWRlLgoKCSAgICBFeHRlbmQgdGhlIHVzZSBvZiBTV0lHSU5URVJOIHdoZW5ldmVyIGlzIHBvc3NpYmxlLgoKCSAgICBSZW1vdmUgdGVtcGxhdGUgd2FybmluZ3MgcmVwb3J0ZWQgYnkgVkM3LjEuCgoJICAgIFJlbW92ZSB3YXJuaW5ncyByZXBvcnRlZCBieSBnY2MvZysrLiBGaW5hbGx5IHlvdSBjYW4KCSAgICBjb21waWxlIHVzaW5nCgoJICAgICAgIGcrKyAtVyAtV2FsbCAtYyBteW1vZHVsZV93cmFwLmN4eAoKCSAgICBhbmQgbm8gc3B1cmlvdXMgZXJyb3JzIHdpbGwgYmUgZ2VuZXJhdGVkIGluIHRoZSB3cmFwcGVyCgkgICAgY29kZS4KCjAyLzIzLzIwMDU6IHd1enplYiAoSm9obiBMZW56KQoJICAgIEFkZGVkIC1leHRlcm5hbC1ydW50aW1lIGFyZ3VtZW50LiAgVGhpcyBhcmd1bWVudCBpcyB1c2VkIHRvIGR1bXAKCSAgICBvdXQgYWxsIHRoZSBjb2RlIG5lZWRlZCBmb3IgZXh0ZXJuYWwgYWNjZXNzIHRvIHRoZSBydW50aW1lIHN5c3RlbSwKCSAgICBhbmQgaXQgcmVwbGFjZXMgaW5jbHVkaW5nIHRoZSBmaWxlcyBkaXJlY3RseS4gIFRoaXMgY2hhbmdlIGFkZHMKCSAgICB0d28gbmV3IHZpcnR1YWwgZnVuY3Rpb25zIHRvIHRoZSBMYW5ndWFnZSBjbGFzcywgd2hpY2ggYXJlIHVzZWQKCSAgICB0byBmaW5kIHRoZSBsYW5ndWFnZSBzcGVjaWZpYyBydW50aW1lIGNvZGUuICBJIGFsc28gdXBkYXRlZAoJICAgIGFsbCBsYW5ndWFnZXMgdGhhdCB1c2UgdGhlIHJ1bnRpbWUgdG8gaW1wbGVtZW50IHRoZXNlIHR3byBmdW5jdGlvbnMuCgowMi8yMi8yMDA1OiBtbWF0dXMgCgkgICAgRml4ICV0ZW1wbGF0ZSArIHByaXZhdGUgZXJyb3IgU0YjMTA5OTk3Ni4KCjAyLzIxLzIwMDU6IG1tYXR1cyAKCgkgICAgRml4IHN3aWdydW4uc3dnIHdhcm5pbmdzIHJlcG9ydGVkIHdoZW4gdXNpbmcgImdjYyAtVyAtV2FsbCIKCSAgICAoc3RhdGljL2lubGluZSBub3QgdXNlZCBpbiBmcm9udCBvZiBhIGZ1bmN0aW9uCgkgICAgZGVjbGFyYXRpb24pLCBhbmQgYWRkIFNXSUdVTlVTRUQgYXR0cmlidXRlIHRvIGF2b2lkCgkgICAgdW51c2VkIHdhcm5pbmdzIGVsc2V3aGVyZS4KCgkgICAgRml4IHVudXNlZCB2YXJpYWJsZSB3YXJuaW5ncy4KCgkgICAgW1B5dGhvbl0gVXNlIG5ldyBTV0lHVU5VU0VEIGF0dHJpYnV0ZSB0byBhdm9pZCB3YXJuaW5ncyBpbgoJICAgIFNXSUdJTlRFUk4gbWV0aG9kcy4KCgkgICAgW1B5dGhvbl0gRml4IFB5T1Nfc25wcmludGYgZm9yIHB5dGhvbiB2ZXJzaW9ucyA8IDIuMiAoU0YgIzExMDQ5MTkpLgoKCSAgICBbUHl0aG9uXSBGaXggbWFwL211bHRpbWFwIHRvIGFsbG93IGVtcHR5IG1hcHMgKHJlcG9ydGVkIGJ5CiAgCSAgICBQaGlsaXBwZSBIZXRyb3kpLgoKCSAgICBbRG9jc10gQWRkIHNvbWUgZG9jdW1lbnRhdGlvbiB0byBQeXRob24uaHRtbCBhbmQKCSAgICBTV0lHUGx1cy5odG1sLCBpbmNsdWRpbmcgZm9yIGV4YW1wbGUgdGhlIGZhY3QgdGhhdAoJICAgICdmcmllbmRzJyBhcmUgbm93IHN1cHBvcnRlZC4KCjAyLzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQSFBdIFBhdGNoIGZyb20gT2xseSBCZXR0cywgc28gdGhhdCB3cmFwcGVycyBjb21waWxlIHdpdGggWmVuZCB0aHJlYWQgc2FmZXR5IGVuYWJsZWQuCgowMi8xNy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBNZW1vcnkgbGVhayBmaXggaW4gc29tZSBvZiB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlIG1vZHVsZXMgd2hlbiB1c2luZyBkZWZhdWx0CiAgICAgICAgICAgIGFyZ3VtZW50cyBpbiBjb25zdHJ1Y3RvcnMuIFRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2Ugd2FzIG5vdCB0YWtpbmcgb3duZXJzaGlwIG9mIHRoZQogICAgICAgICAgICBDKysgb2JqZWN0IG1lbW9yeSB3aGVuIGFueSBvZiB0aGUgY29uc3RydWN0b3JzIHRoYXQgdXNlIGRlZmF1bHQgYXJndW1lbnRzIHdhcyBjYWxsZWQuCgowMi8xNi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBTRiAjMTExNTA1NTogRmFpbGVkIG1ha2UgaW5zdGFsbC4gUGF0Y2ggZnJvbSBSb2IgU3RvbmUuCgowMi8xNi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gU0YgIzExMjM0MTYgZnJvbSBQYXVsIE1vb3JlLiBDb3JyZWN0IG1lbW9yeSBhbGxvY2F0aW9uIGZvciBTVFJJTkdBUlJBWQogICAgICAgICAgICB0eXBlbWFwcyBpbiB2YXJpb3VzLmkuCgowMi8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBEaXNhYmxlZCB0eXBlbWFwIHNlYXJjaCBjaGFuZ2VzIGZvciBub3cgKHNlZSBlbnRyeSAxOS8xMi8yMDA0KS4gSXQgYnJlYWtzCiAgICAgICAgICAgIG9sZCB0eXBlbWFwcywgbGVuZ3RoZW5zIHRoZSBleGVjdXRpb24gdGltZSBieSBhYm91dCAyNSUgYW5kIGludHJvZHVjZXMKICAgICAgICAgICAgaW5jb25zaXN0ZW5jaWVzLgoKMDIvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgc3dpZyAtaGVscCBmb2xsb3dzIG90aGVyIHNvZnR3YXJlIGJ5IHByaW50aW5nIHRvIHN0ZG91dCBpbnN0ZWFkIG9mIHN0ZGVyciBub3cuCiAgICAgICAgICAgIHN3aWcgLXZlcnNpb24gYWxzbyBkaXNwbGF5cyB0byBzdGRvdXQgaW5zdGVhZCBvZiBzdGRlcnIgbm93LgogICAgICAgICAgICBCZWhhdmlvdXIgcmVwb3J0ZWQgYnkgVG9yc3RlbiBMYW5kc2Nob2ZmLgoKMDIvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEZpeCBmb3IgdGhlIGxlc3MgY29tbW9ubHkgdXNlZCBvcmRlcmluZyBvZiAlaW5jbHVkZSBhbmQgI2luY2x1ZGUsIHNvCiAgICAgICAgICAgIHRoYXQgdGhlIGdlbmVyYXRlZCBjb2RlIGNvbXBpbGVzLiBCdWcgcmVwb3J0ZWQgYnkgcmVwb3J0ZWQgYnkgTWF4IEJvd3NoZXIuCiAgICAgICAgICAgICAgJWluY2x1ZGUgZm9vLmgKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgICNpbmNsdWRlIGZvby5oCiAgICAgICAgICAgICAgJX0gCgowMi8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIFNXSUdfZXhjZXB0aW9uIG1hY3JvIHdpbGwgbm93IHJldHVybiBmcm9tIHVubWFuYWdlZCBjb2RlIC8gbmF0aXZlIGNvZGUKICAgICAgICAgICAgYXMgc29vbiBhcyBpdCBpcyBjYWxsZWQuIEZpeGVzIHBvc3NpYmxlIEpWTSBjcmFzaGVzIGFuZCBvdGhlciBjb2RlIHVuZXhwZWN0ZWRseQogICAgICAgICAgICBiZWluZyBleGVjdXRlZC4gTm90ZSBTV0lHX2V4Y2VwdGlvbiBpcyBvbmx5IG9jY2FzaW9uYWxseSB1c2VkIGJ5IFNXSUcgbGlicmFyeQogICAgICAgICAgICB3cml0ZXJzLCBhbmQgaXMgYmVzdCBhdm9pZGVkIGJ5IFNXSUcgdXNlcnMuCgowMi8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIFR5cGVtYXBzIGNhbiBub3cgYmUgdGFyZ2V0ZWQgYXQgZ2xvYmFsIHZhcmlhYmxlIG5hbWVzCiAgICAgICAgICAgIGFuZCBzdGF0aWMgbWVtYmVyIHZhcmlhYmxlIG5hbWVzLiBQcmV2aW91c2x5IHRoZSB0eXBlbWFwcyBmb3IgCiAgICAgICAgICAgIHRoZSBzZXR0ZXJzIHdlcmUgaWdub3JlZCwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBpbnQgZ2xvYmFsaW50ICIuLi4iCiAgICAgICAgICAgICAgaW50IGdsb2JhbGludDsKCjAyLzEzLzIwMDU6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEFkZCAldHlwZWNoZWNrIGZvciBTV0lHVFlQRSwgYWRkICV0eXBlY2hlY2sgZm9yIHB0cmRpZmZfdCwgZml4CgkgICAgdHlwZW1hcHMgZm9yIHNpemVfdC4KCgkgICAgW1Bpa2VdIE1lcmdlIHBhdGNoIGZyb20gVG9yc3RlbiBMYW5kc2Nob2ZmIGZvciBpbXByb3ZlZCBQaWtlIGNvbmZpZ3VyYXRpb24uCgowMi8xMi8yMDA1OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgTmV3IGNvbmZpZ3VyZSBzd2l0Y2hlcyAtLXdpdGhvdXQtdGNsLCAtLXdpdGhvdXQtcHl0aG9uIGV0Yy4gYWxsb3cgdG8KICAgICAgICAgICAgZGlzYWJsZSB0aGUgc2VhcmNoIGZvciBpbnN0YWxsZWQgbGFuZ3VhZ2VzLgoKMDEvMzEvMjAwNTogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIC0gQWRkIERvaFNvcnRMaXN0IHRvIERPSAoJICAgIAoJICAgIC0gSW1wcm92ZSB0aGUgcnVudGltZSB0eXBlIHN5c3RlbToKICAgICAgICAgICAgICAgKyBTcGVlZC4gVHlwZSBsb2FkaW5nIGlzIG5vdyBPKG4gbG9nIG4pIGluc3RlYWQgb2YgTyhOXjIpLCB3aGljaAoJICAgICAgICAgZm9yIGxhcmdlIG1vZHVsZXMgaXMgYSBodWdlIGltcHJvdmVtZW50LgogICAgICAgICAgICAgICArIEEgd2hvbGUgYnVuY2ggb2YgZnVuY3Rpb25zIGluIHN3aWdydW4uc3dnIG5vIGxvbmdlciBuZWVkIHRoZSAKICAgICAgICAgICAgICAgICBzd2lnX3R5cGVfbGlzdF9oYW5kbGUgcGFzc2VkIHRvIHRoZW0uICBUaGUgb25seSBvbmUgbGVmdCBpcyAKCQkgVHlwZVF1ZXJ5LiAgVGhpcyBhbHNvIG1ha2VzIHJ1bnRpbWUuc3dnIGEgbG90IHNtYWxsZXIuCgkgICAgICAgKyBTcGxpdCB1cCBzd2lnX3R5cGVfaW5mbyBzdHJ1Y3R1cmUgaW50byB0d28gc3RydWN0dXJlcwoJICAgICAgICAgKHN3aWdfdHlwZV9pbmZvIGFuZCBzd2lnX2Nhc3RfaW5mbykKCSAgICAgICArIFN0b3JlIGEgcG9pbnRlciB0byBhIHN3aWdfdHlwZV9pbmZvIHJhdGhlciB0aGFuIGp1c3QgdGhlIHR5cGUKCSAgICAgICAgIG5hbWUgc3RyaW5nIGluIHRoZSBsaW5rZWQgbGlzdCBvZiBjYXN0cy4gRmlyc3Qgb2ZmLCB0aGlzIG1ha2VzCgkgICAgICAgICB0aGUgZ3VpbGUgbW9kdWxlIGEgbGl0dGxlIGZhc3RlciwgYW5kIHNlY29uZCwgdGhlCgkgICAgICAgICBTV0lHX1R5cGVDbGllbnREYXRhKCkgZnVuY3Rpb24gaXMgZmFzdGVyIHRvby4gCgkgICAgICAgKyBBZGQgdGhlIGlkZWEgb2YgYSBtb2R1bGUgaW50byB0aGUgdHlwZSBzeXN0ZW0uICBCZWZvcmUsIGFsbCB0aGUKCSAgICAgICAgIHR5cGVzIHdlcmUgc3RvcmVkIGluIG9uZSBodWdlIGxpbmtlZCBsaXN0LiBOb3csIGFub3RoZXIgbGV2ZWwgaXMKCSAgICAgICAgIGFkZGVkLCBhbmQgdGhlIHR5cGUgc3lzdGVtIHN0b3JlcyBhIGxpbmtlZCBsaXN0IG9mIG1vZHVsZXMsIGVhY2gKCSAgICAgICAgIG9mIHdoaWNoIHN0b3JlcyBhbiBhcnJheSBvZiB0eXBlcyBhc3NvY2lhdGVkIHdpdGggaXQuCgkgICAgICAgKyBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvZiBob3cgdGhlIHJ1bnRpbWUgdHlwZSBzeXN0ZW0gbm93IHdvcmtzLAoJICAgICAgICAgcGxlYXNlIHNlZSBEb2MvTWFudWFsL3R5cGVtYXBzLmh0bWwgYW5kIERvYy9EZXZlbC9ydW50aW1lLnR4dAoJCSAKCSAgICAtIFVwZGF0ZSBhbGwgbGFuZ3VhZ2UgbW9kdWxlcyB0byB1c2UgdGhlIG5ldyB0eXBlIHN5c3RlbS4gIFRoZSBjaGFuZ2VzCgkgICAgICB0byBlYWNoIGxhbmd1YWdlIG1vZHVsZSBhcmUgbWlub3IuICBBbGwgbGFuZ3VhZ2VzIGFyZSBub3cgYWJsZSB0bwoJICAgICAgdXNlIHJ1bnRpbWUuc3dnIGZvciBleHRlcm5hbCBhY2Nlc3MgdG8gdGhlIHR5cGUgc3lzdGVtLiAgQmVmb3JlCgkgICAgICBvbmx5IHB5dGhvbiBhbmQgcGVybCBkaWQuCgoJICAgIC0gW2d1aWxlLCBtenNjaGVtZSwgb2NhbWwsIGFuZCBwaHA0XSAgVGhlc2UgbGFuZ3VhZ2VzIG9wZW5lZCB1cCB0aGUKCSAgICAgIGluaXQgZnVuY3Rpb24gaW5zaWRlIHRoZSAuY3h4IGNvZGUsIGFuZCBhbnkgY29kZSBpbiB0aGUgLnN3ZyBmaWxlcwoJICAgICAgaW4gdGhlIGluaXQgc2VjdGlvbiB3YXMgaW5zaWRlIHRoaXMgZnVuY3Rpb24uICBUaGlzIHdhcyBhIHByb2JsZW0KCSAgICAgIGZvciBzd2lnaW5pdC5zd2csIHdoaWNoIG5lZWRzIHRvIGJlIGluc2VydGVkIGJlZm9yZSB0aGUgU1dJR19pbml0CgkgICAgICBmdW5jdGlvbiBpcyBvcGVuZWQuICBUaHVzIEkgY2hhbmdlZCB0aGVzZSBsYW5ndWFnZXMgdG8gYmUgbGlrZQoJICAgICAgcHl0aG9uIG9yIHBlcmwsIHdoZXJlIHRoZSBpbml0IGZ1bmN0aW9uIGlzIGRlY2xhcmVkIGluIHRoZSAuc3dnCgkgICAgICBmaWxlLgoJICAgICAgCgkgICAgLSBbUnVieV0gSW5zdGVhZCBvZiBtb3ZpbmcgdGhlIGluaXQgZnVuY3Rpb24gdG8gdGhlIC5zd2cgZmlsZSwgSQoJICAgICAgYWRkZWQgYSBuZXcgc2VjdGlvbiBpbml0YmVmb3JlZnVuYywgYW5kIHRoZW4gYWRkZWQKCSAgICAgICVpbnNlcnQoaW5pdGJlZm9yZWZ1bmMpICJzd2lnaW5pdC5zd2ciCgoJICAgIC0gW016U2NoZW1lXSBGaXggZW51bXMgYW5kIGZpeCBFeGFtcGxlcy9NYWtlZmlsZS5pbiBzbyB0aGF0IGlmCgkgICAgICBtdWx0aXBsZSAtSSBhcmd1bWVudHMgYXJlIHNwZWNpZmllZCBpbiB0aGUgSU5DTFVERVMgdmFyaWFibGUsIGVhY2gKCSAgICAgIGdldHMgYSArK2NjZi4KCgkgICAgLSBbR3VpbGUgR0hdIFVwZGF0ZSBHdWlsZSBHSCB0byB1c2UgdGhlIG5ldyB0eXBlIHN5c3RlbS4gIFNlZQoJICAgICAgRG9jL01hbnVhbC9HdWlsZS5odG1sIGZvciBob3cgc21vYnMgYXJlIG5vdyB1c2VkLgoKMDEvMTEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBOZXcgdHlwZW1hcCBjYWxsZWQgJ2NzY29uc3RydWN0Jy4gVGhlIGNvZGUgaW4gdGhpcyB0eXBlbWFwcyB3YXMgcHJldmlvdXNseSBoYXJkCiAgICAgICAgICAgIGNvZGVkIGFuZCBjb3VsZCBub3QgYmUgY3VzdG9taXNlZCBieSBhIHVzZXIuIFRoaXMgdHlwZW1hcCBjb250YWlucyB0aGUgY29kZSB0aGF0IGlzCiAgICAgICAgICAgIGdlbmVyYXRlZCBpbnRvIGEgcHJveHkgY2xhc3MncyBjb25zdHJ1Y3Rvci4KCiAgICAgICAgICAgIFtKYXZhXSBOZXcgdHlwZW1hcCBjYWxsZWQgJ2phdmFjb25zdHJ1Y3QnLiBUaGUgY29kZSBpbiB0aGlzIHR5cGVtYXBzIHdhcyBwcmV2aW91c2x5IGhhcmQKICAgICAgICAgICAgY29kZWQgYW5kIGNvdWxkIG5vdCBiZSBjdXN0b21pc2VkIGJ5IGEgdXNlci4gVGhpcyB0eXBlbWFwIGNvbnRhaW5zIHRoZSBjb2RlIHRoYXQgaXMKICAgICAgICAgICAgZ2VuZXJhdGVkIGludG8gYSBwcm94eSBjbGFzcydzIGNvbnN0cnVjdG9yLiBBbm90aGVyIHR5cGVtYXAgbmFtZWQgJ2phdmFjb25zdHJ1Y3RfZGlyZWN0b3InCiAgICAgICAgICAgIGlzIHVzZWQgaW5zdGVhZCB3aGVuIHRoZSBwcm94eSBjbGFzcyBpcyBhIGRpcmVjdG9yIGNsYXNzLgoKICAgICAgICAgICAgW0MjLCBKYXZhXSBJZiBhIEMrKyBjbGFzcyBkaWQgbm90IGhhdmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLCBhIHByb3RlY3RlZCBkZWZhdWx0IGNvbnN0cnVjdG9yCiAgICAgICAgICAgIHdhcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBTV0lHLiBUaGlzIHNlZW1zIGlzIHVubmVjZXNzYXJ5IGFuZCBoYXMgYmVlbiByZW1vdmVkCiAgICAgICAgICAgIGFuZCB0aGVyZWJ5IGdpdmluZyB0aGUgdXNlciBhbG1vc3QgY29tcGxldGUgY29udHJvbCBvdmVyIHRoZSBnZW5lcmF0ZWQgY29kZSBhbG9uZyB3aXRoIHRoZQogICAgICAgICAgICBuZXcgdHlwZW1hcHMgYWJvdmUuCgoxOS8xMi8yMDA0OiBtbWF0dXMKICAgICAgICAgICAgW0Rpc2FibGVkLCBzZWUgZW50cnkgMDIvMTUvMjAwNF0KICAgICAgICAgICAgLSBGaXggdHlwZW1hcCBzZWFyY2gsIG5vdyB0aGUgIm91dCIgdHlwZW1hcCBzZWFyY2ggaXMgZG9uZSBhcyBmb2xsb3dzCgogICAgICAgICAgICAgICAgIGludCAqRm9vOjpmb28oaW50IGJhcikgICAtPiAgaW50ICpGb286OmZvbyhpbnQgYmFyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgaW50ICpGb286OmZvbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgaW50ICpmb28oaW50IGJhcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIGludCAqZm9vCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICBpbnQgKgoKICAgICAgICAgICAgICAgdGhlbiwgbm93IHlvdSBjYW4gYmUgbW9yZSBzcGVjaWZpYywgYW5kIGRlZmluZQoKICAgICAgICAgICAgICAvKiBhcHBseSBvbmx5IGZvciAgJ0Zvbzo6Zm9vJyBtZXRob2QgKi8KICAgICAgICAgICAgICAldHlwZW1hcChvdXQpIGludCAqIEZvbzo6Zm9vKGludCAqYmFyKSAuLi47IAoKICAgICAgICAgICAgICAvKiBhcHBseSBmb3IgYWxsICdmb28nIGZ1bmN0aW9ucy9tZXRob2RzICovCiAgICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBpbnQgKiBmb28oaW50ICpiYXIpIC4uLjsgCgogICAgICAgICAgICAgICVpbmxpbmUgewogICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgICBpbnQgKmZvbyhpbnQgKmJhcik7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIH0KCSAgCgoxNS8xMi8yMDA0OiBtbWF0dXMKICAgICAgICAgICAgLSBNb3JlIGZpeGVzIGZvciB0ZW1wbGF0ZXMgYW5kIHRlbXBsYXRlIGRlZmF1bHQgYXJncy4KICAgICAgICAgICAgICBTZWUgdGVtcGxhdGVfZGVmYXVsdC5pIGZvciBzY2FyeSBjYXNlcyB0aGF0IG5vdyBhcmUgCiAgICAgICAgICAgICAgc3VwcG9ydGVkLCBiZXNpZGVzIHRoZSBhbHJlYWR5IHVnbHkgU1RML3N0ZCBjYXNlcy4KICAgICAgICAgICAgICAKICAgICAgICAgICAgLSBDb3NtZXRpY3MgYW5kIG1vcmUgdXNlIG9mICdjb25zdCcgd2hlcmUgaXQgd2FzIGltcGxpY2l0LgogICAgICAgICAgICAtIE90aGVyIGZpeGVzIGZvciBPU1MsIHdoaWNoIGlzIG5vdyB3b3JraW5nIGFnYWluIHdpdGggMS4zLjI1LgoJClZlcnNpb24gMS4zLjI0IChEZWNlbWJlciAxNCwgMjAwNCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTIvMTIvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtDaGlja2VuXSBGaXggYSBidW5jaCBvZiBidWdzIHJlbGF0aW5nIHRvIC1wcm94eSBzdXBwb3J0CgkgICAgICArIG5vbi1jbGFzcyB2YXJpYWJsZXMgbm93IGV4cG9ydCBwcm9wZXJseSB1c2luZyAtcHJveHkKCSAgICAgICsgc3RhdGljIG1lbWJlciBmdW5jdGlvbnMgbm93IGV4cG9ydCBwcm9wZXJseSB1c2luZyAtcHJveHkKCSAgICAgICsgbWVtYmVyIGNsYXNzIHZhcmlhYmxlcyBub3cgZXhwb3J0IHByb3Blcmx5IHVzaW5nIC1wcm94eQoJICAgICAgKyBhZGRlZCBhIC1ub3VuaXQgYXJndW1lbnQsIHdoaWNoIGRvZXMgbm90IGV4cG9ydCB0aGUgKGRlY2xhcmUgKHVuaXQgLi4uKSkKCSAgICAgICsgY29ycmVjdGx5IGluc3RhbGwgc3dpZ2Nsb3NwcmVmaXguc2NtCgkgICAgICArIGNvbnN0YW50cyAoZW51bXMsIGRlZmluZXMpIG5vdyBjb3JyZWNseSBleHBvcnQgd2hlbiB1c2luZyAtcHJveHkKCjEyLzExLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIGNvbmZpZ3VyZSBmaXggZm9yIHdoZW4gbW9yZSB0aGFuIG9uZSB2ZXJzaW9uIG9mIGpuaV9tZC5oIGlzIGZvdW5kCiAgICAgICAgICAgIGluIHRoZSBKYXZhIGluY2x1ZGUgZGlyZWN0b3J5ICh3YXMgZ2VuZXJhdGluZyBsb3RzIG9mIHNlZCBlcnJvcgogICAgICAgICAgICBtZXNzYWdlcykuCgoxMi8wOC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4ZXMgdG8gYXJyYXlzX2phdmEuaSBzbyB0aGF0IG9uZSBjYW4gYXBwbHkgdGhlIGFycmF5CiAgICAgICAgICAgIHR5cGVtYXBzIHRvIGZ1bmN0aW9ucyB0YWtpbmcgcG9pbnRlcnMgYXMgaW5wdXQsIGVnCgogICAgICAgICAgICAgICAgJWluY2x1ZGUgImFycmF5c19qYXZhLmkiCiAgICAgICAgICAgICAgICAlYXBwbHkgaW50W10ge2ludCp9OwogICAgICAgICAgICAgICAgdm9pZCBmb28oaW50ICphKTsKCjEyLzA1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBEaXJlY3RvciBtb2RzIGNvbnRyaWJ1dGVkIGJ5IFNjb3R0IE1pY2hlbC4gTmV3IHR5cGVtYXBzCiAgICAgICAgICAgIGRpcmVjdG9yZGlzY29ubmVjdCBhbmQgZGlyZWN0b3JkaXNjb25uZWN0X2Rlcml2ZWQgZm9yIHRoZSAKICAgICAgICAgICAgc3dpZ0RpcmVjdG9yRGlzY29ubmVjdCgpIG1ldGhvZC4gQWxzbyBmaXggdG8gZ2V0IHRoZSBqYXZhcGFja2FnZQogICAgICAgICAgICB0eXBlbWFwIHdvcmtpbmcgYWdhaW4uCgoxMi8wNS8yMDA0OiBtbWF0dXMKCSAgICAtIEZpbmlzaGluZyB0aGUgZml4ZXMgZm9yIHRlbXBsYXRlcyArIGRlZmF1bHQgdGVtcGxhdGUKCSAgICAgIGFyZ3MgKyBzcGVjaWFsaXphdGlvbnMuCgogICAgICAgICAgICAtIFtQeXRob25dIE5vdyB3ZSB1c2UgdGhlIG5ldyB0ZW1wbGF0ZXMgKyBkZWZhdWx0IHRlbXBsYXRlCgkgICAgICBhcmdzIGluIHRoZSBzdGQvU1RMIGxpYnJhcnkuIFRoYXQgbWVhbnMgdGhlIGludGVybmFsCgkgICAgICBzd2lnIGZpbGVzIGFyZSBnZXR0aW5nIHVnbGllciBzaW5jZSB3ZSBub3cgc3VwcG9ydCB0aGUKCSAgICAgIG9yaWdpbmFsIGRlY2xhcmF0aW9uczoKCgkgICAgICAgIHRlbXBsYXRlPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jID0gc3RkOjphbGxvY2F0b3I8IF9UcCA+ID4KCQljbGFzcyB2ZWN0b3IgewoJCS4uLi4KCQl9OwoJICAgICAgCSAgICAgCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlID0gc3RkOjpsZXNzPF9LZXkgPiwKCSAgICAgICAgY2xhc3MgX0FsbG9jID0gc3RkOjphbGxvY2F0b3I8c3RkOjpwYWlyPGNvbnN0IF9LZXksIF9UcCA+ID4gPgogICAgICAgICAgICAgICAgY2xhc3MgbWFwIHsKCQkuLi4uCgkJfTsKIAogICAgICAgICAgICAgIGFuZCB0aGUgdXNlciBjYW4gdXNlIHRoZSAldGVtcGxhdGUgZGlyZWN0aXZlIGFzCgoJICAgICAgICAldGVtcGxhdGUoKSBzdGQ6OnZlY3RvcjxpbnQ+OwoJICAgICAgICAldGVtcGxhdGUoKSBzdGQ6OnZlY3RvcjxpbnQsIHN0ZDo6YWxsb2NhdG9yPGludD4gPjsKCSAgICAgICAgJXRlbXBsYXRlKCkgc3RkOjp2ZWN0b3I8aW50LCBNeUFsbG9jYXRvcjxpbnQ+ID47CgogICAgICAgICAgICAgIE5vdyB3ZSBhcmUgY2xvc2VyIHRvIHRoZSBjbGVhbmluZy9yZXdyaXRpbmcgb2YgdGhlCgkgICAgICBweXRob24gc3RkL1NUTCBzdXBwb3J0LCBzdWNoIHRoYXQgd2UgcmVjb3ZlciBzdXBwb3J0IGZvcgoJICAgICAgTVNWQysrIDYuMCwgYW5kIHdlIGNhbiBhZGQgc3VwcG9ydCBmb3Igb3RoZXIgbGFuZ3VhZ2VzCgkgICAgICB0b28uCgoKMTIvMDIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgZGlyZWN0b3JzIHdoZW4gd3JhcHBpbmcgbWV0aG9kcyB1c2luZyBhIG1lbWJlciBlbnVtCiAgICAgICAgICAgIGFuZCB0eXBlc2FmZS9wcm9wZXIgZW51bXMgZW5hYmxlZC4KCjEyLzAxLzIwMDQ6IG1tYXR1cwoJICAgIC0gRml4IHR5cGVtYXBzIHRvIHdvcmsgd2l0aCB0ZW1wbGF0ZXMgYW5kIGRlZmF1bHQgdGVtcGxhdGUKCSAgICAgIGFyZ3MsIGllCgoJICAgICAgIHRlbXBsYXRlIDxjbGFzcyBBLCBjbGFzcyBCID0gaW50PgogICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKCSAgICAgICB9OwoKCSAgICAgICAldHlwZW1hcChpbikgRm9vPGludD4gKnsuLi59CgkgICAgICAgJXR5cGVtYXAob3V0KSBGb288aW50LGludD4gKnsuLi59CgoJICAgICAgIEZvbzxpbnQ+ICogZm9vKCBGb288aW50PiAqZjEsIEZvbzxpbnQsaW50PiAqZjIpOwoKCSAgICAgIG5vdyAnZjEnLCAnZjInIGFuZCB0aGUgcmV0dXJuIHZhbHVlIHJlc29sdmUgdGhlIHByb3ZpZGVkCgkgICAgICB0eXBlbWFwcyBwcm9wZXJseS4KCgkgICAgICBUaGlzIGlzIGhpZ2hseSBuZWVkZWQgZm9yIHByb3BlciBTVEwgc3VwcG9ydCwgc2VlIG5ldyAKCSAgICAgIHN0ZF9iYXNpY19zdHJpbmcuaSwgc3RkX3NzdHJlYW0uaSwgZXRjLgoKCSAgICAtIEFkZGVkIHN0ZF9zc3RyZWFtLmksIGFuZCBmaXggc3RkX2Jhc2ljX3N0cmluZy5pIHRvIHVzZQoJICAgICAgdGhlIG5ldyB0eXBlbWFwcyArIHRlbXBsYXRlIGRlZi4gYXJnIG1lY2hhbmlzbS4gQWxzbywKCSAgICAgIGFkZGVkIHRoZSBuZWVkZWQgc3RkX2FsbG9jLmkuIE5vdywgYWxsIHRoZSBjb250YWluZXJzCgkgICAgICBjYW4gYmUgbW9kaWZpZWQgdG8gc3VwcG9ydCBzdGQ6OmFsbG9jYXRvciwgbGlrZSBpbjoKCSAgICAgIAoJICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBBID0gc3RkOjphbGxvY2F0b3I8VCA+ID4KCQljbGFzcyB2ZWN0b3IgewoJCXB1YmxpYzoKCQkuLi4uCgkJfTsKCSAgICAgIAoJICAgICAgVGhpcyBjaGFuZ2UgaXMgb25seSBjb21wbGV0ZWQgYnkgbm93IGZvciBiYXNpY19zdHJpbmcuCgoJICAgIC0gRml4IGZvciBzbWFydCBwb2ludGVycyArIG1lbWJlcnMgKyBleHRlbnNpb25zOgoKCSAgICAgICVleHRlbmQgRm9vIHsKCSAgICAgICAgaW50IGV4dGVuc2lvbihpbnQgaSwgaW50IGopIHsgcmV0dXJuIGk7IH0KCQlpbnQgZXh0ZW5zaW9uKCkgeyByZXR1cm4gMTsgfQoJICAgICAgfQoKCSAgICAgICVpbmxpbmUgJXsKCgkgICAgICBjbGFzcyBGb28gewoJICAgICAgcHVibGljOgoJCWludCB5OwoJCXN0YXRpYyBjb25zdCBpbnQgejsKCSAgICAgIH07CiAgCgkgICAgICBjbGFzcyBCYXIgewoJICAgICAgICBGb28gKmY7CgkgICAgICBwdWJsaWM6CgkgICAgICAgIEJhcihGb28gKmYpIDogZihmKSB7IH0KCQlGb28gKm9wZXJhdG9yLT4oKSB7CgkJICByZXR1cm4gZjsKCQl9CgkgICAgICB9OwoKCSAgICAgIG5vdyB5b3UgY2FuIAoJICAgICAKCSAgICAgIGYgPSBGb28oKQoJICAgICAgZi55ID0gMwoJICAgICAgYSA9IGYuegoJICAgICAgZi0+ZXh0ZW5zaW9uKCkKIAoJICAgICAgYiA9IEJhcihmKQoJICAgICAgYi55ID0gMwoJICAgICAgYSA9IGIuegoJICAgICAgYi0+ZXh0ZW5zaW9uKCkKCgkgICAgLSBPdGhlciBzbWFsbCBlcnJvcnMgZml4ZXMsIG1vc3RseSBweXRob24uCgoxMS8yNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gTnVtZXJvdXMgZGlyZWN0b3IgYnVnIGZpeGVzIHNvIHRoYXQgdGhlIGNvcnJlY3QgamF2YSB0eXBlcwogICAgICAgICAgICBhbmQgY2Fub25pY2FsaXplZCB0eXBlcyBpbiB0aGUgSk5JIGNvZGUgYXJlIGVtaXR0ZWQuIFVzZSBvZiB0aGUKICAgICAgICAgICAgJGphdmFjbGFzc25hbWUgc3BlY2lhbCB2YXJpYWJsZXMgaW4gdGhlIGRpcmVjdG9yIHR5cGVtYXBzIG5vdwogICAgICAgICAgICBjb25zaXN0ZW50IHdpdGggdGhlIG5vbi1kaXJlY3RvciB0eXBlbWFwcy4gVGhlIHR5cGVzIHVzZWQgZm9yIAogICAgICAgICAgICB0eXBlbWFwIGxvb2t1cHMgYXJlIGFsc28gY29ycmVjdGVkIGluIGEgZmV3IHBsYWNlcy4gSWYgeW91IAogICAgICAgICAgICBwcmV2aW91c2x5IGhhZCB5b3VyIG93biBkaXJlY3RvciB0eXBlbWFwcywgZW5zdXJlIHRoZXkgYXJlIHVzaW5nIHRoZQogICAgICAgICAgICBjb3JyZWN0IEMrKyB0eXBlLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgRElSRUNUT1JTICoqKgoKMTEvMjUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgY29uc3QgZW51bSBTV0lHVFlQRSAmIHR5cGVtYXBzIGFkZGVkLiBUaGVzZSB3cmFwIGNvbnN0IGVudW0gcmVmZXJlbmNlcwogICAgICAgICAgICBhcyBpZiB0aGV5IHdlcmUgcGFzc2VkIGJ5IHZhbHVlLiBDb25zdCBlbnVtIHJlZmVyZW5jZXMgdGh1cyB3b3JrIHRoZQogICAgICAgICAgICBzYW1lIGFzIGNvbnN0IHJlZmVyZW5jZSBwcmltaXRpdmUgdHlwZXMgc3VjaCBhcyBjb25zdCBkb3VibGUgJiwgCiAgICAgICAgICAgIGNvbnN0IGludCAmIGV0Yy4gVHlwZW1hcHMgYWRkZWQgZm9yIEphdmEsIEMjLCBSdWJ5LCBUY2wsIFBlcmwgYW5kIFBpa2UuCgoxMS8yNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIE5ldyBzcGVjaWFsIHZhcmlhYmxlOiAkKmphdmFjbGFzc25hbWUsIHNpbWlsYXIgdG8gJGphdmFjbGFzc25hbWUKICAgICAgICAgICAgYW5kICQmamF2YWNsYXNzbmFtZS4gVGhlIG5ldyBvbmUgcmVtb3ZlcyBhIHBvaW50ZXIgZnJvbSB0aGUgQyB0eXBlIGJlZm9yZQogICAgICAgICAgICBvYnRhaW5pbmcgdGhlIEphdmEgY2xhc3MgbmFtZS4gT25lIG9yIG1vcmUgb2YgJGphdmFjbGFzc25hbWUsCiAgICAgICAgICAgICQmamF2YWNsYXNzbmFtZSBvciAkKmphdmFjbGFzc25hbWUgbWF5IG5vdyBhcHBlYXIgaW4gYSB0eXBlbWFwLiBMaWtld2lzZSBmb3IKICAgICAgICAgICAgQyMgdXNpbmcgY3NjbGFzc25hbWUgaW5zdGVhZCBvZiBqYXZhY2xhc3NuYW1lLgoKMTEvMjUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgVGhlIGxhc3QgdmVzdGlnZXMgb2YgZW51bXMgYmVpbmcgaGFuZGxlZCBhcyBpbnRlZ2VycyByZW1vdmVkIGZyb20gdGhlCiAgICAgICAgICAgIGludGVybmFscy4gVGhlIHdyYXBwZXIgbWV0aG9kcyB1c2UgdGhlIGVudW0gdHlwZSByYXRoZXIgdGhhbiBhbiBpbnQKICAgICAgICAgICAgbm93LiBUaGUgbmV0IHJlc3VsdCBpcyBhZGRlZCB0eXBlIHNhZmV0eSBmb3IgZW51bXMgd2hlbiBoYW5kbGVkIGFzCiAgICAgICAgICAgIHBvaW50ZXJzLCByZWZlcmVuY2VzIGV0Yy4gUHJldmlvdXNseSBpbiBzaXR1YXRpb25zIHN1Y2ggYXMgYSBtZXRob2QKICAgICAgICAgICAgdGFraW5nIGEgcG9pbnRlciB0byBhbiBlbnVtLCBhIHBvaW50ZXIgdG8gYW4gaW50IG9yIGEgcG9pbnRlciB0byBhbgogICAgICAgICAgICBlbnVtIG9mIHNvbWUgb3RoZXIgdHlwZSBjb3VsZCBpbmFkdmVydGFudGx5IGJlIHBhc3NlZCB0byB0aGUgbWV0aG9kLgogICAgICAgICAgICBUaGlzIGlzIG5vdyBmaXhlZCBhcyB0aGUgZGVzY3JpcHRvciBmb3IgYW4gZW51bSBpcyBubyBsb25nZXIgYmFzZWQgb24KICAgICAgICAgICAgYW4gaW50LCBidXQgdGhlIGVudW0gdHlwZSBpbnN0ZWFkLiBBbm9ueW1vdXMgZW51bXMgYXJlIHN0aWxsIGhhbmRsZWQKICAgICAgICAgICAgYXMgaW50ZWdlcnMuCgogICAgICAgICAgICBUaGUgY29uc2VxdWVuY2UgZm9yIHNjcmlwdGluZyBsYW5ndWFnZSB1c2VycyBpbiBjb3JyZWN0IHVzYWdlIG9mIGVudW1zCiAgICAgICAgICAgIHNob3VsZCBub3QgYmUgbm90aWNlYWJsZS4gVGhlcmUgaXMgbm8gY2hhbmdlIGZvciBhbnkgb2YgdGhlIGxhbmd1YWdlcwogICAgICAgICAgICB3aGVyZSBlbnVtcyBhcmUgcGFzc2VkIGJ5IHZhbHVlIC0gbW9zdCBvZiB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlcyB3aWxsCiAgICAgICAgICAgIHN0aWxsIGFjY2VwdCBhbiBpbnRlZ2VyIGZvciBhbiBlbnVtIHZhbHVlIGFuZCB0aGUgc3Ryb25nbHkgdHlwZWQKICAgICAgICAgICAgbGFuZ3VhZ2VzIHN0aWxsIHVzZSBlaXRoZXIgdHlwZXNhZmUgZW51bXMsIGludGVnZXJzIG9yIHByb3BlciBlbnVtcwogICAgICAgICAgICBkZXBlbmRpbmcgb24gd2hhdCB0aGUgdXNlciBjb25maWd1cmVzLiBGb3IgSmF2YSBhbmQgQyMgdXNlcnMgYSBjaGFuZ2UKICAgICAgICAgICAgaW4gdGhlIHR5cGV3cmFwcGVyIGNsYXNzIG5hbWUgaGFzIG9jY3VycmVkIChmb3IgZW51bSBwb2ludGVycywKICAgICAgICAgICAgcmVmZXJlbmNlcyBldGMpLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgZW51bSBOdW1iZXJzIHsgb25lPTEsIHR3byB9OwogICAgICAgICAgICAgIGVudW0gTnVtYmVycyogbnVtYmVyKCk7CgogICAgICAgICAgICBJbiBKYXZhIGFuZCBDIyB0aGlzIG11c3Qgbm93IGJlIGNvZGVkIGFzCgogICAgICAgICAgICAgIFNXSUdUWVBFX3BfTnVtYmVycyBuID0gbW9kdWxlbmFtZS5udW1iZXIoKTsKCiAgICAgICAgICAgIHJhdGhlciB0aGFuCgogICAgICAgICAgICAgIFNXSUdUWVBFX3BfaW50IG4gPSBtb2R1bGVuYW1lLm51bWJlcigpOwoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8yMS8yMDA0OiB3c2Z1bHRvbi9tbWF0dXMKICAgICAgICAgICAgQWRkZWQgbWlzc2luZyBkZXByZWNhdGVkIHdhcm5pbmcgZm9yICVuYW1lIGFuZCByZW1vdmUgcmVtYWluaW5nICVuYW1lCiAgICAgICAgICAgIHVzYWdlIGluIHRoZSBTV0lHIGxpYnJhcmllcy4KCjExLzIxLzA0OiBtbWF0dXMKCSAgICAtIFtQeXRob25dIEFkZGluZyB0aGUgUHlTd2lnT2JqZWN0IHRvIGJlIHVzZWQgZm9yIGNhcnJ5aW5nCgkgICAgICB0aGUgaW5zdGFuY2UgQy9DKysgcG9pbnRlcnMuIFRoaXMgaXMgdXNlZCBpbnN0ZWFkIG9mCgkgICAgICBzdHJpbmcgYW5kIFB5Q09iamVjdHMuCgoJICAgICAgVGhlIG5ldyBQeVN3aWdPYmplY3QgaXMgZXZlbiBzYWZlciB0aGFuIFB5Q09iamVjdCwgYW5kCgkgICAgICBtb3JlIGZyaWVuZGx5IHRoYW4gcGxhaW4gc3RyaW5nczoKCgkgICAgICBub3cgeW91IGNhbiBkbwoKCSAgICAgICAgcHJpbnQgYS50aGlzCgkJPFN3aWcgT2JqZWN0IGF0IF8wMDY5MTYwOF9wX0E+CgoJCXByaW50IHN0cihhLnRoaXMpCgkJXzAwNjkxNjA4X3BfQQoKCQlwcmludCBsb25nKGEudGhpcykKCQkxMzU2ODY0MDAKCgkJcHJpbnQgIiVzIDB4JXgiICUgKGEudGhpcywgYS50aGlzKQoJCV8wMDY5MTYwOF9wX0EgMHg4MTY2OTAwCgoJICAgICAgdGhlIGxhc3Qgb25lIGlzIHZlcnkgdXNlZnVsIHdoZW4gZGVidWdnaW5nIHRoZSBDL0MrKwoJICAgICAgc2lkZSwgc2luY2UgaXMgdGhlIHBvaW50ZXIgdmFsdWUgeW91IHdpbGwgdXN1YWxseSBnZXQKCSAgICAgIGZyb20gdGhlIGRlYnVnZ2VyLgoKCSAgICAgIEFsc28sIGlmIHlvdSBoYXZlIHNvbWUgb2xkIGNvZGUgdGhhdCB1c2VzIHRoZSBzdHJpbmcKCSAgICAgIHJlcHJlc2VudGF0aW9uICJfMDA2OTE2MDhfcF9BIiwgeW91IGNhbiB1c2UgaXQgbm93IGFnYWluCgkgICAgICB1c2luZyAnc3RyKHB0ciknLCBvciBieSBjYWxsaW5nICdzdHIgPSBQeU9iamVjdF9TdHIob2JqKScKCSAgICAgIGluIHRoZSBDL0MrKyBzaWRlLgogCgkgICAgICBUaGlzIGNoYW5nZSBpcyBtYWlubHkgZm9yIG5vc3RhbGdpYyBzd2lnIHVzZXJzIHRoYXQgbWlzcwoJICAgICAgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiwgYnV0IGFsc28gYWxsb3dzIHRvIHNheSBhZ2FpbgoKCSAgICAgICAgaWYgYS50aGlzID09IGIudGhpczoKCQkgIHJldHVybiAiYSBpcyBiIgoKCSAgICAgIGFuZCB3ZWxsLCBzaW5jZSB0aGUgY2hhbmdlIHdlcmUgcmVhbGx5IHNpbXBsZSwgbWF5YmUgaW4KCSAgICAgIHRoZSBmdXR1cmUgd2Ugd2lsbCBiZSBhYmxlIHRvIGRvCiAgIAoJCW5leHQgPSBhLnRoaXMgKyAxCgoJICAgICAgb3IgYWRkIG5hdGl2ZSBweXRob24gaXRlcmF0aW9uIG92ZXIgbmF0aXZlIEMvQysrIGFycmF5cywKCSAgICAgIGllLCBubyBuZWVkIHRvIGNyZWF0ZS9jb3B5IG5ldyB0dXBsZXMgd2hlbiByZXR1cm5pbmcgYW5kCgkgICAgICBhcnJheSBvciB2ZWN0b3IuCgoJICAgICAgQWxzbywgYSBQeVN3aWdQYWNrZWQgb2JqZWN0IHdhcyBhZGRpbmcgdG8gY2FycnkgYSBtZW1iZXIKCSAgICAgIG1ldGhvZCBwb2ludGVyLCBidXQgdGhpcyBpcyBwcm9iYWJseSBhIHRlbXBvcmFsIHNvbHV0aW9uCgkgICAgICB1bnRpbCBhIG1vcmUgZ2VuZXJhbCBvYmplY3QgZm9yIG1ldGhvZHMgaXMgYWRkZWQuCgoJICAgICAgQmUgYXdhcmUgdGhhdCB0byBzaW1wbGlmeSBtYWludGFpbmluZyBhbmQgY29tcGF0aWJpbGl0eQoJICAgICAgd2l0aCBvdGhlciB0b29scywgdGhlIG9sZCBzdHJpbmcgYW5kIFB5Q09iamVjdHMKCSAgICAgIHJlcHJlc2VudGF0aW9uIGNvdWxkIGRpc2FwcGVhciB2ZXJ5IHNvb24sIGFuZCB0aGUKCSAgICAgIFNXSUdfQ09CSkVDVFNfVFlQRVMgb3IgU1dJR19OT19PQkpFQ1RfVFlQRVMgbWFjcm9zIHdpbGwKCSAgICAgIGhhdmUgbm8gZWZmZWN0IGF0IGNvbXBpbGF0aW9uIHRpbWUuIFN0aWxsLCB0aGUgdGhyZWUKCSAgICAgIG1lY2hhbmlzbXMgYXJlIHByZXNlbnQgaW4gdGhlIGNvZGUganVzdCBmb3IgdGVzdGluZywKCSAgICAgIGRlYnVnZ2luZyBhbmQgY29tcGFyaXNvbiBwdXJwb3Nlcy4KCSAgICAgIAoxMS8yMS8wNDogbW1hdHVzCgoJICAgIC0gW1B5dGhvbl0gQWRkaW5nIGJhY2sgc3VwcG9ydCBmb3IgdXNpbmcgdGhlIHN3aWcgcnVudGltZSBjb2RlCgkgICAgICBpbnNpZGUgdGhlIHVzZXIgY29kZS4gV2UganVzdCBhbGxvdyB0aGUgdXNlciB0byBpbmNsdWRlCgkgICAgICB0aGUgbWluaW1hbCBjb2RlIG5lZWRlZCB0byBpbXBsZW1lbnQgdGhlIHJ1bnRpbWUKCSAgICAgIG1lY2hhbmlzbSBzdGF0aWNhbGx5LCBqdXN0IGFzIGluIGRvbmUgaW4gdGhlIHN3aWcKCSAgICAgIG1vZHVsZXMuCgkgICAgICAKCSAgICAgIFRvIHVzZSB0aGUgc3dpZyBydW50aW1lIGNvZGUsIGZvciBleGFtcGxlIHdpdGggcHl0aG9uLAoJICAgICAgdGhlIHVzZXIgbmVlZHMgaW5jbHVkZSB0aGUgZm9sbG93aW5nOgogCiAgICAgICAgICAgICAgICNpbmNsdWRlIDxQeXRob24uaD4gICAgICAgICAvLyBvciB1c2luZyB5b3VyIGZhdm9yaXRlIGxhbmd1YWdlCiAgICAgICAgICAgICAgICNpbmNsdWRlIDxzd2lncnVuLnN3Zz4KICAgICAgICAgICAgICAgI2luY2x1ZGUgPHB5dGhvbi9weXJ1bi5zd2c+IC8vIG9yIHVzaW5nIHlvdXIgZmF2b3JpdGUgbGFuZ3VhZ2UKICAgICAgICAgICAgICAgI2luY2x1ZGUgPHJ1bnRpbWUuc3dnPgoKCSAgICAgIHRoZSBmaWxlcyBzd2lncnVuLnN3ZywgcHlydW4uc3dnIGFuZCBydW50aW1lLnN3ZyBjYW4gCgkgICAgICBiZSBjaGVja2VkIG91dCBieSB1c2luZyBzd2lnIC1jbywgb3IgdGhleSBjYW4gc2ltcGx5IAoJICAgICAgYmUgZm91bmQgYnkgYWRkaW5nIHRoZSBzd2lnIGxpYiBkaXJlY3RvcnkgdG8gdGhlCgkgICAgICBjb21waWxlciBpbmNsdWRlIGRpcmVjdG9yeSBsaXN0LCBmb3IgZXhhbXBsZQoKCSAgICAgICBTV0lHTElCPWBzd2lnIC1zd2lnbGliYAoJICAgICAgIGMrKyAtSSR7U1dJR0xJQn0gLi4KCgkgICAgICBvZiBiZXR0ZXIsIHVzaW5nIHRoZSBDUFBGTEFHUywgYnV0IHRoYXQgZGVwZW5kcyBvbiB5b3VyCgkgICAgICBlbnZpcm9ubWVudC4KCSAgICAgICAKCSAgICAgIFRoaXMgY2hhbmdlIGNhbiBiZSBwb3J0ZWQgdG8gdGhlIG90aGVyIGxhbmd1YWdlcyB0b28sCgkgICAgICB5b3UganVzdCBuZWVkIHRvIGlzb2xhdGUgdGhlIG5lZWRlZCBydW50aW1lIGNvZGUgaW4KCSAgICAgIGEgc2luZ2xlIGZpbGUgbGlrZSAncHlydW4uc3dnJywgYW5kIHByb3ZpZGUgdGhlIAoJICAgICAgU1dJR19SdW50aW1lX0dldFR5cGVMaXN0KCkgbWV0aG9kLiBMb29rIGF0IHRoZQoJICAgICAgTGliL3B5dGhvbi9weXJ1bi5zd2cgZmlsZSBhbmQgdGhlIEV4YW1wbGVzL3B5dGhvbi9zd2lncnVuCgkgICAgICBleGFtcGxlLgoKMTEvMTUvMDQ6IG1tYXR1cwoJICAgIC0gRml4IG1peGVkX3R5cGVzLmkgKyBnY2MtMy40LCBpZSwgYXJyYXlzICsgcmVmZXJlbmNlcyArCgkgICAgICB0eXBlZGVmcwoKCSAgICAtIEZpeCBtdWx0aWRpbSBhcnJheXMgKyB0eXBlZGVmcyxpZQoKCSAgICAgICB0eXBlZGVmIGNoYXIgY2hhcmFjdGVyWzFdOwoJICAgICAgIHR5cGVkZWYgY2hhcmFjdGVyIHdvcmRbNjRdOwoKCSAgICAtIFByb2Nlc3MgcHJvdGVjdGVkL3ByaXZhdGUgYmFzZXMgaW4gdGhlIHNhbWUgd2F5IGJlZm9yZQoJICAgICAgd2UgcHJvY2VzcyBwcm90ZWN0ZWQvcHJpdmF0ZSBtZW1iZXJzLCBpZSwgd2UgY2hlY2sKCSAgICAgIGZvciBjb25zdHJ1Y3RvcnMsIG9wZXJhdG9yIG5ldywgdmlydHVhbCBtZW1iZXJzLCBldGMuCiAgIAoJICAgIC0gRml4IFJ1YnkvSmF2YSB0byB3b3JrIChvciBpZ25vcmUpIG11bHRpLWluaGVyaXRhbmNlICsKICAgICAgICAgICAgICBkaXJlY3RvcnMuIEFsbG93IG90aGVyIGxhbmd1YWdlcyB0byBkZWZpbmUgaWYgaXQgaXMKICAgICAgICAgICAgICBzdXBwb3J0ZWQgb3Igbm90LgoJICAgIAoJICAgIC0gTm93IHlvdSBjYW4gcnVuCgogICAgICAgICAgICAgICAgU1dJR19GRUFUVVJFUz0iLWRpcmVjdG9ycyAtZGlycHJvdCIgCiAgICAgICAgICAgICAgICBtYWtlIGNoZWNrLXJ1YnktdGVzdC1zdWl0ZQogICAgICAgICAgICAgICAgbWFrZSBjaGVjay1weXRob24tdGVzdC1zdWl0ZQogICAgICAgICAgICAgICAgbWFrZSBjaGVjay1qYXZhLXRlc3Qtc3VpdGUKICAgICAgICAgICAgICAgIG1ha2UgY2hlY2stb2NhbWwtdGVzdC1zdWl0ZQoKCSAgICAgIGFuZCB5b3Ugd2lsbCBnZXQgb25seSAncmVhbCcgZXJyb3JzLiBydWJ5IGFuZCBweXRob24KCSAgICAgIGNvbXBpbGUgd2l0aCBubyBlcnJvcnMsIGphdmEgc2hvd3Mgc29tZSBwcm9ibGVtcy4JCgpWZXJzaW9uIDEuMy4yMyAoTm92ZW1iZXIgMTEsIDIwMDQpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjExLzA1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoICM5ODI3NTMgZnJvbSBGYWJyaWNlIFNhbHZhaXJlOiBBZGRzIGRlcGVuZGVuY2llcyBnZW5lcmF0aW9uIGZvcgogICAgICAgICAgICBjb25zdHJ1Y3RpbmcgbWFrZWZpbGVzLiBOZXcgY29tbWFuZCBsaW5lIG9wdGlvbnMgLU1GIC1NRCAtTU1EIHRvIHdvcmsKICAgICAgICAgICAgd2l0aCB0aGUgY3VycmVudCBvcHRpb25zIC1NIGFuZCAtTU0uIFRoZXNlIG9wdGlvbnMgYXJlIG5hbWVkIHRoZSBzYW1lCiAgICAgICAgICAgIGFuZCB3b3JrIHRoZSBzYW1lIGFzIGluIGdjYy4KCjExLzA1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgICVpZ25vcmUvJXJlbmFtZSBjaGFuZ2VzIGZvciBtZXRob2RzIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgdG8gbWlycm9yCiAgICAgICAgICAgICVmZWF0dXJlIGJlaGF2aW91ci4gU2VlIHByZXZpb3VzIGVudHJ5LgoKICAgICAgICAgICAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTEvMDQvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgJWZlYXR1cmUgaW1wcm92ZW1lbnRzIGZvciBmaW5lIHR1bmluZyB3aGVuIHdyYXBwaW5nIG1ldGhvZHMgd2l0aAogICAgICAgICAgICBkZWZhdWx0IGFyZ3VtZW50cy4gQW55ICVmZWF0dXJlIHRhcmdldGluZyBhIG1ldGhvZCB3aXRoIGRlZmF1bHQgYXJndW1lbnRzCiAgICAgICAgICAgIHdpbGwgYXBwbHkgdG8gYWxsIHRoZSBleHRyYSBvdmVybG9hZGVkIG1ldGhvZHMgdGhhdCBTV0lHIGdlbmVyYXRlcyBpZiB0aGUKICAgICAgICAgICAgZGVmYXVsdCBhcmd1bWVudHMgYXJlIHNwZWNpZmllZCBpbiB0aGUgZmVhdHVyZS4gSWYgdGhlIGRlZmF1bHQgYXJndW1lbnRzIGFyZQogICAgICAgICAgICBub3Qgc3BlY2lmaWVkIGluIHRoZSBmZWF0dXJlLCB0aGVuIHRoZSBmZWF0dXJlIHdpbGwgbWF0Y2ggdGhhdCBleGFjdAogICAgICAgICAgICB3cmFwcGVyIG1ldGhvZCBvbmx5IGFuZCBub3QgdGhlIGV4dHJhIG92ZXJsb2FkZWQgbWV0aG9kcyB0aGF0IFNXSUcgZ2VuZXJhdGVzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWZlYXR1cmUoImV4Y2VwdCIpIGhlbGxvKGludCBpPTAsIGRvdWJsZSBkPTAuMCk7CiAgICAgICAgICAgICAgdm9pZCBoZWxsbyhpbnQgaT0wLCBkb3VibGUgZD0wLjApOwoKICAgICAgICAgICB3aWxsIGFwcGx5IHRoZSBmZWF0dXJlIHRvIGFsbCB0aHJlZSB3cmFwcGVyIG1ldGhvZHMsIHRoYXQgaXM6CgogICAgICAgICAgICAgIHZvaWQgaGVsbG8oaW50IGksIGRvdWJsZSBkKTsKICAgICAgICAgICAgICB2b2lkIGhlbGxvKGludCBpKTsKICAgICAgICAgICAgICB2b2lkIGhlbGxvKCk7CgogICAgICAgICAgIElmIHRoZSBkZWZhdWx0IGFyZ3VtZW50cyBhcmUgbm90IHNwZWNpZmllZCBpbiB0aGUgZmVhdHVyZToKCiAgICAgICAgICAgICAgJWZlYXR1cmUoImV4Y2VwdCIpIGhlbGxvKGludCBpLCBkb3VibGUgZCk7CiAgICAgICAgICAgICAgdm9pZCBoZWxsbyhpbnQgaT0wLCBkb3VibGUgZD0wLjApOwoKICAgICAgICAgICB0aGVuIHRoZSBmZWF0dXJlIHdpbGwgb25seSBhcHBseSB0byB0aGlzIHdyYXBwZXIgbWV0aG9kOgoKICAgICAgICAgICAgICB2b2lkIGhlbGxvKGludCBpLCBkb3VibGUgZCk7CgogICAgICAgICAgIGFuZCBub3QgdGhlc2Ugd3JhcHBlciBtZXRob2RzOgoKICAgICAgICAgICAgICB2b2lkIGhlbGxvKGludCBpKTsKICAgICAgICAgICAgICB2b2lkIGhlbGxvKCk7CgogICAgICAgICAgIFRoaXMgaGFzIGJlZW4gaW50cm9kdWNlZCB0byBtYWtlICVmZWF0dXJlIG1vcmUgcG93ZXJmdWwgdG8gZWFzZSB0aGUgbWlncmF0aW9uCiAgICAgICAgICAgdG8gbmV3IGRlZmF1bHQgYXJndW1lbnRzIHdyYXBwaW5nIGFwcHJvYWNoLgoKICAgICAgICAgICAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKICAgICAgICAgICBJZiB5b3UgcHJldmlvdXNseSBoYWQgYSAlZmVhdHVyZSBhbmQgZGlkbid0IHNwZWNpZnkgdGhlIGRlZmF1bHQgYXJndW1lbnRzLAogICAgICAgICAgIHlvdSB3aWxsIGhhdmUgdG8gYWRkIHRoZW0gaW4gbm93IG9yIHlvdSBjYW4gb2J0YWluIHRoZSBvcmlnaW5hbCBiZWhhdmlvdXIKICAgICAgICAgICBieSB1c2luZyAlZmVhdHVyZSgiY29tcGFjdGRlZmF1bHRhcmdzIikuCgoxMS8wNC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFR5cGVtYXBzIGZvciBzdGQ6OnZlY3RvciBhZGRlZCBpbnRvIHN0ZF92ZWN0b3IuaS4gVGhlIHByb3h5IGNsYXNzZXMKICAgICAgICAgICAgZ2VuZXJhdGVkIGFyZSBtb2RlbGxlZCBvbiB0aGUgLk5FVCBBcnJheUxpc3QgY2xhc3MuIFRoaXMgaXNuJ3QgcXVpdGUKICAgICAgICAgICAgcmVhZHkgZm9yIGdlbmVyYWwgY29uc3VtcHRpb24geWV0LCBidXQgd2lsbCB3b3JrIHdpdGggdmVjdG9ycyBvZiBwcmltaXRpdmUKICAgICAgICAgICAgdHlwZXMgYW5kIHNvbWUgY2xhc3Nlcy4KCjEwLzMvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtHVUlMRV0gVGhlIC1zY20gaW50ZXJmYWNlIGlzIG5vdyB0aGUgZGVmYXVsdC4gIFRoZSBvbGQgR0ggaW50ZXJmYWNlIGNhbgoJICAgIHN0aWxsIGJlIGVuYWJsZWQgYnkgcGFzc2luZyAtZ2ggdG8gU1dJRy4KCjEwLzIvMjAwNDogbW1hdHVzCgoJICAgIC0gTW9yZSBmaXhlcyBmb3IgbmFtZXNwYWNlICsgY2xhc3MgZGVjbGFyYXRpb25zLgoJICAgICAgQXMgYW4gZXh0cmEgYm9udXMsIHdlIGdldCAldGVtcGxhdGUgc3VwcG9ydCBmb3Igc3RhdGljL21lbWJlcnMgY2xhc3MKCSAgICAgIG1ldGhvZHMsIGllLCBub3cgeW91IGNhbiBzYXk6CgoJICAgICAgICBuYW1lc3BhY2Ugc3BhY2UgewogICAgICAgICAgICAgICAgIHN0cnVjdCBBCQkJICAgIAoJICAgICAgICAgewkJCQkgICAgCgkgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBZPgkgICAgCgkgICAgICAgICAgIHN0YXRpYyB2b2lkIGZvb1QoWSB5KSB7IH0KCSAgICAgICAgIH07CQoJCX0JCQkgICAgCgkgICAgICAJICAgICAgCQkJICAgIAoJICAgICAgICBzdHJ1Y3QgQgkJCSAgICAKCSAgICAgICAgewkJCQkgICAgCgkgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFk+CQkgICAgCgkgICAgICAgICAgdm9pZCBiYXJUKFkgeSkge30gCgkgICAgICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgCgoJCSV0ZW1wbGF0ZShmb28pIHNwYWNlOjpBOjpmb29UPGRvdWJsZT47CgkJJXRlbXBsYXRlKGZvbykgc3BhY2U6OkE6OmZvb1Q8aW50PjsKCQkldGVtcGxhdGUoZm9vKSBzcGFjZTo6QTo6Zm9vVDxjaGFyPjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCQkldGVtcGxhdGUoYmFyKSBCOjpiYXJUPGRvdWJsZT47CgkJJXRlbXBsYXRlKGJhcikgQjo6YmFyVDxpbnQ+OwoJCSV0ZW1wbGF0ZShiYXIpIEI6OmJhclQ8Y2hhcj47CgoJICAgICAgYW5kIGNhbGwKCgkgICAgICAgIEEuZm9vKDEpCgkJYiA9IEIoKQoJCWIuYmFyKDEpCgkgICAgICAKCSAgICAgIG5vdGUgdGhlIG1ldGhvZHMgYXJlIGVtaXR0ZWQgaW5zaWRlIHRoZSBjbGFzc2VzLAoJICAgICAgYW5kIGhlbmNlLCB0aGUgJXRlbXBsYXRlIG5hbWUgcmVmZXJzIHRvIHRoZSAnbWVtYmVyJwoJICAgICAgbWV0aG9kIG5hbWUsIG5vdCBhIGdsb2JhbCBuYW1lc3BhY2UgbmFtZS4KCjEwLzMxLzIwMDQ6IG1tYXR1cwoJICAgIC0gU29sdmUgbmFtZXNwYWNlICsgY2xhc3MgZGVjbGFyYXRpb25zLCBhcyBpbgoKCSAgICAgICBuYW1lc3BhY2UgZm9vIHsKICAgICAgICAgICAgICAgICBzdHJ1Y3QgQmFyOwoJCSBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICBzdHJ1Y3QgZm9vOjpCYXIgOiBGb28gewogICAgICAgICAgICAgICB9OwoKCSAgICAgICBzZWUgbmFtZXNwYWNlX2NsYXNzLmkgZm9yIG1vcmUgZXhhbXBsZXMuCgogICAgICAgICAgICAtIEZpeCAldGVtcGxhdGUgZGlyZWN0aXZlIHRvIHByb3Blcmx5IHVzZSBuYW1lc3BhY2VzLAogICAgICAgICAgICAgIGluY2x1ZGluZyB0aGUgY2FzZToKCgkJICAgbmFtZXNwYWNlIG9uZQoJCSAgIHsKCQkgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CgkJICAgICAgIHN0cnVjdCBQdHIge307CiAgICAgICAgICAgICAgICAgICB9CgoJCSAgIG5hbWVzcGFjZSBvbmUKCQkgICB7CQkgIAoJCSAgICAgICBzdHJ1Y3QgT2JqMSB7fTsKCQkgICAgICAgdHlwZWRlZiBQdHI8T2JqMT4gT2JqMV9wdHI7CiAgCQkgICAgICAgJXRlbXBsYXRlKE9iajFfcHRyKSBQdHI8T2JqMT47IAoJCSAgIH0JCQkJICAKCQkgICAJCQkJICAKCQkgICBuYW1lc3BhY2UgdHdvICAKCQkgICB7CgkJICAgICAgIHN0cnVjdCBPYmoyIHt9OwkKCQkgICAgICAgdHlwZWRlZiBvbmU6OlB0cjxPYmoyPiBPYmoyX3B0cjsKCQkgICAgICAgJXRlbXBsYXRlKE9iajJfcHRyKSBvbmU6OlB0cjxPYmoyPjsKCQkgICB9CgoJICAgICAgdGhpcyBpcyBkb25lIGJ5IHVzaW5nIHRoZSBuYW1lc3BhY2UgbmFtZSAnb25lJyB0byBjcmVhdGUKICAgICAgICAgICAgICBhIG5hbWVzcGFjZSBub2RlIHRvIGVtaXQgdGhlIHRlbXBsYXRlIGluc3RhbnRpYXRpb24sCiAgICAgICAgICAgICAganVzdCBhcyBiZWZvcmUsIGJ1dCB0aGUgdGVtcGxhdGUgcGFyYW1ldGVycyBhcmUgcmVzb2x2ZWQKICAgICAgICAgICAgICBhbmQgcXVhbGlmaWVkIGluIHRoZSBjdXJyZW50IG5hbWVzcGFjZSAoJ29uZScgb3IgJ3R3bycpLgogICAgICAgICAgICAgIFRoaXMgaXMgc2FtZSB3YXkgdGhhdCB0eXBlZGVmIHdvcmtzLiAKCgkgICAgICBUaGlzIHJlc29sdmUgdGhlIHNtYXJ0X3BvaW50ZXJfbmFtZXNwYWNlMi5pIGNhc2UsIGFuZCBhdAogICAgICAgICAgICAgIHRoZSBzYW1lIHRpbWUsIHNldmVyYWwgb3RoZXIgb25lcyB3aGVyZSBiZWZvcmUgc3dpZyB3YXMKICAgICAgICAgICAgICBnZW5lcmF0aW5nIHRoZQoKCSAgICAgICAgIkNhbid0IGluc3RhbnRpYXRlIHRlbXBsYXRlICd4eCcgaW5zaWRlIG5hbWVzcGFjZSAneXknIgoJICAgICAgCgkgICAgICBlcnJvciBtZXNzYWdlLiBJbiBmYWN0LCB0aGF0IGVycm9yIGRvZXNuJ3QgZXhpc3QKCSAgICAgIGFueW1vcmUuIFlvdSBjYW4gb25seSBnZXQgYW4gZXJyb3IgaWYgeW91IHVzZSBhIGJhZAoJICAgICAgbmFtZXNwYWNlIG5hbWUgb3Igc28uCgoxMC8zMC8yMDA0OiBtbWF0dXMKCSAgICAtIFtydWJ5XSBEaXJlY3RvcnMgZml4ZXM6CgkgICAgICAtIGVudW1zIGFuZCBzdGQ6OnN0cmluZ3MgYXJlIHdvcmtpbmcgbm93IChzZXZlcmFsCgkgICAgICAgIHJlcG9ydHMgaW4gYnVnIHRyYWNrIHN5c3RlbSkKCSAgICAgIC0gYWRkZWQgcGF0Y2ggMTAyNTg2MSBmb3IgZGlyZWN0b3IgKyBleGNlcHRpb25zCgkJCiAgICAgICAgICAgICAgKioqIEF0dGVudGlvbiAqKio6IHJ1Ynkgd2l0aCBkaXJlY3RvcnMgKyBwcm90ZWN0ZWQKICAgICAgICAgICAgICBtZW1iZXJzIHdvcmsgd2l0aCB2ZXJzaW9uIDEuNysuIE9sZGVyIHZlcnNpb25zIHNlZW1zIHRvCiAgICAgICAgICAgICAgaGF2ZSBhIGJyb2tlbiBzaWduYXR1cmUgZm9yJ3JiX3Byb3RlY3QnLgoJCQoJICAgICAgSWYgeW91IG5lZWQgdG8gdXNlIGFuIG9sZCB2ZXJzaW9uLCBsb29rIGF0CgoJICAgICAgaHR0cDovL2V4Y3J1Ynkuc291cmNlZm9yZ2UubmV0L2RvY3MvaHRtbC9ydWJ5X19oYWNrc184aHBwLXNvdXJjZS5odG1sCiAgCSAgICAgIGZvciB3b3JrYXJvdW5kcy4KCSAgICAgIAogICAgICAgICAgICAtIFtydWJ5XSBGaXggbWVtb3J5IGFsbG9jYXRpb24gcHJvYmxlbSBpbiB0eXBlbWFwIChidWcgMTAzNzI1OSkKCgkgICAgLSBbdGNsXSBGaXggKGVudW1zfGNvbnN0YW50cykgKyBuYW1lc3BhY2Ugb3B0aW9uIAoJICAgICAgICAgICAgKHJlcG9ydGVkIGJ5IGphc29uLm0uc3VycHJpc2VAaW50ZWwuY29tKS4KCiAgICAgICAgICAgIC0gW3BlcmxdIEFkZCBwYXRjaCA5NjIxNjggZm9yIG11bHRpcGxlIGluaGVyZXRhbmNlCgkgICAgCgkgICAgLSBGaXggJ2RlZmluZWQnIGFzIHZhcmlhYmxlIG5hbWUuCgoxMC8yOS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBTZWcgZmF1bHQgZml4IGZvciBnbG9iYWwgc2NvcGUgb3BlcmF0b3IgdXNlZCBmb3IgZnJpZW5kIG1ldGhvZHM6CgogICAgICAgICAgICAgIGNsYXNzIEIgewogICAgICAgICAgICAgICAgZnJpZW5kIHZvaWQgOjpnbG9iYWxzY29wZSgpOwogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKCjEwLzI4LzIwMDQ6bW1hdHVzCgkgICAgLSBBZGRlZCBtb2R1bGUgYW5kIHN3aWcgb3B0aW9uICJ0ZW1wbGF0ZXJlZHVjZSIgdG8gZm9yY2Ugc3dpZwoJICAgICAgdG8gcmVkdWNlIGFueSB0eXBlIG5lZWRlZCB3aXRoIHRlbXBsYXRlcywgaWUsIGluIHRoZXNlIGNhc2VzCgogICAgICAgICAgICAgICAgJW1vZHVsZSgidGVtcGxhdGVyZWR1Y2UiKSB0ZXN0CgogICAgICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBBIHsgfTsKCiAgICAgICAgICAgICAgICB0eXBlZGVmIGludCBJbnQ7CgkgICAgICAgICV0ZW1wbGF0ZShBX0ludCkgQTxJbnQ+ICA9PT4gICV0ZW1wbGF0ZShBX0ludCkgQTxpbnQ+CgogICAgICAgICAgICAgICAgdHlwZWRlZiBCKiBCcDsKCSAgICAgICAgJXRlbXBsYXRlKEFfQnApIEE8QnA+ICA9PT4gICV0ZW1wbGF0ZShBX0JwKSBBPEIqPgoKICAgICAgICAgICAgICBzd2lnIHJlZHVjZXMgdGhlIHR5cGVzIEludCBhbmQgQnAgdG8gdGhlaXIgcHJpbWl0aXZlcwogICAgICAgICAgICAgIGludCBhbmQgQiouIFRoaXMgaXMgY2xvc2VyIHRvIHRoZSB1c3VhbCBjb21waWxlcgogICAgICAgICAgICAgIHJlc29sdXRpb24gbWVjaGFuaXNtLCBhbmQgaXQgaXMgcmVhbGx5IG5lZWRlZCBzb21ldGltZXMKICAgICAgICAgICAgICB3aGVuIHlvdSBtaXggdGVtcGxhdGVzICsgdHlwZWRlZnMgKyBzcGVjaWFsaXphdGlvbnMuCgoJICAgICAgRG9uJ3QgdXNlIGl0IGlmIHlvdSBkb24ndCBoYXZlIGFueSBwcm9ibGVtIGFscmVhZHksCgkgICAgICBzaW5jZSB0aGUgdHlwZSByZWR1Y3Rpb24gY2FuIGludGVyZmVyZSB3aXRoIHNvbWUKCSAgICAgIHVzZXIgdHlwZW1hcHMsIHNwZWNpYWxseSBpZiB5b3UgZGVmaW5lZCBzb21ldGhpbmcgbGlrZQoKCQkgICB0eXBlZGVmIGludCBJbnQ7CgkJICAgJXR5cGVtYXAoaW4pIEludCAuLi47CgogICAgICAgICAgICAgIGluIHRoaXMgY2FzZSwgd2hlbiB5b3UgdXNlIHRoZSAidGVtcGxhdGVyZWR1Y2UiIG9wdGlvbiwKCSAgICAgIHN3aWcgd2lsbCBpZ25vcmUgdGhlIHVzZXIgdHlwZW1hcCwgc2luY2UgdGhlICJ0eXBlZGVmIGludCBJbnQiCgkgICAgICB3aWxsIHRha2UgcHJlY2VkZW5jZSwgYW5kIHRoZSB1c3VhbCAiaW50IiB0eXBlbWFwIHdpbGwgYmUKCSAgICAgIGFwcGxpZWQuIAoKCSAgICAgIE5vdGUgdGhhdCB0aGUgcHJldmlvdXMgY2FzZSBpcyBub3QgY29tbW9uLCBhbmQgc2hvdWxkIGJlCgkgICAgICBhdm9pZGVkLCBpZSwgaXMgbm90IHJlY29tbWVuZGVkIHRvIHVzZSBhIHR5cGVkZWYgYW5kIGEKCSAgICAgIHR5cGVtYXAgYXQgdGhlIHNhbWUgdGltZSwgc3BlY2lhbGx5IGlmIHlvdSBhcmUgZ29pbmcgdG8KCSAgICAgIHVzZSB0ZW1wbGF0ZXMgKyBzcGVjaWFsaXphdGlvbnMuCgoJICAgIC0gRGlyZWN0b3JzOgoKCSAgICAgICAgdmlydHVhbCBkZXN0cnVjdG9yIGlzIGFsd2F5cyBlbWl0dGVkIG5vdywgdGhpcyBkb2Vzbid0CgkgICAgICAgIGNhdXNlIGFueSBoYXJtLCBhbmQgY291bGQgc29sdmUgc29tZSBuYXN0eSBhbmQKCSAgICAgICAgbXlzdGVyaW91cyBlcnJvcnMsIGxpa2UgdGhlIG9uZSBtZW50aW9uZWQgYnkgU2NvdHQuCgoJCWFsc28gdGhlIGRlc3RydWN0b3IgaXMgbm90IGluLWxpbmVkLCBzbywgdGhhdCBjYW4gc29sdmUKCQlzb21lIG90aGVyIG15c3RlcmlvdXMgZXJyb3JzIHdoZW4gbWl4aW5nIGRpcmVjdG9ycyArCgkJaW1wb3J0cyArIGVtYmVkZGVkIGFwcGxpY2F0aW9ucyArIHNvbWUgc3BlY2lmaWMgY29tcGlsZXJzLgoJCQoxMC8yNy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIHR5cGVtYXBzLmkgbGlicmFyeSBmaWxlIHdpdGggSU5QVVQsIE9VVFBVVCBhbmQgSU5PVVQgdHlwZW1hcHMgYWRkZWQuCgoxMC8yNy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gc3RkOjp3c3RyaW5nIHR5cGVtYXAgZml4ZXMgaW4gc3RkX3N0cmluZy5pIGZyb20gUnVzc2VsbCBLZWl0aC1NYWdlZS4KCjEwLzI1LzIwMDQ6IG1tYXR1cyAKCgkgICAgLSBVc2luZyArIG5hbWVzcGFjZSBpcyB3b3JraW5nIG5vdyAodXNpbmdfbmFtZXNwYWNlLmkpLgoKCSAgICAtIERlcml2ZWQgKyBuZXN0ZWQgY2xhc3NlcyBpcyB3b3JraW5nIG5vdwoJICAgICAgKGRlcml2ZXJfbmVzdGVkLmkpLCBidXQgb2YgY291cnNlLCB3ZSBhcmUgc3RpbGwgd2FpdGluZwoJICAgICAgZm9yIHRoZSBuZXN0ZWQgY2xhc3Mgc3VwcG9ydC4KCSAgICAKCSAgICAtIERpcmVjdG9yczoKCSAgICAgIC0gdW5uYW1lZCBwYXJhbWV0ZXJzIHN1cHBvcnQsCgoJICAgICAgLSBwcm90ZWN0ZWQgY29uc3RydWN0b3Igc3VwcG9ydCAoYXV0b21hdGljIGFuZCB3aXRoCiAgICAgICAgICAgICAgICBkaXJwcm90IG1vZGUpLAoKCSAgICAgIC0gZGV0ZWN0aW9uIG9mIHJlYWxseSBuZWVkZWQgcHJvdGVjdGVkIGRlY2xhcmF0aW9ucwogICAgICAgICAgICAgICAgKG1lbWJlcnMgYW5kIGNvbnN0cnVjdG9ycykgbm93IGlzIGRvbmUgYXV0b21hdGljYWxseS4KICAgICAgICAgICAgICAgIEV2ZW4gaWYgeW91IGRvbid0IHVzZSB0aGUgJ2RpcnByb3QnIG1vZGUsIHN3aWcgd2lsbAogICAgICAgICAgICAgICAgd3JhcCB3aGF0IGlzIG1pbmltYWxseSBuZWVkZWQgKGFuZCBwcm90ZWN0ZWQpIGZvciB0aGUKICAgICAgICAgICAgICAgIGNvZGUgdG8gY29tcGlsZS4KCQkKCQl3aGF0IGlzIHB1YmxpYywgYXMgdXN1YWwsIGlzIGFsd2F5cyB3cmFwcGVkLCBhbmQgaWYKCQl5b3UgdXNlIHRoZSAnZGlycG9ydCcKCQkKCgkgICAgLSBGaW5hbCBmaXhlcyBmb3IgdGhlIE9TUyB0byBjb21waWxlIHdpdGggU1dJRyAxLjMuMjMgKG15CgkgICAgICB2ZXJ5IHZlcnkgdWdseSBDKysgKyB0ZW1wbGF0ZXMgKyBldmVyeXRoaW5nIG1vdW50ZXJzIHdyYXApLgoKMTAvMjUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBOZXcgY29tbWFuZGxpbmUgb3B0aW9uIC1kbGxpbXBvcnQuIFRoaXMgZW5hYmxlcyBvbmUgdG8gc3BlY2lmeQogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgRExMIGZvciB0aGUgRGxsSW1wb3J0IGF0dHJpYnV0ZS4gTm9ybWFsbHkgdGhpcyBuYW1lCiAgICAgICAgICAgIGNvbWVzIGZyb20gdGhlIG1vZHVsZSBuYW1lLCBzbyBub3cgaXQgaXMgcG9zc2libGUgdG8gb3ZlcnJpZGUgdGhpczoKCiAgICAgICAgICAgICAgc3dpZyAtY3NoYXJwIC1kbGxpbXBvcnQgeHl6IGV4YW1wbGUuaQoKICAgICAgICAgICAgd2lsbCBnZW5lcmF0ZSBmb3IgYWxsIHRoZSB3cmFwcGVkIFBJbnZva2UgbWV0aG9kczoKCiAgICAgICAgICAgICAgW0RsbEltcG9ydCgieHl6IiwgRW50cnlQb2ludD0iLi4uIildCiAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBleHRlcm4gLi4uCgogICAgICAgICAgICBUaGUgd3JhcHBlcnMgZnJvbSBtYW55IGRpZmZlcmVudCBTV0lHIGludm9jYXRpb25zIGNhbiB0aHVzIGJlIGNvbXBpbGVkCiAgICAgICAgICAgIGludG8gb25lIERMTC4KCiAgICAgICAgICAgIEEgbmV3IHNwZWNpYWwgdmFyaWFibGUgJGRsbGltcG9ydCBjYW4gYWxzbyBiZSB1c2VkIGluIHR5cGVtYXBzLCBwcmFnbWFzLAogICAgICAgICAgICBmZWF0dXJlcyBldGMuIFRoaXMgd2lsbCBnZXQgdHJhbnNsYXRlZCBpbnRvIHRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkgLWRsbGltcG9ydAogICAgICAgICAgICBpZiBzcGVjaWZpZWQsIG90aGVyd2lzZSB0aGUgbW9kdWxlIG5hbWUuCgoxMC8yMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUGF0Y2ggIzEwNDk0OTYgZnJvbSBTY290dCBNaWNoZWwgZml4ZXMgZGlyZWN0b3JzIG1ldGhvZHMgd2l0aCAKICAgICAgICAgICAgZW51bXMgd2hlbiB3cmFwcGVkIHdpdGggdHlwZXNhZmUgb3IgcHJvcGVyIEphdmEgZW51bXMuCgoxMC8yMS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlcyBmb3IgZGVmYXVsdCBhcmd1bWVudHMgaW4gZGlyZWN0b3IgY29uc3RydWN0b3JzIChQeXRob24sIFJ1YnksIE9jYW1sKS4KCjEwLzIxLzIwMDQ6IG1tYXR1cwoJICAgIC0gW1B5dGhvbl0gQWRkIHRoZSAnLWNwbHVzY2FzdCcgb3B0aW9uIHRvIGVuYWJsZSB0aGUgJ25ldycKCSAgICAgIEMrKyBjYXN0aW5nIG9wZXJhdG9ycywgc3VjaCBhcyAnc3RhdGljX2Nhc3QnLCBpbnNpZGUgdGhlCgkgICAgICB0eXBlbWFwcy4gQnkgZGVmYXVsdCBzd2lnIHVzZSB0aGUgb2xkIEMgY2FzdCBzdHlsZSwgZXZlbgoJICAgICAgd2hlbiBwYXJzaW5nIEMrKy4KCSAgICAgIAoJICAgIC0gW1B5dGhvbl0gQWRkIHRoZSAnLW5ld192d20nIG9wdGlvbiB0byBlbmFibGUgdGhlIG5ldwogICAgICAgICAgICAgIFN3aWdWYWx1ZVdyYXBwZXIgbW9kZS4gTm93IHRoaXMgaXMgbWFpbmx5IGZvciB0ZXN0aW5nCiAgICAgICAgICAgICAgdGhhdCB0aGUgdHlwZW1hcHMgYXJlIHJlYWxseSBzYWZlIGZvciBhbnkgZnV0dXJlCiAgICAgICAgICAgICAgc29sdXRpb24sIGJ1dCB5b3UgY2FuIHVzZSBpdCBpZiB5b3UgaGF2ZSBhIHZlcnkgc3RyYW5nZQogICAgICAgICAgICAgIGVycm9yIHdpdGggZGVmYXVsdCBjb3NudHJ1Y3RvcnMgbWlzc2luZyArICVhcHBseSArCiAgICAgICAgICAgICAgJXR5cGVtYXAsIGFuZCBpZiBldmVyeXRoaW5nIGVsc2UgZmFpbHMgKHNlZQogICAgICAgICAgICAgIHZhbHV3cmFwcGVyX29wYXF1ZS5pIGZvciBhbHRlcm5hdGl2ZSBhbmQgY3VycmVudAogICAgICAgICAgICAgIHNvbHV0aW9ucykuIElmIHlvdSBhcmUgYSB1c2VyIHRoYXQgZG9uJ3Qga25vdyB3aGF0IGlzCiAgICAgICAgICAgICAgU3dpZ1ZhbHVlV3JhcHBlciwgZG9uJ3QgZXZlbiB0cnkgaXQuCgoJICAgIC0gW1B5dGhvbl0gQWRkIHRoZSAnLW5vaCcgb3B0aW9uIHRvIGJlIHVzZWQgd2l0aCBkaXJlY3RvcnMKCSAgICAgIGFuZCB3aGVuIHlvdSBwcmVmZXIgdG8gZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUKCSAgICAgIGRpcmVjdG9yIGhlYWRlciBmaWxlLiBJZiBub3QgdXNlZCwgc3dpZyB3aWxsIHdvcmsgYXMKCSAgICAgIHVzdWFsIGdlbmVyYXRpbmcgYm90aCB0aGUgd3JhcC5jeHggYW5kIHdyYXAuaCBmaWxlcy4gSWYKCSAgICAgIHlvdSB1c2UgaXQsIHN3aWcgd2lsbCBvbmx5IGdlbmVyYXRlIHdyYXAuY3h4LgoKMTAvMjEvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIC0gSWYgeW91IGRlZmluZSBTV0lHX1RZUEVfVEFCTEUgd2hlbiBjb21waWxpbmcgYSB3cmFwcGVyIGZpbGUsCgkgICAgICB0aGUgcnVudGltZSB0eXBlcyB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgZ2l2ZW4gdHlwZSB0YWJsZSBuYW1lLgoJICAgICAgVXNpbmcgdGhpcywgeW91IGNhbiBzZXBlcmF0ZSBkaWZmZXJlbnQgbW9kdWxlcyB0byBzaGFyZSB0aGVpcgoJICAgICAgb3duIHR5cGUgc3lzdGVtcy4gIC1EU1dJR19UWVBFX1RBQkxFPU15dGFibGUKCgkgICAgLSBbUHl0aG9uXSBJZiB5b3UgZGVmaW5lIFNXSUdfU1RBVElDX1JVTlRJTUUgdGhlbiB0aGUgdHlwZSBpbmZvcm1hdGlvbgoJICAgICAgd2lsbCBiZSBzdGF0aWMgdG8gdGhpcyB3cmFwcGVyLiAgTm90aGluZyB3aWxsIGJlIHNoYXJlZCB3aXRoIGFueQoJICAgICAgb3RoZXIgbW9kdWxlcwoKCSAgICAtIFtQeXRob25dIElmIHlvdSBkZWZpbmUgU1dJR19MSU5LX1JVTlRJTUUsIHRoZW4gaW5zdGVhZCBvZiB1c2luZwoJICAgICAgdGhlIG5ldyB3YXkgb2Ygc2hhcmluZyB0eXBlIGluZm9ybWF0aW9uLCB0aGUgd3JhcHBlciB3aWxsIGV4cGVjdAoJICAgICAgdG8gYmUgbGlua2VkIGFnYWluc3QgdGhlIExpYi9saW5rcnVudGltZS5jIGZpbGUuICBBbnkgbW9kdWxlcyBjb21waWxlZAoJICAgICAgd2l0aCBTV0lHX0xJTktfUlVOVElNRSBhbmQgbGlua2VkIGFnYWluc3QgbGlua3J1bnRpbWUuYyB3aWxsIGFsbAoJICAgICAgc2hhcmUgdHlwZSBpbmZvcm1hdGlvbi4KCjEwLzIwLzIwMDQ6IG1tYXR1cwoJICAgIC0gW1B5dGhvbl0gSW5pdGlhbCBmaXggZm9yIHB5dGhvbi9pbXBvcnQgZXhhbXBsZS4gUGxlYXNlCgkgICAgICB1cGRhdGUgdGhlIE1ha2VmaWxlIChhdXRvY29uZiwgY29uZmlndXJlLCBldGMsIGV4cGVydCksCgkgICAgICBzaW5jZSBub3cgcHJvYmFibHkgaXMgb25seSB3b3JraW5nIHdpdGggZysrLCBpY2MgYW5kIGEKCSAgICAgIGZldyBvdGhlciBjb21waWxlcnMgdGhhdCBoYXZlIHRoZSAtc2hhcmVkIG9wdGlvbi4KCgkgICAgICBXZSBuZWVkIHRvIGNyZWF0ZSBhZGRpdGlvbmFsIHNoYXJlZCBsaWJyYXJpZXMgZm9yIHRoZQoJICAgICAgdmlydHVhbCBkZXN0cnVjdG9ycy4gT2xkIGFuZCB1c3VhbGx5IGZvcmdvdHRlbiBDKysKCSAgICAgIHJlcXVpcmVtZW50LgoJICAgICAgCgkgICAgICBTYW1lIGZpeCBuZWVkIHRvIGJlIHVzZWQgaW4gcGVybCwgSSB0aGluay4KCiAgICAgICAgICAgIC0gW1B5dGhvbl0gRml4IGdlbmVyYXRpb24gb2YgaGVhZGVyIGZpbGUgZm9yIGRpcmVjdG9ycywKICAgICAgICAgICAgICBub3cgZGlyZWN0b3JzLnN3ZyBpcyBhbHNvIGluY2x1ZGVkLCBzbywgaXQgY2FuIGJlIHJlYWxseQoJICAgICAgdXNlZCBmcm9tIEMrKywgYW5kIGl0IHNvbHZlcyBzb21lIHByb2JsZW0gd2l0aCBjb21waWxlcgoJICAgICAgdGhhdCByZXF1aXJlIHRoYXQsIGV2ZW4gd2l0aCB0aGUgc2ltcGxlIHN3aWcgaW5jbHVzaW9uLiAgCgogICAgICAgICAgICAtIFtQeXRob25dIFJlb3JkZXJpbmcgdGhlIG1ldGhvZHMgYW5kIG1vdmluZyBzb21lIGJvZGllcwogICAgICAgICAgICAgIG91dHNpZGUgdGhlIGNsYXNzIGRlY2xhcmF0aW9uLiBUaGlzIGlzIG5lZWRlZCBkdWUgdG8KICAgICAgICAgICAgICBzb21lIGdjYy0yLjk2IGludGVybmFsIGNvbXBpbGVyIGVycm9ycy4gSXQgc2VlbXMgdGhlCiAgICAgICAgICAgICAgUFlUSE9OIGNsYXNzIGlzIGdldHRpbmcgdG9vIGxhcmdlIHRvIGJlZW4gZGVjbGFyZWQgYW5kCiAgICAgICAgICAgICAgZGVmaW5lZCBhdCB0aGUgc2FtZSB0aW1lLgoKCSAgICAtIEFkZCB0aGUgLW9oIG9wdGlvbiB0byBjaGFuZ2UgdGhlIG91dHB1dCBoZWFkZXIgZmlsZSBuYW1lCiAgICAgICAgICAgICAgaWYgbmVlZGVkOgoKICAgICAgICAgICAgICAgICBzd2lnIC1jKysgLXB5dGhvbiB0ZXN0LmkgLW8gdGVzdC5DQyAtb2ggdGVzdC5ISAoJICAgICAgCiAgICAgICAgICAgICAgdGhpcyBpcyBtYWlubHkgbmVlZGVkIHdoZW4gdXNpbmcgZGlyZWN0b3JzLCBhbmQgaWYgdGhlCiAgICAgICAgICAgICAgY3VycmVudCBkZWZhdWx0IGhlYWRlciBmaWxlIG5hbWUgaXMgbm90IGdvb2QgZm9yIHlvdSwKICAgICAgICAgICAgICB3aGljaCBpcyBnZW5lcmF0ZWQgYXMgZm9sbG93OgkgICAgICAKCiAgICAgICAgICAgICAgICAgc3dpZyAtYysrIC1weXRob24gdGVzdC5pICAgICAgICAgICAgID0+IHRlc3Rfd3JhcC5oCiAgICAgICAgICAgICAgICAgc3dpZyAtYysrIC1weXRob24gdGVzdC5pIC1vIHRlc3QuQ0MgID0+IHRlc3QuaAoKCjEwLzIwLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIDEpIENvbXBhY3QgZGVmYXVsdCBhcmd1bWVudHMgZmVhdHVyZSBhZGRlZC4gVGhpcyBmZWF0dXJlIGFsbG93cyBvbmUKICAgICAgICAgICAgICB0byB1c2UgdGhlIGRlZmF1bHQgYXJndW1lbnQgY29kZSBnZW5lcmF0aW9uIHRoYXQgd2FzIHVzZWQgaW4KICAgICAgICAgICAgICBTV0lHLTEuMy4yMiBhbmQgZWFybGllciB2ZXJzaW9ucy4gSXQgcHJvZHVjZXMgbW9yZSBjb21wYWN0IHdyYXBwZXJzCiAgICAgICAgICAgICAgYXMgb25seSBvbmUgd3JhcHBlciBtZXRob2QgaXMgZ2VuZXJhdGVkIGZvciBhbnkgbWV0aG9kIHdpdGggZGVmYXVsdAogICAgICAgICAgICAgIGFyZ3VtZW50cy4gU28gdGhlIGFkdmFudGFnZSBpcyBpdCBnZW5lcmF0ZXMgbGVzcyBjb2RlIGJ1dCBoYXMgdGhlCiAgICAgICAgICAgICAgb3JpZ2luYWwgbGltaXRhdGlvbnMsIGxpa2UgaXQgaXQgZG9lcyBub3Qgd29yayB3aXRoIGFsbCBkZWZhdWx0IGFyZ3VtZW50cwogICAgICAgICAgICAgIGFuZCBkZWZhdWx0IGFyZ3VtZW50cyBjYW5ub3QgYmUgdGFrZW4gYWR2YW50YWdlIG9mIGluIHRoZSBzdHJvbmdseSB0eXBlZAogICAgICAgICAgICAgIGxhbmd1YWdlcyAoQyMgYW5kIEphdmEpLiBJdCBpcyBpbXBsZW1lbnRlZCB2aWEgdGhlIHVzdWFsICVmZWF0dXJlIG1lY2hhbmlzbToKCiAgICAgICAgICAgICAgICAlZmVhdHVyZSgiY29tcGFjdGRlZmF1bHRhcmdzIik7CgogICAgICAgICAgICAyKSBLZXl3b3JkIGFyZ3VtZW50cyAoa3dhcmdzKSBhcmUgd29ya2luZyBhZ2FpbiBmb3IgZGVmYXVsdCBhcmd1bWVudHMKICAgICAgICAgICAgICAgaW4gdGhlIGxhbmd1YWdlcyB0aGF0IHN1cHBvcnQgaXQsIGllLCBQeXRob24gYW5kIFJ1YnkuIFRoZSBuZXcgZGVmYXVsdAogICAgICAgICAgICAgICBhcmd1bWVudCB3cmFwcGluZyBhcHByb2FjaCB1c2luZyBvdmVybG9hZGVkIG1ldGhvZHMgY2Fubm90IHN1cHBvcnQga3dhcmdzCiAgICAgICAgICAgICAgIHNvIHRoZSBjb21wYWN0IGRlZmF1bHQgYXJndW1lbnQgZmVhdHVyZSBpcyBhdXRvbWF0aWNhbGx5IHR1cm5lZCBvbiB3aGVuCiAgICAgICAgICAgICAgIGt3YXJncyBhcmUgc3BlY2lmaWVkLCBieSAlZmVhdHVyZSgia3dhcmdzIikuCgogICAgICAgICAgICAzKSBDb21wYWN0IGRlZmF1bHQgYXJndW1lbnRzIGFyZSBhbHNvIGF1dG9tYXRpY2FsbHkgdHVybmVkIG9uIHdoZW4gd3JhcHBpbmcKICAgICAgICAgICAgICAgQyAobm90IEMrKykgY29kZS4gVGhpcyBpcyB0byBzdXBwb3J0IHRoZSBiaXphcnJlIG5vdGlvbiBvZiBkZWZhdWx0IGFyZ3VtZW50cwogICAgICAgICAgICAgICBmb3IgQyBjb2RlLgoKMTAvMjAvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgT3ZlcmxvYWRlZCB0ZW1wbGF0ZWQgZnVuY3Rpb25zIGluIG5hbWVzcGFjZXMgYWxzbyB3b3JraW5nIG5vdy4KICAgICAgICAgICAgVGVtcGxhdGVkIGZ1bmN0aW9ucyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIGluIG5hbWVzcGFjZXMgdG9vLgoKMTAvMTkvMjAwNDogbW1hdHVzCgoJICAgIC0gQWxsb3cgdG8gZGlzYWJsZSB0aGUgbmV3IFN3aWdWYWx1ZVdyYXBwZXIgbWVjaGFuaXNtLAoJICAgICAgaWYgeW91IGFkZCB0aGUgZm9sbG93aW5nIGxpbmUgaW4geW91ciBsYW5ndWFnZSBtYWluLgoKCQkgLyogVHVybiBvbiBzYWZlIHZhbHVlIHdyYXBwZXIgdXNlIG1vZGUgKi8KICAgICAgICAgICAgICAgICBTd2lnX3ZhbHVlX3dyYXBwZXJfbW9kZSgxKTsKCgkgICAgICAKCSAgICAgIE5vdyBpcyBvbmx5IGFjdGl2ZSBpbiBweXRob24uIEFsbCB0aGUgb3RoZXIgbGFuZ3VhZ2VzCgkgICAgICBhcmUgdXNpbmcgdGhlIG9sZCByZXNvbHV0aW9uLCBidXQgdGhleSAgY2FuIGFsc28gdXNlIHRoZQoJICAgICAgInZhbHVld3JhcHBlciIvIm5vdmFsdWV3cmFwcGVyIiBmZWF0dXJlcyB0byBmaXggc29tZQoJICAgICAgb2YgdGhlIG9sZCBicm9rZW4gY2FzZXMuIE5vdGUsIGhvd2V2ZXIsICB0aGF0IG5vdCBhbGwgCgkgICAgICB0aGUgYnJva2VuIGNhc2VzIGNhbiBiZSBzb2x2ZWQgaW4gdGhhdCB3YXkuCgoJICAgICAgVGhlIG5ldyBtZWNoYW5pc20gc2VlbXMgdG8gYmUgd29ya2luZyBmaW5lIGluIHBlcmwsIHJ1YnkKCSAgICAgIGFuZCB0Y2wsIGJ1dCBmYWlsaW5nIGluIHNvbWUgdHlwZW1hcHMgaW4gamF2YS4KCgkgICAgICBIZW5jZSwgaXMgdXB0byB0aGUgbGFuZ3VhZ2UgbWFpbnRhaW5lciB0byB0ZXN0IGl0LCBhbmQKCSAgICAgIGRlY2lkZSB0byBlbmFibGUgaXQgb3Igbm90LgoKCSAgICAgIExvb2sgYXQgdGhlIHZhbHVld3JhcHBlcl9vcGFxdWUuaSBmb3IgZXhhbXBsZXMuCgoJICAgIC0gRml4IG1vcmUgU3dpZ1ZhbHVlV3JhcHBlciBjYXNlcyB3aGVuIHRoZSBuZXcgbWVjaGFuaXNtCgkgICAgICBpcyBhY3RpdmUuIE5vdyBpdCBhbHNvIGNoZWNrIGZvciBsb2NhbCB0eXBlbWFwCgkgICAgICB2YXJpYWJsZXMsIHNlZSB2YWx1ZXdyYXBwZXJfb3BhcXVlLmkgZm9yIGFuIGV4YW1wbGUgd2hlbgoJICAgICAgdGhpcyBpcyBuZWVkZWQuIEJ1dCBhZ2FpbiwgdGhpcyBleHRyYSBjaGVja2luZyB3aWxsIG9ubHkKCSAgICAgIGJlIGFjdGl2YXRlZCB3aGVuIHVzaW5nIHRoZSBuZXcgdmFsdWUgd3JhcHBlciBtb2RlLgoKCSAgICAtIFtQeXRob25dIEZpeCB2YXJpYWJsZSB3cmFwcGluZyBvZiBjbGFzc2VzIHdpdGggcHJpdmF0ZQoJICAgICAgYXNzaWduIG9wZXJhdG9ycy4gSXQgc2hvdWxkIGJlIGVhc3kgdG8gZml4IGluIGFsbCB0aGUgCgkgICAgICBvdGhlciBtb2R1bGVzLCBpbnN0ZWFkIG9mIGNoZWNraW5nCgoJICAgICAgICAgaWYgKCFHZXRhdHRyKG4sImltbXV0YWJsZSIpKSAuLi4KCQoJICAgICAgeW91IG5lZWQgdG8gdmVyaWZ5CgoJICAgICAgICAgaWYgKGlzX2Fzc2lnbmFibGUobikpIC4uLgoKCSAgICAgIExvb2sgYXQgdGhlIHByaXZhdGVfYXNzaWduLmkgZm9yIGFuIGV4YW1wbGUuCgoxMC8xOC8yMDA0OiBtbWF0dXMKCSAgICAtICVmZWF0dXJlcyAiZGlyZWN0b3IiLyJub2RpcmVjdG9yIiBub3cgd29yayBhcyBleHBlY3RlZC4KICAgICAgICAgICAgLSBHZW5lcmFsIGZpeGVzIGluICVmZWF0dXJlIHRvIHJlc29sdmUgZnVuY3Rpb24gZGVjbAoJICAgICAgcHJvcGVybHksCgkgICAgICAKCSAgICAgICAgJWZlYXR1cmUoImhlbGxvIikgZm9vKCk7CgkgICAgICAgIGNoYXIgZm9vKCkgLT4gIGYoKSAgICAvLyB3YXMgd29ya2luZwoJICAgICAgICBjaGFyICpmb28oKSAtPiBmKCkucCAgLy8gaXQgd2Fzbid0CiAKCiAgICAgICAgICAgIC0gVGVtcGxhdGUgKyBzcGVjaWFsaXphdGlvbiArIGRlZmF1bHQgdGVtcGxhdGUgYXJncyBub3cgaXMKCSAgICAgIHdvcmtpbmcsIChkb24ndCBjb25mdXNlIHdpdGggdGVtcGxhdGUgKyBkZWZhdWx0IGFyZwoJICAgICAgdmFsdWVzLCB0aGF0IHdhcyBzb2x2ZWQgYmVmb3JlKSwgbm93IHRoaXMgdWdseSBjYXNlIGlzCgkgICAgICB3b3JraW5nOgoKCSAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEEgPSBBbGxvYzxUPiA+CgkJc3RydWN0IFZlY3RvcgoJCXsKCQkgICBWZWN0b3IoVCBhKXt9CgkJfTsJCSAgIAoKCQl0ZW1wbGF0ZSA8PgoJCXN0cnVjdCBWZWN0b3I8ZG91YmxlPgoJCXsKCQkgIFZlY3Rvcigpe30KCQkgIGludCBmb28oKSB7IHJldHVybiAwOyB9CiAgICAgICAgICAgICAgICB9OwoKCSAgICAgICAgJXRlbXBsYXRlKFZfYykgVmVjdG9yPGNoYXIsIEFsbG9jPGNoYXI+ID47CgkgICAgICAgICV0ZW1wbGF0ZShWX2kpIFZlY3RvcjxpbnQ+OyAgICAvLyBwaWNrcyBWZWN0b3I8aW50LEFsbG9jPGludD4gPgoJICAgICAgICAldGVtcGxhdGUoVl9kKSBWZWN0b3I8ZG91YmxlPjsgLy8gcGlja3MgdGhlIHNwZWNpYWxpemF0aW9uCgkgICAgICAKICAgICAgICAgICAgICB0aGlzIGlzIG5lZWRlZCBmb3IgYXV0b21hdGljIFNUTCBzdXBwb3J0IChsYXRlciB3aWxsCiAgICAgICAgICAgICAgYmUpLgoKCSAgICAtIEZpeCB0aGUgdGVtcGxhdGUgKyB0eXBlZGVmIGVycm9ycyBpbiB0ZXN0LXN1aXRlLCB3aGljaAogICAgICAgICAgICAgIHByb2JhYmx5IHdpbGwgZml4IGFub3RoZXIgZ3JvdXAgb2Ygc3RyYW5nZSB0ZW1wbGF0ZSArCiAgICAgICAgICAgICAgbmFtZXNwYWNlcyArIHR5cGVkZWZzIGVycm9ycy4KCgkgICAgLSAld2FybmZpbHRlciBpcyB3b3JraW5nIGJldHRlciBub3csIHBhcnNlci55IHRyaWVzIHRvIHVzZQoJICAgICAgdGhlbSB3aGVuIG5lZWRlZC4KCgkgICAgLSAqKioqIE5ldyBkZWZhdWx0IHR5cGUgcmVzb2x1dGlvbiBtZXRob2QgKHN0eXBlLmMpICoqKioqIAoKCSAgICAgIEl0IHByZXNlcnZlcyB0aGUgb3JpZ2luYWwgbWl4ZWQgdHlwZXMsIHRoZW4gaXQgZ29lcwoJICAgICAgJ2JhY2t3YXJkJyBmaXJzdCBkZWxldGluZyB0aGUgcXVhbGlmaWVyLCB0aGVuIHRoZSBpbm5lcgoJICAgICAgdHlwZXMsIGZvciBleGFtcGxlOgogICAgCQkgCQkJCQkJCSAgCiAgICAJCSB0eXBlZGVmIEEgKkFwdHI7CQkJCSAgCiAgICAJCSBjb25zdCBBcHRyJjsJCQkJCQkKICAgIAkJIHIucShjb25zdCkuQXB0ciAgICAgICAtPiByLnEoY29uc3QpLnAuU1dJR1RZUEUJCQogICAgCQkgci5xKGNvbnN0KS5wLlNXSUdUWVBFIC0+IHIucC5TV0lHVFlQRQkJCQogICAgCQkgci5wLlNXSUdUWVBFICAgICAgICAgIC0+IHIuU1dJR1RZUEUJCQkKICAgIAkJIHIuU1dJR1RZUEUgICAgICAgICAgICAtPiBTV0lHVFlQRQkJCQoJCSAJCQkJCQkJCiAgICAJCSBlbnVtIEhlbGxvIHt9OwkJCQkJCQogICAgCQkgY29uc3QgSGVsbG8mIGhpOwkJCQkJCiAgICAJCSByLnEoY29uc3QpLkhlbGxvICAgICAgICAgIC0+IHIucShjb25zdCkuZW51bSBTV0lHVFlQRQkKICAgIAkJIHIucShjb25zdCkuZW51bSBTV0lHVFlQRSAgLT4gci5lbnVtIFNXSUdUWVBFCQkKICAgIAkJIHIuZW51bSBTV0lHVFlQRSAgICAgICAgICAgLT4gci5TV0lHVFlQRQkJCiAgICAJCSByLlNXSUdUWVBFICAgICAgICAgICAgICAgIC0+IFNXSUdUWVBFCQkJCgkJIAkJCQkJCQkKICAgIAkJIGludCBhWzJdWzRdOwkJCQkJCQogICAgCQkgYSgyKS5hKDQpLmludCAgICAgICAgICAgLT4gYShBTlkpLmEoQU5ZKS5TV0lHVFlQRQkKICAgIAkJIGEoQU5ZKS5hKEFOWSkuU1dJR1RZUEUgIC0+IGEoQU5ZKS5hKCkuU1dJR1RZUEUJCQogICAgCQkgYShBTlkpLmEoKS5TV0lHVFlQRSAgICAgLT4gYShBTlkpLnAuU1dJR1RZUEUJCQogICAgCQkgYShBTlkpLnAuU1dJR1RZUEUgICAgICAgLT4gYShBTlkpLlNXSUdUWVBFCQkKICAgIAkJIGEoQU5ZKS5TV0lHVFlQRSAgICAgICAgIC0+IGEoKS5TV0lHVFlQRQkJCiAgICAJCSBhKCkuU1dJR1RZUEUgICAgICAgICAgICAtPiBwLlNXSUdUWVBFCQkJCiAgICAJCSBwLlNXSUdUWVBFICAgICAgICAgICAgICAtPiBTV0lHVFlQRSAgICAgICAgICAgICAgICAgICAgCgoJICAgICAgYmVmb3JlIGl0IGFsd2F5cyBzdG9wcyBhZnRlciBmaW5kaW5nIHJlZi9wb2ludGVyL2VudW0vYXJyYXkvZXRjLgoJICAgICAgIAoJICAgICAgTm93LCB0aGVuLCB5b3UgY2FuIGRlZmluZSAodXNlIGFuZCBhcHBseSkgJ2hpZ2hlcicgdHlwZW1hcHMgc3VjaCBhczoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgU1dJR1RZUEUqIGNvbnN0JiAgCgkgICAgICAgICV0eXBlbWFwKG91dCkgY2hhciBGSVhTSVpFW0FOWV0KICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRSogY29uc3QmICAKCSAgICAgICAgJXR5cGVtYXAoaW4pIGNvbnN0IGVudW0gU1dJR1RZUEUmCgkgICAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRVtBTlldW0FOWV0KCSAgICAgICAgJXR5cGVtYXAoaW4pIGNvbnN0IGNoYXIgKCYpW0FOWV0KCSAgICAgICAKCSAgICAgIEl0IGlzIHBvc3NpYmxlIHdpdGggdGhpcyBjaGFuZ2UgdGhhdCBwcmV2aW91cyB0eXBlbWFwcwoJICAgICAgdGhhdCB3ZXJlIGRlZmluZWQgKGJ1dCBpZ25vcmVkKSwgbm93IHdpbGwgc3RhcnQgdG8gd29yay4KCgkgICAgICBBbHNvLCBpdCBpcyBuZWNlc3NhcnkgY2hlY2sgZm9yIHRoZSAnJXR5cGVtYXAodmFyaW4pIFNXSUdUWVBFW10nLAoJICAgICAgYmVmb3JlIGl0IHdhcyB1c3VhbGx5IG5vdCBkZWZpbmVkIChidXQgY2hhcltdIHdhcyksCgkgICAgICBhbmQgdGhhdCBjYW4gcHJvZHVjZSBzb21lIGluY29uc2lzdGVuY2llcy4KCiAgICAgICAgICAgICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCgkgICAgICBUaGlzIGNoYW5nZSB3YXMgbmVlZGVkIGZvciBTVEwsIHNpbmNlIHN0ZDo6dmVjdG9yPGVudW0gSGVsbG8+IAoJICAgICAgc3RkOjp2ZWN0b3I8QSo+LCBldGMsIHdpbGwgYWx3YXlzIGdlbmVyYXRlIG1ldGhvZHMgdGhhdAoJICAgICAgbWl4IGNvbnN0IHJlZmVyZW5jZXMgd2l0aCB0aGUgdmVjdG9yIHR5cGUuCgoJICAgICAgTm93IHRoYXQgaXMgd29ya2luZywgYWxsIHRoZSBzdGQ6OmNvbnRhaW5lcjxUKj4KCSAgICAgIHNwZWNpYWxpemF0aW9uIHdpbGwgbm90IGJlIG5lZWRlZCBhbnltb3JlLCB3ZWxsLCBpbgoJICAgICAgdGhlb3J5LiAKCgkgICAgICBJbiB0aGUgcHJhY3RpY2UsIGV2ZXJ5dGhpbiBpcyB3b3JraW5nIGFzIGJlZm9yZSB1bnRpbAoJICAgICAgdGhlIHByb3BlciBtaXhlZCB0eXBlcyBhcmUgZGVmaW5lZCBhbmQgdGhlIGxpYnJhcmllcwoJICAgICAgc2ltcGxpZmllZCB0byB1c2UgdGhlbS4KCgkgICAgLSBDaGFuZ2UgdGhlIGJlaGF2aW9yIG9mIGV4dGVybiAiamF2YSIvImZvcnRyYW4iLyJldGMiLCAKCSAgICAgIG5vdyBzd2lnIHByb2R1Y2VzIGEgd2FybmluZywgYW5kIHVzZSBleHRlcm4gIkMiIGluc3RlYWQuCgkgICAgICBUaGUgd2FybmluZyBjYW4gYWxzbyBiZSBkaXNhYmxlIHdpdGggdGhlICItdyAzMTMiIGZsYWcuCgkgICAgICAoV0FSTl9QQVJTRV9VTkRFRklORURfRVhURVJOKS4KCgkgICAgLSBTd2lnVmFsdWVXcmFwcGVyIGlzIG5vdyBtb3JlIHNlbGVjdGl2ZSAobGFuZy5jeHgpLgoKICAgICAgICAgICAgW1BlcmwvVGNsXQoJICAgIC0gRml4IHNvbWUgdHlwZW1hcHMgKHBlcmwvdGNsKSB0byB3b3JrIHByb3Blcmx5IHdpdGgKCSAgICAgIFN3aWdWYWx1ZVdyYXBwZXIuIFRoaXMgd2FzIG5vdCBhIHByb2JsZW0gd2l0aAoJICAgICAgU3dpZ1ZhbHVlV3JhcHBlciwgYnV0IHdpdGggdGhlIHR5cGVtYXBzIHRoYXQgbm93IGFyZQoJICAgICAgc2FmZSB0byB1c2Ugd2l0aCAlYXBwbHkuCgoJICAgIFtQeXRob25dCgogICAgICAgICAgICAtIEZpeCAlY2FsbGJhY2svJXB5dGhvbmNhbGxiYWNrIHdvcmsgbm93IGFzIGJlZm9yZSBhZnRlcgoJICAgICAgdGhlIGRlZiBhcmdzIGNoYW5nZXMuIEFsc28sICVjYWxsYmFjayBub3cgaXMgYW4gYWxpYXMKCSAgICAgIGZvciAlcHl0aG9uY2FsbGJhY2ssIHNvLCB0aGV5IGRvIHRoZSBzYW1lLgoKCSAgICBbUHl0aG9uL1J1YnldCgkgICAgLSAlY2FsbGJhY2sgaXMgbW9yZSB1c2FibGUgYW5kIHVuaWZvcm06CgogICAgICAgICAgICAgICAgICVjYWxsYmFjaygiJXNfY2IiKSBmb28oKTsgIC8vIGZvciBib3RoLCBweXRob24vcnVieQogICAgICAgICAgICAgICAgICVjYWxsYmFjaygiJXNfY2IiKTsgICAgICAgIC8vIGZvciBib3RoLCBweXRob24vcnVieQogICAgICAgICAgICAgICAgICVjYWxsYmFjaygxKSBmb28oKTsgICAgICAgIC8vIG9ubHkgaW4gcHl0aG9uLgoKMTAvMTcvMjAwNDogYXJ0eQoJICAgIFtPQ0FNTF0KCSAgICAtIFR3ZWFrIHRvIGVudW0gdHlwaW5nIGZvciBzb3VuZG5lc3MgaW4gdGhlIHByZXNlbmNlIG9mIG11bHRpcGxlCgkgICAgICBtb2R1bGVzLgoJICAgIC0gZ2xvYmFsIGZ1bmN0aW9ucyBhcmUgbm93IHVuYW1iaWd1b3VzIGluIG11bHRpcGxlIGxvYWRlZCBtb2R1bGVzLgoJICAgIC0gRml4ZWQgdGVzdCBjYXNlIGNvZGUgdG8gYnVpbGQgbXVsdGltb2R1bGUgdGVzdCBjYXNlcyBjb3JyZWN0bHkuCgkgICAgLSBUaGVyZSBpcyBubyB3YXkgdG8gc2hhcmUgb3ZlcmxvYWQgcmVzb2x1dGlvbiBhY3Jvc3MgbW9kdWxlcwoJICAgICAgYmVjYXVzZSBvZiBzb3VuZG5lc3MgaXNzdWVzLiAgSWYgdGhlIHVzZXIgd2FudHMgdG8gY2FsbCBzb21lCgkgICAgICBmdW5jdGlvbiBmb28gZnJvbSBhbiBhcmJpdHJhcnkgbW9kdWxlIGJhciwgdGhleSB3aWxsIGhhdmUgdG8KCSAgICAgIHVzZSBCYXIuX2ZvbyB0byBjYWxsIGl0IGNvcnJlY3RseS4gIExhdGVyIEkgd2lsbCBmaXggdGhlIAoJICAgICAgY2FtbHA0IG1vZHVsZSB0byBkbyBzb21ldGhpbmcgY2xldmVyIGluIHRoaXMgY2FzZS4gIAogICAgICAgICAgICAtIFByb21pZGVkIHBlcmZvcm1hbmNlIG92ZXJoYXVsIG9mIGNsYXNzIG1lY2hhbmlzbS4KCSAgICAtIFJlbW92ZWQgc3ltYm9sIGhhY2sgZm9yIG9jYW1sLTMuMDcgYW5kIGJlbG93IHdoaWNoIGlzIG5vdCBuZWVkZWQKCSAgICAgIGZvciBvY2FtbC0zLjA4IGFuZCBhYm92ZS4KCjEwLzE2LzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBbQ0hJQ0tFTl0KCSAgICAtIENvbXBsZXRseSBjaGFuZ2UgaG93IGNoaWNrZW4uY3h4IGhhbmRsZXMgQ0xPUyBhbmQgZ2VuZXJpYyBjb2RlLgoJICAgICAgY2hpY2tlbiBubyBsb25nZXIgZXhwb3J0cyAtY2xvcy5zY20gYW5kIC1nZW5lcmljLnNjbS4gIFRoZSBjbG9zCgkgICAgICBjb2RlIGlzIGV4cG9ydGVkIGRpcmVjdGx5IGludG8gdGhlIG1vZHVsZS5zY20gZmlsZSBpZiAtcHJveHkgaXMgcGFzc2VkLgoJICAgIC0gVGhlIGNvZGUgbm93IGFsd2F5cyBleHBvcnRzIGEgdW5pdC4gIFJ1bm5pbmcgdGhlIHRlc3Qtc3VpdGUgaXMgbm93CgkgICAgICBtYWpvcmx5IGJyb2tlbiwgYW5kIG5lZWRzIHRvIGJlIGZpeGVkLgoJICAgIC0gQ0xPUyBub3cgZ2VuZXJhdGVzIHZpcnR1YWwgc2xvdHMgZm9yIG1lbWJlciB2YXJpYWJsZXMgc2ltaWxhciB0byBob3cKCSAgICAgIEdPT1BTIHN1cHBvcnQgd29ya3MgaW4gdGhlIGd1aWxlIG1vZHVsZS4KCSAgICAtIGNoaWNrZW4gbm8gbG9uZ2VyIHByZWZpeGVzIHN5bWJvbHMgYnkgdGhlIG1vZHVsZSBuYW1lLCBhbmQgbm8gbG9uZ2VyCgkgICAgICBmb3JjZXMgYWxsIG5hbWVzIHRvIGxvd2VyIGNhc2UuICBJdCBub3cgaGFzIC11c2VjbGFzc3ByZWZpeCBhbmQgLWNsb3NwcmVmaXgKCSAgICAgIHNpbWlsYXIgdG8gaG93IGd1aWxlIGhhbmRsZXMgR09PUFMgbmFtZXMuCgoxMC8xNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBUZW1wbGF0ZWQgZnVuY3Rpb25zIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgd29ya2luZyB3aXRoIG5ldyBkZWZhdWx0IGFyZ3VtZW50CiAgICAgICAgICAgIHdyYXBwaW5nIGFwcHJvYWNoLiBUaGUgbmV3IGFwcHJvYWNoIG5vIGxvbmdlciBmYWlscyB3aXRoIHRoZSBmb2xsb3dpbmcgZGVmYXVsdAogICAgICAgICAgICBhcmd1bWVudCBwYXR0ZXJuIChwcmV2aW91c2x5IGZhaWxlZCB3aXRoIHNvbWUgcHJpbWl0aXZlIHR5cGVzLCBsaWtlIAogICAgICAgICAgICB1bnNpZ25lZCBwcmltaXRpdmUgdHlwZXMpOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbnQgZm9vKGNvbnN0IFQmIHUgPSBUKCkpOwogICAgICAgICAgICAgICV0ZW1wbGF0ZShmb28pIGZvbzx1bnNpZ25lZCBpbnQ+OwoKICAgICAgICAgICAgVGhpcyByZWxpZXMgb24gdGhlIHRlbXBsYXRlZCBmdW5jdGlvbiBvdmVybG9hZGluZyBzdXBwb3J0IGp1c3QgYWRkZWQsIHNvIGFsbAogICAgICAgICAgICB0aGUgY29tYmluYXRpb25zIG9mIG92ZXJsb2FkaW5nIGJ5IHRlbXBsYXRlIHBhcmFtZXRlcnMgYW5kIG5vcm1hbCBwYXJhbWV0ZXJzCiAgICAgICAgICAgIGFzIHdlbGwgYXMgb3ZlcmxvYWRpbmcgd2l0aCBkZWZhdWx0IHBhcmFtZXRlcnMgd29ya3MuCgoxMC8xNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciB0aGUgbGFyZ2UgcmFuZ2Ugb2YgdGVtcGxhdGVkIGZ1bmN0aW9uIG92ZXJsb2FkaW5nIHRoYXQgQysrCiAgICAgICAgICAgIHN1cHBvcnRzLgoKICAgICAgICAgICAgLSBPdmVybG9hZGVkIHRlbXBsYXRlZCBmdW5jdGlvbnMsIGVnCgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGludCBvdmVybG9hZChUIHQpOwogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGludCBvdmVybG9hZChUIHQsIGNvbnN0IFQgJnIpOwoKICAgICAgICAgICAgLSBGaXhlcyB3aGVyZSB0aGUgdGVtcGxhdGVkIHR5cGUgaXMgbm90IHVzZWQgaW4gdGhlIHBhcmFtZXRlciBsaXN0LCBlZwoKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIHh5eigpOwogICAgICAgICAgICAgIHRlbXBsYXRlPD4gdm9pZCB4eXo8ZG91YmxlPigpOwoKICAgICAgICAgICAgLSBGaXhlcyBmb3Igb3ZlcmxvYWRpbmcgb2YgcGxhaW4gZnVuY3Rpb25zIGJ5IGEgdGVtcGxhdGVkIGZ1bmN0aW9uOgoKICAgICAgICAgICAgICB2b2lkIGFiYyhkb3VibGUgZCk7CiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBhYmMoVCB0KTsKCiAgICAgICAgICAgIC0gT3ZlcmxvYWRpbmcgYnkgdGVtcGxhdGVkIHBhcmFtZXRlcnMgZml4ZWQ6CgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgZm9vKFQgdCkge30KICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPiB2b2lkIGZvbyhUIHQsIFUgdSkge30KCiAgICAgICAgICAgICAgJXRlbXBsYXRlKGZvbykgZm9vPGRvdWJsZSwgZG91YmxlPjsKCiAgICAgICAgICAgIC0gQWxsIGNvbWJpbmF0aW9ucyBvZiB0aGUgYWJvdmUgYWxzbyB3b3JraW5nIGluY2x1ZGluZyBzcGVjaWFsaXphdGlvbnMsIGVnOgoKICAgICAgICAgICAgICB2b2lkIGFiYyhkb3VibGUgZCk7CiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBhYmMoVCB0KTsKICAgICAgICAgICAgICB0ZW1wbGF0ZTw+IHZvaWQgYWJjPGRvdWJsZT4oZG91YmxlIHQpOwogICAgICAgICAgICAgIHRlbXBsYXRlPD4gdm9pZCBhYmMoaW50IHQpOwoKMTAvMTYvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIC0gUmVtb3ZlIHRoZSBhYmlsaXR5IHRvIHNoYXJlIHR5cGUgaW5mb3JtYXRpb24gYnkgdXNpbmcgYyBsaW5raW5nLgogICAgICAgICAgICAgIEFsbCB0eXBlIHNoYXJpbmcgaGFwcGVucyB0aHJvdWdoIGEgZ2xvYmFsIHZhcmlhYmxlIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuCiAgICAgICAgICAgICAgICArIFJlbW92ZSBTV0lHX05PSU1QT1JULCBTV0lHX1JVTlRJTUUsIGFuZCByZWxhdGVkIGRlZmluZXMuCiAgICAgICAgICAgICAgICArIERlcHJlY2F0ZSAtcnVudGltZSwgLW5vcnVudGltZSBjb21tYW5kIGxpbmUgb3B0aW9ucwogICAgICAgICAgICAgICAgKyBVcGRhdGUgdGVzdC1zdWl0ZSBjb21tb24ubWsgdG8gY29ycmVjdGx5IGJ1aWxkIG11bHRpY3BwdGVzdAogICAgICAgICAgICAgICAgKyBSZW1vdmUgcmVmZXJlbmNlIHRvIHByZWNvbW1vbi5zd2cKICAgICAgICAgICAgICAgICsgVXBkYXRlIHRoZSBndWlsZV9naCBpbnRlcmZhY2UgdG8gc2hhcmUgZGF0YSBieSBhIGdsb2JhbCB2YXIgaW5zdGVhZAogICAgICAgICAgICAgICAgICBvZiBjIGxpbmthZ2UuCgogICAgICAgICAgICAtIFJlbW92ZSBBZHZhbmNlZC5odG1sLCBzaW5jZSBldmVyeXRoaW5nIGluIGl0IGlzIG5vdyBvYnNvbGV0ZQoKMTAvMDkvMjAwNDogbW1hdHVzCgkgICAgLSBTcGxpdCB0aGUgcHl0aG9uIHN0ZC9TVEwgQysrIGxpYnJhcnkgZmlsZXMsIG5vdwoJICAgICAgYWxsIHRoZSBsYW5ndWFnZSBpbmRlcGVuZGVudCBkZWZpbml0aW9ucyBhcmUgdW5kZXIKCSAgICAgIHRoZSBkaXJlY3RvcnkKCSAgICAgIAoJCUxpYi9zdGQKCgkgICAgICBhbmQgaGVuY2UsIGNhbiBiZSB1c2VkIGZyb20gb3RoZXIgbGFuZ3VhZ2VzLgoKCSAgICAtIEFkZCBtb3JlIGRvY3VtZW50YXRpb24gdG8gdGhlIFB5dGhvbiBTVEwsIGFuZAoJICAgICAgY2xlYW4gdW5uZWNlc3NhcnkgY29kZS4KCgkgICAgLSBBZGQgaW5pdGlhbCBDOTkgY29tcGxleCBzdXBwb3J0LCBhbmQgc29tZSBmaXhlcwoJICAgICAgZm9yIGxvbmcgZG91YmxlLgoKMTAvMDgvMjAwNDogbW1hdHVzCgkgICAgLSBGaXggdGhlIFN3aWdWYWx1ZVdyYXBwZXIgZm9yIG9wYXF1ZSB0eXBlcywgbm93IGl0IGlzIAoJICAgICAgYXBwbGllZCBmb3Igb3BhcXVlIHRlbXBsYXRlcyBhbmQgY2xhc3NlcywgZm9yIHdoaWNoIHdlCgkgICAgICBkb24ndCBrbm93IGlmIHRoZXJlIGlzIG9yIG5vdCBhIGRlZmF1bHQgY29uc3RydWN0b3IsIGllCgogICAgICAgICAgICAgICAgIHN0cnVjdCBBIHsgCiAgICAgICAgICAgICAgICAgICBBKGludCk7CiAgICAgICAgICAgICAgICAgfTsKIAogICAgICAgICAgICAgIFN0aWxsLCBpZiB5b3Uga25vdyB0aGF0IHlvdSBjbGFzcyBoYXMgYSBkZWZhdWx0CiAgICAgICAgICAgICAgY29uc3RydWN0b3IsIGFuZCBmb3Igc29tZSB2ZXJ5IHZlcnkgcGFydGljdWxhciByZWFzb24KICAgICAgICAgICAgICB5b3Ugd2FudCB0byBhdm9pZCB0aGUgU3dpZ1ZhbHVlV3JhcHBlciwgYW5kIHlvdSBkb24ndAogICAgICAgICAgICAgIHdhbnQgb3IgY2FuJ3QgZXhwb3NlIHRoZSBjbGFzcyB0byBzd2lnLCBub3cgeW91IGNhbgogICAgICAgICAgICAgIHNheQoKICAgICAgICAgICAgICAgICAlZmVhdHVyZSgibm92YWx1ZXdyYXBwZXIiKSBBOyAgICAKICAgICAgICAgICAgICAgICBjbGFzcyBBOwogICAgICAgICAgICAgICAKICAgICAgICAgICAgICBvciB0aGUgb3RoZXIgd2F5IGFyb3VuZCwgaWYgdGhlIGNsYXNzIGhhcyBhIGRlZmF1bHQKICAgICAgICAgICAgICBjb25zdHJ1Y3RvciwgYnV0IHlvdSB3YW50IHRvIHVzZSB0aGUgdmFsdWUgd3JhcHBlciwgeW91CiAgICAgICAgICAgICAgY2FuIHNheQoKICAgICAgICAgICAgICAgICAlZmVhdHVyZSgidmFsdWV3cmFwcGVyIikgQTsKICAgICAgICAgICAgICAgICBzdHJ1Y3QgQSB7IAogICAgICAgICAgICAgICAgICAgQSgpOwoJCSAgIC4uLi4KICAgICAgICAgICAgICAgICB9OyAgIAogICAgICAKCSAgICAtIEZpeCBmb3IgY2hhciA+IDEyOCwgaWUKCiAgICAgICAgICAgICAgICBjb25zdCBjaGFyIHRpbGRlX2EgPSAnXDM0MSc7CgogICAgICAgICAgICAtIEFkZCBwYXRjaCAxMDQxODU4IGZvciAkbGV4dHlwZSwgd2hpY2ggY2FycmllcyB0aGUgCiAgICAgICAgICAgICAgbGl0ZXJhbCB0eXBlIG9mIGEgc3ltYm9sLiBTZWUgbGV4dHlwZS5pIGluIHRoZQogICAgICAgICAgICAgIHRlc3Qtc3VpdGUgZm9yIG1vcmUgZGV0YWlscy4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAoKMTAvMDcvMjAwNDogd3NmdWx0b24KCSAgICB7UnVieSwgSmF2YV0gRml4IGRpcmVjdG9yICsgJ2VtcHR5JyB0aHJvd3MKCgkJICAgIHN0cnVjdCBBIHsKCQkgICAgICBBKCkgdGhyb3coKTsKCQkgICAgICB2aXJ0dWFsIH5BKCkgdGhyb3coKTsKCQkgICAgICBpbnQgZm9vKCkgdGhyb3coKTsKCQkgICAgfTsKCgoxMC8wNi8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW1RDTF0KICAgICAgICAgICAgLSBGaXggYnVnIHJlcG9ydGVkIGJ5IFdpbGxpYW0gQS4gSG9mZm1hbiBwcm9wYWdhdGluZyBjbGllbnRkYXRhCiAgICAgICAgICAgIGJldHdlZW4gbW9kdWxlcy4gIEFkZGVkIGNsaWVudGRhdGFfcHJvcC5tdWx0aWNwcHRlc3QgdG8gY2hlY2sgZm9yCiAgICAgICAgICAgIHRoaXMgYnVnLiAgVGhlIGZpeCBpbnZvbHZlZCB0aGUgZm9sbG93aW5nIGNoYW5nZXM6CiAgICAgICAgICAgICAgICArIFN3aWdUeXBlX2NsaWVudGRhdGFfY29sbGVjdCBkb2VzIG5vdCBuZWVkIHRvIGNoZWNrCiAgICAgICAgICAgICAgICB0eXBlcyBpbiByX3Jlc29sdmVkIGJlY2F1c2Ugd2Ugb25seSB3YW50IHRvIHByb3BhZ2F0ZSBjbGllbnRkYXRhCiAgICAgICAgICAgICAgICB0byB0eXBlZGVmZWQgY2xhc3NlcywgYW5kIHJfbWFuZ2xlZCBhbHJlYWR5IHRha2VzIGNhcmUgb2YgdHlwZWRlZnMuCgogICAgICAgICAgICAgICAgKyBTV0lHX1R5cGVSZWdpc3RlciBub3cgY29waWVzIHRoZSBjbGllbnRkYXRhIGZpZWxkIGNvcnJlY3RseQoKICAgICAgICAgICAgICAgICsgTW92ZSBTV0lHX0d1aWxlX1Byb3BhZ2F0ZUNsaWVudERhdGEgZnVuY3Rpb24gZnJvbSBndWlsZSBtb2R1bGUKICAgICAgICAgICAgICAgIGludG8gY29tbW9uLnN3ZywgYmVjYXVzZSB3ZSBuZWVkIHRvIGNhbGwgaXQgZnJvbSBib3RoIGd1aWxlIGFuZCB0Y2wuCgogICAgICAgICAgICAgICAgKyBBZGQgYmFzZV9uYW1lcyB0byBzd2lnX2NsYXNzIHRvIGRlbGF5IHRoZSBsb29rdXAgb2YgYmFzZXMuICBTV0lHCiAgICAgICAgICAgICAgICBub3cgZXhwb3J0cyB0aGUgYmFzZSBuYW1lcyBhbmQgb25seSB3aGVuIHRoZSBiYXNlIHN3aWdfY2xhc3MgaXMKICAgICAgICAgICAgICAgIG5lZWRlZCBpcyBTV0lHX1R5cGVRdWVyeShuYW1lKS0+Y2xpZW50ZGF0YSBsb29rZWQgdXAuCgogICAgICAgICAgICAtIGNvbnZlcnNpb25fbnNfdGVtcGxhdGUgdGVzdHN1aXRlIHRlc3Qgd2FzIGZhaWxpbmcgYmVjYXVzZQogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgd3JhcHBlZCBjb25zdHJ1Y3RvciBmdW5jdGlvbiB3YXMgbm90IGNhbGN1bGF0ZWQKICAgICAgICAgICAgY29ycmVjdGx5IGZvciBzdHJ1Y3RzLiAgRml4ZWQuCgoxMC8wNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlcyBmb3IgZGVmYXVsdCBhcmd1bWVudHMgdXNlZCBpbiBkaXJlY3RvcnMgLSBpbiB2aXJ0dWFsCiAgICAgICAgICAgIG1ldGhvZHMgYW5kIGRpcmVjdG9yIGNvbnN0cnVjdG9ycy4KCjEwLzA2LzIwMDQ6IG1tYXR1cwoJICAgIEZpeCB0aGUgX19jcGx1c3BsdXMgbWFjcm8sIGFuZCBidWcgMTA0MTE3MC4KCSAgICBOb3cgaXQgaXMgd29ya2luZyBhcyBzdXBwb3NlZCwgaWUsIHlvdSBjYW4gc2FmZWx5IHVzZQoKCSAgICAgICNpZmRlZiBfX2NwbHVzcGx1cwoJICAgICAgLi4uCgkgICAgCgkgICAgYWxsIG92ZXIgc3dpZywgaW5jbHVkaW5nIGluc2lkZSAlZGVmaW5lcyBhbmQgJXsgJX0gYm9kaWVzLgoKCSAgICAKICAgICAgICAgICAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKCSAgICBUaGUgb2xkIHRyaWNrIG9mIHVzaW5nCgoJICAgICAgI2lmIF9fY3BsdXNwbHVzCgoJICAgIGRvZXNuJ3Qgd29yayBhbnkgbW9yZS4gU28sIGlmIHlvdSBoYXZlIHlvdXIgb3duIHR5cGVtYXBzCgkgICAgdXNpbmcgdGhhdCBzeW50YXgsIHlvdSB3aWxsIG5lZWQgdG8gbWlncmF0ZSB0aGVtIHRvIHVzZQoJICAgICIjaWZkZWYgX19jcGx1c3BsdXMiLgoKMTAvMDUvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIC0gUmVvcmdhbml6ZSBob3cgcnVudGltZSB0eXBlIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBhbmQgc2hhcmVkCgkgICAgYmV0d2VlbiBtb2R1bGVzLiAgRm9yIGNoaWNrZW4gYW5kIG16c2NoZW1lLCBJIHJlbW92ZWQKCSAgICB0aGUgYWJpbGl0eSB0byB1c2UgcnVudGltZSBsaWJyYXJpZXMsIHdoaWxlIHBlcmwsIHRjbCwgcHl0aG9uLCBhbmQKCSAgICBydWJ5IGRlZmF1bHQgdG8gdXNpbmcgdGhlIG5ldyBtZXRob2QgYnV0IGNhbiBnbyBiYWNrIHRvIHRoZSBvbGQKCSAgICBtZXRob2QgYnkgZGVjbGFyaW5nIFNXSUdfQUxMT1dfUlVOVElNRS4KCgkgICAgLSBsaW5lIDU4MiBpbiBtenNjaGVtZS5jeHggd2FzIGdlbmVyYXRpbmcgYSBzZWdmYXVsdCBvbiAKCSAgICBpbXBvcnRzLm11bHRpY3BwdGVzdCwgc28gSSBmaXhlZCBpdC4KCjEwLzA1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeGVzIGZvciAlZXh0ZW5kIGFuZCBvdmVybG9hZGVkIHN0YXRpYyBtZXRob2RzIHdpdGggZGVmYXVsdAogICAgICAgICAgICBhcmd1bWVudHMuCgoxMC8wNS8yMDA0OiBtbWF0dXMKCSAgICAtIFtweXRob25dIEZpeCBkaXJlY3RvciArIG1ldGhvZCB3aXRoICdlbXB0eScgdGhyb3csIGllCgoJCSAgICBzdHJ1Y3QgQSB7CgkJICAgICAgdmlydHVhbCBpbnQgZm9vKCkgdGhyb3coKTsKCQkgICAgfTsKCQkgICAgCgkgICAgICBvdGhlciBsYW5ndWFnZXMgc2hvdWxkIGFsc28gZWFzeSB0byBmaXgsIGxvb2sgZm9yCgkgICAgICBHZXRhdHRyKG4sInRocm93IikgaW4gcHl0aG9uLmN4eC4KCgkgICAgLSBGaXggZGlyZWN0b3IgKyBkZXN0cnVjdG9yIHdpdGggJ2VtcHR5JyB0aHJvdwoKCQkgICAgc3RydWN0IEEgewoJCSAgICAgIHZpcnR1YWwgfkEoKSB0aHJvdygpOwoJCSAgICB9OwoKCSAgICAtIE5vdyBTV0lHX0ZFQVRVUkVTIHBhcnNlIGFsbCBhbmQgdGhlIHNhbWUgIG9wdGlvbnMgeW91CiAgICAgICAgICAgICAgY2FuIHBhc3MgdG8gc3dpZyBpbiB0aGUgY29tbWFuZCBsaW5lLgoJICAgICAgCgkgICAgLSBOZXcgY29tbWFuZCBsaW5lIGZsYWc6IC1mZWF0dXJlcyA8bGlzdD4sIGFzIGluCgoJICAgICAgICBzd2lnIC1mZWF0dXJlcyBhdXRvZG9jPTMsZGlyZWN0b3IKCgkgICAgICBpZSwgYW55IGdsb2JhbCBmZWF0dXJlIGNhbiBiZSBpbml0aWFsaXplZCBmcm9tIHRoZQoJICAgICAgY29tbWFuZCBsaW5lLiBUaGlzIGlzIG1haW5seSBmb3IgdGVzdGluZywgYnV0IHVzZXJzCgkgICAgICBjYW4gYWxzbyB0YWtlIGFkdmFudGFnZSBvZiBpdC4KCjEwLzA0LzIwMDQ6IG1tYXR1cwoJICAgIC0gUHJvcGVybHkgcXVhbGlmeSB0eXBlIGluIHN5bnRheCBhcyAnbG9uZygyKScgb3IgJ0ZvbygpJywKCSAgICAgIHRoaXMgc29sdmUgb2xkIHByb2JsZW0gd2l0aCBkZWZhdWx0IGFyZ3MsIGFuZCBwcm9iYWJseQoJICAgICAgb3RoZXIgcHJvYmxlbXMgYXJvdW5kLiBIb3dldmVyLCB0aGUgZGVmYXVsdCBhcmcgcHJvYmxlbQoJICAgICAgd2FzIGFsc28gYWxyZWFkeSBzb2x2ZWQgYnkgV2lsbGlhbSAoc2VlIGJlbGxvdykuCgoJICAgIC0gRml4IGZlYXR1cmVfc2V0IGFuZCBmZWF0dXJlX2dldCBtZXRob2RzLiBCZWZvcmUKCSAgICAgIHRoZXkgbG9vayBmcm9tIHBhcnRpY3VsYXIgdG8gZ2VuZXJhbCBhbmQga2VlcCB0aGUgZmlyc3QKCSAgICAgIGZlYXR1cmUgZm91bmQuIFRoaXMgZGlkbid0IHdvcmsgd2VsbCB3aXRoIHRlbXBsYXRlcy4KCSAgICAgIE5vdyB0aGUgbWV0aG9kcyBsb29rIGZyb20gZ2VuZXJhbCB0byBwYXJ0aWN1bGFyLCBhbmQKCSAgICAgIG92ZXJyaWRlIGFueSBmb3VuZCBmZWF0dXJlLgoKICAgICAgICAgICAgLSBQcmV2aW91c2x5IGEgZmVhdHVyZSBjb3VsZCBub3QgYmUgYXBwbGllZCB0byBjb25zdHJ1Y3RvcnMKICAgICAgICAgICAgICBvciBkZXN0cnVjdG9ycyB0aGF0IHdlcmVuJ3QgZXhwbGljaXRseSBkZWNsYXJlZCBpbiB0aGUgY2xhc3MuCiAgICAgICAgICAgICAgVGhpcyBpcyBub3cgZml4ZWQsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVmZWF0dXJlKCJmZWF0dXJlbmFtZSIpIEZvbygpICIuLi4iCiAgICAgICAgICAgICAgICAlZmVhdHVyZSgiZmVhdHVyZW5hbWUiKSB+Rm9vKCkgIi4uLiIKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIC8vIGltcGxpY2l0IEZvbygpIGFuZCB+Rm9vKCkKICAgICAgICAgICAgICAgIH07CgoJICAgIC0gRml4IG1pc3NpbmcgZmVhdHVyZXMgZm9yIGRlZmF1bHQgY29uc3QvZGVzdCwgYnkgcmVhbGx5CgkgICAgICAnY3JlYXRpbmcnIHRoZSBtZXRob2RzIGFuZCBhcHBseWluZyB0aGUgZmVhdHVyZXMuCgoJICAgIC0gRml4IHJldHVybl9jb25zdF92YWx1ZS5pIGNhc2UgYnkgYWRkaW5nIFN3aWdWYWx1ZVdyYXBwZXI8Y29uc3QgVD4KCSAgICAgIHNwZWNpYWxpemF0aW9uLgoKCSAgICAtIEZpeCAlZXh0ZW5kICsgb3ZlcmxvYWQsIGluY2x1ZGluZyBvdmVybG9hZGluZyBhY3R1YWwKICAgICAgICAgICAgICBjbGFzcyBtZXRob2RzLiAKCgkgICAgLSBBZGRpbmcgbW9yZSBjYXNlcyBpbiByZWxhdGVkIGZpbGVzIGluIHRoZSB0ZXN0LXN1aXRlLiAgCgoxMC8wNC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBDaGFuZ2VzIHRvIHRoZSB3YXkgZGVmYXVsdCBhcmd1bWVudHMgYXJlIHdyYXBwZWQuIFByZXZpb3VzbHkgYSBzaW5nbGUKICAgICAgICAgICAgbWV0aG9kIHdhcyBnZW5lcmF0ZWQgZm9yIGVhY2ggbWV0aG9kIHRoYXQgaGFkIGRlZmF1bHQgYXJndW1lbnRzLiBJZgogICAgICAgICAgICBhIG1ldGhvZCBoYWQgNSBhcmd1bWVudHMsIHNheSwgb2Ygd2hpY2ggMSBoYWQgYSBkZWZhdWx0IGFyZ3VtZW50CiAgICAgICAgICAgIHRoZW4gdGhlIGNhbGwgdG8gdGhlIHdyYXBwZWQgbWV0aG9kIHdvdWxkIHBhc3MgNSBhcmd1bWVudHMuIFRoZSBkZWZhdWx0CiAgICAgICAgICAgIHZhbHVlIHdhcyBjb3BpZWQgaW50byB0aGUgd3JhcHBlciBtZXRob2QgYW5kIHVzZWQgaWYgdGhlIHNjcmlwdGluZwogICAgICAgICAgICBsYW5ndWFnZSBwYXNzZWQganVzdCA0IGFyZ3VtZW50cy4gSG93ZXZlciwgdGhpcyB3YXMgZmxhd2VkIGFzIHRoZQogICAgICAgICAgICBkZWZhdWx0IGFyZ3VtZW50IHNvbWV0aW1lcyBkb2VzIG5vdCBoYXZlIGdsb2JhbCBhY2Nlc3MsIGZvciBleGFtcGxlCiAgICAgICAgICAgIFNXSUcgd291bGQgZ2VuZXJhdGUgY29kZSB0aGF0IGNvdWxkbid0IGNvbXBpbGUgd2hlbiB3cmFwcGluZzoKCiAgICAgICAgICAgICAgY2xhc3MgVHJpY2t5IHsKICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsID0gcHJpdmF0ZXZhbHVlKTsKICAgICAgICAgICAgICAgIHZvaWQgYmFyKGludCB2YWwgPSBUcmlja3k6OmdldERlZmF1bHQoKSk7CiAgICAgICAgICAgICAgcHJpdmF0ZToKICAgICAgICAgICAgICAgIHN0YXRpYyBpbnQgZ2V0RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgZW51bSB7IHByaXZhdGV2YWx1ZSA9IDIwMCB9OwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICBBbHNvIGJ1Z3MgaW4gcmVzb2x2aW5nIHN5bWJvbHMgZ2VuZXJhdGVkIGNvZGUgdGhhdCB3b3VsZG4ndCBjb21waWxlLCBmb3IgZXhhbXBsZQogICAgICAgICAgICAocHJvYmFibHkgZml4YWJsZSB0aG91Z2gpOgoKICAgICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2UgewogICAgICAgICAgICAgICAgY2xhc3MgS2xhc3MgewogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIEtsYXNzIGNvbnN0cnVjdG9yY2FsbChjb25zdCBLbGFzcyYgayA9IEtsYXNzKCkpOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoZSBhcHByb2FjaCBhbHNvIGRvZXMgbm90IHdvcmsgZm9yIHN0YXRpY2FsbHkgdHlwZWQgbGFuZ3VhZ2VzIChDIyBhbmQgSmF2YSkKICAgICAgICAgICAgYXMgdGhlc2UgbGFuZ3VhZ2VzIGRvIG5vdCBhbGxvdyBtZXRob2RzIHRvIGhhdmUgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KICAgICAgICAgICAgQWx0aG91Z2ggQyMgaGFzIGEgbWVjaGFuaXNtIHRvIHBhc3MgYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzIHRoZXkKICAgICAgICAgICAgbXVzdCBiZSBvZiB0aGUgc2FtZSB0eXBlIGFuZCBhcmUgbW9yZSBsaWtlIHZhcmFyZ3MuCgogICAgICAgICAgICBUaGUgbmV3IGFwcHJvYWNoIHNvbHZlcyB0aGUgYWJvdmUgcHJvYmxlbXMgYW5kIHdyYXBzIG1ldGhvZHMgd2l0aCBkZWZhdWx0CiAgICAgICAgICAgIGFyZ3VtZW50cyBhcyBpZiB0aGUgbWV0aG9kIHdhcyBvdmVybG9hZGVkLiBTbyBTV0lHIHdpbGwgbm93IHRyZWF0CgogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWw9MCk7CgogICAgICAgICAgICBhcyBpZiBpdCBoYWQgcGFyc2VkOgoKICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQpOwogICAgICAgICAgICAgIHZvaWQgZm9vKCk7CgogICAgICAgICAgICBUaGUgY29kZSBnZW5lcmF0ZWQgaXMgdGhlbiBleGFjdGx5IHRoZSBzYW1lIGFzIGlmIFNXSUcgaGFkIHBhcnNlZCB0aGUgdHdvCiAgICAgICAgICAgIG92ZXJsb2FkZWQgbWV0aG9kcy4gVGhlIHNjcmlwdGluZyBsYW5ndWFnZXMgY291bnQgdGhlIGFyZ3VtZW50cyBwYXNzZWQgYW5kIGNhbGwKICAgICAgICAgICAgdGhlIGFwcHJvcHJpYXRlIG1ldGhvZCwganVzdCBsaWtlIG92ZXJsb2FkZWQgbWV0aG9kcy4gQyMgYW5kIEphdmEgYXJlIG5vdyBhYmxlCiAgICAgICAgICAgIHRvIHByb3Blcmx5IHdyYXAgbWV0aG9kcyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIGJ5IGdlbmVyYXRpbmcgZXh0cmEgbWV0aG9kcywKICAgICAgICAgICAgYWdhaW4gYXMgaWYgdGhlIG1ldGhvZCB3YXMgb3ZlcmxvYWRlZCwgc28gZm9yOgoKICAgICAgICAgICAgICB2b2lkIGJhcihzdHJpbmcgcz0iaGVsbG8iLCBkb3VibGUgZD0xMC4wLCBpbnQgaT0wKTsKCiAgICAgICAgICAgIHRoZSBmb2xsb3dpbmcgcHJveHkgbWV0aG9kcyBhcmUgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgICB2b2lkIGJhcihzdHJpbmcgcywgZG91YmxlIGQsIGludCBpKTsKICAgICAgICAgICAgICB2b2lkIGJhcihzdHJpbmcgcywgZG91YmxlIGQpOwogICAgICAgICAgICAgIHZvaWQgYmFyKHN0cmluZyBzKTsKICAgICAgICAgICAgICB2b2lkIGJhcigpOwoKICAgICAgICAgICAgVGhlIG5ldyBhcHByb2FjaCBjb21lcyB3aXRoIGEgY291cGxlIG9mIG1pbm9yIGtub2NrIG9uIGVmZmVjdHMuCgogICAgICAgICAgICAxKSBTV0lHIHN1cHBvcnQgZm9yIGRlZmF1bHQgYXJndW1lbnRzIGZvciBDIChub3QgQysrKSBjb2RlIG5vIGxvbmdlciB3b3Jrcy4KICAgICAgICAgICAgUHJldmlvdXNseSB5b3UgY291bGQgaGF2ZSB0aGlzIGludGVyZmFjZToKCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsKTsKICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWw9MCk7CgogICAgICAgICAgICBhbmQgY2FsbCB0aGUgd3JhcHBlZCBtZXRob2QgZnJvbSBhIHNjcmlwdGluZyBsYW5ndWFnZSBhbmQgcGFzcyBubyBhcmd1bWVudHMKICAgICAgICAgICAgd2hlcmV1cG9uIHRoZSBkZWZhdWx0IG9mIDAgd2FzIHVzZWQuIFlvdSBjYW4gZ2V0IHRoZSBzYW1lIGJlaGF2aW91ciBmb3IgQwogICAgICAgICAgICBjb2RlIGJ5IHVzaW5nIHRoZSAiZGVmYXVsdCIgdHlwZW1hcDoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoZGVmYXVsdCkgaW50IHZhbCAiJDEgPSAwOyI7CiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsKTsKICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWwpOwoKICAgICAgICAgICAgb3IgeW91IGNvdWxkIG9mIGNvdXJzZSBjb21waWxlIHlvdXIgY29kZSBhcyBDKysgaWYgeW91IHdhbnQgQysrIGZlYXR1cmVzIDopIDoKCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsPTApOwogICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbD0wKTsKCiAgICAgICAgICAgIEEgY291cGxlIG9mIFNXSUcncyBsaWJyYXJpZXMgdXNlZCB0aGlzIEMgZXh0ZW5zaW9uIGFuZCB0aGVzZSBoYXZlIGJlZW4gbW9kaWZpZWQKICAgICAgICAgICAgdG8gdXNlIHRoZSAiZGVmYXVsdCIgdHlwZW1hcC4gVGhlICJkZWZhdWx0IiB0eXBlbWFwIGlzIHRodXMgdW5jaGFuZ2VkIChhbmQgc3RpbGwKICAgICAgICAgICAgaXMgbm90IGFuZCBpcyBub3QgZnVsbHkgc3VwcG9ydGVkIGJ5IEMjIGFuZCBKYXZhLCBhbmQgaXMgbGlrZWx5IHRvIHJlbWFpbiBzbykuCgoKICAgICAgICAgICAgMikgQWxsIGZlYXR1cmVzICglZmVhdHVyZSwgJXJlbmFtZSwgJWlnbm9yZSBldGMpIG5vIGxvbmdlciB3b3JrIGFzIGlmIHRoZSBtZXRob2QKICAgICAgICAgICAgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyBpcyBqdXN0IG9uZSBtZXRob2QuIEZvciBleGFtcGxlLCBwcmV2aW91c2x5CgogICAgICAgICAgICAgICVpZ25vcmUgZm9vKGludCk7CgogICAgICAgICAgICB3b3VsZCBoYXZlIGlnbm9yZWQgdGhlIG1ldGhvZCBjb21wbGV0ZWx5LiBOb3cgaXQgd2lsbCBvbmx5IGlnbm9yZSBmb28oaW50KSBidXQKICAgICAgICAgICAgbm90IHRoZSBleHRyYSBmb28oKSBtZXRob2QuIEluc3RlYWQgdXNlOgoKICAgICAgICAgICAgICAlaWdub3JlIGZvbzsKCiAgICAgICAgICAgIHRvIGlnbm9yZSB0aGVtIGFsbC4gb3IKCiAgICAgICAgICAgICAgJWlnbm9yZSBmb28oaW50KTsKICAgICAgICAgICAgICAlaWdub3JlIGZvbygpOwoKICAgICAgICAgICAgVGhpcyBvZiBjb3Vyc2UgYWxsb3dzIG9uZSB0byBmaW5lIHR1bmUgdGhlIHdyYXBwaW5nLCBmb3IgZXhhbXBsZSBvbmUgY291bGQgdXNlOgoKICAgICAgICAgICAgICAlcmVuYW1lKGZvb2ludCkgZm9vKGludCk7CiAgICAgICAgICAgICAgJXJlbmFtZShmb29kZWZhdWx0cykgZm9vKCk7CiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbD0wKTsKCiAgICAgICAgICAgIGFuZCBjYWxsIHRoZW0gZnJvbSBhbnkgbGFuZ3VhZ2UgbGlrZSBzbzoKCiAgICAgICAgICAgICAgZm9vaW50KDIwMCkKICAgICAgICAgICAgICBmb29kZWZhdWx0cygpCgogICAgICAgICAgICBvciBmb3IgZXhhbXBsZSBpZ25vcmUgdGhlIGV4dHJhIG92ZXJsb2FkZWQgbWV0aG9kLCBzbyB0aGUgZGVmYXVsdHMgY2Fubm90IGJlIHVzZWQ6CgogICAgICAgICAgICAgICVpZ25vcmUgZm9vKCk7CiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbD0wKTsKCiAgICAgICAgICAgICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEwLzIvMjAwNDogbW1hdHVzCgkgICBbUHl0aG9uXQoJICAgLSBNb3JlIGNsZWFuaW5nIHVwIGFuZCB1bmlmb3JtYXRpb24gb24gdGhlIFB5dGhvbiBMaWIKCgkgICAtIEFkZGVkIFJvYmluJ3MgZG9jc3RyaW5nIHBhdGNoLCBwbHVzIHNvbWUgZml4ZXMsIHBsdXMKCSAgICAgc29tZSBleHRlbnNpb25zLCBzZWUgYXV0b2RvYy5pIGV4YW1wbGUgaW4gdGhlIHRlc3Qtc3VpdGUsCgkgICAgIGFuZCB0cnkgdXNpbmcgJWZlYXR1cmUoImF1dG9kb2MiLCJleHRlbmRlZCIpLgoJICAgIAoJICAgICBUaGlzIHBhdGNoIGlzIG5vdCBhIGNvbXBsZXRlIHNvbHV0aW9uIGZvciB0aGUKCSAgICAgZG9jdW1lbnRhdGlvbiBwcm9ibGVtLCBqdXN0IGVub3VnaCB0byBpbmZvcm0gcHl0aG9uIGFib3V0CgkgICAgIHRoZSBwYXJhbWV0ZXIgbGlzdC4KCgkgICAgIFRoZSBleHBlY3RlZCBzd2lnIGRvY3VtZW50YXRpb24gc3VwcG9ydCBpcyBmYXIgZmFyIGF3YXkgeWV0LgoJICAgICAKCjEwLzEvMjAwNDogbW1hdHVzCgkgICAtIEZpeCB0aGUgJWNhbGxiYWNrIGZlYXR1cmUgKG9ubHkgdXNlZCBpbiBydWJ5IGFuZCBweXRob24gZXhhbXBsZXMsCgkgICAgIGJ5IG5vdywgYnV0IGl0IHNob3VsZCBiZSBnZW5lcmljKSwgbm93IG1lbWJlciBjYWxsYmFja3MKCSAgICAgYXJlIHdvcmtpbmcgYWdhaW4KCSAgICAgCgkgICAtIEZpeCB3cmFwcGluZyBvZiBmdW5jdGlvbnMgcG9pbnRlcnMgbGlrZQoKCQkgc3RkOjpvc3RyZWFtJiBzdGQ6OmVuZGwoc3RkOjpvc3RyZWFtJik7CgoJICAgICBpZSwgdGhlIG9uZXMgdGhhdCByZXR1cm4gcmVmZXJlbmNlcyBvciBlbnVtcy4KCSAKCSAgIFtQeXRob25dIEFkZCB0aGUgJXB5dGhvbmNhbGxiYWNrIGRpcmVjdGl2ZSwgd2hpY2ggaXMgCgkgICBhbiBpbXByb3ZlZCB2ZXJzaW9uIG9mICVjYWxsYmFjaywgaWUsCgoJICAgICAlcHl0aG9uY2FsbGJhY2soMSkgZm9vOwoJICAgICAlcHl0aG9uY2FsbGJhY2soMSkgQTo6YmFyOwoJICAgICAlcHl0aG9uY2FsbGJhY2soMSkgQTo6YmFybTsKCgkgICAgIGludCBmb28oaW50IGEpIHsKCSAgICAgICAgIHJldHVybiBhOwoJICAgICB9CiAgCgkgICAgIHN0cnVjdCBBIAoJICAgICB7CgkgICAgICAgc3RhdGljIGludCBiYXIoaW50IGEpOwoJICAgICAgIGludCBiYXJtKGludCBhKTsKCgkgICAgIH07CgogICAgICAgICAgICAgaW50IGZvb2JhcihpbnQgYSwgaW50ICgqcGYpKGludCBhKSk7CgoJICAgaW4gcHl0aG9uIHlvdSBjYW4gdXNlCgogICAgICAgICAgICAgZm9vKDIpCgkgICAgIGZvb2JhcigyLGZvbykKICAgICAgICAgICAgIEEuYmFyKDIpCgkgICAgIGZvb2JhcigyLEEuYmFyKQogICAgICAgICAgCiAgICAgICAgICAgaWUsIG5vIGFkZGl0aW9uYWwgcG9pbnRlciBlbGVtZW50cyBhcmUgY3JlYXRlZCwgYW5kCgkgICB0aGUgb3JpZ2luYWwgJ2ZvbycgYW5kICdBLmJhcicgY2FuIGJlIHVzZWQgYXMgcGFyYW1ldGVycy4KCgkgICBJbiB0aGUgY2FzZSBvZiBtZW1iZXIgZnVjbnRpb24gaG93ZXZlciwgc3RpbGwgeW91IG5lZWQKCSAgIHRvIHVzZSB0aGUgc3BlY2lhbCB2YXJpYWJsZSBDbGFzczo6PGZuY19uYW1lPl9jYl9wdHIsIGllOgoKIAkgICAgIGZvb2Jhcm0oMywgYSwgQS5iYXJtX2NiX3B0cikKCSAgIAoJICAgd2Ugd2lsbCB0cnkgdG8gZml4IHRoaXMgc2l0dWF0aW9uIGFsc28sIGJ1dCBsYXRlci4gIAoKCSAgIFtQeXRob25dIEFkZCBtb3JlIGVsZW1lbnRzIGZyb20gdGhlIFNUTCBsaWJyYXJ5LCBub3cKCSAgIHlvdSBjYW4gdXNlCgoJICAgICBpbXBvcnQgc3RkCgkgICAgIHN0ZC5jb3V0IDw8ICJoZWxsbyAiIDw8IDEyMyA8PCBzdGQuZW5kbAoKCSAgIFtQeXRob25dIEZpeCBpbi9vdXQgcmV0dXJuIG1lY2hhbmlzbSwgbm93IHN3aWcgd2lsbCBiZWhhdmUKCSAgIGFzIDEuMy4yMSBidXQgdXNpbmcgYSBweXRob24gbGlzdCB3aGVuIG5lZWRlZC4gVGhlIHByb2JsZW0KCSAgIGlzIHRoYXQgdGhlIHR5cGVzIHN0ZDo6cGFpcixzdGQ6OnZlY3RvcixldGMsIHVzZSB0dXBsZXMsCgkgICBhbmQgdGhleSBpbnRlcmZlciB3aXRoIHRoZSBwcmV2aW91cyBpbm91dCB0dXBsZSB0eXBlLgoKCSAgIEJ5IHVzaW5nIGxpc3RzIHdlIHNvbHZlIHRoZSBjb25mbGljdHMsIHN3aWcgYWN0cyBhcyBiZWZvcmUsCgkgICBidXQgcmV0dXJucyBhIGxpc3Qgd2hlbiBtb3JlIHRoYW4gb25lIHBhcmFtZXRlciBhcmUgdXNpbmcKCSAgIHRoZSBPVVQgdHlwZW1hcC4gU2VlIHRoZSBuZXcgaW5vdXQuaSBleGFtcGxlIGluIHRoZQoJICAgdGVzdC1zdWl0ZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBQWVRIT04gTU9EVUxFICoqKgoJCSAgIAogICAgICAgICAgIFtQeXRob25dIE11Y2ggYmV0dGVyIGVycm9yIG1lc3NhZ2VzIGZvciBiYWQgYXJndW1lbnRzLCBub3cKCSAgIHlvdSBhbHdheXMgZ2V0IHRoZSBhcmd1bWVudCBudW1iZXIgd2hlcmUgdGhlIGVycm9yIG9jY3VycmVkLgoKMDkvMjcvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggZnJvbSBCaWxsIENsYXJrZSAtCiAgICAgICAgICAgIDEpIFdhcm5pbmcgZW1pdHRlZCB3aGVuIC1pbXBvcnRhbGwgYW5kIC1pbmNsdWRlYWxsIGlzIHVzZWQgdG9nZXRoZXIsCiAgICAgICAgICAgICAgIHdpdGggLWluY2x1ZGVhbGwgdGFraW5nIHByZWNlZGVuY2UuCiAgICAgICAgICAgIDIpIEVuc3VyZSBTV0lHSU1QT1JURUQgaXMgYWx3YXlzIGRlZmluZWQgd2hlbiBhIGZpbGUgaXMgYmVpbmcKICAgICAgICAgICAgICAgaW1wb3J0ZWQgd2l0aCAlaW1wb3J0LiBOb3RlIHRoYXQgdGhpcyBpcyBub3QgdGhlIHNhbWUgYXMgU1dJR0lNUE9SVCwKICAgICAgICAgICAgICAgd2hpY2ggZ2V0cyBkZWZpbmVkIGluIGFsbCBnZW5lcmF0ZWQgd3JhcHBlciBmaWxlcy4KCjA5LzI2LzIwMDQ6IG1tYXR1cwoKCSAgICAtIGFkZCAlZmVhdHVyZSgiZXhjZXB0aW9uY2xhc3MiKSB0byBpZGVudGlmeSBhIGNsYXNzIHVzZWQKCSAgICAgIGFzIGV4Y2VwdGlvbi4gQmVmb3JlIHN3aWcgaWRlbnRpZmllZCBhbmQgbWFya2VkIGEgY2xhc3MKCSAgICAgIHVzaW5nIHRoZSAiY3BsdXM6ZXhjZXB0aW9uY2xhc3MiIGF0dHJpYnV0ZS4gSG93ZXZlciwgdGhlCgkgICAgICBjbGFzcyBuZWVkZWQgdG8gYXBwZWFyIG9uIGFuIHRocm93KCkgc3RhdGVtZW50LiAgTm93CgkgICAgICBzd2lnIGtlZXBzIHRyeWluZyB0byBpZGVudGlmeSB0aGUgZXhjZXB0aW9uIGNsYXNzZXMsIGFzCgkgICAgICBiZWZvcmUsIGJ1dCBpdCBhbHNvIGFsbG93cyB0aGUgdXNlciB0byBtYXJrIGEgY2xhc3MgYnkKCSAgICAgIHVzaW5nIHRoZSAlZmVhdHVyZSBleHBsaWNpdGx5LiAobW9zdGx5IHJlbGV2YW50IGZvcgoJICAgICAgcHl0aG9uIGFuZCBjaGlja2VuKQoKCSAgICBbUHl0aG9uXQoKCSAgICAtIGZpeCAtbW9kZXJuIG9wdGlvbiArIGV4Y2VwdGlvbnMsIHdoaWNoIG1peCBvbGQgY2xhc3MKCSAgICAgIHN0eWxlIHdpdGggdGhlIG5ldyBvbmUuIFNvLCB3ZSBhbHdheXMgbmVlZCB0byBlbWl0CgkgICAgICB0aGUgIm5vbm1vZGVybiIgcHl0aG9uIGNvZGUuCgoJICAgIC0gYWRkIHRoZSAicHl0aG9uOm5vbmR5bmFtaWMiIGZlYXR1cmUgYW5kIGl0cyBoYW5kbGVyCgoJICAgICAgbm93IGlmIHlvdSBoYXZlCgkgICAgICAKCSAgICAgICVweXRob25ub25keW5hbWljIEE7CgkgICAgICAKCSAgICAgIHN0cnVjdCBBIHsKCSAgICAgICBpbnQgYTsKCSAgICAgICBpbnQgYjsKCSAgICAgIH07CgoJICAgICAgdGhlbiwgaW4gdGhlIHB5dGhvbiBzaWRlCgkgICAgICAKCSAgICAgIGFhID0gQSgpCgkgICAgICAKCSAgICAgIGFhLmEgPSAxICMgb2sKCSAgICAgIGFhLmIgPSAyICMgb2sKCSAgICAgIGFhLmMgPSAzICMgZXJyb3IsIHRoZSBjbGFzcyBjYW4gbm90IGJlIGV4dGVuZGVkIGR5bmFtaWNhbGx5LgoKCSAgICAKCSAgICBTaW5jZSB0aGlzIGlzIGEgZmVhdHVyZSwgeW91IGNhbiB1c2UKCgkgICAgICAlcHl0aG9ubm9uZHluYW1pYzsKCiAgICAgICAgICAgIG9yIAoKCSAgICAgICVweXRob25keW5hbWljOyBbIE5vdGU6ICVweXRob25keW5hbWljIHNpbmNlIGRlcHJlY2F0ZWQgXQogICAKCSAgICB0byBmb3JjZSBhbGwgdGhlIHdyYXBwZWQgY2xhc3NlcyB0byBiZSAibm9uZHluYW1pYyIgb25lcy4KCgkgICAgVGhlIGRlZmF1bHQsIGFzIGluIHJlZ3VsYXIgcHl0aG9uLCBpcyB0aGF0IGFsbCB0aGUgd3JhcHBlZAoJICAgIGNsYXNzZXMgYXJlIGR5bmFtaWNzLiBTbywgY2FyZWZ1bCB3aXRoIHlvdXIgc3BlbGxpbmcuCgowOS8xNC8yMDA0OiBtbWF0dXMgCgkgICAgLSBTdXBwb3J0IHRoZSAtSS0gb3B0aW9uLgoKCSAgICAtIERpZmZlcmVudGlhdGUgYmV0d2VlbiAlaW5jbHVkZSA8ZmlsZT4gYW5kICVpbmNsdWRlICJmaWxlIi4KCSAgICAgIFRoaXMgZml4IHNldmVyYWwgY29ybmVyIGNhc2VzLgoKCSAgICAKCSAgICBbUHl0aG9uXSBTZXZlcmFsIHBhdGNoZXM6CgoJICAgIC0gTm9ybWFsaXplIHRoZSBMaWIgZmlsZSBuYW1lczogCgkJKi5zd2cgaW50ZXJuYWwgZmlsZXMsIAoJCSouaSAgIHVzZXIgZmlsZXMuCgoJICAgIC0gRml4IENoYXJbQU5ZXSB0eXBlbWFwcywgc28gdGhleSBhbHNvIGRlbGV0ZSBhbnkgZXh0cmEgJ1wwJyBjaGFycywKCSAgICAgIG5vdyB0aGV5IGJlaGF2ZSBhcyBiZWZvcmUgKDEuMy4yMSkuIFN0aWxsLCB5b3UgY2FuIHVzZQoJICAgICAgdGhlIFNXSUdfUFJFU0VSVkVfQ0FSUkFZX1NJWkUgbWFjcm8gaWYgeW91IG5lZWQgdG8KCSAgICAgIHByZXNlcnZlIHRoZSBvcmlnaW5hbCBzaXplIChzZWUgcHlzdHJiYXNlLnN3ZykuCgoJICAgIC0gQWRkIHRoZSBDaGFyIEZJWFNJWkVbQU5ZXSB0eXBlbWFwcywgdG8gcHJlc2VydmUgdGhlCiAgICAgICAgICAgICAgb3JpZ2luYWwgQyBhcnJheSBzaXplcyAoc2VlIGFib3ZlKS4gVGhvdWdoLCB5b3UgY2FuJ3QKICAgICAgICAgICAgICB1c2UgdGhlbSB5ZXQgc2luY2UgJWFwcGx5IGFuZCBhcnJheXMgYXJlIG5vdCB3b3JraW5nCiAgICAgICAgICAgICAgdG9nZXRoZXIuCgogICAgICAgICAgICAtIEFkZCBweWZyYWdtZW50cy5zd2csIG5vdyB0aGUgdXNlciBjYW4gYWRkIGZyYWdtZW50cwoJICAgICAgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgb25lcy4KCjA5LzEwLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoIGZyb20gQmlsbCBDbGFya2Ugd2hpY2ggZml4ZXMgc3B1cmlvdXMgcHJlcHJvY2Vzc29yIGJ1ZyB3aGljaAogICAgICAgICAgICBzaG93cyBvbiBTb2xhcmlzIGFuZCBnY2MsIGVnOgogICAgICAgICAgICAgICAgV2FybmluZygyMDIpOiBDb3VsZCBub3QgZXZhbHVhdGUgJyFkZWZpbmVkKFNXSUdKQVZBKSAmJgogICAgICAgICAgICAgICAgIShkZWZpbmVkKFNXSUdDU0hBUlApJwogICAgICAgICAgICBBbHNvIGZpeGVzIGEgYnVnIHdoZXJlICcjaWYgImEiID09ICJiIiA9PSAxJyB3b3VsZG4ndCBoYXZlIHdvcmtlZCAKCjA5LzEwLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFJlc3RvcmVkIG11bHRpcGxlIGJ1aWxkIGRpcmVjdG9yaWVzIGZvciB0aGUgdGVzdC1zdWl0ZS4gUGF0Y2ggZnJvbQogICAgICAgICAgICBCaWxsIENsYXJrZS4KCjA5LzA2LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZGVkIHRoZSBtaXNzaW5nIHJ1bnRpbWUuZHNwIFZpc3VhbCBTdHVkaW8gcHJvamVjdCBmaWxlcyBmb3IgdGhlCiAgICAgICAgICAgIGltcG9ydCBleGFtcGxlcyB0byB3b3JrLgoKClZlcnNpb24gMS4zLjIyIChTZXB0ZW1iZXIgNCwgMjAwNCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDkvMDMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgVGhlIHN3aWcubTQgbWFjcm8gZm9yIHVzZSB3aXRoIHRoZSBBdXRvY29uZi9BdXRvbWFrZS9MaWJ0b29sIGhhcwogICAgICAgICAgICBiZWVuIHJlbW92ZWQgYW5kIGlzIG5vIGxvbmdlciBpbnN0YWxsZWQuIFBsZWFzZSB1c2UgdGhlIG5ldyBhbmQgYmV0dGVyCiAgICAgICAgICAgIG1haW50YWluZWQgdmVyc2lvbiBkZXJpdmVkIGZyb20gc3dpZy5tNCBpbiB0aGUgQXV0b2NvbmYgbWFjcm8gYXJjaGl2ZS4KICAgICAgICAgICAgU2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hYy1hcmNoaXZlL2h0bWxkb2MvYWNfcGtnX3N3aWcuaHRtbCBhbmQKICAgICAgICAgICAgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2FjLWFyY2hpdmUvaHRtbGRvYy9hY19weXRob25fZGV2ZWwuaHRtbC4KCjA5LzAxLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBBcHBsaWVkIHBhdGNoICMxMDE5NjY5IGZyb20gQ2hyaXN0b3BoIEZsYW1tLiBBZGRzIHN1cHBvcnQKICAgICAgICAgICAgZm9yICVmZWF0dXJlKCJzaGFkb3ciKSBpbiB0aGUgc2FtZSB3YXkgYXMgaXQgd29ya3MgaW4gUHl0aG9uLiBUaGlzCiAgICAgICAgICAgIGVuYWJsZXMgb25lIHRvIG92ZXJyaWRlIHRoZSBnZW5lcmF0ZWQgc2hhZG93L3Byb3h5IG1ldGhvZHMsIGluY2x1ZGluZwogICAgICAgICAgICBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgLyogTGV0J3MgbWFrZSB0aGUgY29uc3RydWN0b3Igb2YgdGhlIGNsYXNzIFNxdWFyZSBtb3JlIHZlcmJvc2UgKi8KCiAgICAgICAgICAgICAgJWZlYXR1cmUoInNoYWRvdyIpIFNxdWFyZShkb3VibGUgdykKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgICAgc3ViIG5ldyB7CiAgICAgICAgICAgICAgICAgIG15ICRwa2cgPSBzaGlmdDsKICAgICAgICAgICAgICAgICAgbXkgJHNlbGYgPSBleGFtcGxlYzo6bmV3X1NxdWFyZShAXyk7CiAgICAgICAgICAgICAgICAgIHByaW50IFNUREVSUiAiQ29uc3RydWN0ZWQgYW4gQHtbcmVmKCRzZWxmKV19XG4iOwogICAgICAgICAgICAgICAgICBibGVzcyAkc2VsZiwgJHBrZyBpZiBkZWZpbmVkKCRzZWxmKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgICBjbGFzcyBTcXVhcmUgewogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgIFNxdWFyZShkb3VibGUgdyk7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwoKMDgvMzEvMjAwNDogbW1hdHVzIAoJICAgIFtQeXRob25dIEluY29tcGF0aWJpbGl0eSByZXBvcnRlZCBieSBCaWxsIENsYXJrZSAobGxpYkBjb21wdXRlci5vcmcpOgoJICAgIAoJICAgIElmIHlvdSBhcmUgdXNpbmcgU3VuIFN0dWRpbyA4IChhbmQgcG9zc2libHkgZWFybGllcgoJICAgIHZlcnNpb25zKSB0byBjb21waWxlIHRoZSBvdXRwdXQgcHJvZHVjZWQgYnkgc3dpZwoJICAgIDEuMy4yMnJjMSwgYW5kIHlvdSBhcmUgdXNpbmcgQysrIGFuZCBTVEwgdGVtcGxhdGVzIHRoZW4KCSAgICB5b3UgbmVlZCB0byB1c2UgZWl0aGVyICItcnVudGltZSIgb3IgIi1ub3J1bnRpbWUiLiAgSWYgeW91CgkgICAgdXNlIG5laXRoZXIgb2YgdGhlc2Ugb3B0aW9ucyB0aGVuIHlvdSB3aWxsIHByb2JhYmx5IGdldAoJICAgIGNvbXBpbGVyIGVycm9ycyB3aGVuIHRyeWluZyB0byBjb21waWxlIHRoZSB3cmFwcGVyIGZpbGU7CgkgICAgdGhlIGVycm9yIG1lc3NhZ2Ugd2lsbCBiZSBsaWtlIHRoaXM6IFRoZSBuYW1lCgkgICAgU1dJR19QeXRob25fQ29udmVydFB0clsuLi5dIGlzIHVudXNhYmxlIGluIHN0YXRpYwoJICAgIHN3aWdweTo6dHJhaXRzX2FzcHRyWy4uLl0gIElmIHlvdSBnZXQgdGhpcyBlcnJvciBtZXNzYWdlLAoJICAgIHlvdSBuZWVkIHRvIHJlZ2VuZXJhdGUgeW91ciB3cmFwcGVyIGZpbGUgdXNpbmcgJ3N3aWcKCSAgICAtcnVudGltZScgb3IgJ3N3aWcgLW5vcnVudGltZScuCgoJICAgIFlvdSBzaG91bGRuJ3QgZ2V0IHRoaXMgcHJvYmxlbSB3aXRoIFN1biBTdHVkaW8gOS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBQWVRIT04gTU9EVUxFICoqKgoJICAgIAowOC8yNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gQXBwbGllZCAjOTMyMzMzIGZyb20gSWtlZ2FtaSBUc3V0b211LiBGaXhlcyBsb25nIGxvbmcgKk9VVFBVVAogICAgICAgICAgICBhbmQgdW5zaWduZWQgbG9uZyBsb25nICpPVVRQVVQgdHlwZW1hcHMgaW4gdHlwZW1hcHMuaS4KCjA4LzI2LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFwcGxpZWQgcGF0Y2ggIzg1NzM0NCBmcm9tIEFydCBZZXJrZXMuIFdvcmthcm91bmQgZm9yIGF1dG9jb25mIGJ1ZyB3aGVuCiAgICAgICAgICAgIHJ1bm5pbmcgJ21ha2UgaW5zdGFsbCcuCgowOC8yNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gUGFydCBvZiBwYXRjaCAjOTgyNzUzIGFwcGxpZWQuIFRoaXMgaW1wbGVtZW50cyBhICVwZXJsY29kZSBkaXJlY3RpdmUuCiAgICAgICAgICAgIEl0IGFsbG93cyBvbmUgdG8gYWRkIFBlcmwgY29kZSB0byB0aGUgZ2VuZXJhdGVkIC5wbSBmaWxlLiBXb3JrcyB0aGUgc2FtZSAKICAgICAgICAgICAgYXMgJXB5dGhvbmNvZGUuCgowOC8yNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IGZvciBkaXJlY3RvcnMgd2hlbiB3cmFwcGluZyB2aXJ0dWFsIG1ldGhvZHMgd2l0aCBleGNlcHRpb24KICAgICAgICAgICAgc3BlY2lmaWNhdGlvbnMgdGhhdCB3ZXJlIG5vdCBzaW1wbGUgdHlwZXMuIFByZXZpb3VzbHkgY29kZSB3YXMgZ2VuZXJhdGVkIHRoYXQKICAgICAgICAgICAgZGlkbid0IGNvbXBpbGUsIGZvciBleGFtcGxlIHdoZW4gdGhlIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIHdhcyBhIHBvaW50ZXIuCgowOC8yNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFR5cGVtYXAgZml4IGZvciBtZXRob2RzIHRoYXQgcmV0dXJuIGNoYXIgKi4gVGhlIENMUiB3b3VsZCBpbmNvcnJlY3RseQogICAgICAgICAgICBkZWxldGUgdGhlIG1lbW9yeSBwb2ludGVkIHRvIGJ5IGNoYXIgKi4gQWxzbyBhcHBsaWVkIHRoZSBzYW1lIGNvcnJlY3Rpb24gdG8KICAgICAgICAgICAgdGhlIGNoYXIgYXJyYXkgdHlwZW1hcHMuCgowOC8yNC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlcyBmb3IgLWZtaWNyb3NvZnQgZXJyb3Ivd2FybmluZyBtZXNzYWdlIGRpc3BsYXk6IAogICAgICAgICAgICAtIEVuZCBvZiBmaWxlIChFT0YpIHdhcm5pbmcgbWVzc2FnZXMgbm90IGRpc3BsYXlpbmcgaW4gY29ycmVjdCBmb3JtYXQKICAgICAgICAgICAgLSBTb21lIG1lc3NhZ2VzIGNvbnRhaW5pbmcgYSBmaWxlIHBhdGggd2VyZSBkaXNwbGF5aW5nIGEgZG91YmxlIGJhY2tzbGFzaAogICAgICAgICAgICAgIGluc3RlYWQgb2YgYSBzaW5nbGUgYmFja3NsYXNoCgowOC8yMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBBcHBsaWVkIHBhdGNoICMxMDExNjA0IHN1Ym1pdHRlZCBieSBDaGFybGVzIFNjaHdpZXRlcnMuIEZpeCBmb3IgNjQgYml0IHRjbAogICAgICAgICAgICBpbnRlcnByZXRlcnMuCgowOC8yMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yIGJ1ZyAjODc1NTgzIC0gZW51bSBmb3J3YXJkIGRlY2xhcmF0aW9ucyBwcmV2aW91c2x5IGdhdmUgYSBzeW50YXggZXJyb3IuCgowOC8yMy8yMDA0OiBta29lcHBlCgkgICAgW0FsbGVncm8gQ0xdIFVzZSB0eXBlbWFwcyAiZmZpdHlwZSIgYW5kICJsaXNwdHlwZSIgdG8gZGV0ZXJtaW5lIHRoZSBGRkkgdHlwZQoJICAgIHNwZWNpZmllcnMgZnJvbSB0aGUgQyB0eXBlLiAgVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSwgZm9yIGluc3RhbmNlLCB0byBjb250cm9sCgkgICAgd2hldGhlciBhIEMgImNoYXIiIGFyZ3VtZW50IHRha2VzIGEgTGlzcCBjaGFyYWN0ZXIgb3IgYSBMaXNwIGludGVnZXIgdmFsdWUuCgkgICAgVGhlIGRlZmF1bHQgKHRha2luZyBMaXNwIGNoYXJhY3RlcnMpIGlzIGRvbmUgYnkgdGhlc2UgYnVpbHQtaW4gdHlwZW1hcHM6CgkgICAgICAldHlwZW1hcChmZml0eXBlKSBjaGFyICI6Y2hhciI7ICV0eXBlbWFwKGxpc3B0eXBlKSBjaGFyICJjaGFyYWN0ZXIiOwoJICAgIElmIGNoYXIgbWVhbnMgYW4gaW50ZWdlciBpbnN0ZWFkLCB1c2UgdGhlc2UgdHlwZW1hcHM6CgkgICAgICAldHlwZW1hcChmZml0eXBlKSBjaGFyICI6Y2hhciI7ICV0eXBlbWFwKGxpc3B0eXBlKSBjaGFyICJpbnRlZ2VyIjsKCjA4LzIyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFzIGRpc2N1c3NlZCBpbiBidWcgIzc3MjQ1MywgdGhlIFNXSUcgbGlicmFyeSBkaXJlY3RvcnkgaXMgbm93IGluc3RhbGxlZAogICAgICAgICAgICBpbnRvIGEgZGlmZmVyZW50IGRlZmF1bHQgZGlyZWN0b3J5LiBUaGUgbGlicmFyeSB1c2VkIHRvIGJlIGluc3RhbGxlZCB0bwogICAgICAgICAgICAvdXNyL2xvY2FsL2xpYi9zd2lnMS4zLiBJdCBpcyBub3cgaW4gdGhlIG1vcmUgdXN1YWwgYXJjaGl0ZWN0dXJlIGluZGVwZW5kZW50CiAgICAgICAgICAgIGRpcmVjdG9yeSBhbmQgSSBoYXZlIGFkZGl0aW9uYWxseSB1c2VkIGEgdmVyc2lvbiBzcGVjaWZpYyBzdWJkaXJlY3RvcnkgYXMKICAgICAgICAgICAgdGhlIGxpYnJhcnkgd2lsbCByYXJlbHkgd29yayB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIFNXSUcuIFRoaXMgcmVsZWFzZQogICAgICAgICAgICB3aWxsIHRodXMgdXNlIC91c3IvbG9jYWwvc2hhcmUvc3dpZy8xLjMuMjIgYnkgZGVmYXVsdCwgd2hpY2ggY2FuIGJlCiAgICAgICAgICAgIHRhaWxvcmVkIGFzIGJlZm9yZSB1c2luZyAnLi9jb25maWd1cmUgLS1zd2lnbGliZGlyJy4KCjA4LzE3LzIwMDQ6IG1rb2VwcGUKCSAgICBbTXpTY2hlbWVdIEFkZCBzdXBwb3J0IHRvIGNyZWF0ZSBuYXRpdmUgTXpTY2hlbWUgc3RydWN0dXJlcyBmcm9tIEMgc3RydWN0dXJlcy4KCSAgICBUbyBjb252ZXJ0IGEgQyBzdHJ1Y3R1cmUgdG8gYW4gTXpTY2hlbWUgc3RydWN0dXJlLCB1c2UgdGhlIG5ldyBydW50aW1lIG1hY3JvCgkgICAgU1dJR19OZXdTdHJ1Y3RGcm9tUHRyIGluIGEgdHlwZW1hcC4gIFBhdGNoIGZyb20gRG1pdHJpeSBaYXZpbi4gCgowOC8xMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCAjODM3NzE1IGZyb20gQmVuIFJlc2VyIHRvIGNvcnJlY3RseSBkZXRlY3QgUHl0aG9uIGxpYiBkaXJlY3RvcnkKICAgICAgICAgICAgb24gNjQgYml0IHN5c3RlbXMuCgowOC8xMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMgYW5kIEphdmFdIFByZXZlbnQgbWVtb3J5IGxlYWtzIGluIHRoZSBjYXNlIG9mIGVhcmx5IHJldHVybgogICAgICAgICAgICBmcm9tIHdyYXBwZXIgbWV0aG9kcyB1c2luZyBjb25zdCBzdGQ6OnN0cmluZyAmIHBhcmFtZXRlcnMuIE1vZGlmaWVkCiAgICAgICAgICAgIE1hcmsgVHJhdWR0IHBhdGNoICM5NTE1NjUuCgowOC8xMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBCdWcgIzk0Mzc4MyB3aXRoIHBhdGNoIGZpeGVzIHBocCBjaGFyICogb3V0IHR5cGVtYXAgTlVMTCB2YWx1ZXMuCgowOC8wMy8yMDA0OiBBaG1vbiBEYW5jeSAgPGRhbmN5QGRhbmN5PgoKICAgICAgICAgICAgW2FsbGVncm9jbF0gQWRkaXRpb25hbCBjYXNlIG1vZGUgZml4ZXMuICBBbHNvLCBtYWtlIHN1cmUKCSAgICBmb3JlaWduIHR5cGVzIGFyZSBleHBvcnRlZC4KCjA3LzI0LzIwMDQ6IG1rb2VwcGUgCgkgICAgW0d1aWxlXSBJbiAtc2NtIG1vZGUsIFNXSUcgbW9kdWxlcyBub3cgZXhjaGFuZ2UgdGhlaXIgcG9pbnRlciB0eXBlCgkgICAgaW5mb3JtYXRpb24gdmlhIHRoZSBHdWlsZSBpbnRlcnByZXRlci4gIEl0IGlzIG5vIGxvbmdlciBuZWNlc3NhcnkgdG8gYnVpbGQgYQoJICAgIHJ1bnRpbWUgbGlicmFyeSBvciB0byB1c2UgLW5vcnVudGltZSBhbmQgLXJ1bnRpbWUgZXRjLgoJICAgIAoJICAgIFRoZSBtb2R1bGUgKFN3aWcgc3dpZ3J1bikgd2hpY2ggd2FzIGludHJvZHVjZWQgaW4gdGhlIGNoYW5nZSBvZiAwNS8xNy8yMDA0IGlzCgkgICAgbm8gbG9uZ2VyIGF1dG9tYXRpY2FsbHkgYnVpbHQuICBJZiB5b3UgbmVlZCBpdCwgcnVuIFNXSUcgb24gdGhlIGludGVyZmFjZSBmaWxlCgkgICAgc3dpZ3J1bi5pLiAKCjA3LzIzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQnVnICM5MTc2MDEgTWFwcGluZyBDKysgYm9vbCBmaXggZnJvbSBNYXJrIFRyYXVkdAoKMDcvMjMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUlBNIGZpeGVzIGZvciBsYXRlc3QgQ1ZTIHZlcnNpb24gaW5jbHVkaW5nIHJlbW92YWwgb2YgcnVudGltZQogICAgICAgICAgICBsaWJyYXJ5LgoKMDcvMjMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggIzkwODk1NSBmcm9tIFJvYmVydCBIIERlIFZyaWVzLgogICAgICAgICAgICBSUE0gZmlsZSBnZW5lcmF0aW9uIGZpeCBmb3IgRmVkb3JlIENvcmUgMSBhbmQgUmVkaGF0IEFTMi4xLgoKMDcvMTIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggIzg2NDY4OSBmcm9tIFJvYmluIER1bm46CgogICAgICAgICAgICBUaGlzIHBhdGNoIGNvcnJlY3RzIHR3byBwcm9ibGVtcyBpbiB0aGUgWE1MIG91dHB1dCBvZiBTV0lHOgogICAgICAgICAgICAgCiAgICAgICAgICAgICAgMS4gVGhlcmUgd2VyZSBvZnRlbiBleHRyYSAnLz5cbicgaW4gdGhlIG91dHB1dC4KICAgICAgICAgICAgICAKICAgICAgICAgICAgICAyLiB2YWx1ZSBhdHRyaWJ1dGVzIHdlcmUgb3V0cHV0IHdpdGggJ1xuJyBpbiB0aGVtIGJ1dAogICAgICAgICAgICAgIHNpbmNlIHRoYXQgaXMgbm90IHRlY2huaWNhbGx5IGxlZ2FsIG1vc3QgKGFsbD8pIFhNTAogICAgICAgICAgICAgIHBhcnNlcnMgd2lsbCBzdHJpcCB0aGVtIG91dC4gUmVwbGFjaW5nIHRoZSAnXG4nIHdpdGgKICAgICAgICAgICAgICB0aGUgJyYjMTA7JyBlbnRpdHkgcmVmZXJlbmNlIHNvbHZlcyB0aGlzIGFzIHRoYXQgaXMKICAgICAgICAgICAgICBsZWdhbCBhbmQgWE1MIHBhcnNlcnMgd2lsbCBjb252ZXJ0IGl0IHRvIGEgJ1xuJyB3aGVuCiAgICAgICAgICAgICAgcmVhZGluZyB0aGUgdmFsdWVzIGJhY2sgaW4uCiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgVGhpcyBwYXRjaCBhbHNvIGFkZHMgYSBuZXcgZ2xvYmFsIGNvbW1hbmQgbGluZSBvcHRpb24KICAgICAgICAgICAgICB0aGF0IHdpbGwgYWxsb3cgdGhlIHBhcnNlIHRyZWUgdG8gYmUgd3JpdHRlbiBvdXQgaW4gWE1MCiAgICAgICAgICAgICAgKmFmdGVyKiBzb21lIG90aGVyIGxhbmd1YWdlIG1vZHVsZSBoYXMgYmVlbiBydW4sIGluCiAgICAgICAgICAgICAgb3JkZXIgdG8gYmUgYWJsZSB0byBnZXQgZXh0cmEgaW5mbyB0aGF0IHRoZSBsYW5ndWFnZQogICAgICAgICAgICAgIG1vZHVsZSBwdXRzIGluIHRoZSB0cmVlLiBJbiB0aGlzIHdheSB0aGUgWE1MIGlzIGEKICAgICAgICAgICAgICBwb3N0LXByb2Nlc3NlZCB2ZXJzaW9uIG9mIHRoZSB0cmVlIHJhdGhlciB0aGFuIGEKICAgICAgICAgICAgICBwcmUtcHJvY2Vzc2VkIHZlcnNpb24uIAogCiAgICAgICAgICAgICAgQ29tbWFuZCBsaW5lIG9wdGlvbiBpcyAtZHVtcF94bWwgb3IgLXhtbG91dCA8ZmlsZT4KCjA3LzEyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBQYXRjaCBmcm9tIFNjb3R0IE1pY2hlbCB0byBmaXggdHlwZXNhZmUgZW51bXMgYW5kIHByb3BlciBlbnVtcwogICAgICAgICAgICB3aXRoIGRpcmVjdG9ycy4KCjA3LzEyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEhUTUwgZG9jdW1lbnRhdGlvbiAobWFrZWNoYXAucHkpIGZpbGUgZ2VuZXJhdG9yIG1pc3NpbmcgZW5kIG9mIGxpbmUKICAgICAgICAgICAgcGF0Y2ggIzkwODk1MSBmcm9tIFJvYmVydCBkZSBWcmllcy4KCjA3LzA4LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFRoZSBkZXByZWNhdGVkIHJ1bnRpbWUgbGlicmFyeSBidWlsZCBoYXMgYmVlbiByZW1vdmVkLiBUaGlzIGFsc28gcmVtb3ZlcwogICAgICAgICAgICB0aGUgZGVwZW5kZW5jeSBvbiBMaWJ0b29sLiBMaWJ0b29sIGlzIG5vIGxvbmdlciByZXF1aXJlZCB0byBidWlsZCBTV0lHLgogICAgICAgICAgICBUaGUgYXNzb2NpYXRlZCAtbGRmbGFncyBTV0lHIGNvbW1hbmRsaW5lIG9wdGlvbiBoYXMgYWxzbyBiZWVuIHJlbW92ZWQuCgogICAgICAgICAgICBUaGUgZXhhbXBsZXMgYW5kIHRlc3Qtc3VpdGUgdGVzdGNhc2VzIHRoYXQgdXNlZCB0aGUgcnVudGltZSBsaWJyYXJ5IGhhdmUKICAgICAgICAgICAgYmVlbiB1cGRhdGVkIHRvIHVzZSB0aGUgcmVwbGFjZW1lbnQgYXBwcm9hY2ggdG8gdXNpbmcgU1dJRyBhY3Jvc3MgCiAgICAgICAgICAgIG11bHRpcGxlIG1vZHVsZXMsIHRoYXQgaXMgdGhleSB1c2UgdGhlIC1ub3J1bnRpbWUgYW5kIC1ydW50aW1lIGNvbW1hbmRsaW5lCiAgICAgICAgICAgIG9wdGlvbnMsIHNlZSBNb2R1bGVzLmh0bWwuIEVmZmVjdGl2ZWx5IHRoZXkgYnVpbGQgdGhlaXIgb3duIHJ1bnRpbWUKICAgICAgICAgICAgbGlicmFyaWVzIHVzaW5nIC1ydW50aW1lLiBUaGUgZXhhbXBsZXMgYXJlIGltcG9ydCBhbmQgaW1wb3J0X3RlbXBsYXRlLgogICAgICAgICAgICBUaGUgdGVzdCBjYXNlcyBhcmUgaW4gdGhlIGltcG9ydHMgYW5kIHRlbXBsYXRlX3R5cGVkZWZfaW1wb3J0IGRpcmVjdG9yaWVzLgoKICAgICAgICAgICAgQW55b25lIHdobyB3YW50cyB0aGUgb3JpZ2luYWwgcnVudGltZSBsaWJyYXJpZXMgY2FuIGVpdGhlciBydW4gdGhlIHRlc3Qtc3VpdGUKICAgICAgICAgICAgb3IgYnVpbGQgdGhlIGV4YW1wbGVzIGFuZCB1c2UgdGhlIGFwcHJvcHJpYXRlIHNoYXJlZCBvYmplY3QvRExMIHRoYXQgaXMKICAgICAgICAgICAgZ2VuZXJhdGVkIHdpdGggdGhlIC1ydW50aW1lIGNvbW1hbmRsaW5lIG9wdGlvbi4gRm9yIGV4YW1wbGUgbGliaW1wb3J0c19ydW50aW1lLnNvCiAgICAgICAgICAgIChQeXRob24gY2FsbHMgaXQgbGliX2ltcG9ydHNfcnVudGltZS5zbykgaXMgZ2VuZXJhdGVkIGFmdGVyIHJ1bm5pbmcgdGhlIAogICAgICAgICAgICAnbWFrZSBpbXBvcnRzLm11bHRpY3BwdGVzdCcgdGVzdGNhc2UgaW4gdGhlIEV4YW1wbGVzL3Rlc3Qtc3VpdGUvPGxhbmc+CiAgICAgICAgICAgIGRpcmVjdG9yeS4gT3IgdXNlIGxpYnJ1bnRpbWUuc28gLyBydW50aW1lLmRsbCBhZnRlciBidWlsZGluZyB0aGUgaW1wb3J0CiAgICAgICAgICAgIGV4YW1wbGVzIGluIEV4YW1wbGVzLzxsYW5nPi9pbXBvcnQuCgowNy8wNy8yMDA0OiBta29lcHBlCgkgICAgW0FsbGVncm8gQ0xdIENvbnZlcnQgY2hhcmFjdGVyIGFuZCBzdHJpbmcgbGl0ZXJhbHMgaW4gY29uc3RhbnRzIHRvIAoJICAgIENMIHN5bnRheC4gIEZpeCBGRjpERUYtRk9SRUlHTi1DQUxMIGZvciBtaXhlZC1jYXNlIEMgZnVuY3Rpb25zLgoKMDYvMjcvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIE5ldyBmZWF0dXJlIGZvciBKYXZhIGV4Y2VwdGlvbnMgd2l0aCBmb3JtYXQgJWphdmFleGNlcHRpb24oZXhjZXB0aW9uY2xhc3NlcykuCiAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBpcyBhIHNsaWdodCBlbmhhbmNlbWVudCB0byAlZXhjZXB0aW9uIGFuZCB0aGUgb25seSBkaWZmZXJlbmNlIGlzIHRoZSAKICAgICAgICAgICAgYWRkaXRpb24gb2YgdGhlIGV4Y2VwdGlvbiBjbGFzc2VzIHdoaWNoIGFyZSBnZW5lcmF0ZWQgaW50byBhIHRocm93cyBjbGF1c2UuCiAgICAgICAgICAgIFRoZSAnZXhjZXB0aW9uY2xhc3NlcycgaXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBjbGFzc2VzIHdoaWNoIHdpbGwgYmUKICAgICAgICAgICAgYWRkZWQgdG8gdGhlIGFzc29jaWF0ZWQgcHJveHkgbWV0aG9kJ3MgdGhyb3dzIGNsYXVzZS4gVGhlICdleGNlcHRpb25jbGFzc2VzJwogICAgICAgICAgICBhcmUgc3BlY2lmaWVkIGxpa2UgdGhlIGV4Y2VwdGlvbiBjbGFzc2VzIGluIHRoZSAndGhyb3dzJyBhdHRyaWJ1dGUgaW4gdGhlCiAgICAgICAgICAgIHR5cGVtYXBzLiBUaGlzIGZlYXR1cmUgc2hvdWxkIGJlIHVzZWQgZm9yIGNvcnJlY3RseSBoYW5kbGluZyBjaGVja2VkIGV4Y2VwdGlvbnMKICAgICAgICAgICAgdGhyb3duIGZyb20gSk5JIGNvZGUuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlamF2YWV4Y2VwdGlvbigiamF2YS5sYW5nLkV4Y2VwdGlvbiIpIHRocm93RXhjZXB0aW9uICV7CiAgICAgICAgICAgICAgICAuLi4gY29udmVydCBhIHN0ZDo6bG9naWNfZXJyb3IgaW50byBhIGphdmEubGFuZy5FeGNlcHRpb24gdXNpbmcgSk5JIGNvZGUgLi4uCiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICAgI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KICAgICAgICAgICAgICB2b2lkIHRocm93RXhjZXB0aW9uKCkgewogICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvcigiTG9naWMgZXJyb3IhIik7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgd2lsbCBnZW5lcmF0ZSBhIG1ldGhvZCB3aXRoIGEgdGhyb3dzIGNsYXVzZSBpbiB0aGUgbW9kdWxlIGNsYXNzOgoKICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGhyb3dFeGNlcHRpb24oKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7IC4uLiB9CgowNi8yNy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIE5ldyAlY3Njb25zdHZhbHVlKHZhbHVlKSBmZWF0dXJlIGRpcmVjdGl2ZSBmb3IgdXNlIHdpdGggY29uc3RhbnRzIGFuZAogICAgICAgICAgICBlbnVtcy4gVGhpcyB3b3JrcyB0aGUgc2FtZSB3YXkgYXMgJWphdmFjb25zdHZhbHVlLiBGb3IgQyMsIHRoaXMgZGlyZWN0aXZlCiAgICAgICAgICAgIGlzIHRoZSBvbmx5IHdheSB0aGF0IG9uZSBjYW4gZml4IHdyYXBwaW5nIG9mIEMvQysrIGVudW1zIHdpdGggcHJvcGVyIEMjCiAgICAgICAgICAgIGVudW1zIGlmIHRoZSBlbnVtIGl0ZW0ncyBpbml0aWFsaXNlciBjYW5ub3QgY29tcGlsZSBhcyBDIyBjb2RlLiBUaGlzIGlzCiAgICAgICAgICAgIGJlY2F1c2UgSmF2YSBlbnVtcyBjYW4gdXNlIGEgY2FsbCBpbnRvIEMgY29kZSB0byBpbml0aWFsaXNlIHRoZSBlbnVtIGl0ZW0sCiAgICAgICAgICAgIHdoZXJlYXMgaW4gQyMsIHRoZSBlbnVtIHZhbHVlIG11c3QgYmUgYSBjb21waWxlIHRpbWUgY29uc3RhbnQuIFRoYXQgaXMsCiAgICAgICAgICAgIHVzaW5nICVjc2NvbnN0KDApIGNhbm5vdCBiZSB1c2VkIGluIEMjIHRvIGluaXRpYWxpc2UgdGhlIEMjIGVudW0gaXRlbSB2aWEKICAgICAgICAgICAgYSBQSU5WT0tFIGNhbGwuCgowNi8yNy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gTmV3ICVqYXZhY29uc3R2YWx1ZSh2YWx1ZSkgZmVhdHVyZSBkaXJlY3RpdmUgZm9yIHVzZSB3aXRoIGNvbnN0YW50cyBhbmQKICAgICAgICAgICAgZW51bXMuIFNvbWV0aW1lcyB0aGUgdXNlIG9mICVqYXZhY29uc3QoMSkgd2lsbCBwcm9kdWNlIGNvZGUgdGhhdCB3b24ndCBjb21waWxlCiAgICAgICAgICAgIHVuZGVyIEphdmEuIElmIGEgY29tcGlsZSB0aW1lIGNvbnN0YW50IGlzIHJlcXVpcmVkLCAlamF2YWNvbnN0KDApIGlzIG5vdCBhbgogICAgICAgICAgICBvcHRpb24uIFRoZSAlamF2YWNvbnN0dmFsdWUgZGlyZWN0aXZlIGFjaGlldmVzIHRoaXMgZ29hbCBhbmQgdGhlIHZhbHVlIHNwZWNpZmllZAogICAgICAgICAgICBpcyBnZW5lcmF0ZWQgYXMgSmF2YSBjb2RlIHRvIGluaXRpYWxpc2UgdGhlIGNvbnN0YW50LiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVqYXZhY29uc3QoMSk7CiAgICAgICAgICAgICAgJWphdmFjb25zdHZhbHVlKDEwMDApIEJJRzsKICAgICAgICAgICAgICAlamF2YWNvbnN0dmFsdWUoIm5ldyBqYXZhLm1hdGguQmlnSW50ZWdlcihcIjIwMDBcIikiKSBMQVJHRTsKICAgICAgICAgICAgICAlamF2YWNvbnN0dmFsdWUoMTApIGJhcjsKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgICAgY29uc3QgaW50IGJhciA9IDEwOwogICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgJWlubGluZSAlewogICAgICAgICAgICAgICAgI2RlZmluZSBCSUcgMTAwMExMCiAgICAgICAgICAgICAgICAjZGVmaW5lIExBUkdFIDIwMDBVTEwKICAgICAgICAgICAgICAgIGVudW0gRm9vIHsgQkFSID0gOjpiYXIgfTsKICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgR2VuZXJhdGVzOgoKICAgICAgICAgICAgICBwdWJsaWMgaW50ZXJmYWNlIGV4YW1wbGVDb25zdGFudHMgewogICAgICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBsb25nIEJJRyA9IDEwMDA7CiAgICAgICAgICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIExBUkdFID0gbmV3IGphdmEubWF0aC5CaWdJbnRlZ2VyKCIyMDAwIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBGb28gQkFSID0gbmV3IEZvbygiQkFSIiwgMTApOwogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgUHJldmlvdXNseSwgbm9uZSBvZiBCSUcsIExBUkdFIG9yIEJBUiB3b3VsZCBoYXZlIHByb2R1Y2VkIGNvbXBpbGFibGUgY29kZQogICAgICAgICAgICB3aGVuIHVzaW5nICVqYXZhY29uc3QoMSkuCgowNi8yNy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICAlZmVhdHVyZSBlbmhhbmNlbWVudHMuIEZlYXR1cmVzIGNhbiBub3cgdGFrZSBhbiB1bmxpbWl0ZWQgbnVtYmVyIG9mIGF0dHJpYnV0ZXMKICAgICAgICAgICAgaW4gYWRkaXRpb24gdG8gdGhlIGZlYXR1cmUgbmFtZSBhbmQgZmVhdHVyZSB2YWx1ZS4gVGhlIGF0dHJpYnV0ZXMgYXJlIG9wdGlvbmFsIAogICAgICAgICAgICBhbmQgYXJlIG11Y2ggdGhlIHNhbWUgYXMgdGhlIHR5cGVtYXAgYXR0cmlidXRlcy4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcKICAgICAgICAgICAgc3BlY2lmaWVzIHR3byBvcHRpb25hbCBhdHRyaWJ1dGVzLCBhdHRyaWIxIGFuZCBhdHRyaWIyOgoKICAgICAgICAgICAgICVmZWF0dXJlKGZlYXR1cmVuYW1lLCBhdHRyaWIxPSJhdHRyaWJ2YWwxIiwgYXR0cmliMj0iYXR0cmlidmFsMiIpIG5hbWUgInZhbCI7CiAgICAgICAgICAgICAlZmVhdHVyZShmZWF0dXJlbmFtZSwgdmFsLCBhdHRyaWIxPSJhdHRyaWJ2YWwxIiwgYXR0cmliMj0iYXR0cmlidmFsMiIpIG5hbWU7CgowNi8yNy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICAlZmVhdHVyZSBpbXByb3ZlbWVudHMgZm9yIHRoZSBzeW50YXggdGhhdCB0YWtlcyB0aGUgZmVhdHVyZSB2YWx1ZSB3aXRoaW4gdGhlCiAgICAgICAgICAgICVmZWF0dXJlKCkgYnJhY2tldHMuIFRoZSB2YWx1ZSBzcGVjaWZpZWQgaXMgbm8gbG9uZ2VyIHJlc3RyaWN0ZWQgdG8gYmVpbmcganVzdAogICAgICAgICAgICBhIHN0cmluZy4gSXQgY2FuIGJlIGEgc3RyaW5nIG9yIGEgbnVtYmVyLiBGb3IgZXhhbXBsZSwgdGhpcyBpcyBub3cgYWNjZXB0YWJsZQogICAgICAgICAgICBzeW50YXg6CiAgICAgICAgICAgICAgJWZlYXR1cmUoImZlYXR1cmVuYW1lIiwyMC4wKTsKICAgICAgICAgICAgd2hlcmVhcyBwcmV2aW91c2x5IGl0IHdvdWxkIGhhdmUgdG8gaGF2ZSBiZWVuOgogICAgICAgICAgICAgICVmZWF0dXJlKCJmZWF0dXJlbmFtZSIsIjIwLjAiKTsKICAgICAgICAgICAgVXNlZnVsIGZvciBmZWF0dXJlcyB0aGF0IGFyZSBpbXBsZW1lbnRlZCBhcyBhIG1hY3JvLCBmb3IgZXhhbXBsZToKICAgICAgICAgICAgICAjZGVmaW5lICVzb21lZmVhdHVyZSh2YWx1ZSkgICAgICAlZmVhdHVyZSgic29tZWZlYXR1cmUiLHZhbHVlKQogICAgICAgICAgICBUaGVzZSB3aWxsIG5vdyB3b3JrIGFjY2VwdGluZyBlaXRoZXIgYSBzdHJpbmcgb3IgYSBudW1iZXI6CiAgICAgICAgICAgICAgJXNvbWVmZWF0dXJlKCJGcmVkIik7CiAgICAgICAgICAgICAgJXNvbWVmZWF0dXJlKDQpOwoKMDYvMDYvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtDaGlja2VuLCBHdWlsZV0KICAgICAgICAgICAgIC0gQ3JlYXRlZCB0aGUgRXhhbXBsZXMvdGVzdC1zdWl0ZS9zY2hlbWVydW5tZSBkaXJlY3RvcnksIHdoaWNoIGhvbGRzIGFsbCB0aGUKCSAgICAgICBydW5tZSBzY3JpcHRzIGZvciBndWlsZSBhbmQgY2hpY2tlbiAoYW5kIHBvc3NpYmx5IG16c2NoZW1lLi4uKS4gIFRoZSBndWlsZQoJICAgICAgIGFuZCBjaGlja2VuIF9ydW5tZSBmaWxlcyB0aGVuIChsb2FkICIuLi9zY2hlbWVydW5tZS9mb28uc2NtIikuCiAgICAgICAgICAgICAtIEluIGNoaWNrZW4gbW9kdWxlLCBmaXggYSBmZXcgYnVncyBpbnZsb2x2aW5nIGR5bmFtaWMgY2FzdHMuCgowNi8wMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCB0byBmaXggd3JhcHBpbmcgb2YgdGVtcGxhdGVkIG1ldGhvZHMuIElTTyBjb21wbGlhbnQgY29tcGlsZXJzLCBsaWtlCiAgICAgICAgICAgIENvbWVhdSBhbmQgR0NDLTMuNC4wLCBkb24ndCBsaWtlIHRoZSB0ZW1wbGF0ZSBzcGVjaWZpZXIgdGhhdCBTV0lHIHdhcyBnZW5lcmF0aW5nCiAgICAgICAgICAgIHdoZW4gY2FsbGluZyB0aGUgbWV0aG9kLiBUaGlzIGZpeCBtYXkgYnJlYWsgc29tZSBub24gc3RhbmRhcmQgY29tcGxpYW50IGNvbXBpbGVycywKICAgICAgICAgICAgZm9yIGV4YW1wbGUsIFN1biB3b3Jrc2hvcCBjb21waWxlcnMgcHJpb3IgdG8gdmVyc2lvbiA2LjIucDIuIFBhdGNoIHN1Ym1pdHRlZAogICAgICAgICAgICBieSBCaWxsIENsYXJrZS4KCjA2LzAzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gVW5kb2N1bWVudGVkIHNwZWNpYWwgdmFyaWFibGUgJGltY2xhc3NuYW1lIHJlbW92ZWQuCiAgICAgICAgICAgIE5ldyBzcGVjaWFsIHZhcmlhYmxlICRtb2R1bGUgaXMgcmVwbGFjZWQgYnkgdGhlIG1vZHVsZSBuYW1lLCBhcyBzcGVjaWZpZWQKICAgICAgICAgICAgYnkgJW1vZHVsZSBvciAtbW9kdWxlIGNvbW1hbmRsaW5lIG9wdGlvbi4gJGltY2xhc3NuYW1lIGNhbiBiZSBjcmVhdGVkIGZyb20gJG1vZHVsZS4KCjA2LzAzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gU2FtZSBhcyBmb3IgSmF2YSBiZWxvdy4gVGhlIG5ldyB0eXBlbWFwcyBhcmUgbmFtZWQgZGlmZmVyZW50bHksIG5hbWVseSwKICAgICAgICAgICAgY3Nib2R5IGFuZCBjc2JvZHlfZGVyaXZlZC4gVGhlIGRlcHJlY2F0ZWQgdHlwZW1hcHMgYXJlIGNzZ2V0Y3B0ciBhbmQKICAgICAgICAgICAgY3NwdHJjb25zdHJ1Y3Rvcm1vZGlmaWVycy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBDIyBNT0RVTEUgKioqCgowNi8wMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gVHlwZW1hcCBjaGFuZ2VzIGZvciB0aGUgSmF2YSBwcm94eSAvIHR5cGV3cmFwcGVyIGFuZCBlbnVtIGNsYXNzZXMuIEEgbmV3CiAgICAgICAgICAgIHR5cGVtYXAgY2FsbGVkIGphdmFib2R5IGNvbnRhaW5zIHRoZSBlc3NlbnRpYWwgc3VwcG9ydCBjb2RlIGZvciBnZW5lcmF0aW9uIGludG8gdGhlIGJvZHkKICAgICAgICAgICAgb2YgdGhlc2UgY2xhc3Nlcy4gVGhlcmUgaXMgYWxzbyBhIG5ldyBqYXZhYm9keV9kZXJpdmVkIHR5cGVtYXAgd2hpY2ggaXMgdXNlZCBpbnN0ZWFkIGZvcgogICAgICAgICAgICB3cmFwcGVkIGNsYXNzZXMgdGhhdCBoYXZlIGEgd3JhcHBlZCBiYXNlIGNsYXNzLiBUaGUgY29kZSBpcyBiYXNpY2FsbHksIHRoZSBnZXRDUHRyKCkKICAgICAgICAgICAgbWV0aG9kIGFuZCBzd2lnQ1B0ciBhbmQgc3dpZ0NNZW1Pd24gbWVtYmVyIHZhcmlhYmxlcy4gVGhlc2UgdXNlZCB0byBiZSBoYXJkIGNvZGVkCiAgICAgICAgICAgIHdpdGggbm8gd2F5IHRvIG1vZGlmeSB0aGUgY29kZS4gVGhlIGludHJvZHVjdGlvbiBvZiB0aGlzIHR5cGVtYXAgbWFrZXMgaXQgcG9zc2libGUgZm9yCiAgICAgICAgICAgIHRoZSB1c2VyIHRvIHRhaWxvciBuZWFybHkgZXZlcnkgYXNwZWN0IG9mIHRoZSBjb2RlIGdlbmVyYXRpb24uCiAgICAgICAgICAgIFRoZSBleGNlcHRpb24gbm93IGlzIHRoZSBjb2RlIGZvciBkaXJlY3RvciBjbGFzc2VzLgoKICAgICAgICAgICAgVGhlIGphdmFnZXRjcHRyIGFuZCBqYXZhcHRyY29uc3RydWN0b3Jtb2RpZmllcnMgdHlwZW1hcHMgYXJlIGRlcHJlY2F0ZWQgYW5kIGFyZQogICAgICAgICAgICBubyBsb25nZXIgdXNlZCBhcyB0aGUgY29kZSB0aGF0IHRoZXNlIGdlbmVyYXRlZCBjYW4gYmUgcHV0IGluIHRoZSBtb3JlIGZsZXhpYmxlCiAgICAgICAgICAgIGphdmFib2R5IGFuZCBqYXZhYm9keV9kZXJpdmVkIHR5cGVtYXBzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBtYWNyb3MgY29udHJpYnV0ZWQgYnkgU2NvdHQgTWljaGVsIG1heSBoZWxwIHlvdSB1cGdyYWRlIGlmIHlvdSBoYXZlIHVzZWQKICAgICAgICAgICAgdGhlIGphdmFnZXRjcHRyIHR5cGVtYXA6CgogICAgICAgICAgICAgICAgLyogVXRpbGl0eSBtYWNybyBmb3IgbWFuaXB1bGF0aW5nIHRoZSBKYXZhIGJvZHkgY29kZSBtZXRob2QgYXR0cmlidXRlcyAqLwogICAgICAgICAgICAgICAgJWRlZmluZSBTV0lHSkFWQV9BVFRSSUJTKFRZUEVOQU1FLCBDVE9SX0FUVFJJQiwgR0VUQ1BUUl9BVFRSSUIpCiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhYm9keSkgVFlQRU5BTUUgJXsKICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBsb25nIHN3aWdDUHRyOwogICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzd2lnQ01lbU93bjsKCiAgICAgICAgICAgICAgICAgIENUT1JfQVRUUklCICRqYXZhY2xhc3NuYW1lKGxvbmcgY1B0ciwgYm9vbGVhbiBjTWVtb3J5T3duKSB7CiAgICAgICAgICAgICAgICAgICAgc3dpZ0NNZW1Pd24gPSBjTWVtb3J5T3duOwogICAgICAgICAgICAgICAgICAgIHN3aWdDUHRyID0gY1B0cjsKICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgR0VUQ1BUUl9BVFRSSUIgc3RhdGljIGxvbmcgZ2V0Q1B0cigkamF2YWNsYXNzbmFtZSBvYmopIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG9iaiA9PSBudWxsKSA/IDAgOiBvYmouc3dpZ0NQdHI7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICV9CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWJvZHlfZGVyaXZlZCkgVFlQRU5BTUUgJXsKICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBsb25nIHN3aWdDUHRyOwoKICAgICAgICAgICAgICAgICAgQ1RPUl9BVFRSSUIgJGphdmFjbGFzc25hbWUobG9uZyBjUHRyLCBib29sZWFuIGNNZW1vcnlPd24pIHsKICAgICAgICAgICAgICAgICAgICBzdXBlcigkbW9kdWxlSk5JLlNXSUckamF2YWNsYXNzbmFtZVVwY2FzdChjUHRyKSwgY01lbW9yeU93bik7CiAgICAgICAgICAgICAgICAgICAgc3dpZ0NQdHIgPSBjUHRyOwogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICBHRVRDUFRSX0FUVFJJQiBzdGF0aWMgbG9uZyBnZXRDUHRyKCRqYXZhY2xhc3NuYW1lIG9iaikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAob2JqID09IG51bGwpID8gMCA6IG9iai5zd2lnQ1B0cjsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICAgICVlbmRkZWYKCiAgICAgICAgICAgICAgICAvKiBUaGUgZGVmYXVsdCBpcyBwcm90ZWN0ZWQgZ2V0Q1B0ciwgcHJvdGVjdGVkIGNvbnN0cnVjdG9yICovCiAgICAgICAgICAgICAgICBTV0lHSkFWQV9BVFRSSUJTKFNXSUdUWVBFLCBwcm90ZWN0ZWQsIHByb3RlY3RlZCkKCiAgICAgICAgICAgICAgICAvKiBQdWJsaWMgZ2V0Q1B0ciBtZXRob2QsIHByb3RlY3RlZCBjb25zdHJ1Y3RvciAqLwogICAgICAgICAgICAgICAgJWRlZmluZSBQVUJMSUNfR0VUQ1BUUihUWVBFTkFNRSkKICAgICAgICAgICAgICAgIFNXSUdKQVZBX0FUVFJJQlMoVFlQRU5BTUUsIHByb3RlY3RlZCwgcHVibGljKQogICAgICAgICAgICAgICAgJWVuZGRlZgoKICAgICAgICAgICAgICAgIC8qIFB1YmxpYyBnZXRDUHRyIG1ldGhvZCwgcHVibGljIGNvbnN0cnVjdG9yICovCiAgICAgICAgICAgICAgICAlZGVmaW5lIFBVQkxJQ19CT0RZTUVUSE9EUyhUWVBFTkFNRSkKICAgICAgICAgICAgICAgIFNXSUdKQVZBX0FUVFJJQlMoVFlQRU5BTUUsIHB1YmxpYywgcHVibGljKQogICAgICAgICAgICAgICAgJWVuZGRlZgoKMDYvMDMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBUaGUgY29udGVudHMgb2YgdGhlIGNsYXNzIG1vZGlmaWVyIHR5cGVtYXBzIGFuZCBwcmFnbWFzIGhhdmUgY2hhbmdlZC4KICAgICAgICAgICAgVGhleSBtdXN0IG5vdyBpbmNsdWRlIHRoZSBjbGFzcyB0eXBlLiBQcmV2aW91c2x5ICdjbGFzcycgd2FzIGhhcmQgY29kZWQuCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIGVuYWJsZXMgZmxleGliaWxpdHkgaW50byB3aGF0IHR5cGUgb2YgY2xhc3MgaXMgZ2VuZXJhdGVkLAogICAgICAgICAgICBmb3IgZXhhbXBsZSB0aGUgcHJveHkgY2xhc3MgY291bGQgYmUgYW4gaW50ZXJmYWNlIGluc3RlYWQgb2YgYSBjbGFzcy4KCiAgICAgICAgICAgIEZvciBKYXZhIHRoaXMgYWZmZWN0cyB0aGUgamF2YWNsYXNzbW9kaWZpZXJzIHR5cGVtYXAgYW5kIHRoZSBqbmljbGFzc2NsYXNzbW9kaWZpZXJzCiAgICAgICAgICAgIGFuZCBtb2R1bGVjbGFzc21vZGlmaWVycyBwcmFnbWFzLgoKICAgICAgICAgICAgRm9yIEMjIHRoaXMgYWZmZWN0cyB0aGUgY3NjbGFzc21vZGlmaWVycyB0eXBlbWFwIGFuZCB0aGUgaW1jbGFzc2NsYXNzbW9kaWZpZXJzCiAgICAgICAgICAgIGFuZCBtb2R1bGVjbGFzc21vZGlmaWVycyBwcmFnbWFzLgoKICAgICAgICAgICAgVW5sZXNzIHlvdSBoYXZlIG92ZXJyaWRkZW4gdGhlIGRlZmF1bHQgdmVyc2lvbnMgb2YgdGhlc2UgdHlwZW1hcHMgb3IgcHJhZ21hcywgeW91CiAgICAgICAgICAgIHNob3VsZG4ndCBiZSBhZmZlY3RlZC4gSG93ZXZlciwgaWYgeW91IGhhdmUsIHVwZ3JhZGluZyBpcyBlYXN5LCBmb3IgZXhhbXBsZQoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7fTsKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFjbGFzc21vZGlmaWVycykgRm9vICJwdWJsaWMgZmluYWwiCgogICAgICAgICAgICBtdXN0IG5vdyBiZToKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28ge307CiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhY2xhc3Ntb2RpZmllcnMpIEZvbyAicHVibGljIGZpbmFsIGNsYXNzIgoKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBDIyBNT0RVTEUgKioqCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjA1LzMxLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBmb3IgQysrIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9ucyB0aGF0IGFyZSByZWZlcmVuY2VzLiBQcm9ibGVtIHJlcG9ydGVkIGJ5CiAgICAgICAgICAgIE9yZW4gTWlsbGVyLiBBbHNvIGltcHJvdmVzIHRoZSBnZW5lcmF0ZWQgZXhjZXB0aW9uIGRlY2xhcmF0aW9ucyBpbiB0aGUKICAgICAgICAgICAgY2F0Y2ggaGFuZGxlciBmb3IgcG9pbnRlcnMgLSBhIHBvaW50ZXIgaXMgdXNlZCBpbnN0ZWFkIG9mIGEgcmVmZXJlbmNlIHRvCiAgICAgICAgICAgIGEgcG9pbnRlci4gQWRkZWQgZGVmYXVsdCB0aHJvd3MgdHlwZW1hcHMgZm9yIFNXSUdUWVBFICYsIFNXSUdUWVBFICogYW5kCiAgICAgICAgICAgIFNXSUdUWVBFW0FOWV0gKEphdmEgYW5kIEMjKS4KCjA1LzMxLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gU29tZSBtaW5vciB0eXBlc2FmZSBlbnVtIGltcHJvdmVtZW50cywgaW5jbHVkaW5nIHN0b3JpbmcgdGhlIG5hbWUgb2YKICAgICAgICAgICAgdGhlIGVudW0gaXRlbS4gVGhlIHRvU3JpbmcoKSAvIFRvU3RyaW5nKCkgbWV0aG9kcyBhcmUgb3ZlcnJpZGRlbiB0byByZXR1cm4gdGhpcyBuYW1lLgoKMDUvMzAvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtDaGlja2VuXSAKCSAgICAgLSBVcGRhdGUgaG93IGV4YW1wbGVzIGFuZCB0aGUgdGVzdCBzdWl0ZSBhcmUgYnVpbHQuCgkgICAgIC0gU3ltYm9sIG5hbWVzIGFyZSBubyBsb25nZXIgY29udmVydGVkIHRvIGxvd2VyIGNhc2UKCSAgICAgLSBBZGRlZCB1bmlvbl9ydW5tZS5zcywgd2hpY2ggd2FzIGNvcGllZCBhbmQgbW9kaWZpZWQgZnJvbSB0aGUgZ3VpbGUgbW9kdWxlCgowNS8yNi8yMDA0OiBsYmFsbGFiaW8gKEx1aWdpIEJhbGxhYmlvKQogICAgICAgICAgICBDb21taXR0ZWQgb24gYmVoYWxmIG9mIE1hcmNlbG8gKHdobyBzdGlsbCBoYXMgcHJvYmxlbXMgd2l0aCAKCSAgICB0aGUgU291cmNlRm9yZ2UgQ1ZTLikKCgkgICAgQWRkZWQgUHl0aG9uIHR5cGVtYXBzIGZvciBGSUxFKiB3aXRoIChQeXRob24tb25seSkgdGVzdC4KCjUvMjQvMjAwNDogIGRhbmN5CgoJKiBBbGxlZ3JvIENMIG1vZHVsZTogIE5vdyB1c2luZyBzb21lIG1hY3JvcyAoZGVmaW5lZCBpbgoJTGliL2FsbGVncm9jbC9hbGxlZ3JvY2wuc3dnKSwgc3dpZy1kZWZjb25zdGFudCBhbmQgc3dpZy1kZWZ1biwgZm9yCglkZWZpbmluZyBjb25zdGFudHMgYW5kIGZvcmVpZ24gZnVuY3Rpb25zLiAgVGhpcyBtYWtlcyB0aGUKCWdlbmVyYXRlZCBmaWxlIGEgYml0IG5lYXRlci4gICAgCgoJTm93IHN0cmlwcyBhIGxheWVyIG9mIHBhcmVudGhlc2lzIGZyb20gY29uc3RhbnRzLgoKCVVzZXMgKCogOnZvaWQpIGluc3RlYWQgb2YgOmZvcmVpZ24tYWRkcmVzcyBub3cuCgowNS8yMC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBVbm5hbWVkIGVudW0gZ2xvYmFsIHZhcmlhYmxlcyBhcmUgbm93IHN1cHBvcnRlZCBpbiBhZGRpdGlvbgogICAgICAgICAgICB0byB0aGUgcmVjZW50bHkgYWRkZWQgc3VwcG9ydCBmb3IgdW5uYW1lZCBlbnVtIG1lbWJlciB2YXJpYWJsZXMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICBlbnVtIHsgZW51bTEsIGVudW0yIH0gTWVtYmVySW5zdGFuY2U7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZW51bSB7IGVudW0zLCBlbnVtNCB9IEdsb2JhbEluc3RhbmNlOwoKICAgICAgICAgICAgVGhlIGludCB0eXBlbWFwcyBhcmUgdXNlZCBmb3Igd3JhcHBpbmcgdGhlIGdldC9zZXQgYWNjZXNzb3IgbWV0aG9kcy4KICAgICAgICAgICAgSWYgdGhlIHNpemVvZiBhbiBlbnVtIGlzIG5vdCB0aGUgc2FtZSBzaXplIGFzIGFuIGludCB0aGVuIHNldHRpbmcgdGhlCiAgICAgICAgICAgIHZhcmlhYmxlIHdpbGwgc2lsZW50bHkgZG8gbm90aGluZyBhcyB0aGUgY2FzdHMgY2Fubm90IGJlIGVhc2lseSBhbmQgcG9ydGFibHkKICAgICAgICAgICAgZ2VuZXJhdGVkLiBJZiB5b3UgbmVlZCB0byBzb2x2ZSB0aGlzIGhpZ2hseSBvYnNjdXJlIHNpdHVhdGlvbiwgd3JpdGUKICAgICAgICAgICAgdGhlIGFzc2lnbm1lbnQgdXNpbmcgdGhlICVleGNlcHRpb24gZmVhdHVyZS4KCjA1LzIwLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQyMgZW51bSB3cmFwcGluZyBtb2RzLiBTaW1pbGFyIHRvIHRoZSBKYXZhIG1vZHVsZSwgZW51bXMgY2FuIGJlIHdyYXBwZWQgdXNpbmcKICAgICAgICAgICAgb25lIG9mIDMgYXBwcm9hY2hlczoKCiAgICAgICAgICAgIDEpIFByb3BlciBDIyBlbnVtcyAtIHVzZSAlaW5jbHVkZSAiZW51bXMuc3dnIgogICAgICAgICAgICAyKSBUeXBlc2FmZSBlbnVtcyAtIHVzZSAlaW5jbHVkZSAiZW51bXR5cGVzYWZlLnN3ZyIKICAgICAgICAgICAgMykgU2ltcGxlIGNvbnN0YW50IGludGVnZXJzIChvcmlnaW5hbCBhcHByb2FjaCkgLSB1c2UgJWluY2x1ZGUgImVudW1zaW1wbGUuc3dnIgoKICAgICAgICAgICAgU2VlIGVhY2ggb2YgdGhlc2UgZmlsZXMgZm9yIGZ1cnRoZXIgZGV0YWlscy4gRWFjaCBvZiB0aGVzZSBmaWxlcyB1c2UgdHlwZW1hcHMKICAgICAgICAgICAgYW5kIGEgbmV3IGZlYXR1cmUgdG8gY29udHJvbCB0aGUgZ2VuZXJhdGVkIGNvZGUuIFRoZSBmZWF0dXJlIGlzOgoKICAgICAgICAgICAgICAgICVjc2VudW0od3JhcGFwcHJvYWNoKTsKCiAgICAgICAgICAgIHdoZXJlIHdyYXBhcHByb2FjaCBzaG91bGQgYmUgb25lIG9mOiAicHJvcGVyIiwgInR5cGVzYWZlIiwgInR5cGV1bnNhZmUiIG9yICJzaW1wbGUiLgogICAgICAgICAgICBbTm8gaW1wbGVtZW50YXRpb24gZGVlbWVkIG5lY2Vzc2FyeSBmb3IgdHlwZSB1bnNhZmUgZW51bXNdLgoKICAgICAgICAgICAgVGhlIGRlZmF1bHQgYXBwcm9hY2ggaXMgcHJvcGVyIEMjIGVudW1zLiBBbm9ueW1vdXMgZW51bXMgYXJlIGFsd2F5cyB3cmFwcGVkIGJ5CiAgICAgICAgICAgIGNvbnN0YW50IGludGVnZXJzLiAKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBDIyBNT0RVTEUgKioqCgowNS8yMC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gSmF2YSBlbnVtIHN1cHBvcnQgYWRkZWQuIFRoZXJlIGFyZSBub3cgNCB3YXlzIGluIHdoaWNoIGVudW1zIGNhbiBiZSB3cmFwcGVkOgoKICAgICAgICAgICAgMSkgUHJvcGVyIEphdmEgZW51bXMgLSB1c2UgJWluY2x1ZGUgImVudW1zLnN3ZyIKICAgICAgICAgICAgMikgVHlwZXNhZmUgZW51bXMgLSB1c2UgJWluY2x1ZGUgImVudW10eXBlc2FmZS5zd2ciCiAgICAgICAgICAgIDMpIFR5cGUgdW5zYWZlIGVudW1zIChjb25zdGFudCBpbnRlZ2VycykgLSB1c2UgJWluY2x1ZGUgImVudW10eXBldW5zYWZlLnN3ZyIKICAgICAgICAgICAgNCkgU2ltcGxlIGNvbnN0YW50IGludGVnZXJzIChvcmlnaW5hbCBhcHByb2FjaCkgLSB1c2UgJWluY2x1ZGUgImVudW1zaW1wbGUuc3dnIgoKICAgICAgICAgICAgU2VlIGVhY2ggb2YgdGhlc2UgZmlsZXMgZm9yIGZ1cnRoZXIgZGV0YWlscy4gRWFjaCBvZiB0aGVzZSBmaWxlcyB1c2UgdHlwZW1hcHMKICAgICAgICAgICAgYW5kIGEgbmV3IGZlYXR1cmUgdG8gY29udHJvbCB0aGUgZ2VuZXJhdGVkIGNvZGUuIFRoZSBmZWF0dXJlIGlzOgoKICAgICAgICAgICAgICAgICVqYXZhZW51bSh3cmFwYXBwcm9hY2gpOwoKICAgICAgICAgICAgd2hlcmUgd3JhcGFwcHJvYWNoIHNob3VsZCBiZSBvbmUgb2Y6ICJwcm9wZXIiLCAidHlwZXNhZmUiLCAidHlwZXVuc2FmZSIgb3IgInNpbXBsZSIuCiAgICAgICAgICAgIFRoZSBkZWZhdWx0IHR5cGVtYXBzIHdpbGwgaGFuZGxlIGVudW1zIHRoYXQgbWF5IG9yIG1heSBub3QgaGF2ZSBzcGVjaWZpZWQgaW5pdGlhbAogICAgICAgICAgICB2YWx1ZXMsIGZvciBleGFtcGxlIHRlbiBpcyBzcGVjaWZpZWQ6CgogICAgICAgICAgICAgICAgZW51bSBOdW1iZXJzIHsgemVybywgdGVuKDEwKSB9OwoKICAgICAgICAgICAgSG93ZXZlciwgdGhlIGFtb3VudCBvZiBnZW5lcmF0ZWQgSmF2YSBjb2RlIGNhbiBiZSBjdXQgZG93biwgYnkgbW9kaWZ5aW5nIHRoZXNlIHR5cGVtYXBzCiAgICAgICAgICAgIGlmIG5vbmUgb2YgdGhlIGVudW1zIGhhdmUgaW5pdGlhbCB2YWx1ZXMgKHByb3BlciBKYXZhIGVudW1zIGFuZCB0eXBlc2FmZSBlbnVtcyBhcHByb2FjaCkuCiAgICAgICAgICAgIAogICAgICAgICAgICBUaGUgZGVmYXVsdCBhcHByb2FjaCBpcyB0eXBlc2FmZSBlbnVtcy4gQW5vbnltb3VzIGVudW1zIGFyZSBhbHdheXMgd3JhcHBlZCBieQogICAgICAgICAgICBjb25zdGFudCBpbnRlZ2Vycy4gCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNS8xMS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEZpeCBidWcgdXNpbmcgJXJlbmFtZSBvbiBlbnVtIGl0ZW1zIGFuZCB3aGVuIHVzaW5nCiAgICAgICAgICAgICVqYXZhY29uc3QoMSkgLyAlY3Njb25zdCgxKQogICAgICAgICAgICBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyB1c2VkIHRvIGdlbmVyYXRlIGNvZGUgdGhhdCB3b3VsZG4ndCBjb21waWxlOgoKICAgICAgICAgICAgICAgICVyZW5hbWUoT2JqKSBPYmplY3Q7CiAgICAgICAgICAgICAgICBlbnVtIEdyYW1tYXIgeyBTdWJqZWN0LCBPYmplY3QgfTsKCjA0LzI4LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gTWlub3IgZml4ZXMgd2hlbiB1c2luZyBjb21iaW5hdGlvbnMgb2YgdGhlIAogICAgICAgICAgICBqYXZhaW50ZXJmYWNlcywgamF2YWJhc2UsIGNzaW50ZXJmYWNlcyBhbmQgY3NiYXNlIHR5cGVtYXBzLgoKMDUvMTgvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEpWTSBsaW5rIGZhaWx1cmUgb24gc29tZSBzeXN0ZW1zIGZpeGVkIHdoZW4gdXNpbmcgc3RkX3ZlY3Rvci5pLgogICAgICAgICAgICBBbHNvIGFkZHMgZGVmYXVsdCB2ZWN0b3IgY29uc3RydWN0b3IgZm9yIHVzZSBmcm9tIEphdmEuCgowNS8xNy8yMDA0OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgoJICAgIFtHdWlsZV0gTmV3IHJ1bnRpbWUgZnVuY3Rpb25zIFNXSUdfUG9pbnRlckFkZHJlc3MsCgkgICAgU1dJR19Qb2ludGVyVHlwZSwgU1dJR19Jc1BvaW50ZXJPZlR5cGUsIFNXSUdfSXNQb2ludGVyLgoKCSAgICBbR3VpbGVdIEluIC1zY20gbW9kZSwgd3JhcCBzZXZlcmFsIFNXSUcgcnVudGltZSBmdW5jdGlvbnMKCSAgICBhbmQgZXhwb3J0IHRoZW0gaW50byB0aGUgbW9kdWxlIChTd2lnIHN3aWdydW4pLiAgVGhlCgkgICAgcnVudGltZSBtb2R1bGUgaXMgbm93IGJ1aWx0IHdpdGggIm1vZHVsZSIgbGlua2FnZS4KCgkgICAgW0d1aWxlXSBHT09QUyBwcm94eSBvYmplY3RzIG5vdyBhbHNvIHByaW50IHRoZSBwb2ludGVyCgkgICAgYWRkcmVzcyBvZiB0aGUgQyBvYmplY3QuCgowNS8xNC8yMDA0OiBseWxlCiAgICAgICAgICAgIEFkZGVkIEtvdSdzIHBhdGNoIGZvciB0aGUgUnVieSAlaW1wb3J0IGRpcmVjdGl2ZSBzbyB0aGF0IG1vZHVsZXMKICAgICAgICAgICAgd2l0aCAibmVzdGVkIiBuYW1lcyBhcmUgaGFuZGxlZCBwcm9wZXJseS4gQ29uc2lkZXIgYW4gaW50ZXJmYWNlCiAgICAgICAgICAgIGZpbGUgZm9vLmkgdGhhdCBoYXMgdGhpcyAlbW9kdWxlIGRlY2xhcmF0aW9uIGF0IGl0cyB0b3A6CgogICAgICAgICAgICAgICAgJW1vZHVsZSAibWlzYzo6dGV4dDo6Zm9vIgoKICAgICAgICAgICAgTm93IGNvbnNpZGVyIGFub3RoZXIgaW50ZXJmYWNlIGZpbGUgc3BhbS5pIHRoYXQgaW1wb3J0cyBmb28uaToKCiAgICAgICAgICAgICAgICAlaW1wb3J0IGZvby5pCiAgICAgICAgICAgIAogICAgICAgICAgICBCZWZvcmUgdGhpcyBwYXRjaCwgdGhpcyB3b3VsZCByZXN1bHQgaW4gdGhlIGZvbGxvd2luZyBjb2RlIGJlaW5nCiAgICAgICAgICAgIGdlbmVyYXRlZCBmb3Igc3BhbV93cmFwLmM6CgogICAgICAgICAgICAgICAgcmJfcmVxdWlyZSgibWlzYzo6dGV4dDo6Zm9vIik7CgogICAgICAgICAgICBXaXRoIHRoaXMgcGF0Y2gsIGhvd2V2ZXIsIHlvdSdsbCBnZXQgdGhlIGNvcnJlY3QgcGF0aCBuYW1lCiAgICAgICAgICAgIGZvciB0aGUgY2FsbCB0byByYl9yZXF1aXJlKCksIGUuZy4KCiAgICAgICAgICAgICAgICByYl9yZXF1aXJlKCJtaXNjL3RleHQvZm9vIik7CgogICAgICAgICAgICBTZWUgU291cmNlRm9yZ2UgQnVnICM5MjgyOTkuCgowNS8xMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCBmb3IgZW1pdHRpbmcgZGlyZWN0b3JzIHdoZW4gJWZlYXR1cmUoImRpcmVjdG9yIikgc3BlY2lmaWVkCiAgICAgICAgICAgIGZvciBhIGNsYXNzIHdpdGggbm8gdmlydHVhbCBtZXRob2RzLCBidXQgZG9lcyBoYXZlIGEgdmlydHVhbCBkZXN0cnVjdG9yLgogICAgICAgICAgICBTdWJtaXR0ZWQgYnkgS2V2aW4gU21pdGguCgowNS8wNi8yMDA0OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgTmV3IFNXSUcgcnVudGltZSBmdW5jdGlvbiBTV0lHX1R5cGVQcmV0dHlOYW1lLCB3aGljaCAKCSAgICByZXR1cm5zIGFuIHVubWFuZ2xlZCB0eXBlIG5hbWUgZm9yIGEgc3dpZ190eXBlX2luZm8KCSAgICBvYmplY3QuIAoKCSAgICBbR3VpbGVdOiBVc2UgaXQgZm9yIHByaW50aW5nIHBvaW50ZXIgb2JqZWN0cy4KCjA1LzAzLzIwMDQ6ICBkYW5jeSAoQWhtb24gRGFuY3kpCgoJKiBMaWIvYWxsZWdyb2NsL2FsbGVncm9jbC5zd2c6ICBVcGRhdGVkIGNvbW1lbnRzIGFib3V0IGlkZW50aWZlcgoJY29udmVyc2lvbi4gIAoKCSogU291cmNlcy9Nb2R1bGVzL2FsbGVncm9jbC5jeHg6ICBSZWdpc3RlciAvZGV2L251bGwgZm9yICJoZWFkZXIiCgl0YXJnZXQuICAgQWxzbywgZGlzcmVnYXJkICJjb25zdCIgcXVhbGlmaWVycyBkdXJpbmcgdHlwZQoJY29udmVyc2lvbi4gIAoKCQowNS8wMi8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbQ2hpY2tlbl0gRml4IGJ1ZyA3ODI0NjguCgkgICAgVG8gZml4IHRoaXMgYnVnLCB0aGUgcnVudGltZSBjb2RlIGhhcyBiZWVuIHJld3JpdHRlbiwgYW5kCgkgICAgcG9pbnRlcnMgYXJlIG5vdyByZXByZXNlbnRlZCBhcyBhIENfU1dJR19QT0lOVEVSX1RZUEUuCgoJICAgIENoaWNrZW4gdmVyc2lvbiA+IDEuNDAgaXMgbm93IHJlcXVpcmVkIQoKCSAgICAqIFR5cGVtYXAgaW5jb21wYXRpYmlsaXR5OiAgdHlwZW1hcHMgbm8gbG9uZ2VyIHVzZSBjaGlja2VuX3dvcmRzLgoJICAgICAgSWYgYSB0eXBlbWFwIG5lZWRzIHNvbWUgc3BhY2UsIGl0IHNob3VsZCBqdXN0IGNhbGwgQ19hbGxvYwoKCSAgICAqIGFyZ291dCB0eXBlbWFwcyBubyBsb25nZXIgdXNlIHRoZSAvKiBpZiBPTkUgKi8gY29uc3RydWN0IHRvCgkgICAgICBidWlsZCBhbiBvdXRwdXQgbGlzdC4gIEEgU1dJR19BUFBFTkRfVkFMVUUgbWFjcm8sIGV4YWN0bHkgbGlrZQoJICAgICAgZ3VpbGUgYW5kIG16c2NoZW1lIGlzIG5vdyB1c2VkLgoKMDQvMjUvMjAwNDogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gSW4gdGhlIGdlbmVyYXRlZCBHT09QUyBjb2RlLCBkb24ndCBjcmVhdGUgbWV0aG9kcwoJICAgIHRoYXQgd291bGQgbm90IHNwZWNpYWxpemUgYW55IGFyZ3VtZW50czsgc2ltcGx5IHJlLWV4cG9ydAoJICAgIHRoZSBwcmltaXRpdmUgZnVuY3Rpb25zLiAgKFRoaXMgaXMgYSBwZXJmb3JtYW5jZQoJICAgIG9wdGltaXphdGlvbiB3aGljaCByZWR1Y2VzIGxvYWQgdGltZSBhbmQgZXhlY3V0aW9uIHRpbWUuKQoKCSAgICBbR3VpbGVdIEluIC1naCBtb2RlLCBmaXggdGhlICJ0b28gbWFueSBpbml0aWFsaXplcnMiIGVycm9yCgkgICAgd2hpY2ggd2FzIGNhdXNlZCBieSBhbiBpbmNvbXBhdGlibGUgc3dpZ190eXBlX2luZm8gbGF5b3V0LgoKCSAgICBbR3VpbGVdIFRoZSB0eXBlbWFwIGZvciBGSUxFICogaW4gcG9ydHMuaSBub3cgYWxzbyBhY2NlcHRzCgkgICAgYSByZWd1bGFyIEZJTEUgKiBwb2ludGVyIG9iamVjdC4gIEFsc28gYSBidWcgd2l0aCBTY2hlbWUKCSAgICBmaWxlIHBvcnRzIHRoYXQgYXJlIG9wZW4gZm9yIGlucHV0IGFuZCBvdXRwdXQgaGFzIGJlZW4KCSAgICBmaXhlZC4gCgowNC8yNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBDaGFuZ2UgZW50cnkgMDMvMjEvMjAwNCByZXZva2VkLiBUaGUgY2hhbmdlIGludHJvZHVjZWQgYW5vdGhlcgogICAgICAgICAgICBpbmNvbnNpc3RlbmN5IChyZWZlcmVuY2UgdHlwZW1hcHMgYmVpbmdzIHVzZWQgaW5zdGVhZCBvZgogICAgICAgICAgICBwb2ludGVyIHR5cGVtYXBzIGZvciBtZW1iZXIgdmFyaWFibGVzIGFzIHdlbGwgYXMgc3RhdGljCiAgICAgICAgICAgIG1lbWJlciB2YXJpYWJsZXMgYW5kIGdsb2JhbCB2YXJpYWJsZXMgZm9yIHNvbWUgbGFuZ3VhZ2VzLAogICAgICAgICAgICBidXQgb25seSBmb3IgQysrIGFuZCBub3QgQykuIFRoaXMgd291bGQgYnJlYWsgdXNlcidzIGN1cnJlbnQKICAgICAgICAgICAgdHlwZW1hcHMgYW5kIGludHJvZHVjZSBmdXJ0aGVyIGluY29uc2lzdGVuY2llcy4gQWx0ZXJuYXRpdmUKICAgICAgICAgICAgc29sdXRpb24gcmVxdWlyZWQgYW5kIGJlaW5nIGRpc2N1c3NlZC4KCjA0LzEwLzIwMDQ6IG1tYXR1cyAoTWFyY2VsbyBNYXR1cykgCgkgICAgCgkgICAgQWRkZWQgdGhlIC1kaXJlY3RvcnMgZmxhZy4gVGhpcyBlbmFibGVzIHRoZSBkaXJlY3RvcgoJICAgIG1vZGUgZm9yIHRoZSBpbnRlcmZhY2UgYW5kIGFsbCB0aGUgY2xhc3NlcyB0aGF0CgkgICAgZG9uJ3Qgc2V0IHRoZSAiZmVhdHVyZTpub2RpcmVjdG9yIiBleHBsaWNpdGx5LgoKCSAgICBZb3UgY2FuIHVzZSB0aGlzIGluIHlvdXIgbW9kdWxlIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUKCSAgICBkaXJlY3RvciBmZWF0dXJlIGluIGFsbCB5b3VyIGNsYXNzZXMsIGJ1dCBpdCBpcyBtb3N0CgkgICAgaW50ZW5kZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMsIGxpa2U6CgoJICAgICAgbWFrZSBjaGVjay1weXRob24tdGVzdC1zdWl0ZSBTV0lHPSIuLi8uLi8uLi9zd2lnICAtZGlyZWN0b3JzIgoJICAgICAgbWFrZSBjaGVjay1ydWJ5LXRlc3Qtc3VpdGUgU1dJRz0iLi4vLi4vLi4vc3dpZyAgLWRpcmVjdG9ycyIKCSAgICAgIG1ha2UgY2hlY2stamF2YS10ZXN0LXN1aXRlIFNXSUc9Ii4uLy4uLy4uLy4uL3N3aWcgIC1kaXJlY3RvcnMiCgoJICAgIFRoZXNlIGNvbW1hbmRzIHdpbGwgcnVuIHRoZSBlbnRpcmUgdGVzdC1zdWl0ZSB1c2luZwoJICAgIGRpcmVjdG9ycywgYW5kIG5vdCBvbmx5IHRoZSBzcGVjaWZpYyAnZGlyZWN0b3JzXyonCgkgICAgY2FzZXMuIFRoaXMgc2hvdWxkIGJlIGRvbmUgZnJvbSB0aW1lIHRvIHRpbWUuCgowNC8xMC8yMDA0OiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpIAoJICAgIAoJICAgIFtweXRob25dIEFkZGVkIHN1cHBvcnQgZm9yIHN0ZDo6d3N0cmluZyBhbmQgd2NoYXJfdCwKCSAgICBmb3IgY29tcGlsZXIgYW5kIHB5dGhvbiB2ZXJzaW9ucyB0aGF0IHN1cHBvcnQgdGhlbS4KCSAgICAKCSAgICBXaGVuIG5lZWRlZCwgdXNlIAoKCSAgICAgJWlubGN1ZGUgc3RkX3N0cmluZy5pICAgICAgLy8gJ2NoYXInIHN0cmluZ3MKCSAgICAgJWlubGN1ZGUgc3RkX3dzdHJpbmcuaSAgICAgLy8gJ3djaGFyX3QnIHN0cmluZ3MKCSAgICAKCjA0LzEwLzIwMDQ6IG1tYXR1cyAoTWFyY2VsbyBNYXR1cykgCgkgICAgCgkgICAgW3B5dGhvbl0gRml4IHRoZSBkZWZhdWx0IGJlaGF2aW91ciAoc2VnLiBmYXVsdCkgd2hlbiBhbgoJICAgIGlucGxhY2Ugb3BlcmF0b3IgKCs9LC09LC4uLikgd2FzIHdyYXBwZWQsIGFzIHJlcG9ydGVkIGJ5CgkgICAgTHVjcml6IChsdWNyaXpAc2l0aWxhbmRpYS5pdCksIHdoZW4gdGhlIG1vc3QgY29tbW9uCgkgICAgZm9ybSB3YXMgdXNlZDoKCiAgICAgICAgICAgICAgICAgICBBJiAgQTo6b3BlcmF0b3IrPShpbnQgaSkgeyAuLi47IHJldHVybiAqdGhpczsgfQogICAgICAgICAgICAgICAgICBeXl5eICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eCgkgICAgCgoJICAgIGllLCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgYW5kIGl0cyBjb250YWlucyB0aGUgc2FtZSAndGhpcycKCSAgICB2YWx1ZSB0aGFuIHRoZSBpbnB1dCBvYmplY3QsIHdoaWNoIGlzIGRlbGV0ZWQgYWZ0ZXIgdGhlCgkgICAgb3BlcmF0aW9uICJhICs9IGIiLCBsZWF2aW5nIHRoZSByZXN1bHQgd2l0aCBubyByZWFsCgkgICAgb2JqZWN0LCBidXQgYSBzZWcuIGZhdWx0LgoKCSAgICBUbyBmaXggaXQsIHdlIG5lZWRlZCB0byBpbnRyb2R1Y2UgYSBuZXcgZmVhdHVyZSBhbmQgdXNlIGFuCgkgICAgb2xkIG9uZToKCiAgICAgICAgICAgICAgICVmZWF0dXJlKCJzZWxmOmRpc293biIpIEE6Om9wZXJhdG9yKz07CiAgICAgICAgICAgICAgICVmZWF0dXJlKCJuZXciKSBBOjpvcGVyYXRvcis9OwoJICAgIAoJICAgIGhlcmUsICJzZWxmOmRpc293biIgZGlzYWJsZSB0aGUgb3duZXJzaGlwIG9mIHRoZSAnc2VsZicKCSAgICBvciBpbnB1dCBvYmplY3QsIGFuZCB0aGUgIm5ldyIgZmVhdHVyZSB0cmFuc2ZlcnMgdGhlCgkgICAgb3duZXJzaGlwIHRvIHRoZSByZXN1bHQgb2JqZWN0LgoJICAgIAoJICAgIFRoZSBmZWF0dXJlL3NvbHV0aW9uIGNvdWxkIGFsc28gYmUgdXNlZCBpbiBvdGhlciBsYW5ndWFnZXMKCSAgICB0aGF0IHVzZSBnYyBhbmQgaW1wbGVtZW50IHRoZSBpbnBsYWNlIG9wZXJhdG9ycywgb3Igb3RoZXIKCSAgICBvcGVyYXRvcnMsIGluIGEgc2ltaWxhciB3YXkuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgUHl0aG9uIE1PRFVMRSAqKioKCgkgICAgSWYgeW91IGFscmVhZHkgYXJlIHVzaW5nIHRoZSBpbnBsYWNlIG9wZXJhdG9ycyBpbiBweXRob24sCgkgICAgYW5kIHlvdSBpbXBsZW1lbnRlZCBzb21lIGtpbmQgb2Ygd29ya2Fyb3VuZCB0byB0aGUgcHJvYmxlbQoJICAgIGZpeGVkIGhlcmUsIGl0IGlzIHBvc3NpYmxlIHlvdSBjb3VsZCBlbmQgd2l0aCAnZnJlZScKCSAgICBvYmplY3RzIHRoYXQgbmV2ZXIgZ2V0IGRlbGV0ZWQuIElmIHRoYXQgaXMgdGhlIGNhc2UsIGFuZAoJICAgIHlvdSB3YW50IHRvIGRpc2FibGUgdGhlIGN1cnJlbnQgZml4LCB1c2U6CgogICAgICAgICAgICAgICAlZmVhdHVyZSgic2VsZjpkaXNvd24iLCIiKSBBOjpvcGVyYXRvcis9OwogICAgICAgICAgICAgICAlZmVhdHVyZSgibmV3IiwiIikgQTo6b3BlcmF0b3IrPTsKCgowNC8wNy8yMDA0OiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBDKysgZW51bXMgYXJlIG5vIGxvbmdlciB3cmFwcGVkIGJ5IGludGVnZXJzLCB0aGV5IGFyZSBub3cgd3JhcHBlZCBieSAKICAgICAgICAgICAgQyMgZW51bXMuIEZvciBFeGFtcGxlLCBnaXZlbiBDKys6CgogICAgICAgICAgICAgICAgZW51bSBBbkVudW0geyBmb28sIGJhciB9OwogICAgICAgICAgICAgICAgdHlwZWRlZiBBbkVudW0gQW5FbnVtZXJhdGlvbjsKICAgICAgICAgICAgICAgIHZvaWQgc29tZXRoaW5nKEFuRW51bSBlLCBBbkVudW1lcmF0aW9uIGYpOwoKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBnZW5lcmF0ZWQ6CgogICAgICAgICAgICAgICAgcHVibGljIGVudW0gQW5FbnVtIHsKICAgICAgICAgICAgICAgICAgZm9vLAogICAgICAgICAgICAgICAgICBiYXIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzb21ldGhpbmcoQW5FbnVtIGUsIEFuRW51bSBmKSB7Li4ufQoKICAgICAgICAgICAgTm90ZSB0aGF0IGEgZ2xvYmFsIGVudW0gbGlrZSBBbkVudW0gYWJvdmUgaXMgZ2VuZXJhdGVkIGludG8gaXRzIG93bgogICAgICAgICAgICBmaWxlIGNhbGxlZCBBbkVudW0uY3MuIEVudW1zIGRlZmluZWQgd2l0aGluIGEgQysrIGNsYXNzIGFyZSBkZWZpbmVkCiAgICAgICAgICAgIHdpdGhpbiB0aGUgQyMgcHJveHkgY2xhc3MuIFNvbWUgb2YgdGhlIHR5cGVtYXBzIGZvciBtb2RpZnlpbmcgQyMgcHJveHkKICAgICAgICAgICAgY2xhc3NlcyBhbHNvIHdvcmsgZm9yIGVudW1zLiBGb3IgZXhhbXBsZSBnbG9iYWwgZW51bXMgY2FuIHVzZQoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGNzaW1wb3J0cykgdG8gYWRkIGluIGV4dHJhIHVzaW5nIHN0YXRlbWVudHMuCgogICAgICAgICAgICBHbG9iYWwgZW51bXMgYW5kIGNsYXNzIGVudW1zIGNhbiB1c2UKCiAgICAgICAgICAgICAgICAldHlwZW1hcChjc2NsYXNzbW9kaWZpZXJzKSB0byBtYWtlIHRoZSBlbnVtIHByaXZhdGUsIHB1YmxpYyBldGMuCiAgICAgICAgICAgICAgICAldHlwZW1hcChjc2Jhc2UpIHRvIGNoYW5nZSB0aGUgdW5kZXJseWluZyBlbnVtIHR5cGUgKGVudW0gYmFzZSkKCiAgICAgICAgICAgIElmIHdlIGFkZCB0aGlzIGZvciB0aGUgYWJvdmUgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAldHlwZW1hcChjc2NsYXNzbW9kaWZpZXJzKSBBbkVudW0gInByb3RlY3RlZCIKICAgICAgICAgICAgICAgICV0eXBlbWFwKGNzYmFzZSkgQW5FbnVtICJsb25nIgoKICAgICAgICAgICAgdGhlIGZvbGxvd2luZyBpcyBnZW5lcmF0ZWQ6CiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgcHJvdGVjdGVkIGVudW0gQW5FbnVtIDogbG9uZyB7CiAgICAgICAgICAgICAgICAgIGZvbywKICAgICAgICAgICAgICAgICAgYmFyCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgQyMgTU9EVUxFICoqKgoKMDQvMDcvMjAwNDogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFNlZyBmYXVsdCBmaXggZm9yIGVtcHR5IGVudW1zLCBsaWtlCiAgICAgICAgICAgICAgICBlbnVtIEZvbyB7fTsKCjAzLzIxLzIwMDQ6IG1tYXR1cwogICAgICAgICAgICBbTm90ZTogdGhpcyBjaGFuZ2UgcmV2b2tlZCBvbiAwNC8yNS8yMDA0XQoJICAgIFtQeXRob25dIE1ha2VzIHRoZSBmb2xsb3dpbmcgJ3ZhcicgY2FzZXMgbW9yZSB1bmlmb3JtOgoKICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGdhOwogCiAgICAgICAgICAgICAgICBzdHJ1Y3QgQSB7CiAgICAgICAgICAgICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBzYTsKICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWE7CiAgICAgICAgICAgICAgICB9OwoKCiAgICAgICAgICAgIG5vdyB0aGUgdGhyZWUgdmFyaWFibGVzIChnYSwgc2EsIG1hKSBjYW4gYmUgYXNzaWduZWQgYXM6CgoKICAgICAgICAgICAgICAgICAgY3Zhci5nYSA9ICJoZWxsbyI7CiAgICAgICAgICAgICAgICAgIEEuc2EgPSAiaGVsbG8iOwogICAgICAgICAgICAgICAgICBhLm1hID0gImhlbGxvIjsKCiAgICAgICAgICAgIGllLCBub3cgJ21hJyB3aWxsIGFsc28gdXNlIGEgc3RkOjpzdHJpbmcgdHlwZW1hcCAnaW4nIGlmCiAgICAgICAgICAgIGRlZmluZWQsIGJlZm9yZSBpdCB3YXMgb25seSBhY2NlcHRpbmcgYSAncF9zdGRfc3RyaW5nJwogICAgICAgICAgICBwb2ludGVyLiAgTm90ZSwgaG93ZXZlciwgdGhhdCAnbWEnIHdpbGwgbm90IHVzZSB0aGUKICAgICAgICAgICAgJ3ZhcmluL3Zhcm91dCcgdHlwZW1hcHMgKHRoYXQgcHJvYmFibHkgY291bGQgYmUgbW9yZQogICAgICAgICAgICBuYXR1cmFsKSwgYnV0IGl0IHdpbGwgcGljayB1cCB0aGUgJ2luJyB0eXBlbWFwIGZvciBjb25zdAogICAgICAgICAgICBzdGQ6OnN0cmluZyYgKHdoaWNoIGlzIGVhc2llcikuCgoJICAgIFRoZSBjaGFuZ2VzIGluIGN3cmFwLmMgYW5kIGxhbmcuY3h4IHdpbGwgcHJvYmFibHkgZml4IHRoZQoJICAgIGJlaGF2aW91ciBpbiBvdGhlciBsYW5ndWFnZXMgdGhhdCBkbyBub3Qgb3ZlcmxvYWQgdGhlCgkgICAgbWVtYmVydmFySGFuZGxlciBtZXRob2QgInRvbyBtdWNoIi4KIAogICAgICAgICAgICAKMDMvMjEvMjAwNDogbW1hdHVzCgkgICAgW1B5dGhvbl0gRGlzYWJsaW5nIHRoZSBkZWZhdWx0IGluc3RhbnRpYXRpb25zIGxpa2U6CgoJICAgICAgJXRlbXBsYXRlKCkgc3RkOjpwYWlyPGludCxpbnQ+OwoKICAgICAgICAgICAgZm9yIGFsbCB0aGUgcHJpbWl0aXZlIHR5cGVzIGFuZCBTVEwgY29udGFpbmVycy9jbGFzc2VzLgoJICAgIFRoZXkgYXJlIGV4cGVuc2l2ZSwgc3BlY2lhbGx5IGZvciBwYWlyIGFuZCBtYXAsIGFuZCB0aGUKCSAgICBwcmV2aW91cyBiZWhhdmlvdXIgYWxzbyByZXF1aXJlcyB0aGUgdXNlciB0byBwZXJmb3JtCgkgICAgbWFudWFsIGluc3RhbnRpYXRpb25zLiBTdGlsbCwgaWYgdGhlIHNwZWVkIGRpZmZlcmVuY2UgaXMKCSAgICBub3QgaW1wb3J0YW50LCBpdCBjYW4gYmUgcmUtZW5hYmxlZCBieSBkZWZpbmluZyB0aGUgbWFjcm8KCSAgICBTV0lHX1NURF9ERUZBVUxUX0lOU1RBTlRJQVRJT04gKHNlZSBzdGRfY29tbW9uLmkpLgoKCSAgICBBbHNvLCBub3JtYWxpemluZyB0aGUgSU5QVVQvT1VUUFVUL0lOT1VUIHR5cGVtYXBzLiBOb3cKCSAgICB0aGV5IHVzZSB0aGUgc2FtZSBjb252ZXJzb3JzIHRoYW4gdGhlIHJlc3Qgb2YgdGhlCgkgICAgdHlwZW1hcHMsIGFuZCB5b3UgY2FuIHVzZSB0aGVtIGZvciBzdGQ6OnBhaXIsIHN0ZDo6c3RyaW5nCgkgICAgYW5kIGFsbCB0aGUgb3RoZXIgU1RMIHR5cGVzLCBsaWtlIGluOgoKCSAgICAgIHZvaWQgcF9pbm91dGQoc3RkOjpwYWlyPGRvdWJsZSwgZG91YmxlPiAqSU5PVVQpOwoKCSAgICBBZGRlZCB0aGUgYXR0cmlidXRlLmkgYW5kIGltcGxpY2l0LmkgZmlsZXMgd2l0aCBtYWNyb3MgdG8KCSAgICB0cmFuc2Zvcm0gZnVuY3Rpb25zIHBhaXJzIGxpa2UgJ3NldF94Jy8nZ2V0X3gnIAoJICAgIChvciAnVCYgeCgpJy8nY29uc3QgVCYgeCgpIGNvbnN0JykgaW50byBhbiBhdHRyaWJ1dGUsCgkgICAgYW5kIGFsbG93aW5nIHRoZSB1c2Ugb2YgaW1wbGljaXQgY29uc3RydWN0b3JzIGluIHR5cGVtYXBzCgkgICAgKHNlZSB0aGUgZmlsZXMgZm9yIG1vcmUgZGV0YWlscykuCgowMy8yMS8yMDA0OiBta29lcHBlCgkgICAgW0d1aWxlXSBGaXggdGhlIGRvY3VtZW50YXRpb24gc3RyaW5ncyBvZiBmdW5jdGlvbnMgd2l0aAoJICAgIGFub255bW91cyBhcmd1bWVudHMuCgowMy8xOC8yMDA0OiBtbWF0dXMKCSAgICBbUHl0aG9uXSBNb3JlIGdlbmVyYWwgc3RkX3N0cmluZy5pIGludGVyZmFjZS4KCSAgICBOb3cgeW91IGNhbiB3cmFwIGl0IHVzaW5nCgoJICAgICAgJXRlbXBsYXRlKHN0cmluZykgc3RkOjpiYXNpY19zdHJpbmc8Y2hhcj47CgogICAgICAgICAgICBhbmQgdXNlIHRoZSBzdGQ6OnN0cmluZyBhcyBhIGJhc2UgY2xhc3M6CgoJICAgICAgc3RydWN0IEEgOiBzdGQ6OnN0cmluZyB7CiAgICAgICAgICAgICAgfTsKCgkgICAgQnV0IG1vcmUgaW1wb3J0YW50LCBzd2lnIHdpbGwgcmVjb2duaXplIAoJICAgIGJvdGggc3RkOjpiYXNpY19zdHJpbmc8Y2hhcj4gYW5kIHN0ZDo6c3RyaW5nIGFzCgkgICAgdGhlIHNhbWUgdHlwZS4KCjAzLzE2LzIwMDQ6IG1tYXR1cwoJICAgIFByZXZpb3VzbHkgYWRkZWQsIGJ1dCBub3QgbWVudGlvbmVkIGJlZm9yZToKCgkgICAgLSBmcmllbmQgZGVjbGFyYXRpb24gc3VwcG9ydCwgc3dpZyBub3cgZW1pdHMgYSBnbG9iYWwKCSAgICAgIGZ1bmN0aW9uIGluIHRoZSBzYW1lIGNsYXNzIHNjb3BlLgoKCSAgICAtIHJlZi91bnJlZiBmZWF0dXJlczogdG8gbWl4IHJlZiBjb3VudGluZyBDKysgY2xhc3NlcwoJICAgICAgYW5kIG5hdGl2ZSBzY3JpcHQgcmVmIGNvdW50aW5nIG1lY2hhbmlzbXMgKGxpa2UgaW4gcHl0aG9uKS4KCSAgICAKCSAgICAgIFVzZSBpdCBsaWtlOgoKIAkgICAgICAgICVmZWF0dXJlKCJyZWYiKSAgIFJDT2JqICIkdGhpcy0+cmVmKCk7IgogICAgICAgICAgICAgICAgJWZlYXR1cmUoInVucmVmIikgUkNPYmogIiR0aGlzLT51bnJlZigpOyIKCgkgICAgICBBbmQgdGhlIGNsYXNzIFJDT2JqLCBhbmQgYWxsIHRoZSBkZXJpdmVkIG9uZXMsIHdpbGwKCSAgICAgIHBlcmZvcm0gdGhlIHJpZ2h0IHJlZi91bnJlZiBjYWxscyB3aGVuIGEgbmV3IHBvaW50ZXIgIAoJICAgICAgaXMgcmV0dXJuZWQgdG8gdGhlIHRhcmdldCBsYW5ndWFnZSwgb3Igd2hlbiB0aGUgdGFyZ2V0CgkgICAgICBsYW5ndWFnZSBhdHRlbXB0cyB0byBkZWxldGUgdGhlIG9iamVjdC4KCSAgICAgIAoJICAgICAgU2VlIHRoZSByZWZjb3VudC5pIGZpbGUgaW4gdGhlIHRlc3Qtc3VpdGUgZm9yIG1vcmUKCSAgICAgIGRldGFpbHMuCgoJICAgIAowMy8xNi8yMDA0OiBtbWF0dXMKCSAgICBbUHl0aG9uXSBVc2luZyB0aGUgbmV3ICVmcmFnbWVudCBzdXBwb3J0LCBtYWpvciByZXdyb3RlIAoJICAgIG9mIHRoZSBweXRob24gc3dpZyBsaWJyYXJ5LCBpbmNsdWRpbmc6CgoJICAgIC0gQWxtb3N0IGF1dG9tYXRpYyB0ZW1wbGF0ZS90eXBlbWFwIGluc3RhbnRpYXRpb24gZm9yCgkgICAgICB0aGUgU1RMIGNvbXBvbmVudHMuIEZvciBleGFtcGxlLCBub3cgeW91IGNhbiB3cml0ZToKCgkJICAgJXRlbXBsYXRlKHZlY3Rvcl9pKSBzdGQ6OnZlY3RvcjxpbnQ+OwoKICAgICAgICAgICAgICBhbmQgYSBzcGVjaWFsaXplZCB2ZWN0b3JfaSBjbGFzcyBpcyBlbWl0dGVkIHdpdGggYWxsCgkgICAgICB0aGUgbmVlZGVkIHR5cGVtYXBzLiBObyBuZWVkIHRvIHVzZSB0aGUgb2xkCgkgICAgICAnc3BlY2lhbGl6ZV92ZWN0b3InIG1hY3Jvcy4KCgkgICAgICBOb3RlIHlvdSBjYW4gYWxzbyBkZWZpbmUKCgkgICAgICAgICAgJXRlbXBsYXRlKG1hdHJpeF9pKSAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPGludD4gPjsKCSAgICAgICAgICAldGVtcGxhdGUodmVjdG9yX3BpaSkgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludCxpbnQ+ID47CgoJICAgIC0gVGhlIGVtcHR5IHRlbXBsYXRlIGluc3RhbnRpYXRpb24gCiAJIAogICAgICAgICAgIAkgICV0ZW1wbGF0ZSgpIHN0ZDo6dmVjdG9yPGludD47CgoJICAgICAgZGVmaW5lcyB0aGUgdmVjdG9yIHR5cGVtYXBzLCBidXQgbm8gcHJveHkgY2xhc3MuIEZvciBhbGwgdGhlCiAgICAgICAgICAgICAgZnVuZGFtZW50YWwgdHlwZXMsIHRoZSBlbXB0eSB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIGFyZQogICAgICAgICAgICAgIGRlZmluZWQsIHNvLCB5b3UgY2FuIHNheQoKCSAgICAgICVpbmNsdWRlIHN0ZF92ZWN0b3IKCgkgICAgICBpbnQgZnVuYyhjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBhKTsKCSAgICAgIAoJICAgICAgd2hlcmUgdGhlIHByb3BlciB0eXBlbWFwIGlzIGFwcGxpZWQgdG8gJ2EnLCBidXQgbm8KCSAgICAgIHN0ZDo6dmVjdG9yPGludD4gcHJveHkgaXMgZ2VuZXJhdGVkLgoJICAgICAgCgogICAgICAgICAgICAtIEFsbCB0aGUgU1RMIGNvbnRhaW5lcnMgcHJlc2VudCBhIG1vcmUgdW5pZm9ybSBiZWhhdmlvciBhbmQKCSAgICAgIG1vcmUgY29tcGxldGUgaW50ZXJmYWNlIGRlY2xhcmF0aW9uLiBUaGUgZm9sbG93aW5nIGFyZSAKCSAgICAgIG5vdyBzdXBwb3J0ZWQ6CgoJCSAgc3RkOjp2ZWN0b3I8VD4KCQkgIHN0ZDo6bGlzdDxUPgoJCSAgc3RkOjpkZXF1ZTxUPgoJCSAgc3RkOjpzZXQ8VD4KCQkgIHN0ZDo6bXVsdGlzZXQ8VD4KCQkgIHN0ZDo6bWFwPFQ+CgkJICBzdGQ6Om11bHRpbWFwPFQ+CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgbm90IGEgY29udGFpbmVyLCBidXQgYWxzbyBzdXBwb3J0ZWQ6CgoJCSAgc3RkOjpwYWlyPFQsVT4KCiAgICAgICAgICAgICAgYWxzbywgbW9yZSB0eXBlbWFwcyBhcmUgZGVmaW5lZCBmb3IgYWxsIG9mIHRoZW0sCgkgICAgICBpbmNsdWRpbmcgdmFyaW4sIHZhcm91dCwgdHlwZWNoZWNrLCBldGMuCgogICAgICAgICAgICAtIEluaXRpYWwgYXR0ZW1wdCB0byBpbXBsZW1lbnQgdGhlIFNUTCBjb250YWluZXJzCiAgICAgICAgICAgICAgY29uc2lkZXJpbmcgYWxsb2NhdG9ycywgaWU6CgoJICAgICAgICAgIHN0ZDo6dmVjdG9yPFQsQT4JCQkKCgkgICAgICBpdCBpcyBwYXJ0aWFsbHkgd29ya2luZywgYnV0IGl0IGlzIGp1c3QgYSB3b3JrYXJvdW5kCgkgICAgICB3aGlsZSBzd2lnIGltcHJvdmVzIGl0cyB0ZW1wbGF0ZSB0eXBlIHN1cHBvcnQuCgkgICAgICAKCSAgICAgIAoJICAgICBQbGVhc2UgdGVzdCB3aXRoIHlvdXIgcGFydGljdWxhciBzZXR1cC4gSXQgc2VlbXMgdG8gYmUKCSAgICAgd29ya2luZyB3aXRoIGcrKyAzLjIuMiwgZysrIDIuOTYsIEludGVsIGljYyBhbmQgU0dJIENDCgkgICAgIGNvbXBpbGVycywgcGx1cyBweXRob24gMS41LjIsIDIuMCBhbmQgMi4zLCBidXQgc2luY2UKCSAgICAgd2UgYXJlIHVzaW5nIHRlbXBsYXRlcywgdGhlcmUgaXMgYSBjaGFuY2UgeW91IGNhbiBmaW5kCgkgICAgIHNvbWUgcHJvYmxlbXMgd2hlbiB1c2luZyB3aXRoIGFuIG9sZCBDKysgY29tcGlsZXIuCgowMy8xNi8yMDA0OiBtbWF0dXMKCiAgICAgICAgICAgIC0gQWxsb3dpbmcgdGhlIGVtcHR5ICV0ZW1wbGF0ZSBkaXJlY3RpdmUsIHN1Y2ggYXMKCiAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKCkgc3RkOjp2ZWN0b3I8aW50PjsKCgkgICAgICB0byBwcm9jZXNzIHRoZSBjbGFzcyAidHlwZWRlZiJzIGFuZCAidHlwZW1hcCJzLiBCZWZvcmUKCSAgICAgIG9ubHkgdGhlIGludGVybmFsICJ0eXBlZGVmInMgd2VyZSBwcm9jZXNzZWQuCgogICAgICAgICAgICAgIFRoaXMgbWFrZXMgcG9zc2libGUgdG8gZW1pdCB0aGUgZGVmYXVsdCBpbi9vdXQKICAgICAgICAgICAgICB0eXBlbWFwcyB3aXRob3V0IHRoZSBuZWVkIG9mIHdyYXBwaW5nIGFuIHNwZWNpYWxpemVkCiAgICAgICAgICAgICAgdmVjdG9yIGluc3RhbmNlLgoKCSAgICAtIEFkZGluZyB0aGUgcHJlcHJvY2Vzc29yIGV4dGVuc2lvbiAjQCB3aGljaCBtYW5nbGVzIHRoZQogICAgICAgICAgICAgIGZvbGxvd2luZyBtYWNybyBhcmd1bWVudCwgbGlrZSBpbjoKCiAgICAgICAgICAgICAgICAjZGVmaW5lIG1hY3JvKFgpICAjQFgKICAgICAgICAgICAgICAgIG1hY3JvKGludCkgICAgICAgICAtPiBpbnQKICAgICAgICAgICAgICAgIG1hY3JvKHN0ZDo6c3RyaW5nKSAtPiBzdGRfc19zX3N0cmluZwogICAgICAgICAgICAgICAgCgkgICAgLSBGcmFnbWVudHMgY2FuIG5vdyBiZSAidHlwZSBzcGVjaWFsaXplZCIsIGFzIHRoZSB0eXBlbWFwcy4gVGhlCgkgICAgICBzeW50YXggaXMgYXMgZm9sbG93cwogCiAgICAgICAgICAgICAgICAlZnJhZ21lbnQoIm5hbWUiLCJoZWFkZXIiKSAKICAgICAgICAgICAgICAgICAgeyAvKiBhIHR5cGUgaW5kZXBlbmRlbnQgZnJhZ21lbnQgKG9sZCBzeW50YXgpICovIH0KICAgICAgICAgICAgICAgICVmcmFnbWVudCgibmFtZSIge1R5cGV9LCAiaGVhZGVyIikgCiAgICAgICAgICAgICAgICAgIHsgLyogdGhlIGZyYWdtZW50IGlzIHR5cGUgZGVwZW5kZW50ICovfQogCiAgICAgICAgICAgICAgTm93IGZyYWdtZW50cyBjYW4gYWxzbyBiZSB1c2VkIGluc2lkZSB0ZW1wbGF0ZXM6IAoKICAgICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPgogICAgICAgICAgICAgICAgc3RydWN0IEEgewogICAgICAgICAgICAgICAgICAgJWZyYWdtZW50KCJpbmNvZGUie0E8VD59LCJoZWFkZXIiKSB7CgkJICAgICAgLyogJ2luY29kZScgc3BlY2lhbGl6ZWQgZnJhZ21lbnQgKi8KCQkgICB9CiAKCQkgICAldHlwZW1hcChpbixmcmFnbWVudD0iaW5jb2RlIntBPFQ+fSkgewoJCSAgICAgIC8qCgkJICAgICAgICAgaGVyZSB3ZSB1c2UgdGhlICd0eXBlIHNwZWNpYWxpemVkJyAKICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50ICJpbmNvZGUie0E8VD59CiAgICAgICAgICAgICAgICAgICAgICAqLwoJCSAgICB9CiAgICAgICAgICAgICAgICB9OwoJCQkgICAgIAkKCjAzLzExLzIwMDQ6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRGlyZWN0b3IgYnVnIHdoaWNoIG1lYW50IHRoYXQgc29tZSB2aXJ0dWFsIGZ1bmN0aW9ucyBvdmVycmlkZGVuIGluCiAgICAgICAgICAgIEphdmEgd2VyZSBub3QgYmVpbmcgY2FsbGVkIG9uIHNvbWUgb3BlcmF0aW5nIHN5c3RlbXMuIEJ1ZyByZXBvcnRlZCBhbmQgZml4ZWQKICAgICAgICAgICAgYnkgUm9iZXJ0IGRlIFZyaWVzIGFuZCBTY290dCBNaWNoZWwuCgowMy8wMi8yMDA0OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBJbiAtc2NtIG1vZGUsIGRvbid0IGZvcmdldCB0byBjaGVjayB0aGUgdHlwZSBvZiBzdHJpbmcgYXJndW1lbnRzLgoKMDIvMjQvMjAwNDogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gTmV3IGNvbW1hbmRsaW5lIG9wdGlvbiAtbmFtZXNwYWNlIDxuYW1lPi4gVGhpcyBhbGxvd3Mgb25lIHRvIHNwZWNpZnkKICAgICAgICAgICAgYSBDIyBuYW1lc3BhY2UgaW50byB3aGljaCBhbGwgQyMgY2xhc3NlcyBhcmUgZ2VuZXJhdGVkLgoKMDIvMjMvMjAwNDogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKSAKCSAgICBbTXpTY2hlbWVdIFVzZSBGVU5DX05BTUUgcmF0aGVyIHRoYW4gYSBib2d1cyB0eXBlbWFwIHZhcmlhYmxlIGZvciBzaWduYWxsaW5nCgkgICAgZXJyb3JzLiAgQ2FsbCBzY2hlbWVfd3JvbmdfdHlwZSB3aXRoIGEgemVyby1iYXNlZCBhcmd1bWVudCBudW1iZXIuICAKCSAgICBSZXBvcnRlZCBieSBPbmRyZWogUGFjb3Zza3ksIFNGICM5MDI2MjEuCgoJICAgIFtHdWlsZV0gRGVmaW5lIEZVTkNfTkFNRSBhbHNvIGluIHRoZSBkaXNwYXRjaCB3cmFwcGVyIGZvciBvdmVybG9hZGVkCgkgICAgZnVuY3Rpb25zLiAgUGF0Y2ggYnkgSm9obiBMZW56LCBTRiAjODk2MjU1LgoKMDIvMjIvMjAwNDogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gSW4gLXNjbSBtb2RlLCBkb24ndCB0cnkgdG8gaW52b2tlIGEgbnVsbCBkZXN0cnVjdG9yIGZ1bmN0aW9uLgoKMDIvMjAvMjAwNDogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeGVzIHNvIHRoYXQgdGhlIFNXSUcgc291cmNlIHdpbGwgY29tcGlsZSB1c2luZyB0aGUgRGlnaXRhbCBNYXJzIENvbXBpbGVyCiAgICAgICAgICAgIChmb3JtZXJseSBTeW1hbnRpYyBjb21waWxlcikgb24gV2luZG93cy4gU3VibWl0dGVkIGJ5IFNjb3R0IE1pY2hlbC4KCjAyLzEzLzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbTXpTY2hlbWVdIE5ldyBjb21tYW5kLWxpbmUgYXJndW1lbnQgLW5vaW5pdC4gIFVzZSBpdCBmb3IgYnVpbGRpbmcKCSAgICB0aGUgcnVudGltZSBsaWJyYXJ5LCB3aGVyZSB3ZSBkb24ndCB3YW50IHRvIGRlZmluZSB0aGUgZnVuY3Rpb25zCgkgICAgc2NoZW1lX2luaXRpYWxpemUgZXRjLiAgUmVwb3J0ZWQgYnkgVGltIEJyb3duLCBTRiAjODkxNzU0LgoKCSAgICBbTXpTY2hlbWVdIERvbid0IHByb2R1Y2UgaW52YWxpZCBDIGNvZGUgd2hlbiBpbnZva2VkIHdpdGggdGhlCgkgICAgLWRlY2xhcmVtb2R1bGUgb3B0aW9uLiAgUmVwb3J0ZWQgYnkgVGltIEJyb3duLCBTRiAjODkxMTA4LgoJICAgIAoJICAgIFtHdWlsZV0gQnVpbGQgdGhlIHJ1bnRpbWUgbGlicmFyeSB3aXRoIHBhc3NpdmUgbGlua2FnZSwgdG8gcmVuYW1lCgkgICAgdGhlIFNXSUdfaW5pdCBmdW5jdGlvbiB1bmlxdWVseS4KCjAyLzEyLzIwMDQ6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YSwgQyNdIFBhdGNoIHN1Ym1pdHRlZCBieSBCaWxsIEhvZmZtYW4gd2hpY2ggcHJldmVudHMgU1dJRyBmcm9tIGNyYXNoaW5nCiAgICAgICAgICAgIHdoZW4gYSBmaWxlIGZvciB0aGUgdHlwZXdyYXBwZXIgY2xhc3MgY2Fubm90IGJlIG9wZW5lZC4KCjAyLzExLzIwMDQ6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YSwgQyNdIE92ZXJsb2FkaW5nIGNoYW5nZXM6CiAgICAgICAgICAgICAgLSBNZXRob2RzIHdoaWNoIGFyZSBvdmVybG9hZGVkIGluIGNvbnN0IG9ubHkgbm8gbG9uZ2VyIGdlbmVyYXRlIEphdmEKICAgICAgICAgICAgICAgIGNvZGUgdGhhdCB3b24ndCBjb21waWxlIC0gdGhlIGZpcnN0IG1ldGhvZCBwYXJzZWQgaXMgdXNlZCBhbmQgYQogICAgICAgICAgICAgICAgd2FybmluZyBpcyBkaXNwbGF5ZWQuIE5vdGUgdGhhdCB0aGlzIGJlaGF2aW91ciBpcyBzbGlnaHRseSBkaWZmZXJlbnQKICAgICAgICAgICAgICAgIHRvIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2VzIHdoaWNoIGFsd2F5cyB1c2VzIHRoZSBub24tY29uc3QgbWV0aG9kLgogICAgICAgICAgICAgIC0gV2FybmluZyBtZXNzYWdlcyA1MDkgYW5kIDUxMiByZXBsYWNlZCBieSBuZXcgd2FybmluZyBudW1iZXIgNTE2LCB3aGljaCAKICAgICAgICAgICAgICAgIGlzIG1vcmUgcmVsZXZhbnQgdG8gdGhlc2Ugc3RhdGljYWxseSB0eXBlZCBsYW5ndWFnZXMgYXMgdGhlIG92ZXJsb2FkZWQKICAgICAgICAgICAgICAgIG1ldGhvZHMgYXJlbid0ICdzaGFkb3dlZCcsIHRoZXkgYXJlIGlnbm9yZWQuCgowMS8yMy8yMDA0OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBSZXBsYWNlIHRoZSAia25vd25fY2xhc3NlcyIgaGFzaCB0YWJsZSBieSBhIG5vZGUKCSAgICBhdHRyaWJ1dGUuICBNZXRob2RzIG9mIGNsYXNzZXMgaW4gQysrIG5hbWVzcGFjZXMgbm93IGdldAoJICAgIHRoZSBwcm9wZXIgc3BlY2lhbGl6ZXIgaW4gdGhlIEdPT1BTIGRlY2xhcmF0aW9uLgoJICAgIFJlcG9ydGVkIGJ5IHJtQG1oLWZyZWlidXJnLmRlLgoKMDEvMjMvMjAwNDogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gVW5pcXVpZnkgdGhlIGFyZ3VtZW50IG5hbWVzIGluIEdPT1BTIHNoYWRvdyBtZXRob2QKCSAgICBkZWNsYXJhdGlvbnMuICBSZXBvcnRlZCBieSBybUBtaC1mcmVpYnVyZy5kZS4KCjAxLzIxLzIwMDQ6IHN1bnNoaW5lIChFcmljIFN1bnNoaW5lKQogICAgICAgICAgICBSZXZpdmVkIHRoZSBOZXh0U3RlcCBwb3J0IG9mIFNXSUcuCgogICAgICAgICAgICBGaXhlZCBmYXRhbCBwcm9ibGVtIGluIERvaFN0cnN0cigpIGNhdXNlZCBieSBkaWZmZXJlbmNlIGluIHN0cnN0cigpCiAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHdoaWNoIG1hZGUgJWFwcGx5IGJlY29tZSBlbnRpcmVseSBkeXNmdW5jdGlvbmFsLiAgT24KICAgICAgICAgICAgTmV4dFN0ZXAsIHN0cnN0cigiZm9vIiwiIikgZXZhbHVhdGVzIHRvIE5VTEw7IHdoZXJlYXMsIG9uIG1vZGVybgogICAgICAgICAgICBwbGF0Zm9ybXMsIGl0IGV2YWx1YXRlcyB0byAiZm9vIi4gICVhcHBseSByZWxpZXMgZXh0ZW5zaXZlbHkgdXBvbgogICAgICAgICAgICBzdHJzdHIoImZvbyIsIiIpIGV2YWx1YXRpbmcgdG8gbm9uLU5VTEwsIHRoZXJlZm9yZSBpdCBmYWlsZWQKICAgICAgICAgICAgY2F0YXN0cm9waGljYWxseSB3aGVuIGZhY2VkIHdpdGggTmV4dFN0ZXAncyBzdHJzdHIoKS4KCiAgICAgICAgICAgIEFkZGVkIGBib29sJyBjaGVjayB0byBjb25maWd1cmUuaW4gc2luY2UgTmV4dFN0ZXAncyBDKysgY29tcGlsZXIKICAgICAgICAgICAgZG9lcyBub3Qgc3VwcGx5IHRoaXMgdHlwZS4gIHN3aWcuaCBub3cgZmFrZXMgdXAgYGJvb2wnIGlmIG5lZWRlZC4KCiAgICAgICAgICAgIFdvcmtlZCBhcm91bmQgTmV4dFN0ZXAgQysrIGNvbXBpbGVyIGJ1ZyBpbiB3aGljaCBDKysgY29kZSBpcwogICAgICAgICAgICBkaXNhbGxvd2VkIGluc2lkZSBleHRlcm4gIkMiIGZ1bmN0aW9ucy4gIFRoaXMgcHJvYmxlbSBhZmZlY3RlZCBhbGwKICAgICAgICAgICAgbGFuZ3VhZ2UgbW9kdWxlcywgc2luY2UgdGhleSBwdWJsaXNoIGhvb2sgZnVuY3Rpb25zIG9mIHRoZSBmb3JtOgogICAgICAgICAgICAgICAgZXh0ZXJuICJDIiBMYW5ndWFnZSAqc3dpZ19mb28odm9pZCkgeyByZXR1cm4gbmV3IEZPTygpOyB9CiAgICAgICAgICAgIEZpeGVkIGJ5IGNyZWF0aW5nIGEgQysrIHdyYXBwZXI6CiAgICAgICAgICAgICAgICBzdGF0aWMgTGFuZ3VhZ2UgKm5ld19zd2lnX2ZvbygpIHsgcmV0dXJuIG5ldyBGT08oKTsgfQogICAgICAgICAgICAgICAgZXh0ZXJuICJDIiBMYW5ndWFnZSAqc3dpZ19mb28odm9pZCkgeyByZXR1cm4gbmV3X3N3aWdfZm9vKCk7IH0KCiAgICAgICAgICAgIEVuc3VyZWQgdGhhdCBTd2lnX2NvcHlfc3RyaW5nKCkgaXMgdXNlZCBpbiBwbGFjZSBvZiBzdHJkdXAoKSBzaW5jZQogICAgICAgICAgICBOZXh0U3RlcCBkb2VzIG5vdCBzdXBwbHkgc3RyZHVwKCkuCgogICAgICAgICAgICBGaXhlZCBkZXRlY3Rpb24gb2YgUnVieSBsaWJyYXJ5IG5hbWUgYW5kIGxvY2F0aW9uIGluIGNvbmZpZ3VyZS5pbi4KICAgICAgICAgICAgUHJvYmxlbSAxOiBBc3N1bWVkIHRoYXQgbGlicmFyeSBhbHdheXMgcmVzaWRlZCBpbiBSdWJ5J3MgImFyY2hkaXIiLAogICAgICAgICAgICB3aGljaCB3YXMgY29ycmVjdCBmb3IgUnVieSAxLjYueCwgYnV0IHdoaWNoIGlzIGluY29ycmVjdCBmb3IgUnVieQogICAgICAgICAgICAxLjgueCwgaW4gd2hpY2ggY2FzZSB0aGUgbGlicmFyeSBub3JtYWxseSByZXNpZGVzIGluIFJ1YnkncwogICAgICAgICAgICAibGliZGlyIi4gIFByb2JsZW0gMjogQXNzdW1lZCB0aGF0IHRoZSBsaWJyYXJ5IGNvdWxkIGFsd2F5cyBiZQogICAgICAgICAgICBsaW5rZWQgdmlhICItbCIrUlVCWV9JTlNUQUxMX05BTUUgKHdoZXJlIFJVQllfSU5TVEFMTF9OQU1FCiAgICAgICAgICAgIHR5cGljYWxseSBpcyAicnVieSIpLCBob3dldmVyIHRoaXMgZmFpbGVkIGZvciBwbGF0Zm9ybXMsIHN1Y2ggYXMKICAgICAgICAgICAgTmV4dFN0ZXAsIHdoaWNoIGRvIG5vdCBzdXBwb3J0IHNoYXJlZCBsaWJyYXJpZXMuICBJbiB0aGlzIGNhc2UsIHRoZQogICAgICAgICAgICBzdGF0aWMgbGlicmFyeSBuYW1lIGluIDEuOC54IGlzIGxpYnJ1Ynktc3RhdGljLmEsIHRodXMKICAgICAgICAgICAgLWxydWJ5LXN0YXRpYyBpcyByZXF1aXJlZC4gIFRoZSBuZXcgbG9naWMgd29ya3MgY29ycmVjdGx5IGZvcgogICAgICAgICAgICBzdGF0aWMgYW5kIHNoYXJlZCBsaWJyYXJpZXMgZm9yIDEuNi54IGFuZCAxLjgueC4KCiAgICAgICAgICAgIEZpeGVkIGRldGVjdGlvbiBvZiBQZXJsIENGTEFHUyBpbiBjb25maWd1cmUuaW4gZm9yIE5leHRTdGVwLgogICAgICAgICAgICBEZXRlY3Rpb24gY29kZSBleHRyYWN0ZWQgQ0ZMQUdTIGZyb20gUGVybCdzICVDb25maWcgaGFzaCBidXQKICAgICAgICAgICAgbmVnbGVjdGVkIHRvIGFkZCBhIG5ld2xpbmUgdG8gdGhlIHZhbHVlIGJlZm9yZSBwYXNzaW5nIGl0IHRocm91Z2gKICAgICAgICAgICAgYHNlZCcuICBOZXh0U3RlcCdzIGFuY2llbnQgYHNlZCcgZGlzY2FyZHMgaW5wdXQgd2hpY2ggaXMgbm90CiAgICAgICAgICAgIHRlcm1pbmF0ZWQgd2l0aCBhIG5ld2xpbmUsIHRodXMgUGVybCBDRkxBR1MgYWx3YXlzIGV2YWx1YXRlZCB0byB0aGUKICAgICAgICAgICAgZW1wdHkgc3RyaW5nLgoKMDEvMTYvMjAwNDogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFRpZHkgdXAgaW4gdGhlIGV4Y2VwdGlvbiBoYW5kbGluZyBjb2RlIHRoYXQgaXMgZ2VuZXJhdGVkIHdoZW4KICAgICAgICAgICAgQysrIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9ucyBhcmUgd3JhcHBlZCB3aXRoIHRoZSB0aHJvd3MgdHlwZW1hcC4KICAgICAgICAgICAgVGhpcyByZWR1bmRhbnQgY29kZSBpcyBubyBsb25nZXIgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgICAgIGNhdGNoKC4uLikgewogICAgICAgICAgICAgICAgICAgIHRocm93OyAKICAgICAgICAgICAgICAgIH0KCjAxLzEyLzIwMDQ6IHdzZnVsdG9uIG9uIGJlaGFsZiBvZiBtbWF0dXMgKG1hcmNlbG8gbWF0dXMpIAogICAgICAgICAgICBpZiBhIG1ldGhvZCB1c2VzICVleGNlcHRpb24gYW5kIHRoZSBtZXRob2QgcmVxdWlyZXMgdGhlIHVzZQogICAgICAgICAgICBvZiB0aGUgdGhyb3dzIHR5cGVtYXAsIHRoZSBjb2RlIGluIGEgdGhyb3dzIHR5cGVtYXAgd2lsbCBiZQogICAgICAgICAgICBnZW5lcmF0ZWQgaW5zaWRlIHRoZSB0cnkgYm9keS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVleGNlcHRpb24gbWV0aG9kIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgIC8vIG1ldGhvZCBhY3Rpb24gCiAgICAgICAgICAgICAgICAgICRhY3Rpb24KICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGludCBpKSB7CiAgICAgICAgICAgICAgICAgIC8vIG1ldGhvZCBpbnQgY2F0Y2ggaGFuZGxlcgogICAgICAgICAgICAgICAgfSBjYXRjaCAoLi4uKSB7CiAgICAgICAgICAgICAgICAgIC8vIG1ldGhvZCBnZW5lcmljIGNhdGNoIGhhbmRsZXIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgJXR5cGVtYXAodGhyb3dzKSBFeGNlcHQgJXsKICAgICAgICAgICAgICAgIC8vIHRocm93cyB0eXBlbWFwIEV4Y2VwdCBjYXRjaCBoYW5kbGVyCiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICAgJWlubGluZSAlewogICAgICAgICAgICAgIGNsYXNzIEV4Y2VwdCB7fTsKICAgICAgICAgICAgICB2b2lkIG1ldGhvZChpbnQgaSkgdGhyb3cgKEV4Y2VwdCk7CgogICAgICAgICAgICBXaWxsIGdlbmVyYXRlOgoKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAvLyBtZXRob2QgYWN0aW9uIAogICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QoYXJnMSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBjYXRjaChFeGNlcHQgJl9lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyb3dzIHR5cGVtYXAgRXhjZXB0IGNhdGNoIGhhbmRsZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICB9IGNhdGNoIChpbnQgaSkgewogICAgICAgICAgICAgICAgICAgICAgLy8gbWV0aG9kIGludCBjYXRjaCBoYW5kbGVyCiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKC4uLikgewogICAgICAgICAgICAgICAgICAgICAgLy8gbWV0aG9kIGdlbmVyaWMgY2F0Y2ggaGFuZGxlcgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIEFzIGNhbiBiZSBzZWVuLCB0aGUgaW5uZXIgdHJ5IGNhdGNoIGJsb2NrIGlzIGZvciB0aGUgdGhyb3dzIHR5cGVtYXBzLgogICAgICAgICAgICBQcmV2aW91c2x5LCB0aGlzIHdhcyByZXZlcnNlZCBzbyB0aGF0IHRoZSBpbm5lciB0cnkgY2F0Y2ggYmxvY2sKICAgICAgICAgICAgd2FzIHRoZSAlZXhjZXB0aW9uIGNvZGUuIEluIHRoZSBleGFtcGxlIGFib3ZlLCBpdCB3b3VsZCBoYXZlIGJlZW4KICAgICAgICAgICAgaW1wb3NzaWJsZSB0byBjYXRjaCBFeGNlcHQgYXMgdGhlIGNhdGNoIGFsbCAoLi4uKSB3b3VsZCBjYXRjaCB0aGUKICAgICAgICAgICAgZXhjZXB0aW9uIGluc3RlYWQuCgpWZXJzaW9uIDEuMy4yMSAoSmFudWFyeSAxMSwgMjAwNCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowMS8xMC8yMDA0OiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgVGhlIG91dHB1dCBmb3JtYXQgZm9yIGJvdGggd2FybmluZ3MgYW5kIGVycm9ycyBjYW4gYmUgc2VsZWN0ZWQgZm9yCiAgICAgICAgICAgIGludGVncmF0aW9uIHdpdGggeW91ciBmYXZvdXJpdGUgSURFL2VkaXRvci4gRWRpdG9ycyBhbmQgSURFcyBjYW4gdXN1YWxseQogICAgICAgICAgICBwYXJzZSBlcnJvciBtZXNzYWdlcyBhbmQgaWYgaW4gdGhlIGFwcHJvcHJpYXRlIGZvcm1hdCB3aWxsIGVhc2lseSB0YWtlIHlvdSAKICAgICAgICAgICAgZGlyZWN0bHkgdG8gdGhlIHNvdXJjZSBvZiB0aGUgZXJyb3IuIFRoZSBzdGFuZGFyZCBmb3JtYXQgaXMgdXNlZCBieSAKICAgICAgICAgICAgZGVmYXVsdCBleGNlcHQgb24gV2luZG93cyB3aGVyZSB0aGUgTWljcm9zb2Z0IGZvcm1hdCBpcyB1c2VkIGJ5IGRlZmF1bHQuCiAgICAgICAgICAgIFRoZXNlIGNhbiBiZSBvdmVycmlkZGVuIHVzaW5nIGNvbW1hbmQgbGluZSBvcHRpb25zLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAkIHN3aWcgLXB5dGhvbiAtRnN0YW5kYXJkIGV4YW1wbGUuaQogICAgICAgICAgICAgICAgZXhhbXBsZS5pOjQ6IFN5bnRheCBlcnJvciBpbiBpbnB1dC4KICAgICAgICAgICAgICAgICQgc3dpZyAtcHl0aG9uIC1GbWljcm9zb2Z0IGV4YW1wbGUuaQogICAgICAgICAgICAgICAgZXhhbXBsZS5pKDQpOiBTeW50YXggZXJyb3IgaW4gaW5wdXQuCgowMS8wOS8yMDA0OiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgODcxOTA5IF0gc2ltcGxlIG5hbWVzcGFjZSBwcm9ibGVtLgogICAgICAgICAgICBUaGlzIHdhcyBhIHByb2JsZW0gdXNpbmcgYW5vbnltb3VzIHN0cnVjdHVyZXMgaW4gYSBuYW1lc3BhY2UuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBucyB7CiAgICAgICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCAgewogICAgICAgICAgICAgICAgICAgICAgaW50IG47CiAgICAgICAgICAgICAgICAgICB9IFM7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgSm9zaCBDaGVycnkuCgowMS8wOS8yMDA0OiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHNvbWUgYnJva2VuIFBlcmwgZXhhbXBsZXMuCgoxMi8yOC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmEgYW5kIEMjXSBGaXhlcyBmb3Igd3JhcHBpbmcgY292YXJpYW50IChwb2x5bW9ycGhpYykgcmV0dXJuIHR5cGVzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgQmFzZSB7CiAgICAgICAgICAgICAgICAgIHZpcnR1YWwgfkJhc2UoKTsKICAgICAgICAgICAgICAgICAgdmlydHVhbCBCYXNlKiBjb3B5KCkgY29uc3QgPSAwOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHN0cnVjdCBEZXJpdmVkIDogQmFzZSB7CiAgICAgICAgICAgICAgICAgIHZpcnR1YWwgRGVyaXZlZCogY29weSgpIGNvbnN0OwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoZSBEZXJpdmVkOjpjb3B5IHByb3h5IG1ldGhvZCByZXR1cm5zIEJhc2Ugbm90IERlcml2ZWQuIEEgd2FybmluZyBpcyBpc3N1ZWQKICAgICAgICAgICAgYWJvdXQgdGhpcy4gUHJldmlvdXNseSB0aGUgcG9pbnRlciB1c2VkIGJ5IHRoZSBwcm94eSBjbGFzcyB3YXMgaW5jb3JyZWN0bHkKICAgICAgICAgICAgdHJlYXRlZCBhcyBhIEJhc2UqIGluc3RlYWQgb2YgYSBEZXJpdmVkKi4KCjEyLzE4LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXggc28gdGhhdCBXaW5kb3dzIHBhdGhzIGFyZSBkaXNwbGF5ZWQgY29ycmVjdGx5IHdoZW4gcmVwb3J0aW5nIGVycm9ycy4KICAgICAgICAgICAgQW4gZXJyb3IgcHJldmlvdXNseSB3b3VsZCBoYXZlIGJlZW4gc2hvd24gc29tZXRoaW5nIGxpa2U6CgogICAgICAgICAgICAgIC4/eGFtcGxlLmk6MTQ6IFN5bnRheCBlcnJvciBpbiBpbnB1dC4KCiAgICAgICAgICAgIGluc3RlYWQgb2Y6CgogICAgICAgICAgICAgIC5cZXhhbXBsZS5pOjE0OiBTeW50YXggZXJyb3IgaW4gaW5wdXQuCgoKVmVyc2lvbiAxLjMuMjAgKERlY2VtYmVyIDE3LCAyMDAzKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMi8xNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIExhc3QgbWludXRlIG1vZGlmaWNhdGlvbnMuICAgUGVybDUgbW9kdWxlIG5vdyBnZW5lcmF0ZXMgc2hhZG93IGNsYXNzZXMKICAgICAgICAgICAgYnkgZGVmYXVsdCBsaWtlIGFsbCBvZiB0aGUgb3RoZXIgbW9kdWxlcy4gIFBIUDQgd3JhcHBlcnMgbm8gbG9uZ2VyCiAgICAgICAgICAgIGluY2x1ZGUgImNvbmZpZy5oIi4gCgoxMi8xNC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFdlYWtlbmVkIHdhcm5pbmcgbWVzc2FnZSByZWxhdGVkIHRvIGNvbnN0cnVjdG9yIG5hbWVzIHNvIHRoYXQgYW4KICAgICAgICAgICAgdW51c3VhbCBuZXN0ZWQtY2xhc3Mgd3JhcHBpbmcgdGVjaG5pcXVlIHdvdWxkIHdvcmsgYWdhaW4gKGFwcGFyZW50bHkKICAgICAgICAgICAgaXQgd29ya2VkIGluIHNvbWUgb2xkZXIgU1dJRyByZWxlYXNlcykuICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBjbGFzcyBTY29wZSB7CiAgICAgICAgICAgICAgICAgICBjbGFzcyBDbGFzc0E7CiAgICAgICAgICAgICAgICAgICBjbGFzcyBDbGFzc0I7CiAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgIGNsYXNzIFNjb3BlOjpDbGFzc0EgewogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgY2xhc3MgU2NvcGU6OkNsYXNzQiB7CiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgICBOb3RlOiAgVGhlcmUgaXMgc3RpbGwgc29tZSBvZGQgaW50ZXJhY3Rpb24gd2l0aCB0aGUgU1dJRyBzeW1ib2wKICAgICAgICAgICAgdGFibGUvdHlwZSBzeXN0ZW0gdGhhdCB3aWxsIG5lZWQgdG8gYmUgbG9va2VkIGF0IGluIGEgZnV0dXJlIHJlbGVhc2UuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEd1c3Rhdm8gTmllbWV5ZXIuCgoKMTIvMTEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBQcm90ZWN0ZWQgY2xhc3MgbWV0aG9kcyBhcmUgd3JhcHBlZCBhcyBwcm90ZWN0ZWQgSmF2YSBtZXRob2RzIAogICAgICAgICAgICB3aGVuIHVzaW5nIHRoZSBkaXJwcm90IGRpcmVjdG9yIGZlYXR1cmUuIFRoaXMgY2FuIGJlIGNoYW5nZWQgdXNpbmcKICAgICAgICAgICAgJWphdmFtZXRob2Rtb2RpZmllcnMgdG8gc29tZXRoaW5nIGVsc2Ugc2hvdWxkIHRoZSBuZWVkIGFyaXNlLCBmb3IKICAgICAgICAgICAgZXhhbXBsZSwgcHJpdmF0ZSBvciBwYWNrYWdlIGFjY2Vzcy4KCjEyLzExLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YSwgQyNdIAogICAgICAgICAgICAlamF2YW1ldGhvZG1vZGlmaWVycyAoSmF2YSkgYW5kICVjc21ldGhvZG1vZGlmaWVycyAoQyMpIG9wZXJhdGUgc2xpZ2h0bHkgCiAgICAgICAgICAgIGRpZmZlcmVudGx5LiBQcmV2aW91c2x5IHRoaXMgZmVhdHVyZSBoYWQgdG8gYmUgcHJlc2VudCB0byBzZXQgdGhlIG1ldGhvZAogICAgICAgICAgICBtb2RpZmllcnMuIE5vdyBpdCBpcyBvbmx5IHVzZWQgaWYgaXQgZXhpc3RzIGZvciB0aGUgbWV0aG9kIGJlaW5nIHdyYXBwZWQuCiAgICAgICAgICAgIFRoZSBkZWZhdWx0IGlzICJwdWJsaWMiIGFzIHByZXZpb3VzIGhvd2V2ZXIsIHdoZW4gd3JhcHBpbmcgcHJvdGVjdGVkCiAgICAgICAgICAgIGRpcmVjdG9yIG1ldGhvZHMgaXQgaXMgInByb3RlY3RlZCIuIFRoaXMgY2hhbmdlIHdpbGwgbm90IGFmZmVjdCBleGlzdGluZwogICAgICAgICAgICB1c2Ugb2YgdGhlICVqYXZhbWV0aG9kbW9kaWZpZXJzIG9yICVjc21ldGhvZG1vZGlmaWVycy4KCjEyLzExLzIwMDM6IG1tYXR1cyAoTWFyY2VsbyBNYXR1cykKCgkgICAgVGhpcyBmaXggc29tZSByZWN1cnJpbmcgcmVwb3J0cyBhYm91dCBrZXl3b3JkcyBub3QgYmVlbgoJICAgIHByb3Blcmx5IGlkZW50aWZpZWQgYW5kIHdhcm5lZCwgYW5kIGl0IHNvbHZlcyB0aGUgcHJvYmxlbQoJICAgIG9mIGhvdyB0byBhZGQgYSB0ZXN0IGZpbGUgdG8gdGhlIHRlc3Qtc3VpdGUgc3VjaCB0aGF0IGl0CgkgICAgZG9lc24ndCB1c2UgYW55IGtleXdvcmQgb2YgYWxsIHRoZSBzdXBwb3J0ZWQgbGFuZ3VhZ2VzCgkgICAgKGFuZCBkb2luZyBpdCB3aXRob3V0IGNvbXBpbGluZyB0aGUgdGVzdCBmb3IgYWxsIHRoZQoJICAgIHN1cHBvcnRlZCBsYW5ndWFnZXMsIHRoaW5nIHRoYXQgaXMgbm90IGFsd2F5cyBwb3NzaWJsZSwKCSAgICBhbmQgd2l0aG91dCByZXF1aXJpbmcgeW91IHRvIGtub3cgYWxsIHRoZSBzdXBwb3J0ZWQKCSAgICBsYW5ndWFnZSBrZXl3b3JkcywgdGhpbmcgdGhhdCBpcyBhbHdheXMgaW1wb3NzaWJsZSkuCgoJICAgIFNvIHRoZXNlIGFyZSB0aGUgY2hhbmdlcyBnbG9iYWxseSBzcGVha2luZzoKCgkgICAgLSBVbmlmb3JtIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBrZXl3b3JkIHdhcm5pbmdzIHRocm91Z2gKCSAgICAgIHRoZSBzdXBwb3J0ZWQgbGFuZ3VhZ2VzOiBhbGwgdGhlIGxhbmd1YWdlcyBoYXMgbm93IGEKCSAgICAgIHNlcGFyYXRlIGZpbGUgdGhhdCBkZWZpbmVzIHRoZSBrZXl3b3JkcyBvciBiYWQgbmFtZXM6CgoJCSAgcHl0aG9uL3B5dGhvbmt3LnN3ZwoJCSAgY2hpY2tlbi9jaGlja2Vua3cuc3dnCiAgICAgICAgICAgICAgICAgIC4uLi4KCgkgICAgLSBBZGRlZCBrZXl3b3JkIGxpc3QgZm9yIG1vc3Qgb2YgdGhlIGxhbmd1YWdlcyB0aGF0IGRpZG4ndAoJICAgICAgaGF2ZSBvbmUgKHVzaW5nIHRoZSBuZXcgc2VwYXJhdGVkIGZpbGUpLgoJCSAgICAJICAgIAoJICAgIC0gQWRkZWQgdGhlICJBbGwga2V5d29yZHMiIHdhcm5pbmcgc3VwcG9ydDogLVdhbGxrdyBvcHRpb24uCgogICAgICAgICAgICAgIFRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gaW5jbHVkZSBhbGwgdGhlIGtub3duIGtleXdvcmRzCgkgICAgICBmb3IgYWxsIHRoZSBzdXBwb3J0ZWQgbGFuZ3VhZ2VzLCBhbmQgY2FuIGJlIHVzZWQgYXM6CgogICAgICAgICAgICAgICAgIHN3aWcgLVdhbGxrdyAuLi4uCgkgICAgCgkgICAgICBUaGlzIHdpbGwgaGVscCB0byB0aGUgcHJvY2VzcyBvZiBhZGRpbmcgYSB0ZXN0LXN1aXRlCgkgICAgICBmaWxlIHRoYXQgY2FuIGJlIGNvbXBpbGVkIGluIGFsbCB0aGUgc3dpZyBzdXBwb3J0ZWQKCSAgICAgIGxhbmd1YWdlcywgYW5kIGl0IHdpbGwgYmUgYWxzbyBoZWxwZnVsIGZvciB1c2VycyB3aG8KCSAgICAgIHdhbnQgdG8gY3JlYXRlIG11bHRpLWxhbmd1YWdlIGxpYnJhcmllcy4KCSAgICAKCSAgICBBbmQgdGhlc2UgYXJlIHRoZSBkZXRhaWxlZCBjaGFuZ2VzIChtb3N0bHkgZmlsZSBhZGRpdGlvbik6CgoJICAgIC0gRm9yIHRoZSBsYW5ndWFnZXMgdGhhdCBhbHJlYWR5IGhhdmUgc29tZSBzb3J0IG9mIGtleXdvcmQKCSAgICAgIHdhcm5pbmcgbGlzdCwgbW92ZSBpdCB0byBhbiBleHRlcm5hbCBsYW5ndWFnZWt3LnN3ZwoJICAgICAgZmlsZSwgaWU6CgkgICAgCgkgICAgICAgICBtb3ZlIGtleXdvcmRzIGZyb20gcHl0aG9uLnN3ZyAtPiBweXRob25rdy5zd2cKCSAgICAgICAgIG1vdmUga2V5d29yZHMgZnJvbSBjaGlja2VuLnN3ZyAtPiBjaGlja2Vua3cuc3dnCgkgICAgICAgICBtb3ZlIGtleXdvcmRzIGZyb20gdGNsOC5zd2cgLT4gdGNsa3cuc3dnCiAKICAgICAgICAgICAgICBhbmQgcmUtaW5jbHVkZSBsYW5ndWFnZWt3LnN3ZyBmcm9tIGxhbmd1YWdlLnN3Zy4KCSAgICAKCSAgICAtIEZvciB0aGUgbGFuZ3VhZ2UgdGhhdCBkaWRuJ3QgaGF2ZSBhIGtleXdvcmQgbGlzdCwgYW5kCgkgICAgICBmb3IgdGhlIG9uZXMgdGhhdCBJIGNvdWxkIGZpbmQgYSBsaXN0LCBhZGQgdGhlCgkgICAgICBsYW5ndWFnZWt3LnN3ZyBmaWxlLCBpZToKCiAgICAgICAgICAgICAgICAgY3NoYXJwL2NzaGFycGt3LnN3ZwogICAgICAgICAgICAgICAgIGphdmEvamF2YWt3LnN3ZwogICAgICAgICAgICAgICAgIHBocDQvcGhwa3cuc3dnCgkJIHBpa2UvcGlrZWt3LnN3ZwkgCgkJIHJ1YnkvcnVieWt3LnN3ZwoKCiAgICAgICAgICAgICAgYWxzbyBhZGQgYSBsaW5lIGluIGxhbmd1YWdlLnN3ZyB0byBpbmNsdWRlCgkgICAgICBsYW5ndWFnZWt3LnN3ZywgYnV0IG5vdyBpdCBpcyBjb21tZW50ZWQhISEsIGxpa2UgaW4KCSAgICAgIGphdmEuc3dnOgoKICAgICAgICAgICAgICAgICAgLyogamF2YSBrZXl3b3JkcyAqLwogICAgICAgICAgICAgICAgICAvKiBwbGVhc2UgdGVzdCBhbmQgYWN0aXZhdGUgKi8KICAgICAgICAgICAgICAgICAgLy8laW5jbHVkZSAiamF2YWt3LnN3ZyIKCgkgICAgICBpZSwgdGhlcmUgd2lsbCBiZSBubyBjaGFuZ2UgaW4gaG93IHN3aWcgcnVucyBub3JtYWxseQoJICAgICAgdW50aWwgdGhlIGxhbmd1YWdlIG1haW50YWluZXIgdGVzdCBhbmQgdW5jb21tZW50IHRoYXQKCSAgICAgIGxpbmUuCgkgICAgICAKCSAgICAgIFNvLCBwbGVhc2UgY2hlY2sgZWFjaCBsYW5ndWFnZWt3LnN3ZyBmaWxlIChJIGxlZnQgdGhlCgkgICAgICBsaW5rIHRvIHRoZSBrZXl3b3JkIGxpc3Qgc291cmNlIGZvciBjaGVja2luZyksIGFuZCBhZnRlcgoJICAgICAgdGVzdGluZywgdW5jb21tZW50IHRoZSAlaW5jbHVkZSBsaW5lLgoKCSAgICAtIEFkZGVkIHRoZSBmaWxlIGFsbGt3LnN3Zywgd2hpY2ggaW5jbHVkZXMgYWxsIHRoZQogICAgICAgICAgICAgIGxhbmd1YWdla3cuc3dnIGZpbGVzLgoKCSAgICAgIEZvciB0aGUgbGFuZ3VhZ2VzIHRoYXQgaGFzIG5vIGxhbmd1YWdla3cuc3dnIGZpbGUgcmlnaHQKCSAgICAgIG5vdywgYW5kIGlmIHRoZXkgbmVlZCBvbmUsIGFkZCB0aGUgZmlsZSBpbnRvIHRoZQoJICAgICAgbGFuZ3VhZ2UgZGlyZWN0b3J5LCBhbmQgYWRkIHRoZSBjb3JyZXNwb25kaW5nIGluY2x1ZGUKCSAgICAgIGxpbmUgaW50byB0aGUgYWxsa3cuc3dnIGZpbGUuCgkgICAgICAKCSAgICAtIEFkZGVkIHRoZSAtV2FsbGt3IHRoYXQgaW5jbHVkZXMgdGhlIGFsbGt3LnN3ZyBmaWxlLgoJICAgICAgTm90ZSB0aGF0IHRoZSBvbGQgLWxhbGxrdy5zd2cgb3B0aW9uIGNvdWxkbid0IGJlIHVzZWQKCSAgICAgIHNpbmNlIGl0IGluY2x1ZGUgdGhlIGZpbGUgYWZ0ZXIgaXQgd291bGQgYmUgbmVlZGVkLgoKCgkgICAgSG9wZWZ1bGx5LCB0aGUgLVdhbGxrdyBvcHRpb24gd2lsbCBiZSBhZGRlZCB0byB0aGUgZGVmYXVsdAoJICAgIHJ1bGVzIGluIHRoZSByZWxhdGVkIHRlc3Qtc3VpdGUgTWFrZWZpbGVzLCBzbywgd2hlbgoJICAgIGNyZWF0aW5nIGEgbmV3IHRlc3QsIG9yIGFkZGluZyBhIG5ldyBzd2lnIGxpYnJhcnkgZmlsZQoJICAgIChsaWtlIF9zdGRfZGVxdWUuaSksIHN3aWcgd2lsbCB3YXJuIHlvdSBpZiB5b3UgYXJlIHVzaW5nIGEKCSAgICBiYWQgbmFtZSwgY29uc2lkZXJpbmcgYWxsIHRoZSBsYW5ndWFnZSB3aGVyZSBpdCBuZWVkcyB0bwoJICAgIHJ1bi4KCSAgICAKCSAgICBSaWdodCBub3cgeW91IGNhbiB0ZXN0IGl0IGJ5IHVzaW5nOgoKICAgICAgICAgICAgICAgbWFrZSBjaGVjay1weXRob24tdGVzdC1zdWl0ZSBTV0lHPSJzd2lnIC1XYWxsa3ciCgoJICAgIG9yIHVzaW5nIHlvdXIgZmF2b3JpdGUgdGFyZ2V0IGxhbmd1YWdlLCBpdCBkb2Vzbid0IG1hdHRlci4KCgkgICAgQW5kIHllcywgdGhlcmUgYXJlIHNldmVyYWwgZXhhbXBsZXMgdGhhdCBhcmUgdXNpbmcKCSAgICByZXNlcnZlZCBrZXl3b3Jkcywgc3BlY2lhbGx5IGZyb20gY3NoYXJwLgogICAgICAgICAgCgkgICAgKioqIFJlbWVtYmVyICoqKio6IHRoZSBuZXcga2V5d29yZCB3YXJuaW5nIGxpc3RzIGFyZSBub3QKCSAgICBpbmNsdWRlZCBieSBkZWZhdWx0IGluIGFueSBvZiBsYW5ndWFnZSB0aGF0IGJlZm9yZSBkaWRuJ3QKCSAgICBoYXZlIG9uZS4gVG8gZW5hYmxlIHRoZSBrZXl3b3JkIHdhcm5pbmdzIGFzIHRoZSBkZWZhdWx0CgkgICAgYmVoYXZpb3IsIHRoZSBpbmNsdXNpb24gb2YgdGhlIGxhbmd1YWdla3cuc3dnIGZpbGUgaGFzIHRvCgkgICAgYmUgdW5jb21tZW50ZWQgYXQgZWFjaCBsYW5ndWFnZS5zd2cgZmlsZS4KCgkgICAgU28sIGFsbCB0aGUgbGFuZ3VhZ2UgbWFpbnRhaW5lcnMsIHBsZWFzZSBjaGVjayB0aGUKCSAgICBrZXl3b3JkcyBsaXN0LiAKCgkgICAgQWxzbywgeW91IGNhbiBhZGQgYnVpdC1pbiBuYW1lcywgYW5kIG5vdCBvbmx5IGtleXdvcmRzLCBsaWtlCgkgICAgJ1RydWUvRmFsc2UnIGluIHB5dGhvbi4gIFJlbWVtYmVyIHRoYXQgeW91IGNhbiBiZSBtb3JlCgkgICAgc3BlY2lmaWMgYW5kIHJlZmVyIG9ubHkgdG8gbWVtYmVyIG5hbWVzLCBsaWtlICo6OmNvbmZpZ3VyZQoJICAgIG9yICo6OmNnZXQgKHNlZSBhbiBleGFtcGxlIGluIHRoZSB0Y2w4L3RjbDhrdy5zd2cgZmlsZSksCgkgICAgb3Igb25seSBnbG9iYWwgbmFtZXMsIGxpa2UgOjpyYW5nZSAoc2VlIGFuIGV4YW1wbGUgaW4gdGhlCgkgICAgcHl0aG9uL3B5dGhvbmt3LnN3ZyBmaWxlLgoKCSAgICBKdXN0IHRvIGJlIGNvbnNpc3RlbnQsIHVzZSB0aGUgZm9sbG93aW5nIGNvZGVzOgoKCSAgICAtIFVzZSBjb2RlIDMxNCBmb3Iga2V5d29yZCBhbmQvb3IgZmF0YWwgYmFkIG5hbWVzLgoJICAgIC0gVXNlIGNvZGUgMzIxIGZvciBidWl0LWluIGFuZC9vciBub3QgZmF0YWwgYmFkIG5hbWVzLgogICAgICAgICAgIAogICAgICAgICAgICBzbywgdGhleSBjYW4ndCBiZSBkaXNhYmxlZC9lbmFibGVkIGluZGVwZW5kZW50bHkgKHNlZQoJICAgIHB5dGhvbi9weWh0b25rdy5zd2cgZm9yIGV4YW1wbGVzKS4KCgkgICAgKioqKiBBbmQgZG9uJ3QgYWRkIGFueSBuZXcgdGVzdCBmaWxlIHdpdGhvdXQgY2hlY2tpbmcgaXQKCSAgICB3aXRoIHRoZSAtV2FsbGt3IG9wdGlvbiEhICh0aGF0IGluY2x1ZGVzIG1lKSAqKioqKi4KCSAgCgoxMi8xMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgU0YgYnVnICM4NTQ2MzQKICAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgYWNjZXB0aW5nIHRoZSBVbml4IGRpcmVjdG9yeSBzZXBhcmF0b3IgJy8nIG9uIAogICAgICAgICAgICBXaW5kb3dzIGFuZCB0aGUgTWFjIGluIGFkZGl0aW9uIHRvIHRoZSBuYXRpdmUgb25lICggJ1wnIG9uIAogICAgICAgICAgICBXaW5kb3dzKS4gVGhpcyBjYW4gYmUgdXNlZCBpbiAlaW1wb3J0LCAlaW5jbHVkZSBhbmQgY29tbWFuZGxpbmUgCiAgICAgICAgICAgIG9wdGlvbnMgdGFraW5nIGEgcGF0aCwgZm9yIGV4YW1wbGUgLUkuIE9uIEN5Z3dpbiwgYm90aCB0aGUgV2luZG93cwogICAgICAgICAgICBhbmQgVW5peCBkaXJlY3Rvcnkgc2VwYXJhdG9yIGNhbiBub3cgYmUgdXNlZCAod2FzICcvJyBvbmx5KS4KICAgICAgICAgICAgCjEyLzEwLzIwMDM6IG1tYXR1cyAoTWFyY2VsbyBNYXR1cykKCiAgICAgICAgICAgIFtweXRob25dIEltcGxlbWVudGluZyB0aGUgcnVudGltZSAicmVwcm90ZWN0ZWQiIGRpcmVjdG9yCgkgICAgbWVtYmVycywgaWYgeW91IGhhdmU6CiAgICAKICAgICAgICAgICAgICAgICVmZWF0dXJlKCJkaXJlY3RvciIpIEI7CgogICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgdmlydHVhbCB+QmFyKCk7CiAgICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IGhlbGxvKCkgeyByZXR1cm4gZG9faGVsbG8oKTspCgogICAgICAgICAgICAgICAgcHJvdGVjdGVkOgogICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBkb19oaSgpIHtyZXR1cm4gMDt9CiAgICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IGRvX2hlbGxvKCkge3JldHVybiAwO30KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICB0aGVuLCBhdCB0aGUgcHl0aG9uIHNpZGUKCiAgICAgICAgICAgICAgICBpbXBvcnQgbXlfbW9kdWxlCgogICAgICAgICAgICAgICAgY2xhc3MgRm9vKG15X21vZHVsZS5CYXIpOgogICAgICAgICAgICAgICAgICBkZWYgZG9faGVsbG8oc2VsZik6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEKICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICAgICAgIAoJICAgICAgICBiID0gQmFyKCkgIyBQdXJlIEMrKyBEaXJlY3RvciBjbGFzcwogICAgICAgICAgICAgICAgZiA9IEZvbygpICMgQysrIERpcmVjdG9yICsgcHl0aG9uIG1ldGhvZHMKCiAgICAgICAgICAgICAgICBiLmhlbGxvKCkgIyBPaywgYW5kIGl0IGNhbGxzIEMrKyBCYXI6OmRvX2hlbGxvKCkKICAgICAgICAgICAgICAgIGYuaGVsbG8oKSAjIE9rLCBhbmQgaXQgY2FsbHMgUHl0aG9uIEZvbzo6ZG9faGVsbG8oKQoKICAgICAgICAgICAgICAgIGIuZG9faGkoKSAjIFJ1bnRpbWVFcnJvciwgZG9faGkoKSBpcyBwcm90ZWN0ZWQhIQogICAgICAgICAgICAgICAgZi5kb19oaSgpICMgUnVudGltZUVycm9yLCBkb19oaSgpIGlzIHByb3RlY3RlZCEhCiAKICAgICAgICAgICAgICAgIGIuZG9faGVsbG8oKSAjIFJ1bnRpbWVFcnJvciwgZG9faGVsbG8oKSBpcyBwcm90ZWN0ZWQhIQogICAgICAgICAgICAgICAgZi5kb19oZWxsbygpICMgT2ssIHNpbmNlIGl0IGl0cyByZWRlZmluZWQgaW4gcHl0aG9uLgoKICAgICAgICAgICAgSGVyZSBCYXIuZG9faGVsbG8gaXMgYWx3YXlzIHByb3RlY3RlZCwgYnV0IEZvby5kb19oZWxsbwogICAgICAgICAgICBpcyAicHVibGljIiwgYmVjYXVzZSBpdCBpcyByZWRlZmluZWQgaW4gcHl0aG9uLiBCZWZvcmUsCgkgICAgYWxsIHRoZSAnZG9faGVsbG8nIG1ldGhvZHMgd2VyZSBwdWJsaWMuCgoJICAgIFRoaXMgc2VlbXMgdG8gYmUgYSBnb29kIGNvbXByb21pc2UgYmV0d2VlbiBDKysgYW5kIHB5dGhvbgoJICAgIHBoaWxvc29waGllcywgaWUsIGFsbCB0aGUgZGlyZWN0b3IgcHJvdGVjdGVkIG1ldGhvZHMga2VlcAoJICAgIHByb3RlY3RlZCBhdCB0aGUgdXNlciBzaWRlIChDKysgd2F5KSB1bnRpbCB0aGV5IGFyZQoJICAgIHJlZGVmaW5lZCAocHl0aG9uIHdheSwgd2VyZSBhbGwgZGVmaW5lZCBtZXRob2RzIGFyZSBhbHdheXMKCSAgICBwdWJsaWMpLiBBbmQgdGhpcyBpcyBub3Qgb25seSBhIGdvb2QgY29tcHJvbWlzZSwgaXQgYWxzbwoJICAgIHNlZW1zIHRvIGJlIHRoZSBvbmx5IHdheSB0byBkbyBpdCA6KS4KCgkgICAgTm93IHJ1YnkgaGFzIG5hdGl2ZSBkaXJlY3RvciBwcm90ZWN0ZWQgbWVtYmVycywgYW5kIHB5dGhvbgoJICAgIHB1cmUgcnVudGltZSBzdXBwb3J0LiBJIGd1ZXNzIHRoZXNlIGFyZSB0aGUgdHdvIHBvc3NpYmxlCgkgICAgZXh0cmVtZSBjYXNlcy4gQW5kIGhvcGVmdWxseSwgdGhleSBjb3VsZCBiZSB1c2VkIGFzCgkgICAgdGVtcGxhdGVzIHRvIG1vZGlmeSB0aGUgb3RoZXIgbGFuZ3VhZ2VzIHRoYXQgc3VwcG9ydAoJICAgIGRpcmVjdG9ycywgc28gdGhleSBjYW4gInJlcHJvdGVjdCIgdGhlIHByb3RlY3RlZCBkaXJlY3RvcgoJICAgIG1lbWJlcnMgYXQgdGhlIHRhcmdldCBsYW5ndWFnZSBzaWRlLgoKCSAgICBUaGlzIGZpbmlzaGVkIHRoZSBkaXJlY3RvciBwcm90ZWN0ZWQgc3VwcG9ydCBmb3IgdGhlIAoJICAgIHB5dGhvbiBsYW5ndWFnZS4gT2NhbG0gd2lsbCBuZWVkIHRvIGFkZCB0aGUKCSAgICAicmVwcm90ZWN0aW9uIiBsYXRlci4KCjEyLzEwLzIwMDM6IG1tYXR1cyAoTWFyY2VsbyBNYXR1cykKCgkgICAgVGhlIGZvbGxvd2luZyBjYXNlIChyZXBvcnRlZCBieSBMeWxlIEpvaG5zb24pIHdhcyBmaXhlZDoKCgkgICAgICAlcmVuYW1lKHgpIEZvbzo6eSgpOwogCgkgICAgICBjbGFzcyBGb28geyAKCSAgICAgIHB1YmxpYzoKCSAgICAgICAgdm9pZCB5KCk7CgoJICAgICAgcHJvdGVjdGVkOgoJICAgICAgICBpbnQgeDsKCSAgICAgIH07CgoJICAgc3dpZyB3YXJuZWQgdGhhdCB0aGUgc3ltYm9sICd4JyB3YXMgYWxyZWFkeSBkZWZpbmVkLCBhbmQKICAgICAgICAgICB0aGUgcmVuYW1pbmcgZmFpbHMuICd4JyB3YXMgbm90IGVtaXR0ZWQsIHNpbmNlIGl0IGlzCiAgICAgICAgICAgcHJvdGVjdGVkLCBidXQgaXQgd2FzIGtlcHQgaW4gdGhlIHN5bWJvbCB0YWJsZSB3aXRoIHRvbwogICAgICAgICAgIG11Y2ggaW5mb3JtYXRpb24uCgoJICAgTm93IHN3aWcgd29ya3MgZm9yIGFsbCB0aGUgY2FzZXMgKHBsYWluLCBkaXJlY3RvciBhbmQKCSAgIGRpcnByb3QpIGFnYWluLiBUaGlzIHdhcyBmaXhlZCBieSBhbGxvd2luZyB0aGUgcGFyc2VyLnkgdG8KCSAgIGRlY2lkZSBtdWNoIGNsb3NlciB3aGF0IHRvIGRvIHdpdGggJ3gnLiBCZWZvcmUgYWxsIHRoZQoJICAgZGlzY2FyZGluZyBvciBnZW5lcmF0aW9uIHdhcyByZXNvbHZlZCBhdCB0aGUgbGFuZy5jeHgKCSAgIHN0YWdlLiBBbHNvIHRoZSBjaGFuZ2VzIGluIHBhcnNlci55IHRvIGltcGxlbWVudCB0aGUKCSAgIGRpcmVjdG9yIHByb3RlY3RlZCBtb2RlIGFyZSBub3cgbXVjaCBtb3JlIGVuY2Fwc3VsYXRlZCwgYW5kCgkgICB0aGV5IGdldCBkaXNhYmxlZCBpZiB0aGUgbW9kZSBpcyBub3QgZW5hYmxlZC4gQmVmb3JlIHRoZQoJICAgZGVhY3RpdmF0aW9uIHdhcyBkb25lIGF0IHRoZSBnZW5lcmF0aW9uIHN0YWdlIChsYW5nLmN4eCkuCgoJICAgQnkgdGhlIG90aGVyIGhhbmQsIGlmIHRoZSBkaXJlY3RvciBtb2RlIGlzIGVuYWJsZWQsIGFuZAoJICAgJXJlbmFtZSBpcyBkb25lLCByZXVzaW5nIGEgcHJvdGVjdGVkIG1lbWJlciBuYW1lLCB0aGVyZSBpcwoJICAgYSBwYXRob2xvZ2ljYWwgY2FzZToKCgkgICAgICVyZW5hbWUoeCkgRm9vOjp5KCk7CiAKICAgICAgICAgICAgIGNsYXNzIEZvbyA6IHB1YmxpYyBBIHsKCSAgICAgcHVibGljOgoJICAgICAgIHZvaWQgeSgpOwoKCSAgICAgcHJvdGVjdGVkOgoJICAgICAgIGludCB4OyAgICAgICAgICAgIC8qIHdvcmtzICovCgkgICAgICAgc3RhdGljICBpbnQgeDsgICAgLyogd29ya3MgKi8KCSAgICAgICBzdGF0aWMgIHZvaWQgeCgpOyAvKiB3b3JrcyAqLwoJICAgICAgIHR5cGVkZWYgdm9pZCB4KCk7IC8qIHdvcmtzICovCgoJICAgICAgIHZpcnR1YWwgdm9pZCB4KCk7IC8qIGFsd2F5cyBmYWlscywgYXMgaXQgc2hvdWxkLCBzaW5jZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb286OngoKSB3aWxsIGJlIGVtaXR0ZWQgaW4gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yICovCgoJICAgICAgIHZvaWQgeCgpOyAvKiBhbHdheXMgZmFpbHMsIGJ1dCBzb21ldGltZXMgaXQgc2hvdWxkbid0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luY2UgdGhlIEZvbzo6eCgpIHdpbGwgbm90IGJlIGVtaXR0ZWQgaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IGlzIG5vdCB2aXJ0dWFsICovCgoJICAgICB9OwoKCSAgIFRoZSBsYXN0IGNhc2UgaXMgbm90IGFsd2F5cyByaWdodCBiZWNhdXNlIGF0IHRoZSBwYXJzZXIucHkKCSAgIHN0YWdlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBkZWNpZGUgaWYgdGhlIHByb3RlY3RlZCBtZW1iZXIKCSAgIEZvbzo6eCgpIGNvdWxkIG9yIG5vdCBjb25mbGljdCB3aXRoIHRoZSByZW5hbWVkIEZvbzo6eSgpLAoJICAgc2luY2UgRm9vOjp4KCkgY291bGQgYmUgdmlydHVhbCBieSBpbmhlcml0YW5jZS4KCgkgICBJIGd1ZXNzIHRoaXMganVzdCBhbiBpbnRyaW5zaWMgbGltaXRhdGlvbiwgYW5kIG5vIG11Y2ggY2FuCgkgICBiZSBkb25lIGFib3V0IGl0IHdpdGhvdXQgcmVzb3J0aW5nIGludG8gbGFyZ2VyIGNoYW5nZXMgdG8KCSAgIHBvc3Rwb25lLCB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnMsIHRoZSBtdWx0aXBseSBzeW1ib2wKCSAgIGRldGVjdGlvbiAobGFuZy5jeHggc3RhZ2UpLgoJICAgCgkgICBTbywgYnkgbm93LCBpdCBpcyBqdXN0IGNvbnNpZGVyZWQgYSB3ZWxsIGtub3duICJmZWF0dXJlIiBpbgoJICAgdGhlIGRpcmVjdG9yIHByb3RlY3RlZCBtb2RlLiBUaGUgZ29vZCBuZXdzIGlzIHRoYXQgaXQgc2VlbXMKCSAgIHRvIGJlIGEgcmFyZSBjYXNlLCBhbmQgaXQgY2FuIGJlIGF2b2lkZWQgYnkgdGhlIHVzZXIgYnkKCSAgIGhpZGluZyAneCcgYmVmb3JlIHJlbmFtaW5nICd5JzoKCgkgICAgICVyZW5hbWUoX3gpIEZvbzo6eCgpOwoJICAgICAlcmVuYW1lKHgpIEZvbzo6eSgpOwoJICAgCgoxMi8wOC8yMDAzOiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpCgkgICAgVGhlIHZpcnR1YWwgbWV0aG9kIGRldGVjdGlvbnMgbm93IHByb3Blcmx5CgkgICAgdHJlYXRzIHRoZSBmb2xsb3dpbmcgY2FzZXM6CgogICAgICAgICAgICAgbmFtZXNwYWNlIGZvbyB7IHR5cGVkZWYgaW50IEludDsgfQoJICAgICBzdHJ1Y3QgQSB7fTsKCSAgICAgdHlwZWRlZiBBIEI7CgogICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgIHZpcnR1YWwgfkZvbygpIHt9CgogICAgICAgICAgICAgICB2aXJ0dWFsIEZvbyogY2xvbmVyKCkgPSAwOwoJICAgICAgIHZpcnR1YWwgaW50IGdldF92YWx1ZSgpID0gMDsKCSAgICAgICB2aXJ0dWFsIEEqIGdldF9jbGFzcygpID0gMDsKCSAgICAgICB2aXJ0dWFsIHZvaWQganVzdF9kb19pdCgpID0gMDsKCSAgICAgfTsKCiAgICAgICAgICAgICBzdHJ1Y3QgQmFyIDogRm9vCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgIEJhciogY2xvbmVyKCk7CiAgICAgICAgICAgICAgIGZvbzo6SW50IGdldF92YWx1ZSgpOwogICAgICAgICAgICAgICBCKiBnZXRfY2xhc3MoKTsKICAgICAgICAgICAgICAgdm9pZCBqdXN0X2RvX2l0KCk7CiAgICAgICAgICAgICB9OwogCiAgICAgICAgICAgIEFsbCB0aGUgRm9vIGFuZCBCYXIgbWV0aG9kcyBhcmUgdmlydHVhbC4gIEEgbmV3IGF0dHJpYnV0ZQoJICAgICJ2aXJ0dWFsOnR5cGUiIHJlY29yZCB0aGUgYmFzZSBwb2x5bW9ycGhpYyB0eXBlLiBJbiB0aGUKCSAgICBwcmV2aW91cyBjYXNlcyB3ZSBoYXZlOgoKCSAgICAgICB0eXBlIDogQmFyICAgICAgIHZpcnR1YWw6dHlwZSA6IEZvbwoJICAgICAgIHR5cGUgOiBmb286OkludCAgdmlydHVhbDp0eXBlIDogaW50CgkgICAgICAgdHlwZSA6IEIgICAgICAgICB2aXJ0dWFsOnR5cGUgOiBBCgkgICAgICAgdHlwZSA6IHZvaWQgICAgICB2aXJ0dWFsOnR5cGUgOiB2b2lkCgogICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VmdWwgaW4gbGFuZ3VhZ2VzIChqYXZhK2RpcmVjdG9ycykKCSAgICB0aGF0IGNvdWxkIGhhdmUgcHJvYmxlbXMgcmVkZWZpbmluZyBCYXIqIEJhcjo6Y2xvbmVyKCkuCgoJICAgIElmIHlvdSBuZXZlciBoYWQgY29kZSBsaWtlIHRoZSBhYm92ZSwgeW91IHdpbGwgc2VlIG5vCgkgICAgZWZmZWN0cy4gQnV0IGlmIHlvdSBoYXZlIHNvbWUgY29kZSBsaWtlIHRoYXQsIHlvdQoJICAgIHdpbGwgc2VlIHNvbWUgZWZmZWN0cyBzaW5jZSBzb21lIG1ldGhvZHMgdGhhdAoJICAgIGJlZm9yZSB3ZXJlIG5vdCBwcm9wZXJseSB0cmVhdGVkIGFzIHZpcnR1YWwsCgkgICAgd2lsbCBzdGFydCB0byBhY3QgbGlrZSB0aGF0LiBUaGlzIGNvdWxkIGVubGFyZ2UKCSAgICB5b3VyIGRpcmVjdG9yIGNsYXNzZXMuCgkgICAgCgoxMi8wOC8yMDAzOiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpCgkgICAgVGhlIGRpcmVjdG9yIHByb3RlY3RlZCBtZW1iZXIgc3VwcG9ydCAoZGlycHJvdCkKCSAgICBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgoJICAgIAoJICAgIEl0IGNhbiBiZSBlbmFibGUgYnkgdXNpbmcgJy1kaXJwcm90JyBvciBieSBhZGRpbmcKCSAgICB0aGUgb3B0aW9uIHRvIHRoZSBtb2R1bGUgZGVjbGFyYXRpb24sIGxpa2U6CgogICAgICAgICAgICAlbW9kdWxlKGRpcmVjdG9ycz0iMSIsZGlycHJvdD0iMSIpIG15X21vZHVsZQoKCSAgICBUaGlzIG1vZHVsZSBvcHRpb24gd2FzIGFkZGVkIHRvIHByb3Blcmx5IGNvbXBpbGUgdGhlCgkgICAgZGlyZWN0b3JfcHJvdGVjdGVkLmkgYW5kIGRpcmVjdG9yX25lc3RlZC5pIGV4YW1wbGVzLgoJICAgIAoJICAgIFRoZSBmZWF0dXJlIGhhcyBiZWVuIHRlc3RlZCB3aXRoIHB5dGhvblsyLjIsMi4zXSAKCSAgICBhbmQgcnVieVsxLjYuN10sIGJvdGggYXQgY29tcGlsYXRpb24gYW5kIHJ1bnRpbWUsIGFuZCAKCSAgICBqYXZhW2oyc2RrMS40LjFfMDFdLCBidXQgb25seSBhdCBjb21waWxhdGlvbiAobXkgamF2YQoJICAgIGluc3RhbGxhdGlvbiBkb2Vzbid0IHJ1biBhbnkgb2YgdGhlIGRpcmVjdG9yIGV4YW1wbGVzLAoJICAgIG9sZHMgbm9yIG5ld3MpLgoKCSAgICBQbGVhc2UgdGVzdCBmb3Igb2NhbWwgYW5kIGphdmEuCgkgICAgCgkgICAgVGhlIGVycm9ycyByZXBvcnRlZCBieSBXaWxsaWFtIGFuZCBTY290dCB3ZXJlIGZpeGVkLAoJICAgIGV4Y2VwdCBmb3IgYSB3YXJuaW5nIGFib3V0ICBTV0lHX0phdmFUaHJvd0V4ZWNwdGlvbigpCgkgICAgbXVsdGlwbHkgZGVmaW5lZC4gSSBjYW4ndCByZXByb2R1Y2UgdGhpcyBlcnJvciB3aXRoIG15CgkgICAgZXhhbXBsZXMuIFdlIHdpbGwgd2FpdCBmb3IgU2NvdHQgdG8gc2VuZCB1cyBhIG1pbmltYWwKCSAgICBjYXNlLgoKCjEyLzA3LzIwMDM6IG1tYXR1cyAoTWFyY2VsbyBNYXR1cykKCSAgICBUaGUgZGlyZWN0b3IgcHJvdGVjdGVkIG1lbWJlciBzdXBwb3J0IGhhcyBiZWVuCgkgICAgY29tcGxldGx5IG1vdmVkIG91dCBmcm9tIHB5dGhvbi5jeHgsIGFuZCBub3cKCSAgICByZXNpZGVzIGluIHRoZSBjb21tb24gbGFuZy5jeHgsIGVtaXQuY3h4IGFuZAoJICAgIGFsbG9jYXRlLmN4eCBmaWxlcy4gCgoJICAgIFRoaXMgbWVhbnMgaXQgc2hvdWxkIHdvcmsgZm9yIGFsbCB0aGUgb3RoZXIgbGFuZ3VhZ2VzCgkgICAgdGhhdCBjdXJyZW50bHkgc3VwcG9ydCBkaXJlY3RvcnMsIGllLCBweXRob24sIGphdmEsIG9jYWxtCgkgICAgYW5kIHJ1YnkuCgoJICAgIFRoZSBjaGFuZ2UgaGFzIGJlZW4gdGVzdGVkIHdpdGggcHl0aG9uIChjb21waWxhdGlvbitydW50aW1lKQoJICAgIGFuZCBqYXZhIChqdXN0IGNvbXBpbGF0aW9uKS4KCSAgICAKCSAgICBQbGVhc2UgYWRkIHJ1bnRpbWUgdGVzdHMgZm9yIHRoZSBtaXNzaW5nIGxhbmd1YWdlcyAKCSAgICBhbmQgdGVzdCBpdC4KCgkgICAgVGhlICctbm9kaXJwcm90JyBvcHRpb24gd2FzIG1vdmVkIHRvIHRoZSBwcmluY2lwYWwgbWFpbiwKCSAgICBhbmQgY2FuIGJlIHVzZWQgZnJvbSBhbGwgdGhlIGxhbmd1YWdlcy4KCjEyLzA3LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4ZWQgYW5kIGltcHJvdmVkIGVycm9yIGNoZWNraW5nIG9mIFNUUklOR19PVVQgdHlwZW1hcHMgaW4gCiAgICAgICAgICAgIHZhcmlvdXMuaS4KCjEyLzA0LzIwMDM6IG1tYXR1cyAoTWFyY2VsbyBNYXR1cykKCgkgICAgLSBOb3cgdGhlIHZpcnR1YWwgbWVtYmVycyB3aXRoIG5vIGV4cGxpY2l0IGRlY2xhcmF0b3IKCSAgICBhcmUgcHJvcGVybHkgaWRlbnRpZmllZDoKCSAgICAKICAgICAgICAgICAgICAgIHN0cnVjdCBBICB7CiAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgZigpID0gMDsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgc3RydWN0IEIgOiBBIHsKICAgICAgICAgICAgICAgICAgaW50IGYoKTsKICAgICAgICAgICAgICAgIH07CgoJICAgIEhlcmUsIEI6OmYoKSBpcyB2aXJ0dWFsLCBhbmQgdGhlIGRpcmVjdG9yIGFuZCB0aGUKCSAgICB2aXJ0dWFsIGVsaW1pbmF0aW9uIG1lY2hhbmlzbSBub3cgcmVjb2duaXplIHRoYXQuCgogICAgICAgICAgICAtIFtDI10gVGhpcyBmaXggYWxzbyBmaXhlcyB0aGUgcHJvYmxlbSB3aGVyZSAnb3ZlcnJpZGUnIHdhcyBub3QgYmVpbmcgCiAgICAgICAgICAgIHVzZWQgb24gYW55IG92ZXJyaWRkZW4gdmlydHVhbCBtZXRob2QsIHNvIGZvciBzdHJ1Y3QgQiBhYm92ZSwgCiAgICAgICAgICAgIHRoaXMgQyMgY29kZSBpcyBnZW5lcmF0ZWQ6CgogICAgICAgICAgICAgICAgcHVibGljIGNsYXNzIEIgOiBBIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgZigpIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KCgkgICAgLSBJbml0aWFsIHN1cHBvcnQgZm9yIHByb3RlY3RlZCB2aXJ0dWFsIG1ldGhvZHMuIFRoZXkgYXJlIG5vdwoJICAgIHByb3Blcmx5IGVtaXR0ZWQgd2hlbiB1c2luZyB3aXRoIGRpcmVjdG9yIChweXRob24gb25seSBieQoJICAgIG5vdykuCgkgICAgCiAgICAgICAgICAgICAgICAlZmVhdHVyZSgiZGlyZWN0b3IiKSBBOyAgICAKICAgICAgICAgICAgICAgIHN0cnVjdCBBICB7CiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQ6CiAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgZjEoKSA9IDA7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICVmZWF0dXJlKCJkaXJlY3RvciIpIEI7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgQiA6IEF7CiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQ6CiAgICAgICAgICAgICAgICAgIGludCBmMSgpOwogICAgICAgICAgICAgICAgICB2aXJ0dWFsIGYyKCk7CiAgICAgICAgICAgICAgICB9OwoKCSAgICBUaGlzIGNhbiBiZSBkaXNzYWJsZWQgYnkgdXNpbmcgdGhlICctbm9kaXJwcm90JyBvcHRpb24uCgoJICAgIC0gVGhlIGZlYXR1cmUgJ25vZGlyZWN0b3InIGlzIHdvcmtpbmcgbm93IGF0IHRoZSB0b3AgbGV2ZWwsCgkgICAgc28sIGl0IG11c3Qgd29yayBmb3IgYWxsIHRoZSBsYW5ndWFnZXM6CgogICAgICAgICAgICAgICAgJWZlYXR1cmUoImRpcmVjdG9yIikgQTsKICAgICAgICAgICAgICAgICVmZWF0dXJlKCJub2RpcmVjdG9yIikgQTo6ZjI7CgogICAgICAgICAgICAgICAgc3RydWN0IEEgewogICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IGYxKCk7CiAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgZjIoKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAKCSAgICBpbiB0aGlzIGNhc2UsIG9ubHkgJ2YxJyBpcyBleHBvcnRlZCB0byB0aGUgZGlyZWN0b3IgY2xhc3MuCgkgICAgCgkgICAgLSBBZGRlZCBkaXJlY3RvciBzdXBwb3J0IGZvciBjb25zdCBUWVBFJiBhcmd1bWVudHMgKHB5dGhvbikuCgoxMi8wMi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgSU5PVVQgYW5kIE9VVFBVVCB0eXBlbWFwcyBpbiB0eXBlbWFwcy5pIGZvciB3aGVuIHRoZSBKTkkgdHlwZSAKICAgICAgICAgICAgaXMgYmlnZ2VyIHRoYW4gdGhlIEMgdHlwZS4gRm9yIGV4YW1wbGUsIHVuc2lnbmVkIGxvbmcgKDMyYml0cyBvbiBtb3N0IHN5c3RlbXMpCiAgICAgICAgICAgIGlzIG1hcHBlZCB0byBqbG9uZyAoNjRiaXRzKS4gUmV0dXJuZWQgdmFsdWUgd2FzIGluY29ycmVjdC4gQnVnIHJlcG9ydGVkIGJ5IAogICAgICAgICAgICBCcmlhbiBIYXdsZXkuCgoxMi8wMi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjIGFuZCBKYXZhXSBCZXR0ZXIgZml4IGZvciBlbnRyeSBkYXRlZCAwNS8xMS8yMDAzLiBGaXhlcyB0aGUgZm9sbG93aW5nCiAgICAgICAgICAgIHR5cGVtYXBzOgoKICAgICAgICAgICAgSmF2YTogamF2YWJhc2UsIGphdmFpbnRlcmZhY2VzLCBqYXZhaW1wb3J0cywgamF2YWNsYXNzbW9kaWZpZXJzLAogICAgICAgICAgICBqYXZhcHRyY29uc3RydWN0b3Jtb2RpZmllcnMsIGphdmFmaW5hbGl6ZSwgamF2YWdldGNwdHIgJiBqYXZhY29kZS4KICAgICAgICAgICAgQyM6IGNzYmFzZSwgY3NpbnRlcmZhY2VzLCBjc2ltcG9ydHMsIGNzY2xhc3Ntb2RpZmllcnMsCiAgICAgICAgICAgIGNzcHRyY29uc3RydWN0b3Jtb2RpZmllcnMsIGNzZmluYWxpemUsIGNzZ2V0Y3B0ciAmIGNzY29kZS4KCiAgICAgICAgICAgIEl0IGFsc28gZml4ZXMgYnVnIGluIHVzaW5nIGFycmF5cyBvZiBDIHN0cnVjdHMgd2l0aCBhcnJheXNfamF2YS5pIAogICAgICAgICAgICBhcyByZXBvcnRlZCBTY290dCBNaWNoZWwuCgoxMi8wMi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtQZXJsXSBGaXhlZCBbIDg1MjExOSBdIHJlY3Vyc2l2ZSBpbmhlcml0YW5jZSBpbiBvdXRwdXQgLnBtLCBwZXJsNS4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgV2lsbGlhbSBEb3dsaW5nLgoKMTIvMDIvMjAwMzogYmVhemxleQogICAgICAgICAgICBbVGNsXSBGaXhlZCBbIDc1NTM4MiBdIGNhbGxpbmcgZnVuYyhjb25zdCB2ZWN0b3I8VD4mIHApIGV2YWx1YXRlcyBwWzBdIGluIGludGVycC4KICAgICAgICAgICAgVGhlIFRjbCB0eXBlIGNoZWNrZXIgd2FzIGltcHJvcGVybHkgaGFuZGxpbmcgdGhlIGludGVycHJldGVyIHJlc3VsdCB3aGVuCiAgICAgICAgICAgIHR5cGUgdmlvbGF0aW9ucyB3ZXJlIHN1cHBvc2VkIHRvIGJlIGlnbm9yZWQuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEZsYXZpdSBQb3BwLU5vd2FrLgoKMTEvMzAvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeGVkIFsgNTQ1MDU4IF0gY29uZmlndXJlJ3MgLS13aXRoLXRjbGluY2wgaGFzIG5vIGVmZmVjdAoKMTEvMzAvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXhlZCBbIDc2NjQwOSBdIG1pc3Npbmcgc3ltYm9sIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uIGR1cmluZyBtb2R1bGUgbG9hZAogICAgICAgICAgICBTV0lHJ3MgaW50ZXJuYWwgZnVuY3Rpb25zIGFyZSBhbGwgc3RhdGljIGFzIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGRpZmZlcmVudCBTV0lHCiAgICAgICAgICAgIGdlbmVyYXRlZCBtb2R1bGVzIHRvIHNoYXJlIGFueSBjb2RlIGF0IHJ1bnRpbWUuCgoxMS8zMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtUY2xdIEFkZGVkIHN1cHBvcnQgZm9yIEMrKyBwb2ludGVycyB0byBtZW1iZXJzLgoKMTEvMjgvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeGVkIFsgODQ4MzM1IF0gRGlyZWN0b3JzOiAjaW5jbHVkZSB3cmFwcGVyIC5oIGZpbGUgLSB3YXMgaW5jb3JyZWN0bHkKICAgICAgICAgICAgYWRkaW5nIGEgZGlyZWN0b3J5IHRvIHRoZSBnZW5lcmF0ZWQgI2luY2x1ZGUgImZvb193cmFwLmgiIHN0YXRlbWVudAogICAgICAgICAgICBpbiBzb21lIHNpdHVhdGlvbnMuCgoxMS8yOC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeGVkIFsgODQ5MDY0IF0gSkFWQSA6IEFjY2VzcyBtb2RpZmllciBmb3IgZGVyaXZlZCBjbGFzcyB3cm9uZy4KICAgICAgICAgICAgVGhlIGRlbGV0ZSgpIG1ldGhvZCBpcyBhbHdheXMgcHVibGljIG5vdy4gSXQgdXNlZCB0byBiZSBwcm90ZWN0ZWQgd2hlbmV2ZXIgYSAKICAgICAgICAgICAgZGVzdHJ1Y3RvciB3YXMgbm9uIHB1YmxpYy4gQW4gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gcnVudGltZSAKICAgICAgICAgICAgZXhjZXB0aW9uIGlzIHRocm93biBpbnN0ZWFkIG9mIG1ha2luZyBkZWxldGUoKSBwcm90ZWN0ZWQgbm93LgoKMTEvMjgvMjAwMzogYmVhemxleQogICAgICAgICAgICBbUGVybDVdIEFkZGVkIHN1cHBvcnQgZm9yIEMrKyBwb2ludGVycyB0byBtZW1iZXJzLgoKMTEvMjgvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDg1MDE1MSBdIFBZVkVSU0lPTiB3aXRoIHB5dGhvbjIuMyBpbiBjb25maWd1cmUgb2YgU1dJRyAxLjMuMTkgKE1heWJlKS4KCjExLzI4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgIFsgODUwNjY2IF0gI2luY2x1ZGUgZXh0cmEgbGluZSBhZGRlZC4gIAogICAgICAgICAgICBUaGlzIHNob3VsZCBmaXggc29tZSBwcm9ibGVtcyB3aXRoIGdldHRpbmcgY29ycmVjdCBsaW5lIG51bWJlcnMgb24KICAgICAgICAgICAgZXJyb3IgbWVzc2FnZXMuCgoxMS8yNi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGFub3RoZXIgb25lIG9mIE1hcmNlbG8ncyBldmlsIHRlbXBsYXRlIGJ1Z3MgKGluZmluaXRlCiAgICAgICAgICAgIHJlY3Vyc2lvbikuIFsgODQ5NTA0IF0gdGVtcGxhdGUgYW5kIHR5cGVkZWYgLT4gaW5mLiByZWN1cnNpb24uCgoxMS8yNi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHBhcnNpbmcgcHJvYmxlbSB3aXRoIGRlY2xhcmF0aW9ucyBsaWtlIHRoaXM6CgoJICAgICAgICAgaW50ICp4ID0gJnNvbWVhcnJheVswXTsKCjExLzI1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3NTY1NTIgXSBtaXNzaW5nIGRlZmF1bHQgYXJndW1lbnQgY2xhc3Mgc2NvcGUgd2l0aCAifCIuCiAgICAgICAgICAgIFRoaXMgaXMgcmVhbGx5IG9ubHkgYSBiYW5kLWFpZCBmaXggZm9yIHVzZSBvZiBjbGFzcy1lbnVtcyBpbgogICAgICAgICAgICBleHByZXNzaW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgY2xhc3MgQSB7CiAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgZW51bSBGbGFnIHsgZmxhZzEgPSAweDEsIGZsYWcyID0gMHgyIH07CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgZm9vKGludCB4ID0gZmxhZzEgfCBmbGFnMik7CiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBOb3RlOiB0aGVyZSBhcmUgc3RpbGwgc29tZSAobW9yZSBzdWJ0bGUpIGNhc2VzIHRoYXQgYXJlIGJyb2tlbiwKICAgICAgICAgICAgYnV0IGhhcmQgdG8gZml4IGR1ZSB0byBhbiBpc3N1ZSB3aXRoIHRlbXBsYXRlIGV4cGFuc2lvbi4gV2lsbAogICAgICAgICAgICBhZGRyZXNzIGxhdGVyLgogICAgICAgICAgICBSZXBvcnRlZCBieSBEbWl0cnkgTWlyb25vdi4KCjExLzI1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgSW5jb3Jwb3JhdGVkIFsgODQwODc4IF0gc3VwcG9ydCBmb3IgJWlubGluZSB7IC4uLiB9IChQQVRDSCkuCiAgICAgICAgICAgIFRoaXMgYWRkcyBzdXBwb3J0IGZvciB0aGUgZm9sbG93aW5nOgoKICAgICAgICAgICAgICAgICAgJWlubGluZSB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4gc29tZSBjb2RlIC4uLgogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kICVpbmxpbmUgJXsgLi4uICV9IGlzIHRoYXQgdGhlCiAgICAgICAgICAgIGVuY2xvc2VkIHRleHQgaXMgcHJvY2Vzc2VkIGJ5IHRoZSBTV0lHIHByZXByb2Nlc3Nvci4gICBUaGlzCiAgICAgICAgICAgIGFsbG93cyBzcGVjaWFsIG1hY3JvcyBhbmQgb3RoZXIgcHJvY2Vzc2luZyB0byBiZSB1c2VkIGluIAogICAgICAgICAgICBjb25qdW5jdGlvbiB3aXRoICVpbmxpbmUuCiAgICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IFNhbHZhZG9yIEZhbmRpbm8gR2FyY2lhLgoKMTEvMjUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDgzNjkwMyBdIEMrKyBpbmNvbnNpc3RlbmN5ICh3aXRoIHZvaWQgYXJndW1lbnRzKS4KICAgICAgICAgICAgU1dJRyB3YXMgaGF2aW5nIGRpZmZpY3VsdHkgd2l0aCBmKCkgdnMgZih2b2lkKSBpbiBDKysgcHJvZ3JhbXMuCiAgICAgICAgICAgIEZvciBpbnN0YW5jZToKCiAgICAgICAgICAgICAgICAgIGNsYXNzIEEgewogICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZih2b2lkKSA9IDA7CiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICBjbGFzcyBCIHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGYoKTsgICAgLy8gTm90IG1hdGNoZWQgdG8gZih2b2lkKSBjb3JyZWN0bHkKICAgICAgICAgICAgICAgICAgfTsgCgogICAgICAgICAgICBUaGUgcGFyc2VyIG5vdyBub3JtYWxpemVzIGFsbCBkZWNsYXJhdGlvbnMgb2YgdGhlIGZvcm0gZih2b2lkKSAKICAgICAgICAgICAgaW4gQysrIGNsYXNzZXMgdG8gZigpLiAgVGhpcyBzaG91bGQgZml4IGEgdmFyaWV0eSBvZiBzdWJ0bGUgCiAgICAgICAgICAgIHByb2JsZW1zIHdpdGggaW5oZXJpdGFuY2UsIG9wdGltaXphdGlvbnMsIG92ZXJsb2FkaW5nLCBldGMuCiAgICAgICAgICAgIFByb2JsZW0gcmVwb3J0ZWQgYnkgUGFydGhvIEJob3dtaWNrLgogCjExLzI1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgW1Blcmw1XSBJbmNvcnBvcmF0ZWQgWyA4NDEwNzQgXSBiZXR0ZXIgY3JvYWtpbmcgKFBBVENIKS4gIFRoaXMgZml4ZXMgc29tZSBwcm9ibGVtcwogICAgICAgICAgICB3aXRoIHN0cmluZ3MgYW5kIHByb3ZpZGVzIHNvbWUgbmV3IGVycm9yIGZ1bmN0aW9ucy4gCiAgICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IFNhbHZhZG9yIEZhbmRpbm8gR2FyY2lhLgogICAgICAgICAgICAKMTEvMjUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc5MTgzNSBdIERlZmF1bHQgYXJndW1lbnQgd2l0aCBjYXN0OiB0eHQgPSAoY2hhciAqKSJ0eHQiIHN5bnRheCBFcnJvci4KICAgICAgICAgICAgVGhlIHBhcnNlciBzaG91bGQgbm93IGFjY2VwdCB0aGluZ3MgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICB2b2lkIGZvbyhjaGFyICpzID0gKGNoYXIgKikgIkhlbGxvIik7CgogICAgICAgICAgICBQcm9ibGVtIHJlcG9ydGVkIGJ5IENsYXVkaXVzIFNjaG5vcnIuCgoxMS8yNC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtUY2xdIEZpeGVkIHByb2JsZW0gd2l0aCBjcm9zcyBtb2R1bGUgbGlua2luZy4gIFByZXZpb3VzbHkgbW9kdWxlcyByZWZlcnJlZAogICAgICAgICAgICB0byBiYXNlIGNsYXNzZXMgdGhyb3VnaCBhIGdsb2JhbCB2YXJpYWJsZS4gICBOb3csIHRoZSBtb2R1bGUgbG9va3MgdXAgYmFzZQogICAgICAgICAgICBjbGFzc2VzIHRocm91Z2ggdGhlIHR5cGUgc3lzdGVtIGl0c2VsZi0tLWF2b2lkaW5nIHRoZSBuZWVkIHRvIGxpbmsgdG8gYSBnbG9iYWwKICAgICAgICAgICAgbGlrZSBiZWZvcmUuICBDYXZlYXQ6ICBtb2R1bGVzIHdpdGggYmFzZSBjbGFzc2VzIG11c3QgYmUgbG9hZGVkIGJlZm9yZQogICAgICAgICAgICBtb2R1bGVzIHdpdGggZGVyaXZlZCBjbGFzc2VzLgogCjExLzI0LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEluIC1zY20gbW9kZSwgdXNlICgpIHRvIHJlcHJlc2VudCBudWxsIHBvaW50ZXJzLAoJICAgIGFzIGl0IGlzIGRvbmUgaW4gLWdoIG1vZGUuCgoxMS8yMy8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgQWRkIGEgZ2VuZXJhdGVkIHNjcmlwdCAicHJlaW5zdC1zd2lnIiwgd2hpY2ggY2FuIGJlIHVzZWQKCSAgICB0byBpbnZva2UgU1dJRyBiZWZvcmUgaXQgaGFzIGJlZW4gaW5zdGFsbGVkLiAgSXQgYXJyYW5nZXMKCSAgICB0aGF0IHRoZSBydW50aW1lIGxpYnJhcmllcyBmcm9tIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGFyZQoJICAgIHVzZWQuIAoKMTEvMjMvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gSW4gLWdoIG1vZGUsIGRvbid0IGZvcmdldCB0byBjYWxsIFNXSUdfR3VpbGVfSW5pdC4KCSAgICBBZGQgYSBTV0lHX2NvbnRyYWN0X2Fzc2VydCBtYWNyby4KCjExLzIzLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbTXpTY2hlbWVdIFVwZGF0ZSB0aGUgY29uZmlndXJlIGNoZWNrIGZvciB0aGUgZHluZXh0IG9iamVjdCB0byB3b3JrCgkgICAgd2l0aCBNelNjaGVtZSAyMDUuCgoxMS8yMC8yMDAzOiBtbWF0dXMKCSAgICBGaXhlZCB0aGUgaW5jbHVkZS9pbXBvcnQgZXJyb3IgcmVwb3J0ZWQgYnkgS2VyaW0gQm9yY2hhZXYsCgkgICAgd2hlcmUgdHdvIGZpbGVzIHdpdGggbmFtZXMgbGlrZQoKCSAgICAnZGlyMS9oZWxsby5pJwoJICAgICdkaXIyL2hlbGxvLmknCgkgICAgCgkgICAgY2FuIG5vdCBiZSBpbmNsdWRlIGF0IHRoZSBzYW1lIHRpbWUuIFN3aWcgd2FzIGluY2x1ZGluZwoJICAgIGp1c3QgdGhlIGZpcnN0IG9uZSwgYXNzdW1pbmcgdGhlIHNlY29uZCBvbmUgd2FzIG5vdCBhCgkgICAgZGlmZmVyZW50IG9uZSwgc2luY2UgaXQgd2FzIGNoZWNraW5nL2tlZXBpbmcganVzdCB0aGUKCSAgICBiYXNlbmFtZSAnaGVsbG8uaScuCgoxMS8xOS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIENoYW5nZXMgdG8gdGhlIFNXSUcgcnVudGltZSBsaWJyYXJ5IHN1cHBvcnQuIAogICAgICAgICAgICAgIC0gIFRoZSAtYyBjb21tYW5kIGxpbmUgb3B0aW9uIGhhcyBiZWVuIHJlbmFtZWQgdG8gLW5vcnVudGltZQogICAgICAgICAgICAgIC0gIE5ldyBjb21tYW5kIGxpbmUgb3B0aW9uOiAtcnVudGltZS4gIFdoZW4gc3VwcGxpZWQsIHRoaXMKICAgICAgICAgICAgICAgICBpbnNlcnRzIHRoZSBzeW1ib2wgU1dJR19HTE9CQUwgaW50byB0aGUgd3JhcHBlciBjb2RlLiAgVGhpcywKICAgICAgICAgICAgICAgICBpbiB0dXJuLCBtYWtlcyBhbGwgb2YgdGhlIHJ1bnRpbWUgc3VwcG9ydCBmdW5jdGlvbnMgZ2xvYmFsbHkKICAgICAgICAgICAgICAgICB2aXNpYmxlLgogICAgICAgICAgICAgICAtIE5ldyBsaWJyYXJ5IGZpbGU6IHN3aWdydW4uaS4gICBVc2VkIHRvIGNyZWF0ZSBtb2R1bGVzCiAgICAgICAgICAgICAgICAgZm9yIHJ1bnRpbWUgbGlicmFyeSAoaWYgbmVlZGVkKS4KICAgIAoxMS8xOC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgJ21ha2Ugc3JjcnBtJyBycG1idWlsZCBmaXggLSBwYXRjaCBmcm9tIEpvZSBDb29wZXIKCjExLzE4LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIENoYW5nZSBtZWFuaW5nIG9mIGNvbmZpZ3VyZSBvcHRpb24gLS13aXRoLWd1aWxlIHRvCgkgICAgdGhlIG5hbWUgb2YgdGhlIEd1aWxlIGV4ZWN1dGFibGUuICBUaGUgbmV3IG9wdGlvbiAtLXdpdGgtZ3VpbGUtcHJlZml4IAoJICAgIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHRyZWUgd2hlcmUgR3VpbGUgaXMKCSAgICBpbnN0YWxsZWQuICAoSG93ZXZlciwgdXN1YWxseSBpdCBzdWZmaWNlcyB0byB1c2UgdGhlCgkgICAgc2luZ2xlIG9wdGlvbiAtLXdpdGgtZ3VpbGUtY29uZmlnLikgIAoJICAgIFdoZW4gcnVubmluZyB0aGUgcnVuIHRlc3RzIHRlc3Qtc3VpdGUsIG1ha2Ugc3VyZSB0byB1c2UgdGhlCgkgICAgdmVyc2lvbiBvZiBHdWlsZSB0aGF0IFNXSUcgd2FzIGNvbmZpZ3VyZWQgZm9yLgoKMTEvMTcvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gSW1wcm92ZW1lbnRzIHRvIG9iamVjdC1vd25lcnNoaXAgbWFuYWdlbWVudCBpbiAKCSAgICAiLXNjbSIgbW9kZS4gIChUaGV5IGRvIG5vdCBhcHBseSB0byB0aGUgZGVmYXVsdCAiLWdoIiBtb2RlLikKCSAgICAqIFJlbmFtZWQgdGhlIHNtb2IgdHlwZSB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBvYmplY3QgY2FuCgkgICAgICBiZSBnYXJiYWdlIGNvbGxlY3RlZCBmcm9tICJjb2xsZWN0ZWQgc3dpZyIgdG8gImNvbGxlY3RhYmxlCgkgICAgICBzd2lnIiwgd2hpY2ggaXMgbW9yZSBwcmVjaXNlLiAgCgkgICAgKiBFeHBvcnQgdGhlIGRlc3RydWN0b3IgZnVuY3Rpb25zIGFnYWluLiAgSXQgaXMgbm93CiAJICAgICAgYWxsb3dlZCB0byBleHBsaWNpdGx5IGNhbGwgZGVzdHJ1Y3RvcnMsIGV2ZW4gZm9yCgkgICAgICBnYXJiYWdlLWNvbGxlY3RlZCBwb2ludGVyIG9iamVjdHMuICBBIHBvaW50ZXIgb2JqZWN0CgkgICAgICB0aGF0IGhhcyBiZWVuIHBhc3NlZCB0byBhIGRlc3RydWN0b3IgaXMgbWFya2VkIGluIGEKCSAgICAgIHNwZWNpYWwgd2F5IHVzaW5nIGEgbmV3IHNtb2IgdHlwZSwgImRlc3Ryb3llZCBzd2lnIi4KCSAgICAgIChUaGlzIGhlbHBzIGF2b2lkIG5hc3R5IG1lbW9yeSBidWdzLCB3aGVyZSByZWZlcmVuY2VzIHRvCgkgICAgICBkZWFkIEMgb2JqZWN0cyBhcmUgc3RpbGwgaGVsZCBpbiBTY2hlbWUuIE1vcmVvdmVyLCB0aGUKCSAgICAgIGdhcmJhZ2UgY29sbGVjdG9yIHdpbGwgbm90IHRyeSB0byBmcmVlIGEgZGVzdHJveWVkCgkgICAgICBvYmplY3Qgb25jZSBtb3JlLikKCSAgICAqIERlc3RydWN0b3ItbGlrZSBmdW5jdGlvbnMgY2FuIGFsc28gbWFyayB0aGVpciBhcmd1bWVudHMgCgkgICAgICBhcyBkZXN0cm95ZWQgYnkgYXBwbHlpbmcgdGhlIHR5cGVtYXAgU1dJR1RZUEUgKkRFU1RST1lFRC4KCSAgICAgIChJdCBjYWxscyB0aGUgZnVuY3Rpb24gU1dJR19HdWlsZV9NYXJrUG9pbnRlckRlc3Ryb3llZC4pCgkgICAgKiBGdW5jdGlvbnMgdGhhdCAiY29uc3VtZSIgdGhlaXIgb2JqZWN0cyAob3IgdGhhdCAib3duIgoJICAgICAgdGhlbSBhZnRlciB0aGUgY2FsbCkgY2FuIG1hcmsgdGhlaXIgYXJndW1lbnRzIGFzCgkgICAgICBub3QgZ2FyYmFnZSBjb2xsZWN0YWJsZS4gIFRoaXMgY2FuIGJlIGRvbmUgYnkgYXBwbHlpbmcKCSAgICAgIHRoZSB0eXBlbWFwIFNXSUdUWVBFICpDT05TVU1FRC4gIChJdCBjYWxscyB0aGUgZnVuY3Rpb24KCSAgICAgIFNXSUdfR3VpbGVfTWFya1BvaW50ZXJOb25jb2xsZWN0YWJsZS4pCgkgICAgKiBUaGUgbWFjcm8gVFlQRU1BUF9QT0lOVEVSX0lOUFVUX09VVFBVVCBmcm9tIGxpYnJhcnkKCSAgICAgIHBvaW50ZXItaW4tb3V0LmkgY3JlYXRlcyBhZGRpdGlvbmFsIHR5cGVtYXBzIAoJICAgICAgUFRSVFlQRSAqSU5QVVRfQ09OU1VNRUQsIFBUUlRZUEUgKklOUFVUX0RFU1RST1lFRC4KCSAgICAgIFRoZXkgbWFyayB0aGUgcGFzc2VkIHBvaW50ZXIgb2JqZWN0IGxpa2V3aXNlLgoJICAgICAgVGhlIHR5cGVtYXAgUFRSVFlQRSAqT1VUUFVUIGNyZWF0ZXMgYSBnYXJiYWdlLWNvbGxlY3RhYmxlCgkgICAgICBwb2ludGVyIG9iamVjdCwgbGlrZSAlbmV3b2JqZWN0IGRvZXMgZm9yIGEgcmV0dXJuZWQgCgkgICAgICBwb2ludGVyLiAgVXNlIHRoZSBuZXcgdHlwZW1hcCBQVFJUWVBFICpPVVRQVVRfTk9OQ09MTEVDVEFCTEUKCSAgICAgIHRvIGNyZWF0ZSBhIHBvaW50ZXIgb2JqZWN0IHRoYXQgd2lsbCBub3QgYmUgZ2FyYmFnZSBjb2xsZWN0ZWQuCgoxMS8xNy8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBIYW5kbGUgJGlucHV0IGluICJmcmVlYXJnIiB0eXBlbWFwcy4KCSAgICBOZXZlciBxdWFsaWZ5IEdPT1BTIHNsb3QgbmFtZXMgd2l0aCB0aGUgY2xhc3MgbmFtZS4gCgkgICAgSGFuZGxlIG9wdGlvbmFsIGFyZ3VtZW50cyBwcm9wZXJseSBpbiB0aGUgR09PUFMgbWV0aG9kcy4KCjExLzE2LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXhlcyBmb3IgaW5zdGFsbGF0aW9uIHRvIHdvcmsgd2l0aCB0aGUgdXBjb21pbmcgQXV0b21ha2UtMS44LgogICAgICAgICAgICBta2luc3RhbGxkaXJzIHdhcyBiZWluZyB1c2VkIGJ5IGEgbm9uLUF1dG9tYWtlIG1ha2VmaWxlLiAKICAgICAgICAgICAgbWtpbnN0YWxsZGlycyBpcyBiZWluZyBwaGFzZWQgb3V0IGFuZCBzbyB3YXMgbm90IGJlaW5nCiAgICAgICAgICAgIGNyZWF0ZWQgYnkgQXV0b21ha2UuIGluc3RhbGwtc2ggdXNlZCBpbnN0ZWFkLgoKMTEvMTYvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBOdW1lcm91cyBkaXJlY3RvciBpbXByb3ZlbWVudHMsIHR3ZWFrcyBhbmQgYnVnIGZpeGVzIHNpbmNlIAogICAgICAgICAgICB0aGUgaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBoYXZlIGJlZW4gY29udHJpYnV0ZWQgYnkgU2NvdHQgTWljaGVsLgoKMTEvMTIvMjAwMzogYmVhemxleQogICAgICAgICAgICBbUHl0aG9uXSBXaGVuICVmZWF0dXJlKCJzaGFkb3ciKSBpcyB1c2VkIHRvIGFkZCBjb2RlIHRvIHNoYWRvdwogICAgICAgICAgICBjbGFzc2VzLCB0aGUgc3BlY2lhbCB2YXJpYWJsZSAkYWN0aW9uIGV4cGFuZHMgdG8gdGhlIG5hbWUgb2YgdGhlCiAgICAgICAgICAgIHVuZGVybHlpbmcgd3JhcHBlciBmdW5jdGlvbiB0aGF0IHdvdWxkIGhhdmUgYmVlbiBjYWxsZWQgbm9ybWFsbHkuCgoxMS8xMi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtQeXRob25dIFdoZW4gZ2VuZXJhdGluZyBwcm94eSBjbGFzcyBjb2RlLCBTV0lHIGVtaXRzIGEgZmV3CiAgICAgICAgICAgIGRlZmF1bHQgbWV0aG9kcyBmb3IgX19yZXByX18oKSBhbmQgb3RoZXIgUHl0aG9uIHNwZWNpYWwKICAgICAgICAgICAgbWV0aG9kcy4gIFNvbWUgb2YgdGhlc2UgbWV0aG9kcyBhcmUgZW1pdHRlZCBhZnRlciBhbGwgb2YgdGhlCiAgICAgICAgICAgIGNvbnRlbnRzIG9mIGEgY2xhc3MuIEhvd2V2ZXIsIHRoaXMgbWFrZXMgaXQgaGFyZCB0byBvdmVycmlkZQogICAgICAgICAgICB0aGUgbWV0aG9kcyB1c2luZyAlcHl0aG9uY29kZSBhbmQgc29tZSBvdGhlciBkaXJlY3RpdmVzIHRoYXQKICAgICAgICAgICAgYWxsb3cgY29kZSB0byBiZSBpbnNlcnRlZCBpbnRvIGEgY2xhc3MuICBUaGVzZSBzcGVjaWFsIG1ldGhvZHMKICAgICAgICAgICAgYXJlIG5vdyBlbWl0dGVkIGludG8gdGhlIGNvZGUgKmJlZm9yZSogYWxsIG9mIHRoZSBvdGhlciBtZXRob2RzLgogICAgICAgICAgICBTdWdnZXN0ZWQgYnkgRXJpYyBKb25lcy4KIAoxMS8xMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFByZXByb2Nlc3NvciBlbmhhbmNlbWVudC4gICBGb3IgaW5jbHVkZSBzdGF0ZW1lbnRzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgICVpbmNsdWRlICJmb28vYmFyLmkiCgogICAgICAgICAgICB0aGUgZGlyZWN0b3J5ICJmb28iIGlzIG5vdyBhZGRlZCB0byB0aGUgc2VhcmNoIHBhdGggd2hpbGUgCiAgICAgICAgICAgIHByb2Nlc3NpbmcgdGhlIGNvbnRlbnRzIG9mIGJhci5pLiAgVGh1cywgaWYgYmFyLmkgaW5jbHVkZXMgb3RoZXIKICAgICAgICAgICAgZmlsZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LCB0aGV5IHdpbGwgYmUgZm91bmQuIFByZXZpb3VzbHksCiAgICAgICAgICAgIHlvdSB3b3VsZCBoYXZlIHRvIGFkZCBhZGRpdGlvbmFsIGRpcmVjdG9yaWVzIHVzaW5nIC1JIHRvIG1ha2UgdGhpcwogICAgICAgICAgICB3b3JrIGNvcnJlY3RseS4gIE5vdGU6IHRoZSBDIHByZXByb2Nlc3NvciBzZWVtcyB0byBiZWhhdmUgaW4KICAgICAgICAgICAgYW4gaWRlbnRpY2FsIG1hbm5lciBvbiBtYW55IChtb3N0PyBhbGw/KSBzeXN0ZW1zLgogICAgICAgICAgICBTdWdnZXN0ZWQgYnkgS2VyaW0gQm9yY2hhZXYuCgoxMS8xMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gY2hhbmdlcyB0byBtYWtlIFNXSUcgd29yayBvbiBNYWMgT1MgWCAxMC4zLnggKFBhbnRoZXIpLgogICAgICAgICAgICBUZXN0ZWQgd2l0aCBQeXRob24sIFRjbCwgUGVybCwgYW5kIFJ1YnktLS1hbGwgb2Ygd2hpY2ggc2VlbSB0byB3b3JrLgoKMTEvMDgvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXhlZCB0aGUgdHlwZW1hcHMgaW4gdmFyaW91cy5pIHdoaWNoIHdlcmUgbW9zdGx5IGJyb2tlbi4KICAgICAgICAgICAgY2hhciAqKlNUUklOR19JTiBhbmQgY2hhciAqKlNUUklOR19SRVQgdHlwZW1hcHMgcmVwbGFjZWQgd2l0aCAKICAgICAgICAgICAgU1RSSU5HX0FSUkFZLiBmbG9hdCAqRkxPQVRfQVJSQVlfUkVUVVJOIHR5cGVtYXAgcmVtb3ZlZC4KCjExLzA4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgW1RjbF0gVGNsIG1vZHVsZSBub3cgZW1pdHMgYSBzYWZlIG1vZHVsZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBieQogICAgICAgICAgICBkZWZhdWx0LiAgSXQgY2FuIGJlIHJlbW92ZWQgYnkgcnVubmluZyAnc3dpZyAtbm9zYWZlJy4KCjExLzA0LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIE9ubHkgdXNlIHRoZSBTQ01fIEFQSSB3aGVuIHRoZSBmdW5jdGlvbgoJICAgIGBzY21fc2xvdF9leGlzdHNfcCcgZXhpc3RzIChuZWVkZWQgZm9yIEdPT1BTIHN1cHBvcnQpLiAgCgkgICAgVGhpcyBmdW5jdGlvbiB3YXMgcmVuYW1lZCBkdXJpbmcgdGhlIEd1aWxlIDEuNSBzZXJpZXMKCSAgICBmcm9tIGBzY21fc2xvdHNfZXhpc3RzX3AnLgoJICAgIFJlcG9ydCB0aGUgcmlnaHQgcnVudGltZSBsaWJyYXJ5IHdoZW4gaW52b2tlZCB3aXRoCgkgICAgLXNjbSAtbGRmbGFncy4KCjExLzAzLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbQ2hpY2tlbl0gRml4ICM3ODIwNTIuICBUaGUgLS13aXRoLWNoaWNrZW5jZmcgY29uZmlndXJlCgkgICAgb3B0aW9uIChhbmQgb3RoZXJzKSB3ZXJlIG5vdCBhY2NlcHRlZC4KCjExLzAyLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIE1lcmdlIG5ldyBzZXQgb2YgR09PUFMgY2hhbmdlcyBieSBKb2huIExlbnouCgkgICAgR09PUFMgb2JqZWN0cyBhcmUgbm93IG1hbmlwdWxhdGVkIGRpcmVjdGx5IGJ5IHRoZSBDIGNvZGUuCgkgICAgU29tZSBmaXhlcyB0byB0eXBlbWFwLUdPT1BTIGludGVyYWN0aW9uLgoKMTEvMDIvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gUmVtb3ZlIHRoZSBmaWxlIGFyZ3VtZW50IHRvIC1zY21zdHViIGFuZCAtZ29vcHMuCgkgICAgVGhlIFNjaGVtZSBmaWxlcyBhcmUgbm93IGFsd2F5cyBjYWxsZWQgTU9EVUxFLnNjbSBvcgoJICAgIE1PRFVMRS1wcmltaXRpdmUuc2NtLCB3aGVyZSBNT0RVTEUgaXMgdGhlIG1vZHVsZSBuYW1lIGFuZCAKCSAgICAicHJpbWl0aXZlIiBjYW4gYmUgY2hhbmdlZCBieSB0aGUgLXByaW1zdWZmaXggb3B0aW9uLgoJICAgIFRoZSBTY2hlbWUgZmlsZXMgYXJlIG5vdyBwbGFjZWQgaW4gdGhlIGRpcmVjdG9yeSBnaXZlbiBieQoJICAgIHRoZSAtb3V0ZGlyIG9wdGlvbiwgb3IgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgoJICAgIChQYXRjaCBieSBKb2huIExlbnosIHNsaWdodGx5IG1vZGlmaWVkLikKCgkgICAgKioqIElOQ09NUEFUSUJJTElUWSBbR3VpbGVdICoqKgoKMTEvMDIvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFVuaWZ5IHRoZSBwb2ludGVyLWNvbnZlcnNpb24gcnVudGltZSBBUEkuICBUaGUgc3RhbmRhcmQKCSAgICBmdW5jdGlvbnMgYXJlOgoJICAgICAqIFNXSUdfTmV3UG9pbnRlck9iaiAoUE9JTlRFUiwgVFlQRSwgRkxBR1MpCgkgICAgICAgIC0tIENyZWF0ZSBhbiBzY3JpcHRpbmcgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyBhIHR5cGVkCgkJICAgcG9pbnRlci4gRkxBR1MgYXJlIGxhbmd1YWdlIHNwZWNpZmljLgoJICAgICAqIFNXSUdfQ29udmVydFB0ciAoSU5QVVQsIFJFU1VMVCwgVFlQRSwgRkxBR1MpCgkgICAgICAgIC0tIEdldCBhIHBvaW50ZXIgZnJvbSB0aGUgc2NyaXB0aW5nIG9iamVjdCBJTlBVVCBhbmQKCQkgICBzdG9yZSBpdCBpbiB0aGUgcGxhY2UgUkVTVUxULiAgV2hlbiBhIHR5cGUgbWlzbWF0Y2ggCgkJICAgb2NjdXJzLCByZXR1cm4gbm9uemVyby4KCSAgICAgKiBTV0lHX011c3RHZXRQdHIgKElOUFVULCBUWVBFLCBBUkdOVU0sIEZMQUdTKQoJICAgICAgICAtLSBHZXQgYSBwb2ludGVyIGZyb20gdGhlIHNjcmlwdGluZyBvYmplY3QgSU5QVVQgYW5kCgkJICAgcmV0dXJuIGl0LiAgV2hlbiBhIHR5cGUgbWlzbWF0Y2ggb2NjdXJzLCB0aHJvdyBhbgoJCSAgIGV4Y2VwdGlvbi4gIElmIEFSR05VTSA+IDAsIHJlcG9ydCBpdCBhcyB0aGUgCgkJICAgYXJndW1lbnQgbnVtYmVyIHRoYXQgaGFzIHRoZSB0eXBlIG1pc21hdGNoLgogICAgICAgICAgICBbR3VpbGVdOiAgICBObyBjaGFuZ2VzLgoJICAgIFtNelNjaGVtZV06IE5vIGNoYW5nZXMuCgkgICAgW1BlcmxdOiAgICAgQWRkIHRoZSBmdW5jdGlvbiBTV0lHX05ld1BvaW50ZXJPYmouCgkJICAgICAgICBUaGUgZnVuY3Rpb24gU1dJR19NYWtlUHRyIGlzIGtlcHQuCgkJCVRoZSBmdW5jdGlvbiBTV0lHX011c3RHZXRQdHIgaXMgY3VycmVudGx5IG5vdAoJCQlzdXBwb3J0ZWQuCgkgICAgW1B5dGhvbl06ICAgQWRkIHRoZSBmdW5jdGlvbiBTV0lHX011c3RHZXRQdHIuCgkgICAgW1J1YnldOiAgICAgQWRkIHRoZSBmdW5jdGlvbiBTV0lHX011c3RHZXRQdHIuCgkgICAgW1RjbF06ICAgICAgUmVtb3ZlIHRoZSAiaW50ZXJwIiBhcmd1bWVudCBvZgoJCSAgICAgICAgU1dJR19OZXdJbnN0YW5jZU9iaiwgU1dJR19Db252ZXJ0UHRyLAoJCSAgICAgICAgU1dJR19Db252ZXJ0UGFja2VkLCBhbmQgU1dJR19Db252ZXJ0UHRyRnJvbVN0cmluZy4KCQkJVGhlIGZ1bmN0aW9uIFNXSUdfTXVzdEdldFB0ciBpcyBjdXJyZW50bHkgCgkJCW5vdCBzdXBwb3J0ZWQuCgkgICAgTm8gY2hhbmdlcyB0byBQaWtlIGJlY2F1c2UgaXRzIHBvaW50ZXIgY29udmVyc2lvbiBjb2RlIGRpZAoJICAgIG5vdCBsb29rIGNvbXBsZXRlLiAgTm8gY2hhbmdlcyB0byBQSFA0LCBiZWNhdXNlIEkgZGlkIG5vdAoJICAgIHVuZGVyc3RhbmQgaXRzIHJ1bnRpbWUgY29kZS4gIE5vIGNoYW5nZXMgdG8gQ2hpY2tlbgoJICAgIGJlY2F1c2UgbWFqb3IgY2hhbmdlcyBhcmUgZXhwZWN0ZWQgc29vbiBhbnl3YXkuICBObwoJICAgIGNoYW5nZXMgdG8gSmF2YSwgT0NhbWwsIEMjIGJlY2F1c2UgdGhleSBkbyBub3Qgc2VlbSB0bwoJICAgIGhhdmUgYSBwb2ludGVyLWNvbnZlcnNpb24gcnVudGltZSBBUEkuCgogICAgICAgICAgICAqKiogSU5DT01QQVRJQklMSVRZIFtUY2xdICoqKgoKMTEvMDIvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtQZXJsNSwgUEhQNCwgUGlrZSwgUHl0aG9uLCBSdWJ5LCBUY2xdOiBVc2UgdGhlCgkgICAgcHJlcHJvY2Vzc29yIHRvIHJlbmFtZSBleHRlcm5hbCBmdW5jdGlvbnMgb2YgdGhlIFNXSUcKCSAgICBydW50aW1lIEFQSSB0byBmb2xsb3cgdGhlIG5hbWluZyBjb252ZW50aW9uCgkgICAgU1dJR188bGFuZ3VhZ2U+XzxmdW5jdGlvbj4uICBUaGlzIHNob3VsZCBhbGxvdyBsaW5raW5nCgkgICAgbW9yZSB0aGFuIG9uZSBpbnRlcnByZXRlciBpbnRvIGEgcHJvZ3JhbS4KCjEwLzMxLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEZpeCBzaW5jZSBpbnRyb2R1Y2luZyB0aGUgZXhjZXB0aW9uIGFuZCBzdGQ6OnN0cmluZyBkZWxlZ2F0ZXMuCiAgICAgICAgICAgIFRoZSBmaXggb3ZlcmNvbWVzIGxpbmtlciBlcnJvcnMgd2hlbiB1c2luZyBtb3JlIHRoYW4gb25lIFNXSUcgbW9kdWxlLgogICAgICAgICAgICBQcm9ibGVtIHJlcG9ydGVkIGJ5IEFuZHJlYXMgU2No9nJrLgoKMTAvMzEvMjAwMzogYmVhemxleQogICAgICAgICAgICBJbmNvcnBvcmF0ZWQgcGF0Y2g6IFsgODIzMzAyIF0gSW5jciBUY2wgc3VwcG9ydC4KICAgICAgICAgICAgQ29udHJpYnV0ZWQgYnkgQWxleGV5IER5YWNoZW5rby4KICAgICAgICAgICAgTm90ZTogbmVlZHMgZG9jdW1lbnRhdGlvbi4KCjEwLzMxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgSW5jb3Jwb3JhdGVkIHBhdGNoOiBbIDgyOTMyNSBdIG5ldyBQeXRob24gTW9kdWxlIG9wdGlvbnMgYW5kIGZlYXR1cmVzLgogICAgICAgICAgICBSb2JpbiBEdW5uIHdyaXRlczoKCiAgICAgICAgICAgIFRoaXMgcGF0Y2ggbWFrZXMgYSBudW1iZXIgb2YgY2hhbmdlcyB0byB0aGUgU1dJRyBweXRob24gbW9kdWxlLgoKICAgICAgICAgICAgMS4gQWRkIC1hcHBseSBvcHRpb24sIGFuZCBjaGFuZ2UgdGhlIGRlZmF1bHQgY29kZQogICAgICAgICAgICBvdXRwdXQgdG8gdXNlIHRoZSBmb28oKmFyZ3MsICoqa3cpIGNhbGxpbmcgc3ludGF4CiAgICAgICAgICAgIGluc3RlYWQgb2YgdXNpbmcgYXBwbHkoKS4gSWYgdGhlIC1hcHBseSBvcHRpb24gaXMKICAgICAgICAgICAgZ2l2ZW4gdGhlbiBjb2RlIGlzIGdlbmVyYXRlZCBhcyBiZWZvcmUuIFRoaXMgaXMgdmVyeQogICAgICAgICAgICBzaW1pbGFyIHRvIFBhdGNoICM3MzcyODEgYnV0IHRoZSBuZXcgLW1vZGVybiBvcHRpb24KICAgICAgICAgICAgbWFrZXMgdGhlIHNlY29uZCBoYWxmIG9mIHRoYXQgcGF0Y2ggdW5uZWNlc3Nhcnkgc28gaXQKICAgICAgICAgICAgaXMgbm90IGluY2x1ZGVkIGhlcmUuCgkgICAgCiAgICAgICAgICAgIDIuIEFkZCAtbmV3X3JlcHIgb3B0aW9uLiBUaGlzIGlzIHRoZSBzYW1lIGFzIG15IFBhdGNoCiAgICAgICAgICAgICM3OTcwMDIgd2hpY2ggSSB3aWxsIG1hcmsgYXMgY2xvc2VkIHNpbmNlIGl0IGlzIG5vCiAgICAgICAgICAgIGxvbmdlciBuZWVkZWQuIFdoZW4gdGhpcyBuZXcgb3B0aW9uIGlzIHVzZWQgdGhlbiB0aGUKICAgICAgICAgICAgX19yZXByX18gbWV0aG9kcyB0aGF0IGFyZSBnZW5lcmF0ZWQgZm9yIHByb3h5IGNsYXNzZXMKICAgICAgICAgICAgd2lsbCBiZSBtb3JlIGluZm9ybWF0aXZlIGFuZCBnaXZlIGRldGFpbHMgYWJvdXQgdGhlCiAgICAgICAgICAgIHB5dGhvbiBjbGFzcyBhbmQgdGhlIEMrKyBjbGFzcy4KCSAgICAKICAgICAgICAgICAgMy4gQWRkICVmZWF0dXJlKCJhZGR0b2Z1bmMiKS4gSXQgYWxsb3dzIHlvdSB0byBpbnNlcnQKICAgICAgICAgICAgb25lIG9yIG1vcmUgbGluZXMgb2YgY29kZSBpbnNpZGUgdGhlIHNoYWRvdyBtZXRob2Qgb3IKICAgICAgICAgICAgZnVuY3Rpb24gdGhhdCBpcyBhbHJlYWR5IGdlbmVyYXRlZCwgaW5zdGVhZCBvZgogICAgICAgICAgICByZXBsYWNpbmcgdGhlIHdob2xlIHRoaW5nIGxpa2UgJWZlYXR1cmUoInNoYWRvdyIpIGRvZXMuCiAgICAgICAgICAgIEZvciBfX2luaXRfXyBpdCBnb2VzIGF0IHRoZSBlbmQsIGZvciBfX2RlbF9fIGl0IGdvZXMKICAgICAgICAgICAgYXQgdGhlIGJlZ2luaW5nIGFuZCBmb3IgYWxsIG90aGVycyB0aGUgY29kZSBnZW5lcmF0ZWQKICAgICAgICAgICAgaXMgZXhwYW5kZWQgb3V0IHRvIGJlIGxpa2UKCSAgICAKICAgICAgICAgICAgZGVmIEJhcigqYXJncywgKiprd2FyZ3MpOgogICAgICAgICAgICB2YWwgPSBfbW9kdWxlLkZvb19CYXIoKmFyZ3MsICoqa3dhcmdzKQogICAgICAgICAgICByZXR1cm4gdmFsCgkgICAgCiAgICAgICAgICAgIGFuZCB0aGUgImFkZHRvZnVuYyIgY29kZSBpcyBpbnNlcnRlZCBqdXN0IGJlZm9yZSB0aGUKICAgICAgICAgICAgcmV0dXJuIHN0YXRlbWVudC4gSWYgdGhlIGZlYXR1cmUgaXMgbm90IHVzZWQgZm9yIGEKICAgICAgICAgICAgcGFydGljdWxhciBtZXRob2Qgb3IgZnVuY3Rpb24gdGhlbiB0aGUgc2hvcnRlciBjb2RlIGlzCiAgICAgICAgICAgIGdlbmVyYXRlZCBqdXN0IGxpa2UgYmVmb3JlLgoJICAgIAogICAgICAgICAgICA0LiBBIGxpdHRsZSBiaXQgb2YgcmVmYWN0b3JpbmcgdG8gbWFrZSBpbXBsZW1lbnRpbmcKICAgICAgICAgICAgYWRkdG9mdW5jIGEgbGl0dGxlIGVhc2llci4KCSAgICAKICAgICAgICAgICAgNS4gQWRkZWQgYSAtbW9kZXJuIGNvbW1hbmQtbGluZSBmbGFnIHRoYXQgd2lsbCBjYXVzZQogICAgICAgICAgICBTV0lHIHRvIG9taXQgdGhlIGNydWZ0IGluIHRoZSBwcm94eSBtb2R1bGVzIHRoYXQgYWxsb3dzCiAgICAgICAgICAgIGl0IHRvIHdvcmsgd2l0aCB2ZXJzaW9ucyBvZiBQeXRob24gcHJpb3IgdG8gMi4yLiBUaGUKICAgICAgICAgICAgcmVzdWx0IGlzIGEgc2ltcGxlciwgY2xlYW5lciBhbmQgZmFzdGVyIHB5dGhvbiBwcm94eQogICAgICAgICAgICBtb2R1bGUsIGJ1dCBvbmUgdGhhdCByZXF1aXJlcyBQeXRob24gMi4yIG9yIGdyZWF0ZXIuIAoKMTAvMzEvMjAwMzogYmVhemxleSAKICAgICAgICAgICAgSW5jb3Jwb3JhdGVkIHBhdGNoOiBbIDgyOTMxOSBdIFhNTCBtb2R1bGUgdHdlYWtzLgogICAgICAgICAgICBUaGlzIGFkZHMgYSBuZXcgY29tbWFuZCBsaW5lIG9wdGlvbiAteG1sbGl0ZSB0aGF0IAogICAgICAgICAgICBncmVhdGx5IHJlZHVjZXMgdGhlIGFtb3VudCBvZiBlbWl0dGVkIFhNTCBjb2RlIGJ5CiAgICAgICAgICAgIGVsaW1pbmF0aW5nIHNvbWUgZmllbGRzIG1vc3RseSB1c2VkIGluIFNXSUcncwogICAgICAgICAgICBpbnRlcm5hbCBwcm9jZXNzaW5nLiAgQ29udHJpYnV0ZWQgYnkgUm9iaW4gRHVubi4KCjEwLzMxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgSW5jb3Jwb3JhdGVkIHBhdGNoOiBbIDgyOTMxNyBdIEFkZHMgRG9oU3BsaXRMaW5lcyBmdW5jdGlvbi4KICAgICAgICAgICAgQ29udHJpYnV0ZWQgYnkgUm9iaW4gRHVubi4KCjEwLzI5LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA4Mjc5MDcgXSBhcmdvdXQgb2JqZWN0cyBub3QgYmVpbmcgd3JhcHBlZCBwcm9wZXJseSAoUEFUSCkuCiAgICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IFNhbHZhZG9yIEZhbmRp8W8gR2FyY+1hLgoJICAgICAKMTAvMjkvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDgyNjk5NiBdIHBlcmwgdHlwZSBjaGVja2luZyBpZ25vcmVzIHBlcmwgc3ViY2xhc3Nlcy4KICAgICAgICAgICAgVGhpcyBlbmhhbmNlbWVudCBtYWtlcyBpdCBzbyB3cmFwcGVkIGNsYXNzZXMgYW5kIHN0cnVjdHMgY2FuCiAgICAgICAgICAgIGJlIHN1YmNsYXNzZWQgaW4gUGVybCBhbmQgdXNlZCBub3JtYWxseS4gCiAgICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IFNhbHZhZG9yIEZhbmRp8W8gR2FyY+1hLgoKMTAvMTYvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gSW50UHRyIG1hcnNoYWxsZWQgd2l0aCBhIHZvaWQqIGluc3RlYWQgb2YgaW50IGluIEMgZnVuY3Rpb24gCiAgICAgICAgICAgIGRlY2xhcmF0aW9ucy4gVGhlIGNhc3RzIHRodXMgbG9vayBtb3JlIGNvbnZlbnRpb25hbCwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgLy8gb2xkCiAgICAgICAgICAgICAgICBEbGxFeHBvcnQgZG91YmxlIFNXSUdTVERDQUxMIENTaGFycF9nZXRfU2hhcGVfeChpbnQgamFyZzEpIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICBTaGFwZSAqYXJnMSA9IChTaGFwZSAqKSAwIDsKICAgICAgICAgICAgICAgICAgICBhcmcxID0gKihTaGFwZSAqKikmamFyZzE7IAogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gbmV3CiAgICAgICAgICAgICAgICBEbGxFeHBvcnQgZG91YmxlIFNXSUdTVERDQUxMIENTaGFycF9nZXRfU2hhcGVfeCh2b2lkICogamFyZzEpIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICBTaGFwZSAqYXJnMSA9IChTaGFwZSAqKSAwIDsKICAgICAgICAgICAgICAgICAgICBhcmcxID0gKFNoYXBlICopamFyZzE7IAogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQoKCjEwLzE0LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBzdWJ0bGUgcHJvYmxlbSB3aXRoIG92ZXJsb2FkZWQgbWV0aG9kcyBhbmQgc21hcnQgcG9pbnRlcnMuCiAgICAgICAgICAgIElmIGEgY2xhc3MgaGFzIG92ZXJsb2FkZWQgbWV0aG9kcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBpbnQgYmFyKGludCB4KTsKICAgICAgICAgICAgICAgICAgICAgc3RhdGljIGludCBiYXIoaW50IHgsIGludCB5KTsKICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgYW5kIHRoZSBjbGFzcyBpcyB1c2VkIGFzIGEgc21hcnQgcG9pbnRlcjoKCiAgICAgICAgICAgICAgICBjbGFzcyBGb29QdHIgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBGb28gKm9wZXJhdG9yLT4oKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGUgU1dJRyB3b3VsZCB0cnkgdG8gZXhwb3NlIHRoZSBzdGF0aWMgbWVtYmVyIEZvbzo6YmFyCiAgICAgICAgICAgIHRocm91Z2ggRm9vUHRyLS0tcmVzdWx0aW5nIGJvZ3VzIHdyYXBwZXIgY29kZSBhbmQgYSBjb21waWxlcgogICAgICAgICAgICBlcnJvci4KCiAgICAgICAgICAgIER1ZSB0byB0aGUgd2F5IGluIHdoaWNoIG92ZXJsb2FkaW5nIGlzIGhhbmRsZWQsIGl0IGlzCiAgICAgICAgICAgIGV4dHJlbWVseSBkaWZmaWN1bHQgdG8gZWxpbWluYXRlIHRoZSBzdGF0aWMgbWV0aG9kIGluCiAgICAgICAgICAgIHRoaXMgY2FzZS4gIFRoZXJlZm9yZSwgaXQgaXMgc3RpbGwgZXhwb3NlZC4gIEhvd2V2ZXIsCiAgICAgICAgICAgIHRoZSBnZW5lcmF0ZWQgY29kZSBub3cgY29tcGlsZXMgYW5kIHdvcmtzLgoKMTAvMDUvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZSwgTXpTY2hlbWUsIENoaWNrZW5dOiBSZW1vdmUgc3ltYm9sIGNsYXNoZXMgYmV0d2VlbgoJICAgIHRoZSBydW50aW1lIGxpYnJhcmllcyBieSByZW5hbWluZyBhbGwgZXh0ZXJuIGNvbW1vbi5zd2cKCSAgICBmdW5jdGlvbnMgd2l0aCB0aGUgcHJlcHJvY2Vzc29yLgoKMTAvMDUvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gQWRkZWQgYmFzaWMgR09PUFMgc3VwcG9ydCwgY29udHJpYnV0ZWQgYnkgSm9obiBMZW56LgoJICAgIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscy4KCSAgICAKICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTAvMDQvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gTmV3IG9wdGlvbiwgLW9ubHktc2V0dGVycywgd2hpY2ggZGlzYWJsZXMKCSAgICB0cmFkaXRpb25hbCBnZXR0ZXIgYW5kIHNldHRlciBwcm9jZWR1cmVzIGZvciBzdHJ1Y3R1cmUgc2xvdHMuCgoxMC8wMy8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBBZGRlZCBydW4gdGVzdCBmb3IgcmVmZXJlbmNlX2dsb2JhbF92YXJzIGJ5IEpvaG4gTGVuei4KCjA5LzMwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgUGFydGlhbCBzb2x1dGlvbiB0byBbIDc5MjE4MCBdIEMrKyBzbWFydC1wb2ludGVyL25hbWVzcGFjZSBtaXh1cCByZXZpc2l0ZWQuCiAgICAgICAgICAgIFRoZSBwcm9ibGVtIGlzIG5vdCBlYXN5IHRvIGZpeCAoYXQgbGVhc3QgaXQgZG9lc24ndCBzZWVtIHNvKSwgYnV0IGlzCiAgICAgICAgICAgIHJlbGF0ZWQgdG8gdGhlIGluc3RhbnRpYXRpb24gb2YgcXVhbGlmaWVkIHRlbXBsYXRlcyBpbnNpZGUgb2Ygb3RoZXIKICAgICAgICAgICAgbmFtZXNwYWNlcy4gICBTV0lHIG5vdyBnZW5lcmF0ZXMgYW4gZXJyb3IgbWVzc2FnZSBpbiB0aGlzIGNhc2UgcmF0aGVyCiAgICAgICAgICAgIHRoYW4gZ2VuZXJhdGluZyBicm9rZW4gd3JhcHBlcnMuCgowOS8zMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgODAwMDEyIF0gRU5URVIgbWFjcm8gZnJvbSBDT1JFL3Njb3BlLmggY2xhc2hlcyB3aXRoIGxpYmMgc2VhcmNoLmguCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEJyaXR0b24gTGVvIEtlcmluLgoKMDkvMzAvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDgxMTUxOCBdIENhc3RpbmcgaW50cyB0byBkb3VibGVzICh3LyBzb2x1dGlvbj8pCiAgICAgICAgICAgIEFkZHJlc3NlcyBhIHByb2JsZW0gd2l0aCBvdmVybG9hZGluZyBpbiB0aGUgUGVybCBtb2R1bGUuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEdlcmFsZCBEYWxsZXkuCgowOS8yOC8yMDAzOiBta29lcHBlCgkgICAgW0d1aWxlIHdpdGggLXNjbSBvcHRpb25dIEZpeCB0eXBvIGluIGdlbmVyYXRlZCBjb2RlIGZvcgoJICAgIHByb2NlZHVyZXMtd2l0aC1zZXR0ZXJzLiAgUmVwb3J0ZWQgYnkgSm9obiBMZW56LgoKMDkvMjYvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDgxMjUyOCBdIGV4dGVybnMgbm90IGNvcnJlY3Qgd2hlbiB0aHJvdyBpcyBpbiBzaWduYXR1cmUuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEpvc2VwaCBXaW5zdG9uLgogICAgICAgICAgICAKMDkvMjMvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFNXSUcgd2FzIGdlbmVyYXRpbmcgYSBudW1iZXIgb2Ygc3ltYm9scyB0aGF0IGRpZG4ndCBjb21wbHkgd2l0aCAKICAgICAgICAgICAgdGhlIElTTyBDL0MrKyBzdGFuZGFyZCwgaW4gcGFydGljdWxhciBJU08vSUVDIDE0ODgyOjE5OTgoRSkgMTcuNC4zLjEuMgogICAgICAgICAgICB3aGVyZSBkb3VibGUgdW5kZXJzY29yZXMgYXJlIGZvcmJpZGRlbiBhcyB3ZWxsIGFzIHN5bWJvbHMgc3RhcnRpbmcgd2l0aAogICAgICAgICAgICBhbiB1bmRlcnNjb3JlIGZvbGxvd2VkIGJ5IGFuIHVwcGVyIGNhc2UgbGV0dGVyLiBNb3N0IG9mIHRoZXNlIGhhdmUKICAgICAgICAgICAgYmVlbiByb290ZWQgb3V0LiBTZWUgbmV3IHNlY3Rpb24gYWRkZWQgdG8gaW50ZXJuYWxzLmh0bWwgZGV2ZWxvcG1lbnQKICAgICAgICAgICAgbWFudWFsICdTeW1ib2wgTmFtaW5nIEd1aWRlbGluZXMgZm9yIEdlbmVyYXRlZCBDL0MrKyBDb2RlJy4KCjA5LzIzLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBEaXJlY3RvciB0eXBlbWFwIG5hbWUgY2hhbmdlczoKICAgICAgICAgICAgaW52ICAgICA9PiBkaXJlY3RvcmluCiAgICAgICAgICAgIG91dHYgICAgPT4gZGlyZWN0b3JvdXQKICAgICAgICAgICAgYXJnb3V0diA9PiBkaXJlY3RvcmFyZ291dAoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgowOS8xOS8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBbUHl0aG9uXSBEaXJlY3RvciBjb25zdHJ1Y3RvcnMgbm93IGRlZmF1bHQgdG8gX19kaXNvd24gPSAwLCAKCSAgICB3aGljaCBpcyB0aGUgaW50ZW5kZWQgYmVoYXZpb3IgYW5kIGZpeGVzIHRoZSBkaXJlY3Rvcl9maW5hbGl6ZXIgCgkgICAgdGVzdCBjYXNlIHVuZGVyIHB5dGhvbi4KCjA5LzEyLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIC0gVHlwZW1hcHMgYWRkZWQgZm9yIHN0ZDo6c3RyaW5nIGFuZCBjb25zdCBzdGQ6OnN0cmluZyAmLgogICAgICAgICAgICAgICAgIC0gTmV3IGRlbGVnYXRlIGZvciBjcmVhdGluZyBhIEMjIHN0cmluZyBnaXZlbiBhIGNoYXIgKi4gSXQKICAgICAgICAgICAgICAgICAgIGNhbiBiZSB1c2VkIGJ5IGNhbGxpbmcgU1dJR19jc2hhcnBfc3RyaW5nX2NhbGxiYWNrIGFzIHNob3duCiAgICAgICAgICAgICAgICAgICBpbiB0aGUgc3RkOjpzdHJpbmcgJ291dCcgdHlwZW1hcC4gVXNlZnVsIGlmIHRoZSByZXR1cm4gdHlwZSBpcwogICAgICAgICAgICAgICAgICAgbWFwcGVkIHRvIGEgQyMgc3RyaW5nIGFuZCB0aGUgY2FsbGluZyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSAKICAgICAgICAgICAgICAgICAgIGZvciBjbGVhbmluZyB1cCBtZW1vcnkgYXMgdGhlIEMjIGdhcmJhZ2UgY29sbGVjdG9yIGRvZXNuJ3QKICAgICAgICAgICAgICAgICAgIGZyZWUgdGhlIG1lbW9yeSBjcmVhdGVkIGluIEMvQysrIGFuZCB0aGVuIHJldHVybmVkIGFzIGEgQyMgc3RyaW5nLgogICAgICAgICAgICAgICAgIC0gVGhlIGV4Y2VwdGlvbiBkZWxlZ2F0ZXMgaGF2ZSBtb3ZlZCBpbnRvIGFuIGlubmVyIGNsYXNzIGluIHRoZQogICAgICAgICAgICAgICAgICAgaW50ZXJtZWRpYXRlIGNsYXNzLCB0aGVyZWJ5IGZyZWVpbmcgdXAgdGhlIHN0YXRpYyBjb25zdHJ1Y3Rvci4KCjA5LzExLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgKEludGVybmFscykKICAgICAgICAgICAgTWFqb3IgcmVmYWN0b3Jpbmcgb2YgaXRlcmF0aW9uIG92ZXIgbGlzdHMgYW5kIGhhc2hlcy4gIFRoZQogICAgICAgICAgICBET0ggbGlicmFyeSBub3cgdXNlcyBpdGVyYXRvcnMuICBUaGV5IHdvcmsgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIExpc3QgKmwgPSAoc29tZSBsaXN0KTsKCiAgICAgICAgICAgICAgICBJdGVyYXRvciBpOwogICAgICAgICAgICAgICAgZm9yIChpID0gRmlyc3QobCk7IGkuaXRlbTsgaSA9IE5leHQoaSkpIHsKICAgICAgICAgICAgICAgICAgICAvLyBpLml0ZW0gY29udGFpbnMgdGhlIGFjdHVhbCBsaXN0IGl0ZW0uCiAgICAgICAgICAgICAgICAgICAgLy8gaS5pdGVtIGlzIE5VTEwgYXQgZW5kIG9mIGxpc3QKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBIYXNoICpoID0gKHNvbWUgaGFzaCk7CiAgICAgICAgICAgICAgICBJdGVyYXRvciBqOwogICAgICAgICAgICAgICAgZm9yIChqID0gRmlyc3QoaCk7IGouaXRlbTsgaiA9IE5leHQoaikpIHsKICAgICAgICAgICAgICAgICAgICAvLyBqLml0ZW0gY29udGFpbnMgaGFzaCB0YWJsZSBpdGVtCiAgICAgICAgICAgICAgICAgICAgLy8gai5rZXkgIGNvbnRhaW5zIGhhc2ggdGFibGUga2V5CiAgICAgICAgICAgICAgICAgICAgLy8gQm90aCBqLml0ZW0gYW5kIGoua2V5IGFyZSBOVUxMIGF0IGVuZAogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgIFRoZSBvbGQgaXRlcmF0aW9uIGZ1bmN0aW9ucyBGaXJzdGl0ZW0oKSwgTmV4dGl0ZW0oKSwgRmlyc3RrZXkoKSwKICAgICAgICAgICAgYW5kIE5leHRrZXkoKSBhcmUgZ29uZS4gIAoKICAgICAgICAgICAgVGhlIG5ldyBpdGVyYXRvcnMgYXJlIHNpbXBsZXIsIHJlc3VsdCBpbiBiZXR0ZXIgbWVtb3J5IHVzZSwKICAgICAgICAgICAgYW5kIG1heSBiZSBmYXN0ZXIuICBBbHNvLCB0aGVyZSBhcmUgbm8gbG9uZ2VyIGFueSBwcm9ibGVtcwogICAgICAgICAgICBpdGVyYXRpbmcgb3ZlciB0aGUgc2FtZSBsaXN0L2hhc2ggaW4gbXVsdGlwbGUgcGxhY2VzIGF0CiAgICAgICAgICAgIHRoZSBzYW1lIHRpbWUuICBGb3IgZXhhbXBsZSwgdGhpcyBpcyBmaW5lOgoKICAgICAgICAgICAgICAgICBJdGVyYXRvciBpLGo7CiAgICAgICAgICAgICAgICAgZm9yIChpID0gRmlyc3QobCk7IGkuaXRlbTsgaSA9IE5leHQoaSkpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSBGaXJzdChsKTsgai5pdGVtOyBqID0gTmV4dChqKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIChUaGlzIG5ldmVyIHdvcmtlZCBpbiBwcmV2aW91cyB2ZXJzaW9ucykuCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKi4gIFRoaXMgd2lsbCBwcm9iYWJseSBicmVhayAKICAgICAgICAgICAgdGhpcmQgcGFydHkgZXh0ZW5zaW9ucyB0byBTV0lHIChvciBnaXZlIHRoZW0gZnVydGhlciBlbmNvdXJhZ2VtZW50CiAgICAgICAgICAgIHRvIGpvaW4gdGhlIFNXSUcgQ1ZTLXRyZWUgOi0pLgoKMDkvMTAvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gRml4IG1lbW9yeSBsZWFrcyBpbiB0aGUgImxpc3QtdmVjdG9yLmkiIHR5cGVtYXBzLgoKMDkvMDkvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtDaGlja2VuXSBVc2UgQ19ta19ib29sIHJhdGhlciB0aGFuIENfbWtib29sLiAgVGhpcyBmaXhlcwoJICAgIHRoZSB3cmFwcGluZyBvZiBib29sZWFuIHZhbHVlcyBmb3IgQ2hpY2tlbiAxLjEwIGFuZCBuZXdlci4KCSAgICBSZXBvcnRlZCBieSBEYXZlIDxodW5kb0B5YWhvby5jb20+IC8gRmVsaXggV2lua2VsbWFubgoJICAgIDxmZWxpeEBwcm94aW1hLW10LmRlPi4KCjA5LzA1LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRGlyZWN0b3JzIGltcGxlbWVudGVkIGZvciBKYXZhLiBJbiBzdW1tYXJ5IHRoaXMgaXMgYSBiaWcgbmV3IGZlYXR1cmUgCiAgICAgICAgICAgIHdoaWNoIHN1cHBvcnRzIHVwY2FsbHMgZnJvbSBDKysgdG8gSmF2YS4gQ29kZSBpcyBnZW5lcmF0ZWQgdG8gc3VwcG9ydCBDKysgCiAgICAgICAgICAgIGNhbGxiYWNrcyB0byBjYWxsIGludG8gSmF2YSBhbmQgdHJ1ZSBwb2x5bW9ycGhpYyBiZWhhdmlvdXIgZm9yIEphdmEgY2xhc3NlcyAKICAgICAgICAgICAgZGVyaXZlZCBmcm9tIEMrKyBjbGFzc2VzLiBTZWUgamF2YS5odG1sIGZvciBkZXRhaWxzLiBDb250cmlidXRlZCBieSAKICAgICAgICAgICAgU2NvdHQgTWljaGVsLgoKMDkvMDUvMjAwMzogVGlnZXIKICAgICAgICAgICAgQ3JlYXRlZCBjb250cmFjdCBleGFtcGxlIGRpcmVjdG9yeSBhdCAvU1dJRy9FeGFtcGxlcy9jb250cmFjdAogICAgICAgICAgICBBZGRlZCBzaW1wbGUgY29udHJhY3QgZXhhbXBsZXMgKHNpbXBsZV9jICYgc2ltcGxlX2N4eCkKICAgICAgICAgICAgTW9kaWZpZWQgY29udHJhY3QgbW9kdWxlJ3Mgb3V0cHV0IGZvcm1hdAoKICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDkvMDEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFRlc3Qtc3VpdGUgYnVpbGQgaW1wcm92ZW1lbnRzOgogICAgICAgICAgICAtIE11bHRpcGxlIGJ1aWxkIGRpcmVjdG9yaWVzIHdvcmtpbmcgZm9yIHRoZSB0ZXN0IHN1aXRlLCBzbyBpdCBpcyBub3cKICAgICAgICAgICAgICBwb3NzaWJsZSB0byBydW4gY29uZmlndXJlIGluIG11bHRpcGxlIHN1YmRpcmVjdG9yaWVzIGFuZCBydW4gdGhlIHRlc3QKICAgICAgICAgICAgICBzdWl0ZSBpbiBlYWNoIG9mIHRoZXNlIHN1YiBkaXJlY3Rvcmllcy4KICAgICAgICAgICAgLSAnbWFrZSBkaXN0Y2xlYW4nIGZpeGVkIHNvIGl0IGRvZXNuJ3QgYm9tYiBvdXQgb24gdGhlIEV4YW1wbGVzIGRpcmVjdG9yeQogICAgICAgICAgICAgIHdoZW4gdXNpbmcgbXVsdGlwbGUgc3ViZGlyZXRvcnkgYnVpbGRzLiBSZXF1aXJlZCB0aGUgZm9sbG93aW5nIGRpcmVjdG9yaWVzCiAgICAgICAgICAgICAgdG8gYmUgbW92ZWQ6CiAgICAgICAgICAgICAgICBFeGFtcGxlcy9HSUZQbG90L1BlcmwgLT4gRXhhbXBsZXMvR0lGUGxvdC9QZXJsNQogICAgICAgICAgICAgICAgRXhhbXBsZXMvR0lGUGxvdC9QaHAgIC0+IEV4YW1wbGVzL0dJRlBsb3QvUGhwNAogICAgICAgICAgICAgIFRoZXNlIG5ldyBkaXJlY3RvcmllcyB1c2VkIHRvIGJlIHN5bWJvbGljIGxpbmtzIHRvIHRoZSBvbGQgZGlyZWN0b3J5LgogICAgICAgICAgICAgIEFsc28gdGhlIEV4YW1wbGVzL3Rlc3Qtc3VpdGUvUGVybCBzeW1ib2xpYyBsaW5rIGhhcyBiZWVuIHJlbW92ZWQuCiAgICAgICAgICAgIC0gUnVubmluZyB0aGUgdGVzdC1zdWl0ZSwgb3RoZXIgdGhhbiBmcm9tIHRoZSByb290IGRpcmVjdG9yeSwgc2F5CiAgICAgICAgICAgICAgaW4gRXhhbXBsZXMvdGVzdC1zdWl0ZS9weXRob24gd2lsbCBub3cgZGlzcGxheSBhbGwgdGhlIGNvZGUgYmVpbmcKICAgICAgICAgICAgICBleGVjdXRlZC4KICAgICAgICAgICAgLSBUaGUgZm9sbG93aW5nIDMgQyMgY29tcGlsZXJzIGFyZSBkZXRlY3RlZCBkdXJpbmcgY29uZmlndXJlIGFuZCB3b3JrIHdpdGggCiAgICAgICAgICAgICAgdGhlIHRlc3Qtc3VpdGU6IE1vbm8sIFBvcnRhYmxlLk5FVCBhbmQgTWljcm9zb2Z0LgoKMDkvMDEvMjAwMzogVGlnZXIKICAgICAgICAgICAgQWRkZWQgaW5oZXJpdGFuY2Ugc3VwcG9ydCBmb3IgZGVzaWduIGJ5IGNvbnRyYWN0IGZlYXR1cmUuCgowOS8wMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzk0OTE0IF0gV3JvbmcgdHlwZXMgaW4gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24uCiAgICAgICAgICAgIFNXSUcgd2FzIG5vdCBoYW5kbGluZyBhcmd1bWVudHMgY29ycmVjdGx5IGluIHRlbXBsYXRlIAogICAgICAgICAgICBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uLiAgRm9yIGV4YW1wbGUsCgogICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgRm9vPFQgKj4gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIFQgKmJsYWgoKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgJXRlbXBsYXRlKEZvb0ludCkgRm9vPGludCAqPjsKCiAgICAgICAgICAgIGluIHRoaXMgY2xhc3MsIHRoZSByZXR1cm4gdHlwZSBvZiBibGFoIHdhcyBzZXQgdG8KICAgICAgICAgICAgJ2ludCAqKicsIGJ1dCBpdCBzaG91bGQgcmVhbGx5IGJlICdpbnQgKicuICBUaGlzIGhhcyBiZWVuCiAgICAgICAgICAgIGZpeGVkLCBidXQgaXQgd2lsbCBhZmZlY3QgYWxsIHByaW9yIHVzZXMgb2YgcGFydGlhbAogICAgICAgICAgICBzcGVjaWFsaXphdGlvbi4KIAowOS8wMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzg2Mzk0IF0gUGF0Y2ggZm9yIGdlbmVyYXRlZCBwZXJsIGNvZGUgZG9lcyBub3QgY29tcGlsZSB1bmRlciBSZWRIYXQ5LgogICAgICAgICAgICBSZXBvcnRlZCBieSBTY290dCBGaW5uZXJhbi4KCjA5LzAxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3OTE1NzkgXSAodW5zaWduZWQpIGxvbmcgbG9uZyBoYW5kbGVkIGluY29ycmVjdGx5IChUY2wpLgogICAgICAgICAgICBUaGlzIHdhcyBhbiBlcnJvciBpbiB0aGUgVGNsIHR5cGVtYXBzLmkgZmlsZS4gCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEtqZWxsIFdvb2RpbmcuCiAgICAgICAgCjA5LzAxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3OTc1NzMgXSBubyB3YXkgdG8gcmVuYW1lIGNsYXNzZXMgY29taW5nIGZyb20gQyBzdHJ1Y3R1cmVzLgogICAgICAgICAgICBUaGlzIHByb2JsZW0gcmVsYXRlcyB0byByZW5hbWluZyBvZiBhbm9ueW1vdXMgc3RydWN0dXJlcyB3aXRoIGEKICAgICAgICAgICAgdHlwZWRlZi4gIEZvciBleGFtcGxlOiAKCiAgICAgICAgICAgICAgICAgICVyZW5hbWUoQmFyKSBGb287CiAgICAgICAgICAgICAgICAgIHR5cGVkZWYgc3RydWN0IHsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIH0gRm9vOwoKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQnJpdHRvbiBMZW8gS2VyaW4uCiAgICAgICAgICAgIAowOS8wMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzk3NTc2IF0gLWhlbHAgc2VlbXMgdG8gaW1wbHkgdGhhdCBvbmx5IHRjbC1zcGVjaWZpYyBvcHRpb25zIGV4aXN0LgogICAgICAgICAgICBBZGRlZCBhIGNvbW1lbnQgdG8gYWxlcnQgdXNlciB0byBvdGhlciBvcHRpb25zLgogICAgICAgICAgICBSZXBvcnRlZCBieSBCcml0dG9uIExlbyBLZXJpbi4KCjA5LzAxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3OTgyMDUgXSBTZWdmYXVsdCBpbiBTV0lHX0NvbnZlcnRQdHIuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IFByYWJodSBSYW1hY2hhbmRyYW4uCgowOC8zMC8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBNb2RpZmllZCB0aGUgZGlyZWN0b3IgdHlwZW1hcHMgaW4gcHl0aG9uL3N0ZF9jb21wbGV4LmkgdG8gdXNlIHRoZSAKCSAgICBuZXctc3R5bGUgbWFjcm8gYW5kIGNvbnZlcnNpb24gZnVuY3Rpb25zLCB3aGljaCBlbGltaW5hdGVkIHNvbWUKCSAgICByZWR1bmRhbnQgY29kZS4gIEZpeGVkIGEgZmV3IGJ1Z3MgaW4gdGhlc2UgdHlwZW1hcHMgYXMgd2VsbCwgYWx0aG91Z2gKCSAgICBtb3JlIHRlc3RpbmcgaXMgbmVlZGVkLgoKMDgvMjkvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgQ29tcGxldGVkIGluaXRpYWwgc3VwcG9ydCBmb3Igd3JhcHBpbmcgYWJzdHJhY3QgY2xhc3NlcyB3aXRoIGRpcmVjdG9ycy4KCSAgICBDb25zdHJ1Y3RvciB3cmFwcGVycyB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgYWJzdHJhY3QgY2xhc3NlcyB0aGF0IGhhdmUKCSAgICBkaXJlY3RvcnMsIGFuZCBpbnN0YW5jZXMgb2YgdGhlIGRpcmVjdG9yIGNsYXNzZXMgd2lsbCBiZSBjcmVhdGVkIHJlZ2FyZGxlc3MKCSAgICBvZiB3aGV0aGVyIHRoZSBwcm94eSBjbGFzcyBoYXMgYmVlbiBzdWJjbGFzc2VkIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuCgkgICAgTm8gY2hlY2tzIGFyZSBtYWRlIGR1cmluZyBjb25zdHJ1Y3Rpb24gdG8gZW5zdXJlIHRoYXQgYWxsIHB1cmUgdmlydHVhbAoJICAgIG1ldGhvZHMgYXJlIGltcGxlbWVudGVkIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuICBJbnN0ZWFkLCBjYWxscyB0bwoJICAgIHVuaW1wbGVtZW50ZWQgbWV0aG9kcyB3aWxsIHRocm93IFNXSUdfRElSRUNUT1JfUFVSRV9WSVJUVUFMX0VYQ0VQVElPTgoJICAgIGV4Y2VwdGlvbnMgaW4gQysrLgoKCSAgICBJbnRlZ3JhdGVkIFByYWJodSBSYW1hY2hhbmRyYW4ncyB0eXBlbWFwIHBhdGNoZXMsIHdoaWNoIHByb3ZpZGUgZGlyZWN0b3IKCSAgICB0eXBlbWFwIHN1cHBvcnQgZm9yIGVudW1zIGFuZCBzdGQ6OnNpemVfdCwgYW5kIGZpeCBhIGNvdXBsZSBidWdzIGluIHRoZSAKCSAgICBkaXJlY3RvciBzdGQ6OnZlY3Rvcjw+IHR5cGVtYXBzLgoKMDgvMjkvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gSW1wbGVtZW50ZWQgZXhjZXB0aW9uIGhhbmRsaW5nIGZvciB0aHJvd2luZyBDIyBleGNlcHRpb25zIGZyb20gQy9DKysgY29kZS4KICAgICAgICAgICAgQSBmZXcgZGVsZWdhdGUgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUgZm9yIGNhbGxpbmcgd2hpY2ggdGhlbiB0aHJvdyB0aGUgQyMKICAgICAgICAgICAgZXhjZXB0aW9uLiBVc2UgdGhlIFNXSUdfQ1NoYXJwVGhyb3dFeGNlcHRpb24gZnVuY3Rpb24gZnJvbSBDL0MrKyB0eXBlbWFwcy4KICAgICAgICAgICAgU2VlIHRoZSBnZW5lcmF0ZWQgd3JhcHBlciBjb2RlIG9yIGNzaGFycGhlYWQuc3dnIGZvciBhbGwgYXZhaWxhYmxlIGV4Y2VwdGlvbnMuCiAgICAgICAgICAgIEV4YW1wbGU6CgogICAgICAgICAgICAgIFNXSUdfQ1NoYXJwVGhyb3dFeGNlcHRpb24oU1dJR19DU2hhcnBFeGNlcHRpb24sICJleGNlcHRpb24gZGVzY3JpcHRpb24iKTsKCiAgICAgICAgICAgIFRoZSAndGhyb3dzJyB0eXBlbWFwcyBhcmUgYWxzbyBub3cgaW1wbGVtZW50ZWQsIHNvIGNvZGUgaXMgYXV0b21hdGljYWxseSAKICAgICAgICAgICAgZ2VuZXJhdGVkIHRvIGNvbnZlcnQgYW55IEMrKyBleGNlcHRpb24gaW50byBhIEMjIFN5c3RlbS5FeGNlcHRpb24gd2hlbiB0aGUgQysrIAogICAgICAgICAgICBtZXRob2QgZGVjbGFyZXMgYW4gZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gc3VjaCBhczoKCiAgICAgICAgICAgICAgIGludCBmb28oKSB0aHJvdyhCYXIpOwoKICAgICAgICAgICAgQWxzbyBhbnkgcGFyYW1ldGVycyB0aGF0IGFyZSByZWZlcmVuY2VzIHRvIGEgQysrIGNsYXNzIG9yIGEgY2xhc3MgcGFzc2VkIGJ5IHZhbHVlCiAgICAgICAgICAgIGFuZCBhcmUgcGFzc2VkIGFzIGEgQyMgbnVsbCB3aWxsIG5vdyB0aHJvdyBhIEMjIE51bGxSZWZlcmVuY2VFeGNlcHRpb24uCgowOC8yOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBGaXggdG8gbWF0Y2ggdGhlIGNhbGxpbmcgY29udmVudGlvbiBvZiBhbGwgcGludm9rZSBtZXRob2RzIHNvIHRoYXQgdGhleQogICAgICAgICAgICBtYXRjaCB0aGUgY2FsbGluZyBjb252ZW50aW9uIHVzZWQgYnkgZGVmYXVsdCBpbiB0aGUgQyMgJ3N0YXRpYyBleHRlcm4nIGRlY2xhcmF0aW9ucyAKICAgICAgICAgICAgKF9fc3RkY2FsbCBpcyB1c2VkIG9uIFdpbmRvd3MpLgoKMDgvMTkvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBSZXdvcmtlZCBzdGQ6OnN0cmluZyB0eXBlbWFwcy4gRml4ZXMgYSBudW1iZXIgb2Ygc3RyaW5nIGluIHN0ZCBuYW1lc3BhY2UgCiAgICAgICAgICAgIHByb2JsZW1zLiBGb3IgZXhhbXBsZSAldGVtcGxhdGUgdmVjdG9yPHN0cmluZz4uIFRoZSB0ZW1wbGF0ZWQgY2xhc3MnIGdldCBtZXRob2QgCiAgICAgICAgICAgIHdhc24ndCByZXR1cm5pbmcgYSBKYXZhIFN0cmluZywgYnV0IGEgU1dJR1RZUEVfcF9zdHJpbmcuIFJlcG9ydGVkCiAgICAgICAgICAgIGJ5IFphY2ggQmF1bS4KCjA4LzE1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3NjM1MjIgXSAxLjMuMTkgc2VnZmF1bHQgaW4gU3dpZ1R5cGVfYWRkX3BvaW50ZXIvRG9oSW5zZXJ0aXRlbS4KICAgICAgICAgICAgUmVsYXRlZCB0byBwcm9ibGVtIHdpdGggdW5uYW1lZCBjbGFzcyBoYW5kbGluZyBpbiBQZXJsIG1vZHVsZS4KCjA4LzE1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3NjM1NjMgXSBNaXNzaW5nIGluZGljYXRpb24gb2Ygb3B0aW9uYWwgYXJndW1lbnRzLgogICAgICAgICAgICBUY2wgbW9kdWxlLiAgUmVwb3J0ZWQgYnkgS3J6eXN6dG9mIEtvem1pbnNraS4KCjA4LzE1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3ODc0MzIgXSBsb25nIHBhcmFtIGhhbmRsZWQgYXMgaW50LiAgVGNsIG1vZHVsZQogICAgICAgICAgICBub3cgdXNlcyBUY2xfR2V0TG9uZ0Zyb21PYmogdG8gY29udmVydCBpbnRlZ2VyIHZhbHVlcy4KCjA4LzExLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3NzU5ODkgXSBudW1lcmljIHRlbXBsYXRlIHBhcmFtZXRlcnMuICAgVGhlcmUgd2VyZQogICAgICAgICAgICBzb21lIGVycm9ycyBpbiB0ZW1wbGF0ZSBleHBhbnNpb24gcmVsYXRlZCB0byB0aGUgdXNlIG9mCiAgICAgICAgICAgIGFycmF5cyB3aGVyZSB0aGUgYXJyYXkgZGltZW5zaW9uIHdhcyBhIHRlbXBsYXRlIHBhcmFtZXRlci4KICAgICAgICAgICAgSXQgc2hvdWxkIHdvcmsgbm93LiAgUmVwb3J0ZWQgYnkgQnJ5YW4gR3JlZW4uCgowOC8xMC8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBBZGRlZCBhIGRpcmVjdG9yIHR5cGVtYXAgKG91dHYpIGZvciByZXR1cm4gYnkgdmFsdWUgYW5kIGNsZWFuZWQgdXAgdXAgYSBmZXcgCgkgICAgb2YgdGhlIGNvbW1lbnRlZCBkaXJlY3RvciB0eXBlbWFwcy4KCjA4LzEwLzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIEZpeGVkIGNvbnN0cnVjdG9yIGdlbmVyYXRpb24gZm9yIGRpcmVjdG9yIGNsYXNzZXMgdG8gaWdub3JlIHByaXZhdGUKCSAgICBjb25zdHJ1Y3RvcnMuICBQcm90ZWN0ZWQgY29uc3RydWN0b3JzIGFyZSBhbHNvIGlnbm9yZWQgZm9yIG5vdywgcGVuZGluZwoJICAgIGEgc29sdXRpb24gdG8gdGhlIHByb2JsZW0gb2Ygd3JhcHBpbmcgY2xhc3NlcyB0aGF0IG9ubHkgZGVmaW5lIHByb3RlY3RlZAoJICAgIGNvbnN0cnVjdG9ycy4KCjA4LzA3LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBOZXcgY29tbWFuZGxpbmUgb3B0aW9uIC1vdXRkaXIgPGRpcj4gdG8gc3BlY2lmeSB3aGVyZSB0aGUgbGFuZ3VhZ2Ugc3BlY2lmaWMKICAgICAgICAgICAgZmlsZXMgYXJlIHRvIGJlIGdlbmVyYXRlZC4gVGhpcyBpcyB1c2VmdWwgZm9yIHRhcmdldCBsYW5ndWFnZXMgbGlrZSBQeXRob24sCiAgICAgICAgICAgIEphdmEgZXRjIHdoaWNoIGdlbmVyYXRlIHByb3h5IGZpbGVzIGluIHRoZSBhcHByb3ByaWF0ZSBsYW5ndWFnZS4KICAgICAgICAgICAgVGhpcyBvcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gdGhlIEMvQysrIHdyYXBwZXIgZmlsZS4KCjA4LzA3LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBPbiBXaW5kb3dzIHRoZSBnZW5lcmF0ZWQgZmlsZXMgKG90aGVyIHRoYW4gdGhlIF93cmFwLmMgb3IgX3dyYXAuY3h4IGZpbGVzKQogICAgICAgICAgICB3ZXJlIHNvbWV0aW1lcyBpbmNvcnJlY3RseSBiZWluZyBnZW5lcmF0ZWQgaW50byB0aGUgY3VycmVudCBkaXJlY3RvcnkgdW5sZXNzCiAgICAgICAgICAgIHRoZSBpbnB1dCBmaWxlIHVzZWQgdGhlIFVuaXggcGF0aCBzZXBhcmF0b3IuIFRoZSBXaW5kb3dzIHBhdGggc2VwYXJhdG9yIAogICAgICAgICAgICBzaG91bGQgbm93IGJlIHVzZWQuIEJ1ZyByZXBvcnRlZCBieSBSb2JlcnQgRGF2aWVzLgoKMDgvMDcvMjAwMzogYmVhemxleQogICAgICAgICAgICBBZGRlZCBhcnJheSB2YXJpYWJsZSBzZXQgdHlwZW1hcCB0byBQZXJsIG1vZHVsZS4KCjA4LzA3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3NzU2NzcgXSBBcnJheSBpbml0IGNhdXNlcyBjb2RlZ2VuIGJ1Zy4uCgowOC8wNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzc5MDYyIF0gQ2xhc3MiXG4iOjpmb28gbm90IHN1cHBvcnRlZC4gIFNXSUcKICAgICAgICAgICAgc2hvdWxkIG5vdyBjb3JyZWN0bHkgaGFuZGxlIHdoaXRlc3BhY2UgaW4gYmV0d2VlbiAKICAgICAgICAgICAgbmFtZXNwYWNlIHF1YWxpZmllcnMuICBGb3IgZXhhbXBsZSAiQSA6OiBGb28gOjogQmFyIi4KICAgICAgICAgICAgCjA3LzMxLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXhlcyBmb3IgcGFyYW1ldGVycyB3aGljaCBhcmUgY2xhc3NlcyB0aGF0IGFyZSBwYXNzZWQgYnkgdmFsdWUgYW5kIGhhdmUgCiAgICAgICAgICAgIGEgZGVmYXVsdCB2YWx1ZS4gQSBjb3B5IGNvbnN0cnVjdG9yIGZvciBTd2lnVmFsdWVXcmFwcGVyIGlzIHJlcXVpcmVkIAogICAgICAgICAgICAoU0YgIzc4MDA1NikuIEFsc28gZml4ZWQgbWVtb3J5IGxlYWsgaW4gdGhlc2UgY2lyY3Vtc3RhbmNlcy4gVGhlc2UgbW9kcwogICAgICAgICAgICBhbHNvIGZpeCBTRiAjNzgwMDU0LgoKMDcvMjgvMjAwMzogYmVhemxleQogICAgICAgICAgICBJbXByb3ZlZCBydW4tdGltZSBlcnJvciBtZXNzYWdlIGZvciBwb2ludGVycyBpbiBQeXRob24gbW9kdWxlLgogICAgICAgICAgICBDb250cmlidXRlZCBieSBab29rby4KCjA3LzEwLzIwMDM6IGJhbGxhYmlvIChMdWlnaSBCYWxsYWJpbykKICAgICAgICAgICAgW0FsbW9zdCBhbGwgbGFuZ3VhZ2VzXSBXcmFwcGVycyBmb3Igc3RkOjpwYWlyIGFkZGVkLgoJICAgIFR5cGVtYXBzIGZvciBQeXRob24sIFJ1YnksIEd1aWxlIGFuZCBNelNjaGVtZS4KCjA3LzAxLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbQ2hpY2tlbl0gSGFuZGxlIHRoZSBjYXNlIG9mIG1vcmUgdGhhbiBvbmUgYXJnb3V0IHR5cGVtYXAKCSAgICBwZXIgZnVuY3Rpb24uCgowNi8yOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmEsIEMjXSBTRiAjNjcwOTQ5IHJlcXVlc3QuIFRoZSBkZXN0cnVjdG9yIHdyYXBwZXIgZnVuY3Rpb24gbmFtZSBpcyBub3cgCiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZS4gIEEgbmV3IGF0dHJpYnV0ZSBjYWxsZWQgbWV0aG9kbmFtZSBpbiB0aGUgCiAgICAgICAgICAgIGphdmFkZXN0cnVjdC9qYXZhZGVzdHJ1Y3RfZGVyaXZlZCAoSmF2YSkgb3IgY3NkZXN0cnVjdC9jc2Rlc3RydWN0X2Rlcml2ZWQgKEMjKQogICAgICAgICAgICB0eXBlbWFwcyBzcGVjaWZpZXMgdGhlIG1ldGhvZCBuYW1lLiBGb3IgZXhhbXBsZSBpbiBKYXZhIHRoZSBkZXN0cnVjdG9yIGlzIAogICAgICAgICAgICB3cmFwcGVkIGJ5IGRlZmF1bHQgd2l0aCB0aGUgZGVsZXRlIG1ldGhvZDoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhZGVzdHJ1Y3QsIG1ldGhvZG5hbWU9ImRlbGV0ZSIpIFNXSUdUWVBFIHsuLi59CgowNi8yNy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmEsIEMjXSBUaGUgdGhyb3dzIGF0dHJpYnV0ZSBmb3IgYWRkaW5nIGV4Y2VwdGlvbiBjbGFzc2VzIHRvIHRoZSB0aHJvd3MKICAgICAgICAgICAgY2xhdXNlIGFsc28gbm93IHdvcmtzIHdpdGggdGhlIGZvbGxvd2luZyB0eXBlbWFwczogCiAgICAgICAgICAgIG5ld2ZyZWUKICAgICAgICAgICAgamF2YWluLCBqYXZhb3V0IChKYXZhKQogICAgICAgICAgICBjc2luLCBjc291dCAoQyMpCgogICAgICAgICAgICBGb3IgZXhhbXBsZSwgdGhlICdBbkV4Y2VwdGlvbicgd2lsbCBiZSBhZGRlZCB0byB0aGUgdGhyb3dzIGNsYXVzZSBpbiB0aGUKICAgICAgICAgICAgcHJveHkgZnVuY3Rpb246CgogICAgICAgICAgICAldHlwZW1hcChqYXZhb3V0LCB0aHJvd3M9IkFuRXhjZXB0aW9uIikgaW50IHsKICAgICAgICAgICAgICAgIGludCByZXR1cm5WYWx1ZT0kam5pY2FsbDsKICAgICAgICAgICAgICAgIGlmIChyZXR1cm5WYWx1ZT09MCkgdGhyb3cgbmV3IEFuRXhjZXB0aW9uKCJWYWx1ZSBtdXN0IG5vdCBiZSB6ZXJvIik7CiAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7CiAgICAgICAgICAgIH0KCjA2LzI1LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIFtQeXRob25dIERpcmVjdG9yIHR5cGVtYXAgbWFyc2hhbGxpbmcgY2hlY2tzIGZvciBudWxsIHBvaW50ZXJzIHdoZW4KCSAgICB3YWxraW5nIHRoZSBwYXJhbWV0ZXIgbGlzdCBpbnN0ZWFkIG9mIHJlbHlpbmcgc29sZXkgb24gdGhlIHBhcmFtZXRlcgoJICAgIGNvdW50LiAgQ3VyZXMgYSBzZWdmYXVsdCB0aGF0IG9jY3VycmVkIGZvciBtdWx0aXBsZSBhcmd1bWVudCBpbnYgdHlwZW1hcHMuCgkgICAgU29tZW9uZSB3aXRoIG1vcmUgU3dpZyBleHBlcmllbmNlIHNob3VsZCBwcm9iYWJseSByZXZpZXcgdGhpcyBjb2RlLgoKMDYvMjQvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtDaGlja2VuXSBEb24ndCBlbWl0IGNhbGxzIHRvICJDX2NoZWNrX2Zvcl9pbnRlcnJ1cHQiLAoJICAgIHdoaWNoIG1heSByZXN1bHQgaW4gYW4gZW5kbGVzcyBsb29wLiAgUGF0Y2ggYnkgZmVsaXhAcHJveGltYS1tdC5kZS4KCjA2LzIwLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEZpbmFsaXplcnMgbm93IHVzZSBkZXN0cnVjdG9yIHN5bnRheCBhcyB0aGUgb3ZlcnJpZGUgd2hpY2ggd2FzIHVzZWQgaW4gCiAgICAgICAgICAgIHRoZSBGaW5hbGl6ZSBtZXRob2QgaXMgbm90IGluIHRoZSBFQ01BIHN0YW5kYXJkcywgc3BvdHRlZCBieSB0aGUgTVMgY29tcGlsZXIuCgowNi8xMC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBBIG51bWJlciBvZiBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIHRvIHJlbW92ZSB0aGUgSmF2YSBuYW1pbmcgCiAgICAgICAgICAgIHRoYXQgd2FzIHVzZWQgaW4gdGhlIEMjIG1vZHVsZS4KICAgICAgICAgICAgCiAgICAgICAgICAgIFR5cGVtYXAgbmFtZSBjaGFuZ2VzOgogICAgICAgICAgICBqbmkgICAgICAgICAgICAgICAgICAgICAgICAgLT4gY3R5cGUKICAgICAgICAgICAganR5cGUgICAgICAgICAgICAgICAgICAgICAgIC0+IGltdHlwZQogICAgICAgICAgICBqc3R5cGUgICAgICAgICAgICAgICAgICAgICAgLT4gY3N0eXBlCiAgICAgICAgICAgIGphdmFpbiAgICAgICAgICAgICAgICAgICAgICAtPiBjc2luCiAgICAgICAgICAgIGphdmFvdXQgICAgICAgICAgICAgICAgICAgICAtPiBjc291dAogICAgICAgICAgICBqYXZhaW50ZXJmYWNlcyAgICAgICAgICAgICAgLT4gY3NpbnRlcmZhY2VzCiAgICAgICAgICAgIGphdmFiYXNlICAgICAgICAgICAgICAgICAgICAtPiBjc2Jhc2UKICAgICAgICAgICAgamF2YWNsYXNzbW9kaWZpZXJzICAgICAgICAgIC0+IGNzY2xhc3Ntb2RpZmllcnMKICAgICAgICAgICAgamF2YWNvZGUgICAgICAgICAgICAgICAgICAgIC0+IGNzY29kZQogICAgICAgICAgICBqYXZhaW1wb3J0cyAgICAgICAgICAgICAgICAgLT4gY3NpbXBvcnRzCiAgICAgICAgICAgIGphdmFwdHJjb25zdHJ1Y3Rvcm1vZGlmaWVycyAtPiBjc3B0cmNvbnN0cnVjdG9ybW9kaWZpZXJzCiAgICAgICAgICAgIGphdmFnZXRjcHRyICAgICAgICAgICAgICAgICAtPiBjc2dldGNwdHIKICAgICAgICAgICAgamF2YWZpbmFsaXplICAgICAgICAgICAgICAgIC0+IGNzZmluYWxpemUKCiAgICAgICAgICAgIEZlYXR1cmUgbmFtZSBjaGFuZ2VzOgogICAgICAgICAgICBqYXZhY29uc3QgICAgICAgICAgICAgICAgICAgLT4gY3Njb25zdAogICAgICAgICAgICBqYXZhbWV0aG9kbW9kaWZpZXJzICAgICAgICAgLT4gY3NtZXRob2Rtb2RpZmllcnMKCiAgICAgICAgICAgIFByYWdtYSBjaGFuZ2VzOgogICAgICAgICAgICBwcmFnbWEoamF2YSkgICAgICAgICAgICAgICAgLT4gcHJhZ21hKGNzaGFycCkKICAgICAgICAgICAgam5pY2xhc3NiYXNlICAgICAgICAgICAgICAgIC0+IGltY2xhc3NiYXNlCiAgICAgICAgICAgIGpuaWNsYXNzY2xhc3Ntb2RpZmllcnMgICAgICAtPiBpbWNsYXNzY2xhc3Ntb2RpZmllcnMKICAgICAgICAgICAgam5pY2xhc3Njb2RlICAgICAgICAgICAgICAgIC0+IGltY2xhc3Njb2RlCiAgICAgICAgICAgIGpuaWNsYXNzaW1wb3J0cyAgICAgICAgICAgICAtPiBpbWNsYXNzaW1wb3J0cwogICAgICAgICAgICBqbmljbGFzc2ludGVyZmFjZXMgICAgICAgICAgLT4gaW1jbGFzc2ludGVyZmFjZXMKCiAgICAgICAgICAgIFNwZWNpYWwgdmFyaWFibGUgbmFtZSBjaGFuZ2VzOgogICAgICAgICAgICAkamF2YWNsYXNzbmFtZSAgICAgICAgICAgICAgLT4gJGNzY2xhc3NuYW1lCiAgICAgICAgICAgICRqYXZhaW5wdXQgICAgICAgICAgICAgICAgICAtPiAkY3NpbnB1dAogICAgICAgICAgICAkam5pY2FsbCAgICAgICAgICAgICAgICAgICAgLT4gJGltY2FsbAoKICAgICAgICAgICAgVGhpcyB3aWxsIGJyZWFrIFNXSUcgaW50ZXJmYWNlIGZpbGVzIHRoYXQgdXNlIHRoZXNlIHR5cGVtYXBzLCBmZWF0dXJlcwogICAgICAgICAgICBhbmQgcHJhZ21hcy4gUGxlYXNlIHVwZGF0ZSB5b3VyIGNvZGUgb3IgdXNlIG1hY3JvcyBmb3IgYmFja3dhcmRzCiAgICAgICAgICAgIGNvbXBhdGliaWxpdHkuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgQyMgTU9EVUxFICoqKgoKMDYvMTAvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtNelNjaGVtZV0gQXBwbGllZCBNelNjaGVtZSBtb2R1bGUgdXBkYXRlcyBjb250cmlidXRlZCBieQoJICAgIEpvaG4gTGVueiA8amVsZW56QHN0dWRlbnRzLndpc2MuZWR1Pi4KCiAgICAgICAgICAgIC0gVXBkYXRlZCBtenNjaGVtZSB0byB1c2UgU1dJRydzIGNvbW1vbiBydW50aW1lIHR5cGUKICAgICAgICAgICAgICBzeXN0ZW0gZnJvbSBjb21tb24uc3dnLiAKCgkgICAgLSBUaGUgTGliL216c2NoZW1lIGRpcmVjdG9yeSBoYXMgYmVlbiByZW9yZ2FuaXplZCB0bwogICAgICAgICAgICAgIHN0YW5kYXJkaXplIG5hbWVzIGFjcm9zcyB0aGUgbGFuZ3VhZ2UgbW9kdWxlczoKICAgICAgICAgICAgICBtenNjaGVtZS5pIHdhcyBtb3ZlZCB0byBtenNjaGVtZS5zd2csIG16c2NoZW1lLnN3ZyBhbmQKICAgICAgICAgICAgICBtenNjaGVtZWRlYy5zd2cgaGF2ZSBiZWVuIHJlbW92ZWQsIG16cnVuLnN3ZyAod2hpY2gKICAgICAgICAgICAgICBjb250YWlucyB0aGUgcnVudGltZSBjb2RlKSBoYXMgYmVlbiBhZGRlZC4KCiAgICAgICAgICAgIC0gVGhlIHN3aWdfcHJveHkgc3RydWN0dXJlIHdhcyByZW5hbWVkIHRvIHN3aWdfbXpfcHJveHkuCiAgICAgICAgICAgICAgc3dpZ19tel9wcm94eSBub3cgY29udGFpbnMgYSBwb2ludGVyIHRvIGEgc3dpZ190eXBlX2luZm8KICAgICAgICAgICAgICBzdHJ1Y3R1cmUuICAKCgkgICAgLSBBZGRlZCB2YXJpbiBhbmQgdmFyb3V0IHR5cGVtYXBzIGZvciBTV0lHVFlQRSBbXSBhbmQKICAgICAgICAgICAgICBTV0lHVFlQRSAmLgoKCSAgICAtIEdhcmJhZ2UgY29sbGVjdGlvbiBieSBjYWxsaW5nIHNjaGVtZV9hZGRfZmluYWxpemVyKCkgaGFzCiAgICAgICAgICAgICAgYmVlbiBhZGRlZC4KCgkgICAgKioqIE5FVyBGRUFUVVJFIFtNelNjaGVtZV0gKioqCgowNi8xMC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIE5ldyB0eXBlbWFwczogamF2YWRlc3RydWN0IGFuZCBqYXZhZGVzdHJ1Y3RfZGVyaXZlZAogICAgICAgICAgICBmb3IgdGhlIEMrKyBkZXN0cnVjdG9yIHdyYXBwZXIuIFRoZSBqYXZhZGVzdHJ1Y3QgdmVyc2lvbiBnZXRzIHVzZWQgYnkKICAgICAgICAgICAgY2xhc3NlcyBhdCB0aGUgdG9wIG9mIGFuIGluaGVyaXRhbmNlIGNoYWluIGFuZCB0aGUgamF2YWRlc3RydWN0X2Rlcml2ZWQgCiAgICAgICAgICAgIHZlcnNpb24gZ2V0cyB1c2VkIGJ5IG90aGVyIGNsYXNzZXMuCgogICAgICAgICAgICBbQyNdIGNpbGRpc3Bvc2UgYW5kIGNpbGRpc3Bvc2VvdmVycmlkZSB0eXBlbWFwcyByZXBsYWNlZCBieQogICAgICAgICAgICBjc2Rlc3RydWN0IGFuZCBjc2Rlc3RydWN0X2Rlcml2ZWQgdHlwZW1hcHMuIFRoZSBkZWxldGUoKQogICAgICAgICAgICBtZXRob2QgaGFzIGJlZW4gcmVtb3ZlZCBhbmQgaXRzIGZ1bmN0aW9uYWxpdHkgcHV0IGludG8gdGhlc2UKICAgICAgICAgICAgdHlwZW1hcHMgZGVzaWduZWQgZm9yIHRoZSBEaXNwb3NlKCkgbWV0aG9kLgoKICAgICAgICAgICAgLSBOZXcgdHlwZW1hcHMgY3NpbnRlcmZhY2VzIGFuZCBjc2ludGVyZmFjZXNfZGVyaXZlZCByZXBsYWNlCiAgICAgICAgICAgIHRoZSBqYXZhaW50ZXJmYWNlcyB0eXBlbWFwLiBBbHNvIGZpeGVzIHRoZSBwZWN1bGlhcml0eSBvZiBhbGwgY2xhc3NlcwogICAgICAgICAgICBpbiBhbiBpbmhlcml0YW5jZSBjaGFpbiBpbmRpdmlkdWFsbHkgZGVyaXZpbmcgZnJvbSB0aGUgSURpc3Bvc2FibGUgCiAgICAgICAgICAgIGludGVyZmFjZS4KCiAgICAgICAgICAgIC0gTmV3IHR5cGVtYXAgY3NmaW5hbGl6ZSBmb3IgZmluYWxpemVycy4gQysrIGRlc3RydWN0b3JzIGFyZSBub3cgY2FsbGVkCiAgICAgICAgICAgIGJ5IGdhcmJhZ2UgY29sbGVjdG9yIGR1cmluZyBmaW5hbGl6YXRpb24uIFByb2JsZW0gcmVwb3J0ZWQgYnkgCiAgICAgICAgICAgIEFuZHJlYXMgU2No9nJrLgoKMDYvMTAvMjAwMzogVGlnZXIKCSAgICBNb2RpZmllZCBjb250cmFjdCBjb2RlIGZvciBlcnJvciBtZXNzYWdlIG91dHB1dC4KICAgICAgICAgICAgQ29udHJhY3QgY29kZSBjYW4gbm93IHByaW50IG91dCBzaW1wbGUgZXJyb3IgbWVzc2FnZS4KICAgICAgICAgICAgTW9kaWZpZWQgY29udHJhY3QgY29kZSB0byBwcmVwYXJlIGZvciBpbmhlcml0YW5jZQogICAgICAgICAgICAKMDYvMDMvMjAwMzogbWtvZXBwZQoJICAgIFtHdWlsZV0gQXBwbGllZCBHdWlsZSBtb2R1bGUgdXBkYXRlcyBjb250cmlidXRlZCBieSAKCSAgICBKb2huIExlbnogPGplbGVuekBzdHVkZW50cy53aXNjLmVkdT4uIAoKCSAgICAtIFNXSUcgY3VycmVudGx5IHVzZXMgR3VpbGUncyBnaF8gQVBJLCB3aGljaCBpcyBtYXJrZWQgYXMKCSAgICAgIGRlcHJlY2F0ZWQgaW4gR3VpbGUgMS42IGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gR3VpbGUKCSAgICAgIDEuOS4gIFRoaXMgY2hhbmdlIGludHJvZHVjZXMgYSBjb21tYW5kLWxpbmUgZmxhZyAiLXNjbSIKCSAgICAgIHdoaWNoIGNhdXNlcyBTV0lHIHRvIGdlbmVyYXRlIHdyYXBwZXJzIHRoYXQgdXNlIEd1aWxlJ3MKCSAgICAgIFNDTSBBUEkgaW5zdGVhZDsgdGhpcyByZXF1aXJlcyBHdWlsZSA+PSAxLjYuCgkgICAgCgkgICAgLSBUaGUgTGliL2d1aWxlIGRpcmVjdG9yeSBoYXMgYmVlbiByZW9yZ2FuaXplZCB0bwogICAgICAgICAgICAgIHN0YW5kYXJkaXplIG5hbWVzIGFjcm9zcyBsYW5ndWFnZSBtb2R1bGVzOiBndWlsZWRlYy5zd2cKICAgICAgICAgICAgICBhbmQgZ3VpbGUuc3dnIGhhdmUgYmVlbiBtb3ZlZCBpbnRvIGd1aWxlX2doX3J1bi5zd2csCiAgICAgICAgICAgICAgZ3VpbGUuaSBoYXMgYmVlbiBtb3ZlZCB0byBndWlsZV9naC5zd2csIGd1aWxlX3NjbS5zd2cKICAgICAgICAgICAgICBhbmQgZ3VpbGVfc2NtX3J1bi5zd2cgd2hpY2ggY29udGFpbiB0aGUgU0NNIEFQSSBzdHVmZgogICAgICAgICAgICAgIGhhdmUgYmVlbiBhZGRlZAoKCSAgICAtIGdoaW50ZXJmYWNlLmksIHdoaWNoIGNvbnRhaW5zIHRoZSBkZWZpbmVzIGZyb20gdGhlIGdoXwogICAgICAgICAgICAgIGZ1bmN0aW9ucyB0byB0aGUgc2NtX2Z1bmN0aW9ucyBoYXMgYmVlbiBhZGRlZAoKCSAgICAtIFRoZSBBUEkgZm9yIGRlYWxpbmcgd2l0aCBwb2ludGVyIG9iamVjdHMgaXMgbm93CgkgICAgICBTV0lHX0NvbnZlcnRQdHIsIFNXSUdfTXVzdEdldFB0ciwgU1dJR19OZXdQb2ludGVyT2JqLgoKICAgICAgICAgICAgLSBBZGRlZCB2YXJpbiBhbmQgdmFyb3V0IHR5cGVtYXBzIGZvciBTV0lHVFlQRSBbXSBhbmQgU1dJR1RZUEUgJgoKICAgICAgICAgICAgLSBHYXJiYWdlIGNvbGxlY3Rpb24gaGFzIGJlZW4gYWRkZWQuCgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgW0d1aWxlXSAqKioKCSAgICAJCjA2LzAxLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBEaW1lbnNpb25sZXNzIGFycmF5cyBzdWNoIGFzIAoKICAgICAgICAgICAgICAgIGludCBmb29bXSA9IHsxLCAyfTsKICAgICAgICAgICAgICAgIGV4dGVybiBpbnQgYmFyW107CgogICAgICAgICAgICBwcm9kdWNlIGEgd2FybmluZyB0aGF0IHRoZSB2YXJpYWJsZSBpcyByZWFkLW9ubHkuIERlcGVuZGluZyBvbiB0aGUgdGFyZ2V0CiAgICAgICAgICAgIGxhbmd1YWdlLCB0aGlzIHVzZWQgdG8gY2F1c2UgY29tcGlsZSBlcnJvcnMgb3IgZ2VuZXJhdGUgYSBzZXR0ZXIgdGhhdAogICAgICAgICAgICBnZW5lcmF0ZWQgYSBydW50aW1lIGVycm9yLiBBIHNldHRlciBjYW5ub3QgYmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKICAgICAgICAgICAgYmVjYXVzZSB0aGUgYXJyYXkgc2l6ZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBieSBTV0lHLiBBIHZhcmluLCBnbG9iYWxpbiAKICAgICAgICAgICAgb3IgbWVtYmVyaW4gdHlwZW1hcCAoZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQgbGFuZ3VhZ2UpIG11c3QgYmUgd3JpdHRlbiAKICAgICAgICAgICAgYnkgdGhlIHVzZXIuCgowNS8yOS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFJlZmluZW1lbnQgdG8gZGVmYXVsdCB0eXBlbWFwIG1hdGNoaW5nIGFuZCBhcnJheXMuICBXaGVuIGFuCiAgICAgICAgICAgIGFycmF5IGlzIGRlY2xhcmVkIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvb1s0XTsKCiAgICAgICAgICAgIFRoZSBkZWZhdWx0IHR5cGVtYXAgbm93IHJlc29sdmVzIHRvIAoKICAgICAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSBbQU5ZXQoKICAgICAgICAgICAgSWYgbm8gbWF0Y2ggaXMgZm91bmQgZm9yIHRoYXQsIGl0IHRoZW4gcmVzb2x2ZXMgdG8KCiAgICAgICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgW10KCiAgICAgICAgICAgIElmIG5vIGFycmF5IGRpbWVuc2lvbiBpcyBzcGVjaWZpZWQgaW4gdGhlIG9yaWdpbmFsIGRlY2xhcmF0aW9uLAogICAgICAgICAgICB0aGUgU1dJR1RZUEUgW10gaXMgdXNlZCByaWdodCBhd2F5LiAKCiAgICAgICAgICAgIE5vdGU6IFRoaXMgY2hhbmdlIGhhcyBiZWVuIG1hZGUgdG8gcmVzb2x2ZSBwcm9ibGVtcyByZWxhdGVkIHRvCiAgICAgICAgICAgIGFycmF5cyB3aXRoIGFuZCB3aXRob3V0IGRpbWVuc2lvbnMuICBGb3IgZXhhbXBsZSwgc29tZXRpbWVzIFNXSUcKICAgICAgICAgICAgd2FzIGdlbmVyYXRpbmcgc2V0dGVyIGZ1bmN0aW9ucyBmb3IgYXJyYXkgdmFyaWFibGVzIHdpdGggbm8gZGltZW5zaW9ucwogICAgICAgICAgICAoYW4gZXJyb3IpLiBMaWtld2lzZSwgU1dJRyBzb21ldGltZXMgbWFkZSBhcnJheXMgd2l0aCBkaW1lbnNpb25zCiAgICAgICAgICAgIHJlYWQtb25seSAoYWxzbyBhbiBlcnJvcikuICBUaGlzIGZpeGVzIHRoZSBhcnJheXNfZ2xvYmFsIHRlc3QKICAgICAgICAgICAgcHJvYmxlbS4KICAgICAgICAgICAgICAgICAgICAgICAgCjA1LzI4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc3VidGxlIHR5cGUgaGFuZGxpbmcgYnVnIHdpdGggcmVmZXJlbmNlcyBhbmQgcG9pbnRlcnMuCiAgICAgICAgICAgIElmIHlvdSBoYWQgZnVuY3Rpb25zIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgIHR5cGVkZWYgRm9vIEJhcjsKCiAgICAgICAgICAgICAgICAgIEZvbyAqZnVuYzEoKTsKICAgICAgICAgICAgICAgICAgdm9pZCBmdW5jMihCYXIgJngpOwoKICAgICAgICAgICAgVGhlbiBmdW5jMigpIHdvdWxkbid0IGFjY2VwdCBvYmplY3RzIHJldHVybmVkIGJ5IGZ1bmMxKCkKICAgICAgICAgICAgYmVjYXVzZSBvZiBhIHR5cGUgZXJyb3IuICAgSXQgc2hvdWxkIHdvcmsgbm93LgogICAgICAgICAgICBSZXBvcnRlZCBieSBCcmlhbiBZYW5nLgoKMDUvMjEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeGVzIHRvIHNvbWUgb2YgdGhlIFZpc3VhbCBDKysgZXhhbXBsZSBwcm9qZWN0IGZpbGVzIHdoaWNoIHdvdWxkIG5vdCAKICAgICAgICAgICAgd29yayB3aXRoIHNwYWNlcyBpbiB0aGUgcGF0aHMgaGVsZCBpbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHVzZWQgdG8gCiAgICAgICAgICAgIHBvaW50IHRvIHRoZSB0YXJnZXQgbGFuZ3VhZ2UncyBsaWJyYXJ5IC8gaW5jbHVkZSBkaXJlY3RvcnkuCiAgICAgICAgICAgIFNGIGJ1ZyAjNzQwNzY5CgowNS8yMS8yMDAzOiAgc29uZ3lhbmYgKFRpZ2VyKQogICAgICAgICAgICBBZGRlZCAtY29udHJhY3RzIG9wdGlvbi4KICAgICAgICAgICAgRmlyc3QgdHJ5IG9mIHRoZSBpZGVhIG9mICJXcmFwIGJ5IENvbnRyYWN0IjogCiAgICAgICAgICAgIGJ1aWxkIHVwIHJlYWxpYWJsZSBjcm9zcy1sYW5ndWFnZSBtb2R1bGUgYnkgd3JhcHBpbmcgd2l0aCBTV0lHLgogICAgICAgICAgICBJbXBsZW1lbnRlZCBiYXNpYyBhc3NlcnRpb24KICAgICAgICAgICAgKHByZWFzc2VydGlvbiAmIHBvc3Rhc3NlcnRpb24gJiBpbnZhcmlhbnQpCiAgICAgICAgICAgIGZvciBzaW1wbGUgQy9DKysgZnVuY3Rpb25zLgogICAgICAgICAgICAKICAgICAgICAgICAgQ3VycmVudCBmb3JtYXQgb2YgY29udHJhY3RzIGFyZToKICAgICAgICAgICAgJWNvbnRyYWN0IGNsYXNzX25hbWUgOjogZnVuY19uYW1lIChwYXJhcy4uLikgewogICAgICAgICAgICByZXF1aXJlOgogICAgICAgICAgICAgICAgICAgYm9vbGVhbiBleHByczsKICAgICAgICAgICAgICAgICAgIGV4cHJzOwogICAgICAgICAgICBlbnN1cmU6CiAgICAgICAgICAgICAgICAgICBib29sZWFuIGV4cHI7CiAgICAgICAgICAgICAgICAgICBleHByczsKICAgICAgICAgICAgaW52YXJpYW50OgogICAgICAgICAgICAgICAgICAgYm9vbGVhbiBleHByOwogICAgICAgICAgICAgICAgICAgZXhwcnM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCSAgICAJCjA1LzE5LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBCdWlsZCB0d2Vha3MuIFRoZXJlIHdlcmUgYSBmZXcgcHJlcHJvY2Vzc29yIGRlZmluaXRpb25zIHdoaWNoIHdlcmUKICAgICAgICAgICAgc3BlY2lmaWVkIGluIHRoZSBNYWtlZmlsZSBmb3IgcGFzc2luZyBvbiB0aGUgY29tbWFuZGxpbmUgd2hlbiBjb21waWxpbmcuCiAgICAgICAgICAgIFRoZXNlIGFyZSBub3cgYWxsIGRlZmluZWQgaW4gc3dpZ2NvbmZpZy5oLiBBdXRvY29uZiBkb2Vzbid0IG5vcm1hbGx5IAogICAgICAgICAgICBhbGxvdyBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMgdG8gYmUgZGVmaW5lZCBpbiB0aGlzIGNvbmZpZyBoZWFkZXIgZmlsZSwgCiAgICAgICAgICAgIGJ1dCBhbiBhdXRvY29uZiBhcmNoaXZlIG1hY3JvIGVuYWJsZXMgdGhpcy4gVGhpcyBtYWNybyBhbG9uZyB3aXRoIGZ1dHVyZSAKICAgICAgICAgICAgYXV0b2NvbmYgbWFjcm9zIGFyZSBnb2luZyB0byBiZSBwdXQgaW4gdGhlIFRvb2xzL2NvbmZpZyBkaXJlY3RvcnkuCgogICAgICAgICAgICAnc3dpZyAtdmVyc2lvbicgbm93IHJlcG9ydHMgdGhlIHRhcmdldCBidWlsZCBwbGF0Zm9ybS4KCjA1LzExLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyMgYW5kIEphdmFdIEZpeCB0byB0aGUgZm9sbG93aW5nIHR5cGVtYXBzOgoKICAgICAgICAgICAgamF2YWJhc2UsIGphdmFpbnRlcmZhY2VzLCBqYXZhaW1wb3J0cywgamF2YWNsYXNzbW9kaWZpZXJzLAogICAgICAgICAgICBqYXZhcHRyY29uc3RydWN0b3Jtb2RpZmllcnMsIGphdmFmaW5hbGl6ZSwgamF2YWdldGNwdHIgJiBqYXZhY29kZS4KCiAgICAgICAgICAgIFRoZXNlIGFyZSB0aGUgdHlwZW1hcHMgZm9yIG1vZGlmeWluZy9nZW5lcmF0aW5nIHByb3h5IGNsYXNzZXMuCiAgICAgICAgICAgIFByZXZpb3VzbHkgdGhlIHR5cGVtYXBzIHdvdWxkIHVzZSB0aGUgcHJveHkgY2xhc3MgbmFtZSBhbmQgbm90IHRoZSAKICAgICAgICAgICAgQysrIHR5cGUsIHdoaWNoIHdhcyBpbmNvbnNpc3RlbnQgd2l0aCBhbGwgb3RoZXIgdHlwZW1hcHMuIAoKICAgICAgICAgICAgSW4gbW9zdCBjaXJjdW1zdGFuY2VzIHRoZSBwcm94eSBjbGFzcyBuYW1lIGFuZCB0aGUgQysrIGNsYXNzIG5hbWUvdHlwZSAKICAgICAgICAgICAgaXMgdGhlIHNhbWUgZXhjZXB0IGZvciBjbGFzc2VzIGluIG5hbWVzcGFjZSwgdGVtcGxhdGVkIGNsYXNzZXMgZXRjLiBzbwogICAgICAgICAgICB0aGlzIHNob3VsZG4ndCBhZmZlY3QgbW9zdCBjYXNlcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIGFuZCBDIyBNT0RVTEVTICoqKgoKMDUvMDkvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFZpc3VhbCBDKysgUHJvamVjdCBmaWxlcyBoYXZlIGJlZW4gYWRkZWQgc28gdGhhdCB0aGUgcnVudGltZSBsaWJyYXJpZXMKICAgICAgICAgICAgY2FuIGJlIGJ1aWx0IG9uIFdpbmRvd3MgKGZvciBUY2wsIFBlcmwsIFB5dGhvbiBhbmQgUnVieSkuCgowNS8wMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCByZXR1cm4gYnkgdmFsdWUsIGNvbnN0LCBhbmQgcHJpdmF0ZSBjb25zdHJ1Y3RvcnMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGNsYXNzIEIgewogICAgICAgICAgICAgICAgcHJpdmF0ZToKICAgICAgICAgICAgICAgICAgIEIoKTsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgIEIoY29uc3QgQiYpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBjbGFzcyBBIHsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgY29uc3QgQiByZXR1cm5CKCkgY29uc3Q7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBQcm9ibGVtIGFuZCBwYXRjaCBzdWdnZXN0aW9uIHJlcG9ydGVkIGJ5IEJpbGwgSG9mZm1hbi4KCjA0LzI5LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBCdWlsZCBjaGFuZ2VzOgogICAgICAgICAgICAtIFNpbmdsZSBhdXRvY29uZiBpbnZvY2F0aW9uIC0gYXV0b2NvbmYgaW4gdGhlIFRvb2xzIGRpcmVjdG9yeSBoYXMgZ29uZS4KCiAgICAgICAgICAgIC0gTGlidG9vbCBib290c3RyYXBwZWQgd2hlbiBydW5uaW5nIGF1dG9nZW4uc2guIFRoaXMgcmVxdWlyZXMgYW55b25lCiAgICAgICAgICAgICAgdXNpbmcgdGhlIGN2cyB2ZXJzaW9uIG9mIFNXSUcgdG8gaGF2ZSBsaWJ0b29sIGluc3RhbGxlZCBvbiB0aGVpcgogICAgICAgICAgICAgIG1hY2hpbmUuIFN1Z2dlc3QgdmVyc2lvbiAxLjQuMiBvciBoaWdoZXIsIHByZWZlcmFibHkgdGhlIGxhdGVzdCAtIDEuNS4KCiAgICAgICAgICAgIC0gQXV0b21ha2UgaXMgbm93IHVzZWQgdG8gYnVpbGQgdGhlIHJ1bnRpbWUgbGlicmFyaWVzIGluIGNvbmp1bmN0aW9uIAogICAgICAgICAgICAgIHdpdGggbGlidG9vbC4KCiAgICAgICAgICAgIC0gUnVudGltZSBsaWJyYXJpZXMgYXJlIG5vdyBzdWNjZXNzZnVsbHkgYnVpbHQgYXMgRExMcyBvbiBDeWd3aW4uCgogICAgICAgICAgICAtIFNraXBwaW5nIGxhbmd1YWdlcyBpcyBubyBsb25nZXIganVzdCBkZXRlcm1pbmVkIGluIHRoZSB0b3AgbGV2ZWwgCiAgICAgICAgICAgICAgbWFrZWZpbGUgYnV0IGluIGNvbmZpZ3VyZS5pbi4gVGhpcyBpbmZvIGlzIHVzZWQgZm9yIGJ1aWxkaW5nCiAgICAgICAgICAgICAgdGhlIHJ1bnRpbWUgbGlicmFyaWVzIGFuZCBmb3IgcnVubmluZyB0aGUgZXhhbXBsZXMgYW5kIHRlc3Qtc3VpdGUuCgogICAgICAgICAgICAtIFRoZXNlIGNoYW5nZXMgaGF2ZSBmaXhlZCBtdWx0aXBsZSBidWlsZCBkaXJlY3RvcnkgYnVpbGRzLCB0aGF0IGlzCiAgICAgICAgICAgICAgYnVpbGRpbmcgZnJvbSBkaXJlY3RvcmllcyBvdGhlciB0aGFuIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5LiAKICAgICAgICAgICAgICBJbnN0YWxsYXRpb24gZnJvbSBtdWx0aXBsZSBidWlsZCBkaXJlY3RvcmllcyBhbHNvIHdvcmtpbmcuIEFuIGluaXRpYWwKICAgICAgICAgICAgICBjb25maWd1cmUgaW4gdGhlIHRvcCBsZXZlbCBkaXJlY3RvcnkgaXMgbm8gbG9uZ2VyIG5lZWRlZCBhcyBkZXNjcmliZWQKICAgICAgICAgICAgICBpbiAwNC8wMi8yMDAzIGVudHJ5LiBBICdtYWtlIGRpc3RjbGVhbicgd2lsbCBiZSBuZWVkZWQgYmVmb3JlIGJ1aWxkaW5nCiAgICAgICAgICAgICAgaW4gYSBkaXJlY3Rvcnkgb3RoZXIgdGhhbiB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeSBpZiB0aGUgYXV0b3Rvb2xzIAogICAgICAgICAgICAgIGhhdmUgYmVlbiBydW4gZnJvbSB0aGlzIHRvcCBsZXZlbCBkaXJlY3RvcnkgYXQgc29tZSBwb2ludCwgYnV0IAogICAgICAgICAgICAgIGF1dG9jb25mIHdpbGwgdGVsbCB5b3UgdGhpcy4gTm90ZSB0aGF0ICdtYWtlIGNoZWNrJyBvbmx5IHdvcmtzIGZyb20gCiAgICAgICAgICAgICAgdGhlIHRvcCBsZXZlbCBkaXJlY3RvcnkgYXQgdGhlIG1vbWVudC4KCjA0LzI4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3MjM0NzEgXSBXcmFwcGVyX3ByaW50KCkgZmFpbHMgd2l0aCBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcy4KCjA0LzI4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgTWlub3IgcmVmaW5lbWVudCBvZiBjb25zdCBzdGF0aWMgbWVtYmVyIHZhcmlhYmxlIGhhbmRsaW5nIAogICAgICAgICAgICBkZXNjcmliZWQgaW4gQ0hBTkdFUyAwOC8xMS8yMDAyLiAgIFByZXZpb3VzbHksIFNXSUcgbWVyZWx5CiAgICAgICAgICAgIGNoZWNrZWQgdG8gc2VlIGlmIHRoZXJlIHdhcyBhbiBpbml0aWFsaXplciBpbiB0aGUgZGVjbGFyYXRpb24uCiAgICAgICAgICAgIE5vdywgU1dJRyBhZGRpdGlvbmFsbHkgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGUgc3RhdGljIG1lbWJlcgogICAgICAgICAgICBpcyBjb25zdC4KCjA0LzI1LzIwMDM6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBhIGtpbmQgb2YgbGltaXRlZCBzdXBwb3J0IGZvciBtdWx0aXBsZSBpbmhlcml0YW5jZSwKICAgICAgICAgICAgYWN0aXZhdGVkIHVzaW5nIHRoZSAtbWluaGVyaXQgY29tbWFuZC1saW5lIG9wdGlvbi4gSSd2ZSBhbHNvIHVwZGF0ZWQKICAgICAgICAgICAgdGhlICJDKysgSW5oZXJpdGFuY2UiIHNlY3Rpb24gb2YgdGhlIFJ1YnkgZG9jdW1lbnRhdGlvbiB0byBkaXNjdXNzCiAgICAgICAgICAgIGhvdyB0aGlzIHdvcmtzLCBhbmQgaXRzIGxpbWl0YXRpb25zLiBBbHNvIGFsc28gbW9kaWZpZWQgdGhlIG1pbmhlcml0LmkKICAgICAgICAgICAgdGVzdCBjYXNlIHRvIHJ1biBhZ2FpbnN0IHRoaXMuCgowNC8yNS8yMDAzOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgdGhlIC1nbG9iYWxtb2R1bGUgY29tbWFuZC1saW5lIG9wdGlvbiBmb3IgdGhlIFJ1YnkKICAgICAgICAgICAgbW9kdWxlLCBmb3Igd3JhcHBpbmcgc3R1ZmYgaW50byB0aGUgZ2xvYmFsIG1vZHVsZSAoS2VybmVsKSBpbnN0ZWFkCiAgICAgICAgICAgIG9mIGEgbmVzdGVkIG1vZHVsZS4gVXBkYXRlZCBkb2N1bWVudGF0aW9uIGFjY29yZGluZ2x5LgoKMDQvMjMvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgRml4ZWQgc3ltbmFtZSBlcnJvciBpbiBkaXJlY3RvciBjYWxscyB0byBQeXRob24gbWV0aG9kcwoJICAgIHRoYXQgZXh0ZW5kIEMrKyBvcGVyYXRvcnMuCgoJICAgIFN0b3BwZWQgZGlyZWN0b3IgZGVzdHJ1Y3RvciB3cmFwcGVycyBmcm9tIGNhbGxpbmcgX19zZXRfdXAsCgkgICAgd2hpY2ggd2FzIGxlYXZpbmcgdGhlIGRpcmVjdG9yIGZsYWcgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLgoKMDQvMjMvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggbmFtZXNwYWNlIHJlc29sdXRpb24gYW5kIG5lc3RlZCBuYW1lc3BhY2VzLgogICAgICAgICAgICBSZXBvcnRlZCBieSBBbGZyZWQgTG9yYmVyIChhbmQgTWFyY2VsbyBNYXR1cykuCgowNC8xNi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgUGF0Y2ggZm9yIEphdmEgZXhhbXBsZXMgYW5kIHRlc3Qtc3VpdGUgdG8gcnVuIG9uIE1hYyBPUyBYLgoKMDQvMTUvMjAwMzogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEluY29ycG9yYXRlZCBOb2J1IE5ha2FkYSdzIHBhdGNoZXMgZm9yIHN1cHBvcnRpbmcgdGhlIFJ1YnkKICAgICAgICAgICAgMS44IGFsbG9jYXRpb24gZnJhbWV3b3JrLgoKMDQvMTUvMjAwMzogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIFJlcGxhY2VkIGFsbCB1c2VzIG9mIHRoZSBkZXByZWNhdGVkIFNUUjJDU1RSKCkgbWFjcm8gd2l0aCB0aGUKICAgICAgICAgICAgc2FmZXIgU3RyaW5nVmFsdWVQdHIoKSBtYWNyby4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBydWJ5LXRhbGs6NjcwNTkKICAgICAgICAgICAgYW5kIGZvbGxvdy11cHMgdG8gdGhhdCBwb3N0LgoKMDQvMTEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggcHJlcHJvY2Vzc29yIG1hY3JvIGV4cGFuc2lvbi4gIEZvciBleGFtcGxlOgogCiAgICAgICAgICAgICAgICAjZGVmaW5lIG1pbih4LHkpICgoeCkgPCAoeSkpID8gKHgpIDogKHkpIAogICAgICAgICAgICAgICAgaW50IGYoaW50IG1pbik7CgogICAgICAgICAgICBSZXBvcnRlZCBieSBTZWJhc3RpZW4gUmVjaW8uCgowNC8xMC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEFkZGVkIGEgcnVudGltZSBjaGVjayB0byB0eXBlbWFwcyBpbiBhcnJheXNfamF2YS5pIGxpYnJhcnkgdG8gY2hlY2sgCiAgICAgICAgICAgIHRoYXQgdGhlIEphdmEgYXJyYXkgcGFzc2VkIGluIGlzIHRoZSBzYW1lIHNpemUgYXMgdGhlIEMgYXJyYXkgYW5kIHRocm93IGFuIAogICAgICAgICAgICBleGNlcHRpb24gaWYgbm90LgoKICAgICAgICAgICAgQWxzbyBmaXggdG8gdXNlIGRlbGV0ZSBpbnN0ZWFkIG9mIGZyZWUgZm9yIGFycmF5cyBjcmVhdGVkIHVzaW5nIG5ldy4KCjA0LzA3LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBSZW1vdmUgR0NDMyB3YXJuaW5nIHdoZW4gY29tcGlsaW5nIHRoZSBleGFtcGxlcyBhbmQgdGVzdC1zdWl0ZToKCiAgICAgICAgICAgICAgY2MxcGx1czogd2FybmluZzogY2hhbmdpbmcgc2VhcmNoIG9yZGVyIGZvciBzeXN0ZW0gZGlyZWN0b3J5ICIvdXNyL2luY2x1ZGUiCiAgICAgICAgICAgICAgY2MxcGx1czogd2FybmluZzogYXMgaXQgaGFzIGFscmVhZHkgYmVlbiBzcGVjaWZpZWQgYXMgYSBub24tc3lzdGVtIGRpcmVjdG9yeSAKCiAgICAgICAgICAgIFNlZSBTRiBwYXRjaCAjNzE1NTMxIHN1Ym1pdHRlZCBieSBHZXJhbGQgV2lsbGlhbXMKCjA0LzAzLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEltcHJvdmVkIHdyYXBwaW5nIG9mIGVudW1zIGFuZCBjb25zdGFudHMuIFRoZXNlIHdlcmUgcHJldmlvdXNseQogICAgICAgICAgICB3cmFwcGVkIGFzIEMjIHZhcmlhYmxlcyByYXRoZXIgdGhhbiBjb25zdGFudHMuIEVpdGhlciB0aGVzZSBhcmUgd3JhcHBlZAogICAgICAgICAgICBhcyByZWFkb25seSAocnVudGltZSkgY29uc3RhbnRzIG9yIGNvbXBpbGUgdGltZSBjb25zdGFudHMsIGRlcGVuZGluZyBvbgogICAgICAgICAgICB0aGUgJWphdmFjb25zdCBkaXJlY3RpdmUgKFRoZSBkaXJlY3RpdmUgaXMgbGlrZWx5IHRvIGNoYW5nZSBuYW1lIHNvb24pLgogICAgICAgICAgICBGb3IgZXhhbXBsZSB3cmFwcGluZzoKICAgICAgICAgICAgICAlamF2YWNvbnN0KDApOwogICAgICAgICAgICAgICNkZWZpbmUgQUJDIDIyCiAgICAgICAgICAgICAgJWphdmFjb25zdCgxKSBYWVo7CiAgICAgICAgICAgICAgI2RlZmluZSBYWVogMzMKICAgICAgICAgICAgaXMgbm93OgogICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaW50IEFCQyA9IGV4YW1wbGVQSU5WT0tFLmdldF9BQkMoKTsKICAgICAgICAgICAgICBwdWJsaWMgY29uc3QgaW50IFhZWiA9IDMzOwoKMDQvMDMvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBHbG9iYWwgY29uc3RhbnRzIGFuZCBlbnVtcyBhcmUgcHV0IGluIHRoZWlyIG93biBpbnRlcmZhY2UgY2FsbGVkCiAgICAgICAgICAgIHh4eENvbnN0YW50cywgd2hlcmUgeHh4IGlzIHRoZSBtb2R1bGUgbmFtZS4gVGhpcyBpcyBhbiBpbXByb3ZlbWVudCBhcyAKICAgICAgICAgICAgaXQgaXMgcG9zc2libGUgdG8gZGVyaXZlIChpbXBsZW1lbnQpIGEgSmF2YSBjbGFzcyBmcm9tIHRoZSB4eHhDb25zdGFudHMKICAgICAgICAgICAgaW50ZXJmYWNlIHRvIGltcHJvdmUgdGhlIHN5bnRheDsgbmFtZWx5IHdoZW4gd3JhcHBpbmc6CiAgICAgICAgICAgICAgZW51bSB7T05FPTEsIFRXTywgVEhSRUV9OwogICAgICAgICAgICBhY2Nlc3NpbmcgdGhlc2UgZnJvbSBhIEphdmEgY2xhc3MgaW1wbGVtZW50aW5nIHh4eENvbnN0YW50cyBpcyBuZWF0ZXI6CiAgICAgICAgICAgICAgaW50IG51bWJlciA9IE9ORTsKICAgICAgICAgICAgdGhhbiB0aGUgcHJldmlvdXM6CiAgICAgICAgICAgICAgaW50IG51bWJlciA9IHh4eC5PTkU7CgogICAgICAgICAgICBQYXRjaCBzdWJtaXR0ZWQgYnkgRGF2ZSBEcmliaW4uCgowNC8wMi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgQnVpbGQgaW1wcm92ZW1lbnRzIGZvciBtdWx0aXBsZSBidWlsZHMuIFRoaXMgYWxsb3dzIG9uZSB0byBidWlsZAogICAgICAgICAgICB0aGUgU1dJRyBleGVjdXRhYmxlIGFuZCBydW50aW1lIGxpYnJhcmllcyBmb3IgZGlmZmVyZW50IHBsYXRmb3Jtcy9jb21waWxlcnMgCiAgICAgICAgICAgIGV0YyBieSBydW5uaW5nIGNvbmZpZ3VyZSBpbiBkaWZmZXJlbnQgZGlyZWN0b3JpZXMuIFRoaXMgaXNuJ3QgMTAwJSBqdXN0IAogICAgICAgICAgICB5ZXQgYW5kIHdvbid0IGJlIHVudGlsIGxpYnRvb2wgaXMgYmV0dGVyIGNvbmZpZ3VyZWQuLi4gYSAnY29uZmlndXJlJyBhbmQgCiAgICAgICAgICAgICdtYWtlIGRpc3RjbGVhbicgbmVlZHMgdG8gYmUgcnVuIGluIHRoZSByb290IGRpcmVjdG9yeSBiZWZvcmUgaXQgYWxsIHdvcmtzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKICAgICAgICAgICAgICAkIC4vY29uZmlndXJlCiAgICAgICAgICAgICAgJCBtYWtlIGRpc3RjbGVhbgogICAgICAgICAgICAgICQgbWtkaXIgY29uZmlnMTsgY2QgY29uZmlnMTsgLi4vY29uZmlndXJlIENDPWdjYyBDWFg9ZysrOyBtYWtlOyBjZCAuLgogICAgICAgICAgICAgICQgbWtkaXIgY29uZmlnMjsgY2QgY29uZmlnMjsgLi4vY29uZmlndXJlIENDPWNjIENYWD1jKys7IG1ha2U7IGNkIC4uCiAgICAgICAgICAgIAogICAgICAgICAgICBUbyBiZSBpbXByb3ZlZC4gQSAnbWFrZSBjaGVjaycgZG9lcyBub3Qgd29yayB5ZXQgZWl0aGVyLiAKCjA0LzAxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBhcmd1bWVudCBleHBhbnNpb24gYnVnLgogICAgICAgICAgICBUaGlzIHNob3dlZCB1cCB3aGVuIHRyeWluZyB0byB1c2Ugc3RkX3ZlY3Rvci5pIHdpdGggdmVjdG9ycwogICAgICAgICAgICBvZiBwb2ludGVycy4KCjAzLzMxLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXggZm9yIHBhcmFsbGVsIG1ha2UgYnVpbGRzIG9mIFNXSUcsIGZvciBleGFtcGxlCiAgICAgICAgICAgICAgbWFrZSAtaiA0CiAgICAgICAgICAgIEJ1aWxkIGZhaWx1cmUgcmVwb3J0ZWQgYnkgQmlsbCBDbGFya2UuCgowMy8yOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFJlbGVhc2VkIDEuMy4xOS4KCgoKVmVyc2lvbiAxLjMuMTkgKE1hcmNoIDI4LCAyMDAzKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowMy8yOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFZhcmlldHkgb2YgbWlub3IgYnVnIGZpeGVzIHRvIHRoZSAxLjMuMTggcmVsZWFzZSBpbmNsdWRpbmc6CgogICAgICAgICAgICAgICAgLSBTZWdtZW50YXRpb24gZmF1bHQgd2l0aCAlZXh0ZW5kIGRpcmVjdGl2ZS4KICAgICAgICAgICAgICAgIC0gVHlwZW1hcCB2YXJpYWJsZSBzdWJzdGl0dXRpb24gYnVnLgogICAgICAgICAgICAgICAgLSBFeHByZXNzaW9uIGV2YWx1YXRpb24gYnVnLgogICAgICAgICAgICAgICAgLSBMYXJnZSBtZW1vcnkgbGVhayB3aXRoIHRlbXBsYXRlIGV4cGFuc2lvbi4KClZlcnNpb24gMS4zLjE4IChNYXJjaCAyMywgMjAwMykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDMvMjEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCB0d28gcHJvYmxlbXMgd2l0aCB0aGUgJWV4dGVuZCBkaXJlY3RpdmUsIG92ZXJsb2FkaW5nLCBhbmQKICAgICAgICAgICAgdGVtcGxhdGUgZXhwYW5zaW9uLiAgU2VlIHRoZSAndGVtcGxhdGVfZXh0ZW5kX292ZXJsb2FkJyBhbmQKICAgICAgICAgICAgJ3RlbXBsYXRlX2V4dGVuZF9vdmVybG9hZF8yJyB0ZXN0cyBpbiBFeGFtcGxlcy90ZXN0LXN1aXRlIGZvcgogICAgICAgICAgICBkZXRhaWxzLgoKMDMvMjAvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gQWRkZWQgc29tZSB0eXBlbWFwcyBhcyBzdWdnZXN0ZWQgYnkgQW5kcmVhcyBTY2hvZXJrIGZvciBoYW5kbGluZwogICAgICAgICAgICBwYXJhbWV0ZXJzIHRoYXQgYXJlIHBhc3NlZCBhcyBwb2ludGVycyBvciBieSByZWZlcmVuY2UuIFRoZXNlIGhhdmUKICAgICAgICAgICAgYmVlbiBwdXQgaW4gdHlwZW1hcHMuaS4KCjAzLzIwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBDKysgc2NvcGluZyBidWcgcmVsYXRlZCB0byBjb2RlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBpbnQgRm9vOjpiYXIoKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBQcmV2aW91c2x5LCBTV0lHIGp1c3QgdG9zc2VkIG91dCB0aGUgRm9vOjpiYXIoKSBkZWNsYXJhdGlvbi4gTm93LAogICAgICAgICAgICB0aGUgZGVjbGFyYXRpb24gaXMgd3JhcHBlZCBwcm92aWRlZCB0aGF0IHRoZSBwcmVmaXggaXMgZXhhY3RseSB0aGUKICAgICAgICAgICAgc2FtZSBhcyB0aGUgY3VycmVudCBzY29wZSAoaW5jbHVkaW5nIGFueSBlbmNsb3NpbmcgbmFtZXNwYWNlcykuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEJydWNlIExvd2VyeS4KCjAzLzIwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgSW5jb3Jwb3JhdGVkIFsgNjk2NTE2IF0gRW5hYmxpbmcgZXhjZXB0aW9uIHByb2Nlc3NpbmcgZm9yIGRhdGEgbWVtYmVyIGFjY2Vzcy4KICAgICAgICAgICAgSW4gc29tZSBjb21waWxlcnMsIGF0dHJpYnV0ZSBhY2Nlc3MgY2FuIGdlbmVyYXRlIGV4Y2VwdGlvbnMuICBIb3dldmVyLAogICAgICAgICAgICBTV0lHIG9yZGluYXJpbHkgYXNzdW1lcyB0aGF0IG5vIGV4Y2VwdGlvbnMgd2lsbCBiZSByYWlzZWQuICBUbyBkaXNhYmxlIHRoaXMsCiAgICAgICAgICAgIHVzZSB0aGUgJWZlYXR1cmUoImFsbG93ZXhjZXB0IikuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICVmZWF0dXJlKCJhbGxvd2V4Y2VwdCIpIEZvbzo6eDsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIGludCB4OyAgICAgLyogRXhjZXB0aW9uIGhhbmRsaW5nIGVuYWJsZWQgKi8KICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgWWFrb3YgTWFya292aXRjaC4gCiAKMDMvMjAvMjAwMzogYmVhemxleQogICAgICAgICAgICBJbmNvcnBvcmF0ZWQgUGF0Y2guIFsgNzAxODYwIF0gSW1wcm92ZSBQZXJmb3JtYW5jZSAocHl0aG9uIHByb3hpZXMpLgogICAgICAgICAgICBHaXZlcyBhIHBlcmZvcm1hbmNlIGJvb3N0IHRvIHByb3h5IGNsYXNzIGNvZGUgYW5kIHRoZSBtYW5hZ2VtZW50IG9mIHRoZQogICAgICAgICAgICAudGhpcyBhbmQgLnRoaXNvd24gYXR0cmlidXRlcy4gIENvbnRyaWJ1dGVkIGJ5IE1pa2UgUm9tYmVyZy4KCjAzLzE5LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyMgYW5kIEphdmFdIEFkZGVkIG1pc3NpbmcgdmFyYXJnIHN1cHBvcnQuCgowMy8xOC8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBSZW1vdmVkIGNvZGUgcmVsYXRlZCB0byB0YWdnaW5nIGluZGl2aWR1YWwgbWV0aG9kcyBmb3IgZGlyZWN0b3JzLgoJICAgIFRoZSBjb25jZXB0IG9mIGhhdmluZyBkaXJlY3RvcnMgZm9yIHNvbWUgYnV0IG5vdCBhbGwgdmlydHVhbCBtZXRob2RzCgkgICAgb2YgYSBjbGFzcyBpcyBkZWVwbHkgZmxhd2VkLiAgVGhlICVmZWF0dXJlKCJub2RpcmVjdG9yIikgdGFnIGlzIGFsc28KCSAgICBnb25lLiAgCgkgICAgCgkgICAgRGlyZWN0b3JzIGFyZSBvZmYgYnkgZGVmYXVsdC4gIFRvIGVuYWJsZSB0aGVtIGZvciBhIGNsYXNzLCBpc3N1ZQoJICAgICVmZWF0dXJlKCJkaXJlY3RvciIpIGNsYXNzbmFtZTsgd2hpY2ggd2lsbCBjcmVhdGUgZGlyZWN0b3IgbWV0aG9kcwoJICAgIGZvciBldmVyeSB2aXJ0dWFsIG1ldGhvZCBpbiB0aGUgaGllcmFyY2h5IG9mIHRoZSBjbGFzcy4KCjAzLzE3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBzdWJ0bGUgcHJvYmxlbSB3aXRoIHBhc3NpbmcgYXJndW1lbnRzIG9mIHR5cGUgZnVuY3Rpb24uICBGb3IKICAgICAgICAgICAgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGludCBmb28oaW50IHgoaW50LCBpbnQpKTsKCiAgICAgICAgICAgIG9yCgogICAgICAgICAgICAgICB0eXBlZGVmIGludCBiaW5vcF90KGludCwgaW50KTsKICAgICAgICAgICAgICAgaW50IGZvbyhiaW5vcF90IHgpOwoKICAgICAgICAgICAgSW4gb2xkIHZlcnNpb25zLCB0aGlzIHdvdWxkIHByb2R1Y2UgY29kZSB0aGF0IHdvdWxkbid0IGNvbXBpbGUuICBOb3csCiAgICAgICAgICAgIFNXSUcgbWVyZWx5IGFkZHMgYW4gZXh0cmEgcG9pbnRlciwgbWFraW5nIHRoZXNlIGRlY2xhcmF0aW9ucyB0aGUgc2FtZQogICAgICAgICAgICBhczoKCiAgICAgICAgICAgICAgIGludCBmb28oaW50ICgqeCkoaW50LCBpbnQpKTsKCiAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IGJpbm9wX3QoaW50LCBpbnQpOwogICAgICAgICAgICAgICBpbnQgZm9vKGJpbm9wX3QgKngpOwoKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgR2FydGggQnVzaGVsbC4KCjAzLzE3LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIEZpeGVkIHRoZSByZXR1cm4gc3RhdGVtZW50IGZvciBkaXJlY3RvciBiYXNlIGNsYXNzIGNhbGxzIHRoYXQgaGF2ZSBubwogICAgICAgICAgICByZXR1cm4gdmFsdWUuCgowMy8xNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgcHJvYmxlbSB3aXRoIGNvbnN0IHNtYXJ0LXBvaW50ZXIgd3JhcHBpbmcuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgaW50IHg7CiAgICAgICAgICAgICAgICAgICAgdm9pZCBiYXIoKSBjb25zdDsKICAgICAgICAgICAgICAgICAgICB2b2lkIHNwYW0oKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgY2xhc3MgQmxhaCB7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIGNvbnN0IEZvbyAqb3BlcmF0b3ItPigpOwogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBvbmx5ICJ4IiBhbmQgImJhciIgYXJlIHZpc2libGUgZnJvbSBCbGFoIChzaW5jZSBhcHBsaWNhdGlvbgogICAgICAgICAgICBvZiBzcGFtIHZpb2xhdGVzIGNvbnN0bmVzcykuICBNb3Jlb3ZlciwgYWNjZXNzIHRvICJ4IiBpcyByZWFkLW9ubHkuCiAgICAgICAgICAgCjAzLzE1LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIENsZWFuZWQgdXAgdHdvIHNpZ25lZCB2ZXJzdXMgdW5zaWduZWQgY29tcGFyaXNvbnMgaW4gcHl0aG9uL3N0ZF92ZWN0b3IuaS4KCSAgICAKMDMvMTUvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gR2xvYmFsIHZhcmlhYmxlcyBhcmUgd3JhcHBlZCB1c2luZyBwcm9wZXJ0aWVzIGluc3RlYWQgb2YgZ2V0IGFuZCBzZXQgbWV0aG9kcy4KICAgICAgICAgICAgTWVtYmVyIHZhcmlhYmxlIHdyYXBwaW5nIGJ1ZyBmaXhlcywgZm9yIGV4YW1wbGUgd3JhcHBpbmcgcG9pbnRlcnMgd29yayBub3cuCiAgICAgICAgICAgIFR5cGVtYXBzIGFyZSB1c2VkIGZvciBhbGwgdmFyaWFibGUgd3JhcHBpbmcgdG8gZ2VuZXJhdGUgdGhlIHByb3BlcnR5IGNvZGUuCgowMy8xMy8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBGaXhlZCBhIGJ1ZyBpbiB0aGUgdmlydHVhbCBtZXRob2QgdW5yb2xsaW5nIGZvciBkaXJlY3RvcnMuIAoJICAgIFRoZSBvcmRlciBvZiB1bnJvbGxpbmcgaXMgbm93IGZyb20gYmFzZSB0byBkZXJpdmVkLCB0byBlbnN1cmUKCSAgICB0aGF0IHRoZSBtb3N0IGRlcml2ZWQgaW1wbGVtZW50YXRpb24gb2YgYSBkaXJlY3RvciBtZXRob2QgaXMKCSAgICBmb3VuZC4KCgkgICAgRGlyZWN0b3IgbWV0aG9kcyBmb3IgcHVyZSB2aXJ0dWFsIG1ldGhvZHMgbm93IHRocm93CgkgICAgRElSRUNUT1JfUFVSRV9WSVJUVUFMX0VYQ0VQVElPTiBpZiBfdXAgaXMgc2V0LgoKMDMvMTIvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gUG9seW1vcnBoaXNtIGZpeDogdmlydHVhbCBmdW5jdGlvbnMgbm93IHVzZSB0aGUgYXBwcm9wcmlhdGUKICAgICAgICAgICAga2V5d29yZCBpbiB0aGUgQyMgcHJveHkgY2xhc3MsIHZpcnR1YWwgb3Igb3ZlcnJpZGUuCiAgICAgICAgICAgIFNvbWUgJ3VzaW5nIFN5c3RlbTsnIHN0YXRlbWVudCBmaXhlcyBuZWVkZWQgYnkgdGhlIE1vbm8gY29tcGlsZXIuCgowMy8xMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN1YnRsZSBidWcgaW4gdGhlIGFwcGxpY2F0aW9uIG9mIFN3aWdWYWx1ZVdyYXBwZXI8PiB0bwogICAgICAgICAgICB0ZW1wbGF0ZSBjbGFzc2VzIHdpdGggZGVmYXVsdCBjb25zdHJ1Y3RvcnMuICBSZXBvcnRlZCBieQogICAgICAgICAgICBCcnVjZSBMb3dlcnkuCgowMy8xMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFRoZSAkZGVzY3JpcHRvcih0eXBlKSB2YXJpYWJsZSBpcyBub3cgZXhwYW5kZWQgaW4gY29kZSBzdXBwbGllZCB0bwogICAgICAgICAgICAlZXh0ZW5kLiAgVGhpcyBpcyB1c2VmdWwgZm9yIGNlcnRhaW4ga2luZHMgb2YgYWR2YW5jZWQgd3JhcHBpbmcgCiAgICAgICAgICAgIChlc3BlY2lhbGx5IGNvbnRhaW5lciBjbGFzc2VzKS4KCjAzLzExLzIwMDM6IGx1aWdpCiAgICAgICAgICAgIFN1cHBvcnQgZm9yIHN0ZDo6bWFwLgogICAgICAgICAgICAoYSkgSW50ZWdyYXRpb24gd2l0aCBzY3JpcHRpbmcgbGFuZ3VhZ2UgKGEgbGEgc3RkOjp2ZWN0b3IpIGZvcgogICAgICAgICAgICAgICAgUHl0aG9uLCBSdWJ5LCBNelNjaGVtZSwgYW5kIEd1aWxlOwogICAgICAgICAgICAoYikgU2ltcGxlIHdyYXBwZXIgZm9yIG90aGVyIGxhbmd1YWdlcwoKMDMvMTAvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggZXNjYXBlIHNlcXVlbmNlcyBpbiBzdHJpbmcgYW5kIGNoYXJhY3RlciBjb25zdGFudHMuICBTV0lHCiAgICAgICAgICAgIHdhc24ndCBwYXJzaW5nIGNlcnRhaW4gb2N0YWwgY29kZXMgY29ycmVjdGx5LgoKMDMvMDcvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHZhcmlldHkgb2Ygc3VidGxlIHByZXByb2Nlc3NvciBwcm9ibGVtcyByZXBvcnRlZCBieQogICAgICAgICAgICBTZWJhc3RpZW4gUmVjaW8uCgogICAgICAgICAgICAoYSkgRW1wdHkgcHJlcHJvY2Vzc29yIHZhbHVlcyBubyBsb25nZXIgZ2VuZXJhdGUgImJhZCBjb25zdGFudAogICAgICAgICAgICB2YWx1ZSIgZXJyb3JzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAjZGVmaW5lIEZPTwogICAgICAgICAgICAgICAgICAjZGVmaW5lIEZPTyBCQVIKCiAgICAgICAgICAgIChiKSBNYWNybyBuYW1lcyBjYW4gbm93IHNwYW4gbXVsdGlwbGUgbGluZXMgKHRlY2huaWNhbGx5IHZhbGlkLAogICAgICAgICAgICBhbHRob3VnaCBxdWVzdGlvbmFibGUgcHJhY3RpY2UpLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAjZGVmaW5lIEFfTE9OR19NQUNST19cCiAgICAgICAgICAgICAgICAgIE5BTUUgNDIKCiAgICAgICAgICAgIChjKSBXaGl0ZXNwYWNlIGlzIG5vIGxvbmdlciByZXF1aXJlZCBiZWZvcmUgY2VydGFpbiBtYWNybyB2YWx1ZXMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgI2RlZmluZSBGT08iSGVsbG8iCiAgICAgICAgICAgICAgICAgICNkZWZpbmUgQkFSXAogICAgICAgICAgICAgICAgICAiSGVsbG8iCiAKMDMvMDcvMjAwMzogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIG1pc3NpbmcgbG9uZyBsb25nIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcgdHlwZW1hcHMKICAgICAgICAgICAgaW4gdGhlIExpYi9ydWJ5L3R5cGVtYXBzLmkgbGlicmFyeSBmaWxlLgoKMDMvMDcvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgQWRkZWQgRXhhbXBsZXMvcHl0aG9uL2NhbGxiYWNrIHRvIGRlbW9zdHJhdGUgaG93IGRpcmVjdG9ycyBjYW4KCSAgICBiZSB1c2VkIHRvIGltcGxlbWVudCBjYWxsYmFja3MgaW4gUHl0aG9uCgkgICAgQWRkZWQgRXhhbXBsZXMvcHl0aG9uL2V4dGVuZCB0byBkZW1vbnN0cmF0ZSB2aXJ0dWFsIG1ldGhvZAoJICAgIGNhbGxzIGZyb20gQysrIHRvIFB5dGhvbiAocmVhbGx5IHRoZSBzYW1lIGFzIHRoZSBjYWxsYmFjawoJICAgIGV4YW1wbGUsIGp1c3QgYSBkaWZmZXJlbnQgY29udGV4dCkuCgkgICAgQWRkZWQgZm91ciB0ZXN0cyBmb3IgdmVyeSBiYXNpYyBkaXJlY3RvciBmdW5jdGlvbmFsaXR5LiAgVGhlc2UKCSAgICBoYXZlIHJ1bnRpbWUgdGVzdHMgdW5kZXIgcHl0aG9uLgoJICAgIFRoZSBQeXRob24gbW9kdWxlIG5vdyBlbWl0cyAjZGVmaW5lIFNXSUdfRElSRUNUT1JTIG5lYXIgdGhlCgkgICAgdG9wIG9mIHRoZSBvdXRwdXQgZmlsZSBpZiBkaXJlY3RvcnMgYXJlIGVuYWJsZWQuICBUaGlzIGlzIHVzZWZ1bAoJICAgIGZvciBkaXNhYmxpbmcgcGFydHMgb2YgdGVzdHMgaW4gdGFyZ2V0IGxhbmd1YWdlcyB0aGF0IGRvbid0CgkgICAgc3VwcG9ydCBkaXJlY3RvcnMuCgowMy8wNi8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBBZGRlZCBhIHNlY3Rpb24gdG8gRG9jL01hbnVhbC9QeXRob24uaHRtbCBvbiBjcm9zcyBsYW5ndWFnZQoJICAgIHBvbHltb3JwaGlzbSAoZGlyZWN0b3JzKS4KCjAzLzA2LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIFRoZSBzaG9ydC1saXZlZCAiLWZkaXJlY3RvcnMiIGNvbW1hbmQgbGluZSBvcHRpb24gaGFzIGJlZW4KCSAgICByZW1vdmVkLiAgVG8gZW5hYmxlIGRpcmVjdG9ycywgaW5zdGVhZCB1c2UgdGhlIGV4dGVuZGVkICVtb2R1bGUgCgkgICAgZGlyZWN0aXZlIGFzIGZvbGxvd3M6CgoJICAgICAgICAlbW9kdWxlKGRpcmVjdG9ycz0iMSIpIG1vZHVsZW5hbWUKCjAzLzA2LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBUaGUgbG9uZyBsb25nIHR5cGVtYXBzIGhhdmUgYmVlbiByZXdyaXR0ZW4gc28gdGhhdCB0aGV5IGNhbiBiZSBtb3JlCiAgICAgICAgICAgIGVhc2lseSB1c2VkIHdpdGggbm9uIElTTyBjb21waWxlcnMsIGxpa2UgVmlzdWFsIEMrKy4gRm9yIGV4YW1wbGUKICAgICAgICAgICAgaWYgeW91IGFyZSB3cmFwcGluZyB0aGUgV2luZG93cyA2NCBiaXQgdHlwZSBfX2ludDY0IHRoZSBsb25nIGxvbmcKICAgICAgICAgICAgdHlwZW1hcHMgY2FuIGJlIHVzZWQgd2l0aCAlYXBwbHk6CgogICAgICAgICAgICAgICAgJWFwcGx5IGxvbmcgbG9uZyB7IF9faW50NjQgfTsKICAgICAgICAgICAgICAgIF9faW50NjQgdmFsdWUxKF9faW50NjQgeCk7CgogICAgICAgICAgICBfX2ludDY0IHdpbGwgbm93IGFwcGVhciBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUgaW5zdGVhZCBvZiBsb25nIGxvbmcuCiAgICAgICAgICAgIAowMy8wNi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgICoqKiBERVZFTE9QRVIgQ0hBTkdFICoqKgogICAgICAgICAgICBTd2lnIG1vZHVsZSBtdXRhdGlvbiBoYXMgYmVlbiBjaGFuZ2VkIHNsaWdodGx5LiAgV2hlbiBhIGxhbmd1YWdlCiAgICAgICAgICAgIGNsYXNzIG1ldGhvZCB3YW50cyB0byBzYXZlIG5vZGUgYXR0cmlidXRlcywgaXQgbm93IHVzZXMgb25lIG9mIHRoZQogICAgICAgICAgICBmb2xsb3dpbmcgZnVuY3Rpb25zOgoKICAgICAgICAgICAgICAgICAgU3dpZ19yZXF1aXJlKCkKICAgICAgICAgICAgICAgICAgU3dpZ19zYXZlKCkKCiAgICAgICAgICAgIFRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGVzZSBmdW5jdGlvbnMgaXMgYSBuYW1lc3BhY2UgaW4gd2hpY2gKICAgICAgICAgICAgc2F2ZWQgYXR0cmlidXRlcyBhcmUgcGxhY2VkLiAgRm9yIGV4YW1wbGUsdGhpcyBjb2RlCgogICAgICAgICAgICAgICAgICBOb2RlICpuOwogICAgICAgICAgICAgICAgICBTd2lnX3NhdmUoImNEZWNsYXJhdGlvbiIsbiwidHlwZSIsInBhcm1zIiwibmFtZSIsTklMKTsKCiAgICAgICAgICAgIHNhdmVzIHRoZSBhdHRyaWJ1dGVzIGFzICJjRGVjbGFyYXRpb246dHlwZSIsICJjRGVjbGFyYXRpb246cGFybXMiLAogICAgICAgICAgICBhbmQgc28gZm9ydGguICAgSWYgbmVjZXNzYXJ5LCBhIGxhbmd1YWdlIG1vZHVsZSBjYW4gcmVmZXIgdG8KICAgICAgICAgICAgb2xkIHZhbHVlcyBieSB1c2luZyB0aGlzIHNwZWNpYWwgbmFtZXNwYWNlIHF1YWxpZmllci4KCiAgICAgICAgICAgIEluIGFkZGl0aW9uIHRvIHRoaXMsIGEgc3BlY2lhbCBhdHRyaWJ1dGUgInZpZXciIGNvbnRhaW5zIHRoZSBuYW1lCiAgICAgICAgICAgIG9mIHRoZSBsYXN0IG5hbWVzcGFjZSB1c2VkIHRvIHNhdmUgYXR0cmlidXRlcy4gIEluIHRoZSBhYm92ZSAKICAgICAgICAgICAgZXhhbXBsZSwgInZpZXciIHdvdWxkIGhhdmUgdGhlIHZhbHVlICJjRGVjbGFyYXRpb24iLiAgIFRoZSB2YWx1ZQogICAgICAgICAgICBvZiAiY0RlY2xhcmF0aW9uOnZpZXciIHdvdWxkIGhhdmUgdGhlIHByZXZpb3VzIHZpZXcgYW5kIHNvIGZvcnRoLgoKICAgICAgICAgICAgU3dpZ19yZXN0b3JlKG4pIHJlc3RvcmVzIGEgbm9kZSB0byB0aGUgc3RhdGUgYmVmb3JlIHRoZSBsYXN0CiAgICAgICAgICAgIFN3aWdfcmVxdWlyZSgpIG9yIFN3aWdfc2F2ZSgpIGNhbGwuCgogICAgICAgICAgICBOb3RlOiAgVGhpcyBjaGFuZ2UgbWFrZXMgaXQgZWFzaWVyIGZvciBsYW5ndWFnZSBtb2R1bGVzIHRvIHJlZmVyCiAgICAgICAgICAgIHRvIG9sZCB2YWx1ZXMgb2YgYXR0cmlidXRlcy4gIAoKCjAzLzA2LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIE1lcmdlZCB0aGUgY3Jvc3MtbGFuZ3VhZ2UgcG9seW1vcnBoaXNtIHBhdGNoLiAgV2hlbiBlbmFibGVkLCBDKysgCgkgICAgInByb3h5IiBjbGFzc2VzIChjYWxsZWQgZGlyZWN0b3JzKSBhcmUgZ2VuZXJhdGVkIGZvciBlYWNoIHNwZWNpZmllZCAKCSAgICBDKysgY2xhc3MuICBEaXJlY3RvcnMgcGFzcyBtZXRob2QgY2FsbHMgZnJvbSBDKysgdG8gUHl0aG9uLCBzaW1pbGFyIAoJICAgIHRvIHRoZSB3YXkgdGhlIHVzdWFsIHByb3h5IChzaGFkb3cpIGNsYXNzZXMgcGFzcyBtZXRob2QgY2FsbHMgZnJvbSAKCSAgICBQeXRob24gdG8gQysrLiAgVG9nZXRoZXIsIHRoZXNlIHR3byB0eXBlcyBvZiBwcm94aWVzIGFsbG93IEMrKyAKCSAgICBjbGFzc2VzIHRoYXQgYXJlIGV4dGVuZGVkIGluIFB5dGhvbiB0byBiZWhhdmUganVzdCBsaWtlIG9yZGluYXJ5IAoJICAgIEMrKyBjbGFzc2VzIGFuZCBiZSB1c2VkIGluIEMrKyBsaWtlIG5hdGl2ZSBvYmplY3RzLiAgCgkgICAgCgkgICAgVGhpcyBmZWF0dXJlIGlzIHN0aWxsIHZlcnkgZXhwZXJpbWVudGFsIGFuZCBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgoJICAgIFRvIGVuYWJsZSBkaXJlY3RvciBzdXBwb3J0LCBzcGVjaWZ5ICctZmRpcmVjdG9ycycgb24gdGhlIFNXSUcgY29tbWFuZAoJICAgIGxpbmUgb3IgaW4gdGhlIFNXSUdfRkVBVFVSRVMgZW52aXJvbm1lbnQgdmFyaWFibGUuICBJbiB0aGUgaW50ZXJmYWNlCgkgICAgZmlsZSwgYWRkICVmZWF0dXJlKCJkaXJlY3RvciIpIHRvIGdlbmVyYXRlIGRpcmVjdG9ycyBmb3IgYWxsIGNsYXNzZXMKCSAgICB0aGF0IGhhdmUgdmlydHVhbCBtZXRob2RzLiAgCgkgICAgCgkgICAgU2VlIGh0dHA6Ly9zdG0ubGJsLmdvdi9+dG0yL3N3aWcvUHJveHlEb2MuaHRtbCBmb3IgbW9yZSBkZXRhaWxzLgoJICAgIAoKMDMvMDMvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHNtYWxsIGdsaXRjaCBpbiB0eXBlbWFwIGxvY2FsIHZhcmlhYmxlIHJlcGxhY2VtZW50LiAgSWYgeW91IGhhZAogICAgICAgICAgICBhIHR5cGVtYXAgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgdHlwZSAoJDFfdHlwZSB0ZW1wKSB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSAuLi47CiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBhbmQgbm8gb2NjdXJyZW5jZSBvZiAiJDFfdHlwZSIgYXBwZWFyZWQgaW4gdGhlIGJvZHksIHRoZW4gdGhlIGxvY2FsCiAgICAgICAgICAgIHZhcmlhYmxlIHR5cGUgd291bGRuJ3QgYmUgc3Vic3RpdHV0ZWQuCgowMy8wMy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBOZXcgdmVyc2lvbiBvZiB0aGUgQ1NoYXJwIG1vZHVsZSB3aGljaCBpcyB0eXBlbWFwIGJhc2VkLgogICAgICAgICAgICBJdCBhbHNvIHVzZXMgRUNNQSBDIyBhbmQgbm8gbG9uZ2VyIHVzZXMgTWljcm9zb2Z0IFZpc3VhbCBDKysuTkVUIAogICAgICAgICAgICBnbHVlLiBUaGlzIG1lYW5zIHRoYXQgaXQgd2lsbCB3b3JrIG9uIG5vbi1XaW5kb3dzIHBsYXRmb3Jtcy4KICAgICAgICAgICAgQ29udHJpYnV0ZWQgYnkgTmVpbCBDYXdzZS4KCjAyLzI3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2NTM1NDggXSBlcnJvciBwYXJzaW5nIGNhc3Rpbmcgb3BlcmF0b3IgZGVmaW5pdGlvbi4KICAgICAgICAgICAgU1dJRyBub3cgaWdub3JlcyBjYXN0aW5nIG9wZXJhdG9ycyBkZWNsYXJlZCBvdXRzaWRlIG9mIGEgY2xhc3MuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGlubGluZSBBOjpvcGVyYXRvciBjaGFyICooKSB7IC4uLiB9CgogICAgICAgICAgICBCdWcgcmVwb3J0ZWQgYnkgTWFydGluIENhc2Fkby4KCjAyLzI3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgYW5vbnltb3VzIGJpdC1maWVsZHMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgICAgICBpbnQgeCA6IDQ7CiAgICAgICAgICAgICAgICAgICAgICBpbnQgICA6IDQ7CiAgICAgICAgICAgICAgICAgICAgICBpbnQgeSA6IDg7CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEFub255bW91cyBiaXQtZmllbGRzIGFyZSBpZ25vcmVkIGJ5IFNXSUcuICAgUHJvYmxlbQogICAgICAgICAgICByZXBvcnRlZCBieSBGcmFueiBI9nBmaW5nZXIuCgowMi8yNi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEJldHRlciB0eXBlbWFwcyBpbiB0aGUgRXhhbXBsZXMvamF2YS90eXBlbWFwIGV4YW1wbGUgYW5kIGFsc28gCiAgICAgICAgICAgIGZpeGVzIHN1YnRsZSBidWcgd2hlbiB1c2luZyB0aGUgU3RyaW5nQnVmZmVyIHR5cGVtYXBzIG1vcmUgdGhhbiBvbmNlLgoKMDIvMjYvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDY0MjExMiBdIENvbnN0YW50cyBjaGFyIGJ1Zy4KCjAyLzI2LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2NzUzMzcgXSBQYXJ0aWFsIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIG5vdCBlbnRpcmVseSB3b3JraW5nLgogICAgICAgICAgICBUaGVyZSB3YXMgYSBzdWJ0bGUgcHJvYmxlbSByZWxhdGVkIHRvIHRoZSBuYW1pbmcgYW5kIG9yZGVyaW5nIG9mCiAgICAgICAgICAgIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gYXJndW1lbnRzLiAgTWF0Y2hpbmcgd29ya2VkIG9rYXksCiAgICAgICAgICAgIHRoZSByZXN1bHRpbmcgdGVtcGxhdGVzIHdlcmVuJ3QgZXhwYW5kZWQgY29ycmVjdGx5LgoKMDIvMjUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggcGFyc2luZyAoYW5kIGdlbmVyYXRpbmcgY29kZSkgZm9yIAogICAgICAgICAgICByZWZlcmVuY2VzIHRvIGFycmF5cy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGludCBmb28oaW50ICgmeClbMTBdKTsKICAKMDIvMjUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDYzNTM0NyBdIENvbXBpbGF0aW9uIHdhcm5pbmcgZnJvbSBsaWJweS5jLgogICAgICAgICAgICBSZXBvcnRlZCBieSBEYW5pZWwgTC4gUmFsbC4KIAowMi8yNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgc3VidGxlIHByb2JsZW0gd2l0aCB2aXJ0dWFsIG1ldGhvZCBpbXBsZW1lbnRhdGlvbgogICAgICAgICAgICBjaGVja2luZyBhbmQgdHlwZWRlZi4KCiAgICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgKmludHB0cjsKCiAgICAgICAgICAgICAgICAgc3RydWN0IEEgewogICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50ICpmb28oKSA9IDA7CiAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICBzdHJ1Y3QgQiA6IHB1YmxpYyBBIHsKICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludHB0ciBmb28oKSB7IH07CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFNXSUcgd2FzIHRyZWF0aW5nIHRoZXNlIGRlY2xhcmF0aW9ucyBhcyBkaWZmZXJlbnQgZXZlbiB0aG91Z2gKICAgICAgICAgICAgdGhleSBhcmUgdGhlIHNhbWUgKHZpYSB0eXBlZGVmKS4KCjAyLzI1LzIwMDM6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCByYW5nZSBjaGVja2luZyBmb3IgdGhlIE5VTTJVU0hSVCBtYWNybywgcGVyIFsgNjc1MzUzIF0uCgowMi8yNC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgc3VidGxlIHByb2JsZW0gd2l0aCB0aGUgY29kZSB0aGF0IGRldGVybWluZWQgaWYgYSBjbGFzcyBpcyBhYnN0cmFjdAogICAgICAgICAgICBhbmQgY2FuIGJlIGluc3RhbnRpYXRlZC4gICAgSWYgeW91IGhhZCBjbGFzc2VzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgIHN0cnVjdCBBIHsKICAgICAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgZm9vKGludCkgPSAwOwogICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICBzdHJ1Y3QgQiA6IHZpcnR1YWwgQSB7CiAgICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IGZvbyhpbnQpOwogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgc3RydWN0IEMgOiB2aXJ0dWFsIEEgeyAKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgIC8qIE5vdGUgb3JkZXIgb2YgYmFzZSBjbGFzc2VzICovCQogICAgICAgICAgICAgICAgICBzdHJ1Y3QgRCA6IEIsIEMgeyB9OyAgICAvKiBPayAqLwogICAgICAgICAgICAgICAgICBzdHJ1Y3QgRSA6IEMsIEIgeyB9OyAgICAvKiBCcm9rZW4gKi8KCiAgICAgICAgICAgIHRoZW4gU1dJRyBkZXRlcm1pbmVkIHRoYXQgaXQgY291bGQgaW5zdGFudGlhdGUgRCgpLCBidXQgbm90IEUoKS4KICAgICAgICAgICAgVGhpcyBpbmNvbnNpc3RlbmN5IGFyb3NlIGZyb20gdGhlIGRlcHRoLWZpcnN0IHNlYXJjaCBvZiB0aGUgCiAgICAgICAgICAgIGluaGVyaXRhbmNlIGhpZXJhcmNoeSB0byBsb2NhdGUgdGhlIGltcGxlbWVudGF0aW9ucyBvZiB2aXJ0dWFsCiAgICAgICAgICAgIG1ldGhvZHMuICAgVGhpcyBwcm9ibGVtIHNob3VsZCBub3cgYmUgZml4ZWQtLS1TV0lHIHdpbGwgYXR0ZW1wdAogICAgICAgICAgICB0byBsb2NhdGUgYW55IHZhbGlkIGltcGxlbWVudGF0aW9uIG9mIGEgdmlydHVhbCBtZXRob2QgYnkKICAgICAgICAgICAgdHJhdmVyc2luZyBvdmVyIHRoZSBlbnRpcmUgaGllcmFyY2h5LgoKMDIvMjIvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXggZm9yIHVzaW5nIGVudW0gdHlwZW1hcHMuIFRoZSBKYXZhIGZpbmFsIHN0YXRpYyB2YXJpYWJsZSB0eXBlCiAgICAgICAgICAgIGNhbiBiZSBzZXQgdXNpbmcgdGhlIGpzdHlwZSB0eXBlbWFwLCBlbmFibGluZyBlbnVtcyB0byBiZSBtYXBwZWQgdG8gCiAgICAgICAgICAgIHNvbWV0aGluZyBvdGhlciB0aGFuIGludC4gQnVnIHJlcG9ydGVkIGJ5IEhlaW5lciBQZXRpdGguCgowMi8yMS8yMDAzOiBzb25neWFuZiAoVGlnZXIpCiAgICAgICAgICAgIEFkZGVkIENTaGFycCAoQyMpIG1vZHVsZSBwcm90b3R5cGUKICAgICAgICAgICAgaS5lLiBjc2hhcnAuY3h4ICYgY3NoYXJwLmggYXQgU291cmNlL01vZHVsZXMvLgogICAgICAgICAgICBUaGV5IGFyZSBmb3IgdGVzdCB1c2FnZSBvbmx5IG5vdyBhbmQgbmVlZCBpbXByb3ZlbWVudC4KICAgICAgICAgICAgVGhlIGludGVyZmFjZSBhbHNvIG5lZWQgdG8gYmUgbW9kaWZpZWQuCgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgCjAyLzIwLzIwMDM6IHNvbmd5YW5mIChUaWdlcikKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIHR5cGVkZWYgd2l0aCAtZnZpcnR1YWwuCiAgICAgICAgICAgIFNpbWlsYXIgYXMgYmVhemxleSdzIG1vZGlmaWNhdGlvbiB0b2RheS4KCjAyLzIwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgZ2NjLXN0eWxlIHZhcmlhZGljIHByZXByb2Nlc3NvciBtYWNyb3MuICAKICAgICAgICAgICAgUGF0Y2ggWyA2MjMyNTggXSBHQ0Mtc3R5bGUgdmFyYXJnIG1hY3JvIHN1cHBvcnQuCiAgICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IEpvZSBNYXNvbi4KCjAyLzIwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2MDUxNjIgXSBUeXBlbWFwIGxvY2FsIHZhcmlhYmxlcy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgTHlsZSBKb2huc29uLgoKMDIvMjAvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggYWJzdHJhY3QgY2xhc3NlcyBhbmQgdHlwZWRlZi4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZm9vKGludCB4KSA9IDA7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICB0eXBlZGVmIGludCBJbnRlZ2VyOwogICAgICAgICAgICAgICBjbGFzcyBCYXIgOiBwdWJsaWMgRm9vIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZm9vKEludGVnZXIgeCk7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBTV0lHIHdhcyBnZXR0aW5nIGNvbmZ1c2VkIGFib3V0IHRoZSBsYXR0ZXIgbWV0aG9kLS0tbWFraW5nIEJhcgogICAgICAgICAgICBhYnN0cmFjdC4gIFJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuCgowMi8xOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdICVqYXZhY29uc3QoZmxhZykgY2FuIGFsc28gYmUgdXNlZCBvbiBlbnVtcyBhcyB3ZWxsIGFzIGNvbnN0YW50cy4KICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGVuYWJsZXMgdHJ1ZSBKYXZhIGNvbXBpbGVyIGNvbnN0YW50cyBzbyB0aGF0IHRoZXkgY2FuIGJlIAogICAgICAgICAgICB1c2VkIGluIEphdmEgc3dpdGNoIHN0YXRlbWVudHMuIFRoYW5rcyB0byBIZWluZXIgUGV0aXRoIGZvciBwYXRjaGVzLgoKMDIvMTkvMjAwMzogc29uZ3lhbmYgKFRpZ2VyKQogICAgICAgICAgICBNb2RpZmllZCAtZmNvbXBhY3QgZmVhdHVyZSB0byBkZWFsIHdpdGggUFAgbGluZXMKCjAyLzE4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2ODkwNDAgXSBNaXNzaW5nIHJldHVybiB2YWx1ZSBpbiBzdGRfdmVjdG9yLmkuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IFJvYmVydCBILiBkZSBWcmllcy4KCjAyLzE4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBmZXcgZXZpbCBzY29waW5nIHByb2JsZW1zIHdpdGggdGVtcGxhdGVzLCBuYW1lc3BhY2VzLCBhbmQgdGhlCiAgICAgICAgICAgICVleHRlbmQgZGlyZWN0aXZlLiAgUHJvYmxlbSByZXBvcnRlZCBieSBMdWlnaSBCYWxsYWJpby4KCgowMi8xOC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW1J1YnldIEltcHJvdmVkIHN1cHBvcnQgZm9yIFZpc3VhbCBDKysgYW5kIG90aGVyIG5hdGl2ZSBXaW5kb3dzIGNvbXBpbGVycy4gCiAgICAgICAgICAgIEl0IGlzIG5vIGxvbmdlciBuZWNlc3NhcnkgdG8gc3BlY2lmeSAiL0VYUE9SVDpJbml0Xzxtb2R1bGU+Iiwgd2hlcmUgPG1vZHVsZT4gaXMgdGhlCiAgICAgICAgICAgIHN3aWcgbW9kdWxlIG5hbWUgd2hlbiBsaW5raW5nIHVzaW5nIHRoZXNlIG5hdGl2ZSBXaW5kb3dzIGNvbXBpbGVycy4KCjAyLzE1LzIwMDM6IHNvbmd5YW5mIChUaWdlcikKICAgICAgICAgICAgQWRkZWQgLWZ2aXJ0dWFsIG9wdGlvbi4KICAgICAgICAgICAgUmVkdWNlIHRoZSBsaW5lcyBhbmQgc2l6ZSBvZiB0aGUgd3JhcHBlciBmaWxlCiAgICAgICAgICAgIGJ5IG9taXR0aW5nIHJlZGlmaW5lZCB2aXJ0dWFsIGZ1bmN0aW9uIGluIGNoaWxkcmVuIGNsYXNzZXMuCgogICAgICAgICAgICBNb2RpZmllZCAtY29tcGFjdCBvcHRpb24gdG8gLWZjb21wYWN0IG9wdGlvbgoKICAgICAgICAgICAgQWRkZWQgLXNtYWxsIG9wdGlvbi4KICAgICAgICAgICAgLXNtYWxsID0gLWZ2aXJ0dWFsIC1mY29tcGFjdAogICAgICAgICAgICBBbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IGZ1dHVyZSBmZWF0dXJlIG9wdGlvbnMsCiAgICAgICAgICAgIHdoaWNoIGFyZSB1c2VkIHRvIHJlZHVjZSB3cmFwcGVyIGZpbGUgc3ppZS4KCiAgICAgICAgICAgIEFkZGVkIFNXSUdfRkVBVFVSRVMgZW52aXJvbm1lbnQgdmFyaWFibGUgY2hlY2suCiAgICAgICAgICAgIFRvIGR5bmFtaWNhbGx5IHNldCB0aGUgZmVhdHVyZSBvcHRpb25zIHN1Y2ggYXMgLWZjb21wYWN0ICYgLWZ2aXJ0dWFsCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjAyLzEzLzIwMDM6IGxlbnoKICAgICAgICAgICAgVXBkYXRlZCBEb2MvTWFudWFsL1Blcmw1Lmh0bWwgdG8gdGFsayBhYm91dCBDKysgY29tcGlsZSBwcm9ibGVtcwogICAgICAgICAgICBjb25maWd1cmUuaW4gbm93IGNoZWNrcyBmb3IgUEVSTDVfQ0NGTEFHUwogICAgICAgICAgICBSdW50aW1lL01ha2VmaWxlLmluIGFuZCBFeGFtcGxlL01ha2VmaWxlLmluIG5vdyB1c2UgUEVSTDVfQ0NGTEFHUwogICAgICAgICAgICBBZGRlZCBMaWIvcGVybDUvbm9lbWJlZC5oIHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUga25vd24gbWFjcm8gY29uZmxpY3RzCgowMi8xMi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjg1NDEwIF0gQysrIEV4cGxpY2l0IHRlbXBsYXRlIGluc3RhbnRpYXRpb24gY2F1c2VzIFNXSUcgdG8gZXhpdC4KICAgICAgICAgICAgRml4ZXMgYSBzeW50YXggZXJyb3Igd2l0aCBkZWNsYXJhdGlvbnMgc2ltaWxhciB0byB0aGlzOgoKICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSBjbGFzcyBzdGQ6OnZlY3RvcjxpbnQ+OwoKICAgICAgICAgICAgU1dJRyBub3cgaWdub3JlcyB0aGUgaW5zdGFudGlhdGlvbiBhbmQgZ2VuZXJhdGVzIGEgd2FybmluZyBtZXNzYWdlLgogICAgICAgICAgICBXZSBtaWdodCBkbyBtb3JlIGxhdGVyLiAgUmVwb3J0ZWQgYnkgVGhvbWFzIFdpbGxpYW1zb24uCgowMi8xMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgUmV3cm90ZSBib29sIHR5cGVtYXBzIHRvIHJlbW92ZSBwZXJmb3JtYW5jZSB3YXJuaW5nIGZvciBjb21waWxpbmcgZ2VuZXJhdGVkIGNvZGUKICAgICAgICAgICAgdW5kZXIgVmlzdWFsIEMrKy4KCjAyLzExLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXggZm9yIHdyYXBwaW5nIHJlZmVyZW5jZSB2YXJpYWJsZXMgKGNvbnN0IG5vbi1wcmltaXRpdmUgYW5kIGFsbCBub24tY29uc3QgdHlwZXMpIAogICAgICAgICAgICBmb3IgZXhhbXBsZToKICAgICAgICAgICAgICBpbnQmIGk7CiAgICAgICAgICAgICAgQ2xhc3MmIGM7CiAgICAgICAgICAgICAgY29uc3QgQ2xhc3MmIGM7CgowMi8xMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIG1vcmUgdmVyeSBzdWJ0bGUgcHJlcHJvY2Vzc29yIGNvcm5lciBjYXNlcyByZWxhdGVkIHRvIHJlY3Vyc2l2ZQogICAgICAgICAgICBtYWNybyBleHBhbnNpb24uICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICAjZGVmaW5lIGNhdCh4LHkpIHggIyMgeQoKICAgICAgICAgICAgICAgICAgIGNhdChjYXQoMSwyKSwzKSAgICAvLyBQcm9kdWNlczogY2F0KDEsMikzCiAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICNkZWZpbmUgeGNhdCh4LHkpIGNhdCh4LHkpCgogICAgICAgICAgICAgICAgICAgeGNhdCh4Y2F0KDEsMiksMykgIC8vIFByb2R1Y2VzIDEyMwoKICAgICAgICAgICAgU2VlIEsmUiwgMm5kIEVkLiBwLiAyMzEuCgowMi8xMC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4ZWQgWyA2ODM4ODIgXSAtIHBhdGNoIHN1Ym1pdHRlZCBieSBGLiBQb3N0bWEgZm9yIFNXSUcgdG8gY29tcGlsZSBvbiBIUC1VWC4KCjAyLzEwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc3VidGxlIHByZXByb2Nlc3NvciBhcmd1bWVudCBleHBhbnNpb24gYnVnLiBSZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDIvMTAvMjAwMzogc29uZ3lhbmYKICAgICAgICAgICAgQWRkZWQgLWNvbXBhY3Qgb3B0aW9uLgogICAgICAgICAgICBSZWR1Y2UgdGhlIGxpbmVzIGFuZCBzaXplIG9mIHRoZSB3cmFwcGVyIGZpbGUKICAgICAgICAgICAgYnkgb21pdHRpbmcgY29tbWVudHMgYW5kIGNvbWJpbmluZyBzaG9ydCBsaW5lcy4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogCjAyLzA3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2NTEzNTUgXSBTeW50YXggZXJyb3Igd2l0aCBjc3RyaW5nLmkKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgT21yaSBCYXJlbC4KCjAyLzA3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2NjM2MzIgXSBpbmNvbXBhdGliaWxpdHkgd2l0aCBzdGFuZGFyZCBjcHAuCiAgICAgICAgICAgIFRoaXMgaXMgYSByZWZpbmVtZW50IHRoYXQgZml4ZXMgdGhpcyBwcm9ibGVtOgoKICAgICAgICAgICAgICAgICAvLyBTb21lIG1hY3JvIHdpdGggYW4gYXJndW1lbnQKICAgICAgICAgICAgICAgICAjZGVmaW5lIEZPTyh4KSAgICAgICB4CgogICAgICAgICAgICAgICAgIGludCBGT087ICAgICAgICAvKiBOb3QgYSBtYWNyby0tLW5vIGFyZ3VtZW50cyAqLwogCjAyLzA1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2NzU0OTEgXSBwYXJzZSBlcnJvciB3aXRoIGdsb2JhbCBuYW1lc3BhY2UgcXVhbGlmaWNhdGlvbi4KICAgICAgICAgICAgU3VibWl0dGVkIGJ5IEplcmVteSBZYWxsb3AuCgowMi8wNC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGJ1ZyBpbiB2YXJhcmdzIHByb2Nlc3NpbmcgaW50cm9kdWNlZCBieSB0aGUgbnVtaW5wdXRzIHR5cGVtYXAgcGFyYW1ldGVyLgoKMDEvMDgvMjAwMzogdHRuCgkgICAgW3htbF0gRml4IHN0cmluZy1yZXBsYWNlbWVudCBvcmRlcmluZyBidWdsZXQuCgkgICAgVGhhbmtzIHRvIEdhcnkgSGVycm9uLgoKMTIvMjMvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZ1cnRoZXIgYnVpbGQgY2hhbmdlczoKICAgICAgICAgICAgLSBUaGUgU1dJRyBleGVjdXRhYmxlIGlzIG5vdyBidWlsdCB1c2luZyBhIHNpbmdsZSBNYWtlZmlsZS4KICAgICAgICAgICAgLSBUaGlzIG1ha2VmaWxlIGlzIGdlbmVyYXRlZCBieSBBdXRvbWFrZSAoU291cmNlL01ha2VmaWxlLmFtKS4KICAgICAgICAgICAgLSBEZXBlbmRlbmN5IHRyYWNraW5nIGFuZCB0YWdzIHN1cHBvcnQgYXJlIGluIHRoaXMgbWFrZWZpbGUuCiAgICAgICAgICAgIC0gQXV0b21ha2UgMS43LjIgYW5kIEF1dG9jb25mIDIuNTQgbWluaW11bSB2ZXJzaW9ucyBhcmUgbmVlZGVkIHRvIGJ1aWxkIFNXSUcgZnJvbSBDVlMuCiAgICAgICAgICAgIC0gUnVubmluZyAuL2F1dG9nZW4uc2ggbm93IGluc3RhbGxzIEF1dG9jb25mL0F1dG9tYWtlIHN1cHBvcnQgZmlsZXMgaW50bwogICAgICAgICAgICAgIFRvb2xzL2NvbmZpZyBhbmQgdGhlc2UgZmlsZXMgYXJlIG5vIGxvbmdlciBzdG9yZWQgaW4gQ1ZTLgogICAgICAgICAgICAtIEJ1ZyBmaXhlcyBpbiAnbWFrZSBpbnN0YWxsJyBmb3Igc3lzdGVtcyB1c2luZyAuZXhlIGV4ZWN1dGFibGUgZXh0ZW5zaW9uIGFuZAogICAgICAgICAgICAgIC4vY29uZmlndXJlIC0td2l0aC1yZWxlYXNlLXN1ZmZpeD13aGF0ZXZlcgoKMTIvMTYvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIE1vcmUgYnVpbGQgY2hhbmdlczoKICAgICAgICAgICAgLSBBdXRvY29uZidzIEFDX0NBTk9OSUNBTF9IT1NUIHJlcGxhY2VzIHByb3ByaWV0YXJ5IGFwcHJvYWNoIGZvciBkZXRlY3RpbmcgYnVpbGQgaG9zdC4KICAgICAgICAgICAgLSBBdXRvY29uZiBzdXBwb3J0IGZpbGVzIG1vdmVkIHRvIFRvb2xzL2NvbmZpZy4KCjEyLzE2LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBNb2RpZmljYXRpb25zIHRvIHJ1biBvbiBNYWNPUywgc3VibWl0dGVkIGJ5IEJlcm5hcmQgRGVzZ3JhdXBlcy4KICAgICAgICAgICAgTWFpbmx5IGVuc3VyaW5nIGdlbmVyYXRlZCBmaWxlcyBhcmUgb3V0cHV0IGluIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3RvcnkgZm9yCiAgICAgICAgICAgIHNvbWUgbW9kdWxlcy4KCjEyLzExLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBWYXJpb3VzIGJ1aWxkIG1vZGlmaWNhdGlvbnMgYW5kIGJ1ZyBmaXhlczoKICAgICAgICAgICAgLSBTaW1wbGlmaWNhdGlvbiBvZiB2ZXJzaW9uIHN0cmluZy4gVXNlIGF1dG9jb25mJ3MgUEFDS0FHRV9WRVJTSU9OIGluc3RlYWQuCiAgICAgICAgICAgIC0gQnVpbGQgdGltZSByZW1vdmVkIGZyb20gU1dJRyB2ZXJzaW9uLgogICAgICAgICAgICAtIFVzaW5nIHN0YW5kYXJkIGF1dG9jb25mIGNvbmZpZyBoZWFkZXIgZ2VuZXJhdGlvbi4KICAgICAgICAgICAgLSBVcGRhdGVkIG9sZCBhdXRvY29uZiBtYWNyb3MgYXMgcmVwb3J0ZWQgYnkgYXV0b3VwZGF0ZS4KICAgICAgICAgICAgLSBSZW1vdmVkICRwcmVmaXggaW4gYXV0b2NvbmYgZnJvbSBzZWFyY2ggcGF0aHMgYXMgYXV0b2NvbmYgd29uJ3QgZXhwYW5kIHRoZW0uCiAgICAgICAgICAgIC0gU3VidGxlIGJ1ZyBmaXggd2hlcmUgJ21ha2UgcHJlZml4PS9zb21ld2hlcmU7IG1ha2UgY2xlYW47IG1ha2UgcHJlZml4PS9zb213aGVyZS9lbHNlJwogICAgICAgICAgICAgIHByb2R1Y2VkIGFuIGV4ZWN1dGFibGUgdXNpbmcgdGhlIGluY29ycmVjdCBsaWJyYXJ5IGRpcmVjdG9yaWVzLgogICAgICAgICAgICAtIEFkZGVkIC1sZGZsYWdzIGNvbW1hbmRsaW5lIG9wdGlvbiBmb3IgTXpTY2hlbWUsIE9jYW1sLCBQaWtlIGFuZCBQSFAuCiAgICAgICAgICAgIC0gRml4ZWQgcmVwb3J0aW5nIG9mIGNvbXBpbGVyIHVzZWQgd2hlbiB1c2luZyAtdmVyc2lvbiBjb21tYW5kbGluZSBvcHRpb24uCiAgICAgICAgICAgIC0gU1dJRyB3ZWIgYWRkcmVzcyBhZGRlZCB0byAtdmVyc2lvbiBjb21tYW5kbGluZSBvcHRpb24uCgoxMi8xMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1pbm9yIGZpeCB0byBUY2wgZHluYW1pYyBjYXN0IHR5cGVtYXBzLiBSZXBvcnRlZCBieQogICAgICAgICAgICBLcmlzdG9waGVyIEJsb20uCgoxMi8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN1YnRsZSB0ZW1wbGF0ZSBhcmd1bWVudCByZXBsYWNlIGJ1Zy4gIFJlcG9ydGVkIGJ5CiAgICAgICAgICAgIENocmlzIEZsYXRsZXkuCgoxMi8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFJldmVydGVkIENIQU5HRVMgMDkvMDMvMjAwMiwgcHJlcHJvY2Vzc29yIGFyZ3VtZW50IGV2YWx1YXRpb24uICBBcmd1bWVudHMKICAgICAgICAgICAgYXJlIG5vdCBldmFsdWF0ZWQgZHVyaW5nIGNvbGxlY3Rpb24sIEsmUiwgcC4gMjMwLgoKMTIvMDYvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDY0OTAyMiBdIENvbXBpbGF0aW9uIHByb2JsZW1zIHdpdGggS0FJL0tDQwoKMTIvMDIvMjAwMjogYmVhemxleQogICAgICAgICAgICBTV0lHICdyZWwtMS0zJyBDVlMgYnJhbmNoIG1lcmdlZCBiYWNrIGludG8gdGhlIG1haW4gYnJhbmNoLgoKClZlcnNpb24gMS4zLjE3IChOb3ZlbWJlciAyMiwgMjAwMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTEvMTkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDYxMzkyMiBdIHByZXByb2Nlc3NvciBlcnJvcnMgd2l0aCBIQVZFX0xPTkdfTE9ORy4KICAgICAgICAgICAgCjExLzE5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2MTU0ODAgXSBtenNjaGVtZSBTV0lHX011c3RHZXRQdHJfLgoKMTEvMTkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDYzNTExOSBdIFNXSUdfY3JvYWsgY2F1c2VzIGNvbXBpbGVyIHdhcm5pbmcuCgoxMS8xNi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEFkZGVkIHR5cGVtYXBzIGZvciBwb2ludGVycyB0byBjbGFzcyBtZW1iZXJzLgoKMTEvMTUvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBCdWcgZml4OiBPdmVybG9hZGVkIEMrKyBmdW5jdGlvbnMgd2hpY2ggY2Fubm90IGJlIG92ZXJsb2FkZWQgaW4gSmF2YSAKICAgICAgICAgICAgb25jZSBhZ2FpbiBpc3N1ZSBhIHdhcm5pbmcuCgoxMS8xNC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEhhbmRsaW5nIG9mIE5VTEwgcG9pbnRlcnMgaXMgaW1wcm92ZWQuIEEgamF2YSBudWxsIG9iamVjdCB3aWxsIG5vdwogICAgICAgICAgICBiZSB0cmFuc2xhdGVkIHRvIGFuZCBmcm9tIGEgTlVMTCBDL0MrKyBwb2ludGVyIGJ5IGRlZmF1bHQuIFByZXZpb3VzbHkgd2hlbiAKICAgICAgICAgICAgd3JhcHBpbmc6CgogICAgICAgICAgICAgICAgY2xhc3MgU29tZUNsYXNzIHsuLi59OwogICAgICAgICAgICAgICAgdm9pZCBmb28oU29tZUNsYXNzICpzKTsKCiAgICAgICAgICAgIGFuZCBpdCB3YXMgY2FsbGVkIGZyb20gSmF2YSB3aXRoIG51bGw6CgogICAgICAgICAgICAgICAgbW9kdWxlbmFtZS5mb28obnVsbCkKCiAgICAgICAgICAgIGEgSmF2YSBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3YXMgdGhyb3duLiBFeHRyYSB0eXBlbWFwcyBoYWQgdG8gYmUgd3JpdHRlbiBpbgogICAgICAgICAgICBvcmRlciB0byBvYnRhaW4gYSBOVUxMIHBvaW50ZXIgdG8gcGFzcyB0byBmdW5jdGlvbnMgbGlrZSB0aGlzIG9uZS4gTm93IHRoZSAKICAgICAgICAgICAgZGVmYXVsdCB3cmFwcGluZyB3aWxsIGRldGVjdCAnbnVsbCcgYW5kIHRyYW5zbGF0ZSBpdCBpbnRvIGEgTlVMTCBwb2ludGVyLgogICAgICAgICAgICBBbHNvIGlmIGEgZnVuY3Rpb24gcmV0dXJucyBhIE5VTEwgcG9pbnRlciwgZWc6CiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgU29tZUNsYXNzICpiYXIoKSB7IHJldHVybiBOVUxMOyB9CiAgICAgICAgICAgIAogICAgICAgICAgICBUaGVuIHRoaXMgdXNlZCB0byBiZSB3cmFwcGVkIHdpdGggYSBTb21lQ2xhc3MgcHJveHkgY2xhc3MgaG9sZGluZyBhIE5VTEwKICAgICAgICAgICAgcG9pbnRlci4gTm93IG51bGwgaXMgcmV0dXJuZWQgaW5zdGVhZC4gVGhlc2UgY2hhbmdlcyBhcmUgc3VidGxlIGJ1dCB1c2VmdWwuCiAgICAgICAgICAgIFRoZSBvcmlnaW5hbCBiZWhhdmlvdXIgY2FuIGJlIG9idGFpbmVkIGJ5IHVzaW5nIHRoZSBvcmlnaW5hbCB0eXBlbWFwczoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhb3V0KSBTV0lHVFlQRSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyAkJmphdmFjbGFzc25hbWUoJGpuaWNhbGwsIHRydWUpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhb3V0KSBTV0lHVFlQRSAqLCBTV0lHVFlQRSAmLCBTV0lHVFlQRSBbXSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyAkamF2YWNsYXNzbmFtZSgkam5pY2FsbCwgJG93bmVyKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWdldGNwdHIpIFNXSUdUWVBFLCBTV0lHVFlQRSAqLCBTV0lHVFlQRSAmLCBTV0lHVFlQRSBbXSAlewogICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgc3RhdGljIGxvbmcgZ2V0Q1B0cigkamF2YWNsYXNzbmFtZSBvYmopIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqLnN3aWdDUHRyOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKCjExLzEyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIGFic3RyYWN0IG1ldGhvZHMgYW5kIHNpZ25hdHVyZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgIGNsYXNzIGFic3RyYWN0X2ZvbyB7IAogICAgICAgICAgICBwdWJsaWM6IAogICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgICBtZXRoKGludCBtZXRoX3BhcmFtKSA9IDA7IAogICAgICAgICAgICB9OyAKIAogCiAgICAgICAgICAgIGNsYXNzIGFic3RyYWN0X2JhciA6IHB1YmxpYyBhYnN0cmFjdF9mb28geyAKICAgICAgICAgICAgcHVibGljOiAKICAgICAgICAgICAgICAgIGludCBtZXRoKGludCBtZXRoX3BhcmFtXzEsIGludCBtZXRoX3BhcmFtXzIpIHsgcmV0dXJuIDA7IH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgYWJzdHJhY3RfYmFyIGlzIHN0aWxsIGFic3RyYWN0LgoKICAgICAgICAgICAgRml4ZXMgWyA2Mjg0MzggXSBEZXJpdmVkIGFic3RyYWN0IGNsYXNzIG5vdCBhYnN0cmFjdC4KICAgICAgICAgICAgUmVwb3J0ZWQgYW5kIHBhdGNoZWQgYnkgU2NvdHQgTWljaGVsLgoKMTEvMTEvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIG1hdGNoaW5nIHByb2JsZW0gd2l0aCB0eXBlbWFwcyBhbmQgYXJyYXkgZGltZW5zaW9ucy4gIEZvciBleGFtcGxlLCBpZiB5b3UKICAgICAgICAgICAgaGFkIHRoaXM6CgogICAgICAgICAgICAgICB0eXBlZGVmIGNoYXIgYmxhaFsyMF07CgogICAgICAgICAgICBhbmQgYSB0eXBlbWFwOgoKICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBjaGFyIFtBTlldIHsKICAgICAgICAgICAgICAgICAgIC4uLiAkMV9kaW0wIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgICB0aGVuICQxX2RpbSogdmFyaWFibGVzIHdlcmVuJ3QgYmUgZXhwYW5kZWQgcHJvcGVybHkuICBJdCBzaG91bGQgd29yayBub3cuCiAgICAgICAgICAgIFByb2JsZW0gcmVwb3J0ZWQgYnkgUGFua2FqIEt1bWFyIEdvZWwuCiAgICAgICAgICAgICAgIAoxMS8wNy8yMDAyOiBta29lcHBlCgkgICAgQWRkZWQgYW4gZXhwZXJpbWVudGFsIG5ldyBtb2R1bGUgdGhhdCBkdW1wcyBTV0lHJ3MgcGFyc2UKCSAgICB0cmVlIGFzIChDb21tb24pIExpc3Agcy1leHByZXNzaW9ucy4gIFRoZSBtb2R1bGUgaXMKCSAgICBpbnZva2VkIHdpdGggU1dJRydzIC1zZXhwIGNvbW1hbmQtbGluZSBzd2l0Y2guICBUaGUgb3V0cHV0CgkgICAgY2FuIGJlIHJlYWQgaW50byBDb21tb24gTGlzcC4gIFRoZXJlIGlzIChwcm90b3R5cGUpCgkgICAgZXhhbXBsZSBMaXNwIGNvZGUgdGhhdCBnZW5lcmF0ZXMgRm9yZWlnbiBGdW5jdGlvbiBJbnRlcmZhY2UKCSAgICBkZWZpbml0aW9ucyBmb3IgdXNlIHdpdGggS2V2aW4gUm9zZW5iZXJnJ3MgVUZGSS4KCgkgICAgKioqIEVYUEVSSU1FTlRBTCBORVcgRkVBVFVSRSAqKioKCjExLzA3LzIwMDI6IG1rb2VwcGUKCSAgICBSZW1vdmVkIGR1cGxpY2F0ZSBkZWNsYXJhdGlvbiBvZiAiY3BwX3RlbXBsYXRlX2RlY2wiIGluCgkgICAgcGFyc2VyLnk7IGJpc29uIDEuNzUgY29tcGxhaW5lZC4KCjExLzA2LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRGVmYXVsdCBwcmltaXRpdmUgYXJyYXkgaGFuZGxpbmcgaGFzIGNoYW5nZWQgbGlrZSBhcnJheXMgb2YgY2xhc3Nlcy4gCiAgICAgICAgICAgIEMgcHJpbWl0aXZlIGFycmF5cyBhcmUgbm8gbG9uZ2VyIHdyYXBwZWQgYnkgYSBKYXZhIGFycmF5IGJ1dCB3aXRoIGEgcG9pbnRlciAKICAgICAgICAgICAgKHR5cGUgd3JhcHBlciBjbGFzcykuIEFnYWluIHRoZSBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIGZvciBlZmZpY2llbmN5IHJlYXNvbnMuIAogICAgICAgICAgICBUaGUgb3JpZ2luYWwgdHlwZW1hcHMgaGF2ZSBiZWVuIG1vdmVkIGludG8gYXJyYXlzX2phdmEuaSwgc28gdGhlIG9yaWdpbmFsIAogICAgICAgICAgICBiZWhhdmlvdXIgY2FuIGJlIG9idGFpbmVkIG1lcmVseSBpbmNsdWRpbmcgdGhpcyBmaWxlOgoKICAgICAgICAgICAgICAgICVpbmNsdWRlICJhcnJheXNfamF2YS5pIgoKICAgICAgICAgICAgVGhlIGFycmF5IHN1cHBvcnQgZnVuY3Rpb25zIGFyZSBubyBsb25nZXIgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQuIFRoZXkgYXJlIG9ubHkKICAgICAgICAgICAgZ2VuZXJhdGVkIHdoZW4gaW5jbHVkaW5nIHRoaXMgZmlsZSwgdGh1cyB0aGlzIG9mdGVuIHVudXNlZCBjb2RlIGlzIG9ubHkKICAgICAgICAgICAgZ2VuZXJhdGVkIHdoZW4gc3BlY2lmaWNhbGx5IHJlcXVpcmluZyB0aGlzIHR5cGUgb2YgYXJyYXkgc3VwcG9ydC4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjExLzA1LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBzdXBwb3J0IGZvciBuZXN0ZWQgbW9kdWxlIGRlY2xhcmF0aW9ucyAoYXMgd2FzCiAgICAgICAgICAgIHByZXZpb3VzbHkgYWRkZWQgZm9yIHRoZSBQZXJsIG1vZHVsZSkuIFNvIGEgJW1vZHVsZSBkaXJlY3RpdmUKICAgICAgICAgICAgb2YgdGhlIGZvcm06CgogICAgICAgICAgICAgICAgJW1vZHVsZSAiT3V0ZXI6OklubmVyOjpGb28iCgogICAgICAgICAgICB3aWxsIG5lc3QgZXZlcnl0aGluZyBhcyAoaW4gUnVieSBjb2RlKToKCiAgICAgICAgICAgICAgICBtb2R1bGUgT3V0ZXIKICAgICAgICAgICAgICAgICAgbW9kdWxlIElubmVyCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlIEZvbwogICAgICAgICAgICAgICAgICAgICAgIyBzdHVmZiBnb2VzIGhlcmUKICAgICAgICAgICAgICAgICAgICBlbmQKICAgICAgICAgICAgICAgICAgZW5kCiAgICAgICAgICAgICAgICBlbmQKIAoxMS8wNS8yMDAyOiBta29lcHBlIAoJICAgIFtNelNjaGVtZV0gQWRkIGFuIGFyZ3VtZW50ICgtZGVjbGFyZW1vZHVsZSkgdGhhdCBnZW5lcmF0ZXMKCSAgICBjb2RlIHRvIGNvcnJlY3RseSBkZWNsYXJlIGEgcHJpbWl0aXZlIG1vZHVsZSBleHRlbnNpb24uCgkgICAgUGF0Y2ggc3VibWl0dGVkIGJ5IEJydWNlIEJ1dHRlcmZpZWxkLgoKMTEvMDIvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBBZGRlZCBwYXRjaCBzdWJtaXR0ZWQgYnkgTWljaGFlbCBDYWhpbGwgdG8gcmVtb3ZlIHVudXNlZCBwYXJhbWV0ZXIKICAgICAgICAgICAgd2FybmluZ3MgZm9yIHRoZSBqZW52IGFuZCBjbHMgcGFyYW1ldGVycy4gVGhpcyBwYXRjaCBhbHNvIGFsc28gYWxsb3dzIG9uZQogICAgICAgICAgICB0byB1c2UgInZvaWQiIGluIHRoZSBqbmkgdHlwZW1hcCBmb3IgYW55IHR5cGUgd2l0aG91dCBjb2RlIGJlaW5nIGdlbmVyYXRlZAogICAgICAgICAgICBhdHRlbXB0aW5nIHRvIHJldHVybiBhIHZhbHVlLgoKMTAvMjkvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBBcnJheSBoYW5kbGluZyBpcyBkaWZmZXJlbnQuIEFycmF5cyBvZiBjbGFzc2VzIGFyZSBubyBsb25nZXIgd3JhcHBlZAogICAgICAgICAgICB3aXRoIHByb3h5IGFycmF5cywgZWcgd3JhcHBpbmcKCiAgICAgICAgICAgICAgICBjbGFzcyBYIHsuLi59OwogICAgICAgICAgICAgICAgWCBmb29bMTBdOwogICAgICAgICAgICAKICAgICAgICAgICAgdXNlZCB0byBiZSB3cmFwcGVkIHdpdGggdGhlc2UgSmF2YSBnZXR0ZXJzIGFuZCBzZXR0ZXJzOgoKICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGb28oWFtdIHZhbHVlKSB7Li4ufQogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBYW10gZ2V0Rm9vKCkgey4uLn0KCiAgICAgICAgICAgIFRoaXMgYXBwcm9hY2ggaXMgdmVyeSBpbmVmZmljaWVudCBhcyB0aGUgZW50aXJlIGFycmF5IGlzIGNvcGllZCBudW1lcm91cwogICAgICAgICAgICB0aW1lcyBvbiBlYWNoIGludm9jYXRpb24gb2YgdGhlIGdldHRlciBvciBzZXR0ZXIuIFRoZXNlIGFycmF5cyBhcmUgbm93CiAgICAgICAgICAgIHdyYXBwZWQgd2l0aCBhIHBvaW50ZXIgc28gaXQgaXMgb25seSBwb3NzaWJsZSB0byBhY2Nlc3MgdGhlIGZpcnN0IGFycmF5IGVsZW1lbnQgCiAgICAgICAgICAgIHVzaW5nIGEgcHJveHkgY2xhc3M6CgogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEZvbyhYIHZhbHVlKSB7Li4ufQogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBYIGdldEZvbygpIHsuLi59CgogICAgICAgICAgICBBcnJheXMgb2YgZW51bXMgaGF2ZSBhbHNvIGJlZW4gc2ltaWxhcmx5IGNoYW5nZWQuIFRoaXMgYmVoYXZpb3VyIGlzIG5vdyBsaWtlIHRoZSAKICAgICAgICAgICAgb3RoZXIgU1dJRyBsYW5ndWFnZSdzIGltcGxlbWVudGF0aW9uIGFuZCB0aGUgYXJyYXkgbGlicmFyeSBzaG91bGQgYmUgdXNlZCB0byAKICAgICAgICAgICAgYWNjZXNzIHRoZSBvdGhlciBlbGVtZW50cy4gVGhlIG9yaWdpbmFsIGJlaGF2aW91ciBjYW4gYmUgYWNoaWV2ZWQgdXNpbmcgdGhlIAogICAgICAgICAgICBtYWNyb3MgYW5kIHR5cGVtYXBzIGluIGFycmF5c19qYXZhLmksIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVpbmNsdWRlICJhcnJheXNfamF2YS5pIgogICAgICAgICAgICAgICAgSkFWQV9BUlJBWVNPRkNMQVNTRVMoWCkKICAgICAgICAgICAgICAgIGNsYXNzIFggey4uLn07CiAgICAgICAgICAgICAgICBYIGZvb1sxMF07CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgoxMC8yOS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFR3byBuZXcgdHlwZW1hcHMgamF2YWluIGFuZCBqYXZhb3V0IGZvciBnZW5lcmF0aW5nIHRoZSBwcm94eSBjbGFzcyAKICAgICAgICAgICAgYW5kIHR5cGUgd3JhcHBlciBjbGFzcyBtZXRob2QgY2FsbHMgdG8gdGhlIEpOSSBjbGFzcy4gVGhlIG5ldyB0eXBlbWFwcyBhcmUgCiAgICAgICAgICAgIHJlYWxseSB1c2VkIGZvciB0cmFuc2Zvcm1pbmcgdGhlIGpzdHlwZSAodXNlZCBpbiBwcm94eSBjbGFzcyBhbmQgdHlwZSB3cmFwcGVyCiAgICAgICAgICAgIGNsYXNzZXMpIHRvIHRoZSBqdHlwZSAodXNlZCBpbiB0aGUgSk5JIGNsYXNzKSBhbmQgdmlzYSB2ZXJzYS4gQSBqYXZhaW4gdHlwZW1hcAogICAgICAgICAgICBpcyByZXF1aXJlZCB3aGVuZXZlciBhbiBpbiB0eXBlbWFwIGlzIHdyaXR0ZW4gYW5kIHNpbWlsYXJseSBqYXZhb3V0IGZvciBhbiBvdXQKICAgICAgICAgICAgdHlwZW1hcC4gQW4gZXhhbXBsZSBpcyBwcm9iYWJseSBiZXN0IHRvIHNob3cgdGhlbSB3b3JraW5nOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFpbikgQ2xhc3MgIkNsYXNzLmdldENQdHIoJGphdmFpbnB1dCkiCiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhaW4pIHVuc2lnbmVkIHNob3J0ICIkamF2YWlucHV0IgogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YW91dCkgQ2xhc3MgKiB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGFzcygkam5pY2FsbCwgJG93bmVyKTsKICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICVpbmxpbmUgJXsKICAgICAgICAgICAgICAgICAgICBjbGFzcyBDbGFzcyB7fTsKICAgICAgICAgICAgICAgICAgICBDbGFzcyAqIGJhcihDbGFzcyBjbHMsIHVuc2lnbmVkIHNob3J0IHVzaCkgeyByZXR1cm4gbmV3IENsYXNzKCk7IH07CiAgICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgVGhlIGdlbmVyYXRlZCBwcm94eSBjb2RlIGlzIHRoZW46CgogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBDbGFzcyBiYXIoQ2xhc3MgY2xzLCBpbnQgdXNoKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2xhc3MoZXhhbXBsZUpOSS5iYXIoQ2xhc3MuZ2V0Q1B0cihjbHMpLCB1c2gpLCBmYWxzZSk7CiAgICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgU29tZSBuZXcgc3BlY2lhbCB2YXJpYWJsZXMgaGF2ZSBiZWVuIGludHJvZHVjZWQgaW4gb3JkZXIgdG8gdXNlIHRoZXNlIHR5cGVtYXBzLgogICAgICAgICAgICBIZXJlICRqYXZhaW5wdXQgaGFzIGJlZW4gcmVwbGFjZWQgYnkgJ2NscycgYW5kICd1c2gnLiAkam5pY2FsbCBoYXMgYmVlbiByZXBsYWNlZCBieSAKICAgICAgICAgICAgdGhlIG5hdGl2ZSBtZXRob2QgY2FsbCwgJ2V4YW1wbGVKTkkuYmFyKC4uLiknIGFuZCAkb3duZXIgaGFzIGJlZW4gcmVwbGFjZWQgYnkgJ2ZhbHNlJy4KICAgICAgICAgICAgJGphdmFpbnB1dCBpcyBhbmFsb2dvdXMgdG8gdGhlICRpbnB1dCBzcGVjaWFsIHZhcmlhYmxlLiBJdCBpcyByZXBsYWNlZCBieSB0aGUgcGFyYW1ldGVyIG5hbWUuCiAgICAgICAgICAgICRqbmljYWxsIGlzIGFuYWxvZ291cyB0byAkYWN0aW9uIGluICVleGNlcHRpb24uIEl0IGlzIHJlcGxhY2VkIGJ5IHRoZSBjYWxsIHRvIHRoZSBuYXRpdmUKICAgICAgICAgICAgbWV0aG9kIGluIHRoZSBKTkkgY2xhc3MuCiAgICAgICAgICAgICRvd25lciBpcyByZXBsYWNlZCBieSBlaXRoZXIgdHJ1ZSBpZiAlbmV3b2JqZWN0IGhhcyBiZWVuIHVzZWQgb3RoZXJ3aXNlIGZhbHNlLgoKICAgICAgICAgICAgVGhlIGphdmEuc3dnIGZpbGUgY29udGFpbnMgZGVmYXVsdCBqYXZhaW4gYW5kIGphdm91dCB0eXBlbWFwcyB3aGljaCB3aWxsIHByb2R1Y2UgdGhlIHNhbWUgY29kZQogICAgICAgICAgICBhcyBwcmV2aW91c2x5LiBUaGlzIGNoYW5nZSBpcyBvbmx5IG9mIGNvbmNlcm4gdG8gdGhvc2Ugd2hvIGhhdmUgd3JpdHRlbiB0aGVpciBvd24gdHlwZW1hcHMgYXMKICAgICAgICAgICAgeW91IHdpbGwgdGhlbiBtb3N0IGxpa2VseSBoYXZlIHRvIHdyaXRlIHlvdXIgb3duIGphdmFpbiBhbmQgamF2YW91dCB0eXBlbWFwcy4KCiAgICAgICAgICAgIFRoZSBqYXZhb3V0IHR5cGVtYXAgYWxzbyBtYWtlcyBpdCBwb3NzaWJsZSB0byB1c2UgYSBKYXZhIGRvd25jYXN0IHRvIGJlIHVzZWQgb24gYWJzdHJhY3QgCiAgICAgICAgICAgIHByb3h5IGJhc2UgY2xhc3Nlcy4gU2VlIHRoZSBKYXZhIGRvY3VtZW50YXRpb24gb24gZHluYW1pY19jYXN0LgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMTAvMjQvMjAwMjogdHRuCgkgICAgW01ldGhvZG9sb2d5XSBVcGdhZGVkIHRvIGxpYnRvb2wgMS40LjMsIHByZXN1bWFibHkgdy8gYmV0dGVyCgkgICAgc3VwcG9ydCBmb3IgbmV3aXNoIHBsYXRmb3JtcyAobGlrZSBNYWNPUyBYKS4KCjEwLzIxLzIwMDI6IHR0bgoJICAgIEZpeGVkIFJ1bnRpbWUvTWFrZWZpbGUuaW4gYnVnIC0tIHRoYW5rcyB0byBSaWNoYXJkIENhbG1iYWNoLgoKMTAvMTgvMjAwMjogdHRuCgkgICAgRml4ZWQgdHlwbyBpbiBkb2guaCAtLSB0aGFua3MgdG8gTWF4IEhvcm4uCgpWZXJzaW9uIDEuMy4xNiAoT2N0b2JlciAxNCwgMjAwMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMC8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGJ1ZyB3aXRoICVleHRlbmQgZGlyZWN0aXZlIGFuZCAlZmVhdHVyZSByZXBvcnRlZAogICAgICAgICAgICBieSBXaWxsaWFtIEZ1bHRvbi4KCjEwLzEzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgT3BlblZNUyBidWlsZCBkaXJlY3RvcnkgKHZtcykuICBDb250cmlidXRlZCBieSAKICAgICAgICAgICAgSmVhbi1GcmFu529pcyBQaWVyb25uZS4KCjEwLzA5LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQWRkZWQgdGhyb3dzIGNsYXVzZSB0byB0aGUgbmF0aXZlIGZ1bmN0aW9ucyBpbiB0aGUgSk5JIGNsYXNzLgogICAgICAgICAgICBUaGUgdGhyb3dzIGNsYXVzZSBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIGdlbmVyYXRlZCBmb3IgcHJveHkgZnVuY3Rpb25zCiAgICAgICAgICAgIGFuZCBtb2R1bGUgY2xhc3MgZnVuY3Rpb25zLgoKMDkvMjcvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzb21lIHByb2JsZW1zIHdpdGggdGhlICVpbXBvcnQgZGlyZWN0aXZlIGFuZCBjbGFzc2VzIHRoYXQKICAgICAgICAgICAgd2VyZSBkZWZpbmVkIGJ1dCBub3Qgd3JhcHBlZC4gIFByb2JsZW0gcmVwb3J0ZWQgYnkgTGVzbGllIEJyb29rcywKICAgICAgICAgICAgR2VycnkgV29vZHMsIGFuZCBvdGhlcnMuCgowOS8yMy8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFNvbWUgZXJyb3IgY2hlY2tpbmcgYWRkZWQ6CiAgICAgICAgICAgIDEpIE91dE9mTWVtb3J5RXhjZXB0aW9uIGNoZWNrIGluIHRoZSBjaGFyICogdHlwZW1hcHMuIAogICAgICAgICAgICAyKSBBcyBTV0lHIHRyZWF0cyBwb2ludGVycywgcmVmZXJlbmNlcyBhbmQgcGFzc2luZyBieSB2YWx1ZSBhbGwgdGhlCiAgICAgICAgICAgIHNhbWUsIGl0IGlzIHBvc3NpYmxlIHRvIHBhc3MgYSBOVUxMIHBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0aGF0IGV4cGVjdHMKICAgICAgICAgICAgYW4gb2JqZWN0IHBhc3NlZCBieSB2YWx1ZSBvciBieSByZWZlcmVuY2UuIEEgTnVsbFBvaW50ZXJFeGNlcHRpb24gaXMgCiAgICAgICAgICAgIG5vdyB0aHJvd24gdW5kZXIgdGhpcyBzY2VuYXJpby4KCjA5LzIwLzIwMDI6IHR0bgoJICAgIFtNZXRob2RvbG9neV0gUmV3b3JrZWQgIm1ha2UgY2xlYW4iIGFuZCAibWFrZSBpbnN0YWxsIgoJCQkgIHRvIGJlIG1vcmUgdGFibGUgZHJpdmVuLgoJICAgIFtEb2NzXSBFeHBsYWluIGhvdyB0byBleHRlbmQgIm1ha2UgaW5zdGFsbCIgdy8gZXh0cmEtaW5zdGFsbC5saXN0LgoKMDkvMTUvMjAwMjogYmVhemxleQogICAgICAgICAgICBEZXByZWNhdGlvbiBvZiB0aGUgImlnbm9yZSIgdHlwZW1hcC4gICBUaGUgImlnbm9yZSIgdHlwZW1hcCBoYXMKICAgICAgICAgICAgYmVlbiBkZXByZWNhdGVkIGluIGZhdm9yIG9mIGEgZ2VuZXJhbGl6YXRpb24gb2YgdGhlICJpbiIgdHlwZW1hcC4KICAgICAgICAgICAgVG8gaWdub3JlIGFuIGFyZ3VtZW50LCB1c2Ugc29tZXRoaW5nIGxpa2UgdGhpcyBpbnN0ZWFkOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGluLG51bWlucHV0cz0wKSBpbnQgKm91dHB1dCAoaW50IHRlbXApIHsKICAgICAgICAgICAgICAgICAgICAgJDEgPSAmdGVtcDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIGZpeGVzIGEgbnVtYmVyIG9mIHN1YnRsZSBidWdzIHJlbGF0ZWQgdG8gdGhlIGludGVyYWN0aW9uCiAgICAgICAgICAgIG9mIHRoZSAiaW4iIGFuZCAiaWdub3JlIiB0eXBlbWFwcyAod2hpY2ggd2VyZSBzdXBwb3NlZCB0byBiZQogICAgICAgICAgICBtdXR1YWxseSBleGNsdXNpdmUpLgoKICAgICAgICAgICAgVGhlIHVzZSBvZiB0aGUgbnVtaW5wdXRzIGFyZ3VtZW50IGlzIHJlc2VydmVkIGZvciBmdXR1cmUgZXhwYW5zaW9uLgogICAgICAgICAgICBDdXJyZW50bHksIHZhbHVlcyA+MSB3aWxsIGdlbmVyYXRlIGFuIGVycm9yLiAgSG93ZXZlciwgZnV0dXJlCiAgICAgICAgICAgIHJlbGVhc2VzIG9mIFNXSUcgbWF5IHV0aWxpemUgdGhhdCB0byBzdXBwb3J0IG11bHRpLWlucHV0IHR5cGVtYXBzLgoKICAgICAgICAgICAgJXR5cGVtYXAoaWdub3JlKSBzdGlsbCB3b3JrcywgYnV0IGdlbmVyYXRlcyBhIHdhcm5pbmcgbWVzc2FnZSBhbmQgaXMKICAgICAgICAgICAgdHJhbnNsYXRlZCB0byAldHlwZW1hcChpbixudW1pbnB1dHM9MCkuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDkvMTUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzZWdtZW50YXRpb24gZmF1bHQgZm9yIHVubmFtZWQgc3RydWN0dXJlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgewogICAgICAgICAgICAgICB9ICpibGFoOwoKCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IFJvZ2VyIEdpYnNvbi4KICAgICAgICAgICAgTm90ZTogd2UgbWlnaHQgYmUgYWJsZSB0byBnZW5lcmF0ZSB3cmFwcGVycyBpbiBzcGVjaWFsIGNhc2VzLgoKMDkvMTMvMjAwMjogYmVhemxleQogICAgICAgICAgICBNaW5vciBtb2RpZmljYXRpb24gdG8gZ2VuZXJhdGVkIHdyYXBwZXIgZnVuY3Rpb25zLiAgUG9pbnRlciBhcmd1bWVudHMgYXJlIG5vdwogICAgICAgICAgICBhbHdheXMgc2V0IHRvIGFuIGluaXRpYWwgdmFsdWUgb2YgMC4gICBTaW1wbGlmaWVzIHR5cGVtYXAgd3JpdGluZyBhbmQgY2xlYW51cAogICAgICAgICAgICBjb2RlIChzaW5jZSB5b3UgY2FuIHJlbHkgb24gemVyby12YWx1ZSBpbml0aWFsaXphdGlvbikuICAgVGhpcyBhbHNvIGdyZWF0bHkKICAgICAgICAgICAgcmVkdWNlcyB0aGUgbmVlZCB0byBldmVyIHdyaXRlIGFuICJhcmdpbml0IiB0eXBlbWFwLgoKMDkvMTIvMjAwMjogYmVhemxleQogICAgICAgICAgICBNaW5vciBlbmhhbmNlbWVudCB0byBzbWFydC1wb2ludGVyIHN1cHBvcnQuICBJZiBvcGVyYXRvci0+KCkKICAgICAgICAgICAgaXMgcGFydCBvZiBhbiBpZ25vcmVkIGJhc2UgY2xhc3MgbGlrZSB0aGlzLAoKICAgICAgICAgICAgICAgICAlaWdub3JlIEJhcjsKCiAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIGludCBibGFoKCk7CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsgICAgICAgICAvKiBJZ25vcmVkICovCiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAgRm9vICpvcGVyYXRvci0+KCk7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIGNsYXNzIFNwYW0gOiBwdWJsaWMgQmFyIHsgfTsKCiAgICAgICAgICAgIHRoZW4gbWV0aG9kcyBmcm9tIEZvbyBhcmUgc3RpbGwgYXZhaWxhYmxlLiAgRm9yIGV4YW1wbGUsCgogICAgICAgICAgICAgICAgID4+PiBzID0gU3BhbSgpCiAgICAgICAgICAgICAgICAgPj4+IHMuYmxhaCgpCiAgICAgICAgICAgICAgICAgMAogICAgICAgICAgICAgICAgID4+PgoKICAgICAgICAgICAgIFRoZSBvbmx5IGNhdGNoIGlzIHRoYXQgdGhlIG9wZXJhdG9yLT4oKSBpdHNlbGYgaXMgbm90IGF2YWlsYWJsZQogICAgICAgICAgICAgKHNpbmNlIGl0IHdhc24ndCB3cmFwcGVkKS4gICBUaGVyZWZvcmUsIHRoZXJlIHdvbid0IGJlIGFueQogICAgICAgICAgICAgX19kZXJlZl9fKCkgb3BlcmF0aW9uIHVubGVzcyBpdCBpcyBleHBsaWNpdGx5IGFkZGVkIHRvIFNwYW0KICAgICAgICAgICAgIChlaXRoZXIgdXNpbmcgJWV4dGVuZCBvciBqdXN0IHBsYWNpbmcgb3BlcmF0b3ItPigpIGluIHRoZQogICAgICAgICAgICAgZGVmaW5pdGlvbiBvZiBTcGFtKS4KCjA5LzExLzIwMDI6IHR0bgoJICAgIFtNZXRob2RvbG9neV0gUmV3b3JrZWQgIm1ha2UgY2hlY2siIHRvIGJlIG1vcmUgdGFibGUgZHJpdmVuLgoJICAgIFtEb2NzXSBEb2N1ZW1lbnRlZCBtZXRob2RvbG9neSBpbiBNYW51YWwvRXh0ZW5kaW5nLmh0bWwuCgowOS8xMS8yMDAyOiB0dG4KCSAgICBbRG9jc10gUHJlZml4ZWQgTWFudWFsLyouaHRtbCB3aXRoICI8IURPQ1RZUEUgaHRtbCAuLi4+IiB0bwoJICAgIHBhbmRlciBkb3RpbmdseSB0byAob3Zlci0pc2Vuc2l0aXZlIGVkaXRvcnMuCgowOS8xMC8yMDAyOiB0dG4KCSAgICBbR3VpbGVdIENvbnZlcnRlZCBFeGFtcGxlcy9ndWlsZS9zaW1wbGUgIm1ha2UgY2hlY2siCgkgICAgYmVoYXZpb3IgdG8gYWN0dWFsbHkgY2hlY2sgZXhlY3V0aW9uIHJlc3VsdHMuICBSZWR1Y2VkCgkgICAgaXRlcmF0aW9uIGNvdW50cyBzbyB0aGF0IHRoZSB0ZXN0IGRvZXNuJ3QgdGFrZSB0b28gbG9uZy4KCjA5LzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU1dJRy0xLjMuMTUgcmVsZWFzZWQuCgoKVmVyc2lvbiAxLjMuMTUgKFNlcHRlbWJlciA5LCAyMDAyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowOS8wOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIG5hc3R5IHJ1bnRpbWUgdHlwZSBjaGVja2luZyBidWcgd2l0aCBzdWJ0eXBlcyBhbmQgaW5oZXJpdGFuY2UKICAgICAgICAgICAgYW5kIHRlbXBsYXRlcy4gCgowOS8wOS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEphdmEgZXhjZXB0aW9uIGNsYXNzZXMgZm9yIGEgbWV0aG9kJ3MgdGhyb3dzIGNsYXVzZSBjYW4gYmUgZ2VuZXJhdGVkIGJ5IAogICAgICAgICAgICBzcGVjaWZ5aW5nIHRoZW0gaW4gYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBpbiB0aGUgdGhyb3dzIGF0dHJpYnV0ZSBpbiBhbnkgb25lCiAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdHlwZW1hcHM6IGluLCBvdXQsIGNoZWNrLCBmcmVlYXJnLCBhcmdvdXQgYW5kIHRocm93cy4gQSBjbGFzc2ljCiAgICAgICAgICAgIGV4YW1wbGUgd291bGQgYmUgdG8gY29udmVydCBDKysgZXhjZXB0aW9ucyBpbnRvIGEgc3RhbmRhcmQgSmF2YSBleGNlcHRpb246CgogICAgICAgICAgICAgICAgJXR5cGVtYXAodGhyb3dzLCB0aHJvd3M9ImphdmEuaW8uSU9FeGNlcHRpb24iKSBmaWxlX2V4Y2VwdGlvbiB7CiAgICAgICAgICAgICAgICAgICAgamNsYXNzIGV4Y2VwID0gamVudi0+RmluZENsYXNzKCJqYXZhL2lvL0lPRXhjZXB0aW9uIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGV4Y2VwKQogICAgICAgICAgICAgICAgICAgICAgICBqZW52LT5UaHJvd05ldyhleGNlcCwgJDEud2hhdCgpKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJG51bGw7IC8vIG9yIHVzZSBTV0lHX2ZhaWwKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjbGFzcyBmaWxlX2V4Y2VwdGlvbiB7Li4ufTsKICAgICAgICAgICAgICAgIHZvaWQgb3Blbihjb25zdCBjaGFyICpmaWxlbmFtZSkgdGhyb3coZmlsZV9leGNlcHRpb24pOwoKICAgICAgICAgICAgVGhlIEphdmEgbWV0aG9kIHdpbGwgdGhlbiBiZSBkZWNsYXJlZCB3aXRoIGEgdGhyb3dzIGNsYXVzZToKCiAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgb3BlbihTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsuLi59CgowOS8wOC8yMDAyOiBta29lcHBlCgkgICogW0d1aWxlXSBJbXByb3ZlZCB0aGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0uICBUaGUgYXJnbGlzdCBubwoJICAgIGxvbmdlciBnZXRzIGNsdXR0ZXJlZCB3aXRoIHR5cGUgc3BlY2lmaWNhdGlvbiwgbWFraW5nIGl0CgkgICAgbW9yZSByZWFkYWJsZS4gIChBbHNvIHRoZSBJTElTUCBmdW5jdGlvbiBDLXUgTS14CgkgICAgYGFyZ2xpc3QtbGlzcCcgUkVUIHdvcmtzIGJldHRlciB0aGlzIHdheS4pICBUaGUgdHlwZXMgb2YKCSAgICBhcmd1bWVudHMgYXJlIGV4cGxhaW5lZCBpbiBhbiBleHRyYSBzZW50ZW5jZSBhZnRlciB0aGUKCSAgICBhcmdsaXN0LiAKCSAgICAKCSAgICBUaGVyZSBhcmUgbm93IHR3byBkb2N1bWVudGF0aW9uLXJlbGF0ZWQgdHlwZW1hcCBhcmd1bWVudHM6CgoJICAgICAgICAldHlwZW1hcChpbiwgZG9jPSIkTkFNRSBpcyBhIHZlY3RvciBvZiBpbnRlZ2VycyIsIAoJCQkgYXJnbGlzdD0iJG5hbWUiKSAgaW50ICpWRUNUT1IgeyAuLi4gfQoJCQkgCiAgICAgICAgICAgIFRoZSAiYXJnbGlzdCIgdGV4dHMgb2YgYWxsIGFyZ3VtZW50cyBvZiBhIGZ1bmN0aW9uIG1ha2UgdXAKCSAgICBpdHMgYXJnbGlzdCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gIFRoZSAiZG9jIiB0ZXh0cyBvZiBhbGwKCSAgICBhcmd1bWVudHMgYXJlIGNvbGxlY3RlZCB0byBtYWtlIGEgc2VudGVuY2UgdGhhdCBkZXNjcmliZXMKCSAgICB0aGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cy4gIFJlYXNvbmFibGUgZGVmYXVsdHMgYXJlCgkgICAgcHJvdmlkZWQuIAoKCSAgICBBcyB1c3VhbCwgJG5hbWUgaXMgc3Vic3RpdHV0ZWQgYnkgdGhlIG5hbWUgb2YgdGhlCgkgICAgYXJndW1lbnQuIFRoZSBuZXcgdHlwZW1hcCB2YXJpYWJsZSAkTkFNRSBpcyBsaWtlICRuYW1lLAoJICAgIGJ1dCBtYXJrZWQtdXAgYXMgYSB2YXJpYWJsZS4gIFRoaXMgbWVhbnMgdGhhdCBpdCBpcwoJICAgIHVwcGVyLWNhc2VkOyBpbiBUZVhpbmZvIG1vZGUgKCItcHJvY2RvY2Zvcm1hdCB0ZXhpbmZvIikgaXQKCSAgICBjb21lcyBvdXQgYXMgQHZhcntuYW1lfS4gCgkgICAgCgkgICAgVGhlIGRpcmVjdGl2ZXMgJXZhbHVlc19hc19saXN0LCAldmFsdWVzX2FzX3ZlY3RvciwKCSAgICAlbXVsdGlwbGVfdmFsdWVzIG5vdyBhbHNvIGhhdmUgYW4gZWZmZWN0IG9uIHRoZQoJICAgIGRvY3VtZW50YXRpb24uIChUaGlzIGlzIGFjaGlldmVkIHZpYSB0aGUgbmV3IHByYWdtYXMKCSAgICByZXR1cm5fbm90aGluZ19kb2MsIHJldHVybl9vbmVfZG9jLCByZXR1cm5fbXVsdGlfZG9jLikKCgkgICAgRG9jdW1lbnRhdGlvbiBoYXMgYWxzbyBpbXByb3ZlZCBmb3IgdmFyaWFibGVzIHRoYXQgYXJlCgkgICAgd3JhcHBlZCBhcyBwcm9jZWR1cmVzLXdpdGgtc2V0dGVycyAoY29tbWFuZC1saW5lIHN3aXRjaAoJICAgICItZW1pdC1zZXR0ZXJzIikuCgogICAgICAgICAgKiBbR3VpbGVdIEVtaXQgY29uc3RhbnRzIGFzIF9pbW11dGFibGVfIHZhcmlhYmxlcy4gIChUaGlzCiAgICAgICAgICAgIHdhcyBicm9rZW4gcmVjZW50bHkuKQoKMDkvMDcvMjAwMjogbWtvZXBwZQoJICAgIFtHdWlsZV0gVXBkYXRlZCB0aGUgdHlwZW1hcHMgaW4gbGlzdC12ZWN0b3IuaS4KCjA5LzA3LzIwMDI6IG1rb2VwcGUKCSAgICBTaG9ydC1jaXJjdWl0IHRoZSB0eXBlY2hlY2tzIGZvciBvdmVybG9hZGVkIGZ1bmN0aW9ucy4KCSAgICAoVGhlIGNoYW5nZXMgaW4gY29kZSBnZW5lcmF0aW9uIGFyZSB2aXNpYmxlIGluIHRoZSBuZXcKCSAgICB0ZXN0Y2FzZSAib3ZlcmxvYWRfY29tcGxpY2F0ZWQiLikKCjA5LzA2LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gU29sdXRpb24gZm9yIFsgNTk2NDEzIF0KICAgICAgICAgICAgTmV3IHR5cGVtYXAgc28gdGhhdCB0aGUgSmF2YSBwcm94eSBjbGFzc2VzIGFuZCB0eXBlIHdyYXBwZXIgY2xhc3NlcwogICAgICAgICAgICB3cmFwcGVyIGNvbnN0cnVjdG9yIG1vZGlmaWVyIGNhbiBiZSB0YWlsb3JlZCBieSB1c2Vycy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgCiAgICAgICAgICAgIHByb3RlY3RlZC4gTm9ybWFsbHkgU1dJRyBnZW5lcmF0ZXMgYSBjb25zdHJ1Y3RvciBsaWtlIHRoaXMgd2hpY2ggY2FuIG9ubHkgCiAgICAgICAgICAgIGJlIGFjY2Vzc2VkIHdpdGhpbiBvbmUgcGFja2FnZToKCiAgICAgICAgICAgICAgcHJvdGVjdGVkIEJhcihsb25nIGNQdHIsIGJvb2xlYW4gY01lbW9yeU93bikgewogICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIElmIHlvdSBhcmUgdXNpbmcgU1dJRyBhY3Jvc3MgbXVsdGlwbGUgcGFja2FnZXMgb3Igd2FudCB0byB1c2UgdGhpcyBjb25zdHJ1Y3RvcgogICAgICAgICAgICBhbnl3YXksIGl0IGNhbiBub3cgYmUgYWNjZXNzZWQgb3V0c2lkZSB0aGUgcGFja2FnZS4gVG8gbW9kaWZ5IHVzZSBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YXB0cmNvbnN0cnVjdG9ybW9kaWZpZXJzKSBTV0lHVFlQRSAicHVibGljIgoKICAgICAgICAgICAgdG8gY2hhbmdlIHRvIHB1YmxpYyBmb3IgYWxsIHByb3h5IGNsYXNzZXMgYW5kIHNpbWlsYXJseSBmb3IgYWxsIHR5cGUgd3JhcHBlciBjbGFzc2VzOgogICAgICAgICAgICAKICAgICAgICAgICAgICAldHlwZW1hcChqYXZhcHRyY29uc3RydWN0b3Jtb2RpZmllcnMpIFNXSUdUWVBFLCBTV0lHVFlQRSAqLCBTV0lHVFlQRSAmLCBTV0lHVFlQRSBbXSAicHVibGljIgoKMDkvMDYvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBBZGRlZCB0aHJvd3MgdHlwZW1hcHMgZm9yIHRoZSBKYXZhIG1vZHVsZS4gQysrIGV4Y2VwdGlvbnMgZ2V0IGNvbnZlcnRlZCBpbnRvCiAgICAgICAgICAgIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIEphdmEgZXhjZXB0aW9ucy4gCiAgICAgICAgICAgIAogICAgICAgICAgICBXYXJuaW5nOiBUaGlzIG1heSBjaGFuZ2UgZnJvbSBqYXZhLmxhbmcuUnVudGltZSBleGNlcHRpb24gaW4gdGhlIGZ1dHVyZS4KCjA5LzA1LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4IGZvciB2YXJpYWJsZXMgZGVjbGFyZWQgYXMgcmVmZXJlbmNlcy4KCjA5LzA1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2MDUxNjIgXSBUeXBlbWFwIGxvY2FsIHZhcmlhYmxlcy4gUmVwb3J0ZWQgYnkgTHlsZSBKb2huc29uLgoKMDkvMDUvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIE1vcmUgdXBkYXRlcyB0byB0aGUgUnVieSBtb2R1bGUgZG9jdW1lbnRhdGlvbiwgaW5jbHVkaW5nCgkgICAgYSBuZXcgdHlwZW1hcCBleGFtcGxlIHRoYXQgZGVtb25zdHJhdGVzIGhvdyB0byBjb2xsZWN0IGtleS12YWx1ZQoJICAgIHBhaXJzIGZyb20gYW4gYXJndW1lbnQgbGlzdCBpbnRvIGEgSGFzaC4KCjA5LzA1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYnVnIHdpdGggdGVtcGxhdGUgZXhwYW5zaW9uIGFuZCBjb25zdHJ1Y3RvcnMuCgogICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICBGb288VD4oKSB7IH0KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGUgZXh0cmEgPFQ+IGluIHRoZSBjb25zdHJ1Y3RvciB3YXMgY2FycmllZCB0aHJvdWdoIGluIHRoZQogICAgICAgICAgICBuYW1lLS1jYXVzaW5nIHJ1bnRpbWUgcHJvYmxlbXMgaW4gZ2VuZXJhdGVkIG1vZHVsZXMuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEpvcmRpIEFybmFiYXQgQmVuZWRpY3RvLgogCjA5LzA1LzIwMDI6IG1rb2VwcGUKCSAgICBbR3VpbGVdIFN1cHBvcnQgb3ZlcmxvYWRpbmcuCgowOS8wNC8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gVXBkYXRlZCB0eXBlbWFwcyBmb3IgbG9uZyBsb25nIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcgdHlwZXMKCSAgICB0byB1c2UgUnVieSAxLjcgc3VwcG9ydCBmb3IgdGhlc2UgdHlwZXMgd2hlbiBhdmFpbGFibGUuCgowOS8wNC8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgb3V0cHV0IHR5cGVtYXBzIGZvciBjb25zdCByZWZlcmVuY2UgdG8gcHJpbWl0aXZlCgkgICAgdHlwZXMuCgowOS8wNC8yMDAyOiBta29lcHBlCgkgICAgW0d1aWxlXSBGaXggcGFzcy1ieS12YWx1ZSB0eXBlbWFwcy4gIFJlcG9ydGVkIGJ5IEFybm8KCSAgICBQZXRlcnMgdmlhIERlYmlhbiBidWd0cmFja2luZyAoIzE1NjkwMiksIHBhdGNoIGJ5IFRvcnN0ZW4KCSAgICBMYW5kc2Nob2ZmIDx0b3JzdGVuQGRlYmlhbi5vcmc+LgoKMDkvMDMvMjAwMjogc2FtamFtIChTYW0gTGlkZGljb3R0KQoJICAgIEJldHRlciByZWZlcmVuY2Ugc3VwcG9ydC4KCSAgICBGdW5jdGlvbnMgdGhhdCB3YW50IGEgdm9pZCoqIGNhbiB0YWtlIGEgTlVMTCBieSByZWZlcmVuY2UgYW5kCgkgICAgdGhlIHZvaWQqIHdpbGwgYmUgbWFkZSBmb3IgeW91IGFuZCB0aGVuIHBhc3NlZC1ieS1yZWZlcmVuY2UKCgkgICAgQWxzbyBhbGwgaW50ZWdlci1jbGFzcyBuYXRpdmUgdHlwZXMgY2FuIGJlIHBhc3NlZCBieSByZWZlcmVuY2UKCSAgICB3aGVyZSBhbiBpbnQqIG9yIGludCYgZXRjIGlzIG5lZWRlZAoKMDkvMDMvMjAwMjogYmVhemxleQogICAgICAgICAgICBDaGFuZ2VkIHRoZSBldmFsdWF0aW9uIG9yZGVyIG9mIHByZXByb2Nlc3NvciBtYWNybyBhcmd1bWVudHMuCiAgICAgICAgICAgIEFyZ3VtZW50cyBhcmUgbm93IGV4cGFuZGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IgKmJlZm9yZSogdGhleQogICAgICAgICAgICBhcmUgcGFzc2VkIHRvIG1hY3JvIGV4cGFuc2lvbi4gIFRoaXMgZml4ZXMgYSBzdWJ0bGUgZXhwYW5zaW9uCiAgICAgICAgICAgIGJ1ZyByZXBvcnRlZCBieSBBbnRob255IEhlYWRpbmcuCgowOS8wMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHRoZSBmaWxlIGluY2x1ZGUgb3JkZXIgKGFnYWluLCBhcHBhcmVudGx5KS4gU2VlIDIvMjcvOTkuCgowOS8wMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtQZXJsXSBCZXR0ZXIgZXhjZXB0aW9uIGhhbmRsaW5nIHN1cHBvcnQuICBTaW5jZSBQZXJsIGVycm9yIGhhbmRsaW5nCiAgICAgICAgICAgIHJlbGllcyBvbiBzZXRqbXAvbG9uZ2ptcCwgd3JhcHBlciBmdW5jdGlvbnMgaGF2ZSBiZWVuIG1vZGlmaWVkIHNsaWdodGx5CiAgICAgICAgICAgIHRvIHByb3ZpZGUgYW4gZXh0cmEgYmxvY2sgc2NvcGU6CgogICAgICAgICAgICAgICAgWFMoZm9vKSB7CiAgICAgICAgICAgICAgICAgICBjaGFyIF9zd2lnbXNnW1NXSUdfTUFYX0VSUk1TR10gPSAiIjsKICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKl9zd2lnZXJyID0gX3N3aWdtc2c7CiAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAvKiBOb3JtYWwgd3JhcHBlciBmdW5jdGlvbiBoZXJlICovCiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAgIFNXSUdfY3JvYWsoIkFuIGVycm9yIG9jY3VycmVkXG4iKTsKICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICAgWFNSRVRVUk4oYXJndmkpOyAgICAgIC8qIFN1Y2Nlc3NmdWwgcmV0dXJuICovCiAgICAgICAgICAgICAgICAgICAgICBmYWlsOgogICAgICAgICAgICAgICAgICAgICAgICAvKiBjbGVhbnVwIGNvZGUgKi8KICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgIGNyb2FrKF9zd2lnX2Vycik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGUgbWFjcm8gU1dJR19jcm9hayh4KSBzZXRzIHRoZSB2YWx1ZSBvZiBfc3dpZ2VyciB0byB4IGFuZAogICAgICAgICAgICBleGVjdXRlcyBhICJnb3RvIGZhaWwiLiAgVGhlIHdob2xlIHdyYXBwZXIgZnVuY3Rpb24gaXMgZW5jbG9zZWQKICAgICAgICAgICAgYmxvY2sgc2NvcGUgdG8gcHJvdmlkZSBwcm9wZXIgY2xlYW51cCBvZiBDKysgb2JqZWN0cy4gIFNpbmNlCiAgICAgICAgICAgIGNyb2FrIGV4ZWN1dGVzIGEgbG9uZ2ptcCgpLCB0aGVyZSBpcyBubyB3YXkgdG8gcHJvcGVybHkgcmVjbGFpbQogICAgICAgICAgICByZXNvdXJjZXMgaWYgdGhpcyBleGVjdXRlcyBpbiB0aGUgc2FtZSBzY29wZSBhcyB0aGUgd3JhcHBlcgogICAgICAgICAgICBmdW5jdGlvbi4KCiAgICAgICAgICAgIFRoZSBfc3dpZ21zZ1tdIHZhcmlhYmxlIGlzIG5vcm1hbGx5IHVudXNlZCwgYnV0IGNhbiBiZSB1c2VkCiAgICAgICAgICAgIHRvIHN0b3JlIHNtYWxsIGVycm9yIG1lc3NhZ2VzIHVzaW5nIHNwcmludGYgb3Igc25wcmludGYuIEl0CiAgICAgICAgICAgIGhhcyBhIGNhcGFjaXR5IG9mIGF0IGxlYXN0IDI1NiBieXRlcyAoU1dJR19NQVhfRVJSTVNHKS4KICAgICAgICAgICAgCjA5LzAyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW1RjbF0gQWRkZWQgYmV0dGVyIHN1cHBvcnQgZm9yIGV4Y2VwdGlvbnMuICBJbnN0ZWFkIG9mIHJldHVybmluZyBUQ0xfRVJST1IsCiAgICAgICAgICAgIHVzZSB0aGUgbWFjcm8gU1dJR19mYWlsIHRvIHJldHVybiB3aXRoIGFuIGVycm9yLiAgVGhpcyBlbnN1cmVzIHRoYXQKICAgICAgICAgICAgYXJndW1lbnRzIGFyZSBwcm9wZXJseSBjbGVhbmVkIHVwLiAgRXhjZXB0aW9uIHNwZWNpZmllcnMgYXJlIG5vdwogICAgICAgICAgICBoYW5kbGVkIGJ5IGRlZmF1bHQuCgowOS8wMi8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gVGhlIHR5cGUtY2hlY2tpbmcgc3lzdGVtIGZvciB0aGUgUnVieSBtb2R1bGUgaGFzIGhhZCBhIGZsYXcKCSAgICBpbiB0aGF0IHNvbWUgdHlwZXMgd2hpY2ggc2hvdWxkIGJlIGNvbnNpZGVyZWQgZXF1aXZhbGVudAoJICAgIHdlcmVuJ3QuIFRoaXMgYnVnIHdhcyBiZXN0IGRlbW9uc3RyYXRlZCBieSB0aGUgaW5oZXJpdF9taXNzaW5nLmkKCSAgICB0ZXN0IHN1aXRlIGNhc2UsIHdoaWNoIGRlZmluZXMgYSBiYXNlIGNsYXNzICJGb28iIHRoYXQgaXMKCSAgICBzdWJjbGFzc2VkIGJ5ICJCYXIiLiBUaGUgIkZvbyIgY2xhc3MgaXNuJ3QgYWN0dWFsbHkgd3JhcHBlZCAoaS5lLgoJICAgIGl0J3Mgbm90IGRpcmVjdGx5IGFjY2Vzc2libGUgZnJvbSBSdWJ5KSBidXQgd2UnZCBzdGlsbCBsaWtlIHRvIGJlCgkgICAgYWJsZSB0byBwYXNzICJCYXIiIGluc3RhbmNlcyB0byBmdW5jdGlvbnMgZXhwZWN0aW5nIEZvb3MgYW5kIGhhdmUKCSAgICB0aGF0IHdvcms7IGl0IHdhc24ndC4gVGhlIHJldmlzZWQgaW1wbGVtZW50YXRpb24gKHNpbWlsYXIgdG8gdGhhdAoJICAgIHVzZWQgZm9yIHNvbWUgb3RoZXIgbGFuZ3VhZ2UgbW9kdWxlcykgYWRkcyBhIG5ldyBpbnN0YW5jZSB2YXJpYWJsZQoJICAgIChfX3N3aWd0eXBlX18pIHRvIGVhY2ggb2JqZWN0IHRoYXQgaW5kaWNhdGVzIGl0cyBTV0lHIHR5cGU7CgkgICAgdGhhdCBpcywgZWFjaCAiQmFyIiBpbnN0YW5jZSB3aWxsIG5vdyBoYXZlIGEgc3RyaW5nIGluc3RhbmNlCgkgICAgdmFyaWFibGUgY2FsbGVkICJfX3N3aWd0eXBlX18iIHdob3NlIHZhbHVlIGlzICJfcF9CYXIiLgoKICAgICAgICAgICAgVW5sZXNzIGRldmVsb3BlcnMgd2VyZSB0YWtpbmcgYWR2YW50YWdlIG9mIHRoaXMgbG93LWxldmVsCgkgICAgaW1wbGVtZW50YXRpb24gZGV0YWlsLCB0aGV5IHNob3VsZG4ndCBub3RpY2UgYW55IGNvbXBhdGliaWxpdHkKCSAgICBwcm9ibGVtczsgbmV2ZXJ0aGVsZXNzLCBJJ20gbWFya2luZyBpdCBhcyBhICJwb3RlbnRpYWwKCSAgICBpbmNvbXBhdGliaWxpdHkiLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgowOS8wMS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gRml4ZWQgU0YgQnVnICM2MDMxOTkuCgowOC8wOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEFkZGVkIE9VVFBVVCwgSU5QVVQgYW5kIElOT1VUIHR5cGVtYXBzIGluIHR5cGVtYXBzLmkgZm9yIEMrKyAKICAgICAgICAgICAgcmVmZXJlbmNlcy4KCjA4LzI3LzIwMDI6IG1rb2VwcGUKCSAgICBbR3VpbGVdIEZpeGVkIGVycm9yIGluICJsaWJfc3RkX3ZlY3RvciIgdGVzdGNhc2UgYW5kCgkgICAgY29tcGlsZXIgd2FybmluZyBpbiAibGliX2NkYXRhIiB0ZXN0Y2FzZS4KCjA4LzI3LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCB0aGUgIiVtaXhpbiIgZGlyZWN0aXZlLCB3aGljaCBhbGxvd3MgdGhlIHVzZXIgdG8KCSAgICBzcGVjaWZ5IGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbW9kdWxlIG5hbWVzIHRvIG1peC1pbiB0byBhCgkgICAgY2xhc3MuIFNvLCBmb3IgZXhhbXBsZSwgaWYgeW91J2QgbGlrZSB0byBzcGVjaWZ5IHRoYXQgUnVieSdzCgkgICAgRW51bWVyYWJsZSBtb2R1bGUgc2hvdWxkIGJlIG1peGVkLWluIHRvIHlvdXIgY2xhc3MgRm9vLCB5b3UnZAoJICAgIHdyaXRlOgoJICAgIAoJICAgICAgICAlbWl4aW4gRm9vICJFbnVtZXJhYmxlIjsKCQkKICAgICAgICAgICAgb3IgdG8gc3BlY2lmeSB0aGF0IHRoZSBtb2R1bGVzIEZlZSwgRmllIGFuZCBGbyBzaG91bGQgYmUgbWl4ZWQKCSAgICBpbiB0byBGb286CgkgICAgCgkgICAgICAgICVtaXhpbiBGb28gIkZlZSxGaWUsRm8iOwoJCQoJICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA4LzI3LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBNb2RpZmllZCB0aGUgJWFsaWFzIGRpcmVjdGl2ZSBzbyB0aGF0IG11bHRpcGxlIGFsaWFzZXMKCSAgICBjYW4gYmUgc3BlY2lmaWVkIGZvciBhbiBpbnN0YW5jZSBtZXRob2QgYnkgdXNpbmcgYSBjb21tYS1zZXBhcmF0ZWQKCSAgICBsaXN0IG9mIGFsaWFzZXMuCgowOC8yNy8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgInRocm93IiB0eXBlbWFwcyBmb3IgdGhlIFJ1YnkgbW9kdWxlLgoKMDgvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgICBUd28gbmV3IGNvbW1hbmQgbGluZSBvcHRpb25zIGZvciBwcmludGluZyBkZXBlbmRlbmNpZXMuCiAgICAgICAgICAgICdzd2lnIC1NJyBsaXN0cyBhbGwgZmlsZSBkZXBlbmRlbmNpZXMuICAnc3dpZyAtTU0nIGxpc3RzCiAgICAgICAgICAgIGRlcGVuZGVuY2llcywgYnV0IGV4Y2x1ZGVzIGZpbGVzIGluIHRoZSBTV0lHIGxpYnJhcnkuIAogICAgICAgICAgICBFeGFtcGxlOgoKICAgICAgICAgICAgICAgJSBzd2lnIC1NIC1weXRob24gZXhhbXBsZS5pCiAgICAgICAgICAgICAgIGV4YW1wbGVfd3JhcC5jeHg6IFwKICAgICAgICAgICAgICAgIC91MC9iZWF6bGV5L1Byb2plY3RzL2xpYi9zd2lnMS4zL3N3aWcuc3dnIFwKICAgICAgICAgICAgICAgIC91MC9iZWF6bGV5L1Byb2plY3RzL2xpYi9zd2lnMS4zL3B5dGhvbi9weXRob24uc3dnIFwKICAgICAgICAgICAgICAgIGV4YW1wbGUuaSBcCiAgICAgICAgICAgICAgICBleGFtcGxlLmggCgogICAgICAgICAgICAgICAlIHN3aWcgLU1NIC1weXRob24gZXhhbXBsZS5pCiAgICAgICAgICAgICAgIGV4YW1wbGVfd3JhcC5jeHg6IFwKICAgICAgICAgICAgICAgIGV4YW1wbGUuaSBcCiAgICAgICAgICAgICAgICBleGFtcGxlLmggCgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowOC8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTk3NTk5IF0gdW5pb24gaW4gY2xhc3M6IGluY29ycmVjdCBzY29wZS4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQXJ0IFllcmtlcy4KCjA4LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2MDAxMzIgXSBEZWZhdWx0IGFyZ3VtZW50IHdpdGggbmFtZXNwYWNlLiAKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgU2hpYnVrYXdhIFlvc2hpa2kuCiAKMDgvMjQvMjAwMjogYmVhemxleQogICAgICAgICAgICBBdXRvbWF0aWMgQysrIGV4Y2VwdGlvbiBoYW5kbGluZyBlbmFibGVkIGZvciBhbGwgbGFuZ3VhZ2UgbW9kdWxlcy4gICAgVGhpcyBpcwogICAgICAgICAgICBwcmV0dHkgc2ltcGxlLiAgSWYgeW91IGhhdmUgYSBjbGFzcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaCgpIHRocm93KEZvbyk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB0aGVuIHRoZSBnZW5lcmF0ZWQgd3JhcHBlciBjb2RlIGxvb2tzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgIHdyYXBfQmFyX2JsYWgoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMS0+YmxhaCgpOwogICAgICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEZvbyAmX2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogInRocm93IiB0eXBlbWFwIGNvZGUgaW5zZXJ0ZWQuICQxID0gX2UgKi8KICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKC4uLikgewogICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93OwogICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICBUaGUgInRocm93IiB0eXBlbWFwIGNhbiBiZSB1c2VkIHRvIHJhaXNlIGFuIGVycm9yIGluIHRoZSB0YXJnZXQgCiAgICAgICAgICAgIGxhbmd1YWdlLiAgSXQgY2FuIGRvIGFueXRoaW5nLiAgSGVyZSBpcyBhIHZlcnkgc2ltcGxlIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICV0eXBlbWFwKCJ0aHJvdyIpIEZvbyB7CiAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJGb28gZXhjZXB0aW9uIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRvIG1ha2UgdGhpcyB3b3JrIGluIGVhY2ggbGFuZ3VhZ2UgbW9kdWxlLCBzaW1wbHkgZGVmaW5lIGEgZmV3IGRlZmF1bHQKICAgICAgICAgICAgInRocm93IiB0eXBlbWFwcyBmb3IgU1dJR1RZUEUsIFNXSUdUWVBFICosIGludCwgY29uc3QgY2hhciAqLCBhbmQgYQogICAgICAgICAgICBmZXcgY29tbW9uIGV4Y2VwdGlvbiB0eXBlcy4gICBUaGF0J3MgYWxsIHRoZXJlIGlzIHRvIGl0LgoKICAgICAgICAgICAgQXV0b21hdGljIGV4Y2VwdGlvbiBoYW5kbGluZyBjYW4gYmUgZGlzYWJsZWQgdXNpbmcgLW5vZXhjZXB0IG9yCiAgICAgICAgICAgIHNldHRpbmcgdGhlIE5vRXhjZXB0IGdsb2JhbCB2YXJpYWJsZSB0byAxLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowOC8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFsgUHl0aG9uIF0KICAgICAgICAgICAgQXV0b21hdGljIHRyYW5zbGF0aW9uIG9mIEMrKyBleGNlcHRpb24gc3BlY2lmaWNhdGlvbnMgaW50byBlcnJvciBoYW5kbGluZyBjb2RlLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKIAogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaCgpIHRocm93KEZvbyk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIEZvbyBpcyB3cmFwcGVkIGFzIGEgY2xhc3NpYy1zdHlsZSBjbGFzcyAoY29tcGF0aWJsZQogICAgICAgICAgICB3aXRoIGV4Y2VwdGlvbiBoYW5kbGluZykuICBGdXJ0aGVybW9yZSwgeW91IGNhbiB3cml0ZSBQeXRob24gY29kZQogICAgICAgICAgICBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgYiA9IEJhcigpCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgYi5ibGFoKCk7CiAgICAgICAgICAgICAgICBleGNlcHQgRm9vLGU6ICAgICAjIE5vdGUgdXNlIG9mIGV4Y2VwdGlvbiBjbGFzcyBoZXJlIQogICAgICAgICAgICAgICAgICAgICMgSGFuZGxlIEZvbyBlcnJvcgogICAgICAgICAgICAgICAgICAgIC4uLgoKICAgICAgICAgICAgVGhlIG9iamVjdCAiZSIgaW4gdGhlIGV4Y2VwdGlvbiBoYW5kbGVyIGlzIGp1c3QgYSB3cmFwcGVkIEZvbwogICAgICAgICAgICBvYmplY3QuICBBY2Nlc3MgaXQgbGlrZSBhIG5vcm1hbCBvYmplY3QuCgogICAgICAgICAgICBJZiBhbiBleGNlcHRpb24gaXMgbm90IHdyYXBwZWQgYXMgYSBjbGFzcywgYSBSdW50aW1lRXJyb3IKICAgICAgICAgICAgZXhjZXB0aW9uIGlzIHJhaXNlZC4gIFRoZSBhcmd1bWVudCB0byB0aGlzIGV4Y2VwdGlvbiBpcwogICAgICAgICAgICB0aGUgZXhjZXB0aW9uIG9iamVjdC4gIEZvciBleGFtcGxlOgogCiAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaCgpIHRocm93KGludCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgYiA9IEJhcigpCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICBiLmJsYWgoKTsKICAgICAgICAgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3IsZToKICAgICAgICAgICAgICAgICAgIHByaW50IGUuYXJnc1swXSAgICAgICAjIEludGVnZXIgZXhjZXB0aW9uIHZhbHVlCgogICAgICAgICAgICBDb21tZW50czoKCiAgICAgICAgICAgICAgICAtICBJZiBhIGNsYXNzIGlzIHVzZWQgYXMgYW4gZXhjZXB0aW9uLCBpdCAqbXVzdCogYmUgd3JhcHBlZAogICAgICAgICAgICAgICAgICAgYXMgYSBQeXRob24gY2xhc3NpYy1zdHlsZSBjbGFzcyAobmV3IGNsYXNzZXMgZG9uJ3Qgd29yaykuCgogICAgICAgICAgICAgICAgLSAgQXV0b21hdGljIGV4Y2VwdGlvbiBoYW5kbGluZyBpcyBjb21wYXRpYmxlIHdpdGggJWV4Y2VwdGlvbi4KCiAgICAgICAgICAgICAgICAtICBVc2UgLW5vZXhjZXB0IHRvIHR1cm4gb2ZmIHRoaXMgZmVhdHVyZS4KCiAgICAgICAgICAgICAgICAtICBUaGUgbmV3bHkgaW50cm9kdWNlZCAidGhyb3ciIHR5cGVtYXAgaXMgdXNlZCB0byByYWlzZQogICAgICAgICAgICAgICAgICAgUHl0aG9uIGVycm9ycyAobmF0dXJhbGx5KS4KCiAgICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgTkVXIEZFQVRVUkUgKioqCgowOC8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEluZm9ybWF0aW9uIGZyb20gdGhyb3coKSBzcGVjaWZpZXJzIGlzIG5vdyBzdG9yZWQgaW4gdGhlIHBhcnNlCiAgICAgICAgICAgIHRyZWUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBpbnQgYmxhaCgpIHRocm93KHNwYW0sYmFyKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoZSBzdG9yZWQgaW5mb3JtYXRpb24gaXMgZnVsbHkgY29ycmVjdGVkIGZvciBuYW1lc3BhY2VzIGFuZCB3b3JrcwogICAgICAgICAgICB3aXRoIHRlbXBsYXRlcy4gIFVzZXMgd2lsbCBmb2xsb3cuCiAgICAgICAgICAgIAowOC8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEV4Y2VwdGlvbiBoYW5kbGluZyBjb2RlIGlzIG5vIGxvbmdlciBhcHBsaWVkIHRvIG1lbWJlciBhY2Nlc3MKICAgICAgICAgICAgZnVuY3Rpb24uICBGb3IgZXhhbXBsZSwgaW4gdGhpcyBjb2RlCgogICAgICAgICAgICAgICAgJWV4Y2VwdGlvbiB7CiAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgJGFjdGlvbgogICAgICAgICAgICAgICAgICAgfSBjYXRjaCh3aGF0ZXZlcikgewogICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICBpbnQgeDsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoZSBleGNlcHRpb24gaGFuZGxpbmcgY29kZSBpcyBub3QgYXBwbGllZCB0byBhY2Nlc3NvciBmdW5jdGlvbnMKICAgICAgICAgICAgZm9yIEZvbzo6eC4gICBUaGlzIHNob3VsZCByZWR1Y2UgdGhlIGFtb3VudCBvZiBleHRyYSBjb2RlCiAgICAgICAgICAgIGdlbmVyYXRlZC4KCiAgICAgICAgICAgIENhdmVhdDogIEV4Y2VwdGlvbiBoYW5kbGluZyBjb2RlICppcyogdXNlZCB3aGVuIGF0dHJpYnV0ZXMgYXJlCiAgICAgICAgICAgIGFjY2Vzc2VkIHRocm91Z2ggYSBzbWFydC1wb2ludGVyIG9yIGEgc3ludGhlc2l6ZWQgYXR0cmlidXRlZAogICAgICAgICAgICBhZGRlZCB3aXRoICVleHRlbmQgaXMgdXNlZC4KCjA4LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWFkZSBtb3JlIHBhdGNoZXMgdG8gaG9wZWZ1bGx5IGVsaW1pbmF0ZSBwcm9ibGVtcyB3aGVuIGNvbXBpbGluZyBTV0lHIAogICAgICAgICAgICBhcyBhIDY0LWJpdCBleGVjdXRhYmxlLgoKMDgvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIGJ1ZyB3aXRoIGNvbnN0IHJlZmVyZW5jZSBtZW1iZXJzLCB2YXJpYWJsZXMsIGFuZCBzdGF0aWMgbWVtYmVycy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludCAmcmVmOwogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgU1dJRyB3YXMgdHJ5aW5nIHRvIGdlbmVyYXRlICJzZXQiIGZ1bmN0aW9ucyB3aGljaCB3b3VsZG4ndCBjb21waWxlLiAKCjA4LzIxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWFkZSB0aGUgd2FybmluZyBtZXNzYWdlIGZvciAiQ2xhc3MgWCBtaWdodCBhYnN0cmFjdCIgb2ZmIGJ5IGRlZmF1bHQuCiAgICAgICAgICAgIEVuYWJsZSB3aXRoIC1XYWxsLgoKMDgvMjEvMjAwMjogYmVhemxleQogICAgICAgICAgICBSZWZpbmVkIGhhbmRsaW5nIG9mIGNvbnN0IGFuZCBub24tY29uc3Qgb3ZlcmxvYWRlZCBtZXRob2RzLiAgSWYKICAgICAgICAgICAgYSBjbGFzcyBkZWZpbmVzIGEgbWV0aG9kIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIGludCBiYXIoaW50KTsKICAgICAgICAgICAgICAgICAgICBpbnQgYmFyKGludCkgY29uc3Q7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGVuIHRoZSBub24tY29uc3QgbWV0aG9kIGlzICphbHdheXMqIHNlbGVjdGVkIGluIG92ZXJsb2FkaW5nIGFuZAogICAgICAgICAgICB0aGUgY29uc3QgbWV0aG9kIHNpbGVudGx5IGRpc2NhcmRlZC4gIElmIHJ1bm5pbmcgd2l0aCAtV2FsbCwgYSB3YXJuaW5nCiAgICAgICAgICAgIG1lc3NhZ2Ugd2lsbCBiZSBnZW5lcmF0ZWQuCgowOC8xOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEJldHRlciBzdXBwb3J0IGZvciB1c2luZyBkZWNsYXJhdGlvbnMgYW5kIGluaGVyaXRhbmNlLiAgIENvbnNpZGVyIHRoaXM6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIGludCBibGFoKGludCB4KTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBibGFoKGRvdWJsZSB4KTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vQmFyIDogcHVibGljIEZvbywgcHVibGljIEJhciB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICBjaGFyICpibGFoKGNoYXIgKngpOwogICAgICAgICAgICAgICAgICAgICAgdXNpbmcgRm9vOjpibGFoOwogICAgICAgICAgICAgICAgICAgICAgdXNpbmcgQmFyOjpibGFoOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIE5vdyBTV0lHIHdyYXBzIEZvb0Jhcjo6YmxhaCBhcyBhbiBvdmVybG9hZGVkIG1ldGhvZCB0aGF0IHVzZXMgYWxsCiAgICAgICAgICAgIGFjY2Vzc2libGUgdmVyc2lvbnMgb2YgYmxhaCgpLiAgU2VlIHNlY3Rpb24gMTUuMi4yIGluIFN0cm91c3RydXAsIDNyZCBFZC4KCiAgICAgICAgICAgIFNXSUcgYWxzbyBzdXBwb3J0cyBhY2Nlc3MgY2hhbmdlIHRocm91Z2ggdXNpbmcgZGVjbGFyYXRpb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHByb3RlY3RlZDoKICAgICAgICAgICAgICAgICAgICAgaW50IHg7CiAgICAgICAgICAgICAgICAgICAgIGludCBibGFoKGludCB4KTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgY2xhc3MgQmFyIDogcHVibGljIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIHVzaW5nIEZvbzo6eDsKICAgICAgICAgICAgICAgICAgICAgdXNpbmcgRm9vOjpibGFoOwogICAgICAgICAgICAgICAgfTsKCgogICAgICAgICAgICBDYXZlYXQ6ICAgU1dJRyBkb2VzIG5vdCBhY3R1YWxseSBjaGVjayB0byBzZWUgaWYgZGVjbGFyYXRpb25zIGltcG9ydGVkCiAgICAgICAgICAgIHZpYSAndXNpbmcnIGFyZSBpbiB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5LiAgSWYgdGhpcyBvY2N1cnMsIHRoZQogICAgICAgICAgICB3cmFwcGVyIGNvZGUgd29uJ3QgY29tcGlsZSBhbnl3YXlzLS0tbm90IHN1cmUgaXQncyB3b3J0aCB3b3JyeWluZyBhYm91dC4KICAgICAgICAgIAowOC8xOC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1vZGlmaWVkIG92ZXJsb2FkaW5nIGRpc3BhdGNoIHRvIG5vdCBpbmNsdWRlIG5vZGVzIHdpdGggYW4gImVycm9yIiBhdHRyaWJ1dGUuCiAgICAgICAgICAgIEEgbGFuZ3VhZ2UgbW9kdWxlIGNhbiBzZXQgdGhpcyBpZiBhIG5vZGUgY291bGRuJ3QgYmUgd3JhcHBlZCBhbmQgeW91IGRvbid0IHdhbnQKICAgICAgICAgICAgaXQgaW5jbHVkZWQgaW4gdGhlIGRpc3BhdGNoIGZ1bmN0aW9uLgoKMDgvMTgvMjAwMjogYmVhemxleQogICAgICAgICAgICBFbmhhbmNlbWVudCB0byBvdmVybG9hZGVkIGZ1bmN0aW9uIGRpc3BhdGNoLiAgIFRoZSBkaXNwYXRjaGVyIGlzIG5vdyBhd2FyZSBvZgogICAgICAgICAgICBpbmhlcml0YW5jZSByZWxhdGlvbnNoaXBzLiAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7IH07CiAgICAgICAgICAgICAgICAgICBjbGFzcyBCYXIgOiBwdWJsaWMgRm9vIHsgfTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgIHZvaWQgc3BhbShGb28gKmYpOwogICAgICAgICAgICAgICAgICAgdm9pZCBzcGFtKEJhciAqYik7CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSBkaXNwYXRjaGVyIHJlLW9yZGVycyB0aGUgZnVuY3Rpb25zIHNvIHRoYXQgc3BhbShCYXIgKmIpIGlzCiAgICAgICAgICAgIGNoZWNrZWQgZmlyc3QtLS1pdCBpcyBtb3JlIHNwZWNpZmljIHRoYW4gc3BhbShGb28gKmYpLgoKMDgvMTcvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCAtV2Vycm9yIGNvbW1hbmQgbGluZSBvcHRpb24uICAgSWYgc3VwcGxpZWQsIHdhcm5pbmcgbWVzc2FnZXMgYXJlIHRyZWF0ZWQKICAgICAgICAgICAgYXMgZXJyb3JzIGFuZCBTV0lHIHdpbGwgcmV0dXJuIGEgbm9uLXplcm8gZXhpdCBjb2RlLgoKMDgvMTcvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDU5NjEzNSBdIFR5cGVkZWYgb2YgcmVmZXJlbmNlIGNhbid0IGNvbXBpbGUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgJkludFJlZjsKICAgICAgICAgICAgICAgICB2b2lkIGZvbyhJbnRSZWYgaSk7CgogICAgICAgICAgICBTV0lHLTEuMy4xNCBnZW5lcmF0ZWQgY29kZSB0aGF0IHdvdWxkbid0IGNvbXBpbGUuCgpWZXJzaW9uIDEuMy4xNCAoQXVndXN0IDEyLCAyMDAyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDgvMTEvMjAwMjogbW1hdHVzCgkgICAgU3RhdGljIGNvbnN0IG1lbWJlcnMgaW5pdGlhbGl6ZWQgZHVyaW5nIGRlY2xhcmF0aW9uLCBhbmQKCSAgICBvbmx5IHRoZW0sIGllOgoKCSAgICBzdHJ1Y3QgQQoJICAgIHsJCSAKCQlzdGF0aWMgY29uc3QgaW50IGEgPSAxIDsgIC8vIHRoaXMgb25lCgkJc3RhdGljIGNvbnN0IGludCBiOyAgICAgICAvLyBub3QgdGhpcyBvbmUKICAgICAgICAgICAgfTsgICAgIAoKCSAgICBhcmUgZW1pdHRlZCBsaWtlIGNvbnN0YW50cyAoZXF1aXZhbGVudCB0byBlbnVtcyBvcgoJICAgIGV4cGxpY2l0ICVjb25zdGFudCkuCgkgICAgCgkgICAgVGhpcyBpcyBiZWNhdXNlIHRoZXkgY2Fubm90IGJlIGFkZGVkIGRpcmVjdGx5IHRvICdjdmFyJwoJICAgIHNpbmNlIHRoZXkgbGFjayB0aGUgbmVlZGVkIHJlZmVyZW5jZSAod2VsbCwgeW91IGNhbiBmb3JjZQoJICAgIHRoZW0gdG8gaGF2ZSBhIHJlYWwgcmVmZXJlbmNlLCBidXQgaW4gYW4gdWdseSB3YXkgd2hpY2gKCSAgICBnb2VzIGNvbXBsZXRlbHkgYWdhaW4gdGhlIG9yaWdpbmFsIHB1cnBvc2Ugb2YgaW5pdGlhbGl6ZQoJICAgIHRoZW0gZHVyaW5nIGRlY2xhcmF0aW9uLCB5b3UgYWxzbyBoYXZlIHRvIGRlYWwgd2l0aCBleHRyYQoJICAgIGxpbmtpbmcgbWF0dGVycywgYW5kIGl0IHRha2UgYSB3aGlsZSB0byBmaWd1cmUgb3V0IHdoYXQgaXMKCSAgICB0aGUgcHJvYmxlbSBhbmQgaG93IHRvIHNvbHZlIGl0KS4KCSAgICAKCSAgICBQbGVhc2UgdGVzdCBpdCB3aXRoIHlvdXIgcHJlZmVycmVkIHRhcmdldCBsYW5ndWFnZSwgYW5kCgkgICAgbm90IG9ubHkgdGhlIGNvZGUgZ2VuZXJhdGlvbiwgYnV0IHJlYWxseSBydW4gdGhlIGV4YW1wbGUKCSAgICBpbiB0aGUgdGVzdC1zdWl0ZSAoc3RhdGljLWNvbnN0LW1lbWJlci0yLmkpIGJlY2F1c2UgdGhlCgkgICAgcHJvYmxlbSBhbmQgdGhlIHNvbHV0aW9uIGNhbm5vdCBiZSAiZnVsbHkiIGFwcHJlY2lhdGVkCgkgICAgdW50aWwgeW91IHRyeSB0byBsb2FkIHRoZSBtb2R1bGUgYW5kIHJ1biBpdC4KCgkgICAgSW4gc29tZSB0YXJnZXQgbGFuZ3VhZ2VzIChweXRob24gc3BlY2lhbGx5KSwgdGhpcyBjYW4KCSAgICBwcm9kdWNlcyBhIGRpZmZlcmVuY2UgaW4gdGhlIHdheSB0aGF0IHRoZSBzdGF0aWMgY29uc3RhbnQKCSAgICBtZW1iZXJzICdhJyBhbmQgJ2InIGFyZSBpbnRlcm5hbGx5IHdyYXBwZWQuIEhvcGVmdWxseSwKCSAgICB0aGV5IHN0aWxsIGNhbiBiZSBhY2Nlc3NlZCBpbiB0aGUgc2FtZSB3YXkuCgoKMDgvMTEvMjAwMjogbW1hdHVzCgkgICAgW3B5dGhvbl0gTm93IHN0YXRpYyBjb25zdCBtZW1iZXJzIGNhbiBiZSBhY2Nlc3NlZCBpbiBhIG1vcmUKCSAgICBuYXR1cmFsIHdheSwgaWUsIGlmIHlvdSBoYXZlCgoJICAgIHN0cnVjdCBBCiAgICAgICAgICAgICB7CQkgCgkJdHlwZWRlZiB1bnNpZ25lZCBpbnQgdmlld2ZsYWdzOwoJCXN0YXRpYyBjb25zdCB2aWV3ZmxhZ3MgZm9yd2FyZF9maWVsZCA9IDA7CgkJc3RhdGljIGNvbnN0IHZpZXdmbGFncyBiYWNrd2FyZF9maWVsZDsKICAgICAgICAgICAgfTsgICAgIAoJICAgIAoJICAgIG5vdyB5b3UgY2FuIGRvOgoKCQlwcmludCBBLmJhY2t3YXJkX2ZpZWxkCgoJICAgIGFuZCBhbHNvCgoJICAgICAgICBhID0gQSgpCgkJcHJpbnQgYS5mb3J3YXJkX2ZpZWxkCgkJCgkgICAgTm90ZSB0aGF0IGlmIHRoZSBzdGF0aWMgY29uc3QgbWVtYmVycyBkb24ndCBoYXZlIGFuCgkgICAgaW5pdGlhbGl6ZXIgKGxpa2UgYmFja3dhcmRfZmllbGQpLCBzdGlsbCB5b3UgY2FuIGFjY2VzcwoJICAgIHRoZW0gaW4gdGhlIHNhbWUgd2F5IGluIHRoZSBweXRob24gc2lkZSwgYnV0IHRoZQoJICAgIGltcGxlbWVudGF0aW9uIGlzIGEgcXVpdGUgZGlmZmVyZW50OiBiYWNrd2FyZF9maWVsZCB3aWxsCgkgICAgc3RpbGwgYXBwZWFyIGluIHRoZSBjdmFyIGVudGl0eSwgYW5kIGFsc28sIHlvdSBhcmUgCgkgICAgcmVzcG9uc2libGUgdG8gaW5pdGlhbGl6ZSBpdCBpbiBzb21lIGNvZGUgdW5pdCwgYW5kIGxpbmsgaXQKCSAgICBwcm9wZXJseS4gZm9yd2FyZF9maWVsZCwgYnkgdGhlIG90aGVyIGhhbmQsIHdpbGwgbm90CgkgICAgYXBwZWFyIGluIHRoZSBjdmFyIGVudGl0eSBidXQgb25seSBhcyBhIEEgbWVtYmVyLCBzaW1pbGFyCgkgICAgdG8gd2hhdCBoYXBwZW4gd2l0aCBlbnVtIG9yICVjb25zdGFudCBtZW1iZXJzLgoKMDgvMTEvMjAwMjogbW1hdHVzCgkgICAgW3B5dGhvbl0gQ29tbW9uIGNvZGUgaW4gdGhlIF9fc2V0YXR0cl9fL19fZ2V0YXR0cl9fIG5vdwoJICAgIGdvZXMgdG8gdHdvICJmcmVlIiBtZXRob2RzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHByb3h5CgkgICAgZmlsZSwgZnJvbSB3aGVyZSBlYWNoIGNsYXNzIHVzZSBpdC4gVGhpcyBjaGFuZ2UgcmVkdWNlcwoJICAgIHRoZSBzaXplIG9mIHRoZSBwcm94eSBmaWxlLCBzcGVjaWFsbHkgaWYgeW91IHdyYXAgYSBsb3Qgb2YKCSAgICBzbWFsbCBjbGFzc2VzIGluIG9uZSBtb2R1bGUgKHVwIHRvIDMzJSBpbiBzb21lIGNhc2VzKSwKCSAgICBtYWtpbmcgaXQgZmFzdGVyIHRvIGxvYWQgdG9vLgoKMDgvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBbUGVybDVdIElmIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGNoYXIgKiByZXR1cm5zIE5VTEwsCiAgICAgICAgICAgIHVuZGVmIGlzIHJldHVybmVkIHRvIHRoZSBQZXJsIGludGVycHJldGVyLgogCjA4LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4IHRvIGNvbnZlcnNpb24gb3BlcmF0b3JzIGFuZCBuYW1lc3BhY2VzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIG5zIHsKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsgfTsKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQmFyIHsKICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgRm9vKigpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBJbiB0aGUgd3JhcHBlciBjb2RlLCBTV0lHIHdhcyB1c2luZyAtPm9wZXJhdG9yIEZvbyooKQogICAgICAgICAgICB3aGVuIGl0IHNob3VsZCBoYXZlIGJlZW4gdXNpbmcgLT5vcGVyYXRvciBuczo6Rm9vKigpLgoKICAgICAgICAgICAgTm90ZTogaWYgdXNpbmcgJXJlbmFtZSB3aXRoIGEgY29udmVyc2lvbiBvcGVyYXRvciwgeW91CiAgICAgICAgICAgIG1pZ2h0IGhhdmUgdG8gZG8gdGhpczoKCiAgICAgICAgICAgICAgICVyZW5hbWUodG9Gb29QdHIpIG5zOjpvcGVyYXRvciBuczo6Rm9vKigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgXl5eXiBub3RlIGV4dHJhIHF1YWxpZmllcgogICAgICAgICAgICAgICBuYW1lc3BhY2UgbnMgewogICAgICAgICAgICAgICAgICAgIC4uLgoKICAgICAgICAgICAgCjA4LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW1B5dGhvbl0gTWlub3IgZW5oYW5jZW1lbnQgdG8gJ2NvbnN0JyB2YXJpYWJsZSBkZWNsYXJhdGlvbnMuIAogICAgICAgICAgICBOb3JtYWxseSBjb25zdCBkZWNsYXJhdGlvbnMgYXJlIHdyYXBwZWQgYXMgcmVhZC1vbmx5IHZhcmlhYmxlcwogICAgICAgICAgICBhY2Nlc3NpYmxlIG9ubHkgdGhyb3VnaCB0aGUgY3ZhciBhdHRyaWJ1dGUgKHNlZSBTV0lHLmh0bWwgZm9yCiAgICAgICAgICAgIGEgZGlzY3Vzc2lvbiBvZiB3aHkpLiAgSG93ZXZlciwgaW4gbWFueSBwcm9ncmFtcywgImNvbnN0IiAKICAgICAgICAgICAgZGVjbGFyYXRpb25zIG1heSBqdXN0IGJlIGNvbnN0YW50cy0tLW1ha2luZyB0aGUgY3Zhci4gYWNjZXNzCiAgICAgICAgICAgIGF3a3dhcmQuICBUbyBmaXggdGhpcywgImNvbnN0IiBkZWNsYXJhdGlvbnMgYXJlIG5vdyBhdmFpbGFibGUKICAgICAgICAgICAgYm90aCB0aHJvdWdoIGN2YXIuIGFuZCBhcyBhIHNpbXBsZSBuYW1lLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIGNvbnN0IGludCBGT08gPSA0MjsKCiAgICAgICAgICAgIEluIFB5dGhvbjoKCiAgICAgICAgICAgICAgICAgPj4+IHByaW50IGV4YW1wbGUuY3Zhci5GT08KICAgICAgICAgICAgICAgICA0MgogICAgICAgICAgICAgICAgID4+PiBwcmludCBleGFtcGxlLkZPTwogICAgICAgICAgICAgICAgIDQyCgogICAgICAgICAgICBOb3RlOiBUaGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhlIHZhbHVlIG9mIGEgImNvbnN0IiB2YXJpYWJsZQogICAgICAgICAgICBtaWdodCBjaGFuZ2UuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgY2hhciAqY29uc3QgQkFSID0gIkhlbGxvIFdvcmxkIjsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIHBvaW50ZXIgaXRzZWxmIGNhbiBub3QgY2hhbmdlLCBidXQgdGhlIAogICAgICAgICAgICBkYXRhIGJlaW5nIHBvaW50ZWQgdG8gY291bGQgYmUgbW9kaWZpZWQuICBJbiB0aGVzZSBzaXR1YXRpb25zLAogICAgICAgICAgICBjdmFyLkJBUiBzaG91bGQgYmUgYWNjZXNzZWQgdG8gb2J0YWluZWQgdGhlIGN1cnJlbnQgdmFsdWUuCgowOC8wOC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtQeXRob25dIEZpeGVkIGdlbmVyYXRpb24gb2YgdGhlIHByb3h5IGNvZGUgKC5weSBmaWxlcykgdG8gbW9yZQogICAgICAgICAgICBjbG9zZWx5IGZvbGxvdyB0aGUgb3JkZXIgb2YgZGVjbGFyYXRpb25zIGFzIHRoZXkgYXBwZWFyIGluCiAgICAgICAgICAgIHRoZSAuaSBmaWxlLiAgIEluIHRoZSBwYXN0LCBhbGwgb2YgdGhlIGNsYXNzIHdyYXBwZXJzIGFwcGVhcmVkCiAgICAgICAgICAgIGZpcnN0LCBmb2xsb3dlZCBieSBmdW5jdGlvbiBzdHVicywgaW5zZXJ0ZWQgUHl0aG9uIGNvZGUsIGFuZAogICAgICAgICAgICBvdGhlciBkZXRhaWxzLgoKMDgvMDgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBQcm94eSBtZXRob2QgX2RlbGV0ZSgpIGNoYW5nZWQgdG8gZGVsZXRlKCkuIFRoZXJlIHNob3VsZG4ndCBldmVyCiAgICAgICAgICAgIGJlIGEgd3JhcHBlZCBmdW5jdGlvbiBjYWxsZWQgZGVsZXRlKCkgYXMgaXQgaXMgYSBDKysga2V5d29yZCBhbmQgdGhlcmUKICAgICAgICAgICAgaXMgbm8gc3VjaCB0aGluZyBhcyBhIG1lbWJlciBmdW5jdGlvbiBpbiBDLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKICAgICAgICAgICAgQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgY2FuIGJlIGFjaGlldmVkIGJ5IGFkZGluZyB0aGUgZnVuY3Rpb24gYmFjayBpbgogICAgICAgICAgICBmb3IgYWxsIHByb3h5IGNsYXNzZXM6CiAgICAgICAgICAgICV0eXBlbWFwKGphdmFjb2RlKSBTV0lHVFlQRSAlewogICAgICAgICAgICAgIHB1YmxpYyB2b2lkIF9kZWxldGUoKSB7CiAgICAgICAgICAgICAgICBkZWxldGUoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICV9CgogICAgICAgICAgICBKYXZhIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHN1bW1hcnkKICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICAgICAgICBUaGVyZSBhcmUgYSBudW1iZXIgb2YgY2hhbmdlcyB0aGF0IGhhdmUgYmVlbiBtYWRlIGluIGltcHJvdmluZyB0aGUgSmF2YSBtb2R1bGUgCiAgICAgICAgICAgIGZvciB2ZXIgMS4zLjE0LiAgSWYgYXQgYWxsIHBvc3NpYmxlIGNoYW5nZSB5b3VyIGNvZGUgdG8gdGFrZSBhZHZhbnRhZ2VzIG9mIHRoZSAKICAgICAgICAgICAgaW1wcm92ZW1lbnRzLiBJZiB5b3Ugd2VyZSB1c2luZyBwcm94eSBjbGFzc2VzIHlvdSBtYXkgbm90IG5vdGljZSBhbnkgYmFja3dhcmRzIAogICAgICAgICAgICBjb21wYXRpYmlsaXR5IGlzc3Vlcy4gSGVyZSBpcyBhbiBleGFtcGxlIHdoaWNoIHdpbGwgaGVscCB3aXRoIG1vc3QgYmFja3dhcmRzIAogICAgICAgICAgICBjb21wYXRpYmlsaXR5IHByb2JsZW1zIHdoZXJlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBtb2RpZnkgdGhlIGNvZGUgdGhhdCB1c2VzCiAgICAgICAgICAgIHRoZSBnZW5lcmF0ZWQgb3V0cHV0OgoKICAgICAgICAgICAgUmVwbGFjZToKICAgICAgICAgICAgICAgICVtb2R1bGUgbW9kdWxlbmFtZQoKICAgICAgICAgICAgV2l0aDoKICAgICAgICAgICAgICAgICVtb2R1bGUgKGpuaWNsYXNzbmFtZT0ibW9kdWxlbmFtZSIpIG1vZHVsZW5hbWU7CiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhY29kZSkgU1dJR1RZUEUgJXsKICAgICAgICAgICAgICAgICAgICBwdWJsaWMgbG9uZyBnZXRDUHRyJGphdmFjbGFzc25hbWUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzd2lnQ1B0cjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgX2RlbGV0ZSgpIHsKICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgICAlcHJhZ21hKGphdmEpIGpuaWNsYXNzY2xhc3Ntb2RpZmllcnM9InB1YmxpYyI7CgogICAgICAgICAgICBUaGUgcHJveHkgY29uc3RydWN0b3JzIHRoYXQgdG9vayBwYXJhbWV0ZXJzIChsb25nIGNQdHIsIGJvb2xlYW4gY01lbW9yeU93bikKICAgICAgICAgICAgd2VyZSBwdWJsaWMgYW5kIGFyZSBub3cgcHJvdGVjdGVkLiBJZiB5b3Ugd2VyZSBtYWtpbmcgdXNlIG9mIHRoZXNlIHRoZW4geW91J2xsIAogICAgICAgICAgICBoYXZlIHRvIG1vZGlmeSB5b3VyIGNvZGUgYW5kIHRoZSBiZXN0IHNvbHV0aW9uIHdvdWxkIGJlIHRvIHVzZSB0aGUgbmV3IHR5cGUgCiAgICAgICAgICAgIHdyYXBwZXIgY2xhc3Nlcy4KCiAgICAgICAgICAgIFRoZSBvdGhlciBtYWluIGFyZWFzIGFyZSB0aGUgcHJhZ21hcyBhbmQgZ2xvYmFsIHZhcmlhYmxlIHdyYXBwaW5nLiBSZXBsYWNlIAogICAgICAgICAgICB0aGUgcHJhZ21hcyB3aXRoIG9uZSBvZiB0aGUgbmV3IGRpcmVjdGl2ZXMgb3IgdHlwZW1hcHMgbWVudGlvbmVkIGJlbG93IGFuZCB1c2UKICAgICAgICAgICAgJXJlbmFtZSBvbiB0aGUgdmFyaWFibGVzLgoKICAgICAgICAgICAgSWYgeW91IHdlcmUgbm90IHVzaW5nIHByb3h5IGNsYXNzZXMsIHlvdSB3aWxsIGhhdmUgdG8gZGVmaW5lIGEganN0eXBlIHR5cGVtYXAKICAgICAgICAgICAgYXMgd2VsbCBhcyBhIGp0eXBlIHR5cGVtYXAuCgowOC8wOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeCBmb3Igd3JhcHBpbmcgdHdvIGRpbWVuc2lvbiBhcnJheSB2YXJpYWJsZXMuCgowOC8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtQeXRob24sVGNsXQogICAgICAgICAgICBPYmplY3QgbWFuYWdlbWVudCBub3cgaGFzIGEgbXVjaCBiZXR0ZXIgc2Vuc2Ugb2Ygb3duZXJzaGlwLgogICAgICAgICAgICBPd25lcnNoaXAgYml0cyBpcyBjaGFuZ2VkIHdoZW5ldmVyIGFuIG9iamVjdCBpcyBzdG9yZWQgaW4gYQogICAgICAgICAgICBnbG9iYWwgdmFyaWFibGUgb3Igc3RydWN0dXJlIG1lbWJlci4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICAgIGludCB2YWw7CiAgICAgICAgICAgICAgICAgICAgRm9vICpuZXh0OwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIE5vdyBpbiBQeXRob24KCiAgICAgICAgICAgICAgID4+PiBmID0gRm9vKCkKICAgICAgICAgICAgICAgPj4+IGYudGhpc293bgogICAgICAgICAgICAgICAxCiAgICAgICAgICAgICAgID4+PiBnID0gRm9vKCkKICAgICAgICAgICAgICAgPj4+IGcubmV4dCA9IGYgICAgICAgICAgIyBBc3NpZ24gYSBwb2ludGVyCiAgICAgICAgICAgICAgID4+PiBmLnRoaXNvd24gICAgICAgICAgICMgTm90aWNlIG93bmVyc2hpcCBjaGFuZ2UKICAgICAgICAgICAgICAgMAogICAgICAgICAgICAgICA+Pj4KCiAgICAgICAgICAgIFRoaXMgc2NoZW1lIGlzIG1vc3RseSBhIGNvbnNlcnZhdGl2ZSBoZXVyaXN0aWMgZGVzaWduZWQgdG8gCiAgICAgICAgICAgIHByb3ZpZGUgc2VnbWVudGF0aW9uIGZhdWx0cy4gIEl0IGNvdWxkIGNhdXNlIGEgbWVtb3J5IGxlYWsKICAgICAgICAgICAgaWYgb3duZXJzaGlwIGlzIGNoYW5nZWQgdW5uZWNlc3NhcmlseS4gIEluIHRoaXMgY2FzZSwgeW91IGNhbgogICAgICAgICAgICBlaXRoZXIgd3JpdGUgYSB0eXBlbWFwICh0aGF0IGRvZXNuJ3QgY2hhbmdlIG93bmVyc2hpcCksIG9yCiAgICAgICAgICAgIG1hbnVhbGx5IHNldCB0aGUgdGhpc293biBhdHRyaWJ1dGUgYmFjayB0byAxLgoKMDgvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBbVGNsXSBNYWpvciB1c2FiaWxpdHkgaW1wcm92ZW1lbnRzIHRvIHRoZSBvYmplY3QgaW50ZXJmYWNlLgogICAgICAgICAgICBTdXBwb3NlIHlvdSBoYWQgY29kZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgIHN0cnVjdCBGb28geyAKICAgICAgICAgICAgICAgICAgICAgaW50IHg7CiAgICAgICAgICAgICAgICAgICAgIGludCBzcGFtKCk7CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgdm9pZCAgYmxhaChGb28gKmYpOwoKICAgICAgICAgICAgSW4gcGFzdCB2ZXJzaW9ucyBvZiBTV0lHLCB5b3UgY291bGQgY3JlYXRlIG9iamVjdHMgYW5kIHVzZQogICAgICAgICAgICB0aGVtIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAlIEZvbyBmCiAgICAgICAgICAgICAgICAlIGYgY29uZmlndXJlIC14IDMKICAgICAgICAgICAgICAgICUgZiBzcGFtCiAgICAgICAgICAgICAgICAzNwogICAgCiAgICAgICAgICAgIFRoZSBvbmx5IHByb2JsZW0gaXMgdGhhdCBpZiB5b3UgdHJpZWQgdG8gY2FsbCBibGFoKCksIGl0IGRpZG4ndAogICAgICAgICAgICB3b3JrOgoKICAgICAgICAgICAgICAgICUgYmxhaCBmCiAgICAgICAgICAgICAgICBUeXBlIEVycm9yLiBFeHBlY3RlZCBfcF9Gb28KICAgICAgICAgICAgICAgICUKCiAgICAgICAgICAgIEluc3RlYWQsIHlvdSBoYWQgdG8gZG8gdGhpczoKCiAgICAgICAgICAgICAgICAlIGJsYWggW2YgY2dldCAtdGhpc10KICAKICAgICAgICAgICAgU1dJRyBub3cgYXV0b21hdGljYWxseSBleHRyYWN0cyB0aGUgLXRoaXMgcG9pbnRlciwgYXZvaWRpbmcgdGhpcwogICAgICAgICAgICBwcm9ibGVtLiAgVGhpcyBtZWFucyB0aGF0IHNheWluZyAiYmxhaCBmIiBpcyBwZXJmZWN0bHkgbGVnYWwgYW5kCiAgICAgICAgICAgIGV2ZXJ5dGhpbmcgd2lsbCBzdGlsbCB3b3JrIG5vcm1hbGx5LgoKICAgICAgICAgICAgQ2F2ZWF0OiBTaW5jZSBwb2ludGVyIHN0cmluZ3Mgc3RhcnQgd2l0aCBhIGxlYWRpbmcgdW5kZXJzY29yZSAoXyksCiAgICAgICAgICAgIGRvbid0IHVzZSB0aGlzIGluIG9iamVjdCBuYW1lcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICUgRm9vIF9mIAogICAgICAgICAgICAgICAgJSBibGFoIF9mICAgICAgICAjIFBvdGVudGlhbCBjcmFzaAoKICAgICAgICAgICAgT2JqZWN0cyBub3cgaGF2ZSBhIC10aGlzb3duIGF0dHJpYnV0ZSB0aGF0IHNob3dzIHRoZSBvd25lcnNoaXAuCiAgICAgICAgICAgIFRoaXMgYnVpbGRzIHVwb24gdGhlIENIQU5HRVMgMTEvMjQvMjAwMSBlbnRyeS4KCjA4LzA3LzIwMDI6IHNhbWphbSwgU2FtIExpZGRpY290dAogICAgICAgICAgICBQcm9wZXJseSBpbXBsZW1lbnRlZCBwb2ludGVyIHN5c3RlbSB1c2luZyBwaHAgcmVzb3VyY2VzLgogICAgICAgICAgICBTdGlsbCBuZWVkIHRvIHdvcmsgb3V0IHdoZXRoZXIgb3Igbm90IHRvIGxldCBzY3JpcHQtdXNlcnMgY2FsbAogICAgICAgICAgICBkZXN0cnVjdG9ycyBkaXJlY3RseQoKMDgvMDYvMjAwMjogYmVhemxleQogICAgICAgICAgICBVcGdyYWRlZCBtenNjaGVtZSBtb2R1bGUgdG8gc3VwcG9ydCB2ZXJzaW9uIDIwMSBhbmQgYWRkZWQKICAgICAgICAgICAgb3ZlcmxvYWRpbmcgc3VwcG9ydC4KCjA4LzA1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgcGFyc2luZyBzdXBwb3J0IGZvciBleHRyYSBncm91cGluZyAoaW4gdmVyeSBsaW1pdGVkIGNhc2VzKS4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IChGdW5jUHRyKShpbnQsIGRvdWJsZSk7CgogICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMICoqKgogICAgICAgICAgICAKMDgvMDMvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIFVwZGF0ZXMgdG8gdHlwZW1hcHMuaSBhcyB0aG9zZSBkb25lIHByZXZpb3VzbHkgZm9yIFBlcmwsCiAgICAgICAgICAgIFB5dGhvbiBhbmQgVGNsIG1vZHVsZXMuIE5vdyBzdXBwb3J0cyByZWZlcmVuY2UgdHlwZXMgd2l0aCBJTlBVVCwKICAgICAgICAgICAgT1VUUFVUIGFuZCBJTk9VVCB0eXBlbWFwcy4KCjA4LzAyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmV3IGxpYnJhcnkgZmlsZSBjc3RyaW5nLmkgYWRkZWQuICBQcm92aWRlcyBtYWNyb3MgZm9yCiAgICAgICAgICAgIG1hbmlwdWxhdGluZyBjaGFyICogZGF0YS4KIAowOC8wMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIERlcHJlY2F0ZWQgdGhlICVuZXcgZGlyZWN0aXZlLiAgVXNlICVuZXdvYmplY3QgaW5zdGVhZC4gIEZvcgogICAgICAgICAgICBleGFtcGxlOgoKICAgICAgICAgICAgICAgJW5ld29iamVjdCBmb287CiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICBjaGFyICpmb28oKTsKCiAgICAgICAgICAgICVuZXdvYmplY3QgZm9sbG93cyB0aGUgc2FtZSBydWxlcyBhcyAlcmVuYW1lLCAlaWdub3JlLCAlZmVhdHVyZSwKICAgICAgICAgICAgZXRjLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgowOC8wMS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIE5ldyBhdHRyaWJ1dGUgJ2puaWNsYXNzbmFtZScgZm9yIHRoZSBtb2R1bGUgZGlyZWN0aXZlIGFsbG93cyBhIHdheSBvZgogICAgICAgICAgICBjaGFuZ2luZyB0aGUgSk5JIGNsYXNzIG5hbWUgZnJvbSB0aGUgZGVmYXVsdCB3aGljaCB1c2VzIHRoZSBtb2R1bGVuYW1lIHdpdGggSk5JCiAgICAgICAgICAgIGFwcGVuZGVkIGFmdGVyIGl0LgoKICAgICAgICAgICAgICAgICVtb2R1bGUgKGpuaWNsYXNzbmFtZT0ibmFtZSIpIG1vZHVsZW5hbWUKCiAgICAgICAgICAgIElmICduYW1lJyBpcyB0aGUgc2FtZSBhcyAnbW9kdWxlbmFtZScgdGhlbiB0aGUgbW9kdWxlIGNsYXNzIG5hbWUgZ2V0cyBjaGFuZ2VkCiAgICAgICAgICAgIGZyb20gJ21vZHVsZW5hbWUnIHRvIG1vZHVsZW5hbWVNb2R1bGUuCgowOC8wMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBmaWxlIGluY2x1ZGUgb3JkZXIuICBMYW5ndWFnZSBzcGVjaWZpYwogICAgICAgICAgICBkaXJlY3RvcmllcyBzaG91bGQgdGFrZSBwcmVjZWRlbmNlIG92ZXIgZ2VuZXJpYyBkaXJlY3Rvcmllcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6ICAic3dpZ19saWIvcHl0aG9uL2Zvby5pIiBzaG91bGQgYmUgbG9hZGVkIGJlZm9yZQogICAgICAgICAgICAic3dpZ19saWIvZm9vLmkiLiAgICBJIHRob3VnaHQgdGhpcyB3YXMgdGhlIGNhc2UgYWxyZWFkeSwgYnV0CiAgICAgICAgICAgIGFwcGFyZW50bHkgaXQgaGFzIGJlZW4gYnJva2VuIGZvciBxdWl0ZSBzb21lIHRpbWUuCgowOC8wMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIHN0ZF9kZXF1ZS5pIGxpYnJhcnkgZmlsZS4gIFdvcmsgaW4gcHJvZ3Jlc3MuCgowOC8wMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtQeXRob24sVGNsLFBlcmxdCiAgICAgICAgICAgIEltcHJvdmVtZW50cyB0byB0eXBlbWFwcy5pLiAgSU5QVVQvSU5PVVQgdHlwZW1hcHMgcGVyZm9ybSBiZXR0ZXIKICAgICAgICAgICAgZXJyb3IgY2hlY2tpbmcuICBUeXBlbWFwcyBhcmUgbm93IHN1cHBsaWVkIGZvciByZWZlcmVuY2VzIGxpa2UgCiAgICAgICAgICAgIGludCAmT1VUUFVULCBkb3VibGUgJklOT1VULCBldGMuCiAgICAgICAgICAKMDgvMDEvMjAwMjogYmVhemxleQogICAgICAgICAgICBbUHl0aG9uXSBEZXByZWNhdGVkIHRoZSBUXyogYW5kIExfKiB0eXBlbWFwcyBpbiB0eXBlbWFwcy5pLgogICAgICAgICAgICBNdWx0aXBsZSByZXR1cm4gdmFsdWVzIGFyZSBhbHdheXMgcGxhY2VkIGluIGEgdHVwbGUuIERlcHJlY2F0ZWQKICAgICAgICAgICAgdGhlIEJPVEggdHlwZW1hcHMuICBUaGlzIGlzIG5vdyBJTk9VVCAoZS5nLiwgaW50ICpJTk9VVCkuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgUFlUSE9OIE1PRFVMRSAqKioKCjA4LzAxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRGVwcmVjYXRlZCB0aGUgYXJyYXkuaSwgY2FycmF5LmksIGFuZCB0aW1lci5pIGxpYnJhcnkgZmlsZXMuCgowOC8wMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIERlcHJlY2F0ZWQgdGhlIHBvaW50ZXIuaSBsaWJyYXJ5IGZpbGUuICBVc2UgY3BvaW50ZXIuaSBpbnN0ZWFkLgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgCjA4LzAxLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRm9yIGNvbnNpc3RlbmN5IHRoZSBnbG9iYWwgdmFyaWFibGUgZ2V0dGVycyBhbmQgc2V0dGVycyB1c2UgdGhlIEphdmFCZWFuIAogICAgICAgICAgICBwcm9wZXJ0eSBkZXNpZ24gcGF0dGVybiBsaWtlIG1lbWJlciB2YXJpYWJsZXMgYWx3YXlzIGhhdmUuIFRoaXMgbWVhbnMgaWYgeW91IGFyZSAKICAgICAgICAgICAgd3JhcHBpbmcgYSB2YXJpYWJsZSBjYWxsZWQgZm9vLCB0aGUgZ2V0dGVyIGlzIGNhbGxlZCBnZXRGb28oKSBhbmQgdGhlIHNldHRlciBpcyAKICAgICAgICAgICAgY2FsbGVkIHNldEZvbygpLiBCZWZvcmUgdGhlIHJlY2VudCBjaGFuZ2VzIHRvIHRoZSBKYXZhIG1vZHVsZSB0aGUgZ2V0dGVycyBhbmQgCiAgICAgICAgICAgIHNldHRlcnMgd2VyZSBjYWxsZWQgZ2V0X2ZvbygpIGFuZCBzZXRfZm9vKCkuIElmIHlvdSByZWFsbHkgd2FudCB0aGUgb3JpZ2luYWwgCiAgICAgICAgICAgIGZ1bmN0aW9uIG5hbWVzIHVzZSB0aGUgJXJlbmFtZSBkaXJlY3RpdmUgbGlrZSB0aGlzOiAlcmVuYW1lKF9mb28pIEZvbzsKCjA3LzMxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgY2FzdGluZyBwcm9ibGVtIHdpdGggbXVsdGlwbGUgaW5oZXJpdGFuY2UuICBJZiB5b3UgaGFkIHRoaXMsCgogICAgICAgICAgICAgICAgICBjbGFzcyBmb28ge307CiAgICAgICAgICAgICAgICAgIGNsYXNzIGJhciA6IHB1YmxpYyBmb28ge307CiAgICAgICAgICAgICAgICAgIGNsYXNzIGJheiA6IHB1YmxpYyBmb28ge307CiAgICAgICAgICAgICAgICAgIGNsYXNzIHNwYW0gOiBwdWJsaWMgYmFyLCBwdWJsaWMgYmF6IHt9OwoKICAgICAgICAgICAgdGhlbiB0aGUgd3JhcHBlcnMgd291bGRuJ3QgY29tcGlsZSBkdWUgdG8gYW4gYW1iaWd1b3VzIGNhc3QuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEFydCBZZXJrZXMuCgowNy8zMC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIER1ZSB0byBuZXcgc3RhdGljIHR5cGVjaGVja2luZyBhbGwgcG9pbnRlcnMgaGVsZCBpbiBhIEphdmEgbG9uZyBhcmUgcGFydCBvZiAKICAgICAgICAgICAgdGhlIGludGVybmFsIHdvcmtpbmdzIGFuZCB0aGlzIHBvaW50ZXIgdmFsdWUgaW4gdGhlIEphdmEgbG9uZyBoYXMgYmVjb21lIGFic3RyYWN0ZWQKICAgICAgICAgICAgZGF0YS4gVGhlIHR5cGUgd3JhcHBlciBjb25zdHJ1Y3RvciBhbmQgZ2V0Q1B0cigpIG1ldGhvZHMgYXJlIGFzIHN1Y2ggcHJvdGVjdGVkLgogICAgICAgICAgICBJZiB5b3UgbmVlZCB0byBtZXNzIGFyb3VuZCB3aXRoIHBvaW50ZXJzIGZyb20gSmF2YSBvciBmb3IgZXhhbXBsZSBjcmVhdGUgYSBwcm94eSAKICAgICAgICAgICAgY2xhc3Mgb3IgdHlwZSB3cmFwcGVyIGNsYXNzIGFyb3VuZCBhIG51bGwgcG9pbnRlciwgYWRkIGEgZnVuY3Rpb24vY29uc3RydWN0b3IgCiAgICAgICAgICAgIHRvIGRvIHNvIHdpdGggdGhlICVqYXZhY29kZSB0eXBlbWFwLiBZb3UgY2FuIGFsc28gbWFrZSBnZXRDUHRyKCkgcHVibGljIGFnYWluIHdpdGgKICAgICAgICAgICAgdGhlICVqYXZhZ2V0Y3B0ciB0eXBlbWFwLgoKMDcvMzAvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXhlcyBmb3IgJXR5cGVtYXAoaWdub3JlKS4gSW4gcGFydGljdWxhciB3aGVuIGlnbm9yaW5nIHRoZSBsYXN0IHBhcmFtZXRlcgogICAgICAgICAgICBpbiBhIGZ1bmN0aW9uLiBBbHNvIGZvciBhbGwgcGFyYW1ldGVycyBpbiBjb25zdHJ1Y3RvcnMuIFRoZXNlIG1vZHMgaGF2ZSBhbHNvIGZpeGVkCiAgICAgICAgICAgIG11bHRpLWFyZ3VtZW50IHR5cGVtYXBzIGZvciBwcm94eSBjbGFzc2VzIC0gU0YgNTgxNzkxLgoKMDcvMzAvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSAlbmV3b2JqZWN0IChyZXBsYWNlbWVudCBmb3IgJW5ldykgbm93IGltcGxlbWVudGVkIGZvciBKYXZhLiAKCjA3LzI5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIHR5cGVtYXAgY29waWVzLCAlYXBwbHksIGFuZCAlY2xlYXIgaW5zaWRlCiAgICAgICAgICAgIEMrKyBuYW1lc3BhY2VzLgoKMDcvMjgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBUaGUgSk5JIGNsYXNzIG5vdyBoYXMgcGFja2FnZSBhY2Nlc3MgYXMgdGhlIGNsYXNzIG1vZGlmaWVyCiAgICAgICAgICAgIGhhcyBiZWVuIGNoYW5nZWQgZnJvbSAicHVibGljIiB0byBub3RoaW5nLiBUaGlzIGhhcyBiZWVuIGRvbmUKICAgICAgICAgICAgYXMgdGhpcyBjbGFzcyBpcyBub3cgbW9yZSBmb3IgdGhlIGludGVybmFsIHdvcmtpbmdzIG9mIFNXSUcgc2luY2UgdGhlIG1vZHVsZQogICAgICAgICAgICBjbGFzcyBoYXMgc3RhdGljIHR5cGUgY2hlY2tpbmcgZm9yIGFsbCB0eXBlcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCiAgICAgICAgICAgIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGNhbiBiZSBhY2hpZXZlZCBieSB1c2luZyB0aGUgJWpuaWNsYXNzY2xhc3Ntb2RpZmllciAKICAgICAgICAgICAgcHJhZ21hIHRvIGNoYW5nZSBpdCBiYWNrIHRvICJwdWJsaWMiLgoKMDcvMjgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBQcm94eS9TaGFkb3cgY2xhc3NlcyBhcmUgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQuIFRoZSAtcHJveHkgYW5kIAogICAgICAgICAgICAtc2hhZG93IGNvbW1hbmQgbGluZSBvcHRpb25zIGFyZSBkZXByZWNhdGVkLiBJZiB5b3Ugd2FudCB0byB1c2UgdGhlIAogICAgICAgICAgICBsb3ctbGV2ZWwgZnVuY3Rpb25hbCBpbnRlcmZhY2UgdGhlbiB1c2UgdGhlIG5ldyAtbm9wcm94eSBjb21tYW5kbGluZSBvcHRpb24uCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNy8yOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFJlbWFpbmluZyBwcmFnbWFzIHNoYWtldXAuIFRoZXNlIHdlcmUgdGhlIHJlbWFpbmluZyBwcmFnbWFzIGFuZCB0aGVpcgogICAgICAgICAgICBuZXcgbmFtZXMgd2hlcmUgY2hhbmdlZDoKCiAgICAgICAgICAgIG1vZHVsZWJhc2UKICAgICAgICAgICAgbW9kdWxlY29kZQogICAgICAgICAgICBtb2R1bGVjbGFzc21vZGlmaWVycwogICAgICAgICAgICBtb2R1bGVpbXBvcnQgPT4gbW9kdWxlaW1wb3J0cwogICAgICAgICAgICBtb2R1bGVpbnRlcmZhY2UgPT4gbW9kdWxlaW50ZXJmYWNlcwoKICAgICAgICAgICAgVGhlIG1vZHVsZWltcG9ydHMgd29ya3Mgc2xpZ2h0bHkgZGlmZmVyZW50bHkgdG8gaG93IHRoZSBtb2R1bGVpbXBvcnQgcHJhZ21hIHdvcmtlZC4gCiAgICAgICAgICAgIE5vdyBpdCBhY3R1YWxseSB0YWtlcyBjb2RlIHdoaWNoIGdldHMgcGxhY2VkIGJlZm9yZSB0aGUgY2xhc3MgZGVmaW5pdGlvbiBzbyB0aGUgCiAgICAgICAgICAgIHdob2xlIGltcG9ydCBzdGF0ZW1lbnQgaGFzIHRvIGJlIGdpdmVuLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICVwcmFnbWEoamF2YSkgbW9kdWxlaW1wb3J0cz0lewogICAgICAgICAgICBpbXBvcnQgamF2YS5pby4qOwogICAgICAgICAgICBpbXBvcnQgamF2YS5tYXRoLio7CiAgICAgICAgICAgICV9CgogICAgICAgICAgICBUaGUgbW9kdWxlaW50ZXJmYWNlcyBpcyBzbGlnaHRseSBkaWZmZXJlbnQgdG8gdGhlIG9sZCBtb2R1bGVpbnRlcmZhY2UgaW4gdGhhdCBpZiAKICAgICAgICAgICAgbW9yZSB0aGFuIG9uZSBpbnRlcmZhY2UgaXMgcmVxdWlyZWQgdGhleSBtdXN0IGJlIGNvbW1hIHNlcGFyYXRlZCBpbiBvbmUgdXNlIG9mIAogICAgICAgICAgICB0aGUgcHJhZ21hLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICVwcmFnbWEoamF2YSkgbW9kdWxlaW50ZXJmYWNlcz0iU2VyaWFsaXphYmxlLCBNeUludGVyZmFjZSIKCiAgICAgICAgICAgIFRoZXNlIGxhc3QgdHdvIHByYWdtYXMgYXJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgamF2YWludGVyZmFjZXMgYW5kIGphdmFpbXBvcnRzIAogICAgICAgICAgICB0eXBlbWFwLgoKICAgICAgICAgICAgQSBzaW1pbGFyIHNldCBvZiBwcmFnbWFzIGhhcyBiZWVuIGludHJvZHVjZWQsIG5hbWVseToKCiAgICAgICAgICAgIGpuaWNsYXNzYmFzZQogICAgICAgICAgICBqbmljbGFzc2NvZGUKICAgICAgICAgICAgam5pY2xhc3NjbGFzc21vZGlmaWVycwogICAgICAgICAgICBqbmljbGFzc2ltcG9ydAogICAgICAgICAgICBqbmljbGFzc2ludGVyZmFjZQoKICAgICAgICAgICAgVGhlc2Ugd29yayBpbiB0aGUgc2FtZSB3YXkgYXMgdGhlaXIgbW9kdWxlIGNvdW50ZXJwYXJ0cy4gTm90ZSB0aGF0IHByZXZpb3VzbHkKICAgICAgICAgICAgdGhlIG1vZHVsZVhYWCBwcmFnbWFzIHdvcmtlZCBvbiB0aGUgb2xkIG1vZHVsZSBjbGFzcyB3aGljaCBpcyBub3cgY2FsbGVkIHRoZQogICAgICAgICAgICBKTkkgY2xhc3MgKHRoZSBjbGFzcyB3aXRoIHRoZSBuYXRpdmUgZnVuY3Rpb25zKS4gVGhlIGpuaWNsYXNzWFhYIHByYWdtYXMgbm93IAogICAgICAgICAgICB3b3JrIG9uIHRoZSBuZXcgbW9kdWxlIGNsYXNzICh0aGUgY2xhc3MgdGhhdCBoYXMgYWxsIHRoZSBnbG9iYWwgZnVuY3Rpb25zIGFuZAogICAgICAgICAgICBnbG9iYWwgdmFyaWFibGUgZ2V0dGVycyBhbmQgc2V0dGVycyB3aGVuIHVzaW5nIHByb3h5IGNsYXNzZXMsIHBsdXMgYWxsIG90aGVyCiAgICAgICAgICAgIHJlbWFpbmluZyBmdW5jdGlvbnMgd2hlbiB1c2luZyB0aGUgbG93LWxldmVsIHByb2NlZHVyYWwgaW50ZXJmYWNlKS4KCiAgICAgICAgICAgIEluIHN1bW1hcnkgdGhlIGNvbnRlbnRzIG9mIHRoZSBwcmFnbWFzIG1ha2UgdXAgYSBjbGFzcyBsaWtlIHRoaXM6CgogICAgICAgICAgICA8am5pY2xhc3NpbXBvcnRzPgogICAgICAgICAgICA8am5pY2xhc3Ntb2RpZmllcnM+IGNsYXNzIG1vZHVsZW5hbWUgZXh0ZW5kcyA8am5pY2xhc3NiYXNlPiBpbXBsZW1lbnRzIDxqbmljbGFzc2ludGVyZmFjZXM+IHsKICAgICAgICAgICAgICAgIDxqbmljbGFzc2NvZGU+CiAgICAgICAgICAgICAgICAuLi4gU1dJRyBnZW5lcmF0ZWQgZnVuY3Rpb25zIC4uLgogICAgICAgICAgICB9Cn0KICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMDcvMjgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBEZXByZWNhdGVkIG1vZHVsZW1ldGhvZG1vZGlmaWVycyBwcmFnbWEgYW5kIHJlcGxhY2VkIHdpdGggCiAgICAgICAgICAgIGEgYmV0dGVyICVmZWF0dXJlIGJhc2VkIGRpcmVjdGl2ZSBjYWxsZWQgJWphdmFtZXRob2Rtb2RpZmllcnMuCiAgICAgICAgICAgIEEgdXNlZnVsIGV4YW1wbGUgd291bGQgYmUgZm9yIHN5bmNocm9uaXNhdGlvbiBpbiBtdWx0aS10aHJlYWRlZCBhcHBzOgoKICAgICAgICAgICAgJWphdmFtZXRob2Rtb2RpZmllcnMgZm9vKGludCBhKSAicHVibGljIHN5bmNocm9uaXplZCI7CgogICAgICAgICAgICBDaGFuZ2VzIHRoaXMgZnVuY3Rpb24gZnJvbSB0aGUgZGVmYXVsdCAoInB1YmxpYyIpIHRvICJwdWJsaWMgc3luY2hyb25pemVkIi4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjA3LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU2V2ZXJhbCBkaXJlY3RpdmVzIG5vdyBhbGxvdyBvcHRpb25hbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuCiAgICAgICAgICAgIFRoZXNlIGluY2x1ZGU6CgogICAgICAgICAgICAgICAgJW1vZHVsZShuYW1lPSJ2YWx1ZSIsIG5hbWU9InZhbHVlIiwgLi4uKSBtb2R1bGVuYW1lCiAgICAgICAgICAgICAgICAlaW1wb3J0KG5hbWU9InZhbHVlIiwgLi4uKSAiZmlsZW5hbWUuaSIKICAgICAgICAgICAgICAgICVleHRlbmQobmFtZT0idmFsdWUiLCAuLi4pIGNsYXNzbmFtZSB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoZXNlIGN1cnJlbnRseSBoYXZlIG5vIGVmZmVjdCBhbmQgYXJlIHJlc2VydmVkIGZvcgogICAgICAgICAgICBmdXR1cmUgZXhwYW5zaW9uLgogICAgICAgICAgICAgICAKMDcvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgICBFbmhhbmNlbWVudHMgdG8gc21hcnQtcG9pbnRlciBoYW5kbGluZy4gIFNXSUcgb25seSBwcm92aWRlcwogICAgICAgICAgICBleHRyYSBzdXBwb3J0IGZvciBhIHNtYXJ0LXBvaW50ZXIgaWYgb3BlcmF0b3ItPigpIHJldHVybnMKICAgICAgICAgICAgYSBwcm9wZXIgcG9pbnRlci4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICBGb28gKm9wZXJhdG9yLT4oKTsKCiAgICAgICAgICAgIElmIG9wZXJhdG9yLT4oKSByZXR1cm5zIGFuIG9iamVjdCBieSB2YWx1ZSBvciByZWZlcmVuY2UsCiAgICAgICAgICAgIHRoZW4gU1dJRyBleGFtaW5lcyB0aGUgcmV0dXJuZWQgb2JqZWN0IHRvIHNlZSBpZiBpdCBhbHNvCiAgICAgICAgICAgIGltcGxlbWVudHMgb3BlcmF0b3ItPigpLiAgSWYgc28sIFNXSUcgY2hhc2VzIG9wZXJhdG9yLT4oKQogICAgICAgICAgICB1bnRpbCBpdCBjYW4gZmluZCBvbmUgdGhhdCByZXR1cm5zIGEgcG9pbnRlci4gIFRoaXMgYWxsb3dzCiAgICAgICAgICAgIGNhc2VzIGxpa2UgdGhpcyB0byB3b3JrOgoKICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKCk7CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgRm9vICpvcGVyYXRvci0+KCk7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICBjbGFzcyBTcGFtIHsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgQmFyIG9wZXJhdG9yLT4oKTsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgPj4+IHMgPSBTcGFtKCkKICAgICAgICAgICAgICAgICA+Pj4gcy5ibGFoKCkgICAgICAjIEludm9rZXMgRm9vOjpibGFoKCkKCiAgICAgICAgICAgIFRoZSBzLmJsYWgoKSBjYWxsIGFjdHVhbGx5IGludm9rZXM6CgogICAgICAgICAgICAgICAgICAoKHMub3BlcmF0b3ItPigpKS5vcGVyYXRvci0+KCkpLT5ibGFoKCk7CiAKMDcvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIGJ1ZyB3aXRoIHR5cGVkZWYgYW5kIHJlZmVyZW5jZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgdHlwZWRlZiBGb28gJiBGb29SZWY7CiAgICAgICAgICAgICAgICAgRm9vUmVmIGJsYWgoKTsKCiAgICAgICAgICAgIFByZXZpb3VzIHZlcnNpb25zIG9mIFNXSUcgZ2VuZXJhdGVkIGNvZGUgdGhhdCB3b3VsZG4ndAogICAgICAgICAgICBjb21waWxlLgoKMDcvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBXcmFwcGluZyBvZiBzdGF0aWMgbWV0aG9kcyBoYXMgYmVlbiBpbXByb3ZlZCBpbiBwcm94eSBjbGFzc2VzLiAgSW4gb2xkZXIKICAgICAgICAgICAgdmVyc2lvbnMgb2YgU1dJRywgaWYgeW91IGhhZCB0aGlzOgoKICAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBzdGF0aWMgdm9pZCBiYXIoKTsKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoZSBzdGF0aWMgbWV0aG9kIHdhcyBvbmx5IGF2YWlsYWJsZSBhcyBhIGZ1bmN0aW9uIEZvb19iYXIoKS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgPj4+IEZvb19iYXIoKQoKICAgICAgICAgICAgTm93LCB0aGUgc3RhdGljIG1ldGhvZCBjYW4gYWxzbyBiZSBpbnZva2VkIHRocm91Z2ggYW4gaW5zdGFuY2UgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgPj4+IGYgPSBGb28oKQogICAgICAgICAgICAgICAgICA+Pj4gZi5iYXIoKSAgICAgICAgIyBJbnZva2VzIHN0YXRpYyBtZXRob2QKCiAgICAgICAgICAgIFRoaXMgd29ya3Mgd2l0aCBhbGwgdmVyc2lvbnMgb2YgUHl0aG9uLiAgQWRkaXRpb25hbGx5LCBmb3IgUHl0aG9uLTIuMiwKICAgICAgICAgICAgdGhlIHN0YXRpYyBtZXRob2QgY2FuIGJlIGludm9rZWQgYXM6CgogICAgICAgICAgICAgICAgICA+Pj4gRm9vLmJhcigpCgogICAgICAgICAgICBUaGUgb2xkLXN0eWxlIGZ1bmN0aW9uIGlzIHN0aWxsIHN1cHBvcnQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBJZgogICAgICAgICAgICB5b3UgY2FyZSBhYm91dCBtYWtpbmcgeW91ciBjb2RlIGFjcm9zcyBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgUHl0aG9uLAogICAgICAgICAgICBlaXRoZXIgdXNlIEZvb19iYXIoKSBvciBhY2Nlc3MgdGhlIG1ldGhvZCB0aHJvdWdoIGFuIGluc3RhbmNlLgogCjA3LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQ2hhbmdlcyB0byB0aGUgUHl0aG9uIG1vZHVsZS4gIFByb3h5IGNsYXNzZXMgbm93IHV0aWxpemUgbmV3IFB5dGhvbi0yLjIKICAgICAgICAgICAgZmVhdHVyZXMgaW5jbHVkaW5nIHByb3BlcnRpZXMgYW5kIHN0YXRpYyBtZXRob2RzLiAgSG93ZXZlciwgdGhlc2UgZmVhdHVyZXMKICAgICAgICAgICAgYXJlIHN1cHBvcnRlZCBpbiBhIHdheSB0aGF0IHByb3ZpZGVzIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIKICAgICAgICAgICAgUHl0aG9uIHZlcnNpb25zLiAgSW4gb3RoZXIgd29yZHMsIHByb3h5IGNsYXNzZXMgd29yayB3aXRoIGFsbCB2ZXJzaW9ucwogICAgICAgICAgICBvZiBQeXRob24gYW5kIG9ubHkgdXNlIG5ldyBmZWF0dXJlcyB3aGVuIHJ1bm5pbmcgb24gUHl0aG9uLTIuMi4KCgowNy8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1vZGlmaWVkICVleHRlbmQgc28gdGhhdCBvdmVybG9hZGVkIG1ldGhvZHMgY2FuIGJlIGFkZGVkLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJWV4dGVuZCBGb28gewogICAgICAgICAgICAgICAgICAgICB2b2lkIGJhcihpbnQgeCkgeyB9OwogICAgICAgICAgICAgICAgICAgICB2b2lkIGJhcihjaGFyICpzKSB7IH07CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhpcyB3b3JrcyB3aXRoIGJvdGggQysrICphbmQqIEMuCgowNy8yNC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIE1vcmUgbmV3IHR5cGVtYXBzIHNvIHRoYXQgdGhlIEphdmEgcHJveHkgY2xhc3NlcyBhbmQgdHlwZSB3cmFwcGVyIGNsYXNzZXMKICAgICAgICAgICAgY2FuIGJlIGZ1cnRoZXIgdGFpbG9yZWQgYnkgdXNlcnMuIFRoZXNlIGFyZSB0aGUgZGVmYXVsdCBjb2RlIGZvciBnZW5lcmF0aW5nIHRoZSAKICAgICAgICAgICAgZmluYWxpemUoKSBtZXRob2RzIChwcm94eSBjbGFzc2VzIG9ubHkpIGFuZCB0aGUgZ2V0Q1B0cigpIG1ldGhvZHMgZm9yIHByb3h5IAogICAgICAgICAgICBjbGFzc2VzIGFuZCB0eXBlIHdyYXBwZXIgY2xhc3NlczoKCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFmaW5hbGl6ZSkgU1dJR1RZUEUgJXsKICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHsKICAgICAgICAgICAgICAgIF9kZWxldGUoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICV9CiAgICAgICAgICAgIAogICAgICAgICAgICAldHlwZW1hcChqYXZhZ2V0Y3B0cikgU1dJR1RZUEUsIFNXSUdUWVBFICosIFNXSUdUWVBFICYsIFNXSUdUWVBFIFtdICV7CiAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBsb25nIGdldENQdHIoJGphdmFjbGFzc25hbWUgb2JqKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gb2JqLnN3aWdDUHRyOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFRoZSBqYXZhZ2V0Y3B0ciB0eXBlbWFwIHdpbGwgZW5hYmxlIHVzZXJzIHRvIGhhbmRsZSBKYXZhIG51bGwgYnkgb3ZlcnJpZGluZwogICAgICAgICAgICB0aGlzIHR5cGVtYXAgLSBhIHJlcXVlc3RlZCBmZWF0dXJlLgoKICAgICAgICAgICAgVGhlIC1ub2ZpbmFsaXplIGNvbW1hbmRsaW5lIG9wdGlvbiBoYXMgYmVlbiBkZXByZWNhdGVkLiBUaGUgamF2YWZpbmFsaXplCiAgICAgICAgICAgIHR5cGVtYXAgaXMgbW9yZSBwb3dlcmZ1bCBhcyBpdCB3aWxsIGFsbG93IHRoZSByZW1vdmFsIG9mIHRoZSBmaW5hbGl6ZSBtZXRob2RzIAogICAgICAgICAgICBmb3IgYWxsIG9yIGFueSBvbmUgb3IgbW9yZSBwYXJ0aWN1bGFyIHByb3h5IGNsYXNzLgoKMDcvMjMvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBUaGUgZ2V0Q1B0clhYWCgpIGZ1bmN0aW9uIGhhcyBiZWVuIGNoYW5nZWQgdG8gYSBzdGF0aWMgZnVuY3Rpb24gYW5kCiAgICAgICAgICAgIGlzIG5vdyBvZiB0aGUgZm9ybToKCiAgICAgICAgICAgIHByb3RlY3RlZCBzdGF0aWMgbG9uZyBnZXRDUHRyKFhYWCBvYmopIHsuLi59CgogICAgICAgICAgICBUaGlzIGlzIGEgcmVxdWVzdGVkIGNoYW5nZSB3aGljaCB3aWxsIGFsbG93IEphdmEgbnVsbCBwb2ludGVycyB0byBiZSB1c2VkIGFzIG51bGwKICAgICAgICAgICAgY2FuIGJlIHBhc3NlZCBpbiBmb3Igb2JqLiBIb3dldmVyLCB0byBhY2hpZXZlIHRoaXMgdGhlIGFwcHJvcHJpYXRlIGNvZGUgbXVzdCBiZQogICAgICAgICAgICB3cml0dGVuIHVzaW5nIHRoZSBuZXcgamF2YWdldGNwdHIgdHlwZW1hcCBkaXJlY3RpdmUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgogICAgICAgICAgICBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBjYW4gYmUgYWNoaWV2ZWQgYnkgYWRkaW5nIHRoaXMgZnVuY3Rpb24gYmFjayBpbiB1c2luZyB0aGUKICAgICAgICAgICAgbmV3IGphdmFjb2RlIHR5cGVtYXA6CgogICAgICAgICAgICAldHlwZW1hcChqYXZhY29kZSkgU1dJR1RZUEUgJXsKCiAgICAgICAgICAgICAgLy8gU1dJRy0xLjMuMTIgYW5kIFNXSUctMS4zLjEzCiAgICAgICAgICAgICAgcHVibGljIGxvbmcgZ2V0Q1B0ciRqYXZhY2xhc3NuYW1lKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHN3aWdDUHRyOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAvLyBTV0lHLTEuMy4xMSBhbmQgZWFybGllcgogICAgICAgICAgICAgIHB1YmxpYyBsb25nIGdldENQdHIoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc3dpZ0NQdHI7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgJX0KCgowNy8yMy8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIE5ldyBkaXJlY3RpdmUgdG8gY29udHJvbCBjb25zdGFudCBjb2RlIGdlbmVyYXRpb24gLSAlamF2YWNvbnN0LgogICAgICAgICAgICBUaGUgZGVmYXVsdCBoYW5kbGluZyBmb3IgaGFuZGxpbmcgY29uc3RhbnRzIGlzIHRvIGdldCB0aGUgdmFsdWUgdGhyb3VnaAogICAgICAgICAgICBhIEpOSSBjYWxsLCBlZwoKICAgICAgICAgICAgI2RlZmluZSBZRUxMT1cgNQogICAgICAgICAgICAjZGVmaW5lIEJJRyAxMjM0TEwKCiAgICAgICAgICAgIHJlc3VsdHMgaW46CgogICAgICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBZRUxMT1cgPSBtb2R1bGVuYW1lLmdldF9ZRUxMT1coKTsKICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBsb25nIEJJRyA9IG1vZHVsZW5hbWUuZ2V0X0JJRygpOwoKICAgICAgICAgICAgRWFybGllciB2ZXJzaW9ucyBvZiB0aGUgSmF2YSBtb2R1bGUgaW5pdGlhbGlzZWQgdGhlIHZhbHVlIHVzaW5nIHRoZSBDIHZhbHVlOgoKICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgWUVMTE9XID0gNTsKICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBsb25nIEJJRyA9IDEyMzRMTDsKCiAgICAgICAgICAgIFRoaXMgd29ya3MgaW4gbW9zdCBjYXNlcywgYnV0IHRoZSB2YWx1ZSBmb3IgQklHIHdvbid0IGNvbXBpbGUgYXMgMTIzNExMIGlzIG5vdAogICAgICAgICAgICB2YWxpZCBKYXZhIGNvZGUgYW5kIHRoaXMgaXMgb25lIG9mIHRoZSByZWFzb25zIHdoeSB0aGUgZGVmYXVsdCBpcyBub3cgdG8gZ2V0IHRoZSAKICAgICAgICAgICAgdmFsdWVzIHRocm91Z2ggYSBKTkkgY2FsbC4gVGhlIHNpZGUgZWZmZWN0IGlzIHRoYXQgdGhlc2UgJ2NvbnN0YW50cycgY2Fubm90IGJlIHVzZWQgCiAgICAgICAgICAgIGluIHN3aXRjaCBzdGF0ZW1lbnRzLiBUaGUgJWphdmFjb25zdCBkaXJlY3RpdmUgYWxsb3dzIG9uZSB0byBzcGVjaWZ5IHRoZQogICAgICAgICAgICB3YXkgdGhlIGNvbnN0YW50IHZhbHVlIGlzIGluaXRpYWxpc2VkIGFuZCB3b3JrcyBsaWtlIG90aGVyICVmZWF0dXJlCiAgICAgICAgICAgIGRpcmVjdGl2ZXMsIGVnCgogICAgICAgICAgICAlamF2YWNvbnN0KDApOyAgICAgLy8gYWxsIGNvbnN0YW50cyBmcm9tIHRoaXMgcG9pbnQgb24gYXJlIGluaXRpYWxpc2VkIHVzaW5nIHRoZSBDIHZhbHVlCiAgICAgICAgICAgICVqYXZhY29uc3QoMSkgQklHOyAvLyBqdXN0IEJJRyBpbml0aWFsaXNlZCB1c2luZyBKTkkgY2FsbCAobXVzdCBiZSBwYXJzZWQgYmVmb3JlIEJJRyBpcyBkZWZpbmVkKQoKMDcvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICAqKiogSU1QT1JUQU5UIENIQU5HRVMgVE8gVEhFIFBZVEhPTiBNT0RVTEUgKioqCgogICAgICAgICAgICAoMSkgVGhlIFB5dGhvbiBtb2R1bGUgbm93IGVuYWJsZXMgc2hhZG93L3Byb3h5IGNsYXNzZXMgYnkgZGVmYXVsdC4KICAgICAgICAgICAgVGhpcyBtZWFucyB0aGF0IHR3byBmaWxlcyBhcmUgYWx3YXlzIGNyZWF0ZWQgYnkgU1dJRy4gIEZvcgogICAgICAgICAgICBpbnN0YW5jZSwgaWYgeW91IGhhdmUgdGhpczoKCiAgICAgICAgICAgICAgICAgLy8gZmlsZTogZm9vLmkKICAgICAgICAgICAgICAgICAlbW9kdWxlIGZvbwogICAgICAgICAgICAgICAgIC4uLgoKICAgICAgICAgICAgVGhlbiBzd2lnIGdlbmVyYXRlcyB0d28gZmlsZXMgImZvb193cmFwLmMiIGFuZCAiZm9vLnB5Ii4KCiAgICAgICAgICAgICgyKSBUaGUgbmFtZSBvZiB0aGUgbG93LWxldmVsIEMgZXh0ZW5zaW9uIG1vZHVsZSBoYXMgYmVlbiBjaGFuZ2VkCiAgICAgICAgICAgIHRvIHN0YXJ0IHdpdGggYSBsZWFkaW5nIHVuZGVyc2NvcmUuICAgVGhpcyBtZWFucyB0aGF0IHlvdSBoYXZlCiAgICAgICAgICAgIHRvIGNvbXBpbGUgdGhlIG1vZHVsZSBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgICQgY2MgLWMgLUkvdXNyL2xvY2FsL2luY2x1ZGUvcHl0aG9uMi4yIGZvb193cmFwLmMKICAgICAgICAgICAgICAgICQgY2MgLXNoYXJlZCBmb29fd3JhcC5vICQoT0JKUykgLW8gX2Zvby5zbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGUgZXh0cmEgdW5kZXJzY29yZQoKICAgICAgICAgICAgVGhpcyBuYW1pbmcgc2NoZW1lIGlzIGNvbnNpc3RlbnQgd2l0aCBvdGhlciBQeXRob24gbW9kdWxlcyB0aGF0CiAgICAgICAgICAgIHV0aWxpemUgZXh0ZW5zaW9uIGNvZGUuICBGb3IgaW5zdGFuY2UsIHRoZSBzb2NrZXQgbW9kdWxlIGNvbnNpc3RzCiAgICAgICAgICAgIG9mICJfc29ja2V0LnNvIiBhbmQgInNvY2tldC5weSIuICBJbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiBTV0lHLAogICAgICAgICAgICB0aGUgc2hhcmVkIG9iamVjdCBmaWxlIHdhcyBuYW1lZCAiZm9vY21vZHVsZS5zbyIuCgogICAgICAgICAgICAoMykgQSBuZXcgZGlyZWN0aXZlIGNhbiBiZSB1c2VkIHRvIGluc2VydCBQeXRob24gY29kZSBpbnRvCiAgICAgICAgICAgIHRoZSBjb3JyZXNwb25kaW5nIC5weSBmaWxlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJXB5dGhvbmNvZGUgJXsKICAgICAgICAgICAgICAgIGRlZiBmb28oKToKICAgICAgICAgICAgICAgICAgICBwcmludCAiSGVsbG8gV29ybGQiCiAgICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgIFRoaXMgZGlyZWN0aXZlIGFsbG93cyB5b3UgdG8gY3JlYXRlIG1vZHVsZXMgYXMgYSBtaXggb2YgQyBhbmQgUHl0aG9uLgogICAgICAgICAgICAgUHl0aG9uIGNvZGUgaXMgc2VhbWxlc3NseSBhZGRlZCB0byB0aGUgbW9kdWxlLgoKICAgICAgICAgICAgKDQpIFRoZSAtc2hhZG93IGNvbW1hbmQgbGluZSBvcHRpb24gaXMgZGVwcmVjYXRlZC4gIFRoaXMgaXMgdHVybmVkIG9uCiAgICAgICAgICAgIGJ5IGRlZmF1bHQuCgogICAgICAgICAgICAoNSkgVG8gZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgZXh0cmEgcHl0aG9uIGZpbGUsIHVzZSB0aGUgIi1ub3Byb3h5IgogICAgICAgICAgICBjb21tYW5kIGxpbmUgb3B0aW9uLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIHdpbGwgbGlrZWx5IGJyZWFrIHRoZSBidWlsZCBlbnZpcm9ubWVudCBvZiBwcm9qZWN0cyB0aGF0CiAgICAgICAgICAgIHV0aWxpemUgc2hhZG93IGNsYXNzZXMuICAgVG8gZml4IHRoaXMsIHlvdSBwcm9iYWJseSBvbmx5IG5lZWQgdG8KICAgICAgICAgICAgY2hhbmdlIHRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgLnNvIGZpbGUuICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUKICAgICAgICAgICAgTWFrZWZpbGUgaW5mb3JtYXRpb24gbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgIFRBUkdFVCA9IGV4YW1wbGVjbW9kdWxlLnNvCgogICAgICAgICAgICBKdXN0IGNoYW5nZSBpdCB0bzoKCiAgICAgICAgICAgICAgICAgICBUQVJHRVQgPSBfZXhhbXBsZS5zbwoKICAgICAgICAgICAgKioqIERPQ1VNRU5UQVRJT04gVVBEQVRFICoqKgogICAgICAgICAgICBUaGUgZmlsZSBEb2MvTWFudWFsL1B5dGhvbi5odG1sIGhhcyBiZWVuIHVwZGF0ZWQgdG8gZGVzY3JpYmUgdGhlc2UgY2hhbmdlcy4KCgowNy8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIC1ub2V4dGVybiBvcHRpb24uICAgSWYgc3VwcGxpZWQsIFNXSUcgd2lsbCBub3QgZ2VuZXJhdGUKICAgICAgICAgICAgZXh0cmEgZXh0ZXJuIGRlY2xhcmF0aW9ucy4gIFRoaXMgaXMgc29tZXRpbWVzIGFuIGlzc3VlIG9uIAogICAgICAgICAgICBub24tdW5peCBwbGF0Zm9ybXMuCgowNy8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIGEgd2FybmluZyBmb3IgaWdub3JlZCBmcmllbmQgZnVuY3Rpb25zLgoKMDcvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDU3NDQ5OCBdIC1wcm94eSBhbmQgJWluY2x1ZGUgInBvaW50ZXIuaSIgY2xhc2guCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IERhdmlkIENyZWFzeS4KCjA3LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1NzYxMDMgXSBnbG9iYWwgZGVzdHJ1Y3Rpb24gd2FybmluZyB3aXRoIHNoYWRvdy4KICAgICAgICAgICAgUGVybCBleHRlbnNpb25zIHNob3VsZCBubyBsb25nZXIgcmVwb3J0IHRoZSB3YXJuaW5nCgogICAgICAgICAgICAgICAiVXNlIG9mIHVuaW5pdGlhbGl6ZWQgdmFsdWUgZHVyaW5nIGdsb2JhbCBkZXN0cnVjdGlvbi4iCiAKICAgICAgICAgICAgd2hlbiBydW5uaW5nIHdpdGggInBlcmwgLXciLiAgUmVwb3J0ZWQgYnkKICAgICAgICAgICAgQnJldHQgV2lsbGlhbXMuCgowNy8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEluIEMrKyBtb2RlLCBTV0lHIG5vdyBhbHdheXMgZGVmaW5lcyBuYW1lc3BhY2Ugc3RkLiAgQnkgZGVmYXVsdCwKICAgICAgICAgICAgaXQncyBlbXB0eS4gIEhvd2V2ZXIsIHRoaXMgd2lsbCBzaWxlbmNlIGVycm9ycyBmcm9tIHByb2dyYW1zCiAgICAgICAgICAgIHRoYXQgaW5jbHVkZSBzdGF0ZW1lbnRzIHN1Y2ggYXMgInVzaW5nIG5hbWVzcGFjZSBzdGQ7Ii4KICAgICAgICAgICAgVGhpcyBmaXhlcyBCdWcgWyA1ODQwMTcgXSB1c2luZyBuYW1lc3BhY2Ugc3RkIGdlbmVyYXRlcyBlcnJvci4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgSm9zZXBoIFdpbnN0b24uCgowNy8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIGEgbmV3IHdhcm5pbmcgbWVzc2FnZSBmb3IgJWFwcGx5LiAgSWYgeW91IHVzZSAlYXBwbHkgYnV0IG5vIHR5cGVtYXBzCiAgICAgICAgICAgIGFyZSBkZWZpbmVkLCB5b3Ugd2lsbCBnZXQgYSB3YXJuaW5nIG1lc3NhZ2UuICBUaGlzIHNob3VsZCBoZWxwIHdpdGgKICAgICAgICAgICAgcHJvYmxlbXMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgICVhcHBseSBjaGFyICpPVVRQVVQgeyAuLi4gfTsKCiAgICAgICAgICAgIEluIG9sZCB2ZXJzaW9ucyBvZiBTV0lHLCB0aGlzIHNpbGVudGx5IGRpZCBub3RoaW5nLiAgTm93IHlvdSBnZXQgYW4gZXJyb3IgbGlrZSB0aGlzOgogIAogICAgICAgICAgICAgICAgICAgZmlsZTpsaW5lLiBXYXJuaW5nLiBDYW4ndCBhcHBseSAoY2hhciAqT1VUUFVUKS4gTm8gdHlwZW1hcHMgYXJlIGRlZmluZWQuCgowNy8yMi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFN0YXJ0ZWQgSmF2YSBwcmFnbWEgZGVwcmVjYXRpb24uIFJlcGxhY2VtZW50cyB1c2UgJXR5cGVtYXAgYmFzZWQgCiAgICAgICAgICAgIGRpcmVjdGl2ZXMgYW5kIGVuYWJsZSBwcm94eSBjbGFzc2VzIGFuZCB0aGUgbmV3IHR5cGUgd3JhcHBlciBjbGFzc2VzIHRvIGJlIAogICAgICAgICAgICB0YWlsb3JlZCBpbiB2YXJpb3VzIHdheXMuIFRoZXNlIGFyZSB0aGUgbmV3IHR5cGVtYXBzOgogICAgICAgICAgICAKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWJhc2UpICAgICAgICAgICAtIGJhc2UgKGV4dGVuZHMpIGZvciBKYXZhIGNsYXNzCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFjbGFzc21vZGlmaWVycykgLSBjbGFzcyBtb2RpZmllcnMgZm9yIHRoZSBKYXZhIGNsYXNzOiBkZWZhdWx0IGlzICJwdWJsaWMiCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFjb2RlKSAgICAgICAgICAgLSBqYXZhIGNvZGUgaXMgY29waWVkIHZlcmJhdGltIHRvIHRoZSBKYXZhIGNsYXNzCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFpbXBvcnRzKSAgICAgICAgLSBpbXBvcnQgc3RhdGVtZW50cyBmb3IgSmF2YSBjbGFzcwogICAgICAgICAgICAldHlwZW1hcChqYXZhaW50ZXJmYWNlcykgICAgIC0gaW50ZXJmYWNlcyAoZXh0ZW5kcykgZm9yIEphdmEgY2xhc3MKICAgICAgICAgICAgCiAgICAgICAgICAgIEFuZCB0aGVzZSBhcmUgdGhlICVwcmFnbWEgZGlyZWN0aXZlcyBiZWluZyBkZXByZWNhdGVkOgogICAgICAgICAgICBhbGxzaGFkb3diYXNlCiAgICAgICAgICAgIGFsbHNoYWRvd2NsYXNzbW9kaWZpZXJzCiAgICAgICAgICAgIGFsbHNoYWRvd2NvZGUKICAgICAgICAgICAgYWxsc2hhZG93aW1wb3J0CiAgICAgICAgICAgIGFsbHNoYWRvd2ludGVyZmFjZQogICAgICAgICAgICBzaGFkb3diYXNlCiAgICAgICAgICAgIHNoYWRvd2NsYXNzbW9kaWZpZXJzCiAgICAgICAgICAgIHNoYWRvd2NvZGUKICAgICAgICAgICAgc2hhZG93aW1wb3J0CiAgICAgICAgICAgIHNoYWRvd2ludGVyZmFjZQogICAgICAgICAgICAKICAgICAgICAgICAgTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIHRhcmdldCBhIHBhcnRpY3VsYXIgcHJveHkgY2xhc3M6CiAgICAgICAgICAgICV0eXBlbWFwKGphdmFpbXBvcnRzKSBGb28gImltcG9ydCBqYXZhLnV0aWwuKiI7CiAgICAgICAgICAgIG9yIGEgcGFydGljdWxhciB0eXBlIHdyYXBwZXIgY2xhc3M6CiAgICAgICAgICAgICV0eXBlbWFwKGphdmFpbXBvcnRzKSBkb3VibGUqICJpbXBvcnQgamF2YS5tYXRoLioiOwogICAgICAgICAgICBOb3RlIHRoYXQgJGphdmFjbGFzc25hbWUgaW4gdGhlc2UgdHlwZW1hcHMgYXJlIHN1YnN0aXR1dGVkIHdpdGggZWl0aGVyIHRoZSBwcm94eSAKICAgICAgICAgICAgY2xhc3NuYW1lIHdoZW4gdXNpbmcgcHJveHkgY2xhc3NlcyBvciB0aGUgU1dJR1RZUEUgY2xhc3MgbmFtZS4KCjA3LzE4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gSmF2YSBtb2R1bGUgb3ZlcmhhdWwgdG8gaW1wbGVtZW50IHN0YXRpYyB0eXBlIGNoZWNraW5nIG9mIGFsbCAKICAgICAgICAgICAgdHlwZXMuIAogICAgICAgICAgICAKICAgICAgICAgICAgMSkgQ2hhbmdlcyB3aGVuIHVzaW5nIEphdmEgUHJveHkgY2xhc3NlcwogICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICAgICAgICBQcmV2aW91c2x5IHdoZW4gd3JhcHBpbmcgZ2xvYmFsIGZ1bmN0aW9uczogCgogICAgICAgICAgICBjbGFzcyBTb21lQ2xhc3N7fTsKICAgICAgICAgICAgdm9pZCBmb28oU29tZUNsYXNzKiBzKTsKICAgICAgICAgICAgU29tZUNsYXNzKiBiYXIoKTsKCiAgICAgICAgICAgIFRoZSBuYXRpdmUgbWV0aG9kIHByb3RvdHlwZXMgdXNlZCBhIGxvbmcgZm9yIHBvaW50ZXJzIGFuZCBsb29rZWQgbGlrZSB0aGlzOgoKICAgICAgICAgICAgcHVibGljIGNsYXNzIG1vZHVsZW5hbWUgIHsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBuYXRpdmUgdm9pZCBmb28obG9uZyBqYXJnMSk7CiAgICAgICAgICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIG5hdGl2ZSBsb25nIGJhcigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBhbmQgdW5saWtlIG1lbWJlciBmdW5jdGlvbnMgb2YgYSBDKysgY2xhc3MgdGhlcmUgd2FzIG5vIHdyYXBwZXIgYXJvdW5kIHRoZSBuYXRpdmUgY2FsbHMgCiAgICAgICAgICAgIHRvIG1ha2UgdGhlIHVzZSBvZiB0aGVtIG1vcmUgdXNlciBmcmllbmRseS4gVGhleSB3b3VsZCBiZSB1c2VkIGZyb20gSmF2YSBsaWtlIHRoaXM6CgogICAgICAgICAgICBTb21lQ2xhc3MgcyA9IG5ldyBTb21lQ2xhc3MobW9kdWxlbmFtZS5iYXIoKSwgZmFsc2UpOwogICAgICAgICAgICBtb2R1bGVuYW1lLmZvbyhzLmdldENQdHJTb21lQ2xhc3MoKSk7CgogICAgICAgICAgICBOb3RlIHRoYXQgdGhlIGZvbGxvd2luZyB3aWxsIGhhdmUgdGhlIHNhbWUgZWZmZWN0LCBidXQgdGhlbiBpdCB3b3VsZCBub3QgaGF2ZSAKICAgICAgICAgICAgYmVlbiBwb3NzaWJsZSB0byBjYWxsIGFueSBwcm94eSBtZW1iZXIgZnVuY3Rpb25zIGluIFNvbWVDbGFzczoKCiAgICAgICAgICAgIGxvbmcgcyA9IG1vZHVsZW5hbWUuYmFyKCk7CiAgICAgICAgICAgIG1vZHVsZW5hbWUuZm9vKHMpOwoKICAgICAgICAgICAgTm93IHdyYXBwZXIgZnVuY3Rpb25zIGFyZSBnZW5lcmF0ZWQ6CgogICAgICAgICAgICBwdWJsaWMgY2xhc3MgbW9kdWxlbmFtZSAgewogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIGZvbyhTb21lQ2xhc3MgcykgewogICAgICAgICAgICAgICAgICAgIC8vIGNhbGxzIHRoZSBuYXRpdmUgZnVuY3Rpb24KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIFNvbWVDbGFzcyBiYXIoKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gY2FsbHMgdGhlIG5hdGl2ZSBmdW5jdGlvbgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBXaGljaCBtZWFucyB0aGVzZSBmdW5jdGlvbnMgY2FuIG5vdyBiZSB1c2VkIG1vcmUgbmF0dXJhbGx5IHdpdGggcHJveHkgY2xhc3NlczoKCiAgICAgICAgICAgIFNvbWVDbGFzcyBzID0gbW9kdWxlbmFtZS5iYXIoKTsKICAgICAgICAgICAgbW9kdWxlbmFtZS5mb28ocyk7CgogICAgICAgICAgICAyKSBDaGFuZ2VzIHdoZW4gbm90IHVzaW5nIEphdmEgUHJveHkgY2xhc3NlcwogICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICAgICAgICAgVGhlIHNvIGNhbGxlZCBsb3ctbGV2ZWwgaW50ZXJmYWNlIHdhcyByYXRoZXIgbG93LWxldmVsIGluZGVlZC4gVGhlIAogICAgICAgICAgICBuZXcgc3RhdGljIHR5cGUgY2hlY2tpbmcgaW1wbGVtZW50YXRpb24gbWFrZXMgaXQgbGVzcyBzbyBidXQgaXQgcmVtYWlucyBhCiAgICAgICAgICAgIGZ1bmN0aW9uYWwgaW50ZXJmYWNlIHRvIHRoZSBDL0MrKyB3b3JsZC4gUHJveHkgY2xhc3NlcyBhcmUgdGhlIG9idmlvdXMgd2F5IHRvIHVzZQogICAgICAgICAgICBTV0lHIGdlbmVyYXRlZCBjb2RlLCBidXQgZm9yIHRob3NlIHdobyB3YW50IGEgZnVuY3Rpb25hbCBpbnRlcmZhY2UgYWxsIG5vbi1wcmltaXRpdmUKICAgICAgICAgICAgdHlwZXMgbm93IGhhdmUgYSBzaW1wbGUgSmF2YSBjbGFzcyB3cmFwcGVyIGFyb3VuZCB0aGUgQy9DKysgdHlwZS4gUG9pbnRlcnMgYW5kCiAgICAgICAgICAgIHJlZmVyZW5jZXMgdG8gcHJpbWl0aXZlIHR5cGVzIGFyZSBhbHNvIHdyYXBwZWQgYnkgdHlwZSB3cmFwcGVyIGNsYXNzZXMuIFRoZSB0eXBlCiAgICAgICAgICAgIHdyYXBwZXIgY2xhc3NuYW1lcyBhcmUgYmFzZWQgb24gdGhlIFNXSUcgZGVzY3JpcHRvcnMgdXNlZCBieSB0aGUgb3RoZXIgbGFuZ3VhZ2UgCiAgICAgICAgICAgIG1vZHVsZXMuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgQy9DKysgdHlwZSAgICAgIEphdmEgdHlwZSB3cmFwcGVyIGNsYXNzIG5hbWUKICAgICAgICAgICAgLS0tLS0tLS0tLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgaW50KiAgICAgICAgICAgIFNXSUdUWVBFX3BfaW50CiAgICAgICAgICAgIGRvdWJsZSoqICAgICAgICBTV0lHVFlQRV9wX3BfZG91YmxlCiAgICAgICAgICAgIFNvbWVDbGFzcyogICAgICBTV0lHVFlQRV9wX1NvbWVDbGFzcwogICAgICAgICAgICBTb21lQ2xhc3MmICAgICAgU1dJR1RZUEVfcF9Tb21lQ2xhc3MKICAgICAgICAgICAgU29tZUNsYXNzICAgICAgIFNXSUdUWVBFX3BfU29tZUNsYXNzCgogICAgICAgICAgICBOb3RlIHRoYXQgZXZlcnl0aGluZyB3cmFwcGVkIGJ5IFNXSUcgaXMgYWNjZXNzZWQgdmlhIGEgcG9pbnRlciBldmVuIHdoZW4gd3JhcHBpbmcgCiAgICAgICAgICAgIGZ1bmN0aW9ucyB0aGF0IHBhc3MgYnkgdmFsdWUgb3IgcmVmZXJlbmNlLiBTbyB0aGUgcHJldmlvdXMgZXhhbXBsZSB3b3VsZCBub3cgYmUgCiAgICAgICAgICAgIHVzZWQgbGlrZSB0aGlzOgoKICAgICAgICAgICAgU1dJR1RZUEVfcF9Tb21lQ2xhc3MgcyA9IGV4YW1wbGUuYmFyKCk7CiAgICAgICAgICAgIGV4YW1wbGUuZm9vKHMpOwoKICAgICAgICAgICAgTm90ZSB0aGF0IHR5cGVkZWZzIHRoYXQgU1dJRyBrbm93cyBhYm91dCBhcmUgcmVzb2x2ZWQsIHNvIHRoYXQgaWYgb25lIGhhcyAKCiAgICAgICAgICAgIGNsYXNzIEZvb3t9OwogICAgICAgICAgICB0eXBlZGVmIEZvbyBCYXI7CgogICAgICAgICAgICB0aGVuIGFueSB1c2Ugb2YgQmFyIHdpbGwgcmVxdWlyZSBvbmUgdG8gdXNlIFNXSUdUWVBFX3BfRm9vOwoKICAgICAgICAgICAgU29tZSBjb25zaWRlcmF0aW9uczoKICAgICAgICAgICAgTWFrZSBzdXJlIHlvdSBtYWtlIGEgZmlybSBkZWNpc2lvbiB0byB1c2UgZWl0aGVyIHByb3h5IGNsYXNzZXMgb3IgdGhlIGZ1bmN0aW9uYWwgCiAgICAgICAgICAgIGludGVyZmFjZSBlYXJseSBvbiBhcyB0aGUgY2xhc3NuYW1lcyBhcmUgZGlmZmVyZW50LgoKICAgICAgICAgICAgMykgUG9pbnRlcnMgYW5kIG5vbi1wYXJzZWQgdHlwZXMKICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgU29tZXRpbWVzIFNXSUcgY2Fubm90IGdlbmVyYXRlIGEgcHJveHkgY2xhc3MuIFRoaXMgb2NjdXJzIHdoZW4gdGhlIGRlZmluaXRpb24gb2YgCiAgICAgICAgICAgIGEgdHlwZSBpcyBub3QgcGFyc2VkIGJ5IFNXSUcsIGJ1dCBpcyB0aGVuIHVzZWQgYXMgYSB2YXJpYWJsZSBvciBhIHBhcmFtZXRlci4gCiAgICAgICAgICAgIEZvciBleGFtcGxlLAoKICAgICAgICAgICAgdm9pZCBmb28oU25henp5IHNkcyk7CgogICAgICAgICAgICBJZiBTV0lHIGhhcyBub3QgcGFyc2VkIFNuYXp6eSBpdCBoYW5kbGVzIGl0IHNpbXBseSBhcyBhIHBvaW50ZXIgdG8gYSBTbmF6enkuCiAgICAgICAgICAgIFRoZSBKYXZhIG1vZHVsZSBnaXZlcyBpdCBhIHR5cGUgd3JhcHBlciBjbGFzcyBhcm91bmQgdGhlIHBvaW50ZXIgYW5kIGNhbGxzIGl0IAogICAgICAgICAgICBTV0lHVFlQRV9wX1NuYXp6eS4gSW4gb3RoZXIgd29yZHMgaXQgaGFuZGxlcyBpdCBpbiB0aGUgc2FtZSBtYW5uZXIgYXMgdHlwZXMgYXJlIAogICAgICAgICAgICBoYW5kbGVkIGluIHRoZSBsb3ctbGV2ZWwgZnVuY3Rpb25hbCBpbnRlcmZhY2UuIFRoaXMgYXBwcm9hY2ggaXMgdXNlZCBmb3IgYWxsIAogICAgICAgICAgICBub24tcHJveHkgY2xhc3NlcywgZWcgYWxsIHBvaW50ZXIgdG8gcG9pbnRlcnMgYW5kIHBvaW50ZXJzIHRvIHByaW1pdGl2ZSB0eXBlcy4KCiAgICAgICAgICAgIDQpIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CiAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGlzIG5vdCBhbiBpc3N1ZSBpZiB5b3UgaGF2ZSBiZWVuIHVzaW5nIHByb3h5IGNsYXNzZXMgYW5kIAogICAgICAgICAgICBubyBnbG9iYWwgdmFyaWFibGVzL2Z1bmN0aW9ucy4gT3RoZXJ3aXNlIHNvbWUgY2hhbmdlcyB3aWxsIGhhdmUgdG8gYmUgbWFkZS4gCiAgICAgICAgICAgIFRoZSBuYXRpdmUgbWV0aG9kcyBzdGlsbCBleGlzdCBidXQgdGhleSBhcmUgbm93IGluIGEgSk5JIGNsYXNzLCB3aGljaCBpcyBjYWxsZWQgCiAgICAgICAgICAgIG1vZHVsZW5hbWVKTkkuIEFzIHRoaXMgY2xhc3MgaXMgcmVhbGx5IHBhcnQgb2YgdGhlIGludGVybmFsIHdvcmtpbmdzLAogICAgICAgICAgICBpdCBzaG91bGQgbm90IGJlIHJlcXVpcmVkIHNvIHRoZSBjbGFzcyBoYXMgYmVjb21lIHByb3RlY3RlZC4gU29tZSBwcmFnbWFzL2RpcmVjdGl2ZXMKICAgICAgICAgICAgd2lsbCBob3BlZnVsbHkgYmUgYWRkZWQgdG8gaGVscCB3aXRoIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMDcvMTgvMjAwMjogYmVhemxleQogICAgICAgICAgICBNb2RpZmllZCB3cmFwcGluZyBvZiB1bmluc3RhbnRpYXRlZCB0ZW1wbGF0ZXMgcmV0dXJuZWQgYnkKICAgICAgICAgICAgdmFsdWUuICBKdXN0IHRvIGJlIHNhZmUsIHRoZXkgYXJlIG5vdyB3cmFwcGVkIGJ5IFN3aWdWYWx1ZVdyYXBwZXI8PgogICAgICAgICAgICBqdXN0IGluIGNhc2UgdGhleSBkb24ndCBkZWZpbmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLiAgVGhpcwogICAgICAgICAgICB3b3VsZCBiZSB1c2VkIGlmIHlvdSBoYWQgY29kZSBsaWtlIHRoaXMKCiAgICAgICAgICAgICAgICAgRm9vPGludD4gYmxhaCgpOwogICAgICAgICAgICAgICAgIHZvaWQgICAgIG1vcmVibGFoKEZvbzxpbnQ+IHgpOwoKICAgICAgICAgICAgYnV0IHlvdSBkaWRuJ3QgaW5zdGFudGlhdGUgRm9vPGludD4gdXNpbmcgJXRlbXBsYXRlLiAgCiAgICAgICAgICAgIFdlIHNob3VsZCBwcm9iYWJseSBhZGQgYSB3YXJuaW5nIGZvciB0aGlzLgoKMDcvMTcvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCBhbiBlcnJvciBjaGVjayB0byBkZXRlY3Qgc2hhZG93ZWQgdGVtcGxhdGUgcGFyYW1hdGVycy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgIGludCBUOwogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhpcyByZXN1bHRzIGluIGFuIGVycm9yLCBub3QgYSB3YXJuaW5nLiAgVGhpcyB3YXJuaW5nIGlzCiAgICAgICAgICAgIGFsc28gbmVlZGVkIHRvIGZpeCBzb21lIHJhdGhlciBpbnNpZGlvdXMgcHJvYmxlbXMgbGlrZQogICAgICAgICAgICB0aGlzOgoKICAgICAgICAgICAgICAgICBzdHJ1Y3QgVCB7CiAgICAgICAgICAgICAgICAgICAgICBpbnQgIGJsYWg7CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICB0eXBlZGVmIFQgVHJhaXRzOyAgICAvLyBXaGljaCBUIGlzIHRoaXM/Pz8/CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIHRlbXBsYXRlIHBhcmFtZXRlciBUIHNoYWRvd3MgdGhlIG91dGVyCiAgICAgICAgICAgIHN0cnVjdHVyZSAod2hpY2ggaXMgd2hhdCB5b3Ugd2FudCkuCgowNy8xNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEltcHJvdmVkIHN1cHBvcnQgZm9yIHRlbXBsYXRlcyB3aXRoIGludGVnZXIgYXJndW1lbnRzLiAgU1dJRyBpcwogICAgICAgICAgICBtdWNoIG1vcmUgYXdhcmUgb2Ygc2l0dWF0aW9ucyBzdWNoIGFzIHRoaXM6CgogICAgICAgICAgICAgICAgY29uc3QgaW50IFNpemUgPSAxMDA7CgogICAgICAgICAgICAgICAgJXRlbXBsYXRlKEZvbzEwMCkgRm9vPDEwMD47CiAgICAgICAgICAgICAgICB2b2lkIGJhcihGb288U2l6ZT4gKngpOyAgIC8vIEtub3dzIHRoYXQgRm9vPFNpemU+IGlzIHRoZSBzYW1lIGFzIEZvbzwxMDA+OwoKMDcvMTUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBidWcgd2l0aCAlZmVhdHVyZS8laWdub3JlLyVyZW5hbWUgYW5kIG5hbWVzcGFjZXMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVpZ25vcmUgRm9vOjpCYXIKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBGb28gewogICAgICAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuCgowNy8wOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIHBhcnNpbmcgc3VwcG9ydCBmb3IgY29uc3RydWN0b3JzIHRoYXQgdHJ5IHRvIGNhdGNoCiAgICAgICAgICAgIGV4Y2VwdGlvbnMgaW4gaW5pdGlhbGl6ZXJzLiAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgIEJhciBiOwogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICBGb28oaW50IHgpIHRyeSAKICAgICAgICAgICAgICAgICAgICAgOiBiKHgpIHsgLi4uIH0KICAgICAgICAgICAgICAgICBjYXRjaChpbnQpIHsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoaXMgaGFzIG5vIGVmZmVjdCBvbiB0aGUgZ2VuZXJhdGVkIHdyYXBwZXJzLiAgSG93ZXZlciwgdGhlIHRyeSBhbmQgY2F0Y2gKICAgICAgICAgICAgcGFydHMgb2YgdGhlIGRlY2xhcmF0aW9uIGFyZSBpZ25vcmVkLiAgU2VlIFN0cm91c3RydXAsIDNyZCBFZCwgc2VjdGlvbiAKICAgICAgICAgICAgMTQuNC42LjEgZm9yIGRldGFpbHMuCiAgICAgICAgICAgICAgICAgICAKMDcvMDYvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBidWcgaW4gdGVtcGxhdGUgc3ltYm9sIHRhYmxlIG1hbmFnZW1lbnQuICBUaGlzIGZpeGVzCiAgICAgICAgICAgIHR3byBidWdzLiAgRmlyc3QsIG1peGluZyBhYnN0cmFjdCBtZXRob2RzLCB0ZW1wbGF0ZXMsIGFuZCAKICAgICAgICAgICAgaW5oZXJpdGFuY2Ugbm8gbG9uZ2VyIGdlbmVyYXRlcyBhIGZhaWxlZCBhc3NlcnRpb24uCiAKICAgICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPgogICAgICAgICAgICAgICAgY2xhc3MgQSB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZm9vKCkgPSAwOwogICAgICAgICAgICAgICAgfTsKIAogICAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KICAgICAgICAgICAgICAgY2xhc3MgQiA6IHB1YmxpYyBBPFQ+CiAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgJXRlbXBsYXRlKEFfaW50KSBBPGludD47CiAgICAgICAgICAgICAgICV0ZW1wbGF0ZShCX2ludCkgQjxpbnQ+OwoKICAgICAgICAgICAgVGhpcyBmaXggYWxzbyBmaXhlcyBhIHN1YnRsZSBwcm9ibGVtIHdpdGggZGVmYXVsdCB2YWx1ZXMgYW5kCiAgICAgICAgICAgIHRlbXBsYXRlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIEM+CiAgICAgICAgICAgICAgIHN0cnVjdCBCIHsKICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgdW5zaWduZWQgaW50IHNpemVfdHlwZTsKICAgICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBzaXplX3R5cGUgbmluZGV4ID0gc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPigtMSk7CiAgICAgICAgICAgICAgICAgICB2b2lkIGZvbyhzaXplX3R5cGUgaW5kZXggPSBuaW5kZXgpOwogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgQnVncyByZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKCjA3LzA1LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBDaGFuZ2VkIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBTV0lHX0NvbnZlcnRQdHIoKSBmdW5jdGlvbgoJICAgIGZvciB0aGUgU1dJRy9SdWJ5IHJ1bnRpbWUgc3VwcG9ydCBzbyB0aGF0IGl0IGxvb2tzIGxpa2UgdGhlCgkgICAgUHl0aG9uIHZlcnNpb24uIElmIHRoZSBsYXN0IGFyZ3VtZW50IChmbGFncykgaXMgbm9uLXplcm8sCgkgICAgU1dJR19Db252ZXJ0UHRyKCkgd2lsbCByYWlzZSBhbiBleGNlcHRpb24gZm9yIHR5cGUgbWlzbWF0Y2hlcwoJICAgIGFzIGJlZm9yZS4gSWYgZmxhZ3MgaXMgemVybywgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiAtMSBmb3IKCSAgICB0eXBlIG1pc21hdGNoZXMgd2l0aG91dCByYWlzaW5nIGFuIGV4Y2VwdGlvbi4gCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgUlVCWSBNT0RVTEUgKioqCgowNy8wNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE92ZXJsb2FkZWQgZnVuY3Rpb25zL21ldGhvZHMvY29uc3RydWN0b3JzIG5vdyB3b3JrIGluIG1hbnkgbGFuZ3VhZ2UKICAgICAgICAgICAgbW9kdWxlcy4gIFRoZSBzdXBwb3J0IGlzIGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQtLWp1c3QgY2FsbCB0aGUKICAgICAgICAgICAgZnVuY3Rpb24gbm9ybWFsbHkgYW5kIFNXSUcgd2lsbCBkaXNwYXRjaCB0byB0aGUgY29ycmVjdCBpbXBsZW1lbnRhdGlvbi4KICAgICAgICAgICAgVGhlcmUgYXJlIGEgdmFyaWV0eSBvZiBpc3N1ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMuICBQbGVhc2UgcmVmZXIKICAgICAgICAgICAgdG8gdGhlIG92ZXJsb2FkaW5nIHNlY3Rpb24gb2YgRG9jL01hbnVhbC9TV0lHUGx1cy5odG1sIGZvciBkZXRhaWxzLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgICAgIAowNy8wNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgYnVnIHdpdGggbmFtZXNwYWNlcywgZW51bXMsIGFuZCB0ZW1wbGF0ZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIG5hbWVzcGFjZSBoZWxsbyB7CiAgICAgICAgICAgICAgICAgIGVudW0gSGVsbG8geyBIaSwgSG9sYSB9OwogCiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlIDxIZWxsbyBIPgogICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRyYWl0cwogICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgZG91YmxlIHZhbHVlX3R5cGU7CiAgICAgICAgICAgICAgICAgICAgICB9OwogCiAgICAgICAgICAgICAgICAgdHJhaXRzPEhpPjo6dmFsdWVfdHlwZSBzYXlfaGkoKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJhaXRzPEhpPjo6dmFsdWVfdHlwZSgxKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgU1dJRyB3YXNuJ3QgZ2VuZXJhdGluZyB3cmFwcGVycyB0aGF0IHByb3Blcmx5IHF1YWxpZmllZCAKICAgICAgICAgICAgdHJhaXRzPEhpPi4gIFJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuICAgICAgICAgCgowNi8zMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFN1cHBsaWVkIGFycmF5IHZhcmlhYmxlIHR5cGVtYXBzIGZvciBUY2wgbW9kdWxlLiAgIElmIHlvdSBoYXZlIGEKICAgICAgICAgICAgdmFyaWFibGUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIGludCBmb29bMTBdOwoKICAgICAgICAgICAgdGhlbiBhIHNldCBmdW5jdGlvbiBsaWtlIHRoaXMgaXMgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgICAgIHZvaWQgZm9vX3NldChpbnQgKngpIHsKICAgICAgICAgICAgICAgICAgIG1lbW1vdmUoZm9vLHgsMTAqc2l6ZW9mKGludCkpOwogICAgICAgICAgICAgICAgfQoKMDYvMzAvMjAwMjogYmVhemxleQogICAgICAgICAgICBOZXcgJWZyYWdtZW50IGRpcmVjdGl2ZS4gICBXaGVuIHdyaXRpbmcgdHlwZW1hcHMsIGl0IGNhbiBiZSBlYXN5IHRvCiAgICAgICAgICAgIGdldCBjYXJyaWVkIGF3YXkgYW5kIHdyaXRlIGEgbG90IG9mIGNvZGUuICBIb3dldmVyLCBkb2luZyBzbyBjYXVzZXMKICAgICAgICAgICAgdHJlbWVuZG91cyBjb2RlIGJsb2F0LiAgIEEgY29tbW9uIHdheSB0byBzb2x2ZSB0aGlzIGlzIHRvIHdyaXRlIAogICAgICAgICAgICBoZWxwZXIgZnVuY3Rpb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICAgIHZvaWQgc29tZV9oZWxwZXJfZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgdHlwZSB7CiAgICAgICAgICAgICAgICAgICBzb21lX2hlbHBlcl9mdW5jdGlvbiguLi4pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhlIG9ubHkgcHJvYmxlbSB3aXRoIHRoaXMgaXMgdGhhdCB0aGUgd3JhcHBlciBmaWxlIGdldHMgcG9sbHV0ZWQKICAgICAgICAgICAgd2l0aCBoZWxwZXIgZnVuY3Rpb25zIGV2ZW4gaWYgdGhleSBhcmVuJ3QgdXNlZC4gICAgVG8gZml4IHRoaXMsCiAgICAgICAgICAgIGEgbmV3IGZyYWdtZW50IGRpcmVjdGl2ZSBpcyBhdmFpbGFibGUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIChjb3JyZWN0ZWQgdHlwbyBpbiBsaW5lIGJlbG93IC0gMDYvMjYvMjAwOCkKICAgICAgICAgICAgICAgJWZyYWdtZW50KCJ0eXBlX2hlYWRlciIsImhlYWRlciIpICV7CiAgICAgICAgICAgICAgICAgIHZvaWQgc29tZV9oZWxwZXJfZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4sIGZyYWdtZW50PSJ0eXBlX2hlYWRlciIpIHR5cGUgewogICAgICAgICAgICAgICAgICAgc29tZV9oZWxwZXJfZnVuY3Rpb24oLi4uKTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgY29kZSBmcmFnbWVudCBpcyBvbmx5IGVtaXR0ZWQgaWYgdGhlIHR5cGVtYXAgaXMKICAgICAgICAgICAgYWN0dWFsbHkgdXNlZC4gICBBIHNpbWlsYXIgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCBmb3IgZGVjbGFyYXRpb24KICAgICAgICAgICAgYW5ub3RhdGlvbiBhbmQgdGhlICVmZWF0dXJlIGRpcmVjdGl2ZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJWZlYXR1cmUoImZyYWdtZW50IiwidHlwZV9oZWFkZXIiKSAgU29tZURlY2xhcmF0aW9uOwoKICAgICAgICAgICAgVGhlIGZpcnN0IGFyZ3VtZW50IHRvICVmcmFnbWVudCBpcyB0aGUgZnJhZ21lbnQgbmFtZS4gIFRoZSBzZWNvbmQgYXJndW1lbnQKICAgICAgICAgICAgaXMgdGhlIGZpbGUgc2VjdGlvbiB3aGVyZSB0aGUgZnJhZ21lbnQgc2hvdWxkIGJlIGVtaXR0ZWQuICAKCiAgICAgICAgICAgIFRoZSBwcmltYXJ5IHVzZSBvZiB0aGlzIGRpcmVjdGl2ZSBpcyBmb3Igd3JpdGVycyBvZiBsYW5ndWFnZSBtb2R1bGVzCiAgICAgICAgICAgIGFuZCBhZHZhbmNlZCB1c2VycyB3YW50aW5nIHRvIHN0cmVhbWxpbmUgdHlwZW1hcCBjb2RlLgoKICAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBORVcgRkVBVFVSRSAqKioKCjA2LzMwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU3VwcGxpZWQgbWVtYmVyaW4gdHlwZW1hcHMgZm9yIGFsbCBhcnJheXMgaW4gYW4gYXR0ZW1wdCB0byBlbGltaW5hdGUKICAgICAgICAgICAgY29uZnVzaW9uIGFib3V0IHRoZWlyIHVzZS4KCjA2LzI5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIHNtYXJ0LXBvaW50ZXJzLiAgV2hlbiBhIGNsYXNzIGRlZmluZXMKICAgICAgICAgICAgb3BlcmF0b3ItPigpIGxpa2UgdGhpcwoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIEJhciAqb3BlcmF0b3ItPigpOwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFNXSUcgbG9jYXRlcyBjbGFzcyBCYXIgYW5kIHRyaWVzIHRvIHdyYXAgaXRzIG1lbWJlciB2YXJpYWJsZXMgYW5kCiAgICAgICAgICAgIG1ldGhvZHMgYXMgcGFydCBvZiBGb28uICBGb3IgZXhhbXBsZSwgaWYgQmFyIHdhcyBkZWZpbmVkIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICBpbnQgeDsKICAgICAgICAgICAgICAgICAgICBpbnQgc3BhbSgpOwogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgWW91IGNvdWxkIGRvIHRoaXMgKGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UpOgoKICAgICAgICAgICAgICBmID0gRm9vKCkKICAgICAgICAgICAgICBmLnggPSA0ICAgICAgICAgICAgIyBBY2Nlc3NlcyBCYXI6OngKICAgICAgICAgICAgICBmLnNwYW0oKSAgICAgICAgICAgIyBBY2Nlc3NlcyBCYXI6OnNwYW0KCiAgICAgICAgICAgIFRoZSBwcmltYXJ5IHVzZSBvZiB0aGlzIGZlYXR1cmUgaXMgdG8gZW11bGF0ZSB0aGUgYmVoYXZpb3Igb2YgQysrCiAgICAgICAgICAgIHNtYXJ0LXBvaW50ZXJzLS0td2hpY2ggYWxsb3cgYXR0cmlidXRlcyB0byBhY2Nlc3NlZCB0cmFuc3BhcmVudGx5CiAgICAgICAgICAgIHRocm91Z2ggb3BlcmF0b3ItPi4KCiAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYXV0b21hdGljYWxseSBpbiBTV0lHLS0tbm8gc3BlY2lhbCBkaXJlY3RpdmVzCiAgICAgICAgICAgIGFyZSBuZWVkZWQuICAgVG8gZGlzYWJsZSB0aGlzIGJlaGF2aW9yLiAgVXNlICVpZ25vcmUgdG8gaWdub3JlIAogICAgICAgICAgICBvcGVyYXRvci0+LgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowNi8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIERlcHJlY2F0ZWQgdGhlICVleGNlcHQgZGlyZWN0aXZlLiAgICVleGNlcHRpb24gc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4KCjA2LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWFqb3IgY2xlYW51cCBvZiB0aGUgbW9kdWxlcyBkaXJlY3RvcnkuICBFbGltaW5hdGVkIG1vc3QKICAgICAgICAgICAgaGVhZGVyIGZpbGVzLCBjb25zb2xpZGF0ZWQgbW9kdWxlIGNvZGUgaW50byBzaW5nbGUgZmlsZXMuCgowNi8yNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFJld29ya2VkIHRoZSBpbnN0YW50aWF0aW9uIG9mIGxhbmd1YWdlIG1vZHVsZXMuICBBbGwgbGFuZ3VhZ2UKICAgICAgICAgICAgbW9kdWxlcyBtdXN0IG5vdyBkZWZpbmUgYSBmYWN0b3J5IGZ1bmN0aW9uIHNpbWlsYXIgdG8gdGhpczoKCiAgICAgICAgICAgICAgICBleHRlcm4gIkMiIExhbmd1YWdlICoKICAgICAgICAgICAgICAgIHN3aWdfcHl0aG9uKHZvaWQpIHsKICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUFlUSE9OKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHRoZW4gcGxhY2VkIGluIGEgdGFibGUgYW5kIGFzc29jaWF0ZWQgd2l0aAogICAgICAgICAgICBhIGNvbW1hbmQgbGluZSBvcHRpb24gaW4gc3dpZ21haW4uY3h4LiAgCgogICAgICAgICAgICBUaGlzIGFwcHJvYWNoIGhhcyBhIG51bWJlciBvZiBiZW5lZml0cy4gIEl0IGRlY291cGxlcyB0aGUgCiAgICAgICAgICAgIFNXSUcgbWFpbiBwcm9ncmFtIGZyb20gaGF2aW5nIHRvIGtub3cgYWJvdXQgdGhlIGNsYXNzCiAgICAgICAgICAgIGRlZmluaXRpb25zIGZvciBlYWNoIG1vZHVsZS4gIEFsc28sIGJ5IHVzaW5nIGEgZmFjdG9yeQogICAgICAgICAgICBmdW5jdGlvbiwgaXQgd2lsbCBiZSBlYXNpZXIgdG8gaW1wbGVtZW50IGR5bmFtaWMgbG9hZGluZwogICAgICAgICAgICBvZiBtb2R1bGVzIChzaW1wbHkgbG9hZCB0aGUgZmlsZSBhbmQgaW52b2tlIHRoZSBmYWN0b3J5CiAgICAgICAgICAgIGZ1bmN0aW9uKS4KCjA2LzI0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc3ludGF4IGVycm9yIGZvciByZWZlcmVuY2UgY29udmVyc2lvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yIEZvbyAmKCk7CgowNi8yNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN5bnRheCBlcnJvciBmb3Igb3BlcmF0b3IgbmV3W10gYW5kIG9wZXJhdG9yIGRlbGV0ZVtdLgoKMDYvMjQvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBjb2RlIGdlbmVyYXRpb24gcHJvYmxlbSBmb3IgY29uc3RhbnRzIGFuZCBkZWZhdWx0IGFyZ3VtZW50cwogICAgICAgICAgICBpbnZvbHZpbmcgdGVtcGxhdGVzLgoKMDYvMTkvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEZpeGVkIGEgYnVnIGZvciB0aGUgJy1mZWF0dXJlJyBjb21tYW5kIGxpbmUgYXJndW1lbnQ7CiAgICAgICAgICAgIHRoYXQgc2V0dGluZyB3YXMgZWZmZWN0aXZlbHkgYmVpbmcgaWdub3JlZCBhbmQgc28gdGhlIGZlYXR1cmUKICAgICAgICAgICAgbmFtZSB3YXMgYWx3YXlzIHNldCBlcXVhbCB0byB0aGUgbW9kdWxlIG5hbWUuCgowNi8xNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW1zIHdpdGggc3RhdGljIG1lbWJlcnMgYW5kIGVudW1zIGluIHRlbXBsYXRlcy4KClZlcnNpb24gMS4zLjEzIChKdW5lIDE3LCAyMDAyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjA2LzE2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBidWcgd2l0aCBfX0ZJTEVfXyBleHBhbnNpb24gaW4gdGhlIHByZXByb2Nlc3Nvci4gICBPbiBXaW5kb3dzLAogICAgICAgICAgICB0aGUgYmFja3NsYXNoIChcKSBpcyBub3cgY29udmVydGVkIHRvIChcXCkgaW4gdGhlIHN0cmluZyBsaXRlcmFsCiAgICAgICAgICAgIHVzZWQgZm9yIF9fRklMRV9fLiAgUmVwb3J0ZWQgYnkgU3RldmUgR2xhc2VyLgoKMDYvMTQvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCB3YXJuaW5nIG1lc3NhZ2UgYWJvdXQgJ25hbWUgcHJpdmF0ZSBpbiB0aGlzIGNvbnRleHQnLiAgVGhlCiAgICAgICAgICAgIHdhcm5pbmcgaXMgb25seSBnZW5lcmF0ZWQgZm9yIHB1YmxpYyBtZXRob2RzLiAgUmVwb3J0ZWQgYnkKICAgICAgICAgICAgU2NvdHQgTWljaGVsLgogCjA2LzE0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc29tZSBwcm9ibGVtcyByZWxhdGVkIHRvIHRlbXBsYXRlIGluc3RhbnRpYXRpb24gCiAgICAgICAgICAgIGFuZCBuYW1lc3BhY2VzLiAgIFdoZW4gU1dJRyBleHBhbmRzIGEgdGVtcGxhdGUsIGl0IGRvZXMKICAgICAgICAgICAgc28gd2l0aCBmdWxseSByZXNvbHZlZCB0eXBlcy4gIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSB0aGlzOgoKICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIGZvbyB7IH07CiAgICAgICAgICAgICAgICB0eXBlZGVmIGRvdWJsZSBEb3VibGU7CiAgICAgICAgICAgICAgICAldGVtcGxhdGUoZm9vX2QpIGZvbzxEb3VibGU+OwoKICAgICAgICAgICAgdGhlbiwgaXQgaXMgaGFuZGxlZCBhcyBmb288ZG91YmxlPiBpbiB0aGUgdHlwZXN5c3RlbS4KICAgICAgICAgICAgVGhpcyBmaXhlcyBhIG51bWJlciBvZiBzdWJ0bGUgcHJvYmxlbXMgd2l0aCBpbmhlcml0YW5jZQogICAgICAgICAgICBhbmQgdGVtcGxhdGVzLgoKMDYvMTQvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIG1pc3NpbmcgYm9vbCB0eXBlbWFwcyBmb3IgSU5QVVQsIE9VVFBVVCBhbmQKCSAgICBJTk9VVCBpbiBMaWIvcnVieS90eXBlbWFwcy5pLgoKMDUvMjkvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXggZm9yIGEgY291cGxlIG9mIGJyb2tlbiBwcmFnbWFzLgoKMDUvMjkvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeCBmb3IgdW5uZWNlc3NhcnkgY2FzdCB3aGVuIHdyYXBwaW5nIGdsb2JhbCB2YXJpYWJsZSB3aGVyZSAKICAgICAgICAgICAgdGhlIHR5cGUgaXMgbm90IHBhcnNlZCBieSBTV0lHIC0gSmF2YSB2YXJpYWJsZXMgZXhhbXBsZSAKICAgICAgICAgICAgZmFpbHVyZSBhcyByZXBvcnRlZCBieSBMYXJyeSBWaXJkZW4uCgowNi8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1vZGlmaWVkICV0ZW1wbGF0ZSB0byBhbGxvdyBmb3IgZW1wdHkgaW5zdGFudGlhdGlvbnMuCgogICAgICAgICAgICAgICAgICAldGVtcGxhdGUoKSBmb288aW50LGludD47CgogICAgICAgICAgICBUaGlzIHJlZ2lzdGVycyBmb288aW50LGludD4gd2l0aCB0aGUgdHlwZSBzeXN0ZW0sIGJ1dAogICAgICAgICAgICBkb2Vzbid0IHdyYXAgaXQgKHNhbWUgYXMgJWlnbm9yZSkuICAgVGhpcyBtYXkgb25seSBiZSBhCiAgICAgICAgICAgIHRlbXBvcmFyeSBtZWFzdXJlLiAgIFNXSUcgbWlnaHQgYmUgYWJsZSB0byBhdXRvbWF0aWNhbGx5CiAgICAgICAgICAgIGluc3RhbnRpYXRlIHRlbXBsYXRlcyBpbiBjZXJ0YWluIGNhc2VzLgoKMDYvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBmdW5jdGlvbiBwcm90b3R5cGUgcHJvYmxlbXMgd2l0aCBUY2wgOC40CgowNi8wOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCB0ZW1wbGF0ZXMgYW5kIGxvY2F0aW9uIG9mIGJhc2UgY2xhc3Nlcy4gIAogICAgICAgICAgICBUaGlzIG9uZSBpcyBhIGxpdHRsZSBtaW5kLWJlbmRpbmcsIGJ1dCBoZXJlIGlzIGFuIGV4YW1wbGUKICAgICAgICAgICAgdGhhdCBpbGx1c3RyYXRlczoKIAogICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIEFyZ1R5cGUsIGNsYXNzIFJlc1R5cGU+CiAgICAgICAgICAgICBzdHJ1Y3QgdHJhaXRzCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIHR5cGVkZWYgQXJnVHlwZSBhcmdfdHlwZTsKICAgICAgICAgICAgICAgICAgdHlwZWRlZiBSZXNUeXBlIHJlc190eXBlOwogICAgICAgICAgICAgfTsKIAogICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIEFyZ1R5cGUsIGNsYXNzIFJlc1R5cGU+CiAgICAgICAgICAgICBzdHJ1Y3QgRnVuY3Rpb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBBRiwgY2xhc3MgQUc+CiAgICAgICAgICAgICBzdHJ1Y3QgQ2xhc3MgOiBGdW5jdGlvbjx0eXBlbmFtZSB0cmFpdHM8QUYsIEFHPjo6YXJnX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSB0cmFpdHM8QUYsIEFHPjo6cmVzX3R5cGU+CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICV0ZW1wbGF0ZSh0cmFpdHNfZGQpIHRyYWl0cyA8ZG91YmxlLCBkb3VibGU+OwogICAgICAgICAgICAgJXRlbXBsYXRlKEZ1bmN0aW9uX2RkKSBGdW5jdGlvbiA8ZG91YmxlLCBkb3VibGU+OwogICAgICAgICAgICAgJXRlbXBsYXRlKENsYXNzX2RkKSBDbGFzcyA8ZG91YmxlLCBkb3VibGU+OwoKCiAgICAgICAgICAgIEluIHRoaXMgZXhhbXBsZSwgdGhlIGJhc2UgY2xhc3Mgb2YgJ0NsYXNzJyBpcyBkZXRlcm1pbmVkIGZyb20KICAgICAgICAgICAgdGhlIEZ1bmN0aW9uIHRlbXBsYXRlLCBidXQgdGhlIHR5cGVzIGFyZSBvYnRhaW5lZCB0aHJvdWdoIHR5cGVkZWZzLgogICAgICAgICAgICBCZWNhdXNlIG9mIHRoaXMsIFNXSUcgY291bGQgbm90IGxvY2F0ZSB0aGUgd3JhcHBlZCBiYXNlIGNsYXNzCiAgICAgICAgICAgIChGdW5jdGlvbjxkb3VibGUsZG91YmxlPikuICAgU2hvdWxkIGJlIGZpeGVkIGluIDEuMy4xMyBldmVuCiAgICAgICAgICAgIHRob3VnaCBJIGNhbiB0aGluayBvZiBhIG1pbGxpb24gb3RoZXIgdGhpbmdzIHRoYXQgbWlnaHQKICAgICAgICAgICAgYWxzbyBiZSBicm9rZW4uCgowNi8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgcHJvYmxlbSB3aXRoIGNvbnZlcnNpb24gb3BlcmF0b3JzLiAgSWYgeW91IGhhZCBhbgogICAgICAgICAgICBvcGVyYXRvciBsaWtlIHRoaXMsCgogICAgICAgICAgICAgICAgICBvcGVyYXRvciBkb3VibGUoKSBjb25zdDsKCiAgICAgICAgICAgIFNXSUcgd2FzIG9tbWl0dGluZyB0aGUgImNvbnN0IiBxdWFsaWZpZXIuICBUaGlzIGFmZmVjdGVkCiAgICAgICAgICAgICVyZW5hbWUgYW5kIG90aGVyIGRpcmVjdGl2ZXMuICBSZXBvcnRlZCBieSBaaG9uZyBSZW4uCgowNi8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIExlc3NlbmVkIHRoZSBzdHJpY3RuZXNzIG9mIGFic3RyYWN0IGNsYXNzIGNoZWNraW5nLiAgSWYKICAgICAgICAgICAgeW91IGhhdmUgY29kZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IG1ldGhvZCgpID0gMDsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgY2xhc3MgQmFyIDogcHVibGljIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgQmFyKCk7CiAgICAgICAgICAgICAgICAgICB+QmFyKCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgIFNXSUcgd2lsbCBnbyBhaGVhZCBhbmQgZ2VuZXJhdGUgY29uc3RydWN0b3IvZGVzdHJ1Y3RvcnMKICAgICAgICAgICAgIGZvciBCYXIuICBIb3dldmVyLCBpdCB3aWxsIGFsc28gZ2VuZXJhdGUgYSB3YXJuaW5nIG1lc3NhZ2UgCiAgICAgICAgICAgICB0aGF0ICJCYXIiIG1pZ2h0IGJlIGFic3RyYWN0IChzaW5jZSBtZXRob2QoKSBpc24ndCBkZWZpbmVkKS4KICAgICAgICAgICAgIEluIFNXSUctMS4zLjEyLCBTV0lHIHJlZnVzZWQgdG8gZ2VuZXJhdGUgYSBjb25zdHJ1Y3RvciBhdCBhbGwuCgowNi8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIENoYW5nZSB0byAldGVtcGxhdGUgZGlyZWN0aXZlLiAgSWYgeW91IHNwZWNpZnkgc29tZXRoaW5nIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAldGVtcGxhdGUodmkpIHN0ZDo6dmVjdG9yPGludD47CgogICAgICAgICAgICBJdCBpcyAqZXhhY3RseSogdGhlIHNhbWUgYXMgdGhpczoKIAogICAgICAgICAgICAgICAgbmFtZXNwYWNlIHN0ZCB7CiAgICAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZpKSB2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFNXSUctMS4zLjEyIHRyaWVkIHRvIGluc3RhbnRpYXRlIHRoZSB0ZW1wbGF0ZSBvdXRzaWRlIG9mIHRoZSBuYW1lc3BhY2UKICAgICAgICAgICAgdXNpbmcgc29tZSB0cmljay4gIEhvd2V2ZXIsIHRoaXMgd2FzIGV4dHJlbWVseSBwcm9ibGVtYXRpYyBhbmQgZnVsbAogICAgICAgICAgICBob2xlcy4gICBUaGlzIHZlcnNpb24gaXMgc2FmZXIuCgowNi8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGJ1ZyB3aXRoIHNjb3BlIHF1YWxpZmljYXRpb24gYW5kIHRlbXBsYXRlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICBBPEI6OkM+OjpERAoKICAgICAgICAgICAgQmVmb3JlLCB0aGlzIHdhcyBzZXBhcmF0ZWQgYXMgc2NvcGVzIEE8QiwgQz4sIGFuZCBERC4gIEZpeGVkIG5vdy4KCjA2LzA2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWxsb3cgdGhlIGZvbGxvd2luZyBzeW50YXg6IAogICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgY2xhc3MgQSB7IH07CiAgICAgICAgICAgICAgIHN0cnVjdCBCIDogQSB7IC4uLiB9OwoKICAgICAgICAgICAgQSBiYXNlIGNsYXNzIHdpdGhvdXQgYSBzcGVjaWZpZXIgaXMgYXNzdW1lZCB0byBiZSBwdWJsaWMgZm9yIGEgc3RydWN0LgogCjA2LzA2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc3ludGF4IGVycm9yIHdpdGggdGVtcGxhdGUgY29uc3RydWN0b3IgaW5pdGlhbGl6ZXJzLgogICAgICAgICAgICBSZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDYvMDYvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBidWcgd2l0aCBkZWZhdWx0IHRlbXBsYXRlIGFyZ3VtZW50cy4gCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuCgowNi8wNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN1YnRsZSBwcm9ibGVtcyB3aXRoICVyZW5hbWUgZGlyZWN0aXZlIGFuZCB0ZW1wbGF0ZQogICAgICAgICAgICBleHBhbnNpb24uCgogICAgICAgICAgICBDb2RlIGxpa2UgdGhpcyBzaG91bGQgbm93IHdvcms6CgogICAgICAgICAgICAgICAlcmVuYW1lKGJsYWgpIGZvbzxkb3VibGU+OjptZXRob2Q7CiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBmb28gewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICB2b2lkIG1ldGhvZCgpOwogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgJXRlbXBsYXRlKHdoYXRldmVyKSBmb288ZG91YmxlPjsKCjA2LzA1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgUmVzb2x2ZWQgc29tZSB0cmlja3kgaXNzdWVzIG9mIG11bHRpLXBhc3MgY29tcGlsYXRpb24gYW5kIAogICAgICAgICAgICBhbmQgaW5oZXJpdGFuY2UuICBUaGUgZm9sbG93aW5nIHNpdHVhdGlvbiBub3cgZ2VuZXJhdGVzCiAgICAgICAgICAgIGFuIGVycm9yOgoKICAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIDogcHVibGljIEJhciB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGNvZGUgZ2VuZXJhdGVzIGEgd2FybmluZyBhYm91dCBpbmNvbXBsZXRlIGNsYXNzZXMuCgogICAgICAgICAgICAgICAgICBjbGFzcyBCYXI7CiAgICAgICAgICAgICAgICAgIGNsYXNzIEZvbyA6IHB1YmxpYyBCYXIgeyB9OwoKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBjb2RlIGdlbmVyYXRlcyBhIHdhcm5pbmcgYWJvdXQgYW4gdW5kZWZpbmVkIGNsYXNzLgoKICAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIDogcHVibGljIEJhciB7IH07ICAvLyBCYXIgdW5kZWZpbmVkCgogICAgICAgICAgICBUaGlzIGZpeGVzIGEgZmFpbGVkIGFzc2VydGlvbiBidWcgcmVwb3J0ZWQgYnkgSmFzb24gU3Rld2FydC4KCjA2LzA1LzIwMDI6IGxqb2huc29uCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBhIHdhcm5pbmcgbWVzc2FnZSBmb3IgdGhlIFJ1YnkgbW9kdWxlIGFib3V0IHRoZSBsYWNrCiAgICAgICAgICAgIG9mIHN1cHBvcnQgZm9yIG11bHRpcGxlIGluaGVyaXRhbmNlLiBPbmx5IHRoZSBmaXJzdCBiYXNlIGNsYXNzCiAgICAgICAgICAgIGxpc3RlZCBpcyB1c2VkIGFuZCB0aGUgb3RoZXJzIGFyZSBpZ25vcmVkLiAoUmVwb3J0ZWQgYnkgQ3JhaWcKICAgICAgICAgICAgRmlsZXMpLgogICAgICAgICAgICAKMDYvMDMvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIGJ1ZyB3aXRoIHN0cnVjdCBkZWNsYXJhdGlvbnMgYW5kIHR5cGVkZWYuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCBGb28gRm9vOwogICAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBBIGZldyBvdGhlciBzdWJ0bGUgc3RydWN0IHJlbGF0ZWQgdHlwaW5nIHByb2JsZW1zIHdlcmUKICAgICAgICAgICAgYWxzbyByZXNvbHZlZC4KClZlcnNpb24gMS4zLjEyIChKdW5lIDIsIDIwMDIpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgIAowNS8zMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gcmVsYXRlZCB0byBmb3J3YXJkIHRlbXBsYXRlIGNsYXNzIGRlY2xhcmF0aW9ucyBhbmQKICAgICAgICAgICAgbmFtZXNwYWNlcy4gIEJ1ZyByZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDUvMzAvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCAnbWFrZSB1bmluc3RhbGwnIHRhcmdldC4gIENvbnRyaWJ1dGVkIGJ5IEpvZWwgUmVlZC4KCjA1LzI5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcmF0aGVyIGluc2lkaW91cyBidWcgd2l0aCAlcmVuYW1lLCAlZmVhdHVyZSBhbmQgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24uCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVleGNlcHRpb24gdmVjdG9yOjpfX2dldGl0ZW1fXyB7CiAgICAgICAgICAgICAgICAgICAgIC4uLiBzb21lIGV4Y2VwdGlvbiAuLi4KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyB2ZWN0b3IgewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgIFQgX19nZXRpdGVtX18oaW50IGluZGV4KTsgICAgICAgLy8gRmluZQogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTw+IGNsYXNzIHZlY3RvcjxpbnQ+IHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICBUIF9fZ2V0aXRlbV9fKGludCBpbmRleCk7ICAgICAgIC8vIE9vcHMuCiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgTm93LCB0aGUgJWV4Y2VwdGlvbiBkaXJlY3RpdmUgKGFuZCBvdGhlciBmZWF0dXJlcykgc2hvdWxkIGNvcnJlY3RseSBhcHBseSB0bwogICAgICAgICAgICBib3RoIHZlY3RvciBhbmQgc3BlY2lhbGl6YXRpb25zLgoKMDUvMjkvMjAwMjogYmVhemxleQogICAgICAgICAgICBTdWJ0bGUgY2hhbmdlcyB0byAldGVtcGxhdGUoKSBkaXJlY3RpdmUuICAgVGVtcGxhdGUgYXJndW1lbnRzIGFyZSBub3cKICAgICAgICAgICAgcmVkdWNlZCB0byBwcmltaXRpdmUgdHlwZXMgaW4gdGVtcGxhdGUgbWF0Y2hpbmcuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIHZlY3RvcjxUICo+IHsKICAgICAgICAgICAgICAgIC4uLiBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICB0eXBlZGVmIGludCAqSW50UHRyOyAgICAgLy8gR3Jvc3MgdHlwZWRlZgoKICAgICAgICAgICAgICAgLy8gR2V0cyB0aGUgYWJvdmUgcGFydGlhbCBzcGVjaWFsaXphdGlvbgogICAgICAgICAgICAgICAldGVtcGxhdGUodmVjdG9ySW50UHRyKSB2ZWN0b3I8SW50UHRyPjsKCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIGlzIGV4dHJlbWVseSBzdWJ0bGUsIGJ1dCBpdCBmaXhlcyBhIG51bWJlciBvZiBwb3RlbnRpYWwKICAgICAgICAgICAgaG9sZXMgaW4gTHVpZ2kncyBTVEwgbGlicmFyeSBtb2R1bGVzLiAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICB0eXBlZGVmIGludCBJbnRlZ2VyOwogICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY3RvcmkpIHZlY3RvcjxpbnQ+OwoKMDUvMjkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCByYXRoZXIgaW5zaWRpb3VzIHR5cGVtYXAgYnVnIHJlbGF0ZWQgdG8gY29uc3QuICBjb25zdAogICAgICAgICAgICB3YXMgYmVpbmcgZGlzY2FyZGVkIHRocm91Z2ggdHlwZWRlZnMuCgowNS8yOS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgaW5wdXQgdHlwZW1hcHMgZm9yIGNvbnN0IHJlZmVyZW5jZXMgdG8gcHJpbWl0aXZlCiAgICAgICAgICAgIHR5cGVzIChpbiBMaWIvcnVieS9ydWJ5LnN3ZykuCgowNS8yOS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFRoZSBqYXZhIGFycnJheSBzdXBwb3J0IGZ1bmN0aW9ucyBhcmUgZW5jbG9zZWQgYnkgCiAgICAgICAgICAgIGEgU1dJR19OT0FSUkFZUyAjZGVmaW5lLiBVc2VmdWwgaWYgbm90IHVzaW5nIGFycmF5cyBhbmQgCiAgICAgICAgICAgIGl0IGlzIGRlc2lyYWJsZSB0byBtaW5pbWlzZSB0aGUgYW1vdW50IG9mIGNvbXBpbGVkIGNvZGUuCgowNS8yOS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEVudW1zIHdlcmUgbm90IHJlbmFtZWQgd2hlbiB1c2luZyAlbmFtZSBvciAlcmVuYW1lCiAgICAgICAgICAgIGZpeC4KCjA1LzI4LzIwMDI6IGxqb2huc29uCiAgICAgICAgICAgIFtSdWJ5XSBNb2RpZmllZCB0aGUgbmFtZSBvZiB0aGUgd3JhcHBlciBmdW5jdGlvbnMgZm9yIHRoZQoJICAgICJuZXciIHNpbmdsZXRvbiBtZXRob2QgYW5kICJpbml0aWFsaXplIiBpbnN0YW5jZSBtZXRob2QgZm9yCgkgICAgY29uc2lzdGVuY3kgd2l0aCB0aGUgb3RoZXIgbGFuZ3VhZ2UgbW9kdWxlcy4gVGhlIHdyYXBwZXIgbmFtZQoJICAgIGZvciB0aGUgZnVuY3Rpb24gdGhhdCBpbXBsZW1lbnRzICJuZXciIGlzIGFsbG9jX2NsYXNzbmFtZSBhbmQKCSAgICB0aGUgd3JhcHBlciBuYW1lIGZvciB0aGUgZnVuY3Rpb24gdGhhdCBpbXBsZW1lbnRzICJpbml0aWFsaXplIgoJICAgIGlzIG5ld19jbGFzc25hbWUuCgoKMDUvMjcvMjAwMjogYmVhemxleQogICAgICAgICAgICBDaGFuZ2VzIHRvIHJ1bnRpbWUuICBQb2ludGVyIGNvbnZlcnNpb24vY3JlYXRpb24gZnVuY3Rpb25zCiAgICAgICAgICAgIG5vdyBhbG1vc3QgYWx3YXlzIGhhdmUgYW4gZXh0cmEgImZsYWdzIiBhcmd1bWVudC4gIEZvcgogICAgICAgICAgICBleGFtcGxlOgoKICAgICAgICAgICAgICBTV0lHX0NvbnZlcnRQdHIob2JqLCB2b2lkICoqLCBzd2lnX3R5cGVfaW5mbyAqdHksIGludCBmbGFncyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eCiAgICAgICAgICAgIFRoaXMgZXh0cmEgcGFyYW1ldGVyIGlzIHJlc2VydmVkIGZvciBmdXR1cmUgZXhwYW5zaW9uIGFuZCB3aWxsCiAgICAgICAgICAgIGJlIHVzZWQgZm9yIG1vcmUgY29udHJvbCBvdmVyIHBvaW50ZXJzIGluIGZ1dHVyZSB2ZXJzaW9ucy4KCjA1LzI3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4IGZvciBDKysgY2xhc3NlcyB3aXRoIHByaXZhdGUgYXNzaWdubWVudCBvcGVyYXRvcnMuICBJdAogICAgICAgICAgICBpcyBub3cgcG9zc2libGUgdG8gc2FmZWx5IHJldHVybiBvYmplY3RzIGxpa2UgdGhpcyBieSB2YWx1ZS4KICAgICAgICAgICAgQ2F2ZWF0OiAgdGhlIGNsYXNzIG11c3QgcHJvdmlkZSBhIGNvcHkgY29uc3RydWN0b3IuCgkgICAgCjA1LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgLXByb3h5IG9wdGlvbiBhZGRlZCB0byBtYW55IGxhbmd1YWdlIG1vZHVsZXMuICBUaGlzIGlzIHRoZQogICAgICAgICAgICBzYW1lIGFzIC1zaGFkb3cuICBXZSBhcmUgbWVyZWx5IGNoYW5naW5nIHRlcm1pbm9sb2d5LgogICAgICAgICAgICAKMDUvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgICBbcGVybF0gRml4ZWQgc29tZSBpbmNvbnNpc3RlbmNpZXMgaW4gdGhlIC1wYWNrYWdlIG9wdGlvbi4KICAgICAgICAgICAgLXBhY2thZ2UgbWVyZWx5IHNldHMgdGhlIHBhY2thZ2UgbmFtZSB0byBiZSB1c2VkIG9uIHRoZQogICAgICAgICAgICB3cmFwcGVycy4gIEl0IGRvZXMgbm90IGNoYW5nZSB0aGUgbmFtZSBvZiB0aGUgc2hhcmVkIGxpYnJhcnkKICAgICAgICAgICAgZmlsZSBvciB0aGUgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIC5wbSBmaWxlLiAgVGhpcyB3YXMKICAgICAgICAgICAgYnJva2VuIGF0IHNvbWUgcG9pbnQsIGJ1dCB3b3JrcyBhZ2FpbiBub3cuCgowNS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtwZXJsXSBGaXhlZCBbIDQ3NTQ1MiBdIG1lbW9yeSBsZWFrIGluIHJldHVybi1ieS12YWx1ZS4KICAgICAgICAgICAgUHJvYmxlbSByZWxhdGVkIHRvIHN0YXRpYyBtZW1iZXIgdmFyaWFibGVzIHJldHVybmluZyBuZXdseQogICAgICAgICAgICBhbGxvY2F0ZWQgb2JqZWN0cy4gUmVwb3J0ZWQgYnkgUm95IExlY2F0ZXMuCiAKMDUvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBbcGVybF0gRml4ZWQgWyA1MTMxMzQgXSAlQkxFU1NFRE1FTUJFUlMgaXNuJ3QgYWx3YXlzIHJpZ2h0LgogICAgICAgICAgICBSZXBvcnRlZCBieSBGbGV1ciBEaWFuYSBEcmFnYW4uCgowNS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTQwNzM1IF0gLWltcG9ydGFsbCBhbmQgdGhlIC1JIG9wdGlvbi4KCjA1LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW2d1aWxlXSBGaXhlZCBbIDUzMjcyMyBdIERlZmF1bHQgYXJnIGZvciBjaGFyKiBjYW4gU2VnVi4gIAogICAgICAgICAgICBFcnJvciBpbiBndWlsZSBtb2R1bGUuICBSZXBvcnRlZCBieSBCcmV0dCBXaWxsaWFtcy4KCjA1LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU3VidGxlIGNoYW5nZSB0byB0eXBlbWFwIGFwcGxpY2F0aW9uIGNvZGUuICBUaGUgImZyZWVhcmciCiAgICAgICAgICAgIHR5cGVtYXAgbXVzdCBleGFjdGx5IG1hdGNoIHVwIHdpdGggdGhlICJpbiIgb3IgImlnbm9yZSIKICAgICAgICAgICAgdHlwZW1hcC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgKGNoYXIgKmRhdGEsIGludCBsZW4pIHsgLi4uIH07CiAgICAgICAgICAgICAgICAgJXR5cGVtYXAoZnJlZWFyZykgY2hhciAqZGF0YSB7IC4uLiB9OyAKCiAgICAgICAgICAgICAgICAgdm9pZCBmb28oY2hhciAqZGF0YSwgaW50IGxlbik7CgogICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgImluIiB0eXBlbWFwIGlzIGFwcGxpZWQsIGJ1dCB0aGUKICAgICAgICAgICAgIGZyZWVhcmcgdHlwZW1hcCBpcyBub3QuICBUaGlzIGlzIGJlY2F1c2UgdGhlIGZyZWVhcmcKICAgICAgICAgICAgIHR5cGVtYXAgZG9lc24ndCBtYXRjaCB1cCB3aXRoIHRoZSBpbnB1dCBhcmd1bWVudCBzZXF1ZW5jZS4KCjA1LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1NDgyNzIgXSBEZWZhdWx0IGFyZ3VtZW50IGNvZGUgbWlzc2luZyBicmFjZXMuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEJyZXR0IFdpbGxpYW1zLgoKMDUvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDU0NzczMCBdIFN3aWdWYWx1ZVdyYXBwZXIgbmVlZGVkIGZvciBjb25zdHJ1Y3RvcnMuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IFdpbGxpYW0gRnVsdG9uLgoKMDUvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBVbmRlZmluZWQgaWRlbnRpZmllcnMgbm93IGV2YWx1YXRlIHRvIDAgd2hlbiBldmFsdWF0aW5nCiAgICAgICAgICAgIHByZXByb2Nlc3NvciBleHByZXNzaW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgI2lmICFGT08KICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICNlbmRpZgogICAgICAKICAgICAgICAgICAgd2hlcmUgRk9PIGlzIHVuZGVmaW5lZCBvciBzZXQgdG8gc29tZSBub24tbnVtZXJpYyB2YWx1ZS4KCiAgICAgICAgICAgIEZpeGVzIFsgNTQwODY4IF0gI2lmIGRlZmluZWQgd2hhdGV2ZXIgLSBub3QgcGFyc2VkLgogICAgICAgICAgICBSZXBvcnRlZCBieSBBZGFtIEh1cHAuCgogCjA1LzI0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU1dJRyBub3cgaWdub3JlcyB0aGUgQysrICdleHBvcnQnIGtleXdvcmQuCgowNS8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNvbWUgcmVmaW5lbWVudCBvZiB0eXBlLW5hbWUgbWFuZ2xpbmcgdG8gYWNjb3VudCBmb3IgcG9pbnRlcnMsIGFycmF5cywKICAgICAgICAgICAgcmVmZXJlbmNlcywgYW5kIG90aGVyIGVtYmVkZGVkIHR5cGUgY29uc3RydWN0cy4KCjA1LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgSW5pdGlhbCBhdHRlbXB0IGF0IHN1cHBvcnRpbmcgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbi4gIEF0CiAgICAgICAgICAgIHRoZSB2ZXJ5IGxlYXN0LCBpdCBpcyBwYXJzZWQgYW5kIHRoZSBjbGFzc2VzIGFyZSBzdG9yZWQuICBNYXRjaGluZwogICAgICAgICAgICBvZiBpbnN0YW50aWF0aW9ucyB0byBzcGVjaWFsaXplZCB2ZXJzaW9uIGlzIG1vcmUgbGltaXRlZCBhbmQgYmFzZWQgb24KICAgICAgICAgICAgdGhlIFNXSUcgZGVmYXVsdCB0eXBlbWFwIHJ1bGVzOgoKICAgICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgKgogICAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSBbXQogICAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSAmCgogICAgICAgICAgICBOb3csIHdoeSBpbiB0aGUgd29ybGQgd291bGQgeW91IHdhbnQgdG8gdXNlIHRoaXMgZmVhdHVyZT8gIE90aGVyCiAgICAgICAgICAgIHRoYW4gYWxsb3dpbmcgZm9yIHNsaWdodGx5IG1vZGlmaWVkIGNsYXNzIEFQSXMsIHRoaXMgY2FwYWJpbGl0eSBpcwogICAgICAgICAgICBwcmltYXJpbHkgdXNlZCB0byBwcm92aWRlIGFkdmFuY2VkIHdyYXBwaW5nIHN1cHBvcnQgZm9yIFNUTC1saWtlCiAgICAgICAgICAgIG9iamVjdHMuICBJdCBjYW4gYWxzbyBiZSBtaXhlZCB3aXRoIHR5cGVtYXBzLiAgSGVyZSBpcyBhbiBleGFtcGxlOgoKCiAgICAgICAgICAgICAgICAvKiBHZW5lcmljIHZlcnNpb24gKi8KICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIHZlY3RvciB7CiAgICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHZlY3RvcjxUPiAqIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBjb250YWluZXIgb2Ygb2JqZWN0cyAKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgLyogUGFydGlhbCBzcGVjaWFsaXphdGlvbiAocG9pbnRlcnMpICovCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyB2ZWN0b3I8VCAqPiB7CiAgICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHZlY3RvcjxUPiAqIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBjb250YWluZXIgb2YgcG9pbnRlcnMgdG8gb2JqZWN0cy4KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgLyogU3BlY2lhbGl6YXRpb24gKGludGVnZXJzKS4gKi8KICAgICAgICAgICAgICAgIHRlbXBsYXRlPD4gY2xhc3MgdmVjdG9yPGludD4gewogICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSB2ZWN0b3I8aW50PiAqIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBjb250YWluZXIgb2YgaW50ZWdlcnMuCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIEZFQVRVUkUgKioqCiAgICAgICAgICAgIAowNS8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEVuaGFuY2VtZW50IHRvIHR5cGVtYXBzLiAgIE5vcm1hbGx5LCB0eXBlbWFwIHZhcmlhYmxlcyBhcmUKICAgICAgICAgICAgcmVuYW1lZCB0byBhdm9pZCBjb25mbGljdHMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBpbnQgKiAoaW50IHRlbXApIHsKICAgICAgICAgICAgICAgICAgICAkMSA9ICZ0ZW1wOwogICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGlzIHJlc3VsdHMgaW4gY29kZSB0aGF0IGNyZWF0ZXMgYW5kIHVzZXMgdmFyaWFibGVzICJ0ZW1wMSIsInRlbXAyIiwgCiAgICAgICAgICAgICJ0ZW1wMyIgYW5kIHNvIGZvcnRoIGRlcGVuZGluZyBvbiBob3cgbWFueSB0aW1lcyB0aGUgdHlwZW1hcCBpcyB1c2VkLgogICAgICAgICAgICBTb21ldGltZXMgeW91IHdhbnQgYSBzaW5nbGUgdmFyaWFibGUgaW5zdGVhZC4gIFRvIGRvIHRoYXQsIHVzaW5nCiAgICAgICAgICAgIHRoZSBmb2xsb3dpbmcgbmFtaW5nIHNjaGVtZToKCiAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgaW50ICooaW50IF9nbG9iYWxfdGVtcCkgewogICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgIElzIHRoaXMgY2FzZSwgYSBzaW5nbGUgdmFyaWFibGUgX2dsb2JhbF90ZW1wIGlzIGVtaXR0ZWQgaW4gdGhlCiAgICAgICAgICAgIHdyYXBwZXIgZnVuY3Rpb25zLiAgSXQgaXMgc2hhcmVkIGFjcm9zcyBhbGwgdHlwZW1hcHMuICBSZXBlYXRlZAogICAgICAgICAgICB0eXBlbWFwcyBkbyBub3QgcmVwbGljYXRlIHRoZSB2YXJpYWJsZS0tLXRoZXkgdXNlIHRoZSBmaXJzdCBvbmUKICAgICAgICAgICAgZW1pdHRlZC4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgIAowNS8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1pbm9yIGVuaGFuY2VtZW50IHRvIHR5cGVtYXBzLiAgSWYgeW91IGhhdmUgdGhpcyBjb2RlLAoKICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIEZvbyAoaW50IHNvbWV2YXIgPSAzKSB7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgICB0aGUgZGVmYXVsdCB2YWx1ZSBmb3Igc29tZXZhciBpcyBub3cgZW1pdHRlZCBpbnRvIHRoZSB3cmFwcGVyIGNvZGUuCgowNS8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkICVleHRlbmQgdG8gYmUgYmV0dGVyIGJlaGF2ZWQgaW4gbmFtZXNwYWNlcy4gIElmIHlvdSBoYXZlIGNvZGUKICAgICAgICAgICAgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBmb28gewogICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYmFyIHsKICAgICAgICAgICAgICAgICAgICAgICAgJWV4dGVuZCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgCiAgICAgICAgICAgIFNXSUcgbWF0Y2hlcyB0aGUgYmxhaCgpIG1ldGhvZCB0byBhIEMgZnVuY3Rpb24gbmFtZWQgCiAgICAgICAgICAgIHZvaWQgZm9vX2Jhcl9ibGFoKGZvbzo6YmFyICpzZWxmKS4KCiAgICAgICAgICAgIFRoaXMgaXMgY29uc2lzdGVudCB3aXRoIHRoZSBub24tbmFtZXNwYWNlIHZlcnNpb24uCiAgICAgICAgICAgIEJ1ZyByZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDUvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBOZXcgbGlicmFyeSBmaWxlczogY3BvaW50ZXIuaSwgY2FycmF5cy5pLCBjbWFsbG9jLmkuICBUaGVzZQogICAgICAgICAgICBwcm92aWRlIGFjY2VzcyB0byBDIHBvaW50ZXJzIGFuZCBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbnMuCiAgICAgICAgICAgIFNlZSBEb2MvTWFudWFsL0xpYnJhcnkuaHRtbCBmb3IgZGV0YWlscy4KCjA1LzIyLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQyB0eXBlIGNoYXIgbm8gbG9uZ2VyIG1hcHMgdG8gSmF2YSB0eXBlIGJ5dGUsIGJ1dCB0byBKYXZhIHR5cGUgY2hhci4KICAgICAgICAgICAgSXQgaXMgbm93IHRyZWF0ZWQgYXMgYSBjaGFyYWN0ZXIgcmF0aGVyIHRoYW4gYSBzaWduZWQgbnVtYmVyLiBUaGlzIGZpdHMgaW4KICAgICAgICAgICAgd2l0aCB0aGUgb3RoZXIgbGFuZ3VhZ2UgbW9kdWxlcyBhbmQgaXMgYSBtb3JlIG5hdHVyYWwgbWFwcGluZyBhcyBjaGFyKiBpcyAKICAgICAgICAgICAgbWFwcGVkIGFzIGEgc3RyaW5nIG9mIGNoYXJhY3RlcnMuIE5vdGUgdGhhdCB0aGUgQyBzaWduZWQgY2hhciB0eXBlIGlzIHN0aWxsCiAgICAgICAgICAgIG1hcHBlZCB0byBhIEphdmEgYnl0ZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjA1LzIyLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gSW1wcm92ZWQgY29uc3RhbnRzIHdyYXBwaW5nLiBDb25zdGFudHMgKCNkZWZpbmUgYW5kICVjb25zdGFudCkgdmFsdWVzIAogICAgICAgICAgICBhcmUgbm93IG9idGFpbmVkIHRocm91Z2ggYSBKTkkgY2FsbC4gUHJldmlvdXNseSB0aGUgdmFsdWUgd2FzIGNvbXBpbGVkIGFzIAogICAgICAgICAgICBKYXZhIGNvZGUsIGJ1dCB0aGlzIGRpZG4ndCB3b3JrIGZvciBhbGwgY2FzZXMsIGVnICNkZWZpbmUgMTIzVUxMLgoKMDUvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBib2d1cyBlcnJvciBtZXNzYWdlIHdpdGggJWV4dGVuZCBkaXJlY3RpdmUgYW5kIEMrKwogICAgICAgICAgICBhY2Nlc3Mgc3BlY2lmaWVycy4gIFJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuCgowNS8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE5hbWVzcGFjZXMgYW5kIGVudW1zIG5vdyB3b3JrIGNvcnJlY3RseS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBGb28gewogICAgICAgICAgICAgICAgICAgIGVudW0gQmFyIHsgQSwgQiB9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgQnVnIHJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuCgowNS8yMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFRoZSAldHlwZXMgZGlyZWN0aXZlIGNhbiBub3cgYmUgdXNlZCB0byBzcGVjaWZ5IGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcHMKICAgICAgICAgICAgaW4gdGhlIHJ1bnRpbWUgdHlwZSBzeXN0ZW0uICBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgICAgICAldHlwZXMoRm9vID0gQmFyKTsKCiAgICAgICAgICAgIHNwZWNpZmllcyB0aGF0IEZvbyBpc2EgQmFyLiAgICBVc2luZyB0aGlzIGlzIHBvdGVudGlhbGx5IHF1aXRlIGRhbmdlcm91cy4KICAgICAgICAgICAgSG93ZXZlciwgdGhpcyBpcyB1c2VmdWwgaW4gY2VydGFpbiBjYXNlcyAoYW5kIGluIHRoZSBTV0lHIGxpYnJhcnkpLgogICAgICAgICAgICAKMDUvMjAvMjAwMjogYmVhemxleQogICAgICAgICAgICAlbm9kZWZhdWx0IGFuZCAlbWFrZWRlZmF1bHQgZGlyZWN0aXZlcyBub3cgcmVxdWlyZSBhIHRyYWlsaW5nIHNlbWljb2xvbi4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJW5vZGVmYXVsdDsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgJW1ha2VkZWZhdWx0OwoKICAgICAgICAgICAgSW4gYWRkaXRpb24gYm90aCBkaXJlY3RpdmVzIGNhbiB0YWtlIGEgY2xhc3MgbmFtZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVub2RlZmF1bHQgRm9vOwoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7ICAgLyogTm8gZGVmYXVsdCBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yICovCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7ICAvKiBEZWZhdWx0IGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IgZ2VuZXJhdGVkICovCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgIElmIHlvdSBkb24ndCB1c2UgdGhlIHRyYWlsaW5nIHNlbWljb2xvbiwgdGhpbmdzIHdpbGwgbXlzdGVyaW91c2x5IGJyZWFrLgoKMDUvMjAvMjAwMjogYmVhemxleQogICAgICAgICAgICBNb3JlIGltcHJvdmVtZW50cyB0byB0eXBlIHN5c3RlbSBoYW5kbGluZy4gIFNXSUcgbm93IGNvcnJlY3RseSBoYW5kbGVzCiAgICAgICAgICAgIHRlbXBsYXRlIG5hbWVzIGFuZCBwYXJhbWV0ZXJzIGluIGEgbmFtZXNwYWNlLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgZm9vIHsKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBiYXIgeyB9OwogICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IEludGVnZXI7CgogICAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaChiYXI8SW50ZWdlcj4gKngpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEluIHRoZSBnZW5lcmF0ZWQgY29kZSwgYWxsIG9mIHRoZSB0eXBlbmFtZXMgYXJlIHByb3Blcmx5IHF1YWxpZmllZC4KCjA1LzE3LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gZGVwcmVjYXRlZCBicm9rZW4gLWpuaWMgYW5kIC1qbmljcHAgY29tbWFuZGxpbmUgb3B0aW9ucy4gVGhlIEMgb3IgQysrIAogICAgICAgICAgICBKTkkgY2FsbGluZyBjb252ZW50aW9uIGlzIG5vdyBkZXRlcm1pbmVkIGZyb20gdGhlIC1jKysgY29tbWFuZGxpbmUgb3B0aW9uLgoKMDUvMTYvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBUaGUgSkNBTEwgbWFjcm9zIHdoaWNoIGV4aXN0IHNvIHRoYXQgdGhlIHNhbWUgdHlwZW1hcHMgY2FuIGJlIHVzZWQKICAgICAgICAgICAgZm9yIGdlbmVyYXRpbmcgYm90aCB0aGUgQyBhbmQgQysrIEpOSSBjYWxsaW5nIGNvbnZlbnRpb25zIG5vIGxvbmdlciBhcHBlYXIKICAgICAgICAgICAgaW4gdGhlIGdlbmVyYXRlZCBjb2RlLiBUaGlzIGlzIGJlY2F1c2UgdGhlIG91dHB1dCBpcyBub3cgcGFzc2VkIHRocm91Z2ggdGhlIAogICAgICAgICAgICBTV0lHIHByZXByb2Nlc3NvciB3aGljaCBkb2VzIHRoZSBtYWNybyBleHBhbnNpb24gZm9yIGVpdGhlciBDIG9yIEMrKyAoZGVwZW5kaW5nCiAgICAgICAgICAgIG9uIHdoZXRoZXIgLWMrKyBpcyBwYXNzZWQgb24gdGhlIFNXSUcgY29tbWFuZGxpbmUpLgoKICAgICAgICAgICAgVGhlIGdlbmVyYXRpb24gb2YgdGhlIGZ1bmN0aW9ucyB1c2VkIGluIHRoZSBhcnJheSB0eXBlbWFwcyBoYXZlIGJlZW4gYWRqdXN0ZWQgCiAgICAgICAgICAgIHRvIHRha2UgYWNjb3VudCBvZiB0aGlzLiBUaGUgc2lkZSBlZmZlY3QgaXMgdGhhdCBhbnkgdHlwZW1hcHMgd2hpY2ggY29udGFpbmVkIAogICAgICAgICAgICBKQ0FMTCBtYWNyb3Mgd2l0aGluICV7ICV9IGJyYWNrZXRzIHdpbGwgaGF2ZSB0byBiZSBtb3ZlZCB3aXRoaW4ge30gYnJhY2tldHMgCiAgICAgICAgICAgIHNvIHRoYXQgdGhlIFNXSUcgcHJlcHJvY2Vzc29yIGNhbiBleHBhbmQgdGhlIG1hY3Jvcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjA1LzEzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQ2xhc3MgdGVtcGxhdGVzIG1heSBub3cgYmUgdXNlZCBhcyB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQsIHRlbXBsYXRlPGNsYXNzPiBjbGFzcyBDPiBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICV0ZW1wbGF0ZShGb29pKSBGb288aW50LCBCYXI+OwogICAgIAogICAgICAgICAgICBTV0lHIGRvZXNuJ3QgcmVhbGx5IGRvIGFueXRoaW5nIHNwZWNpYWwgd2l0aCB0aGlzLS0taXQncyBqdXN0CiAgICAgICAgICAgIGFub3RoZXIgd2F5IG9mIHNwZWNpZnlpbmcgYSB0ZW1wbGF0ZSBwYXJhbWV0ZXIuICAKICAgICAgICAgCjA1LzEzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWlub3IgcmVmaW5lbWVudCBvZiB0ZW1wbGF0ZSBzdXBwb3J0LiAgVGVtcGxhdGUgcGFyYW1ldGVyIG5hbWVzIGFyZSBubyBsb25nZXIKICAgICAgICAgICAgcmVxdWlyZWQgZm9yIHR5cGVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgdGVtcGxhdGU8Ym9vbD4gY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBPYnZpb3VzbHksIG5hbWVzIGFyZSByZXF1aXJlZCBmb3IgdGVtcGxhdGU8Y2xhc3MgVD47CgowNS8xMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE5ldyBtYWNybyBleHBhbnNpb24gaW4gdHlwZW1hcHMuICBUaGUgc2VxdWVuY2U6CgogICAgICAgICAgICAgICAgJGRlc2NyaXB0b3IodHlwZSkKCiAgICAgICAgICAgIFdpbGwgZXhwYW5kIGludG8gdGhlIFNXSUcgdHlwZSBkZXNjcmlwdG9yIHN0cnVjdG9yIGZvcgogICAgICAgICAgICB0aGUgZ2l2ZW4gdHlwZS4gIFR5cGUgbWF5IGJlIGFueSBhYnN0cmFjdCBkYXRhdHlwZS4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJGRlc2NyaXB0b3IoaW50ICopCiAgICAgICAgICAgICAgICAkZGVzY3JpcHRvcihpbnQgKCopKGludCxkb3VibGUpKQogICAgICAgICAgICAgICAgJGRlc2NyaXB0b3IodmVjdG9yPGludD4gKikKCiAgICAgICAgICAgIENhdmVhdDogSXQgaXMgKk5PVCogY3VycmVudGx5IGxlZ2FsIHRvIHVzZSBvdGhlciB0eXBlbWFwCiAgICAgICAgICAgIHN1YnN0aXR1dGlvbiB2YXJpYWJsZXMgaW4gdGhlIG1hY3JvLiAgRm9yIGV4YW1wbGUgCiAgICAgICAgICAgICRkZXNjcmlwdG9yKCQxX3R5cGUpLgoKICAgICAgICAgICAgVGhlIHByaW1hcnkgcHVycG9zZSBvZiB0aGlzIG1vZGlmaWNhdGlvbiBpcyB0byBiZXR0ZXIKICAgICAgICAgICAgc3VwcG9ydCB0eXBlbWFwcyBmb3IgY29udGFpbmVyIG9iamVjdHMgb3IgdG8gYWxsb3cgdHlwZW1hcHMKICAgICAgICAgICAgdGhhdCBtaWdodCBiZSBwZXJmb3JtaW5nIHR5cGUgY29udmVyc2lvbnMuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA1LzExLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVGhlIHdyYXBwaW5nIG9mIHJlZmVyZW5jZXMgdG8gcHJpbWl0aXZlIHR5cGVzIGhhcyBiZWVuCiAgICAgICAgICAgIGNoYW5nZWQgYXMgZm9sbG93czoKCiAgICAgICAgICAgIEFyZ3VtZW50cyBvZiB0eXBlICdjb25zdCBwcmltaXRpdmUgJicgYXJlIG5vdyBwYXNzZWQKICAgICAgICAgICAgYnkgdmFsdWUgYXMgb3Bwb3NlZCB0byBwb2ludGVycy4gIFJldHVybiB2YWx1ZXMgb2YKICAgICAgICAgICAgdHlwZSAnY29uc3QgcHJpbWl0aXZlICYnIGFyZSByZXR1cm5lZCBhcyB2YWx1ZXMgaW5zdGVhZCBvZgogICAgICAgICAgICBwb2ludGVycy4KCiAgICAgICAgICAgICdwcmltaXRpdmUnIGlzIGFueSBvbmUgb2YgaW50LCBzaG9ydCwgbG9uZywgbG9uZyBsb25nLAogICAgICAgICAgICBjaGFyLCBmbG9hdCwgZG91YmxlLCBib29sIChhcyB3ZWxsIGFzIHVuc2lnbmVkIHZhcmlhbnRzKS4KICAgICAgICAgICAgCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIGlzIGJlaW5nIG1hZGUgdG8gYmV0dGVyIHN1cHBvcnQgQysrIHdyYXBwaW5nLS1lc3BlY2lhbGx5CiAgICAgICAgICAgIGNvZGUgdGhhdCBtYWtlcyB1c2Ugb2YgdGVtcGxhdGVzIGFuZCB0aGUgU1RMLgogICAgICAgICAgICAKMDUvMTEvMjAwMjogYmVhemxleQogICAgICAgICAgICBUaGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBjYW4gbm93IGJlIHVzZWQgdG8gYWNjZXNzIHRlbXBsYXRlcwogICAgICAgICAgICBpbiBhIG5hbWVzcGFjZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBzdGQgewogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIGNvbXBsZXggewogICAgICAgICAgICAgICAgICAgICAgIFQgcmUsIGltOwogICAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV4KFQgX3IgPSBUKCksIFQgX2kgPSBUKCkpIDogcmUoX3IpLCBpbShfaSkgeyB9CiAgICAgICAgICAgICAgICAgICAgICAgVCByZWFsKCkgeyByZXR1cm4gcmU7IH0KICAgICAgICAgICAgICAgICAgICAgICBUIGltYWcoKSB7IHJldHVybiBpbTsgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJXRlbXBsYXRlKGNvbXBsZXgpIHN0ZDo6Y29tcGxleDxkb3VibGU+OwoKICAgICAgICAgICAgTm90ZTogVGhlcmUgYXJlIHNvbWUgdmVyeSBzdWJ0bGUgbmFtZXNwYWNlL3N5bWJvbCB0YWJsZSAKICAgICAgICAgICAgbWFuYWdlbWVudCBpc3N1ZXMgaW52b2x2ZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMuCiAgICAgICAgICAgIEl0IG1heSBub3Qgd29yayBpbiBjZXJ0YWluIGNhc2VzLgoKMDUvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBNZW1iZXIgdGVtcGxhdGUgY29uc3RydWN0b3Igc3VwcG9ydCBhZGRlZC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1QxLCB0eXBlbmFtZSBfVDI+IAogICAgICAgICAgICAgICBzdHJ1Y3QgcGFpciB7CiAgICAgICAgICAgICAgICAgX1QxIGZpcnN0OwogICAgICAgICAgICAgICAgIF9UMiBzZWNvbmQ7CiAgICAgICAgICAgICAgICAgcGFpcigpIDogZmlyc3QoX1QxKCkpLCBzZWNvbmQoX1QyKCkpIHsgfQogICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIF9VMSwgY2xhc3MgX1UyPiBwYWlyKGNvbnN0IHBhaXI8X1UxLF9VMj4gJngpOwogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVG8gaW5zdGFudGlhdGUgdGhlIHRlbXBsYXRlLCB1c2UgJXRlbXBsYXRlIGFuZCAlZXh0ZW5kLgogICAgICAgICAgICBGb3IgZXhhbXBsZSwgdGhpcyBleHBhbmRzIHRoZSBjb25zdHJ1Y3RvciBpbnRvIGEgZGVmYXVsdAogICAgICAgICAgICBjb3B5IGNvbnN0cnVjdG9yOgoKICAgICAgICAgICAgICAgJWV4dGVuZCBwYWlyIHsKICAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKHBhaXIpIHBhaXI8X1QxLF9UMj47CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIEhpZ2hseSBleHBlcmltZW50YWwuICBPdGhlciB1c2VzIG1heSBiZSBicm9rZW4uCgowNS8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFRoZSAlZXh0ZW5kICglYWRkbWV0aG9kcykgZGlyZWN0aXZlIG5vIGxvbmdlciB3b3JrcyB1bmxlc3MKICAgICAgICAgICAgaXQgYXBwZWFycyBpbiB0aGUgcHVibGljIHNlY3Rpb24gb2YgYSBjbGFzcy4gICBBbiBlcnJvcgogICAgICAgICAgICBtZXNzYWdlIGlzIG5vdyBnZW5lcmF0ZWQgKGFzIG9wcG9zZWQgdG8gYSBzZWdtZW50YXRpb24gZmF1bHQpLgoKMDUvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBOZXcgJXdhcm5maWx0ZXIoKSBkaXJlY3RpdmUuICBUaGlzIGRpcmVjdGl2ZSBhdHRhY2hlcyBhIHdhcm5pbmcKICAgICAgICAgICAgZmlsdGVyIHRvIHNwZWNpZmljIGRlY2xhcmF0aW9ucyBhbmQgaGFzIHRoZSBzYW1lIHNlbWFudGljcyBhcwogICAgICAgICAgICAlcmVuYW1lLCAlaWdub3JlLCAlZmVhdHVyZSwgYW5kIHNvIGZvcnRoLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAld2FybmZpbHRlcig1MDEpIGZvbzsgICAvLyBTdXBwcmVzcyBvdmVybG9hZGVkIHdhcm5pbmcKICAgICAgICAgICAgICAgaW50IGZvbyhpbnQpOwogICAgICAgICAgICAgICBpbnQgZm9vKGRvdWJsZSk7IAoKICAgICAgICAgICAgb3IKCiAgICAgICAgICAgICAgICV3YXJuZmlsdGVyKDUwMSkgT2JqZWN0Ojpmb28oZG91YmxlKTsKICAgICAgICAgICAgICAgY2xhc3MgT2JqZWN0IHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICBpbnQgZm9vKGludCk7CiAgICAgICAgICAgICAgICAgIGludCBmb28oZG91YmxlKTsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBvbmx5IHN1cHByZXNzZXMgd2FybmluZ3MgaW4gbGF0ZXIgc3RhZ2VzIG9mIGNvZGUKICAgICAgICAgICAgZ2VuZXJhdGlvbi4gIEl0IGRvZXMgbm90IHN1cHByZXNzIHdhcm5pbmdzIHJlbGF0ZWQgdG8gcHJlcHJvY2Vzc2luZwogICAgICAgICAgICBvciBwYXJzaW5nLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowNS8wOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNXSUcgbm93IHN1cHBvcnRzIEM5OSB2YXJpYWRpYyBwcmVwcm9jZXNzb3IgbWFjcm9zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAjZGVmaW5lIGRlYnVnZihmbXQsLi4uKSBmcHJpbnRmKHN0ZGVycixmbXQsX19WQV9BUkdTX18pCgogICAgICAgICAgICBUaGUgYXJndW1lbnQgIi4uLiIgaXMgdXNlZCB0byBpbmRpY2F0ZSB2YXJpYWJsZSBhcmd1bWVudHMgd2hpY2gKICAgICAgICAgICAgYXJlIGFsbCBwbGFjZWQgaW50byB0aGUgc3BlY2lhbCBhcmd1bWVudCBuYW1lIF9fVkFfQVJHU19fIGluCiAgICAgICAgICAgIHRoZSBtYWNybyBleHBhbnNpb24uICAKCiAgICAgICAgICAgIFNXSUcgYWxzbyBpbXBsZW1lbnRzIHRoZSBHTlUgKCMjKSBleHRlbnNpb24gZm9yIHN3YWxsb3dpbmcgdGhlCiAgICAgICAgICAgIHByZWNlZGluZyBjb21tYSB3aGVuIF9fVkFfQVJHU19fIGlzIGVtcHR5LiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICNkZWZpbmUgZGVidWdmKGZtdCwuLi4pIGZwcmludGYoc3RkZXJyLGZtdCwgIyNfX1ZBX0FSR1NfXykKCiAgICAgICAgICAgIEhlcmUgaXMgaG93IHRoaXMgaXMgZXhwYW5kZWQ6CgogICAgICAgICAgICAgICBkZWJ1Z2YoIiVkIiwgMykgIC0tPiBmcHJpbnRmKHN0ZGVyciwiJWQiLDMpCiAgICAgICAgICAgICAgIGRlYnVnZigiSGVsbG8iKSAgLS0+IGZwcmludGYoc3RkZXJyLCJIZWxsbyIgKQoKICAgICAgICAgICAgKG5vdGljZSB0aGUgZGVsZXRlZCBjb21tYSkuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA1LzA4LzIwMDI6IHNhbWphbSAoU2FtIExpZGRpY290dCkKICAgICAgICAgICAgTWFueSBjaGFuZ2VzIHRvIHBocCBtb2R1bGUuICBTaGFkb3cgY2xhc3NlcyBhcmUgbm93IGltcGxlbWVudGVkCiAgICAgICAgICAgIGVudGlyZWx5IGluIG5hdGl2ZSBDIGFuZCBubyBuZWVkIGZvciBwaHAtY29kZSBzaGFkb3cgd3JhcHBlcnMKICAgICAgICAgICAgUG9wdWxhdGVkIHRlbXBsYXRlIGNvbmZpZy5tNCBhbmQgTWFrZWZpbGUuaW4gYXMgbmVlZGVkIGJ5CiAgICAgICAgICAgIHBocGl6ZSBhcmUgZ2VuZXJhdGVkLgoKMDUvMDgvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEEgY29weSBjb25zdHJ1Y3RvciBpcyBub3cgdHVybmVkIGludG8gYSAiY2xvbmUiCiAgICAgICAgICAgIGluc3RhbmNlIG1ldGhvZCAoc2VlIERhdmUncyBjaGFuZ2UgZm9yIGNvcHkgY29uc3RydWN0b3JzCiAgICAgICAgICAgIGRhdGVkIDQvNy8yMDAyKS4gVGhpcyBzZWVtcyBsaWtlIHRoZSBhcHByb3ByaWF0ZSB0aGluZwogICAgICAgICAgICB0byBkbyBmb3IgUnVieSBjb2RlLgoKMDUvMDgvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEZpeGVkIFsgNTUzODY0IF0gSW5saW5lIGRlc3RydWN0b3IgY29kZSBub3Qgd3JpdHRlbi4KCjA1LzA4LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgJWlnbm9yZSBiZWhhdmVzIGJldHRlciB3aXRoIGNvbnN0cnVjdG9ycywgZGVzdHJ1Y3RvcnMsIGFuZCB0aGUKICAgICAgICAgICAgdHlwZSBzeXN0ZW0gaW4gZ2VuZXJhbC4gICBGb3IgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycywKICAgICAgICAgICAgJWlnbm9yZSBub3cgc3VwcHJlc3NlcyB0aGUgY3JlYXRpb24gb2YgYSBkZWZhdWx0IGNvbnN0cnVjdG9yCiAgICAgICAgICAgIG9yIGRlc3RydWN0b3IuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJWlnbm9yZSB+Rm9vOwogICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBGb28oKTsKICAgICAgICAgICAgICAgICAgICB+Rm9vKCk7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBJbiBTV0lHLTEuMy4xMSwgfkZvbygpIHNpbXBseSAiZGlzYXBwZWFyZWQiIGFuZCB0aGUgY29kZSBnZW5lcmF0b3IKICAgICAgICAgICAgY3JlYXRlZCBhIHdyYXBwZXIgZm9yIGEgZGVmYXVsdCBkZXN0cnVjdG9yIChhcyBpZiBpdCB3YXMgbmV2ZXIKICAgICAgICAgICAgZGVjbGFyZWQgaW4gdGhlIGludGVyZmFjZSkuICBJbiBTV0lHLTEuMy4xMiwgJWlnbm9yZSBzdXBwcmVzc2VzCiAgICAgICAgICAgIHRoZSBjcmVhdGlvbiBvZiBhIGRlc3RydWN0b3IgaWYgb25lIGlzIGFjdHVhbGx5IGRlZmluZWQuIAoKICAgICAgICAgICAgU2ltaWxhcmx5LCBldmVuIHRob3VnaCBhIGRlY2xhcmF0aW9uIGlzIGlnbm9yZWQsIGluZm9ybWF0aW9uCiAgICAgICAgICAgIG1heSBzdGlsbCBiZSBuZWVkZWQgdG8gcHJvcGVybHkgaGFuZGxlIHR5cGVzLiBGb3IgZXhhbXBsZSwgaGVyZQogICAgICAgICAgICBpcyBhIHZlcnkgc3VidGxlIGVycm9yIHRoYXQgaXMgZml4ZWQgYnkgdGhpcyBjaGFuZ2U6CgogICAgICAgICAgICAgICAgJWlnbm9yZSBzdGQ6OnN0cmluZzsgICAgICAgICAvLyBQcmV2ZW50IGNsYXNzIHdyYXBwaW5nCiAgICAgICAgICAgICAgICBuYW1lc3BhY2Ugc3RkIHsKICAgICAgICAgICAgICAgICAgIGNsYXNzIHN0cmluZyB7CiAgICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBzdHJpbmcgKiB7CiAgICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2b2lkIGZvbyhzdGQ6OnN0cmluZyAqcyk7ICAgLy8gQnJva2VuLgoKICAgICAgICAgICAgQmVmb3JlIHRoaXMgZml4LCAlaWdub3JlIHdvdWxkIGNhdXNlIHRoZSBjbGFzcyBkZWZpbml0aW9uIHRvIGRpc2FwcGVhci4KICAgICAgICAgICAgVGhpcywgaW4gdHVybiwgd291bGQgY2F1c2UgdGhlIHR5cGVtYXAgdG8gYmUgbWlzYXBwbGllZC4gCiAKMDUvMDgvMjAwMjogYmVhemxleQogICAgICAgICAgICBNaW5vciBjaGFuZ2VzIHRvICVyZW5hbWUsICVpZ25vcmUsICVmZWF0dXJlLCBhbmQgcmVsYXRlZCBkaXJlY3RpdmVzCiAgICAgICAgICAgIGZvciBiZXR0ZXIgc3VwcG9ydCBvZiBkZXN0cnVjdG9ycy4gIERlc3RydWN0b3JzIGNhbiBub3cgYmUgcHJlY2lzZWx5CiAgICAgICAgICAgIHRhZ2dlZC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgJWlnbm9yZSBGb286On5Gb287CiAgICAgICAgICAgICAgICAgICVmZWF0dXJlKCJhY3Rpb24iKSB+QmFyIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAKICAgICAgICAgICAgKkRldmVsb3BlciB3YXJuaW5nKiAKICAgICAgICAgICAgT3BlcmF0aW9ucyBzdWNoIGFzIHJlbmFtaW5nIGFuZCBmZWF0dXJlIGF0dGFjaG1lbnQgZm9yIGNsYXNzZXMgdXNlZCB0bwogICAgICAgICAgICBiZSBhcHBsaWVkIHRvIGRlc3RydWN0b3JzIGFzIHdlbGwuICBGb3IgaW5zdGFuY2UsIGlmIHlvdSBkaWQgdGhpczoKIAogICAgICAgICAgICAgICAgICVyZW5hbWUoQmFyKSBGb287CgogICAgICAgICAgICBUaGUgb3BlcmF0aW9uIGFwcGxpZWQgdG8gdGhlIGNsYXNzIGl0c2VsZiwgdGhlIGNvbnN0cnVjdG9yLCBhbmQKICAgICAgICAgICAgdGhlIGRlc3RydWN0b3IuICAgVGhpcyBpcyBubyBsb25nZXIgdGhlIGNhc2UuICBOb3cgc3VjaCBvcGVyYXRpb25zCiAgICAgICAgICAgIHdpbGwgb25seSBhcHBseSB0byB0aGUgY2xhc3MgYW5kIHRoZSBjb25zdHJ1Y3Rvci4gIE5vdGU6IGlmIHlvdQogICAgICAgICAgICB3ZXJlIHJlbHlpbmcgb24gdGhpcyBmb3IgY2xhc3MgcmVuYW1pbmcsIGJlIGF3YXJlIHRoYXQgcmVuYW1lZAogICAgICAgICAgICBjbGFzc2VzIHNob3VsZCByZWFsbHkgb25seSBiZSBoYW5kbGVkIGF0IHRoZSBsZXZlbCBvZiB0aGUgY2xhc3MgaXRzZWxmCiAgICAgICAgICAgIGFuZCBub3QgdGhlIGxldmVsIG9mIGluZGl2aWR1YWwgZGVjbGFyYXRpb25zIGluIHRoZSBjbGFzcyAoYWx0aG91Z2gKICAgICAgICAgICAgdGhleSBjYW4gYmUgcmVuYW1lZCBpbmRpdmlkdWFsbHkgaWYgbmVlZGVkKS4gIEFzIGZhciBhcyBJIGtub3csCiAgICAgICAgICAgIHRoZSBMYW5ndWFnZSBjbGFzcyBpcyBhbHJlYWR5IHRha2luZyBjYXJlIG9mIHRoaXMgY2FzZSBjb3JyZWN0bHkuCgowNS8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE5ldyBzZXQgb2YgdGVzdHMuICBUaGUgRXhhbXBsZXMvdGVzdC1zdWl0ZS9lcnJvcnMgZGlyZWN0b3J5IGNvbnRhaW5zCiAgICAgICAgICAgIHRlc3RzIHRoYXQgdHJ5IHRvIGV4ZXJjaXNlIGFsbCBvZiBTV0lHJ3MgZXJyb3IgYW5kIHdhcm5pbmcgbWVzc2FnZXMuCgowNS8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFN0YXJ0IG9mIGEgd2FybmluZyBmcmFtZXdvcmsuICBXYXJuaW5nIG1lc3NhZ2VzIGFyZSBub3cgYXNzaWduZWQgbnVtZXJpYyB2YWx1ZXMKICAgICAgICAgICAgdGhhdCBhcmUgc2hvd24gaW4gd2FybmluZyBtZXNzYWdlcy4gICBUaGVzZSBjYW4gYmUgc3VwcHJlc3NlZCB1c2luZyB0aGUKICAgICAgICAgICAgLXcgb3B0aW9uLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIHN3aWcgLXczMDIgZXhhbXBsZS5pCiAgICAgICAgICAgICAgICAgc3dpZyAtdzMwMiwzMDUgZXhhbXBsZS5pCgogICAgICAgICAgICBBbHRlcm5hdGl2ZWx5LCB0aGUgI3ByYWdtYSBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlIGNhbiBiZSB1c2VkIHRvIGRpc2FibGUgdGhpczoKCiAgICAgICAgICAgICAgICAgI3ByYWdtYSBTV0lHIG5vd2Fybj0zMDIKICAgICAgICAgICAgICAgICAjcHJhZ21hIFNXSUcgbm93YXJuPTMwMiwzMDUKCiAgICAgICAgICAgIE5vdGU6IFNpbmNlIFNXSUcgaXMgYSBtdWx0aS1wYXNzIGNvbXBpbGVyLCB0aGlzIHByYWdtYSBzaG91bGQKICAgICAgICAgICAgb25seSBiZSB1c2VkIHRvIGNoYW5nZSBnbG9iYWwgc2V0dGluZ3Mgb2YgdGhlIHdhcm5pbmcgZmlsdGVyLiAgSXQgc2hvdWxkCiAgICAgICAgICAgIG5vdCBiZSB1c2VkIHRvIHNlbGVjdGl2ZWx5IGVuYWJsZS9kaXNhYmxlIHdhcm5pbmdzIGluIGFuIGludGVyZmFjZSBmaWxlLgogICAgICAgICAgICBUaGUgaGFuZGxpbmcgb2YgI3ByYWdtYSBvY2N1cnMgaW4gdGhlIEMrKyBwcmVwcm9jb2Vzc29yIGFuZCBhZmZlY3RzIGFsbCAKICAgICAgICAgICAgc3Vic2VxdWVudCBzdGFnZXMgb2YgY29tcGlsYXRpb24uCgogICAgICAgICAgICBUaGUgLVdhbGwgb3B0aW9uIHR1cm5zIG9uIGFsbCB3YXJuaW5ncyBhbmQgb3ZlcnJpZGVzIGFueSBmaWx0ZXJzIHRoYXQKICAgICAgICAgICAgbWlnaHQgaGF2ZSBiZWVuIHNldC4KCiAgICAgICAgICAgIFdhcm5pbmdzIGNhbiBiZSBpc3N1ZWQgZnJvbSBhbiBpbnRlcmZhY2UgdXNpbmcgJXdhcm4uICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJXdhcm4gIjExMDolc2VjdGlvbiBpcyBkZXByZWNhdGVkIgoKICAgICAgICAgICAgVGhlIGZpcnN0IHBhcnQgb2YgYSB3YXJuaW5nIG1lc3NhZ2UgaXMgYW4gb3B0aW9uYWwgd2FybmluZyBudW1iZXIuCiAgICAgICAgICAgIEEgY29tcGxldGUgc2V0IG9mIHdhcm5pbmcgbnVtYmVycyBpcyBmb3VuZCBpbiBTb3VyY2UvSW5jbHVkZS9zd2lnd2Fybi5oLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowNS8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEludGVybmFsIHBhcnNpbmcgY2hhbmdlLiAgIERpcmVjdGl2ZXMgdG8gaW5jbHVkZSBmaWxlcyBub3cgdXNlIGJyYWNrZXRzIFsgLi4uIF0KICAgICAgICAgICAgaW5zdGVhZCBvZiB7IC4uLiB9LiAgIAoKICAgICAgICAgICAgICAgICAgJWluY2x1ZGVmaWxlICJmb28uaSIgWwogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgXQoKICAgICAgICAgICAgVGhlIHVzZSBvZiB7IC4uLiB9IHdhcyBhIGJhZCBjaG9pY2UgYmVjYXVzZSB0aGV5IHdlcmUgaW5jbHVkZWQgaW1wbGljaXRseSBieQogICAgICAgICAgICB0aGUgcHJlcHJvY2Vzc29yIGFuZCBtYWRlIGl0IGltcG9zc2libGUgdG8gcHJvcGVybHkgZGV0ZWN0IGxlZ2l0aW1hdGUgbWlzc2luZyAnfScgCiAgICAgICAgICAgIGVycm9ycy4KCjA0LzE2LzIwMDItCjA1LzAyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU1dJRyBFdXJvcGVhbiBUb3VyOiBQYXJpcy1BbXN0ZXJkYW0tQmF0aC4KCjA0LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVGhlICVhZGRtZXRob2RzIGRpcmVjdGl2ZSBoYXMgYmVlbiByZW5hbWVkIHRvICVleHRlbmQuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgJWV4dGVuZCBGb28gewogICAgICAgICAgICAgICAgICAgaW50IGJsYWgoKSB7IC4uLiB9OwogICAgICAgICAgICAgICAgICAgaW50IGJhcigpIHsgLi4uIH07CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBNb3RpdmF0aW9uOiB0aGUgJWFkZG1ldGhvZHMgZGlyZWN0aXZlIGNhbiBiZSB1c2VkIGZvciBtYW55CiAgICAgICAgICAgIG90aGVyIHRhc2tzIGluY2x1ZGluZyBhZGRpbmcgc3ludGhlc2l6ZWQgYXR0cmlidXRlcywgY29uc3RydWN0b3JzLAogICAgICAgICAgICBhbmQgdHlwZW1hcHMuIEJlY2F1c2Ugb2YgdGhpcywgImFkZG1ldGhvZHMiIGlzIHNvbWV3aGF0IG1pc2xlYWRpbmcuCiAgICAgICAgICAgICVleHRlbmQgbW9yZSBwcmVjaXNlbHkgZGVzY3JpYmVzIHRoaXMgb3BlcmF0aW9uLS0tZXh0ZW5zaW9uIG9mIGEKICAgICAgICAgICAgY2xhc3Mgb3Igc3RydWN0dXJlLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgICVhZGRtZXRob2RzIHN0aWxsIHdvcmtzIHZpYSBhIG1hY3JvIGRlZmluaXRpb24uICAgSG93ZXZlciwKICAgICAgICAgICAgYSB3YXJuaW5nIG1lc3NhZ2UgbWF5IGJlIGdlbmVyYXRlZC4gICBFcnJvcnMgaW52b2x2aW5nICVhZGRtZXRob2RzCiAgICAgICAgICAgIHdpbGwgYWN0dWFsbHkgcmVmZXIgdG8gdGhlICVleHRlbmQgZGlyZWN0aXZlLiAgCiAgICAgICAgICAgIAowNC8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZ1cnRoZXIgcmVmaW5lbWVudCBvZiB0aGUgdHlwZSBzeXN0ZW0uICBUeXBlZGVmIG5vdwogICAgICAgICAgICBwcm9wYWdhdGVzIHRocm91Z2ggZnVuY3Rpb25zLCBwb2ludGVycyB0byBmdW5jdGlvbnMsCiAgICAgICAgICAgIGFuZCBwb2ludGVycyB0byBtZW1iZXIgZnVuY3Rpb25zLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IEludGVnZXI7CiAgICAgICAgICAgICAgIHZvaWQgZm9vKGludCAoKngpKGludCksIEludGVnZXIgKCp5KShJbnRlZ2VyKSk7CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIGFyZ3VtZW50cyAneCcgYW5kICd5JyBoYXZlIGV4YWN0bHkKICAgICAgICAgICAgdGhlIHNhbWUgdHlwZSAoYW5kIHdvdWxkIG9idmlvdXNseSBhY2NlcHQgb2JqZWN0cwogICAgICAgICAgICBvZiBlaXRoZXIgdHlwZSkuCgogICAgICAgICAgICBTaW1pbGFybHksIGNvbnNpZGVyIHRoaXM6CgogICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgdHlwZWRlZiBGb28gQmFyOwogICAgICAgICAgICAgICB2b2lkIGJhcihpbnQgKEZvbzo6KngpKGludCksIGludCAoQmFyOjoqeSkoaW50KSk7CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIGFyZ3VtZW50cyB4IGFuZCB5IGFyZSB0aGUgc2FtZSAKICAgICAgICAgICAgdHlwZSAodmlhIHR5cGVkZWYpLgogICAgICAgICAgICAKMDQvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBTV0lHIG5vdyBnZW5lcmF0ZXMgYSB3YXJuaW5nIG1lc3NhZ2UgaWYgYW55IHBhcnQgb2YKICAgICAgICAgICAgYW4gZXhwcmVzc2lvbiBpbnZvbHZlcyB2YWx1ZXMgZnJvbSBhIHByaXZhdGUgcGFydCBvZiBhIGNsYXNzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHJpdmF0ZToKICAgICAgICAgICAgICAgICAgICBzdGF0aWMgaW50IFg7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaChpbnQgYSwgaW50IGIgPSBYKTsgICAvLyBXYXJuaW5nCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgZGVmYXVsdCBhcmd1bWVudCBpcyBpZ25vcmVkLiAgVGhlcmUKICAgICAgICAgICAgYXJlIHdvcmthcm91bmRzLCBidXQgdGhleSBhcmUgcmF0aGVyIGNsdW1zeS4gIEZvciBpbnN0YW5jZSwKICAgICAgICAgICAgeW91IG1pZ2h0IGRvIHRoaXM6CgogICAgICAgICAgICAgICAgICAgICVmZWF0dXJlKCJhY3Rpb24iKSBibGFoKGludCxpbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICBpZiAoJG5hcmdzID09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBibGFoKGFyZzEpOwogICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYmxhaChhcmcxLGFyZzIpOwogICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKGludCBhLCBpbnQgYiA9IDApOwoKCjA0LzIxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVXNlIG9mIHRoZSAlaW5saW5lIGRpcmVjdGl2ZSBpbnNpZGUgYSBuYW1lc3BhY2UgaXMKICAgICAgICAgICAgZm9yYmlkZGVuIGFuZCBub3cgZ2VuZXJhdGVzIGFuIGVycm9yIG1lc3NhZ2UuICAgVGhpcyBpcwogICAgICAgICAgICBub3QgYWxsb3dlZCBzaW5jZSB0aGUgaW5saW5lZCBjb2RlIHRoYXQgaXMgZW1pdHRlZCBpcwogICAgICAgICAgICBub3QgcGxhY2VkIGluc2lkZSBhIG5hbWVzcGFjZS4gIFRoaXMgY29uZnVzZXMgb3RoZXIKICAgICAgICAgICAgc3RhZ2VzIG9mIHBhcnNpbmcuCiAgICAgICAgICAgICAgICAgICAgCjA0LzIxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU29tZSBidWcgZml4ZXMgdG8gY2FzdGluZyBvcGVyYXRpb25zIGFuZCBleHByZXNzaW9uCiAgICAgICAgICAgIHBhcnNpbmcuICAgRHVlIHRvIHNvbWUgcGFyc2luZyBpc3N1ZXMsIGl0IGlzIG5vdCAKICAgICAgICAgICAgY3VycmVudGx5IHBvc3NpYmxlIHRvIHVzZSBjYXN0cyBmb3IgYWxsIHBvc3NpYmxlCiAgICAgICAgICAgIGRhdGF0eXBlcy4gICBIb3dldmVyLCB0aGUgY29tbW9uIGNhc2VzIHdvcmsuCgowNC8yMC8yMDAyOiBiZWF6bGV5IChBbXN0ZXJkYW0pCiAgICAgICAgICAgIE1lbWJlciB0ZW1wbGF0ZXMgbm93IHdvcmsuICBTaW1wbHkgdXNlIHRoZSAldGVtcGxhdGUKICAgICAgICAgICAgZGlyZWN0aXZlIGluc2lkZSBhIGNsYXNzIG9yICVhZGRtZXRob2RzIHRvIGNyZWF0ZQogICAgICAgICAgICBpbnN0YW50aWF0aW9ucyAoc2VlIERvYy9NYW51YWwvU1dJR1BsdXMuaHRtbCkuICBTdXBwb3J0aW5nCiAgICAgICAgICAgIHRoaXMgd2FzIGVhc3ktLS1lYXJsaWVyIGNoYW5nZXMgdG8gdGVtcGxhdGVzIG1hZGUgaXQKICAgICAgICAgICAgcG9zc2libGUgdXNpbmcgb25seSBhIHR3by1saW5lIG1vZGlmaWNhdGlvbiB0byB0aGUgcGFyc2VyCiAgICAgICAgICAgIGFuZCBhIGZldyBtaW5vciBtb2RpZmljYXRpb25zIGVsc2V3aGVyZS4gIEhtbW0sIGNvbWUgdG8gCiAgICAgICAgICAgIHRoaW5rIG9mIGl0LCB0aGUgc21va2Ugd2FzIHJhdGhlciB0aGljayBpbiB0aGF0IEludGVybmV0ICJjYWZlIi4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgICAKMDQvMTkvMjAwMjogYmVhemxleSAoVEdWKQogICAgICAgICAgICBJbXByb3ZlZCBoYW5kbGluZyBvZiBub24tdHlwZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIHZlY3RvcjxpbnQsMTAwPjsKCiAgICAgICAgICAgIFNpbXBsZSBudW1iZXJzIGFuZCBzdHJpbmdzIGNhbiBiZSB1c2VkIHdpdGggdGhlICV0ZW1wbGF0ZQogICAgICAgICAgICBkaXJlY3RpdmUgYXMgd2VsbC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAldGVtcGxhdGUodmVjaW50MTAwKSB2ZWN0b3I8aW50LDEwMD47CgogICAgICAgICAgICBOb3RlOiBBcml0aG1ldGljIGV4cHJlc3Npb25zIGFyZSBub3QgY3VycmVudGx5IGFsbG93ZWQuCiAgICAgICAgICAgIAogICAgICAgICAgICBEZWZhdWx0IHRlbXBsYXRlIGFyZ3VtZW50cyBub3cgd29yayBhbmQgZG8gbm90IGhhdmUgdG8KICAgICAgICAgICAgYmUgZ2l2ZW4gdG8gJXRlbXBsYXRlLgogICAgICAgICAgICAgICAgICAgICAgICAKMDQvMTgvMjAwMjogYmVhemxleSAoUGFyaXMpCiAgICAgICAgICAgIENoYW5nZSBpbiBpbnRlcm5hbCB0ZW1wbGF0ZSBoYW5kbGluZy4gIFRlbXBsYXRlCiAgICAgICAgICAgIHBhcmFtZXRlcnMgYXJlIG5vdyBmdWxseSBpbnRlZ3JhdGVkIGludG8gdGhlIHR5cGUKICAgICAgICAgICAgc3lzdGVtIGFuZCBhcmUgYXdhcmUgb2YgdHlwZWRlZnMsIGV0Yy4gIFRoaXMgYnVpbGRzCiAgICAgICAgICAgIHVwb24gdGhlIGNoYW5nZSBiZWxvdy4gICAKCiAgICAgICAgICAgICoqKiBERVZFTE9QRVIgV0FSTklORyAqKioKICAgICAgICAgICAgV29yZCBvZiBjYXV0aW9uIHRvIGxhbmd1YWdlIG1vZHVsZSB3cml0ZXJzLiAgVGhlICJuYW1lIgogICAgICAgICAgICBwYXJhbWV0ZXIgb2YgY2VydGFpbiBwYXJzZSB0cmVlIG5vZGVzIChjbGFzc2VzLCBmdW5jdGlvbnMsIGV0Yy4pCiAgICAgICAgICAgIG1heSBiZSBwYXJhbWV0ZXJpemVkIHdpdGggdHlwZXMuICAgVGhpcyBwYXJhbWV0ZXJpemF0aW9uIGlzCiAgICAgICAgICAgIGRvbmUgdXNpbmcgU1dJRyB0eXBlLXN0cmluZ3MgYW5kIG5vdCB0aGUgdW5kZXJseWluZyBDIHZlcnNpb24uCiAgICAgICAgICAgIEZvciBleGFtcGxlLAoKICAgICAgICAgICAgICAgaW50IG1heDxpbnQgKj4oaW50ICosaW50ICopICAKCiAgICAgICAgICAgIGhhcyBhIG5hbWUgb2YgIm1heDwocC5pbnQpPiIuICBJZiB5b3UgdXNlIHRoZSBuYW1lIGRpcmVjdGx5LAogICAgICAgICAgICB5b3UgbWF5IGdldCBzeW50YXggZXJyb3JzIGluIHRoZSBnZW5lcmF0ZWQgY29kZS4gIFRvIGZpeCB0aGlzLAogICAgICAgICAgICB1c2UgU3dpZ1R5cGVfbmFtZXN0cihuYW1lKSB0byBjb252ZXJ0IGEgcGFyYW1ldGVyaXplZCBuYW1lIAogICAgICAgICAgICB0byBhIEMgbmFtZSB3aXRoIHZhbGlkIHN5bnRheC4gIFRoZSBpbnRlcm5hbCB2ZXJzaW9uIGlzCiAgICAgICAgICAgIHVzZWQgdG8gcmVkdWNlIHRlbXBsYXRlIHR5cGVzIHRvIGEgY29tbW9uIHJlcHJlc2VudGF0aW9uIAogICAgICAgICAgICBhbmQgdG8gaGFuZGxlIGlzc3VlcyBvZiB0eXBlZGVmLgogICAgICAgICAgICAKMDQvMTYvMjAwMjogYmVhemxleSAoc29tZXdoZXJlIG92ZXIgdGhlIEF0bGFudGljKQogICAgICAgICAgICBFbmhhbmNlbWVudCBvZiB0eXBlZGVmIHJlc29sdXRpb24uICBUaGUgdHlwZSBzeXN0ZW0gaXMgbm93CiAgICAgICAgICAgIGF3YXJlIG9mIHRlbXBsYXRlIGFyZ3VtZW50cyBhbmQgdHlwZWRlZi4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgSW50ZWdlcjsKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgZm9vKHZlY3RvcjxpbnQ+ICp4LCB2ZWN0b3I8SW50ZWdlcj4gKnkpOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB2ZWN0b3I8aW50PiBhbmQgdmVjdG9yPEludGVnZXI+IGFyZQogICAgICAgICAgICB0aGUgc2FtZSB0eXBlLiAgIFRoZXJlIGlzIHNvbWUgaW50ZXJhY3Rpb24gYmV0d2VlbiB0aGlzCiAgICAgICAgICAgIG1lY2hhbmlzbSBhbmQgdGhlIGltcGxlbWVudGF0aW9uIG9mIHR5cGVtYXBzLiAgRm9yIGV4YW1wbGUsCiAgICAgICAgICAgIGEgdHlwZW1hcCBkZWZpbmVkIGZvciB2ZWN0b3I8aW50PiAqIHdvdWxkIGFwcGx5IHRvIGVpdGhlciB0eXBlLgogICAgICAgICAgICBIb3dldmVyLCBhIHR5cGVtYXAgZm9yIHZlY3RvcjxJbnRlZ2VyPiAqIHdvdWxkIG9ubHkgYXBwbHkgdG8KICAgICAgICAgICAgdGhhdCB0eXBlLgoKICAgICAgICAgICAgVHlwZWRlZnMgYW5kIHR5cGVtYXBzIGFuZCBtYXRjaGVkIGJ5IGxlZnQtbW9zdCBleHBhbnNpb24uCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICB2ZWN0b3I8SW50ZWdlcixJbnRlZ2VyPiAtLT4gCiAgICAgICAgICAgICAgdmVjdG9yPGludCwgSW50ZWdlcj4gLS0+CiAgICAgICAgICAgICAgdmVjdG9yPGludCwgaW50PgoKCjA0LzI0LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQ2hhbmdlcyB0byBKYXZhIHNoYWRvdyBjbGFzc2VzLgogICAgICAgICAgICBPdmVyY29tZXMgYSBidWcgd2hlcmUgdGhlIG1vZHVsZSBhc3N1bWVkIHRoYXQgYSBwb2ludGVyIHRvIGEgZGVyaXZlZAogICAgICAgICAgICBjbGFzcyBjb3VsZCBiZSB1c2VkIGluIHBsYWNlIG9mIGEgcG9pbnRlciB0byBhIGJhc2UgY2xhc3MuIFRoYW5rcyAKICAgICAgICAgICAgdG8gU3RlcGhlbiBNY0NhdWwgZm9yIGFuYWx5c2luZyB0aGUgYnVnIGFuZCBzdWJtaXR0aW5nIHBhdGNoZXMuCgogICAgICAgICAgICBBIGNvbnNlcXVlbmNlIGlzIHRoYXQgdGhlIGdldENQdHIoKSBtZXRob2QgaW4gZWFjaCBzaGFkb3cgY2xhc3MgaGFzCiAgICAgICAgICAgIGRpc2FwcGVhcmVkIGFuZCBoYXMgYmVlbiByZXBsYWNlZCB3aXRoIGEgZ2V0Q1B0clhYWCgpLCB3aGVyZSBYWFggaXMgdGhlIAogICAgICAgICAgICBzaGFkb3cgY2xhc3MgbmFtZS4gSWYgeW91IGhhdmUgY29kZSB0aGF0IHByZXZpb3VzbHkgdXNlZCBnZXRDUHRyKCksIAogICAgICAgICAgICBhbmQgdGhlIGFzc29jaWF0ZWQgY2xhc3MgaXMgd3JhcHBpbmcgYSBDIHN0cnVjdCBvciBhIEMrKyBjbGFzcyB0aGF0CiAgICAgICAgICAgIGlzIG5vdCBpbnZvbHZlZCBpbiBhbiBpbmhlcml0YW5jZSBjaGFpbiwganVzdCB1c2UgdGhlIG5ldyBtZXRob2QuIElmCiAgICAgICAgICAgIGhvd2V2ZXIsIHRoZSBjbGFzcyBpcyBpbnZvbHZlZCBpbiBhbiBpbmhlcml0YW5jZSBjaGFpbiwgeW91J2xsIGhhdmUKICAgICAgICAgICAgdG8gY2hvb3NlIHdoaWNoIHBvaW50ZXIgeW91IHJlYWxseSB3YW50LiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAKICAgICAgICAgICAgaGFzIGJlZW4gYnJva2VuIGFzIG5vdCB1c2luZyB0aGUgY29ycmVjdCBwb2ludGVyIGNhbiBsZWFkIHRvIHdlaXJkIGJ1Z3MKICAgICAgICAgICAgdGhyb3VnaCBpbGwtZGVmaW5lZCBiZWhhdmlvdXIuIElmIHlvdSBhcmUgc3VyZSB5b3Ugd2FudCB0aGUgb2xkIG1ldGhvZHMsIAogICAgICAgICAgICB5b3UgY291bGQgYWRkIHRoZW0gYmFjayBpbnRvIGFsbCBzaGFkb3cgY2xhc3NlcyBieSBhZGRpbmcgdGhpcyBhdCB0aGUgCiAgICAgICAgICAgIGJlZ2lubmluZyBvZiB5b3VyIGludGVyZmFjZSBmaWxlOgoKICAgICAgICAgICAgJXByYWdtYShqYXZhKSBhbGxzaGFkb3djb2RlPSV7CiAgICAgICAgICAgICAgcHVibGljIGxvbmcgZ2V0Q1B0cigpewogICAgICAgICAgICAgICAgcmV0dXJuIHN3aWdDUHRyOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFBsZWFzZSBzZWUgZW50cnkgZGF0ZWQgMDcvMjMvMjAwMiB0byBzZWUgaG93IHRvIGRvIHRoaXMgYWZ0ZXIgdGhlIGRlcHJlY2F0aW9uCiAgICAgICAgICAgIG9mIHRoZSBhbGxzaGFkb3djb2RlIHByYWdtYS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjA0LzEzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIGFuZCByZWZlcmVuY2VzLiAgIERlY2xhcmF0aW9ucyBzdWNoIAogICAgICAgICAgICBhcyB0aGlzIHNob3VsZCBub3cgd29yazoKCiAgICAgICAgICAgICAgICB2b2lkIGZvbyhjb25zdCBzdHJpbmcgJnggPSAiSGVsbG8iKTsKCjA0LzEyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgdHlwZW1hcCAkKiBzdWJzdGl0dXRpb25zIGZvciB0eXBlbWFwcyBpbnZvbHZpbmcgYXJyYXlzLgogICAgICAgICAgICBSZXF1ZXN0ZWQgYnkgV2lsbGlhbSBGdWx0b24uCgowNC8xMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGlzIG5vdyBzdXBwb3J0ZWQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIHRlbXBsYXRlPD4gY2xhc3MgdmVjdG9yPGludD4gewogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFdoZW4gdGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgaXMgdXNlZCwgaXQgd2lsbCB1c2UgYSBzcGVjaWFsaXphdGlvbgogICAgICAgICAgICBpZiBvbmUgaXMgZGVmaW5lZC4gICBUaGVyZSBhcmUgc3RpbGwgc29tZSBsaW1pdGF0aW9ucy4gUGFydGlhbAogICAgICAgICAgICBzcGVjaWFsaXphdGlvbiBpcyBub3Qgc3VwcG9ydGVkLiAgQSB0ZW1wbGF0ZSBvZiB0eXBlIDx2b2lkICo+IGRvZXMKICAgICAgICAgICAgbm90IG1hdGNoIGFsbCBwb2ludGVycy4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDQvMTEvMjAwMjogYmVhemxleQogICAgICAgICAgICBNYWpvciBjaGFuZ2UgdG8gdGVtcGxhdGUgd3JhcHBpbmcgaW50ZXJuYWxzLiBUZW1wbGF0ZSBkZWNsYXJhdGlvbnMgYXJlCiAgICAgICAgICAgIG5vIGxvbmdlciBwcm9jZXNzZWQgYXMgbWFjcm9zIGJ1dCBub3cgcmVzdWx0IGluIHJlYWwgcGFyc2UtdHJlZQogICAgICAgICAgICBub2Rlcy4gIFRoZSAldGVtcGxhdGUgZGlyZWN0aXZlIGV4cGFuZHMgdGhlc2Ugbm9kZXMgaW50byBhCiAgICAgICAgICAgIHNwZWNpZmljIGluc3RhbnRpYXRpb24uICAgVGhpcyBjaGFuZ2UgZW5hYmxlcyBhIG51bWJlciBvZgogICAgICAgICAgICBuZXcgYW5kIGludGVyZXN0aW5nIGNhcGFiaWxpdGllczoKCiAgICAgICAgICAgIERpcmVjdGl2ZXMgc3VjaCBhcyAlcmVuYW1lLCAlZmVhdHVyZSwgYW5kICVhZGRtZXRob2RzIGNhbgogICAgICAgICAgICBub3cgYmUgYXBwbGllZCB0byB1bmluc3RhbnRpYXRlZCB0ZW1wbGF0ZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXJlbmFtZShiYXJzaXplKSB2ZWN0b3I6OmJhcihjaGFyICpidWYsIGludCBsZW4pOwogICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIHZlY3RvciB7CiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIHZvaWQgYmFyKGNoYXIgKmJ1Zik7CiAgICAgICAgICAgICAgICAgdm9pZCBiYXIoY2hhciAqYnVmLCBpbnQgbGVuKTsgICAvLyBSZW5hbWVkCiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgJXRlbXBsYXRlKGludHZlY3RvcikgdmVjdG9yPGludD47ICAgLy8gUmVuYW1pbmcgY2FycmllcyB0aHJvdWdoCgogICAgICAgICAgICAKICAgICAgICAgICAgQnkgcGFyc2luZyB0ZW1wbGF0ZXMgaW50byBhbiBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZSwgaXQgd2lsbAogICAgICAgICAgICBiZSBwb3NzaWJsZSB0byBzdXBwb3J0IHNwZWNpYWxpemF0aW9uIChhbmQgbWF5YmUgcGFydGlhbAogICAgICAgICAgICBzcGVjaWFsaXphdGlvbikuCiAgICAgICAgICAgIAogICAgICAgICAgICBUaGlzIGlzIGhpZ2hseSBleHBlcmltZW50YWwgYW5kIGEgd29yayBpbiBwcm9ncmVzcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICBJbiBTV0lHLTEuMy4xMSwgdGVtcGxhdGUgZGVjbGFyYXRpb25zIHdlcmUgc2ltcGx5IHByb2Nlc3NlZAogICAgICAgICAgICBhcyB3ZWlyZCBtYWNyb3MuICBObyBvdGhlciBpbmZvcm1hdGlvbiB3YXMgcmV0YWluZWQuICAgVGhpcyAKICAgICAgICAgICAgbWFkZSBpdCBpbXBvc3NpYmxlIHRvIHN1cHBvcnQgbW9yZSBhZHZhbmNlZCBmZWF0dXJlcyBhbmQgCiAgICAgICAgICAgIGNvbXBsaWNhdGVkIG1hbnkgb3RoZXIgcGFydHMgb2YgdGhlIGltcGxlbWVudGF0aW9uLgoKMDQvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBDaGFuZ2UgdG8gdGVtcGxhdGUgY2xhc3Mgd3JhcHBpbmcuICAgVGhlcmUgd2VyZSBhIHZhcmlldHkgb2YKICAgICAgICAgICAgImlzc3VlcyIgd2l0aCB0aGUgb2xkIGFwcHJvYWNoIHJlbGF0ZWQgdG8gcGFyc2luZywgdGhlIHR5cGUKICAgICAgICAgICAgc3lzdGVtLCBhbmQgbmFtZXNwYWNlcy4gICBUaGVzZSBjaGFuZ2VzIGFyZSBtZWFudCB0byByZWN0aWZ5CiAgICAgICAgICAgIHNvbWUgb2YgdGhlc2UgcHJvYmxlbXM6CgogICAgICAgICAgICBBIHNwZWNpZmljIGluc3RhbnRpYXRpb24gb2YgYSB0ZW1wbGF0ZSBjYW4gbm93IGJlIHNwZWNpZmllZAogICAgICAgICAgICBieSBpbmNsdWRpbmcgdGhlIGNsYXNzIGlubGluZSBsaWtlIHRoaXM6CiAKICAgICAgICAgICAgICAgICAgY2xhc3MgdmVjdG9yPGludD4gewogICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yKCk7CiAgICAgICAgICAgICAgICAgICAgICB+dmVjdG9yKCk7CiAgICAgICAgICAgICAgICAgICAgICAgLi4uIHdoYXRldmVyIC4uLgoJICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoaXMgaXMgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24sIGJ1dCBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGlzCiAgICAgICAgICAgIG5vdCB5ZXQgaW1wbGVtZW50ZWQuCiAgICAgICAgICAgIAogICAgICAgICAgICBUaGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBoYXMgYmVlbiBtb2RpZmllZCB0byBleHBhbmQgcm91Z2hseSBhcwogICAgICAgICAgICBmb2xsb3dzOgoKICAgICAgICAgICAgICAgICAldGVtcGxhdGUodmVjaW50KSB2ZWN0b3I8aW50PjsKCiAgICAgICAgICAgIGJlY29tZXMKCiAgICAgICAgICAgICAgICAgJXJlbmFtZSh2ZWNpbnQ+IHZlY3RvcjxpbnQ+OwogICAgICAgICAgICAgICAgIGNsYXNzIHZlY3RvcjxpbnQ+IHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIHZlY3RvcigpOwogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgTm90ZSB0aGF0IHRoaXMgc2ltcGx5IGJ1aWxkcyB1cG9uIHRoZSBjb2RlIGFib3ZlICh0ZW1wbGF0ZXMKICAgICAgICAgICAgaW5jbHVkZWQgaW5saW5lKS4KCiAgICAgICAgICAgIFRoaXMgbW9kaWZpZWQgYXBwcm9hY2ggdG8gd3JhcHBpbmcgZml4ZXMgc29tZSBzdWJ0bGUgdHlwZQogICAgICAgICAgICBpc3N1ZXMuICBGb3IgaW5zdGFuY2UsIHlvdSBjYW4gbm93IGRlZmluZSB0eXBlbWFwcyBhbmQgdHlwZWRlZnMKICAgICAgICAgICAgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgdmVjdG9yPGludD4gKiB7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHR5cGVkZWYgdmVjdG9yPGludD4gaW50dmVjdG9yOwogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIHZvaWQgYmxhaChpbnR2ZWN0b3IgKnYpOyAgIC8vIEdldHMgdGhlIGFib3ZlIHR5cGVtYXAKCiAgICAgICAgICAgIFRoaXMgZGlkIG5vdCB3b3JrIGluIFNXSUctMS4zLjExIGR1ZSB0byBhIHBlY3VsaWFyaXR5IG9mCiAgICAgICAgICAgIHRoZSB0ZW1wbGF0ZSBpbXBsZW1lbnRhdGlvbi4KCiAgICAgICAgICAgICV0ZW1wbGF0ZShuYW1lKSBubyBsb25nZXIgaW5zdGFsbHMgdGhlIHRlbXBsYXRlIGFzIGEgY2xhc3MKICAgICAgICAgICAgd2l0aCBuYW1lICJuYW1lIi4gICBUaGlzIG1pZ2h0IGJyZWFrICVhZGRtZXRob2RzIGFzIGRlc2NyaWJlZAogICAgICAgICAgICBpbiB0aGUgbWFudWFsLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWNpbnQpIHZlY3RvcjxpbnQ+OwogICAgICAgICAgICAgICAgICVhZGRtZXRob2RzIHZlY2ludCB7ICAgIC8vIEZhaWxzLiB2ZWNpbnQgbm90IGEgY2xhc3MKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgCiAgICAgICAgICAgIFRvIGZpeCB0aGlzLCBqdXN0IHVzZSB0aGUgdGVtcGxhdGUgbmFtZSBpbnN0ZWFkOgoKICAgICAgICAgICAgICAgICAlYWRkbWV0aG9kcyB2ZWN0b3I8aW50PiB7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIE5vdGU6IFRoaXMgdGVjaG5pcXVlIG1pZ2h0IGJlIGEgd2F5IHRvIGltcGxlbWVudCBzb21lIGJpemFycmUKICAgICAgICAgICAgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gdGVjaG5pcXVlcy4gICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJWFkZG1ldGhvZHMgdmVjdG9yPGludD4gewogICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGFwcGxpZWQgaWYgdmVjdG9yPGludD4gaW5zdGFudGlhdGVkIGxhdGVyCiAgICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSB2ZWN0b3I8aW50PiAqIHsKICAgICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICAgCjA0LzA4LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1NDA4NjggXSAjaWYgZGVmaW5lZCB3aGF0ZXZlciAtIG5vdCBwYXJzZWQuICBTV0lHIHNob3VsZAogICAgICAgICAgICBub3cgY29ycmVjdGx5IGhhbmRsZSBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgI2lmIGRlZmluZWQgX19jcGx1c3BsdXMKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgI2VuZGlmCiAgICAgICAgICAgICAKICAgICAgICAgICAgTm90ZTogd2FzIGltcGxlbWVudGVkIHByZXZpb3VzbHksIGJ1dCB0aGVyZSB3YXMgYSBtaW5vciBidWcuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEFkYW0gSHVwcC4KICAgICAgICAgICAgICAgICAgIAowNC8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgICVyZWFkb25seSBhbmQgJXJlYWR3cml0ZSBhcmUgZGVwcmVjYXRlZCBkdWUgdG8gYSBjaGFuZ2UgaW4gdGhlIAogICAgICAgICAgICBpbXBsZW1lbnRhdGlvbi4gIEluc3RlYWQgb2YgYmVpbmcgcHJhZ21hcywgbXV0YWJpbGl0eSBpcyBub3cKICAgICAgICAgICAgY29udHJvbGxlZCBhcyBhICJmZWF0dXJlIiB1c2luZyB0aGUgZm9sbG93aW5nIHR3byBkaXJlY3RpdmVzOgoKICAgICAgICAgICAgICAgICAlaW1tdXRhYmxlOwogICAgICAgICAgICAgICAgIGludCB4OyAgICAgICAgICAgLy8gcmVhZC1vbmx5IHZhcmlhYmxlCiAgICAgICAgICAgICAgICAgaW50IHk7ICAgICAgICAgICAvLyByZWFkLW9ubHkgdmFyaWFibGUKICAgICAgICAgICAgICAgICAlbXV0YWJsZTsKICAgICAgICAgICAgICAgICBpbnQgejsgICAgICAgICAgIC8vIE1vZGlmaWFibGUKCiAgICAgICAgICAgICVpbW11dGFibGUgYW5kICVtdXRhYmxlIGFyZSBtdWNoIG1vcmUgcG93ZXJmdWwgdGhhbiB0aGVpciBvbGRlcgogICAgICAgICAgICBjb3VudGVycGFydHMuICBUaGV5IGNhbiBub3cgcGlucG9pbnQgYSBzcGVjaWZpYyBkZWNsYXJhdGlvbiBsaWtlCiAgICAgICAgICAgIHRoaXM6CgogICAgICAgICAgICAgICAlaW1tdXRhYmxlICB4OyAgICAgICAgIC8qIEFueSB4ICovCiAgICAgICAgICAgICAgICVpbW11dGFibGUgIEZvbzo6eDsgICAgLyogeCBpbiBjbGFzcyBGb28gKi8KCiAgICAgICAgICAgIEluIGZhY3QsIHRoZSBtYXRjaGluZyBhbGdvcml0aG0gaXMgdGhlIHNhbWUgYXMgZm9yICVyZW5hbWUsIAogICAgICAgICAgICAlaWdub3JlLCBhbmQgb3RoZXIgZGlyZWN0aXZlcy4gICBUaGlzIG1lYW5zIHRoYXQgdGhlIGRlY2xhcmF0aW9uCiAgICAgIAogICAgICAgICAgICAgICAlaW1tdXRhYmxlICBGb286Ong7CgogICAgICAgICAgICB3b3VsZCBub3Qgb25seSBhcHBseSB0byBjbGFzcyBGb28gYnV0IHRvIGFsbCBkZXJpdmVkIGNsYXNzZXMKICAgICAgICAgICAgYXMgd2VsbC4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICAlaW1tdXRhYmxlIGFuZCAlbXV0YWJsZSBtdXN0IGJlIHRlcm1pbmF0ZWQgYnkgYSBzZW1pLWNvbG9uLiAgVGhpcwogICAgICAgICAgICBkaWZmZXJzIHNsaWdodGx5IGZyb20gdGhlIG9sZGVyICVyZWFkb25seSBhbmQgJXJlYWR3cml0ZSBkaXJlY3RpdmVzLgogICAgICAgICAgICBTaW5jZSAlaW1tdXRhYmxlIGFuZCAlbXV0YWJsZSBjYW4gYmUgYXBwbGllZCB0byBkZWNsYXJhdGlvbnMgdGhlCiAgICAgICAgICAgIHNlbWljb2xvbiBpcyBuZWVkZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBhIGdsb2JhbCBmZWF0dXJlIGFuZCAKICAgICAgICAgICAgb25lIHRhcmdldGVkIHRvIGEgc2luZ2xlIGRlY2xhcmF0aW9uLiAgTm90ZTogdGhpcyBpbmNvbXBhdGliaWxpdHkgaXMgdGhlCiAgICAgICAgICAgIHByaW1hcnkgcmVhc29uIGZvciBjaGFuZ2luZyB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0aXZlLgoKMDQvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBOZXcgaGFuZGxpbmcgb2YgY29weSBjb25zdHJ1Y3RvcnMuICBJZiBhIGNsYXNzIGRlZmluZXMgCiAgICAgICAgICAgIGNvbnN0cnVjdG9ycyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIEZvbygpOwogICAgICAgICAgICAgICAgICAgICAgRm9vKGNvbnN0IEZvbyAmKTsgICAgICAgLy8gQ29weSBjb25zdHJ1Y3RvcgogICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgU1dJRyBub3cgZ2VuZXJhdGVzIGEgZnVuY3Rpb24gY29weV9Gb28oKSBmb3IgdGhlIGNvcHkKICAgICAgICAgICAgY29uc3RydWN0b3IuCgogICAgICAgICAgICBJbiBwcmV2aW91cyB2ZXJpb25zLCB0aGlzIGdlbmVyYXRlZCBhIG5hbWUtY2xhc2ggYW5kIGFuCiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UuICAgVG8gcHJlc2VydmUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIFNXSUcKICAgICAgICAgICAgZG9lcyBub3QgY2hhbmdlIHRoZSBiZWhhdmlvciBpZiAlcmVuYW1lIGlzIHVzZWQgdG8gcmVzb2x2ZQogICAgICAgICAgICB0aGUgbmFtZSBjb25mbGljdC4gICBIb3dldmVyLCBpZiBubyBuYW1lIHJlc29sdXRpb24gaXMgbWFkZSwKICAgICAgICAgICAgdGhpcyBuZXcgYXBwcm9hY2ggaXMgdXNlZC4KCiAgICAgICAgICAgIENvcHkgY29uc3RydWN0b3JzIG1heSBiZSBoYW5kbGVkIGFzIGEgc3BlY2lhbCBjYXNlIGluIHRoZQogICAgICAgICAgICB0YXJnZXQgbGFuZ3VhZ2UuICBIb3dldmVyLCB0aGlzIGlzIHVwIHRvIHRoZSBsYW5ndWFnZSBtb2R1bGUKICAgICAgICAgICAgaXRzZWxmLgogICAgICAgICAgICAgICAgICAKMDQvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBUaGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBpcyBub3cgbmFtZXNwYWNlIGF3YXJlLiAgIFRoaXMgYWxsb3dzCiAgICAgICAgICAgIGNvZGUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBmb28gewogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IG1heChUIGEsIFQgYikgeyByZXR1cm4gYSA+IGIgPyBhIDogYjsgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBmb287CiAgICAgICAgICAgICAgICAldGVtcGxhdGUobWF4aW50KSBtYXg8aW50PjsgICAgICAgICAgICAvLyBPawoKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBiYXIgewogICAgICAgICAgICAgICAgICAgdXNpbmcgZm9vOjptYXg7CiAgICAgICAgICAgICAgICAgICAldGVtcGxhdGUobWF4ZG91YmxlKSBtYXg8ZG91YmxlPjsgICAvLyBPawogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgQ2F2ZWF0OiB0aGUgdGVtcGxhdGUgbmFtZSBzdXBwbGllZCB0byAldGVtcGxhdGUgbXVzdCBiZSBkZWZpbmVkIGluIHRoZQogICAgICAgICAgICBzYW1lIHNjb3BlIGluIHdoaWNoIHRoZSAldGVtcGxhdGUgZGlyZWN0aXZlIGFwcGVhcnMuICAgVGhpcyBjb2RlIGlzCiAgICAgICAgICAgIGlsbGVnYWw6CgogICAgICAgICAgICAgICAgJXRlbXBsYXRlKG1heGludCkgZm9vOjptYXg8aW50PjsKCjA0LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWlub3IgZW5oYW5jZW1lbnQgdG8gcHJlcHJvY2Vzc29yLiAgIFRoZSBwcmVwcm9jZXNzb3IgY2FuIG5vdyBwZXJmb3JtCiAgICAgICAgICAgIHN0cmluZyBjb21wYXJpc29uLiAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgI2RlZmluZSBBICJoZWxsbyIKICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICNpZiBBID09ICJoZWxsbyIKICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICNlbmRpZgoKICAgICAgICAgICAgVGhlIHByaW1hcnkgdXNlIG9mIHRoaXMgaXMgaW4gU1dJRyBtYWNyb3MuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWRlZmluZSBGT08oeCkgCiAgICAgICAgICAgICAgI2lmICN4ID09ICJpbnQiCiAgICAgICAgICAgICAgLyogU3BlY2lhbCBoYW5kbGluZyBmb3IgaW50ICovCiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgI2VuZGlmCiAgICAgICAgICAgICAgJWVuZGRlZgoKICAgICAgICAgICAgTm9ybWFsIHVzZXJzIGNhbiBwcm9iYWJseSBzYWZlbHkgaWdub3JlIHRoaXMgZmVhdHVyZS4gIEhvd2V2ZXIsIGl0IG1heQogICAgICAgICAgICBiZSB1c2VkIGluIHBhcnRzIG9mIHRoZSBTV0lHIGxpYnJhcnkuCgowNC8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZ1cnRoZXIgcmVmaW5lbWVudCBvZiBkZWZhdWx0IGNvbnN0cnVjdG9yL2Rlc3RydWN0b3Igd3JhcHBlciBnZW5lcmF0aW9uLgogICAgICAgICAgICBTV0lHIGlzIG5vdyBtdWNoIG1vcmUgYXdhcmUgb2YgcHVyZSB2aXJ0dWFsIG1ldGhvZHMuIEZvciBpbnN0YW5jZToKCiAgICAgICAgICAgICAgY2xhc3MgQSB7ICAgICAgICAgICAgIC8qIEFic3RyYWN0ICovCiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBtZXRob2QxKCkgPSAwOwogICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBtZXRob2QyKCkgPSAwOwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgY2xhc3MgQiA6IHB1YmxpYyBBIHsgIC8qIEFic3RyYWN0ICovCiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBtZXRob2QxKCkgeyB9OwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgIGNsYXNzIEMgOiBwdWJsaWMgQiB7ICAvKiBPayAqLwogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgbWV0aG9kMigpIHsgfTsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBTV0lHIHdpbGwgb25seSBnZW5lcmF0ZSBkZWZhdWx0IGNvbnN0cnVjdG9ycyBmb3IgQy4KICAgICAgICAgICAgRXZlbiB0aG91Z2ggQiBsb29rcyBmaW5lLCBpdCdzIG1pc3NpbmcgYSByZXF1aXJlZCBtZXRob2QgYW5kIGlzIGFic3RyYWN0LgoKMDQvMDQvMjAwMjogYmVhemxleQogICAgICAgICAgICBTdWJ0bGUgY2hhbmdlIHRvIHN0cnVjdHVyZSBkYXRhIG1lbWJlciBhY2Nlc3MuICBJZiB5b3UKICAgICAgICAgICAgaGF2ZSBhIHN0cnVjdHVyZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgICAgQmFyICAgYjsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGUgYWNjZXNzb3IgZnVuY3Rpb25zIGZvciBiIGFyZSBnZW5lcmF0ZWQgYXMgZm9sbG93czoKCiAgICAgICAgICAgICgxKSBJZiBiIGlzICpub3QqIGRlZmluZWQgYXMgYSBzdHJ1Y3R1cmUgb3IgY2xhc3M6CgogICAgICAgICAgICAgICAgQmFyIEZvb19iX2dldChGb28gKnNlbGYpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi0+YjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZvaWQgRm9vX2Jfc2V0KEZvbyAqc2VsZiwgQmFyIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi0+YiA9IHZhbHVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgKDIpIElmIGIgKmlzKiBkZWZpbmVkIGFzIGEgc3RydWN0dXJlIG9yIGNsYXNzOgoKICAgICAgICAgICAgICAgIEJhciAqRm9vX2JfZ2V0KEZvbyAqc2VsZikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAmc2VsZi0+YjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZvaWQgRm9vX2Jfc2V0KEZvbyAqc2VsZiwgQmFyICp2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHNlbGYtPmIgPSAqdmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIFNlZSB0aGUgIlN0cnVjdHVyZSBkYXRhIG1lbWJlcnMiIHNlY3Rpb24gb2YgRG9jL01hbnVhbC9TV0lHLmh0bWwKICAgICAgICAgICAgZm9yIGZ1cnRoZXIgZGV0YWlscy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICBUaGlzIG1heSBicmVhayBpbnRlcmZhY2VzIHRoYXQgcmVsaWVkIG9uIGEgbG90IG9mIGEgdW5kZWNsYXJlZAogICAgICAgICAgICBzdHJ1Y3R1cmUgYW5kIGNsYXNzIG5hbWVzLiAgICBUbyBnZXQgdGhlIG9sZCBiZWhhdmlvciwgc2ltcGx5CiAgICAgICAgICAgIHVzZSBhIGZvcndhcmQgZGVjbGFyYXRpb24gc3VjaCBhcyAic3RydWN0IEJhcjsiCiAgICAgICAgICAgIAowNC8wNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEMrKyBuYW1lc3BhY2Ugc3VwcG9ydCBhZGRlZC4gIFNXSUcgc3VwcG9ydHMgYWxsIGFzcGVjdHMgb2YKICAgICAgICAgICAgbmFtZXNwYWNlcyBpbmNsdWRpbmcgbmFtZXNwYWNlLCB1c2luZywgYW5kIG5hbWVzcGFjZSBhbGlhcwogICAgICAgICAgICBkZWNsYXJhdGlvbnMuICAgIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIFNXSUcgaXMgdG8gZmxhdHRlbgogICAgICAgICAgICBuYW1lc3BhY2VzIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuICBIb3dldmVyLCBuYW1lc3BhY2VzIGFyZQogICAgICAgICAgICBmdWxseSBzdXBwb3J0ZWQgYXQgdGhlIEMrKyBsZXZlbCBhbmQgaW4gdGhlIHR5cGUgc3lzdGVtLgogICAgICAgICAgICBTZWUgRG9jL01hbnVhbC9TV0lHUGx1cy5odG1sIGZvciBkZXRhaWxzIG9uIHRoZSBpbXBsZW1lbnRhdGlvbi4KICAgICAKMDQvMDIvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBTdW4gaGFzIG1vZGlmaWVkIGphdmFjIGluIGpkazEuNCB0byBubyBsb25nZXIgY29tcGlsZQogICAgICAgICAgICBhbiBpbXBvcnQgb2YgYW4gdW5uYW1lZCBuYW1lc3BhY2UuIFRvIGZpeCB0aGlzIFNXSUcgbm8gbG9uZ2VyIAogICAgICAgICAgICBnZW5lcmF0ZXMgdGhlIGltcG9ydCBmb3IgcGFja2FnZWxlc3MgY2xhc3Nlcy4KICAgICAgICAgICAgaHR0cDovL2RldmVsb3Blci5qYXZhLnN1bi5jb20vZGV2ZWxvcGVyL2J1Z1BhcmFkZS9idWdzLzQzNjE1NzUuaHRtbAogICAgICAgICAgICBBcyByZXBvcnRlZCBTRiAjNTM4NDE1LgoKMDMvMjcvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIHN1cHBvcnQgZm9yIHBvaW50ZXItdG8tbWVtYmVyLCBzaW1pbGFyIHRvIHRoYXQKICAgICAgICAgICAgZm9yIHRoZSBQeXRob24gbW9kdWxlLiBSZW1hcmthYmx5IHNpbWlsYXIuIEFsc28gYWRkZWQgYSBuZXcKICAgICAgICAgICAgZXhhbXBsZSBmb3IgdGhpcyAoRXhhbXBsZXMvcnVieS9tcG9pbnRlciksIHdoaWNoIGlzIHJlbWFya2FibHkKICAgICAgICAgICAgc2ltaWxhciB0byB0aGUgUHl0aG9uIGV4YW1wbGUgb2YgdGhlIHNhbWUgbmFtZS4KCjAzLzI2LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBNYWRlIGEgZmV3IG1pbm9yIGVkaXRzIHRvIHRoZSAiQWR2YW5jZWQgVG9waWNzIgogICAgICAgICAgICBjaGFwdGVyIG9mIHRoZSBTV0lHIG1hbnVhbCBhbmQgYWRkZWQgYSBuZXcgbWFqb3Igc2VjdGlvbgogICAgICAgICAgICBhYm91dCBob3cgdG8gY3JlYXRlIG11bHRpLW1vZHVsZSBSdWJ5IHBhY2thZ2VzIHdpdGggU1dJRy4KCjAzLzI2LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBSZW1vdmVkIGFsbCBvZiB0aGUgb2xkIFJ1YnkgcHJhZ21hcy4gSWYgYW55IG9mIHRoaXMKICAgICAgICAgICAgZnVuY3Rpb25hbGl0eSBpcyB0cnVseSBtaXNzZWQgd2UgY2FuIHJlc3VycmVjdCBpdCwgcHJlZmVyYWJseQogICAgICAgICAgICB3aXRoIHNvbWUga2luZCBvZiBmZWF0dXJlLWJhc2VkIGRpcmVjdGl2ZS4KICAgICAgICAgICAgCjAzLzI1LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBGaXhlZCBTV0lHIGV4Y2VwdGlvbiBsaWJyYXJ5IHN1cHBvcnQgZm9yIFJ1YnksIHdoaWNoCiAgICAgICAgICAgIGhhcyBhcHBhcmVudGx5IGJlZW4gYnJva2VuIGZvciBzb21lIHRpbWUuIEx1Y2tpbHksIG5vIG9uZSBzZWVtcwogICAgICAgICAgICB0byBoYXZlIG5vdGljZWQuCgowMy8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEMrKy1uYW1lc3BhY2Ugc3VwcG9ydCBpbiBTV0lHIGRpcmVjdGl2ZXMuCgogICAgICAgICAgICAlYWRkbWV0aG9kczogCgogICAgICAgICAgICBUaGUgJWFkZG1ldGhvZHMgZGlyZWN0aXZlIG5vdyBhY2NlcHRzIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZQogICAgICAgICAgICBhbmQgY2FuIGJlIHVzZWQgaW5zaWRlIEMrKyBuYW1lc3BhY2UgZGVjbGFyYXRpb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIC8vIEF0dGFjaGVzIHRvIHRoZSBjbGFzcyBGb286OkJhciBiZWxvdwogICAgICAgICAgICAgICAgICVhZGRtZXRob2RzIEZvbzo6QmFyIHsKICAgICAgICAgICAgICAgICAgICAgaW50IHNvbWVtZXRob2QoKSB7IC4uLiB9CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgbmFtZXNwYWNlIEZvbyB7CiAgICAgICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgLy8gQXR0YWNoZXMgdG8gdGhlIGNsYXNzIEJhciBhYm92ZQogICAgICAgICAgICAgICAgICAgICVhZGRtZXRob2RzIEJhciB7CiAgICAgICAgICAgICAgICAgICAgICBpbnQgb3RoZXJtZXRob2QoKSB7IC4uLiB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAlZmVhdHVyZSwgJXJlbmFtZSwgJWlnbm9yZSwgJWV4Y2VwdGlvbiwgYW5kIHJlbGF0ZWQgZGlyZWN0aXZlczoKCiAgICAgICAgICAgIE5hbWVzcGFjZXMgYXJlIGZ1bGx5IGludGVncmF0ZWQgaW50byB0aGUgcmVuYW1pbmcgYW5kIGRlY2xhcmF0aW9uCiAgICAgICAgICAgIG1hdGNoZXIuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJXJlbmFtZShkaXNwbGF5KSBGb286OnByaW50OyAgICAgICAgICAvLyBSZW5hbWUgaW4gbmFtZXNwYWNlIEZvbwogICAgICAgICAgICAgICAgICVpZ25vcmUgRm9vOjpCYXI6OmJsYWg7ICAgICAgICAgICAgICAgLy8gSWdub3JlIGEgZGVjbGFyYXRpb24KCiAgICAgICAgICAgICVyZW5hbWUgZGlyZWN0aXZlcyBjYW4gYmUgcGxhY2VkIGluc2lkZSBuYW1lc3BhY2UgYmxvY2tzIGFzIHdlbGwuIEZvcgogICAgICAgICAgICBleGFtcGxlOgoKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBGb28gewogICAgICAgICAgICAgICAgICAgJXJlbmFtZShkaXNwbGF5KSBwcmludDsgICAgICAgICAvLyBBcHBsaWVzIHRvIHByaW50IGJlbG93CgogICAgICAgICAgICAgICAgICAgdm9pZCBwcmludCgpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIE1vc3Qgb3RoZXIgU1dJRyBkaXJlY3RpdmVzIHNob3VsZCB3b3JrIHByb3Blcmx5IGluc2lkZSBuYW1lc3BhY2VzLgogICAgICAgICAgICBObyBvdGhlciBjaGFuZ2VzIGFyZSBuZWVkZWQuCiAgICAgIAowMy8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNvbWUgY2hhbmdlcyB0byBpbnRlcm5hbCBzeW1ib2wgdGFibGUgaGFuZGxpbmcuICAgU1dJRyBubyBsb25nZXIKICAgICAgICAgICAgbWFuYWdlcyBzdHJ1Y3R1cmVzIGFuZCB1bmlvbnMgaW4gYSBzZXBhcmF0ZSBuYW1lc3BhY2UgdGhhbiBub3JtYWwKICAgICAgICAgICAgZGVjbGFyYXRpb25zIGxpa2UgQU5TSSBDLiAgVGhpcyBtZWFucyB5b3UgY2FuJ3QgaGF2ZSBhIHN0cnVjdHVyZQogICAgICAgICAgICB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgYSBmdW5jdGlvbi4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpbnQgRm9vKCkgeyAuLi4gfQoKICAgICAgICAgICAgVGhpcyBhcHByb2FjaCBpcyBtb3JlIGxpa2UgQysrLiAgIEl0J3Mgbm90IGNsZWFyIHRoYXQgU1dJRyBldmVyCiAgICAgICAgICAgIHJlYWxseSBzdXBwb3J0ZWQgdGhlIEFOU0kgQyBhbnl3YXlzLS0tdXNpbmcgdGhlIHNhbWUgbmFtZSB3b3VsZAogICAgICAgICAgICBhbG1vc3QgY2VydGFpbmx5IGdlbmVyYXRlIGEgbmFtZS1jbGFzaCBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLgoKMDMvMjIvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEZpeGVkIFsgNTE3MzAyIF0gZm9yIGhhbmRsaW5nIG9mIHJlbmFtZWQgb3ZlcmxvYWRlZAogICAgICAgICAgICBjb25zdHJ1Y3RvcnMuIE5vdywgcmVuYW1lZCBvdmVybG9hZGVkIGNvbnN0cnVjdG9ycyBhcmUgY29udmVydGVkCiAgICAgICAgICAgIGludG8gY2xhc3Mgc2luZ2xldG9uIG1ldGhvZHMgKGJhc2ljYWxseSBhY3RpbmcgYXMgImZhY3RvcnkiCiAgICAgICAgICAgIG1ldGhvZHMpLgoKMDMvMjEvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDUzMjk1NyBdICVpZ25vcmUgcGFyc2UgZXJyb3IgYW5kIGNhc3Rpbmcgb3BlcmF0b3IuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IFdpbGxpYW0gRnVsdG9uLgoKMDMvMTgvMjAwMjogYmVhemxleSAoKiogQURWQU5DRUQgVVNFUlMgT05MWSAqKikKICAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgZHluYW1pYyBjYXN0aW5nIGluIHJldHVybiB2YWx1ZXMuICBBIHNvbWV3aGF0CiAgICAgICAgICAgIGNvbW1vbiBwcm9ibGVtIGluIGNlcnRhaW4gQysrIHByb2dyYW1zIGlzIGZ1bmN0aW9ucyB0aGF0IGhpZGUKICAgICAgICAgICAgdGhlIGlkZW50aXR5IG9mIHVuZGVybHlpbmcgb2JqZWN0cyB3aGVuIHRoZXkgYXJlIHJldHVybmVkIAogICAgICAgICAgICBmcm9tIG1ldGhvZHMgYW5kIGZ1bmN0aW9ucy4gIEZvciBleGFtcGxlLCBhIHByb2dyYW0gbWlnaHQgaW5jbHVkZQogICAgICAgICAgICBzb21lIGdlbmVyaWMgbWV0aG9kIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgICAgICBOb2RlICpnZXROb2RlKCk7CgogICAgICAgICAgICBIb3dldmVyLCBOb2RlICogbWF5IGp1c3QgYmUgYmFzZSBjbGFzcyB0byBhIHdob2xlIGhpZXJhcmNoeQogICAgICAgICAgICBvZiBkaWZmZXJlbnQgb2JqZWN0cy4gICBJbnN0ZWFkIG9mIHJldHVybmluZyB0aGlzIGdlbmVyaWMgTm9kZSAqLAogICAgICAgICAgICBpdCBtaWdodCBiZSBuaWNlIHRvIGF1dG9tYXRpY2FsbHkgZG93bmNhc3QgdGhlIG9iamVjdCBpbnRvIHRoZQogICAgICAgICAgICBhcHByb3ByaWF0ZSB0eXBlIHVzaW5nIHNvbWUga2luZCBkeW5hbWljIGNhc3QuCgogICAgICAgICAgICBBc3N1bWluZyB5b3UgdW5kZXJzdGFuZCB0aGUgcGVyaWwgaW52b2x2ZWQsIGEgZG93bmNhc3QgY2FuIG5vdwogICAgICAgICAgICBiZSBwZXJmb3JtZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBmdW5jdGlvbiBpbiB0aGUgcnVuLXRpbWUgdHlwZQogICAgICAgICAgICBjaGVja2VyOgoKICAgICAgICAgICAgICBzd2lnX3R5cGVfaW5mbyAqU1dJR19UeXBlRHluYW1pY0Nhc3Qoc3dpZ190eXBlX2luZm8gKiwgdm9pZCAqKnB0cik7CgogICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB0byBzZWUgaWYgdGhlIHR5cGUgY2FuIGJlIGNvbnZlcnRlZCB0byBhbm90aGVyCiAgICAgICAgICAgIHR5cGUuICBJZiBzbywgYSBkaWZmZXJlbnQgdHlwZSBkZXNjcmlwdG9yIChmb3IgdGhlIGNvbnZlcnRlZCB0eXBlKQogICAgICAgICAgICBpcyByZXR1cm5lZC4gICBUaGlzIHR5cGUgZGVzY3JpcHRvciB3b3VsZCB0aGVuIGJlIHVzZWQgdG8gY3JlYXRlCiAgICAgICAgICAgIGEgcG9pbnRlciBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLgoKICAgICAgICAgICAgVG8gdXNlIHRoaXMsIHlvdSB3b3VsZCB3cml0ZSBhIHR5cGVtYXAgc2ltaWxhciB0byB0aGlzOgoKICAgICAgICAgICAgICAldHlwZW1hcChvdXQpIE5vZGUgKiB7CiAgICAgICAgICAgICAgICBzd2lnX3R5cGVfaW5mbyAqdHkgPSBTV0lHX1R5cGVEeW5hbWljQ2FzdCgkMV9kZXNjcmlwdG9yLCAodm9pZCAqKikgJiQxKTsKICAgICAgICAgICAgICAgICRyZXN1bHQgPSBTV0lHX05ld1BvaW50ZXJPYmooJDEsIHR5KTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICBBbHRlcm5hdGl2ZWx5LAoKICAgICAgICAgICAgICAldHlwZW1hcChvdXQpIE5vZGUgKiA9IFNXSUdUWVBFICpEWU5BTUlDOwoKICAgICAgICAgICAgVG8gbWFrZSB0aGUgdHlwZW1hcCBoYXZlIGFueSBlZmZlY3QsIHlvdSBoYXZlIHRvIHdyaXRlIGEgc3VwcG9ydGluZyAKICAgICAgICAgICAgZnVuY3Rpb24gdGhhdCBrbm93cyBob3cgdG8gcGVyZm9ybSBkb3duY2FzdGluZy4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgc3RhdGljIHN3aWdfdHlwZV9pbmZvICoKICAgICAgICAgICAgICBOb2RlX2R5bmFtaWNfY2FzdCh2b2lkICoqcHRyKSB7CiAgICAgICAgICAgICAgICAgTm9kZSAqKm5wdHIgPSAoTm9kZSAqKikgcHRyOwogICAgICAgICAgICAgICAgIEVsZW1lbnQgKmUgPSBkeW5hbWljX2Nhc3Q8RWxlbWVudCAqPigqbnB0cik7CiAgICAgICAgICAgICAgICAgaWYgKGUpIHsKICAgICAgICAgICAgICAgICAgICAqcHRyID0gKHZvaWQgKikgZTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1dJR1RZUEVfcF9FbGVtZW50OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBEYXRhICpkID0gZHluYW1pY19jYXN0PERhdGEgKj4oKm5wdHIpOwogICAgICAgICAgICAgICAgIGlmIChkKSB7CiAgICAgICAgICAgICAgICAgICAgKnB0ciA9ICh2b2lkICopIGQ7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNXSUdUWVBFX3BfRGF0YTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICV9CgogICAgICAgICAgICBUaGVyZSBpcyBubyByZXN0cmljdGlvbiBvbiBob3cgdHlwZXMgYXJlIGRldGVybWluZWQuIGR5bmFtaWNfY2FzdDw+CiAgICAgICAgICAgIHVzZXMgQysrIFJUVEkuICBIb3dldmVyLCBpZiB5b3UgaGFkIHNvbWUgb3RoZXIgbWVjaGFuaXNtIGZvciBkZXRlcm1pbmluZwogICAgICAgICAgICB0aGUgdHlwZSwgeW91IGNvdWxkIHVzZSB0aGF0IGhlcmUuICBOb3RlOiBpdCBpcyBpbXBvcnRhbnQgdG8gc2F2ZQogICAgICAgICAgICB0aGUgbmV3IHBvaW50ZXIgdmFsdWUgYmFjayBpbnRvIHRoZSBhcmd1bWVudCBhcyBzaG93bi4gIFdoZW4gZG93bmNhc3RpbmcsCiAgICAgICAgICAgIHRoZSB2YWx1ZSBvZiB0aGUgcG9pbnRlciBjb3VsZCBjaGFuZ2UuIAoKICAgICAgICAgICAgRmluYWxseSwgdG8gbWFrZSB0aGUgY2FzdGluZyBmdW5jdGlvbiBhdmFpbGFibGUsIHlvdSBoYXZlIHRvIHJlZ2lzdGVyCiAgICAgICAgICAgIGl0IHdpdGggdGhlIHJ1bi10aW1lIHR5cGUgY2hlY2tlci4gUHV0IHRoaXMgbWFjcm8gaW4geW91ciBpbnRlcmZhY2UgZmlsZS4KCiAgICAgICAgICAgICAgIERZTkFNSUNfQ0FTVChTV0lHVFlQRV9wX05vZGUsIE5vZGVfZHluYW1pY19jYXN0KTsKCiAgICAgICAgICAgIE5vdGU6IHRoaXMgZmVhdHVyZSBkb2VzIG5vdCBpbnRyb2R1Y2UgYSBwZXJmb3JtYW5jZSBwZW5hbHR5IG9uIAogICAgICAgICAgICBub3JtYWwgU1dJRyBvcGVyYXRpb24uICBUaGUgZmVhdHVyZSBpcyBvbmx5IGVuYWJsZWQgYnkgd3JpdGluZwogICAgICAgICAgICBhIG5ldyB0eXBlbWFwIHRoYXQgZXhwbGljaXRseSBjYWxscyBTV0lHX1R5cGVEeW5hbWljQ2FzdCgpIHRvCiAgICAgICAgICAgIG1ha2UgYSBjb252ZXJzaW9uLiAKICAKICAgICAgICAgICAgRXhhbXBsZXMvdGVzdC1zdWl0ZS9keW5hbWljX2Nhc3QuaSBjb250YWlucyBhIHNpbXBsZSBleGFtcGxlLgogICAgICAgICAgICBUaGlzIGZlYXR1cmUgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgSmF2YSBtb2R1bGUgZHVlIHRvIGRpZmZlcmVuY2VzCiAgICAgICAgICAgIGluIHRoZSB0eXBlLWNoZWNraW5nIGltcGxlbWVudGF0aW9uLgoKICAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBGRUFUVVJFICoqKgoKMDMvMTcvMjAwMjogYmVhemxleQogICAgICAgICAgICBTbWFsbCBjaGFuZ2UgdG8gdHlwZS1uYW1lIGhhbmRsaW5nIG9mIHVubmFtZWQgc3RydWN0dXJlcyBhbmQKICAgICAgICAgICAgdHlwZWRlZi4gIElmIGEgc3RydWN0dXJlIG9mIHRoaXMgZm9ybSBhcHBlYXJzOgoKICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgc3RydWN0IHsKICAgICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICB9IEZvbzsKCiAgICAgICAgICAgIFRoZW4gJ0ZvbycgaXMgdXNlZCBhcyB0aGUgcHJvcGVyIHR5cGVuYW1lIGZvciB0aGUgc3RydWN0dXJlLgogICAgICAgICAgICBGdXJ0aGVybW9yZSwgRm9vIGNhbiBub3cgYmUgdXNlZCBhcyBhIG5hbWUgaW4gQysrIGluaGVyaXRhbmNlLgogICAgICAgICAgICBTV0lHIHdhcyBhbHJlYWR5IGtpbmQgb2YgZG9pbmcgdGhpcywgYnV0IHRoaXMgbW9kaWZpY2F0aW9uIHJlZmluZXMKICAgICAgICAgICAgdGhlIGltcGxlbWVudGF0aW9uIHRvIG1vcmUgY2xvc2VseSBmb2xsb3cgdGhlIEMrKyBBUk0sIHNlY3Rpb24KICAgICAgICAgICAgNy4xLjMsIHAuIDEwNi4gIFRoaXMgZml4ZXMgYSBjb3VwbGUgb2Ygb2JzY3VyZSBjb3JuZXIgY2FzZXMuCgowMy8xNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1vZGlmaWVkIEMrKyBpbmhlcml0YW5jZSB3aXRoIGEgZmV3IGVuaGFuY2VtZW50cy4gIEZpcnN0LCB0eXBlIGluZm9ybWF0aW9uCiAgICAgICAgICAgIG5lZWRlZCBmb3IgY2FzdGluZyBhbmQgdHlwZS1lcXVpdmFsZW5jZSBpcyBnZW5lcmF0ZWQgZXZlbiB3aGVuIGJhc2UtY2xhc3NlcwogICAgICAgICAgICBhcmVuJ3QgZGVmaW5lZCBpbiB0aGUgaW50ZXJmYWNlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIDogcHVibGljIEJhciAgeyAgICAvKiBCYXIgdW5zcGVjaWZpZWQgKi8KICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgdm9pZCBibGFoKEJhciAqYik7CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSBibGFoKCkgZnVuY3Rpb24gc3RpbGwgYWNjZXB0cyBGb28gKiBldmVuIHRob3VnaCBub3RoaW5nCiAgICAgICAgICAgIGlzIHJlYWxseSBrbm93biBhYm91dCBCYXIuICAgUHJldmlvdXMgU1dJRyB2ZXJzaW9ucyB3b3VsZCBqdXN0IGdlbmVyYXRlCiAgICAgICAgICAgIGEgdHlwZSBlcnJvci4KCiAgICAgICAgICAgIEluaGVyaXRhbmNlIGhhcyBhbHNvIGJlZW4gbW9kaWZpZWQgdG8gd29yayB0aHJvdWdoIHR5cGVkZWYuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICB0eXBlZGVmIEJhciBPdGhlckJhcjsKICAgICAgICAgICAgICAgY2xhc3MgRm9vOiBwdWJsaWMgT3RoZXJCYXIgewogICAgICAgICAgICAgICB9CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSBiYXNlIGNsYXNzIG9mIE90aGVyQmFyIGlzIGNvcnJlY3RseSByZXNvbHZlZCBiYWNrIHRvCiAgICAgICAgICAgIEJhci4gICBUaGUgdXNlIG9mIHRoZSBuYW1lIE90aGVyQmFyIGlzIGxvc3QgaW4gdGhpcyByZXNvbHV0aW9uICh0aGUgd3JhcHBlcnMKICAgICAgICAgICAgd2lsbCBzaW1wbHkgdXNlIEJhciBpbnN0ZWFkIG9mIHRoZSB0eXBlZGVmIG5hbWUgT3RoZXJCYXIpLgogICAgICAgICAgIAowMy8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgICV0eXBlbWFwLCAlYXBwbHksIGFuZCByZWxhdGVkIGRpcmVjdGl2ZXMgY2FuIG5vdyBhcHBlYXIgaW5zaWRlCiAgICAgICAgICAgIGNsYXNzIGRlZmluaXRpb25zLiAgIAoKMDMvMTMvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHZhcmlldHkgb2YgcHJvYmxlbXMgcmVsYXRlZCB0byBjb21waWxpbmcgU1dJRyBvbiA2NC1iaXQKICAgICAgICAgICAgcGxhdGZvcm1zLgoKMDMvMTIvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggImlnbm9yZSIgYW5kICJpbiIgdHlwZW1hcHMuICBMb2NhbCB2YXJpYWJsZXMKICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoICJpbiIgd2VyZSBiZWluZyBhZGRlZCB0byB0aGUgd3JhcHBlciBmdW5jdGlvbiBldmVuCiAgICAgICAgICAgIHRob3VnaCB0aGV5IHdlcmUgbmV2ZXIgdXNlZC4gICBNb3N0bHkgaGFybWxlc3MsIGJ1dCBpdCB3b3VsZCBsZWFkCiAgICAgICAgICAgIHRvIGEgdmFyaWV0eSBvZiBjb21waWxhdGlvbiB3YXJuaW5ncy4KICAKMDMvMTIvMjAwMjogYmVhemxleQogICAgICAgICAgICBTb21lIGNoYW5nZXMgdG8gdGhlIGludGVybmFsIHR5cGUgc3lzdGVtIGFuZCBoYW5kbGluZyBvZiBuZXN0ZWQgQysrCiAgICAgICAgICAgIHR5cGVzLiAgIEluIHByZXZpb3VzIHZlcnNpb25zIG9mIFNXSUcsIGlmIHlvdSBoYWQgdGhlIGZvbGxvd2luZzoKCiAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICB0eXBlZGVmIGludCBCbGFoOwogICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgY2xhc3MgQmFyIDogcHVibGljIEZvbyB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgIHZvaWQgc29tZW1ldGhvZChCbGFoIHgpOwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGUgYXJndW1lbnQgdHlwZSBpbiBzb21lbWV0aG9kKCkgd291bGQgaW1wbGljaXRseSBiZSBzZXQgdG8gQmFyOjpCbGFoLgogICAgICAgICAgICBBbHRob3VnaCB0aGlzIGlzIHRlY2huaWNhbGx5IGFsbG93ZWQsIGl0IGJyZWFrcyB0eXBlbWFwcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgRm9vOjpCbGFoIHsgLi4uIH0KCiAgICAgICAgICAgIGRvZXNuJ3QgbWF0Y2ggbGlrZSB5b3UgZXhwZWN0LiAgIFRoaXMgaGFzIGJlZW4gY2hhbmdlZCBpbiBTV0lHLTEuMy4xMi4KICAgICAgICAgICAgTm93LCB0eXBlcyBhcmUgZXhwYW5kZWQgdXNpbmcgdGhlIGNsYXNzIGluIHdoaWNoIHRoZXkgd2VyZSBkZWZpbmVkLgogICAgICAgICAgICBTbywgdGhlIGFyZ3VtZW50IHR5cGUgaW4gc29tZW1ldGhvZCgpIHdpbGwgYmUgRm9vOjpCbGFoLS0tc2luY2UgdGhlCiAgICAgICAgICAgIHR5cGUgQmxhaCB3YXMgZGVmaW5lZCBpbiBGb28uCiAKMDMvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzb21lIHN1YnRsZSB0eXBlIHNjb3BpbmcgcHJvYmxlbXMgd2l0aCB0eXBlZGVmIGFuZCBDKysgY2xhc3Nlcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CiAKICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IEJsYWg7CiAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgZG91YmxlIEJsYWg7CiAgICAgICAgICAgICAgICAgICAgdm9pZCBmb28oQmxhaCB4LCA6OkJsYWggeSk7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KCjAzLzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgSGlnaGx5IGV4cGVyaW1lbnRhbCBjaGFuZ2UgdG8gaGFuZGxlIHZhcmlhYmxlIGxlbmd0aCBhcmd1bWVudHMuCiAgICAgICAgICAgIEZpcnN0LCB0aGVyZSBpcyBubyBwb3J0YWJsZSBvciByZWxpYWJsZSB3YXkgdG8gd3JhcAogICAgICAgICAgICBhIHZhcmFyZ3MgZnVuY3Rpb24gaW4gZnVsbCBnZW5lcmFsaXR5LiAgSG93ZXZlciwgeW91ICpjYW4qIGNoYW5nZQogICAgICAgICAgICB0aGUgZnVuY3Rpb24gc2lnbmF0dXJlIHVzaW5nICV2YXJhcmdzLgoKICAgICAgICAgICAgICAgJXZhcmFyZ3MoY2hhciAqKSBmcHJpbnRmOwogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgdm9pZCBmcHJpbnRmKEZJTEUgKmYsIGNoYXIgKmZtdCwgLi4uKTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIHZhcmlhYmxlIGxlbmd0aCBwYXJhbWV0ZXIgIi4uLiIgaXMKICAgICAgICAgICAgc2ltcGx5IHJlcGxhY2VkIGJ5IHRoZSBwYXJhbWV0ZXJzIGdpdmVuIGluICV2YXJhcmdzLiBUaGlzCiAgICAgICAgICAgIHJlc3VsdHMgaW4gYSBmdW5jdGlvbiBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICB2b2lkIGZwcmludGYoRklMRSAqZiwgY2hhciAqZm10LCBjaGFyICpzKTsKCiAgICAgICAgICAgIE1vcmUgdGhhbiBvbmUgYXJndW1lbnQgY2FuIGJlIHVzZWQgYW5kIGRlZmF1bHQgdmFsdWVzCiAgICAgICAgICAgIGNhbiBiZSBkZWZpbmVkLiAgRm9yIGV4YW1wbGUsIHRoaXMgY29kZSBzcGVjaWZpZXMgYQogICAgICAgICAgICBtYXhpbXVtIG9mIGZvdXIgYXJndW1lbnRzLgoKICAgICAgICAgICAgICAgJXZhcmFyZ3MoY2hhciAqeDEgPSAwLCBjaGFyICp4MiA9IDAsIGNoYXIgKngzID0gMCwgY2hhciAqeDQgPSAwKSBmcHJpbnRmOwogCiAgICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgTkVXIEZFQVRVUkUgKioqCiAKMDMvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBDaGFuZ2UgdG8gaGFuZGxpbmcgb2YgdmFyaWFibGUgbGVuZ3RoIGFyZ3VtZW50cy4gIHZhcmFyZ3MKICAgICAgICAgICAgaXMgbm93IGhhbmRsZWQgYXMgYSBwcm9wZXIgcGFyYW1ldGVyIGFuZCBpcyBwYXNzZWQgdG8gdGhlCiAgICAgICAgICAgIGNvZGUgZ2VuZXJhdG9yLiAgSG93ZXZlciwgaXQgc3RpbGwgY2FuJ3QgYmUgaGFuZGxlZCBjb3JyZWN0bHkKICAgICAgICAgICAgKGFuZCB3aWxsIGdlbmVyYXRlIGEgdHlwZW1hcCB3YXJuaW5nKS4gICBUaGlzIGNoYW5nZSBoYXMgYmVlbgogICAgICAgICAgICBtYWRlIHRvIGJldHRlciBpbmNvcnBvcmF0ZSB2YXJpYWJsZSBsZW5ndGggYXJndW1lbnRzIHdpdGggb3RoZXIKICAgICAgICAgICAgZGlyZWN0aXZlcyBzdWNoIGFzICVpZ25vcmUsICVyZW5hbWUsICVmZWF0dXJlLCBhbmQgc28gZm9ydGguCgowMy8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTIyNTU1IF0gU3ludGF4IGVycm9yIHBhcnNpbmcgImRlZmluZSIgY29uc3RydWN0LiBTV0lHCiAgICAgICAgICAgIGlzIGEgbGl0dGxlIG1vcmUgcmVzdHJpY3RpdmUgaW4gZGV0ZXJtaW5pbmcgI2RlZmluZSBzdGF0ZW1lbnRzCiAgICAgICAgICAgIHRoYXQgd2lsbCBiZSB3cmFwcGVkIGFzIGNvbnN0YW50cy4gIEFsc28gYWRkZWQgYSBiZXR0ZXIgcGFyc2VyCiAgICAgICAgICAgIGVycm9yIHJ1bGUgZm9yIGhhbmRsaW5nIGJhZCBjb25zdGFudHMuCgowMy8wOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEJ1ZyBmaXg6IENsYXNzZXMgcmVuYW1lZCB3aXRoICVyZW5hbWUgdGhhdCBhcmUgZGVyaXZlZCBmcm9tIAogICAgICAgICAgICBhbm90aGVyIGNsYXNzIGdlbmVyYXRlIG1vcmUgYXBwcm9wcmlhdGUgc2hhZG93IGNsYXNzIGNvZGUuCgowMy8wOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeGVkIFNGIFsgIzUyMzYzMiBdIGFuZCBbICM1MTMzMzUgXSBib3RoIHJlcG9ydGVkIGJ5IElzcmFlbCAKICAgICAgICAgICAgVGFubmVyLiBTdXBwb3J0IGZvciB0eXBlcyB0aGF0IGFyZSB1c2VkIHdoaWNoIGFyZSBpbiBhIHR5cGVkZWYuIFRoZQogICAgICAgICAgICBhcHByb3ByaWF0ZSBzaGFkb3cgY2xhc3MgbmFtZSBpcyBnZW5lcmF0ZWQuIEFsc28gZ2VuZXJhdGVkIGNvcnJlY3QKICAgICAgICAgICAgc2hhZG93IGNsYXNzbmFtZSB3aGVuIGEgdGVtcGxhdGVkIGNsYXNzIGlzIHVzZWQgd2l0aGluIGFub3RoZXIgCiAgICAgICAgICAgIHRlbXBsYXRlZCBjbGFzcy4gU2VlIHRoZSBjcHBfdHlwZWRlZi5pIHRlc3RjYXNlLgoKMDMvMDgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBCdWcgZml4OiBObyB0eXBlIHdhcyBnZW5lcmF0ZWQgaW4gc2hhZG93IGNsYXNzZXMgZm9yIHR5cGVzIAogICAgICAgICAgICB0aGF0IHdlcmVuJ3Qgd3JhcHBlZCBieSBTV0lHLiAgVGhlIHR5cGUgaXMgdHJlYXRlZCBhcyBhIHJhdyAKICAgICAgICAgICAgcG9pbnRlciwgaWUgbm8gc2hhZG93IGNsYXNzLgoKMDIvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBSZWZpbmVkIHRoZSBtYXRjaGluZyBhbGdvcml0aG0gdXNlZCBieSAlcmVuYW1lLCAlaWdub3JlLCBhbmQKICAgICAgICAgICAgJWZlYXR1cmUuICAgSWYgYSB0eXBlIHNpZ25hdHVyZSBpcyBzdXBwbGllZCwgaXQgbXVzdCBleGFjdGx5CiAgICAgICAgICAgIG1hdGNoIHRoYXQgdXNlZCBpbiB0aGUgZGVjbGFyYXRpb24tLS1pbmNsdWRpbmcgYW55IHVzZSBvZgogICAgICAgICAgICBjb25zdC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVyZW5hbWUoZm9vMSkgICBmb28oaW50KTsKICAgICAgICAgICAgICAgICVyZW5hbWUoYmFyMSkgICBiYXIoaW50KSBjb25zdDsKCiAgICAgICAgICAgICAgICBjbGFzcyBCbGFoIHsKICAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIHZvaWQgZm9vKGludCk7ICAgICAgIC8vIE1hdGNoZWQgLS0+IGZvbzEKICAgICAgICAgICAgICAgICAgICAgIHZvaWQgZm9vKGludCkgY29uc3Q7IC8vIE5vdCBtYXRjaGVkIAogICAgICAgICAgICAgICAgICAgICAgdm9pZCBiYXIoaW50KTsgICAgICAgLy8gTm90IG1hdGNoZWQKICAgICAgICAgICAgICAgICAgICAgIHZvaWQgYmFyKGludCkgY29uc3Q7IC8vIE1hdGNoZWQgLS0+IGJhcjEKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEluIHByZXZpb3VzIHZlcnNpb25zLCBhIG5vbi1jb25zdCBzcGVjaWZpY2F0aW9uIHdvdWxkIG1hdGNoCiAgICAgICAgICAgIGJvdGggdGhlIG5vbi1jb25zdCBhbmQgY29uc3QgZGVjbGFyYXRpb25zLiAgSG93ZXZlciwgdGhlIHdob2xlCiAgICAgICAgICAgIHBvaW50IG9mICVyZW5hbWUgYW5kIHJlbGF0ZWQgZGlyZWN0aXZlcyBpcyB0aGF0IHRoZXkgYmUgYWJsZQogICAgICAgICAgICB0byBwcmVjaXNlbHkgcGlucG9pbnQgZXhhY3QgZGVjbGFyYXRpb25zIGluIGFuIGludGVyZmFjZS4gIFRoaXMKICAgICAgICAgICAgZml4ZXMgdGhlIHByb2JsZW0uCgowMi8yMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFJld29ya2VkIHRoZSBoYW5kbGluZyBvZiBkZWZhdWx0IGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9ycy4KICAgICAgICAgICAgU1dJRyBub3cgbWFrZXMgYSBwcmVsaW1pbmFyeSBwYXNzIG92ZXIgdGhlIHBhcnNlIHRyZWUgdG8gZGlzY292ZXIKICAgICAgICAgICAgd2hpY2ggY2xhc3NlcyBzdXBwb3J0IGRlZmF1bHQgYWxsb2NhdGlvbi4gICBUaGlzIGZpeGVzIGEgbnVtYmVyCiAgICAgICAgICAgIG9mIHZlcnkgc3VidGxlIGlzc3VlcyBpbiBjb2RlIGdlbmVyYXRpb24gYW5kIGNhbGwvcmV0dXJuIGJ5IHZhbHVlLgoKMDIvMTgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEltcHJvdmVkIHN1cHBvcnQgb24gQ3lnd2luOiBQZXJsLCBQeXRob24sIFRjbCwgUnVieSBhbmQgSmF2YSBzaG91bGQKICAgICAgICAgICAgd29yayBvdXQgb2YgdGhlIGJveCwgYmFycmluZyB0aGUgcnVudGltZSBsaWJyYXJ5LiBSZW1vdmVkIGRsbHdyYXAgCiAgICAgICAgICAgIGFuZCByZXBsYWNlZCB3aXRoIG5ld2x5IHdvcmtpbmcgZ2NjIC1zaGFyZWQgaW5zdGVhZCBmb3IgQ3lnd2luLiAKICAgICAgICAgICAgQWxsIHRoaXMgd2lsbCByZXF1aXJlIHRoZSBuZXcgaW1wcm92ZWQgYmludXRpbHMgMjAwMTA4MDIgYW5kIGxhdGVyLAogICAgICAgICAgICBidXQgdGhlIGxhdGVzdCBDeWd3aW4gaXMgdXN1YWxseSB0aGUgYmVzdCByZWNvbW1lbmRhdGlvbi4KCjAyLzE1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc29tZSBwcm9ibGVtcyByZWxhdGVkIHRvIHdyYXBwaW5nIG9mIGdsb2JhbCB2YXJpYWJsZXMKICAgICAgICAgICAgYW5kIFBlcmwgc2hhZG93IGNsYXNzZXMuIFJlcG9ydGVkIGJ5IENoaWEtbGlhbmcgS2FvLgoKMDIvMTUvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIE1hZGUgYSBmaXggdG8gdGhlIGNvZGUgZ2VuZXJhdGlvbiBmb3IgQysrIGNsYXNzCiAgICAgICAgICAgIGNvbnN0cnVjdG9ycyBzbyB0aGF0IHdlIGdldCBib3RoIGEgIm5ldyIgc2luZ2xldG9uIG1ldGhvZAogICAgICAgICAgICBhbmQgYW4gImluaXRpYWxpemUiIGluc3RhbmNlIG1ldGhvZCBmb3IgZWFjaCBjbGFzcy4gVGhpcwogICAgICAgICAgICBjaGFuZ2UgZW5hYmxlcyBkZXZlbG9wZXJzIHRvIGRlcml2ZSBuZXcgUnVieSBjbGFzc2VzIGZyb20KICAgICAgICAgICAgU1dJRy13cmFwcGVkIEMrKyBjbGFzc2VzIGFuZCB0aGVuIG92ZXJyaWRlIHRoZWlyIGluaXRpYWxpemUKICAgICAgICAgICAgbWV0aG9kcyB0byBwcm92aWRlIHN1YmNsYXNzLXNwZWNpZmljIGluc3RhbmNlIGluaXRpYWxpemF0aW9uLgoKMDIvMTUvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIE1hc3NpdmUgZG9jdW1lbnRhdGlvbiB1cGRhdGUgZm9yIHRoZSBSdWJ5IG1vZHVsZSwKICAgICAgICAgICAgY29udHJpYnV0ZWQgYnkgQ3JhaWcgRmlsZXMuCgowMi8xNC8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQnVnIGZpeDogQW4gZXJyb3IgaW4gdGhlIFNXSUcgcnVudGltZSBzdXBwb3J0IGZvciBSdWJ5CiAgICAgICAgICAgIHdhcyBjYXVzaW5nIHNldmVyYWwgb2YgdGhlIGV4YW1wbGVzIHRvIGZhaWwuIFJlcG9ydGVkIGJ5CiAgICAgICAgICAgIFdpbGxpYW0gRnVsdG9uLgoKMDIvMTQvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEJ1ZyBmaXg6IEVudW1lcmF0aW9ucyBkZWZpbmVkIHdpdGhpbiBhIGNsYXNzIChzdWNoCiAgICAgICAgICAgIGFzIHRob3NlIHNlZW4gaW4gdGhlIEV4YW1wbGVzL3J1YnkvZW51bSBleGFtcGxlKSB3ZXJlIG5vdAogICAgICAgICAgICBiZWluZyBleHBvcnRlZCB3aXRoIHRoZSBjb3JyZWN0IG5hbWVzLiBSZXBvcnRlZCBieSBXaWxsaWFtCiAgICAgICAgICAgIEZ1bHRvbi4KCjAyLzEzLzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBhIHdhcm5pbmcgbWVzc2FnZSB3aGVuIHdlIHJ1biBhY3Jvc3Mgb3ZlcmxvYWRlZAogICAgICAgICAgICBjbGFzcyBjb25zdHJ1Y3RvcnMgZm9yIEMrKyBjb2RlLCB0aGF0IHRoaXMgaXMgY3VycmVudGx5IG5vdAogICAgICAgICAgICBzdXBwb3J0ZWQgKGV2ZW4gaWYgdGhlIG92ZXJsb2FkcyBoYXZlIGJlZW4gJXJlbmFtZWQpLiBGb3IgYW4KICAgICAgICAgICAgZXhhbXBsZSBvZiB3aGVyZSB0aGlzIGRvZXNuJ3Qgd29yaywgc2VlIEV4YW1wbGVzL3J1Ynkvb3BlcmF0b3IuCgowMi8xMy8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgYW4gImlnbm9yZWQiIHdhcm5pbmcgbWVzc2FnZSB3aGVuIHRoZSBwYXJzZXIgcnVucwogICAgICAgICAgICBhY3Jvc3MgYW4gb3BlcmF0b3IhPSgpIGRlY2xhcmF0aW9uIGZvciBDKysgY29kZS4KCjAyLzExLzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCB0aGUgImltcG9ydCIsICJpbXBvcnRfdGVtcGxhdGUiLCAib3BlcmF0b3IiIGFuZAogICAgICAgICAgICAidGVtcGxhdGUiIGV4YW1wbGVzLgoKMDIvMTEvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIG11bHRpLW1vZHVsZSBzdXBwb3J0LgoKMDIvMDkvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIHRoZSBtaXNzaW5nICIjZGVmaW5lIFNXSUdfTk9JTkNMVURFIiBhdCB0aGUgdG9wIG9mCiAgICAgICAgICAgIHRoZSB3cmFwcGVyIGNvZGUgd2hlbiB0aGUgJy1jJyBvcHRpb24gaXMgdXNlZC4KCjAyLzA5LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIENvcnJlY3RlZCBhIG1pbm9yIG9mZi1ieS1vbmUgZXJyb3IgZm9yIHRoZSBzaXplIG9mIHRoZQogICAgICAgICAgICBzd2lnX3R5cGVzW10gYXJyYXkgdGhhdCdzIGdlbmVyYXRlZCBpbiB0aGUgd3JhcHBlciBjb2RlLgoKMDIvMDgvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBTRiBbICM1MTUwNTggXSBXcm9uZyBjb2RlIGZvciBDKysgdGVtcGxhdGVzLgogICAgICAgICAgICBSZXBvcnRlZCBieSBJc3JhZWwgVGFsbGVyLgoKVmVyc2lvbiAxLjMuMTEgKEphbnVhcnkgMzEsIDIwMDIpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDEvMzAvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXggdG8gcGFzcy9yZXR1cm4gYnkgdmFsdWUgZm9yIEMrKyBvYmplY3RzIHRoYXQgZGVmaW5lCiAgICAgICAgICAgIG5vIGRlZmF1bHQgY29uc3RydWN0b3IuICBDaGFuZ2VzIHRvIHRoZSB0eXBlbWFwIHN5c3RlbQogICAgICAgICAgICBtYWRlIGl0IGltcG9zc2libGUgdG8gd3JhcCBDKysgb2JqZWN0cyB3aXRoIG5vIGRlZmF1bHQKICAgICAgICAgICAgY29uc3RydWN0b3IuICAgVGhpcyBoYXMgYmVlbiBmaXhlZCwgYnV0IHRoZSBzb2x1dGlvbiAKICAgICAgICAgICAgaW52b2x2ZXMgc29tZSBjbGV2ZXIgdGVtcGxhdGUgbWFnaWMgY29udHJpYnV0ZWQgYnkgCiAgICAgICAgICAgIFdpbGxpYW0gRnVsdG9uLiAgUGxlYXNlIHNlZSB0aGUgY29tbWVudHMgaW4gdGhlIGZpbGUKICAgICAgICAgICAgTGliL3N3aWcuc3dnIGZvciBmdXJ0aGVyIGRldGFpbHMuICBUaGlzIHNvbHV0aW9uIGlzCiAgICAgICAgICAgIGV4cGVyaW1lbnRhbCBhbmQgbWF5IGJlIHJlZmluZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4KCjAxLzMwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgR2xvYmFsIHZhcmlhYmxlcyBhbmQgbWVtYmVyIGRhdGEgb2YgdHlwZSAiY29uc3QgY2hhciAqIgogICAgICAgICAgICBjYW4gYmUgc2V0LCBidXQgdGhlIG9sZCB2YWx1ZSBpcyBzaWxlbnRseSBkaXNjYXJkZWQgd2l0aG91dAogICAgICAgICAgICBhbnkgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgIFRoaXMgbWF5IGdlbmVyYXRlIGEgbWVtb3J5IGxlYWsuCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIGlzIG5lZWRlZCB0byBtb3JlIHNhZmVseSBoYW5kbGUgdmFyaWFibGVzCiAgICAgICAgICAgIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmb28gPSAiSGVsbG8gV29ybGRcbiI7CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIGl0J3Mgbm90IHNhZmUgdG8gZnJlZSB0aGUgb2xkIHZhbHVlLiAgSG93ZXZlciwKICAgICAgICAgICAgU1dJRyBjYW4gZHluYW1pY2FsbHkgYWxsb2NhdGUgYSBuZXcgdmFsdWUgYW5kIG1ha2UgZm9vIHBvaW50CiAgICAgICAgICAgIHRvIGl0LiAgIFRvIGZpeCB0aGlzIG1lbW9yeSBsZWFrLCB5b3UgY2FuIHByb2JhYmx5IGRvIHRoaXM6CgogICAgICAgICAgICAgICAlY2xlYXIgY29uc3QgY2hhciAqZm9vOwogICAgICAgICAgICAgICAlYXBwbHkgY2hhciAqIHtjb25zdCBjaGFyICpmb299OwoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgIAowMS8zMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFR3byBtaW5vciB0eXBlbWFwIGVuaGFuY2VtZW50cyBoYXZlIGJlZW4gYWRkZWQuICBGaXJzdCwKICAgICAgICAgICAgdHlwZW1hcHMgY2FuIGlzc3VlIGEgd2FybmluZyBtZXNzYWdlIGJ5IGluY2x1ZGluZyBhIHNwZWNpYWwKICAgICAgICAgICAgd2FybmluZyBhdHRyaWJ1dGUuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICV0eXBlbWFwKGluLHdhcm5pbmc9IkknbSBnb2luZyB0byBkbyBzb21ldGhpbmcgZGFuZ2Vyb3VzIikgLi4uCgogICAgICAgICAgICBUaGUgd2FybmluZyBtZXNzYWdlIHdpbGwgc2hvdyB1cCB3aGVuZXZlciB0aGUgdHlwZW1hcCBpcwogICAgICAgICAgICBhcHBsaWVkLgoKICAgICAgICAgICAgU2Vjb25kLCBhIHR5cGVtYXAgY2FuIGZvcmNlIGEgbm8tbWF0Y2ggYnkgZGVmaW5pbmcKCiAgICAgICAgICAgICAldHlwZW1hcChpbikgc29tZXR5cGUgInBhc3MiOwoKICAgICAgICAgICAgSWYgdGhpcyBpcyB1c2VkLCB0aGUgdHlwZW1hcCBzeXN0ZW0gd2lsbCAqbm90KiByZWNvcmQgYQogICAgICAgICAgICB0eXBlbWFwIG1hdGNoIGZvciAic29tZXR5cGUiLiAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gYmxvY2sKICAgICAgICAgICAgc2VsZWN0ZWQgdHlwZW1hcHMuICBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnRlZCB0byBkaXNhYmxlCiAgICAgICAgICAgIGEgdHlwZW1hcCBmZWF0dXJlIGZvciBzb21lIHR5cGUsIHlvdSBjb3VsZCBkbyB0aGlzLgoKICAgICAgICAgICAgICAgLy8gRG8gbm90IGFsbG93IGdsb2JhbCB2YXJpYWJsZXMgb2YgdHlwZSAnY29uc3QgY2hhciAqJyB0byBiZSBzZXQuCiAgICAgICAgICAgICAgICV0eXBlbWFwKHZhcmluKSBjb25zdCBjaGFyICogInBhc3MiOwoKICAgICAgICAgICAgSXQgbWlnaHQgYWxzbyBiZSBwb3NzaWJsZSB0byB1c2UgdGhpcyB0byBkbyBzdWJ0bGUgYW5kCiAgICAgICAgICAgIHN0cmFuZ2UgdGhpbmdzIHdpdGggdHlwZW1hcHMuICBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnRlZCB0bwogICAgICAgICAgICBtYWtlICdibGFoIConIGFuIG91dHB1dCB2YWx1ZSBhbmQgJ2NvbnN0IGJsYWggKicgYW4gaW5wdXQKICAgICAgICAgICAgcGFyYW1ldGVyLCB5b3UgbWlnaHQgZG8gdGhpczoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChpZ25vcmUpIGJsYWggKihibGFoIHRlbXApIHsKICAgICAgICAgICAgICAgICAgICAkMSA9ICZ0ZW1wOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJXR5cGVtYXAoYXJnb3V0KSBibGFoICogewogICAgICAgICAgICAgICAgICAgIC4uLiByZXR1cm4gYSB2YWx1ZSAuLi4KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qIEJsb2NrIHVucXVhbGlmaWVkIHR5cGVtYXBzIGRlZmluZWQgYWJvdmUgKi8KICAgICAgICAgICAgICAgICV0eXBlbWFwKGlnbm9yZSkgY29uc3QgYmxhaCAqICJwYXNzIjsKICAgICAgICAgICAgICAgICV0eXBlbWFwKGFyZ291dCkgY29uc3QgYmxhaCAqICJwYXNzIjsKICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSAgICAgY29uc3QgYmxhaCAqIHsKICAgICAgICAgICAgICAgICAgICAuLi4gZ2V0IGlucHV0IHZhbHVlIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgIChUaGlzIHBvdGVudGlhbCBhcHBsaWNhdGlvbnMgb2YgdHlwZW1hcHMgc3VnZ2VzdGVkIGJ5IEdyZWcgU3RlaW4pLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowMS8yOS8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gQnVnIGZpeDogTm8gZW51bWVyYXRpb25zIHdlcmUgd3JhcHBlZCB3aGVuIHRoZSAtc2hhZG93IAogICAgICAgICAgIGNvbW1hbmRsaW5lIG9wdGlvbiB3YXMgbm90IHNwZWNpZmllZC4gUmVwb3J0ZWQgYnkgSXNyYWVsIFRhbGxlci4KCjAxLzI4LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBHbG9iYWwgYXJyYXlzIGFyZSBzdWNjZXNzZnVsbHkgd3JhcHBlZC4gSW4gZmFjdCB0aGV5IHN0YXJ0ZWQKICAgICAgICAgICBtb3N0bHkgd29ya2luZyBpbiBTV0lHLTEuMy4xMC4KCjAxLzI4LzIwMDI6cmljaGFyZHAKCSAgIEFkZGVkIGZpcnN0IGF0dGVtcHQgYXQgQysrIGFuZCAtc2hhZG93IHN1cHBvcnQgZm9yIFBIUDQgbW9kdWxlLAoJICAgcGxlYXNlIHRlc3QgYW5kIG1haWwgbWUgaWYgYW55IHByb2JsZW1zL2lkZWFzIG9uIGltcHJvdmluZyBpdC4KCgkgICBUaGVyZSBpcyBhIGtub3duIHByb2JsZW0gd2l0aCB1bmluaXRpYWxpemVkIG1lbWJlciB2YXJpYWJsZXMsCgkgICBwbGVhc2Ugc2VlIEV4YW1wbGVzL3BocDQvc3luYy9SRUFETUUgZm9yIGRldGFpbHMuCgoJICAgQWxzbyBtb3JlIFBIUCBkb2N1bWVudGF0aW9uIGFkZGVkIHRvIERvYy9NYW51YWwvUGhwLmh0bWwKCjAxLzI3LzIwMDI6YmVhemxleQogICAgICAgICAgIFRoZSBBTlNJIEMgc2l6ZV90IHR5cGUgaXMgbm93IHJlY29nbml6ZWQgYXMgYW4gaW50ZWdlciBieSBkZWZhdWx0LgoKMDEvMjYvMjAwMjpiZWF6bGV5CiAgICAgICAgICAgbG9uZyBsb25nIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcgc3VwcG9ydCBhZGRlZCB0byBtYW55IGxhbmd1YWdlIG1vZHVsZXMuCiAgICAgICAgICAgVGhpcyBpcyBub3QgYSBwb3J0YWJsZSBmZWF0dXJlIGFuZCB3aWxsIHJlcXVpcmUgY29tcGlsZXIgc3VwcG9ydAogICAgICAgICAgIGZvciB0aGUgbG9uZyBsb25nIHR5cGUuICBJbiB0YXJnZXQgbGFuZ3VhZ2VzIHRoYXQgZG8gbm90IHN1cHBvcnQKICAgICAgICAgICBsb25nIGxvbmcgKGUuZy4sIFRjbCBhbmQgUGVybCksIG51bWJlcnMgYXJlIGNvbnZlcnRlZCB0byBhIHN0cmluZwogICAgICAgICAgIG9mIGRpZ2l0cy4gIFRoaXMgcHJldmVudHMgdGhlaXIgdXNlIGluIGFyaXRobWV0aWMgY2FsY3VsYXRpb25zLCBidXQKICAgICAgICAgICBzdGlsbCBhbGxvd3MgdmFsdWVzIHRvIGJlIHNldCBmcm9tIGEgc3RyaW5nLiAgCgogICAgICAgICAgIGxvbmcgbG9uZyBzdXBwb3J0IHJlcXVpcmVzIHRoZSB1c2Ugb2YgdGhlIHN0cnRvbGwoKSBhbmQgc3RydG91bGwoKQogICAgICAgICAgIGZ1bmN0aW9ucyBhcyB3ZWxsIGFzIHRoZSAnbGxkJyBhbmQgJ2xsdScgZm9ybWF0IHNwZWNpZmllcnMKICAgICAgICAgICBvZiBzcHJpbnRmKCkuCgowMS8yNi8yMDAyOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBbICM1MDE4MjcgXSBEZWxldGUgbWV0aG9kIGlzIG5vdCBjYWxsZWQuICAgVGhlIFRjbAogICAgICAgICAgIG1vZHVsZSB3YXNuJ3QgY29ycmVjdGx5IGNhbGxpbmcgZGVzdHJ1Y3RvcnMgd2hlbiB0aGV5CiAgICAgICAgICAgd2VyZSBkZWZpbmVkIHVzaW5nICVhZGRtZXRob2RzLiAgVGhpcyBoYXMgYmVlbiBmaXhlZC4KICAgICAgICAgICBSZXBvcnRlZCBieSBSZWluaGFyZCBGb2JiZS4KCjAxLzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICBCZXR0ZXIgc3VwcG9ydCBmb3IgbG9uZyBsb25nIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcuICBUeXBlbWFwcwogICAgICAgICAgIGhhdmUgYmVlbiBpbmNsdWRlZCBpbiBhIG51bWJlciBvZiBtb2R1bGVzIGZvciBoYW5kbGluZyB0aGVzZSB0eXBlcy4KICAgICAgICAgICBJbiBhZGRpdGlvbiwgdGhlIHBhcnNlciBoYXMgYmVlbiBtb2RpZmllZCB0byBhY2NlcHQgbG9uZyBsb25nCiAgICAgICAgICAgbGl0ZXJhbHMgc3VjaCBhcyAxMjM0TEwgYW5kIDEyMzRVTEwuCgowMS8yNy8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gQSBDIGNoYXJbXSBpcyBtYXBwZWQgdG8gYSBKYXZhIFN0cmluZyB3aGljaCBpcyB0aGUgZGVmYXVsdCAKICAgICAgICAgICBTV0lHIGhhbmRsaW5nIG9mIGNoYXJbXSBhbmQgY2hhciouIEl0IHVzZWQgdG8gYmUgbWFwcGVkIHRvIGJ5dGVbXS4gCiAgICAgICAgICAgTm90ZSB0aGF0IGEgQyBzaWduZWQgY2hhcltdIGFycmF5IGlzIG1hcHBlZCB0byBieXRlW10uCgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMDEvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgIEZpeGVkIGEgcHJvYmxlbSB3aXRoIHJldHVybi1ieS12YWx1ZSwgQysrLCBhbmQKICAgICAgICAgICBvYmplY3RzIHRoYXQgZGVmaW5lIG5vIGRlZmF1bHQgY29uc3RydWN0b3IuCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgSm9lbCBSZWVkLgoKMDEvMjUvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIE92ZXJoYXVsIG9mIHRoZSBKYXZhIG1vZHVsZS4gVGhlIEMgY29kZSBnZW5lcmF0aW9uIGlzIG5vdyAKICAgICAgICAgICBkb25lIGZyb20gdHlwZW1hcHMuCgowMS8yNC8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gU3VwcG9ydCBmb3IgYXJyYXlzIG9mIGVudW0gcG9pbnRlcnMKCjAxLzIwLzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBFcnJvciBjaGVja2luZyBmb3IgbnVsbCBKYXZhIG9iamVjdHMgYmVpbmcgcGFzc2VkIHRvIG5hdGl2ZSAKICAgICAgICAgICBmdW5jdGlvbnMuICBFeGNlcHRpb24gdGhyb3duIG5vdyB3aGVyZWFzIGJlZm9yZSB0aGUgSlZNIGNyYXNoZWQuCgowMS8xOC8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gQ29ycmVjdGVkIGJlaGF2aW91ciBmb3IgZnVuY3Rpb25zIHRoYXQgdGFrZSBhcnJheXMuIEZvciAKICAgICAgICAgICBleGFtcGxlLCB3aGVuIHRoaXMgYyBmdW5jdGlvbjogCgogICAgICAgICAgIHZvaWQgYXJyYXlmbihpbnQgYXJyYXlbXSk7CiAgICAgICAgICAgCiAgICAgICAgICAgaXMgd3JhcHBlZCB0aGUgY29ycmVzcG9uZGluZyBuYXRpdmUgZnVuY3Rpb24KCiAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBuYXRpdmUgdm9pZCBhcnJheWZuKGludFtdIGFycmF5KTsKCiAgICAgICAgICAgaXMgcHJvZHVjZWQuIFByZXZpb3VzbHkgaWYgdGhlIEMgZnVuY3Rpb24gbWFkZSBhbnkgY2hhbmdlcyB0byB0aGUgCiAgICAgICAgICAgYXJyYXkgZWxlbWVudHMsIHRoZXNlIHdlcmUgbm90IHJlZmxlY3RlZCBiYWNrIGludG8gdGhlIEphdmEgYXJyYXkuIAogICAgICAgICAgIFRoaXMgaGFzIG5vdyBiZWVuIGNvcnJlY3RlZCBzbyB0aGF0IHRoZSBjaGFuZ2VzIGFyZSBwcm9wb2dhdGVkIGJhY2sKICAgICAgICAgICB0byBKYXZhIGFuZCB0aGUgY2FsbGluZyBmdW5jdGlvbiB3aWxsIHNlZSB0aGVzZSBjaGFuZ2VzLiBUaGlzIGlzIAogICAgICAgICAgIGhvdyBwdXJlIEphdmEgZnVuY3Rpb25zIHdvcmssIGllIGFycmF5cyBhcmUgcGFzc2VkIGJ5IHJlZmVyZW5jZS4KCjAxLzE1LzIwMDI6bWtvZXBwZQogICAgICAgICAgIFtHdWlsZV0gTmV3IGZpbGUgY3BsdXNwbHVzLmkgd2l0aCBDKysgdHlwZW1hcHMgY29udHJpYnV0ZWQKICAgICAgICAgICBieSBNYXJjaW8gTHVpcyBUZWl4ZWlyYSA8bWFyY2lvdEBob2xseS5jb2xvc3RhdGUuZWR1Pi4KCjAxLzExLzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBDaGFuZ2VkIG1hcHBpbmcgb2YgQyBsb25nIHRvIEphdmEgdHlwZS4gV2FzIG1hcHBlZCB0byBKYXZhCiAgICAgICAgICAgbG9uZywgbm93IG1hcHBlZCB0byBKYXZhIGludC4gSWYgeW91IHdhbnQgdGhlIHByZXZpb3VzIG1hcHBpbmcgdG8gCiAgICAgICAgICAgSmF2YSBsb25nIHVzZSB0aGlzIGFwcHJvYWNoIGluIHlvdXIgaW50ZXJmYWNlIGZpbGU6CiAgICAgICAgICAgCiAgICAgICAgICAgICAlY2xlYXIgbG9uZzsKICAgICAgICAgICAgICV0eXBlbWFwKGpuaSkgbG9uZyAgICAgICAgICAgICAiamxvbmciCiAgICAgICAgICAgICAldHlwZW1hcChqdHlwZSkgbG9uZyAgICAgICAgICAgImxvbmciCiAgICAgICAgICAgICAldHlwZW1hcChqc3R5cGUpIGxvbmcgICAgICAgICAgImxvbmciCgogICAgICAgICAgICAgJWNsZWFyIGxvbmdbQU5ZXTsKICAgICAgICAgICAgICV0eXBlbWFwKGpuaSkgbG9uZ1tBTlldICAgICAgICAiamxvbmdBcnJheSIKICAgICAgICAgICAgICV0eXBlbWFwKGp0eXBlKSBsb25nW0FOWV0gICAgICAibG9uZ1tdIgogICAgICAgICAgICAgJXR5cGVtYXAoanN0eXBlKSBsb25nW0FOWV0gICAgICJsb25nW10iCiAgICAgICAgICAgICAldHlwZW1hcChpbikgbG9uZ1tBTlldICAgICAgICAge3dyaXRlIG1lIGZvciBhcnJheSBzdXBwb3J0fQogICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBsb25nW0FOWV0gICAgICAgIHt3cml0ZSBtZSBmb3IgYXJyYXkgc3VwcG9ydH0KICAgICAgICAgICAgICV0eXBlbWFwKGFyZ291dCkgbG9uZ1tBTlldICAgICB7d3JpdGUgbWUgZm9yIGFycmF5IHN1cHBvcnR9CiAgICAgICAgICAgICAldHlwZW1hcChmcmVlYXJnKSBsb25nW0FOWV0gICAge3dyaXRlIG1lIGZvciBhcnJheSBzdXBwb3J0fQoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCiAgICAgICAgICAgVGhpcyBuZXcgbWFwcGluZyBpcyBtb3JlIGFwcHJvcHJpYXRlIHdoZW4gaW50ZXJmYWNpbmcgdG8gMzIgYml0IAogICAgICAgICAgIGFwcGxpY2F0aW9ucyB3aGljaCBhcmUgdXNlZCBpbiB0aGUgY3VycmVudCAzMi1iaXQgSlZNcy4gRm9yIGZ1dHVyZSAKICAgICAgICAgICA2NC1iaXQgSlZNcyB5b3UgbWF5IGhhdmUgdG8gY2hhbmdlIHRoZXNlIG1hcHBpbmdzIC0gZWcgb24gVW5peCBMUDY0IAogICAgICAgICAgIHN5c3RlbXMsIGJ1dCBub3Qgb24gTWljcm9zb2Z0IDY0Yml0IFdpbmRvd3Mgd2hpY2ggd2lsbCBiZSB1c2luZyBhIAogICAgICAgICAgIFA2NCBJTDMyIG1vZGVsLiBUaGlzIG1heSBiZSBhdXRvbWF0ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbiBvZiBTV0lHLgoKMDEvMTAvMjAwMjpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgWyA1MDE2NzcgXSAlaW5pdCBibG9jayBpbiB3cm9uZyBwbGFjZS4gUmVwb3J0ZWQKICAgICAgICAgICBieSBMdWlnaSBCYWxsYWJpby4KCjAxLzA5LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBEZWZhdWx0IHN1cHBvcnQgZm9yIHRoZSBsb25nIGxvbmcgdHlwZS4gc2lnbmVkIGxvbmcgbG9uZyBpcyAKICAgICAgICAgICBtYXBwZWQgdG8gYSBKYXZhIGxvbmcuIHVuc2lnbmVkIGxvbmcgbG9uZyBpcyBtYXBwZWQgdG8gQmlnSW50ZWdlci4KCjAxLzA5LzIwMDI6YmVhemxleQogICAgICAgICAgIEV4cGVyaW1lbnRhbCBjaGFuZ2UgdG8gcGFyc2VyIHRvIGJldHRlciBzdXBwb3J0IG1peGluZyBvZgogICAgICAgICAgIGludCwgbG9uZywgc2hvcnQsIHVuc2lnbmVkLCBmbG9hdCwgYW5kIGRvdWJsZS4gICBUaGUgcGFyc2VyCiAgICAgICAgICAgc2hvdWxkIG5vdyBzdXBwb3J0IHR5cGVzIGxpa2UgdGhpczoKICAgIAogICAgICAgICAgICAgICAgc2hvcnQgdW5zaWduZWQgaW50CiAgICAgICAgICAgICAgICBpbnQgICB1bnNpZ25lZCBzaG9ydAogICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgaW50CiAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2hvcnQKCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIGFsc28gZW5hYmxlcyBhIHR5cGUgb2YgJ2xvbmcgZG91YmxlJyAocHJldmlvdXNseQogICAgICAgICAgICB1bnN1cHBvcnRlZCkgdG8gYmUgdXNlZC4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDEvMDUvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIENhc3RpbmcgZml4IGZvciB3aGVuIGZ1bmN0aW9uIHJldHVybiB0eXBlIGlzIGEgcG9pbnRlciBhcyAKICAgICAgICAgICByZXBvcnRlZCBieSBHYXJ5IFBlbm5pbmd0b24gMjAwMi0wMS0wNS4gVGhlIHVwcGVyIDMyYml0cyBvZiB0aGUgCiAgICAgICAgICAgNjQgYml0IGpsb25nIHdpbGwgaGF2ZSBjb250YWluZWQganVuayBmb3IgMzJiaXQgcG9pbnRlcnMuCgowMS8wNS8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gQmV0dGVyIHBvaW50ZXIgaGFuZGxpbmcgaW4gSmF2YSBpcyBwb3NzaWJsZSBhcyB0aGUgCiAgICAgICAgICAgSU5QVVQsIE9VVFBVVCBhbmQgSU5PVVQgdHlwZW1hcHMgaGF2ZSBiZWVuIGFkZGVkIGludG8gdHlwZW1hcHMuaS4KCjAxLzA1LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSAkbnVsbCBjYW4gYmUgdXNlZCBpbiBpbnB1dCB0eXBlbWFwcyB0byByZXR1cm4gZWFybHkgZnJvbSBKTkkgCiAgICAgICAgICAgZnVuY3Rpb25zIHRoYXQgaGF2ZSBlaXRoZXIgdm9pZCBvciBhIG5vbi12b2lkIHJldHVybiB0eXBlLiBFeGFtcGxlOgoKICAgICAgICAgICAgICV0eXBlbWFwKGNoZWNrKSBpbnQgKiAleyAKICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgU1dJR19leGNlcHRpb24oU1dJR19JbmRleEVycm9yLCAiQXJyYXkgZWxlbWVudCBlcnJvciIpOwogICAgICAgICAgICAgICAgIHJldHVybiAkbnVsbDsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgJX0KCiAgICAgICAgICAgSWYgdGhlIHR5cGVtYXAgZ2V0cyBwdXQgaW50byBhIGZ1bmN0aW9uIHdpdGggdm9pZCBhcyByZXR1cm4sICRudWxsIAogICAgICAgICAgIHdpbGwgZXhwYW5kIHRvIG5vdGhpbmc6CgogICAgICAgICAgICAgdm9pZCBqbmlfZm4oLi4uKSB7CiAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgICBTV0lHX2V4Y2VwdGlvbihTV0lHX0luZGV4RXJyb3IsICJBcnJheSBlbGVtZW50IGVycm9yIik7CiAgICAgICAgICAgICAgICAgICByZXR1cm4gOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICB9CgogICAgICAgICAgIG90aGVyd2lzZSAkbnVsbCBleHBhbmRzIHRvIHplcm8sIHdoZXJlIGphdmFyZXR1cm50eXBlIGlzIGVpdGhlciBhIAogICAgICAgICAgIHBvaW50ZXIgb3IgYSBwcmltaXRpdmUgdHlwZToKCiAgICAgICAgICAgICBqYXZhcmV0dXJudHlwZSBqbmlfZm4oLi4uKSB7CiAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgICBTV0lHX2V4Y2VwdGlvbihTV0lHX0luZGV4RXJyb3IsICJBcnJheSBlbGVtZW50IGVycm9yIik7CiAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgfQoKMDEvMDIvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIFRoZSBKYXZhIG1vZHVsZSBpbmNvcnJlY3RseSB1c2VkIGFyZ291dCB0eXBlbWFwcyBmb3IgCiAgICAgICAgICAgc3RyaW5ncy4gVGhpcyBpcyBub3cgY29ycmVjdGVkIGFuZCB0aGUgY29kZSBub3cgcmVzaWRlcwogICAgICAgICAgIGluIHRoZSBmcmVlYXJnIHR5cGVtYXAuIFRoZSBhcmdvdXQgYXJyYXkgdHlwZW1hcHMgaGF2ZSBiZWVuIHNwbGl0IGludG8gCiAgICAgICAgICAgYXJnb3V0IGFuZCBmcmVlYXJnIHR5cGVtYXBzLiBUaGlzIGNvcnJlY3Rpb24gbWF5IHJlcXVpcmUgc29tZSB1c2VyIAogICAgICAgICAgIHdyaXR0ZW4gdHlwZW1hcHMgdG8gYmUgbW9kaWZpZWQuIAogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTIvMjgvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIE11bHRpIHR5cGVtYXBzIG5vdyB3b3JraW5nIGZvciBKYXZhIHNlZSBtdWx0aW1hcCBleGFtcGxlLgogICAgICAgICAgIFtKYXZhXSBGaXggZm9yIHJlY2VudGx5IGludHJvZHVjZWQgYnVnIC0gZnJlZWFyZyB0eXBlbWFwIGNvZGUgd2FzIGFwcGVhcmluZwogICAgICAgICAgIGJlZm9yZSB0aGUgZnVuY3Rpb24gY2FsbC4KCjEyLzI4LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBKQ0FMTCBtYWNybyBmb3IgSk5JIGNhbGxzIHRoYXQgd29yayBpbiBib3RoIEMgYW5kIEMrKyB0eXBlbWFwcwogICAgICAgICAgIGhhdmUgYmVlbiByZXBsYWNlZCB3aXRoIEpDQUxMMCwgSkNBTEwxLCBKQ0FMTDIsIEpDQUxMMyBhbmQgSkNBTEw0IAogICAgICAgICAgIG1hY3Jvcy4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEyLzIyLzIwMDE6YmVhemxleQogICAgICAgICAgIFJlc29sdmVkIHNvbWUgaW5jb25zaXN0ZW50IGJlaGF2aW9yIHdpdGggJXJlbmFtZSBhbmQgY2xhc3MgcmVuYW1pbmcuCiAgICAgICAgICAgSWYgeW91IHNwZWNpZnkgdGhlIGZvbGxvd2luZzoKIAogICAgICAgICAgICAgICAlcmVuYW1lKEZvbykgIEJhcjsKCiAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICBCYXIoKTsKICAgICAgICAgICAgICAgICAgICB+QmFyKCk7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgVGhlbiB0aGUgJXJlbmFtZSBkaXJlY3RpdmUgYXBwbGllcyB0byB0aGUgY2xhc3MgaXRzZWxmLCB0aGUgY29uc3RydWN0b3IsCiAgICAgICAgICAgYW5kIHRoZSBkZXN0cnVjdG9yIChhbGwgd2lsbCBiZSByZW5hbWVkIHRvIEZvbykuCgogICAgICAgICAgIElmIGEgY2xhc3MgZGVmaW5lcyBtb3JlIHRoYW4gb25lIGNvbnN0cnVjdG9yLCB0aGUgb3ZlcmxvYWRlZCB2YXJpYW50cwogICAgICAgICAgIGNhbiBzdGlsbCBiZSByZW5hbWVkIGJ5IHNwZWNpZnlpbmcgcGFyYW1ldGVycyB0byAlcmVuYW1lLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAlcmVuYW1lKEJhcl9jb3B5KSBCYXIoQmFyICYpOwogICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIEJhcigpOwogICAgICAgICAgICAgICAgICAgICBCYXIoQmFyICYpOwogICAgICAgICAgICAgICAgICAgIH5CYXIoKTsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgVGhlcmUgYXJlIHN0aWxsIHNvbWUgb2RkIGNvcm5lciBjYXNlcy4gIElmIHlvdSBzcGVjaWZ5CgogICAgICAgICAgICAgICAlcmVuYW1lKEZvbykgOjpCYXI7CgogICAgICAgICAgIHRoZW4gb25seSB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgaXMgY2hhbmdlZCBhbmQgdGhlIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IKICAgICAgICAgICBuYW1lcyBhcmUgbGVmdCB1bm1vZGlmaWVkLiAgSWYgeW91IHNwZWNpZnkgCgogICAgICAgICAgICAgICAlcmVuYW1lKEZvbykgKjo6QmFyOwoKICAgICAgICAgICB0aGVuIHRoZSBuYW1lcyBvZiB0aGUgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciBmdW5jdGlvbnMgYXJlIG1vZGlmaWVkIGJ1dAogICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBpcyBub3QuCgoxMi8yMS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gam5pLCBqdHlwZSBhbmQganN0eXBlIHR5cGVtYXBzIG5vIGxvbmdlciBoYXJkY29kZWQgYnV0IHJlYWwgCiAgICAgICAgICAgdHlwZW1hcHMuIE5ldyB2YXJpYWJsZSBzdWJzdGl0dXRpb24sICRqYXZhY2xhc3NuYW1lLCBjYW4gYmUgdXNlZCBpbgogICAgICAgICAgIHRoZSBqc3R5cGUgdHlwZW1hcHMuIEl0IGlzIHJlcGxhY2VkIHdpdGggdGhlIEphdmEgc2hhZG93IGNsYXNzIG5hbWUKICAgICAgICAgICB3aGVyZSBhcHBsaWNhYmxlLgogICAgICAgICAgIFtKYXZhXSBGaXggZm9yIHJlY2VudGx5IGludHJvZHVjZWQgYnVnIHRvIGRvIHdpdGggaW5oZXJpdGFuY2Ugd2hlbiAKICAgICAgICAgICB1c2luZyAlaW1wb3J0LgogICAgICAgICAgIFtKYXZhXSBBIGZldyBtb3JlIGJ1ZyBmaXhlcywgdG9kbyB3aXRoICVyZW5hbWUgYW5kIHVzaW5nIHRoZSBraW5kCiAgICAgICAgICAgd2l0aCB0aGUgdHlwZSwgZWcgCiAgICAgICAgICAgdm9pZCBmbih1bmlvbiB1bmkgbXl1bmksIHN0cnVjdCBzdHIgbXlzdHIsIGNsYXNzIGNsIG15Y2wpOwoKMTIvMjAvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgWyAjNDk0NTI0IF0gUHJlcHJvY2Vzc29yIGJ1ZyAtIGFwb3N0cm9waGUgYW5kICNzdWJzdC4KCjEyLzIwLzIwMDE6YmVhemxleQogICAgICAgICAgIEFkZGVkIFNXSUdfVkVSU0lPTiBwcmVwcm9jZXNzb3Igc3ltYm9sLiAgIFRoaXMgaXMgYSBoZXhhZGVjaW1hbAogICAgICAgICAgIGludGVnZXIgc3VjaCBhcyAweDAxMDMxMSAoY29ycmVzcG9uZGluZyB0byBTV0lHLTEuMy4xMSkuICBUaGlzIGNhbgogICAgICAgICAgIGJlIHVzZWQgaW4gdGhlIGludGVyZmFjZSBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgI2lmIFNXSUdfVkVSU0lPTiA+PSAweDAxMDMxMQogICAgICAgICAgICAgICAvKiBVc2Ugc29tZSBmYW5jeSBuZXcgZmVhdHVyZSAqLwogICAgICAgICAgICAgICAjZW5kaWYKCiAgICAgICAgICAgTm90ZTogVGhlIHZlcnNpb24gc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGluIHRoZSBnZW5lcmF0ZWQgU1dJRwogICAgICAgICAgIHdyYXBwZXIgZmlsZS4KCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTIvMjAvMjAwMTpta29lcHBlCgkgICBbTXpTY2hlbWVdOiBSZW5hbWVkIG16c3dpZ19tYWtlX2Jvb2xlYW4gdG8KCSAgIHN3aWdfbWFrZV9ib29sZWFuLCBhcyB0aGUgbGF0dGVyIGlzIHVzZWQgaW4gdGhlIHR5cGVtYXBzLgoJICAgUmVwb3J0ZWQgYnkgTHVpZ2kgQmFsbGFiaW8uCgoxMi8xNy8yMDAxOm1rb2VwcGUKCSAgIFtHdWlsZV06IFJld3JvdGUgbGlzdC12ZWN0b3IuaSB1c2luZyBtdWx0aS1kaXNwYXRjaAoJICAgdHlwZW1hcHMuICBVcGRhdGVkIHBvaW50ZXItaW4tb3V0LmkuICBNYWtlIHRoZQoJICAgZGVwcmVjYXRlZCB0eXBlbWFwLXN1YnN0aXR1dGlvbiBvZiAiJHNvdXJjZSIgaW4gImFyZ291dCIKCSAgIHdvcmsgYXMgYmVmb3JlLgoKMTIvMTYvMjAwMTpta29lcHBlCgkgICBbR3VpbGVdOiBGaXhlZCBtYWNyb3MgJXZhbHVlc19hc19saXN0LCAldmFsdWVzX2FzX3ZlY3RvciwKCSAgICVtdWx0aXBsZV92YWx1ZXMgdG8gdXNlIHRoZSBwcm9wZXIgJXByYWdtYSBzeW50YXguICBOZXcKCSAgIEd1aWxlIGV4YW1wbGUvdGVzdCAibXVsdGl2YWx1ZSI7IG5ldyBHdWlsZSBydW4tdGVzdCBmb3IKCSAgIHRlc3Qtc3VpdGUgaXRlbSAibGlzdC12ZWN0b3IiIChjdXJyZW50bHkgYnJva2VuKS4KCjEyLzE0LzIwMDE6bWtvZXBwZQoJICAgW0d1aWxlXTogRml4ZWQgdHlwZW1hcC1zdWJzdGl0aW9uIGJ1ZyBmb3IgInZhcmluIi4gIFJlbGF4ZWQKCSAgIHZhbGlkLWlkZW50aWZpZXIgY2hlY2sgdG8gYWxsb3cgYWxsIFI1UlMgaWRlbnRpZmllcnMuCgoKVmVyc2lvbiAxLjMuMTAgKERlY2VtYmVyIDEwLCAyMDAxKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMi8wOC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBNb2RpZmllZCAldHlwZW1hcCBzbyB0aGF0ICV7IC4uLiAlfSBjYW4gYWxzbyBiZSB1c2VkIGFzIGEKICAgICAgICAgICBjb2RlIGJsb2NrIChtb3N0bHkgZm9yIGNvbXBsZXRlbmVzcykuICBGb3IgZXhhbXBsZToKIAogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBibGFoICV7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgVGhpcyBmb3JtIGRvZXMgbm90IGludHJvZHVjZSBhIG5ldyBibG9jayBzY29wZS4gIEFsc28sIHRoZQogICAgICAgICAgIGNvZGUgZW5jbG9zZWQgaW4gJXsgLi4uICV9IGlzIG5vdCBwcm9jZXNzZWQgYnkgdGhlIHByZXByb2Nlc3Nvci4KCjEyLzA4LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFsgIzQ1OTYxNCBdIFNXSUcgd2l0aCBtdWx0aXBsZSBUQ0wgaW50ZXJwcmV0ZXJzLgoKMTIvMDgvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgWyAjNDE3MTQxIF0gcnVieWRlYy5zd2cgaXMgd3JvbmcKICAgICAgICAgICBSZXBvcnRlZCBieSBQYXVsIEJyYW5uYW4uCgoxMi8wOC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBbICM0MTA1NTcgXSBQcm9ibGVtIHdpdGggJWFkZG1ldGhvZHMgb24gTlQuCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgTWFnbnVzIExqdW5nLgoKMTIvMDgvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgWyAjNDQ1MjMzIF0gRW5oYW5jZW1lbnQ6IGhhbmRsZSBhY2Nlc3MgY2hhbmdlLgogICAgICAgICAgIFNXSUcgbm93IHBhcnNlcyAoYnV0IGlnbm9yZXMpIEMrKyBhY2Nlc3MgY2hhbmdlcyBmb3IgdGhlCiAgICAgICAgICAgdGhlIGZvbGxvd2luZzoKCiAgICAgICAgICAgICBjbGFzcyBBIHsKICAgICAgICAgICAgIHByb3RlY3RlZDoKICAgICAgICAgICAgICAgIHZvaWQgc29tZXRoaW5nKCkgeyB9CiAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICBBKCkge30KICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgY2xhc3MgQiA6IHByaXZhdGUgQSB7CiAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICBCKCkgOiBBKCkgeyB9CiAgICAgICAgICAgICBwcm90ZWN0ZWQ6CiAgICAgICAgICAgICAgICBBOjpzb21ldGhpbmc7ICAgIDwtLS0tIFBhcnNlZCwgYnV0IGlnbm9yZWQKICAgICAgICAgICAgIH07CiAKICAgICAgICAgICBTdWdnZXN0ZWQgYnkgS3J6eXN6dG9mIEtvem1pbnNraS4KCjEyLzA4LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIEZpeCBmb3IgUnVieSB0byB3b3JrIHVzaW5nIFZpc3VhbCBDKysuCgoxMi8wNi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBbICM0NjU2ODcgXSB1bnNpZ25lZCBzaG9ydCBwYXJhbWV0ZXJzIGZhaWwuCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgR2VyYWxkIFdpbGxpYW1zLgoKMTIvMDYvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgWyAjNDg5NTk0IF0gUHlTdHJpbmdfRnJvbVN0cmluZyBjYW4ndCB0YWtlIE5VTEwgYXJnLgogICAgICAgICAgIFJlcG9ydGVkIGJ5IEpvaG4gTWVycml0dC4gICBTV0lHIG5vdyBjb252ZXJ0cyBzdHJpbmcgdmFsdWVzCiAgICAgICAgICAgdG8gUHl0aG9uIHVzaW5nIGNvZGUgbGlrZSB0aGlzOgoKICAgICAgICAgICByZXN1bHRvYmogPSByZXN1bHQgPyBQeVN0cmluZ19Gcm9tU3RyaW5nKHJlc3VsdCkgOiBQeV9CdWlsZFZhbHVlKCIiKTsKCjEyLzA2LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIFsgIzQ2MzU2MSBdIFR5cGUgY29udmVyc2lvbnMgbm90IGdlbmVyYXRlZC4KICAgICAgICAgICBSZXBvcnRlZCBieSBHZXJhbGQgV2lsbGlhbXMuCgkKMTIvMDQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgWyAjNDcwMjE3IF0gVGNsIGRlZmF1bHQgYXJndW1lbnQgaGFuZGxpbmcuCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgU2hhdW4gTG93cnkuCgoxMi8wNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBbICM0NzIwODggXSBkZWZpbmVkKE1BQ1JPKSBleHBhbmRlZCBldmVyeXdoZXJlLgogICAgICAgICAgIEVtYmVkZGVkIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzIHN1Y2ggYXMKCiAgICAgICAgICAgICAgJSNpZiBkZWZpbmVkKEZPTykKCiAgICAgICAgICAgYXJlIG5vdCBleHBhbmRlZCBieSB0aGUgU1dJRyBwcmVwcm9jZXNzb3IuCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgR2VyYWxkIFdpbGxpYW1zLgoKMTIvMDQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgWyAjNDc2NDY3IF0gUHJvYmxlbXMgd2l0aCAjZGVmaW5lICYgY29tbWFzLgoKMTIvMDQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgWyAjNDc3NTQ3IF0gd3JvbmcgZGVjbGFyYXRpb24gb2YgcG9pbnRlciBmdW5jdGlvbnMuCiAgICAgICAgICAgQmFkIHByb3RvdHlwZXMgaW4gTGliL3RjbC9wdHJsYW5nLmkuCgoxMi8wNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBbICM0ODMxODIgXSBDb25zdGFudHMgY2FuIHRha2UgYXJncyBieSBtaXN0YWtlLiAKICAgICAgICAgICBXaGVuIHN3aWcgLXBlcmw1IC1jb25zdCBpcyB1c2VkLCBjb25zdGFudHMgYXJlIGRlY2xhcmVkCiAgICAgICAgICAgd2l0aCBhIHZvaWQgcHJvdG90eXBlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgc3ViIElDT05TVCAoKSB7ICRleGFtcGxlYzo6SUNPTlNUIH0KCiAgICAgICAgICAgUGF0Y2ggc3VibWl0dGVkIGJ5IFJpY2ggV2FsZXMuCgoxMi8wMy8yMDAxOmJlYXpsZXkKICAgICAgICAgICBOZXcgJWV4Y2VwdGlvbiBkaXJlY3RpdmUuICAgVGhpcyBpcyBpbnRlbmRlZCB0byByZXBsYWNlICVleGNlcHQuCiAgICAgICAgICAgSXQgd29ya3MgaW4gZXhhY3RseSB0aGUgc2FtZSBtYW5uZXIgZXhjZXB0IGl0IGRvZXMgbm90IGFjY2VwdCBhIAogICAgICAgICAgIGxhbmd1YWdlIHNwZWNpZmllci4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAlZXhjZXB0aW9uIHsKICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAkYWN0aW9uCiAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICAgY2F0Y2goU29tZUVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IKICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAlZXhjZXB0aW9uIGlzIGFsc28gbmFtZSBhd2FyZS0tLWFsbG93aW5nIGl0IHRvIGJlIGFwcGxpZWQgdG8KICAgICAgICAgICBzcGVjaWZpYyBkZWNsYXJhdGlvbnMgaW4gYW4gaW50ZXJmYWNlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVleGNlcHRpb24gZm9vIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiBmb3IgYW55IGZ1bmN0aW9uL21ldGhvZCBmb28KICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAlZXhjZXB0aW9uIEZvbzo6YmFyIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiBmb3IgbWV0aG9kIGJhciBpbiBjbGFzcyBGb28KICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgJWV4Y2VwdGlvbiBGb286OmJhcihkb3VibGUpIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiBmb3IgbWV0aG9kIGJhcihkb3VibGUpIGluIGNsYXNzIEZvbwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9CgogICAgICAgICAgIFRoZSBzZW1hbnRpY3Mgb2YgdGhpcyBuYW1lIG1hdGNoaW5nIGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgZm9yICVyZW5hbWUuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgIAoxMi8wMy8yMDAxOmJlYXpsZXkKICAgICAgICAgICBTdWJzdGFudGlhbCBjbGVhbnVwIG9mIHRoZSBQeXRob24gc2hhZG93IGNsYXNzIGNvZGUuICBTaGFkb3cgY2xhc3NlcwogICAgICAgICAgIHVzZWQgdG8gYmUgY3JlYXRlZCBpbiB0aGlzIHJhdGhlciBjb21wbGljYXRlZCBtYW5uZXIgaW52b2x2aW5nIGFib3V0CiAgICAgICAgICAgYSBoYWxmLWRvemVuIHN0cmluZ3MgY3JlYXRlZCBpbiBiaXRzIGFuZCBwaWVjZXMuICAgU2hhZG93IGNsYXNzZXMKICAgICAgICAgICBhcmUgbm93IGdlbmVyYXRlZCBpbiBhIG1vcmUgc3RyYWlnaHRmb3J3YXJkIG1hbm5lci0taW4gdGhlIHNhbWUKICAgICAgICAgICBvcmRlciB0aGF0IGFwcGVhcnMgaW4gdGhlIGludGVyZmFjZSBmaWxlLgoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICBUaGUgb3JkZXIgaW4gd2hpY2ggZGVjbGFyYXRpb25zIGFwcGVhciBpbiB0aGUgc2hhZG93IGZpbGUgbWF5IGRpZmZlci4KICAgICAgICAgICAKMTIvMDMvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgVGhlICVpbnNlcnQgZGlyZWN0aXZlICgleyAuLi4gJX0sICVydW50aW1lLCAlaGVhZGVyLCAld3JhcHBlciwgZXRjLikKICAgICAgICAgICBjYW4gbm93IGJlIHVzZWQgaW5zaWRlIG9mIGEgY2xhc3MgZGVmaW5pdGlvbi4gICBUaGlzIGhhcyBwb3RlbnRpYWwKICAgICAgICAgICB1c2VzIHdoZW4gZ2VuZXJhdGluZyBzaGFkb3cgY2xhc3MgY29kZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAlaW5zZXJ0KCJzaGFkb3ciKSAlewogICAgICAgICAgICAgICAgICMgU29tZSBweXRob24gY29kZQogICAgICAgICAgICAgICAgIGRlZiBibGFoKHNlbGYpOgogICAgICAgICAgICAgICAgICAgICAgcHJpbnQgIkknbSBibGFoISIKICAgICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICBUaGUgc3VwcG9ydCBmb3IgY2xhc3MgY29kZSBpbnNlcnRpb24gZGVwZW5kcyBvbiB0aGUgbGFuZ3VhZ2UgbW9kdWxlLgogICAgICAgICAgIEhvd2V2ZXIsIHRoZSBpbnRlbnQgb2YgdGhpcyBmZWF0dXJlIGlzIHRvIHNpbXBsaWZ5IHRoZSB0YXNrIG9mIGV4dGVuZGluZwogICAgICAgICAgIHNoYWRvdyBjbGFzcyBjb2RlLiAgIEluIHRoZSBQeXRob24gbW9kdWxlLCB0aGlzIGluc2VydHMgY29kZSB3aXRoIHRoZQogICAgICAgICAgIHByb3BlciBsZXZlbCBvZiBpbmRlbmRhdGlvbiAocmVnYXJkbGVzcyBvZiB3aGF0IHdhcyB1c2VkIGluIHRoZSBTV0lHCiAgICAgICAgICAgaW50ZXJmYWNlKS4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxMS8yOS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBNb2RpZmljYXRpb25zIGZvciBKYXZhIGFuZCBQeXRob24gbW9kdWxlcyB0byB3b3JrIG9uIGN5Z3dpbi4KICAgICAgICAgICBVbmZvcnR1bmF0ZWx5IGEgbG90IG9mIHRoZSBweXRob24gbW9kdWxlIGhhcyBzdGFydGVkIHRvIHByb2R1Y2VzIGNvZGUgCiAgICAgICAgICAgd2hpY2ggY2Fubm90IGJlIGF1dG8taW1wb3J0ZWQgdXNpbmcgY3lnd2luIGxpYnRvb2xzIHNvIG1vc3Qgb2YgaXQgaXMgCiAgICAgICAgICAgc3RpbGwgYnJva2VuLgoKMTEvMjgvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgVGhlICVyZW5hbWUgYW5kICVmZWF0dXJlIGRpcmVjdGl2ZSBjYW4gbm93IGJlIHVzZWQgaW5zaWRlCiAgICAgICAgICAgb2YgYSBjbGFzcyBkZWZpbml0aW9uLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICVyZW5hbWUoZm9vX2kpIGZvbyhpbnQpOwogICAgICAgICAgICAgICAgICVyZW5hbWUoZm9vX2QpIGZvbyhkb3VibGUpOwogICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIHZvaWQgZm9vKGludCk7CiAgICAgICAgICAgICAgICAgdm9pZCBmb28oZG91YmxlKTsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgIH07CgogICAgICAgICAgIFdoZW4gdXNlZCBpbiB0aGlzIG1hbm5lciwgdGhlICVyZW5hbWUgZGlyZWN0aXZlIG9ubHkgYXBwbGllcwogICAgICAgICAgIHRvIG1lbWJlcnMgb2YgdGhlIGNsYXNzIGluIHdoaWNoIGl0IGFwcGVhcnMgYXMgd2VsbCBhcyBhbGwKICAgICAgICAgICBkZXJpdmVkIGNsYXNzZXMuICBJbiBmYWN0LCB0aGlzIGlzIHJlYWxseSBqdXN0IHRoZSBzYW1lCiAgICAgICAgICAgYXMgc2F5aW5nOgoKICAgICAgICAgICAgICVyZW5hbWUoZm9vX2kpIEZvbzo6Zm9vKGludCk7CiAgICAgICAgICAgICAlcmVuYW1lKGZvb19kKSBGb286OmZvbyhkb3VibGUpOwogICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgfTsKCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTEvMjYvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgdGhlIGV4cGVyaW1lbnRhbCAlZmVhdHVyZSBkaXJlY3RpdmUuICAlZmVhdHVyZSBjYW4gYmUKICAgICAgICAgICB1c2VkIHRvIGF0dGFjaCBhcmJpdHJhcnkgc3RyaW5nIGF0dHJpYnV0ZXMgdG8gcGFyc2UgdHJlZSBub2Rlcy4KICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICVmZWF0dXJlKCJleGNlcHQiKSBibGFoIHsKICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAkZnVuY3Rpb24KICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgd2hhdGV2ZXI7ICAgICAgCiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgb3IKCiAgICAgICAgICAgICAgJWZlYXR1cmUoInNldCIpICo6Onhfc2V0ICJ4IjsKCiAgICAgICAgICAgb3IKCiAgICAgICAgICAgICAgJWZlYXR1cmUoImJsYWgiKSBGb286OmJhcihpbnQsZG91YmxlKSBjb25zdCAic3BhbSI7CgogICAgICAgICAgIFRoZSBzeW50YXggaXMgYm9ycm93ZWQgZnJvbSB0aGUgJXJlbmFtZSBkaXJlY3RpdmUuICBJbiBmYWN0LCB0aGUKICAgICAgICAgICBleGFjdCBzYW1lIHNlbWFudGljcyBhcHBseSAoaW5oZXJpdGFuY2UsIG1hdGNoaW5nLCBldGMuKS4KCiAgICAgICAgICAgJWZlYXR1cmUgaXMgYSB2ZXJ5IHBvd2VyZnVsIGxvdy1sZXZlbCBwcmltaXRpdmUgdGhhdCBjYW4gYmUgdXNlZCB0bwogICAgICAgICAgIGN1c3RvbWl6ZSBpbmRpdmlkdWFsIGxhbmd1YWdlIG1vZHVsZXMgYW5kIHRvIHByb3ZpZGUgaGludHMgdG8gCiAgICAgICAgICAgYW55IHN0YWdlIG9mIGNvZGUgZ2VuZXJhdGlvbi4gICBGZWF0dXJlcyBhcmUgYXR0YWNoZWQgdG8KICAgICAgICAgICBwYXJzZSB0cmVlIG5vZGVzIGFzIGF0dHJpYnV0ZXMgd2l0aCBuYW1lcyBsaWtlICJmZWF0dXJlOioiIHdoZXJlICogCiAgICAgICAgICAgaXMgcmVwbGFjZWQgYnkgdGhlIGZlYXR1cmUgbmFtZSAoZS5nLiwgImZlYXR1cmU6ZXhjZXB0IiwgImZlYXR1cmU6c2V0IiwgCiAgICAgICAgICAgZXRjLikuICAgTGFuZ3VhZ2UgbW9kdWxlcyBjYW4gdGhlbiBsb29rIGZvciB0aGUgZmVhdHVyZXMgdXNpbmcgCiAgICAgICAgICAgYSBzaW1wbGUgYXR0cmlidXRlIGxvb2t1cC4KCiAgICAgICAgICAgJWZlYXR1cmUgaXMgaW50ZW5kZWQgdG8gYmUgYSByZXBsYWNlbWVudCBmb3IgYSBudW1iZXIgb2YKICAgICAgICAgICBvbGRlciBTV0lHIGRpcmVjdGl2ZXMgaW5jbHVkaW5nICVleGNlcHQgYW5kIHNwZWNpYWxpemVkCiAgICAgICAgICAgcHJhZ21hcy4gSXQgaXMgbW9yZSBwb3dlcmZ1bCAoZHVlIHRvIGl0cyBwYXJhbWV0ZXJpemVkCiAgICAgICAgICAgbmFtZSBtYXRjaGluZykgYW5kIGl0IHByb3ZpZGVzIHZlcnkgcHJlY2lzZSBjb250cm9sIG92ZXIKICAgICAgICAgICBob3cgY3VzdG9taXphdGlvbiBmZWF0dXJlcyBhcmUgYXR0YWNoZWQgdG8gaW5kaXZpZHVhbAogICAgICAgICAgIGRlY2xhcmF0aW9ucy4gICBUaGVyZSBhcmUgZnV0dXJlIGV4cGFuc2lvbiBwbGFucyB0aGF0IHdpbGwKICAgICAgICAgICBidWlsZCB1cG9uIHRoaXMgY2FwYWJpbGl0eSBhcyB3ZWxsLgoKICAgICAgICAgICBJdCdzIG5vdCBjZXJ0YWluIHRoYXQgJWZlYXR1cmUgd2lsbCBldmVyIGJlIHVzZWQgZGlyZWN0bHkKICAgICAgICAgICBieSBTV0lHIHVzZXJzLiAgSW5zdGVhZCwgaXQgbWF5IGJlIGEgbG93LWxldmVsIHByaW1pdGl2ZQogICAgICAgICAgIHRoYXQgaXMgdXNlZCBpbiBoaWdoLWxldmVsIG1hY3JvIGRlZmluaXRpb25zLiAgRm9yIGluc3RhbmNlLAogICAgICAgICAgIHRvIHN1cHBvcnQgcHJvcGVydGllcywgeW91IG1pZ2h0IGRlZmluZSBhIG1hY3JvIGxpa2UgdGhpczoKCiAgICAgICAgICAgJWRlZmluZSAlcHJvcGVydHkobmFtZSwgc2V0ZiwgZ2V0ZikKICAgICAgICAgICAlZmVhdHVyZSgic2V0Iikgc2V0ZiAjbmFtZTsKICAgICAgICAgICAlZmVhdHVyZSgiZ2V0IikgZ2V0ZiAjbmFtZTsKICAgICAgICAgICAlZW5kZGVmCgogICAgICAgICAgIFdoaWNoIGFsbG93cyBhIHVzZXIgdG8gc3BlY2lmeSB0aGluZ3MgbGlrZSB0aGlzOgoKICAgICAgICAgICAlcHJvcGVydHkocCwgZ2V0X3AsIHNldF9wKTsKCiAgICAgICAgICAgY2xhc3MgQmxhaCB7CiAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgIGludCAgZ2V0X3AoKTsKICAgICAgICAgICAgICB2b2lkIHNldF9wKGludCk7CiAgICAgICAgICAgfTsKCiAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBORVcgRkVBVFVSRSAqKioKICAKMTEvMjQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgVGhlIFRjbCBtb2R1bGUgaGFzIGJlZW4gZXhwYW5kZWQgd2l0aCBzb21lIG5ldyBmZWF0dXJlcyBmb3IKICAgICAgICAgICBtYW5hZ2luZyBvYmplY3Qgb3duZXJzaGlwLiAgRm9yIGV4YW1wbGU6CiAgICAgICAgIAogICAgICAgICAgICAgICAgc2V0IGMgW0NpcmNsZSAtYXJncyAyMF0KICAgICAgICAgICAgICAgICRjIGFyZWEgICAgICAgICAgICAgIyBJbnZva2UgYSBtZXRob2QKICAgICAgICAgICAgICAgICRjIC1kaXNvd24gICAgICAgICAgIyBSZWxlYXNlcyBvd25lcnNoaXAgb2YgdGhlIG9iamVjdAogICAgICAgICAgICAgICAgJGMgLWFjcXVpcmUgICAgICAgICAjIEFjcXVpcmVzIG93bmVyc2hpcCBvZiB0aGUgb2JqZWN0CgogICAgICAgICAgIElmIFRjbCBvd25zIHRoZSBvYmplY3QsIGl0cyBkZXN0cnVjdG9yIGlzIGludm9rZWQgd2hlbiB0aGUgCiAgICAgICAgICAgY29ycmVzcG9uZGluZyBvYmplY3QgY29tbWFuZCBpcyBkZWxldGVkIGluIFRjbC4gIAoKICAgICAgICAgICBUbyBzaW1wbGlmeSB0aGUgZGVzdHJ1Y3Rpb24gb2Ygb2JqZWN0cywgdGhlIGZvbGxvd2luZyBzeW50YXgKICAgICAgICAgICBjYW4gYmUgdXNlZDoKCiAgICAgICAgICAgICAgICAkYyAtZGVsZXRlICAgICAgICAgIyBEZWxldGUgYW4gb2JqZWN0CgogICAgICAgICAgIFRoaXMgaXMgYW4gYWx0ZXJuYXRpdmUgZm9yIHRoZSBtb3JlIG9ic2N1cmUgdmFyaWFudCBvZiAKCiAgICAgICAgICAgICAgICByZW5hbWUgJGMge30KCiAgICAgICAgICAgVGhlc2UgZmVhdHVyZXMgYWxzbyBhZGQgZnVuY3Rpb25hbGl0eSBhdCB0aGUgQyBBUEkgbGV2ZWwuCiAgICAgICAgICAgVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgbWFuYWdlIG93bmVyc2hpcCBmcm9tIEMgYW5kCiAgICAgICAgICAgY2FuIGJlIHVzZWQgaW4gdHlwZW1hcHMuCgogICAgICAgICAgICAgICAgU1dJR19BY3F1aXJlKHZvaWQgKnB0cik7CiAgICAgICAgICAgICAgICBTV0lHX0Rpc293bih2b2lkICpwdHIpOwoKICAgICAgICAgICBBIG5ldyBmdW5jdGlvbiBmb3IgY29uc3RydWN0aW5nIGluc3RhbmNlcyBpcyBhbHNvIGF2YWlsYWJsZToKCiAgICAgICAgICAgICAgICBUY2xfT2JqICoKICAgICAgICAgICAgICAgIFNXSUdfTmV3SW5zdGFuY2VPYmooVGNsX0ludGVycCAqaW50ZXJwLCB2b2lkICpwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aWdfdHlwZV9pbmZvICp0eXBlLCBpbnQgb3duKTsKCiAgICAgICAgICAgV2hlbiB1c2VkIGluIGEgdHlwZW1hcCwgdGhpcyBjcmVhdGVzIGEgcG9pbnRlciBvYmplY3QgYW5kCiAgICAgICAgICAgYW4gaW50ZXJwcmV0ZXIgY29tbWFuZCB0aGF0IGNhbiBiZSB1c2VkIHRvIGlzc3VlIG1ldGhvZHMgYW5kCiAgICAgICAgICAgYWNjZXNzIGF0dHJpYnV0ZXMgYXMgc2hvd24gYWJvdmUuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgIAoxMS8yMy8yMDAxOmJlYXpsZXkKICAgICAgICAgICBBbGwgUHl0aG9uLXJlbGF0ZWQgJXByYWdtYSBvcGVyYXRpb25zIGhhdmUgYmVlbiBlbGltaW5hdGVkLgogICAgICAgICAgIE1vc3Qgb2YgdGhlc2Ugd2VyZSB3cml0dGVuIGZvciBvbGRlciBTV0lHIHZlcnNpb25zIGluIG9yZGVyIHRvCiAgICAgICAgICAgY29tcGVuc2F0ZSBmb3IgbGltaXRhdGlvbnMgaW4gZWFybGllciByZWxlYXNlcy4gIEluIGFuIGVmZm9ydAogICAgICAgICAgIHRvIHJlZHVjZSB0aGUgYW1vdW50IG9mIGNvZGUtY2x1dHRlciBhbmQgcG90ZW50aWFsIGZvciBlcnJvcnMsCiAgICAgICAgICAgaXQgaXMgZWFzaWVyIHRvIHNpbXBseSBlbGltaW5hdGUgdGhlIHByYWdtYXMgYW5kIHRvIHN0YXJ0IG92ZXIKICAgICAgICAgICAoaWYgbmVlZGVkKS4gIFRvIGJlIGhvbmVzdCwgSSdtIG5vdCBldmVuIHN1cmUgdGhlIHByYWdtYXMKICAgICAgICAgICB3b3JrZWQgaW4gMS4zLjkgYW5kIHJlY2VudCByZWxlYXNlcy4KCiAgICAgICAgICAgTm90ZTogSWYgeW91IG5lZWQgdG8gaW5zZXJ0IGNvZGUgaW50byB0aGUgc2hhZG93IGNsYXNzIGZpbGUKICAgICAgICAgICBjcmVhdGVkIGJ5IFNXSUcsIHNpbXBseSB1c2UgdGhlICVzaGFkb3cgZGlyZWN0aXZlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgJXNoYWRvdyAlewogICAgICAgICAgICAgIGRlZiBzb21lX3B5dGhvbl9jb2RlKCk6ICAgICAgICAgCiAgICAgICAgICAgICAgICAgIHByaW50ICJibGFoISIKICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjExLzIyLzIwMDE6YmVhemxleQogICAgICAgICAgIFN3ZWVwaW5nIGNoYW5nZXMgdG8gdGhlIHdheSBpbiB3aGljaCB0aGUgUHl0aG9uIG1vZHVsZSBoYW5kbGVzCiAgICAgICAgICAgc2hhZG93IGNsYXNzZXMuICAgSW4gZWFybHkgaW1wbGVtZW50YXRpb25zLCBzaGFkb3cgY2xhc3NlcyB3ZXJlCiAgICAgICAgICAgbWVyZWx5IFB5dGhvbiB3cmFwcGVycyBhcm91bmQgdHlwZWQgcG9pbnRlciBvYmplY3RzLiBIb3dldmVyLCAKICAgICAgICAgICBzb21lIHVzZXJzIGFjdHVhbGx5IHdhbnRlZCB0byByZWNlaXZlIHRoZSBzaGFkb3cgY2xhc3Mgb2JqZWN0IGluIEMuCiAgICAgICAgICAgVG8gYWNjb21tb2RhdGUgdGhpcywgdGhlIGRlcmVmZXJlbmNpbmcgb2YgdGhlICJ0aGlzIiBwb2ludGVyIGluCiAgICAgICAgICAgYSBzaGFkb3cgY2xhc3Mgd2FzIG1vdmVkIHRvIEMgYXMgZGVzY3JpYmVkIGluIENIQU5HRVMgWzgvOC85OV0uCiAgICAgICAgICAgSG93ZXZlciwgdGhlIHByb2Nlc3Mgb2YgcmV0dXJuaW5nIHBvaW50ZXJzIHRvIFB5dGhvbiB3YXMgc3RpbGwKICAgICAgICAgICBzb21ld2hhdCBwcm9ibGVtYXRpYy4gIFNwZWNpZmljYWxseSwgc2hhZG93IGNsYXNzZXMgbmV2ZXIgd29ya2VkCiAgICAgICAgICAgaW4gc2l0dWF0aW9ucyBzdWNoIGFzIHRoZXNlOgoKICAgICAgICAgICAgIC0gICBVc2Ugb2YgYW55IGtpbmQgb2Ygb3V0cHV0IHR5cGVtYXAgKCdvdXQnIG9yICdhcmdvdXQnKQogICAgICAgICAgICAgLSAgIEdsb2JhbCB2YXJpYWJsZXMgKGJyb2tlbiBhcyBmYXIgYXMgSSBjYW4gdGVsbCkuCgogICAgICAgICAgIEluIHRoZSBwYXN0LCBzb21lIHVzZXJzIGhhdmUgZGVhbHQgd2l0aCB0aGlzIGJ5IG1hbnVhbGx5IHRyeWluZwogICAgICAgICAgIHRvIGNyZWF0ZSBzaGFkb3cgY2xhc3Mgb2JqZWN0cyB0aGVtc2VsdmVzIGZyb20gQy9DKysuICBIb3dldmVyLAogICAgICAgICAgIHRoaXMgd2FzIGRpZmZpY3VsdCBiZWNhdXNlIHRoZSBDIHdyYXBwZXJzIGRvbid0IHJlYWxseSBrbm93IGhvdwogICAgICAgICAgIHRvIGdldCBhY2Nlc3MgdG8gdGhlIGNvcnJlc3BvbmRpbmcgUHl0aG9uIGNsYXNzLgoKICAgICAgICAgICBUaGUgUHl0aG9uIG1vZHVsZSBoYXMgbm93IGJlZW4gbW9kaWZpZWQgdG8gYXV0b21hdGljYWxseSBhdHRhY2gKICAgICAgICAgICBzaGFkb3cgY2xhc3Mgb2JqZWN0cyB0byBwb2ludGVycyB3aGVuIHRoZXkgYXJlIHJldHVybmVkIHRvIAogICAgICAgICAgIFB5dGhvbi4gICBUaGlzIHByb2Nlc3Mgb2NjdXJzIGluIHRoZSBmdW5jdGlvbiBTV0lHX05ld1BvaW50ZXJPYmooKQogICAgICAgICAgIHNvIHRoZSBwcm9jZXNzIGlzIGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQgdG8gdXNlcnMuICAgIEFzIGEgcmVzdWx0LAogICAgICAgICAgIHNoYWRvdyBjbGFzc2VzIGFyZSBub3cgbW9yZSBzZWFtbGVzc2x5IGludGVncmF0ZWQgd2l0aCB0eXBlbWFwcwogICAgICAgICAgIGFuZCBvdGhlciBmZWF0dXJlcyBvZiBTV0lHLgoKICAgICAgICAgICBUaGlzIGNoYW5nZSBtYXkgaW50cm9kdWNlIGEgbnVtYmVyIG9mIGluY29tcGF0aWJpbGl0aWVzLiAgVGhlCiAgICAgICAgICAgU1dJR19OZXdQb2ludGVyT2JqKCkgbm93IHRha2VzIGFuIGV4dHJhIHBhcmFtZXRlciAib3duIiB0byAKICAgICAgICAgICBpbmRpY2F0ZSBvYmplY3Qgb3duZXJzaGlwLiAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmV0dXJuIGEgcG9pbnRlcgogICAgICAgICAgIHRvIFB5dGhvbiB0aGF0IFB5dGhvbiBzaG91bGQgZGVzdHJveS4gICBJbiBhZGRpdGlvbiwgb2xkZXIgY29kZQogICAgICAgICAgIHRoYXQgdHJpZXMgdG8gbWFudWFsbHkgY29uc3RydWN0IHNoYWRvdyBjbGFzcyBvYmplY3RzIG9yIHdoaWNoCiAgICAgICAgICAgZXhwZWN0cyBiYXJlIHBvaW50ZXJzIG1heSBicmVhay0tLXN1Y2ggcG9pbnRlcnMgbWF5IGFscmVhZHkgYmUKICAgICAgICAgICBlbmNhcHN1bGF0ZWQgYnkgYSBzaGFkb3cgY2xhc3MuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8yMC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBNb2RpZmllZCB0aGUgJWluc2VydCBkaXJlY3RpdmUgdG8gYWNjZXB0IHNpbmdsZSBicmFjZXMgeyAuLi4gfS4KICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlaW5zZXJ0KCJoZWFkZXIiKSB7CiAgICAgICAgICAgICAgICAgICAuLi4gc29tZSBjb2RlIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBUaGlzIHdvcmtzIGV4YWN0bHkgbGlrZSAleyAuLi4gJX0gZXhjZXB0IHRoYXQgdGhlIGNvZGUgaW4gdGhlCiAgICAgICAgICAgYnJhY2VzIGlzIHByb2Nlc3NlZCB1c2luZyB0aGUgcHJlcHJvY2Vzc29yLiAgIFRoaXMgY2FuIGJlIHVzZWZ1bAogICAgICAgICAgIGluIGNlcnRhaW4gY29udGV4dHMgc3VjaCBhcyBsb3ctbGV2ZWwgY29kZSBnZW5lcmF0aW9uIGluIAogICAgICAgICAgIGxhbmd1YWdlIG1vZHVsZXMuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgIAoxMS8yMC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBDb21tYW5kIGxpbmUgb3B0aW9ucyBhcmUgbm93IHRyYW5zbGF0ZWQgaW50byBwcmVwcm9jZXNzb3IKICAgICAgICAgICBzeW1ib2xzLiAgRm9yIGV4YW1wbGU6CgkKICAgICAgICAgICAgICAuL3N3aWcgLXB5dGhvbiAtc2hhZG93IC1tb2R1bGUgYmxhaCBpbnRlcmZhY2UuaQoKICAgICAgICAgICBDcmVhdGVzIHRoZSBzeW1ib2xzOgoKICAgICAgICAgICAgICBTV0lHT1BUX1BZVEhPTiAxCiAgICAgICAgICAgICAgU1dJR09QVF9TSEFET1cgMQogICAgICAgICAgICAgIFNXSUdPUFRfTU9EVUxFIGJsYWgKICAgICAgICAgICAgICAKICAgICAgICAgICBNb2R1bGVzIGNhbiBsb29rIGZvciB0aGVzZSBzeW1ib2xzIHRvIGFsdGVyIHRoZWlyIGNvZGUgZ2VuZXJhdGlvbgogICAgICAgICAgIGlmIG5lZWRlZC4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgICAgICAKMTEvMjAvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgTWFzc2l2ZSBvdmVyaGF1bCBvZiB0aGUgUGVybDUgbW9kdWxlLiAgQSBsb3Qgb2YgY29kZSBnZW5lcmF0aW9uIGlzCiAgICAgICAgICAgbm93IGRyaXZlbiBieSB0YWJsZXMgYW5kIHR5cGVtYXBzLiAgIFRoZSBnZW5lcmF0ZWQgd3JhcHBlciBjb2RlIAogICAgICAgICAgIGFsc28gbWFrZXMgdXNlIG9mIHRhYmxlcyB0byBpbnN0YWxsIGNvbnN0YW50cywgdmFyaWFibGVzLCBhbmQKICAgICAgICAgICBmdW5jdGlvbnMgaW5zdGVhZCBvZiBpbmxpbmluZyBhIGJ1bmNoIG9mIHByb2NlZHVyZSBjYWxscy4gIFRoZQogICAgICAgICAgIHNlcGFyYXRlIHZhcmlhYmxlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGlzIGdvbmUuICAgTW9zdAogICAgICAgICAgIGNvZGUgZ2VuZXJhdGlvbiBpcyBjb250cm9sbGVkIHZpYSB0aGUgcGVybDUuc3dnIGZpbGUgaW4gdGhlCiAgICAgICAgICAgbGlicmFyeS4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAKMTEvMTMvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgcGFyc2luZyBzdXBwb3J0IGZvciB0aGUgQysrIHR5cGVuYW1lIGtleXdvcmQuICBQcmltYXJpbHkgdGhpcwogICAgICAgICAgIGlzIGFkZGVkIHRvIGJldHRlciBzdXBwb3J0IHRlbXBsYXRlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgIGJsYWgoQyYgdikgewogICAgICAgICAgICAgICAgIHR5cGVuYW1lIEM6Oml0ZXJhdG9yIGkgPSB2LmJlZ2luKCk7CiAgICAgICAgICAgICB9CgogICAgICAgICAgIE5vdGU6IHR5cGVuYW1lIGlzIHN1cHBvcnRlZCBpbiB0aGUgcGFyc2VyIGluIHRoZSBzYW1lIHdheSBhcyAnc3RydWN0JwogICAgICAgICAgIG9yICdjbGFzcycuICBZb3UgcHJvYmFibHkgc2hvdWxkbid0IHVzZSBpdCBhbnl3aGVyZSBleGNlcHQgaW4gdGVtcGxhdGVzLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjExLzExLzIwMDE6YmVhemxleQogICAgICAgICAgIE1hc3NpdmUgb3ZlcmhhdWwgb2YgdGhlIGxhbmd1YWdlIG1vZHVsZSBBUEkuICAgTW9zdCBmdW5jdGlvbnMgbm93CiAgICAgICAgICAgdXNlIGEgY29tbW9uLCB2ZXJ5IHNpbXBsZSwgIEFQSS4gICBUaGVyZSBhcmUgYWxzbyBhIG51bWJlciBvZgogICAgICAgICAgIGludGVyZXN0aW5nIHNlbWFudGljIHNpZGUtZWZmZWN0cyBvZiBob3cgY29kZSBpcyBhY3R1YWxseSBnZW5lcmF0ZWQuCiAgICAgICAgICAgRGV0YWlscyB3aWxsIGJlIGZvcnRoY29taW5nIGluIERvYy9NYW51YWwvRXh0ZW5kaW5nLmh0bWwuCgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKiBMYW5ndWFnZSBtb2R1bGVzIHdyaXR0ZW4gZm9yCiAgICAgICAgICAgcHJldmlvdXMgdmVyc2lvbnMgb2YgU1dJRyB3aWxsIG5vIGxvbmdlciB3b3JrLAoKMTEvMTAvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgYSB2ZXJ5IHN1YnRsZSBidWcgZHVlIHRvIHVubmFtZWQgY2xhc3Mgd3JhcHBpbmcuIEZvciBleGFtcGxlLCBpZgogICAgICAgICAgIHlvdSBkaWQgdGhpcwoKICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCB7CiAgICAgICAgICAgICAgICAgIGludCB4LHk7CiAgICAgICAgICAgICAgfSBnZFBvaW50LCAqZ2RQb2ludFB0cjsKCiAgICAgICAgICAgICAgdm9pZCBmb28oZ2RQb2ludFB0ciB4KTsKCiAgICAgICAgICAgVGhlbiB0aGUgZm9vIGZ1bmN0aW9uIHdvdWxkIGdldCBhIHR5cGUtZXJyb3IuICAgVGhlIHByb2JsZW0gaGFzCiAgICAgICAgICAgdG8gZG8gd2l0aCBpbnRlcm5hbCB0eXBlZGVmIGhhbmRsaW5nIGFuZCB0aGUgZmFjdCB0aGF0IHRoZSB0eXBlZGVmCiAgICAgICAgICAgZGVjbGFyYXRpb25zIGFmdGVyIHRoZSBzdHJ1Y3QgYXBwZWFyIGxhdGVyIGluIHRoZSBwYXJzZSB0cmVlLgogICAgICAgICAgIEl0IHNob3VsZCB3b3JrIG5vdy4gIFByb2JsZW0gcmVwb3J0ZWQgYnkgVmluIEpvdmFub3ZpYy4KCjExLzA5LzIwMDE6YmVhemxleQogICAgICAgICAgIFN1YnRsZSBjaGFuZ2UgdG8gIm91dCIgdHlwZW1hcHMgKGFuZCByZWxhdGVkIHZhcmlhdGlvbnMpLiAgVGhlIG5hbWUKICAgICAgICAgICB0aGF0IGlzIGF0dGFjaGVkIHRvIHRoZSB0eXBlbWFwIGlzIG5vdyB0aGUgcmF3IEMgaWRlbnRpZmllciB0aGF0CiAgICAgICAgICAgYXBwZWFycyBvbiBhIGRlY2xhcmF0aW9uLiAgVGhpcyBjaGFuZ2VzIHRoZSBiZWhhdmlvciBvZgogICAgICAgICAgIG1lbWJlciBmdW5jdGlvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgaW50IGZvbyB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICBjbGFzcyBCbGFoIHsKICAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIGludCBmb28oKTsgICAgLy8gdHlwZW1hcCBnZXRzIGFwcGxpZWQKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICBQcmV2aW91cyB2ZXJzaW9ucyBuZXZlciByZWFsbHkgc3BlY2lmaWVkIGhvdyB0aGlzIHdhcyBzdXBwb3NlZCB0bwogICAgICAgICAgIHdvcmsuICBJbiBTV0lHMS4xLCB5b3UgY291bGQgcHJvYmFibHkgd3JpdGUgYSB0eXBlbWFwIGZvciB0aGUKICAgICAgICAgICB3cmFwcGVyIG5hbWUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgaW50IEJsYWhfZm9vIHsgLi4uIH0KCiAgICAgICAgICAgSG93ZXZlciwgdGhpcyBvbGQgYmVoYXZpb3IgaXMgbm93IHdpdGhkcmF3biBhbmQgbm90IHN1cHBvcnRlZC4gCiAgICAgICAgICAgSnVzdCB1c2UgdGhlIG1lbWJlciBuYW1lIHdpdGhvdXQgYW55IHNvcnQgb2Ygc3BlY2lhbCBwcmVmaXguCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8wNi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBDaGFuZ2VzIHRvIFRjbCBtb2R1bGUgaW5pdGlhbGl6YXRpb246CgogICAgICAgICAgICgxKSBTV0lHIG5vdyBhdXRvbWF0aWNhbGx5IGluY2x1ZGVzIHRoZSBjb2RlIG5lZWRlZCB0byB3b3JrIHdpdGgKICAgICAgICAgICAgICAgIFRjbCBzdHVicy4gIFNpbXBseSBjb21waWxlIHdpdGggLURVU0VfVENMX1NUVUJTLgoKICAgICAgICAgICAoMikgU1dJRyBub3cgYXV0b21hdGljYWxseSBjYWxscyBUY2xfUGtnUHJvdmlkZSB0byByZWdpc3RlcgogICAgICAgICAgICAgICBhIHBhY2thZ2UgbmFtZS4gIFRoZSBwYWNrYWdlIG5hbWUgaXMgdGhlIHNhbWUgYXMgdGhlIG5hbWUKICAgICAgICAgICAgICAgc3BlY2lmaWVkIHdpdGggdGhlICVtb2R1bGUgZGlyZWN0aXZlLiAgVGhlIHZlcnNpb24gbnVtYmVyIGlzCiAgICAgICAgICAgICAgIHNldCB0byAiMC4wIiBieSBkZWZhdWx0LiAgVG8gY2hhbmdlIHRoZSB2ZXJzaW9uIG51bWJlciwgdXNlCiAgICAgICAgICAgICAgIHN3aWcgLXBrZ3ZlcnNpb24gMS4yIGludGVyZmFjZS5pLgoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICBNb2R1bGVzIHRoYXQgcHJvdmlkZWQgc3R1YnMgYW5kIFRjbF9Qa2dQcm92aWRlIG9uIHRoZWlyIG93biBtaWdodAogICAgICAgICAgIGJyZWFrLiAgU2ltcGx5IHJlbW92ZSB0aGF0IGNvZGUuCgoxMS8wNS8yMDAxOmJlYXpsZXkKICAgICAgICAgICBDaGFuZ2VkIGNvZGUgZ2VuZXJhdGlvbiBvZiBjb25zdGFudHMgaW4gdGhlIFRjbCBtb2R1bGUuICBDb25zdGFudHMKICAgICAgICAgICBhcmUgbm93IHN0b3JlZCBpbiBhIGxhcmdlIHRhYmxlIHRoYXQgZ2V0IGluc3RhbGxlZCBhdCBtb2R1bGUgc3RhcnR1cC4KICAgICAgICAgICBUaGVyZSBhcmUgYWxzbyBubyBsb25nZXIgYW55IHN0YXRpYyB2YXJpYWJsZXMgc28gaXQgc2hvdWxkIGdlbmVyYXRlCiAgICAgICAgICAgc29tZXdoYXQgbGVzcyBjb2RlLgoKMTEvMDQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgVGhlICJjb25zdCIgdHlwZW1hcCBoYXMgYmVlbiByZW5hbWVkIHRvICJjb25zdGFudCIgaW4gbWFueSBsYW5ndWFnZQogICAgICAgICAgIG1vZHVsZXMuICAiY29uc3QiIGlzIGEgQyBrZXl3b3JkIHdoaWNoIG1hZGUgdGhlIGhhbmRsaW5nIG9mIHRoZSB0eXBlbWFwCiAgICAgICAgICAgZGlyZWN0aXZlIHNvbWV3aGF0IGF3a3dhcmQgaW4gdGhlIHBhcnNlci4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjExLzA0LzIwMDE6YmVhemxleQogICAgICAgICAgICV0eXBlbWFwIGRpcmVjdGl2ZSBjYW4gbm93IGFjY2VwdCBuZWFybHkgYXJiaXRyYXJ5IGtleXdvcmQgcGFyYW1ldGVycy4KICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4scGFyc2U9ImkiLGRvYz0iaW50ZWdlciIpIGludCAiLi4uIjsKCiAgICAgICAgICAgVGhlIHB1cnBvc2Ugb2YgdGhlIGtleXdvcmQgcGFyYW1ldGVycyBpcyB0byBzdXBwbHkgY29kZSBnZW5lcmF0aW9uCiAgICAgICAgICAgaGludHMgdG8gdGhlIHRhcmdldCBsYW5ndWFnZSBtb2R1bGUuICAgVGhlIGludGVwcmV0YXRpb24gb2YgdGhlCiAgICAgICAgICAgcGFyYW1ldGVycyBpcyBsYW5ndWFnZSBzcGVjaWZpYy4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxMS8wNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBTbGlnaHQgc2VtYW50aWMgY2hhbmdlIHRvIGludGVybmFsIGNhbGwvcmV0dXJuIGJ5IHZhbHVlIGhhbmRsaW5nLgogICAgICAgICAgIEluIHByZXZpb3VzIHZlcnNpb25zIG9mIFNXSUcsIGNhbGwtYnktdmFsdWUgd2FzIHRyYW5zbGF0ZWQKICAgICAgICAgICBpbnRvIHBvaW50ZXJzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBkb3VibGUgZG90X3Byb2R1Y3QoVmVjdG9yIGEsIFZlY3RvciBiKTsKCiAgICAgICAgICAgdHVybmVkIGludG8gdGhpczoKCiAgICAgICAgICAgICAgIGRvdWJsZSB3cmFwX2RvdF9wcm9kdWN0KFZlY3RvciAqYSwgVmVjdG9yICpiKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBkb3RfcHJvZHVjdCgqYSwqYik7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgVGhpcyB0cmFuc2xhdGlvbiB3YXMgbm9ybWFsbHkgcGVyZm9ybWVkIGJ5IHRoZSBTV0lHIGNvcmUsIG91dHNpZGUKICAgICAgICAgICBvZiB0aGUgY29udHJvbCBvZiBsYW5ndWFnZSBtb2R1bGVzLiAgSG93ZXZlciwgYSBzaWRlIGVmZmVjdAogICAgICAgICAgIG9mIHRoaXMgd2FzIGEgbG90IG9mIGJpemFycmUgdHlwZW1hcCBiZWhhdmlvci4gICBGb3IgZXhhbXBsZSwKICAgICAgICAgICBpZiB5b3UgZGlkIHNvbWV0aGluZyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludDMyIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgWW91IHdvdWxkIGZpbmQgdGhhdCBpbnQzMiB3YXMgdHJhbnNmb3JtZWQgaW50byBhIHBvaW50ZXIgZXZlcnl3aGVyZSEKICAgICAgICAgICAobmVlZGxlc3MgdG8gc2F5LCBzdWNoIGJlaGF2aW9yIGlzIHVuZXhwZWN0ZWQgYW5kIHF1aXRlIGF3a3dhcmQgdG8KICAgICAgICAgICBkZWFsIHdpdGgpLiAgVG8gbWFrZSBtYXR0ZXJzIHdvcnNlLCBpZiBhIHR5cGVkZWYgd2FzIGFsc28gdXNlZCwKICAgICAgICAgICB0aGUgcG9pbnRlciBiZWhhdmlvciBzdWRkZW5seSBkaXNhcHBlYXJlZC4KCiAgICAgICAgICAgVG8gZml4IHRoaXMsIHRoZSBwb2ludGVyIHRyYW5zZm9ybWF0aW9uIGlzIG5vdyBwdXNoZWQgdG8gdGhlCiAgICAgICAgICAgbGFuZ3VhZ2UgbW9kdWxlcy4gICBUaGlzIHByb2R1Y2VzIHdyYXBwZXJzIHRoYXQgbG9vayByb3VnaGx5CiAgICAgICAgICAgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgZG91YmxlIHdyYXBfZG90X3Byb2R1Y3QoVmVjdG9yICphLCBWZWN0b3IgKmIpIHsKICAgICAgICAgICAgICAgICAgVmVjdG9yIGFyZzEgPSAqYTsKICAgICAgICAgICAgICAgICAgVmVjdG9yIGFyZzIgPSAqYjsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvdF9wcm9kdWN0KGFyZzEsYXJnMik7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgVGhpcyBjaGFuZ2UgYWxzbyBtYWtlcyBpdCBlYXN5IHRvIGRlZmluZSB0eXBlbWFwcyBmb3IKICAgICAgICAgICBhcmJpdHJhcnkgdW5kZWZpbmVkIHR5cGVzLiAgRm9yIGV4YW1wbGUsIHlvdSBjYW4gZG8gdGhpcyAoYW5kIGl0CiAgICAgICAgICAgd2lsbCB3b3JrIHJlZ2FyZGxlc3Mgd2hhdCBpbnQzMiBpcyk6CgogICAgICAgICAgICAgICAldHlwZW1hcChpbikgaW50MzIgewogICAgICAgICAgICAgICAgICAkMSA9IChpbnQzMikgUHlJbnRfQXNMb25nKCRpbnB1dCk7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTUNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgVGhpcyBjaGFuZ2UgbWF5IGJyZWFrIGNhbGwvcmV0dXJuIGJ5IHZhbHVlIGNvZGUgZ2VuZXJhdGlvbiBpbgogICAgICAgICAgIHNvbWUgbGFuZ3VhZ2UgbW9kdWxlcy4KCjExLzAzLzIwMDE6YmVhemxleQogICAgICAgICAgIENoYW5nZWQgdGhlIG5hbWUgb2YgdGhlIGRlZmF1bHQgdHlwZW1hcHMgdG8gdGhlIGZvbGxvd2luZzoKCiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgU1dJR1RZUEUgIHsgCiAgICAgICAgICAgICAgICAgICAuLi4gYW4gb2JqZWN0IC4uLgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgU1dJR1RZUEUgKiB7CiAgICAgICAgICAgICAgICAgICAuLi4gYSBwb2ludGVyIC4uLgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgU1dJR1RZUEUgJiB7CiAgICAgICAgICAgICAgICAgICAuLi4gYSByZWZlcmVuY2UgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHVFlQRSBbXSB7CiAgICAgICAgICAgICAgICAgICAuLi4gYW4gYXJyYXkgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBlbnVtIFNXSUdUWVBFIHsKICAgICAgICAgICAgICAgICAgLi4uIGFuIGVudW0gdmFsdWUgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHVFlQRSAoQ0xBU1M6OiopIHsKICAgICAgICAgICAgICAgICAgIC4uLiBwb2ludGVyIHRvIG1lbWJlciAuLi4KICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgVGhlc2UgdHlwZXMgYXJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgZm9yIGFsbCB0eXBlcyB0aGF0IGRvbid0IG1hdGNoCiAgICAgICAgICAgYW55dGhpbmcgZWxzZS4gIFNlZSBDSEFOR0VTIGxvZyBlbnRyeSBmb3IgOC8yNy8yMDAwIGZvciB0aGUKICAgICAgICAgICBvbGQgYmVoYXZpb3IuICBUaGUgcm9sZSBvZiB0aGVzZSB0eXBlcyBpcyBhbHNvIGRlc2NyaWJlZCBpbiAKICAgICAgICAgICBEb2MvTWFudWFsL1R5cGVtYXBzLmh0bWwKCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAKMTAvMjUvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgTW9kaWZpZWQgR3VpbGUgYW5kIE16c2NoZW1lIG1vZHVsZXMgdG8gc3VwcG9ydAogICAgICAgICAgIG11bHRpLWFyZ3VtZW50IHR5cGVtYXBzLgoKMTAvMjUvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIEZpeCB0byBoYW5kbGUgcG9pbnRlcnMgdG8gYXJyYXlzLgoKMTAvMjQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRGVmaW5pbmcgYSB0eXBlbWFwIHJ1bGUgZm9yIGVudW0gU1dJR0VOVU0gY2FuIG5vdyBiZSB1c2VkCiAgICAgICAgICAgdG8gZGVmaW5lIGRlZmF1bHQgYmVoYXZpb3IgZm9yIGVudW0gdmFyaWFibGVzLgoKMTAvMjIvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgUnVieSBtb2R1bGUgbW9kaWZpZWQgdG8gc3VwcG9ydCBtdWx0aS1hcmd1bWVudCB0eXBlbWFwcy4KCjEwLzIyLzIwMDE6YmVhemxleQogICAgICAgICAgIFRoZSBSdWJ5IG1vZHVsZSBjYW4gbm93IGhhbmRsZSBmdW5jdGlvbnMgd2l0aCBhbiBhcmJpdHJhcnkKICAgICAgICAgICBudW1iZXIgb2YgYXJndW1lbnRzLiAgUHJldmlvdXMgdmVyc2lvbnMgd2VyZSBsaW1pdGVkIHRvIAogICAgICAgICAgIHRvIGZ1bmN0aW9ucyB3aXRoIG9ubHkgOSBvciAxNiBhcmd1bWVudHMgZGVwZW5kaW5nIG9uCiAgICAgICAgICAgdGhlIHVzZSBvZiBkZWZhdWx0IGFyZ3VtZW50cy4gICBOb3RlOiBmcm9tIHNvbWUgaW5zcGVjdGlvbgogICAgICAgICAgIG9mIHRoZSBSdWJ5IGludGVycHJldGVyIHNvdXJjZSwgdGhlIG5ldyBhcHByb2FjaCBtaWdodCBiZQogICAgICAgICAgIGEgbGl0dGxlIGZhc3RlciBhcyB3ZWxsLgoKMTAvMTgvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgYSBidWcgd2l0aCBmb3J3YXJkIGNsYXNzIGRlY2xhcmF0aW9ucyBhbmQKICAgICAgICAgICB0ZW1wbGF0ZXMuCgogICAgICAgICAgICAgICAgIGNsYXNzIEZvbyA8UyxUPjsKCiAgICAgICAgICAgQnVnIHJlcG9ydGVkIGJ5IElyaW5hIEtvdGxvdmEuCgoxMC8xNi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBTdXBwb3J0IGZvciBtdWx0aXZhbHVlZCB0eXBlbWFwcyBhZGRlZC4gIFRoZSB0eXBlbWFwcwogICAgICAgICAgIGFyZSBzcGVjaWZpZWQgdXNpbmcgdGhlIHN5bnRheCBiZWxvdy4gICBXaXRoaW4gZWFjaAogICAgICAgICAgIHR5cGVtYXAsIHZhcmlhYmxlIHN1YnN0aXR1dGlvbiBpcyBoYW5kbGVkIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICV0eXBlbWFwKGluKSAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewogICAgICAgICAgICAgICAgICAkYXJnOyAgLy8gVGhlIGlucHV0IG9iamVjdCBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlCiAgICAgICAgICAgICAgICAgICQxOyAgICAvLyBDIGxvY2FsIHZhcmlhYmxlIGZvciBmaXJzdCBhcmd1bWVudAogICAgICAgICAgICAgICAgICAkMjsgICAgLy8gQyBsb2NhbCB2YXJpYWJsZSBmb3Igc2Vjb25kIGFyZ3VtZW50CgogICAgICAgICAgICAgICAgICAvLyBUaGVzZSB2YXJpYWJsZXMgcmVmZXIgdG8gZWl0aGVyIGFyZ3VtZW50CiAgICAgICAgICAgICAgICAgICQxX3R5cGUsICQxX2x0eXBlLCAkMV9iYXNldHlwZSwgZXRjLi4uICAoYXJnYykKICAgICAgICAgICAgICAgICAgJDJfdHlwZSwgJDJfbHR5cGUsICQyX2Jhc2V0eXBlLCBldGMuLi4gIChhcmd2W10pCgogICAgICAgICAgICAgICAgICAvLyBBcnJheSBkaW1lbnNpb24gb2YgYXJndgogICAgICAgICAgICAgICAgICAkMl9kaW0wCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICBCYXNpY2FsbHkgYW55IHZhcmlhYmxlIHRoYXQgd2FzIGF2YWlsYWJsZSBpbiBub3JtYWwgdHlwZW1hcHMKICAgICAgICAgICBpcyBhdmFpbGFibGUgZm9yIGVpdGhlciBhcmd1bWVudCBieSBwcmVmYWNpbmcgdGhlIHZhcmlhYmxlCiAgICAgICAgICAgbmFtZSBieSAnJG5fJyB3aGVyZSBuIGlzIHRoZSBhcmd1bWVudCBwb3NpdGlvbi4KCiAgICAgICAgICAgTm90ZXM6ICAKICAgICAgICAgICAoMSkgTXVsdGktdmFsdWVkIHR5cGVtYXBzIGNhbiBvbmx5IGJlIGFwcGxpZWQgdG8gYSBzaW5nbGUKICAgICAgICAgICAgICAgb2JqZWN0IGluIHRoZSB0YXJnZXQgc2NyaXB0aW5nIGxhbmd1YWdlLiAgIEZvciBleGFtcGxlLAogICAgICAgICAgICAgICB5b3UgY2FuIHNwbGl0IGEgc3RyaW5nIGludG8gYSAoY2hhciAqLCBpbnQpIHBhaXIgb3IKICAgICAgICAgICAgICAgc3BsaXQgYSBsaXN0IGludG8gYSAoaW50LCBjaGFyIFtdKSBwYWlyLiAgSXQgaXMgbm90CiAgICAgICAgICAgICAgIHBvc3NpYmxlIHRvIG1hcCBtdWx0aXBsZSBvYmplY3RzIHRvIG11bHRpcGxlIGFyZ3VtZW50cy4KCiAgICAgICAgICAgKDIpIFRvIG1haW50YWluIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBTV0lHIHZlcnNpb25zLCB0aGUKICAgICAgICAgICAgICAgdmFyaWFibGVzIHN1Y2ggYXMgJHRhcmdldCBhbmQgJHR5cGUgYXJlIHByZXNlcnZlZCBhbmQKICAgICAgICAgICAgICAgYXJlIG1hcHBlZCBvbnRvIHRoZSBmaXJzdCBhcmd1bWVudCBvbmx5LgoKICAgICAgICAgICAoMykgVGhpcyBzaG91bGQgbm90IGFmZmVjdCBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgY29kZS4KICAgICAgICAgICAgICAgTXVsdGktdmFsdWVkIHR5cGVtYXBzIGFyZSBhbiBleHRlbnNpb24gdG8gdHlwZW1hcCBoYW5kbGluZy4KICAgICAgICAgICAgICAgU2luZ2xlIHZhbHVlZCB0eXBlbWFwcyBjYW4gYmUgc3BlY2lmaWVkIGluIHRoZSB1c3VhbAogICAgICAgICAgICAgICB3YXkuCgogICAgICAgICAgIFRoZSBvbGQgJHNvdXJjZSBhbmQgJHRhcmdldCB2YXJpYWJsZXMgYXJlIG9mZmljaWFsbHkKICAgICAgICAgICBkZXByZWNhdGVkLiAgSW5wdXQgdmFyaWFibGVzIGFyZSByZWZlcmVuY2VkIHRocm91Z2gKICAgICAgICAgICAkYXJnJCBhbmQgb3V0cHV0IHZhbHVlcyBhcmUgcmVmZXJlbmNlIHRocm91Z2ggJHJlc3VsdCQuCgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjEwLzE2LzIwMDE6YmVhemxleQogICAgICAgICAgIEFkZGVkIHBhcnNpbmcgc3VwcG9ydCBmb3IgbXVsdGl2YWx1ZWQgdHlwZW1hcHMuICBUaGUgc3ludGF4CiAgICAgICAgICAgaXMgYSBsaXR0bGUgZnVua3ksIGJ1dCBoZXJlIGdvZXM6CgogICAgICAgICAgICAgIC8vIERlZmluZSBhIG11bHRpdmFsdWVkIHR5cGVtYXAKICAgICAgICAgICAgICAldHlwZW1hcChpbikgKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKICAgICAgICAgICAgICAgICAgICAuLi4gdHlwZW1hcCBjb2RlIC4uLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgLy8gTXVsdGl2YWx1ZWQgdHlwZW1hcCB3aXRoIGxvY2FscwogICAgICAgICAgICAgICV0eXBlbWFwKGluKSAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkoaW50IHRlbXApIHsKICAgICAgICAgICAgICAgICAgICAuLi4gdHlwZW1hcCBjb2RlIC4uLgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAKICAgICAgICAgICAgICAvLyBDb3B5IGEgbXVsdGl2YWx1ZWQgdHlwZW1hcAogICAgICAgICAgICAgICV0eXBlbWFwKGluKSAoaW50IGFyZ2NvdW50LCBjaGFyICoqYXJndikgPSAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSk7CgogICAgICAgICAgICAgIC8vIEFwcGx5IGEgbXVsdGl2YWx1ZWQgdHlwZW1hcAogICAgICAgICAgICAgICVhcHBseSAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgeyAoaW50IGFyZ2NvdW50LCBjaGFyICoqYXJndikgfTsKCiAgICAgICAgICAgTm90ZTogdGhpcyBleHRyYSBwYXJzaW5nIHN1cHBvcnQgaXMgYWRkZWQgZm9yIGZ1dHVyZSBleHRlbnNpb24uCiAgICAgICAgICAgTm8gbGFuZ3VhZ2UgbW9kdWxlcyBjdXJyZW50bHkgc3VwcG9ydCBtdWx0aS12YWx1ZWQgdHlwZW1hcHMuCgoxMC8xMS8yMDAxOmJlYXpsZXkKICAgICAgICAgICBNb2RpZmllZCB0aGUgdHlwZW1hcCBtYXRjaGluZyBjb2RlIHRvIGRpc2NhcmQgcXVhbGlmaWVycyB3aGVuCiAgICAgICAgICAgY2hlY2tpbmcgZm9yIGEgbWF0Y2guICAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGEgZGVjbGFyYXRpb24KICAgICAgICAgICBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgIHZvaWQgYmxhaChjb25zdCBjaGFyICp4KTsKCiAgICAgICAgICAgVGhlIHR5cGVtYXAgY2hlY2tlciBjaGVja3MgZm9yIGEgbWF0Y2ggaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKCiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqeAogICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKgogICAgICAgICAgICAgICAgIGNoYXIgKngKICAgICAgICAgICAgICAgICBjaGFyICoKCiAgICAgICAgICAgSWYgdHlwZWRlZidzIGFyZSBpbnZvbHZlZCwgcXVhbGlmaWVyIHN0cmlwcGluZyBvY2N1cnMgYmVmb3JlCiAgICAgICAgICAgdHlwZWRlZiByZXNvbHV0aW9uLiAgU28gaWYgeW91IGhhZCB0aGlzLAoKICAgICAgICAgICAgICAgIHR5cGVkZWYgY2hhciAqc3RyaW5nOwogICAgICAgICAgICAgICAgdm9pZCBibGFoKGNvbnN0IHN0cmluZyB4KTsKCiAgICAgICAgICAgdHlwZW1hcCBjaGVja2luZyB3b3VsZCBiZSBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyB4CiAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcKICAgICAgICAgICAgICAgIHN0cmluZyB4CiAgICAgICAgICAgICAgICBzdHJpbmcKICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKngKICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKgogICAgICAgICAgICAgICAgY2hhciAqeAogICAgICAgICAgICAgICAgY2hhciAqCgogICAgICAgICAgIFRoZSBwcmltYXJ5IHJlYXNvbiBmb3IgdGhpcyBjaGFuZ2UgaXMgdG8gc2ltcGxpZnkgdGhlIGltcGxlbWVudGF0aW9uCiAgICAgICAgICAgb2YgbGFuZ3VhZ2UgbW9kdWxlcy4gIFdpdGhvdXQgcXVhbGlmaWVyIHN0cmlwcGluZywgb25lIGhhcyB0byB3cml0ZQogICAgICAgICAgIHNlcGVyYXRlIHR5cGVtYXBzIGZvciBhbGwgdmFyaWF0aW9ucyBvZiBjb25zdCBhbmQgdm9sYXRpbGUgKHdoaWNoCiAgICAgICAgICAgaXMgYSBwYWluKS4KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqICBUeXBlbWFwcyBtaWdodCBiZSBhcHBsaWVkIGluCiAgICAgICAgICAgcGxhY2VzIHdoZXJlIHRoZXkgd2VyZW4ndCBiZWZvcmUuCgoKMTAvOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgU1dJRyBub3cgZ2VuZXJhdGVzIHdyYXBwZXJzIHRoYXQgcHJvcGVybHkgZGlzYW1iaWd1YXRlCiAgICAgICAgICAgb3ZlcmxvYWRlZCBtZXRob2RzIHRoYXQgb25seSB2YXJ5IGluIGNvbnN0bmVzcy4gIEZvcgogICAgICAgICAgIGV4YW1wbGU6CgogICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKCk7CiAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaCgpIGNvbnN0OwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgVG8gaGFuZGxlIHRoaXMsIHRoZSAlcmVuYW1lIGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCBub3JtYWxseS4KICAgICAgICAgICAKICAgICAgICAgICAgICAgJXJlbmFtZShibGFoX2NvbnN0KSBibGFoKCkgY29uc3Q7CgogICAgICAgICAgIEluIHRoZSByZXN1bHRpbmcgd3JhcHBlciBjb2RlLCBtZXRob2QgY2FsbHMgbGlrZSB0aGlzCiAgICAgICAgICAgYXJlIG5vdyBnZW5lcmF0ZWQ6CgogICAgICAgICAgICAgICAob2JqKS0+YmxhaCgpICAgICAgICAgICAgICAgLy8gTm9uLWNvbnN0IHZlcnNpb24KICAgICAgICAgICAgICAgKChGb28gY29uc3QgKilvYmopLT5ibGFoKCkgIC8vIGNvbnN0IHZlcnNpb24KCiAgICAgICAgICAgVGhpcyBzaG91bGQgZm9yY2UgdGhlIHJpZ2h0IG1ldGhvZCB0byBiZSBpbnZva2VkLgogICAgICAgICAgIEFkbWl0dGVkbHksIHRoaXMgaXMgcHJvYmFibHkgb2JzY3VyZSwgYnV0IHdlIG1pZ2h0CiAgICAgICAgICAgYXMgd2VsbCBnZXQgaXQgcmlnaHQuCgoxMC84LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBUaGUgcHJlcHJvY2Vzc29yIG5vdyBpZ25vcmVzICdccicgaW4gdGhlIGlucHV0LgogICAgICAgICAgIFRoaXMgc2hvdWxkIGZpeCB0aGUgZm9sbG93aW5nIGJ1ZzoKICAgICAgICAgICBbICM0Njg0MTYgXSBTV0lHIHRoaW5rcyBtYWNybyBkZWZzIGFyZSBkZWNsYXJhdGlvbnM/CgoxMC84LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciB8fCwgJiYsIGFuZCAhIGluIGNvbnN0YW50cy4gIFRoaXMKICAgICAgICAgICBmaXhlcyBTRiBbICM0Njg5ODggXSBMb2dpY2FsIG9wcyBicmVhayBwcmVwcm9jZXNzb3IuCiAgICAgICAgICAgSG93ZXZlciwgYXQgdGhpcyB0aW1lLCBjb25zdGFudHMgdXNpbmcgdGhlc2Ugb3BlcmF0b3JzCiAgICAgICAgICAgYXJlIG5vdCBzdXBwb3J0ZWQgKHRoZSBwYXJzZXIgd2lsbCBpc3N1ZSBhIHdhcm5pbmcpLgoKMTAvNC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgLXNob3dfdGVtcGxhdGVzIGNvbW1hbmQgbGluZSBvcHRpb24uICBUaGlzIG1ha2VzCiAgICAgICAgICAgU1dJRyBkaXNwbGF5IHRoZSBjb2RlIGl0IGFjdHVhbGx5IHBhcnNlcyB0byBnZW5lcmF0ZQogICAgICAgICAgIHRlbXBsYXRlIHdyYXBwZXJzLiAgTW9zdGx5IHVzZWZ1bCBmb3IgZGVidWdnaW5nLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjEwLzQvMjAwMTogYmVhemxleQogICAgICAgICAgIENoYW5nZSB0byBzZW1hbnRpY3Mgb2YgJXRlbXBsYXRlIGRpcmVjdGl2ZS4gIFdoZW4KICAgICAgICAgICB1c2luZyAldGVtcGxhdGUsIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudHMgYXJlIGhhbmRsZWQKICAgICAgICAgICBhcyB0eXBlcyBieSBkZWZhdWx0LiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY2ludCkgdmVjdG9yPGludD47CiAgICAgICAgICAgICAgICAldGVtcGxhdGUodmVjZG91YmxlKSB2ZWN0b3I8ZG91YmxlPjsKCiAgICAgICAgICAgVG8gc3BlY2lmeSBhIHRlbXBsYXRlIGFyZ3VtZW50IHRoYXQgaXMgKm5vdCogYSB0eXBlLCB5b3UKICAgICAgICAgICBuZWVkIHRvIHVzZSBkZWZhdWx0LXZhbHVlIHN5bnRheC4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY2ludCkgdmVjdG9yPGludCxpbnQ9NTA+OwogICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY2RvdWJsZSkgdmVjdG9yPGludCxzaXplPTEwMD47CgogICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIHR5cGUgbmFtZSBkb2Vzbid0IHJlYWxseSBtYXR0ZXItLW9ubHkKICAgICAgICAgICB0aGUgZGVmYXVsdCB2YWx1ZSAoZS5nLiwgNTAsIDEwMCkgaXMgdXNlZCBkdXJpbmcKICAgICAgICAgICBleHBhbnNpb24uICBUaGlzIGRpZmZlcnMgZnJvbSBub3JtYWwgQysrLCBidXQgSSBjb3VsZG4ndAogICAgICAgICAgIGZpZ3VyZSBvdXQgYSBiZXR0ZXIgd2F5IHRvIGRvIGl0IGluIHRoZSBwYXJzZXIuICBNaWdodAogICAgICAgICAgIGltcGxlbWVudCBhbiBhbHRlcm5hdGl2ZSBsYXRlci4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgIAoxMC80LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBNYWpvciBjaGFuZ2VzIHRvIHRlbXBsYXRlIGhhbmRsaW5nIGluIG9yZGVyIHRvIHByb3ZpZGUKICAgICAgICAgICBiZXR0ZXIgaW50ZWdyYXRpb24gd2l0aCB0aGUgQysrIHR5cGUtc3lzdGVtLiBUaGUgbWFpbgogICAgICAgICAgIHByb2JsZW0gaXMgYXMgZm9sbG93czoKCiAgICAgICAgICAgU3VwcG9zZSB5b3UgaGF2ZSBhIHRlbXBsYXRlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gdm9pZCBibGFoKGNvbnN0IFQgeCkgeyBzdHVmZiB9OwogICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgTm93IHN1cHBvc2UsIHRoYXQgeW91IGluc3RhbnRpYXRlIHRoZSB0ZW1wbGF0ZSBvbiBhCiAgICAgICAgICAgdHlwZSBsaWtlIHRoaXMgaW4gU1dJRzoKCiAgICAgICAgICAgICAgJXRlbXBsYXRlKGJsYWhpbnQpIGJsYWg8aW50ICo+OwoKICAgICAgICAgICBJbiBDKyssIHRoaXMgaXMgKnN1cHBvc2VkKiB0byBnZW5lcmF0ZSBjb2RlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgdm9pZCBibGFoKGludCAqY29uc3QgeCkgeyBzdHVmZiB9OwoKICAgICAgICAgICBIb3dldmVyLCBpbiBTV0lHLTEuMy45LCB0aGUgdGVtcGxhdGUgc3Vic3RpdHV0aW9uIGdldHMgaXQgd3JvbmcKICAgICAgICAgICBhbmQgcHJvZHVjZXMKCiAgICAgICAgICAgICAgdm9pZCBibGFoKGNvbnN0IGludCAqeCkgeyBzdHVmZiB9OwoKICAgICAgICAgICAobm90aWNlIHRoZSBiYWQgcGxhY2VtZW50IG9mIHRoZSAnY29uc3QnIHF1YWxpZmllcikuCgogICAgICAgICAgIFRvIGZpeCB0aGlzLCB0aGUgU1dJRyBwYXJzZXIgbm93IGdlbmVyYXRlcyBpbXBsaWNpdCB0eXBlZGVmcwogICAgICAgICAgIGZvciB0ZW1wbGF0ZSB0eXBlIGFyZ3VtZW50cyB0aGF0IHByb2R1Y2VzIGNvZGUgcm91Z2hseQogICAgICAgICAgIGVxdWl2YWxlbnQgdG8gZG9pbmcgdGhpczoKCiAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgKl9fc3dpZ3RtcGwxOwogICAgICAgICAgICAgICV0ZW1wbGF0ZShibGFoaW50KSBibGFoPF9fc3dpZ3RtcGwxPjsKCiAgICAgICAgICAgd2hpY2ggZ2VuZXJhdGVzIGNvZGUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICB2b2lkIGJsYWgoY29uc3QgX19zd2lndG1wbDEgeCkgeyBzdHVmZiB9OwoKICAgICAgICAgICBTaW5jZSB0aGlzIGlzIGNvcnJlY3QgaW4gYm90aCBDKysgYW5kIFNXSUcsIGl0IHByb3ZpZGVzIHRoZSByaWdodAogICAgICAgICAgIHNlbWFudGljcyBhbmQgYWxsb3dzIGV2ZXJ5dGhpbmcgdG8gY29tcGlsZSBwcm9wZXJseS4gIEhvd2V2ZXIsCiAgICAgICAgICAgdG8gY2xlYW4gdXAgdGhlIGdlbmVyYXRlZCBjb2RlIGEgbGl0dGxlIGJpdCwgdGhlIHBhcnNlciBrZWVwcwogICAgICAgICAgIHRyYWNrIG9mIHRoZSB0ZW1wbGF0ZSB0eXBlcyBhbmQgcGVyZm9ybXMgYmFjay1zdWJzdGl0dXRpb24gdG8KICAgICAgICAgICB0aGUgb3JpZ2luYWwgdHlwZSB3aGVuIGJ1aWxkaW5nIHRoZSBwYXJzZSB0cmVlLiAgVGh1cywgZXZlbgogICAgICAgICAgIHRob3VnaCB0aGUgaW1wbGljaXQgdHlwZWRlZiBpcyB1c2VkIGluIHRoZSBpbnB1dCBhbmQgbWF5IGFwcGVhcgogICAgICAgICAgIGluIHRoZSBnZW5lcmF0ZWQgd3JhcHBlciBmaWxlIChmb3IgcHJvcGVyIGNvbXBpbGF0aW9uKSwgdGhlIHBhcnNlCiAgICAgICAgICAgdHJlZSB3aWxsIGhpZGUgYSBsb3Qgb2YgdGhlc2UgZGV0YWlscy4gICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgdm9pZCBibGFoKGNvbnN0IF9fc3dpZ3RtcGwxIHgpIHsgc3R1ZmYgfTsKCiAgICAgICAgICAgd2lsbCBsb29rIGxpa2UgaXQgd2FzIGRlY2xhcmVkIGFzIGZvbGxvd3MgKHdoaWNoIGlzIHdoYXQKICAgICAgICAgICB5b3Ugd2FudCk6CgogICAgICAgICAgICAgIHZvaWQgYmxhaChpbnQgKmNvbnN0IHgpIHsgc3R1ZmYgfQoKICAgICAgICAgICBUaGUgb25seSBwbGFjZSB5b3UgYXJlIGxpa2VseSB0byBub3RpY2UgdGhlIHR5cGVkZWYgaGFjawogICAgICAgICAgIGlzIGluIGJvZGllcyBvZiB0ZW1wbGF0ZSBmdW5jdGlvbnMuICBGb3IgZXhhbXBsZSwgaWYgeW91CiAgICAgICAgICAgZGlkIHRoaXMsCgogICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIGJsYWggewogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAlYWRkbWV0aG9kcyB7CiAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBzcGFtKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIFQgIHRlbXB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICB5b3Ugd2lsbCBmaW5kIHRoYXQgJ1QgdGVtcHZhbHVlJyBnb3QgZXhwYW5kZWQgaW50byBzb21lCiAgICAgICAgICAgc3RyYW5nZSB0eXBlZGVmIHR5cGUuICBUaGlzICpzdGlsbCogY29tcGlsZXMgY29ycmVjdGx5IAogICAgICAgICAgIHNvIGl0J3Mgbm90IGEgYmlnIGRlYWwgKG90aGVyIHRoYW4gbG9va2luZyBraW5kIG9mIHVnbHkKICAgICAgICAgICBpbiB0aGUgd3JhcHBlciBmaWxlKS4KCjEwLzQvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIHNvbWUgaW5oZXJpdGFuY2UgcHJvYmxlbXMgaW4gVGNsIE9iamVjdCBpbnRlcmZhY2UuCgoxMC8xLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBUY2wgbW9kdWxlIGhhcyBjaGFuZ2VkIHRvIHVzZSBieXRlLWJhY2tlZCBwb2ludGVyIHN0cmluZ3MuICBUaGlzCiAgICAgICAgICAgaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlIHNhZmUgb24gNjQtYml0IHBsYXRmb3Jtcy4gIEhvd2V2ZXIsCiAgICAgICAgICAgdGhlIG9yZGVyIGluIHdoaWNoIGRpZ2l0cyBhcHBlYXIgaW4gcG9pbnRlciB2YWx1ZXMgbm8gbG9uZ2VyCiAgICAgICAgICAgZGlyZWN0bHkgY29ycmVzcG9uZHMgdG8gdGhlIGFjdHVhbCBudW1lcmljYWwgdmFsdWUgb2YgYQogICAgICAgICAgIHBvaW50ZXIgKG9uIGxpdHRsZS1lbmRpYW4gbWFjaGluZXMsIHBhaXJzIG9mIGRpZ2l0cyBhcHBlYXIKICAgICAgICAgICBpbiByZXZlcnNlIG9yZGVyKS4KCjEwLzEvMjAwMTogYmVhemxleQogICAgICAgICAgIFBlcmw1IG1vZHVsZSBpcyBub3cgZHJpdmVuIGJ5IGEgY29uZmlndXJhdGlvbiBmaWxlICdwZXJsNS5zd2cnCiAgICAgICAgICAgaW4gdGhlIFNXSUcgbGlicmFyeS4KCjEwLzEvMjAwMTogYmVhemxleQogICAgICAgICAgIFRoZSBwZXJsNSBtb2R1bGUgbm8gbG9uZ2VyIHRyaWVzIHRvIGFwcGx5IHRoZSAib3V0IiB0eXBlbWFwCiAgICAgICAgICAgaW4gY29kZSBnZW5lcmF0ZWQgZm9yIG1hZ2ljIHZhcmlhYmxlcy4gIEknbSBzdXJwcmlzZWQgdGhhdAogICAgICAgICAgIHRoaXMgZXZlciB3b3JrZWQgYXQgYWxsIChzaW5jZSBhbGwgb2YgdGhlIGNvZGUgdGhhdCB3YXMgdGhlcmUKICAgICAgICAgICB3YXMgd3JvbmcgYW55d2F5cykuICAgVXNlIHRoZSAidmFyb3V0IiB0eXBlbWFwIHRvIGhhbmRsZQogICAgICAgICAgIGdsb2JhbCB2YXJpYWJsZXMuCgoxMC8xLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBhIGJ1ZyByZWxhdGVkIHRvIGNoYXJhY3RlciBhcnJheSBtZW1iZXJzIG9mIHN0cnVjdHVyZXMuCiAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgICBjaGFyIG5hbWVbMzJdOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgU1dJRyBpcyBub3JtYWxseSBzdXBwb3NlZCB0byByZXR1cm4gYSBzdHJpbmcsIGJ1dCB0aGlzIHdhcwogICAgICAgICAgIGJyb2tlbiBpbiAxLjMuOS4gICBUaGUgcmVhc29uIGl0IHdhcyBicm9rZW4gd2FzIGFjdHVhbGx5CiAgICAgICAgICAgZHVlIHRvIGEgc3VidGxlIG5ldyBmZWF0dXJlIG9mIHR5cGVtYXBzLiAgV2hlbiBhIGRhdGEgbWVtYmVyCiAgICAgICAgICAgaXMgc2V0IHRvIGFuIGFycmF5IGxpa2UgdGhpcywgdGhlIHJldHVybiB0eXBlIG9mIHRoZSByZWxhdGVkCiAgICAgICAgICAgYWNjZXNzb3IgZnVuY3Rpb24gaXMgYWN0dWFsbHkgc2V0IHRvIGFuIGFycmF5LiAgVGhpcyBtZWFucwogICAgICAgICAgIHRoYXQgeW91IGNhbiBub3cgd3JpdGUgdHlwZW1hcHMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAldHlwZW1hcChweXRob24sb3V0KSBjaGFyIFtBTlldIHsKICAgICAgICAgICAgICAgICAkdGFyZ2V0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoJHNvdXJjZSwkZGltMCk7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICBUaGlzIGZ1bmN0aW9uYWxpdHkgY2FuIGJlIHVzZWQgdG8gcmVwbGFjZSB0aGUgZGVmdW5jdAogICAgICAgICAgIG1lbWJlcm91dCB0eXBlbWFwIGluIGEgbW9yZSBlbGVnYW50IG1hbm5lci4KCjkvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgIFNvbWUgZnVydGhlciByZWZpbmVtZW50IG9mIHF1YWxpZmllZCBDKysgbWVtYmVyIGZ1bmN0aW9ucy4KICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB2b2lkIGZvbygpIGNvbnN0OwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgKGkpIFRoZSBTV0lHIHBhcnNlciB3YXMgZXh0ZW5kZWQgc2xpZ2h0bHkgdG8gYWxsb3cgJ3ZvbGF0aWxlJwogICAgICAgICAgIGFuZCBjb21iaW5hdGlvbnMgb2YgJ2NvbnN0JyBhbmQgJ3ZvbGF0aWxlJyB0byBiZSB1c2VkLiAgVGhpcwogICAgICAgICAgIGlzIHByb2JhYmx5IHJhcmUsIGJ1dCB0ZWNobmljYWxseSBsZWdhbC4gIE9ubHkgYWRkZWQgZm9yCiAgICAgICAgICAgY29tcGxldGVuZXNzLgoKICAgICAgICAgICAoaWkpIEZvciB0aGUgcHVycG9zZXMgb2Ygb3ZlcmxvYWRpbmcsIHF1YWxpZmllZCBhbmQgbm9uLXF1YWxpZmllZAogICAgICAgICAgIGZ1bmN0aW9ucyBhcmUgZGlmZmVyZW50LiAgVGh1cywgd2hlbiBhIGNsYXNzIGhhcyBtZXRob2RzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgdm9pZCBmb28oKTsKICAgICAgICAgICAgICAgICB2b2lkIGZvbygpIGNvbnN0OwoKICAgICAgICAgICBUd28gZGlzdGluY3QgbWV0aG9kcyBhcmUgZGVjbGFyZWQuICBUbyBkZWFsIHdpdGggdGhpcywgJXJlbmFtZQogICAgICAgICAgIGFuZCBzaW1pbGFyIGRpcmVjdGl2ZXMgaGF2ZSBiZWVuIGV4dGVuZGVkIHRvIHJlY29nbml6ZSBjb25zdC4KICAgICAgICAgICBUaHVzLCBvbmUgY2FuIGRpc2FtYmlndWF0ZSB0aGUgdHdvIGZ1bmN0aW9ucyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgJXJlbmFtZShmb29jb25zdCkgRm9vOjpmb28oKSBjb25zdDsKCiAgICAgICAgICAgb3Igc2ltcGx5IGlnbm9yZSB0aGUgY29uc3QgdmFyaWFudCBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgJWlnbm9yZSBGb286OmZvbygpIGNvbnN0OwoKICAgICAgICAgICBOb3RlOiBTV0lHIGN1cnJlbnRseSBoYXMgbm8gd2F5IHRvIGFjdHVhbGx5IGludm9rZSB0aGUgY29uc3QKICAgICAgICAgICBtZW1iZXIgc2luY2UgdGhlICdjb25zdCcgaXMgZGlzY2FyZGVkIHdoZW4gZ2VuZXJhdGluZyB3cmFwcGVycwogICAgICAgICAgIGZvciBvYmplY3RzLiAgCgo5LzI3LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBOZXcgZGlyZWN0aXZlLiAlbmFtZXdhcm4gY2FuIGJlIHVzZWQgdG8gaXNzdWUgd2FybmluZwogICAgICAgICAgIG1lc3NhZ2VzIGZvciBjZXJ0YWluIGRlY2xhcmF0aW9uIG5hbWVzLiAgIFRoZSBuYW1lCiAgICAgICAgICAgbWF0Y2hpbmcgaXMgdGhlIHNhbWUgYXMgZm9yIHRoZSAlcmVuYW1lIGRpcmVjdGl2ZS4KICAgICAgICAgICBUaGUgaW50ZW50IG9mIHRoaXMgZGlyZWN0aXZlIGlzIHRvIGlzc3VlIHdhcm5pbmdzIGZvcgogICAgICAgICAgIHBvc3NpYmxlIG5hbWVzcGFjZSBjb25mbGljdHMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJW5hbWV3YXJuKCJwcmludCBpcyBhIHB5dGhvbiBrZXl3b3JkIikgcHJpbnQ7CgogICAgICAgICAgIFRoZSBuYW1lIG1hdGNoaW5nIGFsZ29yaXRobSBpcyBwZXJmb3JtZWQgYWZ0ZXIgYSBuYW1lCiAgICAgICAgICAgaGFzIGJlZW4gcmVzb2x2ZWQgdXNpbmcgJXJlbmFtZS4gIFRoZXJlZm9yZSwgYQogICAgICAgICAgIGRlY2xhcmF0aW9uIGxpa2UgdGhpcyB3aWxsIG5vdCBnZW5lcmF0ZSBhIHdhcm5pbmc6CgogICAgICAgICAgICAgICVyZW5hbWUoIlByaW50IikgcHJpbnQ7CiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgdm9pZCBwcmludCgpOyAgICAvKiBObyB3YXJuaW5nIGdlbmVyYXRlZCAqLwoKICAgICAgICAgICBTaW5jZSB0aGUgd2FybmluZyBtZWNoYW5pc20gZm9sbG93cyAlcmVuYW1lIHNlbWFudGljcywgaXQgaXMKICAgICAgICAgICBhbHNvIHRvIGlzc3VlIHdhcm5pbmdzIGZvciBzcGVjaWZpYyBjbGFzc2VzIG9yIGp1c3QgZm9yCiAgICAgICAgICAgY2VydGFpbiBtZW1iZXIgZnVuY3Rpb24gbmFtZXMuCgogICAgICAgICAgIChEYXZlIC0gSSd2ZSBiZWVuIHRoaW5raW5nIGFib3V0IGFkZGluZyBzb21ldGhpbmcgbGlrZSB0aGlzCiAgICAgICAgICAgZm9yIHF1aXRlIHNvbWUgdGltZS4gIEp1c3QgbmV2ZXIgZ290IGFyb3VuZCB0byBpdCkKICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoKOS8yNy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRW5oYW5jZWQgdGhlICVpZ25vcmUgZGlyZWN0aXZlIHNvIHRoYXQgd2FybmluZyBtZXNzYWdlcwogICAgICAgICAgIGNhbiBiZSBpc3N1ZWQgdG8gdXNlcnMuICAgVGhpcyBpcyBkb25lIHVzaW5nICVpZ25vcmV3YXJuCiAgICAgICAgICAgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICVpZ25vcmV3YXJuKCJvcGVyYXRvciBuZXcgaWdub3JlZCIpIG9wZXJhdG9yIG5ldzsKCiAgICAgICAgICAgVGhlIG5hbWVzIGFuZCBzZW1hbnRpY3Mgb2YgJWlnbm9yZXdhcm4gaXMgZXhhY3RseSB0aGUgCiAgICAgICAgICAgc2FtZSBhcyAlaWdub3JlLiBUaGUgcHJpbWFyeSBwdXJwb3NlIG9mIHRoaXMgZGlyZWN0aXZlCiAgICAgICAgICAgaXMgZm9yIG1vZHVsZSB3cml0ZXJzIHdobyB3YW50IHRvIGlnbm9yZSBjZXJ0YWluIHR5cGVzCiAgICAgICAgICAgb2YgZGVjbGFyYXRpb25zLCBidXQgd2hvIGFsc28gd2FudCB0byBhbGVydCB1c2VycyBhYm91dCBpdC4KICAgICAgICAgICBBIHVzZXIgbWlnaHQgYWxzbyB1c2UgdGhpcyBmb3IgZGVidWdnaW5nIChzaW5jZSBtZXNzYWdlcwogICAgICAgICAgIHdpbGwgYXBwZWFyIHdoZW5ldmVyIGFuIGlnbm9yZWQgZGVjbGFyYXRpb24gYXBwZWFycykuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOS8yNi8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgU3VwZXItZXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIG92ZXJsb2FkZWQgb3BlcmF0b3JzLiAKICAgICAgICAgICBUaGlzIGltcGxlbWVudGF0aW9uIGNvbnNpc3RzIG9mIGEgZmV3IGRpZmZlcmVudCBwYXJ0cy4KCiAgICAgICAgICAgKGkpIE9wZXJhdG9yIG5hbWVzIHN1Y2ggYXMgJ29wZXJhdG9yKycgYXJlIG5vdyBhbGxvd2VkCiAgICAgICAgICAgYXMgdmFsaWQgZGVjbGFyYXRvciBuYW1lcy4gIFRodXMgdGhlICdvcGVyYXRvcicgc3ludGF4CiAgICAgICAgICAgY2FuIGFwcGVhciAqYW55cGxhY2UqIGEgbm9ybWFsIGRlY2xhcmF0b3IgbmFtZSB3YXMgdXNlZAogICAgICAgICAgIGJlZm9yZS4gIE9uIHRoZSBzdXJmYWNlLCB0aGlzIG1lYW5zIHRoYXQgb3BlcmF0b3JzIGNhbgogICAgICAgICAgIGJlIHBhcnNlZCBqdXN0IGxpa2Ugbm9ybWFsIGZ1bmN0aW9ucyBhbmQgbWV0aG9kcy4gCiAgICAgICAgICAgSG93ZXZlciwgaXQgYWxzbyBtZWFucyB0aGF0IG9wZXJhdG9yIG5hbWVzIGNhbiBiZSB1c2VkCiAgICAgICAgICAgaW4gbWFueSBvdGhlciBTV0lHIGRpcmVjdGl2ZXMgbGlrZSAlcmVuYW1lLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAlcmVuYW1lKF9fYWRkX18pIENvbXBsZXg6Om9wZXJhdG9yKyhjb25zdCBDb21wbGV4ICYpOwoKICAgICAgICAgICAoaWkpIE9wZXJhdG9ycyBhcmUgd3JhcHBlZCAqZXhhY3RseSogbGlrZSBub3JtYWwgZnVuY3Rpb25zCiAgICAgICAgICAgYW5kIG1ldGhvZHMuICBJbnRlcm5hbGx5LCB0aGUgb3BlcmF0b3IgbmFtZSBpcyB1c2VkIAogICAgICAgICAgIGRpcmVjdGx5IG1lYW5pbmcgdGhhdCB0aGUgd3JhcHBlciBjb2RlIG1pZ2h0IGNvbnRhaW4KICAgICAgICAgICBzdGF0ZW1lbnRzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBhcmcwLT5vcGVyYXRvciooKENvbXBsZXggY29uc3QgJikqYXJnMSk7CgogICAgICAgICAgIFRoaXMgYWxsIHNlZW1zIHRvIHBhcnNlIGFuZCBjb21waWxlIGNvcnJlY3RseSAoYXQgbGVhc3QKICAgICAgICAgICBvbiBteSBtYWNoaW5lKS4KCiAgICAgICAgICAgKGlpaSkgU1dJRyB3aWxsIG5vIGxvbmdlciB3cmFwIGEgZGVjbGFyYXRpb24gaWYgaXRzIHN5bWJvbAogICAgICAgICAgIHRhYmxlIG5hbWUgY29udGFpbnMgaWxsZWdhbCBpZGVudGlmaWVyIGNoYXJhY3RlcnMuICBJZgogICAgICAgICAgIGlsbGVnYWwgY2hhcmFjdGVycyBhcmUgZGV0ZWN0ZWQsIHlvdSB3aWxsIHNlZSBhbiBlcnJvcgogICAgICAgICAgIGxpa2UgdGhpczoKIAogICAgICAgICAgICAgICAgV2FybmluZy4gQ2FuJ3Qgd3JhcCBvcGVyYXRvciogdW5sZXNzIHJlbmFtZWQgdG8gYSB2YWxpZCBpZGVudGlmaWVyLgoKICAgICAgICAgICBUaGUgb25seSB3YXkgdG8gZml4IHRoaXMgaXMgdG8gdXNlICVyZW5hbWUgb3IgJW5hbWUgdG8gYmluZAogICAgICAgICAgIHRoZSBvcGVyYXRvciB0byBhIG5pY2UgbmFtZSBsaWtlICJhZGQiIG9yIHNvbWV0aGluZy4gTm90ZToKICAgICAgICAgICB0aGUgbGVnYWwgaWRlbnRpZmllciBjaGFyYWN0ZXJzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSB0YXJnZXQKICAgICAgICAgICBsYW5ndWFnZS4KCiAgICAgICAgICAgVGhlcmUgYXJlIGNlcnRhaW4gaXNzdWVzIHdpdGggZnJpZW5kIGZ1bmN0aW9ucyBhbmQgb3BlcmF0b3JzLgogICAgICAgICAgIFNvbWV0aW1lcywgZnJpZW5kcyBhcmUgdXNlZCB0byBkZWZpbmUgbWl4ZWQgb3BlcmF0b3JzIHN1Y2gKICAgICAgICAgICBhcyBhZGRpbmcgYSBDb21wbGV4IGFuZCBhIGRvdWJsZSB0b2dldGhlci4gIEN1cnJlbnRseSwgU1dJRwogICAgICAgICAgIGlnbm9yZXMgYWxsIGZyaWVuZCBkZWNsYXJhdGlvbnMgaW4gYSBjbGFzcy4gIEEgZ2xvYmFsIG9wZXJhdG9yCiAgICAgICAgICAgZGVjbGFyYXRpb24gY2FuIHByb2JhYmx5IGJlIG1hZGUgdG8gd29yaywgYnV0IHlvdSdsbCBoYXZlIHRvCiAgICAgICAgICAgcmVuYW1lIGl0IGFuZCBpdCBwcm9iYWJseSB3b24ndCB3b3JrIHZlcnkgY2xlYW5seSBpbiB0aGUKICAgICAgICAgICB0YXJnZXQgbGFuZ3VhZ2Ugc2luY2UgaXQncyBub3QgYSBjbGFzcyBtZW1iZXIuCgogICAgICAgICAgIFNXSUcgZG9lc24ndCBrbm93IGhvdyB0byBoYW5kbGUgb3BlcmF0b3Igc3BlY2lmaWNhdGlvbnMgCiAgICAgICAgICAgc29tZXRpbWVzIHVzZWQgZm9yIGF1dG9tYXRpYyB0eXBlIGNvbnZlcnNpb24uIEZvciBleGFtcGxlOgoKICAgICAgICAgICBjbGFzcyBTdHJpbmcgewogICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIG9wZXJhdG9yIGNvbnN0IGNoYXIqKCk7CiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgfTsKCiAgICAgICAgICAgKHRoaXMgZG9lc24ndCBwYXJzZSBjb3JyZWN0bHkgYW5kIGdlbmVyYXRlcyBhIHN5bnRheCBlcnJvcikuCgogICAgICAgICAgIEFsc286IG9wZXJhdG9ycyBubyBsb25nZXIgc2hvdyB1cCBhcyBzZXBhcmF0ZSBwYXJzZS10cmVlCiAgICAgICAgICAgbm9kZXMgKGluc3RlYWQgdGhleSBhcmUgbm9ybWFsICdjZGVjbCcgbm9kZXMpLiAgSSBtYXkKICAgICAgICAgICBzZXBhcmF0ZSB0aGVtIGFzIGEgc3BlY2lhbCBjYXNlIGxhdGVyLgoKICAgICAgICAgICBTZWUgRXhhbXBsZXMvcHl0aG9uL29wZXJhdG9yIGZvciBhbiBleGFtcGxlLgoKICAgICAgICAgICAqKiogU1VQRVItRVhQRVJJTUVOVEFMIE5FVyBGRUFUVVJFICoqKgoKVmVyc2lvbiAxLjMuOSAoU2VwdGVtYmVyIDI1LCAyMDAxKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo5LzI1LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBwYXJzaW5nIHByb2JsZW0gd2l0aCB0eXBlIGRlY2xhcmF0aW9ucyBsaWtlIAogICAgICAgICAgICdjaGFyICoqIGNvbnN0Jy4gIFNXSUcgcGFyc2VkIHRoaXMgY29ycmVjdGx5LCBidXQgdGhlCiAgICAgICAgICAgaW50ZXJuYWwgdHlwZSB3YXMgcmVwcmVzZW50ZWQgaW5jb3JyZWN0bHkgKHRoZSBwb2ludGVycwogICAgICAgICAgIGFuZCBxdWFsaWZpZXJzIHdlcmUgaW4gdGhlIHdyb25nIG9yZGVyKS4KCjkvMjUvMjAwMTogYmVhemxleQogICAgICAgICAgIFdpdGhkcmV3IGV4cGVyaW1lbnRhbCBmZWF0dXJlIChub3RlZCBiZWxvdykgdGhhdCB3YXMKICAgICAgICAgICBjYXVzaW5nIHNlcmlvdXMgcGFyc2luZyBwcm9ibGVtcy4KClZlcnNpb24gMS4zLjggKFNlcHRlbWJlciAyMywgMjAwMSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKOS8yMy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgSW5jbHVkZWQgaW1wcm92ZWQgZGlzdHV0aWxzIHNldHVwLnB5IGZpbGUgaW4gdGhlIFRvb2xzIAogICAgICAgICAgIGRpcmVjdG9yeSAobG9vayBmb3IgdGhlIHNldHVwLnB5LnRtcGwgZmlsZSkuICBDb250cmlidXRlZCBieQogICAgICAgICAgIFRvbnkgU2V3YXJkLgoKOS8yMy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgSW5jbHVkZWQgdHdvIG5ldyBSUE0gc3BlYyBmaWxlcyBpbiB0aGUgVG9vbHMgZGlyZWN0b3J5LiBDb250cmlidXRlZAogICAgICAgICAgIGJ5IFRvbnkgU2V3YXJkIGFuZCBVd2UgU3RlaW5tYW5uLgogIAo5LzIxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBCdWcgWyAjNDYzNjM1IF0gUGVybDUuc3dnIGRvZXMgbm90IGNvbXBpbGUgaW4gVmlzdWFsIEMrKwoKOS8yMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgVHdvIG5ldyBkaXJlY3RpdmVzIGNvbnRyb2wgdGhlIGNyZWF0aW9uIG9mIGRlZmF1bHQKICAgICAgICAgICBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzOgoKICAgICAgICAgICAgICAgICVub2RlZmF1bHQKICAgICAgICAgICAgICAgICVtYWtlZGVmYXVsdAoKICAgICAgICAgICBUaGVzZSByZXBsYWNlICVwcmFnbWEgbm9kZWZhdWx0IGFuZCAlcHJhZ21hIG1ha2VkZWZhdWx0LgogICAgICAgICAgIChvbGQgY29kZSB3aWxsIHN0aWxsIHdvcmssIGJ1dCBkb2N1bWVudGF0aW9uIHdpbGwgb25seQogICAgICAgICAgIGRlc2NyaWJlIHRoZSBuZXcgZGlyZWN0aXZlcykuCgo5LzIxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBCdWcgWyAjNDYyMzU0IF0gJWltcG9ydCBicm9rZW4gaW4gMS4zLjcuCgo5LzIwLzIwMDE6IGJlYXpsZXkKCiAgICAgICAgICAgUGFyc2VyIG1vZGlmaWVkIHRvIGlnbm9yZSBvdXQtb2YtY2xhc3MgY29uc3RydWN0b3IKICAgICAgICAgICBhbmQgZGVzdHJ1Y3RvciBkZWNsYXJhdGlvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGlubGluZSBGb286OkZvbygpIDoKICAgICAgICAgICAgICAgICAgICBCYXIoImZvbyIpCiAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgIH0gCgogICAgICAgICAgICAgICBpbmxpbmUgRm9vOjp+Rm9vKCkgewogICAgICAgICAgICAgICB9CgogICAgICAgICAgIFN1Z2dlc3RlZCBieSBKYXNvbiBTdGV3YXJ0LgogICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgRkVBVFVSRSAqKioKCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIE1vZGlmaWVkIHRoZSBwYXJzZXIgdG8gaWdub3JlIGZvcndhcmQgdGVtcGxhdGUgY2xhc3MKICAgICAgICAgICBkZWNsYXJhdGlvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFYsIGxvbmcgUz4gY2xhc3MgTWFwSXRlcjsKCiAgICAgICAgICAgU3VnZ2VzdGVkIGJ5IGFuIGVtYWlsIGV4YW1wbGUgZnJvbSBJcmluYSBLb3Rsb3ZhLgoKOS8yMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIHVuZGVjbGFyZWQgdGNsX3Jlc3VsdCB2YXJpYWJsZSBpbiAKICAgICAgICAgICB0aGUgIm91dCIgdHlwZW1hcCBmb3IgVGNsLiAgUmVwb3J0ZWQgYnkgU2hhdW4gTG93cnkuCgo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBJbmNvcnBvcmF0ZWQgY2hhbmdlcyB0byBtYWtlIFNXSUcgd29yayB3aXRoIEFjdGl2ZVBlcmwuICAKICAgICAgICAgICBDb250cmlidXRlZCBieSBKb2VsIFJlZWQuCgo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTbGlnaHQgY2hhbmdlIHRvIHRoZSBwYXJzaW5nIG9mIEMrKyBjb25zdHJ1Y3RvciBpbml0aWFsaXplcnMuCiAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgIGNsYXNzIEZvbyA6IHB1YmxpYyBCYXIgewogICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgRm9vKCkgOiBCYXIoLi4uKSB7Li4ufQogICAgICAgICAgIH07CgogICAgICAgICAgIFNXSUcgbm93IGRpc2NhcmRzIHRoZSBjb250ZW50cyBvZiB0aGUgKC4uLikgcmVnYXJkbGVzcyBvZiAKICAgICAgICAgICB3aGF0IG1pZ2h0IGVuY2xvc2VkIChldmVuIGlmIHN5bnRhY3RpY2FsbHkgd3JvbmcpLiAgU1dJRwogICAgICAgICAgIGRvZXNuJ3QgbmVlZCB0aGlzIGluZm9ybWF0aW9uIGFuZCB0aGVyZSBpcyBubyByZWFzb24gdG8KICAgICAgICAgICBuZWVkbGVzcyBhZGQgc3ludGF4IHJ1bGVzIHRvIGhhbmRsZSBhbGwgb2YgdGhlIHBvc3NpYmlsaXRpZXMKICAgICAgICAgICBoZXJlLgoKOS8yMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlIHRvIHR5cGVtYXBzIGZvciBzdHJ1Y3R1cmUgbWVtYmVycy4gIElmIHlvdSBoYXZlIGEKICAgICAgICAgICBzdHJ1Y3R1cmUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICBzdHJ1Y3QgVmVjdG9yIHsKICAgICAgICAgICAgICAgIGludCAqYmFyOwogICAgICAgICAgICAgIH07CgogICAgICAgICAgIFRoZSBtZW1iZXIgbmFtZSAnYmFyJyBpcyBub3cgdXNlZCBpbiBhbnkgYWNjZXNzb3IgZnVuY3Rpb25zLgogICAgICAgICAgIFRoaXMgYWxsb3dzIHRoZSAiaW4iIHR5cGVtYXAgdG8gYmUgdXNlZCB3aGVuIHNldHRpbmcgdGhlIHZhbHVlLgogICAgICAgICAgIEZvciBleGFtcGxlLCB0aGlzIHR5cGVtYXAKCiAgICAgICAgICAgICAgICV0eXBlbWFwKHB5dGhvbixpbikgaW50ICpiYXIgewogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgbm93IG1hdGNoZXMgVmVjdG9yOjpiYXIuICBJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB0aGlzIHdpbGwgYWxzbwogICAgICAgICAgIG1hdGNoIGFueSBmdW5jdGlvbiB3aXRoIGFuIGFyZ3VtZW50IG9mICJpbnQgKmJhciIgKHNvIHlvdSBzaG91bGQKICAgICAgICAgICBiZSBjYXJlZnVsKS4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUuIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBidWcgIzQ2MjY0MiBzZXR0aW5nIHN0cmluZyB2YWx1ZXMgaW4gc3RydWN0dXJlcwoKOS8yMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgYnVnICM0NjIzOTggcHJvYmxlbSB3aXRoIG5lc3RlZCB0ZW1wbGF0ZXMuCgo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBidWcgIzQ2MTYyNiBwcm9ibGVtIHdpdGggZm9ybWF0dGluZyBhbmQgQysrIGNvbW1lbnRzLgogICAgICAgICAgICAKOS8yMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgYnVnICM0NjI4NDUgV3Jvbmcgb3duZXJzaGlwIG9mIHJldHVybmVkIG9iamVjdHMuCiAgICAgICAgICAgCjkvMTkvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIGJ1ZyAjNDU5MzY3LiAgRGVmYXVsdCBjb25zdHJ1Y3RvcnMgZm9yIGNsYXNzZXMKICAgICAgICAgICB3aXRoIHB1cmUgdmlydHVhbCBtZXRob2RzLgoKOS8xOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIGFuZCBjbGFzcyBzY29wZS4gIEZvcgogICAgICAgICAgIGV4YW1wbGU6CgogICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgIGVudW0gYmFyIHsgRk9PLCBCQVIgfTsKICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKGJhciBiID0gRk9PKTsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgU1dJRyBub3cgY29ycmVjdGx5IGdlbmVyYXRlcyBhIGRlZmF1bHQgdmFsdWUgb2YgIkZvbzo6Rk9PIiBmb3IKICAgICAgICAgICB0aGUgYmxhaCgpIG1ldGhvZCBhYm92ZS4gIFRoaXMgdXNlZCB0byB3b3JrIGluIDEuMSwgYnV0IHdhcwogICAgICAgICAgIGJyb2tlbiBpbiAxLjMuNy4gICBCdWcgcmVwb3J0ZWQgYnkgTWlrZSBSb21iZXJnLgoKVmVyc2lvbiAxLjMuNyAgKFNlcHRlbWJlciAzLCAyMDAxKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo5LzAyLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCBzcGVjaWFsICVpZ25vcmUgZGlyZWN0aXZlIHRvIGlnbm9yZSBkZWNsYXJhdGlvbnMuICBUaGlzCiAgICAgICAgICAgZmVhdHVyZSB3b3JrcyBleGFjdGx5IGxpa2UgJXJlbmFtZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICVpZ25vcmUgIGZvbzsgICAgICAgIC8vIElnbm9yZSBhbGwgZGVjbGFyYXRpb25zIGZvbwogICAgICAgICAgICAgJWlnbm9yZSAgOjpmb287ICAgICAgLy8gT25seSBpZ25vcmUgZm9vIGluIGdsb2JhbCBzY29wZQogICAgICAgICAgICAgJWlnbm9yZSAgU3BhbTo6Zm9vOyAgLy8gT25seSBpZ25vcmUgaW4gY2xhc3MgU3BhbQogICAgICAgICAgICAgJWlnbm9yZSAgKjo6Zm9vOyAgICAgLy8gSWdub3JlIGluIGFsbCBjbGFzc2VzCgogICAgICAgICAgICVpZ25vcmUgY2FuIGFsc28gYmUgcGFyYW1ldGVyaXplZC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICVpZ25vcmUgZm9vKGludCk7CiAgICAgICAgICAgICAlaWdub3JlIDo6Zm9vKGludCk7CiAgICAgICAgICAgICAlaWdub3JlIFNwYW06OmZvbyhpbnQpOwogICAgICAgICAgICAgJWlnbm9yZSAqOjpmb28oaW50KTsKCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgICAKCjkvMDIvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIHNoYWRvd2NvZGUgcHJhZ21hIG1vZGlmaWVkIHNvIHRoYXQgdGhlIGNvZGUgdGhhdCBpcyBvdXRwdXQgCiAgICAgICAgICAgaW4gdGhlIHNoYWRvdyBmaWxlIGlzIHBsYWNlZCByZWxhdGl2ZSB0byB3aGVyZSBpdCBpcyBwbGFjZWQgaW4gdGhlIAogICAgICAgICAgIGMvYysrIGNvZGUuIFRoaXMgYWxsb3dzIHN1cHBvcnQgZm9yIEphdmFEb2MgZnVuY3Rpb24gY29tbWVudHMuIAoKOS8wMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgUGF0Y2ggWyAjNDQ3NzkxIF0gRml4IGZvciBweXRob24gLWludGVyZmFjZSBvcHRpb24uCiAgICAgICAgICAgU3VibWl0dGVkIGJ5IFRhcm4gV2Vpc25lciBCdXJ0b24uCgo5LzAxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTV0lHIG5vIGxvbmdlciBnZW5lcmF0ZXMgZGVmYXVsdCBjb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcnMKICAgICAgICAgICBmb3IgYSBjbGFzcyBpZiBpdCBvbmx5IGRlZmluZXMgYSBwcml2YXRlL3Byb3RlY3RlZCBjb25zdHJ1Y3RvcgogICAgICAgICAgIG9yIGRlc3RydWN0b3Igb3IgaWYgYW55IG9uZSBvZiBpdHMgYmFzZSBjbGFzc2VzIG9ubHkgaGFzCiAgICAgICAgICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcnMuICBUaGlzIHdhcyByZXBvcnRlZCBpbgogICAgICAgICAgIFNGIFBhdGNoIFsgIzQ0NDI4MSBdIG5vbnB1YmxpYy9kZWZhdWx0L2luaGVyZXRlZCBjdG9yL2R0b3IKICAgICAgICAgICBieSBNYXJjZWxvIE1hdHVzLgoKOS8wMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgcGF0Y2ggdG8gUGVybDUgbW9kdWxlIHRoYXQgYWxsb3dzIGNvbnN0YW50cyB0byBiZQogICAgICAgICAgIHdyYXBwZWQgYXMgY29uc3RhbnRzIHRoYXQgZG9uJ3QgcmVxdWlyZSB0aGUgbGVhZGluZyAkLgogICAgICAgICAgIFRoaXMgZmVhdHVyZSBpcyBlbmFibGVkIHVzaW5nIHRoZSAtY29uc3Qgb3B0aW9uLgogICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IFJpY2ggV2FsZXMuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8zMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgcGFyc2luZyBzdXBwb3J0IGZvciB0aGUgJ3ZvbGF0aWxlJyB0eXBlIHF1YWxpZmllci4KICAgICAgICAgICB2b2xhdGlsZSBkb2Vzbid0IG1lYW4gYW55dGhpbmcgdG8gU1dJRywgYnV0IGl0IGlzCiAgICAgICAgICAgbmVlZGVkIHRvIHByb3Blcmx5IGdlbmVyYXRlIHByb3RvdHlwZXMgZm9yIGRlY2xhcmF0aW9ucwogICAgICAgICAgIHRoYXQgdXNlIGl0LiAgSXQncyBhbHNvIGJlZW4gYWRkZWQgdG8gbWFrZSB0aGUgU1dJRyB0eXBlCiAgICAgICAgICAgc3lzdGVtIG1vcmUgY29tcGxldGUuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8zMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgcGFyYW1ldGVyaXplZCAlcmVuYW1lIGRpcmVjdGl2ZS4gICoqKiBUaGlzCiAgICAgICAgICAgbmV3IGZlYXR1cmUgY2FuIGJlIHVzZWQgdG8gZ3JlYXRseSBzaW1wbGlmeSB0aGUgdGFzayBvZgogICAgICAgICAgIHJlc29sdmluZyBvdmVybG9hZGVkIG1ldGhvZHMgYW5kIGZ1bmN0aW9ucy4gKioqCiAgICAgICAgICAgCiAgICAgICAgICAgSW4gcHJpb3IgdmVyc2lvbnMgb2YgU1dJRywgdGhlICVyZW5hbWUgZGlyZWN0aXZlIHdhcwogICAgICAgICAgIHVzZWQgdG8gY29uc2lzdGVudGx5IGFwcGx5IGFuIGlkZW50aWZpZXIgcmVuYW1pbmcuIEZvciAKICAgICAgICAgICBleGFtcGxlLCBpZiB5b3Ugc2FpZCB0aGlzOgoKICAgICAgICAgICAgICAgICVyZW5hbWUgZm9vIGJhcjsKCiAgICAgICAgICAgRXZlcnkgb2NjdXJyZW5jZSBvZiAnZm9vJyB3b3VsZCBiZSByZW5hbWVkIHRvICdiYXInLiAKICAgICAgICAgICBBbHRob3VnaCB0aGlzIHdvcmtzIGZpbmUgZm9yIHJlc29sdmluZyBhIGNvbmZsaWN0IHdpdGggYQogICAgICAgICAgIHRhcmdldCBsYW5ndWFnZSByZXNlcnZlZCB3b3JkLCBpdCBpcyB1c2VsZXNzIGZvcgogICAgICAgICAgIGZvciBkZWFsaW5nIHdpdGggb3ZlcmxvYWRlZCBtZXRob2RzLiAgICBUaGlzIGlzIGJlY2F1c2UKICAgICAgICAgICBhbGwgbWV0aG9kcyBhcmUgc2ltcGx5IHJlbmFtZWQgdG8gdGhlIHNhbWUgdGhpbmcgCiAgICAgICAgICAgKGdlbmVyYXRpbmcgdGhlIHNhbWUgY29uZmxpY3QgYXMgYmVmb3JlKS4KCiAgICAgICAgICAgVGhlcmVmb3JlLCB0aGUgb25seSB3YXkgdG8gZGVhbCB3aXRoIG92ZXJsb2FkZWQgbWV0aG9kcwogICAgICAgICAgIHdhcyB0byBnbyB0aHJvdWdoIGFuZCBpbmRpdmlkdWFsbHkgcmVuYW1lIHRoZW0gYWxsIHVzaW5nCiAgICAgICAgICAgJW5hbWUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBiYXIodm9pZCk7CiAgICAgICAgICAgICAgICAgJW5hbWUoYmFyX2kpIHZpcnR1YWwgdm9pZCBiYXIoaW50KTsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgIH07CgogICAgICAgICAgIFRvIG1ha2UgbWF0dGVycyB3b3JzZSwgeW91IGhhZCB0byBkbyB0aGlzIGZvciBhbGwKICAgICAgICAgICBkZXJpdmVkIGNsYXNzZXMgdG9vLgoKICAgICAgICAgICAgIGNsYXNzIFNwYW0gOiBwdWJsaWMgRm9vIHsKICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgYmFyKHZvaWQpOwogICAgICAgICAgICAgICAgICVuYW1lKGJhcl9pKSB2aXJ0dWFsIHZvaWQgYmFyKGludCk7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICB9OwoKICAgICAgICAgICBOZWVkbGVzcyB0byBzYXksIHRoaXMgbWFrZXMgaXQgZXh0cmVtZWx5IGhhcmQgdG8gcmVzb2x2ZQogICAgICAgICAgIG92ZXJsb2FkaW5nIHdpdGhvdXQgYSBsb3Qgb2Ygd29yayBhbmQgbWFrZXMgaXQgYWxtb3N0CiAgICAgICAgICAgaW1wb3NzaWJsZSB0byB1c2UgU1dJRyBvbiByYXcgQysrIC5oIGZpbGVzLgoKICAgICAgICAgICBUbyBmaXggdGhpcywgJXJlbmFtZSBub3cgYWNjZXB0cyBwYXJhbWV0ZXIgZGVjbGFyYXRvcnMuCiAgICAgICAgICAgVGhlIHN5bnRheCBoYXMgYWxzbyBiZWVuIGNoYW5nZWQgc2xpZ2h0bHkuICBGb3IgZXhhbXBsZSwKICAgICAgICAgICB0aGUgZm9sbG93aW5nIGRlY2xhcmF0aW9uIHJlbmFtZXMgYWxsIG9jY3VycmVuY2VzIG9mICdiYXIoaW50KScKICAgICAgICAgICB0byAnYmFyX2knLCBsZWF2aW5nIGFueSBvdGhlciBvY2N1cnJlbmNlIG9mICdiYXInIGFsb25lLgoKICAgICAgICAgICAgICVyZW5hbWUoYmFyX2kpIGJhcihpbnQpOwoKICAgICAgICAgICBVc2luZyB0aGlzIGZlYXR1cmUsIHlvdSBjYW4gbm93IHNlbGVjdGl2ZWx5IHJlbmFtZSAKICAgICAgICAgICBjZXJ0YWluIGRlY2xhcmF0aW9ucyBpbiBhZHZhbmNlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgJXJlbmFtZShiYXJfaSkgYmFyKGludCk7CiAgICAgICAgICAgICAlcmVuYW1lKGJhcl9kKSBiYXIoZG91YmxlKTsKCiAgICAgICAgICAgICAvLyBJbmNsdWRlIHJhdyBDKysgaGVhZGVyICAgIAogICAgICAgICAgICAgJWluY2x1ZGUgImhlYWRlci5oIgoKICAgICAgICAgICBXaGVuICVyZW5hbWUgaXMgdXNlZCBpbiB0aGlzIG1hbm5lciwgYWxsIG9jY3VycmVuY2Ugb2YgYmFyKGludCkKICAgICAgICAgICBhcmUgcmVuYW1lZCB3aGVyZXZlciB0aGV5IG1pZ2h0IG9jY3VyLiAgTW9yZSBjb250cm9sIGlzIG9idGFpbmVkCiAgICAgICAgICAgdGhyb3VnaCBleHBsaWNpdCBxdWFsaWZpY2F0aW9uLiBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgICAgJXJlbmFtZShiYXJfaSkgOjpiYXIoaW50KTsKCiAgICAgICAgICAgb25seSBhcHBsaWVzIHRoZSByZW5hbWluZyBpZiBiYXIoaW50KSBpcyBkZWZpbmVkIGluIHRoZSBnbG9iYWwgc2NvcGUuCiAgICAgICAgICAgVGhlIGRlY2xhcmF0aW9uLAogICAgIAogICAgICAgICAgICAgICVyZW5hbWUoYmFyX2kpIEZvbzo6YmFyKGludCk7CgogICAgICAgICAgIGFwcGxpZXMgdGhlIHJlbmFtaW5nIGlmIGJhcihpbnQpIGlzIGRlZmluZWQgaW4gYSBjbGFzcyBGb28uCiAgICAgICAgICAgVGhpcyBsYXR0ZXIgZm9ybSBhbHNvIHN1cHBvcnRzIGluaGVyaXRhbmNlLiAgVGhlcmVmb3JlLCBpZiB5b3UKICAgICAgICAgICBoYWQgYSBjbGFzcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICBjbGFzcyBTcGFtIDogcHVibGljIEZvbyB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgIHZvaWQgYmFyKGludCk7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgVGhlIFNwYW06OmJhcihpbnQpIG1ldGhvZCB3b3VsZCBhbHNvIGJlIHJlbmFtZWQgKHNpbmNlIFNwYW0gCiAgICAgICAgICAgaXMgYSBzdWJjbGFzcyBvZiBGb28pLiAgIFRoaXMgbGF0dGVyIGZlYXR1cmUgbWFrZXMgaXQgZWFzeQogICAgICAgICAgIGZvciBTV0lHIHRvIGFwcGx5IGEgY29uc2lzdGVudCByZW5hbWluZyBhY3Jvc3MgYW4gZW50aXJlCiAgICAgICAgICAgY2xhc3MgaGllcmFyY2h5IHNpbXBseSBieSBzcGVjaWZ5aW5nIHJlbmFtaW5nIHJ1bGVzIGZvcgogICAgICAgICAgIHRoZSBiYXNlIGNsYXNzLgoKICAgICAgICAgICBBIGNsYXNzIHdpbGRjYXJkIG9mICogY2FuIGJlIHVzZWQgaWYgeW91IHdhbnQgdG8gcmVuYW1pbmcKICAgICAgICAgICBhbGwgbWF0Y2hpbmcgbWVtYmVycyBvZiBhbGwgY2xhc3Nlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlcmVuYW1lKGJhcl9pKSAqOjpiYXIoaW50KTsKCiAgICAgICAgICAgd2lsbCByZW5hbWUgYWxsIG1lbWJlcnMgYmFyKGludCkgdGhhdCBhcmUgZGVmaW5lZCBpbiBjbGFzc2VzLgogICAgICAgICAgIEl0IHdpbGwgbm90IHJlbmFtZWQgZGVmaW5pdGlvbnMgb2YgYmFyKGludCkgaW4gdGhlIGdsb2JhbAogICAgICAgICAgIHNjb3BlLgoKICAgICAgICAgICBUaGUgb2xkIHVzZSBvZiAlcmVuYW1lIGlzIHN0aWxsIHN1cHBvcnRlZCwgYnV0IGlzIHNvbWV3aGF0CiAgICAgICAgICAgZW5oYW5jZWQuICAKCiAgICAgICAgICAgICAgJXJlbmFtZShmb28pIGJhcjsgICAgICAvLyBSZW5hbWVzIGFsbCBvY2N1cnJlbmNlcyBvZiAnYmFyJy4KICAgICAgICAgICAgICAlcmVuYW1lKGZvbykgOjpiYXI7ICAgIC8vIFJlbmFtZSBhbGwgJ2JhcicgaW4gZ2xvYmFsIHNjb3BlIG9ubHkuCiAgICAgICAgICAgICAgJXJlbmFtZShmb28pICo6OmJhcjsgICAvLyBSZW5hbWUgYWxsICdiYXInIGluIGNsYXNzZXMgb25seS4KICAgICAgICAgICAgICAlcmVuYW1lKGZvbykgRm9vOjpiYXI7IC8vIFJlbmFtZSBhbGwgJ2JhcicgZGVmaW5lZCBpbiBjbGFzcyBGb28uCgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMzAvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIGRhdGEtbWVtYmVyIHRvIG1lbWJlci1mdW5jdGlvbiAKICAgICAgICAgICB0cmFuc2Zvcm1hdGlvbi4gIEZvciBleGFtcGxlLCBzdXBwb3NlIHlvdSBoYWQgYQogICAgICAgICAgIHN0cnVjdHVyZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgc3RydWN0IFZlY3RvciB7CiAgICAgICAgICAgICAgICAgICAgZG91YmxlIHgseTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgIE5vdyBzdXBwb3NlIHRoYXQgeW91IHdhbnRlZCB0byBhY2Nlc3MgeCBhbmQgeSAKICAgICAgICAgICB0aHJvdWdoIGEgbWVtYmVyIGZ1bmN0aW9uIGludGVyZmFjZSBpbnN0ZWFkIAogICAgICAgICAgIG9mIHRoZSB1c3VhbCBTV0lHIGJlaGF2aW9yLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgZi5zZXRfeCgzLjQpICAgICAgIyBpbnN0ZWFkIG9mIGYueCA9IDMuNAogICAgICAgICAgICAgIHggPSBmLmdldF94KCkgICAgICMgaW5zdGVhZCBvZiB4ID0gZi54CgogICAgICAgICAgIFRvIGRvIHRoaXMsIHNpbXBseSB1c2UgdGhlIG5ldyAlYXR0cmlidXRlZnVuYwogICAgICAgICAgIGRpcmVjdGl2ZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlYXR0cmlidXRlZnVuYyhnZXRfJXMsc2V0XyVzKQogICAgICAgICAgICAgIHN0cnVjdCBWZWN0b3IgewogICAgICAgICAgICAgICAgIGRvdWJsZSB4LHk7CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAlbm9hdHRyaWJ1dGVmdW5jCgogICAgICAgICAgIFRoZSBhcmd1bWVudHMgdG8gJWF0dHJpYnV0ZWZ1bmMgYXJlIEMtc3R5bGUgcHJpbnRmCiAgICAgICAgICAgZm9ybWF0IHN0cmluZ3MgdGhhdCBkZXRlcm1pbmUgdGhlIG5hbWluZyBjb252ZW50aW9uCiAgICAgICAgICAgdG8gdXNlLiAgJXMgaXMgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsIG5hbWUgb2YgdGhlCiAgICAgICAgICAgZGF0YSBtZW1iZXIuIFNXSUcgcHJvdmlkZXMgYSBudW1iZXIgb2YgcHJpbnRmCiAgICAgICAgICAgZXh0ZW5zaW9ucyB0aGF0IG1pZ2h0IGhlbHAuICBGb3IgZXhhbXBsZSwgaWYgeW91CiAgICAgICAgICAgd2FudGVkIHRvIHRpdGxlIGNhc2UgYWxsIG9mIHRoZSBhdHRyaWJ1dGVzLCB5b3UKICAgICAgICAgICBjb3VsZCBkbyB0aGlzOgoKICAgICAgICAgICAgICAlYXR0cmlidXRlZnVuYyhnZXQlKHRpdGxlKXMsc2V0JSh0aXRsZSlzKTsKCiAgICAgICAgICAgVGhpcyB3aWxsIHR1cm4gYW4gYXR0cmlidXRlICdiYXInIHRvICdnZXRCYXIoKScgYW5kICdzZXRCYXIoKScuCgogICAgICAgICAgIChzb21lb25lIHJlcXVlc3RlZCB0aGlzIGxvbmcgYWdvLCBidXQgSSBmaW5hbGx5IGZpZ3VyZWQKICAgICAgICAgICBob3cgdG8gaW1wbGVtZW50IGl0IGluIGEgc3RyYWlnaHRmb3J3YXJkIG1hbm5lcikuCiAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAKOC8zMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgU1dJRyBub3cgYXV0b21hdGljYWxseSBnZW5lcmF0ZXMgZGVmYXVsdCBjb25zdHJ1Y3RvcnMKICAgICAgICAgICBhbmQgZGVzdHJ1Y3RvcnMgaWYgbm9uZSBhcmUgZGVmaW5lZC4gIFRoaXMgdXNlZCB0byBiZQogICAgICAgICAgIGVuYWJsZWQgd2l0aCBhIGNvbW1hbmQgbGluZSBzd2l0Y2ggLW1ha2VfZGVmYXVsdCwgYnV0CiAgICAgICAgICAgbW9zdCBwZW9wbGUgd2FudCB0aGVzZSBmdW5jdGlvbnMgYW55d2F5cy4gIFRvIHR1cm4KICAgICAgICAgICBvZmYgdGhpcyBiZWhhdmlvciB1c2UgdGhlIC1ub19kZWZhdWx0IG9wdGlvbiBvciBpbmNsdWRlCiAgICAgICAgICAgdGhlIGZvbGxvd2luZyBwcmFnbWEgaW4gdGhlIGludGVyZmFjZSBmaWxlOgogCiAgICAgICAgICAgICAgICAgJXByYWdtYSBub19kZWZhdWx0OwogIAogICAgICAgICAgIFRoaXMgbWF5IGJyZWFrIGNlcnRhaW4gaW50ZXJmYWNlcyB0aGF0IGRlZmluZWQgdGhlaXIKICAgICAgICAgICBvd24gY29uc3RydWN0b3JzL2Rlc3RydWN0b3JzIHVzaW5nIHRoZSBzYW1lIG5hbWluZwogICAgICAgICAgIGNvbnZlbnRpb24gYXMgU1dJRy4gIElmIHNvLCB5b3Ugd2lsbCBnZXQgZHVwbGljYXRlCiAgICAgICAgICAgc3ltYm9scyB3aGVuIGNvbXBpbGluZyB0aGUgU1dJRyB3cmFwcGVyIGZpbGUuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo4LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBDaGFuZ2VzIHRvIFBlcmw1IHNoYWRvdyBjbGFzcyBjb2RlIGdlbmVyYXRpb24uICBJdGVyYXRvcnMKICAgICAgICAgICBhcmUgbm8gbG9uZ2VyIHN1cHBvcnRlZCAoRklSU1RLRVksIE5FWFRLRVkpLiAgQWxzbywgYXR0cmlidXRlCiAgICAgICAgICAgYWNjZXNzIGhhcyBiZWVuIGNoYW5nZWQgdG8gcmVseSBvbiBpbmhlcml0YW5jZSBpbiBvcmRlcgogICAgICAgICAgIHRvIHByb3ZpZGUgYmV0dGVyIGJlaGF2aW9yIGFjcm9zcyBtb2R1bGVzLiAgCgo4LzI4LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBWYXJpb3VzIG9ic2N1cmUgaW1wcm92ZW1lbnRzIHRvIHRoZSB0eXBlIHN5c3RlbSBhbmQgY2xhc3Nlcy4KICAgICAgICAgICBTdHJhbmdlIGRlY2xhcmF0aW9ucyBsaWtlIHRoaXMgYXJlIG5vdyB3cmFwcGVkIGNvcnJlY3RseQogICAgICAgICAgIChpLmUuLCB0aGUgZ2VuZXJhdGVkIHdyYXBwZXIgY29kZSBkb2Vzbid0IGNhdXNlIHRoZSBDKysKICAgICAgICAgICAgY29tcGlsZXIgdG8gZGllIHdpdGggYSB0eXBlIGVycm9yKS4KCiAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICB0eXBlZGVmIGRvdWJsZSBSZWFsOwogICAgICAgICAgICAgICAgIFJlYWwgZm9vKFJlYWwgKCpvcCkoUmVhbCxSZWFsKSwgUmVhbCB4LCBSZWFsIHkpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICBJbmhlcml0YW5jZSBvZiB0eXBlcyBpcyBhbHNvIGhhbmRsZWQgY29ycmVjdGx5LgogICAgICAgICAgIAo4LzI4LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBDaGFuZ2VzIHRvIGNsYXNzIHdyYXBwZXJzLiAgIFdoZW4gU1dJRyBzZWVzIHR3byBjbGFzc2VzIGxpa2UgdGhpcywKIAogICAgICAgICAgIGNsYXNzIFggewogICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgIHZvaWQgZm9vKCk7CiAgICAgICAgICAgICAuLi4KICAgICAgICAgICB9CiAKICAgICAgICAgICBjbGFzcyBZIDogcHVibGljIFggewogICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgIHZvaWQgYmFyKCk7CiAgICAgICAgICAgICAuLi4KICAgICAgICAgICB9CiAKICAgICAgICAgICBpdCBub3cgb25seSBnZW5lcmF0ZXMgdHdvIHdyYXBwZXIgZnVuY3Rpb25zOgogCiAgICAgICAgICAgICBYX2ZvbyhYICp4KSB7IHgtPmZvbygpOyB9CiAgICAgICAgICAgICBZX2JhcihZICp5KSB7IHktPmJhcigpOyB9CiAKICAgICAgICAgICBVbmxpa2UgU1dJRzEuMTUsIHRoZSBmb28oKSBtZXRob2QgZG9lcyAqbm90KiBwcm9wYWdhdGUgdG8gYSB3cmFwcGVyCiAgICAgICAgICAgZnVuY3Rpb24gWV9mb28oKS4gSW5zdGVhZCwgdGhlIGJhc2UgY2xhc3MgbWV0aG9kIFhfZm9vKCkgbXVzdCBiZQogICAgICAgICAgIHVzZWQuCgogICAgICAgICAgIFRoaXMgY2hhbmdlIHNob3VsZCBub3QgYWZmZWN0IG1vZHVsZXMgdGhhdCB1c2Ugc2hhZG93IGNsYXNzZXMsIGJ1dAogICAgICAgICAgIGl0IG1pZ2h0IGJyZWFrIG1vZHVsZXMgdGhhdCBkaXJlY3RseSB1c2UgdGhlIGxvdy1sZXZlbCBDIHdyYXBwZXJzLgogICAgICAgICAgIFRoaXMgY2hhbmdlIGlzIGJlaW5nIG1hZGUgZm9yIGEgbnVtYmVyIG9mIHJlYXNvbnM6CgogICAgICAgICAgICAgICAtICBJdCBncmVhdGx5IHNpbXBsaWZpZXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIFNXSUctLWVzcGVjaWFsbHkKICAgICAgICAgICAgICAgICAgd2l0aCBhbnRpY2lwYXRlZCBmdXR1cmUgY2hhbmdlcyBzdWNoIGFzIG92ZXJsb2FkZWQgbWV0aG9kcy4KCiAgICAgICAgICAgICAgIC0gIEl0IHJlc3VsdHMgaW4gc3Vic3RhbnRpYWxseSBsZXNzIHdyYXBwZXIgY29kZS0tZXNwZWNpYWxseQogICAgICAgICAgICAgICAgICBmb3IgYmlnIEMrKyBjbGFzcyBoaWVyYXJjaGllcyAoaW5oZXJpdGVkIGRlY2xhcmF0aW9ucwogICAgICAgICAgICAgICAgICBhcmUgbm8gbG9uZ2VyIGNvcGllZCBpbnRvIGV2ZXJ5IHNpbmdsZSBkZXJpdmVkIGNsYXNzKS4KCiAgICAgICAgICAgICAgIC0gIEl0IGFsbG93cyBmb3IgYmV0dGVyIGNvZGUgZ2VuZXJhdGlvbiBhY3Jvc3MgbXVsdGlwbGUKICAgICAgICAgICAgICAgICAgU1dJRyBnZW5lcmF0ZWQgbW9kdWxlcyAoY29kZSBpc24ndCByZXBsaWNhdGVkIGluCiAgICAgICAgICAgICAgICAgIGV2ZXJ5IHNpbmdsZSBtb2R1bGUpLgoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCjgvMjIvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgUHJvdmlkZWQgc29tZSBXaW5kb3dzIGRvY3VtZW50YXRpb24gaW4gdGhlIFdpbiBkaXJlY3RvcnkgYW5kIHNvbWUKICAgICAgICAgICBWaXN1YWwgQysrIHByb2plY3QgZmlsZXMgZm9yIHJ1bm5pbmcgZXhhbXBsZXMgb24gV2luZG93cy4KCjgvMjgvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBIYW5kbGUgcmVuYW1lZCBvdmVybG9hZGVkIGZ1bmN0aW9ucyBwcm9wZXJseTsKCSAgIHRoYW5rcyB0byBNYXJjIFpvbnpvbiA8TWFyYy5ab256b25AdW5pdi1yZW5uZXMxLmZyPiBmb3IgdGhlCgkgICBwYXRjaC4gIFNlZSB0aGUgbmV3IHRlc3QgY2FzZSBuYW1lX2N4eC4KCjgvMjcvMjAwMTogbWtvZXBwZQoJICAgW1RjbF0gUmVtb3ZlZCBsb3RzIG9mIHdhcm5pbmdzIGlzc3VlZCBieSB0aGUgU3VuIEZvcnRlCgkgICBjb21waWxlcnMsIHdoaWNoIHdlcmUgY2F1c2VkIGJ5IG1peGluZyBmdW5jdGlvbiBwb2ludGVycwoJICAgb2YgZGlmZmVyZW50IGxpbmthZ2VzIChDKysvQykuIAoKOC8yMy8yMDAxOiBta29lcHBlCgkgICBJbXByb3ZlZCB0aGUgTXpTY2hlbWUgbW9kdWxlIGJ5IHBvcnRpbmcgR3VpbGUncyBwb2ludGVyCgkgICB0eXBlIGNoZWNraW5nIHN5c3RlbSBhbmQgbWFraW5nIHR5cGUgZGlzcGF0Y2gKCSAgIHR5cGVtYXAtZHJpdmVuLiAKCjgvMjIvMjAwMTogYmVhemxleQogICAgICAgICAgIEVudGlyZWx5IG5ldyBzeW1ib2wgdGFibGUgcHJvY2Vzc2luZy4gICBTV0lHIHNob3VsZCBiZSBhYmxlIHRvCiAgICAgICAgICAgcmVwb3J0IG11Y2ggYmV0dGVyIGVycm9yIG1lc3NhZ2VzIGZvciBtdWx0aXBsZSBkZWNsYXJhdGlvbnMuIAogICAgICAgICAgIEFsc28sIHRoZSBuZXcgc3ltYm9sIHRhYmxlIGFsbG93cyBmb3Igb3ZlcmxvYWRlZCBmdW5jdGlvbnMKICAgICAgICAgICAoYWx0aG91Z2ggb3ZlcmxvYWRpbmcgaXNuJ3QgcXVpdGUgc3VwcG9ydGVkIGluIHRoZSBsYW5ndWFnZQogICAgICAgICAgIG1vZHVsZXMgeWV0KS4KCjgvMjIvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgKiBbSmF2YV0gJW5ldyBzdXBwb3J0IGFkZGVkLgogICAgICAgICAgICogW0phdmFdIFBhY2thZ2UgSk5JIG5hbWUgcmVmaXhlZCEKCjgvMTkvMjAwMTogYmVhemxleQogICAgICAgICAgIFB5dGhvbiBtb2R1bGUgbW9kaWZpZWQgdG8gc3VwcG9ydCBwb2ludGVycyB0byBDKysgbWVtYmVycy4gIFRoaXMKICAgICAgICAgICBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZS4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgCjgvMTkvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIGxpbWl0ZWQgcGFyc2luZyBhbmQgZnVsbCB0eXBlLXN5c3RlbSBzdXBwb3J0IGZvciBwb2ludGVycyB0bwogICAgICAgICAgIG1lbWJlcnMuIE5vbmUgb2YgU1dJRydzIGxhbmd1YWdlIG1vZHVsZXMgcmVhbGx5IGtub3cgaG93IHRvIGRlYWwgd2l0aAogICAgICAgICAgIHRoaXMgc28gdGhpcyBpcyByZWFsbHkgb25seSBwcm92aWRlZCBmb3IgY29tcGxldGVuZXNzIGFuZCBmdXR1cmUKICAgICAgICAgICBleHBhbnNpb24uICBOb3RlOiBTV0lHIGRvZXMgbm90IHN1cHBvcnQgcG9pbnRlcnMgdG8gbWVtYmVycyB3aGljaCAKICAgICAgICAgICBhcmUgdGhlbXNlbHZlcyBwb2ludGVycyB0byBtZW1iZXJzLCByZWZlcmVuY2VzIHRvIHBvaW50ZXJzIHRvIG1lbWJlcnMsCiAgICAgICAgICAgb3Igb3RoZXIgY29tcGxpY2F0ZWQgZGVjbGFyYXRpb25zIGxpa2UgdGhpcy4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzE5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTV0lHIGlzIG11Y2ggYmV0dGVyIGF0IHBhcnNpbmcgY2VydGFpbiBDKysgZGVjbGFyYXRpb25zLiBPcGVyYXRvcnMgYW5kCiAgICAgICAgICAgZnJpZW5kcyBnZW5lcmFsbHkgZG9uJ3QgY2F1c2UgYW55bW9yZSBzeW50YXggZXJyb3JzLiAgSG93ZXZlciwgbmVpdGhlcgogICAgICAgICAgIGFyZSByZWFsbHkgc3VwcG9ydGVkLgoKOC8xOC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgKmhpZ2hseSogZXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIHdyYXBwaW5nIG9mIEMrKwogICAgICAgICAgIHRlbXBsYXRlIGRlY2xhcmF0aW9ucy4gIFNpbmNlIEMrKyB0ZW1wbGF0ZXMgYXJlIGVzc2VudGlhbGx5CiAgICAgICAgICAgZ2xvcmlmaWVkIG1hY3JvcyBhbmQgU1dJRyBoYXMgYSBmdWxseSBvcGVyYXRpb25hbCBDIAogICAgICAgICAgIHByZXByb2Nlc3NvciB3aXRoIG1hY3JvIHN1cHBvcnQsIHRoZSBwYXJzZXIgbm93IGNvbnZlcnRzCiAgICAgICAgICAgdGVtcGxhdGUgZGVjbGFyYXRpb25zIHRvIG1hY3Jvcy4gIEZvciBleGFtcGxlLCBhIGZ1bmN0aW9uCiAgICAgICAgICAgdGVtcGxhdGUgbGlrZSB0aGlzCgogICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBUIG1heChUIGEsIFQgYik7CgogICAgICAgICAgIGlzIGludGVybmFsbHkgY29udmVydGVkIGludG8gYSBtYWNybyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAlZGVmaW5lICVfdGVtcGxhdGVfbWF4KF9fbmFtZSxUKQogICAgICAgICAgICAgICAlbmFtZShfX25hbWUpIFQgbWF4KFQgYSwgVCBiKTsKICAgICAgICAgICAgICAgJWVuZGRlZgoKICAgICAgICAgICBUbyBpbnN0YW50aWF0ZSBhIHZlcnNpb24gb2YgdGhlIHRlbXBsYXRlLCBhIHNwZWNpYWwgJXRlbXBsYXRlIGRlY2xhcmF0aW9uCiAgICAgICAgICAgaXMgdXNlZCBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAldGVtcGxhdGUobWF4aW50KSBtYXg8aW50PjsgICAgICAgICAgCiAgICAgICAgICAgICAgICV0ZW1wbGF0ZShtYXhkb3VibGUpIG1heDxkb3VibGU+OwoKICAgICAgICAgICBUaGUgcGFyYW1ldGVyIHRvIHRoZSAldGVtcGxhdGUgZGlyZWN0aXZlIG11c3QgYmUgcHJvcGVyIEMgaWRlbnRpZmllciB0aGF0J3MKICAgICAgICAgICB1c2VkIHRvIHVuaXF1ZWx5IG5hbWUgdGhlIHJlc3VsdGluZyBpbnN0YW50aWF0aW9uLiAgIFdoZW4gdXNlZCwgdGhlCiAgICAgICAgICAgdGhlIGV4cGFuZGVkIG1hY3JvIGxvb2tzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgJW5hbWUobWF4aW50KSBpbnQgbWF4KGludCBhLCBpbnQgYik7CiAgICAgICAgICAgICAgJW5hbWUobWF4ZG91YmxlKSBkb3VibGUgbWF4KGRvdWJsZSBhLCBkb3VibGUgYik7CgogICAgICAgICAgIEEgc2ltaWxhciB0ZWNobmlxdWUgaXMgdXNlZCBmb3IgdGVtcGxhdGUgY2xhc3Nlcy4gICBGb3IgaW5zdGFuY2U6CgogICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIHZlY3RvciB7CiAgICAgICAgICAgICAgICAgVCAqZGF0YTsKICAgICAgICAgICAgICAgICBpbnQgc3o7CiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIHZlY3RvcihpbnQgbml0ZW1zKTsKICAgICAgICAgICAgICAgICBUICpnZXQoaW50IG4pOwogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH07CgogICAgICAgICAgIEdldHMgY29udmVydGVkIGludG8gYSBtYWNybyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICVkZWZpbmUgJV90ZW1wbGF0ZV92ZWN0b3IoX19uYW1lLCBUKQogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgdHlwZWRlZiB2ZWN0b3I8VD4gX19uYW1lOwogICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgY2xhc3MgX19uYW1lIHsKICAgICAgICAgICAgICAgICBUICpkYXRhOwogICAgICAgICAgICAgICAgIGludCBzejsKICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgX19uYW1lKGludCBuaXRlbXMpOwogICAgICAgICAgICAgICAgIFQgKmdldChpbnQgbik7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICB0eXBlZGVmIF9fbmFtZSB2ZWN0b3I8VD47CiAgICAgICAgICAgICAgJWVuZGRlZgoKICAgICAgICAgICBBbiBhIHNwZWNpZmljIGluc3RhbnRpYXRpb24gaXMgY3JlYXRlZCBpbiBleGFjdGx5IHRoZSBzYW1lIHdheToKCiAgICAgICAgICAgICAldGVtcGxhdGUoaW50dmVjKSB2ZWN0b3I8aW50PjsKCiAgICAgICAgICAgVGhlIHJlc3VsdGluZyBjb2RlIHBhcnNlZCBieSBTV0lHIGlzIHRoZW46CgogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgdHlwZWRlZiB2ZWN0b3I8aW50PiBpbnR2ZWM7CiAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICBjbGFzcyBpbnR2ZWMgewogICAgICAgICAgICAgICAgICBpbnQgKmRhdGE7CiAgICAgICAgICAgICAgICAgIGludCBzejsKICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgIGludHZlYyhpbnQgbml0ZW1zKTsKICAgICAgICAgICAgICAgICAgaW50ICpnZXQoaW50IG4pOwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIHR5cGVkZWYgaW50dmVjIHZlY3RvcjxpbnQ+OwoKICAgICAgICAgICBOb3RlOiB0aGUgbGFzdCB0eXBlZGVmIGlzIG5vbi1zdGFuZGFyZCBDIGFuZCBpcyB1c2VkIGJ5IFNXSUcgdG8gcHJvdmlkZQogICAgICAgICAgIGFuIGFzc29jaWF0aW9uIGJldHdlZW4gdGhlIG5hbWUgImludHZlYyIgYW5kIHRoZSB0ZW1wbGF0ZSB0eXBlIAogICAgICAgICAgICJ2ZWN0b3I8aW50PiIuCgogICAgICAgICAgIENBVVRJT046ICBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCB0aGUgZmlyc3QgdGltZSBTV0lHIGhhcwogICAgICAgICAgIHN1cHBvcnRlZCBDKysgdGVtcGxhdGVzLiAgIEVycm9yIHJlcG9ydGluZyBpcyBlc3NlbnRpYWwgbm9uLWV4aXN0ZW50LgogICAgICAgICAgIEl0IHdpbGwgcHJvYmFibHkgYnJlYWsgaW4gY2VydGFpbiBjYXNlcy4KICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIE5FVyBGRUFUVVJFICoqKioKCjgvMTUvMjAwMTogYmVhemxleQogICAgICAgICAgIENoYW5nZSB0byB3cmFwcGluZyBvZiBtdWx0aS1kaW1lbnNpb25hbCBhcnJheXMuICBBcnJheXMKICAgICAgICAgICBhcmUgbm93IHByb3Blcmx5IG1hcHBlZCB0byBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YKICAgICAgICAgICBvbmUgbGVzcyBkaW1lbnNpb24uICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBpbnQgWzEwXTsgICAgICAgICAgICAgIC0tPiAgaW50ICoKICAgICAgICAgICAgICAgIGludCBbMTBdWzIwXTsgICAgICAgICAgLS0+ICBpbnQgKCopWzIwXTsKICAgICAgICAgICAgICAgIGludCBbMTBdWzIwXVszMF07ICAgICAgLS0+ICBpbnQgKCopWzIwXVszMF07CgogICAgICAgICAgIFRoaXMgY2hhbmdlIG1heSBicmVhayBjZXJ0YWluIFNXSUcgZXh0ZW5zaW9ucyBiZWNhdXNlCiAgICAgICAgICAgb2xkZXIgdmVyc2lvbnMgc2ltcGx5IG1hcHBlZCBhbGwgYXJyYXlzIGludG8gYSBzaW5nbGUKICAgICAgICAgICBwb2ludGVyIHN1Y2ggYXMgImludCAqIi4gICBBbHRob3VnaCBwb3NzaWJseSB1bnVzdWFsLCAKICAgICAgICAgICB0aGUgbmV3IHZlcnNpb24gaXMgY29ycmVjdCBpbiB0ZXJtcyBvZiB0aGUgQyB0eXBlIHN5c3RlbS4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgIAo4LzA2LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgICogW0phdmFdIEFycmF5IHNldHRlcnMgZ2VuZXJhdGVkIGZvciBzdHJ1Y3QvY2xhc3MgYXJyYXkgbWVtYmVycy4KCjgvMTMvMjAwMTogYmVhemxleQogICAgICAgICAgIE1hbnkgaW1wcm92ZW1lbnRzIHRvIFRjbC9QZXJsL1B5dGhvbiBtb2R1bGVzIHRvIGJldHRlcgogICAgICAgICAgIHdvcmsgd2l0aCBtdWx0aXBsZSBpbnRlcmZhY2UgZmlsZXMgYW5kIHRoZSAlaW1wb3J0IGRpcmVjdGl2ZS4KCjgvMTMvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIHVwIHRoZSBiZWhhdmlvciBvZiAlaW1wb3J0IGluIHRoZSBQeXRob24gbW9kdWxlLgogICAgICAgICAgIFNXSUcgbm8gbG9uZ2VyIHBvbGx1dGVzIHRoZSBtb2R1bGUgbmFtZXNwYWNlIGJ5IHVzaW5nCiAgICAgICAgICAgJ2Zyb20gbW9kdWxlIGltcG9ydCAqJyB0byByZWZlciB0byB0aGUgb3RoZXIgbW9kdWxlLiAKICAgICAgICAgICBJbnN0ZWFkLCBpdCBkb2VzIGEgcHJvcGVyICdpbXBvcnQgbW9kdWxlJy4gICBBbHNvLCBTV0lHCiAgICAgICAgICAgbWF5IHdvcmsgYSBsb3QgYmV0dGVyIHdoZW4gaW1wb3J0aW5nIG1vZHVsZXMgdGhhdCBpbmNsdWRlCiAgICAgICAgICAgcmVmZXJlbmNlcyB0byBvdGhlciBpbXBvcnRlZCBtb2R1bGVzLgoKOC8xMy8yMDAxOiBta29lcHBlCgkgICBBZGRlZCBuZXcgdHlwZW1hcCBzdWJzdGl0dXRpb25zLCBnZW5lcmFsaXppbmcgdGhvc2Ugb2YgdGhlCgkgICBHdWlsZS1zcGVjaWZpYyA1LzI3LzIwMDEgY2hhbmdlczogCgkgICAqICRkZXNjcmlwdG9yIGlzIHRoZSBzYW1lIGFzIFNXSUdUWVBFJG1hbmdsZSwgYnV0IGFsc28KCSAgICAgZW5zdXJlcyB0aGF0IHRoZSB0eXBlIGRlc2NyaXB0b3Igb2YgdGhpcyBuYW1lIGdldHMKCSAgICAgZGVmaW5lZC4KCSAgICogJCp0eXBlLCAkKmx0eXBlLCAkKm1hbmdsZSwgJCpkZXNjcmlwdG9yIGFyZSB0aGUgc2FtZSBhcwoJICAgICB0aGUgdmFyaWFudHMgd2l0aG91dCBzdGFyLCBidXQgdGhleSBSRU1PVkUgb25lIGxldmVsIG9mCgkgICAgIHBvaW50ZXJzIGZyb20gdGhlIHR5cGUuIChUaGlzIGlzIG9ubHkgdmFsaWQgZm9yIHBvaW50ZXIgCgkgICAgIHR5cGVzLikKCSAgICogJCZ0eXBlLCAkJmx0eXBlLCAkJm1hbmdsZSwgJCZkZXNjcmlwdG9yIGFyZSB0aGUgc2FtZSBhcwoJICAgICB0aGUgdmFyaWFudHMgd2l0aG91dCBhbXBlcnNhbmQsIGJ1dCB0aGV5IEFERCBvbmUgbGV2ZWwgb2YKCSAgICAgcG9pbnRlcnMgdG8gdGhlIHR5cGUuCgkgICBUaGUgR3VpbGUtc3BlY2lmaWMgc3Vic3RpdHV0aW9uICRiYXNlZGVzY3JpcHRvciB3YXMgcmVtb3ZlZAoJICAgYmVjYXVzZSBpdCB3YXMgdXNlbGVzcy4KCjgvMTIvMjAwMTogYmVhemxleQogICAgICAgICAgIFRoZSAlZXh0ZXJuIGRpcmVjdGl2ZSBpcyBub3cgZGVwcmVjYXRlZCBhbmQgd2l0aGRyYXduLiAgVGhlCiAgICAgICAgICAgcHVycG9zZSBvZiB0aGlzIGRpcmVjdGl2ZSB3YXMgdG8gaW1wb3J0IHNlbGVjdGVkIGRlZmluaXRpb25zCiAgICAgICAgICAgZnJvbSBvdGhlciBpbnRlcmZhY2UgZmlsZXMgYW5kIGhlYWRlcnMuICBIb3dldmVyLCB0aGUgc2FtZQogICAgICAgICAgIGZ1bmN0aW9uYWxpdHkgaXMgYmV0dGVyIGhhbmRsZWQgdGhyb3VnaCAlaW1wb3J0LiAgIFRoaXMKICAgICAgICAgICBsZWF2ZXMgU1dJRyB3aXRoIHR3byBmaWxlIGluY2x1c2lvbiBkaXJlY3RpdmVzOgoKICAgICAgICAgICAgICAlaW5jbHVkZSBmaWxlbmFtZSAgICAgLSBJbnNlcnRzIGludG8gY3VycmVudCBpbnRlcmZhY2UKICAgICAgICAgICAgICAlaW1wb3J0IGZpbGVuYW1lICAgICAgLSBJbXBvcnQgdHlwZXMgYW5kIGNsYXNzZXMgZnJvbSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm90aGVyIG1vZHVsZQoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjgvMDkvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIG5ldyBzdXBwb3J0IGZvciB3cmFwcGluZyBDL0MrKyBjYWxsYmFjayBmdW5jdGlvbnMuIAogICAgICAgICAgIEEgY29tbW9uIHByb2JsZW0gd2l0aCBzb21lIEMgbGlicmFyaWVzIGlzIHRoYXQgbWFueQogICAgICAgICAgIGZ1bmN0aW9ucyB0YWtlIGEgZnVuY3Rpb24gcG9pbnRlciBhcyBhbiBhcmd1bWVudC4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIGludCBkb19vcCguLi4sIGludCAoKm9wKShpbnQsaW50KSwgLi4uKTsKCiAgICAgICAgICAgVW5mb3J0dW5hdGVseSwgdGhlIG9ubHkgd2F5IHRvIGNhbGwgc3VjaCBhIGZ1bmN0aW9uIGlzIHRvCiAgICAgICAgICAgcGFzcyBpdCBhIGZ1bmN0aW9uIHBvaW50ZXIgb2Ygc29tZSBjb21wYXRpYmxlIHR5cGUuICBJbgogICAgICAgICAgIHByZXZpb3VzIHZlcnNpb25zIG9mIFNXSUcsIHlvdSBoYWQgdG8gc29sdmUgdGhpcyBwcm9ibGVtCiAgICAgICAgICAgd2l0aCBzb21lIHJlYWxseSBncm9zcyBoYWNrcy4gIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudGVkIHRvCiAgICAgICAgICAgdXNlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gYXMgYSBjYWxsYmFjaywKCiAgICAgICAgICAgICAgIGludCBmb28oaW50LCBpbnQpOwoKICAgICAgICAgICB5b3UgaGFkIHRvIGluc3RhbGwgYSBwb2ludGVyIHRvIGl0IGFzIGEgY29uc3RhbnQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICVjb25zdGFudCBpbnQgKCpGT08pKGludCxpbnQpID0gZm9vOwoKICAgICAgICAgICBvciAKCiAgICAgICAgICAgICAgIGNvbnN0IGludCAoKkZPTykoaW50LGludCkgPSBmb287CgogICAgICAgICAgIG9yIGlmIHlvdSBoYWQgYSByZWFsbHkgb2xkIFNXSUcgdmVyc2lvbjoKCiAgICAgICAgICAgICAgIHR5cGVkZWYgaW50ICgqT1BfRlVOQykoaW50LGludCk7CiAgICAgICAgICAgICAgIGludCBkb19vcCguLi4sIE9QX0ZVTkMsIC4uLik7CiAgICAgICAgICAgICAgIGNvbnN0IE9QX0ZVTkMgRk9PID0gZm9vOwoKICAgICAgICAgICAKICAgICAgICAgICBOb3csIHlvdSBjYW4gZG8gb25lIG9mIHR3byB0aGluZ3M6CgogICAgICAgICAgICAgICAlY29uc3RhbnQgaW50IGZvbyhpbnQsaW50KTsKCiAgICAgICAgICAgVGhpcyBjcmVhdGVzIGEgY29uc3RhbnQgJ2Zvbycgb2YgdHlwZSBpbnQgKCopKGludCxpbnQpLgogICAgICAgICAgIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gZG8gdGhpczoKCiAgICAgICAgICAgICAgICVjYWxsYmFjaygiJXMiKTsKICAgICAgICAgICAgICAgaW50IGZvbyhpbnQsaW50KTsKICAgICAgICAgICAgICAgaW50IGJhcihpbnQsaW50KTsKICAgICAgICAgICAgICAgJW5vY2FsbGJhY2s7CgogICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIGZ1bmN0aW9ucyBhcmUgaW5zdGFsbGVkIGFzIGNvbnN0YW50cyB3aGVyZQogICAgICAgICAgIHRoZSBuYW1lIGlzIGRlZmluZWQgYnkgdGhlIGZvcm1hdCBzdHJpbmcgZ2l2ZW4gdG8gJWNhbGxiYWNrKCkuCiAgICAgICAgICAgSWYgdGhlIG5hbWVzIGdlbmVyYXRlZCBieSB0aGUgZm9ybWF0IHN0cmluZyBkaWZmZXIgZnJvbSB0aGUKICAgICAgICAgICBhY3R1YWwgZnVuY3Rpb24gbmFtZSwgYm90aCBhIGZ1bmN0aW9uIHdyYXBwZXIgYW5kIGEgY2FsbGJhY2sgCiAgICAgICAgICAgY29uc3RhbnQgYXJlIGNyZWF0ZWQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICVjYWxsYmFjaygiJSh1cHBlcilzIik7CiAgICAgICAgICAgICAgIGludCBmb28oaW50LGludCk7CiAgICAgICAgICAgICAgIGludCBiYXIoaW50LGludCk7CiAgICAgICAgICAgICAgICVub2NhbGxiYWNrOwogICAgICAgICAgIAogICAgICAgICAgIENyZWF0ZXMgdHdvIHdyYXBwZXIgZnVuY3Rpb25zICdmb28nLCAnYmFyJyBhbmQgYWRkaXRpb25hbGx5CiAgICAgICAgICAgY3JlYXRlcyB0d28gY2FsbGJhY2sgY29uc3RhbnRzICdGT08nLCAnQkFSJy4KCiAgICAgICAgICAgTm90ZTogU1dJRyBzdGlsbCBkb2VzIG5vdCBwcm92aWRlIGF1dG9tYXRpYyBzdXBwb3J0IGZvciAKICAgICAgICAgICB3cml0aW5nIGNhbGxiYWNrIGZ1bmN0aW9ucyBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMDYvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgKiBzdHJ1Y3QgbmVzdGluZyBmaXhlcyBhcyBwZXIgU0YgYnVnICM0NDc0ODguCgo4LzAzLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBUaGUgJW5hbWUgZGlyZWN0aXZlIG5vdyBhcHBsaWVzIHRvIGNvbnN0YW50cyBjcmVhdGVkIHdpdGgKICAgICAgICAgICAjZGVmaW5lIGFuZCAlY29uc3RhbnQuICBIb3dldmVyLCBtb3N0IGxhbmd1YWdlIG1vZHVsZXMKICAgICAgICAgICB3ZXJlIG5ldmVyIHdyaXR0ZW4gdG8gc3VwcG9ydCB0aGlzIGFuZCB3aWxsIGhhdmUgdG8gYmUKICAgICAgICAgICBtb2RpZmllZCB0byBtYWtlIGl0IHdvcmsuICBUY2wsIFB5dGhvbiwgYW5kIFBlcmwgbW9kdWxlcwogICAgICAgICAgIGFyZSB3b3JraW5nIG5vdy4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzAzLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBNYXNzaXZlIGNoYW5nZXMgYW5kIHNpbXBsaWZpY2F0aW9uIG9mIEMgZGVjbGFyYXRpb24gcGFyc2luZy4KICAgICAgICAgICBBbHRob3VnaCBTV0lHIGlzIHN0aWxsIG5vdCBhIGZ1bGwgQyBwYXJzZXIsIGl0cyBhYmlsaXR5CiAgICAgICAgICAgdG8gaGFuZGxlIGNvbXBsZXggZGF0YXR5cGVzIGluY2x1ZGluZyBwb2ludGVycyB0byBmdW5jdGlvbnMKICAgICAgICAgICBhbmQgcG9pbnRlcnMgdG8gYXJyYXlzIGhhcyBiZWVuIHZhc3RseSBpbXByb3ZlZC4gIAoKOC8wMy8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICAqIERpc3RyaWJ1dGlvbiBmaXhlczogYXV0b2NvbmYgbm8gbG9uZ2VyIG5lZWRlZCB0byBpbnN0YWxsIFNXSUcuCgo4LzAyLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBSZW1vdmVkIHR3byB1bmRvY3VtZW50ZWQgcGFyc2luZyBmZWF0dXJlcy4gIFNXSUcgbm8gbG9uZ2VyCiAgICAgICAgICAgc3VwcG9ydHMgb3V0LW9mLWNsYXNzIHN0YXRpYyBmdW5jdGlvbiBvciB2YXJpYWJsZQogICAgICAgICAgIGRlY2xhcmF0aW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIHN0YXRpYyBpbnQgRm9vOjpiYXI7CgogICAgICAgICAgIFRoaXMgZmVhdHVyZSBtYXkgcmV0dXJuIGlmIHRoZXJlIGlzIHN1ZmZpY2llbnQgZGVtYW5kLiAKICAgICAgICAgICBIb3dldmVyLCBzaW5jZSBTV0lHIGlzIG1vc3Qgb2Z0ZW4gdXNlZCB3aXRoIGhlYWRlciBmaWxlcywKICAgICAgICAgICBpdCBpcyBtb3JlIGxpa2VseSBmb3IgdGhlc2UgZGVmaW5pdGlvbnMgdG8gYmUgaW5jbHVkZWQKICAgICAgICAgICBpbiB0aGUgY2xhc3MgZGVmaW5pdGlvbi4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjgvMDIvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIENsZWFudXAgb2YgdGhlIEdJRlBsb3QgZXhhbXBsZXMuIFVwZ3JhZGVkIEphdmEgR0lGUGxvdCBleGFtcGxlLgoKOC8wMS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogW0phdmFdIEVmZmljaWVuY3kgY2hhbmdlczogX2NQdHIgdXNlZCB3aGVyZSBwb3NzaWJsZSByYXRoZXIgdGhhbgoJICAgICBnZXRDUHRyKCkuIEJ1ZyBmaXhlcyBmb3IgaW5oZXJpdGFuY2UgLSBkZXJpdmVkIGNsYXNzIHNvbWV0aW1lcwoJICAgICBkaWRuJ3QgZGVsZXRlIHRoZSBjIG1lbW9yeSB3aGVuIF9kZWxldGUoKSB3YXMgY2FsbGVkLgoJICAgKiBbSmF2YV0gQWJzdHJhY3QgYysrIGNsYXNzZXMgYXJlIHdyYXBwZWQgd2l0aCBhIGphdmEgYWJzdHJhY3Qgc2hhZG93CgkgICAgIGNsYXNzLiBBbHNvIGEgcHVyZSB2aXJ0dWFsIGZ1bmN0aW9uIGlzIG1hcHBlZCB3aXRoIGFuIGFic3RyYWN0IG1ldGhvZC4KCSAgICogVGhlIGRlZmF1bHQgb3V0cHV0IGZpbGUgaGFzIGFsd2F5cyBiZWVuIDxtb2R1bGU+X3dyYXAuYy4gSXQgaXMgbm93CgkgICAgIDxtb2R1bGU+X3dyYXAuY3h4IGlmIHRoZSAtYysrIGNvbW1hbmRsaW5lIG9wdGlvbiBpcyBwYXNzZWQgdG8gc3dpZy4KCSAgICAgVGhpcyBoYXMgYmVlbiBkb25lIGFzIG90aGVyd2lzZSBjKysgY29kZSB3b3VsZCBhcHBlYXIgaW4gYSBjIGZpbGUuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqIAoKNy8zMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgTW9kaWZpZWQgdGhlICVjb25zdGFudCBkaXJlY3RpdmUgdG8gYmUgbW9yZSBDLWxpa2UgaW4gc3ludGF4LgogICAgICAgICAgIFRoZSBzeW50YXggaXMgbm93OgoKICAgICAgICAgICAgICAgICVjb25zdGFudCBOQU1FID0gVkFMVUU7CiAgICAgICAgICAgICAgICAlY29uc3RhbnQgVFlQRSBOQU1FID0gVkFMVUU7CiAKICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlY29uc3RhbnQgRm9vICpCYXIgPSAmU3BhbTsKCiAgICAgICAgICAgQSBtb3JlIHN1YnRsZSBjYXNlIGlzIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICAlY29uc3RhbnQgaW50ICgqRk9PKShpbnQsaW50KSA9IGJsYWg7CgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKiAgTW9kdWxlcyB0aGF0IHdlcmUgdXNpbmcKICAgICAgICAgICB0aGUgJWNvbnN0YW50IGRpcmVjdGl2ZSBkaXJlY3RseSB3aWxsIG5lZWQgdG8gYmUgbW9kaWZpZWQuCiAgICAgIAo3LzMwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBSZW1vdmVkIG9ic2N1cmUgYW5kIHVuZG9jdW1lbnRlZCBmb3JtIG9mIHRoZSAlaW5saW5lIGRpcmVjdGl2ZToKCiAgICAgICAgICAgICAgICVpbmxpbmUgaW50IGJsYWgoaW50IGEsIGludCBiKSB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKiAKICAgICAgICAgICAobm90ZTogdGhpcyBmZWF0dXJlIHdhcyBuZXZlciBkb2N1bWVudGVkIGFuZCBpcyB3aXRoZHJhd24pCgo3LzMwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBSZW1vdmVkIHN1cHBvcnQgZm9yIGZ1bmN0aW9ucyB3aXRoIG5vIGV4cGxpY2l0bHkgZGVjbGFyZWQKICAgICAgICAgICByZXR1cm4gdHlwZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgZm9vKGludCk7CgogICAgICAgICAgIEluIEMsIHN1Y2ggZnVuY3Rpb25zIHdlcmUgaW1wbGljaXRseSBhc3N1bWVkIHRvIHJldHVybiBhbiAnaW50Jy4KICAgICAgICAgICBJbiBDKyssIHRoaXMgaXMgaWxsZWdhbC4gIEVpdGhlciB3YXksIGl0J3MgY29uc2lkZXJlZCBiYWQKICAgICAgICAgICBzdHlsZS4gIFJlbW92aW5nIHN1cHBvcnQgZm9yIHRoaXMgaW4gU1dJRyB3aWxsIHNpbXBsaWZ5CiAgICAgICAgICAgY2VydGFpbiBpc3N1ZXMgaW4gcGFyc2luZy4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvMzAvMjAwMTogbWtvZXBwZQoJICAgKiBQYXJ0aWFsIG1lcmdlIGZyb20gdGhlIENWUyB0cnVuay4gIFRoZSBTb3VyY2UvRE9IIGRpcmVjdG9yeQoJICAgICBhbmQgbW9zdCBvZiB0aGUgU291cmNlL1N3aWcgZGlyZWN0b3J5IGlzIHVwLXRvLWRhdGUgbm93LgoJICAgKiBbR3VpbGVdICVzY2hlbWUgaXMgbm93IGEgbWFjcm8gZm9yICVpbnNlcnQoInNjaGVtZSIpLiAgCgkgICAgIE5ldyBzeW50YXg6ICAlc2NoZW1lICJGSUxFTkFNRSI7IAoJICAgICBOZXcgc3ludGF4OiAgJXNjaGVtZSAleyBTQ0hFTUUtQ09ERSAlfQoJICAgICBOZXcgbWFjcm9zICVtdWx0aXBsZV92YWx1ZXMsICV2YWx1ZXNfYXNfbGlzdCwKCSAgICAgJXZhbHVlc19hc192ZWN0b3IuIAoKNy8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgJXJlYWRvbmx5IGFuZCAlcmVhZHdyaXRlIGhhdmUgYmVlbiB0dXJuZWQgaW50byBTV0lHIHByYWdtYXMuCiAgICAgICAgICAgJXByYWdtYShzd2lnKSByZWFkb25seSBhbmQgJXByYWdtYShzd2lnKSByZWFkd3JpdGUuICBNYWNyb3MKICAgICAgICAgICBhcmUgdXNlZCB0byBwcm92aWRlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgoKNy8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgTWlub3IgY2hhbmdlcyB0byAlcHJhZ21hIGRpcmVjdGl2ZS4gICVwcmFnbWEgbXVzdCBhbHdheXMKICAgICAgICAgICBiZSBkaXJlY3RlZCB0byBhIHNwZWNpZmljIGxhbmd1YWdlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVwcmFnbWEoc3dpZykgbWFrZV9kZWZhdWx0OwogICAgICAgICAgICAgICVwcmFnbWEocGVybDUpIGluY2x1ZGUgPSAiYmxhaC5pIjsKCiAgICAgICAgICAgQWxzbyBleHRlbmRlZCB0aGUgcHJhZ21hIGRpcmVjdGl2ZSB0byBhbGxvdyBjb2RlIGJsb2NrcwogCiAgICAgICAgICAgICAgJXByYWdtYShmb28pIGNvZGUgPSAlewogICAgICAgICAgICAgICAgICAuLi4gc29tZSBjb2RlIC4uLgogICAgICAgICAgICAgICV9CgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlIHRvIHRoZSB3YXkgJ2NvbnN0JyB2YXJpYWJsZXMgYXJlIHdyYXBwZWQuICBJbiAKICAgICAgICAgICBwcmV2aW91cyB2ZXJzaW9ucyBvZiBTV0lHLCBhICdjb25zdCcgdmFyaWFibGUgd2FzCiAgICAgICAgICAgd3JhcHBlZCBhcyBhIGNvbnN0YW50LiAgIE5vdywgJ2NvbnN0JyB2YXJpYWJsZXMgYXJlCiAgICAgICAgICAgd3JhcHBlZCBhcyByZWFkLW9ubHkgdmFyaWFibGVzLiAgVGhlcmUgYXJlIHNldmVyYWwKICAgICAgICAgICByZWFzb25zIGZvciBtYWtpbmcgdGhpcyBjaGFuZ2UsIG1vc3RseSBwZXJ0YWluaW5nIHRvCiAgICAgICAgICAgc3VidGxlIGRldGFpbHMgb2YgaG93ICdjb25zdCcgYWN0dWFsbHkgd29ya3MuIAoKICAgICAgICAgICBUaGlzIHdpbGwgcHJvYmFibHkgYnJlYWsgb2xkIGludGVyZmFjZXMgdGhhdCB1c2VkICdjb25zdCcKICAgICAgICAgICB0byBjcmVhdGUgY29uc3RhbnRzLiAgIEFzIGEgcmVwbGFjZW1lbnQsIGNvbnNpZGVyIHVzaW5nIHRoaXM6CgogICAgICAgICAgIGNvbnN0IGludCBhID0gNDsgICA9PT0+ICAgJWNvbnN0YW50IGludCBhID0gNDsKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgIFJlb3JnYW5pemF0aW9uIGFuZCBzaW1wbGlmaWNhdGlvbiBvZiB0eXBlIHBhcnNpbmcuCiAgICAgICAgICAgVHlwZXMgd2l0aCAnY29uc3QnIHNob3VsZCB3b3JrIGNvcnJlY3RseSBub3cuCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBNb3N0IHN3aWcgZGlyZWN0aXZlcyByZWxhdGVkIHRvIHRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbQogICAgICAgICAgIGFyZSBub3cgZGVwcmVjYXRlZC4KCjcvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgIFJlbW92ZWQgc3VwcG9ydCBmb3IgT2JqZWN0aXZlLUMgaW4gb3JkZXIgdG8gc2ltcGxpZnkKICAgICAgICAgICBwYXJzZXIgcmVjb25zdHJ1Y3Rpb24uICBXaWxsIHJldHVybiBpZiB0aGVyZSBpcyBzdWZmaWNpZW50CiAgICAgICAgICAgZGVtYW5kLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQ29kZSBpbmNsdXNpb24gaGFzIGJlZW4gbW9kaWZpZWQgaW4gdGhlIHBhcnNlci4gIEEgY29tbW9uCiAgICAgICAgICAgZGlyZWN0aXZlICVpbnNlcnQgaXMgbm93IHVzZWQgZm9yIGV2ZXJ5dGhpbmcuICBUaGlzCiAgICAgICAgICAgaW5zZXJ0cyBhIGZpbGUgaW50byB0aGUgb3V0cHV0OgoKICAgICAgICAgICAgICAgJWluc2VydChoZWFkZXIpICJmb28uc3dnIgoKICAgICAgICAgICBUaGlzIGluc2VydHMgc29tZSBpbmxpbmUgY29kZSBpbnRvIHRoZSBvdXRwdXQKCiAgICAgICAgICAgICAgICVpbnNlcnQoaGVhZGVyKSAlewogICAgICAgICAgICAgICAgICAgLi4uIHNvbWUgY29kZSAuLi4gCiAgICAgICAgICAgICAgICV9CgogICAgICAgICAgIFRoZXJlIGFyZSBmaXZlIHByZWRlZmluZWQgdGFyZ2V0cyBmb3IgdGhlIGluc2VydCBkaXJlY3RpdmU6CgogICAgICAgICAgICAgICAiaGVhZGVyIiAgICAtIEhlYWRlciBzZWN0aW9uIG9mIHdyYXBwZXIgZmlsZQogICAgICAgICAgICAgICAicnVudGltZSIgICAtIFJ1bnRpbWUgc2VjdGlvbiBvZiB3cmFwcGVyIGZpbGUKICAgICAgICAgICAgICAgIndyYXBwZXIiICAgLSBXcmFwcGVyIHNlY3Rpb24KICAgICAgICAgICAgICAgImluaXQiICAgICAgLSBJbml0aWFsaXphdGlvbiBmdW5jdGlvbgogICAgICAgICAgICAgICAibnVsbCIgICAgICAtIE5vdGhpbmcuIERpc2NhcmQuCgogICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZGlyZWN0aXZlcyBhcmUgc3RpbGwgc3VwcG9ydGVkLCBidXQgYXJlCiAgICAgICAgICAgbm93IGRlZmluZWQgaW4gdGVybXMgb2YgbWFjcm9zOgoKICAgICAgICAgICAgICAgJXsgLi4uICV9ICAgICAgICAgICAtPiAlaW5zZXJ0KGhlYWRlcikgICV7IC4uLiAlfQogICAgICAgICAgICAgICAlaW5pdCAleyAuLi4gJX0gICAgIC0+ICVpbnNlcnQoaW5pdCkgICAgJXsgLi4uICV9CiAgICAgICAgICAgICAgICV3cmFwcGVyICV7IC4uLiAlfSAgLT4gJWluc2VydCh3cmFwcGVyKSAleyAuLi4gJX0KICAgICAgICAgICAgICAgJXJ1bnRpbWUgJXsgLi4uICV9ICAtPiAlaW5zZXJ0KHJ1bnRpbWUpICV7IC4uLiAlfQoKICAgICAgICAgICBMYW5ndWFnZSBtb2R1bGVzIGNhbiBkZWZpbmUgbmV3IG5hbWVkIHRhcmdldHMgYnkgdXNpbmcgdGhlCiAgICAgICAgICAgQyBBUEkgZnVuY3Rpb24gU3dpZ19yZWdpc3Rlcl9maWxlYnluYW1lKCkgKHNlZSBtYWluLmN4eCkuCiAgICAgICAgICAgRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50ZWQgdG8gZXhwb3NlIGEgc2hhZG93IGNsYXNzIGZpbGUsCiAgICAgICAgICAgeW91IGNvdWxkIGRvIHRoaXM6CgogICAgICAgICAgICAgIFN3aWdfcmVnaXN0ZXJfZmlsZWJ5bmFtZSgic2hhZG93IiwgZl9zaGFkb3cpOwoKICAgICAgICAgICBUaGVuIGluIHRoZSBpbnRlcmZhY2UgZmlsZToKCiAgICAgICAgICAgICAgJWluc2VydChzaGFkb3cpICV7IC4uLiAlfQoKICAgICAgICAgICBOb3RlOiB0aGlzIGNoYW5nZSBzaG91bGQgbm90IGFmZmVjdCBhbnkgb2xkIGludGVyZmFjZXMsIGJ1dAogICAgICAgICAgIGRvZXMgb3BlbiB1cCBuZXcgcG9zc2liaWxpdGllcyBmb3IgZW5oYW5jZW1lbnRzLgoKNy8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgU1dJRyBub3cgYWx3YXlzIGluY2x1ZGVzIGEgc3RhbmRhcmQgbGlicmFyeSBmaWxlICdzd2lnLnN3ZycuCiAgICAgICAgICAgVGhpcyBmaWxlIGRlZmluZXMgYSBsYXJnZSBudW1iZXIgb2YgbWFjcm8gZGVmaW5pdGlvbnMKICAgICAgICAgICB0aGF0IGRlZmluZSB0aGUgYmVoYXZpb3Igb2YgdmFyaW91cyBTV0lHIGRpcmVjdGl2ZXMuCiAgICAgICAgICAgUHJldmlvdXNseSwgYWxsIFNXSUcgZGlyZWN0aXZlcyB3ZXJlIGhhbmRsZWQgYXMgc3BlY2lhbAogICAgICAgICAgIGNhc2VzIGluIHRoZSBwYXJzZXIuICBUaGlzIG1hZGUgdGhlIHBhcnNlciBhIGxhcmdlIAogICAgICAgICAgIGJsb2F0ZWQgbWVzcy4gIE5vdywgdGhlIHBhcnNlciBpcyBzdHJpcHBlZCBkb3duIHRvIGEgZmV3CiAgICAgICAgICAgc2ltcGxlIGRpcmVjdGl2ZXMgYW5kIG1hY3JvcyBhcmUgdXNlZCB0byBoYW5kbGUgZXZlcnl0aGluZyBlbHNlLgoKNy8yNi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogRml4ZXMgZm9yIFNvdXJjZWZvcmdlIGJ1ZyAjNDQ0NzQ4IC0gbmV3IHRlc3RjYXNlIGNwcF9zdGF0aWM6CgkgICAgIFtUQ0xdIENsYXNzIHdpdGgganVzdCBzdGF0aWMgbWVtYmVyIHZhcmlhYmxlL2Z1bmN0aW9uIGZpeAoJICAgICBbSmF2YV0gRml4ZWQgc3RhdGljIHZhcmlhYmxlcyBzdXBwb3J0CgkgICAgIFtSdWJ5XSBTdGF0aWMgdmFyaWFibGVzIHdvcmthcm91bmQgcmVtb3ZlZAoKNy8yNy8yMDAxOiBta29lcHBlCgkgICAqIHN0eXBlLmMgKFN3aWdUeXBlX2RlZmF1bHQpOiBTdHJpcCBxdWFsaWZpZXJzIGZpcnN0LiBUaGUKCSAgICAgZGVmYXVsdCB0eXBlIG9mICJpbnQgKiBjb25zdCIgaXMgbm93ICJTV0lHUE9JTlRFUiAqIi4KCSAgICogbWFpbi5jeHg6IERlZmluZSAiX19jcGx1c3BsdXMiIGluIFNXSUcncyBwcmVwcm9jZXNzb3IgaWYKCSAgICAgaW4gQysrIG1vZGUuCgkgICAqIFtHdWlsZV06IEFkZGVkIHNvbWUgc3VwcG9ydCBmb3IgYXJyYXlzIGFuZCBDKysKCSAgICAgcmVmZXJlbmNlcywgZml4aW5nIHRoZSAiY29uc3RhbnRfcG9pbnRlcnMiIHRlc3QgY2FzZS4KCSAgICogTW92ZWQgbW9zdCB0ZXN0cyBmcm9tIHRoZSBvbGQgR3VpbGUtc3BlY2lmaWMgdGVzdC1zdWl0ZQoJICAgICB0byB0aGUgbmV3IHRlc3Qtc3VpdGUuICBBbHNvIG1vdmVkIHBlcmw1L3BvaW50ZXItY3h4CgkgICAgIGV4YW1wbGUgdGhlcmUuCgo3LzI2LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBUZXN0LXN1aXRlIGFkZGVkLgoJICAgKiBJbml0aWFsIHRlc3RjYXNlczogY29uc3RhbnRfcG9pbnRlcnMgY3BwX2VudW0gZGVmaW5lcwoJICAgICBzaXplb2ZfcG9pbnRlcnMgdW5pb25zIHZpcnR1YWxfZGVzdHJ1Y3RvcgoJICAgKiBNYWtlIGNsZWFuIGltcHJvdmVtZW50cy4KCjcvMjQvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIFtKYXZhXSBVbmRlcnNjb3JlcyBpbiB0aGUgcGFja2FnZSBuYW1lIGFuZC9vciBtb2R1bGUgbmFtZQoJICAgbm8gbG9uZ2VyIGdpdmUgbGlua2luZyBwcm9ibGVtcy4KCjcvMTcvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIE1vcmUgcGFyc2VyIGJ1ZyBmaXhlcyBmb3IgY29uc3RhbnQgcG9pbnRlcnMKCjcvMTkvMjAwMTogbWtvZXBwZQoJICAgKiBbR3VpbGVdIEFlc3RoZXRpYyBpbXByb3ZlbWVudCBpbiB2YXJpYWJsZSB3cmFwcGVycy4KCjcvMTgvMjAwMTogYmVhemxleQogICAgICAgICAgICogRml4ZWQgY29yZS1kdW1wIHByb2JsZW0gaW4gcG9pbnRlciBsaWJyYXJ5IHdoZW4gCiAgICAgICAgICAgICBmcmVlaW5nIGNoYXJhY3RlciBhcnJheXMuCiAgICAgICAgICAgICBTRiBCdWcgWyAjNDE1ODM3IF0gcG9pbnRlciBsaWIgY29yZSBkdW1wCgo3LzE4LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICAqIEZpeGVkIHByb2JsZW0gd2l0aCBkZWZhdWx0IGRlc3RydWN0b3JzIGFuZCBzaGFkb3cKICAgICAgICAgICAgIGNsYXNzZXMuICBTRiBidWcgIzIyMTEyOC4KCjcvMTgvMjAwMTogYmVhemxleQogICAgICAgICAgICogVG8gcHJvdmlkZSBiZXR0ZXIgbGluZS1udW1iZXIgdHJhY2tpbmcgaW4gaW50ZXJmYWNlcwogICAgICAgICAgICAgd2l0aCBsb3RzIG9mIG1hY3Jvcywgc3BlY2lhbCBsb2NhdG9yIGNvbW1lbnRzIGFyZQogICAgICAgICAgICAgbm93IGdlbmVyYXRlZCBieSB0aGUgU1dJRyBwcmVwcm9jZXNzb3IuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgLypAZm9vLmksNDIsQkxBSEAqL2V4cGFuZGVkIG1hY3JvLypAQCovCgogICAgICAgICAgICAgVGhlIGZpcnN0IC8qQC4uLkAqLyBzZXF1ZW5jZSBzZXRzIHRoZSBjb250ZXh0CiAgICAgICAgICAgICB0byBwb2ludCB0byB0aGUgbWFjcm8gY29kZS4gIFRoZSAvKkBAKi8gY29tbWVudAogICAgICAgICAgICAgdGVybWluYXRlcyB0aGUgY29udGV4dC4gIFRoZSBTV0lHIHBhcnNlciBzaG91bGQKICAgICAgICAgICAgIGlnbm9yZSBhbGwgb2YgdGhlIGxvY2F0b3IgY29tbWVudHMgYXMgc2hvdWxkCiAgICAgICAgICAgICB0aGUgQyBjb21waWxlciAoc2hvdWxkIHN1Y2ggY29tbWVudHMgZW5kIHVwCiAgICAgICAgICAgICBpbiBnZW5lcmF0ZWQgd3JhcHBlciBjb2RlKS4KCjcvMTgvMjAwMTogbWtvZXBwZQoJICAgKiBUaGUgcGFyc2VyIG5vdyBoYW5kbGVzIHNldmVyZWx5IGNvbnN0aWZpZWQgdHlwZXMgaW4KCSAgIHR5cGVtYXBzLiAgVGhpcyBpbnRyb2R1Y2VkIGEgbmV3IHNoaWZ0L3JlZHVjZSBjb25mbGljdCwgYnV0CgkgICBvbmx5IHdpdGggYSBoZXVyaXN0aWMgZnVuY3Rpb24tcG9pbnRlciBjYXRjaC1hbGwgcnVsZS4gIAoJICAgKiBbR3VpbGVdOiBBZGRlZCB0eXBlbWFwcyBmb3Igc2V2ZXJlbHkgY29uc3RpZmllZCB0eXBlcy4gCgkgICAqIEZpeGVkIHRoZSAidGVtcGxhdGUtd2hpdGVzcGFjZSIgcHJvYmxlbSBieSBjYW5vbmljYWxpemluZwoJICAgICB3aGl0ZXNwYWNlLCBlc3BlY2lhbGx5IGFyb3VuZCBhbmdsZSBicmFja2V0cyBhbmQgY29tbWFzLiAKCjcvMTcvMjAwMTogbWtvZXBwZQoJICAgKiBbR3VpbGVdOiBBIFNjaGVtZSBmaWxlIGlzIGVtaXR0ZWQgaWYgdGhlIC1zY21zdHViIEZJTEUuU0NNCgkgICBjb21tYW5kLWxpbmUgb3B0aW9uIGlzIHVzZWQuICBUaGUgJXNjaGVtZSBkaXJlY3RpdmUKCSAgIChpbXBsZW1lbnRlZCBhcyBhIG1hY3JvIGZvciBhIHByYWdtYSkgYWxsb3dzIHRvIGluc2VydAoJICAgYXJiaXRyYXJ5IGNvZGUgaGVyZS4gIEluICJzaW1wbGUiIGFuZCAicGFzc2l2ZSIgbGlua2FnZSwKCSAgIHRoZSBmaWxlIGdldHMgZmlsbGVkIHdpdGggZGVmaW5lLW1vZHVsZSBhbmQgZXhwb3J0CgkgICBkZWNsYXJhdGlvbnMuCgo3LzE3LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBQYXJzZXIgYnVnIGZpeCB0byBzdXBwb3J0IGNvbnN0YW50IHBvaW50ZXJzLCBlZyBpbnQqIGNvbnN0IHB0ci4KCSAgIEZpeGVkIGV2ZXJ5d2hlcmUgLSB2YXJpYWJsZXMsIHBhcmFtZXRlcnMsIHJldHVybiB0eXBlcyBldGMuIE5vdGUgdGhhdAoJICAgd2hlbiB3cmFwcGluZyBhIGNvbnN0YW50IHBvaW50ZXIgdmFyaWFibGUgb25seSB0aGUgZ2V0dGVyIGlzIGdlbmVyYXRlZC4KCjcvMTcvMjAwMTogbWtvZXBwZQoJICAgKiBGaXhlZCBTRiBidWcgIzQ0MTQ3MCAoI2RlZmluZSBYICIvLyIgd291bGQgbm90IGJlIHBhcnNlZCwKCSAgICAgc2VlIHRlc3Qtc3VpdGUgZW50cnkgInByZXByb2MtMSIpLCByZXBvcnRlZCBieSBULiBXLiBCdXJ0b24KCSAgICAgPHR3YnVydG9uQHVzZXJzLnNmLm5ldD4uCgkgICAqIENoYW5nZWQgdGhlIHR5cGUgb2YgY2hhcmFjdGVyIGNvbnN0YW50cyB0byAiY2hhciIsIHJhdGhlcgoJICAgICB0aGFuICJjaGFyICoiLiAgQ2hhbmdlZCB0aGUgaW5kaXZpZHVhbCBsYW5ndWFnZSBtb2R1bGVzCgkgICAgIHRvIGtlZXAgdGhlIG9sZCBiZWhhdmlvdXIsIGV4Y2VwdCBmb3IgdGhlIEd1aWxlIG1vZHVsZSwKCSAgICAgd2hlcmUgaXQgaXMgZGVzaXJlZCB0byBtYWtlIHRoZW0gU2NoZW1lIGNoYXJhY3RlcnMuICBUaGlzCgkgICAgIGZpeGVzIFNGIGJ1ZyAjMjMxNDA5LCB0ZXN0LXN1aXRlIGVudHJ5ICJjaGFyLWNvbnN0YW50Ii4KCSAgICogQXBwbGllZCBwYXRjaCBmb3IgRE9IL0RvaC9tZW1vcnkuYyBieSBMZXMgU2NoYWZmZXIKCSAgICAgPHNjaGFmZmVyQG9wdG9ubGluZS5uZXQ+IChhdm9pZCByZXF1aXJlZCBzaWRlIGVmZmVjdHMgaW4KCSAgICAgYXNzZXJ0KS4gCgo3LzE3LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBCdWcgZml4IGluIHBhcnNlciBmb3IgdmlydHVhbCBkZXN0cnVjdG9yIHdpdGggdm9pZCBhcyBwYXJhbWV0ZXIKCSAgICogQnVnIGZpeCBpbiBwYXJzZXIgI2RlZmluZXMgZW1iZWRkZWQgd2l0aGluIGNsYXNzZXMvc3RydWN0cy91bmlvbnMKCSAgIENvbnNlcXVlbnRseSAlY29uc3RhbnQgY2FuIG5vdyBhbHNvIGJlIHBsYWNlZCB3aXRoaW4gYSBzdHJ1Y3QvY2xhc3MvdW5pb24uCgkgICAqIEJ1ZyBmaXggaW4gcGFyc2VyIHRvIGFsbG93IHNpemVvZigqSV9hbV9hX3BvaW50ZXIpIHdpdGhpbiBhICNkZWZpbmUKCjcvMTYvMjAwMTogbWtvZXBwZQoJICAgKiBBZGRlZCBjaGFuZ2VzIGZvciB0aGUgTWFjaW50b3NoIGNvbnRyaWJ1dGVkIGJ5IEx1aWdpCgkgICBCYWxsYWJpbyA8YmFsbGFiaW9AbWFjLmNvbT4uIAoJICAgKiBTb21lICJjb25zdCIgZml4ZXMgaW4gdGhlIGNvZGUuCgkgICAqIFtHdWlsZV06IE1hZGUgdGhlIGNvbnN0YW50LXdyYXBwZXIgZnVuY3Rpb25zIG11Y2ggc2hvcnRlci4KCjcvMTMvMjAwMTogbWtvZXBwZQoJICAgKiBbR3VpbGVdOiBTb21lICJjb25zdCIgZml4ZXMgZm9yIEd1aWxlIHZlcnNpb24gMS4zLjQuCgkgICAqIEhhbmRsZSBhbm9ueW1vdXMgYXJndW1lbnRzIHdpdGggZGVmYXVsdCB2YWx1ZXMgYW5kIHN0YXRpYwoJICAgICBhcnJheSBtZW1iZXJzIG9mIGNsYXNzZXMuICBCb3RoIGJ1Z3MgcmVwb3J0ZWQgYnkgQW5uYWxpc2EgVGVycmFjaW5hCgkgICAgIDxhbm5hbGlzYS50ZXJyYWNpbmFAZGF0YW1hdC5pdD47IHNlZSB0aGUgZmlsZXMKCSAgICAgRXhhbXBsZXMvZ3VpbGUvdGVzdC1zdWl0ZS9zdGF0aWMtYXJyYXktbWVtYmVyLmkgYW5kCgkgICAgIGFub255bW91cy1hcmcuaS4KClZlcnNpb24gMS4zLjYgIChKdWx5IDksIDIwMDEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo3LzA5LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBHSUZQbG90IGV4YW1wbGVzOiBGT1JFR1JPVU5EIGFuZCBCQUNLR1JPVU5EIGRlZmluaXRpb24gbWlzc2luZyAKCSAgIGFmdGVyIFRSQU5TUEFSRU5UICNkZWZpbmUgZml4IGluIEdJRlBsb3QKCjcvMDMvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIHVwIHRoZSB2ZXJzaW9uIG51bWJlcnMgc28gdGhhdCB0aGUgcmVsZWFzZSBpcyBrbm93bgogICAgICAgICAgIGFzIDEuMy42LiAgQWxsIGZ1dHVyZSByZWxlYXNlcyBzaG91bGQgaGF2ZSBhIHNpbWlsYXIKICAgICAgICAgICB2ZXJzaW9uIGZvcm1hdC4KCjcvMDIvMjAwMTogbWtvZXBwZQoJICAgKiBbUHl0aG9uXTogUHJldmVudCB0aGUgcHJvYmxlbSBvZiBzZWxmLnRoaXNvd24gbm90IGJlaW5nCgkgICBkZWZpbmVkIGlmIHRoZSBDKysgY2xhc3MgY29uc3RydWN0b3IgcmFpc2VkIGFuIGV4Y2VwdGlvbi4KCSAgIFRoYW5rcyB0byBMdWlnaSBCYWxsYWJpbyA8YmFsbGFiaW9AbWFjLmNvbT4uCgo2LzI5LzIwMDE6IG1rb2VwcGUKCSAgICogTW9yZSBwb3J0YWJpbGl0eSBmaXhlczsgZml4ZWQgImdjYyAtV2FsbCIgd2FybmluZ3MuCgo2LzI5LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBHSUZQbG90IGV4YW1wbGVzOiBUUkFOU1BBUkVOVCAjZGVmaW5lIG11bHRpcGxlIHRpbWVzIG9uIFNvbGFyaXMgCgkgICAoY2xhc2hlcyB3aXRoIHN0cmVhbS5oKS4KCSAgICogTXVsdGlwbGUgZGVmaW5pdGlvbiBidWcgZml4IGZvciBzaGFkb3cgY2xhc3Nlcy4gVGhlIHBlcmwgYW5kIHB5dGhvbiAKCSAgIG1vZHVsZXMgaGFkIHdvcmthcm91bmRzIHdoaWNoIGhhdmUgYmVlbiByZXBsYWNlZCB3aXRoIGZpeGVzIGluIAoJICAgdGhlIGNvcmUuIE1hbnkgb2YgdGhlIExhbmd1YWdlOjpjcHBfeHh4eCBmdW5jdGlvbnMgbm93IHNldCBhIAoJICAgZmxhZyB3aGljaCB0aGUgZGVyaXZlZCBjbGFzc2VzIGNhbiBhY2Nlc3MgdGhyb3VnaCAKCSAgIGlzX211bHRpcGxlX2RlZmluaXRpb24oKSB0byBzZWUgd2hldGhlciBvciBub3QgY29kZSBzaG91bGQgYmUgCgkgICBnZW5lcmF0ZWQuICBUaGUgY29kZSBiZWxvdyB3b3VsZCBoYXZlIHByb2R1Y2VkIHZhcnlpbmcgZGVncmVlcyAKCSAgIG9mIGluY29ycmVjdCBzaGFkb3cgY2xhc3MgY29kZSBmb3IgdGhlIHZhcmlvdXMgbW9kdWxlczoKCSAgIGNsYXNzIFRlc3RDbGFzcwoJICAgewoJICAgcHVibGljOgoJICAgICBUZXN0Q2xhc3MoKSB7fQoJICAgICBUZXN0Q2xhc3MoaW50IGEpIHt9CgkgICAgIH5UZXN0Q2xhc3MoKSB7fQoJICAgICB1bnNpZ25lZCBsb25nIHh5eihzaG9ydCBrKSB7fQoJICAgICB1bnNpZ25lZCBsb25nIHh5eihpbnQgbikge30KCSAgICAgc3RhdGljIHZvaWQgc3RhdGljX2Z1bmMoKSB7fQoJICAgICBzdGF0aWMgdm9pZCBzdGF0aWNfZnVuYyhpbnQgYSkge30KCSAgIH07CgkgICB2b2lkIGRlbGV0ZV9UZXN0Q2xhc3MoaW50IGEpOwoKNi8yNy8yMDAxOiBta29lcHBlCgkgICAqIFtQZXJsXSBBbm90aGVyIGNvbnN0LXJlbGF0ZWQgcG9ydGFiaWxpdHkgZml4LgoKNi8yNi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogW0phdmFdIEFkZGVkIGluIGNwcF9wcmFnbWEoKSBzdXBwb3J0IHdpdGggYSBob3N0IG9mIG5ldyBwcmFnbWFzIC0gc2VlIAoJICAganN3aWcuaHRtbC4gVGhlc2UgYXJlIGRlc2lnbmVkIGZvciBiZXR0ZXIgbWl4aW5nIG9mIEphdmEgYW5kIGMrKy4gSXQgCgkgICBlbmFibGVzIHRoZSB1c2VyIHRvIHNwZWNpZnkgcHVyZSBKYXZhIGNsYXNzZXMgYXMgYmFzZXMgYW5kL29yIGludGVyZmFjZXMgCgkgICBmb3IgdGhlIHdyYXBwZWQgYy9jKysuCgkgICAqIFtKYXZhXSBPbGQgcHJhZ21hcyByZW5hbWVkLiBXYXJuaW5nIGdpdmVuIGZvciB0aGUgbW9tZW50IGlmIHVzZWQuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgo2LzI1LzIwMDE6IG1rb2VwcGUKCSAgICogSW5jb3Jwb3JhdGVkIG1vcmUgYnVpbGQgY2hhbmdlcyBjb250cmlidXRlZCBieSBXeXNzIENsZW1lbnMKCSAgIDxXWVNAaGVsYmxpbmcuY2g+IGZvciBzd2lnL3J1Ynkgb24gY3lnd2luLgoKNi8yMC8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogTWFrZWZpbGUgbW9kcyBzbyB0aGF0ICdtYWtlIGNoZWNrJyB1c2VzIHRoZSBzd2lnIG9wdGlvbnMgaW4gdGhlIG1ha2VmaWxlcwoJICAgKiBbSmF2YV0gUmVtb3ZlZCBHZW5lcmF0aW5nIHdyYXBwZXJzIG1lc3NhZ2UKCSAgICogW0phdmFdIE5VTEwgcG9pbnRlciBidWcgZml4CgkgICAqIFtKYXZhXSBCdWcgZml4IGZvciBLYWZmZSBKVk0KCjYvMjAvMjAwMTogbWtvZXBwZQoJICAgKiBTV0lHX1R5cGVRdWVyeSBmcm9tIGNvbW1vbi5zd2cgbm93IHJldHVybnMgYQoJICAgc3dpZ190eXBlX2luZm8qIHJhdGhlciB0aGFuIGEgdm9pZCouICBUaGlzIGZpeGVzIGEgcHJvYmxlbQoJICAgd2hlbiB1c2luZyBwb2ludGVyLmkgYW5kIEMrKywgYXMgaWxsdXN0cmF0ZWQgYnkgdGhlIG5ldwoJICAgdGVzdC1zdWl0ZSBleGFtcGxlIHBlcmw1L3BvaW50ZXItY3h4LgoJICAgKiBQb3J0YWJpbGl0eSBmaXhlcyAoY29uc3QgY2hhciAqKS4gCgkgICAqIEluY29ycG9yYXRlZCBidWlsZCBjaGFuZ2VzIGNvbnRyaWJ1dGVkIGJ5IFd5c3MgQ2xlbWVucwoJICAgPFdZU0BoZWxibGluZy5jaD4sIHdoaWNoIG1ha2Ugc3dpZyBydW5uYWJsZSBvbiBjeWd3aW4uCgo2LzE5LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBbSmF2YV0gQnVnIGZpeCBmb3IgU0YgYnVnICMyMTExNDQuIFRoaXMgZml4IGlzIGEgd29ya2Fyb3VuZCAKCSAgICAgdW50aWwgZml4ZWQgaW4gdGhlIGNvcmUuCgo2LzE5LzIwMDE6IG1rb2VwcGUKCSAgICogW0d1aWxlXTogUG9ydGFiaWxpdHkgZml4ZXMgZm9yIHVzZSB3aXRoIHRoZSBTdW4gRm9ydGUKCSAgIGNvbXBpbGVycy4gCgkgICAqIFtUY2xdOiBQb3J0YWJpbGl0eSBmaXggKGNvbnN0IGNoYXIgKikuCgkgICAqIFtUY2xdOiBDb25maWd1cmUgbm93IGZpcnN0IHRyaWVzIHRvIGZpbmQgYSB0Y2xDb25maWcuc2gKCSAgIGZpbGUgaW4gb3JkZXIgdG8gZmluZCB0aGUgVGNsIGluY2x1ZGUgZGlyZWN0b3J5LCBsaWJyYXJ5CgkgICBsb2NhdGlvbiBhbmQgbGlicmFyeSBuYW1lLgoJICAgKiBbUHl0aG9uXTogQWRkZWQgYSBmZXcgcG9zc2libGUgbGlicmFyeSBsb2NhdGlvbnMuCgo2LzE4LzIwMDE6IG1rb2VwcGUKCSAgICogW0d1aWxlXTogRG9uJ3QgY2FsbCBzY21fY19leHBvcnQgaWYgbm90aGluZyBpcyB0byBiZQoJICAgICBleHBvcnRlZC4gIERvbid0IHdhcm4gb24gJW1vZHVsZSBpZiBtb2R1bGUgaGFzIGJlZW4gc2V0CgkgICAgIGFscmVhZHkgKHRoaXMgZnJlcXVlbnRseSBvY2N1cnMgd2hlbiAlaW1wb3J0IGlzIHVzZWQpLgoKNi8xNi8yMDAxOiBta29lcHBlCgkgICAqIFtHdWlsZV06IE5ldyAicGFzc2l2ZSIgbGlua2FnZSwgd2hpY2ggaXMgYXBwcm9wcmlhdGUgZm9yCgkgICAgIG11bHRpLW1vZHVsZSBleHRlbnNpb25zIHdpdGhvdXQgR3VpbGUgbW9kdWxlIG1hZ2ljLgoKNi8xNS8yMDAxOiBta29lcHBlCgkgICAqIFtHdWlsZV06IEZpeGVkIHByaW50aW5nIG9mIHNtb2JzIChzcGFjZSBhbmQgYW5nbGUgd2VyZQoJICAgICBtaXNzaW5nKS4gCgkgICAqIFByb3Blcmx5IGdlbmVyYXRlIHR5cGUgaW5mb3JtYXRpb24gZm9yIGJhc2UgY2xhc3NlcwoJICAgICBpbXBvcnRlZCB3aXRoIHRoZSAlaW1wb3J0IGRpcmVjdGl2ZS4gIFRoYW5rcyB0byBNYXJjZWxvCgkgICAgIE1hdHVzIDxtbWF0dXNAYWNtcy5hcml6b25hLmVkdT4gZm9yIHRoZSByZXBvcnQgYW5kIHRoZQoJICAgICBwYXRjaDsgdGhpcyBjbG9zZXMgU0YgYnVnICMyMzE2MTk7IHNlZSBhbHNvCgkgICAgIEV4YW1wbGVzL2d1aWxlL3Rlc3Qtc3VpdGUvaW1wb3J0Ki4gCgkgICAqIFtHdWlsZV06IEZpeCBjYXN0aW5nIGJldHdlZW4gY2xhc3MgYW5kIGJhc2UgY2xhc3M7IHRoZQoJICAgICBydW50aW1lIHR5cGUgc3lzdGVtIGhhZCBpdCB0aGUgd3Jvbmcgd2F5IGFyb3VuZDsgc2VlCgkgICAgIEV4YW1wbGVzL2d1aWxlL3Rlc3Qtc3VpdGUvY2FzdHMuaQoJICAgKiBNYWtlIHR5cGVtYXBzIGZvciBTV0lHUE9JTlRFUiAqIHdpdGggYXJnIG5hbWUgdGFrZQoJICAgICBwcmVjZWRlbmNlIG92ZXIgdGhvc2Ugd2l0aG91dCBhcmcgbmFtZSwgdG8gbWF0Y2ggbm9ybWFsCgkgICAgIHR5cGVtYXAgcHJlY2VkZW5jZSBydWxlcy4KCSAgICogRml4ZWQgdGhlIHJhbmRvbS1saW5lLW51bWJlcnMgcHJvYmxlbSByZXBvcnRlZCBhcyBTRiBidWcKCSAgICAgIzIxNzMxMDsgdGhhbmtzIHRvIE1pY2hhZWwgU2NoYXJmIDxzY2hhcmZAdXNlcnMuc2YubmV0Pi4KCSAgICogW0d1aWxlXTogSGFuZGxlIHRoZSAlbmFtZSBhbmQgJXJlbmFtZSBkaXJlY3RpdmVzLgoJICAgKiBOZXcgc3ludGF4OiAlbmFtZSBhbmQgJXJlbmFtZSBub3cgb3B0aW9uYWxseSB0YWtlIGRvdWJsZQoJICAgICBxdW90ZXMgYXJvdW5kIHRoZSBzY3JpcHRpbmcgbmFtZS4gIFRoaXMgaXMgdG8gYWxsb3cgc2NyaXB0aW5nCgkgICAgIG5hbWVzIHRoYXQgYXJlbid0IHZhbGlkIEMgaWRlbnRpZmllcnMuCgo2LzE0LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBNYWRlIGEgbWlub3IgY2hhbmdlIHRvIHRoZSB3YXkgZmlsZXMgYXJlIGxvYWRlZCBpbgogICAgICAgICAgIG9yZGVyIHRvIGdldCBmaWxlL2xpbmUgbnVtYmVyIHJlcG9ydGluZyBjb3JyZWN0IGluCiAgICAgICAgICAgdGhlIHByZXByb2Nlc3Nvci4KCjYvMTQvMjAwMTogbWtvZXBwZQoJICAgKiBUaGUgcGFyc2VyIG5vdyB1bmRlcnN0YW5kcyB0aGUgKG5vbi1zdGFuZGFyZCkgImxvbmcgbG9uZyIKCSAgICAgdHlwZXMuIEl0IGlzIHVwIHRvIHRoZSBpbmRpdmlkdWFsIGxhbmd1YWdlIG1vZHVsZXMgdG8KCSAgICAgcHJvdmlkZSB0eXBlbWFwcyBpZiBuZWVkZWQuIFJlcG9ydGVkIGJ5IFNhbSBTdGVpbmdvbGQsIFNGCgkgICAgIGJ1ZyAjNDI5MTc2LgoJICAgKiBUaGUgcGFyc2VyIG5vdyB1bmRlcnN0YW5kcyBhcmd1bWVudHMgbGlrZSAiY29uc3QgaW50ICoKCSAgICAgY29uc3QgaSIuIFRoaXMgZml4ZXMgU0YgYnVnICMyMTU2NDkuCgkgICAqIEZpeGVkIHRoZSBHdWlsZSB0ZXN0LXN1aXRlLgoKNi8xMy8yMDAxOiBta29lcHBlCgkgICBQYXJ0aWFsIG1lcmdlIGZyb20gdGhlIENWUyB0cnVuayBhdCB0YWcKCSAgICJta29lcHBlLW1lcmdlLTEiLiBUaGlzIGNvdmVycyB0aGUgZm9sbG93aW5nIGNoYW5nZXM6Cgp8IDAxLzE2LzAxOiB0dG4KfAkgICBXcm90ZSB0YWJsZSBvZiBjb250ZW50cyBmb3IgRG9jL2VuZ2luZWVyaW5nLmh0bWwuICBBZGRlZCBzZWN0aW9uCnwJICAgb24gQ1ZTIHRhZ2dpbmcgY29udmVudGlvbnMuICBBZGRlZCBjb3B5cmlnaHQgdG8gb3RoZXIgZG9jcy4KfCA5LzI1LzAwIDogYmVhemxleQp8IAkgICBNb2RpZmllZCB0aGUgcHJlcHJvY2Vzc29yIHNvIHRoYXQgbWFjcm8gbmFtZXMgY2FuIHN0YXJ0IHdpdGggYSAnJScuCnwgCSAgIFRoaXMgbWF5IGFsbG93IG5ldyBTV0lHICJkaXJlY3RpdmVzIiB0byBiZSBkZWZpbmVkIGFzIG1hY3JvcyBpbnN0ZWFkCnwgCSAgIG9mIGhhdmluZyB0byBiZSBoYXJkLWNvZGVkIGludG8gdGhlIHBhcnNlci4gIAp8CnwgKioqIEFsc28gYSB5ZXQtdG8tYmUtZG9jdW1lbnRlZCBxdW90aW5nIG1lY2hhbmlzbSB3aXRoIGJhY2txdW90ZXMKfCAqKiogaGFzIGJlZW4gaW1wbGVtZW50ZWQ/Cgo2LzEzLzIwMDE6IG1rb2VwcGUKCSAqIFdoZW4gY29uZmlndXJlIGRvZXMgbm90IGZpbmQgYSBsYW5ndWFnZSwgZG9uJ3QgdXNlIGRlZmF1bHQKCSAgIHBhdGhzIGxpa2UgL3Vzci9sb2NhbC9pbmNsdWRlOyB0aGlzIG9ubHkgY2F1c2VzIGJ1aWxkCgkgICBwcm9ibGVtcy4KCSAqIE5ldyBkaXJlY3Rvcnk6IEV4YW1wbGVzL0d1aWxlL3Rlc3Qtc3VpdGUsIHdoZXJlIGEgZmV3CgkgICBidWdzIGluIDEuM2E1IGFyZSBkZW1vbnN0cmF0ZWQuIAoJICogSGFuZGxlIEMrKyBtZXRob2RzIHRoYXQgaGF2ZSBib3RoIGEgImNvbnN0IiBhbmQgYSAidGhyb3ciCgkgICBkaXJlY3RpdmUgKHNlZSBFeGFtcGxlcy9HdWlsZS90ZXN0LXN1aXRlL2NwbHVzcGx1cy10aHJvdy5pKTsgCgkgICB0aGFua3MgdG8gU2NvdHQgQi4gRHJ1bW1vbmRzIGZvciB0aGUgcmVwb3J0IGFuZCB0aGUgZml4LiAKCSAqIEhhbmRsZSBDKysgcG9pbnRlci1yZWZlcmVuY2UgYXJndW1lbnRzIChsaWtlICJpbnQgKiYgYXJnIikgCgkgICAoc2VlIEV4YW1wbGVzL0d1aWxlL3Rlc3Qtc3VpdGUvcG9pbnRlci1yZWZlcmVuY2UuaSwKCSAgIHJlcG9ydGVkIGFzIFNGIGJ1ZyAjNDMyMjI0KS4KCSAqIFtSdWJ5XSBGaXhlZCB0eXBvIGluIHJ1YnlkZWMuc3dnOyB0aGFua3MgdG8gTHlsZSBKb2huc29uIQoJICogRG9uJ3Qgc3RvcCB0ZXN0aW5nIHdoZW4gb25lIHRlc3QgZmFpbHMuCgkgKiBbR3VpbGUsIE16U2NoZW1lXSBEb24ndCBwcmludCAiR2VuZXJhdGluZyB3cmFwcGVycy4uLiIuCgo2LzEyLzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gVkVDVE9STEVOSU5QVVQgYW5kIExJU1RMRU5JTlBVVCBub3cgaGF2ZSBzZXBhcmF0ZQoJICAgbGlzdCBsZW5ndGggdmFyaWFibGVzLiBUWVBFTUFQX1BPSU5URVJfSU5QVVRfT1VUUFVUCgkgICBhdHRhY2hlcyBhcmd1bWVudCBkb2N1bWVudGF0aW9uIGludm9sdmluZyBTQ01fVFlQRSB0byB0aGUKCSAgIHN0YW5kYXJkIHBvaW50ZXIgdHlwZW1hcHMuIElOT1VUIGlzIG5vdyBhbiBhbGlhcyBmb3IgQk9USC4KCjYvMTIvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICBTb21lIEphdmEgZG9jdW1lbnRhdGlvbiBhZGRlZC4KCSAgIFtKYXZhXSBGaXhlZCBidWdzIGluIGltcG9ydCBwcmFnbWEgYW5kIHNoYWRvdyBwcmFnbWEuIAoKNi8xMi8yMDAxOiBta29lcHBlCgkgICBGaXggZGVjbGFyYXRpb25zIG9mIFNXSUdfZGVmaW5lX2NsYXNzCgkgICAoTGliL3J1YnkvcnVieWRlYy5zd2cpIGFuZCBTV0lHX1R5cGVRdWVyeQoJICAgKExpYi9jb21tb24uc3dnKS4gVGhhbmtzIHRvIEx5bGUgSm9obnNvbgoJICAgPGxqb2huc29uQHJlc2dlbi5jb20+IGZvciB0aGUgcGF0Y2hlcy4KCjYvMTEvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBVc2UgbG9uZyBpbnN0ZWFkIG9mIHNjbV9iaXRzX3Q7IHRoaXMgbWFrZXMgdGhlCgkgICBnZW5lcmF0ZWQgd3JhcHBlciBjb2RlIGNvbXBhdGlibGUgd2l0aCBHdWlsZSAxLjMuNAoJICAgYWdhaW4uIFRoYW5rcyB0byBNYXNha2kgRnVrdXNoaW1hIGZvciBwb2ludGluZyB0aGlzIG91dC4KCjYvMTEvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICBUaGUgZ2VuZXJpYyBJTlNUQUxMIGZpbGUgZnJvbSBhdXRvY29uZiBhZGRlZC4gRmV3IGNoYW5nZXMgdG8gUkVBRE1FIGZpbGUuCgo2LzExLzIwMDE6IG1rb2VwcGUKCSAgIEZpeGVkIHR5cG8gaW4gTWFrZWZpbGUuaW47IHRoYW5rcyB0byBHcmVnIFRyb3hlbAoJICAgPGdkdEBpci5iYm4uY29tPi4gCgo2LzA4LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgbWFrZSBjaGVjayB3b3JrcyBhZ2Fpbi4gRXhhbXBsZXMvR0lGUGxvdCBjb25maWd1cmUgZ2VuZXJhdGVkIGJ5CgkgICB0b3AgbGV2ZWwgYXV0b2NvbmYgbm93LgoKNi8wOC8yMDAxOiBta29lcHBlCgkgICBBbm90aGVyIGJ1aWxkIGNoYW5nZTogVGhlIG5ldyBzY3JpcHQgYXV0b2dlbi5zaCBydW5zCgkgICBhdXRvY29uZiBpbiB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0b3JpZXMuICBUaGUgdG9wLWxldmVsCgkgICBjb25maWd1cmUgYWxzbyBjb25maWd1cmVzIGluIEV4YW1wbGVzL0dJRlBsb3QuCgo2LzA3LzIwMDE6IG1rb2VwcGUKCSAgIE1hZGUgdGhlIE1ha2VmaWxlIHdvcmsgd2l0aCBub24tR05VIG1ha2UgYWdhaW4uCgo2LzA3LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgW0phdmFdIENsYXNzL3N0cnVjdCBtZW1iZXJzIHRoYXQgYXJlIGFycmF5cyBvZiBwb2ludGVycyB0byBjbGFzc2VzL3N0cnVjdHMgLQoJICAgU2hhZG93IGNsYXNzJ3MgZ2V0L3NldCBhY2Nlc3NvcnMgbm93IHVzZSBKYXZhIGNsYXNzZXMgaW5zdGVhZCBvZiBsb25ncyAocG9pbnRlcnMpLgoJICAgW0phdmFdIFNoYWRvdyBjbGFzc2VzIHdpbGwgbm93IGNsZWFuIHVwIG1lbW9yeSBpZiBmdW5jdGlvbiByZXR1cm4gdHlwZSAKCSAgIGlzIGEgY2xhc3Mvc3RydWN0LgoJICAgW0phdmFdIE5ldyBleGFtcGxlIGNhbGxlZCByZWZlcmVuY2UgYmFzZWQgb24gdGhlIHNhbWUgZXhhbXBsZSBmcm9tIG90aGVyIG1vZHVsZXMuCgo2LzA2LzIwMDE6IG1rb2VwcGUKCSAgIE5ldyBjb25maWd1cmUgb3B0aW9uIC0td2l0aC1yZWxlYXNlLXN1ZmZpeCBhbGxvd3MgZm9yCgkgICBhdHRhY2hpbmcgYSBzdWZmaXggdG8gdGhlIHN3aWcgYmluYXJ5IGFuZCB0aGUgc3dpZyBydW50aW1lCgkgICBsaWJyYXJpZXMuICBNaW5vciBjaGFuZ2VzIHRvIHRoZSBidWlsZCBzeXN0ZW0uICAic3dpZwoJICAgLXN3aWdsaWIiIHdvcmtzIGFnYWluLiAgSWYgaW52b2tlZCB3aXRoIHRoZSBuZXcgb3B0aW9uCgkgICAiLWxkZmxhZ3MiLCBTV0lHIHByaW50cyBhIGxpbmUgb2YgbGlua2VyIGZsYWdzIG5lZWRlZCB0bwoJICAgbGluayB3aXRoIHRoZSBydW50aW1lIGxpYnJhcnkgb2YgdGhlIHNlbGVjdGVkIGxhbmd1YWdlCgkgICBtb2R1bGUuIAoKNi8wNi8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIGdzd2lnX2xpc3RfcCBpcyBhbiBpbnQsIG5vdCBhIFNDTS4gIFRoaXMgdHlwbwoJICAgY2F1c2VkIHdhcm5pbmdzIHdoZW4gY29tcGlsaW5nIHdpdGggYSBHdWlsZSBjb25maWd1cmVkIHdpdGgKCSAgIHN0cmljdCBDIHR5cGUgY2hlY2tpbmcuIEluIElOUFVUIGFuZCBCT1RIIHR5cGVtYXBzCgkgICBnZW5lcmF0ZWQgYnkgdGhlIFNJTVBMRV9NQVAgbWFjcm8sIHVzZSB0aGUgU0NNX1RPX0MKCSAgIGZ1bmN0aW9uIHRvIGNvbnZlcnQgZnJvbSBHdWlsZSB0byBDIChyYXRoZXIgdGhhbiBDX1RPX1NDTSkuCgkgICBVc2Ugc2NtX2ludHByaW50IHRvIHByaW50IHBvaW50ZXJzIChyYXRoZXIgdGhhbgoJICAgc3ByaW50ZikuIEFsbG93IHVzaW5nICItbGlua2FnZSIgaW5zdGVhZCBvZiAiLUxpbmthZ2UiLiAKCjYvMDUvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICBbSmF2YV0gTW9kcyBmb3IgdXNpbmcgaW5oZXJpdGVkIGMrKyBjbGFzc2VzIGZyb20gSmF2YQoJICAgW0phdmFdIE5ldyBleGFtcGxlIGNhbGxlZCBjbGFzcyBiYXNlZCBvbiB0aGUgc2FtZSBleGFtcGxlIGZyb20gb3RoZXIgbW9kdWxlcwoKNi8wNS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFtKYXZhXSBkZXN0cnVjdG9yIChfZGVsZXRlKCkpIHdhcyBub3QgYXdhcmUgb2YgJW5hbWUgcmVuYW1pbmcKCSAgIFtKYXZhXSBleHRlbmRzIGJhc2VjbGFzcyBkaWQgbm90IGtub3cgYWJvdXQgJW5hbWUgcmVuYW1pbmcKCSAgIFtKYXZhXSBleHRlbmRzIGJhc2VjbGFzcyBkaWQgZXh0ZW5kIGV2ZW4gd2hlbiB0aGUgYmFzZWNsYXNzIHdhcyBub3Qga25vd24gdG8gc3dpZwoJICAgW0phdmFdIHNvbWV0aW1lcyBlbnVtLWRlY2xhcmF0aW9ucyBvY2N1cnJlZCBiZWZvcmUgdGhlIEphdmEgY2xhc3MgZGVjbGFyYXRpb24KCSAgIFtKYXZhXSB1bnJlbGF0ZWQgZW51bSBpbml0aWFsaXNhdGlvbnMgbm8gbG9uZ2VyIGFwcGVhciBpbiBKYXZhIGNsYXNzCgkgICBbSmF2YV0gaWYgbW9kdWxlIGVuZHMgaW4gJ18nIGNvcnJlY3QgSk5JIG5hbWVzIGFyZSBub3cgcHJvZHVjZWQKCjYvMDQvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICBbSmF2YV0gU2hhZG93IGNsYXNzIG1vZHMgLSBNb2RpZmllZCBjb25zdHJ1Y3RvciByZXBsYWNlcwoJICAgbmV3SW5zdGFuY2UoKS4gX2RlbGV0ZSgpIG5vdyB0aHJlYWQgc2FmZS4gZ2V0Q1B0cigpIHJlcGxhY2VzCgkgICBfc2VsZi4gX3NlbGZDbGFzcygpIHJlbW92ZWQgYXMgbm93IHJlZHVuZGFudC4gCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgoJICAgW0phdmFdIE5vdCBhbGwgb3V0cHV0IGphdmEgZmlsZXMgaGFkIFNXSUcgYmFubmVyLiBOZXcgYmFubmVyLgoKCSAgIFtKYXZhXSBTaGFkb3cgY2xhc3MgZmluYWxpemVycyBhcmUgb3V0cHV0IGJ5IGRlZmF1bHQ6IENvbW1hbmQKCSAgIGxpbmUgb3B0aW9uIC1maW5hbGl6ZSBkZXByZWNhdGVkIGFuZCByZXBsYWNlZCB3aXRoIC1ub2ZpbmFsaXplLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKNi8gMS8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIENhc3QgU0NNX0NBUigpIHRvIHNjbV9iaXRzX3QgYmVmb3JlIHNoaWZ0aW5nIGl0LgoJICAgVGhpcyBpcyByZXF1aXJlZCBmb3IgY29tcGlsaW5nIHdpdGggYSBHdWlsZSBjb25maWd1cmVkIHdpdGgKCSAgIHN0cmljdCBDIHR5cGUgY2hlY2tpbmcuICAKCjYvIDEvMjAwMTogbWtvZXBwZQoJICAgQWRkZWQgY29uZmlndXJlIG9wdGlvbiAiLS13aXRoLXN3aWdsaWJkaXIiLgoKNS8zMS8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIFN1cHBvcnQgbXVsdGlwbGUgcGFyYWxsZWwgbGlzdHMgb3IgdmVjdG9ycyBpbgoJICAgdGhlIHR5cGVtYXBzIHByb3ZpZGVkIGJ5IGxpc3QtdmVjdG9yLmkuICBOZXcgdHlwZW1hcHMgZmlsZSwKCSAgIHBvaW50ZXItaW4tb3V0LmkuIAoKNS8yNS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFtKYXZhXSBIVE1MIHVwZGF0ZSBmb3IgZXhhbXBsZXMuCgo1LzI4LzIwMDE6IG1rb2VwcGUKCSAgIE1pbm9yIGNoYW5nZXMgdG8gdGhlIGJ1aWxkIHN5c3RlbS4gIEFkZGVkIHN1YmRpcmVjdG9yeSBmb3IKCSAgIERlYmlhbiBwYWNrYWdlIGNvbnRyb2wgZmlsZXMuCgo1LzI4LzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gQnVpbGQgYSBydW50aW1lIGxpYnJhcnksIGxpYnN3aWdndWlsZS4KCjUvMjgvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBOZXcgdHlwZW1hcCBzdWJzdGl0dXRpb24gJCpkZXNjcmlwdG9yLiAgVXNlIHRoZSB7fQoJICAgc3ludGF4LCByYXRoZXIgdGhhbiB0aGUgIiIgc3ludGF4IGZvciB0aGUgc3RhbmRhcmQKCSAgIHR5cGVtYXBzLCBpbiBvcmRlciB0byB3b3JrIGFyb3VuZCBzdHJhbmdlIG1hY3JvLWV4cGFuc2lvbgoJICAgYmVoYXZpb3Igb2YgdGhlIFNXSUcgcHJlcHJvY2Vzc29yLiAgVGhpcyBpbnRyb2R1Y2VzIHNvbWUKCSAgIGV4dHJhIGJyYWNlcy4KCjUvMjcvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBIYW5kbGUgcG9pbnRlciB0eXBlcyB3aXRoIHR5cGVtYXBzLCByYXRoZXIgdGhhbgoJICAgaGFyZC1jb2RlZC4gTmV3IHR5cGVtYXAgc3Vic3RpdHV0aW9ucyAkZGVzY3JpcHRvciwKCSAgICRiYXNlZGVzY3JpcHRvcjsgc2VlIGRvY3VtZW50YXRpb24uIFNvbWUgY2xlYW4tdXAgaW4gdGhlCgkgICB2YXJpYWJsZS9jb25zdGFudHMgd3JhcHBlciBnZW5lcmF0b3IgY29kZS4gIE5ldyBjb252ZW5pZW5jZQoJICAgbWFjcm8gU1dJR19HdWlsZV9NdXN0R2V0UHRyLCB3aGljaCBhbGxvd3MgZ2V0dGluZyBwb2ludGVycwoJICAgZnJvbSBzbW9icyBpbiBhIGZ1bmN0aW9uYWwgc3R5bGUuICBOZXcgdHlwZW1hcCBmaWxlCgkgICAibGlzdC12ZWN0b3IuaSIsIHByb3ZpZGluZyBtYWNyb3MgdGhhdCBkZWZpbmUgdHlwZW1hcHMgZm9yCgkgICBjb252ZXJ0aW5nIGJldHdlZW4gQyBhcnJheXMgYW5kIFNjaGVtZSBsaXN0cyBhbmQgdmVjdG9ycy4KCjUvMjUvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICBbSmF2YV0gU1RMIHN0cmluZyBtb3ZlZCBpbnRvIGl0cyBvd24gdHlwZW1hcCBhcyBpdCBpcyBjKysgY29kZSBhbmQgCgkgICBpdCBicmVhayBhbnkgYyBjb2RlIHVzaW5nIHRoZSB0eXBlbWFwcy5pIGZpbGUuCgkgICAtIEZpeGVzIGZvciB3cmFwcGVycyBhcm91bmQgZ2xvYmFsIHZhcmlhYmxlcyAtIGFwcGxpZXMgdG8gcHJpbWl0aXZlIAoJICAgdHlwZXMgYW5kIHVzZXIgdHlwZXMgKGNsYXNzL3N0cnVjdCkgYW5kIHBvaW50ZXJzIHRvIHRoZXNlLgoJICAgLSBTdHJ1Y3R1cmUgbWVtYmVyIHZhcmlhYmxlcyBhbmQgY2xhc3MgcHVibGljIG1lbWJlciB2YXJpYWJsZXMgZ2V0dGVycyAKCSAgIGFuZCBzZXR0ZXJzIHBhc3MgYSBwb2ludGVyIHRvIHRoZSBtZW1iZXIgYXMgd2FzIGluIDEuM2EzIGFuZCAxLjEgCgkgICAoMS4zYTUgd2FzIHBhc3NpbmcgYnkgdmFsdWUpCgkgICAtIFBhcmFtZXRlcnMgdGhhdCB3ZXJlIGFycmF5cyBhbmQgcmV0dXJuIHR5cGVzIHdlcmUgaW5jb3JyZWN0bHkgCgkgICBiZWluZyBwYXNzZWQgdG8gY3JlYXRlX2Z1bmN0aW9uKCkgYXMgcG9pbnRlcnMuCgkgICAtIEZpeCBmb3IgYXJyYXlzIG9mIGVudW1zLiAKCSAgIFtKYXZhXSBVcGRhdGVkIGphdmEgZXhhbXBsZXMgYW5kIGFkZGVkIHR3byBtb3JlLgoJICAgW0phdmFdIEphdmEgbW9kdWxlIHVwZGF0ZWQgZnJvbSBTV0lHMS4zYTMgaW5jbHVkaW5nIGNvZGUgY2xlYW51cCBldGMuCgkgICBbSmF2YV0gZW51bSBzdXBwb3J0IGFkZGVkLgoJICAgW0phdmFdIEFycmF5IHN1cHBvcnQgaW1wbGVtZW50ZWQKCSAgIFtKYXZhXSBTaGFkb3cgY2xhc3NlcyBpbXByb3ZlZCAtIEphdmEgb2JqZWN0cyB1c2VkIHJhdGhlciB0aGFuIAoJICAgbG9uZ3MgaG9sZGluZyB0aGUgYyBwb2ludGVyIHRvIHRoZSB3cmFwcGVkIHN0cnVjdHVyZS9jKytjbGFzcwoKNS8yMi8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIEZpeGVkIGV4dGVybiAiQyIgZGVjbGFyYXRpb25zIGluIEMrKyBtb2RlLiBUaGFua3MKCSAgIHRvIEdyZWcgVHJveGVsIDxnZHRAaXIuYmJuLmNvbT4uCgo1LzIxLzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gTmV3IGxpbmthZ2UgIm1vZHVsZSIgZm9yIGNyZWF0aW5nIEd1aWxlIG1vZHVsZXMgZm9yCgkgICBHdWlsZSB2ZXJzaW9ucyA+PSAxLjUuMC4gCgo0LzE4LzIwMDE6IG1rb2VwcGUKCSAgIFtNelNjaGVtZV0gQWRkZWQgdHlwZW1hcHMgZm9yIHBhc3NpbmcgdGhyb3VnaCBTY2hlbWVfT2JqZWN0CgkgICBwb2ludGVycy4gCgo0LzkvMjAwMSA6IG1rb2VwcGUgCgkgICBbTXpTY2hlbWVdIEFkZGVkIHR5cGVtYXBzIGZvciBgYm9vbCcuICBJbmNsdXNpb24gb2YgaGVhZGVycwoJICAgYW5kIHN1cHBvcnQgcm91dGluZXMgaXMgbm93IGRhdGEtZHJpdmVuIHZpYSBtenNjaGVtZS5pLgoJICAgSGVhZGVycyBjb21lIGZyb20gdGhlIG5ldyBmaWxlIG16c2NoZW1kZWMuc3dnLiAgRG9uJ3QgYWJvcnQKCSAgIGltbWVkaWF0ZWx5IHdoZW4gYSB0eXBlLWhhbmRsaW5nIGVycm9yIGlzIHJlcG9ydGVkLiAgV2hlbgoJICAgc2VhcmNoaW5nIGZvciB0eXBlbWFwcyBmb3IgZW51bXMsIGZhbGwgYmFjayB0byB1c2luZyBpbnQsCgkgICBsaWtlIHRoZSBHdWlsZSBiYWNrZW5kIGRvZXMuICBTdXBwb3J0IGNoYXIgY29uc3RhbnRzLiAgRW1pdAoJICAgY29ycmVjdCB3cmFwcGVyIGNvZGUgZm9yIHZhcmlhYmxlcy4KCjMvMTIvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBGaXhlZCB0eXBlbWFwcyBmb3IgY2hhciAqKk9VVFBVVCwgY2hhciAqKkJPVEguCgozLzIvMjAwMSA6IG1rb2VwcGUgCgkgICBbR3VpbGVdIEV2ZXJ5IHdyYXBwZXIgZnVuY3Rpb24gbm93IGdldHMgYSBib29sZWFuIHZhcmlhYmxlCgkgICBnc3dpZ19saXN0X3Agd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgbXVsdGlwbGUgdmFsdWVzIGFyZQoJICAgcHJlc2VudC4gVGhlIG1hY3JvcyBHVUlMRV9BUFBFTkRfUkVTVUxULCBHVUlMRV9NQVlCRV9WQUxVRVMKCSAgIGFuZCBHVUlMRV9NQVlCRV9WRUNUT1IgdXNlIHRoaXMgdmFyaWFibGUsIHJhdGhlciB0aGFuCgkgICBjaGVja2luZyB3aGV0aGVyIHRoZSBjdXJyZW50IHJldHVybiB2YWx1ZSBpcyBhIGxpc3QuIFRoaXMKCSAgIGFsbG93cyBmb3IgdHlwZW1hcHMgcmV0dXJuaW5nIGEgbGlzdCBhcyBhIHNpbmdsZSB2YWx1ZSAoYQoJICAgbGlzdCB3YXMgZXJyb25lb3VzbHkgY29udmVydGVkIGludG8gYSB2ZWN0b3Igb3IgYQoJICAgbXVsdGlwbGUtdmFsdWUgb2JqZWN0IGluIHRoaXMgY2FzZSkuCgozLzEvMjAwMSA6IG1rb2VwcGUKCSAgIFtHdWlsZV0gQWRkZWQgc3VwcG9ydCBmb3IgcmV0dXJuaW5nIG11bHRpcGxlIHZhbHVlcyBhcwoJICAgdmVjdG9ycywgb3IgcGFzc2luZyB0aGVtIHRvIGEgbXVsaXBsZS12YWx1ZQoJICAgY29udGludWF0aW9uLiBCeSBkZWZhdWx0LCBtdWx0aXBsZSB2YWx1ZXMgc3RpbGwgZ2V0CgkgICByZXR1cm5lZCBhcyBhIGxpc3QuCgozLzEvMjAwMSA6IG1rb2VwcGUKCSAgIFtHdWlsZV0gQWRkZWQgYSAiYmVmb3JlcmV0dXJuIiBwcmFnbWEuIFRoZSB2YWx1ZSBvZiB0aGlzCgkgICBwcmFnbWEgaXMgaW5zZXJ0ZWQganVzdCBiZWZvcmUgZXZlcnkgcmV0dXJuIHN0YXRlbWVudC4KCjMvMS8yMDAxIDogbWtvZXBwZQoJICAgW0d1aWxlXSBBZGRlZCBzdXBwb3J0IGZvciBHdWlsZSAxLjQuMSBwcm9jZWR1cmUKCSAgIGRvY3VtZW50YXRpb24gZm9ybWF0cywgc2VlIGludGVybmFscy5odG1sLgoKMi8yNi8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIE1hZGUgdGhlIHdyYXBwZXIgY29kZSBjb21waWxlIHdpdGggQysrIGlmIHRoZQoJICAgIi1jKysiIGNvbW1hbmQtbGluZSBzd2l0Y2ggaXMgZ2l2ZW4uICBUaGFua3MgdG8KCSAgIDxtb25rZXlpcUBkaW5nb2JsdWUubmV0LmF1Pi4gCgoyLzI2LzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gTm93IHR3byB0eXBlIHRhYmxlcywgc3dpZ190eXBlcyBhbmQKCSAgIHN3aWdfdHlwZXNfaW5pdGlhbCwgYXJlIHVzZWQsIGFzIGFsbCBvdGhlciBTV0lHIGxhbmd1YWdlCgkgICBtb2R1bGVzIGRvLiAgVGhpcyByZW1vdmVzIHRoZSBuZWVkIGZvciB0aGUgdHJpY2t5CgkgICBjb25zdHJ1Y3Rpb24gdXNlZCBiZWZvcmUgdGhhdCB0aGUgYnJva2VuIFJlZGhhdCA3LjAgZ2NjCgkgICBkb2Vzbid0IHBhcnNlLiBSZXBvcnRlZCBieSA8bW9ua2V5aXFAZGluZ29ibHVlLm5ldC5hdT4uIAoKMi8yNi8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIEZpeGVkIHR5cGVtYXBzIGZvciBjaGFyICpPVVRQVVQsIGNoYXIgKkJPVEg7IGEgYmFkCgkgICBmcmVlKCkgd291bGQgYmUgZW1pdHRlZC4gIEFkZGVkIHR5cGVtYXAgZm9yIFNDTS4KCgpWZXJzaW9uIDEuMyBBbHBoYSA1IAo9PT09PT09PT09PT09PT09PT09Cgo5LzE5LzAwIDogYmVhemxleQogICAgICAgICAgW1B5dGhvbl0gUHl0aG9uIG1vZHVsZSBnZW5lcmF0ZXMgbW9yZSBlZmZpY2llbnQgY29kZSBmb3IKICAgICAgICAgIGNyZWF0aW5nIHRoZSByZXR1cm4gdmFsdWUgb2YgYSB3cmFwcGVyIGZ1bmN0aW9uLiBNb2RpZmljYXRpb24KICAgICAgICAgIHN1Z2dlc3RlZCBieSBKb24gVHJhdmlzLgoKOS8xOS8wMCA6IGJlYXpsZXkKICAgICAgICAgIExpYnJhcnkgZmlsZXMgc3BlY2lmaWVkIHdpdGggdGhlIC1sIG9wdGlvbiBhcmUgbm93IGluY2x1ZGVkIGF0IHRoZQogICAgICAgICAgZW5kIG9mIHRoZSBpbnRlcmZhY2UgZmlsZSAocmV2ZXJ0aW5nIHRvIHRoZSBvbGQgYmVoYXZpb3IpLgoKOS8xOS8wMCA6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIHNvbWUgcHJvYmxlbXMgd2l0aCBlbnVtIGhhbmRsaW5nLiAgZW51bXMgYXJlIG5vdyBtYW5pcHVsYXRlZCBhcwogICAgICAgICAgJ2ludCcsIGJ1dCBjYXN0IGludG8gdGhlIGVudW0gdHlwZSB3aGVuIHZhbHVlcyBhcmUgcGFzc2VkIHRvIHRoZSAKICAgICAgICAgIGNvcnJlc3BvbmRpbmcgQyBmdW5jdGlvbi4KCjkvMTkvMDAgOiBta29lcHBlCgkgIFtHdWlsZV0gUmVtb3ZlZCAiLXdpdGgtc21vYnMiIGNvbW1hbmQtbGluZSBvcHRpb24sIGFzIHRoaXMgaXMgdGhlCgkgIGRlZmF1bHQgbm93LiAgQWRkZWQgIi1lbWl0LXNldHRlcnMiIGNvbW1hbmQtbGluZSBvcHRpb24sCgkgIHdoaWNoIHR1cm5zIG9uIGdlbmVyYXRpbmcgcHJvY2VkdXJlcy13aXRoLXNldHRlcnM7IHNlZQoJICBpbnRlcm5hbHMuaHRtbC4KCjkvMTgvMDAgOiBta29lcHBlCgkgIEluY29ycG9yYXRlZCBwYXRjaCAjMTAxNDMwLCBmaXhpbmcgYnVncyBpbiB0aGUgR3VpbGUgbW9kdWxlOiAKCSAgMS4gU29tZSBhcmd1bWVudHMgd2VyZSBlcnJvbmVvdXNseSB0YWtlbiBhcyAqb3B0aW9uYWwqIGFyZ3VtZW50cyB3aGVuCgkgICAgIGlnbm9yZWQgYXJndW1lbnRzIHdlcmUgcHJlc2VudC4gCgkgIDIuIEd1aWxlIDEuMy40IHdhcyBub3Qgc3VwcG9ydGVkIHNpbmNlIGZ1bmN0aW9ucyBpbnRyb2R1Y2VkIGluIEd1aWxlCgkgICAgICAxLjQgd2VyZSB1c2VkLgkgIAoJICAzLiBBZGRlZCBoYW5kbGluZyBvZiBgY29uc3QgY2hhciAqJy4KCjkvMTcvMDAgOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggZmFpbGVkIGFzc2VydGlvbiBhbmQgbGFyZ2UgZmlsZXMuCgo5LzE3LzAwIDogYmVhemxleQogICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIHRoZSAnJScgY2hhcmFjdGVyIGFwcGVhcmluZyBpbiBhZGRlZCBtZXRob2RzCiAgICAgICAgICBhbmQgZnVuY3Rpb24gYm9kaWVzLiAgUHJlcHJvY2Vzc29yIGJ1Zy4KClZlcnNpb24gMS4zIEFscGhhIDQgKFNlcHRlbWJlciA0LCAyMDAwKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjkvMy8wMCAgOiB0dG4KICAgICAgICAgIEFkZGVkIGluc3RydWN0aW9ucyBmb3IgbWFpbnRhaW5lcnMgaW4gRXhhbXBsZXMvUkVBRE1FIG9uIGhvdwogICAgICAgICAgdG8gbWFrZSBleGFtcGxlcyBhbHNvIGJlIHVzZWZ1bCBpbiB0aGUgdGVzdGluZyBmcmFtZXdvcmsuCiAgICAgICAgICBBbHNvLCAibWFrZSBjaGVjayIgbm93IHVzZXMgLi9MaWIgYnkgdmlhIGVudiB2YXIgYFNXSUdfTElCJy4KICAgICAgICAgIFRoaXMgaXMgb3ZlcnJpZGFibGUgbGlrZSBzbzoKICAgICAgICAgICAgIG1ha2UgY2hrLXN3aWdsaWI9L215L2V4cGVyaW1lbnRhbC9zd2lnL0xpYiBjaGVjawoKOS8zLzAwICA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkICR0eXBlbWFwIHZhcmlhYmxlIHRvIHR5cGVtYXBzLiAgVGhpcyBnZXRzIHJlcGxhY2VkIHdpdGgKICAgICAgICAgIGEgc3RyaW5nIGluZGljYXRpbmcgdGhlIHR5cGVtYXAgdGhhdCBpcyBhcHBsaWVkLiAgRmVhdHVyZQogICAgICAgICAgcmVxdWVzdCBmcm9tIHJzYWx6LgoKOS8zLzAwICA6IGJlYXpsZXkKICAgICAgICAgIEV4cGVyaW1lbnRhbCBvcHRpbWl6YXRpb24gdG8gY29kZSBnZW5lcmF0aW9uIGZvciB2aXJ0dWFsCiAgICAgICAgICBtZW1iZXIgZnVuY3Rpb25zLiAgSWYgeW91IGhhdmUgdHdvIGNsYXNzZXMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICBjbGFzcyBBKCkgewogICAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGZvbygpOwogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgY2xhc3MgQigpIDogcHVibGljIEEgewogICAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGZvbygpOwogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBTd2lnIG5vdyB3aWxsIGdlbmVyYXRlIGEgc2luZ2xlIHdyYXBwZXIgZnVuY3Rpb24gZm9yIHRoaXMKCiAgICAgICAgICAgICAgICBBX2ZvbyhBICphKSB7CiAgICAgICAgICAgICAgICAgICAgYS0+Zm9vKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgYW5kIHVzZSBpdCBhcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgYm90aCBBX2ZvbygpIGFuZCBCX2ZvbygpLgogICAgICAgICAgVGhpcyBvcHRpbWl6YXRpb24gb25seSB0YWtlcyBwbGFjZSBpZiBib3RoIG1ldGhvZHMgYXJlIGRlY2xhcmVkCiAgICAgICAgICBhcyB2aXJ0dWFsIGFuZCBib3RoIHRha2UgaWRlbnRpY2FsIHBhcmFtZXRlcnMuCiAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIEZFQVRVUkUgKioqCgo5LzMvMDAgIDogYmVhemxleQogICAgICAgICAgUmVzdG9yZWQgdGhlICJtZW1iZXJpbiIgdHlwZW1hcCBmb3Igc2V0dGluZyBzdHJ1Y3R1cmUgbWVtYmVycy4KICAgICAgICAgIFVubGlrZSB0aGUgb2xkIHZlcnNpb24sIHRoZSBuZXcgdmVyc2lvbiBpcyBleHBhbmRlZCBpbmxpbmUgaW4gdGhlCiAgICAgICAgICB3cmFwcGVyIGZ1bmN0aW9uIGFsbG93aW5nIGFjY2VzcyB0byBzY3JpcHRpbmcgbGFuZ3VhZ2UKICAgICAgICAgIGludGVybmFscyAoYSBzb21ldGltZXMgcmVxdWVzdGVkIGZlYXR1cmUpLiBUaGUgIm1lbWJlcm91dCIgdHlwZW1hcAogICAgICAgICAgaXMgZ29uZS4gVXNlIHRoZSAib3V0IiB0eXBlbWFwcyBpbnN0ZWFkLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo5LzMvMDAgIDogYmVhemxleQogICAgICAgICAgQXR0cmlidXRlIHNldCBtZXRob2RzIG5vIGxvbmdlciByZXR1cm4gdGhlIHZhbHVlIG9mIGEgbWVtYmVyLgogICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgICBpbnQgeDsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgIG5vdyBnZXRzIHNldCBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICB2b2lkIEZvb194X3NldChGb28gKmYsIGludCB4KSB7CiAgICAgICAgICAgICAgICAgICAgZi0+eCA9IHg7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgIEluIFNXSUcxLjEgaXQgdXNlZCB0byBiZSB0aGlzOgoKICAgICAgICAgICAgICBpbnQgRm9vX3hfc2V0KEZvbyAqZiwgaW50IHgpIHsKICAgICAgICAgICAgICAgICAgIHJldHVybiAoZi0+eCA9IHgpOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICBUaGlzIGhhcyBiZWVuIGNoYW5nZWQgZHVlIHRvIHRoZSBjb21wbGV4aXR5IGNyZWF0ZWQgYnkgdHJ5aW5nCiAgICAgICAgICB0byBkbyB0aGlzIHdpdGggbW9yZSBleG90aWMgZGF0YXR5cGVzIHN1Y2ggYXMgYXJyYXlzLiAgSXQgYWxzbwogICAgICAgICAgY29tcGxpY2F0ZXMgaW5saW5pbmcgYW5kIGhhbmRsaW5nIG9mIHRoZSAibWVtYmVyaW4iIHR5cGVtYXAuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjkvMi8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIHRoZSBwdHJjYXN0KCkgYW5kIHB0cm1hcCgpIGZ1bmN0aW9ucyBmcm9tIHRoZQogICAgICAgICAgcG9pbnRlci5pIGxpYnJhcnkgZmlsZS4gIE9sZCBpbXBsZW1lbnRhdGlvbiBpcyBpbmNvbXBhdGlibGUKICAgICAgICAgIHdpdGggbmV3IHR5cGUgc3lzdGVtLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo5LzIvMDAgIDogYmVhemxleQogICAgICAgICAgTmV3IHJ1bnRpbWUgZnVuY3Rpb24gU1dJR19UeXBlUXVlcnkoY29uc3QgY2hhciAqbmFtZSkgYWRkZWQuCiAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGV4dHJhY3QgdGhlIHR5cGUgaW5mbyBzdHJ1Y3R1cmUKICAgICAgICAgIHRoYXQgaXMgdXNlZCBmb3IgdHlwZS1jaGVja2luZy4gIEl0IHdvcmtzIHdpdGggZWl0aGVyIHRoZQogICAgICAgICAgbmljZSBDIG5hbWUgb3IgbWFuZ2xlZCB2ZXJzaW9uIG9mIGEgZGF0YXR5cGUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgc3dpZ190eXBlX2luZm8gKnR5ID0gU3dpZ19UeXBlUXVlcnkoImludCAqIik7CiAgICAgICAgICAgICAgc3dpZ190eXBlX2luZm8gKnR5ID0gU3dpZ19UeXBlUXVlcnkoIl9wX2ludCIpOwoKICAgICAgICAgIFRoaXMgaXMgYW4gYWR2YW5jZWQgZmVhdHVyZSB0aGF0IGhhcyBiZWVuIGFkZGVkIHRvIHN1cHBvcnQgc29tZQogICAgICAgICAgZXhvdGljIGV4dGVuc2lvbiBtb2R1bGVzIHRoYXQgbmVlZCB0byBkaXJlY3RseSBtYW5pcHVsYXRlCiAgICAgICAgICBzY3JpcHRpbmcgbGFuZ3VhZ2Ugb2JqZWN0cy4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjkvMi8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBOZXcgZGlyZWN0aXZlICV0eXBlcygpIGFkZGVkLiAgVGhpcyBpcyB1c2VkIHRvCiAgICAgICAgICBleHBsaWNpdGx5IGxpc3QgZGF0YXR5cGVzIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluCiAgICAgICAgICB0aGUgcnVudGltZSB0eXBlLWNoZWNraW5nIGNvZGUuIE5vcm1hbGx5IGl0IGlzIG5ldmVyCiAgICAgICAgICBuZWNlc3NhcnkgdG8gdXNlIHRoaXMgYnV0IHNvbWV0aW1lcyBhZHZhbmNlZCBleHRlbnNpb25zCiAgICAgICAgICAoc3VjaCBhcyB0aGUgcG9pbnRlci5pIGxpYnJhcnkpIG1heSBuZWVkIHRvIG1hbnVhbGx5CiAgICAgICAgICBhZGQgdHlwZXMgdG8gdGhlIHR5cGUtY2hlY2tlci4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMzEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBJbXByb3ZlZCBoYW5kbGluZyBvZiBzdHJpbmcgYXJyYXkgdmFyaWFibGVzLiBGb3IgZXhhbXBsZSwKICAgICAgICAgIGEgZ2xvYmFsIHZhcmlhYmxlIG9mIHRoZSBmb3JtICJjaGFyIG5hbWVbNjRdIiBpcyBhdXRvbWF0aWNhbGx5CiAgICAgICAgICBtYW5hZ2VkIGFzIGEgNjQgY2hhcmFjdGVyIHN0cmluZy4gIFByZXZpb3VzbHkgdGhpcyBkaWRuJ3QKICAgICAgICAgIHdvcmsgYXQgYWxsIG9yIHJlcXVpcmVkIHRoZSB1c2Ugb2YgYSBzcGVjaWFsIHR5cGVtYXAuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKFRjbCwgUGVybCwgUHl0aG9uKSAqKioKCjgvMzEvMDAgOiB0dG4KCSAgQWRkZWQgTWFrZWZpbGUgdGFyZ2V0IGBjaGVjay1jKystZXhhbXBsZXMnLCB3aGljaCB1c2VzIG5ldwoJICBmaWxlcyB1bmRlciBFeGFtcGxlcy9DKysgY29udHJpYnV0ZWQgYnkgVGFsIFNoYWxpZi4gIE5vdyAibWFrZQoJICBjaGVjayIgYWxzbyBkb2VzICJtYWtlIGNoZWNrLWMrKy1leGFtcGxlcyIuICBBbHNvLCBleHBhbmRlZAoJICBhY3Rpb25zIGluIGBjaGVjay1naWZwbG90LWV4YW1wbGUnIGFuZCBgY2hlY2stYWxpdmVuZXNzJy4KCjgvMzAvMDAgOiBta29lcHBlCgkgIE1ham9yIGNsZWFuLXVwIGluIHRoZSBHdWlsZSBtb2R1bGUuIEFkZGVkIHR5cGVtYXAtZHJpdmVuCgkgIGRvY3VtZW50YXRpb24gc3lzdGVtLiBDaGFuZ2VkIHRvIGhhbmRsZSBtb3JlIHRoYW4gMTAKCSAgYXJncy4gVXBkYXRlZCBhbmQgZXh0ZW5kZWQgZXhhbXBsZXMuCgkgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMjkvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCBuZXcgJWluc2VydCBkaXJlY3RpdmUgdGhhdCBpbnNlcnRzIHRoZSBjb250ZW50cyBvZiBhIGZpbGUKICAgICAgICAgIGludG8gYSBwb3J0aW9uIG9mIHRoZSBvdXRwdXQgd3JhcHBlciBmaWxlLiAgVGhpcyBpcyBvbmx5IGludGVuZGVkCiAgICAgICAgICBmb3IgdXNlIGJ5IHdyaXRlcnMgb2YgbGFuZ3VhZ2UgbW9kdWxlcy4gIFdvcmtzIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICAlaW5zZXJ0KGhlYWRlcnMpICAiZmlsZS5zd2ciOwogICAgICAgICAgICAgICAlaW5zZXJ0KHJ1bnRpbWUpICAiZmlsZS5zd2ciOwogICAgICAgICAgICAgICAlaW5zZXJ0KHdyYXBwZXJzKSAiZmlsZS5zd2ciOwogICAgICAgICAgICAgICAlaW5zZXJ0KGluaXQpICAgICAiZmlsZS5zd2ciOwoKICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMjkvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCBuZXcgJXJ1bnRpbWUgZGlyZWN0aXZlIHdoaWNoIGluY2x1ZGVzIGNvZGUgaW50byB0aGUgcnVudGltZQogICAgICAgICAgcG9ydGlvbiBvZiB0aGUgd3JhcHBlciBjb2RlLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXJ1bnRpbWUgJXsKICAgICAgICAgICAgICAgICAgICAuLi4gc29tZSBpbnRlcm5hbCBydW50aW1lIGNvZGUgLi4uCiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICBUaGVyZSBpcyBubyBwcmFjdGljYWwgcmVhc29uIGZvciBvcmRpbmFyeSB1c2VycyB0byB1c2UgdGhpcwogICAgICAgICAgZmVhdHVyZSAoYWxtb3N0IGV2ZXJ5dGhpbmcgY2FuIGJlIGRvbmUgdXNpbmcgJXsgLi4uICV9CiAgICAgICAgICBpbnN0ZWFkKS4gICBIb3dldmVyLCB3cml0ZXJzIG9mIGxhbmd1YWdlIG1vZHVsZXMgbWF5IHdhbnQgdG8KICAgICAgICAgIHVzZSB0aGlzIGluIGxhbmd1YWdlIGNvbmZpZ3VyYXRpb24gZmlsZXMuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzI4LzAwIDogYmVhemxleQogICAgICAgICAgVHlwZW1hcHMgY2FuIG5vdyBiZSBzcGVjaWZpZWQgdXNpbmcgc3RyaW5nIGxpdGVyYWxzIGxpa2UKICAgICAgICAgIHRoaXM6CgogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBpbnQgIiR0YXJnZXQgPSBTdklWKCRzb3VyY2UpOyI7CgogICAgICAgICAgV2hlbiBjb2RlIGlzIHNwZWNpZmllZCBsaWtlIHRoaXMsIGl0IGlzICpOT1QqIGVuY2xvc2VkCiAgICAgICAgICBpbnNpZGUgYSBsb2NhbCBzY29wZSAoYXMgd2l0aCBvbGRlciB0eXBlbWFwIGRlY2xhcmF0aW9ucykuCiAgICAgICAgICBOb3RlOiBjaGFyYWN0ZXIgZXNjYXBlIHNlcXVlbmNlcyBhcmUgaW50ZXJwcmV0ZWQgaW4gdGhlCiAgICAgICAgICBjb2RlIHN0cmluZyBzbyBpZiB5b3Ugd2FudCB0byBpbmNsdWRlIGEgcXVvdGUgb3Igc29tZQogICAgICAgICAgb3RoZXIgc3BlY2lhbCBjaGFyYWN0ZXIsIG1ha2Ugc3VyZSB5b3UgdXNlIGEgKFwpLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8yNy8wMCA6IGJlYXpsZXkKICAgICAgICAgIFR5cGVtYXBzIGhhdmUgYmVlbiBtb2RpZmllZCB0byBmb2xsb3cgdHlwZWRlZiBkZWNsYXJhdGlvbnMuCiAgICAgICAgICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgdGhpczoKCiAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgTnVtYmVyOwoKICAgICAgICAgICAgICAldHlwZW1hcChpbikgaW50IHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiBnZXQgYW4gaW50ZWdlciAuLi4KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIHZvaWQgZm9vKE51bWJlciBhKTsKCiAgICAgICAgICBUaGUgdHlwZW1hcCBmb3IgJ2ludCcgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBhcmd1bWVudCAnTnVtYmVyIGEnLgogICAgICAgICAgT2YgY291cnNlLCBpZiB5b3Ugc3BlY2lmeSBhIHR5cGVtYXAgZm9yICdOdW1iZXInIGl0IHdpbGwgdGFrZQogICAgICAgICAgcHJlY2VkZW5jZSAobm9yIHdpbGwgaXQgZXZlciBiZSBhcHBsaWVkIHRvIGFuICdpbnQnKS4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOC8yNy8wMCA6IGJlYXpsZXkKICAgICAgICAgIERlZmF1bHQgdHlwZW1hcCBzcGVjaWZpY2F0aW9uIGhhcyBjaGFuZ2VkLiAgIEluIG9sZGVyCiAgICAgICAgICB2ZXJzaW9ucyBvZiBzd2lnLCB5b3UgY291bGQgZG8gdGhpczoKCiAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBpbnQgU1dJR19ERUZBVUxUX1RZUEUgewogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBUbyBzcGVjaWZ5IHRoZSBkZWZhdWx0IGhhbmRsaW5nIG9mIGEgZGF0YXR5cGUuICAgTm93IHRoYXQKICAgICAgICAgIFNXSUcgZm9sbG93cyB0eXBlZGVmIGRlY2xhcmF0aW9ucywgdGhpcyBpcyB1bm5lY2Vzc2FyeS4KICAgICAgICAgIFNpbXBseSBzcGVjaWZ5aW5nIGEgdHlwZW1hcCBmb3IgJ2ludCcgd2lsbCB3b3JrIGZvciBhbGwKICAgICAgICAgIHZhcmlhdGlvbnMgb2YgaW50ZWdlcnMgdGhhdCBhcmUgdHlwZWRlZidkIHRvICdpbnQnLgoKICAgICAgICAgIENhdmVhdCwgc3BlY2lmeWluZyB0aGUgZGVmYXVsdCBiZWhhdmlvciBmb3IgcG9pbnRlcnMsCiAgICAgICAgICByZWZlcmVuY2VzLCBhcnJheXMsIGFuZCB1c2VyIGRlZmluZWQgdHlwZXMgaXMgYSBsaXR0bGUKICAgICAgICAgIGRpZmZlcmVudC4gIFRoaXMgbXVzdCBiZSBkb25lIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdQT0lOVEVSICogewogICAgICAgICAgICAgICAgICAgICAgLi4uIGEgcG9pbnRlciAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdSRUZFUkVOQ0UgJiB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4gYSByZWZlcmVuY2UgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHQVJSQVkgW10gewogICAgICAgICAgICAgICAgICAgICAgLi4uIGFuIGFycmF5IC4uLgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgU1dJR1RZUEUgewogICAgICAgICAgICAgICAgICAgICAgLi4uIGEgdXNlci1kZWZpbmVkIHR5cGUgKGJ5IHZhbHVlKSAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo4LzE1LzAwIDogZHVzdGluCiAgICAgICAgICBUaGUgZmlsZSBzd2lnLTEuM2ExLTEuc3BlYyBoYXMgYmVlbiBhZGRlZCB0byB0aGUgVG9vbHMgZGlyZWN0b3J5LgogICAgICAgICAgSXQgY2FuIGJlIHVzZWQgdG8gYnVpbGQgYSByZWRoYXQgcGFja2FnZSBmb3IgU1dJRywgYWx0aG91Z2ggaXQKICAgICAgICAgIHdpbGwgbmVlZCB0byBiZSB1cGRhdGVkIGZvciB0aGUgbmV4dCBwdWJsaWMgcmVsZWFzZS4KCjgvMTUvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUeXBlbWFwcyBoYXZlIGJlZW4gY29tcGxldGVseSByZXdyaXR0ZW4uICBFdmVudHVhbGx5IHRoZXkgbWF5IGJlCiAgICAgICAgICByZXBsYWNlZCB3aXRoIHNvbWV0aGluZyBiZXR0ZXIsIGJ1dCBmb3Igbm93IHRoZXkgc3RheS4gIEhvd2V2ZXIsCiAgICAgICAgICB0aGVyZSBhcmUgYSBudW1iZXIgb2YgYSBzaWduaWZpY2FudCBjaGFuZ2VzIHRoYXQgbWF5IHRyaXAgc29tZQogICAgICAgICAgcGVvcGxlIHVwOgoKICAgICAgICAgIDEuICBUeXBlbWFwIHNjb3BpbmcgaXMgY3VycmVudGx5IGJyb2tlbi4gIEJlY2F1c2Ugb2YgdGhpcywgdGhlCiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvZGUgd29uJ3Qgd29yay4KCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGJsYWggKiB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgaW50IGJhcihibGFoICp4KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGJsYWggKjsgICAvKiBDbGVhciB0eXBlbWFwICovCgogICAgICAgICAgICAgICh0aGlzIGJyZWFrcyBiZWNhdXNlIHRoZSBjb2RlIGZvciB0aGUgY2xhc3MgRm9vIGlzIGFjdHVhbGx5CiAgICAgICAgICAgICAgZ2VuZXJhdGVkIGFmdGVyIHRoZSBlbnRpcmUgaW50ZXJmYWNlIGZpbGUgaGFzIGJlZW4gcHJvY2Vzc2VkKS4KICAgICAgICAgICAgICBUaGlzIGlzIG9ubHkgYSB0ZW1wb3JhcnkgYnVnLgoKICAgICAgICAgIDIuICBJbiBTV0lHMS4xLCB0aGUgJWFwcGx5IGRpcmVjdGl2ZSB3b3JrZWQgYnkgcGVyZm9ybWluZyBhCiAgICAgICAgICAgICAgdmVyeSBjb21wbGV4IHR5cGUtYWxpYXNpbmcgcHJvY2VkdXJlLiAgRnJvbSB0aGlzIHBvaW50IG9uLAogICAgICAgICAgICAgICVhcHBseSBpcyBzaW1wbHkgYSBnZW5lcmFsaXplZCB0eXBlbWFwIGNvcHkgb3BlcmF0aW9uLgogICAgICAgICAgICAgIEZvciBleGFtcGxlLAoKICAgICAgICAgICAgICAgICAgJWFwcGx5IGRvdWJsZSAqT1VUUFVUIHsgZG91YmxlICp4LCBkb3VibGUgKnkgfTsKCiAgICAgICAgICAgICAgQ29waWVzICpBTEwqIGN1cnJlbnRseSBkZWZpbmVkIHR5cGVtYXBzIGZvciAnZG91YmxlICpPVVRQVVQnIGFuZAogICAgICAgICAgICAgIGNvcGllcyB0aGVtIHRvICdkb3VibGUgKngnIGFuZCAnZG91YmxlICp5Jy4KCiAgICAgICAgICAgICAgTW9zdCBwZW9wbGUgcHJvYmFibHkgd29uJ3QgZXZlbiBub3RpY2UgdGhpcyBjaGFuZ2UgaW4KICAgICAgICAgICAgICAlYXBwbHkuICBIb3dldmVyLCB3aGVyZSBpdCB3aWxsIGJyZWFrIHRoaW5ncyBpcyBpbiBjb2RlIGxpa2UKICAgICAgICAgICAgICB0aGlzOgoKICAgICAgICAgICAgICAgICAgJWFwcGx5IGRvdWJsZSAqT1VUUFVUIHsgZG91YmxlICp4IH07CiAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBkb3VibGUgKk9VVFBVVCB7CiAgICAgICAgICAgICAgICAgICAgICAgLi4uIHdoYXRldmVyIC4uLgogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICB2b2lkIGZvbyhkb3VibGUgKngpOwoKICAgICAgICAgICAgICBJbiBTV0lHMS4xLCB5b3Ugd2lsbCBmaW5kIHRoYXQgJ2ZvbycgdXNlcyB0aGUgJ2RvdWJsZSAqT1VUUFVUJyBydWxlCiAgICAgICAgICAgICAgZXZlbiB0aG91Z2ggaXQgd2FzIGRlZmluZWQgYWZ0ZXIgdGhlICVhcHBseSBkaXJlY3RpdmUgKHRoaXMgaXMKICAgICAgICAgICAgICB0aGUgd2VpcmQgYWxpYXNpbmcgc2NoZW1lIGF0IHdvcmspLiAgSW4gU1dJRzEuMyBhbmQgbGF0ZXIsCiAgICAgICAgICAgICAgdGhlICdkb3VibGUgKk9VVFBVVCcgcnVsZSBpcyBpZ25vcmVkIGJlY2F1c2UgaXQgaXMgZGVmaW5lZAogICAgICAgICAgICAgIGFmdGVyIHRoZSAlYXBwbHkgZGlyZWN0aXZlLgoKICAgICAgICAgIDMuICBUaGUgJWNsZWFyIGRpcmVjdGl2ZSBoYXMgYmVlbiBtb2RpZmllZCB0byBlcmFzZSBhbGwgY3VycmVudGx5CiAgICAgICAgICAgICAgZGVmaW5lZCB0eXBlbWFwcyBmb3IgYSBwYXJ0aWN1bGFyIHR5cGUuICBUaGlzIGRpZmZlcnMgZnJvbQogICAgICAgICAgICAgIFNXSUcxLjEgd2hlcmUgJWNsZWFyIG9ubHkgcmVtb3ZlZCBydWxlcyB0aGF0IHdlcmUgYWRkZWQgdXNpbmcKICAgICAgICAgICAgICB0aGUgJWFwcGx5IGRpcmVjdGl2ZS4KCiAgICAgICAgICA0LiAgVHlwZW1hcCBtYXRjaGluZyBpcyBub3cgcGVyZm9ybWVkIHVzaW5nICpleGFjdCogdHlwZXMuCiAgICAgICAgICAgICAgVGhpcyBtZWFucyB0aGF0IHRoaW5ncyBsaWtlIHRoaXMKCiAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgY2hhciAqIHsgfQogICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGNvbnN0IGNoYXIgKiB7IH0KCiAgICAgICAgICAgICAgYXJlIGRpZmZlcmVudCB0eXBlbWFwcy4gICAgQSBzaW1pbGFyIHJ1bGUgYXBwbGllcyBmb3IgcG9pbnRlcnMsCiAgICAgICAgICAgICAgYXJyYXlzLCBhbmQgcmVmZXJlbmNlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBkb3VibGUgKiB7IH0KCiAgICAgICAgICAgICAgdXNlZCB0byBhcHBseSB0byAnZG91YmxlICYnLCAnZG91YmxlIFtdJywgIE5vdywgaXQgb25seSBhcHBsaWVzCiAgICAgICAgICAgICAgdG8gJ2RvdWJsZSAqJy4gIElmIHlvdSB3YW50IGEgJ2RvdWJsZSAmJywgeW91J2xsIG5lZWQgdG8gaGFuZGxlCiAgICAgICAgICAgICAgdGhhdCBzZXBhcmF0ZWx5LgoKICAgICAgICAgIDUuICBBcnJheSBtYXRjaGluZyBoYXMgYmVlbiBzaW1wbGZpZWQuICBJbiBTV0lHMS4xLCBhcnJheSBtYXRjaGluZwogICAgICAgICAgICAgIHdhcyBwZXJmb3JtZWQgYnkgdHJ5aW5nIHZhcmlvdXMgY29tYmluYXRpb25zIG9mIGRpbWVuc2lvbnMuCiAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsICdkb3VibGUgYVsxMF1bMjBdJyB3YXMgbWF0Y2hlZCBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgICAgIGRvdWJsZSBbMTBdWzIwXQogICAgICAgICAgICAgICAgICAgZG91YmxlIFtBTlldWzIwXQogICAgICAgICAgICAgICAgICAgZG91YmxlIFsxMF1bQU5ZXQogICAgICAgICAgICAgICAgICAgZG91YmxlIFtBTlldW0FOWV0KCiAgICAgICAgICAgICAgSW4gU1dJRzEuMywgb25seSB0aGUgZm9sbG93aW5nIG1hdGNoZXMgYXJlIGF0dGVtcHRlZDoKCiAgICAgICAgICAgICAgICAgICBkb3VibGUgWzEwXVsyMF0KICAgICAgICAgICAgICAgICAgIGRvdWJsZSBbQU5ZXVtBTlldCgogICAgICAgICAgT24gdGhlIHBvc2l0aXZlIHNpZGUsIHR5cGVtYXAgbWF0Y2hpbmcgaXMgbm93ICpzaWduaWZpY2FudGx5KiBmYXN0ZXIKICAgICAgICAgIHRoYW4gYmVmb3JlLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo4LzE1LzAwIDogYmVhemxleQogICAgICAgICAgU2VjcmV0IGRldmVsb3BlciBmZWF0dXJlLiAgU2luY2UgZGF0YXR5cGVzIGFyZSBub3cgcmVwcmVzZW50ZWQgYXMgCiAgICAgICAgICBzdHJpbmdzIGludGVybmFsbHksIHlvdSBjYW4gYnlwYXNzIGxpbWl0YXRpb25zIG9mIHRoZSBwYXJzZXIgYW5kCiAgICAgICAgICBjcmVhdGUgYSB3aWxkIGRhdGF0eXBlIGJ5IHNpbXBseSBlbmNsb3NpbmcgdGhlIHJhdyBzdHJpbmcgZW5jb2RpbmcKICAgICAgICAgIGluIGJhY2t0aWNrcyAoYGApIGFuZCBzdGlja2luZyBpdCBpbiB0aGUgaW50ZXJmYWNlIGZpbGUgYW55d2hlcmUgYQogICAgICAgICAgdHlwZSBpcyBleHBlY3RlZC4gIEZvciBleGFtcGxlLCBgYSgyMCkuYSgxMCkucC5mKGludCxpbnQpYC4gIFRoaXMgCiAgICAgICAgICBmZWF0dXJlIGlzIG9ubHkgaW50ZW5kZWQgZm9yIHRlc3RpbmcgKGkuZS4sIHlvdSB3YW50IHRvIHNlZSB3aGF0CiAgICAgICAgICBoYXBwZW5zIHRvIHlvdXIgbGFuZ3VhZ2UgbW9kdWxlIGlmIGl0IGdldHMgYSByZWZlcmVuY2UgdG8gYSBwb2ludGVyCiAgICAgICAgICB0byBhbiBhcnJheSBvZiBwb2ludGVycyB0byBmdW5jdGlvbnMgb3Igc29tZXRoaW5nKS4gCiAgICAgICAgICAqKiogU0lDSyBIQUNLICoqKgoKOC8xNC8wMCA6IGJlYXpsZXkKICAgICAgICAgIENvbXBsZXRlbHkgbmV3IHR5cGUtc3lzdGVtIGFkZGVkIHRvIHRoZSBpbXBsZW1lbnRhdGlvbi4KICAgICAgICAgIE1vcmUgZGV0YWlscyBsYXRlci4KCjgvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBDbGVhbmVkIHVwIHNvbWUgb2YgdGhlIEkvTyBoYW5kbGluZy4gIFNXSUcgbm8gbG9uZ2VyIGdlbmVyYXRlcwogICAgICAgICAgYW55IHRlbXBvcmFyeSBmaWxlcyBzdWNoIGFzIF93cmFwLndyYXAsIF93cmFwLmlpLCBfd3JhcC5pbml0LgogICAgICAgICAgSW5zdGVhZCwgdGhlc2UgImZpbGVzIiBhcmUga2VwdCBhcm91bmQgaW4gbWVtb3J5IGFzIHN0cmluZ3MKICAgICAgICAgIChhbHRob3VnaCB0aGlzIGlzIHRyYW5zcGFyZW50IHRvIGxhbmd1YWdlIG1vZHVsZXMpLgoKOC80LzAwICA6IHR0bgoJICBBZGRlZCBNYWtlZmlsZSB0YXJnZXQgImNoZWNrIiBhbmQgdmFyaWFudHMuCgkgIFRoaXMgY2FuIGJlIHVzZWQgbGlrZSAibWFrZSBjaGVjayIgb3IsIHRvIGV4cGxpY2l0bHkgc2tpcCBhCgkgIGxhbmd1YWdlIExBTkc6ICJtYWtlIHNraXAtTEFORz10cnVlIGNoZWNrIi4gIExBTkcgaXMgc2tpcHBlZAoJICBhdXRvbWF0aWNhbGx5IGlmIC4vY29uZmlndXJlIGRldGVybWluZXMgdGhhdCBMQU5HIHN1cHBvcnQgaXMKCSAgaW5zdWZmaWNpZW50LgoKCSAgQ3VycmVudGx5LCB0aGUgY2hlY2sgaXMgbGltaXRlZCB0byBkb2luZyB0aGUgZXF1aXZhbGVudCBvZgoJICAibWFrZSBhbGwiIGluIHNvbWUgb2YgdGhlIEV4YW1wbGVzIGRpcmVjdG9yaWVzLiAgVGhpcyBzaG91bGQKCSAgYmUgZXhwYW5kZWQgYm90aCBob3Jpem9udGFsbHkgKGRpZmZlcmVudCB0eXBlcyBvZiB0ZXN0cykgYW5kCgkgIHZlcnRpY2FsbHkgKGFmdGVyICJtYWtlIGFsbCIgaW4gYW4gRXhhbXBsZXMgc3ViZGlyIHN1Y2NlZWRzLAoJICBkbyBzb21lIGFkZGl0aW9uYWwgdGVzdHMgd2l0aCB0aGUgcmVzdWx0aW5nIGludGVycHJldGVyLCBldGMpLgoKOC80LzAwICA6IHR0bgoJICBBZGRlZCBNYWtlZmlsZSB0YXJnZXQgImRpc3RjbGVhbiIsIHdoaWNoIGRlbGV0ZXMgYWxsIHRoZQoJICBmaWxlcyAuL2NvbmZpZ3VyZSBjcmVhdGVzLCBpbmNsdWRpbmcgY29uZmlnLnN0YXR1cyBhbmQgZnJpZW5kcy4KCjgvMy8wMCAgOiBoYXJjb2gKCSAgamF2YSBjaGFuZ2VzPz8/IFt0b2RvOiBkb2N1bWVudCBjaGFuZ2VzXQoKNy8yMy8wMCA6IGJlYXpsZXkKICAgICAgICAgIFR5cGVtYXBzIGhhdmUgYmVlbiBtb2RpZmllZCB0byBrZXkgb2ZmIG9mIHRoZSByZWFsIGRhdGF0eXBlcwogICAgICAgICAgdXNlZCBpbiB0aGUgaW50ZXJmYWNlIGZpbGUuICBUaGlzIG1lYW5zIHRoYXQgdHlwZW1hcHMgZm9yCiAgICAgICAgICAiY29uc3QgY2hhciAqIiBhbmQgImNoYXIgKiIgd2lsbCBiZSBkaWZmZXJlbmNlIGFzIHdpbGwgdHlwZW1hcHMKICAgICAgICAgIGZvciAiVmVjdG9yIiBhbmQgIlZlY3RvciAqLiIKICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgVGhpcyBpcyBsaWtlbHkgdG8gYnJlYWsgaW50ZXJmYWNlcyB0aGF0IHJlbHkgb24gdGhlIG9kZCB0eXBlCiAgICAgICAgICBoYW5kbGluZyBiZWhhdmlvciBvZiB0eXBlbWFwcyBpbiBTV0lHMS4xLS1lc3BlY2lhbGx5IHdpdGgKICAgICAgICAgIHJlc3BlY3QgdG8gaW50ZXJmYWNlcyBpbnZvbHZpbmcgcGFzcy1ieS12YWx1ZS4KCjcvMjMvMDAgOiBiZWF6bGV5CiAgICAgICAgICBOZXcgJWNvbnN0YW50IGRpcmVjdGl2ZS4gIFRoaXMgZGlyZWN0aXZlIGNhbiBiZSB1c2VkIHRvCiAgICAgICAgICBjcmVhdGUgdHJ1ZSBjb25zdGFudHMgaW4gdGhlIHRhcmdldCBzY3JpcHRpbmcgbGFuZ3VhZ2UuCiAgICAgICAgICBJdCdzIG1vc3Qgc2ltcGxlIGZvcm0gaXMgc29tZXRoaW5nIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAlY29uc3RhbnQgRk9PIDQyOwoKICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIHR5cGUgaXMgaW5mZXJyZWQgZnJvbSB0aGUgc3ludGF4IG9mIHRoZQogICAgICAgICAgdmFsdWUgKGluIHJlYWxpdHksIGFsbCAjZGVmaW5lIG1hY3JvcyBhcmUgdHJhbnNsYXRlZCBpbnRvCiAgICAgICAgICBkaXJlY3RpdmVzIG9mIHRoaXMgZm9ybSkuCgogICAgICAgICAgQW4gZXhwYW5kZWQgdmVyc2lvbiBpcyBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgJWNvbnN0YW50KEZvbyAqKSBGT08gPSAmRm9vT2JqOwoKICAgICAgICAgIEluIHRoaXMgY2FzZSwgYW4gZXhwbGljaXQgdHlwZSBjYW4gYmUgc3BlY2lmaWVkLiAgVGhpcwogICAgICAgICAgbGF0dGVyIGZvcm0gbWF5IGJlIHVzZWZ1bCBmb3IgY3JlYXRpbmcgY29uc3RhbnRzIHRoYXQKICAgICAgICAgIHVzZWQgdG8gYmUgc3BlY2lmaWVkIGFzCgogICAgICAgICAgICAgY29uc3QgRm9vICpGT08gPSAmRm9vT2JqOwoKICAgICAgICAgICh3aGljaCBhcmUgbm93IHRyZWF0ZWQgYXMgdmFyaWFibGVzKS4KICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgRkVBVFVSRSAqKiogVGhlIHN5bnRheCBtYXkgY2hhbmdlIGluCiAgICAgICAgICB0aGUgZmluYWwgcmVsZWFzZS4KCjcvMjMvMDAgOiBiZWF6bGV5CiAgICAgICAgICBNb2RpZmllZCB0aGUgcGFyc2VyIHNvIHRoYXQgdmFyaWFibGUgZGVjbGFyYXRpb25zIG9mIHRoZSBmb3JtCiAgICAgICAgICAiY29uc3QgdHlwZSAqYSIgYXJlIGhhbmRsZWQgYXMgdmFyaWFibGVzLCBub3QgY29uc3RhbnRzLgogICAgICAgICAgTm90ZTogU1dJRzEuMSBoYW5kbGVkIHRoaXMgY2FzZSBlcnJvbmVvdXNseSBiZWNhdXNlCiAgICAgICAgICBjb25zdCBjaGFyICphIGlzIGEgcG9pbnRlciB2YXJpYWJsZSB0aGF0IGNhbiBiZSByZWFzc2lnbmVkLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICBOb3RlOiBqdXN0IGJlY2F1c2UgdGhpcyBpcyB0aGUgInJpZ2h0IiB3YXkgdG8gZG8gdGhpbmdzLAogICAgICAgICAgZG9lc24ndCBtZWFuIGl0J3MgdGhlIG1vc3QgYXBwcm9wcmlhdGUgaW50ZXJwcmV0YXRpb24uCiAgICAgICAgICBJIHN1c3BlY3QgdGhhdCBtYW55IEMgcHJvZ3JhbW1lcnMgbWlnaHQgdXNlICdjb25zdCBjaGFyIConCiAgICAgICAgICB3aXRoIHRoZSBpbnRlbnQgb2YgY3JlYXRpbmcgYSBjb25zdGFudCwgd2l0aG91dCByZWFsaXppbmcKICAgICAgICAgIHRoYXQgdGhleSd2ZSBjcmVhdGVkIGEgcmVhc3NpZ25hYmxlIGdsb2JhbCB2YXJpYWJsZS4KCjcvMjMvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUaGUgQy9DKysgd3JhcHBpbmcgbGF5ZXIgaGFzIGJlZW4gY29tcGxldGVseSByZWRlc2lnbmVkIGFuZAogICAgICAgICAgcmVpbXBsZW1lbnRlZC4gIFRoaXMgY2hhbmdlIHNob3VsZCBpcm9uIG91dCBhIGZldyByb3VnaAogICAgICAgICAgc3BvdHMgd2l0aCB0aGUgaGFuZGxpbmcgb2YgZGF0YXR5cGVzLiAgSW4gYWRkaXRpb24sIHRoZQogICAgICAgICAgd3JhcHBlciBjb2RlIGlzIHNvbWV3aGF0IGNsZWFuZXIuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgIFRoaXMgY2hhbmdlIG1heSBicmVhayBpbnRlcmZhY2VzIHRoYXQgaW52b2x2ZQogICAgICAgICAgc3VidGxlIGNvcm5lci1jYXNlcyB3aXRoIHR5cGVtYXBzIGFuZCB0aGUgJWFkZG1ldGhvZHMKICAgICAgICAgIGRpcmVjdGl2ZSBzaW5jZSBzb21lIG9mIHRoZXNlIGZlYXR1cmVzIGhhZCBzb21ld2hhdAogICAgICAgICAgdHlwZSBoYW5kbGluZyBiZWhhdmlvciBpbiBTV0lHMS4xLgoKNy8yMy8wMCA6IGJlYXpsZXkKICAgICAgICAgIFRoZSAibWVtYmVyaW4iIGFuZCAibWVtYmVyb3V0IiB0eXBlbWFwcyBhcmUgZ29uZSBmb3IgdGhlCiAgICAgICAgICBtb21lbnQsIGJ1dCB0aGV5IG1pZ2h0IHJldHVybiBhcyBzb29uIGFzIEkgZmlndXJlIG91dAogICAgICAgICAgaG93IHRvIGludGVncmF0ZSB0aGVtIHdpdGggc29tZSBvZiB0aGUgc3RyZWFtbGluZWQgQyB3cmFwcGVyCiAgICAgICAgICBmdW5jdGlvbnMuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvMjIvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBIHZhcmlldHkgb2Ygb2xkIHR5cGUgaGFuZGxpbmcgZnVuY3Rpb25zIHN1Y2ggYXMgcHJpbnRfdHlwZSgpLAogICAgICAgICAgcHJpbnRfZnVsbCgpLCBwcmludF9tYW5nbGUoKSwgZXRjLi4uIGFyZSBnb25lIGFuZCBoYXZlIGJlZW4KICAgICAgICAgIHJlcGxhY2VkIHdpdGggYSBzbWFsbGVyIHNldCBvZiBmdW5jdGlvbnMuICBTZWUgdGhlIGZpbGUKICAgICAgICAgIERvYy9pbnRlcm5hbHMuaHRtbCBmb3IgZGV0YWlscy4gIFRoaXMgd2lsbCBicmVhayBhbGwgdGhpcmQKICAgICAgICAgIHBhcnR5IGxhbmd1YWdlIG1vZHVsZXMuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvMjAvMDAgOiBiZWF6bGV5CiAgICAgICAgICBEZXByZWNhdGVkIHRoZSAldmFsIGFuZCAlb3V0IGRpcmVjdGl2ZXMuICBUaGVzZSBkaXJlY3RpdmVzCiAgICAgICAgICBzaG91bGRuJ3QgcmVhbGx5IGJlIG5lY2Vzc2FyeSBzaW5jZSB0eXBlbWFwcyBjYW4gYmUgdXNlZAogICAgICAgICAgdG8gYWNoaWV2ZSBzaW1pbGFyIHJlc3VsdHMuICAgVGhpcyBhbHNvIGNsZWFucyB1cCB0aGUKICAgICAgICAgIGhhbmRsaW5nIG9mIHR5cGVzIGFuZCBwYXJhbWV0ZXJzIHF1aXRlIGEgYml0LgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzIwLzAwIDogdHRuCgkgIEZpeGVkIHVuc3BlY2lmaWVkLW1vZHVsZSBidWcgaW4gR3VpbGUgc3VwcG9ydCBhbmQgcmVtb3ZlZAoJICBtb3JlIG5vbi0id2l0aC1zbW9icyIgZnVuY3Rpb25hbGl0eSB1c2luZyBwYXRjaGVzIHN1Ym1pdHRlZAoJICBieSBNYXR0aGlhcyBLb2VwcGUuCgoJICBSZS1lbmFibGUgcmVjb2duaXRpb24gb2YgIi13aXRoLXNtb2JzIiAod2l0aCBubyBlZmZlY3Qgc2luY2UKCSAgd2UgdXNlIHNtb2JzIGJ5IGRlZmF1bHQgbm93KSBmb3IgdGhlIHRpbWUgYmVpbmcuICBBZnRlciB0aGUKCSAgMS4zYTQgcmVsZWFzZSwgdGhpcyBvcHRpb24gd2lsbCBzaWduYWwgYW4gZXJyb3IuCgo3LzE3LzAwIDogdHRuCgkgIEZpeGVkIE5VTEwtaW5wdXQgYnVnIGluIHBhcmFtZXRlciBsaXN0IGhhbmRsaW5nLgoJICBSZXBvcnRlZCBieSBNYXR0aGlhcyBLb2VwcGUuCgo3LzEyLzAwIDogYmVhemxleQogICAgICAgICAgRml4ZWQgbWVtb3J5IGxlYWsgaW4gUHl0aG9uIHR5cGUtY2hlY2tpbmcgY29kZS4gUmVwb3J0ZWQgYnkKICAgICAgICAgIEtlaXRoIERhdmlkc29uLiAgQnVnICMxMDkzNzkuCgo3LzEwLzAwIDogYmVhemxleQogICAgICAgICAgQ2hhbmdlZCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgcmVsYXRlZCB0byBmdW5jdGlvbiBwYXJhbWV0ZXJzLgoKNy8xMC8wMCA6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIHNvbWUgYnVncyByZWxhdGVkIHRvIHRoZSBoYW5kbGluZyBvZiB0aGUgJW5hbWUoKSBkaXJlY3RpdmUKICAgICAgICAgIGFuZCBjbGFzc2VzIGluIHRoZSBUY2wgbW9kdWxlLiBQcm9ibGVtIHJlcG9ydGVkIGJ5IEphbWVzIEJhaWxleS4KCjcvMTAvMDAgOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBwYXJzaW5nIGFuZCBlbnVtIGhhbmRsaW5nIHByb2JsZW1zIHdpdGggY2hhcmFjdGVyIGNvbnN0YW50cy4KICAgICAgICAgIFJlcG9ydGVkIGJ5IEdyZWcgS29jaGFuc2tpLgoKNy8xMC8wMCA6IGJlYXpsZXkKICAgICAgICAgIFJlbW92ZWQgV3JhcHBlckZ1bmN0aW9uIGNsYXNzIGZyb20gdGhlIGNvcmUgYW5kIHVwZGF0ZWQgdGhlIGxhbmd1YWdlCiAgICAgICAgICBtb2R1bGUuICBUaGlzIHdpbGwgYnJlYWsgdGhpcmQgcGFydHkgbW9kdWxlcy4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy85LzAwICA6IGJlYXpsZXkKICAgICAgICAgIEltcGxlbWVudGF0aW9uIG9mIFNXSUcgbm8gbG9uZ2VyIG1ha2VzIHVzZSBvZiBDKysgb3BlcmF0b3Igb3ZlcmxvYWRpbmcuCiAgICAgICAgICBUaGlzIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBicmVhayAqYWxsKiB0aGlyZCBwYXJ0eSBsYW5ndWFnZSBtb2R1bGVzCiAgICAgICAgICB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgbWFpbiBTV0lHIENWUyB0cmVlLiBTb3JyeS4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy84LzAwICA6IGJlYXpsZXkKICAgICAgICAgIFJlbW92ZWQgdGhlIGV4cGVyaW1lbnRhbCBhbmQgdW5kb2N1bWVudGVkICJidWlsZCIgdHlwZW1hcCB0aGF0CiAgICAgICAgICB3YXMgaW50ZW5kZWQgdG8gd29yayB3aXRoIG11bHRpcGxlIGFyZ3VtZW50cy4gU2ltcGx5IHRvbyB3ZWlyZAogICAgICAgICAgdG8ga2VlcCBhcm91bmQuICBCZXNpZGVzLCBhIGJldHRlciByZXBsYWNlbWVudCBpcyBpbiB0aGUgd29ya3MuCgo3LzYvMDAgIDogdHRuCiAgICAgICAgICBSZW1vdmVkIG5vbi0id2l0aC1zbW9icyIgZnVuY3Rpb25hbGl0eSAoR3VpbGUgc3VwcG9ydCksIGkuZS4sCiAgICAgICAgICAiLXdpdGgtc21vYnMiIGlzIG5vdyB0aGUgZGVmYXVsdCBhbmQgbm8gbG9uZ2VyIG5lZWRzIHRvIGJlCgkgIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZC1saW5lLgoKNy81LzAwICA6IHR0bgogICAgICAgICAgSW5jb3Jwb3JhdGVkIFJ1Ynkgc3VwcG9ydCBjb250cmlidXRlZCBieSBNYXNha2kgRnVrdXNoaW1hLgoKNi8yOC8wMCA6IHR0bgogICAgICAgICAgQXBwbGllZCBtb3JlLXRoYW4tMTAtYXJncyBidWdmaXggcGF0Y2ggY29udHJpYnV0ZWQKCSAgYnkgTWF0dGhpYXMgS29lcHBlLgoKNi8yNy8wMCA6IGJlYXpsZXkKICAgICAgICAgIFJld3JvdGUgc29tZSBvZiB0aGUgc3RyaW5nIGhhbmRsaW5nIGFuZCBlbGltaW5hdGVkIHRoZSBDKysKICAgICAgICAgIGltcGxlbWVudGF0aW9uICh3aGljaCBpcyBub3cganVzdCBhIHdyYXBwZXIpLgoKNi8yNy8wMCA6IHR0bgogICAgICAgICAgQWRkZWQgRG9jL2luZGV4Lmh0bWwgYW5kIERvYy9pbnRlcm5hbHMuaHRtbC4gIFRoZSB0YXJnZXQKICAgICAgICAgIGF1ZGllbmNlIGZvciB0aGUgbGF0dGVyIGlzIG5ldyBTV0lHIGRldmVsb3BlcnMuCgoKVmVyc2lvbiAxLjMgQWxwaGEgMyAoSnVuZSAxOCwgMjAwMCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjYvMTgvMDAgOiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIHRoZSBuYW1pbmcuY3h4LCBoYXNoLmN4eCwgYW5kIHN5bWJvbC5jeHggZmlsZXMgZnJvbQogICAgICAgICAgdGhlIFNXSUcxLjEgZGlyZWN0b3J5LiAgIENvbnRpbnVlZCB0byBtaWdyYXRlIHRoaW5ncyBhd2F5CiAgICAgICAgICBmcm9tIHRoZSBDKysgYmFzZSAoYWx0aG91Z2ggdGhlcmUncyBzdGlsbCBhIGxvdCBvZiB3b3JrIHRvIGRvKS4KCjYvMTcvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCBhIGZldyBtb3JlIGV4YW1wbGVzIHRvIHRoZSBFeGFtcGxlcyBkaXJlY3RvcnkuICBTdGlsbAogICAgICAgICAgbmVlZCB0byBkbyBhIGxvdCBvZiB3b3JrIG9uIHRoaXMuCgo2LzE2LzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgLWluY2x1ZGVhbGwgdG8gZm9sbG93IGFsbCAjaW5jbHVkZSBzdGF0ZW1lbnRzIGluIHRoZQogICAgICAgICAgcHJlcHJvY2Vzc29yLgoKNi8xNS8wMCA6IGJlYXpsZXkKICAgICAgICAgIFRyaWVkIHRvIGZpeCBhcyBtYW55IEMrKyB3YXJuaW5ncyBhcyBwb3NzaWJsZSB3aGVuIGNvbXBpbGluZwogICAgICAgICAgd2l0aCB0aGUgU3VuIFdvcmtzaG9wIEMrKyBjb21waWxlci4gIFVuZm9ydHVuYXRlbHksIHRoaXMgbWVhbnMKICAgICAgICAgIHRoYXQgdGhlcmUgYXJlIGEgbG90IG9mIHN0YXRlbWVudHMgdGhhdCBjb250YWluIHN0cmluZyBsaXRlcmFscwogICAgICAgICAgb2YgdGhlIGZvcm0gKGNoYXIqKSJCbGFoIi4KCjYvMTUvMDA6ICBiZWF6bGV5CiAgICAgICAgICBBIHZhcmlldHkgb2YgY2xlYW51cCBhbmQgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIGluIHRoZQogICAgICAgICAgbG93LWxldmVsIERPSCBsaWJyYXJ5LiAgIFRoaXMgc2VlbXMgdG8gcmVzdWx0IGluIGEgc3BlZWR1cAogICAgICAgICAgb2YgNTAtMTAwJSBmb3IgcHJlcHJvY2Vzc2luZyBhbmQgb3RoZXIgcmVsYXRlZCB0YXNrcy4KCjUvMTAvMDAgOiB0dG4KCSAgQXBwbGllZCB2YXJpYWJsZS13cmFwcGluZyBidWdmaXggcGF0Y2ggY29udHJpYnV0ZWQKCSAgYnkgTWF0dGhpYXMgS29lcHBlLgoKNC8xNy8wMCA6IHR0bgoJICBVcGRhdGVkIE16U2NoZW1lIHN1cHBvcnQgY29udHJpYnV0ZWQgYnkgT2xlZyBUb2xtYXRjZXYuCgkgIFdlIG5vdyB1c2UgYSBgU2NoZW1lX1R5cGUnLWJhc2VkIHN0cnVjdHVyZSB0byB3cmFwIHBvaW50ZXJzLgoKNC8xMS8wMCA6IHR0bgoJICBJbmNvcnBvcmF0ZWQgZnVydGhlciBHdWlsZS1zdXBwb3J0IHBhdGNoIGJ5IE1hdHRoaWFzIEtvZXBwZS4KCSAgVHlwZW1hcHMgcHJldmlvdXNseSBkZWxldGVkIGhhdmUgYmVlbiByZS1hZGRlZC4gIFRoZXJlIGlzIG5vdwoJICBleGNlcHRpb24gaGFuZGxpbmcgKHNlZSBEb2MvZW5naW5lZXJpbmcuaHRtbCkuICBgU1dJR19pbml0JyBpcyBub3cKCSAgZGVjbGFyZWQgZXh0ZXJuIG9ubHkgZm9yIHNpbXBsZSBsaW5rYWdlLiAgU29tZSBidWdzIHdlcmUgZml4ZWQuCgo0LzA2LzAwIDogdHRuCgkgIEluY29ycG9yYXRlZCBNelNjaGVtZSBzdXBwb3J0IGNvbnRyaWJ1dGVkIGJ5IE9sZWcgVG9sbWF0Y2V2LgoJICBUaGlzIGluY2x1ZGVzIG5ldyBkaXJlY3RvcmllcyBMaWIvbXpzY2hlbWUgYW5kIEV4YW1wbGVzL216c2NoZW1lLgoKNC8wMy8wMCA6IHR0bgoJICBBZGRlZCBFeGFtcGxlcy9ndWlsZSBhbmQgY2hpbGRyZW4uICBUaGlzIGlzIGFuIGFkYXB0YXRpb24gb2YKCSAgdGhlIHNhbWUtbmFtZWQgZGlyZWN0b3J5IGZyb20gdGhlIFNXSUctMS4xcDUgZGlzdHJpYnV0aW9uLgoJICBBZGRlZCBHdWlsZS1zcGVjaWZpYyBzZWN0aW9uIHRvIERvYy9lbmdpbmVlcmluZy5odG1sLgoKNC8wMi8wMCA6IHR0bgoJICBJbmNvcnBvcmF0ZWQgbmV3IGd1aWxlbWFpbi5pIGJ5IE1hcnRpbiBGcm9laGxpY2guCgkgIEluY29ycG9yYXRlZCBHdWlsZS1zdXBwb3J0IHJld3JpdGUgcGF0Y2ggYnkgTWF0dGhpYXMgS29lcHBlLgoJICBUaGUgY29tbWFuZCBsaW5lIG9wdGlvbiAiLXdpdGgtc21vYnMiIGVuYWJsZXMgaW1wbGVtZW50YXRpb24gb2YKCSAgcG9pbnRlciB0eXBlIGhhbmRsaW5nIHVzaW5nIHNtb2JzLCB0aGUgY2Fub25pY2FsIG1lY2hhbmlzbSBmb3IKCSAgZGVmaW5pbmcgbmV3IHR5cGVzIGluIEd1aWxlLiAgUHJldmlvdXMgaW1wbGVtZW50YXRpb24gKHVzaW5nCgkgIHN0cmluZ3MpIGlzIGF0IHRoZSBtb21lbnQgc3RpbGwgc3VwcG9ydGVkIGJ1dCBkZXByZWNhdGVkLiAgQXQKCSAgc29tZSBwb2ludCwgIi13aXRoLXNtb2JzIiB3aWxsIGJlIHRoZSBkZWZhdWx0IGFuZCBubyBsb25nZXIKCSAgcmVxdWlyZWQuCgozLzEzLzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgcHVyaWZ5IHBhdGNoZXMgc3VibWl0dGVkIGJ5IFJhbSBCaGFtaWRpcGF0eS4KCjMvMDIvMDAgOiB0dG4KICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIGRpZmZlcmVudCBHdWlsZSAibGlua2FnZSIgc2NoZW1lcy4KCSAgQ3VycmVudGx5LCAiLUxpbmthZ2UgaG9iYml0IiB3b3Jrcy4KCgpWZXJzaW9uIDEuMyBBbHBoYSAyIChNYXJjaCAxLCAyMDAwKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMi8yOS8wMCA6IGJlYXpsZXkKICAgICAgICAgIE1hZGUgU1dJRyBpZ25vcmUgdGhlICdtdXRhYmxlJyBrZXl3b3JkLgoKMi8yOS8wMCA6IGJlYXpsZXkKICAgICAgICAgIEluY29ycG9yYXRlZCBzb21lIHBhdGNoZXMgdG8gdGhlIFBlcmw1IG1vZHVsZSByZWxhdGVkIHRvCiAgICAgICAgICB0aGUgLWhpZGUgb3B0aW9uIGFuZCB0aGUgZGVzdHJ1Y3Rpb24gb2Ygb2JqZWN0cy4KICAgICAgICAgIFBhdGNoIHN1Ym1pdHRlZCBieSBLYXJsIEZvcm5lci4KCjIvMjcvMDAgOiB0dG4KCSAgSW5jb3Jwb3JhdGVkIEd1aWxlIHN1cHBvcnQgY29udHJpYnV0ZWQgYnkgTWF0dGhpYXMgS29lcHBlLgoJICBUaGlzIGluY2x1ZGVzIGEgY3BwIG1hY3JvIGluIExpYi9ndWlsZS9ndWlsZS5zd2cgYW5kIHRoZQoJICBlbnRpcmUgZmlsZSBMaWIvZ3VpbGUvdHlwZW1hcHMuaS4KCjIvMjUvMDAgOiB0dG4KCSAgTW9kaWZpZWQgY29uZmlndXJlLmluIGFuZCBNYWtlZmlsZS5pbiBmaWxlcyB0byBzdXBwb3J0CgkgIG5vbi1sb2NhbCBidWlsZCAodXNlZnVsIGluIG11bHRpLWFyY2ggZW52aXJvbm1lbnRzKS4KCjIvMjQvMDAgOiB0dG4KCSAgSW5jb3Jwb3JhdGVkIEd1aWxlIHN1cHBvcnQgY29udHJpYnV0ZWQgYnkgQ2xhcmsgTWNHcmV3LgoJICBUaGlzIHdvcmtzIHdpdGggR3VpbGUgMS4zLCBidXQgc2luY2UgaXQgZGVwZW5kcyBoZWF2aWx5CgkgIG9uIHRoZSBnaF8gaW50ZXJmYWNlLCBpdCBzaG91bGQgd29yayBmb3IgYWxsIGxhdGVyIHZlcnNpb25zLgoJICBJdCBoYXMgbm90IGJlZW4gdGVzdGVkIHdpdGggdmVyc2lvbnMgYmVmb3JlIDEuMy4KCSAgV0FSTklORzogQ29kZSBpcyB1bnN0YWJsZSBkdWUgdG8gZXhwZXJpbWVudGF0aW9uIGJ5IHR0bi4KCjIvMTYvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBIHZhcmlldHkgb2YgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIHRvIHRoZSBQeXRob24gc2hhZG93CiAgICAgICAgICBjbGFzcyBjb2RlIGdlbmVyYXRpb24uICBNYW55IG9mIHRoZXNlIHJlc3VsdCBpbiBzdWJzdGFudGlhbAogICAgICAgICAgcnVudGltZSBwZXJmb3JtYW5jZSBnYWlucy4gIEhvd2V2ZXIsIHRoZXNlIGhhdmUgY29tZSBhdAogICAgICAgICAgYSBjb3N0IG9mIHJlcXVpcmluZyB0aGUgdXNlIG9mIFB5dGhvbiAxLjUuMi4gIEZvciBvbGRlcgogICAgICAgICAgdmVyc2lvbnMsIHVzZSAnc3dpZyAtbm9vcHQgLXB5dGhvbicgdG8gdHVybiBvZmYgdGhlc2UKICAgICAgICAgIG9wdGltaXphdGlvbiBmZWF0dXJlcy4KClZlcnNpb24gMS4zIEFscGhhIDEgKEZlYnJ1YXJ5IDExLCAyMDAwKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIvMTEvMDAgOiBBZGRlZCAndm9pZCcgdG8gcHJvdG90eXBlIG9mIFB5dGhvbiBtb2R1bGUgaW5pdGlhbGl6ZXIuCiAgICAgICAgICBSZXBvcnRlZCBieSBNYXJrIEhvd3NvbiAoMS8yMC8wMCkuCgoyLzExLzAwIDogYmVhemxleQogICAgICAgICAgTW9kaWZpZWQgdGhlIFB5dGhvbiBzaGFkb3cgY2xhc3MgY29kZSB0byBkaXNjYXJkIG93bmVyc2hpcCBvZiBhbgogICAgICAgICAgb2JqZWN0IHdoZW5ldmVyIGl0IGlzIGFzc2lnbmVkIHRvIGEgbWVtYmVyIG9mIGFub3RoZXIgb2JqZWN0LgogICAgICAgICAgVGhpcyBwcm9ibGVtIGhhcyBiZWVuIGFyb3VuZCBmb3IgYXdoaWxlLCBidXQgd2FzIG1vc3QgcmVjZW50bHkKICAgICAgICAgIHJlcG9ydGVkIGJ5IEJ1cmtoYXJkIEtsb3NzICgxMi8zMC85OSkuCgoyLzExLzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgYnJhY2VzIGFyb3VuZCBtYWNyb3MgaW4gdGhlIGV4Y2VwdGlvbi5pIGxpYnJhcnkuICBSZXBvcnRlZAogICAgICAgICAgYnkgQnVjayBIb2RnZXMgKDEyLzE5Lzk5KQoKMi8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIGJ1ZyBpbiB0aGUgY29uc3RyYWludHMuaSBsaWJyYXJ5LiBSZXBvcnRlZCBieSBCdWNrCiAgICAgICAgICBIb2RnZXMgKDEyLzE0Lzk5KQoKMi8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIFRoZSAlbmF0aXZlIGRpcmVjdGl2ZSBub3cgZ2VuZXJhdGVzIFRjbDggb2JqZWN0LXN0eWxlIGNvbW1hbmQgY2FsbHMuCiAgICAgICAgICBBIGZ1bGwgc29sdXRpb24gZm9yIFRjbDcgYW5kIFRjbDggaXMgc3RpbGwgbmVlZGVkLiBQYXRjaCBzdWdnZXN0ZWQKICAgICAgICAgIGJ5IE1pa2UgV2VpYmxlbiAoMTEvMjkvOTkpCgoyLzExLzAwIDogYmVhemxleQogICAgICAgICAgTW9kaWZpZWQgdGhlIHR5cGVtYXAgY29kZSB0byBpbmNsdWRlIHRoZSAkbmRpbSB2YXJpYWJsZSBmb3IgYXJyYXlzLgogICAgICAgICAgUGF0Y2ggcHJvdmlkZWQgYnkgTWljaGVsIFNhbm5lciAoMTEvMTIvOTkpLgoKMi8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIE1vZGlmaWVkIHRoZSBQeXRob24gbW9kdWxlIHRvIHJhaXNlIGEgUnVudGltZSBlcnJvciBpZiBhbiBhdHRlbXB0CiAgICAgICAgICBpcyBtYWRlIHRvIHNldCBhIHJlYWQtb25seSBtZW1iZXIgb2YgYSBzaGFkb3cgY2xhc3MuICBSZXBvcnRlZCBieQogICAgICAgICAgTWljaGVsIFNhbm5lciAoMTEvNS85OSkuCgoyLzEwLzAwIDogVGhlIGRvY3VtZW50YXRpb24gc3lzdGVtIGhhcyBiZWVuIHJlbW92ZWQuIEhvd2V2ZXIsIGl0IGlzIGxpa2VseQogICAgICAgICAgdG8gcmV0dXJuIGF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZS4KCjIvMS8wMCAgOiBBZGRlZCBhIG51bWJlciBvZiBwZXJmb3JtYW5jZSBlbmhhbmNlbWVudHMgdG8gdGhlIFB5dGhvbiBzaGFkb3cKICAgICAgICAgIGNsYXNzaW5nIGFuZCB0eXBlLWNoZWNraW5nIGNvZGUuICBDb250cmlidXRlZCBieSBWYWRpbSBDaHVndW5vdi4KCiAgICAgICAgICAxLiBSZW1vdmUgX2t3YXJncyBhcmd1bWVudCBmcm9tIHRoZSBzaGFkb3cgd3JhcHBlcnMgd2hlbiAta2V5d29yZAogICAgICAgICAgICAgb3B0aW9uIGlzIG5vdCBzcGVjaWZpZWQuIFRoaXMgc2F2ZXMgdXMgYSBjb25zdHJ1Y3Rpb24gb2Yga2V5d29yZAogICAgICAgICAgICAgZGljdGlvbmFyeSBvbiBlYWNoIG1ldGhvZCBjYWxsLgoKICAgICAgICAgICAgIGRlZiBtZXRob2QxKHNlbGYsICpfYXJncywgKipfa3dhcmdzKToKICAgICAgICAgICAgICAgICB2YWwgPSBhcHBseSh0ZXN0MmMuUHlDbGFzczFfbWV0aG9kMSwgKHNlbGYsKSArIF9hcmdzLCBfa3dhcmdzKQogICAgICAgICAgICAgICAgIHJldHVybiB2YWwKCiAgICAgICAgICAgICBiZWNvbWVzCgogICAgICAgICAgICAgZGVmIG1ldGhvZDEoc2VsZiwgKl9hcmdzKToKICAgICAgICAgICAgICAgICB2YWwgPSBhcHBseSh0ZXN0MmMuUHlDbGFzczFfbWV0aG9kMSwgKHNlbGYsKSArIF9hcmdzKQogICAgICAgICAgICAgICAgIHJldHVybiB2YWwKCiAgICAgICAgICAyLiBJbmNvcnBvcmF0ZSBzZWxmIGludG8gdGhlIF9hcmdzIHR1cGxlLiAgVGhpcyBzYXZlcyBhdCBsZWFzdCBvbmUgdHVwbGUKICAgICAgICAgICAgIGFsbG9jYXRpb24gcGVyIG1ldGhvZCBjYWxsLgoKICAgICAgICAgICAgIGRlZiBtZXRob2QxKHNlbGYsICpfYXJncyk6CiAgICAgICAgICAgICAgICAgdmFsID0gYXBwbHkodGVzdDJjLlB5Q2xhc3MxX21ldGhvZDEsIChzZWxmLCkgKyBfYXJncykKICAgICAgICAgICAgICAgICByZXR1cm4gdmFsCgogICAgICAgICAgICAgYmVjb21lcwoKICAgICAgICAgICAgIGRlZiBtZXRob2QxKCpfYXJncyk6CiAgICAgICAgICAgICAgICAgdmFsID0gYXBwbHkodGVzdDJjLlB5Q2xhc3MxX21ldGhvZDEsIF9hcmdzKQogICAgICAgICAgICAgICAgIHJldHVybiB2YWwKCiAgICAgICAgICAzLiBSZW1vdmUgKlB0ciBjbGFzc2VzLgogICAgICAgICAgICAgQXNzdW1lIHRoYXQgd2UgYXJlIFNXSUdnaW5nIGEgYysrIGNsYXNzIENwcENsYXNzLgogICAgICAgICAgICAgQ3VycmVudGx5IFNXSUcgd2lsbCBnZW5lcmF0ZSBib3RoIENwcENsYXNzUHRyIGNsYXNzCiAgICAgICAgICAgICB0aGF0IGhvc3RzIGFsbCBtZXRob2RzIGFuZCBhbHNvIENwcENsYXNzIHRoYXQgaXMgZGVyaXZlZAogICAgICAgICAgICAgZnJvbSB0aGUgZm9ybWVyIGFuZCBjb250YWlucyBqdXN0IHRoZSBjb25zdHJ1Y3Rvci4KICAgICAgICAgICAgIFdoZW4gQ3BwQ2xhc3MgbWV0aG9kIGlzIGNhbGxlZCwgdGhlIGludGVycHJldGVyIHdpbGwgdHJ5CiAgICAgICAgICAgICB0byBmaW5kIGl0IGluIHRoZSBDcHBDbGFzcydzIGRpY3Rpb25hcnkgZmlyc3QsIGFuZCBvbmx5IHRoZW4KICAgICAgICAgICAgIGNoZWNrIHRoZSBiYXNlIGNsYXNzLgoKICAgICAgICAgICAgIENwcENsYXNzUHRyIGZ1bmN0aW9uYWxpdHkgbWF5IGJlIGVtdWxhdGVkIHdpdGg6CgogICAgICAgICAgICAgaW1wb3J0IG5ldwogICAgICAgICAgICAgX25ld19pbnN0YW5jZSA9IG5ldy5pbnN0YW5jZQogICAgICAgICAgICAgZGVmIENwcENsYXNzUHRyKHRoaXMpOgogICAgICAgICAgICAgICAgICByZXR1cm4gX25ld19pbnN0YW5jZShDcHBDbGFzcywgeyJ0aGlzIjp0aGlzLCJ0aGlzb3duIjowfSkKCiAgICAgICAgICAgICBUaGlzIHNhdmVzIHVzIG9uZSBkaWN0aW9uYXJ5IGxvb2t1cCBwZXIgY2FsbC4KCiAgICAgICAgICAgICA8REI+VGhlIG5ldyBtb2R1bGUgd2FzIGZpcnN0IGFkZGVkIGluIFB5dGhvbi0xLjUuMiBzbyBpdAogICAgICAgICAgICAgd29uJ3Qgd29yayB3aXRoIG9sZGVyIHZlcnNpb25zLiAgSSd2ZSBpbXBsZW1lbnRlZCBhbgogICAgICAgICAgICAgYWx0ZXJuYXRpdmUgdGhhdCBhY2hpZXZlcyB0aGUgc2FtZSB0aGluZzwvREI+CgogICAgICAgICAgNC4gVXNlIENPYmplY3RzIGluc3RlYWQgb2Ygc3RyaW5ncyBmb3IgcG9pbnRlcnMuCgogICAgICAgICAgRGF2ZTogVGhpcyBlbmhhbmNlbWVudHMgcmVzdWx0IGluIHNwZWVkdXBzIG9mIHVwIHRvIDUwJSBpbiBzb21lCiAgICAgICAgICBvZiB0aGUgcHJlbGltaW5hcnkgdGVzdHMgSSByYW4uCgoyLzEvMDAgIDogVXBncmFkZWQgdGhlIFB5dGhvbiBtb2R1bGUgdG8gdXNlIGEgbmV3IHR5cGUtY2hlY2tpbmcgc2NoZW1lIHRoYXQKICAgICAgICAgIGlzIG1vcmUgbWVtb3J5IGVmZmljaWVudCwgcHJvdmlkZXMgYmV0dGVyIHBlcmZvcm1hbmNlLCBhbmQKICAgICAgICAgIGlzIGxlc3MgZXJyb3IgcHJvbmUuIFVuZm9ydHVuYXRlbHksIGl0IHdpbGwgYnJlYWsgYWxsIGNvZGUgdGhhdAogICAgICAgICAgZGVwZW5kcyBvbiB0aGUgU1dJR19HZXRQdHIoKSBmdW5jdGlvbiBjYWxsIGluIHR5cGVtYXBzLgogICAgICAgICAgVGhlc2UgZnVuY3Rpb25zIHNob3VsZCBiZSBjaGFuZ2VkIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICAgaWYgKFNXSUdfR2V0UHRyKHN0cmluZywmcHRyLCJfRm9vX3AiKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgIGJlY29tZXMKCiAgICAgICAgICAgICAgICBpZiAoU1dJR19Db252ZXJ0UHRyKHB5b2JqLCAmcHRyLCBTV0lHX1RZUEVfRm9vX3ApID09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgTm90ZTogSW4gdGhlIG5ldyBpbXBsZW1lbnRhdGlvbiBTV0lHX1RZUEVfRm9vX3AgaXMgbm8gbG9uZ2VyCiAgICAgICAgICBhIHR5cGUtc2lnbmF0dXJlIHN0cmluZywgYnV0IHJhdGhlciBhbiBpbmRleCBpbnRvIGEgdHlwZQogICAgICAgICAgZW5jb2RpbmcgdGFibGUgdGhhdCBjb250YWlucyB0eXBlIGluZm9ybWF0aW9uLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxLzMwLzAwIDogbG9pYwoJICBDb25kaXRpb25hbGx5IGNvbXBpbGUgZXhwZXJpbWVudGFsIGNvZGUgd2l0aCAtLWVuYWJsZS1leHBlcmltZW50CgkgIGNvbmZpZ3VyZSBmbGFnLgoJICBGaXggLmN2c2lnbm9yZSB0byBpZ25vcmUgY29uZmlndXJlICYgeWFjYyBnZW5lcmF0ZWQgZmlsZXMKCjEvMjgvMDAgOiBsb2ljCgkgIEFwcGx5IGF1dG9tYWtlIGV2ZXJ5d2hlcmUKCSAgS2VlcCBjb25maWd1cmUgc2NyaXB0cyBzbyB0aGF0IHBlb3BsZSBhcmUgbm90ICpmb3JjZWQqIHRvIGF1dG9jb25mCiAgICAgICAgICBLZWVwIHNvdXJjZXMgZ2VuZXJhdGVkIGJ5IHlhY2Mgc28gdGhhdCBjb21waWxhdGlvbiB3aXRob3V0IHlhY2MKCSAgaXMgcG9zc2libGUuCgkgIFNvdXJjZS9MUGFyc2UvY3NjYW5uZXIuYzogY2hhbmdlIGx5YWNjLmggaW50byBwYXJzZXIuaCB0byBwbGVhc2UKCSAgZGVmYXVsdCB5YWNjIGdlbmVyYXRpb24gcnVsZXMuCgkgIFVzZSBBQ19DT05GSUdfU1VCRElSUyBpbiBjb25maWd1cmUuaW4gaW5zdGVhZCBvZiBoYW5kIG1hZGUgc2NyaXB0LgoJICBVcGRhdGUgYWxsIHJlbGV2YW50IC5jdnNpZ25vcmUgdG8gaW5jbHVkZSAuZGVwcwoJICBGaXhlZCBtaXNzaW5nIDsgbGluZSAxMzYgU291cmNlL1N3aWcvc3dpZy5oCgoxLzEzLzAwIDogYmVhemxleQogICAgICAgICAgRml4ZWQgYSBudW1iZXIgb2YgbWlub3IgZW5kLW9mLWZpbGUgcGFyc2luZyBwcm9ibGVtcyBpbiB0aGUKICAgICAgICAgIHByZXByb2Nlc3Nvci4KCjEvMTMvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCAtZnJlZXplIG9wdGlvbiB0aGF0IGZvcmNlcyBTV0lHIHRvIGZyZWV6ZSB1cG9uIGV4aXQuCiAgICAgICAgICBUaGlzIGlzIG9ubHkgdXNlZCBhcyBhIGRlYnVnZ2luZyB0b29sIHNvIHRoYXQgSSBjYW4gbW9yZQogICAgICAgICAgZWFzaWx5IGV4YW1pbmUgU1dJRydzIG1lbW9yeSBmb290cHJpbnQuCgoxLzEzLzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgcGF0Y2ggdG8gZ3VpbGUgbW9kdWxlIGZvciBzdXBwb3J0aW5nIG9wdGlvbmFsIGFyZ3VtZW50cwogICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgRGlldGVyIEJhcm9uLgoKMS8xMy8wMCA6IGxvaWMKCSAgQWRkZWQgLmN2c2lnbm9yZSwgRXhhbXBsZXMvLmN2c2lnbm9yZSwgU291cmNlL0RPSC9Eb2gvLmN2c2lnbm9yZQoJICBTb3VyY2UvU1dJRzEuMS9tYWluLmN4eDogRml4ZWQgLUkgaGFuZGxpbmcgYnVnCgkgIFNvdXJjZS9Nb2R1bGVzMS4xL2phdmEuY3h4OiBmaXhlZCBjaGFyKiAtPiBjb25zdCBjaGFyKiB3YXJuaW5ncyB0aGF0IGFyZQoJICBlcnJvcnMgd2hlbiBjb21waWxpbmcgd2l0aCBnY2MtMi45NS4yCgkgIFNvdXJjZS9TV0lHMS4xL21haW4uY3h4OiBjYXN0IGNvbnN0IGNoYXIqIHRvIGNoYXIqIGZvciBTdHJpbmdfcmVwbGFjZQoJICB0b2tlbiBhbmQgcmVwIHNob3VsZCByZWFsbHkgYmUgY29uc3QuCgoxLzEyLzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgSGFyY28ncyBKYXZhIG1vZHVsZXMuCgoxLzEyLzAwIDogYmVhemxleQogICAgICAgICAgUmV2b2tlZCB0aGUgJWlmZGVmLCAlaWZuZGVmLCAlZW5kaWYsICVpZiwgJWVsaWYsIGFuZCAlZWxzZQogICAgICAgICAgZGlyZWN0aXZlcy4gIFRoZXNlIGFyZSBubyBsb25nZXIgbmVlZGVkIGFzIFNXSUcgbm93IGhhcyBhIHJlYWwKICAgICAgICAgIHByZXByb2Nlc3Nvci4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMS8xMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIE1vdmVkIHRoZSBkb2N1bWVudGF0aW9uIG1vZHVsZXMgZnJvbSB0aGUgU1dJRyBkaXJlY3RvcnkKICAgICAgICAgIHRvIHRoZSBNb2R1bGVzIGRpcmVjdG9yeSAod2hlcmUgdGhleSByZWFsbHkgc2hvdWxkIGhhdmUgYmVlbgogICAgICAgICAgdG8gYmVnaW4gd2l0aCkuCgoxLzEyLzAwIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCB0aGUgLXN0YXQgb3B0aW9uIGZvciBwcmludGluZyBzdGF0aXN0aWNzLiBUaGUKICAgICAgICAgIHN0YXRpc3RpY3MgcmVwb3J0aW5nIHdhcyBpbmFkZXF1YXRlIGFuZCBtb3N0bHkgYnJva2VuCiAgICAgICAgICBhbnl3YXkuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEvMTIvMDAgOiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIHRoZSAtdCBvcHRpb24gZm9yIHJlYWRpbmcgYSB0eXBlbWFwIGZpbGUuICBNb3JlCiAgICAgICAgICB0cm91YmxlIHRoYW4gaXQncyB3b3J0aC4gIEp1c3QgaW5jbHVkZSB0eXBlbWFwcyBhdCB0aGUgdG9wCiAgICAgICAgICBvZiB0aGUgaW50ZXJmYWNlIGZpbGUuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEvMTIvMDAgOiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIHRoZSAlY2hlY2tvdXQgZGlyZWN0aXZlLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxLzEyLzAwIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCB0aGUgLWNpIG9wdGlvbiBmb3IgZmlsZSBjaGVja2luLiAgIFRvbyBwcm9ibGVtYXRpYwogICAgICAgICAgdG8gaW1wbGVtZW50LiAgUHJvYmFibHkgYmV0dGVyIHRvIGp1c3QgcHV0IHlvdXIgU1dJRyBsaWJyYXJ5CiAgICAgICAgICB1bmRlciBDVlMgaW5zdGVhZC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKi4KCjEvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBEZWxldGVkIHRoZSBMQVRFWCBtb2R1bGUuICBTb3JyeS4uLiBEaWRuJ3Qga25vdyBhbnlvbmUKICAgICAgICAgIHdobyB3YXMgdXNpbmcgaXQuICBCZXNpZGVzLCBJJ20gbG9va2luZyB0byBzaW1wbGlmeQogICAgICAgICAgdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxLzExLzAwIDogYmVhemxleQogICAgICAgICAgTW9kaWZpZWQgdGhlIEFTQ0lJIGRvY3VtZW50YXRpb24gbW9kdWxlIHRvIHVzZSBhIC50eHQKICAgICAgICAgIHN1ZmZpeCBmb3IgaXRzIG91dHB1dCBmaWxlIGluc3RlYWQgb2YgLmRvYy4KCjEvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCB0aGUgbG9uZy1sb3N0IFNXSUcgcHJlcHJvY2Vzc29yIGJhY2sgdG8gdGhlIHN5c3RlbS4KICAgICAgICAgIEl0IHNob3VsZCBiZSBlbmFibGVkIGJ5IGRlZmF1bHQuICBSYXcgcHJlcHJvY2Vzc2VkIG91dHB1dAogICAgICAgICAgY2FuIGJlIHZpZXdlZCB1c2luZyBzd2lnIC1FIGZpbGUuaS4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjEvMTEvMDAgOiBiZWF6bGV5IGFuZCBkam1pdGNoZQogICAgICAgICAgQ29tcGxldGVseSByZW9yZ2FuaXplZCB0aGUgU1dJRyBkaXJlY3Rvcnkgc3RydWN0dXJlLiAgVGhlCiAgICAgICAgICBiYXNpYyBvcmdhbml6YXRpb24gaXMgbm93OgoKICAgICAgICAgICAgICAgIFNvdXJjZS8gICAgICAgICBTV0lHIHNvdXJjZSBjb2RlCiAgICAgICAgICAgICAgICBMaWIvICAgICAgICAgICAgU1dJRyBsaWJyYXJ5IGZpbGVzIChzd2lnX2xpYikKICAgICAgICAgICAgICAgIERvYy8gICAgICAgICAgICBEb2N1bWVudGF0aW9uCiAgICAgICAgICAgICAgICBFeGFtcGxlcy8gICAgICAgRXhhbXBsZXMKCiAgICAgICAgICBNb3JlIGRpcmVjdG9yaWVzIHdpbGwgYmUgYWRkZWQgYXMgbmVlZGVkLgoKMTIvMDgvOTk6IExvaWMgRGFjaGFyeSAobG9pY0BzZW5nYS5vcmcpCgkgIEVuaGFuY2VkIHBhY2thZ2UgaGFuZGxpbmcgZm9yIHBlcmw1IGFuZCBjKysuCgoJICBXaXRoIG5ldyBvcHRpb24gLWhpZGUgRm9vOjpCYXIsIGV2ZXJ5IHBlcmw1IG9iamVjdCAoRnJvYikgaXMKCSAgcXVhbGlmaWVkIGJ5IEZvbzo6QmFyOjpGcm9iLiBUaGUgcGFja2FnZSBuYW1lIGlzIHNvbGVseSB1c2VkCgkgIHRvIGVuY2Fwc3VsYXRlIEMvQysrIHdyYXBwZXJzIG91dHB1dCBpbiA8bW9kdWxlPl93cmFwLmMgYW5kIHRoZQoJICBjb3JyZXNwb25kaW5nIHBlcmwgcGFja2FnZSBpbiA8bW9kdWxlPi5wbS4gTm90ZSB0aGF0IGEgcGFja2FnZQoJICBuYW1lIG1heSBjb250YWluIDo6IChGcm9iOjpOaXR6KSBhbmQgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUKCSAgcGFja2FnZSBuYW1lIHByb3ZpZGVkIGJ5IC1oaWRlIChGb286OkJhcjo6RnJvYjo6Tml0eikuCgoJICBJbiAqX3dyYXAuYywgU1dJR19pbml0IG1hY3JvIGlzIHVzZWQuIFdhcyBwcmV2aW91c2x5IGRlZmluZWQKCSAgYnV0IG5vdCB1c2VkIGFuZCBzaW1wbGlmaWVzIGNvZGUuCgoJICBBZGRlZCB0eXBlbWFwKHBlcmw1LHBlcmw1aW4pIGFuZCB0eXBlbWFwKHBlcmw1LHBlcmw1b3V0KSB0aGF0CgkgIGRvIHRoZSBlcXVpdmFsZW50IG9mIHR5cGVtYXAocGVybDUsaW4pIGFuZCB0eXBlbWFwKHBlcmw1LG91dCkKCSAgYnV0IGNvbnRhaW4gcGVybCBjb2RlIGFuZCBhcHBsaWVzIHRvIHdyYXBwZXJzIGdlbmVyYXRlZCBieQoJICAtc2hhZG93LgoKCSAgTGFja2luZyBwcm9wZXIgcmVncmVzc2lvbiB0ZXN0cyBJIHVzZWQKCSAgRXhhbXBsZXMvcGVybDUve2MrKyxjb25zdHJhaW50LGRlZmFyZyxleGNlcHQsCgkgIGdyYXBoL2dyYXBoWzEyMzRdLG11bHRpbmhlcml0LG5lc3RlZCxzaGFkb3csc2ltcGxlLHRyZWUsCgkgIHR5cGVtYXBzL3thcmd2LGFyZ3YyLGFycmF5bWVtYmVyLGRhdGFiYXNlLGZpbGUsaWdub3JlLGludGVnZXIsCgkgIG91dHB1dCxwYXNzcmVmLHJlZmVyZW5jZSxyZXR1cm59fS8uIEkgcmFuIHN3aWcgd2l0aCBhbmQgd2l0aG91dAoJICB0aGUgcGF0Y2hlcywgZGlmZiB0aGUgZ2VuZXJhdGVkc291cmNlcywgcnVuIHRoZSAucGwgZmlsZXMKCSAgYW5kIGNoZWNrZWQgdGhhdCB0aGUgcmVzdWx0cyBhcmUgaWRlbnRpY2FsLiBJbiBhbGwgdGhvc2UgZXhhbXBsZXMKCSAgSSBoYWQgbm8gZXJyb3IuCgoxMS8yMS85OTogTW9kaWZpZWQgdGhlIFRjbCBtb2R1bGUgdG8gcHJvdmlkZSBmdWxsIHZhcmlhYmxlIGxpbmtpbmcgY2FwYWJpbGl0aWVzCiAgICAgICAgICB0byBhbGwgZGF0YXR5cGVzLiAgIEluIHByZXZpb3VzIHZlcnNpb25zLCBhIHBhaXIgb2YgYWNjZXNzb3IgZnVuY3Rpb25zCiAgICAgICAgICB3ZXJlIGNyZWF0ZWQgZm9yIGRhdGF0eXBlcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgVGNsX0xpbmtWYXIoKSBmdW5jdGlvbi4KICAgICAgICAgIE5vdywgd2Ugc2ltcGx5IHVzZSB2YXJpYWJsZSB0cmFjZXMgdG8gc3VwcG9ydCBldmVyeXRoaW5nLiBUaGlzIG1heQogICAgICAgICAgYnJlYWsgc2NyaXB0cyB0aGF0IHJlbHkgdXBvbiB0aGUgb2xkZXIgYmVoYXZpb3IuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjExLzIxLzk5OiBBZGRlZCBzbGlnaHQgdHdlYWsgdG8gd3JhcHBlciBnZW5lcmF0b3IgdG8gY29sbGVjdCBsb2NhbCB2YXJpYWJsZXMKICAgICAgICAgIG9mIHNpbWlsYXIgdHlwZS4gIFByb2R1Y2VzIHNvbWV3aGF0IG1vcmUgY29tcGFjdCB3cmFwcGVyIGNvZGUuCgoxMS8yMC85OTogTW9kaWZpZWQgdGhlIFRjbCBtb2R1bGUgdG8gdXNlIFNXSUdfR2V0QXJncygpIHRvIHBhcnNlCiAgICAgICAgICBhcmd1bWVudHMuICAgIFRoaXMgaXMgYSB0ZWNobmlxdWUgYm9ycm93ZWQgZnJvbSBQeXRob24gaW4gd2hpY2gKICAgICAgICAgIGFyZ3VtZW50cyBhcmUgY29udmVydGVkIHVzaW5nIGEgZm9ybWF0IHN0cmluZyBjb252ZW50aW9uIHNpbWlsaWFyCiAgICAgICAgICB0byBmcHJpbnRmKCkuICAgVGhpcyByZXN1bHRzIGluIGEgKnN1YnN0YW50aWFsKiByZWR1Y3Rpb24gaW4gdGhlCiAgICAgICAgICBzaXplIG9mIHRoZSByZXN1bHRpbmcgd3JhcHBlciBjb2RlIHdpdGggb25seSBhIG1vZGVzdCBydW50aW1lIG92ZXJoZWFkCiAgICAgICAgICBpbiBnb2luZyB0aHJvdWdoIHRoZSBleHRyYSBjb252ZXJzaW9uIGZ1bmN0aW9uLgoKMTEvMTMvOTk6IENvbXBsZXRlbHkgcmV3cm90ZSB0aGUgY2xhc3Mvc3RydWN0dXJlIGdlbmVyYXRpb24gY29kZSBmb3IgdGhlCiAgICAgICAgICBUY2wgbW9kdWxlLiAgTm93LCBhIHNtYWxsIHNldCBvZiBydW50aW1lIGZ1bmN0aW9ucyBhcmUgdXNlZAogICAgICAgICAgdG8gaW1wbGVtZW50IHRoZSBmdW5jdGlvbmFsaXR5IGZvciBhbGwgY2xhc3NlcyAoaW5zdGVhZCBvZiBhCiAgICAgICAgICBtYXNzaXZlIGFtb3VudCBvZiBydW50aW1lIGNvZGUgYmVpbmcgZ2VuZXJhdGVkIGZvciBlYWNoIGNsYXNzKS4KICAgICAgICAgIENsYXNzIHNwZWNpZmljIGluZm9ybWF0aW9uIGlzIHNpbXBseSBlbmNvZGVkIGluIGEgc2VyaWVzIG9mCiAgICAgICAgICBzdGF0aWMgdGFibGVzLiAgIFRoaXMgcmVzdWx0cyBpbiBhICpIVUdFKiByZWR1Y3Rpb24gaW4gd3JhcHBlcgogICAgICAgICAgY29kZSBzaXplLS1lc3BlY2lhbGx5IGZvciBDKysuCgoxMS8xMy85OTogUmVtb3ZlZCB0aGUgLXRjbCAoVGNsIDcueCkgbW9kdWxlLiAgVGNsIDguMCBpcyBub3cgc2V2ZXJhbAogICAgICAgICAgeWVhcnMgb2xkIGFuZCB0aGUgZGVmYWN0byBzdGFuZGFyZC0tbm8gcmVhbCByZWFzb24gdG8ga2VlcAogICAgICAgICAgc3VwcG9ydGluZyB0aGUgb2xkIHZlcnNpb24gYXQgdGhpcyBwb2ludC4KCjExLzEzLzk5OiBDbGVhbmVkIHVwIC1jIG9wdGlvbiBmb3IgUHl0aG9uIG1vZHVsZS4gIFRoZSBweWV4cC5zd2cgZmlsZQogICAgICAgICAgaXMgbm93IGdvbmUuCgoxMS8xMy85OTogRml4ZWQgZXh0ZXJuYWwgZGVjbGFyYXRpb25zIHRvIHdvcmsgYmV0dGVyIHdpdGggc3RhdGljIGxpbmtpbmcKICAgICAgICAgIG9uIFdpbmRvd3MuICBTdGF0aWMgbGlua2luZyBzaG91bGQgbm93IGJlIHBvc3NpYmxlIGJ5IGRlZmluaW5nCiAgICAgICAgICB0aGUgLURTVEFUSUNfTElOSyBvcHRpb24gb24gdGhlIGNvbW1hbmQgbGluZS4gIFBhdGNoIGNvbnRyaWJ1dGVkCiAgICAgICAgICBieSBBbGJlcnRvIEZvbnNlY2EuCgoxMS81Lzk5IDogRml4ZWQgYW4gb2JzY3VyZSBjb2RlIGdlbmVyYXRpb24gYnVnIHJlbGF0ZWQgdG8gdGhlIGdlbmVyYXRpb24KICAgICAgICAgIG9mIGRlZmF1bHQgY29uc3RydWN0b3JzLiAgIEJ1ZyByZXBvcnRlZCBieSBCcmFkIENsZW1lbnRzLgoKMTEvNS85OSA6IEZpeGVkIGEgZmV3IG1lbW9yeSBwcm9ibGVtcyBmb3VuZCBieSBwdXJpZnkuCgoxMS81Lzk5IDogT2ZmaWNpYWxseSBkZXByZWNhdGVkIHRoZSAtaHRjbCwgLWh0aywgYW5kIC1wbHVnaW4gb3B0aW9ucwogICAgICAgICAgZnJvbSB0aGUgVGNsIGFuZCBUY2w4IG1vZHVsZXMuCgoxMC8yNi85OTogUmVtb3ZlZCB1bnVzZWQgdmFyaWFibGUgZnJvbSBweXRob24vdHlwZW1hcHMuaS4gIFBhdGNoCiAgICAgICAgICBjb250cmlidXRlZCBieSBLZWl0aCBEYXZpZHNvbi4KCjgvMTYvOTkgOiBBZGRlZCBfV0lOMzIgc3ltYm9sIHRvIGxpYnJhcmllcyB0byBiZXR0ZXIgc3VwcG9ydCBXaW5kb3dzLgoKOC8xNi85OSA6IERlcHJlY2F0ZWQgdGhlIFBlcmw0IG1vZHVsZS4gICBJdCBpcyBubyBsb25nZXIgaW5jbHVkZWQgaW4gdGhlCiAgICAgICAgICBkaXN0cmlidXRpb24gYW5kIG5vIGxvbmdlciBzdXBwb3J0ZWQuICBJbiB0aGUgZW50aXJlIDMgeWVhcnMgU1dJRwogICAgICAgICAgaGFzIGJlZW4gYXJvdW5kIEkgbmV2ZXIgcmVjZWl2ZWQgYSBzaW5nbGUgY29tbWVudCBhYm91dCBpdCBzbyBJJ20KICAgICAgICAgIGFzc3VtaW5nIG5vIG9uZSB3aWxsIG1pc3MgaXQuLi4KCjgvMTYvOTkgOiBNb2RpZmllZCB0aGUgdHlwZS1jaGVja2luZyBjb2RlIHRvIHJlZ2lzdGVyIHR5cGUgbWFwcGluZ3MgdXNpbmcgYQogICAgICAgICAgdGFibGUgaW5zdGVhZCBvZiByZXBlYXRlZCBjYWxscyB0byBTV0lHX1JlZ2lzdGVyTWFwcGluZygpLiAgVGhpcwogICAgICAgICAgcmVkdWNlcyB0aGUgc2l6ZSBvZiB0aGUgbW9kdWxlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIHNvbWV3aGF0LgoKOC8xNS85OSA6IENsZWFuZWQgdXAgdGhlIHBvaW50ZXIgdHlwZS1jaGVja2luZyBjb2RlIGluIHRoZSBUY2wgbW9kdWxlLgoKOC8xNS85OSA6IE1hbnkgY2hhbmdlcyB0byB0aGUgbGlicmFyaWVzIHRvIHN1cHBvcnQgcnVudGltZSBsaWJyYXJpZXMuCgo4LzEzLzk5IDogRWxpbWluYXRlZCBDKysgY29tcGlsZXIgd2FybmluZyBtZXNzYWdlcyBhYm91dCBleHRlcm4gIkMiIGxpbmthZ2UuCgo4LzEzLzk5IDogU29tZSBjbGVhbnVwIG9mIFB5dGhvbiAuc3dnIGZpbGVzIHRvIGJldHRlciBzdXBwb3J0IHJ1bnRpbWUgbGlicmFyaWVzCiAgICAgICAgICBvbiBXaW5kb3dzLgoKOC8xMy85OSA6IE1vZGlmaWVkIHRoZSAlcHJhZ21hIGRpcmVjdGl2ZSB0byBhdHRhY2ggcHJhZ21hcyBkZWNsYXJlZCBpbnNpZGUKICAgICAgICAgIGEgY2xhc3MgZGVmaW5pdGlvbiB0byB0aGUgY2xhc3MgaXRzZWxmLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGNsYXNzIGZvbyB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgJXByYWdtYShweXRob24pIGFkZHRvbWV0aG9kID0gImluc2VydDpwcmludCBgaGVsbG8gd29ybGQnIgogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgTW9zdCBwZW9wbGUgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCBob3cgdGhpcyB3b3Jrcy4gIEZvciBwZW9wbGUKICAgICAgICAgIHdyaXRpbmcgYmFja2VuZCBtb2R1bGVzLCBjbGFzcy1iYXNlZCBwcmFnbWFzIHdvcmsgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICBsYW5nLT5jcHBfb3Blbl9jbGFzcygpICAgICAgICAgICAgIC8vIE9wZW4gYSBjbGFzcwogICAgICAgICAgICAgIGxhbmctPmNwcF9wcmFnbWEoKSAgICAgICAgICAgICAgICAgLy8gU3VwcGx5IHByYWdtYXMKICAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVtaXQgbWVtYmVycwoKICAgICAgICAgICAgICBsYW5nLT5jcHBfY2xvc2VfY2xhc3MoKSAgICAgICAgICAgIC8vIENsb3NlIHRoZSBjbGFzcwoKICAgICAgICAgIEFsbCBvZiB0aGUgcHJhZ21hcyBhcmUgcGFzc2VkIGZpcnN0IHNpbmNlIHRoZXkgbWlnaHQgYmUgdXNlZCB0bwogICAgICAgICAgYWZmZWN0IHRoZSBjb2RlIGdlbmVyYXRpb24gb2Ygb3RoZXIgbWVtYmVycy4gICBQbGVhc2Ugc2VlCiAgICAgICAgICB0aGUgUHl0aG9uIG1vZHVsZSBmb3IgYW4gZXhhbXBsZS4gICBQYXRjaGVzIGNvbnRyaWJ1dGVkCiAgICAgICAgICBieSBSb2JpbiBEdW5uLgoKOC8xMy85OSA6IFBhdGNoIHRvIFB5dGhvbiBzaGFkb3cgY2xhc3NlcyB0byBlbGltaW5hdGUgaWdub3JlZAogICAgICAgICAgZXhjZXB0aW9uIGVycm9ycyBpbiBkZXN0cnVjdG9ycy4gIFBhdGNoIGNvbnRyaWJ1dGVkCiAgICAgICAgICBieSBSb2JpbiBEdW5uLgoKOC8xMS85OSA6IE1pbm9yIHBhdGNoIHRvIHN3aWdfbGliL3B5dGhvbi9zd2lncHRyLnN3ZyAgKGFkZGVkIFNXSUdTVEFUSUMKICAgICAgICAgIGRlY2xhcmF0aW9uKS4gIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IEx5bGUgSm9obnNvbi4KCjgvMTEvOTkgOiBBZGRlZCBGSVJTVEtFWS9ORVhUS0VZIG1ldGhvZHMgdG8gUGVybDUgc2hhZG93IGNsYXNzZXMKICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IERlbm5pcyBNYXJzYS4KCjgvMTEvOTkgOiBNb2RpZmllZCBQeXRob24gbW9kdWxlIHNvIHRoYXQgTlVMTCBwb2ludGVycyBhcmUgcmV0dXJuZWQKICAgICAgICAgIGFuZCBwYXNzZWQgYXMgJ05vbmUuJyAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgVGFsIFNoYWxpZi4KCjgvMTAvOTkgOiBGaXhlZCBtaXNzaW5nICdpbnQnIHNwZWNpZmllcnMgaW4gdmFyaW91cyBwbGFjZXMuCgo4LzEwLzk5IDogQWRkZWQgV2luZG93cyBtYWtlZmlsZSBmb3IgUnVudGltZSBsaWJyYXJpZXMuICBDb250cmlidXRlZAogICAgICAgICAgYnkgQm9iIFRlY2hlbnRpbi4KCjgvMTAvOTkgOiBGaXhlZCBtaW5vciBwcm9ibGVtIGluIFB5dGhvbiBydW50aW1lIG1ha2VmaWxlIGludHJvZHVjZWQKICAgICAgICAgIGJ5IGtleXdvcmQgYXJndW1lbnRzLgoKOC84Lzk5ICA6IENoYW5nZWQgJHRhcmdldCBvZiBwZXJsNShvdXQpIHR5cGVtYXAgZnJvbSBTVCgwKSB0bwogICAgICAgICAgU1QoYXJndmkpLiAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgR2VvZmZyZXkgSG9ydC4KCjgvOC85OSAgOiBGaXhlZCBidWcgaW4gdHlwZW1hcCBjaGVja2luZyByZWxhdGVkIHRvIHRoZSBBTlkga2V5d29yZAogICAgICAgICAgaW4gYXJyYXlzIGFuZCBpZ25vcmVkIGFyZ3VtZW50cy4gIEVycm9yIHJlcG9ydGVkIGJ5CiAgICAgICAgICBHZW9mZnJleSBIb3J0LgoKOC84Lzk5ICA6ICVlbmFibGVkb2MgYW5kICVkaXNhYmxlZG9jIGRpcmVjdGl2ZXMgY2FuIG5vdyBiZSB1c2VkCiAgICAgICAgICBpbnNpZGUgY2xhc3Mvc3RydWN0dXJlIGRlZmluaXRpb25zLiAgIEhvd2V2ZXIsIG5vIGNoZWNrCiAgICAgICAgICBpcyBtYWRlIHRvIHNlZSBpZiB0aGV5IGFyZSBiYWxhbmNlZCAoaS5lLiwgYSAlZGlzYWJsZWRvYwogICAgICAgICAgZGlyZWN0aXZlIGluc2lkZSBhIGNsYXNzIGRvZXMgbm90IGhhdmUgdG8gaGF2ZSBhIG1hdGNoaW5nCiAgICAgICAgICAlZW5hYmxlZG9jIGluIHRoZSBzYW1lIGNsYXNzKS4KCjgvOC85OSAgOiBLZXl3b3JkIGFyZ3VtZW50IGhhbmRsaW5nIGlzIG5vdyBzdXBwb3J0ZWQgaW4gdGhlIFB5dGhvbgogICAgICAgICAgbW9kdWxlLiAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgaW50IGZvbyhjaGFyICpiYXIsIGludCBzcGFtLCBkb3VibGUgeCk7CgogICAgICAgICAgQ2FuIGJlIGNhbGxlZCBmcm9tIFB5dGhvbiBhcwoKICAgICAgICAgICAgICAgZm9vKHggPSAzLjQsIGJhcj0iaGVsbG8iLCBzcGFtPTQyKQoKICAgICAgICAgIFRvIGVuYWJsZSB0aGlzIGZlYXR1cmUsIHJ1biBTV0lHIHdpdGggdGhlICcta2V5d29yZCcgY29tbWFuZAogICAgICAgICAgbGluZSBvcHRpb24uICAgIE1peGluZyBrZXl3b3JkIGFuZCBkZWZhdWx0IGFyZ3VtZW50cwogICAgICAgICAgc2hvdWxkIHdvcmsgYXMgd2VsbC4gICBVbm5hbWVkIGFyZ3VtZW50cyBhcmUgYXNzaWduZWQgbmFtZXMKICAgICAgICAgIHN1Y2ggYXMgImFyZzEiLCAiYXJnMiIsIGV0Yy4uLgoKICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgRnVuY3Rpb25zIHdpdGggZHVwbGljYXRlIGFyZ3VtZW50IG5hbWVzIHN1Y2ggYXMKICAgICAgICAgIGJhcihpbnQgKk9VVFBVVCwgaW50ICpPVVRQVVQpIHdpbGwgbGlrZWx5IGNhdXNlIHByb2JsZW1hdGljCiAgICAgICAgICB3cmFwcGVyIGNvZGUgdG8gYmUgZ2VuZXJhdGVkLiAgIFRvIGZpeCB0aGlzLCAgdXNlIGRpZmZlcmVudAogICAgICAgICAgbmFtZXMgb3IgdXNlICVhcHBseSB0byBtYXAgdHlwZW1hcHMgdG8gYWx0ZXJuYXRlIG5hbWVzLgoKOC84Lzk5ICA6IEhhbmRsaW5nIG9mIHRoZSAndGhpcycgcG9pbnRlciBoYXMgYmVlbiBjaGFuZ2VkIGluIFB5dGhvbiBzaGFkb3cKICAgICAgICAgIGNsYXNzZXMuICBQcmV2aW91c2x5LCBkZXJlZmVyZW5jaW5nIG9mICcudGhpcycgb2NjdXJyZWQgaW4gdGhlCiAgICAgICAgICBQeXRob24gc2hhZG93IGNsYXNzIGl0c2VsZi4gICBOb3csIHRoaXMgc3RlcCBvY2N1cnMgaW4gdGhlIEMKICAgICAgICAgIHdyYXBwZXJzIHVzaW5nIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb246CgogICAgICAgICAgICAgICAgU1dJR19HZXRQdHJPYmooUHlPYmplY3QgKiwgdm9pZCAqKnB0ciwgY2hhciAqdHlwZSkKCiAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBhY2NlcHQgZWl0aGVyIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBwb2ludGVyCiAgICAgICAgICBvciBhIHNoYWRvdyBjbGFzcyBpbnN0YW5jZSB3aXRoIGEgJy50aGlzJyBhdHRyaWJ1dGUgb2YKICAgICAgICAgIGFwcHJvcHJpYXRlIHR5cGUuICBUaGlzIGNoYW5nZSBhbGxvd3MgdGhlIGZvbGxvd2luZzoKCiAgICAgICAgICAxLiAgVGhlIHJlYWwgc2hhZG93IGNsYXNzIGluc3RhbmNlIGZvciBhbiBvYmplY3QgaXMKICAgICAgICAgICAgICBwYXNzZWQgdG8gdGhlIEMgd3JhcHBlcnMgd2hlcmUgaXQgY2FuIGJlIGV4YW1pbmVkL21vZGlmaWVkCiAgICAgICAgICAgICAgYnkgdHlwZW1hcHMuCgogICAgICAgICAgMi4gIEhhbmRsaW5nIG9mIGRlZmF1bHQva2V5d29yZCBhcmd1bWVudHMgaXMgbm93IGdyZWF0bHkKICAgICAgICAgICAgICBzaW1wbGlmaWVkLgoKICAgICAgICAgIDMuICBUaGUgUHl0aG9uIHdyYXBwZXIgY29kZSBpcyBtdWNoIG1vcmUgc2ltcGxlLgoKICAgICAgICAgIFBsdXMsIGl0IGVsaW1pbmF0ZWQgbW9yZSB0aGFuIDMwMCBsaW5lcyBvZiBDKysgY29kZSBpbiB0aGUKICAgICAgICAgIFB5dGhvbiBtb2R1bGUuCgogICAgICAgICAgKioqIENBVkVBVCA6IFRoaXMgcmVxdWlyZXMgdGhlIGFic3RyYWN0IG9iamVjdCBpbnRlcmZhY2UuCiAgICAgICAgICBJdCBzaG91bGQgd29yayB3aXRoIFB5dGhvbiAxLjQsIGJ1dCBwcm9iYWJseSBub3RoaW5nIG9sZGVyCiAgICAgICAgICB0aGFuIHRoYXQuCgoKOC84Lzk5ICA6IEZpeGVkIGhhbmRsaW5nIG9mICJjb25zdCIgYW5kIHBvaW50ZXJzIGluIGNsYXNzZXMuICBJbiBwYXJ0aWN1bGFyLAogICAgICAgICAgZGVjbGFyYXRpb25zIHN1Y2ggYXMKCiAgICAgICAgICAgY2xhc3MgZm9vIHsKICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgY29uc3QgY2hhciAqbXNnOwogICAgICAgICAgICAgY29uc3QgaW50ICAqaXB0cjsKICAgICAgICAgIH0KCiAgICAgICAgICBhcmUgaGFuZGxlZCBhcyBhc3NpZ25hYmxlIHZhcmlhYmxlcyBhcyBvcHBvc2VkIHRvIGNvbnN0YW50CiAgICAgICAgICB2YWx1ZXMgKHRoaXMgaXMgdGhlIGNvcnJlY3QgYmVoYXZpb3IgaW4gQy9DKyspLiAgIE5vdGU6CiAgICAgICAgICBkZWNsYXJhdGlvbnMgc3VjaCBhcyAiY2hhciAqY29uc3QgbXNnIiBhcmUgc3RpbGwgdW5zdXBwb3J0ZWQuCiAgICAgICAgICBDb25zdGFudHMgZGVjbGFyZWQgYXQgdGhlIGdsb2JhbCBsZXZlbCB1c2luZyBjb25zdCBhcmUgYWxzbwogICAgICAgICAgYnJva2VuIChiZWNhdXNlIEkgaGF2ZSBhIG51bWJlciBvZiBpbnRlcmZhY2VzIHRoYXQgcmVseSB1cG9uCiAgICAgICAgICB0aGlzIGJlaGF2aW9yKS4KCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiogIFRoaXMgbWF5IGJyZWFrIGludGVyZmFjZXMgdGhhdAogICAgICAgICAgbWlzdGFrZW5seSB0cmVhdCAnY29uc3QgY2hhciAqJyB0eXBlcyBhcyBjb25zdGFudCB2YWx1ZXMuCgo4LzgvOTkgIDogTW9kaWZpZWQgdGhlIHBhcnNlciB0byBzdXBwb3J0IGJpdC1maWVsZHMuICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgIHR5cGVkZWYgc3RydWN0IHsKICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaXNfa2V5d29yZCA6IDE7CiAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGlzX2V4dGVybiAgOiAxOwogICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpc19zdGF0aWMgIDogMTsKICAgICAgICAgIH0gZmxhZ3M7CgogICAgICAgICAgQml0LWZpZWxkcyBjYW4gb25seSBiZSBhcHBsaWVkIHRvIGludGVnZXIgdHlwZXMgYW5kIHRoZWlyCiAgICAgICAgICBhcmUgb3RoZXIgcmVzdHJpY3Rpb25zLiAgU1dJRyBwZXJmb3JtcyBubyBzdWNoIHR5cGUtY2hlY2tpbmcKICAgICAgICAgIChhbHRob3VnaCB0aGUgQyBjb21waWxlciB3aWxsIGNhdGNoIHByb2JsZW1zIHdoZW4gaXQgdHJpZXMgdG8KICAgICAgICAgIGNvbXBpbGUgdGhlIHdyYXBwZXIgY29kZSkuCgo4LzgvOTkgIDogUmVtb3ZlZCB0cmFpbGluZyBzcGFjZSBvZiAkYmFzZXR5cGUgc3Vic3RpdHV0aW9uIGluIHR5cGVtYXBzLgogICAgICAgICAgVGhpcyBpcyB0byBhbGxvdyB0aGluZ3MgbGlrZSB0aGlzOgoKICAgICAgICAgICV0eXBlbWFwKHB5dGhvbiwgYXJnb3V0KSBzcGFtKiogT1VUUFVUewogICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIGNoYXIqIGEgPSAiJGJhc2V0eXBlX3AiOwogICAgICAgICAgICAgIC4uLgogICAgICAgICAgfQoKICAgICAgICAgIChQYXRjaCBzdWdnZXN0ZWQgYnkgTmF0aGFuIER1bmZpZWxkKS4KCjYvMjIvOTkgOiBNYWRlIGEgdmVyeSBzbGlnaHQgdHdlYWsgdG8gdGhlIFBlcmw1IHNoYWRvdyBjbGFzcwogICAgICAgICAgY29kZSB0aGF0IGFsbG93cyB0eXBlbWFwcyB0byBhbHRlciB0aGUgcmV0dXJuIHR5cGUKICAgICAgICAgIG9mIG9iamVjdHMgKHRvIHN1cHBvcnQgcG9seW1vcnBoaWMgdHlwZXMpLiAgUGF0Y2gKICAgICAgICAgIGNvbnRyaWJ1dGVkIGJ5IERyYWtlIERpZWRyaWNoLgoKNC84Lzk5ICA6IEZpeGVkIG51bGwgcG9pbnRlciBoYW5kbGluZyBidWcgaW4gUGVybCBtb2R1bGUuCiAgICAgICAgICBQYXRjaCBjb250cmlidXRlZCBieSBKdW5pbyBIYW1hbm8uCgozLzE3Lzk5IDogRml4ZWQgYnVnIGluIHBlcmw1cHRyLnN3ZyBmb3IgQWN0aXZlU3RhdGUgUGVybC4KICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IEdyZWcgQW5kZXJzb24uCgoyLzI3Lzk5IDogRWxpbWluYXRlZCBzZWdtZW50YXRpb24gZmF1bHQgd2hlbiBTd2lnIHJ1bnMgb24KICAgICAgICAgIGVtcHR5IGZpbGVzLgoKMi8yNy85OSA6IEFkZGVkIHBhdGNoIHRvIEd1aWxlIG1vZHVsZSB0byBlbGltaW5hdGUgdW51c2VkCiAgICAgICAgICB2YXJpYWJsZXMuICAgQ29udHJpYnV0ZWQgYnkgTWlrZSBTaW1vbnMuCgoyLzI3Lzk5IDogRml4ZWQgcHJvYmxlbSB3aXRoICVhZGRtZXRob2RzIHJldHVybmluZyByZWZlcmVuY2VzLgoKMi8yNy85OSA6IEZpeGVkIFJ1bnRpbWUvTWFrZWZpbGUuIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5CiAgICAgICAgICBNaWtlIFJvbWJlcmcuCgoyLzI3Lzk5IDogSW5jb3Jwb3JhdGVkIHBhdGNoZXMgdG8gdGhlIHR5cGUtY2hlY2tlci4KCjIvMjcvOTkgOiBGaXhlZCBwcm9ibGVtIHdpdGggLWV4cG9ydGFsbCBzd2l0Y2ggYW5kIHNoYWRvdyBjbGFzc2VzCiAgICAgICAgICBpbiBQZXJsNSBtb2R1bGUuICBQYXRjaCBjb250cmlidXRlZCBieSBEZW5uaXMgTWFyc2EuCgoyLzI3Lzk5IDogTW9kaWZpZWQgUGVybDUgbW9kdWxlIHRvIHJlY29nbml6ZSAndW5kZWYnIGFzIGEgTlVMTCBjaGFyICouCiAgICAgICAgICBQYXRjaCBjb250cmlidXRlZCBieSBKdW5pbyBIYW1hbm8uCgoyLzI3Lzk5IDogRml4ZWQgdGhlIFBlcmw1IG1vZHVsZSB0byBzdXBwb3J0IHRoZSBuZXdlciB2ZXJzaW9ucyBvZgogICAgICAgICAgQWN0aXZlU3RhdGUgUGVybCBmb3IgV2luMzIuCgoyLzI3Lzk5IDogRml4ZWQgdGhlIGluY2x1ZGUgb3JkZXIgb2YgZmlsZXMgc3BlY2lmaWVkIHdpdGggdGhlCiAgICAgICAgICAtSSBvcHRpb24uCgoyLzUvOTgtIDogRGF2ZSBmaW5pc2hlcyBoaXMgZGlzc2VydGF0aW9uLCBnb2VzIGpvYiBodW50aW5nLCBtb3ZlcyB0bwoyLzUvOTkgICAgQ2hpY2FnbyBhbmQgZ2VuZXJhbGx5IHRocmFzaGVzIGFib3V0LgoKVmVyc2lvbiAxLjEgUGF0Y2ggNSAoRmVicnVhcnkgNSwgMTk5OCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIvNC85OCAgOiBGaXhlZCBhIGJ1ZyBpbiB0aGUgY29uZmlndXJlIHNjcmlwdCB3aGVuIGRpZmZlcmVudCBwYWNrYWdlCiAgICAgICAgICBsb2NhdGlvbnMgYXJlIHNwZWNpZmllZCAoLS13aXRoLXRjbGluY2wsIGV0Yy4uLikuCgoyLzIvOTggIDogRml4ZWQgbmFtZS1jbGFzaCBidWcgcmVsYXRlZCB0byB0aGUgc3dpdGNoIHRvIEMgbWFjcm9zIGZvciBhY2Nlc3NvcgogICAgICAgICAgZnVuY3Rpb25zLiAgVGhlIG5ldyBzY2hlbWUgZGlkIG5vdCB3b3JrIGNvcnJlY3RseSBmb3Igb2JqZWN0cwogICAgICAgICAgd2l0aCBtZW1iZXJzIHN1Y2ggYXMgJ29iaicsICd2YWwnLCBldGMuLi4gICBGaXhlZCB0aGUgYnVnIGJ5CiAgICAgICAgICBhcHBlbmRpbmcgdGhlIHdvcmQgJ3N3aWcnIHRvIG1hY3JvIGFyZ3VtZW50IG5hbWVzLiAgUGF0Y2gKICAgICAgICAgIGNvbnRyaWJ1dGVkIGJ5IFJ1ZHkgQWxiYWNodGVuLgoKMi8yLzk4ICA6IFNsaWdodCBmaXggdG8gdGhlIFBlcmw1IG1vZHVsZSB0byBlbGltaW5hdGUgd2FybmluZyBtZXNzYWdlcwogICAgICAgICAgYWJvdXQgJ3Zhcm5hbWUgdXNlZCBvbmx5IG9uY2UgOiBwb3NzaWJsZSB0eXBvJy4gIEZpeAogICAgICAgICAgY29udHJpYnV0ZWQgYnkgUnVkeSBBbGJhY2h0ZW4uCgoxLzkvOTggIDogRml4ZWQgYSBidWcgaW4gdGhlIFBlcmwgNSBtb2R1bGUgcmVsYXRlZCB0byB0aGUgY3JlYXRpb24gb2YKICAgICAgICAgIGNvbnN0YW50cyBhbmQgc2hhZG93IGNsYXNzZXMuCgoxLzkvOTggIDogRml4ZWQgbGlua2luZyBidWcgd2l0aCBQeXRob24gMS41IGVtYmVkLmkgbGlicmFyeSBmaWxlLgoKVmVyc2lvbiAxLjEgUGF0Y2ggNCAoSmFudWFyeSA0LCAxOTk4KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxLzQvOTggIDogQ2hhbmdlZCBzdHJ1Y3R1cmVkIG9mIHRoZSBFeGFtcGxlcyBkaXJlY3RvcnkgdG8gYmUgbW9yZSBmcmllbmRseQogICAgICAgICAgdG8gQm9ybGFuZCBDKysuCgoxLzQvOTggIDogQWRkZWQgdGhlIGZ1bmN0aW9uIE1ha2VmaWxlLndpbi5iYyBmb3IgY29tcGlsaW5nIHRoZSBleGFtcGxlcwogICAgICAgICAgdW5kZXIgQm9ybGFuZCA1LjIuCgoxLzQvOTggIDogU2xpZ2h0IGNoYW5nZSB0byB0aGUgcGVybDUgbW9kdWxlIGFuZCBDKysgY29tcGlsYXRpb24uICBUaGUKICAgICAgICAgIDxtYXRoLmg+IGxpYnJhcnkgaXMgbm93IGluY2x1ZGVkIGJlZm9yZSBhbnkgUGVybCBoZWFkZXJzCiAgICAgICAgICBiZWNhdXNlIFBlcmwgdGhlIGV4dGVybiAiQyIgbGlua2FnZSBvZiBtYXRoLmggc2NyZXdzIGFsb3QKICAgICAgICAgIG9mIHRoaW5ncyB1cCAoZXNwZWNpYWxseSBvbiBXaW5kb3dzKS4KCjEvMi85OCAgOiBDaGFuZ2UgdG8gdGhlIFB5dGhvbiBtb2R1bGUgdGhhdCByZWR1Y2VzIHRoZSBudW1iZXIgb2YgY29uc3RhbnRzCiAgICAgICAgICBjcmVhdGVkIGJ5IEMrKyBjbGFzc2VzLCBpbmhlcml0YW5jZSwgYW5kIHNoYWRvdyBjbGFzc2VzLiAgIFRoaXMKICAgICAgICAgIG1vZGlmaWNhdGlvbiBtYXkgaW50cm9kdWNlIGEgZmV3IHNsaWdodCBpbmNvbXBhdGliaWxpdGllcyBpZgogICAgICAgICAgeW91IGF0dGVtcHQgdG8gdXNlIHRoZSBub24tc2hhZG93IGNsYXNzIGludGVyZmFjZSB3aXRoIHNoYWRvdwogICAgICAgICAgY2xhc3NlcyBlbmFibGVkLiAgICBQYXRjaCBjb250cmlidXRlZCBieSBNaWtlIFJvbWJlcmcuCgoxLzIvOTggIDogU3VwcG9ydCBmb3IgVGNsIDguMCBuYW1lc3BhY2VzIGhhcyBiZWVuIGFkZGVkLiAgIFRoaXMgKnJlcGxhY2VzKgogICAgICAgICAgdGhlIG9yaWdpbmFsIFNXSUcgbWVjaGFuaXNtIHRoYXQgYXNzdW1lZCBbaW5jciBUY2xdIG5hbWVzcGFjZXMuCiAgICAgICAgICBUbyB1c2UgbmFtZXNwYWNlcywgc2ltcGx5IHJ1biBTV0lHIHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zCgogICAgICAgICAgICAgc3dpZyAtdGNsIC1uYW1lc3BhY2UgIGZvby5pCgogICAgICAgICAgICAgICAgICAgIFRoaXMgcGxhY2VzIGV2ZXJ5dGhpbmcgaW4gYSBuYW1lc3BhY2UgdGhhdCBtYXRjaGVzCiAgICAgICAgICAgICAgICAgICAgdGhlIG1vZHVsZSBuYW1lCgogICAgICAgICAgICAgc3dpZyAtdGNsIC1uYW1lc3BhY2UgLXByZWZpeCBiYXIgZm9vLmkKCiAgICAgICAgICAgICAgICAgICAgVGhpcyBwbGFjZXMgZXZlcnl0aGluZyBpbiB0aGUgbmFtZXNwYWNlICdiYXInCgogICAgICAgICAgVGhlIHVzZSBvZiBuYW1lc3BhY2VzIGlzIG5ldyBpbiBUY2wgOC4wLiAgSG93ZXZlciwgdGhlIHdyYXBwZXIgY29kZQogICAgICAgICAgZ2VuZXJhdGVkIGJ5IFNXSUcgd2lsbCBzdGlsbCB3b3JrIHdpdGggYWxsIHZlcnNpb25zIG9mIFRjbCBuZXdlcgogICAgICAgICAgdGhhbiBhbmQgaW5jbHVkaW5nIFRjbCA3LjMvVGszLjYgZXZlbiBpZiB0aGUgLW5hbWVzcGFjZSBvcHRpb24gaXMKICAgICAgICAgIHVzZWQuCgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICBUaGlzIGNoYW5nZSBtYXkgYnJlYWsgZXhpc3RpbmcgYXBwbGljYXRpb25zIHRoYXQgcmVsaWVkIG9uIHRoZQogICAgICAgICAgLXByZWZpeCBhbmQgLW5hbWVzcGFjZSBvcHRpb25zLgoKMS8yLzk4ICA6IEFkZGVkIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzIHRvIHRoZSBUY2wgd3JhcHBlciBjb2RlCgogICAgICAgICAgICAgICAgIFNXSUdfbmFtZSAgICAgIC0gTmFtZSBvZiB0aGUgU1dJRyBtb2R1bGUKICAgICAgICAgICAgICAgICBTV0lHX3ByZWZpeCAgICAtIFByZWZpeC9uYW1lc3BhY2UgYXBwZW5kZWQgdG8gY29tbWFuZCBuYW1lcwogICAgICAgICAgICAgICAgIFNXSUdfbmFtZXNwYWNlIC0gTmFtZSBvZiB0aGUgbmFtZXNwYWNlCgogICAgICAgICAgU1dJRyBsaWJyYXJ5IHdyaXRlcnMgY2FuIHVzZSB0aGVzZSB0byB0aGVpciBhZHZhbnRhZ2VzLgoKMS8yLzk4ICA6IEZpeGVkIGEgYnVnIGluIHRoZSBUY2w4IG1vZHVsZSByZWxhdGVkIHRvIHRoZSBjcmVhdGlvbiBvZgogICAgICAgICAgcG9pbnRlciBjb25zdGFudHMgKHRoZSBmdW5jdGlvbiBTV0lHX01ha2VQdHIgd2FzIG1pc3NpbmcgZnJvbQogICAgICAgICAgdGhlIHdyYXBwZXIgY29kZSkuCgoxLzIvOTggIDogQWRkZWQgdGhlIGNvbnN0aGFzaC5pIGxpYnJhcnkgZmlsZSB0byB0aGUgVGNsIGFuZCBUY2w4IG1vZHVsZXMuCgoxLzEvOTggIDogQ2hhbmdlZCBhbmQgY2xlYW5lZCB1cCB0aGUgUHl0aG9uIHR5cGVtYXBzLmkgZmlsZS4gICBUaGUgZm9sbG93aW5nCiAgICAgICAgICBzaWduaWZpY2FudCBjaGFuZ2VzIHdlcmUgbWFkZSA6CgogICAgICAgICAgICAgICAgMS4gIFRoZSBPVVRQVVQgdHlwZW1hcCBub3cgcmV0dXJucyBQeXRob24gdHVwbGVzIGluc3RlYWQgb2YKICAgICAgICAgICAgICAgICAgICBsaXN0cy4gICBMaXN0cyBjYW4gYmUgcmV0dXJuZWQgYXMgYmVmb3JlIGJ5IHVzaW5nIHRoZQogICAgICAgICAgICAgICAgICAgIExfT1VUUFVUIHR5cGUuICAgIElmIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciB2ZXJzaW9ucwogICAgICAgICAgICAgICAgICAgIGlzIG5lZWRlZCwgcnVuIFNXSUcgd2l0aCB0aGUgLURPVVRQVVRfTElTVCBvcHRpb24uCgogICAgICAgICAgICAgICAgMi4gIFRoZSBCT1RIIHR5cGVtYXAgaGFzIGJlZW4gcmVuYW1lZCB0byBJTk9VVC4gIEZvciBiYWNrd2FyZHMKICAgICAgICAgICAgICAgICAgICBjb21wYXRpYmlsaXR5LCB0aGUgIkJPVEgiIG1ldGhvZCBzdGlsbCBleGlzdHMgaG93ZXZlci4KCiAgICAgICAgICAgICAgICAzLiAgT3V0cHV0IHR5cGVtYXBzIG5vdyBnZW5lcmF0ZSBsZXNzIGNvZGUgdGhhbiBiZWZvcmUuCgogICAgICAgICAgQ2hhbmdlcyB0byB0eXBlbWFwcy5pIG1heSBicmVhayBleGlzdGluZyBQeXRob24gc2NyaXB0cyB0aGF0IGFzc3VtZQogICAgICAgICAgb3V0cHV0IGluIHRoZSBmb3JtIG9mIGEgbGlzdC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTIvMzEvOTc6IEZpeGVkIGxvbmcgb3ZlcmR1ZSBwcm9ibGVtcyB3aXRoIHRoZSB0ZXN0aW5nIHNjcmlwdHMgYW5kIGNlcnRhaW4KICAgICAgICAgIG1ha2VmaWxlcyB0aGF0IHJlcXVpcmVkIHRoZSB1c2Ugb2YgdGhlIGJhc2ggc2hlbGwuICAgRXZlcnl0aGluZyBzaG91bGQKICAgICAgICAgIHdvcmsgcHJvcGVybHkgd2l0aCB0aGUgc3RhbmRhcmQgQm91cm5lIHNoZWxsIChzaCkgbm93LgoKMTIvMzEvOTc6IE1vZGlmaWVkIHR5cGVtYXBzIHRvIGFsbG93ICRiYXNldHlwZSBhcyBhIHZhbGlkIGxvY2FsIHZhcmlhYmxlLgogICAgICAgICAgVGhpcyBhbGxvd3MgZm9yIGFsbCBzb3J0cyBvZiBiaXphcnJlIGhhY2tpc2ggdHlwZW1hcHMgdGhhdAogICAgICAgICAgZG8gY29vbCB0aGluZ3MuICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgRG9taW5pcXVlIER1bW9udC4KCjEyLzMxLzk3OiBTd2l0Y2hlZCBhY2Nlc3NvciBmdW5jdGlvbnMgZ2VuZXJhdGVkIGZvciBtZW1iZXIgZGF0YSB0bwogICAgICAgICAgQyBwcmVwcm9jZXNzb3IgbWFjcm9zIChleGNlcHQgaW4gY2FzZXMgaW52b2x2aW5nIHR5cGVtYXBzCiAgICAgICAgICBvciBjaGFyICopLgoKMTIvMzEvOTc6IEZpeGVkIGEgYnVnIHJlbGF0ZWQgdG8gQysrIG1lbWJlciBkYXRhIGludm9sdmluZyByZWZlcmVuY2VzLgoKMTIvMzEvOTc6IENoYW5nZWQgYWNjZXNzb3IgZnVuY3Rpb25zIGZvciBDKysgbWVtYmVyIGZ1bmN0aW9ucyB0bwogICAgICAgICAgcHJlcHJvY2Vzc29yIG1hY3Jvcy4gICBUaGlzIGNsZWFucyB1cCB0aGUgd3JhcHBlciBjb2RlCiAgICAgICAgICBhbmQgcmVzdWx0cyBpbiBmZXdlciBmdW5jdGlvbiBkZWZpbml0aW9ucy4KCjEyLzMxLzk3OiBDaGFuZ2VkIHRoZSBkZWZhdWx0IEMgY29uc3RydWN0b3IgdG8gdXNlIGNhbGxvYygpIGluc3RlYWQKICAgICAgICAgIG9mIG1hbGxvYygpCgoxMi8zMC85NzogQ2hhbmdlZCB0aGUgY3JlYXRpb24gb2YgY29uc3RhbnRzIGluIHRoZSBQZXJsNSBtb2R1bGUuCiAgICAgICAgICBGb3IgYWxsIHByYWN0aWNhbCBwdXJwb3NlcywgdGhleSBzaG91bGQgd29yayBpbiBleGFjdGx5IHRoZQogICAgICAgICAgc2FtZSB3YXkgYXMgYmVmb3JlIGV4Y2VwdCB0aGF0IHRoZXkgbm93IHJlcXVpcmUgbXVjaCBsZXNzCiAgICAgICAgICB3cmFwcGVyIGNvZGUuICAgTW9kdWxlcyBjb250YWluaW5nIGxhcmdlIG51bWJlcnMgb2YKICAgICAgICAgIGNvbnN0YW50cyBtYXkgc2VlIGdyZWF0ZXIgdGhhbiBhIDUwJSByZWR1Y3Rpb24gaW4gd3JhcHBlcgogICAgICAgICAgY29kZSBzaXplLgoKMTIvMzAvOTc6IE1vZGlmaWVkIHRoZSBQeXRob24gbW9kdWxlIHRvIGJlIG1vcmUgaW50ZWxsaWdlbnQgYWJvdXQgdGhlCiAgICAgICAgICBjcmVhdGlvbiBvZiBjb25zdGFudHMuICBTV0lHIG5vIGxvbmdlciBnZW5lcmF0ZXMgcmVkdW5kYW50CiAgICAgICAgICBnbG9iYWwgdmFyaWFibGVzIGFuZCB0aGUgc2l6ZSBvZiB0aGUgbW9kdWxlIGluaXRpYWxpemF0aW9uCiAgICAgICAgICBmdW5jdGlvbiBzaG91bGQgYmUgcmVkdWNlZC4gICAoTWFueSB0aGFua3MgdG8gSmltIEZ1bHRvbikuCgoxMi8yOS85NzogRml4ZWQgYSBidWcgaW4gQysrIGNvZGUgZ2VuZXJhdGlvbiByZWxhdGVkIHRvIG1lbWJlciBmdW5jdGlvbnMsCiAgICAgICAgICBkZWZhdWx0IGFyZ3VtZW50cywgYW5kIHJlZmVyZW5jZXMuCgoxMi8yOS85NzogRml4ZWQgY29uZmlndXJlIHNjcmlwdCBhbmQgYSBmZXcgbWFrZWZpbGVzIHRvIHN1cHBvcnQgUHl0aG9uIDEuNQoKMTIvMjkvOTc6IEFkZGVkICdlbWJlZDE1LmknIGxpYnJhcnkgZmlsZS4gIFRoaXMgZmlsZSBzaG91bGQgYmUgdXNlZCB0bwogICAgICAgICAgc3RhdGljYWxseSBsaW5rIHZlcnNpb25zIG9mIFB5dGhvbiAxLjUuICAgIFRvIG1ha2UgaXQgdGhlIGRlZmF1bHQsCiAgICAgICAgICBzaW1wbHkgY29weSAnc3dpZ19saWIvcHl0aG9uL2VtYmVkMTUuaScgdG8gJ3N3aWdfbGliL3B5dGhvbi9lbWJlZC5pJwoKVmVyc2lvbiAxLjEgUGF0Y2ggMyAoTm92ZW1iZXIgMjQsIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjExLzIzLzk3OiBGaXhlZCBhIGJ1ZyBpbiB0aGUgUGVybDUgbW9kdWxlIHdpdGggc2hhZG93IGNsYXNzZXMgYW5kCiAgICAgICAgICBzdGF0aWMgY2xhc3MgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIGNsYXNzIGluc3RhbmNlcy4KICAgICAgICAgIE5vdGUgOiBUaGUgZml4IGZvciB0aGlzIGJ1ZyByZXF1aXJlcyBhIHNsaWdodCByZXN0cnVjdHVyaW5nIG9mCiAgICAgICAgICBvZiB0aGUgLnBtIGZpbGVzIGNyZWF0ZWQgYnkgU1dJRy4KCjExLzIzLzk3OiBGaXhlZCBhIGJ1ZyBpbiB0aGUgVGNsL1RjbDggbW9kdWxlcyByZWxhdGVkIHRvIHZhcmlhYmxlIGxpbmtpbmcKICAgICAgICAgIG9mIGNoYXJhY3RlciBhcnJheXMuICBJZiB5b3UgZGVjbGFyZWQgYSBnbG9iYWwgdmFyaWFibGUgJ2NoYXIgZm9vWzEwXScsCiAgICAgICAgICB0aGUgZ2VuZXJhdGVkIHdyYXBwZXIgY29kZSB3b3VsZCBlaXRoZXIgY2F1c2UgYSBzZWdtZW50YXRpb24gZmF1bHQKICAgICAgICAgIGltbWVkaWF0ZWx5IHVwb24gbG9hZGluZyBvciB3ZWlyZCBtZW1vcnkgY29ycnVwdGlvbiBlbHNld2hlcmUuCiAgICAgICAgICBUaGlzIHNob3VsZCBub3cgYmUgZml4ZWQgYWx0aG91Z2ggY2hhcmFjdGVyIGFycmF5cyBjYW4gb25seSBiZQogICAgICAgICAgcmVhZC1vbmx5LgoKMTEvMjMvOTc6IEZpeGVkIGEgYnVnIHdpdGggdGhlICVpbXBvcnQgZGlyZWN0aXZlIHRoYXQgY2F1c2VkIGl0IHRvCiAgICAgICAgICBmYWlsIGlmIGZpbGVzIHdlcmUgaW1wb3J0ZWQgZnJvbSBkaXJlY3RvcmllcyBvdGhlciB0aGFuCiAgICAgICAgICB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KCjExLzIzLzk3OiBGaXhlZCBpbmNvcnJlY3QgZGlhZ25vc3RpYyBtZXNzYWdlIGluIHRoZSBBU0NJSSBkb2N1bWVudGF0aW9uCiAgICAgICAgICBtb2R1bGUuCgoxMS8yMy85NzogQ2hhbmdlZCB0aGUgYmVoYXZpb3Igb2YgdGhlIC1vIG9wdGlvbiB3aGVuIHVzZWQgd2l0aCBzaGFkb3cKICAgICAgICAgIGNsYXNzZXMuIElmIC1vIHdhcyB1c2VkIHRvIHNwZWNpZnkgYm90aCB0aGUgcGF0aG5hbWUgYW5kIGZpbGVuYW1lCiAgICAgICAgICBvZiBTV0lHJ3Mgb3V0cHV0IHN1Y2ggYXMKCiAgICAgICAgICAgICAgICAgc3dpZyAtbyAvaG9tZS9zd2lnL3dyYXBwZXIuYyAtc2hhZG93IC1wZXJsNSBmb28uaQoKICAgICAgICAgIFRoZSB3cmFwcGVyIGNvZGUgd291bGQgYmUgcGxhY2VkIHRoZSBmaWxlIHNwZWNpZmllZCB3aXRoIC1vLAogICAgICAgICAgYnV0IHRoZSAucG0gZmlsZSBhbmQgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZSBwbGFjZWQgaW4gdGhlCiAgICAgICAgICBkaXJlY3Rvcnkgd2hlcmUgU1dJRyB3YXMgcnVuLiAgIE5vdywgdGhlc2UgZmlsZXMgYXJlIHBsYWNlZAogICAgICAgICAgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBmaWxlIHNwZWNpZmllZCB3aXRoIHRoZSAtbyBvcHRpb24uCiAgICAgICAgICBUaGlzIGNoYW5nZSBpcyBhbHNvIG5lZWRlZCBmb3IgcHJvcGVyIG9wZXJhdGlvbiBvbiB0aGUKICAgICAgICAgIE1hY2ludG9zaC4KCjExLzIzLzk3OiBBZGRlZCBhICd0aGlzKCknIG1ldGhvZCB0byBQZXJsNSBzaGFkb3cgY2xhc3Nlcy4gICBUaGlzIGNhbgogICAgICAgICAgYmUgdXNlZCB0byByZXR1cm4gdGhlIG5vcm1hbCBwb2ludGVyIHZhbHVlIGZyb20gYSBzaGFkb3cKICAgICAgICAgIGNsYXNzIHRoYXQgaXMgcmVwcmVzZW50ZWQgYXMgYSB0aWVkIGhhc2guICAgVG8gdXNlIGp1c3QKICAgICAgICAgIGludm9rZSBhcyBhIG1ldGhvZCBsaWtlIHRoaXMgOgoKICAgICAgICAgICAgICAkbCA9IG5ldyBMaXN0OyAgICAgICAjIENyZWF0ZSBhbiBvYmplY3QKICAgICAgICAgICAgICAkcHRyID0gJGwtPnRoaXMoKTsgICAjIEdldCB0aGUgbm9ybWFsIHBvaW50ZXIgdmFsdWUKCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxMS8yMy85NzogRml4ZWQgdGhlIFRjbCA4IHBvaW50ZXIuaSBsaWJyYXJ5IGZpbGUgKHdoaWNoIHdhcyBjb21wbGV0ZWx5CiAgICAgICAgICBicm9rZW4gaW4gMS4xcDIpLgoKMTEvMjMvOTc6IE1vZGlmaWVkIHRoZSBQZXJsNSB0eXBlLWNoZWNrZXIgdG8gZml4IGEgZmV3IHByb2JsZW1zCiAgICAgICAgICB3aXRoIGdsb2JhbCB2YXJpYWJsZXMgb2YgcG9pbnRlciB0eXBlcyBhbmQgdG8gYWxsb3cKICAgICAgICAgIHRpZWQgaGFzaGVzIHRvIGJlIHVzZWQgaW50ZXJjaGFuZ2FibHkgd2l0aCBub3JtYWwKICAgICAgICAgIHBvaW50ZXIgdmFsdWVzLgoKMTEvMjMvOTc6IE1vZGlmaWVkIHRoZSB0eXBlbWFwIG1lY2hhbmlzbSB0byBhbGxvdyBvdXRwdXQKICAgICAgICAgIHR5cGVtYXBzIG9mIHR5cGUgJ3ZvaWQnLiAgIFRoZXNlIHdlcmUgaWdub3JlZCBwcmV2aW91c2x5LAogICAgICAgICAgYnV0IG5vdyBpZiB5b3Ugc3BlY2lmeSwKCiAgICAgICAgICAgICAgICAldHlwZW1hcChsYW5nLG91dCkgdm9pZCB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4gcmV0dXJuIGEgdm9pZCAuLi4KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBZb3UgY2FuIGNoYW5nZSBvciBhc3NpZ24gYSByZXR1cm4gdmFsdWUgdG8gdGhlIGZ1bmN0aW9uLgoKMTEvMjMvOTc6IEZpeGVkIHByb2Nlc3Npbmcgb2YgJ2Jvb2wnIGRhdGF0eXBlcyBpbiB0aGUgUHl0aG9uIG1vZHVsZS4KCjExLzIzLzk3OiBGaXhlZCBtaW5vciBwYXJzaW5nIGVycm9yIHdpdGggQysrIGluaXRpYWxpemVycy4gRm9yIGV4YW1wbGUsCgogICAgICAgICAgICAgICAgIGNsYXNzIEIgOiBwdWJsaWMgQSB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgIEIoKSA6IEEoKSB7IC4uLiB9OwogICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH0KCjExLzIzLzk3OiBGaXhlZCB0aGUgVGNsOCBtb2R1bGUgc28gdGhhdCBDIGZ1bmN0aW9ucyB0aGF0IGNhbGwgYmFjayBpbnRvCiAgICAgICAgICBUY2wgZG9uJ3QgY29ycnVwdCB0aGUgcmV0dXJuIHJlc3VsdCBvYmplY3QgKFNXSUcgd2FzIGdhdGhlcmluZwogICAgICAgICAgdGhlIHJlc3VsdCBvYmplY3QgdG9vIGVhcmx5IHdoaWNoIGxlYWRzIHRvIHByb2JsZW1zIGlmIHN1YnNlcXVlbnQKICAgICAgICAgIFRjbCBjYWxscyBhcmUgbWFkZSkuCgoxMS8yMy85NzogRml4ZWQgYSBjb2RlIGdlbmVyYXRpb24gYnVnIGluIHRoZSBQeXRob24gbW9kdWxlIHdoZW4gdHdvIG9yCiAgICAgICAgICBtb3JlIG91dHB1dCBwYXJhbWV0ZXJzIHdlcmUgdXNlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnRzIG9mIGEKICAgICAgICAgIGZ1bmN0aW9uLiAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAlaW5jbHVkZSB0eXBlbWFwcy5pCiAgICAgICAgICAgICAgICAgdm9pZCBmb28oZG91YmxlICpPVVRQVVQsIGRvdWJsZSAqT1VUUFVULCBkb3VibGUgYSk7CgogICAgICAgICAgUHJldmlvdXNseSwgZG9pbmcgdGhpcyByZXN1bHRlZCBpbiB0aGUgY3JlYXRpb24gb2YgYW4KICAgICAgICAgIGV4dHJhbmVvdXMgY29tbWEgaW4gdGhlIG91dHB1dCwgcmVzdWx0aW5nIGluIGEgQyBzeW50YXggZXJyb3IuCgoxMS8yMi85NzogRml4ZWQgYSBidWcgd2hlbiB0ZW1wbGF0ZSBoYW5kbGluZyB0aGF0IHdhcyBzdHJpcHBpbmcgd2hpdGVzcGFjZQogICAgICAgICAgYXJvdW5kIG5lc3RlZCB0ZW1wbGF0ZXMuICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICBGb288QmFyPGRvdWJsZT4gPgoKICAgICAgICAgIHdhcyBnZXR0aW5nIG11bmdlZCBpbnRvIEZvbzxCYXI+PiB3aGljaCBpcyBhIHN5bnRheCBlcnJvciBpbgogICAgICAgICAgaW4gdGhlIEMrKyBjb21waWxlci4KCjExLzIyLzk3OiBGaXhlZCBidWdzIGluIHRoZSBCb3JsYW5kIEMrKyBtYWtlZmlsZXMuCgoxMS8yMi85NzogRml4ZWQgbWVtb3J5IGNvcnJ1cHRpb24gYnVnIHdoZW4gcHJvY2Vzc2luZyBpbnRlZ2VyCiAgICAgICAgICBhcmd1bWVudHMgaW4gVGNsOCBtb2R1bGUuCgoxMS8yMS85NzogRml4ZWQgYSBidWcgaW4gdGhlIFJ1bnRpbWUvTWFrZWZpbGUgcmVsYXRlZCB0byBUY2wgOC4KCjExLzIxLzk3OiBGaXhlZCBhIGJ1ZyB3aXRoIHRoZSAlbmV3IGRpcmVjdGl2ZSBhbmQgUGVybDUgc2hhZG93IGNsYXNzZXMuCiAgICAgICAgICBObyBsb25nZXIgZ2VuZXJhdGVzIGEgcGVybCBzeW50YXggZXJyb3IuCgoxMS85Lzk3IDogQ2hhbmdlZCBhIHN0cm5jcHkoKSB0byBzdHJjcHkoKSBpbiB0aGUgcG9pbnRlciB0eXBlLWNoZWNrZXIuCiAgICAgICAgICBUaGlzIHJlc3VsdHMgaW4gYSBzdWJzdGFudGlhbCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBpbgogICAgICAgICAgdHlwZS1jaGVja2luZy4KCjEwLzI5Lzk3OiBGaXhlZCBhIGJ1ZyBpbiB0aGUgY29kZSBnZW5lcmF0aW9uIG9mIGRlZmF1bHQgYXJndW1lbnRzIGFuZAogICAgICAgICAgdXNlci1kZWZpbmVkIHR5cGVzLiAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICB2b2lkIGZvbyhWZWN0b3IgYSwgVmVjdG9yIGIgPSBkKTsKCiAgICAgICAgICBzaG91bGQgbm93IHdvcmsgcHJvcGVybHkuCgpWZXJzaW9uIDEuMSBQYXRjaCAyIChTZXB0ZW1iZXIgNCwgMTk5NykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo5LzQvOTcgIDogRml4ZWQgcHJvYmxlbSB3aXRoIGhhbmRsaW5nIG9mIHZpcnR1YWwgZnVuY3Rpb25zIHRoYXQKICAgICAgICAgIHdhcyBpbnRyb2R1Y2VkIGJ5IHNvbWUgY2hhbmdlcyBpbiB0aGUgQysrIG1vZHVsZS4KClZlcnNpb24gMS4xIFBhdGNoIDEgKEF1Z3VzdCAyNywgMTk5NykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKOC8yNi85NyA6IEZpeGVkIGNvbXBpbGF0aW9uIGFuZCBydW4tdGltZSBidWdzIHdpdGggVGNsIDguMCBmaW5hbC4KCjgvMjEvOTcgOiBGaXhlZCBjb2RlIGdlbmVyYXRpb24gYnVnIHdpdGggYXJyYXlzIGFwcGVhcmluZyBhcyBhcmd1bWVudHMKICAgICAgICAgIHRvIEMrKyBtZW1iZXIgZnVuY3Rpb25zLiAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICB2b2lkIEJhcihpbnQgYVsyMF1bMjBdKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgVGhlcmUgaXMgc3RpbGwgYSBidWcgdXNpbmcgYXJyYXlzIHdpdGggYWRkZWQgbWV0aG9kcwogICAgICAgICAgaG93ZXZlci4KCjgvMjAvOTcgOiBGaXhlZCBhIGJ1ZyB3aXRoIGdlbmVyYXRpbmcgdGhlIGNvZGUgZm9yIGFkZGVkIG1ldGhvZHMKICAgICAgICAgIGludm9sdmluZyBwYXNzLWJ5LXZhbHVlLgoKOC8xOS85NyA6IE1vZGlmaWVkIHRoZSB0eXBlbWFwcGVyIHRvIHN1YnN0aXR1dGUgdGhlICckYXJnJyB2YWx1ZQogICAgICAgICAgd2hlbiBkZWNsYXJpbmcgbG9jYWwgdmFyaWFibGVzLiAgICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBkb3VibGUgKiAoZG91YmxlIHRlbXBfJGFyZykgewogICAgICAgICAgICAgICAgICAgIC4uLiBkbyBzb21ldGhpbmcgLi4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgIFdoZW4gYXBwbGllZCB0byBhIHJlYWwgZnVuY3Rpb24gc3VjaCBhcyB0aGUgZm9sbG93aW5nIDoKCiAgICAgICAgICAgICAgdm9pZCBmb28oZG91YmxlICphLCBkb3VibGUgKmIsIGRvdWJsZSAqcmVzdWx0KTsKCiAgICAgICAgICB0aHJlZSBsb2NhbCB2YXJpYWJsZXMgd2lsbCBiZSBjcmVhdGVkIGFzIGZvbGxvd3MgOgoKICAgICAgICAgICAgICBkb3VibGUgdGVtcF9hOwogICAgICAgICAgICAgIGRvdWJsZSB0ZW1wX2I7CiAgICAgICAgICAgICAgZG91YmxlIHRlbXBfcmVzdWx0OwoKICAgICAgICAgIFRoaXMgY2FuIGJlIHVzZWQgd2hlbiB3cml0aW5nIG11bHRpcGxlIHR5cGVtYXBzIHRoYXQgbmVlZAogICAgICAgICAgdG8gYWNjZXNzIHRoZSBzYW1lIGxvY2FsIHZhcmlhYmxlcy4KCgo3LzI3Lzk3IDogRml4ZWQgYSB2YXJpZXR5IG9mIHByb2JsZW1zIHdpdGggdGhlICVhcHBseSBkaXJlY3RpdmUgYW5kIGFycmF5cy4KICAgICAgICAgIFRoZSBmb2xsb3dpbmcgdHlwZXMgb2YgZGVjbGFyYXRpb25zIHNob3VsZCBub3cgd29yayA6CgogICAgICAgICAgICAgICAlYXBwbHkgZG91YmxlIFtBTlldIHsgUmVhbCBbQU5ZXSB9OwogICAgICAgICAgICAgICAlYXBwbHkgZG91YmxlIFs0XSB7IGRvdWJsZSBbMTBdIH07CgogICAgICAgICAgQSBnZW5lcmljIHZlcnNpb24gb2YgYXBwbHkgbGlrZSB0aGlzIDoKCiAgICAgICAgICAgICAgICVhcHBseSBkb3VibGUgeyBSZWFsIH07CgogICAgICAgICAgc2hvdWxkIG5vdyB3b3JrLS1ldmVuIGlmIGFycmF5cyBpbnZvbHZpbmcgZG91YmxlcyBhbmQgUmVhbHMgYXJlCiAgICAgICAgICB1c2VkIGxhdGVyLgoKNy8yNy85NyA6IENoYW5nZWQgd2FybmluZyBtZXNzYWdlIGFib3V0ICJBcnJheSBYIGhhcyBiZWVuIGNvbnZlcnRlZCB0byBZIiB0bwogICAgICAgICAgb25seSBhcHBlYXIgaWYgcnVubmluZyBTV0lHIGluIHZlcmJvc2UgbW9kZS4KCjcvMjcvOTcgOiBBZGRlZCB0aGUgdmFyaWFibGVzICRwYXJtbmFtZSBhbmQgJGJhc2VtYW5nbGUgdG8gdGhlIHR5cGVtYXAKICAgICAgICAgIGdlbmVyYXRvci4gICAgJHBhcm1uYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgdXNlZAogICAgICAgICAgd2hlbiB0aGUgdHlwZW1hcCB3YXMgbWF0Y2hlZC4gIEl0IG1heSBiZSAiIiBpZiBubyBwYXJhbWV0ZXIKICAgICAgICAgIHdhcyB1c2VkLiAgICRiYXNlbWFuZ2xlIGlzIGEgbWFuZ2xlZCB2ZXJzaW9uIG9mIHRoZSBiYXNlCiAgICAgICAgICBkYXRhdHlwZS4gICAgU29tZXRpbWVzIHVzZWQgZm9yIGFycmF5IGhhbmRsaW5nLgoKNy8yNy85NyA6IENoYW5nZWQgdGhlIGJlaGF2aW9yIG9mIG91dHB1dCBhcmd1bWVudHMgd2l0aCBQeXRob24gc2hhZG93IGNsYXNzZXMuCiAgICAgICAgICBPcmlnaW5hbGx5LCBpZiBhIGZ1bmN0aW9uIHJldHVybmVkIGFuIG9iamVjdCAnRm9vJywgdGhlIHNoYWRvdyBjbGFzcwogICAgICAgICAgbWVjaGFuaXNtIHdvdWxkIGNyZWF0ZSBjb2RlIGxpa2UgdGhpcyA6CgogICAgICAgICAgICAgICAgZGVmIHJldHVybl9mb28oKToKICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IEZvb1B0cihzaGFkb3djLnJldHVybl9mb28oKSkKICAgICAgICAgICAgICAgICAgICAgIHZhbC50aGlzID0gMQogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbAoKICAgICAgICAgIFRoZSBwcm9ibGVtIHdpdGggdGhpcyBpcyB0aGF0IHR5cGVtYXBzIGFsbG93IGEgdXNlciB0byByZWRlZmluZQogICAgICAgICAgdGhlIG91dHB1dCBiZWhhdmlvciBvZiBhIGZ1bmN0aW9uLS1hcyBhIHJlc3VsdCwgd2UgY2FuIG5vIGxvbmdlcgogICAgICAgICAgbWFrZSBhbnkgYXNzdW1wdGlvbnMgYWJvdXQgdGhlIHJldHVybiB0eXBlIGJlaW5nIGEgcG9pbnRlciBvcgogICAgICAgICAgZXZlbiBiZWluZyBhIHNpbmdsZSB2YWx1ZSBmb3IgdGhhdCBtYXR0ZXIgKGl0IGNvdWxkIGJlIGEgbGlzdCwKICAgICAgICAgIHR1cGxlLCBldGMuLi4pLiAgIElmIFNXSUcgZGV0ZWN0cyB0aGUgdXNlIG9mIG91dHB1dCB0eXBlbWFwcwogICAgICAgICAgKGVpdGhlciAib3V0IiBvciAiYXJnb3V0IikgaXQgcmV0dXJucyB0aGUgcmVzdWx0IHVubW9kaWZpZWQgbGlrZQogICAgICAgICAgdGhpcyA6CgogICAgICAgICAgICAgICAgZGVmIHJldHVybl9mb28oKToKICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHNoYWRvd2MucmV0dXJuX2ZvbygpCiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsCgogICAgICAgICAgSW4gdGhpcyBjYXNlLCBpdCBpcyB1cCB0byB0aGUgdXNlciB0byBmaWd1cmUgb3V0IHdoYXQgdG8gZG8KICAgICAgICAgIHdpdGggdGhlIHJldHVybiB2YWx1ZSAoaW5jbHVkaW5nIHRoZSBwb3NzaWJpbGl0eSBvZiBjb252ZXJ0aW5nIGl0CiAgICAgICAgICBpbnRvIGEgUHl0aG9uIGNsYXNzKS4KCjcvMjYvOTcgOiBGaXhlZCBhIHBhcnNpbmcgcHJvYmxlbSB3aXRoIHR5cGVzIGxpa2UgJ3Vuc2lnbmVkIGxvbmcgaW50JywKICAgICAgICAgICd1bnNpZ25lZCBzaG9ydCBpbnQnLCBldGMuLi4KCjcvMjQvOTcgOiBNaW5vciBidWcgZml4IHRvIFRjbCA4IG1vZHVsZSB0byBwYXJzZSBlbnVtcyBwcm9wZXJseS4gIEFsc28KICAgICAgICAgIGZpeGVkIGEgbWVtb3J5IGNvcnJ1cHRpb24gcHJvYmxlbSBpbiB0aGUgdHlwZS1jaGVja2VyLgogICAgICAgICAgKHBhdGNoIGNvbnRyaWJ1dGVkIGJ5IEhlbnJ5IFJvd2xleS4KCjcvMjQvOTcgOiBBZGRlZCBQeXRob24tdHVwbGUgdHlwZW1hcHMgY29udHJpYnV0ZWQgYnkgUm9iaW4gRHVubi4KCjcvMjQvOTcgOiBJbmNvcnBvcmF0ZWQgc29tZSBjaGFuZ2VzIHRvIHRoZSBQeXRob24gbW9kdWxlIGluIHN1cHBvcnQgb2YKICAgICAgICAgIE1hcmsgSGFtbW9uZCdzIENPTSBzdXBwb3J0LiAgSSdtIG5vdCBlbnRpcmVseSBzdXJlIHRoZXkKICAgICAgICAgIHdvcmsgeWV0IGhvd2V2ZXIuICBOZWVkcyBkb2N1bWVudGF0aW9uIGFuZCB0ZXN0aW5nLgoKNy8yNC85NyA6IEZpeGVkIGNvZGUgZ2VuZXJhdGlvbiBidWdzIHdoZW4gc3RydWN0dXJlcyBoYWQgYXJyYXkgbWVtYmVycwogICAgICAgICAgYW5kIHR5cGVtYXBzIHdlcmUgdXNlZC4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgJXR5cGVtYXAobWVtYmVyaW4pIGRvdWJsZSBbMjBdWzIwXSB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4gZ2V0IGEgZG91YmxlIFsyMF1bMjBdIC4uLgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFbMjBdWzIwXTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgT3JpZ2luYWxseSwgdGhpcyB3b3VsZCBnZW5lcmF0ZSBhIGNvbXBpbGVyLXR5cGUgZXJyb3Igd2hlbgogICAgICAgICAgdGhlIHdyYXBwZXIgY29kZSB3YXMgY29tcGlsZWQuICAgTm93LCBhIGhlbHBlciBmdW5jdGlvbiBsaWtlCiAgICAgICAgICB0aGlzIGlzIGdlbmVyYXRlZCA6CgogICAgICAgICAgICAgICAgZG91YmxlICpGb29fYV9zZXQoRm9vICphLCBkb3VibGUgdmFsWzIwXVsyMF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC4uLiBtZW1iZXJpbiB0eXBlbWFwIGhlcmUgLi4uCiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGRvdWJsZSAqKSB2YWw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgV2hlbiB3cml0aW5nIHR5cGVtYXBzLCBvbmUgY2FuIGFzc3VtZSB0aGF0IHRoZSBzb3VyY2UgdmFyaWFibGUKICAgICAgICAgIGlzIGFuIGFycmF5IG9mIHRoZSAqc2FtZSogdHlwZSBhcyB0aGUgc3RydWN0dXJlIG1lbWJlci4gVGhpcwogICAgICAgICAgbWF5IGJyZWFrIHNvbWUgY29kZXMgdGhhdCBtYW5hZ2VkIHRvIHdvcmsgYXJvdW5kIHRoZSBhcnJheSBidWcuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvMTMvOTcgOiBGaXhlZCBidWcgaW4gUGVybDUgbW9kdWxlIHdoZW4gdXNpbmcgQyBnbG9iYWwgdmFyaWFibGVzIHRoYXQKICAgICAgICAgIGFyZSBwb2ludGVycy4gIFdoZW4gdXNlZCBpbiBmdW5jdGlvbiBjYWxscyBhbmQgb3RoZXIgb3BlcmF0aW9ucywKICAgICAgICAgIHRoZSB2YWx1ZSBvZiB0aGUgcG9pbnRlciB3b3VsZCBiZSBpbnZhbGlkLS0tY2F1c2luZyBjb3JlCiAgICAgICAgICBkdW1wcyBhbmQgb3RoZXIgcHJvYmxlbXMuICBTV0lHIGltcGxlbWVudHMgZ2xvYmFsIHZhcmlhYmxlcwogICAgICAgICAgdXNpbmcgUGVybCBtYWdpYyB2YXJpYWJsZXMuICBBcyBpdCB0dXJucyBvdXQsIHRoZSBlcnJvcgogICAgICAgICAgd2FzIGNhdXNlZCBieSB0aGUgZmFjdCB0aGF0IHRoZSBwb2ludGVyLWV4dHJhY3Rpb24gY29kZQogICAgICAgICAgd2FzIHNvbWVob3cgYnlwYXNzaW5nIHRoZSBwcm9jZWR1cmUgdXNlZCB0byByZXNvbHZlIG1hZ2ljYWwKICAgICAgICAgIHZhcmlhYmxlcyAoaGVuY2UsIGxlYXZpbmcgdGhlIHZhbHVlIHVuZGVmaW5lZCkuICBUbyBmaXgKICAgICAgICAgIHRoZSBwcm9ibGVtLCBTV0lHIG5vdyBleHBsaWNpdGx5IHJlc29sdmVzIG1hZ2ljIGJlZm9yZQogICAgICAgICAgZXh0cmFjdGluZyBwb2ludGVyIHZhbHVlcy4KCjcvMTIvOTcgOiBFbGltaW5hdGVkIHRoZSBsYXN0IHJlbW5hbnRzIG9mIGZyZWUoKSBhbmQgbWFsbG9jKCkgZnJvbQogICAgICAgICAgdGhlIFNXSUcgY29tcGlsZXIuCgo3LzEyLzk3IDogRml4ZWQgcGFyc2luZyBwcm9ibGVtcyB3aXRoIHR5cGVtYXBzIGludm9sdmluZyBhcnJheXMgYW5kCiAgICAgICAgICB0ZW1wb3JhcnkgdmFyaWFibGVzIG9mIGFycmF5cy4gICAgQWxzbyBtYWRlIGl0IHBvc3NpYmxlIGZvcgogICAgICAgICAgU1dJRyB0byBoYW5kbGUgdHlwZW1hcHMgbGlrZSB0aGlzIDoKCiAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGRvdWJsZSBbQU5ZXSAoZG91YmxlIHRlbXBbJGRpbTBdKSB7CgkJICAgICAgLi4uIHN0b3JlIGRhdGEgaW4gdGVtcFskZGltMF0gLi4uCiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgIE5vdCBvbmx5IGRvZXMgdGhpcyB0eXBlbWFwIG1hdGNoIGFueSBkb3VibGUgW10gYXJyYXksIGl0CiAgICAgICAgICBjcmVhdGVzIGEgbG9jYWwgdmFyaWFibGUgd2l0aCBwcmVjaXNlbHkgdGhlIHJpZ2h0IGRpbWVuc2lvbnMuCiAgICAgICAgICAoaWUuICRkaW0wIGdldHMgZmlsbGVkIGluIHdpdGggdGhlIHJlYWwgbnVtYmVyIG9mIGRpbWVuc2lvbnMpLgogICAgICAgICAgT2YgY291cnNlLCBvZmYgdGhlIHJlY29yZCwgdGhpcyB3aWxsIGJlIGEgd2F5IHRvIGFkZCBtb3JlCiAgICAgICAgICBmdW5jdGlvbmFsaXR5IHRvIHRoZSB0eXBlbWFwcy5pIGxpYnJhcmllcy4KCjcvOS85NyAgOiBGaXhlZCBzb21lIHByb2JsZW1zIHdpdGggUGVybDUsIHN0YXRpYyBsaW5raW5nLCBhbmQgc2hhZG93CiAgICAgICAgICBjbGFzc2VzLiAgV2hlbiBzdGF0aWNhbGx5IGxpbmtpbmcgbXVsdGlwbGUgbW9kdWxlcyB0b2dldGhlciwgd3JpdGUKICAgICAgICAgIGEgdG9wLWxldmVsIGludGVyZmFjZSBmaWxlIGxpa2UgdGhpcyB3aGVuIHNoYWRvdyBjbGFzc2VzIGFyZSBub3QKICAgICAgICAgIHVzZWQgOgoKICAgICAgICAgICAgICAgICAlbW9kdWxlIHN3aWcsIGZvbywgYmFyLCBnbG9iOwogICAgICAgICAgICAgICAgICVpbmNsdWRlIHBlcmxtYWluLmkKCiAgICAgICAgICBXaGVuIHNoYWRvdyBjbGFzc2VzIGFyZSB1c2VkLCB0aGUgbW9kdWxlIG5hbWVzIGhhdmUgYW4gZXh0cmEgJ2MnCiAgICAgICAgICBhcHBlbmRlZCBzbyBpdCBzaG91bGQgcmVhZCBhcyA6CgogICAgICAgICAgICAgICAgICVtb2R1bGUgc3dpZywgZm9vYywgYmFyYywgZ2xvYmM7CiAgICAgICAgICAgICAgICAgJWluY2x1ZGUgcGVybG1haW4uaQoKICAgICAgICAgIFdoZW4gbGlua2luZyBtdWx0aXBsZSBtb2R1bGVzLCBjb25zaWRlciB1c2luZyB0aGUgU1dJRyBydW50aW1lCiAgICAgICAgICBsaWJyYXJ5LgoKNy84Lzk3ICA6IEluY29ycG9yYXRlZCBmaXhlZCB2ZXJzaW9ucyBvZiB0aGUgQm9ybGFuZCBDKysgTWFrZWZpbGVzLgoKNy84Lzk3ICA6IEZpcnN0IGN1dCBhdCB0cnlpbmcgdG8gZWxpbWluYXRlIGV4Y2Vzc2l2ZSBjb21waWxlciB3YXJuaW5ncy4KICAgICAgICAgIEFzIGl0IHR1cm5zIG91dCwgYWxvdCBvZiB3YXJuaW5ncyBnbyBhd2F5IGlmIHlvdSBqdXN0IG1ha2UKICAgICAgICAgIGRlY2xhcmF0aW9ucyBsaWtlIHRoaXMKCiAgICAgICAgICAgICAgICAgIGNsaWVudERhdGEgPSBjbGllbnREYXRhOwoKICAgICAgICAgIGluIHRoZSByZXN1bHRpbmcgd3JhcHBlciBjb2RlLiAgTW9zdCBjb21waWxlcnMgc2hvdWxkIGp1c3QKICAgICAgICAgIGlnbm9yZSB0aGlzIGNvZGUgKGF0IGxlYXN0IHdvdWxkIGNhbiBob3BlKS4KCjcvOC85NyAgOiBGaXhlZCBiaXphcnJlIGNvZGUgZ2VuZXJhdGlvbiBidWcgd2l0aCB0eXBlbWFwcyBhbmQgQysrIGNsYXNzZXMuCiAgICAgICAgICBJbiBzb21lIGNhc2VzLCB0eXBlbWFwcyBjb250YWluaW5nIHByaW50ZiBmb3JtYXR0aW5nIHN0cmluZ3Mgc3VjaCBhcwoKICAgICAgICAgICAgICAgICAgJXR5cGVtYXAobWVtYmVyb3V0KSBpbnQgKiB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVkIiw0Mik7CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBXb3VsZCBnZW5lcmF0ZSBjb21wbGV0ZWx5IGJvZ3VzIGNvZGUgd2l0aCBnYXJiYWdlIHJlcGxhY2luZwogICAgICAgICAgdGhlICclZCcuICAgQ2F1c2VkIGJ5IG9uZSBmYXVsdHkgdXNlIG9mIHByaW50ZiAod2Fzbid0IGFibGUgdG8gZmluZAogICAgICAgICAgYW55IG90aGVyIG9jY3VycmVuY2VzKS4KCjcvNy85NyAgOiBGaXhlZCBidWcgaW4gUHl0aG9uIHNoYWRvdyBjbGFzcyBnZW5lcmF0aW9uIHdpdGggbm9uLW1lbWJlcgogICAgICAgICAgZnVuY3Rpb25zIHRoYXQgYXJlIHJldHVybmluZyBtb3JlIHRoYW4gb25lIHZhbHVlLgoKNy83Lzk3ICA6IEluY29ycG9yYXRlZCBtb2RpZmljYXRpb25zIHRvIG1ha2UgU1dJRyB3b3JrIHdpdGggR3VpbGUgMS4yLgogICAgICAgICAgU3RpbGwgbmVlZCB0byB0ZXN0IGl0IG91dCwgYnV0IGl0IGlzIHJ1bW9yZWQgdG8gd29yay4KCjcvMi85NyAgOiBGaXhlZCBzb21lIGJ1Z3MgcmVsYXRlZCB0byBvdXRwdXQgYXJndW1lbnRzIGFuZCBQeXRob24gc2hhZG93CiAgICAgICAgICBjbGFzc2VzLiAgICBJZiBhbiBvdXRwdXQgYXJndW1lbnQgaXMgZGV0ZWN0ZWQsIFNXSUcgYXNzdW1lcwogICAgICAgICAgdGhhdCB0aGUgcmVzdWx0IGlzIGEgbGlzdCBhbmQgaGFuZGxlcyBpdCBhcHByb3ByaWF0ZWx5LgogICAgICAgICAgSWYgdGhlIG5vcm1hbCByZXR1cm4gdHlwZSBvZiBhbiBmdW5jdGlvbiBpcyBhbiBvYmplY3QsCiAgICAgICAgICBpdCB3aWxsIGJlIGNvbnZlcnRlZCBpbnRvIGEgc2hhZG93IGNsYXNzIGFzIGJlZm9yZSwgYnV0CiAgICAgICAgICB3aXRoIHRoZSBhc3N1bXB0aW9uIHRoYXQgaXQgaXMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYQogICAgICAgICAgbGlzdC4gICoqKiBOT1RFIDogVGhpcyBiZWhhdmlvciBoYXMgYmVlbiBzdWJzZXF1ZW50bHkgY2hhbmdlZCAqKioKCjYvMjkvOTcgOiBDaGFuZ2VkIEVYUE9SVCB0byBTV0lHRVhQT1JUIGluIGFsbCBvZiB0aGUgbGFuZ3VhZ2UgbW9kdWxlcy4KICAgICAgICAgIFNob3VsZCBwcm92aWRlIGJldHRlciBjb21wYXRpYmlsaXR5IHdpdGggV2luZG93cy4KCjYvMjkvOTcgOiBNb2RpZmllZCBQeXRob24gc2hhZG93IGNsYXNzZXMgc28gdGhhdCBvdXRwdXQgYXJndW1lbnRzCiAgICAgICAgICB3b3JrIGNvcnJlY3RseSAod2hlbiB0eXBlbWFwcyBhcmUgdXNlZCkuCgpWZXJzaW9uIDEuMSAoSnVuZSAyNCwgMTk5NykKPT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo2LzI0Lzk3IDogRml4ZWQgT2JqZWN0aXZlLUMgY29uc3RydWN0b3IgYnVnIHdoZW4gd29ya2luZyB3aXRoIFBlcmw1CiAgICAgICAgICBzaGFkb3cgY2xhc3Nlcy4KCjYvMjMvOTcgOiBGaXhlZCBzb21lIHBhcnNpbmcgcHJvYmxlbXMgd2l0aCBPYmplY3RpdmUtQy4gIERlY2xhcmF0aW9ucwogICAgICAgICAgc3VjaCBhcyB0aGUgZm9sbG93aW5nIHNob3VsZCB3b3JrIG5vdyA6CgogICAgICAgICAgICAgICAtIGZvbyA6IChpbnQpIGEgd2l0aDogKGludCkgYjsKCjYvMjIvOTcgOiBBZGRlZCBTV0lHIFJ1bnRpbWUgbGlicmFyeS4gICBUaGlzIGxpYnJhcnkgY29udGFpbnMKICAgICAgICAgIHRoZSBTV0lHIHBvaW50ZXIgdHlwZS1jaGVja2VyIGFuZCBzdXBwb3J0IGZ1bmN0aW9ucwogICAgICAgICAgdGhhdCBhcmUgbm9ybWFsbHkgaW5jbHVkZWQgaW4gZXZlcnkgbW9kdWxlLiAgQnkgdXNpbmcKICAgICAgICAgIHRoZSBsaWJyYXJ5LCBpdCBpcyBlYXNpZXIgdG8gd29yayB3aXRoIG11bHRpcGxlIFNXSUcKICAgICAgICAgIGdlbmVyYXRlZCBtb2R1bGVzLgoKNi8yMi85NyA6IEZpeGVkIG1pbm9yIGJ1ZyBpbiBQZXJsNSBtb2R1bGUgcmVsYXRlZCB0byBzdGF0aWMgbGlua2luZwogICAgICAgICAgb2YgbXVsdGlwbGUgbW9kdWxlcy4KCjYvMjIvOTcgOiBGaXhlZCBzb21lIGJ1Z3Mgd2l0aCB0aGUgJWltcG9ydCBkaXJlY3RpdmUuIFdoZW4gdXNlZCB3aXRoCiAgICAgICAgICBQZXJsNSBzaGFkb3cgY2xhc3NlcywgdGhpcyBnZW5lcmF0ZXMgYSAncmVxdWlyZScgc3RhdGVtZW50CiAgICAgICAgICB0byBsb2FkIGluIGV4dGVybmFsIG1vZHVsZXMuCgo2LzIyLzk3IDogQWRkZWQgLXN3aWdsaWIgb3B0aW9uLiAgVGhpcyBwcmludHMgb3V0IHRoZSBsb2NhdGlvbiBvZiB0aGUKICAgICAgICAgIFNXSUcgbGlicmFyeSBhbmQgZXhpdHMuICBUaGlzIG9wdGlvbiBpcyBvbmx5IHJlYWxseSB1c2VmdWwgdG8KICAgICAgICAgIGNvbmZpZ3VyYXRpb24gdG9vbHMgdGhhdCBhcmUgbG9va2luZyBmb3IgU1dJRyBhbmQgaXRzIGxpYnJhcnkKICAgICAgICAgIGxvY2F0aW9uIChlLmcuIGF1dG9jb25mLCBjb25maWd1cmUsIGV0Yy4uLikuCgo2LzIxLzk3IDogRml4ZWQgZXhwb3J0IGJ1ZyB3aXRoIFBlcmw1LjAwNCBvbiBXaW5kb3dzLU5ULgoKNi8yMC85NyA6IE1pbm9yIGNoYW5nZSB0byBjb2RlIGdlbmVyYXRpb24gb2YgY2xhc3Mvc3RydWN0dXJlIG1lbWJlcnMgaW4KICAgICAgICAgIG9yZGVyIHRvIHdvcmsgYmV0dGVyIHdpdGggdHlwZW1hcHMuIFNob3VsZCBoYXZlIG5vIG5vdGljYWJsZQogICAgICAgICAgaW1wYWN0IG9uIGV4aXN0aW5nIFNXSUcgbW9kdWxlcy4KCjYvMTkvOTcgOiBBZGRlZCAtdCBvcHRpb24uIFRoaXMgYWxsb3dzIFNXSUcgdG8gbG9hZCBhIHR5cGVtYXAgZmlsZSBiZWZvcmUKICAgICAgICAgIHByb2Nlc3NpbmcgYW55IGRlY2xhcmF0aW9ucy4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgc3dpZyAtdCB0eXBlbWFwcy5pIC1weXRob24gZXhhbXBsZS5pCgogICAgICAgICAgQXQgbW9zdCwgb25seSBvbmUgdHlwZW1hcCBmaWxlIGNhbiBiZSBzcGVjaWZpZWQgaW4gdGhpcyBtYW5uZXIuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo2LzE4Lzk3IDogTmVlZCBhIE1ha2VmaWxlIGZhc3Q/IFR5cGUKCiAgICAgICAgICAgICAgICAgc3dpZyBbLXRjbCwgLXBlcmw1LCAtcHl0aG9uXSAtY28gTWFrZWZpbGUKCiAgICAgICAgICBhbmQgeW91IHdpbGwgZ2V0IGEgTWFrZWZpbGUgc3BlY2lmaWMgdG8gdGhhdCB0YXJnZXQgbGFuZ3VhZ2UuCiAgICAgICAgICBZb3UganVzdCBuZWVkIHRvIG1vZGlmeSBpdCBmb3IgeW91ciBhcHBsaWNhdGlvbiBhbmQgeW91J3JlCiAgICAgICAgICByZWFkeSB0byBydW4uCgo2LzE4Lzk3IDogQ29tcGxldGVkIHRoZSAtY2kgb3B0aW9uLiAgVGhpcyBvcHRpb24gY2hlY2tzIGEgZmlsZSBpbnRvIHRoZQogICAgICAgICAgU1dJRyBsaWJyYXJ5LiAgIEl0IHNob3VsZCBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYQogICAgICAgICAgbGFuZ3VhZ2Ugb3B0aW9uLiBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgICBzd2lnIC10Y2wgLWNpIGZvb2Jhci5pCgogICAgICAgICAgQ2hlY2tzIHRoZSBmaWxlIGZvb2Jhci5pIGludG8gdGhlIFRjbCBwYXJ0IG9mIHRoZSBsaWJyYXJ5LgogICAgICAgICAgSW4gb3JkZXIgdG8gY2hlY2sgYSBmaWxlIGludG8gdGhlIGdlbmVyYWwgbGlicmFyeSAoYWNjZXNzaWJsZQogICAgICAgICAgdG8gYWxsIGxhbmd1YWdlcyBtb2R1bGVzKSwgZG8gdGhlIGZvbGxvd2luZwoKICAgICAgICAgICAgICAgICAgc3dpZyAtY2kgLW8gLi4vZm9vYmFyLmkgZm9vYmFyLmkKCiAgICAgICAgICAoQWRtaXR0ZWRseSB0aGlzIGxvb2tzIGEgbGl0dGxlIHN0cmFuZ2UgYnV0IGlzIHVuYXZvaWRhYmxlKS4KICAgICAgICAgIFRoZSBjaGVjay1pbiBvcHRpb24gaXMgcHJpbWFyaWx5IGRlc2lnbmVkIGZvciBTV0lHIG1haW50ZW5hbmNlCiAgICAgICAgICBhbmQgbGlicmFyeSBkZXZlbG9wbWVudC4gVGhlIGNvbW1hbmQgd2lsbCBmYWlsIGlmIHRoZSB1c2VyIGRvZXMKICAgICAgICAgIG5vdCBoYXZlIHdyaXRlIHBlcm1pc3Npb24gdG8gdGhlIFNXSUcgbGlicmFyeS4gIFRoaXJkIHBhcnR5IGxpYnJhcnkKICAgICAgICAgIGV4dGVuc2lvbnMgY2FuIGVhc2lseSBpbnN0YWxsIHRoZW1zZWx2ZXMgYnkgc2ltcGx5IHByb3ZpZGluZwogICAgICAgICAgYSBzaGVsbCBzY3JpcHQgdGhhdCB1c2VzICdzd2lnIC1jaScgdG8gaW5zdGFsbCB0aGUgYXBwcm9wcmlhdGUKICAgICAgICAgIGxpYnJhcnkgZmlsZXMuICBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGtub3cgd2hlcmUgdGhlIFNXSUcgbGlicmFyeQogICAgICAgICAgaXMgbG9jYXRlZCBpZiB5b3UgdXNlIHRoaXMgbWVjaGFuaXNtLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKNi8xNi85NyA6IEZpeGVkIGEgYnVnIGluIHNoYWRvdyBjbGFzcyBnZW5lcmF0aW9uIHdoZW4gJW5hbWUoKSB3YXMgYXBwbGllZAogICAgICAgICAgdG8gYSBjbGFzcyBkZWZpbml0aW9uLiAgIFVuZm9ydHVuYXRlbHksIGZpeGluZyB0aGUgYnVnIHJlcXVpcmVkCiAgICAgICAgICBhIGNoYW5nZSBpbiB0aGUgTGFuZ3VhZ2UgQyBBUEkgYnkgYWRkaW5nIGFuIGV4dHJhIGFyZ3VtZW50IHRvCiAgICAgICAgICB0aGUgTGFuZ3VhZ2U6OmNwcF9jbGFzc19kZWNsKCkgZnVuY3Rpb24uICBUaGlzIG1heSBicmVhawogICAgICAgICAgU1dJRyBDKysgZXh0ZW5zaW9ucy4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNi8xNS85NyA6IEFkZGVkIGEgd2FybmluZyBtZXNzYWdlIGlmIG5vIG1vZHVsZSBuYW1lIGlzIHNwZWNpZmllZCB3aXRoIHRoZQogICAgICAgICAgJW1vZHVsZSBkaXJlY3RpdmUgb3IgLW1vZHVsZSBvcHRpb24uCgo2LzE1Lzk3IDogRml4ZWQgbGluZSBudW1iZXIgYnVnIHdoZW4gcmVwb3J0aW5nIGVycm9ycyBmb3IgdW5kZWZpbmVkCiAgICAgICAgICBiYXNlIGNsYXNzZXMuCgo2LzE1Lzk3IDogQWRkZWQgbmV3ICVyZW5hbWUgZGlyZWN0aXZlLiAgVGhpcyBhbGxvd3MgdGhlIGZvcndhcmQgZGVjbGFyYXRpb24KICAgICAgICAgIG9mIGEgcmVuYW1pbmcuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgICVyZW5hbWUgT2xkTmFtZSBOZXdOYW1lOwoKICAgICAgICAgICAgICAgICAuLi4uIGxhdGVyIC4uLgogICAgICAgICAgICAgICAgIGludCBPbGROYW1lKGludCk7CgogICAgICAgICAgVW5saWtlICVuYW1lLCAlcmVuYW1lIHdpbGwgcmVuYW1lIGFueSBvY2N1cnJlbmNlIG9mIHRoZSBvbGQgbmFtZS4KICAgICAgICAgIFRoaXMgYXBwbGllcyB0byBmdW5jdGlvbnMsIHZhcmlhYmxlcywgY2xhc3MgbWVtYmVycyBhbmQgc28gZm9ydGguCiAgICAgICAgICBUaGVyZSBpcyBubyB3YXkgdG8gZGlzYWJsZSAlcmVuYW1lIG9uY2Ugc2V0LCBidXQgeW91IGNhbiBjaGFuZ2UgdGhlCiAgICAgICAgICBuYW1lIGJ5IHJlZGVjbGFyaW5nIGl0IHRvIHNvbWV0aGluZyBlbHNlLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKNi8xNS85NyA6IEltcHJvdmVkIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgJW5hbWUgZGlyZWN0aXZlIHNvIHRoYXQgaXQKICAgICAgICAgIGNvdWxkIGJlIHVzZWQgd2l0aCBjb25kaXRpb25hbCBjb21waWxhdGlvbiA6CgogICAgICAgICAgICAgICAgICAgICNpZmRlZiBTV0lHCiAgICAgICAgICAgICAgICAgICAgJW5hbWUoTmV3TmFtZSkKICAgICAgICAgICAgICAgICAgICAjZW5kaWYKICAgICAgICAgICAgICAgICAgICBpbnQgT2xkTmFtZShpbnQpOwoKNi8xNS85NyA6IEFkZGVkIHN1cHBvcnQgZm9yIGZ1bmN0aW9ucyB3aXRoIG5vIHJldHVybiBkYXRhdHlwZS4gIEluIHRoaXMgY2FzZSwKICAgICAgICAgIFNXSUcgYXNzdW1lcyBhIHJldHVybiB0eXBlIG9mICdpbnQnLgoKNi8xMS85NyA6IEltcHJvdmVkIGVycm9yIHJlcG9ydGluZyBpbiB0aGUgcGFyc2VyLiAgSXQgc2hvdWxkIGJlIGEgbGl0dGxlCiAgICAgICAgICBsZXNzIHNlbnNpdGl2ZSB0byBlcnJvcnMgdGhhdCBvY2N1ciBpbnNpZGUgY2xhc3MgZGVmaW5pdGlvbnMKICAgICAgICAgIG5vdy4gIEFsc28gcmVwb3J0cyBlcnJvcnMgZm9yIGZ1bmN0aW9uIHBvaW50ZXJzLgoKNi8xMS85NyA6IE1hZGUgJyQnIGEgbGVnYWwgc3ltYm9sIGluIGlkZW50aWZpZXJzLiAgVGhpcyBpcyB0byBzdXBwb3J0CiAgICAgICAgICBzb21lIE9iamVjdGl2ZS1DIGxpYnJhcmllcy4gIFNvbWUgY29tcGlsZXJzIChzdWNoIGFzIGdjYykgbWF5IGFsc28KICAgICAgICAgIGFsbG93IGlkZW50aWZpZXJzIHRvIGNvbnRhaW4gYSAkIGluIEMvQysrIGNvZGUgYXMgd2VsbCAodGhpcyBpcwogICAgICAgICAgYW4gb2JzY3VyZSBmZWF0dXJlIG9mIEMpLiBXaGVuICckJyBhcHBlYXJzIGluIGlkZW50aWZpZXIsIFNXSUcKICAgICAgICAgIHJlbWFwcyBpdCB0byB0aGUgc3RyaW5nICdfU18nIHdoZW4gY3JlYXRpbmcgdGhlIHNjcmlwdGluZyBsYW5ndWFnZQogICAgICAgICAgZnVuY3Rpb24uIFRodXMgYSBmdW5jdGlvbiAnZm9vJGJhcicgd291bGQgYmUgY2FsbGVkICdmb29fU19iYXInLgoKNi8xMS85NyA6IEZpeGVkIGJ1ZyBpbiBQeXRob24gc2hhZG93IGNsYXNzZXMgd2l0aCBfX3JlcHJfXyBtZXRob2QuICBJZgogICAgICAgICAgc3VwcGxpZWQgYnkgdGhlIHVzZXIsIGl0IHdhcyBpZ25vcmVkLCBidXQgbm93IGl0IHNob3VsZCB3b3JrLgoKNi85Lzk3ICA6IEZpeGVkIHRoZSBUY2wgOC4wIG1vZHVsZSB0byB3b3JrIHdpdGggVGNsIDguMGIxLiAgIFNXSUcgaXMgbm8KICAgICAgICAgIGxvbmdlciBjb21wYXRpYmxlIHdpdGggKmFueSogYWxwaGEgcmVsZWFzZSBvZiBUY2wgOC4wLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo2LzcvOTcgIDogUHV0IGEgbWF4aW1hbCBlcnJvciBjb3VudCBpbiAoY3VycmVudGx5IHNldCB0byAyMCkuIFNXSUcgd2lsbCBiYWlsIG91dAogICAgICAgICAgaWYgaXQgZ2VuZXJhdGVzIG1vcmUgZXJyb3JzIHRoYW4gdGhpcyAodXNlZnVsIGZvciBwcmV2ZW50aW5nIFNXSUcKICAgICAgICAgIGZyb20gcHJpbnRpbmcgNDAwMCBzeW50YXggZXJyb3JzIHdoZW4gaXQgZ2V0cyBjb25mdXNlZCkuCgo2LzcvOTcgIDogRml4ZWQgc2VnbWVudGF0aW9uIGZhdWx0IHdoZW4gcGFyc2luZyB2YXJpYWJsZSBsZW5ndGggYXJndW1lbnRzLgoKNi83Lzk3ICA6IE1pbm9yIGNoYW5nZSB0byBQZXJsNSBtb2R1bGUuICBDKysgc3RhdGljIGZ1bmN0aW9ucyBhcmUgbm93CiAgICAgICAgICBwdXQgaW4gdGhlIHNhbWUgcGFja2FnZSBhcyB0aGVpciBjbGFzcyB3aGVuIHVzaW5nIHNoYWRvdyBjbGFzc2VzLgoKNi83Lzk3ICA6IENlbnRyYWxpemVkIHRoZSBuYW1pbmcgb2YgZnVuY3Rpb25zLCBtZW1iZXJzLCB3cmFwcGVycyBldGMuLi4gQnkKICAgICAgICAgIGNlbnRyYWxpemluZyB0aGUgbmFtaW5nIHNjaGVtZSwgaXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIG1ha2UKICAgICAgICAgIHNvbWUgbXVsdGktZmlsZSBvcHRpbWl6YXRpb25zLiAgQWxzbywgaXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvCiAgICAgICAgICBjaGFuZ2UgU1dJRydzIG5hbWluZyBzY2hlbWUgKHBlcmhhcHMgYSBuZXcgZmVhdHVyZSB0byBiZSBhZGRlZAogICAgICAgICAgbGF0ZXIpLgoKNi8yLzk3ICA6IEFkZGVkICdhcmdpbml0JyB0eXBlbWFwLiAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gYXNzaWduIGluaXRpYWwgdmFsdWVzCiAgICAgICAgICB0byBmdW5jdGlvbiBhcmd1bWVudHMuICBEb2luZyBzbyBtYWtlcyBpdCBzb21ld2hhdCBlYXNpZXIgdG8gZGV0ZWN0CiAgICAgICAgICBpbXByb3BlciBhcmd1bWVudCBwYXNzaW5nIHdoZW4gd29ya2luZyB3aXRoIG90aGVyIHR5cGVtYXBzLgoKNi8yLzk3ICA6IEZpeGVkIGNvZGUgZ2VuZXJhdGlvbiBidWcgd2hlbiByZWFkLW9ubHkgdmFyaWFibGVzIHdlcmUgaW5oZXJpdGVkCiAgICAgICAgICBpbnRvIG90aGVyIGNsYXNzZXMuICBVbmRlciBpbmhlcml0YW5jZSwgdGhlIHZhcmlhYmxlcyB3b3VsZAogICAgICAgICAgYmVjb21lIHdyaXRhYmxlLCBidXQgdGhpcyBoYXMgbm93IGJlZW4gY29ycmVjdGVkLgoKNS8zMC85NyA6IEFuIGVtcHR5ICVuYW1lKCkgZGlyZWN0aXZlIGlzIG5vIGxvbmdlciBhbGxvd2VkIG9yIHN1cHBvcnRlZC4KICAgICAgICAgIFRoaXMgZGlyZWN0aXZlIHdhcyBvcmlnaW5hbGx5IHVzZWQgdG8gc3RyaXAgdGhlIHByZWZpeAogICAgICAgICAgb2ZmIG9mIGEgY2xhc3Mgb3Igc3RydWN0dXJlLiAgVW5mb3J0dW5hdGVseSwgdGhpcyBuZXZlciByZWFsbHkKICAgICAgICAgIHNlZW1lZCB0byB3b3JrIHJpZ2h0IGFuZCBpdCBjb21wbGljYXRlZCB0aGUgQysrIGNvZGUgZ2VuZXJhdG9yCiAgICAgICAgICBzaWduaWZpY2FudGx5LiAgIEFzIGZhciBhcyBJIGNhbiB0ZWxsIG5vIG9uZSB1c2VzIGl0LCBzbyBpdAogICAgICAgICAgaXMgbm93IGhpc3RvcnkuICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjUvMjgvOTcgOiBGaXhlZCBhIHBhcnNpbmcgYnVnIHdpdGggI2RlZmluZSBhbmQgQysrIGNvbW1lbnRzLiAgRGVjbGFyYXRpb25zCiAgICAgICAgICBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgbm93IHdvcmsgcHJvcGVybHkgOgoKICAgICAgICAgICAgICAgICAgICNkZWZpbmUgQ09OU1QgICA0ICAgICAvLyBBIENvbW1lbnQKCjUvMjgvOTcgOiBNYWRlIHNvbWUgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIHRvIHRoZSBTV0lHIFN0cmluZyBjbGFzcy4KICAgICAgICAgIChvbmx5IGFmZmVjdHMgdGhlIFNXSUcgY29tcGlsZXIgaXRzZWxmKS4KCjUvMjgvOTcgOiBNb2RpZmllZCB0aGUgcGFyc2VyIHRvIHNraXAgdGVtcGxhdGUgZGVmaW5pdGlvbnMgYW5kIGlzc3VlIGEKICAgICAgICAgIHdhcm5pbmcgbWVzc2FnZS4KCjUvMjgvOTcgOiBQcmVsaW1pbmFyeSBzdXBwb3J0IGZvciBwYXJhbWV0ZXJpemVkIHR5cGVzIGFkZGVkIChpZS4gdGVtcGxhdGVzKS4KICAgICAgICAgIFR5cGVzIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyBzaG91bGQgcGFzcyB0aHJvdWdoIHRoZSBTV0lHIGNvbXBpbGVyCgogICAgICAgICAgICAgICAgICAgIHZvaWQgZm9vKHZlY3Rvcjxjb21wbGV4PiAqYSwgdmVjdG9yPGRvdWJsZT4gKmIpOwoKICAgICAgICAgIFdoZW4gdXNlZCwgdGhlIGVudGlyZSBuYW1lICd2ZWN0b3I8Y29tcGxleD4nIGJlY29tZXMgdGhlIG5hbWUKICAgICAgICAgIG9mIHRoZSBkYXRhdHlwZS4gICAgICBEdWUgdG8gc3BhY2UgbGltaXRhdGlvbnMgaW4gZGF0YXR5cGUKICAgICAgICAgIHJlcHJlc2VudGF0aW9ucywgdGhlIG5hbWUgc2hvdWxkIG5vdCBleGNlZWQgOTYgY2hhcmFjdGVycy4KCiAgICAgICAgICBOb3RlIDogVGhpcyBpcyBvbmx5IHBhcnQgb2Ygd2hhdCBpcyBuZWVkZWQgZm9yIHRlbXBsYXRlIHN1cHBvcnQuCiAgICAgICAgICBUZW1wbGF0ZSBjbGFzcyBkZWZpbml0aW9ucyBhcmUgbm90IHlldCBzdXBwb3J0ZWQgYnkgU1dJRy4KCiAgICAgICAgICBUaGUgdGVtcGxhdGUgbm90YXRpb24gYWJvdmUgbWF5IGFsc28gYmUgdXNlZCB3aGVuIHNwZWNpZnlpbmcKICAgICAgICAgIE9iamVjdGl2ZS1DIHByb3RvY29sIGxpc3RzLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKNS8yNC85NyA6IEZpcnN0IGN1dCBhdCBPYmplY3RpdmUtQyBzdXBwb3J0IGFkZGVkLiAgIEFzIGl0IHR1cm5zIG91dCwgYWxtb3N0CiAgICAgICAgICBldmVyeXRoaW5nIGNhbiBiZSBoYW5kbGVkIHdpdGggb25seSBhIGZldyBtaW5vciBtb2RpZmljYXRpb25zIHRvCiAgICAgICAgICB0aGUgQysrIG1vZHVsZS4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjUvMjMvOTcgOiBGaXhlZCByZXBlYXRlZCBkZWZpbml0aW9uIGJ1ZyBpbiBtdWx0aXBsZSBpbmhlcml0YW5jZSBoYW5kbGluZwogICAgICAgICAgd2hlbiBtdWx0aXBsZSBiYXNlIGNsYXNzZXMgc2hhcmUgYSBjb21tb24gYmFzZSBjbGFzcyAoaWUuCiAgICAgICAgICB0aGUgZXZpbCBkaWFtb25kKS4KCjUvMjEvOTcgOiBGaXhlZCByYXRoZXIgZW1iYXJyYXNzaW5nIHR5cG8gdGhhdCB3b3JrZWQgaXRzIHdheSBpbnRvIHRoZQogICAgICAgICAgVGVzdHMvQnVpbGQgZGlyZWN0b3J5LgoKNS8xOS85NyA6IEZpeGVkIGNvZGUgZ2VuZXJhdGlvbiBidWcgd2hlbiB1c2luZyBuYXRpdmUgbWV0aG9kcyBhbmQKICAgICAgICAgIHNoYWRvdyBjbGFzc2VzIHdpdGggUHl0aG9uIGFuZCBQZXJsNSBtb2R1bGVzLgoKNS8xOS85NyA6IE1vZGlmaWVkIHRoZSAlYXBwbHkgZGlyZWN0aXZlIHNsaWdodGx5IHNvIHRoYXQgaXQgd291bGQgd29yawogICAgICAgICAgd2l0aCBwb2ludGVycyBhIGxpdHRsZSBiZXR0ZXIuIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgICVhcHBseSB1bnNpZ25lZCBsb25nIHsgRFdPUkQgfTsKCiAgICAgICAgICBBcHBsaWVzICphbGwqIHR5cGVtYXBzIGFzc29jaWF0ZWQgd2l0aCAidW5zaWduZWQgbG9uZyIgdG8KICAgICAgICAgICJEV09SRCIuICAgVGhpcyBub3cgaW5jbHVkZXMgcG9pbnRlcnMgdG8gdGhlIHR3byBkYXRhdHlwZXMuCiAgICAgICAgICBGb3IgZXhhbXBsZSwgYSB0eXBlbWFwIGFwcGxpZWQgdG8gInVuc2lnbmVkIGxvbmcgKioiIHdvdWxkCiAgICAgICAgICBhbHNvIGJlIGFwcGxpZWQgdG8gYW55IG9jY3VycmVuY2Ugb2YgIkRXT1JEICoqIiBhcyB3ZWxsLgoKNS8xOS85NyA6IEZpeGVkIGFuIG93bmVyc2hpcCBhc3NpZ25tZW50IGJ1ZyBpbiB0aGUgUGVybDUgbW9kdWxlIHdoZW4KICAgICAgICAgIGNsYXNzIG1lbWJlcnMgd2VyZSByZXR1cm5pbmcgbmV3IG9iamVjdHMgYmVsb25naW5nIHRvCiAgICAgICAgICBkaWZmZXJlbnQgY2xhc3Nlcy4KCjUvMTcvOTcgOiBBZGRlZCBhIGZldyBtb3JlIHR5cGVtYXAgdmFyaWFibGVzLgoKICAgICAgICAgICAgICAgICAgJG5hbWUgICAgICAgICAgLSBOYW1lIG9mIGZ1bmN0aW9uL3ZhcmlhYmxlL21lbWJlcgogICAgICAgICAgICAgICAgICAkYmFzZXR5cGUgICAgICAtIEJhc2UgZGF0YXR5cGUgKHR5cGUgd2l0aG91dCBwb2ludGVycykKICAgICAgICAgICAgICAgICAgJGFyZ251bSAgICAgICAgLSBBcmd1bWVudCBudW1iZXIKCjUvMTYvOTcgOiBGaXhlZCBlbWJhcnJhc3NpbmcgdW5kZXJzY29yZSBlcnJvciBpbiBsb2NhbCB2YXJpYWJsZQogICAgICAgICAgYWxsb2NhdG9yLgoKNS8xNi85NyA6IEZpeGVkIG5hbWVzcGFjZSBjbGFzaCBidWcgaW4gcGFyYW1ldGVyaXplZCB0eXBlbWFwcwogICAgICAgICAgd2hlbiBjcmVhdGluZyBhcnJheXMgYXMgbmV3IGxvY2FsIHZhcmlhYmxlcy4KCjUvMTUvOTcgOiBGaXhlZCBzb21lIGJ1Z3Mgd2l0aCBpbmhlcml0YW5jZSBvZiBhZGRlZCBtZXRob2RzIGFjcm9zcwogICAgICAgICAgbXVsdGlwbGUgZmlsZXMuICAgU1dJRyBub3cgdXNlcyBuYW1lcyBvZiBiYXNlIGNsYXNzZXMKICAgICAgICAgIHdoZW4gZ2VuZXJhdGluZyBzdWNoIGZ1bmN0aW9ucy4KCjUvMTQvOTcgOiBGaW5pc2hlZCBzdXBwb3J0IGZvciBkZWZhdWx0IHR5cGVtYXBzLiAgUHJpbWFyaWx5IHVzZWQKICAgICAgICAgIGludGVybmFsbHksIHRoZXkgY2FuIGJlIHVzZWQgdG8gbWF0Y2ggdGhlIGJhc2ljCiAgICAgICAgICBidWlsdC1pbiBkYXRhdHlwZXMgdXNlZCBpbnNpZGUgb2YgU1dJRy4gICBZb3UgY2FuCiAgICAgICAgICBzcGVjaWZ5IHRoZW0gaW4gaW50ZXJmYWNlIGZpbGVzIGFzIHdlbGwgbGlrZSB0aGlzIDoKCiAgICAgICAgICAgICAgICV0eXBlbWFwKHRjbCxpbikgaW50IFNXSUdfREVGQVVMVF9UWVBFIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9IGF0b2koJHRhcmdldCk7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBVbmxpa2Ugbm9ybWFsIHR5cGVtYXBzLCB0aGlzIGRlZmF1bHQgbWFwIHdpbGwgZ2V0IGFwcGxpZWQKICAgICAgICAgIHRvICphbGwqIGludGVnZXIgZGF0YXR5cGVzIGVuY291bnRlcmVkLCBpbmNsdWRpbmcgdGhvc2UKICAgICAgICAgIHJlbmFtZWQgd2l0aCB0eXBlZGVmLCBldGMuLi4KCjUvMTMvOTcgOiBGaXhlZCBzdWJzdHJpbmcgYnVnIGluIHR5cGUgY2hlY2tlci4KCjUvMTIvOTcgOiBGaXhlZCBidWcgaW4gcGFyYW1ldGVyaXplZCB0eXBlbWFwcyB3aGVuIGRlY2xhcmluZyBsb2NhbAogICAgICAgICAgdmFyaWFibGVzIG9mIHN0cnVjdHVyZXMuCgpWZXJzaW9uIDEuMSBCZXRhNiAoTWF5IDksIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjUvOS85NyAgOiBGaXhlZCBiaXphcnJlIE5VTEwgcG9pbnRlciBoYW5kbGluZyBidWcgaW4gUGVybDUgbW9kdWxlLgoKNS84Lzk3ICA6IEZpeGVkIG15c3RlcmlvdXMgc2VnbWVudGF0aW9uIGZhdWx0IHdoZW4gcnVubmluZyBTV0lHIG9uIGFuCiAgICAgICAgICBlbXB0eSBmaWxlLgoKNS83Lzk3ICA6IFRoZSBjb2RlIGdlbmVyYXRvciB3aWxsIG5vdyByZXBsYWNlIHRoZSBzcGVjaWFsIHN5bWJvbCAiJGNsZWFudXAiCiAgICAgICAgICB3aXRoIHRoZSBjbGVhbnVwIGNvZGUgc3BlY2lmaWVkIHdpdGggdGhlICJmcmVlYXJnIiB0eXBlbWFwLgogICAgICAgICAgVGhpcyBjaGFuZ2UgbmVlZGVkIHRvIHByb3Blcmx5IG1hbmFnZSBtZW1vcnkgYW5kIGV4Y2VwdGlvbnMuCgo1LzUvOTcgIDogQWRkZWQgdGhlICd0eXBlbWFwcy5pJyBsaWJyYXJ5IGZpbGUuICBUaGlzIGNvbnRhaW5zIGEKICAgICAgICAgIHZhcmlldHkgb2YgY29tbW9uIHR5cGVtYXBzIGZvciBpbnB1dCB2YWx1ZXMsIHBvaW50ZXJzLAogICAgICAgICAgYW5kIHNvIG9uLgoKNS81Lzk3ICA6IENoYW5nZWQgYmVoYXZpb3Igb2YgImFyZ291dCIgdHlwZW1hcCBpbiBQeXRob24gbW9kdWxlLgogICAgICAgICAgT2xkIHZlcnNpb25zIGF1dG9tYXRpY2FsbHkgdHVybmVkIHRoZSByZXN1bHQgaW50byBhCiAgICAgICAgICBQeXRob24gbGlzdC4gIFRoZSBuZXcgdmVyc2lvbiBkb2VzIG5vdGhpbmcsIGxlYXZpbmcgdGhlCiAgICAgICAgICBpbXBsZW1lbnRhdGlvbiB1cCB0byB0aGUgdXNlci4gIFRoaXMgcHJvdmlkZXMgbW9yZSBmbGV4aWJpbGl0eQogICAgICAgICAgYnV0IG1heSBicmVhayBvbGRlciBjb2RlcyB0aGF0IHJlbHkgb24gdHlwZW1hcHMuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjUvNS85NyAgOiBGaXhlZCBidWcgaW4gUHl0aG9uIG1vZHVsZSByZWxhdGVkIHRvIHRoZSBpbnRlcmFjdGlvbiBvZgogICAgICAgICAgImFyZ291dCIgYW5kICJpZ25vcmUiIHR5cGVtYXBzLgoKNS81Lzk3ICA6IEZpeGVkIGJ1ZyBpbiBQeXRob24gbW9kdWxlIHRoYXQgd291bGQgZ2VuZXJhdGUgaW5jb3JyZWN0IGNvZGUKICAgICAgICAgIGlmIGFsbCBmdW5jdGlvbiBhcmd1bWVudHMgYXJlICJpZ25vcmVkIi4KCjUvNC85NyAgOiBBZGRlZCAlYXBwbHkgYW5kICVjbGVhciBkaXJlY3RpdmVzLiAgIFRoZXNlIGZvcm0gYSBoaWdoZXIgbGV2ZWwKICAgICAgICAgIGludGVyZmFjZSB0byB0aGUgdHlwZW1hcCBtZWNoYW5pc20uICBJbiBhIG51dHNoZWxsLCB0aGV5CiAgICAgICAgICBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIHByb2Nlc3Npbmcgb2YgdmFyaW91cyBkYXRhdHlwZXMgd2l0aG91dAogICAgICAgICAgZXZlciBoYXZpbmcgdG8gd3JpdGUgYSB0eXBlbWFwLiAgU2VlIHRoZSBTV0lHIGRvY3VtZW50YXRpb24KICAgICAgICAgIGZvciBtb3JlIGRldGFpbHMuICAqKiBORVcgRkVBVFVSRSAqKgoKNS80Lzk3ICA6IEFkZGVkIGEgbG9jYWwgdmFyaWFibGUgZXh0ZW5zaW9uIHRvIHRoZSB0eXBlbWFwIGhhbmRsZXIuCiAgICAgICAgICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgICV0eXBlbWFwKHRjbCxpbikgZG91YmxlICooZG91YmxlIHRlbXApIHsKCQkgICAgICAgIHRlbXAgPSBhdG9mKCRzb3VyY2UpOwogICAgICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID0gJnRlbXA7CiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgIEluIHRoaXMgY2FzZSwgJ3RlbXAnIGlzIGEgbG9jYWwgdmFyaWFibGUgdGhhdCBleGlzdHMKICAgICAgICAgIGluIHRoZSBlbnRpcmUgd3JhcHBlciBmdW5jdGlvbiAobm90IGp1c3QgdGhlIHR5cGVtYXAKICAgICAgICAgIGNvZGUpLiAgVGhpcyBtZWNoYW5pc20gcHJvdmlkZXMgYmV0dGVyIHN1cHBvcnQgZm9yCiAgICAgICAgICBjZXJ0YWluIHR5cGVzIG9mIGFyZ3VtZW50IGhhbmRsaW5nIGFuZCBhbHNvIG1ha2VzIGl0CiAgICAgICAgICBwb3NzaWJsZSB0byB3cml0ZSB0aHJlYWQtc2FmZSB0eXBlbWFwcy4gIEFueSBudW1iZXIKICAgICAgICAgIGxvY2FsIHZhcmlhYmxlcyBjYW4gYmUgZGVjbGFyZWQgYnkgc3VwcGx5aW5nIGEgY29tbWEKICAgICAgICAgIHNlcGFyYXRlZCBsaXN0LiAgIExvY2FsIHZhcmlhYmxlcyBhcmUgZ3VhcmFudGVlZCB0byBiZQogICAgICAgICAgdW5pcXVlLCBldmVuIGlmIHRoZSBzYW1lIHR5cGVtYXAgaXMgYXBwbGllZCBtYW55IHRpbWVzCiAgICAgICAgICBpbiBhIGdpdmVuIGZ1bmN0aW9uLgogICAgICAgICAgKiogTm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgaW4gUGVybDQgb3IgR3VpbGUgbW9kdWxlcy4KCjUvMi85NyAgOiBGaXhlZCBwcm9jZXNzaW5nIG9mICVpZmRlZiwgJWVuZGlmLCAlaWYsIGV0Yy4uLiAgKFRoZXNlIGFyZQogICAgICAgICAgU1dJRyBlcXVpdmFsZW50cyBvZiB0aGUgQyBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcyB0aGF0CiAgICAgICAgICBjYW4gcGFzcyB0aHJvdWdoIHRoZSBDIHByZXByb2Nlc3NvciB3aXRob3V0IG1vZGlmaWNhdGlvbikuCgo1LzIvOTcgIDogRml4ZWQgbWFqb3IgKGJ1dCBzdWJ0bGUpIGJ1ZyBpbiB0aGUgcnVuLXRpbWUgdHlwZSBjaGVja2VyCiAgICAgICAgICByZWxhdGVkIHRvIHNlYXJjaGluZyBhbmQgdHlwZS1jaGVja2luZyBmb3IgQysrIGluaGVyaXRhbmNlLgogICAgICAgICAgVG8gbWFrZSBhIGxvbmcgc3Rvcnkgc2hvcnQsIGlmIHlvdSBoYWQgdHdvIGNsYXNzZXMgbmFtZWQKICAgICAgICAgICJGb28iIGFuZCAiRm9vT2JqZWN0IiB0aGUgdHlwZSBjaGVja2VyIHdvdWxkIHNvbWV0aW1lcwogICAgICAgICAgZ2V0IGNvbmZ1c2VkIGFuZCBiZSB1bmFibGUgdG8gbG9jYXRlICJGb28iIGluIGFuIGludGVybmFsCiAgICAgICAgICB0YWJsZS4KCjUvMi85NyAgOiBGaXhlZCBzb21lIGJ1Z3MgaW4gdGhlIC1jbyBvcHRpb24uCgo0LzI0Lzk3IDogUG9pbnRlciBsaWJyYXJ5IGFkZGVkIHRvIHRoZSBTV0lHIGxpYnJhcnkuCgo0LzE5Lzk3IDogQWRkZWQgdGhlICVuZXcgZGlyZWN0aXZlLiAgIFRoaXMgaXMgYSAiaGludCIgdGhhdCBjYW4gYmUgdXNlZAogICAgICAgICAgdG8gdGVsbCBTV0lHIHRoYXQgYSBmdW5jdGlvbiBpcyByZXR1cm5pbmcgYSBuZXcgb2JqZWN0LiBGb3IKICAgICAgICAgIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAgJW5ldyBGb28gKmNyZWF0ZV9mb28oKTsKCiAgICAgICAgICBUaGlzIHRlbGxzIFNXSUcgdGhhdCBjcmVhdGVfZm9vKCkgaXMgY3JlYXRpbmcgYSBuZXcgb2JqZWN0CiAgICAgICAgICBhbmQgcmV0dXJuaW5nIGEgcG9pbnRlciB0byBpdC4gICBNYW55IGxhbmd1YWdlIG1vZHVsZXMgbWF5CiAgICAgICAgICBjaG9vc2UgdG8gaWdub3JlIHRoZSBoaW50LCBidXQgd2hlbiB3b3JraW5nIHdpdGggc2hhZG93IGNsYXNzZXMsCiAgICAgICAgICB0aGUgJW5ldyBpcyB1c2VkIHRvIGhhbmRsZSBwcm9wZXIgb3duZXJzaGlwIG9mIG9iamVjdHMuCgogICAgICAgICAgJW5ldyBjYW4gYWxzbyBiZSB1c2VkIHdpdGggZHluYW1pY2FsbHkgYWxsb2NhdGVkIHN0cmluZ3MuCiAgICAgICAgICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgICAlbmV3IGNoYXIgKmNyZWF0ZV9zdHJpbmcoKTsKCiAgICAgICAgICBXaGVuIHVzZWQsIGFsbCBvZiB0aGUgbGFuZ3VhZ2UgbW9kdWxlcyB3aWxsIGF1dG9tYXRpY2FsbHkgY2xlYW51cAogICAgICAgICAgdGhlIHJldHVybmVkIHN0cmluZy0tZWxpbWluYXRpbmcgbWVtb3J5IGxlYWtzLgogICAgICAgICAgKiogTkVXIEZFQVRVUkUgKioKCjQvMTkvOTcgOiBBZGRlZCBhIG5ldyB0eXBlbWFwICJuZXdmcmVlIi4gICBUaGlzIGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aAogICAgICAgICAgdGhlICVuZXcgZGlyZWN0aXZlIGFuZCBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIG1ldGhvZCBieSB3aGljaAogICAgICAgICAgYSBuZXcgb2JqZWN0IHJldHVybmVkIGJ5IGEgZnVuY3Rpb24gaXMgZGVsZXRlZC4KCjQvMTkvOTcgOiBUaGUgc3ltYm9sICJfX2NwbHVzcGx1cyIgaXMgbm93IGRlZmluZWQgaW4gdGhlIFNXSUcgaW50ZXJwcmV0ZXIKICAgICAgICAgIHdoZW4gcnVubmluZyB3aXRoIHRoZSAtYysrIG9wdGlvbi4KCjQvMTcvOTcgOiBBZGRlZCBzdXBwb3J0IGZvciBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9ucyB3aGVuIHVzZWQgaW5zaWRlIHRoZQogICAgICAgICAgJWFkZG1ldGhvZHMgZGlyZWN0aXZlLgoKNC8xNS85NyA6IEFkZGVkIGEgc3BlY2lhbCB0eXBlbWFwIHN5bWJvbCBQUkVWSU9VUyB0aGF0IGNhbiBiZSB1c2VkIHRvCiAgICAgICAgICByZXN0b3JlIGEgcHJldmlvdXMgdHlwZW1hcC4gRm9yIGV4YW1wbGUgOgoKCSAgICAgICAgICV0eXBlbWFwKHRjbCxpbikgaW50ICogPSBQUkVWSU9VUzsKCiAgICAgICAgICBUaGlzIGlzIHByaW1hcmlseSB1c2VkIGluIGxpYnJhcnkgZmlsZXMuCgo0LzEzLzk3IDogQWRkZWQgJXByYWdtYSBkaXJlY3RpdmUgZm9yIFBlcmw1IG1vZHVsZS4gICBUd28gbmV3IHByYWdtYXMgYXJlCiAgICAgICAgICBhdmFpbGFibGUgOgoKICAgICAgICAgICAgICAgICAlcHJhZ21hKHBlcmw1KSBjb2RlID0gInN0cmluZyIKICAgICAgICAgICAgICAgICAlcHJhZ21hKHBlcmw1KSBpbmNsdWRlID0gImZpbGUucGwiCgogICAgICAgICAgQm90aCBpbnNlcnQgY29kZSBpbnRvIHRoZSAucG0gZmlsZSBjcmVhdGVkIGJ5IFNXSUcuICBUaGlzIGNhbgogICAgICAgICAgYmUgdXNlZCB0byBhdXRvbWF0aWNhbGx5IGN1c3RvbWl6ZSB0aGUgLnBtIGZpbGUgY3JlYXRlZCBieSBTV0lHLgoKNC8xMy85NyA6IFNjYW5uZXIgbW9kaWZpZWQgdG8gb25seSByZWNvZ25pemUgQysrIGtleXdvcmRzIHdoZW4gdGhlIC1jKysKICAgICAgICAgIG9wdGlvbiBoYXMgYmVlbiBzcGVjaWZpZWQuICBUaGlzIHByb3ZpZGVzIHN1cHBvcnQgZm9yIEMgcHJvZ3JhbXMKICAgICAgICAgIHRoYXQgbWFrZSB1c2Ugb2YgdGhlc2Uga2V5d29yZHMgZm9yIGlkZW50aWZpZXJzLgogICAgICAgICAgU1dJRyBtYXkgbmVlZCB0byBiZSBleHBsaWNpdGx5IHJ1biB3aXRoIHRoZSAtYysrIG9wdGlvbiB3aGVuCiAgICAgICAgICBjb21waWxpbmcgQysrIGNvZGUgKHRoaXMgd2FzIGFsbG93ZWQsIGJ1dCBub3QgcmVjb21tZW5kZWQgaW4KICAgICAgICAgIHByZXZpb3VzIHZlcnNpb25zKS4gKipQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZKioKCjQvMTEvOTcgOiBGaXhlZCBhIHJhdGhlciBuYXN0eSBidWcgaW4gdGhlIFBlcmw1IG1vZHVsZSByZWxhdGVkIHRvIHVzaW5nCiAgICAgICAgICB2YXJpYWJsZSBsaW5raW5nIHdpdGggY29tcGxleCBkYXRhdHlwZXMgYW5kIHBvaW50ZXJzLiAgIE9uIFVuaXgsCiAgICAgICAgICBjb2RlIHdvdWxkIHdvcmsgKHNvbWVob3cpLCBidXQgd291bGQgY2F1c2UgYW4gYWNjZXNzIHZpb2xhdGlvbgogICAgICAgICAgdW5kZXIgV2luZG93cy1OVC4gIFRoZSBmaXggc2hvdWxkIGNvcnJlY3QgdGhlIHByb2JsZW0sCiAgICAgICAgICBidXQgdGhlcmUgbWF5IHN0aWxsIGJlIGEgcHJvYmxlbSB1c2luZyBnbG9iYWwgdmFyaWFibGVzIG9mCiAgICAgICAgICBjb21wbGV4IGRhdGF0eXBlcyBpbiBjb25qdW5jdGlvbiB3aXRoIHNoYWRvdyBjbGFzc2VzLiAgRm9ydHVuYXRlbHksCiAgICAgICAgICB0aGlzIHNvcnQgb2YgdGhpbmcgc2VlbXMgdG8gYmUgcmVsYXRpdmVseSByYXJlIChjb25zaWRlcmluZwogICAgICAgICAgdGhhdCB0aGUgYnVnIGhhcyBiZWVuIGFyb3VuZCBmb3IgbW9yZSB0aGFuIGEgeWVhciAtIHlpa2VzISkuCgo0LzExLzk3IDogRml4ZWQgYml6YXJyZSBjb25zdGFudCBldmFsdWF0aW9uIGJ1ZyBpbiBQZXJsNSBjb2RlIGdlbmVyYXRpb24KICAgICAgICAgIHdoZW4gcnVubmluZyB1bmRlciBXaW5kb3dzLU5ULgoKNC84Lzk3ICA6IEJ1ZyB3aGVuIHVzaW5nIGRlZmF1bHQgYXJndW1lbnRzIGFuZCBDKysgcmVmZXJlbmNlcyBmaXhlZC4KCjQvOC85NyAgOiBGaXhlZCBjb2RlIGdlbmVyYXRpb24gYnVncyBpbiBQeXRob24gYW5kIFBlcmw1IG1vZHVsZXMgcmVsYXRlZCB0bwogICAgICAgICAgdXNpbmcgY2xhc3MgcmVuYW1pbmcgKGFwcGx5aW5nIHRoZSAlbmFtZSBkaXJlY3RpdmUgdG8gYSBjbGFzcwogICAgICAgICAgZGVmaW5pdGlvbikgYW5kIHNoYWRvdyBjbGFzc2VzLgoKNC83Lzk3ICA6IEZpeGVkIG1pbm9yIGJ1Z3MgaW4gc3dpZ3B0ci5zd2csIHRjbDhwdHIuc3dnLCBhbmQgcGVybDVwdHIuc3dnIHRvCiAgICAgICAgICBwcmV2ZW50IGluZmluaXRlIGxvb3BzIHdoZW4gd2VpcmQgZGF0YXR5cGVzIGFyZSBwYXNzZWQuCgozLzI5Lzk3IDogJ01ha2VmaWxlLndpbicgYWRkZWQuICAgVGhpcyBpcyB1c2VkIHRvIGJ1aWxkIG1vc3Qgb2YgdGhlIGV4YW1wbGVzCiAgICAgICAgICBpbiB0aGUgRXhhbXBsZXMgZGlyZWN0b3J5IHVuZGVyIFdpbmRvd3MgTlQvOTUuCgozLzI3Lzk3IDogRml4ZXMgdG8gU1dJRydzIGVycm9yIHJldHVybiBjb2Rlcy4gICBTV0lHIG5vdyByZXR1cm5zIG5vbi16ZXJvCiAgICAgICAgICBleGl0IGNvZGVzIGZvciBjZXJ0YWluIGtpbmRzIG9mIGVycm9ycyAod2hpY2ggbWFrZXMgaXQgbW9yZQogICAgICAgICAgZnJpZW5kbHkgdG8gbWFrZWZpbGVzKS4gICAgIEFuIG92ZXJoYXVsIG9mIHRoZSBlcnJvciBoYW5kbGluZwogICAgICAgICAgaXMgb24gdGhlIHRvLWRvIGxpc3QgYW5kIHdpbGwgcHJvYmFibHkgc2hvdyB1cCBpbiBhIGxhdGVyIHJlbGVhc2UuCgozLzI1Lzk3IDogQnVnIGZpeC4gICJmcmVlYXJnIiBhbmQgImFyZ291dCIgdHlwZW1hcHMgaGF2ZSBiZWVuIGZpeGVkIGluCiAgICAgICAgICB0aGUgUGVybDUgbW9kdWxlLiAgSW4gcHJldmlvdXMgdmVyc2lvbnMsIGZ1bmN0aW9uIGlucHV0IHBhcmFtZXRlcnMKICAgICAgICAgIGFuZCBmdW5jdGlvbiBvdXRwdXQgcGFyYW1ldGVycyBzaGFyZWQgdGhlIHNhbWUgbWVtb3J5IHNwYWNlLS1jYXVzaW5nCiAgICAgICAgICBhbGwgc29ydHMgb2YgbmFzdHkgcHJvYmxlbXMgd2hlbiB0cnlpbmcgdG8gcGFzcyBwZXJsIHZhbHVlcyBieQogICAgICAgICAgcmVmZXJlbmNlLiAgIFNXSUcgbm93IGludGVybmFsbHkgbWFrZXMgYSAiY29weSIgKHdoaWNoIGlzIHJlYWxseQogICAgICAgICAganVzdCBhIHBvaW50ZXIpIG9mIGFmZmVjdGVkIHBhcmFtZXRlcnMgYW5kIHVzZXMgdGhhdC4gICBUaGlzCiAgICAgICAgICBpcyBkb25lIHRyYW5zcGFyZW50bHkgc28gdGhlcmUgaXMgbm8gbm90aWNhYmxlIGltcGFjdCBvbiBhbnkKICAgICAgICAgIFNXSUcgZ2VuZXJhdGVkIG1vZHVsZXMuICAgVGhpcyBjaGFuZ2UgaXMgcHJvYmFibHkgb25seSBub3RpY2FibGUKICAgICAgICAgIHRvIGV4cGVydCB1c2Vycy4KCjMvMjUvOTcgOiBBZGRlZCB0eXBlLWNoZWNrIHRvIHZlcmJvc2UgYW5kIHN0YXQgbW9kZS4gIFNXSUcgd2lsbCBub3cgZ2VuZXJhdGUgYSBsaXN0CiAgICAgICAgICBvZiBhbGwgZGF0YXR5cGVzIHRoYXQgd2VyZSB1c2VkIGJ1dCB1bmRlZmluZWQgKHVzZWZ1bCBmb3IgdHJhY2tpbmcKICAgICAgICAgIGRvd24gd2VpcmQgYnVncykuICAgVGhpcyBpcyBlbmFibGVkIHdpdGggdGhlIC12IG9wdGlvbiAod2hpY2gKICAgICAgICAgIGlzIG5vdyBvZmZpY2lhbGx5IGtub3duIGFzICJvdmVybHkgdmVyYm9zZSIgbW9kZSkgb3IgdGhlIC1zdGF0IG9wdGlvbi4KCjMvMjUvOTcgOiBTbGlnaHQgY2hhbmdlIHRvIHRoZSBwYXJzZXIgdG8gbWFrZSBpbmNsdWRlIGd1YXJkcyB3b3JrIGNvcnJlY3RseS4KICAgICAgICAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAjaWZuZGVmIElOVEVSRkFDRV9JCiAgICAgICAgICAgICAgICAjZGVmaW5lIElOVEVSRkFDRV9JCiAgICAgICAgICAgICAgICAlbW9kdWxlIGZvb2Jhci5pCiAgICAgICAgICAgICAgICAuLi4gZGVjbGFyYXRpb25zIC4uLgogICAgICAgICAgICAgICAgI2VuZGlmCgozLzI0Lzk3IDogJWNoZWNrb3V0IGRpcmVjdGl2ZSBhZGRlZC4gICBUaGlzIGFsbG93cyBhbiBpbnRlcmZhY2UgZmlsZSB0bwogICAgICAgICAgZXh0cmFjdCBmaWxlcyBmcm9tIHRoZSBTV0lHIGxpYnJhcnkgYW5kIHBsYWNlIHRoZW0gaW4gdGhlCiAgICAgICAgICBjdXJyZW50IGRpcmVjdG9yeS4gICBUaGlzIGNhbiBiZSB1c2VkIHRvIGV4dHJhY3Qgc2NyaXB0cyBhbmQKICAgICAgICAgIG90aGVyIGhlbHBlciBjb2RlIHRoYXQgbWlnaHQgYmUgYXNzb2NpYXRlZCB3aXRoIGxpYnJhcnkgZmlsZXMuCiAgICAgICAgICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgJWNoZWNrb3V0IGFycmF5LnRjbAoKICAgICAgICAgIFdpbGwgbG9vayBmb3IgYSBmaWxlICJhcnJheS50Y2wiIGluIHRoZSBsaWJyYXJ5IGFuZCBjb3B5IGl0CiAgICAgICAgICB0byB0aGUgY3VycmVudCBkaXJlY3RvcnkuICAgIElmIHRoZSBmaWxlIGFscmVhZHkgZXhpc3RzIGluIHRoZQogICAgICAgICAgZGlyZWN0b3J5LCB0aGlzIGRpcmVjdGl2ZSBkb2VzIG5vdGhpbmcgKGl0IHdpbGwgbm90IG92ZXJ3cml0ZSBhbgogICAgICAgICAgZXhpc3RpbmcgZmlsZSkuICBUaGlzIG9ubHkgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgZm9yIG5vdy4KCjMvMjQvOTcgOiBTV0lHIHdpbGwgbm93IGxvb2sgaW4gdGhlIFNXSUcgTGlicmFyeSBmb3IgYSBmaWxlIGlmIGl0IGNhbid0CiAgICAgICAgICBmaW5kIGl0IGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gIEFzIGEgcmVzdWx0LCBpdCBpcyBlYXN5IHRvCiAgICAgICAgICBtYWtlIG1vZHVsZXMgZnJvbSBTV0lHIGxpYnJhcnkgZmlsZXMuICBGb3IgZXhhbXBsZSwgaWYgeW91CiAgICAgICAgICB3YW50IHRvIG1ha2UgYSBQeXRob24gbW9kdWxlIGZyb20gdGhlIFNXSUcgdGltZXJzIGxpYnJhcnksIGp1c3QKICAgICAgICAgIHR5cGUgdGhpcyBpbiBhbnkgZGlyZWN0b3J5IDoKCiAgICAgICAgICAgICAgICBzd2lnIC1weXRob24gdGltZXJzLmkKCiAgICAgICAgICBZb3Ugd2lsbCBnZXQgdGhlIGZpbGVzIHRpbWVyc193cmFwLmMgYW5kIHRpbWVyc193cmFwLmRvYyBpbgogICAgICAgICAgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHRoYXQgeW91IGNhbiBub3cgY29tcGlsZS4gICBUaGUgZmlsZQogICAgICAgICAgcmVtYWlucyBpbiB0aGUgU1dJRyBsaWJyYXJ5IChhbHRob3VnaCB5b3UgY2FuIGNoZWNrIGl0IG91dAogICAgICAgICAgdXNpbmcgdGhlIC1jbyBvcHRpb24pLiAgKioqIE5ldyBGZWF0dXJlICoqKgoKMy8yNC85NyA6IC1jbyBvcHRpb24gYWRkZWQgdG8gU1dJRyB0byBhbGxvdyBlYXN5IGFjY2VzcyB0byB0aGUgU1dJRyBsaWJyYXJ5LgogICAgICAgICAgV2hlbiB1c2VkLCB0aGlzIGluc3RydWN0cyBTV0lHIHRvIGNoZWNrIG91dCBhIGxpYnJhcnkgZmlsZSBhbmQKICAgICAgICAgIHBsYWNlIGl0IGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICB1bml4ID4gc3dpZyAtY28gYXJyYXkuaQogICAgICAgICAgICAgICAgYXJyYXkuaSBjaGVja2VkIG91dCBmcm9tIHRoZSBTV0lHIGxpYnJhcnkKICAgICAgICAgICAgICAgIHVuaXggPgoKICAgICAgICAgIE9uY2UgaW4geW91ciBkaXJlY3RvcnkgeW91IGNhbiBjdXN0b21pemUgdGhlIGZpbGUgdG8gc3VpdCB5b3VyCiAgICAgICAgICBwYXJ0aWN1bGFyIHB1cnBvc2VzLiAgVGhlIGNoZWNrb3V0IG9wdGlvbiBtYWtlcyBpdCBlYXN5IHRvCiAgICAgICAgICBncmFiIGxpYnJhcnkgZmlsZXMgd2l0aG91dCBrbm93aW5nIGFueXRoaW5nIGFib3V0IHRoZSBTV0lHCiAgICAgICAgICBpbnN0YWxsYXRpb24sIGJ1dCBpdCBhbHNvIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHN0YXJ0CiAgICAgICAgICBpbmNsdWRpbmcgc2NyaXB0cywgQyBjb2RlLCBhbmQgb3RoZXIgbWlzY2VsbGFuZW91cyBmaWxlcwogICAgICAgICAgaW4gdGhlIGxpYnJhcnkuICBGb3IgZXhhbXBsZSwgeW91IGNvdWxkIHB1dCBhIGNvb2wgc2NyaXB0CiAgICAgICAgICBpbiB0aGUgbGlicmFyeSBhbmQgY2hlY2sgaXQgb3V0IHdoZW5ldmVyIHlvdSB3YW50ZWQgdG8gdXNlIGl0LgogICAgICAgICAgKioqIE5ldyBGZWF0dXJlICoqKgoKMy8yNC85NyA6ICNwcmFnbWEgZXhwb3J0IGRpcmVjdGl2ZXMgYWRkZWQgdG8gVGNsIG91dHB1dCBmb3IgY29tcGlsaW5nCiAgICAgICAgICBzaGFyZWQgbGlicmFyaWVzIG9uIHRoZSBNYWMuCgozLzI0Lzk3IDogTWlub3IgY2hhbmdlcyB0byB3aXNoLmkgYW5kIHRjbHNoLmkgbGlicmFyeSBmaWxlcyB0byBwcm92aWRlCiAgICAgICAgICBzdXBwb3J0IGZvciB0aGUgTWFjaW50b3NoLgoKMy8xOS85NyA6IFNXSUcncyBwb2xpY3kgdG93YXJkcyBOVUxMIHBvaW50ZXJzIGhhcyBiZWVuIHJlbGF4ZWQuICBUaGUKICAgICAgICAgIHBvbGljeSBvZiByZXF1aXJpbmcgYSBzcGVjaWFsIGNvbXBpbGVyIGRpcmVjdGl2ZSAtREFMTE9XX05VTEwKICAgICAgICAgIHRvIHVzZSBOVUxMIHBvaW50ZXJzIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuICBXaGlsZSB0aGlzIG1heQogICAgICAgICAgc2VlbSAidW5zYWZlIiwgaXQgdHVybnMgb3V0IHRoYXQgeW91IGNhbiB1c2UgYSAiY2hlY2siCiAgICAgICAgICB0eXBlbWFwIHRvIGFjaGlldmUgc29tZSBzYWZldHkuICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKHBlcmw1LGNoZWNrKSBOb2RlICogewogICAgICAgICAgICAgICAgICAgICAgIGlmICghJHRhcmdldCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyb2FrKCJOVUxMIFBvaW50ZXJzIG5vdCBhbGxvd2VkLiIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFRoaXMgcHJldmVudHMgYW55IE5VTEwgdmFsdWUgb2YgYSAiTm9kZSAqIiBwb2ludGVyIHRvIGJlCiAgICAgICAgICBwYXNzZWQgdG8gYSBmdW5jdGlvbi4gICAoSSB0aGluayB0aGlzIGlzIG11Y2ggY2xlYW5lcgogICAgICAgICAgdGhhbiB0aGUgb2xkIC1EQUxMT1dfTlVMTCBoYWNrIGFueXdheXMpLgoKMy8xOS85NyA6IEZpeGVkIHBvaW50ZXIgaGFuZGxpbmcgZXJyb3JzIGluIFBlcmw1IG1vZHVsZS4gIE1vZHVsZXMgbm8KICAgICAgICAgIGxvbmdlciBjb3JlIGR1bXAgd2hlbiBhIFBlcmwgcmVmZXJlbmNlIGlzIGluYWR2ZXJ0ZW50bHkKICAgICAgICAgIHBhc3NlZCBpbiBhcyBhIEMgcG9pbnRlci4KCjMvMTgvOTcgOiBBZGRlZCBhICJjaGVjayIgdHlwZW1hcC4gICBUaGlzIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHRoZQogICAgICAgICAgdmFsaWRpdHkgb2YgZnVuY3Rpb24gaW5wdXQgdmFsdWVzLiAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKHBlcmw1LGNoZWNrKSBpbnQgcG9zaW50IHsKICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHRhcmdldCA8IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyb2FrKCJBcmd1bWVudCBpcyBub3QgYSBwb3NpdGl2ZSBpbnRlZ2VyIik7CiAgICAgICAgICAgICAgICB9CgozLzE4Lzk3IDogQWRkZWQgYW4gJGFyZyB2YXJpYWJsZSB0byBUY2wgdHlwZW1hcHMuICAgVGhpcyBtYWtlcyBpdCBlYXNpZXIKICAgICAgICAgIHRvIHJldHVybiBhcmd1bWVudCB2YWx1ZXMgYnkgInJlZmVyZW5jZSIuCgozLzE4Lzk3IDogRml4ZWQgYSBjb2RlIGdlbmVyYXRpb24gYnVnIHdoZW4gdXNpbmcgQysrIHJlZmVyZW5jZXMgYW5kCiAgICAgICAgICB0aGUgJWFkZG1ldGhvZHMgZGlyZWN0aXZlLgoKMy8xOC85NyA6IEZpeGVkIGEgZmV3IGdsaXRjaGVzIGluIHRoZSB0eXBlbWFwIG1vZHVsZSB3aXRoIHJlc3BlY3QgdG8KICAgICAgICAgIGNoYWluaW5nLiBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAodGNsLGluKSBpbnQgewogICAgICAgICAgICAgICAgICAgICAgICRpbiAgICAgICAgICAgICAgICAvLyBJbnNlcnRzIHByZXhpc3RpbmcgdHlwZW1hcAogICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiUmVjZWl2ZWQgYSAlZFxuIiwgJHRhcmdldCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgVGhpcyBoYXMgYmVlbiBhbGxvd2VkIGZvciBxdWl0ZSBzb21lIHRpbWUsIGJ1dCBkaWRuJ3Qgd29yawogICAgICAgICAgaWYgbm8gZXhpc3RpbmcgdHlwZW1hcCB3YXMgZGVmaW5lZC4gIE5vdywgaXQgc3RpbGwgZG9lc24ndAogICAgICAgICAgd29yayBpZiBubyBleGlzdGluZyB0eXBlbWFwIGlzIGRlZmluZWQsIGJ1dCBpdCBpc3N1ZXMgYQogICAgICAgICAgd2FybmluZyBtZXNzYWdlLiAgIFRoZXJlIGlzIHNvbWUgc3VwcG9ydCB1c2luZyBkZWZhdWx0IHR5cGVtYXBzLAogICAgICAgICAgYnV0IG5vbmUgb2YgdGhlIGxhbmd1YWdlIG1vZHVsZXMgdGFrZSBhZHZhbnRhZ2Ugb2YgaXQuICBUaGlzCiAgICAgICAgICBzaG91bGQgYmUgY29uc2lkZXJlZCBleHBlcmltZW50YWwgYXQgdGhpcyB0aW1lLgoKVmVyc2lvbiAxLjFiNSBQYXRjaCAxIChNYXJjaCAxNiwgMTk5NykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjMvMTYvOTcgOiBGaXhlZCByZWZlcmVuY2VzIGJ1ZyB3aXRoIEMrKyBjb2RlIGdlbmVyYXRpb24uCgozLzE2Lzk3IDogRml4ZWQgaW5pdGlhbGl6YXRpb24gYnVnIGluIHRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbSB0aGF0CiAgICAgICAgICB3YXMgY2F1c2luZyB3ZWlyZCBwcm9ibGVtcy4KCjMvMTYvOTcgOiBGaXhlZCBmYXRhbCBidWcgd2l0aCAtYyBvcHRpb24gaW4gdGhlIFB5dGhvbiBtb2R1bGUuCgozLzEzLzk3IDogRml4ZWQgYnVnIGluIHRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbSBpbnZvbHZpbmcgdGhlICV0ZXh0IGRpcmVjdGl2ZQogICAgICAgICAgYW5kIHNvcnRpbmcuIEluIHRoZSBvbGQgc3lzdGVtLCAldGV4dCBlbnRyaWVzIHdvdWxkIGZsb2F0IHRvIHRoZQogICAgICAgICAgdG9wIG9mIGEgc2VjdGlvbiBiZWNhdXNlIHRoZXkgd2VyZSAibmFtZWxlc3MiLiAgIE5vdyB0aGV5IGFyZQogICAgICAgICAgYXR0YWNoZWQgdG8gdGhlIHByZXZpb3VzIGRlY2xhcmF0aW9uIGFuZCB3aWxsIHN0YXkgaW4gdGhlIHByb3BlcgogICAgICAgICAgbG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlIHByZXZpb3VzIGVudHJ5LgoKVmVyc2lvbiAxLjFiNSAoTWFyY2ggMTIsIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMy8xMS85NyA6IEZpeGVkIGNvbXBpbGF0aW9uIHByb2JsZW1zIGludHJvZHVjZWQgYnkgVGNsL1RrIDguMGEyLgogICAgICAgICAgKioqIElOQ09NUEFUSUJJTElUWSAqKiogU1dJRyBubyBsb25nZXIgd29ya3Mgd2l0aCBUY2wvVGsgOC4wYTEuCgozLzEwLzk3IDogRml4ZWQgYnVnIHdpdGggaWdub3JlZCBhcmd1bWVudHMgYW5kIEMrKyBtZW1iZXIgZnVuY3Rpb25zIGluCiAgICAgICAgICB0aGUgUHl0aG9uIG1vZHVsZS4KCjMvOS85NyAgOiBQYXJzaW5nIGJ1Z3Mgd2l0aCBuZXN0ZWQgY2xhc3MgZGVmaW5pdGlvbnMgYW5kIHByaXZhdGVseQogICAgICAgICAgZGVjbGFyZWQgbmVzdGVkIGNsYXNzIGRlZmluaXRpb25zIGZpeGVkLgoKMy85Lzk3ICA6IEZpeGVkIGEgZmV3IG1pbm9yIGNvZGUgZ2VuZXJhdGlvbiBidWdzIHdpdGggQysrIGNsYXNzZXMgYW5kCiAgICAgICAgICBjb25zdHJ1Y3RvcnMuICAgSW4gc29tZSBjYXNlcywgdGhlIHJlc3VsdGluZyB3cmFwcGVyIGNvZGUKICAgICAgICAgIHdvdWxkIG5vdCBjb21waWxlIHByb3Blcmx5LiAgIFNXSUcgbm93IGF0dGVtcHRzIHRvIHVzZQogICAgICAgICAgdGhlIGRlZmF1bHQgY29weSBjb25zdHJ1Y3RvciBpbnN0ZWFkLgoKMy84Lzk3ICA6IEFkZGVkIGEgLWwgb3B0aW9uIHRvIFNXSUcgdGhhdCBhbGxvd3MgYWRkaXRpb25hbCBTV0lHIGxpYnJhcnkgZmlsZXMKICAgICAgICAgIHRvIGJlIGdyYWJiZWQgd2l0aG91dCBoYXZpbmcgdGhlbSBzcGVjaWZpZWQgaW4gdGhlIGludGVyZmFjZSBmaWxlLgogICAgICAgICAgVGhpcyBtYWtlcyBpdCBlYXNpZXIgdG8ga2VlcCB0aGUgaW50ZXJmYWNlIGZpbGUgY2xlYW4gYW5kIG1vdmUgY2VydGFpbgogICAgICAgICAgb3B0aW9ucyBpbnRvIGEgTWFrZWZpbGUuICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICBzd2lnIC10Y2wgZXhhbXBsZS5pICAgICAgICAgICAgICAjICBCdWlsZCBhIG5vcm1hbCBUY2wgZXh0ZW5zaW9uCiAgICAgICAgICAgICAgc3dpZyAtdGNsIC1sd2lzaC5pIGV4YW1wbGUuaSAgICAgIyAgQnVpbGQgaXQgYXMgYSB3aXNoIGV4dGVuc2lvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIGJ5IGluY2x1ZGluZyB0aGUgJ3dpc2guaScgZmlsZS4KCiAgICAgICAgICAgICAgc3dpZyAtcHl0aG9uIGV4YW1wbGUuaSAgICAgICAgICAgIyBCdWlsZCBhIGR5bmFtaWNhbGx5IGxvYWRlZCBleHRlbnNpb24KICAgICAgICAgICAgICBzd2lnIC1weXRob24gLWxlbWJlZC5pIGV4YW1wbGUuaSAjIEJ1aWxkIGEgc3RhdGljIGV4dGVuc2lvbgoKICAgICAgICAgIFRoZXNlIGtpbmRzIG9mIG9wdGlvbnMgY291bGQgcHJldmlvdXNseSBiZSBhY2NvbXBsaXNoZWQgd2l0aAogICAgICAgICAgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gc3VjaCBhcyA6CgogICAgICAgICAgICAgICAgICAgJW1vZHVsZSBleGFtcGxlCiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICNpZmRlZiBTVEFUSUMKICAgICAgICAgICAgICAgICAgICVpbmNsdWRlIGVtYmVkLmkKICAgICAgICAgICAgICAgICAgICNlbmRpZgoKMy84Lzk3ICA6IEluY29ycG9yYXRlZCBjaGFuZ2VzIHRvIEd1aWxlIG1vZHVsZSB0byB1c2UgdGhlIG5ldyBnaCBpbnRlcmZhY2UKICAgICAgICAgIGluIEZTRiBHdWlsZSAxLjAuICAgIFRoZSBvbGRlciBnc2NtIGludGVyZmFjZSB1c2VkIGluIEN5Z251cwogICAgICAgICAgR3VpbGUgcmVsZWFzZXMgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCBieSBTV0lHLgoKMy84Lzk3ICA6IENsZWFuZWQgdXAgdGhlIFRjbCBOZXRzY2FwZSBwbHVnaW4gZXhhbXBsZS4gICBJdCBzaG91bGQgd29yayB3aXRoCiAgICAgICAgICB2ZXJzaW9uIDEuMSBvZiB0aGUgcGx1Z2luIG5vdy4KCjMvOC85NyAgOiBBZGRlZCBiZXR0ZXIgYXJyYXkgc3VwcG9ydCB0byB0aGUgdHlwZW1hcCBtb2R1bGUuICBUaGUga2V5d29yZAogICAgICAgICAgQU5ZIGNhbiBub3cgYmUgdXNlZCB0byBtYXRjaCBhbnkgYXJyYXkgZGltZW5zaW9uLiAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAgICAldHlwZW1hcCh0Y2wsaW4pIGRvdWJsZSBbQU5ZXSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLiBnZXQgYW4gYXJyYXkgLi4uCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFRoaXMgd2lsbCBtYXRjaCBhbnkgc2luZ2xlLWRpbWVuc2lvbmFsIGRvdWJsZSBhcnJheS4gICBUaGUgYXJyYXkKICAgICAgICAgIGRpbWVuc2lvbiBpcyBwYXNzZWQgaW4gdGhlIHZhcmlhYmxlcyAkZGltMCwgJGRpbTEsIC4uLiAkZGltOS4gIEZvcgogICAgICAgICAgZXhhbXBsZSA6CgoJCSAgICAldHlwZW1hcCh0Y2wsaW4pIGRvdWJsZSBbQU5ZXVtBTlldW0FOWV0gewoJCQlwcmludGYoIlJlY2VpdmVkIGEgZG91YmxlWyVkXVslZF1bJWRdXG4iLCRkaW0wLCRkaW0xLCRkaW0yKTsKCSAgICAgICAgICAgIH0KCiAgICAgICAgICBBbnkgdHlwZW1hcCBpbnZvbHZpbmcgYSBzcGVjaWZpYyBhcnJheSBkaW1lbnNpb24gd2lsbCBvdmVycmlkZSBhbnkKICAgICAgICAgIHNwZWNpZmllZCB3aXRoIHRoZSBBTlkgdGFnLiAgVGh1cywgYSAldHlwZW1hcCh0Y2wsaW4pIGRvdWJsZSBbNV1bNF1bQU5ZXSB7fQogICAgICAgICAgd291bGQgb3ZlcnJpZGUgYSBkb3VibGUgW0FOWV1bQU5ZXVtBTlldLiAgSG93ZXZlciwgb3ZlcnVzZSBvZiB0aGUgQU5ZCiAgICAgICAgICB0YWcgaW4gYXJyYXlzIG9mIGhpZ2gtZGltZW5zaW9ucyBtYXkgbm90IHdvcmsgYXMgeW91IGV4cGVjdCBkdWUgdG8KICAgICAgICAgIHRoZSBwYXR0ZXJuIG1hdGNoaW5nIHJ1bGUgdXNlZC4gRm9yIGV4YW1wbGUsIHdoaWNoIG9mIHRoZSBmb2xsb3dpbmcKICAgICAgICAgIHR5cGVtYXBzIGhhcyBwcmVjZWRlbmNlPwoKICAgICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBkb3VibGUgW0FOWV1bNV0ge30gICAgIC8vIEF2b2lkIHRoaXMhCiAgICAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgZG91YmxlIFs1XVtBTlldIHt9CgozLzcvOTcgIDogRml4ZWQgYSBudW1iZXIgb2YgYnVncyByZWxhdGVkIHRvIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5IGhhbmRsaW5nLgogICAgICAgICAgVHlwZWRlZnMgaW52b2x2aW5nIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5cyBub3cgd29ya3MgY29ycmVjdGx5LgogICAgICAgICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAgICB0eXBlZGVmIGRvdWJsZSBNQVRSSVhbNF1bNF07CgogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgIGV4dGVybiBkb3VibGUgZm9vKE1BVFJJWCBhKTsKCiAgICAgICAgICBUeXBlY2FzdGluZyBvZiBwb2ludGVycyBpbnRvIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5cyBpcyBub3cKICAgICAgICAgIGltcGxlbWVudGVkIHByb3Blcmx5IHdoZW4gbWFraW5nIEMvQysrIGZ1bmN0aW9uIGNhbGxzLgoKMy82Lzk3ICA6IEZpeGVkIHBvdGVudGlhbGx5IGRhbmdlcm91cyBidWcgaW4gdGhlIFRjbCBPYmplY3Qtb3JpZW50ZWQKICAgICAgICAgIGludGVyZmFjZS4gIFdlbGwsIGFjdHVhbGx5LCBkaWRuJ3QgZml4IGl0IGJ1dCBpc3N1ZWQgYQogICAgICAgICAgVGNsIGVycm9yIGluc3RlYWQuICAgVGhlIGJ1ZyB3b3VsZCBtYW5pZmVzdCBpdHNlbGYgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICAgJSBzZXQgbCBbTGlzdF0gICAgICAgICAgICMgQ3JlYXRlIGFuIG9iamVjdAogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICUgc2V0IG0gW0xpc3QgLXRoaXMgJGxdICAjIE1ha2UgJG0gaW50byBhbiBvYmplY3QgYXNzdW1pbmcgJGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjb250YWlucyBhIHBvaW50ZXIuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgU2luY2UgJG0gPT0gJGwsICRsIGdldHMgZGVzdHJveWVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHNpbmNlIGl0cyB0aGUgc2FtZSBjb21tYW5kIG5hbWUpCiAgICAgICAgICAgICAgICAgJSAkbSBpbnNlcnQgRm9vCiAgICAgICAgICAgICAgICAgU2VnbWVudGF0aW9uIGZhdWx0ICAgICAgICMgTm90ZSA6IHRoZSBsaXN0IG5vIGxvbmdlciBleGlzdHMhCgogICAgICAgICAgTm93LCBhbiBlcnJvciB3aWxsIGJlIGdlbmVyYXRlZCBpbnN0ZWFkIG9mIHJlZGVmaW5pbmcgdGhlIGNvbW1hbmQuCiAgICAgICAgICBBcyBpbiA6CgogICAgICAgICAgICAgICAgICUgc2V0IGwgW0xpc3RdCiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgJSBzZXQgbSBbTGlzdCAtdGhpcyAkbF0KICAgICAgICAgICAgICAgICBPYmplY3QgbmFtZSBhbHJlYWR5IGV4aXN0cyEKCiAgICAgICAgICBVc2UgY2F0Y2h7fSB0byBpZ25vcmUgdGhlIGVycm9yLgoKMy8zLzk3ICA6IEJldHRlciBzdXBwb3J0IGZvciBlbnVtcyBhZGRlZC4gICBEYXRhdHlwZXMgb2YgJ2VudW0gTXlFbnVtJwogICAgICAgICAgYW5kIHR5cGVkZWZzIHN1Y2ggYXMgJ3R5cGVkZWYgZW51bSBNeUVudW0gRm9vOycgbm93IHdvcmsuCgozLzMvOTcgIDogUGFyc2VyIG1vZGlmaWVkIHRvIGlnbm9yZSBjb25zdHJ1Y3RvciBpbml0aWFsaXplcnMgc3VjaCBhcyA6CgogICAgICAgICAgICAgICBjbGFzcyBGb28gOiBwdWJsaWMgQmFyIHsKICAgICAgICAgICAgICAgaW50IGEsYjsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBGb28oaW50IGkpIDogYSgwKSwgYihpKSwgQmFyKGksMCkgeyB9OwogICAgICAgICAgICAgICB9OwoKMy8zLzk3ICA6IE1vZGlmaWVkIHBhcnNlciB0byBpZ25vcmUgQysrIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9ucyBzdWNoIGFzIDoKCiAgICAgICAgICAgICAgIGludCBmb28oZG91YmxlKSB0aHJvdyhYLFkpOwoKMy8zLzk3ICA6IEFkZGVkICVpbXBvcnQgZGlyZWN0aXZlLiAgVGhpcyB3b3JrcyBleGFjdGx5IGxpa2UgJWV4dGVybgogICAgICAgICAgZXhjZXB0IGl0IHRlbGxzIHRoZSBsYW5ndWFnZSBtb2R1bGUgdGhhdCB0aGUgZGVjbGFyYXRpb25zIGFyZQogICAgICAgICAgY29taW5nIGZyb20gYSBzZXBhcmF0ZSBtb2R1bGUuICAgVGhpcyBpcyB1c3VhbGx5IG9ubHkKICAgICAgICAgIG5lZWRlZCB3aGVuIHdvcmtpbmcgd2l0aCBzaGFkb3cgY2xhc3Nlcy4KCjMvMi85NyAgOiBDaGFuZ2VkIHBvaW50ZXIgdHlwZS1jaGVja2VyIHRvIGJlIHNpZ25pZmljYW50bHkgbW9yZQogICAgICAgICAgZWZmaWNpZW50IHdoZW4gd29ya2luZyB3aXRoIGRlcml2ZWQgZGF0YXR5cGVzLiAgVGhpcwogICAgICAgICAgaGFzIGJlZW4gYWNjb21wbGlzaGVkIGJ5IHN0b3JpbmcgdHlwZS1tYXBwaW5ncyBpbiBzb3J0ZWQKICAgICAgICAgIG9yZGVyLCB1c2luZyBiaW5hcnkgc2VhcmNoIHNjaGVtZXMsIGFuZCBjYWNoaW5nIHJlY2VudGx5CiAgICAgICAgICB1c2VkIGRhdGF0eXBlcy4gICBGb3IgU1dJRyBnZW5lcmF0ZWQgQysrIG1vZHVsZXMgdGhhdAogICAgICAgICAgbWFrZSBhIGxhcmdlIG51bWJlciBvZiBDIGZ1bmN0aW9uIGNhbGxzIHdpdGggZGVyaXZlZCB0eXBlcywKICAgICAgICAgIHRoaXMgY291bGQgcmVzdWx0IGluIHNwZWVkdXBzIG9mIGJldHdlZW4gMTAwIGFuZCA1MDAwMCBwZXJjZW50LgogICAgICAgICAgSG93ZXZlciwgZHVlIHRvIHRoZSByZXF1aXJlZCBzb3J0aW5nIG9wZXJhdGlvbiwgbW9kdWxlCiAgICAgICAgICBsb2FkaW5nIHRpbWUgbWF5IGluY3JlYXNlZCBzbGlnaHRseSB3aGVuIHRoZXJlIGFyZSBsb3RzIG9mCiAgICAgICAgICBkYXRhdHlwZXMuCgozLzIvOTcgIDogRml4ZWQgc29tZSBDKysgY29tcGlsYXRpb24gcHJvYmxlbXMgd2l0aCBQeXRob24KICAgICAgICAgIGVtYmVkLmkgbGlicmFyeSBmaWxlcy4KCjIvMjcvOTcgOiBTbGlnaHQgY2hhbmdlIHRvIEMrKyBjb2RlIGdlbmVyYXRpb24gdG8gdXNlIGNvcHkgY29uc3RydWN0b3JzCiAgICAgICAgICB3aGVuIHJldHVybmluZyBjb21wbGV4IGRhdGEgdHlwZSBieSB2YWx1ZS4KCjIvMjYvOTcgOiBGaXhlZCBidWcgaW4gUHl0aG9uIG1vZHVsZSB3aXRoIC1jIG9wdGlvbi4KCjIvMjYvOTcgOiBTbGlnaHQgdHdlYWsgb2YgcGFyc2VyIHRvIGFsbG93IHRyYWlsaW5nIGNvbW1hIGluIGVudW1lcmF0aW9ucwogICAgICAgICAgc3VjaCBhcwoKICAgICAgICAgICAgICAgIGVudW0gVmFsdWUgKEFMRSwgU1RPVVQsIExBR0VSLCB9OwoKMi8yNS85NyA6IEZpeGVkIGNvZGUgZ2VuZXJhdGlvbiBidWcgaW4gVGNsIG1vZHVsZSB3aGVuIHVzaW5nIHRoZQogICAgICAgICAgJW5hbWUoKSBkaXJlY3RpdmUgb24gYSBjbGFzc25hbWUuCgoyLzI1Lzk3IDogRmluaXNoZWQgY29kZS1zaXplIG9wdGltaXphdGlvbiBvZiBDKysgY29kZSBnZW5lcmF0aW9uIHdpdGgKICAgICAgICAgIGluaGVyaXRhbmNlIG9mIGF0dHJpYnV0ZXMuICAgIEluaGVyaXRlZCBhdHRyaWJ1dGVzIG5vdwogICAgICAgICAgb25seSBnZW5lcmF0ZSBvbmUgc2V0IG9mIHdyYXBwZXIgZnVuY3Rpb25zIHRoYXQgYXJlIHJlLXVzZWQKICAgICAgICAgIGluIGFueSBkZXJpdmVkIGNsYXNzZXMuICAgVGhpcyBjb3VsZCBwcm92aWRlIGJpZyBjb2RlCiAgICAgICAgICBzaXplIGltcHJvdmVtZW50cyBpbiBzb21lIHNjcmlwdGluZyBsYW5ndWFnZSBpbnRlcmZhY2VzLgoKMi8yNS85NyA6IFBlcmw1IG1vZHVsZSBtb2RpZmllZCB0byBzdXBwb3J0IGJvdGggdGhlIFVuaXggYW5kIFdpbmRvd3MKICAgICAgICAgIHZlcnNpb25zLiAgVGhlIHdpbmRvd3MgdmVyc2lvbiBoYXMgYmVlbiB0ZXN0ZWQgd2l0aCB0aGUKICAgICAgICAgIEFjdGl2ZXdhcmUgcG9ydCBvZiBQZXJsIDUuMDAzIHJ1bm5pbmcgdW5kZXIgV2luZG93cyA5NS4KICAgICAgICAgIFRoZSBDIHNvdXJjZSBnZW5lcmF0ZWQgYnkgU1dJRyBzaG91bGQgY29tcGlsZSB3aXRob3V0CiAgICAgICAgICBtb2RpZmljYXRpb24gdW5kZXIgYm90aCB2ZXJzaW9ucyBvZiBQZXJsLCBidXQgaXMgbm93CiAgICAgICAgICBldmVuIG1vcmUgaGlkZW91cyB0aGFuIGJlZm9yZS4KCjIvMjUvOTcgOiBNb2RpZmllZCBwYXJzZXIgdG8gYWxsb3cgc2NvcGUgcmVzb2x1dGlvbiBvcGVyYXRpb24gdG8KICAgICAgICAgIGFwcGVhciBpbiBleHByZXNzaW9ucyBhbmQgZGVmYXVsdCBhcmd1bWVudHMgYXMgaW4gOgoKICAgICAgICAgICAgICAgIHZvaWQgZm9vKGludCBhID0gIEJhcjo6ZGVmdmFsdWUpOwoKMi8yNS85NyA6IEZpeGVkIGJ1ZyB3aGVuIHJlc29sdmluZyBzeW1ib2xzIGluc2lkZSBDKysgY2xhc3Nlcy4KICAgICAgICAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgIGVudW0gVmFsdWUge0FMRSwgU1RPVVQsIExBR0VSfTsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgdm9pZCBkZWZhcmcoVmFsdWUgdiA9IFNUT1VUKTsKCiAgICAgICAgICAgICAgfTsKCjIvMjQvOTcgOiBGaXhlZCBidWcgd2l0aCBtZW1iZXIgZnVuY3Rpb25zIHJldHVybmluZyB2b2lkICouCgoyLzIzLzk3IDogTW9kaWZpZWQgUHl0aG9uIG1vZHVsZSB0byBiZSBiZXR0ZXIgYmVoYXZlZCB1bmRlciBXaW5kb3dzCgogICAgICAgICAgICAtICBNb2R1bGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gaXMgbm93IHByb3Blcmx5IGV4cG9ydGVkLgogICAgICAgICAgICAgICBJdCBzaG91bGQgbm90IGJlIG5lY2Vzc2FyeSB0byBleHBsaWNpdGx5IGV4cG9ydCB0aGlzIGZ1bmN0aW9uCiAgICAgICAgICAgICAgIHlvdXJzZWxmLgoKICAgICAgICAgICAgLSAgQml6YXJyZSBjb21waWxhdGlvbiBwcm9ibGVtcyB3aGVuIGNvbXBpbGluZyB0aGUgU1dJRyB3cmFwcGVyCiAgICAgICAgICAgICAgIGNvZGUgYXMgQU5TSSBDIHVuZGVyIFZpc3VhbCBDKysgNC54IGZpeGVkLgoKICAgICAgICAgICAgLSAgVGVzdGVkIHdpdGggYm90aCB0aGUgc3RvY2sgUHl0aG9uLTEuNCBkaXN0cmlidXRpb24gYW5kIFB5dGhvbndpbgogICAgICAgICAgICAgICBydW5uaW5nIHVuZGVyIFdpbjk1LgoKMi8xOS85NyA6IEZpeGVkIHR5cGVkZWYgaGFuZGxpbmcgYnVnIGluIFBlcmw1IHNoYWRvdyBjbGFzc2VzLgoKMi8xOS85NyA6IEFkZGVkIGV4Y2VwdGlvbiBzdXBwb3J0LiAgVG8gdXNlIGl0LCBkbyB0aGUgZm9sbG93aW5nIDoKCiAgICAgICAgICAgICAgJWV4Y2VwdChsYW5nKSB7CiAgICAgICAgICAgICAgICAgIC4uLiB0cnkgcGFydCBvZiB0aGUgZXhjZXB0aW9uIC4uLgogICAgICAgICAgICAgICAgICAkZnVuY3Rpb24KICAgICAgICAgICAgICAgICAgLi4uIGNhdGNoIHBhcnQgb2YgZXhjZXB0aW9uIC4uLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAkZnVuY3Rpb24gaXMgYSBTV0lHIHZhcmlhYmxlIHRoYXQgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUKICAgICAgICAgIGFjdHVhbCBDL0MrKyBmdW5jdGlvbiBjYWxsIGluIGEgd3JhcHBlciBmdW5jdGlvbi4gIFRodXMsCiAgICAgICAgICBhIHJlYWwgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gbWlnaHQgbG9vayBsaWtlIHRoaXMgOgoKICAgICAgICAgICAgICVleGNlcHQocGVybDUpIHsKICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgJGZ1bmN0aW9uCiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGNoYXIgKiYgc3opIHsKICAgICAgICAgICAgICAgICAgICAuLi4gcHJvY2VzcyBhbiBleGNlcHRpb24gLi4uCiAgICAgICAgICAgICAgICAgIH0gY2F0Y2goLi4uKSB7CiAgICAgICAgICAgICAgICAgICAgY3JvYWsoIlVua25vd24gZXhjZXB0aW9uLiBCYWlsaW5nIG91dC4uLiIpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CgoyLzE5Lzk3IDogQWRkZWQgc3VwcG9ydCBmb3IgbWFuYWdpbmcgZ2VuZXJpYyBjb2RlIGZyYWdtZW50cyAobmVlZGVkCiAgICAgICAgICBmb3IgZXhjZXB0aW9ucykuCgoyLzE5Lzk3IDogRml4ZWQgc29tZSByZWFsbHkgb2JzY3VyZSB0eXBlbWFwIHNjb3BpbmcgYnVncyBpbiB0aGUgQysrCiAgICAgICAgICBoYW5kbGVyLgoKMi8xOC85NyA6IENsZWFuZWQgdXAgcGVybG1haW4uaSBmaWxlIGJ5IHJlbW92aW5nIHNvbWUgcHJvYmxlbWF0aWMsCiAgICAgICAgICBidXQgc2VlbWluZ2x5IHVubmVjZXNzYXJ5IGRlY2xhcmF0aW9ucy4KCjIvMTgvOTcgOiBPcHRpbWl6ZWQgaGFuZGxpbmcgb2YgbWVtYmVyIGZ1bmN0aW9ucyB1bmRlciBpbmhlcml0YW5jZS4KICAgICAgICAgIFNXSUcgY2FuIG5vdyB1c2Ugd3JhcHBlciBmdW5jdGlvbnMgZ2VuZXJhdGVkIGZvciBhCiAgICAgICAgICBiYXNlIGNsYXNzIGluc3RlYWQgb2YgcmVnZW5lcmF0aW5nIHdyYXBwZXJzIGZvcgogICAgICAgICAgdGhlIHNhbWUgZnVuY3Rpb25zIGluIGEgZGVyaXZlZCBjbGFzcy4gICAgVGhpcyBjb3VsZAogICAgICAgICAgbWFrZSBhIGRyYXN0aWMgcmVkdWN0aW9uIGluIHdyYXBwZXIgY29kZSBzaXplIGZvciBDKysKICAgICAgICAgIGFwcGxpY2F0aW9ucyB3aXRoIGRlZXAgaW5oZXJpdGFuY2UgaGllcmFyY2hpZXMgYW5kCiAgICAgICAgICBsb3RzIG9mIGZ1bmN0aW9ucy4KCjIvMTgvOTcgOiBBZGRpdGlvbmFsIG1ldGhvZHMgc3BlY2lmaWVkIHdpdGggJWFkZG1ldGhvZHMgY2FuIG5vdwogICAgICAgICAgYmUgaW5oZXJpdGVkIGFsb25nIHdpdGggbm9ybWFsIEMrKyBtZW1iZXIgZnVuY3Rpb25zLgoKMi8xOC85NyA6IE1pbm9yIGludGVybmFsIGZpeGVzIHRvIG1ha2UgU1dJRydzIHN0cmluZyBoYW5kbGluZyBhIGxpdHRsZQogICAgICAgICAgc2FmZXIuCgoyLzE2Lzk3IDogTW92ZWQgc29tZSBjb2RlIGdlbmVyYXRpb24gb2YgVGNsIHNoYWRvdyBjbGFzc2VzIHRvCiAgICAgICAgICBsaWJyYXJ5IGZpbGVzLgoKMi8xNi85NyA6IEZpeGVkIGRvY3VtZW50YXRpb24gZXJyb3Igb2YgJy1jb25maWd1cmUnIG1ldGhvZCBpbgogICAgICAgICAgVGNsIG1vZHVsZXMuCgoyLzE2Lzk3IDogTW9kaWZpZWQgUGVybDUgbW9kdWxlIHNsaWdodGx5IHRvIGFsbG93IHR5cGVtYXBzCiAgICAgICAgICB0byB1c2UgUGVybCByZWZlcmVuY2VzLgoKMi8xMi85NyA6IEZpeGVkIGFyZ3VtZW50IGNoZWNraW5nIGJ1ZyB0aGF0IHdhcyBpbnRyb2R1Y2VkIGJ5CiAgICAgICAgICBkZWZhdWx0IGFyZ3VtZW50cyAoZnVuY3Rpb24gY2FsbHMgd2l0aCB0b28gbWFueQogICAgICAgICAgYXJndW1lbnRzIHdvdWxkIHN0aWxsIGJlIGV4ZWN1dGVkKS4gIEZ1bmN0aW9ucyBub3cKICAgICAgICAgIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgYXJndW1lbnRzIGFzIEMgdmVyc2lvbgogICAgICAgICAgKHdpdGggcG9zc2liaWxpdHkgb2YgZGVmYXVsdC9vcHRpb25hbCBhcmd1bWVudHMKICAgICAgICAgIHN0aWxsIHN1cHBvcnRlZCkuCgoyLzEyLzk3IDogRml4ZWQgZGVmYXVsdCBhcmd1bWVudCBidWcgaW4gUGVybDUgbW9kdWxlIHdoZW4KICAgICAgICAgIGdlbmVyYXRpbmcgd3JhcHBlciBmdW5jdGlvbnMgaW52b2x2aW5nIGRlZmF1bHQKICAgICAgICAgIGFyZ3VtZW50cyBvZiBjb21wbGV4IGRhdGF0eXBlcy4KCjIvMTIvOTcgOiBGaXhlZCB0eXBlbWFwIHNjb3BpbmcgcHJvYmxlbXMuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICV0eXBlbWFwKHRjbCxpbikgZG91YmxlIHsKICAgICAgICAgICAgICAgICAgICAuLiBnZXQgYSBkb3VibGUgLi4KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgZG91YmxlIGJhcihkb3VibGUpOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgJXR5cGVtYXAodGNsLGluKSBkb3VibGUgewogICAgICAgICAgICAgICAgICAgIC4uIG5ldyBnZXQgZG91YmxlIC4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgIFdvdWxkIGFwcGx5IHRoZSBzZWNvbmQgdHlwZW1hcCB0byBhbGwgZnVuY3Rpb25zIGluIEZvbwogICAgICAgICAgZHVlIHRvIGRlbGF5ZWQgZ2VuZXJhdGlvbiBvZiBDKysgd3JhcHBlciBjb2RlIChjbGVhcmx5IHRoaXMKICAgICAgICAgIGlzIG5vdCB0aGUgZGVzaXJlZCBlZmZlY3QpLiAgIFByb2JsZW0gaGFzIGJlZW4gZml4ZWQgYnkKICAgICAgICAgIGFzc2lnbmluZyB1bmlxdWUgbnVtZXJpY2FsIGlkZW50aWZpZXJzIHRvIGV2ZXJ5IGRhdGF0eXBlIGluCiAgICAgICAgICBhbiBpbnRlcmZhY2UgZmlsZSBhbmQgcmVjb3JkaW5nIHRoZSAicmFuZ2Ugb2YgZWZmZWN0IiBvZiBlYWNoCiAgICAgICAgICB0eXBlbWFwLgoKMi8xMS85NyA6IEFkZGVkIHN1cHBvcnQgZm9yICJpZ25vcmUiIGFuZCAiZGVmYXVsdCIgdHlwZW1hcHMuICBPbmx5IHVzZQogICAgICAgICAgaWYgeW91IGFic29sdXRlbHkga25vdyB3aGF0IHlvdSdyZSBkb2luZy4KCjIvOS85NyAgOiBBZGRlZCBhdXRvbWF0aWMgY3JlYXRpb24gb2YgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBmb3IKICAgICAgICAgIEMgc3RydWN0cyBhbmQgQysrIGNsYXNzZXMgdGhhdCBkbyBub3Qgc3BlY2lmeSBhbnkgc29ydCBvZgogICAgICAgICAgY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3Rvci4gICBUaGlzIGZlYXR1cmUgY2FuIGJlIGVuYWJsZWQgYnkKICAgICAgICAgIHJ1bm5pbmcgU1dJRyB3aXRoIHRoZSAnLW1ha2VfZGVmYXVsdCcgb3B0aW9uIG9yIGJ5IGluc2VydGluZwogICAgICAgICAgdGhlIGZvbGxvd2luZyBwcmFnbWEgaW50byBhbiBpbnRlcmZhY2UgZmlsZSA6CgogICAgICAgICAgICAgICAgICVwcmFnbWEgbWFrZV9kZWZhdWx0CgogICAgICAgICAgVGhlIGZvbGxvd2luZyBwcmFnbWEgZGlzYWJsZXMgYXV0b21hdGljIGNvbnN0cnVjdG9yIGdlbmVyYXRpb24KCiAgICAgICAgICAgICAgICAgJXByYWdtYSBub19kZWZhdWx0CgoyLzkvOTcgIDogQWRkZWQgLW1ha2VfZGVmYXVsdCBvcHRpb24gZm9yIHByb2R1Y2luZyBkZWZhdWx0IGNvbnN0cnVjdG9ycwogICAgICAgICAgYW5kIGRlc3RydWN0b3JzIGZvciBjbGFzc2VzIHdpdGhvdXQgdGhlbS4KCjIvOS85NyAgOiBDaGFuZ2VkIHRoZSBzeW50YXggb2YgdGhlIFNXSUcgJXByYWdtYSBkaXJlY3RpdmUgdG8KICAgICAgICAgICVwcmFnbWEgb3B0aW9uPXZhbHVlIG9yICVwcmFnbWEobGFuZykgb3B0aW9uPXZhbHVlLgogICAgICAgICAgVGhpcyBjaGFuZ2UgbWFrZXMgdGhlIHN5bnRheCBhIGxpdHRsZSBtb3JlIGNvbnNpc3RlbnQKICAgICAgICAgIGJldHdlZW4gZ2VuZXJhbCBwcmFnbWFzIGFuZCBsYW5ndWFnZS1zcGVjaWZpYyBwcmFnbWFzLgogICAgICAgICAgVGhlIG9sZCBzeW50YXggc3RpbGwgd29ya3MsIGJ1dCB3aWxsIHByb2JhYmx5IGJlIHBoYXNlZAogICAgICAgICAgb3V0IChhIHdhcm5pbmcgbWVzc2FnZSBpcyBjdXJyZW50bHkgcHJpbnRlZCkuCgoyLzkvOTcgIDogSW1wcm92ZWQgVGNsIHN1cHBvcnQgb2YgZ2xvYmFsIHZhcmlhYmxlcyB0aGF0IGFyZSBvZgogICAgICAgICAgc3RydWN0dXJlcywgY2xhc3NlcywgYW5kIHVuaW9ucy4KCjIvOS85NyAgOiBGaXhlZCBDKysgY29tcGlsYXRpb24gcHJvYmxlbSBpbiBQeXRob24gJ2VtYmVkLmknIGxpYnJhcnkgZmlsZS4KCjIvOS85NyAgOiBGaXhlZCBtaXNzaW5nIHJldHVybiB2YWx1ZSBpbiBwZXJsbWFpbi5pIGxpYnJhcnkgZmlsZS4KCjIvOS85NyAgOiBGaXhlZCBQeXRob24gc2hhZG93IGNsYXNzZXMgdG8gcmV0dXJuIGFuIEF0dHJpYnV0ZUVycm9yIHdoZW4KICAgICAgICAgIHVuZGVmaW5lZCBhdHRyaWJ1dGVzIGFyZSBhY2Nlc3NlZCAob2xkZXIgdmVyc2lvbnMgcmV0dXJuZWQKICAgICAgICAgIGEgTmFtZUVycm9yKS4KCjIvOS85NyAgOiBGaXhlZCBidWcgd2hlbiAlYWRkbWV0aG9kcyBpcyB1c2VkIGFmdGVyIGEgY2xhc3MgZGVmaW5pdGlvbiB3aG9zZQogICAgICAgICAgbGFzdCBzZWN0aW9uIGlzIHByb3RlY3RlZCBvciBwcml2YXRlLgoKMi84Lzk3ICA6IE1hZGUgc2xpZ2h0IGNoYW5nZXMgaW4gaW5jbHVkZSBmaWxlIHByb2Nlc3NpbmcgdG8gc3VwcG9ydAogICAgICAgICAgdGhlIE1hY2ludG9zaC4KCjIvOC85NyAgOiBFeHRlbmRlZCBzd2lnbWFpbi5jeHggdG8gcHJvdmlkZSBhIHJ1ZGltZW50YXJ5IE1hY2ludG9zaCBpbnRlcmZhY2UuCiAgICAgICAgICBJdCdzIGEgcmVhbGx5IGJhZCBpbnRlcmZhY2UsIGJ1dCB3b3JrcyB1bnRpbCBzb21ldGhpbmcgYmV0dGVyCiAgICAgICAgICBpcyB3cml0dGVuLgoKMS8yOS85NyA6IEZpeGVkIHR5cGUtY2FzdGluZyBidWcgaW50cm9kdWNlZCBieSAxLjFiNCB3aGVuIHNldHRpbmcvZ2V0dGluZyB0aGUKICAgICAgICAgIHZhbHVlIG9mIGdsb2JhbCB2YXJpYWJsZXMgaW52b2x2aW5nIGNvbXBsZXggZGF0YSB0eXBlcy4KCjEvMjkvOTcgOiBSZW1vdmVkIGVycm9uZW91cyB3aGl0ZSBzcGFjZSBiZWZvcmUgYW4gI2VuZGlmIGluIHRoZSBjb2RlIGdlbmVyYXRlZAogICAgICAgICAgYnkgdGhlIFB5dGhvbiBtb2R1bGUgKHdhcyBjYXVzaW5nIGVycm9ycyBvbiBERUMgQWxwaGEgY29tcGlsZXJzKS4KCjEvMjYvOTcgOiBGaXhlZCBlcnJvcnMgd2hlbiB1c2luZyBkZWZhdWx0L29wdGlvbmFsIGFyZ3VtZW50cyBpbiBQeXRob24gc2hhZG93CgkgIHNoYWRvdyBjbGFzc2VzLgoKMS8yMy85NyA6IEZpeGVkIGJ1ZyB3aXRoIG5lc3RlZCAlZXh0ZXJuIGRlY2xhcmF0aW9ucy4KCjEvMjEvOTcgOiBGaXhlZCBwcm9ibGVtIHdpdGggdHlwZWRlZiBpbnZvbHZpbmcgY29uc3QgZGF0YXR5cGVzLgoKMS8yMS85NyA6IFNvbWV3aGF0IG9ic2N1cmUsIGJ1dCBzZXJpb3VzIGJ1ZyB3aXRoIGhhdmluZyBtdWx0aXBsZSBsZXZlbHMKICAgICAgICAgIG9mIHR5cGVkZWZzIGZpeGVkLiAgRm9yIGV4YW1wbGUgOgoKCQl0eXBlZGVmIGNoYXIgKlN0cmluZzsKICAgICAgICAgICAgICAgIHR5cGVkZWYgU3RyaW5nICBOYW1lOwoKVmVyc2lvbiAxLjEgQmV0YTQgKEphbnVhcnkgMTYsIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKTm90ZSA6IFNXSUcgMS4xYjMgY3Jhc2hlZCBhbmQgYnVybmVkIHNob3J0bHkgYWZ0ZXIgdGFrZSBvZmYgZHVlCnRvIGEgZmV3IG1ham9yIHJ1bi10aW1lIHByb2JsZW1zIHRoYXQgc3VyZmFjZWQgYWZ0ZXIgcmVsZWFzZS4KVGhpcyByZWxlYXNlIHNob3VsZCBmaXggbW9zdCwgaWYgbm90IGFsbCwgb2YgdGhvc2UgcHJvYmxlbXMuCgoxLzE2Lzk3IDogRml4ZWQgbWFqb3IgbWVtb3J5IG1hbmFnZW1lbnQgYnVnIG9uIExpbnV4CgoxLzE0Lzk3IDogRml4ZWQgYnVnIGluIGZ1bmN0aW9ucyByZXR1cm5pbmcgY29uc3RhbnQgQysrIHJlZmVyZW5jZXMuCgoxLzE0Lzk3IDogTW9kaWZpZWQgQysrIG1vZHVsZSB0byBoYW5kbGUgZGF0YXR5cGVzIGJldHRlci4KCjEvMTQvOTcgOiBNb2RpZmllZCBwYXJzZXIgdG8gYWxsb3cgYSAqc2luZ2xlKiBzY29wZSByZXNvbHV0aW9uCiAgICAgICAgICBvcGVyYXRvciBpbiBkYXRhdHlwZXMuICBJZSA6IEZvbzo6YmFyLiAgIFNXSUcgZG9lc24ndAogICAgICAgICAgeWV0IGhhbmRsZSBuZXN0ZWQgY2xhc3Nlcywgc28gdGhpcyBzaG91bGQgYmUKICAgICAgICAgIHN1ZmZpY2llbnQgZm9yIG5vdy4KCjEvMTQvOTcgOiBNb2RpZmllZCBwYXJzZXIgdG8gYWxsb3cgdHlwZWRlZiBpbnNpZGUgYSBDKysgY2xhc3MuCgoxLzE0Lzk3IDogRml4ZWQgc29tZSBwcm9ibGVtcyByZWxhdGVkIHRvIGRhdGF0eXBlcyBkZWZpbmVkIGluc2lkZQogICAgICAgICAgYSBDKysgY2xhc3MuICBTV0lHIHdhcyBub3QgZ2VuZXJhdGluZyBjb3JyZWN0IGNvZGUsCiAgICAgICAgICBidXQgYSBuZXcgc2NvcGluZyBtZWNoYW5pc20gYW5kIG1ldGhvZCBmb3IgaGFuZGxpbmcKICAgICAgICAgIGRhdGF0eXBlcyBpbnNpZGUgYSBDKysgY2xhc3MgaGF2ZSBiZWVuIGFkZGVkLgoKMS8xNC85NyA6IENoYW5nZWQgZW51bWVyYXRpb25zIHRvIHVzZSB0aGUgdmFsdWUgbmFtZSBpbnN0ZWFkCiAgICAgICAgICBvZiBhbnkgdmFsdWVzIHRoYXQgbWlnaHQgaGF2ZSBhcHBlYXJlZCBpbiB0aGUgaW50ZXJmYWNlCiAgICAgICAgICBmaWxlLiAgVGhpcyBtYWtlcyB0aGUgY29kZSBhIGxpdHRsZSBtb3JlIGZyaWVuZGx5IHRvCiAgICAgICAgICBDKysgY29tcGlsZXJzLgoKMS8xNC85NyA6IFJlbW92ZWQgdHlwZWRlZiBidWcgdGhhdCBtYWRlIGFsbCBlbnVtZXJhdGlvbnMKICAgICAgICAgIGVxdWl2YWxlbnQgdG8gZWFjaCBvdGhlciBpbiB0aGUgdHlwZSBjaGVja2VyIChzaW5jZQogICAgICAgICAgaXQgZ2VuZXJhdGVkIGFsb3Qgb2YgdW5uZWNlc3NhcnkgY29kZSkuCgpWZXJzaW9uIDEuMSBCZXRhMyAoSmFudWFyeSA5LCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKTm90ZSA6IEEgKmh1Z2UqIG51bWJlciBvZiBjaGFuZ2VzIHJlbGF0ZWQgdG8gb25nb2luZyBtb2RpZmljYXRpb25zLgoKMS4gIFN1cHBvcnQgZm9yIEMrKyBtdWx0aXBsZSBpbmhlcml0YW5jZSBhZGRlZC4KCjIuICBUeXBlbWFwcyBhZGRlZC4KCjMuICBTb21lIHN1cHBvcnQgZm9yIG5lc3RlZCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgYWRkZWQuCgo0LiAgRGVmYXVsdCBhcmd1bWVudCBoYW5kbGluZyBhZGRlZC4KCjUuICAtYyBvcHRpb24gYWRkZWQgZm9yIGJ1aWxkaW5nIGJhcmUgd3JhcHBlciBjb2RlIG1vZHVsZXMuCgo2LiAgUmV3cm90ZSBQb2ludGVyIHR5cGUtY2hlY2tpbmcgdG8gc3VwcG9ydCBtdWx0aXBsZSBpbmhlcml0YW5jZQogICAgY29ycmVjdGx5LgoKNy4gIFRjbCA4LjAgbW9kdWxlIGFkZGVkLgoKOC4gIFBlcmw0IGFuZCBHdWlsZSBtb2R1bGVzIHJlc3VycmVjdGVkIGZyb20gdGhlIGRlYWQgKHdlbGwsIHRoZXkKICAgIGF0IGxlYXN0IHdvcmsgYWdhaW4pLgoKOS4gIE5ldyBPYmplY3QgT3JpZW50ZWQgVGNsIGludGVyZmFjZSBhZGRlZC4KCjEwLiBCdWcgZml4ZXMgdG8gUGVybDUgc2hhZG93IGNsYXNzZXMuCgoxMS4gQ2xlYW5lZCB1cCBtYW55IG9mIHRoZSBpbnRlcm5hbCBtb2R1bGVzIG9mIHRoZSBwYXJzZXIuCgoxMi4gVG9ucyBvZiBleGFtcGxlcyBhbmQgdGVzdGluZyBtb2R1bGVzIGFkZGVkLgoKMTMuIEZpeGVkIGJ1Z3MgcmVsYXRlZCB0byB1c2Ugb2YgImNvbnN0IiByZXR1cm4gdmFsdWVzLgoKMTQuIEZpeGVkIGJ1ZyB3aXRoIEMrKyBtZW1iZXIgZnVuY3Rpb25zIHJldHVybmluZyB2b2lkICouCgoxNS4gQ2hhbmdlZCBTV0lHIGNvbmZpZ3VyYXRpb24gc2NyaXB0LgoKVmVyc2lvbiAxLjEgQmV0YTIgKERlY2VtYmVyIDMsIDE5OTYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMS4gQ29tcGxldGVseSByZXdyb3RlIHRoZSBTV0lHIGRvY3VtZW50YXRpb24gc3lzdGVtLiAgVGhlIGNoYW5nZXMKICAgaW52b2x2ZWQgYXJlIHRvbyBudW1lcm91cyB0byBtZW50aW9uLiAgQmFzaWNhbGx5LCB0YWtlIGV2ZXJ5dGhpbmcKICAgeW91IGtuZXcgYWJvdXQgdGhlIG9sZCBzeXN0ZW0sIHRocm93IHRoZW0gb3V0LCBhbmQgcmVhZCB0aGUKICAgZmlsZSBEb2MvZG9jLnBzLgoKMi4gTGltaXRlZCBzdXBwb3J0IGZvciAjaWYgZGVmaW5lZCgpIGFkZGVkLgoKMy4gVHlwZSBjYXN0cyBhcmUgbm93IGFsbG93ZWQgaW4gY29uc3RhbnQgZXhwcmVzc2lvbnMuICBpZQoKICAgICAgICAgI2RlZmluZSAgQSAgIChpbnQpIDMKCjQuIEFkZGVkIHN1cHBvcnQgZm9yIHR5cGVkZWYgbGlzdHMuICBGb3IgZXhhbXBsZSA6CgoJdHlwZWRlZiBzdHJ1Y3QgewoJICAgICAgICBkb3VibGUgeCx5LHo7CiAgICAgICAgfSBWZWN0b3IsICpWZWN0b3JQdHI7Cgo1LiBOZXcgU1dJRyBkaXJlY3RpdmVzIChyZWxhdGVkIHRvIGRvY3VtZW50YXRpb24gc3lzdGVtKQoKCSVzdHlsZQoJJWxvY2Fsc3R5bGUKCSVzdWJzZWN0aW9uCgklc3Vic3Vic2VjdGlvbgoKNi4gUmVvcmdhbml6ZWQgdGhlIEMrKyBoYW5kbGluZyBhbmQgbWFkZSBpdCBhIGxpdHRsZSBlYXNpZXIgdG8KICAgd29yayB3aXRoIGludGVybmFsbHkuCgo3LiAgRml4ZWQgcHJvYmxlbSB3aXRoIGluaGVyaXRpbmcgZGF0YSBtZW1iZXJzIGluIFB5dGhvbgogICAgc2hhZG93IGNsYXNzZXMuCgo4LiAgRml4ZWQgc3ltYm9sIHRhYmxlIHByb2JsZW1zIHdpdGggc2hhZG93IGNsYXNzZXMgaW4gYm90aAogICAgUHl0aG9uIGFuZCBQZXJsLgoKOS4gIEZpeGVkIGFubm95aW5nIHNlZ21lbnRhdGlvbiBmYXVsdCBidWcgaW4gd3JhcHBlciBjb2RlCiAgICBnZW5lcmF0ZWQgZm9yIFBlcmw1LgoKMTAuIEZpeGVkIGJ1ZyB3aXRoICVhZGRtZXRob2RzIGRpcmVjdGl2ZS4gIE5vdyBpdCBjYW4gYmUgcGxhY2VkCiAgICBhbnl3aGVyZSBpbiBhIGNsYXNzLgoKMTEuIE1vcmUgdGVzdCBjYXNlcyBhZGRlZCB0byB0aGUgU1dJRyBzZWxmLXRlc3QuICAgRG9jdW1lbnRhdGlvbgogICAgdGVzdHMgYXJlIG5vdyBwZXJmb3JtZWQgYWxvbmcgd2l0aCBvdGhlciB0aGluZ3MuCgoxMi4gUmVvcmdhbml6ZWQgdGhlIFNXSUcgbGlicmFyeSBhIGxpdHRsZSBiaXQgYW5kIHNldCBpdCB1cCB0bwogICAgc2VsZi1kb2N1bWVudCBpdHNlbGYgdXNpbmcgU1dJRy4KCjEzLiBMb3RzIGFuZCBsb3RzIG9mIG1pbm9yIGJ1ZyBmaXhlcyAobW9zdGx5IG9ic2N1cmUsIGJ1dCBidWdzCiAgICBub25ldGhlbGVzcykuCgoKVmVyc2lvbiAxLjEgQmV0YTEgKE9jdG9iZXIgMzAsIDE5OTYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMS4gQWRkZWQgbmV3ICVleHRlcm4gZGlyZWN0aXZlIGZvciBoYW5kbGluZyBtdWx0aXBsZSBmaWxlcwoKMi4gUGVybDUgc2hhZG93IGNsYXNzZXMgYWRkZWQKCjMuIFJld3JvdGUgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gdG8gd29yayBiZXR0ZXIKCjQuIEFkZGVkICdib29sJyBkYXRhdHlwZQoKNS4gJXssJX0gYmxvY2sgaXMgbm93IG9wdGlvbmFsLgoKNi4gRml4ZWQgc29tZSBidWdzIGluIHRoZSBQeXRob24gc2hhZG93IGNsYXNzIG1vZHVsZQoKNy4gUmV3cm90ZSBhbGwgb2YgdGhlIFNXSUcgdGVzdHMgdG8gYmUgbW9yZSBpbmZvcm1hdGl2ZQogICAoYW5kIGxlc3Mgc2NhcnkpLgoKOC4gUmV3cm90ZSBwYXJhbWV0ZXIgbGlzdCBoYW5kbGluZyB0byBiZSBtb3JlIG1lbW9yeQogICBlZmZpY2llbnQgYW5kIGZsZXhpYmxlLgoKOS4gQ2hhbmdlZCBwYXJzZXIgdG8gaWdub3JlICdzdGF0aWMnIGRlY2xhcmF0aW9ucy4KCjEwLiBJbml0aWFsaXplcnMgYXJlIG5vdyBpZ25vcmVkLiAgRm9yIGV4YW1wbGUgOgoKCXN0cnVjdCBGb29CYXIgYSA9IHszLDQsNX07CgoxMS4gU29tZXdoYXQgYmV0dGVyIHBhcnNpbmcgb2YgYXJyYXlzIChhbHRob3VnaCBpdCdzCiAgICB1c3VhbGx5IGp1c3QgYSBiZXR0ZXIgZXJyb3IgbWVzc2FnZSBub3cpLgoKMTIuIExvdCdzIG9mIG1pbm9yIGJ1ZyBmaXhlcy4KCgpWZXJzaW9uIDEuMCBGaW5hbCAoQXVndXN0IDMxLCAxOTk2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMS4gRml4ZWQgbWlub3IgYnVnIGluIEMrKyBtb2R1bGUKCjIuIEZpeGVkIG1pbm9yIGJ1ZyBpbiBwb2ludGVyIHR5cGUtY2hlY2tlciB3aGVuIHVzaW5nCiAgIC1EQUxMT1dfTlVMTC4KCjMuIEZpeGVkIGNvbmZpZ3VyZSBzY3JpcHQgdG8gd29yayB3aXRoIFB5dGhvbiAxLjRiZXRhMwoKNC4gQ2hhbmdlZCBjb25maWd1cmUgc2NyaXB0IHRvIGFsbG93IGNvbXBpbGF0aW9uIHdpdGhvdXQKICAgeWFjYyBvciBiaXNvbi4KClZlcnNpb24gMS4wIEZpbmFsIChBdWd1c3QgMjgsIDE5OTYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxLiAgQ2hhbmdlZCBwYXJzZXIgdG8gc3VwcG9ydCBtb3JlIEMvQysrIGRhdGF0eXBlcyAod2VsbCwKICAgIG1vcmUgdmFyaWFudHMpLiAgIFR5cGVzIGxpa2UgInVuc2lnbmVkIiwgInNob3J0IGludCIsCiAgICAibG9uZyBpbnQiLCBldGMuLi4gbm93IHdvcmsuCgoyLiAgInVuaW9ucyIgYWRkZWQgdG8gcGFyc2VyLgoKMy4gIFVzZSBvZiAidHlwZWRlZiIgYXMgaW4gOgoKCXR5cGVkZWYgc3RydWN0IHsKCSAgICAgZG91YmxlIHgseSx6OwoJfSBWZWN0b3I7CgogICAgTm93IHdvcmtzIGNvcnJlY3RseS4gICBUaGUgbmFtZSBvZiB0aGUgdHlwZWRlZiBpcyB1c2VkIGFzCiAgICB0aGUgc3RydWN0dXJlIG5hbWUuCgo0LiAgQ29uZGl0aW9uYWwgY29tcGlsYXRpb24gd2l0aCAjaWZkZWYsICNlbHNlLCAjZW5kaWYsIGV0Yy4uLgogICAgYWRkZWQuCgo1LiAgTmV3ICVkaXNhYmxlZG9jLCAlZW5hYmxlZG9jIGRpcmVjdGl2ZXMgYWxsb3cgZG9jdW1lbnRhdGlvbgogICAgdG8gc2VsZWN0aXZlbHkgYmUgZGlzYWJsZWQgZm9yIGNlcnRhaW4gcGFydHMgb2YgYSB3cmFwcGVyCiAgICBmaWxlLgoKNi4gIE5ldyBQeXRob24gbW9kdWxlIHN1cHBvcnRzIGJldHRlciB2YXJpYWJsZSBsaW5raW5nLCBjb25zdGFudHMsCiAgICBhbmQgc2hhZG93IGNsYXNzZXMuCgo3LiAgUGVybDUgbW9kdWxlIGltcHJvdmVkIHdpdGggYmV0dGVyIGNvbXBhdGliaWxpdHkgd2l0aCBYUwogICAgYW5kIHhzdWJwcC4gICBTV0lHIHBvaW50ZXJzIGFuZCBub3cgY3JlYXRlZCBzbyB0aGF0IHRoZXkKICAgIGFyZSBjb21wYXRpYmxlIHdpdGggeHN1YnBwIHBvaW50ZXJzLgoKOC4gIFN1cHBvcnQgZm9yIFtpbmNyIFRjbF0gbmFtZXNwYWNlcyBhZGRlZCB0byBUY2wgbW9kdWxlLgoKOS4gICVwcmFnbWEgZGlyZWN0aXZlIGFkZGVkLgoKMTAuICVhZGRtZXRob2RzIGRpcmVjdGl2ZSBhZGRlZC4KCjExLiAlbmF0aXZlIGRpcmVjdGl2ZSBhZGRlZCB0byBhbGxvdyBwcmUtZXhpc3Rpbmcgd3JhcHBlciBmdW5jdGlvbnMKICAgIHRvIGJlIHVzZWQuCgoxMi4gV3JvdGUgY29uZmlndXJlIHNjcmlwdCBmb3IgU1dJRyBpbnN0YWxsYXRpb24uCgoxMy4gRnVuY3Rpb24gcG9pbnRlcnMgbm93IGFsbG93ZWQgd2l0aCB0eXBlZGVmIHN0YXRlbWVudHMuCgoxNC4gJXR5cGVkZWYgbW9kaWZpZWQgdG8gaW5zZXJ0IGEgY29ycmVzcG9uZGluZyBDIHR5cGVkZWYgaW50bwogICAgdGhlIG91dHB1dCBmaWxlLgoKMTUuIEZpeGVkIHNvbWUgcHJvYmxlbXMgcmVsYXRlZCB0byBDKysgcmVmZXJlbmNlcy4KCjE2LiBOZXcgU3RyaW5nIGFuZCBXcmFwcGVyRnVuY3Rpb24gY2xhc3NlcyBhZGQgdG8gbWFrZSBnZW5lcmF0aW5nCiAgICB3cmFwcGVyIGNvZGUgZWFzaWVyLgoKMTcuIEZpeGVkIGNvbW1hbmQgbGluZSBvcHRpb24gcHJvY2Vzc2luZyB0byBlbGltaW5hdGUgY29yZSBkdW1wcwogICAgYW5kIHRvIGFsbG93IGhlbHAgbWVzc2FnZXMuCgoxOC4gTG90J3Mgb2YgbWlub3IgYnVnIGZpeGVzIHRvIGFsbW9zdCBhbGwgY29kZSBtb2R1bGVzCgoKVmVyc2lvbiAxLjAgQmV0YSAzIChQYXRjaCAxKSBKdWx5IDE3LCAxOTk2Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMS4wIEZpbmFsIGlzIG5vdCBxdWl0ZSByZWFkeSB5ZXQsIGJ1dCB0aGlzIHJlbGVhc2UgZml4ZXMgYQpudW1iZXIgb2YgaW1tZWRpYXRlIHByb2JsZW1zIDoKCjEuICBDb21waWxlciBlcnJvcnMgd2hlbiB1c2luZyAtc3RyaWN0IDEgdHlwZSBjaGVja2luZyBoYXZlIGJlZW4gZml4ZWQuCgoyLiAgUG9pbnRlciB0eXBlIGNoZWNrZXIgbm93IHJlY29nbml6ZXMgcG9pbnRlcnMgb2YgdGhlIGZvcm0KICAgIF8wX1R5cGUgY29ycmVjdGx5LgoKMy4gIEEgZmV3IG1pbm9yIGZpeGVzIHdlcmUgbWFkZSBpbiB0aGUgTWFrZWZpbGUKClZlcnNpb24gMS4wIEJldGEgMyAoSnVuZSAxNCwgMTk5NikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKClRoZXJlIGFyZSBsb3RzIG9mIGNoYW5nZXMgaW4gdGhpcyByZWxlYXNlIDoKCjEuICBTV0lHIGlzIG5vdyBpbnZva2VkIHVzaW5nIHRoZSAic3dpZyIgY29tbWFuZCBpbnN0ZWFkIG9mICJ3cmFwIi4KICAgIEhleSwgc3dpZyBzb3VuZHMgY29vbGVyLgoKMi4gIFRoZSBTV0lHX0xJQiBlbnZpcm9ubWVudCB2YXJpYWJsZSBjYW4gYmUgc2V0IHRvIGNoYW5nZSB0aGUKICAgIGxvY2F0aW9uIHdoZXJlIFNXSUcgbG9va3MgZm9yIGxpYnJhcnkgZmlsZXMuCgozLiAgQysrIHN1cHBvcnQgaGFzIGJlZW4gYWRkZWQuICAgWW91IHNob3VsZCB1c2UgdGhlIC1jKysgb3B0aW9uCiAgICB0byBlbmFibGUgaXQuCgo0LiAgVGhlICVpbml0IGRpcmVjdGl2ZSBoYXMgYmVlbiByZXBsYWNlZCBieSB0aGUgJW1vZHVsZSBkaXJlY3RpdmUuCiAgICAlbW9kdWxlIGNvbnN0cnVjdHMgYSB2YWxpZCBuYW1lIGZvciB0aGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24KICAgIGZvciB3aGF0ZXZlciB0YXJnZXQgbGFuZ3VhZ2UgeW91J3JlIHVzaW5nIChhY3R1YWxseSB0aGlzIG1ha2VzCiAgICBTV0lHIGZpbGVzIGEgbGl0dGxlIGNsZWFuZXIpLiAgVGhlIG9sZCAlaW5pdCBkaXJlY3RpdmUgc3RpbGwgd29ya3MuCgo1LiAgVGhlIHN5bnRheCBvZiB0aGUgJW5hbWUgZGlyZWN0aXZlIGhhcyBiZWVuIGNoYW5nZWQuICAgVXNlIG9mIHRoZQogICAgb2xkIG9uZSBzaG91bGQgZ2VuZXJhdGUgYSB3YXJuaW5nIG1lc3NhZ2UsIGJ1dCBtYXkgc3RpbGwgd29yay4KCjYuICBUbyBzdXBwb3J0IFRjbC9UayBvbiBub24tdW5peCBwbGF0Zm9ybXMsIFNXSUcgaW1wb3J0cyBhIGZpbGUgY2FsbGVkCiAgICBzd2lndGNsLmNmZyBmcm9tIHRoZSAkKFNXSUdfTElCKS90Y2wgZGlyZWN0b3J5LiAgIEkgZG9uJ3QgaGF2ZSBhY2Nlc3MKICAgIHRvIGFuIE5UIG1hY2hpbmUsIGJ1dCB0aGlzIGZpbGUgaXMgc3VwcG9zZWRseSBhbGxvd3MgU1dJRyB0bwogICAgcHJvZHVjZSB3cmFwcGVyIGNvZGUgdGhhdCBjb21waWxlcyBvbiBib3RoIFVOSVggYW5kIG5vbiBVTklYIG1hY2hpbmVzLgogICAgSWYgdGhpcyBkb2Vzbid0IHdvcmssIHlvdSdsbCBoYXZlIHRvIGVkaXQgdGhlIGZpbGUgc3dpZ3RjbC5jZmcuIFBsZWFzZQogICAgbGV0IG1lIGtub3cgaWYgdGhpcyBkb2Vzbid0IHdvcmsgc28gSSBjYW4gdXBkYXRlIHRoZSBmaWxlIGFzCiAgICBuZWNlc3NhcnkuCgo3LiAgVGhlIFNXSUcgcnVuLXRpbWUgdHlwZWNoZWNrZXIgaGFzIGJlZW4gaW1wcm92ZWQuICAgIFlvdSBjYW4gYWxzbwogICAgbm93IHJlZGVmaW5lIGhvdyBpdCB3b3JrcyBieSBzdXBwbHlpbmcgYSBmaWxlIGNhbGxlZCAic3dpZ3B0ci5jZmciCiAgICBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgeW91ciBTV0lHIGludGVyZmFjZSBmaWxlcy4gICBCeSBkZWZhdWx0LAogICAgU1dJRyByZWFkcyB0aGlzIGZpbGUgZnJvbSAkKFNXSUdfTElCKS9jb25maWcuCgo4LiAgVGhlIGRvY3VtZW50YXRpb24gc3lzdGVtIGhhcyBiZWVuIGNoYW5nZWQgdG8gc3VwcG9ydCB0aGUgZm9sbG93aW5nIDoKCgktICBEb2N1bWVudGF0aW9uIG9yZGVyIGlzIHByaW50ZWQgaW4gaW50ZXJmYWNlIGZpbGUgb3JkZXIgYnkKICAgICAgICAgICBkZWZhdWx0LiAgIFRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgcHV0dGluZyBhbiAlYWxwaGEKICAgICAgICAgICBkaXJlY3RpdmUgaW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgaW50ZXJmYWNlIGZpbGUuCgogICAgICAgIC0gIFlvdSBjYW4gc3VwcGx5IGFkZGl0aW9uYWwgZG9jdW1lbnRhdGlvbiB0ZXh0IHVzaW5nCgogICAgICAgICAgICV0ZXh0ICV7IHB1dCB5b3VyIHRleHQgaGVyZSAlfQoKICAgICAgICAtICBBIGZldyBtaW5vciBidWdzIHdlcmUgZml4ZWQuCgo5LiAgQSBmZXcgaW1wcm92ZW1lbnRzIGhhdmUgYmVlbiBtYWRlIHRvIHRoZSBoYW5kbGluZyBvZiBjb21tYW5kIGxpbmUKICAgIG9wdGlvbnMgKGJ1dCBpdCdzIHN0aWxsIG5vdCBmaW5pc2hlZCkuCgoxMC4gIExvdHMgb2YgbWlub3IgYnVnIGZpeGVzIGluIG1vc3Qgb2YgdGhlIGxhbmd1YWdlIG1vZHVsZXMgaGF2ZSBiZWVuCiAgICAgbWFkZS4KCjExLiBGaWxlbmFtZXMgaGF2ZSBiZWVuIGNoYW5nZWQgdG8gOC4zIGZvciBjb21wYXRpYmlsaXR5IHdpdGggYSBTV0lHCiAgICBwb3J0IHRvIG5vbi11bml4IHBsYXRmb3JtcyAod29yayBpbiBwcm9ncmVzcykuCgoxMi4gQysrIGZpbGUgc3VmZml4IGlzIG5vdyAuY3h4IChmb3Igc2FtZSByZWFzb24pLgoKMTMuIFRoZSBkb2N1bWVudGF0aW9uIGhhcyBiZWVuIHVwZ3JhZGVkIHNpZ25pZmljYW50bHkgYW5kIGlzIG5vdwogICAgYXJvdW5kIDEwMCBwYWdlcy4gICAgSSBhZGRlZCBuZXcgZXhhbXBsZXMgYW5kIGEgc2VjdGlvbiBvbgogICAgQysrLiAgVGhlIGRvY3VtZW50YXRpb24gbm93IGluY2x1ZGVzIGEgVGFibGUgb2YgQ29udGVudHMuCgoxNC4gVGhlIFNXSUcgRXhhbXBsZXMgZGlyZWN0b3J5IGlzIHN0aWxsIHdvZWZ1bGx5IHNwYXJzZSwgYnV0IGlzCiAgICBnZXR0aW5nIGJldHRlci4KClNwZWNpYWwgbm90aWNlIGFib3V0IEMrKwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KVGhpcyBpcyB0aGUgZmlyc3QgdmVyc2lvbiBvZiBTV0lHIHRvIHN1cHBvcnQgQysrIHBhcnNpbmcuICBDdXJyZW50bHkKdGhlIEMrKyBpcyBmYXIgZnJvbSBjb21wbGV0ZSwgYnV0IHNlZW1zIHRvIHdvcmsgZm9yIHNpbXBsZSBjYXNlcy4KTm8gd29yayBoYXMgYmVlbiBkb25lIHRvIGFkZCBzcGVjaWFsIEMrKyBwcm9jZXNzaW5nIHRvIGFueSBvZgp0aGUgdGFyZ2V0IGxhbmd1YWdlcy4gICBTZWUgdGhlIHVzZXIgbWFudWFsIGZvciBkZXRhaWxzIGFib3V0IGhvdwpDKysgaXMgaGFuZGxlZC4gICBJZiB5b3UgZmluZCBwcm9ibGVtcyB3aXRoIHRoZSBDKysgaW1wbGVtZW50YXRpb24sCnBsZWFzZSBsZXQgbWUga25vdy4gIEV4cGVjdCBtYWpvciBpbXByb3ZlbWVudHMgaW4gdGhpcyBhcmVhLgoKTm90ZSA6IEkgaGF2ZSBvbmx5IHN1Y2Nlc3NmdWxseSB1c2VkIFNXSUcgYW5kIEMrKyB3aXRoIFRjbCBhbmQKUHl0aG9uLgoKTm90aWNlIGFib3V0IFZlcnNpb24gMS4wRmluYWwKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClZlcnNpb24gMS4wQjMgaXMgdGhlIGxhc3QgQmV0YSByZWxlYXNlIGJlZm9yZSB2ZXJzaW9uIDEuMCBGaW5hbCBpcwpyZWxlYXNlZC4gIEkgaGF2ZSBmcm96ZW4gdGhlIGxpc3Qgb2YgZmVhdHVyZXMgc3VwcG9ydGVkIGluIHZlcnNpb24gMS4wCmFuZCB3aWxsIG9ubHkgZml4IGJ1Z3MgYXMgdGhleSBzaG93IHVwLiAgV29yayBvbiBTV0lHIHZlcnNpb24gMi4wIGlzCmFscmVhZHkgaW4gcHJvZ3Jlc3MsIGJ1dCBpcyBnb2luZyB0byByZXN1bHQgaW4gcmF0aGVyIHNpZ25pZmljYW50CmNoYW5nZXMgdG8gU1dJRydzIGludGVybmFsIHN0cnVjdHVyZSAoaG9wZWZ1bGx5IGZvciB0aGUgYmV0dGVyKS4gIE5vCmFudGljaXBhdGVkIGRhdGUgZm9yIHZlcnNpb24gMi4wIGlzIHNldCwgYnV0IGlmIHlvdSd2ZSBnb3QgYW4gaWRlYSwKbGV0IG1lIGtub3cuCgpWZXJzaW9uIDEuMCBCZXRhIDIgKEFwcmlsIDI2LCAxOTk2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKVGhpcyByZWxlYXNlIGlzIGlkZW50aWNhbCB0byBCZXRhMSBleGNlcHQgYSBmZXcgbWlub3IgYnVncyBhcmUKZml4ZWQgYW5kIHRoZSBTV0lHIGxpYnJhcnkgaGFzIGJlZW4gdXBkYXRlZCB0byB3b3JrIHdpdGggVGNsIDcuNS9UayA0LjEuCkEgdGNsNy41IGV4YW1wbGVzIGRpcmVjdG9yeSBpcyBub3cgaW5jbHVkZWQuCgotIEZpeGVkIGEgYnVnIGluIHRoZSBNYWtlZmlsZSB0aGF0IGRpZG4ndCBpbnN0YWxsIHRoZSBsaWJyYXJpZXMKICBjb3JyZWN0bHkuCgotIFNXSUcgTGlicmFyeSBmaWxlcyBhcmUgbm93IHVwZGF0ZWQgdG8gd29yayB3aXRoIFRjbCA3LjUgYW5kIFRrIDQuMS4KCi0gTWlub3IgYnVnIGZpeGVzIGluIG90aGVyIG1vZHVsZXMuCgoKVmVyc2lvbiAxLjAgQmV0YSAxICAoQXByaWwgMTAsIDE5OTYpLgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpUaGlzIGlzIHRoZSBmaXJzdCAic2VtaS1vZmZpY2lhbCIgcmVsZWFzZSBvZiBTV0lHLiAgICBJdCBoYXMgYQpudW1iZXIgb2Ygc3Vic3RhbnRpYWwgaW1wcm92ZW1lbnRzIG92ZXIgdGhlIEFscGhhIHJlbGVhc2UuICAgVGhlc2UKbm90ZXMgYXJlIGluIG5vIHBhcnRpY3VsYXIgb3JkZXItLWhvcGUgSSByZW1lbWJlcmVkIGV2ZXJ5dGhpbmcuLi4uCgoxLiAgVGNsL1RrCgpTV0lHIGlzIGtub3duIHRvIHdvcmsgd2l0aCBUY2w3LjMsIFRrMy42IGFuZCBsYXRlciB2ZXJzaW9ucy4KSSd2ZSBhbHNvIHRlc3RlZCBTV0lHIHdpdGggZXhwZWN0LTUuMTkuCgpOb3JtYWxseSBTV0lHIGV4cGVjdHMgdG8gdXNlIHRoZSBoZWFkZXIgZmlsZXMgInRjbC5oIiBhbmQgInRrLmgiLgpOZXdlciB2ZXJzaW9ucyBvZiBUY2wvVGsgdXNlIHZlcnNpb24gbnVtYmVycy4gICBZb3UgY2FuIHNwZWNpZnkgdGhlc2UKaW4gU1dJRyBhcyBmb2xsb3dzIDoKCiAgICAgICAgJSB3cmFwIC1odGNsIHRjbDcuNC5oIC1odGsgdGs0LjAuaCBleGFtcGxlLmkKCk9mIGNvdXJzZSwgSSBwcmVmZXIgdG8gc2ltcGx5IHNldCB1cCBzeW1ib2xpYyBsaW5rcyBiZXR3ZWVuICJ0Y2wuaCIgYW5kCnRoZSBtb3N0IHJlY2VudCBzdGFibGUgdmVyc2lvbiBvbiB0aGUgbWFjaGluZS4KCjIuICBQZXJsNAoKVGhpcyBpbXBsZW1lbnRhdGlvbiBoYXMgYmVlbiBiYXNlZCBvbiBQZXJsLTQuMDM1LiAgU1dJRydzIGludGVyZmFjZSB0bwpQZXJsNCBpcyBiYXNlZCBvbiB0aGUgZG9jdW1lbnRhdGlvbiBwcm92aWRlZCBpbiB0aGUgIlByb2dyYW1taW5nIFBlcmwiCmJvb2sgYnkgTGFycnkgV2FsbCwgYW5kIGZpbGVzIGxvY2F0ZWQgaW4gdGhlICJ1c3ViIiBkaXJlY3Rvcnkgb2YgdGhlClBlcmw0IGRpc3RyaWJ1dGlvbi4KCkluIG9yZGVyIHRvIGNvbXBpbGUgd2l0aCBQZXJsNCwgeW91J2xsIG5lZWQgdG8gbGluayB3aXRoIHRoZSB1cGVybC5vCmZpbGUgZm91bmQgaW4gdGhlIFBlcmw0IHNvdXJjZSBkaXJlY3RvcnkuICBZb3UgbWF5IHdhbnQgdG8gbW92ZSB0aGlzCmZpbGUgdG8gYSBtb3JlIGNvbnZlbmllbnQgbG9jYXRpb24uCgozLiAgUGVybDUKClRoaXMgaXMgYSBzb21ld2hhdCBleHBlcmltZW50YWwgaW1wbGVtZW50YXRpb24sIGJ1dCBpcyBhbG90IGxlc3MKYnVnZ3kgdGhhbiB0aGUgYWxwaGEgcmVsZWFzZS4gICAgIFNXSUcgb3BlcmF0ZXMgaW5kZXBlbmRlbnRseSBvZgp0aGUgWFMgbGFuZ3VhZ2UgYW5kIHhzdWJwcCBzdXBwbGllZCB3aXRoIFBlcmw1LiAgQ3VycmVudGx5IFNXSUcKcHJvZHVjZXMgdGhlIG5lY2Vzc2FyeSBDIGNvZGUgYW5kIC5wbSBmaWxlIG5lZWRlZCB0byBkeW5hbWljYWxseQpsb2FkIGEgbW9kdWxlIGludG8gUGVybDUuCgpUbyBzdXBwb3J0IFBlcmw1J3Mgbm90aW9uIG9mIG1vZHVsZXMgYW5kIHBhY2thZ2VzIChhcyB3aXRoIHhzdWJwcCksCnlvdSBjYW4gdXNlIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBsaW5lIG9wdGlvbnMgOgoKICAgICAgICAlIHdyYXAgLXBlcmw1IC1tb2R1bGUgTXlNb2R1bGUgLXBhY2thZ2UgTXlQYWNrYWdlIGV4YW1wbGUuaQoKTm90ZSA6IEluIG9yZGVyIGZvciBkeW5hbWljIGxvYWRpbmcgdG8gYmUgZWZmZWN0aXZlLCB5b3UgbmVlZCB0byBiZQpjYXJlZnVsIGFib3V0IG5hbWluZy4gICAgRm9yIGEgbW9kdWxlIG5hbWVkICJNeU1vZHVsZSIsIHlvdSdsbCBuZWVkIHRvCmNyZWF0ZSBhIHNoYXJlZCBvYmplY3QgZmlsZSBjYWxsZWQgIk15TW9kdWxlLnNvIiB1c2luZyBzb21ldGhpbmcgbGlrZQoKICAgICAgICAlIGxkIC1zaGFyZWQgbXlfb2JqLm8gLW8gTXlNb2R1bGUuc28KClRoZSB1c2Ugb2YgdGhlICVpbml0IGRpcmVjdGl2ZSBtdXN0IG1hdGNoIHRoZSBtb2R1bGUgbmFtZSBzaW5jZSBQZXJsNQpjYWxscyBhIGZ1bmN0aW9uICJib290X01vZHVsZU5hbWUiIGluIG9yZGVyIHRvIGluaXRpYWxpemUgdGhpbmdzLgpTZWUgdGhlIEV4YW1wbGVzIGRpcmVjdG9yeSBmb3Igc29tZSBleGFtcGxlcyBvZiBob3cgdG8gZ2V0IHRoaW5ncwp0byB3b3JrLgoKNC4gIFB5dGhvbjEuMwoKVGhpcyBpcyB0aGUgZmlyc3QgcmVsZWFzZSBzdXBwb3J0aW5nIFB5dGhvbi4gICAgVGhlIFB5dGhvbiBwb3J0IGlzCmV4cGVyaW1lbnRhbCBhbmQgbWF5IGJlIHJld3JpdHRlbi4gICBWYXJpYWJsZSBsaW5rYWdlIGlzIGRvbmUgdGhyb3VnaApmdW5jdGlvbnMgd2hpY2ggaXMgc29ydCBvZiBhIGtsdWRnZS4gIEkgYWxzbyB0aGluayBpdCB3b3VsZCBiZSBuaWNlCnRvIGltcG9ydCBTV0lHIHBvaW50ZXJzIGludG8gUHl0aG9uIGFzIGEgbmV3IG9iamVjdCAoaW5zdGVhZCBvZiBzdHJpbmdzKS4KT2YgY291cnNlLCB0aGlzIG5lZWRzIGEgbGl0dGxlIG1vcmUgd29yay4KCjUuICBHdWlsZTMKCklmIHlvdSByZWFsbHkgd2FudCB0byBsaXZlIG9uIHRoZSBlZGdlLCBwaWNrIHVwIGEgY29weSBvZiBHdWlsZS1paWkgYW5kCnBsYXkgYXJvdW5kIHdpdGggdGhpcy4gICAgICBUaGlzIGlzIGhpZ2hseSBleHBlcmltZW50YWwtLS1lc3BlY2lhbGx5IHNpbmNlCkknbSBub3Qgc3VyZSB3aGF0IHRoZSBvZmZpY2lhbCBzdGF0ZSBvZiBHdWlsZSBpcyB0aGVzZSBkYXlzLiAgVGhpcwppbXBsZW1lbnRhdGlvbiBtYXkgY2hhbmdlIGF0IGFueSB0aW1lIHNob3VsZCBJIHN1ZGRlbmx5IGZpZ3VyZSBvdXQgYmV0dGVyCndheXMgdG8gZG8gdGhpbmdzLgoKNi4gIEV4dGVuZGluZyBTV0lHCgpTV0lHIGlzIHdyaXR0ZW4gaW4gQysrIGFsdGhvdWdoIEkgdGVuZCB0byB0aGluayBvZiB0aGUgY29kZSBhcyBtb3N0bHkKYmVpbmcgQU5TSSBDIHdpdGggYSBsaXR0bGUgaW5oZXJpdGFuY2UgdGhyb3duIGluLiAgIEVhY2ggdGFyZ2V0IGxhbmd1YWdlCmlzIGltcGxlbWVudGVkIGFzIGEgQysrIGNsYXNzIHRoYXQgY2FuIGJlIHBsdWdnZWQgaW50byB0aGUgc3lzdGVtLgpJZiB5b3Ugd2FudCB0byBhZGQgeW91ciBvd24gbW9kaWZpY2F0aW9ucywgc2VlIEFwcGVuZGl4IEMgb2YgdGhlIHVzZXIKbWFudWFsLiAgIFRoZW4gdGFrZSBhIGxvb2sgYXQgdGhlICJ1c2VyIiBkaXJlY3Rvcnkgd2hpY2ggY29udGFpbnMgc29tZQpjb2RlIGZvciBidWlsZGluZyB5b3VyIG93biBleHRlbmlvbnMuCgo3LiBUaGUgU1dJRyBsaWJyYXJ5CgpUaGUgU1dJRyBsaWJyYXJ5IGlzIHN0aWxsIGluY29tcGxldGUuICBTb21lIG9mIHRoZSBmaWxlcyBtZW50aW9uZWQgaW4KdGhlIHVzZXIgbWFudWFsIGFyZSB1bmF2YWlsYWJsZS4gICAgVGhlc2UgZmlsZXMgd2lsbCBiZSBtYWRlIGF2YWlsYWJsZQp3aGVuIHRoZXkgYXJlIHJlYWR5LiAgIFN1YnNjcmliZSB0byB0aGUgU1dJRyBtYWlsaW5nIGxpc3QgZm9yIGFubm91bmNlbWVudHMKYW5kIHVwZGF0ZXMuCgo4LiBTV0lHIERvY3VtZW50YXRpb24KCkkgaGF2ZSBzb21ldGltZXMgZXhwZXJpZW5jZWQgcHJvYmxlbXMgdmlld2luZyB0aGUgU1dJRyBkb2N1bWVudGF0aW9uIGluCnNvbWUgcG9zdHNjcmlwdCB2aWV3ZXJzLiAgIEhvd2V2ZXIsIHRoZSBkb2N1bWVudGF0aW9uIHNlZW1zIHRvIHByaW50Cm5vcm1hbGx5LiAgICBJJ20gd29ya2luZyBvbiBtYWtpbmcgbXVjaCBvZiB0aGUgZG9jdW1lbnRhdGlvbiBvbmxpbmUsCmJ1dCB0aGlzIHRha2VzIHRpbWUuCgpWZXJzaW9uIDAuMSBBbHBoYSAoRmVicnVhcnkgOSwgMTk5NikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxLiAgUnVuLXRpbWUgdHlwZS1jaGVja2luZyBvZiBTV0lHIHBvaW50ZXJzLiAgIFBvaW50ZXJzIGFyZSBub3cgcmVwcmVzZW50ZWQKICAgIGFzIHN0cmluZ3Mgd2l0aCBib3RoIG51bWVyaWMgYW5kIGVuY29kZWQgdHlwZSBpbmZvcm1hdGlvbi4gICAgVGhpcyBtYWtlcwogICAgaXQgYSBsaXR0bGUgaGFyZGVyIHRvIHNob290IHlvdXJzZWxmIGluIHRoZSBmb290IChhbmQgaXQgZWxpbWluYXRlcwogICAgc29tZSBzZWdtZW50YXRpb24gZmF1bHRzIGFuZCBvdGhlciBvZGRpdGllcykuCgoyLiAgUHl0aG9uIDEuMyBub3cgc3VwcG9ydGVkLgoKMy4gICNkZWZpbmUgYW5kIGVudW0gY2FuIGJlIHVzZWQgdG8gaW5zdGFsbCBjb25zdGFudHMuCgo0LiAgQ29tcGxldGVseSByZXdyb3RlIHRoZSAlaW5jbHVkZSBkaXJlY3RpdmUgYW5kIG1hZGUgaXQgYWxvdCBtb3JlIHBvd2VyZnVsLgoKNS4gIFJlc3RydWN0dXJlZCB0aGUgU1dJRyBsaWJyYXJ5IHRvIG1ha2UgaXQgd29yayBiZXR0ZXIuCgo2LiAgVmFyaW91cyBidWcgZml4ZXMgdG8gVGNsLCBQZXJsNCwgUGVybDUsIGFuZCBHdWlsZSBpbXBsZW1lbnRhdGlvbnMuCgo3LiAgQmV0dGVyIGltcGxlbWVudGF0aW9uIG9mICV0eXBlZGVmIGRpcmVjdGl2ZS4KCjguICBNYWRlIHNvbWUgY2hhbmdlcyB0byBTV0lHJ3MgY2xhc3Mgc3RydWN0dXJlIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGV4cGFuZC4KICAgIFNXSUcgaXMgbm93IGJ1aWx0IGludG8gYSBsaWJyYXJ5IGZpbGUgdGhhdCB5b3UgY2FuIHVzZSB0byBtYWtlIHlvdXIKICAgIG93biBleHRlbmlvbnMuCgo5LiAgTWFkZSBleHRlbnNpdmUgY2hhbmdlcyB0byB0aGUgZG9jdW1lbnRhdGlvbi4KCjEwLiBNaW5vciBjaGFuZ2VzIHRvIHRoZSBTV0lHIHBhcnNlciB0byBtYWtlIGl0IHVzZSBsZXNzIG1lbW9yeS4KICAgIEFsc28gdG9vayBvdXQgc29tZSBleHRyYW5lb3VzIHJ1bGVzIHRoYXQgd2VyZSB1bmRvY3VtZW50ZWQgYW5kCiAgICBkaWRuJ3Qgd29yayBpbiB0aGUgZmlyc3QgcGxhY2UuCgoxMS4gVGhlIFNXSUcgbGlicmFyeSBmaWxlcyAidGNsc2giLCAid2lzaCIsICJleHBlY3QiLCBldGMuLi4gaW4gdGhlIGZpcnN0CiAgICByZWxlYXNlIGhhdmUgYmVlbiByZXN0cnVjdHVyZWQgYW5kIHJlbmFtZWQgdG8gInRjbHNoLmkiLCAid2lzaC5pIiwKICAgIGFuZCBzbyBvbi4K