U1dJRyAoU2ltcGxpZmllZCBXcmFwcGVyIGFuZCBJbnRlcmZhY2UgR2VuZXJhdG9yKQoKU2VlIHRoZSBDSEFOR0VTLmN1cnJlbnQgZmlsZSBmb3IgY2hhbmdlcyBpbiB0aGUgY3VycmVudCB2ZXJzaW9uLgpTZWUgdGhlIFJFTEVBU0VOT1RFUyBmaWxlIGZvciBhIHN1bW1hcnkgb2YgY2hhbmdlcyBpbiBlYWNoIHJlbGVhc2UuCklzc3VlICMgbnVtYmVycyBtZW50aW9uZWQgYmVsb3cgY2FuIGJlIGZvdW5kIG9uIEdpdGh1Yi4gRm9yIG1vcmUgZGV0YWlscywgYWRkCnRoZSBpc3N1ZSBudW1iZXIgdG8gdGhlIGVuZCBvZiB0aGUgVVJMOiBodHRwczovL2dpdGh1Yi5jb20vc3dpZy9zd2lnL2lzc3Vlcy8KClZlcnNpb24gNC4xLjEgKDMwIE5vdiAyMDIyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMjItMTEtMjk6IGJlcm8KICAgICAgICAgICAgRml4IG1pc21hdGNoIGJldHdlZW4gI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoIGFuZCBwb3Agc3RhdGVtZW50cwoKMjAyMi0xMS0yNjogd3NmdWx0b24KICAgICAgICAgICAgIzI0NDkgRml4IHVuZGVmaW5lZCBiZWhhdmlvdXIgaW4gY2NhY2hlLXN3aWcgY2FsY3VsYXRpbmcgbWQ0IGhhc2hlcyBhbmQgcG9zc2libHkKICAgICAgICAgICAgYWxzbyBoYW5kbGluZyBlcnJvcnMgd2hlbiBDQ0FDSEVfQ1BQMiBpcyBzZXQuCgoyMDIyLTExLTI1OiB3c2Z1bHRvbgogICAgICAgICAgICAjOTYxIEZpeCBzeW50YXggZXJyb3IgcGFyc2luZyB1bm5hbWVkIHRlbXBsYXRlIHBhcmFtZXRlcnMgd2l0aCBhIGRlZmF1bHQgdmFsdWUuCgoyMDIyLTExLTI1OiBvbGx5CgkgICAgIzI0NDcgRml4IHVuZGVmaW5lZCBiZWhhdmlvdXIgaW4gc3dpZydzIHBhcnNlciB3aGVuIGhhbmRsaW5nCgkgICAgZGVmYXVsdCBwYXJhbWV0ZXIgZXhwcmVzc2lvbnMgY29udGFpbmluZyBtZXRob2QgY2FsbHMuCgoyMDIyLTExLTEzOiBvbGx5CgkgICAgW1BIUF0gIzI0MTkgVXBkYXRlIHRoZSBkb2N1bWVudGF0aW9uIHRvIHJlZmxlY3QgdGhhdCBTV0lHIDQuMS4wCgkgICAgZHJvcHBlZCBzdXBwb3J0IGZvciAtbm9wcm94eSB3aGVuIGdlbmVyYXRpbmcgUEhQIHdyYXBwZXJzLgoKMjAyMi0xMS0wNTogd3NmdWx0b24KICAgICAgICAgICAgIzI0MTcgRml4IC1zd2lnbGliIGZvciBXaW5kb3dzIHdoZW4gYnVpbGRpbmcgd2l0aCBDTWFrZS4KCjIwMjItMTEtMDI6IHdzZnVsdG9uCiAgICAgICAgICAgICMyNDE4IEZpeCBpbmZpbml0ZSBsb29wIGhhbmRsaW5nIG5vbi10eXBlIHRlbXBsYXRlIHBhcmFtZXRlcnMuCgogICAgICAgICAgICBGaXhlcyBpbmZpbml0ZSBsb29wIGR1ZSB0byAoKSBicmFja2V0cyBpbiBhIG5vbi10eXBlIHRlbXBsYXRlCiAgICAgICAgICAgIHBhcmFtZXRlciBjb250YWluaW5nIGFuIGV4cHJlc3Npb24uCgoyMDIyLTEwLTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gUiBydHlwZWNoZWNrIHR5cGVtYXBzCgogICAgICAgICAgICBGdXJ0aGVyIHN3aXRjaCB0byB1c2UgcnR5cGVjaGVjayB0eXBlbWFwcyBpbnN0ZWFkIG9mIGhhcmQgY29kZWQgbG9naWMuCiAgICAgICAgICAgIFRoZSBmdWxsIHN3aXRjaCB0byB0eXBlbWFwcyBpcyBkZWZlcnJlZCB1bnRpbCBzd2lnLTQuMiBhcyBpdCBjYW4ndCBiZSBmdWxseQogICAgICAgICAgICBiYWNrd2FyZHMgY29tcGF0aWJsZS4gRm9yIG5vdyBhIHdhcm5pbmcgaXMgcHJvdmlkZWQgdG8gaGVscCB0aGUKICAgICAgICAgICAgdHJhbnNpdGlvbi4gSXQgcHJvdmlkZXMgdGhlIGZ1bGwgdHlwZW1hcCB0aGF0IHNob3VsZCBiZSBwbGFjZWQgaW50bwogICAgICAgICAgICBhIHVzZXIncyBpbnRlcmZhY2UgZmlsZSwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAldHlwZW1hcCgicnR5cGUiKSBpbnQzMl90ICogImludGVnZXIiCiAgICAgICAgICAgIHZvaWQgdGVzdG1ldGhvZChpbnQzMl90ICogaSk7CiAgICAgICAgICAgIHZvaWQgdGVzdG1ldGhvZCgpOwoKICAgICAgICAgICAgSWYgdGhlcmUgaXMgbm8gcnR5cGVjaGVjayB0eXBlbWFwIGZvciBpbnQzMl90ICosIHRoZSB3YXJuaW5nIHNob3duIGlzOgoKICAgICAgICAgICAgICBleGFtcGxlLmk6NzogV2FybmluZyA3NTA6IE9wdGlvbmFsIHJ0eXBlY2hlY2sgY29kZSBpcyBkZXByZWNhdGVkLiBBZGQgdGhlCiAgICAgICAgICAgICAgZm9sbG93aW5nIHR5cGVtYXAgdG8gZml4IGFzIHRoZSBuZXh0IHZlcnNpb24gb2YgU1dJRyB3aWxsIG5vdCB3b3JrIHdpdGhvdXQgaXQ6CiAgICAgICAgICAgICAgJXR5cGVtYXAoInJ0eXBlY2hlY2siKSBpbnQzMl90ICogJXsgKGlzLmludGVnZXIoJGFyZykgfHwgaXMubnVtZXJpYygkYXJnKSkgJX0KCiAgICAgICAgICAgIFRoZSB3YXJuaW5nIGlzIHNob3duIGZvciBhbnkgY29kZSB0aGF0IHByZXZpb3VzbHkgdXNlZCAibnVtZXJpYyIsICJpbnRlZ2VyIiBvcgogICAgICAgICAgICAiY2hhcmFjdGVyIiBmb3IgdGhlIHJ0eXBlIHR5cGVtYXAuIENvcHlpbmcgdGhlIHJ0eXBlY2hlY2sgdHlwZW1hcCBhcwogICAgICAgICAgICBzaG93biBpbnRvIHRoZSB1c2VyIGludGVyZmFjZSBmaWxlIHdpbGwgcHJvdmlkZSB0aGUgYXBwcm9wcmlhdGUgZml4IGFuZAogICAgICAgICAgICB0aGUgd2FybmluZyB3aWxsIGRpc2FwcGVhci4gVGhpcyBpcyBpbXBvcnRhbnQgdG8gZG8gYXMgc3dpZy00LjIgd2lsbAogICAgICAgICAgICBub3QgYmUgYWJsZSB0byBwcm92aWRlIHRoaXMgaGVscGZ1bCB3YXJuaW5nLgoKMjAyMi0xMC0yNzogd3NmdWx0b24KICAgICAgICAgICAgW1JdIEFsbG93IE5VTEwgdG8gYmUgdXNlZCBpbiBvdmVybG9hZGVkIGZ1bmN0aW9ucyB0YWtpbmcgc2hhcmVkX3B0ci4KICAgICAgICAgICAgQWxzbyBmaXhlcyBzcGVjaWFsIHZhcmlhYmxlICRhcmd0eXBlIGV4cGFuc2lvbiBpbiBydHlwZWNoZWNrIHR5cGVtYXBzLgoKMjAyMi0xMC0yNjogd3NmdWx0b24KICAgICAgICAgICAgW1JdIEltcHJvdmUgUiB3cmFwcGVyIGVycm9yIG1lc3NhZ2Ugd2hlbiBjYWxsaW5nIG92ZXJsb2FkZWQgbWV0aG9kcwogICAgICAgICAgICB3aGVuIGluY29ycmVjdCB0eXBlcyBwYXNzZWQgYXJlIHBhc3NlZCB0byB0aGUgb3ZlcmxvYWRlZCBtZXRob2RzLgoKICAgICAgICAgICAgT2xkIHVuaGVscGZ1bCBlcnJvciBtZXNzYWdlOgogICAgICAgICAgICAgIEVycm9yIGluIGYoLi4uKSA6IGNvdWxkIG5vdCBmaW5kIGZ1bmN0aW9uICJmIgoKICAgICAgICAgICAgRXhhbXBsZSBvZiBuZXcgaW1wcm92ZWQgZXJyb3IgbWVzc2FnZToKICAgICAgICAgICAgICBFcnJvciBpbiB1c2VfY291bnQoaykgOgogICAgICAgICAgICAgICAgY2Fubm90IGZpbmQgb3ZlcmxvYWRlZCBmdW5jdGlvbiBmb3IgdXNlX2NvdW50IHdpdGggYXJndHlwZXMgKE5VTEwpCgoyMDIyLTEwLTI2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gIzIzODYgRml4IG1lbW9yeSBsZWFrIGluIFIgc2hhcmVkX3B0ciB3cmFwcGVycy4KICAgICAgICAgICAgRml4IGxlYWsgd2hlbiBhIGNhc3QgdXAgYSBjbGFzcyBpbmhlcml0YW5jZSBjaGFpbiBpcyByZXF1aXJlZC4KClZlcnNpb24gNC4xLjAgKDI0IE9jdCAyMDIyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMjItMTAtMjQ6IHdzZnVsdG9uLCBBbmRMTEEKICAgICAgICAgICAgW1JdICMyMzg2IEZpeCBwcm9ibGVtcyBpbiBzaGFyZWRfcHRyIHdyYXBwZXJzIHdoZXJlIHRoZSBjbGFzcyBuYW1lcwogICAgICAgICAgICB3ZXJlIG5vdCBjb25zaXN0ZW50IHdoZW4gdXNpbmcgdGhlIHNoYXJlZF9wdHIgdGVtcGxhdGUgb3IgdGhlIGFjdHVhbAogICAgICAgICAgICB1bmRlcmx5aW5nIHR5cGUuCgoyMDIyLTEwLTI0OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gQWRkIHN1cHBvcnQgZm9yIHNwZWNpYWwgdmFyaWFibGUgcmVwbGFjZW1lbnQgaW4gdGhlICR0eXBlbWFwKCkKICAgICAgICAgICAgc3BlY2lhbCB2YXJpYWJsZSBtYWNybyBmb3IgUiBzcGVjaWZpYyB0eXBlbWFwcyAocnR5cGUsIHJ0eXBlY2hlY2ssCiAgICAgICAgICAgIHNjb2VyY2Vpbiwgc2NvZXJlb3V0KS4KCjIwMjItMTAtMjQ6IHdzZnVsdG9uCgkgICAgW1JdIFBvbHltb3JwaGlzbSBpbiB0aGUgd3JhcHBlcnMgd2FzIG9ubHkgd29ya2luZyBmb3IgQysrIGNsYXNzZXMsCiAgICAgICAgICAgIG5vdyB0aGlzIHdvcmtzIGZvciBDKysgc3RydWN0cyB0b28uCgoyMDIyLTEwLTE5OiBvbGx5CgkgICAgW0x1YV0gIzIxMjYgRml4IHR5cGUgcmVzb2x1dGlvbiBiZXR3ZWVuIG11bHRpcGxlIFNXSUctd3JhcHBlZAoJICAgIG1vZHVsZXMuCgoyMDIyLTEwLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gIzIzODUgQWRkIHN1cHBvcnQgZm9yIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPj4uCgoyMDIyLTEwLTE0OiBtdXJpbGxvMTI4CgkgICAgW0phdmFzY3JpcHRdICMyMTA5IFR3ZWFrIHVuc2lnbmVkIGxvbmcgYW5kIHVuc2lnbmVkIGxvbmcgbG9uZyB0eXBlbWFwcwogICAgICAgICAgICB0byBjcmVhdGUgYSB2ODo6TnVtYmVyIGluc3RlYWQgb2Ygdjg6OkludGVnZXIgaWYgdGhlIHZhbHVlIGV4Y2VlZHMKICAgICAgICAgICAgdGhlIHNpemUgb2Ygdjg6OkludGVnZXIuIE5vdGUgdGhhdCB0aGUgdjg6Ok51bWJlciB2YWx1ZSB3aWxsIGJlCiAgICAgICAgICAgIGltcHJlY2lzZSBpZiB0aGUgdmFsdWUgaXMgPiBNQVhfU0FGRV9JTlRFR0VSLgoKMjAyMi0xMC0xNDogb2xseQoJICAgIFtSXSBBcnJhbmdlIHRoYXQgZGVzdHJ1Y3RvcnMgb2YgbG9jYWwgQysrIG9iamVjdHMgaW4gdGhlIHdyYXBwZXIKCSAgICBmdW5jdGlvbiBnZXQgcnVuIG9uIFNXSUdfZmFpbCAod2hpY2ggY2FsbHMgUmZfZXJyb3IoKSB3aGljaCBjYWxscwoJICAgIGxvbmdqbXAoKSkuCgoyMDIyLTEwLTE0OiBvbGx5CgkgICAgW0x1YV0gQXJyYW5nZSB0aGF0IGRlc3RydWN0b3JzIG9mIGxvY2FsIEMrKyBvYmplY3RzIGluIHRoZSB3cmFwcGVyCgkgICAgZnVuY3Rpb24gZ2V0IHJ1biBvbiBTV0lHX2ZhaWwgKHdoaWNoIGNhbGxzIGx1YV9lcnJvcigpIHdoaWNoIGNhbGxzCgkgICAgbG9uZ2ptcCgpKS4KCjIwMjItMTAtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSXSBBZGQgbWlzc2luZyBTV0lHVFlQRSAqY29uc3QmIHR5cGVtYXBzIGZvciBzdXBwb3J0aW5nIHBvaW50ZXJzCiAgICAgICAgICAgIGJ5IGNvbnN0IHJlZmVyZW5jZS4KCjIwMjItMTAtMTA6IHdzZnVsdG9uCiAgICAgICAgICAgICMyMTYwIEZpeCBjb21waWxlIGVycm9yIHdoZW4gdXNpbmcgdGVtcGxhdGVzIHdpdGggbW9yZSB0aGFuIG9uZSB0ZW1wbGF0ZQogICAgICAgICAgICBwYXJhbWV0ZXIgYW5kIHVzZWQgYXMgYW4gaW5wdXQgcGFyYW1ldGVyIGluIGEgdmlydHVhbCBtZXRob2QgaW4gYQogICAgICAgICAgICBkaXJlY3RvciBjbGFzcyAocHJvYmxlbSBhZmZlY3RpbmcgbW9zdCBvZiB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlcykuCgoyMDIyLTEwLTEwOiB0cmVpdG1heXIsIHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob24sIFJ1YnldICMxODExICMxODIzIEZpeCBpbnZhbGlkIGNvZGUgZ2VuZXJhdGVkIGluIHNvbWUgY2FzZXMgd2hlbgogICAgICAgICAgICByZXR1cm5pbmcgYSBwb2ludGVyIG9yIHJlZmVyZW5jZSB0byBhIGRpcmVjdG9yLWVuYWJsZWQgY2xhc3MgaW5zdGFuY2UuCiAgICAgICAgICAgIFRoaXMgcHJldmlvdXNseSBvbmx5IHdvcmtlZCBpbiB2ZXJ5IHNpbXBsZSBjYXNlcywgbm93IHJldHVybiB0eXBlcyBhcmUKICAgICAgICAgICAgcmVzb2x2ZWQgdG8gZml4LiBBIGJ1ZyBpbiB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9ucyB1c2luZyBwb2ludGVycyBhbHNvCiAgICAgICAgICAgIHdvcmtzIG5vdy4KCjIwMjItMTAtMDY6IHdzZnVsdG9uCgkgICAgW0NGRkldICMxOTY2ICMyMjAwIFJlbW92ZSBjb2RlIGZvciBDb21tb24gTGlzcCBDRkZJLiAgV2UgZHJvcHBlZCBzdXBwb3J0CgkgICAgZm9yIGl0IGluIFNXSUcgNC4wLjAgYnkgZGlzYWJsaW5nIGl0IGFzIHRoZSBmaXJzdCBzdGFnZS4gVGhpcyBpcyB0aGUKICAgICAgICAgICAgZmluYWwgc3RhZ2UgZm9yIGNvbXBsZXRlIHJlbW92YWwgYXMgdGhlcmUgaGFzIGJlZW4gbm8gbWVhbmluZ2Z1bAogICAgICAgICAgICBwcm9ncmVzcyB0byByZXZpdmUgaXQgdG8gdGhlIHN0YXR1cyBvZiBleHBlcmltZW50YWwgbGFuZ3VhZ2UuCgoyMDIyLTEwLTA2OiBvbGx5CgkgICAgW1B5dGhvbl0gIzIzOTAgUmVtb3ZlIGRlcHJlY2F0ZWQgYW5kIGFwcGFyZW50bHkgdXNlbGVzcyBkZWZhcmcuc3dnCgoJICAgIFRoZSBvbmx5IGRvY3VtZW50YXRpb24gaXMgaW4gdGhlIGZpbGUgaXRzZWxmIGFuZCBkZXNjcmliZXMgYSBQeXRob24KCSAgICB3cmFwcGVyIGFyb3VuZCB0aGUgQyBmdW5jdGlvbiBkZWZpbmVkIGhlcmUsIGJ1dCBkaWdnaW5nIHRob3VnaCB0aGUKCSAgICBnaXQgaGlzdG9yeSB0aGlzIFB5dGhvbiB3cmFwcGVyIGRvZXNuJ3Qgc2VlbSB0byBoYXZlIGV2ZXIgYWN0dWFsbHkKCSAgICBiZWVuIGdlbmVyYXRlZCBieSBTV0lHLgoKCSAgICBUaGlzIGZpbGUgd2FzIGFsc28gbWFya2VkIGFzIGRlcHJlY2F0ZWQgaW4gMjAwNS4KCjIwMjItMTAtMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSAjMjA0OCBGaXggcXVvdGluZyBmb3IgZG94eWdlbiBcaW1hZ2UgY29tbWFuZCB0byBxdW90ZSB0aGUgb3V0cHV0CiAgICAgICAgICAgIGZpbGUgbmFtZSBnZW5lcmF0ZWQgaW50byB0aGUgaHRtbCBzcmMgYXR0cmlidXRlLgoKMjAyMi0xMC0wNTogYmVuamFtaW4tc2NoCiAgICAgICAgICAgIFtQeXRob25dIGFkZGVkIGFuIGludGVycHJldGVyIGNvdW50ZXIgdG8gZml4IGRlaW5pdGlhbGl6YXRpb24KICAgICAgICAgICAgaXNzdWVzIGlmIG11bHRpcGxlIHN1YmludGVycHJldGVycyBhcmUgdXNlZAoKMjAyMi0xMC0wNTogb2xseSwgd3NmdWx0b24KICAgICAgICAgICAgIzY3MiBBZGQgc3VwcG9ydCBmb3IgcGFyc2luZyBDKysxMSBmaW5hbCBjbGFzc2VzIHN1Y2ggYXM6CgogICAgICAgICAgICAgIGNsYXNzIFggZmluYWwge307CgogICAgICAgICAgICBUaGlzIG5vIGxvbmdlciBnaXZlcyBhIHN5bnRheCBlcnJvci4KCjIwMjItMTAtMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtPQ2FtbF0gRml4ICVyZW5hbWUgZm9yIGVudW0gaXRlbXMuIFByZXZpb3VzbHkgdGhlIHJlbmFtZSBoYWQgbm8gZWZmZWN0LgoKMjAyMi0xMC0wNTogb2xseQoJICAgICMxNDY1IFJlcG9ydCBlcnJvcnMgaW4gcHJlcHJvY2Vzc29yIGV4cHJlc3Npb25zIGJ5IGRlZmF1bHQKCgkgICAgVW50aWwgbm93IFNXSUcgcXVpZXRseSBpZ25vcmVkIHN1Y2ggZXJyb3JzIHVubGVzcyAtV2V4dHJhIChvciAtV2FsbAoJICAgIHdoaWNoIGltcGxpZXMgLVdleHRyYSkgd2FzIHBhc3NlZCwgYnV0IHRoaXMgaXMgdW5oZWxwZnVsIGFzIGl0IHRlbmRzCgkgICAgdG8gaGlkZSBnZW51aW5lIHByb2JsZW1zLiAgVG8gaWxsdXN0cmF0ZSB0aGlzIHBvaW50LCBlbmFibGluZyB0aGlzCgkgICAgd2FybmluZyBieSBkZWZhdWx0IHJldmVhbGVkIGEgdHlwbyBpbiB0aGUgcHJlcHJvY19kZWZpbmVkLmkKCSAgICB0ZXN0Y2FzZSBpbiBTV0lHJ3Mgb3duIHRlc3RzdWl0ZS4KCgkgICAgSWYgeW91IHJlYWxseSBkb24ndCB3YW50IHRvIHNlZSB0aGlzIHdhcm5pbmcsIHlvdSBjYW4gc3VwcHJlc3MgaXQKCSAgICB3aXRoIGNvbW1hbmQgbGluZSBvcHRpb24gLXcyMDIgb3IgYnkgdXNpbmcgdGhpcyBpbiB5b3VyIGludGVyZmFjZQoJICAgIGZpbGU6CgoJICAgICV3YXJuZmlsdGVyKFNXSUdXQVJOX1BQX0VWQUxVQVRJT04pOwoKCSAgICBCb3RoIHdpbGwgd29yayB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIFNXSUcgdG9vLgoKMjAyMi0xMC0wNDogb2xseQoJICAgICMxMDUwIENvbnNpc3RlbnRseSBkZWZpbmUgU1dJR19WRVJTSU9OIGJvdGggYXQgU1dJRy10aW1lIGFuZCBpbgoJICAgIHRoZSBnZW5lcmF0ZWQgd3JhcHBlci4gIEJlc3QgcHJhY3RpY2UgcmVtYWlucyB0byBjaGVjayBhdCBTV0lHLXRpbWUKCSAgICB3aGVyZSBwb3NzaWJsZSBiZWNhdXNlIHRoYXQgcmVzdWx0cyBpbiBzbWFsbGVyIGdlbmVyYXRlZCB3cmFwcGVyCgkgICAgc291cmNlcy4KCgkgICAgU1dJR0dPIGFuZCBTV0lHSkFWQVNDUklQVCBhcmUgbm93IGRlZmluZWQgaW4gdGhlIGdlbmVyYXRlZCB3cmFwcGVycwoJICAgIHRvIG1hdGNoIGJlaGF2aW91ciBmb3IgYWxsIG90aGVyIHRhcmdldCBsYW5ndWFnZXMuCgoJICAgIFRoZSB1bmRvY3VtZW50ZWQgU1dJR1ZFUlNJT04gbWFjcm8gaXMgbm8gbG9uZ2VyIGRlZmluZWQuCgoyMDIyLTA5LTI5OiBvbGx5CgkgICAgIzIzMDMgU1dJRydzIGludGVybmFsIGhhc2ggdGFibGVzIG5vdyB1c2UgYSBiZXR0ZXIgaGFzaCBmdW5jdGlvbi4KCgkgICAgVGhlIG9sZCBoYXNoIGZ1bmN0aW9uIG9ubHkgY29uc2lkZXJkIHRoZSBsYXN0IGZpdmUgY2hhcmFjdGVycwoJICAgIHBsdXMgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCBvZiB0aGUgbGFzdC1idXQtc2l4dGggY2hhcmFjdGVyLAoJICAgIHdoaWNoIGFzIHlvdSBtaWdodCBndWVzcyBnZW5lcmF0ZWQgYSBsb3Qgb2YgbWFueS13YXkgY29sbGlzaW9ucy4KCgkgICAgVGhpcyBjaGFuZ2Ugc2VlbXMgdG8gZ2l2ZSBhYm91dCBhIDQlIHJlZHVjdGlvbiBpbiB3YWxsY2xvY2sgdGltZQoJICAgIGZvciBwcm9jZXNzaW5nIGxpX3N0ZF9saXN0X3dyYXAuaSBmcm9tIHRoZSB0ZXN0c3VpdGUgZm9yIFB5dGhvbi4KCSAgICBUaGUgaGFzaCBjb2xsaXNpb24gcmF0ZSBmb3IgdGhpcyBleGFtcGxlIGRyb3BzIGZyb20gMzklIHRvIDAhCgoyMDIyLTA5LTI5OiB3c2Z1bHRvbgogICAgICAgICAgICAjMjMwMyBUeXBlIHRhYmxlcyBhcmUgbm93IG91dHB1dCBpbiBhIGZpeGVkIG9yZGVyIHdoZXJlYXMgcHJldmlvdXNseQogICAgICAgICAgICB0aGUgb3JkZXIgbWF5IGNoYW5nZSB3aXRoIGFueSBtaW5vciBpbnB1dCBjb2RlIGNoYW5nZS4gVGhpcyBzaG91bGRuJ3QKICAgICAgICAgICAgYWZmZWN0IHVzZXJzIGV4Y2VwdCBTV0lHX1R5cGVQcmV0dHlOYW1lIG1heSBvdXRwdXQgYSBkaWZmZXJlbnQgQy9DKysKICAgICAgICAgICAgdHlwZWRlZiB0byBhIHR5cGUgLSBpdCdzIHVzZWQgbW9zdGx5IGZvciBzaG93aW5nIGVycm9ycyB3aGVuIHRoZSB0eXBlCiAgICAgICAgICAgIHBhc3NlZCB0byBhIGZ1bmN0aW9uIGlzIHdyb25nLgoKMjAyMi0wOS0yOTogb2xseQoJICAgIFtQSFBdIER5bmFtaWMgY2xhc3MgcHJvcGVydGllcyBhcmUgbm8gbG9uZ2VyIHN1cHBvcnRlZCBieSBkZWZhdWx0LgoKCSAgICBIaXN0b3JpY2FsbHkgUEhQIGhhcyBzdXBwb3J0ZWQgZHluYW1pYyBjbGFzcyBwcm9wZXJ0aWVzIGFuZCBTV0lHCgkgICAgaGFzIGltcGxlbWVudGVkIHRoZW0gdG9vIChiZWNhdXNlIHdlIGltcGxlbWVudCB0aGUgbWFnaWMgX19nZXQoKSwKCSAgICBfX3NldCgpIGFuZCBfX2lzc2V0KCkgbWV0aG9kcyB3ZSBuZWVkIHRvIGluY2x1ZGUgZXhwbGljaXQKCSAgICBoYW5kbGluZykuCgoJICAgIFBIUCA4LjIgZGVwcmVjYXRlcyBkeW5hbWljIGNsYXNzIHByb3BlcnRpZXMgLSBpbml0aWFsbHkgdGhleSdsbAoJICAgIHdhcm4sIGFuZCBhcHBhcmVudGx5IHRoZXknbGwgbm90IHdvcmsgYnkgZGVmYXVsdCBpbiBQSFAgOS4wOgoJICAgIGh0dHBzOi8vd2lraS5waHAubmV0L3JmYy9kZXByZWNhdGVfZHluYW1pY19wcm9wZXJ0aWVzCgoJICAgIEluIFBIUCBjb2RlIGR5bmFtaWMgcHJvcGVydGllcyBjYW4gYmUgZW5hYmxlZCBmb3IgYSBjbGFzcyBieQoJICAgIG1hcmtpbmcgdGhhdCBjbGFzcyB3aXRoIHRoZSBhdHRyaWJ1dGUgYCNbQWxsb3dEeW5hbWljUHJvcGVydGllc11gLgoKCSAgICBUbyBmb2xsb3cgdGhpcyBQSFAgY2hhbmdlLCBpbiBTV0lHIHlvdSBub3cgbmVlZCB0byBzcGVjaWZ5CgkgICAgYCVmZWF0dXJlKCJwaHA6YWxsb3dkeW5hbWljcHJvcGVydGllcyIsIDEpIEZvbztgIChvcgoJICAgIGAlZmVhdHVyZSgicGhwOmFsbG93ZHluYW1pY3Byb3BlcnRpZXMiLCAxKWAgdG8gZW5hYmxlIGl0IGZvcgoJICAgIGFsbCB3cmFwcGVkIGNsYXNzZXMpLiAgVW5rbm93biBmZWF0dXJlcyBhcmUgaWdub3JlZCwgc28geW91IGNhbiBhZGQKCSAgICBpdCB1bmNvbmRpdGlvbmFsbHkgYW5kIGl0J2xsIHdvcmsgd2l0aCBvbGRlciBTV0lHIHRvby4KCgkgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDIyLTA5LTE5OiB3c2Z1bHRvbgogICAgICAgICAgICAjMTQ4NCBGaXhlcyBmb3IgY2xhc3MgaW5oZXJpdGFuY2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGluIGRpZmZlcmVudCBuYW1lc3BhY2VzCiAgICAgICAgICAgIHN1Y2ggYXM6CgogICAgICAgICAgICAgIG5hbWVzcGFjZSBBIHsgY2xhc3MgQmFyIHt9OyB9CiAgICAgICAgICAgICAgbmFtZXNwYWNlIEIgeyB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPiBjbGFzcyBCYXIgOiBwdWJsaWMgQTo6QmFyIHt9OyB9CgoyMDIyLTA5LTE5OiB3c2Z1bHRvbgogICAgICAgICAgICAjMjMxNiBSZW1vdmUgc3dpZy5zcGVjIGZpbGUgYW5kIHNyY3JwbSBtYWtlZmlsZSB0YXJnZXQuIFRoZXNlIGFyZSB2ZXJ5IG91dCBvZiBkYXRlCiAgICAgICAgICAgIGFuZCBkb24ndCBzZWVtIHRvIGJlIHVzZWQgYnkgUlBNIGJhc2VkIExpbnV4IGRpc3RyaWJ1dGlvbnMgd2hpY2ggaGF2ZSB0aGVpcgogICAgICAgICAgICBvd24gdmVyc2lvbiBvZiBzd2lnLnNwZWMuCgoyMDIyLTA5LTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBbR28sIEd1aWxlLCBSYWNrZXQsIFNjaWxhYl0gQWRkIHRocm93cyB0eXBlbWFwcyBmb3Igc3RkOjpzdHJpbmcgc28gdGhhdCB0aHJvd24KICAgICAgICAgICAgc3RyaW5nIGV4Y2VwdGlvbiBtZXNzYWdlcyBjYW4gYmUgc2Vlbi4KCjIwMjItMDktMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSYWNrZXRdIEFkZCB0aHJvd3MgdHlwZW1hcHMgZm9yIGNoYXIgKiBzbyB0aGF0IHRocm93biBzdHJpbmcgZXhjZXB0aW9uCiAgICAgICAgICAgIG1lc3NhZ2VzIGNhbiBiZSBzZWVuIGZyb20gUmFja2V0LgoKMjAyMi0wOS0xNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFzY3JpcHQsIE9jdGF2ZSwgUl0gSW1wcm92ZSBleGNlcHRpb25zIGZvciAlY2F0Y2hlcyBhbmQgZXhjZXB0aW9uCiAgICAgICAgICAgIHNwZWNpZmljYXRpb25zIGZvciBuYXRpdmUgdHlwZXMuIFN0cmluZyBleGNlcHRpb24gbWVzc2FnZXMgYXJlIHNob3duIGFzCiAgICAgICAgICAgIHRoZSBleGNlcHRpb24gbWVzc2FnZSBpbnN0ZWFkIG9mIGp1c3QgdGhlIHR5cGUgb2YgdGhlIGV4Y2VwdGlvbi4KCjIwMjItMDktMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBtaXNzaW5nIHR5cGVjaGVjayB0eXBlbWFwcyBmb3Igc3RkOjphdXRvX3B0ciBhbmQgc3RkOjp1bmlxdWVfcHRyIHRvCiAgICAgICAgICAgIGZpeCBvdmVybG9hZGluZyB3aGVuIHVzaW5nIHRoZXNlIHR5cGVzLgoKMjAyMi0wOS0xNzogd3NmdWx0b24KICAgICAgICAgICAgW0d1aWxlXSBBZGQgZXJyb3IgY2hlY2tpbmcgdG8gU1dJR1RZUEUgYW5kIFNXSUdUWVBFICYgaW4gdHlwZW1hcHMgdG8gcHJldmVudAogICAgICAgICAgICBzZWcgZmF1bHRzIHdoZW4gcGFzc2luZyAjbmlsIHRvIHRoZXNlIHBhcmFtZXRlciB0eXBlcy4KCjIwMjItMDktMTY6IHdzZnVsdG9uCiAgICAgICAgICAgICM5OTkgUHJvdmlkZSBTV0lHVFlQRSBNT1ZFIHR5cGVtYXBzIGluIHN3aWdtb3ZlLmkgZm9yIGltcGxlbWVudGluZyBmdWxsCiAgICAgICAgICAgIG1vdmUgc2VtYW50aWNzIHdoZW4gcGFzc2luZyBwYXJhbWV0ZXJzIGJ5IHZhbHVlLgoKMjAyMi0wOC0zMTogd3NmdWx0b24KICAgICAgICAgICAgIzk5OSBJbXByb3ZlIG1vdmUgc2VtYW50aWNzIHdoZW4gdXNpbmcgcnZhbHVlIHJlZmVyZW5jZXMuCiAgICAgICAgICAgIFRoZSBTV0lHVFlQRSAmJiBpbnB1dCB0eXBlbWFwcyBub3cgYXNzdW1lIHRoZSBvYmplY3QgaGFzIGJlZW4gbW92ZWQuCgogICAgICAgICAgICBUaGVzZSB0eXBlbWFwcyBoYXZlIGJlZW4gY2hhbmdlZCBhc3N1bWluZyB0aGF0IGFmdGVyIHRoZSBmdW5jdGlvbiBjYWxsLAogICAgICAgICAgICB0aGUgcnZhbHVlIHJlZmVyZW5jZSBwYXJhbWV0ZXIgaGFzIGJlZW4gbW92ZWQuIFRoZSBwYXJhbWV0ZXIncyBwcm94eSBjbGFzcwogICAgICAgICAgICB0aGF0IG93bnMgdGhlIEMrKyBvYmplY3QgdGh1cyBoYXMgdGhlIHVuZGVybHlpbmcgcG9pbnRlciBzZXQgdG8gbnVsbAogICAgICAgICAgICBzbyB0aGF0IHRoZSAobW92ZWQgZnJvbSwgYnV0IHN0aWxsIHZhbGlkKSBDKysgb2JqZWN0IGNhbm5vdCBiZSB1c2VkIGFnYWluCiAgICAgICAgICAgIGFuZCB0aGUgb2JqZWN0IGlzIGFkZGl0aW9uYWxseSBkZWxldGVkLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDIyLTA4LTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBbT2N0YXZlXSBTV0lHIG5vdyBtYXJzaGFscyBhIEMvQysrIE5VTEwgcG9pbnRlciBpbnRvIHRoZSBudWxsIG1hdHJpeCwgW10uCiAgICAgICAgICAgIFNXSUcgaGFzIGFsd2F5cyBtYXJzaGFsbGVkIHRoZSBudWxsIG1hdHJpeCBpbnRvIGEgTlVMTCBwb2ludGVyOyB0aGlzIHJlbWFpbnMKICAgICAgICAgICAgYW5kIG5vdyB3ZSBoYXZlIGNvbnNpc3RlbmN5IGluIHJlcHJlc2VudGluZyBhIE5VTEwgcG9pbnRlci4KCjIwMjItMDgtMjY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSYWNrZXRdIFNXSUcgbm93IG1hcnNoYWxzIGEgQy9DKysgTlVMTCBwb2ludGVyIGludG8gYSBudWxsIHZhbHVlIGJ5IGNhbGxpbmcKICAgICAgICAgICAgc2NoZW1lX21ha2VfbnVsbCgpLCBzbyB0aGF0IHNjaGVtZSdzIG51bGw/IGlzIHRydWUgZm9yIGEgTlVMTCBDL0MrKyBwb2ludGVyIHZhbHVlLgoKMjAyMi0wOC0xODogd3NmdWx0b24KICAgICAgICAgICAgW1JhY2tldF0gQWRkIHN1cHBvcnQgZm9yIHN0ZDo6dW5pcXVlX3B0ciBpbiBzdGRfdW5pcXVlX3B0ci5pLgogICAgICAgICAgICBBZGQgc3VwcG9ydCBmb3Igc3RkOjphdXRvX3B0ciBpbiBzdGRfYXV0b19wdHIuaS4KCjIwMjItMDgtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtHdWlsZV0gQWRkIHN1cHBvcnQgZm9yIHN0ZDo6dW5pcXVlX3B0ciBpbiBzdGRfdW5pcXVlX3B0ci5pLgogICAgICAgICAgICBBZGQgc3VwcG9ydCBmb3Igc3RkOjphdXRvX3B0ciBpbiBzdGRfYXV0b19wdHIuaS4KCjIwMjItMDgtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIEFkZCBzdXBwb3J0IGZvciBzdGQ6OnVuaXF1ZV9wdHIgaW4gc3RkX3VuaXF1ZV9wdHIuaS4KICAgICAgICAgICAgQWRkIHN1cHBvcnQgZm9yIHN0ZDo6YXV0b19wdHIgaW4gc3RkX2F1dG9fcHRyLmkuCgoyMDIyLTA4LTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbRF0gRml4IG9jY2FzaW9uYWwgdW5kZWZpbmVkIGJlaGF2aW91ciB3aXRoIGluaGVyaXRhbmNlIGhpZXJhcmNoaWVzLCBwYXJ0aWN1bGFybHkKICAgICAgICAgICAgd2hlbiB1c2luZyB2aXJ0dWFsIGluaGVyaXRhbmNlIGFzIHRoZSBwb2ludGVycyB3ZXJlbid0IGNvcnJlY3RseSB1cGNhc3QgZnJvbSBkZXJpdmVkCiAgICAgICAgICAgIGNsYXNzIHRvIGJhc2UgY2xhc3Mgd2hlbiBzdG9yZWQgaW4gdGhlIGJhc2UncyBwcm94eSBjbGFzcy4KCjIwMjItMDgtMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtEXSBBZGQgc3VwcG9ydCBmb3Igc3RkOjp1bmlxdWVfcHRyIGluIHN0ZF91bmlxdWVfcHRyLmkuCiAgICAgICAgICAgIEFkZCBzdXBwb3J0IGZvciBzdGQ6OmF1dG9fcHRyIGluIHN0ZF9hdXRvX3B0ci5pLgoKMjAyMi0wOC0wMzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFzY3JpcHRdIEFkZCBzdXBwb3J0IGZvciBzdGQ6OnVuaXF1ZV9wdHIgaW4gc3RkX3VuaXF1ZV9wdHIuaS4KICAgICAgICAgICAgQWRkIHN1cHBvcnQgZm9yIHN0ZDo6YXV0b19wdHIgaW4gc3RkX2F1dG9fcHRyLmkuCgoyMDIyLTA4LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBbT2N0YXZlXSBBZGQgc3VwcG9ydCBmb3Igc3RkOjp1bmlxdWVfcHRyIGluIHN0ZF91bmlxdWVfcHRyLmkuCiAgICAgICAgICAgIEFkZCBzdXBwb3J0IGZvciBzdGQ6OmF1dG9fcHRyIGluIHN0ZF9hdXRvX3B0ci5pLgoKMjAyMi0wOC0wMTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQWRkIGluaXRpYWxpc2VycyBmb3IgYWRkaXRpb25hbCBtZW1iZXJzIGluIFB5SGVhcFR5cGVPYmplY3QKICAgICAgICAgICAgKGJ1aWx0aW4gbW9kZSkgZm9yIFB5dGhvbi0zLjExIC0gX2h0X3RwbmFtZSwgX3NwZWNfY2FjaGUuCgoyMDIyLTA3LTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBDKysyMCBoYXMgZGVwcmVjYXRlZCBzdGQ6OmJhc2ljX3N0cmluZzw+OjpyZXNlcnZlKCkgYW5kIHRoZSBDKysxMSBtZXRob2QKICAgICAgICAgICAgc3RkOjpiYXNpY19zdHJpbmc8Pjo6c2hyaW5rX3RvX2ZpdCgpIGlzIGEgcmVwbGFjZW1lbnQgdGhhdCBjYW4gYmUgdXNlZC4KICAgICAgICAgICAgc3RkX3N0cmluZy5pIGFuZCBzdGRfd3N0cmluZy5pIHByb3ZpZGVkIHdyYXBwZXJzIGZvciByZXNlcnZlIHdpdGggdGhlIGZvbGxvd2luZwogICAgICAgICAgICB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uczoKCiAgICAgICAgICAgICAgJXRlbXBsYXRlKHN0cmluZykgc3RkOjpiYXNpY19zdHJpbmc8Y2hhcj47CiAgICAgICAgICAgICAgJXRlbXBsYXRlKHdzdHJpbmcpIHN0ZDo6YmFzaWNfc3RyaW5nPHdjaGFyX3Q+OwoKICAgICAgICAgICAgVGhlIHJlc2VydmUgbWV0aG9kIGlzIG5vIGxvbmdlciB3cmFwcGVkLCBob3dldmVyIHRoZSBzaHJpbmtfdG9fZml0KCkgbWV0aG9kCiAgICAgICAgICAgIGNhbiBiZSB1c2VkIGFzIGFuIGFsdGVybmF0aXZlIGZyb20gdGhlIHRhcmdldCBsYW5ndWFnZSAodGhlIGdlbmVyYXRlZCB3cmFwcGVycwogICAgICAgICAgICBjYWxsIHJlc2VydmUoKSBpbnN0ZWFkIGlmIEMrKzw9MjApLgoKICAgICAgICAgICAgTm90ZSB0aGF0IHN0ZDo6YmFzaWNfc3RyaW5nPD46OnJlc2VydmUoc2l6ZV90IG4pIGlzIHN0aWxsIHdyYXBwZWQgdW5jaGFuZ2VkLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDIyLTA3LTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBbVGNsXSBBZGQgc3VwcG9ydCBmb3Igc3RkOjp1bmlxdWVfcHRyIGluIHN0ZF91bmlxdWVfcHRyLmkuCiAgICAgICAgICAgIEFkZCBzdXBwb3J0IGZvciBzdGQ6OmF1dG9fcHRyIGluIHN0ZF9hdXRvX3B0ci5pLgoKMjAyMi0wNy0yNzogWmFja2VyeVNweXR6LCBvbGx5CgkgICAgIzE2NzggU3VwcG9ydCBwYXJzaW5nIEMrKzIwIHRlbXBsYXRlZCBsYW1iZGFzLgoKMjAyMi0wNy0yNzogWmFja2VyeVNweXR6LCBvbGx5CgkgICAgIzE2MjIgQWRkIHN1cHBvcnQgZm9yIHRoZSBDKysyMCBzcGFjZXNoaXAgb3BlcmF0b3IgKDw9PikuCgoyMDIyLTA3LTI2OiBvbGx5CgkgICAgW1RjbF0gaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcC9zd2lnL2J1Z3MvOTc3LwoJICAgIEZpeCBoYW5kbGluZyBvZiBsb25nIGxvbmcgb24gMzItYml0IHBsYXRmb3Jtcy4gIFRoaXMgZml4IHJhaXNlcwoJICAgIFNXSUcncyBtaW5pbXVtIHN1cHBvcnRlZCBUY2wgdmVyc2lvbiB0byA4LjQuMCAod2hpY2ggd2FzIHJlbGVhc2VkCgkgICAganVzdCB1bmRlciAyMCB5ZWFycyBhZ28pLgoKMjAyMi0wNy0yNjogb2xseQogICAgICAgICAgICBGaXggaW5jb3JyZWN0IG9wZXJhdG9yIHByZWNlZGVuY2UgaW4gcHJlcHJvY2Vzc29yIGV4cHJlc3Npb25zLgoKMjAyMi0wNy0yNTogb2xseQoJICAgIFN1cHBvcnQgZm9yIEMrKzE0IGJpbmFyeSBpbnRlZ2VyIGxpdGVyYWxzIGluIHByZXByb2Nlc3NvciBleHByZXNzaW9ucy4KCjIwMjItMDctMjA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gRW5zdXJlIHRoZSBvcmRlciBvZiBpbnRlcmZhY2VzIGdlbmVyYXRlZCBpbiBwcm94eSBpbnRlcmZhY2VzIGZvciB0aGUKICAgICAgICAgICAgJWludGVyZmFjZSBmYW1pbHkgb2YgbWFjcm9zIGlzIHRoZSBzYW1lIGFzIHRoYXQgcGFyc2VkIGZyb20gdGhlIGJhc2VzIGluIEMrKy4KCjIwMjItMDctMjA6IGppY2tzLCBJbmdlbmVyNzQsIG9sbHkKCSAgICAjNDIyIFtQeXRob25dIEZpeCBtaXNoYW5kbGluZyBvZiBhIFB5dGhvbiBjbGFzcyBpbmhlcml0aW5nIGZyb20KCSAgICBtdWx0aXBsZSBTV0lHLXdyYXBwZWQgZGlyZWN0b3IgY2xhc3Nlcy4KCjIwMjItMDctMTk6IHdzZnVsdG9uCiAgICAgICAgICAgICM2OTIgW0MjLCBKYXZhLCBQZXJsLCBQeXRob24sIFJ1YnldIHN0ZDo6dW5pcXVlX3B0ciBhbmQgc3RkOjphdXRvX3B0ciB0eXBlbWFwcwogICAgICAgICAgICBwcm92aWRlZCBmb3IgaW5wdXRzIHR5cGVzIGluIHN0ZF91bmlxdWVfcHRyLmkgYW5kIHN0ZF9hdXRvX3B0ci5pLgoKICAgICAgICAgICAgTm93IHRoZXNlIHNtYXJ0IHBvaW50ZXJzIGNhbiBiZSB1c2VkIGFzIGlucHV0IHBhcmFtZXRlcnMgdG8gZnVuY3Rpb25zLiBBIHByb3h5CiAgICAgICAgICAgIGNsYXNzIGluc3RhbmNlIHRyYW5zZmVycyBtZW1vcnkgb3duZXJzaGlwIG9mIHRoZSB1bmRlcmx5aW5nIEMrKyBvYmplY3QgZnJvbSB0aGUKICAgICAgICAgICAgcHJveHkgY2xhc3MgdG8gYSBzbWFydCBwb2ludGVyIGluc3RhbmNlIHBhc3NlZCB0byB0aGUgd3JhcHBlZCBmdW5jdGlvbi4KCjIwMjItMDctMTk6IGpzY2h1ZWxsZXIKCSAgICBbUHl0aG9uXSAjMjMxNCBEcm9wIHN1cHBvcnQgZm9yIFB5dGhvbiAzLjIuCgoyMDIyLTA3LTE5OiBvbGx5CgkgICAgUmVtb3ZlIHJlbWFpbmluZyBzdXBwb3J0IGNvZGUgZm9yIGNsYXNzaWMgbWFjb3MsIHdoaWNoIGhhcyBub3QgYmVlbgoJICAgIHN1cHBvcnRlZCBieSBBcHBsZSBmb3Igb3ZlciAyMCB5ZWFycyBub3cuCgoyMDIyLTA3LTEyOiB3c2Z1bHRvbgogICAgICAgICAgICAjOTk5IFBlcmZvcm1hbmNlIG9wdGltaXNhdGlvbiBmb3IgcGFyYW1ldGVycyBwYXNzZWQgYnkgdmFsdWUgdGhhdCBhcmUgQysrMTEgbW92YWJsZS4KICAgICAgICAgICAgVGhlIEMrKyB3cmFwcGVycyBjcmVhdGUgYSB0ZW1wb3JhcnkgdmFyaWFibGUgZm9yIGEgcGFyYW1ldGVyIHRvIGJlIHBhc3NlZCB0byBhCiAgICAgICAgICAgIGZ1bmN0aW9uLiBUaGlzIGlzIGluaXRpYWxseSBkZWZhdWx0IGNvbnN0cnVjdGVkIGFuZCB0aGVuIGNvcHkgYXNzaWduZWQgZnJvbSB0aGUKICAgICAgICAgICAgaW5zdGFuY2UgYmVpbmcgcGFzc2VkIGluIGZyb20gdGhlIHRhcmdldCBsYW5ndWFnZS4gVGhpcyBpcyB1bmNoYW5nZWQsIGhvd2V2ZXIsCiAgICAgICAgICAgIHdoZW4gdGhlIHRlbXBvcmFyeSB2YXJpYWJsZSBpcyBwYXNzZWQgdG8gdGhlIHdyYXBwZWQgZnVuY3Rpb24sIGl0IGlzIG5vdyBkb25lIHVzaW5nCiAgICAgICAgICAgIHN0ZDo6bW92ZS4gSWYgdGhlIHR5cGUgaXMgbW92ZSBjb25zdHJ1Y3RpYmxlLCB0aGUgbW92ZSBjb25zdHJ1Y3RvciB3aWxsIGJlIHVzZWQKICAgICAgICAgICAgaW5zdGVhZCBvZiB0aGUgY29weSBjb25zdHJ1Y3Rvci4KCjIwMjItMDctMTI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBBZGQgc3RkOjphdXRvX3B0ciBzdXBwb3J0IGluIHN0ZF9hdXRvX3B0ci5pIGxpYnJhcnkgZmlsZS4KCjIwMjItMDctMTI6IGVyZXpnZXZhCiAgICAgICAgICAgIFtQZXJsXSBBZGQgc3RkOjp1bmlxdWVfcHRyIHN1cHBvcnQgaW4gc3RkX3VuaXF1ZV9wdHIuaSBsaWJyYXJ5IGZpbGUuCgoyMDIyLTA3LTA3OiBqbWFycmVjCgkgICAgIzExNTggIzIyODYgQWRkIGJhc2ljIHN1cHBvcnQgZm9yIEMrKzExIGF0dHJpYnV0ZXMuICBUaGVzZSBhcmUgbm93CgkgICAgY3J1ZGVseSBpZ25vcmVkIGJ5IFNXSUcncyBwYXJzZXIncyB0b2tlbmlzZXIsIHdoaWNoIGlzIGJldHRlciB0aGFuCgkgICAgZmFpbGluZyB3aXRoIGEgcGFyc2UgZXJyb3IuCgoyMDIyLTA3LTA1OiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gIzIyNDUgSGFuZGxlIE5VTEwgcG9pbnRlcnMgZm9yIHN0cmluZyogY29udmVyc2lvbnMuCgkgICAgUmVhcnJhbmdlIGdlbmVyYXRpb24gb2YgZGlyZWN0b3IgbWV0aG9kcyBhbmQgcmVuYW1lCgkgICAgcmVjZWl2ZXIgYXJndW1lbnQgZnJvbSBwIHRvIHN3aWdfcC4KCjIwMjItMDctMDM6IHdzZnVsdG9uCiAgICAgICAgICAgICM5OTkgUGVyZm9ybWFuY2Ugb3B0aW1pc2F0aW9uIGZvciBkaXJlY3RvcnMgZm9yIGNsYXNzZXMgcGFzc2VkIGJ5IHZhbHVlLiBUaGUgZGlyZWN0b3JpbgogICAgICAgICAgICB0eXBlbWFwcyBpbiB0aGUgZGlyZWN0b3IgbWV0aG9kcyBub3cgdXNlIHN0ZDo6bW92ZSBvbiB0aGUgaW5wdXQgcGFyYW1ldGVyIHdoZW4KICAgICAgICAgICAgY29weWluZyB0aGUgb2JqZWN0IGZyb20gdGhlIHN0YWNrIHRvIHRoZSBoZWFwIHByaW9yIHRvIHRoZSBjYWxsYmFjayBpbnRvIHRoZSB0YXJnZXQKICAgICAgICAgICAgbGFuZ3VhZ2UsIHRoZXJlYnkgdGFraW5nIGFkdmFudGFnZSBvZiBtb3ZlIHNlbWFudGljcyBpZiBhdmFpbGFibGUuCgoyMDIyLTA3LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICAjMTcyMiBbQyMsIEphdmEsIFB5dGhvbiwgUnVieV0gQWRkIHN0ZDo6dW5pcXVlX3B0ciBzdXBwb3J0LiBQb3J0ZWQgZnJvbSBzdGQ6OmF1dG9fcHRyLgogICAgICAgICAgICBVc2UgdGhlICV1bmlxdWVfcHRyKFQpIG1hY3JvIGFzIGZvbGxvd3MgZm9yIHVzYWdlIHN0ZDo6dW5pcXVlX3B0cjxUPi4gRm9yIGV4YW1wbGUsIGZvcgogICAgICAgICAgICBhIGNsYXNzIGNhbGxlZCBLbGFzczoKCiAgICAgICAgICAgICAgJWluY2x1ZGUgInN0ZF91bmlxdWVfcHRyLmkiCiAgICAgICAgICAgICAgJXVuaXF1ZV9wdHIoS2xhc3MpCgogICAgICAgICAgICBTdXBwb3J0IGlzIGN1cnJlbnRseSBsaW1pdGVkIHRvIG9ubHkgcmV0dXJuaW5nIGEgc3RkOjp1bmlxdWVfcHRyIGZyb20gYSBmdW5jdGlvbi4KCjIwMjItMDYtMjk6IHdzZnVsdG9uCiAgICAgICAgICAgICM5OTkgIzEwNDQgRW5oYW5jZSBTV0lHVFlQRSAib3V0IiB0eXBlbWFwcyB0byB1c2Ugc3RkOjptb3ZlIHdoZW4gY29weWluZwogICAgICAgICAgICBvYmplY3RzLCB0aGVyZWJ5IG1ha2luZyB1c2Ugb2YgbW92ZSBzZW1hbnRpY3Mgd2hlbiB3cmFwcGluZyBhIGZ1bmN0aW9uIHJldHVybmluZwogICAgICAgICAgICBieSB2YWx1ZSBpZiB0aGUgcmV0dXJuZWQgdHlwZSBzdXBwb3J0cyBtb3ZlIHNlbWFudGljcy4KCiAgICAgICAgICAgIFdyYXBwaW5nIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBtb3ZlIG9ubHkgdHlwZXMgJ2J5IHZhbHVlJyBub3cgd29yayBvdXQgdGhlIGJveAogICAgICAgICAgICB3aXRob3V0IGhhdmluZyB0byBwcm92aWRlIGN1c3RvbSB0eXBlbWFwcy4KCiAgICAgICAgICAgIFRoZSBpbXBsZW1lbnRhdGlvbiByZW1vdmVkIGFsbCBjYXN0cyBpbiB0aGUgIm91dCIgdHlwZW1hcHMgdG8gYWxsb3cgdGhlIGNvbXBpbGVyIHRvCiAgICAgICAgICAgIGFwcHJvcHJpYXRlbHkgY2hvb3NlIGNhbGxpbmcgYSBtb3ZlIGNvbnN0cnVjdG9yLCB3aGVyZSBwb3NzaWJsZSwgb3RoZXJ3aXNlIGEgY29weQogICAgICAgICAgICBjb25zdHJ1Y3Rvci4gVGhlIGltcGxlbWVudGF0aW9uIGFsc28gcmVxdWlyZWQgbW9kaWZ5aW5nIFN3aWdWYWx1ZVdyYXBwZXIgdG8KICAgICAgICAgICAgY2hhbmdlIGEgY2FzdCBvcGVyYXRvciBmcm9tOgoKICAgICAgICAgICAgICBTd2lnVmFsdWVXcmFwcGVyOjpvcGVyYXRvciBUJigpIGNvbnN0OwoKICAgICAgICAgICAgdG8KCiAgICAgICAgICAgICAgI2lmIF9fY3BsdXNwbHVzID49MjAxMTAzTAogICAgICAgICAgICAgICAgU3dpZ1ZhbHVlV3JhcHBlcjo6b3BlcmF0b3IgVCYmKCkgY29uc3Q7CiAgICAgICAgICAgICAgI2Vsc2UKICAgICAgICAgICAgICAgIFN3aWdWYWx1ZVdyYXBwZXI6Om9wZXJhdG9yIFQmKCkgY29uc3Q7CiAgICAgICAgICAgICAgI2VuZGlmCgogICAgICAgICAgICBUaGlzIGlzIG5vdCBiYWNrd2FyZHMgY29tcGF0aWJsZSBmb3IgQysrMTEgYW5kIGxhdGVyIHdoZW4gdXNpbmcgdGhlIHZhbHVld3JhcHBlciBmZWF0dXJlCiAgICAgICAgICAgIGlmIGEgY2FzdCBpcyBleHBsaWNpdGx5IGJlaW5nIG1hZGUgaW4gdXNlciBzdXBwbGllZCAib3V0IiB0eXBlbWFwcy4gU3VnZ2VzdGVkIGNoYW5nZQogICAgICAgICAgICBpbiBjdXN0b20gIm91dCIgdHlwZW1hcHMgZm9yIEMrKzExIGFuZCBsYXRlciBjb2RlOgoKICAgICAgICAgICAgMS4gVHJ5IHJlbW92ZSB0aGUgY2FzdCBhbHRvZ2V0aGVyIHRvIGxldCB0aGUgY29tcGlsZXIgdXNlIGFuIGFwcHJvcHJpYXRlIGltcGxpY2l0IGNhc3QuCiAgICAgICAgICAgIDIuIENoYW5nZSB0aGUgY2FzdCwgZm9yIGV4YW1wbGUsIGZyb20gc3RhdGljX2Nhc3Q8WCAmPiB0byBzdGF0aWNfY2FzdDxYICYmPiwgdXNpbmcgdGhlCiAgICAgICAgICAgICAgIF9fY3BsdXNwbHVzIG1hY3JvIGlmIGFsbCB2ZXJzaW9ucyBvZiBDKysgbmVlZCB0byBiZSBzdXBwb3J0ZWQuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMjItMDYtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgICMyMDM5IEFkZCBtb3ZlIGFzc2lnbm1lbnQgb3BlcmF0b3IgdG8gU3dpZ1ZhbHVlV3JhcHBlciB1c2VkIGJ5IHRoZQogICAgICAgICAgICB2YWx1ZXdyYXBwZXIgZmVhdHVyZS4KCjIwMjItMDYtMDQ6IHNldGhyagogICAgICAgICAgICBFbmhhbmNlICR0eXBlbWFwIHRvIHN1cHBvcnQgdHlwZW1hcCBhdHRyaWJ1dGVzLgoKICAgICAgICAgICAgICAkdHlwZW1hcChtZXRob2Q6YXR0cmlidXRlLCB0eXBlcGF0dGVybikKCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAldHlwZW1hcChjc3R5cGUsIG91dD0ib2JqZWN0IikgWENsYXNzICJYQ2xhc3MiCiAgICAgICAgICAgICAgJXR5cGVtYXAoY3Njb2RlKSBCYXJDbGFzcyAlewogICAgICAgICAgICAgICAgJHR5cGVtYXAoY3N0eXBlOm91dCwgWENsYXNzKSBiYXIoKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICB3aGljaCBleHBhbmRzIHRvCgogICAgICAgICAgICAgICAgb2JqZWN0IGJhcigpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9CgoyMDIyLTA1LTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIERdIEFkZCBuZXcgc3BlY2lhbCB2YXJpYWJsZSBleHBhbnNpb246ICRpbWZ1bmNuYW1lLgogICAgICAgICAgICBFeHBhbmRzIHRvIHRoZSBmdW5jdGlvbiBuYW1lIGNhbGxlZCBpbiB0aGUgaW50ZXJtZWRpYXJ5IGNsYXNzLgoKMjAyMi0wNS0zMDogTGluZGxleUYKICAgICAgICAgICAgW0phdmFdICMyMDQyIEFkZCBuZXcgc3BlY2lhbCB2YXJpYWJsZSBleHBhbnNpb246ICRpbWZ1bmNuYW1lLgogICAgICAgICAgICBFeHBhbmRzIHRvIHRoZSBmdW5jdGlvbiBuYW1lIGNhbGxlZCBpbiB0aGUgaW50ZXJtZWRpYXJ5IGNsYXNzLgoKMjAyMi0wNS0yODogamt1ZWJhcnQKICAgICAgICAgICAgW0phdmFdIE9uIHNvbWUgdmVyc2lvbnMgb2YgQW5kcm9pZCwgc3BlY2lmaWNhbGx5IEFuZHJvaWQgNiwKICAgICAgICAgICAgZGV0YWNoaW5nIHRoZSBjdXJyZW50IHRocmVhZCBmcm9tIHRoZSBKVk0gYWZ0ZXIgZXZlcnkgaW52b2NhdGlvbgogICAgICAgICAgICBjYXVzZXMgYSBtZW1vcnkgbGVhay4KCiAgICAgICAgICAgIE9mZmVyIFNXSUdfSkFWQV9ERVRBQ0hfT05fVEhSRUFEX0VORCB0byBjb25maWd1cmUgYSBiZWhhdmlvdXIKICAgICAgICAgICAgd2hlcmUgdGhlIEpWTSBpcyBvbmx5IGRldGFjaGVkIGluIHRoZSB0aHJlYWQgZGVzdHJ1Y3Rvci4KCiAgICAgICAgICAgIFNlZSBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS90cmFpbmluZy9hcnRpY2xlcy9wZXJmLWpuaSN0aHJlYWRzLgoKMjAyMi0wNS0yNzogeHlwcm9uCiAgICAgICAgICAgIFtQeXRob25dICMyMjc3IERlZmluZSBQWV9TU0laRV9UX0NMRUFOIG1hY3JvIGJlZm9yZSAjaW5jbHVkZSAiUHl0aG9uLmgiIGFzCiAgICAgICAgICAgIHJlY29tbWVuZGVkIGluIFB5dGhvbiAzLjcgYW5kIGxhdGVyLgoKICAgICAgICAgICAgVG8gYXZvaWQgdGhpcyBtYWNybyBkZWZpbml0aW9uLCBhZGQgdGhlIGZvbGxvd2luZyB0byB5b3VyIGludGVyZmFjZSBmaWxlIHNvCiAgICAgICAgICAgIHRoYXQgU1dJR19OT19QWV9TU0laRV9UX0NMRUFOIGlzIGRlZmluZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgQysrIHdyYXBwZXJzOgoKICAgICAgICAgICAgICAlYmVnaW4gJXsKICAgICAgICAgICAgICAjZGVmaW5lIFNXSUdfTk9fUFlfU1NJWkVfVF9DTEVBTgogICAgICAgICAgICAgICV9CgoyMDIyLTA1LTI2OiByb2t1cHMKICAgICAgICAgICAgW0MjXSAjMTMyMyBNb2RpZnkgU3dpZ0Rlcml2ZWRDbGFzc0hhc01ldGhvZCBmb3IgYSBtb3JlIGVmZmljaWVudCBkaXJlY3RvcgogICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiB3aGVuIGNhbGxpbmcgdmlydHVhbCBtZXRob2RzIHRoYXQgYXJlIG5vdCBvdmVycmlkZGVuLgoKMjAyMi0wNS0xNTogZXJlemdldmEsIGVpc2VsZWtkCiAgICAgICAgICAgIFtMdWEsIFBlcmwsIE9jdGF2ZSwgUEhQLCBUY2xdICMyMjc1ICMyMjc2ICMyMjgzIEFkZCBhcmdjYXJndi5pIGxpYnJhcnkgY29udGFpbmluZwogICAgICAgICAgICAoaW50IEFSR0MsIGNoYXIgKipBUkdWKSBtdWx0aS1hcmd1bWVudCB0eXBlbWFwcy4KCiAgICAgICAgICAgIERvY3VtZW50IHRoaXMgbGlicmFyeSBpbiBUeXBlbWFwcy5odG1sLgoKMjAyMi0wNS0wNzogS3Jpc1RoaWVsZW1hbnMKICAgICAgICAgICAgW1B5dGhvbl0gRml4ICJ0b28gbWFueSBpbml0aWFsaXplcnMgZm9yICdQeUhlYXBUeXBlT2JqZWN0JyIgZXJyb3JzCiAgICAgICAgICAgIHVzaW5nIFB5UHkgMy44IGFuZCBsYXRlci4KCjIwMjItMDUtMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQWRkIEMjIHdjaGFyX3QgKiBkaXJlY3RvciB0eXBlbWFwcwoKMjAyMi0wNC0yMDogY21pbnlhcmQKCSAgICBGaXggYW4gaXNzdWUgd2hlcmUgbmV3bGluZXMgd2VyZSBub3QgcHJvcGVybHkgZ2VuZXJhdGVkCgkgICAgZm9yIGdvZGlyZWN0b3JpbiB0eXBlbWFwcy4gIElmIHlvdSBoYXZlIGEgdmlydHVhbCBmdW5jdGlvbgoJICAgIG5vdCBhc3NpZ25lZCB0byB6ZXJvLCBpbiBzb21lIGNhc2VzIGl0IHdvbid0IGdlbmVyYXRlIGEKCSAgICBuZXdsaW5lIGFuZCB5b3Ugd2lsbCBzZWUgZXJyb3JzOgoJICAgICAgZXhhbXBsZS5nbzoxNTA4OjM6IGV4cGVjdGVkICc7JywgZm91bmQgc3dpZ19yCgkgICAgd2hlbiBjb21waWxpbmcgdGhlIGdvIGNvZGUuCgoJICAgIEFsc28gYWRkIGFuIGV4YW1wbGUgb2YgdXNpbmcgZ29pbiBhbmQgZ29kaXJlY3RvcmluIGFuZCBhZGQKCSAgICBhIHRlc3QgZm9yIHRoaXMgc2l0dWF0aW9uLgoKMjAyMi0wNC0yOTogamFzb24tZGFseSwgSmVycnlKb3ljZSwgd3NmdWx0b24KCSAgICBbQyNdICMxMjMzIEFkZCB3Y2hhcl90ICogYW5kIHN0ZDo6d3N0cmluZyBVbmljb2RlIHN0cmluZyBzdXBwb3J0IG9uIExpbnV4LgoKMjAyMi0wNC0xMTogcm9iaW5zdAoJICAgICMyMjU3IEZpeCBuZXcgUnVieSAzLjIgd2FybmluZyAidW5kZWZpbmluZyB0aGUgYWxsb2NhdG9yIG9mIFRfREFUQQoJICAgIGNsYXNzIHN3aWdfcnVudGltZV9kYXRhIi4KCjIwMjItMDQtMDc6IG9sbHkKCSAgICAjMTc1MCBTV0lHIG5vdyByZWNvZ25pc2VzIGFuZCBpZ25vcmVzIERveHlnZW4gZ3JvdXAgY29tbWFuZHMgYEB7YCBhbmQgYEB9YC4KCjIwMjItMDQtMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIC4vY29uZmlndXJlIG5vdyBlbmFibGVzIEMrKzExIGFuZCBsYXRlciBDKysgc3RhbmRhcmRzIHRlc3RpbmcgYnkgZGVmYXVsdCAod2hlbgogICAgICAgICAgICBydW5uaW5nOiAnbWFrZSBjaGVjaycpLgoKICAgICAgICAgICAgVGhlIG9wdGlvbnMgdG8gY29udHJvbCB0aGlzIHRlc3RpbmcgYXJlIHRoZSBzYW1lOgoKICAgICAgICAgICAgICAuL2NvbmZpZ3VyZSAtLWVuYWJsZS1jcHAxMS10ZXN0aW5nCiAgICAgICAgICAgICAgLi9jb25maWd1cmUgLS1kaXNhYmxlLWNwcDExLXRlc3RpbmcKCiAgICAgICAgICAgIEJ1dCB0aGUgZm9ybWVyIGlzIG5vdyB0aGUgZGVmYXVsdCBhbmQgdGhlIGxhdHRlciBjYW4gYmUgdXNlZCB0byB0dXJuIG9mZiBDKysxMSBhbmQKICAgICAgICAgICAgbGF0ZXIgQysrIHN0YW5kYXJkcyB0ZXN0aW5nLgoKMjAyMi0wNC0wNjogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gIzE2MzUgVGhlICJhdXRvZG9jIiBmZWF0dXJlIG5vIGxvbmdlciBvdmVycmlkZXMgRG94eWdlbiBjb21tZW50cwogICAgICAgICAgICBpbiB0aGUgZ2VuZXJhdGVkIGRvY3N0cmluZy4KCiAgICAgICAgICAgIElmIGEgImRvY3N0cmluZyIgZmVhdHVyZSBpcyBwcmVzZW50IGl0IHdpbGwgc3RpbGwgb3ZlcnJpZGUgYSBEb3h5Z2VuIGNvbW1lbnQuCiAgICAgICAgICAgIElmIHRoZSAiYXV0b2RvYyIgZmVhdHVyZSBpcyBhbHNvIHByZXNlbnQsIHRoZSBjb21iaW5lZCAiYXV0b2RvYyIgYW5kICJkb2NzdHJpbmciCiAgICAgICAgICAgIHdpbGwgb3ZlcnJpZGUgdGhlIERveHlnZW4gY29tbWVudC4gSWYgbm8gImRvY3N0cmluZyIgaXMgcHJlc2VudCB0aGVuIHRoZQogICAgICAgICAgICAiYXV0b2RvYyIgZmVhdHVyZSB3aWxsIG5vdCBiZSBnZW5lcmF0ZWQgd2hlbiB0aGVyZSBpcyBhIERveHlnZW4gY29tbWVudC4KCiAgICAgICAgICAgIFRoaXMgd2F5IHRoZSAiYXV0b2RvYyIgZmVhdHVyZSBjYW4gYmUgc3BlY2lmaWVkIGFuZCB1c2VkIHRvIHByb3ZpZGUgZG9jdW1lbnRhdGlvbgogICAgICAgICAgICBmb3IgJ21pc3NpbmcnIERveHlnZW4gY29tbWVudHMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMjItMDQtMDE6IG9sbHkKCSAgICBSZW1vdmUgdW5kb2N1bWVudGVkIGFuZCBub24tZnVuY3Rpb25hbCAtYnJvd3NlIGNvbW1hbmQgbGluZSBvcHRpb24uCgoyMDIyLTAzLTI2OiBlbHRvZGVyCiAgICAgICAgICAgIFtQeXRob25dICMxNjg0IFVzZSBkaWZmZXJlbnQgY2Fwc3VsZSBuYW1lcyB3aXRoIGFuZCB3aXRob3V0IC1idWlsdGluCgogICAgICAgICAgICBUeXBlcyBnZW5lcmF0ZWQgd2l0aCBhbmQgd2l0aG91dCAtYnVpbHRpbiBhcmUgbm90IGNvbXBhdGlibGUuIE1peGluZwogICAgICAgICAgICB0aGVtIGluIGEgY29tbW9uIHR5cGUgbGlzdCBsZWFkcyB0byBjcmFzaGVzLiBBdm9pZCB0aGlzIGJ5IHVzaW5nCiAgICAgICAgICAgIGRpZmZlcmVudCBjYXBzdWxlIG5hbWVzOiAidHlwZV9wb2ludGVyX2NhcHN1bGUiIHdpdGhvdXQgLWJ1aWx0aW4gYW5kCiAgICAgICAgICAgICJ0eXBlX3BvaW50ZXJfY2Fwc3VsZV9idWlsdGluIiB3aXRoLgoKMjAyMi0wMy0yNTogd3NmdWx0b24KICAgICAgICAgICAgVGhlIGRlYnVnIGNvbW1hbmQgbGluZSBvcHRpb25zIHRoYXQgZGlzcGxheSBwYXJzZSB0cmVlIG5vZGVzCiAgICAgICAgICAgICgtZGVidWctbW9kdWxlLCAtZGVidWctdG9wLCAtZGVidWctc3ltdGFicykgbm93IGRpc3BsYXkgcHJldmlvdXNseSBoaWRkZW4KICAgICAgICAgICAgbGlua2VkIGxpc3QgcG9pbnRlcnMgd2hpY2ggYXJlIHVzZWZ1bCBmb3IgZGVidWdnaW5nIHBhcnNlIHRyZWVzLgoKICAgICAgICAgICAgQWRkZWQgbmV3IGNvbW1hbmQgbGluZSBvcHRpb24gLWRlYnVnLXF1aWV0LiBUaGlzIHN1cHByZXNzZXMgdGhlIGRpc3BsYXkKICAgICAgICAgICAgb2YgbW9zdCBsaW5rZWQgbGlzdCBwb2ludGVycyBhbmQgc3ltYm9sIHRhYmxlIHBvaW50ZXJzIGluIHRoZSBwYXJzZSB0cmVlIG5vZGVzLgoKICAgICAgICAgICAgVGhlIGtleXMgaW4gdGhlIHBhcnNlIHRyZWUgbm9kZSBhcmUgbm93IHNob3duIGluIGFscGhhYmV0aWNhbCBvcmRlci4KCjIwMjItMDMtMjQ6IHdzZnVsdG9uCiAgICAgICAgICAgICMyMjQ0IEZpeCB1c2luZyBkZWNsYXJhdGlvbiBpbiBkZXJpdmVkIGNsYXNzIGJ1Z3Mgd2hlbiBhbGwgdGhlIGJhc2UKICAgICAgICAgICAgY2xhc3MncyBvdmVybG9hZGVkIG1ldGhvZHMgd2VyZSBvdmVycmlkZGVuIGluIHRoZSBkZXJpdmVkIGNsYXNzIC0KICAgICAgICAgICAgZml4ZXMgIm11bHRpcGx5IGRlZmluZWQiIGVycm9ycy4KCjIwMjItMDMtMjM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICMxNzc5IFRoZSAtcHkzIG9wdGlvbiBpcyBkZXByZWNhdGVkIGFuZCBub3cgaGFzIG5vIGVmZmVjdCBvbiB0aGUKICAgICAgICAgICAgY29kZSBnZW5lcmF0ZWQuIFVzZSBvZiB0aGlzIG9wdGlvbiByZXN1bHRzIGluIGEgZGVwcmVjYXRlZCB3YXJuaW5nLgogICAgICAgICAgICBUaGUgcmVsYXRlZCBTV0lHUFlUSE9OX1BZMyBtYWNybyB0aGF0IHRoaXMgb3B0aW9uIGRlZmluZWQgaXMgbm8gbG9uZ2VyIGdlbmVyYXRlZC4KCiAgICAgICAgICAgIE5vdGUgdGhhdCAlcHl0aG9ubm9uZHluYW1pYyBmZWF0dXJlIGdlbmVyYXRlcyBhIG1ldGFjbGFzcyB0aGF0IHdvcmtzIG9uIGJvdGgKICAgICAgICAgICAgUHl0aG9uIDIgYW5kIFB5dGhvbiAzLgoKMjAyMi0wMy0yMTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gIzE3NzkgcHlhYmMuaSBmb3IgYWJzdHJhY3QgYmFzZSBjbGFzc2VzIG5vdyBzdXBwb3J0cyB2ZXJzaW9ucyBvZgogICAgICAgICAgICBQeXRob24gcHJpb3IgdG8gMy4zIGJ5IHVzaW5nIHRoZSBjb2xsZWN0aW9uIG1vZHVsZSBmb3IgdGhlc2Ugb2xkZXIgdmVyc2lvbnMuCiAgICAgICAgICAgIFB5dGhvbi0zLjMgYW5kIGxhdGVyIGNvbnRpbnVlIHRvIHVzZSB0aGUgY29sbGVjdGlvbnMuYWJjIG1vZHVsZS4KICAgICAgICAgICAgVGhlIC1weTMgb3B0aW9uIG5vIGxvbmdlciBoYXMgYW55IGVmZmVjdCBvbiB0aGUgJXB5dGhvbmFiYyBmZWF0dXJlLgoKMjAyMi0wMy0yMToganNjaHVlbGxlciwgamltLWVhc3RlcmJyb29rLCB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjMjEzNyBDKysgc3RhdGljIG1lbWJlciBmdW5jdGlvbnMgbm8gbG9uZ2VyIGdlbmVyYXRlIGEgImZsYXR0ZW5lZCIKICAgICAgICAgICAgbmFtZSBpbiB0aGUgUHl0aG9uIG1vZHVsZS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHMgPSBleGFtcGxlLlNwYW0oKQogICAgICAgICAgICAgIHMuZm9vKCkgICAgICAgICAgICAgICAjIFNwYW06OmZvbygpIHZpYSBhbiBpbnN0YW5jZQogICAgICAgICAgICAgIGV4YW1wbGUuU3BhbS5mb28oKSAgICAjIFNwYW06OmZvbygpIHVzaW5nIGNsYXNzIG1ldGhvZAogICAgICAgICAgICAgIGV4YW1wbGUuU3BhbV9mb28oKSAgICAjIFNwYW06OmZvbygpICJmbGF0dGVuZWQiIG5hbWUKCiAgICAgICAgICAgIFRoZSAiZmxhdHRlbmVkIiBuYW1lIGlzIG5vIGxvbmdlciBnZW5lcmF0ZWQsIGJ1dCBjYW4gYmUgZ2VuZXJhdGVkCiAgICAgICAgICAgIGJ5IHVzaW5nIHRoZSBuZXcgLWZsYXRzdGF0aWNtZXRob2Qgb3B0aW9uLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDIyLTAzLTE4OiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gIzMzNyBJbXBsZW1lbnQgJWV4dGVuZCBiYXNlIG1ldGhvZHMgaW4gY2hpbGQgY2xhc3Nlcy4KCjIwMjItMDMtMTc6IG9sbHkKCSAgICBbUHl0aG9uXSAjMTc3OSBTV0lHJ3MgUHl0aG9uIHRlc3Qtc3VpdGUgYW5kIGV4YW1wbGVzIGFyZSBub3cKCSAgICBydW4gd2l0aCBQeXRob24gMyBieSBkZWZhdWx0LiAgVG8gcnVuIHRoZW0gd2l0aCBQeXRob24gMiwgc2V0CgkgICAgUFkyIHRvIGEgbm9uLWVtcHR5IHZhbHVlLCBlLmcuOgoKCSAgICBtYWtlIGNoZWNrLXB5dGhvbi10ZXN0LXN1aXRlIFBZMj0xCgoyMDIyLTAzLTE2OiBvbGx5CgkgICAgW0dvXSAjNjgzIC1pbnRnb3NpemUgaXMgbm93IG9wdGlvbmFsIC0gaWYgbm90IHNwZWNpZmllZCB0aGUKCSAgICBnZW5lcmF0ZWQgQy9DKysgd3JhcHBlciBjb2RlIHdpbGwgdXNlIHB0cmRpZmZfdCBmb3IgaW50Z28gYW5kCgkgICAgc2l6ZV90IGZvciB1aW50Z28uCgoyMDIyLTAzLTE1OiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gQWRkIHR5cGVtYXBzIGZvciBzdGQ6OnN0cmluZyouCgoyMDIyLTAzLTE1OiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gRG9uJ3QgY29udmVydCBhcnJheXMgdG8gcG9pbnRlcnMgaWYgdGhlcmUgaXMgYSAiZ290eXBlIgoJICAgIHR5cGVtYXAgZW50cnkuCgoyMDIyLTAzLTE1OiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gQWRkIGRvY3VtZW50YXRpb24gbm90ZSBhYm91dCBHbyBhbmQgQysrIGV4Y2VwdGlvbnMuCgoyMDIyLTAzLTEyOiB3c2Z1bHRvbgogICAgICAgICAgICAjMTUyNCAlaW50ZXJmYWNlIGZhbWlseSBvZiBtYWNyb3Mgbm8gbG9uZ2VyIGNvbnRhaW4gdGhlIGdldHRlci9zZXR0ZXIKICAgICAgICAgICAgbWV0aG9kcyBmb3Igd3JhcHBpbmcgdmFyaWFibGVzLiBUaGUgaW50ZXJmYWNlIG9ubHkgY29udGFpbnMKICAgICAgICAgICAgdmlydHVhbCBhbmQgbm9uLXZpcnR1YWwgaW5zdGFuY2UgbWV0aG9kcywgdGhhdCBpcywgbm8gc3RhdGljIG1ldGhvZHMuCiAgICAgICAgICAgIEVudW1zIGFyZSBhbHNvIG5vIGxvbmdlciBhZGRlZCB0byB0aGUgaW50ZXJmYWNlIChhZmZlY3RzIEphdmEgb25seSB3aGVyZQogICAgICAgICAgICB0aGV5IHdlcmUgbWlzc2luZyBmcm9tIHRoZSBwcm94eSBjbGFzcywgQyMgbmV2ZXIgaGFkIHRoZW0gaW4gdGhlIGludGVyZmFjZSkuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMjItMDMtMTI6IHdzZnVsdG9uCiAgICAgICAgICAgICMxMjc3IEZpeGVzIGZvciB0aGUgZmFtaWx5IG9mICVpbnRlcmZhY2UgbWFjcm9zLCAlaW50ZXJmYWNlLAogICAgICAgICAgICAlaW50ZXJmYWNlX2ltcGwgYW5kICVpbnRlcmZhY2VfY3VzdG9tIGZpeGVzIGZvciBvdmVybG9hZGVkIG1ldGhvZHMKICAgICAgICAgICAgaW4gYW4gaW5oZXJpdGFuY2UgY2hhaW4uCgogICAgICAgICAgICBXaGVuIEMrKyBtZXRob2RzIGFyZSBub3QgYWJsZSB0byBiZSBvdmVybG9hZGVkIGluIGEgZGVyaXZlZCBjbGFzcywKICAgICAgICAgICAgc3VjaCBhcyB3aGVuIHRoZXkgZGlmZmVyIGJ5IGp1c3QgY29uc3QsIG9yIHRoZSB0YXJnZXQgbGFuZ3VhZ2UKICAgICAgICAgICAgcGFyYW1ldGVycyB0eXBlcyBhcmUgaWRlbnRpY2FsIGV2ZW4gd2hlbiB0aGUgQysrIHBhcmFtZXRlciB0eXBlcwogICAgICAgICAgICBhcmUgZGlmZmVyZW50LCBTV0lHIHdpbGwgaWdub3JlIG9uZSBvZiB0aGUgb3ZlcmxvYWRlZCBtZXRob2RzIHdpdGgKICAgICAgICAgICAgYSB3YXJuaW5nLiBBICVpZ25vcmUgaXMgcmVxdWlyZWQgdG8gZXhwbGljaXRseSBpZ25vcmUgb25lIG9mIHRoZQogICAgICAgICAgICBvdmVybG9hZGVkIG1ldGhvZHMgdG8gYXZvaWQgdGhlIHdhcm5pbmcgbWVzc2FnZS4gTWV0aG9kcyBhZGRlZAogICAgICAgICAgICBpbiB0aGUgZGVyaXZlZCBjbGFzc2VzIGR1ZSB0byBvbmUgb2YgdGhlICVpbnRlcmZhY2UgbWFjcm9zIGFyZSBub3cKICAgICAgICAgICAgc2ltaWxhcmx5IGlnbm9yZWQvbm90IGFkZGVkIHRvIHRoZSBkZXJpdmVkIGNsYXNzLgoKICAgICAgICAgICAgVGhlIG1ldGhvZHMgYWRkZWQgdG8gdGhlIGRlcml2ZWQgY2xhc3NlcyBjYW4gbm93IGFsc28gYmUgbW9kaWZpZWQKICAgICAgICAgICAgdmlhICVmZWF0dXJlIGFuZCAlcmVuYW1lLgoKMjAyMi0wMy0wODogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIFRyZWF0IGEgbmlsIGFyZ3VtZW50IGFzIGEgTlVMTCBwb2ludGVyLgoKMjAyMi0wMy0wODogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIEFkZCBkb2N1bWVudGF0aW9uIG5vdGVzIGFib3V0IHRocmVhZCBsb2NhbCBzdG9yYWdlLgoKMjAyMi0wMy0wODogb2xseQoJICAgICMxMDA2IFNXSUcgbm93IGNvcGVzIHdpdGggYW4gaW50ZXJmYWNlIGZpbGVuYW1lIHNwZWNpZmllZCBvbiB0aGUKCSAgICBjb21tYW5kIGxpbmUgd2hpY2ggY29udGFpbnMgYSBjbG9zaW5nIHBhcmVudGhlc2lzIGApYCwgYW5kIG1vcmUKCSAgICBnZW5lcmFsbHkgd2l0aCBhdHRyaWJ1dGVzIHRvIGAlaW5jbHVkZWAgYW5kIGAlaW1wb3J0YCB3aGljaAoJICAgIGFyZSBxdW90ZWQgYW5kIGNvbnRhaW4gcGFyZW50aGVzZXMuCgoyMDIyLTAzLTA3OiBPbWFyIE1lZGluYQoJICAgIFtUY2xdIGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Avc3dpZy9idWdzLzEyOTAvCgkgICAgRml4IFNXSUdfQXNXQ2hhclB0ckFuZFNpemUoKSB0byBhY3R1YWxseSBhc3NpZ24gdG8gcmVzdWx0CgkgICAgdmFyaWFibGUuICBJdCBsb29rcyBsaWtlIFNXSUcvVGNsIHdpZGUgY2hhcmFjdGVyIGhhbmRsaW5nIGlzCgkgICAgY3VycmVudGx5IGZ1bmRhbWVudGFsbHkgYnJva2VuIGV4Y2VwdCBvbiBzeXN0ZW1zIHdoaWNoIHVzZSB3aWRlCgkgICAgY2hhcmFjdGVycyBhcyB0aGUgc3lzdGVtIGVuY29kaW5nLCBidXQgdGhpcyBzaG91bGQgZml4IHdyYXBwaW5nCgkgICAgZnVuY3Rpb25zIHdoaWNoIHRha2UgYSB3aWRlIHN0cmluZyBhcyBhIHBhcmFtZXRlciBvbiBNaWNyb3NvZnQKCSAgICBXaW5kb3dzLgoKMjAyMi0wMy0wNzogb2xseQoJICAgIFtKYXZhc2NyaXB0XSAjNjgyIEZpeCBoYW5kbGluZyBvZiBmdW5jdGlvbnMgd2hpY2ggdGFrZSB2b2lkKi4KCjIwMjItMDMtMDY6IG9sbHkKCSAgICBTV0lHIHNob3VsZCBub3cgcmVsaWFibHkgZXhpdCB3aXRoIHN0YXR1cyAwIGlmIHRoZSBydW4gd2FzCgkgICAgc3VjY2Vzc2Z1bCBhbmQgc3RhdHVzIDEgaWYgdGhlcmUgd2FzIGFuIGVycm9yIChvciBhIHdhcm5pbmcgYW5kCgkgICAgLVdlcnJvciB3YXMgaW4gZWZmZWN0KS4KCgkgICAgUHJldmlvdXNseSBpbiBzb21lIHNpdHVhdGlvbnMgU1dJRyB3b3VsZCB0cnkgdG8gZXhpdCB3aXRoIHRoZQoJICAgIHN0YXR1cyBzZXQgdG8gdGhlIG51bWJlciBvZiBlcnJvcnMgZW5jb3VudGVyZWQsIGJ1dCB0aGF0J3MKCSAgICBwcm9ibGVtYXRpYyAtIGZvciBleGFtcGxlIGlmIHRoZXJlIHdlcmUgMjU2IGVycm9ycyB0aGlzIHdvdWxkCgkgICAgcmVzdWx0IGluIGV4aXQgc3RhdHVzIDAgb24gbW9zdCBwbGF0Zm9ybXMuICBBbHNvIHNvbWUgZXJyb3IKCSAgICBzdGF0dXNlcyBoYXZlIHNwZWNpYWwgbWVhbmluZ3MgZS5nLiB0aG9zZSBkZWZpbmVkIGJ5IDxzeXNleGl0cy5oPi4KCSAgICBBbHNvIFNXSUcvSmF2YXNjcmlwdCB0cmllZCB0byBleGl0IHdpdGggc3RhdHVzIC0xIGluIGEgZmV3IHBsYWNlcwoJICAgICh3aGljaCB0eXBpY2FsbHkgcmVzdWx0cyBpbiBleGl0IHN0YXR1cyAyNTUpLgoKMjAyMi0wMy0wNTogd3NmdWx0b24KICAgICAgICAgICAgIzE0NDEgRml4IHVzaW5nIGRlY2xhcmF0aW9uIGluIGRlcml2ZWQgY2xhc3MgaW5jb3JyZWN0bHkgaW50cm9kdWNpbmcgYSBtZXRob2QKICAgICAgICAgICAgZnJvbSBhIGJhc2UgY2xhc3Mgd2hlbiB0aGUgdXNpbmcgZGVjbGFyYXRpb24gaXMgZGVjbGFyZWQgYmVmb3JlIHRoZSBtZXRob2QKICAgICAgICAgICAgZGVjbGFyYXRpb24uIFByb2JsZW0gb2NjdXJyZWQgd2hlbiB3aXRoaW4gYSBuYW1lc3BhY2UgYW5kIHRoZSBwYXJhbWV0ZXIgdHlwZXMKICAgICAgICAgICAgaW4gdGhlIG1ldGhvZCBzaWduYXR1cmVzIHdlcmUgbm90IGZ1bGx5IHF1YWxpZmllZC4KCjIwMjItMDMtMDU6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBUcmVhdCBub24tY29uc3QgcmVmZXJlbmNlcyBhcyBwb2ludGVycy4KCjIwMjItMDMtMDU6IGlhbmxhbmNldGF5bG9yCgkgICAgSW4gU1dJRyBHbyB0ZXN0c3VpdGUsIGZhaWwgdGVzdCBpZiAiZ28gYnVpbGQiIGZhaWxzLgoKMjAyMi0wMy0wMzogb2xseQoJICAgICMxOTAxICMyMjIzIFNXSUcgc2hvdWxkIG5vdyBhbHdheXMgZXhpdCBjbGVhbmx5IGlmIG1lbW9yeQoJICAgIGFsbG9jYXRpb24gZmFpbHMsIGluY2x1ZGluZyByZW1vdmluZyBhbnkgb3V0cHV0IGZpbGVzIGNyZWF0ZWQKCSAgICBkdXJpbmcgdGhlIGN1cnJlbnQgcnVuLgoKCSAgICBQcmV2aW91c2x5IG1vc3QgcGxhY2VzIGluIHRoZSBjb2RlIGRpZG4ndCBjaGVjayBmb3IgYSBOVUxMIHJldHVybgoJICAgIGZyb20gbWFsbG9jKCkvcmVhbGxvYygpL2NhbGxvYygpIGF0IGFsbCwgdHlwaWNhbGx5IHJlc3VsdGluZyBpbgoJICAgIHVuZGVmaW5lZCBiZWhhdmlvdXI7IHNvbWUgcGxhY2VzIHVzZWQgYXNzZXJ0KCkgdG8gY2hlY2sgZm9yIGEgTlVMTAoJICAgIHJldHVybiAod2hpY2ggaXMgYSBtaXN1c2Ugb2YgYXNzZXJ0KCkgYW5kIHN1Y2ggY2hlY2tzIGRpc2FwcGVhciBpZgoJICAgIGJ1aWx0IHdpdGggTkRFQlVHIGRlZmluZWQgbGVhdmluZyB1cyBiYWNrIHdpdGggdW5kZWZpbmVkCgkgICAgYmVoYXZpb3VyKS4KCjIwMjItMDMtMDM6IG9sbHkKCSAgICAjODkxIFJlcG9ydCBlcnJvcnMgZm9yIHR5cGVtYXAgYXR0cmlidXRlcyB3aXRob3V0IGEgdmFsdWUKCSAgICAocHJldmlvdXNseSBTV0lHIHNlZ2ZhdWx0ZWQpIGFuZCBmb3IgdHlwZW1hcCB0eXBlcyB3aXRoIGEgdmFsdWUKCSAgICAocHJldmlvdXNseSB0aGUgdmFsdWUgd2FzIHF1aWV0bHkgaWdub3JlZCkuCgoJICAgIFRoZSBvbGQgd2F5IG9mIHNwZWNpZnlpbmcgYSBsYW5ndWFnZSBuYW1lIGluIHRoZSB0eXBlbWFwIGF0dHJpYnV0ZXMKCSAgICBpcyBubyBsb25nZXIgc3VwcG9ydGVkIChpdCBoYXMgYmVlbiBkZXByZWNhdGVkIGZvciAxNiB5ZWFycykuCgoyMDIyLTAzLTAyOiBnZW9ncmFwaGlrYSwgd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gIzE5NTEgQWRkIFB5dGhvbiB2YXJpYWJsZSBhbm5vdGF0aW9ucyBzdXBwb3J0LgoKICAgICAgICAgICAgQm90aCBmdW5jdGlvbiBhbm5vdGF0aW9ucyBhbmQgdmFyaWFibGUgYW5ub3RhdGlvbnMgYXJlIHR1cm5lZCBvbiB1c2luZyB0aGUKICAgICAgICAgICAgInB5dGhvbjphbm5vdGF0aW9ucyIgZmVhdHVyZS4gRXhhbXBsZToKCiAgICAgICAgICAgICAgJWZlYXR1cmUoInB5dGhvbjphbm5vdGF0aW9ucyIsICJjIik7CgogICAgICAgICAgICAgIHN0cnVjdCBWIHsKICAgICAgICAgICAgICAgIGZsb2F0IHZhbDsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIGdlbmVyYXRlZCBjb2RlIGNvbnRhaW5zIGEgdmFyaWFibGUgYW5ub3RhdGlvbiBjb250YWluaW5nIHRoZSBDIGZsb2F0IHR5cGU6CgogICAgICAgICAgICAgIGNsYXNzIFYob2JqZWN0KToKICAgICAgICAgICAgICAgICAgdmFsOiAiZmxvYXQiID0gcHJvcGVydHkoX2V4YW1wbGUuVl92YWxfZ2V0LCBfZXhhbXBsZS5WX3ZhbF9zZXQpCiAgICAgICAgICAgICAgICAgIC4uLgoKICAgICAgICAgICAgUHl0aG9uIDMuNSBhbmQgZWFybGllciBkbyBub3Qgc3VwcG9ydCB2YXJpYWJsZSBhbm5vdGF0aW9ucywgc28gdmFyaWFibGUKICAgICAgICAgICAgYW5ub3RhdGlvbnMgY2FuIGJlIHR1cm5lZCBvZmYgd2l0aCBhICJweXRob246YW5ub3RhdGlvbnM6bm92YXIiIGZlYXR1cmUgZmxhZy4KICAgICAgICAgICAgRXhhbXBsZSB0dXJuaW5nIG9uIGZ1bmN0aW9uIGFubm90YXRpb25zIGJ1dCBub3QgdmFyaWFibGUgYW5ub3RhdGlvbnMgZ2xvYmFsbHk6CgogICAgICAgICAgICAgICVmZWF0dXJlKCJweXRob246YW5ub3RhdGlvbnMiLCAiYyIpOwogICAgICAgICAgICAgICVmZWF0dXJlKCJweXRob246YW5ub3RhdGlvbnM6bm92YXIiKTsKCiAgICAgICAgICAgIG9yIHZpYSB0aGUgY29tbWFuZCBsaW5lOgoKICAgICAgICAgICAgICAtZmVhdHVyZXMgcHl0aG9uOmFubm90YXRpb25zPWMscHl0aG9uOmFubm90YXRpb25zOm5vdmFyCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMjItMDItMjc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICM3MzUgIzE1NjEgRnVuY3Rpb24gYW5ub3RhdGlvbnMgY29udGFpbmluZyBDL0MrKyB0eXBlcyBhcmUgbm8gbG9uZ2VyCiAgICAgICAgICAgIGdlbmVyYXRlZCB3aGVuIHVzaW5nIHRoZSAtcHkzIG9wdGlvbi4gRnVuY3Rpb24gYW5ub3RhdGlvbnMgc3VwcG9ydCBoYXMgYmVlbgogICAgICAgICAgICBtb3ZlZCB0byBhIGZlYXR1cmUgdG8gcHJvdmlkZSBmaW5lciBncmFpbmVkIGNvbnRyb2wuIEl0IGNhbiBiZSB0dXJuZWQgb24KICAgICAgICAgICAgZ2xvYmFsbHkgYnkgYWRkaW5nOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgicHl0aG9uOmFubm90YXRpb25zIiwgImMiKTsKCiAgICAgICAgICAgIG9yIGJ5IHVzaW5nIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnQ6CgogICAgICAgICAgICAgIC1mZWF0dXJlcyBweXRob246YW5ub3RhdGlvbnM9YwoKICAgICAgICAgICAgQWxzbyBzZWUgZW50cnkgZGF0ZWQgMjAyMi0wMy0wMiwgcmVnYXJkaW5nIHZhcmlhYmxlIGFubm90YXRpb25zLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDIyLTAyLTI2OiB3c2Z1bHRvbgogICAgICAgICAgICAjNjU1ICMxODQwIEFkZCBuZXcgd2FybmluZyBXQVJOX0xBTkdfVVNJTkdfTkFNRV9ESUZGRVJFTlQgdG8gd2FybiB3aGVuIGEKICAgICAgICAgICAgbWV0aG9kIGludHJvZHVjZWQgYnkgYSB1c2luZyBkZWNsYXJhdGlvbiBpbiBhIGRlcml2ZWQgY2xhc3MgY2Fubm90CiAgICAgICAgICAgIGJlIHVzZWQgZHVlIHRvIGEgY29uZmxpY3QgaW4gbmFtZXMuCgoyMDIyLTAyLTI0OiBvbGx5CgkgICAgIzE0NjUgQW4gaW52YWxpZCBwcmVwcm9jZXNzb3IgZXhwcmVzc2lvbiBpcyByZXBvcnRlZCBhcyBhIHBhaXIgb2YKCSAgICB3YXJuaW5ncyB3aXRoIHRoZSBzZWNvbmQgZ2l2aW5nIGEgbW9yZSBkZXRhaWxlZCBtZXNzYWdlIGZyb20gdGhlCgkgICAgZXhwcmVzc2lvbiBldmFsdWF0b3IuICBQcmV2aW91c2x5IFNXSUcgcHJlZml4ZWQgdGhlIHNlY29uZCBtZXNzYWdlCgkgICAgd2l0aCAiRXJyb3I6IiAtIHRoYXQgd2FzIGNvbmZ1c2luZyBhcyBpdCdzIGFjdHVhbGx5IG9ubHkgYSB3YXJuaW5nCgkgICAgYnkgZGVmYXVsdCBzbyB3ZSd2ZSBub3cgZHJvcHBlZCB0aGlzIHByZWZpeC4KCgkgICAgQmVmb3JlOgoKCSAgICB4Lmk6MTogV2FybmluZyAyMDI6IENvdWxkIG5vdCBldmFsdWF0ZSBleHByZXNzaW9uICcxLjInCgkgICAgeC5pOjE6IFdhcm5pbmcgMjAyOiBFcnJvcjogJ0Zsb2F0aW5nIHBvaW50IGNvbnN0YW50IGluIHByZXByb2Nlc3NvciBleHByZXNzaW9uJwoKCSAgICBOb3c6CgoJICAgIHguaToxOiBXYXJuaW5nIDIwMjogQ291bGQgbm90IGV2YWx1YXRlIGV4cHJlc3Npb24gJzEuMicKCSAgICB4Lmk6MTogV2FybmluZyAyMDI6IEZsb2F0aW5nIHBvaW50IGNvbnN0YW50IGluIHByZXByb2Nlc3NvciBleHByZXNzaW9uCgoyMDIyLTAyLTIzOiBvbGx5CgkgICAgIzEzODQgRml4IGEgcHJlcHJvY2Vzc29yIGV4cHJlc3Npb24gZXZhbHVhdGlvbiBidWcuICBBCgkgICAgc3ViZXhwcmVzc2lvbiBpbiBwYXJlbnRoZXNlcyBsb3N0IGl0cyBzdHJpbmcvaW50IHR5cGUgZmxhZyBhbmQKCSAgICBpbnN0ZWFkIHVzZWQgd2hhdGV2ZXIgdHlwZSB3YXMgbGVmdCBpbiB0aGUgc3RhY2sgZW50cnkgZnJvbQoJICAgIHByZXZpb3VzIHVzZS4gIEluIHByYWN0aWNlIHdlIG1vc3RseSBnb3QgYXdheSB3aXRoIHRoaXMgYmVjYXVzZQoJICAgIG1vc3QgcHJlcHJvY2Vzc29yIGV4cHJlc3Npb25zIGFyZSBpbnRlZ2VyLCBidXQgaXQgY291bGQgaGF2ZQoJICAgIHJlc3VsdGVkIGluIGEgcHJlcHJvY2Vzc29yIGV4cHJlc3Npb24gaW5jb3JyZWN0bHkgZXZhbHVhdGluZyBhcwoJICAgIHplcm8uICBJZiAtV2V4dHJhIHdhcyBpbiB1c2UgeW91IGdvdCBhIHdhcm5pbmc6CgoJICAgIFdhcm5pbmcgMjAyOiBFcnJvcjogJ0Nhbid0IG1peCBzdHJpbmdzIGFuZCBpbnRlZ2VycyBpbiBleHByZXNzaW9uJwoKMjAyMi0wMi0yMTogZGF2aWRjbAoJICAgIFtTY2lsYWJdIEltcHJvdmUgNS41LjIsIDYuMC4wIGFuZCA2LjEuMCBzdXBwb3J0LgoKCSAgICBGb3IgU2NpbGFiIDUsIGxvbmcgbmFtZXMgYXJlIHJlZHVjZWQgdG8gc21hbGwgbmFtZXMgcHJlc2VydmluZyB0aGUgCgkgICAgY2xhc3MgcHJlZml4IGFuZCBhY2Nlc3NvciBzdWZmaXggKGdldCBvciBzZXQpLgoKCSAgICBGb3IgU2NpbGFiIDYsIGxvbmcgbmFtZXMgd2l0aCB0aGUgY2xhc3MgcHJlZml4IGFuZCBhY2Nlc3NvciBzdWZmaXgKCSAgICBzaG91bGQgYmUgdXNlZCBvbiB0aGUgdXNlciBjb2RlLgoKCSAgICBUaGUgYC10YXJnZXR2ZXJzaW9uYCBvcHRpb24gaGFzIGJlZW4gcmVtb3ZlZCBhcyB0aGUgZ2VuZXJhdGVkIGNvZGUKCSAgICBub3cgZGV0ZWN0cyB0aGUgU2NpbGFiIHZlcnNpb24gaW4gbG9hZGVyLnNjZSBvciBidWlsZGVyLnNjZS4KCgkgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDIyLTAyLTIwOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJXdhcm5maWx0ZXIgd2FybmluZyBzdXBwcmVzcyBmb3Igd2FybmluZyAzMTUgU1dJR1dBUk5fUEFSU0VfVVNJTkdfVU5ERUYuCgoyMDIyLTAyLTE3OiBvbGx5CgkgICAgW1BIUF0gaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcC9zd2lnL2J1Z3MvMTIxMS8KCSAgICBGaXggdG8gY2FsbCBjbGVhbnVwIGNvZGUgaW4gZXhjZXB0aW9uIHNpdHVhdGlvbnMgYW5kIG5vdCB0byBpbnZva2UKCSAgICB0aGUgZnJlZWFyZyB0eXBlbWFwIHR3aWNlIGluIGNlcnRhaW4gc2l0dWF0aW9ucy4KCjIwMjItMDItMTU6IG9sbHkKCSAgICAjMzAwICMzNjggSW1wcm92ZSBwYXJzZXIgaGFuZGxpbmcgb2YgJSBmb2xsb3dlZCBpbW1lZGlhdGVseSBieQoJICAgIGFuIGlkZW50aWZpZXIuICBJZiBpdCdzIG5vdCBhIHJlY29nbmlzZWQgZGlyZWN0aXZlIHRoZSBzY2FubmVyCgkgICAgbm93IGVtaXRzIE1PRFVMTyBhbmQgdGhlbiByZXNjYW5zIHdoYXQgZm9sbG93cywgYW5kIGlmIHRoZSBwYXJzZXIKCSAgICB0aGVuIGdpdmVzIGEgc3ludGF4IGVycm9yIHdlIHJlcG9ydCBpdCBhcyBhbiB1bmtub3duIGRpcmVjdGl2ZS4KCSAgICBUaGlzIG1lYW5zIHRoYXQgYGElYmAgaXMgbm93IGFsbG93ZWQgaW4gYW4gZXhwcmVzc2lvbiwgYW5kIHRoYXQKCSAgICB0aGluZ3MgbGlrZSBgJXN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPmAgbm93IGdpdmUgYW4gZXJyb3IgcmF0aGVyCgkgICAgdGhhbiBiZWluZyBxdWlldGx5IGlnbm9yZWQuCgoyMDIyLTAyLTExOiBhZHIyNgogICAgICAgICAgICBbUHl0aG9uXSAjMjE1NCBGaXggbWVtb3J5IGxlYWsuCgogICAgICAgICAgICBTV0lHIHB5dGhvbiBvYmplY3RzIHdlcmUgYmVpbmcgZnJlZWQgYWZ0ZXIgdGhlIGNvcnJlc3BvbmRpbmcgU1dJRwogICAgICAgICAgICBtb2R1bGUgaW5mb3JtYXRpb24gd2FzIGRlc3Ryb3llZCBpbiBQeXRob24gMywgY2F1c2luZyBsZWFrcyB3aGVuIGFzCiAgICAgICAgICAgIGEgcmVzdWx0IHRoZSBvYmplY3QgZGVzdHJ1Y3RvciBjb3VsZCBub3QgYmUgaW52b2tlZC4gVG8gcHJldmVudCB0aGlzCiAgICAgICAgICAgIG1pc29yZGVyaW5nLCBTV0lHIHB5dGhvbiBvYmplY3RzIG5vdyBvYnRhaW4gYSByZWZlcmVuY2UgdG8gdGhlCiAgICAgICAgICAgIFB5dGhvbiBjYXBzdWxlIHdyYXBwaW5nIHRoZSBtb2R1bGUgaW5mb3JtYXRpb24sIHNvIHRoYXQgdGhlIG1vZHVsZQogICAgICAgICAgICBpbmZvcm1hdGlvbiBpcyBjb3JyZWN0bHkgZGVzdHJveWVkIGFmdGVyIGFsbCBTV0lHIHB5dGhvbiBvYmplY3RzCiAgICAgICAgICAgIGhhdmUgYmVlbiBmcmVlZCAoYW5kIGNvcnJlc3BvbmRpbmcgZGVzdHJ1Y3RvcnMgaW52b2tlZCkuCgoyMDIyLTAyLTEwOiBvbGx5CgkgICAgW1RjbF0gaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcC9zd2lnL2J1Z3MvMTIwNy8KCSAgICBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3N3aWcvYnVncy8xMjEzLwoKCSAgICBGaXggVGNsIGdlbmVyaWMgaW5wdXQgdHlwZW1hcCBmb3Igc3RkOjp2ZWN0b3IuCgoyMDIyLTAyLTA3OiBzZXRocmoKICAgICAgICAgICAgIzIxOTYgQWRkIGFsdGVybmF0aXZlIHN5bnRheCBmb3Igc3BlY2lmeWluZyBmcmFnbWVudHMgaW4gdHlwZW1hcHMuCgogICAgICAgICAgICBOZXcgc3ludGF4OgogICAgICAgICAgICAgICV0eXBlbWFwKCJpbiIsIGZyYWdtZW50PSJmcmFnMSIsIGZyYWdtZW50PSJmcmFnMiIsIGZyYWdtZW50PSJmcmFnMyIpIHsuLi59CiAgICAgICAgICAgIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG86CiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4sIGZyYWdtZW50PSJmcmFnMSxmcmFnMixmcmFnMyIpIHsuLi59CgoKMjAyMi0wMi0wNzogb2xseQoJICAgICMxODA2IFJlbW92ZSBzdXBwb3J0IGZvciB0aGUgImNvbW1hbmQiIGVuY29kZXIsIHdoaWNoIHdhcyBtb3N0bHkKCSAgICBpbnRlbmRlZCBmb3IgdXNlIGluIGAlcmVuYW1lYCAtIG1vc3QgdXNlcyBjYW4gYmUgYWNoaWV2ZWQgdXNpbmcKCSAgICB0aGUgInJlZ2V4IiBlbmNvZGVyLCBzbyB3ZSByZWNvbW1lbmQgdXNpbmcgdGhhdCBpbnN0ZWFkLgoKCSAgICBUaGUgImNvbW1hbmQiIGVuY29kZXIgc3VmZmVycyBmcm9tIGEgbnVtYmVyIG9mIGlzc3VlcyAtIGFzIHRoZQoJICAgIGRvY3VtZW50YXRpb24gZm9yIGl0IGFkbWl0dGVkLCAiW2l0XSBpcyBleHRyZW1lbHkgc2xvdyBjb21wYXJlZCB0bwoJICAgIGFsbCB0aGUgb3RoZXIgW2VuY29kZXJzXSBhcyBpdCBpbnZvbHZlcyBzcGF3bmluZyBhIHNlcGFyYXRlIHByb2Nlc3MKCSAgICBhbmQgdXNpbmcgaXQgZm9yIG1hbnkgZGVjbGFyYXRpb25zIGlzIG5vdCByZWNvbW1lbmRlZCIgYW5kIHRoYXQgaXQKCSAgICAic2hvdWxkIGdlbmVyYWxseSBiZSBhdm9pZGVkIGJlY2F1c2Ugb2YgcGVyZm9ybWFuY2UKCSAgICBjb25zaWRlcmF0aW9ucyIuCgoJICAgIEJ1dCBpdCdzIGFsc28gbm90IHBvcnRhYmxlLiAgVGhlIGRlc2lnbiBhc3N1bWVzIHRoYXQgYC9iaW4vc2hgCgkgICAgc3VwcG9ydHMgYDw8PGAgYnV0IHRoYXQncyBhIGJhc2gtc3BlY2lmaWMgZmVhdHVyZSBzbyBpdCBkb2Vzbid0CgkgICAgd29yayBvbiBwbGF0Zm9ybXMgd2hlcmUgYC9iaW4vc2hgIGlzIG5vdCBiYXNoIC0gaXQgZmFpbHMgb24KCSAgICBEZWJpYW4sIFVidW50dSBhbmQgcHJvYmFibHkgc29tZSBvdGhlciBMaW51eCBkaXN0cm9zLCBwbHVzIG1vc3QKCSAgICBub24tTGludXggcGxhdGZvcm1zLiAgTWljcm9zb2Z0IFdpbmRvd3MgZG9lc24ndCBldmVuIGhhdmUgYQoJICAgIC9iaW4vc2ggYXMgc3RhbmRhcmQuCgoJICAgIEZpbmFsbHksIG5vIGVzY2FwaW5nIG9mIHRoZSBwYXNzZWQgc3RyaW5nIGlzIGRvbmUsIHNvIGl0IGhhcwoJICAgIHBvdGVudGlhbCBzZWN1cml0eSBpc3N1ZXMgKHRob3VnaCBhdCBsZWFzdCB3aXRoICVyZW5hbWUgdGhlIGlucHV0CgkgICAgaXMgbGltaXRlZCB0byB2YWxpZCBDL0MrKyBzeW1ib2wgbmFtZXMpLgoKMjAyMi0wMi0wNjogb2xseQoJICAgICMyMTkzIC1ERk9PIG9uIHRoZSBTV0lHIGNvbW1hbmQgbGluZSBub3cgc2V0cyBGT08gdG8gMSBmb3IKCSAgICBjb25zaXN0ZW5jeSB3aXRoIEMvQysrIGNvbXBpbGVyIHByZXByb2Nlc3NvcnMuICBQcmV2aW91c2x5CgkgICAgU1dJRyBzZXQgRk9PIHRvIGFuIGVtcHR5IHZhbHVlLgoKCSAgICBFeGlzdGluZyBpbnZvY2F0aW9ucyBvZiBTV0lHIHdpdGggYC1ERk9PYCB3aGVyZSB0aGUgZW1wdHkgdmFsdWUKCSAgICBtYXR0ZXJzIGNhbiBiZSB1cGRhdGVkIHRvIGAtREZPTz1gIHdoaWNoIHNob3VsZCB3b3JrIHdpdGggYm90aAoJICAgIG9sZCBhbmQgbmV3IHJlbGVhc2VzIG9mIFNXSUcuCgoJICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAyMi0wMi0wNjogc2V0aHJqCgkgICAgIzIxOTQgQ2xhc3NlcyB0aGF0IGFyZSBub24tYXNzaWduYWJsZSBkdWUgdG8gY29uc3QgZGF0YSBvciBjb25zdAoJICAgIHJlZmVyZW5jZSBtZW1iZXJzIGFyZSBub3cgYXV0b21hdGljYWxseSBkZXRlY3RlZC4KCjIwMjItMDItMDQ6IGZyaWVkcmljaGF0Z2MKCSAgICBbT2N0YXZlXSAjMTY3MiBGaXggZm9yIGlzb2JqZWN0IGZvciBPY3RhdmUgNC40IC0gNi4wLgoKMjAyMi0wMi0wMzogb2xseQoJICAgIFtDI10gIzI4MyAjOTk4IEZpeCBtZW1vcnkgbGVhayBpbiBkaXJlY3RvcmluIHR5cGVtYXAgZm9yCgkgICAgc3RkOjpzdHJpbmcuCgoyMDIyLTAyLTAzOiBvbGx5CgkgICAgW1B5dGhvbl0gIzk2NyBNYWtlIGBzZWxmYCBwYXJhbWV0ZXIgYXZhaWxhYmxlIHRvIHVzZXIgdHlwZW1hcHMuCgoyMDIyLTAyLTAzOiB0ZXl0aG9vbgoJICAgIFtQeXRob25dICM4MDEgRml4IC1XdW51c2VkLXBhcmFtZXRlciB3YXJuaW5ncyB3aXRoIGJ1aWx0aW4sCgoyMDIyLTAyLTAzOiB0ZXl0aG9vbgoJICAgICM4MDEgRml4IC1Xc3RyaWN0LXByb3RvdHlwZXMgd2FybmluZ3MgaW4gZ2VuZXJhdGVkIHBvaW50ZXIKCSAgICBmdW5jdGlvbnMuCgoyMDIyLTAyLTAzOiBvbGx5CgkgICAgIzY2MCBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3N3aWcvYnVncy8xMDgxLwoJICAgIERlZmF1bHQgcGFyYW1ldGVyIHZhbHVlcyBjb250YWluaW5nIG1ldGhvZCBjYWxscyBhcmUgbm93IHBhcnNlZCBhbmQKCSAgICBoYW5kbGVkIC0gZS5nLiBgeC0+Zm9vKDMsNClgIGFuZCBgeS56KClgLgoKMjAyMi0wMi0wMjogb2xseQoJICAgIFtSdWJ5XSBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3N3aWcvYnVncy8xMTM2LyBGaXggcmVtb3ZlIG9mIHByZWZpeAoJICAgIGZyb20gbWV0aG9kIG5hbWUgdG8gb25seSByZW1vdmUgaXQgYXQgdGhlIHN0YXJ0LgoKMjAyMi0wMi0wMTogb2xseQoJICAgICMyMzEgSGFuZGxlIHJldHVybmluZyBhbiBvYmplY3QgYnkgcmVmZXJlbmNlIGluIGEgQysrIHRyYWlsaW5nCgkgICAgcmV0dXJuIHR5cGUuCgoyMDIyLTAyLTAxOiBkYXZpZGNsCiAgICAgICAgICAgIFtTY2lsYWJdICM3NDUgdXNlIFNXSUdfPG1vZHVsZT5fSW5pdCgpIGFzIGEgQyBtb2R1bGUgaW5pdCBmdW5jdGlvbi4KCjIwMjItMDItMDE6IG9sbHkKCSAgICBbT0NhbWxdICMyMDgzIEZpeCB0byB3b3JrIHdoZW4gQ0FNTF9TQUZFX1NUUklORyBpcyBvbiwgd2hpY2ggaXQgaXMKCSAgICBieSBkZWZhdWx0IGluIHJlY2VudCBPY2FtbCByZWxlYXNlcy4KCjIwMjItMDEtMzE6IG1yZWVlegoJICAgIGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Avc3dpZy9idWdzLzExNDcvCgkgICAgRml4IGNvcHlUb1IoKSBnZW5lcmF0ZWQgZm9yIGEgc3RydWN0IGluIGEgbmFtZXNwYWNlLgoKMjAyMi0wMS0yOTogZnNjaGxpbWIKCSAgICAjNjU1IEJldHRlciBoYW5kbGluZyBvZiB1c2luZyBkZWNsYXJhdGlvbnMuCgoyMDIyLTAxLTI5OiBkb250cGFuaWM5MgoJICAgIFtHb10gIzY3NiBGaXggY29kZSBnZW5lcmF0ZWQgZm9yIGEgQysrIGNsYXNzIHdpdGggYSBub24tY2FwaXRhbGlzZWQKCSAgICBuYW1lLgoKMjAyMi0wMS0yNjogdHJleDU4CgkgICAgIzE5MTkgIzE5MjEgIzE5MjMgVmFyaW91cyBmaXhlcyBmb3IgQUlYIHBvcnRhYmlsaXR5LgoKMjAyMi0wMS0yNjogb2xseQoJICAgICMxOTM1IERvbid0IGNyYXNoIG9uIGFuIHVuY2xvc2VkIEhUTUwgdGFnIGluIGEgZG94eWdlbiBjb21tZW50CgkgICAgd2hlbiAtZG94eWdlbiBpcyBzcGVjaWZpZWQuCgoyMDIyLTAxLTI1OiBvbGx5CgkgICAgQ29uc3RhbnQgZXhwcmVzc2lvbnMgbm93IHN1cHBvcnQgbWVtYmVyIGFjY2VzcyB3aXRoIGAuYCBzdWNoIGFzCgkgICAgYGZvby5iYXJgLiAgUHJldmlvdXMgdGhpcyBvbmx5IHdvcmtlZCBpbiBhIGNhc2UgbGlrZSBgeC0+Zm9vLmJhcmAuCgoyMDIyLTAxLTI1OiBvbGx5CgkgICAgIzIwOTEgU3VwcG9ydCBtb3N0IGNhc2VzIG9mIGBzaXplb2ZgIGFwcGxpZWQgdG8gYW4gZXhwcmVzc2lvbgoJICAgIGluIGNvbnN0YW50IGV4cHJlc3Npb25zLiAgUHJldmlvdXNseSB0aGVyZSB3YXMgb25seSBzdXBwb3J0IGZvcgoJICAgIGBzaXplb2YoPHR5cGU+KWAgYW5kIGV4cHJlc3Npb25zIHdoaWNoIHN5bnRhY3RpY2FsbHkgbG9vayBsaWtlIGEKCSAgICB0eXBlIChzdWNoIGFzIGBzaXplb2YoZm9vKWApLgoKMjAyMi0wMS0yNTogb2xseQoJICAgICM4MCAjNjM1IGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Avc3dpZy9idWdzLzExMzkvCgkgICAgQWRkIHN1cHBvcnQgZm9yIHBhcnNpbmcgY29tbW9uIGNhc2VzIG9mIGA8YCBhbmQgYD5gIGNvbXBhcmlzb25zCgkgICAgaW4gY29uc3RhbnQgZXhwcmVzc2lvbnMuICBBZGRpbmcgZnVsbCBzdXBwb3J0IGZvciB0aGVzZSBzZWVtcyBoYXJkCgkgICAgdG8gZG8gd2l0aG91dCBpbnRyb2R1Y2luZyBjb25mbGljdHMgaW50byB0aGUgcGFyc2VyIGdyYW1tYXIsIGJ1dCBpbgoJICAgIGZhY3QgYWxsIHJlcG9ydGVkIGNhc2VzIGhhdmUgaGFkIHBhcmVudGhlc2VzIGFyb3VuZCB0aGUgY29tcGFyaXNvbgoJICAgIGFuZCB3ZSBjYW4gc3VwcG9ydCB0aGF0IHdpdGggYSBmZXcgcmVzdHJpY3Rpb25zIG9uIHRoZSBsZWZ0IHNpZGUgb2YKCSAgICBgPGAuCgoyMDIyLTAxLTI1OiB3c2Z1bHRvbgogICAgICAgICAgICBOZXcgd2FybmluZyAzMjcgZm9yIGV4dGVybiB0ZW1wbGF0ZXMsIGVnOgoKICAgICAgICAgICAgICBleHRlcm4gdGVtcGxhdGUgY2xhc3Mgc3RkOjp2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICBleHRlcm4gdGVtcGxhdGUgdm9pZCBGdW5jPGludD4oKTsKCiAgICAgICAgICAgIHJlc3VsdHMgaW4gd2FybmluZwoKICAgICAgICAgICAgICBleGFtcGxlLmk6MzogV2FybmluZyAzMjc6IEV4dGVybiB0ZW1wbGF0ZSBpZ25vcmVkLgogICAgICAgICAgICAgIGV4YW1wbGUuaTo0OiBXYXJuaW5nIDMyNzogRXh0ZXJuIHRlbXBsYXRlIGlnbm9yZWQuCgogICAgICAgICAgICBFeHRlcm4gdGVtcGxhdGUgY2xhc3NlcyBwcmV2aW91c2x5IHJlc3VsdGVkIGluIHdhcm5pbmcgMzIwLgoKMjAyMi0wMS0yNDogcm9taW50b21hc2V0dGkKICAgICAgICAgICAgIzIxMzEgIzIxNTcgQysrMTEgZXh0ZXJuIGZ1bmN0aW9uIHRlbXBsYXRlIHBhcnNpbmcgZXJyb3IgZml4LgoKMjAyMi0wMS0yMTogd3NmdWx0b24KICAgICAgICAgICAgIzIxMjAgIzIxMzggUmVwbGFjZSBsZWdhY3kgUENSRSBkZXBlbmRlbmN5IHdpdGggUENSRTIuCiAgICAgICAgICAgIFRoaXMgcmVxdWlyZXMgY2hhbmdlcyBmb3IgYnVpbGRpbmcgU1dJRyBmcm9tIHNvdXJjZS4gU2VlIHVwZGF0ZWQKICAgICAgICAgICAgaHRtbCBkb2N1bWVudGF0aW9uIGluIFByZWZhY2UuaHRtbCBhbmQgV2luZG93cy5odG1sLiBVcGRhdGVkCiAgICAgICAgICAgIGluc3RydWN0aW9ucyBhcmUgYWxzbyBzaG93biB3aGVuIHJ1bm5pbmcgLi9jb25maWd1cmUgaWYgUENSRTIgaXMgbm90CiAgICAgICAgICAgIGZvdW5kLiBOb3RlIHRoYXQgZGViaWFuIGJhc2VkIHN5c3RlbXMgY2FuIGluc3RhbGwgUENSRTIgdXNpbmc6CgogICAgICAgICAgICAgIGFwdCBpbnN0YWxsIGxpYnBjcmUyLWRldgoKICAgICAgICAgICAgTm90ZSB0aGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9zd2lnL3N3aWcvd2lraS9HZXR0aW5nLVN0YXJ0ZWQgYWxzbyBoYXMKICAgICAgICAgICAgdXBkYXRlZCBpbmZvcm1hdGlvbiBmb3IgYnVpbGRpbmcgZnJvbSBzb3VyY2UuCgoyMDIyLTAxLTE5OiBvbGx5CgkgICAgW1BIUF0gIzIwMjcgQXV0b21hdGljYWxseSBnZW5lcmF0ZSBQSFAgdHlwZSBkZWNsYXJhdGlvbnMgZm9yIFBIUCA4LgoJICAgIFRoZSBnZW5lcmF0ZSBjb2RlIHN0aWxsIGNvbXBpbGVzIGZvciBQSFAgNy54LCBidXQgd2l0aG91dCB0eXBlCgkgICAgZGVjbGFyYXRpb25zIHNpbmNlIFBIUCA3LnggaGFzIG11Y2ggbW9yZSBsaW1pdGVkIHR5cGUgZGVjbGFyYXRpb24KCSAgICBzdXBwb3J0LgoKMjAyMi0wMS0xODogb2xseQoJICAgIFtQZXJsXSAjMTYyOSBQZXJsIDUuOC4wIGlzIG5vdyB0aGUgb2xkZXN0IHZlcnNpb24gd2UgYWltIHRvIHN1cHBvcnQuCgoyMDIyLTAxLTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggJWNhbGxiYWNrIGFuZCBzcGVjaWZ5aW5nIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBhcyBhCiAgICAgICAgICAgIHN0YXRpYyBtZW1iZXIgZnVuY3Rpb24gdXNpbmcgUHl0aG9uIHN0YXRpY21ldGhvZCBzeW50YXgsIHN1Y2ggYXMKICAgICAgICAgICAgS2xhc3MubWVtYmVyZnVuY3Rpb24gaW5zdGVhZCBvZiBLbGFzc19tZW1iZXJmdW5jdGlvbiB3aGVuIHVzaW5nCiAgICAgICAgICAgIC1idWlsdGluIGFuZCAtZmFzdHByb3h5LgoKMjAyMi0wMS0xMTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQWNjZXB0IGtleXdvcmQgYXJndW1lbnRzIGFjY2Vzc2luZyBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9ucyB3aGVuCiAgICAgICAgICAgIHVzaW5nIC1idWlsdGluIGFuZCBrd2FyZ3MgZmVhdHVyZSBhbmQgUHl0aG9uIGNsYXNzIHN0YXRpY21ldGhvZCBzeW50YXguCiAgICAgICAgICAgIFRoZSBtaXNzaW5nIGtleXdvcmQgYXJndW1lbnQgc3VwcG9ydCB3YXMgb25seSB3aGVuIHVzaW5nIHRoZQogICAgICAgICAgICBjbGFzcyBzdGF0aWNtZXRob2Qgc3ludGF4LCBzdWNoIGFzIEtsYXNzLm1lbWJlcmZ1bmN0aW9uLCBhbmQgbm90IHdoZW4KICAgICAgICAgICAgdXNpbmcgdGhlIGZsYXQgc3RhdGljIG1ldGhvZCBzeW50YXgsIHN1Y2ggYXMgS2xhc3NfbWVtYmVyZnVuY3Rpb24uCgoyMDIyLTAxLTA0OiBqdWllcnJvcgogICAgICAgICAgICBbR29dICMyMDQ1IEFkZCBzdXBwb3J0IGZvciBzdGQ6OmFycmF5IGluIHN0ZF9hcnJheS5pLgoKMjAyMS0xMi0xODogb2xseQoJICAgIFtQSFBdIEFkZCBQSFAga2V5d29yZCAncmVhZG9ubHknIChhZGRlZCBpbiA4LjEpIHRvIHRoZSBsaXN0IFNXSUcKCSAgICBrbm93cyB0byBhdXRvbWF0aWNhbGx5IHJlbmFtZS4gIFRoaXMga2V5d29yZCBpcyBzcGVjaWFsIGluIHRoYXQgUEhQCgkgICAgYWxsb3dzIGl0IHRvIGJlIHVzZWQgYXMgYSBmdW5jdGlvbiAob3IgbWV0aG9kKSBuYW1lLgoKMjAyMS0xMi0wNzogdnN0aW5uZXIKICAgICAgICAgICAgW1B5dGhvbl0gIzIxMTYgUHl0aG9uIDMuMTEgc3VwcG9ydDogdXNlIFB5X1NFVF9UWVBFKCkKCjIwMjEtMTItMDU6IHJ3ZjEKICAgICAgICAgICAgW09jdGF2ZV0gIzIwMjAgIzE4OTMgQWRkIHN1cHBvcnQgZm9yIE9jdGF2ZSA2IHVwIHRvIGFuZCBpbmNsdWRpbmcgNi40LgogICAgICAgICAgICBBbHNvIGFkZCBzdXBwb3J0IGZvciBjb21waWxpbmcgd2l0aCAtQnN5bWJvbGljIHdoaWNoIGlzIHVzZWQgYnkgZGVmYXVsdAogICAgICAgICAgICBieSBta29jdGZpbGUuCgoyMDIxLTEyLTAyOiBqc2VubgogICAgICAgICAgICBbUHl0aG9uXSAjMjEwMiBGaXhlZCBjcmFzaGVzIHdoZW4gdXNpbmcgZW1iZWRkZWQgUHl0aG9uIGludGVycHJldGVycy4gCgoyMDIxLTExLTEyOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YXNjcmlwdF0gdjggYW5kIG5vZGUgb25seS4gRml4IG1pc21hdGNoZWQgbmV3IGNoYXJbXSBhbmQgZnJlZSgpCiAgICAgICAgICAgIHdoZW4gd3JhcHBpbmcgQyBjb2RlIGNoYXIgYXJyYXlzLiBOb3cgY2FsbG9jIGlzIG5vdyB1c2VkIGluc3RlYWQgb2YKICAgICAgICAgICAgbmV3IGNoYXJbXSBpbiBTV0lHX0FzQ2hhclB0ckFuZFNpemUuCgoyMDIxLTEwLTAzOiBhanJoMQogICAgICAgICAgICBbUGVybF0gIzIwNzQ6IEF2b2lkIC1XbWlzbGVhZGluZy1pbmRlbnRhdGlvbiBpbiBnZW5lcmF0ZWQgY29kZQogICAgICAgICAgICB3aGVuIHVzaW5nIGdjYzExLgoKMjAyMS0xMC0wMzoganNjaHVlbGxlcgogICAgICAgICAgICBbQ01ha2VdICMyMDY1OiBBZGQgb3B0aW9uIHRvIGVuYWJsZSBvciBkaXNhYmxlIFBDUkUgc3VwcG9ydC4KCjIwMjEtMDktMTY6IGlhbmxhbmNldGF5bG9yCiAgICAgICAgICAgIFtHb10gSW1wcm92ZWQgX2Nnb19wYW5pYyBpbXBsZW1lbnRhdGlvbi4KCjIwMjEtMDktMTY6IGlhbmxhbmNldGF5bG9yCiAgICAgICAgICAgIFtHb10gRG9uJ3QgdXNlIGNyb3NzY2FsbDIgZm9yIHBhbmlja2luZy4gSW5zdGVhZCByZWx5IG9uIGRvY3VtZW50ZWQKICAgICAgICAgICAgYW5kIGV4cG9ydGVkIGludGVyZmFjZXMuCgoyMDIxLTA5LTE0OiBpYW5sYW5jZXRheWxvcgogICAgICAgICAgICBbR29dIFJlbW92ZSAtbm8tY2dvIG9wdGlvbiAobG9uZyB1bnN1cHBvcnRlZCBpbiBHbykKCjIwMjEtMDUtMDQ6IG9sbHkKCSAgICBbUEhQXSAjMjAxNCBUaHJvdyBQSFAgZXhjZXB0aW9ucyBpbnN0ZWFkIG9mIHVzaW5nIFBIUCBlcnJvcnMKCgkgICAgUEhQIGV4Y2VwdGlvbnMgY2FuIGJlIGNhdWdodCBhbmQgaGFuZGxlZCBpZiBkZXNpcmVkLCBidXQgaWYgdGhleQoJICAgIGFyZW4ndCBjYXVnaHQgdGhlbiBQSFAgZXhpdHMgaW4gbXVjaCB0aGUgc2FtZSB3YXkgYXMgaXQgZG9lcyBmb3IgYQoJICAgIFBIUCBlcnJvci4KCgkgICAgSW4gcGFydGljdWxhciB0aGlzIG1lYW5zIHBhcmFtZXRlciB0eXBlIGVycm9ycyBhbmQgc29tZSBvdGhlciBjYXNlcwoJICAgIGluIFNXSUctZ2VuZXJhdGVkIHdyYXBwZXJzIG5vdyB0aHJvdyBhIFBIUCBleGNlcHRpb24sIHdoaWNoIG1hdGNoZXMKCSAgICBob3cgUEhQJ3MgbmF0aXZlIHBhcmFtZXRlciBoYW5kbGluZyBkZWFscyB3aXRoIHNpbWlsYXIgc2l0dWF0aW9ucy4KCgkgICAgYFNXSUdfRXJyb3JDb2RlKClgLCBgU1dJR19FcnJvck1zZygpYCwgYFNXSUdfRkFJTCgpYCBhbmQgYGdvdG8gdGhyb3duO2AKCSAgICBhcmUgbm8gbG9uZ2VyIHN1cHBvcnRlZCAodGhlc2UgYXJlIHJlYWxseSBhbGwgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24KCSAgICBkZXRhaWxzIGFuZCBub25lIGFyZSBkb2N1bWVudGVkIGFzaWRlIGZyb20gYnJpZWYgbWVudGlvbnMgaW4gQ0hBTkdFUwoJICAgIGZvciB0aGUgZmlyc3QgdGhyZWUpLiAgSSB3YXNuJ3QgYWJsZSB0byBmaW5kIGFueSB1c2VzIGluIHVzZXIgaW50ZXJmYWNlCgkgICAgZmlsZXMgYXQgbGVhc3QgaW4gRk9TUyBjb2RlIHZpYSBjb2RlIHNlYXJjaCB0b29scy4KCgkgICAgSWYgeW91IGFyZSB1c2luZyB0aGVzZToKCgkgICAgVXNlIGBTV0lHX1BIUF9FcnJvcihjb2RlLG1zZyk7YCBpbnN0ZWFkIG9mIGBTV0lHX0Vycm9yQ29kZShjb2RlKTsKCSAgICBTV0lHX0Vycm9yTXNnKG1zZyk7YCAod2hpY2ggd2lsbCB0aHJvdyBhIFBIUCBleGNlcHRpb24gaW4gU1dJRyA+PSA0LjEKCSAgICBhbmQgZG8gdGhlIHNhbWUgYXMgdGhlIGluZGl2aWR1YWwgY2FsbHMgaW4gb2xkZXIgU1dJRykuCgoJICAgIGBTV0lHX0ZBSUwoKTtgIGFuZCBgZ290byB0aHJvd247YCBjYW4gdHlwaWNhbGx5IGJlIHJlcGxhY2VkIHdpdGgKCSAgICBgU1dJR19mYWlsO2AuICBUaGlzIHdpbGwgcHJvYmFibHkgYWxzbyB3b3JrIHdpdGggb2xkZXIgU1dJRywgYnV0CgkgICAgcGxlYXNlIHRlc3Qgd2l0aCB5b3VyIHdyYXBwZXJzIGlmIHRoaXMgaXMgaW1wb3J0YW50IHRvIHlvdS4KCgkgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDIxLTA1LTE3OiBhZHIyNgogICAgICAgICAgICBbUHl0aG9uXSAjMTk4NSBGaXggbWVtb3J5IGxlYWtzOgoKICAgICAgICAgICAgMS4gUHl0aG9uIG9iamVjdCByZWZlcmVuY2VzIHdlcmUgYmVpbmcgaW5jb3JyZWN0bHkgcmV0YWluZWQgYnkKICAgICAgICAgICAgU3dpZ1B5Q2xpZW50RGF0YSwgY2F1c2luZyBzd2lnX3ZhcmxpbmtfZGVhbGxvYygpIG5ldmVyIHRvIHJ1biAvIGZyZWUKICAgICAgICAgICAgbWVtb3J5LiBTd2lnUHlDbGllbnREYXRhX05ldygpIC8gU3dpZ1B5Q2xpZW50RGF0YV9EZWwoKSB3ZXJlIHVwZGF0ZWQKICAgICAgICAgICAgdG8gZml4IHRoZSBvYmplY3QgcmVmZXJlbmNlIGNvdW50aW5nLCBjYXVzaW5nIHN3aWdfdmFybGlua19kZWFsbG9jKCkKICAgICAgICAgICAgdG8gcnVuIGFuZCB0aGUgbWVtb3J5IHN3aWdfdmFybGluayBvd25zIHRvIGJlIGZyZWVkLgoKICAgICAgICAgICAgMi4gU3dpZ1B5Q2xpZW50RGF0YSBpdHNlbGYgd2FzIG5vdCBmcmVlZCBieSBTd2lnUHlDbGllbnREYXRhX0RlbCgpLAogICAgICAgICAgICBjYXVzaW5nIGFub3RoZXIgaGVhcCBsZWFrLiBUaGUgcmVxdWlyZWQgZnJlZSgpIHdhcyBhZGRlZCB0bwogICAgICAgICAgICBTd2lnUHlDbGllbnREYXRhX0RlbCgpCgogICAgICAgICAgICAzLiBGaXggcmVmZXJlbmNlIGNvdW50aW5nL2xlYWsgb2YgcHl0aG9uIGNhY2hlZCB0eXBlIHF1ZXJ5CgogICAgICAgICAgICA0LiBGaXggcmVmZXJlbmNlIGNvdW50aW5nL2xlYWsgb2YgU3dpZ1B5T2JqZWN0IGRpY3QgKC1idWlsdGluKQoKICAgICAgICAgICAgNS4gUHl0aG9uIG9iamVjdCByZWZlcmVuY2UgY291bnRpbmcgZml4ZXMgZm9yIG91dC1vZi1tZW1vcnkKICAgICAgICAgICAgc2NlbmFyaW9zIHdlcmUgYWRkZWQgdG86IFNXSUdfUHl0aG9uX1JhaXNlT3JNb2RpZnlUeXBlRXJyb3IoKSwKICAgICAgICAgICAgU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KCksIFN3aWdQeUNsaWVudERhdGFfTmV3KCksCiAgICAgICAgICAgIFN3aWdQeU9iamVjdF9nZXRfX19kaWN0X18oKSBhbmQgU3dpZ1B5T2JqZWN0X2Zvcm1hdCgpCgogICAgICAgICAgICA2LiBBZGQgZXJyb3IgaGFuZGxpbmcgZm9yIFB5TW9kdWxlX0FkZE9iamVjdCgpIHRvCiAgICAgICAgICAgIFNXSUdfUHl0aG9uX1NldE1vZHVsZSgpIChmYWlsdXJlIGNvdWxkIGJlIGNhdXNlZCBieSBPT00gb3IgYSBuYW1lCiAgICAgICAgICAgIGNsYXNoIGNhdXNlZCBieSBtYWxpY2lvdXMgY29kZSkKCjIwMjEtMDUtMTM6IG9sbHkKCSAgICBbVUZGSV0gIzIwMDkgUmVtb3ZlIGNvZGUgZm9yIENvbW1vbiBMaXNwIFVGRkkuICBXZSBkcm9wcGVkIHN1cHBvcnQKCSAgICBmb3IgaXQgaW4gU1dJRyA0LjAuMCBhbmQgbm9ib2R5IGhhcyBzdGVwcGVkIGZvcndhcmQgdG8gcmV2aXZlIGl0IGluCgkgICAgb3ZlciAyIHllYXJzLgoKMjAyMS0wNS0xMzogb2xseQoJICAgIFtTLUVYUF0gIzIwMDkgUmVtb3ZlIGNvZGUgZm9yIENvbW1vbiBMaXNwIFMtRXhwLiAgV2UgZHJvcHBlZAoJICAgIHN1cHBvcnQgZm9yIGl0IGluIFNXSUcgNC4wLjAgYW5kIG5vYm9keSBoYXMgc3RlcHBlZCBmb3J3YXJkIHRvCgkgICAgcmV2aXZlIGl0IGluIG92ZXIgMiB5ZWFycy4KCjIwMjEtMDUtMTM6IG9sbHkKCSAgICBbUGlrZV0gIzIwMDkgUmVtb3ZlIGNvZGUgZm9yIFBpa2UuICBXZSBkcm9wcGVkIHN1cHBvcnQgZm9yIGl0IGluCgkgICAgU1dJRyA0LjAuMCBhbmQgbm9ib2R5IGhhcyBzdGVwcGVkIGZvcndhcmQgdG8gcmV2aXZlIGl0IGluIG92ZXIgMgoJICAgIHllYXJzLgoKMjAyMS0wNS0xMzogb2xseQoJICAgIFtNb2R1bGEzXSAjMjAwOSBSZW1vdmUgY29kZSBmb3IgTW9kdWxhMy4gIFdlIGRyb3BwZWQgc3VwcG9ydCBmb3IgaXQKCSAgICBpbiBTV0lHIDQuMC4wIGFuZCBub2JvZHkgaGFzIHN0ZXBwZWQgZm9yd2FyZCB0byByZXZpdmUgaXQgaW4gb3ZlciAyCgkgICAgeWVhcnMuCgoyMDIxLTA1LTEzOiBvbGx5CgkgICAgW0NMSVNQXSAjMjAwOSBSZW1vdmUgY29kZSBmb3IgR05VIENvbW1vbiBMaXNwLiAgV2UgZHJvcHBlZCBzdXBwb3J0CgkgICAgZm9yIGl0IGluIFNXSUcgNC4wLjAgYW5kIG5vYm9keSBoYXMgc3RlcHBlZCBmb3J3YXJkIHRvIHJldml2ZSBpdCBpbgoJICAgIG92ZXIgMiB5ZWFycy4KCjIwMjEtMDUtMTM6IG9sbHkKCSAgICBbQ2hpY2tlbl0gIzIwMDkgUmVtb3ZlIGNvZGUgZm9yIENoaWNrZW4uICBXZSBkcm9wcGVkIHN1cHBvcnQgZm9yIGl0CgkgICAgaW4gU1dJRyA0LjAuMCBhbmQgbm9ib2R5IGhhcyBzdGVwcGVkIGZvcndhcmQgdG8gcmV2aXZlIGl0IGluIG92ZXIgMgoJICAgIHllYXJzLgoKMjAyMS0wNS0xMzogb2xseQoJICAgIFtBbGxlZ3JvY2xdICMyMDA5IFJlbW92ZSBjb2RlIGZvciBBbGxlZ3JvIENvbW1vbiBMaXNwLiAgV2UgZHJvcHBlZAoJICAgIHN1cHBvcnQgZm9yIGl0IGluIFNXSUcgNC4wLjAgYW5kIG5vYm9keSBoYXMgc3RlcHBlZCBmb3J3YXJkIHRvCgkgICAgcmV2aXZlIGl0IGluIG92ZXIgMiB5ZWFycy4KCjIwMjEtMDUtMDQ6IG9sbHkKCSAgICBbUEhQXSAjMTk4MiAjMTQ1NyBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3N3aWcvYnVncy8xMzM5LwoJICAgIFNXSUcgbm93IG9ubHkgdXNlIFBIUCdzIEMgQVBJIHRvIGltcGxlbWVudCBpdHMgd3JhcHBlcnMsIGFuZCBubwoJICAgIGxvbmdlciBnZW5lcmF0ZXMgUEhQIGNvZGUgdG8gZGVmaW5lIGNsYXNzZXMuICBUaGUgd3JhcHBlcnMgc2hvdWxkCgkgICAgYmUgYWxtb3N0IGVudGlyZWx5IGNvbXBhdGlibGUgd2l0aCB0aG9zZSBnZW5lcmF0ZWQgYmVmb3JlLCBidXQKCSAgICBmYXN0ZXIgYW5kIHdpdGhvdXQgc29tZSBwcmV2aW91c2x5IGhhcmQtdG8tZml4IGJ1Z3MuCgoJICAgIFRoZSBtYWluIG5vdGFibGUgZGlmZmVyZW5jZSBpcyBTV0lHIG5vIGxvbmdlciBnZW5lcmF0ZXMgYSAucGhwCgkgICAgd3JhcHBlciBhdCBhbGwgYnkgZGVmYXVsdCAob25seSBpZiAlcHJhZ21hKHBocCkgY29kZT0uLi4gb3IKCSAgICAlcHJhZ21hKHBocCkgaW5jbHVkZT0uLi4gYXJlIHNwZWNpZmllZCBpbiB0aGUgaW50ZXJmYWNlIGZpbGUpLgoJICAgIFRoaXMgYWxzbyBtZWFucyB5b3UgbmVlZCB0byBsb2FkIHRoZSBtb2R1bGUgdmlhIGV4dGVuc2lvbj0uLi4KCSAgICBpbiBwaHAuaW5pLCByYXRoZXIgdGhhbiBsZXR0aW5nIHRoZSBkbCgpIGluIHRoZSBnZW5lcmF0ZWQKCSAgICAucGhwIHdyYXBwZXIgbG9hZCBpdCAoYnV0IGRsKCkgaGFzIG9ubHkgd29ya2VkIGZvciBjb21tYW5kLWxpbmUKCSAgICBQSFAgZm9yIHNvbWUgeWVhcnMgbm93KS4KCgkgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDIxLTA0LTMwOiBvbGx5CgkgICAgIzE5ODQgUmVtb3ZlIHN1cHBvcnQgZm9yICRzb3VyY2UgYW5kICR0YXJnZXQuCgkgICAgVGhlc2Ugd2VyZSBvZmZpY2lhbGx5IGRlcHJlY2F0ZWQgaW4gMjAwMSwgYW5kIGF0dGVtcHRzIHRvIHVzZSB0aGVtIGhhdmUKCSAgICByZXN1bHRlZCBpbiBhIHdhcm5pbmcgKGluY2x1ZGluZyBhIHBvaW50ZXIgdG8gd2hhdCB0byB1cGRhdGUgdGhlbSB0bykKCSAgICBmb3IgbW9zdCBpZiBub3QgYWxsIG9mIHRoYXQgdGltZS4KCjIwMjEtMDQtMjc6IHdzZnVsdG9uCiAgICAgICAgICAgICMxOTg3IFtKYXZhXSBGaXggJWludGVyZmFjZSBmYW1pbHkgb2YgbWFjcm9zIGZvciByZXR1cm5pbmcgYnkgY29uc3QKICAgICAgICAgICAgcG9pbnRlciByZWZlcmVuY2UuCgoyMDIxLTA0LTE5OiBvbGx5CgkgICAgRml4IHVzZSBvZiB1bmluaXRpYWxpc2VkIHZhcmlhYmxlIGluIHRoZSBnZW5lcmF0ZWQgY29kZSBmb3IgYW4KCSAgICBlbXB0eSB0eXBlY2hlY2sgdHlwZW1hcCwgc3VjaCBhcyB0aGUgZHVtbXkgb25lIHdlIGluY2x1ZGUgZm9yCgkgICAgc3RkOjppbml0aWFsaXplcl9saXN0LgoKMjAyMS0wNC0xMjogb2xseQoJICAgICMxNzc3IFtQeXRob25dIFNwZWNpZnlpbmcgLXB5MyBub3cgZ2VuZXJhdGVzIGEgY2hlY2sgZm9yIFB5dGhvbgoJICAgIHZlcnNpb24gPj0gMy4wLgoKMjAyMS0wMy0yNjogb2xseQoJICAgIFtQSFBdIEFkZCBQSFAga2V5d29yZHMgJ2ZuJyAoYWRkZWQgaW4gNy40KSBhbmQgJ21hdGNoJyAoYWRkZWQgaW4KCSAgICA4LjApIHRvIHRoZSBsaXN0IFNXSUcga25vd3MgdG8gYXV0b21hdGljYWxseSByZW5hbWUuCgoyMDIxLTAzLTIzOiB3c2Z1bHRvbgogICAgICAgICAgICAjMTk0MiBbUHl0aG9uXSBGaXggY29tcGlsYXRpb24gZXJyb3IgaW4gd3JhcHBlcnMgd2hlbiB1c2luZyAtYnVpbHRpbgogICAgICAgICAgICBhbmQgd3JhcHBpbmcgdmFyYXJncyBpbiBjb25zdHJ1Y3RvcnMuCgoyMDIxLTAzLTIyOiBnb3RvNDAKICAgICAgICAgICAgIzE5NzcgRml4IGhhbmRsaW5nIG9mIHRlbXBsYXRlIHRlbXBsYXRlIHBhcmFtZXRlcnMuCgoyMDIxLTAzLTIxOiBvbGx5CgkgICAgIzE5MjksICMxOTc4IFtQSFBdIEFkZCBzdXBwb3J0IGZvciBQSFAgOC4KCjIwMjEtMDMtMTk6IHdzZnVsdG9uCiAgICAgICAgICAgICMxNjEwIFJlbW92ZSAtYW5zaSBmcm9tIGRlZmF1bHQgY29tcGlsYXRpb24gZmxhZ3MuCgoyMDIxLTAzLTE5OiBkb3QtYXNtCiAgICAgICAgICAgICMxOTM0IFtKYXZhXSBDbGVhbiB1cCB0eXBlbWFwcyBmb3IgbG9uZyBsb25nIGFycmF5cy4KCjIwMjEtMDMtMTk6IG9sbHkKCSAgICAjMTUyNyBbUEhQXSBJbXByb3ZlIFBIUCBvYmplY3QgY3JlYXRpb24gaW4gZGlyZWN0b3JpbiBjYXNlLgoJICAgIFJlcG9ydGVkbHkgdGhlIGNvZGUgd2Ugd2VyZSB1c2luZyBpbiB0aGlzIGNhc2UgZ2F2ZSBzZWdmYXVsdHMgaW4KCSAgICBQSFAgNy4yIGFuZCBsYXRlciAtIHdlJ3ZlIGJlZW4gdW5hYmxlIHRvIHJlcHJvZHVjZSB0aGVzZSwgYnV0IHRoZQoJICAgIG5ldyBhcHByb2FjaCBpcyBhbHNvIHNpbXBsZXIgYW5kIHNob3VsZCBiZSBiaXQgZmFzdGVyIHRvby4KCjIwMjEtMDMtMTg6IG9sbHkKCSAgICAjMTY1NSBbUEhQXSBGaXggY2hhciogdHlwZWNoZWNrIHR5cGVtYXAgdG8gYWNjZXB0IFBIUCBOdWxsIGxpa2UgdGhlCgkgICAgY29ycmVzcG9uZGluZyBpbiB0eXBlbWFwIGRvZXMuCgoyMDIxLTAzLTE4OiBvbGx5CgkgICAgIzE5MDAsICMxOTA1IFtQSFBdIEZpeCB3cmFwcGluZyBvZiBvdmVybG9hZGVkIGRpcmVjdGVkIG1ldGhvZHMgd2l0aAoJICAgIG5vbi12b2lkIHJldHVybi4KCjIwMjEtMDMtMTE6IG11cmlsbG8xMjgKICAgICAgICAgICAgIzE0OTggW0phdmFzY3JpcHRdIFN1cHBvcnQgdHlwZSBjb252ZXJzaW9uLgoKMjAyMS0wMy0wNjogbnNobXlyZXYKICAgICAgICAgICAgIzg3MiBbSmF2YXNjcmlwdF0gVmFyaW91cyB0eXBlbWFwIGlzc3VlcyBpbiBhcnJheXNfamF2YXNjcmlwdC5pIGZpeGVkLgoKMjAyMS0wMy0wMzogdmF1Z2hhbWhvbmcKICAgICAgICAgICAgIzU3NyBbSmF2YXNjcmlwdF0gSW1wbGVtZW50ZWQgU2V0TW9kdWxlL0dldE1vZHVsZSBmb3IgSlNDIHRvIGFsbG93IHR5cGUgc2hhcmluZwogICAgICAgICAgICBhY3Jvc3MgbW9kdWxlcy4KCjIwMjEtMDMtMDE6IHhhbnRhcmVzLCBPbGl2ZXIgQnVjaHRhbGEsIGdlb2dyYXBoaWthCiAgICAgICAgICAgICMxMDQwIEFkZCBzdXBwb3J0IGZvciBidWlsZGluZyBTV0lHIHdpdGggQ01ha2UuIFNlZSBkb2N1bWVudGF0aW9uIGluIFdpbmRvd3MuaHRtbC4KCjIwMjEtMDMtMDE6IHZhZHoKICAgICAgICAgICAgIzE5NTIgRml4IGluY29ycmVjdCB3YXJuaW5nICJVbmtub3duIERveHlnZW4gY29tbWFuZDogLiIKCjIwMjEtMDItMjg6IHAyawogICAgICAgICAgICAjOTY5IFtKYXZhc2NyaXB0XSB2OC9ub2RlIC0gcHJldmVudCBjcmFzaCBjYWxsaW5nIGEgY29uc3RydWN0b3Igd2l0aG91dCBuZXcga2V5d29yZC4KCjIwMjEtMDItMjg6IGFsZWNtZXYKICAgICAgICAgICAgIzQwNSAjMTEyMSBbSmF2YXNjcmlwdF0gRml4IE9VVFBVVCB0eXBlbWFwcyBvbiBtZXRob2RzIHRoYXQgZG9uJ3QgcmV0dXJuIHZvaWQuCiAgICAgICAgICAgIFRoZSBvdXRwdXQgdmFsdWUgaXMgYXBwZW5kZWQgdG8gdGhlIHJldHVybiB2YWx1ZS4KCjIwMjEtMDItMjY6IG11cmlsbG8xMjgsIHdzZnVsdG9uCiAgICAgICAgICAgICMxMjY5IFtKYXZhc2NyaXB0XSBGaXggaGFuZGxpbmcgb2YgbGFyZ2UgcG9zaXRpdmUgdW5zaWduZWQgbG9uZyBhbmQKICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIHZhbHVlcy4KCjIwMjEtMDItMjQ6IHRvbWxlYXZ5LCB5ZWdvcmljaCwgdHVuZ250cGhhbQogICAgICAgICAgICAjMTc0NiBbSmF2YXNjcmlwdF0gQWRkIHN1cHBvcnQgZm9yIE5vZGUgdjEyLCB2MTQgYW5kIHYxNi4KICAgICAgICAgICAgU1dJRyBzdXBwb3J0IGZvciBOb2RlIGlzIG5vdyBmb3IgdjYgYW5kIGxhdGVyIG9ubHkuCgoyMDIwLTAyLTA5OiBaYWNrZXJ5U3B5dHoKICAgICAgICAgICAgIzE4NzIgRml4IHR5cG9zIGluIGF0dHJpYnV0ZTJyZWYgbWFjcm9zLgoKMjAyMC0xMC0xMDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFzY3JpcHRdIEZpeCBzbyB0aGF0IGNjb21wbGV4LmkgaW50ZXJmYWNlIHRvIGZpbGUgY2FuIGJlIHVzZWQuCgoyMDIwLTEwLTEwOiB3c2Z1bHRvbgogICAgICAgICAgICAjMjUyIGNvbXBsZXggY2FuIG5vdyBiZSB1c2VkIGFzIGEgQyBpZGVudGlmaWVyIGFuZCBkb2Vzbid0IGdpdmUgYSBzeW50YXggZXJyb3IuCgoyMDIwLTEwLTEwOiBscHNpbmdlcgogICAgICAgICAgICAjMTc3MCBDb3JyZWN0IEMgY29tcGxleCBzdXBwb3J0LgogICAgICAgICAgICBfQ29tcGxleCBpcyBub3cgcGFyc2VkIGFzIGEga2V5d29yZCByYXRoZXIgdGhhbiBjb21wbGV4IGFzIHBlciB0aGUgQzk5IHN0YW5kYXJkLgogICAgICAgICAgICBUaGUgY29tcGxleCBtYWNybyBpcyBhdmFpbGFibGUgaW4gdGhlIGNjb21wbGV4LmkgbGlicmFyeSBmaWxlIGFsb25nIHdpdGggb3RoZXIKICAgICAgICAgICAgY29tcGxleCBudW1iZXIgaGFuZGxpbmcgcHJvdmlkZWQgYnkgdGhlIGNvbXBsZXguaCBoZWFkZXIuCgoyMDIwLTEwLTA3OiBaYWNrZXJ5U3B5dHoKICAgICAgICAgICAgW1B5dGhvbl0gIzE4MTIgRml4IHRoZSBlcnJvciBoYW5kbGluZyBmb3IgdGhlIFB5T2JqZWN0X0dldEJ1ZmZlcigpIGNhbGxzIGluCiAgICAgICAgICAgIHB5YnVmZmVyLmkuCgoyMDIwLTEwLTA3OiB0cmVpdG1heXIKICAgICAgICAgICAgIzE4MjQgQWRkIG1pc3Npbmcgc3BhY2UgaW4gZGlyZWN0b3IgbWV0aG9kIGRlY2xhcmF0aW9uIHJldHVybmluZwogICAgICAgICAgICBjb25zdCBwb2ludGVyLgoKMjAyMC0xMC0wNzogYWRlbHZhMTk4NAogICAgICAgICAgICAjMTg1OSBSZW1vdmUgYWxsICh0d28pIGV4Y2VwdGlvbnMgZnJvbSBTV0lHIGV4ZWN1dGFibGUuCgoyMDIwLTA5LTI1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdICMxODc0IEFkZCBhYmlsaXR5IHRvIGNoYW5nZSB0aGUgbW9kaWZpZXJzIGZvciB0aGUgaW50ZXJmYWNlCiAgICAgICAgICAgIGdlbmVyYXRlZCB3aGVuIHVzaW5nIHRoZSAlaW50ZXJmYWNlIG1hY3Jvcy4KCiAgICAgICAgICAgIEZvciBDIyB1c2UgdGhlICdjc2ludGVyZmFjZW1vZGlmaWVycycgdHlwZW1hcC4KICAgICAgICAgICAgRm9yIEphdmEgdXNlIHRoZSAnamF2YWludGVyZmFjZW1vZGlmaWVycycgdHlwZW1hcC4KCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAldHlwZW1hcChjc2ludGVyZmFjZW1vZGlmaWVycykgWCAiaW50ZXJuYWwgaW50ZXJmYWNlIgoKMjAyMC0wOS0yNDogZ2VlZnIKICAgICAgICAgICAgW0MjXSAjMTg2OCBGaXggd2NoYXJfdCogY3N2YXJvdXQgdHlwZW1hcCBmb3IgbWVtYmVyIHZhcmlhYmxlIHdyYXBwZXJzLgoKMjAyMC0wOC0yODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdICMxODYyIEZpeCBjcmFzaGVzIGluIHN3aWdfY29ubmVjdF9kaXJlY3RvciBkdXJpbmcgZGlyZWN0b3IgY2xhc3MgY29uc3RydWN0aW9uCiAgICAgICAgICAgIHdoZW4gdXNpbmcgdGhlIGRpcmVjdG9yIGNsYXNzIGZyb20gbXVsdGlwbGUgdGhyZWFkcyAtIGEgcmFjZSBjb25kaXRpb24gaW5pdGlhbGlzaW5nCiAgICAgICAgICAgIGJsb2NrIHNjb3BlIHN0YXRpYyB2YXJpYWJsZXMuIFRoZSBmaXggaXMgZ3VhcmFudGVlZCB3aGVuIHVzaW5nIEMrKzExLCBidXQgbW9zdAogICAgICAgICAgICBjb21waWxlcnMgYWxzbyBmaXggaXQgd2hlbiB1c2luZyBDKyswMy9DKys5OC4KCjIwMjAtMDgtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFkZCBtaXNzaW5nIGluaXRpYWxpemVyIGZvciBtZW1iZXIgJ19oZWFwdHlwZW9iamVjdDo6aHRfbW9kdWxlJyB3aGVuIHVzaW5nCiAgICAgICAgICAgIC1idWlsdGluIHRvIGNvbXBsZXRlIFB5dGhvbiAzLjkgc3VwcG9ydC4KCjIwMjAtMDgtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIFJlbW92ZSBQeUV2YWxfSW5pdFRocmVhZHMoKSBjYWxsIGZvciBQeXRob24gMy43IGFuZCBsYXRlciBhcyBQeXRob24gY2FsbHMKICAgICAgICAgICAgaXQgYXV0b21hdGljYWxseSBub3cuIFRoaXMgcmVtb3ZlcyBhIGRlcHJlY2F0aW9uIHdhcm5pbmcgd2hlbiB1c2luZyBQeXRob24gMy45LgoKMjAyMC0wOC0xNTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQWxsIFB5dGhvbiBleGFtcGxlcyBhbmQgdGVzdHMgYXJlIHdyaXR0ZW4gdG8gYmUgUHl0aG9uIDIgYW5kIFB5dGhvbiAzCiAgICAgICAgICAgIGNvbXBhdGlibGUsIHJlbW92aW5nIHRoZSBuZWVkIGZvciAydG8zIHRvIHJ1biB0aGUgZXhhbXBsZXMgb3IgdGVzdC1zdWl0ZS4KCjIwMjAtMDgtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQWRkIHN1cHBvcnQgZm9yIHZvaWQgKlZPSURfSU5UX1BUUiBmb3IgbWVtYmVyIHZhcmlhYmxlcy4KCjIwMjAtMDctMjk6IGNocmlzYnVycgogICAgICAgICAgICAjMTg0MyBbUHl0aG9uXSBDb21waWxhdGlvbiBlcnJvciBmaXggaW4gU3dpZ1B5QnVpbHRpbl9TZXRNZXRhVHlwZSB3aGVuIHVzaW5nIFB5UHkuCgoyMDIwLTA2LTE0OiBaYWNrZXJ5U3B5dHoKICAgICAgICAgICAgIzE2NDIgIzE4MDkgRml4IHZpcnR1YWwgY29tcGFyaXNvbiBvcGVyYXRvcnMgaW4gZGlyZWN0b3IgY2xhc3NlcyBieSByZW1vdmluZyBhbgogICAgICAgICAgICBpbmNvcnJlY3Qgc3BhY2UgaW4gdGhlIGZ1bmN0aW9uIG5hbWUgKGZvciBleGFtcGxlLCBvcGVyYXRvcj0gPSBpcyBub3cgb3BlcmF0b3I9PSkuCgpWZXJzaW9uIDQuMC4yICg4IEp1biAyMDIwKQo9PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAyMC0wNi0wNyAgdmlnc3RlcmtyCiAgICAgICAgICAgIFtSdWJ5XSAjMTcxNyBOaWwgZml4IG1hbmdsaW5nIHN0cmluZ3MKCjIwMjAtMDYtMDcgIHZhZHoKICAgICAgICAgICAgIzE3NDggRml4IGRveHlnZW4gY29tbWVudHMgcXVvdGluZyBpc3N1ZQoKMjAyMC0wNi0wNyAgbXVub2FoCiAgICAgICAgICAgICMxODAwIEVzY2FwZSBzcGFjZXMgaW4gZmlsZSBwYXRocyBmb3IgZGVwZW5kZW5jaWVzICgtTSAtTU0gZXRjKQoKMjAyMC0wNi0wNiAgYW5kcmVhcy1zY2h3YWIKICAgICAgICAgICAgW1J1YnldICMxODAxIEZpeCBlbmNvZGluZyBvbiBiaWcgZW5kaWFuIHN5c3RlbXMgd2hlbiB3cmFwcGluZyBzdGQ6OndzdHJpbmcuCgoyMDIwLTA1LTMxICBrd3dldHRlCiAgICAgICAgICAgIFtPY3RhdmVdICMxNzg5IGVycm9yIGhhbmRsaW5nIGltcHJvdmVtZW50cyBhbmQgcmV0dXJuIGVycm9yIGNvZGUgb24gZXhpdCBmb3IgU1dJRyB3cmFwcGVkIG1vZHVsZXMuCgoyMDIwLTA1LTMwICBtc3RlaW5iZWNrCiAgICAgICAgICAgIFtEXSAjMTU5MyBSZXBsYWNlIGJyb2tlbiBpbXBvcnRzIHdoZW4gdXNpbmcgbmV3ZXIgdmVyc2lvbnMgb2YgRC4KCjIwMjAtMDUtMjk6IFphY2tlcnlTcHl0egogICAgICAgICAgICBbUHl0aG9uXSAjMTcxNiBQZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMgd2hlbiBjb252ZXJ0aW5nIHN0cmluZ3Mgd2hlbiB1c2luZyBQeXRob24gPj0gMy4zLgoKMjAyMC0wNS0yODogWmFja2VyeVNweXR6CiAgICAgICAgICAgICMxNzc2IFF1aXRlIGRyYW1hdGljYWxseSBkZWNyZWFzZSBydW4gdGltZXMgd2hlbiBnZW5lcmF0aW5nIHZlcnkgbGFyZ2UgaW50ZXJmYWNlIGZpbGVzIGJ5IGNoYW5naW5nCiAgICAgICAgICAgIHNvbWUgaW50ZXJuYWwgbWVtb3J5IHBvb2wgc2l6ZXMuCgoyMDIwLTA1LTI4OiBtY2ZhcmxqbQogICAgICAgICAgICAjMTc4OCBGaXggaGFuZGxpbmcgb2YgRG94eWdlbiBcZW5kbGluayBjb21tYW5kLgoKMjAyMC0wNS0yNDogdmFwaWVyCiAgICAgICAgICAgIFtKYXZhc2NyaXB0XSAjMTc5NiBGaXggcGtnLWNvbmZpZyBpbnZvY2F0aW9uIGluIGNvbmZpZ3VyZS4KCjIwMjAtMDQtMzA6IGt3d2V0dGUKICAgICAgICAgICAgW09jdGF2ZV0gRml4IGV4Y2VwdGlvbiByYWlzaW5nIGZvciBuZXdlciBPY3RhdmUgdmVyc2lvbnMKICAgICAgICAgICAgU2luY2UgKGF0IGxlYXN0KSBPY3RhdmUgNS4xLjAsIHRoZSBPY3RhdmUgZXJyb3IoKSBmdW5jdGlvbiBub3cgcmFpc2VzIGEgQysrIGV4Y2VwdGlvbiwKICAgICAgICAgICAgd2hpY2ggaWYgdW5jYXVnaHQgaW1tZWRpYXRlbHkgZXhpdHMgYSBTV0lHIHdyYXBwZXIgZnVuY3Rpb24sIGJ5cGFzc2luZyBhbnkgY2xlYW51cCBjb2RlCiAgICAgICAgICAgIHRoYXQgbWF5IGFwcGVhciBhZnRlciBhICJmYWlsOiIgbGFiZWwuIFRoaXMgcGF0Y2ggYWRkcyBhICJ0cnkgeyAuLi4gfSBjYXRjaCguLi4pIHsgfSIKICAgICAgICAgICAgYmxvY2sgYXJvdW5kIHRoZSBjb250ZW50cyBvZiBTV0lHIHdyYXBwZXIgZnVuY3Rpb25zIHRvIGZpcnN0IGV4ZWN1dGUgdGhlIGNsZWFudXAgY29kZQogICAgICAgICAgICBiZWZvcmUgcmV0aHJvd2luZyBhbnkgZXhjZXB0aW9uIHJhaXNlZC4gSXQgaXMgYmFja3dhcmQgY29tcGF0aWJsZSB3aXRoIGVhcmxpZXIgdmVyc2lvbnMKICAgICAgICAgICAgb2YgT2N0YXZlIHdoZXJlIGVycm9yKCkgZG9lcyBub3QgcmFpc2UgYW4gZXhjZXB0aW9uLCB3aGljaCB3aWxsIHN0aWxsIGJyYW5jaCB0byB0aGUKICAgICAgICAgICAgImZhaWw6IiBibG9jayB0byBleGVjdXRlIGNsZWFudXAgY29kZSBpZiBhbiBlcnJvciBpcyBlbmNvdW50ZXJlZC4KCiAgICAgICAgICAgIE5vdGUgdGhhdCB0aGUgbmV3ICJ0cnkgeyAuLi4gfSBjYXRjaCguLi4pIHsgfSIgYmxvY2sgd2lsbCBsb2NhbGlzZSBhbnkgbG9jYWwgdmFyaWFibGVzCiAgICAgICAgICAgIHVzZWQgaW4gdHlwZW1hcHMgdGhhdCB3ZXJlIE5PVCBkZWNsYXJlZCB0aHJvdWdoIFNXSUcncyAldHlwZW1hcCguLi4pIHN5bnRheCwgc28gaXQncwogICAgICAgICAgICBwb3NzaWJsZSB0aGlzIGNvdWxkIGJyZWFrIGV4aXN0aW5nIFNXSUcgd3JhcHBlcnMgd2hpY2ggd2VyZSBpbXBsaWNpdGx5IHNoYXJpbmcgbG9jYWwKICAgICAgICAgICAgdmFyaWFibGVzIGJldHdlZW4gdHlwZW1hcHMuIFRoaXMgY2FuIGJlIGZpeGVkLCBob3dldmVyLCBieSBkZWNsYXJpbmcgbG9jYWwgdmFyaWFibGVzCiAgICAgICAgICAgIHdoaWNoIG5lZWQgdG8gYmUgc2hhcmVkIGJldHdlZW4gdHlwZW1hcHMgdGhyb3VnaCBTV0lHJ3MgJXR5cGVtYXAoLi4uKSBzeW50YXguCgoyMDIwLTAyLTE4OiByeWFubmV2ZWxsCiAgICAgICAgICAgIFtMdWFdICMxNzI4IEFkZCBzdXBwb3J0IGZvciBMVUEgbGlnaHR1c2VyZGF0YSB0byBTV0lHX0x1YV9Db252ZXJ0UHRyLgoKMjAyMC0wMi0xODogZG1hY2gKICAgICAgICAgICAgW1J1YnldICMxNzI1IEZpeCBnY2MgLVdjYXRjaC12YWx1ZSB3YXJuaW5ncy4KCjIwMjAtMDItMTQ6IHRyZWl0bWF5cgogICAgICAgICAgICAjMTcyNCBGaXggd3JhcHBpbmcgb2YgYWJzdHJhY3QgdXNlci1kZWZpbmVkIGNvbnZlcnNpb24gb3BlcmF0b3JzLgoKMjAyMC0wMi0xMzogZGR1cmhhbTIKICAgICAgICAgICAgW1B5dGhvbl0gIzE1MTIgRml4IG1lbWxlYWsgd2hlbiB1c2luZyBTVEwgY29udGFpbmVycyBvZiBzaGFyZWRfcHRyIG9iamVjdHMuCgoyMDIwLTAyLTA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjMTY3MyAjMTY3NCBGaXggc2V0dGluZyAndGhpcycgd2hlbiBleHRlbmRpbmcgYSBwcm94eSBjbGFzcyB3aXRoIF9fc2xvdHNfXy4KCjIwMjAtMDEtMzE6IHZhZHoKICAgICAgICAgICAgW1J1YnldICMxNjUxIEFkZCBzdGQ6OmF1dG9fcHRyPD4gdHlwZW1hcHMuCgoyMDIwLTAxLTMxOiBaYWNrZXJ5U3B5dHoKICAgICAgICAgICAgW1B5dGhvbl0gIzE3MDAgVGhlIFB5dGhvbiBDIEFQSSBmdW5jdGlvbnMgUHlCeXRlc19Bc1N0cmluZ0FuZFNpemUoKSBhbmQKICAgICAgICAgICAgUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKCkgYXJlIG5vdyBjaGVja2VkIGZvciBmYWlsdXJlLgoKMjAyMC0wMS0zMTogdmFkegogICAgICAgICAgICBbUHl0aG9uXSAjMTcxMCBGaXggY3Jhc2ggcGFyc2luZyBlbXB0eSBkb2NzdHJpbmdzLgoKMjAyMC0wMS0zMDogQWx6YXRoYXIKICAgICAgICAgICAgW1JdICM5MTAgIzkxNCBGaXggUiBtZW1vcnkgbGVhayBvbiBleGNlcHRpb24uCgoyMDIwLTAxLTMwOiByaWNoYXJkYmVhcmUKICAgICAgICAgICAgW1JdICMxNTExIEZpeCBidWcgd3JhcHBpbmcgZnVuY3Rpb25zLiBUaGVzZSB3ZXJlIHByZXZpb3VzbHkgaW5jb3JyZWN0bHkgd3JhcHBlZCBhcyBpZgogICAgICAgICAgICB0aGV5IHdlcmUgdmFyaWFibGVzLiBUaGlzIGhhcHBlbmVkIHdoZW4gJ2dldCcgb3IgJ3NldCcgd2FzIGluIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbgogICAgICAgICAgICBvciBtZXRob2QsIGJ1dCBzb21ldGltZXMgYWxzbyBpbiBzb21lIG90aGVyIGNpcmN1bXN0YW5jZXMuIElmIHlvdSB3ZXJlIHVzaW5nIFIKICAgICAgICAgICAgYXR0cmlidXRlIHN5bnRheCB0byBhY2Nlc3MgdGhlc2UgbWV0aG9kcywgeW91J2xsIG5lZWQgdG8gc3dpdGNoIHRvIGNhbGxpbmcgdGhlbSBhcyBSCiAgICAgICAgICAgIG1ldGhvZHMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMjAtMDEtMjQ6IGV0c2UtZGlnbml0YXMsIHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgRCwgSmF2YV0gIzE1MzMgRml4IHVwY2FzdGluZyBmb3Igc2hhcmVkX3B0cidzIG9mIHRlbXBsYXRlZCB0eXBlcy4KCjIwMjAtMDEtMTY6IG1jZmFybGptCiAgICAgICAgICAgICMxNjQzICMxNjU0IFdoZW4gdXNpbmcgLWRveHlnZW4sIGZpeCBzZWdmYXVsdCB3aGVuIG5hbWVsZXNzIHBhcmFtZXRlcnMgb3IgdmFyYXJnIHBhcmFtZXRlcnMKICAgICAgICAgICAgYXJlIHVzZWQuCgoyMDIwLTAxLTE2OiBtY2ZhcmxqbQogICAgICAgICAgICAjMTYzMiAjMTY1OSBGaXggbmV3bGluZSBoYW5kbGluZyBmb3IgZG94eWdlbiAiLy8vIiBjb21tZW50cy4KCjIwMjAtMDEtMTQ6IG1jZmFybGptCiAgICAgICAgICAgICMxNjQ3ICMxNjU2IEZpeCBjcmFzaCBoYW5kbGluZyBlbXB0eSBkb3h5Z2VuIGNvbW1lbnRzLgoKMjAyMC0wMS0xNDogbWNmYXJsam0KICAgICAgICAgICAgIzE2MDggSW1wcm92ZSBkb3h5Z2VuIHN1cHBvcnQuCiAgICAgICAgICAgIC0gQWRkIHN1cHBvcnQgZm9yIFxwYXJhbVtdIGNvbW1hbmRzIHN1Y2ggYXM6IFxwYXJhbVtpbl0uCiAgICAgICAgICAgIC0gT3B0aW9uYWwgYXJndW1lbnRzIGFyZSBtYXJrZWQgYXMgJ29wdGlvbmFsJyBpbiBweWRvYy4KICAgICAgICAgICAgLSBJbXByb3ZlIHN1cHBvcnQgZm9yIFxjb2RlIGNvbW1hbmRzIHNvIHRoYXQgb3RoZXIgbGFuZ3VhZ2VzIGFyZSBzdXBwb3J0ZWQgYXMgY29kZSBibG9ja3MuCiAgICAgICAgICAgICAgU3VwcG9ydCBhZGRlZCBmb3IgamF2YSwgYyBhbmQgcHkuICBGb3IgZXhhbXBsZSBQeXRob246IFxjb2Rley5weX0gLi4uIFxlbmRjb2RlCiAgICAgICAgICAgIC0gRml4IGRveHlnZW4gaGFuZGxpbmcgb2YgXGVtIGFuZCBccCB0YWdzIGZvciBQeXRob24uCgoyMDIwLTAxLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjMTU5NSBQeXRob24gLWJ1aWx0aW4gY29uc3RydWN0b3JzIHNpbGVudGx5IGlnbm9yZWQga2V5d29yZCBhcmd1bWVudHMuCiAgICAgICAgICAgIEluc3RlYWQgb2Ygc2lsZW50bHkgaWdub3JpbmcgdGhlbSwgbm93IGEgIlR5cGVFcnJvcjogZigpIHRha2VzIG5vIGtleXdvcmQgYXJndW1lbnRzIgogICAgICAgICAgICBleGNlcHRpb24gaXMgdGhyb3duIGlmIGtleXdvcmQgYXJndW1lbnRzIGFyZSB1c2VkLiBIZW5jZSBjb25zdHJ1Y3RvcnMgYW5kIG5vcm1hbCBtZXRob2RzLwogICAgICAgICAgICBmdW5jdGlvbnMgYmVoYXZlIGluIHRoZSBzYW1lIHdheS4gTm90ZSwgLWtleXdvcmQgc2hvdWxkIGJlIHVzZWQgd2l0aCAtYnVpbHRpbiB0byBvYnRhaW4KICAgICAgICAgICAga2V5d29yZCBhcmd1bWVudCBzdXBwb3J0LgoKMjAyMC0wMS0wNToganNjaHVlbGxlciBzaGFkY2hpbgogICAgICAgICAgICBbUHl0aG9uXSAjMTY3MCAjMTY5NiBBZGQgbWlzc2luZyBmaWVsZCBpbml0aWFsaXplcnMgaW50cm9kdWNlZCBpbiBweXRob24gMy44OgogICAgICAgICAgICB0cF92ZWN0b3JjYWxsIGFuZCB0cF9wcmludC4KCjIwMjAtMDEtMDU6IGZyaWVkcmljaGF0Z2MKICAgICAgICAgICAgW09jdGF2ZV0gIzE2ODggQ2hhbmdlIHN3aWdfdGhpcygpIHRvIHVzZSBzaXplX3QgaW5zdGVhZCBvZiBsb25nIGZvciBjb21wYXRpYmlsaXR5CiAgICAgICAgICAgIHdpdGggV2luZG93cyA2NCBiaXQuCgoyMDIwLTAxLTA1OiB0cmVpdG1heXIKICAgICAgICAgICAgW1J1YnldICMxNjkyICMxNjg5IEFkZCBzdXBwb3J0IGZvciBSdWJ5IDIuNwoKMjAxOS0xMi0zMDogdHJlaXRtYXlyCiAgICAgICAgICAgIFtSdWJ5XSAjMTY1MyAjMTY2OCBGaXggY29kZSBnZW5lcmF0ZWQgd2hlbiB1c2luZyAtZ2xvYmFsbW9kdWxlIG9wdGlvbi4KCjIwMTktMTItMjk6IFphY2tlcnlTcHl0egogICAgICAgICAgICBbT0NhbWxdICMxNjg2IEZpeCBjb21waWxhdGlvbiBlcnJvcnMgd2l0aCBPQ2FtbCA0LjA5LjAuCgoyMDE5LTEyLTEwOiB3c2Z1bHRvbgogICAgICAgICAgICAjMTY3OSBGaXggcGFyc2luZyBvZiBDKysxMSBpZGVudGlmaWVycyB3aXRoIHNwZWNpYWwgbWVhbmluZyAoZmluYWwgYW5kIG92ZXJyaWRlKSB3aGVuCiAgICAgICAgICAgIHRoZXkgYXJlIHVzZWQgYXMgcGFydCBvZiB0aGUgc2NvcGUgbmFtZSBvZiBhbiBpZGVudGlmaWVyLCBzdWNoIGFzIGEgbmFtZXNwYWNlIG5hbWUuCgoyMDE5LTExLTI2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdICMxNjI4ICdvdXQnIG9yICdyZWYnIHVzZWQgaW4gYSBjc3R5cGUgdHlwZW1hcCB3YXMgbm90IGFsd2F5cyBzdHJpcHBlZCBvdXQgaW4gcGFydHMKICAgICAgICAgICAgb2YgZGlyZWN0b3IgY29kZSBnZW5lcmF0aW9uLgoKMjAxOS0xMS0wMTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gIzE1OTUgRml4IGJ1ZyBpbiBzdXBwb3J0IGZvciBrZXl3b3JkIGFyZ3VtZW50cyAoa3dhcmdzIGZlYXR1cmUgb3IgLWtleXdvcmQpCiAgICAgICAgICAgIHdoZW4gdXNpbmcgLWJ1aWx0aW4uIFRoZSBmaXggaXMgaW4gdGhlIGFyZ3VtZW50IGVycm9yIGNoZWNraW5nIHdoZW4gd3JhcHBpbmcgemVybwogICAgICAgICAgICBhcmd1bWVudCBjb25zdHJ1Y3RvcnMgb25seS4KClZlcnNpb24gNC4wLjEgKDIxIEF1ZyAyMDE5KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTktMDgtMjA6IFRla3VDb25jZXB0CiAgICAgICAgICAgIFtKYXZhc2NyaXB0XSAjMTUzNSBBZGQgJW5hdGl2ZSBzdXBwb3J0IHRvIEphdmFzY3JpcHQuCgoyMDE5LTA4LTIwOiBia290enoKICAgICAgICAgICAgW0phdmFdICMxNjE2IEFkZCBTV0lHX0phdmFJbGxlZ2FsU3RhdGVFeGNlcHRpb24gdG8gc3VwcG9ydCB0aHJvd2luZwogICAgICAgICAgICBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGZyb20gSk5JIGNvZGUuCgoyMDE5LTA4LTE5OiBzam1sCiAgICAgICAgICAgIFtMdWFdICMxNTk2IHRvc3RyaW5nIG91dHB1dCBjaGFuZ2VzIHRvIHNob3cgdGhlIHVuZGVybHlpbmcgQy9DKysgcG9pbnRlci4KCjIwMTktMDgtMDg6IHJva3VwcwogICAgICAgICAgICBbQyMsIEphdmFdICMxNjAxIEZpeCBpbnZhbGlkIGNvZGUgZ2VuZXJhdGVkIGZvciAiJWNvbnN0YW50IGVudW0gRW51bVR5cGUuCgoyMDE5LTA4LTA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggbWV0aG9kIG92ZXJsb2FkaW5nIG9mIG1ldGhvZHMgdGhhdCB0YWtlIFNUTCBjb250YWluZXJzIG9mIGRpZmZlcmVudAogICAgICAgICAgICB0eXBlcy4gVGhlIGZvbGxvd2luZyB1c2FnZSAodXNpbmcgc3RkOjp2ZWN0b3IpIHdvdWxkIGZhaWwgd2hlbiB1c2luZyAtYnVpbHRpbjoKCiAgICAgICAgICAgICAgJWluY2x1ZGUgPHN0ZF9zdHJpbmcuaT4KICAgICAgICAgICAgICAlaW5jbHVkZSA8c3RkX3ZlY3Rvci5pPgoKICAgICAgICAgICAgICAlaW5saW5lICV7CiAgICAgICAgICAgICAgc3RydWN0IFgge307CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICAgJXRlbXBsYXRlKFZlY3RvclgpIHN0ZDo6dmVjdG9yPFg+OwogICAgICAgICAgICAgICV0ZW1wbGF0ZShWZWN0b3JJbnQpIHN0ZDo6dmVjdG9yPGludD47CgogICAgICAgICAgICAgICVpbmxpbmUgJXsKICAgICAgICAgICAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOwogICAgICAgICAgICAgIHN0cmluZyBWZWN0b3JPdmVybG9hZCh2ZWN0b3I8WD4gdik7CiAgICAgICAgICAgICAgc3RyaW5nIFZlY3Rvck92ZXJsb2FkKHZlY3RvcjxpbnQ+IHYpOwogICAgICAgICAgICAgICV9CgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIHdvdWxkIGluY29ycmVjdGx5IGZhaWw6CgogICAgICAgICAgICAgIHMgPSBWZWN0b3JPdmVybG9hZChbMSwgMiwgM10pCgogICAgICAgICAgICBXaXRoOgoKICAgICAgICAgICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAgICAgICAgICAgICBGaWxlICJydW5tZTMucHkiLCBsaW5lIDIwLCBpbiA8bW9kdWxlPgogICAgICAgICAgICAgICAgICByZXQgPSBWZWN0b3JPdmVybG9hZChbMSwgMiwgM10pCiAgICAgICAgICAgICAgVHlwZUVycm9yOiBXcm9uZyBudW1iZXIgb3IgdHlwZSBvZiBhcmd1bWVudHMgZm9yIG92ZXJsb2FkZWQgZnVuY3Rpb24gJ1ZlY3Rvck92ZXJsb2FkJy4KICAgICAgICAgICAgICAgIFBvc3NpYmxlIEMvQysrIHByb3RvdHlwZXMgYXJlOgogICAgICAgICAgICAgICAgICBWZWN0b3JPdmVybG9hZChzdGQ6OnZlY3RvcjwgTnVtYmVyLHN0ZDo6YWxsb2NhdG9yPCBOdW1iZXIgPiA+KQogICAgICAgICAgICAgICAgICBWZWN0b3JPdmVybG9hZChzdGQ6OnZlY3RvcjwgaW50LHN0ZDo6YWxsb2NhdG9yPCBpbnQgPiA+KQoKICAgICAgICAgICAgVGhlIHByb2JsZW0gd2FzIGR1ZSB0byBzb21lIGVycm9yIGhhbmRsaW5nIHRoYXQgd2FzIG5vdCBjbGVhcmVkIGR1cmluZyB0eXBlY2hlY2tpbmcuCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSBhbiBlcnJvciB3YXMgbm90IGNsZWFyZWQgd2hlbiB0aGUgZWxlbWVudHMgaW4gdGhlIGxpc3QgZmFpbGVkIHRoZQogICAgICAgICAgICB0eXBlY2hlY2sgZm9yIGNvbnZlcnRpbmcgdG8gWC4gT25seSBvY2N1cnMgaW4gUHl0aG9uIDMrLgoKICAgICAgICAgICAgSW4gc29tZSBjb21iaW5hdGlvbnMgb2Ygb3ZlcmxvYWRlZCBtZXRob2RzLCB0aGUgZm9sbG93aW5nIHR5cGUgb2YgZXJyb3IgbWVzc2FnZSB3b3VsZAogICAgICAgICAgICBvY2N1cjoKCiAgICAgICAgICAgICAgUnVudGltZUVycm9yOiBpbiBzZXF1ZW5jZSBlbGVtZW50IDAKCiAgICAgICAgICAgICAgVGhlIGFib3ZlIGV4Y2VwdGlvbiB3YXMgdGhlIGRpcmVjdCBjYXVzZSBvZiB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbjoKCiAgICAgICAgICAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgICAgICAgICAgICAgRmlsZSAicnVubWUzLnB5IiwgbGluZSAyMywgaW4gPG1vZHVsZT4KICAgICAgICAgICAgICAgICAgY2hlY2soVmVjdG9yT3ZlcmxvYWQodiksICJ2ZWN0b3I8WD4iKQogICAgICAgICAgICAgIFN5c3RlbUVycm9yOiA8YnVpbHQtaW4gZnVuY3Rpb24gVmVjdG9yT3ZlcmxvYWQ+IHJldHVybmVkIGEgcmVzdWx0IHdpdGggYW4gZXJyb3Igc2V0CgoyMDE5LTA4LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICAjMTYwMiBGaXggcmVncmVzc2lvbiBpbiA0LjAuMCB3aGVyZSBhIHRlbXBsYXRlIGZ1bmN0aW9uIGNvbnRhaW5pbmcgYSBwYXJhbWV0ZXIKICAgICAgICAgICAgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBmdW5jdGlvbiBuYW1lIGxlZCB0byB0aGUgcGFyYW1ldGVyIG5hbWUgdXNlZCBpbiB0aGUKICAgICAgICAgICAgdGFyZ2V0IGxhbmd1YWdlIGJlaW5nIGluY29ycmVjdGx5IG1vZGlmaWVkLgoKMjAxOS0wNy0yOTogd3NmdWx0b24KICAgICAgICAgICAgUmVtb3ZlIGFsbCBnZW5lcmF0ZWQgZmlsZXMgb24gZXJyb3IuIFByZXZpb3VzbHkgZ2VuZXJhdGVkIGZpbGVzIHdlcmUgbm90IHJlbW92ZWQsCiAgICAgICAgICAgIHBvdGVudGlhbGx5IGJyZWFraW5nIE1ha2VmaWxlcyB1c2luZyBmaWxlIGRlcGVuZGVuY2llcywgZXNwZWNpYWxseSB3aGVuIC1XZXJyb3IKICAgICAgICAgICAgKHdhcm5pbmdzIGFzIGVycm9ycykgd2FzIHVzZWQuCgoyMDE5LTA3LTIzOiBzbWl0aHgKICAgICAgICAgICAgW0MjXSAjMTUzMCAjMTUzMiBGaXggbWFyc2hhbGxpbmcgb2Ygc3RkOjp3c3RyaW5nIHRvIEMjLgoKMjAxOS0wNy0xODogZ2ljbW8KICAgICAgICAgICAgW1B5dGhvbl0gIzE1ODcgUHl0aG9uIDMuOCBzdXBwb3J0IC0gcmVtb3ZlIHVzZSBvZiBkZXByZWNhdGVkIFB5T2JqZWN0X0dDX1VuVHJhY2suCgoyMDE5LTA3LTE4OiBjaGVyLW5vdgogICAgICAgICAgICBbUHl0aG9uXSAjMTU3MyBHZW5lcmF0ZWQgUHl0aG9uIGNvZGUgdXNlcyBjb25zaXN0ZW50IHN0cmluZyBxdW90aW5nIHN0eWxlIC0gZG91YmxlCiAgICAgICAgICAgIHF1b3Rlcy4KCjIwMTktMDctMTY6IGdlZWZyCiAgICAgICAgICAgIFtDI10gIzYxNiAjMTU3NiBGaXggQyMgYm9vbCBJTlBVVFtdLCBib29sIE9VVFBVVFtdLCBib29sIElOT1VUW10gdHlwZW1hcHMgdG8gbWFyc2hhbGwKICAgICAgICAgICAgYXMgMS1ieXRlLgoKMjAxOS0wNy0xMjogdmFkegogICAgICAgICAgICBbQyMsIEphdmFdICMxNTY4ICMxNTgzIEZpeCBzdGQ6OnNldDw+IHR5cGVtYXBzIGZvciBwcmltaXRpdmUgdHlwZXMuCgoyMDE5LTA3LTEyOiB2YWR6CiAgICAgICAgICAgICMxNTY2ICMxNTg0IFJlZ3Jlc3Npb24gaW4gNC4wLjAgLSBmaXggbWlzc2luZyB2YWx1ZSBmb3IgZmlyc3QgaXRlbSBvZiBlbnVtcyB3aXRoCiAgICAgICAgICAgIHRyYWlsaW5nIGNvbW1hLgoKMjAxOS0wNy0xMTogbWNmYXJsam0KICAgICAgICAgICAgIzE1NDggIzE1NzggRml4IHNlZ2ZhdWx0IGluIERveHlnZW4gcGFyc2VyIHBhcnNpbmcgZW1wdHkgbGluZXMgaW4gc29tZSBjb21tYW5kcyBsaWtlCiAgICAgICAgICAgIFxjb2RlLgoKMjAxOS0wNy0wOTogSXNhYWNQYXNjdWFsCiAgICAgICAgICAgIFtDIywgSmF2YV0gIzE1NzAgRml4IG5hbWUgb2YgZ2VuZXJhdGVkIEMjL0phdmEgY2xhc3NlcyBmb3IgJWludGVyZmFjZSBtYWNyb3MKICAgICAgICAgICAgaW4gc3dpZ2ludGVyZmFjZS5pIHdoZW4gd3JhcHBpbmcgbmVzdGVkIEMrKyBjbGFzc2VzLgoKMjAxOS0wNy0wNTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gIzE1NDcgV2hpdGVzcGFjZSBmaXhlcyBpbiBEb3h5Z2VuIHRyYW5zbGF0ZWQgY29tbWVudHMgaW50byBweWRvYyBjb21tZW50cwogICAgICAgICAgICBmb3IgU3BoaW54IGNvbXBhdGliaWxpdHkuCgoyMDE5LTA2LTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBbTXpTY2hlbWUsIE9DYW1sXSAjMTU1OSAkYXJnIGFuZCAkaW5wdXQgd2VyZSBpbmNvcnJlY3RseSBzdWJzdGl0dXRlZCBpbiB0aGUKICAgICAgICAgICAgYXJnb3V0IHR5cGVtYXAgd2hlbiB0d28gb3IgbW9yZSBhcmd1bWVudHMgd2VyZSBwcmVzZW50LgoKMjAxOS0wNi0yNDogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbiwgUnVieV0gIzE1MzggUmVtb3ZlIHRoZSBVbmtub3duRXhjZXB0aW9uSGFuZGxlciBjbGFzcyBpbiBvcmRlciB0byBiZQogICAgICAgICAgICBDKysxNyBjb21wbGlhbnQgYXMgaXQgdXNlcyBzdGQ6OnVuZXhwZWN0ZWRfaGFuZGxlciB3aGljaCB3YXMgcmVtb3ZlZCBpbiBDKysxNy4KICAgICAgICAgICAgVGhpcyBjbGFzcyB3YXMgaW50ZW5kZWQgZm9yIGRpcmVjdG9yIGV4Y2VwdGlvbiBoYW5kbGluZyBidXQgd2FzIG5ldmVyIHVzZWQgYnkKICAgICAgICAgICAgU1dJRyBhbmQgd2FzIG5ldmVyIGRvY3VtZW50ZWQuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTktMDYtMDY6IGJrb3R6egogICAgICAgICAgICBbSmF2YV0gIzE1NTIgSW1wcm92ZSBwZXJmb3JtYW5jZSBpbiBKYXZhIHN0ZDo6dmVjdG9yIGNvbnN0cnVjdG9yIHdyYXBwZXIgdGhhdCB0YWtlcwogICAgICAgICAgICBhIG5hdGl2ZSBKYXZhIGFycmF5IGFzIGlucHV0LgoKMjAxOS0wNi0wMzogb2xseQoJICAgIFtQeXRob25dIEZpeCByZWdyZXNzaW9uIGluIGltcGxpY2l0X2NvbnYgaGFuZGxpbmcgb2YgdHVwbGVzLAoJICAgIGludHJvZHVjZWQgaW4gU1dJRyA0LjAuMC4gIEZpeGVzICMxNTUzLCByZXBvcnRlZCBieSBBbGV4YW5kcmUKCSAgICBEdXJldC1MdXR6LgoKMjAxOS0wNS0yNDogd3NmdWx0b24KICAgICAgICAgICAgW09jdGF2ZV0gRml4IGRldGVjdGlvbiBvZiBPY3RhdmUgb24gTWFjT1MuCgoyMDE5LTA1LTI0OiBvcG9wbGF3c2tpCiAgICAgICAgICAgIFtPY3RhdmVdICMxNTIyIEFkYXB0IE9DVEFWRV9MREZMQUdTIGZvciBPY3RhdmUgNS4xLgoKMjAxOS0wNS0yMjogZmVyZHluYXRvcgoJICAgIFtQSFBdICMxNTI4IERvbid0IGFkZCBhIGNsb3NpbmcgJz8+JyBQSFAgdGFnIHRvIGdlbmVyYXRlZCBmaWxlcy4KCSAgICBQU1ItMiBzYXlzIGl0IE1VU1QgYmUgb21pdHRlZCBmb3IgZmlsZXMgY29udGFpbmluZyBvbmx5IFBIUC4KClZlcnNpb24gNC4wLjAgKDI3IEFwciAyMDE5KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTktMDQtMjQ6IHZhZHoKICAgICAgICAgICAgIzE1MTcgRml4IGNyYXNoIGlmICJAcmV0dXJuIiBEb3h5Z2VuIHRhZyB3YXMgdXNlZCBvbiBhIG5vZGUgd2l0aG91dCBhbnkgcmV0dXJuIHR5cGUuCgoyMDE5LTA0LTI0OiB2YWR6CiAgICAgICAgICAgICMxNTE1IEZpeCBwYXJzaW5nIG9mIGVudW1zIHdpdGggdHJhaWxpbmcgY29tbWEgd2hlbiB1c2luZyAtZG94eWdlbi4KCjIwMTktMDQtMTk6IGlhbmxhbmNldGF5bG9yCiAgICAgICAgICAgIFtHb10gIzEwNTUgV2hlbiBnZW5lcmF0aW5nIEdvIGNvZGUsIG1ha2UgLWNnbyB0aGUgZGVmYXVsdC4gQWRkIG5ldyAtbm8tY2dvIG9wdGlvbgogICAgICAgICAgICB0byBkaXNhYmxlIHRoZSBkZWZhdWx0LgoKMjAxOS0wNC0xOTogcGJlY2hlcmVyCiAgICAgICAgICAgIFtUY2xdICMxNTA4IEZpeCBWaXN1YWwgU3R1ZGlvIDIwMTUgYW5kIGxhdGVyIGNvbXBpbGF0aW9uIGVycm9ycyBkdWUgdG8gc25wcmludGYgbWFjcm8KICAgICAgICAgICAgZGVmaW5pdGlvbi4KCjIwMTktMDQtMDk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IEZ4Q29wIHdhcm5pbmcgQ0EyMDAyIGluIFNXSUdQZW5kaW5nRXhjZXB0aW9uIC0gYSBsb2NrIG9uIGEgcmVmZXJlbmNlIG9mCiAgICAgICAgICAgIHR5cGUgJ1R5cGUnLgoKMjAxOS0wMy0zMDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIERdIEFkZCB0aGUgcGFyYW1ldGVycyB0eXBlbWFwIGF0dHJpYnV0ZSB0byB0aGUgamF2YWRlc3RydWN0LAogICAgICAgICAgICBqYXZhZGVzdHJ1Y3RfZGVyaXZlZCwgZGRpc3Bvc2UsIGRkaXNwb3NlX2Rlcml2ZWQgdHlwZW1hcHMgdG8gbWlycm9yIGVuaGFuY2VkCiAgICAgICAgICAgIGZsZXhpYmlsaXR5IGluIHRoZSBjc2Rpc3Bvc2luZyBhbmQgY3NkaXNwb3NpbmdfZGVyaXZlZCAoQyMpIHR5cGVtYXBzLiBJZiBwcm92aWRlZAogICAgICAgICAgICB0aGUgY29udGVudHMgYXJlIGdlbmVyYXRlZCBhcyB0aGUgZGVsZXRlL2Rpc3Bvc2UgbWV0aG9kJ3MgcGFyYW1ldGVycyBkZWNsYXJhdGlvbi4KCjIwMTktMDMtMzA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gIzQyMSBGaXggRnhDb3Agd2FybmluZyBDQTEwNjMgYnkgaW1wbGVtZW50aW5nIHRoZSByZWNvbW1lbmRlZCBEaXNwb3NlIG1ldGhvZHMgZm9yCiAgICAgICAgICAgIHRoZSBJRGlzcG9zYWJsZSBpbnRlcmZhY2UuIFByZXZpb3VzbHkganVzdCB0aGUgRGlzcG9zZSgpIG1ldGhvZCB3YXMgZ2VuZXJhdGVkLgogICAgICAgICAgICBOb3cgdGhlIERpc3Bvc2UoKSBhbmQgRGlzcG9zZShib29sIGRpc3Bvc2luZykgbWV0aG9kcyBhcmUgZ2VuZXJhdGVkLgogICAgICAgICAgICBDaGFuZ2VzIGFyZSByZXF1aXJlZCBpZiBjdXN0b20gImNzZmluYWxpemUiLCAiY3NkZXN0cnVjdCIgb3IgImNzZGVzdHJ1Y3RfZGVyaXZlZCIKICAgICAgICAgICAgdHlwZW1hcHMgYXJlIGJlaW5nIHVzZWQuIERldGFpbHMgaW4gIzQyMSBvbiBHaXRodWIuIFNXSUcgd2lsbCBlcnJvciBvdXQgaWYgb25lIG9mCiAgICAgICAgICAgIHRoZSAiY3NmaW5hbGl6ZSwgImNzZGVzdHJ1Y3QiIG9yICJjc2Rlc3RydWN0X2Rlcml2ZWQiIHR5cGVtYXBzIGFyZSBmb3VuZC4gRXhhbXBsZQogICAgICAgICAgICBlcnJvciBtZXNzYWdlOgoKICAgICAgICAgICAgICBmb28uaDo2MDogRXJyb3I6IEEgZGVwcmVjYXRlZCBjc2ZpbmFsaXplIHR5cGVtYXAgd2FzIGZvdW5kIGZvciBGb28sIHBsZWFzZSByZW1vdmUKICAgICAgICAgICAgICBpdCBhbmQgcmVwbGFjZSBhbGwgY3NkZXN0cnVjdCwgY3NkZXN0cnVjdF9kZXJpdmVkIGFuZCBjc2ZpbmFsaXplIHR5cGVtYXBzIGJ5IHRoZQogICAgICAgICAgICAgIGNzZGlzcG9zZSwgY3NkaXNwb3NlX2Rlcml2ZWQsIGNzZGlzcG9zaW5nIGFuZCBjc2Rpc3Bvc2luZ19kZXJpdmVkIHR5cGVtYXBzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE5LTAzLTI1OiBMaXJ5bmEKICAgICAgICAgICAgW0MjXSAjMTE0MyBBZGQgc3RkX2xpc3QuaSBmb3Igc3RkOjpsaXN0IHN1cHBvcnQuCiAgICAgICAgICAgIFRoZSBDIyBzdGQ6Omxpc3Q8VD4gd3JhcHBlcnMgYXJlIG1hZGUgdG8gbG9vayBhbmQgZmVlbCBsaWtlIGEgQyMKICAgICAgICAgICAgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlua2VkTGlzdDw+IGNvbGxlY3Rpb24uCiAgICAgICAgICAgIFRoZSBJRW51bWVyYWJsZTw+IGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBpbiB0aGUgcHJveHkgY2xhc3MuCiAgICAgICAgICAgIFRoZSBJQ29sbGVjdGlvbjw+IGludGVyZmFjZSBjYW4gYWxzbyBiZSBpbXBsZW1lbnRlZCB0byBwcm92aWRlIGVuaGFuY2VkIGZ1bmN0aW9uYWxpdHkKICAgICAgICAgICAgd2hlbmV2ZXIgYSBDKysgb3BlcmF0b3I9PSBpcyBhdmFpbGFibGUuIFRoaXMgaXMgdGhlIGNhc2UgZm9yIHdoZW4gVCBpcyBhCiAgICAgICAgICAgIHByaW1pdGl2ZSB0eXBlIG9yIGEgcG9pbnRlci4gSWYgVCBkb2VzIGRlZmluZSBhbiBvcGVyYXRvcj09LCB0aGVuIHVzZSB0aGUKICAgICAgICAgICAgU1dJR19TVERfTElTVF9FTkhBTkNFRCBtYWNybyB0byBvYnRhaW4gdGhpcyBlbmhhbmNlZCBmdW5jdGlvbmFsaXR5LCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgU1dJR19TVERfTElTVF9FTkhBTkNFRChTb21lTmFtZXNwYWNlOjpLbGFzcykKICAgICAgICAgICAgICAldGVtcGxhdGUoTGlzdEtsYXNzKSBzdGQ6Omxpc3Q8U29tZU5hbWVzcGFjZTo6S2xhc3M+OwoKMjAxOS0wMy0xODogcmljaGFyZGJlYXJlCiAgICAgICAgICAgIFtSXSAjMTMyOCBOb24tdHJpdmlhbCBlbnVtcyBhcmUgd29ya2luZyBub3cuIFRoZSBlbnVtIHZhbHVlcyBhcmUgbm93IG9idGFpbmVkIGZyb20KICAgICAgICAgICAgdGhlIEMvQysrIGxheWVyLiBjb25zdCByZWZlcmVuY2UgZW51bXMgYW5kIEMrKzExIGVudW0gY2xhc3NlcyBhcmUgYWxzbyBub3cgd29ya2luZy4KCjIwMTktMDMtMTQ6IG1vY2hpemsKICAgICAgICAgICAgW0phdmFzY3JpcHRdICMxNTAwIEZpeCBjb21waWxhdGlvbiBlcnJvcnMgZHVlIHRvIGRlcHJlY2F0aW5nIFY4IEFQSSBpbiBOb2RlLmpzLgogICAgICAgICAgICBOZXcgVjggQVBJIGlzIHVzZWQgaWYgbm9kZS5qcyA+PSB2MTAuMTIsIG9yIGlmIFY4ID49IHY3LjAuCgoyMDE5LTAzLTEyOiB2YWR6CiAgICAgICAgICAgIFtDI10gIzE0OTUgQWRkIHN0ZF9zZXQuaSBmb3Igc3RkOjpzZXQgc3VwcG9ydC4KCjIwMTktMDMtMTE6IGRpcnRlYXQsb3BvcGxhd3NraQogICAgICAgICAgICBbT2N0YXZlXSBGaXggY29tcGlsYXRpb24gZXJyb3JzIGluIE9jdGF2ZSA1LjEuCgogICAgICAgICAgICAgIGVycm9yOiBmb3JtYXQgbm90IGEgc3RyaW5nIGxpdGVyYWwgYW5kIG5vIGZvcm1hdCBhcmd1bWVudHMgWy1XZXJyb3I9Zm9ybWF0LXNlY3VyaXR5XQoKMjAxOS0wMi0yODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIHN0ZDo6dmVjdG9yIGltcHJvdmVtZW50cyBmb3IgdHlwZXMgdGhhdCBkbyBub3QgaGF2ZSBhIGRlZmF1bHQgY29uc3RydWN0b3IuCgogICAgICAgICAgICBUaGUgc3RkOjp2ZWN0b3Igd3JhcHBlcnMgaGF2ZSBiZWVuIGNoYW5nZWQgdG8gd29yayBieSBkZWZhdWx0IGZvciBlbGVtZW50cyB0aGF0IGFyZQogICAgICAgICAgICBub3QgZGVmYXVsdCBpbnNlcnRhYmxlLCBpLmUuIGhhdmUgbm8gZGVmYXVsdCBjb25zdHJ1Y3Rvci4gVGhpcyBoYXMgYmVlbiBhY2hpZXZlZCBieQogICAgICAgICAgICBub3Qgd3JhcHBpbmc6CgogICAgICAgICAgICAgIHZlY3RvcihzaXplX3R5cGUgbik7CgogICAgICAgICAgICBQcmV2aW91c2x5IHRoZSBhYm92ZSBoYWQgdG8gYmUgaWdub3JlZCB2aWEgJWlnbm9yZS4KCiAgICAgICAgICAgIElmIHRoZSBhYm92ZSBjb25zdHJ1Y3RvciBpcyBzdGlsbCByZXF1aXJlZCBpdCBjYW4gYmUgYWRkZWQgYmFjayBpbiBhZ2FpbiB2aWEgJWV4dGVuZDoKCiAgICAgICAgICAgICAgJWV4dGVuZCBzdGQ6OnZlY3RvciB7CiAgICAgICAgICAgICAgICB2ZWN0b3Ioc2l6ZV90eXBlIGNvdW50KSB7IHJldHVybiBuZXcgc3RkOjp2ZWN0b3I8IFQgPihjb3VudCk7IH0KICAgICAgICAgICAgICB9CgogICAgICAgICAgICBBbHRlcm5hdGl2ZWx5LCB0aGUgZm9sbG93aW5nIHdyYXBwZWQgY29uc3RydWN0b3IgY291bGQgYmUgdXNlZCBhcyBpdCBwcm92aWRlcyBuZWFyLWVub3VnaAogICAgICAgICAgICBlcXVpdmFsZW50IGZ1bmN0aW9uYWxpdHk6CgogICAgICAgICAgICAgIHZlY3RvcihqaW50IGNvdW50LCBjb25zdCB2YWx1ZV90eXBlJiB2YWx1ZSk7CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTktMDItMjU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBjb21waWxlIGVycm9ycyB3cmFwcGluZyBvdmVybG9hZGVkIGZ1bmN0aW9ucy9jb25zdHJ1Y3RvcnMgd2hlcmUgYSB2YXJhcmcKICAgICAgICAgICAgZnVuY3Rpb24gaXMgZGVjbGFyZWQgYWZ0ZXIgYSBub24tdmFyYXJnIGZ1bmN0aW9uLgoKMjAxOS0wMi0yMzogenBoZW5zbGV5NDIKICAgICAgICAgICAgVXNlIGZ1bGx5IHF1YWxpZmllZCBuYW1lICdqYXZhLmxhbmcuT2JqZWN0JyBpbnN0ZWFkIG9mICdPYmplY3QnIGluIGdlbmVyYXRlZCBjb2RlIHRvCiAgICAgICAgICAgIGF2b2lkIGNsYXNoZXMgd2l0aCB3cmFwcGVkIEMrKyBjbGFzc2VzIGNhbGxlZCAnT2JqZWN0Jy4KCjIwMTktMDItMjM6IGd0YlgKICAgICAgICAgICAgW0phdmFdICMxMDM1IEFkZCAoY29uc3QgY2hhciAqU1RSSU5HLCBzaXplX3QgTEVOR1RIKSB0eXBlbWFwcyBpbiBhZGRpdGlvbiB0byB0aGUgbm9uLWNvbnN0CiAgICAgICAgICAgIHR5cGVtYXBzIChjaGFyICpTVFJJTkcsIHNpemVfdCBMRU5HVEgpIHdoaWNoIGRvZXMgbm90IGF0dGVtcHQgdG8gd3JpdGUgYmFjayB0byB0aGUgY29uc3QKICAgICAgICAgICAgc3RyaW5nLgoKMjAxOS0wMi0yMjogdGFtdXJhdGFrCiAgICAgICAgICAgIFtSdWJ5XSAjOTg0IEFkZCBzdXBwb3J0IGZvciBSVHlwZWREYXRhIGludHJvZHVjZWQgaW4gUnVieSAxLjkuMy4KCjIwMTktMDItMjI6IFphY2tlcnlTcHl0egogICAgICAgICAgICAjMTQ4MyBGaXggY29tcGlsYXRpb24gZmFpbHVyZXMgd2hlbiBhIGRpcmVjdG9yIGNsYXNzIGhhcyBmaW5hbCBtZXRob2RzLgoKMjAxOS0wMi0yMTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdICMxMjQwIFN1cHByZXNzIEphdmEgOSBkZXByZWNhdGlvbiB3YXJuaW5ncyBvbiBmaW5hbGl6ZSBtZXRob2QuCgoyMDE5LTAyLTIxOiBaYWNrZXJ5U3B5dHoKICAgICAgICAgICAgIzE0ODAgRml4IHNvbWUgcmVqZWN0aW9ucyBvZiB2YWxpZCBmbG9hdGluZy1wb2ludCBsaXRlcmFscy4KCjIwMTktMDItMTk6IHdzZnVsdG9uCiAgICAgICAgICAgICMxNDc1IEZpeCByZWdyZXNzaW9uIHBhcnNpbmcgZ2NjIHByZXByb2Nlc3NvciBsaW5lbWFya2VycyBpbiB0aGUgZm9ybToKCiAgICAgICAgICAgICMgbGluZW51bSBmaWxlbmFtZSBmbGFncwoKMjAxOS0wMi0xODogamFrZWNvYmIKICAgICAgICAgICAgW1B5dGhvbl0gIzk0NSAjMTIzNCBFbGVtZW50cyBpbiBzdGQ6OnZlY3RvciBtZW1vcnkgYWNjZXNzIGZpeC4KCiAgICAgICAgICAgIEFjY2Vzc2luZyBhbiBlbGVtZW50IGluIGEgc3RkOjp2ZWN0b3Igb2J0YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgZWxlbWVudCB2aWEgYW4KICAgICAgICAgICAgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVsZW1lbnQgaW4gdGhlIGNvbnRhaW5lci4gSWYgdGhlIHZlY3RvciBpcyBnYXJiYWdlIGNvbGxlY3RlZCwKICAgICAgICAgICAgdGhlIFNXSUcgd3JhcHBlciBjb250YWluaW5nIHRoZSBwb2ludGVyIHRvIHRoZSBlbGVtZW50IGJlY29tZXMgaW52YWxpZC4gVGhlIGZpeCBpcwogICAgICAgICAgICB0byBvYnRhaW4gYSBiYWNrLXJlZmVyZW5jZSB0byB0aGUgY29udGFpbmVyIGJ5IHRoZSB3cmFwcGVyIHRvIHRoZSBlbGVtZW50IGluIHRoZSBQeXRob24KICAgICAgICAgICAgbGF5ZXIgdG8gcHJldmVudCB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IgZnJvbSBkZXN0cm95aW5nIHRoZSB1bmRlcmx5aW5nIGNvbnRhaW5lci4KCjIwMTktMDItMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB0eXBlbWFwIG1hdGNoaW5nIHRvIGV4cGFuZCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIHdoZW4gdGhlIG5hbWUgY29udGFpbnMKICAgICAgICAgICAgdGVtcGxhdGUgcGFyYW1ldGVycy4gSW4gdGhlICV0eXBlbWFwIGJlbG93IHRoZSB0eXBlIGlzIFQgYW5kIHRoZSBuYW1lIGlzIFg8VD46Om1ha2UKICAgICAgICAgICAgYW5kIHRoZSBuYW1lIG5vdyBleHBhbmRzIGNvcnJlY3RseSB0byBYPCBpbnQgPjo6bWFrZQoKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgWCB7CiAgICAgICAgICAgICAgICAldHlwZW1hcChvdXQpIFQgWDxUPjo6bWFrZSAiLi4uIgogICAgICAgICAgICAgICAgVCBtYWtlKCk7CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgJXRlbXBsYXRlKFhpbnQpIFg8aW50PjsKCjIwMTktMDItMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBwYXJzZXIgZXJyb3IgY29udGFpbmluZyBtdWx0aXBsZSAjZGVmaW5lIHN0YXRlbWVudHMgaW5zaWRlIGFuIGVudW0uCgogICAgICAgICAgICBUaGUgc2Vjb25kICNkZWZpbmUgZmFpbHMgdG8gcGFyc2U6CgogICAgICAgICAgICAgIGVudW0gRm9vRW51bSB7CiAgICAgICAgICAgICAgICBFTlVNMSA9IDAsCiAgICAgICAgICAgICAgICBFTlVNMiA9IDEsCgogICAgICAgICAgICAgICNkZWZpbmUgTUFDUk9fREVGMSAiSGVsbG8iCiAgICAgICAgICAgICAgI2RlZmluZSBNQUNST19ERUYyICJXb3JsZCEiCgogICAgICAgICAgICAgICAgRU5VTTMgPSAyLAogICAgICAgICAgICAgICAgRU5VTTQgPSAzLAogICAgICAgICAgICAgIH07CgogICAgICAgICAgICBCdWcgbWVudGlvbmVkIGF0IGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Avc3dpZy9wYXRjaGVzLzMzMy8KCjIwMTktMDItMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBzb21lIG1pc3NpbmcgY29weSBjb25zdHJ1Y3RvcnMgaW50byBTVEwgY29udGFpbmVycy4KCjIwMTktMDItMTQ6IGJrb3R6egogICAgICAgICAgICBbSmF2YV0gIzEzNTYgQWRkIFNUTCBjb250YWluZXJzOgogICAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcAogICAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldAogICAgICAgICAgICAgIHN0ZDo6c2V0CgoyMDE5LTAyLTE0OiBia290enoKICAgICAgICAgICAgW0phdmFdICMxMzU2IHN0ZDo6bWFwIHdyYXBwZXJzIGhhdmUgYmVlbiBtb2RpZmllZC4gTm93IHRoZSBKYXZhIHByb3h5IGNsYXNzCiAgICAgICAgICAgIGV4dGVuZHMgamF2YS51dGlsLkFic3RyYWN0TWFwLiBUaGUgc3RkOjptYXAgY29udGFpbmVyIGxvb2tzIGFuZCBmZWVscyBtdWNoIGxpa2UKICAgICAgICAgICAgYSBqYXZhLnV0aWwuSGFzaE1hcCBmcm9tIEphdmEuCgogICAgICAgICAgICBBIGZldyBtZW1iZXJzIGhhdmUgY2hhbmdlZCB0aGVpciBuYW1lcy4gSWYgdGhlIG9sZCBtZXRob2Qgc2lnbmF0dXJlcyBhcmUgbmVlZGVkLAogICAgICAgICAgICB0aGVuIGNvcHkgc3RkX21hcC5pIGZyb20gc3dpZy0zLjAuMTIgYW5kIHVzZSB0aGF0IGluc3RlYWQuIEFsdGVybmF0aXZlbHksCiAgICAgICAgICAgIGFkZCB0aGUgb2xkIG1pc3NpbmcgbWV0aG9kcyB0byB0aGUgbmV3IG1ldGhvZHMgYnkgdXNpbmcgdGhlIGZvbGxvd2luZyAlcHJveHljb2RlOgoKICAgICAgICAgICAgICAlZXh0ZW5kIHN0ZDo6bWFwIHsKICAgICAgICAgICAgICAlcHJveHljb2RlICV7CiAgICAgICAgICAgICAgICAvLyBPbGQgQVBJCiAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlbXB0eSgpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzRW1wdHkoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldCgkdHlwZW1hcChqYm94dHlwZSwgSykga2V5LCAkdHlwZW1hcChqYm94dHlwZSwgVCkgeCkgewogICAgICAgICAgICAgICAgICBwdXQoa2V5LCB4KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGRlbCgkdHlwZW1hcChqYm94dHlwZSwgSykga2V5KSB7CiAgICAgICAgICAgICAgICAgIHJlbW92ZShrZXkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzX2tleSgkdHlwZW1hcChqYm94dHlwZSwgSykga2V5KSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluc0tleShrZXkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE5LTAyLTEzOiBaYWNrZXJ5U3B5dHoKICAgICAgICAgICAgIzE0NjkgQWRkIHN1cHBvcnQgZm9yIEMrKzE3IGhleGFkZWNpbWFsIGZsb2F0aW5nIGxpdGVyYWxzLgoKMjAxOS0wMi0xMTogd3NmdWx0b24KICAgICAgICAgICAgW09DYW1sXSAjMTQzNyBPQ2FtbCBoYXMgYmVlbiBnaXZlIHRoZSAnRXhwZXJpbWVudGFsJyBsYW5ndWFnZSBzdGF0dXMuIFRoZSBleGFtcGxlcyB3b3JrCiAgICAgICAgICAgIGFuZCBtb3N0IG9mIHRoZSB0ZXN0LXN1aXRlIGlzIGFsc28gd29ya2luZywgc28gaXQgaXMgcXVpdGUgY2xvc2UgdG8gYmVpbmcgYSAnU3VwcG9ydGVkJyBsYW5ndWFnZS4KCjIwMTktMDItMTA6IFphY2tlcnlTcHl0egoJICAgICMxNDY0IEFkZCBzdXBwb3J0IGZvciBDKysxNCBiaW5hcnkgaW50ZWdlciBsaXRlcmFscy4KCjIwMTktMDItMTA6IFphY2tlcnlTcHl0egoJICAgICMxNDUwIEFkZCBzdXBwb3J0IGZvciBDKysxMSBVQ1MtMiBhbmQgVUNTLTQgY2hhcmFjdGVyIGxpdGVyYWxzLiBBbHNvLCBhZGQgc3VwcG9ydCBmb3IKICAgICAgICAgICAgQysrMTcgVVRGLTggY2hhcmFjdGVyIGxpdGVyYWxzLgoKMjAxOS0wMi0xMDogd3NmdWx0b24KCSAgICBbTXpTY2hlbWVdICMxNDM3IE16U2NoZW1lL1JhY2tldCBpcyBub3cgYW4gJ0V4cGVyaW1lbnRhbCcgbGFuZ3VhZ2UuIFRoZSBleGFtcGxlcyB3b3JrCiAgICAgICAgICAgIGFuZCBhIGxhcmdlIHBvcnRpb24gb2YgdGhlIHRlc3Qtc3VpdGUgaXMgYWxzbyB3b3JraW5nLgoKMjAxOS0wMi0xMDogd3NmdWx0b24KCSAgICBbTXpTY2hlbWVdIERlc3RydWN0b3Igd3JhcHBlcnMgd2VyZSBub3QgYmVpbmcgZ2VuZXJhdGVkLgoKMjAxOS0wMi0xMDogd3NmdWx0b24KCSAgICBbTXpTY2hlbWVdIFN0YXRpYyB2YXJpYWJsZSB3cmFwcGVycyBmaXhlZCAtICRhcmdudW0gd2FzIG5vdCBleHBhbmRlZC4KCjIwMTktMDItMTA6IHNldGhyagoJICAgICMxNDUyIEZpeCAlYXBwbHkgZm9yIGFub255bW91cyB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9ucwoKMjAxOS0wMi0wOTogb2xseQoJICAgIFtQSFBdIEZpeCBhY2Nlc3MgdG8gYWxyZWFkeSByZWxlYXNlZCBtZW1vcnkgZHVyaW5nIFBIUCBtb2R1bGUKCSAgICBzaHV0ZG93biwgd2hpY2ggb2Z0ZW4gZGlkbid0IGNhdXNlIHZpc2libGUgcHJvYmxlbXMsIGJ1dCBjb3VsZAoJICAgIHJlc3VsdCBpbiBzZWdtZW50YXRpb24gZmF1bHRzLCBidXMgZXJyb3JzLCBldGMuICBGaXhlcyAjMTE3MCwKCSAgICByZXBvcnRlZCBieSBKaXRrYSBQbGVzbu1rb3bhLgoKMjAxOS0wMi0wOTogb2xseQoJICAgIFtQSFBdIEEgcmVuYW1lZCBjb25zdHJ1Y3RvciBpcyBub3cgd3JhcHBlZCBhcyBhIHN0YXRpYyBtZXRob2QgaW4KCSAgICBQSFAuCgoyMDE5LTAyLTA4OiBvbGx5CgkgICAgW1BIUF0gRG9uJ3QgZ2VuZXJhdGUgY29kZSB3aGljaCByZWZlcmVuY2VzICRyIHdoZW4gJHIgaGFzbid0IGJlZW4KCSAgICBkZWZpbmVkLiAgVGhpcyBjb3VsZCBoYXBwZW4gaW4gb3ZlcmxvYWRlZCBtZXRob2RzIHdoaWNoIHJldHVybmVkCgkgICAgdm9pZCBhbmQgdG9vayBhdCBsZWFzdCBvbmUgY29uc3Qgc3RkOjpzdHJpbmcmIHBhcmFtZXRlci4KCjIwMTktMDItMDg6IG9sbHkKCSAgICBbUEhQXSBUaGUgZ2VuZXJhdGVkIGNvZGUgaXMgbm93IGNvbXBhdGlibGUgd2l0aCBQSFAgNy4zLCBhbmQgdGhlCgkgICAgdGVzdHN1aXRlIG5vdyBydW5zIGNsZWFubHkgd2l0aCB0aGlzIHZlcnNpb24gdG9vLgoKMjAxOS0wMi0wNTogd3NmdWx0b24KICAgICAgICAgICAgIzE0MzcgU1dJRyBub3cgY2xhc3NpZmllcyB0aGUgc3RhdHVzIG9mIHRhcmdldCBsYW5ndWFnZXMgaW50byBlaXRoZXIgJ0V4cGVyaW1lbnRhbCcgb3IKICAgICAgICAgICAgJ1N1cHBvcnRlZCcuIFRoaXMgc3RhdHVzIGlzIHByb3ZpZGVkIHRvIGluZGljYXRlIHRoZSBsZXZlbCBvZiBtYXR1cml0eSB0byBleHBlY3Qgd2hlbiB1c2luZwogICAgICAgICAgICBhIHBhcnRpY3VsYXIgdGFyZ2V0IGxhbmd1YWdlIGFzIG5vdCBhbGwgdGFyZ2V0IGxhbmd1YWdlcyBhcmUgZnVsbHkgZGV2ZWxvcGVkLiBEZXRhaWxzIGFyZQogICAgICAgICAgICBpbiB0aGUgSW50cm9kdWN0aW9uLmh0bWwgY2hhcHRlciBvZiB0aGUgZG9jdW1lbnRhdGlvbi4KCjIwMTktMDItMDQ6IHdzZnVsdG9uCgkgICAgW0NGRkldICMxNDQ3IENvbW1vbiBMaXNwIENGRkkgaGFzIGJlZW4gZGlzYWJsZWQgYXMgYSB0YXJnZXQgbGFuZ3VhZ2UgaW4gU1dJRyBhcyBwYXJ0IG9mIGEKICAgICAgICAgICAgY2xlYW4gdXAgdG8gcmVtb3ZlIHRhcmdldCBsYW5ndWFnZXMgdGhhdCBoYXZlIGJlZW4gbmVnbGVjdGVkL25vdCBmdW5jdGlvbmFsLgoKMjAxOS0wMi0wNDogd3NmdWx0b24KCSAgICBbQWxsZWdyb2NsXSAjMTQ0NyBBbGxlZ3JvIENvbW1vbiBMaXNwIGhhcyBiZWVuIGRpc2FibGVkIGFzIGEgdGFyZ2V0IGxhbmd1YWdlIGluIFNXSUcgYXMgcGFydCBvZiBhCiAgICAgICAgICAgIGNsZWFuIHVwIHRvIHJlbW92ZSB0YXJnZXQgbGFuZ3VhZ2VzIHRoYXQgaGF2ZSBiZWVuIG5lZ2xlY3RlZC9ub3QgZnVuY3Rpb25hbC4KCjIwMTktMDItMDQ6IHdzZnVsdG9uCgkgICAgW0NoaWNrZW5dICMxNDQ3IENISUNLRU4gaGFzIGJlZW4gZGlzYWJsZWQgYXMgYSB0YXJnZXQgbGFuZ3VhZ2UgaW4gU1dJRyBhcyBwYXJ0IG9mIGEKICAgICAgICAgICAgY2xlYW4gdXAgdG8gcmVtb3ZlIHRhcmdldCBsYW5ndWFnZXMgdGhhdCBoYXZlIGJlZW4gbmVnbGVjdGVkL25vdCBmdW5jdGlvbmFsLgoKMjAxOS0wMi0wNDogd3NmdWx0b24KCSAgICBbQ0xJU1BdICMxNDQ3IEdOVSBDb21tb24gTGlzcCBoYXMgYmVlbiBkaXNhYmxlZCBhcyBhIHRhcmdldCBsYW5ndWFnZSBpbiBTV0lHIGFzIHBhcnQgb2YgYQogICAgICAgICAgICBjbGVhbiB1cCB0byByZW1vdmUgdGFyZ2V0IGxhbmd1YWdlcyB0aGF0IGhhdmUgYmVlbiBuZWdsZWN0ZWQvbm90IGZ1bmN0aW9uYWwuCgoyMDE5LTAyLTA0OiB3c2Z1bHRvbgoJICAgIFtTLUVYUF0gIzE0NDcgQ29tbW9uIExpc3AgUy1FeHAgaGFzIGJlZW4gZGlzYWJsZWQgYXMgYSB0YXJnZXQgbGFuZ3VhZ2UgaW4gU1dJRyBhcyBwYXJ0IG9mIGEKICAgICAgICAgICAgY2xlYW4gdXAgdG8gcmVtb3ZlIHRhcmdldCBsYW5ndWFnZXMgdGhhdCBoYXZlIGJlZW4gbmVnbGVjdGVkL25vdCBmdW5jdGlvbmFsLgoKMjAxOS0wMi0wNDogd3NmdWx0b24KCSAgICBbVUZGSV0gIzE0NDcgQ29tbW9uIExpc3AgVUZGSSBoYXMgYmVlbiBkaXNhYmxlZCBhcyBhIHRhcmdldCBsYW5ndWFnZSBpbiBTV0lHIGFzIHBhcnQgb2YgYQogICAgICAgICAgICBjbGVhbiB1cCB0byByZW1vdmUgdGFyZ2V0IGxhbmd1YWdlcyB0aGF0IGhhdmUgYmVlbiBuZWdsZWN0ZWQvbm90IGZ1bmN0aW9uYWwuCgoyMDE5LTAyLTA0OiB3c2Z1bHRvbgoJICAgIFtQaWtlXSAjMTQ0NyBQaWtlIGhhcyBiZWVuIGRpc2FibGVkIGFzIGEgdGFyZ2V0IGxhbmd1YWdlIGluIFNXSUcgYXMgcGFydCBvZiBhCiAgICAgICAgICAgIGNsZWFuIHVwIHRvIHJlbW92ZSB0YXJnZXQgbGFuZ3VhZ2VzIHRoYXQgaGF2ZSBiZWVuIG5lZ2xlY3RlZC9ub3QgZnVuY3Rpb25hbC4KCjIwMTktMDItMDQ6IHdzZnVsdG9uCgkgICAgW01vZHVsYTNdICMxNDQ3IE1vZHVsYTMgaGFzIGJlZW4gZGlzYWJsZWQgYXMgYSB0YXJnZXQgbGFuZ3VhZ2UgaW4gU1dJRyBhcyBwYXJ0IG9mIGEKICAgICAgICAgICAgY2xlYW4gdXAgdG8gcmVtb3ZlIHRhcmdldCBsYW5ndWFnZXMgdGhhdCBoYXZlIGJlZW4gbmVnbGVjdGVkL25vdCBmdW5jdGlvbmFsLgoKMjAxOS0wMi0wMjogYWhub2xkcwoJICAgIFtQeXRob25dIERvY3VtZW50YXRpb24gZW5oYW5jZW1lbnRzIGZvciBQeXRob246CgogICAgICAgICAgICAjNzI4IEZpeGVkIHRoZSBoYW5kbGluZyBvZiBhdXRvZG9jIHdoZW4gdXNpbmcgLWZhc3Rwcm94eS4KCiAgICAgICAgICAgICMxMzY3IEFkZGVkIGRvY3VtZW50YXRpb24gdG8gd3JhcHBlZCBtZW1iZXIgdmFyaWFibGVzIHVzaW5nIHRoZQogICAgICAgICAgICBwcm9wZXJ0eSguLi4gZG9jPSIuLi4iKSBjb25zdHJ1Y3QuCgogICAgICAgICAgICBPbmx5IHNob3cgYSBzaW5nbGUgZG9jdW1lbnRhdGlvbiBlbnRyeSBmb3IgZnVuY3Rpb25zIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgd2hlbgogICAgICAgICAgICB1c2luZyBhdXRvZG9jLgoKICAgICAgICAgICAgRml4ZWQgYSBidWcgd2hlcmUgYSBjYWNoZWQgZG94eWdlbiBkb2NzdHJpbmcgY291bGQgYmUgZGVsZXRlZCB3aGlsZSBzdGlsbCBpbiB1c2UsCiAgICAgICAgICAgIGNhdXNpbmcgc3dpZyB0byBzZWdmYXVsdC4KCjIwMTktMDEtMzE6IG9sbHkKCSAgICBTV0lHIG5vdyByZXF1aXJlcyBhIHRhcmdldCBsYW5ndWFnZSB0byBiZSBzcGVjaWZpZWQgaW5zdGVhZCBvZgoJICAgIGRlZmF1bHRpbmcgdG8gd3JhcHBpbmcgZm9yIFRjbC4gIFNwZWNpZnlpbmcgc3dpZyAtLWhlbHAgd2l0aG91dAoJICAgIGEgdGFyZ2V0IGxhbmd1YWdlIG5vdyBqdXN0IHNob3dzIHRoZSBnZW5lcmljIGhlbHAuICBUaGUgLW5vbGFuZwoJICAgIG9wdGlvbiBoYXMgYmVlbiByZW1vdmVkLgoKMjAxOS0wMS0yODogWmFja2VyeVNweXR6CiAgICAgICAgICAgIFtPQ2FtbF0gIzE0MjkgUmVtb3ZlIHN1cHBvcnQgZm9yIE9DYW1sIHZlcnNpb25zIDwgMy4xMi4wLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE5LTAxLTIyOiB2YWR6CiAgICAgICAgICAgIFtSdWJ5LCBPY3RhdmVdICMxNDI0IEltcHJvdmUgYXV0b2RvYyBwYXJhbWV0ZXIgbmFtaW5nLgoKMjAxOS0wMS0yMjogdmFkegogICAgICAgICAgICBbUHl0aG9uXSAjMTI3MSAjMTQyMyBBbHdheXMgaW5jbHVkZSBkZWZhdWx0IHBhcmFtZXRlciB2YWx1ZXMgaW4gYXV0b2RvYyBzdHJpbmdzLgoKMjAxOS0wMS0xOTogdmFkegogICAgICAgICAgICAjMTI3MiwgIzE0MjEgV2hlbiBhIGZ1bmN0aW9uJ3MgcGFyYW1ldGVyIGlzIGEga2V5d29yZCwgdGhlIG5hbWUgb2YgdGhlIHBhcmFtYXRlciBpcwogICAgICAgICAgICBubyBsb25nZXIgc2ltcGx5IGNoYW5nZWQgdG8gYXJnTiwgd2hlcmUgTiBpcyB0aGUgYXJndW1lbnQgbnVtYmVyLiBJbnN0ZWFkIHRoZQogICAgICAgICAgICBwYXJhbWV0ZXIgbmFtZSBpcyBjaGFuZ2VkIHRvIHRoZSByZW5hbWluZyBydWxlcyBmb3Iga2V5d29yZHMgdGhhdCBub3JtYWxseSBhcHBseSB0bwogICAgICAgICAgICBzeW1ib2xzIHN1Y2ggYXMgY2xhc3Nlcy9mdW5jdGlvbnMgZXRjLiBOb3RlIHRoYXQgdW5saWtlIG90aGVyIHN5bWJvbCByZW5hbWluZywKICAgICAgICAgICAgcGFyYW1ldGVyIHJlbmFtaW5nIGRvZXMgbm90IGlzc3VlIGEgd2FybmluZyB3aGVuIHRoZSBwYXJhbWV0ZXIgaXMgcmVuYW1lZC4gVGhpcwogICAgICAgICAgICBjaGFuZ2Ugb25seSBhZmZlY3RzIGxhbmd1YWdlcyB3aGVyZSB0aGUgcGFyYW1ldGVyIG5hbWVzIGFyZSBhY3R1YWxseSB1c2VkLCBmb3IgZXhhbXBsZSwKICAgICAgICAgICAgSmF2YSBmdW5jdGlvbiBwYXJhbWV0ZXIgbGlzdHMgaW4gdGhlIHByb3h5IGNsYXNzIG9yIFB5dGhvbiBkb2N1bWVudGF0aW9uIGNvbW1lbnRzLgoKMjAxOS0wMS0xODogd3NmdWx0b24KICAgICAgICAgICAgIzE0MjAgRml4IGdkYiBkZWJ1Z2dlciBmdW5jdGlvbnMgJ3N3aWdwcmludCcgYW5kICdsb2Nzd2lncHJpbnQnIGZyb20gc3dpZy5nZGIgdG8KICAgICAgICAgICAgd29yayB3aXRoIG5ld2VyIHZlcnNpb25zIG9mIGdkYi04LiBGaXhlcyBlcnJvcnMgd2hlbiBkZWJ1Z2dpbmcgU1dJRyBzb3VyY2Ugd2l0aCBnZGI6CgogICAgICAgICAgICAgIChnZGIpIHN3aWdwcmludCBuCiAgICAgICAgICAgICAgVW5kZWZpbmVkIGNvbW1hbmQ6ICJQcmludGYiLiAgVHJ5ICJoZWxwIi4KCjIwMTktMDEtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIFB5dGhvbiBzdGF0aWMgbWV0aG9kIHdyYXBwZXIgY2hhbmdlcwoKICAgICAgICAgICAgLSBTdGF0aWMgbWV0aG9kIHdyYXBwZXJzIHdlcmUgdXNpbmcgdGhlICdmYXN0cHJveHknIGFwcHJvYWNoIGJ5IGRlZmF1bHQuCiAgICAgICAgICAgICAgVGhpcyBpcyBpbmNvbnNpc3RlbnQgd2l0aCBpbnN0YW5jZSBtZXRob2Qgd3JhcHBlcnMuIFRoZSBmYXN0cHJveHkgYXBwcm9hY2gKICAgICAgICAgICAgICBpcyBub3cgdHVybmVkIG9mZiBieSBkZWZhdWx0IHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBpbnN0YW5jZSBtZXRob2RzLgogICAgICAgICAgICAgIFN0YXRpYyBtZXRob2Qgd3JhcHBlcnMgY2FuIG5vdyBhbHNvIGJlIGNvbnRyb2xsZWQgdXNpbmcgdGhlIC1mYXN0cHJveHkgYW5kCiAgICAgICAgICAgICAgLW9sZGRlZnMgb3B0aW9ucy4KCiAgICAgICAgICAgICAgRXhhbXBsZToKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgS2xhc3MgewogICAgICAgICAgICAgICAgICBzdGF0aWMgaW50IHN0YXRtZXRob2QoaW50IGEgPSAyKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgIGdlbmVyYXRlcyBieSBkZWZhdWx0OgoKICAgICAgICAgICAgICBjbGFzcyBLbGFzcyhvYmplY3QpOgogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgQHN0YXRpY21ldGhvZAogICAgICAgICAgICAgICAgICBkZWYgc3RhdG1ldGhvZChhPTIpOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9leGFtcGxlLktsYXNzX3N0YXRtZXRob2QoYSkKCiAgICAgICAgICAgICAgaW5zdGVhZCBvZiB0aGUgZm9sbG93aW5nICh3aGljaCBjYW4gYmUgcmVzdG9yZWQgYnkgdXNpbmcgLWZhc3Rwcm94eSk6CgogICAgICAgICAgICAgICAgY2xhc3MgS2xhc3Mob2JqZWN0KToKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIHN0YXRtZXRob2QgPSBzdGF0aWNtZXRob2QoX2V4YW1wbGUuS2xhc3Nfc3RhdG1ldGhvZCkKCiAgICAgICAgICAgICAgLSBNb2Rlcm5pc2Ugd3JhcHBlcnMgZm9yIHN0YXRpYyBtZXRob2RzIHRvIHVzZSBkZWNvcmF0b3Igc3ludGF4IC0gQHN0YXRpY21ldGhvZC4KCiAgICAgICAgICAgICAgLSBBZGQgbWlzc2luZyBydW50aW1lIHRlc3QgZm9yIHN0YXRpYyBjbGFzcyBtZXRob2RzIGFuZCB1c2luZyB0aGUgYWN0dWFsIGNsYXNzIG1ldGhvZC4KCjIwMTktMDEtMTI6IFphY2tlcnlTcHl0egogICAgICAgICAgICBbT0NhbWxdICMxNDAzICMxMTk0IEZpeCBjb21waWxhdGlvbiBwcm9ibGVtcyBmb3IgT0NhbWwgPj0gNC4wMy4wIGR1ZSB0byBPQ2FtbCB1c2luZwogICAgICAgICAgICBpbnQ2NF90IGluc3RlYWQgb2YgaW50NjQuCgoyMDE5LTAxLTExOiBaYWNrZXJ5U3B5dHoKICAgICAgICAgICAgW09DYW1sXSAjMTQwMCBGaXggdGhlIGdldHRlcnMgYW5kIHNldHRlcnMgb2Ygbm9uLXN0YXRpYyBtZW1iZXIgdmFyaWFibGVzLgoKMjAxOS0wMS0wNzogd3NmdWx0b24KICAgICAgICAgICAgIzM1OCBBZGQgVk9JRCB0byB3aW5kb3dzLmkKCjIwMTktMDEtMDU6IHdzZnVsdG9uCiAgICAgICAgICAgICM5NDggIzEwMTkgIzEyNzMgRml4IGZvciBDKysxMSByYXcgc3RyaW5ncyB3aGVyZSB0aGUgZGVsaW1pdGVycyB3ZXJlIG1pc3Rha2VubHkgbGVmdAogICAgICAgICAgICBpbiB0aGUgc3RyaW5nIGNvbnRlbnRzIGluIHNpdHVhdGlvbnMgd2hlcmUgdGhlIHN0cmluZyB3YXMgY29waWVkIGludG8gZ2VuZXJhdGVkIGNvZGUuCiAgICAgICAgICAgIEZvciBleGFtcGxlLCAlY29uc3RhbnQsIHRoZSAiZG9jc3RyaW5nIiBmZWF0dXJlIGFuZCBmb3IgQyMvSmF2YS9EIGNvbnN0YW50cyB0dXJuZWQgb24KICAgICAgICAgICAgd2l0aCAlamF2YWNvbnN0LyVjc2NvbnN0LyVkbWFuaWZlc3Rjb25zdC4KCjIwMTktMDEtMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSAjNTM4LiBGaXggUnVieSBzdXBwb3J0IGZvciAlZmVhdHVyZSgiZG9jc3RyaW5nIikuCgoyMDE5LTAxLTAzOiB3c2Z1bHRvbgogICAgICAgICAgICAjMTIwMiBGaXggb3ZlcmxvYWRpbmcgb2Ygbm9uLXBvaW50ZXIgY2xhc3MgdHlwZXMgaW4gc2NyaXB0aW5nIGxhbmd1YWdlcyB3aGVuIG92ZXJsb2FkZWQKICAgICAgICAgICAgd2l0aCBhIHBvaW50ZXIgYW5kIGEgTlVMTCBzY3JpcHRpbmcgbGFuZ3VhZ2UgZXF1aXZhbGVudCBpcyB1c2VkLCBlZyBOb25lIGluIFB5dGhvbi4KCiAgICAgICAgICAgIFRoZSBpbXBsZW1lbnRhdGlvbiBjaGFuZ2VzIHRoZSBTV0lHVFlQRSwgU1dJR1RZUEUmIGFuZCBTV0lHVFlQRSYmIHR5cGVjaGVjayB0eXBlbWFwcyB0bwogICAgICAgICAgICBwcmV2ZW50IGFjY2VwdGluZyBhIGNvbnZlcnNpb24gdG8gYSBOVUxMIHBvaW50ZXIuCgoyMDE5LTAxLTAzOiBaYWNrZXJ5U3B5dHoKICAgICAgICAgICAgW09DYW1sXSAjMTM4NiBGaXggdGhlIE9DYW1sIGV4YW1wbGVzIGFuZCB0ZXN0IHN1aXRlIGZvciBvdXQtb2Ytc291cmNlIGJ1aWxkcy4KCjIwMTktMDEtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICM2MzkgcmVtb3ZlIGR1cGxpY2F0ZSBwcm94eSBtZXRob2QgZGVmaW5pdGlvbnMgZm9yIGdsb2JhbCBmdW5jdGlvbiB3cmFwcGVycy4KCiAgICAgICAgICAgIEdsb2JhbCBmdW5jdGlvbnMgcHJldmlvdXNseSBnZW5lcmF0ZWQgdHdvIGRlZmluaXRpb25zLCBlZzoKCiAgICAgICAgICAgICAgZGVmIGZvbygpOgogICAgICAgICAgICAgICAgICByZXR1cm4gX2V4YW1wbGUuZm9vKCkKICAgICAgICAgICAgICBmb28gPSBfZXhhbXBsZS5mb28KCiAgICAgICAgICAgIFRoZSBmaXJzdCBkZWZpbml0aW9uIGlzIHJlcGxhY2VkIGJ5IHRoZSBzZWNvbmQgZGVmaW5pdGlvbiBhbmQgc28gdGhlIHNlY29uZCBkZWZpbml0aW9uCiAgICAgICAgICAgIGlzIHRoZSBvbmUgdXNlZCB3aGVuIHRoZSBtZXRob2QgaXMgYWN0dWFsbHkgY2FsbGVkLiBOb3cganVzdCB0aGUgZmlyc3QgZGVmaW5pdGlvbiBpcwogICAgICAgICAgICBnZW5lcmF0ZWQgYnkgZGVmYXVsdCBhbmQgaWYgdGhlIC1mYXN0cHJveHkgY29tbWFuZCBsaW5lIG9wdGlvbiBpcyB1c2VkLCBqdXN0IHRoZSBzZWNvbmQKICAgICAgICAgICAgZGVmaW5pdGlvbiBpcyBnZW5lcmF0ZWQuIFRoZSBzZWNvbmQgZGVmaW5pdGlvbiBpcyBmYXN0ZXIgYXMgaXQgYXZvaWRzIHRoZSBwcm94eSBQeXRob24KICAgICAgICAgICAgbWV0aG9kIGFzIGl0IGNhbGxzIHRoZSBsb3ctbGV2ZWwgQyB3cmFwcGVyIGRpcmVjdGx5LiBVc2luZyBib3RoIC1mYXN0cHJveHkgYW5kIC1vbGRkZWZzCiAgICAgICAgICAgIGNvbW1hbmQgbGluZSBvcHRpb25zIHdpbGwgcmVzdG9yZSB0aGUgcHJldmlvdXNseSBnZW5lcmF0ZWQgY29kZSBhcyBpdCB3aWxsIGdlbmVyYXRlIGJvdGgKICAgICAgICAgICAgbWV0aG9kIGRlZmluaXRpb25zLgoKICAgICAgICAgICAgV2l0aCB0aGlzIGNoYW5nZSwgdGhlIHdyYXBwZXJzIGZvciBnbG9iYWwgQy9DKysgZnVuY3Rpb25zIGFuZCBDKysgY2xhc3MgbWV0aG9kcyBub3cgd29yawogICAgICAgICAgICBpbiB0aGUgc2FtZSB3YXkgd3J0IHRvIGdlbmVyYXRpbmcganVzdCBhIHByb3h5IG1ldGhvZCBieSBkZWZhdWx0IGFuZCBjb250cm9sIHZpYQogICAgICAgICAgICAtZmFzdHByb3h5Ly1vbGRkZWZzIG9wdGlvbnMuCgoyMDE4LTEyLTIwOiBoYXNpbm9mZix3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gIzEzMzQgU2V0IEphdmEgdGhyZWFkIG5hbWUgdG8gbmF0aXZlIHRocmVhZCBuYW1lIHdoZW4gdXNpbmcgZGlyZWN0b3JzLgoKICAgICAgICAgICAgRGVmYXVsdCBpcyB0byB1c2UgbmFtZSAiVGhyZWFkLVhYWCIgYW5kIGlzIHN0aWxsIHdvcmtzIGxpa2UgdGhpcyBieSBkZWZhdWx0LiBIb3dldmVyLAogICAgICAgICAgICBhZGRpbmcgdGhlIGZvbGxvd2luZyB3aWxsIHR1cm4gb24gdGhlIHRocmVhZCBuYW1lIHNldHRpbmcgKHdvcmtzIGZvciBtb3JlIHJlY2VudAogICAgICAgICAgICB2ZXJzaW9ucyBvZiBMaW51eCBhbmQgTWFjT1MpOgoKICAgICAgICAgICAgJWJlZ2luICV7CiAgICAgICAgICAgICNkZWZpbmUgU1dJR19KQVZBX1VTRV9USFJFQURfTkFNRQogICAgICAgICAgICAlfQoKMjAxOC0xMi0yMDogY2hsYW5kc2kKICAgICAgICAgICAgW1B5dGhvbl0gIzEzNTcuIEZpeCBvdmVycmlkaW5nIF9fbmV3X18gaW4gUHl0aG9uIDMuNi4KCiAgICAgICAgICAgIEZpeGVzIFN5c3RlbUVycm9yOiBPYmplY3RzL3R1cGxlb2JqZWN0LmM6ODE6IGJhZCBhcmd1bWVudCB0byBpbnRlcm5hbCBmdW5jdGlvbiIKCjIwMTgtMTItMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICM4NDggIzEzNDMgVGhlIG1vZHVsZSBpbXBvcnQgbG9naWMgaGFzIGNoYW5nZWQgdG8gc3RvcCBvYmZ1c2NhdGluZyByZWFsIEltcG9ydEVycm9yCiAgICAgICAgICAgIHByb2JsZW1zLiBPbmx5IG9uZSBpbXBvcnQgb2YgdGhlIGxvdy1sZXZlbCBDL0MrKyBtb2R1bGUgZnJvbSB0aGUgcHVyZSBQeXRob24gbW9kdWxlIGlzCiAgICAgICAgICAgIGF0dGVtcHRlZCBub3cuIFByZXZpb3VzbHkgYSBzZWNvbmQgaW1wb3J0IG9mIHRoZSBsb3ctbGV2ZWwgQy9DKysgbW9kdWxlIHdhcyBhdHRlbXB0ZWQKICAgICAgICAgICAgYWZ0ZXIgYW4gSW1wb3J0RXJyb3Igb2NjdXJyZWQgYW5kIHdhcyBkb25lIHRvIHN1cHBvcnQgJ3NwbGl0IG1vZHVsZXMnLiBBICdzcGxpdCBtb2R1bGUnIGlzCiAgICAgICAgICAgIGEgY29uZmlndXJhdGlvbiB3aGVyZSB0aGUgcHVyZSBQeXRob24gbW9kdWxlIGlzIGEgbW9kdWxlIHdpdGhpbiBhIFB5dGhvbiBwYWNrYWdlIGFuZCB0aGUKICAgICAgICAgICAgbG93LWxldmVsIEMvQysrIG1vZHVsZSBpcyBhIGdsb2JhbCBQeXRob24gbW9kdWxlLiBOb3cgYSAnc3BsaXQgbW9kdWxlJyBjb25maWd1cmF0aW9uIGlzCiAgICAgICAgICAgIG5vIGxvbmdlciBzdXBwb3J0ZWQgYnkgZGVmYXVsdC4gVGhpcyBjb25maWd1cmF0aW9uIGNhbiBiZSBzdXBwb3J0ZWQgd2l0aCBhIHNpbXBsZQogICAgICAgICAgICBjdXN0b21pemF0aW9uLCBzdWNoIGFzOgoKICAgICAgICAgICAgICAlbW9kdWxlKHBhY2thZ2U9Im15cGFja2FnZSIsIG1vZHVsZWltcG9ydD0iaW1wb3J0ICRtb2R1bGUiKSBmb28KCiAgICAgICAgICAgIG9yIGlmIHVzaW5nIC1idWlsdGluOgoKICAgICAgICAgICAgICAlbW9kdWxlKHBhY2thZ2U9Im15cGFja2FnZSIsIG1vZHVsZWltcG9ydD0iZnJvbSAkbW9kdWxlIGltcG9ydCAqIikgZm9vCgogICAgICAgICAgICBpbnN0ZWFkIG9mCgogICAgICAgICAgICAgICVtb2R1bGUocGFja2FnZT0ibXlwYWNrYWdlIikgZm9vCgogICAgICAgICAgICBTZWUgdGhlIHVwZGF0ZWQgUHl0aG9uIGNoYXB0ZXIgdGl0bGVkICJMb2NhdGlvbiBvZiBtb2R1bGVzIiBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KCjIwMTgtMTItMTE6IHRsYnkKICAgICAgICAgICAgW1BlcmxdICMxMzc0IHJlcGFpciBFWFRFTkQoKSBoYW5kbGluZyBpbiB0eXBlbWFwcwoKMjAxOC0xMi0wNjogdmFkegogICAgICAgICAgICAjMTM1OSAjMTM2NCBBZGQgbWlzc2luZyBuZXN0ZWQgY2xhc3MgZGVzdHJ1Y3RvciB3cmFwcGVyIHdoZW4gdGhlIG5lc3RlZCBjbGFzcyBpcwogICAgICAgICAgICBpbnNpZGUgYSB0ZW1wbGF0ZS4gUmVtb3ZlcyBhc3NvY2lhdGVkIGJvZ3VzICdJbGxlZ2FsIGRlc3RydWN0b3IgbmFtZScgd2FybmluZy4gT25seQogICAgICAgICAgICBvY2N1cnJlZCB3aGVuIHRoZSBuZXN0ZWQgY2xhc3MnIGRlc3RydWN0b3IgaXMgZXhwbGljaXRseSBzcGVjaWZpZWQuCgoyMDE4LTEyLTA0OiBhZHIyNgogICAgICAgICAgICBbUHl0aG9uXSAjMTM2OCAjMTM2OSBBY2Nlc3MgVmlvbGF0aW9uIGluIHRwX3ByaW50IGNhdXNlZCBieSBtaXNtYXRjaGVkIFB5dGhvbi9leHRlbnNpb24KICAgICAgICAgICAgQ1JUIHVzYWdlCgogICAgICAgICAgICBSZW1vdmUgYWxsIHVzZSBvZiB0cF9wcmludCwgYXMgdGhpcyBBUEkgdXNlcyBhIEZJTEUqLCB3aGljaCBjYW4gYmUKICAgICAgICAgICAgbWlzbWF0Y2hlZCB3aGVuIG1vZHVsZXMgYXJlIGJ1aWx0IHdpdGggZGlmZmVyZW50IEMgbGlicmFyaWVzIGZyb20KICAgICAgICAgICAgdGhlIG1haW4gcHl0aG9uIGV4ZWN1dGFibGUuCgogICAgICAgICAgICBUaGlzIGNoYW5nZSBhbHNvIGJyaW5ncyBjb25zaXN0ZW50IG91dHB1dCBiZXR3ZWVuIFB5dGhvbiAyIGFuZCAzIGZvciB0aGUgJ2N2YXInIFNXSUcKICAgICAgICAgICAgb2JqZWN0ICh0aGF0IGNvbnRhaW5zIHRoZSBnbG9iYWwgdmFyaWFibGVzKSBhbmQgU1dJRyBwYWNrZWQgb2JqZWN0cyAoc3VjaCBhcyBjYWxsYmFjawogICAgICAgICAgICBjb25zdGFudHMpLgoKMjAxOC0xMi0wNDogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gIzEyODIgRml4IHJ1bm5pbmcgJ3B5dGhvbiAtbScgIHdoZW4gdXNpbmcgJ3N3aWcgLWJ1aWx0aW4nCgogICAgICAgICAgICBTaW1pbGFyIHRvIHRoZSBlYXJsaWVyIFBFUCAzNjYgY29uZm9ybWluZyBmaXggZm9yIG5vbi1idWlsdGluLgoKMjAxOC0xMS0yOTogYWRyMjYKICAgICAgICAgICAgW1B5dGhvbl0gIzEzNjAgTGVhayBvZiBTV0lHIHZhciBsaW5rIG9iamVjdAoKICAgICAgICAgICAgRml4IHJlZmVyZW5jZSBjb3VudGluZyBvbiBfU1dJR19nbG9iYWxzIHRvIGFsbG93IHZhciBsaW5rIHRvIGJlIGZyZWVkIG9uIG1vZHVsZSB1bmxvYWQuCgoyMDE4LTExLTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBXaGVuIHVzaW5nIC1idWlsdGluLCB0aGUgdHdvIHN0ZXAgQy1leHRlbnNpb24gbW9kdWxlIGltcG9ydCBpcyBub3cKICAgICAgICAgICAgb25lIHN0ZXAgYW5kIHRoZSB3cmFwcGVkIEFQSSBpcyBvbmx5IGF2YWlsYWJsZSBvbmNlIGFuZCBub3QgaW4gYW4gdW5kZXJseWluZwogICAgICAgICAgICBtb2R1bGUgYXR0cmlidXRlIGxpa2UgaXQgaXMgd2l0aG91dCAtYnVpbHRpbi4gVG8gdW5kZXJzdGFuZCB0aGlzLCBjb25zaWRlciBhCiAgICAgICAgICAgIG1vZHVsZSBuYW1lZCAnZXhhbXBsZScgKHVzaW5nOiAlbW9kdWxlIGV4YW1wbGUpLiBUaGUgQy1leHRlbnNpb24gaXMgY29tcGlsZWQgaW50bwogICAgICAgICAgICBhIFB5dGhvbiBtb2R1bGUgY2FsbGVkICdfZXhhbXBsZScgYW5kIGEgcHVyZSBQeXRob24gbW9kdWxlIHByb3ZpZGVzIHRoZSBhY3R1YWwKICAgICAgICAgICAgQVBJIGZyb20gdGhlIG1vZHVsZSBjYWxsZWQgJ2V4YW1wbGUnLiBJdCB3YXMgcHJldmlvdXNseSBwb3NzaWJsZSB0byBhZGRpdGlvbmFsbHkKICAgICAgICAgICAgYWNjZXNzIHRoZSBBUEkgZnJvbSB0aGUgbW9kdWxlIGF0dHJpYnV0ZSAnZXhhbXBsZS5fZXhhbXBsZScuIFRoZSBsYXR0ZXIgd2FzIGFuCiAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGRldGFpbCBhbmQgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZS4gSXQgc2hvdWxkbid0IGhhdmUgYmVlbiB1c2VkLCBidXQKICAgICAgICAgICAgaWYgbmVjZXNzYXJ5IGl0IGNhbiBiZSByZXN1cnJlY3RlZCB1c2luZyB0aGUgbW9kdWxlaW1wb3J0IGF0dHJpYnV0ZSBkZXNjcmliZWQgaW4gdGhlCiAgICAgICAgICAgIFB5dGhvbiBjaGFwdGVyIG9mIHRoZSBkb2N1bWVudGF0aW9uLiBJZiBib3RoIG1vZHVsZXMgYXJlIHByb3ZpZGVkIGluIGEgUHl0aG9uCiAgICAgICAgICAgIHBhY2thZ2UsIHRyeToKCiAgICAgICAgICAgICAgJW1vZHVsZShtb2R1bGVpbXBvcnQ9ImZyb20gLiBpbXBvcnQgX2V4YW1wbGVcbmZyb20gLl9leGFtcGxlIGltcG9ydCAqIikgZXhhbXBsZQogICAgICAgICAgICBvciBtb3JlIGdlbmVyaWNhbGx5OgogICAgICAgICAgICAgICVtb2R1bGUobW9kdWxlaW1wb3J0PSJmcm9tIC4gaW1wb3J0ICRtb2R1bGVcbmZyb20gLiRtb2R1bGUgaW1wb3J0ICoiKSBleGFtcGxlCgogICAgICAgICAgICBhbmQgaWYgYm90aCBhcmUgcHJvdmlkZWQgYXMgZ2xvYmFsIG1vZHVsZXMsIHRyeToKCiAgICAgICAgICAgICAgJW1vZHVsZShtb2R1bGVpbXBvcnQ9ImltcG9ydCBfZXhhbXBsZVxuZnJvbSBfZXhhbXBsZSBpbXBvcnQgKiIpIGV4YW1wbGUKICAgICAgICAgICAgb3IgbW9yZSBnZW5lcmljYWxseToKICAgICAgICAgICAgICAlbW9kdWxlKG1vZHVsZWltcG9ydD0iaW1wb3J0ICRtb2R1bGVcbmZyb20gJG1vZHVsZSBpbXBvcnQgKiIpIGV4YW1wbGUKCiAgICAgICAgICAgIFRoZSBtb2R1bGUgaW1wb3J0IGNvZGUgc2hvd24gd2lsbCBhcHBlYXIgaW4gdGhlIGV4YW1wbGUucHkgZmlsZS4KCjIwMTgtMTEtMjQ6IHZhZHoKICAgICAgICAgICAgIzEzNTggRml4IGhhbmRsaW5nIG9mIGFic3RyYWN0IGJhc2UgY2xhc3NlcyBuZXN0ZWQgaW5zaWRlIHRlbXBsYXRlcwoKICAgICAgICAgICAgQ29ycmVjdCBkZXRlY3Rpbmcgb2Ygd2hldGhlciBhIGRlcml2ZWQgY2xhc3MgbWV0aG9kIG92ZXJyaWRlcyBhIHB1cmUgdmlydHVhbAogICAgICAgICAgICBiYXNlIGNsYXNzIG1ldGhvZCB3aGVuIGJvdGggY2xhc3NlcyBhcmUgbmVzdGVkIGluc2lkZSBhIHRlbXBsYXRlIGNsYXNzOiB0aGlzCiAgICAgICAgICAgIG5vdGFibHkgZGlkbid0IHdvcmsgY29ycmVjdGx5IGZvciBtZXRob2RzIHRha2luZyBwYXJhbWV0ZXJzIG9mIHRoZSBiYXNlIGNsYXNzCiAgICAgICAgICAgIHR5cGUuCgoyMDE4LTExLTIyOiBydXBlcnRuYXNoCiAgICAgICAgICAgIFtQeXRob25dICMxMjgyIE1ha2UgZ2VuZXJhdGVkIG1vZHVsZSBydW5uYWJsZSB2aWEgcHl0aG9uIC1tIChQRVAgMzY2IGNvbmZvcm1pbmcpCgogICAgICAgICAgICBQcmV2aW91c2x5IGFueSBTV0lHIGdlbmVyYXRlZCBtb2R1bGVzIGluIGEgcGFja2FnZSB3b3VsZCBmYWlsIHdpdGggYW4gSW1wb3J0RXJyb3IKICAgICAgICAgICAgd2hlbiB1c2luZyAncHl0aG9uIC1tJyBmb3IgZXhhbXBsZSAncHl0aG9uIC1tIG15cGtnLm15bW9kdWxlJy4KCiAgICAgICAgICAgIFRoaXMgZml4IGFsc28gYWxsb3dzIHRoZSBTV0lHIGdlbmVyYXRlZCBtb2R1bGUgdG8gYmUgcGxhY2VkIGludG8gYSBkaXJlY3RvcnkgYW5kCiAgICAgICAgICAgIHRoZW4gcmVuYW1lZCBfX2luaXRfXy5weSB0byBjb252ZXJ0IHRoZSBtb2R1bGUgaW50byBhIHBhY2thZ2UgYWdhaW4uIFRoaXMgYWJpbGl0eQogICAgICAgICAgICBzdG9wcGVkIHdvcmtpbmcgaW4gc3dpZy0zLjAuOS4gSG93ZXZlciwgb25seSBQeXRob24gMi43IG9yIDMuMyBhbmQgbGF0ZXIgd29yay4gSWYKICAgICAgICAgICAgUHl0aG9uIDMuMiBzdXBwb3J0IGlzIG5lZWRlZCwgdXNlIG1vZHVsZWltcG9ydCBpbiAlbW9kdWxlIHRvIGN1c3RvbWlzZSB0aGUgaW1wb3J0CiAgICAgICAgICAgIGNvZGUuCgoyMDE4LTExLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICAjMTM0MCBSZW1vdmUgLWNwcGNhc3QgYW5kIC1ub2NwcGNhc3QgY29tbWFuZCBsaW5lIG9wdGlvbnMgKHRoaXMgd2FzIGFuIG9wdGlvbgogICAgICAgICAgICBhdmFpbGFibGUgdG8gdGhlIHNjcmlwdGluZyBsYW5ndWFnZSB0YXJnZXRzKS4KCiAgICAgICAgICAgIFRoZSAtY3BwY2FzdCBvcHRpb24gaXMgc3RpbGwgdHVybmVkIG9uIGJ5IGRlZmF1bHQuIFRoZSAtbm9jcHBjYXN0IG9wdGlvbgogICAgICAgICAgICB0byB0dXJuIG9mZiB0aGUgdXNlIG9mIGMrKyBjYXN0cyAoY29uc3RfY2FzdCwgc3RhdGljX2Nhc3QgZXRjKSBoYXMgYmVlbgogICAgICAgICAgICByZW1vdmVkLiBIb3dldmVyLCBkZWZpbmluZyBTV0lHX05PX0NQTFVTUExVU19DQVNUIHdpbGwgc3RpbGwgZ2VuZXJhdGUgQyBjYXN0cwogICAgICAgICAgICBpbnN0ZWFkIG9mIEMrKyBjYXN0cyBmb3IgQysrIHdyYXBwZXJzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE4LTExLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjMTM0MCBSZW1vdmUgLW91dHB1dHR1cGxlIGFuZCAtbm9vdXRwdXR0dXBsZSBjb21tYW5kIGxpbmUgb3B0aW9ucy4KCiAgICAgICAgICAgIEJvdGggdGhlIGNvbW1hbmQgbGluZSBhbmQgJW1vZHVsZSBvcHRpb25zIG9mIHRoZSBzYW1lIG5hbWUgaGF2ZSBiZWVuCiAgICAgICAgICAgIHJlbW92ZWQuIFRoZXNlIHdlcmUgdW5kb2N1bWVudGVkLiBUaGUgLW91dHB1dHR1cGxlIG9wdGlvbiByZXR1cm5lZCBhCiAgICAgICAgICAgIFB5dGhvbiB0dXBsZSBpbnN0ZWFkIG9mIGEgbGlzdCwgbW9zdGx5IHR5cGljYWxseSBpbiB0aGUgT1VUUFVUCiAgICAgICAgICAgIHR5cGVtYXAgaW1wbGVtZW50YXRpb25zLgoKICAgICAgICAgICAgSXQgdW5jbGVhciB3aHkgYSB0dXBsZSBpbnN0ZWFkIG9mIGEgbGlzdCByZXR1cm4gdHlwZSBpcyBuZWVkZWQgYW5kCiAgICAgICAgICAgIGhlbmNlIHRoaXMgb3B0aW9uIGhhcyBiZWVuIHJlbW92ZWQgYXMgcGFydCBvZiB0aGUgc2ltcGxpZmljYXRpb24gb2YKICAgICAgICAgICAgdGhlIFNXSUcgUHl0aG9uIGNvbW1hbmQgbGluZSBvcHRpb25zIGZvciBTV0lHIDQuCgoyMDE4LTExLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjMTM0MCBSZW1vdmUgLW5vcHJveHlpbXBvcnQgY29tbWFuZCBsaW5lIG9wdGlvbi4KCiAgICAgICAgICAgIFRoaXMgb3B0aW9uIHR1cm5lZCBvZmYgdGhlIGluc2VydGlvbiBvZiBQeXRob24gaW1wb3J0IHN0YXRlbWVudHMKICAgICAgICAgICAgZGVyaXZlZCBmcm9tIGEgJWltcG9ydCBkaXJlY3RpdmUuIEZvciBleGFtcGxlIGdpdmVuOgoKICAgICAgICAgICAgICAlbW9kdWxlIG1vZHVsZV9iCiAgICAgICAgICAgICAgJWltcG9ydCAibW9kdWxlX2EuaSIKCiAgICAgICAgICAgIHRoZW4gbW9kdWxlX2IucHkgd2lsbCBjb250YWluOgoKICAgICAgICAgICAgICBpbXBvcnQgbW9kdWxlX2EKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxOC0xMC0yOTogQWxleGFuZGVyR2FicmllbAoJICAgIFtQSFBdIFRoZSBmb2xsb3dpbmcgUEhQNyByZXNlcnZlZCBrZXl3b3JkcyBhcmUgbm93IG9ubHkgcmVuYW1lZCBieQoJICAgIFNXSUcgd2hlbiB1c2VkIGFzIGZ1bmN0aW9uIG5hbWVzIGluIHRoZSBBUEkgYmVpbmcgd3JhcHBlcjoKCSAgICBfX2hhbHRfY29tcGlsZXIgYXJyYXkgZGllIGVjaG8gZW1wdHkgZXZhbCBleGl0IGluY2x1ZGUgaW5jbHVkZV9vbmNlCgkgICAgaXNzZXQgbGlzdCBwcmludCByZXF1aXJlIHJlcXVpcmVfb25jZSByZXR1cm4gdW5zZXQKCjIwMTgtMTAtMjI6IG9sbHksd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gIzEyNjEgIzEzNDAgVHVybiBvbiBtYW55IG9wdGltaXNhdGlvbiBvcHRpb25zIGJ5IGRlZmF1bHQgYW5kIHJhdGlvbmFsaXNlIHRoZQogICAgICAgICAgICBudW1iZXIgb2YgY29tbWFuZCBsaW5lIG9wdGlvbnMuCgogICAgICAgICAgICBUaGVyZSB3ZXJlIGFuIHVubmVjZXNzYXJ5IG51bWJlciBvZiBjb21tYW5kIGxpbmUgb3B0aW9ucyBhbmQgbWFueSBvZiB0aGVzZSBoYXZlIG5vdwogICAgICAgICAgICBiZWVuIHJlbW92ZWQgaW4gYSBkcml2ZSBmb3Igc2ltcGxpZmljYXRpb24uIFNvbWUgd2VyZSBuZWVkZWQgdG8gc3VwcG9ydCBvbGRlciB2ZXJzaW9ucwogICAgICAgICAgICBvZiBQeXRob24gKDIuNiBhbmQgZWFybGllcikuCgogICAgICAgICAgICBNYW55IG9mIHRoZSBvcHRpb25zIGNvdWxkIGJlIHR1cm5lZCBvbiBpbmRpdmlkdWFsbHkgYW5kIHdoZW4gdXNpbmcgLU8uIFByZXZpb3VzbHkgLU8KICAgICAgICAgICAgcmVzdWx0ZWQgaW4gdHVybmluZyBvbiBhIHNldCBvZiBvcHRpb25zOgoKICAgICAgICAgICAgICAtbW9kZXJuIC1mYXN0ZGlzcGF0Y2ggLW5vc2FmZWNzdHJpbmdzIC1mdmlydHVhbCAtbm9wcm94eWRlbAogICAgICAgICAgICAgIC1mYXN0cHJveHkgLWZhc3Rpbml0IC1mYXN0dW5wYWNrIC1mYXN0cXVlcnkgLW1vZGVybmFyZ3MgLW5vYnVpbGRub25lCgogICAgICAgICAgICBOb3cgLU8gcmVzdWx0cyBpbiB0dXJuaW5nIG9uIHRoaXMgcmVkdWNlZCBzZXQ6CgogICAgICAgICAgICAgIC1mYXN0ZGlzcGF0Y2ggLWZhc3Rwcm94eSAtZnZpcnR1YWwKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgbm93IG9uIGJ5IGRlZmF1bHQsIGEgZGVwcmVjYXRlZCB3YXJuaW5nIGlzIGRpc3BsYXllZCBpZiB0aGV5CiAgICAgICAgICAgIGFyZSB1c2VkOgogICAgICAgICAgICAgIC1mYXN0aW5pdCAgICAgQ2xhc3MgaW5pdGlhbGlzYXRpb24gY29kZSBkb25lIGluIEMvQysrIHJhdGhlciB0aGFuIGluIFB5dGhvbiBjb2RlLgogICAgICAgICAgICAgIC1mYXN0cXVlcnkgICAgUHl0aG9uIGRpY3Rpb25hcnkgdXNlZCBmb3IgbG9va3VwIG9mIHR5cGVzLgogICAgICAgICAgICAgIC1mYXN0dW5wYWNrICAgRmFzdGVyIHVucGFja2luZyBvZiBmdW5jdGlvbiBhcmd1bWVudHMgaW4gQy9DKysgd3JhcHBlcnMuCiAgICAgICAgICAgICAgLW1vZGVybiAgICAgICBVc2UgUHl0aG9uIDIuMyBmZWF0dXJlcyBzdWNoIGFzIG9iamVjdCBhbmQgcHJvcGVydHkuCiAgICAgICAgICAgICAgLW1vZGVybmFyZ3MgICBVc2UgUHl0aG9uIDIuMyBDIEFQSXMgZm9yIHVucGFja2luZyBhcmd1bWVudHMgaW4gdHVwbGVzLgogICAgICAgICAgICAgIC1ub3Byb3h5ZGVsICAgU3RvcCBnZW5lcmF0aW5nIGEgcHJveHkgX19kZWxfXyBtZXRob2QgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmxpdHkuCiAgICAgICAgICAgICAgLXNhZmVjc3RyaW5ncyBObyBkaXNjZXJuYWJsZSBkaWZmZXJlbmNlCgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIG9wdGlvbnMgaGF2ZSBiZWVuIHJlbW92ZWQgYWx0b2dldGhlcjoKICAgICAgICAgICAgICAtYWxpYXNvYmowCiAgICAgICAgICAgICAgLWJ1aWxkbm9uZQogICAgICAgICAgICAgIC1jbGFzc3B0cgogICAgICAgICAgICAgIC1uZXdfcmVwcgogICAgICAgICAgICAgIC1uZXdyZXByCiAgICAgICAgICAgICAgLW5vYWxpYXNvYmowCiAgICAgICAgICAgICAgLW5vYnVpbGRub25lCiAgICAgICAgICAgICAgLW5vY2FzdG1vZGUKICAgICAgICAgICAgICAtbm9kaXJ2dGFibGUKICAgICAgICAgICAgICAtbm9leHRyYW5hdGl2ZQogICAgICAgICAgICAgIC1ub2Zhc3Rpbml0CiAgICAgICAgICAgICAgLW5vZmFzdHByb3h5CiAgICAgICAgICAgICAgLW5vZmFzdHF1ZXJ5CiAgICAgICAgICAgICAgLW5vbW9kZXJuCiAgICAgICAgICAgICAgLW5vbW9kZXJuYXJncwogICAgICAgICAgICAgIC1ub291dHB1dHR1cGxlCiAgICAgICAgICAgICAgLW5vc2FmZWNzdHJpbmdzCiAgICAgICAgICAgICAgLW9sZF9yZXByCiAgICAgICAgICAgICAgLW9sZHJlcHIKICAgICAgICAgICAgICAtcHJveHlkZWwKCiAgICAgICAgICAgIC1uZXdfdndtIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuIFVzZSB0aGUgLW5ld3Z3bSBhbGlhcyBpbnN0ZWFkLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE4LTEwLTIyOiBvbGx5CiAgICAgICAgICAgIFtQeXRob25dICMxMjYxIFJlbW92ZSBjb21tYW5kIGxpbmUgb3B0aW9uIG5vIGxvbmdlciBuZWVkZWQgYXMgUHl0aG9uIDIuMyBhbmQgZWFybGllcgogICAgICAgICAgICBhcmUgbm8gbG9uZ2VyIHN1cHBvcnRlZDoKCiAgICAgICAgICAgICAgLWNsYXNzaWMKCjIwMTgtMTAtMDk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtELCBHbywgR3VpbGUsIEx1YSwgTXpzY2hlbWUsIE9jYW1sLCBQZXJsNSwgUGhwLCBTY2lsYWIsIFRjbF0KICAgICAgICAgICAgQWxsb3cgd3JhcHBpbmcgb2Ygc3RkOjptYXAgdXNpbmcgbm9uLWRlZmF1bHQgY29tcGFyaXNvbiBmdW5jdGlvbi4KCjIwMTgtMTAtMDk6IHZhZHoKICAgICAgICAgICAgW0phdmFdICMxMjc0IEFsbG93IHdyYXBwaW5nIG9mIHN0ZDo6bWFwIHVzaW5nIG5vbi1kZWZhdWx0IGNvbXBhcmlzb24gZnVuY3Rpb24uCgoyMDE4LTEwLTA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjMTEyNiBGaXggQyBkZWZhdWx0IGFyZ3VtZW50cyB3aXRoIC1idWlsdGluIGFuZCAtZmFzdHVucGFjayBhbmQgLW1vZGVybmFyZ3MuCiAgICAgICAgICAgIFByb2JsZW0gb2NjdXJyZWQgd2hlbiB0aGVyZSBpcyBqdXN0IG9uZSAoZGVmYXVsdGVkKSBwYXJhbWV0ZXIgaW4gdGhlIHBhcmFtZXRlciBsaXN0LgoKMjAxOC0wOS0yNDogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gIzEzMTkgQysrMTEgaGFzaCB0YWJsZXMgaW1wbGVtZW50YXRpb24gaXMgZmluaXNoZWQgbm93IChpbmNsdWRpbmcgZm9yIC1idWlsdGluKToKICAgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXAKICAgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQKICAgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9tdWx0aW1hcAogICAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX211bHRpc2V0CgoyMDE4LTA5LTIxOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggd2hlbiB1c2luZyAtYnVpbHRpbiBhbmQgd3JhcHBpbmcgc3RkOjptYXAsIHN0ZDo6c2V0LCBzdGQ6OnVub3JkZXJlZF9tYXAgb3IKICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0IHRvIGVuc3VyZSBfX2NvbnRhaW5zX18gaXMgY2FsbGVkLiBUaGlzIGlzIGEgd3JhcHBlciBmb3IgdGhlIFNUTAogICAgICAgICAgICBjb250YWluZXIncyBmaW5kIG1ldGhvZC4gV2l0aG91dCBpdCwgUHl0aG9uIHdpbGwgZG8gaXRzIG93biBzbG93ZXIgc2VxdWVuY2Ugc2VhcmNoLgoKMjAxOC0wOS0xOTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4IGZ1bmN0b3JzICh3cmFwcGVkIGFzIF9fY2FsbF9fKSB3aGVuIHVzaW5nIC1idWlsdGluIC1tb2Rlcm4gLWZhc3R1bnBhY2suCgoyMDE4LTA5LTAyOiBhbmRyZWFzLmdhZWVyLHRrcmFzbnVraGEKICAgICAgICAgICAgW1B5dGhvbl0gIzEzMjEgRml4IGFzc2VydCBpbiBQeVR1cGxlX0dFVF9TSVpFIGluIGRlYnVnIGludGVycHJldGVyIGJ1aWxkcyBvZiBweXRob24tMy43CiAgICAgICAgICAgIHdoZW4gY2FsbGluZyB0cF9uZXcuCgoyMDE4LTA5LTAxOiBDaHJpc3RvcGhlckhvZ2FuCiAgICAgICAgICAgIFtHdWlsZV0gIzEyODggRml4IGdhcmJhZ2UgY29sbGVjdGlvbiBmb3IgZ3VpbGUgPj0gMi4wLjEyLgoKMjAxOC0wOC0zMTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gIzEzMTkgQysrMTEgaGFzaCB0YWJsZXMgc3VwcG9ydDoKICAgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXAKICAgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQKICAgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9tdWx0aW1hcAogICAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX211bHRpc2V0CiAgICAgICAgICAgIGlzIG5vdyBjb21waWxpbmcgYW5kIHdvcmtpbmcgKHNvcnRpbmcgdXNpbmcgLWJ1aWx0aW4gbm90IGZ1bGx5IGZ1bmN0aW9uYWwgeWV0IHRob3VnaCkuCgoyMDE4LTA4LTIwOiB3a2FsaW5pbgogICAgICAgICAgICAjMTMwNSBGaXggbmVzdGVkIHN0cnVjdHVyZSBzeW1ib2wgdGFibGVzIGluIEMgbW9kZSB0byBmaXggbWVtYmVyIG5hbWUgY29uZmxpY3RzCiAgICAgICAgICAgIGluIGRpZmZlcmVudCBzdHJ1Y3RzIHdpdGggdGhlIHNhbWUgbmVzdGVkIHN0cnVjdCBtZW1iZXIgbmFtZS4KCjIwMTgtMDgtMTg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICM2ODggRml4IG1ha2VmaWxlIHJlY3Vyc2lvbiB3aGVuIHJ1bm5pbmcgcHl0aG9uIHRlc3Qtc3VpdGUuCgoyMDE4LTA4LTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjMTMxMCBSZS1pbXBsZW1lbnQgUHl0aG9uIC1mYXN0cHJveHkgb3B0aW9uLgoKICAgICAgICAgICAgVGhlIHByZXZpb3VzIGltcGxlbWVudGF0aW9uIGZhaWxlZCB3aXRoIFB5dGhvbiAzIGFuZCBhYnN0cmFjdCBiYXNlIGNsYXNlcy4KICAgICAgICAgICAgVGhlIG5ldyBpbXBsZW1lbnRhdGlvbiByZXBsYWNlcyB0aGUgUHl0aG9uIDIgaW1wbGVtZW50YXRpb24gdXNpbmcKICAgICAgICAgICAgbmV3Lmluc3RhbmNlbWV0aG9kIHdpdGggdGhlIEMgQVBJIFB5TWV0aG9kX05ldyB0byBtYXRjaCB0aGUgZXF1aXZhbGVudCBQeXRob24gMwogICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiB3aGljaCB1c2VzIFB5SW5zdGFuY2VNZXRob2RfTmV3LgoKICAgICAgICAgICAgVGhlIG5ldyBhcHByb2FjaCBydW5zIHNsaWdodGx5IGZhc3Rlci4gU2VlICMxMzEwLgoKMjAxOC0wOC0xMjogZ21henphbXV0bwogICAgICAgICAgICBbUHl0aG9uXSAjMTI4MyBVcGRhdGUgcHlidWZmZXIuaSBsaWJyYXJ5IHRvIHVzZSBuZXctc3R5bGUgUHl0aG9uIGJ1ZmZlciBDIEFQSS4KCjIwMTgtMDgtMTI6IGJyaWFuaGF0d29vZCx3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gIzEzMDMgIzEzMDQgRml4IGNyYXNoIGluIGRpcmVjdG9ycyB3aGVuIHVzaW5nIE9VVFBVVCBhbmQgSU5PVVQgdHlwZW1hcHMgaW4gdHlwZW1hcHMuaSBhbmQKICAgICAgICAgICAgcGFzc2luZyBOVUxMIHBvaW50ZXJzIGluIEMrKyB0byBkaXJlY3RvciBtZXRob2Qgb3ZlcmxvYWRlZCBhbmQgaW1wbGVtZW50ZWQgaW4gSmF2YS4KCjIwMTgtMDgtMTA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICMxMjkzIEltcHJvdmUgVHlwZUVycm9yIG1lc3NhZ2UgaW5jb25zaXN0ZW5jaWVzIGJldHdlZW4gZGVmYXVsdCBhbmQgZmFzdGRpc3BhdGNoCiAgICAgICAgICAgIG1vZGUgd2hlbiBoYW5kbGluZyBvdmVybG9hZGVkIEMrKyBmdW5jdGlvbnMuIFByZXZpb3VzbHkgdGhlIGVycm9yIG1lc3NhZ2UgZGlkIG5vdCBhbHdheXMKICAgICAgICAgICAgZGlzcGxheSB0aGUgcG9zc2libGUgQy9DKysgcHJvdG90eXBlcyBpbiBmYXN0ZGlzcGF0Y2ggbW9kZS4KCjIwMTgtMDgtMDI6IGZ1cnlseW54LGphY29id2dpbGxlc3BpZSxwMmsKICAgICAgICAgICAgW0phdmFzY3JpcHRdICMxMjkwLCAjOTY4LiBBZGQgc3VwcG9ydCBmb3IgTm9kZUpTIHZlcnNpb25zIDItMTAuCgoyMDE4LTA3LTMxOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjMTI5MyBPdmVybG9hZGVkIEMrKyBmdW5jdGlvbiB3cmFwcGVycyBub3cgcmFpc2UgYSBUeXBlRXJyb3IgaW5zdGVhZAogICAgICAgICAgICBvZiBOb3RJbXBsZW1lbnRlZEVycm9yIHdoZW4gdGhlIHR5cGVzIHBhc3NlZCBhcmUgaW5jb3JyZWN0LiBUaGlzIGNoYW5nZSBtZWFucwogICAgICAgICAgICB0aGVyZSBpcyBub3cgY29uc2lzdGVuY3kgd2l0aCBub24tb3ZlcmxvYWRlZCBmdW5jdGlvbiB3cmFwcGVycyB3aGljaCBoYXZlIGFsd2F5cwogICAgICAgICAgICByYWlzZWQgVHlwZUVycm9yIHdoZW4gdGhlIGluY29ycmVjdCB0eXBlcyBhcmUgcGFzc2VkLiBUaGUgZXJyb3IgbWVzc2FnZSByZW1haW5zCiAgICAgICAgICAgIHRoZSBzYW1lIGFuZCBpcyBmb3IgZXhhbXBsZSBub3c6CgogICAgICAgICAgICAgIFR5cGVFcnJvcjogV3JvbmcgbnVtYmVyIG9yIHR5cGUgb2YgYXJndW1lbnRzIGZvciBvdmVybG9hZGVkIGZ1bmN0aW9uICdmJy4KICAgICAgICAgICAgICAgIFBvc3NpYmxlIEMvQysrIHByb3RvdHlwZXMgYXJlOgogICAgICAgICAgICAgICAgICBmKGludCkKICAgICAgICAgICAgICAgICAgZihjaGFyIGNvbnN0ICopCgogICAgICAgICAgICBpbnN0ZWFkIG9mOgoKICAgICAgICAgICAgICBOb3RJbXBsZW1lbnRlZEVycm9yOiBXcm9uZyBudW1iZXIgb3IgdHlwZSBvZiBhcmd1bWVudHMgZm9yIG92ZXJsb2FkZWQgZnVuY3Rpb24gJ2YnLgogICAgICAgICAgICAgICAgUG9zc2libGUgQy9DKysgcHJvdG90eXBlcyBhcmU6CiAgICAgICAgICAgICAgICAgIGYoaW50KQogICAgICAgICAgICAgICAgICBmKGNoYXIgY29uc3QgKikKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxOC0wNi0yMzogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gIzcxOCBGaXggcHl0aG9ubm9uZHluYW1pYyBmZWF0dXJlIGZvciBtb2Rlcm4gY2xhc3NlcwoKICAgICAgICAgICAgRml4ZXMgbm9uZHluYW1pYyBtb2RlIHdoZW4gYW4gaW5zdGFuY2UgdmFyaWFibGUgaXMgc2V0IHdpdGggdGhlIHNhbWUKICAgICAgICAgICAgbmFtZSBhcyBhIGNsYXNzIHZhcmlhYmxlIGluIGEgY2xhc3MgZGVyaXZlZCBmcm9tIGEgU1dJRyBwcm94eSBjbGFzcy4KICAgICAgICAgICAgVGhpcyBjb3JuZXIgY2FzZSBzZXQgYW4gaW5zdGFuY2UgdmFyaWFibGUgaW5zdGVhZCBvZiByYWlzaW5nIGFuIEF0dHJpYnV0ZUVycm9yLgoKICAgICAgICAgICAgQWxzbyBmaXggJXB5dGhvbm5vbmR5bmFtaWMgaW4gUHl0aG9uIDMgd2l0aCAtbW9kZXJuLiBUaGUgbWV0YWNsYXNzCiAgICAgICAgICAgIGNvbnRhaW5pbmcgdGhlIGltcGxlbWVudGF0aW9uIHdhcyBwcmV2aW91c2x5IG5vdCBiZWluZyBhcHBsaWVkIGluIFB5dGhvbiAzLgoKMjAxOC0wNy0xNzogcGV0cm1pdHJpY2hldix3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjMTI3NSAjMTI3OSBJbml0aWFsaXplIGZ1bmN0aW9uLWxvY2FsIHN0YXRpY3MgKHNpbmdsZXRvbnMpIHRoYXQgY2FsbCBQeXRob24KICAgICAgICAgICAgY29kZSBkdXJpbmcgUHl0aG9uIG1vZHVsZSBpbml0aWFsaXphdGlvbiBpbiBvcmRlciB0byBhdm9pZCBkZWFkbG9ja3Mgd2l0aCBzdWJzZXF1ZW50CiAgICAgICAgICAgIG11bHRpLXRocmVhZGVkIHVzYWdlLgoKMjAxOC0wNi0xNTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4IHNlZyBmYXVsdCB1c2luZyBQeXRob24gMiB3aGVuIHBhc3NpbmcgYSBQeXRob24gc3RyaW5nLCBjb250YWluaW5nCiAgICAgICAgICAgIGludmFsaWQgdXRmLTggY29udGVudCwgdG8gYSB3c3RyaW5nIG9yIHdjaGFyICogcGFyYW1ldGVyLiBBIFR5cGVFcnJvciBpcyB0aHJvd24gaW5zdGVhZCwgZWc6CgogICAgICAgICAgICAgICVpbmNsdWRlIDxzdGRfd3N0cmluZy5pPgogICAgICAgICAgICAgIHZvaWQgaW5zdHJpbmcoY29uc3Qgc3RkOjp3c3RyaW5nJiBzKTsKCiAgICAgICAgICAgICAgaW5zdHJpbmcoYiJoXHhlOWxsb29vIikgIyBQeXRob24KCjIwMTgtMDYtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIFB5dGhvbiAzLjcgc3VwcG9ydDogUmVwbGFjZSB1c2Ugb2YgZGVwcmVjYXRlZCBQeVVuaWNvZGVfR2V0U2l6ZSB3aXRoCiAgICAgICAgICAgIFB5VW5pY29kZV9HZXRMZW5ndGggdG8gcmVtb3ZlIGRlcHJlY2F0ZWQgd2FybmluZ3MgY29tcGlsaW5nIHRoZSBDL0MrKyB3cmFwcGVycy4KCjIwMTgtMDYtMTI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIFB5dGhvbiAzLjcgc3VwcG9ydDogVGhlICVweXRob25hYmMgZmVhdHVyZSBpbiBweWFiYy5pIG5vdyB1c2VzIGJhc2UgY2xhc3NlcwogICAgICAgICAgICAgIGNvbGxlY3Rpb25zLmFiYy5NdXRhYmxlU2VxdWVuY2UKICAgICAgICAgICAgICBjb2xsZWN0aW9ucy5hYmMuTXV0YWJsZU1hcHBpbmcKICAgICAgICAgICAgICBjb2xsZWN0aW9ucy5hYmMuTXV0YWJsZVNldAogICAgICAgICAgICBpbnN0ZWFkIG9mCiAgICAgICAgICAgICAgY29sbGVjdGlvbnMuTXV0YWJsZVNlcXVlbmNlCiAgICAgICAgICAgICAgY29sbGVjdGlvbnMuTXV0YWJsZU1hcHBpbmcKICAgICAgICAgICAgICBjb2xsZWN0aW9ucy5NdXRhYmxlU2V0CiAgICAgICAgICAgIGFzIHRoZSBsYXR0ZXIgYXJlIGRlcHJlY2F0ZWQgaW4gUHl0aG9uIDMuNyBhbmQgYXJlIGR1ZSB0byBiZSByZW1vdmVkIGluIFB5dGhvbiAzLjguCiAgICAgICAgICAgIFRoZSBjbGFzc2VzIGluIGNvbGxlY3Rpb25zLmFiYy4qIGFyZSBhdmFpbGFibGUgZnJvbSBQeXRob24gMy4zIG9ud2FyZHMuIElmIHlvdQogICAgICAgICAgICByZXF1aXJlIHN1cHBvcnQgZm9yIFB5dGhvbiAzLjIsIHRoZW4gY29weSB0aGUgcHlhYmMuaSBmaWxlIGFuZCBtb2RpZnkgYnkgcmVtb3ZpbmcKICAgICAgICAgICAgdGhlIGZldyBpbnN0YW5jZXMgb2YgdGhlIC5hYmMgc3ViLW1vZHVsZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxOC0wNi0xMjogb2xseSx3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjNzAxIFJlbW92ZSBzdXBwb3J0IGZvciBQeXRob24gdmVyc2lvbnMgPCAyLjcgYW5kIDMuMCBhbmQgMy4xLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE4LTA2LTExOiBvbGx5CiAgICAgICAgICAgIFtQeXRob25dIEZpeCBuZXcgR0NDOCB3YXJuaW5ncyBpbiBnZW5lcmF0ZWQgY29kZSBieSBhdm9pZGluZyBjYXN0cwogICAgICAgICAgICBiZXR3ZWVuIGluY29tcGF0aWJsZSBmdW5jdGlvbiB0eXBlcyB3aGVyZSBwb3NzaWJsZSwgYW5kIGJ5CiAgICAgICAgICAgIHN1cHByZXNzaW5nIHRoZSB3YXJuaW5nIHdoZW4gaXQncyBkdWUgdG8gdGhlIGRlc2lnbiBvZiBQeXRob24ncyBDCiAgICAgICAgICAgIEFQSS4gIEZpeGVzICMxMjU5LgoKMjAxOC0wNi0wODogcGhpbGlwcGtyYWZ0CgkgICAgW1B5dGhvbl0gU3RvcCBleHBvc2luZyA8Q0xBU1M+X3N3aWdyZWdpc3RlciB0byBQeXRob24uICBJdCdzIG5vdAoJICAgIHVzZWZ1bCBmb3IgdXNlciBQeXRob24gY29kZSB0byBjYWxsIHRoaXMsIGFuZCBpdCBqdXN0IGNsdXR0ZXJzIHRoZQoJICAgIEFQSSB1bm5lY2Vzc2FyaWx5LiAgRml4ZXMgIzEyMjUuCgoyMDE4LTA2LTA3OiBjbWZvaWwsIGthYmJpLCBKYW1pZSBLaXJrcGF0cmljaywgbWFya29rMzE0LCB2YWR6LCB3c2Z1bHRvbiwgWWFubiBEaW9yY2V0CiAgICAgICAgICAgICMxNzAgRG94eWdlbiBkb2N1bWVudGF0aW9uIHN1cHBvcnQgYWRkZWQuIFRoaXMgYWxsb3dzIHRyYW5zbGF0aW9uIG9mIERveHlnZW4gY29tbWVudHMKICAgICAgICAgICAgaW50byBKYXZhRG9jIGFuZCBQeURvYyBkb2N1bWVudGF0aW9uLiBJdCBpcyBlbmFibGVkIHZpYSB0aGUgLWRveHlnZW4gY29tbWFuZCBsaW5lCiAgICAgICAgICAgIG9wdGlvbi4gU2VlIHRoZSBEb3h5Z2VuLmh0bWwgY2hhcHRlciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi4KCjIwMTgtMDYtMDc6IG9sbHkKCSAgICBbUEhQXSBXZSd2ZSBmaW5hbGx5IHJlbW92ZWQgc3VwcG9ydCBmb3IgJXByYWdtYShwaHA0KSB3aGljaCB3YXMKCSAgICBkZXByZWNhdGVkIGJhY2sgaW4gMjAwOC4gIFVzZSAlcHJhZ21hKHBocCkgaW5zdGVhZCwgd2hpY2ggaGFzIGJlZW4KCSAgICBzdXBwb3J0ZWQgc2luY2UgYXQgbGVhc3QgMjAwNS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxOC0wNi0wNzogb2xseQoJICAgIFtQSFA1XSBTdXBwb3J0IGZvciBQSFA1IGhhcyBiZWVuIHJlbW92ZWQuICBQSFA1IGlzIG5vIGxvbmdlcgoJICAgIGFjdGl2ZWx5IHN1cHBvcnRlZCBieSB0aGUgUEhQIGRldmVsb3BlcnMgYW5kIHNlY3VyaXR5IHN1cHBvcnQgZm9yCgkgICAgaXQgZW5kcyBjb21wbGV0ZWx5IGF0IHRoZSBlbmQgb2YgMjAxOCwgc28gaXQgZG9lc24ndCBtYWtlIHNlbnNlCgkgICAgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBpdCBpbiB0aGUgdXBjb21pbmcgU1dJRyA0LjAuMCByZWxlYXNlLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE4LTA2LTA2OiBvbGx5CgkgICAgW0x1YV0gSW1wcm92ZSBjb25maWd1cmUgcHJvYmVzIGZvciBMdWEgaGVhZGVycyBhbmQgbGlicyB1c2VkIGluIHRlc3RzdWl0ZS4KCjIwMTgtMDUtMTU6IGt3d2V0dGUKICAgICAgICAgICAgW09jdGF2ZV0gYWRkIHN1cHBvcnQgZm9yIHZlcnNpb24gNC40CiAgICAgICAgICAgIC0gU2hvdWxkIG5vdCBpbnRyb2R1Y2UgYW55IHVzZXItdmlzaWJsZSBpbmNvbXBhdGliaWxpdGllcwoKMjAxOC0wNS0xNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBELCBKYXZhXSBGaXggbG9va3VwIG9mIGNzY29uc3RydWN0LCBkY29uc3RydWN0IGFuZCBqYXZhY29uc3RydWN0IHR5cGVtYXBzLgogICAgICAgICAgICBUaGUgQysrIG5hbWVzcGFjZSB3YXMgcHJldmlvdXNseSBpZ25vcmVkIHdoZW4gbG9va2luZyB1cCB0aGUgdHlwZW1hcC4KCjIwMTgtMDUtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhc2NyaXB0XSBGaXggZ2VuZXJhdGVkIEMrKyBjb2RlIHdoZW4gdXNpbmcgJW5zcGFjZSBvbiBuYW1lc3BhY2VzIHRoYXQgYXJlIG1vcmUKICAgICAgICAgICAgdGhhbiB0d28gbGV2ZWxzIGRlZXAuCgoyMDE4LTA1LTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBJc3N1ZSAjMTI1MSBBZGQgc3VwcG9ydCBmb3IgQysrMTcgbmVzdGVkIG5hbWVzcGFjZSBkZWZpbml0aW9ucywKICAgICAgICAgICAgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgbmFtZXNwYWNlIEE6OkIgeyAuLi4gfQoKMjAxOC0wNS0xMTogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBELCBKYXZhXSBBZGQgc3VwcG9ydCBzbyB0aGF0IHRoZSAlY3NtZXRob2Rtb2RpZmllcnMsICVkbWV0aG9kbW9kaWZpZXJzLAogICAgICAgICAgICAlamF2YW1ldGhvZG1vZGlmaWVycyBjYW4gbW9kaWZ5IHRoZSBtZXRob2QgbW9kaWZpZXJzIGZvciB0aGUgZGVzdHJ1Y3RvciB3cmFwcGVycwogICAgICAgICAgICBpbiB0aGUgcHJveHkgY2xhc3M6IGRpc3Bvc2UsIERpc3Bvc2UsIGRlbGV0ZS4gV2l0aCB0aGlzIGZlYXR1cmUsIGl0IGlzIG5vdyBwb3NzaWJsZQogICAgICAgICAgICB0byBtYWtlIGEgQyMgcHJveHkgY2xhc3Mgc2VhbGVkLCBlZyB3aGVuIHdyYXBwaW5nIGEgY2xhc3MgWCwgdGhlIHZpcnR1YWwgbWV0aG9kIG1vZGlmaWVycwogICAgICAgICAgICBjYW4gYmUgcmVtb3ZlZCB1c2luZzoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoY3NjbGFzc21vZGlmaWVycykgWCAicHVibGljIHNlYWxlZCBjbGFzcyIKICAgICAgICAgICAgICAlY3NtZXRob2Rtb2RpZmllcnMgWDo6flggInB1YmxpYyAvKnZpcnR1YWwqLyI7CgoyMDE4LTA0LTE4OiBvbGx5CgkgICAgW1B5dGhvbl0gU3VwcHJlc3MgbmV3IHB5Y29kZXN0eWxlIHdhcm5pbmc6CgkgICAgRTI1MiBtaXNzaW5nIHdoaXRlc3BhY2UgYXJvdW5kIHBhcmFtZXRlciBlcXVhbHMKCjIwMTgtMDQtMDc6IGdvYXRzaHJpZWsKICAgICAgICAgICAgW1J1YnldICMxMjEzIEZpeCBydWJ5ICVhbGlhcyBkaXJlY3RpdmUgZm9yIGdsb2JhbCBDL0MrKyBmdW5jdGlvbnMuCgoyMDE4LTA0LTAzOiBvbGx5CgkgICAgW1J1YnldIEZpeCB0byBwYXNzIFFuaWwgaW5zdGVhZCBvZiBOVUxMIHRvIHJiX2Z1bmNhbGwoKSwgd2hpY2ggc2lsZW5jZXMgR0NDCgkgICAgLVdjb252ZXJzaW9uLW51bGwgd2FybmluZyAob24gYnkgZGVmYXVsdCB3aXRoIHJlY2VudCBHQ0MpLgoKMjAxOC0wMy0wOTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdICMxMTg0IEZpeCBzd2lnUmVsZWFzZU93bmVyc2hpcCgpIGFuZCBzd2lnVGFrZU93bmVyc2hpcCgpIHJlZ3Jlc3Npb24KICAgICAgICAgICAgZm9yIG5vbi1kaXJlY3RvciBjbGFzc2VzLiBSZXN0b3JlcyBhIGR5bmFtaWNfY2FzdCB3aGljaCB3YXMgcHJldmlvdXNseSByZW1vdmVkLgoKMjAxOC0wMy0wNzogbGxvbmdpCgkgICAgR2l0aHViIFBSICMxMTY2IC0gRml4IHByZXByb2Nlc3NvciBoYW5kbGluZyBvZiBtYWNyb3Mgd2l0aCBjb21tYXMKCSAgICBpbiBhIC8vIGNvbW1lbnQuCgoyMDE4LTAyLTE4OiBKUEVXZGV2CiAgICAgICAgICAgIFBhdGNoICMxMTY0IC0gQWRkIHN1cHBvcnQgZm9yIGEgY29tbWFuZC1saW5lIG9wdGlvbnMgZmlsZSwgYWxzbyBzb21ldGltZXMKICAgICAgICAgICAgY2FsbGVkIGEgcmVzcG9uc2UgZmlsZS4gVGhpcyBpcyB1c2VmdWwgaWYgdGhlIGNvbW1hbmQtbGluZSBvcHRpb25zIGV4Y2VlZAogICAgICAgICAgICB0aGUgc3lzdGVtIGNvbW1hbmQtbGluZSBsZW5ndGggbGltaXQuIFRvIHVzZSwgcHV0IHRoZSBjb21tYW5kLWxpbmUgb3B0aW9ucwogICAgICAgICAgICBpbnRvIGEgZmlsZSwgdGhlbiBwcm92aWRlIHRoZSBmaWxlIG5hbWUgcHJlZml4ZWQgd2l0aCBALCBmb3IgZXhhbXBsZSB1c2luZwogICAgICAgICAgICBhIGZpbGUgY2FsbGVkIGFyZ3MudHh0OgoKICAgICAgICAgICAgICBzd2lnIEBhcmdzLnR4dAoKMjAxOC0wMi0xMTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFzY3JpcHRdICMxMTg3IEZpeCBjb21waWxhdGlvbiBlcnJvciB3cmFwcGluZyBzdGQ6OmNvbXBsZXggdmlhCiAgICAgICAgICAgIHN0ZF9jb21wbGV4LmkuCgoyMDE4LTAxLTMwOiBzbWFyY2hldHRvCiAgICAgICAgICAgIFtTY2lsYWJdIGFkZCB0eXBlIG5hbWUgYXJndW1lbnQgaW4gU1dJR19wdHIoKSBmdW5jdGlvbiB0byBjYXN0IGZyb20gcG9pbnRlciBhZGRyZXNzIHRvIHR5cGVkIHBvaW50ZXJzCgoyMDE4LTAxLTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBFeHByZXNzaW9ucyBmb2xsb3dpbmcgYSBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlIG11c3Qgbm93IGJlIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlCiAgICAgICAgICAgIG9yIG5vbi1udW1lcmljIGNoYXJhY3RlcnMuIFRoaXMgc3ludGF4IGNoYW5nZSBtYWtlcyB0aGUgU1dJRyBwcmVwcm9jZXNzb3Igd29yayBsaWtlCiAgICAgICAgICAgIHRoZSBDIHByZXByb2Nlc3NvciBpbiB0aGlzIGFyZWEuCgogICAgICAgICAgICBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlIHVzZWQgYmUgYWNjZXB0ZWQgYXMgdmFsaWQgc3ludGF4OgogICAgICAgICAgICAgICNpZjEKICAgICAgICAgICAgICAjZGVmaW5lIEFCQyAxMjMKICAgICAgICAgICAgICAjZW5kaWYKCiAgICAgICAgICAgIE5vdyB5b3UgZ2V0IGFuIGVycm9yOgogICAgICAgICAgICAgIGV4YW1wbGUuaDoxOiBFcnJvcjogVW5rbm93biBTV0lHIHByZXByb2Nlc3NvciBkaXJlY3RpdmU6IGlmMSAoaWYgdGhpcyBpcyBhIGJsb2NrIG9mCiAgICAgICAgICAgICAgdGFyZ2V0IGxhbmd1YWdlIGNvZGUsIGRlbGltaXQgaXQgd2l0aCAleyBhbmQgJX0pCiAgICAgICAgICAgICAgZXhhbXBsZS5oOjM6IEVycm9yOiBFeHRyYW5lb3VzICNlbmRpZi4KCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgdGhlIGNvcnJlY3Qgc3ludGF4OgogICAgICAgICAgICAgICNpZiAxCiAgICAgICAgICAgICAgI2RlZmluZSBBQkMgMTIzCiAgICAgICAgICAgICAgI2VuZGlmCgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIG9mIGNvdXJzZSBhbHNvIHdvcmtzOgogICAgICAgICAgICAgICNpZigxKQogICAgICAgICAgICAgICNkZWZpbmUgQUJDIDEyMwogICAgICAgICAgICAgICNlbmRpZgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE4LTAxLTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggaXNzdWUgIzExODMuIEZsb2F0aW5nIHBvaW50IGV4Y2VwdGlvbiBldmFsdWF0aW5nIHByZXByb2Nlc3NvciBleHByZXNzaW9ucwogICAgICAgICAgICByZXN1bHRpbmcgaW4gZGl2aXNpb24gYnkgemVyby4KCjIwMTgtMDEtMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBpc3N1ZSAjMTE3Mi4gU2VnIGZhdWx0IHBhcnNpbmcgaW52YWxpZCBleHBvbmVudHMgaW4gdGhlIHByZXByb2Nlc3Nvci4KCjIwMTgtMDEtMTI6IExpcnluYQogICAgICAgICAgICBbQyNdIFBhdGNoICMxMTI4LiBBZGQgVG9BcnJheSBmdW5jdGlvbiB0byBzdGQ6OnZlY3RvciB3cmFwcGVycy4KCjIwMTgtMDEtMTI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggaXNzdWUgIzExNTYuIEFkZCBtaXNzaW5nIHRocm93cyBjbGF1c2UgZm9yIGludGVyZmFjZXMgd2hlbiB1c2luZyB0aGUKICAgICAgICAgICAgJWludGVyZmFjZSBmYW1pbHkgb2YgbWFjcm9zLgoKMjAxOC0wMS0wNTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGRlZmF1bHQgYXJndW1lbnRzIHVzaW5nIGV4cHJlc3Npb25zIGNvbnRhaW5pbmcgLT4gc3ludGF4IGVycm9yLiBQcm9ibGVtIHJlcG9ydGVkIG9uCiAgICAgICAgICAgIHN3aWctdXNlciBtYWlsaW5nIGxpc3QuCgoyMDE3LTEyLTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBSZXBsYWNlIHBlcDggd2l0aCBweWNvZGVzdHlsZSBmb3IgY2hlY2tpbmcgdGhlIFB5dGhvbiBjb2RlIHN0eWxlIHdoZW4KICAgICAgICAgICAgcnVubmluZyBQeXRob24gdGVzdHMuCgoyMDE3LTEyLTMwOiBkYXZlZGlzc2lhbgogICAgICAgICAgICBGaXhlZCBhIHN5bWJvbCBsb29rdXAgaXNzdWUgd2hlbiBlbmNvdW50ZXJpbmcgYSB0eXBlZGVmIG9mIGEgc3ltYm9sIGZyb20gdGhlIHRhZwogICAgICAgICAgICBuYW1lc3BhY2UgdG8gdGhlIGdsb2JhbCBuYW1lc3BhY2Ugd2hlbiB0aGUgbmFtZXMgYXJlIGlkZW50aWNhbCwgc3VjaCBhcyAndHlwZWRlZgogICAgICAgICAgICBzdHJ1Y3QgRm9vIEZvbzsnLgoKMjAxNy0xMi0xMzogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIGFkZCBtaXNzaW5nIHN1cHBvcnQgZm9yIGRpcmVjdG9yZnJlZSB0eXBlbWFwcy4KCjIwMTctMTItMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIElzc3VlICMxMTY3IEZpeCBkaXJlY3Rvcm91dCB0eXBlbWFwcyB3aGljaCB3ZXJlIGNhdXNpbmcgdW5kZWZpbmVkIGJlaGF2aW91ciB3aGVuCiAgICAgICAgICAgIHJldHVybmluZyBwb2ludGVycyBieSByZWZlcmVuY2UuCgoyMDE3LTEyLTA4OiBvbGx5CgkgICAgW1BIUF0gVXNlIFpFTkRfTU9EVUxFX0dMT0JBTFNfQUNDRVNTT1IgdG8gYWNjZXNzIGdsb2JhbHMgc28gdGhlCgkgICAgZ2VuZXJhdGVkIGNvZGUgYnVpbGRzIHdoZW4gUEhQIHdhcyBidWlsdCB3aXRoIFpUUyBlbmFibGVkLgoKMjAxNy0xMi0wNDogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQWRkIG1pc3NpbmcgY2hlY2tzIGZvciBmYWlsdXJlcyBpbiBjYWxscyB0byBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nLiBQcmV2aW91c2x5IGEKICAgICAgICAgICAgc2VnIGZhdWx0IGNvdWxkIG9jY3VyIHdoZW4gcGFzc2luZyBpbnZhbGlkIFVURjggc3RyaW5ncyAobG93IHN1cnJvZ2F0ZXMpLCBlZyBwYXNzaW5nCiAgICAgICAgICAgIHUiXHVkY2ZmIiB0byB0aGUgQyBsYXllciAoUHl0aG9uIDMpLgoKMjAxNy0xMS0yNDogam9lcXVhbnQKCSAgICBbUl0gRml4ICMxMTI0IGFuZCByZXR1cm4gUl9OaWxWYWx1ZSBmb3IgbnVsbCBwb2ludGVycwoKMjAxNy0xMS0yOTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIGRpcmVjdG9yIGV4Y2VwdGlvbiBoYW5kbGluZyBpbXByb3ZlbWVudHMuCgogICAgICAgICAgICBXaGVuIGEgZGlyZWN0b3IgbWV0aG9kIHRocm93cyBhbiBleGNlcHRpb24gYW5kIGl0IGlzIGNhdWdodCBieSBEaXJlY3RvckV4Y2VwdGlvbgogICAgICAgICAgICBhbmQgcGFzc2VkIGJhY2sgdG8gSmF2YSB1c2luZyBTd2lnOjpEaXJlY3RvckV4Y2VwdGlvbjo6dGhyb3dFeGNlcHRpb24sIHRoZSBKYXZhCiAgICAgICAgICAgIHN0YWNrIHRyYWNlIG5vdyBjb250YWlucyB0aGUgb3JpZ2luYWwgc291cmNlIGxpbmUgdGhhdCB0aHJldyB0aGUgZXhjZXB0aW9uLgoKICAgICAgICAgICAgRGVwcmVjYXRlIFN3aWc6OkRpcmVjdG9yRXhjZXB0aW9uOjpyYWlzZUphdmFFeGNlcHRpb24sIHBsZWFzZSByZXBsYWNlIHVzYWdlIHdpdGgKICAgICAgICAgICAgU3dpZzo6RGlyZWN0b3JFeGNlcHRpb246OnRocm93RXhjZXB0aW9uLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE3LTEwLTI2OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgc3VwcG9ydCBmb3IgQysrMTEgcmVmLXF1YWxpZmllcnMgd2hlbiB1c2luZyBkaXJlY3RvcnMuCgoyMDE3LTEwLTI2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZ2VuZXJhdGVkIGNvZGUgd2hlbiB1c2luZyBkaXJlY3RvcnMgYW5kIG1ldGhvZHMgcmV0dXJuaW5nIGNvbnN0IHJlZiBwb2ludGVycy4KCjIwMTctMTAtMjY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgRCwgSmF2YSwgT2N0YXZlLCBSLCBTY2lsYWJdIFBvcnQgZGlyZWN0b3IgdHlwZW1hcHMgdG8gdGhlc2UgYWRkaXRpb25hbCBsYW5ndWFnZXMuCiAgICAgICAgICAgIElzc3VlICM3MDAuCgoyMDE3LTEwLTI2OiByYWRhcnNhdDEKICAgICAgICAgICAgW1J1YnkgUHl0aG9uXSBQYXRjaCAjMTAyOSAtIENvcnJlY3QgaGFuZGxpbmcgb2YgbnVsbCB1c2luZyBkaXJlY3RvcnMgYW5kIHNoYXJlZF9wdHIuCgoyMDE3LTEwLTEwOiBqb2VxdWFudAoJICAgIFtSXSBwYXNzIGVudW0gZXhwcmVzc2lvbnMgdG8gUi4gIFRoaXMgd2lsbCBnZW5lcmF0ZQoJICAgIGluY29ycmVjdCBmaWxlcyB3aGVuIHRoZXJlIGlzIGFuIGFyaXRobWV0aWMgZXhwcmVzc2lvbgoJICAgIGluIHRoZSBlbnVtLCBidXQgdGhpcyBpcyBiZXR0ZXIgdGhhbiBzaWxlbnRseSBnZW5lcmF0aW5nCgkgICAgaW5jb3JyZWN0IGNvZGUKCjIwMTctMTAtMDk6IG9sbHkKCSAgICBbUEhQXSBGaXggaW5jb3JyZWN0IHdyYXBwZXIgY29kZSBnZW5lcmF0ZWQgd2hlbiB0aGVyZSdzIGEKCSAgICBjb21iaW5hdGlvbiBvZiBvdmVybG9hZGluZywgcGFyYW1ldGVycyB3aXRoIGEgZGVmYXVsdCB2YWx1ZQoJICAgIGFuZCAlbmV3b2JqZWN0LiAgRml4ZXMgaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcC9zd2lnL2J1Z3MvMTM1MC8KCjIwMTctMTAtMDk6IG9sbHkKCSAgICBSZW1vdmUgR0NKIHN1cHBvcnQuICBJdCBpc24ndCBpbiBhIGdvb2Qgc3RhdGUgYW5kIGRvZXNuJ3Qgc2VlbSB0bwoJICAgIGJlIHVzZWQsIGFuZCBHQ0M3IGRyb3BwZWQgR0NKLiAgQ2xvc2VzCgkgICAgaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcC9zd2lnL2J1Z3MvODIzLwoKMjAxNy0xMC0wNzogb2xseQoJICAgIEZpeCBwcmVwcm9jZXNzb3IgaGFuZGxpbmcgb2YgZW1wdHkgbWFjcm8gYXJndW1lbnRzIHRvIG1hdGNoIHRoYXQgb2YKCSAgICBDL0MrKyBjb21waWxlcnMuICBGaXhlcyBpc3N1ZSAjMTExMSBhbmQKCSAgICBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3N3aWcvYnVncy84MjYvCgoyMDE3LTEwLTA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBJc3N1ZSAjMTEwOC4gRml4IHBsYXRmb3JtIGluY29uc2lzdGVuY3kgaW4gUHl0aG9uIGRlZmF1bHQgYXJndW1lbnQgaGFuZGxpbmcuCiAgICAgICAgICAgIDMyIGJpdCBhbmQgNjQgYml0IGNvbXBpbGVkIHZlcnNpb25zIG9mIFNXSUcgZ2VuZXJhdGVkIGRpZmZlcmVudCBQeXRob24gZmlsZXMKICAgICAgICAgICAgd2hlbiBkZWZhdWx0IGFyZ3VtZW50cyB3ZXJlIG91dHNpZGUgdGhlIHJhbmdlIG9mIDMyIGJpdCBzaWduZWQgaW50ZWdlcnMuCiAgICAgICAgICAgIFRoZSBkZWZhdWx0IGFyZ3VtZW50cyBzcGVjaWZpZWQgaW4gUHl0aG9uIGFyZSBub3cgb25seSB0aG9zZSB0aGF0IGFyZSBpbiB0aGUKICAgICAgICAgICAgcmFuZ2Ugb2YgYSAzMiBiaXQgc2lnbmVkIGludGVnZXIsIG90aGVyd2lzZSB0aGUgZGVmYXVsdCBpcyBvYnRhaW5lZCBmcm9tIEMvQysrIGNvZGUuCgoyMDE3LTEwLTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCBzdGQ6OmNvbXBsZXggdHlwZXMgcGFzc2VkIGJ5IHZhbHVlLgoKMjAxNy0xMC0wMjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFzY3JpcHQsIFB5dGhvbiwgUnVieV0gSXNzdWUgIzczMiAtIE1pc3NpbmcgdHlwZSBpbmZvcm1hdGlvbiBmb3Igc3RkOjpjb21wbGV4CiAgICAgICAgICAgIGluIHN0ZF9jb21wbGV4LmkgbWVhbnQgdGhhdCBwcmV2aW91c2x5IHN0ZDo6Y29tcGxleCBhbHdheXMgaGFkIHRvIGJlIGZ1bGx5IHF1YWxpZmllZAogICAgICAgICAgICBpbiBvcmRlciB0byBiZSB3cmFwcGVkIHdpdGggdGhlIGFwcHJvcHJpYXRlIHR5cGVtYXBzLgoKMjAxNy0xMC0wMTogam9lcXVhbnQKICAgICAgICAgICAgYWxsb3cgUiBwYWNrYWdlIG5hbWVzIHdpdGggZG9jcwoJICAgIGFsbG93aW5nIG11bHRpcGxlIGdldCBhY2Nlc3NvcnMgaW4gUgoJICAgIGZpeCBzbWFydC1wb2ludGVyIGFuZCBOQU1FU1BBQ0Ugc3VwcG9ydAoJICAgIGNvbnN0cnVjdG9ycyBub3cgcmV0dXJuaW5nIHNtYXJ0IHBvaW50ZXJzIChpZiBjbGFzcwoJICAgIGRlY2xhcmVkIGFzIHN1Y2gpCgkgICAgc21hcnQtcG9pbnRlciBjbGFzc2VzIGRlcml2aW5nIGZyb20gcGFyZW50IHNtYXJ0LXBvaW50ZXJzCgoyMDE3LTA5LTI5OiB3c2Z1bHRvbgogICAgICAgICAgICBJc3N1ZSAjMTEwMCAtIEFsbG93IGFuIGluc3RhbnRpYXRlZCB0ZW1wbGF0ZSB0byBoYXZlIHRoZSBzYW1lIG5hbWUgaW4gdGhlIHRhcmdldAogICAgICAgICAgICBsYW5ndWFnZSBhcyB0aGUgQysrIHRlbXBsYXRlIG5hbWUsIGZvciBleGFtcGxlLCB0aGlzIGlzIG5vdyBwb3NzaWJsZToKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IFggeyAuLi4gfTsKICAgICAgICAgICAgICAldGVtcGxhdGUoWCkgWDxpbnQ+OwoKMjAxNy0wOS0yMzogd3NmdWx0b24KICAgICAgICAgICAgSXNzdWUgIzEwOTguIEZpeCBvdmVybG9hZGluZyBvZiBzaGFyZWRfcHRyIHdpdGggdW5kZXJseWluZyBwb2ludGVyIHR5cGVzLCBlZzoKCiAgICAgICAgICAgICAgdm9pZCBtKHN0ZDo6c2hhcmVkX3B0cjxUPiBwKTsKICAgICAgICAgICAgICB2b2lkIG0oVCAmcCk7CiAgICAgICAgICAgICAgdm9pZCBtKFQgKnApOwoKICAgICAgICAgICAgT25seSB0aGUgZmlyc3QgbWV0aG9kIGlzIHdyYXBwZWQgYW5kIHRoZSBvdGhlcnMgYXJlIGlnbm9yZWQvc2hhZG93ZWQuCiAgICAgICAgICAgIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBkb25lIHZpYSBhIG5ldyBhdHRyaWJ1dGUgaW4gdGhlICd0eXBlY2hlY2snIHR5cGVtYXAgY2FsbGVkCiAgICAgICAgICAgICdlcXVpdmFsZW50Jy4gSWYgc3BlY2lmaWVkLCBpdCBtdXN0IGNvbnRhaW4gdGhlIGVxdWl2YWxlbnQgcG9pbnRlciB0eXBlIGZvciBvdmVybG9hZGluZwogICAgICAgICAgICBhbmQgY2FuIG9ubHkgYmUgdXNlZCBmb3IgdGhlIHNwZWNpYWwgU1dJR19UWVBFQ0hFQ0tfUE9JTlRFUiBwcmVjZWRlbmNlIGxldmVsLgogICAgICAgICAgICBUaGUgc2hhcmVkX3B0ciAndHlwZWNoZWNrJyB0eXBlbWFwcyBoYXZlIGJlZW4gbW9kaWZpZWQgYWNjb3JkaW5nbHkuCiAgICAgICAgICAgIEhlcmUgaXMgYSBzaW1wbGlmaWVkIHZlcnNpb246CgogICAgICAgICAgICAgICV0eXBlbWFwKHR5cGVjaGVjaywgcHJlY2VkZW5jZT1TV0lHX1RZUEVDSEVDS19QT0lOVEVSLCBlcXVpdmFsZW50PSJUICoiKQogICAgICAgICAgICAgICAgVCwKICAgICAgICAgICAgICAgIFQgQ09OU1QgJiwKICAgICAgICAgICAgICAgIFQgQ09OU1QgKiwKICAgICAgICAgICAgICAgIFQgKkNPTlNUJiwKICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjwgVCA+LAogICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPCBUID4gJiwKICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjwgVCA+ICosCiAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8IFQgPiAqJgogICAgICAgICAgICAgICAgeyAuLi4gfQoKICAgICAgICAgICAgT3ZlcmxvYWRpbmcgd2l0aCBhbnkgb2YgdGhlc2UgdHlwZXMgd2lsbCByZXN1bHQgaW4gU1dJRyBpZ25vcmluZyBhbGwgYnV0IHRoZSBmaXJzdAogICAgICAgICAgICBvdmVybG9hZGVkIG1ldGhvZCBieSBkZWZhdWx0LiBXaXRob3V0IHRoZSAnZXF1aXZhbGVudCcgYXR0cmlidXRlLCB3cmFwcGluZyB0aGUgb3ZlcmxvYWRlZAogICAgICAgICAgICBtZXRob2RzIHJlc3VsdGVkIGluIHR5cGVzIGJlaW5nIHNoYWRvd2VkIChzY3JpcHRpbmcgbGFuZ3VhZ2VzKSBvciBjb2RlIHRoYXQgZGlkIG5vdAogICAgICAgICAgICBjb21waWxlIChzdGF0aWNhbGx5IHR5cGVkIGxhbmd1YWdlcykuCgoyMDE3LTA5LTE5OiBmdXRhdHVraQogICAgICAgICAgICBbUHl0aG9uXSAjMTAwMyBBZGQgLS13aXRoLTJ0bzM9L3BhdGgvdG8vMnRvMyBvcHRpb24gdG8gY29uZmlndXJlLgoKMjAxNy0wOS0xODogd3NmdWx0b24KICAgICAgICAgICAgRml4IHR5cGUgcHJvbW90aW9uIHdyYXBwaW5nIGNvbnN0YW50IGV4cHJlc3Npb25zIG9mIHRoZSBmb3JtOgogICAgICAgICAgICAgICMgZGVmaW5lIEVYUFJfTUlYRUQxICAgICgweDgwICsgMTEuMSkgLSAxCiAgICAgICAgICAgIFRoaXMgd2FzIHByZXZpb3VzbHkgYW4gaW50ZWdyYWwgdHlwZSBpbnN0ZWFkIG9mIGEgZmxvYXRpbmcgcG9pbnQgdHlwZS4KCjIwMTctMDktMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBnZW5lcmF0ZWQgY29kZSBmb3IgY29uc3RhbnQgZXhwcmVzc2lvbnMgY29udGFpbmluZyB3Y2hhcl90IEwgbGl0ZXJhbHMgc3VjaCBhczoKICAgICAgICAgICAgICAjIGRlZmluZSBfX1dDSEFSX01BWCAgICAoMHg3ZmZmZmZmZiArIEwnXDAnKQogICAgICAgICAgICAgICMgZGVmaW5lIF9fV0NIQVJfTUlOICAgICgtX19XQ0hBUl9NQVggLSAxKQoKMjAxNy0wOS0xMDogbWxhbWFycmUKICAgICAgICAgICAgW1B5dGhvbl0gUGF0Y2ggIzEwODMuIERlZmluZV9ERUJVRyB0byAxIHRvIGRvIGV4YWN0bHkgbGlrZSBWaXN1YWwgU3R1ZGlvCiAgICAgICAgICAgIC9MRGQsIC9NRGQgb3IgL01UZCBjb21waWxlciBvcHRpb25zLgoKMjAxNy0wOC0yNTogd3NmdWx0b24KICAgICAgICAgICAgSXNzdWUgIzEwNTkuIEFkZCBzdXBwb3J0IGZvciBDKysxMSByZWYtcXVhbGlmaWVycyBvbiBub24tc3RhdGljIG1lbWJlciBmdW5jdGlvbnMuCiAgICAgICAgICAgIE1lbWJlcnMgd2l0aCBsdmFsdWUgcmVmLXF1YWxpZmllcnMgc3VjaCBhczoKCiAgICAgICAgICAgICAgc3RydWN0IFJRIHsKICAgICAgICAgICAgICAgIHZvaWQgbTEoaW50IHgpICY7CiAgICAgICAgICAgICAgICB2b2lkIG0yKGludCB4KSBjb25zdCAmOwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICBhcmUgd3JhcHBlZCBsaWtlIGFueSBvdGhlciBtZW1iZXIgZnVuY3Rpb24uIE1lbWJlciBmdW5jdGlvbnMgd2l0aCBydmFsdWUgcmVmLXF1YWxpZmllcnMKICAgICAgICAgICAgYXJlIGlnbm9yZWQgYnkgZGVmYXVsdCwgc3VjaCBhczoKCiAgICAgICAgICAgICAgc3RydWN0IFJRIHsKICAgICAgICAgICAgICAgIHZvaWQgbTMoaW50IHgpICYmOwogICAgICAgICAgICAgICAgdm9pZCBtNChpbnQgeCkgY29uc3QgJiY7CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjc6IFdhcm5pbmcgNDA1OiBNZXRob2Qgd2l0aCBydmFsdWUgcmVmLXF1YWxpZmllciBtMyhpbnQpICYmIGlnbm9yZWQuCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjg6IFdhcm5pbmcgNDA1OiBNZXRob2Qgd2l0aCBydmFsdWUgcmVmLXF1YWxpZmllciBtNChpbnQpIGNvbnN0ICYmIGlnbm9yZWQuCgogICAgICAgICAgICBUaGVzZSBjYW4gYmUgdW5pZ25vcmVkIGFuZCBleHBvc2VkIHRvIHRoZSB0YXJnZXQgbGFuZ3VhZ2UsIHNlZSBmdXJ0aGVyIGRvY3VtZW50YXRpb24gaW4KICAgICAgICAgICAgQ1BsdXNQbHVzMTEuaHRtbC4KCjIwMTctMDgtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTA2My4gQWRkIHVzaW5nIGRlY2xhcmF0aW9ucyB0byB0ZW1wbGF0ZXMgaW50byB0eXBlZGVmIHRhYmxlLgoKICAgICAgICAgICAgVXNpbmcgZGVjbGFyYXRpb25zIHRvIHRlbXBsYXRlcyB3ZXJlIG1pc3NpbmcgaW4gU1dJRydzIGludGVybmFsIHR5cGVkZWYgdGFibGVzLgogICAgICAgICAgICBUaGlzIGxlZCB0byBhIGZldyBwcm9ibGVtcywgc3VjaCBhcywgdGVtcGxhdGVzIHRoYXQgZGlkIG5vdCBpbnN0YW50aWF0ZSBhbmQgZ2VuZXJhdGVkCiAgICAgICAgICAgIEMrKyBjb2RlIHRoYXQgZGlkIG5vdCBjb21waWxlIGFzIFNXSUcgZGlkIG5vdCBrbm93IHdoYXQgc2NvcGUgdGhlIHRlbXBsYXRlIHdhcwogICAgICAgICAgICBpbi4gVGhpcyBoYXBwZW5lZCBtb3N0bHkgd2hlbiBhIHVzaW5nIGRlY2xhcmF0aW9uIHdhcyB1c2VkIG9uIGEgdGVtcGxhdGUgdHlwZSBpbiBhCiAgICAgICAgICAgIGNvbXBsZXRlbHkgdW5yZWxhdGVkIG5hbWVzcGFjZS4KCjIwMTctMDgtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB0eXBlIGxvb2t1cCBpbiB0aGUgcHJlc2VuY2Ugb2YgdXNpbmcgZGlyZWN0aXZlcyBhbmQgdXNpbmcgZGVjbGFyYXRpb25zLgoKICAgICAgICAgICAgRml4IHNvbWUgY2FzZXMgb2YgdHlwZSBsb29rdXAgZmFpbHVyZSB2aWEgYSBjb21iaW5hdGlvbiBvZiBib3RoIHVzaW5nIGRpcmVjdGl2ZXMgYW5kCiAgICAgICAgICAgIHVzaW5nIGRlY2xhcmF0aW9ucyByZXN1bHRpbmcgaW4gQysrIGNvZGUgdGhhdCBkaWQgbm90IGNvbXBpbGUgYXMgdGhlIGdlbmVyYXRlZCB0eXBlIHdhcwogICAgICAgICAgICBub3QgZnVsbHkgcXVhbGlmaWVkIGZvciB1c2UgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuIEV4YW1wbGUgYmVsb3c6CgogICAgICAgICAgICAgIG5hbWVzcGFjZSBTcGFjZTUgewogICAgICAgICAgICAgICAgbmFtZXNwYWNlIFN1YlNwYWNlNSB7CiAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBTdWJTdWJTcGFjZTUgewogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBGIHt9OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB1c2luZyBuYW1lc3BhY2UgU3ViU3BhY2U1OwogICAgICAgICAgICAgICAgdXNpbmcgU3ViU3ViU3BhY2U1OjpGOwogICAgICAgICAgICAgICAgdm9pZCBmdW5jKFN1YlN1YlNwYWNlNTo6RiBmKTsKICAgICAgICAgICAgICB9CgoyMDE3LTA4LTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBJc3N1ZSAjMTA1MS4gJXRlbXBsYXRlIHNjb3BlIGVuZm9yY2VtZW50IGFuZCBjbGFzcyBkZWZpbml0aW9uIGZpeGVzLgoKICAgICAgICAgICAgVGhlIHNjb3BpbmcgcnVsZXMgYXJvdW5kICV0ZW1wbGF0ZSBoYXZlIGJlZW4gc3BlY2lmaWVkIGFuZCBlbmZvcmNlZC4KICAgICAgICAgICAgVGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgZm9yIGEgY2xhc3MgdGVtcGxhdGUgaXMgdGhlIGVxdWl2YWxlbnQgdG8gYW4KICAgICAgICAgICAgZXhwbGljaXQgaW5zdGFudGlhdGlvbiBvZiBhIEMrKyBjbGFzcyB0ZW1wbGF0ZS4gVGhlIHNjb3BlIGZvciBhIHZhbGlkCiAgICAgICAgICAgICV0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIGlzIG5vdyB0aGUgc2FtZSBhcyB0aGUgc2NvcGUgcmVxdWlyZWQgZm9yIGEKICAgICAgICAgICAgdmFsaWQgZXhwbGljaXQgaW5zdGFudGlhdGlvbiBvZiBhIEMrKyB0ZW1wbGF0ZS4gQSBkZWZpbml0aW9uIG9mIHRoZQogICAgICAgICAgICB0ZW1wbGF0ZSBmb3IgdGhlIGV4cGxpY2l0IGluc3RhbnRpYXRpb24gbXVzdCBiZSBpbiBzY29wZSB3aGVyZSB0aGUKICAgICAgICAgICAgaW5zdGFudGlhdGlvbiBpcyBkZWNsYXJlZCBhbmQgbXVzdCBub3QgYmUgZW5jbG9zZWQgd2l0aGluIGEgZGlmZmVyZW50CiAgICAgICAgICAgIG5hbWVzcGFjZS4KCiAgICAgICAgICAgIEZvciBleGFtcGxlLCBhIGZldyAldGVtcGxhdGUgYW5kIEMrKyBleHBsaWNpdCBpbnN0YW50aWF0aW9ucyBvZiBzdGQ6OnZlY3RvcgogICAgICAgICAgICBhcmUgc2hvd24gYmVsb3c6CgogICAgICAgICAgICAgIC8vIHZhbGlkCiAgICAgICAgICAgICAgbmFtZXNwYWNlIHN0ZCB7CiAgICAgICAgICAgICAgICAldGVtcGxhdGUodmluKSB2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICAgIHRlbXBsYXRlIGNsYXNzIHZlY3RvcjxpbnQ+OwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgLy8gdmFsaWQKICAgICAgICAgICAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOwogICAgICAgICAgICAgICV0ZW1wbGF0ZSh2aW4pIHZlY3RvcjxpbnQ+OwogICAgICAgICAgICAgIHRlbXBsYXRlIGNsYXNzIHZlY3RvcjxpbnQ+OwoKICAgICAgICAgICAgICAvLyB2YWxpZAogICAgICAgICAgICAgIHVzaW5nIHN0ZDo6dmVjdG9yOwogICAgICAgICAgICAgICV0ZW1wbGF0ZSh2aW4pIHZlY3RvcjxpbnQ+OwogICAgICAgICAgICAgIHRlbXBsYXRlIGNsYXNzIHZlY3RvcjxpbnQ+OwoKICAgICAgICAgICAgICAvLyBpbGwtZm9ybWVkCiAgICAgICAgICAgICAgbmFtZXNwYWNlIHVucmVsYXRlZCB7CiAgICAgICAgICAgICAgICB1c2luZyBzdGQ6OnZlY3RvcjsKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2aW4pIHZlY3RvcjxpbnQ+OwogICAgICAgICAgICAgICAgdGVtcGxhdGUgY2xhc3MgdmVjdG9yPGludD47CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAvLyBpbGwtZm9ybWVkCiAgICAgICAgICAgICAgbmFtZXNwYWNlIHVucmVsYXRlZCB7CiAgICAgICAgICAgICAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOwogICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZpbikgdmVjdG9yPGludD47CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSBjbGFzcyB2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIC8vIGlsbC1mb3JtZWQKICAgICAgICAgICAgICBuYW1lc3BhY2UgdW5yZWxhdGVkIHsKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBzdGQgewogICAgICAgICAgICAgICAgICAldGVtcGxhdGUodmluKSB2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgY2xhc3MgdmVjdG9yPGludD47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAvLyBpbGwtZm9ybWVkCiAgICAgICAgICAgICAgbmFtZXNwYWNlIHVucmVsYXRlZCB7CiAgICAgICAgICAgICAgICAldGVtcGxhdGUodmluKSBzdGQ6OnZlY3RvcjxpbnQ+OwogICAgICAgICAgICAgICAgdGVtcGxhdGUgY2xhc3Mgc3RkOjp2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICBXaGVuIHRoZSBzY29wZSBpcyBpbmNvcnJlY3QsIGFuIGVycm9yIG5vdyBvY2N1cnMgc3VjaCBhczoKCiAgICAgICAgICAgICAgY3BwX3RlbXBsYXRlX3Njb3BlLmk6MzQ6IEVycm9yOiAndmVjdG9yJyByZXNvbHZlcyB0byAnc3RkOjp2ZWN0b3InIGFuZAogICAgICAgICAgICAgIHdhcyBpbmNvcnJlY3RseSBpbnN0YW50aWF0ZWQgaW4gc2NvcGUgJ3VucmVsYXRlZCcgaW5zdGVhZCBvZiB3aXRoaW4gc2NvcGUgJ3N0ZCcuCgogICAgICAgICAgICBQcmV2aW91c2x5IFNXSUcgYWNjZXB0ZWQgdGhlIGlsbC1mb3JtZWQgZXhhbXBsZXMgYWJvdmUgYnV0IHRoaXMgbGVkIHRvCiAgICAgICAgICAgIG51bWVyb3VzIHN1YnRsZSB0ZW1wbGF0ZSBzY29wZSBwcm9ibGVtcyBlc3BlY2lhbGx5IGluIHRoZSBwcmVzZW5jZSBvZgogICAgICAgICAgICB1c2luZyBkZWNsYXJhdGlvbnMgYW5kIHVzaW5nIGRpcmVjdGl2ZXMgYXMgd2VsbCBhcyB3aXRoICVmZWF0dXJlIGFuZCAldHlwZW1hcC4KCiAgICAgICAgICAgIEFjdHVhbGx5LCBhIHZhbGlkIGluc3RhbnRpYXRpb24gaXMgb25lIHdoaWNoIGNvbmZvcm1zIHRvIHRoZSBDKyswMwogICAgICAgICAgICBzdGFuZGFyZCBhcyBDKysxMSBtYWRlIGEgY2hhbmdlIHRvIGRpc2FsbG93IHVzaW5nIGRlY2xhcmF0aW9ucyBhbmQKICAgICAgICAgICAgdXNpbmcgZGlyZWN0aXZlcyB0byBmaW5kIGEgdGVtcGxhdGUuCgogICAgICAgICAgICAgIC8vIHZhbGlkIEMrKzAzLCBpbGwtZm9ybWVkIEMrKzExCiAgICAgICAgICAgICAgdXNpbmcgc3RkOjp2ZWN0b3I7CiAgICAgICAgICAgICAgdGVtcGxhdGUgY2xhc3MgdmVjdG9yPGludD47CgogICAgICAgICAgICBTaW1pbGFyIGZpeGVzIGZvciBkZWZpbmluZyBjbGFzc2VzIHVzaW5nIGZvcndhcmQgY2xhc3MgcmVmZXJlbmNlcyBoYXZlCiAgICAgICAgICAgIGFsc28gYmVlbiBwdXQgaW4gcGxhY2UuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2UxIHsKICAgICAgICAgICAgICAgIHN0cnVjdCBBOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2UyIHsKICAgICAgICAgICAgICAgIHN0cnVjdCBTcGFjZTE6OkEgewogICAgICAgICAgICAgICAgICB2b2lkIHgoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CgogICAgICAgICAgICB3aWxsIG5vdyBlcnJvciBvdXQgd2l0aDoKCiAgICAgICAgICAgICAgY3BwX2NsYXNzX2RlZmluaXRpb24uaTo1OiBFcnJvcjogJ1NwYWNlMTo6QScgcmVzb2x2ZXMgdG8gJ1NwYWNlMTo6QScgYW5kCiAgICAgICAgICAgICAgd2FzIGluY29ycmVjdGx5IGluc3RhbnRpYXRlZCBpbiBzY29wZSAnU3BhY2UyJyBpbnN0ZWFkIG9mIHdpdGhpbiBzY29wZSAnU3BhY2UxJy4KCiAgICAgICAgICAgIFByZXZpb3VzbHkgc29tZSBzeW1ib2xzIHdvdWxkIGhhdmUgYmVlbiBpbnN0YW50aWF0ZWQgaW4gdGhlIHdyb25nIHNjb3BlIGFuZCBsZWQKICAgICAgICAgICAgdG8gbG90cyBvZiBzY29wZSBwcm9ibGVtcyBpbnZvbHZpbmcgU1dJRyB0eXBlbWFwcywgZmVhdHVyZXMsIHJlbmFtZXMgZXRjLgogICAgICAgICAgICBZb3Ugd2lsbCBuZWVkIHRvIGNvcnJlY3QgdGhlIHNjb3BlIHVzZWQgaW4gb3RoZXIgU1dJRyBkaXJlY3RpdmVzIHdoaWNoIGRvIG5vdAogICAgICAgICAgICBzdXBwb3J0ICd1c2luZyBkZWNsYXJhdGlvbnMnIGFuZCAndXNpbmcgZGlyZWN0aXZlcycuIEZvciBleGFtcGxlLCBpZiB5b3UgcHJldmlvdXNseSBoYWQ6CgogICAgICAgICAgICAgICVyZW5hbWUoWmFwKSB2ZWN0b3I8aW50Pjo6Y2xlYXI7CiAgICAgICAgICAgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKICAgICAgICAgICAgICAldGVtcGxhdGUoVmVjdG9ySW50KSB2ZWN0b3I8aW50PjsKCiAgICAgICAgICAgIFByaW9yIHZlcnNpb25zIG9mIFNXSUcgaW5jb3JyZWN0bHkgaW5zdGFudGlhdGVkIHZlY3RvcjxpbnQ+IGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlCiAgICAgICAgICAgIGFuZCBzbyB0aGUgJXJlbmFtZSBtYXRjaGVkLiBOb3cgdGhlIHRlbXBsYXRlIGlzIGluc3RhbnRpYXRlZCBpbiB0aGUgY29ycmVjdCBuYW1lc3BhY2UsCiAgICAgICAgICAgIHNvIGlzIGZ1bGx5IHF1YWxpZmllZCBhcyBzdGQ6OnZlY3RvcjxpbnQ+LiBUaGUgb3RoZXIgU1dJRyBkaXJlY3RpdmVzIG5lZWQgY29ycmVjdGluZyBhcwogICAgICAgICAgICB0aGV5IGRvIG5vdCBmb2xsb3cgJ3VzaW5nIGRlY2xhcmF0aW9ucycgYW5kICd1c2luZyBkaXJlY3RpdmVzJy4gQ2hhbmdlIGl0IHRvOgoKICAgICAgICAgICAgICAlcmVuYW1lKFphcCkgc3RkOjp2ZWN0b3I8aW50Pjo6Y2xlYXI7CiAgICAgICAgICAgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKICAgICAgICAgICAgICAldGVtcGxhdGUodmluKSB2ZWN0b3I8aW50PjsKCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTctMDgtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzY29wZSBsb29rdXAgZm9yIHRlbXBsYXRlIHBhcmFtZXRlcnMgY29udGFpbmluZyB1bmFyeSBzY29wZSBvcGVyYXRvcnMuCgogICAgICAgICAgICBGaXhlcyBjYXNlcyBsaWtlOgoKICAgICAgICAgICAgbmFtZXNwYWNlIEFsbG9jIHsKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgUmViaW5kIHsKICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IEludGVnZXI7CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICAldGVtcGxhdGUoUmViaW5kQnVja2V0KSBBbGxvYzo6UmViaW5kPCBCdWNrZXQgPjsKICAgICAgICAgICAgT1IKICAgICAgICAgICAgJXRlbXBsYXRlKFJlYmluZEJ1Y2tldCkgQWxsb2M6OlJlYmluZDwgOjpCdWNrZXQgPjsKCiAgICAgICAgICAgIEFsbG9jOjpSZWJpbmQ8IEJ1Y2tldCA+OjpJbnRlZ2VyIEJ1Y2tldDEoKTsKICAgICAgICAgICAgQWxsb2M6OlJlYmluZDwgOjpCdWNrZXQgPjo6SW50ZWdlciBCdWNrZXQyKCk7CiAgICAgICAgICAgIEFsbG9jOjpSZWJpbmQ8Ojp0ZW1wbGF0ZSBUZW1wbGF0ZUJ1Y2tldDxkb3VibGU+Pjo6SW50ZWdlciBCdWNrZXQzKCk7CgoyMDE3LTA4LTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBGb3IgdGVtcGxhdGVzIG9ubHksIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGFyZSBmdWxseSByZXNvbHZlZCB3aGVuCiAgICAgICAgICAgIGhhbmRsaW5nIHR5cGVtYXBzLiBXaXRob3V0IHRoaXMsIGl0IGlzIHRvbyBoYXJkIHRvIGhhdmUgZGVjZW50IHJ1bGVzCiAgICAgICAgICAgIHRvIGFwcGx5IHR5cGVtYXBzIHdoZW4gcGFyYW1ldGVyIHR5cGVzIGFyZSB0eXBlZGVmJ2QgYW5kIHRlbXBsYXRlCiAgICAgICAgICAgIHBhcmFtZXRlcnMgaGF2ZSBkZWZhdWx0IHZhbHVlcy4KCiAgICAgICAgICAgIEZpeGVzICVjbGVhciBmb3IgdHlwZWRlZnMgaW4gdGVtcGxhdGVzLCBlZzoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoImluIikgWFhYPGludD46OkxvbmcgIi4uLiIKICAgICAgICAgICAgICB0ZW1wbGF0ZSB0eXBlbmFtZTxUPiBzdHJ1Y3QgWFhYIHsKICAgICAgICAgICAgICAgIHR5cGVkZWYgbG9uZyBMb25nOwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgJWNsZWFyIFhYWDxpbnQ+OjpMb25nOwoKICAgICAgICAgICAgYXMgdGhlIHR5cGVtYXAgd2FzIHByZXZpb3VzbHkgaW5jb3JyZWN0bHkgc3RvcmVkIGFzIGEgdHlwZW1hcCBmb3IgbG9uZwogICAgICAgICAgICBpbnN0ZWFkIG9mIFhYWDxpbnQ+OjpMb25nLgoKMjAxNy0wOC0wNTogb2xseQoJICAgIFtDKysxMV0gQWxsb3cgc3RhdGljX2Fzc2VydCBhdCB0aGUgdG9wIGxldmVsIChhbmQgZGlzYWxsb3cgaXQgcmlnaHQKCSAgICBhZnRlciB0ZW1wbGF0ZTxUPikuICBGaXhlcyBpc3N1ZSAxMDMxIHJlcG9ydGVkIGJ5IEFydGVtIFYgTC4KCjIwMTctMDgtMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBpbmNvcnJlY3RseSBzaG93biB3YXJuaW5nIHdoZW4gYW4gZW1wdHkgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiB3YXMgdXNlZCBvbiBhCiAgICAgICAgICAgIGNsYXNzIHVzZWQgYXMgYSBiYXNlIGNsYXNzIGFuZCB0aGF0IGJhc2UgY2xhc3Mgd2FzIGV4cGxpY2l0bHkgaWdub3JlZCB3aXRoICVpZ25vcmUuCiAgICAgICAgICAgIEV4YW1wbGUgb2YgdGhlIHdhcm5pbmcgd2hpY2ggd2lsbCBubyBsb25nZXIgYXBwZWFyOgoKICAgICAgICAgICAgICBXYXJuaW5nIDQwMTogQmFzZSBjbGFzcyAnRnVuY3RvcjwgaW50LGludCA+JyBoYXMgbm8gbmFtZSBhcyBpdCBpcyBhbiBlbXB0eQogICAgICAgICAgICAgIHRlbXBsYXRlIGluc3RhbnRpYXRlZCB3aXRoICcldGVtcGxhdGUoKScuIElnbm9yZWQuCgoyMDE3LTA3LTE3OiBmZmxleG8KICAgICAgICAgICAgW0phdmFdICM2NzQgQWRkIHN0ZF9saXN0LmkgdG8gYWRkIHN1cHBvcnQgZm9yIHN0ZDo6bGlzdCBjb250YWluZXJzLiBUaGUgSmF2YSBwcm94eQogICAgICAgICAgICBleHRlbmRzIGphdmEudXRpbC5BYnN0cmFjdFNlcXVlbnRpYWxMaXN0IGFuZCBtYWtlcyB0aGUgQysrIHN0ZDo6bGlzdCBjb250YWluZXIgbG9vawogICAgICAgICAgICBhbmQgZmVlbCBtdWNoIGxpa2UgYSBqYXZhLnV0aWwuTGlua2VkTGlzdCBmcm9tIEphdmEuCgoyMDE3LTA3LTA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggZGlzcGxheSBvZiBkb2N1bWVudGVkIHRlbXBsYXRlIHR5cGVzIHdoZW4gdXNpbmcgdGhlIGF1dG9kb2MKICAgICAgICAgICAgZmVhdHVyZS4gRm9yIGV4YW1wbGUgd2hlbiB3cmFwcGluZzoKCiAgICAgICAgICAgICAgJWZlYXR1cmUoImF1dG9kb2MiKTsKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBYPiBzdHJ1Y3QgVCB7fTsKICAgICAgICAgICAgICAldGVtcGxhdGUoVEludGVnZXIpIFQ8aW50PjsKCiAgICAgICAgICAgIHRoZSBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiBjb250YWluczoKICAgICAgICAgICAgICAiIiJQcm94eSBvZiBDKysgVDwgaW50ID4gY2xhc3MuIiIiCiAgICAgICAgICAgIGluc3RlYWQgb2Y6CiAgICAgICAgICAgICAgIiIiUHJveHkgb2YgQysrIFQ8KGludCk+IGNsYXNzLiIiIgogICAgICAgICAgICBhbmQKICAgICAgICAgICAgICAiIiJfX2luaXRfXyhUSW50ZWdlciBzZWxmKSAtPiBUSW50ZWdlciIiIgogICAgICAgICAgICBpbnN0ZWFkIG9mCiAgICAgICAgICAgICAgIiIiX19pbml0X18oVDwoaW50KT4gc2VsZikgLT4gVEludGVnZXIiIiIKCjIwMTctMDYtMjc6IG5paGFsbgoJICAgIFtQSFBdIFVwZGF0ZSB0aGUgT1VUUFVUIFR5cGVtYXAgdG8gYWRkIHJldHVybiBzdGF0ZW1lbnQgdG8gdGhlCgkgICAgUEhQIFdyYXBwZXIuCgoyMDE3LTA2LTI3OiBuaWhhbG4KCSAgICBbUEhQXSBVcGRhdGUgdGhlIGVudW0gYW5kIHZhbHVlIGV4YW1wbGVzIHRvIHVzZSB0aGUgT08gd3JhcHBlcnMKCSAgICByYXRoZXIgdGhhbiB0aGUgZmxhdCBmdW5jdGlvbnMgcHJvZHVjZWQgd2l0aCAtbm9wcm94eS4gIFRoZXJlJ3MKCSAgICBub3QgYmVlbiBhIGdvb2QgcmVhc29uIHRvIHVzZSAtbm9wcm94eSBmb3Igc2luY2UgUEhQNSBPTyB3cmFwcGluZwoJICAgIHdhcyBmaXhlZCBiYWNrIGluIDIwMDUuCgoyMDE3LTA2LTIzOiBtN3Rob24KICAgICAgICAgICAgW1B5dGhvbl0gZml4IGFuZCBpbXByb3ZlIGRlZmF1bHQgYXJndW1lbnQgaGFuZGxpbmc6CgogICAgICAgICAgICAxLiBGaXggbmVnYXRpdmUgb2N0YWxzLiBDdXJyZW50bHkgbm90IGhhbmRsZWQgY29ycmVjdGx5IGJ5IGAtcHkzYAogICAgICAgICAgICAgICAodW51c3VhbCBjYXNlLCBidXQgaW5jb3JyZWN0KS4KICAgICAgICAgICAgMi4gRml4IGFyZ3VtZW50cyBvZiB0eXBlICJvY3RhbCArIHNvbWV0aGluZyIgKGUuZy4gYDA2NDAgfCAwNGApLgogICAgICAgICAgICAgICBDdXJyZW50bHkgZHJvcHMgZXZlcnl0aGluZyBhZnRlciB0aGUgZmlyc3Qgb2N0YWwuIE5hc3R5IQogICAgICAgICAgICAzLiBGaXggYm9vbCBhcmd1bWVudHMgIjAgKyBzb21ldGhpbmciIChlLmcuIGAwIHwgMWApIGFyZSBhbHdheXMKICAgICAgICAgICAgICAgIkZhbHNlIiAodW51c3VhbCBjYXNlLCBidXQgaW5jb3JyZWN0KS4KICAgICAgICAgICAgNC4gUmVtb3ZlIHNwZWNpYWwgaGFuZGxpbmcgb2YgIlRSVUUiIGFuZCAiRkFMU0UiIGZyb20KICAgICAgICAgICAgICAgYGNvbnZlcnRWYWx1ZWAgc2luY2UgdGhlcmUncyBubyByZWFzb24gdGhlc2UgaGF2ZSB0byBtYXRjaAogICAgICAgICAgICAgICAidHJ1ZSIgYW5kICJmYWxzZSIuCiAgICAgICAgICAgIDUuIFJlbW92ZSB0aGUgUHl0aG9uIDIgdnMuIFB5dGhvbiAzIGRpc3RpbmN0aW9uIGJhc2VkIG9uIHRoZQogICAgICAgICAgICAgICBgLXB5M2AgZmxhZy4gTm93IHRoZSBzYW1lIHB5dGhvbiBjb2RlIGlzIHByb2R1Y2VkIGZvciBkZWZhdWx0CiAgICAgICAgICAgICAgIGFyZ3VtZW50cyBmb3IgUHl0aG9uIDIgYW5kIFB5dGhvbiAzLiBGb3IgdGhpcywgb2N0YWwgZGVmYXVsdAogICAgICAgICAgICAgICBhcmd1bWVudHMsIGUuZy4gMDY0NCwgYXJlIG5vdyB3cmFwcGVkIGFzIGBpbnQoJzY0NCcsIDgpYC4gVGhpcwogICAgICAgICAgICAgICBpcyByZXF1aXJlZCwgYXMgUHl0aG9uIDIgYW5kIFB5dGhvbiAzIGhhdmUgaW5jb21wYXRpYmxlIHN5bnRheAogICAgICAgICAgICAgICBmb3Igb2N0YWwgbGl0ZXJhbHMuCgogICAgICAgICAgICBGaXhlcyAjNzA3CgoyMDE3LTA2LTIxOiBmdXRhdHVraQogICAgICAgICAgICAjMTAwNCAtIEZpeCBjY2FjaGUtc3dpZyBleGVjdXRhYmxlIG5hbWUgdG8gcmVzcGVjdCBjb25maWd1cmUncyAtLXByb2dyYW0tcHJlZml4IGFuZAogICAgICAgICAgICAtLXByb2dyYW0tc3VmZml4IHZhbHVlcyBpZiB1c2VkLgoKMjAxNy0wNi0yMTogdGFtdXJhdGFrCiAgICAgICAgICAgIFtSdWJ5XSAjOTExIC0gQWRkIHN0ZDo6d3N0cmluZyBzdXBwb3J0LgoKMjAxNy0wNi0xOTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4IGhhbmRsaW5nIG9mIHJpY2ggY29tcGFyaXNvbnMgd2hlbiB3cmFwcGluZyBvdmVybG9hZGVkIG9wZXJhdG9yczoKCiAgICAgICAgICAgICAgb3BlcmF0b3I8ICBvcGVyYXRvcjw9ICBvcGVyYXRvcj4gIG9wZXJhdG9yPj0gIG9wZXJhdG9yPT0gIG9wZXJhdG9yIT0KCiAgICAgICAgICAgIFByZXZpb3VzbHkgYSBUeXBlRXJyb3Igd2FzIGFsd2F5cyB0aHJvd24gaWYgdGhlIHR5cGUgd2FzIG5vdCBjb3JyZWN0LiBOb3RJbXBsZW1lbnRlZAogICAgICAgICAgICBpcyBub3cgcmV0dXJuZWQgZnJvbSB0aGVzZSB3cmFwcGVkIGZ1bmN0aW9ucyBpZiB0aGUgdHlwZSBiZWluZyBjb21wYXJlZCB3aXRoIGlzCiAgICAgICAgICAgIG5vdCBjb3JyZWN0LiBUaGUgc3Vic2VxdWVudCBiZWhhdmlvdXIgdmFyaWVzIGJldHdlZW4gZGlmZmVyZW50IHZlcnNpb25zIG9mIFB5dGhvbgogICAgICAgICAgICBhbmQgdGhlIGNvbXBhcmlzb24gZnVuY3Rpb24gYmVpbmcgdXNlZCwgYnV0IGlzIG5vdyBjb25zaXN0ZW50IHdpdGggbm9ybWFsIFB5dGhvbgogICAgICAgICAgICBiZWhhdmlvdXIuIEZvciBleGFtcGxlLCBmb3IgdGhlIGZpcnN0IDQgb3BlcmF0b3Igb3ZlcmxvYWRzIGFib3ZlLCBhIFR5cGVFcnJvcgogICAgICAgICAgICAndW5vcmRlcmFibGUgdHlwZXMnIGlzIHRocm93biBpbiBQeXRob24gMywgYnV0IFB5dGhvbiAyIHdpbGwgcmV0dXJuIFRydWUgb3IgRmFsc2UuCiAgICAgICAgICAgIE5vdEltcGxlbWVudGVkIHNob3VsZCBiZSByZXR1cm5lZCB3aGVuIHRoZSBjb21wYXJpc29uIGNhbm5vdCBiZSBkb25lLCBzZWUgUEVQIDIwNyBhbmQKICAgICAgICAgICAgaHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvMy9saWJyYXJ5L2NvbnN0YW50cy5odG1sI05vdEltcGxlbWVudGVkCgogICAgICAgICAgICBOb3RlIHRoYXQgdGhlIGJ1ZyB3YXMgb25seSBwcmVzZW50IHdoZW4gb3ZlcmxvYWRlZCBvcGVyYXRvcnMgZGlkIG5vdCBhbHNvIGhhdmUgYQogICAgICAgICAgICBmdW5jdGlvbiBvdmVybG9hZC4KCiAgICAgICAgICAgIEZpeGVzIFNGIGJ1ZyAjMTIwOCAoMzQ0MTI2MikgYW5kIFNGIHBhdGNoICMzMDMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTctMDYtMTc6IGZhYnJpY2UxMDIKICAgICAgICAgICAgW0dvXSBGaXggR28gY2FsbGJhY2sgZXhhbXBsZS4gIEZpeGVzIGdpdGh1YiAjNjAwLCAjOTU1LCAjMTAwMC4KCjIwMTctMDYtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIE1ha2Ugc3VyZSB3YXJuaW5nIGFuZCBlcnJvciBtZXNzYWdlcyBhcmUgbm90IHNwbGl0IHVwIGJ5IG90aGVyIHByb2Nlc3NlcyB3cml0aW5nIHRvCiAgICAgICAgICAgIHN0ZG91dCBhdCB0aGUgc2FtZSB0aW1lLgoKMjAxNy0wNi0xNjogd3NmdWx0b24KICAgICAgICAgICAgW1JdIEZpeCB3cmFwcGluZyBmdW5jdGlvbiBwb2ludGVycyBjb250YWluaW5nIHJ2YWx1ZSBhbmQgbHZhbHVlIHJlZmVyZW5jZSBwYXJhbWV0ZXJzLgoKMjAxNy0wNi0xMzogb2xseQoJICAgIFtQZXJsXSBGaXggdGVzdHN1aXRlIHRvIHdvcmsgd2l0aG91dCAuIGluIEBJTkMgLSBpdCB3YXMgcmVtb3ZlZCBpbgoJICAgIFBlcmwgNS4yNiBmb3Igc2VjdXJpdHkgcmVhc29ucywgYW5kIGhhcyBhbHNvIGJlZW4gcmVtb3ZlZCBmcm9tCgkgICAgb2xkZXIgdmVyc2lvbnMgaW4gc29tZSBkaXN0cm9zLiAgRml4ZXMgIzk5NyByZXBvcnRlZCBieSBsZmFtLgoKMjAxNy0wNi0wMzogd3NmdWx0b24KICAgICAgICAgICAgRml4ICVpbXBvcnQgb24gYSBmaWxlIGNvbnRhaW5pbmcgYSBmaWxlIHNjb3BlICVmcmFnbWVudCBmb3JjZWQgaW5jbHVzaW9uIHRvIG5vdAogICAgICAgICAgICBnZW5lcmF0ZSB0aGUgZnJhZ21lbnQgY29udGVudHMgYXMgJWltcG9ydCBzaG91bGQgbm90IHJlc3VsdCBpbiBjb2RlIGJlaW5nIGdlbmVyYXRlZC4KICAgICAgICAgICAgVGhlIGJlaGF2aW91ciBpcyBub3cgdGhlIHNhbWUgYXMgaW1wb3J0aW5nIGNvZGUgaW5zZXJ0aW9uIGJsb2Nrcy4KICAgICAgICAgICAgV3JhcHBpbmcgRmlsZUMuaSBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUgd2lsbCByZXN1bHQgaW4gbm8gZ2VuZXJhdGVkIGNvZGUsIHdoZXJlYXMKICAgICAgICAgICAgcHJldmlvdXNseSAiI2luY2x1ZGUgPGxpbWl0cy5oPiIgd2FzIGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgLy8gRmlsZUEuaQogICAgICAgICAgICAgICVmcmFnbWVudCgiPGxpbWl0cy5oPiIsICJoZWFkZXIiKSAlewogICAgICAgICAgICAgICAgI2luY2x1ZGUgPGxpbWl0cy5oPgogICAgICAgICAgICAgICV9CgogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgICAjaW5jbHVkZSA8c3RkaW8uaD4KICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgICVmcmFnbWVudCgiPGxpbWl0cy5oPiIpOwoKICAgICAgICAgICAgICAvLyBGaWxlQy5pCiAgICAgICAgICAgICAgJWltcG9ydCAiRmlsZUEuaSIKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxNy0wNS0yNjogVm9sa2VyIERpZWxzLUdyYWJzY2gsIHZhZHoKICAgICAgICAgICAgW0phdmFdICM4NDIgRXh0ZW5kIGZyb20gamF2YS51dGlsLkFic3RyYWN0TGlzdDw+IGFuZCBpbXBsZW1lbnQgamF2YS51dGlsLlJhbmRvbUFjY2VzcyBmb3IKICAgICAgICAgICAgc3RkOjp2ZWN0b3Igd3JhcHBlcnMuIFRoaXMgbm90YWJseSBhbGxvd3MgdG8gaXRlcmF0ZSBvdmVyIHdyYXBwZWQgdmVjdG9ycyBpbiBhIG5hdHVyYWwgd2F5LgogICAgICAgICAgICBOb3RlIHRoYXQgYm94ZWQgdHlwZXMgYXJlIG5vdyB1c2VkIGluIHRoZSBKYXZhIGxheWVyIHdoZW4gd3JhcHBpbmcgdmVjdG9yIG9mIEMgcHJpbWl0aXZlCiAgICAgICAgICAgIHR5cGVzLCBmb3IgZXhhbXBsZS4gVGhpcyBtYXkgaW50cm9kdWNlIHNvbWUgc3VidGxlIGluY29tcGF0aWJpbGl0aWVzIGR1ZSB0byBzb21lCiAgICAgICAgICAgIGRpZmZlcmVuY2VzIGluIGhvdyBKYXZhIGNvbnZlcnRzIGJveGVkIHR5cGVzIGFuZCB1bmJveGVkIHR5cGVzLiBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgICAgaW50IGk9MDsKICAgICAgICAgICAgICBkb3VibGUgZDEgPSBpOyAvLyBvawogICAgICAgICAgICAgIERvdWJsZSBkMiA9IGk7IC8vIGVycm9yOiBpbmNvbXBhdGlibGUgdHlwZXM6IGludCBjYW5ub3QgYmUgY29udmVydGVkIHRvIERvdWJsZQoKICAgICAgICAgICAgVGhpcyBjYW4gYmUgYSBwcm9ibGVtIHdoZW4gY2FsbGluZyB0aGUgYWRkIGFuZCBzZXQgZnVuY3Rpb25zLiBBIHN1Z2dlc3RlZCBiYWNrd2FyZHMKICAgICAgICAgICAgY29tcGF0aWJsZSB3b3JrYXJvdW5kIGlzIHRvIHVzZSBzb21ldGhpbmcgbGlrZSAoc2hvd24gZm9yIHN0ZDo6dmVjdG9yPGRvdWJsZT46CgogICAgICAgICAgICAgICNpZiBkZWZpbmVkKFNXSUdKQVZBKQogICAgICAgICAgICAgIC8vIEFkZCBpbiBvbGQgYXBpIHRoYXQgdXNlcyBub24tYm94ZWQgdHlwZXMKICAgICAgICAgICAgICAlZXh0ZW5kIHN0ZDo6dmVjdG9yPGRvdWJsZT4gewogICAgICAgICAgICAgICVwcm94eWNvZGUgJXsKICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFkZChkb3VibGUgeCkgewogICAgICAgICAgICAgICAgICBhZGQoRG91YmxlLnZhbHVlT2YoeCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0KGludCBpLCBkb3VibGUgdmFsKSB7CiAgICAgICAgICAgICAgICAgIHNldChpLCBEb3VibGUudmFsdWVPZih2YWwpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAjZW5kaWYKCiAgICAgICAgICAgICAgJWluY2x1ZGUgInN0ZF92ZWN0b3IuaSIKICAgICAgICAgICAgICAldGVtcGxhdGUoVmVjdG9yRG91YmxlKSBzdGQ6OnZlY3Rvcjxkb3VibGU+OwoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE3LTA1LTMwOiBkYXZpZGNsCiAgICAgICAgICAgIFtTY2lsYWJdICM5OTQgVW5kZWZpbmVkIHN5bWJvbCBlcnJvciB3aGVuIGxvYWRpbmcgaW4gU2NpbGFiIDYKCjIwMTctMDUtMjU6IGFzaWJyb3NzCiAgICAgICAgICAgIFtKYXZhXSAjMzcwICM0MTcgTWlzc2luZyBzbWFydCBwb2ludGVyIGhhbmRsaW5nIGluIEphdmEgZGlyZWN0b3IgZXh0cmEgbWV0aG9kcwogICAgICAgICAgICBzd2lnUmVsZWFzZU93bmVyc2hpcCgpIGFuZCBzd2lnVGFrZU93bmVyc2hpcCgpLgoKMjAxNy0wNS0yMzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdICMyMzAgIzc1OSBGaXggSmF2YSBzaGFyZWRfcHRyIGFuZCBkaXJlY3RvcnMgZm9yIGRlcml2ZWQgY2xhc3NlcyBqYXZhIGNvbXBpbGF0aW9uCiAgICAgICAgICAgIGVycm9yLgoKICAgICAgICAgICAgRm9yIHNoYXJlZF9wdHIgcHJveHkgcHJveHkgY2xhc3NlcywgYWRkIGEgcHJvdGVjdGVkIG1ldGhvZCBzd2lnU2V0Q01lbU93biBmb3IgbW9kaWZ5aW5nCiAgICAgICAgICAgIHRoZSBzd2lnQ01lbU93biBhbmQgc3dpZ0NNZW1Pd25EZXJpdmVkIG1lbWJlciB2YXJpYWJsZXMgd2hpY2ggYXJlIHVzZWQgYnkgdmFyaW91cyBvdGhlcgogICAgICAgICAgICBtZXRob2RzIGZvciBjb250cm9sbGluZyBtZW1vcnkgb3duZXJzaGlwLgoKMjAxNy0wNS0yMTogU2doaXJhdGUKICAgICAgICAgICAgW0phdmEsIEMjLCBEXSAjNDQ5IFJlbW92ZSB1bm5lY2Vzc2FyeSB1c2Ugb2YgZHluYW1pY19jYXN0IGluIGRpcmVjdG9ycyB0byBlbmFibGUKICAgICAgICAgICAgbm9uLVJUVEkgY29tcGlsYXRpb24uCgoyMDE3LTA1LTIxOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjOTkzIEZpeCBoYW5kbGluZyBvZiBkZWZhdWx0IC12ZSB1bnNpZ25lZCB2YWx1ZXMsIHN1Y2ggYXM6CiAgICAgICAgICAgICAgdm9pZCBmKHVuc2lnbmVkID0gLTFVKTsKCjIwMTctMDUtMjA6IGpzY2h1ZWxsZXIKICAgICAgICAgICAgW1B5dGhvbl0gIzk5MSBGaXggRTczMSBQRVA4IHdhcm5pbmc6IGRvIG5vdCBhc3NpZ24gYSBsYW1iZGEgZXhwcmVzc2lvbgoKMjAxNy0wNS0xNjogbmloYWw5NQogICAgICAgICAgICBbUEhQXSBBZGQgJXByYWdtYSB2ZXJzaW9uIGRpcmVjdGl2ZSB0byBhbGxvdyB0aGUgdmVyc2lvbiBvZiB0aGUKICAgICAgICAgICAgZXh0ZW5zaW9uIHRvIGJlIHNldC4gIFBhdGNoICM5NzAsIGZpeGVzICMzNjAuCgoyMDE3LTA1LTEzOiB5YWcwMAogICAgICAgICAgICBQYXRjaCAjOTc1IC0gQWRkIHN1cHBvcnQgZm9yIG5vZXhjZXB0IG9uIGRpcmVjdG9yIG1ldGhvZHMuCgoyMDE3LTA0LTI3OiByZWRicmFpbgogICAgICAgICAgICBJc3N1ZSAjOTc0LCBQYXRjaCAjOTc2IC0gRml4IHByZXByb2Nlc3NvciBoYW5kbGluZyBvZiBtYWNyb3Mgd2l0aCBjb21tYXMgaW4gYSBjb21tZW50LgoKMjAxNy0wNC0yNTogamxldmVxdWUKICAgICAgICAgICAgW0x1YV0gIzk1OSAtIEZpeCBWaXN1YWwgU3R1ZGlvIEM0MjQ0IGNvbnZlcnNpb24gd2FybmluZ3MgaW4gTHVhIHdyYXBwZXJzLgoKMjAxNy0wNC0yMTogdGFtdXJhdGFrCiAgICAgICAgICAgIFtSdWJ5XSAjOTY0IC0gQWRkIHNoYXJlZF9wdHIgZGlyZWN0b3IgdHlwZW1hcHMuCgoyMDE3LTA0LTIwOiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gIzU4NiwgIzkzNSBBZGQgYXNzZXJ0IGZvciBpbnZhbGlkIE5VTEwgdHlwZSBwYXJhbWV0ZXIgd2hlbiBjYWxsaW5nIFNXSUdfUnVieV9OZXdQb2ludGVyT2JqLgoKMjAxNy0wNC0yMDogdGFtdXJhdGFrCiAgICAgICAgICAgIFtSdWJ5XSAjOTMwLCAjOTM3IC0gRml4IGNvbnRhaW5lcnMgb2Ygc3RkOjpzaGFyZWRfcHRyLgogICAgICAgICAgICBVcGNhc3RpbmcsIGNvbnN0IHR5cGVzIChlZyB2ZWN0b3I8c2hhcmVkX3B0cjxjb25zdCBUPj4pIGFuZCBOVUxML251bGxwdHIgc3VwcG9ydCBhZGRlZC4KCjIwMTctMDQtMTI6IHNtYXJjaGV0dG8KICAgICAgICAgICAgW1NjaWxhYl0gTmV3IHBhcmFtZXRlciB0YXJnZXR2ZXJzaW9uIHRvIHNwZWNpZnkgdGhlIFNjaWxhYiB0YXJnZXQgdmVyc2lvbiAoNSwgNiwgLi4pIGZvciBjb2RlIGdlbmVyYXRpb24KICAgICAgICAgICAgV2l0aCBTY2lsYWIgNiB0YXJnZXQgc3BlY2lmaWVkLCBpZGVudGlmaWVyIG5hbWVzIHRydW5jYXRpb24gaXMgZGlzYWJsZWQgKG5vIGxvbmdlciBuZWNlc3NhcnkpCgoyMDE3LTAzLTI0OiB0YW11cmF0YWsKICAgICAgICAgICAgW1J1YnldIEZpeCAjOTM5IC0gV3JhcHBpbmcgc3RkOjp2ZWN0b3I8Ym9vbD4gZml4IGR1ZSB0byBpbmNvcnJlY3QgbnVsbCBjaGVja3MKICAgICAgICAgICAgb24gVkFMVUUgb2JqLgoKMjAxNy0wMy0xNzogdmFkegogICAgICAgICAgICBbQyNdICM5NDcgQWRkIHN1cHBvcnQgZm9yIHN0ZDo6Y29tcGxleDxUPgoKMjAxNy0wMy0xNzogd3NmdWx0b24KICAgICAgICAgICAgW0dvXSBGaXggaGFuZGxpbmcgb2YgdHlwZWRlZidkIGZ1bmN0aW9uIHBvaW50ZXJzIGFuZCB0eXBlZGVmJ2QgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzCiAgICAgICAgICAgIHN1Y2ggYXM6CgogICAgICAgICAgICAgIHR5cGVkZWYgaW50ICgqRm5QdHJfdGQpKGludCwgaW50KTsKICAgICAgICAgICAgICBpbnQgZG9fb3AoaW50IHgsIGludCB5LCBGblB0cl90ZCBvcCk7CgoyMDE3LTAzLTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgc3VwcG9ydCBmb3IgbWVtYmVyIGNvbnN0IGZ1bmN0aW9uIHBvaW50ZXJzIHN1Y2ggYXM6CgogICAgICAgICAgICAgIGludCBmbihzaG9ydCAoRnVuY3M6OiogcGFybSkoYm9vbCkpIGNvbnN0OwoKICAgICAgICAgICAgQWxzbyBmaXggcGFyc2luZyBvZiByZWZlcmVuY2VzL3BvaW50ZXJzIGFuZCBxdWFsaWZpZXJzIHRvIG1lbWJlcgogICAgICAgICAgICBwb2ludGVycyBzdWNoIGFzOgoKICAgICAgICAgICAgICBpbnQgZm4oc2hvcnQgKEZ1bmNzOjoqIGNvbnN0IHBhcm0pKGJvb2wpKTsKICAgICAgICAgICAgICBpbnQgZm4oc2hvcnQgKEZ1bmNzOjoqICYgcGFybSkoYm9vbCkpOwoKMjAxNy0wMy0xMDogd3NmdWx0b24KICAgICAgICAgICAgRXh0ZW5kIEMrKzExIGFsdGVybmF0ZSBmdW5jdGlvbiBzeW50YXggcGFyc2luZyB0byBzdXBwb3J0IGNvbnN0IGFuZCBub2V4Y2VwdCwgc3VjaCBhczoKCiAgICAgICAgICAgICAgYXV0byBzdW0xKGludCB4LCBpbnQgeSkgY29uc3QgLT4gaW50IHsgcmV0dXJuIHggKyB5OyB9CiAgICAgICAgICAgICAgYXV0byBzdW0yKGludCB4LCBpbnQgeSkgbm9leGNlcHQgLT4gaW50IHsgcmV0dXJuIHggKyB5OyB9CgoyMDE3LTAyLTI5OiB0YW11cmF0YWsKICAgICAgICAgICAgW1J1YnldICM5MTcgLSBBZGQgRW51bWVyYWJsZSBtb2R1bGUgdG8gYWxsIGNvbnRhaW5lciBjbGFzcyB3cmFwcGVycy4gSXQgd2FzIG1pc3NpbmcKICAgICAgICAgICAgZm9yIHN0ZDo6bGlzdCwgc3RkOjptdWx0aXNldCwgc3RkOjp1bm9yZGVyZWRfbXVsdGlzZXQgYW5kIHN0ZDo6dW5vcmRlcmVkX21hcC4KCjIwMTctMDItMjc6IGFzc2FtYmFyCiAgICAgICAgICAgIFtDKysxMV0gRXh0ZW5kIHBhcnNlciB0byBzdXBwb3J0IHRocm93IHNwZWNpZmllciBpbiBjb21iaW5hdGlvbgogICAgICAgICAgICB3aXRoIG92ZXJyaWRlIGFuZC9vciBmaW5hbC4KCjIwMTctMDItMTA6IHRhbXVyYXRhawogICAgICAgICAgICBbUnVieV0gIzg4MyAtIEFkZCBzdXBwb3J0IGZvciBDKysxMSBoYXNoIHRhYmxlczoKICAgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXAKICAgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQKICAgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9tdWx0aW1hcAogICAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX211bHRpc2V0CgoyMDE3LTAyLTA4OiBqY3NoYXJwCiAgICAgICAgICAgIFtDI10gIzg4NyBJbXByb3ZlIHN0ZDo6dmVjdG9yPFQ+IHdyYXBwZXIgY29uc3RydWN0b3JzIC0KICAgICAgICAgICAgUmVwbGFjZSBjb25zdHJ1Y3RvciB0YWtpbmcgSUNvbGxlY3Rpb24gd2l0aCBJRW51bWVyYWJsZSBhbmQgYWxzbyBhZGQgSUVudW1lcmFibGU8VD4KICAgICAgICAgICAgY29uc3RydWN0b3IgdG8gYXZvaWQgdGhlIGJveGluZyBhbmQgdW5ib3hpbmcgb3ZlcmhlYWQgb2YgdGhlIG9yaWdpbmFsIGNvbnN0cnVjdG9yLAogICAgICAgICAgICB3aGVuIHRoZSB0eXBlIHBhcmFtZXRlciBpcyBhIHZhbHVlIHR5cGUuCgpWZXJzaW9uIDMuMC4xMiAoMjcgSmFuIDIwMTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTctMDEtMjc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gIzg4MiBGaXggbWlzc2luZyBmaWxlbmFtZSBpbiBlcnJvciBtZXNzYWdlcyB3aGVuIHRoZXJlIGlzIGEgcHJvYmxlbQogICAgICAgICAgICB3cml0aW5nIG91dCBDIyBmaWxlcy4KCjIwMTctMDEtMjc6IGJyaWFuY2FpbmUKICAgICAgICAgICAgW0d1aWxlXSAjNzQ0IEZpeCBjb21waWxhdGlvbiBlcnJvcnMgaW4gR3VpbGUgd3JhcHBlcnMgLSByZWdyZXNzaW9uCiAgICAgICAgICAgIGludHJvZHVjZWQgaW4gc3dpZy0zLjAuMTEuCgoyMDE3LTAxLTI0OiBhbmRyZXktc3Rhcm9kdWJ0c2V2CiAgICAgICAgICAgIFtKYXZhXSBBcHBseSAjNzA0IC0gZGlyZWN0b3IgdHlwZW1hcCBpbXByb3ZlbWVudHMuCiAgICAgICAgICAgIE1lbW9yeSBsZWFrIGZpeGVzLCBhZGQgc3VwcG9ydCBmb3IgImRpcmVjdG9yYXJnb3V0IiB0eXBlbWFwIGFuZAogICAgICAgICAgICBhZGQgZGlyZWN0b3Igc3VwcG9ydCB0byB0eXBlbWFwcy5pLgoKMjAxNy0wMS0yNDogd3NmdWx0b24KICAgICAgICAgICAgRW5oYW5jZSAlZXh0ZW5kIHRvIGV4dGVuZCBhIGNsYXNzIHdpdGggdGVtcGxhdGUgY29uc3RydWN0b3JzLCBlZzoKCiAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAlZXh0ZW5kIHsKICAgICAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgICAgICAgICAgICAgICAgRm9vKGludCBhLCBUIGIpIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgJXRlbXBsYXRlKEZvbykgRm9vOjpGb288ZG91YmxlPjsKCjIwMTctMDEtMjI6IHdzZnVsdG9uCiAgICAgICAgICAgIElzc3VlICM4NzYgRW5oYW5jZSAlZXh0ZW5kIHRvIGV4dGVuZCBhIGNsYXNzIHdpdGggdGVtcGxhdGUgbWV0aG9kcywgZWc6CgogICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgJWV4dGVuZCB7CiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiAgICAgICAgICAgICAgICAgIHZvaWQgZG9fc3R1ZmYoaW50IGEsIFQgYikgewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAldGVtcGxhdGUoZG9fc3R1ZmZfaW5zdCkgRm9vOjpkb19zdHVmZjxkb3VibGU+OwoKICAgICAgICAgICAgICBTaW1pbGFybHkgZm9yIHN0YXRpYyB0ZW1wbGF0ZSBtZXRob2RzLgoKMjAxNy0wMS0yMjoga3d3ZXR0ZQogICAgICAgICAgICBbT2N0YXZlXSBhZGQgc3VwcG9ydCBmb3IgdmVyc2lvbiA0LjIKICAgICAgICAgICAgLSBUaGUgT2N0YXZlIEFQSSBub3cgdXNlcyBzb21lIEMrKzExIGZlYXR1cmVzLiBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UKICAgICAgICAgICAgICB0aGUgbWtvY3RmaWxlIHByb2dyYW0gc3VwcGxpZWQgYnkgT2N0YXZlIHRvIGNvbXBpbGUgdGhlIFNXSUctZ2VuZXJhdGVkCiAgICAgICAgICAgICAgd3JhcHBlciBjb2RlLCBhcyBta29jdGZpbGUgd2lsbCBlbnN1cmUgdGhlIGNvcnJlY3QgQysrIGNvbXBpbGVyL29wdGlvbnMKICAgICAgICAgICAgICBhcmUgdXNlZC4gT3RoZXJ3aXNlLCB0aGUgdmFsdWUgb2YgYG1rb2N0ZmlsZSAtcCBDWFhgIHNob3VsZCBiZSBwYXJzZWQKICAgICAgICAgICAgICBmb3IgYW55IC1zdGQ9KiBmbGFncyB3aGljaCBtaWdodCBiZSBwcmVzZW50LgogICAgICAgICAgICAtIE9jdGF2ZSBoYXMgZHJvcHBlZCBzdXBwb3J0IGZvciA8PCBhbmQgPj4gb3BlcmF0b3JzLCBzbyBTV0lHIG5vdwogICAgICAgICAgICAgIGlnbm9yZXMgdGhlbS4KICAgICAgICAgICAgLSBUaGUgT2N0YXZlIGVycm9yKCkgZnVuY3Rpb24gbm93IHJhaXNlcyBDKysgZXhjZXB0aW9ucyB0byBwcm9wYWdhdGUKICAgICAgICAgICAgICBPY3RhdmUgZXJyb3JzLCBzbyAlZXhjZXB0aW9uIGRpcmVjdGl2ZXMgbWF5IG5lZWQgdG8gYmUgbW9kaWZpZWQuCiAgICAgICAgICAgICAgRm9yIGNvbnZlbmllbmNlIHRoZSBTV0lHX1JFVEhST1dfT0NUQVZFX0VYQ0VQVElPTlMgbWFjcm8gY2FuIGJlIHVzZWQKICAgICAgICAgICAgICB0byByZXRocm93IGFueSBPY3RhdmUgZXhjZXB0aW9ucyBmb3IgT2N0YXZlIGl0c2VsZiB0byBoYW5kbGUsIGUuZy46CgogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgJGFjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heSBjYWxsIGVycm9yKCkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIFNXSUdfUkVUSFJPV19PQ1RBVkVfRVhDRVBUSU9OUyAgIC8vIGVycm9yKCkgZXhjZXB0aW9ucyBhcmUgcmV0aHJvd24KICAgICAgICAgICAgICAgIGNhdGNoKC4uLikgewogICAgICAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIG90aGVyIGV4Y2VwdGlvbnMKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxNy0wMS0xNjogd2thbGluaW4KICAgICAgICAgICAgW0MjXSBGaXggIzczMyByZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gc3dpZy0zLjAuOS4KICAgICAgICAgICAgTWlzc2luZyB2aXJ0dWFsIGZ1bmN0aW9uIG92ZXJyaWRlIGluIEMjIGxheWVyIHdoZW4gdXNpbmcgJWltcG9ydC4KCjIwMTctMDEtMTY6IGZzY2hsaW1iCiAgICAgICAgICAgIEZpeCAjODEzIHRlbXBsYXRlIHN5bWJvbCBuYW1lIGxvb2t1cCBidWcgd2hlbiB0eXBlZGVmIG5hbWVzIGFyZSB0aGUgc2FtZSBidXQgaW4gZGlmZmVyZW50CiAgICAgICAgICAgIG5hbWVzcGFjZXMuCgoyMDE3LTAxLTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMgRCBKYXZhXQogICAgICAgICAgICBUaGUgU1dJRyBsaWJyYXJ5IG5vIGxvbmdlciB1c2VzIHRoZSBqYXZhdHlwZSwgZHR5cGUgb3IgY3N0eXBlIHR5cGVtYXBzLCB0aGVyZWJ5CiAgICAgICAgICAgIGNvbXBsZXRlbHkgZnJlZWluZyB0aGVtIHVwIGZvciB1c2VycyB0byB1c2Ugd2l0aG91dCBoYXZpbmcgdG8gcmVwbGljYXRlIHRoZSBsaWJyYXJ5CiAgICAgICAgICAgIGNvZGUgdGhhdCB0aGV5IHByZXZpb3VzbHkgYWRkZWQuIFRoZSBjb2RlIHByZXZpb3VzbHkgZ2VuZXJhdGVkIGJ5IHRoZXNlIHR5cGVtYXBzCiAgICAgICAgICAgIGhhcyBiZWVuIHJlcGxhY2VkIGJ5IHRoZSBuZXcgJXByb3h5Y29kZSBkaXJlY3RpdmUuIFRoZWlyIHVzZSBpbiB0aGUgbGlicmFyeSBjb2RlCiAgICAgICAgICAgIHdhcyBmYWlybHkgbWluaW1hbDoKCiAgICAgICAgICAgICAgQyMgICBjc3R5cGU6ICAgc3RkX2FycmF5Lmkgc3RkX21hcC5pIHN0ZF92ZWN0b3IuaQogICAgICAgICAgICAgIEQgICAgZHR5cGU6ICAgIHN0ZF92ZWN0b3IuaQogICAgICAgICAgICAgIEphdmEgamF2YXR5cGU6IGFycmF5c19qYXZhLmkKCjIwMTctMDEtMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFRoZSAlZXh0ZW5kIGRpcmVjdGl2ZSBjYW4gbm93IG9wdGlvbmFsbHkgc3VwcG9ydCBvbmUgb2YgdGhlICdjbGFzcycsICdzdHJ1Y3QnIG9yICd1bmlvbicKICAgICAgICAgICAga2V5d29yZHMgYmVmb3JlIHRoZSBpZGVudGlmaWVyIG5hbWUsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBzdHJ1Y3QgWCB7IC4uLiB9OwogICAgICAgICAgICAgICVleHRlbmQgc3RydWN0IFggeyAuLi4gfQoKICAgICAgICAgICAgUHJldmlvdXNseSB0aGlzIGhhZCB0byBzcGVjaWZpZWQgYXM6CgogICAgICAgICAgICAgIHN0cnVjdCBYIHsgLi4uIH07CiAgICAgICAgICAgICAgJWV4dGVuZCBYIHsgLi4uIH0KCjIwMTctMDEtMTM6IHdzZnVsdG9uCgkgICAgW0MjIEQgSmF2YV0gQWRkIG5ldyAlcHJveHljb2RlIGRpcmVjdGl2ZSB3aGljaCBpcyBhIG1hY3JvIGZvciAlaW5zZXJ0KCJwcm94eWNvZGUiKS4KICAgICAgICAgICAgVGhpcyBpcyBhIHdheSBvZiBhZGRpbmcgcHVyZSBDIy9EL0phdmEgY29kZSBpbnRvIHRoZSBhcHByb3ByaWF0ZSBwcm94eSBjbGFzcywgZWc6CgogICAgICAgICAgICAgICVleHRlbmQgUHJveHkyIHsKICAgICAgICAgICAgICAlcHJveHljb2RlICV7CiAgICAgICAgICAgICAgICBwdWJsaWMgaW50IHByb3h5Y29kZTIoaW50IGkpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGkrMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgJWlubGluZSAlewogICAgICAgICAgICAgIHN0cnVjdCBQcm94eTIge307CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFRoZXJlIHdpbGwgdGhlbiBiZSBhIHB1cmUgSmF2YS9DIy9EIG1ldGhvZCBjYWxsZWQgcHJveHljb2RlMiBpbiB0aGUgUHJveHkyIGNsYXNzLgoKMjAxNi0xMi0zMTogYWpyaGVhZGluZzEKCSAgICBJc3N1ZSAjODYwIC0gUmVtb3ZlIHVzZSBvZiBzdGQ6OnVuYXJ5X2Z1bmN0aW9uIGFuZCBzdGQ6OmJpbmFyeV9mdW5jdGlvbgogICAgICAgICAgICB3aGljaCBpcyBkZXByZWNhdGVkIGluIEMrKzExLgoKMjAxNi0xMi0zMDogb2xseQoJICAgIFtQSFA3XSBSZWdpc3RlciBpbnRlcm5hbCAnc3dpZ19ydW50aW1lX2RhdGFfdHlwZV9wb2ludGVyJyBjb25zdGFudAoJICAgIGFzICJDT05TVF9QRVJTSVNURU5UIiB0byBhdm9pZCBzZWdtZW50YXRpb24gZmF1bHQgb24gbW9kdWxlIHVubG9hZC4KCSAgICBGaXhlcyAjODU5IHJlcG9ydGVkIGJ5IFRpbW90aGV1cyBQb2tvcnJhLiBUaGFua3MgYWxzbyB0byBKYXZpZXIgVG9ycmVzCgkgICAgZm9yIGEgbWluaW1hbCByZXByb2R1Y2VyLgoKVmVyc2lvbiAzLjAuMTEgKDI5IERlYyAyMDE2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDE2LTEyLTI0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFkZCAlZmVhdHVyZSgiY3NkaXJlY3RvcmRlbGVnYXRlbW9kaWZpZXJzIikgdG8gZW5hYmxlIGN1c3RvbWl6YXRpb24KICAgICAgICAgICAgb2YgdGhlIGRlbGVnYXRlIGFjY2VzcyBtb2RpZmllcnMgZ2VuZXJhdGVkIGluIGRpcmVjdG9yIGNsYXNzZXMuCiAgICAgICAgICAgIEZpeGVzIGlzc3VlICM3NDguCgoyMDE2LTEyLTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggYnVpbHRpbiAicHl0aG9uOnNsb3QiIGZlYXR1cmUgZmFpbGluZyBmb3IgdHBfaGFzaCB3aGVuIHVzaW5nCiAgICAgICAgICAgIGhhc2hmdW5jIGNsb3N1cmUgd2l0aCBhICJXcm9uZyB0eXBlIGZvciBoYXNoIGZ1bmN0aW9uIiBmb3IgUHl0aG9uIDIuCiAgICAgICAgICAgIElzc3VlICM4NDMuCgoyMDE2LTEyLTIxOiBqb2VxdWFtdAogICAgICAgICAgICBDaGFuZ2VkIGdlbmVyYXRpb24gb2YgZnVuY3Rpb25zIHNvIHRoYXQgb25seSBmdW5jdGlvbnMKICAgICAgICAgICAgdGhhdCBlbmQgaW4gX3NldCBnZW5lcmF0ZSBhY2Nlc3NvciBmdW5jdGlvbnMgcmF0aGVyIHRoYW4KCSAgICBsb29raW5nIGZvciAic2V0Ii4KCSAgICBDaGFuZ2UgZ2VuZXJhdGlvbiBvZiBvcGVyYXRvcnMgdG8gbm90IGhhdmUgdW5kZXJzY29yZXMKCSAgICB0byBzdGFydCBpbiBSLiBVc2VycyBuZWVkIHRvIHByb3ZpZGUgY3VzdG9tIG5hbWVzIGZvciB0aGVzZSBvcGVyYXRvciBvdmVybG9hZHMuCgoyMDE2LTEyLTIxOiBvbGx5CgkgICAgRml4IGlzZmluaXRlKCkgY2hlY2tzIHRvIHdvcmsgd2l0aCBhbGwgQysrMTEgY29tcGlsZXJzLgoJICAgIEZpeGVzIGlzc3VlcyAjNjE1LCAjNzg4IGFuZCAjODQ5LgoKMjAxNi0xMi0yMDogd3NmdWx0b24KICAgICAgICAgICAgJW5hbWV3YXJuIHVubmVjZXNzYXJpbHkgY2F1c2VkIGtleXdvcmQgd2FybmluZ3MgZm9yIG5vbi1pbnN0YW50aWF0ZWQgdGVtcGxhdGUgY2xhc3NlcwogICAgICAgICAgICBhbmQgZHVwbGljYXRlIHdhcm5pbmdzIGZvciBpbnN0YW50aWF0ZWQgdGVtcGxhdGUgY2xhc3NlcyB3aGVuIGtleXdvcmRzIHdlcmUgdXNlZC4KICAgICAgICAgICAgSXNzdWUgIzg0NS4KCjIwMTYtMTItMTg6IGV6cmFsYW5nbG9pcyAKICAgICAgICAgICAgW1B5dGhvbiwgUnVieSwgT2N0YXZlXSBNZW1vcnkgbGVhayBmaXggb24gZXJyb3IgaW4gc3RkOjpwYWlyIHdyYXBwZXJzLgogICAgICAgICAgICBJc3N1ZSAjODUxLgoKMjAxNi0xMi0xODogd3NmdWx0b24KICAgICAgICAgICAgWmVybyBpbml0aWFsaXplIGFycmF5cyB3aGVuIHVzaW5nICVhcnJheV9jbGFzcyBhbmQgJWFycmF5X2Z1bmN0aW9ucy4KCjIwMTYtMTItMTg6IHQtaWtlZ2FtaQogICAgICAgICAgICBbUHl0aG9uXSBGaXggIzQ0NgogICAgICAgICAgICBQeXRob24gJWFycmF5X2NsYXNzIG9mIGNhcnJheXMuaSBmYWlsZWQgd2l0aCAtYnVpbHRpbiBvcHRpb24uCgoyMDE2LTEyLTE2OiBicmlhbmNhaW5lCiAgICAgICAgICAgIFtHdWlsZV0gUGF0Y2ggIzc0NCBBZGRlZCBzdXBwb3J0IGZvciBHdWlsZSdzIG5hdGl2ZSBwb2ludGVyIGZ1bmN0aW9uYWxpdHkKCjIwMTYtMTItMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIElzc3VlICM3NjkuCiAgICAgICAgICAgIEFkZCBvcHRpb25hbCBtb2R1bGVpbXBvcnQgYXR0cmlidXRlIHRvICVtb2R1bGUgc28gdGhhdCB0aGUKICAgICAgICAgICAgZGVmYXVsdCBtb2R1bGUgaW1wb3J0IGNvZGUgY2FuIGJlIG92ZXJyaWRkZW4uIFNlZSB0aGUgIlNlYXJjaGluZyBmb3IgdGhlIHdyYXBwZXIgbW9kdWxlIgogICAgICAgICAgICBkb2N1bWVudGF0aW9uIGluIFB5dGhvbi5odG1sLiBFeGFtcGxlOgoKICAgICAgICAgICAgICAlbW9kdWxlKG1vZHVsZWltcG9ydD0iaW1wb3J0IF9mb28iKSBmb28KCiAgICAgICAgICAgICRtb2R1bGUgYWxzbyBleHBhbmRzIHRvIHRoZSBsb3ctbGV2ZWwgQy9DKysgbW9kdWxlIG5hbWUsIHNvIHRoZSBmb2xsb3dpbmcgaXMgdGhlCiAgICAgICAgICAgIHNhbWUgYXMgYWJvdmUKCiAgICAgICAgICAgICAgJW1vZHVsZShtb2R1bGVpbXBvcnQ9ImltcG9ydCAkbW9kdWxlIikgZm9vCgoyMDE2LTExLTMwOiBvbGx5CgkgICAgW1BIUF0gQWRkIHN1cHBvcnQgZm9yIFBIUDcuICBQSFA1J3MgQyBleHRlbnNpb24gQVBJIGhhcyBjaGFuZ2VkCgkgICAgc3Vic3RhbnRpYWxseSBzbyB5b3UgbmVlZCB0byB1c2UgLXBocDcgdG8gc3BlY2lmeSB5b3Ugd2FudCBQSFA3CgkgICAgY29tcGF0aWJsZSB3cmFwcGVycy4gIFRoZSBkZWZhdWx0IGV4dGVuc2lvbiBmb3IgZ2VuZXJhdGVkIHdyYXBwZXJzCgkgICAgaXMgbm93IC5jeHggKHRvIG1hdGNoIFNXSUcncyBkZWZhdWx0IGZvciBldmVyeSBvdGhlciBsYW5ndWFnZSAtIHRvCgkgICAgZ2VuZXJhdGUgZm9vX3dyYXAuY3BwIHlvdSBjYW4gcnVuIFNXSUcgd2l0aCAtY3BwZXh0IGNwcCkuICBGaXhlcwoJICAgIGlzc3VlICM1NzEuCgoJICAgIEFzIHBhcnQgb2YgdGhpcyBjaGFuZ2UsIHRoZSBsYW5ndWFnZSBzdWJkaXJlY3RvcnkgZm9yIFBIUDUgaGFzCgkgICAgY2hhbmdlZCBmcm9tICJwaHAiIHRvICJwaHA1IiAtIGlmIHlvdSBhcmUgbWFraW5nIHVzZSBvZiB0aGUgc2VhcmNoCgkgICAgcGF0aCBmZWF0dXJlIHdoZXJlIHRoZSBsYW5ndWFnZSBzdWJkaXJlY3Rvcnkgb2YgZWFjaCBkaXJlY3RvcnkKCSAgICBpcyBhbHNvIHNlYXJjaGVkLCB5b3UnbGwgbmVlZCB0byB1cGRhdGUgeW91ciBiaW5kaW5ncy4gIEEgc2ltcGxlCgkgICAgZml4IHdoaWNoIHdvcmtzIGZvciBvbGRlciBhbmQgbmV3ZXIgU1dJRyBpcyB0byBhZGQgYSBzeW1saW5rOgoJICAgIGxuIC1zIHBocCBwaHA1CgoJICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxNi0xMS0zMDogb2xseQoJICAgIFtQSFBdIE9ubHkgZW1pdCBvbmUgY29weSBvZiBlYWNoIGRpc3RpbmN0IGFyZ2luZm8uICBQcmV2aW91c2x5IHdlCgkgICAgZW1pdHRlZCBhIHNlcGFyYXRlIG9uZSBmb3IgZXZlcnkgd3JhcHBlZCBmdW5jdGlvbiwgYnV0IHR5cGljYWxseQoJICAgIG1hbnkgZnVuY3Rpb25zIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgYW5kIGNvbWJpbmF0aW9ucwoJICAgIG9mIHBhcmFtZXRlcnMgcGFzc2VkIGJ5IHJlZmVyZW5jZSBvciBub3QuCgoJICAgIFRoaXMgY2hhbmdlIHNpZ25pZmljYW50bHkgcmVkdWNlcyBib3RoIHRoZSBzaXplIG9mIHRoZSBnZW5lcmF0ZWQKCSAgICB3cmFwcGVyLCBhbmQgb2YgdGhlIGNvbXBpbGVkIFBIUCBleHRlbnNpb24gbW9kdWxlIChlLmcuIGJ5IH42JSBmb3IKCSAgICB0aGUgc3RyaXBwZWQgZXh0ZW5zaW9uIG1vZHVsZSBmb3IgWGFwaWFuJ3MgUEhQNyBiaW5kaW5ncykuCgoyMDE2LTExLTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJXJlbmFtZSBvdmVycmlkZSBvZiB3aWxkY2FyZCAlcmVuYW1lIGZvciB0ZW1wbGF0ZXMuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlcmVuYW1lKEdsb2JhbEludE9wZXJhdG9yKSAqOjpvcGVyYXRvciBib29sOyAvLyB3aWxkY2FyZCAlcmVuYW1lCgogICAgICAgICAgICAgICVyZW5hbWUoWEludE9wZXJhdG9yKSBYOjpvcGVyYXRvciBib29sOyAvLyBmaXggbm93IG92ZXJyaWRlcyBmaXJzdCAlcmVuYW1lIGFib3ZlCiAgICAgICAgICAgICAgT1IKICAgICAgICAgICAgICAlcmVuYW1lKFhJbnRPcGVyYXRvcikgWDxpbnQ+OjpvcGVyYXRvciBib29sOyAvLyBmaXggbm93IG92ZXJyaWRlcyBmaXJzdCAlcmVuYW1lIGFib3ZlCgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBYIHsKICAgICAgICAgICAgICAgIG9wZXJhdG9yIGJvb2woKTsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgJXRlbXBsYXRlKFhpbnQpIFg8aW50PjsKCiAgICAgICAgICAgIFRoaXMgYWxzbyBmaXhlcyAlcmVuYW1lIG92ZXJyaWRlIG9mIGdsb2JhbCAlcmVuYW1lIGZvciB0ZW1wbGF0ZXMuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAvLyBHbG9iYWwgcmVuYW1lIHRvIG1ha2UgYWxsIGZ1bmN0aW9ucyBzdGFydCB3aXRoIGEgbG93ZXIgY2FzZSBsZXR0ZXIKICAgICAgICAgICAgICAlcmVuYW1lKCIlKGZpcnN0bG93ZXJjYXNlKXMiLCAlJGlzZnVuY3Rpb24gKSAiIjsKICAgICAgICAgICAgICAlcmVuYW1lKHdvb2hvbykgVzo6V29vOyAvLyBmaXggbm93IG92ZXJyaWRlcyBhYm92ZSAlcmVuYW1lCgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBXIHsKICAgICAgICAgICAgICAgIFcgV29vKCk7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICV0ZW1wbGF0ZShXaW50KSBXPGludD47CgogICAgICAgICAgICBUaGUgYWJvdmUgYWxzbyBpbnRyb2R1Y2VzIGEgcG9zc2libHkgdW5leHBlY3RlZCBjaGFuZ2UuIE1hbnkgb2YgdGhlIFNUTCBjb250YWluZXJzCiAgICAgICAgICAgIHByb3ZpZGVkIGJ5IFNXSUcgdXNlICVyZW5hbWUgdG8gcmVuYW1lIHNvbWUgbWV0aG9kcywgZWcgaW4gc3RkOjp2ZWN0b3IsIHB1c2hfYmFjawogICAgICAgICAgICBpcyByZW5hbWVkIHRvIGFkZCBpbiBKYXZhLiBQcmV2aW91c2x5IHRoaXMgaW50ZW5kZWQgcmVuYW1lIGRpZCBub3QgaGFwcGVuIHdoZW4gdXNpbmcKICAgICAgICAgICAgdXNpbmcgZ2xvYmFsICVyZW5hbWUgcnVsZXMgYW5kIHRoZSBtZXRob2Qgd291bGQgcmVtYWluIGFzIHB1c2hfYmFjaywgYnV0IGlzIG5vdwogICAgICAgICAgICByZW5hbWVkIHRvIGFkZC4gU29tZSBtb3JlIGluZm8gaW4gaXNzdWUgIzg1Ni4KCgkgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE2LTExLTI2OiBtN3Rob24KICAgICAgICAgICAgW1B5dGhvbl0gSXNzdWUgIzcwOSAtIGltcHJvdmVkIHdyYXBwaW5nIG9mIGRpdmlzaW9uIG9wZXJhdG9ycwogICAgICAgICAgICAnZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbicgbm93IHdvcmtzIGluIFB5dGhvbiAyIHdoZXRoZXIgb3Igbm90IHRoZQogICAgICAgICAgICAtcHkzIGZsYWcgaXMgdXNlZC4KCjIwMTYtMTEtMTI6IGpvZXF1YW50CiAgICAgICAgICAgIFtSXSBJc3N1ZSAjNjk3IC0gZml4IGNvbW1hIGlzc3VlIHdpdGggb3ZlcmxvYWQgbWV0aG9kcwoKMjAxNi0xMS0xMjogam9lcXVhbnQKCSAgICBbUl0gSXNzdWUgIzU1NSAtIFIgcnVudGltZSBuZWVkcyBzdGRpby5oCgoyMDE2LTExLTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBJc3N1ZSAjODE2IC0gZml4IGNvbXBpbGF0aW9uIGVycm9yIHdoZW4gdXNpbmcgLWV4dHJhbmF0aXZlIGFuZCAtYnVpbHRpbi4KCjIwMTYtMTEtMDI6IGxpb3Jnb2xkCiAgICAgICAgICAgIFBhdGNoICM3NDEgLSBBZGQgc3VwcG9ydCBmb3IgQysrMTEgYWxpYXMgdGVtcGxhdGVzLCBzZWUgdXBkYXRlZCBDUGx1c1BsdXMxMS5odG1sCiAgICAgICAgICAgIGRvY3VtZW50YXRpb24uCgoyMDE2LTEwLTMwOiBteWQ3MzQ5CiAgICAgICAgICAgIFtDI10gUGF0Y2ggIzc0MCBBZGQgc3RkX2FycmF5LmkgZm9yIEMjIGZvciB3cmFwcGluZyBzdGQ6OmFycmF5LgoKICAgICAgICAgICAgUGF0Y2ggYWxzbyBlbmhhbmNlcyBzdGQ6OnZlY3RvcjxzdGQ6OndzdHJpbmc+IEMjIHdyYXBwZXJzIHdpdGggYWRkaXRpb25hbCBmdW5jdGlvbnMKICAgICAgICAgICAgKENvbnRhaW5zLCBJbmRleE9mLCBMYXN0SW5kZXhPZiBhbmQgUmVtb3ZlKS4KCjIwMTYtMTAtMzA6IHRvYmlsYXUKICAgICAgICAgICAgW0phdmFdIEZpeCB3cmFwcGVycyBmb3Igd3N0cmluZyBwYXJhbWV0ZXJzIGluIGRpcmVjdG9yIG1ldGhvZHMgdG8gY2xlYW51cCBsb2NhbAogICAgICAgICAgICByZWYgYWZ0ZXIgZGlyZWN0b3IgY2FsbGJhY2sgaGFzIGZpbmlzaGVkLgoKMjAxNi0xMC0yMzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBZGQgbWlzc2luZyBjc2RpcmVjdG9yaW4gVk9JRF9JTlRfUFRSIGFuZCBjc2RpcmVjdG9yb3V0IFZPSURfSU5UX1BUUiB0eXBlbWFwcy4KCjIwMTYtMTAtMjM6IGppdWxvbmd3CiAgICAgICAgICAgIFBhdGNoICM3ODEgLSBGaXggd3JhcHBpbmcgb2YgQyBjb21wb3VuZCBleHByZXNzaW9ucyBjb250YWluaW5nIGNoYXIgY29uc3RhbnRzCiAgICAgICAgICAgIGluIHF1b3RlcyBzdWNoIGFzOgoKICAgICAgICAgICAgICAjZGVmaW5lIEhfU1VQUFJFU1NfU0NBTElOR19NQUdJQyAoKCdzJzw8MjQpIHwgKCd1Jzw8MTYpIHwgKCdwJzw8OCkgfCAncCcpCgogICAgICAgICAgICAgIGVudW0gRGlmZmVyZW50VHlwZXMgewogICAgICAgICAgICAgICAgdHlwZWNoYXJjb21wb3VuZD0nQScrMSwKICAgICAgICAgICAgICAgIHR5cGVjaGFyY29tcG91bmQyPSdCJyA8PCAyCiAgICAgICAgICAgICAgfTsKCjIwMTYtMTAtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIElzc3VlICM4MDggLSBmaXggUHl0aG9uIHBpY2tsaW5nIGFuZCBtZXRhY2xhc3MgZm9yIGJ1aWx0aW4gd3JhcHBlcnMuCgogICAgICAgICAgICBUaGUgbWV0YWNsYXNzIChTd2lnUHlPYmplY3RUeXBlKSBmb3IgU1dJRyBvYmplY3RzIHdhcyBub3QgZGVmaW5lZCBpbgogICAgICAgICAgICBhIHdheSB0aGF0IGxldCBpbXBvcnRsaWIgc3VjY2Vzc2Z1bGx5IGltcG9ydCB0aGUgUHl0aG9uIHdyYXBwZXJzLgogICAgICAgICAgICBUaGUgcGlja2xlIG1vZHVsZSBwcmV2aW91c2x5IGZhaWxlZCB0byBwaWNrbGUgb2JqZWN0cyBiZWNhdXNlIGl0IGNvdWxkbid0CiAgICAgICAgICAgIGRldGVybWluZSB3aGF0IG1vZHVsZSB0aGUgU1dJRyB3cmFwcGVkIG9iamVjdHMgd2VyZSBpbi4KCjIwMTYtMDktMjk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtBbGxlZ3JvY2wsIENGRkksIEdPLCBKYXZhc2NyaXB0LCBPY2FtbCwgUiwgU2NpbGFiXQogICAgICAgICAgICBBZGQgbWlzc2luZyBzdXBwb3J0IGZvciB0aGUgInJldCIgdHlwZW1hcCBpbiBhIGZldyB0YXJnZXQgbGFuZ3VhZ2VzLgogICAgICAgICAgICBUaGUgZG9jdW1lbnRhdGlvbiBhbHNvIG5vdyBoYXMgaW5mbyBvbiB0aGUgInJldCIgdHlwZW1hcC4KCjIwMTYtMDktMjc6IGFobWVkLXVzbWFuCiAgICAgICAgICAgIFt4bWxdIEhhbmRsZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGNvcnJlY3RseS4KCjIwMTYtMDktMjc6IGRvbnRwYW5pYzkyCiAgICAgICAgICAgIFtHb10gRml4IGFyZ3VtZW50IG5hbWVzIGluIGluaGVyaXRlZCBmdW5jdGlvbnMgdGFraW5nIG1vcmUgdGhhbiA4CiAgICAgICAgICAgIHBhcmFtZXRlcnMuICBGaXhlcyAjNzk1LgoKMjAxNi0wOS0yNjogc21hcmNoZXR0bwogICAgICAgICAgICBbU2NpbGFiXSBtbGlzdHMgdGhhdCBtYXAgcG9pbnRlcnMgY2FuIGJlIGdpdmVuIGEgY3VzdG9tIHR5cGUgbmFtZS4KCjIwMTYtMDktMjU6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoICM3OTMgZnJvbSBxLXAgdG8gZXhwYW5kIGV4Y2VwdGlvbiBoYW5kbGluZyB0byBpbmNsdWRlIHN0ZDo6YmFkX2Nhc3QKICAgICAgICAgICAgaW4gc3RkX2V4Y2VwdC5pLgoKMjAxNi0wOS0yNDogb2xseQogICAgICAgICAgICBbUEhQXSBGaXggY29kZSBnZW5lcmF0ZWQgZm9yIGZlYXR1cmUoImRpcmVjdG9yOmV4Y2VwdCIpIC0KICAgICAgICAgICAgcHJldmlvdXNseSB0aGUgcmV0dXJuIHZhbHVlIG9mIGNhbGxfdXNlcl9mdW5jdGlvbigpIHdhcyBpZ25vcmVkIGFuZAogICAgICAgICAgICB3ZSBjaGVja2VkIGFuIHVuaW5pdGlhbGlzZWQgdmFsdWUgaW5zdGVhZC4gIEZpeGVzICM2MjcuICBCYXNlZCBvbgogICAgICAgICAgICBwYXRjaCBmcm9tIFNlcmdleSBTZXJvc2h0YW4uCgoyMDE2LTA5LTIyOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBNb3JlIGZsZXhpYmxlIHB5dGhvbiBidWlsdGluIHNsb3RzIGZvciBvdmVybG9hZGVkIEMrKyBmdW5jdGlvbi4KCiAgICAgICAgICAgIFRoZSBjbG9zdXJlIG5hbWVzIHVzZWQgZm9yIGJ1aWx0aW4gc2xvdHMgYXJlIG1hbmdsZWQgd2l0aCB0aGVpciBmdW5jdHlwZSBzbwogICAgICAgICAgICB0aGF0IG92ZXJsb2FkZWQgQysrIG1ldGhvZCBuYW1lcyBjYW4gYmUgdXNlZCBmb3IgbXVsdGlwbGUgc2xvdHMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgicHl0aG9uOnNsb3QiLCAibXBfc3Vic2NyaXB0IiwgZnVuY3R5cGU9ImJpbmFyeWZ1bmMiKSBTaW1wbGVBcnJheTo6X19nZXRpdGVtX187CiAgICAgICAgICAgICAgJWZlYXR1cmUoInB5dGhvbjpzbG90IiwgInNxX2l0ZW0iLCBmdW5jdHlwZT0ic3NpemVhcmdmdW5jIikgU2ltcGxlQXJyYXk6Ol9fZ2V0aXRlbV9fKFB5X3NzaXplX3Qgbik7CgogICAgICAgICAgICB3aWxsIGdlbmVyYXRlIGNsb3N1cmVzOgoKICAgICAgICAgICAgICBTV0lHUFlfU1NJWkVBUkdGVU5DX0NMT1NVUkUoX3dyYXBfU2ltcGxlQXJyYXlfX19nZXRpdGVtX18pIC8qIGRlZmluZXMgX3dyYXBfU2ltcGxlQXJyYXlfX19nZXRpdGVtX19fc3NpemVhcmdmdW5jX2Nsb3N1cmUgKi8KICAgICAgICAgICAgICBTV0lHUFlfQklOQVJZRlVOQ19DTE9TVVJFKF93cmFwX1NpbXBsZUFycmF5X19fZ2V0aXRlbV9fKSAvKiBkZWZpbmVzIF93cmFwX1NpbXBsZUFycmF5X19fZ2V0aXRlbV9fX2JpbmFyeWZ1bmNfY2xvc3VyZSAqLwoKICAgICAgICAgICAgUHJldmlvdXNseSBvbmx5IG9uZSBuYW1lIHdhcyBkZWZpbmVkOiBfd3JhcF9TaW1wbGVBcnJheV9fX2dldGl0ZW1fX19jbG9zdXJlLgogICAgICAgICAgICBIZW5jZSB0aGUgb3ZlcmxvYWRlZCBfX2dldGl0ZW1fXyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gc3VwcG9ydCBib3RoIG1wX3N1YnNjcmlwdCBhbmQgc3FfaXRlbSBzbG90cy4KCjIwMTYtMDktMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBpdGVyYXRvcnMgZm9yIGNvbnRhaW5lcnMgb2YgTlVMTCBwb2ludGVycyAob3IgUHl0aG9uIE5vbmUpIHdoZW4gdXNpbmcKICAgICAgICAgICAgLWJ1aWx0aW4uIFByZXZpb3VzbHkgaXRlcmF0aW9uIHdvdWxkIHN0b3AgYXQgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCB3YXMgTlVMTC4KCjIwMTYtMDktMTY6IG9sbHkKICAgICAgICAgICAgW0phdmFzY3JpcHRdIEZpeCBTV0lHX2V4Y2VwdGlvbigpIG1hY3JvIHRvIHJldHVybiBmcm9tIHRoZSBjdXJyZW50CiAgICAgICAgICAgIGZ1bmN0aW9uLiAgRml4ZXMgIzc4OSwgcmVwb3J0ZWQgYnkgSnVsaWVuIER1dHJpYXV4LgoKMjAxNi0wOS0xNjogb2xseQogICAgICAgICAgICBbUEhQXSBGaXggU1dJR19leGNlcHRpb24oKSBtYWNybyB0byByZXR1cm4gZnJvbSB0aGUgY3VycmVudCBmdW5jdGlvbi4KICAgICAgICAgICAgRml4ZXMgIzI0MCwgcmVwb3J0ZWQgYnkgU2VyZ2V5IFNlcm9zaHRhbi4KCjIwMTYtMDktMTI6IHh5cHJvbgogICAgICAgICAgICBbQyNdIFBhdGNoICM3ODYgS2V5d29yZCByZW5hbWUgdG8gYmUgQ0xTIGNvbXBsaWFudCBieSBhZGRpbmcgYW4gdW5kZXJzY29yZQogICAgICAgICAgICBzdWZmaXggaW5zdGVhZCBvZiBhbiB1bmRlcnNjb3JlIHByZWZpeCB0byB0aGUgQyBzeW1ib2wgbmFtZS4gUGxlYXNlIHVzZSBhbiBleHBsaWNpdAogICAgICAgICAgICAlcmVuYW1lIHRvIHJlbmFtZSB0aGUgc3ltYm9sIHdpdGggYSBfIHByZWZpeCBpZiB5b3Ugd2FudCB0aGUgb2xkIHN5bWJvbCBuYW1lLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE2LTA5LTA5OiBvbGx5CiAgICAgICAgICAgIFtQeXRob25dIEZpeCBpbXBvcnQgaGFuZGxpbmcgZm9yIFB5dGhvbiAyLjYgdG8gd29yayBpbiBhIGZyb3plbgogICAgICAgICAgICBhcHBsaWNhdGlvbi4gIEZpeGVzICMxNDUsIHJlcG9ydGVkIGJ5IFRob21hcyBLbHV5dmVyLgoKMjAxNi0wOS0wMjogc21hcmNoZXR0bwogICAgICAgICAgICBbU2NpbGFiXSBQb2ludGVycyBhcmUgbWFwcGVkIHRvIG1saXN0IGluc3RlYWQgb2YgdGxpc3QKICAgICAgICAgICAgKG1saXN0IGJldHRlciBmb3Igc2NpbGFiIG92ZXJsb2FkaW5nKQoKMjAxNi0wOS0wMjogb2xseQogICAgICAgICAgICBbUEhQXSBGaXggIm91dCIgdHlwZW1hcCBmb3IgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzIGFuZCAiaW4iCiAgICAgICAgICAgIHR5cGVtYXAgZm9yIGNoYXIgSU5QVVRbQU5ZXS4KCjIwMTYtMDktMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIE1vcmUgZWZmaWNpZW50IFB5dGhvbiBzbGljaW5nLgogICAgICAgICAgICBDYWxsIHJlc2VydmUgZm9yIGNvbnRhaW5lciB0eXBlcyB0aGF0IHN1cHBvcnQgaXQgdG8gYXZvaWQgcmVwZWF0ZWQKICAgICAgICAgICAgbWVtb3J5IHJlYWxsb2NhdGlvbnMgZm9yIG5ldyBzbGljZXMgb3Igc2xpY2VzIHRoYXQgZ3JvdyBpbiBzaXplLgoKMjAxNi0wOS0wMTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gIzc3MSAtIE1ha2UgYnVpbHRpbiB0eXBlcyBoYXNoYWJsZSBieSBkZWZhdWx0LgogICAgICAgICAgICBEZWZhdWx0IGhhc2ggaXMgdGhlIHVuZGVybHlpbmcgQy9DKysgcG9pbnRlci4gVGhpcyBtYXRjaGVzIHVwIHdpdGggdGVzdGluZyBmb3IKICAgICAgICAgICAgZXF1aXZhbGVuY2UgKFB5X0VRIGluIFN3aWdQeU9iamVjdF9yaWNoY29tcGFyZSkgd2hpY2ggY29tcGFyZXMgdGhlIHBvaW50ZXJzLgoKMjAxNi0wOC0yMjogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gVGhlIGZvbGxvd2luZyBidWlsdGluIHNsb3RzIGNhbiBiZSBjdXN0b21pemVkIGxpa2Ugb3RoZXIgc2xvdHMgdmlhIHRoZQogICAgICAgICAgICAicHl0aG9uOjx4PiIgYW5kICJweXRob246c2xvdCIgZmVhdHVyZXMgd2hlcmUgPHg+IGlzIHRoZSBhcHByb3ByaWF0ZSBzbG90IG5hbWU6CiAgICAgICAgICAgICAgdHBfYWxsb2NzCiAgICAgICAgICAgICAgdHBfYmFzZXMKICAgICAgICAgICAgICB0cF9iYXNpY3NpemUKICAgICAgICAgICAgICB0cF9jYWNoZQogICAgICAgICAgICAgIHRwX2RlbAogICAgICAgICAgICAgIHRwX2RlYWxsb2MKICAgICAgICAgICAgICB0cF9mbGFncwogICAgICAgICAgICAgIHRwX2ZyZWVzCiAgICAgICAgICAgICAgdHBfZ2V0c2V0CiAgICAgICAgICAgICAgdHBfaXNfZ2MKICAgICAgICAgICAgICB0cF9tYXhhbGxvYwogICAgICAgICAgICAgIHRwX21ldGhvZHMKICAgICAgICAgICAgICB0cF9tcm8KICAgICAgICAgICAgICB0cF9uZXcKICAgICAgICAgICAgICB0cF9uZXh0CiAgICAgICAgICAgICAgdHBfcHJldgogICAgICAgICAgICAgIHRwX3JpY2hjb21wYXJlCiAgICAgICAgICAgICAgdHBfc3ViY2xhc3NlcwogICAgICAgICAgICAgIHRwX3dlYWtsaXN0CiAgICAgICAgICAgICAgd2FzX3NxX2Fzc19zbGljZQogICAgICAgICAgICAgIHdhc19zcV9zbGljZQoKICAgICAgICAgICAgQSBmZXcgZG9jdW1lbnRhdGlvbiBpbXByb3ZlbWVudHMgZm9yIHNsb3QgY3VzdG9taXphdGlvbi4KCjIwMTYtMDgtMDk6IGpvZXF1YW50CiAgICAgICAgICAgIFtSXSBQYXRjaCAjNzY1IEZpeCBleHRlcm4gIkMiIGhlYWRlciBpbmNsdWRlcyBmb3IgQysrIGNvZGUuCgoyMDE2LTA4LTA1OiBvbGx5CiAgICAgICAgICAgIFt4bWxdIEZpeCBob3cgdGhlIG91dHB1dCBmaWxlbmFtZSBpcyBidWlsdCB0byBhdm9pZCBwcm9ibGVtcyB3aGVuCiAgICAgICAgICAgIGl0IGNvbnRhaW5zIHRoZSBlbWJlZGRlZCBzdHJpbmdzICIuYyIsICIuY3BwIiBvciAiLmN4eCIuCiAgICAgICAgICAgIEZpeGVzICM1NDAgcmVwb3J0ZWQgYnkgZGphY2s0Mi4KCjIwMTYtMDctMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBjb3JuZXIgY2FzZSBvZiB3cmFwcGluZyBzdGQ6OnZlY3RvciBvZiBUIHBvaW50ZXJzIHdoZXJlIGEgcG9pbnRlciB0byBhIHBvaW50ZXIgb2YgVAogICAgICAgICAgICBhbHNvIGV4aXN0cyBpbiB0aGUgd3JhcHBlZCBjb2RlLiBTRiBCdWcgMjM1OTQxNyAoOTY3KS4KCjIwMTYtMDYtMjY6IHdrYWxpbmluCiAgICAgICAgICAgIFtKYXZhLCBDI10gUGF0Y2ggIzY4MSBGaXggc2VnIGZhdWx0IHdoZW4gaWdub3JpbmcgbmVzdGVkIGNsYXNzZXMuCgoyMDE2LTA2LTI1OiBtcm9tYmVyZwogICAgICAgICAgICBbUHl0aG9uXSAjNzExIEZpeCAtY2FzdG1vZGUgYW5kIGNvbnZlcnNpb24gb2Ygc2lnbmVkIGFuZCB1bnNpZ25lZCBpbnRlZ2VyIHR5cGVzLgogICAgICAgICAgICBTZWUgMjAxNS0xMi0yMyBDSEFOR0VTIGVudHJ5IGZvciBkZXRhaWxzIG9mIHRoZXNlIGltcHJvdmVtZW50cyB3aGVuIHRoZXkgd2VyZQogICAgICAgICAgICBpbXBsZW1lbnRlZCBmb3IgdGhlIGRlZmF1bHQgb3B0aW9ucyAoaWUgbm90IHVzaW5nIC1jYXN0bW9kZSkuCgoyMDE2LTA2LTI1OiBhaG5vbGRzCiAgICAgICAgICAgIFBhdGNoICM3MzAgLSBGaXggJWltcGxpY2l0Y29udiBmb3Igb3ZlcmxvYWRlZCBmdW5jdGlvbnMgd2hlbiB1c2luZwogICAgICAgICAgICAtY2FzdG1vZGUgb3IgLWZhc3RkaXNwYXRjaCBvcHRpb25zLgoKICAgICAgICAgICAgVGhlIHJlc3VsdCBpcyB0aGF0IGluIGFsbCBvdmVybG9hZCBjYXNlcyB3aGVyZSB0aGVyZSBhcmUgbXVsdGlwbGUgcG9zc2liaWxpdGllcwogICAgICAgICAgICB3aXRoIHRoZSBzYW1lIG51bWJlciBvZiBhcmd1bWVudHMsIHRoZSBkaXNwYXRjaCBmdW5jdGlvbiB3aWxsIGZpcnN0IGNoZWNrIGZvcgogICAgICAgICAgICBleGFjdCAoYWthIG5vbiBpbXBsaWNpdCkgbWF0Y2hlcywgYW5kIHRoZW4gc3Vic2VxdWVudGx5IGNoZWNrIGZvciBpbXBsaWNpdAogICAgICAgICAgICBjYXN0aW5nIG1hdGNoZXMuIFRoaXMgd2FzIGFscmVhZHkgaGFwcGVuaW5nIGluIHRoZSBub3JtYWwgZGlzcGF0Y2ggc2l0dWF0aW9uLAogICAgICAgICAgICBhbmQgaW4gdGhlIC1mYXN0ZGlzcGF0Y2ggY2FzZSB0d28gcGFzc2VzIHRocm91Z2ggdGhlIGNhbmRpZGF0ZXMgd2VyZSBoYXBwZW5pbmcsCiAgICAgICAgICAgIGp1c3Qgd2l0aCBTV0lHX1BPSU5URVJfSU1QTElDSVRfQ09OViBhbHdheXMgc2V0LiBBZnRlciB0aGlzIHBhdGNoLCBpdCBpcyBub3Qgc2V0CiAgICAgICAgICAgIG9uIHRoZSBmaXJzdCBwYXNzLCBhbmQgdGhlbiBzZXQgb24gdGhlIHNlY29uZCBwYXNzLgoKMjAxNi0wNi0yNTogbGlvcmdvbGQKICAgICAgICAgICAgUGF0Y2ggIzcyNyAtIEFkZCBzdXBwb3J0IGZvciBDKysxMSB0eXBlIGFsaWFzaW5nLgoKVmVyc2lvbiAzLjAuMTAgKDEyIEp1biAyMDE2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDE2LTA2LTA2OiBtcm9tYmVyZwogICAgICAgICAgICBbUHl0aG9uXSBQYXRjaCAjNjk4LiBBZGQgc3VwcG9ydCBmb3IgLXJlbGF0aXZlaW1wb3J0IGZvciBweXRob24gMi43LCBzbyAtcHkzIGlzIG5vCiAgICAgICAgICAgIGxvbmdlciBhbHNvIHJlcXVpcmVkIGZvciByZWxhdGl2ZSBpbXBvcnQgc3VwcG9ydC4KCjIwMTYtMDYtMDU6IG1yb21iZXJnCiAgICAgICAgICAgIFtQeXRob25dIFBhdGNoICM2OTQgLSBGaXggcGFja2FnZSBpbXBvcnQgcmVncmVzc2lvbnMgaW50cm9kdWNlZCBpbiBzd2lnLTMuMC45LgoKICAgICAgICAgICAgMSkgVGhlIGNvZGUgaW4gMy4wLjkgZGlkIG5vdCBmYWxsIGJhY2sgdG8gJ2ltcG9ydCBfZm9vJyBpZiAnaW1wb3J0IGJhci5fZm9vJyBmYWlsZWQKICAgICAgICAgICAgKGFzc3VtaW5nIGJhci5mb28gd2FzIHRoZSBtYWluIG1vZHVsZSkuIEV2ZXJ5IHBsYWNlIF9mb28gaXMgaW1wb3J0ZWQgbm93IGZpcnN0IHRyaWVzCiAgICAgICAgICAgIGl0IGZyb20gdGhlIHBhY2thZ2Ugd2hlcmUgZm9vIHdhcyBmb3VuZCBhbmQgaWYgdGhhdCBmYWlscyB0cmllcyBfZm9vIGFzIGEgZ2xvYmFsIG1vZHVsZS4KCiAgICAgICAgICAgIDIpIFRoZSBzZXBhcmF0ZSBibG9jayBvZiBQeXRob24gY29kZSB0aGF0IGluamVjdGVkIGNvZGUgdG8gcHVsbCBpbiB0aGUgYXR0cmlidXRlcwogICAgICAgICAgICBmcm9tIF9mb28gd2hlbiAtYnVpbHRpbiBpcyB1c2VkIG1hZGUgdXNlIG9mIHRoZSAtcHkzIHN3aXRjaCB0byBlaXRoZXIgZG8KICAgICAgICAgICAgJ2Zyb20gLl9mb28gaW1wb3J0IConIG9yICJmcm9tIF9mb28gaW1wb3J0ICoiLiBUaGlzIGJsb2NrIG9mIGNvZGUgbm8gbG9uZ2VyIGRvZXMgdGhpcwogICAgICAgICAgICBhbmQgaW5zdGVhZCBjaGVja3MgdGhlIFB5dGhvbiB2ZXJzaW9uIGF0IHJ1bnRpbWUgdG8gc3dpdGNoIGJldHdlZW4gdGhlIHR3byBzeW50YXhlcy4KCiAgICAgICAgICAgIEluIHN1bW1hcnksIHN3aWctMy4wLjEwIGhhcyBiZWVuIG1vZGlmaWVkIHRvIGVhc2UgdGhlIGNyZWF0aW9uIG9mIHdyYXBwZXIgbW9kdWxlcwogICAgICAgICAgICB0aGF0IGNhbiBiZSBmdWxseSBtYWRlIHBhcnQgb2YgYSBQeXRob24gcGFja2FnZS4gIFNXSUcgbm8gbG9uZ2VyCiAgICAgICAgICAgIGFzc3VtZXMgdGhlIGR5bmFtaWNhbGx5IGxpbmtlZCBDIG1vZHVsZSBpcyBhIGdsb2JhbCBtb2R1bGUuCiAgICAgICAgICAgIFRoZSBkeW5hbWljIG1vZHVsZSBjYW4gbm93IGJlIHBsYWNlZCBpbnRvIGVpdGhlciB0aGUgc2FtZSBwYWNrYWdlIGFzIHRoZSBwdXJlIFB5dGhvbgogICAgICAgICAgICBtb2R1bGUgb3IgYXMgYSBnbG9iYWwgbW9kdWxlLiAgQm90aCBsb2NhdGlvbnMgYXJlIHVzZWQgYnkgdGhlIFB5dGhvbiB3cmFwcGVyIHRvCiAgICAgICAgICAgIGxvY2F0ZSB0aGUgQyBtb2R1bGUuCgogICAgICAgICAgICBIb3dldmVyLCB0aGlzIGNvdWxkIGNhdXNlIGEgYmFja3dhcmRzIGluY29tcGF0aWJpbGl0eSB3aXRoIHNvbWUgY29kZQogICAgICAgICAgICB0aGF0IHdhcyByZWx5aW5nIG9uIHRoZSBhYmlsaXR5IG9mICJmcm9tIHBhY2thZ2UgaW1wb3J0IF9tb2R1bGUiIHRvCiAgICAgICAgICAgIHB1bGwgYXR0cmlidXRlcyBvdXQgb2YgdGhlIHBhY2thZ2UgZGlyZWN0bHkuICBJZiB5b3VyIGNvZGUgcG9wdWxhdGVzIGEKICAgICAgICAgICAgbW9kdWxlICh3aGljaCBpcyBhbHNvIGEgcGFja2FnZSkgd2l0aCBhdHRyaWJ1dGVzIHRoYXQgYXJlIFNXSUcKICAgICAgICAgICAgZ2VuZXJhdGVkIG1vZHVsZXMgd2hpY2ggd2VyZSBub3QgbG9hZGVkIGluIGEgY29udmVudGlvbmFsIHdheSwKICAgICAgICAgICAgc3dpZy0zLjAuOCBhbmQgZWFybGllciBtYXkgaGF2ZSB3b3JrZWQgZHVlIHRvICdmcm9tIHBhY2thZ2UgaW1wb3J0CiAgICAgICAgICAgIF9tb2R1bGUnIGJ5cGFzc2luZyBhIHJlYWwgaW1wb3J0IGFuZCBwdWxsaW5nIHlvdXIgbW9kdWxlIGluIGFzIGFuCiAgICAgICAgICAgIGF0dHJpYnV0ZS4gVGhpcyB3aWxsIG5vIGxvbmdlciB3b3JrLiAgU2luY2UgdGhpcyBpcyBub3QgYSBjb21tb24gKG9yCiAgICAgICAgICAgIGV2ZW4gcmVjb21tZW5kZWQpIHByYWN0aWNlLCBtb3N0IGZvbGsgc2hvdWxkIG5vdCBiZSBhZmZlY3RlZC4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxNi0wNS0zMTogd3NmdWx0b24KICAgICAgICAgICAgRml4ICM2OTAgLSBTbWFydCBwb2ludGVyIHRvICVpZ25vcmVkIGNsYXNzIGRvZXNuJ3QgZXhwb3NlIGluaGVyaXRlZCBtZXRob2RzLgogICAgICAgICAgICBSZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gc3dpZy0zLjAuOS4KClZlcnNpb24gMy4wLjkgKDI5IE1heSAyMDE2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTYtMDUtMjQ6IG1yb21iZXJnCiAgICAgICAgICAgIFtQeXRob25dIFBhdGNoICM2MTIgLSBBZGQgc3VwcG9ydCBmb3IgUHl0aG9uJ3MgaW1wbGljaXQgbmFtZXNwYWNlIHBhY2thZ2VzLgoKMjAxNi0wNS0yMzogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEZpeCAjNjAyIC0gRXJyb3IgaGFuZGxpbmcgcmVncmVzc2lvbiBvZiBvcGFxdWUgcG9pbnRlcnMgaW50cm9kdWNlZAogICAgICAgICAgICBpbiBzd2lnLTMuMC44IHdoZW4gQyBmdW5jdGlvbnMgZXhwbGljaXRseSByZXNldCBhIHBvaW50ZXIgdXNpbmcgJ0RBVEFfUFRSKHNlbGYpID0gMCcuCiAgICAgICAgICAgIEFuIE9iamVjdFByZXZpb3VzbHlEZWxldGVkIGVycm9yIHdhcyBpbmNvcnJlY3RseSB0aHJvd24gd2hlbiB0aGUgcG9pbnRlciB3YXMgdXNlZAogICAgICAgICAgICBhcyBhIHBhcmFtZXRlci4KCjIwMTYtMDUtMTc6IHRhbXVyYXRhawogICAgICAgICAgICBbUnVieV0gUGF0Y2ggIzY1MSAtIENvcnJlY3Qgb3ZlcmxvYWRlZCBmdW5jdGlvbiBlcnJvciBtZXNzYWdlIHdoZW4gZnVuY3Rpb24gaXMKICAgICAgICAgICAgdXNpbmcgJW5ld29iamVjdC4KCjIwMTYtMDUtMTc6IGF1cmVsagogICAgICAgICAgICBbUnVieV0gUGF0Y2ggIzU4MiAtIGFkZCBzdXBwb3J0IGZvciBkb2NzdHJpbmcgb3B0aW9uIGluICVtb2R1bGUoKQoKMjAxNi0wNS0xNDogd3NmdWx0b24KICAgICAgICAgICAgRml4ICM0MzQgLSBQYXNzaW5nIGNsYXNzZXMgYnkgdmFsdWUgYXMgcGFyYW1ldGVycyBpbiBkaXJlY3RvciBtZXRob2RzIGRpZCBub3QgY3JlYXRlCiAgICAgICAgICAgIGEgY29weSBvZiB0aGUgYXJndW1lbnQgbGVhZGluZyB0byBpbnZhbGlkIG1lbW9yeSBhY2Nlc3NlcyBpZiB0aGUgb2JqZWN0IHdhcyB1c2VkCiAgICAgICAgICAgIGFmdGVyIHRoZSB1cGNhbGwgaW50byB0aGUgdGFyZ2V0IGxhbmd1YWdlLiBQYXNzaW5nIGFyZ3VtZW50cyBieSB2YWx1ZSBzaG91bGRuJ3QgZ2l2ZQogICAgICAgICAgICByaXNlIHRvIHRoZXNlIHNvcnRzIG9mIG1lbW9yeSBwcm9ibGVtcyBhbmQgc28gdGhlIG9iamVjdHMgYXJlIG5vdyBjb3BpZWQgYW5kIG93bmVyc2hpcAogICAgICAgICAgICBvZiB0aGVpciBsaWZldGltZSBpcyBjb250cm9sbGVkIGJ5IHRoZSB0YXJnZXQgbGFuZ3VhZ2UuCgoyMDE2LTA1LTA3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzYxMS4gRml4IGFzc2VydGlvbiBoYW5kbGluZyBkZWZhdWx0YXJncyB3aGVuIHVzaW5nICVleHRlbmQgZm9yIGEgdGVtcGxhdGUKICAgICAgICAgICAgY2xhc3MgYW5kIHRoZSBleHRlbmRlZCBtZXRob2RzIGNvbnRhaW4gZGVmYXVsdCBhcmd1bWVudHMuCgoyMDE2LTA1LTA1OiBlanVsaWFuCiAgICAgICAgICAgIFtQeXRob25dIFBhdGNoICM2MTcuIEZpeCBvcGVyYXRvci8gd3JhcHBlcnMuCgoyMDE2LTA1LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzY2OS4gRG9uJ3QgaXNzdWUgd2FybmluZyBhYm91dCBpZ25vcmluZyBiYXNlIGNsYXNzZXMgd2hlbiB0aGUgZGVyaXZlZCBjbGFzcyBpcwogICAgICAgICAgICBpdHNlbGYgaWdub3JlZC4KCjIwMTYtMDQtMTg6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBGaXggdXNlIG9mIGdvb3V0IHR5cGVtYXAgd2hlbiBjYWxsaW5nIGJhc2UgbWV0aG9kIGJ5CgkgICAgZm9yY2luZyB0aGUgInR5cGUiIGF0dHJpYnV0ZSB0byB0aGUgdmFsdWUgd2UgbmVlZC4KCjIwMTYtMDQtMTc6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBGaXhlcyBmb3IgR28gMS42OiBhdm9pZCByZXR1cm5pbmcgR28gcG9pbnRlcnMgZnJvbQoJICAgIGRpcmVjdG9ycyB0aGF0IHJldHVybiBzdHJpbmcgdmFsdWVzOyBhZGQgYSB0cmFpbGluZyAwIGJ5dGUKCSAgICB3aGVuIHRyZWF0aW5nIEdvIHN0cmluZyBhcyBDIGNoYXIqLgoKMjAxNi0wNC0wNjogc21hcmNoZXR0bwogICAgICAgICAgICBbU2NpbGFiXSAjNTUyIE1ha2UgU2NpbGFiIHJ1bnRpbWUga2VlcCB0cmFjayBvZiBwb2ludGVyIHR5cGVzCiAgICAgICAgICAgIEluc3RlYWQgb2YgYSBTY2lsYWIgcG9pbnRlciB3aGljaCBoYXMgbm8gdHlwZSwgU1dJRyBTY2lsYWIgbWFwcyBhCiAgICAgICAgICAgIHBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUgdGxpc3QgY29udGFpbmluZyB0aGUgcG9pbnRlciBhZHJlc3MgYW5kIGl0cyB0eXBlLgoKMjAxNi0wNC0wMjogYWhub2xkcwogICAgICAgICAgICBbUHl0aG9uXSBBcHBseSAjNTk4LiBGaXggbWlzbGVhZGluZyBlcnJvciBtZXNzYWdlIHdoZW4gYXR0ZW1wdGluZyB0byByZWFkIGEgbm9uLWV4aXN0ZW50CiAgICAgICAgICAgIGF0dHJpYnV0ZS4gVGhlIHByZXZpb3VzIGNyeXB0aWMgZXJyb3IgbWVzc2FnZToKICAgICAgICAgICAgICBBdHRyaWJ1dGVFcnJvcjogdHlwZSBvYmplY3QgJ29iamVjdCcgaGFzIG5vIGF0dHJpYnV0ZSAnX19nZXRhdHRyX18nCiAgICAgICAgICAgIGlzIG5vdyByZXBsYWNlZCB3aXRoIG9uZSBtZW50aW9uaW5nIHRoZSBhdHRyaWJ1dGUgbmFtZSwgZWc6CiAgICAgICAgICAgICAgQXR0cmlidXRlRXJyb3I6ICdGb28nIG9iamVjdCBoYXMgbm8gYXR0cmlidXRlICdiYXInCgoyMDE2LTA0LTAyOiBkZXJrdWNpCiAgICAgICAgICAgIFtQeXRob25dIFBhdGNoICM2MTAgdG8gZml4ICM2MDcuCiAgICAgICAgICAgIEZpeCBzaW5nbGUgYXJndW1lbnRzIHdoZW4gdXNpbmcgcHl0aG9uIC1idWlsdGluIC1PIHdpdGggJWZlYXR1cmUoImNvbXBhY3RkZWZhdWx0YXJncyIpCgoyMDE2LTAzLTMxOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlcyAjNTk0LiBGaXggYXNzZXJ0aW9uIGZvciBzb21lIGxhbmd1YWdlcyB3aGVuIHdyYXBwaW5nIGEgQysrMTEgZW51bSBjbGFzcyB0aGF0CiAgICAgICAgICAgIGlzIHByaXZhdGUgaW4gYSBjbGFzcy4KCiAgICAgICAgICAgIEFsc28gZG9uJ3Qgd3JhcCBwcml2YXRlIGVudW1zIGZvciBhIGZldyBsYW5ndWFnZXMgdGhhdCBhdHRlbXB0ZWQgdG8gZG8gc28uCgoyMDE2LTAzLTMxOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gdW5zaWduZWQgbG9uZyBsb25nIG1hcnNoYWxsaW5nIGltcHJvdmVtZW50cyB3aGVuIGEgbmVnYXRpdmUgbnVtYmVyCiAgICAgICAgICAgIGlzIHBhc3NlZCBmcm9tIEphdmEgdG8gQy4gQSBjYXN0IHRvIHNpZ25lZCBsb25nIGxvbmcgaW4gdGhlIEMgbGF5ZXIgd2lsbCBub3cKICAgICAgICAgICAgcmVzdWx0IGluIHRoZSBleHBlY3RlZCB2YWx1ZS4gTm8gY2hhbmdlIGZvciBwb3NpdGl2ZSBudW1iZXJzIHBhc3NlZCB0byBDLgogICAgICAgICAgICBGaXhlcyAjNjIzLgoKMjAxNi0wMy0yMjogYWxleHdhcmcKCSAgICBbTHVhXSAjMzk4IEZpeCBsdWEgX19nZXRpdGVtICsgaW5oZXJpdGFuY2UKICAgICAgICAgICAgVGhlIG5ldyBoYW5kbGluZyBvZiBjbGFzc2VzIGluIEx1YSAobm90IG1lcmdpbmcgbWV0aG9kcyBpbnRvIHRoZSBkZXJpdmVkIGNsYXNzZXMpCiAgICAgICAgICAgIGJyZWFrcyBmb3IgY2xhc3NlcyB0aGF0IHByb3ZpZGUgYSBfX2dldGl0ZW0gZnVuY3Rpb24uIFRoZSBfX2dldGl0ZW0gZnVuY3Rpb24KICAgICAgICAgICAgcHJldmVudHMgbWV0aG9kIGNhbGxzIHRvIGFueSBtZXRob2QgZGVmaW5lZCBpbiBhIGJhc2UgY2xhc3MuIFRoaXMgZml4IGNhbGxzCiAgICAgICAgICAgIF9fZ2V0aXRlbSBvbmx5IGlmIHRoZSBtZW1iZXIgaXMgbm90IGZvdW5kIHVzaW5nIHJlY3Vyc2l2ZSBsb29rdXAuCgoyMDE2LTAzLTE4OiBwdG9tdWxpawoJICAgIFtQeXRob25dICM1NjMgU3RvcCBnZW5lcmF0aW5nIHVubmVjZXNzYXJ5IF9zd2lnY29uc3RhbnQgaGVscGVycy4KCjIwMTYtMDMtMTY6IHJpY2hhcmRiZWFyZQoJICAgIFtSXSAjNjM2IEFkZCBleHRyYSBzdGQ6OnZlY3RvciBudW1lcmljIHR5cGVzCgoyMDE2LTAzLTE0OiB3c2Z1bHRvbgoJICAgIFtKYXZhXSBBZGQgc3RkX2FycmF5LmkgZm9yIEMrKzExIHN0ZDo6YXJyYXkgc3VwcG9ydC4KCjIwMTYtMDMtMTI6IHdzZnVsdG9uCgkgICAgW0phdmEsIEMjLCBEXSBGaXggc3RhdGljIGNvbnN0IGNoYXIgbWVtYmVyIHZhcmlhYmxlcyB3cmFwcGVycyB3aXRoICVqYXZhY29uc3QoMSkKICAgICAgICAgICAgJWNzY29uc3QoMSkgb3IgJWRtYW5pZmVzdGNvbnN0LgogICAgICAgICAgICBUaGlzIGZpeGVzIHRoZSBjYXNlIHdoZW4gYW4gaW50ZWdlciBpcyB1c2VkIGFzIHRoZSBpbml0aWFsaXplciwgc3VjaCBhczoKCiAgICAgICAgICAgICAgc3RydWN0IFcgeyBzdGF0aWMgY29uc3QgY2hhciB3ID0gMTAwOyB9OwoKCSAgICBGaXggZ2VuZXJhdGVkIGNvZGUgcGFyc2luZyBlbnVtIHZhbHVlcyB1c2luZyBjaGFyIGVzY2FwZSBzZXF1ZW5jZXMKICAgICAgICAgICAgd2hlbiB0aGVzZSB2YWx1ZXMgYXBwZWFyIGluIHRoZSBKYXZhIGNvZGUgKHVzdWFsbHkgd2hlbiB1c2luZyAlamF2YWNvbnN0KDEpKQogICAgICAgICAgICBzdWNoIGFzOgoKICAgICAgICAgICAgICBlbnVtIFggeyB4MSA9ICdcbicsIHgyID0gJ1wxJyB9OwoKICAgICAgICAgICAgU2ltaWxhcmx5IGZvciBzdGF0aWMgY29uc3QgbWVtYmVyIGNoYXIgdmFyaWFibGVzIHN1Y2ggYXM6CgogICAgICAgICAgICAgIHN0cnVjdCBZIHsgc3RhdGljIGNvbnN0IGNoYXIgeSA9ICdcbic7IH0KCiAgICAgICAgICAgIExpa2V3aXNlIGZvciBEIGFuZCAlZG1hbmlmZXN0Y29uc3RhbnQuIEZvciBDIyBhbmQgJWNzY29uc3QoMSksIGNoYXIKICAgICAgICAgICAgdmFsdWVzIGluIEMjIGFyZSBub3cgaGV4IGVzY2FwZWQgYXMgQyMgZG9lc24ndCBzdXBwb3J0IEMgb2N0YWwgZXNjYXBpbmcuCgoyMDE2LTAzLTExOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSBDI10gQWRkIHN1cHBvcnQgZm9yIHRyZWF0aW5nIEMrKyBiYXNlIGNsYXNzZXMgYXMgSmF2YSBpbnRlcmZhY2VzCiAgICAgICAgICAgIGluc3RlYWQgb2YgSmF2YSBwcm94eSBjbGFzc2VzLiBUaGlzIGVuYWJsZSBzb21lIHNvcnQgb2Ygc3VwcG9ydCBmb3IKICAgICAgICAgICAgbXVsdGlwbGUgaW5oZXJpdGFuY2UuIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBpbiBzd2lnaW50ZXJmYWNlLmkgYW5kCiAgICAgICAgICAgIHByb3ZpZGVzIGFkZGl0aW9uYWwgbWFjcm9zIChzZWUgSmF2YS5odG1sIGZvciBmdWxsIGRvY3VtZW50YXRpb24pOgoKICAgICAgICAgICAgICAlaW50ZXJmYWNlKENUWVBFKQogICAgICAgICAgICAgICVpbnRlcmZhY2VfaW1wbChDVFlQRSkKICAgICAgICAgICAgICAlaW50ZXJmYWNlX2N1c3RvbSgiUFJPWFkiLCAiSU5URVJGQUNFIiwgQ1RZUEUpCgoyMDE2LTAzLTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgcnN0cmlwIGVuY29kZXIgZm9yIHVzZSBpbiAlcmVuYW1lLiBUaGlzIGlzIGxpa2UgdGhlIHN0cmlwIGVuY29kZXIgYnV0CiAgICAgICAgICAgIHN0cmlwcyB0aGUgc3ltYm9sJ3Mgc3VmZml4IGluc3RlYWQgb2YgdGhlIHByZWZpeC4gVGhlIGV4YW1wbGUgYmVsb3cKICAgICAgICAgICAgd2lsbCByZW5hbWUgU29tZVRoaW5nQ2xzIHRvIFNvbWVUaGluZyBhbmQgQW5vdGhlclRoaW5nQ2xzIHRvIEFub3RoZXJUaGluZzoKCiAgICAgICAgICAgICAgJXJlbmFtZSgiJShyc3RyaXA6W0Nsc10pcyIpICIiOwoKICAgICAgICAgICAgICBjbGFzcyBTb21lVGhpbmdDbHMge307CiAgICAgICAgICAgICAgc3RydWN0IEFub3RoZXJUaGluZ0NscyB7fTsKCjIwMTYtMDMtMDE6IG9sbHkKCSAgICBGaXggaXNmaW5pdGUoKSBjaGVjayB0byB3b3JrIHdpdGggR0NDNi4gIEZpeGVzCgkgICAgaXNzdWUgIzYxNSByZXBvcnRlZCBieSBqcGxlc25pay4KCjIwMTYtMDItMTc6IG9sbHkKCSAgICBbUHl0aG9uXSBBZGQgbWlzc2luZyBrZXl3b3JkcyAnYXMnIGFuZCAnd2l0aCcgdG8gcHl0aG9ua3cuc3dnLgoKMjAxNi0wMi0wNzoga3d3ZXR0ZQogICAgICAgICAgICBbT2N0YXZlXSByZWNvZ25pc2UgdmFyaW91cyB1bmFyeSBmdW5jdGlvbnMKICAgICAgICAgICAgKiBVc2UgX19mbG9hdF9fKCkgZm9yIG51bWVyaWMgY29udmVyc2lvbnMsIGUuZy4gd2hlbiBjYWxsaW5nIGRvdWJsZSgpCiAgICAgICAgICAgICogTWFwIHZhcmlvdXMgdW5hcnkgZnVuY3Rpb25zLCBlLmcuIGFicygpIHRvIF9fYWJzX18oKSwgc2VlIGZ1bGwgbGlzdAogICAgICAgICAgICAgIGluIHNlY3Rpb24gMzIuMy4xMCBvZiBtYW51YWw7IG9ubHkgYXZhaWxhYmxlIGluIE9jdGF2ZSAzLjguMCBvciBsYXRlcgoKMjAxNi0wMi0wNzoga3d3ZXR0ZQogICAgICAgICAgICBbT2N0YXZlXSBleHBvcnQgZnVuY3Rpb24gc3dpZ19vY3RhdmVfcHJlcmVxKCkgZm9yIHRlc3RpbmcgT2N0YXZlIHZlcnNpb24KCjIwMTYtMDItMDY6IHBqb2hhbmd1c3RhdnNzb24KICAgICAgICAgICAgW0MjXSBGaXggZHVwbGljYXRlIHN5bWJvbCBwcm9ibGVtcyB3aGVuIGxpbmtpbmcgdGhlIHNvdXJjZSBnZW5lcmF0ZWQKICAgICAgICAgICAgZnJvbSBtdWx0aXBsZSBTV0lHIG1vZHVsZXMgaW50byBvbmUgc2hhcmVkIGxpYnJhcnkgZm9yIHRoZSAtbmFtZXNwYWNlCiAgICAgICAgICAgIG9wdGlvbi4gVGhlIG5hbWVzcGFjZSBpcyBub3cgbWFuZ2xlZCBpbnRvIHRoZSBnbG9iYWwgUEludm9rZSBmdW5jdGlvbgogICAgICAgICAgICBuYW1lcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxNi0wMS0yNzogYWhub2xkcwogICAgICAgICAgICBbUHl0aG9uXSBBZGRlZCBzdXBwb3J0IGZvciBkaWZmZXJlbnRpYXRpbmcgYmV0d2VlbiBQeXRob24gQnl0ZXMKICAgICAgICAgICAgYW5kIFVuaWNvZGUgb2JqZWN0cyB1c2luZyBieSBkZWZpbmluZyBTV0lHX1BZVEhPTl9TVFJJQ1RfQllURV9DSEFSCiAgICAgICAgICAgIGFuZCBTV0lHX1BZVEhPTl9TVFJJQ1RfVU5JQ09ERV9XQ0hBUi4KCjIwMTYtMDEtMjc6IHN0ZWV2ZQogICAgICAgICAgICBbR29dIEVuc3VyZSBzdHJ1Y3RzIGFyZSBwcm9wZXJseSBwYWNrZWQgYmV0d2VlbiBnYyBhbmQgR0NDL2NsYW5nLgoKMjAxNi0wMS0yNTogYWhub2xkcwogICAgICAgICAgICBbUHl0aG9uXSBTdXBwb3J0IHRoZSBmdWxsIFB5dGhvbiB0ZXN0IHN1aXRlIGluIC1jbGFzc2ljIG1vZGUKICAgICAgICAgICAgKiBDb252ZXJ0IGxvbmcvdW5zaWduZWQgbG9uZy9sb25nIGxvbmcvdW5zaWduZWQgbG9uZyBsb25nIHRvIFB5SW50CiAgICAgICAgICAgICAgcmF0aGVyIHRoYW4gUHlMb25nIHdoZW4gcG9zc2libGUuIENlcnRhaW4gcHl0aG9uIGZ1bmN0aW9ucyBsaWtlCiAgICAgICAgICAgICAgbGVuKCkgcmVxdWlyZSBhIFB5SW50IHdoZW4gb3BlcmF0aW5nIG9uIG9sZC1zdHlsZSBjbGFzc2VzLgogICAgICAgICAgICAqIEFkZCBzdXBwb3J0IGZvciBzdGF0aWMgbWV0aG9kcyBpbiBjbGFzc2ljIG1vZGUsIGluY2x1ZGluZyBzdXBwb3J0CiAgICAgICAgICAgICAgZm9yIHB5dGhvbmFwcGVuZCwgcHl0aG9ucHJlcGVuZCwgYW5kIGRvY3N0cmluZ3MuCiAgICAgICAgICAgICogUmVtb3ZpbmcgdGhlIHVzZSBvZiBfX3N3aWdfZ2V0bWV0aG9kc19fIGZvciBzdGF0aWMgbWVtYmVyIG1ldGhvZHMKICAgICAgICAgICAgICBzaW5jZSB0aGV5IHdpbGwgYWx3YXlzIGJlIGZvdW5kIGJ5IHRoZSBzdGFuZGFyZCBhcmd1bWVudCBsb29rdXAKICAgICAgICAgICAgKiBGaXggYSBidWcgd2hlcmUgdGhlIHdyb25nIHR5cGUgb2YgZXhjZXB0aW9uIHdhcyBjYXVnaHQgd2hlbgogICAgICAgICAgICAgIGNoZWNraW5nIGZvciBuZXctc3R5bGUgY2xhc3Mgc3VwcG9ydAoKMjAxNi0wMS0yMzogYWhub2xkcwogICAgICAgICAgICBbR29dIEVuYWJsZSBzdXBwb3J0IGZvciB0aGUgR28gdGVzdC1zdWl0ZSBvbiBPU1g6CiAgICAgICAgICAgICogVGhlIGxpbmtlciBvbiBPU1ggcmVxdWlyZXMgdGhhdCBhbGwgc3ltYm9scyAoZXZlbiB3ZWFrIHN5bWJvbHMpCiAgICAgICAgICAgICAgYXJlIGRlZmluZWQgYXQgbGluayB0aW1lLiBCZWNhdXNlIHRoZSBmdW5jdGlvbiBfY2dvX3RvcG9mc3RhY2sgaXMKICAgICAgICAgICAgICBvbmx5IGRlZmluZWQgc3RhcnRpbmcgaW4gR28gdmVyc2lvbiAxLjQsIHdlIGV4cGxpY2l0bHkgbWFyayBpdCBhcwogICAgICAgICAgICAgIHVuZGVmaW5lZCBmb3Igb2xkZXIgdmVyc2lvbnMgb2YgR28gb24gT1NYLgogICAgICAgICAgICAqIEF2b2lkIHdyaXRpbmcgZW1wdHkgc3dpZ2FyZ3Mgc3RydWN0cywgc2luY2UgZW1wdHkgc3RydWN0cyBhcmUgbm90CiAgICAgICAgICAgICAgYWxsb3dlZCBpbiBleHRlcm4gIkMiIGJsb2Nrcy4KCjIwMTYtMDEtMTI6IG9sbHkKCSAgICBbSmF2YXNjcmlwdF0gTG9vayBmb3IgIm5vZGVqcyIgYXMgd2VsbCBhcyAibm9kZSIsIGFzIGl0J3MgcGFja2FnZWQKCSAgICBhcyB0aGUgZm9ybWVyIG9uIERlYmlhbi4KCjIwMTYtMDEtMTI6IG9sbHkKCSAgICBbSmF2YXNjcmlwdF0gRm9yIHY4ID49IDQuMy4wLCB1c2UgVjhfTUFKT1JfVkVSU0lPTi4KCSAgICBGaXhlcyBpc3N1ZSA1NjEuCgoyMDE2LTAxLTEwOiBhaG5vbGRzCiAgICAgICAgICAgIEltcHJvdmVkIHNpemVfdCBhbmQgcHRyZGlmZl90IHR5cGVtYXBzIHRvIHN1cHBvcnQgbGFyZ2UgdmFsdWVzCiAgICAgICAgICAgIG9uIHBsYXRmb3JtcyB3aGVyZSBzaXplb2Yoc2l6ZV90KSA+IHNpemVvZih1bnNpZ25lZCBsb25nKSBhbmQKICAgICAgICAgICAgc2l6ZW9mKHB0cmRpZmZfdCkgPiBzaXplb2YobG9uZykuCgpWZXJzaW9uIDMuMC44ICgzMSBEZWMgMjAxNSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDE1LTEyLTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBUaGUgcGRmIGRvY3VtZW50YXRpb24gaXMgbm93IGdlbmVyYXRlZCBieSB3a2h0bWx0b3BkZiBhbmQgaGFzIGNvbG91cgogICAgICAgICAgICBmb3IgdGhlIGNvZGUgc25pcHBldHMganVzdCBsaWtlIHRoZSBodG1sIGRvY3VtZW50YXRpb24hCgoyMDE1LTEyLTIzOiBhaG5vbGRzCiAgICAgICAgICAgIFtQeXRob25dIEZpeGVzIGZvciBjb252ZXJzaW9uIG9mIHNpZ25lZCBhbmQgdW5zaWduZWQgaW50ZWdlciB0eXBlczoKCiAgICAgICAgICAgIE5vIGxvbmdlciBjaGVjayBmb3IgUHlJbnQgb2JqZWN0cyBpbiBQeXRob24zLiBCZWNhdXNlIFB5SW50X0NoZWNrCiAgICAgICAgICAgIGFuZCBmcmllbmRzIGFyZSAjZGVmaW5lZCB0byB0aGUgY29ycmVzcG9uZGluZyBQeUxvbmcgbWV0aG9kcywgdGhpcwogICAgICAgICAgICBoYWQgY2F1c2VkIGVycm9ycyBpbiBQeXRob24zIHdoZXJlIHZhbHVlcyBncmVhdGVyIHRoYW4gd2hhdCBjb3VsZCBiZQogICAgICAgICAgICBzdG9yZWQgaW4gYSBsb25nIHdlcmUgaW5jb3JyZWN0bHkgaW50ZXJwcmV0ZWQgYXMgdGhlIHZhbHVlIC0xIHdpdGgKICAgICAgICAgICAgdGhlIFB5dGhvbiBlcnJvciBpbmRpY2F0b3Igc2V0IHRvIE92ZXJmbG93RXJyb3IuIFRoaXMgYXBwbGllcyB0bwogICAgICAgICAgICBib3RoIHRoZSBjb252ZXJzaW9ucyBQeUxvbmctPmxvbmcgYW5kIFB5TG9uZy0+ZG91YmxlLgoKICAgICAgICAgICAgQ29udmVyc2lvbiBmcm9tIFB5TG9uZyB0byBsb25nLCB1bnNpZ25lZCBsb25nLCBsb25nIGxvbmcsIGFuZAogICAgICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgbm93IHJhaXNlIE92ZXJmbG93RXJyb3IgaW5zdGVhZCBvZiBUeXBlRXJyb3IgaW4KICAgICAgICAgICAgYm90aCBQeXRob24yIGFuZCBQeXRob24zIGZvciBQeUxvbmcgdmFsdWVzIG91dHNpZGUgdGhlIHJhbmdlCiAgICAgICAgICAgIGV4cHJlc3NpYmxlIGJ5IHRoZSBjb3JyZXNwb25kaW5nIEMgdHlwZS4gVGhpcyBtYXRjaGVzIHRoZSBleGlzdGluZwogICAgICAgICAgICBiZWhhdmlvciBmb3Igb3RoZXIgaW50ZWdyYWwgdHlwZXMgKHNpZ25lZCBhbmQgdW5zaWduZWQgaW50cywgc2hvcnRzLAogICAgICAgICAgICBhbmQgY2hhcnMpLCBhcyB3ZWxsIGFzIHRoZSBjb252ZXJzaW9uIGZvciBQeUludCB0byBhbGwgbnVtZXJpYwogICAgICAgICAgICB0eXBlcy4gVGhpcyBhbHNvIGluZGlyZWN0bHkgYXBwbGllcyB0byB0aGUgc2l6ZV90IGFuZCBwdHJkaWZmX3QKICAgICAgICAgICAgdHlwZXMsIHdoaWNoIGRlcGVuZCBvbiB0aGUgY29udmVyc2lvbnMgZm9yIHVuc2lnbmVkIGxvbmcgYW5kIGxvbmcuCgoyMDE1LTEyLTE5OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBQeXRob24gMiBVbmljb2RlIFVURi04IHN0cmluZ3MgY2FuIGJlIHVzZWQgYXMgaW5wdXRzIHRvIGNoYXIgKiBvcgogICAgICAgICAgICBzdGQ6OnN0cmluZyB0eXBlcyBpZiB0aGUgZ2VuZXJhdGVkIEMvQysrIGNvZGUgaGFzIFNXSUdfUFlUSE9OXzJfVU5JQ09ERSBkZWZpbmVkLgoKMjAxNS0xMi0xNzogd3NmdWx0b24KICAgICAgICAgICAgSXNzdWVzICMyODYsICMxMjgKICAgICAgICAgICAgUmVtb3ZlIGNjYWNoZS1zd2lnLjEgbWFuIHBhZ2UgLSBwbGVhc2UgdXNlIHRoZSBDQ2FjaGUuaHRtbCBkb2NzIGluc3RlYWQuCiAgICAgICAgICAgIFRoZSB5b2RsMm1hbiBhbmQgeW9kbDJodG1sIHRvb2xzIGFyZSBubyBsb25nZXIgdXNlZCBhbmQgc28gU1dJRyBubwogICAgICAgICAgICBsb25nZXIgaGFzIGEgZGVwZW5kZW5jeSBvbiB0aGVzZSBwYWNrYWdlcyB3aGljaCB3ZXJlIHJlcXVpcmVkIHdoZW4KICAgICAgICAgICAgYnVpbGRpbmcgZnJvbSBnaXQuCgoyMDE1LTEyLTE2OiB6dHVybmVyL2NvbGViCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBQeXRob24zLjUgaW50ZXJwcmV0ZXIgYXNzZXJ0aW9ucyB3aGVuIG9iamVjdHMgYXJlIGJlaW5nCiAgICAgICAgICAgIGRlbGV0ZWQgZHVlIHRvIGFuIGV4aXN0aW5nIGV4Y2VwdGlvbi4gTW9zdCBub3RhYmx5IGluIGdlbmVyYXRvcnMKICAgICAgICAgICAgd2hpY2ggdGVybWluYXRlIHVzaW5nIGEgU3RvcEl0ZXJhdGlvbiBleGNlcHRpb24uIEZpeGVzICM1NTkgIzU2MCAjNTczLgogICAgICAgICAgICBJZiBhIGZ1cnRoZXIgZXhjZXB0aW9uIGlzIHJhaXNlZCBkdXJpbmcgYW4gb2JqZWN0IGRlc3RydWN0aW9uLAogICAgICAgICAgICBQeUVycl9Xcml0ZVVucmFpc2FibGUgaXMgdXNlZCBvbiB0aGlzIHNlY29uZCBleGNlcHRpb24gYW5kIHRoZQogICAgICAgICAgICBvcmlnaW5hbCBleGNlcHRpb24gYnViYmxlcyB0aHJvdWdoLgoKMjAxNS0xMi0xNDogYWhub2xkcy93c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBZGQgaW4gbWlzc2luZyBpbml0aWFsaXplcnMgZm9yIHRwX2ZpbmFsaXplLAogICAgICAgICAgICBuYl9tYXRyaXhfbXVsdGlwbHksIG5iX2lucGxhY2VfbWF0cml4X211bHRpcGx5LCBodF9xdWFsbmFtZQogICAgICAgICAgICBodF9jYWNoZWRfa2V5cyBhbmQgdHBfcHJldi4KCjIwMTUtMTItMTI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBTVEwgd3JhcHBlcnMgdG8gbm90IGdlbmVyYXRlIDw6IGRpZ3JhcGhzLgogICAgICAgICAgICBGb3IgZXhhbXBsZSBzdGQ6OnZlY3Rvcjw6Olg6Olk+IHdhcyBzb21ldGltZXMgZ2VuZXJhdGVkLCBub3cKICAgICAgICAgICAgY29ycmVjdGVkIHRvIHN0ZDo6dmVjdG9yPCA6Olg6OlkgPi4KCjIwMTUtMTEtMjU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBTVEwgcmFuZ2VzIGFuZCBzbGljZXMgZml4ZXMuCgogICAgICAgICAgICBSdWJ5IFNUTCBjb250YWluZXIgc2V0dGluZyBzbGljZXMgZml4ZXM6CgogICAgICAgICAgICBTZXR0aW5nIGFuIFNUTCBjb250YWluZXIgd3JhcHBlciBzbGljZSBiZXR0ZXIgbWF0Y2hlcyB0aGUgd2F5IFJ1YnkKICAgICAgICAgICAgYXJyYXlzIHdvcmsuIFRoZSBiZWhhdmlvdXIgaXMgbm93IHRoZSBzYW1lIGFzIFJ1YnkgYXJyYXlzLiBUaGUgb25seQogICAgICAgICAgICBleGNlcHRpb24gaXMgdGhlIGRlZmF1bHQgdmFsdWUgdXNlZCB3aGVuIGV4cGFuZGluZyBhIGNvbnRhaW5lcgogICAgICAgICAgICBjYW5ub3QgYmUgbmlsIGFzIHRoaXMgaXMgbm90IGEgdmFsaWQgdHlwZS92YWx1ZSBmb3IgQysrIGNvbnRhaW5lcgogICAgICAgICAgICBlbGVtZW50cy4KCiAgICAgICAgICAgIE9idGFpbmluZyBhIFJ1YnkgU1RMIGNvbnRhaW5lciByYW5nZXMgYW5kIHNsaWNlcyBmaXhlczoKCiAgICAgICAgICAgIEFjY2VzcyB2aWEgcmFuZ2VzIGFuZCBzbGljZXMgbm93IGJlaGF2ZSBpZGVudGljYWxseSB0byBSdWJ5IGFycmF5cy4KICAgICAgICAgICAgVGhlIGZpeGVzIGFyZSBtb3N0bHkgZm9yIG91dCBvZiByYW5nZSBpbmRpY2VzIGFuZCBsZW5ndGhzLgogICAgICAgICAgICAtIFplcm8gbGVuZ3RoIHNsaWNlIHJlcXVlc3RzIHJldHVybiBhbiBlbXB0eSBjb250YWluZXIgaW5zdGVhZCBvZiBuaWwuCiAgICAgICAgICAgIC0gU2xpY2VzIHdoaWNoIHJlcXVlc3QgYSBsZW5ndGggZ3JlYXRlciB0aGFuIHRoZSBzaXplIG9mIHRoZSBjb250YWluZXIKICAgICAgICAgICAgICBubyBsb25nZXIgY2hvcCBvZmYgdGhlIGxhc3QgZWxlbWVudC4KICAgICAgICAgICAgLSBSYW5nZXMgd2hpY2ggdXNlZCB0byByZXR1cm4gbmlsIG5vdyByZXR1cm4gYW4gZW1wdHkgYXJyYXkgd2hlbiB0aGUKICAgICAgICAgICAgICB0aGUgc3RhcnQgZWxlbWVudCBpcyBhIHZhbGlkIGluZGV4LgoKICAgICAgICAgICAgUnVieSBTVEwgY29udGFpbmVyIG5lZ2F0aXZlIGluZGV4aW5nIHN1cHBvcnQgaW1wcm92ZWQuCgogICAgICAgICAgICBVc2luZyBuZWdhdGl2ZSBpbmRleGVzIHRvIHNldCB2YWx1ZXMgd29ya3MgdGhlIHNhbWUgYXMgUnVieSBhcnJheXMsIGVnCgogICAgICAgICAgICAldGVtcGxhdGUoSW50VmVjdG9yKSBzdGQ6OnZlY3RvcjxpbnQ+OwoKICAgICAgICAgICAgaXYgPSBJbnRWZWN0b3IubmV3KFsxLDIsMyw0XSkKICAgICAgICAgICAgaXZbLTRdID0gOSAjID0+IFsxLDIsMyw5XQogICAgICAgICAgICBpdlstNV0gPSA5ICMgPT4gSW5kZXhFcnJvcgoKMjAxNS0xMS0yMTogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnksIFB5dGhvbl0gQWRkIHN0ZDo6YXJyYXkgY29udGFpbmVyIHdyYXBwZXJzLgoKICAgICAgICAgICAgVGhlc2Ugd29yayBtdWNoIGxpa2UgYW55IG9mIHRoZSBvdGhlciBTVEwgY29udGFpbmVycyBleGNlcHQgUHl0aG9uL1J1Ynkgc2xpY2luZwogICAgICAgICAgICBpcyBzb21ld2hhdCBsaW1pdGVkIGJlY2F1c2UgdGhlIGFycmF5IGlzIGEgZml4ZWQgc2l6ZS4gT25seSBzbGljZXMgb2YKICAgICAgICAgICAgdGhlIGZ1bGwgc2l6ZSBhcmUgc3VwcG9ydGVkLgoKMjAxNS0xMC0xMDogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gIzUzOSAtIFN1cHBvcnQgUHl0aG9uIDMuNSBhbmQgLWJ1aWx0aW4uICBQeUFzeW5jTWV0aG9kcyBpcyBhIG5ldwogICAgICAgICAgICBtZW1iZXIgaW4gUHlIZWFwVHlwZU9iamVjdC4KCjIwMTUtMTAtMDY6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBEb24ndCBlbWl0IGEgY29uc3RydWN0b3IgZnVuY3Rpb24gZm9yIGEgZGlyZWN0b3IKCSAgICBjbGFzcyB3aXRoIGFuIGFic3RyYWN0IG1ldGhvZCwgc2luY2UgdGhlIGZ1bmN0aW9uIHdpbGwKCSAgICBhbHdheXMgcGFuaWMuCgoyMDE1LTEwLTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJXNoYXJlZF9wdHIgc3VwcG9ydCBmb3IgcHJpdmF0ZSBhbmQgcHJvdGVjdGVkIGluaGVyaXRhbmNlLgogICAgICAgICAgICAtIFJlbW92ZSB1bm5lY2Vzc2FyeSBXYXJuaW5nIDUyMDogRGVyaXZlZCBjbGFzcyAnRGVyaXZlZCcgb2YgJ0Jhc2UnCiAgICAgICAgICAgICAgaXMgbm90IHNpbWlsYXJseSBtYXJrZWQgYXMgYSBzbWFydCBwb2ludGVyCiAgICAgICAgICAgIC0gRG8gbm90IGdlbmVyYXRlIGNvZGUgdGhhdCBhdHRlbXB0cyB0byBjYXN0IHVwIHRoZSBpbmhlcml0YW5jZSBjaGFpbiBpbiB0aGUKICAgICAgICAgICAgICB0eXBlIHN5c3RlbSBydW50aW1lIGluIHN1Y2ggY2FzZXMgYXMgaXQgZG9lc24ndCBjb21waWxlIGFuZCBjYW4ndCBiZSB1c2VkLgogICAgICAgICAgICBSZW1vdmUgdW5uZWNlc3Nhcnkgd2FybmluZyA1MjAgZm9yICVzaGFyZWRfcHRyIHdoZW4gdGhlIGJhc2UgY2xhc3MgaXMgaWdub3JlZC4KCjIwMTUtMTAtMDE6IHZrYWxpbmluCiAgICAgICAgICAgIEZpeCAjNTA4OiBGaXggc2VnZmF1bHQgcGFyc2luZyBhbm9ueW1vdXMgdHlwZWRlZiBuZXN0ZWQgY2xhc3Nlcy4KCjIwMTUtMDktMjY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBBZGQgc2hhcmVkX3B0ciBzdXBwb3J0CgoyMDE1LTA5LTEzOiBra2FlbXBmCiAgICAgICAgICAgIFtSdWJ5XSBSZXNvbHZlIHRyYWNraW5nIGJ1ZyAtIGlzc3VlICMyMjUuCiAgICAgICAgICAgIFRoZSBidWcgaXMgdGhhdCB0aGUgdHJhY2tpbmcgY29kZSB1c2VzIGEgcnVieSBoYXNoIGFuZCB0aHVzIG1heQogICAgICAgICAgICBhbGxvY2F0ZSBvYmplY3RzIChCaWdudW0pIHdoaWxlIHJ1bm5pbmcgdGhlIEdDLiBUaGlzIHdhcyB0b2xlcmF0ZWQgaW4KICAgICAgICAgICAgMS44IGJ1dCBpcyBpbnZhbGlkIChyYWlzZXMgYW4gZXhjZXB0aW9uKSBpbiAxLjkuCiAgICAgICAgICAgIFRoZSBwYXRjaCB1c2VzIGEgQyBoYXNoIChhbHNvIHVzZWQgYnkgcnVieSkgaW5zdGVhZC4KCjIwMTUtMDktMDk6IGx5emUKICAgICAgICAgICAgW0NGRkldIEV4dGVuZCB0aGUgImV4cG9ydCIgZmVhdHVyZSBpbiB0aGUgQ0ZGSSBtb2R1bGUgdG8gc3VwcG9ydAogICAgICAgICAgICBleHBvcnRpbmcgdG8gYSBzcGVjaWZpZWQgcGFja2FnZS4KCjIwMTUtMDktMDQ6IG9sbHkKCSAgICBbUHl0aG9uXSBGaXggZG9jc3RyaW5ncyBmb3IgJWNhbGxiYWNrIGZ1bmN0aW9ucy4KCjIwMTUtMDktMDM6IGRlbWktcmx1ZGR5CiAgICAgICAgICAgIFtHb10gUmVtb3ZlZCBnb2xhbmcgc3RyaW5naW5nIGZvciBzaWduZWQvdW5zaWduZWQgY2hhcgoKICAgICAgICAgICAgQ2hhbmdlZCBkZWZhdWx0IGhhbmRsaW5nIG9mIHNpZ25lZCBjaGFyKiBhbmQgdW5zaWduZWQgY2hhciogdG8gYmUKICAgICAgICAgICAgb3BhcXVlIHBvaW50ZXJzIHJhdGhlciB0aGFuIHN0cmluZ3MsIHNpbWlsYXJseSB0byBob3cgb3RoZXIKICAgICAgICAgICAgbGFuZ3VhZ2VzIHdvcmsuCgogICAgICAgICAgICBBbnkgZXhpc3RpbmcgY29kZSByZWx5aW5nIG9uIHRyZWF0aW5nIHNpZ25lZCBjaGFyKiBvciB1bnNpZ25lZAogICAgICAgICAgICBjaGFyKiBhcyBhIHN0cmluZyBjYW4gcmVzdG9yZSB0aGUgb2xkIGJlaGF2aW9yIHdpdGggdHlwZW1hcHMuaSBieQogICAgICAgICAgICB1c2luZyAlYXBwbHkgdG8gY29weSB0aGUgW3VuY2hhbmdlZF0gY2hhciogYmVoYXZpb3IuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTUtMDgtMDc6IHRhbGJ5CiAgICAgICAgICAgIFtQZXJsXSB0aWR5IC1XdGF1dG9sb2dpY2FsLWNvbnN0YW50LW91dC1vZi1yYW5nZS1jb21wYXJlIHdhcm5pbmdzIHdoZW4gYnVpbGRpbmcgZ2VuZXJhdGVkIGNvZGUgdW5kZXIgY2xhbmcKCjIwMTUtMDgtMDc6IHhhbnRhcmVzCiAgICAgICAgICAgIFtQeXRob25dIHBlcDI1NyAmIG51bXB5ZG9jIGNvbmZvcm1pbmcgZG9jc3RyaW5nczoKICAgICAgICAgICAgLSBNb25vLWxpbmUgbW9kdWxlIGRvY3NzdHJpbmcKICAgICAgICAgICAgLSBSZXdyaXRlIGF1dG9kb2MgcGFyYW1ldGVycyBzZWN0aW9uIGluIG51bXB5ZG9jIHN0eWxlOgogICAgICAgICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9udW1weS9udW1weS9ibG9iL21hc3Rlci9kb2MvSE9XVE9fRE9DVU1FTlQucnN0LnR4dAogICAgICAgICAgICAtIE9uZSBsaW5lIHN1bW1hcnkgc2hvdWxkIGVuZCB3aXRoICIuIgogICAgICAgICAgICAtIEFkZHMgYSBibGFuayBsaW5lIGFmdGVyIGNsYXNzIGRvY3N0cmluZwoKMjAxNS0wOC0wNTogdmFkegogICAgICAgICAgICBbSmF2YV0gTWFrZSAoY2hhciogU1RSSU5HLCBzaXplX3QgTEVOR1RIKSB0eXBlbWFwcyB1c2FibGUgZm9yCiAgICAgICAgICAgIHN0cmluZ3Mgb2Ygb3RoZXIgdHlwZXMsIGUuZy4gInVuc2lnbmVkIGNoYXIqIi4KClZlcnNpb24gMy4wLjcgKDMgQXVnIDIwMTUpCj09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDE1LTA4LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IHBvdGVudGlhbCBzZWN1cml0eSBleHBsb2l0IGluIGdlbmVyYXRlZCBKYXZhIGNsYXNzZXMuCiAgICAgICAgICAgIFRoZSBzd2lnQ1B0ciBhbmQgc3dpZ0NNZW1Pd24gbWVtYmVyIHZhcmlhYmxlcyBpbiB0aGUgZ2VuZXJhdGVkIEphdmEKICAgICAgICAgICAgY2xhc3NlcyBhcmUgbm93IGRlY2xhcmVkICd0cmFuc2llbnQnIGJ5IGRlZmF1bHQuIEZ1cnRoZXIgZGV0YWlscyBvZiB0aGUgZXhwbG9pdAogICAgICAgICAgICBpbiBBbmRyb2lkIGlzIGJlaW5nIHB1Ymxpc2hlZCBpbiBhbiBhY2FkZW1pYyBwYXBlciBhcyBwYXJ0IG9mIFVTRU5JWCBXT09UICcxNToKICAgICAgICAgICAgaHR0cHM6Ly93d3cudXNlbml4Lm9yZy9jb25mZXJlbmNlL3dvb3QxNS93b3Jrc2hvcC1wcm9ncmFtL3ByZXNlbnRhdGlvbi9wZWxlcy4KCiAgICAgICAgICAgIEluIHRoZSB1bmxpa2VseSBldmVudCB0aGF0IHlvdSBhcmUgcmVseWluZyBvbiB0aGVzZSBtZW1iZXJzIGJlaW5nIHNlcmlhbGl6YWJsZSwKICAgICAgICAgICAgdGhlbiB5b3Ugd2lsbCBuZWVkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGphdmFib2R5IGFuZCBqYXZhYm9keV9kZXJpdmVkIHR5cGVtYXBzCiAgICAgICAgICAgIHRvIGdlbmVyYXRlIHRoZSBvbGQgZ2VuZXJhdGVkIGNvZGUuIFRoZSByZWxldmFudCB0eXBlbWFwcyBhcmUgaW4gdGhlIExpYiBkaXJlY3RvcnkKICAgICAgICAgICAgaW4gdGhlIGphdmEuc3dnLCBib29zdF9zaGFyZWRfcHRyLmkgYW5kIGJvb3N0X2ludHJ1c2l2ZV9wdHIuaSBmaWxlcy4gQ29weSB0aGUKICAgICAgICAgICAgcmVsZXZhbnQgZGVmYXVsdCB0eXBlbWFwcyBpbnRvIHlvdXIgaW50ZXJmYWNlIGZpbGUgYW5kIHJlbW92ZSB0aGUgJ3RyYW5zaWVudCcga2V5d29yZC4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxNS0wOC0wMTogdmFkegogICAgICAgICAgICBNYWtlIGNvbmZpZ3VyZSAtLXdpdGhvdXQtYWxsbGFuZyBvcHRpb24gbW9yZSB1c2VmdWw6IGl0IGNhbiBub3cgYmUgb3ZlcnJpZGRlbiBieSB0aGUgZm9sbG93aW5nCiAgICAgICAgICAgIC0td2l0aC14eHggb3B0aW9ucywgYWxsb3dpbmcgdG8gZWFzaWx5IGVuYWJsZSBqdXN0IG9uZSBvciB0d28gbGFuZ3VhZ2VzLgoKMjAxNS0wNy0zMDogd3NmdWx0b24KICAgICAgICAgICAgRml4ICM0NDAgLSBJbml0aWFsaXNlIGFsbCBuZXdseSBjcmVhdGVkIGFycmF5cyB3aGVuIHVzaW5nICVhcnJheV9mdW5jdGlvbnMgYW5kICVhcnJheV9jbGFzcwogICAgICAgICAgICBpbiB0aGUgY2FycmF5cy5pIGxpYnJhcnkgLSBidWcgaXMgb25seSByZWxldmFudCB3aGVuIHVzaW5nIEMrKy4KCjIwMTUtMDctMjk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEltcHJvdmUgaW5kZW50YXRpb24gd2FybmluZyBhbmQgZXJyb3IgbWVzc2FnZXMgZm9yIGNvZGUgaW4gdGhlIGZvbGxvd2luZyBkaXJlY3RpdmVzOgoKICAgICAgICAgICAgICAlcHl0aG9ucHJlcGVuZAogICAgICAgICAgICAgICVweXRob25hcHBlbmQKICAgICAgICAgICAgICAlcHl0aG9uY29kZQogICAgICAgICAgICAgICVweXRob25iZWdpbgogICAgICAgICAgICAgICVmZWF0dXJlKCJzaGFkb3ciKQoKICAgICAgICAgICAgT2xkIGVycm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgRXJyb3I6IExpbmUgaW5kZW50ZWQgbGVzcyB0aGFuIGV4cGVjdGVkIChsaW5lIDMgb2YgcHl0aG9uY29kZSkKCiAgICAgICAgICAgIE5ldyBlcnJvciBleGFtcGxlOgogICAgICAgICAgICAgIEVycm9yOiBMaW5lIGluZGVudGVkIGxlc3MgdGhhbiBleHBlY3RlZCAobGluZSAzIG9mICVweXRob25jb2RlIG9yICVpbnNlcnQoInB5dGhvbiIpIGJsb2NrKQogICAgICAgICAgICAgIGFzIG5vIGxpbmUgc2hvdWxkIGJlIGluZGVudGVkIGxlc3MgdGhhbiB0aGUgaW5kZW50YXRpb24gaW4gbGluZSAxCgogICAgICAgICAgICBPbGQgd2FybmluZyBleGFtcGxlOgogICAgICAgICAgICAgIFdhcm5pbmcgNzQwOiBXaGl0ZXNwYWNlIHByZWZpeCBkb2Vzbid0IG1hdGNoIChsaW5lIDIgb2YgJXB5dGhvbmNvZGUgb3IgJWluc2VydCgicHl0aG9uIikgYmxvY2spCgogICAgICAgICAgICBOZXcgd2FybmluZyBleGFtcGxlOgogICAgICAgICAgICAgIFdhcm5pbmcgNzQwOiBXaGl0ZXNwYWNlIGluZGVudGF0aW9uIGlzIGluY29uc2lzdGVudCBjb21wYXJlZCB0byBlYXJsaWVyIGxpbmVzIChsaW5lIDMgb2YKICAgICAgICAgICAgICAlcHl0aG9uY29kZSBvciAlaW5zZXJ0KCJweXRob24iKSBibG9jaykKCiAgICAgICAgICAgIAoyMDE1LTA3LTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggIzQ3NS4gSW1wcm92ZSBkb2NzdHJpbmcgaW5kZW50YXRpb24gaGFuZGxpbmcuCiAgICAgICAgICAgIAogICAgICAgICAgICBTV0lHLTMuMC41IGFuZCBlYXJsaWVyIHNvbWV0aW1lcyB0cnVuY2F0ZWQgdGV4dCBwcm92aWRlZCBpbiB0aGUgZG9jc3RyaW5nIGZlYXR1cmUuCiAgICAgICAgICAgIFRoaXMgb2NjdXJyZWQgd2hlbiB0aGUgaW5kZW50YXRpb24gKHdoaXRlc3BhY2UpIGluIHRoZSBkb2NzdHJpbmcgd2FzIGxlc3MgaW4gdGhlCiAgICAgICAgICAgIHNlY29uZCBvciBsYXRlciBsaW5lcyB3aGVuIGNvbXBhcmVkIHRvIHRoZSBmaXJzdCBsaW5lLgogICAgICAgICAgICBTV0lHLTMuMC42IGdhdmUgYSAnTGluZSBpbmRlbnRlZCBsZXNzIHRoYW4gZXhwZWN0ZWQnIGVycm9yIGluc3RlYWQgb2YgdHJ1bmNhdGluZwogICAgICAgICAgICB0aGUgZG9jc3RyaW5nIHRleHQuCiAgICAgICAgICAgIE5vdyB0aGUgaW5kZW50YXRpb24gZm9yIHRoZSAnZG9jc3RyaW5nJyBmZWF0dXJlIGlzIHNtYXJ0ZXIgYW5kIGlzIGFwcHJvcHJpYXRlbHkKICAgICAgICAgICAgYWRqdXN0ZWQgc28gdGhhdCBubyB0cnVuY2F0aW9uIG9jY3Vycy4KCjIwMTUtMDctMjI6IHdzZnVsdG9uCiAgICAgICAgICAgIFN1cHBvcnQgZm9yIHNwZWNpYWwgdmFyaWFibGUgZXhwYW5zaW9uIGluIHR5cGVtYXAgYXR0cmlidXRlcy4gRXhhbXBsZSB1c2FnZSBleHBhbnNpb24KICAgICAgICAgICAgaW4gdGhlICdvdXQnIGF0dHJpYnV0ZSAoQyMgc3BlY2lmaWMpOgoKICAgICAgICAgICAgICAldHlwZW1hcChjdHlwZSwgb3V0PSIkKjFfbHR5cGUiKSB1bnNpZ25lZCBpbnQmICIkKjFfbHR5cGUiCgogICAgICAgICAgICBpcyBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmcgYXMgJCoxX2x0eXBlIGV4cGFuZHMgdG8gJ3Vuc2lnbmVkIGludCc6CgogICAgICAgICAgICAgICV0eXBlbWFwKGN0eXBlLCBvdXQ9InVuc2lnbmVkIGludCIpIHVuc2lnbmVkIGludCYgInVuc2lnbmVkIGludCIKCiAgICAgICAgICAgIFNwZWNpYWwgdmFyaWFibGVzIGNhbiBiZSB1c2VkIHdpdGhpbiBzcGVjaWFsIHZhcmlhYmxlIG1hY3JvcyB0b28uIEV4YW1wbGUgdXNhZ2UgZXhwYW5zaW9uOgoKICAgICAgICAgICAgICAldHlwZW1hcChjc3R5cGUpIHVuc2lnbmVkIGludCAidWludCIKICAgICAgICAgICAgICAldHlwZW1hcChjc3R5cGUsIG91dD0iJHR5cGVtYXAoY3N0eXBlLCAkKjFfbHR5cGUpIikgdW5zaWduZWQgaW50JiAiJHR5cGVtYXAoY3N0eXBlLCAkKjFfbHR5cGUpIgoKICAgICAgICAgICAgU3BlY2lhbCB2YXJpYWJsZXMgYXJlIGV4cGFuZGVkIGZpcnN0IGFuZCBoZW5jZSB0aGUgYWJvdmUgaXMgZXF1aXZhbGVudCB0bzoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoY3N0eXBlLCBvdXQ9IiR0eXBlbWFwKGNzdHlwZSwgdW5zaWduZWQgaW50KSIpIHVuc2lnbmVkIGludCYgIiR0eXBlbWFwKGNzdHlwZSwgdW5zaWduZWQgaW50KSIKCiAgICAgICAgICAgIHdoaWNoIHRoZW4gZXhwYW5kcyB0bzoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoY3N0eXBlLCBvdXQ9InVpbnQiKSB1bnNpZ25lZCBpbnQmICJ1aW50IgoKMjAxNS0wNy0yMjogbGluZGxleWYKCSAgICBBcHBseSBwYXRjaCAjNDM5IC0gc3VwcG9ydCBmb3IgJHR5cGVtYXAoKSAoYWthIGVtYmVkZGVkIHR5cGVtYXBzIG9yIHNwZWNpYWwgdmFyaWFibGUKICAgICAgICAgICAgbWFjcm9zKSBpbiB0eXBlbWFwIGF0dHJpYnV0ZXMuIEEgc2ltcGxlIGV4YW1wbGUgd2hlcmUgJHR5cGVtYXAoKSBpcyBleHBhbmRlZCBpbiB0aGUKICAgICAgICAgICAgJ291dCcgYXR0cmlidXRlIChDIyBzcGVjaWZpYyk6CgogICAgICAgICAgICAgICV0eXBlbWFwKGNzdHlwZSkgdW5zaWduZWQgaW50ICJ1aW50IgogICAgICAgICAgICAgICV0eXBlbWFwKGNzdHlwZSwgb3V0PSIkdHlwZW1hcChjc3R5cGUsIHVuc2lnbmVkIGludCkiKSB1bnNpZ25lZCBpbnQmICIkdHlwZW1hcChjc3R5cGUsIHVuc2lnbmVkIGludCkiCgogICAgICAgICAgICBpcyBlcXVpdmFsZW50IHRvOgoKICAgICAgICAgICAgICAldHlwZW1hcChjc3R5cGUsIG91dD0idWludCIpIHVuc2lnbmVkIGludCYgInVpbnQiCgoyMDE1LTA3LTE4OiBtN3Rob24KCSAgICBbUHl0aG9uXSBEb2NzdHJpbmdzIHByb3ZpZGVkIHZpYSAlZmVhdHVyZSgiZG9jc3RyaW5nIikgYXJlIG5vdyBxdW90ZWQgYW5kIGFkZGVkIHRvCiAgICAgICAgICAgIHRoZSB0cF9kb2Mgc2xvdCB3aGVuIHVzaW5nIHB5dGhvbiBidWlsdGluIGNsYXNzZXMgKC1idWlsdGluKS4gV2hlbiBubyBkb2NzdHJpbmcgaXMKICAgICAgICAgICAgcHJvdmlkZWQsIHRoZSB0cF9kb2Mgc2xvdCBpcyBzZXQgdG8gdGhlIGZ1bGx5IHF1YWxpZmllZCBDL0MrKyBjbGFzcyBuYW1lLgogICAgICAgICAgICBHaXRodWIgaXNzdWVzICM0NDUgYW5kICM0NjEuCgoyMDE1LTA3LTE3OiBrd3dldHRlCiAgICAgICAgICAgIFtvY3RhdmVdIFN1cHBvcnQgT2N0YXZlIHZlcnNpb24gNC4wLjAgKHRoYW5rcyB0byBwYXRjaGVzIGZyb20gT3Jpb24gUG9wbGF3c2tpKS4KCjIwMTUtMDctMDc6IHdzZnVsdG9uCgkgICAgU1dJRyBubyBsb25nZXIgZ2VuZXJhdGVzIGEgd3JhcHBlciBmb3IgYSBjbGFzcycgY29uc3RydWN0b3IgaWYgdGhhdCBjbGFzcyBoYXMKICAgICAgICAgICAgYW55IGJhc2UgY2xhc3Mgd2l0aCBhIHByaXZhdGUgZGVzdHJ1Y3Rvci4gVGhpcyBpcyBiZWNhdXNlIHlvdXIgY29tcGlsZXIgc2hvdWxkCiAgICAgICAgICAgIG5vdCBhbGxvdyBhIGNsYXNzIHRvIGJlIGluc3RhbnRpYXRlZCBpZiBhIGJhc2UgaGFzIGEgcHJpdmF0ZSBkZXN0cnVjdG9yLiBTb21lCiAgICAgICAgICAgIGNvbXBpbGVycyBkbywgc28gaWYgeW91IG5lZWQgdGhlIG9sZCBiZWhhdmlvdXIsIHVzZSB0aGUgIm5vdGFic3RyYWN0IiBmZWF0dXJlLCBlZzoKCiAgICAgICAgICAgICAgJWZlYXR1cmUoIm5vdGFic3RyYWN0IikgRGVyaXZlZDsKICAgICAgICAgICAgICBjbGFzcyBCYXNlIHsKICAgICAgICAgICAgICAgIH5CYXNlKCkge30KICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIHN0cnVjdCBEZXJpdmVkIDogQmFzZSB7fTsKClZlcnNpb24gMy4wLjYgKDUgSnVsIDIwMTUpCj09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDE1LTA3LTAyOiB3c2Z1bHRvbgoJICAgIEZpeCBzeW50YXggZXJyb3Igd2hlbiB0aGUgdGVtcGxhdGUga2V5d29yZCBpcyB1c2VkIGluIHR5cGVzLCBlZzoKCiAgICAgICAgICAgICAgc3RkOjp0ZW1wbGF0ZSB2ZWN0b3I8aW50PiB2OwoKMjAxNS0wNy0wMjogbmdsYWRpdHoKCSAgICBbTHVhXSBQdXNoIGNoYXJhY3RlcnMgYXMgdW5mb3JtYXR0ZWQgMS1jaGFyYWN0ZXIgc3RyaW5ncyB0byBhdm9pZAoJICAgIHVucHJpbnRhYmxlIGNoYXJhY3RlcnMgc3VjaCBhcyAoY2hhcikxMjcgYmVpbmcgY29udmVydGVkIHRvCgkgICAgIjxcMTI3PiIgd2l0aCBMdWEgNS4zIGFuZCBsYXRlci4gIChnaXRodWIgUFIgIzQ1MikKCjIwMTUtMDYtMjk6IG9sbHkKCSAgICBbUHl0aG9uXSBJbXByb3ZlIGhhbmRsaW5nIG9mIHdoaXRlc3BhY2UgaW4gJXB5dGhvbmNvZGUuCgoJICAgIFByZXZpb3VzbHkgU1dJRyBsb29rZWQgYXQgdGhlIGluZGVudGF0aW9uIG9mIHRoZSBmaXJzdCBsaW5lIGFuZAoJICAgIHJlbW92ZWQgdGhhdCBtYW55IGNoYXJhY3RlcnMgZnJvbSBlYWNoIHN1YnNlcXVlbnQgbGluZSwgcmVnYXJkbGVzcwoJICAgIG9mIHdoYXQgdGhvc2UgY2hhcmFjdGVycyB3ZXJlLiAgVGhpcyB3YXMgbWFkZSB3b3JzZSBiZWNhdXNlIFNXSUcncwoJICAgIHByZXByb2Nlc3NvciByZW1vdmVzIGFueSB3aGl0ZXNwYWNlIGJlZm9yZSBhICcjJy4gIEZpeGVzIGdpdGh1YgoJICAgIGlzc3VlICMzNzksIHJlcG9ydGVkIGJ5IEpvZSBPcnRvbi4KCjIwMTUtMDYtMTI6IHdzZnVsdG9uCgkgICAgW1JdIEZpeCAjNDMwIC0gY2FsbCB0byBTV0lHX2NyZWF0ZU5ld1JlZiBpbiBjb3B5VG9DIHdhcyBpbmNvcnJlY3RseSBuYW1lZC4KCjIwMTUtMDYtMTE6IHNnaGlyYXRlCgkgICAgW0MjXSBQYXRjaCAjNDI3IGFkZHMgaW4gbmV3IGNvbW1hbmQgbGluZSBvcHRpb24gLW91dGZpbGUgdG8gY29tYmluZSBhbGwgdGhlCiAgICAgICAgICAgIGdlbmVyYXRlZCBDIyBjb2RlIGludG8gYSBzaW5nbGUgZmlsZS4KCjIwMTUtMDYtMDk6IHdzZnVsdG9uCgkgICAgRml4IHNlZyBmYXVsdCBwcm9jZXNzaW5nIEMrKzExIHR5cGUgYWxpYXNpbmcuIElzc3VlICM0MjQuCgoyMDE1LTA1LTI4OiB3c2Z1bHRvbgoJICAgIFtQeXRob25dIEFkZCBuZXcgZmVhdHVyZSAicHl0aG9uOmNkZWZhdWx0YXJncyIgdG8gY29udHJvbCBkZWZhdWx0IGFyZ3VtZW50CiAgICAgICAgICAgIGNvZGUgZ2VuZXJhdGlvbi4gQnkgZGVmYXVsdCwgU1dJRyBhdHRlbXB0cyB0byBjb252ZXJ0IEMvQysrIGRlZmF1bHQgYXJndW1lbnQgdmFsdWVzCiAgICAgICAgICAgIGludG8gUHl0aG9uIHZhbHVlcyBhbmQgZ2VuZXJhdGVzIGNvZGUgaW50byB0aGUgUHl0aG9uIGxheWVyIHdpdGggdGhlc2UgdmFsdWVzLgogICAgICAgICAgICBSZWNlbnQgdmVyc2lvbnMgb2YgU1dJRyBhcmUgYWJsZSB0byBjb252ZXJ0IG1vcmUgb2YgdGhlc2UgdmFsdWVzLCBob3dldmVyLCB0aGUKICAgICAgICAgICAgbmV3IGJlaGF2aW91ciBjYW4gYmUgY2lyY3VtdmVudGVkIGlmIGRlc2lyZWQgdmlhIHRoaXMgbmV3IGZlYXR1cmUsIHN1Y2ggdGhhdAogICAgICAgICAgICB0aGUgZGVmYXVsdCBhcmd1bWVudCB2YWx1ZXMgYXJlIG9idGFpbmVkIGZyb20gdGhlIEMgbGF5ZXIgYW5kIG5vdCB0aGUgUHl0aG9uIGxheWVyLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgc3RydWN0IENEQSB7CiAgICAgICAgICAgICAgICBpbnQgZmZmKGludCBhID0gMSwgYm9vbCBiID0gZmFsc2UpOwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGUgZGVmYXVsdCBjb2RlIGdlbmVyYXRpb24gaW4gdGhlIFB5dGhvbiBsYXllciBpczoKCiAgICAgICAgICAgICAgY2xhc3MgQ0RBKF9vYmplY3QpOgogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgZGVmIGZmZihzZWxmLCBhPTEsIGI9RmFsc2UpOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9kZWZhdWx0X2FyZ3MuQ0RBX2ZmZihzZWxmLCBhLCBiKQoKICAgICAgICAgICAgQWRkaW5nIHRoZSBmZWF0dXJlOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgicHl0aG9uOmNkZWZhdWx0YXJncyIpIENEQTo6ZmZmOwoKICAgICAgICAgICAgUmVzdWx0cyBpbjoKCiAgICAgICAgICAgICAgY2xhc3MgQ0RBKF9vYmplY3QpOgogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgZGVmIGZmZihzZWxmLCAqYXJncyk6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2RlZmF1bHRfYXJncy5DREFfZmZmKHNlbGYsICphcmdzKQoKICAgICAgICAgICAgU29tZSBjb2RlIGdlbmVyYXRpb24gbW9kZXMsIGVnIC1idWlsdGluIGFuZCAtZmFzdHByb3h5LCBhcmUgdW5hZmZlY3RlZCBieSB0aGlzIGFzCiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHZhbHVlcyBhcmUgYWx3YXlzIG9idGFpbmVkIGZyb20gdGhlIEMgbGF5ZXIuCgoyMDE1LTA1LTI3OiB3c2Z1bHRvbgoJICAgIFtQeXRob25dIERlYWwgd2l0aCBhbiBpbnRlZ2VyIGFzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIGEgdHlwZWRlZiB0byBib29sCgkgICAgcGFyYW1ldGVyIGluIHRoZSBDKysgcHJvdG90eXBlLiAgU2VlICMzMjcuIFJlZ3Jlc3Npb24gZnJvbSAzLjAuMCBvbndhcmRzLgoKMjAxNS0wNS0xOTogb2xseQoJICAgIFtQeXRob25dIEZpeCB3YXJuaW5nIHdoZW4gY29tcGlsaW5nIGdlbmVyYXRlZCBjb2RlIHdpdGggTVNWQy4KCSAgICAoRml4ZXMgaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcC9zd2lnL3BhdGNoZXMvMzUxLyByZXBvcnRlZCBieQoJICAgIE1hdGV1c3ogU3p5bWG/c2tpKS4KCjIwMTUtMDUtMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzZWcgZmF1bHQgd3JhcHBpbmcgc2hhcmVkX3B0ciBvZiBjbGFzc2VzIHdpdGggcHJpdmF0ZSBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzLiAKICAgICAgICAgICAgVGhpcyBhbHNvIGZpeGVzIHRoZSAidW5yZWYiIGZlYXR1cmUgd2hlbiB1c2VkIG9uIGNsYXNzZXMgd2l0aCBwcml2YXRlIGRlc3RydWN0b3JzLgoKMjAxNS0wNS0xMDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCBtdWx0aS1hcmd1bWVudCB0eXBlbWFwcyAoY2hhciAqU1RSSU5HLCBzaXplX3QgTEVOR1RIKQogICAgICAgICAgICBzbyB0aGF0IHRoZXkgY2FuIGJlIGFwcGxpZWQgdG8gYSB3aWRlciByYW5nZSBvZiB0eXBlcy4gRml4ZXMgIzM4NS4KCjIwMTUtMDUtMDc6IG9sbHkKCSAgICBbUHl0aG9uXSBEZWFsIHdpdGggYW4gaW50ZWdlciBhcyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhIGJvb2wKCSAgICBwYXJhbWV0ZXIgaW4gdGhlIEMrKyBwcm90b3R5cGUuICBGaXhlcyBnaXRodWIgIzMyNywgcmVwb3J0ZWQgYnkKCSAgICBHcmVnIEFsbGVuLgoKMjAxNS0wNS0wNzogTGluZGxleUYKCSAgICBbSmF2YV0gQWxsb3cgZmVhdHVyZSgiZGlyZWN0b3IiKSBhbmQgZmVhdHVyZSgicmVmIikgdG8gYmUgdXNlZAoJICAgIHRvZ2V0aGVyLiAgR2l0aHViIFBSIzQwMy4KCjIwMTUtMDUtMDU6IG9sbHkKCSAgICBTdXBwcmVzcyB3YXJuaW5nIDMyNSAiTmVzdGVkIGNsYXNzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIChGb28KCSAgICBpZ25vcmVkKSIgd2hlbiBGb28gaGFzIGFscmVhZHkgYmVlbiBleHBsaWNpdGx5IGlnbm9yZWQgd2l0aCAiJWlnbm9yZSIuCgoyMDE1LTA1LTA0OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgc3VwcG9ydCBmb3IgZnJpZW5kIHRlbXBsYXRlcywgaW5jbHVkaW5nIG9wZXJhdG9yIG92ZXJsb2FkaW5nIC0gZml4ZXMgIzE5Ni4gQ29uc2lkZXJpbmcKICAgICAgICAgICAgdGhlIGV4YW1wbGUgYmVsb3csIHByZXZpb3VzbHkgdGhlIG9wZXJhdG9yIGdhdmUgYSBzeW50YXggZXJyb3IgYW5kIGZyaWVuZGZ1bmMgaW5jb3JyZWN0bHkKICAgICAgICAgICAgd2FybmVkIHdpdGg6CgogICAgICAgICAgICAgIldhcm5pbmcgNTAzOiBDYW4ndCB3cmFwICdmcmllbmRmdW5jPChUeXBlKT4nIHVubGVzcyByZW5hbWVkIHRvIGEgdmFsaWQgaWRlbnRpZmllci4iCgogICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBUeXBlPiBjbGFzcyBNeUNsYXNzIHsKICAgICAgICAgICAgICAgIGZyaWVuZCBpbnQgZnJpZW5kZnVuYyA8VHlwZT4oZG91YmxlIGlzLCBNeUNsYXNzIDxUeXBlPiAmIHgpOwogICAgICAgICAgICAgICAgZnJpZW5kIGludCBvcGVyYXRvcjw8IDxUeXBlPihkb3VibGUgdW4sIGNvbnN0IE15Q2xhc3MgPFR5cGU+ICZ4KTsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBhbHNvIHByZXZpb3VzbHkgaW5jb3JyZWN0bHkgd2FybmVkIHdpdGg6CgogICAgICAgICAgICAgICJXYXJuaW5nIDMwMjogSWRlbnRpZmllciAndGVtcGxhdGVfZnJpZW5kJyByZWRlZmluZWQgKGlnbm9yZWQpLCIKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gVCB0ZW1wbGF0ZV9mcmllbmQoVCk7CiAgICAgICAgICAgICAgc3RydWN0IE15VGVtcGxhdGUgewogICAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gZnJpZW5kIFQgdGVtcGxhdGVfZnJpZW5kKFQpOwogICAgICAgICAgICAgIH07CgoyMDE1LTA1LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggaGFuZGxpbmcgb2YgY29udmVyc2lvbiBvcGVyYXRvcnMgd2hlcmUgdGhlIG9wZXJhdG9yIGlzIHNwbGl0IG92ZXIgbXVsdGlwbGUKICAgICAgICAgICAgbGluZXMgb3IgaGFzIGNvbW1lbnRzIHdpdGhpbiB0aGUgb3BlcmF0b3IgdHlwZS4gRml4ZXMgIzQwMS4KCiAgICAgICAgICAgIEFsc28gZml4IHNpbWlsYXIgcHJvYmxlbSB3aXRoIG5vcm1hbCBvcGVyYXRvcnMgd2hpY2ggZ2F2ZSBhIHN5bnRheCBlcnJvciBpZiBzcGxpdCBvdmVyCiAgICAgICAgICAgIG11bHRpcGxlIGxpbmVzIG9yIGhhZCBhIGNvbW1lbnQgd2l0aGluIHRoZSBvcGVyYXRvciBkZWNsYXJhdGlvbi4KCjIwMTUtMDQtMzA6IG9sbHkKCSAgICBJZ25vcmUgdW5rbm93biBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcyB3aGljaCBhcmUgaW5zaWRlIGFuIGluYWN0aXZlCgkgICAgY29uZGl0aW9uYWwgKGdpdGh1YiBpc3N1ZSAjMzk0LCByZXBvcnRlZCBieSBEYW4gV2lsY294KS4KCSAgICBSZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gMy4wLjMuCgoyMDE1LTA0LTI3OiB2YWR6CiAgICAgICAgICAgIFtQeXRob25dIEZpeCAiZGVmYXVsdCIgdHlwZW1hcCB1c2VkIGFmdGVyIGFuIGFyZ3VtZW50IHdpdGggIm51bWlucHV0cz0wIiAoIzM3NykuCgoyMDE1LTA0LTI0OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggIzI1Ni4gQ29kZSBnZW5lcmF0ZWQgd2l0aCAnLWJ1aWx0aW4gLW1vZGVybmFyZ3MnIHNlZ2ZhdWx0cyBmb3IgYW55CiAgICAgICAgICAgIG1ldGhvZCB0YWtpbmcgemVybyBhcmd1bWVudHMuCgogICAgICAgICAgICBBbHNvIGZpeGVzOiAiU3lzdGVtRXJyb3I6IGVycm9yIHJldHVybiB3aXRob3V0IGV4Y2VwdGlvbiBzZXQiIGR1cmluZyBlcnJvciBjaGVja2luZwogICAgICAgICAgICB3aGVuIHVzaW5nIGp1c3QgLWJ1aWx0aW4gYW5kIHRoZSBpbmNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50cyBpcyBwYXNzZWQgdG8gYSBjbGFzcwogICAgICAgICAgICBtZXRob2QgZXhwZWN0aW5nIHplcm8gYXJndW1lbnRzLgoKMjAxNS0wNC0yMzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEJ1ZyAjMzg2IC0gTWVtb3J5IGxlYWsgZml4IGluIChjaGFyICpTVFJJTkcsIHNpemVfdCBMRU5HVEgpIHR5cGVtYXBzLgoKMjAxNS0wNC0yMzogdmFkegogICAgICAgICAgICBbUHl0aG9uXSBNYWtlICJkZWZhdWx0IiB0eXBlbWFwIHdvcmsgYWdhaW4gKCMzMzAsICMzNzcpLgoKMjAxNS0wNC0yMzogdmFkegogICAgICAgICAgICBbUHl0aG9uXSBGaXggdGhlIHVzZSBvZiBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIHBvaW50ZXIgdHlwZXMgKCMzNjUsICMzNzYpLgoKMjAxNS0wNC0yMzogd3NmdWx0b24KICAgICAgICAgICAgRml4ICdtYWtlIGNoZWNrLWNjYWNoZScgd2hpY2ggaXMgcGFydCBvZiAnbWFrZSBjaGVjaycgd2hlbiBvbmUgb2YgdGhlIENDQUNIRV8KICAgICAgICAgICAgZW52aXJvbm1lbnQgdmFyaWFibGVzLCBmb3IgZXhhbXBsZSBDQ0FDSEVfRElTQUJMRSwgaXMgc2V0LgoKMjAxNS0wNC0xNDogd3NmdWx0b24KICAgICAgICAgICAgQ2xlYXJlciB3YXJuaW5nIG1lc3NhZ2UgZm9yIGJhZGx5IGNvbnN0cnVjdGVkIHR5cGVjaGVjayB0eXBlbWFwcy4gRm9yIGV4YW1wbGUsIHdhczoKCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjM6IFdhcm5pbmcgNDY3OiBPdmVybG9hZGVkIGZvbyhpbnQpIG5vdCBzdXBwb3J0ZWQgKG5vIHR5cGUgY2hlY2tpbmcKICAgICAgICAgICAgICBydWxlIGZvciAnaW50JykuCgogICAgICAgICAgICBOb3c6CgogICAgICAgICAgICAgIGV4YW1wbGUuaTozOiBXYXJuaW5nIDQ2NzogT3ZlcmxvYWRlZCBmb28oaW50KSBub3Qgc3VwcG9ydGVkIChpbmNvbXBsZXRlIHR5cGUgY2hlY2tpbmcKICAgICAgICAgICAgICBydWxlIC0gbm8gcHJlY2VkZW5jZSBsZXZlbCBpbiB0eXBlY2hlY2sgdHlwZW1hcCBmb3IgJ2ludCcpLgoKMjAxNS0wNC0xMTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCAjMzUzIC0gTGlua2VyIG11bHRpcGxlIGRlZmluaXRpb24gb2YgJ0V4Y2VwdGlvbk1hdGNoZXMnIHdoZW4KICAgICAgICAgICAgdXNpbmcgZGlyZWN0b3JzIGFuZCBtdWx0aXBsZSBtb2R1bGVzLgoKMjAxNS0wNC0xMTogd3NmdWx0b24KICAgICAgICAgICAgTWVyZ2UgIzMyMCAtIE1ha2UgX19kaWN0X18gYWNjZXNzaWJsZSBmb3IgUHl0aG9uIGJ1aWx0aW4gY2xhc3Nlcy4KCjIwMTUtMDQtMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMzc1IC0gcGFyc2luZyBvZiBleHRlcm4gIkMiIGFuZCB0eXBlZGVmIGZvciBleGFtcGxlOgogICAgICAgICAgICAgIGV4dGVybiAiQyIgdHlwZWRlZiB2b2lkICgqSG9vazJfdCkoaW50LCBjb25zdCBjaGFyICopOwogICAgICAgICAgICAgIGV4dGVybiAiQyIgdHlwZWRlZiBpbnQgSW50ZWdlcjsKCjIwMTUtMDMtMTI6IG9sbHkKCSAgICAtRFNXSUdfRElSRUNUT1JfU1RBVElDIGlzIG5vdyBzdXBwb3J0ZWQgZm9yIGFsbCBsYW5ndWFnZXMgd2l0aAoJICAgIGRpcmVjdG9yIHN1cHBvcnQsIG5vdCBvbmx5IFB5dGhvbiBhbmQgUEhQLgoKMjAxNS0wMy0wMjogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIEFkZCAtY2dvIG9wdGlvbiwgcmVxdWlyZWQgZm9yIEdvIHZlcnNpb25zIDEuNSBhbmQKCSAgICBsYXRlci4KCjIwMTUtMDItMjY6IG9sbHkKCSAgICBGaXggc2VnbWVudGF0aW9uIGZhdWx0IHdoZW4gdG9wPT1OVUxMLCBpbnRyb2R1Y2VkIGJ5IG5lc3RlZCBjbGFzcwoJICAgIGhhbmRsaW5nIChyZXBvcnRlZCBpbiBpc3N1ZSMzNDYgYnkgUGF3Zb8gVG9tdWxpaykuCgoyMDE1LTAyLTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBbR3VpbGVdIEZpeCBnZW5lcmF0ZWQgY29kZSBmb3Igc3RhdGljIGNvbnN0IGNoYXIgbWVtYmVyIHZhcmlhYmxlcyB3aGVuCiAgICAgICAgICAgIGRlZmluZWQgYW5kIGRlY2xhcmVkIGlubGluZS4KCjIwMTUtMDItMDk6IG1pc2hhcwogICAgICAgICAgICBbR29dIEZpeCAlaW1wb3J0IG9mIGZpbGVzIGluIHN1YiBkaXJlY3Rvcmllcy4KCjIwMTUtMDItMDU6IGlhbmxhbmNldGF5bG9yCiAgICAgICAgICAgIFtHb10gSWdub3JlIEdvIHNwZWNpZmljIHR5cGUgbWFwcyAoZ29pbiwgZ29vdXQsIGV0Yy4pIGlmIHRoZXkgYXJlIGVtcHR5LgoKMjAxNS0wMi0wNTogaWFubGFuY2V0YXlsb3IKICAgICAgICAgICAgW0dvXSBHZW5lcmF0ZWQgR28gY29kZSBubyBsb25nZXIgY2FsbHMgX3N3aWdfZ29hbGxvY2F0ZSBvcgogICAgICAgICAgICBfc3dpZ19tYWtlZ29zdHJpbmcsIGFzIHRoZXkgd2lsbCBubyBsb25nZXIgd29yayBhcyBvZiBHbyAxLjUuCgpWZXJzaW9uIDMuMC41ICgzMSBKYW4gMjAxNSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDE1LTAxLTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggUHl0aG9uIC1jbGFzc2ljIGFuZCBwcm9wZXJ0eSBzZXR0aW5nLiBTZXR0aW5nIHByb3BlcnRpZXMgb24gY2xhc3NpYyBjbGFzc2VzCiAgICAgICAgICAgIHdhcyBicm9rZW4gaW4gc3dpZy0zLjAuMyBieSBhdHRlbXB0aW5nIHRvIHVzZSBfX3NldGF0dHJfXy4gVGhpcyByZWdyZXNzaW9uIGlzIGZpeGVkIG5vdwogICAgICAgICAgICBieSB1c2luZyBfX2RpY3RfXyBhZ2FpbiB3aGVuIHVzaW5nIC1jbGFzc2ljLgogICAgICAgICAgICBGaXhlcyBwYXRjaCAjMjMyLgoKMjAxNS0wMS0yNzogc21hcmNoZXR0bwoJICAgIFtTY2lsYWJdIFN1cHBvcnQgZm9yIHRoZSBTY2lsYWIgbGFuZ3VhZ2UgaGFzIGJlZW4gYWRkZWQKCjIwMTUtMDEtMjM6IG9sbHkKCSAgICBbUEhQXSBXaGVuIHdyYXBwaW5nIGEgcmV0dXJuZWQgcmVzb3VyY2UgYXMgYW4gb2JqZWN0LCBjaGVjayBpZiBhbGwKCSAgICBjYXNlcyB3cmFwIGl0IGluIHRoZSBzYW1lIGNsYXNzLCBhbmQgaWYgc28gZWxpbWluYXRlIHRoZSBwb2ludGxlc3MKCSAgICBzd2l0Y2ggc3RhdGVtZW50IHdyYXBwZXIgd2UgcHJldmlvdXNseSBnZW5lcmF0ZWQuCgoyMDE1LTAxLTIyOiB3c2Z1bHRvbgogICAgICAgICAgICBbT2N0YXZlXSBNZXJnZSBwYXRjaCAjMjk3IGZvciBTRiBidWcgIzEyNzcgLSBPY3RhdmUgc2hhcmVkX3B0ciBzdXBwb3J0CgoyMDE1LTAxLTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBNZXJnZSBwYXRjaCAjMjUwIC0gRml4ZXMgZm9yIHVzaW5nICVjb25zdGFudCBhbmQgb2JqZWN0cyAobm9uLXByaW1pdGl2ZSB0eXBlcykKCjIwMTUtMDEtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIyBHb10gTWVyZ2UgcGF0Y2ggIzMwOCBhbmQgZml4ICMzMDcgLSBDKysxMSBzdHJvbmdseSB0eXBlZCBlbnVtIHN1cHBvcnQKICAgICAgICAgICAgaW4gZGlyZWN0b3JzCgoyMDE1LTAxLTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBTZWNvbmQgZml4IGZvciAjMjk0ICMyOTYgLSBSZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gU1dJRy0zLjAuMyB3aGVuCiAgICAgICAgICAgIHdyYXBwaW5nIGZ1bmN0aW9ucyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzLCB0aGlzIHRpbWUgd2hlbiB1c2luZyBrd2FyZ3MuCgpWZXJzaW9uIDMuMC40ICgxNCBKYW4gMjAxNSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDE1LTAxLTEyOiBvbGx5CgkgICAgW1BIUF0gRml4IHNlZ2ZhdWx0IGluIGRpcmVjdG9yIHVwY2FsbCBjaGVjayB3aGVuIHVzaW5nIFBIUCBidWlsdCB3aXRoCgkgICAgWlRTIGVuYWJsZWQuICBGaXhlcyAjMTU1LCByZXBvcnRlZCBieSBQaWVycmUgTGFiYXN0aWUuCgoyMDE1LTAxLTEyOiB2YWR6CiAgICAgICAgICAgIFtQeXRob25dIEZpeCAjMjk0ICMyOTYgLSBSZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gU1dJRy0zLjAuMyB3aGVuCiAgICAgICAgICAgIHdyYXBwaW5nIGZ1bmN0aW9ucyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzLiBJbnZhbGlkIG9yIG1pc3NpbmcgZGVmYXVsdAogICAgICAgICAgICBhcmd1bWVudHMgd2VyZSBzb21ldGltZXMgYmVpbmcgZ2VuZXJhdGVkIGludG8gdGhlIHB5dGhvbiBsYXllci4KCjIwMTUtMDEtMDg6IG9sbHkKCSAgICBBbGxvdyBDKysxMSAiZXhwbGljaXQgY29uc3RleHByIi4gIEZpeGVzIGdpdGh1YiBpc3N1ZSAjMjg0IHJlcG9ydGVkCgkgICAgYnkgUGF3ZWwgVG9tdWxpay4gIEFsc28gaGFuZGxlICJjb25zdGV4cHIgZXhwbGljaXQiIGFuZCAiY29uc3RleHByCgkgICAgc3RhdGljIi4KCjIwMTUtMDEtMDg6IG9sbHkKCSAgICBXaGVuIHJlcG9ydGluZyBhbiBlcnJvciBmb3IgYSBjb25zdHJ1Y3Qgd2hpY2ggaGFzbid0IGJlZW4KCSAgICB0ZXJtaW5hdGVkIHdoZW4gdGhlIGVuZCBvZiB0aGUgZmlsZSBpcyByZWFjaGVkLCByZXBvcnQgaXQgYXQgdGhlCgkgICAgc3RhcnQgbGluZSByYXRoZXIgdGhhbiAiRU9GIiBhcyB0aGVuIHRvb2xzIGxpa2UgZWRpdG9ycyBhbmQgSURFcwoJICAgIHdpbGwgdGFrZSB5b3UgdG8gYSBnZW5lcmFsbHkgbW9yZSB1c2VmdWwgcGxhY2UgZm9yIGZpeGluZyB0aGUKCSAgICBwcm9ibGVtLgoKMjAxNS0wMS0wODogb2xseQoJICAgIEltcHJvdmUgZXJyb3IgbWVzc2FnZXMgZm9yIGEgZmV3IGNhc2VzIHdoaWNoIHByZXZpb3VzbHkgZ2F2ZSB0aGUKCSAgICBvbmUgb2YgdGhlIGNyeXB0aWMgY2F0Y2gtYWxsIGVycm9ycyAiU3ludGF4IGVycm9yIGluIGlucHV0Ii4KCjIwMTUtMDEtMDg6IG9sbHkKCSAgICBQcm92aWRlIC1jcHBleHQgYXMgYSBnZW5lcmFsIGNvbW1hbmQgbGluZSBvcHRpb24gZm9yIHNldHRpbmcgdGhlCgkgICAgZXh0ZW5zaW9uIHVzZWQgZm9yIGdlbmVyYXRlZCBDKysgZmlsZXMgKHByZXZpb3VzbHkgaXQgd2FzIHNwZWNpZmljCgkgICAgdG8gdGhlIFBIUCBiYWNrZW5kKS4gIERlcHJlY2F0ZSB0aGUgZXF1aXZhbGVudCAtc3VmZml4IG9wdGlvbgoJICAgIHByb3ZpZGVkIGJ5IHRoZSBPY2FtbCBiYWNrZW5kLCBidXQgY29udGludWUgdG8gc3VwcG9ydCB0aGF0IGZvcgoJICAgIG5vdy4KClZlcnNpb24gMy4wLjMgKDMwIERlYyAyMDE0KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTQtMTItMjc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMjgwIC0gYWJvcnQgdXNpbmcgYWxsIGRlZmF1bHQgdGVtcGxhdGUgcGFyYW1ldGVycyB3aXRoaW4gb3RoZXIgdGVtcGxhdGUKICAgICAgICAgICAgcGFyYW1ldGVycy4KCjIwMTQtMTItMjc6IHRhbGJ5CiAgICAgICAgICAgIFtQZXJsXSBJc3N1ZSAjMjgyIHBlcmw1IGFyY2hsaWIgdnMgYXJjaGxpYmV4cAogICAgICAgICAgICBbUGVybF0gdGlkeSAid2FybmluZzogZHVwbGljYXRlICdleHRlcm4nIGRlY2xhcmF0aW9uIHNwZWNpZmllciIgd2hlbiBidWlsZGluZyBnZW5lcmF0ZWQgY29kZQogICAgICAgICAgICB1bmRlciBjbGFuZwoKMjAxNC0xMi0xODogd3NmdWx0b24KICAgICAgICAgICAgQWRkIHN1cHBvcnQgZm9yICVjb25zdGFudCBhbmQgc3RydWN0cy9jbGFzc2VzIC0gaXNzdWUgIzI3MgoKMjAxNC0xMi0wOTogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMyNDUgLSByZWdyZXNzaW9uIChzaW5jZSBzd2lnLTMuMC4wKSBpbiB0ZW1wbGF0ZWQgY29uc3RydWN0b3JzLgogICAgICAgICAgICBUZW1wbGF0ZWQgY29uc3RydWN0b3JzIGNvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQgLSB0aGV5IHdlcmUgaW5jb3JyZWN0bHkgaWdub3JlZCB3aXRoIGEgd2FybmluZyA1MDQ6CiAgICAgICAgICAgICJGdW5jdGlvbjogeHl6IG11c3QgaGF2ZSBhIHJldHVybiB0eXBlLiBJZ25vcmVkLiIKCjIwMTQtMTItMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBzdXBwb3J0IGZvciBDKysxMSBzdHJvbmdseSB0eXBlZCBlbnVtZXJhdGlvbnMuCgoyMDE0LTExLTIxOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSBDI10gRml4IG11bHRpcGx5IGRlZmluZWQgZXJyb3Igd2hlbiB1c2luZyAlcmVuYW1lIG9mIGVudW0gaXRlbXMgd2hlbiB1c2luZyB0aGUgInNpbXBsZSBlbnVtIgogICAgICAgICAgICB3cmFwcGVycy4KCjIwMTQtMTAtMjg6IHZhZHoKICAgICAgICAgICAgW1B5dGhvbl0gUGF0Y2ggIzIwMSBUaGUgZ2VuZXJhdGVkIC5weSBmaWxlIG5vIGxvbmdlciB1c2VzICphcmdzIGZvciBhbGwgUHl0aG9uIHBhcmFtZXRlcnMuCiAgICAgICAgICAgIEluc3RlYWQsIHRoZSBwYXJhbWV0ZXJzIGFyZSBuYW1lZCB1c2luZyB0aGUgQysrIHBhcmFtZXRlciBuYW1lcy4KCiAgICAgICAgICAgICJjb21wYWN0ZGVmYXVsdGFyZ3MiIGZlYXR1cmUgY2FuIGJlIGVuYWJsZWQgdG8gcmVzdG9yZSB0aGUgb2xkIGJlaGF2aW91ci4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxNC0xMC0yNDogdGltb3RoZWVjb3VyCiAgICAgICAgICAgIFtEXSBQYXRjaCAjMjA0IFVzZSBjb3JlLmF0b21pYy5hdG9taWNPcCB0byBtdXRhdGUgc2hhcmVkIHZhcmlhYmxlcwoKMjAxNC0xMC0yMTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGlzc3VlICMyNDIgLSBVc2Ugb2YgdGhlICJrd2FyZ3MiIGZlYXR1cmUgbm8gbG9uZ2VyIGF1dG9tYXRpY2FsbHkgdHVybnMgb24gdGhlCiAgICAgICAgICAgICJjb21wYWN0ZGVmYXVsdGFyZ3MiIGZlYXR1cmUgaWYgdGhlIHRhcmdldCBsYW5ndWFnZSBkb2VzIG5vdCBzdXBwb3J0IGt3YXJncy4KICAgICAgICAgICAgVGhpcyBjaGFuZ2UgYWZmZWN0cyBhbGwgbGFuZ3VhZ2VzIGV4Y2VwdCBQeXRob24gYW5kIFJ1YnkuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDE0LTEwLTEwOiBkaW9yY2V0eQogICAgICAgICAgICBbUHl0aG9uXSBQYXRjaCAjMjMyIEZpeCBwcm9wZXJ0eSBhY2Nlc3MgdXNpbmcgZGlyZWN0b3JzCgoyMDE0LTEwLTA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXhlcyB3aGVuIHVzaW5nIC1idWlsdGluIGFuZCBzdGQ6OnZlY3Rvci9zdGQ6Omxpc3Qgd3JhcHBlcnMgdG8gYWxsb3cgZGVsZXRpb24KICAgICAgICAgICAgb2Ygc2luZ2xlIGVsZW1lbnRzLCBzdWNoIGFzICdkZWwgdmVjWzBdJy4KCjIwMTQtMDktMzA6IG9saXZlcmIKICAgICAgICAgICAgW0phdmFzY3JpcHRdIE1lcmdlIHBhdGNoICMyMTYgYnkgUmljaGllNzY1IC0gQWRkZWQgc3VwcG9ydCBmb3IgbWFueSB2ZXJzaW9ucyBvZiB2OCBqYXZhc2NyaXB0LgoKMjAxNC0wOS0zMDogb2xpdmVyYgogICAgICAgICAgICBbSmF2YXNjcmlwdF0gTWVyZ2UgcGF0Y2ggIzE5NSBieSB6aXR0aXggLSBGaXhlZCBKU0NsYXNzUmVmIGRlY2xhcmF0aW9uIG5vdCB1c2luZyB0aGUgc3RhdGljIG9uZS4KCjIwMTQtMDktMzA6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBJbiBjb25maWd1cmUgc2NyaXB0LCByZXF1aXJlIEdvIDEuMSBvciBsYXRlci4KCjIwMTQtMDktMzA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIFBhdGNoICMyMDcgLSBGaXggTm8gbW9kdWxlIGVycm9yIHdpdGggLXJlbGF0aXZlaW1wb3J0IHdoZW4gdXNpbmcgc2luZ2xlCiAgICAgICAgICAgIGhlYWRlciBmaWxlIGltcG9ydC4KCjIwMTQtMDktMjc6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoICMyMDggLSBJbml0aWFsaXNlIG5ld2x5IGNyZWF0ZWQgYXJyYXkgd2hlbiB1c2luZyBhcnJheV9mdW5jdGlvbnMgaW4gdGhlCiAgICAgICAgICAgIGNhcnJheXMuaSBsaWJyYXJ5IChDKysgdXNhZ2UpLgoKMjAxNC0wOS0yNzogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIFBhdGNoICMxODcgLSBGaXggY3Jhc2ggb24gc2h1dGRvd24gb2YgdGhlIFJ1YnkgaW50ZXJwcmV0ZXIgaWYgbW9yZSB0aGFuIG9uZQogICAgICAgICAgICBtb2R1bGUgd2FzIGxvYWRlZCBhdCBhIHRpbWUgd2hlbiBkYXRhIGlzIGJlaW5nIHNoYXJlZCBiZXR3ZWVuIG1vZHVsZXMuCgoyMDE0LTA5LTI3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUGF0Y2ggIzE2OCAtIEZpeCBsZWFrIGluIEphdmEgZGlyZWN0b3Igc3RyaW5nIGhhbmRsaW5nIGFmdGVyIHRoZSBKYXZhCiAgICAgICAgICAgIHVwY2FsbCB3aGVuIGNhbGxlZCBmcm9tIGEgbmF0aXZlIHRocmVhZC4KCjIwMTQtMDktMjU6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBBZGp1c3QgZ2VuZXJhdGVkIGNvZGUgdG8gd29yayB3aXRoIHVwY29taW5nIEdvIDEuNAoJICAgIHJlbGVhc2UuCgoyMDE0LTA5LTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBZGQgcGF0Y2ggZnJvbSBUaG9tYXMgTWFzbGFjaCB0byBmaXggY3Jhc2ggaW4gd3JhcHBlcnMgd2hlbiB1c2luZyAtdGhyZWFkcyBpbgogICAgICAgICAgICB0aGUgU1RMIGl0ZXJhdG9ycyAoU3dpZ1B5SXRlcmF0b3IgZGVzdHJ1Y3RvcikuCgoyMDE0LTA5LTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIE1lcmdlIHBhdGNoICMyMjkgZnJvbSBjb250cmUgLSBBZGQgYm9vbCBhcnJheSB0eXBlcyB0byBhcnJheXNfY3NoYXJwLmkKCjIwMTQtMDktMTI6IG9sbHkKCSAgICBbUEhQXSBBZGQgc3VwcG9ydCBmb3Igc3BlY2lmeWluZyBhbnkgUEhQIGludGVyZmFjZXMgYSB3cmFwcGVkIGNsYXNzCgkgICAgaW1wbGVtZW50cywgZS5nLjogJXR5cGVtYXAoInBocGludGVyZmFjZXMiKSBNeUl0ZXJhdG9yICJJdGVyYXRvciIKCjIwMTQtMDktMTE6IG9sbHkKCSAgICBbUEhQXSBGaXggdGhyb3dpbmcgYSBQSFAgZXhjZXB0aW9uIHRocm91Z2ggQysrIGZyb20gYSBzdWJjbGFzc2VkCgkgICAgZGlyZWN0b3IgbWV0aG9kIC0gUEhQIE5VTEwgZ2V0cyByZXR1cm5lZCBieSB0aGUgc3ViY2xhc3NlZCBtZXRob2QKCSAgICBpbiB0aGlzIGNhc2UsIHNvIHRoZSBkaXJlY3Rvcm91dCB0eXBlbWFwIG5lZWRzIHRvIGFsbG93IHRoYXQgKGF0CgkgICAgbGVhc3QgaWYgYW4gZXhjZXB0aW9uIGlzIGFjdGl2ZSkuCgoyMDE0LTA5LTA5OiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gQWRkIGdvYXJnb3V0IHR5cGVtYXAuCgoyMDE0LTA5LTA5OiBvbGx5CgkgICAgW1BIUF0gRml4IHNlZ21lbnRhdGlvbiBmYXVsdHMgd2l0aCBkaXJlY3RvcnMgaW4gUEhQID49IDUuNCwgYW5kCgkgICAgcmVlbmFibGUgcnVubWUgdGVzdHMgZm9yIGRpcmVjdG9yX2Jhc2ljIHRlc3RjYXNlLiAgRml4IGZyb20KCSAgICBwYXZlbC1jaGFydmF0IGluIGlzc3VlIzE2NC4KCjIwMTQtMDktMDU6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBBZGQgaW10eXBlLCBnb2luLCBnb291dCwgZ29kaXJlY3RvcmluLCBhbmQKCSAgICBnb2RpcmVjdG9yb3V0IHR5cGVtYXBzLCB0byBzdXBwb3J0IHdyaXRpbmcgR28gY29kZSB0bwoJICAgIGNvbnZlcnQgYmV0d2VlbiB0eXBlcy4KCjIwMTQtMDktMDI6IG9sbHkKCSAgICBbUHl0aG9uXSBGaXggcmVncmVzc2lvbiBpbiBpbmRlbnRhdGlvbiBvZiBweXRob24gY29kZSBwcm9kdWNlZCB3aXRoCgkgICAgLW1vZGVybiwgaW50cm9kdWNlZCBieSBjaGFuZ2VzIGluICMxODguICBSZXBvcnRlZCBieSBmYWJpZW5jYXN0YW4KCSAgICBpbiAjMjE4LgoKMjAxNC0wOS0wMTogb2xseQoJICAgIElzc3VlIGFuIGVycm9yIGZvciB1bmtub3duIFNXSUcgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMsIHJhdGhlcgoJICAgIHRoYW4gcXVpZXRseSBpZ25vcmluZyB0aGVtLiAgUmVwb3J0ZWQgYnkganJoZWxzZXkgaW4gaXNzdWUjMjE3LgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMjAxNC0wOC0xNTogdGFsYnkKICAgICAgICAgICAgW1BlcmxdIEluY2x1ZGUgZ3VhcmQgZml4IGZvciBuZXN0ZWQgbW9kdWxlcyBmcm9tIEFudGhvbnkgSGVhZGluZyAoU0YgUGF0Y2ggIzM1MCkuCgoyMDE0LTA4LTA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIE1lcmdlIHBhdGNoICMyMDAgZnJvbSBncGV0cm91IC0gQ2hhbmdlZCBDU2hhcnAgbGljZW5zZSBoZWFkZXIgdG8gaW5jbHVkZSBhdXRvLWdlbmVyYXRlZAogICAgICAgICAgICB0YWcgc28gdGhhdCBTdHlsZUNvcCBpZ25vcmVzIHRoZSBmaWxlcy4KCjIwMTQtMDgtMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBNZXJnZSBwYXRjaCAjMTk4IGZyb20gWXV2YWwgS2FzaHRhbiAtIFN1cHBvcnQgZm9yIGphdmEubmlvLkJ5dGVCdWZmZXIgbWFwcGluZyB0bwogICAgICAgICAgICB1bnNpZ25lZCBjaGFyICogaW4gdmFyaW91cy5pIGluIE5JT0JVRkZFUiB0eXBlbWFwcy4KCjIwMTQtMDctMTQ6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBDaGFuZ2Ugc3RydWN0IGRlZmluaXRpb24gdG8gdXNlIHZvaWQgKiwgbm90IHVpbnQ4LCBzbwoJICAgIHRoYXQgdGhlIHR5cGUgaXMgcmVjb3JkZWQgYXMgcG9zc2libHkgY29udGFpbmluZwoJICAgIHBvaW50ZXJzLiAgVGhpcyBlbnN1cmVzIHRoYXQgdGhlIDEuMyBnYXJiYWdlIGNvbGxlY3RvcgoJICAgIGRvZXMgbm90IGNvbGxlY3QgcG9pbnRlcnMgcGFzc2VkIHRvIEMrKyBjb2RlLgoKMjAxNC0wNy0wMTogd3NmdWx0b24KICAgICAgICAgICAgRml4IFNGIEJ1ZyAjMTM3NSAtIEV4cGFuc2lvbiBvZiB0aGUgJHBhcmVudGNsYXNzbmFtZSBzcGVjaWFsIHZhcmlhYmxlIGluY29ycmVjdGx5IGNvbnRhaW5zCiAgICAgICAgICAgIGJyYWNrZXRzIGluIHRoZSBleHBhbmRlZCBuYW1lLgoKVmVyc2lvbiAzLjAuMiAoNCBKdW4gMjAxNCkKPT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTQtMDYtMDI6IHYtZm9yLXZhbmRhbAogICAgICAgICAgICBbTHVhXSBQdWxsIHJlcXVlc3QgIzE3NjoKICAgICAgICAgICAgSWYgY2xhc3MgaGFzIG5vIF9fZXEgaW1wbGVtZW50ZWQsIHRoZW4gZGVmYXVsdCBfX2VxIGlzIGdlbmVyYXRlZC4gCiAgICAgICAgICAgIERlZmF1bHQgX19lcSBjb21wYXJlcyBhY3R1YWwgcG9pbnRlcnMgc3RvcmVkIGluc2lkZSBMdWEgdXNlcmRhdGEuCgoyMDE0LTA2LTAyOiB2a2FsaW5pbgogICAgICAgICAgICBGaXggIzE4MyAtICVleHRlbmQgYW5kIHVubmFtZWQgbmVzdGVkIHN0cnVjdHMKCjIwMTQtMDUtMjg6IGt3d2V0dGUKICAgICAgICAgICAgRml4IGluc3RhbGwgZmFpbHVyZSB3aGVuIHVzaW5nIGFuICdvdXQgb2Ygc291cmNlJyBidWlsZCB1c2luZyB0aGUgc2hpcHBlZAogICAgICAgICAgICB0YXJiYWxsIC0gcmVncmVzc2lvbiBpbnRyb2R1Y2VkIGluIHN3aWctMy4wLjEuCgoyMDE0LTA1LTI0OiBrd3dldHRlCiAgICAgICAgICAgIFtPY3RhdmVdIFJlbW92ZSBkZXByZWNhdGVkIC1nbG9iYWwvLW5vZ2xvYmFsIGNvbW1hbmQtbGluZSBhcmd1bWVudHMKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKClZlcnNpb24gMy4wLjEgKDI3IE1heSAyMDE0KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTQtMDUtMjU6IGhmYWxjaWMKCSAgICBbUHl0aG9uXSBQeXRob24gMyBieXRlIHN0cmluZyBvdXRwdXQ6IHVzZSBlcnJvcnM9InN1cnJvZ2F0ZWVzY2FwZSIKICAgICAgICAgICAgaWYgYXZhaWxhYmxlIG9uIHRoZSB2ZXJzaW9uIG9mIFB5dGhvbiB0aGF0J3MgaW4gdXNlLiBUaGlzIGFsbG93cwogICAgICAgICAgICBvYnRhaW5pbmcgdGhlIG9yaWdpbmFsIGJ5dGUgc3RyaW5nIChhbmQgcG90ZW50aWFsbHkgdHJ5aW5nIGEgZmFsbGJhY2sKICAgICAgICAgICAgZW5jb2RpbmcpIGlmIHRoZSBieXRlcyBjYW4ndCBiZSBkZWNvZGVkIGFzIFVURi04LgoKICAgICAgICAgICAgUHJldmlvdXNseSwgYSBVbmljb2RlRGVjb2RlRXJyb3Igd291bGQgYmUgcmFpc2VkIHdpdGggbm8gd2F5IHRvIHRyZWF0CiAgICAgICAgICAgIHRoZSBkYXRhIGFzIGJ5dGVzIG9yIHRyeSBhbm90aGVyIGNvZGVjLgoKMjAxNC0wNS0xODogdmthbGluaW4KCSAgICBCdWcgIzE3NSAtIFJlc3RvcmUgJWV4dGVuZCB0byB3b3JrIGZvciB1bm5hbWVkIG5lc3RlZCBzdHJ1Y3R1cmVzIGJ5IHVzaW5nIGEgQwogICAgICAgICAgICBzeW1ib2wgY29tcHJpc2luZyB0aGUgb3V0ZXIgc3RydWN0dXJlIG5hbWUgYW5kIHVubmFtZWQgdmFyaWFibGUgaW5zdGFuY2UgbmFtZS4KCjIwMTQtMDUtMTU6IGt3d2V0dGUKCSAgICBBZGQgIzE2NiAtICdtYWtlIGNoZWNrJyBub3cgd29ya3Mgb3V0IG9mIHNvdXJjZS4gVGhpcyByZXF1aXJlZCB0aGUgZXhhbXBsZXMgdG8gYnVpbGQKICAgICAgICAgICAgb3V0IG9mIHNvdXJjZS4gVGhlIG1haW4gbGFuZ3VhZ2VzIGhhdmUgYmVlbiB0ZXN0ZWQgLSBDIywgR28sIEd1aWxlLCBKYXZhLCBKYXZhc2NyaXB0LAogICAgICAgICAgICBMdWEsIE9jdGF2ZSwgUGVybCwgUEhQLCBQeXRob24sIFJ1YnkgYW5kIFRjbC4KCjIwMTQtMDUtMDE6IE9saXZlciBCdWNodGFsYQoJICAgIEphdmFzY3JpcHQgc3VwcG9ydCBhZGRlZCwgc2VlIEphdmFzY3JpcHQgY2hhcHRlciBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KCjIwMTQtMDUtMDE6IG9sbHkKCSAgICBbUEhQXSBUaGUgZ2VuZXJhdGVkIF9faXNzZXQoKSBtZXRob2Qgbm93IHJldHVybnMgdHJ1ZSBmb3IgcmVhZC1vbmx5IHByb3BlcnRpZXMuCgoyMDE0LTA0LTI0OiBrd3dldHRlCiAgICAgICAgICAgIFtHb10gRml4IGdvIC4vY29uZmlndXJlIHBhcnNpbmcgb2YgZ2NjZ28gLS12ZXJzaW9uLCBhbmQKICAgICAgICAgICAgZ29ydW50aW1lLnN3ZyB0eXBvIGluIF9fR05VQ19QQVRDSExFVkVMX18gKFNGIEJ1ZyAjMTI5OCkKCjIwMTQtMDQtMjQ6IGt3d2V0dGUKICAgICAgICAgICAgRml4IHtweXRob258cGVybDV8cnVieXx0Y2x9L2phdmEgZXhhbXBsZXMKCiAgICAgICAgICAgIEluIExpYi9nY2ovY25pLmksIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbmV3ZXIgZ2NqIHZlcnNpb25zOgoKICAgICAgICAgICAgLSByZW1vdmUgSnZBbGxvY09iamVjdCgpIHdoaWNoIGdjaiBubyBsb25nZXIgZGVmaW5lcywgZnJvbSBnY2ogQ2hhbmdlbG9nOgogICAgICAgICAgICAgIDIwMDQtMDQtMTYgIEJyeWNlIE1jS2lubGF5ICA8bWNraW5sYXlAcmVkaGF0LmNvbT4KICAgICAgICAgICAgICAgICogZ2NqL2NuaS5oIChKdkFsbG9jT2JqZWN0KTogUmVtb3ZlIHRoZXNlIG9ic29sZXRlLAogICAgICAgICAgICAgICAgdW5kb2N1bWVudGVkIENOSSBjYWxscy4KCiAgICAgICAgICAgIC0gY2hhbmdlIEp2Q3JlYXRlSmF2YVZNKCkgYXJndW1lbnQgZnJvbSB2b2lkKiB0byBKdlZNSW5pdEFyZ3MqLCBmcm9tIGdjaiBDaGFuZ2Vsb2c6CiAgICAgICAgICAgICAgMjAwNS0wMi0yMyAgVGhvbWFzIEZpdHpzaW1tb25zICA8Zml0enNpbUByZWRoYXQuY29tPgogICAgICAgICAgICAgIFBSIGxpYmdjai8xNjkyMwogICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIChKdkNyZWF0ZUphdmFWTSk6IERlY2xhcmUgdm1fYXJncyBhcyBKdlZNSW5pdEFyZ3MqIHJhdGhlciB0aGFuIHZvaWQqLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMjAxNC0wNC0wODogd3NmdWx0b24KICAgICAgICAgICAgU0YgQnVnICMxMzY2IC0gUmVtb3ZlIGR1cGxpY2F0ZSBkZWNsYXJhdGlvbnMgb2Ygc3RydG9pbWF4IGFuZCBzdHJ0b3VtYXggaW4gaW50dHlwZXMuaQoKMjAxNC0wNC0wODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEgQyNdIEVudW1zIHdoaWNoIGhhdmUgYmVlbiBpZ25vcmVkIHZpYSAlaWdub3JlIGFuZCBhcmUgc3Vic2VxdWVudGx5CiAgICAgICAgICAgIHVzZWQgYXJlIGhhbmRsZWQgc2xpZ2h0bHkgZGlmZmVyZW50bHkuIFR5cGUgd3JhcHBlciBjbGFzc2VzIGFyZSBub3cgZ2VuZXJhdGVkCiAgICAgICAgICAgIHdoaWNoIGFyZSBlZmZlY3RpdmVseSBhIHdyYXBwZXIgb2YgYW4gZW1wdHkgZW51bS4gUHJldmlvdXNseSBpbiBKYXZhIHVuY29tcGlsYWJsZQogICAgICAgICAgICBjb2RlIHdhcyBnZW5lcmF0ZWQgYW5kIGluIEMjIGFuIGludCB3YXMgdXNlZC4KCjIwMTQtMDQtMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCByZWdyZXNzaW9uIGluIDMuMC4wIHdoZXJlIGxlZ2FsIGNvZGUgZm9sbG93aW5nIGFuIG9wZXJhdG9yPDwgZGVmaW5pdGlvbiBtaWdodAogICAgICAgICAgICBnaXZlIGEgc3ludGF4IGVycm9yLiBTRiBCdWcgIzEzNjUuCgoyMDE0LTA0LTAzOiBvbGx5CgkgICAgW1BIUF0gRml4IHdyYXBwaW5nIGRpcmVjdG9yIGNvbnN0cnVjdG9ycyB3aXRoIGRlZmF1bHQgcGFyYW1ldGVycwoJICAgIHdpdGggYSBaVFMtZW5hYmxlZCBidWlsZCBvZiBQSFAuCgoyMDE0LTA0LTAyOiBvbGx5CgkgICAgW1BIUF0gUGFzcyB0aGUgWlRTIGNvbnRleHQgd2UgYWxyZWFkeSBoYXZlIHRvIGF2b2lkIG5lZWRpbmcgdG8KCSAgICBjYWxsIFRTUk1MU19GRVRDSCwgd2hpY2ggaXMgcmVsYXRpdmVseSBleHBlbnNpdmUuCgoyMDE0LTA0LTAyOiBvbGx5CgkgICAgW1BIUF0gUGFzcyBaVFMgY29udGV4dCB0aHJvdWdoIHRvIHRfb3V0cHV0X2hlbHBlcigpIHNvIGl0IHdvcmtzCgkgICAgd2l0aCBhIFpUUy1lbmFibGVkIGJ1aWxkIG9mIFBIUC4gIFJlcG9ydGVkIGJ5IFBpZXJyZSBMYWJhc3RpZSBpbgoJICAgIGdpdGh1YiBQUiMxNTUuCgoyMDE0LTAzLTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSBDIyBEIEdvXSBGaXhlcyBmb3IgQyBlbnVtcyB1c2VkIGluIGFuIEFQSSBhbmQgdGhlIGRlZmluaXRpb24gb2YgdGhlIGVudW0KICAgICAgICAgICAgaGFzIG5vdCBiZWVuIHBhcnNlZC4gRm9yIEQsIHRoaXMgZml4ZXMgYSBzZWdmYXVsdCBpbiBTV0lHLiBUaGUgb3RoZXIgbGFuZ3VhZ2VzCiAgICAgICAgICAgIG5vdyBwcm9kdWNlIGNvZGUgdGhhdCBjb21waWxlcywgYWx0aG91Z2ggdGhlIGRlZmluaXRpb24gb2YgdGhlIGVudW0gaXMgbmVlZGVkCiAgICAgICAgICAgIGluIG9yZGVyIHRvIHVzZSB0aGUgZW51bSBwcm9wZXJseSBmcm9tIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuCgoyMDE0LTAzLTIzOiB2LWZvci12YW5kYWwKICAgICAgICAgICAgW0x1YV0gRml4IGZvciB1c2FnZSBvZiBzbnByaW50ZiBpbiBMdWEgcnVudGltZSB3aGljaCBWaXN1YWwgU3R1ZGlvIGRvZXMgbm90IGhhdmUuCgpWZXJzaW9uIDMuMC4wICgxNiBNYXIgMjAxNCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDE0LTAzLTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBDKysxMSBzdXBwb3J0IGluaXRpYWxseSBkZXZlbG9wZWQgYXMgQysrMHggc3VwcG9ydCBieSBNYXRldnogSmVrb3ZlYyBhcyBhIEdvb2dsZSBTdW1tZXIgb2YgQ29kZQogICAgICAgICAgICBwcm9qZWN0IGhhcyBiZWVuIGZ1cnRoZXIgZXh0ZW5kZWQuIFRoZSBDKysxMSBzdXBwb3J0IGlzIGNvbXByZWhlbnNpdmUsIGJ1dCBieSBubyBtZWFucyBjb21wbGV0ZQogICAgICAgICAgICBvciB3aXRob3V0IGxpbWl0YXRpb25zLiBGdWxsIGRldGFpbHMgZm9yIGVhY2ggbmV3IGZlYXR1cmUgaW4gQysrMTEgaXMgY292ZXJlZCBpbiB0aGUKICAgICAgICAgICAgQ1BsdXNQbHVzMTEuaHRtbCBjaGFwdGVyIGluIHRoZSBkb2N1bWVudGF0aW9uIHdoaWNoIGlzIGluY2x1ZGVkIGluIFNXSUcgYW5kIGFsc28gYXZhaWxhYmxlCiAgICAgICAgICAgIG9ubGluZSBhdCBodHRwczovL3d3dy5zd2lnLm9yZy9Eb2MzLjAvQ1BsdXNQbHVzMTEuaHRtbC4KCjIwMTQtMDMtMTQ6IHYtZm9yLXZhbmRhbAogICAgICAgICAgICBbTHVhXSBOdW1lcm91cyBMdWEgaW1wcm92ZW1lbnRzOgogICAgICAgICAgICAxLiAlbnNwYWNlIHN1cHBvcnQgaGFzIGJlZW4gYWRkZWQuIE5hbWVzcGFjZXMgYXJlIG1hcHBlZCB0byB0YWJsZXMgaW4gdGhlIG1vZHVsZSwgd2l0aCB0aGUgc2FtZQogICAgICAgICAgICAgICBuYW1lIGFzIHRoZSBDKysgbmFtZXNwYWNlLgogICAgICAgICAgICAyLiBJbmhlcml0YW5jZSBpcyBub3cgaGFuZGxlZCBkaWZmZXJlbnRseS4gRWFjaCBjbGFzcyBtZXRhdGFibGUga2VlcHMgYSBsaXN0IG9mIGNsYXNzIGJhc2VzIGluc3RlYWQKICAgICAgICAgICAgICAgb2YgbWVyZ2luZyBhbGwgbWVtYmVycyBvZiBhbGwgYmFzZXMgaW50byB0aGUgZGVyaXZlZCBjbGFzcy4KICAgICAgICAgICAgMy4gVGhlIG5ldyBtZXRhdGFibGVzIHJlc3VsdCBpbiBkaWZmZXJlbmNlcyBpbiBhY2Nlc3NpbmcgY2xhc3MgbWVtYmVycy4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICVtb2R1bGUgZXhhbXBsZQogICAgICAgICAgICAgICAgIHN0cnVjdCBUZXN0IHsKICAgICAgICAgICAgICAgICAgICAgZW51bSB7IFRFU1QxID0gMTAsIFRFU1QyID0gMjAgfTsKICAgICAgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludCBJQ09OU1QgPSAxMjsKICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICBOb3cgdGhpcyBjYW4gYmUgdXNlZCBhcyBmb2xsb3dzOgogICAgICAgICAgICAgICAgICAgcHJpbnQoZXhhbXBsZS5UZXN0LlRFU1QxKQogICAgICAgICAgICAgICAgICAgcHJpbnQoZXhhbXBsZS5UZXN0LklDT05TVCkKICAgICAgICAgICAgICAgICBUaGUgb2xkIHdheSB3YXM6CiAgICAgICAgICAgICAgICAgICBwcmludChleGFtcGxlLlRlc3RfVEVTVDEpCiAgICAgICAgICAgICAgICAgICBwcmludChleGFtcGxlLlRlc3RfSUNPTlNUKQoKICAgICAgICAgICAgNC4gVGhlIHNwZWNpYWwgY2xhc3MgbWV0YXRhYmxlIG1lbWJlciAiLmNvbnN0cnVjdG9yIiB3YXMgcmVtb3ZlZC4gTm93IFNXSUcgZ2VuZXJhdGVzIHRoZSBwcm94eQogICAgICAgICAgICAgICBmdW5jdGlvbiBieSBpdHNlbGYgYW5kIGFzc2lnbnMgaXQgZGlyZWN0bHkgdG8gdGhlIGNsYXNzIHRhYmxlICJfX2NhbGwiIG1ldGhvZC4KICAgICAgICAgICAgNS4gZUx1YSBzaG91bGQgYWxzbyBub3cgc3VwcG9ydCBpbmhlcml0YW5jZS4KICAgICAgICAgICAgNi4gJ2NvbnN0JyBzdWJ0YWJsZSBpbiBlTHVhIGlzIGNvbnNpZGVyZWQgZGVwcmVjYXRlZC4KCiAgICAgICAgICAgIENoYW5nZXMgaW4gYmVoYXZpb3VyOgogICAgICAgICAgICBhLiBZb3UgY2FuIG5vIGxvbmdlciBhc3NpZ24gdG8gbm9uLWV4aXN0aW5nIGNsYXNzIG1lbWJlcnMgaW4gY2xhc3NlcyB3aXRob3V0IGEgX19zZXRpdGVtX18gbWV0aG9kLgogICAgICAgICAgICAgICBJdCB3aWxsIGNhdXNlIGEgTHVhIGVycm9yLgogICAgICAgICAgICBiLiBZb3UgY2FuIG5vIGxvbmdlciBpdGVyYXRlIG92ZXIgYSBtb2R1bGUgdGFibGUgYW5kIGNvcHkgZXZlcnl0aGluZyBpbnRvIHRoZSBnbG9iYWwgbmFtZXNwYWNlLgogICAgICAgICAgICAgICBBY3R1YWxseSwgdGhpcyB3YXMgbmV2ZXIgdGhlIGNhc2UsIGJ1dCBpdCBpcyBub3cgZXhwbGljaXRseSBwcm9oaWJpdGVkLgogICAgICAgICAgICBjLiBOb3cgY2hhbmdpbmcgYSBiYXNlIGNsYXNzIHdpbGwgaW1tZWRpYXRlbHkgYWZmZWN0IGFsbCBkZXJpdmVkIGNsYXNzZXMuCiAgICAgICAgICAgIGQuIFRoZXJlIG1pZ2h0IGJlIHNvbWUgaXNzdWVzIHdpdGggaW5oZXJpdGFuY2UuIEFsdGhvdWdoIHRoZSBiYXNlcyBpdGVyYXRpb24gc2NoZW1lIGlzIHRoZSBzYW1lCiAgICAgICAgICAgICAgIGFzIHdhcyB1c2VkIGZvciBtZXJnaW5nIGJhc2UgY2xhc3NlcyBpbnRvIGRlcml2ZWQgb25lLCBzb21lIHVua25vd24gaXNzdWVzIG1heSBhcmlzZS4KCiAgICAgICAgICAgIFRoZSBvbGQgbWV0YXRhYmxlIGJlaGF2aW91ciBjYW4gYmUgcmVzdG9yZWQgYnkgdXNpbmcgdGhlIC1uby1vbGQtbWV0YXRhYmxlLWJpbmRpbmdzIG9wdGlvbi4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjIwMTQtMDMtMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIENoYW5nZSBpbiBkZWZhdWx0IGJlaGF2aW91ciB3cmFwcGluZyBDKysgYm9vbC4gT25seSBhIFB5dGhvbiBUcnVlIG9yIEZhbHNlCiAgICAgICAgICAgIHdpbGwgbm93IHdvcmsgZm9yIEMrKyBib29sIHBhcmFtZXRlcnMuIFRoaXMgZml4ZXMgb3ZlcmxvYWRpbmcgYm9vbCB3aXRoIG90aGVyIHR5cGVzLgogICAgICAgICAgICBQeXRob24gMi4zIG1pbmltdW0gaXMgbm93IHJlcXVpcmVkIGZvciB3cmFwcGluZyBib29sLgoKICAgICAgICAgICAgV2hlbiB3cmFwcGluZzoKCiAgICAgICAgICAgICAgY29uc3QgY2hhciogb3ZlcmxvYWRlZChib29sIHZhbHVlKSB7IHJldHVybiAiYm9vbCI7IH0KICAgICAgICAgICAgICBjb25zdCBjaGFyKiBvdmVybG9hZGVkKGludCB2YWx1ZSkgeyByZXR1cm4gImludCI7IH0KCiAgICAgICAgICAgIFByZXZpb3VzIGJlaGF2aW91cjoKICAgICAgICAgICAgICA+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+LgoKMjAxMC0xMC0wMTogd3NmdWx0b24KICAgICAgICAgICAgQWRkIC1wY3JldmVyc2lvbiBvcHRpb24gdG8gZGlzcGxheSBQQ1JFIHZlcnNpb24gaW5mb3JtYXRpb24uCgoyMDEwLTEwLTAxOiBvbGx5CgkgICAgW1J1YnldIEF2b2lkIHNlZ2ZhdWx0IHdoZW4gYSBtZXRob2Qgbm9kZSBoYXMgbm8gcGFyZW50Tm9kZQoJICAgIChTRiMzMDM0MDU0KS4KCjIwMTAtMTAtMDE6IG9sbHkKCSAgICBbUHl0aG9uXSBBbGxvdyByZWluaXRpYWxpc2F0aW9uIHRvIHdvcmsgd2l0aCBhbiBlbWJlZGRlZCBQeXRob24KCSAgICBpbnRlcnByZXRlciAocGF0Y2ggZnJvbSBKaW0gQ2Fycm9sbCBpbiBTRiMzMDc1MTc4KS4KCjIwMTAtMDktMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQXBwbHkgcGF0Y2ggZnJvbSBUb21hcyBEaXJ2YW5hdXNrYXMgZm9yIHN0ZDo6bWFwIHdyYXBwZXJzIHRvIGF2b2lkCiAgICAgICAgICAgIHRocm93aW5nIGV4Y2VwdGlvbnMgd2l0aCBub3JtYWwgdXNhZ2Ugb2YgaXRlcmF0b3JzLgoKMjAxMC0wOS0yNzogb2xseQoJICAgIFtQeXRob25dIEltcHJvdmUgZXJyb3IgbWVzc2FnZSBnaXZlbiB3aGVuIGEgcGFyYW1ldGVyIG9mIHRoZSB3cm9uZwoJICAgIHR5cGUgaXMgcGFzc2VkIHRvIGFuIG92ZXJsb2FkZWQgbWV0aG9kIChTRiMzMDI3MzU1KS4KCjIwMTAtMDktMjU6IHdzZnVsdG9uCiAgICAgICAgICAgIEFwcGx5IFNGIHBhdGNoICMzMDc1MTUwIC0gSmF2YSBkaXJlY3RvcnMgdXNpbmcgc3RhdGljIHZhcmlhYmxlcyBpbgogICAgICAgICAgICBuYW1lZCBuYW1lc3BhY2UuCgoyMDEwLTA5LTI0OiB3c2Z1bHRvbgogICAgICAgICAgICBNb3JlIGZpbGUgYW5kIGxpbmUgZXJyb3Ivd2FybmluZyByZXBvcnRpbmcgZml4ZXMgd2hlcmUgU1dJRyBtYWNyb3MKICAgICAgICAgICAgYXJlIHVzZWQgd2l0aGluIHt9IGJyYWNlcyAod2hlcmUgdGhlIHByZXByb2Nlc3NvciBleHBhbmRzIG1hY3JvcyksCiAgICAgICAgICAgIGZvciBleGFtcGxlIG1hY3JvcyB3aXRoaW4gJWlubGluZSB7Li4ufSBhbmQgJWZyYWdtZW50KC4uLikgey4uLn0KICAgICAgICAgICAgYW5kIG5lc3RlZCBzdHJ1Y3RzLgoKMjAxMC0wOS0xODogd3NmdWx0b24KICAgICAgICAgICAgTW9yZSBmaWxlIGFuZCBsaW5lIGVycm9yL3dhcm5pbmcgcmVwb3J0aW5nIGZpeGVzIGZvciB2YXJpb3VzIGluaGVyaXRlZAogICAgICAgICAgICBjbGFzcyBwcm9ibGVtcy4KCjIwMTAtMDktMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIEEgbXVjaCBpbXByb3ZlZCBkZWJ1Z2dpbmcgb2YgU1dJRyBzb3VyY2UgZXhwZXJpZW5jZSBpcyBub3cgYXZhaWxhYmxlIGFuZAogICAgICAgICAgICBkb2N1bWVudGVkIGluIHRoZSAiRGVidWdnaW5nIFNXSUciIHNlY3Rpb24gaW4gdGhlIERvYy9EZXZlbC9pbnRlcm5hbHMuaHRtbAogICAgICAgICAgICBmaWxlLCBpbmNsdWRpbmcgYSBzd2lnLmRiZyBzdXBwb3J0IGZpbGUgZm9yIHRoZSBnZGIgZGVidWdnZXIuCgoyMDEwLTA5LTExOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggaW5jb3JyZWN0IGxpbmUgbnVtYmVyIHJlcG9ydGluZyBpbiBlcnJvcnMvd2FybmluZ3Mgd2hlbiBhIG1hY3JvCiAgICAgICAgICAgIGRlZmluaXRpb24gZW5kcyB3aXRoICcvJyBhbmQgaXQgaXMgbm90IHRoZSBlbmQgb2YgYSBDIGNvbW1lbnQuCgoyMDEwLTA5LTExOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggaW5jb3JyZWN0IGxpbmUgbnVtYmVyIHJlcG9ydGluZyBpbiBlcnJvcnMvd2FybmluZ3MgYWZ0ZXIgcGFyc2luZwogICAgICAgICAgICBtYWNybyBpbnZvY2F0aW9ucyB3aXRoIHBhcmFtZXRlcnMgZ2l2ZW4gb3ZlciBtb3JlIHRoYW4gb25lIGxpbmUuCgoyMDEwLTA5LTEwOiB3c2Z1bHRvbgogICAgICAgICAgICBSZW1vdmUgZXh0cmFuZW91cyBleHRyYSBsaW5lIGluIHByZXByb2Nlc3NlZCBvdXRwdXQgYWZ0ZXIgaW5jbHVkaW5nIGZpbGVzCiAgICAgICAgICAgIHdoaWNoIHdvdWxkIHNvbWV0aW1lcyBsZWFkIHRvIGVycm9yL3dhcm5pbmcgbWVzc2FnZXMgdHdvIGxpbmVzIGFmdGVyIHRoZQogICAgICAgICAgICBlbmQgb2YgdGhlIGZpbGUuCgoyMDEwLTA5LTEwOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzIxNDk1MjMgLSBJbmNvcnJlY3QgbGluZSBudW1iZXIgcmVwb3J0aW5nIGluIGVycm9ycyBhZnRlciBwYXJzaW5nIG1hY3JvcwogICAgICAgICAgICBjb250YWluaW5nIEMrKyBjb21tZW50cy4KCjIwMTAtMDktMDg6IG9sbHkKCSAgICBbUEhQXSBGaXggaGFuZGxpbmcgb2YgT1VUUFVUIHR5cGVtYXBzIChQYXRjaCBmcm9tIFJ5YW4gaW4gU0YjMzA1ODM5NCkuCgoyMDEwLTA5LTAzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZXJyb25lb3VzIGxpbmUgbnVtYmVycyBpbiBlcnJvciBtZXNzYWdlcyBmb3IgbWFjcm8gZXhwYW5zaW9ucywgZm9yIGV4YW1wbGUsCiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlIG5vdyBwb2ludHMgdG8gaW5zdGFudGlhdGlvbiBvZiB0aGUgbWFjcm8sIGllIHRoZSBsYXN0IGxpbmUgaGVyZToKCiAgICAgICAgICAgICAgI2RlZmluZSBNQUNSTzIoYSwgYikgCgogICAgICAgICAgICAgICNkZWZpbmUgTUFDUk8xKE5BTUUpIE1BQ1JPMihOQU1FLDIsMykgCgogICAgICAgICAgICAgIE1BQ1JPMShhYmMpCgoyMDEwLTA5LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggbGluZSBudW1iZXJzIGluIGVycm9yIGFuZCB3YXJuaW5nIG1lc3NhZ2VzIGZvciBwcmVwcm9jZXNzb3IgbWVzc2FnZXMgd2l0aGluCiAgICAgICAgICAgICVpbmxpbmUsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlaW5saW5lICV7CiAgICAgICAgICAgICAgI2RlZmluZSBGT09CQVIgMQogICAgICAgICAgICAgICNkZWZpbmUgRk9PQkFSICJoaSIKICAgICAgICAgICAgICAlfQoKMjAxMC0wOS0wMjogd3NmdWx0b24KICAgICAgICAgICAgRml4IGxpbmUgbnVtYmVycyBpbiBlcnJvciBhbmQgd2FybmluZyBtZXNzYWdlcyB3aGljaCB3ZXJlIGN1bXVsYXRpdmVseSBvbmUKICAgICAgICAgICAgbGVzcyB0aGFuIHRoZXkgc2hvdWxkIGhhdmUgYmVlbiBhZnRlciBwYXJzaW5nIGVhY2ggJWluY2x1ZGUvJWltcG9ydCAtIGJ1ZwogICAgICAgICAgICBpbnRyb2R1Y2VkIGluIHN3aWctMS4zLjMyLiBBbHNvIGZpeCBsaW5lIG51bWJlcnMgaW4gZXJyb3IgYW5kIHdhcm5pbmcgbWVzc2FnZXMKICAgICAgICAgICAgd2hlbiBuZXcgbGluZSBjaGFyYWN0ZXJzIGFwcGVhciBiZXR3ZWVuIHRoZSAlaW5jbHVkZSAvICVpbXBvcnQgc3RhdGVtZW50IGFuZAogICAgICAgICAgICB0aGUgZmlsZW5hbWUuCgoyMDEwLTA4LTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggbGluZSBudW1iZXIgYW5kIGZpbGUgbmFtZSByZXBvcnRpbmcgZm9yIHNvbWUgbWFjcm8gcHJlcHJvY2Vzc29yIHdhcm5pbmdzLgogICAgICAgICAgICBUaGUgbGluZSBudW1iZXIgb2YgdGhlIG1hY3JvIGFyZ3VtZW50IGhhcyBiZWVuIGNvcnJlY3RlZCBhbmQgdGhlIGxpbmUgbnVtYmVyCiAgICAgICAgICAgIG9mIHRoZSBzdGFydCBvZiB0aGUgbWFjcm8gaW5zdGVhZCBvZiBvbmUgcGFzdCB0aGUgZW5kIG9mIHRoZSBtYWNybyBpcyB1c2VkLgogICAgICAgICAgICBTb21lIGV4YW1wbGVzOgogICAgICAgICAgICAgIGZpbGUuaDoxMTogRXJyb3I6IElsbGVnYWwgbWFjcm8gYXJndW1lbnQgbmFtZSAnLi4nCiAgICAgICAgICAgICAgZmlsZS5oOjE5OiBFcnJvcjogTWFjcm8gJ0RVUExJQ0FURScgcmVkZWZpbmVkLAogICAgICAgICAgICAgIGZpbGUuaDoxNTogRXJyb3I6IHByZXZpb3VzIGRlZmluaXRpb24gb2YgJ0RVUExJQ0FURScuCiAgICAgICAgICAgICAgZmlsZS5oOjI1OiBFcnJvcjogVmFyaWFibGUtbGVuZ3RoIG1hY3JvIGFyZ3VtZW50IG11c3QgYmUgbGFzdCBwYXJhbWV0ZXIKICAgICAgICAgICAgICBmaWxlLmg6MzI6IEVycm9yOiBJbGxlZ2FsIGNoYXJhY3RlciBpbiBtYWNybyBhcmd1bWVudCBuYW1lCiAgICAgICAgICAgICAgZmlsZS5pOjM3OiBFcnJvcjogTWFjcm8gJ1NJVCcgZXhwZWN0cyAyIGFyZ3VtZW50cwoKMjAxMC0wOC0yNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IF9fTElORV9fIGFuZCBfX0ZJTEVfXyBleHBhbnNpb24gcmVwb3J0ZWQgYnkgQ2FtaWxsZSBHaWxsb3QuIE1vc3RseSB0aGlzCiAgICAgICAgICAgIGRpZCBub3Qgd29yayBhdCBhbGwuIEFsc28gZml4ZXMgU0YgIzI4MjI4MjIuCgoyMDEwLTA4LTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gRml4IGNvcm5lciBjYXNlIG1hcnNoYWxsaW5nIG9mIGRvdWJsZXMgLSBlcnJubyB3YXMgbm90IGJlaW5nIGNvcnJlY3RseQogICAgICAgICAgICBzZXQgYmVmb3JlIGNhbGxpbmcgc3RydG9kIC0gcGF0Y2ggZnJvbSBKdXN0aW4gVmFsbG9uIC0gU0YgQnVnICMzMDM4OTM2LgoKMjAxMC0wOC0xNzogd3NmdWx0b24KICAgICAgICAgICAgRml4IG1ha2UgZGlzdGNsZWFuIHdoZW4gc29tZSBvZiB0aGUgbW9yZSBvYnNjdXJlIGxhbmd1YWdlcyBhcmUgZGV0ZWN0ZWQgYnkKICAgICAgICAgICAgY29uZmlndXJlIC0gZml4ZXMgZnJvbSBUb3JzdGVuIExhbmRzY2hvZmYuCgoyMDEwLTA3LTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBSZXN0b3JlIGNvbmZpZ3VyaW5nIG91dCBvZiBzb3VyY2UgZm9yIHRoZSB0ZXN0LXN1aXRlIHNpbmNlIGl0IGJyb2tlIGluIDEuMy4zNy4KICAgICAgICAgICAgQXMgcHJldmlvdXNseSwgaWYgcnVubmluZyAnbWFrZSBjaGVjay10ZXN0LXN1aXRlJyBvdXQgb2Ygc291cmNlLCBpdCBuZWVkcyB0byBiZQogICAgICAgICAgICBkb25lIGJ5IGludm9raW5nIGNvbmZpZ3VyZSB3aXRoIGEgcmVsYXRpdmUgcGF0aC4gSW52b2tpbmcgY29uZmlndXJlIHdpdGggYW4KICAgICAgICAgICAgYWJzb2x1dGUgcGF0aCB3aWxsIG5vdCB3b3JrLiBSdW5uaW5nIHRoZSBmdWxsICdtYWtlIGNoZWNrJyBzdGlsbCBuZWVkcyB0byBiZQogICAgICAgICAgICBkb25lIGluIHRoZSBzb3VyY2UgdHJlZS4KCjIwMTAtMDctMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB3cmFwcGluZyBvZiBmdW5jdGlvbiBwb2ludGVycyBhbmQgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzIHdoZW4gdGhlIGZ1bmN0aW9uCiAgICAgICAgICAgIHJldHVybnMgYnkgcmVmZXJlbmNlLgoKMjAxMC0wNy0xMzogdmFkegogICAgICAgICAgICBSZW1vdmVkIHN1cHBvcnQgZm9yIHRoZSBvbGQgZXhwZXJpbWVudGFsICJyeHNwZW5jZXIiIGVuY29kZXIgYW5kCiAgICAgICAgICAgICJbbm90XXJ4c21hdGNoIiBpbiAlcmVuYW1lIChzZWUgdGhlIDAxLzE2LzIwMDYgZW50cnkpLiBUaGUgbmV3IGFuZAogICAgICAgICAgICBvZmZpY2lhbGx5IHN1cHBvcnRlZCAicmVnZXgiIGVuY29kZXIgYW5kICJbbm90XXJlZ2V4bWF0Y2giIGNoZWNrcwogICAgICAgICAgICBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIChzZWUgdGhlIHR3byBwcmV2aW91cyBlbnRyaWVzKS4gUGxlYXNlCiAgICAgICAgICAgIHJlcGxhY2UgIiUocnhzcGVuY2VyOltwYXRdW3N1YnN0XSlzIiB3aXRoICIlKHJlZ2V4Oi9wYXQvc3Vic3QvKXMiCiAgICAgICAgICAgIHdoZW4gdXBncmFkaW5nLiBOb3RpY2UgdGhhdCB5b3Ugd2lsbCBhbHNvIG5lZWQgdG8gcmVwbGFjZSB0aGUgYmFjay0KICAgICAgICAgICAgcmVmZXJlbmNlcyBvZiBmb3JtICJAMSIgd2l0aCB0aGUgbW9yZSBzdGFuZGFyZCAiXFwxIiBhbmQgbWF5IG5lZWQgdG8KICAgICAgICAgICAgYWRqdXN0IHlvdXIgcmVndWxhciBleHByZXNzaW9ucyBzeW50YXggYXMgdGhlIG5ldyByZWdleCBlbmNvZGVyIHVzZXMKICAgICAgICAgICAgUGVybC1jb21wYXRpYmxlIHN5bnRheCBhbmQgbm90IChleHRlbmRlZCkgUE9TSVggc3ludGF4IGFzIHRoZSBvbGQgb25lLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDEwLTA3LTEzOiB2YWR6CiAgICAgICAgICAgIEFkZCAicmVnZXhtYXRjaCIsICJyZWdleHRhcmdldCIgYW5kICJub3RyZWdleG1hdGNoIiB3aGljaCBjYW4gYmUKICAgICAgICAgICAgdXNlZCB0byBhcHBseSAlcmVuYW1lIGRpcmVjdGl2ZXMgdG8gdGhlIGRlY2xhcmF0aW9ucyBtYXRjaGluZyB0aGUKICAgICAgICAgICAgc3BlY2lmaWVkIHJlZ3VsYXIgZXhwcmVzc2lvbiBvbmx5LiBUaGUgZmlyc3QgdHdvIGNhbiBiZSB1c2VkCiAgICAgICAgICAgIGludGVyY2hhbmdlYWJseSwgYm90aCBvZiB0aGUgJXJlbmFtZXMgYmVsb3cgZG8gdGhlIHNhbWUgdGhpbmc6CgogICAgICAgICAgICAgICAgJXJlbmFtZSgiJGlnbm9yZSIsIHJlZ2V4bWF0Y2gkbmFtZT0iT2xkJCIpICIiOwogICAgICAgICAgICAgICAgJXJlbmFtZSgiJGlnbm9yZSIsIHJlZ2V4dGFyZ2V0PTEpICJPbGQkIjsKCiAgICAgICAgICAgIChuYW1lbHkgaWdub3JlIHRoZSBkZWNsYXJhdGlvbnMgaGF2aW5nICJPbGQiIHN1ZmZpeCkuCgogICAgICAgICAgICAibm90cmVnZXhtYXRjaCIgcmVzdHJpY3RzIHRoZSBtYXRjaCB0byBvbmx5IHRoZSBkZWNsYXJhdGlvbnMgd2hpY2gKICAgICAgICAgICAgZG8gbm90IG1hdGNoIHRoZSByZWd1bGFyIGV4cHJlc3Npb24sIGUuZy4gaGVyZSBpcyBob3cgdG8gcmVuYW1lIHRvCiAgICAgICAgICAgIGxvd2VyIGNhc2UgdmVyc2lvbnMgYWxsIGRlY2xhcmF0aW9ucyBleGNlcHQgdGhvc2UgY29uc2lzdGluZyBmcm9tCiAgICAgICAgICAgIGNhcGl0YWwgbGV0dGVycyBvbmx5OgoKICAgICAgICAgICAgICAgICVyZW5hbWUoIiQobG93ZXJjYXNlKXMiLCBub3RyZWdleG1hdGNoJG5hbWU9Il5bQS1aXSskIikgIiI7CgoyMDEwLTA3LTEzOiB2YWR6CiAgICAgICAgICAgIEFkZCB0aGUgbmV3ICJyZWdleCIgZW5jb2RlciB0aGF0IGNhbiBiZSB1c2VkIGluICVyZW5hbWUsIGUuZy4KCiAgICAgICAgICAgICAgICAlcmVuYW1lKCJyZWdleDovKFxcdyspXyguKikvXFwyLyIpICIiOwoKICAgICAgICAgICAgdG8gcmVtb3ZlIGFueSBhbHBoYWJldGljYWwgcHJlZml4IGZyb20gYWxsIGlkZW50aWZpZXJzLiBUaGUgc3ludGF4CiAgICAgICAgICAgIG9mIHRoZSByZWd1bGFyIGV4cHJlc3Npb25zIGlzIFBlcmwtbGlrZSBhbmQgUENSRSBsaWJyYXJ5CiAgICAgICAgICAgIChodHRwOi8vd3d3LnBjcmUub3JnLykgaXMgdXNlZCB0byBpbXBsZW1lbnQgdGhpcyBmZWF0dXJlIGJ1dCBub3RpY2UKICAgICAgICAgICAgdGhhdCBiYWNrc2xhc2hlcyBuZWVkIHRvIGJlIGVzY2FwZWQgYXMgdXN1YWwgaW5zaWRlIEMgc3RyaW5ncy4KCiAgICAgICAgICAgIE9yaWdpbmFsIHBhdGNoIGZyb20gVG9yc3RlbiBMYW5kc2Nob2ZmLgoKMjAxMC0wNy0wODogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMzMDI0ODc1IC0gc2hhcmVkX3B0ciBvZiBjbGFzc2VzIHdpdGggbm9uLXB1YmxpYyBkZXN0cnVjdG9ycy4gVGhpcyBhbHNvIGZpeGVzCiAgICAgICAgICAgIHRoZSAidW5yZWYiIGZlYXR1cmUgd2hlbiB1c2VkIG9uIGNsYXNzZXMgd2l0aCBub24tcHVibGljIGRlc3RydWN0b3JzLgoKMjAxMC0wNi0xNzogaWFubGFuY2V0YXlsb3IKICAgICAgICAgICAgW0dvXSBBZGQgdGhlIEdvIGxhbmd1YWdlIG1vZHVsZS4KCjIwMTAtMDYtMTA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIEZpeCBTV0lHX2x1YV9pc25pbHN0cmluZyBtdWx0aXBseSBkZWZpbmVkIHdoZW4gdXNpbmcgbXVsdGlwbGUKICAgICAgICAgICAgbW9kdWxlcyBhbmQgd3JhcHBpbmcgc3RyaW5ncy4gUGF0Y2ggZnJvbSAnTnVtYmVyIENydW5jaGVyJy4KCjIwMTAtMDYtMTA6IG9sbHkKCSAgICBbUEhQXSBGaXggZGlyZWN0b3JzIHRvIGNvcnJlY3RseSBjYWxsIGEgbWV0aG9kIHdpdGggaGFzIGEKCSAgICBkaWZmZXJlbnQgbmFtZSBpbiBQSFAgdG8gQysrICh3ZSB3ZXJlIGFsd2F5cyB1c2luZyB0aGUgQysrIG5hbWUKCSAgICBpbiB0aGlzIGNhc2UpLgoKMjAxMC0wNi0wMzogd3NmdWx0b24KICAgICAgICAgICAgRml4IHVuY29tcGlsYWJsZSBjb2RlIHdoZW4gJXJlbmFtZSByZXN1bHRzIGluIHR3byBlbnVtIGl0ZW1zCiAgICAgICAgICAgIHdpdGggdGhlIHNhbWUgbmFtZS4gUmVwb3J0ZWQgYnkgVmFkaW0gWmVpdGxpbi4KClZlcnNpb24gMi4wLjAgKDIgSnVuZSAyMDEwKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTAtMDYtMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IFNXSUdfU1REX1ZFQ1RPUl9FTkhBTkNFRCBtYWNybyB1c2VkIGluIHN0ZDo6dmVjdG9yIHRvIHdvcmsgd2l0aAogICAgICAgICAgICB0eXBlcyBjb250YWluaW5nIGNvbW1hcywgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIFNXSUdfU1REX1ZFQ1RPUl9FTkhBTkNFRChzdGQ6OnBhaXI8IGRvdWJsZSwgc3RkOjpzdHJpbmcgPikKCjIwMTAtMDYtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBpbiBzdGRfc2hhcmVkX3B0ci5pIGZvciB3cmFwcGluZyBzdGQ6OnNoYXJlZF9wdHIuIFJlcXVpcmVzIHRoZSAlc2hhcmVkX3B0cgogICAgICAgICAgICBtYWNybyBsaWtlIGluIHRoZSBib29zdF9zaGFyZWRfcHRyLmkgbGlicmFyeS4gc3RkOjp0cjE6OnNoYXJlZF9wdHIgY2FuIGFsc28gYmUKICAgICAgICAgICAgd3JhcHBlZCBpZiB0aGUgZm9sbG93aW5nIG1hY3JvIGlzIGRlZmluZWQ6CgogICAgICAgICAgICAgICNkZWZpbmUgU1dJR19TSEFSRURfUFRSX1NVQk5BTUVTUEFDRSB0cjEKICAgICAgICAgICAgICAlaW5jbHVkZSA8c3RkX3NoYXJlZF9wdHIuaT4KCiAgICAgICAgICAgIHNoYXJlZF9wdHIgaXMgYWxzbyBkb2N1bWVudGVkIGluIExpYnJhcnkuaHRtbCBub3cuCgoyMDEwLTA1LTI3OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgdGhlIGFiaWxpdHkgZm9yICR0eXBlbWFwIHNwZWNpYWwgdmFyaWFibGUgbWFjcm9zIHRvIGNhbGwgb3RoZXIgJHR5cGVtYXAKICAgICAgICAgICAgc3BlY2lhbCB2YXJpYWJsZSBtYWNyb3MsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAldHlwZW1hcChjc3R5cGUpIENDICJDQyIKICAgICAgICAgICAgICAldHlwZW1hcChjc3R5cGUpIEJCICIkdHlwZW1hcChjc3R5cGUsIENDKSIKICAgICAgICAgICAgICAldHlwZW1hcChjc3R5cGUpIEFBICIkdHlwZW1hcChjc3R5cGUsIEJCKSIKICAgICAgICAgICAgICB2b2lkIGhhaChBQSBhYSk7CgogICAgICAgICAgICBUaGlzIGFsc28gZml4ZXMgQyMgc3RkOjp2ZWN0b3IgY29udGFpbmVycyBvZiBzaGFyZWRfcHRyIGFuZCAlc2hhcmVkX3B0ci4KCiAgICAgICAgICAgIEFsc28gYWRkZWQgZGlhZ25vc3RpY3MgZm9yICR0eXBlbWFwIHdpdGggLWRlYnVnLXRtc2VhcmNoLCBmb3IgZXhhbXBsZSwgdGhlCiAgICAgICAgICAgIGFib3ZlIGRpc3BsYXlzIGFkZGl0aW9uYWwgZGlhZ25vc3RpYyBsaW5lcyBzdGFydGluZyAiQ29udGFpbmluZzogIjoKCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjM0OiBTZWFyY2hpbmcgZm9yIGEgc3VpdGFibGUgJ2NzdHlwZScgdHlwZW1hcCBmb3I6IEFBIGFhCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogQUEgYWEKICAgICAgICAgICAgICAgIExvb2tpbmcgZm9yOiBBQQogICAgICAgICAgICAgICAgVXNpbmc6ICV0eXBlbWFwKGNzdHlwZSkgQUEKICAgICAgICAgICAgICAgIENvbnRhaW5pbmc6ICR0eXBlbWFwKGNzdHlwZSwgQkIpCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjMxOiBTZWFyY2hpbmcgZm9yIGEgc3VpdGFibGUgJ2NzdHlwZScgdHlwZW1hcCBmb3I6IEJCCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogQkIKICAgICAgICAgICAgICAgIFVzaW5nOiAldHlwZW1hcChjc3R5cGUpIEJCCiAgICAgICAgICAgICAgICBDb250YWluaW5nOiAkdHlwZW1hcChjc3R5cGUsIENDKQogICAgICAgICAgICAgIGV4YW1wbGUuaToyOTogU2VhcmNoaW5nIGZvciBhIHN1aXRhYmxlICdjc3R5cGUnIHR5cGVtYXAgZm9yOiBDQwogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IENDCiAgICAgICAgICAgICAgICBVc2luZzogJXR5cGVtYXAoY3N0eXBlKSBDQwoKMjAxMC0wNS0yNjogb2xseQoJICAgIEZpeCAlYXR0cmlidXRlMnJlZiBub3QgdG8gcHJvZHVjZSBhIHN5bnRheCBlcnJvciBpZiB0aGUgbGFzdAoJICAgIGFyZ3VtZW50IChBY2Nlc3Nvck1ldGhvZCkgaXMgb21pdHRlZC4gIFBhdGNoIGZyb20gRGF2aWQgUGllcGdyYXMKCSAgICBpbiBTRiMyMjM1NzU2LgoKMjAxMC0wNS0yNjogb2xseQoJICAgIFtQSFBdIFdoZW4gdXNpbmcgJXRocm93cyBvciAlY2F0Y2hlcywgU1dJRy1nZW5lcmF0ZWQgUEhQNSB3cmFwcGVycwoJICAgIG5vdyB0aHJvdyBQSFAgRXhjZXB0aW9uIG9iamVjdHMgaW5zdGVhZCBvZiBnaXZpbmcgYSBQSFAgZXJyb3Igb2YKCSAgICB0eXBlIEVfRVJST1IuCgoJICAgIFRoaXMgY2hhbmdlIHNob3VsZG4ndCBjYXVzZSBpbmNvbXBhdGliaWxpdHkgaXNzdWVzLCBzaW5jZSB5b3UgY2FuJ3QKCSAgICBzZXQgYW4gZXJyb3IgaGFuZGxlciBmb3IgRV9FUlJPUiwgc28gcHJldmlvdXNseSBQSFAgd291bGQganVzdCBleGl0CgkgICAgd2hpY2ggYWxzbyBoYXBwZW5zIGZvciB1bmhhbmRsZWQgZXhjZXB0aW9ucy4gIFRoZSBiZW5lZml0IGlzIHlvdSBjYW4KCSAgICBub3cgY2F0Y2ggdGhlbSBpZiB5b3Ugd2FudCB0by4KCgkgICAgRml4ZXMgU0YjMjU0NTU3OCBhbmQgU0YjMjk1NTUyMi4KCjIwMTAtMDUtMjU6IG9sbHkKCSAgICBbUEhQXSBBZGQgbWlzc2luZyBkaXJlY3RvcmluIHR5cGVtYXAgZm9yIGNvbnN0IHN0ZDo6c3RyaW5nICYuCgkgICAgRml4ZXMgU0YjMzAwNjQwNCByZXBvcnRlZCBieSB0LUxlZ2lhdy4KCjIwMTAtMDUtMjM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4ICMyOTU3Mzc1IC0gU1dJR1N0cmluZ0hlbHBlciBhbmQgU1dJR0V4Y2VwdGlvbkhlbHBlciBub3QgYWx3YXlzIGJlaW5nCiAgICAgICAgICAgIGluaXRpYWxpemVkIGJlZm9yZSB1c2UgaW4gLk5FVCA0IGFzIHRoZSBjbGFzc2VzIHdlcmUgbm90IG1hcmtlZCBiZWZvcmVmaWVsZGluaXQuCiAgICAgICAgICAgIEEgc3RhdGljIGNvbnN0cnVjdG9yIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBpbnRlcm1lZGlhcnkgY2xhc3MgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAlcHJhZ21hKGNzaGFycCkgaW1jbGFzc2NvZGU9JXsKICAgICAgICAgICAgICAgIHN0YXRpYyAkaW1jbGFzc25hbWUoKSB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIElmIHlvdSBoYWQgYWRkZWQgeW91ciBvd24gY3VzdG9tIHN0YXRpYyBjb25zdHJ1Y3RvciB0byB0aGUgaW50ZXJtZWRpYXJ5IGNsYXNzIGluCiAgICAgICAgICAgIHRoZSBzYW1lIHdheSBhcyBhYm92ZSwgeW91IHdpbGwgaGF2ZSB0byBtb2RpZnkgeW91ciBhcHByb2FjaCB0byB1c2Ugc3RhdGljIHZhcmlhYmxlCiAgICAgICAgICAgIGluaXRpYWxpemF0aW9uIG9yIGRlZmluZSBTV0lHX0NTSEFSUF9OT19JTUNMQVNTX1NUQVRJQ19DT05TVFJVQ1RPUiAtIFNlZSBjc2hhcnBoZWFkLnN3Zy4KCgkgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDEwLTA1LTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzI0MDgyMzIuIEltcHJvdmUgc2hhcmVkX3B0ciBhbmQgaW50cnVzaXZlX3B0ciB3cmFwcGVycyBmb3IgY2xhc3NlcyBpbiBhbgogICAgICAgICAgICBpbmhlcml0YW5jZSBoaWVyYXJjaHkuIE5vIHNwZWNpYWwgdHJlYXRtZW50IGlzIG5lZWRlZCBmb3IgZGVyaXZlZCBjbGFzc2VzLgogICAgICAgICAgICBUaGUgcHJveHkgY2xhc3MgYWxzbyBubyBsb25nZXIgbmVlZHMgdG8gYmUgc3BlY2lmaWVkLCBpdCBpcyBhdXRvbWF0aWNhbGx5CiAgICAgICAgICAgIGRlZHVjZWQuIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGFyZSBkZXByZWNhdGVkOgogICAgICAgICAgICAgIFNXSUdfU0hBUkVEX1BUUihQUk9YWUNMQVNTLCBUWVBFKQogICAgICAgICAgICAgIFNXSUdfU0hBUkVEX1BUUl9ERVJJVkVEKFBST1hZQ0xBU1MsIEJBU0VDTEFTU1RZUEUsIFRZUEUpCiAgICAgICAgICAgIGFuZCBoYXZlIGJlZW4gcmVwbGFjZWQgYnkKICAgICAgICAgICAgICAlc2hhcmVkX3B0cihUWVBFKQogICAgICAgICAgICBTaW1pbGFybHkgZm9yIGludHJ1c2l2ZV9wdHIgd3JhcHBlcnMsIHRoZSBmb2xsb3dpbmcgbWFjcm8gaXMgZGVwcmVjYXRlZDoKICAgICAgICAgICAgICBTV0lHX0lOVFJVU0lWRV9QVFIoUFJPWFlDTEFTUywgVFlQRSkKICAgICAgICAgICAgICBTV0lHX0lOVFJVU0lWRV9QVFJfREVSSVZFRChQUk9YWUNMQVNTLCBCQVNFQ0xBU1NUWVBFLCBUWVBFKQogICAgICAgICAgICBhbmQgaGF2ZSBiZWVuIHJlcGxhY2VkIGJ5CiAgICAgICAgICAgICAgJWludHJ1c2l2ZV9wdHIoVFlQRSkKCjIwMTAtMDUtMjE6IG9sbHkKCSAgICBbUEhQXSBTdG9wIGdlbmVyYXRpbmcgYSBib2d1cyBsaW5lIG9mIGNvZGUgaW4gY2VydGFpbiBjb25zdHJ1Y3RvcnMuCgkgICAgVGhpcyB3YXMgbW9zdGx5IGhhcm1sZXNzLCBidXQgY2F1c2VkIGEgUEhQIG5vdGljZSB0byBiZSBpc3N1ZWQsIGlmCgkgICAgZW5hYmxlZCAoU0YjMjk4NTY4NCkuCgoyMDEwLTA1LTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IG1lbWJlciBwb2ludGVycyBvbiA2NCBiaXQgcGxhdGZvcm1zLgoKMjAxMC0wNS0xNDogd3NmdWx0b24KICAgICAgICAgICAgRml4IHdyYXBwaW5nIG9mIEMrKyBlbnVtIGJvb2xlYW4gdmFsdWVzIHJlcG9ydGVkIGJ5IFRvcnN0ZW4gTGFuZHNjaG9mZjoKICAgICAgICAgICAgICB0eXBlZGVmIGVudW0geyBQTEFZID0gdHJ1ZSwgU1RPUCA9IGZhbHNlIH0gcGxheV9zdGF0ZTsKCjIwMTAtMDUtMTQ6IG9sbHkKCSAgICBbUEhQXSBGaXggd3JhcHBpbmcgb2YgZ2xvYmFsIHZhcmlhYmxlcyB3aGljaCB3YXMgcHJvZHVjaW5nCgkgICAgdW5jb21waWxhYmxlIGNvZGUgaW4gc29tZSBjYXNlcy4KCjIwMTAtMDUtMTI6IGRyam9lCgkgICAgW1JdIEFkZCB0d28gbW9yZSBjaGFuZ2VzIGZyb20gV2lsIE5vbGFuLiAgR2V0IGdhcmJhZ2UKCSAgICBjb2xsZWN0aW9uIHRvIHdvcmsuICBJbXBsZW1lbnQgbmV3ZnJlZQoKMjAxMC0wNS0wOTogZHJqb2UKICAgICAgICAgICAgRml4IGJ1ZyByZXBvcnRlZCBieSBXaWwgTm9sYW4gY2hhbmdlIGNyZWF0aW9uIG9mIHN0cmluZyBzbwogICAgICAgICAgICB0aGF0IFIgMi43LjArIGNhbiB1c2UgY2hhciBoYXNoZXMKCjIwMTAtMDUtMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIEFwcGx5IHBhdGNoICMyOTU1MTQ2IGZyb20gU2VyZ2V5IFNhdHNraXkgdG8gZml4IGV4cHJlc3Npb25zIGNvbnRhaW5pbmcgZGl2aWRlIGJ5CiAgICAgICAgICAgIG9wZXJhdG9yIGluIGNvbnN0cnVjdG9yIGluaXRpYWxpemF0aW9uIGxpc3RzLgoKMjAxMC0wNS0wNTogd3NmdWx0b24KICAgICAgICAgICAgW1JdIE1lbW9yeSBsZWFrIGZpeCBoYW5kbGluZyBjb25zdCBzdGQ6OnN0cmluZyAmIGlucHV0cywgcmVwb3J0ZWQgYnkgV2lsbCBOb2xhbi4KCjIwMTAtMDUtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIFR5cGVtYXAgbWF0Y2hpbmcgZW5oYW5jZW1lbnQgZm9yIG5vbi1kZWZhdWx0IHR5cGVtYXBzLiBQcmV2aW91c2x5IGFsbAogICAgICAgICAgICBxdWFsaWZpZXJzIHdlcmUgc3RyaXBwZWQgaW4gb25lIHN0ZXAsIG5vdyB0aGV5IGFyZSBzdHJpcHBlZCBvbmUgYXQgYSB0aW1lCiAgICAgICAgICAgIHN0YXJ0aW5nIHdpdGggdGhlIGxlZnQgbW9zdCBxdWFsaWZpZXIuIEZvciBleGFtcGxlLCBpbnQgY29uc3QqY29uc3QgCiAgICAgICAgICAgIGlzIGZpcnN0IHN0cmlwcGVkIHRvIGludCAqY29uc3QgdGhlbiBpbnQgKi4KCgkgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDEwLTA0LTI1OiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4ICMyOTg1NjU1IC0gYnJva2VuIGNvbnN0cnVjdG9yIHJlbmFtaW5nLgoKMjAxMC0wNC0xNDogd3NmdWx0b24KICAgICAgICAgICAgVHlwZW1hcCBmcmFnbWVudHMgYXJlIG5vdyBvZmZpY2lhbCBhbmQgZG9jdW1lbnRlZCBpbiBUeXBlbWFwcy5odG1sLgoKMjAxMC0wNC0wOTogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEZpeCAjMjA0ODA2NCBhbmQgIzI0MDgwMjAuCiAgICAgICAgICAgIEFwcGx5IFVidW50dSBwYXRjaCB0byBmaXggUnVieSBhbmQgc3RkOjp2ZWN0b3Igd3JhcHBlcnMgd2l0aCAtbWluaGVyaXQuCiAgICAgICAgICAgIGh0dHBzOi8vYnVncy5sYXVuY2hwYWQubmV0L3VidW50dS8rc291cmNlL3N3aWcxLjMvK2J1Zy81MjI4NzQKCjIwMTAtMDQtMDk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtNenNjaGVtZV0gQXBwbHkgVWJ1bnR1IHBhdGNoIHRvIGZpeCBzdGQ6Om1hcCB3cmFwcGVyczoKICAgICAgICAgICAgaHR0cHM6Ly9idWdzLmxhdW5jaHBhZC5uZXQvdWJ1bnR1Lytzb3VyY2Uvc3dpZzEuMy8rYnVnLzIwMzg3NgoKMjAxMC0wNC0wOTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQXBwbHkgcGF0Y2ggIzI5NTIzNzQgLSBmaXggZGlyZWN0b3JzIGFuZCB0aGUgLW5vcnR0aSBvcHRpb24uCgoyMDEwLTA0LTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBGaXggIzI4ODcyNTQgYW5kICMyOTQ2MDMyIC0gU1dJR19MdWFfdHlwZW5hbWUgdXNpbmcgd3Jvbmcgc3RhY2sgaW5kZXguCgoyMDEwLTA0LTAzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggZXhjZXB0aW9ucyBiZWluZyB0aHJvd24gd2l0aCB0aGUgLXRocmVhZHMgb3B0aW9uIGJhc2VkIG9uIHBhdGNoIGZyb20gQXJ0byBWdW9yaS4KICAgICAgICAgICAgRml4ZXMgYnVnICMyODE4NDk5LgoKMjAxMC0wNC0wMzogd3NmdWx0b24KICAgICAgICAgICAgRml4IE1ha2VmaWxlIHRhcmdldHM6IGRpc3RjbGVhbiBhbmQgbWFpbnRhaW5lci1jbGVhbgoKMjAxMC0wNC0wMjogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gRml4IGNoYXIgcG9pbnRlcnMsIHdjaGFyX3QgcG9pbnRlcnMgYW5kIGNoYXIgYXJyYXlzIHNvIHRoYXQgbmlsIGNhbiBiZSBwYXNzZWQgYXMgYQogICAgICAgICAgICB2YWxpZCB2YWx1ZS4gQnVnIHJlcG9ydGVkIGJ5IEdlZGFsaWEgUGFzdGVybmFrLgoKMjAxMC0wNC0wMTogd3NmdWx0b24KICAgICAgICAgICAgTnVtZXJvdXMgc3VidGxlIHR5cGVtYXAgbWF0Y2hpbmcgcnVsZSBmaXhlcyB3aGVuIHVzaW5nIHRoZSBkZWZhdWx0IHR5cGUuIFRoZSB0eXBlbWFwCiAgICAgICAgICAgIG1hdGNoaW5nIHJ1bGVzIGFyZSB0byB0YWtlIGEgdHlwZSBhbmQgZmluZCB0aGUgYmVzdCBkZWZhdWx0IHR5cGVtYXAgKFNXSUdUWVBFLCBTV0lHVFlQRSogZXRjKSwKICAgICAgICAgICAgdGhlbiBsb29rIGZvciB0aGUgbmV4dCBiZXN0IG1hdGNoIGJ5IHJlZHVjaW5nIHRoZSBjaG9zZW4gZGVmYXVsdCB0eXBlLiBUaGUgdHlwZSBkZWR1Y3Rpb24KICAgICAgICAgICAgbm93IGZvbGxvd3MgQysrIGNsYXNzIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gbWF0Y2hpbmcgcnVsZXMuCgogICAgICAgICAgICBCZWxvdyBhcmUgdGhlIHNldCBvZiBjaGFuZ2VzIG1hZGUgc2hvd2luZyB0aGUgZGVmYXVsdCB0eXBlIGRlZHVjdGlvbgogICAgICAgICAgICBhbG9uZyB3aXRoIHRoZSBvbGQgcmVkdWNlZCB0eXBlIGFuZCB0aGUgbmV3IHZlcnNpb24gb2YgdGhlIHJlZHVjZWQgdHlwZToKCiAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSBjb25zdCAmW0FOWV0KICAgICAgICAgICAgICBuZXc6IFNXSUdUWVBFIGNvbnN0ICZbXQogICAgICAgICAgICAgIG9sZDogU1dJR1RZUEUgKCYpW0FOWV0KCiAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSAqY29uc3QgW0FOWV0KICAgICAgICAgICAgICBuZXc6IFNXSUdUWVBFIGNvbnN0IFtBTlldCiAgICAgICAgICAgICAgb2xkOiBTV0lHVFlQRSAqW0FOWV0KCiAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSBjb25zdCAqY29uc3QgW0FOWV0KICAgICAgICAgICAgICBuZXc6IFNXSUdUWVBFICpjb25zdCBbQU5ZXQogICAgICAgICAgICAgIG9sZDogU1dJR1RZUEUgY29uc3QgKltBTlldCgogICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgY29uc3QgKmNvbnN0ICYKICAgICAgICAgICAgICBuZXc6IFNXSUdUWVBFICpjb25zdCAmCiAgICAgICAgICAgICAgb2xkOiBTV0lHVFlQRSBjb25zdCAqJgoKICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFICpjb25zdCAqCiAgICAgICAgICAgICAgbmV3OiBTV0lHVFlQRSBjb25zdCAqCiAgICAgICAgICAgICAgb2xkOiBTV0lHVFlQRSAqKgoKICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFICpjb25zdCAmCiAgICAgICAgICAgICAgbmV3OiBTV0lHVFlQRSBjb25zdCAmCiAgICAgICAgICAgICAgb2xkOiBTV0lHVFlQRSAqJgoKICAgICAgICAgICAgQWRkaXRpb25hbGx5LCBhIGNvbnN0IFNXSUdUWVBFIGxvb2t1cCBpcyB1c2VkIG5vdyBmb3IgYW55IGNvbnN0YW50IHR5cGUuIFNvbWUgZXhhbXBsZXMsIHdoZXJlCiAgICAgICAgICAgIFQgaXMgc29tZSByZWR1Y2VkIHR5cGUsIGVnIGludCwgc3RydWN0IEZvbzoKCiAgICAgICAgICAgICAgICAgICBUIGNvbnN0CiAgICAgICAgICAgICAgbmV3OiBTV0lHVFlQRSBjb25zdAogICAgICAgICAgICAgIG9sZDogU1dJR1RZUEUKCiAgICAgICAgICAgICAgICAgICBUICpjb25zdAogICAgICAgICAgICAgIG5ldzogU1dJR1RZUEUgKmNvbnN0CiAgICAgICAgICAgICAgb2xkOiBTV0lHVFlQRSAqCgogICAgICAgICAgICAgICAgICAgVCBjb25zdFtdCiAgICAgICAgICAgICAgbmV3OiBTV0lHVFlQRSBjb25zdFtdCiAgICAgICAgICAgICAgb2xkOiBTV0lHVFlQRVtdCgogICAgICAgICAgICAgICAgICAgZW51bSBUIGNvbnN0CiAgICAgICAgICAgICAgbmV3OiBlbnVtIFNXSUdUWVBFIGNvbnN0CiAgICAgICAgICAgICAgb2xkOiBlbnVtIFNXSUdUWVBFCgogICAgICAgICAgICAgICAgICAgVCAoKmNvbnN0IClbXQogICAgICAgICAgICAgIG5ldzogU1dJR1RZUEUgKCpjb25zdCApW10KICAgICAgICAgICAgICBvbGQ6IFNXSUdUWVBFICgqKVtdCgogICAgICAgICAgICBSZW1pbmRlcjogdGhlIHR5cGVtYXAgbWF0Y2hpbmcgcnVsZXMgY2FuIG5vdyBiZSBzZWVuIGZvciBhbnkgdHlwZXMgYmVpbmcgd3JhcHBlZCBieSB1c2luZwogICAgICAgICAgICBlaXRoZXIgdGhlIC1kZWJ1Zy10bXNlYXJjaCBvciAtZGVidWctdG11c2VkIG9wdGlvbnMuCgogICAgICAgICAgICBJbiBwcmFjdGljZSB0aGlzIGxlYWRzIHRvIHNvbWUgc3VidGxlIG1hdGNoaW5nIHJ1bGUgY2hhbmdlcyBhbmQgdGhlIG1ham9yaXR5IG9mIHVzZXJzCiAgICAgICAgICAgIHdvbid0IG5vdGljZSBhbnkgY2hhbmdlcywgZXhjZXB0IGluIHRoZSBwcmltZSBhcmVhIG9mIG1vdGl2YXRpb24gZm9yIHRoaXMgY2hhbmdlOiBJbXByb3ZlCiAgICAgICAgICAgIFNUTCBjb250YWluZXJzIG9mIGNvbnN0IHBvaW50ZXJzIGFuZCBwYXNzaW5nIGNvbnN0IHBvaW50ZXJzIGJ5IHJlZmVyZW5jZS4gVGhpcyBpcyBmaXhlZAogICAgICAgICAgICBiZWNhdXNlIG1hbnkgb2YgdGhlIFNUTCBjb250YWluZXJzIHVzZSBhIHR5cGUgJ1QgY29uc3QmJyBhcyBwYXJhbWV0ZXJzIGFuZCB3aGVuIFQgaXMgCiAgICAgICAgICAgIGEgY29uc3QgcG9pbnRlciwgZm9yIGV4YW1wbGUsICdLIGNvbnN0KicsIHRoZW4gdGhlIGZ1bGwgdHlwZSBpcyAnSyBjb25zdCpjb25zdCYnLiBUaGlzCiAgICAgICAgICAgIG1lYW5zIHRoYXQgdGhlICdTV0lHVFlQRSAqY29uc3QmJyB0eXBlbWFwcyBub3cgbWF0Y2ggd2hlbiBUIGlzIGVpdGhlciBhIG5vbi1jb25zdCBvcgogICAgICAgICAgICBjb25zdCBwb2ludGVyLiBGdXJ0aGVybW9yZSwgc29tZSB0YXJnZXQgbGFuZ3VhZ2VzIGluY29ycmVjdGx5IGhhZCAnU1dJR1RZUEUgKiYnIHR5cGVtYXBzCiAgICAgICAgICAgIHdoZW4gdGhlc2Ugc2hvdWxkIGhhdmUgYmVlbiAnU1dJR1RZUEUgKmNvbnN0JicuIFRoZXNlIGhhdmUgYmVlbiBjb3JyZWN0ZWQgKEphdmEsIEMjLCBMdWEsIFBIUCkuCgoJICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxMC0wMy0xMzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFNvbWUgdmVyeSBvbGQgZGVwcmVjYXRlZCBwcmFnbWEgd2FybmluZ3MgYXJlIG5vdyBlcnJvcnMuCgoyMDEwLTAzLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBJbXByb3ZlIGhhbmRsaW5nIG9mIGZpbGUgbmFtZXMgYW5kIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgZG91YmxlL211bHRpcGxlIHBhdGggc2VwYXJhdG9ycy4KCjIwMTAtMDMtMTA6IG11dGFuZGl6IChNaWtlbCBCYW5jcm9mdCkKCSAgICBbYWxsZWdyb2NsXSBVc2UgZnVsbHkgcXVhbGlmaWVkIHN5bWJvbCBuYW1lIG9mIGNsOjppZGVudGl0eSBpbiBlbWl0X2RlZnVuKCkuCgoyMDEwLTAzLTA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gVGhlIGludGVybWVkaWFyeSBKTkkgY2xhc3MgbW9kaWZpZXJzIGFyZSBub3cgcHVibGljIGJ5IGRlZmF1bHQgbWVhbmluZyB0aGVzZQogICAgICAgICAgICBpbnRlcm1lZGlhcnkgbG93IGxldmVsIGZ1bmN0aW9ucyBhcmUgbm93IGFjY2Vzc2libGUgYnkgZGVmYXVsdCBmcm9tIG91dHNpZGUgYW55IHBhY2thZ2UKICAgICAgICAgICAgdXNlZC4gVGhlIHByb3h5IGNsYXNzIHBvaW50ZXIgY29uc3RydWN0b3IgYW5kIGdldENQdHIoKSBtZXRob2RzIGFyZSBhbHNvIG5vdyBwdWJsaWMuCiAgICAgICAgICAgIFRoZXNlIGFyZSBuZWVkZWQgaW4gb3JkZXIgZm9yIHRoZSBuc3BhY2Ugb3B0aW9uIHRvIHdvcmsgd2l0aG91dCBhbnkgb3RoZXIgbW9kcy4KICAgICAgICAgICAgVGhlIHByZXZpb3VzIGRlZmF1bHQgb2YgcHJvdGVjdGVkIGFjY2VzcyBjYW4gYmUgcmVzdG9yZWQgdXNpbmc6CgogICAgICAgICAgICAgIFNXSUdfSkFWQUJPRFlfTUVUSE9EUyhwcm90ZWN0ZWQsIHByb3RlY3RlZCwgU1dJR1RZUEUpCiAgICAgICAgICAgICAgJXByYWdtYShqYXZhKSBqbmljbGFzc2NsYXNzbW9kaWZpZXJzID0gImNsYXNzIgoKMjAxMC0wMy0wNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBZGRlZCB0aGUgbnNwYWNlIGZlYXR1cmUgZm9yIEMjLiBEb2N1bWVudGF0aW9uIGZvciB0aGUgbnNwYWNlIGZlYXR1cmUgaXMgbm93IGF2YWlsYWJsZS4KCjIwMTAtMDMtMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZGVkIHRoZSBuc3BhY2UgZmVhdHVyZS4gVGhpcyBhZGRzIHNvbWUgaW1wcm92ZWQgbmFtZXNwYWNlIHN1cHBvcnQuIEN1cnJlbnRseSBvbmx5IEphdmEKICAgICAgICAgICAgaXMgc3VwcG9ydGVkIGZvciB0YXJnZXQgbGFuZ3VhZ2VzLCB3aGVyZSBDKysgbmFtZXNwYWNlcyBhcmUgYXV0b21hdGljYWxseSB0cmFuc2xhdGVkIGludG8KICAgICAgICAgICAgSmF2YSBwYWNrYWdlcy4gVGhlIGZlYXR1cmUgb25seSBhcHBsaWVzIHRvIGNsYXNzZXMsc3RydWN0LHVuaW9ucyBhbmQgZW51bXMgZGVjbGFyZWQgd2l0aGluCiAgICAgICAgICAgIGEgbmFtZXNwYWNlLiBNZXRob2RzIGFuZCB2YXJpYWJsZXMgZGVjbGFyZWQgaW4gbmFtZXNwYWNlcyBzdGlsbCBlZmZlY3RpdmVseSBoYXZlIHRoZWlyCiAgICAgICAgICAgIG5hbWVzcGFjZXMgZmxhdHRlbmVkLiBFeGFtcGxlIHVzYWdlOgoKICAgICAgICAgICAgICAlZmVhdHVyZShuc3BhY2UpIE91dGVyOjpJbm5lcjE6OkNvbG9yOwogICAgICAgICAgICAgICVmZWF0dXJlKG5zcGFjZSkgT3V0ZXI6OklubmVyMjo6Q29sb3I7CgogICAgICAgICAgICAgIG5hbWVzcGFjZSBPdXRlciB7CiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgSW5uZXIxIHsKICAgICAgICAgICAgICAgICAgc3RydWN0IENvbG9yIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBJbm5lcjIgewogICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ29sb3IgewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEZvciBKYXZhLCB0aGUgLXBhY2thZ2Ugb3B0aW9uIGlzIGFsc28gcmVxdWlyZWQgd2hlbiB1c2luZyB0aGUgbnNwYWNlIGZlYXR1cmUuIFNheQogICAgICAgICAgICB3ZSB1c2UgLXBhY2thZ2UgY29tLm15Y28sIHRoZSB0d28gY2xhc3NlcyBjYW4gdGhlbiBiZSBhY2Nlc3NlZCBhcyBmb2xsb3dzIGZyb20gSmF2YToKCiAgICAgICAgICAgICAgY29tLm15Y28uT3V0ZXIuSW5uZXIxLkNvbG9yIGFuZCBjb20ubXljby5PdXRlci5Jbm5lcjIuQ29sb3IuCgoyMDEwLTAyLTI3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBSZW1vdmUgLWRpcnZ0YWJsZSBmcm9tIHRoZSBvcHRpbWl6YXRpb25zIGluY2x1ZGVkIGJ5IC1PIGFzIGl0IHRoaXMgb3B0aW9uCiAgICAgICAgICAgIGN1cnJlbnRseSBsZWFkcyB0byBtZW1vcnkgbGVha3MgYXMgcmVwb3J0ZWQgYnkgSm9oYW4gQmxha2UuCgoyMDEwLTAyLTI3OiB3c2Z1bHRvbgogICAgICAgICAgICBMaWNlbnNlIGNvZGUgY2hhbmdlczogU1dJRyBTb3VyY2UgaXMgR1BMLXYzIGFuZCBsaWJyYXJ5IGNvZGUgbGljZW5zZSBpcyBub3cgY2xlYXJlcgogICAgICAgICAgICBhbmQgaXMgcHJvdmlkZWQgdW5kZXIgYSB2ZXJ5IHBlcm1pc3NpdmUgbGljZW5zZS4gU2VlIGh0dHBzOi8vd3d3LnN3aWcub3JnL2xlZ2FsLmh0bWwuCgoyMDEwLTAyLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gQSBmZXcgZml4ZXMgZm9yIGNvbXBpbGluZyB1bmRlciBydWJ5LTEuOS54IGluY2x1ZGluZyBwYXRjaCBmcm9tICdOaWJibGUnLgoKMjAxMC0wMi0xMzogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEFwcGx5IHBhdGNoIGZyb20gUGF0cmljayBCZW5uZXR0IHRvIGZpeCBSQVJSQVlfTEVOIGFuZCBSQVJSQVlfUFRSIHVzYWdlIGZvciBSdWJ5IDEuOS54CiAgICAgICAgICAgIHVzZWQgaW4gdmFyaW91cyBTVEwgd3JhcHBlcnMuCgoyMDEwLTAyLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIEZpeCBpbmNvcnJlY3QgbXVsdGlwbHkgZGVmaW5lZCBzeW1ib2wgbmFtZSBlcnJvciB3aGVuIGFuIGVudW0gaXRlbQogICAgICAgICAgICBhbmQgY2xhc3MgbmFtZSBoYXZlIHRoZSBzYW1lIG5hbWUsIGFzIHJlcG9ydGVkIGJ5IE5hdGhhbiBLcmllZ2VyLiBFeGFtcGxlOgoKICAgICAgICAgICAgICBjbGFzcyBWZWN0b3Ige307CiAgICAgICAgICAgICAgbmFtZXNwYWNlIFRleHQgewogICAgICAgICAgICAgICAgZW51bSBQcmVmZXJlbmNlIHsgVmVjdG9yIH07CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhpcyBhbHNvIGZpeGVzIG90aGVyIGluY29ycmVjdCBjb3JuZXIgY2FzZSB0YXJnZXQgbGFuZ3VhZ2Ugc3ltYm9sIG5hbWUgY2xhc2hlcy4KCjIwMTAtMDItMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCB0aGUgLWRlYnVnLWxzeW1ib2xzIG9wdGlvbiBmb3IgZGlzcGxheWluZyB0aGUgdGFyZ2V0IGxhbmd1YWdlIGxheWVyIHN5bWJvbHMuCgoyMDEwLTAyLTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggLU1NIGFuZCAtTU1EIG9wdGlvbnMgb24gV2luZG93cy4gVGhleSB3ZXJlIG5vdCBvbWl0dGluZyBmaWxlcyBpbiB0aGUgU1dJRyBsaWJyYXJ5IGFzCiAgICAgICAgICAgIHRoZXkgc2hvdWxkIGJlLgoKMjAxMC0wMi0wODogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxODA3MzI5IC0gV2hlbiBNYWtlZmlsZSBkZXBlbmRlbmNpZXMgYXJlIGJlaW5nIGdlbmVyYXRlZCB1c2luZyB0aGUgLU0gZmFtaWx5IG9mIG9wdGlvbnMKICAgICAgICAgICAgb24gV2luZG93cywgdGhlIGZpbGUgcGF0aHMgaGF2ZSBiZWVuIGNvcnJlY3RlZCB0byB1c2Ugc2luZ2xlIGJhY2tzbGFzaGVzIHJhdGhlciB0aGFuIGRvdWJsZQogICAgICAgICAgICBiYWNrc2xhc2hlcyBhcyBwYXRoIHNlcGFyYXRvcnMuCgoyMDEwLTAyLTA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzI5MTg5MDIgLSBsYW5ndWFnZSBzcGVjaWZpYyBmaWxlcyBub3QgYmVpbmcgZ2VuZXJhdGVkIGluIGNvcnJlY3QgZGlyZWN0b3J5IG9uCiAgICAgICAgICAgIFdpbmRvd3Mgd2hlbiB1c2luZyBmb3J3YXJkIHNsYXNoZXMgZm9yIC1vLCBmb3IgZXhhbXBsZToKICAgICAgICAgICAgICBzd2lnIC1weXRob24gLWMrKyAtbyBzdWJkaXJlY3RvcnkvdGhlaW50ZXJmYWNlX3dyYXAuY3BwIHN1YmRpcmVjdG9yeS90aGVpbnRlcmZhY2UuaQoKMjAxMC0wMi0wNTogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMyODk0NDA1IC0gYXNzZXJ0aW9uIHdoZW4gdXNpbmcgLXhtbG91dC4KCjIwMTAtMDEtMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB0eXBlbWFwIG1hdGNoaW5nIGJ1ZyB3aGVuIGEgdGVtcGxhdGVkIHR5cGUgaGFzIGEgdHlwZW1hcCBib3RoIHNwZWNpYWxpemVkIGFuZCBub3QKICAgICAgICAgICAgc3BlY2lhbGl6ZWQuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgWFggeyAuLi4gfTsKICAgICAgICAgICAgICAldHlwZW1hcChpbikgY29uc3QgWFggJiAiLi4uIgogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBjb25zdCBYWDwgaW50ID4gJiAiLi4uIgoKICAgICAgICAgICAgcmVzdWx0ZWQgaW4gdGhlIDJuZCB0eXBlbWFwIGJlaW5nIGFwcGxpZWQgZm9yIGFsbCBUIGluIFhYPCBUID4uCgoyMDEwLTAxLTIyOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzI5MzMxMjkgLSB0eXBlbWFwcyBub3QgYmVpbmcgZm91bmQgd2hlbiB0aGUgdW5hcnkgc2NvcGUgb3BlcmF0b3IgKDo6KSBpcyB1c2VkIHRvIGRlbm90ZQogICAgICAgICAgICBnbG9iYWwgc2NvcGUsIHRoZSB0eXBlbWFwIGlzIG5vdyB1c2VkIGluIHNpdHVhdGlvbnMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICBzdHJ1Y3QgWCB7fTsKICAgICAgICAgICAgICAldHlwZW1hcChpbikgY29uc3QgWCAmICIuLi4iCiAgICAgICAgICAgICAgdm9pZCBtKGNvbnN0IDo6WCAmKTsKCiAgICAgICAgICAgIGFuZCB0aGlzOgoKICAgICAgICAgICAgICBzdHJ1Y3QgWCB7fTsKICAgICAgICAgICAgICAldHlwZW1hcChpbikgY29uc3QgOjpYICYgIi4uLiIKICAgICAgICAgICAgICB2b2lkIG0oY29uc3QgWCAmKTsKCjIwMTAtMDEtMjA6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzb21lIHVuYXJ5IHNjb3BlIG9wZXJhdG9yICg6OikgZGVub3RpbmcgZ2xvYmFsIHNjb3BlIHByb2JsZW1zIGluIHRoZSB0eXBlcyBnZW5lcmF0ZWQKICAgICAgICAgICAgaW50byB0aGUgQysrIGxheWVyLiBQcmV2aW91c2x5IHRoZSB1bmFyeSBzY29wZSBvcGVyYXRvciB3YXMgZHJvcHBlZCBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUKICAgICAgICAgICAgaWYgdGhlIHR5cGUgaGFkIGFueSBzb3J0IG9mIHF1YWxpZmllciwgZm9yIGV4YW1wbGUgd2hlbiB1c2luZyBwb2ludGVycywgcmVmZXJlbmNlcywgbGlrZQogICAgICAgICAgICA6OmZvbyosIDo6Zm9vJiwgYmFyPCA6OmZvbyogPi4KCjIwMTAtMDEtMTM6IG9sbHkKCSAgICBbUEhQXSBBZGQgZGF0ZXRpbWUgdG8gdGhlIGxpc3Qgb2YgUEhQIHByZWRlZmluZWQgY2xhc3NlcyAocGF0Y2gKCSAgICBmcm9tIERhdmlkIEZsZXRjaGVyIGluIFNGIzI5MzEwNDIpLgoKMjAxMC0wMS0xMTogd3NmdWx0b24KICAgICAgICAgICAgU2xpZ2h0IGNoYW5nZSB0byB3YXJuaW5nLCBlcnJvciBhbmQgZGlhZ25vc3RpYyByZXBvcnRpbmcuIFRoZSB3YXJuaW5nIG51bWJlciBpcyBubyAKICAgICAgICAgICAgbG9uZ2VyIHNob3duIHdpdGhpbiBicmFja2V0cy4gVGhpcyBpcyB0byBoZWxwIGRlZmF1bHQgcGFyc2luZyBvZiB3YXJuaW5nIG1lc3NhZ2VzIGJ5CiAgICAgICAgICAgIG90aGVyIHRvb2xzLCB2aW0gb24gVW5peCBpbiBwYXJ0aWN1bGFyLgoKICAgICAgICAgICAgRXhhbXBsZSBvcmlnaW5hbCBkaXNwbGF5IHVzaW5nIC1Gc3RhbmRhcmQ6CiAgICAgICAgICAgICAgZXhhbXBsZS5pOjIwOiBXYXJuaW5nKDQwMSk6IE5vdGhpbmcga25vd24gYWJvdXQgYmFzZSBjbGFzcyAnQicuIElnbm9yZWQuCiAgICAgICAgICAgIE5ldyBkaXNwbGF5OgogICAgICAgICAgICAgIGV4YW1wbGUuaToyMDogV2FybmluZyA0MDE6IE5vdGhpbmcga25vd24gYWJvdXQgYmFzZSBjbGFzcyAnQicuIElnbm9yZWQuCgogICAgICAgICAgICBBbHNvIHN1YnRsZSBmaXggdG8gLUZtaWNyb3NvZnQgZm9ybWF0IGFkZGluZyBpbiBtaXNzaW5nIHNwYWNlLiBFeGFtcGxlIG9yaWdpbmFsIGRpc3BsYXk6CiAgICAgICAgICAgICAgZXhhbXBsZS5pKDIwKTogV2FybmluZyg0MDEpOiBOb3RoaW5nIGtub3duIGFib3V0IGJhc2UgY2xhc3MgJ0Jhc2UnLiBJZ25vcmVkLgogICAgICAgICAgICBOZXcgZGlzcGxheToKICAgICAgICAgICAgICBleGFtcGxlLmkoMjApIDogV2FybmluZyA0MDE6IE5vdGhpbmcga25vd24gYWJvdXQgYmFzZSBjbGFzcyAnQmFzZScuIElnbm9yZWQuCgoyMDEwLTAxLTEwOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggYSBmZXcgaW5jb25zaXN0ZW5jaWVzIGluIHJlcG9ydGluZyBvZiBmaWxlL2xpbmUgbnVtYmVyaW5ncyBpbmNsdWRpbmcgbW9kaWZ5aW5nCiAgICAgICAgICAgIHRoZSBvdmVybG9hZCB3YXJuaW5ncyA1MDksIDUxMiwgNTE2LCA0NzQsIDQ3NSB0byBub3cgYmUgdHdvIGxpbmUgd2FybmluZ3MuCgoyMDEwLTAxLTEwOiB3c2Z1bHRvbgogICAgICAgICAgICBNb2RpZnkgLWRlYnVnLXRhZ3Mgb3V0cHV0IHRvIHVzZSBzdGFuZGFyZCBmaWxlIG5hbWUvbGluZSByZXBvcnRpbmcgc28gdGhhdCBlZGl0b3JzCiAgICAgICAgICAgIGNhbiBlYXNpbHkgbmF2aWdhdGUgdG8gdGhlIGFwcHJvcHJpYXRlIGxpbmVzLgogICAgICAgICAgICBXYXMgdHlwaWNhbGx5OgogICAgICAgICAgICAgIC4gdG9wIC4gaW5jbHVkZSAuIGluY2x1ZGUgKC91c3Ivc2hhcmUvc3dpZy90ZW1wL3RydW5rL0xpYi9zd2lnLnN3ZzozMTIpCiAgICAgICAgICAgICAgLiB0b3AgLiBpbmNsdWRlIC4gaW5jbHVkZSAuIGluY2x1ZGUgKC91c3Ivc2hhcmUvc3dpZy90ZW1wL3RydW5rL0xpYi9zd2lnd2FybmluZ3Muc3dnOjM5KQogICAgICAgICAgICBub3c6CiAgICAgICAgICAgICAgL3Vzci9zaGFyZS9zd2lnL3RlbXAvdHJ1bmsvTGliL3N3aWcuc3dnOjMxMjogIC4gdG9wIC4gaW5jbHVkZSAuIGluY2x1ZGUKICAgICAgICAgICAgICAvdXNyL3NoYXJlL3N3aWcvdGVtcC90cnVuay9MaWIvc3dpZ3dhcm5pbmdzLnN3ZzozOTogIC4gdG9wIC4gaW5jbHVkZSAuIGluY2x1ZGUgLiBpbmNsdWRlCgoyMDEwLTAxLTAzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggbWlzc2luZyBmaWxlL2xpbmUgbnVtYmVycyBmb3IgdHlwZW1hcCB3YXJuaW5ncyBhbmQgaW4gb3V0cHV0IGZyb20gdGhlCiAgICAgICAgICAgLWRlYnVnLXRtc2VhcmNoLy1kZWJ1Zy10bXVzZWQgb3B0aW9ucy4KCjIwMTAtMDEtMDM6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCB0eXBlbWFwcyB1c2VkIGRlYnVnZ2luZyBvcHRpb24gKC1kZWJ1Zy10bXVzZWQpLiBXaGVuIHVzZWQgZWFjaCBsaW5lIGRpc3BsYXlzCiAgICAgICAgICAgIHRoZSB0eXBlbWFwIHVzZWQgZm9yIGVhY2ggdHlwZSBmb3Igd2hpY2ggY29kZSBpcyBiZWluZyBnZW5lcmF0ZWQgaW5jbHVkaW5nIHRoZSBmaWxlCiAgICAgICAgICAgIGFuZCBsaW5lIG51bWJlciByZWxhdGVkIHRvIHRoZSB0eXBlLiBUaGlzIGlzIGVmZmVjdGl2ZWx5IGEgY29uZGVuc2VkIGZvcm0gb2YgdGhlCiAgICAgICAgICAgIC1kZWJ1Zy10bXNlYXJjaCBvcHRpb24uIERvY3VtZW50ZWQgaW4gVHlwZW1hcHMuaHRtbC4KCjIwMDktMTItMjM6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBmb3IgJWphdmFleGNlcHRpb24gYW5kIGRpcmVjdG9ycyBzbyB0aGF0IGFsbCB0aGUgYXBwcm9wcmlhdGUgdGhyb3dzIGNsYXVzZXMgCiAgICAgICAgICAgIGFyZSBnZW5lcmF0ZWQuIFByb2JsZW0gcmVwb3J0ZWQgYnkgUGV0ZXIgR3JlZW53b29kLgoKMjAwOS0xMi0yMDogd3NmdWx0b24KICAgICAgICAgICAgQWRkIC1kZWJ1Zy10bXNlYXJjaCBvcHRpb24gZm9yIGRlYnVnZ2luZyB0aGUgdHlwZW1hcCBwYXR0ZXJuIG1hdGNoaW5nIHJ1bGVzLgogICAgICAgICAgICBEb2N1bWVudGVkIGluIFR5cGVtYXBzLmh0bWwuCgoyMDA5LTEyLTEyOiB3c2Z1bHRvbgogICAgICAgICAgICBbT2N0YXZlXSBSZW1vdmUgdGhlIC1hcGkgb3B0aW9uIGFuZCB1c2UgdGhlIG5ldyBPQ1RBVkVfQVBJX1ZFUlNJT05fTlVNQkVSCiAgICAgICAgICAgIG1hY3JvIHByb3ZpZGVkIGluIHRoZSBvY3RhdmUgaGVhZGVycyBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwaSB2ZXJzaW9uIGluc3RlYWQuCgoyMDA5LTEyLTA0OiBvbGx5CgkgICAgW1J1YnldIEltcHJvdmUgc3VwcG9ydCBmb3IgUnVieSAxLjkgdW5kZXIgR0NDLiAgQWRkcmVzc2VzIHBhcnQgb2YKCSAgICBTRiMyODU5NjE0LgoKMjAwOS0xMi0wNDogb2xseQoJICAgIEZpeCBoYW5kbGluZyBvZiBtb2R1bG8gb3BlcmF0b3IgKCUpIGluIGNvbnN0YW50IGV4cHJlc3Npb25zCgkgICAgKFNGIzI4MTg1NjIpLgoKMjAwOS0xMi0wNDogb2xseQoJICAgIFtQSFBdICJlbXB0eSIgaXMgYSByZXNlcnZlZCB3b3JkIGluIFBIUCwgc28gcmVuYW1lIGVtcHR5KCkgbWV0aG9kCgkgICAgb24gU1RMIGNsYXNzZXMgdG8gImlzX2VtcHR5KCkiIChwcmV2aW91c2x5IHRoaXMgd2FzIGF1dG9tYXRpY2FsbHkKCSAgICByZW5hbWVkIHRvICJjX2VtcHR5KCkiKS4KCSAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMDktMTItMDM6IG9sbHkKCSAgICBbUEhQXSBBZGQgdHlwZW1hcHMgZm9yIGxvbmcgbG9uZyBhbmQgdW5zaWduZWQgbG9uZyBsb25nLCBhbmQgZm9yCgkgICAgcG9pbnRlciB0byBtZXRob2QuCgoyMDA5LTEyLTAyOiBvbGx5CgkgICAgW1BIUF0gRml4IHdhcm5pbmcgYW5kIHJlbmFtZSBvZiByZXNlcnZlZCBjbGFzcyBuYW1lIHRvIGJlIGNhc2UKCSAgICBpbnNlbnNpdGl2ZS4KCjIwMDktMTItMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIFJldmVydCBzdXBwb3J0IGZvciAlZXh0ZW5kIGFuZCBtZW1iZXJpbiB0eXBlbWFwcyBhZGRlZCBpbiBzd2lnLTEuMy4zOS4gVGhlCgkgICAgbWVtYmVyaW4gdHlwZW1hcHMgYXJlIGlnbm9yZWQgYWdhaW4gZm9yIG1lbWJlciB2YXJpYWJsZXMgd2l0aGluIGEgJWV4dGVuZCBibG9jay4KICAgICAgICAgICAgRG9jdW1lbnRhdGlvbiBpbmNvbnNpc3RlbmN5IHJlcG9ydGVkIGJ5IFRvcnN0ZW4gTGFuZHNjaG9mZi4KCjIwMDktMTEtMjk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gRml4IGdlbmVyYXRlZCBxdW90aW5nIHdoZW4gdXNpbmcgJWphdmFjb25zdCgxKS8lY3Njb25zdCgxKSBmb3IgCiAgICAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIG1lbWJlciB2YXJpYWJsZXMuCgogICAgICAgICAgICAgICVqYXZhY29uc3QoMSkgQTsKICAgICAgICAgICAgICAlY3Njb25zdCgxKSBBOwogICAgICAgICAgICAgIHN0cnVjdCBYIHsKICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIEEgPSAnQSc7IAogICAgICAgICAgICAgIH07CgoyMDA5LTExLTI2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEZpeCAlamF2YWNvbnN0KDEpLyVjc2NvbnN0KDEpIGZvciBzdGF0aWMgY29uc3QgbWVtYmVyIHZhcmlhYmxlcyB0bwogICAgICAgICAgICB1c2UgdGhlIGFjdHVhbCBjb25zdGFudCB2YWx1ZSBpZiBpdCBpcyBzcGVjaWZpZWQsIHJhdGhlciB0aGFuIHRoZSBDKysgY29kZSB0bwogICAgICAgICAgICBhY2Nlc3MgdGhlIG1lbWJlci4KCiAgICAgICAgICAgICAgJWphdmFjb25zdCgxKSBFTjsKICAgICAgICAgICAgICAlY3Njb25zdCgxKSBFTjsKICAgICAgICAgICAgICBzdHJ1Y3QgWCB7CiAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50IEVOID0gMjsKICAgICAgICAgICAgICB9OwoKMjAwOS0xMS0yMzogd3NmdWx0b24KICAgICAgICAgICAgQysrIG5lc3RlZCB0eXBlZGVmIGNsYXNzZXMgY2FuIG5vdyBiZSBoYW5kbGVkIHRvbywgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgc3RydWN0IE91dGVyIHsKICAgICAgICAgICAgICAgIHR5cGVkZWYgRm9vIHsgfSBGb29UeXBlZGVmMSwgRm9vVHlwZWRlZjI7CiAgICAgICAgICAgICAgfTsKCjIwMDktMTEtMTg6IHdzZnVsdG9uCiAgICAgICAgICAgIFRoZSB3cmFwcGVycyBmb3IgQyBuZXN0ZWQgc3RydWN0cyBhcmUgbm93IGdlbmVyYXRlZCBpbiB0aGUgc2FtZSBvcmRlciBhcyBkZWNsYXJlZCAKICAgICAgICAgICAgaW4gdGhlIHBhcnNlZCBjb2RlLgoKMjAwOS0xMS0xODogd3NmdWx0b24KICAgICAgICAgICAgRml4ICM0OTE0NzYgLSBtdWx0aXBsZSBkZWNsYXJhdGlvbnMgb2YgbmVzdGVkIHN0cnVjdHMsIGZvciBleGFtcGxlOgogICAgICAgICAgICAgIHN0cnVjdCBPdXRlciB7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgewogICAgICAgICAgICAgICAgICBpbnQgdmFsOwogICAgICAgICAgICAgICAgfSBpbm5lcjEsIGlubmVyMiwgKmlubmVyMywgaW5uZXI0WzFdOwogICAgICAgICAgICAgIH0gb3V0ZXI7CgoyMDA5LTExLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggcGFyc2luZyBvZiBlbnVtIGRlY2xhcmF0aW9uIGFuZCBpbml0aWFsaXphdGlvbiwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIGVudW0gQUJDIHsKICAgICAgICAgICAgICAgIGEsCiAgICAgICAgICAgICAgICBiLAogICAgICAgICAgICAgICAgYwogICAgICAgICAgICAgIH0gQSA9IGEsICpwQyA9ICZDLCBhcnJheVszXSA9IHthLCBiLCBjfTsKCjIwMDktMTEtMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBwYXJzaW5nIG9mIHN0cnVjdCBkZWNsYXJhdGlvbiBhbmQgaW5pdGlhbGl6YXRpb24sIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBzdHJ1Y3QgUyB7CiAgICAgICAgICAgICAgICAgaW50IHg7CiAgICAgICAgICAgICAgfSBpbnN0YW5jZSA9IHsgMTAgfTsKCjIwMDktMTEtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTk2MDk3NyAtIFN5bnRheCBlcnJvciBwYXJzaW5nIGRlcml2ZWQgbmVzdGVkIGNsYXNzIGRlY2xhcmF0aW9uIGFuZCBtZW1iZXIKICAgICAgICAgICAgdmFyaWFibGUgaW5zdGFuY2UuCgoyMDA5LTExLTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzIzMTA0ODMgLSBmdW5jdGlvbiBwb2ludGVyIHR5cGVkZWYgd2l0aGluIGV4dGVybiAiQyIgYmxvY2suCgoyMDA5LTExLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggdXNhZ2Ugb2YgbmVzdGVkIHRlbXBsYXRlIGNsYXNzZXMgd2l0aGluIHRlbXBsYXRlZCBjbGFzc2VzIHNvIHRoYXQgY29tcGlsYWJsZSBjb2RlIAogICAgICAgICAgICBpcyBnZW5lcmF0ZWQuCgoyMDA5LTExLTEzOiBvbGx5CgkgICAgW3BocF0gRml4IHBsYWNlIHdoZXJlIGNsYXNzIHByZWZpeCAoYXMgc3BlY2lmaWVkIHdpdGggLXByZWZpeCkKCSAgICB3YXNuJ3QgYmVpbmcgdXNlZC4gIFBhdGNoIGZyb20gZ3ZlcmJydWdnZW4gaW4gU0YjMjg5MjY0Ny4KCjIwMDktMTEtMTI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB1c2FnZSBvZiBuZXN0ZWQgdGVtcGxhdGUgY2xhc3NlcyBzbyB0aGF0IGNvbXBpbGFibGUgY29kZSBpcyBnZW5lcmF0ZWQgLSB0aGUgbmVzdGVkCiAgICAgICAgICAgIHRlbXBsYXRlIGNsYXNzIGlzIG5vdyB0cmVhdGVkIGxpa2UgYSBub3JtYWwgbmVzdGVkIGNsYXNzZXMsIHRoYXQgaXMsIGFzIGFuIG9wYXF1ZSB0eXBlCiAgICAgICAgICAgIHVubGVzcyB0aGUgbmVzdGVkd29ya2Fyb3VuZCBmZWF0dXJlIGlzIHVzZWQuCgoyMDA5LTExLTEyOiB3c2Z1bHRvbgogICAgICAgICAgICBSZXBsYWNlIFNXSUdXQVJOX1BBUlNFX05FU1RFRF9DTEFTUyB3aXRoIFNXSUdXQVJOX1BBUlNFX05BTUVEX05FU1RFRF9DTEFTUyBhbmQKICAgICAgICAgICAgU1dJR1dBUk5fUEFSU0VfVU5OQU1FRF9ORVNURURfQ0xBU1MgZm9yIG5hbWVkIGFuZCB1bm5hbWVkIG5lc3RlZCBjbGFzc2VzIHJlc3BlY3RpdmVseS4KCiAgICAgICAgICAgIE5hbWVkIG5lc3RlZCBjbGFzcyBpZ25vcmVkIHdhcm5pbmdzIGNhbiBub3cgYmUgc3VwcHJlc3NlZCBieSBuYW1lIHVzaW5nICV3YXJuZmlsdGVyLCBlZzoKCiAgICAgICAgICAgICAgJXdhcm5maWx0ZXIoU1dJR1dBUk5fUEFSU0VfTkFNRURfTkVTVEVEX0NMQVNTKSBPdXRlcjo6SW5uZXI7CgogICAgICAgICAgICBidXQgY2xlYXJseSB1bm5hbWVkIG5lc3RlZCBjbGFzc2VzIGNhbm5vdCBhbmQgdGhlIGdsb2JhbCBzdXBwcmVzc2lvbiBpcyBzdGlsbCByZXF1aXJlZCwgZWc6CgogICAgICAgICAgICAgICNwcmFnbWEgU1dJRyBub3dhcm49U1dJR1dBUk5fUEFSU0VfVU5OQU1FRF9ORVNURURfQ0xBU1MKCjIwMDktMTEtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZGVkIHRoZSBuZXN0ZWR3b3JrYXJvdW5kIGZlYXR1cmUgYXMgYSB3YXkgdG8gdXNlIHRoZSBmdWxsIGZ1bmN0aW9uYWxpdHkgb2YgYSBuZXN0ZWQgY2xhc3MgCiAgICAgICAgICAgIChDKysgbW9kZSBvbmx5KS4gSXQgcmVtb3ZlcyB0aGUgbmVzdGVkIGNsYXNzIGZyb20gU1dJRydzIHR5cGUgaW5mb3JtYXRpb24gc28gaXQgaXMgYXMgaWYgU1dJRwogICAgICAgICAgICBoYWQgbmV2ZXIgcGFyc2VkIHRoZSBuZXN0ZWQgY2xhc3MuIFRoZSBkb2N1bWVudGVkIG5lc3RlZCBjbGFzcyB3b3JrYXJvdW5kcyB1c2luZyBhIGdsb2JhbAogICAgICAgICAgICBmYWtlIGNsYXNzIHN0b3BwZWQgd29ya2luZyB3aGVuIFNXSUcgdHJlYXRlZCB0aGUgbmVzdGVkIGNsYXNzIGFzIGFuIG9wYXF1ZSBwb2ludGVyLCBhbmQKICAgICAgICAgICAgdGhpcyBmZWF0dXJlIHJldmVydHMgdGhpcyBiZWhhdmlvdXIuIFRoZSBkb2N1bWVudGF0aW9uIGhhcyBiZWVuIHVwZGF0ZWQgd2l0aCBkZXRhaWxzIG9mIGhvdwogICAgICAgICAgICB0byB1c2UgYW5kIGltcGxlbWVudCBpdCwgc2VlIHRoZSAiTmVzdGVkIGNsYXNzZXMiIHNlY3Rpb24gaW4gU1dJR1BsdXMuaHRtbC4KCjIwMDktMTEtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIFRoZXJlIHdlcmUgYSBudW1iZXIgb2YgQysrIGNhc2VzIHdoZXJlIG5lc3RlZCBjbGFzc2VzL3N0cnVjdHMvdW5pb25zIHdlcmUgYmVpbmcgaGFuZGxlZAogICAgICAgICAgICBhcyBpZiBDIGNvZGUgd2FzIGJlaW5nIHBhcnNlZCB3aGljaCB3b3VsZCBvZnRlbnRpbWVzIGxlYWQgdG8gdW5jb21waWxhYmxlIGNvZGUgYXMgYW4KICAgICAgICAgICAgYXR0ZW1wdCB3YXMgbWFkZSB0byB3cmFwIHRoZSBuZXN0ZWQgc3RydWN0cyBsaWtlIGl0IGlzIGRvY3VtZW50ZWQgZm9yIEMgY29kZS4gTm93IGFsbAogICAgICAgICAgICBuZXN0ZWQgc3RydWN0cy9jbGFzc2VzL3VuaW9ucyBhcmUgaWdub3JlZCBpbiBDKysgbW9kZSwgYXMgd2FzIGFsd2F5cyBkb2N1bWVudGVkLiBIb3dldmVyLAogICAgICAgICAgICB0aGVyZSBpcyBhbiBpbXByb3ZlbWVudCBhcyB1c2FnZSBvZiBuZXN0ZWQgc3RydWN0cy9jbGFzc2VzL3VuaW9ucyBpcyBub3cgYWx3YXlzIHRyZWF0ZWQKICAgICAgICAgICAgYXMgYW4gb3BhcXVlIHR5cGUgYnkgZGVmYXVsdCwgcmVzdWx0aW5nIGluIGdlbmVyYXRlZCBjb2RlIHRoYXQgc2hvdWxkIGFsd2F5cyBjb21waWxlLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDA5LTExLTA5OiBkcmpvZQoJICAgIEZpeCBSIGZvciAtZmNvbXBhY3QgYW5kIGFkZCBzdGRfbWFwLmkKCjIwMDktMTEtMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBpbmNvbnNpc3RlbmN5IGZvciBuZXN0ZWQgc3RydWN0cy91bmlvbnMvY2xhc3Nlcy4gVW5jb21waWxhYmxlIGNvZGUgd2FzIGJlaW5nCiAgICAgICAgICAgIGdlbmVyYXRlZCB3aGVuIGlubmVyIHN0cnVjdCBhbmQgdW5pb24gZGVjbGFyYXRpb25zIHdlcmUgdXNlZCBhcyB0eXBlcyB3aXRoaW4gdGhlCiAgICAgICAgICAgIGlubmVyIHN0cnVjdC4gVGhlIGlubmVyIHN0cnVjdC91bmlvbiBpcyBub3cgdHJlYXRlZCBhcyBhIGZvcndhcmQgZGVjbGFyYXRpb24gbWFraW5nIHRoZQogICAgICAgICAgICBiZWhhdmlvdXIgdGhlIHNhbWUgYXMgYW4gaW5uZXIgY2xhc3MuIChDKysgY29kZSksIGVnOgoKICAgICAgICAgICAgICBzdHJ1Y3QgT3V0ZXIgewogICAgICAgICAgICAgICAgc3RydWN0IElubmVyU3RydWN0IHsgaW50IHg7IH07CiAgICAgICAgICAgICAgICBJbm5lclN0cnVjdCogZ2V0SW5uZXJTdHJ1Y3QoKTsKICAgICAgICAgICAgICB9OwoKMjAwOS0xMS0wODogd3NmdWx0b24KCSAgICBJZ25vcmVkIG5lc3RlZCBjbGFzcy9zdHJ1Y3Qgd2FybmluZ3Mgbm93IGRpc3BsYXkgdGhlIG5hbWUgb2YgdGhlIGlnbm9yZWQgY2xhc3Mvc3RydWN0LgoKMjAwOS0xMS0wNzogd3NmdWx0b24KCSAgICBCdWcgIzE1MTQ2ODEgLSBGaXggbmVzdGVkIHRlbXBsYXRlIGNsYXNzZXMgd2l0aGluIGEgbmFtZXNwYWNlIGdlbmVyYXRlZCB1bmNvbXBpbGFibGUKICAgICAgICAgICAgY29kZSBhbmQgaW50cm9kdWNlZCBzdHJhbmdlIHNpZGUgZWZmZWN0cyB0byBvdGhlciB3cmFwcGVyIGNvZGUgZXNwZWNpYWxseSBjb2RlCiAgICAgICAgICAgIGFmdGVyIHRoZSBuZXN0ZWQgdGVtcGxhdGUgY2xhc3MuIE5vdGUgdGhhdCBuZXN0ZWQgdGVtcGxhdGUgY2xhc3NlcyBhcmUgc3RpbGwgaWdub3JlZC4KCjIwMDktMTEtMDc6IHdzZnVsdG9uCgkgICAgQWRkIG5ldyBkZWJ1ZyBvcHRpb25zOgogICAgICAgICAgICAgIC1kZWJ1Zy1zeW10YWJzICAgIC0gRGlzcGxheSBzeW1ib2wgdGFibGVzIGluZm9ybWF0aW9uCiAgICAgICAgICAgICAgLWRlYnVnLXN5bWJvbHMgICAgLSBEaXNwbGF5IHRhcmdldCBsYW5ndWFnZSBzeW1ib2xzIGluIHRoZSBzeW1ib2wgdGFibGVzCiAgICAgICAgICAgICAgLWRlYnVnLWNzeW1ib2xzICAgLSBEaXNwbGF5IEMgc3ltYm9scyBpbiB0aGUgc3ltYm9sIHRhYmxlcwoKMjAwOS0xMS0wMzogd3NmdWx0b24KCSAgICBGaXggc29tZSB1c2FnZSBvZiB1bmFyeSBzY29wZSBvcGVyYXRvciAoOjopIGRlbm90aW5nIGdsb2JhbCBzY29wZSwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIG5hbWVzcGFjZSBBQSB7IC8qIC4uLiAqLyB9CiAgICAgICAgICAgICAgdXNpbmcgbmFtZXNwYWNlIDo6QUE7CgogICAgICAgICAgICBhbmQgYnVnICMxODE2ODAyIC0gU3dpZ1ZhbHVlV3JhcHBlciBzaG91bGQgYmUgdXNlZDoKCiAgICAgICAgICAgICAgc3RydWN0IENDIHsKICAgICAgICAgICAgICAgIENDKGludCk7IC8vIG5vIGRlZmF1bHQgY29uc3RydWN0b3IKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIDo6Q0MgeCgpOwoKICAgICAgICAgICAgYW5kIGluIHRlbXBsYXRlIHBhcmFtZXRlciBzcGVjaWFsaXphdGlvbnM6CgogICAgICAgICAgICAgIHN0cnVjdCBTIHt9OwogICAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgWCB7IHZvaWQgYSgpIHt9IH07CiAgICAgICAgICAgICAgdGVtcGxhdGUgPD4gc3RydWN0IFg8Uz4geyB2b2lkIGIoKSB7fSB9OwogICAgICAgICAgICAgICV0ZW1wbGF0ZShNeVRDb25jcmV0ZSkgWDwgOjpTID47CgogICAgICAgICAgICBwbHVzIHByb2JhYmx5IHNvbWUgb3RoZXIgY29ybmVyIGNhc2UgdXNhZ2Ugb2YgOjouCgoyMDA5LTExLTAyOiBvbGx5CgkgICAgW1B5dGhvbl0gRml4IHBvdGVudGlhbCBtZW1vcnkgbGVhayBpbiBpbml0aWFsaXNhdGlvbiBjb2RlIGZvciB0aGUKCSAgICBnZW5lcmF0ZWQgbW9kdWxlLgoKMjAwOS0xMC0yMzogd3NmdWx0b24KCSAgICBGaXggc2VnIGZhdWx0IHdoZW4gdXNpbmcgYSBuYW1lZCBuZXN0ZWQgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiB1c2luZyAldGVtcGxhdGUobmFtZSkgCiAgICAgICAgICAgIHdpdGhpbiBhIGNsYXNzLiBBIHdhcm5pbmcgdGhhdCB0aGVzZSBhcmUgbm90IHN1cHBvcnRlZCBpcyBub3cgaXNzdWVkIHBsdXMgcHJvY2Vzc2luZyAKICAgICAgICAgICAgY29udGludWVzIGFzIGlmIG5vIG5hbWUgd2FzIGdpdmVuLgoKMjAwOS0xMC0yMDogd3NmdWx0b24KCSAgICBbUHl0aG9uXSBGaXggc3RkOjp2ZWN0b3I8Y29uc3QgVCo+LiBUaGlzIHdvdWxkIHByZXZpb3VzbHkgY29tcGlsZSwgYnV0IG5vdCBydW4gY29ycmVjdGx5LgoKMjAwOS0xMC0yMDogd3NmdWx0b24KCSAgICBGaXhlZCBwcmV2aW91c2x5IGZhaXJseSBwb29yIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gYW5kIGV4cGxpY2l0IAogICAgICAgICAgICBzcGVjaWFsaXphdGlvbiBzdXBwb3J0LiBOdW1lcm91cyBidWdzIGluIHRoaXMgYXJlYSBoYXZlIGJlZW4gZml4ZWQgaW5jbHVkaW5nOgoKICAgICAgICAgICAgLSBUZW1wbGF0ZSBhcmd1bWVudCBkZWR1Y3Rpb24gaW1wbGVtZW50ZWQgZm9yIHRlbXBsYXRlIHR5cGUgYXJndW1lbnRzLCBlZyB0aGlzIG5vdwogICAgICAgICAgICAgIHdvcmtzOgogICAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgWCAgICAgIHt9OwogICAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgWDxUICo+IHt9OwogICAgICAgICAgICAgICAgJXRlbXBsYXRlKFgxKSBYPGNvbnN0IGludCAqPjsgLy8gQ2hvb3NlcyBUICogc3BlY2lhbGl6YXRpb24KCiAgICAgICAgICAgICAgYW5kIG1vcmUgY29tcGxleCBjYXNlcyB3aXRoIG11bHRpcGxlIHBhcmFtZXRlcnMgYW5kIGEgbWl4IG9mIHRlbXBsYXRlIGFyZ3VtZW50CiAgICAgICAgICAgICAgZGVkdWN0aW9uIGFuZCBleHBsaWNpdGx5IHNwZWNpYWxpc2VkIHBhcmFtZXRlcnMsIGVnOgogICAgICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4gc3RydWN0IFR3b1Bhcm0gICAgICAgICAgICAgICB7IHZvaWQgYSgpIHt9IH07CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDE+ICAgICAgICAgICAgICBzdHJ1Y3QgVHdvUGFybTxUMSAqLCBpbnQgKj4gIHsgdm9pZCBlKCkge30gfTsKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShFKSBUd29QYXJtPGludCAqKiwgaW50ICo+OwoKICAgICAgICAgICAgTm90ZSB0aGF0IHRoZSBwcmltYXJ5IHRlbXBsYXRlIG11c3Qgbm93IGJlIGluIHNjb3BlLCBsaWtlIGluIEMrKywgd2hlbgogICAgICAgICAgICBhbiBleHBsaWNpdCBvciBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGlzIGluc3RhbnRpYXRlZCB3aXRoICV0ZW1wbGF0ZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAwOS0wOS0xNDogd3NmdWx0b24KCSAgICBbQyNdIEFkZCAlY3NhdHRyaWJ1dGVzIGZvciBhZGRpbmcgQyMgYXR0cmlidXRlcyB0byBlbnVtIHZhbHVlcywgc2VlIGRvY3MgZm9yIGV4YW1wbGUuCgoyMDA5LTA5LTExOiB3c2Z1bHRvbgoJICAgIEZpeCBtZW1tb3ZlIHJlZ3Jlc3Npb24gaW4gY2RhdGEuaSBhcyByZXBvcnRlZCBieSBBZHJpYWFuIFJlbnRpbmcuCgoyMDA5LTA5LTA3OiB3c2Z1bHRvbgoJICAgIEZpeCBjb25zdGFudCBleHByZXNzaW9ucyBjb250YWluaW5nIDw9IG9yID49LgoKMjAwOS0wOS0wMjogd3NmdWx0b24KCSAgICBUaGUgZm9sbG93aW5nIG9wZXJhdG9ycyBpbiBjb25zdGFudCBleHByZXNzaW9ucyBub3cgcmVzdWx0IGluIHR5cGUgYm9vbCBmb3IgQysrIAogICAgICAgICAgICB3cmFwcGVycyBhbmQgcmVtYWluIGFzIHR5cGUgaW50IGZvciBDIHdyYXBwZXJzLCBhcyBwZXIgZWFjaCBzdGFuZGFyZDogCgogICAgICAgICAgICAgICYmIHx8ID09ICE9IDwgPiA8PSA+PSAoQWN0dWFsbHkgdGhlIGxhc3QgNCBhcmUgc3RpbGwgYnJva2VuKS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICNkZWZpbmUgQSAxMAogICAgICAgICAgICAgICNkZWZpbmUgQiAxMAogICAgICAgICAgICAgICNkZWZpbmUgQV9FUV9CICBBID09IEIgLy8gbm93IHdyYXBwZWQgYXMgdHlwZSBib29sIGZvciBDKysKICAgICAgICAgICAgICAjZGVmaW5lIEFfQU5EX0IgQSAmJiBCIC8vIG5vdyB3cmFwcGVkIGFzIHR5cGUgYm9vbCBmb3IgQysrCgoyMDA5LTA5LTAyOiB3c2Z1bHRvbgoJICAgIEZpeCAjMjg0NTc0Ni4gdHJ1ZSBhbmQgZmFsc2UgYXJlIG5vdyByZWNvZ25pc2VkIGtleXdvcmRzIChvbmx5IHdoZW4gd3JhcHBpbmcgQysrKS4KICAgICAgICAgICAgQ29uc3RhbnRzIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyBhcmUgbm93IHdyYXBwZWQgKGFzIHR5cGUgYm9vbCk6CiAgICAgICAgICAgICAgI2RlZmluZSBGT08gdHJ1ZQogICAgICAgICAgICAgICNkZWZpbmUgQkFSIEZPTyAmJiBmYWxzZQoKVmVyc2lvbiAxLjMuNDAgKDE4IEF1Z3VzdCAyMDA5KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDA5LTA4LTE3OiBvbGx5CgkgICAgW1BlcmxdIEFkZCAiI3VuZGVmIGRvX2V4ZWMiIHRvIG91ciBjbGVhbiB1cCBvZiBQZXJsIGdsb2JhbAoJICAgIG5hbWVzcGFjZSBwb2xsdXRpb24uCgoyMDA5LTA4LTE3OiBvbGx5CgkgICAgW1BIUF0gRml4IHRvIHdyYXAgYSByZXNvdXJjZSByZXR1cm5lZCBieSBfX2dldCgpIGluIGEgUEhQIG9iamVjdCAoU0YjMjU0OTIxNykuCgoyMDA5LTA4LTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzI3OTc0ODUgQWZ0ZXIgZG9pbmcgYSAnbWFrZSBjbGVhbicsIGluc3RhbGwgZmFpbHMgaWYgeW9kbDJtYW4gb3IgeW9kbDJodG1sIAogICAgICAgICAgICBpcyBub3QgYXZhaWxhYmxlLgoKMjAwOS0wOC0xNjogd3NmdWx0b24KICAgICAgICAgICAgW09jdGF2ZV0gQ2F1Z2h0IGV4Y2VwdGlvbnMgZGlzcGxheSB0aGUgdHlwZSBvZiB0aGUgQysrIGV4Y2VwdGlvbiBpbnN0ZWFkIG9mIHRoZQogICAgICAgICAgICBnZW5lcmljICJjKystc2lkZSB0aHJldyBhbiBleGNlcHRpb24iIG1lc3NhZ2UuCgoyMDA5LTA4LTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gV2hlbiAlY2F0Y2hlcyBpcyB1c2VkLCBmaXggc28gdGhhdCBhbnkgY2xhc3NlcyBzcGVjaWZpZWQgaW4gdGhlICJ0aHJvd3MiCiAgICAgICAgICAgIGF0dHJpYnV0ZSBvZiB0aGUgInRocm93cyIgdHlwZW1hcCBhcmUgZ2VuZXJhdGVkIGludG8gdGhlIEphdmEgbWV0aG9kJ3MgdGhyb3dzIGNsYXVzZS4KCjIwMDktMDgtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IGV4Y2VwdGlvbiBoYW5kbGluZyB3aGVuICVjYXRjaGVzIGlzIHVzZWQsIHJlcG9ydGVkIGJ5IEp1YW4gTWFudWVsIEFsdmFyZXouCgoyMDA5LTA4LTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJXRlbXBsYXRlIHNlZyBmYXVsdCBvbiBzb21lIGNhc2VzIG9mIG92ZXJsb2FkaW5nIHRoZSB0ZW1wbGF0ZWQgbWV0aG9kLgogICAgICAgICAgICBCdWcgcmVwb3J0ZWQgYnkgSmFuIEt1cGVjLgoKMjAwOS0wOC0xNTogd3NmdWx0b24KCSAgICBbUnVieV0gQWRkIG51bWVyb3VzIG1pc3Npbmcgd3JhcHBlZCBtZXRob2RzIGZvciBzdGQ6OnZlY3Rvcjxib29sPiBzcGVjaWFsaXphdGlvbgogICAgICAgICAgICBhcyByZXBvcnRlZCBieSBZb3Vzc2VmIEpvbmVzLgoKMjAwOS0wOC0xNDogd3NmdWx0b24KCSAgICBbUGVybF0gQWRkIFNXSUdfQ29udmVydFB0ckFuZE93bigpIG1ldGhvZCBpbnRvIHRoZSBydW50aW1lIGZvciBzbWFydCBwb2ludGVyIAogICAgICAgICAgICBtZW1vcnkgb3duZXJzaGlwIGNvbnRyb2wuIHNoYXJlZF9wdHIgc3VwcG9ydCBzdGlsbCB0byBiZSBhZGRlZC4gUGF0Y2ggZnJvbSAKICAgICAgICAgICAgRGF2aWQgRmxldGNoZXIuCgoyMDA5LTA4LTE0OiBvbGx5CgkgICAgW1BIUF0gUEhQNSBub3cgd3JhcHMgc3RhdGljIG1lbWJlciB2YXJpYWJsZXMgYXMgZG9jdW1lbnRlZC4KCjIwMDktMDgtMTQ6IG9sbHkKCSAgICBbUEhQXSBVcGRhdGUgdGhlIFBIUCAiY2xhc3MiIGV4YW1wbGUgdG8gd29yayB3aXRoIFBIUDUgYW5kIHVzZQoJICAgIG1vZGVybiB3cmFwcGluZyBmZWF0dXJlcy4KCjIwMDktMDgtMTM6IHdzZnVsdG9uCgkgICAgW1BIUF0gc3RkOjp2ZWN0b3Igd3JhcHBlcnMgb3ZlcmhhdWwuIFRoZXkgbm8gbG9uZ2VyIHJlcXVpcmUgdGhlIAogICAgICAgICAgICBzcGVjaWFsaXplX3N0ZF92ZWN0b3IoKSBtYWNyby4gQWRkZWQgd3JhcHBlcnMgZm9yIGNhcGFjaXR5KCkgYW5kIHJlc2VydmUoKS4KCjIwMDktMDgtMTM6IHdzZnVsdG9uCgkgICAgW1BIUF0gQWRkIGNvbnN0IHJlZmVyZW5jZSB0eXBlbWFwcy4gY29uc3QgcmVmZXJlbmNlIHByaW1pdGl2ZSB0eXBlcyBhcmUKICAgICAgICAgICAgbm93IHBhc3NlZCBieSB2YWx1ZSByYXRoZXIgdGhhbiBwb2ludGVyIGxpa2UgdGhlIG90aGVyIHRhcmdldCBsYW5ndWFnZXMuCgkgICAgRml4ZXMgU0YjMjUyNDAyOS4KCjIwMDktMDgtMDg6IHdzZnVsdG9uCgkgICAgW1B5dGhvbl0gTW9yZSB1c2VyIGZyaWVuZGx5IEF0dHJpYnV0ZUVycm9yIGlzIHJhaXNlZCB3aGVuIHRoZXJlIGFyZQogICAgICAgICAgICBubyBjb25zdHJ1Y3RvcnMgZ2VuZXJhdGVkIGZvciB0aGUgcHJveHkgY2xhc3MgaW4gdGhlIGV2ZW50IHRoYXQgdGhlCiAgICAgICAgICAgIGNsYXNzIGlzIGFic3RyYWN0IC0gdGhlIGVycm9yIG1lc3NhZ2UgaXMgbm93IAogICAgICAgICAgICAiTm8gY29uc3RydWN0b3IgZGVmaW5lZCAtIGNsYXNzIGlzIGFic3RyYWN0IiB3aGVyZWFzIGlmIHRoZXJlIGFyZSBubwogICAgICAgICAgICBwdWJsaWMgY29uc3RydWN0b3JzIGZvciBhbnkgb3RoZXIgcmVhc29uIGFuZCB0aGUgY2xhc3MgaXMgbm90IGFic3RyYWN0LAogICAgICAgICAgICB0aGUgbWVzc2FnZSByZW1haW5zCiAgICAgICAgICAgICJObyBjb25zdHJ1Y3RvciBkZWZpbmVkIi4KICAgICAgICAgICAgW3RjbF0gU2ltaWxhcmx5IGZvciB0Y2wgd2hlbiB1c2luZyAtaXRjbC4KCjIwMDktMDgtMDQ6IG9sbHkKCSAgICBbUEhQXSBGaXggZ2VuZXJhdGVkIGNvZGUgdG8gd29yayB3aXRoIFBIUCA1LjMuCgoyMDA5LTA4LTA0OiB2bWlrbG9zCiAgICAgICAgICAgIFtQSFBdIFZhcmlvdXMgbWF0aGVtYXRpY2FsIGZ1bmN0aW9ucyAod2hpY2ggd291bGQgY29uZmxpY3QKICAgICAgICAgICAgd2l0aCB0aGUgYnVpbHQtaW4gUEhQIG9uZXMpIGFyZSBub3cgYXV0b21hdGljYWxseSBoYW5kbGVkIGJ5CiAgICAgICAgICAgIGFkZGluZyBhICdjXycgcHJlZml4LgoKMjAwOS0wOC0wMzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBUaGUgc3RkOjp2ZWN0b3I8VD4gaW1wbGVtZW50YXRpb24gaXMgaW1wcm92ZWQgYW5kIG5vdyB1c2VzICR0eXBlbWFwIHN1Y2gKICAgICAgICAgICAgdGhhdCB0aGUgcHJveHkgY2xhc3MgZm9yIFQgbm8gbG9uZ2VyIGhhcyB0byBiZSBzcGVjaWZpZWQgaW4gc29tZSBtYWNyb3MKICAgICAgICAgICAgZm9yIGNvcnJlY3QgQyMgY29tcGlsYXRpb247IHRoZSBmb2xsb3dpbmcgbWFjcm9zIGFyZSBkZXByZWNhdGVkLCB3aGVyZQogICAgICAgICAgICBDU1RZUEUgd2FzIHRoZSBDIyB0eXBlIGZvciB0aGUgQysrIGNsYXNzIENUWVBFOgoKICAgICAgICAgICAgU1dJR19TVERfVkVDVE9SX1NQRUNJQUxJWkVfTUlOSU1VTShDU1RZUEUsIENUWVBFKQogICAgICAgICAgICAgIHVzYWdlIHNob3VsZCBiZSByZW1vdmVkIGFsdG9nZXRoZXIKCiAgICAgICAgICAgIFNXSUdfU1REX1ZFQ1RPUl9TUEVDSUFMSVpFKENTVFlQRSwgQ1RZUEUpCiAgICAgICAgICAgICAgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGg6CiAgICAgICAgICAgIFNXSUdfU1REX1ZFQ1RPUl9FTkhBTkNFRChDVFlQRSkKCiAgICAgICAgICAgIFNvbWUgbW9yZSBkZXRhaWxzIGluIGNzaGFycC9zdGRfdmVjdG9yLmkKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAwOS0wNy0zMTogb2xseQoJICAgIFtQeXRob25dIEZpeCBpbmRlbnRhdGlvbiBzbyB0aGF0IHdlIGdpdmUgYSB1c2VmdWwgZXJyb3IgaWYgdGhlCgkgICAgbW9kdWxlIGNhbid0IGJlIGxvYWRlZC4gIFBhdGNoIGZyb20gR2FldGFuIExlaG1hbm4gaW4gU0YjMjgyOTg1My4KCjIwMDktMDctMjk6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCAkdHlwZW1hcChtZXRob2QsIHR5cGVsaXN0KSBzcGVjaWFsIHZhcmlhYmxlIG1hY3JvLiBUaGlzIGFsbG93cwogICAgICAgICAgICB0aGUgY29udGVudHMgb2YgYSB0eXBlbWFwIHRvIGJlIGluc2VydGVkIHdpdGhpbiBhbm90aGVyIHR5cGVtYXAuCiAgICAgICAgICAgIEZ1bGx5IGRvY3VtZW50ZWQgaW4gVHlwZW1hcHMuaHRtbC4KCjIwMDktMDctMjk6IHZtaWtsb3MKICAgICAgICAgICAgW1BIUF0gU3RhdGljIG1lbWJlciB2YXJpYWJsZXMgYXJlIG5vdyBwcmVmaXhlZCB3aXRoIHRoZQogICAgICAgICAgICBjbGFzcyBuYW1lLiBUaGlzIGFsbG93cyBzdGF0aWMgbWVtYmVyIHZhcmlhYmxlcyB3aXRoIHRoZQogICAgICAgICAgICBzYW1lIG5hbWUgaW4gZGlmZmVyZW50IGNsYXNzZXMuCgoyMDA5LTA3LTI5OiBvbGx5CgkgICAgW1B5dGhvbl0gQWRkIG1pc3NpbmcgbG9ja3MgdG8gc3RkOjptYXAgd3JhcHBlcnMuICBQYXRjaCBmcm9tIAoJICAgIFBhdWwgSGFtcHNvbiBpbiBTRiMyODEzODM2LgoKMjAwOS0wNy0yOTogb2xseQoJICAgIFtQSFBdIEZpeCBtZW1vcnkgbGVhayBpbiBQSFAgT1VUUFVUIHR5cGVtYXBzLiAgUmVwb3J0ZWQgYnkgSGl0b3NoaQoJICAgIEFtYW5vIGluIFNGIzI4MjYzMjIuCgoyMDA5LTA3LTI5OiBvbGx5CgkgICAgW1BIUF0gRml4IG1lbW9yeSBsZWFrIGluIFBIUCByZXNvdXJjZSBkZXN0cnVjdG9yIGZvciBjbGFzc2VzCgkgICAgd2l0aG91dCBhIGRlc3RydWN0b3IgYW5kIG5vbi1jbGFzcyB0eXBlcy4gIFBhdGNoIGZyb20gSGl0b3NoaSBBbWFubwoJICAgIGluIFNGIzI4MjUzMDMuCgoyMDA5LTA3LTI4OiBvbGx5CgkgICAgW1BIUF0gVXBkYXRlIHdhcm5pbmdzIGFib3V0IGNsYXNoZXMgYmV0d2VlbiBpZGVudGlmaWVycyBhbmQgUEhQCgkgICAga2V5d29yZHMgYW5kIGF1dG9tYXRpYyByZW5hbWluZyB0byB3b3JrIHdpdGggdGhlIFBIUDUgY2xhc3MKCSAgICB3cmFwcGVycy4gIEZpeGVzIFNGIzE2MTM2NzkuCgoyMDA5LTA3LTI4OiB2bWlrbG9zCiAgICAgICAgICAgIFtQSFBdIElmIGEgbWVtYmVyIGZ1bmN0aW9uIGlzIG5vdCBwdWJsaWMgYnV0IGl0IGhhcyBhIGJhc2UKICAgICAgICAgICAgd2hpY2ggaXMgcHVibGljLCB0aGVuIG5vdyBhIHdhcm5pbmcgaXMgaXNzdWVkIGFuZCB0aGUgbWVtYmVyCiAgICAgICAgICAgIGZ1bmN0aW9uIHdpbGwgYmUgcHVibGljLCBhcyBQSFAgcmVxdWlyZXMgdGhpcy4KCjIwMDktMDctMjE6IHZtaWtsb3MKICAgICAgICAgICAgW1BIUF0gRGlyZWN0b3Igc3VwcG9ydCBhZGRlZC4KCjIwMDktMDctMTU6IG9sbHkKCSAgICBbUGVybF0gRG9uJ3Qgc3BlY2lmeSBQZXJsIHByb3RvdHlwZSAiKCkiIGZvciBhIGNvbnN0cnVjdG9yIHdpdGggYQoJICAgIGRpZmZlcmVudCBuYW1lIHRvIHRoZSBjbGFzcywgYXMgc3VjaCBjb25zdHJ1Y3RvcnMgY2FuIHN0aWxsIHRha2UKCSAgICBwYXJhbWV0ZXJzLgoKMjAwOS0wNy0xMjogeGF2aWVyOTgKCSAgICBbT2N0YXZlXSBBZGQgc3VwcG9ydCBmb3IgT2N0YXZlIDMuMiBBUEkKCjIwMDktMDctMDU6IG9sbHkKCSAgICBbUEhQXSBVcGRhdGUgdGhlIGxpc3Qgb2YgUEhQIGtleXdvcmRzIC0gImNmdW5jdGlvbiIgaXMgbm8gbG9uZ2VyIGEKCSAgICBrZXl3b3JkIGluIFBIUDUgYW5kIFBIUCA1LjMgYWRkZWQgImdvdG8iLCAibmFtZXNwYWNlIiwgIl9fRElSX18iLAoJICAgIGFuZCAiX19OQU1FU1BBQ0VfXyIuCgoyMDA5LTA3LTAzOiBvbGx5CgkgICAgW1RjbF0gVG8gY29tcGxlbWVudCBVU0VfVENMX1NUVUJTLCBhZGQgc3VwcG9ydCBmb3IgVVNFX1RLX1NUVUJTCgkgICAgYW5kIFNXSUdfVENMX1NUVUJTX1ZFUlNJT04uICBEb2N1bWVudCBhbGwgdGhyZWUgaW4gdGhlIFRjbCBjaGFwdGVyCgkgICAgb2YgdGhlIG1hbnVhbC4gIEJhc2VkIG9uIHBhdGNoIGZyb20gU0YjMjgxMDM4MCBieSBDaHJpc3RpYW4KCSAgICBHb2xsd2l0emVyLgoKMjAwOS0wNy0wMjogdm1pa2xvcwogICAgICAgICAgICBbUEhQXSBBZGRlZCBmYWN0b3J5LmkgZm9yIFBIUCwgc2VlIHRoZSBsaV9mYWN0b3J5IHRlc3RjYXNlCiAgICAgICAgICAgIGZvciBtb3JlIGluZm8gb24gaG93IHRvIHVzZSBpdC4KCjIwMDktMDctMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAtV2FsbGt3IG9wdGlvbiBhcyByZXBvcnRlZCBieSBTb2xvbW9uIEdpYmJzLgoKMjAwOS0wNy0wMjogd3NmdWx0b24KICAgICAgICAgICAgRml4IHN5bnRheCBlcnJvciB3aGVuIGEgbmVzdGVkIHN0cnVjdCBjb250YWlucyBhIGNvbW1lbnQgY29udGFpbmluZyBhICogZm9sbG93ZWQgCiAgICAgICAgICAgIGV2ZW50dWFsbHkgYnkgYSAvLiBSZWdyZXNzaW9uIGZyb20gMS4zLjM3LCByZXBvcnRlZCBieSBTb2xvbW9uIEdpYmJzLgoKMjAwOS0wNy0wMTogdm1pa2xvcwogICAgICAgICAgICBbUEhQXSBVbmtub3duIHByb3BlcnRpZXMgYXJlIG5vIGxvbmdlciBpZ25vcmVkIGluIHByb3h5CiAgICAgICAgICAgIGNsYXNzZXMuCgoyMDA5LTA3LTAxOiB2bWlrbG9zCiAgICAgICAgICAgIFtQSFBdIEZpeGVkICVuZXdvYmplY3QgYmVoYXZpb3VyLCBwcmV2aW91c2x5IGFueSBtZXRob2QKICAgICAgICAgICAgbWFya2VkIHdpdGggJW5ld29iamVjdCB3YXMgaGFuZGxlZCBhcyBhIGNvbnN0cnVjdG9yLgoKMjAwOS0wNi0zMDogb2xseQoJICAgIFtSdWJ5XSBVbmRlZmluZSBjbG9zZSBhbmQgY29ubmVjdCBtYWNyb3MgZGVmaW5lZCBieSBSdWJ5IEFQSQoJICAgIGhlYWRlcnMgYXMgd2UgZG9uJ3QgbmVlZCB0aGVtIGFuZCB0aGV5IGNhbiBjbGFzaCB3aXRoIEMrKyBtZXRob2RzCgkgICAgYmVpbmcgd3JhcHBlZC4gIFBhdGNoIGZyb20gVml0IE9uZHJ1Y2ggaW4gU0YjMjgxNDQzMC4KCjIwMDktMDYtMjY6IG9sbHkKCSAgICBbUnVieV0gRml4IHRvIGhhbmRsZSBGSVhOVU0gdmFsdWVzIGdyZWF0ZXIgdGhhbiBNQVhJTlQgcGFzc2VkIGZvciBhCgkgICAgZG91YmxlIHBhcmFtZXRlci4KCjIwMDktMDYtMjQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB3cmFwcGluZyBtZXRob2RzIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgYW5kIHRoZSBjb21wYWN0ZGVmYXVsdGFyZ3MgZmVhdHVyZSAKICAgICAgICAgICAgd2hlcmUgYSBjbGFzcyBpcyBwYXNzZWQgYnkgdmFsdWUgYW5kIGlzIGFzc2lnbmVkIGEgZGVmYXVsdCB2YWx1ZS4gVGhlIFN3aWdWYWx1ZVdyYXBwZXIKICAgICAgICAgICAgdGVtcGxhdGUgd29ya2Fyb3VuZCBmb3IgYSBtaXNzaW5nIGRlZmF1bHQgY29uc3RydWN0b3IgaXMgbm8gbG9uZ2VyIHVzZWQgYXMgdGhlIGNvZGUgCiAgICAgICAgICAgIGdlbmVyYXRlZCBkb2VzIG5vdCBjYWxsIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLgoKMjAwOS0wNi0xNjogd3NmdWx0b24KCSAgICBbSmF2YSxDI10gRml4IGVudW0gbWFyc2hhbGxpbmcgd2hlbiAlaWdub3JlIGlzIHVzZWQgb24gb25lIG9mIHRoZSBlbnVtIGl0ZW1zLgogICAgICAgICAgICBJbmNvcnJlY3QgZW51bSB2YWx1ZXMgd2VyZSBiZWluZyBwYXNzZWQgdG8gdGhlIEMrKyBsYXllciBvciBjb21waWxhdGlvbiBlcnJvcnMgcmVzdWx0ZWQuCgoyMDA5LTA2LTAyOiB0YWxieQoJICAgIFtQZXJsXSBSZXNvbHZlZCByZWZlcmVuY2UuaSBvdmVybG9hZCBzdXBwb3J0IHByb2JsZW0KCSAgICBpZGVudGlmaWVkIGJ5IEpvaG4gUG90b3dza3kuCgoyMDA5LTA1LTI2OiB3c2Z1bHRvbgoJICAgIFtDI10gSW1wcm92ZWQgc3RkOjptYXAgd3JhcHBlcnMgYmFzZWQgb24gcGF0Y2ggZnJvbSBZdXZhbCBCYXJvci4gVGhlIEMjIHByb3h5CiAgICAgICAgICAgIG5vdyBpbXBsZW1lbnRzIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLklEaWN0aW9uYXJ5PD4uCgoJICAgIFRoZXNlIHN0ZDptYXAgd3JhcHBlcnMgaGF2ZSBhIG5vbi1iYWNrd2FyZHMgY29tcGF0aWJsZSBvdmVyaGF1bCB0byBtYWtlIHRoZW0KICAgICAgICAgICAgbGlrZSBhIC5ORVQgSURpY3Rpb25hcnkuIFNvbWUgbWV0aG9kIG5hbWVzIGhhdmUgY2hhbmdlZCBhcyBmb2xsb3dpbmc6CiAgICAgICAgICAgICAgc2V0IC0+IHNldGl0ZW0gKHVzZSB0aGlzW10gcHJvcGVydHkgbm93KQogICAgICAgICAgICAgIGdldCAtPiBnZXRpdGVtICh1c2UgdGhpc1tdIHByb3BlcnR5IG5vdykKICAgICAgICAgICAgICBoYXNfa2V5IC0+IENvbnRhaW5zS2V5CiAgICAgICAgICAgICAgZGVsIC0+IFJlbW92ZQogICAgICAgICAgICAgIGNsZWFyIC0+IENsZWFyCgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIG1hY3JvcyB1c2VkIGZvciBzdGQ6Om1hcCB3cmFwcGVycyBhcmUgZGVwcmVjYXRlZCBhbmQgd2lsbCBubyBsb25nZXIgd29yazoKICAgICAgICAgICAgICBzcGVjaWFsaXplX3N0ZF9tYXBfb25fa2V5CiAgICAgICAgICAgICAgc3BlY2lhbGl6ZV9zdGRfbWFwX29uX3ZhbHVlCiAgICAgICAgICAgICAgc3BlY2lhbGl6ZV9zdGRfbWFwX29uX2JvdGgKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAwOS0wNS0yMDogdm1pa2xvcwogICAgICAgICAgICBbUEhQXSBBZGQgdGhlICd0aGlzb3duJyBtZW1iZXIgdG8gY2xhc3Nlcy4gVGhlIHVzYWdlIG9mIGl0CiAgICAgICAgICAgIGlzIHRoZSBzYW1lIGFzIHRoZSBQeXRob24gdGhpc293biBvbmU6IGl0J3MgMSBieSBkZWZhdWx0IGFuZAogICAgICAgICAgICB5b3UgY2FuIHNldCBpdCB0byAwIGlmIHlvdSB3YW50IHRvIHByZXZlbnQgZnJlZWluZyBpdC4gKEZvcgogICAgICAgICAgICBleGFtcGxlIHRvIHByZXZlbnQgYSBkb3VibGUgZnJlZS4pCgoyMDA5LTA1LTE0OiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4IHRoZSB3cm9uZyBwb2ludGVyIHZhbHVlIHJldHVybmVkIGJ5IFN3aWdQeU9iamVjdF9yZXByKCkuCgoyMDA5LTA1LTEzOiBtdXRhbmRpeiAoTWlrZWwgQmFuY3JvZnQpCgkgICAgW2FsbGVncm9jbF0gTWlub3IgdHdlYWsgd2hlbiB3cmFwcGluZyBpbiAtbm9jd3JhcCBtb2RlLgoKMjAwOS0wNS0xMTogd3NmdWx0b24KCSAgICBbQyNdIEltcHJvdmVkIHN0ZDo6dmVjdG9yIHdyYXBwZXJzIG9uIHRoZSBDIyBwcm94eSBzaWRlIGZyb20gWXV2YWwgQmFyb3IuIFRoZXNlCgkgICAgaW1wbGVtZW50IElMaXN0PD4gaW5zdGVhZCBvZiBJRW51bWVyYWJsZTw+IHdoZXJlIHBvc3NpYmxlLgoKMjAwOS0wNC0yOTogd3NmdWx0b24KCSAgICBbSmF2YSwgQyNdIEFkZCB0aGUgJ25vdGRlcml2ZWQnIGF0dHJpYnV0ZSB0byB0aGUgamF2YWJhc2UgYW5kIGNzYmFzZSB0eXBlbWFwcy4KCSAgICBXaGVuIHRoaXMgYXR0cmlidXRlIGlzIHNldCwgdGhlIHR5cGVtYXAgd2lsbCBub3QgYXBwbHkgdG8gY2xhc3NlcyB0aGF0IGFyZSBkZXJpdmVkCgkgICAgZnJvbSBhIEMrKyBiYXNlIGNsYXNzLCBlZyAKCSAgICAgICV0eXBlbWFwKGNzYmFzZSwgbm90ZGVyaXZlZD0iMSIpIFNXSUdUWVBFICJDb21tb25CYXNlIgoKMjAwOS0wNC0yOTogb2xseQoJICAgIFtQeXRob25dIERvbid0IGF0dGVtcHQgdG8gYWNxdWlyZSB0aGUgR0lMIGluIHNpdHVhdGlvbnMgd2hlcmUgd2UKCSAgICBrbm93IHRoYXQgaXQgd2lsbCBhbHJlYWR5IGJlIGxvY2tlZC4gIFRoaXMgYXZvaWRzIHNvbWUgZGVhZC1sb2NrcwoJICAgIHdpdGggbW9kX3B5dGhvbiAoZHVlIHRvIG1vZF9weXRob24gYnVncyB3aGljaCBhcmUgYXBwYXJlbnRseQoJICAgIHVubGlrZWx5IHRvIGV2ZXIgYmUgZml4ZWQpLCBhbmQgcmVzdWx0cyBpbiBzbWFsbGVyIHdyYXBwZXJzIHdoaWNoCgkgICAgcnVuIGEgbGl0dGxlIGZhc3RlciAoaW4gdGVzdHMgd2l0aCBYYXBpYW4gb24geDg2LTY0IFVidW50dSA5LjA0LAoJICAgIHRoZSBzdHJpcHBlZCB3cmFwcGVyIGxpYnJhcnkgd2FzIDExJSBzbWFsbGVyIGFuZCByYW4gMi43JSBmYXN0ZXIpLgoKMjAwOS0wNC0yMTogd3NmdWx0b24KCSAgICBbQyNdIEZpeCAjMjc1MzQ2OSAtIGJvb2wgJk9VVFBVVCBhbmQgYm9vbCAqT1VUUFVUIHR5cGVtYXBzIGluaXRpYWxpc2F0aW9uLgoKMjAwOS0wNC0wOTogd3NmdWx0b24KCSAgICBGaXggIzI3NDY4NTggLSBDIG1hY3JvIGV4cHJlc3Npb24gdXNpbmcgZmxvYXRpbmcgcG9pbnQgbnVtYmVycwoKMjAwOS0wMy0zMDogb2xseQoJICAgIFtQSFBdIFRoZSBkZWZhdWx0IG91dCB0eXBlbWFwIGZvciBjaGFyW0FOWV0gbm93IHJldHVybnMgdGhlIHN0cmluZyB1cCB0byBhCgkgICAgemVybyBieXRlLCBvciB0aGUgZW5kIG9mIHRoZSBhcnJheSBpZiB0aGVyZSBpcyBubyB6ZXJvIGJ5dGUuICBUaGlzCgkgICAgaXMgdGhlIHNhbWUgYXMgUHl0aG9uIGRvZXMsIGFuZCBzZWVtcyBtb3JlIGdlbmVyYWxseSB1c2VmdWwgdGhhbgoJICAgIHRoZSBwcmV2aW91cyBiZWhhdmlvdXIgb2YgcmV0dXJuaW5nIHRoZSB3aG9sZSBjb250ZW50cyBvZiB0aGUgYXJyYXkKCSAgICBpbmNsdWRpbmcgYW55IHplcm8gYnl0ZXMuICBJZiB5b3Ugd2FudCB0aGUgb2xkIGJlaGF2aW91ciwgeW91IGNhbiBwcm92aWRlCgkgICAgeW91ciBvd24gdHlwZW1hcCB0byBkbyB0aGlzOgoKCSAgICAldHlwZW1hcChvdXQpIGNoYXIgW0FOWV0KCSAgICAlewoJCVJFVFZBTF9TVFJJTkdMKCQxLCAkMV9kaW0wLCAxKTsKCSAgICAlfQoKVmVyc2lvbiAxLjMuMzkgKDIxIE1hcmNoIDIwMDkpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAwOS0wMy0xOTogYmh5CiAgICAgICAgICAgIFtQeXRob25dIEZpeCB0aGUgbWVtb3J5IGxlYWsgcmVsYXRlZCB0byBQeXRob24gMyB1bmljb2RlIGFuZCBDIGNoYXIqIGNvbnZlcnNpb24sCiAgICAgICAgICAgIHdoaWNoIGNhbiBiZSBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUgYmVmb3JlIHRoaXMgZml4OgogICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgZnJvbSBsaV9jc3RyaW5nIGltcG9ydCAqCiAgICAgICAgICAgICAgICAgIGk9MAogICAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgICAgICAgaSArPSAxCiAgICAgICAgICAgICAgICAgICAgICBuID0gc3RyKGkpKjEwCiAgICAgICAgICAgICAgICAgICAgICB0ZXN0MyhuKQoKICAgICAgICAgICAgVGhpcyBmaXggYWZmZWN0ZWQgU1dJR19Bc0NoYXJQdHJBbmRTaXplKCkgc28geW91IGNhbm5vdCBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aAogICAgICAgICAgICBhIG51bGwgYWxsb2MgYW5kIG5vbi1udWxsIGNwdHIgYXJndW1lbnQgaW4gUHl0aG9uIDMsIG90aGVyd2lzZSBhIHJ1bnRpbWUgZXJyb3IKICAgICAgICAgICAgd2lsbCBiZSByYWlzZWQuCgoyMDA5LTAzLTE4OiB3c2Z1bHRvbgoJICAgIFtDI10gc3RkOjp2ZWN0b3I8VD4gd3JhcHBlciBpbXByb3ZlbWVudHMgZm9yIC5ORVQgMiBhbmQgYWxzbyBwcm92aWRpbmcgdGhlCgkgICAgbmVjZXNzYXJ5IG1hY2hpbmVyeSB0byB1c2UgdGhlIHN0ZDo6dmVjdG9yPFQ+IHdyYXBwZXJzIHdpdGggbW9yZSBhZHZhbmNlZCBmZWF0dXJlcyBzdWNoCgkgICAgYXMgTElOUSAtIHRoZSBDIyBwcm94eSBjbGFzcyBub3cgZGVyaXZlcyBmcm9tIElFbnVtZXJhYmxlPD4uIFRoZSBkZWZhdWx0IGlzIG5vdyB0byAKCSAgICBnZW5lcmF0ZSBjb2RlIHJlcXVpcmluZyAuTkVUIDIgYXMgYSBtaW5pbXVtLCBhbHRob3VnaCB0aGUgQyMgY29kZSBjYW4gYmUgY29tcGlsZWQgCgkgICAgZm9yIC5ORVQgMSBieSBkZWZpbmluZyB0aGUgU1dJR19ET1RORVRfMSBDIyBwcmVwcm9jZXNzb3IgY29uc3RhbnQuIFNlZSB0aGUgCgkgICAgc3RkX3ZlY3Rvci5pIGZpbGUgZm9yIG1vcmUgZGV0YWlscy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAwOS0wMy0xMjogd3NmdWx0b24KCSAgICBbUnVieV0gRml4ICMyNjc2NzM4IFNXSUcgZ2VuZXJhdGVkIHN5bWJvbCBuYW1lIGNsYXNoZXMuCgoyMDA5LTAzLTAxOiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gU29tZSBmaXhlcyBmb3IgUHl0aG9uIDMuMC4xIGFuZCBoaWdoZXIgc3VwcG9ydC4gSW4gMy4wLjEsIHRoZSBDIEFQSSBmdW5jdGlvbgogICAgICAgICAgICBQeU9iamVjdF9Db21wYXJlIGlzIHJlbW92ZWQsIHNvIFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbCBpcyB1c2VkIGZvciByZXBsYWNlbWVudC4KICAgICAgICAgICAgU3RydWN0IGluaXRpbGl6YXRpb24gb2YgU3dpZ1B5T2JqZWN0IGFuZCBTd2lnUHlPYmplY3RfYXNfbnVtYmVyIGNoYW5nZWQgdG8gcmVmbGVjdAogICAgICAgICAgICB0aGUgZHJvcCBvZiB0cF9jb21wYXJlIGFuZCBuYl9sb25nLgoKMjAwOS0wMy0wMTogYmh5CiAgICAgICAgICAgIFtQeXRob25dIEZpeCBTRiMyNTgzMTYwLiBOb3cgdGhlIGltcG9ydGVyIGluIFB5dGhvbiBzaGFkb3cgd3JhcHBlciB0YWtlIGNhcmUgb2YgdGhlCiAgICAgICAgICAgIGNhc2UgdGhhdCBtb2R1bGUgYWxyZWFkeSBpbXBvcnRlZCBhdCBvdGhlciBwbGFjZS4KCjIwMDktMDItMjg6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBGaXggU0YjMjYzNzM1Mi4gTW92ZSBzdHJ1Y3QgZGVjbGFyYXRpb24gb2YgU1dJR19tb2R1bGUgaW4gcHlpbml0LnN3ZyBiZWZvcmUKICAgICAgICAgICAgdGhlIG1ldGhvZCBjYWxscywgc2luY2Ugc29tZSBDIGNvbXBpbGVyIGRvbid0IGFsbG93IGRlY2xhcmF0aW9uIGluIG1pZGRsZSBvZiBmdW5jdGlvbgogICAgICAgICAgICBib2R5LgoKMjAwOS0wMi0yMTogd3NmdWx0b24KCSAgICBbQWxsZWdyb2NsXSBGaXggc2VnIGZhdWx0IHdyYXBwaW5nIHNvbWUgY29uc3RhbnQgdmFyaWFibGUgKCVjb25zdGFudCkgdHlwZXMuCgoyMDA5LTAyLTIwOiB3c2Z1bHRvbgoJICAgIFtDRkZJXSBGaXggc2VnIGZhdWx0cyB3aGVuIGZvciAlZXh0ZW5kIGFuZCB1c2luZyBzdGF0ZW1lbnRzLgoKMjAwOS0wMi0yMDogd3NmdWx0b24KCSAgICBGaXggU0YgIzI2MDU5NTU6IC1jbyBvcHRpb24gd2hpY2ggYnJva2UgaW4gMS4zLjM3LiAKCjIwMDktMDItMjA6IHdzZnVsdG9uCgkgICAgTmV3ICVpbnNlcnQoImJlZ2luIikgc2VjdGlvbiBhZGRlZC4gQWxzbyBjYW4gYmUgdXNlZCBhcyAlYmVnaW4uIFRoaXMgaXMgYSBuZXcKCSAgICBjb2RlIHNlY3Rpb24gcmVzZXJ2ZWQgZW50aXJlbHkgZm9yIHVzZXJzIGFuZCB0aGUgY29kZSB3aXRoaW4gdGhlIHNlY3Rpb24gaXMgZ2VuZXJhdGVkCgkgICAgYXQgdGhlIHRvcCBvZiB0aGUgQy9DKysgd3JhcHBlciBmaWxlIGFuZCBzbyBwcm92aWRlcyBhIG1lYW5zIHRvIHB1dCBjdXN0b20gY29kZQoJICAgIGludG8gdGhlIHdyYXBwZXIgZmlsZSBiZWZvcmUgYW55dGhpbmcgZWxzZSB0aGF0IFNXSUcgZ2VuZXJhdGVzLgoKMjAwOS0wMi0xNzogd3NmdWx0b24KCSAgICAnbWFrZSBjbGVhbi10ZXN0LXN1aXRlJyB3aWxsIG5vdyBydW4gY2xlYW4gb24gQUxMIGxhbmd1YWdlcy4gUHJldmlvdXNseSBpdCBvbmx5CgkgICAgcmFuIHRoZSBjb3JyZWN0bHkgY29uZmlndXJlZCBsYW5ndWFnZXMuIFRoaXMgd2F5IGl0IGlzIG5vdyBwb3NzaWJsZSB0byBjbGVhbiB1cAoJICAgIHByb3Blcmx5IGFmdGVyIHJ1bm5pbmcgJ21ha2UgcGFydGlhbGNoZWNrLXRlc3Qtc3VpdGUnLgoKMjAwOS0wMi0xNDogd3NmdWx0b24KCSAgICBFeHRlbmQgYXR0cmlidXRlIGxpYnJhcnkgc3VwcG9ydCBmb3Igc3RydWN0cy9jbGFzc2VzIGFuZCB0aGUgYWNjZXNzb3IgZnVuY3Rpb25zIHVzZQoJICAgIHBhc3MvcmV0dXJuIGJ5IHZhbHVlIHNlbWFudGljcy4gVHdvIG5ldyBtYWNyb3MgYXJlIGF2YWlsYWJsZSBhbmQgdXNhZ2UgaXMgaWRlbnRpY2FsCgkgICAgdG8gJWF0dHJpYnV0ZS4gVGhlc2UgYXJlICVhdHRyaWJ1dGV2YWwgZm9yIHN0cnVjdHMvY2xhc3NlcyBhbmQgJWF0dHJpYnV0ZXN0cmluZyBmb3IKCSAgICBzdHJpbmcgY2xhc3NlcywgbGlrZSBzdGQ6OnN0cmluZy4gU2VlIGF0dHJpYnV0ZS5zd2cgZm9yIG1vcmUgZGV0YWlscy4KCjIwMDktMDItMTM6IHdzZnVsdG9uCgkgICAgQWRkIHN1cHBvcnQgZm9yICVleHRlbmQgYW5kIG1lbWJlcmluIHR5cGVtYXBzLiBQcmV2aW91c2x5IHRoZSBtZW1iZXJpbiB0eXBlbWFwcyB3ZXJlCgkgICAgaWdub3JlZCBmb3IgbWVtYmVyIHZhcmlhYmxlcyB3aXRoaW4gYSAlZXh0ZW5kIGJsb2NrLgoKMjAwOS0wMi0xMjogd3NmdWx0b24KCSAgICBSZW1vdmUgdW5uZWNlc3NhcnkgdGVtcG9yYXJ5IHZhcmlhYmxlIHdoZW4gd3JhcHBpbmcgcmV0dXJuIHZhbHVlcyB0aGF0IGFyZSByZWZlcmVuY2VzLiAKCSAgICBFeGFtcGxlIG9mIGdlbmVyYXRlZCBjb2RlIGZvciB3cmFwcGluZzoKCgkgICAgICBzdHJ1Y3QgWFlaIHsKCQlzdGQ6OnN0cmluZyYgcmVmUmV0dXJuKCk7CgkgICAgICB9OwoKCSAgICB1c2VkIHRvIGJlOgoKICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAqcmVzdWx0ID0gMCA7CiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgJl9yZXN1bHRfcmVmID0gKGFyZzEpLT5yZWZSZXR1cm4oKTsKICAgICAgICAgICAgICAgIHJlc3VsdCA9IChzdGQ6OnN0cmluZyAqKSAmX3Jlc3VsdF9yZWY7CiAgICAgICAgICAgICAgfQoKCSAgICAgTm93IGl0IGlzOgoKICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAqcmVzdWx0ID0gMCA7CiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgcmVzdWx0ID0gKHN0ZDo6c3RyaW5nICopICYoYXJnMSktPnJlZlJldHVybigpOwoKMjAwOS0wMi0wODogYmh5CiAgICAgICAgICAgIENoYW5nZSB0aGUgU0laRSBtYXBwZWQgYnkgJXB5YnVmZmVyX211dGFibGVfYmluYXJ5IGFuZCAlcHlidWZmZXJfYmluYXJ5IGluIHB5YnVmZmVyLmkgZnJvbQogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIgdG8gdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgYnVmZmVyLgoKMjAwOS0wMi0wODogd3NmdWx0b24KICAgICAgICAgICAgRml4ICVmZWF0dXJlIG5vdCB3b3JraW5nIGZvciBjb252ZXJzaW9uIG9wZXJhdG9ycywgcmVwb3J0ZWQgYnkgTWF0dCBTcHJhZ3VlLCBmb3IgZXhhbXBsZToKCSAgICAgICVmZWF0dXJlKCJjczptZXRob2Rtb2RpZmllcnMiKSBvcGVyYXRvciBib29sICJwcm90ZWN0ZWQiOwoKMjAwOS0wMi0wNzogd3NmdWx0b24KICAgICAgICAgICAgW016U2NoZW1lXSBBcHBseSAjMjA4MTk2NyBjb25maWd1cmUgY2hhbmdlcyBmb3IgZXhhbXBsZXMgdG8gYnVpbGQgd2l0aCByZWNlbnQgUExUIHZlcnNpb25zLgoJICAgIEFsc28gZml4ZXMgTWFrZWZpbGUgZXJyb3JzIGJ1aWxkaW5nIFNXSUcgZXhlY3V0YWJsZSB3aGVuIG16c2NoZW1lIHBhY2thZ2UgaXMgaW5zdGFsbGVkIAoJICAgICh2ZXJzaW9uIDMuNzIgYXBwcm94IGFuZCBsYXRlcikuCgoyMDA5LTAyLTA0OiB0YWxieQogICAgICAgICAgICBbUGVybF0gRml4IFNGIzI1NjQxOTIgcmVwb3J0ZWQgYnkgRGF2aWQgS29sb3ZyYXRuay4KICAgICAgICAgICAgU1dJR19Bc0NoYXJQdHJBbmRTaXplKCkgbm93IGhhbmRsZXMgImdldCIgbWFnaWMuCgpWZXJzaW9uIDEuMy4zOCAoMzEgSmFudWFyeSAyMDA5KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAwOS0wMS0zMTogYmh5CiAgICAgICAgICAgIFtQeXRob25dIEZpeCBTRiMyNTUyNDg4IHJlcG9ydGVkIGJ5IEdhZXRhbiBMZWhtYW5uLiBOb3cgJXB5dGhvbnByZXBlbmQKICAgICAgICAgICAgYW5kICVweXRob25hcHBlbmQgaGF2ZSBjb3JyZWN0IGluZGVudGF0aW9uLgoKMjAwOS0wMS0zMTogYmh5CiAgICAgICAgICAgIFtQeXRob25dIEZpeCBTRiMyNTUyMDQ4IHJlcG9ydGVkIGJ5IEdhZXRhbiBMZWhtYW5uLiBUaGUgcGFyYW1ldGVyIGxpc3QKICAgICAgICAgICAgb2Ygc3RhdGljIG1lbWJlciBmdW5jdGlvbiBpbiBnZW5lcmF0ZWQgcHJveHkgY29kZSBzaG91bGQgbm90IGhhdmUgdGhlCiAgICAgICAgICAgICdzZWxmJyBwYXJhbWV0ZXIuCgoyMDA5LTAxLTI5OiB3c2Z1bHRvbgoJICAgIEZpeCByZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gMS4zLjM3IHdoZXJlIHRoZSBkZWZhdWx0IG91dHB1dCBkaXJlY3RvcnkKCSAgICBmb3IgdGFyZ2V0IGxhbmd1YWdlIHNwZWNpZmljIGZpbGVzIChpbiB0aGUgYWJzZW5jZSBvZiAtb3V0ZGlyKSB3YXMgbm8KCSAgICBsb25nZXIgdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBnZW5lcmF0ZWQgYy9jKysgZmlsZS4KCjIwMDktMDEtMjg6IHdzZnVsdG9uCgkgICAgW0phdmEsIEMjXSBGaXggcHJveHkgY2xhc3Mgbm90IGJlaW5nIHVzZWQgd2hlbiB0aGUgZ2xvYmFsIHNjb3BlIG9wZXJhdG9yCgkgICAgd2FzIHVzZWQgZm9yIHBhcmFtZXRlcnMgcGFzc2VkIGJ5IHZhbHVlLiBSZXBvcnRlZCBieSBEYXZpZCBQaWVwZ3Jhc3MuCgoyMDA5LTAxLTE1OiB3c2Z1bHRvbgoJICAgIFtQZXJsXSBGaXggc2VnIGZhdWx0IHdoZW4gcnVubmluZyB3aXRoIC12IG9wdGlvbiwgcmVwb3J0ZWQgYnkgSm9obiBLeS4KClZlcnNpb24gMS4zLjM3ICgxMyBKYW51YXJ5IDIwMDkpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDA5LTAxLTEzOiBtZ29zc2FnZQoJICAgIFtMdWFdIEFkZGVkIGNvbnRyYWN0IHN1cHBvcnQgZm9yIHJlcXVpcmluZyB0aGF0IHVuc2lnbmVkIG51bWJlcnMgYXJlID49MAoJICAgIFJld3JvdGUgbXVjaCBvZiBFeGFtcGxlcy9MdWEvZW1iZWQzLiAKCSAgICBBZGRlZCBhIGxvdCB0byB0aGUgTHVhIGRvY3VtZW50YXRpb24uCgoyMDA5LTAxLTEzOiB3c2Z1bHRvbgoJICAgIEZpeCBjb21waWxhdGlvbiBlcnJvciB3aGVuIHVzaW5nIGRpcmVjdG9ycyBvbiBwcm90ZWN0ZWQgdmlydHVhbCBvdmVybG9hZGVkIAoJICAgIG1ldGhvZHMgcmVwb3J0ZWQgYnkgU2FtIEhlbmRsZXkuCgoyMDA5LTAxLTEyOiBkcmpvZQogICAgICAgICAgICBbUl0gRml4ZWQgaGFuZGxpbmcgb2YgaW50ZWdlciBhcnJheXMKCjIwMDktMDEtMTA6IGRyam9lCgkgICAgW1JdIEZpeCBpbnRlZ2VyIGhhbmRsaW5nIGluIHIgdG8gZGVhbCBjb3JyZWN0bHkgd2l0aCBzaWduZWQKCSAgICBhbmQgdW5zaWduZWQgaXNzdWVzCgoyMDA5LTAxLTEwOiB3c2Z1bHRvbgoJICAgIFBhdGNoICAjMTk5Mjc1NiBmcm9tIENvbGluIE1jRG9uYWxkIC0gJWNvbnRyYWN0IG5vdCB3b3JraW5nIGZvciBjbGFzc2VzIAoJICAgIGluIG5hbWVzcGFjZQoKMjAwOS0wMS0wNTogb2xseQoJICAgIE1hcmsgU1dJR1BFUkw1LCBTV0lHUEhQNSwgYW5kIFNXSUdUQ0w4IGFzIGRlcHJlY2F0ZWQgaW4gdGhlIHNvdXJjZQoJICAgIGNvZGUgYW5kIHJlbW92ZSBkb2N1bWVudGF0aW9uIG9mIHRoZW0uCgoyMDA4LTEyLTMwOiB3c2Z1bHRvbgoJICAgIEJ1ZyAjMjQzMDc1Ni4gQWxsIHRoZSBsYW5ndWFnZXMgbm93IGRlZmluZSBhIG1hY3JvIGluIHRoZSBnZW5lcmF0ZWQgQy9DKysKCSAgICB3cmFwcGVyIGZpbGUgaW5kaWNhdGluZyB3aGljaCBsYW5ndWFnZSBpcyBiZWluZyB3cmFwcGVkLiBUaGUgbWFjcm8gbmFtZSBpcyB0aGUKCSAgICBzYW1lIGFzIHRob3NlIGRlZmluZWQgd2hlbiBTV0lHIGlzIHJ1biwgZWcgU1dJR0pBVkEsIFNXSUdPQ1RBVkUsIFNXSUdDU0hBUlAgZXRjCgkgICAgYW5kIGFyZSBsaXN0ZWQgaW4gdGhlICJDb25kaXRpb25hbCBDb21waWxhdGlvbiIgc2VjdGlvbiBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KCjIwMDgtMTItMjM6IHdzZnVsdG9uCgkgICAgW0phdmFdIEZpeCAjMjE1Mzc3MyAtICVub2phdmFleGNlcHRpb24gd2FzIGNsZWFyaW5nIHRoZSBleGNlcHRpb24gZmVhdHVyZQogICAgICAgICAgICBpbnN0ZWFkIG9mIGRpc2FibGluZyBpdC4gQ2xlYXJpbmcgY2hlY2tlZCBKYXZhIGV4Y2VwdGlvbnMgYWxzbyBkaWRuJ3Qgd29yay4gCgkgICAgVGhlIG5ldyAlY2xlYXJqYXZhZXhjZXB0aW9uIGNhbiBiZSB1c2VkIGZvciBjbGVhcmluZyB0aGUgZXhjZXB0aW9uIGZlYXR1cmUuCgoyMDA4LTEyLTIyOiB3c2Z1bHRvbgoJICAgIEZpeCAjMjQzMjgwMSAtIE1ha2UgU3dpZ1ZhbHVlV3JhcHBlciBleGNlcHRpb24gc2FmZSBmb3Igd2hlbiBjb3B5IGNvbnN0cnVjdG9ycwoJICAgIHRocm93IGV4Y2VwdGlvbnMuCgoyMDA4LTEyLTIxOiB3c2Z1bHRvbgoJICAgIEFwcGx5IHBhdGNoICMyNDQwMDQ2IHdoaWNoIGZpeGVzIHBvc3NpYmxlIHNlZyBmYXVsdHMgZm9yIG1lbWJlciBhbmQgZ2xvYmFsCgkgICAgdmFyaWFibGUgY2hhciBhcnJheXMgd2hlbiB0aGUgc3RyaW5ncyBhcmUgbGFyZ2VyIHRoYW4gdGhlIHN0cmluZyBhcnJheSBzaXplLgoKMjAwOC0xMi0yMDogd3NmdWx0b24KCSAgICBUaGUgY2NhY2hlIGNvbXBpbGVyIGNhY2hlIGhhcyBiZWVuIGFkYXB0ZWQgdG8gd29yayB3aXRoIFNXSUcgYW5kCgkgICAgbmFtZWQgY2NhY2hlLXN3aWcuIEl0IG5vdyB3b3JrcyB3aXRoIEMvQysrIGNvbXBpbGVycyBhcyB3ZWxsIGFzIFNXSUcKCSAgICBhbmQgY2FuIHJlc3VsdCBpbiBpbXByZXNzaXZlIHNwZWVkdXBzIHdoZW4gdXNlZCB0byByZWNvbXBpbGUgdW5jaGFuZ2VkCgkgICAgY29kZSB3aXRoIGVpdGhlciBhIEMvQysrIGNvbXBpbGVyIG9yIFNXSUcuIERvY3VtZW50YXRpb24gaXMgaW4gQ0NhY2hlLmh0bWwKCSAgICBvciB0aGUgaW5zdGFsbGVkIGNjYWNoZS1zd2lnIG1hbiBwYWdlLgoKMjAwOC0xMi0xMjogd3NmdWx0b24KCSAgICBBcHBseSBwYXRjaCBmcm9tIEthbHlhbm92IERtaXRyeSB3aGljaCBmaXhlcyBwYXJzaW5nIG9mIG5lc3RlZCBzdHJ1Y3RzCgkgICAgY29udGFpbmluZyBjb21tZW50cy4KCjIwMDgtMTItMTI6IHdzZnVsdG9uCgkgICAgRml4IGVycm9yIG1lc3NhZ2UgaW4gc29tZSBuZXN0ZWQgc3RydWN0IGFuZCAlaW5saW5lIHBhcnNpbmcgZXJyb3Igc2l0dWF0aW9ucwoJICAgIHN1Y2ggYXMgdW50ZXJtaW5hdGVkIHN0cmluZ3MgYW5kIGNvbW1lbnRzLgoKMjAwOC0xMi0wNzogb2xseQoJICAgIFtQSFBdIEZpeCB3YXJuaW5ncyB3aGVuIGNvbXBpbGluZyBnZW5lcmF0ZWQgd3JhcHBlciB3aXRoIEdDQyA0LjMuCgoyMDA4LTEyLTA2OiB3c2Z1bHRvbgoJICAgIFtQSFBdIERlcHJlY2F0ZSAlcHJhZ21hKHBocDQpLiBQbGVhc2UgdXNlICVwcmFnbWEocGhwKSBpbnN0ZWFkLgoJICAgIFRoZSBmb2xsb3dpbmcgdHdvIHdhcm5pbmdzIGhhdmUgYmVlbiByZW5hbWVkOgoJICAgIFdBUk5fUEhQNF9NVUxUSVBMRV9JTkhFUklUQU5DRSAtPiBXQVJOX1BIUF9NVUxUSVBMRV9JTkhFUklUQU5DRQoJICAgIFdBUk5fUEhQNF9VTktOT1dOX1BSQUdNQSAgICAgICAtPiBXQVJOX1BIUF9VTktOT1dOX1BSQUdNQQoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDA4LTEyLTA0OiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gQXBwbGllZCBwYXRjaCBTRiMyMTU4OTM4OiBhbGwgdGhlIFNXSUcgc3ltYm9sIG5hbWVzIHN0YXJ0ZWQgd2l0aCBQeQogICAgICAgICAgICBhcmUgY2hhbmdlZCwgc2luY2UgdGhleSBhcmUgaW5hcHByb3ByaWF0ZSBhbmQgZGlzY291cmFnZWQgaW4gUHl0aG9uCiAgICAgICAgICAgIGRvY3VtZW50YXRpb24gKGZyb20gaHR0cDovL3d3dy5weXRob24ub3JnL2RvYy8yLjUuMi9hcGkvaW5jbHVkZXMuaHRtbCk6CgogICAgICAgICAgICAiQWxsIHVzZXIgdmlzaWJsZSBuYW1lcyBkZWZpbmVkIGJ5IFB5dGhvbi5oIChleGNlcHQgdGhvc2UgZGVmaW5lZCBieQogICAgICAgICAgICB0aGUgaW5jbHVkZWQgc3RhbmRhcmQgaGVhZGVycykgaGF2ZSBvbmUgb2YgdGhlIHByZWZpeGVzICJQeSIgb3IgIl9QeSIuCiAgICAgICAgICAgIE5hbWVzIGJlZ2lubmluZyB3aXRoICJfUHkiIGFyZSBmb3IgaW50ZXJuYWwgdXNlIGJ5IHRoZSBQeXRob24gaW1wbGVtZW50YXRpb24KICAgICAgICAgICAgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBleHRlbnNpb24gd3JpdGVycy4gU3RydWN0dXJlIG1lbWJlciBuYW1lcyBkbwogICAgICAgICAgICBub3QgaGF2ZSBhIHJlc2VydmVkIHByZWZpeC4KCiAgICAgICAgICAgIEltcG9ydGFudDogdXNlciBjb2RlIHNob3VsZCBuZXZlciBkZWZpbmUgbmFtZXMgdGhhdCBiZWdpbiB3aXRoICJQeSIgb3IgIl9QeSIuCiAgICAgICAgICAgIFRoaXMgY29uZnVzZXMgdGhlIHJlYWRlciwgYW5kIGplb3BhcmRpemVzIHRoZSBwb3J0YWJpbGl0eSBvZiB0aGUgdXNlcgogICAgICAgICAgICBjb2RlIHRvIGZ1dHVyZSBQeXRob24gdmVyc2lvbnMsIHdoaWNoIG1heSBkZWZpbmUgYWRkaXRpb25hbCBuYW1lcyBiZWdpbm5pbmcKICAgICAgICAgICAgd2l0aCBvbmUgb2YgdGhlc2UgcHJlZml4ZXMuIgoKICAgICAgICAgICAgSGVyZSBpcyBhIGJyaWVmIGxpc3Qgb2Ygd2hhdCBjaGFuZ2VkOgoKICAgICAgICAgICAgICAgIFB5U3dpZyogLT4gU3dpZ1B5KgogICAgICAgICAgICAgICAgUHlPYmplY3RfcHRyIC0+IFN3aWdQdHJfUHlPYmplY3QKICAgICAgICAgICAgICAgIFB5T2JqZWN0X3ZhciAtPiBTd2lnVmFyX1B5T2JqZWN0CiAgICAgICAgICAgICAgICBQeVNlcXVlbmNlX0Jhc2UsIFB5U2VxdWVuY2VfQ29udCwgUHlTZXF1ZW5jZV9SZWYgLT4KICAgICAgICAgICAgICAgICAgICAgICAgU3dpZ1B5U2VxdWVuY2VfQmFzZSwgU3dpZ1B5U2VxdWVuY2VfQ29udCwgU3dpZ1B5U2VxdWVuY2VfUmVmCiAgICAgICAgICAgICAgICBQeU1hcCogLT4gU3dpZ1B5TWFwKgoKICAgICAgICAgICAgV2UgcHJvdmlkZWQgYSBweW5hbWVfY29tcGF0LmkgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuIFVzZXJzIHdob3NlIGNvZGUgaGF2aW5nCiAgICAgICAgICAgIHRoZXNlIHN5bWJvbHMgYW5kIGRvIG5vdCB3YW50IHRvIGNoYW5nZSBpdCBjb3VsZCBzaW1wbHkgaW5jbHVkZSB0aGlzIGZpbGUKICAgICAgICAgICAgYXQgZnJvbnQgb2YgeW91ciBjb2RlLiBBIGJldHRlciBzb2x1dGlvbiBpcyB0byBydW4gdGhlIGNvbnZlcnRpbmcgdG9vbCBvbgogICAgICAgICAgICB5b3VyIGNvZGUsIHdoaWNoIGhhcyBiZWVuIHB1dCBpbiBTV0lHJ3MgU1ZOIHRydW5rIChUb29scy9weW5hbWVfcGF0Y2gucHkpIGFuZAogICAgICAgICAgICB5b3UgY2FuIGRvd25sb2FkIGl0IGhlcmU6CiAgICAgICAgICAgIGh0dHBzOi8vc3dpZy5zdm4uc291cmNlZm9yZ2UubmV0L3N2bnJvb3Qvc3dpZy90cnVuay9Ub29scy9weW5hbWVfcGF0Y2gucHkgCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMDgtMTItMDI6IHdzZnVsdG9uCgkgICAgW1B5dGhvbl0gQXBwbHkgcGF0Y2ggIzIxNDM3MjcgZnJvbSBTZXJnZSBNb25rZXdpdHogdG8gZml4IGltcG9ydGluZyBiYXNlIGNsYXNzZXMgCgkgICAgd2hlbiB0aGUgcGFja2FnZSBvcHRpb24gaXMgc3BlY2lmaWVkIGluICVtb2R1bGUgYW5kIHRoYXQgbW9kdWxlIGlzICVpbXBvcnQnZWQuCgoyMDA4LTExLTI4OiB3c2Z1bHRvbgoJICAgIFtVVExdIEZpeCAjMjA4MDQ5Ny4gU29tZSBpbmNvcnJlY3QgYWNjZXB0YW5jZSBvZiB0eXBlcyBpbiB0aGUgU1RMLCBlZyBhIGRvdWJsZSAqIGVsZW1lbnQKCSAgICBwYXNzZWQgaW50byBhIHZlY3RvcjxpbnQgKj4gY29uc3RydWN0b3Igd291bGQgYmUgYWNjZXB0ZWQsIGJ1dCB0aGUgZW5zdWluZyBiZWhhdmlvdXIKCSAgICB3YXMgdW5kZWZpbmVkLiBOb3cgdGhlIHR5cGUgY29udmVyc2lvbiBjb3JyZWN0bHkgcmFpc2VzIGFuIGV4Y2VwdGlvbi4KCjIwMDgtMTEtMjQ6IHdzZnVsdG9uCgkgICAgQWRkIC1vdXRjdXJyZW50ZGlyIG9wdGlvbi4gVGhpcyBzZXRzIHRoZSBkZWZhdWx0IG91dHB1dCBkaXJlY3RvcnkgdG8gdGhlIGN1cnJlbnQgCgkgICAgZGlyZWN0b3J5IGluc3RlYWQgb2YgdGhlIHBhdGggc3BlY2lmaWVkIGJ5IHRoZSBpbnB1dCBmaWxlLiBUaGlzIG9wdGlvbiBlbmFibGVzCgkgICAgYmVoYXZpb3VyIHNpbWlsYXIgdG8gYy9jKysgY29tcGlsZXJzLiBOb3RlIHRoYXQgdGhpcyBjb250cm9scyB0aGUgb3V0cHV0IGRpcmVjdG9yeSwKCSAgICBidXQgb25seSBpbiB0aGUgYWJzZW5jZSBvZiB0aGUgLW8gYW5kL29yIC1vdXRkaXIgb3B0aW9ucy4KCjIwMDgtMTEtMjM6IHdzZnVsdG9uCgkgICAgW3J1YnldIEFwcGx5IHBhdGNoICMyMjYzODUwIHRvIGZpeCBydWJ5L2ZpbGUuaSAuLi4gcnVieWlvLmggZmlsZW5hbWUgY2hhbmdlIGluIAoJICAgIHJ1YnkgMS45LgoKMjAwOC0xMS0yMzogd3NmdWx0b24KCSAgICBBcHBseSBwYXRjaCAjMjMxOTc5MCBmcm9tIEpvaGFuIEhha2UgdG8gZml4IHNoYXJlZF9wdHIgdXNhZ2UgaW4gc3RkOjp0cjEgbmFtZXNwYWNlLgoKMjAwOC0xMS0yMTogd3NmdWx0b24KCSAgICBUaGUgdXNlIG9mIHRoZSBpbmNsdWRlIHBhdGggdG8gZmluZCB0aGUgaW5wdXQgZmlsZSBpcyBub3cgZGVwcmVjYXRlZC4KCSAgICBUaGlzIG1ha2VzIHRoZSBiZWhhdmlvdXIgb2YgU1dJRyB0aGUgc2FtZSBhcyBDL0MrKyBjb21waWxlcnMgaW4gcHJlcGFyYXRpb24KCSAgICBmb3IgdXNlIHdpdGggY2NhY2hlLgoKMjAwOC0xMS0xNjogd3NmdWx0b24KCSAgICBGaXggLW5vcHJlcHJvY2VzcyBvcHRpb24gdG86CgkgICAgLSBjb3JyZWN0bHkgcmVwb3J0IGZpbGUgbmFtZXMgaW4gd2FybmluZyBhbmQgZXJyb3IgbWVzc2FnZXMuCgkgICAgLSB1c2UgdGhlIG9yaWdpbmFsIGlucHV0IGZpbGVuYW1lIHRoYXQgY3JlYXRlZCB0aGUgcHJlcHJvY2Vzc2VkIG91dHB1dCB3aGVuIAoJICAgICAgZGV0ZXJtaW5pbmcgdGhlIEMrKyB3cmFwcGVyIGZpbGUgbmFtZSAoaW4gdGhlIGFic2VuY2Ugb2YgLW8pLiBQcmV2aW91c2x5IAoJICAgICAgdGhlIG5hbWUgb2YgdGhlIGlucHV0IGZpbGUgY29udGFpbmluZyB0aGUgcHJlcHJvY2Vzc2VkIG91dHB1dCB3YXMgdXNlZC4KCjIwMDgtMTEtMTE6IHdzZnVsdG9uCgkgICAgW0phdmFdIEFkZCBwYXRjaCAjMjE1MjY5MSBmcm9tIE1BVFNVVVJBIFRha2Fub3JpIHdoaWNoIGZpeGVzIGNvbXBpbGVzIHVzaW5nIHRoZQoJICAgIEludGVsIGNvbXBpbGVyCgoyMDA4LTExLTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgcGF0Y2ggIzIxMjgyNDkgZnJvbSBBbmF0b2x5IFRlY2h0b25payB3aGljaCBjb3JyZWN0cyB0aGUgQy9DKysgcHJveHkKICAgICAgICAgICAgY2xhc3MgYmVpbmcgcmVwb3J0ZWQgZm9yIFB5dGhvbiBkb2NzdHJpbmdzIHdoZW4gJXJlbmFtZSBpcyB1c2VkLgoKMjAwOC0xMS0wMTogd3NmdWx0b24KICAgICAgICAgICAgQWRkIHRoZSBzdHJpcCBlbmNvZGVyIHBhdGNoIGZyb20gQW5hdG9seSBUZWNodG9uaWsgIzIxMzAwMTYuIFRoaXMgZW5hYmxlcyBhbiAKICAgICAgICAgICAgZWFzeSB3YXkgdG8gcmVuYW1lIHN5bWJvbHMgYnkgc3RyaXBwaW5nIGEgY29tbW9ubHkgdXNlZCBwcmVmaXggaW4gYWxsIHRoZQogICAgICAgICAgICBmdW5jdGlvbi9zdHJ1Y3QgbmFtZXMuIEl0IHdvcmtzIGluIHRoZSBzYW1lIHdheSBhcyB0aGUgb3RoZXIgZW5jb2RlcnMsIHN1Y2ggYXMKICAgICAgICAgICAgdGl0bGUsIGxvd2VyLCBjb21tYW5kIGV0YyBvdXRsaW5lZCBpbiBDSEFOR0VTIGZpbGUgZGF0ZWQgMTIvMzAvMjAwNS4gRXhhbXBsZQogICAgICAgICAgICBiZWxvdyB3aWxsIHJlbmFtZSB3eEFub3RoZXJXaWRnZXQgdG8gQW5vdGhlcldpZGdldCBhbmQgd3hEb1NvbWV0aGluZyB0byAKICAgICAgICAgICAgRG9Tb21ldGhpbmc6CgogICAgICAgICAgICAgICVyZW5hbWUoIiUoc3RyaXA6W3d4XSlzIikgIiI7IAoKICAgICAgICAgICAgICBzdHJ1Y3Qgd3hBbm90aGVyV2lkZ2V0IHsKICAgICAgICAgICAgICAgICAgdm9pZCB3eERvU29tZXRoaW5nKCk7CiAgICAgICAgICAgICAgfTsKCjIwMDgtMDktMjY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBMb3RzIG9mIHRlc3Qtc3VpdGUgd29yay4KCSAgICAtIEZpeCBvcmRlcmluZyBvZiB3cmFwcGVyIG91dHB1dCBhbmQgJXsgJX0gaGVhZGVyIG91dHB1dC4KCSAgICAtIEZpeCBkZWNsYXJhdGlvbnMgb2YgbG9jYWwgdmFycyBpbiBDIHdyYXBwZXJzLgoJICAgIC0gRml4IGRlY2xhcmF0aW9uIG9mIGRlZmluZWQgY29uc3RhbnRzIGluIEMgd3JhcHBlcnMuCgkgICAgLSBGaXggZGVjbGFyYXRpb24gb2YgRW51bVZhbHVlcyBpbiBDIHdyYXBwZXJzLgoJICAgIC0gYWRkIHNvbWUgY29uc3QgdHlwZW1hcHMgdG8gYWxsZWdyb2NsLnN3ZwoJICAgIC0gYWRkIHJlbmFtZSBmb3Igb3BlcmF0b3IgYm9vbCgpIG92ZXJsb2Fkcy4KCQoyMDA4LTA5LTI1OiBvbGx5CgkgICAgW1BIUDVdIEZpbGwgaW4gdHlwZW1hcHMgZm9yIFNXSUdUWVBFIGFuZCB2b2lkICogKFNGIzIwOTUxODYpLgoKMjAwOC0wOS0yMjogbXV0YW5kaXogKE1pa2VsIEJhbmNyb2Z0KQoJICAgIFthbGxlZ3JvY2xdCgkgICAgLSBTdXBwb3J0IHdyYXBwaW5nIG9mIHR5cGVzIHdob3NlIGRlZmluaXRpb25zIGFyZSBub3Qgc2VlbiBieQoJICAgIFNXSUcuIFRoZXkgYXJlIHRyZWF0ZWQgYXMgZm9yd2FyZC1yZWZlcmVuY2VkIGNsYXNzZXMgYW5kIGlmIGEKCSAgICBkZWZpbml0aW9uIGlzIG5vdCBzZWVuIGFyZSB0cmVhdGVkIGFzICgqIDp2b2lkKS4KCSAgICAtIERvbid0IHdyYXAgdGhlIGNvbnRlbnRzIG9mIHVubmFtZWQgbmFtZXNwYWNlcy4KCSAgICAtIE1vcmUgY29kZSBjbGVhbnVwLiBSZW1vdmVkIHNvbWUgZXh0cmFuZW91cyB3YXJuaW5ncy4KCSAgICAtIHN0YXJ0IHdvcmsgb24gaGF2aW5nIHRoZSBhbGxlZ3JvY2wgbW9kIHBhc3MgdGhlIGNwcCB0ZXN0LXN1aXRlLgoKMjAwOC0wOS0xOTogb2xseQoJICAgIFtQSFA1XSBBZGQgdHlwZW1hcHMgZm9yIGxvbmcgbG9uZyBhbmQgdW5zaWduZWQgbG9uZyBsb25nLgoKMjAwOC0wOS0xODogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBZGRlZCBDIyBhcnJheSB0eXBlbWFwcyBwcm92aWRlZCBieSBBbnR0aSBLYXJhbnRhLgogICAgICAgICAgICBUaGUgYXJyYXlzIHByb3ZpZGUgYSB3YXkgdG8gdXNlIE1hcnNoYWxBcyhVbm1hbmFnZWRUeXBlLkxQQXJyYXkpCiAgICAgICAgICAgIGFuZCBwaW5uaW5nIHRoZSBhcnJheSB1c2luZyAnZml4ZWQnLiBTZWUgYXJyYXlzX2NzaGFycC5pIGxpYnJhcnkgZmlsZQogICAgICAgICAgICBmb3IgZGV0YWlscy4KCjIwMDgtMDktMTg6IHdzZnVsdG9uCgkgICAgRG9jdW1lbnQgdGhlIG9wdGlvbmFsIG1vZHVsZSBhdHRyaWJ1dGUgaW4gdGhlICVpbXBvcnQgZGlyZWN0aXZlLAogICAgICAgICAgICBzZWUgTW9kdWxlcy5odG1sLiBBZGQgYSB3YXJuaW5nIGZvciBQeXRob24gd3JhcHBlcnMgd2hlbiB0aGUKICAgICAgICAgICAgbW9kdWxlIG5hbWUgZm9yIGFuIGltcG9ydGVkIGJhc2UgY2xhc3MgaXMgbWlzc2luZywgcmVxdWlyaW5nIHRoZQogICAgICAgICAgICBtb2R1bGUgYXR0cmlidXRlIHRvIGJlIGFkZGVkIHRvICVpbXBvcnQsIGVnIAoKICAgICAgICAgICAgICAlaW1wb3J0KG1vZHVsZT0iRm9vTW9kdWxlIikgZm9vLmgKCjIwMDgtMDktMTg6IG9sbHkKCSAgICBbUEhQNV0gQ2hhbmdlIHRoZSBkZWZhdWx0IGlucHV0IHR5cGVtYXAgZm9yIGNoYXIgKiB0byB0dXJuIFBIUAoJICAgIE51bGwgaW50byBDIE5VTEwgKHByZXZpb3VzbHkgaXQgd2FzIGNvbnZlcnRlZCB0byBhbiBlbXB0eSBzdHJpbmcpLgoJICAgIFRoZSBuZXcgYmVoYXZpb3VyIGlzIGNvbnNpc3RlbnQgd2l0aCBob3cgdGhlIGNvcnJlc3BvbmRpbmcgb3V0cHV0CgkgICAgdHlwZW1hcCB3b3JrcyAoU0YjMjAyNTcxOSkuCgoJICAgIElmIHlvdSB3YW50IHRvIGtlZXAgdGhlIG9sZCBiZWhhdmlvdXIsIGFkZCB0aGUgZm9sbG93aW5nIHR5cGVtYXAKCSAgICB0byB5b3VyIGludGVyZmFjZSBmaWxlIChQSFAncyBjb252ZXJ0X3RvX3N0cmluZ19leCgpIGZ1bmN0aW9uIGRvZXMKCSAgICB0aGUgY29udmVydGluZyBmcm9tIFBIUCBOdWxsIHRvIGFuIGVtcHR5IHN0cmluZyk6CgoJICAgICV0eXBlbWFwKGluKSBjaGFyICogewoJCWNvbnZlcnRfdG9fc3RyaW5nX2V4KCRpbnB1dCk7CgkJJDEgPSBaX1NUUlZBTF9QUCgkaW5wdXQpOwoJICAgIH0KCjIwMDgtMDktMTg6IG9sbHkKCSAgICBbUEhQNV0gRml4IGV4dHJhIGNvZGUgYWRkZWQgdG8gcHJveHkgY2xhc3MgY29uc3RydWN0b3JzIGluIHRoZSBjYXNlCgkgICAgd2hlcmUgdGhlIG9ubHkgY29uc3RydWN0b3IgdGFrZXMgbm8gYXJndW1lbnRzLgoKMjAwOC0wOS0xODogb2xseQoJICAgIFtQSFA1XSBGaXggd3JhcHBpbmcgb2YgYSByZW5hbWVkIGVudW1lcmF0ZWQgdmFsdWUgb2YgYW4gZW51bSBjbGFzcwoJICAgIG1lbWJlciAoU0YjMjA5NTI3MykuCgoyMDA4LTA5LTE3OiBtdXRhbmRpeiAoTWlrZWwgQmFuY3JvZnQpCgkgICAgW2FsbGVncm9jbF0KCSAgICAtIEZpeCBob3cgZm9yd2FyZCByZWZlcmVuY2UgdHlwZWRlZnMgYXJlIGhhbmRsZWQsIHNvIGFzIG5vdCB0byBjb25mbGljdAoJICAgIHdpdGggb3RoZXIgbGVnaXQgdHlwZWRlZnMuCgkgICAgLSBEb24ndCAoZm9yIG5vdykgcGVyZm9ybSBhbiBmZml0eXBlIHR5cGVtYXAgbG9va3VwIHdoZW4gdHJ5aW5nIHRvCgkgICAgd2hlbiBjYWxsaW5nIGNvbXBvc2VfZm9yZWlnbl90eXBlKCkuIFRoaXMgaXMgYWN0dWFsbHkgYSB1c2VmdWwgdGhpbmcKCSAgICB0byBkbyBpbiBjZXJ0YWluIGNhc2VzLCB0aGUgdGVzdCBjYXNlcyBmb3Igd2hpY2ggSSBjYW4ndCBjdXJyZW50bHkKCSAgICBsb2NhdGUgOi8uIEl0J3MgYnJlYWtpbmcgc29tZSB3cmFwcGluZyBiZWhhdmlvciB0aGF0IGlzIG1vcmUgY29tbW9ubHkKCSAgICBzZWVuLCBob3dldmVyLiBJJ2xsIHJlYWRkIGluIGEgbW9yZSBhcHByb3ByaWF0ZSB3YXkgd2hlbiBJIGNhbgoJICAgIHJlY3JlYXRlIHRoZSBuZWVkZWQgdGVzdCBjYXNlLCBvciBhIHVzZXIgY29tcGxhaW5zICh3aGljaCBtZWFucwoJICAgIHRoZXkgcHJvYmFibHkgaGF2ZSBhIHRlc3QgY2FzZSkuCgkgICAgLSBkb2N1bWVudCB0aGUgLWlzb2xhdGUgY29tbWFuZC1saW5lIGFyZyBpbiB0aGUgJ3N3aWcgLWhlbHAnIG91dHB1dC4KCSAgICBJdCB3YXMgaW4gdGhlIGh0bWwgZG9jcywgYnV0IG5vdCB0aGVyZS4KCSAgICAtIHNtYWxsIGFtb3VudCBvZiBjb2RlIGNsZWFudXAsIHJlbW92ZWQgc29tZSB1bnVzZWQgY29kZS4KCSAgICAtIHNvbWUgbWlub3IgYWVzdGhldGljIGNoYW5nZXMuCgoyMDA4LTA5LTEyOiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gUHl0aG9uIDMuMCBzdXBwb3J0IGJyYW5jaCBtZXJnZWQgaW50byBTV0lHIHRydW5rLiBUaGFua3MgdG8KICAgICAgICAgICAgR29vZ2xlIFN1bW1lciBvZiBDb2RlIDIwMDggZm9yIHN1cHBvcnRpbmcgdGhpcyBwcm9qZWN0ISBCeSBkZWZhdWx0CiAgICAgICAgICAgIFNXSUcgd2lsbCBnZW5lcmF0ZSBpbnRlcmZhY2UgZmlsZXMgY29tcGF0aWJsZSB3aXRoIGJvdGggUHl0aG9uIDIueAogICAgICAgICAgICBhbmQgMy4wLiBBbmQgdGhlcmUncyBhbHNvIHNvbWUgUHl0aG9uIDMgbmV3IGZlYXR1cmVzIHRoYXQgY2FuIGJlCiAgICAgICAgICAgIGVuYWJsZWQgYnkgcGFzc2luZyBhICItcHkzIiBjb21tYW5kIGxpbmUgb3B0aW9uIHRvIFNXSUcuIFRoZXNlCiAgICAgICAgICAgIGZlYXR1cmVzIGFyZToKCiAgICAgICAgICAgICAgLSBGdW5jdGlvbiBhbm5vdGF0aW9uIHN1cHBvcnQKICAgICAgICAgICAgICAgICAgQWxzbywgdGhlIHBhcmFtZXRlciBsaXN0IG9mIHByb3h5IGZ1bmN0aW9uIHdpbGwgYmUgZ2VuZXJhdGVkLAogICAgICAgICAgICAgICAgICBldmVuIHdpdGhvdXQgdGhlICItcHkzIiBvcHRpb24uIEhvd2V2ZXIsIHRoZSBwYXJhbWV0ZXIgbGlzdAogICAgICAgICAgICAgICAgICB3aWxsIGZhbGxiYWNrIHRvICphcmdzIGlmIHRoZSBmdW5jdGlvbiAob3IgbWV0aG9kKSBpcyBvdmVybG9hZGVkLgogICAgICAgICAgICAgIC0gQnVmZmVyIGludGVyZmFjZSBzdXBwb3J0CiAgICAgICAgICAgICAgLSBBYnN0cmFjdCBiYXNlIGNsYXNzIHN1cHBvcnQKCiAgICAgICAgICAgIEZvciBkZXRhaWxzIG9mIFB5dGhvbiAzIHN1cHBvcnQgYW5kIHRoZXNlIGZlYXR1cmVzLCBwbGVhc2Ugc2VlIHRoZQogICAgICAgICAgICAiUHl0aG9uIDMgU3VwcG9ydCIgc2VjdGlvbiBpbiB0aGUgIlNXSUcgYW5kIFB5dGhvbiIgY2hhcHRlciBvZiB0aGUgU1dJRwogICAgICAgICAgICBkb2N1bWVudGF0aW9uLgoKICAgICAgICAgICAgVGhlICItYXBwbHkiIGNvbW1hbmQgbGluZSBvcHRpb24gYW5kIHN1cHBvcnQgb2YgZ2VuZXJhdGluZyBjb2RlcwogICAgICAgICAgICB1c2luZyBhcHBseSgpIGlzIHJlbW92ZWQuIFNpbmNlIHRoaXMgaXMgb25seSByZXF1aXJlZCBieSB2ZXJ5IG9sZAogICAgICAgICAgICBQeXRob24uCgogICAgICAgICAgICBUaGlzIG1lcmdlIGFsc28gcGF0Y2hlZCBTV0lHJ3MgcGFyc2VyIHRvIHNvbHZlIGEgYnVnLiBCeSB0aGlzIHBhdGNoLAogICAgICAgICAgICBTV0lHIGZlYXR1cmVzIGFibGUgdG8gYmUgY29ycmVjdGx5IGFwcGxpZWQgb24gQysrIGNvbnZlcnNpb24gb3BlcmF0b3IsCiAgICAgICAgICAgIHN1Y2ggbGlrZSB0aGlzOgogICAgICAgICAgICAgIAogICAgICAgICAgICAgICVmZWF0dXJlKCJzaGFkb3ciKSAgKjo6b3BlcmF0b3IgYm9vbCAleyAuLi4gJX0KCjIwMDgtMDktMDI6IHJpY2hhcmRiCgkgICAgW1B5dGhvbl0gQ29tbWl0IHBhdGNoICMyMDg5MTQ5OiBEaXJlY3RvciBleGNlcHRpb24gaGFuZGxpbmcgbWFuZ2xlcwoJICAgIHJldHVybmVkIGV4Y2VwdGlvbi4gIEV4Y2VwdGlvbnMgcmFpc2VkIGJ5IFB5dGhvbiBjb2RlIGluIGRpcmVjdG9ycwoJICAgIGFyZSBub3cgcGFzc2VkIHRocm91Z2ggdG8gdGhlIGNhbGxlciB3aXRob3V0IGNoYW5nZS4gIEFsc28sIHJlbW92ZQoJICAgIHRoZSAiOiAiIHByZWZpeCB3aGljaCB1c2VkIHRvIGJlIGFkZGVkIHRvIG90aGVyIGRpcmVjdG9yIGV4Y2VwdGlvbnMKCSAgICAoZWcsIHRob3NlIGR1ZSB0byBpbmNvcnJlY3QgcmV0dXJuIHR5cGVzKS4KCjIwMDgtMDktMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIENvbW1pdCBwYXRjaCAjMTk4ODI5NiBHQ0l0ZW0gbXVsdGlwbGUgbW9kdWxlIGxpbmtpbmcgaXNzdWUgd2hlbiB1c2luZyAKICAgICAgICAgICAgZGlyZWN0b3JzLgoKMjAwOC0wOS0wMjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBTdXBwb3J0IGZvciAndXNpbmcnIGFuZCAnZml4ZWQnIGJsb2NrcyBpbiB0aGUgJ2NzaW4nIHR5cGVtYXAgaXMgbm93CiAgICAgICAgICAgIHBvc3NpYmxlIHRocm91Z2ggdGhlIHVzZSBvZiB0aGUgcHJlIGF0dHJpYnV0ZSBhbmQgdGhlIG5ldyB0ZXJtaW5hdG9yIGF0dHJpYnV0ZSwgZWcKCiAgICAgICAgICAgICAgJXR5cGVtYXAoY3NpbiwgCiAgICAgICAgICAgICAgICAgICAgICAgcHJlPSIgICAgdXNpbmcgKENEYXRlIHRlbXAkY3NpbnB1dCA9IG5ldyBDRGF0ZSgkY3NpbnB1dCkpIHsiLAogICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmF0b3I9IiAgICB9IC8vIHRlcm1pbmF0ZSB0ZW1wJGNzaW5wdXQgdXNpbmcgYmxvY2siLAogICAgICAgICAgICAgICAgICAgICAgKSBjb25zdCBDRGF0ZSAmCiAgICAgICAgICAgICAgICAgICAgICAgIiRjc2NsYXNzbmFtZS5nZXRDUHRyKHRlbXAkY3NpbnB1dCkiCgogICAgICAgICAgICBTZWUgQ1NoYXJwLmh0bWwgZm9yIG1vcmUgaW5mby4KCjIwMDgtMDktMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDRkZJXSBDb21taXQgcGF0Y2ggIzIwNzkzODEgc3VibWl0dGVkIGJ5IEJvcmlzIFNtaWxnYSAtIGNvbnN0YW50IGV4cHJzIHB1dCBpbnRvIAogICAgICAgICAgICBuby1ldmFsIGNvbnRleHQgaW4gREVGQ0VOVU0KCjIwMDgtMDgtMDI6IHd1enplYgogICAgICAgICAgICBbQ2hpY2tlbixBbGxlZ3JvXSBDb21taXQgUGF0Y2ggMjAxOTMxNAogICAgICAgICAgICBGaXhlcyBhIGJ1aWxkIGVycm9yIGluIGNoaWNrZW4sIGFuZCBzZXZlcmFsIGJ1aWxkIGVycm9ycyBhbmQgb3RoZXIgZXJyb3JzCiAgICAgICAgICAgIGluIEFsbGVncm8gQ0wKCjIwMDgtMDctMTk6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBidWlsZGluZyBvZiBUY2wgZXhhbXBsZXMvdGVzdC1zdWl0ZSBvbiBNYWMgT1MgWCByZXBvcnRlZCBieSBHaWRlb24gU2ltcHNvbi4KCjIwMDgtMDctMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBTRiAjMjAxOTE1NiBDb25maWd1cmluZyB3aXRoIC0td2l0aG91dC1vY3RhdmUgb3IgLS13aXRob3V0LWFsbGxhbmcKICAgICAgICAgICAgZGlkIG5vdCBkaXNhYmxlIG9jdGF2ZS4KCjIwMDgtMDctMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gRml4IGRpcmVjdG9yIHR5cGVtYXBzIGZvciBwb2ludGVycyBzbyB0aGF0IE5VTEwgcG9pbnRlcnMgYXJlIGNvcnJlY3RseSAKICAgICAgICAgICAgbWFyc2hhbGxlZCB0byBDIy9KYXZhIG51bGwgaW4gZGlyZWN0b3IgbWV0aG9kcy4KCjIwMDgtMDctMDQ6IG9sbHkKCSAgICBbUEhQXSBGb3Igc3RkX3ZlY3Rvci5pIGFuZCBzdGRfbWFwLmksIHJlbmFtZSBlbXB0eSgpIHRvIGlzX2VtcHR5KCkKCSAgICBzaW5jZSAiZW1wdHkiIGlzIGEgUEhQIHJlc2VydmVkIHdvcmQuICBCYXNlZCBvbiBwYXRjaCBmcm9tIE1hcmsgS2xlaW4KCSAgICBpbiBTRiMxOTQzNDE3LgoKMjAwOC0wNy0wNDogb2xseQoJICAgIFtQSFBdIFRoZSBkZXByZWNhdGVkIGNvbW1hbmQgbGluZSBvcHRpb24gIi1tYWtlIiBoYXMgYmVlbiByZW1vdmVkLiAgCgkgICAgU2VhcmNoZXMgb24gR29vZ2xlIGNvZGVzZWFyY2ggc3VnZ2VzdCB0aGF0IG5vYm9keSBpcyB1c2luZyBpdCBub3cKCSAgICBhbnl3YXkuCgoyMDA4LTA3LTA0OiBvbGx5CgkgICAgW1BIUF0gVGhlIFNXSUcgY2RhdGEuaSBsaWJyYXJ5IG1vZHVsZSBpcyBub3cgc3VwcG9ydGVkLgoKMjAwOC0wNy0wMzogb2xseQoJICAgIFtQSFBdIFRoZSBkZXByZWNhdGVkIGNvbW1hbmQgbGluZSBvcHRpb24gIi1waHBmdWxsIiBoYXMgYmVlbgoJICAgIHJlbW92ZWQuICBXZSByZWNvbW1lbmQgYnVpbGRpbmcgeW91ciBleHRlbnNpb24gYXMgYSBkeW5hbWljYWxseQoJICAgIGxvYWRhYmxlIG1vZHVsZS4KCjIwMDgtMDctMDI6IG9sbHkKCSAgICBbUEhQNF0gU3VwcG9ydCBmb3IgUEhQNCBoYXMgYmVlbiByZW1vdmVkLiAgVGhlIFBIUCBkZXZlbG9wZXJzIGFyZQoJICAgIG5vIGxvbmdlciBtYWtpbmcgbmV3IFBIUDQgcmVsZWFzZXMsIGFuZCB3b24ndCBldmVuIGJlIHByb3ZpZGluZwoJICAgIHBhdGNoZXMgZm9yIGNyaXRpY2FsIHNlY3VyaXR5IGlzc3VlcyBhZnRlciAyMDA4LTA4LTA4LgoKMjAwOC0wNy0wMjogb2xseQoJICAgIFtQeXRob25dIEltcG9ydCB0aGUgQyBleHRlbnNpb24gZGlmZmVyZW50bHkgZm9yIFB5dGhvbiAyLjYgYW5kCgkgICAgbGF0ZXIgc28gdGhhdCBhbiBpbXBsaWNpdCByZWxhdGl2ZSBpbXBvcnQgZG9lc24ndCBwcm9kdWNlIGEKCSAgICBkZXByZWNhdGlvbiB3YXJuaW5nIGZvciAyLjYgYW5kIGEgZmFpbHVyZSBmb3IgMi43IGFuZCBsYXRlci4KCSAgICBQYXRjaCBmcm9tIFJpY2hhcmQgQm91bHRvbiBpbiBTRiMyMDA4MjI5LCBwbHVzIGZvbGxvdy11cCBwYXRjaGVzCgkgICAgZnJvbSBSaWNoYXJkIGFuZCBIYW95dSBCYWkuCgpWZXJzaW9uIDEuMy4zNiAoMjQgSnVuZSAyMDA4KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDYvMjQvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgUmVtb3ZlIGRlcHJlY2F0ZWQgLWMgY29tbWFuZGxpbmUgb3B0aW9uIChydW50aW1lIGxpYnJhcnkgZ2VuZXJhdGlvbikuCgowNi8yNC8yMDA4OiBvbGx5CgkgICAgW1BIUF0gRml4IGFzc2VydGlvbiBmYWlsdXJlIHdoZW4gaGFuZGxpbmcgJXR5cGVtYXAoaW4sbnVtaW5wdXRzPTApCgkgICAgKHRlc3RjYXNlIGlnbm9yZV9wYXJhbWV0ZXIpLgoKMDYvMjQvMjAwODogb2xseQoJICAgIFtQSFBdIEZpeCBzZWdmYXVsdCB3aGVuIHdyYXBwaW5nIGEgbm9uLWNsYXNzIGZ1bmN0aW9uIG1hcmtlZCB3aXRoCgkgICAgJW5ld29iamVjdCAodGVzdGNhc2UgY2hhcl9zdHJpbmdzKS4KCjA2LzIyLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBBZGQgYSB3YXkgdG8gdXNlIEF0dGFjaEN1cnJlbnRUaHJlYWRBc0RhZW1vbiBpbnN0ZWFkIG9mIEF0dGFjaEN1cnJlbnRUaHJlYWQKICAgICAgICAgICAgaW4gZGlyZWN0b3IgY29kZS4gRGVmaW5lIHRoZSBTV0lHX0pBVkFfQVRUQUNIX0NVUlJFTlRfVEhSRUFEX0FTX0RBRU1PTiBtYWNybywgc2VlCiAgICAgICAgICAgIExpYi9qYXZhL2RpcmVjdG9yLnN3Zy4KCjA2LzIxLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBGaXggY3Jhc2hpbmcgaW4gdGhlIFNUTCB3cmFwcGVycyAocmVqZWN0ISBhbmQgZGVsZXRlX2lmIG1ldGhvZHMpCgowNi8xOS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEMjIGFuZCBKYXZhIGtleXdvcmRzIHdpbGwgYmUgcmVuYW1lZCBpbnN0ZWFkIG9mIGp1c3QgaXNzdWluZyBhIHdhcm5pbmcKICAgICAgICAgICAgYW5kIHRoZW4gZ2VuZXJhdGluZyB1bmNvbXBpbGFibGUgY29kZS4gV2FybmluZyAzMTQgZ2l2ZXMgdGhlIG5ldyBuYW1lIHdoZW4gYSAKICAgICAgICAgICAga2V5d29yZCBpcyBmb3VuZC4KCjA2LzE5LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSXSBLZXl3b3JkIGhhbmRsaW5nIGFkZGVkLiBSIEtleXdvcmRzIHdpbGwgYmUgcmVuYW1lZCBhcyBuZWNlc3NhcnkuCiAgICAgICAgICAgIFdhcm5pbmcgMzE0IGdpdmVzIHRoZSBuZXcgbmFtZSB3aGVuIGEga2V5d29yZCBpcyBmb3VuZC4KCjA2LzE3LzIwMDg6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEFkZGVkIG1pc3Npbmcgc3VwcG9ydCBmb3IgYm9vbCYgYW5kIGJvb2wqLiBBZGRlZCBydW50ZXN0IGZvciBsaV90eXBlbWFwcyB0ZXN0Y2FzZS4KICAgICAgICAgICAgKEJ1ZyAjMTkzODE0MikKCjA2LzA3LzIwMDg6IGJoeQogICAgICAgICAgICBBZGRlZCB0ZXN0IGNhc2Uga2V5d29yZF9yZW5hbWUsIHRoZW4gbWFkZSB0aGUga2V5d29yZCByZW5hbWluZyB3b3JrcyBwcm9wZXJseQogICAgICAgICAgICBieSBmaXhpbmcgU3dpZ19uYW1lX21ha2UoKSBmb3IgYSBpbmNvbXBsZXRlIGNvbmRpdGlvbiBjaGVja2luZy4KCjA2LzAyLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gRml4IGVudW0gd3JhcHBlcnMgd2hlbiB1c2luZyAtbm9wcm94eS4KCjA1LzMwLzIwMDg6IGJoeQogICAgICAgICAgICBBZGRlZCBzdGQ6OndzdHJpbmcgaW50byBMaWIvdHlwZW1hcHMvcHJpbXR5cGVzLnN3Zywgc2luY2UgaXQgaXMgYWxzbyBhIHByaW1pdGl2ZSAKICAgICAgICAgICAgdHlwZSBpbiBTV0lHIC0gZml4ZWQgU0YgIzE5NzY5NzguCgowNS8yOS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEZpeCB2YXJpYWJsZSB3cmFwcGVycyB3aGVuIHVzaW5nIC1ub3Byb3h5LgoKMDUvMjkvMjAwODogYmh5CiAgICAgICAgICAgIFtQeXRob25dIEZpeGVkIGEgdHlwbyBvZiAlI2lmZGVmIGluIExpYi9weXRob24vcHljb250YWluZXIuc3dnLCB3aGljaCBpcyByZWxhdGVkIAogICAgICAgICAgICB0byAtZXh0cmFuYXRpdmUgU1dJRyBvcHRpb24gLSBTRiAjMTk3MTk3Ny4KCjA1LzIwLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIE5ldyBwYXJ0aWFsY2hlY2sgbWFrZWZpbGUgdGFyZ2V0cyBmb3IgcGFydGlhbCB0ZXN0aW5nIG9mIHRoZSB0ZXN0LXN1aXRlLiBUaGVzZQogICAgICAgICAgICBqdXN0IGludm9rZSBTV0lHLCBpZSBubyBjb21waWxhdGlvbiBhbmQgbm8gcnVudGltZSB0ZXN0aW5nLiBJdCBjYW4gYmUgZmFzdGVyCiAgICAgICAgICAgIHdoZW4gZGV2ZWxvcGluZyBieSBqdXN0IGRvaW5nIGEgZGlyZWN0b3J5IGRpZmYgb2YgdGhlIGZpbGVzIFNXSUcgZ2VuZXJhdGVzCiAgICAgICAgICAgIGFnYWluc3QgdGhvc2UgZnJvbSBhIHByZXZpb3VzIHJ1bi4gRXhhbXBsZSB1c2FnZSBmcm9tIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5OgoKICAgICAgICAgICAgICBtYWtlIHBhcnRpYWxjaGVjay10ZXN0LXN1aXRlCiAgICAgICAgICAgICAgbWFrZSBwYXJ0aWFsY2hlY2stamF2YS10ZXN0LXN1aXRlCgogICAgICAgICAgICBUaGlzIGNoYW5nZSBhbHNvIGVuY29tcGFzc2VzIG1vcmUgZmxleGliaWxpdHkgaW4gcnVubmluZyB0aGUgdGVzdC1zdWl0ZSwgZWcKICAgICAgICAgICAgaXQgaXMgcG9zc2libGUgdG8gcHJlZml4IHRoZSBjb21tYW5kIGxpbmUgd2hpY2ggcnVucyBhbnkgdGFyZ2V0IGxhbmd1YWdlIHRlc3QKICAgICAgICAgICAgd2l0aCBhIHRvb2wuIFNlZSB0aGUgUlVOVE9PTCwgQ09NUElMRVRPT0wgYW5kIFNXSUdUT09MIHRhcmdldHMgaW4gdGhlIGNvbW1vbi5tawogICAgICAgICAgICBmaWxlIGFuZCBtYWtlZmlsZXMgaW4gdGhlIHRlc3Qtc3VpdGUgZGlyZWN0b3J5LiBGb3IgZXhhbXBsZSBpdCBpcyBwb3NzaWJsZSB0byAKICAgICAgICAgICAgcnVuIHRoZSBydW50aW1lIHRlc3RzIHRocm91Z2ggdmFsZ3JpbmQgdXNpbmc6CgogICAgICAgICAgICAgIG1ha2UgY2hlY2sgUlVOVE9PTD0idmFsZ3JpbmQgLS1sZWFrLWNoZWNrPWZ1bGwiCgogICAgICAgICAgICBvciBpbnZva2UgU1dJRyB1bmRlciB2YWxncmluZCB1c2luZzoKCiAgICAgICAgICAgICAgbWFrZSBjaGVjayBTV0lHVE9PTD0idmFsZ3JpbmQgLS10b29sPW1lbWNoZWNrIgoKMDUvMTkvMjAwODogZHJqb2UKICAgICAgICAgICAgW1JdIEZpeGVkIGRlZmluZSB0aGF0IHdhcyBicmVha2luZyBwcmUtMi43LiAgQ2hlY2tlZCBpbgogICAgICAgICAgICBwYXRjaCBmcm9tIFNvcmVuIFNvbm5lbmJ1cmcgdGhhdCBjcmVhdGVzIHN0cmluZ3MgaW4gIAoJICAgIHZlcnNpb24gaW5kZXBlbmRlbnQgd2F5CgowNS8xNS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IHZhcmlhYmxlIG5hbWUgY2xhc2ggaW4gZGlyZWN0b3JzIC0gU0YgIzE5NjMzMTYgcmVwb3J0ZWQgYnkgVHJpc3Rhbi4KCjA1LzE0LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBhbiBvcHRpbWlzYXRpb24gZm9yIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBvYmplY3RzIGJ5IHZhbHVlLCByZWR1Y2luZwogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvcGllcyBvZiB0aGUgb2JqZWN0IHRoYXQgYXJlIG1hZGUuIEltcGxlbWVudGVkIHVzaW5nIGFuCiAgICAgICAgICAgIG9wdGlvbmFsIGF0dHJpYnV0ZSBpbiB0aGUgIm91dCIgdHlwZW1hcCBjYWxsZWQgIm9wdGltYWwiLiBEZXRhaWxzIGluIAogICAgICAgICAgICBUeXBlbWFwcy5odG1sLgoKMDUvMTEvMjAwODogb2xseQoJICAgIFtQSFBdIENoZWNrIGZvciAlZmVhdHVyZSgibm90YWJzdHJhY3QiKSB3aGVuIGdlbmVyYXRpbmcgUEhQNSBjbGFzcwoJICAgIHdyYXBwZXIuCgowNS8xMS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggU0YgIzE5NDM2MDggLSAkc2VsZiBzdWJzdGl0dXRpb24gaW4gJWNvbnRyYWN0LCBwYXRjaCBzdWJtaXR0ZWQgYnkKICAgICAgICAgICAgVG9vbiBWZXJzdHJhZWxlbi4KCjA1LzA5LzIwMDg6IG9sbHkKCSAgICBbUEhQXSBGaXggY2hhciAqIHR5cGVtYXBzIHRvIHdvcmsgd2hlbiBhcHBsaWVkIHRvIHNpZ25lZCBjaGFyICogYW5kCgkgICAgdW5zaWduZWQgY2hhciAqICh1bmNvdmVyZWQgYnkgdGVzdGNhc2UgYXBwbHlfc3RyaW5ncykuCgowNS8wOS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggd3JhcHBpbmcgb2YgY2hhciAqIG1lbWJlciB2YXJpYWJsZXMgd2hlbiB1c2luZyBhbGxwcm90ZWN0ZWQgbW9kZS4KICAgICAgICAgICAgQnVnIHJlcG9ydGVkIGJ5IFdhcnJlbiBXYW5nLgoKMDUvMDkvMjAwODogb2xseQoJICAgIFtQSFBdIEZpeCBiYWQgUEhQIGNvZGUgZ2VuZXJhdGVkIHdoZW4gd3JhcHBpbmcgYW4gZW51bSBpbiBhCgkgICAgbmFtZXNwYWNlICh1bmNvdmVyZWQgYnkgdGVzdGNhc2UgYXJyYXlzX3Njb3BlKS4KCjA1LzA5LzIwMDg6IG9sbHkKCSAgICBbUEhQXSBTV0lHIG5vdyBydW5zIHRoZSBQSFAgdGVzdHN1aXRlIHVzaW5nIFBIUDUsIG5vdCBQSFA0LiAgUEhQNAoJICAgIGlzIGVzc2VudGlhbGx5IG9ic29sZXRlIG5vdywgc28gd2UgY2FyZSBtdWNoIG1vcmUgYWJvdXQgc29saWQgUEhQNQoJICAgIHN1cHBvcnQuCgowNS8wNy8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBTVEwgZml4ZXMgd2hlbiB1c2luZyAlaW1wb3J0IHJhdGhlciB0aGFuICVpbmNsdWRlIGFuZCB0aGUgU29sYXJpcyBXb3Jrc2hvcAogICAgICAgICAgICBjb21waWxlciBhbmQgdGhlIFJvZ3Vld2F2ZSBTVEwuCgowNS8wNy8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggd3JhcHBpbmcgb2Ygb3ZlcmxvYWRlZCBwcm90ZWN0ZWQgbWV0aG9kcyB3aGVuIHVzaW5nIGFsbHByb3RlY3RlZCBtb2RlLgogICAgICAgICAgICBCdWcgcmVwb3J0ZWQgYnkgV2FycmVuIFdhbmcuCgowNS8wMy8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBDb21taXQgcGF0Y2ggIzE5NTY2MDcgdG8gYWRkIC1NVCBzdXBwb3J0IGZyb20gUmljaGFyZCBCb3VsdG9uLgogICAgICAgICAgICBUaGlzIHBhdGNoIG1pcnJvcnMgdGhlIGdjYyAtTVQgb3B0aW9uIHdoaWNoIGFsbG93cyBvbmUgdG8gY2hhbmdlIHRoZSBkZWZhdWx0CiAgICAgICAgICAgIE1ha2VmaWxlIHRhcmdldCBiZWluZyBnZW5lcmF0ZWQgd2hlbiBnZW5lcmF0aW5nIG1ha2VmaWxlcyB3aXRoIHRoZSAtTSBmYW1pbHkKICAgICAgICAgICAgb2Ygb3B0aW9ucy4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICQgc3dpZyAtamF2YSAtTU0gLU1UIG92ZXJyaWRkZW5uYW1lIC1jKysgIGV4YW1wbGUuaQogICAgICAgICAgICAgIG92ZXJyaWRkZW5uYW1lOiBcCiAgICAgICAgICAgICAgIGV4YW1wbGUuaSBcCiAgICAgICAgICAgICAgIGV4YW1wbGUuaCAKCjA0LzMwLzIwMDg6IG1nb3NzYWdlCgkgICAgW0x1YV0gUmVtb3ZlZCBnZW5lcmF0aW9uIG9mIF93cmFwX2RlbGV0ZV9YWFhYWCAod3JhcHBlcmVkIGRlc3RydWN0b3IpCgkgICAgd2hpY2ggd2FzIHVudXNlZCBhbmQgY2F1c2luZyB3YXJuaW5nIHdpdGggZysrIC1XYWxsLgoJICAgIFJlbW92ZWQgb3RoZXIgdW51c2VkIHdhcm5pbmcgaW4gdHlwZW1hcHMuaSBhbmQgb3RoZXIgcGxhY2VzLgoJICAgIEFkZGVkIEV4YW1wbGVzL2x1YS9lbWJlZDMsIGFuZCBydW4gdGVzdHMgYSBmZXcgdGVzdCBjYXNlcy4KCjA0LzI0LzIwMDg6IG9sbHkKCSAgICBbUHl0aG9uXSBGaXggZ2VuZXJhdGVkIGNvZGUgZm9yIElCTSdzIEMrKyBjb21waWxlciBvbiBBSVggKHBhdGNoCgkgICAgZnJvbSBHb2VyYW4gVWRkZWJvcmcgaW4gU0YjMTkyODA0OCkuCgowNC8yNC8yMDA4OiBvbGx5CgkgICAgUmVuYW1lIEJTSVpFIGluIEV4YW1wbGVzL3Rlc3Qtc3VpdGUvYXJyYXlzX3Njb3BlLmkgdG8gQkJTSVpFIHRvCgkgICAgYXZvaWQgYSBjbGFzaCB3aXRoIEJTSVpFIGRlZmluZWQgYnkgaGVhZGVycyBvbiBBSVggd2l0aCBQZXJsCgkgICAgKHJlcG9ydGVkIGluIFNGIzE5MjgwNDgpLgoKMDQvMjAvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgQWRkIHRoZSBhYmlsaXR5IHRvIHdyYXAgYWxsIHByb3RlY3RlZCBtZW1iZXJzIHdoZW4gdXNpbmcgZGlyZWN0b3JzLgogICAgICAgICAgICBQcmV2aW91c2x5IG9ubHkgdGhlIHZpcnR1YWwgbWV0aG9kcyB3ZXJlIGF2YWlsYWJsZSB0byB0aGUgdGFyZ2V0IGxhbmd1YWdlLgogICAgICAgICAgICBOb3cgYWxsIHByb3RlY3RlZCBtZW1iZXJzLCAoc3RhdGljIGFuZCBub24tc3RhdGljIHZhcmlhYmxlcywgbm9uLXZpcnR1YWwgbWV0aG9kcwogICAgICAgICAgICBhbmQgc3RhdGljIG1ldGhvZHMpIGFyZSB3cmFwcGVkIHdoZW4gdXNpbmcgdGhlIGFsbHByb3RlY3RlZCBtb2RlLiBUaGUgYWxscHJvdGVjdGVkCiAgICAgICAgICAgIG1vZGUgaXMgdHVybmVkIG9uIGluIHRoZSBtb2R1bGUgZGVjbGFyYXRpb246CgogICAgICAgICAgICAgICVtb2R1bGUoZGlyZWN0b3JzPSIxIiwgYWxscHJvdGVjdGVkPSIxIikgbW9kdWxlbmFtZQoKVmVyc2lvbiAxLjMuMzUgKDcgQXByaWwgMjAwOCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjA0LzA3LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIEFkZCBtaXNzaW5nIHBvaW50ZXIgcmVmZXJlbmNlIHR5cGVtYXBzCgowNC8wNi8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc3RhY2sgb3ZlcmZsb3cgd2hlbiB1c2luZyB0eXBlbWFwIHdhcm5pbmcgc3VwcHJlc3Npb24sIGVnIAogICAgICAgICAgICAgICV3YXJuZmlsdGVyKFNXSUdXQVJOX1RZUEVNQVBfQ0hBUkxFQUtfTVNHKQoKMDQvMDUvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4IHNoYXJlZF9wdHIgdHlwZW1hcHMgc28gdGhhdCAlcHl0aG9ubm9uZHluYW1pYyBjYW4gYmUgdXNlZC4gQWxzbyBjb3JyZWN0cwogICAgICAgICAgICBkaXNwbGF5IG9mIHRoZSBwcm94eSBjbGFzcyB0eXBlLiBSZXBvcnRlZCBieSBSb2JlcnQgTHVwdG9uLgoKMDQvMDQvMjAwODogb2xseQoJICAgIFtQeXRob25dIEFkZCAlbmV3b2JqZWN0IHJlZmVyZW5jZSB0byBweXRob24gbWVtb3J5IG1hbmFnZW1lbnQgc3Vic2VjdGlvbiBvZiBtYW51YWwKCSAgICAocGF0Y2ggZnJvbSBtZGJlYWNoeSBpbiBTRiMxODk0NjEwKS4KCjAzLzI3LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBzaGFyZWRfcHRyIHR5cGVtYXBzIHdoZXJlIHRoZSBwb2ludGVyIHR5cGUgaXMgYSB0ZW1wbGF0ZWQgdHlwZSB3aXRoCiAgICAgICAgICAgIHdpdGggbW9yZSB0aGFuIG9uZSBwYXJhbWV0ZXIuIFJlcG9ydGVkIGJ5IFJvYmVydCBMdXB0b24uCgowMy8yNy8yMDA4OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBBZGRlZCBhIHR5cGVtYXAgRElTT1dOIGZvciBTV0lHVFlQRSogYW5kIFNXSUdUWVBFW10sIGFuZCBzdXBwb3J0IGZvciAlZGVsb2JqZWN0IGZlYXR1cmUuCiAgICAgICAgICAgIEFkZGVkIEV4YW1wbGVzL2x1YS9vd25lciB3aGljaCBkZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQuCgowMy8yNi8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gQXBwbHkgcGF0Y2ggIzE4NDQzMDEgZnJvbSBNb250eSBUYXlsb3IgdG8gc3VwcHJlc3MgZW51bSBjb25zdHJ1Y3RvcgogICAgICAgICAgICB1bnVzZWQgd2FybmluZ3MuCgowMy8yNi8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBcHBseSBwYXRjaCAjMTkyNDUyNCBmcm9tIENhc2V5IFJheW1vbmRzb24gd2hpY2ggZW5zdXJlcyB0aGUKICAgICAgICAgICAgIk5vIGNvbnN0cnVjdG9yIGRlZmluZWQiIG1lc3NhZ2UgaXMgZGlzcGxheWVkIHdoZW4gYXR0ZW1wdGluZyB0byBjYWxsIGEKICAgICAgICAgICAgY29uc3RydWN0b3Igb24gYSBjbGFzcyB0aGF0IGRvZXNuJ3QgaGF2ZSBhIGNvbnN0cnVjdG9yIHdyYXBwZXIsIGVnIGlmCiAgICAgICAgICAgIHRoZSBDKysgY2xhc3MgaXMgYWJzdHJhY3QuCgowMy8yNi8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBcHBseSBwYXRjaCAjMTkyNTcwMiBmcm9tIENhc2V5IFJheW1vbmRzb24gd2hpY2ggcmVtb3ZlcyB3YXJuaW5nIDUxMgogICAgICAgICAgICBmb3Igc3RkOjp2ZWN0b3Igd3JhcHBlcnMuCgowMy8yNi8yMDA4OiBvbGx5CgkgICAgW1B5dGhvbl0gQXBwbHkgR0NDIDQuMyB3YXJuaW5ncyBwYXRjaCBmcm9tIFBoaWxpcHAgVGhvbWFzCgkgICAgKFNGIzE5MjUxMjIpLgoKMDMvMjEvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gVGhyZWFkIHNhZmV0eSBwYXRjaCBmb3IgU1RMIGl0ZXJhdG9ycyBmcm9tIEFiaGluYW5kYW4gSmFpbi4KCjAzLzE3LzIwMDg6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEFkZGVkICVsdWFjb2RlIGZlYXR1cmUgdG8gYWRkIHNvdXJjZSBjb2RlIGludG8gd3JhcHBlcnMuCiAgICAgICAgICAgIFVwZGF0ZWQgZG9jdW1lbnRhdGlvbiB0byBkb2N1bWVudCB0aGlzLgogICAgICAgICAgICBBZGRlZCBFeGFtcGxlcy9sdWEvYXJyYXlzIHRvIHNob3cgaXRzIHVzZSAoYW5kIHR5cGVtYXBzKQoKMDMvMTcvMjAwODogb2xseQoJICAgIEZpeCBub25wb3J0YWJsZSBzZWQgdXNhZ2Ugd2hpY2ggZmFpbGVkIG9uIE1hYyBPUyBYIChhbmQgcHJvYmFibHkKCSAgICBvdGhlciBwbGF0Zm9ybXMpLiAgRml4ZXMgU0YjMTkwMzYxMi4KCjAzLzE3LzIwMDg6IG9sbHkKCSAgICBGaXggbWVtb3J5IGxlYWsgaW4gU1dJRydzIHBhcnNlciAoYmFzZWQgb24gcGF0Y2ggZnJvbSBSdXNzZWxsCgkgICAgQnJ5YW50IGluIFNGIzE5MTQwMjMpLgoKMDMvMTIvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgRml4IGJ1ZyAjMTg3ODI4NSAtIHVubmVjZXNzYXJ5IGNhc3QgZm9yIEMgc3RydWN0IGNyZWF0aW9uIHdyYXBwZXJzLgoKMDMvMTIvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gUmVtb3ZlIGRlYnVnZ2luZyBpbmZvIHdoZW4gdXNpbmcgc2hhcmVkX3B0ciBzdXBwb3J0CgowMy8wNi8yMDA4OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBVcGRhdGVkIGRvY3VtZW50YXRpb24gZm9yIEx1YSBleGNlcHRpb25zLgogICAgICAgICAgICBBZGRlZCBFeGFtcGxlcy9sdWEvZXhjZXB0aW9uIGFuZCBFeGFtcGxlcy9sdWEvZW1iZWQyLgogICAgICAgICAgICBTbWFsbCB1cGRhdGVzIHRvIHRoZSB0eXBlbWFwcy4KCjAzLzA0LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gQWRkIGNoYXIgKiYgdHlwZW1hcHMuCgowMy8wNC8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggb2NjYXNpb25hbCBzZWcgZmF1bHQgd2hlbiBhdHRlbXB0aW5nIHRvIHJlcG9ydCBvdmVybG9hZGVkIG1ldGhvZHMgYXMgYmVpbmcgaWdub3JlZC4KCjAyLzI5LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBGaXggIzE5MDQ1MzcgU3dpZyBjYXVzZXMgYSBQZXJsIHdhcm5pbmcgInggdXNlZCBvbmx5IG9uY2UiIGluIFBlcmwgNS4xMAogICAgICAgICAgICByZXBvcnRlZCBieSBBcmkgSm9sbWEKCjAyLzI5LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFkZCBzaGFyZWRfcHRyIHZhcmluL3Zhcm91dCB0eXBlbWFwcyBmb3Igd3JhcHBpbmcgZ2xvYmFsIHZhcmlhYmxlcy4KCjAyLzI1LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAkd3JhcG5hbWUgdG8gd29yayBpbiAlZXhjZXB0aW9uIChmaXhlcyBzb21lIHdyYXA6bmFtZSBhc3NlcnRpb25zKQoKVmVyc2lvbiAxLjMuMzQgKDI3IEZlYnJ1YXJ5IDIwMDgpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDIvMTMvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1JdIEZpeCB3cmFwcGluZyBvZiBnbG9iYWwgZnVuY3Rpb24gcG9pbnRlciB2YXJpYWJsZXMuCgowMi8xMy8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgbmV3IHNwZWNpYWwgdmFyaWFibGVzIGZvciB1c2Ugd2l0aGluICVleGNlcHRpb246CiAgICAgICAgICAgICAgJHdyYXBuYW1lIC0gbGFuZ3VhZ2Ugc3BlY2lmaWMgd3JhcHBlciBuYW1lCiAgICAgICAgICAgICAgJG92ZXJuYW1lIC0gaWYgYSBtZXRob2QgaXMgb3ZlcmxvYWRlZCB0aGlzIGNvbnRhaW5zIHRoZSBleHRyYSBtYW5nbGluZyB1c2VkIG9uIAogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBvdmVybG9hZGVkIG1ldGhvZAogICAgICAgICAgICAgICRkZWNsICAgICAtIHRoZSBmdWxseSBxdWFsaWZpZWQgQy9DKysgZGVjbGFyYXRpb24gb2YgdGhlIG1ldGhvZCBiZWluZyB3cmFwcGVkIAogICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhvdXQgdGhlIHJldHVybiB0eXBlCiAgICAgICAgICAgICAgJGZ1bGxkZWNsIC0gdGhlIGZ1bGx5IHF1YWxpZmllZCBDL0MrKyBkZWNsYXJhdGlvbiBvZiB0aGUgbWV0aG9kIGJlaW5nIHdyYXBwZWQgCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkaW5nIHRoZSByZXR1cm4gdHlwZQoKMDIvMTIvMjAwODogZHJqb2UKICAgICAgICAgICAgW1JdIE5vdyBzZXR0aW5nIFM0IGZsYWcgaW4gU1dJRyBjcmVhdGVkIG9iamVjdHMuICBUaGlzCiAgICAgICAgICAgIGZpeGVzIFItU1dJRyBmb3IgMi42IGFuZCB3YXJuaW5nIGZvciAyLjYgZmFpbHVyZSBoYXMgYmVlbiByZW1vdmVkLgoKMDIvMTEvMjAwODogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gQWRkZWQgYSBwYXRjaCBieSBUb3JzdGVuIExhbmRzY2hvZmYgdG8gZml4IHRoZSB1bmFyeSBtaW51cyBpc3N1ZQogICAgICAgICAgICBSYW4gJ2FzdHlsZSAtLXN0eWxlPWtyIC0yJyBhY3Jvc3MgbHVhLmN4eCB0byBuZWF0ZW4gaXQgdXAKCjAyLzEwLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEJ1bXAgU1dJR19SVU5USU1FX1ZFUlNJT04gdG8gNC4gVGhpcyBpcyBiZWNhdXNlIG9mIHRoZSByZWNlbnRseSBpbnRyb2R1Y2VkIEFQSSAKICAgICAgICAgICAgY2hhbmdlIGluIHRoZSBjb252ZXJzaW9uIGZ1bmN0aW9ucywgaWUgY2hhbmdlIGluIGRlZmluaXRpb24gb2Ygc3dpZ19jb252ZXJ0ZXJfZnVuYy4KICAgICAgICAgICAgQW55b25lIGNhbGxpbmcgU1dJR19UeXBlQ2FzdCBtdXN0IHBhc3MgaW4gYSB2YWxpZCB2YWx1ZSBmb3IgdGhlIG5ldyBhZGRpdGlvbmFsCiAgICAgICAgICAgICh0aGlyZCkgcGFyYW1ldGVyIGFuZCB0aGVuIGhhbmRsZSB0aGUgbmV3bHkgY3JlYXRlZCBtZW1vcnkgaWYgdGhlIHJldHVybmVkIHZhbHVlCiAgICAgICAgICAgIGlzIHNldCB0byBTV0lHX0NBU1RfTkVXX01FTU9SWSBlbHNlIGEgbWVtb3J5IGxlYWsgd2lsbCBlbnN1ZS4KCjAyLzA5LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEV4cGVyaW1lbnRhbCBzaGFyZWRfcHRyIHR5cGVtYXBzIGFkZGVkLiBVc2FnZSBpcyB0aGUgc2FtZSBhcyB0aGUgcmVjZW50bHkKICAgICAgICAgICAgYWRkZWQgSmF2YSBhbmQgQyMgc2hhcmVkX3B0ciB0eXBlbWFwcy4gVHdvIG1hY3JvcyBhcmUgYXZhaWxhYmxlLCBhbHRob3VnaCB0aGVzZQogICAgICAgICAgICBtYXkgd2VsbCBjaGFuZ2UgaW4gYSBmdXR1cmUgdmVyc2lvbjoKCiAgICAgICAgICAgIEZvciBiYXNlIGNsYXNzZXMgb3IgY2xhc3NlcyBub3QgaW4gYW4gaW5oZXJpdGFuY2UgY2hhaW46CiAgICAgICAgICAgICAgU1dJR19TSEFSRURfUFRSKFBST1hZQ0xBU1MsIFRZUEUpCiAgICAgICAgICAgIEZvciBkZXJpdmVkIGNsYXNzZXM6CiAgICAgICAgICAgICAgU1dJR19TSEFSRURfUFRSX0RFUklWRUQoUFJPWFlDTEFTUywgQkFTRUNMQVNTVFlQRSwgVFlQRSkKCiAgICAgICAgICAgIFRoZSBQUk9YWUNMQVNTIGlzIHRoZSBuYW1lIG9mIHRoZSBwcm94eSBjbGFzcywgYnV0IGlzIG9ubHkgcmVxdWlyZWQgZm9yIEphdmEvQyMuCiAgICAgICAgICAgIEV4YW1wbGUgdXNhZ2U6CgogICAgICAgICAgICAgICVpbmNsdWRlICJib29zdF9zaGFyZWRfcHRyLmkiCgogICAgICAgICAgICAgIFNXSUdfU0hBUkVEX1BUUihLbGFzcywgU3BhY2U6OktsYXNzKQogICAgICAgICAgICAgIFNXSUdfU0hBUkVEX1BUUl9ERVJJVkVEKEtsYXNzRGVyaXZlZCwgU3BhY2U6OktsYXNzLCBTcGFjZTo6S2xhc3NEZXJpdmVkKQoKICAgICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2UgewogICAgICAgICAgICAgICAgc3RydWN0IEtsYXNzIHsgLi4uIH07CiAgICAgICAgICAgICAgICBzdHJ1Y3QgS2xhc3NEZXJpdmVkIDogS2xhc3MgeyAuLi4gfTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICBGdXJ0aGVyIGRldGFpbHMgdG8gZm9sbG93IGluIGZ1dHVyZSBkb2N1bWVudGF0aW9uLCBidXQgdGhlIGZvbGxvd2luZyBmZWF0dXJlcwogICAgICAgICAgICBzaG91bGQgYmUgbm90ZWQ6CgogICAgICAgICAgICAtIE5vdCByZXN0cmljdGVkIHRvIGJvb3N0OjpzaGFyZWRfcHRyLCBlZyBzdGQ6OnRyMTo6c2hhcmVkX3B0ciBjYW4gYWxzbyBiZSB1c2VkLgogICAgICAgICAgICAtIEF2YWlsYWJsZSB0eXBlbWFwIGdyb3VwczoKICAgICAgICAgICAgICAoYSkgVHlwZW1hcHMgZm9yIHNoYXJlZF9wdHIgcGFzc2VkIGJ5IHZhbHVlLCByZWZlcmVuY2UsIHBvaW50ZXIgYW5kIHBvaW50ZXIgCiAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZS4KICAgICAgICAgICAgLSAoYikgVHlwZW1hcHMgZm9yIHBhc3NpbmcgYnkgcmF3IHZhbHVlLCByYXcgcG9pbnRlciwgcmF3IHJlZmVyZW5jZSwgcmF3IHBvaW50ZXIKICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlLiAKICAgICAgICAgICAgLSBUaGUgY29kZSBiZWluZyB3cmFwcGVkIGRvZXMgbm90IGV2ZW4gaGF2ZSB0byB1c2Ugc2hhcmVkX3B0ciwgU1dJRyBjYW4gdXNlCiAgICAgICAgICAgICAgc2hhcmVkX3B0ciBhcyB0aGUgdW5kZXJseWluZyBzdG9yYWdlIG1lY2hhbmlzbSBpbnN0ZWFkIG9mIGEgcmF3IHBvaW50ZXIgZHVlIHRvIAogICAgICAgICAgICAgIHRoZSB0eXBlbWFwcyBpbiBncm91cCAoYikgYWJvdmUuCiAgICAgICAgICAgIC0gTm8gYXJyYXkgc3VwcG9ydCBhcyBzaGFyZWRfcHRyIGRvZXMgbm90IHN1cHBvcnQgYXJyYXlzLgogICAgICAgICAgICAtIFRoaXMgd29ya3MgcXVpdGUgZGlmZmVyZW50bHkgdG8gdGhlIHVzdWFsIFNXSUcgc21hcnQgcG9pbnRlciBzdXBwb3J0IHdoZW4KICAgICAgICAgICAgICBvcGVyYXRvci0+IGlzIHBhcnNlZCBieSBTV0lHOgogICAgICAgICAgICAgIC0gQW4gYWRkaXRpb25hbCBzbWFydCBwb2ludGVyIGNsYXNzIGlzIG5vdCBnZW5lcmF0ZWQgcmVkdWNpbmcgY29kZSBibG9hdCBpbgogICAgICAgICAgICAgICAgdGhlIHdyYXBwZXJzLgogICAgICAgICAgICAgIC0gVXNpbmcgc21hcnQgcG9pbnRlcnMgYW5kIHJhdyBwb2ludGVycyBjYW4gYmUgbWl4ZWQgc2VhbWxlc3NseS4KICAgICAgICAgICAgICAtIE1pc3NpbmcgY29uc3RydWN0b3JzIGZvciB0aGUgc21hcnQgcG9pbnRlcnMgaXMgbm8gbG9uZ2VyIGEgcHJvYmxlbSBhbmQgc28KICAgICAgICAgICAgICAgIHNlcGFyYXRlIGZhY3RvcnkgdHlwZSBmdW5jdGlvbnMgZG8gbm90IGhhdmUgdG8gYmUgd3JpdHRlbiBhbmQgd3JhcHBlZC4KICAgICAgICAgICAgICAtIFRoZSBpbXBsaWNpdCBDKysgc2hhcmVkX3B0cjwgZGVyaXZlZCBjbGFzcyA+IHRvIHNoYXJlZF9wdHI8IGJhc2UgY2xhc3MgPgogICAgICAgICAgICAgICAgY2FzdCBhbHNvIHdvcmtzIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuIFRoaXMgbmVnYXRlcyB0aGUgbmVjZXNzaXR5IHRvIHdyaXRlCiAgICAgICAgICAgICAgICBhbiBleHBsaWNpdCBoZWxwZXIgY2FzdCBmdW5jdGlvbiBwcm92aWRpbmcgdGhlIHVwY2FzdCB3aGljaCB3b3VsZCBuZWVkCiAgICAgICAgICAgICAgICBjYWxsaW5nIHByaW9yIHRvIHBhc3NpbmcgYSBkZXJpdmVkIGNsYXNzIHRvIGEgbWV0aG9kIHRha2luZyBhIHNoYXJlZF9wdHIgdG8KICAgICAgICAgICAgICAgIGEgYmFzZSBjbGFzcy4KCjAyLzA5LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFkZCBzdXBwb3J0IGZvciBvdmVycmlkaW5nIHRoZSBjbGFzcyByZWdpc3RyYXRpb24gZnVuY3Rpb24gdmlhIGEgbmV3CiAgICAgICAgICAgICJzbWFydHB0ciIgZmVhdHVyZS4gVGhpcyBpcyBhIHZlcnkgbG93IGxldmVsIG9mIGN1c3RvbWlzYXRpb24gbW9zdCB1c2VycwogICAgICAgICAgICB3b3VsZCBuZXZlciBuZWVkIHRvIGtub3cuIFRoZSBmZWF0dXJlIHdpbGwgdHlwaWNhbGx5IGJlIHVzZWQgZm9yIGludHJ1c2l2ZSAKICAgICAgICAgICAgc21hcnQgcG9pbnRlcnMgYWxvbmcgd2l0aCBhZGRpdGlvbmFsIHR5cGVtYXBzLiBFeGFtcGxlIHVzYWdlIG9mIHRoZSBmZWF0dXJlOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgic21hcnRwdHIiLCBub2Jsb2NrPTEpIEZvbyB7IGJvb3N0OjpzaGFyZWRfcHRyPCBGb28gPiB9CiAgICAgICAgICAgICAgY2xhc3MgRm9vIHt9OwoKICAgICAgICAgICAgVGhlIGdlbmVyYXRlZCBGb29fc3dpZ3JlZ2lzdGVyIGZ1bmN0aW9uIHdpbGwgdGhlbiByZWdpc3RlciBib29zdDo6c2hhcmVkIDwgRm9vID4KICAgICAgICAgICAgKFNXSUdUWVBFX3BfYm9vc3RfX3NoYXJlZF9wdHJURm9vX3QgaW5zdGVhZCBvZiBTV0lHVFlQRV9wX0ZvbykgYXMgdGhlIHVuZGVybHlpbmcKICAgICAgICAgICAgdHlwZSBmb3IgaW5zdGFudGlhdGlvbnMgb2YgRm9vLgoKMDIvMDkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgRmVhdHVyZXMgbm93IHN1cHBvcnRzIHRoZSBvcHRpb25hbCAnbm9ibG9jaycgYXR0cmlidXRlIGZvciBhbGwgdXNhZ2Ugb2YgJWZlYXR1cmUuIAogICAgICAgICAgICBXaGVuIHNwZWNpZmllZCwgdGhlIHsgfSBicmFjZXMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgZmVhdHVyZSBjb2RlLiBUaGlzIGlzIGlkZW50aWNhbAogICAgICAgICAgICBpbiBiZWhhdmlvdXIgdG8gdXNhZ2Ugb2YgJ25vYmxvY2snIGluIHR5cGVtYXBzIGFuZCBpcyB1c2VkIHdoZW4gdGhlIHByZXByb2Nlc3NvcgogICAgICAgICAgICBpcyByZXF1aXJlZCB0byBvcGVyYXRlIG9uIHRoZSBjb2RlIGluIHRoZSBmZWF0dXJlIGFuZCB0aGUgZW5jbG9zaW5nIHsgfSBicmFjZXMKICAgICAgICAgICAgYXJlIG5vdCByZXF1aXJlZC4gRXhhbXBsZToKCiAgICAgICAgICAgICAgI2RlZmluZSBGT08gZm9vCiAgICAgICAgICAgICAgJWZlYXR1cmUoInNtYXJ0cHRyIiwgbm9ibG9jaz0iMSIpIHsgRk9POjpiYXIgfQoKICAgICAgICAgICAgVGhlIHByZXByb2Nlc3NvciB0aGVuIHJlZHVjZXMgdGhpcyBhcyBpZiB0aGlzIGhhZCBiZWVuIHVzZWQgaW5zdGVhZDoKCiAgICAgICAgICAgICAgJWZlYXR1cmUoInNtYXJ0cHRyIikgImZvbzo6YmFyIgoKMDIvMDEvMjAwODogb2xseQoJICAgIFtQeXRob25dIEZpeCBmb3JtYXQgc3RyaW5nIGJ1ZyAoU0YjMTg4MjIyMCkuCgowMS8zMS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGRpdGlvbnMgdG8gdGhlICV0eXBlcyBkaXJlY3RpdmUuIE5vdyB0aGUgY29udmVyc2lvbiAvIGNhc3RpbmcgY29kZSBjYW4gYmUKICAgICAgICAgICAgb3ZlcnJpZGRlbiB0byBzb21lIGN1c3RvbSBjb2RlIGluIHRoZSAldHlwZXMgZGlyZWN0aXZlLCBsaWtlIHNvOgoKICAgICAgICAgICAgICAldHlwZXMoZnJvbXR5cGUgPSB0b3R5cGUpICV7CiAgICAgICAgICAgICAgICAuLi4gY29kZSB0byBjb252ZXJ0IGZyb210eXBlIHRvIHRvdHlwZSBhbmQgcmV0dXJuIC4uLgogICAgICAgICAgICAgICV9CgogICAgICAgICAgICBUaGUgc3BlY2lhbCB2YXJpYWJsZSAkZnJvbSB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgb2YgdGhlCiAgICAgICAgICAgIHR5cGUgYmVpbmcgY29udmVydGVkIGZyb20uIFRoZSBjb2RlIG11c3QgcmV0dXJuIHRoZSB0b3R5cGUgY2FzdCB0byB2b2lkICouIEV4YW1wbGU6CgogICAgICAgICAgICAgIGNsYXNzIFRpbWU7CiAgICAgICAgICAgICAgY2xhc3MgRGF0ZTsKICAgICAgICAgICAgICBEYXRlICZUaW1lOjpkYXRlRnJvbVRpbWUoKTsKCiAgICAgICAgICAgICAgJXR5cGVzKFRpbWUgPSBEYXRlKSAlewogICAgICAgICAgICAgICAgVGltZSAqdCA9IChUaW1lICopJGZyb207CiAgICAgICAgICAgICAgICBEYXRlICZkID0gdC0+ZGF0ZUZyb21UaW1lKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gKHZvaWQgKikgJmQ7CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIHJlc3VsdGluZyBpbiB0aGUgY29udmVyc2lvbiAvIGNhc3RpbmcgY29kZSBsb29raW5nIHNvbWV0aGluZyBsaWtlOgoKICAgICAgICAgICAgICBzdGF0aWMgdm9pZCAqX3BfVGltZVRvX3BfRGF0ZSh2b2lkICp4KSB7CiAgICAgICAgICAgICAgICBUaW1lICp0ID0gKFRpbWUgKil4OwogICAgICAgICAgICAgICAgRGF0ZSAmZCA9IHQtPmRhdGVGcm9tVGltZSgpOwogICAgICAgICAgICAgICAgcmV0dXJuICh2b2lkICopICZkOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoaXMgaXMgYWR2YW5jZWQgdXNhZ2UsIHBsZWFzZSB1c2Ugb25seSBpZiB5b3UgdW5kZXJzdGFuZCB0aGUgcnVudGltZSB0eXBlIHN5c3RlbS4KCjAxLzMwLzIwMDg6IG1nb3NzYWdlCgkgICAgU21hbGwgdXBkYXRlIHRvIGRvY3VtZW50YXRpb24gaW4gVHlwZW1hcHMuaHRtbCwgdG8gd2FybiBhYm91dCB1c2Ugb2YgbG9jYWwgCgkgICAgdmFyaWFibGVzIGluIHR5cGVtYXBzIGZvciBtdWx0aXBsZSB0eXBlcy4KCjAxLzI1LzIwMDg6IHdzZnVsdG9uCgkgICAgW0phdmFdIEZpeCBidWcgcmVwb3J0ZWQgYnkgS2V2aW4gTWlsbHMgaW4gQVJSQVlTT0ZDTEFTU0VTIHR5cGVtYXBzIHdoZXJlIGFueQogICAgICAgICAgICBjaGFuZ2VzIG1hZGUgdG8gYW4gYXJyYXkgZWxlbWVudCBwYXNzZWQgZnJvbSBKYXZhIHRvIEMgYXJlIG5vdCByZWZsZWN0ZWQgYmFjawogICAgICAgICAgICBpbnRvIEphdmEuCgowMS8yNC8yMDA4OiBtZ29zc2FnZQoJICAgIE1vcmUgdXBkYXRlcyB0byB0aGUgY29uZmlndXJlIHNjcmlwdCBmb3IgZGV0ZWN0aW5nIGx1YS4KCSAgICBBbHNvIGxvb2tzIGluIC91c3IvaW5jbHVkZS9sdWEqCgkgICAgQWxzbyBjaGFuZ2VkIHR5cGVtYXBzLmkgbm90IHRvIGNoZWNrIGZvciBOVUxMIGJlZm9yZSBmcmVlaW5nIGEgcG9pbnRlcgoKMDEvMjEvMjAwODogd3NmdWx0b24KCSAgICBbUHl0aG9uXSBGb3IgU1RMIGNvbnRhaW5lcnMsIFNXSUcgbm8gbG9uZ2VyIGF0dGVtcHRzIHRvIGNvbnZlcnQgZnJvbSBvbmUKICAgICAgICAgICAgU1RMIGNvbnRhaW5lciB0byBhbm90aGVyLCBlZyBmcm9tIHN0ZDo6dmVjdG9yPGludD4gdG8gc3RkOjp2ZWN0b3I8ZG91YmxlPgogICAgICAgICAgICBvciBzdGQ6Omxpc3Q8aW50PiB0byBzdGQ6OnZlY3RvcjxpbnQ+IG9yIGV2ZW4gc3RkOjp2ZWN0b3I8Rm9vPiB0bwogICAgICAgICAgICBzdGQ6OnZlY3RvcjxCYXI+IGFzIGl0IHByZXZpb3VzbHkgZGlkLiBJbiBmYWN0IFNXSUcgbm8gbG9uZ2VyIGF0dGVtcHRzIHRvCiAgICAgICAgICAgIGNvbnZlcnQgYW55IFNXSUcgd3JhcHBlZCBDKysgcHJveHkgY2xhc3MgdGhhdCBpcyBhbHNvIGEgUHl0aG9uIHNlcXVlbmNlLAogICAgICAgICAgICB3aGVyZWFzIHByZXZpb3VzbHkgaXQgd291bGQuIEFueSBub24tU1dJRyBQeXRob24gc2VxdWVuY2Ugd2lsbCBzdGlsbCBiZQogICAgICAgICAgICBhY2NlcHRlZCB3aGVyZXZlciBhbiBTVEwgY29udGFpbmVyIGlzIGFjY2VwdGVkLiBPdmVybG9hZGVkIG1ldGhvZHMgdXNpbmcKICAgICAgICAgICAgY29udGFpbmVycyBzaG91bGQgYmUgZmFzdGVyLgoKMDEvMTgvMjAwODogd3NmdWx0b24KCSAgICBbQyNdIEFkZCAnZGlyZWN0b3JpbmF0dHJpYnV0ZXMnIGFuZCAnZGlyZWN0b3JvdXRhdHRyaWJ1dGVzJyB0eXBlbWFwIGF0dHJpYnV0ZXMKICAgICAgICAgICAgZm9yIHRoZSBpbXR5cGUgdHlwZW1hcC4gVGhlc2Ugc2hvdWxkIGNvbnRhaW4gQyMgYXR0cmlidXRlcyB3aGljaCB3aWxsCiAgICAgICAgICAgIGJlIGdlbmVyYXRlZCBpbnRvIHRoZSBDIyBkaXJlY3RvciBkZWxlZ2F0ZSBtZXRob2RzLgoKMDEvMTgvMjAwODogb2xseQoJICAgIEZpeCBoYW5kbGluZyBvZiBieXRlIHZhbHVlIDI1NSBpbiBpbnB1dCBmaWxlcyBvbiBwbGF0Zm9ybXMgd2hlcmUKCSAgICBjaGFyIGlzIHNpZ25lZCAoaXQgd2FzIGdldHRpbmcgbWFwcGVkIHRvIEVPRikuICBGaXhlcyBTRiMxNTE4MjE5LgoKMDEvMTYvMjAwODogd3NmdWx0b24KCSAgICBGaXggdGVtcGxhdGUgbWVtYmVyIHZhcmlhYmxlcyB3cmFwcGVkIGJ5IGEgc21hcnQgcG9pbnRlci4gQnVnIHJlcG9ydGVkIAogICAgICAgICAgICBieSBSb2JlcnQgTHVwdG9uLgoKMDEvMTQvMjAwODogbWdvc3NhZ2UKCSAgICBTdWJzdGFudGlhbCBjaGFuZ2VzIHRvIGNvbmZpZ3VyZSBzY3JpcHQgZm9yIGRldGVjdGluZyBsdWEuCgkgICAgICBDb2RlIGNhbiBub3cgbGluayB0byBsaWJsdWEuYSwgbGlibHVhNTAuYSBvciBsaWJsdWE1MS5hCgkgICAgICBJdCdzIGFsc28gYSBsb3QgbmVhdGVyIG5vdy4KCjEyLzE2LzIwMDc6IHdzZnVsdG9uCgkgICAgW1BlcmxdIEJhY2tlZCBvdXQgIzE3OTg3MjggLSBudW1iZXJzIGNhbiBiZSBwYXNzZWQgdG8gZnVuY3Rpb25zIHRha2luZyBjaGFyICoKCjEyLzE2LzIwMDc6IHdzZnVsdG9uCgkgICAgRml4ICMxODMyNjEzIC0gVGVtcGxhdGVzIGFuZCBzb21lIHR5cGVkZWZzIGludm9sdmluZyBwb2ludGVycyBvciBmdW5jdGlvbiBwb2ludGVycwoKMTIvMTIvMjAwNzogd3NmdWx0b24KCSAgICBbSmF2YV0gRml4ICMxNjMyNjI1IC0gQ29tcGlsYXRpb24gZXJyb3JzIG9uIFZpc3VhbCBDKysgNiB3aGVuIHVzaW5nIGRpcmVjdG9ycy4KCjEyLzEyLzIwMDc6IHdzZnVsdG9uCgkgICAgW1BlcmxdIEZpeCAjMTc5ODcyOCAtIG51bWJlcnMgY2FuIGJlIHBhc3NlZCB0byBmdW5jdGlvbnMgdGFraW5nIGNoYXIgKi4KCjEyLzEyLzIwMDc6IHdzZnVsdG9uCgkgICAgRml4ICMxODE5ODQ3ICV0ZW1wbGF0ZSB3aXRoIGp1c3Qgb25lIGRlZmF1bHQgdGVtcGxhdGUgcGFyYW1ldGVyIAoKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUID0gaW50PiBjbGFzcyBGb28gey4uLn07CiAgICAgICAgICAgICAgJXRlbXBsYXRlKEZvb0RlZmF1bHQpIEZvbzw+OwoKMTIvMTIvMjAwNzogbWdvc3NhZ2UKCSAgICBbTHVhXSBTbWFsbCBjb3JyZWN0aW9uIG9uIEx1YS5odG1sCgoxMi8wOS8yMDA3OiB3c2Z1bHRvbgoJICAgIEFwcGx5IHBhdGNoICMxODM4MjQ4IGZyb20gTW9udHkgVGF5bG9yIGZvciB2cGF0aCBidWlsZHMgb2YgU1dJRy4KCjEyLzA4LzIwMDc6IHdzZnVsdG9uCgkgICAgW0x1YV0gRml4ZXMgdG8gcmVtb3ZlIGdjYy00LjIgd2FybmluZ3MKCjEyLzA2LzIwMDc6IHdzZnVsdG9uCgkgICAgRml4ICMxNzM0NDE1IC0gdGVtcGxhdGUgdGVtcGxhdGUgcGFyYW1ldGVycyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIHN1Y2ggYXM6CgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIHRfaXRlbSwgdGVtcGxhdGU8dHlwZW5hbWU+IGNsYXNzIHRfYWxsb2MgPSBwZmM6OmFsbG9jX2Zhc3QgPgogICAgICAgICAgICAgICAgY2xhc3MgbGlzdF90IDogcHVibGljIGxpc3RfaW1wbF90PHRfaXRlbSxwZmM6OmFycmF5X3Q8dF9pdGVtLHRfYWxsb2M+ID4geyAuLi4gfTsKCjEyLzA0LzIwMDc6IG1nb3NzYWdlCgkgICAgW2x1YV0gRml4IGEgYnVnIGluIHRoZSBjbGFzcyBoaWVyYWNoeSBjb2RlLCB3aGVyZSB0aGUgbWV0aG9kcyB3ZXJlIG5vdCBwcm9wYWdhdGVkLCAKCSAgICBpZiB0aGUgbmFtZSBvcmRlcmluZyB3YXMgaW4gYSBjZXJ0YWluIG9yZGVyLgoJICAgIEFkZGVkIG5ldyBleGFtcGxlIHByb2dyYW1zIChkdWFsLCBlbWJlZCkgYW5kIHJ1bnRpbWUgdGVzdHMgZm9yIHRlc3Qtc3VpdGUuCgoxMS8zMC8yMDA3OiB3c2Z1bHRvbgoJICAgIEZpeCB1c2luZyBzdGF0ZW1lbnRzIHVzaW5nIGEgYmFzZSBjbGFzcyBtZXRob2Qgd2hlcmUgdGhlIG1ldGhvZHMgd2VyZSBvdmVybG9hZGVkLgogICAgICAgICAgICBEZXBlbmRpbmcgb24gdGhlIG9yZGVyIG9mIHRoZSB1c2luZyBzdGF0ZW1lbnRzIGFuZCBtZXRob2QgZGVjbGFyYXRpb25zLCB0aGVzZQogICAgICAgICAgICB3ZXJlIHByZXZpb3VzbHkgZ2VuZXJhdGluZyB1bmNvbXBpbGFibGUgd3JhcHBlcnMsIGVnOgoKICAgICAgICAgICAgICBzdHJ1Y3QgRGVyaXZlZCA6IEJhc2UgewogICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGZ1bmsoKTsKICAgICAgICAgICAgICAgIHVzaW5nIEJhc2U6OmZ1bms7CiAgICAgICAgICAgICAgfTsKClZlcnNpb24gMS4zLjMzIChOb3ZlbWJlciAyMywgMjAwNykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTEvMjEvMjAwNzogbWlrZWwKCSAgICBbYWxsZWdyb2NsXSBvbWl0IHByaXZhdGUgc2xvdCB0eXBlIGluZm8gaW4gdGhlIGNsYXNzZXMvdHlwZXMKCSAgICBkZWZpbmVkIG9uIHRoZSBsaXNwIHNpZGUuIEZpeCBidWcgaW4gbWFwcGluZyBvZiBDLysrIHR5cGVzCgkgICAgdG8gbGlzcCB0eXBlcy4gRml4IHR5cG8gaW4gbW9kdWxlcyBnZW5lcmF0ZWQgZGVmcGFja2FnZSBmb3JtLgoJICAgIEhhdmUgc3RkOjpzdHJpbmcgKidzIGF1dG9tYXRpY2FsbHkgbWFyc2hhbGxlZCBiZXR3ZWVuIGZvcmVpZ24KCSAgICBhbmQgbGlzcCBzdHJpbmdzLgoJCjExLzIwLzIwMDc6IG9sbHkKCSAgICBbUHl0aG9uXSBGaWxsIGluIFB5dGhvbiBEaWN0aW9uYXJ5IGZ1bmN0aW9ucyBsaXN0IChwYXRjaCBmcm9tCgkgICAgSmVsbWVyIFZlcm5vb2lqIHBvc3RlZCB0byBzd2lnLWRldmVsKS4KCjExLzIwLzIwMDc6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBidWcgaW4gdGhlIEMgc2Nhbm5lciByZWxhdGVkIHRvIGJhY2tzbGFzaCBjaGFyYWN0ZXJzLgoKMTEvMTkvMjAwNzogd3NmdWx0b24KCSAgICBbUGVybF0gRml4IGJyb2tlbiBjb21waWxhdGlvbiBvZiBDKysgd3JhcHBlcnMgb24gc29tZSBjb21waWxlcnMuCgoxMS8xNi8yMDA3OiBvbGx5CgkgICAgW1B5dGhvbl0gRG9uJ3QgcGFzcyBQeV9zc2l6ZV90IGZvciBhICVkIHByaW50Zi1saWtlIGZvcm1hdCBhcwoJICAgIHRoYXQncyB1bmRlZmluZWQgYmVoYXZpb3VyIHdoZW4gc2l6ZW9mKFB5X3NzaXplX3QpICE9IHNpemVvZihpbnQpLgoKVmVyc2lvbiAxLjMuMzIgKE5vdmVtYmVyIDE1LCAyMDA3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMS8xNC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gUGFja2FnZSBuYW1lIGFuZCBkbGwgbmFtZSBpcyBub3cgdGhlIHNhbWUgYXMgdGhlIFNXSUcgbW9kdWxlCiAgICAgICAgICAgIG5hbWUuIEl0IHVzZWQgdG8gYmUgdGhlIG1vZHVsZSBuYW1lIHdpdGggX3dyYXAgYXMgYSBzdWZmaXguIFRoZSBwYWNrYWdlCiAgICAgICAgICAgIGFuZCBkbGwgbmFtZXMgY2FuIGJlIG1vZGlmaWVkIHVzaW5nIHRoZSAtcGFja2FnZSBhbmQgLWRsbCBjb21tYW5kbGluZQogICAgICAgICAgICBvcHRpb25zLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8xMS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gQWRkIHN1cHBvcnQgZm9yIFdpbmRvd3MgKFZpc3VhbCBDKysgOCB0ZXN0ZWQpCgoxMS8xMC8yMDA3OiBvbGx5CgkgICAgW3BocF0gRml4IG1ha2VmaWxlIGdlbmVyYXRlZCBieSAtbWFrZSAoU0YjMTYzMzY3OSkuICBVcGRhdGUKCSAgICBkb2N1bWVudGF0aW9uIHRvIG1hcmsgIi1tYWtlIiBhcyBkZXByZWNhdGVkIChub25lIG9mIHRoZSBvdGhlcgoJICAgIFNXSUcgYmFja2VuZHMgc2VlbSB0byBvZmZlciBzdWNoIGEgZmVhdHVyZSwgaXQgY2FuJ3QgcmVhbGlzdGljYWxseQoJICAgIGdlbmVyYXRlIGEgZnVsbHkgcG9ydGFibGUgbWFrZWZpbGUsIGFuZCB0aGUgY29tbWFuZHMgdG8gYnVpbGQgYW4KCSAgICBleHRlbnNpb24gYXJlIGVhc3kgZW5vdWdoIHRvIHdyaXRlIGZvciB0aGUgdXNlcidzIHByZWZlcnJlZCBidWlsZAoJICAgIHRvb2wpLiAgQWxzbyByZWNvbW1lbmQgYWdhaW5zdCB0aGUgdXNlIG9mICItcGhwZnVsbCIgKGl0J3Mgb25seQoJICAgIHJlYWxseSB1c2VmdWwgd2hlbiBzdGF0aWMgbGlua2luZywgYW5kIGEgZHluYW1pY2FsbHkgbG9hZGFibGUKCSAgICBtb2R1bGUgaXMgdmlydHVhbGx5IGFsd2F5cyB0aGUgYmV0dGVyIGFwcHJvYWNoKS4KCjExLzA5LzIwMDc6IG9sbHkKCSAgICBGaXggLS1oZWxwIG91dHB1dCB0byBub3RlIHRoYXQgYGV4cG9ydCBTV0lHX0ZFQVRVUkVTJyBpcyByZXF1aXJlZC4KCjEwLzI5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSXSBGaXggc2VnIGZhdWx0IG9uIFdpbmRvd3MKICAgICAgICAgICAgW1JdIEV4YW1wbGVzIFIgc2NyaXB0cyBhcmUgbm93IHBsYXRmb3JtIGluZGVwZW5kZW50CgoxMC8zMC8yMDA3OiBtZ29zc2FnZQoJICAgIFtsdWFdIGZpeGVkIGJ1ZyBpbiB0ZW1wbGF0ZSBjbGFzc2VzIHdoaWNoIGNhc2VzIHRlbXBsYXRlX2RlZmF1bHQyCgkgICAgYW5kIHRlbXBsYXRlX3NwZWNpYWxpemF0aW9uX2RlZmFyZyB0byBmYWlsLgoJICAgIEFkZGVkIHNldmVyYWwgd2FybmluZyBmaWx0ZXJzIGludG8gdGhlIG92ZXJsb2FkJ3MgdGVzdCBjYXNlcy4KCSAgICBBZGRlZCBydW50aW1lIHRlc3RzIGZvciBzZXZlcmFsIGNvZGVzLgoJICAgIFlvdSBjYW4gbm93IG1ha2UgY2hlY2stbHVhLXRlc3Qtc3VpdGUgd2l0aCBubyBlcnJvcnMgYW5kIG9ubHkgYSBmZXcgd2FybmluZ3MuCgoxMC8zMC8yMDA3OiBvbGx5CgkgICAgW2d1aWxlXSBGaXggdGhlIGNvbmZpZ3VyZSB0ZXN0IHRvIHB1dCBHVUlMRUxJTksgaW4gTElCUyBub3QgTERGTEFHUwoJICAgIChTRiMxODIyNDMwKS4KCjEwLzMwLzIwMDc6IG9sbHkKCSAgICBbZ3VpbGVdIEZpeCB0aGUgZ3VpbGUgZXhhbXBsZXMgb24gNjQtYml0IHBsYXRmb3Jtcy4KCjEwLzI5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IG1lbWJlciBwb2ludGVycyBvbiA2NCBiaXQgcGxhdGZvcm1zLgoKMTAvMjgvMjAwNzogb2xseQoJICAgIFtsdWFdIEZpeCBzd2lnX2x1YV9jbGFzcyBpbnN0YW5jZXMgdG8gYmUgc3RhdGljIHRvIGFsbG93IG11bHRpcGxlCgkgICAgU1dJRyB3cmFwcGVycyB0byBiZSBjb21waWxlZCBpbnRvIHRoZSBzYW1lIGV4ZWN1dGFibGUgc3RhdGljYWxseS4KCSAgICBQYXRjaCBmcm9tIEFuZHJlYXMgRnJlZHJpa3Nzb24gKHBvc3RlZCB0byB0aGUgc3dpZyBtYWlsaW5nIGxpc3QpLgoKMTAvMjgvMjAwNzogb2xseQoJICAgIFtsdWFdIEZpeCBFeGFtcGxlcy9sdWEgdG8gcGFzcyBTUkNTIGZvciBDIHRlc3RzIHJhdGhlciB0aGFuIENYWFNSQ1MuCgkgICAgVGhlIGNvZGUgYXMgaXQgd2FzIGhhcHBlbmVkIHRvIHdvcmsgb24geDg2LCBidXQgYnJva2Ugb24geDg2XzY0IChhbmQKCSAgICBwcm9iYWJseSBhbnkgb3RoZXIgcGxhdGZvcm1zIHdoaWNoIHJlcXVpcmUgLWZQSUMpLgoKMTAvMjgvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBOZXcgYXBwcm9hY2ggZm9yIGZpeGluZyB1bmluaXRpYWxpc2VkIHZhcmlhYmxlIHVzYWdlIG9uIGVycm9yIGluIGRpcmVjdG9yCiAgICAgICAgICAgIG1ldGhvZHMgdXNpbmcgdGhlIG5ldyB0ZW1wbGF0ZWQgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb24gU3dpZ1ZhbHVlSW5pdCgpLgoKMTAvMjgvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIFVzZSBtb3JlIGVmZmljaWVudCBTdlBWX25vbGVuKHgpIGluc3RlYWQgb2YgU3ZQVih4LFBMX25hKSBpZiBTdlBWX25vbGVuIGlzCiAgICAgICAgICAgIHN1cHBvcnRlZC4KCjEwLzI2LzIwMDc6IHd1enplYgoJICAgIFtDaGlja2VuXSBGaXggZ2xvYmFsIHZhcmlhYmxlcyBvZiBjbGFzcyBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMuCgkgICAgT3RoZXIgbWlub3IgZml4ZXMsIHNvIGFsbCB0ZXN0cyBpbiB0aGUgY2hpY2tlbiB0ZXN0IHN1aXRlIG5vdyBwYXNzCgoxMC8yNS8yMDA3OiBvbGx5CgkgICAgRml4IFVUTCB0eXBlY2hlY2sgbWFjcm8gZm9yIGEgZnVuY3Rpb24gdGFraW5nIGNoYXJbXSBvciBjb25zdAoJICAgIGNoYXJbXSAoU0YjMTgyMDEzMikuCgoxMC8yMi8yMDA3OiBta29lcHBlCgkgICAgW0d1aWxlXSBGaWx0ZXIgb3V0IC1hbnNpIC1wZWRhbnRpYyBmcm9tIENGTEFHUyB3aGlsZSBjb21waWxpbmcgdGVzdCBwcm9ncmFtcyBmb3IgR3VpbGUKCSAgICBpbiBjb25maWd1cmUuICBUaGlzIGVuYWJsZXMgcnVubmluZyB0aGUgdGVzdCBzdWl0ZSBmb3IgR3VpbGUgaWYgaXQgaXMgaW5zdGFsbGVkIGFuZAoJICAgIHVzYWJsZS4KCjEwLzIyLzIwMDc6IG1rb2VwcGUKCSAgICBbR3VpbGUgLXNjbV0gRml4IHRlc3RjYXNlcyBhcHBseV9zaWduZWRfY2hhciBhbmQgYXBwbHlfc3RyaW5ncwoJICAgIGJ5IGFkZGluZyBleHBsaWNpdCBjYXN0cyB0byB0aGUgYXBwcm9wcmlhdGUgJGx0eXBlLgoKMTAvMjIvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBGaXggdW5pbml0aWFsaXNlZCB2YXJpYWJsZSB1c2FnZSBvbiBlcnJvciBpbiBkaXJlY3RvciBtZXRob2RzLgoKMTAvMTkvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBCdWcgIzE3OTQyNDcgLSBmaXggZ2VuZXJhdGVkIGNvZGUgZm9yIGRlcml2ZWQgY2xhc3NlcyB3aGVuIGNzYmFzZSBvciBqYXZhYmFzZQogICAgICAgICAgICB0eXBlbWFwcyBhcmUgdXNlZCB3aXRoIHRoZSByZXBsYWNlPSIxIiBhdHRyaWJ1dGUuCgoxMC8xOS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBEb2NzIHVwZGF0ZWQgdG8gc3VnZ2VzdCB1c2luZyBkaXN0dXRpbHMuIFBhdGNoICMxNzk2NjgxIGZyb20gQ2hyaXN0b3BoZXIgQmFya2VyLgoKMTAvMTkvMjAwNzogb2xseQoJICAgIFtwZXJsNV0gQ2xlYXIgZXJybm8gYmVmb3JlIGNhbGxzIHRvIHN0cnRvbCgpLCBzdHJ0b3VsKCksIHN0cnRvbGwoKQoJICAgIGFuZCBzdHJ0b3VsbCgpIHdoaWNoIHdlIGNoZWNrIGVycm5vIGFmdGVyIHRvIGF2b2lkIHNlZWluZyBhIGp1bmsKCSAgICB2YWx1ZSBvZiBlcnJubyBpZiB0aGVyZSBpc24ndCBhbiBlcnJvciBpbiB0aGUgY2FsbC4KCjEwLzE2LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIERlcHJlY2F0ZSAlYXR0cmlidXRlX3JlZiBhbmQgcmVwbGFjZSB3aXRoICVhdHRyaWJ1dGVyZWYuIFRoZXJlIGlzIGp1c3QgYW4gYXJndW1lbnQKICAgICAgICAgICAgb3JkZXIgY2hhbmdlIGluIG9yZGVyIHRvIG1haW50YWluIGNvbnNpc3RlbmN5IHdpdGggJWF0dHJpYnV0ZSwgZnJvbToKCiAgICAgICAgICAgICAgJWF0dHJpYnV0ZV9yZWYoQ2xhc3MsIEF0dHJpYnV0ZVR5cGUsIEFjY2Vzc29yTWV0aG9kLCBBdHRyaWJ1dGVOYW1lKQogICAgICAgICAgICB0bwogICAgICAgICAgICAgICVhdHRyaWJ1dGVyZWYoQ2xhc3MsIEF0dHJpYnV0ZVR5cGUsIEF0dHJpYnV0ZU5hbWUsIEFjY2Vzc29yTWV0aG9kKQoKMTAvMTYvMjAwNzogb2xseQoJICAgIFtUY2xdIEZpeCBzZXZlcmFsIG9jY3VycmVuY2VzIG9mICJ3YXJuaW5nOiBkZXByZWNhdGVkIGNvbnZlcnNpb24KCSAgICBmcm9tIHN0cmluZyBjb25zdGFudCB0byAnY2hhcionIiBmcm9tIEdDQyA0LjIgaW4gZ2VuZXJhdGVkIEMvQysrCgkgICAgY29kZS4KCjEwLzE2LzIwMDc6IG9sbHkKCSAgICBbUEhQXSBGaXggbWFueSBvY2N1cnJlbmNlcyBvZiAid2FybmluZzogZGVwcmVjYXRlZCBjb252ZXJzaW9uIGZyb20KCSAgICBzdHJpbmcgY29uc3RhbnQgdG8gJ2NoYXIqJyIgZnJvbSBHQ0MgNC4yIGluIGdlbmVyYXRlZCBDL0MrKyBjb2RlCgkgICAgd2hlbiBjb21waWxpbmcgd2l0aCBhIG5ldyBlbm91Z2ggdmVyc2lvbiBvZiBQSFAgNSAodGVzdGVkIHdpdGgKCSAgICBQSFAgNS4yLjMsIGJ1dCBQSFAgNS4yLjEgaXMgcHJvYmFibHkgdGhlIG1pbmltdW0gcmVxdWlyZW1lbnQpLgoKMTAvMTUvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggIzE3OTcxMzMgZnJvbSBEYXZpZCBQaWVwZ3Jhc3MgZml4ZXMgJWF0dHJpYnV0ZSB3aGVuIHRoZSBnZXR0ZXIgaGFzIHRoZSBzYW1lIG5hbWUKICAgICAgICAgICAgYXMgdGhlIGF0dHJpYnV0ZSBuYW1lIGFuZCBubyBsb25nZXIgZ2VuZXJhdGUgbm9uLWZ1bmN0aW9uYWwgc2V0dGVyIGZvciByZWFkLW9ubHkgYXR0cmlidXRlcy4KCjEwLzE1LzIwMDc6IG9sbHkKCSAgICBbVGNsXSBQcmV2ZW50IFNXSUdfVGNsX0NvbnZlcnRQdHIgZnJvbSBjYWxsaW5nIHRoZSB1bmtub3duIHByb2MuCgkgICAgQWRkIEV4YW1wbGVzL3RjbC9zdGRfdmVjdG9yLyB3aGljaCB0aGlzIGNoYW5nZSBmaXhlcy4gIFBhdGNoCgkgICAgaXMgZnJvbSAiQ2xpZmYgQyIgaW4gU0YjMTgwOTgxOS4KCjEwLzEyLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBBZGQgRGV0YWNoQ3VycmVudFRocmVhZCBiYWNrIGluIGZvciBkaXJlY3RvcnMuIFNlZSBlbnRyeSBkYXRlZCAwOC8xMS8yMDA2IGFuZAogICAgICAgICAgICBzZWFyY2ggZm9yIERldGFjaEN1cnJlbnRUaHJlYWQgb24gdGhlIG1haWxpbmcgbGlzdHMgZm9yIGRldGFpbHMuIFRoZSBjcmFzaGVzIG9uIFNvbGFyaXMKICAgICAgICAgICAgc2VlbSB0byBiZSBvbmx5IHByZXNlbnQgaW4gamRrLTEuNC4yIGFuZCBsb3dlciAoamRrLTEuNS4wIGFuZCBqZGstMS42LjAgYXJlIG9rYXkpLCBzbwogICAgICAgICAgICBhbnlvbmUgdXNpbmcgZGlyZWN0b3JzIHNob3VsZCB1c2UgYSByZWNlbnQgamRrIG9uIFNvbGFyaXMsIG9yIGRlZmluZSAoc2VlIGRpcmVjdG9yLnN3ZykKICAgICAgICAgICAgU1dJR19KQVZBX05PX0RFVEFDSF9DVVJSRU5UX1RIUkVBRCB0byB0aGUgQysrIGNvbXBpbGVyIHRvIGdldCBvbGQgYmVoYXZpb3VyLgoKMTAvMTIvMjAwNzogd3NmdWx0b24KCSAgICBbSmF2YV0gRW5zdXJlIHRoZSBwcmVtYXR1cmUgZ2FyYmFnZSBjb2xsZWN0aW9uIHByZXZlbnRpb24gcGFyYW1ldGVyIChwZ2NwcCkgaXMgZ2VuZXJhdGVkCiAgICAgICAgICAgIHdoZW4gdGhlcmUgYXJlIEMgY29tbWVudHMgaW4gdGhlIGp0eXBlIGFuZCBqc3R5cGUgdHlwZW1hcHMuCgoxMC8xMi8yMDA3OiB3dXp6ZWIKCSAgICBBZGRlZCBhIHRlc3RzdWl0ZSBlbnRyeSBmb3IgQnVnICMxNzM1OTMxCgoxMC8wOS8yMDA3OiBvbGx5CgkgICAgQXV0b21hdGljYWxseSByZXJ1biBhdXRvZ2VuLnNoIGlmIGNvbmZpZ3VyZS5pbiBpcyBtb2RpZmllZC4KCjEwLzA5LzIwMDc6IG9sbHkKCSAgICBFbmhhbmNlIGNoZWNrLSUtdGVzdC1zdWl0ZSBydWxlIGFuZCBmcmllbmRzIHRvIGdpdmUgYSBtb3JlIGhlbHBmdWwKCSAgICBlcnJvciBtZXNzYWdlIGlmIHlvdSB0cnkgdGhlbSBmb3IgYSBsYW5ndWFnZSB3aGljaCBkb2Vzbid0IGV4aXN0CgkgICAgKGUuZy4gIm1ha2UgY2hlY2stcGhwLXRlc3Qtc3VpdGUiIHJhdGhlciB0aGFuIHRoZSBjb3JyZWN0CgkgICAgIm1ha2UgY2hlY2stcGhwNC10ZXN0LXN1aXRlIikuCgoxMC8wOS8yMDA3OiBvbGx5CgkgICAgQWRkIG1ha2UgcnVsZSB0byByZWdlbmVyYXRlIE1ha2VmaWxlIGZyb20gTWFrZWZpbGUuaW4gaWYgaXQgaGFzCgkgICAgY2hhbmdlZC4KCjEwLzA5LzIwMDc6IG9sbHkKCSAgICBbcGhwXSBGaXggbG9uZy1zdGFuZGluZyBtZW1vcnkgbGVhayBpbiB3cmFwcGVkIGNvbnN0cnVjdG9ycyBhbmQKCSAgICB3cmFwcGVkIGZ1bmN0aW9ucy9tZXRob2RzIHdoaWNoIHJldHVybiBhbiBvYmplY3QuCgoxMC8wOC8yMDA3OiBvbGx5CgkgICAgRml4IE1ha2VmaWxlLmluIHRvIHJlYWQgY2hlY2subGlzdCBmaWxlcyBjb3JyZWN0bHkgaW4gYSBWUEFUSAoJICAgIGJ1aWxkLgoKMTAvMDcvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBFeHBlcmltZW50YWwgc2hhcmVkX3B0ciB0eXBlbWFwcyBhZGRlZAoKMDkvMjcvMjAwNzogbWdvc3NhZ2UKCSAgICBbbHVhXSBhZGRlZCBtb3JlIHZlcmJvc2UgZXJyb3IgbWVzc2FnZXMgZm9yIGluY29ycmVjdCB0eXBlY2hlY2tzLgoJICAgIEFkZGVkIGEgcm91dGluZSB3aGljaCBjaGVja3MgdGhlIGV4YWN0IG51bWJlciBvZiBwYXJhbWV0ZXJzIHBhc3NlZCB0byBhIGZ1bmN0aW9uCgkgICAgKGJyZWFrcyBvcGVyYXRvcl9vdmVybG9hZGluZyBmb3IgdW5hcnkgbWludXMgb3BlcmF0b3IsIGN1cnJlbnRseSBkaXNhYmxlZCkuCgkgICAgUmVvcmdhbmlzZWQgdGhlIGx1YXR5cGVtYXBzLnN3ZyB0byB0aWR5IGl0IHVwLgoJICAgIEFkZGVkIGEgbG90IG9mICVpZ25vcmVzIG9uIHRoZSBvcGVyYXRvcnMgbm90IHN1cHBvcnRlZCBieSBsdWEuCgkgICAgQWRkZWQgc3VwcG9ydCBmb3IgY29uc3RhbnQgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzICYgcnVudGVzdCBmb3IgbWVtYmVyX3BvaW50ZXIuaQoJICAgIEFkZGVkIGZpcnN0IHZlcnNpb24gb2Ygd2NoYXIuaQoKMDkvMjUvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSB0aHJvd3MgdHlwZW1hcHMgZm9yIHN0ZDo6d3N0cmluZyB1c2luZyBDIyBwYXRjaCAjMTc5OTA2NCBmcm9tIERhdmlkIFBpZXBncmFzcwoKMDkvMjQvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW1RjbF0gQXBwbHkgIzE3NzEzMTMgdG8gZml4IGJ1ZyAjMTY1MDIyOSAtIGZpeGVzIGxvbmcgbG9uZyBhbmQgdW5zaWduZWQgbG9uZyBsb25nCiAgICAgICAgICAgIGhhbmRsaW5nLgoKMDkvMjAvMjAwNzogb2xseQoJICAgIFtKYXZhXSBFbGltaW5hdGUgc29tZSB1bm5lY2Vzc2FyeSB1c2VzIG9mIGEgdGVtcG9yYXJ5IGJ1ZmZlcgoJICAgIGFsbG9jYXRlZCB1c2luZyBuZXdbXS4gIFNGIzE3OTY2MDkuCgowOS8xOS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFRoZSAkY3NpbnB1dCBzcGVjaWFsIHZhcmlhYmxlIGNhbiBiZSB1c2VkIGluIHRoZSBjc3ZhcmluIHR5cGVtYXAgd2hlcmUgaXQgaXMgYWx3YXlzCiAgICAgICAgICAgIGV4cGFuZGVkIHRvICd2YWx1ZScuCgowOS8xOS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCBidWcgcmVwb3J0ZWQgYnkgR2xlbm4gQSBXYXRzb24gYW5kICMxNzk1MjYwIHdoZXJlIHRoZSBjc3R5cGUgdHlwZW1hcCB1c2VkIHRoZSAncmVmJwogICAgICAgICAgICBrZXl3b3JkIGluIHRoZSB0eXBlbWFwIGJvZHksIGl0IHByb2R1Y2VkIHVuY29tcGlsYWJsZSBDIyBwcm9wZXJ0aWVzICh2YXJpYWJsZSB3cmFwcGVycykuCiAgICAgICAgICAgIFRoZSB0eXBlIGZvciB0aGUgcHJvcGVydHkgbm93IGNvcnJlY3RseSBjb21lcyBmcm9tIHRoZSAnb3V0JyBhdHRyaWJ1dGUgaW4gdGhlIGNzdHlwZSB0eXBlbWFwLgoKMDkvMTkvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCBjb25zdCBzdGQ6OndzdHJpbmcmIHR5cGVtYXBzCgowOS8xOS8yMDA3OiB3c2Z1bHRvbgoJICAgIFtKYXZhXSBFbnN1cmUgdGhlIHByZW1hdHVyZSBnYXJiYWdlIGNvbGxlY3Rpb24gcHJldmVudGlvbiBwYXJhbWV0ZXIgKHBnY3BwKSBpcyBnZW5lcmF0ZWQKICAgICAgICAgICAgd2hlcmUgYSBwYXJhbWV0ZXIgaXMgcGFzc2VkIGJ5IHBvaW50ZXIgcmVmZXJlbmNlLCBlZyBpbiB0aGUgc3RkOjp2ZWN0b3Igd3JhcHBlcnMuIFRoZSBwZ2NwcAogICAgICAgICAgICBpcyBhbHNvIGdlbmVyYXRlZCBub3cgd2hlbiB1c2VyJ3MgY3VzdG9tIHR5cGVtYXBzIHVzZSBhIHByb3h5IGNsYXNzIGluIHRoZSBqc3R5cGUgdHlwZW1hcAogICAgICAgICAgICBhbmQgYSAnbG9uZycgaW4gdGhlIGp0eXBlIHR5cGVtYXAuCgowOS8xOC8yMDA3OiBvbGx5CgkgICAgW3BocF0gQWRkIHR5cGVtYXBzIGZvciBoYW5kbGluZyBwYXJhbWV0ZXJzIG9mIHR5cGUgc3RkOjpzdHJpbmcgJgoJICAgIHdoaWNoIGFyZSBtb2RpZmllZCBieSB0aGUgd3JhcHBlZCBmdW5jdGlvbi4KCjA5LzE3LzIwMDc6IG9sbHkKCSAgICBbcHl0aG9uXSBTcGxpdCBwb3RlbnRpYWxseSBsb25nIHN0cmluZyBsaXRlcmFscyB0byBhdm9pZCBoaXR0aW5nCgkgICAgTVNWQydzIGxvdyBmaXhlZCBsaW1pdCBvbiBzdHJpbmcgbGl0ZXJhbCBsZW5ndGggLSBwYXRjaCBmcm9tCgkgICAgU0YjMTcyMzc3MCwgYWxzbyByZXBvcnRlZCBhcyBTRiMxNjMwODU1LgoKMDkvMTcvMjAwNzogb2xseQoJICAgIFtvY2FtbF0gRml4IHJlbmFtaW5nIG9mIG92ZXJsb2FkZWQgbWV0aG9kcyBpbiB0aGUgbWV0aG9kX3RhYmxlIC0KCSAgICBteSBwYXRjaCBmcm9tIFNGIzk0MDM5OS4KCjA5LzE3LzIwMDc6IG9sbHkKCSAgICBbcHl0aG9uXSBTaW1wbGVyIGNvZGUgZm9yIFNXSUdfQXNWYWxfYm9vbCgpIHdoaWNoIGZpeGVzIGEgInN0cmljdAoJICAgIGFsaWFzaW5nIiB3YXJuaW5nIGZyb20gR0NDIC0gcGF0Y2ggZnJvbSBTRiMxNzI0NTgxIGJ5IEFuZHJldwoJICAgIEJhdW1hbm4uCgowOS8xNy8yMDA3OiBvbGx5CgkgICAgW3Blcmw1XSBVc2Ugc3Zfc2V0cHZuKCkgdG8gc2V0IGEgc2NhbGFyIGZyb20gYSBwb2ludGVyIGFuZCBsZW5ndGgKCSAgICAtIHBhdGNoIGZyb20gU0YjMTc0NDYwIGJ5ICJtYXRzdWJhcmF5Ii4KCjA5LzE3LzIwMDc6IG9sbHkKCSAgICBXaGVuIHdyYXBwaW5nIEMrKyBjb2RlLCBnZW5lcmF0ZSBjb2RlIHdoaWNoIHVzZXMKCSAgICBzdGQ6OnN0cmluZzo6YXNzaWduKFBUUiwgTEVOKSByYXRoZXIgdGhhbiBhc3NpZ25pbmcKCSAgICBzdGQ6OnN0cmluZyhQVFIsIExFTikuICBVc2luZyBhc3NpZ24gZ2VuZXJhdGVzIG1vcmUgZWZmaWNpZW50IGNvZGUKCSAgICAodGVzdGVkIHdpdGggR0NDIDQuMS4yKS4KCjA5LzA3LzIwMDc6IHdzZnVsdG9uCgkgICAgRml4ICVpZ25vcmUgb24gY29uc3RydWN0b3JzIHdoaWNoIGFyZSBub3QgZXhwbGljaXRseSBkZWNsYXJlZCBbU0YgIzE3Nzc3MTJdCgowOS8wNS8yMDA3OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICAtIENoYW5nZSByX2x0eXBlIGluIHR5cGVzeXMuYyB0byBzdG9yZSBhIGhhc2h0YWJsZSBpbnN0ZWFkIG9mIGEgc2luZ2xlIHZhbHVlLgoJICAgICAgc2V2ZXJhbCB2ZXJ5IHN1YnRsZSBidWdzIHdlcmUgYmVpbmcgY2F1c2VkIGJ5IG11bHRpcGxlIGx0eXBlcyBiZWluZyBtYXBwZWQKCSAgICAgIHRvIGEgc2luZ2xlIG1hbmdsZWQgdHlwZSwgbW9zdGx5IHdoZW4gdXNpbmcgdHlwZWRlZmVkIHRlbXBsYXRlIHBhcmFtZXRlcnMuCgkgICAgICBOb3csIHJfbHR5cGUgc3RvcmVzIGEgaGFzaHRhYmxlIG9mIHBvc3NpYmxlIGx0eXBlcywgYW5kIHdoZW4gZ2VuZXJhdGluZyB0aGUKCSAgICAgIHR5cGUgdGFibGUsIGFsbCB0aGUgbHR5cGVzIGFyZSBhZGRlZCBpbnRvIHRoZSBzd2lnX3R5cGVfaW5mbyBzdHJ1Y3R1cmUuCgowOC8zMS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBTRiAjMTc1NDk2NyBmcm9tIEphbWVzIEJpZ2xlci4KICAgICAgICAgICAgLSBGaXggYnVnIGluIHR1cm5pbmcgb24gd2FybmluZ3MgdGhhdCB3ZXJlIHR1cm5lZCBvZmYgYnkgZGVmYXVsdC4gRWcgJ3N3aWcgLXcrMzA5JyB3aWxsIG5vdwogICAgICAgICAgICAgIHR1cm4gb24gdGhlIG5vcm1hbGx5IHN1cHByZXNzZWQgd2FybmluZyAzMDkuCgogICAgICAgICAgICAtIE5ldyAtV2V4dHJhIGNvbW1hbmRsaW5lIG9wdGlvbiB3aGljaCBlbmFibGVzIHRoZSBleHRyYSB3YXJuaW5nIG51bWJlcnM6CiAgICAgICAgICAgICAgMjAyLDMwOSw0MDMsNTEyLDMyMSwzMjIgKHRoaXMgaXMgdGhlIGxpc3Qgb2Ygd2FybmluZ3MgdGhhdCBoYXZlIGFsd2F5cyBiZWVuIHN1cHByZXNzZWQgYnkKICAgICAgICAgICAgICBkZWZhdWx0KS4gQnkgc3BlY2lmeWluZyAtV2V4dHJhLCBhbGwgd2FybmluZ3Mgd2lsbCBiZSB0dXJuZWQgb24sIGJ1dCB1bmxpa2UgLVdhbGwsCiAgICAgICAgICAgICAgd2FybmluZ3MgY2FuIHN0aWxsIGJlIHNlbGVjdGl2ZWx5IHR1cm5lZCBvbi9vZmYgdXNpbmcgJXdhcm5maWx0ZXIsCiAgICAgICAgICAgICAgI3ByYWdtYSBTV0lHIG5vd2FybiBvciBmdXJ0aGVyIC13IGNvbW1hbmRsaW5lIG9wdGlvbnMsIGVnOgogICAgICAgICAgICAgICAgc3dpZyAtV2V4dHJhIC13MzA5CiAgICAgICAgICAgICAgd2lsbCB0dXJuIG9uIGFsbCB3YXJuaW5ncyBleGNlcHQgMzA5LgoKMDgvMjgvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgLSBOZXcgZGVidWdnaW5nIG9wdGlvbnMsIC1kZWJ1Zy1tb2R1bGUgPG4+IGFuZCAtZGVidWctdG9wIDxuPiB0byBkaXNwbGF5IHRoZSBwYXJzZSB0cmVlIGF0CiAgICAgICAgICAgICAgdmFyaW91cyBzdGFnZXMsIHdoZXJlIDxuPiBpcyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHN0YWdlcyAxLTQuRm9yIGV4YW1wbGUsIHRvCiAgICAgICAgICAgICAgZGlzcGxheSB0b3Agb2YgcGFyc2UgdHJlZSBhdCBzdGFnZXMgMSBhbmQgMzoKICAgICAgICAgICAgICAgIHN3aWcgLWRlYnVnLXRvcCAxLDMKCiAgICAgICAgICAgIC0gRGVwcmVjYXRlIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyB3aGljaCBoYXZlIGVxdWl2YWxlbnRzIGJlbG93OgogICAgICAgICAgICAgIC1kdW1wX3BhcnNlX21vZHVsZSAgICA9PiAgIC1kZWJ1Zy1tb2R1bGUgMQogICAgICAgICAgICAgIC1kdW1wX21vZHVsZSAgICAgICAgICA9PiAgIC1kZWJ1Zy1tb2R1bGUgNAogICAgICAgICAgICAgIC1kdW1wX3BhcnNlX3RvcCAgICAgICA9PiAgIC1kZWJ1Zy10b3AgMQogICAgICAgICAgICAgIC1kdW1wX3RvcCAgICAgICAgICAgICA9PiAgIC1kZWJ1Zy10b3AgNAoKICAgICAgICAgICAgLSBSZW5hbWVkIHNvbWUgY29tbWFuZGxpbmUgb3B0aW9ucyBmb3IgbmFtaW5nIGNvbnNpc3RlbmN5IGFjcm9zcyBhbGwgb3B0aW9uczoKICAgICAgICAgICAgICAtZGVidWdfdGVtcGxhdGUgID0+ICAgLWRlYnVnLXRlbXBsYXRlCiAgICAgICAgICAgICAgLWRlYnVnX3R5cGVtYXAgICA9PiAgIC1kZWJ1Zy10eXBlbWFwCiAgICAgICAgICAgICAgLWR1bXBfY2xhc3NlcyAgICA9PiAgIC1kZWJ1Zy1jbGFzc2VzCiAgICAgICAgICAgICAgLWR1bXBfdGFncyAgICAgICA9PiAgIC1kZWJ1Zy10YWdzCiAgICAgICAgICAgICAgLWR1bXBfdHlwZWRlZiAgICA9PiAgIC1kZWJ1Zy10eXBlZGVmCiAgICAgICAgICAgICAgLWR1bXBfbWVtb3J5ICAgICA9PiAgIC1kZWJ1Zy1tZW1vcnkKCjA4LzI1LzIwMDc6IG9sbHkKCSAgICBbUEhQNV0gRml4IGhhbmRsaW5nIG9mIGRvdWJsZSBvciBmbG9hdCBwYXJhbWV0ZXJzIHdpdGggYW4gaW50ZWdlcgoJICAgIGRlZmF1bHQgdmFsdWUuCgowOC8yNS8yMDA3OiBvbGx5CgkgICAgW1BIUDVdIEdlbmVyYXRlIF9faXNzZXQoKSBtZXRob2RzIGZvciBzZXR0ZXJzIGZvciBQSFAgNS4xIGFuZCBsYXRlci4KCjA4LzIwLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhIEMjXSBGaXggZGlyZWN0b3IgYnVnICMxNzc2NjUxIHJlcG9ydGVkIGJ5IFN0ZXBoYW5lIFJvdXRlbG91cyB3aGljaCBvY2N1cnJlZCB3aGVuCiAgICAgICAgICAgIHRoZSBkaXJlY3RvciBjbGFzcyBuYW1lIGlzIHRoZSBzYW1lIGFzIHRoZSBzdGFydCBvZiBzb21lIG90aGVyIHN5bWJvbHMgdXNlZCB3aXRoaW4KICAgICAgICAgICAgdGhlIGRpcmVjdG9yIGNsYXNzLgoKMDgvMTcvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgQ29ycmVjdCBiZWhhdmlvdXIgZm9yIHRlbXBsYXRlZCBtZXRob2RzIHVzZWQgd2l0aCAlcmVuYW1lIG9yICVpZ25vcmUgYW5kIHRoZSBlbXB0eQogICAgICAgICAgICB0ZW1wbGF0ZSBkZWNsYXJhdGlvbiAtICV0ZW1wbGF0ZSgpLiBBIHdhcm5pbmcgaXMgaXNzdWVkIGlmIHRoZSBtZXRob2QgaGFzIG5vdCBiZWVuCiAgICAgICAgICAgIHJlbmFtZWQuCgowOC8xNi8yMDA3OiBtdXRhbmRpeiAoTWlrZWwgQmFuY3JvZnQpCgkgICAgW2FsbGVncm9jbF0gTmFtZSBnZW5lcmF0ZWQgY2wgZmlsZSBiYXNlZCBvbiBpbnB1dCBmaWxlIHJhdGhlciB0aGFuIGJ5CgkgICAgbW9kdWxlIG5hbWUuIEl0IHdhcyBwb3NzaWJsZSB0byBlbmQgdXAgd2l0aCBhIG15cGFja2FnZS5jbCBhbmQgYSB0ZXN0X3dyYXAuYwoJICAgIHdoZW4gcGFyc2luZyBhIHRlc3QuaSBpbnB1dCBmaWxlLiBDb25mdXNpbmcuIEFsc28sIGluY2x1ZGUgZXh0ZXJuYWwtZm9ybWF0CgkgICAgdGVtcGxhdGVzIGZvciA6ZmF0IGFuZCA6ZmF0LWxlIGF1dG9tYXRpY2FsbHkgdG8gYXZvaWQgdGhlc2UgYmVpbmcgY29tcGlsZWQKCSAgICBhdCBydW50aW1lLgoKMDgvMTUvMjAwNzogZWZ1enp5b25lCiAgICAgICAgICAgIFtjZmZpXSBBcHBseSBwYXRjaCAjMTc2NjA3NiBmcm9tIExlaWdoIFNtaXRoIGFkZGluZyBzdXBwb3J0IGZvciBuZXdseSBpbnRyb2R1Y2VkCiAgICAgICAgICAgIGluIGNmZmkgOmxvbmctbG9uZyBhbmQgOnVuc2lnbmVkLWxvbmctbG9uZy4KCjA4LzEwLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBBZGQgZG9jdW1lbnRhdGlvbiBwYXRjaCAjMTc0MzU3MyBmcm9tIEplZmZyZXkgU29yZW5zZW4uIEl0IGNvbnRhaW5zIGEgbmVhdAogICAgICAgICAgICBpZGVhIHdpdGggcmVzcGVjdCB0byBiZXR0ZXIgbWVtb3J5IG1hbmFnZW1lbnQgYnkgdGhlIEpWTSBvZiBDKysgYWxsb2NhdGVkIG1lbW9yeS4KCjA4LzEwLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBBcHBseSBwYXRjaCAjMTc3MTQxMCBmcm9tIFdhZGUgQnJhaW5lcmQgdG8gZml4IHR5cGVkZWYgWFMoU3dpZ1BlcmxXcmFwcGVyKSBpbgogICAgICAgICAgICBwZXJscnVuLnN3ZyBmb3IgQWN0aXZlU3RhdGUgUGVybCBidWlsZCA4MjIgYW5kIFBlcmwgNS44LjkgYW5kIDUuMTAgYnJhbmNoZXMuCgowOC8xMC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBjb25zdCBlbnVtIHJlZmVyZW5jZSB0eXBlbWFwcyBmaXhlZC4KCjA4LzA5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQWRkZWQgbWlzc2luZyBzdXBwb3J0IGZvciBDKysgY2xhc3MgbWVtYmVyIHBvaW50ZXJzLgoKMDgvMDkvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBBZGQgc3VwcG9ydCBmb3IgJG93bmVyIGluIHRoZSAib3V0IiB0eXBlbWFwcyBsaWtlIGluIHRoZSBzY3JpcHRpbmcKICAgICAgICAgICAgbGFuZ3VhZ2UgbW9kdWxlcy4gTm90ZSB0aGF0ICRvd25lciBoYXMgYWx3YXlzIGJlZW4gc3VwcG9ydGVkIGluIHRoZSAiamF2YW91dCIgLyAiY3NvdXQiCiAgICAgICAgICAgIHR5cGVtYXBzLgoKMDgvMDEvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNtYXJ0IHBvaW50ZXIgaGFuZGxpbmcgZm9yIGNsYXNzZXMgdGhhdCBoYXZlIHRlbXBsYXRlZCBtZXRob2RzIHdpdGhpbiB0aGUgc21hcnQKICAgICAgICAgICAgcG9pbnRlciB0eXBlLiBQcm9ibGVtIHJlcG9ydGVkIGJ5IGNyYWlnZG8gYXQgZWUud2FzaGluZ3Rvbi5lZHUuCgowNy8zMS8yMDA3OiBlZnV6enlvbmUKICAgICAgICAgICAgW2NmZmldIGZpeGVkIG1lbW9yeSBhY2Nlc3MgYWZ0ZXIgYmVpbmcgZnJlZWQgYnVnLiB0aGFua3MgdG8gTWFydGluIFBlcmNvc3NpLgogICAgICAgICAgICBwYWNrYWdlIG5hbWUgY2xvcyBjaGFuZ2VkIHRvIGNsLiB0aGFua3MgdG8gUmFsZiBNYXR0ZXMKCjA3LzI0LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhcmFsbGVsIG1ha2Ugc3VwcG9ydCBhZGRlZCBmb3IgdGhlIGV4YW1wbGVzIGFuZCB0ZXN0LXN1aXRlIGZvciBkZXZlbG9wZXJzIHdobyBoYXZlCiAgICAgICAgICAgIG1vcmUgdGhhbiBvbmUgQ1BVLiBOb3cgcGFyYWxsZWwgbWFrZSBjYW4gYmUgdXNlZCBmb3IgY2hlY2tpbmcgaW4gYWRkaXRpb24gdG8gYnVpbGRpbmcKICAgICAgICAgICAgdGhlIFNXSUcgZXhlY3V0YWJsZS4gU29tZSB0eXBpY2FsIGNoZWNraW5nIGV4YW1wbGVzOgoKICAgICAgICAgICAgICBtYWtlIC1qOCAtayBjaGVjawogICAgICAgICAgICAgIG1ha2UgLWo0IGNoZWNrLWphdmEtdGVzdC1zdWl0ZQogICAgICAgICAgICAgIG1ha2UgLWoyIGNoZWNrLWphdmEtZXhhbXBsZXMKCjA3LzE5LzIwMDc6IG1nb3NzYWdlCiAgICAgICAgICAgIEZpeGVkIGJ1ZyB0aGF0IHN0b3BwZWQgY29uZmlndXJlIHdvcmtpbmcgb24gbWluZ3cgKGFwcGxpZWQgZG9zMnVuaXggdG8gY29uZmlndXJlLmluKQoKMDcvMTAvMjAwNzogbWdvc3NhZ2UKICAgICAgICAgICAgW2x1YV0gRXh0cmEgY29tcGF0aWJpbGl0eSB3aXRoIEx1YSA1LjEgKHVwZGF0ZWQgU1dJR19pbml0LCBkb2NzLCBleGFtcGxlcywgdGVzdCBzdWl0ZSkKCSAgICBSZW1vdmVkIG5hbWUgY2xhc2ggZm9yIHN0YXRpYyBsaW5rIG9mIG11bHRpcGxlIG1vZHVsZXMKCjA3LzA1LzIwMDc6IG1nb3NzYWdlCiAgICAgICAgICAgIFtsdWFdIEZpeCBhIGJ1ZyBpbiBTV0lHX0FMTE9DX0FSUkFZKCkKICAgICAgICAgICAgaW1wcm92ZWQgdGhlIGVycm9yIG1lc3NhZ2VzIGZvciBpbmNvcnJlY3QgYXJndW1lbnRzLgogICAgICAgICAgICBDaGFuZ2VkIHRoZSBvdXRwdXQgb2Ygc3dpZ190eXBlKCkgdG8gdXNlIHRoZSBodW1hbiByZWFkYWJsZSBmb3JtIG9mIHRoZSB0eXBlLAoJICAgIHJhdGhlciB0aGFuIHRoZSByYXcgc3dpZyB0eXBlLgoKMDcvMDMvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggZGlyZWN0b3JzIGZvciBzb21lIG92ZXJsb2FkZWQgbWV0aG9kcyB3aGVyZSB0aGUgaW10eXBlIHJlc3VsdGVkIGluIGlkZW50aWNhbAogICAgICAgICAgICBtZXRob2RzIGJlaW5nIGdlbmVyYXRlZCBpbiB0aGUgQyMgZGlyZWN0b3IgY2xhc3MsIGVnIHZvaWQgZm9vKGludCAqKSBhbmQgdm9pZCBmb28oZG91YmxlICopCiAgICAgICAgICAgIHVzZWQgdG8gZ2VuZXJhdGVkIHR3byBvZiB0aGVzZToKCiAgICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIFN3aWdEaXJlY3RvcmZvbyhJbnRQdHIgcCkgeyAuLi4gfQoKMDYvMjUvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBTb21lIHBhcmFtZXRlciBuYW1lIGNoYW5nZXMgaW4gc3RkX3ZlY3Rvci5pIGFsbG93aW5nIGJldHRlciB0YXJnZXRpbmcKICAgICAgICAgICAgb2YgdHlwZW1hcHMgZm9yIG1ldGhvZCBwYXJhbWV0ZXJzIChmb3IgbWVtb3J5IG1hbmFnZW1lbnQgb2YgY29udGFpbmVycyBvZiBwb2ludGVycykuCgowNi8wNy8yMDA3OiBtdXRhbmRpeiAoTWlrZWwgQmFuY3JvZnQpCgkgICAgW2FsbGVncm9jbF0KCSAgICBmaXggZm9yZWlnbi10eXBlIGNvbnN0cnVjdG9yIHRvIHByb3Blcmx5IGxvb2sgZm9yIGZmaXR5cGUgdHlwZW1hcAoJICAgIGJpbmRpbmdzLiBmaXggaW5vdXRfdHlwZW1hcHMuaSBmb3Igc3RyaW5ncy4KCjA2LzA2LzIwMDc6IG9sbHkKCSAgICBbUnVieV0KCSAgICBVc2Ugd2hpY2hldmVyIG9mICJsb25nIiBvciAibG9uZyBsb25nIiBpcyB0aGUgc2FtZSBzaXplIGFzICJ2b2lkKiIKCSAgICB0byBob2xkIHBvaW50ZXJzIGFzIGludGVnZXJzLCByYXRoZXIgdGhhbiB3aGljaGV2ZXIgbWF0Y2hlcyBvZmZfdC4KCSAgICBGaXhlcyBjb21waWxhdGlvbiBvbiBPUyBYIGFuZCBHQ0Mgd2FybmluZ3Mgb24gcGxhdGZvcm1zIHdoZXJlCgkgICAgc2l6ZW9mKHZvaWQqKSA8IHNpemVvZihvZmZfdCkgKFNGIHBhdGNoICMxNzMxOTc5KS4KCjA2LzA2LzIwMDc6IG9sbHkKCSAgICBbUEhQNV0KCSAgICBGaXggaGFuZGxpbmcgb2YgYSBwYXJ0aWN1bGFyIGNhc2UgaW52b2x2aW5nIG92ZXJsb2FkZWQgZnVuY3Rpb25zCgkgICAgd2l0aCBkZWZhdWx0IHBhcmFtZXRlcnMuCgowNi8wNS8yMDA3OiBtdXRhbmRpeiAoTWlrZWwgQmFuY3JvZnQpCgkgICAgW2FsbGVncm9jbF0KCSAgICBGaXggY2FzZSB3aGVyZSB3ZSdkIHBhc3MgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXJzCgkgICAgKGkuZS4gTlMxOjpOUzI6OkZPTykgdG8gc3dpZy1pbnNlcnQtaWQuIEFsbCBuYW1lc3BhY2VzCgkgICAgc2hvdWxkIGJlIHN0cmlwcGVkLgoKCSAgICBGaXggYnVnIGluIFR5cGVkZWZIYW5kbGVyIGludHJvZHVjZWQgYnkgbGFzdCBmaXguCgowNi8wNS8yMDA3OiBvbGx5CgkgICAgRml4IHJlcG9ydGluZyBvZiBmaWxlbmFtZXMgaW4gZXJyb3JzIGFmdGVyICVpbmNsdWRlIChwYXRjaCBmcm9tCgkgICAgTGVpZ2ggU21pdGggaW4gIzE3MzEwNDA7IGFsc28gcmVwb3J0ZWQgYXMgIzE2OTk5NDApLgoKMDUvMzEvMjAwNzogb2xseQoJICAgIFtQeXRob25dCgkgICAgRml4ICJtaXNzaW5nIGluaXRpYWxpc2VyIiB3YXJuaW5nIHdoZW4gY29tcGlsaW5nIGdlbmVyYXRlZCBDL0MrKwoJICAgIHdyYXBwZXIgY29kZSB3aXRoIFB5dGhvbiAyLjUgd2l0aCB3YXJuaW5ncyBlbmFibGVkIChwYXRjaCBmcm9tCgkgICAgYnVnIzE3Mjc2NjggZnJvbSBMdWtlIE1vb3JlKS4KCjA1LzI5LzIwMDc6IG9sbHkKCSAgICBbUHl0aG9uXQoJICAgIFNwbGl0IGRvY3N0cmluZ3MgaW50byBzZXBhcmF0ZSBzdHJpbmcgbGl0ZXJhbHMgYXQgZWFjaCBuZXdsaW5lIHdoZW4KCSAgICBnZW5lcmF0aW5nIEMvQysrIHdyYXBwZXIgY29kZSAodGhlIEMvQysrIGNvbXBpbGVyIHdpbGwganVzdCBjb21iaW5lCgkgICAgdGhlbSBiYWNrIGludG8gYSBzaW5nbGUgc3RyaW5nIGxpdGVyYWwpLiAgVGhpcyBhdm9pZHMgTVNWQwoJICAgIGNvbXBsYWluaW5nIHRoYXQgdGhlIHN0cmluZ3MgYXJlIHRvbyBsb25nIChwcm9ibGVtIHJlcG9ydGVkIGJ5CgkgICAgQm8gUGVuZyBvbiB0aGUgbWFpbGluZyBsaXN0KS4KCjA1LzI4LzIwMDc6IG9sbHkKCSAgICBbUHl0aG9uXQoJICAgIEVzY2FwZSBiYWNrc2xhc2hlcyBpbiBkb2NzdHJpbmdzLgoKMDUvMjYvMjAwNzogb2xseQoJICAgIFtQeXRob25dCgkgICAgRml4IGF1dG9kb2MgZ2VuZXJhdGlvbiBvZiBlbnVtcyB0byBiZSBtb3JlIGNvbnNpc3RlbnQgd2l0aCBob3cgdGhlCgkgICAgZW51bXMgYXJlIHdyYXBwZWQgLSBwYXRjaCAjMTY5NzIyNiBmcm9tIEpvc2ggQ2hlcnJ5LgoKMDUvMjYvMjAwNzogb2xseQoJICAgIFtQSFA1XQoJICAgIEZpeCB3cmFwcGluZyBvZiBtZXRob2RzIGFuZCBmdW5jdGlvbnMgd2hpY2ggcmV0dXJuIGEgcG9pbnRlciB0byBhCgkgICAgY2xhc3MgKGJ1ZyMxNzAwNzg4KSBhbmQgdGhvc2Ugd2hpY2ggaGF2ZSBvdmVybG9hZGVkIGZvcm1zIHJldHVybmluZwoJICAgIGJvdGggY2xhc3NlcyBhbmQgbm9uLWNsYXNzZXMgKGJ1ZyMxNzEyNzE3LCB0aGFua3MgdG8gU2ltb24KCSAgICBCZXJ0aGlhdW1lIGZvciB0aGUgcGF0Y2gpLgoKMDUvMjUvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgRml4ZWQgJXJlbmFtZSBpbmNvbnNpc3RlbmN5IGluIGNvbnZlcnNpb24gb3BlcmF0b3JzIGFzIHJlcG9ydGVkIGJ5IFpob25nIFJlbi4gVGhlIG1hdGNoaW5nCiAgICAgICAgICAgIGlzIG5vdyBkb25lIG9uIHRoZSBvcGVyYXRvciBuYW1lIGluIHRoZSBzYW1lIHdheSBhcyBpdCBpcyBkb25lIGZvciBwYXJhbWV0ZXJzLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXJlbmFtZShvcEFCQykgU3BhY2U6OkFCQzo6b3BlcmF0b3IgQUJDKCkgY29uc3Q7CiAgICAgICAgICAgICAgJXJlbmFtZShtZXRob2RBQkMpIFNwYWNlOjpBQkM6Om1ldGhvZChBQkMgYSkgY29uc3Q7CiAgICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlIHsKICAgICAgICAgICAgICAgIGNsYXNzIEFCQyB7CiAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICB2b2lkIG1ldGhvZChBQkMgYSkgY29uc3Qge30KICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciBBQkMoKSBjb25zdCB7IEFCQyBhOyByZXR1cm4gYTsgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICBOb3RlIHRoYXQgcXVhbGlmeWluZyB0aGUgY29udmVyc2lvbiBvcGVyYXRvciBwcmV2aW91c2x5IG1heSBvciBtYXkgbm90IGhhdmUgbWF0Y2hlZC4KICAgICAgICAgICAgTm93IGl0IGRlZmluaXRlbHkgd29uJ3QsIHNvIHRoaXMgd2lsbCBub3QgbWF0Y2g6CgogICAgICAgICAgICAgICVyZW5hbWUob3BBQkMpIFNwYWNlOjpBQkM6Om9wZXJhdG9yIFNwYWNlOjpBQkMoKSBjb25zdDsKCiAgICAgICAgICAgIGluIHRoZSBzYW1lIHdheSB0aGF0IHRoaXMgZG9lcyBub3QgbWF0Y2g6CgogICAgICAgICAgICAgICVyZW5hbWUobWV0aG9kQUJDKSBTcGFjZTo6QUJDOjptZXRob2QoU3BhY2U6OkFCQyBhKSBjb25zdDsKCiAgICAgICAgICAgIFRoZSBkb2N1bWVudGF0aW9uIGhhcyBiZWVuIGltcHJvdmVkIHdpdGggcmVzcGVjdCB0byAlcmVuYW1lLCBuYW1lc3BhY2VzIGFuZCB0ZW1wbGF0ZXMuCiAgICAgICAgICAgIENvbnZlcnNpb24gb3BlcmF0b3JzIGRvY3VtZW50YXRpb24gdG9vLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgowNS8xNi8yMDA3OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgRml4IGJhZCBnZW5lcmF0aW9uIG9mIGxvY2FsIHZhciBsdHlwZSdzIGluIGZ1bmN0aW9uV3JhcHBlcigpLgoJICAgIFRyeSB0byB3b3JrIGJldHRlciB3aXRoIHRoZSBiYWNrd2FyZCBvcmRlciBpbiB3aGljaCBzd2lnCgkgICAgdW5yb2xscyBuZXN0ZWQgY2xhc3MgZGVmaW5pdGlvbnMuCgkgICAgY2xlYW5lZCB1cCBhIGxpdHRsZSB1bm5lY2Vzc2FyeSBjb2RlL2RlYnVnIHByaW50ZidzLgoJICAgIFJlbW92ZSB3YXJuaW5nIHdoZW4gcmVwbGFjaW5nICRsZGVzdHJ1Y3RvciBmb3IgZmY6Zm9yZWlnbi1wb2ludGVyCgowNS8xMi8yMDA3OiBvbGx5CgkgICAgW1B5dGhvbl0KCSAgICBzd2lnIC1weXRob24gLXRocmVhZHMgbm93IGdlbmVyYXRlcyBDL0MrKyBjb2RlIHdoaWNoIHVzZXMgUHl0aG9uJ3MKCSAgICBvd24gdGhyZWFkaW5nIGFic3RyYWN0aW9uIChmcm9tIHB5dGhyZWFkLmgpIHJhdGhlciB0aGFuIE9TIHNwZWNpZmljCgkgICAgY29kZS4gIFRoZSBvbGQgY29kZSBmYWlsZWQgdG8gY29tcGlsZSBvbiBNUyBXaW5kb3dzLiAgKFNlZSBTRiBwYXRjaAoJICAgIHRyYWNrZXIgIzE3MTAzNDEpLgoKMDUvMDQvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgQ2hhbmdlZCBTVEwgcmVuYW1lcyB0byBiZSBnbG9iYWwgcmVuYW1lcy4gIFRoaXMgZml4ZXMKCSAgICBTVEwgZnVuY3Rpb25zIG5vdCBiZWluZyByZW5hbWVkIHdoZW4gYXV0b3JlbmFtZSBpcyBvbi4KICAgICAgICAgICAgVGhpcyBpcyBhIG5vdCBhIHRvdGFsbHkgcGVyZmVjdCB3b3JrLWFyb3VuZCwgYnV0IGJldHRlci4KCSAgICBTb21lb25lIHJlYWxseSBuZWVkcyB0byBmaXggdGhlIHRlbXBsYXRlIHJlbmFtaW5nIGNvZGUuCgkgICAgKFNlZSBidWcgIzE1NDU2MzQpCgowNS8wNC8yMDA3ICBnZ2EKCSAgICBbQWxsXQogICAgICAgICAgICBDaGFuZ2VkICVyZW5hbWUoIiUodW5kZXJjYXNlKXMiKSBhIGxpdHRsZSBzbyB0aGF0IHNpbmdsZQoJICAgIG51bWJlcnMgYXQgdGhlIGVuZCBvZiBhIGZ1bmN0aW9uIGFyZSBub3QgdW5kZXJjYXNlZC4gIFRoYXQgaXM6CgkJZ2V0U29tZXRoaW5nIC0+IGdldF9zb21ldGhpbmcKCQlnZXQyRAkgICAgIC0+IGdldF8yZAoJCWdldDIzNAkgICAgIC0+IGdldF8yMzQKCSAgICBCVVQ6CgkJYXNGbG9hdDIgICAgIC0+IGFzX2Zsb2F0MgoJICAgIChCdWcgIzE2OTk3MTQpCgowNS8wMy8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBNYWRlIF9fc3dpZ3R5cGVfXyA9PiBAX19zd2lndHlwZV9fIHNvIGl0IGNhbiBiZSBhY2Nlc3NlZAoJICAgIGZyb20gdGhlIHNjcmlwdGluZyBsYW5ndWFnZSAoYW5kIGZvbGxvd3MgUnVieSdzIG9mZmljaWFsCiAgICAgICAgICAgIGRvY3VtZW50YXRpb24sIGp1c3QgaW4gY2FzZSkuCgkgICAgTWFkZSB0cmFja2luZyA9PiBAX190cmFja2luZ3NfXyBmb3Igc2FtZSByZWFzb24uCgkgICAgQ3VycmVudGx5IHN0b3JpbmcgaXZhcnMgd2l0aG91dCB0aGUgQCBzZWVtcyB2YWxpZCwgYnV0CgkgICAgdGhlIFBpY2tBeGUgc2F5cyB0aGlzIGlzIG5vdCBjb3JyZWN0LCBzbyBqdXN0IGluIGNhc2UuLi4KCjA1LzAzLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEFwcGxpZWQgcGF0Y2ggZm9yIC1taW5oZXJpdCBidWcgYW5kIGV4Y2VwdGlvbiBjbGFzc2VzLgoJICAgIFRoaXMgaXNzdWUgc2hvdWxkIGJlIHJldmlzaXRlZCBtb3JlIGNsb3NlbHksIGFzIE11bHRpcGxlCgkgICAgSW5oZXJpdGFuY2UgaW4gUnVieSBpcyBzdGlsbCBwcm9ibGVtYXRpYy4KCSAgICAocGF0Y2gvYnVnICMxNjA0ODc4KQoKMDUvMDMvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgT3ZlcmxvYWRlZCBmdW5jdGlvbnMgaW4gcnVieSB3aWxsIG5vdyByZXBvcnQgdG8gdGhlIHVzZXIKICAgICAgICAgICAgdGhlIHBvc3NpYmxlIHByb3RvdHlwZXMgd2hlbiB0aGUgdXNlciBtaXN0eXBlcyB0aGUgbnVtYmVyIG9yCiAgICAgICAgICAgIHR5cGUgb2YgYSBwYXJhbWV0ZXIuCgowNS8wMy8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBGb3Jnb3QgdG8gZG9jdW1lbnQgdGhlIGJ1ZyBmaXhpbmcgb2YgYW4gb2xkIGJ1ZyByZWdhcmRpbmcKCSAgICBleGNlcHRpb25zLgoJICAgIChidWcgIzE0NTgyNDcpCgowNS8wMy8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBGaXhlZCBSdWJ5IGRvY3VtZW50YXRpb24gdG8gdXNlIHRoZSBwcm9wZXIgY3NzIHN0eWxlcyBmb3IKCSAgICBlYWNoIHNlY3Rpb24uIEFkZGVkIGF1dG9kb2Mgc2VjdGlvbiB0byBSdWJ5J3MgZG9jcyB0bwoJICAgIGRvY3VtZW50IHRoZSBmZWF0dXJlcyBzdXBwb3J0ZWQgYnkgUnVieSBpbiBkb2N1bWVudGluZyBpdHMgbW9kdWxlcy4KCSAgICBNYWRlIHJkb2MgZG9jdW1lbnRhdGlvbiBzcGl0IG91dCB0aGUgZnVsbCBuYW1lIG9mIHRoZSBjbGFzcyArCgkgICAgbWV0aG9kIG5hbWUuICBBbGJlaXQgdGhpcyB3aWxsIG1ha2UgdGhlIGN1cnJlbnQgcmRvYyBub3QgcmVjb2duaXplCiAgICAgICAgICAgIHRoZSBtZXRob2QsIHRoaXMgaXMgc3RpbGwgbmVlZGVkIHRvIGRpc2FtYmlndWF0ZSBiZXR3ZWVuIGRpZmZlcmVudAogICAgICAgICAgICBjbGFzc2VzIHdpdGggc2ltaWxhciBtZXRob2RzIChyZG9jIHdhcyBjcmVhdGVkIHRvIGRvY3VtZW50IHRoZQoJICAgIHJ1Ynkgc291cmNlIHdoaWNoIG9ubHkgY29udGFpbnMgb25lIGNsYXNzIHBlciBjIGZpbGUsIHVubGlrZSBzd2lnKQogICAgICAgICAgICBJIGhhdmUgcGF0Y2hlZCByZG9jIHRvIG1ha2UgaXQgbW9yZSBmcmllbmRseSB0byBzd2lnLiAgVGhpcwogICAgICAgICAgICBwYXRjaCBuZWVkcyB0byBiZSBtZXJnZWQgaW4gdGhlIHJ1Ynkgc3RkIGxpYnJhcnkgbm93LgoKMDUvMDMvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgQ2hhbmdlZCBmbGFnIC1mZWF0dXJlIHRvIGJlIC1pbml0X25hbWUgdG8gYmV0dGVyIHJlZmxlY3QgaXRzCgkgICAgcHVycG9zZSBhbmQgYXZvaWQgY29uZnVzaW9uIHdpdGggLWZlYXR1cmVzLgoKMDUvMDMvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgSW1wcm92ZWQgYXV0b2RvYyBnZW5lcmF0aW9uLgoJICAgIEFkZGVkIGF1dG9kb2MgLnN3ZyBmaWxlcyB0byBSdWJ5IGxpYnJhcnkgZm9yIGVhc2lseSBhZGRpbmcKCSAgICBkb2N1bWVudGF0aW9uIHRvIGNvbW1vbiBSdWJ5IG1ldGhvZHMgYW5kIFNUTCBtZXRob2RzLgoJICAgIEZpeGVkIGF1dG9kb2MgZG9jdW1lbnRpbmcgb2YgZ2V0dGVycyBhbmQgc2V0dGVycyBhbmQgbW9kdWxlLgoJICAgIE1hZGUgdGVzdCBzdWl0ZSBhbHdheXMgZ2VuZXJhdGUgYXV0b2RvY3MuCgowNS8wMy8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBSZW1vdmVkIHNvbWUgd2FybmluZ3MgZnJvbSBTVEwgYW5kIHRlc3Qgc3VpdGUuCgowNS8wMi8yMDA3OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBGaXhlZCBpc3N1ZXMgd2l0aCBDKysgY2xhc3NlcyBhbmQgaGllcmFjaGllcyBhY3Jvc3MgbXVsdGlwbGUKCSAgICBzb3VyY2UgZmlsZXMuIEZpeGVkIGltcG9ydHMgdGVzdCBjYXNlICYgYWRkZWQgcnVuIHRlc3QuCgkgICAgQWRkZWQgRXhhbXBsZXMvaW1wb3J0cy4KCSAgICBBZGRlZCB0eXBlbmFtZSBmb3IgcmF3IGx1YV9TdGF0ZSoKCSAgICBBZGRlZCBkb2N1bWVudGF0aW9uIG9uIG5hdGl2ZSBmdW5jdGlvbnMuCgowNS8wMi8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBEb2NzdHJpbmdzIGFyZSBub3cgc3VwcG9ydGVkLgoJICAgICVmZWF0dXJlKCJhdXRvZG9jIikgYW5kICVmZWF0dXJlKCJkb2NzdHJpbmciKSBhcmUgbm93CgkgICAgcHJvcGVybHkgc3VwcG9ydGVkIGluIFJ1YnkuICBUaGVzZSBmZWF0dXJlcyB3aWxsIGdlbmVyYXRlCgkgICAgYSBfd3JhcC5jeHggZmlsZSB3aXRoIHJkb2MgY29tbWVudHMgaW4gdGhlbS4KCjA1LzAyLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIFNUTCBmaWxlcyBoYXZlIGJlZW4gdXBncmFkZWQgdG8gZm9sbG93IHRoZSBuZXcgc3dpZy9weXRob24KCSAgICBMaWIvc3RkIGNvbnZlbnRpb25zLgoJICAgIFRoaXMgbWVhbnMgc3RkOjp2ZWN0b3IsIHN0ZDo6c2V0LCBzdGQ6Om1hcCwgc2V0OjptdWx0aW1hcCwKCSAgICBzdGQ6Om11bHRpc2V0LCBzdGQ6OmRlcXVlIGFuZCBzdGQ6OnN0cmluZyBhcmUgbm93IHByb3Blcmx5CgkgICAgc3VwcG9ydGVkLCBpbmNsdWRpbmcgdGhlaXIgaXRlcmF0b3JzLCBzdXBwb3J0IGZvciBjb250YWluaW5nCgkgICAgcnVieSBvYmplY3RzIChzd2lnOjpHQ19WQUxVRSkgYW5kIHNldmVyYWwgb3RoZXIgcnVieQoJICAgIGVuaGFuY2VtZW50cy4KCSAgICBzdGQ6OmNvbXBsZXgsIHN0ZDo6aW9zLCBzdGQ6Omlvc3RyZWFtLCBzdGQ6Omlvc3RyZWFtYnVmIGFuZAoJICAgIHN0ZDo6c3N0cmVhbSBhcmUgbm93IGFsc28gc3VwcG9ydGVkLgoJICAgIHN0ZDo6d3N0cmluZywgc3RkOjp3aW9zLCBzdGQ6Ondpb3N0cmVhbSwgc3RkOjp3aW9zdHJlYW1idWYKCSAgICBhbmQgc3RkOjp3c3N0cmVhbSBhcmUgc3VwcG9ydGVkIHZlcmJhdGltIHdpdGggbm8gdW5pY29kZQoJICAgIGNvbnZlcnNpb24uCgoJICAgIHN0ZF92ZWN0b3IuaSBub3cgbWltaWNzIHRoZSBiZWhhdmlvciBvZiBSdWJ5IEFycmF5cyBtdWNoIG1vcmUKCSAgICBjbG9zZWx5LCBzdXBwb3J0aW5nIHNsaWNpbmcsIHNoaWZ0aW5nLCB1bnNoaWZ0aW5nLAogICAgICAgICAgICBtdWx0aXBsZSBpbmRleGluZyBhbmQgcHJvcGVyIHJldHVybiB2YWx1ZXMgb24gYXNzaWdubWVudC4KCgkgICAgQ09NUEFUQUJJTElUWSBOT1RFOiB0aGlzIGNoYW5nZXMgdGhlIG9sZGVyIGFwaSBhIGxpdHRsZSBiaXQgaW4KCSAgICB0aGF0IGltcHJvcGVyIGluZGV4aW5nIHdvdWxkIHByZXZpb3VzbHkgKGluY29ycmVjdGx5KSByYWlzZQoJICAgIGV4Y2VwdGlvbnMuICBOb3csIG5pbCBpcyByZXR1cm5lZCBpbnN0ZWFkLCBmb2xsb3dpbmcgcnVieSdzCgkgICAgc3RhbmRhcmQgQXJyYXkgYmVoYXZpb3IuCgowNS8wMi8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBDaGFuZ2VkIHRoZSB2YWx1ZSBvZiBTV0lHX1RZUEVDSEVDS19CT09MIHRvIGJlIDEwMDAwIChpZS4gaGlnaGVyCgkgICAgdGhhbiB0aGF0IG9mIGFsbCBpbnRlZ2VycykuCgkgICAgVGhpcyBpcyBiZWNhdXNlIFJ1YnkgYWxsb3dzIHR5cGVjYXN0aW5nCgkgICAgaW50ZWdlcnMgZG93biB0byBib29sZWFucyB3aGljaCBjYW4gbWFrZSBvdmVybG9hZGVkIGZ1bmN0aW9ucyBvbgoJICAgIGJvb2xzIGFuZCBpbnRlZ2VycyB0byBmYWlsLgoJICAgIChidWcjIDE0ODgxNDIpCgowNS8wMi8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBGaXhlZCBhIHN1YnRsZSBidWcgaW4gbXVsdGlwbGUgYXJnb3V0cyB0aGF0IGNvdWxkIGdldCB0cmlnZ2VyZWQgaWYKCSAgICB0aGUgdXNlciByZXR1cm5lZCB0d28gb3IgbW9yZSBhcmd1bWVudHMgYW5kIHRoZSBmaXJzdCBvbmUgd2FzIGFuCgkgICAgYXJyYXkuCgowNS8wMS8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBJbXByb3ZlZCB0aGUgZG9jdW1lbnRhdGlvbiB0byBkb2N1bWVudCB0aGUgbmV3IGZlYXR1cmVzCiAgICAgICAgICAgIGFkZGVkLCBhZGQgZGlyZWN0b3Jpbi9vdXQvYXJnb3V0IHR5cGVtYXBzLCBldGMuCgowNS8wMS8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBBZGRlZCAlaW5pdHN0YWNrIGFuZCAlaWdub3Jlc3RhY2sgZGlyZWN0aXZlcyBmb3IgZGlyZWN0b3IKCSAgICBmdW5jdGlvbnMuICBUaGVzZSBhbGxvdyB5b3UgdG8gY29udHJvbCB3aGV0aGVyIGEgZGlyZWN0b3IKCSAgICBmdW5jdGlvbiBzaG91bGQgcmUtaW5pdCB0aGUgUnVieSBzdGFjay4KCSAgICBUaGlzIGlzIHNvbWV0aW1lcyBuZWVkZWQgZm9yIGFuIGVtYmVkZGVkIFJ1Ynkgd2hlcmUgdGhlCgkgICAgZGlyZWN0b3IgbWV0aG9kIGlzIHVzZWQgYXMgYSBDKysgY2FsbGJhY2sgYW5kIG5vdCBjYWxsZWQKICAgICAgICAgICAgYnkgdGhlIHVzZXIgZnJvbSBydWJ5IGNvZGUuCgkgICAgRXhwbGFuYXRpb246CgkgICAgUnVieSdzIEdDIG5lZWRzIHRvIGJlIGF3YXJlIG9mIHRoZSBydW5uaW5nIE9TIHN0YWNrIGluIG9yZGVyIHRvCgkgICAgbWFyayBhbnkgVkFMVUUgKFJ1Ynkgb2JqZWN0cykgaXQgZmluZHMgdGhlcmUgdG8gYXZvaWQgY29sbGVjdGlvbgoJICAgIG9mIHRoZW0uICBUaGlzIGFsbG93cyB0aGUgcnVieSBBUEkgdG8gYmUgdmVyeSBzaW1wbGUgYW5kIGFsbG93cwoJICAgIHlvdSB0byB3cml0ZSBjb2RlIGxpa2UgIlZBTFVFIGEgPSBzdGgiIGFueXdoZXJlIHdpdGhvdXQgbmVlZGluZwoJICAgIHRvIGRvIHRoaW5ncyBsaWtlIHJlZmNvdW50aW5nIGxpa2UgcHl0aG9uLgoJICAgIEJ5IGRlZmF1bHQsIHRoZSBzdGFydCBvZiB0aGUgc3RhY2sgaXMgc2V0IHdoZW4gcnVieV9pbml0KCkgaXMKCSAgICBjYWxsZWQuICAgSWYgcnVieSBpcyBpbml0ZWQgd2l0aGluIG1haW4oKSwgYXMgaXQgdXN1YWxseSBpcyB0aGUKCSAgICBjYXNlIHdpdGggdGhlIG1haW4gcnVieSBleGVjdXRhYmxlLCBydWJ5IHdpbGwgYmUgYWJsZSB0byBjYWxjdWxhdGUKCSAgICBpdHMgc3RhY2sgcHJvcGVybHkuICBIb3dldmVyLCB3aGVuIHRoaXMgaXMgbm90IHBvc3NpYmxlLCBhcyB3aGVuCgkgICAgcnVieSBpcyBlbWJlZGRlZCBhcyBhIHBsdWdpbiB0byBhbiBhcHBsaWNhdGlvbiB3aGVyZSBtYWluIGlzIG5vdAoJICAgIGF2YWlsYWJsZSwgcnVieV9pbml0KCkgd2lsbCBiZSBjYWxsZWQgaW4gdGhlIHdyb25nIHBsYWNlLCBhbmQKCSAgICBydWJ5IHdpbGwgYmUgaW5jb3JyZWN0bHkgdHJhY2tpbmcgdGhlIHN0YWNrIGZyb20gdGhlIGZ1bmN0aW9uCgkgICAgdGhhdCBjYWxsZWQgcnVieV9pbml0KCkgZm9yd2FyZHMgb25seSwgd2hpY2ggY2FuIGxlYWQgdG8KCSAgICBhbGwgc29ydHMgb2Ygd2VpcmQgY3Jhc2hlcyBvciB0byBydWJ5IHRoaW5raW5nIGl0IGhhcyBydW4gb3V0IG9mCgkgICAgc3RhY2sgc3BhY2UgaW5jb3JyZWN0bHkuCgkgICAgVG8gYXZvaWQgdGhpcywgZGlyZWN0b3IgKGNhbGxiYWNrKSBmdW5jdGlvbnMgY2FuIG5vdyBiZSB0YWdnZWQKCSAgICB0byB0cnkgdG8gcmVzZXQgdGhlIHJ1Ynkgc3RhY2ssIHdoaWNoIHdpbGwgc29sdmUgdGhlIGlzc3Vlcy4KCSAgICBOT1RFOiBydWJ5MS44LjYgc3RpbGwgY29udGFpbnMgYSBidWcgaW4gaXQgaW4gdGhhdCBpdHMgZnVuY3Rpb24KCSAgICB0byByZXNldCB0aGUgc3RhY2sgd2lsbCBub3QgYWx3YXlzIGRvIHNvLiAgVGhpcyBidWcgaXMgdHJpZ2dlcmVkCgkgICAgdmVyeSByYXJlbHksIHdoZW4gcnVieSBpcyBjYWxsZWQgZnJvbSB0d28gdmVyeSBkaXN0aW5jdCBwbGFjZXMKCSAgICBpbiBtZW1vcnksIGxpa2UgYSBicmFuY2ggb2YgbWFpbigpIGFuZCBhbm90aGVyIGRzby4gIFRoaXMgYnVnCgkgICAgaGFzIG5vdyBiZWVuIHJlcG9ydGVkIHRvIHJ1YnktY29yZSBhbmQgaXMgcGVuZGluZyBmdXJ0aGVyCgkgICAgaW52ZXN0aWdhdGlvbi4KCSAgICAoYnVnICMxNzAwNTM1IGFuZCBwYXRjaCAjMTcwMjkwNykKCjA0LzMwLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTcwNzU4MiAtIFJlc3RvcmUgYnVpbGRpbmcgZnJvbSByZWFkLW9ubHkgc291cmNlIGRpcmVjdG9yaWVzLgoKMDQvMzAvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgUnVieSB3aWxsIG5vdyByZXBvcnQgdGhlIHBhcmFtZXRlciBpbmRleCBwcm9wZXJseSBvbiB0eXBlCgkgICAgZXJyb3JzIGFzIHdlbGwgYXMgdGhlIGNsYXNzIGFuZCB2YWx1ZSBvZiB0aGUgaW5jb3JyZWN0CgkgICAgYXJndW1lbnQgcGFzc2VkLgoJICAgIChmZWF0dXJlIHJlcXVlc3QgIzE2OTk2NzApCgowNC8zMC8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBSdWJ5IG5vIGxvbmdlciBjcmVhdGVzIHRoZSBmcmVlX0NsYXNzIGZ1bmN0aW9uIGlmIHRoZSBjbGFzcwoJICAgIGNvbnRhaW5zIGl0cyBvd24gdXNlciBkZWZpbmVkIGZyZWUgZnVuY3Rpb24gKCVmcmVlZnVuYykuCgkgICAgKGJ1ZyAjMTcwMjg4MikKCjA0LzMwLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIE1hZGUgZGlyZWN0b3JzIHJhaXNlIGEgcnVieSBleGNlcHRpb24gZm9yIGluY29ycmVjdCBhcmdvdXQKCSAgICByZXR1cm5lZCB2YWx1ZXMgaWYgUlVCWV9FTUJFRERFRCBpcyBzZXQsIGluc3RlYWQgb2YgdGhyb3dpbmcKCSAgICBhbiBhY3R1YWwgU3dpZ0RpcmVjdG9yIGV4Y2VwdGlvbi4KCSAgICBUaGlzIHdpbGwgcHJldmVudCBjcmFzaGVzIHdoZW4gcnVieSBpcyBlbWJlZGRlZCBhbmQgdW5hd2FyZQoJICAgIG9mIHRoZSBTd2lnRGlyZWN0b3IgZXhjZXB0aW9uLgoKMDQvMzAvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgUmVtb3ZlZCB0aGUgbmVlZCBmb3IgLURTV0lHRVhURVJOLgoJICAgIENoYW5nZWQgc3dpZ19ydWJ5X3RyYWNraW5ncyB0byBiZSBhIHN0YXRpYyB2YXJpYWJsZSwgYnV0IGFsc28KCSAgICBiZSBrZXB0IHdpdGhpbiBhIGhpZGRlbiBpbnN0YW5jZSB2YXJpYWJsZSBpbiB0aGUgU1dJRyBtb2R1bGUuCgkgICAgVGhpcyBhbGxvd3MgcHJvcGVybHkgZGVhbGluZyB3aXRoIHRyYWNraW5ncyBhY3Jvc3MgbXVsdGlwbGUKCSAgICBEU09zLCB3aGljaCB3YXMgcHJldmlvdXNseSBicm9rZW4uCgkgICAgKGJ1ZyAjMTcwMDUzNSBhbmQgaW1wcm92ZW1lbnQgdG8gcGF0Y2ggIzE3MDI5MDcpCgowNC8yOS8yMDA3OiBnZ2EKCSAgICBbUnVieV0gRml4ZWQgR0MgbWVtb3J5IGlzc3VlcyB3aXRoIHRyYWNraW5ncyB0aGF0IGNvdWxkIGxlYWQKCSAgICB0byBzZWdmYXVsdHMgd2hlbiBkZWFsaW5nLCBtYWlubHksIHdpdGggc3RhdGljIHZhcmlhYmxlcy4KCSAgICAoYnVnICMxNzAwNTM1IGFuZCBwYXRjaCAjMTcwMjkwNykKCjA0LzI5LzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEZpeGVkIFN0cmluZyBjb252ZXJzaW9uIHVzaW5nIG9sZCBydWJ5MS42IG1hY3Jvcy4gIE5vdwoJICAgIFN0cmluZ1ZhbHVlUHRyKCkgaXMgdXNlZCBpZiBhdmFpbGFibGUuICBUaGlzIHJlbW92ZXMgd2FybmluZ3MKCSAgICB3aGVuIGNvbnZlcnRpbmcgc3RyaW5ncyB3aXRoIFwwIGluIHRoZW0uCgkgICAgKGJ1ZyAjMTcwMDUzNSBhbmQgcGF0Y2ggIzE3MDI5MDcpCgowNC8yOS8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBGaXhlZCB0aGUgYXJnb3V0IGNvdW50IGluIGRpcmVjdG9ycyBmb3IgUnVieS4gIFByZXZpb3VzbHksCgkgICAgaWdub3JlZCBvciAibnVtaW5wdXRzPTAiIHR5cGVtYXBzIHdvdWxkIGluY29ycmVjdGx5IG5vdCBnZXQKCSAgICBjb3VudGVkIHRvd2FyZHMgdGhlIGFyZ291dCBjb3VudC4KCSAgICAoYnVnL3BhdGNoICMxNTQ1NTg1KQoKMDQvMjkvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgVXBncmFkZWQgUnVieSBjb252ZXJ0ZXIgdG8gcmVjb2duaXplICJudW1pbnB1dHM9MCIuICBQcmV2aW91c2x5LAoJICAgIG9ubHkgdGhlIG9sZCAiaWdub3JlIiBmbGFnIHdhcyBjaGVja2VkICh3aGljaCB3b3VsZCBjdXJyZW50bHkKCSAgICBzdGlsbCB3b3JrIHByb3Blcmx5LCBidXQgaXMgZGVwcmVjYXRlZCkuCgowNC8yOS8yMDA3OiBnZ2EKCSAgICBbUnVieSAtIGJ1dCBzaG91bGQgYmUgbWFkZSBnZW5lcmljXQoKCSAgICAlZmVhdHVyZSgibnVtb3V0cHV0cyIsIjAiKSBhZGRlZC4KCgkgICAgVGhpcyBmZWF0dXJlIGFsbG93cyB5b3UgdG8gaWdub3JlIHRoZSBvdXRwdXQgb2YgYSBmdW5jdGlvbiBzbwoJICAgIHRoYXQgaXQgaXMgbm90IGFkZGVkIHRvIGEgbGlzdCBvZiBvdXRwdXQgdmFsdWVzCgkgICAgKCBpZS4gYXJnb3V0cyApLgoJICAgIFRoaXMgc2hvdWxkIGFsc28gYmVjb21lIGEgZmVhdHVyZSBvZiAldHlwZW1hcChkaXJlY3Rvcm91dCkKCSAgICBhcyAibnVtb3V0cHV0cyI9MCwganVzdCBsaWtlICJudW1pbnB1dHMiPTAgZXhpc3RzLgoKCSAgICAlZmVhdHVyZSgiZGlyZWN0b3JzIj0xKQoKCSAgICAlaW5jbHVkZSA8dHlwZW1hcHMuaT4KCgkgICAgJWZlYXR1cmUoIm51bW91dHB1dHMiLCIwIikgeyBDbGFzczo6bWVtYmVyX2Z1bmN0aW9uMSB9OwoJICAgICV0eXBlbWFwKG91dCkgTVN0YXR1cyB7IC8vIHNvbWUgY29kZSwgbGlrZSBjaGVjayBtc3RhdHVzCgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHJhaXNlIGV4Y2VwdGlvbiBpZiB3cm9uZyB9OwoKCSAgICAlaW5saW5lICV7CgkgICAgICB0eXBlZGVmIGludCBNU3RhdHVzOwoJICAgICAgY2xhc3MgQ2xhc3MgewoKCSAgICAgIC8vIG9uZSBhcmd1bWVudCByZXR1cm5lZCwgYnV0IGRpcmVjdG9yIG91dCBjb2RlIGFkZGVkCgkgICAgICAvLyBNU3RhdHVzIGlzIGRpc2NhcmRlZCBhcyBhIHJldHVybiAob3V0KSBwYXJhbWV0ZXIuCgkgICAgICB2aXJ0dWFsIE1TdGF0dXMgbWVtYmVyX2Z1bmN0aW9uMSggaW50JiBPVVRQVVQgKTsKCgkgICAgICAvLyB0d28gYXJndW1lbnRzIHJldHVybmVkLCBkaXJlY3RvciBvdXQgY29kZSBhZGRlZAoJICAgICAgLy8gTVN0YXR1cyBpcyBub3QgZGlzY2FyZGVkCgkgICAgICB2aXJ0dWFsIE1TdGF0dXMgbWVtYmVyX2Z1bmN0aW9uMiggaW50JiBPVVRQVVQgKTsKCSAgICAgIH07CiAgICAgICAgICAgICV9CgoKMDQvMjEvMjAwNzogb2xseQoJICAgIEZpeCBwYXJzaW5nIG9mIGZsb2F0IGNvbnN0YW50cyB3aXRoIGFuIGV4cG9uZW50IChlLmcuIDFlLTAyZikKCSAgICAoYnVnICMxNjk5NjQ2KS4KCjA0LzIwLzIwMDc6IG9sbHkKCSAgICBbUHl0aG9uXSBGaXggbGFjayBvZiBnZW5lcmF0aW9uIG9mIGRvY3N0cmluZ3Mgd2hlbiAtTyBpcyB1c2VkLgoJICAgIEFsc28sIGZpeCBnZW5lcmF0aW9uIG9mIGRvY3N0cmluZ3MgY29udGFpbmluZyBhIGRvdWJsZSBxdW90ZQoJICAgIGNoYXJhY3Rlci4gIFBhdGNoIGZyb20gUmljaGFyZCBCb3VsdG9uIGluIGJ1ZyMxNzAwMTQ2LgoKMDQvMTcvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBTdXBwb3J0IGZvciBhZGRpbmcgaW4gSmF2YS9DIyBjb2RlIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGludGVybWVkaWFyeSBjYWxsLAogICAgICAgICAgICBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byB0aGUgbWFyc2hhbGxpbmcgb2YgdGhlIHByb3h5IHR5cGUgdG8gdGhlIGludGVybWVkaWFyeSB0eXBlLgogICAgICAgICAgICBUaGUgamF2YWluL2NzaW4gdHlwZW1hcCBub3cgc3VwcG9ydHMgdGhlICdwcmUnIGFuZCAncG9zdCcgYXR0cmlidXRlcyB0byBhY2hpZXZlIHRoaXMuCiAgICAgICAgICAgIFRoZSBqYXZhaW4gdHlwZW1hcCBhbHNvIHN1cHBvcnRzIGFuIG9wdGlvbmFsICdwZ2NwcG5hbWUnIGF0dHJpYnV0ZSBmb3IgcHJlbWF0dXJlIGdhcmJhZ2UKICAgICAgICAgICAgY29sbGVjdGlvbiBwcmV2ZW50aW9uIHBhcmFtZXRlciBuYW1pbmcgYW5kIHRoZSBjc2luIHR5cGVtYXAgc3VwcG9ydHMgYW4gb3B0aW9uYWwgJ2NzaGluJwogICAgICAgICAgICBhdHRyaWJ1dGUgZm9yIHRoZSBwYXJhbWV0ZXIgdHlwZSB1c2VkIGluIGEgY29uc3RydWN0b3IgaGVscGVyIGdlbmVyYXRlZCB3aGVuIHRoZSB0eXBlIGlzIHVzZWQKICAgICAgICAgICAgaW4gYSBjb25zdHJ1Y3Rvci4gRGV0YWlscyBpbiB0aGUgSmF2YS5odG1sIGFuZCBDU2hhcnAuaHRtbCBkb2N1bWVudGF0aW9uLgoKMDQvMTYvMjAwNzogb2xseQoJICAgIERvbid0IHRyZWF0IGByZXN0cmljdCcgYXMgYSByZXNlcnZlZCBpZGVudGlmaWVyIGluIEMrKyBtb2RlCgkgICAgKGJ1ZyMxNjg1NTM0KS4KCjA0LzE2LzIwMDc6IG9sbHkKCSAgICBbUEhQNV0gRml4IGhvdyB6ZW5kX3Rocm93X2V4Y2VwdGlvbigpIGlzIGNhbGxlZCAoYnVnICMxNzAwNzg1KS4KCjA0LzEwLzIwMDc6IG9sbHkKCSAgICBEZWZpbmUgU1dJR1RFTVBMQVRFRElTQU1CSUdVQVRPUiB0byB0ZW1wbGF0ZSBmb3IgYUNDIChyZXBvcnRlZCBvbgoJICAgIHN3aWctdXNlciB0aGF0IHRoaXMgaXMgbmVlZGVkKS4KCjA0LzA0LzIwMDc6IG9sbHkKCSAgICBbUEhQNV0gSWYgWlRTIGlzIGVuYWJsZWQsIHJlbGVhc2UgPG1vZHVsZT5fZ2xvYmFsc19pZCBpbiBNU0hVVERPV04KCSAgICB0byBhdm9pZCBQSFAgaW50ZXJwcmV0ZXIgY3Jhc2ggb24gc2h1dGRvd24uICBUaGlzIHNvbHV0aW9uIHdhcwoJICAgIHN1Z2dlc3RlZCBoZXJlOiBodHRwOi8vYnVncy5waHAubmV0L2J1Zy5waHA/aWQ9NDA5ODUKCjA0LzAzLzIwMDc6IG9sbHkKCSAgICBbUEhQNF0gQWRkIG1pc3NpbmcgWlRTIGFubm90YXRpb25zIHRvIGdlbmVyYXRlZCBDKysgd3JhcHBlciBjb2RlCgkgICAgdG8gZml4IGNvbXBpbGF0aW9uIGZhaWx1cmVzIHdoZW4gdXNpbmcgWlRTIGVuYWJsZWQgU1dJRyAoTGludXgKCSAgICBkaXN0cmlidXRpb25zIHRlbmQgdG8gZGlzYWJsZSBaVFMsIGJ1dCBub3RhYmx5IHRoZSBXaW5kb3dzIGJ1aWxkCgkgICAgdXNlcyBpdCBieSBkZWZhdWx0KS4KCjA0LzAxLzIwMDc6IGVmdXp6eW9uZQogICAgICAgICAgICBbQ0ZGSV0gUGF0Y2ggIzE2ODQyNjE6IGZpeGVzIGhhbmRsaW5nIG9mIHVuc2lnbmVkIGludCBsaXRlcmFscywgdGhhbmtzIExlaWdoIFNtaXRoLgogICAgICAgICAgICBBbHNvLCBpbXByb3ZlZCBkb2N1bWVudGF0aW9uLgoKMDMvMzAvMjAwNzogb2xseQoJICAgIEF2b2lkIGdlbmVyYXRpbmcgJzw6JyB0b2tlbiB3aGVuIHVzaW5nIFN3aWdWYWx1ZVdyYXBwZXI8PiBvbiBhIHR5cGUKCSAgICB3aGljaCBzdGFydHMgd2l0aCAnOjonIChwYXRjaCAjMTY5MDk0OCkuCgowMy8yNS8yMDA3OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbcGVybDVdIEFkZCBTV0lHX2ZhaWwgdG8gdGhlIFNXSUdfZXhjZXB0aW9uIG1hY3JvLiAgRml4ZXMgYSBmZXcgcHJvYmxlbXMgcmVwb3J0ZWQKCSAgICBvbiB0aGUgbWFpbGluZyBsaXN0LgoKMDMvMjMvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgU3RyaW5nIGNvcHlpbmcgcGF0Y2ggZnJvbSBKb3NoIENoZXJyeSByZWR1Y2luZyBtZW1vcnkgY29uc3VtcHRpb24gYnkgYWJvdXQgMjUlLgoKMDMvMjEvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEFwcGx5IHBhdGNoICMxNjMxOTg3IGZyb20gVWxyaWsgUGV0ZXJzb24gLSBib29sIElOT1VUIHR5cGVtYXBzCiAgICAgICAgICAgIGZhaWwgb24gYmlnIGVuZGlhbiBtYWNoaW5lcy4KCjAzLzE2LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzZWcgZmF1bHQgZ2l2ZW4gZG9kZ3kgQysrIGNvZGU6IG5hbWVzcGFjZSBhYmM6OmRlZiB7IH0KCjAzLzE2LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXhlcyBzbyB0aGF0IEFSUkFZU09GQ0xBU1NFUyBhbmQgQVJSQVlTT0ZFTlVNUyBpbiBhcnJheXNfamF2YS5pIGNhbiBiZSBhcHBsaWVkCiAgICAgICAgICAgIHRvIHBvaW50ZXIgdHlwZXMuCgowMy8wMy8yMDA3OiBvbGx5CgkgICAgW1BIUDVdIFdoZW4gd2Uga25vdyB0aGUgbGl0ZXJhbCBudW1lcmljIHZhbHVlIGZvciBhIGNvbnN0YW50LCB1c2UKCSAgICB0aGF0IHRvIGluaXRpYWxpc2UgdGhlIGNvbnN0IG1lbWJlciBpbiB0aGUgUEhQIHdyYXBwZXIgY2xhc3MuCgowMy8wMi8yMDA3OiBvbGx5CgkgICAgW1BIUDVdIEZpeCBQSFAgd3JhcHBlciBjb2RlIGdlbmVyYXRlZCBmb3IgY2VydGFpbiBjYXNlcyBvZgoJICAgIG92ZXJsb2FkZWQgZm9ybXMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cy4KCjAyLzI2LzIwMDc6IGVmdXp6eW9uZQogICAgICAgICAgICBbQ0ZGSV0gUGF0Y2ggIzE2NTYzOTU6IGZpeGVkIGhleCBhbmQgb2N0YWwgdmFsdWVzIGJ1ZywgdGhhbmtzIHRvIEFydGh1ciBTbXlsZXMuCgowMi8yMi8yMDA3OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBGaXhlZCBidWcgaW4gdHlwZW1hcHMgd2hpY2ggY2F1c2VkIGRlcml2ZWRfYnl2YWx1ZSBhbmQgcm5hbWUgdGVzdCBjYXNlcyB0byBmYWlsLgoJICAgIFVwZGF0ZWQgZGVyaXZlZF9ieXZhbHVlLmkgdG8gZXhwbGFpbiBob3cgdG8gZmluZCBhbmQgZml4IHRoZSBwcm9ibGVtCgowMS8yNS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzE1Mzg1MjIgYW5kICMxMzM4NTI3LCBmb3J3YXJkIHRlbXBsYXRlZCBjbGFzcyBkZWNsYXJhdGlvbnMgd2l0aG91dCBhCiAgICAgICAgICAgIG5hbWUgZm9yIHRoZSB0ZW1wbGF0ZWQgY2xhc3MgcGFyYW1ldGVycywgc3VjaCBhczoKCiAgICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lLCBjbGFzcz4gY2xhc3MgWDsKCjAxLzIzLzIwMDc6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIFBhdGNoICMxNjQwODYyOiA8bWFsbG9jLmg+IHJlcGxhY2VkIGJ5IDxzdGRsaWIuaD4KCSAgICBQYXRjaCAjMTU5ODA2MyBUeXBvIGluIHR5cGVtYXBzLmkKCjAxLzIyLzIwMDc6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEFkZGVkIGEgbHVhIHNwZWNpZmljIGNhcnJheXMuaSB3aGljaCBhZGRzIHRoZSBvcGVyYXRvcltdIHN1cHBvcnQuCgkgICAgbW9kaWZpZWQgdGhlIG1haW4gY29kZSB0byBtYWtlIGl0IG5vdCBlbWl0IGFsbCB0aGUgY2xhc3MgbWVtYmVyIGZ1bmN0aW9ucyAmIGFjY2Vzc29ycwoJICAgIE5vdGU6IEMgc3RydWN0cyBhcmUgY3JlYXRlZCB1c2luZyBuZXdfWFhYKCkgd2hpbGUgQysrIGNsYXNzZXMgdXNlIFhYWCgpIChzaG91bGQgYmUgc3RhbmRhcmRpc2VkKQoJICAgIFVwZGF0ZWQgdGVzdCBjYXNlOiBsaV9jYXJyYXlzCgkgICAgVXBkYXRlZCB0aGUgZG9jdW1lbnRhdGlvbi4KCjAxLzEyLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQaHBdIEFkZCBzdXBwb3J0IGZvciBuZXdmcmVlIHR5cGVtYXBzIChzb21ldGltZXMgdXNlZCBieSAlbmV3b2JqZWN0KQoKMDEvMTIvMjAwNzogYmVhemxleQogICAgICAgICAgICBOZXcgY29tbWFuZCBsaW5lIG9wdGlvbiAtbWFjcm9lcnJvcnMuICAgV2hlbiBzdXBwbGllZCwgdGhpcyB3aWxsIGZvcmNlCiAgICAgICAgICAgIHRoZSBDIHNjYW5uZXIvcGFyc2VyIHRvIHJlcG9ydCBwcm9wZXIgbG9jYXRpb24gaW5mb3JtYXRpb24gZm9yIGNvZGUgY29udGFpbmVkCiAgICAgICAgICAgIGluc2lkZSBTV0lHIG1hY3JvcyAoZGVmaW5lZCB3aXRoICVkZWZpbmUpLiAgQnkgZGVmYXVsdCwgU1dJRyBtZXJlbHkgcmVwb3J0cwogICAgICAgICAgICBlcnJvcnMgb24gdGhlIGxpbmUgYXQgd2hpY2ggYSBtYWNybyBpcyB1c2VkLiAgV2l0aCB0aGlzIG9wdGlvbiwgeW91CiAgICAgICAgICAgIGNhbiBleHBhbmQgdGhlIGVycm9yIGJhY2sgdG8gaXRzIHNvdXJjZS0tLXNvbWV0aGluZyB3aGljaCBtYXkgc2ltcGxpZnkKICAgICAgICAgICAgZGVidWdnaW5nLgoKMDEvMTIvMjAwNzogYmVhemxleQogICAgICAgICAgICBbSW50ZXJuYWxzXSBNYWpvciBvdmVyaGF1bCBvZiBDL0MrKyBzY2FubmluZyBpbXBsZW1lbnRhdGlvbi4gIEZvciBxdWl0ZQogICAgICAgICAgICBzb21lIHRpbWUsIFNXSUcgY29udGFpbmVkIHR3byBjb21wbGV0ZWx5IGluZGVwZW5kZW50IEMvQysrIHRva2VuaXplcnMtLQogICAgICAgICAgICB0aGUgbGVnYWN5IHNjYW5uZXIgaW4gQ1BhcnNlL2NzY2FubmVyLmMgYW5kIGEgZ2VuZXJhbCBwdXJwb3NlIHNjYW5uZXIKICAgICAgICAgICAgaW4gU3dpZy9zY2FubmVyLmMuIFNXSUcgc3RpbGwgaGFzIHR3byBzY2FubmluZyBtb2R1bGVzLCBidXQgdGhlIEMgcGFyc2VyCiAgICAgICAgICAgIHNjYW5uZXIgKENQYXJzZS9jc2Nhbm5lci5jKSBub3cgcmVsaWVzIHVwb24gdGhlIGdlbmVyYWwgcHVycG9zZQogICAgICAgICAgICBzY2FubmVyIGZvdW5kIGluIFN3aWcvc2Nhbm5lci5jLiAgQXMgYSByZXN1bHQsIGl0IGlzIG11Y2ggc21hbGxlciBhbmQKICAgICAgICAgICAgbGVzcyBjb21wbGljYXRlZC4gIFRoaXMgY2hhbmdlIGFsc28gbWFrZXMgaXQgcG9zc2libGUgdG8gbWFpbnRhaW4gYWxsCiAgICAgICAgICAgIG9mIHRoZSBsb3ctbGV2ZWwgQyB0b2tlbml6aW5nIGluIG9uZSBjZW50cmFsIGxvY2F0aW9uIGluc3RlYWQgb2YgdHdvCiAgICAgICAgICAgIHBsYWNlcyBhcyBiZWZvcmUuCgogICAgICAgICAgICAqKipQT1RFTlRJQUwgRkxBS0lORVNTKioqCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIG1heSBjYXVzZSBwcm9ibGVtcyB3aXRoIGFjY3VyYXRlIGxpbmUgbnVtYmVyIHJlcG9ydGluZwogICAgICAgICAgICBhcyB3ZWxsIGFzIGVycm9yIHJlcG9ydGluZyBtb3JlIGdlbmVyYWxseS4gSSBoYXZlIHRyaWVkIHRvIHJlc29sdmUgdGhpcwogICAgICAgICAgICBhcyBtdWNoIGFzIHBvc3NpYmxlLCBidXQgdGhlcmUgbWlnaHQgYmUgc29tZSBjb3JuZXIgY2FzZXMuCgowMS8xMi8yMDA3OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBBZGRlZCB0eXBlbWFwIHRocm93cyBmb3Igc3RkOjpzdHJpbmcqLCB0eXBlbWFwIGZvciBTV0lHVFlQRSBEWU5BTUlDLAoJICAgIGNoYW5nZWQgdGhlIGV4aXN0aW5nIHRocm93cyB0eXBlbWFwIHRvIHRocm93IGEgc3RyaW5nIGluc3RlYWQgb2YgbWFraW5nIGEgY29weSBvZgoJICAgIHRoZSBvYmplY3QgKHVwZGF0aW5nIGEgZmV3IHRlc3QgY2FzZXMgdG8gZGVhbCB3aXRoIHRoZSBjaGFuZ2UpLgoJICAgIGZpeGVkIHRlc3QgY2FzZTogZHluYW1pY19jYXN0cywgZXhjZXB0aW9uX3BhcnRpYWxfaW5mbywgbGlfc3RkX3N0cmluZywgc2l6ZV90CgowMS8wMy8yMDA3OiBiZWF6bGV5CiAgICAgICAgICAgIFtJbnRlcm5hbHNdLiAgVXNlIG9mIHN3aWdrZXlzLmMvLmggdmFyaWFibGVzIGlzIHJldm9rZWQuICBQbGVhc2UgdXNlCiAgICAgICAgICAgIHNpbXBsZSBzdHJpbmdzIGZvciBhdHRyaWJ1dGUgbmFtZXMuCgoxMi8zMC8yMDA2OiBiZWF6bGV5CiAgICAgICAgICAgIEludGVybmFsIEFQSSBmdW5jdGlvbnMgSGFzaEdldEF0dHIoKSBhbmQgSGFzaENoZWNrQXR0cigpIGhhdmUgYmVlbiByZXZva2VkLgogICAgICAgICAgICBQbGVhc2UgdXNlIEdldGF0dHIoKSB0byByZXRyaWV2ZSBhdHRyaWJ1dGVzLiAgVGhlIGZ1bmN0aW9uIENoZWNrYXR0cigpIGNhbgogICAgICAgICAgICBiZSB1c2VkIHRvIGNoZWNrIGF0dHJpYnV0ZXMuICBOb3RlOiAgVGhlc2UgZnVuY3Rpb25zIGhhdmUgYmVlbiByZXZva2VkCiAgICAgICAgICAgIGJlY2F1c2UgdGhleSBvbmx5IGFkZGVkIGEgbWFyZ2luYWwgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgYXQgdGhlIGV4cGVuc2UKICAgICAgICAgICAgY29kZSBjbGFyaXR5LgoKMTIvMjYvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gQWRkZWQgbW9yZSBTVEwgKG1vcmUgZXhjZXB0aW9ucywgbWFwLCBzaXplX3QpLAoJICAgIGZpeGVkIHRlc3QgY2FzZTogY29udmVyc2lvbl9uc190ZW1wbGF0ZS4KCjEyLzIxLzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIFVwZGF0ZSB0byB0aHJvdyBlcnJvcnMgd2hlbiBzZXR0aW5nIGltbXV0YWJsZXMsCgkgICAgYW5kIGFsbG93aW5nIHVzZXIgYWRkaXRpb24gb2YgbW9kdWxlIHZhcmlhYmxlcy4KCjEyLzIwLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB0eXBlZGVmJ2QgdmFyaWFibGUgd3JhcHBlcnMgdGhhdCB1c2UgJW5hdHVyYWx2YXIsIGVnLCBzdGQ6OnN0cmluZy4KCjEyLzE0LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQWRkIHN0ZDo6d3N0cmluZyBhbmQgd2NoYXJfdCB0eXBlbWFwcwoKMTIvMTQvMjAwNjogb2xseQoJICAgIFtwaHBdIEZpeCBidWcgIzE2MTM2NzMgKGJhZCBQSFA1IGNvZGUgZ2VuZXJhdGVkIGZvciBnZXR0ZXJzIGFuZAoJICAgIHNldHRlcnMpLgoKMTIvMDIvMjAwNjogd3NmdWx0b24sIEpvaG4gTGVueiwgRGF2ZSBCZWF6bGV5CiAgICAgICAgICAgIE1vdmUgZnJvbSBjdnMgdG8gU3VidmVyc2lvbiBmb3Igc291cmNlIGNvbnRyb2wKCjExLzMwLzIwMDY6IGJlYXpsZXkKICAgICAgICAgICAgQ2xlYW5lZCB1cCBzd2lnd2FybmluZ3Muc3dnIGZpbGUgbm90IHRvIHVzZSBuZXN0ZWQgbWFjcm8KICAgICAgICAgICAgZGVmaW5pdGlvbnMuCgoxMS8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEZpeCBmb3IgJWV4dGVuZCB0byB3b3JrIGZvciBzdGF0aWMgbWVtYmVyIHZhcmlhYmxlcy4KClZlcnNpb24gMS4zLjMxIChOb3ZlbWJlciAyMCwgMjAwNikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTEvMTIvMjAwNjogTHVpZ2kgQmFsbGFiaW8KICAgICAgICAgICAgW1B5dGhvbl0gQWx0ZXJuYXRlIGZpeCBmb3IgUHl0aG9uIGV4Y2VwdGlvbnMgYnVnICMxNTc4MzQ2ICh0aGUgcHJldmlvdXMgb25lIGJyb2tlIFB5dGhvbgogICAgICAgICAgICBwcm9wZXJ0aWVzIGluIG1vZGVybiBjbGFzc2VzKQoKMTEvMTIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgLWZha2V2ZXJzaW9uIGNvbW1hbmRsaW5lIG9wdGlvbiBub3cgZ2VuZXJhdGVzIHRoZSBmYWtlIHZlcnNpb24gaW50byB0aGUgZ2VuZXJhdGVkIHdyYXBwZXJzCiAgICAgICAgICAgIGFzIHdlbGwgYXMgZGlzcGxheWluZyBpdCB3aGVuIHRoZSAtdmVyc2lvbiBjb21tYW5kbGluZSBvcHRpb24gaXMgdXNlZC4KCjE0LzExLzIwMDY6IG1nb3NzYWdlCgkgICAgW2x1YV0gdXBkYXRlIHRvIHR5cGVtYXAgZm9yIG9iamVjdCBieSB2YWx1ZSwgdG8gbWFrZSBpdCBjODkgY29tcGxpYW50CgpWZXJzaW9uIDEuMy4zMCAoTm92ZW1iZXIgMTMsIDIwMDYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjExLzEyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtqYXZhXSBSZW1vdmUgRGV0YWNoQ3VycmVudFRocmVhZCBwYXRjaCBmcm9tICAwOC8xMS8yMDA2IC0gaXQgY2F1c2VzIHNlZ2ZhdWx0cwogICAgICAgICAgICBvbiBzb21lIHN5c3RlbXMuCgoxMS8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbcHl0aG9uXSBGaXggIzE1NzgzNDYgLSBQeXRob24gZXhjZXB0aW9ucyB3aXRoIC1tb2Rlcm4KCjExLzEwLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTU5MzI5MSAtIFNtYXJ0IHBvaW50ZXJzIGFuZCBpbmhlcml0aW5nIGZyb20gdGVtcGxhdGVzIAoKMTEvMDkvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IGRpcmVjdG9yIG9wZXJhdG9yIHBvaW50ZXIvcmVmZXJlbmNlIGNhc3RzIC0gIzE1OTIxNzMuCgoxMS8wNy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgJHNlbGYgc3BlY2lhbCB2YXJpYWJsZSBmb3IgJWV4dGVuZCBtZXRob2RzLiBQbGVhc2UgdXNlIHRoaXMgaW5zdGVhZCBvZiBqdXN0ICdzZWxmJwogICAgICAgICAgICBhcyB0aGUgQysrICd0aGlzJyBwb2ludGVyLgoKMTEvMDcvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXSAKCSAgICBhbGxlZ3JvY2wuc3dnOiBzd2lnLWRlZnZhciB1cGRhdGVkIHRvIGFsbG93IHNwZWNpZnlpbmcgb2YKCSAgICAJCSAgIG5vbi1kZWZhdWx0IGZvcmVpZ24gdHlwZSAodmlhIDpmdHlwZSBrZXl3b3JkIGFyZykuCgkgICAgYWxsZWdyb2NsLmN4eDogU3BlY2lmeSBwcm9wZXIgYWNjZXNzIHR5cGUgZm9yIGVudW0gdmFsdWVzLgoKMTEvMDMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEvQyNdIEZpeCBjb25zdCBzdGQ6OnN0cmluZyYgcmV0dXJuIHR5cGVzIGZvciBkaXJlY3RvcnMgYXMgcmVwb3J0ZWQgYnkKICAgICAgICAgICAgTWFyayBEb25zZWx6bWFubgoKMTAvMjkvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFJlbW92ZSBEZWxldGVMb2NhbFJlZiBmcm9tIGVuZCBvZiBkaXJlY3RvciBtZXRob2RzIGZvciBub3cgYXMgaXQgaXMgY2F1c2luZyBhCiAgICAgICAgICAgIHNlZyBmYXVsdCB3aGVuIHJ1biBvbiBTb2xhcmlzIDguCgoxMC8yOS8yMDA2OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbR3VpbGVdIFBhdGNoIGZyb20gQ2hyaXMgU2hvZW1ha2VyIHRvIGNsZWFuIHVwIHNvbWUgd2FybmluZ3MgaW4gdGhlIGdlbmVyYXRlZCBjb2RlLgoKMTAvMjkvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEltcG9ydGFudCBmaXggdG8gcHJldmVudCBlYXJseSBnYXJiYWdlIGNvbGxlY3Rpb24gb2YgdGhlIEphdmEgcHJveHkgY2xhc3MKICAgICAgICAgICAgd2hpbGUgaXQgaXMgYmVpbmcgdXNlZCBpbiBhIG5hdGl2ZSBtZXRob2QuIFRoZSBmaW5hbGl6ZXIgY291bGQgZGVzdHJveSB0aGUgdW5kZXJseWluZwogICAgICAgICAgICBDKysgb2JqZWN0IHdoaWxlIGl0IHdhcyBiZWluZyB1c2VkLiBUaGUgcHJvYmxlbSBvY2N1cnMgd2hlbiB0aGUgcHJveHkgY2xhc3MgaXMgbm8KICAgICAgICAgICAgbG9uZ2VyIHN0cm9uZ2x5IHJlYWNoYWJsZSBhZnRlciBhIG5hdGl2ZSBjYWxsLiAgVGhlIHByb2JsZW0gc2VlbXMgdG8gb2NjdXIgaW4KICAgICAgICAgICAgbWVtb3J5IHN0cmVzcyBzaXR1YXRpb25zIG9uIHNvbWUgSlZNcy4gSXQgZG9lcyBub3Qgc2VlbSB0byBvY2N1ciBvbiB0aGUKICAgICAgICAgICAgU3VuIGNsaWVudCBKVk0gdXAgdG8gamRrIDEuNS4gSG93ZXZlciB0aGUgMS42IGNsaWVudCBqZGsgaGFzIGEgbW9yZSBhZ2dyZXNzaXZlIGdhcmJhZ2UKICAgICAgICAgICAgY29sbGVjdG9yIGFuZCBzbyB0aGUgcHJvYmxlbSBkb2VzIG9jY3VyLiBJdCBkb2VzIG9jY3VyIG9uIHRoZSBTdW4gc2VydmVyCiAgICAgICAgICAgIEpWTXMgKGNlcnRhaW5seSAxLjQgb253YXJkcykuIFRoZSBmaXggZW50YWlscyBwYXNzaW5nIHRoZSBwcm94eSBjbGFzcyBpbnRvIHRoZSBuYXRpdmUKICAgICAgICAgICAgbWV0aG9kIGluIGFkZGl0aW9uIHRvIHRoZSBDKysgcG9pbnRlciBpbiB0aGUgbG9uZyBwYXJhbWV0ZXIsIGFzIEphdmEgY2xhc3NlcyBhcmUgbm90CiAgICAgICAgICAgIGNvbGxlY3RlZCB3aGVuIHRoZXkgYXJlIHBhc3NlZCBpbnRvIEpOSSBtZXRob2RzLiBUaGUgZXh0cmEgcGFyYW1ldGVyIGNhbiBiZSBzdXBwcmVzc2VkCiAgICAgICAgICAgIGJ5IHNldHRpbmcgdGhlIG5vcGdjcHAgYXR0cmlidXRlIGluIHRoZSBqdHlwZSB0eXBlbWFwIHRvICIxIiBvciB1c2luZyB0aGUgbmV3IC1ub3BnY3BwCiAgICAgICAgICAgIGNvbW1hbmRsaW5lIG9wdGlvbi4KCiAgICAgICAgICAgIFNlZSBKYXZhLmh0bWwjamF2YV9wZ2NwcCBmb3IgZnVydGhlciBkZXRhaWxzIG9uIHRoaXMgdG9waWMuCgoxMC8yNC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCBzbWFydCBwb2ludGVyIHdyYXBwZXJzLiBUaGUgdmlydHVhbC9vdmVycmlkZS9uZXcga2V5d29yZCBpcyBub3QgZ2VuZXJhdGVkCiAgICAgICAgICAgIGZvciBlYWNoIG1ldGhvZCBhcyB0aGUgc21hcnQgcG9pbnRlciBjbGFzcyBkb2VzIG5vdCBtaXJyb3IgdGhlIHVuZGVybHlpbmcgcG9pbnRlcgogICAgICAgICAgICBjbGFzcyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuIFNGICMxNDk2NTM1CgoxMC8yNC8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbbHVhXSBhZGRlZCBzdXBwb3J0IGZvciBuYXRpdmUgbWV0aG9kcyAmIG1lbWJlciBmdW5jdGlvbiBwb2ludGVycy4KICAgICAgICAgICAgZml4ZWQgdGVzdCBjYXNlcyBhcnJheXNfZGltZW5zaW9ubGVzcyAmIGNwcF9iYXNpYy4gQWRkZWQgbmV3IGV4YW1wbGUgKGZ1bmN0b3IpLgogICAgICAgICAgICB0aWRpZWQgdXAgYSBsaXR0bGUgb2YgdGhlIGNvZGUgKGFyb3VuZCBjbGFzc0hhbmRsZXIpLgoKMTAvMTcvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBkaXJlY3Rvcm91dCB0eXBlbWFwIGNoYW5nZXMgdG8gZmFsbCBpbiBsaW5lIHdpdGggdGhlIG90aGVyIGRpcmVjdG9yCiAgICAgICAgICAgIGxhbmd1YWdlcy4gJHJlc3VsdCBpcyBub3cgdXNlZCB3aGVyZSAkMSB1c2VkIHRvIGJlIHVzZWQuIFBsZWFzZSBjaGFuZ2UgeW91ciB0eXBlbWFwcwogICAgICAgICAgICBpZiB5b3UgaGF2ZSBhIGN1c3RvbSBkaXJlY3Rvcm91dCB0eXBlbWFwLgoKMTAvMTgvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgU29tZSBmaXhlcyBmb3IgYXBwbHlpbmcgdGhlIGNoYXIgYXJyYXkgdHlwZW1hcHMgdG8gdW5zaWduZWQgY2hhciBhcnJheXMuCgoxMC8xNy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIEFkZCBpbiBjb25zdCBzaXplX3QmIGFuZCBjb25zdCBzdGQ6OnNpemVfdCYgdHlwZW1hcHMuCgoxMC8xNS8yMDA2OiBlZnV6enlvbmUgCiAgICAgICAgICAgIFtDRkZJXSBTdXBwcmVzcyBnZW5lcmF0aW5nIGRlZmN0eXBlIGZvciBlbnVtcywgdGhhbmtzIHRvIEFydGh1ciBTbXlsZXMuIFBhdGNoIDE1NjA5ODMuIAoKMTAvMTQvMjAwNjogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtDaGlja2VuXSBNaW5vciBmaXggdG8gbWFrZSBTV0lHIHdvcmsgd2l0aCB0aGUgKGFzIHlldCB1bnJlbGVhc2VkKSBjaGlja2VuIDIuNQoKICAgICAgICAgICAgW0d1aWxlLENoaWNrZW5dIEZpeCBTRiBCdWcgMTU3Mzg5Mi4gIEFkZGVkIGFuIGV4dF90ZXN0IHRvIHRoZSB0ZXN0IHN1aXRlIHRvIHRlc3QKICAgICAgICAgICAgdGhpcyBidWcsIGJ1dCB0aGlzIHRlc3QgY2FuIG5vdCByZWFsbHkgYmUgbWFkZSBnZW5lcmljIGJlY2F1c2UgdGhlIGV4dGVybmFsIGNvZGUgbXVzdAogICAgICAgICAgICBwbHVnIGludG8gdGhlIHRhcmdldCBsYW5ndWFnZSBpbnRlcnByZXRlciBkaXJlY3RseS4KICAgICAgICAgICAgU2VlIEV4YW1wbGVzL3Rlc3Qtc3VpdGUvY2hpY2tlbi9leHRfdGVzdC5pIGFuZCBleHRfdGVzdF9leHRlcm5hbC5jeHgKCiAgICAgICAgICAgIEFkZGVkIGEgJS5leHRlcm5hbHRlc3QgdG8gY29tbW9uLm1rLCBhbmQgYW55IGludGVyZXN0ZWQgbGFuZ3VhZ2UgbW9kdWxlcyBjYW4KICAgICAgICAgICAgY29weSBhbmQgc2xpZ2h0bHkgbW9kaWZ5IGVpdGhlciB0aGUgY2hpY2tlbiBvciB0aGUgZ3VpbGUgZXh0X3Rlc3QuaQoKMTAvMTQvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gYWRkZWQgT1VUUFVUJiBmb3IgYWxsIG51bWJlciB0eXBlcywgYWRkZWQgYSBsb25nIGxvbmcgdHlwZQogICAgICAgICAgICBmaXhlZCBzZXZlcmFsIHRlc3QgY2FzZXMuCiAgICAgICAgICAgIHVwZGF0ZTogY2hhbmdlZCB0eXBlbWFwcyB0byB1c2UgU1dJR19Db252ZXJ0UHRyIHJhdGhlciB0aGFuIFNXSUdfTXVzdEdldFBvaW50ZXIKICAgICAgICAgICAgc3RhcnRlZCBzcGxpdGluZyBsdWEuc3dnIGludG8gc21hbGxlciBwYXJ0cyB0byBtYWtlIGl0IG5lYXRlcgoKMTAvMTMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBNYXJnaW5hbGx5IGJldHRlciBzdXBwb3J0IGZvciBtdWx0aXBsZSBpbmhlcml0YW5jZSBvbmx5IGluIHRoYXQgeW91IGNhbgogICAgICAgICAgICBjb250cm9sIHdoYXQgdGhlIGJhc2UgY2xhc3MgaXMuIFRoaXMgaXMgZG9uZSB1c2luZyB0aGUgbmV3ICdyZXBsYWNlJyBhdHRyaWJ1dGUgaW4gdGhlIAogICAgICAgICAgICBqYXZhYmFzZS9jc2Jhc2UgdHlwZW1hcCwgZWcgaW4gdGhlIGZvbGxvd2luZywgJ01lJyB3aWxsIGJlIHRoZSBiYXNlIGNsYXNzLAogICAgICAgICAgICBubyBtYXR0ZXIgd2hhdCBGb28gaXMgcmVhbGx5IGRlcml2ZWQgZnJvbSBpbiB0aGUgQysrIGxheWVyLgoKICAgICAgICAgICAgICAldHlwZW1hcChqYXZhYmFzZSwgcmVwbGFjZT0iMSIpIEZvbyAiTWUiCiAgICAgICAgICAgICAgJXR5cGVtYXAoY3NiYXNlLCByZXBsYWNlPSIxIikgRm9vICJNZSIKCiAgICAgICAgICAgIFByZXZpb3VzbHkgaXQgd2FzIG5vdCBwb3NzaWJsZSBmb3IgdGhlIGphdmFiYXNlL2NzYmFzZSB0eXBlbWFwcyB0byBvdmVycmlkZSB0aGUgQysrIGJhc2UuCgoxMC8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUmVtb3ZlIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbiBvbiB0aGUgcHJveHkgY2xhc3MnIGRlbGV0ZSgpIG1ldGhvZCAKICAgICAgICAgICAgKGl0IGlzIG5vdyBhIHN5bmNocm9uaXplZCBtZXRob2QsIGJ1dCBpcyBub3cgY3VzdG9taXNhYmxlIGJ5IGNoYW5naW5nIHRoZSAKICAgICAgICAgICAgbWV0aG9kbW9kaWZpZXJzIGF0dHJpYnV0ZSBpbiB0aGUgamF2YWRlc3RydWN0IG9yIGphdmFkZXN0cnVjdF9kZXJpdmVkIHR5cGVtYXApCgogICAgICAgICAgICBbQyNdIFJlbW92ZSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb24gb24gdGhlIHByb3h5IGNsYXNzJyBEaXNwb3NlKCkgbWV0aG9kLCAKICAgICAgICAgICAgc2ltaWxhciB0byBKYXZhJ3MgZGVsZXRlKCkgYWJvdmUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEwLzEyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5LCBQeXRob25dIFJlbW92ZSByZWR1bmRhbnQgZGlyZWN0b3IgY29kZSBpbiAlZXh0ZW5kIG1ldGhvZHMgKCVleHRlbmQKICAgICAgICAgICAgbWV0aG9kcyBjYW5ub3QgYmUgZGlyZWN0b3IgbWV0aG9kcykKCjEwLzEyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5LCBQeXRob25dIEZpeCAjMTUwNTU5NCAtIGRpcmVjdG9yIG9iamVjdHMgbm90IHJldHVybmVkIGFzIGRpcmVjdG9yIG9iamVjdHMKICAgICAgICAgICAgaW4gJWV4dGVuZCBtZXRob2RzLgoKMTAvMTEvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCAjMTIzODc5OCAtIERpcmVjdG9ycyB1c2luZyB1bnNpZ25lZCBsb25nIGxvbmcgb3IgYW55IG90aGVyIHR5cGUKICAgICAgICAgICAgbWFyc2hhbGxlZCBhY3Jvc3MgdGhlIEpOSSBib3VuZGFyeSB1c2luZyBhIEphdmEgY2xhc3MgKHdoZXJlIHRoZSBqbmkgdHlwZW1hcCAKICAgICAgICAgICAgY29udGFpbnMgam9iamVjdCkuCgoxMC8wNi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzExNjIxOTQgLSAjaW5jbHVkZS8laW5jbHVkZSB3aXRoaW4gYSBzdHJ1Y3R1cmUKCjEwLzA2LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTQ1MDY2MSwgc3RyaW5nIHRydW5jYXRpb24gaW4gU3RyaW5nX3NlZWsgdHJ1bmNhdGluZyBKYXZhL0MjIGVudW1zLgoKMTAvMDYvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gRml4ICMxNTY5NTg3LiBUaGUgbmFtZSBpcyBub3cgY29ycmVjdC4KCjEwLzA0LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIERpcmVjdG9yIGZpeGVzIGZvciB2aXJ0dWFsIGNvbnZlcnNpb24gb3BlcmF0b3JzCgoxMC8wNC8yMDA2OiBvbGx5CgkgICAgW3BocF0gRml4ICMxNTY5NTg3IGZvciBQSFAuICBEb24ndCB1c2Ugc2l6ZW9mKCkgZXhjZXB0IHdpdGggc3RyaW5nCgkgICAgbGl0ZXJhbHMuICBDaGFuZ2Ugc29tZSAiLy8iIGNvbW1lbnRzIHRvICIvKiAqLyIgZm9yIHBvcnRhYmlsaXR5LgoKMTAvMDQvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gUGFydGlhbCBGaXggIzE1Njk1ODcuIFRoZSB0eXBlIGlzIG5vdyBjb3JyZWN0LCBidXQgdGhlIG5hbWUgaXMgc3RpbGwgbm90IGNvcnJlY3QuCgoxMC8wMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gRml4ICMxNTI3ODg1IC0gT3ZlcmxvYWRlZCBkaXJlY3RvciB2aXJ0dWFsIG1ldGhvZHMgc29tZXRpbWVzIHByb2R1Y2VkCiAgICAgICAgICAgIHVuY29tcGlsYWJsZSBjb2RlIHdoZW4gdXNlZCB3aXRoIHRoZSBkaXJlY3RvcjpleGNlcHQgZmVhdHVyZS4KCjEwLzAzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIERpcmVjdG9yczogRGlyZWN0b3JzIGFyZSBvdXRwdXQgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIGRlY2xhcmVkIGluIAogICAgICAgICAgICB0aGUgQysrIGNsYXNzIHJhdGhlciB0aGFuIGluIHNvbWUgcHNldWRvLXJhbmRvbSBvcmRlci4KCjEwLzAzLzIwMDY6IG1tYXR1cwogICAgICAgICAgICBGaXggIzE0ODYyODEgYW5kICMxNDcxMDM5LgoKMTAvMDMvMjAwNjogb2xseQoJICAgIFtQZXJsXSBGaXggZm9yIGhhbmRsaW5nIHN0cmluZ3Mgd2l0aCB6ZXJvIGJ5dGVzIGZyb20gU3RlcGhlbiBIdXRzYWwuCgowOS8zMC8yMDA2OiBlZnV6enlvbmUKICAgICAgICAgICAgW0NGRkldIEJpdGZpZWxkIHN1cHBvcnQgYW5kIHZhcmFyZyBzdXBwb3J0IGR1ZSB0byBBcnRodXIgU215bGVzLgogICAgICAgICAgICBDIGV4cHJlc3Npb24gdG8gTGlzcCBjb252ZXJzaW9uLCB0aGFua3MgdG8gQXJ0aHVyIFNteWxlcyBmb3IgdGhlIGluaXRpYWwKICAgICAgICAgICAgaWRlYSwgaXQgbm93IHN1cHBvcnRzIGNvbnZlcnNpb24gZm9yIGEgd2hvbGUgcmFuZ2Ugb2YgQyBleHByZXNzaW9ucy4gCgowOS8yOC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzE1MDgzMjcgLSBPdmVybG9hZGVkIG1ldGhvZHMgYXJlIGhpZGRlbiB3aGVuIHVzaW5nIC1mdmlydHVhbCBvcHRpbWlzYXRpb24uCiAgICAgICAgICAgIE92ZXJsb2FkZWQgbWV0aG9kcyBhcmUgbm8gbG9uZ2VyIGNhbmRpZGF0ZXMgZm9yIGVsaW1pbmF0aW9uIC0gdGhpcyBtaW1pY3MKICAgICAgICAgICAgQysrIGJlaGF2aW91ciB3aGVyZSBhbGwgb3ZlcmxvYWRlZCBtZXRob2RzIG11c3QgYmUgZGVmaW5lZCBhbmQgaW1wbGVtZW50ZWQKICAgICAgICAgICAgaW4gYSBkZXJpdmVkIGNsYXNzIGluIG9yZGVyIGZvciB0aGVtIHRvIGJlIGF2YWlsYWJsZS4KCjA5LzI1LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5LCBQeXRob24sIE9jYW1sXSBGaXggIzE1MDU1OTEgVGhyb3dpbmcgZXhjZXB0aW9ucyBpbiBleHRlbmRlZCBkaXJlY3RvcnMKCjA5LzI1LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTA1NjEwMCAtIHZpcnR1YWwgb3BlcmF0b3JzLiAKCjA5LzI0LzIwMDY6IG9sbHkKCSAgICBEb24ndCBhY2NpZGVudGFsbHkgY3JlYXRlIGEgIjw6IiB0b2tlbiAod2hpY2ggaXMgdGhlIHNhbWUgYXMgIlsiIGluIEMrKykuCgkgICAgRml4ZXMgYnVnICMgMTUyMTc4OC4KCjA5LzIzLzIwMDY6IG9sbHkKCSAgICBbUnVieV0gU3VwcG9ydCBidWlsZGluZyB3aXRoIHJlY2VudCB2ZXJzaW9ucyBvZiB0aGUgUnVieSAxLjkKCSAgICBkZXZlbG9wbWVudCBicmFuY2guICBGaXhlcyBidWcgIzE1NjAwOTIuCgowOS8yMy8yMDA2OiBvbGx5CgkgICAgVGVtcGxhdGVzIGNhbiBub3cgYmUgaW5zdGFudGlhdGVkIHVzaW5nIG5lZ2F0aXZlIG51bWJlcnMgYW5kCgkgICAgY29uc3RhbnQgZXhwcmVzc2lvbnMsIGUuZy46CgoJICAgIHRlbXBsYXRlPGludCBxPiBjbGFzcyB4IHt9OwoJICAgICV0ZW1wbGF0ZSh4X21pbnVzMSkgeDwtMT47CgkgICAgJXRlbXBsYXRlKHhfMXBsdXMyKSB4PDErMj47CgoJICAgIEFsc28sIGNvbnN0YW50IGV4cHJlc3Npb25zIGNhbiBub3cgaW5jbHVkZSBjb21wYXJpc29ucyAoPiwgPCwgPj0sCgkgICAgPD0sICE9LCA9PSksIG1vZHVsdXMgKCUpLCBhbmQgdGVybmFyeSBjb25kaXRpb25hbHMgKGEgPyBiIDogYykuCgoJICAgIEZpeGVzIGJ1Z3MgIzY0NjI3NSwgIzkyNTU1NSwgIzk1NjI4MiwgIzk5NDMwMS4KCjA5LzIyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAlaWdub3JlIG9uIGRpcmVjdG9yIG1ldGhvZHMgLSBCdWdzICMxNTQ2MjU0LCAjMTU0MzUzMwoKMDkvMjAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICVpZ25vcmUgb24gZGlyZWN0b3IgY29uc3RydWN0b3JzCgowOS8yMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc2VnIGZhdWx0cyBhbmQgYXNzZXJ0cyB3aGVuIGRpcmVjdG9yIG1ldGhvZHMgYXJlIGlnbm9yZWQgKCMxNTQzNTMzKQoKMDkvMjAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IG91dCBvZiBzb3VyY2UgYnVpbGRzIC0gYnVnICMxNTQ0NzE4CgowOS8yMC8yMDA2OiBvbGx5CgkgICAgVHJlYXQgYSBuZXN0ZWQgY2xhc3MgZGVmaW5pdGlvbiBhcyBhIGZvcndhcmQgZGVjbGFyYXRpb24gcmF0aGVyCgkgICAgdGhhbiBpZ25vcmluZyBpdCBjb21wbGV0ZWx5LCBzbyB0aGF0IHdlIGdlbmVyYXRlIGNvcnJlY3QgY29kZSBmb3IKCSAgICBwYXNzaW5nIG9wYXF1ZSBwb2ludGVycyB0byB0aGUgbmVzdGVkIGNsYXNzIChmaXhlcyBTRiBidWcgIzkwOTM4NykuCgowOS8yMC8yMDA2OiBvbGx5CiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoJICAgIFtwaHBdIE92ZXJsb2FkIHJlc29sdXRpb24gbm93IHdvcmtzLiAgSG93ZXZlciB0byBhbGxvdyB0aGlzLCBTV0lHCgkgICAgZ2VuZXJhdGVkIHdyYXBwZXJzIG5vIGxvbmdlciBjb2VyY2UgUEhQIHR5cGVzICh3aGljaCByZXZlcnRzIGEgY2hhbmdlCgkgICAgbWFkZSBpbiAxLjMuMjYpLiAgU28gZm9yIGV4YW1wbGUsIGlmIGEgbWV0aG9kIHRha2VzIGEgc3RyaW5nLCB5b3UKCSAgICBjYW4gbm8gbG9uZ2VyIHBhc3MgYSBudW1iZXIgd2l0aG91dCBleHBsaWNpdGx5IGNvbnZlcnRpbmcgaXQgdG8gYQoJICAgIHN0cmluZyBpbiBQSFAgdXNpbmc6IChzdHJpbmcpeAoKMDkvMTgvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0FMTF0gZml4IG9uIHN3aWdpbml0LnN3ZywgaGFzIGJlZW4gcmVwb3J0ZWQgdG8gY3Jhc2ggb24gc2V2ZXJhbCB0ZXN0IGNhc2VzCgkgICAgZm91bmQgYW5kIGZpeGVkIHByb2JsZW0gaW4gaW1wb3J0cyB1bmRlciBweXRob24gKG1pbmd3KQoKMDkvMTYvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gUGF0Y2ggZnJvbSBNaWNoYWwgTWFyZWsgZm9yIFB5dGhvbiAyLjUgdG8gZml4IDY0IGJpdCBhcnJheSBpbmRleGVzIG9uCiAgICAgICAgICAgIDY0IGJpdCBtYWNoaW5lcy4KCjA5LzEzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFRoZSBleHBsaWNpdGNhbGwgZmVhdHVyZSBoYXMgYmVlbiBzY3JhcHBlZC4gVGhpcyBmZWF0dXJlIHdhcyBpbnRyb2R1Y2VkIHByaW1hcmlseQogICAgICAgICAgICB0byBzb2x2ZSByZWN1cnNpdmUgZGlyZWN0b3IgbWV0aG9kIGNhbGxzLiBEaXJlY3RvciB1cGNhbGwgaW1wcm92ZW1lbnRzIG1hZGUgaW5zdGVhZDoKCiAgICAgICAgICAgIFtQeXRob24sIFJ1YnksIE9jYW1sXSBUaGUgc3dpZ191cCBmbGFnIGlzIG5vIGxvbmdlciB1c2VkLiBUaGUgcmVxdWlyZWQgbXV0ZXhlcwogICAgICAgICAgICB3cmFwcGluZyB0aGlzIGZsYWcgYXJlIGFsc28gbm8gbG9uZ2VyIG5lZWRlZC4gVGhlIHJlY3Vyc2l2ZSBjYWxscyBnb2luZyBmcm9tIEMrKwogICAgICAgICAgICB0byB0aGUgdGFyZ2V0IGxhbmd1YWdlIGFuZCBiYWNrIGFnYWluIGV0YyBhcmUgbm93IGF2b2lkZWQgYnkgYSBzdWJ0bGVseSBkaWZmZXJlbnQKICAgICAgICAgICAgYXBwcm9hY2guIEluc3RlYWQgb2YgdXNpbmcgdGhlIHN3aWdfdXAgZmxhZyBpbiBlYWNoIGRpcmVjdG9yIG1ldGhvZCB0byBpbmRpY2F0ZQogICAgICAgICAgICB3aGV0aGVyIHRoZSBleHBsaWNpdCBDKysgY2FsbCB0byB0aGUgYXBwcm9wcmlhdGUgYmFzZSBjbGFzcyBtZXRob2Qgb3IgYSBub3JtYWwKICAgICAgICAgICAgcG9seW1vcnBoaWMgQysrIGNhbGwgc2hvdWxkIGJlIG1hZGUsIHRoZSBuZXcgYXBwcm9hY2ggbWFrZXMgb25lIG9mIHRoZXNlIGNhbGxzCiAgICAgICAgICAgIGRpcmVjdGx5IGZyb20gdGhlIHdyYXBwZXIgbWV0aG9kLgoKICAgICAgICAgICAgW0phdmEsIEMjXSBUaGUgcmVjdXJzaXZlIGNhbGwgcHJvYmxlbSB3aGVuIGNhbGxpbmcgYSBDKysgYmFzZSBjbGFzcyBtZXRob2QgZnJvbQogICAgICAgICAgICBKYXZhL0MjIGlzIG5vdyBmaXhlZC4gVGhlIGltcGxlbWVudGF0aW9uIGlzIHNsaWdodGx5IGRpZmZlcmVudCB0byB0aGUgb3RoZXIgbGFuZ3VhZ2VzCiAgICAgICAgICAgIGFzIHRoZSBkZXRlY3Rpb24gYXMgdG8gd2hldGhlciB0aGUgZXhwbGljaXQgY2FsbCBvciBhIG5vcm1hbCBwb2x5bW9ycGhpYyBjYWxsIGlzIG1hZGUKICAgICAgICAgICAgaW4gdGhlIEphdmEvQyMgbGF5ZXIgcmF0aGVyIHRoYW4gaW4gdGhlIEMrKyBsYXllci4KCjA5LzExLzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtBTExdIHVwZGF0ZWQgc3dpZ2luaXQuc3dnIHRvIGFsbG93IG11bHRpcGxlIGludGVycHJldGVycyB0byB1c2UgbXVsdGlwbGUKCSAgICBzd2lnIG1vZHVsZXMgYXQgb25jZS4gVGhpcyBoYXMgYmVlbiB0ZXN0ZWQgaW4gTHVhIChtaW5ndyAmIGxpbnV4KSwKCSAgICBwZXJsNSAmIHB5dGhvbiAobGludXgpIG9ubHkuCgowOS8xMS8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbbHVhXSBhZGRlZCBzdXBwb3J0IGZvciBwYXNzaW5nIGZ1bmN0aW9uIHBvaW50ZXJzIGFzIHdlbGwgYXMgbmF0aXZlIGx1YSBvYmplY3QKICAgICAgICAgICAgaW50byB3cmFwcGVyZWQgZnVuY3Rpb24uCiAgICAgICAgICAgIEFkZGVkIGV4YW1wbGUgZnVuY3B0cjMgdG8gZGVtb25zdHJhdGUgdGhpcyBmZWF0dXJlCgowOS8wNS8yMDA2OiBvbGx5CgkgICAgW3BocF0gUmVuYW1lIEVycm9yQ29kZSBhbmQgRXJyb3JNc2cgI2RlZmluZS1zIHRvIFNXSUdfRXJyb3JDb2RlCgkgICAgYW5kIFNXSUdfRXJyb3JNc2cgdG8gYXZvaWQgY2xhc2hlcyB3aXRoIGNvZGUgdGhlIHVzZXIgbWlnaHQgYmUKCSAgICB3cmFwcGluZyAocGF0Y2ggZnJvbSBEYXJyZW4gV2FybmVyIGluIFNGIGJ1ZyAjMTQ2NjA4NikuICBBbnkKCSAgICB1c2VyIHR5cGVtYXBzIHdoaWNoIHVzZSBFcnJvckNvZGUgYW5kL29yIEVycm9yTXNnIGRpcmVjdGx5IHdpbGwKCSAgICBuZWVkIGFkanVzdGluZyAtIHlvdSBjYW4gZWFzaWx5IGZpeCB0aGVtIHRvIHdvcmsgd2l0aCBib3RoIG9sZAoJICAgIGFuZCBuZXcgU1dJRyBieSBjaGFuZ2luZyB0byB1c2UgU1dJR19FcnJvck1zZyBhbmQgYWRkaW5nOgoKCQkjaWZuZGVmIFNXSUdfRXJyb3JNc2cKCQkjZGVmaW5lIFNXSUdfRXJyb3JNc2coKSBFcnJvck1zZygpCgkJI2VuZGlmCgowOC8yOS8yMDA2OiBvbGx5CgkgICAgW3BocF0gTW92ZSBjb25zdGFudCBpbml0aWFsaXNhdGlvbiBmcm9tIFJJTklUIHRvIE1JTklUIHRvIGZpeCBhCgkgICAgd2FybmluZyB3aGVuIHVzaW5nIEFwYWNoZSBhbmQgbW9kX3BocC4gIFdlIG9ubHkgbmVlZCB0byBjcmVhdGUKCSAgICBQSFAgY29uc3RhbnRzIG9uY2Ugd2hlbiB3ZSdyZSBmaXJzdCBpbml0aWFsaXNlZCwgbm90IGZvciBldmVyeSBIVFRQCgkgICAgcmVxdWVzdC4KCjA4LzIxLzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdCgkgICAgQnVnZml4ICMxNTQyNDY2IGFkZGVkIGNvZGUgdG8gYWxsb3cgbWFwcGluZyBMdWEgbmlsJ3MgPC0+IEMvQysrIE5VTEwncwoJICAgIHVwZGF0ZWQgdmFyaW91cyB0eXBlbWFwcyB0byB3b3JrIGNvcnJlY3RseSB3aXRoIHRoZSBjaGFuZ2VzCgkgICAgYWRkZWQgdm9pZHRlc3RfcnVubWUubHVhIHRvIHNob3cgdGhlIGZlYXR1cmVzIHdvcmtpbmcKCjA4LzE5LzIwMDY6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtHdWlsZV0gQWRkIGZlYXR1cmU6Y29uc3Rhc3ZhciB0byBleHBvcnQgY29uc3RhbnRzIGFzIHZhcmlhYmxlcyBpbnN0ZWFkIG9mIGZ1bmN0aW9ucwogICAgICAgICAgICB0aGF0IHJldHVybiB0aGUgY29uc3RhbnQgdmFsdWUuCgowOC8xMS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRGV0YWNoQ3VycmVudFRocmVhZCBjYWxscyBoYXZlIGJlZW4gYWRkZWQgc28gdGhhdCBuYXRpdmVseSBjcmVhdGVkIHRocmVhZHMKICAgICAgICAgICAgbm8gbG9uZ2VyIHByZXZlbnQgdGhlIEpWTSBmcm9tIGV4aXRpbmcuIEJ1ZyByZXBvcnRlZCBieSBUaG9tYXMgRHVkemlhayBhbmQKICAgICAgICAgICAgUGF1bCBOb2xsLgoKMDgvMTAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggZGlyZWN0b3IgcHJvdGVjdGVkIG1ldGhvZHMgc28gdGhleSB3b3JrCgowNy8yNS8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgbW9yZSBhZGRpdGlvbnMgdG8gc3RkOjpzdHJpbmcsIHNvbWUgdHdlYWtzIGFuZCBzbWFsbCBidWcgZml4ZXMKCSAgICAtbm9jd3JhcCBtb2RlLgoKMDcvMjEvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0KCSAgICBCdWdmaXggIzE1MjYwMjIgcGRhdGVkIHN0ZDo6c3RyaW5nIHRvIHN1cHBvcnQgc3RyaW5ncyB3aXRoICdcMCcgaW5zaWRlIHRoZW0KCSAgICB1cGRhdGVkIHR5cGVtYXBzLmkgdG8gYWRkIHN1cHBvcnQgZm9yIHBvaW50ZXIgdG8gcG9pbnRlcnMKCjA3LzE5LzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICAtIEFkZCBzdGRfc3RyaW5nLmkgc3VwcG9ydC4KCSAgICAtIEFkZCBuZXdvYmplY3QgcGF0Y2ggc3VibWl0dGVkIGJ5IG1rb2VwcGUgKHRoYW5rcyEpCgkgICAgLSBGaXggdHlwZSBuYW1lIG1pc21hdGNoIGlzc3VlIGZvciBuZXN0ZWQgdHlwZSBkZWZpbml0aW9ucy4KCSAgICAgIHNwZWNpZmljYWxseSB0eXBlZGVmcyBpbiB0ZW1wbGF0ZWQgY2xhc3MgZGVmbnMuCgowNy8xOC8yMDA2OiBtZ29zc2FnZQoJICAgIEJ1Z2ZpeCAjMTUyMjg1OAoJICAgIHVwZGF0ZWQgbHVhLmN4eCB0byBzdXBwb3J0IC1leHRlcm5hbC1ydW50aW1lIGNvbW1hbmQKCjA3LzE0LzIwMDY6IHd1enplYiAoSm9obiBMZW56KQoJICAgIEluY3JlbWVudCB0aGUgU1dJR19SVU5USU1FX1ZFUlNJT04gdG8gMywgYmVjYXVzZSBvZiB0aGUKCSAgICBhZGRpdGlvbiBvZiB0aGUgb3duZGF0YSBtZW1iZXIgaW4gc3dpZ190eXBlX2luZm8uCgkgICAgUmVwb3J0ZWQgYnk6IFByYWJodSBSYW1hY2hhbmRyYW4KCjA3LzA1LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFNlYXJjaCBwYXRoIGZpeGVzOgogICAgICAgICAgICAtIEZpeCBzZWFyY2ggcGF0aCBmb3IgbGlicmFyeSBmaWxlcyB0byBiZWhhdmUgYXMgZG9jdW1lbnRlZCBpbiBMaWJyYXJ5Lmh0bWwuCiAgICAgICAgICAgIC0gRml4IG1pbmd3L21zeXMgYnVpbGRzIHdoaWNoIGRpZCBub3QgZmluZCB0aGUgU1dJRyBsaWJyYXJ5IHdoZW4gaW5zdGFsbGVkLgogICAgICAgICAgICAtIFdpbmRvd3MgYnVpbGRzIGFsc28gb3V0cHV0IHRoZSBtaW5ndy9tc3lzIGluc3RhbGwgbG9jYXRpb24gd2hlbiBydW5uaW5nCiAgICAgICAgICAgICAgc3dpZyAtc3dpZ2xpYi4KICAgICAgICAgICAgLSBUaGUgbm9uLWV4aXN0ZW50IGFuZCB1bmRvY3VtZW50ZWQgY29uZmlnIGRpcmVjdG9yeSBpbiB0aGUgc2VhcmNoIHBhdGggaGFzCiAgICAgICAgICAgICAgYmVlbiByZW1vdmVkLgoKMDcvMDUvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICRzeW1uYW1lIHNwZWNpYWwgdmFyaWFibGUgZXhwYW5zaW9uLgoKMDcvMDQvMjAwNjogd3V6emViIChKb2huIExlbnopCgkgICAgW0NoaWNrZW5dCgkgICAgQWRkICVmZWF0dXJlKCJjb25zdGFzdmFyIiksIHdoaWNoIGluc3RlYWQgb2YgZXhwb3J0aW5nIGEgY29uc3RhbnQgYXMgYQoJICAgIHNjaGVtZSBmdW5jdGlvbiwgZXhwb3J0cyB0aGUgY29uc3RhbnQgYXMgYSBzY2hlbWUgdmFyaWFibGUuICBVcGRhdGUgdGhlCgkgICAgZG9jdW1lbnRhdGlvbiBhcyB3ZWxsLgoKMDcvMDQvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW1NlZSBlbnRyeSBvZiAwOS8xMy8yMDA2IC0gZXhwbGljaXRjYWxsIGZlYXR1cmUgYW5kIGRvY3VtZW50YXRpb24gdG8gaXQgcmVtb3ZlZF0KICAgICAgICAgICAgTmV3IGV4cGxpY2l0Y2FsbCBmZWF0dXJlIHdoaWNoIGdlbmVyYXRlcyBhZGRpdGlvbmFsIHdyYXBwZXJzIGZvciB2aXJ0dWFsIG1ldGhvZHMKICAgICAgICAgICAgdGhhdCBjYWxsIHRoZSBtZXRob2QgZXhwbGljaXRseSwgbm90IHJlbHlpbmcgb24gcG9seW1vcnBoaXNtIHRvIG1ha2UgdGhlIG1ldGhvZAogICAgICAgICAgICBjYWxsLiBUaGUgZmVhdHVyZSBpcyBhIGZlYXR1cmUgZmxhZyBhbmQgaXMgZW5hYmxlZCBsaWtlIGFueSBvdGhlciBmZWF0dXJlIGZsYWcuCiAgICAgICAgICAgIEl0IGFsc28gcmVjb2duaXNlcyBhbiBhdHRyaWJ1dGUsICJzdWZmaXgiIGZvciBtYW5nbGluZyB0aGUgZmVhdHVyZSBuYW1lLCBzZWUKICAgICAgICAgICAgU1dJR1BsdXMuaHRtbCNTV0lHUGx1c19leHBsaWNpdGNhbGwgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLgoKICAgICAgICAgICAgW0phdmEsIEMjXQogICAgICAgICAgICBUaGUgZXhwbGljaXRjYWxsIGZlYXR1cmUgaXMgYWxzbyBhIHdvcmthcm91bmQgZm9yIHNvbHZpbmcgdGhlIHJlY3Vyc2l2ZSBjYWxscwogICAgICAgICAgICBwcm9ibGVtIHdoZW4gYSBkaXJlY3RvciBtZXRob2QgbWFrZXMgYSBjYWxsIHRvIGEgYmFzZSBjbGFzcyBtZXRob2QuIFNlZQogICAgICAgICAgICBKYXZhLmh0bWwjamF2YV9kaXJlY3RvcnNfZXhwbGljaXRjYWxsIGZvciB1cGRhdGVkIGRvY3VtZW50YXRpb24uCgowNi8yOC8yMDA2OiBqb2UgKEpvc2VwaCBXYW5nKQoJICAgIFtyXSBJbml0aWFsIHN1cHBvcnQgZm9yIFIKCjA2LzIwLzIwMDY6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtDaGlja2VuXQogICAgICAgICAgICBNaW5vciBmaXhlcyB0byBnZXQgYXBwbHlfc3RyaW5ncy5pIHRlc3RzdWl0ZSB0byBwYXNzCgkgICAgUmVtb3ZlIGludGVnZXJzX3J1bm1lLnNjbSBmcm9tIHRoZSB0ZXN0c3VpdGUsIGJlY2F1c2UgU1dJRyBhbmQgQ2hpY2tlbiBkb2VzCiAgICAgICAgICAgIGhhbmRsZSBvdmVyZmxvd3MuCgowNi8xOS8yMDA1OiBvbGx5CgkgICAgW3BocF0gQWRkIHN1cHBvcnQgZm9yIGdlbmVyYXRpbmcgUEhQNSBjbGFzcyB3cmFwcGVycyBmb3IgQysrCgkgICAgY2xhc3NlcyAodXNlICJzd2lnIC1waHA1IikuCgowNi8xNy8yMDA2OiBvbGx5CgkgICAgW3BocF0gQWRkZWQgc29tZSBtaXNzaW5nIGtleXdvcmRzIHRvIHRoZSBQSFA0IGtleXdvcmQgbGlzdCwgYW5kCgkgICAgZml4ZWQgX19MSU5FX18gYW5kIF9fRklMRV9fIHdoaWNoIHdlcmUgaW4gdGhlIHdyb25nIGNhdGVnb3J5LgoJICAgIEFsc28gYWRkZWQgYWxsIHRoZSBrZXl3b3JkcyBuZXcgaW4gUEhQNSwgYW5kIGFkZGVkIGNvbW1lbnRzCgkgICAgbm90aW5nIHRoZSBQSFA0IGtleXdvcmRzIHdoaWNoIGFyZW4ndCBrZXl3b3JkcyBpbiBQSFA1LgoKMDYvMTcvMjAwNjogb2xseQoJICAgIFtwaHBdIERvbid0IHNlZ2ZhdWx0IGlmIFBIUCBOdWxsIGlzIHBhc3NlZCBhcyB0aGlzIHBvaW50ZXIgKGUuZy4KCSAgICBDbGFzc19tZXRob2QoTnVsbCkpIC0gZ2l2ZSBhIFBIUCBFcnJvciBpbnN0ZWFkLgoKMDYvMTUvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIEFkZCBpbml0aWFsIHN1cHBvcnQgZm9yIHN0ZDo6bGlzdCBjb250YWluZXIgY2xhc3MuCgkgICAgRml4IGEgZmV3IGJ1Z3MgaW4gaGVscGVyIGZ1bmN0aW9ucy4KCjA1LzEzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBSZXBsYWNlIEpOSUVYUE9SVCB3aXRoIFNXSUdFWFBPUlQsIHRoZXJlYnkgZW5hYmxpbmcgdGhlIHBvc3NpYmlsaXR5CiAgICAgICAgICAgIG9mIHVzaW5nIGdjYyAtZnZpc2liaWxpdHk9aGlkZGVuIGZvciBwb3RlbnRpYWxseSBzbWFsbGVyIGZhc3RlciBsb2FkaW5nIHdyYXBwZXJzLgoKMDUvMTMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IGZvciBNYWtlZmlsZXMgZm9yIGF1dG9jb25mLTIuNjAgYmV0YQoKMDUvMTMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgVmxhZGltaXIgTWVuc2hha292IHBhdGNoIGZvciBjb21waWxpbmcgd3JhcHBlcnMgd2l0aCBweXRob24tMi41IGFscGhhLgoKMDUvMTIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IGJ1ZmZlciBvdmVyZmxvdyBlcnJvciB3aGVuIHVzaW5nIGxhcmdlICVmZWF0dXJlKGRvY3N0cmluZykgcmVwb3J0ZWQKICAgICAgICAgICAgYnkgSm9zZXBoIFdpbnN0b24uCgowNS8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gT3BlcmF0b3Igb3ZlcmxvYWQgZml4IGZyb20gRGFuaWVsIE1vb3JlLgoKMDUvMjUvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIEZpeCBidWcgaW4gZ2VuZXJhdGlvbiBvZiBDTE9TIHR5cGUgZGVjbGFyYXRpb25zIGZvciB1bmlvbnMKCSAgICBhbmQgZXF1aXZhbGVudCB0eXBlcy4KCjA1LzI0LzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBEb24ndCByZXF1aXJlIGEgZnVsbCBjbGFzcyBkZWZpbml0aW9uIHRvIGdlbmVyYXRlIGEgQ0xPUyB3cmFwcGVyLgoKMDUvMjAvMjAwNjogb2xseQoJICAgIFtwaHBdIEdDQyBWaXNpYmlsaXR5IHN1cHBvcnQgbm93IHdvcmtzIHdpdGggUEhQLgoKMDUvMTkvMjAwNjogb2xseQoJICAgIFtwaHBdIFJlbW92ZWQgc3VwcG9ydCBmb3IgLWRsbmFtZSAodXNlIC1tb2R1bGUgaW5zdGVhZCkuICBGaXhlZAoJICAgIG5hbWluZyBvZiBQSFAgZXh0ZW5zaW9uIG1vZHVsZSB0byBiZSBjb25zaXN0ZW50IHdpdGggUEhQCgkgICAgY29udmVudGlvbnMgKG5vICJwaHBfIiBwcmVmaXggb24gVW5peDsgb24gUEhQID49IDQuMy4wLCBoYW5kbGUgVW5peAoJICAgIHBsYXRmb3JtcyB3aGljaCB1c2Ugc29tZXRoaW5nIG90aGVyIHRoYW4gIi5zbyIgYXMgdGhlIGV4dGVuc2lvbi4pCgowNS8xMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIERpcmVjdG9yIHN1cHBvcnQgYWRkZWQKCjA1LzA3LzIwMDY6IG9sbHkKCSAgICBbcGhwXSBEb24ndCBzZWdmYXVsdCBpZiBQSFAgTnVsbCBpcyBwYXNzZWQgd2hlcmUgYSBDKysgcmVmZXJlbmNlCgkgICAgaXMgd2FudGVkLgoKMDUvMDUvMjAwNjogb2xseQoJICAgIFtwaHBdIEZpeCB3cmFwcGVycyBnZW5lcmF0ZWQgZm9yIGdsb2JhbCAnY2hhcicgdmFyaWFibGVzIHRvIG5vdAoJICAgIGluY2x1ZGUgYSB0ZXJtaW5hdGluZyB6ZXJvIGJ5dGUgaW4gdGhlIFBIUCBzdHJpbmcuCgowNS8wMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBNb2RpZnkgdHlwZW1hcHMgc28gdGhhdCBjaGFyICogY2FuIGJlIGFwcGxpZWQgdG8gdW5zaWduZWQgY2hhciAqIG9yIHNpZ25lZCBjaGFyICoKICAgICAgICAgICAgdHlwZXMgYW5kIHZpc2EgdmVyc2EuCgowNS8wMy8yMDA2OiBlZnV6enlvbmUKCSAgICBbY2ZmaV1UaGFua3MgdG8gTHVrZSBKIENyb29rIGZvciB0aGlzIGlkZWEuCiAgICAgICAgICAgICAtIGEgc3RydWN0L2VudW0vdW5pb24gaXMgcmVwbGFjZWQgd2l0aCA6cG9pbnRlciBvbmx5IGlmCiAgICAgICAgICAgICAgIHRoYXQgc2xvdCBpcyBhY3R1YWxseSBhIHBvaW50ZXIgdG8gdGhhdCB0eXBlLiBTbyw6IAogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhX3N0cnVjdCB7IGludCB4OyB9IGFuZAogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBiX3N0cnVjdCB7IGFfc3RydWN0IHN0cnVjdF8xOyB9OyAKICAgICAgICAgICAgICAgd2lsbCBiZSBjb252ZXJ0ZWQgYXM6CiAgICAgICAgICAgICAgICAgICAoY2ZmaTpkZWZjc3RydWN0IGJfc3RydWN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3RfMSBhX3N0cnVjdCkpCiAgICAgICAgICAgICAtIE90aGVyIG1pbm9yIGZpeGVzIGluIGxpc3BpZnlpbmcgbmFtZXMuCgowNS8wMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggcG9zc2libGUgcmVkZWZpbml0aW9uIG9mIF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSBmb3IgVkMrKy4KCjA0LzE0LzIwMDY6IGVmdXp6eW9uZQoJICAgIFtjZmZpXQogICAgICAgICAgICBUaGFua3MgdG8gVGhvbWFzIFdlaWRuZXIgZm9yIHRoZSBwYXRjaC4KICAgICAgICAgICAgLSB3aGVuIGZlYXR1cmUgZXhwb3J0IGlzIHNldCAoZXhwb3J0ICdmb28pIGlzIAogICAgICAgICAgICAgIGdlbmVyYXRlZCBmb3IgZXZlcnkgc3ltYm9sCiAgICAgICAgICAgIC0gd2hlbiBmZWF0dXJlIGlubGluZSBpcyBzZXQgKGRlY2xhaW0gKGlubGluZSBmb28pKSBpcyAKICAgICAgICAgICAgICBnZW5lcmF0ZWQgYmVmb3JlIGV2ZXJ5IGZ1bmN0aW9uIGRlZmluaXRpb24KICAgICAgICAgICAgLSB3aGVuIGZlYXR1cmUgaW50ZXJuX2Z1bmN0aW9uIGlzIHNldCAKICAgICAgICAgICAgICAjLih2YWx1ZS1vZi1pbnRlcm4tZnVuY3Rpb24gIm5hbWUiICJub2RlVHlwZSIgcGFja2FnZSkKICAgICAgICAgICAgICBpcyBlbWl0dGVkIGluc3RlYWQgb2YgdGhlIHBsYWluIHN5bWJvbC4gQSBzYW1wbGUgc3dpZy1saXNwaWZ5IAogICAgICAgICAgICAgIGlzIHByb3ZpZGVkLgogICAgICAgICAgICAtIGV2ZXJ5IHN5bWJvbCBpcyBwcmVmaXhlZCBieSBpdCdzIHBhY2thZ2UuCgowNC8xMy8yMDA2OiBlZnV6enlvbmUKCSAgICBbY2ZmaV0KCSAgICBGaXhlZCB0aGUgZ2VuZXJhdGlvbiBvZiB3cmFwcGVycyBmb3IgZ2xvYmFsIHZhcmlhYmxlcy4gCiAgICAgICAgICAgIEFkZGVkIHRoZSBvcHRpb24gW25vXXN3aWctbGlzcCB3aGljaCB0dXJucyBvbi9vZmYgZ2VuZXJhdGlvbiAKICAgICAgICAgICAgb2YgY29kZSBmb3Igc3dpZyBoZWxwZXIgbGlzcCBtYWNybywgZnVuY3Rpb25zLCBldGMuCgpWZXJzaW9uIDEuMy4yOSAoTWFyY2ggMjEsIDIwMDYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjA0LzA1LzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBGaXggb3V0cHV0IHR5cGVtYXAgb2YgY2hhciBzbyBpdCBwcm9kdWNlcyBhIGNoYXJhY3RlciBpbnN0ZWFkCgkgICAgb2YgYW4gaW50ZWdlci4gQWxzbyBhZGRzIGlucHV0L291dHB1dCB0eXBlbWFwcyBmb3IgJ2NoYXIgKicuCgoJICAgIGFkZCBjb21tYW5kLWxpbmUgYXJndW1lbnQgLWlzb2xhdGUgdG8gZ2VuZXJhdGUgYW4gaW50ZXJmYWNlCgkgICAgZmlsZSB0aGF0IHdvbid0IGludGVyZmVyZSB3aXRoIG90aGVyIFNXSUcgZ2VuZXJhdGVkIGZpbGVzIHRoYXQKCSAgICBtYXkgYmUgdXNlZCBpbiB0aGUgc2FtZSBhcHBsaWNhdGlvbi4KCjAzLzIwLzIwMDU6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBNb3JlIHR3ZWFrcyB0byBJTlBVVC9PVVRQVVQgdHlwZW1hcHMgZm9yIGJvb2wuCgoJICAgIEZpeCBjb25zdGFudFdyYXBwZXIgZm9yIGNoYXIgYW5kIHN0cmluZyBsaXRlcmFscy4KCgkgICAgZmluZC1kZWZpbml0aW9uIGtleWJpbmRpbmdzIHNob3VsZCB3b3JrIGluIEVMSS9TTElNRS4KCSAgICBPdXRwdXQgKGluLXBhY2thZ2UgPG1vZHVsZS1uYW1lPikgdG8gbGlzcCB3cmFwcGVyCgkgICAgaW5zdGVhZCBvZiAoaW4tcGFja2FnZSAjLipzd2lnLW1vZHVsZS1uYW1lKikuCgoJICAgIHNsaWdodCByZXdvcmsgb2YgbXVsdGlwbGUgcmV0dXJuIHZhbHVlcy4KCgkgICAgZG9jIHVwZGF0ZXMuCgowMy8xNy8yMDA1OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgbWFuZ2xlIG5hbWVzIG9mIGNvbnN0YW50cyBnZW5lcmF0ZWQgdmlhIGNvbnN0YW50V3JhcHBlci4KCSAgICAKCSAgICBXaGVuIHVzaW5nIE9VVFBVVCB0eXBlbWFwcyBhbmQgdGhlIGZ1bmN0aW9uIGhhcyBhIG5vbi12b2lkCgkgICAgcmV0dXJuIHZhbHVlLCBpdCBzaG91bGQgYmUgZmlyc3QgaW4gdGhlIHZhbHVlcy1saXN0LCBmb2xsb3dlZAoJICAgIGJ5IHRoZSBPVVRQVVQgbWFwcGVkIHZhbHVlcy4KCgkgICAgRml4IGJ1ZyB3aXRoIGJvb2xlYW4gcGFyYW1ldGVycywgd2hpY2ggbmVlZGVkIHRvIGJlCgkgICAgcGFzc2VkIGluIGFzIGludCB2YWx1ZXMsIHJhdGhlciB0aGFuIFQgb3IgTklMLgoKMDMvMTUvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIEdlbmVyYXRlIHdyYXBwZXJzIGZvciBjb25zdGFudHMgd2hlbiBpbiBDKysgb3IgLWN3cmFwIG1vZGUuCgkgICAgTWFrZSAtY3dyYXAgdGhlIGRlZmF1bHQsIHNpbmNlIGl0IGlzIG1vc3QgY29ycmVjdC4gVXNlcnMKCSAgICBjYW4gdXNlIHRoZSAtbm9jd3JhcCBvcHRpb24gdG8gYXZvaWQgdGhlIGNyZWF0aW9uIG9mIGEgLmN4eAoJICAgIGZpbGUgd2hlbiBpbnRlcmZhY2luZyB0byBDIGNvZGUuCgoJICAgIFdoZW4gaW4gLW5vY3dyYXAgbW9kZSwgaW1wcm92ZSB0aGUgaGFuZGxpbmcgb2YgY29udmVydGluZwogCSAgICBpbmZpeCBsaXRlcmFscyB0byBwcmVmaXggbm90YXRpb24gZm9yIGxpc3AuIFRoaXMgaXMgdmVyeQoJICAgIGJhc2ljIGFuZCBub3QgbGlrZWx5IHRvIGJlIGltcHJvdmVkIHVwb24gc2luY2UgdGhpcyBvbmx5CgkgICAgYXBwbGllcyB0byB0aGUgLW5vY3dyYXAgY2FzZS4gTGl0ZXJhbHMgd2UgY2FuJ3QgZmlndXJlIG91dAoJICAgIHdpbGwgcmVzdWx0IGluIGEgd2FybmluZyBhbmQgYmUgaW5jbHVkZWQgaW4gdGhlIGdlbmVyYXRlZAoJICAgIGNvZGUuCgoJICAgIHZhbGlkSWRlbnRpZmllciBub3cgbW9yZSBjbG9zZWx5IGFwcHJveGltYXRlcyB3aGF0IG1heSBiZQoJICAgIGEgbGVnYWwgY29tbW9uIGxpc3Agc3ltYm9sLgoKCSAgICBGaXggdHlwZW1hcCBlcnJvciBpbiBhbGxlZ3JvY2wuc3dnCgkgICAgCjAzLzEyLzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBmaXggdXAgSU5QVVQvT1VUUFVUIHR5cGVtYXBzIGZvciBib29sLgoJICAgIEdlbmVyYXRlIGMrKyBzdHlsZSB3cmFwcGVyIGZ1bmN0aW9ucyBmb3Igc3RydWN0L3VuaW9uIG1lbWJlcnMKCSAgICB3aGVuIC1jd3JhcCBvcHRpb24gc3BlY2lmaWVkLgoKMDMvMTAvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIEZpeCBidWcgaW4gQyB3cmFwcGVyIGdlbmVyYXRpb24gaW50cm9kdWNlZCBieSBsYXN0IGFsbGVncm9jbAoJICAgIGNvbW1pdC4KCjAzLzEwLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXQogICAgICAgICAgICBDb21taXQgIzE0NDczMzcgLSBEZWxldGUgTG9jYWxSZWZzIGF0IHRoZSBlbmQgb2YgZGlyZWN0b3IgbWV0aG9kcyB0byBmaXggcG90ZW50aWFsIGxlYWsKCjAzLzEwLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTQ0NDk0OSAtIGNvbmZpZ3VyZSBkb2VzIG5vdCBob25vciAtLXByb2dyYW0tcHJlZml4LgogICAgICAgICAgICBSZW1vdmVkIG5vbi1zdGFuZGFyZCBjb25maWd1cmUgb3B0aW9uIC0td2l0aC1yZWxlYXNlLXN1ZmZpeC4gRml4IHRoZSBhdXRvY29uZiBzdGFuZGFyZAogICAgICAgICAgICBvcHRpb25zIC0tcHJvZ3JhbS1wcmVmaXggYW5kIC0tcHJvZ3JhbS1zdWZmaXggd2hpY2ggd2VyZSBiZWluZyBzaG93biBpbiB0aGUgaGVscCwKICAgICAgICAgICAgYnV0IHdlcmUgYmVpbmcgaWdub3JlZC4gVXNlIC0tcHJvZ3JhbS1zdWZmaXggaW5zdGVhZCBvZiAtLXdpdGgtcmVsZWFzZS1zdWZmaXggbm93LgoKMDMvMTAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdCiAgICAgICAgICAgIEZpeCAjMTQ0NjMxOSB3aXRoIHBhdGNoIGZyb20gYW5kcmVhc3RoIC0gbW9yZSB0aGFuIG9uZSB3c3RyaW5nIHBhcmFtZXRlciBpbiBkaXJlY3RvciBtZXRob2RzCgowMy8wNy8yMDA2OiBta29lcHBlCgkgICAgW0d1aWxlXSAKCSAgICBGaXggZm9yIG1vZHVsZSBuYW1lcyBjb250YWluaW5nIGEgIi0iIGluIG5vbi0ic2hhZG93IiBtb2RlLgoJICAgIFBhdGNoIGZyb20gQWFyb24gVmFuRGV2ZW5kZXIgKCMxNDQxNDc0KS4KCjAzLzA0LzIwMDY6IG1tYXR1cwoJICAgIC0gQWRkIC1PIHRvIHRoZSBtYWluIHByb2dyYW0sIHdoaWNoIG5vdyBlbmFibGVzIC1mYXN0ZGlzcGF0Y2gKCSAgICAKCSAgICBbUHl0aG9uXQoKCSAgICAtIEFkZCB0aGUgLWZhc3Rpbml0IG9wdGlvbiB0byBlbmFibGUgZmFzdGVyIF9faW5pdF9fCiAgICAgICAgICAgICAgbWV0aG9kcy4gU2V0dGluZyAndGhpcycgYXMgJ3NlbGYudGhpcy5hcHBlbmQodGhpcyknIGluIHRoZSBweXRob24KCSAgICAgIGNvZGUgY29uZnVzZXMgUHlMdWNlbmUuIE5vdyB0aGUgaW5pdGlhbGl6YXRpb24gaXMgZG9uZSBpbiB0aGUKCSAgICAgIHRoZSBDKysgc2lkZSwgYXMgcmVwb3J0ZWQgYnkgQW5kaSBhbmQgUm9iaW4uCgoJICAgIC0gQWRkIHRoZSAtZmFzdHF1ZXJ5IG9wdGlvbiB0byBlbmFibGUgZmFzdGVyIFNXSUdfVHlwZVF1ZXJ5IHZpYSBhCiAgICAgICAgICAgICAgcHl0aG9uIGRpY3QgY2FjaGUsIGFzIHByb3Bvc2VkIGJ5IEFuZGkgVmFqZGEKCgkgICAgLSBBdm9pZCB0byBjYWxsIFB5T2JqZWN0X0dldEF0dHIgaW5zaWRlIFNXSUdfUHl0aG9uX0dldFN3aWdUaGlzLAoJICAgICAgc2luY2UgdGhpcyBjb25mdXNlcyBQeUx1Y2VuZSwgYXMgcmVwb3J0ZWQgYnkgQW5kaSBWYWpkYS4KCSAgICAKMDMvMDIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdCiAgICAgICAgICAgIFJlbW92ZWQgZXh0cmEgKHZvaWQgKikgY2FzdCB3aGVuIGNhc3RpbmcgcG9pbnRlcnMgdG8gYW5kIGZyb20gamxvbmcgYXMgdGhpcwogICAgICAgICAgICB3YXMgc3VwcHJlc3NpbmcgZ2NjJ3MgImRlcmVmZXJlbmNpbmcgdHlwZS1wdW5uZWQgcG9pbnRlciB3aWxsIGJyZWFrIHN0cmljdC1hbGlhc2luZyBydWxlcyIKICAgICAgICAgICAgd2FybmluZy4gVGhpcyB3YXJuaW5nIGNvdWxkIGJlIGlnbm9yZWQgaW4gdmVyc2lvbnMgb2YgZ2NjIHByaW9yIHRvIDQuMCwgYnV0IG5vdyB0aGUKICAgICAgICAgICAgd2FybmluZyBpcyB1c2VmdWwgYXMgZ2NjIC1PMiBhbmQgaGlnaGVyIG9wdGltaXNhdGlvbiBsZXZlbHMgaW5jbHVkZXMgLWZzdHJpY3QtYWxpYXNpbmcgd2hpY2gKICAgICAgICAgICAgZ2VuZXJhdGVzIGNvZGUgdGhhdCBkb2Vzbid0IHdvcmsgd2l0aCB0aGVzZSBjYXN0cy4gVGhlIGFzc2lnbm1lbnQgaXMgc2ltcGx5IG5ldmVyIG1hZGUuCiAgICAgICAgICAgIFBsZWFzZSB1c2UgLWZuby1zdHJpY3QtYWxpYXNpbmcgdG8gYm90aCBzdXBwcmVzcyB0aGUgd2FybmluZyBhbmQgZml4IHRoZSBiYWQgYXNzZW1ibHkKICAgICAgICAgICAgY29kZSBnZW5lcmF0ZWQuIE5vdGUgdGhhdCB0aGUgd2FybmluZyBpcyBvbmx5IGdlbmVyYXRlZCBieSB0aGUgQyBjb21waWxlciwgYnV0IG5vdAogICAgICAgICAgICB0aGUgQysrIGNvbXBpbGVyLCB5ZXQgdGhlIEMrKyBjb21waWxlciB3aWxsIGFsc28gZ2VuZXJhdGUgYnJva2VuIGNvZGUuIEFsdGVybmF0aXZlbHkgdXNlIAogICAgICAgICAgICAtV25vLXN0cmljdC1hbGlhc2luZyB0byBzdXBwcmVzcyB0aGUgd2FybmluZyBmb3IgZ2NjLTMueC4gVGhlIHR5cGVtYXBzIGFmZmVjdGVkCiAgICAgICAgICAgIGFyZSB0aGUgImluIiBhbmQgIm91dCIgdHlwZW1hcHMgaW4gamF2YS5zd2cgYW5kIGFycmF5c19qYXZhLnN3Zy4gVXNlcnMgb3VnaHQgdG8gZml4CiAgICAgICAgICAgIHRoZWlyIG93biB0eXBlbWFwcyB0byBkbyB0aGUgc2FtZS4gTm90ZSB0aGF0IHJlbW92YWwgb2YgdGhlIHZvaWQgKiBjYXN0IHNpbXBseSBwcmV2ZW50cwogICAgICAgICAgICBzdXBwcmVzc2lvbiBvZiB0aGUgd2FybmluZyBmb3IgdGhlIEMgY29tcGlsZXIgYW5kIG5vdGhpbmcgZWxzZS4gVHlwaWNhbCBjaGFuZ2U6CgogICAgICAgICAgICBGcm9tOgogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRSAqICV7ICQxID0gKigkJjFfbHR5cGUpKHZvaWQgKikmJGlucHV0OyAlfQogICAgICAgICAgICBUbzoKICAgICAgICAgICAgICAldHlwZW1hcChpbikgU1dJR1RZUEUgKiAleyAkMSA9ICooJCYxX2x0eXBlKSYkaW5wdXQ7ICV9CgogICAgICAgICAgICBGcm9tOgogICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgU1dJR1RZUEUgKiAleyAqKCQmMV9sdHlwZSkodm9pZCAqKSYkcmVzdWx0ID0gJDE7ICV9IAogICAgICAgICAgICBUbzoKICAgICAgICAgICAgICAldHlwZW1hcChvdXQpIFNXSUdUWVBFICogJXsgKigkJjFfbHR5cGUpJiRyZXN1bHQgPSAkMTsgJX0gCgowMy8wMi8yMDA2OiBta29lcHBlCgkgICAgW0d1aWxlIC1zY21dCgkgICAgQWRkIHR5cGVtYXBzIGZvciAibG9uZyBsb25nIjsgd2hldGhlciB0aGUgZ2VuZXJhdGVkIGNvZGUgY29tcGlsZXMsIGhvd2V2ZXIsIGRlcGVuZHMKCSAgICBvbiB0aGUgdmVyc2lvbiBhbmQgY29uZmlndXJhdGlvbiBvZiBHdWlsZS4KCjAzLzAyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10KICAgICAgICAgICAgQWRkIHN1cHBvcnQgZm9yIGlubmVyIGV4Y2VwdGlvbnMuIElmIGFueSBvZiB0aGUgZGVsZWdhdGVzIGFyZSBjYWxsZWQgd2hpY2ggY29uc3RydWN0CiAgICAgICAgICAgIGEgcGVuZGluZyBleGNlcHRpb24gYW5kIHRoZXJlIGlzIGFscmVhZHkgYSBwZW5kaW5nIGV4Y2VwdGlvbiwgaXQgd2lsbCBjcmVhdGUgdGhlIG5ldwogICAgICAgICAgICBleGNlcHRpb24gd2l0aCB0aGUgcGVuZGluZyBleGNlcHRpb24gYXMgYW4gaW5uZXIgZXhjZXB0aW9uLgoKMDMvMDIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW1BocF0KICAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgUGhwNSBleGNlcHRpb25zIGlmIGNvbXBpbGluZyBhZ2FpbnN0IFBocDUgKHBhdGNoIGZyb20gT2xseSBCZXR0cykuCgowMy8wMS8yMDA2OiBtbWF0dXMKCSAgICBVc2UgdGhlIEdDQyB2aXNpYmlsaXR5IGF0dHJpYnV0ZSBpbiBTV0lHRVhQT1JULgoKCSAgICBOb3cgeW91IGNhbiBjb21waWxlICh3aXRoIGdjYyAzLjQgb3IgbGF0ZXIpIHVzaW5nCgkgICAgQ0ZMQUdTPSItZnZpc2liaWxpdHk9aGlkZGVuIi4KCSAgICAKCSAgICBDaGVjayB0aGUgZGlmZmVyZW5jZSBmb3IgdGhlICdzdGRfY29udGFpbmVycy5pJyBweXRob24gCgkgICAgdGVzdCBjYXNlOgogCiAgICAgICAgICAgIFNpemVzOgoKCSAgICAgIDMzMDU0MzIgX3N0ZF9jb250YWluZXJzLnNvCgkgICAgICAyMzgzOTkyIF9zdGRfY29udGFpbmVycy5zby5oaWRkZW4KCgkgICAgRXhwb3J0ZWQgc3ltYm9scyAobm0gLUQgPGZpbGU+LnNvIHwgd2MgLWwpOgoKICAgICAgICAgICAgICA2MTQ2IF9zdGRfY29udGFpbmVycy5zbyAKICAgICAgICAgICAgICAxNzQgIF9zdGRfY29udGFpbmVycy5zby5oaWRkZW4gCgoJICAgIEV4ZWN1dGlvbiB0aW1lczoKCgkgICAgICByZWFsIDBtMC4wNTBzIHVzZXIgMG0wLjAzOXMgc3lzIDBtMC4wMDVzICAgX3N0ZF9jb250YWluZXJzLnNvCiAgICAgICAgICAgICAgcmVhbCAwbTAuMDM5cyB1c2VyIDBtMC4wMjZzIHN5cyAwbTAuMDA3cyAgIF9zdGRfY29udGFpbmVycy5zby5oaWRkZW4KCgkgICAgUmVhZCBodHRwOi8vZ2NjLmdudS5vcmcvd2lraS9WaXNpYmlsaXR5IGZvciBtb3JlIGRldGFpbHMuCgoKMDIvMjcvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIEFkZCBzdXBwb3J0IGZvciBJTlBVVCwgT1VUUFVULCBhbmQgSU5PVVQgdHlwZW1hcHMuCgkgICAgRm9yIE9VVFBVVCB2YXJpYWJsZXMsIHRoZSBsaXNwIHdyYXBwZXIgcmV0dXJucyBtdWx0aXBsZQoJICAgIHZhbHVlcy4KCjAyLzI2LzIwMDY6IG1tYXR1cwoKCSAgICBbUnVieV0gYWRkIGFyZ2Nhcmd2LmkgbGlicmFyeSBmaWxlLgoJICAgIAoJICAgIFVzZSBpdCBhcyBmb2xsb3c6CgoJCSVpbmNsdWRlIGFyZ2Nhcmd2LmkKCSAgICAgIAkJCQkJCQkJCSAKICAgCSAgICAgICAgJWFwcGx5IChpbnQgQVJHQywgY2hhciAqKkFSR1YpIHsgKHNpemVfdCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikgfSAKCSAgICAgIAkJCQkJCQkJCSAKICAgCSAgICAgICAgJWlubGluZSB7CQkJCQogICAJICAgICAgICAgIGludCBtYWluQXBwKHNpemVfdCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikgCQogICAJICAgICAgICAgIHsJCQkJCQkKICAgCSAgICAgICAgICAgIHJldHVybiBhcmdjOwkJCQkJCiAgIAkgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQkJCQkJCQkKCSAgICAgIAkJCQkJCQkKICAgCSAgICB0aGVuIGluIHRoZSBydWJ5IHNpZGU6CQkJCQkKCSAgICAgIAkJCQkJCQkJCiAgIAkgICAgICAgIGFyZ3MgPSBbImFzZGYiLCAiYXNkZjIiXQkJCQkKICAgCSAgICAgICAgbiA9IG1haW5BcHAoYXJncyk7CgkKCgkgICAgVGhpcyBpcyB0aGUgc2ltaWxhciB0byB0aGUgcHl0aG9uIHZlcnNpb24gTGliL3B5dGhvbi9hcmdjYXJndi5pCgowMi8yNC8yMDA2OiBtZ29zc2FnZQoKCSAgICBTbWFsbCB1cGRhdGUgTHVhIGRvY3VtZW50cyBvbiB0cm91Ymxlc2hvb3RpbmcgcHJvYmxlbXMKCSAgICAKMDIvMjIvMjAwNjogbW1hdHVzIAoKCSAgICBGaXggYWxsIHRoZSBlcnJvcnMgcmVwb3J0ZWQgZm9yIDEuMy4yOC4KCSAgICAtIGZpeCBidWcgIzExNTgxNzgKCSAgICAtIGZpeCBidWcgIzEwNjA3ODkKCSAgICAtIGZpeCBidWcgIzEyNjM0NTcKCSAgICAtIGZpeCAnY29uc3QgIGNoYXIqJicgdHlwZW1hcCBpbiB0aGUgVVRMLCByZXBvcnRlZCBieSBHZW9mZiBIdXRjaGlzb24KCSAgICAtIGZpeGVzIGZvciBweXRob24gMi4xIGFuZCB0aGUgcnVudGltZSBsaWJyYXJ5CgkgICAgLSBmaXggY29weWN0b3IgKyB0ZW1wbGF0ZSBidWcgIzE0MzIxMjUKCSAgICAtIGZpeCBbIDE0MzIxNTIgXSAlcmVuYW1lIGZyaWVuZCBvcGVyYXRvcnMgaW4gbmFtZXNwYWNlCgkgICAgLSBmaXggZ2NjIHdhcm5pbmcgcmVwb3J0ZWQgYnkgUi4gQmVybnN0ZWluCgkgICAgLSBhdm9pZCBhc3NlcnQgd2hlbiBmaW5kaW5nIGEgcmVjdXJzaXZlIHNjb3BlIGluaGVyaXRhbmNlLAoJICAgICAgZW1pdCBhIHdhcm5pbmcgaW4gdGhlIHdvcnN0IGNhc2UsIHJlcG9ydGVkIGJ5IE5pdHJvIAoJICAgIC0gZml4IHByZW1hdHVyZSBvYmplY3QgZGVsZXRpb24gcmVwb3J0ZWQgYnkgUGF1bCBpbiB0Y2wzZAoJICAgIC0gZml4IHdhcm5pbmcgcmVwb3J0ZWQgYnkgTml0cm8gaW4gVkM3CgkgICAgLSBtb3JlIGZpeGVzIGZvciBvbGQgU29sYXJpcyBjb21waWxlcgoJICAgIC0gZml4IGZvciBweXRob24gMi4zIGFuZCBnY19yZWZzIGlzc3VlIHJlcG9ydGVkIGJ5IEx1aWdpCgkgICAgLSBmaXggZmFzdHByb3h5IGZvciBtZXRob2RzIHVzaW5nIGt3YXJncwoJICAgIC0gZml4IG92ZXJsb2FkICsgcHJvdGVjdGVkIG1lbWJlciBpc3N1ZSByZXBvcnRlZCBieSBDb2xpbiBNY0RvbmFsZAoJICAgIC0gZml4IHNldGVycm9ybXNnIGFzIHJlcG9ydGVkIGJ5IENvbGluIE1jRG9uYWxkCgkgICAgLSBmaXggZGlyZWN0b3JzLCBub3cgdGhlIHRlc3Qtc3VpdGUgcnVucyBhZ2FpbiB1c2luZyAtZGlyZWN0b3JzCgkgICAgLSBmaXggZm9yIGZyaWVuZCBvcGVyYXRvciBhbmQgVmlzdWFsIHN0dWRpbyBhbmQgYnVnIDE0MzIxNTIKCSAgICAtIGZpeCBidWcgIzE0MzUwOTAKCSAgICAtIGZpeCB1c2luZyArICVleHRlbmQgYXMgcmVwb3J0ZWQgYnkgV2lsbGlhbQoJICAgIC0gZml4IGJ1ZyAjMTA5NDk2NAoJICAgIC0gZml4IGZvciBQeV9Ob3RJbXBsZW1lbnRlZCBhcyByZXBvcnRlZCBieSBPbGx5IGFuZCBBbWF1cnkKCSAgICAtIGZpeCBuZXN0ZWQgbmFtZXNwYWNlIGlzc3VlIHJlcG9ydGVkIGJ5IENoYXJsaWUKCgkgICAgYW5kIGFsc286CgkgICAgCgkgICAgLSBhbGxvdyBkaXJlY3RvciBwcm90ZWN0ZWQgbWVtYmVycyBieSBkZWZhdWx0CgkgICAgLSBkZWxldGUgZXh0cmEgbmV3IGxpbmVzIGluIHN3aWdtYWNyb3NbVVRMXQoJICAgIC0gY29zbWV0aWMgZm9yIGdlbmVyYXRlZCBweXRob24gY29kZQoJICAgIC0gYWRkIHRoZSBmYWN0b3J5LmkgbGlicmFyeSBmb3IgVVRMCgkgICAgLSBhZGQgc3dpZ3JlZ2lzdGVyIHByb3h5IG1ldGhvZCBhbmQgbW92ZSBfX3JlcHJfXyB0byBhCgkgICAgICBzaW5nbGUgZ2xvYmFsIG1vZHVsZSAgW3B5dGhvbl0KCjAyLzIyLzIwMDY6IG1tYXR1cyAKCgkgICAgV2hlbiB1c2luZyBkaXJlY3RvcnMsIG5vdyBzd2lnIHdpbGwgZW1pdCBhbGwgdGhlIHZpcnR1YWwKCSAgICBwcm90ZWN0ZWQgbWV0aG9kcyBieSBkZWZhdWx0LiAKCgkgICAgSW4gcHJldmlvdXMgcmVsZWFzZXMsIHlvdSBuZWVkZWQgdG8gdXNlIHRoZSAnZGlycHJvdCcKCSAgICBvcHRpb24gdG8gYWNoaWV2ZSB0aGUgc2FtZS4KCgkgICAgSWYgeW91IHdhbnQsIHlvdSBjYW4gZGlzYWJsZSB0aGUgbmV3IGRlZmF1bHQgYmVoYXZpb3VyLAoJICAgIHVzZSB0aGUgJ25vZGlycHJvdCcgb3B0aW9uOiAKCgkgICAgICAgc3dpZyAtbm9kaXJwcm90IC4uLgoKCSAgICBhbmQvb3IgdGhlICVub2RpcmVjdG9yIGZlYXR1cmUgZm9yIHNwZWNpZmljIG1ldGhvZHMsIGkuZS46CgoJICAgICAgICVub2RpcmVjdG9yIEZvbzo6YmFyOwoKCSAgICAgICBzdHJ1Y3QgRm9vIHsKCSAgICAgICAgIHZpcnR1YWwgfkZvbygpOwoKCSAgICAgICBwcm90ZWN0ZWQ6CgkgICAgICAgICB2aXJ0dWFsIHZvaWQgYmFyKCk7CgkgICAgICAgfTsKCSAgICAKCgkgICAgQXMgYmVmb3JlLCBwdXJlIGFic3RyYWN0IHByb3RlY3RlZCBtZW1iZXJzIGFyZSBhbGx3YXlzCgkgICAgZW1pdHRlZCwgaW5kZXBlbmRlbnQgb2YgdGhlICdkaXJwcm90L25vZGlycHJvdCcgb3B0aW9ucy4KCgowMi8yMi8yMDA2OiBtbWF0dXMKCSAgICBBZGQgdGhlIGZhY3RvcnkuaSBsaWJyYXJ5IGZvciBsYW5ndWFnZXMgdXNpbmcgdGhlIFVUTCAocHl0aG9uLHRjbCxydWJ5LHBlcmwpLgoJICAgIAogICAgICAgICAgICBmYWN0b3J5LmkgaW1wbGVtZW50cyBhIG1vcmUgbmF0dXJhbCB3cmFwIGZvciBmYWN0b3J5IG1ldGhvZHMuIAoKCSAgICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmU6CQkJCQkJCSAgICAKCSAgICAJCQkJCQkJCSAgICAKICAJICAgIC0tLS0gIGdlb21ldHJ5LmggLS0tLS0tLS0JCQkJCSAgICAKICAJICAgICAgICAgc3RydWN0IEdlb21ldHJ5IHsgICAgICAgICAgICAgICAgICAgICAgICAgIAkJICAgIAogIAkgICAgICAgICAgIGVudW0gR2VvbVR5cGV7CQkJICAgICAJCQkgICAgCiAgCSAgICAgICAgICAgICBQT0lOVCwJCQkJICAgICAJCSAgICAKICAJICAgICAgICAgICAgIENJUkNMRQkJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIH07CQkJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIAkJCQkJICAgICAJCSAgICAKICAJICAgICAgICAgICB2aXJ0dWFsIH5HZW9tZXRyeSgpIHt9ICAgIAkJICAgICAJCSAgICAKICAJICAgICAgICAgICB2aXJ0dWFsIGludCBkcmF3KCkgPSAwOwkJCQkgICAgCiAgCSAgICAJIAkJCQkJCQkgICAgCiAgCSAgICAJIC8vCQkJCQkJCSAgICAKICAJICAgIAkgLy8gRmFjdG9yeSBtZXRob2QgZm9yIGFsbCB0aGUgR2VvbWV0cnkgb2JqZWN0cwkJICAgIAogIAkgICAgCSAvLwkJCQkJCQkgICAgCiAgCSAgICAgICAgICAgc3RhdGljIEdlb21ldHJ5ICpjcmVhdGUoR2VvbVR5cGUgaSk7ICAgICAJCSAgICAKICAJICAgICAgICAgfTsJCQkJCSAgICAgCQkgICAgCiAgCSAgICAgICAgIAkJCQkJICAgICAJCQkgICAgCiAgCSAgICAgICAgIHN0cnVjdCBQb2ludCA6IEdlb21ldHJ5ICB7CQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIGludCBkcmF3KCkgeyByZXR1cm4gMTsgfQkJICAgICAJCSAgICAKICAJICAgICAgICAgICBkb3VibGUgd2lkdGgoKSB7IHJldHVybiAxLjA7IH0gICAgCSAgICAgCQkgICAgCiAgCSAgICAgICAgIH07CQkJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAJCQkJCSAgICAgCQkJICAgIAogIAkgICAgICAgICBzdHJ1Y3QgQ2lyY2xlIDogR2VvbWV0cnkgIHsJCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgaW50IGRyYXcoKSB7IHJldHVybiAyOyB9CQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIGRvdWJsZSByYWRpdXMoKSB7IHJldHVybiAxLjU7IH0gICAgICAgICAgCQkgICAgCiAgCSAgICAgICAgIH07IAkJCQkJICAgICAJCSAgICAKICAJICAgICAgICAgCQkJCQkJCQkgICAgCiAgCSAgICAgICAgIC8vCQkJCQkJCSAgICAKICAJICAgICAgICAgLy8gRmFjdG9yeSBtZXRob2QgZm9yIGFsbCB0aGUgR2VvbWV0cnkgb2JqZWN0cwkJICAgIAogIAkgICAgICAgICAvLwkJCQkJCQkgICAgCiAgCSAgICAgICAgIEdlb21ldHJ5ICpHZW9tZXRyeTo6Y3JlYXRlKEdlb21UeXBlIHR5cGUpIHsJCSAgICAKICAJICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIGNhc2UgUE9JTlQ6IHJldHVybiBuZXcgUG9pbnQoKTsJICAgICAJCSAgICAKICAJICAgICAgICAgICBjYXNlIENJUkNMRTogcmV0dXJuIG5ldyBDaXJjbGUoKTsgCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIDA7CQkJICAgICAJCSAgICAKICAJICAgICAgICAgICB9CQkJCQkgICAgIAkJICAgIAogIAkgICAgICAgICB9CQkJCQkgICAgCQkgICAgCiAgCSAgICAtLS0tICBnZW9tZXRyeS5oIC0tLS0tLS0tCQkJCQkgICAgCgkgICAgCQkJCQkJCQkgICAgCgkgICAgCQkJCQkJCQkgICAgCgkgICAgWW91IGNhbiB1c2UgdGhlICVmYWN0b3J5IHdpdGggdGhlIEdlb21ldHJ5OjpjcmVhdGUgbWV0aG9kIGFzIGZvbGxvd3M6CgkgICAgCQkJCQkJCQkgICAgCiAgCSAgICAgICVuZXdvYmplY3QgR2VvbWV0cnk6OmNyZWF0ZTsJCQkJICAgIAogIAkgICAgICAlZmFjdG9yeShHZW9tZXRyeSAqR2VvbWV0cnk6OmNyZWF0ZSwgUG9pbnQsIENpcmNsZSk7CSAgICAKICAJICAgICAgJWluY2x1ZGUgImdlb21ldHJ5LmgiCQkJCQkgICAgCgkgICAgCQkJCQkJCQkgICAgCiAgCSAgICBhbmQgR2VvbWV0cnk6OmNyZWF0ZSB3aWxsIHJldHVybiBhICdQb2ludCcgb3IgJ0NpcmNsZScgaW5zdGFuY2UgICAKICAJICAgIGluc3RlYWQgb2YgdGhlIHBsYWluICdHZW9tZXRyeScgdHlwZS4gRm9yIGV4YW1wbGUsIGluIHB5dGhvbjoJICAgIAoJICAgIAkJCQkJCQkJICAgIAogIAkgICAgICBjaXJjbGUgPSBHZW9tZXRyeS5jcmVhdGUoR2VvbWV0cnkuQ0lSQ0xFKQkJCSAgICAKICAJICAgICAgciA9IGNpcmNsZS5yYWRpdXMoKQkJCQkJCSAgICAKCSAgICAJCQkJCQkJCSAgICAKICAJICAgIHdoZXJlICdjaXJjbGUnIG5vdyBpcyBhIENpcmNsZSBwcm94eSBpbnN0YW5jZS4JICAgIAkJICAgIAoKCjAyLzE3LzIwMDY6IG1rb2VwcGUKCSAgICBbTXpTY2hlbWVdIFR5cGVtYXBzIGZvciBhbGwgaW50ZWdyYWwgdHlwZXMgbm93IGFjY2VwdCB0aGUgZnVsbCByYW5nZSBvZiBpbnRlZ3JhbAoJICAgIHZhbHVlcywgYW5kIHRoZXkgc2lnbmFsIGFuIGVycm9yIHdoZW4gYSB2YWx1ZSBvdXRzaWRlIHRoZSB2YWxpZCByYW5nZSBpcyBwYXNzZWQuCgkgICAgW0d1aWxlXSBUeXBlbWFwcyBmb3IgYWxsIGludGVncmFsIHR5cGVzIG5vdyBzaWduYWwgYW4gZXJyb3Igd2hlbiBhIHZhbHVlIG91dHNpZGUKCSAgICB0aGUgdmFsaWQgcmFuZ2UgaXMgcGFzc2VkLgoKMDIvMTMvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0RvY3VtZW50c10gdXBkYXRlZCB0aGUgZXh0ZW5kaW5nIGRvY3VtZW50cyB0byBnaXZlIGEgc2tlbGV0b24gc3dpZ2dpbmcgY29kZQogICAgICAgICAgICB3aXRoIGEgZmV3IHR5cGVtYXBzLgogICAgICAgICAgICBbTHVhXSBhZGRlZCBhbiBleHRyYSB0eXBlbWFwIGZvciB2b2lkKiBbaW5dLCBzbyBhIGZ1bmN0aW9uIHdoaWNoIHJlcXVpcmVzIGEgdm9pZCoKICAgICAgICAgICAgY2FuIHRha2UgYW55IGtpbmQgb2YgcG9pbnRlcgoKVmVyc2lvbiAxLjMuMjggKEZlYnJ1YXJ5IDEyLCAyMDA2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowMi8xMS8yMDA2OiBtbWF0dXMKCSAgICBGaXggbWFueSBpc3N1ZXMgd2l0aCBsaW5lIGNvdW50aW5nIGFuZCBlcnJvciByZXBvcnRzLgoKMDIvMTEvMjAwNjogbW1hdHVzCgkgICAgW1B5dGhvbl0gQmV0dGVyIHN0YXRpYyBkYXRhIG1lbWJlciBzdXBwb3J0LCBpZiB5b3UgaGF2ZQoJICAgIAogICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgIHN0YXRpYyBpbnQgYmFyOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoZW4gbm93IGlzIHZhbGlkIHRvIGFjY2VzcyB0aGUgc3RhdGljIGRhdGEgbWVtYmVyLCBpZToKCiAgICAgICAgICAgICAgICBmID0gRm9vKCkKICAgICAgICAgICAgICAgIGYuYmFyID0gMwoKCSAgICBqdXN0IGFzIGluIEMrKy4KCgowMi8xMS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0KICAgICAgICAgICAgRml4ZWQgY29kZSBnZW5lcmF0aW9uIHRvIHdvcmsgYWdhaW4gd2l0aCBvbGQgdmVyc2lvbnMgb2YgUGVybAogICAgICAgICAgICAoNS4wMDQgYW5kIGxhdGVyIHRlc3RlZCkKCjAyLzA0LzIwMDY6IG1tYXR1cwoJICAgIFtQeXRob25dIEFkZCB0aGUgJWV4dGVuZF9zbWFydF9wb2ludGVyKCkgZGlyZWN0aXZlIHRvIGV4dGVuZAoJICAgIFNXSUcgc21hcnQgcG9pbnRlciBzdXBwb3J0IGluIHB5dGhvbi4gCgoJICAgIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhIHNtYXJ0IHBvaW50ZXIgYXM6CgkgICAgCgkgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVHlwZT4gY2xhc3MgUkNQdHIgewoJICAgICAgcHVibGljOgoJICAgICAgICAuLi4KCSAgICAgICAgUkNQdHIoVHlwZSAqcCk7CgkJVHlwZSAqIG9wZXJhdG9yLT4oKSBjb25zdDsKCQkuLi4KCSAgICAgIH07CgkgICAgICAKCSAgICB5b3UgdXNlIHRoZSAlZXh0ZW5kX3NtYXJ0X3BvaW50ZXIgZGlyZWN0aXZlIGFzOgoJICAgIAoJICAgICAgJWV4dGVuZF9zbWFydF9wb2ludGVyKFJDUHRyPEE+KTsKCSAgICAgICV0ZW1wbGF0ZShSQ1B0cl9BKSAgUkNQdHI8QT47CgkgICAgCgkgICAgdGhlbiwgaWYgeW91IGhhdmUgc29tZXRoaW5nIGxpa2U6CgoJICAgICAgUkNQdHI8QT4gbWFrZV9wdHIoKTsKCSAgICAgIGludCBmb28oQSAqKTsKCgkgICAgeW91IGNhbiBkbyB0aGUgZm9sbG93aW5nOgoKCSAgICAgIGEgPSBtYWtlX3B0cigpOwoJICAgICAgYiA9IGZvbyhhKTsKCiAgICAgICAgICAgIGllLCBzd2lnIHdpbGwgYWNjZXB0IGEgUkNQdHI8QT4gb2JqZWN0IHdoZXJlIGEgJ0EgKicgaXMKICAgICAgICAgICAgZXhwZWN0ZWQuCgoJICAgIEFsc28sIHdoZW4gdXNpbmcgdmVjdG9ycwoJICAgIAoJICAgICAgJWV4dGVuZF9zbWFydF9wb2ludGVyKFJDUHRyPEE+KTsKCSAgICAgICV0ZW1wbGF0ZShSQ1B0cl9BKSBSQ1B0cjxBPjsKCSAgICAgICV0ZW1wbGF0ZSh2ZWN0b3JfQSkgc3RkOjp2ZWN0b3I8UkNQdHI8QT4gPjsKCQkKCSAgICB5b3UgY2FuIHR5cGUKCgkgICAgICBhID0gQSgpOwoJICAgICAgdiA9IHZlY3Rvcl9BKDIpCgkgICAgICB2WzBdID0gYQoKICAgICAgICAgICAgaWUsIGFuICdBIConIG9iamVjdCBpcyBhY2NlcHRlZCwgdmlhIGltcGxpY2l0IGNvbnZlcnNpb24sIAoJICAgIHdoZXJlIGEgUkNQdHI8QT4gb2JqZWN0IGlzIGV4cGVjdGVkLiBBZGRpdGlvbmFsbHkKCgkgICAgICB4ID0gdlswXQoKCSAgICByZXR1cm5zIChhbmQgc2V0cyAneCcgYXMpIGEgY29weSBvZiB2WzBdLCBtYWtpbmcgcmVmZXJlbmNlCgkgICAgY291bnRpbmcgcG9zc2libGUgYW5kIGNvbnNpc3RlbnQuCgoJICAgICVleHRlbmRfc21hcnRfcG9pbnRlciBpcyBqdXN0IGEgY29sbGVjdGlvbnMgb2YgbmV3L29sZAoJICAgIHRyaWNrcywgaW5jbHVkaW5nICV0eXBlbWFwcyBhbmQgdGhlIG5ldyAlaW1wbGljaXRjb252CgkgICAgZGlyZWN0aXZlLgoKMDIvMDIvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgYnVnZml4ICMxMzU2NTc3LCBjaGFuZ2VkIGRvdWJsZT0+bHVhX251bWJlciBpbiBhIGZldyBwbGFjZXMuCiAgICAgICAgICAgIGFkZGVkIHRoZSBzdGQ6OnBhaXIgd3JhcHBpbmcKCjAxLzMwLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGFuZCBzdGQ6OndzdHJpbmcgbWVtYmVyIHZhcmlhYmxlcyBhbmQgZ2xvYmFsIHZhcmlhYmxlcyBub3cgdXNlCiAgICAgICAgICAgICVuYXR1cmFsdmFyIGJ5IGRlZmF1bHQsIG1lYW5pbmcgdGhleSB3aWxsIG5vdyBiZSB3cmFwcGVkIGFzIGV4cGVjdGVkIGluIGFsbCBsYW5ndWFnZXMuCiAgICAgICAgICAgIFByZXZpb3VzbHkgdGhlc2Ugd2VyZSB3cmFwcGVkIGFzIGEgcG9pbnRlciByYXRoZXIgdGhhbiBhIHRhcmdldCBsYW5ndWFnZSBzdHJpbmcuCiAgICAgICAgICAgIEl0IGlzIG5vIGxvbmdlciBuZWNlc3NhcnkgdG8gYWRkIHRoZSBmb2xsb3dpbmcgd29ya2Fyb3VuZCB0byB3cmFwIHRoZXNlIGFzIHN0cmluZ3M6CgoJCSVhcHBseSBjb25zdCBzdGQ6OnN0cmluZyAmIHsgc3RkOjpzdHJpbmcgKn0KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjAxLzI4LzIwMDY6IG1rb2VwcGUKCSAgICBbR3VpbGUgLXNjbV0gCgkgICAgQWRkIHR5cGVtYXBzIGZvciBoYW5kbGluZyBvZiBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMuCgowMS8yNC8yMDA2OiBtbWF0dXMKCSAgICAtIEJldHRlciBzdXBwb3J0IGZvciB0aGUgJW5hdHVyYWx2YXIgZGlyZWN0aXZlLCBub3cgaXQKCSAgICAgIHdvcmtzIHdpdGggdGhlIHNjcmlwdGluZyBsYW5ndWFnZXMgYXMgd2VsbCBhcwoJICAgICAgSmF2YS9DIy4KCSAgICAgIAoJICAgICAgTm93LCBpdCBjYW4gYWxzbyBiZSBhcHBsaWVkIHRvIGNsYXNzIHR5cGVzOgoKCSAgICAgICAgJW5hdHVyYWx2YXIgc3RkOjpzdHJpbmc7CgkgICAgICAgICVpbmNsdWRlIDxzdGRfc3RyaW5nLmk+CgkgICAgICAKICAgICAgICAgICAgICB0aGF0IHdpbGwgdGVsbCBzd2lnIHRvIHVzZSB0aGUgJ25hdHVyYWwnIHdyYXBwaW5nCiAgICAgICAgICAgICAgbWVjaGFuaXNtIHRvIGFsbCBzdGQ6OnN0cmluZyBnbG9iYWwgYW5kIG1lbWJlcgogICAgICAgICAgICAgIHZhcmlhYmxlcy4KCgkgICAgLSBBZGQgc3VwcG9ydCBmb3IgdGhlICVhbGxvd2V4Y2VwdCBmZWF0dXJlIGFsb25nIHRoZQogICAgICAgICAgICAgIHNjcmlwdGluZyBsYW5ndWFnZXMsIHdoaWNoIGFsbG93cyB0aGUgJWV4Y2VwdGlvbiBmZWF0dXJlCiAgICAgICAgICAgICAgdG8gYmUgYXBwbGllZCB0byB0aGUgdmFyaWFibGUgYWNjZXNzIG1ldGhvZHMuIEFsc28sIGFkZAogICAgICAgICAgICAgIHRoZSAlZXhjZXB0aW9udmFyIGRpcmVjdGl2ZSB0byBzcGVjaWZ5IGEgZGlzdGludGljCiAgICAgICAgICAgICAgZXhjZXB0aW9uIG1lY2hhbmlzbSBvbmx5IGZvciB2YXJpYWJsZXMuCgkgICAgICAKCSAgICAKCSAgICAtIEFkZCBtb3JlIGRvY3MgZm9yIHRoZSAlZGVsb2JqZWN0IGRpcmVjdGl2ZSB0byBtYXJrIGEgbWV0aG9kIGFzIGEKCSAgICAgIGRlc3RydWN0b3IsICdkaXNvd25pbmcnIHRoZSBmaXJzdCBhcmd1bWVudC4gRm9yIGV4YW1wbGU6CgoJICAgICAgICAlbmV3b2JqZWN0IGNyZWF0ZV9mb287CgkgICAgICAgICVkZWxvYmplY3QgZGVzdHJveV9mb287CgoJICAgICAgICBGb28gKmNyZWF0ZV9mb28oKSB7IHJldHVybiBuZXcgRm9vKCk7IH0KCSAgICAgICAgdm9pZCBkZXN0cm95X2ZvbyhGb28gKmZvbykgeyBkZWxldGUgZm9vOyB9CgoJICAgICAgb3IgaW4gYSBtZW1iZXIgbWV0aG9kIGFzOgoKCSAgICAgICAgJWRlbG9iamVjdCBGb286OmRlc3Ryb3k7CgoJICAgICAgICBjbGFzcyBGb28gewoJICAgICAgICBwdWJsaWM6CgkgICAgICAgICAgdm9pZCBkZXN0cm95KCkgeyBkZWxldGUgdGhpczt9CgoJICAgICAgICBwcml2YXRlOgoJICAgICAgICAgIH5Gb28oKTsKICAgICAgICAgICAgICAgfTsKCgowMS8yNC8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXQoJICAgIC0gUmVtb3ZlZCB0aGUgdHlwZSBzd2lnX2x1YV9jb21tYW5kX2luZm8gJiByZXBsYWNlIHdpdGggbHVhTF9yZWcKCSAgICAgICh3aGljaCB0aGVuIGJyb2tlIHRoZSBjb2RlKSwgZml4ZWQgdGhpcwoJICAgIC0gYWRkZWQgYW4gYWRkaXRpb25hbCBjYXN0IGluIHRoZSB0eXBlbWFwcyBmb3IgZW51bSdzCgkgICAgICBkdWUgdG8gdGhlIGlzc3VlIHRoYXQgVkMuTmV0IHdpbGwgbm90IGFsbG93IGNhc3Rpbmcgb2YKCSAgICAgIGEgZG91YmxlIHRvIGFuIGVudW0gZGlyZWN0bHkuIFRoZXJlZm9yZSBjYXN0IHRvIGludCB0aGVuIHRvIGVudW0KCSAgICAgICh0aGFua3MgdG8gSmFzb24gUmVnbyBmb3IgdGhpcyBvYnNlcnZhdGlvbikKCjAxLzE2LzIwMDY6IG1tYXR1cyAoQ2hhbmdlIGRpc2FibGVkLi4uIHdpbGwgYmUgYmFjayBpbiBDVlMgc29vbikKCSAgICBBZGQgaW5pdGlhbCBzdXBwb3J0IGZvciByZWdleHAgdmlhIHRoZSBleHRlcm5hbCBsaWJyYXJ5CgkgICAgUnhTcGVuY2VyLiBTV0lHIGRvZXNuJ3QgcmVxdWlyZSB0aGlzIGxpYnJhcnkgdG8gY29tcGlsZQoJICAgIGFuZC9vciBydW4uIEJ1dCBpZiB5b3Ugc3BlY2lmeSAtLXdpdGgtcnhzcGVuY2VyLCBhbmQgdGhlCgkgICAgbGlicmFyeSBpcyBmb3VuZCBkdXJpbmcgaW5zdGFsbGF0aW9uLCB0aGVuIHN3aWcgd2lsbCB1c2UKCSAgICBpdCBpbiB0aHJlZSBwbGFjZXM6CgoJICAgIC0gSW4gJXJlbmFtZXMgcnVsZXMsIHZpYSB0aGUgbmV3IHJ4c21hdGNoIHJ1bGVzLCBmb3IgZXhhbXBsZToKCSAgICAJICAKCSAgICAJICAlcmVuYW1lKCIlKGxvd2VyY2FzZSkiLHJ4c21hdGNoJG5hbWU9IkdTTF8uKiIpICIiOwoJICAgIAkgICVyZW5hbWUoIiUobG93ZXJjYXNlKSIscnhzbWF0Y2gkbm9kZVR5cGU9ImVudW0gR1NMXy4qIikgIiI7CgkgICAgCSAKICAgICAgICAgICAgICByeHNtYXRjaCBpcyBzaW1pbGFyIHRvIHRoZSBtYXRjaCBydWxlLCBpdCBqdXN0IHVzZXMKICAgICAgICAgICAgICB0aGUgUnhTcGVuY2VyIHJlZ2V4cCBsaWJyYXJ5IHRvIGRlY2lkZSBpZiB0aGVyZSBpcyBhCiAgICAgICAgICAgICAgbWF0Y2ggd2l0aCB0aGUgcHJvdmlkZWQgcmVnZXhwLiBBcyB3aXRoIHRoZSBtYXRjaAogICAgICAgICAgICAgIHJ1bGUsIHlvdSBjYW4gYWxzbyB1c2UgdGhlIG5lZ2F0ZSBydWxlIG5vdHJ4c21hdGNoLgoKCSAgICAtIEluIHRoZSAlcmVuYW1lIHRhcmdldCBuYW1lIHZpYSB0aGUgcnhzdGFyZ2V0IG9wdGlvbiwgZm9yIGV4YW1wbGU6CgkgICAgCQkgCgkgICAgCSAgJXJlbmFtZSgiJShsb3dlcmNhc2UpIixyeHN0YXJnZXQ9MSkgIkdTTF8uKiI7CgoJICAgIAl3aGVyZSB0aGUgdGFyZ2V0IG5hbWUgIkdTTC4qIiBpcyBub3cgdW5kZXJzdG9vZCBhcyBhCgkgICAgCXJlZ2V4cCB0byBiZSBtYXRjaGVkLiAgCgkgICAgCSAKICAgICAgICAgICAgLSBJbiB0aGUgbmV3IGVuY29kZXIgInJ4c3BlbmNlciIsIHdoaWNoIGxvb2tzIGxpa2U6CgoJICAgIAkgICUocnhzcGVuY2VyOltyZWdleHBdW3JlcGxhY2VdKXMKCgkgICAgCXdoZXJlICJyZWdleHAiIGlzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gYW5kICJyZXBsYWNlIgoJICAgIAlpcyBhIHN0cmluZyB1c2VkIGFzIGEgcmVwbGFjZW1lbnQsIHdoZXJlIHRoZSBAMCxAMSwuLi4sQDkKCSAgICAJcHNldWRvIGFyZ3VtZW50cyBhcmUgdXNlZCB0byByZXByZXNlbnQgdGhlCgkgICAgCWNvcnJlc3BvbmRpbmcgbWF0Y2hpbmcgaXRlbXMgaW4gdGhlIHJlZyBleHByZXNzaW9uLgoKCSAgICAJRm9yIGV4YW1wbGU6CgkgICAgCQkgICAgICAKCSAgICAgICAgJShyeHNwZW5jZXI6W0dTTC4qXVtAMF0pcyAgICAgICA8LSBIZWxsbyAgICAtPiAKCSAgICAgICAgJShyeHNwZW5jZXI6W0dTTC4qXVtAMF0pcyAgICAgICA8LSBHU0xIZWxsbyAtPiBHU0xIZWxsbwoJICAgICAgICAlKHJ4c3BlbmNlcjpbR1NMKC4qKV1bQDFdKXMgICAgIDwtIEdTTEhlbGxvIC0+IEhlbGxvCgkgICAgICAgICUocnhzcGVuY2VyOltHU0woLiopXVtnc2xAMV0pcyAgPC0gR1NMSGVsbG8gLT4gZ3NsSGVsbG8KCgkgICAgCUFub3RoZXIgZXhhbXBsZSBjb3VsZCBiZToKCiAgICAgICAgICAgICAgICAlcmVuYW1lKCIlKGxvd2VyY2FzZSlzIixzb3VyY2VmbXQ9IiUocnhzcGVuY2VyOltHU0xfKC4qKV1bQDFdKXMiLCUkaXNmdW5jdGlvbikgIiI7CgoJICAgIAl3aGljaCB0YWtlIG91dCB0aGUgcHJlZml4ICJHU0xfIiBhbmQgcmV0dXJucyBhbGwgdGhlCgkgICAgCWZ1bmN0aW9uIG5hbWVzIGluIGxvd2VyIGNhc2VzLCBhcyBmb2xsb3dpbmc6CgoJICAgIAkgICAgdm9pZCBHU0xfSGVsbG8oKTsgICAtPiAgIGhlbGxvKCk7CgkgICAgCSAgICB2b2lkIEdTTF9IaSgpOyAgICAgIC0+ICAgaGkoKTsKCSAgICAJICAgIGNvbnN0IGludCBHU0xfTUFYOyAgLT4gICBHU0xfTUFYOyAgLy8gbm8gY2hhbmdlLCBpcyBub3QgYSBmdW5jdGlvbgoJCgkgICAgV2UgdXNlIHRoZSBSeFNwZW5jZXIgYXMgYW4gaW5pdGlhbCB0ZXN0IGJlZCB0bwogICAgICAgICAgICBpbXBsZW1lbnRpb24gd2hpbGUgd2UgZGVjaWRlIHdoaWNoIGxpYnJhcnkgd2lsbCBiZQogICAgICAgICAgICBmaW5hbGx5IGFkZGVkIHRvIHN3aWcuCgogICAgICAgICAgICBZb3UgY2FuIG9idGFpbiB0aGUgUnhTcGVuY2VyIGxpYnJhcnkgZnJvbSAKCSAgICAKCSAgICAgIGh0dHA6Ly9hcmdsaXN0LmNvbS9yZWdleCAoVW5peCkKCgkgICAgb3IKCSAgICAgCgkgICAgICBodHRwOi8vZ251d2luMzIuc291cmNlZm9yZ2UubmV0L3BhY2thZ2VzLmh0bWwgKFdpbmRvd3MpCgoJICAgIE9uY2UgaW5zdGFsbGVkLCB1c2UgIm1hbiByeHNwZW5jZXIiIHRvIGdldCBtb3JlIGluZm8KCSAgICBhYm91dCB0aGUgcmVnZXhwIGZvcm1hdCwgb3IganVzdCBnb29nbGUgcnhzcGVuY2VyLgoKCSAgICBTaW5jZSBub3cgeW91IGNhbiBlbmFibGUgdGhlIHJ4c21hdGNoIHJ1bGVzIChzZWUgYWJvdmUpLAogICAgICAgICAgICB0aGUgc2ltcGxlIG9yICd8JyBzdXBwb3J0IGZvciB0aGUgbWF0Y2ggcnVsZXMKICAgICAgICAgICAgKDAxLzEyLzIwMDY6IG1tYXR1cykgaXMgZGlzYWJsZWQuIFN0aWxsLCBpZiB5b3UgaGF2ZQogICAgICAgICAgICBwcm9ibGVtcyB3aXRoIHRoZSByeHNwZW5jZXIgbGlicmFyeSwgeW91IGNhbiByZS1lbmFibGUKICAgICAgICAgICAgdGhlIHNpbXBsZSAnbWF0Y2ggb3InIHN1cHBvcnQgdXNpbmcKICAgICAgICAgICAgLURTV0lHX1VTRV9TSU1QTEVfTUFUQ0hPUi4KCSAgCgowMS8xNi8yMDA2OiBtbWF0dXMKCSAgICBDaGFuZ2UgdGhlICVyZW5hbWUgcHJlZGljYXRlcyB0byB1c2UgdGhlIHByZWZpeCAnJSQnLCBhcyBpbjoKCSAgICAKCSAgICAgICVyZW5hbWUoIiUodXRpdGxlKXMiLCUkaXNmdW5jdGlvbiwlJGlzbWVtYmVyKSAiIjsgCgkgICAJCiAgICAgICAgICAgIHRvIGF2b2lkIGNsYXNoZXMgd2l0aCBvdGhlciBzd2lnIG1hY3Jvcy9kaXJlY3RpdmVzLgoKMDEvMTQvMjAwNjogY2Zpc2F2YWdlCiAgICAgICAgICAgIFtSdWJ5XQoJICAgIEFkZGVkIHN1cHBvcnQgZm9yIFJ1YnkgYmFuZyEgbWV0aG9kcyB2aWEgYSBuZXcgJWJhbmcgZmVhdHVyZS4KCSAgICBCYW5nIG1ldGhvZHMgZW5kIGluIGV4Y2xhbWF0aW9uIHBvaW50cyBhbmQgaW5kaWNhdGUgdGhhdCB0aGUKCSAgICBvYmplY3QgYmVpbmcgcHJvY2Vzc2VkIHdpbGwgYmUgbW9kaWZpZWQgaW4tcGxhY2UgYXMgCgkgICAgb3Bwb3NlZCB0byBiZWluZyBjb3BpZWQuCgowMS8xMi8yMDA2OiBjZmlzYXZhZ2UKICAgICAgICAgICAgW1J1YnldCgkgICAgVXBkYXRlZCB0aGUgUnVieSBtb2R1bGUgdG8gYXV0b21hdGljYWxseSBjb252ZXJ0CgkgICAgbWV0aG9kIG5hbWVzIHRvIGxvd2VyX2Nhc2Vfd2l0aF91bmRlcnNjb3JlcyB1c2luZyB0aGUKCSAgICBuZXcgJXJlbmFtZSBmdW5jdGlvbmFsaXR5LgoKMDEvMTIvMjAwNjogbW1hdHVzCgkgICAgLSBBZGQgYWxpYXNlcyBmb3IgJ2Nhc2UnIGVuY29kZXJzIHVzZWQgd2l0aCAlcmVuYW1lLyVuYW1ld2FybgoKCSAgICAgICUodXBwZXJjYXNlKXMgICBoZWxsb193b3JsZCAtPiBIRUxMT19XT1JMRAoJICAgICAgJShsb3dlcmNhc2UpcyAgIEhlbGxvV29ybGQgIC0+IGhlbGxvd29ybGQKCSAgICAgICUoY2FtZWxjYXNlKXMgICBoZWxsb193b3JsZCAtPiBIZWxsb1dvcmxkCgkgICAgICAlKHVuZGVyY2FzZSlzICAgSGVsbG9Xb3JsZCAgLT4gaGVsbG9fd29ybGQKCgowMS8xMi8yMDA2OiBtbWF0dXMKCSAgICAtIEFkZCB0aGUgLWR1bXBfcGFyc2VfbW9kdWxlIGFuZCAtZHVtcF9wYXJzZV90b3Agb3B0aW9ucywKCSAgICB3aGljaCBhcmUgc2ltaWxhciB0byAtZHVtcF9tb2R1bGUgYW5kIC1kdW1wX3RvcCwgYnV0IHRoZXkKCSAgICBkdW1wIHRoZSBub2RlIHRyZWVzIGp1c3QgYWZ0ZXIgcGFyc2luZywgc2hvd2luZyBvbmx5IHRoZSAKCSAgICBhdHRyaWJ1dGVzIHZpc2libGUgYXQgdGhlIHBhcnNpbmcgc3RhZ2UsIGFuZCBub3QgdGhlIGFkZGVkCgkgICAgbGF0ZXIgaW4gdHlwZW1hcC5jeHgsIGFsbG9jYXRlLmN4eCwgbGFuZy5jeHggb3IgZWxzZXdoZXJlLgoJICAgIAoJICAgIEJlc2lkZXMgZGVidWdnaW5nIHBvcnB1c2VzLCB0aGVzZSBvcHRpb25zIGFyZSB2ZXJ5IHVzZWZ1bAoJICAgIGlmIHlvdSBwbGFuIHRvIHVzZSAlcmVuYW1lIGluIGFuICJhZHZhbmNlIHdheSIsIHNpbmNlIGl0CgkgICAgc2hvd3Mgb25seSBhbmQgYWxsIHRoZSBub2RlJ3MgYXR0cmlidXRlcyB5b3UgY2FuIHVzZQoJICAgIGluc2lkZSB0aGUgbWF0Y2ggcnVsZXMuCgoKMDEvMTIvMjAwNjogbW1hdHVzCgkgICAgLSBBZGQgcHJlZGljYXRlcyB0byAlcmVuYW1lLCBzbywgeW91IGRvbid0IG5lZWQgdG8KCSAgICAgIHJlbWVtYmVyLCBmb3IgZXhhbXBsZSwgaG93IHRvIG1hdGNoIGEgbWVtYmVyIGZ1bmN0aW9uLgoKCSAgICAgIE5vdyBpdCBpcyBlYXN5LCBmb3IgZXhhbXBsZSB0byB1c2UgdGhlICd1dGl0bGUnIGVuY29kZXIgCgkgICAgICBpbiBhbGwgdGhlIG1lbWJlciBtZXRob2RzLCB5b3UgdHlwZToKCgkgICAgICAgICVyZW5hbWUoIiUodXRpdGxlKXMiLCVpc2Z1bmN0aW9uLCVpc21lbWJlcikgIiI7CgoJICAgICAgb3IgdG8gaWdub3JlIGFsbCB0aGUgZW51bWl0ZW1zIGluIGEgZ2l2ZW4gY2xhc3M6CgoJICAgICAgICAlcmVuYW1lKCIkaWdub3JlIiwgJWlzZW51bWl0ZW0sICVjbGFzc25hbWU9Ik15Q2xhc3MiKSAiIjsgIAoKCSAgICAgIEF2YWlsYWJsZSBwcmVkaWNhdGVzIGFyZSAoc2VlIHN3aWcuc3dnKToKCiAgICAgICAgICAgICAgICAlaXNlbnVtICAgICAgICAgCgkJJWlzZW51bWl0ZW0gICAgIAoJCSVpc2FjY2VzcyAgICAgICAKCQklaXNjbGFzcyAgICAgICAgCgkJJWlzZXh0ZW5kICAgICAgIAoJCSVpc2V4dGVuZCAgICAgICAKCQklaXNjb25zdHJ1Y3RvciAgCgkJJWlzZGVzdHJ1Y3RvciAgIAoJCSVpc25hbWVzcGFjZSAgICAKCQklaXN0ZW1wbGF0ZSAgICAgCgkJJWlzY29uc3RhbnQgICAgIAoJCQkJCQoJCSVpc3VuaW9uICAgICAgICAKCQklaXNmdW5jdGlvbiAgICAgCgkJJWlzdmFyaWFibGUgICAgIAoJCSVpc2ltbXV0YWJsZSAgICAKCQkJCQkKCQklaXNzdGF0aWMgICAgICAgCgkJJWlzZnJpZW5kICAgICAgIAoJCSVpc3R5cGVkZWYgICAgICAKCQklaXN2aXJ0dWFsICAgICAgCgkJJWlzZXhwbGljaXQgICAgIAoJCSVpc2V4dGVybiAgICAgICAKCQkJCQkKCQklaXNtZW1iZXIgICAgICAgCgkJJWlzZ2xvYmFsIAoJCSVpbm5hbWVzcGFjZQoKCQklaXNwdWJsaWMgICAgCgkJJWlzcHJvdGVjdGVkIAoJCSVpc3ByaXZhdGUgICAKCQkJCSAgICAgCgkJJWNsYXNzbmFtZSAgIAoKICAgICAgICAgICAgICBUaGVzZSBwcmVkaWNhdGVzIGNvcnJlc3BvbmQgdG8gc3BlY2lmaWMgJ21hdGNoJwogICAgICAgICAgICAgIGRlY2xhcmF0aW9ucywgd2hpY2ggc29tZXRpbWVzIGFyZSBub3QgYXMgZXZpZGVudCBhcyB0aGUKICAgICAgICAgICAgICBwcmVkaWNhdGVzIG5hbWVzLgoKCiAgICAgICAgICAgIC0gQWRkIHRoZSBvciAnfCcgb3BlcmF0aW9uIGluICVyZW5hbWUgbWF0Y2gsIGZvcgogICAgICAgICAgICAgIGV4YW1wbGUgdG8gY2FwaXRhbGl6ZSBhbGwgdGhlIGNvbnN0YW50cyAoJWNvbnN0YW50IG9yCiAgICAgICAgICAgICAgY29uc3QgY2RlY2wpOgoKICAgICAgICAgICAgICAgICAlcmVuYW1lKCIlKHVwcGVyKXMiLG1hdGNoPSJjZGVjbHxjb25zdGFudCIsJWlzaW1tdXRhYmxlKSAiIjsKICAgICAgICAgICAgICAgIAoKCjAxLzEyLzIwMDY6IG1nb3NzYWdlCgkgICAgLQlQYXJ0aWFsIGZpeGVkIG9mIGVycm9ycyB1bmRlciBDODksIGJ1ZyAjMTM1NjU3NAoJICAgIAkoY29udmVydGVkIEMrKyBzdHlsZSBjb21tZW50cyB0byBDIHN0eWxlKQoJICAgIC0JQWRkZWQgcGF0Y2hlcyBmcm9tIG5lb21hbnRyYUB1c2Vycy5zZi5uZXQgIzEzNzk5ODggYW5kICMxMzg4MzQzCgkgICAgCW1pc3NpbmcgYSAncmV0dXJuJyBzdGF0ZW1lbnQgZm9yIGVycm9yIGNvbmRpdGlvbnMKCSAgICAJYWxzbyB1cGRhdGVkIHRoZSAlaW5pdCBibG9jayBidWcgIzEzNTY1ODYKCQkgCjAxLzEwLzIwMDY6IG1tYXR1cwoJICAgIC0gQWRkIHRoZSAndXRpdGxlJyBlbmNvZGVyLCBhcyBhbiBleGFtcGxlIG9mIGhvdyB0byBhZGQKCSAgICAgIHlvdXIgb3duIGVuY29kZXIuIEkgYWRkZWQgdGhlIGVuY29kZXIgbWV0aG9kIGluIG1pc2MuYyAKCSAgICAgIGJ1dCBkZXZlbG9wZXJzIGNhbiBhZGQgb3RoZXJzLCB0aGUgc2FtZSB3YXksIGluc2lkZSBhbnkKCSAgICAgIHRhcmdldCBsYW5ndWFnZS4KCSAgICAgIAoJICAgICAgV2VsbCwgJ3V0aXRsZScgaXMgdGhlIHJldmVyc2Ugb2YgJ2N0aXRsZScsIGllOgoKCSAgICAgICAgICVyZW5hbWUoIiUoY3RpdGxlKXMiKSBjYW1lbF9jYXNlOyAgLT4gQ2FtZWxDYXNlOwoJICAgICAgICAgJXJlbmFtZSgiJSh1dGl0bGUpcyIpIENhbWVsQ2FzZTsgICAtPiBjYW1lbF9jYXNlOwoJCSAKCjAxLzEwLzIwMDY6IGNmaXNhdmFnZQogICAgICAgICAgICBbUnVieV0KICAgICAgICAgICAgVXBkYXRlZCBSdWJ5IEV4Y2VwdGlvbiBoYW5kbGluZy4gIENsYXNzZXMgdGhhdCBhcmUgc3BlY2lmaWVkIGluIHRocm93cyBjbGF1c2VzLCAKICAgICAgICAgICAgb3IgYXJlIG1hcmtlZCBhcyAlZXhjZXB0aW9uY2xhc3MsIGFyZSBub3cgaW5oZXJpdGVkIGZyb20gcmJfZVJ1bnRpbWVFcnJvci4gCiAgICAgICAgICAgIFRoaXMgYWxsb3dzIGluc3RhbmNlcyBvZiB0aGVzZSBjbGFzc2VzIHRvIGJlIHJldHVybmVkIHRvIFJ1YnkgYXMgZXhjZXB0aW9ucy4gCiAgICAgICAgICAgIFRodXMgaWYgYSBDKysgbWV0aG9kIHRocm93cyBhbiBpbnN0YW5jZSBvZiBNeUV4Y2VwdGlvbiwgdGhlIGNhbGxpbmcgUnVieSAKICAgICAgICAgICAgbWV0aG9kIHdpbGwgZ2V0IGJhY2sgYSBNeUV4Y2VwdGlvbiBvYmplY3QuICBUbyBzZWUgYW4gZXhhbXBsZSwgCiAgICAgICAgICAgIGxvb2sgYXQgcnVieS9leGFtcGxlcy9leGNlcHRpb25fY2xhc3MuCgowMS8xMC8yMDA2OiBtbWF0dXMKCSAgICAKICAgICAgICAgICAgLSBBZGQgdGhlICVjYXRjaGVzIGRpcmVjdGl2ZSwgd2hpY2ggY29tcGxlbWVudHMgdGhlICVleGNlcHRpb24KCSAgICBkaXJlY3RpdmUgaW4gYSBtb3JlIGF1dG9tYXRpYyB3YXkuIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZQoKICAgICAgICAgICAgICAgIGludCBmb28oKSB0aHJvdyhFMSk7CgogICAgICAgICAgICBzd2lnIGdlbmVyYXRlcyB0aGUgcHJvcGVyIHRyeS9jYXRjaCBjb2RlIHRvIGRpc3BhdGNoIEUxLgoJICAgIAoJICAgIEJ1dCBpZiB5b3UgaGF2ZToKCgoJICAgICAgICAgIGludCBiYXJmb28oaW50IGkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAxKSB7CgkgICAgICAgICAgICAgICB0aHJvdyBFMSgpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICAgIHRocm93IEUyKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBpZSwgd2hlcmUgdGhlcmUgaXMgbm8gZXhwbGljaXQgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gaW4gdGhlIGRlY2wsIHlvdSAKCSAgICBlbmQgdXAgZG9pbmc6CgkJICAKICAgICAgICAgICAgICAgJWV4Y2VwdGlvbiBiYXJmb28gewkJCQoJICAgICAgICAgdHJ5IHsJCQkJCgkgICAgICAgICAgICRhY3Rpb24JCQkKCSAgICAgICAgIH0gY2F0Y2goRTEpIHsJLi4uIH0JCQkJICAKCSAgICAgICAgIH0gY2F0Y2goRTIpIHsJLi4uIH0JCQkJICAKCSAgICAgICB9CQkJCQoJICAgIAoJICAgIHdoaWNoIGlzIHZlcnkgdGVkaW91cy4gV2VsbCwgdGhlICVjYXRjaGVzIGRpcmVjdGl2ZSBkZWZpbmVzCgkgICAgdGhlIGxpc3Qgb2YgZXhjZXB0aW9ucyB0byBjYXRjaCwgYW5kIGZyb20gc3dpZzoKIAkKCSAgICAgICAlY2F0Y2hlcyhFMSxFMikgYmFyZm9vKGludCBpKTsKCSAgICAgICBpbnQgYmFyZm9vKGludCBpKTsKCiAgICAgICAgICAgIGlzIGVxdWl2YWxlbnQgdG8gCgoJICAgICAgIGludCBiYXJmb28oaW50IGkpIHRocm93KEUxLEUyKTsKCgkgICAgTm90ZSwgaG93ZXZlciwgdGhhdCB0aGUgJWNhdGNoZXMgbGlzdCBkb2Vzbid0IGhhdmUgdG8KCSAgICBjb3JyZXNwb25kIHRvIHRoZSBDKysgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24uIEZvciBleGFtcGxlLCBpZiB5b3UKCSAgICBoYXZlOgoKCQlzdHJ1Y3QgRSB7fTsKCQlzdHJ1Y3QgRTEgOiBFIHt9OwoJCXN0cnVjdCBFMiA6IEUge307CgogIAkgICAgICAgIGludCBiYXJmb28oaW50IGkpIHRocm93KEUxLEUyKTsKCiAgICAgICAgICAgIHlvdSBjYW4gZGVmaW5lCgkgICAgICAgIAoJCSVjYXRjaGVzKEUpIGJhcmZvbyhpbnQgaSk7CgkKCSAgICBhbmQgc3dpZyB3aWxsIGdlbmVyYXRlIGFuIGFjdGlvbiBjb2RlIGVxdWl2YWxlbnQgdG8KCgkgICAgICAgICB0cnkgewkJCQkKCSAgICAgICAgICAgJGFjdGlvbgkJCQoJICAgICAgICAgfSBjYXRjaChFICZfZSkgeyAKCQkgICA8cmFpc2UgX2U+OwoJCSB9CQoKICAgICAgICAgICAgT2YgY291cnNlLCB5b3Ugc3RpbGwgaGF2ZSB0byBzYXRpc2Z5IHRoZSBDKysgcmVzdHJpY3Rpb25zLAoJICAgIGFuZCB0aGUgY2F0Y2hlcyBsaXN0IG11c3QgYmUgY29tcGF0aWJsZSAobm90IHRoZSBzYW1lKQoJICAgIGFzIHRoZSBvcmlnaW5hbCBsaXN0IG9mIHR5cGVzIGluIHRoZSBleGNlcHRpb24gc3BlY2lmaWNhdGlvbi4KCgkgICAgQWxzbywgeW91IGNhbiBub3cgc3BlY2lmeSB0aGF0IHlvdSB3YW50IHRvIGNhdGNoIHRoZQoJICAgIHVua25vd24gZXhjZXB0aW9uICcuLi4nLCBmb3IgZXhhbXBsZToKCgkgICAgICAgJWNhdGNoZXMoRTEsRTIsLi4uKSBiYXJmb28oaW50KTsKCgkgICAgSW4gYW55IGNhc2UsIHRoZSAlY2F0Y2hlcyBkaXJlY3RpdmUgd2lsbCBlbWl0IHRoZQoJICAgIGNvZGUgdG8gY29udmVydCBpbnRvIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgZXJyb3IvZXhjZXB0aW9uCiAgICAgICAgICAgIHVzaW5nIHRoZSAndGhyb3dzJyB0eXBlbWFwLgoKCSAgICBGb3IgdGhlICcuLi4nIGNhc2UgdG8gd29yaywgeW91IG5lZWQgdG8KCSAgICB3cml0ZSB0aGUgcHJvcGVyIHR5cGVtYXAgaW4geW91ciB0YXJnZXQgbGFuZ3VhZ2UuIEluIHRoZQoJICAgIFVUTCwgdGhpcyBsb29rcyBsaWtlOgoKCSAgICAgICV0eXBlbWFwKHRocm93cykgKC4uLikgewoJICAgICAgICBTV0lHX2V4Y2VwdGlvbihTV0lHX1J1bnRpbWVFcnJvciwidW5rbm93biBleGNlcHRpb24iKTsKICAgICAgICAgICAgICB9CgowMS8wOS8yMDA2OiBtdXRhbmRpegoJICAgIFtBbGxlZ3JvY2xdCgogICAgICAgICAgICBGaXhlcyBhIG51bWJlciBvZiBTRUdWcyBwcmltYXJpbHkgaW4gdGhlIGhhbmRsaW5nIG9mCiAgICAgICAgICAgIHZhcmlvdXMgYW5vbnltb3VzIHR5cGVzLiBGb3VuZCBpbiBhIHBhc3MgdGhyb3VnaCB0aGUKICAgICAgICAgICAgc3dpZyB0ZXN0LXN1aXRlLiBTdGlsbCBtb3JlIHRvIGRvIGhlcmUsIGJ1dCB0aGlzIGlzIGEKICAgICAgICAgICAgZ29vZCBjaGVja3BvaW50LgoKICAgICAgICAgICAgQWRkcyAtY3dyYXAgYW5kIC1ub2N3cmFwIGFzIGFuIGFsbGVncm9jbCBzcGVjaWZpYwogICAgICAgICAgICBjb21tYW5kLWxpbmUgYXJndW1lbnQuIENvbnRyb2xzIGdlbmVyYXRpbmcgb2YgYSBDCiAgICAgICAgICAgIHdyYXBwZXIgZmlsZSB3aGVuIHdyYXBwaW5nIEMgY29kZS4gQnkgZGVmYXVsdCBvbmx5IGEKICAgICAgICAgICAgbGlzcCBmaWxlIGlzIGNyZWF0ZWQgZm9yIEMgY29kZSB3cmFwcGluZy4KCiAgICAgICAgICAgIERvYyB1cGRhdGVzIGZvciB0aGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cyBhbmQgZml4ZXMgYXMKICAgICAgICAgICAgcG9pbnRlZCBvdXQgb24gc3dpZy1kZXZlbAoKMDEvMDUvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCB1bnNpZ25lZCBsb25nIGxvbmcgYW5kIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAmIHR5cGVtYXBzCiAgICAgICAgICAgIC0gQnVnICMxMzk4Mzk0ICB3aXRoIHBhdGNoIGZyb20gRHJpZXMgRGVjb2NrCgowMS8wNi8yMDA2OiBtbWF0dXMKCSAgICBBZGQgJ25hbWVkJyB3YXJuaW5nIGNvZGVzLCBub3cgaW4gYWRkaXRpb24gdG86CgkgICAgCgkgICAgICAld2FybmZpbHRlcig4MTMpOwoJICAgCgkgICAgeW91IGNhbiB1c2UKCgkgICAgICAld2FybmZpbHRlcihTV0lHV0FSTl9KQVZBX01VTFRJUExFX0lOSEVSSVRBTkNFKTsKCgkgICAganVzdCB1c2UgdGhlIHNhbWUgY29kZSBuYW1lIGZvdW5kIGluICBTb3VyY2UvSW5jbHVkZS9zd2lnd2Fybi5oIAoJICAgIHBsdXMgdGhlICdTV0lHJyBwcmVmaXguCgoJICAgIElmIGEgZGV2ZWxvcGVyIGFkZHMgYSBuZXcgd2FybmluZyBjb2RlLCB0aGUgTGliL3N3aWd3YXJuLnN3ZyBmaWxlCiAgICAgICAgICAgIHdpbGwgYmUgZ2VuZXJhdGVkIHdoZW4gcnVubmluZyB0aGUgdG9wIGxldmVsIG1ha2UuCgowMS8wNS8yMDA2OiBjZmlzYXZhZ2UKICAgICAgICAgICAgW1J1YnldCgkgICAgUmVpbXBsZW1lbnRlZCBvYmplY3QgdHJhY2tpbmcgZm9yIFJ1YnkuICBUaGUgbmV3IGltcGxlbWVudGF0aW9uIHdvcmtzCgkgICAgYnkgZXhwYW5kaW5nIHRoZSBzd2lnX2NsYXNzIHN0cnVjdHVyZSBmb3IgUnVieSBieSBhZGRpbmcgYSB0cmFja09iamVjdHMKCSAgICBmaWVsZC4gIFRoaXMgZmllbGQgY2FuIGJlIHNldC91bnNldCB2aWEgJXRyYWNrb2JqZWN0cyBhcyBleHBsYWluZWQKCSAgICBpbiB0aGUgUnVieSBkb2N1bWVudGF0aW9uLiAgVGhlIG5ldyBpbXBsZW1lbnRhdGlvbiBpcyBtb3JlIHJvYnVzdAoJICAgIGFuZCB0YWtlcyBsZXNzIGNvZGUgdG8gaW1wbGVtZW50LgoJCQowMS8wNS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yICVleHRlbmQgYW5kIHN0YXRpYyBjb25zdCBpbnRlZ3JhbCB0eXBlcywgZWc6CgogICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAlZXh0ZW5kIHsKICAgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50IGJhciA9IDQyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH07IAoKMTIvMzAvMjAwNTogbW1hdHVzCgoJICAtIEFkZCBpbmZvIGZvciBvbGQgYW5kIG5ldyBkZWJ1ZyBvcHRpb25zOgogICAgICAgICAgICAgIAogICAgICAgICAgICAtZHVtcF90b3AgICAgICAgLSBQcmludCBpbmZvcm1hdGlvbiBvZiB0aGUgZW50aXJlIG5vZGUgdHJlZSwgaW5jbHVkaW5nIHN5c3RlbSBub2RlcyAgICAKICAgICAJICAgIC1kdW1wX21vZHVsZSAgICAtIFByaW50IGluZm9ybWF0aW9uIG9mIHRoZSBtb2R1bGUgbm9kZSB0cmVlLCBhdm9pZGluZyBzeXN0ZW0gbm9kZXMgICAgIAogICAgIAkgICAgLWR1bXBfY2xhc3NlcyAgIC0gUHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNsYXNzZXMgZm91bmQgaW4gdGhlIGludGVyZmFjZQkgICAgICAgCiAgICAgCSAgICAtZHVtcF90eXBlZGVmICAgLSBQcmludCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZXMgYW5kIHR5cGVkZWZzIGZvdW5kIGluIHRoZSBpbnRlcmZhY2UKICAgICAJICAgIC1kdW1wX3RhZ3MgICAgICAtIFByaW50IGluZm9ybWF0aW9uIGFib3V0IHRoZSB0YWdzIGZvdW5kIGluIHRoZSBpbnRlcmZhY2UJICAgICAgIAogICAgIAkgICAgLWRlYnVnX3R5cGVtYXAgIC0gUHJpbnQgaW5mb3JtYXRpb24gZm9yIGRlYnVnZ2luZyB0eXBlbWFwcwkJCSAgICAgICAKICAgICAgICAgICAgLWRlYnVnX3RlbXBsYXRlIC0gUHJpbnQgaW5mb3JtYXRpb24gZm9yIGRlYnVnZ2luZyB0ZW1wbGF0ZXMJCQkgICAgICAgIAoKCSAgLSBBZGQgdGhlIGZha2V2ZXJzaW9uLiBJZiB5b3UgaGF2ZSBhIHByb2plY3QgdGhhdCB1c2VzCiAgICAgICAgICAgIGNvbmZpZ3VyZS9zZXR1cC5weSwgb3IgYW5vdGhlciBhdXRvbWF0aWMgYnVpbGRpbmcgc3lzdGVtCiAgICAgICAgICAgIGFuZCByZXF1aXJlcyBhIHNwZWNpZmljIHN3aWcgdmVyc2lvbiwgbGV0IHNheSAxLjMuMjIgCgkgICAgeW91IGNhbiB1c2U6CgoJICAgICAgIFNXSUdfRkVBVFVSRVM9Ii1mYWtldmVyc2lvbiAxLjMuMjIiCgoJICAgICBvcgogCiAgICAgICAgICAgICAgIHN3aWcgLWZha2V2ZXJzaW9uIDEuMy4yMgoKICAgICAgICAgICAgIGFuZCB0aGVuIHN3aWcgLXZlcnNpb24gd2lsbCByZXBvcnQgMS4zLjIyIGluc3RlYWQgb2YgdGhlCiAgICAgICAgICAgICBjdXJyZW50IHZlcnNpb24uCgoJICAgICBUeXBpY2FsIHVzZSB3b3VsZCBiZQoKCSAgICAgICBTV0lHX0ZFQVRVUkVTPSItZmFrZXZlcnNpb24gMS4zLjIyIiAuL2NvbmZpZ3VyZSAJICAgICAKCjEyLzMwLzIwMDU6IG1tYXR1cwoKCSAgLSBBZGQgb3B0aW9uL2Zvcm1hdCBzdXBwb3J0IHRvICVyZW5hbWUgYW5kICVuYW1ld2Fybi4JCgkgICAgTm93ICVuYW1ld2FybiBjYW4gZm9yY2UgcmVuYW1pbmcsIGZvciBleGFtcGxlOgoKCSAgICAgICVuYW1ld2FybigiMzE0OiBpbXBvcnQgaXMgYSBrZXl3b3JkIixyZW5hbWU9Il8lcyIpICJpbXBvcnQiOwoJICAgIAoJICAgIGFuZCByZW5hbWUgY2FuIGFsc28gc3VwcG9ydCBmb3JtYXQgZm9ybXM6CgoJICAgICAgICVyZW5hbWUoInN3aWdfJXMiKSBpbXBvcnQ7CgoJICAgIE5vdywgc2luY2UgdGhlIGZvcm1hdCBpcyBwcm9jZXNzZWQgdmlhIHN3aWcgUHJpbnRmLCB5b3UKCSAgICBjYW4gdXNlIGVuY29kZXJzIGFzIGZvbGxvd3M6CgoJICAgICAgICVyZW5hbWUoIiUodGl0bGUpcyIpICBpbXBvcnQ7ICAgICAtPiBJbXBvcnQKCSAgICAgICAlcmVuYW1lKCIlKHVwcGVyKXMiKSAgaW1wb3J0OyAgICAgLT4gSU1QT1JUCgkgICAgICAgJXJlbmFtZSgiJShsb3dlcilzIikgIEltcG9ydDsgICAgIC0+IGltcG9ydAoJICAgICAgICVyZW5hbWUoIiUoY3RpdGxlKXMiKSBjYW1lbF9jYXNlOyAtPiBDYW1lbENhc2UKCSAgICAgICAKCSAgICBUaGlzIHdpbGwgYWxsb3cgdXMgdG8gYWRkIG1vcmUgZW5jb2RlcnMsIGFzIHRoZSAKCSAgICBleHBlY3RlZCBvbmUgZm9yIHJlZ3VsYXIgZXhwcmVzc2lvbnMuIAoKCSAgLSBBZGQgdGhlIGFib3ZlICdjdGl0bGUnIGVuY29kZXIsIHdoaWNoIGRvZXMgdGhlIGNhbWVsIGNhc2U6CgoJICAgICAgICBjYW1lbF9jYXNlIC0+IENhbWVsQ2FzZQogIAoJICAtIEFsc28sIHdoaWxlIHdlIGdldCB0aGUgcmVnZXhwIHN1cHBvcnQsIGFkZCB0aGUgJ2NvbW1hbmQnIGVuY29kZXIsCiAgICAgICAgICAgIHlvdSBjYW4gdXNlIGl0IGFzIGZvbGxvd3MKCiAgICAgICAgICAgICAgICVyZW5hbWUoIiUoY29tbWFuZDpzZWQgLWUgJ3MvXChbYS16XVwpL1xVXFwxLycgPDw8IClzIikgaW1wb3J0OyAKCgkgICAgdGhlbiBzd2lnIHdpbGwgcG9wZW4gdGhlIGNvbW1hbmQKCSAgICAKCQkic2VkIC1lICdzL1woW2Etel1cKS9cVVxcMS8nIDw8PCBpbXBvcnQiCgkJCiAgICAgICAgICAgIHNlZSBiZWxvdyBmb3IgYW5vbnltb3VzIHJlbmFtZXMgZm9yIGJldHRlciBleGFtcGxlcy4JCQoKICAgICAgICAgIC0gVGhlIHJlbmFtZSBkaXJlY3RpdmUgbm93IGFsc28gYWxsb3dzOgoKCSAgICAtIHNpbXBsZSBtYXRjaDogb25seSBhcHBseSB0aGUgcmVuYW1lIGlmIGEgdHlwZSBtYXRjaAoJICAgICAgaGFwcGVuLCBmb3IgZXhhbXBsZQoKCQkgJXJlbmFtZSglKHRpdGxlKXMsbWF0Y2g9ImVudW1pdGVtIikgaGVsbG87CgoJCSBlbnVtIEhlbGxvIHsKCQkgICBoaSwgaGVsbG8gIC0+ICBoaSwgSGVsbG8gIAoJCSB9OwoJCSBpbnQgaGVsbG8oKSAgLT4gIGhlbGxvOyAKCgkgICAgLSBleHRlbmRlZCBtYXRjaDogb25seSBhcHBseSB0aGUgcmVuYW1lIGlmIHRoZSAnZXh0ZW5kZWQgYXR0cmlidXRlJyBtYXRjaAoJICAgICAgb2NjdXJyZWQsIGZvciBleGFtcGxlOiAKCgkgICAgICAgICAvLyBzYW1lIGFzIHNpbXBsZSBtYXRjaCAJCQoJCSAlcmVuYW1lKCUodGl0bGUpcyxtYXRjaCRub2RlVHlwZT0iZW51bWl0ZW0iKSBoZWxsbzsgCgoJCSBlbnVtIEhlbGxvIHsKCQkgICBoaSwgaGVsbG8gIC0+ICBoaSwgSGVsbG8gIAoJCSB9OwoKCSAgICAgICBOb3RlIHRoYXQgdGhlIHN5bWJvbCAnJCcgaXMgdXNlZCB0byBkZWZpbmUgdGhlIGF0dHJpYnV0ZSBuYW1lIGluCgkgICAgICAgYSAncmVjdXJzaXZlJyB3YXksIGZvciBleGFtcGxlOgoKCQkgLy8gbWF0Y2ggb25seSBoZWxsbyBpbiAnZW51bSBIZWxsbycKCQkgJXJlbmFtZSglKHRpdGxlKXMsbWF0Y2gkcGFyZW50Tm9kZSR0eXBlPSJlbnVtIEhlbGxvIikgaGVsbG87IAoKCQkgZW51bSBIZWxsbyB7CiAJCSAgIGhpLCBoZWxsbyAgLT4gIGhpLCBIZWxsbyAgIC8vIG1hdGNoCgkJIH07CgoJCSBlbnVtIEhpIHsKIAkJICAgaGksIGhlbGxvICAtPiAgaGksIGhlbGxvICAgLy8gbm8gbWF0Y2gKCQkgfTsKCiAgICAgICAgICAgICAgIGhlcmUsIGZvciBIZWxsbzo6aGksIHRoZSAicGFyZW50Tm9kZSIgaXMgIkhlbGxvIiwgYW5kIGl0cyAidHlwZSIKICAgICAgICAgICAgICAgaXMgImVudW0gSGVsbG8iLgoJICAgICAgIAoJICAgICAgIAogICAgICAgICAgICAtIEFub255bW91cyByZW5hbWVzOiB5b3UgY2FuIHVzZSAnYW5vbnltb3VzJyByZW5hbWUgZGlyZWN0aXZlcywgZm9yIGV4YW1wbGU6IAoKCSAgICAgICAgIC8vIHJlbmFtZSBhbGwgdGhlIGVudW0gaXRlbXMgaW4gSGVsbG8KCQkgJXJlbmFtZSglKHRpdGxlKXMsbWF0Y2gkcGFyZW50Tm9kZSR0eXBlPSJlbnVtIEhlbGxvIikgIiI7IAoKCQkgZW51bSBIZWxsbyB7CiAJCSAgIGhpLCBoZWxsbyAgLT4gIEhpLCBIZWxsbyAgIC8vIG1hdGNoIGJvdGgKCQkgfTsKCgkJIGVudW0gSGkgewogCQkgICBoaSwgaGVsbG8gIC0+ICBoaSwgaGVsbG8gICAvLyBubyBtYXRjaAoJCSB9OwoJCSAKCSAgICAgICAgIC8vIHJlbmFtZSBhbGwgdGhlIGVudW0gaXRlbXMgCgkJICVyZW5hbWUoJSh0aXRsZSlzLG1hdGNoJG5vZGVUeXBlPSJlbnVtaXRlbSIpICIiOyAKCgkgICAgICAgICAvLyByZW5hbWUgYWxsIHRoZSBpdGVtcyBpbiBnaXZlbiBjb21tYW5kIChzbG9vb293LCBidXQuLi4pCgkJICVyZW5hbWUoJShjb21tYW5kOjxteSBleHRlcm5hbCBjbWQ+KXMpICIiOyAKCgkKCSAgICAgIEFub255bW91cyByZW5hbWVzIHdpdGggY29tbWFuZHMgY2FuIGJlIHZlcnkgcG93ZXJmdWwsIHNpbmNlIHlvdQoJICAgICAgY2FuICdvdXRzb3VyY2UnIGFsbCB0aGUgcmVuYW1pbmcgbWVjaGFuaXNtIChvciBwYXJ0IG9mIGl0KSB0byBhbgoJICAgICAgZXh0ZXJuYWwgcHJvZ3JhbToKCSAgICAgIAoJICAgICAgICAvLyBVcHBlcmNhc2UgYWxsIChhbmQgb25seSkgdGhlIG5hbWVzIHRoYXQgc3RhcnQgd2l0aCAnaScKCSAgICAgICAgJXJlbmFtZSgiJShjb21tYW5kOmF3ayAnL15pL3twcmludCB0b3VwcGVyKCQxKX0nIDw8PClzIikgIiI7ICAgCgkgICAgICAgCgkgICAgICAgIGludCBpbXBvcnRlZCgpIC0+IElNUE9SVEVEOwoJICAgICAgICBpbnQgaGVsbG8oKSAgICAtPiBoZWxsbwoKCSAgICAgIE5vdGUgdGhhdCBpZiB0aGUgJ2NvbW1hbmQnIGVuY29kZXIgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcsIHN3aWcKCSAgICAgIHVuZGVyc3RhbmRzIHRoYXQgbm8gcmVuYW1lIGlzIG5lY2Vzc2FyeS4KCgkgICAgICBBbHNvIG5vdGUgdGhhdCAlcmVuYW1lICdwYXNzZXMnIHRoZSBtYXRjaGVkIG5hbWUuIEZvciBleGFtcGxlLCBpbgoJICAgICAgdGhpcyBjYXNlCgoJICAgICAgICBuYW1lc3BhY2UgbnMxIHsKCQkgIGludCBmb28oKTsKCQl9CgoJICAgICAgICBuYW1lc3BhY2UgbnMyIHsKCQkgIGludCBiYXIoKTsKCQl9CgoJICAgICAgdGhlIGV4dGVybmFsIHByb2dyYW0gb25seSByZWNlaXZlcyAiZm9vIiBhbmQgImJhciIuIElmIG5lZWRlZCwKCSAgICAgIGhvd2V2ZXIsIHlvdSBjYW4gcmVxdWVzdCB0aGUgJ2Z1bGxuYW1lJyAKCSAgICAgICAJCgkgICAgICAgICVyZW5hbWUoIiUoY29tbWFuZDphd2sgJ2F3ayAnL25zMTo6L3tsPXNwbGl0KCQxLGEsIjo6Iik7IHByaW50IHRvdXBwZXIoYVtsXSl9JycgPDw8KXMiLGZ1bGxuYW1lPTEpICIiOyAgIAogICAgICAgICAgICAgICAgCgkJbnMxOjpmb28gLT4gRk9PCgkJbnMyOjpiYXIgLT4gYmFyCQoJCgkgICAgLSBNaXhpbmcgZW5jb2RlcnMgYW5kIG1hdGNoaW5nOiBvZiBjb3Vyc2UsIHlvdSBjYW4gZG8gbWl4IGNvbW1hbmRzCgkgICAgICBhbmQgbWF0Y2ggZmllbGRzLCBmb3IgZXhhbXBsZToKCgkgICAgICAgICVyZW5hbWUoIiUoPG15IGVuY29kZXIgZm9yIGZuY3M+KSIsbWF0Y2g9ImNkZWNsIikgIiI7CgkgICAgICAgICVyZW5hbWUoIiUoPG15IGVuY29kZXIgZm9yIGVudW1zPikiLG1hdGNoPSJlbnVtaXRlbSIpICIiOwoJICAgICAgICAlcmVuYW1lKCIlKDxteSBlbmNvZGVyIGZvciBlbnVtcyBpbnNpZGUgYSBjbGFzcz4pIixtYXRjaD0iZW51bWl0ZW0iLAoJCSAgICAgICAgbWF0Y2gkcGFyZW50Tm9kZSRwYXJlbnROb2RlJG5vZGVUeXBlPSJjbGFzcyIpICIiOwoJCQoJICAgICAgVXNlICJzd2lnIC1kdW1wX3BhcnNlX21vZHVsZSIgdG8gc2VlIHRoZSBhdHRyaWJ1dGUgbmFtZXMgeW91IGNhbiB1c2UgdG8KCSAgICAgIG1hdGNoIGEgc3BlY2lmaWMgY2FzZS4KCQogICAgICAgICAgICAtICdzb3VyY2VmbXQnIGFuZCAndGFyZ2V0Zm10Jzogc29tZXRpbWVzIHlvdSBuZWVkIHRvCiAgICAgICAgICAgICAgcHJvY2VzcyB0aGUgJ3NvdXJjZScgbmFtZSBiZWZvcmUgY29tcGFyaW5nLCBmb3IgZXhhbXBsZQoKCSAgICAgICAgJW5hbWV3YXJuKCIzMTQ6IGVtcHR5IGlzIGEga2V5d29yZCIsc291cmNlZm10PSIlKGxvd2VyKXMiKSAiZW1wdHkiOwoKCSAgICAgIHRoZW4gaWYgeW91IGhhdmUKCgkgICAgICAgIGludCBFbXB0eSgpOyAgLy8gIkVtcHR5IiBpcyB0aGUgc291cmNlIAoJCQoJICAgICAgeW91IHdpbGwgZ2V0IHRoZSBrZXl3b3JkIHdhcm5pbmcgc2luY2UgJ0VtcHR5JyB3aWxsIGJlCgkgICAgICBsb3dlciBjYXNlZCwgdmlhIHRoZSBzb3VyY2VmbXQ9IiUobG93ZXIpcyIgb3B0aW9uLAoJICAgICAgYmVmb3JlIGJlZW4gY29tcGFyZWQgdG8gdGhlICd0YXJnZXQnICJlbXB0eSIuCgoJICAgICAgVGhlcmUgaXMgYW4gYWRkaXRpb25hbCAndGFyZ2V0Zm10JyBvcHRpb24gdG8gcHJvY2VzcyB0aGUKCSAgICAgICd0YXJnZXQnIGJlZm9yZSBjb21wYXJpbmcuCgoJICAgIC0gY29tcGxlbWVudGluZyAnbWF0Y2gnOiB5b3UgY2FuIHVzZSAnbm90bWF0Y2gnLCBmb3IgZXhhbXBsZQoJICAgICAgCgkgICAgICAgICVuYW1ld2FybigiMzE0OiBlbXB0eSBpcyBhIGtleXdvcmQiLHNvdXJjZWZtdD0iJShsb3dlcilzIixub3RtYXRjaD0ibmFtZXNwYWNlIikgImVtcHR5IjsKCgkgICAgICBoZXJlLCB0aGUgbmFtZSB3YXJuaW5nIHdpbGwgYmUgYXBwbGllZCB0byBhbGwgdGhlIHN5bWJvbHMgZXhjZXB0IG5hbWVzcGFjZXMuCgkgICAgCiAgICAgIAkKMTIvMzAvMjAwNTogbW1hdHVzCgoJICAtIEFkZCBpbml0aWFsIHN1cHBvcnQgZm9yIGdjaiBhbmQgSmF2YSAtPiA8dGFyZ2V0IGxhbmd1YWdlPiBtZWNoYW5pc20uCgoJICAgIFNlZQlleGFtcGxlcyBpbjogIAoJICAKCQlFeGFtcGxlcy9weXRob24vamF2YQoJCUV4YW1wbGVzL3J1YnkvamF2YQoJCUV4YW1wbGVzL3RjbC9qYXZhCgogICAgICAgICAgICB0byBzZWUgaG93IHRvIHVzZSBnY2orc3dpZyB0byBleHBvcnQgamF2YSBjbGFzc2VzIGludG8KICAgICAgICAgICAgcHl0aG9uL3J1YnkvdGNsLgoJICAgIAoJICAgIFRoZSBpZGVhIGlzIHRvIHB1dCBhbGwgdGhlIGNvbW1vbiBjb2RlIGZvciBnY2ogaW5zaWRlCgoJICAgICAgICAgIExpYi9nY2oKCiAgICAgICAgICAgIGFuZCBsb2NhbGl6ZSBzcGVjaWZpYyB0eXBlcyBzdWNoIGFzIGpzdHJpbmcsIGFzIGNhbiBiZSBmb3VuZAogICAgICAgICAgICBpbgoKCSAgICAgICAgIExpYi9weXRob24vanN0cmluZy5pCgkgICAgICAgICBMaWIvcnVieS9qc3RyaW5nLmkKCSAgICAgICAgIExpYi90Y2wvanN0cmluZy5pCgogICAgICAgICAgICBVc2luZyB0aGUgVVRMLCB0aGlzIGlzIHZlcnkgZWFzeSwgYW5kIHRoZSBwZXJsIHZlcnNpb24gZm9yCiAgICAgICAgICAgIGpzdHJpbmcuaSB3aWxsIGJlIG5leHQuCgkJIAkgICAgCgoxMi8yOS8yMDA1OiBtbWF0dXMKCSAgLSBBZGQgdGhlIGNvcHljdG9yIGZlYXR1cmUvZGlyZWN0aXZlL29wdGlvbiB0byBlbmFibGUgdGhlIGF1dG9tYXRpYwoJICAgIGdlbmVyYXRpb24gb2YgY29weSBjb25zdHJ1Y3RvcnMuIFVzZSBhcyBpbjoKCgkgICAgICAlY29weWN0b3IgQTsKCgkgICAgICBzdHJ1Y3QgQSB7CgogICAgICAgICAgICAgIH07CgoJICAgIHRoZW4gdGhpcyB3aWxsIHdvcmsKCgkgICAgICBhMSA9IEEoKTsKCSAgICAgIGEyID0gQShhMSk7CgoJICAgIEFsc28sIHNpbmNlIGl0IGlzIGEgZmVhdHVyZSwgaWYgeW91IGp1c3QgdHlwZQoKCSAgICAgICVjb3B5Y3RvcjsKCgkgICAgdGhhdCB3aWxsICBlbmFibGUgdGhlIGF1dG9tYXRpYyBnZW5lcmF0aW9uIGZvciBhbGwgdGhlCgkgICAgY2xhc3Nlcy4gSXQgaXMgYWxzbyBlcXVpdmFsZW50IHRvCgoJICAgICAgIHN3aWcgLWNvcHljdG9yIC1jKysgLi4uCgoJICAgIE5vdGVzOiAKCgkgICAgMS4tIFRoZSBmZWF0dXJlIG9ubHkgd29ya3MgaW4gQysrIG1vZGUuCgoJICAgIDIuLSBUaGUgYXV0b21hdGljIGNyZWF0aW9uIG9mIHRoZSBjb3B5IGNvbnN0cnVjdG9yIHdpbGwKCSAgICAgICAgdXN1YWxseSBwcm9kdWNlIG92ZXJsb2FkaW5nLiBIZW5jZSwgaWYgdGhlIHRhcmdldAoJICAgICAgICBsYW5ndWFnZSBkb2Vzbid0IHN1cHBvcnQgb3ZlcmxvYWRpbmcsIGEgc3BlY2lhbCBuYW1lCgkgICAgICAgIHdpbGwgYmUgdXNlZCAoQV9jb3B5KS4KCSAgICAKCSAgICAzLi0gRm9yIHRoZSBvdmVybG9hZGluZyByZWFzb25zIGFib3ZlLCBpdCBpcyBwcm9iYWJseSBub3QKICAgICAgICAgICAgICAgIGEgZ29vZCBpZGVhIHRvIHVzZSB0aGUgZmxhZyB3aGVuLCBmb3IgZXhhbXBsZSwgeW91IGFyZQoJCXVzaW5nIGtleXdvcmRzIGluIFB5dGhvbi4KCiAgICAgICAgICAgIDQuLSBUaGUgY29weWN0b3IgYXV0b21hdGljIG1lY2hhbmlzbSBmb2xsb3dzIG1vcmUgb3IgbGVzcwoJICAgICAgICB0aGUgc2FtZSBydWxlcyBhcyB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBtZWNoYW5pc20sCgkgICAgICAgIGkuZS4sIGEgY29weSBjb25zdHJ1Y3RvciB3aWxsIG5vdCBiZSBhZGRlZCBpZiB0aGUKCSAgICAgICAgY2xhc3MgaXMgYWJzdHJhY3Qgb3IgaWYgdGhlcmUgaXMgYSBwZXJ0aW5lbnQgbm9uLXB1YmxpYyAKCQljb3B5IGN0b3IgaW4gdGhlIGNsYXNzIG9yIGl0cyBoaWVyYXJjaHkuCgoJCUhlbmNlLCBpdCBtaWdodCBiZSBuZWNlc3NhcnkgZm9yIHlvdSB0byBjb21wbGV0ZSB0aGUKCQljbGFzcyBkZWNsYXJhdGlvbiB3aXRoIHRoZSBwcm9wZXIgbm9uLXB1YmxpYyBjb3B5IGN0b3IKCQl0byBhdm9pZCBhIHdyb25nIGNvbnN0cnVjdG9yIGFkZGl0aW9uLgoJCQogICAgICAgICAgLSBGaXggZmVhdHVyZXMvcmVuYW1lIGZvciB0ZW1wbGF0ZXMgY3Rvci9kdG9yIGFuZCBvdGhlcgogICAgICAgICAgICB0aGluZ3MgYXJvdW5kIHdoaWxlIGFkZGluZyB0aGUgY29weWN0b3IgbWVjaGFuaXNtLgoJICAgIAoKMTIvMjcvMjAwNTogbW1hdHVzCgkgIC0gQWRkIHRoZSAnbWF0Y2gnIG9wdGlvbiB0byB0eXBlbWFwcy4gQXNzdW1lIHlvdSBoYXZlOgoKCSAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRSAqIChpbnQgcmVzKSB7Li59CgkgICAgICAldHlwZW1hcChmcmVlYXJnKSBTV0lHVFlQRSAqIHsgaWYgKHJlcyRhcmdudW0pIC4uLn0KCgkgICAgdGhlbiBpZiB5b3UgZG8KIAoJICAgICAgJXR5cGVtYXAoaW4pIEEgKiB7Li4ufQoKCSAgICBzd2lnIHdpbGwgJ292ZXJsb2FkIHRoZSAnaW4nIHR5cGVtYXAsIGJ1dCB0aGUgJ2ZyZWVhcmcnIAoJICAgIHR5cGVtYXAgd2lsbCBiZSBhbHNvIGFwcGxpZWQsIGV2ZW4gd2hlbiB0aGlzIGlzIHdyb25nLiBUaGUgb2xkCgkgICAgc29sdXRpb25zIGlzIHRvIHdyaXRlOgoKCSAgICAgICV0eXBlbWFwKGluKSBBICogey4uLn0KICAJICAgICAgJXR5cGVtYXAoZnJlZWFnKSBBICogIiIKCgkgICAgb3ZlcmxvYWQgJ2ZyZWVhcmcnIHdpdGggYW4gZW1wdHkgZGVmaW5pdGlvbi4KCgkgICAgVGhlIHByb2JsZW0gaXMsIGhvd2V2ZXIsIHRoZXJlIGlzIG5vIHdheSB0byBrbm93IHlvdSBuZWVkCgkgICAgdG8gZG8gdGhhdCB1bnRpbCB5b3Ugc3RhcnQgZ2V0dGluZyBicm9rZW4gQysrIGNvZGUsIG9yCgkgICAgd29yc2UsIGJyb2tlbiBydW50aW1lIGNvZGUuCgoJICAgIFRoZSBzYW1lIGFwcGxpZXMgdG8gdGhlIGluZmFtb3VzICd0eXBlY2hlY2snIHR5cGVtYXAsCgkgICAgd2hpY2ggYWx3YXlzIGNvbmZ1c2VzIHBlb3BsZSwgc2luY2UgdGhlIGZpcnN0IHRoaW5nIHlvdSBkbwoJICAgIGlzIHRvIGp1c3Qgd3JpdGUgdGhlICdpbicgdHlwZW1hcC4KCgkgICAgVGhlICdtYXRjaCcgb3B0aW9uIHNvbHZlcyB0aGUgcHJvYmxlbSwgYW5kIGlmIGluc3RlYWQgeW91IHdyaXRlOgoKCSAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRSAqIChpbnQgcmVzKSB7Li59CgkgICAgICAldHlwZW1hcChmcmVlYXJnLG1hdGNoPSJpbiIpIFNXSUdUWVBFICogeyBpZiAocmVzJGFyZ251bSkgLi4ufQoJICAgICAgJXR5cGVtYXAodHlwZWNoZWNrLG1hdGNoPSJpbiIscHJlY2VkZW5jZS4uLikgU1dJR1RZUEUgKiB7Li4ufQoJICAgIAoJICAgIGl0IHdpbGwgdGVsbCBzd2lnIHRvIGFwcGx5IHRoZSAnZnJlZWFyZy90eXBlY2hlY2snCgkgICAgdHlwZW1hcHMgb25seSBpZiB0aGV5ICdtYXRjaCcgdGhlIHR5cGUgb2YgdGhlICdpbicKCSAgICB0eXBlbWFwLiBUaGUgc2FtZSBjYW4gYmUgZG9uZSB3aXRoIG90aGVyIHR5cGVtYXBzIGFzOgoKCSAgICAgICV0eXBlbWFwKGRpcmVjdG9yb3V0KSBTV0lHVFlQRSAqIHsuLi59CgkgICAgICAldHlwZW1hcChkaXJlY3RvcmZyZWUsbWF0Y2g9ImRpcmVjdG9yb3V0IikgU1dJR1RZUEUgKiB7Li4ufQoJICAgIAoKMTIvMjcvMjAwNTogbW1hdHVzCgkgIC0gQWRkIHRoZSAnbmF0dXJhbHZhcicgb3B0aW9uL21vZGUvZmVhdHVyZSB0byB0cmVhdCBtZW1iZXIKCSAgICB2YXJpYWJsZXMgaW4gYSBtb3JlIG5hdHVyYWwgd2F5LCBpZSwgc2ltaWxhciB0byB0aGUgZ2xvYmFsCgkgICAgdmFyaWFibGUgYmVoYXZpb3IuCgoJICAgIFlvdSBjYW4gdXNlIGl0IGluIGEgZ2xvYmFsIHdheSB2aWEgdGhlIGNvbW1hbmQgbGluZQoKCSAgICAgIHN3aWcgLW5hdHVyYWx2YXIgLi4uCgoJICAgIG9yIHRoZSBtb2R1bGUgbW9kZSBvcHRpb24KIAoJICAgICAgJW1vZHVsZShuYXR1cmFsdmFyPTEpCgoJICAgIGJvdGggZm9ybXMgbWFrZSBzd2lnIHRyZWF0IGFsbCB0aGUgbWVtYmVyIHZhcmlhYmxlcyBpbiB0aGUKCSAgICBzYW1lIHdheSBpdCB0cmVhdHMgZ2xvYmFsIHZhcmlhYmxlcy4gCgoJICAgIEFsc28sIHlvdSBjYW4gdXNlIGl0IGluIGEgY2FzZSBieSBjYXNlIGFwcHJvYWNoIGZvcgoJICAgIHNwZWNpZmljIG1lbWJlciB2YXJpYWJsZXMgdXNpbmcgdGhlIGRpcmVjdGl2ZSBmb3JtOgoKCSAgICAgICVuYXR1cmFsdmFyIEJhcjo6czsKCSAgICAKCSAgICBUaGVuLCBpbiB0aGUgZm9sbG93aW5nIGNhc2UgZm9yIGV4YW1wbGU6CgoJICAgICAgIHN0ZDo6c3RyaW5nIHM7CgkgICAgICAgc3RydWN0IEJhciB7CgkJIHN0ZDo6c3RyaW5nIHM7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICB5b3UgY2FuIGRvOiAgCgoJICAgICAgIGIgPSBCYXIoKQoJICAgICAgIGIucyA9ImhlbGxvIgoJICAgICAgIGN2YXIucyA9ICJoZWxsbyIKCSAgICAgICAKCSAgICAgICBpZiAoYi5zICE9IGN2YXIucyk6CgkgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yCgoJCSAgCiAgICAgICAgICAgIFRoaXMgaXMgdmFsaWQgZm9yIGFsbCB0aGUgbGFuZ3VhZ2VzLCBhbmQgdGhlCiAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIGZvcmNpbmcgdGhlIHVzZSBvZiB0aGUgCiAgICAgICAgICAgIGNvbnN0IFNXSUdUWVBFJiAoQysrKS9TV0lHVFlQRSAoQykgdHlwZW1hcHMgZm9yIHRoZQogICAgICAgICAgICBnZXQvc2V0IG1ldGhvZHMgaW5zdGVhZCBvZiB0aGUgU1dJR1RZUEUgKiB0eXBlbWFwcy4KCSAgICBIZW5jZSwgZm9yICduYXR1cmFsdmFyJyB0byB3b3JrLCBlYWNoIHRhcmdldCBsYW5ndWFnZQoJICAgIG11c3QgaW1wbGVtZW50ICd0eXBlbWFwKGluL291dCkgY29uc3QgVHlwZSYnIHByb3Blcmx5LgoKCSAgICBUaGUgJ25hdHVyYWx2YXInIG9wdGlvbiByZXBsYWNlcyBvciBtYWtlcyB3b3JrYXJvdW5kcyBzdWNoICBhczoKCSAgICAKCQklYXBwbHkgY29uc3Qgc3RkOjpzdHJpbmcgJiB7IHN0ZDo6c3RyaW5nICp9CgogICAgICAgICAgICB1bm5lY2Vzc2FyeS4KCgkgICAgTm90ZTE6IElmIHlvdXIgaW50ZXJmYWNlIGhhcyBvdGhlciBraW5kcyBvZiB3b3JrYXJvdW5kcyB0bwoJICAgIGRlYWwgd2l0aCB0aGUgb2xkICd1bm5hdHVyYWwnIHdheSB0byBkZWFsIHdpdGggbWVtYmVyCgkgICAgdmFyaWFibGVzIChyZXR1cm5pbmcvZXhwZWN0aW5nIHBvaW50ZXJzKSwgdGhlCgkgICAgJ25hdHVyYWx2YXInIG9wdGlvbiBjb3VsZCBicmVhayB0aGVtLgoJICAgIAoJICAgIE5vdGUyOiB0aGUgb3B0aW9uIGhhcyBubyBlZmZlY3Qgb24gdW5uYW1lZCB0eXBlcywgc3VjaAoJICAgIGFzIHVubmFtZWQgbmVzdGVkIHVuaW9ucy4KCSAgICAKCSAgCjEyLzI3LzIwMDU6IG1tYXR1cwoJICAtIEFkZCBtb3JlICdleHByZXNzaXZlJyByZXN1bHQgc3RhdGVzIGZvciB0aGUgdHlwZW1hcAogICAgICAgICAgICBsaWJyYXJpZXMuCgoJICAgIEluIHRoZSBwYXN0LCBmb3Igc2NyaXB0aW5nIGxhbmd1YWdlcywgeW91IHdvdWxkIGRvIGNoZWNraW5nIHNvbWV0aGluZyBsaWtlOgoKCSAgICAgIGlmIChDb252ZXJ0UHRyKG9iaiwmdnB0cix0eSxmbGFncykgIT0gLTEpIHsKCSAgICAgICAgLy8gc3VjY2VzcwogICAgICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgIC8vIGVycm9yCgkgICAgICB9CgoJICAgIE5vdyB0aGUgcmVzdWx0IHN0YXRlIGNhbiBjYXJyeSBtb3JlIGluZm9ybWF0aW9uLAoJICAgIGluY2x1ZGluZzoKCgkgICAgICAtIEVycm9yIHN0YXRlOiBsaWtlIHRoZSBvbGQgLTEvMCwgYnV0IHdpdGggZXJyb3IgY29kZXMgZnJvbSBzd2lnZXJyb3JzLnN3Zy4KCgkgICAgICAgICBpbnQgcmVzID0gQ29udmVydFB0cihvYmosJnZwdHIsdHksZmxhZ3MpOwoJCSBpZiAoU1dJR19Jc09LKHJlcykpIHsKCQkgICAvLyBzdWNjZXNzIGNvZGUKICAgICAgICAgICAgICAgICB9IGVsc2UgewoJCSAgIFNXSUdfRXJyb3IocmVzKTsgLy8gcmVzIGNhcnJpZXMgdGhlIGVycm9yIGNvZGUKICAgICAgICAgICAgICAgICB9CgoJICAgICAgLSBDYXN0IHJhbms6IHdoZW4gcmV0dXJuaW5nIGEgc2ltcGxlIHN1Y2Nlc3NmdWwKICAgICAgICAgICAgICAgIGNvbnZlcnNpb24sIHlvdSBqdXN0IHJldHVybiBTV0lHX09LLCBidXQgaWYgeW91IG5lZWQKICAgICAgICAgICAgICAgIHRvIGRvIGEgJ2Nhc3QnLCB5b3UgY2FuIGFkZCB0aGUgY2FzdGluZyByYW5rLCBpZToKCQkKCQkgIGlmIChQeUZsb2F0X0NoZWNrKG9iaikpIHsKCQkgICAgdmFsdWUgPSBQeUZsb2F0X0FzRG91YmxlKG9iaik7CgkJICAgIHJldHVybiBTV0lHX09LOwoJCSAgfSBlbHNlIGlmIChQeUludF9DaGVjayhvYmopKSB7CgkJICAgIHZhbHVlID0gKGRvdWJsZSkgUHlJbnRfQXNMb25nKG9iaik7CgkJICAgIHJldHVybiBTV0lHX0FkZENhc3QoU1dJR19PSyk7CQkgICAgCiAgICAgICAgICAgICAgICAgIH0KCQkKCQlsYXRlciwgdGhlIGNhc3RpbmcgcmFuayBpcyB1c2VkIHRvIHByb3Blcmx5IGRpc3BhdGNoCgkJdGhlIG92ZXJsb2FkZWQgZnVuY3Rpb24sIGZvciBleGFtcGxlLiBUaGlzIG9mIGNvdXJzZQoJCXJlcXVpcmVzIHlvdXIgbGFuZ3VhZ2UgdG8gc3VwcG9ydCBhbmQgdXNlIHRoZSBuZXcKCQlkaXNwYXRjaCBjYXN0L3JhbmsgbWVjaGFuaXNtIChOb3cgbWFpbmx5IHN1cHBvcnRlZCBpbgoJCXBlcmwgYW5kIHB5dGhvbiwgYW5kIGVhc2lseSBleHBhbmRhYmxlIHRvIHJ1YnkgYW5kIHRjbCkuCgkgICAgICAKCSAgLSBbVVRMXSBBZGQgc3VwcG9ydCBmb3IgdGhlIG5ldyAnZXhwcmVzc2l2ZScgcmVzdWx0IHN0YXRlcy4KCjEyLzI3LzIwMDU6IG1tYXR1cwoJICAtIEFkZCBzdXBwb3J0IGZvciB0aGUgQysrIGltcGxpY2l0IGNvbnZlcnNpb24gbWVjaGFuaXNtLCB3aGljaAogICAgICAgICAgICByZXF1aXJlZCBzb21lIG1vZGlmaWNhdGlvbnMgaW4gcGFyc2VyLnkgKHRvIHJlY29nbml6ZQogICAgICAgICAgICAnZXhwbGljaXQnKSBhbmQgb3ZlcmxvYWQuY3h4ICh0byByZXBsYWNlICRpbXBsaWNpdGNvbnYgYXMKICAgICAgICAgICAgbmVlZGVkKS4KCSAgICAKCSAgICBTdGlsbCwgcmVhbCBzdXBwb3J0IGluIGVhY2ggdGFyZ2V0IGxhbmd1YWdlIHJlcXVpcmVzIGVhY2gKCSAgICB0YXJnZXQgbGFuZ3VhZ2UgdG8gYmUgbW9kaWZpZWQuIFB5dGhvbiBwcm92aWRlcyBhbiBleGFtcGxlLAogICAgICAgICAgICBzZWUgYmVsb3cuCgoKCSAgLSBBZGQgc3VwcG9ydCBmb3IgbmF0aXZlIEMrKyBpbXBsaWNpdCBjb252ZXJzaW9ucywgaWUsIGlmIHlvdQogICAgICAgICAgICBoYXZlCgoJICAgICAgICAlaW1wbGljaXRjb252IEE7CgoJICAgICAgICBzdHJ1Y3QgQSB7CgkJICAgaW50IGlpOwoJCSAgIEEoKSB7aWkgPSAxO30KCQkgICBBKGludCkge2lpID0gMjt9CgkJICAgQShkb3VibGUpIHtpaSA9IDM7fQoJCSAgIGV4cGxpY2l0IEEoY2hhciAqcykge2lpID0gNDt9CgkJfTsKCQkKCQlpbnQgZ2V0KGNvbnN0IEEmIGEpIHtyZXR1cm4gYS5paTt9CgogICAgICAgICAgICB5b3UgY2FuIGNhbGw6CgoJICAgICAgICBhID0gQSgpCgkgICAgICAgIGFpID0gQSgxKQoJICAgICAgICBhZCA9IEEoMS4wKQoJICAgICAgICBhcyA9IEEoImhlbGxvIikKCQkKCQkjIG9sZCBmb3JtcwoJICAgICAgICBnZXQoYSkgIC0+IDEKCSAgICAgICAgZ2V0KGFpKSAtPiAyCgkgICAgICAgIGdldChhZCkgLT4gMwoJICAgICAgICBnZXQoYXMpIC0+IDQKCQkKCQkjaW1wbGljaXQgY29udmVyc2lvbnMKCSAgICAgICAgZ2V0KDEpICAgICAgIC0+IDIKCSAgICAgICAgZ2V0KDEuMCkgICAgIC0+IDMKCSAgICAgICAgZ2V0KCJoZWxsbyIpIC0+IEVycm9yLCBleHBsaWNpdCBjb25zdHJ1Y3RvcgoKICAgICAgICAgICAgQWxzbywgYXMgaW4gQysrLCBub3cgaW1wbGljaXQgY29udmVyc2lvbnMgYXJlIHN1cHBvcnRlZCBpbgogICAgICAgICAgICB2YXJpYWJsZSBhc3NpZ21lbnRzLCBhbmQgaWYgeW91IGhhdmU6CgoJICAgICAgQSBnYTsKCSAgICAgIHN0cnVjdCBCYXIgewoJICAgICAgICBBIGE7CiAgICAgICAgICAgICAgfTsKCgkgICAgeW91IGNhbiBkbzoKCgkgICAgICBjdmFyLmdhID0gQSgxKQoJICAgICAgY3Zhci5nYSA9IDEKCSAgICAgIGN2YXIuZ2EgPSAxLjAKCSAgICAgIGN2YXIuZ2EgPSBBKCJoZWxsbyIpIAoJICAgICAgY3Zhci5nYSA9ICJoZWxsbyIgLT4gZXJyb3IsIGV4cGxpY2l0IGNvbnN0cnVjdG9yCgoJICAgICAgYiA9IEJhcigpCgkgICAgICBiLmEgPSBBKCJoZWxsbyIpCgkgICAgICBiLmEgPSAxCgkgICAgICBiLmEgPSAxLjAKCSAgICAgIGIuYSA9ICJoZWxsbyIgLT4gZXJyb3IsIGV4cGxpY2l0IGNvbnN0cnVjdG9yCgoJICAgIE5vdGUgdGhhdCB0aGUgbGFzdCBjYXNlLCBhc3NpZ25pbmcgYSBtZW1iZXIgdmFyIGRpcmVjdGx5LCAKCSAgICBhbHNvIHJlcXVpcmVzIHRoZSAnbmF0dXJhbHZhcicgb3B0aW9uLgoKCSAgICBUaGlzIHN1cHBvcnQgbm93IG1ha2VzIHRoZSBvbGQgJyVpbXBsaWNpdCcgbWFjcm8sIHdoaWNoCgkgICAgd2FzIGZvdW5kIGluICdpbXBsaWNpdC5pJyBhbmQgaXQgd2FzIGZyYWdpbGUgaW4gbWFueSB3YXlzLAoJICAgIG9ic29sZXRlLCBhbmQgeW91IHNob3VsZCB1c2UgdGhlIG5ldyAnJWltcGxpY2l0Y29udicKCSAgICBkaXJlY3RpdmUgaW5zdGVhZC4KCgkgICAgTm90ZSB0aGF0IHdlIGZvbGxvdyB0aGUgQysrIGNvbnZlbnRpb25zLCBpZSwgaW4gdGhlCgkgICAgZm9sbG93aW5nIHRoZSBpbXBsaWNpdCBjb252ZXJzaW9uIGlzIGFsbG93ZWQ6CgoJCWludCBnZXQoQSBhKSB7cmV0dXJuIGEuaWk7fQoJCWludCBnZXQoY29uc3QgQSYgYSkge3JldHVybiBhLmlpO30KCSAgICAKCSAgICBidXQgbm90IGluIHRoZXNlIGNhc2VzOgoKCQlpbnQgZ2V0KEEgKmEpIHtyZXR1cm4gYS0+aWk7fQoJCWludCBnZXQoQSYgYSkge3JldHVybiBhLmlpO30KCQkKCSAgICBBbHNvLCBpdCB3b3JrcyBmb3IgZGlyZWN0b3IgbWV0aG9kcyB0aGF0IHJldHVybiBhIGJ5IHZhbHVlCgkgICAgcmVzdWx0LCBpZSwgdGhlIGZvbGxvd2luZyB3aWxsIHdvcms6CgogICAgICAgICAgICAgICAgdmlydHVhbCBBIGdldF9hKCkgPSAwOwoKCQlkZWYgZ2V0X2Eoc2VsZik6CgkJICAgcmV0dXJuIDEKCiAgICAgICAgICAgIGJ1dCBub3QgaW4gdGhpcyBjYXNlOgoKICAgICAgICAgICAgICAgIHZpcnR1YWwgY29uc3QgQSYgZ2V0X2EoKSA9IDA7CiAgICAgICAgICAgICAgICB2aXJ0dWFsIEEmIGdldF9hKCkgPSAwOwogICAgICAgICAgICAgICAgdmlydHVhbCBBKiBnZXRfYSgpID0gMDsKCSAgICAKCSAgTm90ZXM6CgoJICAtIHRoZSBpbXBsaWNpdGNvbnYgbWVjaGFuaXNtIGlzIGltcGxlbWVudGVkIGJ5IGRpcmVjdGx5CgkgICAgY2FsbGluZy9kaXNwYXRjaGluZyB0aGUgcHl0aG9uIGNvbnN0cnVjdG9yLCB0cmlnZ2VyaW5nIGEKCSAgICBjYWxsIHRvIHRoZSBfX2luaXRfX21ldGhvZC4gSGVuY2UsIGlmIHlvdSBleHBhbmRlZCB0aGUKCSAgICBfX2luaXRfXyBtZXRob2QsIGxpa2UgaW46CgoJICAgICAgICBjbGFzcyBBOgoJCSAgIGRlZiBfX2luaXRfXyhzZWxmLGFyZ3MpOgoJCSAgICAgIDxzd2lnIGNvZGU+CgkJICAgICAgPG15IGNvZGUgaGVyZT4KCiAgICAgICAgICAgIHRoZW4gJ215IGNvZGUnIHdpbGwgYWxzbyBiZSBleGVjdXRlZC4KCSAgICAKCSAgLSBTaW5jZSB0aGUgJWltcGxpY2l0Y29udiBkaXJlY3RpdmUgaXMgYSBTV0lHIGZlYXR1cmUsIGlmIHlvdSB0eXBlOgoJICAgIAogIAkgICAgICAgJWltcGxpY2l0Y29udjsgIAoKCSAgICB0aGF0IHdpbGwgZW5hYmxlIGltcGxpY2l0IGNvbnZlcnNpb24gZm9yIGFsbCB0aGUgY2xhc3NlcyBpbgoJICAgIHlvdXIgbW9kdWxlLgoKCSAgICBCdXQgaWYgeW91IGFyZSB3b3JyaWVkIGFib3V0IHBlcmZvcm1hbmNlLCBtYXliZSB0aGF0IHdpbGwgYmUKCSAgICB0b28gbXVjaCwgZXNwZWNpYWxseSBpZiB5b3UgaGF2ZSBvdmVybG9hZGVkIG1ldGhvZHMsIHNpbmNlCgkgICAgdG8gcmVzb2x2ZSB0aGUgZGlzcGF0Y2hpbmcgcHJvYmxlbSwgcHl0aG9uIHdpbGwgZWZlY3RpdmVseQoJICAgIHRyeSB0byBjYWxsIGFsbCB0aGUgaW1wbGljaXQgY29uc3RydWN0b3JzIGFzIG5lZWRlZC4KCgkgIC0gRm9yIHRoZSBzYW1lIHJlYXNvbiwgaXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRoYXQgeW91IHVzZQogICAgICAgICAgICB0aGUgbmV3ICdjYXN0bW9kZScgd2hlbiBtaXhpbmcgaW1wbGljaXQgY29udmVyc2lvbiBhbmQKICAgICAgICAgICAgb3ZlcmxvYWRpbmcuCgoJIC0gW3B5dGhvbl0gVGhlICVpbXBsaWNpdCBkaXJlY3RpdmUgaXMgZGVjbGFyZWQgb2Jzb2xldGUsIGFuZAogICAgICAgICAgIHlvdSBzaG91bGQgdXNlICVpbXBsaWNpdGNvbnYgaW5zdGVhZC4gSWYgeW91IGluY2x1ZGUKCSAgIHRoZSBpbXBsaWNpdC5pIGZpbGUsIGEgd2FybmluZyB3aWxsIHJlbWluZCB5b3Ugb2YgdGhpcy4KCgkgICBOb3RlOiBTaW5jZSAlaW1wbGljaXQgaXMgZnJhZ2lsZSwganVzdCByZXBsYWNpbmcgaXQgYnkKCSAgICVpbXBsaWNpdGNvbnYgY291bGQgbGVhZCB0byBkaWZmZXJlbnQgYmVoYXZpb3IuIEhlbmNlLCB3ZQoJICAgZG9uJ3QgYXV0b21hdGljYWxseSBzd2l0Y2ggZnJvbSB0byB0aGUgb3RoZXIsIGFuZCB0aGUgdXNlcgoJICAgbXVzdCBtaWdyYXRlIHRvIHRoZSBuZXcgJWltcGxpY2l0Y29udiBkaXJlY3RpdmUgbWFudWFsbHkuCgoKMTIvMjYvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXQogICAgICAgICAgICBNb2RpZnkgc3RkOjp2ZWN0b3Igd3JhcHBlcnMgdG8gdXNlIHN0ZDo6dmVjdG9yOjp2YWx1ZV90eXBlIGFzIHRoaXMgaXMKICAgICAgICAgICAgY2xvc2VyIHRvIHRoZSByZWFsIFNUTCBkZWNsYXJhdGlvbnMgZm9yIHNvbWUgbWV0aG9kcywgZWcgZm9yIHB1c2hfYmFjaygpLgogICAgICAgICAgICBGaXhlcyBzb21lIGNvbXBpbGF0aW9uIGVycm9ycyBmb3Igc29tZSBjb21waWxlcnMgZWcgd2hlbiB0aGUgdGVtcGxhdGVkCiAgICAgICAgICAgIHR5cGUgaXMgYSBwb2ludGVyLgoKICAgICAgICAgICAgW0phdmFdCiAgICAgICAgICAgIHN0ZDo6dmVjdG9yIGltcHJvdmVtZW50cyAtIGEgZmV3IG1vcmUgbWV0aG9kcyBhcmUgd3JhcHBlZCBhbmQgc3BlY2lhbGl6YXRpb25zIGFyZQogICAgICAgICAgICBubyBsb25nZXIgcmVxdWlyZWQuIFRoZSBzcGVjaWFsaXplX3N0ZF92ZWN0b3IgbWFjcm8gaXMgbm8gbG9uZ2VyIG5lZWRlZCAoYQogICAgICAgICAgICB3YXJuaW5nIGlzIGlzc3VlZCBpZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gdXNlIGl0KS4KCjEyLzI2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10KICAgICAgICAgICAgQWRkIGluIHBvaW50ZXIgcmVmZXJlbmNlIHR5cGVtYXBzLiBUaGlzIGFsc28gZW5hYmxlcyBvbmUgdG8gZWFzaWx5IHdyYXAKICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VD4gd2hlcmUgVCBpcyBhIHBvaW50ZXIuCgoxMi8yNC8yMDA1OiBlZnV6enlvbmUKICAgICAgICAgICAgW0NGRkldIFRoZSBjZmZpIG1vZHVsZSBmb3IgU1dJRzoKICAgICAgICAgICAgICAtIEZ1bGx5IHN1cHBvcnRzIEMsIGJ1dCBwcm92aWRlcyBsaW1pdGVkIHN1cHBvcnRzIGZvciBDKyssIGluCiAgICAgICAgICAgICAgIHBhcnRpY3VsYXIgQysrIHN1cHBvcnQgZm9yIHRlbXBsYXRlcyBhbmQgb3ZlcmxvYWRpbmcgbmVlZHMgdG8KICAgICAgICAgICAgICAgYmUgd29ya2VkIHVwb24uIAoKMTIvMjMvMjAwNTogbW1hdHVzCgkgICAgW3B5dGhvbl0gQWRkIHRoZSBjYXN0bW9kZSB0aGF0IGFsbG93cyB0aGUgcHl0aG9uCgkgICAgdHlwZSBjYXN0aW5nIHRvIG9jY3VyLgoKCSAgICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgJ2ludCBmb28oaW50KScsIG5vdwoJICAgIAoJICAgICAgY2xhc3MgQWkoKToKCSAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLHgpOiAKCQkgICAgc2VsZi54ID0geAoJICAgICAgICAgZGVmIF9faW50X18oc2VsZik6IAoJCSAgICByZXR1cm4gc2VsZi54CgoJICAgICAgZm9vKDEpICAgLy8gT2sKCSAgICAgIGZvbygxLjApIC8vIE9rCgkgICAgICBmb28oMS4zKSAvLyBFcnJvcgoJICAgICAgYSA9IEFpKDQpCiAgICAgICAgICAgICAgZm9vKGFpKSAgLy8gT2sKCiAgICAgICAgICAgIFRoZSBjYXN0bW9kZSwgd2hpY2ggY2FuIGJlIGVuYWJsZWQgZWl0aGVyIHdpdGggdGhlCiAgICAgICAgICAgICctY2FzdG1vZGUnIG9wdGlvbiBvciB0aGUgJW1vZHVsZSgiY2FzdG1vZGUiKSBvcHRpb24sIHVzZXMKICAgICAgICAgICAgdGhlIG5ldyBjYXN0L3JhbmsgZGlzcGF0Y2ggbWVjaGFuaXNtLiBIZW5jZSwgbm93IGlmIHlvdQogICAgICAgICAgICBoYXZlICdpbnQgZm9vKGludCk7IGludCBmb28oZG91YmxlKTsnLCB0aGUgZm9sbG93aW5nIHdvcmtzCiAgICAgICAgICAgIGFzIGV4cGVjdGVkOgoKCSAgICAgIGZvbygxKSAgIC0+IGZvbyhpbnQpCgkgICAgICBmb28oMS4wKSAtPiBmb28oZG91YmxlKQoJICAgICAgYWkgPSBBaSg0KQoJICAgICAgZm9vKGFpKSAgLT4gZm9vKGludCkKCgkgICAgTm90ZTE6IHRoZSAnY2FzdG1vZGUnIGNvdWxkIGRpc3J1cHQgc29tZSBzcGVjaWFsaXplZAoJICAgIHR5cGVtYXBzLiBJbiBwYXJ0aWN1bGFyLCB0aGUgImltcGxpY2l0LmkiIGxpYnJhcnkgc2VlbXMgdG8KCSAgICBoYXZlIHByb2JsZW0gd2l0aCB0aGUgY2FzdG1vZGUuIEJ1dCBiZXNpZGVzIHRoYXQgb25lLCB0aGUKCSAgICBlbnRpcmUgdGVzdC1zdWl0ZSBjb21waWxlcyBmaW5lIHdpdGggYW5kIHdpdGhvdXQgdGhlCgkgICAgY2FzdG1vZGUuCgogCSAgICBOb3RlMjogdGhlIGNhc3QgbW9kZSBjYW4ndCBiZSBjb21iaW5lZCB3aXRoIHRoZSBmYXN0CgkgICAgZGlzcGF0Y2ggbW9kZSwgaWUsIHRoZSAtZmFzdGRpc3BhdGNoIG9wdGlvbiBoYXMgbm8gZWZmZWN0CgkgICAgd2hlbiB0aGUgY2FzdCBtb2RlIGlzIHNlbGVjdGVkLiBUaGUgcGVuYWx0aWVzLCBob3dldmVyLAoJICAgIGFyZSBtaW5pbXVtIHNpbmNlIHRoZSBjYXN0IGRpc3BhdGNoIGNvZGUgaXMgYWxyZWFkeSBiYXNlZAoJICAgIG9uIHRoZSBzYW1lIGZhc3QgZGlzcGF0Y2ggbWVjaGFuaXNtLgoKCSAgICBTZWUgdGhlIGZpbGUgb3ZlcmxvYWRfZGlzcGF0Y2hfY2FzdF9ydW5tZS5weSBmaWxlIGZvcgoJICAgIG5ldyBjYXNlcyBhbmQgZXhhbXBsZXMuCgoxMi8yMi8yMDA1OiBtbWF0dXMKCSAgICBBZGQgdGhlIGNhc3QgYW5kIHJhbmsgbWVjaGFuaXNtIHRvIGRpc3BhdGNoIG92ZXJsb2FkaW5nCgkgICAgZnVuY3Rpb25zLiBUaGUgVVRGIHN1cHBvcnRzIGl0IG5vdywgYnV0IGZvciBlYWNoIGxhbmd1YWdlCgkgICAgaXQgbXVzdCBiZSBkZWNpZGVkIGhvdyB0byBpbXBsZW1lbnQgYW5kL29yIHdoZW4gdG8gdXNlIGl0LgoKCSAgICBbcGVybF0gTm93IHBlcmwgdXNlcyB0aGUgbmV3IGNhc3QgYW5kIHJhbmsgZGlzcGF0Y2gKCSAgICBtZWNoYW5pc20sIHdoaWNoIHNvbHZlcyBhbGwgdGhlIHBhc3QgcHJvYmxlbXMga25vd24gCgkgICAgaW4gcGVybCwgc3VjaCBhcyB0aGUgb2xkICcrIDEnIHByb2JsZW06CgoJICAgICAgICBpbnQgZm9vKGludCk7CgkgICAgCgkJJG4gPSAxCiAgICAgICAgICAgICAgICAkbiA9ICRuICsgMQogICAgICAgICAgICAgICAgJHIgPSBmb28obikKCiAgICAgICAgICAgIGFsc28gd29ya3M6CgogICAgICAgICAgICAgICAgIGZvbygxKTsKICAgICAgICAgICAgICAgICBmb28oIjEiKTsKICAgICAgICAgICAgICAgICBmb28oMS4wKTsKICAgICAgICAgICAgICAgICBmb28oIjEuMCIpOwoKICAgICAgICAgICAgIGJ1dCBmYWlscwoKICAgICAgICAgICAgICAgICBmb28oImwiKTsKCiAgICAgICAgICAgICBhbmQgd2hlbiBvdmVybG9hZGluZyAgZm9vKGludCkgYW5kIGZvbyhkb3VibGUpOwoKICAgICAgICAgICAgICAgICBmb28oMSkgLT4gZm9vKGludCkKICAgICAgICAgICAgICAgICBmb28oMS4wKSAtPiBmb28oZG91YmxlKQogICAgICAgICAgICAgICAgIGZvbygiMSIpIC0+IGZvbyhpbnQpCiAgICAgICAgICAgICAgICAgZm9vKCIxLjAiKSAtPiBmb28oZG91YmxlKQogICAgICAgICAgICAgICAgIGZvbygibCIpIC0+IGVycm9yCgkJIGZvbygkbikgLT4gZm9vKGludCkgIGZvciBnb29kIHBlcmwgdmVyc2lvbnMKCQkgZm9vKCRuKSAtPiBmb28oZG91YmxlKSAgZm9yIG9sZCBiYWQgcGVybCB2ZXJzaW9ucwoKCSAgICAgd2hlbiBvdmVybG9hZGluZyBmb28oaW50KSwgZm9vKGNoYXIqKSBhbmQgZm9vKGRvdWJsZSk6CgogICAgICAgICAgICAgICAgIGZvbygxKSAtPiBmb28oaW50KQogICAgICAgICAgICAgICAgIGZvbygxLjApIC0+IGZvbyhkb3VibGUpCiAgICAgICAgICAgICAgICAgZm9vKCIxIikgLT4gZm9vKGNoYXIqKQogICAgICAgICAgICAgICAgIGZvbygiMS4wIikgLT4gZm9vKGNoYXIqKQogICAgICAgICAgICAgICAgIGZvbygibCIpIC0+IGZvbyhjaGFyKikKCiAgICAgICAgICAgICBOb3RlOiBJbiBwZXJsIHRoZSBvbGQgZGlzcGF0Y2ggbWVjaGFuaXNtIHdhcyBicm9rZW4sCiAgICAgICAgICAgICBzbywgd2UgZG9uJ3QgcHJvdmlkZSBhbiBvcHRpb24gdG8gZW5hYmxlIHRoZSBvbGQgb25lCgkgICAgIHNpbmNlLCBhZ2FpbiwgaXQgd2FzIHJlYWxseSByZWFsbHkgYnJva2VuLgoKCSAgICAgU2VlICdvdmVybG9hZF9zaW1wbGVfcnVubWUucGwnIGZvciBtb3JlIGNhc2VzIGFuZCB0ZXN0cy4KCgkgICAgIFBTOiBhbGwgdGhlIG9sZCBrbm93biBpc3N1ZXMgYXJlIGRlY2xhcmVkIHJlc29sdmVkLCBhbnkKCSAgICAgbmV3ICJwcm9ibGVtIiB0aGF0IGNvdWxkIGJlIGRpc2NvdmVyZWQgaXMgZGVjbGFyZWQsIAoJICAgICBhIHByaW9yaSwgYXMgImZlYXR1cmVzIiBvZiB0aGUgbmV3IGRpc3BhdGNoIG1lY2hhbmlzbQoJICAgICAodW50aWwgd2UgZmluZCBhbm90aGVyIHNvbHV0aW9uIGF0IGxlYXN0KS4KCSAgICAgCgkgICAgIAogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoJICAgIEFzIHdpdGggdGhlIGludHJvZHVjdGlvbiBvZiB0aGUgVVRGLCBzb21lIHRoaW5ncyBjb3VsZAoJICAgIG5vdyBzdGFydCB0byB3b3JrIGFzIGV4cGVjdGVkLCBhbmQgcGVvcGxlIHVzZWQgdG8gZGVhbCBvcgoJICAgIHdvcmthcm91bmQgcHJldmlvdXMgYnVncyByZWxhdGVkIHRvIHRoZSBkaXNwYXRjaAoJICAgIG1lY2hhbmlzbSwgY291bGQgc2VlIG5vdyBhIGRpZmZlcmVuY2UgaW4gcGVybCBiZWhhdmlvci4KCjEyLzIxLzIwMDU6IG1tYXR1cwoJICAtIFRoZSAnLW5vZGVmYXVsdCcgZmxhZyAocHJhZ21hIGFuZCBmZWF0dXJlKSBub3cgZ2VuZXJhdGVzCgkgICAgYSB3YXJuaW5nLCBhbmQgcmVjb21tZW5kcyB0byB1c2UgdGhlIGV4cGxpY2l0CgkgICAgLW5vZGVmYXVsdGN0b3IgYW5kICAtbm9kZWZhdWx0ZHRvciBvcHRpb25zLgoJICAgIAoJICAgIFRoZSByZWFzb24gdG8gc3BsaXQgdGhlICdub2RlZmF1bHQnIGJlaGF2aW9yIGlzIHRoYXQsIGluCgkgICAgZ2VuZXJhbCwgaWdub3JpbmcgdGhlIGRlZmF1bHQgZGVzdHJ1Y3RvciBnZW5lcmF0ZXMgbWVtb3J5CgkgICAgbGVha3MgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4gSGVuY2UsIGlzIHRvbyByaXNreSBqdXN0IHRvCgkgICAgZGlzYWJsZSBib3RoIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yCgkgICAgYXQgdGhlIHNhbWUgdGltZS4KCgkgICAgSWYgeW91IG5lZWQgdG8gZGlzYWJsZSB0aGUgZGVmYXVsdCBkZXN0cnVjdG9yLCBpdCBpcwoJICAgIGFsc28gcmVjb21tZW5kZWQgeW91IHVzZSB0aGUgZGlyZWN0aXZlIGZvcm06CgoJICAgICAgICVub2RlZmF1bHRkdG9yICBNeVZlcnlTcGVjaWFsQ2xhc3M7CgogICAgICAgICAgICBmb3Igc3BlY2lmaWMgY2xhc3NlcywgYW5kIGFsd2F5cyBhdm9pZCB1c2luZyB0aGUgZ2xvYmFsCiAgICAgICAgICAgIC1ub2RlZmF1bHQgYW5kIC1ub2RlZmF1bHRkdG9yIG9wdGlvbnMuCgkgICAgCjEyLzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10KICAgICAgICAgICAgRml4IGluY29ycmVjdCBjb2RlIGdlbmVyYXRpb24gd2hlbiB0aGUgaW50ZXJtZWRpYXJ5IGNsYXNzbmFtZSBpcyBjaGFuZ2VkCiAgICAgICAgICAgIGluIHRoZSBtb2R1bGUgZGlyZWN0aXZlIGZyb20gaXRzIGRlZmF1bHQuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlbW9kdWxlKGpuaWNsYXNzbmFtZT0ibXlpbWNsYXNzbmV3bmFtZSIpICJteW1vZHVsZSIgLy8gSmF2YQogICAgICAgICAgICAgICVtb2R1bGUoaW1jbGFzc25hbWU9Im15aW1jbGFzc25ld25hbWUiKSAibXltb2R1bGUiIC8vIEMjCgogICAgICAgICAgICBBZGQgaW4gbmV3IHNwZWNpYWwgdmFyaWFibGUgJGltY2xhc3NuYW1lLiBTZWUgZG9jcy4KCjEyLzE3LzIwMDU6IG1tYXR1cwoJICBbUHl0aG9uXQoJICAtIEFkZCB0aGUgLWFsaWFzb2JqMC8tbm9hbGlhc29iajAgb3B0aW9ucyB0byB1c2Ugd2l0aAoJICAgIC1mYXN0dW5wYWNrIGFuZC9vciAtTyBhbmQgb2xkIHR5cGVtYXBzIHRoYXQgdXNlICdvYmowJwoJICAgIGRpcmVjdGx5LgoKCSAgICBTbywgaWYgeW91IGNvbXBpbGUgeW91ciBjb2RlIHVzaW5nIC1PIGFuZCBnZXQgZXJyb3JzIGFib3V0CgkgICAgdGhlIHVuZGVjbGFyZWQgJ29iajAnIHZhcmlhYmxlLCBydW4gYWdhaW4gdXNpbmcgCgoJCXN3aWcgLU8gLWFsaWFzb2JqMCAtcHl0aG9uIC4uLi4KCSAgICAKCSAgICBGb3IgbmV3IHR5cGVtYXBzLCBuZXZlciB1c2UgJ29iajAnIGRpcmVjdGx5LCBpZiBuZWVkZWQsCgkgICAgdXNlIHRoZSAnJHNlbGYnIG5hbWUgdGhhdCB3aWxsIGJlIHByb3Blcmx5ICBleHBhbmRlZCB0bwoJICAgICdvYmowJyAobm9mYXN0dW5wYWNrKSBvciAnc3dpZ19vYmpbMF0nIChmYXN0dW5wYWNrKS4gCiAgCgkgICAgSWYgeW91IGhhdmUgbm8gaWRlYSB3aGF0IEkgYW0gdGFsa2luZyBhYm91dCwgYmV0dGVyLCB0aGF0CgkgICAgbWVhbnMgeW91IGhhdmUgbm8gdHlwZW1hcCB3aXRoIHRoaXMgcHJvYmxlbS4KCgoxMi8xNC8yMDA1OiBtbWF0dXMgCSAKCSAgW1B5dGhvbl0KCSAgLSBBZGQgdGhlIC1mYXN0dW5wYWNrLy1ub2Zhc3R1bnBhY2sgb3B0aW9ucyB0byBlbmFibGUvZGlzYWJsZQoJICAgIHRoZSB1c2Ugb2YgdGhlIGludGVybmFsIFVucGFja1R1cGxlIG1ldGhvZCwgaW5zdGVhZCBvZgoJICAgIGNhbGxpbmcgdGhlIG9uZSBmcm9tIHRoZSBweXRob24gQyBBUEkuCgoJICAgIFRoZSBvcHRpb24gLU8gbm93IGFsc28gaW1wbGllcyAtZmFzdHVucGFjay4KCSAgICAKCjEyLzExLzIwMDU6IG1tYXR1cyAKCSAgW1B5dGhvbl0KCSAgLSBBZGQgdGhlIC1wcm94eWRlbC8tbm9wcm94eWRlbCBvcHRpb25zIHRvIGVuYWJsZS9kaXNhYmxlCgkgICAgdGhlIGdlbmVyYXRpb24gb2YgcHJveHkvc2hhZG93IF9fZGVsX18gbWV0aG9kcywgZXZlbgoJICAgIHdoZW4gbm93IHRoZXkgYXJlIHJlZHVuZGFudCwgc2luY2UgdGhleSBhcmUgZW1wdHkuCgkgICAgSG93ZXZlciwgb2xkIGludGVyZmFjZXMgY291bGQgcmVseSBvbiBjYWxsaW5nIHRoZW0uCgoJICAgIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGdlbmVyYXRlIHRoZSBfX2RlbF9fIG1ldGhvZHMKCSAgICBhcyBpbiAxLjMuMjcgb3Igb2xkZXIgc3dpZyB2ZXJzaW9ucy4KCgkgICAgVGhlIG9wdGlvbiAtTyBub3cgYWxzbyBpbXBsaWVzIC1ub3Byb3h5ZGVsLgoKMTIvMTAvMjAwNTogbW1hdHVzIAoJICBbVVRGXQogICAgICAgICAgLSBGaXggdW5uZWNlc3NhcnkgY2FsbHMgdG8gU1dJR19UeXBlUXVlcnkgZm9yICdjaGFyIConCgkgICAgYW5kICd3Y2hhcl90IConLCBwcm9ibGVtIGZvdW5kIGJ5IENsYXkgQ3VsdmVyIHdoaWxlCgkgICAgcHJvZmlsaW5nIHRoZSBQeU9ncmUgcHJvamVjdC4KCgkgIAoJICBbUHl0aG9uXSAKCSAgLSBBZGQgdGhlIC1kaXJ2dGFibGUvLW5vZGlydnRhYmxlIHRvIGVuYWJsZS9kaXNhYmxlCgkgICAgYSBwc2V1ZG8gdmlydHVhbCB0YWJsZSB1c2VkIGZvciBkaXJlY3RvcnMsIGF2b2lkaW5nCgkgICAgdGhlIG5lZWQgdG8gcmVzb2x2ZSB0aGUgcHl0aG9uIG1ldGhvZCBhdCBlYWNoIGNhbGwuCgkgICAgCgkgIC0gQWRkIHRoZSAtc2FmZWNzdHJpbmdzLy1ub3NhZmVjc3RyaW5ncyBvcHRpb25zIHRvCgkgICAgZW5hYmxlL2Rpc2FibGUgdGhlIHVzZSBvZiBzYWZlIGNvbnZlcnNpb25zIGZyb20gUHlTdHJpbmcKCSAgICB0byBjaGFyICouIFB5dGhvbiByZXF1aXJlcyB5b3UgdG8gbmV2ZXIgY2hhbmdlIHRoZSBpbnRlcm5hbAoJICAgIGJ1ZmZlciBkaXJlY3RseSwgYW5kIGhlbmNlICdzYWZlY3RyaW5ncycgd2FycmFudGllcyB0aGF0CgkgICAgYnV0IHJldHVybmluZyBhIGNvcHkgb2YgdGhlIGludGVybmFsIHB5dGhvbiBzdHJpbmcgYnVmZmVyLgoKCSAgICBUaGUgZGVmYXVsdCwgYXMgaW4gcHJldmlvdXMgcmVsZWFzZXMsIGlzIHRvIHJldHVybiBhCgkgICAgcG9pbnRlciB0byB0aGUgYnVmZmVyIChub3NhZmVjc3RyaW5ncyksIHNvLCBpdCBpcyB0aGUgdXNlcidzCgkgICAgcmVzcG9uc2liaWxpdHkgdG8gYXZvaWQgaXRzIG1vZGlmaWNhdGlvbi4KCSAgICAKCSAgLSBBZGQgdGhlIC1PIG9wdGlvbiB0byBlbmFibGUgYWxsIHRoZSBvcHRpbWl6YXRpb24gb3B0aW9ucwoJICAgIGF0IG9uY2UsIGluaXRpYWxseSBlcXVpdmFsZW50IHRvCgoJICAgIC1tb2Rlcm4gLWZhc3RkaXNwYXRjaCAtZGlydnRhYmxlIC1ub3NhZmVjc3RyaW5ncyAtZnZpcnR1YWwKCjEyLzA4LzIwMDU6IG1tYXR1cyAKCgkgIC0gQWRkIHRoZSAtZmFzdGRpc3BhdGNoIG9wdGlvbiAoZmFzdGRpc3BhdGNoIGZlYXR1cmUpLiBUaGlzCgkgICAgZW5hYmxlcyB0aGUgImZhc3QgZGlzcGF0Y2giIG1lY2hhbmlzbSBmb3Igb3ZlcmxvYWRlZAoJICAgIG1ldGhvZHMgcHJvdmlkZWQgYnkgU2FsdmFkb3IgRmFuZGl+bm8gR2FyYydpYSAoIzkzMDU4NikuCgoJICAgIFRoZSByZXN1bHRpbmcgY29kZSBpcyBzbWFsbGVyIGFuZCBmYXN0ZXIgc2luY2UgbGVzcyB0eXBlCgkgICAgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLiBIb3dldmVyLCB0aGUgZXJyb3IgbWVzc2FnZXMgeW91CgkgICAgZ2V0IHdoZW4gdGhlIG92ZXJsb2FkaW5nIGlzIG5vdCByZXNvbHZlZCBjb3VsZCBiZQoJICAgIGRpZmZlcmVudCBmcm9tIHdoYXQgdGhlIHRyYWRpdGlvbmFsIG1ldGhvZCByZXR1cm5zLgoKCSAgICBXaXRoIHRoZSBvbGQgbWV0aG9kIHlvdSBhbHdheXMgZ2V0IGFuIGVycm9yIHN1Y2ggYXMgCgoJICAgICAgICJObyBtYXRjaGluZyBmdW5jdGlvbiBmb3Igb3ZlcmxvYWRlZCAuLi4iCgogICAgICAgICAgICB3aXRoIHRoZSBuZXcgbWV0aG9kIHlvdSBjYW4gYWxzbyBnZXQgZXJyb3JzIHN1Y2ggYXMKCgkgICAgICAgIlR5cGUgZXJyb3IgaW4gYXJndW1lbnQgMSBvZiB0eXBlIC4uLiIKCgkgICAgU2VlIGJ1ZyByZXBvcnQgIzkzMDU4NiBmb3IgbW9yZSBkZXRhaWxzLgogICAgICAgICAgICAKICAJICAgIFNvLCB0aGlzIG9wdGltaXphdGlvbiBtdXN0IGJlIGV4cGxpY2l0bHkgZW5hYmxlZCBieSB1c2Vycy4KCgkgICAgVGhlIG5ldyBtZWNoYW5pc20gY2FuIGJlIHVzZWQgYXM6CgogICAgICAgICAgICAgIHN3aWcgLWZhc3RkaXNwYXRjaAoKICAgICAgICAgICAgb3IgdXNpbmcgdGhlIGZlYXR1cmUgZm9ybQoKCSAgICAgICVmZWF0dXJlKCJmYXN0ZGlzcGF0Y2giKSBtZXRob2Q7CiAgICAgICAgICAgIG9yCiAgICAgICAgICAgICAgJWZhc3RkaXNwYXRjaCBtZXRob2Q7CgkgICAgCgoxMi8wNi8yMDA1OiBtbWF0dXMgCgogICAgICAgICAgLSBTZXZlcmFsIG1lbW9yeSBhbmQgc3BlZWQgaW1wcm92ZW1lbnRzLCBzcGVjaWFsbHkgZm9yCgkgICAgdGVtcGxhdGVzLiBOb3cgc3dpZyBpcyB1cCB0byAyMCBmYXN0ZXIgdGhhbiBiZWZvcmUgZm9yCgkgICAgbGFyZ2UgdGVtcGxhdGUgaW50ZXJmYWNlcywgc3VjaCBhcyB0aGUgc3RkX2NvbnRhaW5lcnMuaQoJICAgIGFuZCB0ZW1wbGF0ZV9tYXRyaXguaSBmaWxlcyBpbiB0aGUgcHl0aG9uIHRlc3Qtc3VpdGUuCgoJICAgIE1lbW9yeSBmb290cHJpbnQgaXMgYWxzbyByZWR1Y2VkIGluIGNvbnNpZGVyYXRpb24gb2Ygc21hbGwKCSAgICBwY3MvYXJjaGl0ZWN0dXJlcy4KCgkgIC0gYWRkIGNvbW1hbmRsaW5lIG9wdGlvbnMgLWNwcGVycmFzd2FybiBhbmQgLW5vY3BwZXJyYXN3YXJuIiB0byBmb3JjZQogICAgICAgICAgICB0aGUgc3dpZyBwcmVwcm9jZXNzb3IgdG8gdHJlYXQgdGhlICNlcnJvciBkaXJlY3RpdmUgYXMgYSAjd2FybmluZy4KCSAgICAKCSAgICB0aGUgcHJhZ21hcwoKICAgICAgICAgICAgICAgI3ByYWdtYSBTV0lHIGNwcGVycmFzd2Fybj0xCiAgICAgICAgICAgICAgICNwcmFnbWEgU1dJRyBjcHBlcnJhc3dhcm49MAoJICAgICAgIAoJICAgIGFyZSBlcXVpdmFsZW50IHRvIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucywgcmVzcGVjdGl2ZWx5LgogICAgICAgICAgICAgCgoxMi8wNi8yMDA1OiBtbWF0dXMKCSAgICBbUHl0aG9uXSBUaGUgZ2VuZXJhdGVkIGNvZGUgaXMgbm93IG1vcmUgcG9ydGFibGUsIGVzcGVjaWFsbHkKCSAgICBmb3IgV2luZG93cy4gRm9sbG93aW5nIAoKICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG9jL2ZhcS93aW5kb3dzLmh0bWwKCiAgICAgICAgICAgIFB5X05vbmUgaXMgbmV2ZXIgYWNjZXNzZWQgYXMgYSBzdHJ1Y3R1cmUsIHBsdXMgb3RoZXIKICAgICAgICAgICAgdHJpY2tzIG1lbnRpb25lZCB0aGVyZS4KCjEyLzA2LzIwMDU6IG1tYXR1cwoJICAgIFtQeXRob25dIEFkZGVkIGluaXRpYWwgc3VwcG9ydCBmb3IgdGhyZWFkcyBiYXNlZCBpbiB0aGUKCSAgICBwcm9wb3NhbCBieSBKb3NlcGggV2luc3Rvbi4KCgkgICAgVGhlIHVzZXIgaW50ZXJmYWNlIGlzIGFzIGZvbGxvd3M6CgoJICAgIDEuLSB0aGUgbW9kdWxlIHRocmVhZCBzdXBwb3J0IGlzIGVuYWJsZSB2aWEgdGhlICJ0aHJlYWRzIiBtb2R1bGUKICAgICAgICAgICAgICAgIG9wdGlvbiwgaS5lLgoKICAgICAgICAgICAgICAgICAgJW1vZHVsZSgidGhyZWFkcyI9MSkKCiAgICAgICAgICAgIDIuLSBFcXVpdmFsZW50IHRvIHRoYXQsIGlzIHRoZSBuZXcgJy10aHJlYWRzJyBzd2lnIG9wdGlvbgoKICAgICAgICAgICAgICAgICAgc3dpZyAtdGhyZWFkcyAtcHl0aG9uIC4uLgoKICAgICAgICAgICAgMy4tIFlvdSBjYW4gcGFydGlhbGx5IGRpc2FibGUgdGhyZWFkIHN1cHBvcnQgZm9yIGEgZ2l2ZW4KICAgICAgICAgICAgICAgIG1ldGhvZCB1c2luZzoKCiAgICAgICAgICAgICAgICAgICVmZWF0dXJlKCJub3RocmVhZCIpIG1ldGhvZDsKICAgICAgICAgICAgICAgIG9yCgkJICAlbm90aHJlYWQgbWV0aG9kOwoKICAgICAgICAgICAgICAgIGFsc28sIHlvdSBjYW4gZGlzYWJsZSBzZWN0aW9ucyBvZiB0aGUgdGhyZWFkIHN1cHBvcnQsIAogICAgICAgICAgICAgICAgZm9yIGV4YW1wbGUKCiAgICAgICAgICAgICAgICAgICVmZWF0dXJlKCJub3RocmVhZGJsb2NrIikgbWV0aG9kOwogICAgICAgICAgICAgICAgb3IKCQkgICVub3RocmVhZGJsb2NrIG1ldGhvZDsKCiAgICAgICAgICAgICAgICAgICVmZWF0dXJlKCJub3RocmVhZGFsbG93IikgbWV0aG9kOwogICAgICAgICAgICAgICAgb3IKCQkgICVub3RocmVhZGFsbG93IG1ldGhvZDsKCiAgICAgICAgICAgICAgICB0aGUgZmlyc3QgZGlzYWJsZXMgdGhlIEMrKy9weXRob24gdGhyZWFkIHByb3RlY3Rpb24sIGFuZCB0aGUKICAgICAgICAgICAgICAgIHNlY29uZCBkaXNhYmxlcyB0aGUgcHl0aG9uL0MrKyB0aHJlYWQgcHJvdGVjdGlvbi4gCgogICAgICAgICAgICA0Li0gVGhlIGN1cnJlbnQgdGhyZWFkIHN1cHBvcnQgaXMgYmFzZWQgaW4gdGhlIFB5R0lMCiAgICAgICAgICAgICAgICBleHRlbnNpb24gcHJlc2VudCBpbiBweXRob24gdmVyc2lvbiAyLjMgb3IgbGF0ZXIsIGJ1dAogICAgICAgICAgICAgICAgeW91IGNhbiBwcm92aWRlIHRoZSB0aHJlYWQgY29kZSBmb3Igb2xkZXIgdmVyc2lvbnMgYnkKICAgICAgICAgICAgICAgIGRlZmluaW5nIHRoZSBtYWNyb3MgaW4gcHl0aHJlYWRzLnN3Zy4KCgkJSWYgeW91IGdldCBhIHdvcmtpbmcgaW1wbGVtZW50YXRpb24gZm9yIG9sZGVyIHZlcnNpb25zLAoJCXBsZWFzZSBzZW5kIHVzIGEgcGF0Y2guCgogICAgICAgICAgICBGb3IgdGhlIGN1cmlvdXMgYWJvdXQgcGVyZm9ybWFuY2UsIGhlcmUgYXJlIHNvbWUgbnVtYmVycwogICAgICAgICAgICBmb3IgdGhlIHByb2ZpbGV0ZXN0LmkgdGVzdCwgd2hpY2ggaXMgdXNlZCB0byBjaGVjayB0aGUgc3BlZWQKCSAgICBvZiB0aGUgd3JhcHBlZCBjb2RlOgoKCSAgICAgICAgbm90aHJlYWQgICAgICAgICAgIDkuNnMgIChubyB0aHJlYWQgY29kZSkKCQlub3RocmVhZGJsb2NrICAgICAxMi4ycyAgKG9ubHkgJ2FsbG93JyBjb2RlKQoJCW5vdGhyZWFkYWxsb3cgICAgIDEzLjZzICAob25seSAnYmxvY2snIGNvZGUpCiAgICAgICAgICAgICAgICBmdWxsIHRocmVhZCAgICAgICAxNS41cyAgKCdhbGxvdycgKyAnYmxvY2snIGNvZGUpCgkgICAgCgkgICAgaS5lLiwgZnVsbCB0aHJlYWQgY29kZSBkZWNyZWFzZXMgdGhlIHdyYXBwaW5nIHBlcmZvcm1hbmNlIGJ5CgkgICAgYXJvdW5kIDYwJS4gSWYgdGhhdCBpcyBpbXBvcnRhbnQgdG8geW91ciBhcHBsaWNhdGlvbiwgeW91CgkgICAgY2FuIHR1bmUgZWFjaCBtZXRob2QgdXNpbmcgdGhlIGRpZmZlcmVudCAnbm90aHJlYWQnLAoJICAgICdub3RocmVhZGJsb2NrJyBvciAnbm90aHJlYWRhbGxvdycgZmVhdHVyZXMgYXMKCSAgICBuZWVkZWQuIE5vdGUgdGhhdCBmb3Igc29tZSBtZXRob2RzIGRlYWN0aXZhdGluZyB0aGUKCSAgICAndGhyZWFkIGJsb2NrJyBvciAndGhyZWFkIGFsbG93JyBjb2RlIGlzIG5vdCBhbiBvcHRpb24sCgkgICAgc28sIGJlIGNhcmVmdWwuCgkgICAgCgoxMS8yNi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBTV0lHIGxpYnJhcnkgZmlsZXMgdXNlIHN5c3RlbSBhbmdsZSBicmFja2V0cyBldmVyeXdoZXJlIGZvciAlaW5jbHVkZSwgZWcKICAgICAgICAgICAgICAlaW5jbHVkZSAic3RkX2NvbW1vbi5pIgogICAgICAgICAgICBiZWNvbWVzCiAgICAgICAgICAgICAgJWluY2x1ZGUgPHN0ZF9jb21tb24uaT4KCjExLzI2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10KICAgICAgICAgICAgVHlwZXNhZmUgZW51bXMgYW5kIHByb3BlciBlbnVtcyBoYXZlIGFuIGV4dHJhIGNvbnN0cnVjdG9yIHNvIHRoYXQgZW51bSBpdGVtIHZhbHVlcyB0aGF0CiAgICAgICAgICAgIGFyZSBpbml0aWFsaXNlZCBieSBhbm90aGVyIGVudW0gaXRlbSB2YWx1ZSBjYW4gYmUgd3JhcHBlZCB3aXRob3V0IGhhdmluZyB0byB1c2UgJWphdmFjb25zdHZhbHVlLwogICAgICAgICAgICAlY3Njb25zdHZhbHVlIGZvciB3aGVuIHVzaW5nICVqYXZhY29uc3QoMSkvJWNzY29uc3QoMSkuIFN1Z2dlc3Rpb24gYnkKICAgICAgICAgICAgQm9iIE1hcmluaWVyL0RvdWdsYXMgUGVhcnNvbi4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHR5cGVkZWYgZW51bQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB4eXosCiAgICAgICAgICAgICAgICAgbGFzdCA9IHh5egogICAgICAgICAgICAgIH0gcmVwZWF0OwoKMTEvMjEvMjAwNTogbW1hdHVzCgkgICAgW3J1YnkgKyBweXRob25dCgoJICAgIEZpeGVzIGZvciBkaXJlY3RvcnMgKyBwb2ludGVycy4gVGhpcyBpcyBhbiB1Z2x5IHByb2JsZW0gd2l0aG91dCBhbiBlYXN5CgkgICAgc29sdXRpb24uIEJlZm9yZSB3ZSBpZGVudGlmaWVkIHRoaXMgY2FzZSBhcyBwcm9ibGVtYXRpYzoKCgkgICAgICAgICAgdmlydHVhbCBjb25zdCBNeUNsYXNzJiBteV9tZXRob2QoKTsKCiAgICAgICAgICAgIGJ1dCBpdCB0dXJucyBvdXQgdGhhdCBhbGwgdGhlIGNhc2VzIHdoZXJlIGEgcG9pbnRlciwgYXJyYXkgb3IKICAgICAgICAgICAgcmVmZXJlbmNlIGlzIHJldHVybmVkLCBhcmUgcHJvYmxlbWF0aWMsIGV2ZW4gZm9yIAoJICAgIHByaW1pdGl2ZSB0eXBlcyAoYXMgaW50LCBkb3VibGUsIGNoYXIqLCBldGMpLgoKCSAgICBUbyB0cnkgdG8gZml4IHRoZSBpc3N1ZSwgYSBuZXcgdHlwZW1hcCB3YXMgYWRkZWQsCgkgICAgJ2RpcmVjdG9yZnJlZScsIHdoaWNoIGlzIHVzZWQgdG8gJ2ZyZWUnIHRoZSByZXNvdXJjZXMKCSAgICBhbGxvY2F0ZWQgZHVyaW5nIHRoZSAnZGlyZWN0b3JvdXQnIHBoYXNlLiBBdCB0aGUgc2FtZQoJICAgIHRpbWUsIGEgcHJpbWl0aXZlIGdhcmJhZ2UgY29sbGVjdG9yIGVuZ2luZSB3YXMgYWRkZWQgdG8KCSAgICBkZWFsIHdpdGggb3JwaGFuZWQgYWRkcmVzc2VzLCB3aGVuIG5lZWRlZC4KCSAgICAKCSAgICBUaGUgc2l0dWF0aW9uIGlzIG11Y2ggYmV0dGVyIG5vdywgYnV0IHN0aWxsIGl0IGlzIHBvc3NpYmxlIHRvIGhhdmUKCSAgICBtZW1vcnkgZXhoYXVzdGF0aW9uIGlmIHJlY3Vyc2lvbiBpcyB1c2VkLgoKCSAgICBTbywgc3RpbGwgeW91IG5lZWQgdG8gYXZvaWQgcmV0dXJuaW5nIHBvaW50ZXJzLCBhcnJheXMgb3IKCSAgICByZWZlcmVuY2VzIHdoZW4gdXNpbmcgZGlyZWN0b3IgbWV0aG9kcy4KCgkgICAgLSBBZGRlZCBzdGRpbnQuaSAtIHR5cGVtYXBzIGZvciBsYXRlc3QgQzk5IGludGVncmFsIHR5cGVzIGZvdW5kIGluIHN0ZGludC5oLgoJICAgIAoxMS8xNC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBNb3JlIHR5cGVzIGFkZGVkIHRvIHdpbmRvd3MuaSwgZWcgVUlOVDgsIFdPUkQsIEJZVEUgZXRjLiAKICAgICAgICAgICAgSW5jbHVkaW5nIHdpbmRvd3MuaSB3aWxsIGFsc28gZW5hYmxlIFNXSUcgdG8gcGFyc2UgdGhlIF9fZGVjbHNwZWMgTWljcm9zb2Z0CiAgICAgICAgICAgIGV4dGVuc2lvbiwgZWcgX19kZWNsc3BlYyhkbGxpbXBvcnQpLiBBbHNvIG90aGVyIFdpbmRvd3MgY2FsbGluZyBjb252ZW50aW9ucwogICAgICAgICAgICBzdWNoIGFzIF9fc3RkY2FsbC4KCjExLzEwLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIE5ldyBsaWJyYXJ5IGZpbGUgZm9yIFdpbmRvd3MgLSB3aW5kb3dzLmkuIFRoaXMgZmlsZSB3aWxsIGNvbnRhaW4gdXNlZnVsIHR5cGUKICAgICAgICAgICAgaW5mb3JtYXRpb24gZm9yIHVzZXJzIHdobyBpbmNsdWRlIHdpbmRvd3MuaC4gSW5pdGlhbCBzdXBwb3J0IGlzIGZvciB0aGUKICAgICAgICAgICAgbm9uIElTTyBpbnRlZ3JhbCB0eXBlczogX19pbnQ4LCBfX2ludDE2LCBfX2ludDMyLCBfX2ludDY0IGFuZCB1bnNpZ25lZCB2ZXJzaW9ucy4KICAgICAgICAgICAgVGhlIHVuc2lnbmVkIHZlcnNpb25zIHByZXZpb3VzbHkgY291bGQgbm90IGJlIHBhcnNlZCBieSBTV0lHLiAgU0YgIzg3MjAxMy4KCjExLzA5LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gUG9ydGFiaWxpdHkgd2FybmluZyBmb3IgZmlsZXMgd2hpY2ggd2lsbCBvdmVyd3JpdGUgZWFjaCBvdGhlciBvbiBjYXNlCiAgICAgICAgICAgIGluc2Vuc2l0aXZlIGZpbGUgc3lzdGVtcyBzdWNoIGFzIEZBVDMyL05URlMuIFRoaXMgd2lsbCBvY2N1ciwgZm9yIGV4YW1wbGUsIHdoZW4gdHdvCiAgICAgICAgICAgIGNsYXNzIG5hbWVzIGFyZSB0aGUgc2FtZSBiYXJyaW5nIGNhc2UuIFRoZSB3YXJuaW5nIGlzIGlzc3VlZCBvbiBhbGwgcGxhdGZvcm1zIGFuZAogICAgICAgICAgICBjYW4gYmUgc3VwcHJlc3NlZCB3aXRoIHRoZSB1c3VhbCB3YXJuaW5nIHN1cHByZXNzaW9uIHRlY2huaXF1ZXMuIFNGIGJ1ZyAjMTA4NDUwNy4KCjExLzA5LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIC4vY29uZmlndXJlIC0td2l0aC1weXRob24gLS13aXRoLXJ1YnkgLS13aXRoLXBlcmw1IGV0YyBlbmFibGUgdGhlc2UgbGFuZ3VhZ2VzLAogICAgICAgICAgICBpZSB0aGUgLS13aXRoLXh4eHggb3B0aW9ucywgd2hlcmUgbm8gcGF0aCBpcyBzcGVjaWZpZWQsIHdvcmsgdGhlIHNhbWUgYXMgaWYgCiAgICAgICAgICAgIHRoZSBvcHRpb24gd2FzIG5vdCBzcGVjaWZpZWQgYXQgYWxsLiBCYXNlZCBvbiBwYXRjaGVzICMxMzM1MDQyICMxMzI5MDQ4ICMxMzI5MDQ3LgoKMTEvMDkvMjAwNTogZGFuY3kKCgkgICAgW0FsbGVncm9jbF0KCSAgICBBZGQgQysrIHN1cHBvcnQgdG8gdGhlIEFsbGVncm9jbCBtb2R1bGUuIEZ1cnRoZXIKCSAgICBlbmhhbmNlcyB0aGUgQyBzdXBwb3J0IGFzIHdlbGwuIFNvbWUgb2YgdGhlCgkgICAgZmVhdHVyZXM6CgoJICAgIC0gTVVDSCBiZXR0ZXIgZ2VuZXJhdGlvbiBvZiBmb3JlaWduIHR5cGVzIGJhc2VkIG9uCgkgICAgdGhlIEMvQysrIHR5cGVzIGZvciB1c2UgaW4gZGVmaW5pbmcgdGhlIEZGSSBvbgoJICAgIHRoZSBsaXNwIHNpZGUuIFdlIGRvbid0IHBhc3MgZXZlcnl0aGluZyBhcyBhICgqIDp2b2lkKQoJICAgIGFueSBsb25nZXIuCgoJICAgIC0gVXNlcyB0eXBlbWFwcyBmb3IgYmV0dGVyIGNvbnRyb2wgb2YgdHlwZSBjb252ZXJzaW9ucwoJICAgIGFuZCBjb2RlIGdlbmVyYXRpb24gaW4gdGhlIGdlbmVyYXRlZCBsaXNwIGFuZCBjKysgd3JhcHBlcgoJICAgIGNvZGUuCgoJICAgIC0gQ0xPUyB3cmFwcGluZyBvZiBwb2ludGVycyByZXR1cm5lZCBmcm9tIGZvcmVpZ24gc3BhY2UKCSAgICBtYWtlcyBpdCBlYXNpZXIgdG8gZGlmZmVyZW50aWF0ZSBwb2ludGVycyBpbiB1c2VyIGNvZGUuCgkgICAgVGhlIHdyYXBwaW5nIG9iamVjdHMgY2FuIGJlIHBhc3NlZCBkaXJlY3RseSB0byBGRiBjYWxscy4KCgkgICAgLSBEZWZ1biB3cmFwcGluZyBvZiBGRiBjYWxscywgYWxsb3dpbmcgZm9yIG1vcmUgbGlzcHkKCSAgICBpbnRlcmZhY2UuIENvbnZlcnNpb24sIEdDaW5nLCBvZiBsaXNwIG9iamVjdHMgdG8gCgkgICAgZm9yZWlnbiBvYmplY3RzIGNhbiBiZSBkb25lIGluIHRoZSB3cmFwcGluZyBkZWZ1biB2aWEKCSAgICB0aGUgdXNlIG9mIHR5cGVtYXBzLgoJICAgIAoJICAgIC0gb3ZlcmxvYWQgZGlzcGF0Y2hpbmcgaW1wbGVtZW50ZWQgb24gdGhlIGxpc3Agc2lkZQoJICAgIHVzaW5nIGdlbmVyaWMgZnVuY3Rpb25zLgoKCSAgICAtIFRlbXBsYXRlcyBhbmQgc3lub255bW91cyB0eXBlcyBzdXBwb3J0ZWQuCgoxMS8wNy8yMDA1OiBtbWF0dXMKCgkgICAgW1B5dGhvbl0gQWRkaW5nIHByb3BlciBzdXBwb3J0IGZvciBtdWx0aS1pbmhlcml0YW5jZSBpbgoJICAgIHRoZSBweXRob24gc2lkZSwgaWUsIGlmIHlvdSBoYXZlIHR3byBDKysgd3JhcHBlZCBjbGFzcywgRm9vCgkgICAgYW5kIEJhciwgbm93OgoKCSAgICAgICBjbGFzcyBNeVB5dGhvbkNsYXNzKEZvbyxCYXIpOgoJICAgICAgICAgIC4uLi4KCiAgICAgICAgICAgIHdpbGwgcHJvcGVybHkgd29yaywgZXZlbiB3aXRoIGRpcmVjdG9ycywgYW5kIHRoZQogICAgICAgICAgICBkZWFsbG9jYXRpb24gb2YgRm9vLnRoaXMgYW5kIEJhci50aGlzIHdpbGwgZm9sbG93CiAgICAgICAgICAgIGNvcnJlY3RseS4gQmVmb3JlLCBhIGNsYXNzIGNvdWxkIG9ubHkgaGF2ZSBvbmUgJ3RoaXMnCiAgICAgICAgICAgIGluc3RhbmNlICh1bmxpa2UgQysrKSwgb25seSB0aGUgbGFzdCBiYXNlIGNsYXNzIHdhcwogICAgICAgICAgICBwcm9wZXJseSBkZWxldGVkLCBvciBkZXRlY3RlZCB3aXRoIGRpcmVjdG9ycy4KCgkgICAgTm93ICdzZWxmLnRoaXMnIGNhbiBiZSBhIGxpc3QsIHdoaWNoIHdpbGwgY29udGFpbiB0aGUgQysrCgkgICAgaW5zdGFuY2UgcG9pbnRlcnMgZm9yIGFsbCB0aGUgYmFzZSBjbGFzc2VzLgoJICAgIAoJICAgIEFsc28sIHN3aWcudGhpcyBpcyByZXNwb25zaWJsZSBmb3IgZGVhbGxvY2F0aW5nIHRoZSBDKysKCSAgICBpbnN0YW5jZShzKSwgYW5kIHRoZSBfX2RlbF9fIG1ldGhvZCBpcyBub3QgZW1pdHRlZCB1bmxlc3MKCSAgICB0aGUgdXNlciBwcmVwcGVuZC9hcHBlbmQgc29tZSBjb2RlIHRvIGl0LgoKCSAgLSBTd2lnIGNhbiBub3cgZGV0ZWN0IG1lbW9yeSBsZWFrcywgaWUsIGlmIHlvdSBzdGlsbAoJICAgIGRvbid0IHVzZSBwcm94eS9zaGFkb3cgY2xhc3NlcywgYW5kIHR5cGUgc29tZXRoaW5nIGxpa2UKCSAgICAKCSAgICAgICAgIGltcG9ydCBfZXhhbXBsZQoJICAgICAgICAgZiA9IF9leGFtcGxlLm5ld19Gb28oKQoKCSAgICBhbmQgZm9yZ2V0IHRvIGNhbGwgX2V4YW1wbGUuZGVsZXRlX0ZvbyhmKSwgdGhlbiBzd2lnIHdpbGwKCSAgICB0ZWxsIHlvdSB0aGF0IHRoZXJlIGlzIGEgbWVtb3J5IGxlYWsuCgoJICAgIE90aGVyd2lzZSwgaWYgeW91IGFsd2F5cyB1c2UgdGhlIHByb3h5IGNsYXNzZXMsIHlvdSBwcm9iYWJseQoJICAgIHlvdSB3aWxsIG5ldmVyIGV2ZXIgc2VlIHRoaXMgd2FybmluZyB1bmxlc3MgdGhlcmUgaXMKCSAgICBzb21ldGhpbmcgd3JvbmcgaW5zaWRlIHRoZSBzd2lnIHdyYXBwaW5nIGNvZGUuCgkgICAgICAgCgkKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgkgICAgCgkgICAgSWYgeW91IG92ZXJsb2FkZWQgdGhlIF9fZGVsX18gbWV0aG9kLCBhbmQgY2FsbCB0aGUgYmFzZQoJICAgIG9uZQkgd2l0aG91dCBhIHRyeSBibG9jaywgYXMgaW4KCgkgICAgICAgICAgIGNsYXNzIE15Q2xhc3MoU3dpZ0NsYXNzKToKCgkgICAgICAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgoJCSAgICAgICAgICA8eW91ciBjb2RlIGhlcmU+CgkJICAgICAgICAgIFN3aWdDbGFzcy5fX2RlbF9fKHNlbGYpCgkJCSAgCiAgICAgICAgICAgIHB5dGhvbiBjb3VsZCBjb21wbGFpbiB0aGF0IHRoZSBtZXRob2QgU3dpZ0NsYXNzLl9fZGVsX18gaXMKICAgICAgICAgICAgdW5kZWZpbmVkLiBUcnkgdG8gdXNlIGluc3RlYWQ6CgkgICAgCgkgICAgICAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgoJCSAgICAgICAgICA8eW91ciBjb2RlIGhlcmU+CgkJICAgICAgICAgIHRyeTogU3dpZ0NsYXNzLl9fZGVsX18oc2VsZikKCQkJICBleGNlcHQ6IHBhc3MKCgkgICAgb3Igc2ltcGx5IAkJICAKCgkgICAgICAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgoJCSAgICAgICAgICA8eW91ciBjb2RlIGhlcmU+CgoxMS8wMi8yMDA1OiBtbWF0dXMKCgkgICAgW1B5dGhvbl0gQWRkaW5nIG1vcmUgZnVuIHRvIFNUTC9TVEQgY29udGFpbmVycywgbm93IHlvdQoJICAgIGNhbiBkbwoKCSAgICAgICAldGVtcGxhdGUocHlzZXQpIHN0ZDo6c2V0PFB5T2JqZWN0ICo+OwkJCgkgICAgICAgJXRlbXBsYXRlKHB5dmVjdG9yKSBzdGQ6OnZlY3RvcjxQeU9iamVjdCAqPjsJCgkgICAgICAgJXRlbXBsYXRlKCkgc3RkOjpwYWlyPFB5T2JqZWN0ICosUHlPYmplY3QgKj47CQoJICAgICAgICV0ZW1wbGF0ZShweXZlY3Rvcikgc3RkOjptYXA8UHlPYmplY3QgKixQeU9iamVjdCAqPjsKCSAgICAgICAuLi4uCgoJICAgIFRoZSBzYW1lICBhcHBsaWVzIHRvIHN0ZDo6bGlzdCwgc3RkOjpkZXF1ZSwgc3RkOjptdWx0aXNldCwgZXRjLgoKCSAgICBUaGVuLCBhdCB0aGUgcHl0aG9uIHNpZGUgeW91IGNhbiBkbyBub3c6CgoJICAgICAgICMgQysrIHN0ZDo6dmVjdG9yIGFzIG5hdGl2ZSBweXRob24gc2VxdWVuY2UKCSAgICAgICB2ID0gcHl2ZWN0b3IoWzEsImhlbGxvIiwoMSwyKV0pCgkgICAgICAgcHJpbnQgdlsxXQoJICAgICAgID4+ICdoZWxsbycKCSAgICAgICBwcmludCB2WzJdCgkgICAgICAgPj4gKDEsMikKCSAgICAgICAJCQkJCSAgIAoJICAgICAgICMgQysrIHN0ZDo6c2V0IGFzIG5hdGl2ZSBweXRob24gc2VxdWVuY2UKCSAgICAgICBzID0gcHlzZXQoKQkJCSAgIAoJICAgICAgIHMuaW5zZXJ0KCgxLDIpKQkJICAgCgkgICAgICAgcy5pbnNlcnQoMSkJCQkgICAKCSAgICAgICBzLmluc2VydCgiaGVsbG8iKQoJICAgICAgIHN1bT0oKQoJICAgICAgIGZvciBpIGluIHM6CgkgICAgICAgICBzdW0gKz0oaSwpCgkgICAgICAgcHJpbnQgc3VtCgkgICAgICAgPj4+ICgxLCAnaGVsbG8nLCAoMSwgMikpCgkgICAgICAgCQkJCSAgIAoJICAgICAgICMgQysrIHN0ZDo6bWFwIGFzIG5hdGl2ZSBweXRob24gc2VxdWVuY2UKCSAgICAgICBtID0gcHltYXAoKQkJCSAgIAoJICAgICAgIG1bImZvbyJdID0gImhlbGxvIgkJICAgCgkgICAgICAgbVsxXSA9ICgxLDIpCgkgICAgICAgcG0gPSB7fQoJICAgICAgIGZvciBrIGluIG06CSAgICAJICAgCgkgICAgICAgICBwbVtrXSA9IG1ba10KCSAgICAgICBwcmludCBwbQoJICAgICAgID4+PiB7MTogKDEsIDIpLCAnZm9vJzogJ2hlbGxvJ30KCgkgICAgaWUsIHRoZSBTVEQvU1RMIGNvbnRhaW5lcnMgd29yayBhcyByZWFsIG5hdGl2ZSBweXRob24KCSAgICBjb250YWluZXIsIHdpdGggYXJiaXRyYXJ5IGl0ZW0gdHlwZXMgYW5kIHNvLgoKCSAgICBCdXQgc2luY2Ugbm9ybWFsIEMrKyBjb250YWluZXJzIGRvIG5vdCBwcm9wZXJseSByZWYvdW5yZWYKCSAgICB0aGVpciBpdGVtcywgeW91IHNob3VsZCB1c2UgdGhlIHNhZmVyIHZlcnNpb25zOgoJICAgIAoJICAgICAgJXRlbXBsYXRlKHB5c2V0KSBzdGQ6OnNldDxzd2lnOjpQeU9iamVjdF9wdHI+OwoJICAgICAgJXRlbXBsYXRlKHB5dmVjdG9yKSBzdGQ6OnZlY3Rvcjxzd2lnOjpQeU9iamVjdF9wdHI+OwoJICAgICAgJXRlbXBsYXRlKCkgc3RkOjpwYWlyPHN3aWc6OlB5T2JqZWN0X3B0ciwgc3dpZzo6UHlPYmplY3RfcHRyPjsKCSAgICAgICV0ZW1wbGF0ZShweXZlY3Rvcikgc3RkOjptYXA8c3dpZzo6UHlPYmplY3RfcHRyLHN3aWc6OlB5T2JqZWN0X3B0cj47CgkgICAgICAuLi4uCgoJICAgIHdoZXJlIHN3aWc6OlB5T2JqZWN0X3B0ciBpcyBhIFB5T2JqZWN0ICogZW52ZWxvcGUgY2xhc3MgcHJvdmlkZWQKCSAgICB0byBzYWZlbHkgaW5jcmVmL2RlY3JlZiB0aGUgcHl0aG9uIG9iamVjdC4gCgkgICAgCgkgICAgU28sIG5vdyB5b3UgY2FuIHVzZSBhbGwgdGhlIFNUTC9TVEQgY29udGFpbmVycyBhcyBuYXRpdmUKCSAgICBQeXRob24gY29udGFpbmVycy4gCgoJICAgIE5vdGUgMTogc3RkOjptYXAsIHN0ZDo6c2V0IGFuZCB0aGUgb3RoZXIgJ29yZGVyZWQnCgkgICAgY29udGFpbmVycyB3aWxsIHByb3Blcmx5IHVzZSBQeU9iamVjdF9Db21wYXJlIGZvciBzb3J0aW5nLAoJICAgIHdoZW4gbmVlZGVkLgoKCSAgICBOb3RlIDI6IGFsbCB0aGUgU1RML1NURCBjb250YWluZXJzIGhhdmUgYSBsaW1pdCBzaXplIG9mCgkgICAgU0laRV9NQVgsIGllLCB5b3UgY2FuIGhhdmUgbWFuYWdlIGNvbnRhaW5lcnMgbGFyZ2VyIHRoYW4KCSAgICBJTlRfTUFYLCB0aGUgcHl0aG9uIGxpbWl0LgoJICAgIAoJICAgICAgCjExLzAyLzIwMDU6IG1tYXR1cwoKCSAgICBbUHl0aG9uXQoJICAgIC0gYWRkICdpdGVyYXRvcigpJyBtZXRob2QgZm9yIGFsbCBzZXF1ZW5jZXMgYW5kIGFkZGl0aW9uYWxseQoJICAgICAgJ2tleV9pdGVyYXRvcigpJyBmb3IgbWFwcy4KCgkgICAgICAnaXRlcmF0b3IoKScgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBuYXRpdmUgQysrIGl0ZXJhdG9yLgoJICAgICAgQWRkaXRpb25hbGx5LCBpbiBtYXBzLCAna2V5X2l0ZXJhdG9yKCknIHdpbGwgcmV0dXJuIGEgcHl0aG9uCgkgICAgICBpdGVyYXRvciB1c2luZyBvbmx5IHRoZSBtYXAga2V5cy4KCSAgICAgIAoJICAgICAgSW4gZ2VuZXJhbCB0aGUgc2VxdWVuY2UgbWV0aG9kIF9faXRlcl9fIHdpbGwgY2FsbAoJICAgICAgJ2l0ZXJhdG9yKCknLCByZXR1cm5pbmcgdGhlIG5hdGl2ZSBDKysgaXRlcmF0b3IsIGJ1dCBpbgoJICAgICAgbWFwcyBpdCB3aWxsIGNhbGwgJ2tleV9pdGVyYXRvcigpJywgbWFpbnRhaW5pbmcKCSAgICAgIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCgoJICAgICAgSGVuY2UsIGZvciBzdGQ6Om1hcHMsIHlvdSBjYW4gcGxheSB0aGVuIHdpdGggdGhlIG5hdGl2ZQoJICAgICAgQysrIGl0ZXJhdG9yLCB3aGljaCB2YWx1ZSBpcyBhIChrZXksIHZhbHVlKSBwYWlyLCBieQoJICAgICAgY2FsbGluZyBtYXAuaXRlcmF0b3IoKSwgYXMgd2l0aCBtYXAuYmVnaW4oKSwgbWFwLmVuZCgpLCBldGMuCgoJICAgICAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCBtYXAuaXRlcmF0b3IoKSByZXR1cm5zIGEgc2FmZQoJICAgICAgJ2Nsb3NlZCcgaXRlcmF0b3IsIHdoaWxlIG1hcC5iZWdpbigpIGFuZCBtYXAuZW5kKCkgYXJlCgkgICAgICAnb3BlbicgaXRlcmF0b3JzLgoKCSAgICAgIEEgJ2Nsb3NlZCcgaXRlcmF0b3Iga25vd3MgdGhlIGJlZ2luIGFuZCB0aGUgZW5kIG9mIHRoZQoJICAgICAgc2VxdWVuY2UsIGFuZCBpdCBuZXZlciBjYW4gc2VnLiBmYXVsdC4gQW4gJ29wZW4nCgkgICAgICBpdGVyYXRvciwgYXMgaW4gQysrLCBjYW4gc2VnLiBmYXVsdCBhdCB0aGUgQysrIHNpZGUuCgoJICAgICAgICAgIyBhIGNsb3NlZCBpdGVyYXRvciBpcyBzYWZlIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZS4KCQkgIyB0aGUgbmV4dCgpIG1ldGhvZCB3aWxsIHRocm93IGEgU3RvcEl0ZXJhdGlvbgoJICAgICAgICAgIyBleGNlcHRpb24gYXMgbmVlZGVkCgkKCSAgICAgICAgIGkgPSBzZXEuaXRlcmF0b3IoKQoJCSB0cnk6CiAgICAgICAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgoJCSAgICAgICAgc3VtICs9IGkubmV4dCgpCgkJIGV4Y2VwdDogcGFzcwoJCSAKCQkgIyBhbiBvcGVuIGl0ZXJhdG9yIGFsd2F5cyBuZWVkIHRvIGJlIGNoZWNrZWQsCgkJICMgb3IgaXQgd2lsbCBjcmFzaCBhdCB0aGUgQysrIHNpZGUKCgkgICAgICAgICBjdXJyZW50ID0gc2VxLmJlZ2luKCkKICAgICAgICAgICAgICAgICBlbmQgPSBzZXEuZW5kKCkKCQkgd2hpbGUgKGN1cnJlbnQgIT0gZW5kKToKCQkgICAgc3VtICs9IGN1cnJlbnQubmV4dCgpCgkgICAgICAKCSAgICAgIAoJICAgIFtQeXRob25dCgkgICAgLSBGaW5hbGx5LCB3aGVuIHdlIGNhbGwgCgoJICAgICAgICBmID0gRm9vKCkKCgkgICAgICB0aGUgY29uc3RydWN0aW9uIGlzICdvbmUtd2F5Jy4gQmVmb3JlIGNvbnN0cnVjdGlvbiAgd2FzIGRvbmUKCSAgICAgIHNvbWV0aGluZyBsaWtlCgoJICAgICAgICAgIEZvbygpIChweXRob24pIC0+IF9uZXdfRm9vKCkgKEMrKykgCiAgICAgICAgICAgICAgICAgIG5ld19Gb28oKSAoQysrKSAtPiBGb29QdHIoKSAocHl0aG9uKSAKICAgICAgICAgICAgICAgICAgRm9vUHRyKCkgKHB5dGhvbikgLT4gRm9vKCkgKHB5dGhvbikKCiAgICAgICAgICAgICAgYW5kIHJldHVybmluZyBhIHBvaW50ZXIgd2FzIGRvbmUgbGlrZQoKICAgICAgICAgICAgICAgICAgTmV3UG9pbnRlck9iaigpIChDKyspIC0+IEZvb1B0cigpIChweXRob24pCiAgICAgICAgICAgICAgICAgIEZvb1B0cihweXRob24pIC0+IEZvbygpIChweXRob24pCiAgICAgICAgICAgICAgICAgIAkJICAKCgkgICAgICBpZSwgd2Ugd2hlbiBnb2luZyBiYWNrIGFuZCBmb3J3YXJkIGJldHdlZW4gdGhlIEMrKyBhbmQKCSAgICAgIHB5dGhvbiBzaWRlLgoKCSAgICAgIE5vdyBzaW5jZSB0aGVyZSBpcyBubyBGb29QdHIgdGhlIGNvbnN0cnVjdGlvbiBwcm9jZXNzIGlzCgoJICAgICAgICAgIEZvbygpIChweXRob24pIC0+IF9uZXdfRm9vKCkgKEMrKykKICAgICAgICAgICAgICAgICAgX25ld19Gb28oKSAoQysrKSAtPiBOZXdQb2ludGVyT2JqKCkgKEMrKykgKG5vIHNoYWRvdyBjbGFzcykKCiAgICAgICAgICAgICAgYW5kIHJldHVybmluZyBhIHBvaW50ZXIgaXMgZG9uZQoKICAgICAgICAgICAgICAgICAgTmV3UG9pbnRlck9iaigpIChDKyspICh3aXRoIHNoYWRvdyBjbGFzcykgLT4gTmV3SW5zdGFjZU9iaigpIChDKyspCgoJICAgICAgd2hlcmUgTmV3SW5zdGFuY2VPYmogY3JlYXRlcyBhIG5ldyBpbnN0YW5jZSB3aXRob3V0CgkgICAgICBjYWxsaW5nIF9faW5pdF9fIGFuZCBpdCBkb2Vzbid0IGdvICdiYWNrJyB0byBweXRob24sIGlzCgkgICAgICAncHVyZScgQyBBUEkuCgoJICAgICAtIFdpdGggdGhpcyBjaGFuZ2UsIGFuZCB0aGUgb3RoZXIgb25lcyBpbiB0aGUKICAgICAgICAgICAgICAgUHlTd2lnT2JqZWN0IHR5cGUsIHdoaWNoIG5vdyBjYXJyaWVzIHRoZSB0aGlzb3duIGFuZAogICAgICAgICAgICAgICBzd2lnX3R5cGVfaW5mbyBwb2ludGVyLCB0aGUgZ2VuZXJhdGVkIGNvZGUgc2hvdWxkIGJlIGFzCiAgICAgICAgICAgICAgIGZhc3QgYXMgYm9vc3Q6OlB5dGhvbiBhbmQvb3IgdGhlIG90aGVyIHB5dGhvbiB3cmFwcGVycwogICAgICAgICAgICAgICBiYXNlZCBpbiBwdXJlIFB5dGhvbi9DIEFQSSBjYWxscy4KCgkgICAgICAgQXMgYSByZWZlcmVuY2UsIHRoZSBwcm9maWxldGVzdF9ydW5tZS5weSBleGFtcGxlLCB3aGljaAoJICAgICAgIGRvZXMgYSBzaW1wbGUgY2FsbCBmdW5jdGlvbiBtYW55IHRpbWVzLCBzdWNoIGFzIHRoaXMgY29kZToKCiAgICAgICAgICAgICAgICAgICAgaW1wb3J0IHByb2ZpbGV0ZXN0ICAgICAgIAoJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgkJICAgIGEgPSBwcm9maWxldGVzdC5BKCkgICAgICAKCQkgICAgYiA9IHByb2ZpbGV0ZXN0LkIoKSAgICAgIAoJCSAgICBmb3IgaSBpbiByYW5nZSgwLDEwMDAwMDApCgkgICAgICAgICAgICAgIGEgPSBiLmZuKGEpICAgICAgICAgICAgCgoKCSAgICAgICB3aGVyZSBmbiBpcyBkZWZpbmVkIGFzICdBKiBCOjpmbihBICphKSB7cmV0dXJuIGE7fScsCgkgICAgICAgcHJvZHVjZXMgIHRoZSBmb2xsb3dpbmcgdGltZXMKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub21vZGVybiAgICBtb2Rlcm4KCSAgICAgICAgIHN3aWctMS4zLjI2ICAgIDE5LjcwcyAgICAgIDUuOThzCiAgICAgICAgICAgICAgICAgc3dpZy1DVlMgICAgICAgIDAuOTlzICAgICAgMC45OHMKCSAgICAgICAKCgkgICAgICAgQ2xlYXJseSwgdGhlcmUgaXMgYSBsYXJnZSBpbXByb3ZlbWVudCBmb3IgdGhlIHB5dGhvbgoJICAgICAgICdub21vZGVybicgbW9kZS4gU3RpbGwsIHRoZSAnbW9kZXJuJyBtb2RlIGlzIGFyb3VuZAoJICAgICAgIDYgdGltZXMgZmFzdGVyIHRoYW4gYmVmb3JlLiBGb3IgdGhlIHNhbWUgdGVzdCwgYnV0CgkgICAgICAgdXNpbmcgdGhlIG5vbi1zaGFkb3cgdmVyc2lvbiBvZiB0aGUgbW9kdWxlLCB3ZSBnZXQKCgkgICAgICAgICAgICAgICAgICAgICAgIF9wcm9maWxldGVzdCAobm9uLXNoYWRvdykKCSAgICAgICAgIHN3aWctMS4zLjI2ICAgICAwLjgwcyAKICAgICAgICAgICAgICAgICBzd2lnLUNWUyAgICAgICAgMC42MHMgCgoJICAgICAgIEhlbmNlLCBub3cgZm9yIHByYWN0aWNhbCBwdXJwb3NlcywgdGhlIHByb3h5IG92ZXJoZWFkCgkgICAgICAgaXMgaW5zaWduaWZpY2FudC4KCgkgICAgICAgTm90ZSB0aGF0IHRoZSBwZXJmb3JtYW5jZSBudW1iZXJzIHdlIGFyZSBzaG93aW5nIGlzIGZvcgoJICAgICAgIGEgc2ltcGxlIG1vZHVsZSAodHdvIHR5cGVzKSBhbmQgYSBzaW1wbGUgZnVuY3Rpb24gKG9uZQoJICAgICAgIGFyZ3VtZW50KS4gRm9yIHJlYWwgc2l0dWF0aW9ucywgZm9yIG1vZHVsZXMgd2l0aCBtYW55CgkgICAgICAgbW9yZSB0eXBlcyBhbmQvb3IgZnVuY3Rpb25zIHdpdGggbWFueSBtb3JlIHBhcmFtZXRlcnMsCgkgICAgICAgeW91IHdpbGwgc2VlIGV2ZW4gYmV0dGVyIHJlc3VsdHMuCgkgICAgICAgCgkJICAJICAgICAgCjEwLzMxLzIwMDU6IG1tYXR1cwoJICAgIFtQeXRob25dCgoJICAgIC0gRmluYWxseSwgbm8gbW9yZSBDbGFzc1B0ciBwcm94eSBjbGFzc2VzLiBZb3Ugd2lsbCBzZWUKCSAgICAgIG9ubHkgYSBjbGVhbiBDbGFzcyBwcm94eSBjbGFzcyBpbiB0aGUgLnB5IGZpbGUuCgoJICAgIC0gTm8gbW9yZSAncmVhbCcgdGhpc293biBhdHRyaWJ1dGUgZWl0aGVyLCB0aGUgUHlTd2lnT2JqZWN0IG5vdwogICAgICAgICAgICAgIGNhcnJpZXMgdGhlIG93bmVyc2hpcCBpbmZvLgoKCSAgICAgIFlvdSBjYW4gYWxzbyBkbyBzb21ldGhpbmcgbGlrZQoKCSAgICAgICAgICBwcmludCBzZWxmLnRoaXMub3duKCkgCgkJICA+Pj4gVHJ1ZQoJCSAgCgkJICBzZWxmLnRoaXMuZGlzb3duKCkKCQkgIHNlbGYudGhpcy5vd24oMCkKCSAgICAgICAgICBwcmludCBzZWxmLnRoaXMub3duKCkgCgkJICA+Pj4gRmFsc2UJCSAgCgoJCSAgc2VsZi50aGlzLmFjcXVpcmUoKQoJCSAgc2VsZi50aGlzLm93bigxKQoJICAgICAgICAgIHByaW50IHNlbGYudGhpcy5vd24oKSAKCQkgID4+PiBUcnVlCgoJICAgICAgU3RpbGwgdGhlIG9sZCB3YXksCgkgICAgICAKCSAgICAgICAgICBwcmludCBzZWxmLnRoaXNvd24KCQkgID4+PiBUcnVlCgoJCSAgc2VsZi50aGlzb3duID0gMAoJICAgICAgICAgIHByaW50IHNlbGYudGhpc293bgoJCSAgPj4+IEZhbHNlCQkgIAoKCQkgIHNlbGYudGhpc293biA9IDEKCSAgICAgICAgICBwcmludCBzZWxmLnRoaXNvd24KCQkgID4+PiBUcnVlCgogICAgICAgICAgICAgIGlzIHN1cHBvcnRlZCwgYW5kIHB5dGhvbiBkaXNwYXRjaGVzIHRoZSBwcm9wZXIgbWV0aG9kCiAgICAgICAgICAgICAgY2FsbHMgYXMgbmVlZGVkLiAJCSAgCgkgICAgICAgCgoJICAgIC0gU3VwcG9ydCBmb3IgaXRlcmF0b3JzIGluIFNUTC9TVEQgY29udGFpbmVycywgZm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlCgogICAgICAgICAgICAgICAgICAgICV0ZW1wbGF0ZTxzZXRfc3RyaW5nPiBzdGQ6OnNldDxzdGQ6OnN0cmluZz47CgkgICAgICAgICAgCiAgICAgICAgICAgICAgIHlvdSBjYW4gdXNlIHRoZSBDKysgaXRlcmF0b3JzIGFzOiAgCgogICAgICAgICAgICAgICAgICAgICBzID0gc2V0X3N0cmluZygpCgkJICAgICAgICAgICAgICAgICAgICAgCgkJICAgICBzLmFwcGVuZCgiYyIpICAgCgkJICAgICBzLmFwcGVuZCgiYSIpICAgCgkgICAgICAgICAgICAgcy5hcHBlbmQoImIiKQoKICAgICAgICAgICAgICAgICAgICAgYiA9IHMuYmVnaW4oKSAgICAgIAoJCSAgICAgZSA9IHMuZW5kKCkgICAgICAgIAoJCSAgICAgc3VtID0gIiIgICAgICAgICAgIAoJCSAgICAgd2hpbGUgKGIgIT0gZSk6ICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgc3VtICs9IGIubmV4dCgpICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgcHJpbnQgc3VtCgogICAgICAgICAgICAgICAgICAgICA+Pj4gImFiYyIgCgoJCWFkdmFuY2UgdGhlIGl0ZXJhdG9yIGFzIGluIEMrKwoKICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHMuYmVnaW4oKSAgICAgIAoJCSAgICAgY3VycmVudCArPSAxCiAgICAgICAgICAgICAgICAgICAgIHByaW50IGN1cnJlbnQudmFsdWUoKQoJCSAgICAgPj4+ICJiIgoJCSAgICAgCgkJbm93IHVzaW5nIHRoZSByZXZlcnNlIG9wZXJhdG9ycwoKICAgICAgICAgICAgICAgICAgICAgYiA9IHMucmJlZ2luKCkgICAgICAKCQkgICAgIGUgPSBzLnJlbmQoKSAgICAgICAgCgkJICAgICBzdW0gPSAiIiAgICAgICAgICAgCgkJICAgICB3aGlsZSAoYiAhPSBlKTogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gKz0gYi5uZXh0KCkgICAgICAgIAogICAgICAgICAgICAgICAgICAgICBwcmludCBzdW0KCiAgICAgICAgICAgICAgICAgICAgID4+PiAiY2JhIiAKCgkgICAgICAgIG9yIHRoZSAncHJldmlvdXMnIG1ldGhvZAoKICAgICAgICAgICAgICAgICAgICAgYiA9IHMuYmVnaW4oKSAgICAgIAoJCSAgICAgZSA9IHMuZW5kKCkgICAgICAgIAoJCSAgICAgc3VtID0gIiIgICAgICAgICAgIAoJCSAgICAgd2hpbGUgKGIgIT0gZSk6ICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgc3VtICs9IGUucHJldmlvdXMoKQogICAgICAgICAgICAgICAgICAgICBwcmludCBzdW0KCiAgICAgICAgICAgICAgICAgICAgID4+PiAiY2JhIiAKCiAgICAgICAgICAgICAgICBvciBqdXN0IGFzIGluIGEgcHl0aG9uIGZhc2hpb24KCiAgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHM6CiAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gKz0gaSAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgTm90ZSAxOiBJdGVyYXRvcnMgaW4gQysrIGFyZSB2ZXJ5IHBvd2VyZnVsLCBidXQKICAgICAgICAgICAgICAgIGRhbmdlcm91cyB0b28uIEFuZCBpbiBweXRob24geW91IGNhbiBzaG9vdCB5b3Vyc2VsZiBpbiB0aGUgZm9vdAogICAgICAgICAgICAgICAganVzdCBsaWtlIGluIEMrKywgc28sIGJlIGNhcmVmdWwuCgkJCgkJTm90ZSAyOiB0aGUgaXRlcmF0b3JzIGFyZSAnbGlnaHQnLCBpZSwgdGhleSBkbyBub3QKCQljb252ZXJ0IHNlcXVlbmNlIGVsZW1lbnRzIHVudGlsIHlvdSByZXF1ZXN0IHRvIGRvIHNvLCB2aWEKCQluZXh0KCksIHZhbHVlKCkgb3IgcHJldmlvdXMoKS4gSWYgeW91IGp1c3QgaW5jcmVtZW50L2RlY3JlbWVudCBvbmUKCQlubyBjb252ZXJzaW9uIGlzIHBlcmZvcm1lZCwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIGIgPSBzLmJlZ2luKCkgICAgICAKCSAgICAgICAgICAgICBiICs9IDEKICAgICAgICAgICAgICAgICAgICAgYi5pbmNyKCkKICAgICAgICAgICAgICAgICAgICAgYi5pbmNyKDIpCgkJICAgICBiLmRlY3IoMikKICAgICAgICAgICAgICAgICAgICAgYi5kZWNyKCkKICAgICAgICAgICAgICAgICAgICAgYiAtPSAxCgoJCSBvbmx5IHRoZSBpdGVyYXRvciBpcyBtb2RpZmllZCwgYW5kIG5vdCB2YWx1ZSB3cmFwcGVyCgkJIGlzIGdlbmVyYXRlZC4gT3RoZXIgdHlwaWNhbCBDKysgb3BlcmF0aW9ucyBhcmUgYWxzbyAKCQkgYXZhaWxhYmxlLCBzdWNoIGFzOgoKCQkgICAgIHByaW50IHMuZW5kKCkgLSBzLmJlZ2luKCkKCQkgICAgID4+PiAzCgkJICAgICBmID0gcy5iZWdpbigpICsgMQoJCSAgICAgcHJpbnQgZi52YWx1ZSgpCgkJICAgICA+Pj4gImIiCgkJICAgICBsID0gcy5lbmQoKSAtIDEKCQkgICAgIHByaW50IGwudmFsdWUoKQoJCSAgICAgPj4+ICJjIgoJCSAKCQkgZXRjLiAgT2YgY291cnNlLCB0aGUgJ2ZpbmQnLCAnaW5zZXJ0JywgJ2VyYXNlJywgYW5kCgkJIHNvIG9uIG1ldGhvZHMgYWxzbyBzdXBwb3J0cyBpdGVyYXRvcnMgbm93LCBpZToKCgkJICAgICAgaSA9IHMuYmVnaW4oKQoJCSAgICAgIGkgKz0gMQoJCSAgICAgIHMuZXJhc2UoaSkKICAgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHM6CiAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gKz0gaQoJCSAgICAgIHByaW50IHN1bQoJCSAgICAgID4+PiAiYWMiCgkJICAgICAgCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKCSAgICBUaGVyZSBpcyBubyBtb3JlICd0aGlzb3duJyBhdHRyaWJ1dGUuIElmIHlvdSB1c2UgaXQsIHB5dGhvbgoJICAgIHdpbGwgdHJhbnNsYXRlIHRoZSBmb2xsb3dpbmcgY29kZSBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgIGlmIChzZWxmLnRoaXNvd24pOiAgID09PiAgIGlmIChzZWxmLnRoaXMub3duKCkpOgoJCXNlbGYudGhpc293biA9IDEgICAgID09PiAgIHNlbGYudGhpcy5vd24oMSkKICAgICAgICAgICAgICAgIHNlbGYudGhpc293biA9IDAgICAgID09PiAgIHNlbGYudGhpcy5vd24oMCkKCgkgICAgU3RpbGwsIG1heWJlIGluIHNvbWUgdW51c3VhbCBjYXNlcyB0aGUgdHJhbnNsYXRpb24gd2lsbCBub3QgYmUKCSAgICAxMDAlIGNvcnJlY3QsIHNvIGlmIHlvdSBoYXZlIGEgcHJvYmxlbSwgcGxlYXNlIHJlcG9ydCBpdAoJICAgIGFuZC9vciB1c2UgdGhlIG5ldyAnc2VsZi50aGlzLm93bigpJyBhY2Nlc3Nvci4KCSAgICAKCSAgICAKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgkgICAgCgkgICAgVGhlcmUgaXMgbm8gbW9yZSBDbGFzc1B0ciBjbGFzc2VzIGluIHRoZSBweXRob24gY29kZS4gSGVuY2UsCgkgICAgaWYgaW4gdGhlIHBhc3QgeW91IG5lZWRlZCB0byByZXNvcnQgdG8gc29tZSBraW5kIG9mIHRyaWNrZXJ5CgkgICAgd2l0aCB0aGVtLCBvciBvdmVyY29tZSB0aGVpciBwcmVzZW5jZSwgaXQgaXMgbm8gbG9uZ2VyCgkgICAgcmVxdWlyZWQsIGJ1dCB0aGUgZXh0cmEgY29kZSB5b3UgYWRkZWQgY291bGQgbm93IGJyZWFrCgkgICAgdGhpbmdzLgoKCSAgICBJZiBuZWVkZWQsIHlvdSBjYW4gdXNlIHRoZSBvcHRpb24gLWNsYXNzcHRyLCBpLmUuLAoKICAgICAgICAgICAgICAgc3dpZyAtY2xhc3NwdHIgLXB5dGhvbiAuLi4KCgkgICAgdG8gZ2VuZXJhdGUgdGhlIG9sZCBDbGFzc1B0ciBjbGFzc2VzLgoKCjEwLzMwLzIwMDU6IG1rb2VwcGUgCgkgICAgW0d1aWxlXSBNYWtlIGRlY2xhcmVkIGFuZCBkZWZpbmVkIGxpbmthZ2Ugb2YgU1dJR19pbml0IGNvbnNpc3RlbnQuICAKCSAgICBSZXBvcnRlZCBieSBTdGV2ZW4gRy4gSm9obnNvbiAoU0YgcGF0Y2ggMTMxNTQ5OCkuCgoxMC8yNi8yMDA1OiBtbWF0dXMKCgkgIC0gQWRkZWQgdGhlIGF0dHJpYnV0ZS5pIGZpbGUgdG8gdGhlIGdsb2JhbCBsaWJyYXJ5IGRpcmVjdG9yLgoJICAgIE5vdyBpdCBjYW4gYmUgdXNlZCBmcm9tIG90aGVyIGxhbmd1YWdlcyB0aGF0IGRvIG5vdCB1c2UKCSAgICB0aGUgdW5pZmllZCB0eXBlbWFwIGxpYnJhcnkgYXMgd2VsbC4KCgkgICAgU28sIGlmIHlvdSBoYXZlIHNvbWV0aGluZyBsaWtlOgoKCSAgICAgICAlaW5jbHVkZSBhdHRyaWJ1dGUuaQoKICAgICAgICAgICAgICAgJWF0dHJpYnV0ZShBLCBpbnQsIGEsIGdldF9hLCBzZXRfYSk7CgkgICAgICAgCQkJCSAgICAgIAkgIAoJICAgICAgIHN0cnVjdCBBCQkJICAgICAgCSAgCgkgICAgICAgeyAgICAJCQkJICAKCSAgICAgICAgIGludCBnZXRfYSgpIGNvbnN0OyAJCSAgCgkgICAgICAgICB2b2lkIHNldF9hKGludCBhYSk7IAkJICAKCSAgICAgICB9OwkJCQkgIAoKICAgICAgICAgICAgICAgJWF0dHJpYnV0ZV9yZWYoQiwgaW50LCBjKTsKCSAgICAgICAJCQkJCgkgICAgICAgc3RydWN0IEIJCQkKCSAgICAgICB7ICAgIAkJCQoJICAgICAgICAgaW50JiBjKCk7IAkJCgkgICAgICAgfTsgCgoJICAgIHRoZW4gaW4gdGhlIHRhcmdldCBsYW5ndWFnZSB0aGUgJ0EuYScgYW5kICdCLmMnIGF0dHJpYnV0ZXMgd2lsbAoJICAgIGJlIHZpc2libGUsIGllLCB5b3UgY2FuIGFjY2VzcyB0aGVtIGFzIHBsYWluIHZhcmlhYmxlczoKCiAgICAgICAgICAgICAgIGYgICA9IEEoKQogICAgICAgICAgICAgICBmLmEgPSAzCiAgICAgICAgICAgICAgIGcgICA9IEIoKQogICAgICAgICAgICAgICBnLmMgPSAzIAogICAgICAgICAgIAoJICAgICAgIGggICA9IGYuYSArIGcuYwoKCSAgICBhbmQgdGhlIHByb3BlciBnZXQvc2V0IG1ldGhvZHMgd2lsbCBiZSBkaXNwYXRjaGVkLiBTZWUKCSAgICBhdHRyaWJ1dGUuaSBmb3IgbW9yZSBpbmZvLgogICAKICAgICAgICAgIC0gTW9yZSBjbGVhbnVwcyBhcm91bmQgYW5kIGFkZGluZyBtb3JlIHRlc3QtY2FzZXMuIFRoZQogICAgICAgICAgICBESVNPV04gdHlwZW1hcCBub3cgaXMgdGVzdGVkIGFuZCB3b3JraW5nIGluIGFsbCB0aGUKICAgICAgICAgICAgbGFuZ3VhZ2VzIHRoYXQgdXNlIHRoZSB1bmlmaWVkIHR5cGVtYXAgbGlicmFyeSwgaWUsIHRjbCwKICAgICAgICAgICAgcnVieSwgcGVybCBhbmQgcHl0aG9uLgoJICAgIAoKMTAvMjUvMjAwNTogbW1hdHVzCgoJICAgIC0gUGVybCwgY29tcGxldGUgdGhlIERJU09XTiB0eXBlbWFwLgoJICAgIAoJICAgIC0gYWRkZWQgdGhlIGF0dHJpYnV0ZS5pIGZpbGUgdG8gdGhlIHVuaWZpZWQgdHlwZW1hcAogICAgICAgICAgICAgIGxpYnJhcnkgKGJlZm9yZSB3YXMgb25seSB1c2FibGUgZnJvbSBweXRob24pLgoKCSAgICAtIHVuaWZ5IHRoZSBuYW1lcyBmb3IgdGhlIHNldHRlciBhbmQgZ2V0dGVyIG1ldGhvZHMgaW4KCSAgICAgIHBlcmwsdGNsLHJ1YnkgYW5kIHB5dGhvbiwgc28sIHRoZSBhdHRyaWJ1dGUuaSBsaWJyYXJ5CgkgICAgICBjYW4gd29yayBhY3Jvc3MgdGhlbS4KCSAgICAgIAoJICAgIC0gc2VlIHRoZSBsaV9hdHRyaWJ1dGUuaSB0ZXN0LWNhc2Ugb3IgdGhlIGxpYnJhcnkgZmlsZQoKIAkgICAgICAgIExpYi90eXBlbWFwcy9hdHRyaWJ1dGUuc3dnCgogICAgICAgICAgICAgIGZvciBtb3JlIGluZm8gYWJvdXQgaG93IHRvIHVzZSBpdC4KCiAKCSAgICAgIAoKMTAvMjQvMjAwNTogbW1hdHVzCgoJICAgIC0gUGVybCBub3cgdXNlcyB0aGUgdW5pZmllZCB0eXBlbWFwIGxpYnJhcnkuCgoJICAgIC0gQ2hhbmdlcyBpbiBydWJ5IHRvIHVzZSB0aGUgJHRyYWNrIG9wdGlvbiBpbiB0eXBlbWFwcy4KCgkgICAgLSBDaGFuZ2VzIGluIHRoZSB1bmlmaWVkIHR5cGVtYXAgbGlicmFyeSB0byBmb2xsb3cgdGhlCgkgICAgICBjb252ZW50aW9uIHRoYXQgYWxsIG1hY3JvcyB0aGF0IGFyZSBub3QgdXNlZCBpbiB0aGUKCSAgICAgIEMvQysrIHNpZGUgc3RhcnRzIHdpdGggJSwgc3VjaCBhcwoKCSAgICAgICAgICAgJWRlbGV0ZQoJCSAgICVuZXdfYXJyYXkKCiAgICAgICAgICAgICAgZXRjLgoJICAgICAgCgkgICAgLSBEb2N1bWVudGluZyBmcmFnbWVudHMsIHNlZSBmcmFnbWVudHMuc3dnLgoKCSAgICAtIENsZWFuZXIgd2F5IHRvIHVzZSB0aGUgdW5pZmllZCB0eXBlbWFwIGxpYnJhcnksIGluY2x1ZGUKCSAgICAgIGp1c3QgPHR5cGVtYXBzL3N3aWd0eXBlcy5zd2c+LgoKCSAgICAgIENoZWNrIHNvbWUgb2YgdGhlIHN1cHBvcnRlZCBsYW5ndWFnZXM6IHBlcmwsIHRjbCwgcnVieSwKCSAgICAgIHB5dGhvbi4KCgkgICAgICBBbHdheXMgc3RhcnQgd2l0aCB0aGUgaGVhZCBmaWxlLCBzdWNoIGFzCgoJICAgICAgICAgcHl0aG9uL3B5dGhvbi5zd2cKCSAgICAgICAgIHRjbC90Y2w4LnN3ZwoJICAgICAgICAgcnVieS9ydWJ5LnN3ZwoJICAgICAgICAgcGVybDUvcGVybDUuc3dnCgogICAgICAgICAgICAgIGFuZCB0aGUgcHJpbmNpcGFsIGZpbGUgdGhhdCBpbnZva2VzIHRoZSB1bmlmaWVkIGxpYnJhcnksIHN1Y2ggYXMKCgkgICAgICAgICBweXRob24vcHl0eXBlbWFwcy5zd2cJICAgIAoJICAgICAgICAgdGNsL3RjbHR5cGVtYXBzLnN3ZwkgICAgCgkgICAgICAgICBydWJ5L3J1Ynl0eXBlbWFwcy5zd2cJICAgIAoJICAgICAgICAgcGVybC9wZXJsdHlwZW1hcHMuc3dnCSAgICAKCSAgICAKCSAgICAgIFRoZSBmaWxlIHRoYXQgcHJvdmlkZSB0aGUgc3BlY2lhbGl6YXRpb24gZm9yIGVhY2gKCSAgICAgIGxhbmd1YWdlIGFyZSB0aGUgb25lIHRoYXQgcHJvdmlkZXMgdGhlIGJhc2ljIHR5cGVzOgoKCSAgICAgICAgIHB5dGhvbi9weXByaW10eXBlcy5zd2cJCgkgICAgICAgICBydWJ5L3J1YnlwcmltdHlwZXMuc3dnCQoJICAgICAgICAgdGNsL3RjbHByaW10eXBlcy5zd2cJCgkgICAgICAgICBwZXJsNS9wZXJscHJpbXR5cGVzLnN3ZwoKCSAgICAgIGFuZCB0aGUgc3RyaW5nIG1hbmlwdWxhdGlvbjogIAkgCgkgICAgCgkgICAgICAgICBweXRob24vcHlzdHJpbmdzLnN3ZwkKCSAgICAgICAgIHJ1YnkvcnVieXN0cmluZ3Muc3dnCQoJICAgICAgICAgdGNsL3RjbHN0cmluZ3Muc3dnCQoJICAgICAgICAgcGVybDUvcGVybHN0cmluZ3Muc3dnCgoJCSAKCSAgICAgIFRoZSByZXN0IG9mIHRoZSBmaWxlcywgc3VjaCBhcyBjYXJyYXkuaSwgYXJlIG1vc3RseSBvbmUgCgkgICAgICBsaW5lIGZpbGVzIHRoYXQgaW5jbHVkZSB0aGUgcHJvcGVyIHR5cGVtYXAgbGlicmFyeQoJICAgICAgdmVyc2lvbi4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIGluIFBlcmwgKioqCgoJICAgIFNvbWUgbWlzc2luZy93cm9uZyB0eXBlbWFwcyBjb3VsZCBzdGFydCB3b3JraW5nIHByb3Blcmx5LAoJICAgIGFuZCBjaGFuZ2UgdGhlIG9sZCBleHBlY3RlZCBiZWhhdmlvciBpbiBQZXJsLgoKMTAvMjMvMjAwNTogd3V6emViCiAgICAgICAgICAgIENoaWNrZW46CiAgICAgICAgICAgICAgKyBwb2ludGVycyB0byBtZW1iZXIgZnVuY3Rpb25zIGZpbmFsbHkgd29yayBwcm9wZXJseQogICAgICAgICAgICAgICsgYWRkIHRlc3Qgb2YgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIGNwcF9iYXNpYy5pCgoxMC8yMC8yMDA1OiBkYW5jeQoJICAgIFthbGxlZ3JvY2xdIEFkZGVkIEMrKyBzdXBwb3J0LiBMYXJnZSB1cGRhdGUsIG1hbnkgY2hhbmdlcy4gU2VlCgkgICAgbmV3bHkgYWRkZWQgQWxsZWdybyBDb21tb24gTGlzcCBzZWN0aW9uIGluIGxpc3AuaHRtbAoKMTAvMjAvMjAwNTogbW1hdHVzCgkgICAgUnVieSwgVGNsLCBQeXRob246CgoJICAgIC0gVW5pZm9ybSB3YXkgdG8gZmFpbCAobGFiZWwgZmFpbDopLCBub3cgZmluYWxseQoJICAgICAgU1dJR19leGNlcHRpb24gd29ya3MgYWNyb3NzIHRoZSB0aHJlZSBsYW5ndWFnZXMgYW5kIGFsbAoJICAgICAgdGhlIHR5cGVtYXBzLgoKCSAgICAtIEFkZCBwcm9wZXIgY2xlYW51cCBjb2RlIHRvIHJ1YnkKCgkgICAgLSBNb3JlIHZhbGdyaW5kIGZpeGVzCgoJICAgIC0gU2ltcGxpZnkgdGhlIGlubGluZSB1c2UsIGl0IHNlZW1zIGEgc21hbGwgaW50ZXJmYWNlIG9mCgkgICAgICAyMCwwMDAgbGluZXMgKHBsdXMgbWFueSBtYW55IHRlbXBsYXRlcykgY2FuIGJyZWFrIAoJICAgICAgZ2NjIC1PMyBlYXNpbHkuCgoJICAgIC0gRmluYWxpemUgdGhlIHR5cGVtYXBzIGxpYnJhcnkuIEFsbCB0aGUgb2xkICAqLmkgZmlsZXMKCSAgICAgIChjYXJyYXkuaSwgY3BvaW50ZXIuaSwgZXhjZXB0aW9uLmkpIGhhZCBiZWVuIGltcGxlbWVudGVkCgkgICAgICBpbiB0aGUgbmV3IHR5cGVtYXBzIGxpYnJhcnkuCgkgICAgCgoxMC8xOS8yMDA1OiB3dXp6ZWIKCSAgICBVcGRhdGUgdGhlIFJ1bnRpbWUgVHlwZW1hcCBkb2N1bWVudGF0aW9uIGluIFR5cGVtYXBzLmh0bWwKCjEwLzE4LzIwMDU6IHd1enplYgoJICAgIENoaWNrZW46CgkgICAgICAtIENvcnJlY3RseSBoYW5kbGUgJWlnbm9yZWQgY2xhc3NlcwogICAgICAgICAgICAgIC0gQ29ycmVjdGx5IGNvbnZlcnQgbG9uZywgbG9uZyBsb25nLCB1bnNpZ25lZCBsb25nLCBldGMKICAgICAgICAgICAgICAgIHRvIGNoaWNrZW4gcHJpbWl0aXZlcy4gKFRoYW5rcyB0byBGZWxpeCBXaW5rZWxtYW5uKQogICAgICAgICAgICAgIC0gVXNpbmcgYXJnb3V0IHBhcmFtZXRlcnMgd2hlbiB0aGUgcmV0dXJuIHZhbHVlIHdhcyBhCiAgICAgICAgICAgICAgICB3cmFwcGVkIHBvaW50ZXIgY2F1c2VkIGEgbWVtb3J5IGNvcnJ1cHRpb24uICBUaGUgY2hpY2tlbgogICAgICAgICAgICAgICAgZ2FyYmFnZSBjb2xsZWN0b3IgbW92ZWQgYSBwb2ludGVyIG91dCBmcm9tIHVuZGVyIHVzLgogICAgICAgICAgICAgICAgVGhpcyBpcyBub3cgZml4ZWQgYnkgcnVubmluZyBhbGwgdGhlIHByb3h5IGNyZWF0aW9uCiAgICAgICAgICAgICAgICBmdW5jdGlvbnMgYXMgY29udGludWF0aW9ucyBhZnRlciB0aGUgd3JhcHBlciBmdW5jdGlvbgogICAgICAgICAgICAgICAgcmV0dXJucy4gIEFzIHBhcnQgb2YgdGhpcywgd2Ugbm8gbG9uZ2VyIG5lZWQgdGhlCiAgICAgICAgICAgICAgICBjaGlja2VuZmFzdHByb3h5IGZsYWcgb24gb3V0cHV0IHR5cGVtYXBzLgogICAgICAgICAgICAgIC0gdXNpbmcgLXByb3h5IGFuZCAtbm9jb2xsZWN0aW9uIHRvZ2V0aGVyIHdvcmtzIG5vdwogICAgICAgICAgICAgICAgQmVmb3JlLCBpdCB3YXMgbm90IGV4cG9ydGluZyB0aGUgZGVzdHJ1Y3RvciBpbiB0aGUgcHJveHkKICAgICAgICAgICAgICAgIHdyYXBwZXIuCgoxMC8xOC8yMDA1OiBtbWF0dXMKCSAgICAKCSAgICBBZGRlZCB0aGUgVW5pZmllZCBUeXBlbWFwIExpYnJhcnkgKFVUTCkuIEl0IHVuaWZpZXMgdGhlIHR5cGVtYXBzIGZvcgoKIAkgICAgICAgIHB5dGhvbiwgcnVieSwgdGNsCgoJICAgIGFuZCBpbiB0aGUgcHJvY2VzcywgZml4ZXMgc2V2ZXJhbCBwcm9ibGVtcyBpbiBlYWNoIG9mIHRoZSB0aHJlZQoJICAgIGxhbmd1YWdlcyB0byB3b3JrIGluIGEgImNhbm9uaWNhbCIgd2F5IG5vdyBlc3RhYmxpc2hlZCBpbgoJICAgIHRoZSB0eXBlbWFwIGxpYnJhcnkKCSAgICAKCSAgICAgICBTV0lHL0xpYi90eXBlbXBhcwoKCSAgICBUaGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIHVuaWZpY2F0aW9uIGlzIHRoYXQgZXZlcnl0aGluZwoJICAgIGNvbXBpbGVzIGFuZCBydW5zIGluc2lkZSB0aGUgdGVzdC1zdWl0ZSBhbmQgZXhhbXBsZXMKCSAgICBkaXJlY3Rvcmllcy4gQW5kIGZvciB0aGUgZmlyc3QgdGltZSB3ZSBoYXZlIHRocmVlCgkgICAgbGFuZ3VhZ2VzIHRoYW4gcGFzcyB0aGUgcHJpbWl0aXZlX3R5cGVzLmkgY2FzZS4KCgkgICAgQWxzbywgd2UgaGF2ZSBhIHVuaWZvcm0gd2F5IHRvIHRyZWF0IHRoZSBlcnJvcnMsIGZvciBleGFtcGxlCgkgICAgaWYgeW91IGRvIHNvbWV0aGluZyBsaWtlCgoJICAgICAgPj4+IGZyb20gcHJpbWl0aXZlX3R5cGVzIGltcG9ydCAqCiAgICAgICAgICAgICAgPj4+IHByaW50IHZhbF91Y2hhcigxMCkKICAgICAgICAgICAgICAxMAoJICAgICAgPj4+IHByaW50IHZhbF91Y2hhcigxMDAwKQogICAgICAgICAgICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToJCSAgICAgIAoJICAgICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/CQkJICAgIAoJICAgICAgT3ZlcmZsb3dFcnJvcjogaW4gYXJndW1lbnQgMSBvZiB0eXBlICd1bnNpZ25lZCBjaGFyJwoKCSAgICB5b3UgZ2V0IHRoZSBzYW1lIGV4Y2VwdGlvbiBpbiBhbGwgdGhlIHRocmVlIGxhbmd1YWdlcy4KCSAgICAKCSAgICBBbmQgd2VsbCwgbWFueSBtb3JlIGdvb2QgdGhpbmdzIHdpbGwgY29tZSBmcm9tIHRoaXMKCSAgICB1bmlmaWNhdGlvbiwgZm9yIGV4YW1wbGUsIHByb3BlciBzdXBwb3J0IG9mIHRoZSBTVEwvU1REIGNsYXNzZXMKCSAgICBmb3IgYWxsIHRoZSBsYW5ndWFnZXMsIGFuZCBob3BlZnVsbHksIHdlIGNhbiBrZWVwCgkgICAgYWRkaW5nIG90aGVyIGxhbmd1YWdlcy4KCgkgICAgVGhlIGhhcmRlc3QgcGFydCwgd3JpdGluZyBhIGNvbW1vbiB0eXBlbWFwIGxpYnJhcnkKCSAgICB0aGF0IHN1aXRlcyB0aGUgdGhyZWUgZGlmZmVyZW50IGxhbmd1YWdlcywgaXMgZG9uZSwKCSAgICBhbmQgYWRkaW5nIGFub3RoZXIgbGFuZ3VhZ2Ugc2hvdWxkIG5vdyBiZSBlYXN5LiAKCgkgICAgU3RpbGwgdGhlIGdsb2JhbCB1bmlmaWNhdGlvbiBpcyBub3QgY29tcGxldGUsIHRoZSBTVEwvU1REIAoJICAgIHBhcnQgaXMgbmV4dCwgYW5kIHByb2JhYmx5IGFzIHdlbGwgYXMgYWRkaW5nIG9uZSBvciB0d28gbW9yZQoJICAgIGxhbmd1YWdlcy4KCgkgICAgSWYgeW91IGFyZSBjdXJpb3VzLCBsb29rIGF0IHRoZSBweXRob24sIHJ1YnkgYW5kL29yIHRjbAoJICAgIGRpcmVjdG9yaWVzIHRvIHNlZSB3aGF0IGlzIG5lZWRlZCB0byBzdXBwb3J0IHRoZSBuZXcKCSAgICBjb21tb24gdHlwZW1hcHMgbGlicmFyeS4gIFN0aWxsLCB0aGUgZmluYWwgd2F5IHRvCgkgICAgaW50ZWdyYXRlIGEgbmV3IGxhbmd1YWdlIGNvdWxkIGNoYW5nZSBhcyB3ZSBtb3ZlIHRvCgkgICAgaW50ZWdyYXRlIHRoZSBTVEQvU1RMLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgaW4gUnVieS9UY2wgKioqCgoJICAgIFNvbWUgbWlzc2luZy93cm9uZyB0eXBlbWFwcyBjb3VsZCBzdGFydCB3b3JraW5nIHByb3Blcmx5LAoJICAgIGFuZCBjaGFuZ2UgdGhlIG9sZCBiZWhhdmlvciwgc3BlY2lhbGx5IGluIHJ1YnkgYW5kIHRjbC4KClZlcnNpb24gMS4zLjI3IChPY3RvYmVyIDE1LCAyMDA1KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEwLzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggZm9yIHR5cGVzYWZlIGVudW0gd3JhcHBpbmcgc28gdGhhdCBpdCBpcyBwb3NzaWJsZSB0bwogICAgICAgICAgICBvdmVybG9hZCBhIG1ldGhvZCB3aXRoIDIgZGlmZmVyZW50IGVudW0gdHlwZXMuCgoxMC8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yICVmZWF0dXJlKCJpbW11dGFibGUiLCIwIikgYXR0ZW1wdGluZyB0byBnZW5lcmF0ZSBzZXR0ZXJzCiAgICAgICAgICAgIGZvciBjb25zdGFudHMuCgogICAgICAgICAgICBSZXN0b3JlZCAlaW1tdXRhYmxlIGFuZCAlbWFrZWRlZmF1bHQgdG8gY2xlYXIgdGhlIGZlYXR1cmUgYXMgaXQKICAgICAgICAgICAgYmVoYXZlZCBpbiBTV0lHLTEuMy4yNSBhbmQgZWFybGllci4KCjEwLzE0LzIwMDU6IG1tYXR1cwogICAgICAgICAgICBGaXggYnVnIGluIGFub255bW91cyB0eXBlZGVmIHN0cnVjdHVyZXMgd2hpY2ggd2FzIGxlYWRpbmcgdG8KICAgICAgICAgICAgc3RyYW5nZSBiZWhhdmlvdXIuCgoxMC8xMy8yMDA1OiBtbWF0dXMKCSAgICBTZXZlcmFsIG1pbm9yIGNoYW5nZXM6CgkgICAgCgkgICAgLSBJbXByb3ZlIHRoZSB3Y2hhcl90IHR5cGUgc3VwcG9ydAoJICAgIC0gQWRkIGEgd2FybmluZyBmb3Igd2hlbiB5b3UgZGVmaW5lIHRoZSAnaW4nIHR5cGVtYXAgYnV0CgkgICAgICB5b3UgZG9uJ3QgZGVmaW5lIHRoZSAndHlwZWNoZWNrJyBvbmUuIFZlcnkgY29tbW9uIG1pc3Rha2UuCgkgICAgLSBBZGQgcHJvcGVyIGRlZmF1bHQgcnVsZSBmb3IgZnVuY3Rpb24gcG9pbnRlcnMsIG5vdyB5b3UKCSAgICAgIGNhbiBkZWZpbmUgYSB0eXBlbWFwIHN1Y2ggYXM6CgoJICAgICAgJXR5cGVtYXAoaW4pIFNXSUdUWVBFICgoKikoQU5ZKSkgey4uLn0KCgkgICAgICBUaGF0IHdpbGwgYXBwbHkgdG8gYWxsIHRoZSBwb2ludGVyIHRvIGZ1bmN0aW9ucy4gVGhlCgkgICAgICBydWxlIGluIEMrKyBhbHNvIGFwcGx5IHRvIHRoZSBmdW5jdGlvbiAncmVmZXJlbmNlJywgaWUsCgkgICAgICBpbiBib3RoIGNhc2VzCgoJICAgICAgICB0eXBlZGVmICBpbnQgKCpmcHRyKShpbnQgYSk7CgkgICAgICAgIHR5cGVkZWYgIGludCAoZnVuYykoaW50IGEpOwoKCSAgICAgIFRoaXMgd2FzIG5lZWRlZCBzaW5jZSBpdCBzZWVtcyB0byBiZSAnaWxsZWdhbCcgaW4gQysrIHRvCgkgICAgICBkbyBzb21ldGhpbmcgbGlrZToKCgkgICAgICAgICB2b2lkICpwdHIgPSBzdGF0aWNfY2FzdDx2b2lkICo+KGZwdHIpOwoKCSAgICAgIGFuZCBwcm9iYWJseSwgYXMgZm9yIG1lbWJlciBmdW5jdGlvbnMsIGl0IGlzIG5vdAoJICAgICAgd2FycmFudGllZCB0aGF0IHRoZSBwb2ludGVyIHNpemVzIHdpbGwgbWF0Y2guCgoJICAgIC0gQWRkIHRoZSAjZXJyb3IvI3dhcm5pbmcgZGlyZWN0aXZlcyB0byBzd2lnJ3MgY3BwLgoKCSAgICAtIEFkZCB0aGUgbm9ibG9jayBvcHRpb24gZm9yIHR5cGVtYXBzLCB3aGljaCBpcyB1c2VkIGFzCiAgICAgICAgICAgICAgZm9sbG93czogc3VwcG9zZWQgeW91IGEgdHlwZW1hcCwgbGlrZSB0aGlzCgoJICAgICAgCgkgICAgICAldHlwZW1hcChpbixub2Jsb2NrPTEpIEhlbGxvIHsJCQkgICAKCSAgICAgICAgIC4uLi4KICAgICAgICAgICAgICB9CgoJICAgICAgdGhlbiB0aGUgdHlwZW1hcCB3aWxsIGJlIGluc2VydGVkIHdpdGhvdXQgdGhlIGJsb2NrCgkgICAgICBpbXBvc2VkIGJ5IHRoZSBicmFja2V0cywgc2ltaWxhciB0bwoKCSAgICAgICAldHlwZW1hcChpbikgSGVsbG8gIi4uLiIKCgkgICAgICBTbywgd2h5IHlvdSBkb24ndCBqdXN0IHVzZSB0aGUgcXVvdGUgc3R5bGU/LCBiZWNhdXNlOgoJICAgICAgCgkgICAgICAgICAxLi0gVGhlIHF1b3RlIHN0eWxlIGRvZXNuJ3QgZ2V0IHByZXByb2Nlc3NlZCwgZm9yIGV4YW1wbGUKCSAgICAgIAoJICAgICAgICAgICAgICAldHlwZW1hcChpbikgSGVsbG8gIiQxPSBTV0lHX21hY3JvKCQxKTsiCgkgICAgICAKCSAgICAgICAgICAgICBoZXJlLCBTV0lHX21hY3JvIGRvZXNuJ3QgZ2V0IGV4cGFuZGVkCgogICAgICAgICAgICAgICAgIDIuLSBJbnNpZGUgYSBxdW90ZSB0eXBlbWFwLCB5b3UgaGF2ZSB0byB1c2UgCiAgICAgICAgICAgICAgICAgICAgIHF1b3RlcyBjYXJlZnVsbHkKCgkJICAgICAgJXR5cGVtYXAoaW4pIEhlbGxvICIkMSA9IFwiaGVsbG9cIiAiCgoJCSAzLi0gWW91IGNhbid0IG1ha2UgZW1hY3MgYW5kL29yIG90aGVyIGVkaXRvcnMKCQkgICAgIHRvIGluZGVudCBpbnNpZGUgYSBzdHJpbmchLiAKCgoJICAgICAgU28sIHdoeSBkbyB5b3Ugd2FudCB0byByZW1vdmUgdGhlIGJsb2NrPywgYmVjYXVzZSBhbiBleHRyYQoJICAgICAgYmxvY2sgd2hlbiBub3QgbmVlZGVkIChubyBsb2NhbCB2YXJpYWJsZXMgaW4gaXQpOgoKCSAgICAgICAgICAxLi0gbWFrZXMgdGhlIGNvZGUgaGFyZGVyIHRvIHJlYWQKICAgICAgICAgICAgICAgICAgMi4tIG1ha2VzIHRoZSBjb2RlIGxhcmdlcgogICAgICAgICAgICAgICAgICAzLi0gb3IgaW4gc2hvcnQsIGZvciB0aGUgc2FtZSByZWFzb24gd2UgaGF2ZSB0aGUgcXVvdGUgc3R5bGUuCgpWZXJzaW9uIDEuMy4yNiAoT2N0b2JlciA5LCAyMDA1KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTAvMDgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1BocF0gQWRkZWQgJ3Rocm93cycgdHlwZW1hcHMuCgoxMC8wOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlcyBmb3IgbGFuZ3VhZ2VzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBtdWx0aXBsZSBpbmhlcml0YW5jZS4gVGhlCiAgICAgICAgICAgIGZpcnN0IG5vbi1pZ25vcmVkIGNsYXNzIGluIHRoZSBwdWJsaWMgYmFzZSBjbGFzcyBsaXN0IGlzIHVzZWQgZm9yIGluaGVyaXRhbmNlLgogICAgICAgICAgICBieSB0aGUgcHJveHkgY2xhc3MuIFByZXZpb3VzbHksIGlmIHRoZSBmaXJzdCBjbGFzcyBpbiB0aGUgbGlzdCB3YXMgaWdub3JlZCwgdGhlbgogICAgICAgICAgICB0aGUgcHJveHkgY2xhc3Mgd291bGRuJ3QgaGF2ZSBhbnkgYmFzZSBjbGFzc2VzLgoKMTAvMDcvMjAwNTogbW1hdHVzCgkgICAgIFVwZGF0ZSBtb3JlIGZlYXR1cmVzIHRvIGZvbGxvdyBuZXcgY29udmVudGlvbiwgaW5jbHVkaW5nOgoKCSAgICAgICBjYWxsYmFjawoJICAgICAgIHJlZi91bnJlZgoJICAgICAgIGV4Y2VwdAoJICAgIAoJICAgICBBbGwgb2YgdGhlbSB1c2Ugbm90IG9ubHkgdGhlIGZlYXR1cmUgYXMgYSBmbGFnLCBidXQgYWxzbwoJICAgICBhcyBjb2RlIHZhbHVlLiBUbyBkZWFsIHdpdGggdGhvc2UgZmVhdHVyZXMsIHdlIHVzZSBub3cKCSAgICAgR2V0RmxhZ0F0dHIsIHdoaWNoIGlzIHNpbWlsYXIgdG8gR2V0RmxhZywgYnV0IGluc3RlYWQgb3IKCSAgICAgcmV0dXJuaW5nIDEgb3IgMCwgaXQgcmV0dXJucyB0aGUgYXR0ciB2YWx1ZSwgaWYgaGFwcGVucwoJICAgICB0byBiZSBkaWZmZXJlbnQgb2YgIjAiIG9mIGNvdXJzZS4KCgkgICAgIE5vdyB0aGVyZSBhcmUgYWxzbyBtb3JlIHVuaWZvcm0gZGlyZWN0aXZlIG5hbWVzIGZvciB0aGUgCgkgICAgIG9uZXMgYmFzZWQgaW4gZmVhdHVyZXMsIGZvciBleGFtcGxlLCBmb3IgdGhlIG9sZAoJICAgICAlbmV3b2JqZWN0IGRpcmVjdGl2ZSBub3cgd2UgaGF2ZSB0cmVlIGRpcmVjdGl2ZXMgZGVmaW5lZDoKCSAgICAgCgoJICAgICAjZGVmaW5lICVuZXdvYmplY3QgICAgICAgICVmZWF0dXJlKCJuZXciKQoJICAgICAjZGVmaW5lICVub25ld29iamVjdCAgICAgICVmZWF0dXJlKCJuZXciLCIwIikKCSAgICAgI2RlZmluZSAlY2xlYXJuZXdvYmplY3QgICAlZmVhdHVyZSgibmV3IiwiIikKCgkgICAgIGFuZCBzbyBvbiBmb3IgYWxsIHRoZSBvdGhlciBmZWF0dXJlIGRpcmVjdGl2ZXMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjA5LzMwLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFN1YnRsZSBjaGFuZ2UgdG8gc29tZSBmZWF0dXJlcy4gUHJldmlvdXNseSBpdCB3YXMgbm90IHBvc3NpYmxlIHRvIGRpc2FibGUgbWFueQogICAgICAgICAgICBmZWF0dXJlcyBvbmNlIHRoZXkgaGFkIGJlZW4gZW5hYmxlZC4gVGhpcyB3YXMgZm9yIG1vc3QgZmVhdHVyZXMgdGhhdCBiZWhhdmUgYXMKICAgICAgICAgICAgZmxhZ3MuIFRoZXNlIGZlYXR1cmVzIG5vdyB3b3JrIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICVmZWF0dXJlKCJuYW1lIikgICAgICAgICAgICAgIC8vIGVuYWJsZXMgdGhlIGZlYXR1cmUKICAgICAgICAgICAgICAlZmVhdHVyZSgibmFtZSIsICIxIikgICAgICAgICAvLyBlbmFibGVzIHRoZSBmZWF0dXJlCiAgICAgICAgICAgICAgJWZlYXR1cmUoIm5hbWUiLCAiMCIpICAgICAgICAgLy8gZGlzYWJsZXMgdGhlIGZlYXR1cmUKICAgICAgICAgICAgICAlZmVhdHVyZSgibmFtZSIsICIiKSAgICAgICAgICAvLyBjbGVhcnMgdGhlIGZlYXR1cmUKCiAgICAgICAgICAgIEluIGZhY3QgYW55IG5vbi1lbXB0eSB2YWx1ZSBvdGhlciB0aGFuICIwIiB3aWxsIGVuYWJsZSB0aGUgZmVhdHVyZSAobGlrZSBDIGJvb2xlYW4gbG9naWMpLgogICAgICAgICAgICBQcmV2aW91c2x5ICIxIiwgIjAiIG9yIGFueSBvdGhlciBub24tZW1wdHkgdmFsdWUgd291bGQgZW5hYmxlIHRoZSBmZWF0dXJlIGFuZCBpdCB3b3VsZAogICAgICAgICAgICBvbmx5IGJlIHBvc3NpYmxlIHRvIGRpc2FibGUgdGhlIGZlYXR1cmUgYnkgY2xlYXJpbmcgaXQgKGFzc3VtaW5nIHRoZXJlIHdhcyBubyBnbG9iYWwgZW5hYmxlKS4KCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGFmZmVjdGVkOgoKICAgICAgICAgICAgICBhbGxvd2V4Y2VwdAogICAgICAgICAgICAgIGNvbXBhY3RkZWZhdWx0YXJncwogICAgICAgICAgICAgIGNsYXNzaWMgICAgICAgICAgICAgICAgKFB5dGhvbikKICAgICAgICAgICAgICBjczpjb25zdCAgICAgICAgICAgICAgIChDIykKICAgICAgICAgICAgICBkaXJlY3RvcgogICAgICAgICAgICAgIGV4Y2VwdGlvbmNsYXNzICAgICAgICAgKFB5dGhvbikKICAgICAgICAgICAgICBpZ25vcmUKICAgICAgICAgICAgICBpbW11dGFibGUKICAgICAgICAgICAgICBqYXZhOmNvbnN0ICAgICAgICAgICAgIChKYXZhKQogICAgICAgICAgICAgIGphdmE6ZG93bmNhc3QgICAgICAgICAgKEphdmEpCiAgICAgICAgICAgICAga3dhcmdzCiAgICAgICAgICAgICAgbW9kZXJuICAgICAgICAgICAgICAgICAoUHl0aG9uKQogICAgICAgICAgICAgIG5ldwogICAgICAgICAgICAgIG5vYXV0b2RvYyAgICAgICAgICAgICAgKFB5dGhvbikKICAgICAgICAgICAgICBub2RlZmF1bHQKICAgICAgICAgICAgICBub2RpcmVjdG9yCiAgICAgICAgICAgICAgbm9yZWYKICAgICAgICAgICAgICBub3RhYnN0cmFjdAogICAgICAgICAgICAgIG5vdW5yZWYKICAgICAgICAgICAgICBub3ZhbHVld3JhcHBlcgogICAgICAgICAgICAgIHB5dGhvbjptYXliZWNhbGwgICAgICAgKFB5dGhvbikKICAgICAgICAgICAgICBweXRob246bm9uZHluYW1pYyAgICAgIChQeXRob24pCiAgICAgICAgICAgICAgbW9kdWxhMzptdWx0aXJldHZhbCAgICAoTW9kdWxhMykKICAgICAgICAgICAgICBwcmVkaWNhdGUgICAgICAgICAgICAgIChSdWJ5KQogICAgICAgICAgICAgIHRyYWNrb2JqZWN0cyAgICAgICAgICAgKFJ1YnkpCiAgICAgICAgICAgICAgdmFsdWV3cmFwcGVyCgogICAgICAgICAgICBJdCBpcyBub3cgcG9zc2libGUsIGZvciBleGFtcGxlIHRvIGlnbm9yZSBhbGwgbWV0aG9kcy9jbGFzc2VzIGluIGEgaGVhZGVyIGZpbGUsIGV4Y2VwdCBmb3IgYQogICAgICAgICAgICBmZXcgdGFyZ2V0dGVkIG1ldGhvZHMsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgiaWdub3JlIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgYWxsIG1ldGhvZHMvY2xhc3NlcwogICAgICAgICAgICAgICVmZWF0dXJlKCJpZ25vcmUiLCIwIikgc29tZV9mdW5jdGlvbihpbnQsIGRvdWJsZSk7IC8vIGRvIG5vdCBpZ25vcmUgdGhpcyBmdW5jdGlvbgogICAgICAgICAgICAgICVmZWF0dXJlKCJpZ25vcmUiLCIwIikgU29tZUNsYXNzOyAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBpZ25vcmUgdGhpcyBDbGFzcwogICAgICAgICAgICAgICVmZWF0dXJlKCJpZ25vcmUiLCIwIikgU29tZUNsYXNzOjptZXRob2Q7ICAgICAgICAgIC8vIGRvIG5vdCBpZ25vcmUgdGhpcyBtZXRob2QKICAgICAgICAgICAgICAlaW5jbHVkZSAiYmlnaGVhZGVyLmgiCgogICAgICAgICAgICBSZW1vdmVkICVweXRob25keW5hbWljIC0gaXQgbmV2ZXIgd29ya2VkIHByb3Blcmx5LiBVc2UgJXB5dGhvbm5vbmR5bmFtaWMgaW5zdGVhZC4KICAgICAgICAgICAgUmVtb3ZlZCAlZmVhdHVyZSgibm9rd2FyZ3MiKSAtIGl0IHdhc24ndCBmdWxseSBpbXBsZW1lbnRlZCAgLSB1c2UgJWZlYXR1cmUoImt3YXJncyIsIjAiKSBpbnN0ZWFkLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgowOS8yNS8yMDA1OiBta29lcHBlCgkgICAgW0d1aWxlXSBBZGQgInRocm93cyIgdHlwZW1hcHMuCgowOS8yNC8yMDA1OiBjZmlzYXZhZ2UKICAgICAgICAgICAgW1J1YnldIEFkZHMgbmV3ICV0cmFja29iamVjdHMgZnVuY3Rpb25hbGl0eSB0aGF0IG1hcHMgQysrIG9iamVjdHMgdG8KICAgICAgICAgICAgUnVieSBvYmplY3RzLiAgVGhpcyBmdW5jdGlvbmFsaXR5IG1ha2VzIGl0IG11Y2ggZWFzaWVyIHRvIGltcGxlbWVudAogICAgICAgICAgICBtYXJrIGZ1bmN0aW9ucyBmb3IgdGhlIGdhcmJhZ2UgY29sbGVjdG9yLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24KICAgICAgICAgICAgcmVmZXIgdG8gdGhlIHVwZGF0ZSBkb2N1bWVudGF0aW9uIGFuZCBleGFtcGxlcy4KICAgICAgICAgICAgCjA5LzIwLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBQYXRjaCAxMTE2NDMxIGZyb20gSm9zaCBDaGVycnkuIEZpeGVzIG5vbiBtZW1iZXIgZnVuY3Rpb25zIGluYWR2ZXJ0ZW50bHkKICAgICAgICAgICAgYmVpbmcgY2FsbGVkIGluc3RlYWQgb2YgbWVtYmVyIGZ1bmN0aW9ucy4KCjA5LzIwLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIFBhdGNoIGZyb20gTWFyayBHb3NzYWdlIHRvIGFkZCBzdXBwb3J0IGZvciBMdWEtNS4xLCBzdGQ6OnN0cmluZywKICAgICAgICAgICAgc3RkOjp2ZWN0b3IsIHN0ZDo6ZXhjZXB0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgoKMDkvMTQvMjAwNTogbW1hdHVzCgkgICAgW1B5dGhvbl0gQWRkIC1ub2NwcGNhc3QuIE5vdyB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0bwoJICAgIGFsd2F5cyB1c2UgdGhlIGNwcGNhc3Qgb3BlcmF0b3JzLiBCZWZvcmUgdGhhdCB3YXMgdGhlIGNhc2UKCSAgICBvbmx5IHdoZW4geW91IHVzZWQgdGhlIC1jcHBjYXN0IG9wdGlvbi4KCiAgICAgICAgICAgIElmIHRoaXMgc2VlbXMgdG8gYnJlYWsgeW91ciBjb2RlLi4uIHlvdXIgd2VsY29tZSEsIGl0CgkgICAgbWVhbnMgaXQgd2FzIGJyb2tlbiBiZWZvcmUsIGFuZCB5b3UgbmV2ZXIgbm90aWNlLiAKCgkgICAgSWYgeW91IHRoaW5nIHRoZSBlcnJvciBpcyBkdWUgdG8gb25lIG9mIHRoZSBTV0lHIHR5cGVtYXBzLAoJICAgIHNlbmQgdXMgYW4gZXhhbXBsZS4KCgkgICAgVXNlIC1ub2NwcGNhc3Qgb25seSB3aXRoIHZlcnkgb2xkIEMrKyBjb21waWxlcnMgdGhhdAoJICAgIGRvIG5vdCBzdXBwb3J0IHRoZSBjcHBjYXN0IG9wZXJhdGlvbnMuIAoKCSAgICBTbywgaGVyZSBhcHBsaWVzOgoKCQlUaGlzIGNoYW5nZSBkb2Vzbid0IGJyZWFrIGNvbXBhdGliaWxpdHksIGl0IHdhcyBicm9rZW4gYmVmb3JlLgoKMDkvMTMvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgZGlyZWN0b3IgbWV0aG9kcyB3aGVuIGEgY2xhc3MgaXMgcGFzc2VkIGJ5IHZhbHVlIGFzIGEKICAgICAgICAgICAgcGFyYW1ldGVyLgoKMDkvMTEvMjAwNTogbW1hdHVzCiAgICAgICAgICAgIEFkZGluZyB0aGUgbW9kdWxlIG9wdGlvbiB0byB0aGUgJWltcG9ydCBkaXJlY3RpdmUuIE5vdyB5b3UKICAgICAgICAgICAgY2FuIHVzZSBpdCBhcwoKCSAgICAgICAgJWltcG9ydChtb2R1bGU9IkJpZ01vZHVsZSIpIGZvby5pCgoJICAgIHdoZXJlIHN1YmZpbGUgY291bGQgKG9yIG5vdCkgZGVmaW5lIHRoZSBtb2R1bGUgbmFtZSB2aWEKCSAgICB0aGUgJW1vZHVsZSBkaXJlY3RpdmUuIFRoZSBtb2R1bGUgb3B0aW9uIHRha2UgcHJlY2VkZW5jZQoJICAgIGFuZCBpdCBoYXMgdGhlIHNhbWUgZWZmZWN0cyB0aGFuIGhhdmluZyB0aGUgZGlyZWN0aXZlIAoKCSAgICAgICAgJW1vZHVsZSBCaWdNb2R1bGUgIAoKCSAgICBpbnNpZGUgdGhlIGltcG9ydGVkIGZpbGUgZm9vLmkuCgoJICAgIFlvdSBjYW4gdXNlIHRoZSBvcHRpb24gaW4gbWFpbmx5IHR3byBjYXNlczoKCgkgICAgMS4tIFlvdSB1c2VkIHRoZSAtbW9kdWxlIG9wdGlvbiB3aGVuIHlvdSBnZW5lcmF0ZWQgdGhlCiAgICAgICAgICAgICAgICBtb2R1bGUgdG8gYmUgaW1wb3J0ZWQsIGFuZCBoZW5jZSB0aGUgbW9kdWxlIG5hbWUgaW4KICAgICAgICAgICAgICAgIHRoZSBpbXBvcnRlZCAlbW9kdWxlIGRpcmVjdGl2ZSBpcyBub3QgcmVhbGx5IHVzZWZ1bC4KCgkgICAgMi4tIFRoZSBtb2R1bGUgeW91IHdhbnQgdG8gaW1wb3J0IGlzIHZlcnkgbGFyZ2UsIGFuZCBpdAogICAgICAgICAgICAgICAgaGFzIHNldmVyYWwgLmkvLmggZmlsZXMuIFRoZW4sIGlmIHlvdSBqdXN0IG9uZSB0bwogICAgICAgICAgICAgICAgaW1wb3J0IGEgY2xhc3Mgb3Igc28gZnJvbSB0aGUgbW9kdWxlLCBzYXlzICdmb28nLCBhbmQKICAgICAgICAgICAgICAgIG5vdCB0aGUgZW50aXJlIG1vZHVsZSB2aWEgaW1wb3J0aW5nIHRoZSBtYWluCiAgICAgICAgICAgICAgICBCaWdNb2R1bGUuaSBmaWxlLCB0aGVuIHlvdSBqdXN0IGRvOgoKIAkJICAgICVpbXBvcnQobW9kdWxlPSJCaWdNb2R1bGUiKSBmb28uaAoKICAgCSAgICAgICAgb3IKCQkKIAkJICAgICVpbXBvcnQobW9kdWxlPSJCaWdNb2R1bGUiKSBmb28uaQoKCQl3aGVyZSBmb28uaSBjb250YWlucyB0aGUgJ2ZvbycgZGVjbGFyYXRpb24gYW5kIG1heWJlIGEKCQljb3VwbGUgb2YgZXh0cmEgJWluY2x1ZGUgZGlyZWN0aXZlcywgYXMgbmVlZGVkLgoKCSAgICAKMDkvMTEvMjAwNTogbW1hdHVzCgkgICAgRml4IGJ1ZyAjMTI4MjYzNywgYWJvdXQgdGhlIC1tb2R1bGUgb3B0aW9uIG5vdCBoYXZpbmcgZWZmZWN0CgkgICAgaW4gcGxhY2VzIHdoZXJlIGl0IHdhcyBuZWVkZWQuCgowOS8xMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBXaGVuIHdyYXBwaW5nIHZhcmlhYmxlcywgZW5zdXJlIHRoYXQgbm9uZSBvZiB0aGUgdHlwZW1hcHMgdXNlZCBmb3IgdGhlCiAgICAgICAgICAgIHNldCB3cmFwcGVycyBhcmUgdXNlZCB3aGVuIGdlbmVyYXRpbmcgdGhlIGdldCB3cmFwcGVycy4gSSBkb3VidCB0aGlzIHdhcyBhCiAgICAgICAgICAgIHByb2JsZW0gZm9yIGFueSBsYW5ndWFnZXMgZXhjZXB0IGZvciB0aGUgcmVjZW50bHkgaW50cm9kdWNlZCBudWxsIGF0dHJpYnV0ZQogICAgICAgICAgICBpbiB0aGUgb3V0IHR5cGVtYXAgKEMjIG9ubHkpLgoKMDkvMDgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgTW9yZSBkZXNjcmlwdGl2ZSBlcnJvciBtZXNzYWdlcyB3aGVuIGZpbGVzIGZhaWwgdG8gb3Blbi4KCjA5LzA2LzIwMDU6IG1tYXR1cyAKCgkgICAgQWxsb3cgYSAlZGVmaW5lIGEgbWFjcm8gaW5zaWRlIGFub3RoZXIgJWRlZmluZSBtYWNybywgZm9yIGV4YW1wbGUKCgkgICAgICAlZGVmaW5lIGhlbGxvKG5hbWUsIFR5cGUpCgkgICAgICAlZGVmaW5lIG5hbWUgIyMgYShUeXBlKQoJICAgICAgJXR5cGVtYXAoaW4pIFR5cGUgImhlbGxvOyIKCSAgICAgICVlbmRkZWYKCSAgICAgICVlbmRkZWYKCSAgICAgIAoJICAgIFRvIGxlYXJuIGhvdyB0byB1c2UgdGhpcyBuZXcgZmVhdHVyZXMgaW4geW91ciBvd24gdHlwZW1hcHMgbGlicmFyeSwgc2VlCgkgICAgcHl0aG9uL2NzdHJpbmcuaSwgcHl0aG9uL2N3c3RyaW5nLmkgYW5kIHB5dGhvbi9jd3N0cmJhc2UuaS4JICAgIAoKICAgICAgICAgICAgW1B5dGhvbl0gTm9ybWFsaXplIHRoZSBjc3RyaW5nLmkgaW1wbGVtZW50YXRpb24gdG8gdXNlIGZyYWdtZW50cywgYW5kIGFkZAogICAgICAgICAgICBjd3N0cmluZy5pLCB3aGljaCBpbXBsZW1lbnRzIHRoZSBzYW1lIHR5cGVtYXBzIGJ1dCBmb3Igd2NoYXJfdCBzdHJpbmdzLgoKCSAgICBbUHl0aG9uXSBCdWcgZml4ZWQ6IDEyNDc0NzcsIDEyNDU1OTEsIDEyNDk4NzggYW5kIG90aGVycy4KCjA4LzE4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBJbXBsZW1lbnQgc3VwcG9ydCBmb3IgU1dJR1RZUEUqIERJU09XTiB0eXBlbWFwIChsaWtlIGluIFB5dGhvbikgZm9yCiAgICAgICAgICAgIGJldHRlciBjb250cm9sIG9mIG1lbW9yeSBtYW5hZ2VtZW50LCBlZyB3aGVuIGFkZGluZyBhbiBvYmplY3QgY3JlYXRlZCBpbiBSdWJ5CiAgICAgICAgICAgIHRvIGEgQysrIGNvbnRhaW5lci4gUGF0Y2ggIzEyNjE2OTIgZnJvbSBDaGFybGllIFNhdmFnZS4KCjA4LzE4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtUY2xdIDY0IGJpdCBwbGF0Zm9ybSBmaXhlcyBmb3IgdGhlIHZhcmFyZ3MgaGFuZGxpbmcgaW4gU1dJR19HZXRBcmdzLiBUaGlzIGlzIGFuCiAgICAgICAgICAgIGltcHJvdmVkIGZpeCBmb3IgYnVnICMxMDExNjA0IGFzIHN1Z2dlc3RlZCBieSBKZXJlbXkgTGluLgoKMDgvMTgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1RjbF0gQnVnICMxMjQwNDY5IC0gJW5ld29iamVjdCBzdXBwb3J0IGZvciBUY2wuIFBhdGNoIGZyb20gQm9iIE1hcmluaWVyLgoKMDgvMTYvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIEJ1ZyAjMTI1NDQ5NCAtIEZpeCBmb3IgZ2xvYmFsIG5hbWVzcGFjZSBwb2xsdXRpb24gYnkgcGVybCBoZWFkZXIgZmlsZXMKICAgICAgICAgICAgKGJvb2wgZGVmaW5lKSBwcmV2ZW50ZWQgU1RMIGhlYWRlcnMgZnJvbSBiZWluZyB1c2VkIG9uIHNvbWUgc3lzdGVtcywgZWcKICAgICAgICAgICAgV2luZG93cyB3aXRoIFZpc3VhbCBTdHVkaW8uCgowOC8xNi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gQnVnICMxMjQwOTM3IC0gUmVkZWZpbml0aW9uIG9mIF9faW50NjQgdHlwZWRlZiBmb3IgSW50ZWwgY29tcGlsZXJzLgoKMDgvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1htbF0gQnVnICMxMjUxODMyIC0gIEMrKyB0ZW1wbGF0ZSBtYXkgZ2VuZXJhdGUgaW52YWxpZCBYTUwgZmlsZQoKMDgvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gU3VwcG9ydCBhZGRlZCBmb3IgTHVhLiBQYXRjaCAjMTI0Mjc3MiBmcm9tIE1hcmsgR29zc2FnZS4KICAgICAgICAgICAgSXQgc3VwcG9ydHMgbW9zdCBDL0MrKyBmZWF0dXJlcyAoZnVuY3Rpb25zLCBzdHJ1Y3QsIGNsYXNzZXMsIGFycmF5cywgcG9pbnRlcnMsCiAgICAgICAgICAgIGV4Y2VwdGlvbnMpLCBhcyB3ZWxsIGFzIGxvdHMgb2YgZG9jdW1lbnRhdGlvbiBhbmQgYSBmZXcgdGVzdCBjYXNlcyAmIGV4YW1wbGVzLgoKMDgvMTQvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1htbF0gRml4IGluY29ycmVjdCB4bWwgZXNjYXBpbmcgaW4gYmFzZSBjbGFzcyBuYW1lIHdoZW4gYmFzZSBjbGFzcyBpcyBhIHRlbXBsYXRlLgoKMDgvMTMvMjAwNTogZWZ1enp5b25lCgkgICAgW0NMSVNQXSBBZGRlZCBzdXBwb3J0IGZvciBoYW5kbGluZyBlbnVtcy4gRG9lcyBub3QgYWRkcyB0aGUgcmV0dXJuIHR5cGUgZGVjbGFyYXRpb24KCSAgICB0byB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbiwgaWYgYSBmdW5jdGlvbiByZXR1cm5zIHZvaWQuCgowOC8wOS8yMDA1OiBta29lcHBlCgkgICAgTmV3IGxhbmd1YWdlIG1vZHVsZSwgQ29tbW9uIExpc3Agd2l0aCBVRkZJLCBmcm9tIFV0ei1Vd2UgSGF1cy4KCjA4LzA5LzIwMDU6IG1rb2VwcGUKCSAgICBGaXggdGhlIExpc3Agcy1leHByZXNzaW9uIG91dHB1dCBtb2R1bGU7IGl0IG5vIGxvbmdlciBjb21wbGFpbnMgYWJvdXQgInVua25vd24gdGFyZ2V0cyIuCgowNy8yNy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBNb2RpZmljYXRpb25zIHRvIFNUTCB3cmFwcGVycyBzbyB0aGF0IGl0IGlzIHBvc3NpYmxlIGZvciBhIHVzZXIncyAlZXhjZXB0aW9uIGRpcmVjdGl2ZQogICAgICAgICAgICB0byBiZSBhcHBsaWVkIHRvIHRoZSBTVEwgd3JhcHBlciBtZXRob2RzLiBQcmV2aW91c2x5IHRoZSBmb2xsb3dpbmcgZ2xvYmFsICVleGNlcHRpb24KICAgICAgICAgICAgZGlyZWN0aXZlIHdvdWxkIG5vdCBiZSB1c2VkIG9uIHRoZSB3cmFwcGVyIG1ldGhvZHM6CgogICAgICAgICAgICAgICAgJWV4Y2VwdGlvbiB7IAogICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICRhY3Rpb24KICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoLi4uKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIHVuY2F1Z2h0IGV4Y2VwdGlvbnMKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhpcyBoYXMgYmVlbiBpbXBsZW1lbnRlZCBieSByZXBsYWNpbmcgJWV4Y2VwdGlvbiBkaXJlY3RpdmVzIGZvciBzcGVjaWZpYyBTVEwgd3JhcHBlcgogICAgICAgICAgICBtZXRob2RzIHdpdGggYW4gZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gZGVjbGFyZWQgb24gdGhlIHdyYXBwZXIgbWV0aG9kcy4gdGhyb3dzIHR5cGVtYXBzCiAgICAgICAgICAgIGFyZSBub3cgc3VwcGxpZWQgZm9yIGhhbmRsaW5nIHRoZSBTVEwgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24uIFRoZXNlIGNhbiBhbHNvIGJlIGVhc2lseQogICAgICAgICAgICBvdmVycmlkZGVuLCBmb3IgZXhhbXBsZSB0aGUgc3RkOjpvdXRfb2ZfcmFuZ2UgZXhjZXB0aW9uLCB3aGljaCBpcyB1c2VkIGEgbG90IGluIHRoZSBTVEwKICAgICAgICAgICAgd3JhcHBlcnMsIGNhbiBiZSBjdXN0b21pc2VkIGVhc2lseToKCiAgICAgICAgICAgICAgJWluY2x1ZGUgInN0ZF92ZWN0b3IuaSIKICAgICAgICAgICAgICAldHlwZW1hcCh0aHJvd3MpIHN0ZDo6b3V0X29mX3JhbmdlIHsKICAgICAgICAgICAgICAgIC8vIGN1c3RvbSBleGNlcHRpb24gaGFuZGxlcgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAldGVtcGxhdGUoVmVjdEludCkgc3RkOjp2ZWN0b3I8aW50PjsKCjA3LzIyLzIwMDU6IGVmdXp6eW9uZQogICAgICAgICAgICBbQ0xJU1BdIFRoZSBjbGlzcCBtb2R1bGUgZm9yIFNXSUc6CiAgICAgICAgICAgICAgLSBJdCBjYW4gb25seSBoYW5kbGUgQywgY2xpc3AgY3VycmVudGx5IGRvZXMgbm90IHN1cHBvcnRzIGZmaSBiaW5kaW5ncyB0byBDKysuCiAgICAgICAgICAgICAgLSBJdCBoYXMgdHdvIG9wdGlvbnMsIChhKSAtZXh0ZXJuLWFsbCB0aGlzIHdpbGwgZ2VuZXJhdGUgd3JhcHBlcnMgZm9yIGFsbCBmdW5jdGlvbnMKICAgICAgICAJYW5kIHZhcmlhYmxlc3Rpb25zLCAoYikgLWdlbmVyYXRlLXR5cGVkZWYgdGhpcyB3aWxsIGdlbmVyYXRlIHdyYXBwZXJzICJkZWYtYy10eXBlIgoJICAgICAgICB3cmFwcGVycyBmb3IgdHlwZWRlZnMKCSAgICAgIC0gQ2FuIGhhbmRsZSBwb2ludGVycyB0byBmdW5jdGlvbnMsIGNvbXBsZXggdHlwZXMgc3VjaCBhcyBuLWRpbWVuc2lvbmFsIGFycmF5cyBvZiAKCSAJcG9pbnRlcnMgb2YgZGVwdGggZAoJICAgICAgLSBHZW5lcmF0ZXMgd3JhcHBlcnMgZm9yIGNvbnN0YW50cyBhcyB3ZWxsIGFzIHZhcmlhYmxlcwoJICAgICAgLSBDb3JyZWN0bHkgZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIHRoZSBkZWNsYXJhdGlvbiBvZiB2YXJpYWJsZXMgaW4gc3RydWN0dXJlcyBhbmQgZnVuY3Rpb25zCgkgICAgICAtIENyZWF0ZXMgYSBkZWZwYWNrYWdlICJkZWNsYXJhdGlvbiIgd2l0aCB0aGUgbW9kdWxlIG5hbWUgYXMgdGhlIHBhY2thZ2UgbmFtZSwgdGhlIGNyZWF0ZWQgCgkgICAgCXBhY2thZ2UgZXhwb3J0cyBib3RoIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzCgkgICAgICAtIHRyaWVzIHRvIGd1ZXNzIHdoZW4gc2hvdWxkIGEgcG9pbnRlciB2YXJpYWJsZSBiZSBkZWNsYXJlZCBhcyBjLXB0ciBvciBjLXBvaW50ZXIKCjA3LzIyLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQ2hhbmdlcyB0byBzdXBwb3J0IEMjIHN0cnVjdHMgcmV0dXJuZWQgYnkgdmFsdWUuIFRoZSBjaGFuZ2VzIHJlcXVpcmVkIGFyZToKICAgICAgICAgICAgICAtIFVzaW5nIGFuIG9wdGlvbmFsICdudWxsJyBhdHRyaWJ1dGUgaW4gdGhlIG91dCB0eXBlbWFwLiBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQsCiAgICAgICAgICAgICAgICB0aGVuIGl0IGlzIHVzZWQgZm9yIHRoZSAkbnVsbCBzcGVjaWFsIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KICAgICAgICAgICAgICAtIFRoZSBjdHlwZSB1c2VkIGluIHRoZSBDL0MrKyB3cmFwcGVycyBpcyBubyBsb25nZXIgaW5pdGlhbGlzZWQgdG8gMCBvbiBkZWNsYXJhdGlvbi4KICAgICAgICAgICAgQm90aCBvZiB0aGVzZSBjaGFuZ2VzIGZpeCB0aGUgc2l0dWF0aW9ucyB3aGVyZSBhbiBhdHRlbXB0IHdhcyBtYWRlIHRvIGFzc2lnbiAwIHRvIHRoZQogICAgICAgICAgICByZXR1cm5lZCBzdHJ1Y3QuIE1hcnNoYWxsaW5nIHN0cnVjdHMgYXMgdmFsdWUgdHlwZXMgc3RpbGwgcmVxdWlyZXMgdXNlciBkZWZpbmVkIHR5cGVtYXBzLgogICAgICAgICAgICBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgYW4gZXhhbXBsZS4KCjA3LzIyLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gRml4IFNXSUdfZXhjZXB0aW9uIHVzYWdlIHRvIHdvcmsgd2l0aCBjb21waWxlcnMgdGhhdCBkb24ndCBzdXBwb3J0IGVtcHR5IG1hY3JvCiAgICAgICAgICAgIGFyZ3VtZW50cy4gVW5mb3J0dW5hdGVseSB0aGlzIGZpeCB3aWxsIHN0b3AgdXNhZ2Ugb2YgU1dJR19leGNlcHRpb24gYmVpbmcgdXNlZCB3aXRoaW4gdHlwZW1hcHMKICAgICAgICAgICAgdGhhdCB1c2UgIiIgb3IgJXsgJX0gZGVsaW1pdGVycywgYnV0IGNvbnRpbnVlcyB0byB3b3JrIHdpdGggdHlwZW1hcHMgdXNpbmcge30gZGVsaW1pdGVycy4KICAgICAgICAgICAgUGxlYXNlIHVzZSB0aGUgU1dJR19DU2hhcnBTZXRQZW5kaW5nRXhjZXB0aW9uQXJndW1lbnQgb3IgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24gbWV0aG9kcyBpbnN0ZWFkCiAgICAgICAgICAgIGFzIFNXSUdfZXhjZXB0aW9uIGlzIHJlYWxseSBpbnRlbmRlZCBhcyBhIHBsYXRmb3JtIGluZGVwZW5kZW50IG1hY3JvIGZvciB0aGUgU1dJRyBsaWJyYXJ5IHdyaXRlcnMuCgowNy8xNi8yMDA1OiBta29lcHBlCgkgICAgW0FsbGVncm8gQ0xdIFVzZSBzcGVjaWZpYyBmb3JlaWduIHR5cGVzIHJhdGhlciB0aGFuICgqIDp2b2lkKS4gCgkgICAgVXNlICpzd2lnLWlkZW50aWZpZXItY29udmVydGVyKi4KCjA2LzI3LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZ1bmN0aW9ucyBkZWNsYXJlZCBhcyAnZXh0ZXJuJyBubyBsb25nZXIgaGF2ZSBhbiBhZGRpdGlvbmFsIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGFkZGVkIHRvIHRoZSAKICAgICAgICAgICAgd3JhcHBlciBmaWxlcy4gVGhlcmUgYXJlIHNvbWUgY2FzZXMgd2hlcmUgU1dJRyBkb2VzIG5vdCBnZXQgdGhpcyByaWdodCwgZWcgYnVnICMxMjA1ODU5IChleHRlcm4KICAgICAgICAgICAgZnVuY3Rpb25zIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgZGVjbGFyZWQgaW4gYSBuYW1lc3BhY2UpLiBBbHNvIFNXSUcgY2Fubm90IGdldCBub24tc3RhbmRhcmQKICAgICAgICAgICAgY2FsbGluZyBjb252ZW50aW9ucyBjb3JyZWN0LCBlZyBXaW5kb3dzIGNhbGxpbmcgY29udmVudGlvbnMgYXJlIHVzdWFsbHkgaGFuZGxlZCBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgI2RlZmluZSBETExJTVBPUlQgX19kZWNsc3BlYyhkbGxpbXBvcnQpCiAgICAgICAgICAgICAgI2RlZmluZSBTVERDQUxMIF9fc3RkY2FsbAogICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgI2RlZmluZSBETExJTVBPUlQKICAgICAgICAgICAgICAjZGVmaW5lIFNURENBTEwKICAgICAgICAgICAgICAlaW5saW5lICV7CiAgICAgICAgICAgICAgRExMSU1QT1JUIGV4dGVybiBTVERDQUxMIHZvaWQgZnVuY3Rpb24oaW50KTsKICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgU1dJRyBpbmNvcnJlY3RseSBnZW5lcmF0ZXM6CgogICAgICAgICAgICBleHRlcm4gdm9pZCBmdW5jdGlvbihpbnQpOwoKICAgICAgICAgICAgVG8gd2hpY2ggdGhlcmUgaXMgbm8gc29sdXRpb24gYXMgU1dJRyBkb2Vzbid0IGhhbmRsZSBub24tc3RhbmRhcmQgY2FsbGluZyBjb252ZW50aW9ucy4gVGhlIGV4dHJhCiAgICAgICAgICAgICdleHRlcm4nIGZ1bmN0aW9uIHRoYXQgU1dJRyBnZW5lcmF0ZXMgaXMgc3VwZXJmbHVvdXMgdW5sZXNzIGEgdXNlciBoYXMgZm9yZ290dGVuIHRvIGFkZCB0aGUgZnVuY3Rpb24KICAgICAgICAgICAgZGVjbGFyYXRpb24gaW50byB0aGUgd3JhcHBlcnMuCgogICAgICAgICAgICBUaGUgLW5vZXh0ZXJuIGNvbW1hbmRsaW5lIGFyZ3VtZW50IGlzIG5vdyByZWR1bmRhbnQgYW5kIGEgbmV3IGNvbW1hbmRsaW5lIGFyZ3VtZW50IC1hZGRleHRlcm4gY2FuCiAgICAgICAgICAgIGJlIHVzZWQgdG8gb2J0YWluIHRoZSBvcmlnaW5hbCBiZWhhdmlvdXIuIFRoaXMgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSB1bmxlc3MgdGhlIGhlYWRlciBmaWxlCiAgICAgICAgICAgIGNvbnRhaW5pbmcgdGhlIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIHdhcyBpbmFkdmVydGVudGx5IG5vdCBhZGRlZCB0byB0aGUgd3JhcHBlcnMuIFRvIGZpeCB0aGlzCiAgICAgICAgICAgIGFkZCB0aGUgZnVuY3Rpb24gZGVjbGFyYXRpb24gaW50byB5b3VyIHdyYXBwZXJzLCBGb3IgZXhhbXBsZSwgcmVwbGFjZToKCiAgICAgICAgICAgICAgZXh0ZXJuIHZvaWQgZm9vKGludCk7CgogICAgICAgICAgICB3aXRoOgoKICAgICAgICAgICAgICAlaW5saW5lICV7CiAgICAgICAgICAgICAgZXh0ZXJuIHZvaWQgZm9vKGludCk7CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMDYvMjIvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhLCBNb2R1bGEzLCBPY2FtbF0KICAgICAgICAgICAgVGhlIGludGVybWVkaWFyeSBmdW5jdGlvbiBuYW1lcyBoYXZlIGJlZW4gY2hhbmdlZCB3aGVuIHdyYXBwaW5nIHZhcmlhYmxlcyB0bwogICAgICAgICAgICBtYXRjaCB0aGUgb3RoZXIgbGFuZ3VhZ2UgbW9kdWxlcyBzbyB0aGF0ICVleHRlbmQgZm9yIGEgbWVtYmVyIHZhcmlhYmxlIHdvcmtzCiAgICAgICAgICAgIHVuaWZvcm1seSBhY3Jvc3MgYWxsIGxhbmd1YWdlIG1vZHVsZXMsIGVnOgoKICAgICAgICAgICAgICAlZXh0ZW5kIEV4dGVuZE1lIHsKICAgICAgICAgICAgICAgIFZhcjsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgICAgdm9pZCBFeHRlbmRNZV9WYXJfc2V0KEV4dGVuZE1lICosIGRvdWJsZSkgey4uLn0KICAgICAgICAgICAgICAgIGRvdWJsZSBFeHRlbmRNZV9WYXJfZ2V0KEV4dGVuZE1lICopIHsuLi59CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFRoZSBtZXRob2RzIGltcGxlbWVudGluZyB0aGUgZ2V0L3NldCB1c2VkIHRvIGJlOgoKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgICAgdm9pZCBzZXRfRXh0ZW5kTWVfVmFyKEV4dGVuZE1lICosIGRvdWJsZSkgey4uLn0KICAgICAgICAgICAgICAgIGRvdWJsZSBnZXRfRXh0ZW5kTWVfVmFyKEV4dGVuZE1lICopIHsuLi59CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFRoaXMgYWxzbyBjaGFuZ2VzIHRoZSBuYW1lIG9mIHZhcmlhYmxlIHdyYXBwZXIgZnVuY3Rpb25zIHdoZW4gdXNpbmcgLW5vcHJveHkuCiAgICAgICAgICAgIFRoZSBvcmlnaW5hbCBuYW1lcyBjYW4gYmUgZ2VuZXJhdGVkIHdpdGggdGhlIC1vbGR2YXJuYW1lcyBjb21tYW5kbGluZSBvcHRpb24uCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKClZlcnNpb24gMS4zLjI1IChKdW5lIDExLCAyMDA1KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjA2LzExLzIwMDY6IG1rb2VwcGUKCSAgICBbR3VpbGVdIEZpeCBoYW5kbGluZyBvZiBhbm9ueW1vdXMtZW51bSB2YXJpYWJsZXMuCgowNi8xMC8yMDA1OiBta29lcHBlCgkgICAgW0d1aWxlXSBGaXggZm9yIGZ1bmN0aW9uIGFyZ3VtZW50cyB0aGF0IGFyZSBwYXNzZWQgYnkKCSAgICBjb3B5LW9mLXZhbHVlLiAgRml4IGZvciBnbG9iYWwgImNvbnN0IGNoYXIgKiIgdmFyaWFibGVzLgoJICAgIEZpeCB0ZXN0Y2FzZXMgYXJyYXlzX2RpbWVuc2lvbmxlc3MsIGFycmF5c19nbG9iYWwuCgowNi8wOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yIHdoZW4gYSBiYXNlIGNsYXNzIGRlZmluZXMgYSBzeW1ib2wgYXMgYSBtZW1iZXIgdmFyaWFibGUgYW5kIGEgZGVyaXZlZCBjbGFzcyBkZWZpbmVzCiAgICAgICAgICAgIHRoZSBzYW1lIHN5bWJvbCBhcyBhIG1lbWJlciBtZXRob2QuCgowNi8wOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIE1vcmUgZml4ZXMgZm9yIHZpcnR1YWwvbmV3L292ZXJyaWRlIG1vZGlmaWVycyAtIHdoZW4gYSBtZXRob2QgaGFzIHByb3RlY3RlZCBhY2Nlc3MgCiAgICAgICAgICAgIGluIGJhc2UgYW5kIHB1YmxpYyBhY2Nlc3MgaW4gZGVyaXZlZCBjbGFzcy4KCjA2LzAyLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTA2NjM2MyAtIEZvbGxvdyBjb252ZW50aW9uIG9mIHJlbGVhc2UgdGFyYmFsbCBuYW1lIG1hdGNoaW5nIGRpcmVjdG9yeSBuYW1lLgoKMDYvMDIvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBGaXggIzEyMTEzNTMgLSB0eXBlc2FmZSBlbnVtcyAoYW5kIEphdmEgcHJvcGVyIGVudW1zKSB3cmFwcGVycyB3aGVuIGVudW0gdmFsdWUKICAgICAgICAgICAgaXMgbmVnYXRpdmUuCgowNS8yNy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBNb2Rlcm5pc2VkIGFuZCB0aWRpZWQgdXAgV2luZG93cyBtYWNyb3MgLS0+IFNXSUdFWFBPUlQsIFNXSUdTVERDQUxMLiBUaGV5IGNhbiBiZSBvdmVycmlkZGVuCiAgICAgICAgICAgIGJ5IHVzZXJzIHZpYSAtRCBjb21waWxlciBkaXJlY3RpdmVzIGlmIG5lZWQgYmUuCgowNS8yNi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICAlY3NtZXRob2Rtb2RpZmllcnMgY2FuIGJlIGFwcGxpZWQgdG8gdmFyaWFibGVzIGFzIHdlbGwgYXMgbWV0aG9kcyBub3cuCgogICAgICAgICAgICBJbiBhZGRpdGlvbiB0byB0aGUgZGVmYXVsdCAncHVibGljJyBtb2RpZmllciB0aGF0IFNXSUcgZ2VuZXJhdGVzLCAlY3NtZXRob2Rtb2RpZmllcnMgd2lsbCBhbHNvCiAgICAgICAgICAgIHJlcGxhY2UgdGhlIHZpcnR1YWwvbmV3L292ZXJyaWRlIG1vZGlmaWVycyB0aGF0IFNXSUcgdGhpbmtzIGlzIGFwcHJvcHJpYXRlLiBUaGlzIGZlYXR1cmUgaXMKICAgICAgICAgICAgdXNlZnVsIGZvciBzb21lIG9ic2N1cmUgY2FzZXMgd2hlcmUgU1dJRyBtaWdodCBnZXQgdGhlIG1vZGlmaWVycyBpbmNvcnJlY3QsIGZvciBleGFtcGxlCiAgICAgICAgICAgIHdpdGggbXVsdGlwbGUgaW5oZXJpdGFuY2UgYW5kIG92ZXJyaWRpbmcgYSBtZXRob2QgaW4gdGhlIGJhc2UgY2xhc3MuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgQyMgTU9EVUxFICoqKgoKMDUvMjUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgQWRkZWQgbWlzc2luZyBjb25zdHJ1Y3RvcnMgdG8gc3RkOjpwYWlyIHdyYXBwZXJzIChzdGRfcGFpci5pKSBmb3IgYWxsIGxhbmd1YWdlcy4KCjA1LzI1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQWRkZWQgc3RkOjpwYWlyIHdyYXBwZXJzIGluIHN0ZF9wYWlyLmkKCjA1LzI1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gVGhlIEMjICduZXcnIGFuZCAnb3ZlcnJpZGUnIG1vZGlmaWVycyB3aWxsIGJlIGdlbmVyYXRlZCB3aGVuIGEgQysrIGNsYXNzIGluaGVyaXRzIG1ldGhvZHMKICAgICAgICAgICAgdmlhIGEgQysrICd1c2luZycgZGVjbGFyYXRpb24uCgowNS8yNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9ucyBwcmV2aW91c2x5IGJlaW5nIGlnbm9yZWQgaW4gY2xhc3NlcyB0aGF0IGluaGVyaXRlZCBtZXRob2RzCiAgICAgICAgICAgIGZyb20gJ3VzaW5nJyBkZWNsYXJhdGlvbnMsIGVnIGNhbGxzIHRvIERlcml2ZWQ6OmJhciBiZWxvdyB3aWxsIGNvbnZlcnQgQysrIGV4Y2VwdGlvbnMgaW50bwogICAgICAgICAgICBhIHRhcmdldCBsYW5ndWFnZSBleGNlcHRpb24vZXJyb3IsIGxpa2UgaXQgYWx3YXlzIGhhcyBkb25lIGZvciBCYXNlOjpCYXIuCgogICAgICAgICAgICBjbGFzcyBCYXNlIHsKICAgICAgICAgICAgICB2aXJ0dWFsIGJhcigpIHRocm93IChzdGQ6OnN0cmluZyk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGNsYXNzIERlcml2ZWQgOiBwdWJsaWMgQmFzZSB7CiAgICAgICAgICAgICAgdXNpbmcgQmFzZTo6YmFyOwogICAgICAgICAgICB9OwoKMDUvMjMvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4ZXMgZm9yIGRldGVjdGluZyB2aXJ0dWFsIG1ldGhvZHMgaW4gJWV4dGVuZCBmb3IgdGhlIC1mdmlydHVhbCBvcHRpb24gYW5kIEMjIG92ZXJyaWRlIGFuZCBuZXcKICAgICAgICAgICAgbWV0aG9kIG1vZGlmaWVycy4KCjA1LzIzLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gVGhlICduZXcnIG1vZGlmaWVyIGlzIG5vdyBnZW5lcmF0ZWQgb24gdGhlIHByb3h5IG1ldGhvZCB3aGVuIGEgbWV0aG9kIGluIGEgZGVyaXZlZAogICAgICAgICAgICBjbGFzcyBpcyBub3QgcG9seW1vcnBoaWMgYW5kIHRoZSBzYW1lIG1ldGhvZCBleGlzdHMgaW4gdGhlIGRlcml2ZWQgY2xhc3MgKGllIGl0IGhpZGVzCiAgICAgICAgICAgIHRoZSBiYXNlIGNsYXNzJyBub24tdmlydHVhbCBtZXRob2QpLgoKMDUvMjMvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBGaXhlcyB0byBkZXRlY3Rpb24gb2YgY292YXJpYW50IHJldHVybiB0eXBlcyAtIHdoZW4gdGhlIGNsYXNzIGhpZXJhcmNoeSBpcyBtb3JlCiAgICAgICAgICAgIHRoYW4gMiBjbGFzc2VzIGRlZXAuCgowNS8yMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gc3RkOjp3c3RyaW5nIHR5cGVtYXBzIG1vdmVkIGZyb20gc3RkX3N0cmluZy5pIHRvIHN0ZF93c3RyaW5nLmkKCjA1LzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBmb3IgY3Jhc2ggaW4gRG9oU3Ryc3RyLCBidWcgIzExOTA5MjEKCjA1LzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtUQ0xdIEZpeCBmb3IgbWV0aG9kcyB3aXRoIHNpbWlsYXIgbmFtZXMgd2hlbiBzaG93aW5nIGxpc3Qgb2YgbmFtZXMgb24gZXJyb3IgLSBidWcgIzExOTE4MjguCiAgICAgICAgICAgIFBhdGNoIGZyb20gSmVyb2VuIERvYmJlbGFlcmUuCgowNS8yMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbVENMXSBsb25nIGxvbmcgb3ZlcmxvYWRpbmcgZml4IC0gYnVnICMxMTkxODM1LCBwYXRjaCBmcm9tIEplcm9lbiBEb2JiZWxhZXJlLgoKMDUvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGJ1ZyAjMTE5Njc1NSB0byByZW1vdmUgZGVidWcgZnJvbSBzd2lndGNsOC5zd2cuCgowNS8xOS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMgYW5kIC1mdmlydHVhbCBvcHRpb25dIEZpeCBmb3IgdGhlIG92ZXJyaWRlIGtleSBub3QgYmVpbmcgZ2VuZXJhdGVkIGluIHRoZSBkZXJpdmVkIGNsYXNzIHdoZW4gYQogICAgICAgICAgICB2aXJ0dWFsIG1ldGhvZCdzIHJldHVybiB0eXBlIHdhcyBhIHR5cGVkZWYgaW4gZWl0aGVyIHRoZSBiYXNlIG9yIGRlcml2ZWQgY2xhc3MuIEFsc28gZW5zdXJlcyB0aGUKICAgICAgICAgICAgbWV0aG9kIGlzIGVsaW1pbmF0ZWQgd2hlbiB1c2luZyB0aGUgLWZ2aXJ0dWFsIG9wdGlvbi4gRm9yIGV4YW1wbGUsIERlcml2ZWQubWV0aG9kIG5vdyBoYXMgdGhlIEMjCiAgICAgICAgICAgIG92ZXJyaWRlIGtleXdvcmQgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgICB0eXBlZGVmIGludCogSW50ZWdlclB0cjsKCiAgICAgICAgICAgICAgc3RydWN0IEJhc2UgewogICAgICAgICAgICAgICAgdmlydHVhbCBJbnRlZ2VyUHRyIG1ldGhvZCgpOwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgIHN0cnVjdCBEZXJpdmVkIDogQmFzZSB7CiAgICAgICAgICAgICAgICBpbnQgKiBtZXRob2QoKSBjb25zdDsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgW0MjXSBGaXggZm9yIHRoZSBvdmVycmlkZSBrZXkgYmVpbmcgaW5jb3JyZWN0bHkgZ2VuZXJhdGVkIGZvciB2aXJ0dWFsIG1ldGhvZHMgd2hlbiBhIGJhc2UgY2xhc3MKICAgICAgICAgICAgaXMgaWdub3JlZCB3aXRoICVpZ25vcmUuCgowNS8xMy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4ZXMgdG8gcmVtb3ZlICJkZXJlZmVyZW5jaW5nIHR5cGUtcHVubmVkIHBvaW50ZXIgd2lsbCBicmVhayBzdHJpY3QtYWxpYXNpbmcgcnVsZXMiCiAgICAgICAgICAgIHdhcm5pbmdzIGluIEMgd3JhcHBlcnMgd2hlbiBjb21waWxpbmcgQyBjb2RlIHdpdGggJ2djYyAtV2FsbCAtZnN0cmljdC1hbGlhc2luZycuIFBhdGNoIGZyb20KICAgICAgICAgICAgTWljaGFlbCBDYWhpbGwuIFRoaXMgbW9kaWZpZXMgbWFueSBvZiB0aGUgY2FzdHMgc2xpZ2h0bHksIGZvciBleGFtcGxlCiAgICAgICAgICAgICAgYXJnMSA9ICooREJfRU5WICoqKSZqYXJnMTsKICAgICAgICAgICAgdG8KICAgICAgICAgICAgICBhcmcxID0gKihEQl9FTlYgKiopKHZvaWQgKikmamFyZzE7CgowNS8xMi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFN1cHBvcnQgZm9yIEMjIGF0dHJpYnV0ZXMuIEMjIGF0dHJpYnV0ZXMgY2FuIGJlIGdlbmVyYXRlZDoKICAgICAgICAgICAgMSkgT24gYSBDL0MrKyB0eXBlIGJhc2lzIGJ5IHNwZWNpZnlpbmcgYW4gaW5hdHRyaWJ1dGVzIGFuZC9vciBvdXRhdHRyaWJ1dGVzIHR5cGVtYXAgYXR0cmlidXRlCiAgICAgICAgICAgICAgIGluIHRoZSBpbXR5cGUgb3IgY3N0eXBlIHR5cGVtYXBzIChmb3IgQyMgcmV0dXJuIHR5cGUgb3IgQyMgcGFyYW1ldGVyIHR5cGUgYXR0cmlidXRlcykuCiAgICAgICAgICAgIDIpIE9uIGEgd3JhcHBlZCBtZXRob2Qgb3IgdmFyaWFibGUgYnkgc3BlY2lmeWluZyBhIGNzYXR0cmlidXRlcyBmZWF0dXJlICglZmVhdHVyZSkuCiAgICAgICAgICAgIDMpIE9uIGEgd3JhcHBlZCBwcm94eSBjbGFzcyBvciBlbnVtIGJ5IHNwZWNpZnlpbmcgYSBjc2F0dHJpYnV0ZXMgdHlwZW1hcC4KCiAgICAgICAgICAgIEV4YW1wbGVzIGFyZSBpbiB0aGUgQyMgZG9jdW1lbnRhdGlvbiAoQ1NoYXJwLmh0bWwpLgoKMDQvMjkvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgTmV3IGNvbmZpZ3VyZSBvcHRpb24gdG8gdHVybiBvZmYgdGhlIGRlZmF1bHQgbWF4aW11bSBjb21waWxlciB3YXJuaW5nIGFzCiAgICAgICAgICAgIHRoZXkgY291bGRuJ3QgYmUgcmVtb3ZlZCBldmVuIHdoZW4gb3ZlcnJpZGluZyBDRkxBR1MgYW5kIENYWEZMQUdTIHdpdGggY29uZmlndXJlCiAgICAgICAgICAgICguL2NvbmZpZ3VyZSBDRkxBR1M9IENYWEZMQUdTPSkuIFRvIHR1cm4gdGhlIG1heGltdW0gd2FybmluZ3Mgb2ZmLCBydW46ICAKCiAgICAgICAgICAgICAgLi9jb25maWd1cmUgLS13aXRob3V0LW1heGltdW0tY29tcGlsZS13YXJuaW5ncwoKMDQvMjgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggZnJvbSBTY290dCBNaWNoZWwgd2hpY2ggcmV3b3JrcyB0aGUgSmF2YSBjb25zdHJ1Y3RvciBhbmQgZmluYWxpemUvZGVzdHJ1Y3RvciB0eXBlbWFwcywKICAgICAgICAgICAgZm9yIGRpcmVjdG9ycyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBvdmVyYWxsIEphdmEgdHlwZW1hcHMuIEFkZGVkIHRoZSBkaXJlY3Rvcl90YWtlIGFuZCAKICAgICAgICAgICAgZGlyZWN0b3JfcmVsZWFzZSB0eXBlbWFwcyB0byBlbXVsYXRlIG90aGVyIG1vZHVsZXMnIF9fZGlzb3duX18gZnVuY3Rpb25hbGl0eS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIERJUkVDVE9SUyAqKioKCjA0LzI4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4ZWQgcHJvYmxlbXMgZHVlIHRvIHRoZSBvdmVyIGVhZ2VyIGdhcmJhZ2UgY29sbGVjdG9yLiBPY2Nhc2lvbmFsbHkgdGhlCiAgICAgICAgICAgIGdhcmJhZ2UgY29sbGVjdG9yIHdvdWxkIGNvbGxlY3QgYSBDIyBwcm94eSBjbGFzcyBpbnN0YW5jZSB3aGlsZSBpdCB3YXMgYmVpbmcgdXNlZAogICAgICAgICAgICBpbiB1bm1hbmFnZWQgY29kZSBpZiB0aGUgb2JqZWN0IHdhcyBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIgdG8gYSB3cmFwcGVkIGZ1bmN0aW9uLgogICAgICAgICAgICBOZWVkbGVzcyB0byBzYXkgdGhpcyBjYXVzZWQgaGF2b2MgYXMgdGhlIEMjIHByb3h5IGNsYXNzIGNhbGxzIHRoZSBDKysgZGVzdHJ1Y3RvcgogICAgICAgICAgICB3aGVuIGl0IGlzIGNvbGxlY3RlZC4gUHJveHkgY2xhc3NlcyBhbmQgdHlwZSB3cmFwcGVyIGNsYXNzZXMgbm93IHVzZSBhIEhhbmRsZVJlZiwKICAgICAgICAgICAgd2hpY2ggaG9sZHMgYW4gSW50UHRyLCBpbnN0ZWFkIG9mIGEgcGxhaW4gSW50UHRyIHRvIG1hcnNoYWwgdGhlIEMrKyBwb2ludGVyIHRvIHVubWFuYWdlZAogICAgICAgICAgICBjb2RlLiBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhbnkgcGVyZm9ybWFuY2UgZGVncmFkYXRpb24gYXMgYSByZXN1bHQgb2YgdGhpcwogICAgICAgICAgICBtb2RpZmljYXRpb24uCgogICAgICAgICAgICBUaGUgY2hhbmdlcyBhcmUgaW4gdGhlIHByb3h5IGFuZCB0eXBlIHdyYXBwZXIgY2xhc3Nlcy4gVGhlIHN3aWdDUHRyIGlzIG5vdyBvZiB0eXBlIEhhbmRsZVJlZgogICAgICAgICAgICBpbnN0ZWFkIG9mIEludFB0ciBhbmQgY29uc2VxdWVudGx5IHRoZSBnZXRDUHRyIG1ldGhvZCByZXR1cm4gdHlwZSBoYXMgYWxzbyBjaGFuZ2VkLiBUaGUgbmV0CiAgICAgICAgICAgIGVmZmVjdCBpcyB0aGF0IGFueSBjdXN0b20gd3JpdHRlbiB0eXBlbWFwcyBtaWdodCBoYXZlIHRvIGJlIG1vZGlmaWVkIHRvIHN1aXRlLiBBZmZlY3RlZCB1c2VycwogICAgICAgICAgICBzaG91bGQgbm90ZSB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSBuZXcgJ291dCcgYXR0cmlidXRlIGluIHRoZSBpbXR5cGUgdHlwZW1hcCBhcyB0aGUKICAgICAgICAgICAgaW5wdXQgdHlwZSBpcyBub3cgYSBIYW5kbGVSZWYgYW5kIHRoZSBvdXRwdXQgdHlwZSBpcyBzdGlsbCBhbiBJbnRQdHIuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgQyMgTU9EVUxFICoqKgoKMDQvMjgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBTdXBwb3J0IGZvciBhc3ltbWV0cmljIHR5cGUgbWFyc2hhbGxpbmcgYWRkZWQuIFNvbWV0aW1lcyB0aGUgb3V0cHV0IHR5cGUgbmVlZHMgdG8gYmUKICAgICAgICAgICAgZGlmZmVyZW50IHRvIHRoZSBpbnB1dCB0eXBlLiBTdXBwb3J0IGZvciB0aGlzIGNvbWVzIGluIHRoZSBmb3JtIG9mIGEgbmV3IG9wdGlvbmFsICdvdXQnCiAgICAgICAgICAgIGF0dHJpYnV0ZSBmb3IgdGhlIGN0eXBlLCBpbXR5cGUgYW5kIGNzdHlwZSB0eXBlbWFwcy4gSWYgdGhpcyB0eXBlbWFwIGF0dHJpYnV0ZSBpcyBub3QKICAgICAgICAgICAgc3BlY2lmaWVkLCB0aGVuIHRoZSB0eXBlIHVzZWQgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dCBpcyB0aGUgdHlwZSBzcGVjaWZpZWQgaW4gdGhlCiAgICAgICAgICAgIHR5cGVtYXAsIGFzIGhhcyBhbHdheXMgcHJldmlvdXNseSBiZWVuIHRoZSBjYXNlLiBJZiB0aGlzIHR5cGVtYXAgYXR0cmlidXRlIGlzIHNwZWNpZmllZCwKICAgICAgICAgICAgdGhlbiB0aGUgdHlwZSBzcGVjaWZpZWQgaW4gdGhlIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBvdXRwdXQgdHlwZXMgYW5kIHRoZSB0eXBlIHNwZWNpZmllZAogICAgICAgICAgICBpbiB0aGUgdHlwZW1hcCBpdHNlbGYgaXMgdXNlZCBmb3IgdGhlIGlucHV0IHR5cGUuIEFuIG91dHB1dCB0eXBlIGlzIGEgcmV0dXJuIHZhbHVlIGZyb20KICAgICAgICAgICAgYSB3cmFwcGVkIG1ldGhvZCBvciB3cmFwcGVkIGNvbnN0YW50IGFuZCBhbiBpbnB1dCB0eXBlIGlzIGEgcGFyYW1ldGVyIGluIGEgd3JhcHBlZCBtZXRob2QuCgogICAgICAgICAgICBBbiBleGFtcGxlIHNob3dzIHRoYXQgY2hhciAqIGNvdWxkIGJlIG1hcnNoYWxsZWQgaW4gZGlmZmVyZW50IHdheXMsIAoKICAgICAgICAgICAgICAldHlwZW1hcChpbXR5cGUsIG91dD0iSW50UHRyIikgY2hhciAqICJzdHJpbmciCiAgICAgICAgICAgICAgY2hhciAqIGZ1bmN0aW9uKGNoYXIgKik7CgogICAgICAgICAgICBUaGUgb3V0cHV0IHR5cGUgaXMgdGh1cyBJbnRQdHIgYW5kIHRoZSBpbnB1dCB0eXBlIGlzIHN0cmluZy4gVGhlIHJlc3VsdGluZyBpbnRlcm1lZGlhcnkgQyMgY29kZSBpczoKCiAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBleHRlcm4gSW50UHRyIGZ1bmN0aW9uKHN0cmluZyBqYXJnMSk7CgowNC8yMi8yMDA1OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBGaXggZ2VuZXJhdGlvbiBvZiAiZGVmaW5lLW1ldGhvZCIgZm9yIG1ldGhvZHMgb2YKCSAgICBjbGFzc2VzIHdpdGggYSBjb25zdHJ1Y3Rvci4gIFJlcG9ydGVkIGJ5IEx1aWdpIEJhbGxhYmlvLgoKMDQvMTUvMjAwNTogd3V6emViIChKb2huIExlbnopCgkgICAgW0NoaWNrZW5dCgkgICAgRm9yIHdyYXBwZWQgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIG11bHRpcGxlIHZhbHVlcyAodXNpbmcgYXJnb3V0KSwKCSAgICBTV0lHIENISUNLRU4gbm93IHJldHVybnMgdGhlbSBhcyBtdWx0aXBsZSB2YWx1ZXMgaW5zdGVhZCBvZiBhcwoJICAgIGEgbGlzdC4gIFRoZXkgY2FuIHRoZW4gYmUgYWNjZXNzZWQgdXNpbmcgKGNhbGwtd2l0aC12YWx1ZXMpLgoKMDQvMTQvMjAwNTogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtDaGlja2VuXQogICAgICAgICAgICArIEFkZGVkIGEgd2hvbGUgYnVuY2ggb2YgbmV3IF9ydW5tZSBzY3JpcHRzIGludG8gdGhlIGNoaWNrZW4gdGVzdAogICAgICAgICAgICBzdWl0ZS4gIEFsc28gZml4IHNvbWUgYnVncyB0aGVzZSBuZXcgc2NyaXB0cyB0dXJuZWQgdXAuCgogICAgICAgICAgICArIEFkZGVkIG9wdGltaXphdGlvbiB3aGVuIHJldHVybmluZyBhIHdyYXBwZWQgcHJveHkgY2xhc3MuICBCZWZvcmUsCiAgICAgICAgICAgIGEgbWlub3IgZ2FyYmFnZSBjb2xsZWN0aW9uIHdhcyBpbnZva2VkIGV2ZXJ5IHRpbWUgYSBmdW5jdGlvbiByZXR1cm5lZC4KCgkgICAgKyBBbGwgdGhlIGNoaWNrZW4gRXhhbXBsZXMgc2hvdWxkIG5vdyBydW4gY29ycmVjdGx5CgowNC8xNC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIE1vcmUgZml4ZXMgZm9yIHR5cGVtYXAgbWF0Y2hpbmcgd2hlbiB3cmFwcGluZyB2YXJpYWJsZXMsIGluIHBhcnRpY3VsYXIKICAgICAgICAgICAgc3RkOjpzdHJpbmcsIHNvIHRoYXQgc3RkOjpzdHJpbmcgdmFyaWFibGVzIGNhbiBiZSBlYXNpbHkgbWFyc2hhbGxlZCB3aXRoCiAgICAgICAgICAgIGEgQyMgc3RyaW5nIHByb3BlcnR5IHVzaW5nOgoKICAgICAgICAgICAgICAlaW5jbHVkZSAic3RkX3N0cmluZy5pIgogICAgICAgICAgICAgICVhcHBseSBjb25zdCBzdGQ6OnN0cmluZyAmIHsgc3RkOjpzdHJpbmcgKnZhcmlhYmxlX25hbWUgfTsKICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2YXJpYWJsZV9uYW1lOwoKICAgICAgICAgICAgKFJlY2FsbCB0aGF0IGFsbCBjbGFzcyB2YXJpYWJsZXMgYXJlIHdyYXBwZWQgdXNpbmcgcG9pbnRlcnMpCgowNC8wNS8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbQ2hpY2tlbl0KCSAgICArIEFkZGVkIEV4YW1wbGVzL2NoaWNrZW4vZWdnLCBhbiBleGFtcGxlIG9uIGhvdyB0byBidWlsZCBhIGNoaWNrZW4KCSAgICAgIGV4dGVuc2lvbiBsaWJyYXJ5IGluIHRoZSBmb3JtIG9mIGFuIGVnZy4gIEFsc28gdXBkYXRlZCB0aGUKCSAgICAgIGRvY3VtZW50YXRpb24gb24gdGhlIGRpZmZlcmVudCBsaW5raW5nIG9wdGlvbnMuCgoJICAgICsgY2hpY2tlbiB0ZXN0LXN1aXRlIG5vdyBoYXMgc3VwcG9ydCB0byBjaGVjayBTV0lHIHdpdGggdGhlIC1wcm94eQoJICAgICAgYXJndW1lbnQgaWYgdGhlcmUgZXhpc3RzIGEgX3Byb3h5X3J1bm1lLnNzIGZpbGUuCgoJICAgICsgTW9yZSBmaXhlcyBmb3Igb3ZlcmxvYWRlZCBmdW5jdGlvbnMgYW5kIC1wcm94eQoKMDMvMzEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgVHVybmVkIG9uIGV4dHJhIHRlbXBsYXRlIGZlYXR1cmVzIGZvciBhbGwgbGFuZ3VhZ2VzIHdoaWNoIHdlcmUKICAgICAgICAgICAgcHJldmlvdXNseSBvbmx5IGF2YWlsYWJsZSB0byBQeXRob24uCgogICAgICAgICAgICBUaGlzIGVuYWJsZXMgdHlwZW1hcHMgZGVmaW5lZCB3aXRoaW4gYSB0ZW1wbGF0ZWQgY2xhc3MgdG8gYmUgdXNlZCBhcwogICAgICAgICAgICBleHBlY3RlZC4gUmVxdWlyZXMgJXRlbXBsYXRlIG9uIHRoZSB0ZW1wbGF0ZWQgY2xhc3MsICV0ZW1wbGF0ZSgpIHdpbGwKICAgICAgICAgICAgYWxzbyBwaWNrIHVwIHRoZSB0eXBlbWFwcy4gRXhhbXBsZToKCiAgICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgRm9vICJpbiB0eXBlbWFwIGZvciBGb288VD4gIgogICAgICAgICAgICAgICAgb3IKICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBGb288VD4gImluIHR5cGVtYXAgZm9yIEZvbzxUPiAiCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAKICAgICAgICAgICAgICAldGVtcGxhdGUoRm9vX2kpIEZvbzxpbnQ+OwogICAgICAgICAgICAgICV0ZW1wbGF0ZSgpIEZvbzxkb3VibGU+OwogICAgICAgICAgICAgIAogICAgICAgICAgICB3aWxsIGdlbmVyYXRlIHRoZSBwcm9wZXIgJ2luJyB0eXBlbWFwcyB3aGVyZXZlciBGb288aW50PiBhbmQgRm9vPGRvdWJsZT4KICAgICAgICAgICAgYXJlIHVzZWQuCgowMy8zMC8yMDA1OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW016U2NoZW1lXSBQYXRjaCBmcm9tIEhhbnMgT2VzdGVyaG9sdCBmb3Igc3VwcG9ydGluZyBNelNjaGVtZSAzMHguCgowMy8yOS8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbQ2hpY2tlbl0KCSAgICArIFJlYWxsb3cgb2xkZXIgdmVyc2lvbnMgb2YgY2hpY2tlbiAoMS40MCB0byAxLjg5KSBieSBwYXNzaW5nIC1ub2NvbGxlY3Rpb24KCSAgICAgIGFyZ3VtZW50IHRvIFNXSUcKCSAgICArICVpbXBvcnQgbm93IHdvcmtzIGNvcnJlY3RseSB3aXRoIHRpbnljbG9zLiAgKGRlY2xhcmUgKHVzZXMgLi4uKSkgd2lsbCBiZQoJICAgICAgZXhwb3J0ZWQgY29ycmVjdGx5LgoJICAgICsgVGlueUNMT1MgcHJveHkgY2xhc3NlcyBub3cgd29yayBjb3JyZWN0bHkgd2l0aCBvdmVybG9hZGVkIGZ1bmN0aW9ucwoJICAgICAgYW5kIGNvbnN0cnVjdG9ycy4KCjAzLzI5LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBQYXRjaCBmcm9tIFNjb3R0IE1pY2hlbCBmb3IgZGlyZWN0b3JvdXQgdHlwZW1hcHMuIEphdmEgZGlyZWN0b3JzCiAgICAgICAgICAgIHJlcXVpcmUgdGhlIGRpcmVjdG9yb3V0IHR5cGVtYXBzIGxpa2UgdGhlIG90aGVyIGxhbmd1YWdlcyBub3cuIFRoZSBuZXcKICAgICAgICAgICAgdHlwZW1hcHMgcHJvdmlkZSBmaXhlcyBmb3IgbWV0aG9kcyB3aGVyZSB0aGUgcmV0dXJuIHR5cGUgaXMgcmV0dXJuZWQKICAgICAgICAgICAgYnkgcmVmZXJlbmNlICh0aGlzIGNhbm5vdCBhdXRvbWF0aWNhbGx5IGJlIG1hZGUgdGhyZWFkIHNhZmUgdGhvdWdoKS4KCjAzLzIyLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEVudW0gY2FzdGluZyBmaXhlcy4gVmlzdWFsIEMrKyBkaWRuJ3QgbGlrZSB0aGUgQyB0eXBlIGNhc3RpbmcgU1dJRyBwcm9kdWNlZAogICAgICAgICAgICB3aGVuIHdyYXBwaW5nIEMrKyBlbnVtIHJlZmVyZW5jZXMsIGFzIHJlcG9ydGVkIGJ5IEFkbWlyZSBLYW5kYXdhc3Zpa2EuCgowMy8yMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gU0YgIzExMjQ0OTAuIEZpeCBQZXJsIG1hY3JvIGNsYXNoZXMgd2hlbiB1c2luZyBWaXN1YWwgU3R1ZGlvJ3MgU1RMIHN0cmluZywKICAgICAgICAgICAgc28gbm93IHByb2plY3RzIGNhbiAjaW5jbHVkZSA8c3RyaW5nPi4KCjAzLzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeGVkICV2YXJhcmdzIHdoaWNoIGdvdCBicm9rZW4gd2l0aCB0aGUgcmVjZW50IGRlZmF1bHQgYXJndW1lbnQgY2hhbmdlcy4KICAgICAgICAgICAgQWxzbyB3b3JrcyBmb3IgSmF2YSBhbmQgQyMgZm9yIHRoZSBmaXJzdCB0aW1lIG5vdy4KCjAzLzE3LzIwMDU6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBbQ2hpY2tlbl0gCgkgICAgKyBGaXggYSB3aG9sZSBidW5jaCBvZiBidWdzIGluIHRoZSBjaGlja2VuIG1vZHVsZS4gIFRoZSBlbnRpcmUKICAgICAgICAgICAgICB0ZXN0IHN1aXRlIG5vdyBjb21waWxlcywgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSB0ZXN0cyB0aGF0IHJlcXVpcmUKCSAgICAgIHN0ZF92ZWN0b3IuaSwgc3RkX2RlcXVlLmksIGFuZCBzbyBvbiwgd2hpY2ggY2hpY2tlbiBkb2VzIG5vdCBoYXZlIHlldC4KCgkgICAgKyBBZGQgc3VwcG9ydCBmb3IgJWV4Y2VwdGlvbiBhbmQgJXR5cGVtYXAoZXhjZXB0aW9ucykuICBFeGNlcHRpb25zIGFyZQoJICAgICAgdGhyb3duIHdpdGggYSBjYWxsIHRvIChhYm9ydCkgYW5kIGNhbiBiZSBoYW5kbGVkIGJ5IChoYW5kbGUtZXhjZXB0aW9ucykKCjAzLzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBQYXRjaCBmcm9tIFNjb3R0IE1pY2hlbCBmb3IgZGlyZWN0b3JzLiBNb2RpZmljYXRpb25zIHRvIHRoZSB0eXBlbWFwcwogICAgICAgICAgICBnaXZpbmcgdXNlcnMgZmluZSBjb250cm9sIG92ZXIgbWVtb3J5IG93bmVyc2hpcCBhbmQgbGlmZXRpbWUgb2YgZGlyZWN0b3IgY2xhc3Nlcy4KICAgICAgICAgICAgRGlyZWN0b3IgY2xhc3NlcyBubyBsb25nZXIgbGl2ZSBmb3JldmVyIGJ5IGRlZmF1bHQgYXMgdGhleSBhcmUgbm93IGNvbGxlY3RhYmxlCiAgICAgICAgICAgIGJ5IHRoZSBHQy4KCjAzLzE1LzIwMDU6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtDaGlja2VuXSBBZGQgc3VwcG9ydCBmb3IgYWRkaW5nIGZpbmFsaXplcnMgZ2FyYmFnZSBjb2xsZWN0ZWQgb2JqZWN0cy4KCSAgICBGdW5jdGlvbnMgdGhhdCByZXR1cm4gbmV3IG9iamVjdHMgc2hvdWxkIGJlIG1hcmtlZCB3aXRoICVuZXdvYmplY3QgYW5kCgkgICAgaW5wdXQgYXJndW1lbnRzIHdoaWNoIGNvbnN1bWUgKG9yIHRha2Ugb3duZXJzaGlwKSBvZiBhIHBvaW50ZXIgc2hvdWxkCgkgICAgYmUgbWFya2VkIHdpdGggdGhlIERJU09XTiB0eXBlbWFwLgoKCSAgICBBbHNvIGFkZCBzdXBwb3J0IGZvciBjb3JyZWN0bHkgY2hlY2tpbmcgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgcGFzc2VkCgkgICAgdG8gYSBmdW5jdGlvbiwgYW5kIHJhaXNpbmcgYW4gZXJyb3IgaWYgdGhlIHdyb25nIG51bWJlciBhcmUgcGFzc2VkLgoKMDMvMTQvMjAwNTogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIEFkZCAtLXdpdGhvdXQtYWxsbGFuZyBvcHRpb24gdG8gY29uZmlndXJlLmluLCB3aGljaCBpcyB0aGUgc2FtZSBhcwogICAgICAgICAgICBwYXNzaW5nIGFsbCB0aGUgLS13aXRob3V0LXB5dGhvbiAtLXdpdGhvdXQtcGVybDUgZXRjLi4uIHRoYXQgTWF0dGhpYXMgYWRkZWQuCgowMy8wOS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGhwXSBNZW1vcnkgbGVhayBmaXggZm9yIGZ1bmN0aW9ucyByZXR1cm5pbmcgY2xhc3Nlcy9zdHJ1Y3RzIGJ5IHZhbHVlLgoKMDMvMDgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIEZpeCBmb3IgUGVybCBpbmNvcnJlY3RseSB0YWtpbmcgbWVtb3J5IG93bmVyc2hpcCBmb3IgcmV0dXJuIHR5cGVzIHRoYXQKICAgICAgICAgICAgYXJlIHR5cGVkZWZzIHRvIGEgc3RydWN0L2NsYXNzIHBvaW50ZXIuIFJlcG9ydGVkIGJ5IEpvc2ggQ2hlcnJ5LgoKMDMvMDcvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBWYXJpb3VzIGV4Y2VwdGlvbiBjaGFuZ2VzIGZvciB0aGUgc3RkOjp2ZWN0b3Igd3JhcHBlcnMuIFRoZXNlIG5vdyBtb3JlCiAgICAgICAgICAgIGFjY3VyYXRlbHkgbWlycm9yIHRoZSBzYW1lIGV4Y2VwdGlvbnMgdGhhdCBTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0IHRocm93LgoKMDMvMDcvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggdW5kZWZpbmVkIGJlaGF2aW91ciBhZnRlciBhbnkgb2YgdGhlIHN0ZDo6dmVjdG9yIG1ldGhvZHMKICAgICAgICAgICAgdGhyb3cgYW4gZXhjZXB0aW9uLgoKMDMvMDcvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBXaGVuIG51bGwgaXMgcGFzc2VkIGZvciBhIEMrKyByZWZlcmVuY2Ugb3IgdmFsdWUgcGFyYW1ldGVyLCB0aGUgCiAgICAgICAgICAgIGV4Y2VwdGlvbiB0aHJvd24gaGFzIGJlZW4gY29ycmVjdGVkIHRvIGFuIEFyZ3VtZW50TnVsbEV4Y2VwdGlvbiBpbnN0ZWFkCiAgICAgICAgICAgIG9mIE51bGxSZWZlcmVuY2VFeGNlcHRpb24gYXMgcmVjb21tZW5kZWQgaW4gdGhlIC5ORVQgRnJhbWV3b3JrIGRvY3VtZW50YXRpb24uCgogICAgICAgICAgICBUaGUgZGVmYXVsdCB0aHJvd3MgdHlwZW1hcHMgdHVybiBhIEMrKyBleGNlcHRpb24gaW50byBhbiBBcHBsaWNhdGlvbkV4Y2VwdGlvbiwKICAgICAgICAgICAgbm90IGEgU3lzdGVtRXhjZXB0aW9uIG5vdy4KCjAzLzA3LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gTnVtZXJvdXMgY2hhbmdlcyBpbiBDIyBleGNlcHRpb24gaGFuZGxpbmcgaGF2ZSBiZWVuIG1hZGUgb3ZlciB0aGUgcGFzdAogICAgICAgICAgICBmZXcgd2Vla3MuIEEgc3VtbWFyeSBmb2xsb3dzOgoKICAgICAgICAgICAgVGhlIHdheSBpbiB3aGljaCBDKysgZXhjZXB0aW9ucyBhcmUgbWFwcGVkIHRvIEMjIGV4Y2VwdGlvbnMgaXMgcXVpdGUgZGlmZmVyZW50LgogICAgICAgICAgICBUaGUgY2hhbmdlIGlzIHRvIGZpeCBDIyBleGNlcHRpb25zIHNvIHRoYXQgdGhlIEMrKyBleGNlcHRpb24gc3RhY2sgaXMgY29ycmVjdGx5CiAgICAgICAgICAgIHVud291bmQgYXMgcHJldmlvdXNseSBDKysgZXhjZXB0aW9ucyB3ZXJlIGJlaW5nIHRocm93biBhY3Jvc3MgdGhlIEMgUEludm9rZSBsYXllcgogICAgICAgICAgICBpbnRvIHRoZSBtYW5hZ2VkIHdvcmxkLgoKICAgICAgICAgICAgTmV3IHR5cGVtYXAgYXR0cmlidXRlcyAoY2FudGhyb3cgYW5kIGV4Y29kZSkgaGF2ZSBiZWVuIGludHJvZHVjZWQgdG8gY29udHJvbCB0aGUKICAgICAgICAgICAgbWFwcGluZyBvZiBDKysgdG8gQyMgZXhjZXB0aW9ucy4gRXNzZW50aWFsbHkgYSBjYWxsYmFjayBpbnRvIHRoZSB1bm1hbmFnZWQgd29ybGQKICAgICAgICAgICAgaXMgbWFkZSB0byBzZXQgYSBwZW5kaW5nIGV4Y2VwdGlvbi4gVGhlIGV4Y2VwdGlvbiB0byB0aHJvdyBpcyBzdG9yZWQgaW4gdGhyZWFkIGxvY2FsCiAgICAgICAgICAgIHN0b3JhZ2UgKHNvIHRoZSBhcHByb2FjaCBpcyB0aHJlYWQtc2FmZSkuIFRoZSB0eXBlbWFwcyBhcmUgZXhwZWN0ZWQgdG8gcmV0dXJuCiAgICAgICAgICAgIGZyb20gdW5tYW5hZ2VkIGNvZGUgYXMgc29vbiBhcyB0aGUgcGVuZGluZyBleGNlcHRpb24gaXMgc2V0LiBBbnkgcGVuZGluZyBleGNlcHRpb25zCiAgICAgICAgICAgIGFyZSBjaGVja2VkIGZvciBhbmQgdGhyb3duIG9uY2UgbWFuYWdlZCBjb2RlIHN0YXJ0cyBleGVjdXRpbmcuIFRoZXJlIHNob3VsZAogICAgICAgICAgICBiZSBtaW5pbWFsIGltcGFjdCBvbiBleGVjdXRpb24gc3BlZWQgZHVyaW5nIG5vcm1hbCBiZWhhdmlvdXIuIEZ1bGwgZGV0YWlscyB3aWxsIGJlCiAgICAgICAgICAgIGRvY3VtZW50ZWQgaW4gQ1NoYXJwLmh0bWwuCgogICAgICAgICAgICBUaGUgU1dJR19DU2hhcnBUaHJvd0V4Y2VwdGlvbigpIGZ1bmN0aW9uIGhhcyBiZWVuIHJlbW92ZWQgYW5kIHJlcGxhY2VkIHdpdGggdGhlCiAgICAgICAgICAgIFNXSUdfQ1NoYXJwU2V0UGVuZGluZ0V4Y2VwdGlvbkFyZ3VtZW50KCkgYW5kIFNXSUdfQ1NoYXJwU2V0UGVuZGluZ0V4Y2VwdGlvbigpCiAgICAgICAgICAgIGZ1bmN0aW9ucy4gVGhlIG9yaWdpbmFsIG5hbWUgaGFzIGJlZW4gZGVsaWJlcmF0ZWx5IGNoYW5nZWQgdG8gYnJlYWsgb2xkIGNvZGUgYXMKICAgICAgICAgICAgdGhlIG9sZCBhcHByb2FjaCB3YXMgc29tZXdoYXQgZmxhd2VkLiBBbnkgdXNlciBkZWZpbmVkIGV4Y2VwdGlvbnMgdGhhdCBmb2xsb3cgdGhlCiAgICAgICAgICAgIHNhbWUgcGF0dGVybiBhcyB0aGUgb2xkIGFwcHJvYWNoIHNob3VsZCBhbHNvIGJlIGZpeGVkLgoKICAgICAgICAgICAgTnVtZXJvdXMgbmV3IC5ORVQgZnJhbWV3b3JrIGV4Y2VwdGlvbnMgYXJlIG5vdyBhdmFpbGFibGUgZm9yIGVhc3kgdGhyb3dpbmcgZnJvbSAKICAgICAgICAgICAgdW5tYW5hZ2VkIGNvZGUuIFRoZSBjb21wbGV0ZSBsaXN0IGlzOiAKCiAgICAgICAgICAgICAgQXBwbGljYXRpb25FeGNlcHRpb24sIEFyaXRobWV0aWNFeGNlcHRpb24sIERpdmlkZUJ5WmVyb0V4Y2VwdGlvbiwgCiAgICAgICAgICAgICAgSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uLCBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgCiAgICAgICAgICAgICAgTnVsbFJlZmVyZW5jZUV4Y2VwdGlvbiwgT3V0T2ZNZW1vcnlFeGNlcHRpb24sIE92ZXJmbG93RXhjZXB0aW9uLCAKICAgICAgICAgICAgICBTeXN0ZW1FeGNlcHRpb24sIEFyZ3VtZW50RXhjZXB0aW9uLCBBcmd1bWVudE51bGxFeGNlcHRpb24gYW5kCiAgICAgICAgICAgICAgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEMjIE1PRFVMRSAqKioKCjA1LzA1LzIwMDU6IG1tYXR1cwoJICAgIAoJICAgIEZpeCBzZXZlcmFsIG1lbW9yeSBsZWFrcyBhcm91bmQuIEV2ZW4gd2hlbiB3ZSBzdXJ2aXZlICBrbm93bmluZwoJICAgIHN3aWcgaXMgYSBtZW1vcnkgbGVhayBmYWN0b3J5LCBpdCB3YXMgYSBsaXR0bGUgb3V0IG9mCgkgICAgY29udHJvbC4gVG8gcnVuIHN0ZF9jb250YWluZXJzLmkgaW4gdGhlIHB5dGhvbiB0ZXN0LXN1aXRlLAoJICAgIHN3aWcgd2FzIHVzaW5nIH4yNjBNQiwgbm93IGl0IHVzZXMgJ29ubHknIH40ME1CLCB3aGljaCBpcwoJICAgIHRoZSBzYW1lIGFtbW91bnQgdGhhdCBnKysgdXNlcywgc28sIGlzIG5vdCB0aGF0IGJhZC4KCSAgICBJbiB0aGUgcHJvY2VzcywgSSBmb3VuZCBhIGNvdXBsZSBvZiBleHRyYSBEZWxldGVzLCB3aGljaAoJICAgIGluIHNvbWUgY2FzZXMgY291bGQgdHJpZ2dlciBzZWcuIGZhdWx0cyBhbmQvb3IKCSAgICBET0gvYXNzZXJ0cy4KCSAgICAKCSAgICBbcHl0aG9uXSBCZXR0ZXIgc3VwcG9ydCBmb3IgZGlyZWN0b3JzICsgZXhjZXB0aW9uLiBNb3JlCgkgICAgdmVyYm9zZSBlcnJvcnMgYW5kIGFkZGVkIGFuIHVuZXhwZWN0ZWQgZXhjZXB0aW9uIGhhbmRsZXIuCgoJICAgIFtweXRob25dIEZpeCBtZW1vcnkgbGVhayBmb3IgdGhlCgoJICAgIAkgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8aW50PiA+IAoKCSAgICBjYXNlLHJlcG9ydGVkIGJ5IEJvIFBlbmcuCgoJICAgIFtweXRob25dIEZpeCBTd2lnUHlPYmplY3QgY29tcGFyZSBwcm9ibGVtIHJlcG9ydGUgYnkKCSAgICBDYW1lcm9uIFBhdHJpY2suIAoKCSAgICBbcHl0aG9uXSBGaXggc2V2ZXJhbCB3YXJuaW5ncyBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUgCgkgICAgZm9yIGdudS1nY2MsIEludGVsIGFuZCBWQzcuMSAgY29tcGlsZXJzLgoKCjAyLzI1LzIwMDU6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFVwZGF0ZSBkb2N1bWVudGF0aW9uIHRvIHVzZSBDU1MgYW5kIDxkaXY+IGluc3RlYWQgb2YgPGJsb2NrcXVvdGU+CgkgICAgSSB1c2VkIGEgc2NyaXB0IHRvIGNvbnZlcnQgdGhlIGRvY3MsIGFuZCBpdCBzZXQgYWxsIHRoZSBib3ggY2xhc3NlcwoJICAgIHRvIGJlICJjb2RlIi4gIFRoZXJlIGFyZSBhY3R1YWxseSA0IGRpZmZlcmVudCBjbGFzc2VzLAoJICAgICJzaGVsbCIsICJjb2RlIiwgInRhcmdldGxhbmciLCBhbmQgImRpYWdyYW0iLiAgV2UgbmVlZCB0byBnbyB0aHJvdWdoCgkgICAgYW5kIGNvbnZlcnQgdGhlIGRpdnMgZGVwZW5kaW5nIG9uIHdoYXQgdGhleSBjb250YWluLgoKMDIvMjMvMjAwNTogbW1hdHVzCgoJICAgIFtQeXRob25dIEFkZGVkIG9wdGlvbiAtbm9ydHRpIHRvIGRpc2FibGUgdGhlIHVzZSBvZiBuYXRpdmUKCSAgICBDKysgUlRUSSB3aXRoIGRpcmVjdG9ycyAoZHluYW1pY19jYXN0PD4gaXMgbm90IHVzZWQpLgoKCSAgICBBZGQgbW9yZSBjb2RlIGZvciBkaXJlY3RvcnMgdG8gZGV0ZWN0IGFuZCByZXBvcnQgZXJyb3JzIGluCgkgICAgdGhlIHB5dGhvbiBzaWRlLgoKCSAgICBFeHRlbmQgdGhlIHVzZSBvZiBTV0lHSU5URVJOIHdoZW5ldmVyIGlzIHBvc3NpYmxlLgoKCSAgICBSZW1vdmUgdGVtcGxhdGUgd2FybmluZ3MgcmVwb3J0ZWQgYnkgVkM3LjEuCgoJICAgIFJlbW92ZSB3YXJuaW5ncyByZXBvcnRlZCBieSBnY2MvZysrLiBGaW5hbGx5IHlvdSBjYW4KCSAgICBjb21waWxlIHVzaW5nCgoJICAgICAgIGcrKyAtVyAtV2FsbCAtYyBteW1vZHVsZV93cmFwLmN4eAoKCSAgICBhbmQgbm8gc3B1cmlvdXMgZXJyb3JzIHdpbGwgYmUgZ2VuZXJhdGVkIGluIHRoZSB3cmFwcGVyCgkgICAgY29kZS4KCjAyLzIzLzIwMDU6IHd1enplYiAoSm9obiBMZW56KQoJICAgIEFkZGVkIC1leHRlcm5hbC1ydW50aW1lIGFyZ3VtZW50LiAgVGhpcyBhcmd1bWVudCBpcyB1c2VkIHRvIGR1bXAKCSAgICBvdXQgYWxsIHRoZSBjb2RlIG5lZWRlZCBmb3IgZXh0ZXJuYWwgYWNjZXNzIHRvIHRoZSBydW50aW1lIHN5c3RlbSwKCSAgICBhbmQgaXQgcmVwbGFjZXMgaW5jbHVkaW5nIHRoZSBmaWxlcyBkaXJlY3RseS4gIFRoaXMgY2hhbmdlIGFkZHMKCSAgICB0d28gbmV3IHZpcnR1YWwgZnVuY3Rpb25zIHRvIHRoZSBMYW5ndWFnZSBjbGFzcywgd2hpY2ggYXJlIHVzZWQKCSAgICB0byBmaW5kIHRoZSBsYW5ndWFnZSBzcGVjaWZpYyBydW50aW1lIGNvZGUuICBJIGFsc28gdXBkYXRlZAoJICAgIGFsbCBsYW5ndWFnZXMgdGhhdCB1c2UgdGhlIHJ1bnRpbWUgdG8gaW1wbGVtZW50IHRoZXNlIHR3byBmdW5jdGlvbnMuCgowMi8yMi8yMDA1OiBtbWF0dXMgCgkgICAgRml4ICV0ZW1wbGF0ZSArIHByaXZhdGUgZXJyb3IgU0YjMTA5OTk3Ni4KCjAyLzIxLzIwMDU6IG1tYXR1cyAKCgkgICAgRml4IHN3aWdydW4uc3dnIHdhcm5pbmdzIHJlcG9ydGVkIHdoZW4gdXNpbmcgImdjYyAtVyAtV2FsbCIKCSAgICAoc3RhdGljL2lubGluZSBub3QgdXNlZCBpbiBmcm9udCBvZiBhIGZ1bmN0aW9uCgkgICAgZGVjbGFyYXRpb24pLCBhbmQgYWRkIFNXSUdVTlVTRUQgYXR0cmlidXRlIHRvIGF2b2lkCgkgICAgdW51c2VkIHdhcm5pbmdzIGVsc2V3aGVyZS4KCgkgICAgRml4IHVudXNlZCB2YXJpYWJsZSB3YXJuaW5ncy4KCgkgICAgW1B5dGhvbl0gVXNlIG5ldyBTV0lHVU5VU0VEIGF0dHJpYnV0ZSB0byBhdm9pZCB3YXJuaW5ncyBpbgoJICAgIFNXSUdJTlRFUk4gbWV0aG9kcy4KCgkgICAgW1B5dGhvbl0gRml4IFB5T1Nfc25wcmludGYgZm9yIHB5dGhvbiB2ZXJzaW9ucyA8IDIuMiAoU0YgIzExMDQ5MTkpLgoKCSAgICBbUHl0aG9uXSBGaXggbWFwL211bHRpbWFwIHRvIGFsbG93IGVtcHR5IG1hcHMgKHJlcG9ydGVkIGJ5CiAgCSAgICBQaGlsaXBwZSBIZXRyb3kpLgoKCSAgICBbRG9jc10gQWRkIHNvbWUgZG9jdW1lbnRhdGlvbiB0byBQeXRob24uaHRtbCBhbmQKCSAgICBTV0lHUGx1cy5odG1sLCBpbmNsdWRpbmcgZm9yIGV4YW1wbGUgdGhlIGZhY3QgdGhhdAoJICAgICdmcmllbmRzJyBhcmUgbm93IHN1cHBvcnRlZC4KCjAyLzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQSFBdIFBhdGNoIGZyb20gT2xseSBCZXR0cywgc28gdGhhdCB3cmFwcGVycyBjb21waWxlIHdpdGggWmVuZCB0aHJlYWQgc2FmZXR5IGVuYWJsZWQuCgowMi8xNy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBNZW1vcnkgbGVhayBmaXggaW4gc29tZSBvZiB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlIG1vZHVsZXMgd2hlbiB1c2luZyBkZWZhdWx0CiAgICAgICAgICAgIGFyZ3VtZW50cyBpbiBjb25zdHJ1Y3RvcnMuIFRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2Ugd2FzIG5vdCB0YWtpbmcgb3duZXJzaGlwIG9mIHRoZQogICAgICAgICAgICBDKysgb2JqZWN0IG1lbW9yeSB3aGVuIGFueSBvZiB0aGUgY29uc3RydWN0b3JzIHRoYXQgdXNlIGRlZmF1bHQgYXJndW1lbnRzIHdhcyBjYWxsZWQuCgowMi8xNi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBTRiAjMTExNTA1NTogRmFpbGVkIG1ha2UgaW5zdGFsbC4gUGF0Y2ggZnJvbSBSb2IgU3RvbmUuCgowMi8xNi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gU0YgIzExMjM0MTYgZnJvbSBQYXVsIE1vb3JlLiBDb3JyZWN0IG1lbW9yeSBhbGxvY2F0aW9uIGZvciBTVFJJTkdBUlJBWQogICAgICAgICAgICB0eXBlbWFwcyBpbiB2YXJpb3VzLmkuCgowMi8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBEaXNhYmxlZCB0eXBlbWFwIHNlYXJjaCBjaGFuZ2VzIGZvciBub3cgKHNlZSBlbnRyeSAxOS8xMi8yMDA0KS4gSXQgYnJlYWtzCiAgICAgICAgICAgIG9sZCB0eXBlbWFwcywgbGVuZ3RoZW5zIHRoZSBleGVjdXRpb24gdGltZSBieSBhYm91dCAyNSUgYW5kIGludHJvZHVjZXMKICAgICAgICAgICAgaW5jb25zaXN0ZW5jaWVzLgoKMDIvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgc3dpZyAtaGVscCBmb2xsb3dzIG90aGVyIHNvZnR3YXJlIGJ5IHByaW50aW5nIHRvIHN0ZG91dCBpbnN0ZWFkIG9mIHN0ZGVyciBub3cuCiAgICAgICAgICAgIHN3aWcgLXZlcnNpb24gYWxzbyBkaXNwbGF5cyB0byBzdGRvdXQgaW5zdGVhZCBvZiBzdGRlcnIgbm93LgogICAgICAgICAgICBCZWhhdmlvdXIgcmVwb3J0ZWQgYnkgVG9yc3RlbiBMYW5kc2Nob2ZmLgoKMDIvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEZpeCBmb3IgdGhlIGxlc3MgY29tbW9ubHkgdXNlZCBvcmRlcmluZyBvZiAlaW5jbHVkZSBhbmQgI2luY2x1ZGUsIHNvCiAgICAgICAgICAgIHRoYXQgdGhlIGdlbmVyYXRlZCBjb2RlIGNvbXBpbGVzLiBCdWcgcmVwb3J0ZWQgYnkgcmVwb3J0ZWQgYnkgTWF4IEJvd3NoZXIuCiAgICAgICAgICAgICAgJWluY2x1ZGUgZm9vLmgKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgICNpbmNsdWRlIGZvby5oCiAgICAgICAgICAgICAgJX0gCgowMi8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIFNXSUdfZXhjZXB0aW9uIG1hY3JvIHdpbGwgbm93IHJldHVybiBmcm9tIHVubWFuYWdlZCBjb2RlIC8gbmF0aXZlIGNvZGUKICAgICAgICAgICAgYXMgc29vbiBhcyBpdCBpcyBjYWxsZWQuIEZpeGVzIHBvc3NpYmxlIEpWTSBjcmFzaGVzIGFuZCBvdGhlciBjb2RlIHVuZXhwZWN0ZWRseQogICAgICAgICAgICBiZWluZyBleGVjdXRlZC4gTm90ZSBTV0lHX2V4Y2VwdGlvbiBpcyBvbmx5IG9jY2FzaW9uYWxseSB1c2VkIGJ5IFNXSUcgbGlicmFyeQogICAgICAgICAgICB3cml0ZXJzLCBhbmQgaXMgYmVzdCBhdm9pZGVkIGJ5IFNXSUcgdXNlcnMuCgowMi8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIFR5cGVtYXBzIGNhbiBub3cgYmUgdGFyZ2V0ZWQgYXQgZ2xvYmFsIHZhcmlhYmxlIG5hbWVzCiAgICAgICAgICAgIGFuZCBzdGF0aWMgbWVtYmVyIHZhcmlhYmxlIG5hbWVzLiBQcmV2aW91c2x5IHRoZSB0eXBlbWFwcyBmb3IgCiAgICAgICAgICAgIHRoZSBzZXR0ZXJzIHdlcmUgaWdub3JlZCwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBpbnQgZ2xvYmFsaW50ICIuLi4iCiAgICAgICAgICAgICAgaW50IGdsb2JhbGludDsKCjAyLzEzLzIwMDU6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEFkZCAldHlwZWNoZWNrIGZvciBTV0lHVFlQRSwgYWRkICV0eXBlY2hlY2sgZm9yIHB0cmRpZmZfdCwgZml4CgkgICAgdHlwZW1hcHMgZm9yIHNpemVfdC4KCgkgICAgW1Bpa2VdIE1lcmdlIHBhdGNoIGZyb20gVG9yc3RlbiBMYW5kc2Nob2ZmIGZvciBpbXByb3ZlZCBQaWtlIGNvbmZpZ3VyYXRpb24uCgowMi8xMi8yMDA1OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgTmV3IGNvbmZpZ3VyZSBzd2l0Y2hlcyAtLXdpdGhvdXQtdGNsLCAtLXdpdGhvdXQtcHl0aG9uIGV0Yy4gYWxsb3cgdG8KICAgICAgICAgICAgZGlzYWJsZSB0aGUgc2VhcmNoIGZvciBpbnN0YWxsZWQgbGFuZ3VhZ2VzLgoKMDEvMzEvMjAwNTogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIC0gQWRkIERvaFNvcnRMaXN0IHRvIERPSAoJICAgIAoJICAgIC0gSW1wcm92ZSB0aGUgcnVudGltZSB0eXBlIHN5c3RlbToKICAgICAgICAgICAgICAgKyBTcGVlZC4gVHlwZSBsb2FkaW5nIGlzIG5vdyBPKG4gbG9nIG4pIGluc3RlYWQgb2YgTyhOXjIpLCB3aGljaAoJICAgICAgICAgZm9yIGxhcmdlIG1vZHVsZXMgaXMgYSBodWdlIGltcHJvdmVtZW50LgogICAgICAgICAgICAgICArIEEgd2hvbGUgYnVuY2ggb2YgZnVuY3Rpb25zIGluIHN3aWdydW4uc3dnIG5vIGxvbmdlciBuZWVkIHRoZSAKICAgICAgICAgICAgICAgICBzd2lnX3R5cGVfbGlzdF9oYW5kbGUgcGFzc2VkIHRvIHRoZW0uICBUaGUgb25seSBvbmUgbGVmdCBpcyAKCQkgVHlwZVF1ZXJ5LiAgVGhpcyBhbHNvIG1ha2VzIHJ1bnRpbWUuc3dnIGEgbG90IHNtYWxsZXIuCgkgICAgICAgKyBTcGxpdCB1cCBzd2lnX3R5cGVfaW5mbyBzdHJ1Y3R1cmUgaW50byB0d28gc3RydWN0dXJlcwoJICAgICAgICAgKHN3aWdfdHlwZV9pbmZvIGFuZCBzd2lnX2Nhc3RfaW5mbykKCSAgICAgICArIFN0b3JlIGEgcG9pbnRlciB0byBhIHN3aWdfdHlwZV9pbmZvIHJhdGhlciB0aGFuIGp1c3QgdGhlIHR5cGUKCSAgICAgICAgIG5hbWUgc3RyaW5nIGluIHRoZSBsaW5rZWQgbGlzdCBvZiBjYXN0cy4gRmlyc3Qgb2ZmLCB0aGlzIG1ha2VzCgkgICAgICAgICB0aGUgZ3VpbGUgbW9kdWxlIGEgbGl0dGxlIGZhc3RlciwgYW5kIHNlY29uZCwgdGhlCgkgICAgICAgICBTV0lHX1R5cGVDbGllbnREYXRhKCkgZnVuY3Rpb24gaXMgZmFzdGVyIHRvby4gCgkgICAgICAgKyBBZGQgdGhlIGlkZWEgb2YgYSBtb2R1bGUgaW50byB0aGUgdHlwZSBzeXN0ZW0uICBCZWZvcmUsIGFsbCB0aGUKCSAgICAgICAgIHR5cGVzIHdlcmUgc3RvcmVkIGluIG9uZSBodWdlIGxpbmtlZCBsaXN0LiBOb3csIGFub3RoZXIgbGV2ZWwgaXMKCSAgICAgICAgIGFkZGVkLCBhbmQgdGhlIHR5cGUgc3lzdGVtIHN0b3JlcyBhIGxpbmtlZCBsaXN0IG9mIG1vZHVsZXMsIGVhY2gKCSAgICAgICAgIG9mIHdoaWNoIHN0b3JlcyBhbiBhcnJheSBvZiB0eXBlcyBhc3NvY2lhdGVkIHdpdGggaXQuCgkgICAgICAgKyBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvZiBob3cgdGhlIHJ1bnRpbWUgdHlwZSBzeXN0ZW0gbm93IHdvcmtzLAoJICAgICAgICAgcGxlYXNlIHNlZSBEb2MvTWFudWFsL3R5cGVtYXBzLmh0bWwgYW5kIERvYy9EZXZlbC9ydW50aW1lLnR4dAoJCSAKCSAgICAtIFVwZGF0ZSBhbGwgbGFuZ3VhZ2UgbW9kdWxlcyB0byB1c2UgdGhlIG5ldyB0eXBlIHN5c3RlbS4gIFRoZSBjaGFuZ2VzCgkgICAgICB0byBlYWNoIGxhbmd1YWdlIG1vZHVsZSBhcmUgbWlub3IuICBBbGwgbGFuZ3VhZ2VzIGFyZSBub3cgYWJsZSB0bwoJICAgICAgdXNlIHJ1bnRpbWUuc3dnIGZvciBleHRlcm5hbCBhY2Nlc3MgdG8gdGhlIHR5cGUgc3lzdGVtLiAgQmVmb3JlCgkgICAgICBvbmx5IHB5dGhvbiBhbmQgcGVybCBkaWQuCgoJICAgIC0gW2d1aWxlLCBtenNjaGVtZSwgb2NhbWwsIGFuZCBwaHA0XSAgVGhlc2UgbGFuZ3VhZ2VzIG9wZW5lZCB1cCB0aGUKCSAgICAgIGluaXQgZnVuY3Rpb24gaW5zaWRlIHRoZSAuY3h4IGNvZGUsIGFuZCBhbnkgY29kZSBpbiB0aGUgLnN3ZyBmaWxlcwoJICAgICAgaW4gdGhlIGluaXQgc2VjdGlvbiB3YXMgaW5zaWRlIHRoaXMgZnVuY3Rpb24uICBUaGlzIHdhcyBhIHByb2JsZW0KCSAgICAgIGZvciBzd2lnaW5pdC5zd2csIHdoaWNoIG5lZWRzIHRvIGJlIGluc2VydGVkIGJlZm9yZSB0aGUgU1dJR19pbml0CgkgICAgICBmdW5jdGlvbiBpcyBvcGVuZWQuICBUaHVzIEkgY2hhbmdlZCB0aGVzZSBsYW5ndWFnZXMgdG8gYmUgbGlrZQoJICAgICAgcHl0aG9uIG9yIHBlcmwsIHdoZXJlIHRoZSBpbml0IGZ1bmN0aW9uIGlzIGRlY2xhcmVkIGluIHRoZSAuc3dnCgkgICAgICBmaWxlLgoJICAgICAgCgkgICAgLSBbUnVieV0gSW5zdGVhZCBvZiBtb3ZpbmcgdGhlIGluaXQgZnVuY3Rpb24gdG8gdGhlIC5zd2cgZmlsZSwgSQoJICAgICAgYWRkZWQgYSBuZXcgc2VjdGlvbiBpbml0YmVmb3JlZnVuYywgYW5kIHRoZW4gYWRkZWQKCSAgICAgICVpbnNlcnQoaW5pdGJlZm9yZWZ1bmMpICJzd2lnaW5pdC5zd2ciCgoJICAgIC0gW016U2NoZW1lXSBGaXggZW51bXMgYW5kIGZpeCBFeGFtcGxlcy9NYWtlZmlsZS5pbiBzbyB0aGF0IGlmCgkgICAgICBtdWx0aXBsZSAtSSBhcmd1bWVudHMgYXJlIHNwZWNpZmllZCBpbiB0aGUgSU5DTFVERVMgdmFyaWFibGUsIGVhY2gKCSAgICAgIGdldHMgYSArK2NjZi4KCgkgICAgLSBbR3VpbGUgR0hdIFVwZGF0ZSBHdWlsZSBHSCB0byB1c2UgdGhlIG5ldyB0eXBlIHN5c3RlbS4gIFNlZQoJICAgICAgRG9jL01hbnVhbC9HdWlsZS5odG1sIGZvciBob3cgc21vYnMgYXJlIG5vdyB1c2VkLgoKMDEvMTEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBOZXcgdHlwZW1hcCBjYWxsZWQgJ2NzY29uc3RydWN0Jy4gVGhlIGNvZGUgaW4gdGhpcyB0eXBlbWFwcyB3YXMgcHJldmlvdXNseSBoYXJkCiAgICAgICAgICAgIGNvZGVkIGFuZCBjb3VsZCBub3QgYmUgY3VzdG9taXNlZCBieSBhIHVzZXIuIFRoaXMgdHlwZW1hcCBjb250YWlucyB0aGUgY29kZSB0aGF0IGlzCiAgICAgICAgICAgIGdlbmVyYXRlZCBpbnRvIGEgcHJveHkgY2xhc3MncyBjb25zdHJ1Y3Rvci4KCiAgICAgICAgICAgIFtKYXZhXSBOZXcgdHlwZW1hcCBjYWxsZWQgJ2phdmFjb25zdHJ1Y3QnLiBUaGUgY29kZSBpbiB0aGlzIHR5cGVtYXBzIHdhcyBwcmV2aW91c2x5IGhhcmQKICAgICAgICAgICAgY29kZWQgYW5kIGNvdWxkIG5vdCBiZSBjdXN0b21pc2VkIGJ5IGEgdXNlci4gVGhpcyB0eXBlbWFwIGNvbnRhaW5zIHRoZSBjb2RlIHRoYXQgaXMKICAgICAgICAgICAgZ2VuZXJhdGVkIGludG8gYSBwcm94eSBjbGFzcydzIGNvbnN0cnVjdG9yLiBBbm90aGVyIHR5cGVtYXAgbmFtZWQgJ2phdmFjb25zdHJ1Y3RfZGlyZWN0b3InCiAgICAgICAgICAgIGlzIHVzZWQgaW5zdGVhZCB3aGVuIHRoZSBwcm94eSBjbGFzcyBpcyBhIGRpcmVjdG9yIGNsYXNzLgoKICAgICAgICAgICAgW0MjLCBKYXZhXSBJZiBhIEMrKyBjbGFzcyBkaWQgbm90IGhhdmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLCBhIHByb3RlY3RlZCBkZWZhdWx0IGNvbnN0cnVjdG9yCiAgICAgICAgICAgIHdhcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBTV0lHLiBUaGlzIHNlZW1zIGlzIHVubmVjZXNzYXJ5IGFuZCBoYXMgYmVlbiByZW1vdmVkCiAgICAgICAgICAgIGFuZCB0aGVyZWJ5IGdpdmluZyB0aGUgdXNlciBhbG1vc3QgY29tcGxldGUgY29udHJvbCBvdmVyIHRoZSBnZW5lcmF0ZWQgY29kZSBhbG9uZyB3aXRoIHRoZQogICAgICAgICAgICBuZXcgdHlwZW1hcHMgYWJvdmUuCgoxOS8xMi8yMDA0OiBtbWF0dXMKICAgICAgICAgICAgW0Rpc2FibGVkLCBzZWUgZW50cnkgMDIvMTUvMjAwNF0KICAgICAgICAgICAgLSBGaXggdHlwZW1hcCBzZWFyY2gsIG5vdyB0aGUgIm91dCIgdHlwZW1hcCBzZWFyY2ggaXMgZG9uZSBhcyBmb2xsb3dzCgogICAgICAgICAgICAgICAgIGludCAqRm9vOjpmb28oaW50IGJhcikgICAtPiAgaW50ICpGb286OmZvbyhpbnQgYmFyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgaW50ICpGb286OmZvbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgaW50ICpmb28oaW50IGJhcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIGludCAqZm9vCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICBpbnQgKgoKICAgICAgICAgICAgICAgdGhlbiwgbm93IHlvdSBjYW4gYmUgbW9yZSBzcGVjaWZpYywgYW5kIGRlZmluZQoKICAgICAgICAgICAgICAvKiBhcHBseSBvbmx5IGZvciAgJ0Zvbzo6Zm9vJyBtZXRob2QgKi8KICAgICAgICAgICAgICAldHlwZW1hcChvdXQpIGludCAqIEZvbzo6Zm9vKGludCAqYmFyKSAuLi47IAoKICAgICAgICAgICAgICAvKiBhcHBseSBmb3IgYWxsICdmb28nIGZ1bmN0aW9ucy9tZXRob2RzICovCiAgICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBpbnQgKiBmb28oaW50ICpiYXIpIC4uLjsgCgogICAgICAgICAgICAgICVpbmxpbmUgewogICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgICBpbnQgKmZvbyhpbnQgKmJhcik7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIH0KCSAgCgoxNS8xMi8yMDA0OiBtbWF0dXMKICAgICAgICAgICAgLSBNb3JlIGZpeGVzIGZvciB0ZW1wbGF0ZXMgYW5kIHRlbXBsYXRlIGRlZmF1bHQgYXJncy4KICAgICAgICAgICAgICBTZWUgdGVtcGxhdGVfZGVmYXVsdC5pIGZvciBzY2FyeSBjYXNlcyB0aGF0IG5vdyBhcmUgCiAgICAgICAgICAgICAgc3VwcG9ydGVkLCBiZXNpZGVzIHRoZSBhbHJlYWR5IHVnbHkgU1RML3N0ZCBjYXNlcy4KICAgICAgICAgICAgICAKICAgICAgICAgICAgLSBDb3NtZXRpY3MgYW5kIG1vcmUgdXNlIG9mICdjb25zdCcgd2hlcmUgaXQgd2FzIGltcGxpY2l0LgogICAgICAgICAgICAtIE90aGVyIGZpeGVzIGZvciBPU1MsIHdoaWNoIGlzIG5vdyB3b3JraW5nIGFnYWluIHdpdGggMS4zLjI1LgoJClZlcnNpb24gMS4zLjI0IChEZWNlbWJlciAxNCwgMjAwNCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTIvMTIvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtDaGlja2VuXSBGaXggYSBidW5jaCBvZiBidWdzIHJlbGF0aW5nIHRvIC1wcm94eSBzdXBwb3J0CgkgICAgICArIG5vbi1jbGFzcyB2YXJpYWJsZXMgbm93IGV4cG9ydCBwcm9wZXJseSB1c2luZyAtcHJveHkKCSAgICAgICsgc3RhdGljIG1lbWJlciBmdW5jdGlvbnMgbm93IGV4cG9ydCBwcm9wZXJseSB1c2luZyAtcHJveHkKCSAgICAgICsgbWVtYmVyIGNsYXNzIHZhcmlhYmxlcyBub3cgZXhwb3J0IHByb3Blcmx5IHVzaW5nIC1wcm94eQoJICAgICAgKyBhZGRlZCBhIC1ub3VuaXQgYXJndW1lbnQsIHdoaWNoIGRvZXMgbm90IGV4cG9ydCB0aGUgKGRlY2xhcmUgKHVuaXQgLi4uKSkKCSAgICAgICsgY29ycmVjdGx5IGluc3RhbGwgc3dpZ2Nsb3NwcmVmaXguc2NtCgkgICAgICArIGNvbnN0YW50cyAoZW51bXMsIGRlZmluZXMpIG5vdyBjb3JyZWNseSBleHBvcnQgd2hlbiB1c2luZyAtcHJveHkKCjEyLzExLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIGNvbmZpZ3VyZSBmaXggZm9yIHdoZW4gbW9yZSB0aGFuIG9uZSB2ZXJzaW9uIG9mIGpuaV9tZC5oIGlzIGZvdW5kCiAgICAgICAgICAgIGluIHRoZSBKYXZhIGluY2x1ZGUgZGlyZWN0b3J5ICh3YXMgZ2VuZXJhdGluZyBsb3RzIG9mIHNlZCBlcnJvcgogICAgICAgICAgICBtZXNzYWdlcykuCgoxMi8wOC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4ZXMgdG8gYXJyYXlzX2phdmEuaSBzbyB0aGF0IG9uZSBjYW4gYXBwbHkgdGhlIGFycmF5CiAgICAgICAgICAgIHR5cGVtYXBzIHRvIGZ1bmN0aW9ucyB0YWtpbmcgcG9pbnRlcnMgYXMgaW5wdXQsIGVnCgogICAgICAgICAgICAgICAgJWluY2x1ZGUgImFycmF5c19qYXZhLmkiCiAgICAgICAgICAgICAgICAlYXBwbHkgaW50W10ge2ludCp9OwogICAgICAgICAgICAgICAgdm9pZCBmb28oaW50ICphKTsKCjEyLzA1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBEaXJlY3RvciBtb2RzIGNvbnRyaWJ1dGVkIGJ5IFNjb3R0IE1pY2hlbC4gTmV3IHR5cGVtYXBzCiAgICAgICAgICAgIGRpcmVjdG9yZGlzY29ubmVjdCBhbmQgZGlyZWN0b3JkaXNjb25uZWN0X2Rlcml2ZWQgZm9yIHRoZSAKICAgICAgICAgICAgc3dpZ0RpcmVjdG9yRGlzY29ubmVjdCgpIG1ldGhvZC4gQWxzbyBmaXggdG8gZ2V0IHRoZSBqYXZhcGFja2FnZQogICAgICAgICAgICB0eXBlbWFwIHdvcmtpbmcgYWdhaW4uCgoxMi8wNS8yMDA0OiBtbWF0dXMKCSAgICAtIEZpbmlzaGluZyB0aGUgZml4ZXMgZm9yIHRlbXBsYXRlcyArIGRlZmF1bHQgdGVtcGxhdGUKCSAgICAgIGFyZ3MgKyBzcGVjaWFsaXphdGlvbnMuCgogICAgICAgICAgICAtIFtQeXRob25dIE5vdyB3ZSB1c2UgdGhlIG5ldyB0ZW1wbGF0ZXMgKyBkZWZhdWx0IHRlbXBsYXRlCgkgICAgICBhcmdzIGluIHRoZSBzdGQvU1RMIGxpYnJhcnkuIFRoYXQgbWVhbnMgdGhlIGludGVybmFsCgkgICAgICBzd2lnIGZpbGVzIGFyZSBnZXR0aW5nIHVnbGllciBzaW5jZSB3ZSBub3cgc3VwcG9ydCB0aGUKCSAgICAgIG9yaWdpbmFsIGRlY2xhcmF0aW9uczoKCgkgICAgICAgIHRlbXBsYXRlPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jID0gc3RkOjphbGxvY2F0b3I8IF9UcCA+ID4KCQljbGFzcyB2ZWN0b3IgewoJCS4uLi4KCQl9OwoJICAgICAgCSAgICAgCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlID0gc3RkOjpsZXNzPF9LZXkgPiwKCSAgICAgICAgY2xhc3MgX0FsbG9jID0gc3RkOjphbGxvY2F0b3I8c3RkOjpwYWlyPGNvbnN0IF9LZXksIF9UcCA+ID4gPgogICAgICAgICAgICAgICAgY2xhc3MgbWFwIHsKCQkuLi4uCgkJfTsKIAogICAgICAgICAgICAgIGFuZCB0aGUgdXNlciBjYW4gdXNlIHRoZSAldGVtcGxhdGUgZGlyZWN0aXZlIGFzCgoJICAgICAgICAldGVtcGxhdGUoKSBzdGQ6OnZlY3RvcjxpbnQ+OwoJICAgICAgICAldGVtcGxhdGUoKSBzdGQ6OnZlY3RvcjxpbnQsIHN0ZDo6YWxsb2NhdG9yPGludD4gPjsKCSAgICAgICAgJXRlbXBsYXRlKCkgc3RkOjp2ZWN0b3I8aW50LCBNeUFsbG9jYXRvcjxpbnQ+ID47CgogICAgICAgICAgICAgIE5vdyB3ZSBhcmUgY2xvc2VyIHRvIHRoZSBjbGVhbmluZy9yZXdyaXRpbmcgb2YgdGhlCgkgICAgICBweXRob24gc3RkL1NUTCBzdXBwb3J0LCBzdWNoIHRoYXQgd2UgcmVjb3ZlciBzdXBwb3J0IGZvcgoJICAgICAgTVNWQysrIDYuMCwgYW5kIHdlIGNhbiBhZGQgc3VwcG9ydCBmb3Igb3RoZXIgbGFuZ3VhZ2VzCgkgICAgICB0b28uCgoKMTIvMDIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgZGlyZWN0b3JzIHdoZW4gd3JhcHBpbmcgbWV0aG9kcyB1c2luZyBhIG1lbWJlciBlbnVtCiAgICAgICAgICAgIGFuZCB0eXBlc2FmZS9wcm9wZXIgZW51bXMgZW5hYmxlZC4KCjEyLzAxLzIwMDQ6IG1tYXR1cwoJICAgIC0gRml4IHR5cGVtYXBzIHRvIHdvcmsgd2l0aCB0ZW1wbGF0ZXMgYW5kIGRlZmF1bHQgdGVtcGxhdGUKCSAgICAgIGFyZ3MsIGllCgoJICAgICAgIHRlbXBsYXRlIDxjbGFzcyBBLCBjbGFzcyBCID0gaW50PgogICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKCSAgICAgICB9OwoKCSAgICAgICAldHlwZW1hcChpbikgRm9vPGludD4gKnsuLi59CgkgICAgICAgJXR5cGVtYXAob3V0KSBGb288aW50LGludD4gKnsuLi59CgoJICAgICAgIEZvbzxpbnQ+ICogZm9vKCBGb288aW50PiAqZjEsIEZvbzxpbnQsaW50PiAqZjIpOwoKCSAgICAgIG5vdyAnZjEnLCAnZjInIGFuZCB0aGUgcmV0dXJuIHZhbHVlIHJlc29sdmUgdGhlIHByb3ZpZGVkCgkgICAgICB0eXBlbWFwcyBwcm9wZXJseS4KCgkgICAgICBUaGlzIGlzIGhpZ2hseSBuZWVkZWQgZm9yIHByb3BlciBTVEwgc3VwcG9ydCwgc2VlIG5ldyAKCSAgICAgIHN0ZF9iYXNpY19zdHJpbmcuaSwgc3RkX3NzdHJlYW0uaSwgZXRjLgoKCSAgICAtIEFkZGVkIHN0ZF9zc3RyZWFtLmksIGFuZCBmaXggc3RkX2Jhc2ljX3N0cmluZy5pIHRvIHVzZQoJICAgICAgdGhlIG5ldyB0eXBlbWFwcyArIHRlbXBsYXRlIGRlZi4gYXJnIG1lY2hhbmlzbS4gQWxzbywKCSAgICAgIGFkZGVkIHRoZSBuZWVkZWQgc3RkX2FsbG9jLmkuIE5vdywgYWxsIHRoZSBjb250YWluZXJzCgkgICAgICBjYW4gYmUgbW9kaWZpZWQgdG8gc3VwcG9ydCBzdGQ6OmFsbG9jYXRvciwgbGlrZSBpbjoKCSAgICAgIAoJICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBBID0gc3RkOjphbGxvY2F0b3I8VCA+ID4KCQljbGFzcyB2ZWN0b3IgewoJCXB1YmxpYzoKCQkuLi4uCgkJfTsKCSAgICAgIAoJICAgICAgVGhpcyBjaGFuZ2UgaXMgb25seSBjb21wbGV0ZWQgYnkgbm93IGZvciBiYXNpY19zdHJpbmcuCgoJICAgIC0gRml4IGZvciBzbWFydCBwb2ludGVycyArIG1lbWJlcnMgKyBleHRlbnNpb25zOgoKCSAgICAgICVleHRlbmQgRm9vIHsKCSAgICAgICAgaW50IGV4dGVuc2lvbihpbnQgaSwgaW50IGopIHsgcmV0dXJuIGk7IH0KCQlpbnQgZXh0ZW5zaW9uKCkgeyByZXR1cm4gMTsgfQoJICAgICAgfQoKCSAgICAgICVpbmxpbmUgJXsKCgkgICAgICBjbGFzcyBGb28gewoJICAgICAgcHVibGljOgoJCWludCB5OwoJCXN0YXRpYyBjb25zdCBpbnQgejsKCSAgICAgIH07CiAgCgkgICAgICBjbGFzcyBCYXIgewoJICAgICAgICBGb28gKmY7CgkgICAgICBwdWJsaWM6CgkgICAgICAgIEJhcihGb28gKmYpIDogZihmKSB7IH0KCQlGb28gKm9wZXJhdG9yLT4oKSB7CgkJICByZXR1cm4gZjsKCQl9CgkgICAgICB9OwoKCSAgICAgIG5vdyB5b3UgY2FuIAoJICAgICAKCSAgICAgIGYgPSBGb28oKQoJICAgICAgZi55ID0gMwoJICAgICAgYSA9IGYuegoJICAgICAgZi0+ZXh0ZW5zaW9uKCkKIAoJICAgICAgYiA9IEJhcihmKQoJICAgICAgYi55ID0gMwoJICAgICAgYSA9IGIuegoJICAgICAgYi0+ZXh0ZW5zaW9uKCkKCgkgICAgLSBPdGhlciBzbWFsbCBlcnJvcnMgZml4ZXMsIG1vc3RseSBweXRob24uCgoxMS8yNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gTnVtZXJvdXMgZGlyZWN0b3IgYnVnIGZpeGVzIHNvIHRoYXQgdGhlIGNvcnJlY3QgamF2YSB0eXBlcwogICAgICAgICAgICBhbmQgY2Fub25pY2FsaXplZCB0eXBlcyBpbiB0aGUgSk5JIGNvZGUgYXJlIGVtaXR0ZWQuIFVzZSBvZiB0aGUKICAgICAgICAgICAgJGphdmFjbGFzc25hbWUgc3BlY2lhbCB2YXJpYWJsZXMgaW4gdGhlIGRpcmVjdG9yIHR5cGVtYXBzIG5vdwogICAgICAgICAgICBjb25zaXN0ZW50IHdpdGggdGhlIG5vbi1kaXJlY3RvciB0eXBlbWFwcy4gVGhlIHR5cGVzIHVzZWQgZm9yIAogICAgICAgICAgICB0eXBlbWFwIGxvb2t1cHMgYXJlIGFsc28gY29ycmVjdGVkIGluIGEgZmV3IHBsYWNlcy4gSWYgeW91IAogICAgICAgICAgICBwcmV2aW91c2x5IGhhZCB5b3VyIG93biBkaXJlY3RvciB0eXBlbWFwcywgZW5zdXJlIHRoZXkgYXJlIHVzaW5nIHRoZQogICAgICAgICAgICBjb3JyZWN0IEMrKyB0eXBlLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgRElSRUNUT1JTICoqKgoKMTEvMjUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgY29uc3QgZW51bSBTV0lHVFlQRSAmIHR5cGVtYXBzIGFkZGVkLiBUaGVzZSB3cmFwIGNvbnN0IGVudW0gcmVmZXJlbmNlcwogICAgICAgICAgICBhcyBpZiB0aGV5IHdlcmUgcGFzc2VkIGJ5IHZhbHVlLiBDb25zdCBlbnVtIHJlZmVyZW5jZXMgdGh1cyB3b3JrIHRoZQogICAgICAgICAgICBzYW1lIGFzIGNvbnN0IHJlZmVyZW5jZSBwcmltaXRpdmUgdHlwZXMgc3VjaCBhcyBjb25zdCBkb3VibGUgJiwgCiAgICAgICAgICAgIGNvbnN0IGludCAmIGV0Yy4gVHlwZW1hcHMgYWRkZWQgZm9yIEphdmEsIEMjLCBSdWJ5LCBUY2wsIFBlcmwgYW5kIFBpa2UuCgoxMS8yNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIE5ldyBzcGVjaWFsIHZhcmlhYmxlOiAkKmphdmFjbGFzc25hbWUsIHNpbWlsYXIgdG8gJGphdmFjbGFzc25hbWUKICAgICAgICAgICAgYW5kICQmamF2YWNsYXNzbmFtZS4gVGhlIG5ldyBvbmUgcmVtb3ZlcyBhIHBvaW50ZXIgZnJvbSB0aGUgQyB0eXBlIGJlZm9yZQogICAgICAgICAgICBvYnRhaW5pbmcgdGhlIEphdmEgY2xhc3MgbmFtZS4gT25lIG9yIG1vcmUgb2YgJGphdmFjbGFzc25hbWUsCiAgICAgICAgICAgICQmamF2YWNsYXNzbmFtZSBvciAkKmphdmFjbGFzc25hbWUgbWF5IG5vdyBhcHBlYXIgaW4gYSB0eXBlbWFwLiBMaWtld2lzZSBmb3IKICAgICAgICAgICAgQyMgdXNpbmcgY3NjbGFzc25hbWUgaW5zdGVhZCBvZiBqYXZhY2xhc3NuYW1lLgoKMTEvMjUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgVGhlIGxhc3QgdmVzdGlnZXMgb2YgZW51bXMgYmVpbmcgaGFuZGxlZCBhcyBpbnRlZ2VycyByZW1vdmVkIGZyb20gdGhlCiAgICAgICAgICAgIGludGVybmFscy4gVGhlIHdyYXBwZXIgbWV0aG9kcyB1c2UgdGhlIGVudW0gdHlwZSByYXRoZXIgdGhhbiBhbiBpbnQKICAgICAgICAgICAgbm93LiBUaGUgbmV0IHJlc3VsdCBpcyBhZGRlZCB0eXBlIHNhZmV0eSBmb3IgZW51bXMgd2hlbiBoYW5kbGVkIGFzCiAgICAgICAgICAgIHBvaW50ZXJzLCByZWZlcmVuY2VzIGV0Yy4gUHJldmlvdXNseSBpbiBzaXR1YXRpb25zIHN1Y2ggYXMgYSBtZXRob2QKICAgICAgICAgICAgdGFraW5nIGEgcG9pbnRlciB0byBhbiBlbnVtLCBhIHBvaW50ZXIgdG8gYW4gaW50IG9yIGEgcG9pbnRlciB0byBhbgogICAgICAgICAgICBlbnVtIG9mIHNvbWUgb3RoZXIgdHlwZSBjb3VsZCBpbmFkdmVydGFudGx5IGJlIHBhc3NlZCB0byB0aGUgbWV0aG9kLgogICAgICAgICAgICBUaGlzIGlzIG5vdyBmaXhlZCBhcyB0aGUgZGVzY3JpcHRvciBmb3IgYW4gZW51bSBpcyBubyBsb25nZXIgYmFzZWQgb24KICAgICAgICAgICAgYW4gaW50LCBidXQgdGhlIGVudW0gdHlwZSBpbnN0ZWFkLiBBbm9ueW1vdXMgZW51bXMgYXJlIHN0aWxsIGhhbmRsZWQKICAgICAgICAgICAgYXMgaW50ZWdlcnMuCgogICAgICAgICAgICBUaGUgY29uc2VxdWVuY2UgZm9yIHNjcmlwdGluZyBsYW5ndWFnZSB1c2VycyBpbiBjb3JyZWN0IHVzYWdlIG9mIGVudW1zCiAgICAgICAgICAgIHNob3VsZCBub3QgYmUgbm90aWNlYWJsZS4gVGhlcmUgaXMgbm8gY2hhbmdlIGZvciBhbnkgb2YgdGhlIGxhbmd1YWdlcwogICAgICAgICAgICB3aGVyZSBlbnVtcyBhcmUgcGFzc2VkIGJ5IHZhbHVlIC0gbW9zdCBvZiB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlcyB3aWxsCiAgICAgICAgICAgIHN0aWxsIGFjY2VwdCBhbiBpbnRlZ2VyIGZvciBhbiBlbnVtIHZhbHVlIGFuZCB0aGUgc3Ryb25nbHkgdHlwZWQKICAgICAgICAgICAgbGFuZ3VhZ2VzIHN0aWxsIHVzZSBlaXRoZXIgdHlwZXNhZmUgZW51bXMsIGludGVnZXJzIG9yIHByb3BlciBlbnVtcwogICAgICAgICAgICBkZXBlbmRpbmcgb24gd2hhdCB0aGUgdXNlciBjb25maWd1cmVzLiBGb3IgSmF2YSBhbmQgQyMgdXNlcnMgYSBjaGFuZ2UKICAgICAgICAgICAgaW4gdGhlIHR5cGV3cmFwcGVyIGNsYXNzIG5hbWUgaGFzIG9jY3VycmVkIChmb3IgZW51bSBwb2ludGVycywKICAgICAgICAgICAgcmVmZXJlbmNlcyBldGMpLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgZW51bSBOdW1iZXJzIHsgb25lPTEsIHR3byB9OwogICAgICAgICAgICAgIGVudW0gTnVtYmVycyogbnVtYmVyKCk7CgogICAgICAgICAgICBJbiBKYXZhIGFuZCBDIyB0aGlzIG11c3Qgbm93IGJlIGNvZGVkIGFzCgogICAgICAgICAgICAgIFNXSUdUWVBFX3BfTnVtYmVycyBuID0gbW9kdWxlbmFtZS5udW1iZXIoKTsKCiAgICAgICAgICAgIHJhdGhlciB0aGFuCgogICAgICAgICAgICAgIFNXSUdUWVBFX3BfaW50IG4gPSBtb2R1bGVuYW1lLm51bWJlcigpOwoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8yMS8yMDA0OiB3c2Z1bHRvbi9tbWF0dXMKICAgICAgICAgICAgQWRkZWQgbWlzc2luZyBkZXByZWNhdGVkIHdhcm5pbmcgZm9yICVuYW1lIGFuZCByZW1vdmUgcmVtYWluaW5nICVuYW1lCiAgICAgICAgICAgIHVzYWdlIGluIHRoZSBTV0lHIGxpYnJhcmllcy4KCjExLzIxLzA0OiBtbWF0dXMKCSAgICAtIFtQeXRob25dIEFkZGluZyB0aGUgUHlTd2lnT2JqZWN0IHRvIGJlIHVzZWQgZm9yIGNhcnJ5aW5nCgkgICAgICB0aGUgaW5zdGFuY2UgQy9DKysgcG9pbnRlcnMuIFRoaXMgaXMgdXNlZCBpbnN0ZWFkIG9mCgkgICAgICBzdHJpbmcgYW5kIFB5Q09iamVjdHMuCgoJICAgICAgVGhlIG5ldyBQeVN3aWdPYmplY3QgaXMgZXZlbiBzYWZlciB0aGFuIFB5Q09iamVjdCwgYW5kCgkgICAgICBtb3JlIGZyaWVuZGx5IHRoYW4gcGxhaW4gc3RyaW5nczoKCgkgICAgICBub3cgeW91IGNhbiBkbwoKCSAgICAgICAgcHJpbnQgYS50aGlzCgkJPFN3aWcgT2JqZWN0IGF0IF8wMDY5MTYwOF9wX0E+CgoJCXByaW50IHN0cihhLnRoaXMpCgkJXzAwNjkxNjA4X3BfQQoKCQlwcmludCBsb25nKGEudGhpcykKCQkxMzU2ODY0MDAKCgkJcHJpbnQgIiVzIDB4JXgiICUgKGEudGhpcywgYS50aGlzKQoJCV8wMDY5MTYwOF9wX0EgMHg4MTY2OTAwCgoJICAgICAgdGhlIGxhc3Qgb25lIGlzIHZlcnkgdXNlZnVsIHdoZW4gZGVidWdnaW5nIHRoZSBDL0MrKwoJICAgICAgc2lkZSwgc2luY2UgaXMgdGhlIHBvaW50ZXIgdmFsdWUgeW91IHdpbGwgdXN1YWxseSBnZXQKCSAgICAgIGZyb20gdGhlIGRlYnVnZ2VyLgoKCSAgICAgIEFsc28sIGlmIHlvdSBoYXZlIHNvbWUgb2xkIGNvZGUgdGhhdCB1c2VzIHRoZSBzdHJpbmcKCSAgICAgIHJlcHJlc2VudGF0aW9uICJfMDA2OTE2MDhfcF9BIiwgeW91IGNhbiB1c2UgaXQgbm93IGFnYWluCgkgICAgICB1c2luZyAnc3RyKHB0ciknLCBvciBieSBjYWxsaW5nICdzdHIgPSBQeU9iamVjdF9TdHIob2JqKScKCSAgICAgIGluIHRoZSBDL0MrKyBzaWRlLgogCgkgICAgICBUaGlzIGNoYW5nZSBpcyBtYWlubHkgZm9yIG5vc3RhbGdpYyBzd2lnIHVzZXJzIHRoYXQgbWlzcwoJICAgICAgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiwgYnV0IGFsc28gYWxsb3dzIHRvIHNheSBhZ2FpbgoKCSAgICAgICAgaWYgYS50aGlzID09IGIudGhpczoKCQkgIHJldHVybiAiYSBpcyBiIgoKCSAgICAgIGFuZCB3ZWxsLCBzaW5jZSB0aGUgY2hhbmdlIHdlcmUgcmVhbGx5IHNpbXBsZSwgbWF5YmUgaW4KCSAgICAgIHRoZSBmdXR1cmUgd2Ugd2lsbCBiZSBhYmxlIHRvIGRvCiAgIAoJCW5leHQgPSBhLnRoaXMgKyAxCgoJICAgICAgb3IgYWRkIG5hdGl2ZSBweXRob24gaXRlcmF0aW9uIG92ZXIgbmF0aXZlIEMvQysrIGFycmF5cywKCSAgICAgIGllLCBubyBuZWVkIHRvIGNyZWF0ZS9jb3B5IG5ldyB0dXBsZXMgd2hlbiByZXR1cm5pbmcgYW5kCgkgICAgICBhcnJheSBvciB2ZWN0b3IuCgoJICAgICAgQWxzbywgYSBQeVN3aWdQYWNrZWQgb2JqZWN0IHdhcyBhZGRpbmcgdG8gY2FycnkgYSBtZW1iZXIKCSAgICAgIG1ldGhvZCBwb2ludGVyLCBidXQgdGhpcyBpcyBwcm9iYWJseSBhIHRlbXBvcmFyeSBzb2x1dGlvbgoJICAgICAgdW50aWwgYSBtb3JlIGdlbmVyYWwgb2JqZWN0IGZvciBtZXRob2RzIGlzIGFkZGVkLgoKCSAgICAgIEJlIGF3YXJlIHRoYXQgdG8gc2ltcGxpZnkgbWFpbnRhaW5pbmcgYW5kIGNvbXBhdGliaWxpdHkKCSAgICAgIHdpdGggb3RoZXIgdG9vbHMsIHRoZSBvbGQgc3RyaW5nIGFuZCBQeUNPYmplY3RzCgkgICAgICByZXByZXNlbnRhdGlvbiBjb3VsZCBkaXNhcHBlYXIgdmVyeSBzb29uLCBhbmQgdGhlCgkgICAgICBTV0lHX0NPQkpFQ1RTX1RZUEVTIG9yIFNXSUdfTk9fT0JKRUNUX1RZUEVTIG1hY3JvcyB3aWxsCgkgICAgICBoYXZlIG5vIGVmZmVjdCBhdCBjb21waWxhdGlvbiB0aW1lLiBTdGlsbCwgdGhlIHRocmVlCgkgICAgICBtZWNoYW5pc21zIGFyZSBwcmVzZW50IGluIHRoZSBjb2RlIGp1c3QgZm9yIHRlc3RpbmcsCgkgICAgICBkZWJ1Z2dpbmcgYW5kIGNvbXBhcmlzb24gcHVycG9zZXMuCgkgICAgICAKMTEvMjEvMDQ6IG1tYXR1cwoKCSAgICAtIFtQeXRob25dIEFkZGluZyBiYWNrIHN1cHBvcnQgZm9yIHVzaW5nIHRoZSBzd2lnIHJ1bnRpbWUgY29kZQoJICAgICAgaW5zaWRlIHRoZSB1c2VyIGNvZGUuIFdlIGp1c3QgYWxsb3cgdGhlIHVzZXIgdG8gaW5jbHVkZQoJICAgICAgdGhlIG1pbmltYWwgY29kZSBuZWVkZWQgdG8gaW1wbGVtZW50IHRoZSBydW50aW1lCgkgICAgICBtZWNoYW5pc20gc3RhdGljYWxseSwganVzdCBhcyBpbiBkb25lIGluIHRoZSBzd2lnCgkgICAgICBtb2R1bGVzLgoJICAgICAgCgkgICAgICBUbyB1c2UgdGhlIHN3aWcgcnVudGltZSBjb2RlLCBmb3IgZXhhbXBsZSB3aXRoIHB5dGhvbiwKCSAgICAgIHRoZSB1c2VyIG5lZWRzIGluY2x1ZGUgdGhlIGZvbGxvd2luZzoKIAogICAgICAgICAgICAgICAjaW5jbHVkZSA8UHl0aG9uLmg+ICAgICAgICAgLy8gb3IgdXNpbmcgeW91ciBmYXZvcml0ZSBsYW5ndWFnZQogICAgICAgICAgICAgICAjaW5jbHVkZSA8c3dpZ3J1bi5zd2c+CiAgICAgICAgICAgICAgICNpbmNsdWRlIDxweXRob24vcHlydW4uc3dnPiAvLyBvciB1c2luZyB5b3VyIGZhdm9yaXRlIGxhbmd1YWdlCiAgICAgICAgICAgICAgICNpbmNsdWRlIDxydW50aW1lLnN3Zz4KCgkgICAgICB0aGUgZmlsZXMgc3dpZ3J1bi5zd2csIHB5cnVuLnN3ZyBhbmQgcnVudGltZS5zd2cgY2FuIAoJICAgICAgYmUgY2hlY2tlZCBvdXQgYnkgdXNpbmcgc3dpZyAtY28sIG9yIHRoZXkgY2FuIHNpbXBseSAKCSAgICAgIGJlIGZvdW5kIGJ5IGFkZGluZyB0aGUgc3dpZyBsaWIgZGlyZWN0b3J5IHRvIHRoZQoJICAgICAgY29tcGlsZXIgaW5jbHVkZSBkaXJlY3RvcnkgbGlzdCwgZm9yIGV4YW1wbGUKCgkgICAgICAgU1dJR0xJQj1gc3dpZyAtc3dpZ2xpYmAKCSAgICAgICBjKysgLUkke1NXSUdMSUJ9IC4uCgoJICAgICAgb2YgYmV0dGVyLCB1c2luZyB0aGUgQ1BQRkxBR1MsIGJ1dCB0aGF0IGRlcGVuZHMgb24geW91cgoJICAgICAgZW52aXJvbm1lbnQuCgkgICAgICAgCgkgICAgICBUaGlzIGNoYW5nZSBjYW4gYmUgcG9ydGVkIHRvIHRoZSBvdGhlciBsYW5ndWFnZXMgdG9vLAoJICAgICAgeW91IGp1c3QgbmVlZCB0byBpc29sYXRlIHRoZSBuZWVkZWQgcnVudGltZSBjb2RlIGluCgkgICAgICBhIHNpbmdsZSBmaWxlIGxpa2UgJ3B5cnVuLnN3ZycsIGFuZCBwcm92aWRlIHRoZSAKCSAgICAgIFNXSUdfUnVudGltZV9HZXRUeXBlTGlzdCgpIG1ldGhvZC4gTG9vayBhdCB0aGUKCSAgICAgIExpYi9weXRob24vcHlydW4uc3dnIGZpbGUgYW5kIHRoZSBFeGFtcGxlcy9weXRob24vc3dpZ3J1bgoJICAgICAgZXhhbXBsZS4KCjExLzE1LzA0OiBtbWF0dXMKCSAgICAtIEZpeCBtaXhlZF90eXBlcy5pICsgZ2NjLTMuNCwgaWUsIGFycmF5cyArIHJlZmVyZW5jZXMgKwoJICAgICAgdHlwZWRlZnMKCgkgICAgLSBGaXggbXVsdGlkaW0gYXJyYXlzICsgdHlwZWRlZnMsaWUKCgkgICAgICAgdHlwZWRlZiBjaGFyIGNoYXJhY3RlclsxXTsKCSAgICAgICB0eXBlZGVmIGNoYXJhY3RlciB3b3JkWzY0XTsKCgkgICAgLSBQcm9jZXNzIHByb3RlY3RlZC9wcml2YXRlIGJhc2VzIGluIHRoZSBzYW1lIHdheSBiZWZvcmUKCSAgICAgIHdlIHByb2Nlc3MgcHJvdGVjdGVkL3ByaXZhdGUgbWVtYmVycywgaWUsIHdlIGNoZWNrCgkgICAgICBmb3IgY29uc3RydWN0b3JzLCBvcGVyYXRvciBuZXcsIHZpcnR1YWwgbWVtYmVycywgZXRjLgogICAKCSAgICAtIEZpeCBSdWJ5L0phdmEgdG8gd29yayAob3IgaWdub3JlKSBtdWx0aS1pbmhlcml0YW5jZSArCiAgICAgICAgICAgICAgZGlyZWN0b3JzLiBBbGxvdyBvdGhlciBsYW5ndWFnZXMgdG8gZGVmaW5lIGlmIGl0IGlzCiAgICAgICAgICAgICAgc3VwcG9ydGVkIG9yIG5vdC4KCSAgICAKCSAgICAtIE5vdyB5b3UgY2FuIHJ1bgoKICAgICAgICAgICAgICAgIFNXSUdfRkVBVFVSRVM9Ii1kaXJlY3RvcnMgLWRpcnByb3QiIAogICAgICAgICAgICAgICAgbWFrZSBjaGVjay1ydWJ5LXRlc3Qtc3VpdGUKICAgICAgICAgICAgICAgIG1ha2UgY2hlY2stcHl0aG9uLXRlc3Qtc3VpdGUKICAgICAgICAgICAgICAgIG1ha2UgY2hlY2stamF2YS10ZXN0LXN1aXRlCiAgICAgICAgICAgICAgICBtYWtlIGNoZWNrLW9jYW1sLXRlc3Qtc3VpdGUKCgkgICAgICBhbmQgeW91IHdpbGwgZ2V0IG9ubHkgJ3JlYWwnIGVycm9ycy4gcnVieSBhbmQgcHl0aG9uCgkgICAgICBjb21waWxlIHdpdGggbm8gZXJyb3JzLCBqYXZhIHNob3dzIHNvbWUgcHJvYmxlbXMuCQoKVmVyc2lvbiAxLjMuMjMgKE5vdmVtYmVyIDExLCAyMDA0KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMS8wNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCAjOTgyNzUzIGZyb20gRmFicmljZSBTYWx2YWlyZTogQWRkcyBkZXBlbmRlbmNpZXMgZ2VuZXJhdGlvbiBmb3IKICAgICAgICAgICAgY29uc3RydWN0aW5nIG1ha2VmaWxlcy4gTmV3IGNvbW1hbmQgbGluZSBvcHRpb25zIC1NRiAtTUQgLU1NRCB0byB3b3JrCiAgICAgICAgICAgIHdpdGggdGhlIGN1cnJlbnQgb3B0aW9ucyAtTSBhbmQgLU1NLiBUaGVzZSBvcHRpb25zIGFyZSBuYW1lZCB0aGUgc2FtZQogICAgICAgICAgICBhbmQgd29yayB0aGUgc2FtZSBhcyBpbiBnY2MuCgoxMS8wNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICAlaWdub3JlLyVyZW5hbWUgY2hhbmdlcyBmb3IgbWV0aG9kcyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIHRvIG1pcnJvcgogICAgICAgICAgICAlZmVhdHVyZSBiZWhhdmlvdXIuIFNlZSBwcmV2aW91cyBlbnRyeS4KCiAgICAgICAgICAgICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjExLzA0LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgICVmZWF0dXJlIGltcHJvdmVtZW50cyBmb3IgZmluZSB0dW5pbmcgd2hlbiB3cmFwcGluZyBtZXRob2RzIHdpdGgKICAgICAgICAgICAgZGVmYXVsdCBhcmd1bWVudHMuIEFueSAlZmVhdHVyZSB0YXJnZXRpbmcgYSBtZXRob2Qgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cwogICAgICAgICAgICB3aWxsIGFwcGx5IHRvIGFsbCB0aGUgZXh0cmEgb3ZlcmxvYWRlZCBtZXRob2RzIHRoYXQgU1dJRyBnZW5lcmF0ZXMgaWYgdGhlCiAgICAgICAgICAgIGRlZmF1bHQgYXJndW1lbnRzIGFyZSBzcGVjaWZpZWQgaW4gdGhlIGZlYXR1cmUuIElmIHRoZSBkZWZhdWx0IGFyZ3VtZW50cyBhcmUKICAgICAgICAgICAgbm90IHNwZWNpZmllZCBpbiB0aGUgZmVhdHVyZSwgdGhlbiB0aGUgZmVhdHVyZSB3aWxsIG1hdGNoIHRoYXQgZXhhY3QKICAgICAgICAgICAgd3JhcHBlciBtZXRob2Qgb25seSBhbmQgbm90IHRoZSBleHRyYSBvdmVybG9hZGVkIG1ldGhvZHMgdGhhdCBTV0lHIGdlbmVyYXRlcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVmZWF0dXJlKCJleGNlcHQiKSBoZWxsbyhpbnQgaT0wLCBkb3VibGUgZD0wLjApOwogICAgICAgICAgICAgIHZvaWQgaGVsbG8oaW50IGk9MCwgZG91YmxlIGQ9MC4wKTsKCiAgICAgICAgICAgd2lsbCBhcHBseSB0aGUgZmVhdHVyZSB0byBhbGwgdGhyZWUgd3JhcHBlciBtZXRob2RzLCB0aGF0IGlzOgoKICAgICAgICAgICAgICB2b2lkIGhlbGxvKGludCBpLCBkb3VibGUgZCk7CiAgICAgICAgICAgICAgdm9pZCBoZWxsbyhpbnQgaSk7CiAgICAgICAgICAgICAgdm9pZCBoZWxsbygpOwoKICAgICAgICAgICBJZiB0aGUgZGVmYXVsdCBhcmd1bWVudHMgYXJlIG5vdCBzcGVjaWZpZWQgaW4gdGhlIGZlYXR1cmU6CgogICAgICAgICAgICAgICVmZWF0dXJlKCJleGNlcHQiKSBoZWxsbyhpbnQgaSwgZG91YmxlIGQpOwogICAgICAgICAgICAgIHZvaWQgaGVsbG8oaW50IGk9MCwgZG91YmxlIGQ9MC4wKTsKCiAgICAgICAgICAgdGhlbiB0aGUgZmVhdHVyZSB3aWxsIG9ubHkgYXBwbHkgdG8gdGhpcyB3cmFwcGVyIG1ldGhvZDoKCiAgICAgICAgICAgICAgdm9pZCBoZWxsbyhpbnQgaSwgZG91YmxlIGQpOwoKICAgICAgICAgICBhbmQgbm90IHRoZXNlIHdyYXBwZXIgbWV0aG9kczoKCiAgICAgICAgICAgICAgdm9pZCBoZWxsbyhpbnQgaSk7CiAgICAgICAgICAgICAgdm9pZCBoZWxsbygpOwoKICAgICAgICAgICBUaGlzIGhhcyBiZWVuIGludHJvZHVjZWQgdG8gbWFrZSAlZmVhdHVyZSBtb3JlIHBvd2VyZnVsIHRvIGVhc2UgdGhlIG1pZ3JhdGlvbgogICAgICAgICAgIHRvIG5ldyBkZWZhdWx0IGFyZ3VtZW50cyB3cmFwcGluZyBhcHByb2FjaC4KCiAgICAgICAgICAgICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCiAgICAgICAgICAgSWYgeW91IHByZXZpb3VzbHkgaGFkIGEgJWZlYXR1cmUgYW5kIGRpZG4ndCBzcGVjaWZ5IHRoZSBkZWZhdWx0IGFyZ3VtZW50cywKICAgICAgICAgICB5b3Ugd2lsbCBoYXZlIHRvIGFkZCB0aGVtIGluIG5vdyBvciB5b3UgY2FuIG9idGFpbiB0aGUgb3JpZ2luYWwgYmVoYXZpb3VyCiAgICAgICAgICAgYnkgdXNpbmcgJWZlYXR1cmUoImNvbXBhY3RkZWZhdWx0YXJncyIpLgoKMTEvMDQvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBUeXBlbWFwcyBmb3Igc3RkOjp2ZWN0b3IgYWRkZWQgaW50byBzdGRfdmVjdG9yLmkuIFRoZSBwcm94eSBjbGFzc2VzCiAgICAgICAgICAgIGdlbmVyYXRlZCBhcmUgbW9kZWxsZWQgb24gdGhlIC5ORVQgQXJyYXlMaXN0IGNsYXNzLiBUaGlzIGlzbid0IHF1aXRlCiAgICAgICAgICAgIHJlYWR5IGZvciBnZW5lcmFsIGNvbnN1bXB0aW9uIHlldCwgYnV0IHdpbGwgd29yayB3aXRoIHZlY3RvcnMgb2YgcHJpbWl0aXZlCiAgICAgICAgICAgIHR5cGVzIGFuZCBzb21lIGNsYXNzZXMuCgoxMC8zLzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBbR1VJTEVdIFRoZSAtc2NtIGludGVyZmFjZSBpcyBub3cgdGhlIGRlZmF1bHQuICBUaGUgb2xkIEdIIGludGVyZmFjZSBjYW4KCSAgICBzdGlsbCBiZSBlbmFibGVkIGJ5IHBhc3NpbmcgLWdoIHRvIFNXSUcuCgoxMC8yLzIwMDQ6IG1tYXR1cwoKCSAgICAtIE1vcmUgZml4ZXMgZm9yIG5hbWVzcGFjZSArIGNsYXNzIGRlY2xhcmF0aW9ucy4KCSAgICAgIEFzIGFuIGV4dHJhIGJvbnVzLCB3ZSBnZXQgJXRlbXBsYXRlIHN1cHBvcnQgZm9yIHN0YXRpYy9tZW1iZXJzIGNsYXNzCgkgICAgICBtZXRob2RzLCBpZSwgbm93IHlvdSBjYW4gc2F5OgoKCSAgICAgICAgbmFtZXNwYWNlIHNwYWNlIHsKICAgICAgICAgICAgICAgICBzdHJ1Y3QgQQkJCSAgICAKCSAgICAgICAgIHsJCQkJICAgIAoJICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgWT4JICAgIAoJICAgICAgICAgICBzdGF0aWMgdm9pZCBmb29UKFkgeSkgeyB9CgkgICAgICAgICB9OwkKCQl9CQkJICAgIAoJICAgICAgCSAgICAgIAkJCSAgICAKCSAgICAgICAgc3RydWN0IEIJCQkgICAgCgkgICAgICAgIHsJCQkJICAgIAoJICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBZPgkJICAgIAoJICAgICAgICAgIHZvaWQgYmFyVChZIHkpIHt9IAoJICAgICAgICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgIAoKCQkldGVtcGxhdGUoZm9vKSBzcGFjZTo6QTo6Zm9vVDxkb3VibGU+OwoJCSV0ZW1wbGF0ZShmb28pIHNwYWNlOjpBOjpmb29UPGludD47CgkJJXRlbXBsYXRlKGZvbykgc3BhY2U6OkE6OmZvb1Q8Y2hhcj47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgkJJXRlbXBsYXRlKGJhcikgQjo6YmFyVDxkb3VibGU+OwoJCSV0ZW1wbGF0ZShiYXIpIEI6OmJhclQ8aW50PjsKCQkldGVtcGxhdGUoYmFyKSBCOjpiYXJUPGNoYXI+OwoKCSAgICAgIGFuZCBjYWxsCgoJICAgICAgICBBLmZvbygxKQoJCWIgPSBCKCkKCQliLmJhcigxKQoJICAgICAgCgkgICAgICBub3RlIHRoZSBtZXRob2RzIGFyZSBlbWl0dGVkIGluc2lkZSB0aGUgY2xhc3NlcywKCSAgICAgIGFuZCBoZW5jZSwgdGhlICV0ZW1wbGF0ZSBuYW1lIHJlZmVycyB0byB0aGUgJ21lbWJlcicKCSAgICAgIG1ldGhvZCBuYW1lLCBub3QgYSBnbG9iYWwgbmFtZXNwYWNlIG5hbWUuCgoxMC8zMS8yMDA0OiBtbWF0dXMKCSAgICAtIFNvbHZlIG5hbWVzcGFjZSArIGNsYXNzIGRlY2xhcmF0aW9ucywgYXMgaW4KCgkgICAgICAgbmFtZXNwYWNlIGZvbyB7CiAgICAgICAgICAgICAgICAgc3RydWN0IEJhcjsKCQkgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgc3RydWN0IGZvbzo6QmFyIDogRm9vIHsKICAgICAgICAgICAgICAgfTsKCgkgICAgICAgc2VlIG5hbWVzcGFjZV9jbGFzcy5pIGZvciBtb3JlIGV4YW1wbGVzLgoKICAgICAgICAgICAgLSBGaXggJXRlbXBsYXRlIGRpcmVjdGl2ZSB0byBwcm9wZXJseSB1c2UgbmFtZXNwYWNlcywKICAgICAgICAgICAgICBpbmNsdWRpbmcgdGhlIGNhc2U6CgoJCSAgIG5hbWVzcGFjZSBvbmUKCQkgICB7CgkJICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgoJCSAgICAgICBzdHJ1Y3QgUHRyIHt9OwogICAgICAgICAgICAgICAgICAgfQoKCQkgICBuYW1lc3BhY2Ugb25lCgkJICAgewkJICAKCQkgICAgICAgc3RydWN0IE9iajEge307CgkJICAgICAgIHR5cGVkZWYgUHRyPE9iajE+IE9iajFfcHRyOwogIAkJICAgICAgICV0ZW1wbGF0ZShPYmoxX3B0cikgUHRyPE9iajE+OyAKCQkgICB9CQkJCSAgCgkJICAgCQkJCSAgCgkJICAgbmFtZXNwYWNlIHR3byAgCgkJICAgewoJCSAgICAgICBzdHJ1Y3QgT2JqMiB7fTsJCgkJICAgICAgIHR5cGVkZWYgb25lOjpQdHI8T2JqMj4gT2JqMl9wdHI7CgkJICAgICAgICV0ZW1wbGF0ZShPYmoyX3B0cikgb25lOjpQdHI8T2JqMj47CgkJICAgfQoKCSAgICAgIHRoaXMgaXMgZG9uZSBieSB1c2luZyB0aGUgbmFtZXNwYWNlIG5hbWUgJ29uZScgdG8gY3JlYXRlCiAgICAgICAgICAgICAgYSBuYW1lc3BhY2Ugbm9kZSB0byBlbWl0IHRoZSB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uLAogICAgICAgICAgICAgIGp1c3QgYXMgYmVmb3JlLCBidXQgdGhlIHRlbXBsYXRlIHBhcmFtZXRlcnMgYXJlIHJlc29sdmVkCiAgICAgICAgICAgICAgYW5kIHF1YWxpZmllZCBpbiB0aGUgY3VycmVudCBuYW1lc3BhY2UgKCdvbmUnIG9yICd0d28nKS4KICAgICAgICAgICAgICBUaGlzIGlzIHNhbWUgd2F5IHRoYXQgdHlwZWRlZiB3b3Jrcy4gCgoJICAgICAgVGhpcyByZXNvbHZlIHRoZSBzbWFydF9wb2ludGVyX25hbWVzcGFjZTIuaSBjYXNlLCBhbmQgYXQKICAgICAgICAgICAgICB0aGUgc2FtZSB0aW1lLCBzZXZlcmFsIG90aGVyIG9uZXMgd2hlcmUgYmVmb3JlIHN3aWcgd2FzCiAgICAgICAgICAgICAgZ2VuZXJhdGluZyB0aGUKCgkgICAgICAgICJDYW4ndCBpbnN0YW50aWF0ZSB0ZW1wbGF0ZSAneHgnIGluc2lkZSBuYW1lc3BhY2UgJ3l5JyIKCSAgICAgIAoJICAgICAgZXJyb3IgbWVzc2FnZS4gSW4gZmFjdCwgdGhhdCBlcnJvciBkb2Vzbid0IGV4aXN0CgkgICAgICBhbnltb3JlLiBZb3UgY2FuIG9ubHkgZ2V0IGFuIGVycm9yIGlmIHlvdSB1c2UgYSBiYWQKCSAgICAgIG5hbWVzcGFjZSBuYW1lIG9yIHNvLgoKMTAvMzAvMjAwNDogbW1hdHVzCgkgICAgLSBbcnVieV0gRGlyZWN0b3JzIGZpeGVzOgoJICAgICAgLSBlbnVtcyBhbmQgc3RkOjpzdHJpbmdzIGFyZSB3b3JraW5nIG5vdyAoc2V2ZXJhbAoJICAgICAgICByZXBvcnRzIGluIGJ1ZyB0cmFjayBzeXN0ZW0pCgkgICAgICAtIGFkZGVkIHBhdGNoIDEwMjU4NjEgZm9yIGRpcmVjdG9yICsgZXhjZXB0aW9ucwoJCQogICAgICAgICAgICAgICoqKiBBdHRlbnRpb24gKioqOiBydWJ5IHdpdGggZGlyZWN0b3JzICsgcHJvdGVjdGVkCiAgICAgICAgICAgICAgbWVtYmVycyB3b3JrIHdpdGggdmVyc2lvbiAxLjcrLiBPbGRlciB2ZXJzaW9ucyBzZWVtcyB0bwogICAgICAgICAgICAgIGhhdmUgYSBicm9rZW4gc2lnbmF0dXJlIGZvcidyYl9wcm90ZWN0Jy4KCQkKCSAgICAgIElmIHlvdSBuZWVkIHRvIHVzZSBhbiBvbGQgdmVyc2lvbiwgbG9vayBhdAoKCSAgICAgIGh0dHA6Ly9leGNydWJ5LnNvdXJjZWZvcmdlLm5ldC9kb2NzL2h0bWwvcnVieV9faGFja3NfOGhwcC1zb3VyY2UuaHRtbAogIAkgICAgICBmb3Igd29ya2Fyb3VuZHMuCgkgICAgICAKICAgICAgICAgICAgLSBbcnVieV0gRml4IG1lbW9yeSBhbGxvY2F0aW9uIHByb2JsZW0gaW4gdHlwZW1hcCAoYnVnIDEwMzcyNTkpCgoJICAgIC0gW3RjbF0gRml4IChlbnVtc3xjb25zdGFudHMpICsgbmFtZXNwYWNlIG9wdGlvbiAKCSAgICAgICAgICAgIChyZXBvcnRlZCBieSBqYXNvbi5tLnN1cnByaXNlQGludGVsLmNvbSkuCgogICAgICAgICAgICAtIFtwZXJsXSBBZGQgcGF0Y2ggOTYyMTY4IGZvciBtdWx0aXBsZSBpbmhlcmV0YW5jZQoJICAgIAoJICAgIC0gRml4ICdkZWZpbmVkJyBhcyB2YXJpYWJsZSBuYW1lLgoKMTAvMjkvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgU2VnIGZhdWx0IGZpeCBmb3IgZ2xvYmFsIHNjb3BlIG9wZXJhdG9yIHVzZWQgZm9yIGZyaWVuZCBtZXRob2RzOgoKICAgICAgICAgICAgICBjbGFzcyBCIHsKICAgICAgICAgICAgICAgIGZyaWVuZCB2b2lkIDo6Z2xvYmFsc2NvcGUoKTsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH07CgoxMC8yOC8yMDA0Om1tYXR1cwoJICAgIC0gQWRkZWQgbW9kdWxlIGFuZCBzd2lnIG9wdGlvbiAidGVtcGxhdGVyZWR1Y2UiIHRvIGZvcmNlIHN3aWcKCSAgICAgIHRvIHJlZHVjZSBhbnkgdHlwZSBuZWVkZWQgd2l0aCB0ZW1wbGF0ZXMsIGllLCBpbiB0aGVzZSBjYXNlcwoKICAgICAgICAgICAgICAgICVtb2R1bGUoInRlbXBsYXRlcmVkdWNlIikgdGVzdAoKICAgICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgQSB7IH07CgogICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgSW50OwoJICAgICAgICAldGVtcGxhdGUoQV9JbnQpIEE8SW50PiAgPT0+ICAldGVtcGxhdGUoQV9JbnQpIEE8aW50PgoKICAgICAgICAgICAgICAgIHR5cGVkZWYgQiogQnA7CgkgICAgICAgICV0ZW1wbGF0ZShBX0JwKSBBPEJwPiAgPT0+ICAldGVtcGxhdGUoQV9CcCkgQTxCKj4KCiAgICAgICAgICAgICAgc3dpZyByZWR1Y2VzIHRoZSB0eXBlcyBJbnQgYW5kIEJwIHRvIHRoZWlyIHByaW1pdGl2ZXMKICAgICAgICAgICAgICBpbnQgYW5kIEIqLiBUaGlzIGlzIGNsb3NlciB0byB0aGUgdXN1YWwgY29tcGlsZXIKICAgICAgICAgICAgICByZXNvbHV0aW9uIG1lY2hhbmlzbSwgYW5kIGl0IGlzIHJlYWxseSBuZWVkZWQgc29tZXRpbWVzCiAgICAgICAgICAgICAgd2hlbiB5b3UgbWl4IHRlbXBsYXRlcyArIHR5cGVkZWZzICsgc3BlY2lhbGl6YXRpb25zLgoKCSAgICAgIERvbid0IHVzZSBpdCBpZiB5b3UgZG9uJ3QgaGF2ZSBhbnkgcHJvYmxlbSBhbHJlYWR5LAoJICAgICAgc2luY2UgdGhlIHR5cGUgcmVkdWN0aW9uIGNhbiBpbnRlcmZlcmUgd2l0aCBzb21lCgkgICAgICB1c2VyIHR5cGVtYXBzLCBzcGVjaWFsbHkgaWYgeW91IGRlZmluZWQgc29tZXRoaW5nIGxpa2UKCgkJICAgdHlwZWRlZiBpbnQgSW50OwoJCSAgICV0eXBlbWFwKGluKSBJbnQgLi4uOwoKICAgICAgICAgICAgICBpbiB0aGlzIGNhc2UsIHdoZW4geW91IHVzZSB0aGUgInRlbXBsYXRlcmVkdWNlIiBvcHRpb24sCgkgICAgICBzd2lnIHdpbGwgaWdub3JlIHRoZSB1c2VyIHR5cGVtYXAsIHNpbmNlIHRoZSAidHlwZWRlZiBpbnQgSW50IgoJICAgICAgd2lsbCB0YWtlIHByZWNlZGVuY2UsIGFuZCB0aGUgdXN1YWwgImludCIgdHlwZW1hcCB3aWxsIGJlCgkgICAgICBhcHBsaWVkLiAKCgkgICAgICBOb3RlIHRoYXQgdGhlIHByZXZpb3VzIGNhc2UgaXMgbm90IGNvbW1vbiwgYW5kIHNob3VsZCBiZQoJICAgICAgYXZvaWRlZCwgaWUsIGlzIG5vdCByZWNvbW1lbmRlZCB0byB1c2UgYSB0eXBlZGVmIGFuZCBhCgkgICAgICB0eXBlbWFwIGF0IHRoZSBzYW1lIHRpbWUsIHNwZWNpYWxseSBpZiB5b3UgYXJlIGdvaW5nIHRvCgkgICAgICB1c2UgdGVtcGxhdGVzICsgc3BlY2lhbGl6YXRpb25zLgoKCSAgICAtIERpcmVjdG9yczoKCgkgICAgICAgIHZpcnR1YWwgZGVzdHJ1Y3RvciBpcyBhbHdheXMgZW1pdHRlZCBub3csIHRoaXMgZG9lc24ndAoJICAgICAgICBjYXVzZSBhbnkgaGFybSwgYW5kIGNvdWxkIHNvbHZlIHNvbWUgbmFzdHkgYW5kCgkgICAgICAgIG15c3RlcmlvdXMgZXJyb3JzLCBsaWtlIHRoZSBvbmUgbWVudGlvbmVkIGJ5IFNjb3R0LgoKCQlhbHNvIHRoZSBkZXN0cnVjdG9yIGlzIG5vdCBpbi1saW5lZCwgc28sIHRoYXQgY2FuIHNvbHZlCgkJc29tZSBvdGhlciBteXN0ZXJpb3VzIGVycm9ycyB3aGVuIG1peGluZyBkaXJlY3RvcnMgKwoJCWltcG9ydHMgKyBlbWJlZGRlZCBhcHBsaWNhdGlvbnMgKyBzb21lIHNwZWNpZmljIGNvbXBpbGVycy4KCQkKMTAvMjcvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSB0eXBlbWFwcy5pIGxpYnJhcnkgZmlsZSB3aXRoIElOUFVULCBPVVRQVVQgYW5kIElOT1VUIHR5cGVtYXBzIGFkZGVkLgoKMTAvMjcvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIHN0ZDo6d3N0cmluZyB0eXBlbWFwIGZpeGVzIGluIHN0ZF9zdHJpbmcuaSBmcm9tIFJ1c3NlbGwgS2VpdGgtTWFnZWUuCgoxMC8yNS8yMDA0OiBtbWF0dXMgCgoJICAgIC0gVXNpbmcgKyBuYW1lc3BhY2UgaXMgd29ya2luZyBub3cgKHVzaW5nX25hbWVzcGFjZS5pKS4KCgkgICAgLSBEZXJpdmVkICsgbmVzdGVkIGNsYXNzZXMgaXMgd29ya2luZyBub3cKCSAgICAgIChkZXJpdmVyX25lc3RlZC5pKSwgYnV0IG9mIGNvdXJzZSwgd2UgYXJlIHN0aWxsIHdhaXRpbmcKCSAgICAgIGZvciB0aGUgbmVzdGVkIGNsYXNzIHN1cHBvcnQuCgkgICAgCgkgICAgLSBEaXJlY3RvcnM6CgkgICAgICAtIHVubmFtZWQgcGFyYW1ldGVycyBzdXBwb3J0LAoKCSAgICAgIC0gcHJvdGVjdGVkIGNvbnN0cnVjdG9yIHN1cHBvcnQgKGF1dG9tYXRpYyBhbmQgd2l0aAogICAgICAgICAgICAgICAgZGlycHJvdCBtb2RlKSwKCgkgICAgICAtIGRldGVjdGlvbiBvZiByZWFsbHkgbmVlZGVkIHByb3RlY3RlZCBkZWNsYXJhdGlvbnMKICAgICAgICAgICAgICAgIChtZW1iZXJzIGFuZCBjb25zdHJ1Y3RvcnMpIG5vdyBpcyBkb25lIGF1dG9tYXRpY2FsbHkuCiAgICAgICAgICAgICAgICBFdmVuIGlmIHlvdSBkb24ndCB1c2UgdGhlICdkaXJwcm90JyBtb2RlLCBzd2lnIHdpbGwKICAgICAgICAgICAgICAgIHdyYXAgd2hhdCBpcyBtaW5pbWFsbHkgbmVlZGVkIChhbmQgcHJvdGVjdGVkKSBmb3IgdGhlCiAgICAgICAgICAgICAgICBjb2RlIHRvIGNvbXBpbGUuCgkJCgkJd2hhdCBpcyBwdWJsaWMsIGFzIHVzdWFsLCBpcyBhbHdheXMgd3JhcHBlZCwgYW5kIGlmCgkJeW91IHVzZSB0aGUgJ2RpcnBvcnQnCgkJCgoJICAgIC0gRmluYWwgZml4ZXMgZm9yIHRoZSBPU1MgdG8gY29tcGlsZSB3aXRoIFNXSUcgMS4zLjIzIChteQoJICAgICAgdmVyeSB2ZXJ5IHVnbHkgQysrICsgdGVtcGxhdGVzICsgZXZlcnl0aGluZyBtb3VudGVycyB3cmFwKS4KCjEwLzI1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gTmV3IGNvbW1hbmRsaW5lIG9wdGlvbiAtZGxsaW1wb3J0LiBUaGlzIGVuYWJsZXMgb25lIHRvIHNwZWNpZnkKICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIERMTCBmb3IgdGhlIERsbEltcG9ydCBhdHRyaWJ1dGUuIE5vcm1hbGx5IHRoaXMgbmFtZQogICAgICAgICAgICBjb21lcyBmcm9tIHRoZSBtb2R1bGUgbmFtZSwgc28gbm93IGl0IGlzIHBvc3NpYmxlIHRvIG92ZXJyaWRlIHRoaXM6CgogICAgICAgICAgICAgIHN3aWcgLWNzaGFycCAtZGxsaW1wb3J0IHh5eiBleGFtcGxlLmkKCiAgICAgICAgICAgIHdpbGwgZ2VuZXJhdGUgZm9yIGFsbCB0aGUgd3JhcHBlZCBQSW52b2tlIG1ldGhvZHM6CgogICAgICAgICAgICAgIFtEbGxJbXBvcnQoInh5eiIsIEVudHJ5UG9pbnQ9Ii4uLiIpXQogICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZXh0ZXJuIC4uLgoKICAgICAgICAgICAgVGhlIHdyYXBwZXJzIGZyb20gbWFueSBkaWZmZXJlbnQgU1dJRyBpbnZvY2F0aW9ucyBjYW4gdGh1cyBiZSBjb21waWxlZAogICAgICAgICAgICBpbnRvIG9uZSBETEwuCgogICAgICAgICAgICBBIG5ldyBzcGVjaWFsIHZhcmlhYmxlICRkbGxpbXBvcnQgY2FuIGFsc28gYmUgdXNlZCBpbiB0eXBlbWFwcywgcHJhZ21hcywKICAgICAgICAgICAgZmVhdHVyZXMgZXRjLiBUaGlzIHdpbGwgZ2V0IHRyYW5zbGF0ZWQgaW50byB0aGUgdmFsdWUgc3BlY2lmaWVkIGJ5IC1kbGxpbXBvcnQKICAgICAgICAgICAgaWYgc3BlY2lmaWVkLCBvdGhlcndpc2UgdGhlIG1vZHVsZSBuYW1lLgoKMTAvMjIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFBhdGNoICMxMDQ5NDk2IGZyb20gU2NvdHQgTWljaGVsIGZpeGVzIGRpcmVjdG9ycyBtZXRob2RzIHdpdGggCiAgICAgICAgICAgIGVudW1zIHdoZW4gd3JhcHBlZCB3aXRoIHR5cGVzYWZlIG9yIHByb3BlciBKYXZhIGVudW1zLgoKMTAvMjEvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgRml4ZXMgZm9yIGRlZmF1bHQgYXJndW1lbnRzIGluIGRpcmVjdG9yIGNvbnN0cnVjdG9ycyAoUHl0aG9uLCBSdWJ5LCBPY2FtbCkuCgoxMC8yMS8yMDA0OiBtbWF0dXMKCSAgICAtIFtQeXRob25dIEFkZCB0aGUgJy1jcGx1c2Nhc3QnIG9wdGlvbiB0byBlbmFibGUgdGhlICduZXcnCgkgICAgICBDKysgY2FzdGluZyBvcGVyYXRvcnMsIHN1Y2ggYXMgJ3N0YXRpY19jYXN0JywgaW5zaWRlIHRoZQoJICAgICAgdHlwZW1hcHMuIEJ5IGRlZmF1bHQgc3dpZyB1c2UgdGhlIG9sZCBDIGNhc3Qgc3R5bGUsIGV2ZW4KCSAgICAgIHdoZW4gcGFyc2luZyBDKysuCgkgICAgICAKCSAgICAtIFtQeXRob25dIEFkZCB0aGUgJy1uZXdfdndtJyBvcHRpb24gdG8gZW5hYmxlIHRoZSBuZXcKICAgICAgICAgICAgICBTd2lnVmFsdWVXcmFwcGVyIG1vZGUuIE5vdyB0aGlzIGlzIG1haW5seSBmb3IgdGVzdGluZwogICAgICAgICAgICAgIHRoYXQgdGhlIHR5cGVtYXBzIGFyZSByZWFsbHkgc2FmZSBmb3IgYW55IGZ1dHVyZQogICAgICAgICAgICAgIHNvbHV0aW9uLCBidXQgeW91IGNhbiB1c2UgaXQgaWYgeW91IGhhdmUgYSB2ZXJ5IHN0cmFuZ2UKICAgICAgICAgICAgICBlcnJvciB3aXRoIGRlZmF1bHQgY29zbnRydWN0b3JzIG1pc3NpbmcgKyAlYXBwbHkgKwogICAgICAgICAgICAgICV0eXBlbWFwLCBhbmQgaWYgZXZlcnl0aGluZyBlbHNlIGZhaWxzIChzZWUKICAgICAgICAgICAgICB2YWx1d3JhcHBlcl9vcGFxdWUuaSBmb3IgYWx0ZXJuYXRpdmUgYW5kIGN1cnJlbnQKICAgICAgICAgICAgICBzb2x1dGlvbnMpLiBJZiB5b3UgYXJlIGEgdXNlciB0aGF0IGRvbid0IGtub3cgd2hhdCBpcwogICAgICAgICAgICAgIFN3aWdWYWx1ZVdyYXBwZXIsIGRvbid0IGV2ZW4gdHJ5IGl0LgoKCSAgICAtIFtQeXRob25dIEFkZCB0aGUgJy1ub2gnIG9wdGlvbiB0byBiZSB1c2VkIHdpdGggZGlyZWN0b3JzCgkgICAgICBhbmQgd2hlbiB5b3UgcHJlZmVyIHRvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgdGhlCgkgICAgICBkaXJlY3RvciBoZWFkZXIgZmlsZS4gSWYgbm90IHVzZWQsIHN3aWcgd2lsbCB3b3JrIGFzCgkgICAgICB1c3VhbCBnZW5lcmF0aW5nIGJvdGggdGhlIHdyYXAuY3h4IGFuZCB3cmFwLmggZmlsZXMuIElmCgkgICAgICB5b3UgdXNlIGl0LCBzd2lnIHdpbGwgb25seSBnZW5lcmF0ZSB3cmFwLmN4eC4KCjEwLzIxLzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICAtIElmIHlvdSBkZWZpbmUgU1dJR19UWVBFX1RBQkxFIHdoZW4gY29tcGlsaW5nIGEgd3JhcHBlciBmaWxlLAoJICAgICAgdGhlIHJ1bnRpbWUgdHlwZXMgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIGdpdmVuIHR5cGUgdGFibGUgbmFtZS4KCSAgICAgIFVzaW5nIHRoaXMsIHlvdSBjYW4gc2VwZXJhdGUgZGlmZmVyZW50IG1vZHVsZXMgdG8gc2hhcmUgdGhlaXIKCSAgICAgIG93biB0eXBlIHN5c3RlbXMuICAtRFNXSUdfVFlQRV9UQUJMRT1NeXRhYmxlCgoJICAgIC0gW1B5dGhvbl0gSWYgeW91IGRlZmluZSBTV0lHX1NUQVRJQ19SVU5USU1FIHRoZW4gdGhlIHR5cGUgaW5mb3JtYXRpb24KCSAgICAgIHdpbGwgYmUgc3RhdGljIHRvIHRoaXMgd3JhcHBlci4gIE5vdGhpbmcgd2lsbCBiZSBzaGFyZWQgd2l0aCBhbnkKCSAgICAgIG90aGVyIG1vZHVsZXMKCgkgICAgLSBbUHl0aG9uXSBJZiB5b3UgZGVmaW5lIFNXSUdfTElOS19SVU5USU1FLCB0aGVuIGluc3RlYWQgb2YgdXNpbmcKCSAgICAgIHRoZSBuZXcgd2F5IG9mIHNoYXJpbmcgdHlwZSBpbmZvcm1hdGlvbiwgdGhlIHdyYXBwZXIgd2lsbCBleHBlY3QKCSAgICAgIHRvIGJlIGxpbmtlZCBhZ2FpbnN0IHRoZSBMaWIvbGlua3J1bnRpbWUuYyBmaWxlLiAgQW55IG1vZHVsZXMgY29tcGlsZWQKCSAgICAgIHdpdGggU1dJR19MSU5LX1JVTlRJTUUgYW5kIGxpbmtlZCBhZ2FpbnN0IGxpbmtydW50aW1lLmMgd2lsbCBhbGwKCSAgICAgIHNoYXJlIHR5cGUgaW5mb3JtYXRpb24uCgoxMC8yMC8yMDA0OiBtbWF0dXMKCSAgICAtIFtQeXRob25dIEluaXRpYWwgZml4IGZvciBweXRob24vaW1wb3J0IGV4YW1wbGUuIFBsZWFzZQoJICAgICAgdXBkYXRlIHRoZSBNYWtlZmlsZSAoYXV0b2NvbmYsIGNvbmZpZ3VyZSwgZXRjLCBleHBlcnQpLAoJICAgICAgc2luY2Ugbm93IHByb2JhYmx5IGlzIG9ubHkgd29ya2luZyB3aXRoIGcrKywgaWNjIGFuZCBhCgkgICAgICBmZXcgb3RoZXIgY29tcGlsZXJzIHRoYXQgaGF2ZSB0aGUgLXNoYXJlZCBvcHRpb24uCgoJICAgICAgV2UgbmVlZCB0byBjcmVhdGUgYWRkaXRpb25hbCBzaGFyZWQgbGlicmFyaWVzIGZvciB0aGUKCSAgICAgIHZpcnR1YWwgZGVzdHJ1Y3RvcnMuIE9sZCBhbmQgdXN1YWxseSBmb3Jnb3R0ZW4gQysrCgkgICAgICByZXF1aXJlbWVudC4KCSAgICAgIAoJICAgICAgU2FtZSBmaXggbmVlZCB0byBiZSB1c2VkIGluIHBlcmwsIEkgdGhpbmsuCgogICAgICAgICAgICAtIFtQeXRob25dIEZpeCBnZW5lcmF0aW9uIG9mIGhlYWRlciBmaWxlIGZvciBkaXJlY3RvcnMsCiAgICAgICAgICAgICAgbm93IGRpcmVjdG9ycy5zd2cgaXMgYWxzbyBpbmNsdWRlZCwgc28sIGl0IGNhbiBiZSByZWFsbHkKCSAgICAgIHVzZWQgZnJvbSBDKyssIGFuZCBpdCBzb2x2ZXMgc29tZSBwcm9ibGVtIHdpdGggY29tcGlsZXIKCSAgICAgIHRoYXQgcmVxdWlyZSB0aGF0LCBldmVuIHdpdGggdGhlIHNpbXBsZSBzd2lnIGluY2x1c2lvbi4gIAoKICAgICAgICAgICAgLSBbUHl0aG9uXSBSZW9yZGVyaW5nIHRoZSBtZXRob2RzIGFuZCBtb3Zpbmcgc29tZSBib2RpZXMKICAgICAgICAgICAgICBvdXRzaWRlIHRoZSBjbGFzcyBkZWNsYXJhdGlvbi4gVGhpcyBpcyBuZWVkZWQgZHVlIHRvCiAgICAgICAgICAgICAgc29tZSBnY2MtMi45NiBpbnRlcm5hbCBjb21waWxlciBlcnJvcnMuIEl0IHNlZW1zIHRoZQogICAgICAgICAgICAgIFBZVEhPTiBjbGFzcyBpcyBnZXR0aW5nIHRvbyBsYXJnZSB0byBiZWVuIGRlY2xhcmVkIGFuZAogICAgICAgICAgICAgIGRlZmluZWQgYXQgdGhlIHNhbWUgdGltZS4KCgkgICAgLSBBZGQgdGhlIC1vaCBvcHRpb24gdG8gY2hhbmdlIHRoZSBvdXRwdXQgaGVhZGVyIGZpbGUgbmFtZQogICAgICAgICAgICAgIGlmIG5lZWRlZDoKCiAgICAgICAgICAgICAgICAgc3dpZyAtYysrIC1weXRob24gdGVzdC5pIC1vIHRlc3QuQ0MgLW9oIHRlc3QuSEgKCSAgICAgIAogICAgICAgICAgICAgIHRoaXMgaXMgbWFpbmx5IG5lZWRlZCB3aGVuIHVzaW5nIGRpcmVjdG9ycywgYW5kIGlmIHRoZQogICAgICAgICAgICAgIGN1cnJlbnQgZGVmYXVsdCBoZWFkZXIgZmlsZSBuYW1lIGlzIG5vdCBnb29kIGZvciB5b3UsCiAgICAgICAgICAgICAgd2hpY2ggaXMgZ2VuZXJhdGVkIGFzIGZvbGxvdzoJICAgICAgCgogICAgICAgICAgICAgICAgIHN3aWcgLWMrKyAtcHl0aG9uIHRlc3QuaSAgICAgICAgICAgICA9PiB0ZXN0X3dyYXAuaAogICAgICAgICAgICAgICAgIHN3aWcgLWMrKyAtcHl0aG9uIHRlc3QuaSAtbyB0ZXN0LkNDICA9PiB0ZXN0LmgKCgoxMC8yMC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICAxKSBDb21wYWN0IGRlZmF1bHQgYXJndW1lbnRzIGZlYXR1cmUgYWRkZWQuIFRoaXMgZmVhdHVyZSBhbGxvd3Mgb25lCiAgICAgICAgICAgICAgdG8gdXNlIHRoZSBkZWZhdWx0IGFyZ3VtZW50IGNvZGUgZ2VuZXJhdGlvbiB0aGF0IHdhcyB1c2VkIGluCiAgICAgICAgICAgICAgU1dJRy0xLjMuMjIgYW5kIGVhcmxpZXIgdmVyc2lvbnMuIEl0IHByb2R1Y2VzIG1vcmUgY29tcGFjdCB3cmFwcGVycwogICAgICAgICAgICAgIGFzIG9ubHkgb25lIHdyYXBwZXIgbWV0aG9kIGlzIGdlbmVyYXRlZCBmb3IgYW55IG1ldGhvZCB3aXRoIGRlZmF1bHQKICAgICAgICAgICAgICBhcmd1bWVudHMuIFNvIHRoZSBhZHZhbnRhZ2UgaXMgaXQgZ2VuZXJhdGVzIGxlc3MgY29kZSBidXQgaGFzIHRoZQogICAgICAgICAgICAgIG9yaWdpbmFsIGxpbWl0YXRpb25zLCBsaWtlIGl0IGl0IGRvZXMgbm90IHdvcmsgd2l0aCBhbGwgZGVmYXVsdCBhcmd1bWVudHMKICAgICAgICAgICAgICBhbmQgZGVmYXVsdCBhcmd1bWVudHMgY2Fubm90IGJlIHRha2VuIGFkdmFudGFnZSBvZiBpbiB0aGUgc3Ryb25nbHkgdHlwZWQKICAgICAgICAgICAgICBsYW5ndWFnZXMgKEMjIGFuZCBKYXZhKS4gSXQgaXMgaW1wbGVtZW50ZWQgdmlhIHRoZSB1c3VhbCAlZmVhdHVyZSBtZWNoYW5pc206CgogICAgICAgICAgICAgICAgJWZlYXR1cmUoImNvbXBhY3RkZWZhdWx0YXJncyIpOwoKICAgICAgICAgICAgMikgS2V5d29yZCBhcmd1bWVudHMgKGt3YXJncykgYXJlIHdvcmtpbmcgYWdhaW4gZm9yIGRlZmF1bHQgYXJndW1lbnRzCiAgICAgICAgICAgICAgIGluIHRoZSBsYW5ndWFnZXMgdGhhdCBzdXBwb3J0IGl0LCBpZSwgUHl0aG9uIGFuZCBSdWJ5LiBUaGUgbmV3IGRlZmF1bHQKICAgICAgICAgICAgICAgYXJndW1lbnQgd3JhcHBpbmcgYXBwcm9hY2ggdXNpbmcgb3ZlcmxvYWRlZCBtZXRob2RzIGNhbm5vdCBzdXBwb3J0IGt3YXJncwogICAgICAgICAgICAgICBzbyB0aGUgY29tcGFjdCBkZWZhdWx0IGFyZ3VtZW50IGZlYXR1cmUgaXMgYXV0b21hdGljYWxseSB0dXJuZWQgb24gd2hlbgogICAgICAgICAgICAgICBrd2FyZ3MgYXJlIHNwZWNpZmllZCwgYnkgJWZlYXR1cmUoImt3YXJncyIpLgoKICAgICAgICAgICAgMykgQ29tcGFjdCBkZWZhdWx0IGFyZ3VtZW50cyBhcmUgYWxzbyBhdXRvbWF0aWNhbGx5IHR1cm5lZCBvbiB3aGVuIHdyYXBwaW5nCiAgICAgICAgICAgICAgIEMgKG5vdCBDKyspIGNvZGUuIFRoaXMgaXMgdG8gc3VwcG9ydCB0aGUgYml6YXJyZSBub3Rpb24gb2YgZGVmYXVsdCBhcmd1bWVudHMKICAgICAgICAgICAgICAgZm9yIEMgY29kZS4KCjEwLzIwLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIE92ZXJsb2FkZWQgdGVtcGxhdGVkIGZ1bmN0aW9ucyBpbiBuYW1lc3BhY2VzIGFsc28gd29ya2luZyBub3cuCiAgICAgICAgICAgIFRlbXBsYXRlZCBmdW5jdGlvbnMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyBpbiBuYW1lc3BhY2VzIHRvby4KCjEwLzE5LzIwMDQ6IG1tYXR1cwoKCSAgICAtIEFsbG93IHRvIGRpc2FibGUgdGhlIG5ldyBTd2lnVmFsdWVXcmFwcGVyIG1lY2hhbmlzbSwKCSAgICAgIGlmIHlvdSBhZGQgdGhlIGZvbGxvd2luZyBsaW5lIGluIHlvdXIgbGFuZ3VhZ2UgbWFpbi4KCgkJIC8qIFR1cm4gb24gc2FmZSB2YWx1ZSB3cmFwcGVyIHVzZSBtb2RlICovCiAgICAgICAgICAgICAgICAgU3dpZ192YWx1ZV93cmFwcGVyX21vZGUoMSk7CgoJICAgICAgCgkgICAgICBOb3cgaXMgb25seSBhY3RpdmUgaW4gcHl0aG9uLiBBbGwgdGhlIG90aGVyIGxhbmd1YWdlcwoJICAgICAgYXJlIHVzaW5nIHRoZSBvbGQgcmVzb2x1dGlvbiwgYnV0IHRoZXkgIGNhbiBhbHNvIHVzZSB0aGUKCSAgICAgICJ2YWx1ZXdyYXBwZXIiLyJub3ZhbHVld3JhcHBlciIgZmVhdHVyZXMgdG8gZml4IHNvbWUKCSAgICAgIG9mIHRoZSBvbGQgYnJva2VuIGNhc2VzLiBOb3RlLCBob3dldmVyLCAgdGhhdCBub3QgYWxsIAoJICAgICAgdGhlIGJyb2tlbiBjYXNlcyBjYW4gYmUgc29sdmVkIGluIHRoYXQgd2F5LgoKCSAgICAgIFRoZSBuZXcgbWVjaGFuaXNtIHNlZW1zIHRvIGJlIHdvcmtpbmcgZmluZSBpbiBwZXJsLCBydWJ5CgkgICAgICBhbmQgdGNsLCBidXQgZmFpbGluZyBpbiBzb21lIHR5cGVtYXBzIGluIGphdmEuCgoJICAgICAgSGVuY2UsIGlzIHVwdG8gdGhlIGxhbmd1YWdlIG1haW50YWluZXIgdG8gdGVzdCBpdCwgYW5kCgkgICAgICBkZWNpZGUgdG8gZW5hYmxlIGl0IG9yIG5vdC4KCgkgICAgICBMb29rIGF0IHRoZSB2YWx1ZXdyYXBwZXJfb3BhcXVlLmkgZm9yIGV4YW1wbGVzLgoKCSAgICAtIEZpeCBtb3JlIFN3aWdWYWx1ZVdyYXBwZXIgY2FzZXMgd2hlbiB0aGUgbmV3IG1lY2hhbmlzbQoJICAgICAgaXMgYWN0aXZlLiBOb3cgaXQgYWxzbyBjaGVjayBmb3IgbG9jYWwgdHlwZW1hcAoJICAgICAgdmFyaWFibGVzLCBzZWUgdmFsdWV3cmFwcGVyX29wYXF1ZS5pIGZvciBhbiBleGFtcGxlIHdoZW4KCSAgICAgIHRoaXMgaXMgbmVlZGVkLiBCdXQgYWdhaW4sIHRoaXMgZXh0cmEgY2hlY2tpbmcgd2lsbCBvbmx5CgkgICAgICBiZSBhY3RpdmF0ZWQgd2hlbiB1c2luZyB0aGUgbmV3IHZhbHVlIHdyYXBwZXIgbW9kZS4KCgkgICAgLSBbUHl0aG9uXSBGaXggdmFyaWFibGUgd3JhcHBpbmcgb2YgY2xhc3NlcyB3aXRoIHByaXZhdGUKCSAgICAgIGFzc2lnbiBvcGVyYXRvcnMuIEl0IHNob3VsZCBiZSBlYXN5IHRvIGZpeCBpbiBhbGwgdGhlIAoJICAgICAgb3RoZXIgbW9kdWxlcywgaW5zdGVhZCBvZiBjaGVja2luZwoKCSAgICAgICAgIGlmICghR2V0YXR0cihuLCJpbW11dGFibGUiKSkgLi4uCgkKCSAgICAgIHlvdSBuZWVkIHRvIHZlcmlmeQoKCSAgICAgICAgIGlmIChpc19hc3NpZ25hYmxlKG4pKSAuLi4KCgkgICAgICBMb29rIGF0IHRoZSBwcml2YXRlX2Fzc2lnbi5pIGZvciBhbiBleGFtcGxlLgoKMTAvMTgvMjAwNDogbW1hdHVzCgkgICAgLSAlZmVhdHVyZXMgImRpcmVjdG9yIi8ibm9kaXJlY3RvciIgbm93IHdvcmsgYXMgZXhwZWN0ZWQuCiAgICAgICAgICAgIC0gR2VuZXJhbCBmaXhlcyBpbiAlZmVhdHVyZSB0byByZXNvbHZlIGZ1bmN0aW9uIGRlY2wKCSAgICAgIHByb3Blcmx5LAoJICAgICAgCgkgICAgICAgICVmZWF0dXJlKCJoZWxsbyIpIGZvbygpOwoJICAgICAgICBjaGFyIGZvbygpIC0+ICBmKCkgICAgLy8gd2FzIHdvcmtpbmcKCSAgICAgICAgY2hhciAqZm9vKCkgLT4gZigpLnAgIC8vIGl0IHdhc24ndAogCgogICAgICAgICAgICAtIFRlbXBsYXRlICsgc3BlY2lhbGl6YXRpb24gKyBkZWZhdWx0IHRlbXBsYXRlIGFyZ3Mgbm93IGlzCgkgICAgICB3b3JraW5nLCAoZG9uJ3QgY29uZnVzZSB3aXRoIHRlbXBsYXRlICsgZGVmYXVsdCBhcmcKCSAgICAgIHZhbHVlcywgdGhhdCB3YXMgc29sdmVkIGJlZm9yZSksIG5vdyB0aGlzIHVnbHkgY2FzZSBpcwoJICAgICAgd29ya2luZzoKCgkgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBBID0gQWxsb2M8VD4gPgoJCXN0cnVjdCBWZWN0b3IKCQl7CgkJICAgVmVjdG9yKFQgYSl7fQoJCX07CQkgICAKCgkJdGVtcGxhdGUgPD4KCQlzdHJ1Y3QgVmVjdG9yPGRvdWJsZT4KCQl7CgkJICBWZWN0b3IoKXt9CgkJICBpbnQgZm9vKCkgeyByZXR1cm4gMDsgfQogICAgICAgICAgICAgICAgfTsKCgkgICAgICAgICV0ZW1wbGF0ZShWX2MpIFZlY3RvcjxjaGFyLCBBbGxvYzxjaGFyPiA+OwoJICAgICAgICAldGVtcGxhdGUoVl9pKSBWZWN0b3I8aW50PjsgICAgLy8gcGlja3MgVmVjdG9yPGludCxBbGxvYzxpbnQ+ID4KCSAgICAgICAgJXRlbXBsYXRlKFZfZCkgVmVjdG9yPGRvdWJsZT47IC8vIHBpY2tzIHRoZSBzcGVjaWFsaXphdGlvbgoJICAgICAgCiAgICAgICAgICAgICAgdGhpcyBpcyBuZWVkZWQgZm9yIGF1dG9tYXRpYyBTVEwgc3VwcG9ydCAobGF0ZXIgd2lsbAogICAgICAgICAgICAgIGJlKS4KCgkgICAgLSBGaXggdGhlIHRlbXBsYXRlICsgdHlwZWRlZiBlcnJvcnMgaW4gdGVzdC1zdWl0ZSwgd2hpY2gKICAgICAgICAgICAgICBwcm9iYWJseSB3aWxsIGZpeCBhbm90aGVyIGdyb3VwIG9mIHN0cmFuZ2UgdGVtcGxhdGUgKwogICAgICAgICAgICAgIG5hbWVzcGFjZXMgKyB0eXBlZGVmcyBlcnJvcnMuCgoJICAgIC0gJXdhcm5maWx0ZXIgaXMgd29ya2luZyBiZXR0ZXIgbm93LCBwYXJzZXIueSB0cmllcyB0byB1c2UKCSAgICAgIHRoZW0gd2hlbiBuZWVkZWQuCgoJICAgIC0gKioqKiBOZXcgZGVmYXVsdCB0eXBlIHJlc29sdXRpb24gbWV0aG9kIChzdHlwZS5jKSAqKioqKiAKCgkgICAgICBJdCBwcmVzZXJ2ZXMgdGhlIG9yaWdpbmFsIG1peGVkIHR5cGVzLCB0aGVuIGl0IGdvZXMKCSAgICAgICdiYWNrd2FyZCcgZmlyc3QgZGVsZXRpbmcgdGhlIHF1YWxpZmllciwgdGhlbiB0aGUgaW5uZXIKCSAgICAgIHR5cGVzLCBmb3IgZXhhbXBsZToKICAgIAkJIAkJCQkJCQkgIAogICAgCQkgdHlwZWRlZiBBICpBcHRyOwkJCQkgIAogICAgCQkgY29uc3QgQXB0ciY7CQkJCQkJCiAgICAJCSByLnEoY29uc3QpLkFwdHIgICAgICAgLT4gci5xKGNvbnN0KS5wLlNXSUdUWVBFCQkKICAgIAkJIHIucShjb25zdCkucC5TV0lHVFlQRSAtPiByLnAuU1dJR1RZUEUJCQkKICAgIAkJIHIucC5TV0lHVFlQRSAgICAgICAgICAtPiByLlNXSUdUWVBFCQkJCiAgICAJCSByLlNXSUdUWVBFICAgICAgICAgICAgLT4gU1dJR1RZUEUJCQkKCQkgCQkJCQkJCQogICAgCQkgZW51bSBIZWxsbyB7fTsJCQkJCQkKICAgIAkJIGNvbnN0IEhlbGxvJiBoaTsJCQkJCQogICAgCQkgci5xKGNvbnN0KS5IZWxsbyAgICAgICAgICAtPiByLnEoY29uc3QpLmVudW0gU1dJR1RZUEUJCiAgICAJCSByLnEoY29uc3QpLmVudW0gU1dJR1RZUEUgIC0+IHIuZW51bSBTV0lHVFlQRQkJCiAgICAJCSByLmVudW0gU1dJR1RZUEUgICAgICAgICAgIC0+IHIuU1dJR1RZUEUJCQogICAgCQkgci5TV0lHVFlQRSAgICAgICAgICAgICAgICAtPiBTV0lHVFlQRQkJCQoJCSAJCQkJCQkJCiAgICAJCSBpbnQgYVsyXVs0XTsJCQkJCQkKICAgIAkJIGEoMikuYSg0KS5pbnQgICAgICAgICAgIC0+IGEoQU5ZKS5hKEFOWSkuU1dJR1RZUEUJCiAgICAJCSBhKEFOWSkuYShBTlkpLlNXSUdUWVBFICAtPiBhKEFOWSkuYSgpLlNXSUdUWVBFCQkKICAgIAkJIGEoQU5ZKS5hKCkuU1dJR1RZUEUgICAgIC0+IGEoQU5ZKS5wLlNXSUdUWVBFCQkKICAgIAkJIGEoQU5ZKS5wLlNXSUdUWVBFICAgICAgIC0+IGEoQU5ZKS5TV0lHVFlQRQkJCiAgICAJCSBhKEFOWSkuU1dJR1RZUEUgICAgICAgICAtPiBhKCkuU1dJR1RZUEUJCQogICAgCQkgYSgpLlNXSUdUWVBFICAgICAgICAgICAgLT4gcC5TV0lHVFlQRQkJCQogICAgCQkgcC5TV0lHVFlQRSAgICAgICAgICAgICAgLT4gU1dJR1RZUEUgICAgICAgICAgICAgICAgICAgIAoKCSAgICAgIGJlZm9yZSBpdCBhbHdheXMgc3RvcHMgYWZ0ZXIgZmluZGluZyByZWYvcG9pbnRlci9lbnVtL2FycmF5L2V0Yy4KCSAgICAgICAKCSAgICAgIE5vdywgdGhlbiwgeW91IGNhbiBkZWZpbmUgKHVzZSBhbmQgYXBwbHkpICdoaWdoZXInIHR5cGVtYXBzIHN1Y2ggYXM6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIFNXSUdUWVBFKiBjb25zdCYgIAoJICAgICAgICAldHlwZW1hcChvdXQpIGNoYXIgRklYU0laRVtBTlldCiAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgU1dJR1RZUEUqIGNvbnN0JiAgCgkgICAgICAgICV0eXBlbWFwKGluKSBjb25zdCBlbnVtIFNXSUdUWVBFJgoJICAgICAgICAldHlwZW1hcChpbikgU1dJR1RZUEVbQU5ZXVtBTlldCgkgICAgICAgICV0eXBlbWFwKGluKSBjb25zdCBjaGFyICgmKVtBTlldCgkgICAgICAgCgkgICAgICBJdCBpcyBwb3NzaWJsZSB3aXRoIHRoaXMgY2hhbmdlIHRoYXQgcHJldmlvdXMgdHlwZW1hcHMKCSAgICAgIHRoYXQgd2VyZSBkZWZpbmVkIChidXQgaWdub3JlZCksIG5vdyB3aWxsIHN0YXJ0IHRvIHdvcmsuCgoJICAgICAgQWxzbywgaXQgaXMgbmVjZXNzYXJ5IGNoZWNrIGZvciB0aGUgJyV0eXBlbWFwKHZhcmluKSBTV0lHVFlQRVtdJywKCSAgICAgIGJlZm9yZSBpdCB3YXMgdXN1YWxseSBub3QgZGVmaW5lZCAoYnV0IGNoYXJbXSB3YXMpLAoJICAgICAgYW5kIHRoYXQgY2FuIHByb2R1Y2Ugc29tZSBpbmNvbnNpc3RlbmNpZXMuCgogICAgICAgICAgICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoJICAgICAgVGhpcyBjaGFuZ2Ugd2FzIG5lZWRlZCBmb3IgU1RMLCBzaW5jZSBzdGQ6OnZlY3RvcjxlbnVtIEhlbGxvPiAKCSAgICAgIHN0ZDo6dmVjdG9yPEEqPiwgZXRjLCB3aWxsIGFsd2F5cyBnZW5lcmF0ZSBtZXRob2RzIHRoYXQKCSAgICAgIG1peCBjb25zdCByZWZlcmVuY2VzIHdpdGggdGhlIHZlY3RvciB0eXBlLgoKCSAgICAgIE5vdyB0aGF0IGlzIHdvcmtpbmcsIGFsbCB0aGUgc3RkOjpjb250YWluZXI8VCo+CgkgICAgICBzcGVjaWFsaXphdGlvbiB3aWxsIG5vdCBiZSBuZWVkZWQgYW55bW9yZSwgd2VsbCwgaW4KCSAgICAgIHRoZW9yeS4gCgoJICAgICAgSW4gdGhlIHByYWN0aWNlLCBldmVyeXRoaW4gaXMgd29ya2luZyBhcyBiZWZvcmUgdW50aWwKCSAgICAgIHRoZSBwcm9wZXIgbWl4ZWQgdHlwZXMgYXJlIGRlZmluZWQgYW5kIHRoZSBsaWJyYXJpZXMKCSAgICAgIHNpbXBsaWZpZWQgdG8gdXNlIHRoZW0uCgoJICAgIC0gQ2hhbmdlIHRoZSBiZWhhdmlvciBvZiBleHRlcm4gImphdmEiLyJmb3J0cmFuIi8iZXRjIiwgCgkgICAgICBub3cgc3dpZyBwcm9kdWNlcyBhIHdhcm5pbmcsIGFuZCB1c2UgZXh0ZXJuICJDIiBpbnN0ZWFkLgoJICAgICAgVGhlIHdhcm5pbmcgY2FuIGFsc28gYmUgZGlzYWJsZSB3aXRoIHRoZSAiLXcgMzEzIiBmbGFnLgoJICAgICAgKFdBUk5fUEFSU0VfVU5ERUZJTkVEX0VYVEVSTikuCgoJICAgIC0gU3dpZ1ZhbHVlV3JhcHBlciBpcyBub3cgbW9yZSBzZWxlY3RpdmUgKGxhbmcuY3h4KS4KCiAgICAgICAgICAgIFtQZXJsL1RjbF0KCSAgICAtIEZpeCBzb21lIHR5cGVtYXBzIChwZXJsL3RjbCkgdG8gd29yayBwcm9wZXJseSB3aXRoCgkgICAgICBTd2lnVmFsdWVXcmFwcGVyLiBUaGlzIHdhcyBub3QgYSBwcm9ibGVtIHdpdGgKCSAgICAgIFN3aWdWYWx1ZVdyYXBwZXIsIGJ1dCB3aXRoIHRoZSB0eXBlbWFwcyB0aGF0IG5vdyBhcmUKCSAgICAgIHNhZmUgdG8gdXNlIHdpdGggJWFwcGx5LgoKCSAgICBbUHl0aG9uXQoKICAgICAgICAgICAgLSBGaXggJWNhbGxiYWNrLyVweXRob25jYWxsYmFjayB3b3JrIG5vdyBhcyBiZWZvcmUgYWZ0ZXIKCSAgICAgIHRoZSBkZWYgYXJncyBjaGFuZ2VzLiBBbHNvLCAlY2FsbGJhY2sgbm93IGlzIGFuIGFsaWFzCgkgICAgICBmb3IgJXB5dGhvbmNhbGxiYWNrLCBzbywgdGhleSBkbyB0aGUgc2FtZS4KCgkgICAgW1B5dGhvbi9SdWJ5XQoJICAgIC0gJWNhbGxiYWNrIGlzIG1vcmUgdXNhYmxlIGFuZCB1bmlmb3JtOgoKICAgICAgICAgICAgICAgICAlY2FsbGJhY2soIiVzX2NiIikgZm9vKCk7ICAvLyBmb3IgYm90aCwgcHl0aG9uL3J1YnkKICAgICAgICAgICAgICAgICAlY2FsbGJhY2soIiVzX2NiIik7ICAgICAgICAvLyBmb3IgYm90aCwgcHl0aG9uL3J1YnkKICAgICAgICAgICAgICAgICAlY2FsbGJhY2soMSkgZm9vKCk7ICAgICAgICAvLyBvbmx5IGluIHB5dGhvbi4KCjEwLzE3LzIwMDQ6IGFydHkKCSAgICBbT0NBTUxdCgkgICAgLSBUd2VhayB0byBlbnVtIHR5cGluZyBmb3Igc291bmRuZXNzIGluIHRoZSBwcmVzZW5jZSBvZiBtdWx0aXBsZQoJICAgICAgbW9kdWxlcy4KCSAgICAtIGdsb2JhbCBmdW5jdGlvbnMgYXJlIG5vdyB1bmFtYmlndW91cyBpbiBtdWx0aXBsZSBsb2FkZWQgbW9kdWxlcy4KCSAgICAtIEZpeGVkIHRlc3QgY2FzZSBjb2RlIHRvIGJ1aWxkIG11bHRpbW9kdWxlIHRlc3QgY2FzZXMgY29ycmVjdGx5LgoJICAgIC0gVGhlcmUgaXMgbm8gd2F5IHRvIHNoYXJlIG92ZXJsb2FkIHJlc29sdXRpb24gYWNyb3NzIG1vZHVsZXMKCSAgICAgIGJlY2F1c2Ugb2Ygc291bmRuZXNzIGlzc3Vlcy4gIElmIHRoZSB1c2VyIHdhbnRzIHRvIGNhbGwgc29tZQoJICAgICAgZnVuY3Rpb24gZm9vIGZyb20gYW4gYXJiaXRyYXJ5IG1vZHVsZSBiYXIsIHRoZXkgd2lsbCBoYXZlIHRvCgkgICAgICB1c2UgQmFyLl9mb28gdG8gY2FsbCBpdCBjb3JyZWN0bHkuICBMYXRlciBJIHdpbGwgZml4IHRoZSAKCSAgICAgIGNhbWxwNCBtb2R1bGUgdG8gZG8gc29tZXRoaW5nIGNsZXZlciBpbiB0aGlzIGNhc2UuICAKICAgICAgICAgICAgLSBQcm9taWRlZCBwZXJmb3JtYW5jZSBvdmVyaGF1bCBvZiBjbGFzcyBtZWNoYW5pc20uCgkgICAgLSBSZW1vdmVkIHN5bWJvbCBoYWNrIGZvciBvY2FtbC0zLjA3IGFuZCBiZWxvdyB3aGljaCBpcyBub3QgbmVlZGVkCgkgICAgICBmb3Igb2NhbWwtMy4wOCBhbmQgYWJvdmUuCgoxMC8xNi8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW0NISUNLRU5dCgkgICAgLSBDb21wbGV0bHkgY2hhbmdlIGhvdyBjaGlja2VuLmN4eCBoYW5kbGVzIENMT1MgYW5kIGdlbmVyaWMgY29kZS4KCSAgICAgIGNoaWNrZW4gbm8gbG9uZ2VyIGV4cG9ydHMgLWNsb3Muc2NtIGFuZCAtZ2VuZXJpYy5zY20uICBUaGUgY2xvcwoJICAgICAgY29kZSBpcyBleHBvcnRlZCBkaXJlY3RseSBpbnRvIHRoZSBtb2R1bGUuc2NtIGZpbGUgaWYgLXByb3h5IGlzIHBhc3NlZC4KCSAgICAtIFRoZSBjb2RlIG5vdyBhbHdheXMgZXhwb3J0cyBhIHVuaXQuICBSdW5uaW5nIHRoZSB0ZXN0LXN1aXRlIGlzIG5vdwoJICAgICAgbWFqb3JseSBicm9rZW4sIGFuZCBuZWVkcyB0byBiZSBmaXhlZC4KCSAgICAtIENMT1Mgbm93IGdlbmVyYXRlcyB2aXJ0dWFsIHNsb3RzIGZvciBtZW1iZXIgdmFyaWFibGVzIHNpbWlsYXIgdG8gaG93CgkgICAgICBHT09QUyBzdXBwb3J0IHdvcmtzIGluIHRoZSBndWlsZSBtb2R1bGUuCgkgICAgLSBjaGlja2VuIG5vIGxvbmdlciBwcmVmaXhlcyBzeW1ib2xzIGJ5IHRoZSBtb2R1bGUgbmFtZSwgYW5kIG5vIGxvbmdlcgoJICAgICAgZm9yY2VzIGFsbCBuYW1lcyB0byBsb3dlciBjYXNlLiAgSXQgbm93IGhhcyAtdXNlY2xhc3NwcmVmaXggYW5kIC1jbG9zcHJlZml4CgkgICAgICBzaW1pbGFyIHRvIGhvdyBndWlsZSBoYW5kbGVzIEdPT1BTIG5hbWVzLgoKMTAvMTYvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgVGVtcGxhdGVkIGZ1bmN0aW9ucyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIHdvcmtpbmcgd2l0aCBuZXcgZGVmYXVsdCBhcmd1bWVudAogICAgICAgICAgICB3cmFwcGluZyBhcHByb2FjaC4gVGhlIG5ldyBhcHByb2FjaCBubyBsb25nZXIgZmFpbHMgd2l0aCB0aGUgZm9sbG93aW5nIGRlZmF1bHQKICAgICAgICAgICAgYXJndW1lbnQgcGF0dGVybiAocHJldmlvdXNseSBmYWlsZWQgd2l0aCBzb21lIHByaW1pdGl2ZSB0eXBlcywgbGlrZSAKICAgICAgICAgICAgdW5zaWduZWQgcHJpbWl0aXZlIHR5cGVzKToKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gaW50IGZvbyhjb25zdCBUJiB1ID0gVCgpKTsKICAgICAgICAgICAgICAldGVtcGxhdGUoZm9vKSBmb288dW5zaWduZWQgaW50PjsKCiAgICAgICAgICAgIFRoaXMgcmVsaWVzIG9uIHRoZSB0ZW1wbGF0ZWQgZnVuY3Rpb24gb3ZlcmxvYWRpbmcgc3VwcG9ydCBqdXN0IGFkZGVkLCBzbyBhbGwKICAgICAgICAgICAgdGhlIGNvbWJpbmF0aW9ucyBvZiBvdmVybG9hZGluZyBieSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGFuZCBub3JtYWwgcGFyYW1ldGVycwogICAgICAgICAgICBhcyB3ZWxsIGFzIG92ZXJsb2FkaW5nIHdpdGggZGVmYXVsdCBwYXJhbWV0ZXJzIHdvcmtzLgoKMTAvMTYvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgdGhlIGxhcmdlIHJhbmdlIG9mIHRlbXBsYXRlZCBmdW5jdGlvbiBvdmVybG9hZGluZyB0aGF0IEMrKwogICAgICAgICAgICBzdXBwb3J0cy4KCiAgICAgICAgICAgIC0gT3ZlcmxvYWRlZCB0ZW1wbGF0ZWQgZnVuY3Rpb25zLCBlZwoKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbnQgb3ZlcmxvYWQoVCB0KTsKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbnQgb3ZlcmxvYWQoVCB0LCBjb25zdCBUICZyKTsKCiAgICAgICAgICAgIC0gRml4ZXMgd2hlcmUgdGhlIHRlbXBsYXRlZCB0eXBlIGlzIG5vdCB1c2VkIGluIHRoZSBwYXJhbWV0ZXIgbGlzdCwgZWcKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCB4eXooKTsKICAgICAgICAgICAgICB0ZW1wbGF0ZTw+IHZvaWQgeHl6PGRvdWJsZT4oKTsKCiAgICAgICAgICAgIC0gRml4ZXMgZm9yIG92ZXJsb2FkaW5nIG9mIHBsYWluIGZ1bmN0aW9ucyBieSBhIHRlbXBsYXRlZCBmdW5jdGlvbjoKCiAgICAgICAgICAgICAgdm9pZCBhYmMoZG91YmxlIGQpOwogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgYWJjKFQgdCk7CgogICAgICAgICAgICAtIE92ZXJsb2FkaW5nIGJ5IHRlbXBsYXRlZCBwYXJhbWV0ZXJzIGZpeGVkOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIGZvbyhUIHQpIHt9CiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4gdm9pZCBmb28oVCB0LCBVIHUpIHt9CgogICAgICAgICAgICAgICV0ZW1wbGF0ZShmb28pIGZvbzxkb3VibGUsIGRvdWJsZT47CgogICAgICAgICAgICAtIEFsbCBjb21iaW5hdGlvbnMgb2YgdGhlIGFib3ZlIGFsc28gd29ya2luZyBpbmNsdWRpbmcgc3BlY2lhbGl6YXRpb25zLCBlZzoKCiAgICAgICAgICAgICAgdm9pZCBhYmMoZG91YmxlIGQpOwogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgYWJjKFQgdCk7CiAgICAgICAgICAgICAgdGVtcGxhdGU8PiB2b2lkIGFiYzxkb3VibGU+KGRvdWJsZSB0KTsKICAgICAgICAgICAgICB0ZW1wbGF0ZTw+IHZvaWQgYWJjKGludCB0KTsKCjEwLzE2LzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICAtIFJlbW92ZSB0aGUgYWJpbGl0eSB0byBzaGFyZSB0eXBlIGluZm9ybWF0aW9uIGJ5IHVzaW5nIGMgbGlua2luZy4KICAgICAgICAgICAgICBBbGwgdHlwZSBzaGFyaW5nIGhhcHBlbnMgdGhyb3VnaCBhIGdsb2JhbCB2YXJpYWJsZSBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLgogICAgICAgICAgICAgICAgKyBSZW1vdmUgU1dJR19OT0lNUE9SVCwgU1dJR19SVU5USU1FLCBhbmQgcmVsYXRlZCBkZWZpbmVzLgogICAgICAgICAgICAgICAgKyBEZXByZWNhdGUgLXJ1bnRpbWUsIC1ub3J1bnRpbWUgY29tbWFuZCBsaW5lIG9wdGlvbnMKICAgICAgICAgICAgICAgICsgVXBkYXRlIHRlc3Qtc3VpdGUgY29tbW9uLm1rIHRvIGNvcnJlY3RseSBidWlsZCBtdWx0aWNwcHRlc3QKICAgICAgICAgICAgICAgICsgUmVtb3ZlIHJlZmVyZW5jZSB0byBwcmVjb21tb24uc3dnCiAgICAgICAgICAgICAgICArIFVwZGF0ZSB0aGUgZ3VpbGVfZ2ggaW50ZXJmYWNlIHRvIHNoYXJlIGRhdGEgYnkgYSBnbG9iYWwgdmFyIGluc3RlYWQKICAgICAgICAgICAgICAgICAgb2YgYyBsaW5rYWdlLgoKICAgICAgICAgICAgLSBSZW1vdmUgQWR2YW5jZWQuaHRtbCwgc2luY2UgZXZlcnl0aGluZyBpbiBpdCBpcyBub3cgb2Jzb2xldGUKCjEwLzA5LzIwMDQ6IG1tYXR1cwoJICAgIC0gU3BsaXQgdGhlIHB5dGhvbiBzdGQvU1RMIEMrKyBsaWJyYXJ5IGZpbGVzLCBub3cKCSAgICAgIGFsbCB0aGUgbGFuZ3VhZ2UgaW5kZXBlbmRlbnQgZGVmaW5pdGlvbnMgYXJlIHVuZGVyCgkgICAgICB0aGUgZGlyZWN0b3J5CgkgICAgICAKCQlMaWIvc3RkCgoJICAgICAgYW5kIGhlbmNlLCBjYW4gYmUgdXNlZCBmcm9tIG90aGVyIGxhbmd1YWdlcy4KCgkgICAgLSBBZGQgbW9yZSBkb2N1bWVudGF0aW9uIHRvIHRoZSBQeXRob24gU1RMLCBhbmQKCSAgICAgIGNsZWFuIHVubmVjZXNzYXJ5IGNvZGUuCgoJICAgIC0gQWRkIGluaXRpYWwgQzk5IGNvbXBsZXggc3VwcG9ydCwgYW5kIHNvbWUgZml4ZXMKCSAgICAgIGZvciBsb25nIGRvdWJsZS4KCjEwLzA4LzIwMDQ6IG1tYXR1cwoJICAgIC0gRml4IHRoZSBTd2lnVmFsdWVXcmFwcGVyIGZvciBvcGFxdWUgdHlwZXMsIG5vdyBpdCBpcyAKCSAgICAgIGFwcGxpZWQgZm9yIG9wYXF1ZSB0ZW1wbGF0ZXMgYW5kIGNsYXNzZXMsIGZvciB3aGljaCB3ZQoJICAgICAgZG9uJ3Qga25vdyBpZiB0aGVyZSBpcyBvciBub3QgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLCBpZQoKICAgICAgICAgICAgICAgICBzdHJ1Y3QgQSB7IAogICAgICAgICAgICAgICAgICAgQShpbnQpOwogICAgICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgICBTdGlsbCwgaWYgeW91IGtub3cgdGhhdCB5b3UgY2xhc3MgaGFzIGEgZGVmYXVsdAogICAgICAgICAgICAgIGNvbnN0cnVjdG9yLCBhbmQgZm9yIHNvbWUgdmVyeSB2ZXJ5IHBhcnRpY3VsYXIgcmVhc29uCiAgICAgICAgICAgICAgeW91IHdhbnQgdG8gYXZvaWQgdGhlIFN3aWdWYWx1ZVdyYXBwZXIsIGFuZCB5b3UgZG9uJ3QKICAgICAgICAgICAgICB3YW50IG9yIGNhbid0IGV4cG9zZSB0aGUgY2xhc3MgdG8gc3dpZywgbm93IHlvdSBjYW4KICAgICAgICAgICAgICBzYXkKCiAgICAgICAgICAgICAgICAgJWZlYXR1cmUoIm5vdmFsdWV3cmFwcGVyIikgQTsgICAgCiAgICAgICAgICAgICAgICAgY2xhc3MgQTsKICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgb3IgdGhlIG90aGVyIHdheSBhcm91bmQsIGlmIHRoZSBjbGFzcyBoYXMgYSBkZWZhdWx0CiAgICAgICAgICAgICAgY29uc3RydWN0b3IsIGJ1dCB5b3Ugd2FudCB0byB1c2UgdGhlIHZhbHVlIHdyYXBwZXIsIHlvdQogICAgICAgICAgICAgIGNhbiBzYXkKCiAgICAgICAgICAgICAgICAgJWZlYXR1cmUoInZhbHVld3JhcHBlciIpIEE7CiAgICAgICAgICAgICAgICAgc3RydWN0IEEgeyAKICAgICAgICAgICAgICAgICAgIEEoKTsKCQkgICAuLi4uCiAgICAgICAgICAgICAgICAgfTsgICAKICAgICAgCgkgICAgLSBGaXggZm9yIGNoYXIgPiAxMjgsIGllCgogICAgICAgICAgICAgICAgY29uc3QgY2hhciB0aWxkZV9hID0gJ1wzNDEnOwoKICAgICAgICAgICAgLSBBZGQgcGF0Y2ggMTA0MTg1OCBmb3IgJGxleHR5cGUsIHdoaWNoIGNhcnJpZXMgdGhlIAogICAgICAgICAgICAgIGxpdGVyYWwgdHlwZSBvZiBhIHN5bWJvbC4gU2VlIGxleHR5cGUuaSBpbiB0aGUKICAgICAgICAgICAgICB0ZXN0LXN1aXRlIGZvciBtb3JlIGRldGFpbHMuCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAKCjEwLzA3LzIwMDQ6IHdzZnVsdG9uCgkgICAge1J1YnksIEphdmFdIEZpeCBkaXJlY3RvciArICdlbXB0eScgdGhyb3dzCgoJCSAgICBzdHJ1Y3QgQSB7CgkJICAgICAgQSgpIHRocm93KCk7CgkJICAgICAgdmlydHVhbCB+QSgpIHRocm93KCk7CgkJICAgICAgaW50IGZvbygpIHRocm93KCk7CgkJICAgIH07CgoKMTAvMDYvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtUQ0xdCiAgICAgICAgICAgIC0gRml4IGJ1ZyByZXBvcnRlZCBieSBXaWxsaWFtIEEuIEhvZmZtYW4gcHJvcGFnYXRpbmcgY2xpZW50ZGF0YQogICAgICAgICAgICBiZXR3ZWVuIG1vZHVsZXMuICBBZGRlZCBjbGllbnRkYXRhX3Byb3AubXVsdGljcHB0ZXN0IHRvIGNoZWNrIGZvcgogICAgICAgICAgICB0aGlzIGJ1Zy4gIFRoZSBmaXggaW52b2x2ZWQgdGhlIGZvbGxvd2luZyBjaGFuZ2VzOgogICAgICAgICAgICAgICAgKyBTd2lnVHlwZV9jbGllbnRkYXRhX2NvbGxlY3QgZG9lcyBub3QgbmVlZCB0byBjaGVjawogICAgICAgICAgICAgICAgdHlwZXMgaW4gcl9yZXNvbHZlZCBiZWNhdXNlIHdlIG9ubHkgd2FudCB0byBwcm9wYWdhdGUgY2xpZW50ZGF0YQogICAgICAgICAgICAgICAgdG8gdHlwZWRlZmVkIGNsYXNzZXMsIGFuZCByX21hbmdsZWQgYWxyZWFkeSB0YWtlcyBjYXJlIG9mIHR5cGVkZWZzLgoKICAgICAgICAgICAgICAgICsgU1dJR19UeXBlUmVnaXN0ZXIgbm93IGNvcGllcyB0aGUgY2xpZW50ZGF0YSBmaWVsZCBjb3JyZWN0bHkKCiAgICAgICAgICAgICAgICArIE1vdmUgU1dJR19HdWlsZV9Qcm9wYWdhdGVDbGllbnREYXRhIGZ1bmN0aW9uIGZyb20gZ3VpbGUgbW9kdWxlCiAgICAgICAgICAgICAgICBpbnRvIGNvbW1vbi5zd2csIGJlY2F1c2Ugd2UgbmVlZCB0byBjYWxsIGl0IGZyb20gYm90aCBndWlsZSBhbmQgdGNsLgoKICAgICAgICAgICAgICAgICsgQWRkIGJhc2VfbmFtZXMgdG8gc3dpZ19jbGFzcyB0byBkZWxheSB0aGUgbG9va3VwIG9mIGJhc2VzLiAgU1dJRwogICAgICAgICAgICAgICAgbm93IGV4cG9ydHMgdGhlIGJhc2UgbmFtZXMgYW5kIG9ubHkgd2hlbiB0aGUgYmFzZSBzd2lnX2NsYXNzIGlzCiAgICAgICAgICAgICAgICBuZWVkZWQgaXMgU1dJR19UeXBlUXVlcnkobmFtZSktPmNsaWVudGRhdGEgbG9va2VkIHVwLgoKICAgICAgICAgICAgLSBjb252ZXJzaW9uX25zX3RlbXBsYXRlIHRlc3RzdWl0ZSB0ZXN0IHdhcyBmYWlsaW5nIGJlY2F1c2UKICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHdyYXBwZWQgY29uc3RydWN0b3IgZnVuY3Rpb24gd2FzIG5vdCBjYWxjdWxhdGVkCiAgICAgICAgICAgIGNvcnJlY3RseSBmb3Igc3RydWN0cy4gIEZpeGVkLgoKMTAvMDYvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgRml4ZXMgZm9yIGRlZmF1bHQgYXJndW1lbnRzIHVzZWQgaW4gZGlyZWN0b3JzIC0gaW4gdmlydHVhbAogICAgICAgICAgICBtZXRob2RzIGFuZCBkaXJlY3RvciBjb25zdHJ1Y3RvcnMuCgoxMC8wNi8yMDA0OiBtbWF0dXMKCSAgICBGaXggdGhlIF9fY3BsdXNwbHVzIG1hY3JvLCBhbmQgYnVnIDEwNDExNzAuCgkgICAgTm93IGl0IGlzIHdvcmtpbmcgYXMgc3VwcG9zZWQsIGllLCB5b3UgY2FuIHNhZmVseSB1c2UKCgkgICAgICAjaWZkZWYgX19jcGx1c3BsdXMKCSAgICAgIC4uLgoJICAgIAoJICAgIGFsbCBvdmVyIHN3aWcsIGluY2x1ZGluZyBpbnNpZGUgJWRlZmluZXMgYW5kICV7ICV9IGJvZGllcy4KCgkgICAgCiAgICAgICAgICAgICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCgkgICAgVGhlIG9sZCB0cmljayBvZiB1c2luZwoKCSAgICAgICNpZiBfX2NwbHVzcGx1cwoKCSAgICBkb2Vzbid0IHdvcmsgYW55IG1vcmUuIFNvLCBpZiB5b3UgaGF2ZSB5b3VyIG93biB0eXBlbWFwcwoJICAgIHVzaW5nIHRoYXQgc3ludGF4LCB5b3Ugd2lsbCBuZWVkIHRvIG1pZ3JhdGUgdGhlbSB0byB1c2UKCSAgICAiI2lmZGVmIF9fY3BsdXNwbHVzIi4KCjEwLzA1LzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICAtIFJlb3JnYW5pemUgaG93IHJ1bnRpbWUgdHlwZSBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgYW5kIHNoYXJlZAoJICAgIGJldHdlZW4gbW9kdWxlcy4gIEZvciBjaGlja2VuIGFuZCBtenNjaGVtZSwgSSByZW1vdmVkCgkgICAgdGhlIGFiaWxpdHkgdG8gdXNlIHJ1bnRpbWUgbGlicmFyaWVzLCB3aGlsZSBwZXJsLCB0Y2wsIHB5dGhvbiwgYW5kCgkgICAgcnVieSBkZWZhdWx0IHRvIHVzaW5nIHRoZSBuZXcgbWV0aG9kIGJ1dCBjYW4gZ28gYmFjayB0byB0aGUgb2xkCgkgICAgbWV0aG9kIGJ5IGRlY2xhcmluZyBTV0lHX0FMTE9XX1JVTlRJTUUuCgoJICAgIC0gbGluZSA1ODIgaW4gbXpzY2hlbWUuY3h4IHdhcyBnZW5lcmF0aW5nIGEgc2VnZmF1bHQgb24gCgkgICAgaW1wb3J0cy5tdWx0aWNwcHRlc3QsIHNvIEkgZml4ZWQgaXQuCgoxMC8wNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlcyBmb3IgJWV4dGVuZCBhbmQgb3ZlcmxvYWRlZCBzdGF0aWMgbWV0aG9kcyB3aXRoIGRlZmF1bHQKICAgICAgICAgICAgYXJndW1lbnRzLgoKMTAvMDUvMjAwNDogbW1hdHVzCgkgICAgLSBbcHl0aG9uXSBGaXggZGlyZWN0b3IgKyBtZXRob2Qgd2l0aCAnZW1wdHknIHRocm93LCBpZQoKCQkgICAgc3RydWN0IEEgewoJCSAgICAgIHZpcnR1YWwgaW50IGZvbygpIHRocm93KCk7CgkJICAgIH07CgkJICAgIAoJICAgICAgb3RoZXIgbGFuZ3VhZ2VzIHNob3VsZCBhbHNvIGVhc3kgdG8gZml4LCBsb29rIGZvcgoJICAgICAgR2V0YXR0cihuLCJ0aHJvdyIpIGluIHB5dGhvbi5jeHguCgoJICAgIC0gRml4IGRpcmVjdG9yICsgZGVzdHJ1Y3RvciB3aXRoICdlbXB0eScgdGhyb3cKCgkJICAgIHN0cnVjdCBBIHsKCQkgICAgICB2aXJ0dWFsIH5BKCkgdGhyb3coKTsKCQkgICAgfTsKCgkgICAgLSBOb3cgU1dJR19GRUFUVVJFUyBwYXJzZSBhbGwgYW5kIHRoZSBzYW1lICBvcHRpb25zIHlvdQogICAgICAgICAgICAgIGNhbiBwYXNzIHRvIHN3aWcgaW4gdGhlIGNvbW1hbmQgbGluZS4KCSAgICAgIAoJICAgIC0gTmV3IGNvbW1hbmQgbGluZSBmbGFnOiAtZmVhdHVyZXMgPGxpc3Q+LCBhcyBpbgoKCSAgICAgICAgc3dpZyAtZmVhdHVyZXMgYXV0b2RvYz0zLGRpcmVjdG9yCgoJICAgICAgaWUsIGFueSBnbG9iYWwgZmVhdHVyZSBjYW4gYmUgaW5pdGlhbGl6ZWQgZnJvbSB0aGUKCSAgICAgIGNvbW1hbmQgbGluZS4gVGhpcyBpcyBtYWlubHkgZm9yIHRlc3RpbmcsIGJ1dCB1c2VycwoJICAgICAgY2FuIGFsc28gdGFrZSBhZHZhbnRhZ2Ugb2YgaXQuCgoxMC8wNC8yMDA0OiBtbWF0dXMKCSAgICAtIFByb3Blcmx5IHF1YWxpZnkgdHlwZSBpbiBzeW50YXggYXMgJ2xvbmcoMiknIG9yICdGb28oKScsCgkgICAgICB0aGlzIHNvbHZlIG9sZCBwcm9ibGVtIHdpdGggZGVmYXVsdCBhcmdzLCBhbmQgcHJvYmFibHkKCSAgICAgIG90aGVyIHByb2JsZW1zIGFyb3VuZC4gSG93ZXZlciwgdGhlIGRlZmF1bHQgYXJnIHByb2JsZW0KCSAgICAgIHdhcyBhbHNvIGFscmVhZHkgc29sdmVkIGJ5IFdpbGxpYW0gKHNlZSBiZWxvdykuCgoJICAgIC0gRml4IGZlYXR1cmVfc2V0IGFuZCBmZWF0dXJlX2dldCBtZXRob2RzLiBCZWZvcmUKCSAgICAgIHRoZXkgbG9vayBmcm9tIHBhcnRpY3VsYXIgdG8gZ2VuZXJhbCBhbmQga2VlcCB0aGUgZmlyc3QKCSAgICAgIGZlYXR1cmUgZm91bmQuIFRoaXMgZGlkbid0IHdvcmsgd2VsbCB3aXRoIHRlbXBsYXRlcy4KCSAgICAgIE5vdyB0aGUgbWV0aG9kcyBsb29rIGZyb20gZ2VuZXJhbCB0byBwYXJ0aWN1bGFyLCBhbmQKCSAgICAgIG92ZXJyaWRlIGFueSBmb3VuZCBmZWF0dXJlLgoKICAgICAgICAgICAgLSBQcmV2aW91c2x5IGEgZmVhdHVyZSBjb3VsZCBub3QgYmUgYXBwbGllZCB0byBjb25zdHJ1Y3RvcnMKICAgICAgICAgICAgICBvciBkZXN0cnVjdG9ycyB0aGF0IHdlcmVuJ3QgZXhwbGljaXRseSBkZWNsYXJlZCBpbiB0aGUgY2xhc3MuCiAgICAgICAgICAgICAgVGhpcyBpcyBub3cgZml4ZWQsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVmZWF0dXJlKCJmZWF0dXJlbmFtZSIpIEZvbygpICIuLi4iCiAgICAgICAgICAgICAgICAlZmVhdHVyZSgiZmVhdHVyZW5hbWUiKSB+Rm9vKCkgIi4uLiIKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIC8vIGltcGxpY2l0IEZvbygpIGFuZCB+Rm9vKCkKICAgICAgICAgICAgICAgIH07CgoJICAgIC0gRml4IG1pc3NpbmcgZmVhdHVyZXMgZm9yIGRlZmF1bHQgY29uc3QvZGVzdCwgYnkgcmVhbGx5CgkgICAgICAnY3JlYXRpbmcnIHRoZSBtZXRob2RzIGFuZCBhcHBseWluZyB0aGUgZmVhdHVyZXMuCgoJICAgIC0gRml4IHJldHVybl9jb25zdF92YWx1ZS5pIGNhc2UgYnkgYWRkaW5nIFN3aWdWYWx1ZVdyYXBwZXI8Y29uc3QgVD4KCSAgICAgIHNwZWNpYWxpemF0aW9uLgoKCSAgICAtIEZpeCAlZXh0ZW5kICsgb3ZlcmxvYWQsIGluY2x1ZGluZyBvdmVybG9hZGluZyBhY3R1YWwKICAgICAgICAgICAgICBjbGFzcyBtZXRob2RzLiAKCgkgICAgLSBBZGRpbmcgbW9yZSBjYXNlcyBpbiByZWxhdGVkIGZpbGVzIGluIHRoZSB0ZXN0LXN1aXRlLiAgCgoxMC8wNC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBDaGFuZ2VzIHRvIHRoZSB3YXkgZGVmYXVsdCBhcmd1bWVudHMgYXJlIHdyYXBwZWQuIFByZXZpb3VzbHkgYSBzaW5nbGUKICAgICAgICAgICAgbWV0aG9kIHdhcyBnZW5lcmF0ZWQgZm9yIGVhY2ggbWV0aG9kIHRoYXQgaGFkIGRlZmF1bHQgYXJndW1lbnRzLiBJZgogICAgICAgICAgICBhIG1ldGhvZCBoYWQgNSBhcmd1bWVudHMsIHNheSwgb2Ygd2hpY2ggMSBoYWQgYSBkZWZhdWx0IGFyZ3VtZW50CiAgICAgICAgICAgIHRoZW4gdGhlIGNhbGwgdG8gdGhlIHdyYXBwZWQgbWV0aG9kIHdvdWxkIHBhc3MgNSBhcmd1bWVudHMuIFRoZSBkZWZhdWx0CiAgICAgICAgICAgIHZhbHVlIHdhcyBjb3BpZWQgaW50byB0aGUgd3JhcHBlciBtZXRob2QgYW5kIHVzZWQgaWYgdGhlIHNjcmlwdGluZwogICAgICAgICAgICBsYW5ndWFnZSBwYXNzZWQganVzdCA0IGFyZ3VtZW50cy4gSG93ZXZlciwgdGhpcyB3YXMgZmxhd2VkIGFzIHRoZQogICAgICAgICAgICBkZWZhdWx0IGFyZ3VtZW50IHNvbWV0aW1lcyBkb2VzIG5vdCBoYXZlIGdsb2JhbCBhY2Nlc3MsIGZvciBleGFtcGxlCiAgICAgICAgICAgIFNXSUcgd291bGQgZ2VuZXJhdGUgY29kZSB0aGF0IGNvdWxkbid0IGNvbXBpbGUgd2hlbiB3cmFwcGluZzoKCiAgICAgICAgICAgICAgY2xhc3MgVHJpY2t5IHsKICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsID0gcHJpdmF0ZXZhbHVlKTsKICAgICAgICAgICAgICAgIHZvaWQgYmFyKGludCB2YWwgPSBUcmlja3k6OmdldERlZmF1bHQoKSk7CiAgICAgICAgICAgICAgcHJpdmF0ZToKICAgICAgICAgICAgICAgIHN0YXRpYyBpbnQgZ2V0RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgZW51bSB7IHByaXZhdGV2YWx1ZSA9IDIwMCB9OwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICBBbHNvIGJ1Z3MgaW4gcmVzb2x2aW5nIHN5bWJvbHMgZ2VuZXJhdGVkIGNvZGUgdGhhdCB3b3VsZG4ndCBjb21waWxlLCBmb3IgZXhhbXBsZQogICAgICAgICAgICAocHJvYmFibHkgZml4YWJsZSB0aG91Z2gpOgoKICAgICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2UgewogICAgICAgICAgICAgICAgY2xhc3MgS2xhc3MgewogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIEtsYXNzIGNvbnN0cnVjdG9yY2FsbChjb25zdCBLbGFzcyYgayA9IEtsYXNzKCkpOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoZSBhcHByb2FjaCBhbHNvIGRvZXMgbm90IHdvcmsgZm9yIHN0YXRpY2FsbHkgdHlwZWQgbGFuZ3VhZ2VzIChDIyBhbmQgSmF2YSkKICAgICAgICAgICAgYXMgdGhlc2UgbGFuZ3VhZ2VzIGRvIG5vdCBhbGxvdyBtZXRob2RzIHRvIGhhdmUgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KICAgICAgICAgICAgQWx0aG91Z2ggQyMgaGFzIGEgbWVjaGFuaXNtIHRvIHBhc3MgYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzIHRoZXkKICAgICAgICAgICAgbXVzdCBiZSBvZiB0aGUgc2FtZSB0eXBlIGFuZCBhcmUgbW9yZSBsaWtlIHZhcmFyZ3MuCgogICAgICAgICAgICBUaGUgbmV3IGFwcHJvYWNoIHNvbHZlcyB0aGUgYWJvdmUgcHJvYmxlbXMgYW5kIHdyYXBzIG1ldGhvZHMgd2l0aCBkZWZhdWx0CiAgICAgICAgICAgIGFyZ3VtZW50cyBhcyBpZiB0aGUgbWV0aG9kIHdhcyBvdmVybG9hZGVkLiBTbyBTV0lHIHdpbGwgbm93IHRyZWF0CgogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWw9MCk7CgogICAgICAgICAgICBhcyBpZiBpdCBoYWQgcGFyc2VkOgoKICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQpOwogICAgICAgICAgICAgIHZvaWQgZm9vKCk7CgogICAgICAgICAgICBUaGUgY29kZSBnZW5lcmF0ZWQgaXMgdGhlbiBleGFjdGx5IHRoZSBzYW1lIGFzIGlmIFNXSUcgaGFkIHBhcnNlZCB0aGUgdHdvCiAgICAgICAgICAgIG92ZXJsb2FkZWQgbWV0aG9kcy4gVGhlIHNjcmlwdGluZyBsYW5ndWFnZXMgY291bnQgdGhlIGFyZ3VtZW50cyBwYXNzZWQgYW5kIGNhbGwKICAgICAgICAgICAgdGhlIGFwcHJvcHJpYXRlIG1ldGhvZCwganVzdCBsaWtlIG92ZXJsb2FkZWQgbWV0aG9kcy4gQyMgYW5kIEphdmEgYXJlIG5vdyBhYmxlCiAgICAgICAgICAgIHRvIHByb3Blcmx5IHdyYXAgbWV0aG9kcyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIGJ5IGdlbmVyYXRpbmcgZXh0cmEgbWV0aG9kcywKICAgICAgICAgICAgYWdhaW4gYXMgaWYgdGhlIG1ldGhvZCB3YXMgb3ZlcmxvYWRlZCwgc28gZm9yOgoKICAgICAgICAgICAgICB2b2lkIGJhcihzdHJpbmcgcz0iaGVsbG8iLCBkb3VibGUgZD0xMC4wLCBpbnQgaT0wKTsKCiAgICAgICAgICAgIHRoZSBmb2xsb3dpbmcgcHJveHkgbWV0aG9kcyBhcmUgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgICB2b2lkIGJhcihzdHJpbmcgcywgZG91YmxlIGQsIGludCBpKTsKICAgICAgICAgICAgICB2b2lkIGJhcihzdHJpbmcgcywgZG91YmxlIGQpOwogICAgICAgICAgICAgIHZvaWQgYmFyKHN0cmluZyBzKTsKICAgICAgICAgICAgICB2b2lkIGJhcigpOwoKICAgICAgICAgICAgVGhlIG5ldyBhcHByb2FjaCBjb21lcyB3aXRoIGEgY291cGxlIG9mIG1pbm9yIGtub2NrIG9uIGVmZmVjdHMuCgogICAgICAgICAgICAxKSBTV0lHIHN1cHBvcnQgZm9yIGRlZmF1bHQgYXJndW1lbnRzIGZvciBDIChub3QgQysrKSBjb2RlIG5vIGxvbmdlciB3b3Jrcy4KICAgICAgICAgICAgUHJldmlvdXNseSB5b3UgY291bGQgaGF2ZSB0aGlzIGludGVyZmFjZToKCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsKTsKICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWw9MCk7CgogICAgICAgICAgICBhbmQgY2FsbCB0aGUgd3JhcHBlZCBtZXRob2QgZnJvbSBhIHNjcmlwdGluZyBsYW5ndWFnZSBhbmQgcGFzcyBubyBhcmd1bWVudHMKICAgICAgICAgICAgd2hlcmV1cG9uIHRoZSBkZWZhdWx0IG9mIDAgd2FzIHVzZWQuIFlvdSBjYW4gZ2V0IHRoZSBzYW1lIGJlaGF2aW91ciBmb3IgQwogICAgICAgICAgICBjb2RlIGJ5IHVzaW5nIHRoZSAiZGVmYXVsdCIgdHlwZW1hcDoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoZGVmYXVsdCkgaW50IHZhbCAiJDEgPSAwOyIKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWwpOwogICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbCk7CgogICAgICAgICAgICBvciB5b3UgY291bGQgb2YgY291cnNlIGNvbXBpbGUgeW91ciBjb2RlIGFzIEMrKyBpZiB5b3Ugd2FudCBDKysgZmVhdHVyZXMgOikgOgoKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWw9MCk7CiAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsPTApOwoKICAgICAgICAgICAgQSBjb3VwbGUgb2YgU1dJRydzIGxpYnJhcmllcyB1c2VkIHRoaXMgQyBleHRlbnNpb24gYW5kIHRoZXNlIGhhdmUgYmVlbiBtb2RpZmllZAogICAgICAgICAgICB0byB1c2UgdGhlICJkZWZhdWx0IiB0eXBlbWFwLiBUaGUgImRlZmF1bHQiIHR5cGVtYXAgaXMgdGh1cyB1bmNoYW5nZWQgKGFuZCBzdGlsbAogICAgICAgICAgICBpcyBub3QgYW5kIGlzIG5vdCBmdWxseSBzdXBwb3J0ZWQgYnkgQyMgYW5kIEphdmEsIGFuZCBpcyBsaWtlbHkgdG8gcmVtYWluIHNvKS4KCgogICAgICAgICAgICAyKSBBbGwgZmVhdHVyZXMgKCVmZWF0dXJlLCAlcmVuYW1lLCAlaWdub3JlIGV0Yykgbm8gbG9uZ2VyIHdvcmsgYXMgaWYgdGhlIG1ldGhvZAogICAgICAgICAgICB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIGlzIGp1c3Qgb25lIG1ldGhvZC4gRm9yIGV4YW1wbGUsIHByZXZpb3VzbHkKCiAgICAgICAgICAgICAgJWlnbm9yZSBmb28oaW50KTsKCiAgICAgICAgICAgIHdvdWxkIGhhdmUgaWdub3JlZCB0aGUgbWV0aG9kIGNvbXBsZXRlbHkuIE5vdyBpdCB3aWxsIG9ubHkgaWdub3JlIGZvbyhpbnQpIGJ1dAogICAgICAgICAgICBub3QgdGhlIGV4dHJhIGZvbygpIG1ldGhvZC4gSW5zdGVhZCB1c2U6CgogICAgICAgICAgICAgICVpZ25vcmUgZm9vOwoKICAgICAgICAgICAgdG8gaWdub3JlIHRoZW0gYWxsLiBvcgoKICAgICAgICAgICAgICAlaWdub3JlIGZvbyhpbnQpOwogICAgICAgICAgICAgICVpZ25vcmUgZm9vKCk7CgogICAgICAgICAgICBUaGlzIG9mIGNvdXJzZSBhbGxvd3Mgb25lIHRvIGZpbmUgdHVuZSB0aGUgd3JhcHBpbmcsIGZvciBleGFtcGxlIG9uZSBjb3VsZCB1c2U6CgogICAgICAgICAgICAgICVyZW5hbWUoZm9vaW50KSBmb28oaW50KTsKICAgICAgICAgICAgICAlcmVuYW1lKGZvb2RlZmF1bHRzKSBmb28oKTsKICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsPTApOwoKICAgICAgICAgICAgYW5kIGNhbGwgdGhlbSBmcm9tIGFueSBsYW5ndWFnZSBsaWtlIHNvOgoKICAgICAgICAgICAgICBmb29pbnQoMjAwKQogICAgICAgICAgICAgIGZvb2RlZmF1bHRzKCkKCiAgICAgICAgICAgIG9yIGZvciBleGFtcGxlIGlnbm9yZSB0aGUgZXh0cmEgb3ZlcmxvYWRlZCBtZXRob2QsIHNvIHRoZSBkZWZhdWx0cyBjYW5ub3QgYmUgdXNlZDoKCiAgICAgICAgICAgICAgJWlnbm9yZSBmb28oKTsKICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsPTApOwoKICAgICAgICAgICAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTAvMi8yMDA0OiBtbWF0dXMKCSAgIFtQeXRob25dCgkgICAtIE1vcmUgY2xlYW5pbmcgdXAgYW5kIHVuaWZvcm1hdGlvbiBvbiB0aGUgUHl0aG9uIExpYgoKCSAgIC0gQWRkZWQgUm9iaW4ncyBkb2NzdHJpbmcgcGF0Y2gsIHBsdXMgc29tZSBmaXhlcywgcGx1cwoJICAgICBzb21lIGV4dGVuc2lvbnMsIHNlZSBhdXRvZG9jLmkgZXhhbXBsZSBpbiB0aGUgdGVzdC1zdWl0ZSwKCSAgICAgYW5kIHRyeSB1c2luZyAlZmVhdHVyZSgiYXV0b2RvYyIsImV4dGVuZGVkIikuCgkgICAgCgkgICAgIFRoaXMgcGF0Y2ggaXMgbm90IGEgY29tcGxldGUgc29sdXRpb24gZm9yIHRoZQoJICAgICBkb2N1bWVudGF0aW9uIHByb2JsZW0sIGp1c3QgZW5vdWdoIHRvIGluZm9ybSBweXRob24gYWJvdXQKCSAgICAgdGhlIHBhcmFtZXRlciBsaXN0LgoKCSAgICAgVGhlIGV4cGVjdGVkIHN3aWcgZG9jdW1lbnRhdGlvbiBzdXBwb3J0IGlzIGZhciBmYXIgYXdheSB5ZXQuCgkgICAgIAoKMTAvMS8yMDA0OiBtbWF0dXMKCSAgIC0gRml4IHRoZSAlY2FsbGJhY2sgZmVhdHVyZSAob25seSB1c2VkIGluIHJ1YnkgYW5kIHB5dGhvbiBleGFtcGxlcywKCSAgICAgYnkgbm93LCBidXQgaXQgc2hvdWxkIGJlIGdlbmVyaWMpLCBub3cgbWVtYmVyIGNhbGxiYWNrcwoJICAgICBhcmUgd29ya2luZyBhZ2FpbgoJICAgICAKCSAgIC0gRml4IHdyYXBwaW5nIG9mIGZ1bmN0aW9ucyBwb2ludGVycyBsaWtlCgoJCSBzdGQ6Om9zdHJlYW0mIHN0ZDo6ZW5kbChzdGQ6Om9zdHJlYW0mKTsKCgkgICAgIGllLCB0aGUgb25lcyB0aGF0IHJldHVybiByZWZlcmVuY2VzIG9yIGVudW1zLgoJIAoJICAgW1B5dGhvbl0gQWRkIHRoZSAlcHl0aG9uY2FsbGJhY2sgZGlyZWN0aXZlLCB3aGljaCBpcyAKCSAgIGFuIGltcHJvdmVkIHZlcnNpb24gb2YgJWNhbGxiYWNrLCBpZSwKCgkgICAgICVweXRob25jYWxsYmFjaygxKSBmb287CgkgICAgICVweXRob25jYWxsYmFjaygxKSBBOjpiYXI7CgkgICAgICVweXRob25jYWxsYmFjaygxKSBBOjpiYXJtOwoKCSAgICAgaW50IGZvbyhpbnQgYSkgewoJICAgICAgICAgcmV0dXJuIGE7CgkgICAgIH0KICAKCSAgICAgc3RydWN0IEEgCgkgICAgIHsKCSAgICAgICBzdGF0aWMgaW50IGJhcihpbnQgYSk7CgkgICAgICAgaW50IGJhcm0oaW50IGEpOwoKCSAgICAgfTsKCiAgICAgICAgICAgICBpbnQgZm9vYmFyKGludCBhLCBpbnQgKCpwZikoaW50IGEpKTsKCgkgICBpbiBweXRob24geW91IGNhbiB1c2UKCiAgICAgICAgICAgICBmb28oMikKCSAgICAgZm9vYmFyKDIsZm9vKQogICAgICAgICAgICAgQS5iYXIoMikKCSAgICAgZm9vYmFyKDIsQS5iYXIpCiAgICAgICAgICAKICAgICAgICAgICBpZSwgbm8gYWRkaXRpb25hbCBwb2ludGVyIGVsZW1lbnRzIGFyZSBjcmVhdGVkLCBhbmQKCSAgIHRoZSBvcmlnaW5hbCAnZm9vJyBhbmQgJ0EuYmFyJyBjYW4gYmUgdXNlZCBhcyBwYXJhbWV0ZXJzLgoKCSAgIEluIHRoZSBjYXNlIG9mIG1lbWJlciBmdW5jdGlvbiBob3dldmVyLCBzdGlsbCB5b3UgbmVlZAoJICAgdG8gdXNlIHRoZSBzcGVjaWFsIHZhcmlhYmxlIENsYXNzOjo8Zm5jX25hbWU+X2NiX3B0ciwgaWU6CgogCSAgICAgZm9vYmFybSgzLCBhLCBBLmJhcm1fY2JfcHRyKQoJICAgCgkgICB3ZSB3aWxsIHRyeSB0byBmaXggdGhpcyBzaXR1YXRpb24gYWxzbywgYnV0IGxhdGVyLiAgCgoJICAgW1B5dGhvbl0gQWRkIG1vcmUgZWxlbWVudHMgZnJvbSB0aGUgU1RMIGxpYnJhcnksIG5vdwoJICAgeW91IGNhbiB1c2UKCgkgICAgIGltcG9ydCBzdGQKCSAgICAgc3RkLmNvdXQgPDwgImhlbGxvICIgPDwgMTIzIDw8IHN0ZC5lbmRsCgoJICAgW1B5dGhvbl0gRml4IGluL291dCByZXR1cm4gbWVjaGFuaXNtLCBub3cgc3dpZyB3aWxsIGJlaGF2ZQoJICAgYXMgMS4zLjIxIGJ1dCB1c2luZyBhIHB5dGhvbiBsaXN0IHdoZW4gbmVlZGVkLiBUaGUgcHJvYmxlbQoJICAgaXMgdGhhdCB0aGUgdHlwZXMgc3RkOjpwYWlyLHN0ZDo6dmVjdG9yLGV0YywgdXNlIHR1cGxlcywKCSAgIGFuZCB0aGV5IGludGVyZmVyIHdpdGggdGhlIHByZXZpb3VzIGlub3V0IHR1cGxlIHR5cGUuCgoJICAgQnkgdXNpbmcgbGlzdHMgd2Ugc29sdmUgdGhlIGNvbmZsaWN0cywgc3dpZyBhY3RzIGFzIGJlZm9yZSwKCSAgIGJ1dCByZXR1cm5zIGEgbGlzdCB3aGVuIG1vcmUgdGhhbiBvbmUgcGFyYW1ldGVyIGFyZSB1c2luZwoJICAgdGhlIE9VVCB0eXBlbWFwLiBTZWUgdGhlIG5ldyBpbm91dC5pIGV4YW1wbGUgaW4gdGhlCgkgICB0ZXN0LXN1aXRlLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIFBZVEhPTiBNT0RVTEUgKioqCgkJICAgCiAgICAgICAgICAgW1B5dGhvbl0gTXVjaCBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMgZm9yIGJhZCBhcmd1bWVudHMsIG5vdwoJICAgeW91IGFsd2F5cyBnZXQgdGhlIGFyZ3VtZW50IG51bWJlciB3aGVyZSB0aGUgZXJyb3Igb2NjdXJyZWQuCgowOS8yNy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCBmcm9tIEJpbGwgQ2xhcmtlIC0KICAgICAgICAgICAgMSkgV2FybmluZyBlbWl0dGVkIHdoZW4gLWltcG9ydGFsbCBhbmQgLWluY2x1ZGVhbGwgaXMgdXNlZCB0b2dldGhlciwKICAgICAgICAgICAgICAgd2l0aCAtaW5jbHVkZWFsbCB0YWtpbmcgcHJlY2VkZW5jZS4KICAgICAgICAgICAgMikgRW5zdXJlIFNXSUdJTVBPUlRFRCBpcyBhbHdheXMgZGVmaW5lZCB3aGVuIGEgZmlsZSBpcyBiZWluZwogICAgICAgICAgICAgICBpbXBvcnRlZCB3aXRoICVpbXBvcnQuIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCB0aGUgc2FtZSBhcyBTV0lHSU1QT1JULAogICAgICAgICAgICAgICB3aGljaCBnZXRzIGRlZmluZWQgaW4gYWxsIGdlbmVyYXRlZCB3cmFwcGVyIGZpbGVzLgoKMDkvMjYvMjAwNDogbW1hdHVzCgoJICAgIC0gYWRkICVmZWF0dXJlKCJleGNlcHRpb25jbGFzcyIpIHRvIGlkZW50aWZ5IGEgY2xhc3MgdXNlZAoJICAgICAgYXMgZXhjZXB0aW9uLiBCZWZvcmUgc3dpZyBpZGVudGlmaWVkIGFuZCBtYXJrZWQgYSBjbGFzcwoJICAgICAgdXNpbmcgdGhlICJjcGx1czpleGNlcHRpb25jbGFzcyIgYXR0cmlidXRlLiBIb3dldmVyLCB0aGUKCSAgICAgIGNsYXNzIG5lZWRlZCB0byBhcHBlYXIgb24gYW4gdGhyb3coKSBzdGF0ZW1lbnQuICBOb3cKCSAgICAgIHN3aWcga2VlcHMgdHJ5aW5nIHRvIGlkZW50aWZ5IHRoZSBleGNlcHRpb24gY2xhc3NlcywgYXMKCSAgICAgIGJlZm9yZSwgYnV0IGl0IGFsc28gYWxsb3dzIHRoZSB1c2VyIHRvIG1hcmsgYSBjbGFzcyBieQoJICAgICAgdXNpbmcgdGhlICVmZWF0dXJlIGV4cGxpY2l0bHkuIChtb3N0bHkgcmVsZXZhbnQgZm9yCgkgICAgICBweXRob24gYW5kIGNoaWNrZW4pCgoJICAgIFtQeXRob25dCgoJICAgIC0gZml4IC1tb2Rlcm4gb3B0aW9uICsgZXhjZXB0aW9ucywgd2hpY2ggbWl4IG9sZCBjbGFzcwoJICAgICAgc3R5bGUgd2l0aCB0aGUgbmV3IG9uZS4gU28sIHdlIGFsd2F5cyBuZWVkIHRvIGVtaXQKCSAgICAgIHRoZSAibm9ubW9kZXJuIiBweXRob24gY29kZS4KCgkgICAgLSBhZGQgdGhlICJweXRob246bm9uZHluYW1pYyIgZmVhdHVyZSBhbmQgaXRzIGhhbmRsZXIKCgkgICAgICBub3cgaWYgeW91IGhhdmUKCSAgICAgIAoJICAgICAgJXB5dGhvbm5vbmR5bmFtaWMgQTsKCSAgICAgIAoJICAgICAgc3RydWN0IEEgewoJICAgICAgIGludCBhOwoJICAgICAgIGludCBiOwoJICAgICAgfTsKCgkgICAgICB0aGVuLCBpbiB0aGUgcHl0aG9uIHNpZGUKCSAgICAgIAoJICAgICAgYWEgPSBBKCkKCSAgICAgIAoJICAgICAgYWEuYSA9IDEgIyBvawoJICAgICAgYWEuYiA9IDIgIyBvawoJICAgICAgYWEuYyA9IDMgIyBlcnJvciwgdGhlIGNsYXNzIGNhbiBub3QgYmUgZXh0ZW5kZWQgZHluYW1pY2FsbHkuCgoJICAgIAoJICAgIFNpbmNlIHRoaXMgaXMgYSBmZWF0dXJlLCB5b3UgY2FuIHVzZQoKCSAgICAgICVweXRob25ub25keW5hbWljOwoKICAgICAgICAgICAgb3IgCgoJICAgICAgJXB5dGhvbmR5bmFtaWM7IFsgTm90ZTogJXB5dGhvbmR5bmFtaWMgc2luY2UgZGVwcmVjYXRlZCBdCiAgIAoJICAgIHRvIGZvcmNlIGFsbCB0aGUgd3JhcHBlZCBjbGFzc2VzIHRvIGJlICJub25keW5hbWljIiBvbmVzLgoKCSAgICBUaGUgZGVmYXVsdCwgYXMgaW4gcmVndWxhciBweXRob24sIGlzIHRoYXQgYWxsIHRoZSB3cmFwcGVkCgkgICAgY2xhc3NlcyBhcmUgZHluYW1pY3MuIFNvLCBjYXJlZnVsIHdpdGggeW91ciBzcGVsbGluZy4KCjA5LzE0LzIwMDQ6IG1tYXR1cyAKCSAgICAtIFN1cHBvcnQgdGhlIC1JLSBvcHRpb24uCgoJICAgIC0gRGlmZmVyZW50aWF0ZSBiZXR3ZWVuICVpbmNsdWRlIDxmaWxlPiBhbmQgJWluY2x1ZGUgImZpbGUiLgoJICAgICAgVGhpcyBmaXggc2V2ZXJhbCBjb3JuZXIgY2FzZXMuCgoJICAgIAoJICAgIFtQeXRob25dIFNldmVyYWwgcGF0Y2hlczoKCgkgICAgLSBOb3JtYWxpemUgdGhlIExpYiBmaWxlIG5hbWVzOiAKCQkqLnN3ZyBpbnRlcm5hbCBmaWxlcywgCgkJKi5pICAgdXNlciBmaWxlcy4KCgkgICAgLSBGaXggQ2hhcltBTlldIHR5cGVtYXBzLCBzbyB0aGV5IGFsc28gZGVsZXRlIGFueSBleHRyYSAnXDAnIGNoYXJzLAoJICAgICAgbm93IHRoZXkgYmVoYXZlIGFzIGJlZm9yZSAoMS4zLjIxKS4gU3RpbGwsIHlvdSBjYW4gdXNlCgkgICAgICB0aGUgU1dJR19QUkVTRVJWRV9DQVJSQVlfU0laRSBtYWNybyBpZiB5b3UgbmVlZCB0bwoJICAgICAgcHJlc2VydmUgdGhlIG9yaWdpbmFsIHNpemUgKHNlZSBweXN0cmJhc2Uuc3dnKS4KCgkgICAgLSBBZGQgdGhlIENoYXIgRklYU0laRVtBTlldIHR5cGVtYXBzLCB0byBwcmVzZXJ2ZSB0aGUKICAgICAgICAgICAgICBvcmlnaW5hbCBDIGFycmF5IHNpemVzIChzZWUgYWJvdmUpLiBUaG91Z2gsIHlvdSBjYW4ndAogICAgICAgICAgICAgIHVzZSB0aGVtIHlldCBzaW5jZSAlYXBwbHkgYW5kIGFycmF5cyBhcmUgbm90IHdvcmtpbmcKICAgICAgICAgICAgICB0b2dldGhlci4KCiAgICAgICAgICAgIC0gQWRkIHB5ZnJhZ21lbnRzLnN3Zywgbm93IHRoZSB1c2VyIGNhbiBhZGQgZnJhZ21lbnRzCgkgICAgICB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBvbmVzLgoKMDkvMTAvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggZnJvbSBCaWxsIENsYXJrZSB3aGljaCBmaXhlcyBzcHVyaW91cyBwcmVwcm9jZXNzb3IgYnVnIHdoaWNoCiAgICAgICAgICAgIHNob3dzIG9uIFNvbGFyaXMgYW5kIGdjYywgZWc6CiAgICAgICAgICAgICAgICBXYXJuaW5nKDIwMik6IENvdWxkIG5vdCBldmFsdWF0ZSAnIWRlZmluZWQoU1dJR0pBVkEpICYmCiAgICAgICAgICAgICAgICAhKGRlZmluZWQoU1dJR0NTSEFSUCknCiAgICAgICAgICAgIEFsc28gZml4ZXMgYSBidWcgd2hlcmUgJyNpZiAiYSIgPT0gImIiID09IDEnIHdvdWxkbid0IGhhdmUgd29ya2VkIAoKMDkvMTAvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUmVzdG9yZWQgbXVsdGlwbGUgYnVpbGQgZGlyZWN0b3JpZXMgZm9yIHRoZSB0ZXN0LXN1aXRlLiBQYXRjaCBmcm9tCiAgICAgICAgICAgIEJpbGwgQ2xhcmtlLgoKMDkvMDYvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgQWRkZWQgdGhlIG1pc3NpbmcgcnVudGltZS5kc3AgVmlzdWFsIFN0dWRpbyBwcm9qZWN0IGZpbGVzIGZvciB0aGUKICAgICAgICAgICAgaW1wb3J0IGV4YW1wbGVzIHRvIHdvcmsuCgoKVmVyc2lvbiAxLjMuMjIgKFNlcHRlbWJlciA0LCAyMDA0KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowOS8wMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBUaGUgc3dpZy5tNCBtYWNybyBmb3IgdXNlIHdpdGggdGhlIEF1dG9jb25mL0F1dG9tYWtlL0xpYnRvb2wgaGFzCiAgICAgICAgICAgIGJlZW4gcmVtb3ZlZCBhbmQgaXMgbm8gbG9uZ2VyIGluc3RhbGxlZC4gUGxlYXNlIHVzZSB0aGUgbmV3IGFuZCBiZXR0ZXIKICAgICAgICAgICAgbWFpbnRhaW5lZCB2ZXJzaW9uIGRlcml2ZWQgZnJvbSBzd2lnLm00IGluIHRoZSBBdXRvY29uZiBtYWNybyBhcmNoaXZlLgogICAgICAgICAgICBTZWUgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2FjLWFyY2hpdmUvaHRtbGRvYy9hY19wa2dfc3dpZy5odG1sIGFuZAogICAgICAgICAgICBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYWMtYXJjaGl2ZS9odG1sZG9jL2FjX3B5dGhvbl9kZXZlbC5odG1sLgoKMDkvMDEvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIEFwcGxpZWQgcGF0Y2ggIzEwMTk2NjkgZnJvbSBDaHJpc3RvcGggRmxhbW0uIEFkZHMgc3VwcG9ydAogICAgICAgICAgICBmb3IgJWZlYXR1cmUoInNoYWRvdyIpIGluIHRoZSBzYW1lIHdheSBhcyBpdCB3b3JrcyBpbiBQeXRob24uIFRoaXMKICAgICAgICAgICAgZW5hYmxlcyBvbmUgdG8gb3ZlcnJpZGUgdGhlIGdlbmVyYXRlZCBzaGFkb3cvcHJveHkgbWV0aG9kcywgaW5jbHVkaW5nCiAgICAgICAgICAgIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAvKiBMZXQncyBtYWtlIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgY2xhc3MgU3F1YXJlIG1vcmUgdmVyYm9zZSAqLwoKICAgICAgICAgICAgICAlZmVhdHVyZSgic2hhZG93IikgU3F1YXJlKGRvdWJsZSB3KQogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgICBzdWIgbmV3IHsKICAgICAgICAgICAgICAgICAgbXkgJHBrZyA9IHNoaWZ0OwogICAgICAgICAgICAgICAgICBteSAkc2VsZiA9IGV4YW1wbGVjOjpuZXdfU3F1YXJlKEBfKTsKICAgICAgICAgICAgICAgICAgcHJpbnQgU1RERVJSICJDb25zdHJ1Y3RlZCBhbiBAe1tyZWYoJHNlbGYpXX1cbiI7CiAgICAgICAgICAgICAgICAgIGJsZXNzICRzZWxmLCAkcGtnIGlmIGRlZmluZWQoJHNlbGYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICV9CgogICAgICAgICAgICAgIGNsYXNzIFNxdWFyZSB7CiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgU3F1YXJlKGRvdWJsZSB3KTsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH07CgowOC8zMS8yMDA0OiBtbWF0dXMgCgkgICAgW1B5dGhvbl0gSW5jb21wYXRpYmlsaXR5IHJlcG9ydGVkIGJ5IEJpbGwgQ2xhcmtlIChsbGliQGNvbXB1dGVyLm9yZyk6CgkgICAgCgkgICAgSWYgeW91IGFyZSB1c2luZyBTdW4gU3R1ZGlvIDggKGFuZCBwb3NzaWJseSBlYXJsaWVyCgkgICAgdmVyc2lvbnMpIHRvIGNvbXBpbGUgdGhlIG91dHB1dCBwcm9kdWNlZCBieSBzd2lnCgkgICAgMS4zLjIycmMxLCBhbmQgeW91IGFyZSB1c2luZyBDKysgYW5kIFNUTCB0ZW1wbGF0ZXMgdGhlbgoJICAgIHlvdSBuZWVkIHRvIHVzZSBlaXRoZXIgIi1ydW50aW1lIiBvciAiLW5vcnVudGltZSIuICBJZiB5b3UKCSAgICB1c2UgbmVpdGhlciBvZiB0aGVzZSBvcHRpb25zIHRoZW4geW91IHdpbGwgcHJvYmFibHkgZ2V0CgkgICAgY29tcGlsZXIgZXJyb3JzIHdoZW4gdHJ5aW5nIHRvIGNvbXBpbGUgdGhlIHdyYXBwZXIgZmlsZTsKCSAgICB0aGUgZXJyb3IgbWVzc2FnZSB3aWxsIGJlIGxpa2UgdGhpczogVGhlIG5hbWUKCSAgICBTV0lHX1B5dGhvbl9Db252ZXJ0UHRyWy4uLl0gaXMgdW51c2FibGUgaW4gc3RhdGljCgkgICAgc3dpZ3B5Ojp0cmFpdHNfYXNwdHJbLi4uXSAgSWYgeW91IGdldCB0aGlzIGVycm9yIG1lc3NhZ2UsCgkgICAgeW91IG5lZWQgdG8gcmVnZW5lcmF0ZSB5b3VyIHdyYXBwZXIgZmlsZSB1c2luZyAnc3dpZwoJICAgIC1ydW50aW1lJyBvciAnc3dpZyAtbm9ydW50aW1lJy4KCgkgICAgWW91IHNob3VsZG4ndCBnZXQgdGhpcyBwcm9ibGVtIHdpdGggU3VuIFN0dWRpbyA5LgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIFBZVEhPTiBNT0RVTEUgKioqCgkgICAgCjA4LzI2LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBBcHBsaWVkICM5MzIzMzMgZnJvbSBJa2VnYW1pIFRzdXRvbXUuIEZpeGVzIGxvbmcgbG9uZyAqT1VUUFVUCiAgICAgICAgICAgIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcgKk9VVFBVVCB0eXBlbWFwcyBpbiB0eXBlbWFwcy5pLgoKMDgvMjYvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgQXBwbGllZCBwYXRjaCAjODU3MzQ0IGZyb20gQXJ0IFllcmtlcy4gV29ya2Fyb3VuZCBmb3IgYXV0b2NvbmYgYnVnIHdoZW4KICAgICAgICAgICAgcnVubmluZyAnbWFrZSBpbnN0YWxsJy4KCjA4LzI2LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBQYXJ0IG9mIHBhdGNoICM5ODI3NTMgYXBwbGllZC4gVGhpcyBpbXBsZW1lbnRzIGEgJXBlcmxjb2RlIGRpcmVjdGl2ZS4KICAgICAgICAgICAgSXQgYWxsb3dzIG9uZSB0byBhZGQgUGVybCBjb2RlIHRvIHRoZSBnZW5lcmF0ZWQgLnBtIGZpbGUuIFdvcmtzIHRoZSBzYW1lIAogICAgICAgICAgICBhcyAlcHl0aG9uY29kZS4KCjA4LzI2LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggZm9yIGRpcmVjdG9ycyB3aGVuIHdyYXBwaW5nIHZpcnR1YWwgbWV0aG9kcyB3aXRoIGV4Y2VwdGlvbgogICAgICAgICAgICBzcGVjaWZpY2F0aW9ucyB0aGF0IHdlcmUgbm90IHNpbXBsZSB0eXBlcy4gUHJldmlvdXNseSBjb2RlIHdhcyBnZW5lcmF0ZWQgdGhhdAogICAgICAgICAgICBkaWRuJ3QgY29tcGlsZSwgZm9yIGV4YW1wbGUgd2hlbiB0aGUgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gd2FzIGEgcG9pbnRlci4KCjA4LzI1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gVHlwZW1hcCBmaXggZm9yIG1ldGhvZHMgdGhhdCByZXR1cm4gY2hhciAqLiBUaGUgQ0xSIHdvdWxkIGluY29ycmVjdGx5CiAgICAgICAgICAgIGRlbGV0ZSB0aGUgbWVtb3J5IHBvaW50ZWQgdG8gYnkgY2hhciAqLiBBbHNvIGFwcGxpZWQgdGhlIHNhbWUgY29ycmVjdGlvbiB0bwogICAgICAgICAgICB0aGUgY2hhciBhcnJheSB0eXBlbWFwcy4KCjA4LzI0LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeGVzIGZvciAtZm1pY3Jvc29mdCBlcnJvci93YXJuaW5nIG1lc3NhZ2UgZGlzcGxheTogCiAgICAgICAgICAgIC0gRW5kIG9mIGZpbGUgKEVPRikgd2FybmluZyBtZXNzYWdlcyBub3QgZGlzcGxheWluZyBpbiBjb3JyZWN0IGZvcm1hdAogICAgICAgICAgICAtIFNvbWUgbWVzc2FnZXMgY29udGFpbmluZyBhIGZpbGUgcGF0aCB3ZXJlIGRpc3BsYXlpbmcgYSBkb3VibGUgYmFja3NsYXNoCiAgICAgICAgICAgICAgaW5zdGVhZCBvZiBhIHNpbmdsZSBiYWNrc2xhc2gKCjA4LzIzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFwcGxpZWQgcGF0Y2ggIzEwMTE2MDQgc3VibWl0dGVkIGJ5IENoYXJsZXMgU2Nod2lldGVycy4gRml4IGZvciA2NCBiaXQgdGNsCiAgICAgICAgICAgIGludGVycHJldGVycy4KCjA4LzIzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBmb3IgYnVnICM4NzU1ODMgLSBlbnVtIGZvcndhcmQgZGVjbGFyYXRpb25zIHByZXZpb3VzbHkgZ2F2ZSBhIHN5bnRheCBlcnJvci4KCjA4LzIzLzIwMDQ6IG1rb2VwcGUKCSAgICBbQWxsZWdybyBDTF0gVXNlIHR5cGVtYXBzICJmZml0eXBlIiBhbmQgImxpc3B0eXBlIiB0byBkZXRlcm1pbmUgdGhlIEZGSSB0eXBlCgkgICAgc3BlY2lmaWVycyBmcm9tIHRoZSBDIHR5cGUuICBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlLCBmb3IgaW5zdGFuY2UsIHRvIGNvbnRyb2wKCSAgICB3aGV0aGVyIGEgQyAiY2hhciIgYXJndW1lbnQgdGFrZXMgYSBMaXNwIGNoYXJhY3RlciBvciBhIExpc3AgaW50ZWdlciB2YWx1ZS4KCSAgICBUaGUgZGVmYXVsdCAodGFraW5nIExpc3AgY2hhcmFjdGVycykgaXMgZG9uZSBieSB0aGVzZSBidWlsdC1pbiB0eXBlbWFwczoKCSAgICAgICV0eXBlbWFwKGZmaXR5cGUpIGNoYXIgIjpjaGFyIgoJICAgICAgJXR5cGVtYXAobGlzcHR5cGUpIGNoYXIgImNoYXJhY3RlciIKCSAgICBJZiBjaGFyIG1lYW5zIGFuIGludGVnZXIgaW5zdGVhZCwgdXNlIHRoZXNlIHR5cGVtYXBzOgoJICAgICAgJXR5cGVtYXAoZmZpdHlwZSkgY2hhciAiOmNoYXIiCgkgICAgICAldHlwZW1hcChsaXNwdHlwZSkgY2hhciAiaW50ZWdlciIKCjA4LzIyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFzIGRpc2N1c3NlZCBpbiBidWcgIzc3MjQ1MywgdGhlIFNXSUcgbGlicmFyeSBkaXJlY3RvcnkgaXMgbm93IGluc3RhbGxlZAogICAgICAgICAgICBpbnRvIGEgZGlmZmVyZW50IGRlZmF1bHQgZGlyZWN0b3J5LiBUaGUgbGlicmFyeSB1c2VkIHRvIGJlIGluc3RhbGxlZCB0bwogICAgICAgICAgICAvdXNyL2xvY2FsL2xpYi9zd2lnMS4zLiBJdCBpcyBub3cgaW4gdGhlIG1vcmUgdXN1YWwgYXJjaGl0ZWN0dXJlIGluZGVwZW5kZW50CiAgICAgICAgICAgIGRpcmVjdG9yeSBhbmQgSSBoYXZlIGFkZGl0aW9uYWxseSB1c2VkIGEgdmVyc2lvbiBzcGVjaWZpYyBzdWJkaXJlY3RvcnkgYXMKICAgICAgICAgICAgdGhlIGxpYnJhcnkgd2lsbCByYXJlbHkgd29yayB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIFNXSUcuIFRoaXMgcmVsZWFzZQogICAgICAgICAgICB3aWxsIHRodXMgdXNlIC91c3IvbG9jYWwvc2hhcmUvc3dpZy8xLjMuMjIgYnkgZGVmYXVsdCwgd2hpY2ggY2FuIGJlCiAgICAgICAgICAgIHRhaWxvcmVkIGFzIGJlZm9yZSB1c2luZyAnLi9jb25maWd1cmUgLS1zd2lnbGliZGlyJy4KCjA4LzE3LzIwMDQ6IG1rb2VwcGUKCSAgICBbTXpTY2hlbWVdIEFkZCBzdXBwb3J0IHRvIGNyZWF0ZSBuYXRpdmUgTXpTY2hlbWUgc3RydWN0dXJlcyBmcm9tIEMgc3RydWN0dXJlcy4KCSAgICBUbyBjb252ZXJ0IGEgQyBzdHJ1Y3R1cmUgdG8gYW4gTXpTY2hlbWUgc3RydWN0dXJlLCB1c2UgdGhlIG5ldyBydW50aW1lIG1hY3JvCgkgICAgU1dJR19OZXdTdHJ1Y3RGcm9tUHRyIGluIGEgdHlwZW1hcC4gIFBhdGNoIGZyb20gRG1pdHJpeSBaYXZpbi4gCgowOC8xMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCAjODM3NzE1IGZyb20gQmVuIFJlc2VyIHRvIGNvcnJlY3RseSBkZXRlY3QgUHl0aG9uIGxpYiBkaXJlY3RvcnkKICAgICAgICAgICAgb24gNjQgYml0IHN5c3RlbXMuCgowOC8xMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMgYW5kIEphdmFdIFByZXZlbnQgbWVtb3J5IGxlYWtzIGluIHRoZSBjYXNlIG9mIGVhcmx5IHJldHVybgogICAgICAgICAgICBmcm9tIHdyYXBwZXIgbWV0aG9kcyB1c2luZyBjb25zdCBzdGQ6OnN0cmluZyAmIHBhcmFtZXRlcnMuIE1vZGlmaWVkCiAgICAgICAgICAgIE1hcmsgVHJhdWR0IHBhdGNoICM5NTE1NjUuCgowOC8xMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBCdWcgIzk0Mzc4MyB3aXRoIHBhdGNoIGZpeGVzIHBocCBjaGFyICogb3V0IHR5cGVtYXAgTlVMTCB2YWx1ZXMuCgowOC8wMy8yMDA0OiBBaG1vbiBEYW5jeSAgPGRhbmN5QGRhbmN5PgoKICAgICAgICAgICAgW2FsbGVncm9jbF0gQWRkaXRpb25hbCBjYXNlIG1vZGUgZml4ZXMuICBBbHNvLCBtYWtlIHN1cmUKCSAgICBmb3JlaWduIHR5cGVzIGFyZSBleHBvcnRlZC4KCjA3LzI0LzIwMDQ6IG1rb2VwcGUgCgkgICAgW0d1aWxlXSBJbiAtc2NtIG1vZGUsIFNXSUcgbW9kdWxlcyBub3cgZXhjaGFuZ2UgdGhlaXIgcG9pbnRlciB0eXBlCgkgICAgaW5mb3JtYXRpb24gdmlhIHRoZSBHdWlsZSBpbnRlcnByZXRlci4gIEl0IGlzIG5vIGxvbmdlciBuZWNlc3NhcnkgdG8gYnVpbGQgYQoJICAgIHJ1bnRpbWUgbGlicmFyeSBvciB0byB1c2UgLW5vcnVudGltZSBhbmQgLXJ1bnRpbWUgZXRjLgoJICAgIAoJICAgIFRoZSBtb2R1bGUgKFN3aWcgc3dpZ3J1bikgd2hpY2ggd2FzIGludHJvZHVjZWQgaW4gdGhlIGNoYW5nZSBvZiAwNS8xNy8yMDA0IGlzCgkgICAgbm8gbG9uZ2VyIGF1dG9tYXRpY2FsbHkgYnVpbHQuICBJZiB5b3UgbmVlZCBpdCwgcnVuIFNXSUcgb24gdGhlIGludGVyZmFjZSBmaWxlCgkgICAgc3dpZ3J1bi5pLiAKCjA3LzIzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQnVnICM5MTc2MDEgTWFwcGluZyBDKysgYm9vbCBmaXggZnJvbSBNYXJrIFRyYXVkdAoKMDcvMjMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUlBNIGZpeGVzIGZvciBsYXRlc3QgQ1ZTIHZlcnNpb24gaW5jbHVkaW5nIHJlbW92YWwgb2YgcnVudGltZQogICAgICAgICAgICBsaWJyYXJ5LgoKMDcvMjMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggIzkwODk1NSBmcm9tIFJvYmVydCBIIERlIFZyaWVzLgogICAgICAgICAgICBSUE0gZmlsZSBnZW5lcmF0aW9uIGZpeCBmb3IgRmVkb3JlIENvcmUgMSBhbmQgUmVkaGF0IEFTMi4xLgoKMDcvMTIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggIzg2NDY4OSBmcm9tIFJvYmluIER1bm46CgogICAgICAgICAgICBUaGlzIHBhdGNoIGNvcnJlY3RzIHR3byBwcm9ibGVtcyBpbiB0aGUgWE1MIG91dHB1dCBvZiBTV0lHOgogICAgICAgICAgICAgCiAgICAgICAgICAgICAgMS4gVGhlcmUgd2VyZSBvZnRlbiBleHRyYSAnLz5cbicgaW4gdGhlIG91dHB1dC4KICAgICAgICAgICAgICAKICAgICAgICAgICAgICAyLiB2YWx1ZSBhdHRyaWJ1dGVzIHdlcmUgb3V0cHV0IHdpdGggJ1xuJyBpbiB0aGVtIGJ1dAogICAgICAgICAgICAgIHNpbmNlIHRoYXQgaXMgbm90IHRlY2huaWNhbGx5IGxlZ2FsIG1vc3QgKGFsbD8pIFhNTAogICAgICAgICAgICAgIHBhcnNlcnMgd2lsbCBzdHJpcCB0aGVtIG91dC4gUmVwbGFjaW5nIHRoZSAnXG4nIHdpdGgKICAgICAgICAgICAgICB0aGUgJyYjMTA7JyBlbnRpdHkgcmVmZXJlbmNlIHNvbHZlcyB0aGlzIGFzIHRoYXQgaXMKICAgICAgICAgICAgICBsZWdhbCBhbmQgWE1MIHBhcnNlcnMgd2lsbCBjb252ZXJ0IGl0IHRvIGEgJ1xuJyB3aGVuCiAgICAgICAgICAgICAgcmVhZGluZyB0aGUgdmFsdWVzIGJhY2sgaW4uCiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgVGhpcyBwYXRjaCBhbHNvIGFkZHMgYSBuZXcgZ2xvYmFsIGNvbW1hbmQgbGluZSBvcHRpb24KICAgICAgICAgICAgICB0aGF0IHdpbGwgYWxsb3cgdGhlIHBhcnNlIHRyZWUgdG8gYmUgd3JpdHRlbiBvdXQgaW4gWE1MCiAgICAgICAgICAgICAgKmFmdGVyKiBzb21lIG90aGVyIGxhbmd1YWdlIG1vZHVsZSBoYXMgYmVlbiBydW4sIGluCiAgICAgICAgICAgICAgb3JkZXIgdG8gYmUgYWJsZSB0byBnZXQgZXh0cmEgaW5mbyB0aGF0IHRoZSBsYW5ndWFnZQogICAgICAgICAgICAgIG1vZHVsZSBwdXRzIGluIHRoZSB0cmVlLiBJbiB0aGlzIHdheSB0aGUgWE1MIGlzIGEKICAgICAgICAgICAgICBwb3N0LXByb2Nlc3NlZCB2ZXJzaW9uIG9mIHRoZSB0cmVlIHJhdGhlciB0aGFuIGEKICAgICAgICAgICAgICBwcmUtcHJvY2Vzc2VkIHZlcnNpb24uIAogCiAgICAgICAgICAgICAgQ29tbWFuZCBsaW5lIG9wdGlvbiBpcyAtZHVtcF94bWwgb3IgLXhtbG91dCA8ZmlsZT4KCjA3LzEyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBQYXRjaCBmcm9tIFNjb3R0IE1pY2hlbCB0byBmaXggdHlwZXNhZmUgZW51bXMgYW5kIHByb3BlciBlbnVtcwogICAgICAgICAgICB3aXRoIGRpcmVjdG9ycy4KCjA3LzEyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEhUTUwgZG9jdW1lbnRhdGlvbiAobWFrZWNoYXAucHkpIGZpbGUgZ2VuZXJhdG9yIG1pc3NpbmcgZW5kIG9mIGxpbmUKICAgICAgICAgICAgcGF0Y2ggIzkwODk1MSBmcm9tIFJvYmVydCBkZSBWcmllcy4KCjA3LzA4LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFRoZSBkZXByZWNhdGVkIHJ1bnRpbWUgbGlicmFyeSBidWlsZCBoYXMgYmVlbiByZW1vdmVkLiBUaGlzIGFsc28gcmVtb3ZlcwogICAgICAgICAgICB0aGUgZGVwZW5kZW5jeSBvbiBMaWJ0b29sLiBMaWJ0b29sIGlzIG5vIGxvbmdlciByZXF1aXJlZCB0byBidWlsZCBTV0lHLgogICAgICAgICAgICBUaGUgYXNzb2NpYXRlZCAtbGRmbGFncyBTV0lHIGNvbW1hbmRsaW5lIG9wdGlvbiBoYXMgYWxzbyBiZWVuIHJlbW92ZWQuCgogICAgICAgICAgICBUaGUgZXhhbXBsZXMgYW5kIHRlc3Qtc3VpdGUgdGVzdGNhc2VzIHRoYXQgdXNlZCB0aGUgcnVudGltZSBsaWJyYXJ5IGhhdmUKICAgICAgICAgICAgYmVlbiB1cGRhdGVkIHRvIHVzZSB0aGUgcmVwbGFjZW1lbnQgYXBwcm9hY2ggdG8gdXNpbmcgU1dJRyBhY3Jvc3MgCiAgICAgICAgICAgIG11bHRpcGxlIG1vZHVsZXMsIHRoYXQgaXMgdGhleSB1c2UgdGhlIC1ub3J1bnRpbWUgYW5kIC1ydW50aW1lIGNvbW1hbmRsaW5lCiAgICAgICAgICAgIG9wdGlvbnMsIHNlZSBNb2R1bGVzLmh0bWwuIEVmZmVjdGl2ZWx5IHRoZXkgYnVpbGQgdGhlaXIgb3duIHJ1bnRpbWUKICAgICAgICAgICAgbGlicmFyaWVzIHVzaW5nIC1ydW50aW1lLiBUaGUgZXhhbXBsZXMgYXJlIGltcG9ydCBhbmQgaW1wb3J0X3RlbXBsYXRlLgogICAgICAgICAgICBUaGUgdGVzdCBjYXNlcyBhcmUgaW4gdGhlIGltcG9ydHMgYW5kIHRlbXBsYXRlX3R5cGVkZWZfaW1wb3J0IGRpcmVjdG9yaWVzLgoKICAgICAgICAgICAgQW55b25lIHdobyB3YW50cyB0aGUgb3JpZ2luYWwgcnVudGltZSBsaWJyYXJpZXMgY2FuIGVpdGhlciBydW4gdGhlIHRlc3Qtc3VpdGUKICAgICAgICAgICAgb3IgYnVpbGQgdGhlIGV4YW1wbGVzIGFuZCB1c2UgdGhlIGFwcHJvcHJpYXRlIHNoYXJlZCBvYmplY3QvRExMIHRoYXQgaXMKICAgICAgICAgICAgZ2VuZXJhdGVkIHdpdGggdGhlIC1ydW50aW1lIGNvbW1hbmRsaW5lIG9wdGlvbi4gRm9yIGV4YW1wbGUgbGliaW1wb3J0c19ydW50aW1lLnNvCiAgICAgICAgICAgIChQeXRob24gY2FsbHMgaXQgbGliX2ltcG9ydHNfcnVudGltZS5zbykgaXMgZ2VuZXJhdGVkIGFmdGVyIHJ1bm5pbmcgdGhlIAogICAgICAgICAgICAnbWFrZSBpbXBvcnRzLm11bHRpY3BwdGVzdCcgdGVzdGNhc2UgaW4gdGhlIEV4YW1wbGVzL3Rlc3Qtc3VpdGUvPGxhbmc+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+Pj4gRm9vLmJhcigpCgogICAgICAgICAgICBUaGUgb2xkLXN0eWxlIGZ1bmN0aW9uIGlzIHN0aWxsIHN1cHBvcnQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBJZgogICAgICAgICAgICB5b3UgY2FyZSBhYm91dCBtYWtpbmcgeW91ciBjb2RlIGFjcm9zcyBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgUHl0aG9uLAogICAgICAgICAgICBlaXRoZXIgdXNlIEZvb19iYXIoKSBvciBhY2Nlc3MgdGhlIG1ldGhvZCB0aHJvdWdoIGFuIGluc3RhbmNlLgogCjA3LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQ2hhbmdlcyB0byB0aGUgUHl0aG9uIG1vZHVsZS4gIFByb3h5IGNsYXNzZXMgbm93IHV0aWxpemUgbmV3IFB5dGhvbi0yLjIKICAgICAgICAgICAgZmVhdHVyZXMgaW5jbHVkaW5nIHByb3BlcnRpZXMgYW5kIHN0YXRpYyBtZXRob2RzLiAgSG93ZXZlciwgdGhlc2UgZmVhdHVyZXMKICAgICAgICAgICAgYXJlIHN1cHBvcnRlZCBpbiBhIHdheSB0aGF0IHByb3ZpZGVzIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIKICAgICAgICAgICAgUHl0aG9uIHZlcnNpb25zLiAgSW4gb3RoZXIgd29yZHMsIHByb3h5IGNsYXNzZXMgd29yayB3aXRoIGFsbCB2ZXJzaW9ucwogICAgICAgICAgICBvZiBQeXRob24gYW5kIG9ubHkgdXNlIG5ldyBmZWF0dXJlcyB3aGVuIHJ1bm5pbmcgb24gUHl0aG9uLTIuMi4KCgowNy8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1vZGlmaWVkICVleHRlbmQgc28gdGhhdCBvdmVybG9hZGVkIG1ldGhvZHMgY2FuIGJlIGFkZGVkLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJWV4dGVuZCBGb28gewogICAgICAgICAgICAgICAgICAgICB2b2lkIGJhcihpbnQgeCkgeyB9OwogICAgICAgICAgICAgICAgICAgICB2b2lkIGJhcihjaGFyICpzKSB7IH07CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhpcyB3b3JrcyB3aXRoIGJvdGggQysrICphbmQqIEMuCgowNy8yNC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIE1vcmUgbmV3IHR5cGVtYXBzIHNvIHRoYXQgdGhlIEphdmEgcHJveHkgY2xhc3NlcyBhbmQgdHlwZSB3cmFwcGVyIGNsYXNzZXMKICAgICAgICAgICAgY2FuIGJlIGZ1cnRoZXIgdGFpbG9yZWQgYnkgdXNlcnMuIFRoZXNlIGFyZSB0aGUgZGVmYXVsdCBjb2RlIGZvciBnZW5lcmF0aW5nIHRoZSAKICAgICAgICAgICAgZmluYWxpemUoKSBtZXRob2RzIChwcm94eSBjbGFzc2VzIG9ubHkpIGFuZCB0aGUgZ2V0Q1B0cigpIG1ldGhvZHMgZm9yIHByb3h5IAogICAgICAgICAgICBjbGFzc2VzIGFuZCB0eXBlIHdyYXBwZXIgY2xhc3NlczoKCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFmaW5hbGl6ZSkgU1dJR1RZUEUgJXsKICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHsKICAgICAgICAgICAgICAgIF9kZWxldGUoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICV9CiAgICAgICAgICAgIAogICAgICAgICAgICAldHlwZW1hcChqYXZhZ2V0Y3B0cikgU1dJR1RZUEUsIFNXSUdUWVBFICosIFNXSUdUWVBFICYsIFNXSUdUWVBFIFtdICV7CiAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBsb25nIGdldENQdHIoJGphdmFjbGFzc25hbWUgb2JqKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gb2JqLnN3aWdDUHRyOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFRoZSBqYXZhZ2V0Y3B0ciB0eXBlbWFwIHdpbGwgZW5hYmxlIHVzZXJzIHRvIGhhbmRsZSBKYXZhIG51bGwgYnkgb3ZlcnJpZGluZwogICAgICAgICAgICB0aGlzIHR5cGVtYXAgLSBhIHJlcXVlc3RlZCBmZWF0dXJlLgoKICAgICAgICAgICAgVGhlIC1ub2ZpbmFsaXplIGNvbW1hbmRsaW5lIG9wdGlvbiBoYXMgYmVlbiBkZXByZWNhdGVkLiBUaGUgamF2YWZpbmFsaXplCiAgICAgICAgICAgIHR5cGVtYXAgaXMgbW9yZSBwb3dlcmZ1bCBhcyBpdCB3aWxsIGFsbG93IHRoZSByZW1vdmFsIG9mIHRoZSBmaW5hbGl6ZSBtZXRob2RzIAogICAgICAgICAgICBmb3IgYWxsIG9yIGFueSBvbmUgb3IgbW9yZSBwYXJ0aWN1bGFyIHByb3h5IGNsYXNzLgoKMDcvMjMvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBUaGUgZ2V0Q1B0clhYWCgpIGZ1bmN0aW9uIGhhcyBiZWVuIGNoYW5nZWQgdG8gYSBzdGF0aWMgZnVuY3Rpb24gYW5kCiAgICAgICAgICAgIGlzIG5vdyBvZiB0aGUgZm9ybToKCiAgICAgICAgICAgIHByb3RlY3RlZCBzdGF0aWMgbG9uZyBnZXRDUHRyKFhYWCBvYmopIHsuLi59CgogICAgICAgICAgICBUaGlzIGlzIGEgcmVxdWVzdGVkIGNoYW5nZSB3aGljaCB3aWxsIGFsbG93IEphdmEgbnVsbCBwb2ludGVycyB0byBiZSB1c2VkIGFzIG51bGwKICAgICAgICAgICAgY2FuIGJlIHBhc3NlZCBpbiBmb3Igb2JqLiBIb3dldmVyLCB0byBhY2hpZXZlIHRoaXMgdGhlIGFwcHJvcHJpYXRlIGNvZGUgbXVzdCBiZQogICAgICAgICAgICB3cml0dGVuIHVzaW5nIHRoZSBuZXcgamF2YWdldGNwdHIgdHlwZW1hcCBkaXJlY3RpdmUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgogICAgICAgICAgICBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBjYW4gYmUgYWNoaWV2ZWQgYnkgYWRkaW5nIHRoaXMgZnVuY3Rpb24gYmFjayBpbiB1c2luZyB0aGUKICAgICAgICAgICAgbmV3IGphdmFjb2RlIHR5cGVtYXA6CgogICAgICAgICAgICAldHlwZW1hcChqYXZhY29kZSkgU1dJR1RZUEUgJXsKCiAgICAgICAgICAgICAgLy8gU1dJRy0xLjMuMTIgYW5kIFNXSUctMS4zLjEzCiAgICAgICAgICAgICAgcHVibGljIGxvbmcgZ2V0Q1B0ciRqYXZhY2xhc3NuYW1lKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHN3aWdDUHRyOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAvLyBTV0lHLTEuMy4xMSBhbmQgZWFybGllcgogICAgICAgICAgICAgIHB1YmxpYyBsb25nIGdldENQdHIoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc3dpZ0NQdHI7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgJX0KCgowNy8yMy8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIE5ldyBkaXJlY3RpdmUgdG8gY29udHJvbCBjb25zdGFudCBjb2RlIGdlbmVyYXRpb24gLSAlamF2YWNvbnN0LgogICAgICAgICAgICBUaGUgZGVmYXVsdCBoYW5kbGluZyBmb3IgaGFuZGxpbmcgY29uc3RhbnRzIGlzIHRvIGdldCB0aGUgdmFsdWUgdGhyb3VnaAogICAgICAgICAgICBhIEpOSSBjYWxsLCBlZwoKICAgICAgICAgICAgI2RlZmluZSBZRUxMT1cgNQogICAgICAgICAgICAjZGVmaW5lIEJJRyAxMjM0TEwKCiAgICAgICAgICAgIHJlc3VsdHMgaW46CgogICAgICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBZRUxMT1cgPSBtb2R1bGVuYW1lLmdldF9ZRUxMT1coKTsKICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBsb25nIEJJRyA9IG1vZHVsZW5hbWUuZ2V0X0JJRygpOwoKICAgICAgICAgICAgRWFybGllciB2ZXJzaW9ucyBvZiB0aGUgSmF2YSBtb2R1bGUgaW5pdGlhbGlzZWQgdGhlIHZhbHVlIHVzaW5nIHRoZSBDIHZhbHVlOgoKICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgWUVMTE9XID0gNTsKICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBsb25nIEJJRyA9IDEyMzRMTDsKCiAgICAgICAgICAgIFRoaXMgd29ya3MgaW4gbW9zdCBjYXNlcywgYnV0IHRoZSB2YWx1ZSBmb3IgQklHIHdvbid0IGNvbXBpbGUgYXMgMTIzNExMIGlzIG5vdAogICAgICAgICAgICB2YWxpZCBKYXZhIGNvZGUgYW5kIHRoaXMgaXMgb25lIG9mIHRoZSByZWFzb25zIHdoeSB0aGUgZGVmYXVsdCBpcyBub3cgdG8gZ2V0IHRoZSAKICAgICAgICAgICAgdmFsdWVzIHRocm91Z2ggYSBKTkkgY2FsbC4gVGhlIHNpZGUgZWZmZWN0IGlzIHRoYXQgdGhlc2UgJ2NvbnN0YW50cycgY2Fubm90IGJlIHVzZWQgCiAgICAgICAgICAgIGluIHN3aXRjaCBzdGF0ZW1lbnRzLiBUaGUgJWphdmFjb25zdCBkaXJlY3RpdmUgYWxsb3dzIG9uZSB0byBzcGVjaWZ5IHRoZQogICAgICAgICAgICB3YXkgdGhlIGNvbnN0YW50IHZhbHVlIGlzIGluaXRpYWxpc2VkIGFuZCB3b3JrcyBsaWtlIG90aGVyICVmZWF0dXJlCiAgICAgICAgICAgIGRpcmVjdGl2ZXMsIGVnCgogICAgICAgICAgICAlamF2YWNvbnN0KDApOyAgICAgLy8gYWxsIGNvbnN0YW50cyBmcm9tIHRoaXMgcG9pbnQgb24gYXJlIGluaXRpYWxpc2VkIHVzaW5nIHRoZSBDIHZhbHVlCiAgICAgICAgICAgICVqYXZhY29uc3QoMSkgQklHOyAvLyBqdXN0IEJJRyBpbml0aWFsaXNlZCB1c2luZyBKTkkgY2FsbCAobXVzdCBiZSBwYXJzZWQgYmVmb3JlIEJJRyBpcyBkZWZpbmVkKQoKMDcvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICAqKiogSU1QT1JUQU5UIENIQU5HRVMgVE8gVEhFIFBZVEhPTiBNT0RVTEUgKioqCgogICAgICAgICAgICAoMSkgVGhlIFB5dGhvbiBtb2R1bGUgbm93IGVuYWJsZXMgc2hhZG93L3Byb3h5IGNsYXNzZXMgYnkgZGVmYXVsdC4KICAgICAgICAgICAgVGhpcyBtZWFucyB0aGF0IHR3byBmaWxlcyBhcmUgYWx3YXlzIGNyZWF0ZWQgYnkgU1dJRy4gIEZvcgogICAgICAgICAgICBpbnN0YW5jZSwgaWYgeW91IGhhdmUgdGhpczoKCiAgICAgICAgICAgICAgICAgLy8gZmlsZTogZm9vLmkKICAgICAgICAgICAgICAgICAlbW9kdWxlIGZvbwogICAgICAgICAgICAgICAgIC4uLgoKICAgICAgICAgICAgVGhlbiBzd2lnIGdlbmVyYXRlcyB0d28gZmlsZXMgImZvb193cmFwLmMiIGFuZCAiZm9vLnB5Ii4KCiAgICAgICAgICAgICgyKSBUaGUgbmFtZSBvZiB0aGUgbG93LWxldmVsIEMgZXh0ZW5zaW9uIG1vZHVsZSBoYXMgYmVlbiBjaGFuZ2VkCiAgICAgICAgICAgIHRvIHN0YXJ0IHdpdGggYSBsZWFkaW5nIHVuZGVyc2NvcmUuICAgVGhpcyBtZWFucyB0aGF0IHlvdSBoYXZlCiAgICAgICAgICAgIHRvIGNvbXBpbGUgdGhlIG1vZHVsZSBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgICQgY2MgLWMgLUkvdXNyL2xvY2FsL2luY2x1ZGUvcHl0aG9uMi4yIGZvb193cmFwLmMKICAgICAgICAgICAgICAgICQgY2MgLXNoYXJlZCBmb29fd3JhcC5vICQoT0JKUykgLW8gX2Zvby5zbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGUgZXh0cmEgdW5kZXJzY29yZQoKICAgICAgICAgICAgVGhpcyBuYW1pbmcgc2NoZW1lIGlzIGNvbnNpc3RlbnQgd2l0aCBvdGhlciBQeXRob24gbW9kdWxlcyB0aGF0CiAgICAgICAgICAgIHV0aWxpemUgZXh0ZW5zaW9uIGNvZGUuICBGb3IgaW5zdGFuY2UsIHRoZSBzb2NrZXQgbW9kdWxlIGNvbnNpc3RzCiAgICAgICAgICAgIG9mICJfc29ja2V0LnNvIiBhbmQgInNvY2tldC5weSIuICBJbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiBTV0lHLAogICAgICAgICAgICB0aGUgc2hhcmVkIG9iamVjdCBmaWxlIHdhcyBuYW1lZCAiZm9vY21vZHVsZS5zbyIuCgogICAgICAgICAgICAoMykgQSBuZXcgZGlyZWN0aXZlIGNhbiBiZSB1c2VkIHRvIGluc2VydCBQeXRob24gY29kZSBpbnRvCiAgICAgICAgICAgIHRoZSBjb3JyZXNwb25kaW5nIC5weSBmaWxlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJXB5dGhvbmNvZGUgJXsKICAgICAgICAgICAgICAgIGRlZiBmb28oKToKICAgICAgICAgICAgICAgICAgICBwcmludCAiSGVsbG8gV29ybGQiCiAgICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgIFRoaXMgZGlyZWN0aXZlIGFsbG93cyB5b3UgdG8gY3JlYXRlIG1vZHVsZXMgYXMgYSBtaXggb2YgQyBhbmQgUHl0aG9uLgogICAgICAgICAgICAgUHl0aG9uIGNvZGUgaXMgc2VhbWxlc3NseSBhZGRlZCB0byB0aGUgbW9kdWxlLgoKICAgICAgICAgICAgKDQpIFRoZSAtc2hhZG93IGNvbW1hbmQgbGluZSBvcHRpb24gaXMgZGVwcmVjYXRlZC4gIFRoaXMgaXMgdHVybmVkIG9uCiAgICAgICAgICAgIGJ5IGRlZmF1bHQuCgogICAgICAgICAgICAoNSkgVG8gZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgZXh0cmEgcHl0aG9uIGZpbGUsIHVzZSB0aGUgIi1ub3Byb3h5IgogICAgICAgICAgICBjb21tYW5kIGxpbmUgb3B0aW9uLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIHdpbGwgbGlrZWx5IGJyZWFrIHRoZSBidWlsZCBlbnZpcm9ubWVudCBvZiBwcm9qZWN0cyB0aGF0CiAgICAgICAgICAgIHV0aWxpemUgc2hhZG93IGNsYXNzZXMuICAgVG8gZml4IHRoaXMsIHlvdSBwcm9iYWJseSBvbmx5IG5lZWQgdG8KICAgICAgICAgICAgY2hhbmdlIHRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgLnNvIGZpbGUuICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUKICAgICAgICAgICAgTWFrZWZpbGUgaW5mb3JtYXRpb24gbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgIFRBUkdFVCA9IGV4YW1wbGVjbW9kdWxlLnNvCgogICAgICAgICAgICBKdXN0IGNoYW5nZSBpdCB0bzoKCiAgICAgICAgICAgICAgICAgICBUQVJHRVQgPSBfZXhhbXBsZS5zbwoKICAgICAgICAgICAgKioqIERPQ1VNRU5UQVRJT04gVVBEQVRFICoqKgogICAgICAgICAgICBUaGUgZmlsZSBEb2MvTWFudWFsL1B5dGhvbi5odG1sIGhhcyBiZWVuIHVwZGF0ZWQgdG8gZGVzY3JpYmUgdGhlc2UgY2hhbmdlcy4KCgowNy8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIC1ub2V4dGVybiBvcHRpb24uICAgSWYgc3VwcGxpZWQsIFNXSUcgd2lsbCBub3QgZ2VuZXJhdGUKICAgICAgICAgICAgZXh0cmEgZXh0ZXJuIGRlY2xhcmF0aW9ucy4gIFRoaXMgaXMgc29tZXRpbWVzIGFuIGlzc3VlIG9uIAogICAgICAgICAgICBub24tdW5peCBwbGF0Zm9ybXMuCgowNy8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIGEgd2FybmluZyBmb3IgaWdub3JlZCBmcmllbmQgZnVuY3Rpb25zLgoKMDcvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDU3NDQ5OCBdIC1wcm94eSBhbmQgJWluY2x1ZGUgInBvaW50ZXIuaSIgY2xhc2guCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IERhdmlkIENyZWFzeS4KCjA3LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1NzYxMDMgXSBnbG9iYWwgZGVzdHJ1Y3Rpb24gd2FybmluZyB3aXRoIHNoYWRvdy4KICAgICAgICAgICAgUGVybCBleHRlbnNpb25zIHNob3VsZCBubyBsb25nZXIgcmVwb3J0IHRoZSB3YXJuaW5nCgogICAgICAgICAgICAgICAiVXNlIG9mIHVuaW5pdGlhbGl6ZWQgdmFsdWUgZHVyaW5nIGdsb2JhbCBkZXN0cnVjdGlvbi4iCiAKICAgICAgICAgICAgd2hlbiBydW5uaW5nIHdpdGggInBlcmwgLXciLiAgUmVwb3J0ZWQgYnkKICAgICAgICAgICAgQnJldHQgV2lsbGlhbXMuCgowNy8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEluIEMrKyBtb2RlLCBTV0lHIG5vdyBhbHdheXMgZGVmaW5lcyBuYW1lc3BhY2Ugc3RkLiAgQnkgZGVmYXVsdCwKICAgICAgICAgICAgaXQncyBlbXB0eS4gIEhvd2V2ZXIsIHRoaXMgd2lsbCBzaWxlbmNlIGVycm9ycyBmcm9tIHByb2dyYW1zCiAgICAgICAgICAgIHRoYXQgaW5jbHVkZSBzdGF0ZW1lbnRzIHN1Y2ggYXMgInVzaW5nIG5hbWVzcGFjZSBzdGQ7Ii4KICAgICAgICAgICAgVGhpcyBmaXhlcyBCdWcgWyA1ODQwMTcgXSB1c2luZyBuYW1lc3BhY2Ugc3RkIGdlbmVyYXRlcyBlcnJvci4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgSm9zZXBoIFdpbnN0b24uCgowNy8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIGEgbmV3IHdhcm5pbmcgbWVzc2FnZSBmb3IgJWFwcGx5LiAgSWYgeW91IHVzZSAlYXBwbHkgYnV0IG5vIHR5cGVtYXBzCiAgICAgICAgICAgIGFyZSBkZWZpbmVkLCB5b3Ugd2lsbCBnZXQgYSB3YXJuaW5nIG1lc3NhZ2UuICBUaGlzIHNob3VsZCBoZWxwIHdpdGgKICAgICAgICAgICAgcHJvYmxlbXMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgICVhcHBseSBjaGFyICpPVVRQVVQgeyAuLi4gfTsKCiAgICAgICAgICAgIEluIG9sZCB2ZXJzaW9ucyBvZiBTV0lHLCB0aGlzIHNpbGVudGx5IGRpZCBub3RoaW5nLiAgTm93IHlvdSBnZXQgYW4gZXJyb3IgbGlrZSB0aGlzOgogIAogICAgICAgICAgICAgICAgICAgZmlsZTpsaW5lLiBXYXJuaW5nLiBDYW4ndCBhcHBseSAoY2hhciAqT1VUUFVUKS4gTm8gdHlwZW1hcHMgYXJlIGRlZmluZWQuCgowNy8yMi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFN0YXJ0ZWQgSmF2YSBwcmFnbWEgZGVwcmVjYXRpb24uIFJlcGxhY2VtZW50cyB1c2UgJXR5cGVtYXAgYmFzZWQgCiAgICAgICAgICAgIGRpcmVjdGl2ZXMgYW5kIGVuYWJsZSBwcm94eSBjbGFzc2VzIGFuZCB0aGUgbmV3IHR5cGUgd3JhcHBlciBjbGFzc2VzIHRvIGJlIAogICAgICAgICAgICB0YWlsb3JlZCBpbiB2YXJpb3VzIHdheXMuIFRoZXNlIGFyZSB0aGUgbmV3IHR5cGVtYXBzOgogICAgICAgICAgICAKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWJhc2UpICAgICAgICAgICAtIGJhc2UgKGV4dGVuZHMpIGZvciBKYXZhIGNsYXNzCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFjbGFzc21vZGlmaWVycykgLSBjbGFzcyBtb2RpZmllcnMgZm9yIHRoZSBKYXZhIGNsYXNzOiBkZWZhdWx0IGlzICJwdWJsaWMiCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFjb2RlKSAgICAgICAgICAgLSBqYXZhIGNvZGUgaXMgY29waWVkIHZlcmJhdGltIHRvIHRoZSBKYXZhIGNsYXNzCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFpbXBvcnRzKSAgICAgICAgLSBpbXBvcnQgc3RhdGVtZW50cyBmb3IgSmF2YSBjbGFzcwogICAgICAgICAgICAldHlwZW1hcChqYXZhaW50ZXJmYWNlcykgICAgIC0gaW50ZXJmYWNlcyAoZXh0ZW5kcykgZm9yIEphdmEgY2xhc3MKICAgICAgICAgICAgCiAgICAgICAgICAgIEFuZCB0aGVzZSBhcmUgdGhlICVwcmFnbWEgZGlyZWN0aXZlcyBiZWluZyBkZXByZWNhdGVkOgogICAgICAgICAgICBhbGxzaGFkb3diYXNlCiAgICAgICAgICAgIGFsbHNoYWRvd2NsYXNzbW9kaWZpZXJzCiAgICAgICAgICAgIGFsbHNoYWRvd2NvZGUKICAgICAgICAgICAgYWxsc2hhZG93aW1wb3J0CiAgICAgICAgICAgIGFsbHNoYWRvd2ludGVyZmFjZQogICAgICAgICAgICBzaGFkb3diYXNlCiAgICAgICAgICAgIHNoYWRvd2NsYXNzbW9kaWZpZXJzCiAgICAgICAgICAgIHNoYWRvd2NvZGUKICAgICAgICAgICAgc2hhZG93aW1wb3J0CiAgICAgICAgICAgIHNoYWRvd2ludGVyZmFjZQogICAgICAgICAgICAKICAgICAgICAgICAgTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIHRhcmdldCBhIHBhcnRpY3VsYXIgcHJveHkgY2xhc3M6CiAgICAgICAgICAgICV0eXBlbWFwKGphdmFpbXBvcnRzKSBGb28gImltcG9ydCBqYXZhLnV0aWwuKiIKICAgICAgICAgICAgb3IgYSBwYXJ0aWN1bGFyIHR5cGUgd3JhcHBlciBjbGFzczoKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWltcG9ydHMpIGRvdWJsZSogImltcG9ydCBqYXZhLm1hdGguKiIKICAgICAgICAgICAgTm90ZSB0aGF0ICRqYXZhY2xhc3NuYW1lIGluIHRoZXNlIHR5cGVtYXBzIGFyZSBzdWJzdGl0dXRlZCB3aXRoIGVpdGhlciB0aGUgcHJveHkgCiAgICAgICAgICAgIGNsYXNzbmFtZSB3aGVuIHVzaW5nIHByb3h5IGNsYXNzZXMgb3IgdGhlIFNXSUdUWVBFIGNsYXNzIG5hbWUuCgowNy8xOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEphdmEgbW9kdWxlIG92ZXJoYXVsIHRvIGltcGxlbWVudCBzdGF0aWMgdHlwZSBjaGVja2luZyBvZiBhbGwgCiAgICAgICAgICAgIHR5cGVzLiAKICAgICAgICAgICAgCiAgICAgICAgICAgIDEpIENoYW5nZXMgd2hlbiB1c2luZyBKYXZhIFByb3h5IGNsYXNzZXMKICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICAgICAgICAgUHJldmlvdXNseSB3aGVuIHdyYXBwaW5nIGdsb2JhbCBmdW5jdGlvbnM6IAoKICAgICAgICAgICAgY2xhc3MgU29tZUNsYXNze307CiAgICAgICAgICAgIHZvaWQgZm9vKFNvbWVDbGFzcyogcyk7CiAgICAgICAgICAgIFNvbWVDbGFzcyogYmFyKCk7CgogICAgICAgICAgICBUaGUgbmF0aXZlIG1ldGhvZCBwcm90b3R5cGVzIHVzZWQgYSBsb25nIGZvciBwb2ludGVycyBhbmQgbG9va2VkIGxpa2UgdGhpczoKCiAgICAgICAgICAgIHB1YmxpYyBjbGFzcyBtb2R1bGVuYW1lICB7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgbmF0aXZlIHZvaWQgZm9vKGxvbmcgamFyZzEpOwogICAgICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBuYXRpdmUgbG9uZyBiYXIoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYW5kIHVubGlrZSBtZW1iZXIgZnVuY3Rpb25zIG9mIGEgQysrIGNsYXNzIHRoZXJlIHdhcyBubyB3cmFwcGVyIGFyb3VuZCB0aGUgbmF0aXZlIGNhbGxzIAogICAgICAgICAgICB0byBtYWtlIHRoZSB1c2Ugb2YgdGhlbSBtb3JlIHVzZXIgZnJpZW5kbHkuIFRoZXkgd291bGQgYmUgdXNlZCBmcm9tIEphdmEgbGlrZSB0aGlzOgoKICAgICAgICAgICAgU29tZUNsYXNzIHMgPSBuZXcgU29tZUNsYXNzKG1vZHVsZW5hbWUuYmFyKCksIGZhbHNlKTsKICAgICAgICAgICAgbW9kdWxlbmFtZS5mb28ocy5nZXRDUHRyU29tZUNsYXNzKCkpOwoKICAgICAgICAgICAgTm90ZSB0aGF0IHRoZSBmb2xsb3dpbmcgd2lsbCBoYXZlIHRoZSBzYW1lIGVmZmVjdCwgYnV0IHRoZW4gaXQgd291bGQgbm90IGhhdmUgCiAgICAgICAgICAgIGJlZW4gcG9zc2libGUgdG8gY2FsbCBhbnkgcHJveHkgbWVtYmVyIGZ1bmN0aW9ucyBpbiBTb21lQ2xhc3M6CgogICAgICAgICAgICBsb25nIHMgPSBtb2R1bGVuYW1lLmJhcigpOwogICAgICAgICAgICBtb2R1bGVuYW1lLmZvbyhzKTsKCiAgICAgICAgICAgIE5vdyB3cmFwcGVyIGZ1bmN0aW9ucyBhcmUgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgcHVibGljIGNsYXNzIG1vZHVsZW5hbWUgIHsKICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmb28oU29tZUNsYXNzIHMpIHsKICAgICAgICAgICAgICAgICAgICAvLyBjYWxscyB0aGUgbmF0aXZlIGZ1bmN0aW9uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBTb21lQ2xhc3MgYmFyKCkgewogICAgICAgICAgICAgICAgICAgIC8vIGNhbGxzIHRoZSBuYXRpdmUgZnVuY3Rpb24KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgV2hpY2ggbWVhbnMgdGhlc2UgZnVuY3Rpb25zIGNhbiBub3cgYmUgdXNlZCBtb3JlIG5hdHVyYWxseSB3aXRoIHByb3h5IGNsYXNzZXM6CgogICAgICAgICAgICBTb21lQ2xhc3MgcyA9IG1vZHVsZW5hbWUuYmFyKCk7CiAgICAgICAgICAgIG1vZHVsZW5hbWUuZm9vKHMpOwoKICAgICAgICAgICAgMikgQ2hhbmdlcyB3aGVuIG5vdCB1c2luZyBKYXZhIFByb3h5IGNsYXNzZXMKICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAgICAgICAgIFRoZSBzbyBjYWxsZWQgbG93LWxldmVsIGludGVyZmFjZSB3YXMgcmF0aGVyIGxvdy1sZXZlbCBpbmRlZWQuIFRoZSAKICAgICAgICAgICAgbmV3IHN0YXRpYyB0eXBlIGNoZWNraW5nIGltcGxlbWVudGF0aW9uIG1ha2VzIGl0IGxlc3Mgc28gYnV0IGl0IHJlbWFpbnMgYQogICAgICAgICAgICBmdW5jdGlvbmFsIGludGVyZmFjZSB0byB0aGUgQy9DKysgd29ybGQuIFByb3h5IGNsYXNzZXMgYXJlIHRoZSBvYnZpb3VzIHdheSB0byB1c2UKICAgICAgICAgICAgU1dJRyBnZW5lcmF0ZWQgY29kZSwgYnV0IGZvciB0aG9zZSB3aG8gd2FudCBhIGZ1bmN0aW9uYWwgaW50ZXJmYWNlIGFsbCBub24tcHJpbWl0aXZlCiAgICAgICAgICAgIHR5cGVzIG5vdyBoYXZlIGEgc2ltcGxlIEphdmEgY2xhc3Mgd3JhcHBlciBhcm91bmQgdGhlIEMvQysrIHR5cGUuIFBvaW50ZXJzIGFuZAogICAgICAgICAgICByZWZlcmVuY2VzIHRvIHByaW1pdGl2ZSB0eXBlcyBhcmUgYWxzbyB3cmFwcGVkIGJ5IHR5cGUgd3JhcHBlciBjbGFzc2VzLiBUaGUgdHlwZQogICAgICAgICAgICB3cmFwcGVyIGNsYXNzbmFtZXMgYXJlIGJhc2VkIG9uIHRoZSBTV0lHIGRlc2NyaXB0b3JzIHVzZWQgYnkgdGhlIG90aGVyIGxhbmd1YWdlIAogICAgICAgICAgICBtb2R1bGVzLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgIEMvQysrIHR5cGUgICAgICBKYXZhIHR5cGUgd3JhcHBlciBjbGFzcyBuYW1lCiAgICAgICAgICAgIC0tLS0tLS0tLS0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIGludCogICAgICAgICAgICBTV0lHVFlQRV9wX2ludAogICAgICAgICAgICBkb3VibGUqKiAgICAgICAgU1dJR1RZUEVfcF9wX2RvdWJsZQogICAgICAgICAgICBTb21lQ2xhc3MqICAgICAgU1dJR1RZUEVfcF9Tb21lQ2xhc3MKICAgICAgICAgICAgU29tZUNsYXNzJiAgICAgIFNXSUdUWVBFX3BfU29tZUNsYXNzCiAgICAgICAgICAgIFNvbWVDbGFzcyAgICAgICBTV0lHVFlQRV9wX1NvbWVDbGFzcwoKICAgICAgICAgICAgTm90ZSB0aGF0IGV2ZXJ5dGhpbmcgd3JhcHBlZCBieSBTV0lHIGlzIGFjY2Vzc2VkIHZpYSBhIHBvaW50ZXIgZXZlbiB3aGVuIHdyYXBwaW5nIAogICAgICAgICAgICBmdW5jdGlvbnMgdGhhdCBwYXNzIGJ5IHZhbHVlIG9yIHJlZmVyZW5jZS4gU28gdGhlIHByZXZpb3VzIGV4YW1wbGUgd291bGQgbm93IGJlIAogICAgICAgICAgICB1c2VkIGxpa2UgdGhpczoKCiAgICAgICAgICAgIFNXSUdUWVBFX3BfU29tZUNsYXNzIHMgPSBleGFtcGxlLmJhcigpOwogICAgICAgICAgICBleGFtcGxlLmZvbyhzKTsKCiAgICAgICAgICAgIE5vdGUgdGhhdCB0eXBlZGVmcyB0aGF0IFNXSUcga25vd3MgYWJvdXQgYXJlIHJlc29sdmVkLCBzbyB0aGF0IGlmIG9uZSBoYXMgCgogICAgICAgICAgICBjbGFzcyBGb297fTsKICAgICAgICAgICAgdHlwZWRlZiBGb28gQmFyOwoKICAgICAgICAgICAgdGhlbiBhbnkgdXNlIG9mIEJhciB3aWxsIHJlcXVpcmUgb25lIHRvIHVzZSBTV0lHVFlQRV9wX0ZvbzsKCiAgICAgICAgICAgIFNvbWUgY29uc2lkZXJhdGlvbnM6CiAgICAgICAgICAgIE1ha2Ugc3VyZSB5b3UgbWFrZSBhIGZpcm0gZGVjaXNpb24gdG8gdXNlIGVpdGhlciBwcm94eSBjbGFzc2VzIG9yIHRoZSBmdW5jdGlvbmFsIAogICAgICAgICAgICBpbnRlcmZhY2UgZWFybHkgb24gYXMgdGhlIGNsYXNzbmFtZXMgYXJlIGRpZmZlcmVudC4KCiAgICAgICAgICAgIDMpIFBvaW50ZXJzIGFuZCBub24tcGFyc2VkIHR5cGVzCiAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIFNvbWV0aW1lcyBTV0lHIGNhbm5vdCBnZW5lcmF0ZSBhIHByb3h5IGNsYXNzLiBUaGlzIG9jY3VycyB3aGVuIHRoZSBkZWZpbml0aW9uIG9mIAogICAgICAgICAgICBhIHR5cGUgaXMgbm90IHBhcnNlZCBieSBTV0lHLCBidXQgaXMgdGhlbiB1c2VkIGFzIGEgdmFyaWFibGUgb3IgYSBwYXJhbWV0ZXIuIAogICAgICAgICAgICBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgIHZvaWQgZm9vKFNuYXp6eSBzZHMpOwoKICAgICAgICAgICAgSWYgU1dJRyBoYXMgbm90IHBhcnNlZCBTbmF6enkgaXQgaGFuZGxlcyBpdCBzaW1wbHkgYXMgYSBwb2ludGVyIHRvIGEgU25henp5LgogICAgICAgICAgICBUaGUgSmF2YSBtb2R1bGUgZ2l2ZXMgaXQgYSB0eXBlIHdyYXBwZXIgY2xhc3MgYXJvdW5kIHRoZSBwb2ludGVyIGFuZCBjYWxscyBpdCAKICAgICAgICAgICAgU1dJR1RZUEVfcF9TbmF6enkuIEluIG90aGVyIHdvcmRzIGl0IGhhbmRsZXMgaXQgaW4gdGhlIHNhbWUgbWFubmVyIGFzIHR5cGVzIGFyZSAKICAgICAgICAgICAgaGFuZGxlZCBpbiB0aGUgbG93LWxldmVsIGZ1bmN0aW9uYWwgaW50ZXJmYWNlLiBUaGlzIGFwcHJvYWNoIGlzIHVzZWQgZm9yIGFsbCAKICAgICAgICAgICAgbm9uLXByb3h5IGNsYXNzZXMsIGVnIGFsbCBwb2ludGVyIHRvIHBvaW50ZXJzIGFuZCBwb2ludGVycyB0byBwcmltaXRpdmUgdHlwZXMuCgogICAgICAgICAgICA0KSBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eQogICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpcyBub3QgYW4gaXNzdWUgaWYgeW91IGhhdmUgYmVlbiB1c2luZyBwcm94eSBjbGFzc2VzIGFuZCAKICAgICAgICAgICAgbm8gZ2xvYmFsIHZhcmlhYmxlcy9mdW5jdGlvbnMuIE90aGVyd2lzZSBzb21lIGNoYW5nZXMgd2lsbCBoYXZlIHRvIGJlIG1hZGUuIAogICAgICAgICAgICBUaGUgbmF0aXZlIG1ldGhvZHMgc3RpbGwgZXhpc3QgYnV0IHRoZXkgYXJlIG5vdyBpbiBhIEpOSSBjbGFzcywgd2hpY2ggaXMgY2FsbGVkIAogICAgICAgICAgICBtb2R1bGVuYW1lSk5JLiBBcyB0aGlzIGNsYXNzIGlzIHJlYWxseSBwYXJ0IG9mIHRoZSBpbnRlcm5hbCB3b3JraW5ncywKICAgICAgICAgICAgaXQgc2hvdWxkIG5vdCBiZSByZXF1aXJlZCBzbyB0aGUgY2xhc3MgaGFzIGJlY29tZSBwcm90ZWN0ZWQuIFNvbWUgcHJhZ21hcy9kaXJlY3RpdmVzCiAgICAgICAgICAgIHdpbGwgaG9wZWZ1bGx5IGJlIGFkZGVkIHRvIGhlbHAgd2l0aCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjA3LzE4LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTW9kaWZpZWQgd3JhcHBpbmcgb2YgdW5pbnN0YW50aWF0ZWQgdGVtcGxhdGVzIHJldHVybmVkIGJ5CiAgICAgICAgICAgIHZhbHVlLiAgSnVzdCB0byBiZSBzYWZlLCB0aGV5IGFyZSBub3cgd3JhcHBlZCBieSBTd2lnVmFsdWVXcmFwcGVyPD4KICAgICAgICAgICAganVzdCBpbiBjYXNlIHRoZXkgZG9uJ3QgZGVmaW5lIGEgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gIFRoaXMKICAgICAgICAgICAgd291bGQgYmUgdXNlZCBpZiB5b3UgaGFkIGNvZGUgbGlrZSB0aGlzCgogICAgICAgICAgICAgICAgIEZvbzxpbnQ+IGJsYWgoKTsKICAgICAgICAgICAgICAgICB2b2lkICAgICBtb3JlYmxhaChGb288aW50PiB4KTsKCiAgICAgICAgICAgIGJ1dCB5b3UgZGlkbid0IGluc3RhbnRpYXRlIEZvbzxpbnQ+IHVzaW5nICV0ZW1wbGF0ZS4gIAogICAgICAgICAgICBXZSBzaG91bGQgcHJvYmFibHkgYWRkIGEgd2FybmluZyBmb3IgdGhpcy4KCjA3LzE3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgYW4gZXJyb3IgY2hlY2sgdG8gZGV0ZWN0IHNoYWRvd2VkIHRlbXBsYXRlIHBhcmFtYXRlcnMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgICBpbnQgVDsKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoaXMgcmVzdWx0cyBpbiBhbiBlcnJvciwgbm90IGEgd2FybmluZy4gIFRoaXMgd2FybmluZyBpcwogICAgICAgICAgICBhbHNvIG5lZWRlZCB0byBmaXggc29tZSByYXRoZXIgaW5zaWRpb3VzIHByb2JsZW1zIGxpa2UKICAgICAgICAgICAgdGhpczoKCiAgICAgICAgICAgICAgICAgc3RydWN0IFQgewogICAgICAgICAgICAgICAgICAgICAgaW50ICBibGFoOwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgdHlwZWRlZiBUIFRyYWl0czsgICAgLy8gV2hpY2ggVCBpcyB0aGlzPz8/PwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgVCBzaGFkb3dzIHRoZSBvdXRlcgogICAgICAgICAgICBzdHJ1Y3R1cmUgKHdoaWNoIGlzIHdoYXQgeW91IHdhbnQpLgoKMDcvMTYvMjAwMjogYmVhemxleQogICAgICAgICAgICBJbXByb3ZlZCBzdXBwb3J0IGZvciB0ZW1wbGF0ZXMgd2l0aCBpbnRlZ2VyIGFyZ3VtZW50cy4gIFNXSUcgaXMKICAgICAgICAgICAgbXVjaCBtb3JlIGF3YXJlIG9mIHNpdHVhdGlvbnMgc3VjaCBhcyB0aGlzOgoKICAgICAgICAgICAgICAgIGNvbnN0IGludCBTaXplID0gMTAwOwoKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShGb28xMDApIEZvbzwxMDA+OwogICAgICAgICAgICAgICAgdm9pZCBiYXIoRm9vPFNpemU+ICp4KTsgICAvLyBLbm93cyB0aGF0IEZvbzxTaXplPiBpcyB0aGUgc2FtZSBhcyBGb288MTAwPjsKCjA3LzE1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYnVnIHdpdGggJWZlYXR1cmUvJWlnbm9yZS8lcmVuYW1lIGFuZCBuYW1lc3BhY2VzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlaWdub3JlIEZvbzo6QmFyCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgRm9vIHsKICAgICAgICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBSZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDcvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCBwYXJzaW5nIHN1cHBvcnQgZm9yIGNvbnN0cnVjdG9ycyB0aGF0IHRyeSB0byBjYXRjaAogICAgICAgICAgICBleGNlcHRpb25zIGluIGluaXRpYWxpemVycy4gICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICBCYXIgYjsKICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgRm9vKGludCB4KSB0cnkgCiAgICAgICAgICAgICAgICAgICAgIDogYih4KSB7IC4uLiB9CiAgICAgICAgICAgICAgICAgY2F0Y2goaW50KSB7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGlzIGhhcyBubyBlZmZlY3Qgb24gdGhlIGdlbmVyYXRlZCB3cmFwcGVycy4gIEhvd2V2ZXIsIHRoZSB0cnkgYW5kIGNhdGNoCiAgICAgICAgICAgIHBhcnRzIG9mIHRoZSBkZWNsYXJhdGlvbiBhcmUgaWdub3JlZC4gIFNlZSBTdHJvdXN0cnVwLCAzcmQgRWQsIHNlY3Rpb24gCiAgICAgICAgICAgIDE0LjQuNi4xIGZvciBkZXRhaWxzLgogICAgICAgICAgICAgICAgICAgCjA3LzA2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYnVnIGluIHRlbXBsYXRlIHN5bWJvbCB0YWJsZSBtYW5hZ2VtZW50LiAgVGhpcyBmaXhlcwogICAgICAgICAgICB0d28gYnVncy4gIEZpcnN0LCBtaXhpbmcgYWJzdHJhY3QgbWV0aG9kcywgdGVtcGxhdGVzLCBhbmQgCiAgICAgICAgICAgIGluaGVyaXRhbmNlIG5vIGxvbmdlciBnZW5lcmF0ZXMgYSBmYWlsZWQgYXNzZXJ0aW9uLgogCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KICAgICAgICAgICAgICAgIGNsYXNzIEEgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGZvbygpID0gMDsKICAgICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+CiAgICAgICAgICAgICAgIGNsYXNzIEIgOiBwdWJsaWMgQTxUPgogICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICV0ZW1wbGF0ZShBX2ludCkgQTxpbnQ+OwogICAgICAgICAgICAgICAldGVtcGxhdGUoQl9pbnQpIEI8aW50PjsKCiAgICAgICAgICAgIFRoaXMgZml4IGFsc28gZml4ZXMgYSBzdWJ0bGUgcHJvYmxlbSB3aXRoIGRlZmF1bHQgdmFsdWVzIGFuZAogICAgICAgICAgICB0ZW1wbGF0ZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBDPgogICAgICAgICAgICAgICBzdHJ1Y3QgQiB7CiAgICAgICAgICAgICAgICAgICB0eXBlZGVmIHVuc2lnbmVkIGludCBzaXplX3R5cGU7CiAgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90eXBlIG5pbmRleCA9IHN0YXRpY19jYXN0PHNpemVfdHlwZT4oLTEpOwogICAgICAgICAgICAgICAgICAgdm9pZCBmb28oc2l6ZV90eXBlIGluZGV4ID0gbmluZGV4KTsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEJ1Z3MgcmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCgowNy8wNS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQ2hhbmdlZCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgU1dJR19Db252ZXJ0UHRyKCkgZnVuY3Rpb24KCSAgICBmb3IgdGhlIFNXSUcvUnVieSBydW50aW1lIHN1cHBvcnQgc28gdGhhdCBpdCBsb29rcyBsaWtlIHRoZQoJICAgIFB5dGhvbiB2ZXJzaW9uLiBJZiB0aGUgbGFzdCBhcmd1bWVudCAoZmxhZ3MpIGlzIG5vbi16ZXJvLAoJICAgIFNXSUdfQ29udmVydFB0cigpIHdpbGwgcmFpc2UgYW4gZXhjZXB0aW9uIGZvciB0eXBlIG1pc21hdGNoZXMKCSAgICBhcyBiZWZvcmUuIElmIGZsYWdzIGlzIHplcm8sIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gLTEgZm9yCgkgICAgdHlwZSBtaXNtYXRjaGVzIHdpdGhvdXQgcmFpc2luZyBhbiBleGNlcHRpb24uIAoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIFJVQlkgTU9EVUxFICoqKgoKMDcvMDQvMjAwMjogYmVhemxleQogICAgICAgICAgICBPdmVybG9hZGVkIGZ1bmN0aW9ucy9tZXRob2RzL2NvbnN0cnVjdG9ycyBub3cgd29yayBpbiBtYW55IGxhbmd1YWdlCiAgICAgICAgICAgIG1vZHVsZXMuICBUaGUgc3VwcG9ydCBpcyBjb21wbGV0ZWx5IHRyYW5zcGFyZW50LS1qdXN0IGNhbGwgdGhlCiAgICAgICAgICAgIGZ1bmN0aW9uIG5vcm1hbGx5IGFuZCBTV0lHIHdpbGwgZGlzcGF0Y2ggdG8gdGhlIGNvcnJlY3QgaW1wbGVtZW50YXRpb24uCiAgICAgICAgICAgIFRoZXJlIGFyZSBhIHZhcmlldHkgb2YgaXNzdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzLiAgUGxlYXNlIHJlZmVyCiAgICAgICAgICAgIHRvIHRoZSBvdmVybG9hZGluZyBzZWN0aW9uIG9mIERvYy9NYW51YWwvU1dJR1BsdXMuaHRtbCBmb3IgZGV0YWlscy4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgICAKMDcvMDQvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIGJ1ZyB3aXRoIG5hbWVzcGFjZXMsIGVudW1zLCBhbmQgdGVtcGxhdGVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBuYW1lc3BhY2UgaGVsbG8gewogICAgICAgICAgICAgICAgICBlbnVtIEhlbGxvIHsgSGksIEhvbGEgfTsKIAogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8SGVsbG8gSD4KICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0cmFpdHMKICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlZGVmIGRvdWJsZSB2YWx1ZV90eXBlOwogICAgICAgICAgICAgICAgICAgICAgfTsKIAogICAgICAgICAgICAgICAgIHRyYWl0czxIaT46OnZhbHVlX3R5cGUgc2F5X2hpKCkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyYWl0czxIaT46OnZhbHVlX3R5cGUoMSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIFNXSUcgd2Fzbid0IGdlbmVyYXRpbmcgd3JhcHBlcnMgdGhhdCBwcm9wZXJseSBxdWFsaWZpZWQgCiAgICAgICAgICAgIHRyYWl0czxIaT4uICBSZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLiAgICAgICAgIAoKMDYvMzAvMjAwMjogYmVhemxleQogICAgICAgICAgICBTdXBwbGllZCBhcnJheSB2YXJpYWJsZSB0eXBlbWFwcyBmb3IgVGNsIG1vZHVsZS4gICBJZiB5b3UgaGF2ZSBhCiAgICAgICAgICAgIHZhcmlhYmxlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBpbnQgZm9vWzEwXTsKCiAgICAgICAgICAgIHRoZW4gYSBzZXQgZnVuY3Rpb24gbGlrZSB0aGlzIGlzIGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgICB2b2lkIGZvb19zZXQoaW50ICp4KSB7CiAgICAgICAgICAgICAgICAgICBtZW1tb3ZlKGZvbyx4LDEwKnNpemVvZihpbnQpKTsKICAgICAgICAgICAgICAgIH0KCjA2LzMwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmV3ICVmcmFnbWVudCBkaXJlY3RpdmUuICAgV2hlbiB3cml0aW5nIHR5cGVtYXBzLCBpdCBjYW4gYmUgZWFzeSB0bwogICAgICAgICAgICBnZXQgY2FycmllZCBhd2F5IGFuZCB3cml0ZSBhIGxvdCBvZiBjb2RlLiAgSG93ZXZlciwgZG9pbmcgc28gY2F1c2VzCiAgICAgICAgICAgIHRyZW1lbmRvdXMgY29kZSBibG9hdC4gICBBIGNvbW1vbiB3YXkgdG8gc29sdmUgdGhpcyBpcyB0byB3cml0ZSAKICAgICAgICAgICAgaGVscGVyIGZ1bmN0aW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgICB2b2lkIHNvbWVfaGVscGVyX2Z1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICV9CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHR5cGUgewogICAgICAgICAgICAgICAgICAgc29tZV9oZWxwZXJfZnVuY3Rpb24oLi4uKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoZSBvbmx5IHByb2JsZW0gd2l0aCB0aGlzIGlzIHRoYXQgdGhlIHdyYXBwZXIgZmlsZSBnZXRzIHBvbGx1dGVkCiAgICAgICAgICAgIHdpdGggaGVscGVyIGZ1bmN0aW9ucyBldmVuIGlmIHRoZXkgYXJlbid0IHVzZWQuICAgIFRvIGZpeCB0aGlzLAogICAgICAgICAgICBhIG5ldyBmcmFnbWVudCBkaXJlY3RpdmUgaXMgYXZhaWxhYmxlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAoY29ycmVjdGVkIHR5cG8gaW4gbGluZSBiZWxvdyAtIDA2LzI2LzIwMDgpCiAgICAgICAgICAgICAgICVmcmFnbWVudCgidHlwZV9oZWFkZXIiLCJoZWFkZXIiKSAlewogICAgICAgICAgICAgICAgICB2b2lkIHNvbWVfaGVscGVyX2Z1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICAgICV0eXBlbWFwKGluLCBmcmFnbWVudD0idHlwZV9oZWFkZXIiKSB0eXBlIHsKICAgICAgICAgICAgICAgICAgIHNvbWVfaGVscGVyX2Z1bmN0aW9uKC4uLik7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIGNvZGUgZnJhZ21lbnQgaXMgb25seSBlbWl0dGVkIGlmIHRoZSB0eXBlbWFwIGlzCiAgICAgICAgICAgIGFjdHVhbGx5IHVzZWQuICAgQSBzaW1pbGFyIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgZm9yIGRlY2xhcmF0aW9uCiAgICAgICAgICAgIGFubm90YXRpb24gYW5kIHRoZSAlZmVhdHVyZSBkaXJlY3RpdmUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICVmZWF0dXJlKCJmcmFnbWVudCIsInR5cGVfaGVhZGVyIikgIFNvbWVEZWNsYXJhdGlvbjsKCiAgICAgICAgICAgIFRoZSBmaXJzdCBhcmd1bWVudCB0byAlZnJhZ21lbnQgaXMgdGhlIGZyYWdtZW50IG5hbWUuICBUaGUgc2Vjb25kIGFyZ3VtZW50CiAgICAgICAgICAgIGlzIHRoZSBmaWxlIHNlY3Rpb24gd2hlcmUgdGhlIGZyYWdtZW50IHNob3VsZCBiZSBlbWl0dGVkLiAgCgogICAgICAgICAgICBUaGUgcHJpbWFyeSB1c2Ugb2YgdGhpcyBkaXJlY3RpdmUgaXMgZm9yIHdyaXRlcnMgb2YgbGFuZ3VhZ2UgbW9kdWxlcwogICAgICAgICAgICBhbmQgYWR2YW5jZWQgdXNlcnMgd2FudGluZyB0byBzdHJlYW1saW5lIHR5cGVtYXAgY29kZS4KCiAgICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgTkVXIEZFQVRVUkUgKioqCgowNi8zMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFN1cHBsaWVkIG1lbWJlcmluIHR5cGVtYXBzIGZvciBhbGwgYXJyYXlzIGluIGFuIGF0dGVtcHQgdG8gZWxpbWluYXRlCiAgICAgICAgICAgIGNvbmZ1c2lvbiBhYm91dCB0aGVpciB1c2UuCgowNi8yOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciBzbWFydC1wb2ludGVycy4gIFdoZW4gYSBjbGFzcyBkZWZpbmVzCiAgICAgICAgICAgIG9wZXJhdG9yLT4oKSBsaWtlIHRoaXMKCiAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICBCYXIgKm9wZXJhdG9yLT4oKTsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBTV0lHIGxvY2F0ZXMgY2xhc3MgQmFyIGFuZCB0cmllcyB0byB3cmFwIGl0cyBtZW1iZXIgdmFyaWFibGVzIGFuZAogICAgICAgICAgICBtZXRob2RzIGFzIHBhcnQgb2YgRm9vLiAgRm9yIGV4YW1wbGUsIGlmIEJhciB3YXMgZGVmaW5lZCBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgaW50IHg7CiAgICAgICAgICAgICAgICAgICAgaW50IHNwYW0oKTsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFlvdSBjb3VsZCBkbyB0aGlzIChpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlKToKCiAgICAgICAgICAgICAgZiA9IEZvbygpCiAgICAgICAgICAgICAgZi54ID0gNCAgICAgICAgICAgICMgQWNjZXNzZXMgQmFyOjp4CiAgICAgICAgICAgICAgZi5zcGFtKCkgICAgICAgICAgICMgQWNjZXNzZXMgQmFyOjpzcGFtCgogICAgICAgICAgICBUaGUgcHJpbWFyeSB1c2Ugb2YgdGhpcyBmZWF0dXJlIGlzIHRvIGVtdWxhdGUgdGhlIGJlaGF2aW9yIG9mIEMrKwogICAgICAgICAgICBzbWFydC1wb2ludGVycy0tLXdoaWNoIGFsbG93IGF0dHJpYnV0ZXMgdG8gYWNjZXNzZWQgdHJhbnNwYXJlbnRseQogICAgICAgICAgICB0aHJvdWdoIG9wZXJhdG9yLT4uCgogICAgICAgICAgICBUaGlzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGF1dG9tYXRpY2FsbHkgaW4gU1dJRy0tLW5vIHNwZWNpYWwgZGlyZWN0aXZlcwogICAgICAgICAgICBhcmUgbmVlZGVkLiAgIFRvIGRpc2FibGUgdGhpcyBiZWhhdmlvci4gIFVzZSAlaWdub3JlIHRvIGlnbm9yZSAKICAgICAgICAgICAgb3BlcmF0b3ItPi4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDYvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgICBEZXByZWNhdGVkIHRoZSAlZXhjZXB0IGRpcmVjdGl2ZS4gICAlZXhjZXB0aW9uIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCgowNi8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1ham9yIGNsZWFudXAgb2YgdGhlIG1vZHVsZXMgZGlyZWN0b3J5LiAgRWxpbWluYXRlZCBtb3N0CiAgICAgICAgICAgIGhlYWRlciBmaWxlcywgY29uc29saWRhdGVkIG1vZHVsZSBjb2RlIGludG8gc2luZ2xlIGZpbGVzLgoKMDYvMjQvMjAwMjogYmVhemxleQogICAgICAgICAgICBSZXdvcmtlZCB0aGUgaW5zdGFudGlhdGlvbiBvZiBsYW5ndWFnZSBtb2R1bGVzLiAgQWxsIGxhbmd1YWdlCiAgICAgICAgICAgIG1vZHVsZXMgbXVzdCBub3cgZGVmaW5lIGEgZmFjdG9yeSBmdW5jdGlvbiBzaW1pbGFyIHRvIHRoaXM6CgogICAgICAgICAgICAgICAgZXh0ZXJuICJDIiBMYW5ndWFnZSAqCiAgICAgICAgICAgICAgICBzd2lnX3B5dGhvbih2b2lkKSB7CiAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBZVEhPTigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyB0aGVuIHBsYWNlZCBpbiBhIHRhYmxlIGFuZCBhc3NvY2lhdGVkIHdpdGgKICAgICAgICAgICAgYSBjb21tYW5kIGxpbmUgb3B0aW9uIGluIHN3aWdtYWluLmN4eC4gIAoKICAgICAgICAgICAgVGhpcyBhcHByb2FjaCBoYXMgYSBudW1iZXIgb2YgYmVuZWZpdHMuICBJdCBkZWNvdXBsZXMgdGhlIAogICAgICAgICAgICBTV0lHIG1haW4gcHJvZ3JhbSBmcm9tIGhhdmluZyB0byBrbm93IGFib3V0IHRoZSBjbGFzcwogICAgICAgICAgICBkZWZpbml0aW9ucyBmb3IgZWFjaCBtb2R1bGUuICBBbHNvLCBieSB1c2luZyBhIGZhY3RvcnkKICAgICAgICAgICAgZnVuY3Rpb24sIGl0IHdpbGwgYmUgZWFzaWVyIHRvIGltcGxlbWVudCBkeW5hbWljIGxvYWRpbmcKICAgICAgICAgICAgb2YgbW9kdWxlcyAoc2ltcGx5IGxvYWQgdGhlIGZpbGUgYW5kIGludm9rZSB0aGUgZmFjdG9yeQogICAgICAgICAgICBmdW5jdGlvbikuCgowNi8yNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN5bnRheCBlcnJvciBmb3IgcmVmZXJlbmNlIGNvbnZlcnNpb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciBGb28gJigpOwoKMDYvMjQvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzeW50YXggZXJyb3IgZm9yIG9wZXJhdG9yIG5ld1tdIGFuZCBvcGVyYXRvciBkZWxldGVbXS4KCjA2LzI0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgY29kZSBnZW5lcmF0aW9uIHByb2JsZW0gZm9yIGNvbnN0YW50cyBhbmQgZGVmYXVsdCBhcmd1bWVudHMKICAgICAgICAgICAgaW52b2x2aW5nIHRlbXBsYXRlcy4KCjA2LzE5LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBGaXhlZCBhIGJ1ZyBmb3IgdGhlICctZmVhdHVyZScgY29tbWFuZCBsaW5lIGFyZ3VtZW50OwogICAgICAgICAgICB0aGF0IHNldHRpbmcgd2FzIGVmZmVjdGl2ZWx5IGJlaW5nIGlnbm9yZWQgYW5kIHNvIHRoZSBmZWF0dXJlCiAgICAgICAgICAgIG5hbWUgd2FzIGFsd2F5cyBzZXQgZXF1YWwgdG8gdGhlIG1vZHVsZSBuYW1lLgoKMDYvMTcvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtcyB3aXRoIHN0YXRpYyBtZW1iZXJzIGFuZCBlbnVtcyBpbiB0ZW1wbGF0ZXMuCgpWZXJzaW9uIDEuMy4xMyAoSnVuZSAxNywgMjAwMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowNi8xNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgYnVnIHdpdGggX19GSUxFX18gZXhwYW5zaW9uIGluIHRoZSBwcmVwcm9jZXNzb3IuICAgT24gV2luZG93cywKICAgICAgICAgICAgdGhlIGJhY2tzbGFzaCAoXCkgaXMgbm93IGNvbnZlcnRlZCB0byAoXFwpIGluIHRoZSBzdHJpbmcgbGl0ZXJhbAogICAgICAgICAgICB1c2VkIGZvciBfX0ZJTEVfXy4gIFJlcG9ydGVkIGJ5IFN0ZXZlIEdsYXNlci4KCjA2LzE0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgd2FybmluZyBtZXNzYWdlIGFib3V0ICduYW1lIHByaXZhdGUgaW4gdGhpcyBjb250ZXh0Jy4gIFRoZQogICAgICAgICAgICB3YXJuaW5nIGlzIG9ubHkgZ2VuZXJhdGVkIGZvciBwdWJsaWMgbWV0aG9kcy4gIFJlcG9ydGVkIGJ5CiAgICAgICAgICAgIFNjb3R0IE1pY2hlbC4KIAowNi8xNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHNvbWUgcHJvYmxlbXMgcmVsYXRlZCB0byB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIAogICAgICAgICAgICBhbmQgbmFtZXNwYWNlcy4gICBXaGVuIFNXSUcgZXhwYW5kcyBhIHRlbXBsYXRlLCBpdCBkb2VzCiAgICAgICAgICAgIHNvIHdpdGggZnVsbHkgcmVzb2x2ZWQgdHlwZXMuICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgdGhpczoKCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBmb28geyB9OwogICAgICAgICAgICAgICAgdHlwZWRlZiBkb3VibGUgRG91YmxlOwogICAgICAgICAgICAgICAgJXRlbXBsYXRlKGZvb19kKSBmb288RG91YmxlPjsKCiAgICAgICAgICAgIHRoZW4sIGl0IGlzIGhhbmRsZWQgYXMgZm9vPGRvdWJsZT4gaW4gdGhlIHR5cGVzeXN0ZW0uCiAgICAgICAgICAgIFRoaXMgZml4ZXMgYSBudW1iZXIgb2Ygc3VidGxlIHByb2JsZW1zIHdpdGggaW5oZXJpdGFuY2UKICAgICAgICAgICAgYW5kIHRlbXBsYXRlcy4KCjA2LzE0LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBtaXNzaW5nIGJvb2wgdHlwZW1hcHMgZm9yIElOUFVULCBPVVRQVVQgYW5kCgkgICAgSU5PVVQgaW4gTGliL3J1YnkvdHlwZW1hcHMuaS4KCjA1LzI5LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4IGZvciBhIGNvdXBsZSBvZiBicm9rZW4gcHJhZ21hcy4KCjA1LzI5LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXggZm9yIHVubmVjZXNzYXJ5IGNhc3Qgd2hlbiB3cmFwcGluZyBnbG9iYWwgdmFyaWFibGUgd2hlcmUgCiAgICAgICAgICAgIHRoZSB0eXBlIGlzIG5vdCBwYXJzZWQgYnkgU1dJRyAtIEphdmEgdmFyaWFibGVzIGV4YW1wbGUgCiAgICAgICAgICAgIGZhaWx1cmUgYXMgcmVwb3J0ZWQgYnkgTGFycnkgVmlyZGVuLgoKMDYvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBNb2RpZmllZCAldGVtcGxhdGUgdG8gYWxsb3cgZm9yIGVtcHR5IGluc3RhbnRpYXRpb25zLgoKICAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKCkgZm9vPGludCxpbnQ+OwoKICAgICAgICAgICAgVGhpcyByZWdpc3RlcnMgZm9vPGludCxpbnQ+IHdpdGggdGhlIHR5cGUgc3lzdGVtLCBidXQKICAgICAgICAgICAgZG9lc24ndCB3cmFwIGl0IChzYW1lIGFzICVpZ25vcmUpLiAgIFRoaXMgbWF5IG9ubHkgYmUgYQogICAgICAgICAgICB0ZW1wb3JhcnkgbWVhc3VyZS4gICBTV0lHIG1pZ2h0IGJlIGFibGUgdG8gYXV0b21hdGljYWxseQogICAgICAgICAgICBpbnN0YW50aWF0ZSB0ZW1wbGF0ZXMgaW4gY2VydGFpbiBjYXNlcy4KCjA2LzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgZnVuY3Rpb24gcHJvdG90eXBlIHByb2JsZW1zIHdpdGggVGNsIDguNAoKMDYvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggdGVtcGxhdGVzIGFuZCBsb2NhdGlvbiBvZiBiYXNlIGNsYXNzZXMuICAKICAgICAgICAgICAgVGhpcyBvbmUgaXMgYSBsaXR0bGUgbWluZC1iZW5kaW5nLCBidXQgaGVyZSBpcyBhbiBleGFtcGxlCiAgICAgICAgICAgIHRoYXQgaWxsdXN0cmF0ZXM6CiAKICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBBcmdUeXBlLCBjbGFzcyBSZXNUeXBlPgogICAgICAgICAgICAgc3RydWN0IHRyYWl0cwogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICB0eXBlZGVmIEFyZ1R5cGUgYXJnX3R5cGU7CiAgICAgICAgICAgICAgICAgIHR5cGVkZWYgUmVzVHlwZSByZXNfdHlwZTsKICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBBcmdUeXBlLCBjbGFzcyBSZXNUeXBlPgogICAgICAgICAgICAgc3RydWN0IEZ1bmN0aW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9OwogCiAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgQUYsIGNsYXNzIEFHPgogICAgICAgICAgICAgc3RydWN0IENsYXNzIDogRnVuY3Rpb248dHlwZW5hbWUgdHJhaXRzPEFGLCBBRz46OmFyZ190eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgdHJhaXRzPEFGLCBBRz46OnJlc190eXBlPgogICAgICAgICAgICAgewogICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAldGVtcGxhdGUodHJhaXRzX2RkKSB0cmFpdHMgPGRvdWJsZSwgZG91YmxlPjsKICAgICAgICAgICAgICV0ZW1wbGF0ZShGdW5jdGlvbl9kZCkgRnVuY3Rpb24gPGRvdWJsZSwgZG91YmxlPjsKICAgICAgICAgICAgICV0ZW1wbGF0ZShDbGFzc19kZCkgQ2xhc3MgPGRvdWJsZSwgZG91YmxlPjsKCgogICAgICAgICAgICBJbiB0aGlzIGV4YW1wbGUsIHRoZSBiYXNlIGNsYXNzIG9mICdDbGFzcycgaXMgZGV0ZXJtaW5lZCBmcm9tCiAgICAgICAgICAgIHRoZSBGdW5jdGlvbiB0ZW1wbGF0ZSwgYnV0IHRoZSB0eXBlcyBhcmUgb2J0YWluZWQgdGhyb3VnaCB0eXBlZGVmcy4KICAgICAgICAgICAgQmVjYXVzZSBvZiB0aGlzLCBTV0lHIGNvdWxkIG5vdCBsb2NhdGUgdGhlIHdyYXBwZWQgYmFzZSBjbGFzcwogICAgICAgICAgICAoRnVuY3Rpb248ZG91YmxlLGRvdWJsZT4pLiAgIFNob3VsZCBiZSBmaXhlZCBpbiAxLjMuMTMgZXZlbgogICAgICAgICAgICB0aG91Z2ggSSBjYW4gdGhpbmsgb2YgYSBtaWxsaW9uIG90aGVyIHRoaW5ncyB0aGF0IG1pZ2h0CiAgICAgICAgICAgIGFsc28gYmUgYnJva2VuLgoKMDYvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHByb2JsZW0gd2l0aCBjb252ZXJzaW9uIG9wZXJhdG9ycy4gIElmIHlvdSBoYWQgYW4KICAgICAgICAgICAgb3BlcmF0b3IgbGlrZSB0aGlzLAoKICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgZG91YmxlKCkgY29uc3Q7CgogICAgICAgICAgICBTV0lHIHdhcyBvbW1pdHRpbmcgdGhlICJjb25zdCIgcXVhbGlmaWVyLiAgVGhpcyBhZmZlY3RlZAogICAgICAgICAgICAlcmVuYW1lIGFuZCBvdGhlciBkaXJlY3RpdmVzLiAgUmVwb3J0ZWQgYnkgWmhvbmcgUmVuLgoKMDYvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBMZXNzZW5lZCB0aGUgc3RyaWN0bmVzcyBvZiBhYnN0cmFjdCBjbGFzcyBjaGVja2luZy4gIElmCiAgICAgICAgICAgIHlvdSBoYXZlIGNvZGUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBtZXRob2QoKSA9IDA7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGNsYXNzIEJhciA6IHB1YmxpYyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIEJhcigpOwogICAgICAgICAgICAgICAgICAgfkJhcigpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICBTV0lHIHdpbGwgZ28gYWhlYWQgYW5kIGdlbmVyYXRlIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3JzCiAgICAgICAgICAgICBmb3IgQmFyLiAgSG93ZXZlciwgaXQgd2lsbCBhbHNvIGdlbmVyYXRlIGEgd2FybmluZyBtZXNzYWdlIAogICAgICAgICAgICAgdGhhdCAiQmFyIiBtaWdodCBiZSBhYnN0cmFjdCAoc2luY2UgbWV0aG9kKCkgaXNuJ3QgZGVmaW5lZCkuCiAgICAgICAgICAgICBJbiBTV0lHLTEuMy4xMiwgU1dJRyByZWZ1c2VkIHRvIGdlbmVyYXRlIGEgY29uc3RydWN0b3IgYXQgYWxsLgoKMDYvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBDaGFuZ2UgdG8gJXRlbXBsYXRlIGRpcmVjdGl2ZS4gIElmIHlvdSBzcGVjaWZ5IHNvbWV0aGluZyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZpKSBzdGQ6OnZlY3RvcjxpbnQ+OwoKICAgICAgICAgICAgSXQgaXMgKmV4YWN0bHkqIHRoZSBzYW1lIGFzIHRoaXM6CiAKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBzdGQgewogICAgICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2aSkgdmVjdG9yPGludD47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBTV0lHLTEuMy4xMiB0cmllZCB0byBpbnN0YW50aWF0ZSB0aGUgdGVtcGxhdGUgb3V0c2lkZSBvZiB0aGUgbmFtZXNwYWNlCiAgICAgICAgICAgIHVzaW5nIHNvbWUgdHJpY2suICBIb3dldmVyLCB0aGlzIHdhcyBleHRyZW1lbHkgcHJvYmxlbWF0aWMgYW5kIGZ1bGwKICAgICAgICAgICAgaG9sZXMuICAgVGhpcyB2ZXJzaW9uIGlzIHNhZmVyLgoKMDYvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBidWcgd2l0aCBzY29wZSBxdWFsaWZpY2F0aW9uIGFuZCB0ZW1wbGF0ZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgQTxCOjpDPjo6REQKCiAgICAgICAgICAgIEJlZm9yZSwgdGhpcyB3YXMgc2VwYXJhdGVkIGFzIHNjb3BlcyBBPEIsIEM+LCBhbmQgREQuICBGaXhlZCBub3cuCgowNi8wNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFsbG93IHRoZSBmb2xsb3dpbmcgc3ludGF4OiAKICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIGNsYXNzIEEgeyB9OwogICAgICAgICAgICAgICBzdHJ1Y3QgQiA6IEEgeyAuLi4gfTsKCiAgICAgICAgICAgIEEgYmFzZSBjbGFzcyB3aXRob3V0IGEgc3BlY2lmaWVyIGlzIGFzc3VtZWQgdG8gYmUgcHVibGljIGZvciBhIHN0cnVjdC4KIAowNi8wNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN5bnRheCBlcnJvciB3aXRoIHRlbXBsYXRlIGNvbnN0cnVjdG9yIGluaXRpYWxpemVycy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjA2LzA2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYnVnIHdpdGggZGVmYXVsdCB0ZW1wbGF0ZSBhcmd1bWVudHMuIAogICAgICAgICAgICBSZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDYvMDUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzdWJ0bGUgcHJvYmxlbXMgd2l0aCAlcmVuYW1lIGRpcmVjdGl2ZSBhbmQgdGVtcGxhdGUKICAgICAgICAgICAgZXhwYW5zaW9uLgoKICAgICAgICAgICAgQ29kZSBsaWtlIHRoaXMgc2hvdWxkIG5vdyB3b3JrOgoKICAgICAgICAgICAgICAgJXJlbmFtZShibGFoKSBmb288ZG91YmxlPjo6bWV0aG9kOwogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgZm9vIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgdm9pZCBtZXRob2QoKTsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh3aGF0ZXZlcikgZm9vPGRvdWJsZT47CgowNi8wNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFJlc29sdmVkIHNvbWUgdHJpY2t5IGlzc3VlcyBvZiBtdWx0aS1wYXNzIGNvbXBpbGF0aW9uIGFuZCAKICAgICAgICAgICAgYW5kIGluaGVyaXRhbmNlLiAgVGhlIGZvbGxvd2luZyBzaXR1YXRpb24gbm93IGdlbmVyYXRlcwogICAgICAgICAgICBhbiBlcnJvcjoKCiAgICAgICAgICAgICAgICAgIGNsYXNzIEZvbyA6IHB1YmxpYyBCYXIgewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBjb2RlIGdlbmVyYXRlcyBhIHdhcm5pbmcgYWJvdXQgaW5jb21wbGV0ZSBjbGFzc2VzLgoKICAgICAgICAgICAgICAgICAgY2xhc3MgQmFyOwogICAgICAgICAgICAgICAgICBjbGFzcyBGb28gOiBwdWJsaWMgQmFyIHsgfTsKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgY29kZSBnZW5lcmF0ZXMgYSB3YXJuaW5nIGFib3V0IGFuIHVuZGVmaW5lZCBjbGFzcy4KCiAgICAgICAgICAgICAgICAgIGNsYXNzIEZvbyA6IHB1YmxpYyBCYXIgeyB9OyAgLy8gQmFyIHVuZGVmaW5lZAoKICAgICAgICAgICAgVGhpcyBmaXhlcyBhIGZhaWxlZCBhc3NlcnRpb24gYnVnIHJlcG9ydGVkIGJ5IEphc29uIFN0ZXdhcnQuCgowNi8wNS8yMDAyOiBsam9obnNvbgogICAgICAgICAgICBbUnVieV0gQWRkZWQgYSB3YXJuaW5nIG1lc3NhZ2UgZm9yIHRoZSBSdWJ5IG1vZHVsZSBhYm91dCB0aGUgbGFjawogICAgICAgICAgICBvZiBzdXBwb3J0IGZvciBtdWx0aXBsZSBpbmhlcml0YW5jZS4gT25seSB0aGUgZmlyc3QgYmFzZSBjbGFzcwogICAgICAgICAgICBsaXN0ZWQgaXMgdXNlZCBhbmQgdGhlIG90aGVycyBhcmUgaWdub3JlZC4gKFJlcG9ydGVkIGJ5IENyYWlnCiAgICAgICAgICAgIEZpbGVzKS4KICAgICAgICAgICAgCjA2LzAzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBidWcgd2l0aCBzdHJ1Y3QgZGVjbGFyYXRpb25zIGFuZCB0eXBlZGVmLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgRm9vIEZvbzsKICAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgQSBmZXcgb3RoZXIgc3VidGxlIHN0cnVjdCByZWxhdGVkIHR5cGluZyBwcm9ibGVtcyB3ZXJlCiAgICAgICAgICAgIGFsc28gcmVzb2x2ZWQuCgpWZXJzaW9uIDEuMy4xMiAoSnVuZSAyLCAyMDAyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAKMDUvMzAvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHJlbGF0ZWQgdG8gZm9yd2FyZCB0ZW1wbGF0ZSBjbGFzcyBkZWNsYXJhdGlvbnMgYW5kCiAgICAgICAgICAgIG5hbWVzcGFjZXMuICBCdWcgcmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjA1LzMwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgJ21ha2UgdW5pbnN0YWxsJyB0YXJnZXQuICBDb250cmlidXRlZCBieSBKb2VsIFJlZWQuCgowNS8yOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHJhdGhlciBpbnNpZGlvdXMgYnVnIHdpdGggJXJlbmFtZSwgJWZlYXR1cmUgYW5kIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlZXhjZXB0aW9uIHZlY3Rvcjo6X19nZXRpdGVtX18gewogICAgICAgICAgICAgICAgICAgICAuLi4gc29tZSBleGNlcHRpb24gLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgdmVjdG9yIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICBUIF9fZ2V0aXRlbV9fKGludCBpbmRleCk7ICAgICAgIC8vIEZpbmUKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgdGVtcGxhdGU8PiBjbGFzcyB2ZWN0b3I8aW50PiB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgVCBfX2dldGl0ZW1fXyhpbnQgaW5kZXgpOyAgICAgICAvLyBPb3BzLgogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIE5vdywgdGhlICVleGNlcHRpb24gZGlyZWN0aXZlIChhbmQgb3RoZXIgZmVhdHVyZXMpIHNob3VsZCBjb3JyZWN0bHkgYXBwbHkgdG8KICAgICAgICAgICAgYm90aCB2ZWN0b3IgYW5kIHNwZWNpYWxpemF0aW9ucy4KCjA1LzI5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU3VidGxlIGNoYW5nZXMgdG8gJXRlbXBsYXRlKCkgZGlyZWN0aXZlLiAgIFRlbXBsYXRlIGFyZ3VtZW50cyBhcmUgbm93CiAgICAgICAgICAgIHJlZHVjZWQgdG8gcHJpbWl0aXZlIHR5cGVzIGluIHRlbXBsYXRlIG1hdGNoaW5nLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyB2ZWN0b3I8VCAqPiB7CiAgICAgICAgICAgICAgICAuLi4gcGFydGlhbCBzcGVjaWFsaXphdGlvbiAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgKkludFB0cjsgICAgIC8vIEdyb3NzIHR5cGVkZWYKCiAgICAgICAgICAgICAgIC8vIEdldHMgdGhlIGFib3ZlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24KICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY3RvckludFB0cikgdmVjdG9yPEludFB0cj47CgogICAgICAgICAgICBUaGlzIGNoYW5nZSBpcyBleHRyZW1lbHkgc3VidGxlLCBidXQgaXQgZml4ZXMgYSBudW1iZXIgb2YgcG90ZW50aWFsCiAgICAgICAgICAgIGhvbGVzIGluIEx1aWdpJ3MgU1RMIGxpYnJhcnkgbW9kdWxlcy4gICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgSW50ZWdlcjsKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWN0b3JpKSB2ZWN0b3I8aW50PjsKCjA1LzI5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcmF0aGVyIGluc2lkaW91cyB0eXBlbWFwIGJ1ZyByZWxhdGVkIHRvIGNvbnN0LiAgY29uc3QKICAgICAgICAgICAgd2FzIGJlaW5nIGRpc2NhcmRlZCB0aHJvdWdoIHR5cGVkZWZzLgoKMDUvMjkvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIGlucHV0IHR5cGVtYXBzIGZvciBjb25zdCByZWZlcmVuY2VzIHRvIHByaW1pdGl2ZQogICAgICAgICAgICB0eXBlcyAoaW4gTGliL3J1YnkvcnVieS5zd2cpLgoKMDUvMjkvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBUaGUgamF2YSBhcnJyYXkgc3VwcG9ydCBmdW5jdGlvbnMgYXJlIGVuY2xvc2VkIGJ5IAogICAgICAgICAgICBhIFNXSUdfTk9BUlJBWVMgI2RlZmluZS4gVXNlZnVsIGlmIG5vdCB1c2luZyBhcnJheXMgYW5kIAogICAgICAgICAgICBpdCBpcyBkZXNpcmFibGUgdG8gbWluaW1pc2UgdGhlIGFtb3VudCBvZiBjb21waWxlZCBjb2RlLgoKMDUvMjkvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBFbnVtcyB3ZXJlIG5vdCByZW5hbWVkIHdoZW4gdXNpbmcgJW5hbWUgb3IgJXJlbmFtZQogICAgICAgICAgICBmaXguCgowNS8yOC8yMDAyOiBsam9obnNvbgogICAgICAgICAgICBbUnVieV0gTW9kaWZpZWQgdGhlIG5hbWUgb2YgdGhlIHdyYXBwZXIgZnVuY3Rpb25zIGZvciB0aGUKCSAgICAibmV3IiBzaW5nbGV0b24gbWV0aG9kIGFuZCAiaW5pdGlhbGl6ZSIgaW5zdGFuY2UgbWV0aG9kIGZvcgoJICAgIGNvbnNpc3RlbmN5IHdpdGggdGhlIG90aGVyIGxhbmd1YWdlIG1vZHVsZXMuIFRoZSB3cmFwcGVyIG5hbWUKCSAgICBmb3IgdGhlIGZ1bmN0aW9uIHRoYXQgaW1wbGVtZW50cyAibmV3IiBpcyBhbGxvY19jbGFzc25hbWUgYW5kCgkgICAgdGhlIHdyYXBwZXIgbmFtZSBmb3IgdGhlIGZ1bmN0aW9uIHRoYXQgaW1wbGVtZW50cyAiaW5pdGlhbGl6ZSIKCSAgICBpcyBuZXdfY2xhc3NuYW1lLgoKCjA1LzI3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQ2hhbmdlcyB0byBydW50aW1lLiAgUG9pbnRlciBjb252ZXJzaW9uL2NyZWF0aW9uIGZ1bmN0aW9ucwogICAgICAgICAgICBub3cgYWxtb3N0IGFsd2F5cyBoYXZlIGFuIGV4dHJhICJmbGFncyIgYXJndW1lbnQuICBGb3IKICAgICAgICAgICAgZXhhbXBsZToKCiAgICAgICAgICAgICAgU1dJR19Db252ZXJ0UHRyKG9iaiwgdm9pZCAqKiwgc3dpZ190eXBlX2luZm8gKnR5LCBpbnQgZmxhZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXgogICAgICAgICAgICBUaGlzIGV4dHJhIHBhcmFtZXRlciBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIGV4cGFuc2lvbiBhbmQgd2lsbAogICAgICAgICAgICBiZSB1c2VkIGZvciBtb3JlIGNvbnRyb2wgb3ZlciBwb2ludGVycyBpbiBmdXR1cmUgdmVyc2lvbnMuCgowNS8yNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeCBmb3IgQysrIGNsYXNzZXMgd2l0aCBwcml2YXRlIGFzc2lnbm1lbnQgb3BlcmF0b3JzLiAgSXQKICAgICAgICAgICAgaXMgbm93IHBvc3NpYmxlIHRvIHNhZmVseSByZXR1cm4gb2JqZWN0cyBsaWtlIHRoaXMgYnkgdmFsdWUuCiAgICAgICAgICAgIENhdmVhdDogIHRoZSBjbGFzcyBtdXN0IHByb3ZpZGUgYSBjb3B5IGNvbnN0cnVjdG9yLgoJICAgIAowNS8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIC1wcm94eSBvcHRpb24gYWRkZWQgdG8gbWFueSBsYW5ndWFnZSBtb2R1bGVzLiAgVGhpcyBpcyB0aGUKICAgICAgICAgICAgc2FtZSBhcyAtc2hhZG93LiAgV2UgYXJlIG1lcmVseSBjaGFuZ2luZyB0ZXJtaW5vbG9neS4KICAgICAgICAgICAgCjA1LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW3BlcmxdIEZpeGVkIHNvbWUgaW5jb25zaXN0ZW5jaWVzIGluIHRoZSAtcGFja2FnZSBvcHRpb24uCiAgICAgICAgICAgIC1wYWNrYWdlIG1lcmVseSBzZXRzIHRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgdXNlZCBvbiB0aGUKICAgICAgICAgICAgd3JhcHBlcnMuICBJdCBkb2VzIG5vdCBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5CiAgICAgICAgICAgIGZpbGUgb3IgdGhlIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCAucG0gZmlsZS4gIFRoaXMgd2FzCiAgICAgICAgICAgIGJyb2tlbiBhdCBzb21lIHBvaW50LCBidXQgd29ya3MgYWdhaW4gbm93LgoKMDUvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBbcGVybF0gRml4ZWQgWyA0NzU0NTIgXSBtZW1vcnkgbGVhayBpbiByZXR1cm4tYnktdmFsdWUuCiAgICAgICAgICAgIFByb2JsZW0gcmVsYXRlZCB0byBzdGF0aWMgbWVtYmVyIHZhcmlhYmxlcyByZXR1cm5pbmcgbmV3bHkKICAgICAgICAgICAgYWxsb2NhdGVkIG9iamVjdHMuIFJlcG9ydGVkIGJ5IFJveSBMZWNhdGVzLgogCjA1LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW3BlcmxdIEZpeGVkIFsgNTEzMTM0IF0gJUJMRVNTRURNRU1CRVJTIGlzbid0IGFsd2F5cyByaWdodC4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgRmxldXIgRGlhbmEgRHJhZ2FuLgoKMDUvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDU0MDczNSBdIC1pbXBvcnRhbGwgYW5kIHRoZSAtSSBvcHRpb24uCgowNS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtndWlsZV0gRml4ZWQgWyA1MzI3MjMgXSBEZWZhdWx0IGFyZyBmb3IgY2hhciogY2FuIFNlZ1YuICAKICAgICAgICAgICAgRXJyb3IgaW4gZ3VpbGUgbW9kdWxlLiAgUmVwb3J0ZWQgYnkgQnJldHQgV2lsbGlhbXMuCgowNS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFN1YnRsZSBjaGFuZ2UgdG8gdHlwZW1hcCBhcHBsaWNhdGlvbiBjb2RlLiAgVGhlICJmcmVlYXJnIgogICAgICAgICAgICB0eXBlbWFwIG11c3QgZXhhY3RseSBtYXRjaCB1cCB3aXRoIHRoZSAiaW4iIG9yICJpZ25vcmUiCiAgICAgICAgICAgIHR5cGVtYXAuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIChjaGFyICpkYXRhLCBpbnQgbGVuKSB7IC4uLiB9CiAgICAgICAgICAgICAgICAgJXR5cGVtYXAoZnJlZWFyZykgY2hhciAqZGF0YSB7IC4uLiB9CgogICAgICAgICAgICAgICAgIHZvaWQgZm9vKGNoYXIgKmRhdGEsIGludCBsZW4pOwoKICAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlICJpbiIgdHlwZW1hcCBpcyBhcHBsaWVkLCBidXQgdGhlCiAgICAgICAgICAgICBmcmVlYXJnIHR5cGVtYXAgaXMgbm90LiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBmcmVlYXJnCiAgICAgICAgICAgICB0eXBlbWFwIGRvZXNuJ3QgbWF0Y2ggdXAgd2l0aCB0aGUgaW5wdXQgYXJndW1lbnQgc2VxdWVuY2UuCgowNS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTQ4MjcyIF0gRGVmYXVsdCBhcmd1bWVudCBjb2RlIG1pc3NpbmcgYnJhY2VzLgogICAgICAgICAgICBSZXBvcnRlZCBieSBCcmV0dCBXaWxsaWFtcy4KCjA1LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1NDc3MzAgXSBTd2lnVmFsdWVXcmFwcGVyIG5lZWRlZCBmb3IgY29uc3RydWN0b3JzLgogICAgICAgICAgICBSZXBvcnRlZCBieSBXaWxsaWFtIEZ1bHRvbi4KCjA1LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVW5kZWZpbmVkIGlkZW50aWZpZXJzIG5vdyBldmFsdWF0ZSB0byAwIHdoZW4gZXZhbHVhdGluZwogICAgICAgICAgICBwcmVwcm9jZXNzb3IgZXhwcmVzc2lvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICNpZiAhRk9PCiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAjZW5kaWYKICAgICAgCiAgICAgICAgICAgIHdoZXJlIEZPTyBpcyB1bmRlZmluZWQgb3Igc2V0IHRvIHNvbWUgbm9uLW51bWVyaWMgdmFsdWUuCgogICAgICAgICAgICBGaXhlcyBbIDU0MDg2OCBdICNpZiBkZWZpbmVkIHdoYXRldmVyIC0gbm90IHBhcnNlZC4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQWRhbSBIdXBwLgoKIAowNS8yNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNXSUcgbm93IGlnbm9yZXMgdGhlIEMrKyAnZXhwb3J0JyBrZXl3b3JkLgoKMDUvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBTb21lIHJlZmluZW1lbnQgb2YgdHlwZS1uYW1lIG1hbmdsaW5nIHRvIGFjY291bnQgZm9yIHBvaW50ZXJzLCBhcnJheXMsCiAgICAgICAgICAgIHJlZmVyZW5jZXMsIGFuZCBvdGhlciBlbWJlZGRlZCB0eXBlIGNvbnN0cnVjdHMuCgowNS8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEluaXRpYWwgYXR0ZW1wdCBhdCBzdXBwb3J0aW5nIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24uICBBdAogICAgICAgICAgICB0aGUgdmVyeSBsZWFzdCwgaXQgaXMgcGFyc2VkIGFuZCB0aGUgY2xhc3NlcyBhcmUgc3RvcmVkLiAgTWF0Y2hpbmcKICAgICAgICAgICAgb2YgaW5zdGFudGlhdGlvbnMgdG8gc3BlY2lhbGl6ZWQgdmVyc2lvbiBpcyBtb3JlIGxpbWl0ZWQgYW5kIGJhc2VkIG9uCiAgICAgICAgICAgIHRoZSBTV0lHIGRlZmF1bHQgdHlwZW1hcCBydWxlczoKCiAgICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFICoKICAgICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgW10KICAgICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgJgoKICAgICAgICAgICAgTm93LCB3aHkgaW4gdGhlIHdvcmxkIHdvdWxkIHlvdSB3YW50IHRvIHVzZSB0aGlzIGZlYXR1cmU/ICBPdGhlcgogICAgICAgICAgICB0aGFuIGFsbG93aW5nIGZvciBzbGlnaHRseSBtb2RpZmllZCBjbGFzcyBBUElzLCB0aGlzIGNhcGFiaWxpdHkgaXMKICAgICAgICAgICAgcHJpbWFyaWx5IHVzZWQgdG8gcHJvdmlkZSBhZHZhbmNlZCB3cmFwcGluZyBzdXBwb3J0IGZvciBTVEwtbGlrZQogICAgICAgICAgICBvYmplY3RzLiAgSXQgY2FuIGFsc28gYmUgbWl4ZWQgd2l0aCB0eXBlbWFwcy4gIEhlcmUgaXMgYW4gZXhhbXBsZToKCgogICAgICAgICAgICAgICAgLyogR2VuZXJpYyB2ZXJzaW9uICovCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyB2ZWN0b3IgewogICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSB2ZWN0b3I8VD4gKiB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgY29udGFpbmVyIG9mIG9iamVjdHMgCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIC8qIFBhcnRpYWwgc3BlY2lhbGl6YXRpb24gKHBvaW50ZXJzKSAqLwogICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgdmVjdG9yPFQgKj4gewogICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSB2ZWN0b3I8VD4gKiB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgY29udGFpbmVyIG9mIHBvaW50ZXJzIHRvIG9iamVjdHMuCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIC8qIFNwZWNpYWxpemF0aW9uIChpbnRlZ2VycykuICovCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTw+IGNsYXNzIHZlY3RvcjxpbnQ+IHsKICAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgdmVjdG9yPGludD4gKiB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgY29udGFpbmVyIG9mIGludGVnZXJzLgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBGRUFUVVJFICoqKgogICAgICAgICAgICAKMDUvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBFbmhhbmNlbWVudCB0byB0eXBlbWFwcy4gICBOb3JtYWxseSwgdHlwZW1hcCB2YXJpYWJsZXMgYXJlCiAgICAgICAgICAgIHJlbmFtZWQgdG8gYXZvaWQgY29uZmxpY3RzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAldHlwZW1hcChpbikgaW50ICogKGludCB0ZW1wKSB7CiAgICAgICAgICAgICAgICAgICAgJDEgPSAmdGVtcDsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhpcyByZXN1bHRzIGluIGNvZGUgdGhhdCBjcmVhdGVzIGFuZCB1c2VzIHZhcmlhYmxlcyAidGVtcDEiLCJ0ZW1wMiIsIAogICAgICAgICAgICAidGVtcDMiIGFuZCBzbyBmb3J0aCBkZXBlbmRpbmcgb24gaG93IG1hbnkgdGltZXMgdGhlIHR5cGVtYXAgaXMgdXNlZC4KICAgICAgICAgICAgU29tZXRpbWVzIHlvdSB3YW50IGEgc2luZ2xlIHZhcmlhYmxlIGluc3RlYWQuICBUbyBkbyB0aGF0LCB1c2luZwogICAgICAgICAgICB0aGUgZm9sbG93aW5nIG5hbWluZyBzY2hlbWU6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludCAqKGludCBfZ2xvYmFsX3RlbXApIHsKICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICBJcyB0aGlzIGNhc2UsIGEgc2luZ2xlIHZhcmlhYmxlIF9nbG9iYWxfdGVtcCBpcyBlbWl0dGVkIGluIHRoZQogICAgICAgICAgICB3cmFwcGVyIGZ1bmN0aW9ucy4gIEl0IGlzIHNoYXJlZCBhY3Jvc3MgYWxsIHR5cGVtYXBzLiAgUmVwZWF0ZWQKICAgICAgICAgICAgdHlwZW1hcHMgZG8gbm90IHJlcGxpY2F0ZSB0aGUgdmFyaWFibGUtLS10aGV5IHVzZSB0aGUgZmlyc3Qgb25lCiAgICAgICAgICAgIGVtaXR0ZWQuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAKMDUvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBNaW5vciBlbmhhbmNlbWVudCB0byB0eXBlbWFwcy4gIElmIHlvdSBoYXZlIHRoaXMgY29kZSwKCiAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBGb28gKGludCBzb21ldmFyID0gMykgewogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHNvbWV2YXIgaXMgbm93IGVtaXR0ZWQgaW50byB0aGUgd3JhcHBlciBjb2RlLgoKMDUvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCAlZXh0ZW5kIHRvIGJlIGJldHRlciBiZWhhdmVkIGluIG5hbWVzcGFjZXMuICBJZiB5b3UgaGF2ZSBjb2RlCiAgICAgICAgICAgIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgZm9vIHsKICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJhciB7CiAgICAgICAgICAgICAgICAgICAgICAgICVleHRlbmQgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogIAogICAgICAgICAgICBTV0lHIG1hdGNoZXMgdGhlIGJsYWgoKSBtZXRob2QgdG8gYSBDIGZ1bmN0aW9uIG5hbWVkIAogICAgICAgICAgICB2b2lkIGZvb19iYXJfYmxhaChmb286OmJhciAqc2VsZikuCgogICAgICAgICAgICBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgbm9uLW5hbWVzcGFjZSB2ZXJzaW9uLgogICAgICAgICAgICBCdWcgcmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjA1LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmV3IGxpYnJhcnkgZmlsZXM6IGNwb2ludGVyLmksIGNhcnJheXMuaSwgY21hbGxvYy5pLiAgVGhlc2UKICAgICAgICAgICAgcHJvdmlkZSBhY2Nlc3MgdG8gQyBwb2ludGVycyBhbmQgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zLgogICAgICAgICAgICBTZWUgRG9jL01hbnVhbC9MaWJyYXJ5Lmh0bWwgZm9yIGRldGFpbHMuCgowNS8yMi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEMgdHlwZSBjaGFyIG5vIGxvbmdlciBtYXBzIHRvIEphdmEgdHlwZSBieXRlLCBidXQgdG8gSmF2YSB0eXBlIGNoYXIuCiAgICAgICAgICAgIEl0IGlzIG5vdyB0cmVhdGVkIGFzIGEgY2hhcmFjdGVyIHJhdGhlciB0aGFuIGEgc2lnbmVkIG51bWJlci4gVGhpcyBmaXRzIGluCiAgICAgICAgICAgIHdpdGggdGhlIG90aGVyIGxhbmd1YWdlIG1vZHVsZXMgYW5kIGlzIGEgbW9yZSBuYXR1cmFsIG1hcHBpbmcgYXMgY2hhciogaXMgCiAgICAgICAgICAgIG1hcHBlZCBhcyBhIHN0cmluZyBvZiBjaGFyYWN0ZXJzLiBOb3RlIHRoYXQgdGhlIEMgc2lnbmVkIGNoYXIgdHlwZSBpcyBzdGlsbAogICAgICAgICAgICBtYXBwZWQgdG8gYSBKYXZhIGJ5dGUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNS8yMi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEltcHJvdmVkIGNvbnN0YW50cyB3cmFwcGluZy4gQ29uc3RhbnRzICgjZGVmaW5lIGFuZCAlY29uc3RhbnQpIHZhbHVlcyAKICAgICAgICAgICAgYXJlIG5vdyBvYnRhaW5lZCB0aHJvdWdoIGEgSk5JIGNhbGwuIFByZXZpb3VzbHkgdGhlIHZhbHVlIHdhcyBjb21waWxlZCBhcyAKICAgICAgICAgICAgSmF2YSBjb2RlLCBidXQgdGhpcyBkaWRuJ3Qgd29yayBmb3IgYWxsIGNhc2VzLCBlZyAjZGVmaW5lIDEyM1VMTC4KCjA1LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYm9ndXMgZXJyb3IgbWVzc2FnZSB3aXRoICVleHRlbmQgZGlyZWN0aXZlIGFuZCBDKysKICAgICAgICAgICAgYWNjZXNzIHNwZWNpZmllcnMuICBSZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDUvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBOYW1lc3BhY2VzIGFuZCBlbnVtcyBub3cgd29yayBjb3JyZWN0bHkuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgRm9vIHsKICAgICAgICAgICAgICAgICAgICBlbnVtIEJhciB7IEEsIEIgfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEJ1ZyByZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDUvMjEvMjAwMjogYmVhemxleQogICAgICAgICAgICBUaGUgJXR5cGVzIGRpcmVjdGl2ZSBjYW4gbm93IGJlIHVzZWQgdG8gc3BlY2lmeSBpbmhlcml0YW5jZSByZWxhdGlvbnNoaXBzCiAgICAgICAgICAgIGluIHRoZSBydW50aW1lIHR5cGUgc3lzdGVtLiAgRm9yIGV4YW1wbGUsCgogICAgICAgICAgICAgICAgJXR5cGVzKEZvbyA9IEJhcik7CgogICAgICAgICAgICBzcGVjaWZpZXMgdGhhdCBGb28gaXNhIEJhci4gICAgVXNpbmcgdGhpcyBpcyBwb3RlbnRpYWxseSBxdWl0ZSBkYW5nZXJvdXMuCiAgICAgICAgICAgIEhvd2V2ZXIsIHRoaXMgaXMgdXNlZnVsIGluIGNlcnRhaW4gY2FzZXMgKGFuZCBpbiB0aGUgU1dJRyBsaWJyYXJ5KS4KICAgICAgICAgICAgCjA1LzIwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgJW5vZGVmYXVsdCBhbmQgJW1ha2VkZWZhdWx0IGRpcmVjdGl2ZXMgbm93IHJlcXVpcmUgYSB0cmFpbGluZyBzZW1pY29sb24uCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVub2RlZmF1bHQ7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICVtYWtlZGVmYXVsdDsKCiAgICAgICAgICAgIEluIGFkZGl0aW9uIGJvdGggZGlyZWN0aXZlcyBjYW4gdGFrZSBhIGNsYXNzIG5hbWUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlbm9kZWZhdWx0IEZvbzsKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28geyAgIC8qIE5vIGRlZmF1bHQgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciAqLwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBjbGFzcyBCYXIgeyAgLyogRGVmYXVsdCBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIGdlbmVyYXRlZCAqLwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICBJZiB5b3UgZG9uJ3QgdXNlIHRoZSB0cmFpbGluZyBzZW1pY29sb24sIHRoaW5ncyB3aWxsIG15c3RlcmlvdXNseSBicmVhay4KCjA1LzIwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTW9yZSBpbXByb3ZlbWVudHMgdG8gdHlwZSBzeXN0ZW0gaGFuZGxpbmcuICBTV0lHIG5vdyBjb3JyZWN0bHkgaGFuZGxlcwogICAgICAgICAgICB0ZW1wbGF0ZSBuYW1lcyBhbmQgcGFyYW1ldGVycyBpbiBhIG5hbWVzcGFjZS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIGZvbyB7CiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgYmFyIHsgfTsKICAgICAgICAgICAgICAgICAgICB0eXBlZGVmIGludCBJbnRlZ2VyOwoKICAgICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoYmFyPEludGVnZXI+ICp4KTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBJbiB0aGUgZ2VuZXJhdGVkIGNvZGUsIGFsbCBvZiB0aGUgdHlwZW5hbWVzIGFyZSBwcm9wZXJseSBxdWFsaWZpZWQuCgowNS8xNy8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIGRlcHJlY2F0ZWQgYnJva2VuIC1qbmljIGFuZCAtam5pY3BwIGNvbW1hbmRsaW5lIG9wdGlvbnMuIFRoZSBDIG9yIEMrKyAKICAgICAgICAgICAgSk5JIGNhbGxpbmcgY29udmVudGlvbiBpcyBub3cgZGV0ZXJtaW5lZCBmcm9tIHRoZSAtYysrIGNvbW1hbmRsaW5lIG9wdGlvbi4KCjA1LzE2LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gVGhlIEpDQUxMIG1hY3JvcyB3aGljaCBleGlzdCBzbyB0aGF0IHRoZSBzYW1lIHR5cGVtYXBzIGNhbiBiZSB1c2VkCiAgICAgICAgICAgIGZvciBnZW5lcmF0aW5nIGJvdGggdGhlIEMgYW5kIEMrKyBKTkkgY2FsbGluZyBjb252ZW50aW9ucyBubyBsb25nZXIgYXBwZWFyCiAgICAgICAgICAgIGluIHRoZSBnZW5lcmF0ZWQgY29kZS4gVGhpcyBpcyBiZWNhdXNlIHRoZSBvdXRwdXQgaXMgbm93IHBhc3NlZCB0aHJvdWdoIHRoZSAKICAgICAgICAgICAgU1dJRyBwcmVwcm9jZXNzb3Igd2hpY2ggZG9lcyB0aGUgbWFjcm8gZXhwYW5zaW9uIGZvciBlaXRoZXIgQyBvciBDKysgKGRlcGVuZGluZwogICAgICAgICAgICBvbiB3aGV0aGVyIC1jKysgaXMgcGFzc2VkIG9uIHRoZSBTV0lHIGNvbW1hbmRsaW5lKS4KCiAgICAgICAgICAgIFRoZSBnZW5lcmF0aW9uIG9mIHRoZSBmdW5jdGlvbnMgdXNlZCBpbiB0aGUgYXJyYXkgdHlwZW1hcHMgaGF2ZSBiZWVuIGFkanVzdGVkIAogICAgICAgICAgICB0byB0YWtlIGFjY291bnQgb2YgdGhpcy4gVGhlIHNpZGUgZWZmZWN0IGlzIHRoYXQgYW55IHR5cGVtYXBzIHdoaWNoIGNvbnRhaW5lZCAKICAgICAgICAgICAgSkNBTEwgbWFjcm9zIHdpdGhpbiAleyAlfSBicmFja2V0cyB3aWxsIGhhdmUgdG8gYmUgbW92ZWQgd2l0aGluIHt9IGJyYWNrZXRzIAogICAgICAgICAgICBzbyB0aGF0IHRoZSBTV0lHIHByZXByb2Nlc3NvciBjYW4gZXhwYW5kIHRoZSBtYWNyb3MuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNS8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIENsYXNzIHRlbXBsYXRlcyBtYXkgbm93IGJlIHVzZWQgYXMgdGVtcGxhdGUgcGFyYW1ldGVycy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBULCB0ZW1wbGF0ZTxjbGFzcz4gY2xhc3MgQz4gY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAldGVtcGxhdGUoRm9vaSkgRm9vPGludCwgQmFyPjsKICAgICAKICAgICAgICAgICAgU1dJRyBkb2Vzbid0IHJlYWxseSBkbyBhbnl0aGluZyBzcGVjaWFsIHdpdGggdGhpcy0tLWl0J3MganVzdAogICAgICAgICAgICBhbm90aGVyIHdheSBvZiBzcGVjaWZ5aW5nIGEgdGVtcGxhdGUgcGFyYW1ldGVyLiAgCiAgICAgICAgIAowNS8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1pbm9yIHJlZmluZW1lbnQgb2YgdGVtcGxhdGUgc3VwcG9ydC4gIFRlbXBsYXRlIHBhcmFtZXRlciBuYW1lcyBhcmUgbm8gbG9uZ2VyCiAgICAgICAgICAgIHJlcXVpcmVkIGZvciB0eXBlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIHRlbXBsYXRlPGJvb2w+IGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgT2J2aW91c2x5LCBuYW1lcyBhcmUgcmVxdWlyZWQgZm9yIHRlbXBsYXRlPGNsYXNzIFQ+OwoKMDUvMTIvMjAwMjogYmVhemxleQogICAgICAgICAgICBOZXcgbWFjcm8gZXhwYW5zaW9uIGluIHR5cGVtYXBzLiAgVGhlIHNlcXVlbmNlOgoKICAgICAgICAgICAgICAgICRkZXNjcmlwdG9yKHR5cGUpCgogICAgICAgICAgICBXaWxsIGV4cGFuZCBpbnRvIHRoZSBTV0lHIHR5cGUgZGVzY3JpcHRvciBzdHJ1Y3RvciBmb3IKICAgICAgICAgICAgdGhlIGdpdmVuIHR5cGUuICBUeXBlIG1heSBiZSBhbnkgYWJzdHJhY3QgZGF0YXR5cGUuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICRkZXNjcmlwdG9yKGludCAqKQogICAgICAgICAgICAgICAgJGRlc2NyaXB0b3IoaW50ICgqKShpbnQsZG91YmxlKSkKICAgICAgICAgICAgICAgICRkZXNjcmlwdG9yKHZlY3RvcjxpbnQ+ICopCgogICAgICAgICAgICBDYXZlYXQ6IEl0IGlzICpOT1QqIGN1cnJlbnRseSBsZWdhbCB0byB1c2Ugb3RoZXIgdHlwZW1hcAogICAgICAgICAgICBzdWJzdGl0dXRpb24gdmFyaWFibGVzIGluIHRoZSBtYWNyby4gIEZvciBleGFtcGxlIAogICAgICAgICAgICAkZGVzY3JpcHRvcigkMV90eXBlKS4KCiAgICAgICAgICAgIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgdGhpcyBtb2RpZmljYXRpb24gaXMgdG8gYmV0dGVyCiAgICAgICAgICAgIHN1cHBvcnQgdHlwZW1hcHMgZm9yIGNvbnRhaW5lciBvYmplY3RzIG9yIHRvIGFsbG93IHR5cGVtYXBzCiAgICAgICAgICAgIHRoYXQgbWlnaHQgYmUgcGVyZm9ybWluZyB0eXBlIGNvbnZlcnNpb25zLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowNS8xMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFRoZSB3cmFwcGluZyBvZiByZWZlcmVuY2VzIHRvIHByaW1pdGl2ZSB0eXBlcyBoYXMgYmVlbgogICAgICAgICAgICBjaGFuZ2VkIGFzIGZvbGxvd3M6CgogICAgICAgICAgICBBcmd1bWVudHMgb2YgdHlwZSAnY29uc3QgcHJpbWl0aXZlICYnIGFyZSBub3cgcGFzc2VkCiAgICAgICAgICAgIGJ5IHZhbHVlIGFzIG9wcG9zZWQgdG8gcG9pbnRlcnMuICBSZXR1cm4gdmFsdWVzIG9mCiAgICAgICAgICAgIHR5cGUgJ2NvbnN0IHByaW1pdGl2ZSAmJyBhcmUgcmV0dXJuZWQgYXMgdmFsdWVzIGluc3RlYWQgb2YKICAgICAgICAgICAgcG9pbnRlcnMuCgogICAgICAgICAgICAncHJpbWl0aXZlJyBpcyBhbnkgb25lIG9mIGludCwgc2hvcnQsIGxvbmcsIGxvbmcgbG9uZywKICAgICAgICAgICAgY2hhciwgZmxvYXQsIGRvdWJsZSwgYm9vbCAoYXMgd2VsbCBhcyB1bnNpZ25lZCB2YXJpYW50cykuCiAgICAgICAgICAgIAogICAgICAgICAgICBUaGlzIGNoYW5nZSBpcyBiZWluZyBtYWRlIHRvIGJldHRlciBzdXBwb3J0IEMrKyB3cmFwcGluZy0tZXNwZWNpYWxseQogICAgICAgICAgICBjb2RlIHRoYXQgbWFrZXMgdXNlIG9mIHRlbXBsYXRlcyBhbmQgdGhlIFNUTC4KICAgICAgICAgICAgCjA1LzExLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgY2FuIG5vdyBiZSB1c2VkIHRvIGFjY2VzcyB0ZW1wbGF0ZXMKICAgICAgICAgICAgaW4gYSBuYW1lc3BhY2UuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2Ugc3RkIHsKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBjb21wbGV4IHsKICAgICAgICAgICAgICAgICAgICAgICBUIHJlLCBpbTsKICAgICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgY29tcGxleChUIF9yID0gVCgpLCBUIF9pID0gVCgpKSA6IHJlKF9yKSwgaW0oX2kpIHsgfQogICAgICAgICAgICAgICAgICAgICAgIFQgcmVhbCgpIHsgcmV0dXJuIHJlOyB9CiAgICAgICAgICAgICAgICAgICAgICAgVCBpbWFnKCkgeyByZXR1cm4gaW07IH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShjb21wbGV4KSBzdGQ6OmNvbXBsZXg8ZG91YmxlPjsKCiAgICAgICAgICAgIE5vdGU6IFRoZXJlIGFyZSBzb21lIHZlcnkgc3VidGxlIG5hbWVzcGFjZS9zeW1ib2wgdGFibGUgCiAgICAgICAgICAgIG1hbmFnZW1lbnQgaXNzdWVzIGludm9sdmVkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzLgogICAgICAgICAgICBJdCBtYXkgbm90IHdvcmsgaW4gY2VydGFpbiBjYXNlcy4KCjA1LzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWVtYmVyIHRlbXBsYXRlIGNvbnN0cnVjdG9yIHN1cHBvcnQgYWRkZWQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX1QyPiAKICAgICAgICAgICAgICAgc3RydWN0IHBhaXIgewogICAgICAgICAgICAgICAgIF9UMSBmaXJzdDsKICAgICAgICAgICAgICAgICBfVDIgc2Vjb25kOwogICAgICAgICAgICAgICAgIHBhaXIoKSA6IGZpcnN0KF9UMSgpKSwgc2Vjb25kKF9UMigpKSB7IH0KICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBfVTEsIGNsYXNzIF9VMj4gcGFpcihjb25zdCBwYWlyPF9VMSxfVTI+ICZ4KTsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRvIGluc3RhbnRpYXRlIHRoZSB0ZW1wbGF0ZSwgdXNlICV0ZW1wbGF0ZSBhbmQgJWV4dGVuZC4KICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHRoaXMgZXhwYW5kcyB0aGUgY29uc3RydWN0b3IgaW50byBhIGRlZmF1bHQKICAgICAgICAgICAgY29weSBjb25zdHJ1Y3RvcjoKCiAgICAgICAgICAgICAgICVleHRlbmQgcGFpciB7CiAgICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShwYWlyKSBwYWlyPF9UMSxfVDI+OwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBIaWdobHkgZXhwZXJpbWVudGFsLiAgT3RoZXIgdXNlcyBtYXkgYmUgYnJva2VuLgoKMDUvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBUaGUgJWV4dGVuZCAoJWFkZG1ldGhvZHMpIGRpcmVjdGl2ZSBubyBsb25nZXIgd29ya3MgdW5sZXNzCiAgICAgICAgICAgIGl0IGFwcGVhcnMgaW4gdGhlIHB1YmxpYyBzZWN0aW9uIG9mIGEgY2xhc3MuICAgQW4gZXJyb3IKICAgICAgICAgICAgbWVzc2FnZSBpcyBub3cgZ2VuZXJhdGVkIChhcyBvcHBvc2VkIHRvIGEgc2VnbWVudGF0aW9uIGZhdWx0KS4KCjA1LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmV3ICV3YXJuZmlsdGVyKCkgZGlyZWN0aXZlLiAgVGhpcyBkaXJlY3RpdmUgYXR0YWNoZXMgYSB3YXJuaW5nCiAgICAgICAgICAgIGZpbHRlciB0byBzcGVjaWZpYyBkZWNsYXJhdGlvbnMgYW5kIGhhcyB0aGUgc2FtZSBzZW1hbnRpY3MgYXMKICAgICAgICAgICAgJXJlbmFtZSwgJWlnbm9yZSwgJWZlYXR1cmUsIGFuZCBzbyBmb3J0aC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJXdhcm5maWx0ZXIoNTAxKSBmb287ICAgLy8gU3VwcHJlc3Mgb3ZlcmxvYWRlZCB3YXJuaW5nCiAgICAgICAgICAgICAgIGludCBmb28oaW50KTsKICAgICAgICAgICAgICAgaW50IGZvbyhkb3VibGUpOyAKCiAgICAgICAgICAgIG9yCgogICAgICAgICAgICAgICAld2FybmZpbHRlcig1MDEpIE9iamVjdDo6Zm9vKGRvdWJsZSk7CiAgICAgICAgICAgICAgIGNsYXNzIE9iamVjdCB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgaW50IGZvbyhpbnQpOwogICAgICAgICAgICAgICAgICBpbnQgZm9vKGRvdWJsZSk7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGlzIGZlYXR1cmUgb25seSBzdXBwcmVzc2VzIHdhcm5pbmdzIGluIGxhdGVyIHN0YWdlcyBvZiBjb2RlCiAgICAgICAgICAgIGdlbmVyYXRpb24uICBJdCBkb2VzIG5vdCBzdXBwcmVzcyB3YXJuaW5ncyByZWxhdGVkIHRvIHByZXByb2Nlc3NpbmcKICAgICAgICAgICAgb3IgcGFyc2luZy4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDUvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBTV0lHIG5vdyBzdXBwb3J0cyBDOTkgdmFyaWFkaWMgcHJlcHJvY2Vzc29yIG1hY3Jvcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgI2RlZmluZSBkZWJ1Z2YoZm10LC4uLikgZnByaW50ZihzdGRlcnIsZm10LF9fVkFfQVJHU19fKQoKICAgICAgICAgICAgVGhlIGFyZ3VtZW50ICIuLi4iIGlzIHVzZWQgdG8gaW5kaWNhdGUgdmFyaWFibGUgYXJndW1lbnRzIHdoaWNoCiAgICAgICAgICAgIGFyZSBhbGwgcGxhY2VkIGludG8gdGhlIHNwZWNpYWwgYXJndW1lbnQgbmFtZSBfX1ZBX0FSR1NfXyBpbgogICAgICAgICAgICB0aGUgbWFjcm8gZXhwYW5zaW9uLiAgCgogICAgICAgICAgICBTV0lHIGFsc28gaW1wbGVtZW50cyB0aGUgR05VICgjIykgZXh0ZW5zaW9uIGZvciBzd2FsbG93aW5nIHRoZQogICAgICAgICAgICBwcmVjZWRpbmcgY29tbWEgd2hlbiBfX1ZBX0FSR1NfXyBpcyBlbXB0eS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAjZGVmaW5lIGRlYnVnZihmbXQsLi4uKSBmcHJpbnRmKHN0ZGVycixmbXQsICMjX19WQV9BUkdTX18pCgogICAgICAgICAgICBIZXJlIGlzIGhvdyB0aGlzIGlzIGV4cGFuZGVkOgoKICAgICAgICAgICAgICAgZGVidWdmKCIlZCIsIDMpICAtLT4gZnByaW50ZihzdGRlcnIsIiVkIiwzKQogICAgICAgICAgICAgICBkZWJ1Z2YoIkhlbGxvIikgIC0tPiBmcHJpbnRmKHN0ZGVyciwiSGVsbG8iICkKCiAgICAgICAgICAgIChub3RpY2UgdGhlIGRlbGV0ZWQgY29tbWEpLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowNS8wOC8yMDAyOiBzYW1qYW0gKFNhbSBMaWRkaWNvdHQpCiAgICAgICAgICAgIE1hbnkgY2hhbmdlcyB0byBwaHAgbW9kdWxlLiAgU2hhZG93IGNsYXNzZXMgYXJlIG5vdyBpbXBsZW1lbnRlZAogICAgICAgICAgICBlbnRpcmVseSBpbiBuYXRpdmUgQyBhbmQgbm8gbmVlZCBmb3IgcGhwLWNvZGUgc2hhZG93IHdyYXBwZXJzCiAgICAgICAgICAgIFBvcHVsYXRlZCB0ZW1wbGF0ZSBjb25maWcubTQgYW5kIE1ha2VmaWxlLmluIGFzIG5lZWRlZCBieQogICAgICAgICAgICBwaHBpemUgYXJlIGdlbmVyYXRlZC4KCjA1LzA4LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBIGNvcHkgY29uc3RydWN0b3IgaXMgbm93IHR1cm5lZCBpbnRvIGEgImNsb25lIgogICAgICAgICAgICBpbnN0YW5jZSBtZXRob2QgKHNlZSBEYXZlJ3MgY2hhbmdlIGZvciBjb3B5IGNvbnN0cnVjdG9ycwogICAgICAgICAgICBkYXRlZCA0LzcvMjAwMikuIFRoaXMgc2VlbXMgbGlrZSB0aGUgYXBwcm9wcmlhdGUgdGhpbmcKICAgICAgICAgICAgdG8gZG8gZm9yIFJ1YnkgY29kZS4KCjA1LzA4LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBGaXhlZCBbIDU1Mzg2NCBdIElubGluZSBkZXN0cnVjdG9yIGNvZGUgbm90IHdyaXR0ZW4uCgowNS8wOC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgICVpZ25vcmUgYmVoYXZlcyBiZXR0ZXIgd2l0aCBjb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3JzLCBhbmQgdGhlCiAgICAgICAgICAgIHR5cGUgc3lzdGVtIGluIGdlbmVyYWwuICAgRm9yIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMsCiAgICAgICAgICAgICVpZ25vcmUgbm93IHN1cHByZXNzZXMgdGhlIGNyZWF0aW9uIG9mIGEgZGVmYXVsdCBjb25zdHJ1Y3RvcgogICAgICAgICAgICBvciBkZXN0cnVjdG9yLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICVpZ25vcmUgfkZvbzsKICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgRm9vKCk7CiAgICAgICAgICAgICAgICAgICAgfkZvbygpOwogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgSW4gU1dJRy0xLjMuMTEsIH5Gb28oKSBzaW1wbHkgImRpc2FwcGVhcmVkIiBhbmQgdGhlIGNvZGUgZ2VuZXJhdG9yCiAgICAgICAgICAgIGNyZWF0ZWQgYSB3cmFwcGVyIGZvciBhIGRlZmF1bHQgZGVzdHJ1Y3RvciAoYXMgaWYgaXQgd2FzIG5ldmVyCiAgICAgICAgICAgIGRlY2xhcmVkIGluIHRoZSBpbnRlcmZhY2UpLiAgSW4gU1dJRy0xLjMuMTIsICVpZ25vcmUgc3VwcHJlc3NlcwogICAgICAgICAgICB0aGUgY3JlYXRpb24gb2YgYSBkZXN0cnVjdG9yIGlmIG9uZSBpcyBhY3R1YWxseSBkZWZpbmVkLiAKCiAgICAgICAgICAgIFNpbWlsYXJseSwgZXZlbiB0aG91Z2ggYSBkZWNsYXJhdGlvbiBpcyBpZ25vcmVkLCBpbmZvcm1hdGlvbgogICAgICAgICAgICBtYXkgc3RpbGwgYmUgbmVlZGVkIHRvIHByb3Blcmx5IGhhbmRsZSB0eXBlcy4gRm9yIGV4YW1wbGUsIGhlcmUKICAgICAgICAgICAgaXMgYSB2ZXJ5IHN1YnRsZSBlcnJvciB0aGF0IGlzIGZpeGVkIGJ5IHRoaXMgY2hhbmdlOgoKICAgICAgICAgICAgICAgICVpZ25vcmUgc3RkOjpzdHJpbmc7ICAgICAgICAgLy8gUHJldmVudCBjbGFzcyB3cmFwcGluZwogICAgICAgICAgICAgICAgbmFtZXNwYWNlIHN0ZCB7CiAgICAgICAgICAgICAgICAgICBjbGFzcyBzdHJpbmcgewogICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgc3RyaW5nICogewogICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdm9pZCBmb28oc3RkOjpzdHJpbmcgKnMpOyAgIC8vIEJyb2tlbi4KCiAgICAgICAgICAgIEJlZm9yZSB0aGlzIGZpeCwgJWlnbm9yZSB3b3VsZCBjYXVzZSB0aGUgY2xhc3MgZGVmaW5pdGlvbiB0byBkaXNhcHBlYXIuCiAgICAgICAgICAgIFRoaXMsIGluIHR1cm4sIHdvdWxkIGNhdXNlIHRoZSB0eXBlbWFwIHRvIGJlIG1pc2FwcGxpZWQuIAogCjA1LzA4LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWlub3IgY2hhbmdlcyB0byAlcmVuYW1lLCAlaWdub3JlLCAlZmVhdHVyZSwgYW5kIHJlbGF0ZWQgZGlyZWN0aXZlcwogICAgICAgICAgICBmb3IgYmV0dGVyIHN1cHBvcnQgb2YgZGVzdHJ1Y3RvcnMuICBEZXN0cnVjdG9ycyBjYW4gbm93IGJlIHByZWNpc2VseQogICAgICAgICAgICB0YWdnZWQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICVpZ25vcmUgRm9vOjp+Rm9vOwogICAgICAgICAgICAgICAgICAlZmVhdHVyZSgiYWN0aW9uIikgfkJhciB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgCiAgICAgICAgICAgICpEZXZlbG9wZXIgd2FybmluZyogCiAgICAgICAgICAgIE9wZXJhdGlvbnMgc3VjaCBhcyByZW5hbWluZyBhbmQgZmVhdHVyZSBhdHRhY2htZW50IGZvciBjbGFzc2VzIHVzZWQgdG8KICAgICAgICAgICAgYmUgYXBwbGllZCB0byBkZXN0cnVjdG9ycyBhcyB3ZWxsLiAgRm9yIGluc3RhbmNlLCBpZiB5b3UgZGlkIHRoaXM6CiAKICAgICAgICAgICAgICAgICAlcmVuYW1lKEJhcikgRm9vOwoKICAgICAgICAgICAgVGhlIG9wZXJhdGlvbiBhcHBsaWVkIHRvIHRoZSBjbGFzcyBpdHNlbGYsIHRoZSBjb25zdHJ1Y3RvciwgYW5kCiAgICAgICAgICAgIHRoZSBkZXN0cnVjdG9yLiAgIFRoaXMgaXMgbm8gbG9uZ2VyIHRoZSBjYXNlLiAgTm93IHN1Y2ggb3BlcmF0aW9ucwogICAgICAgICAgICB3aWxsIG9ubHkgYXBwbHkgdG8gdGhlIGNsYXNzIGFuZCB0aGUgY29uc3RydWN0b3IuICBOb3RlOiBpZiB5b3UKICAgICAgICAgICAgd2VyZSByZWx5aW5nIG9uIHRoaXMgZm9yIGNsYXNzIHJlbmFtaW5nLCBiZSBhd2FyZSB0aGF0IHJlbmFtZWQKICAgICAgICAgICAgY2xhc3NlcyBzaG91bGQgcmVhbGx5IG9ubHkgYmUgaGFuZGxlZCBhdCB0aGUgbGV2ZWwgb2YgdGhlIGNsYXNzIGl0c2VsZgogICAgICAgICAgICBhbmQgbm90IHRoZSBsZXZlbCBvZiBpbmRpdmlkdWFsIGRlY2xhcmF0aW9ucyBpbiB0aGUgY2xhc3MgKGFsdGhvdWdoCiAgICAgICAgICAgIHRoZXkgY2FuIGJlIHJlbmFtZWQgaW5kaXZpZHVhbGx5IGlmIG5lZWRlZCkuICBBcyBmYXIgYXMgSSBrbm93LAogICAgICAgICAgICB0aGUgTGFuZ3VhZ2UgY2xhc3MgaXMgYWxyZWFkeSB0YWtpbmcgY2FyZSBvZiB0aGlzIGNhc2UgY29ycmVjdGx5LgoKMDUvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBOZXcgc2V0IG9mIHRlc3RzLiAgVGhlIEV4YW1wbGVzL3Rlc3Qtc3VpdGUvZXJyb3JzIGRpcmVjdG9yeSBjb250YWlucwogICAgICAgICAgICB0ZXN0cyB0aGF0IHRyeSB0byBleGVyY2lzZSBhbGwgb2YgU1dJRydzIGVycm9yIGFuZCB3YXJuaW5nIG1lc3NhZ2VzLgoKMDUvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBTdGFydCBvZiBhIHdhcm5pbmcgZnJhbWV3b3JrLiAgV2FybmluZyBtZXNzYWdlcyBhcmUgbm93IGFzc2lnbmVkIG51bWVyaWMgdmFsdWVzCiAgICAgICAgICAgIHRoYXQgYXJlIHNob3duIGluIHdhcm5pbmcgbWVzc2FnZXMuICAgVGhlc2UgY2FuIGJlIHN1cHByZXNzZWQgdXNpbmcgdGhlCiAgICAgICAgICAgIC13IG9wdGlvbi4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICBzd2lnIC13MzAyIGV4YW1wbGUuaQogICAgICAgICAgICAgICAgIHN3aWcgLXczMDIsMzA1IGV4YW1wbGUuaQoKICAgICAgICAgICAgQWx0ZXJuYXRpdmVseSwgdGhlICNwcmFnbWEgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0byBkaXNhYmxlIHRoaXM6CgogICAgICAgICAgICAgICAgICNwcmFnbWEgU1dJRyBub3dhcm49MzAyCiAgICAgICAgICAgICAgICAgI3ByYWdtYSBTV0lHIG5vd2Fybj0zMDIsMzA1CgogICAgICAgICAgICBOb3RlOiBTaW5jZSBTV0lHIGlzIGEgbXVsdGktcGFzcyBjb21waWxlciwgdGhpcyBwcmFnbWEgc2hvdWxkCiAgICAgICAgICAgIG9ubHkgYmUgdXNlZCB0byBjaGFuZ2UgZ2xvYmFsIHNldHRpbmdzIG9mIHRoZSB3YXJuaW5nIGZpbHRlci4gIEl0IHNob3VsZAogICAgICAgICAgICBub3QgYmUgdXNlZCB0byBzZWxlY3RpdmVseSBlbmFibGUvZGlzYWJsZSB3YXJuaW5ncyBpbiBhbiBpbnRlcmZhY2UgZmlsZS4KICAgICAgICAgICAgVGhlIGhhbmRsaW5nIG9mICNwcmFnbWEgb2NjdXJzIGluIHRoZSBDKysgcHJlcHJvY29lc3NvciBhbmQgYWZmZWN0cyBhbGwgCiAgICAgICAgICAgIHN1YnNlcXVlbnQgc3RhZ2VzIG9mIGNvbXBpbGF0aW9uLgoKICAgICAgICAgICAgVGhlIC1XYWxsIG9wdGlvbiB0dXJucyBvbiBhbGwgd2FybmluZ3MgYW5kIG92ZXJyaWRlcyBhbnkgZmlsdGVycyB0aGF0CiAgICAgICAgICAgIG1pZ2h0IGhhdmUgYmVlbiBzZXQuCgogICAgICAgICAgICBXYXJuaW5ncyBjYW4gYmUgaXNzdWVkIGZyb20gYW4gaW50ZXJmYWNlIHVzaW5nICV3YXJuLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICV3YXJuICIxMTA6JXNlY3Rpb24gaXMgZGVwcmVjYXRlZCIKCiAgICAgICAgICAgIFRoZSBmaXJzdCBwYXJ0IG9mIGEgd2FybmluZyBtZXNzYWdlIGlzIGFuIG9wdGlvbmFsIHdhcm5pbmcgbnVtYmVyLgogICAgICAgICAgICBBIGNvbXBsZXRlIHNldCBvZiB3YXJuaW5nIG51bWJlcnMgaXMgZm91bmQgaW4gU291cmNlL0luY2x1ZGUvc3dpZ3dhcm4uaC4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDUvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBJbnRlcm5hbCBwYXJzaW5nIGNoYW5nZS4gICBEaXJlY3RpdmVzIHRvIGluY2x1ZGUgZmlsZXMgbm93IHVzZSBicmFja2V0cyBbIC4uLiBdCiAgICAgICAgICAgIGluc3RlYWQgb2YgeyAuLi4gfS4gICAKCiAgICAgICAgICAgICAgICAgICVpbmNsdWRlZmlsZSAiZm9vLmkiIFsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIF0KCiAgICAgICAgICAgIFRoZSB1c2Ugb2YgeyAuLi4gfSB3YXMgYSBiYWQgY2hvaWNlIGJlY2F1c2UgdGhleSB3ZXJlIGluY2x1ZGVkIGltcGxpY2l0bHkgYnkKICAgICAgICAgICAgdGhlIHByZXByb2Nlc3NvciBhbmQgbWFkZSBpdCBpbXBvc3NpYmxlIHRvIHByb3Blcmx5IGRldGVjdCBsZWdpdGltYXRlIG1pc3NpbmcgJ30nIAogICAgICAgICAgICBlcnJvcnMuCgowNC8xNi8yMDAyLQowNS8wMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNXSUcgRXVyb3BlYW4gVG91cjogUGFyaXMtQW1zdGVyZGFtLUJhdGguCgowNC8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFRoZSAlYWRkbWV0aG9kcyBkaXJlY3RpdmUgaGFzIGJlZW4gcmVuYW1lZCB0byAlZXh0ZW5kLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICVleHRlbmQgRm9vIHsKICAgICAgICAgICAgICAgICAgIGludCBibGFoKCkgeyAuLi4gfTsKICAgICAgICAgICAgICAgICAgIGludCBiYXIoKSB7IC4uLiB9OwogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgTW90aXZhdGlvbjogdGhlICVhZGRtZXRob2RzIGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCBmb3IgbWFueQogICAgICAgICAgICBvdGhlciB0YXNrcyBpbmNsdWRpbmcgYWRkaW5nIHN5bnRoZXNpemVkIGF0dHJpYnV0ZXMsIGNvbnN0cnVjdG9ycywKICAgICAgICAgICAgYW5kIHR5cGVtYXBzLiBCZWNhdXNlIG9mIHRoaXMsICJhZGRtZXRob2RzIiBpcyBzb21ld2hhdCBtaXNsZWFkaW5nLgogICAgICAgICAgICAlZXh0ZW5kIG1vcmUgcHJlY2lzZWx5IGRlc2NyaWJlcyB0aGlzIG9wZXJhdGlvbi0tLWV4dGVuc2lvbiBvZiBhCiAgICAgICAgICAgIGNsYXNzIG9yIHN0cnVjdHVyZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICAlYWRkbWV0aG9kcyBzdGlsbCB3b3JrcyB2aWEgYSBtYWNybyBkZWZpbml0aW9uLiAgIEhvd2V2ZXIsCiAgICAgICAgICAgIGEgd2FybmluZyBtZXNzYWdlIG1heSBiZSBnZW5lcmF0ZWQuICAgRXJyb3JzIGludm9sdmluZyAlYWRkbWV0aG9kcwogICAgICAgICAgICB3aWxsIGFjdHVhbGx5IHJlZmVyIHRvIHRoZSAlZXh0ZW5kIGRpcmVjdGl2ZS4gIAogICAgICAgICAgICAKMDQvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBGdXJ0aGVyIHJlZmluZW1lbnQgb2YgdGhlIHR5cGUgc3lzdGVtLiAgVHlwZWRlZiBub3cKICAgICAgICAgICAgcHJvcGFnYXRlcyB0aHJvdWdoIGZ1bmN0aW9ucywgcG9pbnRlcnMgdG8gZnVuY3Rpb25zLAogICAgICAgICAgICBhbmQgcG9pbnRlcnMgdG8gbWVtYmVyIGZ1bmN0aW9ucy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICB0eXBlZGVmIGludCBJbnRlZ2VyOwogICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgKCp4KShpbnQpLCBJbnRlZ2VyICgqeSkoSW50ZWdlcikpOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBhcmd1bWVudHMgJ3gnIGFuZCAneScgaGF2ZSBleGFjdGx5CiAgICAgICAgICAgIHRoZSBzYW1lIHR5cGUgKGFuZCB3b3VsZCBvYnZpb3VzbHkgYWNjZXB0IG9iamVjdHMKICAgICAgICAgICAgb2YgZWl0aGVyIHR5cGUpLgoKICAgICAgICAgICAgU2ltaWxhcmx5LCBjb25zaWRlciB0aGlzOgoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgIHR5cGVkZWYgRm9vIEJhcjsKICAgICAgICAgICAgICAgdm9pZCBiYXIoaW50IChGb286Oip4KShpbnQpLCBpbnQgKEJhcjo6KnkpKGludCkpOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBhcmd1bWVudHMgeCBhbmQgeSBhcmUgdGhlIHNhbWUgCiAgICAgICAgICAgIHR5cGUgKHZpYSB0eXBlZGVmKS4KICAgICAgICAgICAgCjA0LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU1dJRyBub3cgZ2VuZXJhdGVzIGEgd2FybmluZyBtZXNzYWdlIGlmIGFueSBwYXJ0IG9mCiAgICAgICAgICAgIGFuIGV4cHJlc3Npb24gaW52b2x2ZXMgdmFsdWVzIGZyb20gYSBwcml2YXRlIHBhcnQgb2YgYSBjbGFzcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHByaXZhdGU6CiAgICAgICAgICAgICAgICAgICAgc3RhdGljIGludCBYOwogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoaW50IGEsIGludCBiID0gWCk7ICAgLy8gV2FybmluZwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIGRlZmF1bHQgYXJndW1lbnQgaXMgaWdub3JlZC4gIFRoZXJlCiAgICAgICAgICAgIGFyZSB3b3JrYXJvdW5kcywgYnV0IHRoZXkgYXJlIHJhdGhlciBjbHVtc3kuICBGb3IgaW5zdGFuY2UsCiAgICAgICAgICAgIHlvdSBtaWdodCBkbyB0aGlzOgoKICAgICAgICAgICAgICAgICAgICAlZmVhdHVyZSgiYWN0aW9uIikgYmxhaChpbnQsaW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRuYXJncyA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYmxhaChhcmcxKTsKICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGJsYWgoYXJnMSxhcmcyKTsKICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaChpbnQgYSwgaW50IGIgPSAwKTsKCgowNC8yMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFVzZSBvZiB0aGUgJWlubGluZSBkaXJlY3RpdmUgaW5zaWRlIGEgbmFtZXNwYWNlIGlzCiAgICAgICAgICAgIGZvcmJpZGRlbiBhbmQgbm93IGdlbmVyYXRlcyBhbiBlcnJvciBtZXNzYWdlLiAgIFRoaXMgaXMKICAgICAgICAgICAgbm90IGFsbG93ZWQgc2luY2UgdGhlIGlubGluZWQgY29kZSB0aGF0IGlzIGVtaXR0ZWQgaXMKICAgICAgICAgICAgbm90IHBsYWNlZCBpbnNpZGUgYSBuYW1lc3BhY2UuICBUaGlzIGNvbmZ1c2VzIG90aGVyCiAgICAgICAgICAgIHN0YWdlcyBvZiBwYXJzaW5nLgogICAgICAgICAgICAgICAgICAgIAowNC8yMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNvbWUgYnVnIGZpeGVzIHRvIGNhc3Rpbmcgb3BlcmF0aW9ucyBhbmQgZXhwcmVzc2lvbgogICAgICAgICAgICBwYXJzaW5nLiAgIER1ZSB0byBzb21lIHBhcnNpbmcgaXNzdWVzLCBpdCBpcyBub3QgCiAgICAgICAgICAgIGN1cnJlbnRseSBwb3NzaWJsZSB0byB1c2UgY2FzdHMgZm9yIGFsbCBwb3NzaWJsZQogICAgICAgICAgICBkYXRhdHlwZXMuICAgSG93ZXZlciwgdGhlIGNvbW1vbiBjYXNlcyB3b3JrLgoKMDQvMjAvMjAwMjogYmVhemxleSAoQW1zdGVyZGFtKQogICAgICAgICAgICBNZW1iZXIgdGVtcGxhdGVzIG5vdyB3b3JrLiAgU2ltcGx5IHVzZSB0aGUgJXRlbXBsYXRlCiAgICAgICAgICAgIGRpcmVjdGl2ZSBpbnNpZGUgYSBjbGFzcyBvciAlYWRkbWV0aG9kcyB0byBjcmVhdGUKICAgICAgICAgICAgaW5zdGFudGlhdGlvbnMgKHNlZSBEb2MvTWFudWFsL1NXSUdQbHVzLmh0bWwpLiAgU3VwcG9ydGluZwogICAgICAgICAgICB0aGlzIHdhcyBlYXN5LS0tZWFybGllciBjaGFuZ2VzIHRvIHRlbXBsYXRlcyBtYWRlIGl0CiAgICAgICAgICAgIHBvc3NpYmxlIHVzaW5nIG9ubHkgYSB0d28tbGluZSBtb2RpZmljYXRpb24gdG8gdGhlIHBhcnNlcgogICAgICAgICAgICBhbmQgYSBmZXcgbWlub3IgbW9kaWZpY2F0aW9ucyBlbHNld2hlcmUuICBIbW1tLCBjb21lIHRvIAogICAgICAgICAgICB0aGluayBvZiBpdCwgdGhlIHNtb2tlIHdhcyByYXRoZXIgdGhpY2sgaW4gdGhhdCBJbnRlcm5ldCAiY2FmZSIuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAgCjA0LzE5LzIwMDI6IGJlYXpsZXkgKFRHVikKICAgICAgICAgICAgSW1wcm92ZWQgaGFuZGxpbmcgb2Ygbm9uLXR5cGUgdGVtcGxhdGUgcGFyYW1ldGVycy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICB2ZWN0b3I8aW50LDEwMD47CgogICAgICAgICAgICBTaW1wbGUgbnVtYmVycyBhbmQgc3RyaW5ncyBjYW4gYmUgdXNlZCB3aXRoIHRoZSAldGVtcGxhdGUKICAgICAgICAgICAgZGlyZWN0aXZlIGFzIHdlbGwuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY2ludDEwMCkgdmVjdG9yPGludCwxMDA+OwoKICAgICAgICAgICAgTm90ZTogQXJpdGhtZXRpYyBleHByZXNzaW9ucyBhcmUgbm90IGN1cnJlbnRseSBhbGxvd2VkLgogICAgICAgICAgICAKICAgICAgICAgICAgRGVmYXVsdCB0ZW1wbGF0ZSBhcmd1bWVudHMgbm93IHdvcmsgYW5kIGRvIG5vdCBoYXZlIHRvCiAgICAgICAgICAgIGJlIGdpdmVuIHRvICV0ZW1wbGF0ZS4KICAgICAgICAgICAgICAgICAgICAgICAgCjA0LzE4LzIwMDI6IGJlYXpsZXkgKFBhcmlzKQogICAgICAgICAgICBDaGFuZ2UgaW4gaW50ZXJuYWwgdGVtcGxhdGUgaGFuZGxpbmcuICBUZW1wbGF0ZQogICAgICAgICAgICBwYXJhbWV0ZXJzIGFyZSBub3cgZnVsbHkgaW50ZWdyYXRlZCBpbnRvIHRoZSB0eXBlCiAgICAgICAgICAgIHN5c3RlbSBhbmQgYXJlIGF3YXJlIG9mIHR5cGVkZWZzLCBldGMuICBUaGlzIGJ1aWxkcwogICAgICAgICAgICB1cG9uIHRoZSBjaGFuZ2UgYmVsb3cuICAgCgogICAgICAgICAgICAqKiogREVWRUxPUEVSIFdBUk5JTkcgKioqCiAgICAgICAgICAgIFdvcmQgb2YgY2F1dGlvbiB0byBsYW5ndWFnZSBtb2R1bGUgd3JpdGVycy4gIFRoZSAibmFtZSIKICAgICAgICAgICAgcGFyYW1ldGVyIG9mIGNlcnRhaW4gcGFyc2UgdHJlZSBub2RlcyAoY2xhc3NlcywgZnVuY3Rpb25zLCBldGMuKQogICAgICAgICAgICBtYXkgYmUgcGFyYW1ldGVyaXplZCB3aXRoIHR5cGVzLiAgIFRoaXMgcGFyYW1ldGVyaXphdGlvbiBpcwogICAgICAgICAgICBkb25lIHVzaW5nIFNXSUcgdHlwZS1zdHJpbmdzIGFuZCBub3QgdGhlIHVuZGVybHlpbmcgQyB2ZXJzaW9uLgogICAgICAgICAgICBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgICAgIGludCBtYXg8aW50ICo+KGludCAqLGludCAqKSAgCgogICAgICAgICAgICBoYXMgYSBuYW1lIG9mICJtYXg8KHAuaW50KT4iLiAgSWYgeW91IHVzZSB0aGUgbmFtZSBkaXJlY3RseSwKICAgICAgICAgICAgeW91IG1heSBnZXQgc3ludGF4IGVycm9ycyBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUuICBUbyBmaXggdGhpcywKICAgICAgICAgICAgdXNlIFN3aWdUeXBlX25hbWVzdHIobmFtZSkgdG8gY29udmVydCBhIHBhcmFtZXRlcml6ZWQgbmFtZSAKICAgICAgICAgICAgdG8gYSBDIG5hbWUgd2l0aCB2YWxpZCBzeW50YXguICBUaGUgaW50ZXJuYWwgdmVyc2lvbiBpcwogICAgICAgICAgICB1c2VkIHRvIHJlZHVjZSB0ZW1wbGF0ZSB0eXBlcyB0byBhIGNvbW1vbiByZXByZXNlbnRhdGlvbiAKICAgICAgICAgICAgYW5kIHRvIGhhbmRsZSBpc3N1ZXMgb2YgdHlwZWRlZi4KICAgICAgICAgICAgCjA0LzE2LzIwMDI6IGJlYXpsZXkgKHNvbWV3aGVyZSBvdmVyIHRoZSBBdGxhbnRpYykKICAgICAgICAgICAgRW5oYW5jZW1lbnQgb2YgdHlwZWRlZiByZXNvbHV0aW9uLiAgVGhlIHR5cGUgc3lzdGVtIGlzIG5vdwogICAgICAgICAgICBhd2FyZSBvZiB0ZW1wbGF0ZSBhcmd1bWVudHMgYW5kIHR5cGVkZWYuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IEludGVnZXI7CiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgIGZvbyh2ZWN0b3I8aW50PiAqeCwgdmVjdG9yPEludGVnZXI+ICp5KTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdmVjdG9yPGludD4gYW5kIHZlY3RvcjxJbnRlZ2VyPiBhcmUKICAgICAgICAgICAgdGhlIHNhbWUgdHlwZS4gICBUaGVyZSBpcyBzb21lIGludGVyYWN0aW9uIGJldHdlZW4gdGhpcwogICAgICAgICAgICBtZWNoYW5pc20gYW5kIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0eXBlbWFwcy4gIEZvciBleGFtcGxlLAogICAgICAgICAgICBhIHR5cGVtYXAgZGVmaW5lZCBmb3IgdmVjdG9yPGludD4gKiB3b3VsZCBhcHBseSB0byBlaXRoZXIgdHlwZS4KICAgICAgICAgICAgSG93ZXZlciwgYSB0eXBlbWFwIGZvciB2ZWN0b3I8SW50ZWdlcj4gKiB3b3VsZCBvbmx5IGFwcGx5IHRvCiAgICAgICAgICAgIHRoYXQgdHlwZS4KCiAgICAgICAgICAgIFR5cGVkZWZzIGFuZCB0eXBlbWFwcyBhbmQgbWF0Y2hlZCBieSBsZWZ0LW1vc3QgZXhwYW5zaW9uLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgdmVjdG9yPEludGVnZXIsSW50ZWdlcj4gLS0+IAogICAgICAgICAgICAgIHZlY3RvcjxpbnQsIEludGVnZXI+IC0tPgogICAgICAgICAgICAgIHZlY3RvcjxpbnQsIGludD4KCgowNC8yNC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIENoYW5nZXMgdG8gSmF2YSBzaGFkb3cgY2xhc3Nlcy4KICAgICAgICAgICAgT3ZlcmNvbWVzIGEgYnVnIHdoZXJlIHRoZSBtb2R1bGUgYXNzdW1lZCB0aGF0IGEgcG9pbnRlciB0byBhIGRlcml2ZWQKICAgICAgICAgICAgY2xhc3MgY291bGQgYmUgdXNlZCBpbiBwbGFjZSBvZiBhIHBvaW50ZXIgdG8gYSBiYXNlIGNsYXNzLiBUaGFua3MgCiAgICAgICAgICAgIHRvIFN0ZXBoZW4gTWNDYXVsIGZvciBhbmFseXNpbmcgdGhlIGJ1ZyBhbmQgc3VibWl0dGluZyBwYXRjaGVzLgoKICAgICAgICAgICAgQSBjb25zZXF1ZW5jZSBpcyB0aGF0IHRoZSBnZXRDUHRyKCkgbWV0aG9kIGluIGVhY2ggc2hhZG93IGNsYXNzIGhhcwogICAgICAgICAgICBkaXNhcHBlYXJlZCBhbmQgaGFzIGJlZW4gcmVwbGFjZWQgd2l0aCBhIGdldENQdHJYWFgoKSwgd2hlcmUgWFhYIGlzIHRoZSAKICAgICAgICAgICAgc2hhZG93IGNsYXNzIG5hbWUuIElmIHlvdSBoYXZlIGNvZGUgdGhhdCBwcmV2aW91c2x5IHVzZWQgZ2V0Q1B0cigpLCAKICAgICAgICAgICAgYW5kIHRoZSBhc3NvY2lhdGVkIGNsYXNzIGlzIHdyYXBwaW5nIGEgQyBzdHJ1Y3Qgb3IgYSBDKysgY2xhc3MgdGhhdAogICAgICAgICAgICBpcyBub3QgaW52b2x2ZWQgaW4gYW4gaW5oZXJpdGFuY2UgY2hhaW4sIGp1c3QgdXNlIHRoZSBuZXcgbWV0aG9kLiBJZgogICAgICAgICAgICBob3dldmVyLCB0aGUgY2xhc3MgaXMgaW52b2x2ZWQgaW4gYW4gaW5oZXJpdGFuY2UgY2hhaW4sIHlvdSdsbCBoYXZlCiAgICAgICAgICAgIHRvIGNob29zZSB3aGljaCBwb2ludGVyIHlvdSByZWFsbHkgd2FudC4gQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgCiAgICAgICAgICAgIGhhcyBiZWVuIGJyb2tlbiBhcyBub3QgdXNpbmcgdGhlIGNvcnJlY3QgcG9pbnRlciBjYW4gbGVhZCB0byB3ZWlyZCBidWdzCiAgICAgICAgICAgIHRocm91Z2ggaWxsLWRlZmluZWQgYmVoYXZpb3VyLiBJZiB5b3UgYXJlIHN1cmUgeW91IHdhbnQgdGhlIG9sZCBtZXRob2RzLCAKICAgICAgICAgICAgeW91IGNvdWxkIGFkZCB0aGVtIGJhY2sgaW50byBhbGwgc2hhZG93IGNsYXNzZXMgYnkgYWRkaW5nIHRoaXMgYXQgdGhlIAogICAgICAgICAgICBiZWdpbm5pbmcgb2YgeW91ciBpbnRlcmZhY2UgZmlsZToKCiAgICAgICAgICAgICVwcmFnbWEoamF2YSkgYWxsc2hhZG93Y29kZT0lewogICAgICAgICAgICAgIHB1YmxpYyBsb25nIGdldENQdHIoKXsKICAgICAgICAgICAgICAgIHJldHVybiBzd2lnQ1B0cjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICV9CgogICAgICAgICAgICBQbGVhc2Ugc2VlIGVudHJ5IGRhdGVkIDA3LzIzLzIwMDIgdG8gc2VlIGhvdyB0byBkbyB0aGlzIGFmdGVyIHRoZSBkZXByZWNhdGlvbgogICAgICAgICAgICBvZiB0aGUgYWxsc2hhZG93Y29kZSBwcmFnbWEuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNC8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyBhbmQgcmVmZXJlbmNlcy4gICBEZWNsYXJhdGlvbnMgc3VjaCAKICAgICAgICAgICAgYXMgdGhpcyBzaG91bGQgbm93IHdvcms6CgogICAgICAgICAgICAgICAgdm9pZCBmb28oY29uc3Qgc3RyaW5nICZ4ID0gIkhlbGxvIik7CgowNC8xMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIHR5cGVtYXAgJCogc3Vic3RpdHV0aW9ucyBmb3IgdHlwZW1hcHMgaW52b2x2aW5nIGFycmF5cy4KICAgICAgICAgICAgUmVxdWVzdGVkIGJ5IFdpbGxpYW0gRnVsdG9uLgoKMDQvMTEvMjAwMjogYmVhemxleQogICAgICAgICAgICBUZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBpcyBub3cgc3VwcG9ydGVkLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICB0ZW1wbGF0ZTw+IGNsYXNzIHZlY3RvcjxpbnQ+IHsKICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBXaGVuIHRoZSAldGVtcGxhdGUgZGlyZWN0aXZlIGlzIHVzZWQsIGl0IHdpbGwgdXNlIGEgc3BlY2lhbGl6YXRpb24KICAgICAgICAgICAgaWYgb25lIGlzIGRlZmluZWQuICAgVGhlcmUgYXJlIHN0aWxsIHNvbWUgbGltaXRhdGlvbnMuIFBhcnRpYWwKICAgICAgICAgICAgc3BlY2lhbGl6YXRpb24gaXMgbm90IHN1cHBvcnRlZC4gIEEgdGVtcGxhdGUgb2YgdHlwZSA8dm9pZCAqPiBkb2VzCiAgICAgICAgICAgIG5vdCBtYXRjaCBhbGwgcG9pbnRlcnMuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA0LzExLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWFqb3IgY2hhbmdlIHRvIHRlbXBsYXRlIHdyYXBwaW5nIGludGVybmFscy4gVGVtcGxhdGUgZGVjbGFyYXRpb25zIGFyZQogICAgICAgICAgICBubyBsb25nZXIgcHJvY2Vzc2VkIGFzIG1hY3JvcyBidXQgbm93IHJlc3VsdCBpbiByZWFsIHBhcnNlLXRyZWUKICAgICAgICAgICAgbm9kZXMuICBUaGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBleHBhbmRzIHRoZXNlIG5vZGVzIGludG8gYQogICAgICAgICAgICBzcGVjaWZpYyBpbnN0YW50aWF0aW9uLiAgIFRoaXMgY2hhbmdlIGVuYWJsZXMgYSBudW1iZXIgb2YKICAgICAgICAgICAgbmV3IGFuZCBpbnRlcmVzdGluZyBjYXBhYmlsaXRpZXM6CgogICAgICAgICAgICBEaXJlY3RpdmVzIHN1Y2ggYXMgJXJlbmFtZSwgJWZlYXR1cmUsIGFuZCAlYWRkbWV0aG9kcyBjYW4KICAgICAgICAgICAgbm93IGJlIGFwcGxpZWQgdG8gdW5pbnN0YW50aWF0ZWQgdGVtcGxhdGVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVyZW5hbWUoYmFyc2l6ZSkgdmVjdG9yOjpiYXIoY2hhciAqYnVmLCBpbnQgbGVuKTsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyB2ZWN0b3IgewogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB2b2lkIGJhcihjaGFyICpidWYpOwogICAgICAgICAgICAgICAgIHZvaWQgYmFyKGNoYXIgKmJ1ZiwgaW50IGxlbik7ICAgLy8gUmVuYW1lZAogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICV0ZW1wbGF0ZShpbnR2ZWN0b3IpIHZlY3RvcjxpbnQ+OyAgIC8vIFJlbmFtaW5nIGNhcnJpZXMgdGhyb3VnaAoKICAgICAgICAgICAgCiAgICAgICAgICAgIEJ5IHBhcnNpbmcgdGVtcGxhdGVzIGludG8gYW4gaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmUsIGl0IHdpbGwKICAgICAgICAgICAgYmUgcG9zc2libGUgdG8gc3VwcG9ydCBzcGVjaWFsaXphdGlvbiAoYW5kIG1heWJlIHBhcnRpYWwKICAgICAgICAgICAgc3BlY2lhbGl6YXRpb24pLgogICAgICAgICAgICAKICAgICAgICAgICAgVGhpcyBpcyBoaWdobHkgZXhwZXJpbWVudGFsIGFuZCBhIHdvcmsgaW4gcHJvZ3Jlc3MuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgSW4gU1dJRy0xLjMuMTEsIHRlbXBsYXRlIGRlY2xhcmF0aW9ucyB3ZXJlIHNpbXBseSBwcm9jZXNzZWQKICAgICAgICAgICAgYXMgd2VpcmQgbWFjcm9zLiAgTm8gb3RoZXIgaW5mb3JtYXRpb24gd2FzIHJldGFpbmVkLiAgIFRoaXMgCiAgICAgICAgICAgIG1hZGUgaXQgaW1wb3NzaWJsZSB0byBzdXBwb3J0IG1vcmUgYWR2YW5jZWQgZmVhdHVyZXMgYW5kIAogICAgICAgICAgICBjb21wbGljYXRlZCBtYW55IG90aGVyIHBhcnRzIG9mIHRoZSBpbXBsZW1lbnRhdGlvbi4KCjA0LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQ2hhbmdlIHRvIHRlbXBsYXRlIGNsYXNzIHdyYXBwaW5nLiAgIFRoZXJlIHdlcmUgYSB2YXJpZXR5IG9mCiAgICAgICAgICAgICJpc3N1ZXMiIHdpdGggdGhlIG9sZCBhcHByb2FjaCByZWxhdGVkIHRvIHBhcnNpbmcsIHRoZSB0eXBlCiAgICAgICAgICAgIHN5c3RlbSwgYW5kIG5hbWVzcGFjZXMuICAgVGhlc2UgY2hhbmdlcyBhcmUgbWVhbnQgdG8gcmVjdGlmeQogICAgICAgICAgICBzb21lIG9mIHRoZXNlIHByb2JsZW1zOgoKICAgICAgICAgICAgQSBzcGVjaWZpYyBpbnN0YW50aWF0aW9uIG9mIGEgdGVtcGxhdGUgY2FuIG5vdyBiZSBzcGVjaWZpZWQKICAgICAgICAgICAgYnkgaW5jbHVkaW5nIHRoZSBjbGFzcyBpbmxpbmUgbGlrZSB0aGlzOgogCiAgICAgICAgICAgICAgICAgIGNsYXNzIHZlY3RvcjxpbnQ+IHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcigpOwogICAgICAgICAgICAgICAgICAgICAgfnZlY3RvcigpOwogICAgICAgICAgICAgICAgICAgICAgIC4uLiB3aGF0ZXZlciAuLi4KCSAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGlzIGlzIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uLCBidXQgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBpcwogICAgICAgICAgICBub3QgeWV0IGltcGxlbWVudGVkLgogICAgICAgICAgICAKICAgICAgICAgICAgVGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgaGFzIGJlZW4gbW9kaWZpZWQgdG8gZXhwYW5kIHJvdWdobHkgYXMKICAgICAgICAgICAgZm9sbG93czoKCiAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY2ludCkgdmVjdG9yPGludD47CgogICAgICAgICAgICBiZWNvbWVzCgogICAgICAgICAgICAgICAgICVyZW5hbWUodmVjaW50PiB2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICAgICBjbGFzcyB2ZWN0b3I8aW50PiB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICB2ZWN0b3IoKTsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIE5vdGUgdGhhdCB0aGlzIHNpbXBseSBidWlsZHMgdXBvbiB0aGUgY29kZSBhYm92ZSAodGVtcGxhdGVzCiAgICAgICAgICAgIGluY2x1ZGVkIGlubGluZSkuCgogICAgICAgICAgICBUaGlzIG1vZGlmaWVkIGFwcHJvYWNoIHRvIHdyYXBwaW5nIGZpeGVzIHNvbWUgc3VidGxlIHR5cGUKICAgICAgICAgICAgaXNzdWVzLiAgRm9yIGluc3RhbmNlLCB5b3UgY2FuIG5vdyBkZWZpbmUgdHlwZW1hcHMgYW5kIHR5cGVkZWZzCiAgICAgICAgICAgIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHZlY3RvcjxpbnQ+ICogewogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB0eXBlZGVmIHZlY3RvcjxpbnQ+IGludHZlY3RvcjsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoaW50dmVjdG9yICp2KTsgICAvLyBHZXRzIHRoZSBhYm92ZSB0eXBlbWFwCgogICAgICAgICAgICBUaGlzIGRpZCBub3Qgd29yayBpbiBTV0lHLTEuMy4xMSBkdWUgdG8gYSBwZWN1bGlhcml0eSBvZgogICAgICAgICAgICB0aGUgdGVtcGxhdGUgaW1wbGVtZW50YXRpb24uCgogICAgICAgICAgICAldGVtcGxhdGUobmFtZSkgbm8gbG9uZ2VyIGluc3RhbGxzIHRoZSB0ZW1wbGF0ZSBhcyBhIGNsYXNzCiAgICAgICAgICAgIHdpdGggbmFtZSAibmFtZSIuICAgVGhpcyBtaWdodCBicmVhayAlYWRkbWV0aG9kcyBhcyBkZXNjcmliZWQKICAgICAgICAgICAgaW4gdGhlIG1hbnVhbC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAldGVtcGxhdGUodmVjaW50KSB2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICAgICAlYWRkbWV0aG9kcyB2ZWNpbnQgeyAgICAvLyBGYWlscy4gdmVjaW50IG5vdCBhIGNsYXNzCiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgIAogICAgICAgICAgICBUbyBmaXggdGhpcywganVzdCB1c2UgdGhlIHRlbXBsYXRlIG5hbWUgaW5zdGVhZDoKCiAgICAgICAgICAgICAgICAgJWFkZG1ldGhvZHMgdmVjdG9yPGludD4gewogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBOb3RlOiBUaGlzIHRlY2huaXF1ZSBtaWdodCBiZSBhIHdheSB0byBpbXBsZW1lbnQgc29tZSBiaXphcnJlCiAgICAgICAgICAgIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIHRlY2huaXF1ZXMuICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICVhZGRtZXRob2RzIHZlY3RvcjxpbnQ+IHsKICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBhcHBsaWVkIGlmIHZlY3RvcjxpbnQ+IGluc3RhbnRpYXRlZCBsYXRlcgogICAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgdmVjdG9yPGludD4gKiB7CiAgICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgIAowNC8wOC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTQwODY4IF0gI2lmIGRlZmluZWQgd2hhdGV2ZXIgLSBub3QgcGFyc2VkLiAgU1dJRyBzaG91bGQKICAgICAgICAgICAgbm93IGNvcnJlY3RseSBoYW5kbGUgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICNpZiBkZWZpbmVkIF9fY3BsdXNwbHVzCiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICNlbmRpZgogICAgICAgICAgICAgCiAgICAgICAgICAgIE5vdGU6IHdhcyBpbXBsZW1lbnRlZCBwcmV2aW91c2x5LCBidXQgdGhlcmUgd2FzIGEgbWlub3IgYnVnLgogICAgICAgICAgICBSZXBvcnRlZCBieSBBZGFtIEh1cHAuCiAgICAgICAgICAgICAgICAgICAKMDQvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICAlcmVhZG9ubHkgYW5kICVyZWFkd3JpdGUgYXJlIGRlcHJlY2F0ZWQgZHVlIHRvIGEgY2hhbmdlIGluIHRoZSAKICAgICAgICAgICAgaW1wbGVtZW50YXRpb24uICBJbnN0ZWFkIG9mIGJlaW5nIHByYWdtYXMsIG11dGFiaWxpdHkgaXMgbm93CiAgICAgICAgICAgIGNvbnRyb2xsZWQgYXMgYSAiZmVhdHVyZSIgdXNpbmcgdGhlIGZvbGxvd2luZyB0d28gZGlyZWN0aXZlczoKCiAgICAgICAgICAgICAgICAgJWltbXV0YWJsZTsKICAgICAgICAgICAgICAgICBpbnQgeDsgICAgICAgICAgIC8vIHJlYWQtb25seSB2YXJpYWJsZQogICAgICAgICAgICAgICAgIGludCB5OyAgICAgICAgICAgLy8gcmVhZC1vbmx5IHZhcmlhYmxlCiAgICAgICAgICAgICAgICAgJW11dGFibGU7CiAgICAgICAgICAgICAgICAgaW50IHo7ICAgICAgICAgICAvLyBNb2RpZmlhYmxlCgogICAgICAgICAgICAlaW1tdXRhYmxlIGFuZCAlbXV0YWJsZSBhcmUgbXVjaCBtb3JlIHBvd2VyZnVsIHRoYW4gdGhlaXIgb2xkZXIKICAgICAgICAgICAgY291bnRlcnBhcnRzLiAgVGhleSBjYW4gbm93IHBpbnBvaW50IGEgc3BlY2lmaWMgZGVjbGFyYXRpb24gbGlrZQogICAgICAgICAgICB0aGlzOgoKICAgICAgICAgICAgICAgJWltbXV0YWJsZSAgeDsgICAgICAgICAvKiBBbnkgeCAqLwogICAgICAgICAgICAgICAlaW1tdXRhYmxlICBGb286Ong7ICAgIC8qIHggaW4gY2xhc3MgRm9vICovCgogICAgICAgICAgICBJbiBmYWN0LCB0aGUgbWF0Y2hpbmcgYWxnb3JpdGhtIGlzIHRoZSBzYW1lIGFzIGZvciAlcmVuYW1lLCAKICAgICAgICAgICAgJWlnbm9yZSwgYW5kIG90aGVyIGRpcmVjdGl2ZXMuICAgVGhpcyBtZWFucyB0aGF0IHRoZSBkZWNsYXJhdGlvbgogICAgICAKICAgICAgICAgICAgICAgJWltbXV0YWJsZSAgRm9vOjp4OwoKICAgICAgICAgICAgd291bGQgbm90IG9ubHkgYXBwbHkgdG8gY2xhc3MgRm9vIGJ1dCB0byBhbGwgZGVyaXZlZCBjbGFzc2VzCiAgICAgICAgICAgIGFzIHdlbGwuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgJWltbXV0YWJsZSBhbmQgJW11dGFibGUgbXVzdCBiZSB0ZXJtaW5hdGVkIGJ5IGEgc2VtaS1jb2xvbi4gIFRoaXMKICAgICAgICAgICAgZGlmZmVycyBzbGlnaHRseSBmcm9tIHRoZSBvbGRlciAlcmVhZG9ubHkgYW5kICVyZWFkd3JpdGUgZGlyZWN0aXZlcy4KICAgICAgICAgICAgU2luY2UgJWltbXV0YWJsZSBhbmQgJW11dGFibGUgY2FuIGJlIGFwcGxpZWQgdG8gZGVjbGFyYXRpb25zIHRoZQogICAgICAgICAgICBzZW1pY29sb24gaXMgbmVlZGVkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gYSBnbG9iYWwgZmVhdHVyZSBhbmQgCiAgICAgICAgICAgIG9uZSB0YXJnZXRlZCB0byBhIHNpbmdsZSBkZWNsYXJhdGlvbi4gIE5vdGU6IHRoaXMgaW5jb21wYXRpYmlsaXR5IGlzIHRoZQogICAgICAgICAgICBwcmltYXJ5IHJlYXNvbiBmb3IgY2hhbmdpbmcgdGhlIG5hbWUgb2YgdGhlIGRpcmVjdGl2ZS4KCjA0LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmV3IGhhbmRsaW5nIG9mIGNvcHkgY29uc3RydWN0b3JzLiAgSWYgYSBjbGFzcyBkZWZpbmVzIAogICAgICAgICAgICBjb25zdHJ1Y3RvcnMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICBGb28oKTsKICAgICAgICAgICAgICAgICAgICAgIEZvbyhjb25zdCBGb28gJik7ICAgICAgIC8vIENvcHkgY29uc3RydWN0b3IKICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFNXSUcgbm93IGdlbmVyYXRlcyBhIGZ1bmN0aW9uIGNvcHlfRm9vKCkgZm9yIHRoZSBjb3B5CiAgICAgICAgICAgIGNvbnN0cnVjdG9yLgoKICAgICAgICAgICAgSW4gcHJldmlvdXMgdmVyaW9ucywgdGhpcyBnZW5lcmF0ZWQgYSBuYW1lLWNsYXNoIGFuZCBhbgogICAgICAgICAgICBlcnJvciBtZXNzYWdlLiAgIFRvIHByZXNlcnZlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBTV0lHCiAgICAgICAgICAgIGRvZXMgbm90IGNoYW5nZSB0aGUgYmVoYXZpb3IgaWYgJXJlbmFtZSBpcyB1c2VkIHRvIHJlc29sdmUKICAgICAgICAgICAgdGhlIG5hbWUgY29uZmxpY3QuICAgSG93ZXZlciwgaWYgbm8gbmFtZSByZXNvbHV0aW9uIGlzIG1hZGUsCiAgICAgICAgICAgIHRoaXMgbmV3IGFwcHJvYWNoIGlzIHVzZWQuCgogICAgICAgICAgICBDb3B5IGNvbnN0cnVjdG9ycyBtYXkgYmUgaGFuZGxlZCBhcyBhIHNwZWNpYWwgY2FzZSBpbiB0aGUKICAgICAgICAgICAgdGFyZ2V0IGxhbmd1YWdlLiAgSG93ZXZlciwgdGhpcyBpcyB1cCB0byB0aGUgbGFuZ3VhZ2UgbW9kdWxlCiAgICAgICAgICAgIGl0c2VsZi4KICAgICAgICAgICAgICAgICAgCjA0LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgaXMgbm93IG5hbWVzcGFjZSBhd2FyZS4gICBUaGlzIGFsbG93cwogICAgICAgICAgICBjb2RlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgZm9vIHsKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBtYXgoVCBhLCBUIGIpIHsgcmV0dXJuIGEgPiBiID8gYSA6IGI7IH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB1c2luZyBuYW1lc3BhY2UgZm9vOwogICAgICAgICAgICAgICAgJXRlbXBsYXRlKG1heGludCkgbWF4PGludD47ICAgICAgICAgICAgLy8gT2sKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgYmFyIHsKICAgICAgICAgICAgICAgICAgIHVzaW5nIGZvbzo6bWF4OwogICAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKG1heGRvdWJsZSkgbWF4PGRvdWJsZT47ICAgLy8gT2sKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIENhdmVhdDogdGhlIHRlbXBsYXRlIG5hbWUgc3VwcGxpZWQgdG8gJXRlbXBsYXRlIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUKICAgICAgICAgICAgc2FtZSBzY29wZSBpbiB3aGljaCB0aGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBhcHBlYXJzLiAgIFRoaXMgY29kZSBpcwogICAgICAgICAgICBpbGxlZ2FsOgoKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShtYXhpbnQpIGZvbzo6bWF4PGludD47CgowNC8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1pbm9yIGVuaGFuY2VtZW50IHRvIHByZXByb2Nlc3Nvci4gICBUaGUgcHJlcHJvY2Vzc29yIGNhbiBub3cgcGVyZm9ybQogICAgICAgICAgICBzdHJpbmcgY29tcGFyaXNvbi4gICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICNkZWZpbmUgQSAiaGVsbG8iCiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAjaWYgQSA9PSAiaGVsbG8iCiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAjZW5kaWYKCiAgICAgICAgICAgIFRoZSBwcmltYXJ5IHVzZSBvZiB0aGlzIGlzIGluIFNXSUcgbWFjcm9zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVkZWZpbmUgRk9PKHgpIAogICAgICAgICAgICAgICNpZiAjeCA9PSAiaW50IgogICAgICAgICAgICAgIC8qIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGludCAqLwogICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICNlbmRpZgogICAgICAgICAgICAgICVlbmRkZWYKCiAgICAgICAgICAgIE5vcm1hbCB1c2VycyBjYW4gcHJvYmFibHkgc2FmZWx5IGlnbm9yZSB0aGlzIGZlYXR1cmUuICBIb3dldmVyLCBpdCBtYXkKICAgICAgICAgICAgYmUgdXNlZCBpbiBwYXJ0cyBvZiB0aGUgU1dJRyBsaWJyYXJ5LgoKMDQvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBGdXJ0aGVyIHJlZmluZW1lbnQgb2YgZGVmYXVsdCBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIHdyYXBwZXIgZ2VuZXJhdGlvbi4KICAgICAgICAgICAgU1dJRyBpcyBub3cgbXVjaCBtb3JlIGF3YXJlIG9mIHB1cmUgdmlydHVhbCBtZXRob2RzLiBGb3IgaW5zdGFuY2U6CgogICAgICAgICAgICAgIGNsYXNzIEEgeyAgICAgICAgICAgICAvKiBBYnN0cmFjdCAqLwogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgbWV0aG9kMSgpID0gMDsKICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgbWV0aG9kMigpID0gMDsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIGNsYXNzIEIgOiBwdWJsaWMgQSB7ICAvKiBBYnN0cmFjdCAqLwogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgbWV0aG9kMSgpIHsgfTsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICBjbGFzcyBDIDogcHVibGljIEIgeyAgLyogT2sgKi8KICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIG1ldGhvZDIoKSB7IH07CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgU1dJRyB3aWxsIG9ubHkgZ2VuZXJhdGUgZGVmYXVsdCBjb25zdHJ1Y3RvcnMgZm9yIEMuCiAgICAgICAgICAgIEV2ZW4gdGhvdWdoIEIgbG9va3MgZmluZSwgaXQncyBtaXNzaW5nIGEgcmVxdWlyZWQgbWV0aG9kIGFuZCBpcyBhYnN0cmFjdC4KCjA0LzA0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU3VidGxlIGNoYW5nZSB0byBzdHJ1Y3R1cmUgZGF0YSBtZW1iZXIgYWNjZXNzLiAgSWYgeW91CiAgICAgICAgICAgIGhhdmUgYSBzdHJ1Y3R1cmUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICAgIEJhciAgIGI7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIGFjY2Vzc29yIGZ1bmN0aW9ucyBmb3IgYiBhcmUgZ2VuZXJhdGVkIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAoMSkgSWYgYiBpcyAqbm90KiBkZWZpbmVkIGFzIGEgc3RydWN0dXJlIG9yIGNsYXNzOgoKICAgICAgICAgICAgICAgIEJhciBGb29fYl9nZXQoRm9vICpzZWxmKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYtPmI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2b2lkIEZvb19iX3NldChGb28gKnNlbGYsIEJhciB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHNlbGYtPmIgPSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICgyKSBJZiBiICppcyogZGVmaW5lZCBhcyBhIHN0cnVjdHVyZSBvciBjbGFzczoKCiAgICAgICAgICAgICAgICBCYXIgKkZvb19iX2dldChGb28gKnNlbGYpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJnNlbGYtPmI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2b2lkIEZvb19iX3NldChGb28gKnNlbGYsIEJhciAqdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLT5iID0gKnZhbHVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBTZWUgdGhlICJTdHJ1Y3R1cmUgZGF0YSBtZW1iZXJzIiBzZWN0aW9uIG9mIERvYy9NYW51YWwvU1dJRy5odG1sCiAgICAgICAgICAgIGZvciBmdXJ0aGVyIGRldGFpbHMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgVGhpcyBtYXkgYnJlYWsgaW50ZXJmYWNlcyB0aGF0IHJlbGllZCBvbiBhIGxvdCBvZiBhIHVuZGVjbGFyZWQKICAgICAgICAgICAgc3RydWN0dXJlIGFuZCBjbGFzcyBuYW1lcy4gICAgVG8gZ2V0IHRoZSBvbGQgYmVoYXZpb3IsIHNpbXBseQogICAgICAgICAgICB1c2UgYSBmb3J3YXJkIGRlY2xhcmF0aW9uIHN1Y2ggYXMgInN0cnVjdCBCYXI7IgogICAgICAgICAgICAKMDQvMDQvMjAwMjogYmVhemxleQogICAgICAgICAgICBDKysgbmFtZXNwYWNlIHN1cHBvcnQgYWRkZWQuICBTV0lHIHN1cHBvcnRzIGFsbCBhc3BlY3RzIG9mCiAgICAgICAgICAgIG5hbWVzcGFjZXMgaW5jbHVkaW5nIG5hbWVzcGFjZSwgdXNpbmcsIGFuZCBuYW1lc3BhY2UgYWxpYXMKICAgICAgICAgICAgZGVjbGFyYXRpb25zLiAgICBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiBTV0lHIGlzIHRvIGZsYXR0ZW4KICAgICAgICAgICAgbmFtZXNwYWNlcyBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLiAgSG93ZXZlciwgbmFtZXNwYWNlcyBhcmUKICAgICAgICAgICAgZnVsbHkgc3VwcG9ydGVkIGF0IHRoZSBDKysgbGV2ZWwgYW5kIGluIHRoZSB0eXBlIHN5c3RlbS4KICAgICAgICAgICAgU2VlIERvYy9NYW51YWwvU1dJR1BsdXMuaHRtbCBmb3IgZGV0YWlscyBvbiB0aGUgaW1wbGVtZW50YXRpb24uCiAgICAgCjA0LzAyLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gU3VuIGhhcyBtb2RpZmllZCBqYXZhYyBpbiBqZGsxLjQgdG8gbm8gbG9uZ2VyIGNvbXBpbGUKICAgICAgICAgICAgYW4gaW1wb3J0IG9mIGFuIHVubmFtZWQgbmFtZXNwYWNlLiBUbyBmaXggdGhpcyBTV0lHIG5vIGxvbmdlciAKICAgICAgICAgICAgZ2VuZXJhdGVzIHRoZSBpbXBvcnQgZm9yIHBhY2thZ2VsZXNzIGNsYXNzZXMuCiAgICAgICAgICAgIGh0dHA6Ly9kZXZlbG9wZXIuamF2YS5zdW4uY29tL2RldmVsb3Blci9idWdQYXJhZGUvYnVncy80MzYxNTc1Lmh0bWwKICAgICAgICAgICAgQXMgcmVwb3J0ZWQgU0YgIzUzODQxNS4KCjAzLzI3LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBzdXBwb3J0IGZvciBwb2ludGVyLXRvLW1lbWJlciwgc2ltaWxhciB0byB0aGF0CiAgICAgICAgICAgIGZvciB0aGUgUHl0aG9uIG1vZHVsZS4gUmVtYXJrYWJseSBzaW1pbGFyLiBBbHNvIGFkZGVkIGEgbmV3CiAgICAgICAgICAgIGV4YW1wbGUgZm9yIHRoaXMgKEV4YW1wbGVzL3J1YnkvbXBvaW50ZXIpLCB3aGljaCBpcyByZW1hcmthYmx5CiAgICAgICAgICAgIHNpbWlsYXIgdG8gdGhlIFB5dGhvbiBleGFtcGxlIG9mIHRoZSBzYW1lIG5hbWUuCgowMy8yNi8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gTWFkZSBhIGZldyBtaW5vciBlZGl0cyB0byB0aGUgIkFkdmFuY2VkIFRvcGljcyIKICAgICAgICAgICAgY2hhcHRlciBvZiB0aGUgU1dJRyBtYW51YWwgYW5kIGFkZGVkIGEgbmV3IG1ham9yIHNlY3Rpb24KICAgICAgICAgICAgYWJvdXQgaG93IHRvIGNyZWF0ZSBtdWx0aS1tb2R1bGUgUnVieSBwYWNrYWdlcyB3aXRoIFNXSUcuCgowMy8yNi8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gUmVtb3ZlZCBhbGwgb2YgdGhlIG9sZCBSdWJ5IHByYWdtYXMuIElmIGFueSBvZiB0aGlzCiAgICAgICAgICAgIGZ1bmN0aW9uYWxpdHkgaXMgdHJ1bHkgbWlzc2VkIHdlIGNhbiByZXN1cnJlY3QgaXQsIHByZWZlcmFibHkKICAgICAgICAgICAgd2l0aCBzb21lIGtpbmQgb2YgZmVhdHVyZS1iYXNlZCBkaXJlY3RpdmUuCiAgICAgICAgICAgIAowMy8yNS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gRml4ZWQgU1dJRyBleGNlcHRpb24gbGlicmFyeSBzdXBwb3J0IGZvciBSdWJ5LCB3aGljaAogICAgICAgICAgICBoYXMgYXBwYXJlbnRseSBiZWVuIGJyb2tlbiBmb3Igc29tZSB0aW1lLiBMdWNraWx5LCBubyBvbmUgc2VlbXMKICAgICAgICAgICAgdG8gaGF2ZSBub3RpY2VkLgoKMDMvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBDKystbmFtZXNwYWNlIHN1cHBvcnQgaW4gU1dJRyBkaXJlY3RpdmVzLgoKICAgICAgICAgICAgJWFkZG1ldGhvZHM6IAoKICAgICAgICAgICAgVGhlICVhZGRtZXRob2RzIGRpcmVjdGl2ZSBub3cgYWNjZXB0cyBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUKICAgICAgICAgICAgYW5kIGNhbiBiZSB1c2VkIGluc2lkZSBDKysgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAvLyBBdHRhY2hlcyB0byB0aGUgY2xhc3MgRm9vOjpCYXIgYmVsb3cKICAgICAgICAgICAgICAgICAlYWRkbWV0aG9kcyBGb286OkJhciB7CiAgICAgICAgICAgICAgICAgICAgIGludCBzb21lbWV0aG9kKCkgeyAuLi4gfQogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBGb28gewogICAgICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIC8vIEF0dGFjaGVzIHRvIHRoZSBjbGFzcyBCYXIgYWJvdmUKICAgICAgICAgICAgICAgICAgICAlYWRkbWV0aG9kcyBCYXIgewogICAgICAgICAgICAgICAgICAgICAgaW50IG90aGVybWV0aG9kKCkgeyAuLi4gfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgJWZlYXR1cmUsICVyZW5hbWUsICVpZ25vcmUsICVleGNlcHRpb24sIGFuZCByZWxhdGVkIGRpcmVjdGl2ZXM6CgogICAgICAgICAgICBOYW1lc3BhY2VzIGFyZSBmdWxseSBpbnRlZ3JhdGVkIGludG8gdGhlIHJlbmFtaW5nIGFuZCBkZWNsYXJhdGlvbgogICAgICAgICAgICBtYXRjaGVyLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICVyZW5hbWUoZGlzcGxheSkgRm9vOjpwcmludDsgICAgICAgICAgLy8gUmVuYW1lIGluIG5hbWVzcGFjZSBGb28KICAgICAgICAgICAgICAgICAlaWdub3JlIEZvbzo6QmFyOjpibGFoOyAgICAgICAgICAgICAgIC8vIElnbm9yZSBhIGRlY2xhcmF0aW9uCgogICAgICAgICAgICAlcmVuYW1lIGRpcmVjdGl2ZXMgY2FuIGJlIHBsYWNlZCBpbnNpZGUgbmFtZXNwYWNlIGJsb2NrcyBhcyB3ZWxsLiBGb3IKICAgICAgICAgICAgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgRm9vIHsKICAgICAgICAgICAgICAgICAgICVyZW5hbWUoZGlzcGxheSkgcHJpbnQ7ICAgICAgICAgLy8gQXBwbGllcyB0byBwcmludCBiZWxvdwoKICAgICAgICAgICAgICAgICAgIHZvaWQgcHJpbnQoKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBNb3N0IG90aGVyIFNXSUcgZGlyZWN0aXZlcyBzaG91bGQgd29yayBwcm9wZXJseSBpbnNpZGUgbmFtZXNwYWNlcy4KICAgICAgICAgICAgTm8gb3RoZXIgY2hhbmdlcyBhcmUgbmVlZGVkLgogICAgICAKMDMvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBTb21lIGNoYW5nZXMgdG8gaW50ZXJuYWwgc3ltYm9sIHRhYmxlIGhhbmRsaW5nLiAgIFNXSUcgbm8gbG9uZ2VyCiAgICAgICAgICAgIG1hbmFnZXMgc3RydWN0dXJlcyBhbmQgdW5pb25zIGluIGEgc2VwYXJhdGUgbmFtZXNwYWNlIHRoYW4gbm9ybWFsCiAgICAgICAgICAgIGRlY2xhcmF0aW9ucyBsaWtlIEFOU0kgQy4gIFRoaXMgbWVhbnMgeW91IGNhbid0IGhhdmUgYSBzdHJ1Y3R1cmUKICAgICAgICAgICAgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIGEgZnVuY3Rpb24uICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaW50IEZvbygpIHsgLi4uIH0KCiAgICAgICAgICAgIFRoaXMgYXBwcm9hY2ggaXMgbW9yZSBsaWtlIEMrKy4gICBJdCdzIG5vdCBjbGVhciB0aGF0IFNXSUcgZXZlcgogICAgICAgICAgICByZWFsbHkgc3VwcG9ydGVkIHRoZSBBTlNJIEMgYW55d2F5cy0tLXVzaW5nIHRoZSBzYW1lIG5hbWUgd291bGQKICAgICAgICAgICAgYWxtb3N0IGNlcnRhaW5seSBnZW5lcmF0ZSBhIG5hbWUtY2xhc2ggaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4KCjAzLzIyLzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBGaXhlZCBbIDUxNzMwMiBdIGZvciBoYW5kbGluZyBvZiByZW5hbWVkIG92ZXJsb2FkZWQKICAgICAgICAgICAgY29uc3RydWN0b3JzLiBOb3csIHJlbmFtZWQgb3ZlcmxvYWRlZCBjb25zdHJ1Y3RvcnMgYXJlIGNvbnZlcnRlZAogICAgICAgICAgICBpbnRvIGNsYXNzIHNpbmdsZXRvbiBtZXRob2RzIChiYXNpY2FsbHkgYWN0aW5nIGFzICJmYWN0b3J5IgogICAgICAgICAgICBtZXRob2RzKS4KCjAzLzIxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1MzI5NTcgXSAlaWdub3JlIHBhcnNlIGVycm9yIGFuZCBjYXN0aW5nIG9wZXJhdG9yLgogICAgICAgICAgICBSZXBvcnRlZCBieSBXaWxsaWFtIEZ1bHRvbi4KCjAzLzE4LzIwMDI6IGJlYXpsZXkgKCoqIEFEVkFOQ0VEIFVTRVJTIE9OTFkgKiopCiAgICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIGR5bmFtaWMgY2FzdGluZyBpbiByZXR1cm4gdmFsdWVzLiAgQSBzb21ld2hhdAogICAgICAgICAgICBjb21tb24gcHJvYmxlbSBpbiBjZXJ0YWluIEMrKyBwcm9ncmFtcyBpcyBmdW5jdGlvbnMgdGhhdCBoaWRlCiAgICAgICAgICAgIHRoZSBpZGVudGl0eSBvZiB1bmRlcmx5aW5nIG9iamVjdHMgd2hlbiB0aGV5IGFyZSByZXR1cm5lZCAKICAgICAgICAgICAgZnJvbSBtZXRob2RzIGFuZCBmdW5jdGlvbnMuICBGb3IgZXhhbXBsZSwgYSBwcm9ncmFtIG1pZ2h0IGluY2x1ZGUKICAgICAgICAgICAgc29tZSBnZW5lcmljIG1ldGhvZCBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICAgICAgTm9kZSAqZ2V0Tm9kZSgpOwoKICAgICAgICAgICAgSG93ZXZlciwgTm9kZSAqIG1heSBqdXN0IGJlIGJhc2UgY2xhc3MgdG8gYSB3aG9sZSBoaWVyYXJjaHkKICAgICAgICAgICAgb2YgZGlmZmVyZW50IG9iamVjdHMuICAgSW5zdGVhZCBvZiByZXR1cm5pbmcgdGhpcyBnZW5lcmljIE5vZGUgKiwKICAgICAgICAgICAgaXQgbWlnaHQgYmUgbmljZSB0byBhdXRvbWF0aWNhbGx5IGRvd25jYXN0IHRoZSBvYmplY3QgaW50byB0aGUKICAgICAgICAgICAgYXBwcm9wcmlhdGUgdHlwZSB1c2luZyBzb21lIGtpbmQgZHluYW1pYyBjYXN0LgoKICAgICAgICAgICAgQXNzdW1pbmcgeW91IHVuZGVyc3RhbmQgdGhlIHBlcmlsIGludm9sdmVkLCBhIGRvd25jYXN0IGNhbiBub3cKICAgICAgICAgICAgYmUgcGVyZm9ybWVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gaW4gdGhlIHJ1bi10aW1lIHR5cGUKICAgICAgICAgICAgY2hlY2tlcjoKCiAgICAgICAgICAgICAgc3dpZ190eXBlX2luZm8gKlNXSUdfVHlwZUR5bmFtaWNDYXN0KHN3aWdfdHlwZV9pbmZvICosIHZvaWQgKipwdHIpOwoKICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBjaGVja3MgdG8gc2VlIGlmIHRoZSB0eXBlIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYW5vdGhlcgogICAgICAgICAgICB0eXBlLiAgSWYgc28sIGEgZGlmZmVyZW50IHR5cGUgZGVzY3JpcHRvciAoZm9yIHRoZSBjb252ZXJ0ZWQgdHlwZSkKICAgICAgICAgICAgaXMgcmV0dXJuZWQuICAgVGhpcyB0eXBlIGRlc2NyaXB0b3Igd291bGQgdGhlbiBiZSB1c2VkIHRvIGNyZWF0ZQogICAgICAgICAgICBhIHBvaW50ZXIgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4KCiAgICAgICAgICAgIFRvIHVzZSB0aGlzLCB5b3Ugd291bGQgd3JpdGUgYSB0eXBlbWFwIHNpbWlsYXIgdG8gdGhpczoKCiAgICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBOb2RlICogewogICAgICAgICAgICAgICAgc3dpZ190eXBlX2luZm8gKnR5ID0gU1dJR19UeXBlRHluYW1pY0Nhc3QoJDFfZGVzY3JpcHRvciwgKHZvaWQgKiopICYkMSk7CiAgICAgICAgICAgICAgICAkcmVzdWx0ID0gU1dJR19OZXdQb2ludGVyT2JqKCQxLCB0eSk7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgQWx0ZXJuYXRpdmVseSwKCiAgICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBOb2RlICogPSBTV0lHVFlQRSAqRFlOQU1JQzsKCiAgICAgICAgICAgIFRvIG1ha2UgdGhlIHR5cGVtYXAgaGF2ZSBhbnkgZWZmZWN0LCB5b3UgaGF2ZSB0byB3cml0ZSBhIHN1cHBvcnRpbmcgCiAgICAgICAgICAgIGZ1bmN0aW9uIHRoYXQga25vd3MgaG93IHRvIHBlcmZvcm0gZG93bmNhc3RpbmcuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgIHN0YXRpYyBzd2lnX3R5cGVfaW5mbyAqCiAgICAgICAgICAgICAgTm9kZV9keW5hbWljX2Nhc3Qodm9pZCAqKnB0cikgewogICAgICAgICAgICAgICAgIE5vZGUgKipucHRyID0gKE5vZGUgKiopIHB0cjsKICAgICAgICAgICAgICAgICBFbGVtZW50ICplID0gZHluYW1pY19jYXN0PEVsZW1lbnQgKj4oKm5wdHIpOwogICAgICAgICAgICAgICAgIGlmIChlKSB7CiAgICAgICAgICAgICAgICAgICAgKnB0ciA9ICh2b2lkICopIGU7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNXSUdUWVBFX3BfRWxlbWVudDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgRGF0YSAqZCA9IGR5bmFtaWNfY2FzdDxEYXRhICo+KCpucHRyKTsKICAgICAgICAgICAgICAgICBpZiAoZCkgewogICAgICAgICAgICAgICAgICAgICpwdHIgPSAodm9pZCAqKSBkOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBTV0lHVFlQRV9wX0RhdGE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgVGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24gb24gaG93IHR5cGVzIGFyZSBkZXRlcm1pbmVkLiBkeW5hbWljX2Nhc3Q8PgogICAgICAgICAgICB1c2VzIEMrKyBSVFRJLiAgSG93ZXZlciwgaWYgeW91IGhhZCBzb21lIG90aGVyIG1lY2hhbmlzbSBmb3IgZGV0ZXJtaW5pbmcKICAgICAgICAgICAgdGhlIHR5cGUsIHlvdSBjb3VsZCB1c2UgdGhhdCBoZXJlLiAgTm90ZTogaXQgaXMgaW1wb3J0YW50IHRvIHNhdmUKICAgICAgICAgICAgdGhlIG5ldyBwb2ludGVyIHZhbHVlIGJhY2sgaW50byB0aGUgYXJndW1lbnQgYXMgc2hvd24uICBXaGVuIGRvd25jYXN0aW5nLAogICAgICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIHBvaW50ZXIgY291bGQgY2hhbmdlLiAKCiAgICAgICAgICAgIEZpbmFsbHksIHRvIG1ha2UgdGhlIGNhc3RpbmcgZnVuY3Rpb24gYXZhaWxhYmxlLCB5b3UgaGF2ZSB0byByZWdpc3RlcgogICAgICAgICAgICBpdCB3aXRoIHRoZSBydW4tdGltZSB0eXBlIGNoZWNrZXIuIFB1dCB0aGlzIG1hY3JvIGluIHlvdXIgaW50ZXJmYWNlIGZpbGUuCgogICAgICAgICAgICAgICBEWU5BTUlDX0NBU1QoU1dJR1RZUEVfcF9Ob2RlLCBOb2RlX2R5bmFtaWNfY2FzdCk7CgogICAgICAgICAgICBOb3RlOiB0aGlzIGZlYXR1cmUgZG9lcyBub3QgaW50cm9kdWNlIGEgcGVyZm9ybWFuY2UgcGVuYWx0eSBvbiAKICAgICAgICAgICAgbm9ybWFsIFNXSUcgb3BlcmF0aW9uLiAgVGhlIGZlYXR1cmUgaXMgb25seSBlbmFibGVkIGJ5IHdyaXRpbmcKICAgICAgICAgICAgYSBuZXcgdHlwZW1hcCB0aGF0IGV4cGxpY2l0bHkgY2FsbHMgU1dJR19UeXBlRHluYW1pY0Nhc3QoKSB0bwogICAgICAgICAgICBtYWtlIGEgY29udmVyc2lvbi4gCiAgCiAgICAgICAgICAgIEV4YW1wbGVzL3Rlc3Qtc3VpdGUvZHluYW1pY19jYXN0LmkgY29udGFpbnMgYSBzaW1wbGUgZXhhbXBsZS4KICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIEphdmEgbW9kdWxlIGR1ZSB0byBkaWZmZXJlbmNlcwogICAgICAgICAgICBpbiB0aGUgdHlwZS1jaGVja2luZyBpbXBsZW1lbnRhdGlvbi4KCiAgICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgRkVBVFVSRSAqKioKCjAzLzE3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU21hbGwgY2hhbmdlIHRvIHR5cGUtbmFtZSBoYW5kbGluZyBvZiB1bm5hbWVkIHN0cnVjdHVyZXMgYW5kCiAgICAgICAgICAgIHR5cGVkZWYuICBJZiBhIHN0cnVjdHVyZSBvZiB0aGlzIGZvcm0gYXBwZWFyczoKCiAgICAgICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCB7CiAgICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgfSBGb287CgogICAgICAgICAgICBUaGVuICdGb28nIGlzIHVzZWQgYXMgdGhlIHByb3BlciB0eXBlbmFtZSBmb3IgdGhlIHN0cnVjdHVyZS4KICAgICAgICAgICAgRnVydGhlcm1vcmUsIEZvbyBjYW4gbm93IGJlIHVzZWQgYXMgYSBuYW1lIGluIEMrKyBpbmhlcml0YW5jZS4KICAgICAgICAgICAgU1dJRyB3YXMgYWxyZWFkeSBraW5kIG9mIGRvaW5nIHRoaXMsIGJ1dCB0aGlzIG1vZGlmaWNhdGlvbiByZWZpbmVzCiAgICAgICAgICAgIHRoZSBpbXBsZW1lbnRhdGlvbiB0byBtb3JlIGNsb3NlbHkgZm9sbG93IHRoZSBDKysgQVJNLCBzZWN0aW9uCiAgICAgICAgICAgIDcuMS4zLCBwLiAxMDYuICBUaGlzIGZpeGVzIGEgY291cGxlIG9mIG9ic2N1cmUgY29ybmVyIGNhc2VzLgoKMDMvMTYvMjAwMjogYmVhemxleQogICAgICAgICAgICBNb2RpZmllZCBDKysgaW5oZXJpdGFuY2Ugd2l0aCBhIGZldyBlbmhhbmNlbWVudHMuICBGaXJzdCwgdHlwZSBpbmZvcm1hdGlvbgogICAgICAgICAgICBuZWVkZWQgZm9yIGNhc3RpbmcgYW5kIHR5cGUtZXF1aXZhbGVuY2UgaXMgZ2VuZXJhdGVkIGV2ZW4gd2hlbiBiYXNlLWNsYXNzZXMKICAgICAgICAgICAgYXJlbid0IGRlZmluZWQgaW4gdGhlIGludGVyZmFjZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyA6IHB1YmxpYyBCYXIgIHsgICAgLyogQmFyIHVuc3BlY2lmaWVkICovCiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgIHZvaWQgYmxhaChCYXIgKmIpOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgYmxhaCgpIGZ1bmN0aW9uIHN0aWxsIGFjY2VwdHMgRm9vICogZXZlbiB0aG91Z2ggbm90aGluZwogICAgICAgICAgICBpcyByZWFsbHkga25vd24gYWJvdXQgQmFyLiAgIFByZXZpb3VzIFNXSUcgdmVyc2lvbnMgd291bGQganVzdCBnZW5lcmF0ZQogICAgICAgICAgICBhIHR5cGUgZXJyb3IuCgogICAgICAgICAgICBJbmhlcml0YW5jZSBoYXMgYWxzbyBiZWVuIG1vZGlmaWVkIHRvIHdvcmsgdGhyb3VnaCB0eXBlZGVmLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgdHlwZWRlZiBCYXIgT3RoZXJCYXI7CiAgICAgICAgICAgICAgIGNsYXNzIEZvbzogcHVibGljIE90aGVyQmFyIHsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgYmFzZSBjbGFzcyBvZiBPdGhlckJhciBpcyBjb3JyZWN0bHkgcmVzb2x2ZWQgYmFjayB0bwogICAgICAgICAgICBCYXIuICAgVGhlIHVzZSBvZiB0aGUgbmFtZSBPdGhlckJhciBpcyBsb3N0IGluIHRoaXMgcmVzb2x1dGlvbiAodGhlIHdyYXBwZXJzCiAgICAgICAgICAgIHdpbGwgc2ltcGx5IHVzZSBCYXIgaW5zdGVhZCBvZiB0aGUgdHlwZWRlZiBuYW1lIE90aGVyQmFyKS4KICAgICAgICAgICAKMDMvMTMvMjAwMjogYmVhemxleQogICAgICAgICAgICAldHlwZW1hcCwgJWFwcGx5LCBhbmQgcmVsYXRlZCBkaXJlY3RpdmVzIGNhbiBub3cgYXBwZWFyIGluc2lkZQogICAgICAgICAgICBjbGFzcyBkZWZpbml0aW9ucy4gICAKCjAzLzEzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSB2YXJpZXR5IG9mIHByb2JsZW1zIHJlbGF0ZWQgdG8gY29tcGlsaW5nIFNXSUcgb24gNjQtYml0CiAgICAgICAgICAgIHBsYXRmb3Jtcy4KCjAzLzEyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoICJpZ25vcmUiIGFuZCAiaW4iIHR5cGVtYXBzLiAgTG9jYWwgdmFyaWFibGVzCiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCAiaW4iIHdlcmUgYmVpbmcgYWRkZWQgdG8gdGhlIHdyYXBwZXIgZnVuY3Rpb24gZXZlbgogICAgICAgICAgICB0aG91Z2ggdGhleSB3ZXJlIG5ldmVyIHVzZWQuICAgTW9zdGx5IGhhcm1sZXNzLCBidXQgaXQgd291bGQgbGVhZAogICAgICAgICAgICB0byBhIHZhcmlldHkgb2YgY29tcGlsYXRpb24gd2FybmluZ3MuCiAgCjAzLzEyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU29tZSBjaGFuZ2VzIHRvIHRoZSBpbnRlcm5hbCB0eXBlIHN5c3RlbSBhbmQgaGFuZGxpbmcgb2YgbmVzdGVkIEMrKwogICAgICAgICAgICB0eXBlcy4gICBJbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiBTV0lHLCBpZiB5b3UgaGFkIHRoZSBmb2xsb3dpbmc6CgogICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgQmxhaDsKICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgIGNsYXNzIEJhciA6IHB1YmxpYyBGb28gewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICB2b2lkIHNvbWVtZXRob2QoQmxhaCB4KTsKICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIGFyZ3VtZW50IHR5cGUgaW4gc29tZW1ldGhvZCgpIHdvdWxkIGltcGxpY2l0bHkgYmUgc2V0IHRvIEJhcjo6QmxhaC4KICAgICAgICAgICAgQWx0aG91Z2ggdGhpcyBpcyB0ZWNobmljYWxseSBhbGxvd2VkLCBpdCBicmVha3MgdHlwZW1hcHMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIEZvbzo6QmxhaCB7IC4uLiB9CgogICAgICAgICAgICBkb2Vzbid0IG1hdGNoIGxpa2UgeW91IGV4cGVjdC4gICBUaGlzIGhhcyBiZWVuIGNoYW5nZWQgaW4gU1dJRy0xLjMuMTIuCiAgICAgICAgICAgIE5vdywgdHlwZXMgYXJlIGV4cGFuZGVkIHVzaW5nIHRoZSBjbGFzcyBpbiB3aGljaCB0aGV5IHdlcmUgZGVmaW5lZC4KICAgICAgICAgICAgU28sIHRoZSBhcmd1bWVudCB0eXBlIGluIHNvbWVtZXRob2QoKSB3aWxsIGJlIEZvbzo6QmxhaC0tLXNpbmNlIHRoZQogICAgICAgICAgICB0eXBlIEJsYWggd2FzIGRlZmluZWQgaW4gRm9vLgogCjAzLzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc29tZSBzdWJ0bGUgdHlwZSBzY29waW5nIHByb2JsZW1zIHdpdGggdHlwZWRlZiBhbmQgQysrIGNsYXNzZXMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgogCiAgICAgICAgICAgICAgICB0eXBlZGVmIGludCBCbGFoOwogICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICB0eXBlZGVmIGRvdWJsZSBCbGFoOwogICAgICAgICAgICAgICAgICAgIHZvaWQgZm9vKEJsYWggeCwgOjpCbGFoIHkpOwogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CgowMy8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEhpZ2hseSBleHBlcmltZW50YWwgY2hhbmdlIHRvIGhhbmRsZSB2YXJpYWJsZSBsZW5ndGggYXJndW1lbnRzLgogICAgICAgICAgICBGaXJzdCwgdGhlcmUgaXMgbm8gcG9ydGFibGUgb3IgcmVsaWFibGUgd2F5IHRvIHdyYXAKICAgICAgICAgICAgYSB2YXJhcmdzIGZ1bmN0aW9uIGluIGZ1bGwgZ2VuZXJhbGl0eS4gIEhvd2V2ZXIsIHlvdSAqY2FuKiBjaGFuZ2UKICAgICAgICAgICAgdGhlIGZ1bmN0aW9uIHNpZ25hdHVyZSB1c2luZyAldmFyYXJncy4KCiAgICAgICAgICAgICAgICV2YXJhcmdzKGNoYXIgKikgZnByaW50ZjsKICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIHZvaWQgZnByaW50ZihGSUxFICpmLCBjaGFyICpmbXQsIC4uLik7CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSB2YXJpYWJsZSBsZW5ndGggcGFyYW1ldGVyICIuLi4iIGlzCiAgICAgICAgICAgIHNpbXBseSByZXBsYWNlZCBieSB0aGUgcGFyYW1ldGVycyBnaXZlbiBpbiAldmFyYXJncy4gVGhpcwogICAgICAgICAgICByZXN1bHRzIGluIGEgZnVuY3Rpb24gbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgdm9pZCBmcHJpbnRmKEZJTEUgKmYsIGNoYXIgKmZtdCwgY2hhciAqcyk7CgogICAgICAgICAgICBNb3JlIHRoYW4gb25lIGFyZ3VtZW50IGNhbiBiZSB1c2VkIGFuZCBkZWZhdWx0IHZhbHVlcwogICAgICAgICAgICBjYW4gYmUgZGVmaW5lZC4gIEZvciBleGFtcGxlLCB0aGlzIGNvZGUgc3BlY2lmaWVzIGEKICAgICAgICAgICAgbWF4aW11bSBvZiBmb3VyIGFyZ3VtZW50cy4KCiAgICAgICAgICAgICAgICV2YXJhcmdzKGNoYXIgKngxID0gMCwgY2hhciAqeDIgPSAwLCBjaGFyICp4MyA9IDAsIGNoYXIgKng0ID0gMCkgZnByaW50ZjsKIAogICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIE5FVyBGRUFUVVJFICoqKgogCjAzLzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQ2hhbmdlIHRvIGhhbmRsaW5nIG9mIHZhcmlhYmxlIGxlbmd0aCBhcmd1bWVudHMuICB2YXJhcmdzCiAgICAgICAgICAgIGlzIG5vdyBoYW5kbGVkIGFzIGEgcHJvcGVyIHBhcmFtZXRlciBhbmQgaXMgcGFzc2VkIHRvIHRoZQogICAgICAgICAgICBjb2RlIGdlbmVyYXRvci4gIEhvd2V2ZXIsIGl0IHN0aWxsIGNhbid0IGJlIGhhbmRsZWQgY29ycmVjdGx5CiAgICAgICAgICAgIChhbmQgd2lsbCBnZW5lcmF0ZSBhIHR5cGVtYXAgd2FybmluZykuICAgVGhpcyBjaGFuZ2UgaGFzIGJlZW4KICAgICAgICAgICAgbWFkZSB0byBiZXR0ZXIgaW5jb3Jwb3JhdGUgdmFyaWFibGUgbGVuZ3RoIGFyZ3VtZW50cyB3aXRoIG90aGVyCiAgICAgICAgICAgIGRpcmVjdGl2ZXMgc3VjaCBhcyAlaWdub3JlLCAlcmVuYW1lLCAlZmVhdHVyZSwgYW5kIHNvIGZvcnRoLgoKMDMvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDUyMjU1NSBdIFN5bnRheCBlcnJvciBwYXJzaW5nICJkZWZpbmUiIGNvbnN0cnVjdC4gU1dJRwogICAgICAgICAgICBpcyBhIGxpdHRsZSBtb3JlIHJlc3RyaWN0aXZlIGluIGRldGVybWluaW5nICNkZWZpbmUgc3RhdGVtZW50cwogICAgICAgICAgICB0aGF0IHdpbGwgYmUgd3JhcHBlZCBhcyBjb25zdGFudHMuICBBbHNvIGFkZGVkIGEgYmV0dGVyIHBhcnNlcgogICAgICAgICAgICBlcnJvciBydWxlIGZvciBoYW5kbGluZyBiYWQgY29uc3RhbnRzLgoKMDMvMDgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBCdWcgZml4OiBDbGFzc2VzIHJlbmFtZWQgd2l0aCAlcmVuYW1lIHRoYXQgYXJlIGRlcml2ZWQgZnJvbSAKICAgICAgICAgICAgYW5vdGhlciBjbGFzcyBnZW5lcmF0ZSBtb3JlIGFwcHJvcHJpYXRlIHNoYWRvdyBjbGFzcyBjb2RlLgoKMDMvMDgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXhlZCBTRiBbICM1MjM2MzIgXSBhbmQgWyAjNTEzMzM1IF0gYm90aCByZXBvcnRlZCBieSBJc3JhZWwgCiAgICAgICAgICAgIFRhbm5lci4gU3VwcG9ydCBmb3IgdHlwZXMgdGhhdCBhcmUgdXNlZCB3aGljaCBhcmUgaW4gYSB0eXBlZGVmLiBUaGUKICAgICAgICAgICAgYXBwcm9wcmlhdGUgc2hhZG93IGNsYXNzIG5hbWUgaXMgZ2VuZXJhdGVkLiBBbHNvIGdlbmVyYXRlZCBjb3JyZWN0CiAgICAgICAgICAgIHNoYWRvdyBjbGFzc25hbWUgd2hlbiBhIHRlbXBsYXRlZCBjbGFzcyBpcyB1c2VkIHdpdGhpbiBhbm90aGVyIAogICAgICAgICAgICB0ZW1wbGF0ZWQgY2xhc3MuIFNlZSB0aGUgY3BwX3R5cGVkZWYuaSB0ZXN0Y2FzZS4KCjAzLzA4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQnVnIGZpeDogTm8gdHlwZSB3YXMgZ2VuZXJhdGVkIGluIHNoYWRvdyBjbGFzc2VzIGZvciB0eXBlcyAKICAgICAgICAgICAgdGhhdCB3ZXJlbid0IHdyYXBwZWQgYnkgU1dJRy4gIFRoZSB0eXBlIGlzIHRyZWF0ZWQgYXMgYSByYXcgCiAgICAgICAgICAgIHBvaW50ZXIsIGllIG5vIHNoYWRvdyBjbGFzcy4KCjAyLzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgUmVmaW5lZCB0aGUgbWF0Y2hpbmcgYWxnb3JpdGhtIHVzZWQgYnkgJXJlbmFtZSwgJWlnbm9yZSwgYW5kCiAgICAgICAgICAgICVmZWF0dXJlLiAgIElmIGEgdHlwZSBzaWduYXR1cmUgaXMgc3VwcGxpZWQsIGl0IG11c3QgZXhhY3RseQogICAgICAgICAgICBtYXRjaCB0aGF0IHVzZWQgaW4gdGhlIGRlY2xhcmF0aW9uLS0taW5jbHVkaW5nIGFueSB1c2Ugb2YKICAgICAgICAgICAgY29uc3QuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlcmVuYW1lKGZvbzEpICAgZm9vKGludCk7CiAgICAgICAgICAgICAgICAlcmVuYW1lKGJhcjEpICAgYmFyKGludCkgY29uc3Q7CgogICAgICAgICAgICAgICAgY2xhc3MgQmxhaCB7CiAgICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQpOyAgICAgICAvLyBNYXRjaGVkIC0tPiBmb28xCiAgICAgICAgICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQpIGNvbnN0OyAvLyBOb3QgbWF0Y2hlZCAKICAgICAgICAgICAgICAgICAgICAgIHZvaWQgYmFyKGludCk7ICAgICAgIC8vIE5vdCBtYXRjaGVkCiAgICAgICAgICAgICAgICAgICAgICB2b2lkIGJhcihpbnQpIGNvbnN0OyAvLyBNYXRjaGVkIC0tPiBiYXIxCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBJbiBwcmV2aW91cyB2ZXJzaW9ucywgYSBub24tY29uc3Qgc3BlY2lmaWNhdGlvbiB3b3VsZCBtYXRjaAogICAgICAgICAgICBib3RoIHRoZSBub24tY29uc3QgYW5kIGNvbnN0IGRlY2xhcmF0aW9ucy4gIEhvd2V2ZXIsIHRoZSB3aG9sZQogICAgICAgICAgICBwb2ludCBvZiAlcmVuYW1lIGFuZCByZWxhdGVkIGRpcmVjdGl2ZXMgaXMgdGhhdCB0aGV5IGJlIGFibGUKICAgICAgICAgICAgdG8gcHJlY2lzZWx5IHBpbnBvaW50IGV4YWN0IGRlY2xhcmF0aW9ucyBpbiBhbiBpbnRlcmZhY2UuICBUaGlzCiAgICAgICAgICAgIGZpeGVzIHRoZSBwcm9ibGVtLgoKMDIvMjEvMjAwMjogYmVhemxleQogICAgICAgICAgICBSZXdvcmtlZCB0aGUgaGFuZGxpbmcgb2YgZGVmYXVsdCBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvcnMuCiAgICAgICAgICAgIFNXSUcgbm93IG1ha2VzIGEgcHJlbGltaW5hcnkgcGFzcyBvdmVyIHRoZSBwYXJzZSB0cmVlIHRvIGRpc2NvdmVyCiAgICAgICAgICAgIHdoaWNoIGNsYXNzZXMgc3VwcG9ydCBkZWZhdWx0IGFsbG9jYXRpb24uICAgVGhpcyBmaXhlcyBhIG51bWJlcgogICAgICAgICAgICBvZiB2ZXJ5IHN1YnRsZSBpc3N1ZXMgaW4gY29kZSBnZW5lcmF0aW9uIGFuZCBjYWxsL3JldHVybiBieSB2YWx1ZS4KCjAyLzE4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBJbXByb3ZlZCBzdXBwb3J0IG9uIEN5Z3dpbjogUGVybCwgUHl0aG9uLCBUY2wsIFJ1YnkgYW5kIEphdmEgc2hvdWxkCiAgICAgICAgICAgIHdvcmsgb3V0IG9mIHRoZSBib3gsIGJhcnJpbmcgdGhlIHJ1bnRpbWUgbGlicmFyeS4gUmVtb3ZlZCBkbGx3cmFwIAogICAgICAgICAgICBhbmQgcmVwbGFjZWQgd2l0aCBuZXdseSB3b3JraW5nIGdjYyAtc2hhcmVkIGluc3RlYWQgZm9yIEN5Z3dpbi4gCiAgICAgICAgICAgIEFsbCB0aGlzIHdpbGwgcmVxdWlyZSB0aGUgbmV3IGltcHJvdmVkIGJpbnV0aWxzIDIwMDEwODAyIGFuZCBsYXRlciwKICAgICAgICAgICAgYnV0IHRoZSBsYXRlc3QgQ3lnd2luIGlzIHVzdWFsbHkgdGhlIGJlc3QgcmVjb21tZW5kYXRpb24uCgowMi8xNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHNvbWUgcHJvYmxlbXMgcmVsYXRlZCB0byB3cmFwcGluZyBvZiBnbG9iYWwgdmFyaWFibGVzCiAgICAgICAgICAgIGFuZCBQZXJsIHNoYWRvdyBjbGFzc2VzLiBSZXBvcnRlZCBieSBDaGlhLWxpYW5nIEthby4KCjAyLzE1LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBNYWRlIGEgZml4IHRvIHRoZSBjb2RlIGdlbmVyYXRpb24gZm9yIEMrKyBjbGFzcwogICAgICAgICAgICBjb25zdHJ1Y3RvcnMgc28gdGhhdCB3ZSBnZXQgYm90aCBhICJuZXciIHNpbmdsZXRvbiBtZXRob2QKICAgICAgICAgICAgYW5kIGFuICJpbml0aWFsaXplIiBpbnN0YW5jZSBtZXRob2QgZm9yIGVhY2ggY2xhc3MuIFRoaXMKICAgICAgICAgICAgY2hhbmdlIGVuYWJsZXMgZGV2ZWxvcGVycyB0byBkZXJpdmUgbmV3IFJ1YnkgY2xhc3NlcyBmcm9tCiAgICAgICAgICAgIFNXSUctd3JhcHBlZCBDKysgY2xhc3NlcyBhbmQgdGhlbiBvdmVycmlkZSB0aGVpciBpbml0aWFsaXplCiAgICAgICAgICAgIG1ldGhvZHMgdG8gcHJvdmlkZSBzdWJjbGFzcy1zcGVjaWZpYyBpbnN0YW5jZSBpbml0aWFsaXphdGlvbi4KCjAyLzE1LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBNYXNzaXZlIGRvY3VtZW50YXRpb24gdXBkYXRlIGZvciB0aGUgUnVieSBtb2R1bGUsCiAgICAgICAgICAgIGNvbnRyaWJ1dGVkIGJ5IENyYWlnIEZpbGVzLgoKMDIvMTQvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEJ1ZyBmaXg6IEFuIGVycm9yIGluIHRoZSBTV0lHIHJ1bnRpbWUgc3VwcG9ydCBmb3IgUnVieQogICAgICAgICAgICB3YXMgY2F1c2luZyBzZXZlcmFsIG9mIHRoZSBleGFtcGxlcyB0byBmYWlsLiBSZXBvcnRlZCBieQogICAgICAgICAgICBXaWxsaWFtIEZ1bHRvbi4KCjAyLzE0LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBCdWcgZml4OiBFbnVtZXJhdGlvbnMgZGVmaW5lZCB3aXRoaW4gYSBjbGFzcyAoc3VjaAogICAgICAgICAgICBhcyB0aG9zZSBzZWVuIGluIHRoZSBFeGFtcGxlcy9ydWJ5L2VudW0gZXhhbXBsZSkgd2VyZSBub3QKICAgICAgICAgICAgYmVpbmcgZXhwb3J0ZWQgd2l0aCB0aGUgY29ycmVjdCBuYW1lcy4gUmVwb3J0ZWQgYnkgV2lsbGlhbQogICAgICAgICAgICBGdWx0b24uCgowMi8xMy8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgYSB3YXJuaW5nIG1lc3NhZ2Ugd2hlbiB3ZSBydW4gYWNyb3NzIG92ZXJsb2FkZWQKICAgICAgICAgICAgY2xhc3MgY29uc3RydWN0b3JzIGZvciBDKysgY29kZSwgdGhhdCB0aGlzIGlzIGN1cnJlbnRseSBub3QKICAgICAgICAgICAgc3VwcG9ydGVkIChldmVuIGlmIHRoZSBvdmVybG9hZHMgaGF2ZSBiZWVuICVyZW5hbWVkKS4gRm9yIGFuCiAgICAgICAgICAgIGV4YW1wbGUgb2Ygd2hlcmUgdGhpcyBkb2Vzbid0IHdvcmssIHNlZSBFeGFtcGxlcy9ydWJ5L29wZXJhdG9yLgoKMDIvMTMvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIGFuICJpZ25vcmVkIiB3YXJuaW5nIG1lc3NhZ2Ugd2hlbiB0aGUgcGFyc2VyIHJ1bnMKICAgICAgICAgICAgYWNyb3NzIGFuIG9wZXJhdG9yIT0oKSBkZWNsYXJhdGlvbiBmb3IgQysrIGNvZGUuCgowMi8xMS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgdGhlICJpbXBvcnQiLCAiaW1wb3J0X3RlbXBsYXRlIiwgIm9wZXJhdG9yIiBhbmQKICAgICAgICAgICAgInRlbXBsYXRlIiBleGFtcGxlcy4KCjAyLzExLzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBtdWx0aS1tb2R1bGUgc3VwcG9ydC4KCjAyLzA5LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCB0aGUgbWlzc2luZyAiI2RlZmluZSBTV0lHX05PSU5DTFVERSIgYXQgdGhlIHRvcCBvZgogICAgICAgICAgICB0aGUgd3JhcHBlciBjb2RlIHdoZW4gdGhlICctYycgb3B0aW9uIGlzIHVzZWQuCgowMi8wOS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBDb3JyZWN0ZWQgYSBtaW5vciBvZmYtYnktb25lIGVycm9yIGZvciB0aGUgc2l6ZSBvZiB0aGUKICAgICAgICAgICAgc3dpZ190eXBlc1tdIGFycmF5IHRoYXQncyBnZW5lcmF0ZWQgaW4gdGhlIHdyYXBwZXIgY29kZS4KCjAyLzA4LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgU0YgWyAjNTE1MDU4IF0gV3JvbmcgY29kZSBmb3IgQysrIHRlbXBsYXRlcy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgSXNyYWVsIFRhbGxlci4KClZlcnNpb24gMS4zLjExIChKYW51YXJ5IDMxLCAyMDAyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjAxLzMwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4IHRvIHBhc3MvcmV0dXJuIGJ5IHZhbHVlIGZvciBDKysgb2JqZWN0cyB0aGF0IGRlZmluZQogICAgICAgICAgICBubyBkZWZhdWx0IGNvbnN0cnVjdG9yLiAgQ2hhbmdlcyB0byB0aGUgdHlwZW1hcCBzeXN0ZW0KICAgICAgICAgICAgbWFkZSBpdCBpbXBvc3NpYmxlIHRvIHdyYXAgQysrIG9iamVjdHMgd2l0aCBubyBkZWZhdWx0CiAgICAgICAgICAgIGNvbnN0cnVjdG9yLiAgIFRoaXMgaGFzIGJlZW4gZml4ZWQsIGJ1dCB0aGUgc29sdXRpb24gCiAgICAgICAgICAgIGludm9sdmVzIHNvbWUgY2xldmVyIHRlbXBsYXRlIG1hZ2ljIGNvbnRyaWJ1dGVkIGJ5IAogICAgICAgICAgICBXaWxsaWFtIEZ1bHRvbi4gIFBsZWFzZSBzZWUgdGhlIGNvbW1lbnRzIGluIHRoZSBmaWxlCiAgICAgICAgICAgIExpYi9zd2lnLnN3ZyBmb3IgZnVydGhlciBkZXRhaWxzLiAgVGhpcyBzb2x1dGlvbiBpcwogICAgICAgICAgICBleHBlcmltZW50YWwgYW5kIG1heSBiZSByZWZpbmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuCgowMS8zMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEdsb2JhbCB2YXJpYWJsZXMgYW5kIG1lbWJlciBkYXRhIG9mIHR5cGUgImNvbnN0IGNoYXIgKiIKICAgICAgICAgICAgY2FuIGJlIHNldCwgYnV0IHRoZSBvbGQgdmFsdWUgaXMgc2lsZW50bHkgZGlzY2FyZGVkIHdpdGhvdXQKICAgICAgICAgICAgYW55IGdhcmJhZ2UgY29sbGVjdGlvbi4gICBUaGlzIG1heSBnZW5lcmF0ZSBhIG1lbW9yeSBsZWFrLgogICAgICAgICAgICBUaGlzIGNoYW5nZSBpcyBuZWVkZWQgdG8gbW9yZSBzYWZlbHkgaGFuZGxlIHZhcmlhYmxlcwogICAgICAgICAgICBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9vID0gIkhlbGxvIFdvcmxkXG4iOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBpdCdzIG5vdCBzYWZlIHRvIGZyZWUgdGhlIG9sZCB2YWx1ZS4gIEhvd2V2ZXIsCiAgICAgICAgICAgIFNXSUcgY2FuIGR5bmFtaWNhbGx5IGFsbG9jYXRlIGEgbmV3IHZhbHVlIGFuZCBtYWtlIGZvbyBwb2ludAogICAgICAgICAgICB0byBpdC4gICBUbyBmaXggdGhpcyBtZW1vcnkgbGVhaywgeW91IGNhbiBwcm9iYWJseSBkbyB0aGlzOgoKICAgICAgICAgICAgICAgJWNsZWFyIGNvbnN0IGNoYXIgKmZvbzsKICAgICAgICAgICAgICAgJWFwcGx5IGNoYXIgKiB7Y29uc3QgY2hhciAqZm9vfTsKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICAKMDEvMzAvMjAwMjogYmVhemxleQogICAgICAgICAgICBUd28gbWlub3IgdHlwZW1hcCBlbmhhbmNlbWVudHMgaGF2ZSBiZWVuIGFkZGVkLiAgRmlyc3QsCiAgICAgICAgICAgIHR5cGVtYXBzIGNhbiBpc3N1ZSBhIHdhcm5pbmcgbWVzc2FnZSBieSBpbmNsdWRpbmcgYSBzcGVjaWFsCiAgICAgICAgICAgIHdhcm5pbmcgYXR0cmlidXRlLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAldHlwZW1hcChpbix3YXJuaW5nPSJJJ20gZ29pbmcgdG8gZG8gc29tZXRoaW5nIGRhbmdlcm91cyIpIC4uLgoKICAgICAgICAgICAgVGhlIHdhcm5pbmcgbWVzc2FnZSB3aWxsIHNob3cgdXAgd2hlbmV2ZXIgdGhlIHR5cGVtYXAgaXMKICAgICAgICAgICAgYXBwbGllZC4KCiAgICAgICAgICAgIFNlY29uZCwgYSB0eXBlbWFwIGNhbiBmb3JjZSBhIG5vLW1hdGNoIGJ5IGRlZmluaW5nCgogICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHNvbWV0eXBlICJwYXNzIgoKICAgICAgICAgICAgSWYgdGhpcyBpcyB1c2VkLCB0aGUgdHlwZW1hcCBzeXN0ZW0gd2lsbCAqbm90KiByZWNvcmQgYQogICAgICAgICAgICB0eXBlbWFwIG1hdGNoIGZvciAic29tZXR5cGUiLiAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gYmxvY2sKICAgICAgICAgICAgc2VsZWN0ZWQgdHlwZW1hcHMuICBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnRlZCB0byBkaXNhYmxlCiAgICAgICAgICAgIGEgdHlwZW1hcCBmZWF0dXJlIGZvciBzb21lIHR5cGUsIHlvdSBjb3VsZCBkbyB0aGlzLgoKICAgICAgICAgICAgICAgLy8gRG8gbm90IGFsbG93IGdsb2JhbCB2YXJpYWJsZXMgb2YgdHlwZSAnY29uc3QgY2hhciAqJyB0byBiZSBzZXQuCiAgICAgICAgICAgICAgICV0eXBlbWFwKHZhcmluKSBjb25zdCBjaGFyICogInBhc3MiCgogICAgICAgICAgICBJdCBtaWdodCBhbHNvIGJlIHBvc3NpYmxlIHRvIHVzZSB0aGlzIHRvIGRvIHN1YnRsZSBhbmQKICAgICAgICAgICAgc3RyYW5nZSB0aGluZ3Mgd2l0aCB0eXBlbWFwcy4gIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudGVkIHRvCiAgICAgICAgICAgIG1ha2UgJ2JsYWggKicgYW4gb3V0cHV0IHZhbHVlIGFuZCAnY29uc3QgYmxhaCAqJyBhbiBpbnB1dAogICAgICAgICAgICBwYXJhbWV0ZXIsIHlvdSBtaWdodCBkbyB0aGlzOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGlnbm9yZSkgYmxhaCAqKGJsYWggdGVtcCkgewogICAgICAgICAgICAgICAgICAgICQxID0gJnRlbXA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAldHlwZW1hcChhcmdvdXQpIGJsYWggKiB7CiAgICAgICAgICAgICAgICAgICAgLi4uIHJldHVybiBhIHZhbHVlIC4uLgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyogQmxvY2sgdW5xdWFsaWZpZWQgdHlwZW1hcHMgZGVmaW5lZCBhYm92ZSAqLwogICAgICAgICAgICAgICAgJXR5cGVtYXAoaWdub3JlKSBjb25zdCBibGFoICogInBhc3MiCiAgICAgICAgICAgICAgICAldHlwZW1hcChhcmdvdXQpIGNvbnN0IGJsYWggKiAicGFzcyIKICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSAgICAgY29uc3QgYmxhaCAqIHsKICAgICAgICAgICAgICAgICAgICAuLi4gZ2V0IGlucHV0IHZhbHVlIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgIChUaGlzIHBvdGVudGlhbCBhcHBsaWNhdGlvbnMgb2YgdHlwZW1hcHMgc3VnZ2VzdGVkIGJ5IEdyZWcgU3RlaW4pLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowMS8yOS8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gQnVnIGZpeDogTm8gZW51bWVyYXRpb25zIHdlcmUgd3JhcHBlZCB3aGVuIHRoZSAtc2hhZG93IAogICAgICAgICAgIGNvbW1hbmRsaW5lIG9wdGlvbiB3YXMgbm90IHNwZWNpZmllZC4gUmVwb3J0ZWQgYnkgSXNyYWVsIFRhbGxlci4KCjAxLzI4LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBHbG9iYWwgYXJyYXlzIGFyZSBzdWNjZXNzZnVsbHkgd3JhcHBlZC4gSW4gZmFjdCB0aGV5IHN0YXJ0ZWQKICAgICAgICAgICBtb3N0bHkgd29ya2luZyBpbiBTV0lHLTEuMy4xMC4KCjAxLzI4LzIwMDI6cmljaGFyZHAKCSAgIEFkZGVkIGZpcnN0IGF0dGVtcHQgYXQgQysrIGFuZCAtc2hhZG93IHN1cHBvcnQgZm9yIFBIUDQgbW9kdWxlLAoJICAgcGxlYXNlIHRlc3QgYW5kIG1haWwgbWUgaWYgYW55IHByb2JsZW1zL2lkZWFzIG9uIGltcHJvdmluZyBpdC4KCgkgICBUaGVyZSBpcyBhIGtub3duIHByb2JsZW0gd2l0aCB1bmluaXRpYWxpemVkIG1lbWJlciB2YXJpYWJsZXMsCgkgICBwbGVhc2Ugc2VlIEV4YW1wbGVzL3BocDQvc3luYy9SRUFETUUgZm9yIGRldGFpbHMuCgoJICAgQWxzbyBtb3JlIFBIUCBkb2N1bWVudGF0aW9uIGFkZGVkIHRvIERvYy9NYW51YWwvUGhwLmh0bWwKCjAxLzI3LzIwMDI6YmVhemxleQogICAgICAgICAgIFRoZSBBTlNJIEMgc2l6ZV90IHR5cGUgaXMgbm93IHJlY29nbml6ZWQgYXMgYW4gaW50ZWdlciBieSBkZWZhdWx0LgoKMDEvMjYvMjAwMjpiZWF6bGV5CiAgICAgICAgICAgbG9uZyBsb25nIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcgc3VwcG9ydCBhZGRlZCB0byBtYW55IGxhbmd1YWdlIG1vZHVsZXMuCiAgICAgICAgICAgVGhpcyBpcyBub3QgYSBwb3J0YWJsZSBmZWF0dXJlIGFuZCB3aWxsIHJlcXVpcmUgY29tcGlsZXIgc3VwcG9ydAogICAgICAgICAgIGZvciB0aGUgbG9uZyBsb25nIHR5cGUuICBJbiB0YXJnZXQgbGFuZ3VhZ2VzIHRoYXQgZG8gbm90IHN1cHBvcnQKICAgICAgICAgICBsb25nIGxvbmcgKGUuZy4sIFRjbCBhbmQgUGVybCksIG51bWJlcnMgYXJlIGNvbnZlcnRlZCB0byBhIHN0cmluZwogICAgICAgICAgIG9mIGRpZ2l0cy4gIFRoaXMgcHJldmVudHMgdGhlaXIgdXNlIGluIGFyaXRobWV0aWMgY2FsY3VsYXRpb25zLCBidXQKICAgICAgICAgICBzdGlsbCBhbGxvd3MgdmFsdWVzIHRvIGJlIHNldCBmcm9tIGEgc3RyaW5nLiAgCgogICAgICAgICAgIGxvbmcgbG9uZyBzdXBwb3J0IHJlcXVpcmVzIHRoZSB1c2Ugb2YgdGhlIHN0cnRvbGwoKSBhbmQgc3RydG91bGwoKQogICAgICAgICAgIGZ1bmN0aW9ucyBhcyB3ZWxsIGFzIHRoZSAnbGxkJyBhbmQgJ2xsdScgZm9ybWF0IHNwZWNpZmllcnMKICAgICAgICAgICBvZiBzcHJpbnRmKCkuCgowMS8yNi8yMDAyOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBbICM1MDE4MjcgXSBEZWxldGUgbWV0aG9kIGlzIG5vdCBjYWxsZWQuICAgVGhlIFRjbAogICAgICAgICAgIG1vZHVsZSB3YXNuJ3QgY29ycmVjdGx5IGNhbGxpbmcgZGVzdHJ1Y3RvcnMgd2hlbiB0aGV5CiAgICAgICAgICAgd2VyZSBkZWZpbmVkIHVzaW5nICVhZGRtZXRob2RzLiAgVGhpcyBoYXMgYmVlbiBmaXhlZC4KICAgICAgICAgICBSZXBvcnRlZCBieSBSZWluaGFyZCBGb2JiZS4KCjAxLzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICBCZXR0ZXIgc3VwcG9ydCBmb3IgbG9uZyBsb25nIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcuICBUeXBlbWFwcwogICAgICAgICAgIGhhdmUgYmVlbiBpbmNsdWRlZCBpbiBhIG51bWJlciBvZiBtb2R1bGVzIGZvciBoYW5kbGluZyB0aGVzZSB0eXBlcy4KICAgICAgICAgICBJbiBhZGRpdGlvbiwgdGhlIHBhcnNlciBoYXMgYmVlbiBtb2RpZmllZCB0byBhY2NlcHQgbG9uZyBsb25nCiAgICAgICAgICAgbGl0ZXJhbHMgc3VjaCBhcyAxMjM0TEwgYW5kIDEyMzRVTEwuCgowMS8yNy8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gQSBDIGNoYXJbXSBpcyBtYXBwZWQgdG8gYSBKYXZhIFN0cmluZyB3aGljaCBpcyB0aGUgZGVmYXVsdCAKICAgICAgICAgICBTV0lHIGhhbmRsaW5nIG9mIGNoYXJbXSBhbmQgY2hhciouIEl0IHVzZWQgdG8gYmUgbWFwcGVkIHRvIGJ5dGVbXS4gCiAgICAgICAgICAgTm90ZSB0aGF0IGEgQyBzaWduZWQgY2hhcltdIGFycmF5IGlzIG1hcHBlZCB0byBieXRlW10uCgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMDEvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgIEZpeGVkIGEgcHJvYmxlbSB3aXRoIHJldHVybi1ieS12YWx1ZSwgQysrLCBhbmQKICAgICAgICAgICBvYmplY3RzIHRoYXQgZGVmaW5lIG5vIGRlZmF1bHQgY29uc3RydWN0b3IuCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgSm9lbCBSZWVkLgoKMDEvMjUvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIE92ZXJoYXVsIG9mIHRoZSBKYXZhIG1vZHVsZS4gVGhlIEMgY29kZSBnZW5lcmF0aW9uIGlzIG5vdyAKICAgICAgICAgICBkb25lIGZyb20gdHlwZW1hcHMuCgowMS8yNC8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gU3VwcG9ydCBmb3IgYXJyYXlzIG9mIGVudW0gcG9pbnRlcnMKCjAxLzIwLzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBFcnJvciBjaGVja2luZyBmb3IgbnVsbCBKYXZhIG9iamVjdHMgYmVpbmcgcGFzc2VkIHRvIG5hdGl2ZSAKICAgICAgICAgICBmdW5jdGlvbnMuICBFeGNlcHRpb24gdGhyb3duIG5vdyB3aGVyZWFzIGJlZm9yZSB0aGUgSlZNIGNyYXNoZWQuCgowMS8xOC8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gQ29ycmVjdGVkIGJlaGF2aW91ciBmb3IgZnVuY3Rpb25zIHRoYXQgdGFrZSBhcnJheXMuIEZvciAKICAgICAgICAgICBleGFtcGxlLCB3aGVuIHRoaXMgYyBmdW5jdGlvbjogCgogICAgICAgICAgIHZvaWQgYXJyYXlmbihpbnQgYXJyYXlbXSk7CiAgICAgICAgICAgCiAgICAgICAgICAgaXMgd3JhcHBlZCB0aGUgY29ycmVzcG9uZGluZyBuYXRpdmUgZnVuY3Rpb24KCiAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBuYXRpdmUgdm9pZCBhcnJheWZuKGludFtdIGFycmF5KTsKCiAgICAgICAgICAgaXMgcHJvZHVjZWQuIFByZXZpb3VzbHkgaWYgdGhlIEMgZnVuY3Rpb24gbWFkZSBhbnkgY2hhbmdlcyB0byB0aGUgCiAgICAgICAgICAgYXJyYXkgZWxlbWVudHMsIHRoZXNlIHdlcmUgbm90IHJlZmxlY3RlZCBiYWNrIGludG8gdGhlIEphdmEgYXJyYXkuIAogICAgICAgICAgIFRoaXMgaGFzIG5vdyBiZWVuIGNvcnJlY3RlZCBzbyB0aGF0IHRoZSBjaGFuZ2VzIGFyZSBwcm9wb2dhdGVkIGJhY2sKICAgICAgICAgICB0byBKYXZhIGFuZCB0aGUgY2FsbGluZyBmdW5jdGlvbiB3aWxsIHNlZSB0aGVzZSBjaGFuZ2VzLiBUaGlzIGlzIAogICAgICAgICAgIGhvdyBwdXJlIEphdmEgZnVuY3Rpb25zIHdvcmssIGllIGFycmF5cyBhcmUgcGFzc2VkIGJ5IHJlZmVyZW5jZS4KCjAxLzE1LzIwMDI6bWtvZXBwZQogICAgICAgICAgIFtHdWlsZV0gTmV3IGZpbGUgY3BsdXNwbHVzLmkgd2l0aCBDKysgdHlwZW1hcHMgY29udHJpYnV0ZWQKICAgICAgICAgICBieSBNYXJjaW8gTHVpcyBUZWl4ZWlyYSA8bWFyY2lvdEBob2xseS5jb2xvc3RhdGUuZWR1Pi4KCjAxLzExLzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBDaGFuZ2VkIG1hcHBpbmcgb2YgQyBsb25nIHRvIEphdmEgdHlwZS4gV2FzIG1hcHBlZCB0byBKYXZhCiAgICAgICAgICAgbG9uZywgbm93IG1hcHBlZCB0byBKYXZhIGludC4gSWYgeW91IHdhbnQgdGhlIHByZXZpb3VzIG1hcHBpbmcgdG8gCiAgICAgICAgICAgSmF2YSBsb25nIHVzZSB0aGlzIGFwcHJvYWNoIGluIHlvdXIgaW50ZXJmYWNlIGZpbGU6CiAgICAgICAgICAgCiAgICAgICAgICAgICAlY2xlYXIgbG9uZzsKICAgICAgICAgICAgICV0eXBlbWFwKGpuaSkgbG9uZyAgICAgICAgICAgICAiamxvbmciCiAgICAgICAgICAgICAldHlwZW1hcChqdHlwZSkgbG9uZyAgICAgICAgICAgImxvbmciCiAgICAgICAgICAgICAldHlwZW1hcChqc3R5cGUpIGxvbmcgICAgICAgICAgImxvbmciCgogICAgICAgICAgICAgJWNsZWFyIGxvbmdbQU5ZXTsKICAgICAgICAgICAgICV0eXBlbWFwKGpuaSkgbG9uZ1tBTlldICAgICAgICAiamxvbmdBcnJheSIKICAgICAgICAgICAgICV0eXBlbWFwKGp0eXBlKSBsb25nW0FOWV0gICAgICAibG9uZ1tdIgogICAgICAgICAgICAgJXR5cGVtYXAoanN0eXBlKSBsb25nW0FOWV0gICAgICJsb25nW10iCiAgICAgICAgICAgICAldHlwZW1hcChpbikgbG9uZ1tBTlldICAgICAgICAge3dyaXRlIG1lIGZvciBhcnJheSBzdXBwb3J0fQogICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBsb25nW0FOWV0gICAgICAgIHt3cml0ZSBtZSBmb3IgYXJyYXkgc3VwcG9ydH0KICAgICAgICAgICAgICV0eXBlbWFwKGFyZ291dCkgbG9uZ1tBTlldICAgICB7d3JpdGUgbWUgZm9yIGFycmF5IHN1cHBvcnR9CiAgICAgICAgICAgICAldHlwZW1hcChmcmVlYXJnKSBsb25nW0FOWV0gICAge3dyaXRlIG1lIGZvciBhcnJheSBzdXBwb3J0fQoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCiAgICAgICAgICAgVGhpcyBuZXcgbWFwcGluZyBpcyBtb3JlIGFwcHJvcHJpYXRlIHdoZW4gaW50ZXJmYWNpbmcgdG8gMzIgYml0IAogICAgICAgICAgIGFwcGxpY2F0aW9ucyB3aGljaCBhcmUgdXNlZCBpbiB0aGUgY3VycmVudCAzMi1iaXQgSlZNcy4gRm9yIGZ1dHVyZSAKICAgICAgICAgICA2NC1iaXQgSlZNcyB5b3UgbWF5IGhhdmUgdG8gY2hhbmdlIHRoZXNlIG1hcHBpbmdzIC0gZWcgb24gVW5peCBMUDY0IAogICAgICAgICAgIHN5c3RlbXMsIGJ1dCBub3Qgb24gTWljcm9zb2Z0IDY0Yml0IFdpbmRvd3Mgd2hpY2ggd2lsbCBiZSB1c2luZyBhIAogICAgICAgICAgIFA2NCBJTDMyIG1vZGVsLiBUaGlzIG1heSBiZSBhdXRvbWF0ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbiBvZiBTV0lHLgoKMDEvMTAvMjAwMjpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgWyA1MDE2NzcgXSAlaW5pdCBibG9jayBpbiB3cm9uZyBwbGFjZS4gUmVwb3J0ZWQKICAgICAgICAgICBieSBMdWlnaSBCYWxsYWJpby4KCjAxLzA5LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBEZWZhdWx0IHN1cHBvcnQgZm9yIHRoZSBsb25nIGxvbmcgdHlwZS4gc2lnbmVkIGxvbmcgbG9uZyBpcyAKICAgICAgICAgICBtYXBwZWQgdG8gYSBKYXZhIGxvbmcuIHVuc2lnbmVkIGxvbmcgbG9uZyBpcyBtYXBwZWQgdG8gQmlnSW50ZWdlci4KCjAxLzA5LzIwMDI6YmVhemxleQogICAgICAgICAgIEV4cGVyaW1lbnRhbCBjaGFuZ2UgdG8gcGFyc2VyIHRvIGJldHRlciBzdXBwb3J0IG1peGluZyBvZgogICAgICAgICAgIGludCwgbG9uZywgc2hvcnQsIHVuc2lnbmVkLCBmbG9hdCwgYW5kIGRvdWJsZS4gICBUaGUgcGFyc2VyCiAgICAgICAgICAgc2hvdWxkIG5vdyBzdXBwb3J0IHR5cGVzIGxpa2UgdGhpczoKICAgIAogICAgICAgICAgICAgICAgc2hvcnQgdW5zaWduZWQgaW50CiAgICAgICAgICAgICAgICBpbnQgICB1bnNpZ25lZCBzaG9ydAogICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgaW50CiAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2hvcnQKCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIGFsc28gZW5hYmxlcyBhIHR5cGUgb2YgJ2xvbmcgZG91YmxlJyAocHJldmlvdXNseQogICAgICAgICAgICB1bnN1cHBvcnRlZCkgdG8gYmUgdXNlZC4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDEvMDUvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIENhc3RpbmcgZml4IGZvciB3aGVuIGZ1bmN0aW9uIHJldHVybiB0eXBlIGlzIGEgcG9pbnRlciBhcyAKICAgICAgICAgICByZXBvcnRlZCBieSBHYXJ5IFBlbm5pbmd0b24gMjAwMi0wMS0wNS4gVGhlIHVwcGVyIDMyYml0cyBvZiB0aGUgCiAgICAgICAgICAgNjQgYml0IGpsb25nIHdpbGwgaGF2ZSBjb250YWluZWQganVuayBmb3IgMzJiaXQgcG9pbnRlcnMuCgowMS8wNS8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gQmV0dGVyIHBvaW50ZXIgaGFuZGxpbmcgaW4gSmF2YSBpcyBwb3NzaWJsZSBhcyB0aGUgCiAgICAgICAgICAgSU5QVVQsIE9VVFBVVCBhbmQgSU5PVVQgdHlwZW1hcHMgaGF2ZSBiZWVuIGFkZGVkIGludG8gdHlwZW1hcHMuaS4KCjAxLzA1LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSAkbnVsbCBjYW4gYmUgdXNlZCBpbiBpbnB1dCB0eXBlbWFwcyB0byByZXR1cm4gZWFybHkgZnJvbSBKTkkgCiAgICAgICAgICAgZnVuY3Rpb25zIHRoYXQgaGF2ZSBlaXRoZXIgdm9pZCBvciBhIG5vbi12b2lkIHJldHVybiB0eXBlLiBFeGFtcGxlOgoKICAgICAgICAgICAgICV0eXBlbWFwKGNoZWNrKSBpbnQgKiAleyAKICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgU1dJR19leGNlcHRpb24oU1dJR19JbmRleEVycm9yLCAiQXJyYXkgZWxlbWVudCBlcnJvciIpOwogICAgICAgICAgICAgICAgIHJldHVybiAkbnVsbDsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgJX0KCiAgICAgICAgICAgSWYgdGhlIHR5cGVtYXAgZ2V0cyBwdXQgaW50byBhIGZ1bmN0aW9uIHdpdGggdm9pZCBhcyByZXR1cm4sICRudWxsIAogICAgICAgICAgIHdpbGwgZXhwYW5kIHRvIG5vdGhpbmc6CgogICAgICAgICAgICAgdm9pZCBqbmlfZm4oLi4uKSB7CiAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgICBTV0lHX2V4Y2VwdGlvbihTV0lHX0luZGV4RXJyb3IsICJBcnJheSBlbGVtZW50IGVycm9yIik7CiAgICAgICAgICAgICAgICAgICByZXR1cm4gOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICB9CgogICAgICAgICAgIG90aGVyd2lzZSAkbnVsbCBleHBhbmRzIHRvIHplcm8sIHdoZXJlIGphdmFyZXR1cm50eXBlIGlzIGVpdGhlciBhIAogICAgICAgICAgIHBvaW50ZXIgb3IgYSBwcmltaXRpdmUgdHlwZToKCiAgICAgICAgICAgICBqYXZhcmV0dXJudHlwZSBqbmlfZm4oLi4uKSB7CiAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgICBTV0lHX2V4Y2VwdGlvbihTV0lHX0luZGV4RXJyb3IsICJBcnJheSBlbGVtZW50IGVycm9yIik7CiAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgfQoKMDEvMDIvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIFRoZSBKYXZhIG1vZHVsZSBpbmNvcnJlY3RseSB1c2VkIGFyZ291dCB0eXBlbWFwcyBmb3IgCiAgICAgICAgICAgc3RyaW5ncy4gVGhpcyBpcyBub3cgY29ycmVjdGVkIGFuZCB0aGUgY29kZSBub3cgcmVzaWRlcwogICAgICAgICAgIGluIHRoZSBmcmVlYXJnIHR5cGVtYXAuIFRoZSBhcmdvdXQgYXJyYXkgdHlwZW1hcHMgaGF2ZSBiZWVuIHNwbGl0IGludG8gCiAgICAgICAgICAgYXJnb3V0IGFuZCBmcmVlYXJnIHR5cGVtYXBzLiBUaGlzIGNvcnJlY3Rpb24gbWF5IHJlcXVpcmUgc29tZSB1c2VyIAogICAgICAgICAgIHdyaXR0ZW4gdHlwZW1hcHMgdG8gYmUgbW9kaWZpZWQuIAogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTIvMjgvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIE11bHRpIHR5cGVtYXBzIG5vdyB3b3JraW5nIGZvciBKYXZhIHNlZSBtdWx0aW1hcCBleGFtcGxlLgogICAgICAgICAgIFtKYXZhXSBGaXggZm9yIHJlY2VudGx5IGludHJvZHVjZWQgYnVnIC0gZnJlZWFyZyB0eXBlbWFwIGNvZGUgd2FzIGFwcGVhcmluZwogICAgICAgICAgIGJlZm9yZSB0aGUgZnVuY3Rpb24gY2FsbC4KCjEyLzI4LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBKQ0FMTCBtYWNybyBmb3IgSk5JIGNhbGxzIHRoYXQgd29yayBpbiBib3RoIEMgYW5kIEMrKyB0eXBlbWFwcwogICAgICAgICAgIGhhdmUgYmVlbiByZXBsYWNlZCB3aXRoIEpDQUxMMCwgSkNBTEwxLCBKQ0FMTDIsIEpDQUxMMyBhbmQgSkNBTEw0IAogICAgICAgICAgIG1hY3Jvcy4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEyLzIyLzIwMDE6YmVhemxleQogICAgICAgICAgIFJlc29sdmVkIHNvbWUgaW5jb25zaXN0ZW50IGJlaGF2aW9yIHdpdGggJXJlbmFtZSBhbmQgY2xhc3MgcmVuYW1pbmcuCiAgICAgICAgICAgSWYgeW91IHNwZWNpZnkgdGhlIGZvbGxvd2luZzoKIAogICAgICAgICAgICAgICAlcmVuYW1lKEZvbykgIEJhcjsKCiAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICBCYXIoKTsKICAgICAgICAgICAgICAgICAgICB+QmFyKCk7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgVGhlbiB0aGUgJXJlbmFtZSBkaXJlY3RpdmUgYXBwbGllcyB0byB0aGUgY2xhc3MgaXRzZWxmLCB0aGUgY29uc3RydWN0b3IsCiAgICAgICAgICAgYW5kIHRoZSBkZXN0cnVjdG9yIChhbGwgd2lsbCBiZSByZW5hbWVkIHRvIEZvbykuCgogICAgICAgICAgIElmIGEgY2xhc3MgZGVmaW5lcyBtb3JlIHRoYW4gb25lIGNvbnN0cnVjdG9yLCB0aGUgb3ZlcmxvYWRlZCB2YXJpYW50cwogICAgICAgICAgIGNhbiBzdGlsbCBiZSByZW5hbWVkIGJ5IHNwZWNpZnlpbmcgcGFyYW1ldGVycyB0byAlcmVuYW1lLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAlcmVuYW1lKEJhcl9jb3B5KSBCYXIoQmFyICYpOwogICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIEJhcigpOwogICAgICAgICAgICAgICAgICAgICBCYXIoQmFyICYpOwogICAgICAgICAgICAgICAgICAgIH5CYXIoKTsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgVGhlcmUgYXJlIHN0aWxsIHNvbWUgb2RkIGNvcm5lciBjYXNlcy4gIElmIHlvdSBzcGVjaWZ5CgogICAgICAgICAgICAgICAlcmVuYW1lKEZvbykgOjpCYXI7CgogICAgICAgICAgIHRoZW4gb25seSB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgaXMgY2hhbmdlZCBhbmQgdGhlIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IKICAgICAgICAgICBuYW1lcyBhcmUgbGVmdCB1bm1vZGlmaWVkLiAgSWYgeW91IHNwZWNpZnkgCgogICAgICAgICAgICAgICAlcmVuYW1lKEZvbykgKjo6QmFyOwoKICAgICAgICAgICB0aGVuIHRoZSBuYW1lcyBvZiB0aGUgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciBmdW5jdGlvbnMgYXJlIG1vZGlmaWVkIGJ1dAogICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBpcyBub3QuCgoxMi8yMS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gam5pLCBqdHlwZSBhbmQganN0eXBlIHR5cGVtYXBzIG5vIGxvbmdlciBoYXJkY29kZWQgYnV0IHJlYWwgCiAgICAgICAgICAgdHlwZW1hcHMuIE5ldyB2YXJpYWJsZSBzdWJzdGl0dXRpb24sICRqYXZhY2xhc3NuYW1lLCBjYW4gYmUgdXNlZCBpbgogICAgICAgICAgIHRoZSBqc3R5cGUgdHlwZW1hcHMuIEl0IGlzIHJlcGxhY2VkIHdpdGggdGhlIEphdmEgc2hhZG93IGNsYXNzIG5hbWUKICAgICAgICAgICB3aGVyZSBhcHBsaWNhYmxlLgogICAgICAgICAgIFtKYXZhXSBGaXggZm9yIHJlY2VudGx5IGludHJvZHVjZWQgYnVnIHRvIGRvIHdpdGggaW5oZXJpdGFuY2Ugd2hlbiAKICAgICAgICAgICB1c2luZyAlaW1wb3J0LgogICAgICAgICAgIFtKYXZhXSBBIGZldyBtb3JlIGJ1ZyBmaXhlcywgdG9kbyB3aXRoICVyZW5hbWUgYW5kIHVzaW5nIHRoZSBraW5kCiAgICAgICAgICAgd2l0aCB0aGUgdHlwZSwgZWcgCiAgICAgICAgICAgdm9pZCBmbih1bmlvbiB1bmkgbXl1bmksIHN0cnVjdCBzdHIgbXlzdHIsIGNsYXNzIGNsIG15Y2wpOwoKMTIvMjAvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgWyAjNDk0NTI0IF0gUHJlcHJvY2Vzc29yIGJ1ZyAtIGFwb3N0cm9waGUgYW5kICNzdWJzdC4KCjEyLzIwLzIwMDE6YmVhemxleQogICAgICAgICAgIEFkZGVkIFNXSUdfVkVSU0lPTiBwcmVwcm9jZXNzb3Igc3ltYm9sLiAgIFRoaXMgaXMgYSBoZXhhZGVjaW1hbAogICAgICAgICAgIGludGVnZXIgc3VjaCBhcyAweDAxMDMxMSAoY29ycmVzcG9uZGluZyB0byBTV0lHLTEuMy4xMSkuICBUaGlzIGNhbgogICAgICAgICAgIGJlIHVzZWQgaW4gdGhlIGludGVyZmFjZSBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgI2lmIFNXSUdfVkVSU0lPTiA+PSAweDAxMDMxMQogICAgICAgICAgICAgICAvKiBVc2Ugc29tZSBmYW5jeSBuZXcgZmVhdHVyZSAqLwogICAgICAgICAgICAgICAjZW5kaWYKCiAgICAgICAgICAgTm90ZTogVGhlIHZlcnNpb24gc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGluIHRoZSBnZW5lcmF0ZWQgU1dJRwogICAgICAgICAgIHdyYXBwZXIgZmlsZS4KCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTIvMjAvMjAwMTpta29lcHBlCgkgICBbTXpTY2hlbWVdOiBSZW5hbWVkIG16c3dpZ19tYWtlX2Jvb2xlYW4gdG8KCSAgIHN3aWdfbWFrZV9ib29sZWFuLCBhcyB0aGUgbGF0dGVyIGlzIHVzZWQgaW4gdGhlIHR5cGVtYXBzLgoJICAgUmVwb3J0ZWQgYnkgTHVpZ2kgQmFsbGFiaW8uCgoxMi8xNy8yMDAxOm1rb2VwcGUKCSAgIFtHdWlsZV06IFJld3JvdGUgbGlzdC12ZWN0b3IuaSB1c2luZyBtdWx0aS1kaXNwYXRjaAoJICAgdHlwZW1hcHMuICBVcGRhdGVkIHBvaW50ZXItaW4tb3V0LmkuICBNYWtlIHRoZQoJICAgZGVwcmVjYXRlZCB0eXBlbWFwLXN1YnN0aXR1dGlvbiBvZiAiJHNvdXJjZSIgaW4gImFyZ291dCIKCSAgIHdvcmsgYXMgYmVmb3JlLgoKMTIvMTYvMjAwMTpta29lcHBlCgkgICBbR3VpbGVdOiBGaXhlZCBtYWNyb3MgJXZhbHVlc19hc19saXN0LCAldmFsdWVzX2FzX3ZlY3RvciwKCSAgICVtdWx0aXBsZV92YWx1ZXMgdG8gdXNlIHRoZSBwcm9wZXIgJXByYWdtYSBzeW50YXguICBOZXcKCSAgIEd1aWxlIGV4YW1wbGUvdGVzdCAibXVsdGl2YWx1ZSI7IG5ldyBHdWlsZSBydW4tdGVzdCBmb3IKCSAgIHRlc3Qtc3VpdGUgaXRlbSAibGlzdC12ZWN0b3IiIChjdXJyZW50bHkgYnJva2VuKS4KCjEyLzE0LzIwMDE6bWtvZXBwZQoJICAgW0d1aWxlXTogRml4ZWQgdHlwZW1hcC1zdWJzdGl0aW9uIGJ1ZyBmb3IgInZhcmluIi4gIFJlbGF4ZWQKCSAgIHZhbGlkLWlkZW50aWZpZXIgY2hlY2sgdG8gYWxsb3cgYWxsIFI1UlMgaWRlbnRpZmllcnMuCgoKVmVyc2lvbiAxLjMuMTAgKERlY2VtYmVyIDEwLCAyMDAxKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMi8wOC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBNb2RpZmllZCAldHlwZW1hcCBzbyB0aGF0ICV7IC4uLiAlfSBjYW4gYWxzbyBiZSB1c2VkIGFzIGEKICAgICAgICAgICBjb2RlIGJsb2NrIChtb3N0bHkgZm9yIGNvbXBsZXRlbmVzcykuICBGb3IgZXhhbXBsZToKIAogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBibGFoICV7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgVGhpcyBmb3JtIGRvZXMgbm90IGludHJvZHVjZSBhIG5ldyBibG9jayBzY29wZS4gIEFsc28sIHRoZQogICAgICAgICAgIGNvZGUgZW5jbG9zZWQgaW4gJXsgLi4uICV9IGlzIG5vdCBwcm9jZXNzZWQgYnkgdGhlIHByZXByb2Nlc3Nvci4KCjEyLzA4LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFsgIzQ1OTYxNCBdIFNXSUcgd2l0aCBtdWx0aXBsZSBUQ0wgaW50ZXJwcmV0ZXJzLgoKMTIvMDgvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgWyAjNDE3MTQxIF0gcnVieWRlYy5zd2cgaXMgd3JvbmcKICAgICAgICAgICBSZXBvcnRlZCBieSBQYXVsIEJyYW5uYW4uCgoxMi8wOC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBbICM0MTA1NTcgXSBQcm9ibGVtIHdpdGggJWFkZG1ldGhvZHMgb24gTlQuCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgTWFnbnVzIExqdW5nLgoKMTIvMDgvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgWyAjNDQ1MjMzIF0gRW5oYW5jZW1lbnQ6IGhhbmRsZSBhY2Nlc3MgY2hhbmdlLgogICAgICAgICAgIFNXSUcgbm93IHBhcnNlcyAoYnV0IGlnbm9yZXMpIEMrKyBhY2Nlc3MgY2hhbmdlcyBmb3IgdGhlCiAgICAgICAgICAgdGhlIGZvbGxvd2luZzoKCiAgICAgICAgICAgICBjbGFzcyBBIHsKICAgICAgICAgICAgIHByb3RlY3RlZDoKICAgICAgICAgICAgICAgIHZvaWQgc29tZXRoaW5nKCkgeyB9CiAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICBBKCkge30KICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgY2xhc3MgQiA6IHByaXZhdGUgQSB7CiAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICBCKCkgOiBBKCkgeyB9CiAgICAgICAgICAgICBwcm90ZWN0ZWQ6CiAgICAgICAgICAgICAgICBBOjpzb21ldGhpbmc7ICAgIDwtLS0tIFBhcnNlZCwgYnV0IGlnbm9yZWQKICAgICAgICAgICAgIH07CiAKICAgICAgICAgICBTdWdnZXN0ZWQgYnkgS3J6eXN6dG9mIEtvem1pbnNraS4KCjEyLzA4LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIEZpeCBmb3IgUnVieSB0byB3b3JrIHVzaW5nIFZpc3VhbCBDKysuCgoxMi8wNi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBbICM0NjU2ODcgXSB1bnNpZ25lZCBzaG9ydCBwYXJhbWV0ZXJzIGZhaWwuCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgR2VyYWxkIFdpbGxpYW1zLgoKMTIvMDYvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgWyAjNDg5NTk0IF0gUHlTdHJpbmdfRnJvbVN0cmluZyBjYW4ndCB0YWtlIE5VTEwgYXJnLgogICAgICAgICAgIFJlcG9ydGVkIGJ5IEpvaG4gTWVycml0dC4gICBTV0lHIG5vdyBjb252ZXJ0cyBzdHJpbmcgdmFsdWVzCiAgICAgICAgICAgdG8gUHl0aG9uIHVzaW5nIGNvZGUgbGlrZSB0aGlzOgoKICAgICAgICAgICByZXN1bHRvYmogPSByZXN1bHQgPyBQeVN0cmluZ19Gcm9tU3RyaW5nKHJlc3VsdCkgOiBQeV9CdWlsZFZhbHVlKCIiKTsKCjEyLzA2LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIFsgIzQ2MzU2MSBdIFR5cGUgY29udmVyc2lvbnMgbm90IGdlbmVyYXRlZC4KICAgICAgICAgICBSZXBvcnRlZCBieSBHZXJhbGQgV2lsbGlhbXMuCgkKMTIvMDQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgWyAjNDcwMjE3IF0gVGNsIGRlZmF1bHQgYXJndW1lbnQgaGFuZGxpbmcuCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgU2hhdW4gTG93cnkuCgoxMi8wNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBbICM0NzIwODggXSBkZWZpbmVkKE1BQ1JPKSBleHBhbmRlZCBldmVyeXdoZXJlLgogICAgICAgICAgIEVtYmVkZGVkIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzIHN1Y2ggYXMKCiAgICAgICAgICAgICAgJSNpZiBkZWZpbmVkKEZPTykKCiAgICAgICAgICAgYXJlIG5vdCBleHBhbmRlZCBieSB0aGUgU1dJRyBwcmVwcm9jZXNzb3IuCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgR2VyYWxkIFdpbGxpYW1zLgoKMTIvMDQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgWyAjNDc2NDY3IF0gUHJvYmxlbXMgd2l0aCAjZGVmaW5lICYgY29tbWFzLgoKMTIvMDQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgWyAjNDc3NTQ3IF0gd3JvbmcgZGVjbGFyYXRpb24gb2YgcG9pbnRlciBmdW5jdGlvbnMuCiAgICAgICAgICAgQmFkIHByb3RvdHlwZXMgaW4gTGliL3RjbC9wdHJsYW5nLmkuCgoxMi8wNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBbICM0ODMxODIgXSBDb25zdGFudHMgY2FuIHRha2UgYXJncyBieSBtaXN0YWtlLiAKICAgICAgICAgICBXaGVuIHN3aWcgLXBlcmw1IC1jb25zdCBpcyB1c2VkLCBjb25zdGFudHMgYXJlIGRlY2xhcmVkCiAgICAgICAgICAgd2l0aCBhIHZvaWQgcHJvdG90eXBlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgc3ViIElDT05TVCAoKSB7ICRleGFtcGxlYzo6SUNPTlNUIH0KCiAgICAgICAgICAgUGF0Y2ggc3VibWl0dGVkIGJ5IFJpY2ggV2FsZXMuCgoxMi8wMy8yMDAxOmJlYXpsZXkKICAgICAgICAgICBOZXcgJWV4Y2VwdGlvbiBkaXJlY3RpdmUuICAgVGhpcyBpcyBpbnRlbmRlZCB0byByZXBsYWNlICVleGNlcHQuCiAgICAgICAgICAgSXQgd29ya3MgaW4gZXhhY3RseSB0aGUgc2FtZSBtYW5uZXIgZXhjZXB0IGl0IGRvZXMgbm90IGFjY2VwdCBhIAogICAgICAgICAgIGxhbmd1YWdlIHNwZWNpZmllci4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAlZXhjZXB0aW9uIHsKICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAkYWN0aW9uCiAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICAgY2F0Y2goU29tZUVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IKICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAlZXhjZXB0aW9uIGlzIGFsc28gbmFtZSBhd2FyZS0tLWFsbG93aW5nIGl0IHRvIGJlIGFwcGxpZWQgdG8KICAgICAgICAgICBzcGVjaWZpYyBkZWNsYXJhdGlvbnMgaW4gYW4gaW50ZXJmYWNlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVleGNlcHRpb24gZm9vIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiBmb3IgYW55IGZ1bmN0aW9uL21ldGhvZCBmb28KICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAlZXhjZXB0aW9uIEZvbzo6YmFyIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiBmb3IgbWV0aG9kIGJhciBpbiBjbGFzcyBGb28KICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgJWV4Y2VwdGlvbiBGb286OmJhcihkb3VibGUpIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiBmb3IgbWV0aG9kIGJhcihkb3VibGUpIGluIGNsYXNzIEZvbwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9CgogICAgICAgICAgIFRoZSBzZW1hbnRpY3Mgb2YgdGhpcyBuYW1lIG1hdGNoaW5nIGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgZm9yICVyZW5hbWUuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgIAoxMi8wMy8yMDAxOmJlYXpsZXkKICAgICAgICAgICBTdWJzdGFudGlhbCBjbGVhbnVwIG9mIHRoZSBQeXRob24gc2hhZG93IGNsYXNzIGNvZGUuICBTaGFkb3cgY2xhc3NlcwogICAgICAgICAgIHVzZWQgdG8gYmUgY3JlYXRlZCBpbiB0aGlzIHJhdGhlciBjb21wbGljYXRlZCBtYW5uZXIgaW52b2x2aW5nIGFib3V0CiAgICAgICAgICAgYSBoYWxmLWRvemVuIHN0cmluZ3MgY3JlYXRlZCBpbiBiaXRzIGFuZCBwaWVjZXMuICAgU2hhZG93IGNsYXNzZXMKICAgICAgICAgICBhcmUgbm93IGdlbmVyYXRlZCBpbiBhIG1vcmUgc3RyYWlnaHRmb3J3YXJkIG1hbm5lci0taW4gdGhlIHNhbWUKICAgICAgICAgICBvcmRlciB0aGF0IGFwcGVhcnMgaW4gdGhlIGludGVyZmFjZSBmaWxlLgoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICBUaGUgb3JkZXIgaW4gd2hpY2ggZGVjbGFyYXRpb25zIGFwcGVhciBpbiB0aGUgc2hhZG93IGZpbGUgbWF5IGRpZmZlci4KICAgICAgICAgICAKMTIvMDMvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgVGhlICVpbnNlcnQgZGlyZWN0aXZlICgleyAuLi4gJX0sICVydW50aW1lLCAlaGVhZGVyLCAld3JhcHBlciwgZXRjLikKICAgICAgICAgICBjYW4gbm93IGJlIHVzZWQgaW5zaWRlIG9mIGEgY2xhc3MgZGVmaW5pdGlvbi4gICBUaGlzIGhhcyBwb3RlbnRpYWwKICAgICAgICAgICB1c2VzIHdoZW4gZ2VuZXJhdGluZyBzaGFkb3cgY2xhc3MgY29kZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAlaW5zZXJ0KCJzaGFkb3ciKSAlewogICAgICAgICAgICAgICAgICMgU29tZSBweXRob24gY29kZQogICAgICAgICAgICAgICAgIGRlZiBibGFoKHNlbGYpOgogICAgICAgICAgICAgICAgICAgICAgcHJpbnQgIkknbSBibGFoISIKICAgICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICBUaGUgc3VwcG9ydCBmb3IgY2xhc3MgY29kZSBpbnNlcnRpb24gZGVwZW5kcyBvbiB0aGUgbGFuZ3VhZ2UgbW9kdWxlLgogICAgICAgICAgIEhvd2V2ZXIsIHRoZSBpbnRlbnQgb2YgdGhpcyBmZWF0dXJlIGlzIHRvIHNpbXBsaWZ5IHRoZSB0YXNrIG9mIGV4dGVuZGluZwogICAgICAgICAgIHNoYWRvdyBjbGFzcyBjb2RlLiAgIEluIHRoZSBQeXRob24gbW9kdWxlLCB0aGlzIGluc2VydHMgY29kZSB3aXRoIHRoZQogICAgICAgICAgIHByb3BlciBsZXZlbCBvZiBpbmRlbmRhdGlvbiAocmVnYXJkbGVzcyBvZiB3aGF0IHdhcyB1c2VkIGluIHRoZSBTV0lHCiAgICAgICAgICAgaW50ZXJmYWNlKS4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxMS8yOS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBNb2RpZmljYXRpb25zIGZvciBKYXZhIGFuZCBQeXRob24gbW9kdWxlcyB0byB3b3JrIG9uIGN5Z3dpbi4KICAgICAgICAgICBVbmZvcnR1bmF0ZWx5IGEgbG90IG9mIHRoZSBweXRob24gbW9kdWxlIGhhcyBzdGFydGVkIHRvIHByb2R1Y2VzIGNvZGUgCiAgICAgICAgICAgd2hpY2ggY2Fubm90IGJlIGF1dG8taW1wb3J0ZWQgdXNpbmcgY3lnd2luIGxpYnRvb2xzIHNvIG1vc3Qgb2YgaXQgaXMgCiAgICAgICAgICAgc3RpbGwgYnJva2VuLgoKMTEvMjgvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgVGhlICVyZW5hbWUgYW5kICVmZWF0dXJlIGRpcmVjdGl2ZSBjYW4gbm93IGJlIHVzZWQgaW5zaWRlCiAgICAgICAgICAgb2YgYSBjbGFzcyBkZWZpbml0aW9uLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICVyZW5hbWUoZm9vX2kpIGZvbyhpbnQpOwogICAgICAgICAgICAgICAgICVyZW5hbWUoZm9vX2QpIGZvbyhkb3VibGUpOwogICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIHZvaWQgZm9vKGludCk7CiAgICAgICAgICAgICAgICAgdm9pZCBmb28oZG91YmxlKTsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgIH07CgogICAgICAgICAgIFdoZW4gdXNlZCBpbiB0aGlzIG1hbm5lciwgdGhlICVyZW5hbWUgZGlyZWN0aXZlIG9ubHkgYXBwbGllcwogICAgICAgICAgIHRvIG1lbWJlcnMgb2YgdGhlIGNsYXNzIGluIHdoaWNoIGl0IGFwcGVhcnMgYXMgd2VsbCBhcyBhbGwKICAgICAgICAgICBkZXJpdmVkIGNsYXNzZXMuICBJbiBmYWN0LCB0aGlzIGlzIHJlYWxseSBqdXN0IHRoZSBzYW1lCiAgICAgICAgICAgYXMgc2F5aW5nOgoKICAgICAgICAgICAgICVyZW5hbWUoZm9vX2kpIEZvbzo6Zm9vKGludCk7CiAgICAgICAgICAgICAlcmVuYW1lKGZvb19kKSBGb286OmZvbyhkb3VibGUpOwogICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgfTsKCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTEvMjYvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgdGhlIGV4cGVyaW1lbnRhbCAlZmVhdHVyZSBkaXJlY3RpdmUuICAlZmVhdHVyZSBjYW4gYmUKICAgICAgICAgICB1c2VkIHRvIGF0dGFjaCBhcmJpdHJhcnkgc3RyaW5nIGF0dHJpYnV0ZXMgdG8gcGFyc2UgdHJlZSBub2Rlcy4KICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICVmZWF0dXJlKCJleGNlcHQiKSBibGFoIHsKICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAkZnVuY3Rpb24KICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgd2hhdGV2ZXI7ICAgICAgCiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgb3IKCiAgICAgICAgICAgICAgJWZlYXR1cmUoInNldCIpICo6Onhfc2V0ICJ4IjsKCiAgICAgICAgICAgb3IKCiAgICAgICAgICAgICAgJWZlYXR1cmUoImJsYWgiKSBGb286OmJhcihpbnQsZG91YmxlKSBjb25zdCAic3BhbSI7CgogICAgICAgICAgIFRoZSBzeW50YXggaXMgYm9ycm93ZWQgZnJvbSB0aGUgJXJlbmFtZSBkaXJlY3RpdmUuICBJbiBmYWN0LCB0aGUKICAgICAgICAgICBleGFjdCBzYW1lIHNlbWFudGljcyBhcHBseSAoaW5oZXJpdGFuY2UsIG1hdGNoaW5nLCBldGMuKS4KCiAgICAgICAgICAgJWZlYXR1cmUgaXMgYSB2ZXJ5IHBvd2VyZnVsIGxvdy1sZXZlbCBwcmltaXRpdmUgdGhhdCBjYW4gYmUgdXNlZCB0bwogICAgICAgICAgIGN1c3RvbWl6ZSBpbmRpdmlkdWFsIGxhbmd1YWdlIG1vZHVsZXMgYW5kIHRvIHByb3ZpZGUgaGludHMgdG8gCiAgICAgICAgICAgYW55IHN0YWdlIG9mIGNvZGUgZ2VuZXJhdGlvbi4gICBGZWF0dXJlcyBhcmUgYXR0YWNoZWQgdG8KICAgICAgICAgICBwYXJzZSB0cmVlIG5vZGVzIGFzIGF0dHJpYnV0ZXMgd2l0aCBuYW1lcyBsaWtlICJmZWF0dXJlOioiIHdoZXJlICogCiAgICAgICAgICAgaXMgcmVwbGFjZWQgYnkgdGhlIGZlYXR1cmUgbmFtZSAoZS5nLiwgImZlYXR1cmU6ZXhjZXB0IiwgImZlYXR1cmU6c2V0IiwgCiAgICAgICAgICAgZXRjLikuICAgTGFuZ3VhZ2UgbW9kdWxlcyBjYW4gdGhlbiBsb29rIGZvciB0aGUgZmVhdHVyZXMgdXNpbmcgCiAgICAgICAgICAgYSBzaW1wbGUgYXR0cmlidXRlIGxvb2t1cC4KCiAgICAgICAgICAgJWZlYXR1cmUgaXMgaW50ZW5kZWQgdG8gYmUgYSByZXBsYWNlbWVudCBmb3IgYSBudW1iZXIgb2YKICAgICAgICAgICBvbGRlciBTV0lHIGRpcmVjdGl2ZXMgaW5jbHVkaW5nICVleGNlcHQgYW5kIHNwZWNpYWxpemVkCiAgICAgICAgICAgcHJhZ21hcy4gSXQgaXMgbW9yZSBwb3dlcmZ1bCAoZHVlIHRvIGl0cyBwYXJhbWV0ZXJpemVkCiAgICAgICAgICAgbmFtZSBtYXRjaGluZykgYW5kIGl0IHByb3ZpZGVzIHZlcnkgcHJlY2lzZSBjb250cm9sIG92ZXIKICAgICAgICAgICBob3cgY3VzdG9taXphdGlvbiBmZWF0dXJlcyBhcmUgYXR0YWNoZWQgdG8gaW5kaXZpZHVhbAogICAgICAgICAgIGRlY2xhcmF0aW9ucy4gICBUaGVyZSBhcmUgZnV0dXJlIGV4cGFuc2lvbiBwbGFucyB0aGF0IHdpbGwKICAgICAgICAgICBidWlsZCB1cG9uIHRoaXMgY2FwYWJpbGl0eSBhcyB3ZWxsLgoKICAgICAgICAgICBJdCdzIG5vdCBjZXJ0YWluIHRoYXQgJWZlYXR1cmUgd2lsbCBldmVyIGJlIHVzZWQgZGlyZWN0bHkKICAgICAgICAgICBieSBTV0lHIHVzZXJzLiAgSW5zdGVhZCwgaXQgbWF5IGJlIGEgbG93LWxldmVsIHByaW1pdGl2ZQogICAgICAgICAgIHRoYXQgaXMgdXNlZCBpbiBoaWdoLWxldmVsIG1hY3JvIGRlZmluaXRpb25zLiAgRm9yIGluc3RhbmNlLAogICAgICAgICAgIHRvIHN1cHBvcnQgcHJvcGVydGllcywgeW91IG1pZ2h0IGRlZmluZSBhIG1hY3JvIGxpa2UgdGhpczoKCiAgICAgICAgICAgJWRlZmluZSAlcHJvcGVydHkobmFtZSwgc2V0ZiwgZ2V0ZikKICAgICAgICAgICAlZmVhdHVyZSgic2V0Iikgc2V0ZiAjbmFtZTsKICAgICAgICAgICAlZmVhdHVyZSgiZ2V0IikgZ2V0ZiAjbmFtZTsKICAgICAgICAgICAlZW5kZGVmCgogICAgICAgICAgIFdoaWNoIGFsbG93cyBhIHVzZXIgdG8gc3BlY2lmeSB0aGluZ3MgbGlrZSB0aGlzOgoKICAgICAgICAgICAlcHJvcGVydHkocCwgZ2V0X3AsIHNldF9wKTsKCiAgICAgICAgICAgY2xhc3MgQmxhaCB7CiAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgIGludCAgZ2V0X3AoKTsKICAgICAgICAgICAgICB2b2lkIHNldF9wKGludCk7CiAgICAgICAgICAgfTsKCiAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBORVcgRkVBVFVSRSAqKioKICAKMTEvMjQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgVGhlIFRjbCBtb2R1bGUgaGFzIGJlZW4gZXhwYW5kZWQgd2l0aCBzb21lIG5ldyBmZWF0dXJlcyBmb3IKICAgICAgICAgICBtYW5hZ2luZyBvYmplY3Qgb3duZXJzaGlwLiAgRm9yIGV4YW1wbGU6CiAgICAgICAgIAogICAgICAgICAgICAgICAgc2V0IGMgW0NpcmNsZSAtYXJncyAyMF0KICAgICAgICAgICAgICAgICRjIGFyZWEgICAgICAgICAgICAgIyBJbnZva2UgYSBtZXRob2QKICAgICAgICAgICAgICAgICRjIC1kaXNvd24gICAgICAgICAgIyBSZWxlYXNlcyBvd25lcnNoaXAgb2YgdGhlIG9iamVjdAogICAgICAgICAgICAgICAgJGMgLWFjcXVpcmUgICAgICAgICAjIEFjcXVpcmVzIG93bmVyc2hpcCBvZiB0aGUgb2JqZWN0CgogICAgICAgICAgIElmIFRjbCBvd25zIHRoZSBvYmplY3QsIGl0cyBkZXN0cnVjdG9yIGlzIGludm9rZWQgd2hlbiB0aGUgCiAgICAgICAgICAgY29ycmVzcG9uZGluZyBvYmplY3QgY29tbWFuZCBpcyBkZWxldGVkIGluIFRjbC4gIAoKICAgICAgICAgICBUbyBzaW1wbGlmeSB0aGUgZGVzdHJ1Y3Rpb24gb2Ygb2JqZWN0cywgdGhlIGZvbGxvd2luZyBzeW50YXgKICAgICAgICAgICBjYW4gYmUgdXNlZDoKCiAgICAgICAgICAgICAgICAkYyAtZGVsZXRlICAgICAgICAgIyBEZWxldGUgYW4gb2JqZWN0CgogICAgICAgICAgIFRoaXMgaXMgYW4gYWx0ZXJuYXRpdmUgZm9yIHRoZSBtb3JlIG9ic2N1cmUgdmFyaWFudCBvZiAKCiAgICAgICAgICAgICAgICByZW5hbWUgJGMge30KCiAgICAgICAgICAgVGhlc2UgZmVhdHVyZXMgYWxzbyBhZGQgZnVuY3Rpb25hbGl0eSBhdCB0aGUgQyBBUEkgbGV2ZWwuCiAgICAgICAgICAgVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgbWFuYWdlIG93bmVyc2hpcCBmcm9tIEMgYW5kCiAgICAgICAgICAgY2FuIGJlIHVzZWQgaW4gdHlwZW1hcHMuCgogICAgICAgICAgICAgICAgU1dJR19BY3F1aXJlKHZvaWQgKnB0cik7CiAgICAgICAgICAgICAgICBTV0lHX0Rpc293bih2b2lkICpwdHIpOwoKICAgICAgICAgICBBIG5ldyBmdW5jdGlvbiBmb3IgY29uc3RydWN0aW5nIGluc3RhbmNlcyBpcyBhbHNvIGF2YWlsYWJsZToKCiAgICAgICAgICAgICAgICBUY2xfT2JqICoKICAgICAgICAgICAgICAgIFNXSUdfTmV3SW5zdGFuY2VPYmooVGNsX0ludGVycCAqaW50ZXJwLCB2b2lkICpwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aWdfdHlwZV9pbmZvICp0eXBlLCBpbnQgb3duKTsKCiAgICAgICAgICAgV2hlbiB1c2VkIGluIGEgdHlwZW1hcCwgdGhpcyBjcmVhdGVzIGEgcG9pbnRlciBvYmplY3QgYW5kCiAgICAgICAgICAgYW4gaW50ZXJwcmV0ZXIgY29tbWFuZCB0aGF0IGNhbiBiZSB1c2VkIHRvIGlzc3VlIG1ldGhvZHMgYW5kCiAgICAgICAgICAgYWNjZXNzIGF0dHJpYnV0ZXMgYXMgc2hvd24gYWJvdmUuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgIAoxMS8yMy8yMDAxOmJlYXpsZXkKICAgICAgICAgICBBbGwgUHl0aG9uLXJlbGF0ZWQgJXByYWdtYSBvcGVyYXRpb25zIGhhdmUgYmVlbiBlbGltaW5hdGVkLgogICAgICAgICAgIE1vc3Qgb2YgdGhlc2Ugd2VyZSB3cml0dGVuIGZvciBvbGRlciBTV0lHIHZlcnNpb25zIGluIG9yZGVyIHRvCiAgICAgICAgICAgY29tcGVuc2F0ZSBmb3IgbGltaXRhdGlvbnMgaW4gZWFybGllciByZWxlYXNlcy4gIEluIGFuIGVmZm9ydAogICAgICAgICAgIHRvIHJlZHVjZSB0aGUgYW1vdW50IG9mIGNvZGUtY2x1dHRlciBhbmQgcG90ZW50aWFsIGZvciBlcnJvcnMsCiAgICAgICAgICAgaXQgaXMgZWFzaWVyIHRvIHNpbXBseSBlbGltaW5hdGUgdGhlIHByYWdtYXMgYW5kIHRvIHN0YXJ0IG92ZXIKICAgICAgICAgICAoaWYgbmVlZGVkKS4gIFRvIGJlIGhvbmVzdCwgSSdtIG5vdCBldmVuIHN1cmUgdGhlIHByYWdtYXMKICAgICAgICAgICB3b3JrZWQgaW4gMS4zLjkgYW5kIHJlY2VudCByZWxlYXNlcy4KCiAgICAgICAgICAgTm90ZTogSWYgeW91IG5lZWQgdG8gaW5zZXJ0IGNvZGUgaW50byB0aGUgc2hhZG93IGNsYXNzIGZpbGUKICAgICAgICAgICBjcmVhdGVkIGJ5IFNXSUcsIHNpbXBseSB1c2UgdGhlICVzaGFkb3cgZGlyZWN0aXZlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgJXNoYWRvdyAlewogICAgICAgICAgICAgIGRlZiBzb21lX3B5dGhvbl9jb2RlKCk6ICAgICAgICAgCiAgICAgICAgICAgICAgICAgIHByaW50ICJibGFoISIKICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjExLzIyLzIwMDE6YmVhemxleQogICAgICAgICAgIFN3ZWVwaW5nIGNoYW5nZXMgdG8gdGhlIHdheSBpbiB3aGljaCB0aGUgUHl0aG9uIG1vZHVsZSBoYW5kbGVzCiAgICAgICAgICAgc2hhZG93IGNsYXNzZXMuICAgSW4gZWFybHkgaW1wbGVtZW50YXRpb25zLCBzaGFkb3cgY2xhc3NlcyB3ZXJlCiAgICAgICAgICAgbWVyZWx5IFB5dGhvbiB3cmFwcGVycyBhcm91bmQgdHlwZWQgcG9pbnRlciBvYmplY3RzLiBIb3dldmVyLCAKICAgICAgICAgICBzb21lIHVzZXJzIGFjdHVhbGx5IHdhbnRlZCB0byByZWNlaXZlIHRoZSBzaGFkb3cgY2xhc3Mgb2JqZWN0IGluIEMuCiAgICAgICAgICAgVG8gYWNjb21tb2RhdGUgdGhpcywgdGhlIGRlcmVmZXJlbmNpbmcgb2YgdGhlICJ0aGlzIiBwb2ludGVyIGluCiAgICAgICAgICAgYSBzaGFkb3cgY2xhc3Mgd2FzIG1vdmVkIHRvIEMgYXMgZGVzY3JpYmVkIGluIENIQU5HRVMgWzgvOC85OV0uCiAgICAgICAgICAgSG93ZXZlciwgdGhlIHByb2Nlc3Mgb2YgcmV0dXJuaW5nIHBvaW50ZXJzIHRvIFB5dGhvbiB3YXMgc3RpbGwKICAgICAgICAgICBzb21ld2hhdCBwcm9ibGVtYXRpYy4gIFNwZWNpZmljYWxseSwgc2hhZG93IGNsYXNzZXMgbmV2ZXIgd29ya2VkCiAgICAgICAgICAgaW4gc2l0dWF0aW9ucyBzdWNoIGFzIHRoZXNlOgoKICAgICAgICAgICAgIC0gICBVc2Ugb2YgYW55IGtpbmQgb2Ygb3V0cHV0IHR5cGVtYXAgKCdvdXQnIG9yICdhcmdvdXQnKQogICAgICAgICAgICAgLSAgIEdsb2JhbCB2YXJpYWJsZXMgKGJyb2tlbiBhcyBmYXIgYXMgSSBjYW4gdGVsbCkuCgogICAgICAgICAgIEluIHRoZSBwYXN0LCBzb21lIHVzZXJzIGhhdmUgZGVhbHQgd2l0aCB0aGlzIGJ5IG1hbnVhbGx5IHRyeWluZwogICAgICAgICAgIHRvIGNyZWF0ZSBzaGFkb3cgY2xhc3Mgb2JqZWN0cyB0aGVtc2VsdmVzIGZyb20gQy9DKysuICBIb3dldmVyLAogICAgICAgICAgIHRoaXMgd2FzIGRpZmZpY3VsdCBiZWNhdXNlIHRoZSBDIHdyYXBwZXJzIGRvbid0IHJlYWxseSBrbm93IGhvdwogICAgICAgICAgIHRvIGdldCBhY2Nlc3MgdG8gdGhlIGNvcnJlc3BvbmRpbmcgUHl0aG9uIGNsYXNzLgoKICAgICAgICAgICBUaGUgUHl0aG9uIG1vZHVsZSBoYXMgbm93IGJlZW4gbW9kaWZpZWQgdG8gYXV0b21hdGljYWxseSBhdHRhY2gKICAgICAgICAgICBzaGFkb3cgY2xhc3Mgb2JqZWN0cyB0byBwb2ludGVycyB3aGVuIHRoZXkgYXJlIHJldHVybmVkIHRvIAogICAgICAgICAgIFB5dGhvbi4gICBUaGlzIHByb2Nlc3Mgb2NjdXJzIGluIHRoZSBmdW5jdGlvbiBTV0lHX05ld1BvaW50ZXJPYmooKQogICAgICAgICAgIHNvIHRoZSBwcm9jZXNzIGlzIGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQgdG8gdXNlcnMuICAgIEFzIGEgcmVzdWx0LAogICAgICAgICAgIHNoYWRvdyBjbGFzc2VzIGFyZSBub3cgbW9yZSBzZWFtbGVzc2x5IGludGVncmF0ZWQgd2l0aCB0eXBlbWFwcwogICAgICAgICAgIGFuZCBvdGhlciBmZWF0dXJlcyBvZiBTV0lHLgoKICAgICAgICAgICBUaGlzIGNoYW5nZSBtYXkgaW50cm9kdWNlIGEgbnVtYmVyIG9mIGluY29tcGF0aWJpbGl0aWVzLiAgVGhlCiAgICAgICAgICAgU1dJR19OZXdQb2ludGVyT2JqKCkgbm93IHRha2VzIGFuIGV4dHJhIHBhcmFtZXRlciAib3duIiB0byAKICAgICAgICAgICBpbmRpY2F0ZSBvYmplY3Qgb3duZXJzaGlwLiAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmV0dXJuIGEgcG9pbnRlcgogICAgICAgICAgIHRvIFB5dGhvbiB0aGF0IFB5dGhvbiBzaG91bGQgZGVzdHJveS4gICBJbiBhZGRpdGlvbiwgb2xkZXIgY29kZQogICAgICAgICAgIHRoYXQgdHJpZXMgdG8gbWFudWFsbHkgY29uc3RydWN0IHNoYWRvdyBjbGFzcyBvYmplY3RzIG9yIHdoaWNoCiAgICAgICAgICAgZXhwZWN0cyBiYXJlIHBvaW50ZXJzIG1heSBicmVhay0tLXN1Y2ggcG9pbnRlcnMgbWF5IGFscmVhZHkgYmUKICAgICAgICAgICBlbmNhcHN1bGF0ZWQgYnkgYSBzaGFkb3cgY2xhc3MuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8yMC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBNb2RpZmllZCB0aGUgJWluc2VydCBkaXJlY3RpdmUgdG8gYWNjZXB0IHNpbmdsZSBicmFjZXMgeyAuLi4gfS4KICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlaW5zZXJ0KCJoZWFkZXIiKSB7CiAgICAgICAgICAgICAgICAgICAuLi4gc29tZSBjb2RlIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBUaGlzIHdvcmtzIGV4YWN0bHkgbGlrZSAleyAuLi4gJX0gZXhjZXB0IHRoYXQgdGhlIGNvZGUgaW4gdGhlCiAgICAgICAgICAgYnJhY2VzIGlzIHByb2Nlc3NlZCB1c2luZyB0aGUgcHJlcHJvY2Vzc29yLiAgIFRoaXMgY2FuIGJlIHVzZWZ1bAogICAgICAgICAgIGluIGNlcnRhaW4gY29udGV4dHMgc3VjaCBhcyBsb3ctbGV2ZWwgY29kZSBnZW5lcmF0aW9uIGluIAogICAgICAgICAgIGxhbmd1YWdlIG1vZHVsZXMuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgIAoxMS8yMC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBDb21tYW5kIGxpbmUgb3B0aW9ucyBhcmUgbm93IHRyYW5zbGF0ZWQgaW50byBwcmVwcm9jZXNzb3IKICAgICAgICAgICBzeW1ib2xzLiAgRm9yIGV4YW1wbGU6CgkKICAgICAgICAgICAgICAuL3N3aWcgLXB5dGhvbiAtc2hhZG93IC1tb2R1bGUgYmxhaCBpbnRlcmZhY2UuaQoKICAgICAgICAgICBDcmVhdGVzIHRoZSBzeW1ib2xzOgoKICAgICAgICAgICAgICBTV0lHT1BUX1BZVEhPTiAxCiAgICAgICAgICAgICAgU1dJR09QVF9TSEFET1cgMQogICAgICAgICAgICAgIFNXSUdPUFRfTU9EVUxFIGJsYWgKICAgICAgICAgICAgICAKICAgICAgICAgICBNb2R1bGVzIGNhbiBsb29rIGZvciB0aGVzZSBzeW1ib2xzIHRvIGFsdGVyIHRoZWlyIGNvZGUgZ2VuZXJhdGlvbgogICAgICAgICAgIGlmIG5lZWRlZC4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgICAgICAKMTEvMjAvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgTWFzc2l2ZSBvdmVyaGF1bCBvZiB0aGUgUGVybDUgbW9kdWxlLiAgQSBsb3Qgb2YgY29kZSBnZW5lcmF0aW9uIGlzCiAgICAgICAgICAgbm93IGRyaXZlbiBieSB0YWJsZXMgYW5kIHR5cGVtYXBzLiAgIFRoZSBnZW5lcmF0ZWQgd3JhcHBlciBjb2RlIAogICAgICAgICAgIGFsc28gbWFrZXMgdXNlIG9mIHRhYmxlcyB0byBpbnN0YWxsIGNvbnN0YW50cywgdmFyaWFibGVzLCBhbmQKICAgICAgICAgICBmdW5jdGlvbnMgaW5zdGVhZCBvZiBpbmxpbmluZyBhIGJ1bmNoIG9mIHByb2NlZHVyZSBjYWxscy4gIFRoZQogICAgICAgICAgIHNlcGFyYXRlIHZhcmlhYmxlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGlzIGdvbmUuICAgTW9zdAogICAgICAgICAgIGNvZGUgZ2VuZXJhdGlvbiBpcyBjb250cm9sbGVkIHZpYSB0aGUgcGVybDUuc3dnIGZpbGUgaW4gdGhlCiAgICAgICAgICAgbGlicmFyeS4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAKMTEvMTMvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgcGFyc2luZyBzdXBwb3J0IGZvciB0aGUgQysrIHR5cGVuYW1lIGtleXdvcmQuICBQcmltYXJpbHkgdGhpcwogICAgICAgICAgIGlzIGFkZGVkIHRvIGJldHRlciBzdXBwb3J0IHRlbXBsYXRlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgIGJsYWgoQyYgdikgewogICAgICAgICAgICAgICAgIHR5cGVuYW1lIEM6Oml0ZXJhdG9yIGkgPSB2LmJlZ2luKCk7CiAgICAgICAgICAgICB9CgogICAgICAgICAgIE5vdGU6IHR5cGVuYW1lIGlzIHN1cHBvcnRlZCBpbiB0aGUgcGFyc2VyIGluIHRoZSBzYW1lIHdheSBhcyAnc3RydWN0JwogICAgICAgICAgIG9yICdjbGFzcycuICBZb3UgcHJvYmFibHkgc2hvdWxkbid0IHVzZSBpdCBhbnl3aGVyZSBleGNlcHQgaW4gdGVtcGxhdGVzLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjExLzExLzIwMDE6YmVhemxleQogICAgICAgICAgIE1hc3NpdmUgb3ZlcmhhdWwgb2YgdGhlIGxhbmd1YWdlIG1vZHVsZSBBUEkuICAgTW9zdCBmdW5jdGlvbnMgbm93CiAgICAgICAgICAgdXNlIGEgY29tbW9uLCB2ZXJ5IHNpbXBsZSwgIEFQSS4gICBUaGVyZSBhcmUgYWxzbyBhIG51bWJlciBvZgogICAgICAgICAgIGludGVyZXN0aW5nIHNlbWFudGljIHNpZGUtZWZmZWN0cyBvZiBob3cgY29kZSBpcyBhY3R1YWxseSBnZW5lcmF0ZWQuCiAgICAgICAgICAgRGV0YWlscyB3aWxsIGJlIGZvcnRoY29taW5nIGluIERvYy9NYW51YWwvRXh0ZW5kaW5nLmh0bWwuCgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKiBMYW5ndWFnZSBtb2R1bGVzIHdyaXR0ZW4gZm9yCiAgICAgICAgICAgcHJldmlvdXMgdmVyc2lvbnMgb2YgU1dJRyB3aWxsIG5vIGxvbmdlciB3b3JrLAoKMTEvMTAvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgYSB2ZXJ5IHN1YnRsZSBidWcgZHVlIHRvIHVubmFtZWQgY2xhc3Mgd3JhcHBpbmcuIEZvciBleGFtcGxlLCBpZgogICAgICAgICAgIHlvdSBkaWQgdGhpcwoKICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCB7CiAgICAgICAgICAgICAgICAgIGludCB4LHk7CiAgICAgICAgICAgICAgfSBnZFBvaW50LCAqZ2RQb2ludFB0cjsKCiAgICAgICAgICAgICAgdm9pZCBmb28oZ2RQb2ludFB0ciB4KTsKCiAgICAgICAgICAgVGhlbiB0aGUgZm9vIGZ1bmN0aW9uIHdvdWxkIGdldCBhIHR5cGUtZXJyb3IuICAgVGhlIHByb2JsZW0gaGFzCiAgICAgICAgICAgdG8gZG8gd2l0aCBpbnRlcm5hbCB0eXBlZGVmIGhhbmRsaW5nIGFuZCB0aGUgZmFjdCB0aGF0IHRoZSB0eXBlZGVmCiAgICAgICAgICAgZGVjbGFyYXRpb25zIGFmdGVyIHRoZSBzdHJ1Y3QgYXBwZWFyIGxhdGVyIGluIHRoZSBwYXJzZSB0cmVlLgogICAgICAgICAgIEl0IHNob3VsZCB3b3JrIG5vdy4gIFByb2JsZW0gcmVwb3J0ZWQgYnkgVmluIEpvdmFub3ZpYy4KCjExLzA5LzIwMDE6YmVhemxleQogICAgICAgICAgIFN1YnRsZSBjaGFuZ2UgdG8gIm91dCIgdHlwZW1hcHMgKGFuZCByZWxhdGVkIHZhcmlhdGlvbnMpLiAgVGhlIG5hbWUKICAgICAgICAgICB0aGF0IGlzIGF0dGFjaGVkIHRvIHRoZSB0eXBlbWFwIGlzIG5vdyB0aGUgcmF3IEMgaWRlbnRpZmllciB0aGF0CiAgICAgICAgICAgYXBwZWFycyBvbiBhIGRlY2xhcmF0aW9uLiAgVGhpcyBjaGFuZ2VzIHRoZSBiZWhhdmlvciBvZgogICAgICAgICAgIG1lbWJlciBmdW5jdGlvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgaW50IGZvbyB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICBjbGFzcyBCbGFoIHsKICAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIGludCBmb28oKTsgICAgLy8gdHlwZW1hcCBnZXRzIGFwcGxpZWQKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICBQcmV2aW91cyB2ZXJzaW9ucyBuZXZlciByZWFsbHkgc3BlY2lmaWVkIGhvdyB0aGlzIHdhcyBzdXBwb3NlZCB0bwogICAgICAgICAgIHdvcmsuICBJbiBTV0lHMS4xLCB5b3UgY291bGQgcHJvYmFibHkgd3JpdGUgYSB0eXBlbWFwIGZvciB0aGUKICAgICAgICAgICB3cmFwcGVyIG5hbWUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgaW50IEJsYWhfZm9vIHsgLi4uIH0KCiAgICAgICAgICAgSG93ZXZlciwgdGhpcyBvbGQgYmVoYXZpb3IgaXMgbm93IHdpdGhkcmF3biBhbmQgbm90IHN1cHBvcnRlZC4gCiAgICAgICAgICAgSnVzdCB1c2UgdGhlIG1lbWJlciBuYW1lIHdpdGhvdXQgYW55IHNvcnQgb2Ygc3BlY2lhbCBwcmVmaXguCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8wNi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBDaGFuZ2VzIHRvIFRjbCBtb2R1bGUgaW5pdGlhbGl6YXRpb246CgogICAgICAgICAgICgxKSBTV0lHIG5vdyBhdXRvbWF0aWNhbGx5IGluY2x1ZGVzIHRoZSBjb2RlIG5lZWRlZCB0byB3b3JrIHdpdGgKICAgICAgICAgICAgICAgIFRjbCBzdHVicy4gIFNpbXBseSBjb21waWxlIHdpdGggLURVU0VfVENMX1NUVUJTLgoKICAgICAgICAgICAoMikgU1dJRyBub3cgYXV0b21hdGljYWxseSBjYWxscyBUY2xfUGtnUHJvdmlkZSB0byByZWdpc3RlcgogICAgICAgICAgICAgICBhIHBhY2thZ2UgbmFtZS4gIFRoZSBwYWNrYWdlIG5hbWUgaXMgdGhlIHNhbWUgYXMgdGhlIG5hbWUKICAgICAgICAgICAgICAgc3BlY2lmaWVkIHdpdGggdGhlICVtb2R1bGUgZGlyZWN0aXZlLiAgVGhlIHZlcnNpb24gbnVtYmVyIGlzCiAgICAgICAgICAgICAgIHNldCB0byAiMC4wIiBieSBkZWZhdWx0LiAgVG8gY2hhbmdlIHRoZSB2ZXJzaW9uIG51bWJlciwgdXNlCiAgICAgICAgICAgICAgIHN3aWcgLXBrZ3ZlcnNpb24gMS4yIGludGVyZmFjZS5pLgoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICBNb2R1bGVzIHRoYXQgcHJvdmlkZWQgc3R1YnMgYW5kIFRjbF9Qa2dQcm92aWRlIG9uIHRoZWlyIG93biBtaWdodAogICAgICAgICAgIGJyZWFrLiAgU2ltcGx5IHJlbW92ZSB0aGF0IGNvZGUuCgoxMS8wNS8yMDAxOmJlYXpsZXkKICAgICAgICAgICBDaGFuZ2VkIGNvZGUgZ2VuZXJhdGlvbiBvZiBjb25zdGFudHMgaW4gdGhlIFRjbCBtb2R1bGUuICBDb25zdGFudHMKICAgICAgICAgICBhcmUgbm93IHN0b3JlZCBpbiBhIGxhcmdlIHRhYmxlIHRoYXQgZ2V0IGluc3RhbGxlZCBhdCBtb2R1bGUgc3RhcnR1cC4KICAgICAgICAgICBUaGVyZSBhcmUgYWxzbyBubyBsb25nZXIgYW55IHN0YXRpYyB2YXJpYWJsZXMgc28gaXQgc2hvdWxkIGdlbmVyYXRlCiAgICAgICAgICAgc29tZXdoYXQgbGVzcyBjb2RlLgoKMTEvMDQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgVGhlICJjb25zdCIgdHlwZW1hcCBoYXMgYmVlbiByZW5hbWVkIHRvICJjb25zdGFudCIgaW4gbWFueSBsYW5ndWFnZQogICAgICAgICAgIG1vZHVsZXMuICAiY29uc3QiIGlzIGEgQyBrZXl3b3JkIHdoaWNoIG1hZGUgdGhlIGhhbmRsaW5nIG9mIHRoZSB0eXBlbWFwCiAgICAgICAgICAgZGlyZWN0aXZlIHNvbWV3aGF0IGF3a3dhcmQgaW4gdGhlIHBhcnNlci4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjExLzA0LzIwMDE6YmVhemxleQogICAgICAgICAgICV0eXBlbWFwIGRpcmVjdGl2ZSBjYW4gbm93IGFjY2VwdCBuZWFybHkgYXJiaXRyYXJ5IGtleXdvcmQgcGFyYW1ldGVycy4KICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4scGFyc2U9ImkiLGRvYz0iaW50ZWdlciIpIGludCAiLi4uIgoKICAgICAgICAgICBUaGUgcHVycG9zZSBvZiB0aGUga2V5d29yZCBwYXJhbWV0ZXJzIGlzIHRvIHN1cHBseSBjb2RlIGdlbmVyYXRpb24KICAgICAgICAgICBoaW50cyB0byB0aGUgdGFyZ2V0IGxhbmd1YWdlIG1vZHVsZS4gICBUaGUgaW50ZXByZXRhdGlvbiBvZiB0aGUKICAgICAgICAgICBwYXJhbWV0ZXJzIGlzIGxhbmd1YWdlIHNwZWNpZmljLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjExLzA0LzIwMDE6YmVhemxleQogICAgICAgICAgIFNsaWdodCBzZW1hbnRpYyBjaGFuZ2UgdG8gaW50ZXJuYWwgY2FsbC9yZXR1cm4gYnkgdmFsdWUgaGFuZGxpbmcuCiAgICAgICAgICAgSW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgU1dJRywgY2FsbC1ieS12YWx1ZSB3YXMgdHJhbnNsYXRlZAogICAgICAgICAgIGludG8gcG9pbnRlcnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGRvdWJsZSBkb3RfcHJvZHVjdChWZWN0b3IgYSwgVmVjdG9yIGIpOwoKICAgICAgICAgICB0dXJuZWQgaW50byB0aGlzOgoKICAgICAgICAgICAgICAgZG91YmxlIHdyYXBfZG90X3Byb2R1Y3QoVmVjdG9yICphLCBWZWN0b3IgKmIpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvdF9wcm9kdWN0KCphLCpiKTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBUaGlzIHRyYW5zbGF0aW9uIHdhcyBub3JtYWxseSBwZXJmb3JtZWQgYnkgdGhlIFNXSUcgY29yZSwgb3V0c2lkZQogICAgICAgICAgIG9mIHRoZSBjb250cm9sIG9mIGxhbmd1YWdlIG1vZHVsZXMuICBIb3dldmVyLCBhIHNpZGUgZWZmZWN0CiAgICAgICAgICAgb2YgdGhpcyB3YXMgYSBsb3Qgb2YgYml6YXJyZSB0eXBlbWFwIGJlaGF2aW9yLiAgIEZvciBleGFtcGxlLAogICAgICAgICAgIGlmIHlvdSBkaWQgc29tZXRoaW5nIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgaW50MzIgewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBZb3Ugd291bGQgZmluZCB0aGF0IGludDMyIHdhcyB0cmFuc2Zvcm1lZCBpbnRvIGEgcG9pbnRlciBldmVyeXdoZXJlIQogICAgICAgICAgIChuZWVkbGVzcyB0byBzYXksIHN1Y2ggYmVoYXZpb3IgaXMgdW5leHBlY3RlZCBhbmQgcXVpdGUgYXdrd2FyZCB0bwogICAgICAgICAgIGRlYWwgd2l0aCkuICBUbyBtYWtlIG1hdHRlcnMgd29yc2UsIGlmIGEgdHlwZWRlZiB3YXMgYWxzbyB1c2VkLAogICAgICAgICAgIHRoZSBwb2ludGVyIGJlaGF2aW9yIHN1ZGRlbmx5IGRpc2FwcGVhcmVkLgoKICAgICAgICAgICBUbyBmaXggdGhpcywgdGhlIHBvaW50ZXIgdHJhbnNmb3JtYXRpb24gaXMgbm93IHB1c2hlZCB0byB0aGUKICAgICAgICAgICBsYW5ndWFnZSBtb2R1bGVzLiAgIFRoaXMgcHJvZHVjZXMgd3JhcHBlcnMgdGhhdCBsb29rIHJvdWdobHkKICAgICAgICAgICBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICBkb3VibGUgd3JhcF9kb3RfcHJvZHVjdChWZWN0b3IgKmEsIFZlY3RvciAqYikgewogICAgICAgICAgICAgICAgICBWZWN0b3IgYXJnMSA9ICphOwogICAgICAgICAgICAgICAgICBWZWN0b3IgYXJnMiA9ICpiOwogICAgICAgICAgICAgICAgICByZXR1cm4gZG90X3Byb2R1Y3QoYXJnMSxhcmcyKTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBUaGlzIGNoYW5nZSBhbHNvIG1ha2VzIGl0IGVhc3kgdG8gZGVmaW5lIHR5cGVtYXBzIGZvcgogICAgICAgICAgIGFyYml0cmFyeSB1bmRlZmluZWQgdHlwZXMuICBGb3IgZXhhbXBsZSwgeW91IGNhbiBkbyB0aGlzIChhbmQgaXQKICAgICAgICAgICB3aWxsIHdvcmsgcmVnYXJkbGVzcyB3aGF0IGludDMyIGlzKToKCiAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBpbnQzMiB7CiAgICAgICAgICAgICAgICAgICQxID0gKGludDMyKSBQeUludF9Bc0xvbmcoJGlucHV0KTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAqKiogUE9URU5USUFMIElNQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICBUaGlzIGNoYW5nZSBtYXkgYnJlYWsgY2FsbC9yZXR1cm4gYnkgdmFsdWUgY29kZSBnZW5lcmF0aW9uIGluCiAgICAgICAgICAgc29tZSBsYW5ndWFnZSBtb2R1bGVzLgoKMTEvMDMvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlZCB0aGUgbmFtZSBvZiB0aGUgZGVmYXVsdCB0eXBlbWFwcyB0byB0aGUgZm9sbG93aW5nOgoKICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHVFlQRSAgeyAKICAgICAgICAgICAgICAgICAgIC4uLiBhbiBvYmplY3QgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHVFlQRSAqIHsKICAgICAgICAgICAgICAgICAgIC4uLiBhIHBvaW50ZXIgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHVFlQRSAmIHsKICAgICAgICAgICAgICAgICAgIC4uLiBhIHJlZmVyZW5jZSAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdUWVBFIFtdIHsKICAgICAgICAgICAgICAgICAgIC4uLiBhbiBhcnJheSAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAldHlwZW1hcCgpIGVudW0gU1dJR1RZUEUgewogICAgICAgICAgICAgICAgICAuLi4gYW4gZW51bSB2YWx1ZSAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdUWVBFIChDTEFTUzo6KikgewogICAgICAgICAgICAgICAgICAgLi4uIHBvaW50ZXIgdG8gbWVtYmVyIC4uLgogICAgICAgICAgICAgICB9CgoKICAgICAgICAgICBUaGVzZSB0eXBlcyBhcmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBmb3IgYWxsIHR5cGVzIHRoYXQgZG9uJ3QgbWF0Y2gKICAgICAgICAgICBhbnl0aGluZyBlbHNlLiAgU2VlIENIQU5HRVMgbG9nIGVudHJ5IGZvciA4LzI3LzIwMDAgZm9yIHRoZQogICAgICAgICAgIG9sZCBiZWhhdmlvci4gIFRoZSByb2xlIG9mIHRoZXNlIHR5cGVzIGlzIGFsc28gZGVzY3JpYmVkIGluIAogICAgICAgICAgIERvYy9NYW51YWwvVHlwZW1hcHMuaHRtbAoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgIAoxMC8yNS8yMDAxOmJlYXpsZXkKICAgICAgICAgICBNb2RpZmllZCBHdWlsZSBhbmQgTXpzY2hlbWUgbW9kdWxlcyB0byBzdXBwb3J0CiAgICAgICAgICAgbXVsdGktYXJndW1lbnQgdHlwZW1hcHMuCgoxMC8yNS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gRml4IHRvIGhhbmRsZSBwb2ludGVycyB0byBhcnJheXMuCgoxMC8yNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBEZWZpbmluZyBhIHR5cGVtYXAgcnVsZSBmb3IgZW51bSBTV0lHRU5VTSBjYW4gbm93IGJlIHVzZWQKICAgICAgICAgICB0byBkZWZpbmUgZGVmYXVsdCBiZWhhdmlvciBmb3IgZW51bSB2YXJpYWJsZXMuCgoxMC8yMi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBSdWJ5IG1vZHVsZSBtb2RpZmllZCB0byBzdXBwb3J0IG11bHRpLWFyZ3VtZW50IHR5cGVtYXBzLgoKMTAvMjIvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgVGhlIFJ1YnkgbW9kdWxlIGNhbiBub3cgaGFuZGxlIGZ1bmN0aW9ucyB3aXRoIGFuIGFyYml0cmFyeQogICAgICAgICAgIG51bWJlciBvZiBhcmd1bWVudHMuICBQcmV2aW91cyB2ZXJzaW9ucyB3ZXJlIGxpbWl0ZWQgdG8gCiAgICAgICAgICAgdG8gZnVuY3Rpb25zIHdpdGggb25seSA5IG9yIDE2IGFyZ3VtZW50cyBkZXBlbmRpbmcgb24KICAgICAgICAgICB0aGUgdXNlIG9mIGRlZmF1bHQgYXJndW1lbnRzLiAgIE5vdGU6IGZyb20gc29tZSBpbnNwZWN0aW9uCiAgICAgICAgICAgb2YgdGhlIFJ1YnkgaW50ZXJwcmV0ZXIgc291cmNlLCB0aGUgbmV3IGFwcHJvYWNoIG1pZ2h0IGJlCiAgICAgICAgICAgYSBsaXR0bGUgZmFzdGVyIGFzIHdlbGwuCgoxMC8xOC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBhIGJ1ZyB3aXRoIGZvcndhcmQgY2xhc3MgZGVjbGFyYXRpb25zIGFuZAogICAgICAgICAgIHRlbXBsYXRlcy4KCiAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIDxTLFQ+OwoKICAgICAgICAgICBCdWcgcmVwb3J0ZWQgYnkgSXJpbmEgS290bG92YS4KCjEwLzE2LzIwMDE6YmVhemxleQogICAgICAgICAgIFN1cHBvcnQgZm9yIG11bHRpdmFsdWVkIHR5cGVtYXBzIGFkZGVkLiAgVGhlIHR5cGVtYXBzCiAgICAgICAgICAgYXJlIHNwZWNpZmllZCB1c2luZyB0aGUgc3ludGF4IGJlbG93LiAgIFdpdGhpbiBlYWNoCiAgICAgICAgICAgdHlwZW1hcCwgdmFyaWFibGUgc3Vic3RpdHV0aW9uIGlzIGhhbmRsZWQgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIChpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CiAgICAgICAgICAgICAgICAgICRhcmc7ICAvLyBUaGUgaW5wdXQgb2JqZWN0IGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UKICAgICAgICAgICAgICAgICAgJDE7ICAgIC8vIEMgbG9jYWwgdmFyaWFibGUgZm9yIGZpcnN0IGFyZ3VtZW50CiAgICAgICAgICAgICAgICAgICQyOyAgICAvLyBDIGxvY2FsIHZhcmlhYmxlIGZvciBzZWNvbmQgYXJndW1lbnQKCiAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIHZhcmlhYmxlcyByZWZlciB0byBlaXRoZXIgYXJndW1lbnQKICAgICAgICAgICAgICAgICAgJDFfdHlwZSwgJDFfbHR5cGUsICQxX2Jhc2V0eXBlLCBldGMuLi4gIChhcmdjKQogICAgICAgICAgICAgICAgICAkMl90eXBlLCAkMl9sdHlwZSwgJDJfYmFzZXR5cGUsIGV0Yy4uLiAgKGFyZ3ZbXSkKCiAgICAgICAgICAgICAgICAgIC8vIEFycmF5IGRpbWVuc2lvbiBvZiBhcmd2CiAgICAgICAgICAgICAgICAgICQyX2RpbTAKICAgICAgICAgICAgICB9CgogICAgICAgICAgIEJhc2ljYWxseSBhbnkgdmFyaWFibGUgdGhhdCB3YXMgYXZhaWxhYmxlIGluIG5vcm1hbCB0eXBlbWFwcwogICAgICAgICAgIGlzIGF2YWlsYWJsZSBmb3IgZWl0aGVyIGFyZ3VtZW50IGJ5IHByZWZhY2luZyB0aGUgdmFyaWFibGUKICAgICAgICAgICBuYW1lIGJ5ICckbl8nIHdoZXJlIG4gaXMgdGhlIGFyZ3VtZW50IHBvc2l0aW9uLgoKICAgICAgICAgICBOb3RlczogIAogICAgICAgICAgICgxKSBNdWx0aS12YWx1ZWQgdHlwZW1hcHMgY2FuIG9ubHkgYmUgYXBwbGllZCB0byBhIHNpbmdsZQogICAgICAgICAgICAgICBvYmplY3QgaW4gdGhlIHRhcmdldCBzY3JpcHRpbmcgbGFuZ3VhZ2UuICAgRm9yIGV4YW1wbGUsCiAgICAgICAgICAgICAgIHlvdSBjYW4gc3BsaXQgYSBzdHJpbmcgaW50byBhIChjaGFyICosIGludCkgcGFpciBvcgogICAgICAgICAgICAgICBzcGxpdCBhIGxpc3QgaW50byBhIChpbnQsIGNoYXIgW10pIHBhaXIuICBJdCBpcyBub3QKICAgICAgICAgICAgICAgcG9zc2libGUgdG8gbWFwIG11bHRpcGxlIG9iamVjdHMgdG8gbXVsdGlwbGUgYXJndW1lbnRzLgoKICAgICAgICAgICAoMikgVG8gbWFpbnRhaW4gY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIFNXSUcgdmVyc2lvbnMsIHRoZQogICAgICAgICAgICAgICB2YXJpYWJsZXMgc3VjaCBhcyAkdGFyZ2V0IGFuZCAkdHlwZSBhcmUgcHJlc2VydmVkIGFuZAogICAgICAgICAgICAgICBhcmUgbWFwcGVkIG9udG8gdGhlIGZpcnN0IGFyZ3VtZW50IG9ubHkuCgogICAgICAgICAgICgzKSBUaGlzIHNob3VsZCBub3QgYWZmZWN0IGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBjb2RlLgogICAgICAgICAgICAgICBNdWx0aS12YWx1ZWQgdHlwZW1hcHMgYXJlIGFuIGV4dGVuc2lvbiB0byB0eXBlbWFwIGhhbmRsaW5nLgogICAgICAgICAgICAgICBTaW5nbGUgdmFsdWVkIHR5cGVtYXBzIGNhbiBiZSBzcGVjaWZpZWQgaW4gdGhlIHVzdWFsCiAgICAgICAgICAgICAgIHdheS4KCiAgICAgICAgICAgVGhlIG9sZCAkc291cmNlIGFuZCAkdGFyZ2V0IHZhcmlhYmxlcyBhcmUgb2ZmaWNpYWxseQogICAgICAgICAgIGRlcHJlY2F0ZWQuICBJbnB1dCB2YXJpYWJsZXMgYXJlIHJlZmVyZW5jZWQgdGhyb3VnaAogICAgICAgICAgICRhcmckIGFuZCBvdXRwdXQgdmFsdWVzIGFyZSByZWZlcmVuY2UgdGhyb3VnaCAkcmVzdWx0JC4KCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTAvMTYvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgcGFyc2luZyBzdXBwb3J0IGZvciBtdWx0aXZhbHVlZCB0eXBlbWFwcy4gIFRoZSBzeW50YXgKICAgICAgICAgICBpcyBhIGxpdHRsZSBmdW5reSwgYnV0IGhlcmUgZ29lczoKCiAgICAgICAgICAgICAgLy8gRGVmaW5lIGEgbXVsdGl2YWx1ZWQgdHlwZW1hcAogICAgICAgICAgICAgICV0eXBlbWFwKGluKSAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewogICAgICAgICAgICAgICAgICAgIC4uLiB0eXBlbWFwIGNvZGUgLi4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAvLyBNdWx0aXZhbHVlZCB0eXBlbWFwIHdpdGggbG9jYWxzCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIChpbnQgYXJnYywgY2hhciAqYXJndltdKShpbnQgdGVtcCkgewogICAgICAgICAgICAgICAgICAgIC4uLiB0eXBlbWFwIGNvZGUgLi4uCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIAogICAgICAgICAgICAgIC8vIENvcHkgYSBtdWx0aXZhbHVlZCB0eXBlbWFwCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIChpbnQgYXJnY291bnQsIGNoYXIgKiphcmd2KSA9IChpbnQgYXJnYywgY2hhciAqYXJndltdKTsKCiAgICAgICAgICAgICAgLy8gQXBwbHkgYSBtdWx0aXZhbHVlZCB0eXBlbWFwCiAgICAgICAgICAgICAgJWFwcGx5IChpbnQgYXJnYywgY2hhciAqYXJndltdKSB7IChpbnQgYXJnY291bnQsIGNoYXIgKiphcmd2KSB9OwoKICAgICAgICAgICBOb3RlOiB0aGlzIGV4dHJhIHBhcnNpbmcgc3VwcG9ydCBpcyBhZGRlZCBmb3IgZnV0dXJlIGV4dGVuc2lvbi4KICAgICAgICAgICBObyBsYW5ndWFnZSBtb2R1bGVzIGN1cnJlbnRseSBzdXBwb3J0IG11bHRpLXZhbHVlZCB0eXBlbWFwcy4KCjEwLzExLzIwMDE6YmVhemxleQogICAgICAgICAgIE1vZGlmaWVkIHRoZSB0eXBlbWFwIG1hdGNoaW5nIGNvZGUgdG8gZGlzY2FyZCBxdWFsaWZpZXJzIHdoZW4KICAgICAgICAgICBjaGVja2luZyBmb3IgYSBtYXRjaC4gICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBkZWNsYXJhdGlvbgogICAgICAgICAgIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgdm9pZCBibGFoKGNvbnN0IGNoYXIgKngpOwoKICAgICAgICAgICBUaGUgdHlwZW1hcCBjaGVja2VyIGNoZWNrcyBmb3IgYSBtYXRjaCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgoKICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp4CiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqCiAgICAgICAgICAgICAgICAgY2hhciAqeAogICAgICAgICAgICAgICAgIGNoYXIgKgoKICAgICAgICAgICBJZiB0eXBlZGVmJ3MgYXJlIGludm9sdmVkLCBxdWFsaWZpZXIgc3RyaXBwaW5nIG9jY3VycyBiZWZvcmUKICAgICAgICAgICB0eXBlZGVmIHJlc29sdXRpb24uICBTbyBpZiB5b3UgaGFkIHRoaXMsCgogICAgICAgICAgICAgICAgdHlwZWRlZiBjaGFyICpzdHJpbmc7CiAgICAgICAgICAgICAgICB2b2lkIGJsYWgoY29uc3Qgc3RyaW5nIHgpOwoKICAgICAgICAgICB0eXBlbWFwIGNoZWNraW5nIHdvdWxkIGJlIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nIHgKICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZwogICAgICAgICAgICAgICAgc3RyaW5nIHgKICAgICAgICAgICAgICAgIHN0cmluZwogICAgICAgICAgICAgICAgY29uc3QgY2hhciAqeAogICAgICAgICAgICAgICAgY29uc3QgY2hhciAqCiAgICAgICAgICAgICAgICBjaGFyICp4CiAgICAgICAgICAgICAgICBjaGFyICoKCiAgICAgICAgICAgVGhlIHByaW1hcnkgcmVhc29uIGZvciB0aGlzIGNoYW5nZSBpcyB0byBzaW1wbGlmeSB0aGUgaW1wbGVtZW50YXRpb24KICAgICAgICAgICBvZiBsYW5ndWFnZSBtb2R1bGVzLiAgV2l0aG91dCBxdWFsaWZpZXIgc3RyaXBwaW5nLCBvbmUgaGFzIHRvIHdyaXRlCiAgICAgICAgICAgc2VwZXJhdGUgdHlwZW1hcHMgZm9yIGFsbCB2YXJpYXRpb25zIG9mIGNvbnN0IGFuZCB2b2xhdGlsZSAod2hpY2gKICAgICAgICAgICBpcyBhIHBhaW4pLgoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiogIFR5cGVtYXBzIG1pZ2h0IGJlIGFwcGxpZWQgaW4KICAgICAgICAgICBwbGFjZXMgd2hlcmUgdGhleSB3ZXJlbid0IGJlZm9yZS4KCgoxMC85LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTV0lHIG5vdyBnZW5lcmF0ZXMgd3JhcHBlcnMgdGhhdCBwcm9wZXJseSBkaXNhbWJpZ3VhdGUKICAgICAgICAgICBvdmVybG9hZGVkIG1ldGhvZHMgdGhhdCBvbmx5IHZhcnkgaW4gY29uc3RuZXNzLiAgRm9yCiAgICAgICAgICAgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoKTsKICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKCkgY29uc3Q7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICBUbyBoYW5kbGUgdGhpcywgdGhlICVyZW5hbWUgZGlyZWN0aXZlIGNhbiBiZSB1c2VkIG5vcm1hbGx5LgogICAgICAgICAgIAogICAgICAgICAgICAgICAlcmVuYW1lKGJsYWhfY29uc3QpIGJsYWgoKSBjb25zdDsKCiAgICAgICAgICAgSW4gdGhlIHJlc3VsdGluZyB3cmFwcGVyIGNvZGUsIG1ldGhvZCBjYWxscyBsaWtlIHRoaXMKICAgICAgICAgICBhcmUgbm93IGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgIChvYmopLT5ibGFoKCkgICAgICAgICAgICAgICAvLyBOb24tY29uc3QgdmVyc2lvbgogICAgICAgICAgICAgICAoKEZvbyBjb25zdCAqKW9iaiktPmJsYWgoKSAgLy8gY29uc3QgdmVyc2lvbgoKICAgICAgICAgICBUaGlzIHNob3VsZCBmb3JjZSB0aGUgcmlnaHQgbWV0aG9kIHRvIGJlIGludm9rZWQuCiAgICAgICAgICAgQWRtaXR0ZWRseSwgdGhpcyBpcyBwcm9iYWJseSBvYnNjdXJlLCBidXQgd2UgbWlnaHQKICAgICAgICAgICBhcyB3ZWxsIGdldCBpdCByaWdodC4KCjEwLzgvMjAwMTogYmVhemxleQogICAgICAgICAgIFRoZSBwcmVwcm9jZXNzb3Igbm93IGlnbm9yZXMgJ1xyJyBpbiB0aGUgaW5wdXQuCiAgICAgICAgICAgVGhpcyBzaG91bGQgZml4IHRoZSBmb2xsb3dpbmcgYnVnOgogICAgICAgICAgIFsgIzQ2ODQxNiBdIFNXSUcgdGhpbmtzIG1hY3JvIGRlZnMgYXJlIGRlY2xhcmF0aW9ucz8KCjEwLzgvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIHx8LCAmJiwgYW5kICEgaW4gY29uc3RhbnRzLiAgVGhpcwogICAgICAgICAgIGZpeGVzIFNGIFsgIzQ2ODk4OCBdIExvZ2ljYWwgb3BzIGJyZWFrIHByZXByb2Nlc3Nvci4KICAgICAgICAgICBIb3dldmVyLCBhdCB0aGlzIHRpbWUsIGNvbnN0YW50cyB1c2luZyB0aGVzZSBvcGVyYXRvcnMKICAgICAgICAgICBhcmUgbm90IHN1cHBvcnRlZCAodGhlIHBhcnNlciB3aWxsIGlzc3VlIGEgd2FybmluZykuCgoxMC80LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCAtc2hvd190ZW1wbGF0ZXMgY29tbWFuZCBsaW5lIG9wdGlvbi4gIFRoaXMgbWFrZXMKICAgICAgICAgICBTV0lHIGRpc3BsYXkgdGhlIGNvZGUgaXQgYWN0dWFsbHkgcGFyc2VzIHRvIGdlbmVyYXRlCiAgICAgICAgICAgdGVtcGxhdGUgd3JhcHBlcnMuICBNb3N0bHkgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTAvNC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlIHRvIHNlbWFudGljcyBvZiAldGVtcGxhdGUgZGlyZWN0aXZlLiAgV2hlbgogICAgICAgICAgIHVzaW5nICV0ZW1wbGF0ZSwgdGhlIHRlbXBsYXRlIGFyZ3VtZW50cyBhcmUgaGFuZGxlZAogICAgICAgICAgIGFzIHR5cGVzIGJ5IGRlZmF1bHQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAldGVtcGxhdGUodmVjaW50KSB2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWNkb3VibGUpIHZlY3Rvcjxkb3VibGU+OwoKICAgICAgICAgICBUbyBzcGVjaWZ5IGEgdGVtcGxhdGUgYXJndW1lbnQgdGhhdCBpcyAqbm90KiBhIHR5cGUsIHlvdQogICAgICAgICAgIG5lZWQgdG8gdXNlIGRlZmF1bHQtdmFsdWUgc3ludGF4LiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAldGVtcGxhdGUodmVjaW50KSB2ZWN0b3I8aW50LGludD01MD47CiAgICAgICAgICAgICAgICAldGVtcGxhdGUodmVjZG91YmxlKSB2ZWN0b3I8aW50LHNpemU9MTAwPjsKCiAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgdHlwZSBuYW1lIGRvZXNuJ3QgcmVhbGx5IG1hdHRlci0tb25seQogICAgICAgICAgIHRoZSBkZWZhdWx0IHZhbHVlIChlLmcuLCA1MCwgMTAwKSBpcyB1c2VkIGR1cmluZwogICAgICAgICAgIGV4cGFuc2lvbi4gIFRoaXMgZGlmZmVycyBmcm9tIG5vcm1hbCBDKyssIGJ1dCBJIGNvdWxkbid0CiAgICAgICAgICAgZmlndXJlIG91dCBhIGJldHRlciB3YXkgdG8gZG8gaXQgaW4gdGhlIHBhcnNlci4gIE1pZ2h0CiAgICAgICAgICAgaW1wbGVtZW50IGFuIGFsdGVybmF0aXZlIGxhdGVyLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgCjEwLzQvMjAwMTogYmVhemxleQogICAgICAgICAgIE1ham9yIGNoYW5nZXMgdG8gdGVtcGxhdGUgaGFuZGxpbmcgaW4gb3JkZXIgdG8gcHJvdmlkZQogICAgICAgICAgIGJldHRlciBpbnRlZ3JhdGlvbiB3aXRoIHRoZSBDKysgdHlwZS1zeXN0ZW0uIFRoZSBtYWluCiAgICAgICAgICAgcHJvYmxlbSBpcyBhcyBmb2xsb3dzOgoKICAgICAgICAgICBTdXBwb3NlIHlvdSBoYXZlIGEgdGVtcGxhdGUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiB2b2lkIGJsYWgoY29uc3QgVCB4KSB7IHN0dWZmIH07CiAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICBOb3cgc3VwcG9zZSwgdGhhdCB5b3UgaW5zdGFudGlhdGUgdGhlIHRlbXBsYXRlIG9uIGEKICAgICAgICAgICB0eXBlIGxpa2UgdGhpcyBpbiBTV0lHOgoKICAgICAgICAgICAgICAldGVtcGxhdGUoYmxhaGludCkgYmxhaDxpbnQgKj47CgogICAgICAgICAgIEluIEMrKywgdGhpcyBpcyAqc3VwcG9zZWQqIHRvIGdlbmVyYXRlIGNvZGUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICB2b2lkIGJsYWgoaW50ICpjb25zdCB4KSB7IHN0dWZmIH07CgogICAgICAgICAgIEhvd2V2ZXIsIGluIFNXSUctMS4zLjksIHRoZSB0ZW1wbGF0ZSBzdWJzdGl0dXRpb24gZ2V0cyBpdCB3cm9uZwogICAgICAgICAgIGFuZCBwcm9kdWNlcwoKICAgICAgICAgICAgICB2b2lkIGJsYWgoY29uc3QgaW50ICp4KSB7IHN0dWZmIH07CgogICAgICAgICAgIChub3RpY2UgdGhlIGJhZCBwbGFjZW1lbnQgb2YgdGhlICdjb25zdCcgcXVhbGlmaWVyKS4KCiAgICAgICAgICAgVG8gZml4IHRoaXMsIHRoZSBTV0lHIHBhcnNlciBub3cgZ2VuZXJhdGVzIGltcGxpY2l0IHR5cGVkZWZzCiAgICAgICAgICAgZm9yIHRlbXBsYXRlIHR5cGUgYXJndW1lbnRzIHRoYXQgcHJvZHVjZXMgY29kZSByb3VnaGx5CiAgICAgICAgICAgZXF1aXZhbGVudCB0byBkb2luZyB0aGlzOgoKICAgICAgICAgICAgICB0eXBlZGVmIGludCAqX19zd2lndG1wbDE7CiAgICAgICAgICAgICAgJXRlbXBsYXRlKGJsYWhpbnQpIGJsYWg8X19zd2lndG1wbDE+OwoKICAgICAgICAgICB3aGljaCBnZW5lcmF0ZXMgY29kZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgIHZvaWQgYmxhaChjb25zdCBfX3N3aWd0bXBsMSB4KSB7IHN0dWZmIH07CgogICAgICAgICAgIFNpbmNlIHRoaXMgaXMgY29ycmVjdCBpbiBib3RoIEMrKyBhbmQgU1dJRywgaXQgcHJvdmlkZXMgdGhlIHJpZ2h0CiAgICAgICAgICAgc2VtYW50aWNzIGFuZCBhbGxvd3MgZXZlcnl0aGluZyB0byBjb21waWxlIHByb3Blcmx5LiAgSG93ZXZlciwKICAgICAgICAgICB0byBjbGVhbiB1cCB0aGUgZ2VuZXJhdGVkIGNvZGUgYSBsaXR0bGUgYml0LCB0aGUgcGFyc2VyIGtlZXBzCiAgICAgICAgICAgdHJhY2sgb2YgdGhlIHRlbXBsYXRlIHR5cGVzIGFuZCBwZXJmb3JtcyBiYWNrLXN1YnN0aXR1dGlvbiB0bwogICAgICAgICAgIHRoZSBvcmlnaW5hbCB0eXBlIHdoZW4gYnVpbGRpbmcgdGhlIHBhcnNlIHRyZWUuICBUaHVzLCBldmVuCiAgICAgICAgICAgdGhvdWdoIHRoZSBpbXBsaWNpdCB0eXBlZGVmIGlzIHVzZWQgaW4gdGhlIGlucHV0IGFuZCBtYXkgYXBwZWFyCiAgICAgICAgICAgaW4gdGhlIGdlbmVyYXRlZCB3cmFwcGVyIGZpbGUgKGZvciBwcm9wZXIgY29tcGlsYXRpb24pLCB0aGUgcGFyc2UKICAgICAgICAgICB0cmVlIHdpbGwgaGlkZSBhIGxvdCBvZiB0aGVzZSBkZXRhaWxzLiAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICB2b2lkIGJsYWgoY29uc3QgX19zd2lndG1wbDEgeCkgeyBzdHVmZiB9OwoKICAgICAgICAgICB3aWxsIGxvb2sgbGlrZSBpdCB3YXMgZGVjbGFyZWQgYXMgZm9sbG93cyAod2hpY2ggaXMgd2hhdAogICAgICAgICAgIHlvdSB3YW50KToKCiAgICAgICAgICAgICAgdm9pZCBibGFoKGludCAqY29uc3QgeCkgeyBzdHVmZiB9CgogICAgICAgICAgIFRoZSBvbmx5IHBsYWNlIHlvdSBhcmUgbGlrZWx5IHRvIG5vdGljZSB0aGUgdHlwZWRlZiBoYWNrCiAgICAgICAgICAgaXMgaW4gYm9kaWVzIG9mIHRlbXBsYXRlIGZ1bmN0aW9ucy4gIEZvciBleGFtcGxlLCBpZiB5b3UKICAgICAgICAgICBkaWQgdGhpcywKCiAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgYmxhaCB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICVhZGRtZXRob2RzIHsKICAgICAgICAgICAgICAgICAgICAgICB2b2lkIHNwYW0oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgVCAgdGVtcHZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CgogICAgICAgICAgIHlvdSB3aWxsIGZpbmQgdGhhdCAnVCB0ZW1wdmFsdWUnIGdvdCBleHBhbmRlZCBpbnRvIHNvbWUKICAgICAgICAgICBzdHJhbmdlIHR5cGVkZWYgdHlwZS4gIFRoaXMgKnN0aWxsKiBjb21waWxlcyBjb3JyZWN0bHkgCiAgICAgICAgICAgc28gaXQncyBub3QgYSBiaWcgZGVhbCAob3RoZXIgdGhhbiBsb29raW5nIGtpbmQgb2YgdWdseQogICAgICAgICAgIGluIHRoZSB3cmFwcGVyIGZpbGUpLgoKMTAvNC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgc29tZSBpbmhlcml0YW5jZSBwcm9ibGVtcyBpbiBUY2wgT2JqZWN0IGludGVyZmFjZS4KCjEwLzEvMjAwMTogYmVhemxleQogICAgICAgICAgIFRjbCBtb2R1bGUgaGFzIGNoYW5nZWQgdG8gdXNlIGJ5dGUtYmFja2VkIHBvaW50ZXIgc3RyaW5ncy4gIFRoaXMKICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgc2FmZSBvbiA2NC1iaXQgcGxhdGZvcm1zLiAgSG93ZXZlciwKICAgICAgICAgICB0aGUgb3JkZXIgaW4gd2hpY2ggZGlnaXRzIGFwcGVhciBpbiBwb2ludGVyIHZhbHVlcyBubyBsb25nZXIKICAgICAgICAgICBkaXJlY3RseSBjb3JyZXNwb25kcyB0byB0aGUgYWN0dWFsIG51bWVyaWNhbCB2YWx1ZSBvZiBhCiAgICAgICAgICAgcG9pbnRlciAob24gbGl0dGxlLWVuZGlhbiBtYWNoaW5lcywgcGFpcnMgb2YgZGlnaXRzIGFwcGVhcgogICAgICAgICAgIGluIHJldmVyc2Ugb3JkZXIpLgoKMTAvMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgUGVybDUgbW9kdWxlIGlzIG5vdyBkcml2ZW4gYnkgYSBjb25maWd1cmF0aW9uIGZpbGUgJ3Blcmw1LnN3ZycKICAgICAgICAgICBpbiB0aGUgU1dJRyBsaWJyYXJ5LgoKMTAvMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgVGhlIHBlcmw1IG1vZHVsZSBubyBsb25nZXIgdHJpZXMgdG8gYXBwbHkgdGhlICJvdXQiIHR5cGVtYXAKICAgICAgICAgICBpbiBjb2RlIGdlbmVyYXRlZCBmb3IgbWFnaWMgdmFyaWFibGVzLiAgSSdtIHN1cnByaXNlZCB0aGF0CiAgICAgICAgICAgdGhpcyBldmVyIHdvcmtlZCBhdCBhbGwgKHNpbmNlIGFsbCBvZiB0aGUgY29kZSB0aGF0IHdhcyB0aGVyZQogICAgICAgICAgIHdhcyB3cm9uZyBhbnl3YXlzKS4gICBVc2UgdGhlICJ2YXJvdXQiIHR5cGVtYXAgdG8gaGFuZGxlCiAgICAgICAgICAgZ2xvYmFsIHZhcmlhYmxlcy4KCjEwLzEvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIGEgYnVnIHJlbGF0ZWQgdG8gY2hhcmFjdGVyIGFycmF5IG1lbWJlcnMgb2Ygc3RydWN0dXJlcy4KICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgIGNoYXIgbmFtZVszMl07CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICBTV0lHIGlzIG5vcm1hbGx5IHN1cHBvc2VkIHRvIHJldHVybiBhIHN0cmluZywgYnV0IHRoaXMgd2FzCiAgICAgICAgICAgYnJva2VuIGluIDEuMy45LiAgIFRoZSByZWFzb24gaXQgd2FzIGJyb2tlbiB3YXMgYWN0dWFsbHkKICAgICAgICAgICBkdWUgdG8gYSBzdWJ0bGUgbmV3IGZlYXR1cmUgb2YgdHlwZW1hcHMuICBXaGVuIGEgZGF0YSBtZW1iZXIKICAgICAgICAgICBpcyBzZXQgdG8gYW4gYXJyYXkgbGlrZSB0aGlzLCB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIHJlbGF0ZWQKICAgICAgICAgICBhY2Nlc3NvciBmdW5jdGlvbiBpcyBhY3R1YWxseSBzZXQgdG8gYW4gYXJyYXkuICBUaGlzIG1lYW5zCiAgICAgICAgICAgdGhhdCB5b3UgY2FuIG5vdyB3cml0ZSB0eXBlbWFwcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICV0eXBlbWFwKHB5dGhvbixvdXQpIGNoYXIgW0FOWV0gewogICAgICAgICAgICAgICAgICR0YXJnZXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgkc291cmNlLCRkaW0wKTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgIFRoaXMgZnVuY3Rpb25hbGl0eSBjYW4gYmUgdXNlZCB0byByZXBsYWNlIHRoZSBkZWZ1bmN0CiAgICAgICAgICAgbWVtYmVyb3V0IHR5cGVtYXAgaW4gYSBtb3JlIGVsZWdhbnQgbWFubmVyLgoKOS8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgU29tZSBmdXJ0aGVyIHJlZmluZW1lbnQgb2YgcXVhbGlmaWVkIEMrKyBtZW1iZXIgZnVuY3Rpb25zLgogICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIHZvaWQgZm9vKCkgY29uc3Q7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAoaSkgVGhlIFNXSUcgcGFyc2VyIHdhcyBleHRlbmRlZCBzbGlnaHRseSB0byBhbGxvdyAndm9sYXRpbGUnCiAgICAgICAgICAgYW5kIGNvbWJpbmF0aW9ucyBvZiAnY29uc3QnIGFuZCAndm9sYXRpbGUnIHRvIGJlIHVzZWQuICBUaGlzCiAgICAgICAgICAgaXMgcHJvYmFibHkgcmFyZSwgYnV0IHRlY2huaWNhbGx5IGxlZ2FsLiAgT25seSBhZGRlZCBmb3IKICAgICAgICAgICBjb21wbGV0ZW5lc3MuCgogICAgICAgICAgIChpaSkgRm9yIHRoZSBwdXJwb3NlcyBvZiBvdmVybG9hZGluZywgcXVhbGlmaWVkIGFuZCBub24tcXVhbGlmaWVkCiAgICAgICAgICAgZnVuY3Rpb25zIGFyZSBkaWZmZXJlbnQuICBUaHVzLCB3aGVuIGEgY2xhc3MgaGFzIG1ldGhvZHMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICB2b2lkIGZvbygpOwogICAgICAgICAgICAgICAgIHZvaWQgZm9vKCkgY29uc3Q7CgogICAgICAgICAgIFR3byBkaXN0aW5jdCBtZXRob2RzIGFyZSBkZWNsYXJlZC4gIFRvIGRlYWwgd2l0aCB0aGlzLCAlcmVuYW1lCiAgICAgICAgICAgYW5kIHNpbWlsYXIgZGlyZWN0aXZlcyBoYXZlIGJlZW4gZXh0ZW5kZWQgdG8gcmVjb2duaXplIGNvbnN0LgogICAgICAgICAgIFRodXMsIG9uZSBjYW4gZGlzYW1iaWd1YXRlIHRoZSB0d28gZnVuY3Rpb25zIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAlcmVuYW1lKGZvb2NvbnN0KSBGb286OmZvbygpIGNvbnN0OwoKICAgICAgICAgICBvciBzaW1wbHkgaWdub3JlIHRoZSBjb25zdCB2YXJpYW50IGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAlaWdub3JlIEZvbzo6Zm9vKCkgY29uc3Q7CgogICAgICAgICAgIE5vdGU6IFNXSUcgY3VycmVudGx5IGhhcyBubyB3YXkgdG8gYWN0dWFsbHkgaW52b2tlIHRoZSBjb25zdAogICAgICAgICAgIG1lbWJlciBzaW5jZSB0aGUgJ2NvbnN0JyBpcyBkaXNjYXJkZWQgd2hlbiBnZW5lcmF0aW5nIHdyYXBwZXJzCiAgICAgICAgICAgZm9yIG9iamVjdHMuICAKCjkvMjcvMjAwMTogYmVhemxleQogICAgICAgICAgIE5ldyBkaXJlY3RpdmUuICVuYW1ld2FybiBjYW4gYmUgdXNlZCB0byBpc3N1ZSB3YXJuaW5nCiAgICAgICAgICAgbWVzc2FnZXMgZm9yIGNlcnRhaW4gZGVjbGFyYXRpb24gbmFtZXMuICAgVGhlIG5hbWUKICAgICAgICAgICBtYXRjaGluZyBpcyB0aGUgc2FtZSBhcyBmb3IgdGhlICVyZW5hbWUgZGlyZWN0aXZlLgogICAgICAgICAgIFRoZSBpbnRlbnQgb2YgdGhpcyBkaXJlY3RpdmUgaXMgdG8gaXNzdWUgd2FybmluZ3MgZm9yCiAgICAgICAgICAgcG9zc2libGUgbmFtZXNwYWNlIGNvbmZsaWN0cy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlbmFtZXdhcm4oInByaW50IGlzIGEgcHl0aG9uIGtleXdvcmQiKSBwcmludDsKCiAgICAgICAgICAgVGhlIG5hbWUgbWF0Y2hpbmcgYWxnb3JpdGhtIGlzIHBlcmZvcm1lZCBhZnRlciBhIG5hbWUKICAgICAgICAgICBoYXMgYmVlbiByZXNvbHZlZCB1c2luZyAlcmVuYW1lLiAgVGhlcmVmb3JlLCBhCiAgICAgICAgICAgZGVjbGFyYXRpb24gbGlrZSB0aGlzIHdpbGwgbm90IGdlbmVyYXRlIGEgd2FybmluZzoKCiAgICAgICAgICAgICAgJXJlbmFtZSgiUHJpbnQiKSBwcmludDsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB2b2lkIHByaW50KCk7ICAgIC8qIE5vIHdhcm5pbmcgZ2VuZXJhdGVkICovCgogICAgICAgICAgIFNpbmNlIHRoZSB3YXJuaW5nIG1lY2hhbmlzbSBmb2xsb3dzICVyZW5hbWUgc2VtYW50aWNzLCBpdCBpcwogICAgICAgICAgIGFsc28gdG8gaXNzdWUgd2FybmluZ3MgZm9yIHNwZWNpZmljIGNsYXNzZXMgb3IganVzdCBmb3IKICAgICAgICAgICBjZXJ0YWluIG1lbWJlciBmdW5jdGlvbiBuYW1lcy4KCiAgICAgICAgICAgKERhdmUgLSBJJ3ZlIGJlZW4gdGhpbmtpbmcgYWJvdXQgYWRkaW5nIHNvbWV0aGluZyBsaWtlIHRoaXMKICAgICAgICAgICBmb3IgcXVpdGUgc29tZSB0aW1lLiAgSnVzdCBuZXZlciBnb3QgYXJvdW5kIHRvIGl0KQogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCgo5LzI3LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBFbmhhbmNlZCB0aGUgJWlnbm9yZSBkaXJlY3RpdmUgc28gdGhhdCB3YXJuaW5nIG1lc3NhZ2VzCiAgICAgICAgICAgY2FuIGJlIGlzc3VlZCB0byB1c2Vycy4gICBUaGlzIGlzIGRvbmUgdXNpbmcgJWlnbm9yZXdhcm4KICAgICAgICAgICBsaWtlIHRoaXM6CgogICAgICAgICAgICAgJWlnbm9yZXdhcm4oIm9wZXJhdG9yIG5ldyBpZ25vcmVkIikgb3BlcmF0b3IgbmV3OwoKICAgICAgICAgICBUaGUgbmFtZXMgYW5kIHNlbWFudGljcyBvZiAlaWdub3Jld2FybiBpcyBleGFjdGx5IHRoZSAKICAgICAgICAgICBzYW1lIGFzICVpZ25vcmUuIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgdGhpcyBkaXJlY3RpdmUKICAgICAgICAgICBpcyBmb3IgbW9kdWxlIHdyaXRlcnMgd2hvIHdhbnQgdG8gaWdub3JlIGNlcnRhaW4gdHlwZXMKICAgICAgICAgICBvZiBkZWNsYXJhdGlvbnMsIGJ1dCB3aG8gYWxzbyB3YW50IHRvIGFsZXJ0IHVzZXJzIGFib3V0IGl0LgogICAgICAgICAgIEEgdXNlciBtaWdodCBhbHNvIHVzZSB0aGlzIGZvciBkZWJ1Z2dpbmcgKHNpbmNlIG1lc3NhZ2VzCiAgICAgICAgICAgd2lsbCBhcHBlYXIgd2hlbmV2ZXIgYW4gaWdub3JlZCBkZWNsYXJhdGlvbiBhcHBlYXJzKS4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo5LzI2LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTdXBlci1leHBlcmltZW50YWwgc3VwcG9ydCBmb3Igb3ZlcmxvYWRlZCBvcGVyYXRvcnMuIAogICAgICAgICAgIFRoaXMgaW1wbGVtZW50YXRpb24gY29uc2lzdHMgb2YgYSBmZXcgZGlmZmVyZW50IHBhcnRzLgoKICAgICAgICAgICAoaSkgT3BlcmF0b3IgbmFtZXMgc3VjaCBhcyAnb3BlcmF0b3IrJyBhcmUgbm93IGFsbG93ZWQKICAgICAgICAgICBhcyB2YWxpZCBkZWNsYXJhdG9yIG5hbWVzLiAgVGh1cyB0aGUgJ29wZXJhdG9yJyBzeW50YXgKICAgICAgICAgICBjYW4gYXBwZWFyICphbnlwbGFjZSogYSBub3JtYWwgZGVjbGFyYXRvciBuYW1lIHdhcyB1c2VkCiAgICAgICAgICAgYmVmb3JlLiAgT24gdGhlIHN1cmZhY2UsIHRoaXMgbWVhbnMgdGhhdCBvcGVyYXRvcnMgY2FuCiAgICAgICAgICAgYmUgcGFyc2VkIGp1c3QgbGlrZSBub3JtYWwgZnVuY3Rpb25zIGFuZCBtZXRob2RzLiAKICAgICAgICAgICBIb3dldmVyLCBpdCBhbHNvIG1lYW5zIHRoYXQgb3BlcmF0b3IgbmFtZXMgY2FuIGJlIHVzZWQKICAgICAgICAgICBpbiBtYW55IG90aGVyIFNXSUcgZGlyZWN0aXZlcyBsaWtlICVyZW5hbWUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICVyZW5hbWUoX19hZGRfXykgQ29tcGxleDo6b3BlcmF0b3IrKGNvbnN0IENvbXBsZXggJik7CgogICAgICAgICAgIChpaSkgT3BlcmF0b3JzIGFyZSB3cmFwcGVkICpleGFjdGx5KiBsaWtlIG5vcm1hbCBmdW5jdGlvbnMKICAgICAgICAgICBhbmQgbWV0aG9kcy4gIEludGVybmFsbHksIHRoZSBvcGVyYXRvciBuYW1lIGlzIHVzZWQgCiAgICAgICAgICAgZGlyZWN0bHkgbWVhbmluZyB0aGF0IHRoZSB3cmFwcGVyIGNvZGUgbWlnaHQgY29udGFpbgogICAgICAgICAgIHN0YXRlbWVudHMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIGFyZzAtPm9wZXJhdG9yKigoQ29tcGxleCBjb25zdCAmKSphcmcxKTsKCiAgICAgICAgICAgVGhpcyBhbGwgc2VlbXMgdG8gcGFyc2UgYW5kIGNvbXBpbGUgY29ycmVjdGx5IChhdCBsZWFzdAogICAgICAgICAgIG9uIG15IG1hY2hpbmUpLgoKICAgICAgICAgICAoaWlpKSBTV0lHIHdpbGwgbm8gbG9uZ2VyIHdyYXAgYSBkZWNsYXJhdGlvbiBpZiBpdHMgc3ltYm9sCiAgICAgICAgICAgdGFibGUgbmFtZSBjb250YWlucyBpbGxlZ2FsIGlkZW50aWZpZXIgY2hhcmFjdGVycy4gIElmCiAgICAgICAgICAgaWxsZWdhbCBjaGFyYWN0ZXJzIGFyZSBkZXRlY3RlZCwgeW91IHdpbGwgc2VlIGFuIGVycm9yCiAgICAgICAgICAgbGlrZSB0aGlzOgogCiAgICAgICAgICAgICAgICBXYXJuaW5nLiBDYW4ndCB3cmFwIG9wZXJhdG9yKiB1bmxlc3MgcmVuYW1lZCB0byBhIHZhbGlkIGlkZW50aWZpZXIuCgogICAgICAgICAgIFRoZSBvbmx5IHdheSB0byBmaXggdGhpcyBpcyB0byB1c2UgJXJlbmFtZSBvciAlbmFtZSB0byBiaW5kCiAgICAgICAgICAgdGhlIG9wZXJhdG9yIHRvIGEgbmljZSBuYW1lIGxpa2UgImFkZCIgb3Igc29tZXRoaW5nLiBOb3RlOgogICAgICAgICAgIHRoZSBsZWdhbCBpZGVudGlmaWVyIGNoYXJhY3RlcnMgYXJlIGRldGVybWluZWQgYnkgdGhlIHRhcmdldAogICAgICAgICAgIGxhbmd1YWdlLgoKICAgICAgICAgICBUaGVyZSBhcmUgY2VydGFpbiBpc3N1ZXMgd2l0aCBmcmllbmQgZnVuY3Rpb25zIGFuZCBvcGVyYXRvcnMuCiAgICAgICAgICAgU29tZXRpbWVzLCBmcmllbmRzIGFyZSB1c2VkIHRvIGRlZmluZSBtaXhlZCBvcGVyYXRvcnMgc3VjaAogICAgICAgICAgIGFzIGFkZGluZyBhIENvbXBsZXggYW5kIGEgZG91YmxlIHRvZ2V0aGVyLiAgQ3VycmVudGx5LCBTV0lHCiAgICAgICAgICAgaWdub3JlcyBhbGwgZnJpZW5kIGRlY2xhcmF0aW9ucyBpbiBhIGNsYXNzLiAgQSBnbG9iYWwgb3BlcmF0b3IKICAgICAgICAgICBkZWNsYXJhdGlvbiBjYW4gcHJvYmFibHkgYmUgbWFkZSB0byB3b3JrLCBidXQgeW91J2xsIGhhdmUgdG8KICAgICAgICAgICByZW5hbWUgaXQgYW5kIGl0IHByb2JhYmx5IHdvbid0IHdvcmsgdmVyeSBjbGVhbmx5IGluIHRoZQogICAgICAgICAgIHRhcmdldCBsYW5ndWFnZSBzaW5jZSBpdCdzIG5vdCBhIGNsYXNzIG1lbWJlci4KCiAgICAgICAgICAgU1dJRyBkb2Vzbid0IGtub3cgaG93IHRvIGhhbmRsZSBvcGVyYXRvciBzcGVjaWZpY2F0aW9ucyAKICAgICAgICAgICBzb21ldGltZXMgdXNlZCBmb3IgYXV0b21hdGljIHR5cGUgY29udmVyc2lvbi4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgIGNsYXNzIFN0cmluZyB7CiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgb3BlcmF0b3IgY29uc3QgY2hhciooKTsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICB9OwoKICAgICAgICAgICAodGhpcyBkb2Vzbid0IHBhcnNlIGNvcnJlY3RseSBhbmQgZ2VuZXJhdGVzIGEgc3ludGF4IGVycm9yKS4KCiAgICAgICAgICAgQWxzbzogb3BlcmF0b3JzIG5vIGxvbmdlciBzaG93IHVwIGFzIHNlcGFyYXRlIHBhcnNlLXRyZWUKICAgICAgICAgICBub2RlcyAoaW5zdGVhZCB0aGV5IGFyZSBub3JtYWwgJ2NkZWNsJyBub2RlcykuICBJIG1heQogICAgICAgICAgIHNlcGFyYXRlIHRoZW0gYXMgYSBzcGVjaWFsIGNhc2UgbGF0ZXIuCgogICAgICAgICAgIFNlZSBFeGFtcGxlcy9weXRob24vb3BlcmF0b3IgZm9yIGFuIGV4YW1wbGUuCgogICAgICAgICAgICoqKiBTVVBFUi1FWFBFUklNRU5UQUwgTkVXIEZFQVRVUkUgKioqCgpWZXJzaW9uIDEuMy45IChTZXB0ZW1iZXIgMjUsIDIwMDEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjkvMjUvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIHBhcnNpbmcgcHJvYmxlbSB3aXRoIHR5cGUgZGVjbGFyYXRpb25zIGxpa2UgCiAgICAgICAgICAgJ2NoYXIgKiogY29uc3QnLiAgU1dJRyBwYXJzZWQgdGhpcyBjb3JyZWN0bHksIGJ1dCB0aGUKICAgICAgICAgICBpbnRlcm5hbCB0eXBlIHdhcyByZXByZXNlbnRlZCBpbmNvcnJlY3RseSAodGhlIHBvaW50ZXJzCiAgICAgICAgICAgYW5kIHF1YWxpZmllcnMgd2VyZSBpbiB0aGUgd3Jvbmcgb3JkZXIpLgoKOS8yNS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgV2l0aGRyZXcgZXhwZXJpbWVudGFsIGZlYXR1cmUgKG5vdGVkIGJlbG93KSB0aGF0IHdhcwogICAgICAgICAgIGNhdXNpbmcgc2VyaW91cyBwYXJzaW5nIHByb2JsZW1zLgoKVmVyc2lvbiAxLjMuOCAoU2VwdGVtYmVyIDIzLCAyMDAxKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo5LzIzLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBJbmNsdWRlZCBpbXByb3ZlZCBkaXN0dXRpbHMgc2V0dXAucHkgZmlsZSBpbiB0aGUgVG9vbHMgCiAgICAgICAgICAgZGlyZWN0b3J5IChsb29rIGZvciB0aGUgc2V0dXAucHkudG1wbCBmaWxlKS4gIENvbnRyaWJ1dGVkIGJ5CiAgICAgICAgICAgVG9ueSBTZXdhcmQuCgo5LzIzLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBJbmNsdWRlZCB0d28gbmV3IFJQTSBzcGVjIGZpbGVzIGluIHRoZSBUb29scyBkaXJlY3RvcnkuIENvbnRyaWJ1dGVkCiAgICAgICAgICAgYnkgVG9ueSBTZXdhcmQgYW5kIFV3ZSBTdGVpbm1hbm4uCiAgCjkvMjEvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIEJ1ZyBbICM0NjM2MzUgXSBQZXJsNS5zd2cgZG9lcyBub3QgY29tcGlsZSBpbiBWaXN1YWwgQysrCgo5LzIxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBUd28gbmV3IGRpcmVjdGl2ZXMgY29udHJvbCB0aGUgY3JlYXRpb24gb2YgZGVmYXVsdAogICAgICAgICAgIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnM6CgogICAgICAgICAgICAgICAgJW5vZGVmYXVsdAogICAgICAgICAgICAgICAgJW1ha2VkZWZhdWx0CgogICAgICAgICAgIFRoZXNlIHJlcGxhY2UgJXByYWdtYSBub2RlZmF1bHQgYW5kICVwcmFnbWEgbWFrZWRlZmF1bHQuCiAgICAgICAgICAgKG9sZCBjb2RlIHdpbGwgc3RpbGwgd29yaywgYnV0IGRvY3VtZW50YXRpb24gd2lsbCBvbmx5CiAgICAgICAgICAgZGVzY3JpYmUgdGhlIG5ldyBkaXJlY3RpdmVzKS4KCjkvMjEvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIEJ1ZyBbICM0NjIzNTQgXSAlaW1wb3J0IGJyb2tlbiBpbiAxLjMuNy4KCjkvMjAvMjAwMTogYmVhemxleQoKICAgICAgICAgICBQYXJzZXIgbW9kaWZpZWQgdG8gaWdub3JlIG91dC1vZi1jbGFzcyBjb25zdHJ1Y3RvcgogICAgICAgICAgIGFuZCBkZXN0cnVjdG9yIGRlY2xhcmF0aW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgaW5saW5lIEZvbzo6Rm9vKCkgOgogICAgICAgICAgICAgICAgICAgIEJhcigiZm9vIikKICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgfSAKCiAgICAgICAgICAgICAgIGlubGluZSBGb286On5Gb28oKSB7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgU3VnZ2VzdGVkIGJ5IEphc29uIFN0ZXdhcnQuCiAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBGRUFUVVJFICoqKgoKOS8yMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgTW9kaWZpZWQgdGhlIHBhcnNlciB0byBpZ25vcmUgZm9yd2FyZCB0ZW1wbGF0ZSBjbGFzcwogICAgICAgICAgIGRlY2xhcmF0aW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgViwgbG9uZyBTPiBjbGFzcyBNYXBJdGVyOwoKICAgICAgICAgICBTdWdnZXN0ZWQgYnkgYW4gZW1haWwgZXhhbXBsZSBmcm9tIElyaW5hIEtvdGxvdmEuCgo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggdW5kZWNsYXJlZCB0Y2xfcmVzdWx0IHZhcmlhYmxlIGluIAogICAgICAgICAgIHRoZSAib3V0IiB0eXBlbWFwIGZvciBUY2wuICBSZXBvcnRlZCBieSBTaGF1biBMb3dyeS4KCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIEluY29ycG9yYXRlZCBjaGFuZ2VzIHRvIG1ha2UgU1dJRyB3b3JrIHdpdGggQWN0aXZlUGVybC4gIAogICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IEpvZWwgUmVlZC4KCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIFNsaWdodCBjaGFuZ2UgdG8gdGhlIHBhcnNpbmcgb2YgQysrIGNvbnN0cnVjdG9yIGluaXRpYWxpemVycy4KICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgY2xhc3MgRm9vIDogcHVibGljIEJhciB7CiAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICBGb28oKSA6IEJhciguLi4pIHsuLi59CiAgICAgICAgICAgfTsKCiAgICAgICAgICAgU1dJRyBub3cgZGlzY2FyZHMgdGhlIGNvbnRlbnRzIG9mIHRoZSAoLi4uKSByZWdhcmRsZXNzIG9mIAogICAgICAgICAgIHdoYXQgbWlnaHQgZW5jbG9zZWQgKGV2ZW4gaWYgc3ludGFjdGljYWxseSB3cm9uZykuICBTV0lHCiAgICAgICAgICAgZG9lc24ndCBuZWVkIHRoaXMgaW5mb3JtYXRpb24gYW5kIHRoZXJlIGlzIG5vIHJlYXNvbiB0bwogICAgICAgICAgIG5lZWRsZXNzIGFkZCBzeW50YXggcnVsZXMgdG8gaGFuZGxlIGFsbCBvZiB0aGUgcG9zc2liaWxpdGllcwogICAgICAgICAgIGhlcmUuCgo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBDaGFuZ2UgdG8gdHlwZW1hcHMgZm9yIHN0cnVjdHVyZSBtZW1iZXJzLiAgSWYgeW91IGhhdmUgYQogICAgICAgICAgIHN0cnVjdHVyZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgIHN0cnVjdCBWZWN0b3IgewogICAgICAgICAgICAgICAgaW50ICpiYXI7CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgVGhlIG1lbWJlciBuYW1lICdiYXInIGlzIG5vdyB1c2VkIGluIGFueSBhY2Nlc3NvciBmdW5jdGlvbnMuCiAgICAgICAgICAgVGhpcyBhbGxvd3MgdGhlICJpbiIgdHlwZW1hcCB0byBiZSB1c2VkIHdoZW4gc2V0dGluZyB0aGUgdmFsdWUuCiAgICAgICAgICAgRm9yIGV4YW1wbGUsIHRoaXMgdHlwZW1hcAoKICAgICAgICAgICAgICAgJXR5cGVtYXAocHl0aG9uLGluKSBpbnQgKmJhciB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBub3cgbWF0Y2hlcyBWZWN0b3I6OmJhci4gIEl0IHNob3VsZCBiZSBub3RlZCB0aGF0IHRoaXMgd2lsbCBhbHNvCiAgICAgICAgICAgbWF0Y2ggYW55IGZ1bmN0aW9uIHdpdGggYW4gYXJndW1lbnQgb2YgImludCAqYmFyIiAoc28geW91IHNob3VsZAogICAgICAgICAgIGJlIGNhcmVmdWwpLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRS4gUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIGJ1ZyAjNDYyNjQyIHNldHRpbmcgc3RyaW5nIHZhbHVlcyBpbiBzdHJ1Y3R1cmVzCgo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBidWcgIzQ2MjM5OCBwcm9ibGVtIHdpdGggbmVzdGVkIHRlbXBsYXRlcy4KCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIGJ1ZyAjNDYxNjI2IHByb2JsZW0gd2l0aCBmb3JtYXR0aW5nIGFuZCBDKysgY29tbWVudHMuCiAgICAgICAgICAgIAo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBidWcgIzQ2Mjg0NSBXcm9uZyBvd25lcnNoaXAgb2YgcmV0dXJuZWQgb2JqZWN0cy4KICAgICAgICAgICAKOS8xOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgYnVnICM0NTkzNjcuICBEZWZhdWx0IGNvbnN0cnVjdG9ycyBmb3IgY2xhc3NlcwogICAgICAgICAgIHdpdGggcHVyZSB2aXJ0dWFsIG1ldGhvZHMuCgo5LzE5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgYW5kIGNsYXNzIHNjb3BlLiAgRm9yCiAgICAgICAgICAgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgZW51bSBiYXIgeyBGT08sIEJBUiB9OwogICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoYmFyIGIgPSBGT08pOwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBTV0lHIG5vdyBjb3JyZWN0bHkgZ2VuZXJhdGVzIGEgZGVmYXVsdCB2YWx1ZSBvZiAiRm9vOjpGT08iIGZvcgogICAgICAgICAgIHRoZSBibGFoKCkgbWV0aG9kIGFib3ZlLiAgVGhpcyB1c2VkIHRvIHdvcmsgaW4gMS4xLCBidXQgd2FzCiAgICAgICAgICAgYnJva2VuIGluIDEuMy43LiAgIEJ1ZyByZXBvcnRlZCBieSBNaWtlIFJvbWJlcmcuCgpWZXJzaW9uIDEuMy43ICAoU2VwdGVtYmVyIDMsIDIwMDEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjkvMDIvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIHNwZWNpYWwgJWlnbm9yZSBkaXJlY3RpdmUgdG8gaWdub3JlIGRlY2xhcmF0aW9ucy4gIFRoaXMKICAgICAgICAgICBmZWF0dXJlIHdvcmtzIGV4YWN0bHkgbGlrZSAlcmVuYW1lLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgJWlnbm9yZSAgZm9vOyAgICAgICAgLy8gSWdub3JlIGFsbCBkZWNsYXJhdGlvbnMgZm9vCiAgICAgICAgICAgICAlaWdub3JlICA6OmZvbzsgICAgICAvLyBPbmx5IGlnbm9yZSBmb28gaW4gZ2xvYmFsIHNjb3BlCiAgICAgICAgICAgICAlaWdub3JlICBTcGFtOjpmb287ICAvLyBPbmx5IGlnbm9yZSBpbiBjbGFzcyBTcGFtCiAgICAgICAgICAgICAlaWdub3JlICAqOjpmb287ICAgICAvLyBJZ25vcmUgaW4gYWxsIGNsYXNzZXMKCiAgICAgICAgICAgJWlnbm9yZSBjYW4gYWxzbyBiZSBwYXJhbWV0ZXJpemVkLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgJWlnbm9yZSBmb28oaW50KTsKICAgICAgICAgICAgICVpZ25vcmUgOjpmb28oaW50KTsKICAgICAgICAgICAgICVpZ25vcmUgU3BhbTo6Zm9vKGludCk7CiAgICAgICAgICAgICAlaWdub3JlICo6OmZvbyhpbnQpOwoKICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgICAgIAoKOS8wMi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gc2hhZG93Y29kZSBwcmFnbWEgbW9kaWZpZWQgc28gdGhhdCB0aGUgY29kZSB0aGF0IGlzIG91dHB1dCAKICAgICAgICAgICBpbiB0aGUgc2hhZG93IGZpbGUgaXMgcGxhY2VkIHJlbGF0aXZlIHRvIHdoZXJlIGl0IGlzIHBsYWNlZCBpbiB0aGUgCiAgICAgICAgICAgYy9jKysgY29kZS4gVGhpcyBhbGxvd3Mgc3VwcG9ydCBmb3IgSmF2YURvYyBmdW5jdGlvbiBjb21tZW50cy4gCgo5LzAxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBQYXRjaCBbICM0NDc3OTEgXSBGaXggZm9yIHB5dGhvbiAtaW50ZXJmYWNlIG9wdGlvbi4KICAgICAgICAgICBTdWJtaXR0ZWQgYnkgVGFybiBXZWlzbmVyIEJ1cnRvbi4KCjkvMDEvMjAwMTogYmVhemxleQogICAgICAgICAgIFNXSUcgbm8gbG9uZ2VyIGdlbmVyYXRlcyBkZWZhdWx0IGNvbnN0cnVjdG9ycy9kZXN0cnVjdG9ycwogICAgICAgICAgIGZvciBhIGNsYXNzIGlmIGl0IG9ubHkgZGVmaW5lcyBhIHByaXZhdGUvcHJvdGVjdGVkIGNvbnN0cnVjdG9yCiAgICAgICAgICAgb3IgZGVzdHJ1Y3RvciBvciBpZiBhbnkgb25lIG9mIGl0cyBiYXNlIGNsYXNzZXMgb25seSBoYXMKICAgICAgICAgICBwcml2YXRlIGNvbnN0cnVjdG9ycy9kZXN0cnVjdG9ycy4gIFRoaXMgd2FzIHJlcG9ydGVkIGluCiAgICAgICAgICAgU0YgUGF0Y2ggWyAjNDQ0MjgxIF0gbm9ucHVibGljL2RlZmF1bHQvaW5oZXJldGVkIGN0b3IvZHRvcgogICAgICAgICAgIGJ5IE1hcmNlbG8gTWF0dXMuCgo5LzAxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCBwYXRjaCB0byBQZXJsNSBtb2R1bGUgdGhhdCBhbGxvd3MgY29uc3RhbnRzIHRvIGJlCiAgICAgICAgICAgd3JhcHBlZCBhcyBjb25zdGFudHMgdGhhdCBkb24ndCByZXF1aXJlIHRoZSBsZWFkaW5nICQuCiAgICAgICAgICAgVGhpcyBmZWF0dXJlIGlzIGVuYWJsZWQgdXNpbmcgdGhlIC1jb25zdCBvcHRpb24uCiAgICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgUmljaCBXYWxlcy4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzMxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCBwYXJzaW5nIHN1cHBvcnQgZm9yIHRoZSAndm9sYXRpbGUnIHR5cGUgcXVhbGlmaWVyLgogICAgICAgICAgIHZvbGF0aWxlIGRvZXNuJ3QgbWVhbiBhbnl0aGluZyB0byBTV0lHLCBidXQgaXQgaXMKICAgICAgICAgICBuZWVkZWQgdG8gcHJvcGVybHkgZ2VuZXJhdGUgcHJvdG90eXBlcyBmb3IgZGVjbGFyYXRpb25zCiAgICAgICAgICAgdGhhdCB1c2UgaXQuICBJdCdzIGFsc28gYmVlbiBhZGRlZCB0byBtYWtlIHRoZSBTV0lHIHR5cGUKICAgICAgICAgICBzeXN0ZW0gbW9yZSBjb21wbGV0ZS4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzMwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBwYXJhbWV0ZXJpemVkICVyZW5hbWUgZGlyZWN0aXZlLiAgKioqIFRoaXMKICAgICAgICAgICBuZXcgZmVhdHVyZSBjYW4gYmUgdXNlZCB0byBncmVhdGx5IHNpbXBsaWZ5IHRoZSB0YXNrIG9mCiAgICAgICAgICAgcmVzb2x2aW5nIG92ZXJsb2FkZWQgbWV0aG9kcyBhbmQgZnVuY3Rpb25zLiAqKioKICAgICAgICAgICAKICAgICAgICAgICBJbiBwcmlvciB2ZXJzaW9ucyBvZiBTV0lHLCB0aGUgJXJlbmFtZSBkaXJlY3RpdmUgd2FzCiAgICAgICAgICAgdXNlZCB0byBjb25zaXN0ZW50bHkgYXBwbHkgYW4gaWRlbnRpZmllciByZW5hbWluZy4gRm9yIAogICAgICAgICAgIGV4YW1wbGUsIGlmIHlvdSBzYWlkIHRoaXM6CgogICAgICAgICAgICAgICAgJXJlbmFtZSBmb28gYmFyOwoKICAgICAgICAgICBFdmVyeSBvY2N1cnJlbmNlIG9mICdmb28nIHdvdWxkIGJlIHJlbmFtZWQgdG8gJ2JhcicuIAogICAgICAgICAgIEFsdGhvdWdoIHRoaXMgd29ya3MgZmluZSBmb3IgcmVzb2x2aW5nIGEgY29uZmxpY3Qgd2l0aCBhCiAgICAgICAgICAgdGFyZ2V0IGxhbmd1YWdlIHJlc2VydmVkIHdvcmQsIGl0IGlzIHVzZWxlc3MgZm9yCiAgICAgICAgICAgZm9yIGRlYWxpbmcgd2l0aCBvdmVybG9hZGVkIG1ldGhvZHMuICAgIFRoaXMgaXMgYmVjYXVzZQogICAgICAgICAgIGFsbCBtZXRob2RzIGFyZSBzaW1wbHkgcmVuYW1lZCB0byB0aGUgc2FtZSB0aGluZyAKICAgICAgICAgICAoZ2VuZXJhdGluZyB0aGUgc2FtZSBjb25mbGljdCBhcyBiZWZvcmUpLgoKICAgICAgICAgICBUaGVyZWZvcmUsIHRoZSBvbmx5IHdheSB0byBkZWFsIHdpdGggb3ZlcmxvYWRlZCBtZXRob2RzCiAgICAgICAgICAgd2FzIHRvIGdvIHRocm91Z2ggYW5kIGluZGl2aWR1YWxseSByZW5hbWUgdGhlbSBhbGwgdXNpbmcKICAgICAgICAgICAlbmFtZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGJhcih2b2lkKTsKICAgICAgICAgICAgICAgICAlbmFtZShiYXJfaSkgdmlydHVhbCB2b2lkIGJhcihpbnQpOwogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgfTsKCiAgICAgICAgICAgVG8gbWFrZSBtYXR0ZXJzIHdvcnNlLCB5b3UgaGFkIHRvIGRvIHRoaXMgZm9yIGFsbAogICAgICAgICAgIGRlcml2ZWQgY2xhc3NlcyB0b28uCgogICAgICAgICAgICAgY2xhc3MgU3BhbSA6IHB1YmxpYyBGb28gewogICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBiYXIodm9pZCk7CiAgICAgICAgICAgICAgICAgJW5hbWUoYmFyX2kpIHZpcnR1YWwgdm9pZCBiYXIoaW50KTsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgIH07CgogICAgICAgICAgIE5lZWRsZXNzIHRvIHNheSwgdGhpcyBtYWtlcyBpdCBleHRyZW1lbHkgaGFyZCB0byByZXNvbHZlCiAgICAgICAgICAgb3ZlcmxvYWRpbmcgd2l0aG91dCBhIGxvdCBvZiB3b3JrIGFuZCBtYWtlcyBpdCBhbG1vc3QKICAgICAgICAgICBpbXBvc3NpYmxlIHRvIHVzZSBTV0lHIG9uIHJhdyBDKysgLmggZmlsZXMuCgogICAgICAgICAgIFRvIGZpeCB0aGlzLCAlcmVuYW1lIG5vdyBhY2NlcHRzIHBhcmFtZXRlciBkZWNsYXJhdG9ycy4KICAgICAgICAgICBUaGUgc3ludGF4IGhhcyBhbHNvIGJlZW4gY2hhbmdlZCBzbGlnaHRseS4gIEZvciBleGFtcGxlLAogICAgICAgICAgIHRoZSBmb2xsb3dpbmcgZGVjbGFyYXRpb24gcmVuYW1lcyBhbGwgb2NjdXJyZW5jZXMgb2YgJ2JhcihpbnQpJwogICAgICAgICAgIHRvICdiYXJfaScsIGxlYXZpbmcgYW55IG90aGVyIG9jY3VycmVuY2Ugb2YgJ2JhcicgYWxvbmUuCgogICAgICAgICAgICAgJXJlbmFtZShiYXJfaSkgYmFyKGludCk7CgogICAgICAgICAgIFVzaW5nIHRoaXMgZmVhdHVyZSwgeW91IGNhbiBub3cgc2VsZWN0aXZlbHkgcmVuYW1lIAogICAgICAgICAgIGNlcnRhaW4gZGVjbGFyYXRpb25zIGluIGFkdmFuY2UuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAlcmVuYW1lKGJhcl9pKSBiYXIoaW50KTsKICAgICAgICAgICAgICVyZW5hbWUoYmFyX2QpIGJhcihkb3VibGUpOwoKICAgICAgICAgICAgIC8vIEluY2x1ZGUgcmF3IEMrKyBoZWFkZXIgICAgCiAgICAgICAgICAgICAlaW5jbHVkZSAiaGVhZGVyLmgiCgogICAgICAgICAgIFdoZW4gJXJlbmFtZSBpcyB1c2VkIGluIHRoaXMgbWFubmVyLCBhbGwgb2NjdXJyZW5jZSBvZiBiYXIoaW50KQogICAgICAgICAgIGFyZSByZW5hbWVkIHdoZXJldmVyIHRoZXkgbWlnaHQgb2NjdXIuICBNb3JlIGNvbnRyb2wgaXMgb2J0YWluZWQKICAgICAgICAgICB0aHJvdWdoIGV4cGxpY2l0IHF1YWxpZmljYXRpb24uIEZvciBleGFtcGxlLAoKICAgICAgICAgICAgICAlcmVuYW1lKGJhcl9pKSA6OmJhcihpbnQpOwoKICAgICAgICAgICBvbmx5IGFwcGxpZXMgdGhlIHJlbmFtaW5nIGlmIGJhcihpbnQpIGlzIGRlZmluZWQgaW4gdGhlIGdsb2JhbCBzY29wZS4KICAgICAgICAgICBUaGUgZGVjbGFyYXRpb24sCiAgICAgCiAgICAgICAgICAgICAgJXJlbmFtZShiYXJfaSkgRm9vOjpiYXIoaW50KTsKCiAgICAgICAgICAgYXBwbGllcyB0aGUgcmVuYW1pbmcgaWYgYmFyKGludCkgaXMgZGVmaW5lZCBpbiBhIGNsYXNzIEZvby4KICAgICAgICAgICBUaGlzIGxhdHRlciBmb3JtIGFsc28gc3VwcG9ydHMgaW5oZXJpdGFuY2UuICBUaGVyZWZvcmUsIGlmIHlvdQogICAgICAgICAgIGhhZCBhIGNsYXNzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgIGNsYXNzIFNwYW0gOiBwdWJsaWMgRm9vIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgdm9pZCBiYXIoaW50KTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBUaGUgU3BhbTo6YmFyKGludCkgbWV0aG9kIHdvdWxkIGFsc28gYmUgcmVuYW1lZCAoc2luY2UgU3BhbSAKICAgICAgICAgICBpcyBhIHN1YmNsYXNzIG9mIEZvbykuICAgVGhpcyBsYXR0ZXIgZmVhdHVyZSBtYWtlcyBpdCBlYXN5CiAgICAgICAgICAgZm9yIFNXSUcgdG8gYXBwbHkgYSBjb25zaXN0ZW50IHJlbmFtaW5nIGFjcm9zcyBhbiBlbnRpcmUKICAgICAgICAgICBjbGFzcyBoaWVyYXJjaHkgc2ltcGx5IGJ5IHNwZWNpZnlpbmcgcmVuYW1pbmcgcnVsZXMgZm9yCiAgICAgICAgICAgdGhlIGJhc2UgY2xhc3MuCgogICAgICAgICAgIEEgY2xhc3Mgd2lsZGNhcmQgb2YgKiBjYW4gYmUgdXNlZCBpZiB5b3Ugd2FudCB0byByZW5hbWluZwogICAgICAgICAgIGFsbCBtYXRjaGluZyBtZW1iZXJzIG9mIGFsbCBjbGFzc2VzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVyZW5hbWUoYmFyX2kpICo6OmJhcihpbnQpOwoKICAgICAgICAgICB3aWxsIHJlbmFtZSBhbGwgbWVtYmVycyBiYXIoaW50KSB0aGF0IGFyZSBkZWZpbmVkIGluIGNsYXNzZXMuCiAgICAgICAgICAgSXQgd2lsbCBub3QgcmVuYW1lZCBkZWZpbml0aW9ucyBvZiBiYXIoaW50KSBpbiB0aGUgZ2xvYmFsCiAgICAgICAgICAgc2NvcGUuCgogICAgICAgICAgIFRoZSBvbGQgdXNlIG9mICVyZW5hbWUgaXMgc3RpbGwgc3VwcG9ydGVkLCBidXQgaXMgc29tZXdoYXQKICAgICAgICAgICBlbmhhbmNlZC4gIAoKICAgICAgICAgICAgICAlcmVuYW1lKGZvbykgYmFyOyAgICAgIC8vIFJlbmFtZXMgYWxsIG9jY3VycmVuY2VzIG9mICdiYXInLgogICAgICAgICAgICAgICVyZW5hbWUoZm9vKSA6OmJhcjsgICAgLy8gUmVuYW1lIGFsbCAnYmFyJyBpbiBnbG9iYWwgc2NvcGUgb25seS4KICAgICAgICAgICAgICAlcmVuYW1lKGZvbykgKjo6YmFyOyAgIC8vIFJlbmFtZSBhbGwgJ2JhcicgaW4gY2xhc3NlcyBvbmx5LgogICAgICAgICAgICAgICVyZW5hbWUoZm9vKSBGb286OmJhcjsgLy8gUmVuYW1lIGFsbCAnYmFyJyBkZWZpbmVkIGluIGNsYXNzIEZvby4KCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8zMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgZGF0YS1tZW1iZXIgdG8gbWVtYmVyLWZ1bmN0aW9uIAogICAgICAgICAgIHRyYW5zZm9ybWF0aW9uLiAgRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IGhhZCBhCiAgICAgICAgICAgc3RydWN0dXJlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgVmVjdG9yIHsKICAgICAgICAgICAgICAgICAgICBkb3VibGUgeCx5OwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgTm93IHN1cHBvc2UgdGhhdCB5b3Ugd2FudGVkIHRvIGFjY2VzcyB4IGFuZCB5IAogICAgICAgICAgIHRocm91Z2ggYSBtZW1iZXIgZnVuY3Rpb24gaW50ZXJmYWNlIGluc3RlYWQgCiAgICAgICAgICAgb2YgdGhlIHVzdWFsIFNXSUcgYmVoYXZpb3IuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBmLnNldF94KDMuNCkgICAgICAjIGluc3RlYWQgb2YgZi54ID0gMy40CiAgICAgICAgICAgICAgeCA9IGYuZ2V0X3goKSAgICAgIyBpbnN0ZWFkIG9mIHggPSBmLngKCiAgICAgICAgICAgVG8gZG8gdGhpcywgc2ltcGx5IHVzZSB0aGUgbmV3ICVhdHRyaWJ1dGVmdW5jCiAgICAgICAgICAgZGlyZWN0aXZlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVhdHRyaWJ1dGVmdW5jKGdldF8lcyxzZXRfJXMpCiAgICAgICAgICAgICAgc3RydWN0IFZlY3RvciB7CiAgICAgICAgICAgICAgICAgZG91YmxlIHgseTsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICVub2F0dHJpYnV0ZWZ1bmMKCiAgICAgICAgICAgVGhlIGFyZ3VtZW50cyB0byAlYXR0cmlidXRlZnVuYyBhcmUgQy1zdHlsZSBwcmludGYKICAgICAgICAgICBmb3JtYXQgc3RyaW5ncyB0aGF0IGRldGVybWluZSB0aGUgbmFtaW5nIGNvbnZlbnRpb24KICAgICAgICAgICB0byB1c2UuICAlcyBpcyByZXBsYWNlZCB3aXRoIHRoZSBhY3R1YWwgbmFtZSBvZiB0aGUKICAgICAgICAgICBkYXRhIG1lbWJlci4gU1dJRyBwcm92aWRlcyBhIG51bWJlciBvZiBwcmludGYKICAgICAgICAgICBleHRlbnNpb25zIHRoYXQgbWlnaHQgaGVscC4gIEZvciBleGFtcGxlLCBpZiB5b3UKICAgICAgICAgICB3YW50ZWQgdG8gdGl0bGUgY2FzZSBhbGwgb2YgdGhlIGF0dHJpYnV0ZXMsIHlvdQogICAgICAgICAgIGNvdWxkIGRvIHRoaXM6CgogICAgICAgICAgICAgICVhdHRyaWJ1dGVmdW5jKGdldCUodGl0bGUpcyxzZXQlKHRpdGxlKXMpOwoKICAgICAgICAgICBUaGlzIHdpbGwgdHVybiBhbiBhdHRyaWJ1dGUgJ2JhcicgdG8gJ2dldEJhcigpJyBhbmQgJ3NldEJhcigpJy4KCiAgICAgICAgICAgKHNvbWVvbmUgcmVxdWVzdGVkIHRoaXMgbG9uZyBhZ28sIGJ1dCBJIGZpbmFsbHkgZmlndXJlZAogICAgICAgICAgIGhvdyB0byBpbXBsZW1lbnQgaXQgaW4gYSBzdHJhaWdodGZvcndhcmQgbWFubmVyKS4KICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgIAo4LzMwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTV0lHIG5vdyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlcyBkZWZhdWx0IGNvbnN0cnVjdG9ycwogICAgICAgICAgIGFuZCBkZXN0cnVjdG9ycyBpZiBub25lIGFyZSBkZWZpbmVkLiAgVGhpcyB1c2VkIHRvIGJlCiAgICAgICAgICAgZW5hYmxlZCB3aXRoIGEgY29tbWFuZCBsaW5lIHN3aXRjaCAtbWFrZV9kZWZhdWx0LCBidXQKICAgICAgICAgICBtb3N0IHBlb3BsZSB3YW50IHRoZXNlIGZ1bmN0aW9ucyBhbnl3YXlzLiAgVG8gdHVybgogICAgICAgICAgIG9mZiB0aGlzIGJlaGF2aW9yIHVzZSB0aGUgLW5vX2RlZmF1bHQgb3B0aW9uIG9yIGluY2x1ZGUKICAgICAgICAgICB0aGUgZm9sbG93aW5nIHByYWdtYSBpbiB0aGUgaW50ZXJmYWNlIGZpbGU6CiAKICAgICAgICAgICAgICAgICAlcHJhZ21hIG5vX2RlZmF1bHQ7CiAgCiAgICAgICAgICAgVGhpcyBtYXkgYnJlYWsgY2VydGFpbiBpbnRlcmZhY2VzIHRoYXQgZGVmaW5lZCB0aGVpcgogICAgICAgICAgIG93biBjb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcnMgdXNpbmcgdGhlIHNhbWUgbmFtaW5nCiAgICAgICAgICAgY29udmVudGlvbiBhcyBTV0lHLiAgSWYgc28sIHlvdSB3aWxsIGdldCBkdXBsaWNhdGUKICAgICAgICAgICBzeW1ib2xzIHdoZW4gY29tcGlsaW5nIHRoZSBTV0lHIHdyYXBwZXIgZmlsZS4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjgvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgIENoYW5nZXMgdG8gUGVybDUgc2hhZG93IGNsYXNzIGNvZGUgZ2VuZXJhdGlvbi4gIEl0ZXJhdG9ycwogICAgICAgICAgIGFyZSBubyBsb25nZXIgc3VwcG9ydGVkIChGSVJTVEtFWSwgTkVYVEtFWSkuICBBbHNvLCBhdHRyaWJ1dGUKICAgICAgICAgICBhY2Nlc3MgaGFzIGJlZW4gY2hhbmdlZCB0byByZWx5IG9uIGluaGVyaXRhbmNlIGluIG9yZGVyCiAgICAgICAgICAgdG8gcHJvdmlkZSBiZXR0ZXIgYmVoYXZpb3IgYWNyb3NzIG1vZHVsZXMuICAKCjgvMjgvMjAwMTogYmVhemxleQogICAgICAgICAgIFZhcmlvdXMgb2JzY3VyZSBpbXByb3ZlbWVudHMgdG8gdGhlIHR5cGUgc3lzdGVtIGFuZCBjbGFzc2VzLgogICAgICAgICAgIFN0cmFuZ2UgZGVjbGFyYXRpb25zIGxpa2UgdGhpcyBhcmUgbm93IHdyYXBwZWQgY29ycmVjdGx5CiAgICAgICAgICAgKGkuZS4sIHRoZSBnZW5lcmF0ZWQgd3JhcHBlciBjb2RlIGRvZXNuJ3QgY2F1c2UgdGhlIEMrKwogICAgICAgICAgICBjb21waWxlciB0byBkaWUgd2l0aCBhIHR5cGUgZXJyb3IpLgoKICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIHR5cGVkZWYgZG91YmxlIFJlYWw7CiAgICAgICAgICAgICAgICAgUmVhbCBmb28oUmVhbCAoKm9wKShSZWFsLFJlYWwpLCBSZWFsIHgsIFJlYWwgeSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgIEluaGVyaXRhbmNlIG9mIHR5cGVzIGlzIGFsc28gaGFuZGxlZCBjb3JyZWN0bHkuCiAgICAgICAgICAgCjgvMjgvMjAwMTogYmVhemxleQogICAgICAgICAgIENoYW5nZXMgdG8gY2xhc3Mgd3JhcHBlcnMuICAgV2hlbiBTV0lHIHNlZXMgdHdvIGNsYXNzZXMgbGlrZSB0aGlzLAogCiAgICAgICAgICAgY2xhc3MgWCB7CiAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgdm9pZCBmb28oKTsKICAgICAgICAgICAgIC4uLgogICAgICAgICAgIH0KIAogICAgICAgICAgIGNsYXNzIFkgOiBwdWJsaWMgWCB7CiAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgdm9pZCBiYXIoKTsKICAgICAgICAgICAgIC4uLgogICAgICAgICAgIH0KIAogICAgICAgICAgIGl0IG5vdyBvbmx5IGdlbmVyYXRlcyB0d28gd3JhcHBlciBmdW5jdGlvbnM6CiAKICAgICAgICAgICAgIFhfZm9vKFggKngpIHsgeC0+Zm9vKCk7IH0KICAgICAgICAgICAgIFlfYmFyKFkgKnkpIHsgeS0+YmFyKCk7IH0KIAogICAgICAgICAgIFVubGlrZSBTV0lHMS4xNSwgdGhlIGZvbygpIG1ldGhvZCBkb2VzICpub3QqIHByb3BhZ2F0ZSB0byBhIHdyYXBwZXIKICAgICAgICAgICBmdW5jdGlvbiBZX2ZvbygpLiBJbnN0ZWFkLCB0aGUgYmFzZSBjbGFzcyBtZXRob2QgWF9mb28oKSBtdXN0IGJlCiAgICAgICAgICAgdXNlZC4KCiAgICAgICAgICAgVGhpcyBjaGFuZ2Ugc2hvdWxkIG5vdCBhZmZlY3QgbW9kdWxlcyB0aGF0IHVzZSBzaGFkb3cgY2xhc3NlcywgYnV0CiAgICAgICAgICAgaXQgbWlnaHQgYnJlYWsgbW9kdWxlcyB0aGF0IGRpcmVjdGx5IHVzZSB0aGUgbG93LWxldmVsIEMgd3JhcHBlcnMuCiAgICAgICAgICAgVGhpcyBjaGFuZ2UgaXMgYmVpbmcgbWFkZSBmb3IgYSBudW1iZXIgb2YgcmVhc29uczoKCiAgICAgICAgICAgICAgIC0gIEl0IGdyZWF0bHkgc2ltcGxpZmllcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgU1dJRy0tZXNwZWNpYWxseQogICAgICAgICAgICAgICAgICB3aXRoIGFudGljaXBhdGVkIGZ1dHVyZSBjaGFuZ2VzIHN1Y2ggYXMgb3ZlcmxvYWRlZCBtZXRob2RzLgoKICAgICAgICAgICAgICAgLSAgSXQgcmVzdWx0cyBpbiBzdWJzdGFudGlhbGx5IGxlc3Mgd3JhcHBlciBjb2RlLS1lc3BlY2lhbGx5CiAgICAgICAgICAgICAgICAgIGZvciBiaWcgQysrIGNsYXNzIGhpZXJhcmNoaWVzIChpbmhlcml0ZWQgZGVjbGFyYXRpb25zCiAgICAgICAgICAgICAgICAgIGFyZSBubyBsb25nZXIgY29waWVkIGludG8gZXZlcnkgc2luZ2xlIGRlcml2ZWQgY2xhc3MpLgoKICAgICAgICAgICAgICAgLSAgSXQgYWxsb3dzIGZvciBiZXR0ZXIgY29kZSBnZW5lcmF0aW9uIGFjcm9zcyBtdWx0aXBsZQogICAgICAgICAgICAgICAgICBTV0lHIGdlbmVyYXRlZCBtb2R1bGVzIChjb2RlIGlzbid0IHJlcGxpY2F0ZWQgaW4KICAgICAgICAgICAgICAgICAgZXZlcnkgc2luZ2xlIG1vZHVsZSkuCgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoKOC8yMi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBQcm92aWRlZCBzb21lIFdpbmRvd3MgZG9jdW1lbnRhdGlvbiBpbiB0aGUgV2luIGRpcmVjdG9yeSBhbmQgc29tZQogICAgICAgICAgIFZpc3VhbCBDKysgcHJvamVjdCBmaWxlcyBmb3IgcnVubmluZyBleGFtcGxlcyBvbiBXaW5kb3dzLgoKOC8yOC8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIEhhbmRsZSByZW5hbWVkIG92ZXJsb2FkZWQgZnVuY3Rpb25zIHByb3Blcmx5OwoJICAgdGhhbmtzIHRvIE1hcmMgWm9uem9uIDxNYXJjLlpvbnpvbkB1bml2LXJlbm5lczEuZnI+IGZvciB0aGUKCSAgIHBhdGNoLiAgU2VlIHRoZSBuZXcgdGVzdCBjYXNlIG5hbWVfY3h4LgoKOC8yNy8yMDAxOiBta29lcHBlCgkgICBbVGNsXSBSZW1vdmVkIGxvdHMgb2Ygd2FybmluZ3MgaXNzdWVkIGJ5IHRoZSBTdW4gRm9ydGUKCSAgIGNvbXBpbGVycywgd2hpY2ggd2VyZSBjYXVzZWQgYnkgbWl4aW5nIGZ1bmN0aW9uIHBvaW50ZXJzCgkgICBvZiBkaWZmZXJlbnQgbGlua2FnZXMgKEMrKy9DKS4gCgo4LzIzLzIwMDE6IG1rb2VwcGUKCSAgIEltcHJvdmVkIHRoZSBNelNjaGVtZSBtb2R1bGUgYnkgcG9ydGluZyBHdWlsZSdzIHBvaW50ZXIKCSAgIHR5cGUgY2hlY2tpbmcgc3lzdGVtIGFuZCBtYWtpbmcgdHlwZSBkaXNwYXRjaAoJICAgdHlwZW1hcC1kcml2ZW4uIAoKOC8yMi8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRW50aXJlbHkgbmV3IHN5bWJvbCB0YWJsZSBwcm9jZXNzaW5nLiAgIFNXSUcgc2hvdWxkIGJlIGFibGUgdG8KICAgICAgICAgICByZXBvcnQgbXVjaCBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMgZm9yIG11bHRpcGxlIGRlY2xhcmF0aW9ucy4gCiAgICAgICAgICAgQWxzbywgdGhlIG5ldyBzeW1ib2wgdGFibGUgYWxsb3dzIGZvciBvdmVybG9hZGVkIGZ1bmN0aW9ucwogICAgICAgICAgIChhbHRob3VnaCBvdmVybG9hZGluZyBpc24ndCBxdWl0ZSBzdXBwb3J0ZWQgaW4gdGhlIGxhbmd1YWdlCiAgICAgICAgICAgbW9kdWxlcyB5ZXQpLgoKOC8yMi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICAqIFtKYXZhXSAlbmV3IHN1cHBvcnQgYWRkZWQuCiAgICAgICAgICAgKiBbSmF2YV0gUGFja2FnZSBKTkkgbmFtZSByZWZpeGVkIQoKOC8xOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgUHl0aG9uIG1vZHVsZSBtb2RpZmllZCB0byBzdXBwb3J0IHBvaW50ZXJzIHRvIEMrKyBtZW1iZXJzLiAgVGhpcwogICAgICAgICAgIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAKOC8xOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgbGltaXRlZCBwYXJzaW5nIGFuZCBmdWxsIHR5cGUtc3lzdGVtIHN1cHBvcnQgZm9yIHBvaW50ZXJzIHRvCiAgICAgICAgICAgbWVtYmVycy4gTm9uZSBvZiBTV0lHJ3MgbGFuZ3VhZ2UgbW9kdWxlcyByZWFsbHkga25vdyBob3cgdG8gZGVhbCB3aXRoCiAgICAgICAgICAgdGhpcyBzbyB0aGlzIGlzIHJlYWxseSBvbmx5IHByb3ZpZGVkIGZvciBjb21wbGV0ZW5lc3MgYW5kIGZ1dHVyZQogICAgICAgICAgIGV4cGFuc2lvbi4gIE5vdGU6IFNXSUcgZG9lcyBub3Qgc3VwcG9ydCBwb2ludGVycyB0byBtZW1iZXJzIHdoaWNoIAogICAgICAgICAgIGFyZSB0aGVtc2VsdmVzIHBvaW50ZXJzIHRvIG1lbWJlcnMsIHJlZmVyZW5jZXMgdG8gcG9pbnRlcnMgdG8gbWVtYmVycywKICAgICAgICAgICBvciBvdGhlciBjb21wbGljYXRlZCBkZWNsYXJhdGlvbnMgbGlrZSB0aGlzLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMTkvMjAwMTogYmVhemxleQogICAgICAgICAgIFNXSUcgaXMgbXVjaCBiZXR0ZXIgYXQgcGFyc2luZyBjZXJ0YWluIEMrKyBkZWNsYXJhdGlvbnMuIE9wZXJhdG9ycyBhbmQKICAgICAgICAgICBmcmllbmRzIGdlbmVyYWxseSBkb24ndCBjYXVzZSBhbnltb3JlIHN5bnRheCBlcnJvcnMuICBIb3dldmVyLCBuZWl0aGVyCiAgICAgICAgICAgYXJlIHJlYWxseSBzdXBwb3J0ZWQuCgo4LzE4LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCAqaGlnaGx5KiBleHBlcmltZW50YWwgc3VwcG9ydCBmb3Igd3JhcHBpbmcgb2YgQysrCiAgICAgICAgICAgdGVtcGxhdGUgZGVjbGFyYXRpb25zLiAgU2luY2UgQysrIHRlbXBsYXRlcyBhcmUgZXNzZW50aWFsbHkKICAgICAgICAgICBnbG9yaWZpZWQgbWFjcm9zIGFuZCBTV0lHIGhhcyBhIGZ1bGx5IG9wZXJhdGlvbmFsIEMgCiAgICAgICAgICAgcHJlcHJvY2Vzc29yIHdpdGggbWFjcm8gc3VwcG9ydCwgdGhlIHBhcnNlciBub3cgY29udmVydHMKICAgICAgICAgICB0ZW1wbGF0ZSBkZWNsYXJhdGlvbnMgdG8gbWFjcm9zLiAgRm9yIGV4YW1wbGUsIGEgZnVuY3Rpb24KICAgICAgICAgICB0ZW1wbGF0ZSBsaWtlIHRoaXMKCiAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IFQgbWF4KFQgYSwgVCBiKTsKCiAgICAgICAgICAgaXMgaW50ZXJuYWxseSBjb252ZXJ0ZWQgaW50byBhIG1hY3JvIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICVkZWZpbmUgJV90ZW1wbGF0ZV9tYXgoX19uYW1lLFQpCiAgICAgICAgICAgICAgICVuYW1lKF9fbmFtZSkgVCBtYXgoVCBhLCBUIGIpOwogICAgICAgICAgICAgICAlZW5kZGVmCgogICAgICAgICAgIFRvIGluc3RhbnRpYXRlIGEgdmVyc2lvbiBvZiB0aGUgdGVtcGxhdGUsIGEgc3BlY2lhbCAldGVtcGxhdGUgZGVjbGFyYXRpb24KICAgICAgICAgICBpcyB1c2VkIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICV0ZW1wbGF0ZShtYXhpbnQpIG1heDxpbnQ+OyAgICAgICAgICAKICAgICAgICAgICAgICAgJXRlbXBsYXRlKG1heGRvdWJsZSkgbWF4PGRvdWJsZT47CgogICAgICAgICAgIFRoZSBwYXJhbWV0ZXIgdG8gdGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgbXVzdCBiZSBwcm9wZXIgQyBpZGVudGlmaWVyIHRoYXQncwogICAgICAgICAgIHVzZWQgdG8gdW5pcXVlbHkgbmFtZSB0aGUgcmVzdWx0aW5nIGluc3RhbnRpYXRpb24uICAgV2hlbiB1c2VkLCB0aGUKICAgICAgICAgICB0aGUgZXhwYW5kZWQgbWFjcm8gbG9va3MgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAlbmFtZShtYXhpbnQpIGludCBtYXgoaW50IGEsIGludCBiKTsKICAgICAgICAgICAgICAlbmFtZShtYXhkb3VibGUpIGRvdWJsZSBtYXgoZG91YmxlIGEsIGRvdWJsZSBiKTsKCiAgICAgICAgICAgQSBzaW1pbGFyIHRlY2huaXF1ZSBpcyB1c2VkIGZvciB0ZW1wbGF0ZSBjbGFzc2VzLiAgIEZvciBpbnN0YW5jZToKCiAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgdmVjdG9yIHsKICAgICAgICAgICAgICAgICBUICpkYXRhOwogICAgICAgICAgICAgICAgIGludCBzejsKICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgdmVjdG9yKGludCBuaXRlbXMpOwogICAgICAgICAgICAgICAgIFQgKmdldChpbnQgbik7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgR2V0cyBjb252ZXJ0ZWQgaW50byBhIG1hY3JvIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgJWRlZmluZSAlX3RlbXBsYXRlX3ZlY3RvcihfX25hbWUsIFQpCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICB0eXBlZGVmIHZlY3RvcjxUPiBfX25hbWU7CiAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICBjbGFzcyBfX25hbWUgewogICAgICAgICAgICAgICAgIFQgKmRhdGE7CiAgICAgICAgICAgICAgICAgaW50IHN6OwogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICBfX25hbWUoaW50IG5pdGVtcyk7CiAgICAgICAgICAgICAgICAgVCAqZ2V0KGludCBuKTsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIHR5cGVkZWYgX19uYW1lIHZlY3RvcjxUPjsKICAgICAgICAgICAgICAlZW5kZGVmCgogICAgICAgICAgIEEgc3BlY2lmaWMgaW5zdGFudGlhdGlvbiBpcyBjcmVhdGVkIGluIGV4YWN0bHkgdGhlIHNhbWUgd2F5OgoKICAgICAgICAgICAgICV0ZW1wbGF0ZShpbnR2ZWMpIHZlY3RvcjxpbnQ+OwoKICAgICAgICAgICBUaGUgcmVzdWx0aW5nIGNvZGUgcGFyc2VkIGJ5IFNXSUcgaXMgdGhlbjoKCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICB0eXBlZGVmIHZlY3RvcjxpbnQ+IGludHZlYzsKICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgIGNsYXNzIGludHZlYyB7CiAgICAgICAgICAgICAgICAgIGludCAqZGF0YTsKICAgICAgICAgICAgICAgICAgaW50IHN6OwogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgaW50dmVjKGludCBuaXRlbXMpOwogICAgICAgICAgICAgICAgICBpbnQgKmdldChpbnQgbik7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgdHlwZWRlZiBpbnR2ZWMgdmVjdG9yPGludD47CgogICAgICAgICAgIE5vdGU6IHRoZSBsYXN0IHR5cGVkZWYgaXMgbm9uLXN0YW5kYXJkIEMgYW5kIGlzIHVzZWQgYnkgU1dJRyB0byBwcm92aWRlCiAgICAgICAgICAgYW4gYXNzb2NpYXRpb24gYmV0d2VlbiB0aGUgbmFtZSAiaW50dmVjIiBhbmQgdGhlIHRlbXBsYXRlIHR5cGUgCiAgICAgICAgICAgInZlY3RvcjxpbnQ+Ii4KCiAgICAgICAgICAgQ0FVVElPTjogIFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgYW5kIHRoZSBmaXJzdCB0aW1lIFNXSUcgaGFzCiAgICAgICAgICAgc3VwcG9ydGVkIEMrKyB0ZW1wbGF0ZXMuICAgRXJyb3IgcmVwb3J0aW5nIGlzIGVzc2VudGlhbCBub24tZXhpc3RlbnQuCiAgICAgICAgICAgSXQgd2lsbCBwcm9iYWJseSBicmVhayBpbiBjZXJ0YWluIGNhc2VzLgogICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgTkVXIEZFQVRVUkUgKioqKgoKOC8xNS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlIHRvIHdyYXBwaW5nIG9mIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5cy4gIEFycmF5cwogICAgICAgICAgIGFyZSBub3cgcHJvcGVybHkgbWFwcGVkIHRvIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZgogICAgICAgICAgIG9uZSBsZXNzIGRpbWVuc2lvbi4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGludCBbMTBdOyAgICAgICAgICAgICAgLS0+ICBpbnQgKgogICAgICAgICAgICAgICAgaW50IFsxMF1bMjBdOyAgICAgICAgICAtLT4gIGludCAoKilbMjBdOwogICAgICAgICAgICAgICAgaW50IFsxMF1bMjBdWzMwXTsgICAgICAtLT4gIGludCAoKilbMjBdWzMwXTsKCiAgICAgICAgICAgVGhpcyBjaGFuZ2UgbWF5IGJyZWFrIGNlcnRhaW4gU1dJRyBleHRlbnNpb25zIGJlY2F1c2UKICAgICAgICAgICBvbGRlciB2ZXJzaW9ucyBzaW1wbHkgbWFwcGVkIGFsbCBhcnJheXMgaW50byBhIHNpbmdsZQogICAgICAgICAgIHBvaW50ZXIgc3VjaCBhcyAiaW50ICoiLiAgIEFsdGhvdWdoIHBvc3NpYmx5IHVudXN1YWwsIAogICAgICAgICAgIHRoZSBuZXcgdmVyc2lvbiBpcyBjb3JyZWN0IGluIHRlcm1zIG9mIHRoZSBDIHR5cGUgc3lzdGVtLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgCjgvMDYvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgKiBbSmF2YV0gQXJyYXkgc2V0dGVycyBnZW5lcmF0ZWQgZm9yIHN0cnVjdC9jbGFzcyBhcnJheSBtZW1iZXJzLgoKOC8xMy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgTWFueSBpbXByb3ZlbWVudHMgdG8gVGNsL1BlcmwvUHl0aG9uIG1vZHVsZXMgdG8gYmV0dGVyCiAgICAgICAgICAgd29yayB3aXRoIG11bHRpcGxlIGludGVyZmFjZSBmaWxlcyBhbmQgdGhlICVpbXBvcnQgZGlyZWN0aXZlLgoKOC8xMy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgdXAgdGhlIGJlaGF2aW9yIG9mICVpbXBvcnQgaW4gdGhlIFB5dGhvbiBtb2R1bGUuCiAgICAgICAgICAgU1dJRyBubyBsb25nZXIgcG9sbHV0ZXMgdGhlIG1vZHVsZSBuYW1lc3BhY2UgYnkgdXNpbmcKICAgICAgICAgICAnZnJvbSBtb2R1bGUgaW1wb3J0IConIHRvIHJlZmVyIHRvIHRoZSBvdGhlciBtb2R1bGUuIAogICAgICAgICAgIEluc3RlYWQsIGl0IGRvZXMgYSBwcm9wZXIgJ2ltcG9ydCBtb2R1bGUnLiAgIEFsc28sIFNXSUcKICAgICAgICAgICBtYXkgd29yayBhIGxvdCBiZXR0ZXIgd2hlbiBpbXBvcnRpbmcgbW9kdWxlcyB0aGF0IGluY2x1ZGUKICAgICAgICAgICByZWZlcmVuY2VzIHRvIG90aGVyIGltcG9ydGVkIG1vZHVsZXMuCgo4LzEzLzIwMDE6IG1rb2VwcGUKCSAgIEFkZGVkIG5ldyB0eXBlbWFwIHN1YnN0aXR1dGlvbnMsIGdlbmVyYWxpemluZyB0aG9zZSBvZiB0aGUKCSAgIEd1aWxlLXNwZWNpZmljIDUvMjcvMjAwMSBjaGFuZ2VzOiAKCSAgICogJGRlc2NyaXB0b3IgaXMgdGhlIHNhbWUgYXMgU1dJR1RZUEUkbWFuZ2xlLCBidXQgYWxzbwoJICAgICBlbnN1cmVzIHRoYXQgdGhlIHR5cGUgZGVzY3JpcHRvciBvZiB0aGlzIG5hbWUgZ2V0cwoJICAgICBkZWZpbmVkLgoJICAgKiAkKnR5cGUsICQqbHR5cGUsICQqbWFuZ2xlLCAkKmRlc2NyaXB0b3IgYXJlIHRoZSBzYW1lIGFzCgkgICAgIHRoZSB2YXJpYW50cyB3aXRob3V0IHN0YXIsIGJ1dCB0aGV5IFJFTU9WRSBvbmUgbGV2ZWwgb2YKCSAgICAgcG9pbnRlcnMgZnJvbSB0aGUgdHlwZS4gKFRoaXMgaXMgb25seSB2YWxpZCBmb3IgcG9pbnRlciAKCSAgICAgdHlwZXMuKQoJICAgKiAkJnR5cGUsICQmbHR5cGUsICQmbWFuZ2xlLCAkJmRlc2NyaXB0b3IgYXJlIHRoZSBzYW1lIGFzCgkgICAgIHRoZSB2YXJpYW50cyB3aXRob3V0IGFtcGVyc2FuZCwgYnV0IHRoZXkgQUREIG9uZSBsZXZlbCBvZgoJICAgICBwb2ludGVycyB0byB0aGUgdHlwZS4KCSAgIFRoZSBHdWlsZS1zcGVjaWZpYyBzdWJzdGl0dXRpb24gJGJhc2VkZXNjcmlwdG9yIHdhcyByZW1vdmVkCgkgICBiZWNhdXNlIGl0IHdhcyB1c2VsZXNzLgoKOC8xMi8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgVGhlICVleHRlcm4gZGlyZWN0aXZlIGlzIG5vdyBkZXByZWNhdGVkIGFuZCB3aXRoZHJhd24uICBUaGUKICAgICAgICAgICBwdXJwb3NlIG9mIHRoaXMgZGlyZWN0aXZlIHdhcyB0byBpbXBvcnQgc2VsZWN0ZWQgZGVmaW5pdGlvbnMKICAgICAgICAgICBmcm9tIG90aGVyIGludGVyZmFjZSBmaWxlcyBhbmQgaGVhZGVycy4gIEhvd2V2ZXIsIHRoZSBzYW1lCiAgICAgICAgICAgZnVuY3Rpb25hbGl0eSBpcyBiZXR0ZXIgaGFuZGxlZCB0aHJvdWdoICVpbXBvcnQuICAgVGhpcwogICAgICAgICAgIGxlYXZlcyBTV0lHIHdpdGggdHdvIGZpbGUgaW5jbHVzaW9uIGRpcmVjdGl2ZXM6CgogICAgICAgICAgICAgICVpbmNsdWRlIGZpbGVuYW1lICAgICAtIEluc2VydHMgaW50byBjdXJyZW50IGludGVyZmFjZQogICAgICAgICAgICAgICVpbXBvcnQgZmlsZW5hbWUgICAgICAtIEltcG9ydCB0eXBlcyBhbmQgY2xhc3NlcyBmcm9tIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFub3RoZXIgbW9kdWxlCgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOC8wOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgbmV3IHN1cHBvcnQgZm9yIHdyYXBwaW5nIEMvQysrIGNhbGxiYWNrIGZ1bmN0aW9ucy4gCiAgICAgICAgICAgQSBjb21tb24gcHJvYmxlbSB3aXRoIHNvbWUgQyBsaWJyYXJpZXMgaXMgdGhhdCBtYW55CiAgICAgICAgICAgZnVuY3Rpb25zIHRha2UgYSBmdW5jdGlvbiBwb2ludGVyIGFzIGFuIGFyZ3VtZW50LiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgaW50IGRvX29wKC4uLiwgaW50ICgqb3ApKGludCxpbnQpLCAuLi4pOwoKICAgICAgICAgICBVbmZvcnR1bmF0ZWx5LCB0aGUgb25seSB3YXkgdG8gY2FsbCBzdWNoIGEgZnVuY3Rpb24gaXMgdG8KICAgICAgICAgICBwYXNzIGl0IGEgZnVuY3Rpb24gcG9pbnRlciBvZiBzb21lIGNvbXBhdGlibGUgdHlwZS4gIEluCiAgICAgICAgICAgcHJldmlvdXMgdmVyc2lvbnMgb2YgU1dJRywgeW91IGhhZCB0byBzb2x2ZSB0aGlzIHByb2JsZW0KICAgICAgICAgICB3aXRoIHNvbWUgcmVhbGx5IGdyb3NzIGhhY2tzLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50ZWQgdG8KICAgICAgICAgICB1c2UgdGhlIGZvbGxvd2luZyBmdW5jdGlvbiBhcyBhIGNhbGxiYWNrLAoKICAgICAgICAgICAgICAgaW50IGZvbyhpbnQsIGludCk7CgogICAgICAgICAgIHlvdSBoYWQgdG8gaW5zdGFsbCBhIHBvaW50ZXIgdG8gaXQgYXMgYSBjb25zdGFudC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJWNvbnN0YW50IGludCAoKkZPTykoaW50LGludCkgPSBmb287CgogICAgICAgICAgIG9yIAoKICAgICAgICAgICAgICAgY29uc3QgaW50ICgqRk9PKShpbnQsaW50KSA9IGZvbzsKCiAgICAgICAgICAgb3IgaWYgeW91IGhhZCBhIHJlYWxseSBvbGQgU1dJRyB2ZXJzaW9uOgoKICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgKCpPUF9GVU5DKShpbnQsaW50KTsKICAgICAgICAgICAgICAgaW50IGRvX29wKC4uLiwgT1BfRlVOQywgLi4uKTsKICAgICAgICAgICAgICAgY29uc3QgT1BfRlVOQyBGT08gPSBmb287CgogICAgICAgICAgIAogICAgICAgICAgIE5vdywgeW91IGNhbiBkbyBvbmUgb2YgdHdvIHRoaW5nczoKCiAgICAgICAgICAgICAgICVjb25zdGFudCBpbnQgZm9vKGludCxpbnQpOwoKICAgICAgICAgICBUaGlzIGNyZWF0ZXMgYSBjb25zdGFudCAnZm9vJyBvZiB0eXBlIGludCAoKikoaW50LGludCkuCiAgICAgICAgICAgQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBkbyB0aGlzOgoKICAgICAgICAgICAgICAgJWNhbGxiYWNrKCIlcyIpOwogICAgICAgICAgICAgICBpbnQgZm9vKGludCxpbnQpOwogICAgICAgICAgICAgICBpbnQgYmFyKGludCxpbnQpOwogICAgICAgICAgICAgICAlbm9jYWxsYmFjazsKCiAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgZnVuY3Rpb25zIGFyZSBpbnN0YWxsZWQgYXMgY29uc3RhbnRzIHdoZXJlCiAgICAgICAgICAgdGhlIG5hbWUgaXMgZGVmaW5lZCBieSB0aGUgZm9ybWF0IHN0cmluZyBnaXZlbiB0byAlY2FsbGJhY2soKS4KICAgICAgICAgICBJZiB0aGUgbmFtZXMgZ2VuZXJhdGVkIGJ5IHRoZSBmb3JtYXQgc3RyaW5nIGRpZmZlciBmcm9tIHRoZQogICAgICAgICAgIGFjdHVhbCBmdW5jdGlvbiBuYW1lLCBib3RoIGEgZnVuY3Rpb24gd3JhcHBlciBhbmQgYSBjYWxsYmFjayAKICAgICAgICAgICBjb25zdGFudCBhcmUgY3JlYXRlZC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJWNhbGxiYWNrKCIlKHVwcGVyKXMiKTsKICAgICAgICAgICAgICAgaW50IGZvbyhpbnQsaW50KTsKICAgICAgICAgICAgICAgaW50IGJhcihpbnQsaW50KTsKICAgICAgICAgICAgICAgJW5vY2FsbGJhY2s7CiAgICAgICAgICAgCiAgICAgICAgICAgQ3JlYXRlcyB0d28gd3JhcHBlciBmdW5jdGlvbnMgJ2ZvbycsICdiYXInIGFuZCBhZGRpdGlvbmFsbHkKICAgICAgICAgICBjcmVhdGVzIHR3byBjYWxsYmFjayBjb25zdGFudHMgJ0ZPTycsICdCQVInLgoKICAgICAgICAgICBOb3RlOiBTV0lHIHN0aWxsIGRvZXMgbm90IHByb3ZpZGUgYXV0b21hdGljIHN1cHBvcnQgZm9yIAogICAgICAgICAgIHdyaXRpbmcgY2FsbGJhY2sgZnVuY3Rpb25zIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8wNi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICAqIHN0cnVjdCBuZXN0aW5nIGZpeGVzIGFzIHBlciBTRiBidWcgIzQ0NzQ4OC4KCjgvMDMvMjAwMTogYmVhemxleQogICAgICAgICAgIFRoZSAlbmFtZSBkaXJlY3RpdmUgbm93IGFwcGxpZXMgdG8gY29uc3RhbnRzIGNyZWF0ZWQgd2l0aAogICAgICAgICAgICNkZWZpbmUgYW5kICVjb25zdGFudC4gIEhvd2V2ZXIsIG1vc3QgbGFuZ3VhZ2UgbW9kdWxlcwogICAgICAgICAgIHdlcmUgbmV2ZXIgd3JpdHRlbiB0byBzdXBwb3J0IHRoaXMgYW5kIHdpbGwgaGF2ZSB0byBiZQogICAgICAgICAgIG1vZGlmaWVkIHRvIG1ha2UgaXQgd29yay4gIFRjbCwgUHl0aG9uLCBhbmQgUGVybCBtb2R1bGVzCiAgICAgICAgICAgYXJlIHdvcmtpbmcgbm93LgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMDMvMjAwMTogYmVhemxleQogICAgICAgICAgIE1hc3NpdmUgY2hhbmdlcyBhbmQgc2ltcGxpZmljYXRpb24gb2YgQyBkZWNsYXJhdGlvbiBwYXJzaW5nLgogICAgICAgICAgIEFsdGhvdWdoIFNXSUcgaXMgc3RpbGwgbm90IGEgZnVsbCBDIHBhcnNlciwgaXRzIGFiaWxpdHkKICAgICAgICAgICB0byBoYW5kbGUgY29tcGxleCBkYXRhdHlwZXMgaW5jbHVkaW5nIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucwogICAgICAgICAgIGFuZCBwb2ludGVycyB0byBhcnJheXMgaGFzIGJlZW4gdmFzdGx5IGltcHJvdmVkLiAgCgo4LzAzLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgICogRGlzdHJpYnV0aW9uIGZpeGVzOiBhdXRvY29uZiBubyBsb25nZXIgbmVlZGVkIHRvIGluc3RhbGwgU1dJRy4KCjgvMDIvMjAwMTogYmVhemxleQogICAgICAgICAgIFJlbW92ZWQgdHdvIHVuZG9jdW1lbnRlZCBwYXJzaW5nIGZlYXR1cmVzLiAgU1dJRyBubyBsb25nZXIKICAgICAgICAgICBzdXBwb3J0cyBvdXQtb2YtY2xhc3Mgc3RhdGljIGZ1bmN0aW9uIG9yIHZhcmlhYmxlCiAgICAgICAgICAgZGVjbGFyYXRpb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgc3RhdGljIGludCBGb286OmJhcjsKCiAgICAgICAgICAgVGhpcyBmZWF0dXJlIG1heSByZXR1cm4gaWYgdGhlcmUgaXMgc3VmZmljaWVudCBkZW1hbmQuIAogICAgICAgICAgIEhvd2V2ZXIsIHNpbmNlIFNXSUcgaXMgbW9zdCBvZnRlbiB1c2VkIHdpdGggaGVhZGVyIGZpbGVzLAogICAgICAgICAgIGl0IGlzIG1vcmUgbGlrZWx5IGZvciB0aGVzZSBkZWZpbml0aW9ucyB0byBiZSBpbmNsdWRlZAogICAgICAgICAgIGluIHRoZSBjbGFzcyBkZWZpbml0aW9uLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOC8wMi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogQ2xlYW51cCBvZiB0aGUgR0lGUGxvdCBleGFtcGxlcy4gVXBncmFkZWQgSmF2YSBHSUZQbG90IGV4YW1wbGUuCgo4LzAxLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBbSmF2YV0gRWZmaWNpZW5jeSBjaGFuZ2VzOiBfY1B0ciB1c2VkIHdoZXJlIHBvc3NpYmxlIHJhdGhlciB0aGFuCgkgICAgIGdldENQdHIoKS4gQnVnIGZpeGVzIGZvciBpbmhlcml0YW5jZSAtIGRlcml2ZWQgY2xhc3Mgc29tZXRpbWVzCgkgICAgIGRpZG4ndCBkZWxldGUgdGhlIGMgbWVtb3J5IHdoZW4gX2RlbGV0ZSgpIHdhcyBjYWxsZWQuCgkgICAqIFtKYXZhXSBBYnN0cmFjdCBjKysgY2xhc3NlcyBhcmUgd3JhcHBlZCB3aXRoIGEgamF2YSBhYnN0cmFjdCBzaGFkb3cKCSAgICAgY2xhc3MuIEFsc28gYSBwdXJlIHZpcnR1YWwgZnVuY3Rpb24gaXMgbWFwcGVkIHdpdGggYW4gYWJzdHJhY3QgbWV0aG9kLgoJICAgKiBUaGUgZGVmYXVsdCBvdXRwdXQgZmlsZSBoYXMgYWx3YXlzIGJlZW4gPG1vZHVsZT5fd3JhcC5jLiBJdCBpcyBub3cKCSAgICAgPG1vZHVsZT5fd3JhcC5jeHggaWYgdGhlIC1jKysgY29tbWFuZGxpbmUgb3B0aW9uIGlzIHBhc3NlZCB0byBzd2lnLgoJICAgICBUaGlzIGhhcyBiZWVuIGRvbmUgYXMgb3RoZXJ3aXNlIGMrKyBjb2RlIHdvdWxkIGFwcGVhciBpbiBhIGMgZmlsZS4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiogCgo3LzMxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBNb2RpZmllZCB0aGUgJWNvbnN0YW50IGRpcmVjdGl2ZSB0byBiZSBtb3JlIEMtbGlrZSBpbiBzeW50YXguCiAgICAgICAgICAgVGhlIHN5bnRheCBpcyBub3c6CgogICAgICAgICAgICAgICAgJWNvbnN0YW50IE5BTUUgPSBWQUxVRTsKICAgICAgICAgICAgICAgICVjb25zdGFudCBUWVBFIE5BTUUgPSBWQUxVRTsKIAogICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVjb25zdGFudCBGb28gKkJhciA9ICZTcGFtOwoKICAgICAgICAgICBBIG1vcmUgc3VidGxlIGNhc2UgaXMgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICVjb25zdGFudCBpbnQgKCpGT08pKGludCxpbnQpID0gYmxhaDsKCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqICBNb2R1bGVzIHRoYXQgd2VyZSB1c2luZwogICAgICAgICAgIHRoZSAlY29uc3RhbnQgZGlyZWN0aXZlIGRpcmVjdGx5IHdpbGwgbmVlZCB0byBiZSBtb2RpZmllZC4KICAgICAgCjcvMzAvMjAwMTogYmVhemxleQogICAgICAgICAgIFJlbW92ZWQgb2JzY3VyZSBhbmQgdW5kb2N1bWVudGVkIGZvcm0gb2YgdGhlICVpbmxpbmUgZGlyZWN0aXZlOgoKICAgICAgICAgICAgICAgJWlubGluZSBpbnQgYmxhaChpbnQgYSwgaW50IGIpIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqIAogICAgICAgICAgIChub3RlOiB0aGlzIGZlYXR1cmUgd2FzIG5ldmVyIGRvY3VtZW50ZWQgYW5kIGlzIHdpdGhkcmF3bikKCjcvMzAvMjAwMTogYmVhemxleQogICAgICAgICAgIFJlbW92ZWQgc3VwcG9ydCBmb3IgZnVuY3Rpb25zIHdpdGggbm8gZXhwbGljaXRseSBkZWNsYXJlZAogICAgICAgICAgIHJldHVybiB0eXBlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICBmb28oaW50KTsKCiAgICAgICAgICAgSW4gQywgc3VjaCBmdW5jdGlvbnMgd2VyZSBpbXBsaWNpdGx5IGFzc3VtZWQgdG8gcmV0dXJuIGFuICdpbnQnLgogICAgICAgICAgIEluIEMrKywgdGhpcyBpcyBpbGxlZ2FsLiAgRWl0aGVyIHdheSwgaXQncyBjb25zaWRlcmVkIGJhZAogICAgICAgICAgIHN0eWxlLiAgUmVtb3Zpbmcgc3VwcG9ydCBmb3IgdGhpcyBpbiBTV0lHIHdpbGwgc2ltcGxpZnkKICAgICAgICAgICBjZXJ0YWluIGlzc3VlcyBpbiBwYXJzaW5nLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy8zMC8yMDAxOiBta29lcHBlCgkgICAqIFBhcnRpYWwgbWVyZ2UgZnJvbSB0aGUgQ1ZTIHRydW5rLiAgVGhlIFNvdXJjZS9ET0ggZGlyZWN0b3J5CgkgICAgIGFuZCBtb3N0IG9mIHRoZSBTb3VyY2UvU3dpZyBkaXJlY3RvcnkgaXMgdXAtdG8tZGF0ZSBub3cuCgkgICAqIFtHdWlsZV0gJXNjaGVtZSBpcyBub3cgYSBtYWNybyBmb3IgJWluc2VydCgic2NoZW1lIikuICAKCSAgICAgTmV3IHN5bnRheDogICVzY2hlbWUgIkZJTEVOQU1FIjsgCgkgICAgIE5ldyBzeW50YXg6ICAlc2NoZW1lICV7IFNDSEVNRS1DT0RFICV9CgkgICAgIE5ldyBtYWNyb3MgJW11bHRpcGxlX3ZhbHVlcywgJXZhbHVlc19hc19saXN0LAoJICAgICAldmFsdWVzX2FzX3ZlY3Rvci4gCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICAlcmVhZG9ubHkgYW5kICVyZWFkd3JpdGUgaGF2ZSBiZWVuIHR1cm5lZCBpbnRvIFNXSUcgcHJhZ21hcy4KICAgICAgICAgICAlcHJhZ21hKHN3aWcpIHJlYWRvbmx5IGFuZCAlcHJhZ21hKHN3aWcpIHJlYWR3cml0ZS4gIE1hY3JvcwogICAgICAgICAgIGFyZSB1c2VkIHRvIHByb3ZpZGUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBNaW5vciBjaGFuZ2VzIHRvICVwcmFnbWEgZGlyZWN0aXZlLiAgJXByYWdtYSBtdXN0IGFsd2F5cwogICAgICAgICAgIGJlIGRpcmVjdGVkIHRvIGEgc3BlY2lmaWMgbGFuZ3VhZ2UuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXByYWdtYShzd2lnKSBtYWtlX2RlZmF1bHQ7CiAgICAgICAgICAgICAgJXByYWdtYShwZXJsNSkgaW5jbHVkZSA9ICJibGFoLmkiOwoKICAgICAgICAgICBBbHNvIGV4dGVuZGVkIHRoZSBwcmFnbWEgZGlyZWN0aXZlIHRvIGFsbG93IGNvZGUgYmxvY2tzCiAKICAgICAgICAgICAgICAlcHJhZ21hKGZvbykgY29kZSA9ICV7CiAgICAgICAgICAgICAgICAgIC4uLiBzb21lIGNvZGUgLi4uCiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBDaGFuZ2UgdG8gdGhlIHdheSAnY29uc3QnIHZhcmlhYmxlcyBhcmUgd3JhcHBlZC4gIEluIAogICAgICAgICAgIHByZXZpb3VzIHZlcnNpb25zIG9mIFNXSUcsIGEgJ2NvbnN0JyB2YXJpYWJsZSB3YXMKICAgICAgICAgICB3cmFwcGVkIGFzIGEgY29uc3RhbnQuICAgTm93LCAnY29uc3QnIHZhcmlhYmxlcyBhcmUKICAgICAgICAgICB3cmFwcGVkIGFzIHJlYWQtb25seSB2YXJpYWJsZXMuICBUaGVyZSBhcmUgc2V2ZXJhbAogICAgICAgICAgIHJlYXNvbnMgZm9yIG1ha2luZyB0aGlzIGNoYW5nZSwgbW9zdGx5IHBlcnRhaW5pbmcgdG8KICAgICAgICAgICBzdWJ0bGUgZGV0YWlscyBvZiBob3cgJ2NvbnN0JyBhY3R1YWxseSB3b3Jrcy4gCgogICAgICAgICAgIFRoaXMgd2lsbCBwcm9iYWJseSBicmVhayBvbGQgaW50ZXJmYWNlcyB0aGF0IHVzZWQgJ2NvbnN0JwogICAgICAgICAgIHRvIGNyZWF0ZSBjb25zdGFudHMuICAgQXMgYSByZXBsYWNlbWVudCwgY29uc2lkZXIgdXNpbmcgdGhpczoKCiAgICAgICAgICAgY29uc3QgaW50IGEgPSA0OyAgID09PT4gICAlY29uc3RhbnQgaW50IGEgPSA0OwogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgUmVvcmdhbml6YXRpb24gYW5kIHNpbXBsaWZpY2F0aW9uIG9mIHR5cGUgcGFyc2luZy4KICAgICAgICAgICBUeXBlcyB3aXRoICdjb25zdCcgc2hvdWxkIHdvcmsgY29ycmVjdGx5IG5vdy4KCjcvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgIE1vc3Qgc3dpZyBkaXJlY3RpdmVzIHJlbGF0ZWQgdG8gdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtCiAgICAgICAgICAgYXJlIG5vdyBkZXByZWNhdGVkLgoKNy8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgUmVtb3ZlZCBzdXBwb3J0IGZvciBPYmplY3RpdmUtQyBpbiBvcmRlciB0byBzaW1wbGlmeQogICAgICAgICAgIHBhcnNlciByZWNvbnN0cnVjdGlvbi4gIFdpbGwgcmV0dXJuIGlmIHRoZXJlIGlzIHN1ZmZpY2llbnQKICAgICAgICAgICBkZW1hbmQuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBDb2RlIGluY2x1c2lvbiBoYXMgYmVlbiBtb2RpZmllZCBpbiB0aGUgcGFyc2VyLiAgQSBjb21tb24KICAgICAgICAgICBkaXJlY3RpdmUgJWluc2VydCBpcyBub3cgdXNlZCBmb3IgZXZlcnl0aGluZy4gIFRoaXMKICAgICAgICAgICBpbnNlcnRzIGEgZmlsZSBpbnRvIHRoZSBvdXRwdXQ6CgogICAgICAgICAgICAgICAlaW5zZXJ0KGhlYWRlcikgImZvby5zd2ciCgogICAgICAgICAgIFRoaXMgaW5zZXJ0cyBzb21lIGlubGluZSBjb2RlIGludG8gdGhlIG91dHB1dAoKICAgICAgICAgICAgICAgJWluc2VydChoZWFkZXIpICV7CiAgICAgICAgICAgICAgICAgICAuLi4gc29tZSBjb2RlIC4uLiAKICAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgVGhlcmUgYXJlIGZpdmUgcHJlZGVmaW5lZCB0YXJnZXRzIGZvciB0aGUgaW5zZXJ0IGRpcmVjdGl2ZToKCiAgICAgICAgICAgICAgICJoZWFkZXIiICAgIC0gSGVhZGVyIHNlY3Rpb24gb2Ygd3JhcHBlciBmaWxlCiAgICAgICAgICAgICAgICJydW50aW1lIiAgIC0gUnVudGltZSBzZWN0aW9uIG9mIHdyYXBwZXIgZmlsZQogICAgICAgICAgICAgICAid3JhcHBlciIgICAtIFdyYXBwZXIgc2VjdGlvbgogICAgICAgICAgICAgICAiaW5pdCIgICAgICAtIEluaXRpYWxpemF0aW9uIGZ1bmN0aW9uCiAgICAgICAgICAgICAgICJudWxsIiAgICAgIC0gTm90aGluZy4gRGlzY2FyZC4KCiAgICAgICAgICAgVGhlIGZvbGxvd2luZyBkaXJlY3RpdmVzIGFyZSBzdGlsbCBzdXBwb3J0ZWQsIGJ1dCBhcmUKICAgICAgICAgICBub3cgZGVmaW5lZCBpbiB0ZXJtcyBvZiBtYWNyb3M6CgogICAgICAgICAgICAgICAleyAuLi4gJX0gICAgICAgICAgIC0+ICVpbnNlcnQoaGVhZGVyKSAgJXsgLi4uICV9CiAgICAgICAgICAgICAgICVpbml0ICV7IC4uLiAlfSAgICAgLT4gJWluc2VydChpbml0KSAgICAleyAuLi4gJX0KICAgICAgICAgICAgICAgJXdyYXBwZXIgJXsgLi4uICV9ICAtPiAlaW5zZXJ0KHdyYXBwZXIpICV7IC4uLiAlfQogICAgICAgICAgICAgICAlcnVudGltZSAleyAuLi4gJX0gIC0+ICVpbnNlcnQocnVudGltZSkgJXsgLi4uICV9CgogICAgICAgICAgIExhbmd1YWdlIG1vZHVsZXMgY2FuIGRlZmluZSBuZXcgbmFtZWQgdGFyZ2V0cyBieSB1c2luZyB0aGUKICAgICAgICAgICBDIEFQSSBmdW5jdGlvbiBTd2lnX3JlZ2lzdGVyX2ZpbGVieW5hbWUoKSAoc2VlIG1haW4uY3h4KS4KICAgICAgICAgICBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnRlZCB0byBleHBvc2UgYSBzaGFkb3cgY2xhc3MgZmlsZSwKICAgICAgICAgICB5b3UgY291bGQgZG8gdGhpczoKCiAgICAgICAgICAgICAgU3dpZ19yZWdpc3Rlcl9maWxlYnluYW1lKCJzaGFkb3ciLCBmX3NoYWRvdyk7CgogICAgICAgICAgIFRoZW4gaW4gdGhlIGludGVyZmFjZSBmaWxlOgoKICAgICAgICAgICAgICAlaW5zZXJ0KHNoYWRvdykgJXsgLi4uICV9CgogICAgICAgICAgIE5vdGU6IHRoaXMgY2hhbmdlIHNob3VsZCBub3QgYWZmZWN0IGFueSBvbGQgaW50ZXJmYWNlcywgYnV0CiAgICAgICAgICAgZG9lcyBvcGVuIHVwIG5ldyBwb3NzaWJpbGl0aWVzIGZvciBlbmhhbmNlbWVudHMuCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTV0lHIG5vdyBhbHdheXMgaW5jbHVkZXMgYSBzdGFuZGFyZCBsaWJyYXJ5IGZpbGUgJ3N3aWcuc3dnJy4KICAgICAgICAgICBUaGlzIGZpbGUgZGVmaW5lcyBhIGxhcmdlIG51bWJlciBvZiBtYWNybyBkZWZpbml0aW9ucwogICAgICAgICAgIHRoYXQgZGVmaW5lIHRoZSBiZWhhdmlvciBvZiB2YXJpb3VzIFNXSUcgZGlyZWN0aXZlcy4KICAgICAgICAgICBQcmV2aW91c2x5LCBhbGwgU1dJRyBkaXJlY3RpdmVzIHdlcmUgaGFuZGxlZCBhcyBzcGVjaWFsCiAgICAgICAgICAgY2FzZXMgaW4gdGhlIHBhcnNlci4gIFRoaXMgbWFkZSB0aGUgcGFyc2VyIGEgbGFyZ2UgCiAgICAgICAgICAgYmxvYXRlZCBtZXNzLiAgTm93LCB0aGUgcGFyc2VyIGlzIHN0cmlwcGVkIGRvd24gdG8gYSBmZXcKICAgICAgICAgICBzaW1wbGUgZGlyZWN0aXZlcyBhbmQgbWFjcm9zIGFyZSB1c2VkIHRvIGhhbmRsZSBldmVyeXRoaW5nIGVsc2UuCgo3LzI2LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBGaXhlcyBmb3IgU291cmNlZm9yZ2UgYnVnICM0NDQ3NDggLSBuZXcgdGVzdGNhc2UgY3BwX3N0YXRpYzoKCSAgICAgW1RDTF0gQ2xhc3Mgd2l0aCBqdXN0IHN0YXRpYyBtZW1iZXIgdmFyaWFibGUvZnVuY3Rpb24gZml4CgkgICAgIFtKYXZhXSBGaXhlZCBzdGF0aWMgdmFyaWFibGVzIHN1cHBvcnQKCSAgICAgW1J1YnldIFN0YXRpYyB2YXJpYWJsZXMgd29ya2Fyb3VuZCByZW1vdmVkCgo3LzI3LzIwMDE6IG1rb2VwcGUKCSAgICogc3R5cGUuYyAoU3dpZ1R5cGVfZGVmYXVsdCk6IFN0cmlwIHF1YWxpZmllcnMgZmlyc3QuIFRoZQoJICAgICBkZWZhdWx0IHR5cGUgb2YgImludCAqIGNvbnN0IiBpcyBub3cgIlNXSUdQT0lOVEVSICoiLgoJICAgKiBtYWluLmN4eDogRGVmaW5lICJfX2NwbHVzcGx1cyIgaW4gU1dJRydzIHByZXByb2Nlc3NvciBpZgoJICAgICBpbiBDKysgbW9kZS4KCSAgICogW0d1aWxlXTogQWRkZWQgc29tZSBzdXBwb3J0IGZvciBhcnJheXMgYW5kIEMrKwoJICAgICByZWZlcmVuY2VzLCBmaXhpbmcgdGhlICJjb25zdGFudF9wb2ludGVycyIgdGVzdCBjYXNlLgoJICAgKiBNb3ZlZCBtb3N0IHRlc3RzIGZyb20gdGhlIG9sZCBHdWlsZS1zcGVjaWZpYyB0ZXN0LXN1aXRlCgkgICAgIHRvIHRoZSBuZXcgdGVzdC1zdWl0ZS4gIEFsc28gbW92ZWQgcGVybDUvcG9pbnRlci1jeHgKCSAgICAgZXhhbXBsZSB0aGVyZS4KCjcvMjYvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIFRlc3Qtc3VpdGUgYWRkZWQuCgkgICAqIEluaXRpYWwgdGVzdGNhc2VzOiBjb25zdGFudF9wb2ludGVycyBjcHBfZW51bSBkZWZpbmVzCgkgICAgIHNpemVvZl9wb2ludGVycyB1bmlvbnMgdmlydHVhbF9kZXN0cnVjdG9yCgkgICAqIE1ha2UgY2xlYW4gaW1wcm92ZW1lbnRzLgoKNy8yNC8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogW0phdmFdIFVuZGVyc2NvcmVzIGluIHRoZSBwYWNrYWdlIG5hbWUgYW5kL29yIG1vZHVsZSBuYW1lCgkgICBubyBsb25nZXIgZ2l2ZSBsaW5raW5nIHByb2JsZW1zLgoKNy8xNy8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogTW9yZSBwYXJzZXIgYnVnIGZpeGVzIGZvciBjb25zdGFudCBwb2ludGVycwoKNy8xOS8yMDAxOiBta29lcHBlCgkgICAqIFtHdWlsZV0gQWVzdGhldGljIGltcHJvdmVtZW50IGluIHZhcmlhYmxlIHdyYXBwZXJzLgoKNy8xOC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgKiBGaXhlZCBjb3JlLWR1bXAgcHJvYmxlbSBpbiBwb2ludGVyIGxpYnJhcnkgd2hlbiAKICAgICAgICAgICAgIGZyZWVpbmcgY2hhcmFjdGVyIGFycmF5cy4KICAgICAgICAgICAgIFNGIEJ1ZyBbICM0MTU4MzcgXSBwb2ludGVyIGxpYiBjb3JlIGR1bXAKCjcvMTgvMjAwMTogYmVhemxleQogICAgICAgICAgICogRml4ZWQgcHJvYmxlbSB3aXRoIGRlZmF1bHQgZGVzdHJ1Y3RvcnMgYW5kIHNoYWRvdwogICAgICAgICAgICAgY2xhc3Nlcy4gIFNGIGJ1ZyAjMjIxMTI4LgoKNy8xOC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgKiBUbyBwcm92aWRlIGJldHRlciBsaW5lLW51bWJlciB0cmFja2luZyBpbiBpbnRlcmZhY2VzCiAgICAgICAgICAgICB3aXRoIGxvdHMgb2YgbWFjcm9zLCBzcGVjaWFsIGxvY2F0b3IgY29tbWVudHMgYXJlCiAgICAgICAgICAgICBub3cgZ2VuZXJhdGVkIGJ5IHRoZSBTV0lHIHByZXByb2Nlc3Nvci4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAvKkBmb28uaSw0MixCTEFIQCovZXhwYW5kZWQgbWFjcm8vKkBAKi8KCiAgICAgICAgICAgICBUaGUgZmlyc3QgLypALi4uQCovIHNlcXVlbmNlIHNldHMgdGhlIGNvbnRleHQKICAgICAgICAgICAgIHRvIHBvaW50IHRvIHRoZSBtYWNybyBjb2RlLiAgVGhlIC8qQEAqLyBjb21tZW50CiAgICAgICAgICAgICB0ZXJtaW5hdGVzIHRoZSBjb250ZXh0LiAgVGhlIFNXSUcgcGFyc2VyIHNob3VsZAogICAgICAgICAgICAgaWdub3JlIGFsbCBvZiB0aGUgbG9jYXRvciBjb21tZW50cyBhcyBzaG91bGQKICAgICAgICAgICAgIHRoZSBDIGNvbXBpbGVyIChzaG91bGQgc3VjaCBjb21tZW50cyBlbmQgdXAKICAgICAgICAgICAgIGluIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUpLgoKNy8xOC8yMDAxOiBta29lcHBlCgkgICAqIFRoZSBwYXJzZXIgbm93IGhhbmRsZXMgc2V2ZXJlbHkgY29uc3RpZmllZCB0eXBlcyBpbgoJICAgdHlwZW1hcHMuICBUaGlzIGludHJvZHVjZWQgYSBuZXcgc2hpZnQvcmVkdWNlIGNvbmZsaWN0LCBidXQKCSAgIG9ubHkgd2l0aCBhIGhldXJpc3RpYyBmdW5jdGlvbi1wb2ludGVyIGNhdGNoLWFsbCBydWxlLiAgCgkgICAqIFtHdWlsZV06IEFkZGVkIHR5cGVtYXBzIGZvciBzZXZlcmVseSBjb25zdGlmaWVkIHR5cGVzLiAKCSAgICogRml4ZWQgdGhlICJ0ZW1wbGF0ZS13aGl0ZXNwYWNlIiBwcm9ibGVtIGJ5IGNhbm9uaWNhbGl6aW5nCgkgICAgIHdoaXRlc3BhY2UsIGVzcGVjaWFsbHkgYXJvdW5kIGFuZ2xlIGJyYWNrZXRzIGFuZCBjb21tYXMuIAoKNy8xNy8yMDAxOiBta29lcHBlCgkgICAqIFtHdWlsZV06IEEgU2NoZW1lIGZpbGUgaXMgZW1pdHRlZCBpZiB0aGUgLXNjbXN0dWIgRklMRS5TQ00KCSAgIGNvbW1hbmQtbGluZSBvcHRpb24gaXMgdXNlZC4gIFRoZSAlc2NoZW1lIGRpcmVjdGl2ZQoJICAgKGltcGxlbWVudGVkIGFzIGEgbWFjcm8gZm9yIGEgcHJhZ21hKSBhbGxvd3MgdG8gaW5zZXJ0CgkgICBhcmJpdHJhcnkgY29kZSBoZXJlLiAgSW4gInNpbXBsZSIgYW5kICJwYXNzaXZlIiBsaW5rYWdlLAoJICAgdGhlIGZpbGUgZ2V0cyBmaWxsZWQgd2l0aCBkZWZpbmUtbW9kdWxlIGFuZCBleHBvcnQKCSAgIGRlY2xhcmF0aW9ucy4KCjcvMTcvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIFBhcnNlciBidWcgZml4IHRvIHN1cHBvcnQgY29uc3RhbnQgcG9pbnRlcnMsIGVnIGludCogY29uc3QgcHRyLgoJICAgRml4ZWQgZXZlcnl3aGVyZSAtIHZhcmlhYmxlcywgcGFyYW1ldGVycywgcmV0dXJuIHR5cGVzIGV0Yy4gTm90ZSB0aGF0CgkgICB3aGVuIHdyYXBwaW5nIGEgY29uc3RhbnQgcG9pbnRlciB2YXJpYWJsZSBvbmx5IHRoZSBnZXR0ZXIgaXMgZ2VuZXJhdGVkLgoKNy8xNy8yMDAxOiBta29lcHBlCgkgICAqIEZpeGVkIFNGIGJ1ZyAjNDQxNDcwICgjZGVmaW5lIFggIi8vIiB3b3VsZCBub3QgYmUgcGFyc2VkLAoJICAgICBzZWUgdGVzdC1zdWl0ZSBlbnRyeSAicHJlcHJvYy0xIiksIHJlcG9ydGVkIGJ5IFQuIFcuIEJ1cnRvbgoJICAgICA8dHdidXJ0b25AdXNlcnMuc2YubmV0Pi4KCSAgICogQ2hhbmdlZCB0aGUgdHlwZSBvZiBjaGFyYWN0ZXIgY29uc3RhbnRzIHRvICJjaGFyIiwgcmF0aGVyCgkgICAgIHRoYW4gImNoYXIgKiIuICBDaGFuZ2VkIHRoZSBpbmRpdmlkdWFsIGxhbmd1YWdlIG1vZHVsZXMKCSAgICAgdG8ga2VlcCB0aGUgb2xkIGJlaGF2aW91ciwgZXhjZXB0IGZvciB0aGUgR3VpbGUgbW9kdWxlLAoJICAgICB3aGVyZSBpdCBpcyBkZXNpcmVkIHRvIG1ha2UgdGhlbSBTY2hlbWUgY2hhcmFjdGVycy4gIFRoaXMKCSAgICAgZml4ZXMgU0YgYnVnICMyMzE0MDksIHRlc3Qtc3VpdGUgZW50cnkgImNoYXItY29uc3RhbnQiLgoJICAgKiBBcHBsaWVkIHBhdGNoIGZvciBET0gvRG9oL21lbW9yeS5jIGJ5IExlcyBTY2hhZmZlcgoJICAgICA8c2NoYWZmZXJAb3B0b25saW5lLm5ldD4gKGF2b2lkIHJlcXVpcmVkIHNpZGUgZWZmZWN0cyBpbgoJICAgICBhc3NlcnQpLiAKCjcvMTcvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIEJ1ZyBmaXggaW4gcGFyc2VyIGZvciB2aXJ0dWFsIGRlc3RydWN0b3Igd2l0aCB2b2lkIGFzIHBhcmFtZXRlcgoJICAgKiBCdWcgZml4IGluIHBhcnNlciAjZGVmaW5lcyBlbWJlZGRlZCB3aXRoaW4gY2xhc3Nlcy9zdHJ1Y3RzL3VuaW9ucwoJICAgQ29uc2VxdWVudGx5ICVjb25zdGFudCBjYW4gbm93IGFsc28gYmUgcGxhY2VkIHdpdGhpbiBhIHN0cnVjdC9jbGFzcy91bmlvbi4KCSAgICogQnVnIGZpeCBpbiBwYXJzZXIgdG8gYWxsb3cgc2l6ZW9mKCpJX2FtX2FfcG9pbnRlcikgd2l0aGluIGEgI2RlZmluZQoKNy8xNi8yMDAxOiBta29lcHBlCgkgICAqIEFkZGVkIGNoYW5nZXMgZm9yIHRoZSBNYWNpbnRvc2ggY29udHJpYnV0ZWQgYnkgTHVpZ2kKCSAgIEJhbGxhYmlvIDxiYWxsYWJpb0BtYWMuY29tPi4gCgkgICAqIFNvbWUgImNvbnN0IiBmaXhlcyBpbiB0aGUgY29kZS4KCSAgICogW0d1aWxlXTogTWFkZSB0aGUgY29uc3RhbnQtd3JhcHBlciBmdW5jdGlvbnMgbXVjaCBzaG9ydGVyLgoKNy8xMy8yMDAxOiBta29lcHBlCgkgICAqIFtHdWlsZV06IFNvbWUgImNvbnN0IiBmaXhlcyBmb3IgR3VpbGUgdmVyc2lvbiAxLjMuNC4KCSAgICogSGFuZGxlIGFub255bW91cyBhcmd1bWVudHMgd2l0aCBkZWZhdWx0IHZhbHVlcyBhbmQgc3RhdGljCgkgICAgIGFycmF5IG1lbWJlcnMgb2YgY2xhc3Nlcy4gIEJvdGggYnVncyByZXBvcnRlZCBieSBBbm5hbGlzYSBUZXJyYWNpbmEKCSAgICAgPGFubmFsaXNhLnRlcnJhY2luYUBkYXRhbWF0Lml0Pjsgc2VlIHRoZSBmaWxlcwoJICAgICBFeGFtcGxlcy9ndWlsZS90ZXN0LXN1aXRlL3N0YXRpYy1hcnJheS1tZW1iZXIuaSBhbmQKCSAgICAgYW5vbnltb3VzLWFyZy5pLgoKVmVyc2lvbiAxLjMuNiAgKEp1bHkgOSwgMjAwMSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjcvMDkvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIEdJRlBsb3QgZXhhbXBsZXM6IEZPUkVHUk9VTkQgYW5kIEJBQ0tHUk9VTkQgZGVmaW5pdGlvbiBtaXNzaW5nIAoJICAgYWZ0ZXIgVFJBTlNQQVJFTlQgI2RlZmluZSBmaXggaW4gR0lGUGxvdAoKNy8wMy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgdXAgdGhlIHZlcnNpb24gbnVtYmVycyBzbyB0aGF0IHRoZSByZWxlYXNlIGlzIGtub3duCiAgICAgICAgICAgYXMgMS4zLjYuICBBbGwgZnV0dXJlIHJlbGVhc2VzIHNob3VsZCBoYXZlIGEgc2ltaWxhcgogICAgICAgICAgIHZlcnNpb24gZm9ybWF0LgoKNy8wMi8yMDAxOiBta29lcHBlCgkgICAqIFtQeXRob25dOiBQcmV2ZW50IHRoZSBwcm9ibGVtIG9mIHNlbGYudGhpc293biBub3QgYmVpbmcKCSAgIGRlZmluZWQgaWYgdGhlIEMrKyBjbGFzcyBjb25zdHJ1Y3RvciByYWlzZWQgYW4gZXhjZXB0aW9uLgoJICAgVGhhbmtzIHRvIEx1aWdpIEJhbGxhYmlvIDxiYWxsYWJpb0BtYWMuY29tPi4KCjYvMjkvMjAwMTogbWtvZXBwZQoJICAgKiBNb3JlIHBvcnRhYmlsaXR5IGZpeGVzOyBmaXhlZCAiZ2NjIC1XYWxsIiB3YXJuaW5ncy4KCjYvMjkvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIEdJRlBsb3QgZXhhbXBsZXM6IFRSQU5TUEFSRU5UICNkZWZpbmUgbXVsdGlwbGUgdGltZXMgb24gU29sYXJpcyAKCSAgIChjbGFzaGVzIHdpdGggc3RyZWFtLmgpLgoJICAgKiBNdWx0aXBsZSBkZWZpbml0aW9uIGJ1ZyBmaXggZm9yIHNoYWRvdyBjbGFzc2VzLiBUaGUgcGVybCBhbmQgcHl0aG9uIAoJICAgbW9kdWxlcyBoYWQgd29ya2Fyb3VuZHMgd2hpY2ggaGF2ZSBiZWVuIHJlcGxhY2VkIHdpdGggZml4ZXMgaW4gCgkgICB0aGUgY29yZS4gTWFueSBvZiB0aGUgTGFuZ3VhZ2U6OmNwcF94eHh4IGZ1bmN0aW9ucyBub3cgc2V0IGEgCgkgICBmbGFnIHdoaWNoIHRoZSBkZXJpdmVkIGNsYXNzZXMgY2FuIGFjY2VzcyB0aHJvdWdoIAoJICAgaXNfbXVsdGlwbGVfZGVmaW5pdGlvbigpIHRvIHNlZSB3aGV0aGVyIG9yIG5vdCBjb2RlIHNob3VsZCBiZSAKCSAgIGdlbmVyYXRlZC4gIFRoZSBjb2RlIGJlbG93IHdvdWxkIGhhdmUgcHJvZHVjZWQgdmFyeWluZyBkZWdyZWVzIAoJICAgb2YgaW5jb3JyZWN0IHNoYWRvdyBjbGFzcyBjb2RlIGZvciB0aGUgdmFyaW91cyBtb2R1bGVzOgoJICAgY2xhc3MgVGVzdENsYXNzCgkgICB7CgkgICBwdWJsaWM6CgkgICAgIFRlc3RDbGFzcygpIHt9CgkgICAgIFRlc3RDbGFzcyhpbnQgYSkge30KCSAgICAgflRlc3RDbGFzcygpIHt9CgkgICAgIHVuc2lnbmVkIGxvbmcgeHl6KHNob3J0IGspIHt9CgkgICAgIHVuc2lnbmVkIGxvbmcgeHl6KGludCBuKSB7fQoJICAgICBzdGF0aWMgdm9pZCBzdGF0aWNfZnVuYygpIHt9CgkgICAgIHN0YXRpYyB2b2lkIHN0YXRpY19mdW5jKGludCBhKSB7fQoJICAgfTsKCSAgIHZvaWQgZGVsZXRlX1Rlc3RDbGFzcyhpbnQgYSk7Cgo2LzI3LzIwMDE6IG1rb2VwcGUKCSAgICogW1BlcmxdIEFub3RoZXIgY29uc3QtcmVsYXRlZCBwb3J0YWJpbGl0eSBmaXguCgo2LzI2LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBbSmF2YV0gQWRkZWQgaW4gY3BwX3ByYWdtYSgpIHN1cHBvcnQgd2l0aCBhIGhvc3Qgb2YgbmV3IHByYWdtYXMgLSBzZWUgCgkgICBqc3dpZy5odG1sLiBUaGVzZSBhcmUgZGVzaWduZWQgZm9yIGJldHRlciBtaXhpbmcgb2YgSmF2YSBhbmQgYysrLiBJdCAKCSAgIGVuYWJsZXMgdGhlIHVzZXIgdG8gc3BlY2lmeSBwdXJlIEphdmEgY2xhc3NlcyBhcyBiYXNlcyBhbmQvb3IgaW50ZXJmYWNlcyAKCSAgIGZvciB0aGUgd3JhcHBlZCBjL2MrKy4KCSAgICogW0phdmFdIE9sZCBwcmFnbWFzIHJlbmFtZWQuIFdhcm5pbmcgZ2l2ZW4gZm9yIHRoZSBtb21lbnQgaWYgdXNlZC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjYvMjUvMjAwMTogbWtvZXBwZQoJICAgKiBJbmNvcnBvcmF0ZWQgbW9yZSBidWlsZCBjaGFuZ2VzIGNvbnRyaWJ1dGVkIGJ5IFd5c3MgQ2xlbWVucwoJICAgPFdZU0BoZWxibGluZy5jaD4gZm9yIHN3aWcvcnVieSBvbiBjeWd3aW4uCgo2LzIwLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBNYWtlZmlsZSBtb2RzIHNvIHRoYXQgJ21ha2UgY2hlY2snIHVzZXMgdGhlIHN3aWcgb3B0aW9ucyBpbiB0aGUgbWFrZWZpbGVzCgkgICAqIFtKYXZhXSBSZW1vdmVkIEdlbmVyYXRpbmcgd3JhcHBlcnMgbWVzc2FnZQoJICAgKiBbSmF2YV0gTlVMTCBwb2ludGVyIGJ1ZyBmaXgKCSAgICogW0phdmFdIEJ1ZyBmaXggZm9yIEthZmZlIEpWTQoKNi8yMC8yMDAxOiBta29lcHBlCgkgICAqIFNXSUdfVHlwZVF1ZXJ5IGZyb20gY29tbW9uLnN3ZyBub3cgcmV0dXJucyBhCgkgICBzd2lnX3R5cGVfaW5mbyogcmF0aGVyIHRoYW4gYSB2b2lkKi4gIFRoaXMgZml4ZXMgYSBwcm9ibGVtCgkgICB3aGVuIHVzaW5nIHBvaW50ZXIuaSBhbmQgQysrLCBhcyBpbGx1c3RyYXRlZCBieSB0aGUgbmV3CgkgICB0ZXN0LXN1aXRlIGV4YW1wbGUgcGVybDUvcG9pbnRlci1jeHguCgkgICAqIFBvcnRhYmlsaXR5IGZpeGVzIChjb25zdCBjaGFyICopLiAKCSAgICogSW5jb3Jwb3JhdGVkIGJ1aWxkIGNoYW5nZXMgY29udHJpYnV0ZWQgYnkgV3lzcyBDbGVtZW5zCgkgICA8V1lTQGhlbGJsaW5nLmNoPiwgd2hpY2ggbWFrZSBzd2lnIHJ1bm5hYmxlIG9uIGN5Z3dpbi4KCjYvMTkvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIFtKYXZhXSBCdWcgZml4IGZvciBTRiBidWcgIzIxMTE0NC4gVGhpcyBmaXggaXMgYSB3b3JrYXJvdW5kIAoJICAgICB1bnRpbCBmaXhlZCBpbiB0aGUgY29yZS4KCjYvMTkvMjAwMTogbWtvZXBwZQoJICAgKiBbR3VpbGVdOiBQb3J0YWJpbGl0eSBmaXhlcyBmb3IgdXNlIHdpdGggdGhlIFN1biBGb3J0ZQoJICAgY29tcGlsZXJzLiAKCSAgICogW1RjbF06IFBvcnRhYmlsaXR5IGZpeCAoY29uc3QgY2hhciAqKS4KCSAgICogW1RjbF06IENvbmZpZ3VyZSBub3cgZmlyc3QgdHJpZXMgdG8gZmluZCBhIHRjbENvbmZpZy5zaAoJICAgZmlsZSBpbiBvcmRlciB0byBmaW5kIHRoZSBUY2wgaW5jbHVkZSBkaXJlY3RvcnksIGxpYnJhcnkKCSAgIGxvY2F0aW9uIGFuZCBsaWJyYXJ5IG5hbWUuCgkgICAqIFtQeXRob25dOiBBZGRlZCBhIGZldyBwb3NzaWJsZSBsaWJyYXJ5IGxvY2F0aW9ucy4KCjYvMTgvMjAwMTogbWtvZXBwZQoJICAgKiBbR3VpbGVdOiBEb24ndCBjYWxsIHNjbV9jX2V4cG9ydCBpZiBub3RoaW5nIGlzIHRvIGJlCgkgICAgIGV4cG9ydGVkLiAgRG9uJ3Qgd2FybiBvbiAlbW9kdWxlIGlmIG1vZHVsZSBoYXMgYmVlbiBzZXQKCSAgICAgYWxyZWFkeSAodGhpcyBmcmVxdWVudGx5IG9jY3VycyB3aGVuICVpbXBvcnQgaXMgdXNlZCkuCgo2LzE2LzIwMDE6IG1rb2VwcGUKCSAgICogW0d1aWxlXTogTmV3ICJwYXNzaXZlIiBsaW5rYWdlLCB3aGljaCBpcyBhcHByb3ByaWF0ZSBmb3IKCSAgICAgbXVsdGktbW9kdWxlIGV4dGVuc2lvbnMgd2l0aG91dCBHdWlsZSBtb2R1bGUgbWFnaWMuCgo2LzE1LzIwMDE6IG1rb2VwcGUKCSAgICogW0d1aWxlXTogRml4ZWQgcHJpbnRpbmcgb2Ygc21vYnMgKHNwYWNlIGFuZCBhbmdsZSB3ZXJlCgkgICAgIG1pc3NpbmcpLiAKCSAgICogUHJvcGVybHkgZ2VuZXJhdGUgdHlwZSBpbmZvcm1hdGlvbiBmb3IgYmFzZSBjbGFzc2VzCgkgICAgIGltcG9ydGVkIHdpdGggdGhlICVpbXBvcnQgZGlyZWN0aXZlLiAgVGhhbmtzIHRvIE1hcmNlbG8KCSAgICAgTWF0dXMgPG1tYXR1c0BhY21zLmFyaXpvbmEuZWR1PiBmb3IgdGhlIHJlcG9ydCBhbmQgdGhlCgkgICAgIHBhdGNoOyB0aGlzIGNsb3NlcyBTRiBidWcgIzIzMTYxOTsgc2VlIGFsc28KCSAgICAgRXhhbXBsZXMvZ3VpbGUvdGVzdC1zdWl0ZS9pbXBvcnQqLiAKCSAgICogW0d1aWxlXTogRml4IGNhc3RpbmcgYmV0d2VlbiBjbGFzcyBhbmQgYmFzZSBjbGFzczsgdGhlCgkgICAgIHJ1bnRpbWUgdHlwZSBzeXN0ZW0gaGFkIGl0IHRoZSB3cm9uZyB3YXkgYXJvdW5kOyBzZWUKCSAgICAgRXhhbXBsZXMvZ3VpbGUvdGVzdC1zdWl0ZS9jYXN0cy5pCgkgICAqIE1ha2UgdHlwZW1hcHMgZm9yIFNXSUdQT0lOVEVSICogd2l0aCBhcmcgbmFtZSB0YWtlCgkgICAgIHByZWNlZGVuY2Ugb3ZlciB0aG9zZSB3aXRob3V0IGFyZyBuYW1lLCB0byBtYXRjaCBub3JtYWwKCSAgICAgdHlwZW1hcCBwcmVjZWRlbmNlIHJ1bGVzLgoJICAgKiBGaXhlZCB0aGUgcmFuZG9tLWxpbmUtbnVtYmVycyBwcm9ibGVtIHJlcG9ydGVkIGFzIFNGIGJ1ZwoJICAgICAjMjE3MzEwOyB0aGFua3MgdG8gTWljaGFlbCBTY2hhcmYgPHNjaGFyZkB1c2Vycy5zZi5uZXQ+LgoJICAgKiBbR3VpbGVdOiBIYW5kbGUgdGhlICVuYW1lIGFuZCAlcmVuYW1lIGRpcmVjdGl2ZXMuCgkgICAqIE5ldyBzeW50YXg6ICVuYW1lIGFuZCAlcmVuYW1lIG5vdyBvcHRpb25hbGx5IHRha2UgZG91YmxlCgkgICAgIHF1b3RlcyBhcm91bmQgdGhlIHNjcmlwdGluZyBuYW1lLiAgVGhpcyBpcyB0byBhbGxvdyBzY3JpcHRpbmcKCSAgICAgbmFtZXMgdGhhdCBhcmVuJ3QgdmFsaWQgQyBpZGVudGlmaWVycy4KCjYvMTQvMjAwMTogYmVhemxleQogICAgICAgICAgIE1hZGUgYSBtaW5vciBjaGFuZ2UgdG8gdGhlIHdheSBmaWxlcyBhcmUgbG9hZGVkIGluCiAgICAgICAgICAgb3JkZXIgdG8gZ2V0IGZpbGUvbGluZSBudW1iZXIgcmVwb3J0aW5nIGNvcnJlY3QgaW4KICAgICAgICAgICB0aGUgcHJlcHJvY2Vzc29yLgoKNi8xNC8yMDAxOiBta29lcHBlCgkgICAqIFRoZSBwYXJzZXIgbm93IHVuZGVyc3RhbmRzIHRoZSAobm9uLXN0YW5kYXJkKSAibG9uZyBsb25nIgoJICAgICB0eXBlcy4gSXQgaXMgdXAgdG8gdGhlIGluZGl2aWR1YWwgbGFuZ3VhZ2UgbW9kdWxlcyB0bwoJICAgICBwcm92aWRlIHR5cGVtYXBzIGlmIG5lZWRlZC4gUmVwb3J0ZWQgYnkgU2FtIFN0ZWluZ29sZCwgU0YKCSAgICAgYnVnICM0MjkxNzYuCgkgICAqIFRoZSBwYXJzZXIgbm93IHVuZGVyc3RhbmRzIGFyZ3VtZW50cyBsaWtlICJjb25zdCBpbnQgKgoJICAgICBjb25zdCBpIi4gVGhpcyBmaXhlcyBTRiBidWcgIzIxNTY0OS4KCSAgICogRml4ZWQgdGhlIEd1aWxlIHRlc3Qtc3VpdGUuCgo2LzEzLzIwMDE6IG1rb2VwcGUKCSAgIFBhcnRpYWwgbWVyZ2UgZnJvbSB0aGUgQ1ZTIHRydW5rIGF0IHRhZwoJICAgIm1rb2VwcGUtbWVyZ2UtMSIuIFRoaXMgY292ZXJzIHRoZSBmb2xsb3dpbmcgY2hhbmdlczoKCnwgMDEvMTYvMDE6IHR0bgp8CSAgIFdyb3RlIHRhYmxlIG9mIGNvbnRlbnRzIGZvciBEb2MvZW5naW5lZXJpbmcuaHRtbC4gIEFkZGVkIHNlY3Rpb24KfAkgICBvbiBDVlMgdGFnZ2luZyBjb252ZW50aW9ucy4gIEFkZGVkIGNvcHlyaWdodCB0byBvdGhlciBkb2NzLgp8IDkvMjUvMDAgOiBiZWF6bGV5CnwgCSAgIE1vZGlmaWVkIHRoZSBwcmVwcm9jZXNzb3Igc28gdGhhdCBtYWNybyBuYW1lcyBjYW4gc3RhcnQgd2l0aCBhICclJy4KfCAJICAgVGhpcyBtYXkgYWxsb3cgbmV3IFNXSUcgImRpcmVjdGl2ZXMiIHRvIGJlIGRlZmluZWQgYXMgbWFjcm9zIGluc3RlYWQKfCAJICAgb2YgaGF2aW5nIHRvIGJlIGhhcmQtY29kZWQgaW50byB0aGUgcGFyc2VyLiAgCnwKfCAqKiogQWxzbyBhIHlldC10by1iZS1kb2N1bWVudGVkIHF1b3RpbmcgbWVjaGFuaXNtIHdpdGggYmFja3F1b3Rlcwp8ICoqKiBoYXMgYmVlbiBpbXBsZW1lbnRlZD8KCjYvMTMvMjAwMTogbWtvZXBwZQoJICogV2hlbiBjb25maWd1cmUgZG9lcyBub3QgZmluZCBhIGxhbmd1YWdlLCBkb24ndCB1c2UgZGVmYXVsdAoJICAgcGF0aHMgbGlrZSAvdXNyL2xvY2FsL2luY2x1ZGU7IHRoaXMgb25seSBjYXVzZXMgYnVpbGQKCSAgIHByb2JsZW1zLgoJICogTmV3IGRpcmVjdG9yeTogRXhhbXBsZXMvR3VpbGUvdGVzdC1zdWl0ZSwgd2hlcmUgYSBmZXcKCSAgIGJ1Z3MgaW4gMS4zYTUgYXJlIGRlbW9uc3RyYXRlZC4gCgkgKiBIYW5kbGUgQysrIG1ldGhvZHMgdGhhdCBoYXZlIGJvdGggYSAiY29uc3QiIGFuZCBhICJ0aHJvdyIKCSAgIGRpcmVjdGl2ZSAoc2VlIEV4YW1wbGVzL0d1aWxlL3Rlc3Qtc3VpdGUvY3BsdXNwbHVzLXRocm93LmkpOyAKCSAgIHRoYW5rcyB0byBTY290dCBCLiBEcnVtbW9uZHMgZm9yIHRoZSByZXBvcnQgYW5kIHRoZSBmaXguIAoJICogSGFuZGxlIEMrKyBwb2ludGVyLXJlZmVyZW5jZSBhcmd1bWVudHMgKGxpa2UgImludCAqJiBhcmciKSAKCSAgIChzZWUgRXhhbXBsZXMvR3VpbGUvdGVzdC1zdWl0ZS9wb2ludGVyLXJlZmVyZW5jZS5pLAoJICAgcmVwb3J0ZWQgYXMgU0YgYnVnICM0MzIyMjQpLgoJICogW1J1YnldIEZpeGVkIHR5cG8gaW4gcnVieWRlYy5zd2c7IHRoYW5rcyB0byBMeWxlIEpvaG5zb24hCgkgKiBEb24ndCBzdG9wIHRlc3Rpbmcgd2hlbiBvbmUgdGVzdCBmYWlscy4KCSAqIFtHdWlsZSwgTXpTY2hlbWVdIERvbid0IHByaW50ICJHZW5lcmF0aW5nIHdyYXBwZXJzLi4uIi4KCjYvMTIvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBWRUNUT1JMRU5JTlBVVCBhbmQgTElTVExFTklOUFVUIG5vdyBoYXZlIHNlcGFyYXRlCgkgICBsaXN0IGxlbmd0aCB2YXJpYWJsZXMuIFRZUEVNQVBfUE9JTlRFUl9JTlBVVF9PVVRQVVQKCSAgIGF0dGFjaGVzIGFyZ3VtZW50IGRvY3VtZW50YXRpb24gaW52b2x2aW5nIFNDTV9UWVBFIHRvIHRoZQoJICAgc3RhbmRhcmQgcG9pbnRlciB0eXBlbWFwcy4gSU5PVVQgaXMgbm93IGFuIGFsaWFzIGZvciBCT1RILgoKNi8xMi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFNvbWUgSmF2YSBkb2N1bWVudGF0aW9uIGFkZGVkLgoJICAgW0phdmFdIEZpeGVkIGJ1Z3MgaW4gaW1wb3J0IHByYWdtYSBhbmQgc2hhZG93IHByYWdtYS4gCgo2LzEyLzIwMDE6IG1rb2VwcGUKCSAgIEZpeCBkZWNsYXJhdGlvbnMgb2YgU1dJR19kZWZpbmVfY2xhc3MKCSAgIChMaWIvcnVieS9ydWJ5ZGVjLnN3ZykgYW5kIFNXSUdfVHlwZVF1ZXJ5CgkgICAoTGliL2NvbW1vbi5zd2cpLiBUaGFua3MgdG8gTHlsZSBKb2huc29uCgkgICA8bGpvaG5zb25AcmVzZ2VuLmNvbT4gZm9yIHRoZSBwYXRjaGVzLgoKNi8xMS8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIFVzZSBsb25nIGluc3RlYWQgb2Ygc2NtX2JpdHNfdDsgdGhpcyBtYWtlcyB0aGUKCSAgIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUgY29tcGF0aWJsZSB3aXRoIEd1aWxlIDEuMy40CgkgICBhZ2Fpbi4gVGhhbmtzIHRvIE1hc2FraSBGdWt1c2hpbWEgZm9yIHBvaW50aW5nIHRoaXMgb3V0LgoKNi8xMS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFRoZSBnZW5lcmljIElOU1RBTEwgZmlsZSBmcm9tIGF1dG9jb25mIGFkZGVkLiBGZXcgY2hhbmdlcyB0byBSRUFETUUgZmlsZS4KCjYvMTEvMjAwMTogbWtvZXBwZQoJICAgRml4ZWQgdHlwbyBpbiBNYWtlZmlsZS5pbjsgdGhhbmtzIHRvIEdyZWcgVHJveGVsCgkgICA8Z2R0QGlyLmJibi5jb20+LiAKCjYvMDgvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICBtYWtlIGNoZWNrIHdvcmtzIGFnYWluLiBFeGFtcGxlcy9HSUZQbG90IGNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkKCSAgIHRvcCBsZXZlbCBhdXRvY29uZiBub3cuCgo2LzA4LzIwMDE6IG1rb2VwcGUKCSAgIEFub3RoZXIgYnVpbGQgY2hhbmdlOiBUaGUgbmV3IHNjcmlwdCBhdXRvZ2VuLnNoIHJ1bnMKCSAgIGF1dG9jb25mIGluIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3Rvcmllcy4gIFRoZSB0b3AtbGV2ZWwKCSAgIGNvbmZpZ3VyZSBhbHNvIGNvbmZpZ3VyZXMgaW4gRXhhbXBsZXMvR0lGUGxvdC4KCjYvMDcvMjAwMTogbWtvZXBwZQoJICAgTWFkZSB0aGUgTWFrZWZpbGUgd29yayB3aXRoIG5vbi1HTlUgbWFrZSBhZ2Fpbi4KCjYvMDcvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICBbSmF2YV0gQ2xhc3Mvc3RydWN0IG1lbWJlcnMgdGhhdCBhcmUgYXJyYXlzIG9mIHBvaW50ZXJzIHRvIGNsYXNzZXMvc3RydWN0cyAtCgkgICBTaGFkb3cgY2xhc3MncyBnZXQvc2V0IGFjY2Vzc29ycyBub3cgdXNlIEphdmEgY2xhc3NlcyBpbnN0ZWFkIG9mIGxvbmdzIChwb2ludGVycykuCgkgICBbSmF2YV0gU2hhZG93IGNsYXNzZXMgd2lsbCBub3cgY2xlYW4gdXAgbWVtb3J5IGlmIGZ1bmN0aW9uIHJldHVybiB0eXBlIAoJICAgaXMgYSBjbGFzcy9zdHJ1Y3QuCgkgICBbSmF2YV0gTmV3IGV4YW1wbGUgY2FsbGVkIHJlZmVyZW5jZSBiYXNlZCBvbiB0aGUgc2FtZSBleGFtcGxlIGZyb20gb3RoZXIgbW9kdWxlcy4KCjYvMDYvMjAwMTogbWtvZXBwZQoJICAgTmV3IGNvbmZpZ3VyZSBvcHRpb24gLS13aXRoLXJlbGVhc2Utc3VmZml4IGFsbG93cyBmb3IKCSAgIGF0dGFjaGluZyBhIHN1ZmZpeCB0byB0aGUgc3dpZyBiaW5hcnkgYW5kIHRoZSBzd2lnIHJ1bnRpbWUKCSAgIGxpYnJhcmllcy4gIE1pbm9yIGNoYW5nZXMgdG8gdGhlIGJ1aWxkIHN5c3RlbS4gICJzd2lnCgkgICAtc3dpZ2xpYiIgd29ya3MgYWdhaW4uICBJZiBpbnZva2VkIHdpdGggdGhlIG5ldyBvcHRpb24KCSAgICItbGRmbGFncyIsIFNXSUcgcHJpbnRzIGEgbGluZSBvZiBsaW5rZXIgZmxhZ3MgbmVlZGVkIHRvCgkgICBsaW5rIHdpdGggdGhlIHJ1bnRpbWUgbGlicmFyeSBvZiB0aGUgc2VsZWN0ZWQgbGFuZ3VhZ2UKCSAgIG1vZHVsZS4gCgo2LzA2LzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gZ3N3aWdfbGlzdF9wIGlzIGFuIGludCwgbm90IGEgU0NNLiAgVGhpcyB0eXBvCgkgICBjYXVzZWQgd2FybmluZ3Mgd2hlbiBjb21waWxpbmcgd2l0aCBhIEd1aWxlIGNvbmZpZ3VyZWQgd2l0aAoJICAgc3RyaWN0IEMgdHlwZSBjaGVja2luZy4gSW4gSU5QVVQgYW5kIEJPVEggdHlwZW1hcHMKCSAgIGdlbmVyYXRlZCBieSB0aGUgU0lNUExFX01BUCBtYWNybywgdXNlIHRoZSBTQ01fVE9fQwoJICAgZnVuY3Rpb24gdG8gY29udmVydCBmcm9tIEd1aWxlIHRvIEMgKHJhdGhlciB0aGFuIENfVE9fU0NNKS4KCSAgIFVzZSBzY21faW50cHJpbnQgdG8gcHJpbnQgcG9pbnRlcnMgKHJhdGhlciB0aGFuCgkgICBzcHJpbnRmKS4gQWxsb3cgdXNpbmcgIi1saW5rYWdlIiBpbnN0ZWFkIG9mICItTGlua2FnZSIuIAoKNi8wNS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFtKYXZhXSBNb2RzIGZvciB1c2luZyBpbmhlcml0ZWQgYysrIGNsYXNzZXMgZnJvbSBKYXZhCgkgICBbSmF2YV0gTmV3IGV4YW1wbGUgY2FsbGVkIGNsYXNzIGJhc2VkIG9uIHRoZSBzYW1lIGV4YW1wbGUgZnJvbSBvdGhlciBtb2R1bGVzCgo2LzA1LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgW0phdmFdIGRlc3RydWN0b3IgKF9kZWxldGUoKSkgd2FzIG5vdCBhd2FyZSBvZiAlbmFtZSByZW5hbWluZwoJICAgW0phdmFdIGV4dGVuZHMgYmFzZWNsYXNzIGRpZCBub3Qga25vdyBhYm91dCAlbmFtZSByZW5hbWluZwoJICAgW0phdmFdIGV4dGVuZHMgYmFzZWNsYXNzIGRpZCBleHRlbmQgZXZlbiB3aGVuIHRoZSBiYXNlY2xhc3Mgd2FzIG5vdCBrbm93biB0byBzd2lnCgkgICBbSmF2YV0gc29tZXRpbWVzIGVudW0tZGVjbGFyYXRpb25zIG9jY3VycmVkIGJlZm9yZSB0aGUgSmF2YSBjbGFzcyBkZWNsYXJhdGlvbgoJICAgW0phdmFdIHVucmVsYXRlZCBlbnVtIGluaXRpYWxpc2F0aW9ucyBubyBsb25nZXIgYXBwZWFyIGluIEphdmEgY2xhc3MKCSAgIFtKYXZhXSBpZiBtb2R1bGUgZW5kcyBpbiAnXycgY29ycmVjdCBKTkkgbmFtZXMgYXJlIG5vdyBwcm9kdWNlZAoKNi8wNC8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFtKYXZhXSBTaGFkb3cgY2xhc3MgbW9kcyAtIE1vZGlmaWVkIGNvbnN0cnVjdG9yIHJlcGxhY2VzCgkgICBuZXdJbnN0YW5jZSgpLiBfZGVsZXRlKCkgbm93IHRocmVhZCBzYWZlLiBnZXRDUHRyKCkgcmVwbGFjZXMKCSAgIF9zZWxmLiBfc2VsZkNsYXNzKCkgcmVtb3ZlZCBhcyBub3cgcmVkdW5kYW50LiAKICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCgkgICBbSmF2YV0gTm90IGFsbCBvdXRwdXQgamF2YSBmaWxlcyBoYWQgU1dJRyBiYW5uZXIuIE5ldyBiYW5uZXIuCgoJICAgW0phdmFdIFNoYWRvdyBjbGFzcyBmaW5hbGl6ZXJzIGFyZSBvdXRwdXQgYnkgZGVmYXVsdDogQ29tbWFuZAoJICAgbGluZSBvcHRpb24gLWZpbmFsaXplIGRlcHJlY2F0ZWQgYW5kIHJlcGxhY2VkIHdpdGggLW5vZmluYWxpemUuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgo2LyAxLzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gQ2FzdCBTQ01fQ0FSKCkgdG8gc2NtX2JpdHNfdCBiZWZvcmUgc2hpZnRpbmcgaXQuCgkgICBUaGlzIGlzIHJlcXVpcmVkIGZvciBjb21waWxpbmcgd2l0aCBhIEd1aWxlIGNvbmZpZ3VyZWQgd2l0aAoJICAgc3RyaWN0IEMgdHlwZSBjaGVja2luZy4gIAoKNi8gMS8yMDAxOiBta29lcHBlCgkgICBBZGRlZCBjb25maWd1cmUgb3B0aW9uICItLXdpdGgtc3dpZ2xpYmRpciIuCgo1LzMxLzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gU3VwcG9ydCBtdWx0aXBsZSBwYXJhbGxlbCBsaXN0cyBvciB2ZWN0b3JzIGluCgkgICB0aGUgdHlwZW1hcHMgcHJvdmlkZWQgYnkgbGlzdC12ZWN0b3IuaS4gIE5ldyB0eXBlbWFwcyBmaWxlLAoJICAgcG9pbnRlci1pbi1vdXQuaS4gCgo1LzI1LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgW0phdmFdIEhUTUwgdXBkYXRlIGZvciBleGFtcGxlcy4KCjUvMjgvMjAwMTogbWtvZXBwZQoJICAgTWlub3IgY2hhbmdlcyB0byB0aGUgYnVpbGQgc3lzdGVtLiAgQWRkZWQgc3ViZGlyZWN0b3J5IGZvcgoJICAgRGViaWFuIHBhY2thZ2UgY29udHJvbCBmaWxlcy4KCjUvMjgvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBCdWlsZCBhIHJ1bnRpbWUgbGlicmFyeSwgbGlic3dpZ2d1aWxlLgoKNS8yOC8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIE5ldyB0eXBlbWFwIHN1YnN0aXR1dGlvbiAkKmRlc2NyaXB0b3IuICBVc2UgdGhlIHt9CgkgICBzeW50YXgsIHJhdGhlciB0aGFuIHRoZSAiIiBzeW50YXggZm9yIHRoZSBzdGFuZGFyZAoJICAgdHlwZW1hcHMsIGluIG9yZGVyIHRvIHdvcmsgYXJvdW5kIHN0cmFuZ2UgbWFjcm8tZXhwYW5zaW9uCgkgICBiZWhhdmlvciBvZiB0aGUgU1dJRyBwcmVwcm9jZXNzb3IuICBUaGlzIGludHJvZHVjZXMgc29tZQoJICAgZXh0cmEgYnJhY2VzLgoKNS8yNy8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIEhhbmRsZSBwb2ludGVyIHR5cGVzIHdpdGggdHlwZW1hcHMsIHJhdGhlciB0aGFuCgkgICBoYXJkLWNvZGVkLiBOZXcgdHlwZW1hcCBzdWJzdGl0dXRpb25zICRkZXNjcmlwdG9yLAoJICAgJGJhc2VkZXNjcmlwdG9yOyBzZWUgZG9jdW1lbnRhdGlvbi4gU29tZSBjbGVhbi11cCBpbiB0aGUKCSAgIHZhcmlhYmxlL2NvbnN0YW50cyB3cmFwcGVyIGdlbmVyYXRvciBjb2RlLiAgTmV3IGNvbnZlbmllbmNlCgkgICBtYWNybyBTV0lHX0d1aWxlX011c3RHZXRQdHIsIHdoaWNoIGFsbG93cyBnZXR0aW5nIHBvaW50ZXJzCgkgICBmcm9tIHNtb2JzIGluIGEgZnVuY3Rpb25hbCBzdHlsZS4gIE5ldyB0eXBlbWFwIGZpbGUKCSAgICJsaXN0LXZlY3Rvci5pIiwgcHJvdmlkaW5nIG1hY3JvcyB0aGF0IGRlZmluZSB0eXBlbWFwcyBmb3IKCSAgIGNvbnZlcnRpbmcgYmV0d2VlbiBDIGFycmF5cyBhbmQgU2NoZW1lIGxpc3RzIGFuZCB2ZWN0b3JzLgoKNS8yNS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFtKYXZhXSBTVEwgc3RyaW5nIG1vdmVkIGludG8gaXRzIG93biB0eXBlbWFwIGFzIGl0IGlzIGMrKyBjb2RlIGFuZCAKCSAgIGl0IGJyZWFrIGFueSBjIGNvZGUgdXNpbmcgdGhlIHR5cGVtYXBzLmkgZmlsZS4KCSAgIC0gRml4ZXMgZm9yIHdyYXBwZXJzIGFyb3VuZCBnbG9iYWwgdmFyaWFibGVzIC0gYXBwbGllcyB0byBwcmltaXRpdmUgCgkgICB0eXBlcyBhbmQgdXNlciB0eXBlcyAoY2xhc3Mvc3RydWN0KSBhbmQgcG9pbnRlcnMgdG8gdGhlc2UuCgkgICAtIFN0cnVjdHVyZSBtZW1iZXIgdmFyaWFibGVzIGFuZCBjbGFzcyBwdWJsaWMgbWVtYmVyIHZhcmlhYmxlcyBnZXR0ZXJzIAoJICAgYW5kIHNldHRlcnMgcGFzcyBhIHBvaW50ZXIgdG8gdGhlIG1lbWJlciBhcyB3YXMgaW4gMS4zYTMgYW5kIDEuMSAKCSAgICgxLjNhNSB3YXMgcGFzc2luZyBieSB2YWx1ZSkKCSAgIC0gUGFyYW1ldGVycyB0aGF0IHdlcmUgYXJyYXlzIGFuZCByZXR1cm4gdHlwZXMgd2VyZSBpbmNvcnJlY3RseSAKCSAgIGJlaW5nIHBhc3NlZCB0byBjcmVhdGVfZnVuY3Rpb24oKSBhcyBwb2ludGVycy4KCSAgIC0gRml4IGZvciBhcnJheXMgb2YgZW51bXMuIAoJICAgW0phdmFdIFVwZGF0ZWQgamF2YSBleGFtcGxlcyBhbmQgYWRkZWQgdHdvIG1vcmUuCgkgICBbSmF2YV0gSmF2YSBtb2R1bGUgdXBkYXRlZCBmcm9tIFNXSUcxLjNhMyBpbmNsdWRpbmcgY29kZSBjbGVhbnVwIGV0Yy4KCSAgIFtKYXZhXSBlbnVtIHN1cHBvcnQgYWRkZWQuCgkgICBbSmF2YV0gQXJyYXkgc3VwcG9ydCBpbXBsZW1lbnRlZAoJICAgW0phdmFdIFNoYWRvdyBjbGFzc2VzIGltcHJvdmVkIC0gSmF2YSBvYmplY3RzIHVzZWQgcmF0aGVyIHRoYW4gCgkgICBsb25ncyBob2xkaW5nIHRoZSBjIHBvaW50ZXIgdG8gdGhlIHdyYXBwZWQgc3RydWN0dXJlL2MrK2NsYXNzCgo1LzIyLzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gRml4ZWQgZXh0ZXJuICJDIiBkZWNsYXJhdGlvbnMgaW4gQysrIG1vZGUuIFRoYW5rcwoJICAgdG8gR3JlZyBUcm94ZWwgPGdkdEBpci5iYm4uY29tPi4KCjUvMjEvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBOZXcgbGlua2FnZSAibW9kdWxlIiBmb3IgY3JlYXRpbmcgR3VpbGUgbW9kdWxlcyBmb3IKCSAgIEd1aWxlIHZlcnNpb25zID49IDEuNS4wLiAKCjQvMTgvMjAwMTogbWtvZXBwZQoJICAgW016U2NoZW1lXSBBZGRlZCB0eXBlbWFwcyBmb3IgcGFzc2luZyB0aHJvdWdoIFNjaGVtZV9PYmplY3QKCSAgIHBvaW50ZXJzLiAKCjQvOS8yMDAxIDogbWtvZXBwZSAKCSAgIFtNelNjaGVtZV0gQWRkZWQgdHlwZW1hcHMgZm9yIGBib29sJy4gIEluY2x1c2lvbiBvZiBoZWFkZXJzCgkgICBhbmQgc3VwcG9ydCByb3V0aW5lcyBpcyBub3cgZGF0YS1kcml2ZW4gdmlhIG16c2NoZW1lLmkuCgkgICBIZWFkZXJzIGNvbWUgZnJvbSB0aGUgbmV3IGZpbGUgbXpzY2hlbWRlYy5zd2cuICBEb24ndCBhYm9ydAoJICAgaW1tZWRpYXRlbHkgd2hlbiBhIHR5cGUtaGFuZGxpbmcgZXJyb3IgaXMgcmVwb3J0ZWQuICBXaGVuCgkgICBzZWFyY2hpbmcgZm9yIHR5cGVtYXBzIGZvciBlbnVtcywgZmFsbCBiYWNrIHRvIHVzaW5nIGludCwKCSAgIGxpa2UgdGhlIEd1aWxlIGJhY2tlbmQgZG9lcy4gIFN1cHBvcnQgY2hhciBjb25zdGFudHMuICBFbWl0CgkgICBjb3JyZWN0IHdyYXBwZXIgY29kZSBmb3IgdmFyaWFibGVzLgoKMy8xMi8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIEZpeGVkIHR5cGVtYXBzIGZvciBjaGFyICoqT1VUUFVULCBjaGFyICoqQk9USC4KCjMvMi8yMDAxIDogbWtvZXBwZSAKCSAgIFtHdWlsZV0gRXZlcnkgd3JhcHBlciBmdW5jdGlvbiBub3cgZ2V0cyBhIGJvb2xlYW4gdmFyaWFibGUKCSAgIGdzd2lnX2xpc3RfcCB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciBtdWx0aXBsZSB2YWx1ZXMgYXJlCgkgICBwcmVzZW50LiBUaGUgbWFjcm9zIEdVSUxFX0FQUEVORF9SRVNVTFQsIEdVSUxFX01BWUJFX1ZBTFVFUwoJICAgYW5kIEdVSUxFX01BWUJFX1ZFQ1RPUiB1c2UgdGhpcyB2YXJpYWJsZSwgcmF0aGVyIHRoYW4KCSAgIGNoZWNraW5nIHdoZXRoZXIgdGhlIGN1cnJlbnQgcmV0dXJuIHZhbHVlIGlzIGEgbGlzdC4gVGhpcwoJICAgYWxsb3dzIGZvciB0eXBlbWFwcyByZXR1cm5pbmcgYSBsaXN0IGFzIGEgc2luZ2xlIHZhbHVlIChhCgkgICBsaXN0IHdhcyBlcnJvbmVvdXNseSBjb252ZXJ0ZWQgaW50byBhIHZlY3RvciBvciBhCgkgICBtdWx0aXBsZS12YWx1ZSBvYmplY3QgaW4gdGhpcyBjYXNlKS4KCjMvMS8yMDAxIDogbWtvZXBwZQoJICAgW0d1aWxlXSBBZGRlZCBzdXBwb3J0IGZvciByZXR1cm5pbmcgbXVsdGlwbGUgdmFsdWVzIGFzCgkgICB2ZWN0b3JzLCBvciBwYXNzaW5nIHRoZW0gdG8gYSBtdWxpcGxlLXZhbHVlCgkgICBjb250aW51YXRpb24uIEJ5IGRlZmF1bHQsIG11bHRpcGxlIHZhbHVlcyBzdGlsbCBnZXQKCSAgIHJldHVybmVkIGFzIGEgbGlzdC4KCjMvMS8yMDAxIDogbWtvZXBwZQoJICAgW0d1aWxlXSBBZGRlZCBhICJiZWZvcmVyZXR1cm4iIHByYWdtYS4gVGhlIHZhbHVlIG9mIHRoaXMKCSAgIHByYWdtYSBpcyBpbnNlcnRlZCBqdXN0IGJlZm9yZSBldmVyeSByZXR1cm4gc3RhdGVtZW50LgoKMy8xLzIwMDEgOiBta29lcHBlCgkgICBbR3VpbGVdIEFkZGVkIHN1cHBvcnQgZm9yIEd1aWxlIDEuNC4xIHByb2NlZHVyZQoJICAgZG9jdW1lbnRhdGlvbiBmb3JtYXRzLCBzZWUgaW50ZXJuYWxzLmh0bWwuCgoyLzI2LzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gTWFkZSB0aGUgd3JhcHBlciBjb2RlIGNvbXBpbGUgd2l0aCBDKysgaWYgdGhlCgkgICAiLWMrKyIgY29tbWFuZC1saW5lIHN3aXRjaCBpcyBnaXZlbi4gIFRoYW5rcyB0bwoJICAgPG1vbmtleWlxQGRpbmdvYmx1ZS5uZXQuYXU+LiAKCjIvMjYvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBOb3cgdHdvIHR5cGUgdGFibGVzLCBzd2lnX3R5cGVzIGFuZAoJICAgc3dpZ190eXBlc19pbml0aWFsLCBhcmUgdXNlZCwgYXMgYWxsIG90aGVyIFNXSUcgbGFuZ3VhZ2UKCSAgIG1vZHVsZXMgZG8uICBUaGlzIHJlbW92ZXMgdGhlIG5lZWQgZm9yIHRoZSB0cmlja3kKCSAgIGNvbnN0cnVjdGlvbiB1c2VkIGJlZm9yZSB0aGF0IHRoZSBicm9rZW4gUmVkaGF0IDcuMCBnY2MKCSAgIGRvZXNuJ3QgcGFyc2UuIFJlcG9ydGVkIGJ5IDxtb25rZXlpcUBkaW5nb2JsdWUubmV0LmF1Pi4gCgoyLzI2LzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gRml4ZWQgdHlwZW1hcHMgZm9yIGNoYXIgKk9VVFBVVCwgY2hhciAqQk9USDsgYSBiYWQKCSAgIGZyZWUoKSB3b3VsZCBiZSBlbWl0dGVkLiAgQWRkZWQgdHlwZW1hcCBmb3IgU0NNLgoKClZlcnNpb24gMS4zIEFscGhhIDUgCj09PT09PT09PT09PT09PT09PT0KCjkvMTkvMDAgOiBiZWF6bGV5CiAgICAgICAgICBbUHl0aG9uXSBQeXRob24gbW9kdWxlIGdlbmVyYXRlcyBtb3JlIGVmZmljaWVudCBjb2RlIGZvcgogICAgICAgICAgY3JlYXRpbmcgdGhlIHJldHVybiB2YWx1ZSBvZiBhIHdyYXBwZXIgZnVuY3Rpb24uIE1vZGlmaWNhdGlvbgogICAgICAgICAgc3VnZ2VzdGVkIGJ5IEpvbiBUcmF2aXMuCgo5LzE5LzAwIDogYmVhemxleQogICAgICAgICAgTGlicmFyeSBmaWxlcyBzcGVjaWZpZWQgd2l0aCB0aGUgLWwgb3B0aW9uIGFyZSBub3cgaW5jbHVkZWQgYXQgdGhlCiAgICAgICAgICBlbmQgb2YgdGhlIGludGVyZmFjZSBmaWxlIChyZXZlcnRpbmcgdG8gdGhlIG9sZCBiZWhhdmlvcikuCgo5LzE5LzAwIDogYmVhemxleQogICAgICAgICAgRml4ZWQgc29tZSBwcm9ibGVtcyB3aXRoIGVudW0gaGFuZGxpbmcuICBlbnVtcyBhcmUgbm93IG1hbmlwdWxhdGVkIGFzCiAgICAgICAgICAnaW50JywgYnV0IGNhc3QgaW50byB0aGUgZW51bSB0eXBlIHdoZW4gdmFsdWVzIGFyZSBwYXNzZWQgdG8gdGhlIAogICAgICAgICAgY29ycmVzcG9uZGluZyBDIGZ1bmN0aW9uLgoKOS8xOS8wMCA6IG1rb2VwcGUKCSAgW0d1aWxlXSBSZW1vdmVkICItd2l0aC1zbW9icyIgY29tbWFuZC1saW5lIG9wdGlvbiwgYXMgdGhpcyBpcyB0aGUKCSAgZGVmYXVsdCBub3cuICBBZGRlZCAiLWVtaXQtc2V0dGVycyIgY29tbWFuZC1saW5lIG9wdGlvbiwKCSAgd2hpY2ggdHVybnMgb24gZ2VuZXJhdGluZyBwcm9jZWR1cmVzLXdpdGgtc2V0dGVyczsgc2VlCgkgIGludGVybmFscy5odG1sLgoKOS8xOC8wMCA6IG1rb2VwcGUKCSAgSW5jb3Jwb3JhdGVkIHBhdGNoICMxMDE0MzAsIGZpeGluZyBidWdzIGluIHRoZSBHdWlsZSBtb2R1bGU6IAoJICAxLiBTb21lIGFyZ3VtZW50cyB3ZXJlIGVycm9uZW91c2x5IHRha2VuIGFzICpvcHRpb25hbCogYXJndW1lbnRzIHdoZW4KCSAgICAgaWdub3JlZCBhcmd1bWVudHMgd2VyZSBwcmVzZW50LiAKCSAgMi4gR3VpbGUgMS4zLjQgd2FzIG5vdCBzdXBwb3J0ZWQgc2luY2UgZnVuY3Rpb25zIGludHJvZHVjZWQgaW4gR3VpbGUKCSAgICAgIDEuNCB3ZXJlIHVzZWQuCSAgCgkgIDMuIEFkZGVkIGhhbmRsaW5nIG9mIGBjb25zdCBjaGFyIConLgoKOS8xNy8wMCA6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBmYWlsZWQgYXNzZXJ0aW9uIGFuZCBsYXJnZSBmaWxlcy4KCjkvMTcvMDAgOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggdGhlICclJyBjaGFyYWN0ZXIgYXBwZWFyaW5nIGluIGFkZGVkIG1ldGhvZHMKICAgICAgICAgIGFuZCBmdW5jdGlvbiBib2RpZXMuICBQcmVwcm9jZXNzb3IgYnVnLgoKVmVyc2lvbiAxLjMgQWxwaGEgNCAoU2VwdGVtYmVyIDQsIDIwMDApCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKOS8zLzAwICA6IHR0bgogICAgICAgICAgQWRkZWQgaW5zdHJ1Y3Rpb25zIGZvciBtYWludGFpbmVycyBpbiBFeGFtcGxlcy9SRUFETUUgb24gaG93CiAgICAgICAgICB0byBtYWtlIGV4YW1wbGVzIGFsc28gYmUgdXNlZnVsIGluIHRoZSB0ZXN0aW5nIGZyYW1ld29yay4KICAgICAgICAgIEFsc28sICJtYWtlIGNoZWNrIiBub3cgdXNlcyAuL0xpYiBieSB2aWEgZW52IHZhciBgU1dJR19MSUInLgogICAgICAgICAgVGhpcyBpcyBvdmVycmlkYWJsZSBsaWtlIHNvOgogICAgICAgICAgICAgbWFrZSBjaGstc3dpZ2xpYj0vbXkvZXhwZXJpbWVudGFsL3N3aWcvTGliIGNoZWNrCgo5LzMvMDAgIDogYmVhemxleQogICAgICAgICAgQWRkZWQgJHR5cGVtYXAgdmFyaWFibGUgdG8gdHlwZW1hcHMuICBUaGlzIGdldHMgcmVwbGFjZWQgd2l0aAogICAgICAgICAgYSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgdHlwZW1hcCB0aGF0IGlzIGFwcGxpZWQuICBGZWF0dXJlCiAgICAgICAgICByZXF1ZXN0IGZyb20gcnNhbHouCgo5LzMvMDAgIDogYmVhemxleQogICAgICAgICAgRXhwZXJpbWVudGFsIG9wdGltaXphdGlvbiB0byBjb2RlIGdlbmVyYXRpb24gZm9yIHZpcnR1YWwKICAgICAgICAgIG1lbWJlciBmdW5jdGlvbnMuICBJZiB5b3UgaGF2ZSB0d28gY2xhc3NlcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgIGNsYXNzIEEoKSB7CiAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZm9vKCk7CiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICBjbGFzcyBCKCkgOiBwdWJsaWMgQSB7CiAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZm9vKCk7CiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFN3aWcgbm93IHdpbGwgZ2VuZXJhdGUgYSBzaW5nbGUgd3JhcHBlciBmdW5jdGlvbiBmb3IgdGhpcwoKICAgICAgICAgICAgICAgIEFfZm9vKEEgKmEpIHsKICAgICAgICAgICAgICAgICAgICBhLT5mb28oKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBhbmQgdXNlIGl0IGFzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBib3RoIEFfZm9vKCkgYW5kIEJfZm9vKCkuCiAgICAgICAgICBUaGlzIG9wdGltaXphdGlvbiBvbmx5IHRha2VzIHBsYWNlIGlmIGJvdGggbWV0aG9kcyBhcmUgZGVjbGFyZWQKICAgICAgICAgIGFzIHZpcnR1YWwgYW5kIGJvdGggdGFrZSBpZGVudGljYWwgcGFyYW1ldGVycy4KICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgRkVBVFVSRSAqKioKCjkvMy8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBSZXN0b3JlZCB0aGUgIm1lbWJlcmluIiB0eXBlbWFwIGZvciBzZXR0aW5nIHN0cnVjdHVyZSBtZW1iZXJzLgogICAgICAgICAgVW5saWtlIHRoZSBvbGQgdmVyc2lvbiwgdGhlIG5ldyB2ZXJzaW9uIGlzIGV4cGFuZGVkIGlubGluZSBpbiB0aGUKICAgICAgICAgIHdyYXBwZXIgZnVuY3Rpb24gYWxsb3dpbmcgYWNjZXNzIHRvIHNjcmlwdGluZyBsYW5ndWFnZQogICAgICAgICAgaW50ZXJuYWxzIChhIHNvbWV0aW1lcyByZXF1ZXN0ZWQgZmVhdHVyZSkuIFRoZSAibWVtYmVyb3V0IiB0eXBlbWFwCiAgICAgICAgICBpcyBnb25lLiBVc2UgdGhlICJvdXQiIHR5cGVtYXBzIGluc3RlYWQuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjkvMy8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBBdHRyaWJ1dGUgc2V0IG1ldGhvZHMgbm8gbG9uZ2VyIHJldHVybiB0aGUgdmFsdWUgb2YgYSBtZW1iZXIuCiAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICAgIGludCB4OwogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgbm93IGdldHMgc2V0IGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgIHZvaWQgRm9vX3hfc2V0KEZvbyAqZiwgaW50IHgpIHsKICAgICAgICAgICAgICAgICAgICBmLT54ID0geDsKICAgICAgICAgICAgICB9CgogICAgICAgICAgSW4gU1dJRzEuMSBpdCB1c2VkIHRvIGJlIHRoaXM6CgogICAgICAgICAgICAgIGludCBGb29feF9zZXQoRm9vICpmLCBpbnQgeCkgewogICAgICAgICAgICAgICAgICAgcmV0dXJuIChmLT54ID0geCk7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgIFRoaXMgaGFzIGJlZW4gY2hhbmdlZCBkdWUgdG8gdGhlIGNvbXBsZXhpdHkgY3JlYXRlZCBieSB0cnlpbmcKICAgICAgICAgIHRvIGRvIHRoaXMgd2l0aCBtb3JlIGV4b3RpYyBkYXRhdHlwZXMgc3VjaCBhcyBhcnJheXMuICBJdCBhbHNvCiAgICAgICAgICBjb21wbGljYXRlcyBpbmxpbmluZyBhbmQgaGFuZGxpbmcgb2YgdGhlICJtZW1iZXJpbiIgdHlwZW1hcC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOS8yLzAwICA6IGJlYXpsZXkKICAgICAgICAgIFJlbW92ZWQgdGhlIHB0cmNhc3QoKSBhbmQgcHRybWFwKCkgZnVuY3Rpb25zIGZyb20gdGhlCiAgICAgICAgICBwb2ludGVyLmkgbGlicmFyeSBmaWxlLiAgT2xkIGltcGxlbWVudGF0aW9uIGlzIGluY29tcGF0aWJsZQogICAgICAgICAgd2l0aCBuZXcgdHlwZSBzeXN0ZW0uCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjkvMi8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBOZXcgcnVudGltZSBmdW5jdGlvbiBTV0lHX1R5cGVRdWVyeShjb25zdCBjaGFyICpuYW1lKSBhZGRlZC4KICAgICAgICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZXh0cmFjdCB0aGUgdHlwZSBpbmZvIHN0cnVjdHVyZQogICAgICAgICAgdGhhdCBpcyB1c2VkIGZvciB0eXBlLWNoZWNraW5nLiAgSXQgd29ya3Mgd2l0aCBlaXRoZXIgdGhlCiAgICAgICAgICBuaWNlIEMgbmFtZSBvciBtYW5nbGVkIHZlcnNpb24gb2YgYSBkYXRhdHlwZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBzd2lnX3R5cGVfaW5mbyAqdHkgPSBTd2lnX1R5cGVRdWVyeSgiaW50ICoiKTsKICAgICAgICAgICAgICBzd2lnX3R5cGVfaW5mbyAqdHkgPSBTd2lnX1R5cGVRdWVyeSgiX3BfaW50Iik7CgogICAgICAgICAgVGhpcyBpcyBhbiBhZHZhbmNlZCBmZWF0dXJlIHRoYXQgaGFzIGJlZW4gYWRkZWQgdG8gc3VwcG9ydCBzb21lCiAgICAgICAgICBleG90aWMgZXh0ZW5zaW9uIG1vZHVsZXMgdGhhdCBuZWVkIHRvIGRpcmVjdGx5IG1hbmlwdWxhdGUKICAgICAgICAgIHNjcmlwdGluZyBsYW5ndWFnZSBvYmplY3RzLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOS8yLzAwICA6IGJlYXpsZXkKICAgICAgICAgIE5ldyBkaXJlY3RpdmUgJXR5cGVzKCkgYWRkZWQuICBUaGlzIGlzIHVzZWQgdG8KICAgICAgICAgIGV4cGxpY2l0bHkgbGlzdCBkYXRhdHlwZXMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4KICAgICAgICAgIHRoZSBydW50aW1lIHR5cGUtY2hlY2tpbmcgY29kZS4gTm9ybWFsbHkgaXQgaXMgbmV2ZXIKICAgICAgICAgIG5lY2Vzc2FyeSB0byB1c2UgdGhpcyBidXQgc29tZXRpbWVzIGFkdmFuY2VkIGV4dGVuc2lvbnMKICAgICAgICAgIChzdWNoIGFzIHRoZSBwb2ludGVyLmkgbGlicmFyeSkgbWF5IG5lZWQgdG8gbWFudWFsbHkKICAgICAgICAgIGFkZCB0eXBlcyB0byB0aGUgdHlwZS1jaGVja2VyLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8zMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIEltcHJvdmVkIGhhbmRsaW5nIG9mIHN0cmluZyBhcnJheSB2YXJpYWJsZXMuIEZvciBleGFtcGxlLAogICAgICAgICAgYSBnbG9iYWwgdmFyaWFibGUgb2YgdGhlIGZvcm0gImNoYXIgbmFtZVs2NF0iIGlzIGF1dG9tYXRpY2FsbHkKICAgICAgICAgIG1hbmFnZWQgYXMgYSA2NCBjaGFyYWN0ZXIgc3RyaW5nLiAgUHJldmlvdXNseSB0aGlzIGRpZG4ndAogICAgICAgICAgd29yayBhdCBhbGwgb3IgcmVxdWlyZWQgdGhlIHVzZSBvZiBhIHNwZWNpYWwgdHlwZW1hcC4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAoVGNsLCBQZXJsLCBQeXRob24pICoqKgoKOC8zMS8wMCA6IHR0bgoJICBBZGRlZCBNYWtlZmlsZSB0YXJnZXQgYGNoZWNrLWMrKy1leGFtcGxlcycsIHdoaWNoIHVzZXMgbmV3CgkgIGZpbGVzIHVuZGVyIEV4YW1wbGVzL0MrKyBjb250cmlidXRlZCBieSBUYWwgU2hhbGlmLiAgTm93ICJtYWtlCgkgIGNoZWNrIiBhbHNvIGRvZXMgIm1ha2UgY2hlY2stYysrLWV4YW1wbGVzIi4gIEFsc28sIGV4cGFuZGVkCgkgIGFjdGlvbnMgaW4gYGNoZWNrLWdpZnBsb3QtZXhhbXBsZScgYW5kIGBjaGVjay1hbGl2ZW5lc3MnLgoKOC8zMC8wMCA6IG1rb2VwcGUKCSAgTWFqb3IgY2xlYW4tdXAgaW4gdGhlIEd1aWxlIG1vZHVsZS4gQWRkZWQgdHlwZW1hcC1kcml2ZW4KCSAgZG9jdW1lbnRhdGlvbiBzeXN0ZW0uIENoYW5nZWQgdG8gaGFuZGxlIG1vcmUgdGhhbiAxMAoJICBhcmdzLiBVcGRhdGVkIGFuZCBleHRlbmRlZCBleGFtcGxlcy4KCSAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8yOS8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIG5ldyAlaW5zZXJ0IGRpcmVjdGl2ZSB0aGF0IGluc2VydHMgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZQogICAgICAgICAgaW50byBhIHBvcnRpb24gb2YgdGhlIG91dHB1dCB3cmFwcGVyIGZpbGUuICBUaGlzIGlzIG9ubHkgaW50ZW5kZWQKICAgICAgICAgIGZvciB1c2UgYnkgd3JpdGVycyBvZiBsYW5ndWFnZSBtb2R1bGVzLiAgV29ya3MgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICVpbnNlcnQoaGVhZGVycykgICJmaWxlLnN3ZyI7CiAgICAgICAgICAgICAgICVpbnNlcnQocnVudGltZSkgICJmaWxlLnN3ZyI7CiAgICAgICAgICAgICAgICVpbnNlcnQod3JhcHBlcnMpICJmaWxlLnN3ZyI7CiAgICAgICAgICAgICAgICVpbnNlcnQoaW5pdCkgICAgICJmaWxlLnN3ZyI7CgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8yOS8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIG5ldyAlcnVudGltZSBkaXJlY3RpdmUgd2hpY2ggaW5jbHVkZXMgY29kZSBpbnRvIHRoZSBydW50aW1lCiAgICAgICAgICBwb3J0aW9uIG9mIHRoZSB3cmFwcGVyIGNvZGUuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlcnVudGltZSAlewogICAgICAgICAgICAgICAgICAgIC4uLiBzb21lIGludGVybmFsIHJ1bnRpbWUgY29kZSAuLi4KICAgICAgICAgICAgICAlfQoKICAgICAgICAgIFRoZXJlIGlzIG5vIHByYWN0aWNhbCByZWFzb24gZm9yIG9yZGluYXJ5IHVzZXJzIHRvIHVzZSB0aGlzCiAgICAgICAgICBmZWF0dXJlIChhbG1vc3QgZXZlcnl0aGluZyBjYW4gYmUgZG9uZSB1c2luZyAleyAuLi4gJX0KICAgICAgICAgIGluc3RlYWQpLiAgIEhvd2V2ZXIsIHdyaXRlcnMgb2YgbGFuZ3VhZ2UgbW9kdWxlcyBtYXkgd2FudCB0bwogICAgICAgICAgdXNlIHRoaXMgaW4gbGFuZ3VhZ2UgY29uZmlndXJhdGlvbiBmaWxlcy4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMjgvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUeXBlbWFwcyBjYW4gbm93IGJlIHNwZWNpZmllZCB1c2luZyBzdHJpbmcgbGl0ZXJhbHMgbGlrZQogICAgICAgICAgdGhpczoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludCAiJHRhcmdldCA9IFN2SVYoJHNvdXJjZSk7IgoKICAgICAgICAgIFdoZW4gY29kZSBpcyBzcGVjaWZpZWQgbGlrZSB0aGlzLCBpdCBpcyAqTk9UKiBlbmNsb3NlZAogICAgICAgICAgaW5zaWRlIGEgbG9jYWwgc2NvcGUgKGFzIHdpdGggb2xkZXIgdHlwZW1hcCBkZWNsYXJhdGlvbnMpLgogICAgICAgICAgTm90ZTogY2hhcmFjdGVyIGVzY2FwZSBzZXF1ZW5jZXMgYXJlIGludGVycHJldGVkIGluIHRoZQogICAgICAgICAgY29kZSBzdHJpbmcgc28gaWYgeW91IHdhbnQgdG8gaW5jbHVkZSBhIHF1b3RlIG9yIHNvbWUKICAgICAgICAgIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVyLCBtYWtlIHN1cmUgeW91IHVzZSBhIChcKS4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMjcvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUeXBlbWFwcyBoYXZlIGJlZW4gbW9kaWZpZWQgdG8gZm9sbG93IHR5cGVkZWYgZGVjbGFyYXRpb25zLgogICAgICAgICAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHRoaXM6CgogICAgICAgICAgICAgIHR5cGVkZWYgaW50IE51bWJlcjsKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludCB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4gZ2V0IGFuIGludGVnZXIgLi4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICB2b2lkIGZvbyhOdW1iZXIgYSk7CgogICAgICAgICAgVGhlIHR5cGVtYXAgZm9yICdpbnQnIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgYXJndW1lbnQgJ051bWJlciBhJy4KICAgICAgICAgIE9mIGNvdXJzZSwgaWYgeW91IHNwZWNpZnkgYSB0eXBlbWFwIGZvciAnTnVtYmVyJyBpdCB3aWxsIHRha2UKICAgICAgICAgIHByZWNlZGVuY2UgKG5vciB3aWxsIGl0IGV2ZXIgYmUgYXBwbGllZCB0byBhbiAnaW50JykuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjgvMjcvMDAgOiBiZWF6bGV5CiAgICAgICAgICBEZWZhdWx0IHR5cGVtYXAgc3BlY2lmaWNhdGlvbiBoYXMgY2hhbmdlZC4gICBJbiBvbGRlcgogICAgICAgICAgdmVyc2lvbnMgb2Ygc3dpZywgeW91IGNvdWxkIGRvIHRoaXM6CgogICAgICAgICAgICAgICAldHlwZW1hcChpbikgaW50IFNXSUdfREVGQVVMVF9UWVBFIHsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgVG8gc3BlY2lmeSB0aGUgZGVmYXVsdCBoYW5kbGluZyBvZiBhIGRhdGF0eXBlLiAgIE5vdyB0aGF0CiAgICAgICAgICBTV0lHIGZvbGxvd3MgdHlwZWRlZiBkZWNsYXJhdGlvbnMsIHRoaXMgaXMgdW5uZWNlc3NhcnkuCiAgICAgICAgICBTaW1wbHkgc3BlY2lmeWluZyBhIHR5cGVtYXAgZm9yICdpbnQnIHdpbGwgd29yayBmb3IgYWxsCiAgICAgICAgICB2YXJpYXRpb25zIG9mIGludGVnZXJzIHRoYXQgYXJlIHR5cGVkZWYnZCB0byAnaW50Jy4KCiAgICAgICAgICBDYXZlYXQsIHNwZWNpZnlpbmcgdGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIHBvaW50ZXJzLAogICAgICAgICAgcmVmZXJlbmNlcywgYXJyYXlzLCBhbmQgdXNlciBkZWZpbmVkIHR5cGVzIGlzIGEgbGl0dGxlCiAgICAgICAgICBkaWZmZXJlbnQuICBUaGlzIG11c3QgYmUgZG9uZSBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHUE9JTlRFUiAqIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiBhIHBvaW50ZXIgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHUkVGRVJFTkNFICYgewogICAgICAgICAgICAgICAgICAgICAgLi4uIGEgcmVmZXJlbmNlIC4uLgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgU1dJR0FSUkFZIFtdIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiBhbiBhcnJheSAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdUWVBFIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiBhIHVzZXItZGVmaW5lZCB0eXBlIChieSB2YWx1ZSkgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOC8xNS8wMCA6IGR1c3RpbgogICAgICAgICAgVGhlIGZpbGUgc3dpZy0xLjNhMS0xLnNwZWMgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIFRvb2xzIGRpcmVjdG9yeS4KICAgICAgICAgIEl0IGNhbiBiZSB1c2VkIHRvIGJ1aWxkIGEgcmVkaGF0IHBhY2thZ2UgZm9yIFNXSUcsIGFsdGhvdWdoIGl0CiAgICAgICAgICB3aWxsIG5lZWQgdG8gYmUgdXBkYXRlZCBmb3IgdGhlIG5leHQgcHVibGljIHJlbGVhc2UuCgo4LzE1LzAwIDogYmVhemxleQogICAgICAgICAgVHlwZW1hcHMgaGF2ZSBiZWVuIGNvbXBsZXRlbHkgcmV3cml0dGVuLiAgRXZlbnR1YWxseSB0aGV5IG1heSBiZQogICAgICAgICAgcmVwbGFjZWQgd2l0aCBzb21ldGhpbmcgYmV0dGVyLCBidXQgZm9yIG5vdyB0aGV5IHN0YXkuICBIb3dldmVyLAogICAgICAgICAgdGhlcmUgYXJlIGEgbnVtYmVyIG9mIGEgc2lnbmlmaWNhbnQgY2hhbmdlcyB0aGF0IG1heSB0cmlwIHNvbWUKICAgICAgICAgIHBlb3BsZSB1cDoKCiAgICAgICAgICAxLiAgVHlwZW1hcCBzY29waW5nIGlzIGN1cnJlbnRseSBicm9rZW4uICBCZWNhdXNlIG9mIHRoaXMsIHRoZQogICAgICAgICAgICAgIGZvbGxvd2luZyBjb2RlIHdvbid0IHdvcmsuCgogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBibGFoICogewogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIGludCBiYXIoYmxhaCAqeCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBibGFoICo7ICAgLyogQ2xlYXIgdHlwZW1hcCAqLwoKICAgICAgICAgICAgICAodGhpcyBicmVha3MgYmVjYXVzZSB0aGUgY29kZSBmb3IgdGhlIGNsYXNzIEZvbyBpcyBhY3R1YWxseQogICAgICAgICAgICAgIGdlbmVyYXRlZCBhZnRlciB0aGUgZW50aXJlIGludGVyZmFjZSBmaWxlIGhhcyBiZWVuIHByb2Nlc3NlZCkuCiAgICAgICAgICAgICAgVGhpcyBpcyBvbmx5IGEgdGVtcG9yYXJ5IGJ1Zy4KCiAgICAgICAgICAyLiAgSW4gU1dJRzEuMSwgdGhlICVhcHBseSBkaXJlY3RpdmUgd29ya2VkIGJ5IHBlcmZvcm1pbmcgYQogICAgICAgICAgICAgIHZlcnkgY29tcGxleCB0eXBlLWFsaWFzaW5nIHByb2NlZHVyZS4gIEZyb20gdGhpcyBwb2ludCBvbiwKICAgICAgICAgICAgICAlYXBwbHkgaXMgc2ltcGx5IGEgZ2VuZXJhbGl6ZWQgdHlwZW1hcCBjb3B5IG9wZXJhdGlvbi4KICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgICAgICAgICVhcHBseSBkb3VibGUgKk9VVFBVVCB7IGRvdWJsZSAqeCwgZG91YmxlICp5IH07CgogICAgICAgICAgICAgIENvcGllcyAqQUxMKiBjdXJyZW50bHkgZGVmaW5lZCB0eXBlbWFwcyBmb3IgJ2RvdWJsZSAqT1VUUFVUJyBhbmQKICAgICAgICAgICAgICBjb3BpZXMgdGhlbSB0byAnZG91YmxlICp4JyBhbmQgJ2RvdWJsZSAqeScuCgogICAgICAgICAgICAgIE1vc3QgcGVvcGxlIHByb2JhYmx5IHdvbid0IGV2ZW4gbm90aWNlIHRoaXMgY2hhbmdlIGluCiAgICAgICAgICAgICAgJWFwcGx5LiAgSG93ZXZlciwgd2hlcmUgaXQgd2lsbCBicmVhayB0aGluZ3MgaXMgaW4gY29kZSBsaWtlCiAgICAgICAgICAgICAgdGhpczoKCiAgICAgICAgICAgICAgICAgICVhcHBseSBkb3VibGUgKk9VVFBVVCB7IGRvdWJsZSAqeCB9OwogICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgZG91YmxlICpPVVRQVVQgewogICAgICAgICAgICAgICAgICAgICAgIC4uLiB3aGF0ZXZlciAuLi4KICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgdm9pZCBmb28oZG91YmxlICp4KTsKCiAgICAgICAgICAgICAgSW4gU1dJRzEuMSwgeW91IHdpbGwgZmluZCB0aGF0ICdmb28nIHVzZXMgdGhlICdkb3VibGUgKk9VVFBVVCcgcnVsZQogICAgICAgICAgICAgIGV2ZW4gdGhvdWdoIGl0IHdhcyBkZWZpbmVkIGFmdGVyIHRoZSAlYXBwbHkgZGlyZWN0aXZlICh0aGlzIGlzCiAgICAgICAgICAgICAgdGhlIHdlaXJkIGFsaWFzaW5nIHNjaGVtZSBhdCB3b3JrKS4gIEluIFNXSUcxLjMgYW5kIGxhdGVyLAogICAgICAgICAgICAgIHRoZSAnZG91YmxlICpPVVRQVVQnIHJ1bGUgaXMgaWdub3JlZCBiZWNhdXNlIGl0IGlzIGRlZmluZWQKICAgICAgICAgICAgICBhZnRlciB0aGUgJWFwcGx5IGRpcmVjdGl2ZS4KCiAgICAgICAgICAzLiAgVGhlICVjbGVhciBkaXJlY3RpdmUgaGFzIGJlZW4gbW9kaWZpZWQgdG8gZXJhc2UgYWxsIGN1cnJlbnRseQogICAgICAgICAgICAgIGRlZmluZWQgdHlwZW1hcHMgZm9yIGEgcGFydGljdWxhciB0eXBlLiAgVGhpcyBkaWZmZXJzIGZyb20KICAgICAgICAgICAgICBTV0lHMS4xIHdoZXJlICVjbGVhciBvbmx5IHJlbW92ZWQgcnVsZXMgdGhhdCB3ZXJlIGFkZGVkIHVzaW5nCiAgICAgICAgICAgICAgdGhlICVhcHBseSBkaXJlY3RpdmUuCgogICAgICAgICAgNC4gIFR5cGVtYXAgbWF0Y2hpbmcgaXMgbm93IHBlcmZvcm1lZCB1c2luZyAqZXhhY3QqIHR5cGVzLgogICAgICAgICAgICAgIFRoaXMgbWVhbnMgdGhhdCB0aGluZ3MgbGlrZSB0aGlzCgogICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGNoYXIgKiB7IH0KICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBjb25zdCBjaGFyICogeyB9CgogICAgICAgICAgICAgIGFyZSBkaWZmZXJlbnQgdHlwZW1hcHMuICAgIEEgc2ltaWxhciBydWxlIGFwcGxpZXMgZm9yIHBvaW50ZXJzLAogICAgICAgICAgICAgIGFycmF5cywgYW5kIHJlZmVyZW5jZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgZG91YmxlICogeyB9CgogICAgICAgICAgICAgIHVzZWQgdG8gYXBwbHkgdG8gJ2RvdWJsZSAmJywgJ2RvdWJsZSBbXScsICBOb3csIGl0IG9ubHkgYXBwbGllcwogICAgICAgICAgICAgIHRvICdkb3VibGUgKicuICBJZiB5b3Ugd2FudCBhICdkb3VibGUgJicsIHlvdSdsbCBuZWVkIHRvIGhhbmRsZQogICAgICAgICAgICAgIHRoYXQgc2VwYXJhdGVseS4KCiAgICAgICAgICA1LiAgQXJyYXkgbWF0Y2hpbmcgaGFzIGJlZW4gc2ltcGxmaWVkLiAgSW4gU1dJRzEuMSwgYXJyYXkgbWF0Y2hpbmcKICAgICAgICAgICAgICB3YXMgcGVyZm9ybWVkIGJ5IHRyeWluZyB2YXJpb3VzIGNvbWJpbmF0aW9ucyBvZiBkaW1lbnNpb25zLgogICAgICAgICAgICAgIEZvciBleGFtcGxlLCAnZG91YmxlIGFbMTBdWzIwXScgd2FzIG1hdGNoZWQgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICAgICBkb3VibGUgWzEwXVsyMF0KICAgICAgICAgICAgICAgICAgIGRvdWJsZSBbQU5ZXVsyMF0KICAgICAgICAgICAgICAgICAgIGRvdWJsZSBbMTBdW0FOWV0KICAgICAgICAgICAgICAgICAgIGRvdWJsZSBbQU5ZXVtBTlldCgogICAgICAgICAgICAgIEluIFNXSUcxLjMsIG9ubHkgdGhlIGZvbGxvd2luZyBtYXRjaGVzIGFyZSBhdHRlbXB0ZWQ6CgogICAgICAgICAgICAgICAgICAgZG91YmxlIFsxMF1bMjBdCiAgICAgICAgICAgICAgICAgICBkb3VibGUgW0FOWV1bQU5ZXQoKICAgICAgICAgIE9uIHRoZSBwb3NpdGl2ZSBzaWRlLCB0eXBlbWFwIG1hdGNoaW5nIGlzIG5vdyAqc2lnbmlmaWNhbnRseSogZmFzdGVyCiAgICAgICAgICB0aGFuIGJlZm9yZS4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOC8xNS8wMCA6IGJlYXpsZXkKICAgICAgICAgIFNlY3JldCBkZXZlbG9wZXIgZmVhdHVyZS4gIFNpbmNlIGRhdGF0eXBlcyBhcmUgbm93IHJlcHJlc2VudGVkIGFzIAogICAgICAgICAgc3RyaW5ncyBpbnRlcm5hbGx5LCB5b3UgY2FuIGJ5cGFzcyBsaW1pdGF0aW9ucyBvZiB0aGUgcGFyc2VyIGFuZAogICAgICAgICAgY3JlYXRlIGEgd2lsZCBkYXRhdHlwZSBieSBzaW1wbHkgZW5jbG9zaW5nIHRoZSByYXcgc3RyaW5nIGVuY29kaW5nCiAgICAgICAgICBpbiBiYWNrdGlja3MgKGBgKSBhbmQgc3RpY2tpbmcgaXQgaW4gdGhlIGludGVyZmFjZSBmaWxlIGFueXdoZXJlIGEKICAgICAgICAgIHR5cGUgaXMgZXhwZWN0ZWQuICBGb3IgZXhhbXBsZSwgYGEoMjApLmEoMTApLnAuZihpbnQsaW50KWAuICBUaGlzIAogICAgICAgICAgZmVhdHVyZSBpcyBvbmx5IGludGVuZGVkIGZvciB0ZXN0aW5nIChpLmUuLCB5b3Ugd2FudCB0byBzZWUgd2hhdAogICAgICAgICAgaGFwcGVucyB0byB5b3VyIGxhbmd1YWdlIG1vZHVsZSBpZiBpdCBnZXRzIGEgcmVmZXJlbmNlIHRvIGEgcG9pbnRlcgogICAgICAgICAgdG8gYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gZnVuY3Rpb25zIG9yIHNvbWV0aGluZykuIAogICAgICAgICAgKioqIFNJQ0sgSEFDSyAqKioKCjgvMTQvMDAgOiBiZWF6bGV5CiAgICAgICAgICBDb21wbGV0ZWx5IG5ldyB0eXBlLXN5c3RlbSBhZGRlZCB0byB0aGUgaW1wbGVtZW50YXRpb24uCiAgICAgICAgICBNb3JlIGRldGFpbHMgbGF0ZXIuCgo4LzExLzAwIDogYmVhemxleQogICAgICAgICAgQ2xlYW5lZCB1cCBzb21lIG9mIHRoZSBJL08gaGFuZGxpbmcuICBTV0lHIG5vIGxvbmdlciBnZW5lcmF0ZXMKICAgICAgICAgIGFueSB0ZW1wb3JhcnkgZmlsZXMgc3VjaCBhcyBfd3JhcC53cmFwLCBfd3JhcC5paSwgX3dyYXAuaW5pdC4KICAgICAgICAgIEluc3RlYWQsIHRoZXNlICJmaWxlcyIgYXJlIGtlcHQgYXJvdW5kIGluIG1lbW9yeSBhcyBzdHJpbmdzCiAgICAgICAgICAoYWx0aG91Z2ggdGhpcyBpcyB0cmFuc3BhcmVudCB0byBsYW5ndWFnZSBtb2R1bGVzKS4KCjgvNC8wMCAgOiB0dG4KCSAgQWRkZWQgTWFrZWZpbGUgdGFyZ2V0ICJjaGVjayIgYW5kIHZhcmlhbnRzLgoJICBUaGlzIGNhbiBiZSB1c2VkIGxpa2UgIm1ha2UgY2hlY2siIG9yLCB0byBleHBsaWNpdGx5IHNraXAgYQoJICBsYW5ndWFnZSBMQU5HOiAibWFrZSBza2lwLUxBTkc9dHJ1ZSBjaGVjayIuICBMQU5HIGlzIHNraXBwZWQKCSAgYXV0b21hdGljYWxseSBpZiAuL2NvbmZpZ3VyZSBkZXRlcm1pbmVzIHRoYXQgTEFORyBzdXBwb3J0IGlzCgkgIGluc3VmZmljaWVudC4KCgkgIEN1cnJlbnRseSwgdGhlIGNoZWNrIGlzIGxpbWl0ZWQgdG8gZG9pbmcgdGhlIGVxdWl2YWxlbnQgb2YKCSAgIm1ha2UgYWxsIiBpbiBzb21lIG9mIHRoZSBFeGFtcGxlcyBkaXJlY3Rvcmllcy4gIFRoaXMgc2hvdWxkCgkgIGJlIGV4cGFuZGVkIGJvdGggaG9yaXpvbnRhbGx5IChkaWZmZXJlbnQgdHlwZXMgb2YgdGVzdHMpIGFuZAoJICB2ZXJ0aWNhbGx5IChhZnRlciAibWFrZSBhbGwiIGluIGFuIEV4YW1wbGVzIHN1YmRpciBzdWNjZWVkcywKCSAgZG8gc29tZSBhZGRpdGlvbmFsIHRlc3RzIHdpdGggdGhlIHJlc3VsdGluZyBpbnRlcnByZXRlciwgZXRjKS4KCjgvNC8wMCAgOiB0dG4KCSAgQWRkZWQgTWFrZWZpbGUgdGFyZ2V0ICJkaXN0Y2xlYW4iLCB3aGljaCBkZWxldGVzIGFsbCB0aGUKCSAgZmlsZXMgLi9jb25maWd1cmUgY3JlYXRlcywgaW5jbHVkaW5nIGNvbmZpZy5zdGF0dXMgYW5kIGZyaWVuZHMuCgo4LzMvMDAgIDogaGFyY29oCgkgIGphdmEgY2hhbmdlcz8/PyBbdG9kbzogZG9jdW1lbnQgY2hhbmdlc10KCjcvMjMvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUeXBlbWFwcyBoYXZlIGJlZW4gbW9kaWZpZWQgdG8ga2V5IG9mZiBvZiB0aGUgcmVhbCBkYXRhdHlwZXMKICAgICAgICAgIHVzZWQgaW4gdGhlIGludGVyZmFjZSBmaWxlLiAgVGhpcyBtZWFucyB0aGF0IHR5cGVtYXBzIGZvcgogICAgICAgICAgImNvbnN0IGNoYXIgKiIgYW5kICJjaGFyICoiIHdpbGwgYmUgZGlmZmVyZW5jZSBhcyB3aWxsIHR5cGVtYXBzCiAgICAgICAgICBmb3IgIlZlY3RvciIgYW5kICJWZWN0b3IgKi4iCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgIFRoaXMgaXMgbGlrZWx5IHRvIGJyZWFrIGludGVyZmFjZXMgdGhhdCByZWx5IG9uIHRoZSBvZGQgdHlwZQogICAgICAgICAgaGFuZGxpbmcgYmVoYXZpb3Igb2YgdHlwZW1hcHMgaW4gU1dJRzEuMS0tZXNwZWNpYWxseSB3aXRoCiAgICAgICAgICByZXNwZWN0IHRvIGludGVyZmFjZXMgaW52b2x2aW5nIHBhc3MtYnktdmFsdWUuCgo3LzIzLzAwIDogYmVhemxleQogICAgICAgICAgTmV3ICVjb25zdGFudCBkaXJlY3RpdmUuICBUaGlzIGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0bwogICAgICAgICAgY3JlYXRlIHRydWUgY29uc3RhbnRzIGluIHRoZSB0YXJnZXQgc2NyaXB0aW5nIGxhbmd1YWdlLgogICAgICAgICAgSXQncyBtb3N0IHNpbXBsZSBmb3JtIGlzIHNvbWV0aGluZyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgJWNvbnN0YW50IEZPTyA0MjsKCiAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSB0eXBlIGlzIGluZmVycmVkIGZyb20gdGhlIHN5bnRheCBvZiB0aGUKICAgICAgICAgIHZhbHVlIChpbiByZWFsaXR5LCBhbGwgI2RlZmluZSBtYWNyb3MgYXJlIHRyYW5zbGF0ZWQgaW50bwogICAgICAgICAgZGlyZWN0aXZlcyBvZiB0aGlzIGZvcm0pLgoKICAgICAgICAgIEFuIGV4cGFuZGVkIHZlcnNpb24gaXMgYXMgZm9sbG93czoKCiAgICAgICAgICAgICVjb25zdGFudChGb28gKikgRk9PID0gJkZvb09iajsKCiAgICAgICAgICBJbiB0aGlzIGNhc2UsIGFuIGV4cGxpY2l0IHR5cGUgY2FuIGJlIHNwZWNpZmllZC4gIFRoaXMKICAgICAgICAgIGxhdHRlciBmb3JtIG1heSBiZSB1c2VmdWwgZm9yIGNyZWF0aW5nIGNvbnN0YW50cyB0aGF0CiAgICAgICAgICB1c2VkIHRvIGJlIHNwZWNpZmllZCBhcwoKICAgICAgICAgICAgIGNvbnN0IEZvbyAqRk9PID0gJkZvb09iajsKCiAgICAgICAgICAod2hpY2ggYXJlIG5vdyB0cmVhdGVkIGFzIHZhcmlhYmxlcykuCiAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIEZFQVRVUkUgKioqIFRoZSBzeW50YXggbWF5IGNoYW5nZSBpbgogICAgICAgICAgdGhlIGZpbmFsIHJlbGVhc2UuCgo3LzIzLzAwIDogYmVhemxleQogICAgICAgICAgTW9kaWZpZWQgdGhlIHBhcnNlciBzbyB0aGF0IHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBvZiB0aGUgZm9ybQogICAgICAgICAgImNvbnN0IHR5cGUgKmEiIGFyZSBoYW5kbGVkIGFzIHZhcmlhYmxlcywgbm90IGNvbnN0YW50cy4KICAgICAgICAgIE5vdGU6IFNXSUcxLjEgaGFuZGxlZCB0aGlzIGNhc2UgZXJyb25lb3VzbHkgYmVjYXVzZQogICAgICAgICAgY29uc3QgY2hhciAqYSBpcyBhIHBvaW50ZXIgdmFyaWFibGUgdGhhdCBjYW4gYmUgcmVhc3NpZ25lZC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgTm90ZToganVzdCBiZWNhdXNlIHRoaXMgaXMgdGhlICJyaWdodCIgd2F5IHRvIGRvIHRoaW5ncywKICAgICAgICAgIGRvZXNuJ3QgbWVhbiBpdCdzIHRoZSBtb3N0IGFwcHJvcHJpYXRlIGludGVycHJldGF0aW9uLgogICAgICAgICAgSSBzdXNwZWN0IHRoYXQgbWFueSBDIHByb2dyYW1tZXJzIG1pZ2h0IHVzZSAnY29uc3QgY2hhciAqJwogICAgICAgICAgd2l0aCB0aGUgaW50ZW50IG9mIGNyZWF0aW5nIGEgY29uc3RhbnQsIHdpdGhvdXQgcmVhbGl6aW5nCiAgICAgICAgICB0aGF0IHRoZXkndmUgY3JlYXRlZCBhIHJlYXNzaWduYWJsZSBnbG9iYWwgdmFyaWFibGUuCgo3LzIzLzAwIDogYmVhemxleQogICAgICAgICAgVGhlIEMvQysrIHdyYXBwaW5nIGxheWVyIGhhcyBiZWVuIGNvbXBsZXRlbHkgcmVkZXNpZ25lZCBhbmQKICAgICAgICAgIHJlaW1wbGVtZW50ZWQuICBUaGlzIGNoYW5nZSBzaG91bGQgaXJvbiBvdXQgYSBmZXcgcm91Z2gKICAgICAgICAgIHNwb3RzIHdpdGggdGhlIGhhbmRsaW5nIG9mIGRhdGF0eXBlcy4gIEluIGFkZGl0aW9uLCB0aGUKICAgICAgICAgIHdyYXBwZXIgY29kZSBpcyBzb21ld2hhdCBjbGVhbmVyLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICBUaGlzIGNoYW5nZSBtYXkgYnJlYWsgaW50ZXJmYWNlcyB0aGF0IGludm9sdmUKICAgICAgICAgIHN1YnRsZSBjb3JuZXItY2FzZXMgd2l0aCB0eXBlbWFwcyBhbmQgdGhlICVhZGRtZXRob2RzCiAgICAgICAgICBkaXJlY3RpdmUgc2luY2Ugc29tZSBvZiB0aGVzZSBmZWF0dXJlcyBoYWQgc29tZXdoYXQKICAgICAgICAgIHR5cGUgaGFuZGxpbmcgYmVoYXZpb3IgaW4gU1dJRzEuMS4KCjcvMjMvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUaGUgIm1lbWJlcmluIiBhbmQgIm1lbWJlcm91dCIgdHlwZW1hcHMgYXJlIGdvbmUgZm9yIHRoZQogICAgICAgICAgbW9tZW50LCBidXQgdGhleSBtaWdodCByZXR1cm4gYXMgc29vbiBhcyBJIGZpZ3VyZSBvdXQKICAgICAgICAgIGhvdyB0byBpbnRlZ3JhdGUgdGhlbSB3aXRoIHNvbWUgb2YgdGhlIHN0cmVhbWxpbmVkIEMgd3JhcHBlcgogICAgICAgICAgZnVuY3Rpb25zLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzIyLzAwIDogYmVhemxleQogICAgICAgICAgQSB2YXJpZXR5IG9mIG9sZCB0eXBlIGhhbmRsaW5nIGZ1bmN0aW9ucyBzdWNoIGFzIHByaW50X3R5cGUoKSwKICAgICAgICAgIHByaW50X2Z1bGwoKSwgcHJpbnRfbWFuZ2xlKCksIGV0Yy4uLiBhcmUgZ29uZSBhbmQgaGF2ZSBiZWVuCiAgICAgICAgICByZXBsYWNlZCB3aXRoIGEgc21hbGxlciBzZXQgb2YgZnVuY3Rpb25zLiAgU2VlIHRoZSBmaWxlCiAgICAgICAgICBEb2MvaW50ZXJuYWxzLmh0bWwgZm9yIGRldGFpbHMuICBUaGlzIHdpbGwgYnJlYWsgYWxsIHRoaXJkCiAgICAgICAgICBwYXJ0eSBsYW5ndWFnZSBtb2R1bGVzLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzIwLzAwIDogYmVhemxleQogICAgICAgICAgRGVwcmVjYXRlZCB0aGUgJXZhbCBhbmQgJW91dCBkaXJlY3RpdmVzLiAgVGhlc2UgZGlyZWN0aXZlcwogICAgICAgICAgc2hvdWxkbid0IHJlYWxseSBiZSBuZWNlc3Nhcnkgc2luY2UgdHlwZW1hcHMgY2FuIGJlIHVzZWQKICAgICAgICAgIHRvIGFjaGlldmUgc2ltaWxhciByZXN1bHRzLiAgIFRoaXMgYWxzbyBjbGVhbnMgdXAgdGhlCiAgICAgICAgICBoYW5kbGluZyBvZiB0eXBlcyBhbmQgcGFyYW1ldGVycyBxdWl0ZSBhIGJpdC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy8yMC8wMCA6IHR0bgoJICBGaXhlZCB1bnNwZWNpZmllZC1tb2R1bGUgYnVnIGluIEd1aWxlIHN1cHBvcnQgYW5kIHJlbW92ZWQKCSAgbW9yZSBub24tIndpdGgtc21vYnMiIGZ1bmN0aW9uYWxpdHkgdXNpbmcgcGF0Y2hlcyBzdWJtaXR0ZWQKCSAgYnkgTWF0dGhpYXMgS29lcHBlLgoKCSAgUmUtZW5hYmxlIHJlY29nbml0aW9uIG9mICItd2l0aC1zbW9icyIgKHdpdGggbm8gZWZmZWN0IHNpbmNlCgkgIHdlIHVzZSBzbW9icyBieSBkZWZhdWx0IG5vdykgZm9yIHRoZSB0aW1lIGJlaW5nLiAgQWZ0ZXIgdGhlCgkgIDEuM2E0IHJlbGVhc2UsIHRoaXMgb3B0aW9uIHdpbGwgc2lnbmFsIGFuIGVycm9yLgoKNy8xNy8wMCA6IHR0bgoJICBGaXhlZCBOVUxMLWlucHV0IGJ1ZyBpbiBwYXJhbWV0ZXIgbGlzdCBoYW5kbGluZy4KCSAgUmVwb3J0ZWQgYnkgTWF0dGhpYXMgS29lcHBlLgoKNy8xMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIG1lbW9yeSBsZWFrIGluIFB5dGhvbiB0eXBlLWNoZWNraW5nIGNvZGUuIFJlcG9ydGVkIGJ5CiAgICAgICAgICBLZWl0aCBEYXZpZHNvbi4gIEJ1ZyAjMTA5Mzc5LgoKNy8xMC8wMCA6IGJlYXpsZXkKICAgICAgICAgIENoYW5nZWQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIHJlbGF0ZWQgdG8gZnVuY3Rpb24gcGFyYW1ldGVycy4KCjcvMTAvMDAgOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBzb21lIGJ1Z3MgcmVsYXRlZCB0byB0aGUgaGFuZGxpbmcgb2YgdGhlICVuYW1lKCkgZGlyZWN0aXZlCiAgICAgICAgICBhbmQgY2xhc3NlcyBpbiB0aGUgVGNsIG1vZHVsZS4gUHJvYmxlbSByZXBvcnRlZCBieSBKYW1lcyBCYWlsZXkuCgo3LzEwLzAwIDogYmVhemxleQogICAgICAgICAgRml4ZWQgcGFyc2luZyBhbmQgZW51bSBoYW5kbGluZyBwcm9ibGVtcyB3aXRoIGNoYXJhY3RlciBjb25zdGFudHMuCiAgICAgICAgICBSZXBvcnRlZCBieSBHcmVnIEtvY2hhbnNraS4KCjcvMTAvMDAgOiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIFdyYXBwZXJGdW5jdGlvbiBjbGFzcyBmcm9tIHRoZSBjb3JlIGFuZCB1cGRhdGVkIHRoZSBsYW5ndWFnZQogICAgICAgICAgbW9kdWxlLiAgVGhpcyB3aWxsIGJyZWFrIHRoaXJkIHBhcnR5IG1vZHVsZXMuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvOS8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiBTV0lHIG5vIGxvbmdlciBtYWtlcyB1c2Ugb2YgQysrIG9wZXJhdG9yIG92ZXJsb2FkaW5nLgogICAgICAgICAgVGhpcyB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYnJlYWsgKmFsbCogdGhpcmQgcGFydHkgbGFuZ3VhZ2UgbW9kdWxlcwogICAgICAgICAgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIG1haW4gU1dJRyBDVlMgdHJlZS4gU29ycnkuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvOC8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIHRoZSBleHBlcmltZW50YWwgYW5kIHVuZG9jdW1lbnRlZCAiYnVpbGQiIHR5cGVtYXAgdGhhdAogICAgICAgICAgd2FzIGludGVuZGVkIHRvIHdvcmsgd2l0aCBtdWx0aXBsZSBhcmd1bWVudHMuIFNpbXBseSB0b28gd2VpcmQKICAgICAgICAgIHRvIGtlZXAgYXJvdW5kLiAgQmVzaWRlcywgYSBiZXR0ZXIgcmVwbGFjZW1lbnQgaXMgaW4gdGhlIHdvcmtzLgoKNy82LzAwICA6IHR0bgogICAgICAgICAgUmVtb3ZlZCBub24tIndpdGgtc21vYnMiIGZ1bmN0aW9uYWxpdHkgKEd1aWxlIHN1cHBvcnQpLCBpLmUuLAogICAgICAgICAgIi13aXRoLXNtb2JzIiBpcyBub3cgdGhlIGRlZmF1bHQgYW5kIG5vIGxvbmdlciBuZWVkcyB0byBiZQoJICBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQtbGluZS4KCjcvNS8wMCAgOiB0dG4KICAgICAgICAgIEluY29ycG9yYXRlZCBSdWJ5IHN1cHBvcnQgY29udHJpYnV0ZWQgYnkgTWFzYWtpIEZ1a3VzaGltYS4KCjYvMjgvMDAgOiB0dG4KICAgICAgICAgIEFwcGxpZWQgbW9yZS10aGFuLTEwLWFyZ3MgYnVnZml4IHBhdGNoIGNvbnRyaWJ1dGVkCgkgIGJ5IE1hdHRoaWFzIEtvZXBwZS4KCjYvMjcvMDAgOiBiZWF6bGV5CiAgICAgICAgICBSZXdyb3RlIHNvbWUgb2YgdGhlIHN0cmluZyBoYW5kbGluZyBhbmQgZWxpbWluYXRlZCB0aGUgQysrCiAgICAgICAgICBpbXBsZW1lbnRhdGlvbiAod2hpY2ggaXMgbm93IGp1c3QgYSB3cmFwcGVyKS4KCjYvMjcvMDAgOiB0dG4KICAgICAgICAgIEFkZGVkIERvYy9pbmRleC5odG1sIGFuZCBEb2MvaW50ZXJuYWxzLmh0bWwuICBUaGUgdGFyZ2V0CiAgICAgICAgICBhdWRpZW5jZSBmb3IgdGhlIGxhdHRlciBpcyBuZXcgU1dJRyBkZXZlbG9wZXJzLgoKClZlcnNpb24gMS4zIEFscGhhIDMgKEp1bmUgMTgsIDIwMDApCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo2LzE4LzAwIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCB0aGUgbmFtaW5nLmN4eCwgaGFzaC5jeHgsIGFuZCBzeW1ib2wuY3h4IGZpbGVzIGZyb20KICAgICAgICAgIHRoZSBTV0lHMS4xIGRpcmVjdG9yeS4gICBDb250aW51ZWQgdG8gbWlncmF0ZSB0aGluZ3MgYXdheQogICAgICAgICAgZnJvbSB0aGUgQysrIGJhc2UgKGFsdGhvdWdoIHRoZXJlJ3Mgc3RpbGwgYSBsb3Qgb2Ygd29yayB0byBkbykuCgo2LzE3LzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgYSBmZXcgbW9yZSBleGFtcGxlcyB0byB0aGUgRXhhbXBsZXMgZGlyZWN0b3J5LiAgU3RpbGwKICAgICAgICAgIG5lZWQgdG8gZG8gYSBsb3Qgb2Ygd29yayBvbiB0aGlzLgoKNi8xNi8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIC1pbmNsdWRlYWxsIHRvIGZvbGxvdyBhbGwgI2luY2x1ZGUgc3RhdGVtZW50cyBpbiB0aGUKICAgICAgICAgIHByZXByb2Nlc3Nvci4KCjYvMTUvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUcmllZCB0byBmaXggYXMgbWFueSBDKysgd2FybmluZ3MgYXMgcG9zc2libGUgd2hlbiBjb21waWxpbmcKICAgICAgICAgIHdpdGggdGhlIFN1biBXb3Jrc2hvcCBDKysgY29tcGlsZXIuICBVbmZvcnR1bmF0ZWx5LCB0aGlzIG1lYW5zCiAgICAgICAgICB0aGF0IHRoZXJlIGFyZSBhIGxvdCBvZiBzdGF0ZW1lbnRzIHRoYXQgY29udGFpbiBzdHJpbmcgbGl0ZXJhbHMKICAgICAgICAgIG9mIHRoZSBmb3JtIChjaGFyKikiQmxhaCIuCgo2LzE1LzAwOiAgYmVhemxleQogICAgICAgICAgQSB2YXJpZXR5IG9mIGNsZWFudXAgYW5kIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiBpbiB0aGUKICAgICAgICAgIGxvdy1sZXZlbCBET0ggbGlicmFyeS4gICBUaGlzIHNlZW1zIHRvIHJlc3VsdCBpbiBhIHNwZWVkdXAKICAgICAgICAgIG9mIDUwLTEwMCUgZm9yIHByZXByb2Nlc3NpbmcgYW5kIG90aGVyIHJlbGF0ZWQgdGFza3MuCgo1LzEwLzAwIDogdHRuCgkgIEFwcGxpZWQgdmFyaWFibGUtd3JhcHBpbmcgYnVnZml4IHBhdGNoIGNvbnRyaWJ1dGVkCgkgIGJ5IE1hdHRoaWFzIEtvZXBwZS4KCjQvMTcvMDAgOiB0dG4KCSAgVXBkYXRlZCBNelNjaGVtZSBzdXBwb3J0IGNvbnRyaWJ1dGVkIGJ5IE9sZWcgVG9sbWF0Y2V2LgoJICBXZSBub3cgdXNlIGEgYFNjaGVtZV9UeXBlJy1iYXNlZCBzdHJ1Y3R1cmUgdG8gd3JhcCBwb2ludGVycy4KCjQvMTEvMDAgOiB0dG4KCSAgSW5jb3Jwb3JhdGVkIGZ1cnRoZXIgR3VpbGUtc3VwcG9ydCBwYXRjaCBieSBNYXR0aGlhcyBLb2VwcGUuCgkgIFR5cGVtYXBzIHByZXZpb3VzbHkgZGVsZXRlZCBoYXZlIGJlZW4gcmUtYWRkZWQuICBUaGVyZSBpcyBub3cKCSAgZXhjZXB0aW9uIGhhbmRsaW5nIChzZWUgRG9jL2VuZ2luZWVyaW5nLmh0bWwpLiAgYFNXSUdfaW5pdCcgaXMgbm93CgkgIGRlY2xhcmVkIGV4dGVybiBvbmx5IGZvciBzaW1wbGUgbGlua2FnZS4gIFNvbWUgYnVncyB3ZXJlIGZpeGVkLgoKNC8wNi8wMCA6IHR0bgoJICBJbmNvcnBvcmF0ZWQgTXpTY2hlbWUgc3VwcG9ydCBjb250cmlidXRlZCBieSBPbGVnIFRvbG1hdGNldi4KCSAgVGhpcyBpbmNsdWRlcyBuZXcgZGlyZWN0b3JpZXMgTGliL216c2NoZW1lIGFuZCBFeGFtcGxlcy9tenNjaGVtZS4KCjQvMDMvMDAgOiB0dG4KCSAgQWRkZWQgRXhhbXBsZXMvZ3VpbGUgYW5kIGNoaWxkcmVuLiAgVGhpcyBpcyBhbiBhZGFwdGF0aW9uIG9mCgkgIHRoZSBzYW1lLW5hbWVkIGRpcmVjdG9yeSBmcm9tIHRoZSBTV0lHLTEuMXA1IGRpc3RyaWJ1dGlvbi4KCSAgQWRkZWQgR3VpbGUtc3BlY2lmaWMgc2VjdGlvbiB0byBEb2MvZW5naW5lZXJpbmcuaHRtbC4KCjQvMDIvMDAgOiB0dG4KCSAgSW5jb3Jwb3JhdGVkIG5ldyBndWlsZW1haW4uaSBieSBNYXJ0aW4gRnJvZWhsaWNoLgoJICBJbmNvcnBvcmF0ZWQgR3VpbGUtc3VwcG9ydCByZXdyaXRlIHBhdGNoIGJ5IE1hdHRoaWFzIEtvZXBwZS4KCSAgVGhlIGNvbW1hbmQgbGluZSBvcHRpb24gIi13aXRoLXNtb2JzIiBlbmFibGVzIGltcGxlbWVudGF0aW9uIG9mCgkgIHBvaW50ZXIgdHlwZSBoYW5kbGluZyB1c2luZyBzbW9icywgdGhlIGNhbm9uaWNhbCBtZWNoYW5pc20gZm9yCgkgIGRlZmluaW5nIG5ldyB0eXBlcyBpbiBHdWlsZS4gIFByZXZpb3VzIGltcGxlbWVudGF0aW9uICh1c2luZwoJICBzdHJpbmdzKSBpcyBhdCB0aGUgbW9tZW50IHN0aWxsIHN1cHBvcnRlZCBidXQgZGVwcmVjYXRlZC4gIEF0CgkgIHNvbWUgcG9pbnQsICItd2l0aC1zbW9icyIgd2lsbCBiZSB0aGUgZGVmYXVsdCBhbmQgbm8gbG9uZ2VyCgkgIHJlcXVpcmVkLgoKMy8xMy8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIHB1cmlmeSBwYXRjaGVzIHN1Ym1pdHRlZCBieSBSYW0gQmhhbWlkaXBhdHkuCgozLzAyLzAwIDogdHRuCiAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBkaWZmZXJlbnQgR3VpbGUgImxpbmthZ2UiIHNjaGVtZXMuCgkgIEN1cnJlbnRseSwgIi1MaW5rYWdlIGhvYmJpdCIgd29ya3MuCgoKVmVyc2lvbiAxLjMgQWxwaGEgMiAoTWFyY2ggMSwgMjAwMCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIvMjkvMDAgOiBiZWF6bGV5CiAgICAgICAgICBNYWRlIFNXSUcgaWdub3JlIHRoZSAnbXV0YWJsZScga2V5d29yZC4KCjIvMjkvMDAgOiBiZWF6bGV5CiAgICAgICAgICBJbmNvcnBvcmF0ZWQgc29tZSBwYXRjaGVzIHRvIHRoZSBQZXJsNSBtb2R1bGUgcmVsYXRlZCB0bwogICAgICAgICAgdGhlIC1oaWRlIG9wdGlvbiBhbmQgdGhlIGRlc3RydWN0aW9uIG9mIG9iamVjdHMuCiAgICAgICAgICBQYXRjaCBzdWJtaXR0ZWQgYnkgS2FybCBGb3JuZXIuCgoyLzI3LzAwIDogdHRuCgkgIEluY29ycG9yYXRlZCBHdWlsZSBzdXBwb3J0IGNvbnRyaWJ1dGVkIGJ5IE1hdHRoaWFzIEtvZXBwZS4KCSAgVGhpcyBpbmNsdWRlcyBhIGNwcCBtYWNybyBpbiBMaWIvZ3VpbGUvZ3VpbGUuc3dnIGFuZCB0aGUKCSAgZW50aXJlIGZpbGUgTGliL2d1aWxlL3R5cGVtYXBzLmkuCgoyLzI1LzAwIDogdHRuCgkgIE1vZGlmaWVkIGNvbmZpZ3VyZS5pbiBhbmQgTWFrZWZpbGUuaW4gZmlsZXMgdG8gc3VwcG9ydAoJICBub24tbG9jYWwgYnVpbGQgKHVzZWZ1bCBpbiBtdWx0aS1hcmNoIGVudmlyb25tZW50cykuCgoyLzI0LzAwIDogdHRuCgkgIEluY29ycG9yYXRlZCBHdWlsZSBzdXBwb3J0IGNvbnRyaWJ1dGVkIGJ5IENsYXJrIE1jR3Jldy4KCSAgVGhpcyB3b3JrcyB3aXRoIEd1aWxlIDEuMywgYnV0IHNpbmNlIGl0IGRlcGVuZHMgaGVhdmlseQoJICBvbiB0aGUgZ2hfIGludGVyZmFjZSwgaXQgc2hvdWxkIHdvcmsgZm9yIGFsbCBsYXRlciB2ZXJzaW9ucy4KCSAgSXQgaGFzIG5vdCBiZWVuIHRlc3RlZCB3aXRoIHZlcnNpb25zIGJlZm9yZSAxLjMuCgkgIFdBUk5JTkc6IENvZGUgaXMgdW5zdGFibGUgZHVlIHRvIGV4cGVyaW1lbnRhdGlvbiBieSB0dG4uCgoyLzE2LzAwIDogYmVhemxleQogICAgICAgICAgQSB2YXJpZXR5IG9mIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyB0byB0aGUgUHl0aG9uIHNoYWRvdwogICAgICAgICAgY2xhc3MgY29kZSBnZW5lcmF0aW9uLiAgTWFueSBvZiB0aGVzZSByZXN1bHQgaW4gc3Vic3RhbnRpYWwKICAgICAgICAgIHJ1bnRpbWUgcGVyZm9ybWFuY2UgZ2FpbnMuICBIb3dldmVyLCB0aGVzZSBoYXZlIGNvbWUgYXQKICAgICAgICAgIGEgY29zdCBvZiByZXF1aXJpbmcgdGhlIHVzZSBvZiBQeXRob24gMS41LjIuICBGb3Igb2xkZXIKICAgICAgICAgIHZlcnNpb25zLCB1c2UgJ3N3aWcgLW5vb3B0IC1weXRob24nIHRvIHR1cm4gb2ZmIHRoZXNlCiAgICAgICAgICBvcHRpbWl6YXRpb24gZmVhdHVyZXMuCgpWZXJzaW9uIDEuMyBBbHBoYSAxIChGZWJydWFyeSAxMSwgMjAwMCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyLzExLzAwIDogQWRkZWQgJ3ZvaWQnIHRvIHByb3RvdHlwZSBvZiBQeXRob24gbW9kdWxlIGluaXRpYWxpemVyLgogICAgICAgICAgUmVwb3J0ZWQgYnkgTWFyayBIb3dzb24gKDEvMjAvMDApLgoKMi8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIE1vZGlmaWVkIHRoZSBQeXRob24gc2hhZG93IGNsYXNzIGNvZGUgdG8gZGlzY2FyZCBvd25lcnNoaXAgb2YgYW4KICAgICAgICAgIG9iamVjdCB3aGVuZXZlciBpdCBpcyBhc3NpZ25lZCB0byBhIG1lbWJlciBvZiBhbm90aGVyIG9iamVjdC4KICAgICAgICAgIFRoaXMgcHJvYmxlbSBoYXMgYmVlbiBhcm91bmQgZm9yIGF3aGlsZSwgYnV0IHdhcyBtb3N0IHJlY2VudGx5CiAgICAgICAgICByZXBvcnRlZCBieSBCdXJraGFyZCBLbG9zcyAoMTIvMzAvOTkpLgoKMi8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIGJyYWNlcyBhcm91bmQgbWFjcm9zIGluIHRoZSBleGNlcHRpb24uaSBsaWJyYXJ5LiAgUmVwb3J0ZWQKICAgICAgICAgIGJ5IEJ1Y2sgSG9kZ2VzICgxMi8xOS85OSkKCjIvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBidWcgaW4gdGhlIGNvbnN0cmFpbnRzLmkgbGlicmFyeS4gUmVwb3J0ZWQgYnkgQnVjawogICAgICAgICAgSG9kZ2VzICgxMi8xNC85OSkKCjIvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUaGUgJW5hdGl2ZSBkaXJlY3RpdmUgbm93IGdlbmVyYXRlcyBUY2w4IG9iamVjdC1zdHlsZSBjb21tYW5kIGNhbGxzLgogICAgICAgICAgQSBmdWxsIHNvbHV0aW9uIGZvciBUY2w3IGFuZCBUY2w4IGlzIHN0aWxsIG5lZWRlZC4gUGF0Y2ggc3VnZ2VzdGVkCiAgICAgICAgICBieSBNaWtlIFdlaWJsZW4gKDExLzI5Lzk5KQoKMi8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIE1vZGlmaWVkIHRoZSB0eXBlbWFwIGNvZGUgdG8gaW5jbHVkZSB0aGUgJG5kaW0gdmFyaWFibGUgZm9yIGFycmF5cy4KICAgICAgICAgIFBhdGNoIHByb3ZpZGVkIGJ5IE1pY2hlbCBTYW5uZXIgKDExLzEyLzk5KS4KCjIvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBNb2RpZmllZCB0aGUgUHl0aG9uIG1vZHVsZSB0byByYWlzZSBhIFJ1bnRpbWUgZXJyb3IgaWYgYW4gYXR0ZW1wdAogICAgICAgICAgaXMgbWFkZSB0byBzZXQgYSByZWFkLW9ubHkgbWVtYmVyIG9mIGEgc2hhZG93IGNsYXNzLiAgUmVwb3J0ZWQgYnkKICAgICAgICAgIE1pY2hlbCBTYW5uZXIgKDExLzUvOTkpLgoKMi8xMC8wMCA6IFRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbSBoYXMgYmVlbiByZW1vdmVkLiBIb3dldmVyLCBpdCBpcyBsaWtlbHkKICAgICAgICAgIHRvIHJldHVybiBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUuCgoyLzEvMDAgIDogQWRkZWQgYSBudW1iZXIgb2YgcGVyZm9ybWFuY2UgZW5oYW5jZW1lbnRzIHRvIHRoZSBQeXRob24gc2hhZG93CiAgICAgICAgICBjbGFzc2luZyBhbmQgdHlwZS1jaGVja2luZyBjb2RlLiAgQ29udHJpYnV0ZWQgYnkgVmFkaW0gQ2h1Z3Vub3YuCgogICAgICAgICAgMS4gUmVtb3ZlIF9rd2FyZ3MgYXJndW1lbnQgZnJvbSB0aGUgc2hhZG93IHdyYXBwZXJzIHdoZW4gLWtleXdvcmQKICAgICAgICAgICAgIG9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkLiBUaGlzIHNhdmVzIHVzIGEgY29uc3RydWN0aW9uIG9mIGtleXdvcmQKICAgICAgICAgICAgIGRpY3Rpb25hcnkgb24gZWFjaCBtZXRob2QgY2FsbC4KCiAgICAgICAgICAgICBkZWYgbWV0aG9kMShzZWxmLCAqX2FyZ3MsICoqX2t3YXJncyk6CiAgICAgICAgICAgICAgICAgdmFsID0gYXBwbHkodGVzdDJjLlB5Q2xhc3MxX21ldGhvZDEsIChzZWxmLCkgKyBfYXJncywgX2t3YXJncykKICAgICAgICAgICAgICAgICByZXR1cm4gdmFsCgogICAgICAgICAgICAgYmVjb21lcwoKICAgICAgICAgICAgIGRlZiBtZXRob2QxKHNlbGYsICpfYXJncyk6CiAgICAgICAgICAgICAgICAgdmFsID0gYXBwbHkodGVzdDJjLlB5Q2xhc3MxX21ldGhvZDEsIChzZWxmLCkgKyBfYXJncykKICAgICAgICAgICAgICAgICByZXR1cm4gdmFsCgogICAgICAgICAgMi4gSW5jb3Jwb3JhdGUgc2VsZiBpbnRvIHRoZSBfYXJncyB0dXBsZS4gIFRoaXMgc2F2ZXMgYXQgbGVhc3Qgb25lIHR1cGxlCiAgICAgICAgICAgICBhbGxvY2F0aW9uIHBlciBtZXRob2QgY2FsbC4KCiAgICAgICAgICAgICBkZWYgbWV0aG9kMShzZWxmLCAqX2FyZ3MpOgogICAgICAgICAgICAgICAgIHZhbCA9IGFwcGx5KHRlc3QyYy5QeUNsYXNzMV9tZXRob2QxLCAoc2VsZiwpICsgX2FyZ3MpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbAoKICAgICAgICAgICAgIGJlY29tZXMKCiAgICAgICAgICAgICBkZWYgbWV0aG9kMSgqX2FyZ3MpOgogICAgICAgICAgICAgICAgIHZhbCA9IGFwcGx5KHRlc3QyYy5QeUNsYXNzMV9tZXRob2QxLCBfYXJncykKICAgICAgICAgICAgICAgICByZXR1cm4gdmFsCgogICAgICAgICAgMy4gUmVtb3ZlICpQdHIgY2xhc3Nlcy4KICAgICAgICAgICAgIEFzc3VtZSB0aGF0IHdlIGFyZSBTV0lHZ2luZyBhIGMrKyBjbGFzcyBDcHBDbGFzcy4KICAgICAgICAgICAgIEN1cnJlbnRseSBTV0lHIHdpbGwgZ2VuZXJhdGUgYm90aCBDcHBDbGFzc1B0ciBjbGFzcwogICAgICAgICAgICAgdGhhdCBob3N0cyBhbGwgbWV0aG9kcyBhbmQgYWxzbyBDcHBDbGFzcyB0aGF0IGlzIGRlcml2ZWQKICAgICAgICAgICAgIGZyb20gdGhlIGZvcm1lciBhbmQgY29udGFpbnMganVzdCB0aGUgY29uc3RydWN0b3IuCiAgICAgICAgICAgICBXaGVuIENwcENsYXNzIG1ldGhvZCBpcyBjYWxsZWQsIHRoZSBpbnRlcnByZXRlciB3aWxsIHRyeQogICAgICAgICAgICAgdG8gZmluZCBpdCBpbiB0aGUgQ3BwQ2xhc3MncyBkaWN0aW9uYXJ5IGZpcnN0LCBhbmQgb25seSB0aGVuCiAgICAgICAgICAgICBjaGVjayB0aGUgYmFzZSBjbGFzcy4KCiAgICAgICAgICAgICBDcHBDbGFzc1B0ciBmdW5jdGlvbmFsaXR5IG1heSBiZSBlbXVsYXRlZCB3aXRoOgoKICAgICAgICAgICAgIGltcG9ydCBuZXcKICAgICAgICAgICAgIF9uZXdfaW5zdGFuY2UgPSBuZXcuaW5zdGFuY2UKICAgICAgICAgICAgIGRlZiBDcHBDbGFzc1B0cih0aGlzKToKICAgICAgICAgICAgICAgICAgcmV0dXJuIF9uZXdfaW5zdGFuY2UoQ3BwQ2xhc3MsIHsidGhpcyI6dGhpcywidGhpc293biI6MH0pCgogICAgICAgICAgICAgVGhpcyBzYXZlcyB1cyBvbmUgZGljdGlvbmFyeSBsb29rdXAgcGVyIGNhbGwuCgogICAgICAgICAgICAgPERCPlRoZSBuZXcgbW9kdWxlIHdhcyBmaXJzdCBhZGRlZCBpbiBQeXRob24tMS41LjIgc28gaXQKICAgICAgICAgICAgIHdvbid0IHdvcmsgd2l0aCBvbGRlciB2ZXJzaW9ucy4gIEkndmUgaW1wbGVtZW50ZWQgYW4KICAgICAgICAgICAgIGFsdGVybmF0aXZlIHRoYXQgYWNoaWV2ZXMgdGhlIHNhbWUgdGhpbmc8L0RCPgoKICAgICAgICAgIDQuIFVzZSBDT2JqZWN0cyBpbnN0ZWFkIG9mIHN0cmluZ3MgZm9yIHBvaW50ZXJzLgoKICAgICAgICAgIERhdmU6IFRoaXMgZW5oYW5jZW1lbnRzIHJlc3VsdCBpbiBzcGVlZHVwcyBvZiB1cCB0byA1MCUgaW4gc29tZQogICAgICAgICAgb2YgdGhlIHByZWxpbWluYXJ5IHRlc3RzIEkgcmFuLgoKMi8xLzAwICA6IFVwZ3JhZGVkIHRoZSBQeXRob24gbW9kdWxlIHRvIHVzZSBhIG5ldyB0eXBlLWNoZWNraW5nIHNjaGVtZSB0aGF0CiAgICAgICAgICBpcyBtb3JlIG1lbW9yeSBlZmZpY2llbnQsIHByb3ZpZGVzIGJldHRlciBwZXJmb3JtYW5jZSwgYW5kCiAgICAgICAgICBpcyBsZXNzIGVycm9yIHByb25lLiBVbmZvcnR1bmF0ZWx5LCBpdCB3aWxsIGJyZWFrIGFsbCBjb2RlIHRoYXQKICAgICAgICAgIGRlcGVuZHMgb24gdGhlIFNXSUdfR2V0UHRyKCkgZnVuY3Rpb24gY2FsbCBpbiB0eXBlbWFwcy4KICAgICAgICAgIFRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgYmUgY2hhbmdlZCBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgIGlmIChTV0lHX0dldFB0cihzdHJpbmcsJnB0ciwiX0Zvb19wIikpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBiZWNvbWVzCgogICAgICAgICAgICAgICAgaWYgKFNXSUdfQ29udmVydFB0cihweW9iaiwgJnB0ciwgU1dJR19UWVBFX0Zvb19wKSA9PSAtMSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgIE5vdGU6IEluIHRoZSBuZXcgaW1wbGVtZW50YXRpb24gU1dJR19UWVBFX0Zvb19wIGlzIG5vIGxvbmdlcgogICAgICAgICAgYSB0eXBlLXNpZ25hdHVyZSBzdHJpbmcsIGJ1dCByYXRoZXIgYW4gaW5kZXggaW50byBhIHR5cGUKICAgICAgICAgIGVuY29kaW5nIHRhYmxlIHRoYXQgY29udGFpbnMgdHlwZSBpbmZvcm1hdGlvbi4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMS8zMC8wMCA6IGxvaWMKCSAgQ29uZGl0aW9uYWxseSBjb21waWxlIGV4cGVyaW1lbnRhbCBjb2RlIHdpdGggLS1lbmFibGUtZXhwZXJpbWVudAoJICBjb25maWd1cmUgZmxhZy4KCSAgRml4IC5jdnNpZ25vcmUgdG8gaWdub3JlIGNvbmZpZ3VyZSAmIHlhY2MgZ2VuZXJhdGVkIGZpbGVzCgoxLzI4LzAwIDogbG9pYwoJICBBcHBseSBhdXRvbWFrZSBldmVyeXdoZXJlCgkgIEtlZXAgY29uZmlndXJlIHNjcmlwdHMgc28gdGhhdCBwZW9wbGUgYXJlIG5vdCAqZm9yY2VkKiB0byBhdXRvY29uZgogICAgICAgICAgS2VlcCBzb3VyY2VzIGdlbmVyYXRlZCBieSB5YWNjIHNvIHRoYXQgY29tcGlsYXRpb24gd2l0aG91dCB5YWNjCgkgIGlzIHBvc3NpYmxlLgoJICBTb3VyY2UvTFBhcnNlL2NzY2FubmVyLmM6IGNoYW5nZSBseWFjYy5oIGludG8gcGFyc2VyLmggdG8gcGxlYXNlCgkgIGRlZmF1bHQgeWFjYyBnZW5lcmF0aW9uIHJ1bGVzLgoJICBVc2UgQUNfQ09ORklHX1NVQkRJUlMgaW4gY29uZmlndXJlLmluIGluc3RlYWQgb2YgaGFuZCBtYWRlIHNjcmlwdC4KCSAgVXBkYXRlIGFsbCByZWxldmFudCAuY3ZzaWdub3JlIHRvIGluY2x1ZGUgLmRlcHMKCSAgRml4ZWQgbWlzc2luZyA7IGxpbmUgMTM2IFNvdXJjZS9Td2lnL3N3aWcuaAoKMS8xMy8wMCA6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIGEgbnVtYmVyIG9mIG1pbm9yIGVuZC1vZi1maWxlIHBhcnNpbmcgcHJvYmxlbXMgaW4gdGhlCiAgICAgICAgICBwcmVwcm9jZXNzb3IuCgoxLzEzLzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgLWZyZWV6ZSBvcHRpb24gdGhhdCBmb3JjZXMgU1dJRyB0byBmcmVlemUgdXBvbiBleGl0LgogICAgICAgICAgVGhpcyBpcyBvbmx5IHVzZWQgYXMgYSBkZWJ1Z2dpbmcgdG9vbCBzbyB0aGF0IEkgY2FuIG1vcmUKICAgICAgICAgIGVhc2lseSBleGFtaW5lIFNXSUcncyBtZW1vcnkgZm9vdHByaW50LgoKMS8xMy8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIHBhdGNoIHRvIGd1aWxlIG1vZHVsZSBmb3Igc3VwcG9ydGluZyBvcHRpb25hbCBhcmd1bWVudHMKICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IERpZXRlciBCYXJvbi4KCjEvMTMvMDAgOiBsb2ljCgkgIEFkZGVkIC5jdnNpZ25vcmUsIEV4YW1wbGVzLy5jdnNpZ25vcmUsIFNvdXJjZS9ET0gvRG9oLy5jdnNpZ25vcmUKCSAgU291cmNlL1NXSUcxLjEvbWFpbi5jeHg6IEZpeGVkIC1JIGhhbmRsaW5nIGJ1ZwoJICBTb3VyY2UvTW9kdWxlczEuMS9qYXZhLmN4eDogZml4ZWQgY2hhciogLT4gY29uc3QgY2hhciogd2FybmluZ3MgdGhhdCBhcmUKCSAgZXJyb3JzIHdoZW4gY29tcGlsaW5nIHdpdGggZ2NjLTIuOTUuMgoJICBTb3VyY2UvU1dJRzEuMS9tYWluLmN4eDogY2FzdCBjb25zdCBjaGFyKiB0byBjaGFyKiBmb3IgU3RyaW5nX3JlcGxhY2UKCSAgdG9rZW4gYW5kIHJlcCBzaG91bGQgcmVhbGx5IGJlIGNvbnN0LgoKMS8xMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIEhhcmNvJ3MgSmF2YSBtb2R1bGVzLgoKMS8xMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIFJldm9rZWQgdGhlICVpZmRlZiwgJWlmbmRlZiwgJWVuZGlmLCAlaWYsICVlbGlmLCBhbmQgJWVsc2UKICAgICAgICAgIGRpcmVjdGl2ZXMuICBUaGVzZSBhcmUgbm8gbG9uZ2VyIG5lZWRlZCBhcyBTV0lHIG5vdyBoYXMgYSByZWFsCiAgICAgICAgICBwcmVwcm9jZXNzb3IuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEvMTIvMDAgOiBiZWF6bGV5CiAgICAgICAgICBNb3ZlZCB0aGUgZG9jdW1lbnRhdGlvbiBtb2R1bGVzIGZyb20gdGhlIFNXSUcgZGlyZWN0b3J5CiAgICAgICAgICB0byB0aGUgTW9kdWxlcyBkaXJlY3RvcnkgKHdoZXJlIHRoZXkgcmVhbGx5IHNob3VsZCBoYXZlIGJlZW4KICAgICAgICAgIHRvIGJlZ2luIHdpdGgpLgoKMS8xMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIFJlbW92ZWQgdGhlIC1zdGF0IG9wdGlvbiBmb3IgcHJpbnRpbmcgc3RhdGlzdGljcy4gVGhlCiAgICAgICAgICBzdGF0aXN0aWNzIHJlcG9ydGluZyB3YXMgaW5hZGVxdWF0ZSBhbmQgbW9zdGx5IGJyb2tlbgogICAgICAgICAgYW55d2F5LgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxLzEyLzAwIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCB0aGUgLXQgb3B0aW9uIGZvciByZWFkaW5nIGEgdHlwZW1hcCBmaWxlLiAgTW9yZQogICAgICAgICAgdHJvdWJsZSB0aGFuIGl0J3Mgd29ydGguICBKdXN0IGluY2x1ZGUgdHlwZW1hcHMgYXQgdGhlIHRvcAogICAgICAgICAgb2YgdGhlIGludGVyZmFjZSBmaWxlLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxLzEyLzAwIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCB0aGUgJWNoZWNrb3V0IGRpcmVjdGl2ZS4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMS8xMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIFJlbW92ZWQgdGhlIC1jaSBvcHRpb24gZm9yIGZpbGUgY2hlY2tpbi4gICBUb28gcHJvYmxlbWF0aWMKICAgICAgICAgIHRvIGltcGxlbWVudC4gIFByb2JhYmx5IGJldHRlciB0byBqdXN0IHB1dCB5b3VyIFNXSUcgbGlicmFyeQogICAgICAgICAgdW5kZXIgQ1ZTIGluc3RlYWQuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiouCgoxLzExLzAwIDogYmVhemxleQogICAgICAgICAgRGVsZXRlZCB0aGUgTEFURVggbW9kdWxlLiAgU29ycnkuLi4gRGlkbid0IGtub3cgYW55b25lCiAgICAgICAgICB3aG8gd2FzIHVzaW5nIGl0LiAgQmVzaWRlcywgSSdtIGxvb2tpbmcgdG8gc2ltcGxpZnkKICAgICAgICAgIHRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbS4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMS8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIE1vZGlmaWVkIHRoZSBBU0NJSSBkb2N1bWVudGF0aW9uIG1vZHVsZSB0byB1c2UgYSAudHh0CiAgICAgICAgICBzdWZmaXggZm9yIGl0cyBvdXRwdXQgZmlsZSBpbnN0ZWFkIG9mIC5kb2MuCgoxLzExLzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgdGhlIGxvbmctbG9zdCBTV0lHIHByZXByb2Nlc3NvciBiYWNrIHRvIHRoZSBzeXN0ZW0uCiAgICAgICAgICBJdCBzaG91bGQgYmUgZW5hYmxlZCBieSBkZWZhdWx0LiAgUmF3IHByZXByb2Nlc3NlZCBvdXRwdXQKICAgICAgICAgIGNhbiBiZSB2aWV3ZWQgdXNpbmcgc3dpZyAtRSBmaWxlLmkuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxLzExLzAwIDogYmVhemxleSBhbmQgZGptaXRjaGUKICAgICAgICAgIENvbXBsZXRlbHkgcmVvcmdhbml6ZWQgdGhlIFNXSUcgZGlyZWN0b3J5IHN0cnVjdHVyZS4gIFRoZQogICAgICAgICAgYmFzaWMgb3JnYW5pemF0aW9uIGlzIG5vdzoKCiAgICAgICAgICAgICAgICBTb3VyY2UvICAgICAgICAgU1dJRyBzb3VyY2UgY29kZQogICAgICAgICAgICAgICAgTGliLyAgICAgICAgICAgIFNXSUcgbGlicmFyeSBmaWxlcyAoc3dpZ19saWIpCiAgICAgICAgICAgICAgICBEb2MvICAgICAgICAgICAgRG9jdW1lbnRhdGlvbgogICAgICAgICAgICAgICAgRXhhbXBsZXMvICAgICAgIEV4YW1wbGVzCgogICAgICAgICAgTW9yZSBkaXJlY3RvcmllcyB3aWxsIGJlIGFkZGVkIGFzIG5lZWRlZC4KCjEyLzA4Lzk5OiBMb2ljIERhY2hhcnkgKGxvaWNAc2VuZ2Eub3JnKQoJICBFbmhhbmNlZCBwYWNrYWdlIGhhbmRsaW5nIGZvciBwZXJsNSBhbmQgYysrLgoKCSAgV2l0aCBuZXcgb3B0aW9uIC1oaWRlIEZvbzo6QmFyLCBldmVyeSBwZXJsNSBvYmplY3QgKEZyb2IpIGlzCgkgIHF1YWxpZmllZCBieSBGb286OkJhcjo6RnJvYi4gVGhlIHBhY2thZ2UgbmFtZSBpcyBzb2xlbHkgdXNlZAoJICB0byBlbmNhcHN1bGF0ZSBDL0MrKyB3cmFwcGVycyBvdXRwdXQgaW4gPG1vZHVsZT5fd3JhcC5jIGFuZCB0aGUKCSAgY29ycmVzcG9uZGluZyBwZXJsIHBhY2thZ2UgaW4gPG1vZHVsZT4ucG0uIE5vdGUgdGhhdCBhIHBhY2thZ2UKCSAgbmFtZSBtYXkgY29udGFpbiA6OiAoRnJvYjo6Tml0eikgYW5kIHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlCgkgIHBhY2thZ2UgbmFtZSBwcm92aWRlZCBieSAtaGlkZSAoRm9vOjpCYXI6OkZyb2I6Ok5pdHopLgoKCSAgSW4gKl93cmFwLmMsIFNXSUdfaW5pdCBtYWNybyBpcyB1c2VkLiBXYXMgcHJldmlvdXNseSBkZWZpbmVkCgkgIGJ1dCBub3QgdXNlZCBhbmQgc2ltcGxpZmllcyBjb2RlLgoKCSAgQWRkZWQgdHlwZW1hcChwZXJsNSxwZXJsNWluKSBhbmQgdHlwZW1hcChwZXJsNSxwZXJsNW91dCkgdGhhdAoJICBkbyB0aGUgZXF1aXZhbGVudCBvZiB0eXBlbWFwKHBlcmw1LGluKSBhbmQgdHlwZW1hcChwZXJsNSxvdXQpCgkgIGJ1dCBjb250YWluIHBlcmwgY29kZSBhbmQgYXBwbGllcyB0byB3cmFwcGVycyBnZW5lcmF0ZWQgYnkKCSAgLXNoYWRvdy4KCgkgIExhY2tpbmcgcHJvcGVyIHJlZ3Jlc3Npb24gdGVzdHMgSSB1c2VkCgkgIEV4YW1wbGVzL3Blcmw1L3tjKyssY29uc3RyYWludCxkZWZhcmcsZXhjZXB0LAoJICBncmFwaC9ncmFwaFsxMjM0XSxtdWx0aW5oZXJpdCxuZXN0ZWQsc2hhZG93LHNpbXBsZSx0cmVlLAoJICB0eXBlbWFwcy97YXJndixhcmd2MixhcnJheW1lbWJlcixkYXRhYmFzZSxmaWxlLGlnbm9yZSxpbnRlZ2VyLAoJICBvdXRwdXQscGFzc3JlZixyZWZlcmVuY2UscmV0dXJufX0vLiBJIHJhbiBzd2lnIHdpdGggYW5kIHdpdGhvdXQKCSAgdGhlIHBhdGNoZXMsIGRpZmYgdGhlIGdlbmVyYXRlZHNvdXJjZXMsIHJ1biB0aGUgLnBsIGZpbGVzCgkgIGFuZCBjaGVja2VkIHRoYXQgdGhlIHJlc3VsdHMgYXJlIGlkZW50aWNhbC4gSW4gYWxsIHRob3NlIGV4YW1wbGVzCgkgIEkgaGFkIG5vIGVycm9yLgoKMTEvMjEvOTk6IE1vZGlmaWVkIHRoZSBUY2wgbW9kdWxlIHRvIHByb3ZpZGUgZnVsbCB2YXJpYWJsZSBsaW5raW5nIGNhcGFiaWxpdGllcwogICAgICAgICAgdG8gYWxsIGRhdGF0eXBlcy4gICBJbiBwcmV2aW91cyB2ZXJzaW9ucywgYSBwYWlyIG9mIGFjY2Vzc29yIGZ1bmN0aW9ucwogICAgICAgICAgd2VyZSBjcmVhdGVkIGZvciBkYXRhdHlwZXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIFRjbF9MaW5rVmFyKCkgZnVuY3Rpb24uCiAgICAgICAgICBOb3csIHdlIHNpbXBseSB1c2UgdmFyaWFibGUgdHJhY2VzIHRvIHN1cHBvcnQgZXZlcnl0aGluZy4gVGhpcyBtYXkKICAgICAgICAgIGJyZWFrIHNjcmlwdHMgdGhhdCByZWx5IHVwb24gdGhlIG9sZGVyIGJlaGF2aW9yLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8yMS85OTogQWRkZWQgc2xpZ2h0IHR3ZWFrIHRvIHdyYXBwZXIgZ2VuZXJhdG9yIHRvIGNvbGxlY3QgbG9jYWwgdmFyaWFibGVzCiAgICAgICAgICBvZiBzaW1pbGFyIHR5cGUuICBQcm9kdWNlcyBzb21ld2hhdCBtb3JlIGNvbXBhY3Qgd3JhcHBlciBjb2RlLgoKMTEvMjAvOTk6IE1vZGlmaWVkIHRoZSBUY2wgbW9kdWxlIHRvIHVzZSBTV0lHX0dldEFyZ3MoKSB0byBwYXJzZQogICAgICAgICAgYXJndW1lbnRzLiAgICBUaGlzIGlzIGEgdGVjaG5pcXVlIGJvcnJvd2VkIGZyb20gUHl0aG9uIGluIHdoaWNoCiAgICAgICAgICBhcmd1bWVudHMgYXJlIGNvbnZlcnRlZCB1c2luZyBhIGZvcm1hdCBzdHJpbmcgY29udmVudGlvbiBzaW1pbGlhcgogICAgICAgICAgdG8gZnByaW50ZigpLiAgIFRoaXMgcmVzdWx0cyBpbiBhICpzdWJzdGFudGlhbCogcmVkdWN0aW9uIGluIHRoZQogICAgICAgICAgc2l6ZSBvZiB0aGUgcmVzdWx0aW5nIHdyYXBwZXIgY29kZSB3aXRoIG9ubHkgYSBtb2Rlc3QgcnVudGltZSBvdmVyaGVhZAogICAgICAgICAgaW4gZ29pbmcgdGhyb3VnaCB0aGUgZXh0cmEgY29udmVyc2lvbiBmdW5jdGlvbi4KCjExLzEzLzk5OiBDb21wbGV0ZWx5IHJld3JvdGUgdGhlIGNsYXNzL3N0cnVjdHVyZSBnZW5lcmF0aW9uIGNvZGUgZm9yIHRoZQogICAgICAgICAgVGNsIG1vZHVsZS4gIE5vdywgYSBzbWFsbCBzZXQgb2YgcnVudGltZSBmdW5jdGlvbnMgYXJlIHVzZWQKICAgICAgICAgIHRvIGltcGxlbWVudCB0aGUgZnVuY3Rpb25hbGl0eSBmb3IgYWxsIGNsYXNzZXMgKGluc3RlYWQgb2YgYQogICAgICAgICAgbWFzc2l2ZSBhbW91bnQgb2YgcnVudGltZSBjb2RlIGJlaW5nIGdlbmVyYXRlZCBmb3IgZWFjaCBjbGFzcykuCiAgICAgICAgICBDbGFzcyBzcGVjaWZpYyBpbmZvcm1hdGlvbiBpcyBzaW1wbHkgZW5jb2RlZCBpbiBhIHNlcmllcyBvZgogICAgICAgICAgc3RhdGljIHRhYmxlcy4gICBUaGlzIHJlc3VsdHMgaW4gYSAqSFVHRSogcmVkdWN0aW9uIGluIHdyYXBwZXIKICAgICAgICAgIGNvZGUgc2l6ZS0tZXNwZWNpYWxseSBmb3IgQysrLgoKMTEvMTMvOTk6IFJlbW92ZWQgdGhlIC10Y2wgKFRjbCA3LngpIG1vZHVsZS4gIFRjbCA4LjAgaXMgbm93IHNldmVyYWwKICAgICAgICAgIHllYXJzIG9sZCBhbmQgdGhlIGRlZmFjdG8gc3RhbmRhcmQtLW5vIHJlYWwgcmVhc29uIHRvIGtlZXAKICAgICAgICAgIHN1cHBvcnRpbmcgdGhlIG9sZCB2ZXJzaW9uIGF0IHRoaXMgcG9pbnQuCgoxMS8xMy85OTogQ2xlYW5lZCB1cCAtYyBvcHRpb24gZm9yIFB5dGhvbiBtb2R1bGUuICBUaGUgcHlleHAuc3dnIGZpbGUKICAgICAgICAgIGlzIG5vdyBnb25lLgoKMTEvMTMvOTk6IEZpeGVkIGV4dGVybmFsIGRlY2xhcmF0aW9ucyB0byB3b3JrIGJldHRlciB3aXRoIHN0YXRpYyBsaW5raW5nCiAgICAgICAgICBvbiBXaW5kb3dzLiAgU3RhdGljIGxpbmtpbmcgc2hvdWxkIG5vdyBiZSBwb3NzaWJsZSBieSBkZWZpbmluZwogICAgICAgICAgdGhlIC1EU1RBVElDX0xJTksgb3B0aW9uIG9uIHRoZSBjb21tYW5kIGxpbmUuICBQYXRjaCBjb250cmlidXRlZAogICAgICAgICAgYnkgQWxiZXJ0byBGb25zZWNhLgoKMTEvNS85OSA6IEZpeGVkIGFuIG9ic2N1cmUgY29kZSBnZW5lcmF0aW9uIGJ1ZyByZWxhdGVkIHRvIHRoZSBnZW5lcmF0aW9uCiAgICAgICAgICBvZiBkZWZhdWx0IGNvbnN0cnVjdG9ycy4gICBCdWcgcmVwb3J0ZWQgYnkgQnJhZCBDbGVtZW50cy4KCjExLzUvOTkgOiBGaXhlZCBhIGZldyBtZW1vcnkgcHJvYmxlbXMgZm91bmQgYnkgcHVyaWZ5LgoKMTEvNS85OSA6IE9mZmljaWFsbHkgZGVwcmVjYXRlZCB0aGUgLWh0Y2wsIC1odGssIGFuZCAtcGx1Z2luIG9wdGlvbnMKICAgICAgICAgIGZyb20gdGhlIFRjbCBhbmQgVGNsOCBtb2R1bGVzLgoKMTAvMjYvOTk6IFJlbW92ZWQgdW51c2VkIHZhcmlhYmxlIGZyb20gcHl0aG9uL3R5cGVtYXBzLmkuICBQYXRjaAogICAgICAgICAgY29udHJpYnV0ZWQgYnkgS2VpdGggRGF2aWRzb24uCgo4LzE2Lzk5IDogQWRkZWQgX1dJTjMyIHN5bWJvbCB0byBsaWJyYXJpZXMgdG8gYmV0dGVyIHN1cHBvcnQgV2luZG93cy4KCjgvMTYvOTkgOiBEZXByZWNhdGVkIHRoZSBQZXJsNCBtb2R1bGUuICAgSXQgaXMgbm8gbG9uZ2VyIGluY2x1ZGVkIGluIHRoZQogICAgICAgICAgZGlzdHJpYnV0aW9uIGFuZCBubyBsb25nZXIgc3VwcG9ydGVkLiAgSW4gdGhlIGVudGlyZSAzIHllYXJzIFNXSUcKICAgICAgICAgIGhhcyBiZWVuIGFyb3VuZCBJIG5ldmVyIHJlY2VpdmVkIGEgc2luZ2xlIGNvbW1lbnQgYWJvdXQgaXQgc28gSSdtCiAgICAgICAgICBhc3N1bWluZyBubyBvbmUgd2lsbCBtaXNzIGl0Li4uCgo4LzE2Lzk5IDogTW9kaWZpZWQgdGhlIHR5cGUtY2hlY2tpbmcgY29kZSB0byByZWdpc3RlciB0eXBlIG1hcHBpbmdzIHVzaW5nIGEKICAgICAgICAgIHRhYmxlIGluc3RlYWQgb2YgcmVwZWF0ZWQgY2FsbHMgdG8gU1dJR19SZWdpc3Rlck1hcHBpbmcoKS4gIFRoaXMKICAgICAgICAgIHJlZHVjZXMgdGhlIHNpemUgb2YgdGhlIG1vZHVsZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBzb21ld2hhdC4KCjgvMTUvOTkgOiBDbGVhbmVkIHVwIHRoZSBwb2ludGVyIHR5cGUtY2hlY2tpbmcgY29kZSBpbiB0aGUgVGNsIG1vZHVsZS4KCjgvMTUvOTkgOiBNYW55IGNoYW5nZXMgdG8gdGhlIGxpYnJhcmllcyB0byBzdXBwb3J0IHJ1bnRpbWUgbGlicmFyaWVzLgoKOC8xMy85OSA6IEVsaW1pbmF0ZWQgQysrIGNvbXBpbGVyIHdhcm5pbmcgbWVzc2FnZXMgYWJvdXQgZXh0ZXJuICJDIiBsaW5rYWdlLgoKOC8xMy85OSA6IFNvbWUgY2xlYW51cCBvZiBQeXRob24gLnN3ZyBmaWxlcyB0byBiZXR0ZXIgc3VwcG9ydCBydW50aW1lIGxpYnJhcmllcwogICAgICAgICAgb24gV2luZG93cy4KCjgvMTMvOTkgOiBNb2RpZmllZCB0aGUgJXByYWdtYSBkaXJlY3RpdmUgdG8gYXR0YWNoIHByYWdtYXMgZGVjbGFyZWQgaW5zaWRlCiAgICAgICAgICBhIGNsYXNzIGRlZmluaXRpb24gdG8gdGhlIGNsYXNzIGl0c2VsZi4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBjbGFzcyBmb28gewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICVwcmFnbWEocHl0aG9uKSBhZGR0b21ldGhvZCA9ICJpbnNlcnQ6cHJpbnQgYGhlbGxvIHdvcmxkJyIKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgIE1vc3QgcGVvcGxlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgaG93IHRoaXMgd29ya3MuICBGb3IgcGVvcGxlCiAgICAgICAgICB3cml0aW5nIGJhY2tlbmQgbW9kdWxlcywgY2xhc3MtYmFzZWQgcHJhZ21hcyB3b3JrIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgbGFuZy0+Y3BwX29wZW5fY2xhc3MoKSAgICAgICAgICAgICAvLyBPcGVuIGEgY2xhc3MKICAgICAgICAgICAgICBsYW5nLT5jcHBfcHJhZ21hKCkgICAgICAgICAgICAgICAgIC8vIFN1cHBseSBwcmFnbWFzCiAgICAgICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbWl0IG1lbWJlcnMKCiAgICAgICAgICAgICAgbGFuZy0+Y3BwX2Nsb3NlX2NsYXNzKCkgICAgICAgICAgICAvLyBDbG9zZSB0aGUgY2xhc3MKCiAgICAgICAgICBBbGwgb2YgdGhlIHByYWdtYXMgYXJlIHBhc3NlZCBmaXJzdCBzaW5jZSB0aGV5IG1pZ2h0IGJlIHVzZWQgdG8KICAgICAgICAgIGFmZmVjdCB0aGUgY29kZSBnZW5lcmF0aW9uIG9mIG90aGVyIG1lbWJlcnMuICAgUGxlYXNlIHNlZQogICAgICAgICAgdGhlIFB5dGhvbiBtb2R1bGUgZm9yIGFuIGV4YW1wbGUuICAgUGF0Y2hlcyBjb250cmlidXRlZAogICAgICAgICAgYnkgUm9iaW4gRHVubi4KCjgvMTMvOTkgOiBQYXRjaCB0byBQeXRob24gc2hhZG93IGNsYXNzZXMgdG8gZWxpbWluYXRlIGlnbm9yZWQKICAgICAgICAgIGV4Y2VwdGlvbiBlcnJvcnMgaW4gZGVzdHJ1Y3RvcnMuICBQYXRjaCBjb250cmlidXRlZAogICAgICAgICAgYnkgUm9iaW4gRHVubi4KCjgvMTEvOTkgOiBNaW5vciBwYXRjaCB0byBzd2lnX2xpYi9weXRob24vc3dpZ3B0ci5zd2cgIChhZGRlZCBTV0lHU1RBVElDCiAgICAgICAgICBkZWNsYXJhdGlvbikuICBQYXRjaCBjb250cmlidXRlZCBieSBMeWxlIEpvaG5zb24uCgo4LzExLzk5IDogQWRkZWQgRklSU1RLRVkvTkVYVEtFWSBtZXRob2RzIHRvIFBlcmw1IHNoYWRvdyBjbGFzc2VzCiAgICAgICAgICBQYXRjaCBjb250cmlidXRlZCBieSBEZW5uaXMgTWFyc2EuCgo4LzExLzk5IDogTW9kaWZpZWQgUHl0aG9uIG1vZHVsZSBzbyB0aGF0IE5VTEwgcG9pbnRlcnMgYXJlIHJldHVybmVkCiAgICAgICAgICBhbmQgcGFzc2VkIGFzICdOb25lLicgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IFRhbCBTaGFsaWYuCgo4LzEwLzk5IDogRml4ZWQgbWlzc2luZyAnaW50JyBzcGVjaWZpZXJzIGluIHZhcmlvdXMgcGxhY2VzLgoKOC8xMC85OSA6IEFkZGVkIFdpbmRvd3MgbWFrZWZpbGUgZm9yIFJ1bnRpbWUgbGlicmFyaWVzLiAgQ29udHJpYnV0ZWQKICAgICAgICAgIGJ5IEJvYiBUZWNoZW50aW4uCgo4LzEwLzk5IDogRml4ZWQgbWlub3IgcHJvYmxlbSBpbiBQeXRob24gcnVudGltZSBtYWtlZmlsZSBpbnRyb2R1Y2VkCiAgICAgICAgICBieSBrZXl3b3JkIGFyZ3VtZW50cy4KCjgvOC85OSAgOiBDaGFuZ2VkICR0YXJnZXQgb2YgcGVybDUob3V0KSB0eXBlbWFwIGZyb20gU1QoMCkgdG8KICAgICAgICAgIFNUKGFyZ3ZpKS4gIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IEdlb2ZmcmV5IEhvcnQuCgo4LzgvOTkgIDogRml4ZWQgYnVnIGluIHR5cGVtYXAgY2hlY2tpbmcgcmVsYXRlZCB0byB0aGUgQU5ZIGtleXdvcmQKICAgICAgICAgIGluIGFycmF5cyBhbmQgaWdub3JlZCBhcmd1bWVudHMuICBFcnJvciByZXBvcnRlZCBieQogICAgICAgICAgR2VvZmZyZXkgSG9ydC4KCjgvOC85OSAgOiAlZW5hYmxlZG9jIGFuZCAlZGlzYWJsZWRvYyBkaXJlY3RpdmVzIGNhbiBub3cgYmUgdXNlZAogICAgICAgICAgaW5zaWRlIGNsYXNzL3N0cnVjdHVyZSBkZWZpbml0aW9ucy4gICBIb3dldmVyLCBubyBjaGVjawogICAgICAgICAgaXMgbWFkZSB0byBzZWUgaWYgdGhleSBhcmUgYmFsYW5jZWQgKGkuZS4sIGEgJWRpc2FibGVkb2MKICAgICAgICAgIGRpcmVjdGl2ZSBpbnNpZGUgYSBjbGFzcyBkb2VzIG5vdCBoYXZlIHRvIGhhdmUgYSBtYXRjaGluZwogICAgICAgICAgJWVuYWJsZWRvYyBpbiB0aGUgc2FtZSBjbGFzcykuCgo4LzgvOTkgIDogS2V5d29yZCBhcmd1bWVudCBoYW5kbGluZyBpcyBub3cgc3VwcG9ydGVkIGluIHRoZSBQeXRob24KICAgICAgICAgIG1vZHVsZS4gICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGludCBmb28oY2hhciAqYmFyLCBpbnQgc3BhbSwgZG91YmxlIHgpOwoKICAgICAgICAgIENhbiBiZSBjYWxsZWQgZnJvbSBQeXRob24gYXMKCiAgICAgICAgICAgICAgIGZvbyh4ID0gMy40LCBiYXI9ImhlbGxvIiwgc3BhbT00MikKCiAgICAgICAgICBUbyBlbmFibGUgdGhpcyBmZWF0dXJlLCBydW4gU1dJRyB3aXRoIHRoZSAnLWtleXdvcmQnIGNvbW1hbmQKICAgICAgICAgIGxpbmUgb3B0aW9uLiAgICBNaXhpbmcga2V5d29yZCBhbmQgZGVmYXVsdCBhcmd1bWVudHMKICAgICAgICAgIHNob3VsZCB3b3JrIGFzIHdlbGwuICAgVW5uYW1lZCBhcmd1bWVudHMgYXJlIGFzc2lnbmVkIG5hbWVzCiAgICAgICAgICBzdWNoIGFzICJhcmcxIiwgImFyZzIiLCBldGMuLi4KCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgIEZ1bmN0aW9ucyB3aXRoIGR1cGxpY2F0ZSBhcmd1bWVudCBuYW1lcyBzdWNoIGFzCiAgICAgICAgICBiYXIoaW50ICpPVVRQVVQsIGludCAqT1VUUFVUKSB3aWxsIGxpa2VseSBjYXVzZSBwcm9ibGVtYXRpYwogICAgICAgICAgd3JhcHBlciBjb2RlIHRvIGJlIGdlbmVyYXRlZC4gICBUbyBmaXggdGhpcywgIHVzZSBkaWZmZXJlbnQKICAgICAgICAgIG5hbWVzIG9yIHVzZSAlYXBwbHkgdG8gbWFwIHR5cGVtYXBzIHRvIGFsdGVybmF0ZSBuYW1lcy4KCjgvOC85OSAgOiBIYW5kbGluZyBvZiB0aGUgJ3RoaXMnIHBvaW50ZXIgaGFzIGJlZW4gY2hhbmdlZCBpbiBQeXRob24gc2hhZG93CiAgICAgICAgICBjbGFzc2VzLiAgUHJldmlvdXNseSwgZGVyZWZlcmVuY2luZyBvZiAnLnRoaXMnIG9jY3VycmVkIGluIHRoZQogICAgICAgICAgUHl0aG9uIHNoYWRvdyBjbGFzcyBpdHNlbGYuICAgTm93LCB0aGlzIHN0ZXAgb2NjdXJzIGluIHRoZSBDCiAgICAgICAgICB3cmFwcGVycyB1c2luZyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uOgoKICAgICAgICAgICAgICAgIFNXSUdfR2V0UHRyT2JqKFB5T2JqZWN0ICosIHZvaWQgKipwdHIsIGNoYXIgKnR5cGUpCgogICAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW4gYWNjZXB0IGVpdGhlciBhIHN0cmluZyBjb250YWluaW5nIGEgcG9pbnRlcgogICAgICAgICAgb3IgYSBzaGFkb3cgY2xhc3MgaW5zdGFuY2Ugd2l0aCBhICcudGhpcycgYXR0cmlidXRlIG9mCiAgICAgICAgICBhcHByb3ByaWF0ZSB0eXBlLiAgVGhpcyBjaGFuZ2UgYWxsb3dzIHRoZSBmb2xsb3dpbmc6CgogICAgICAgICAgMS4gIFRoZSByZWFsIHNoYWRvdyBjbGFzcyBpbnN0YW5jZSBmb3IgYW4gb2JqZWN0IGlzCiAgICAgICAgICAgICAgcGFzc2VkIHRvIHRoZSBDIHdyYXBwZXJzIHdoZXJlIGl0IGNhbiBiZSBleGFtaW5lZC9tb2RpZmllZAogICAgICAgICAgICAgIGJ5IHR5cGVtYXBzLgoKICAgICAgICAgIDIuICBIYW5kbGluZyBvZiBkZWZhdWx0L2tleXdvcmQgYXJndW1lbnRzIGlzIG5vdyBncmVhdGx5CiAgICAgICAgICAgICAgc2ltcGxpZmllZC4KCiAgICAgICAgICAzLiAgVGhlIFB5dGhvbiB3cmFwcGVyIGNvZGUgaXMgbXVjaCBtb3JlIHNpbXBsZS4KCiAgICAgICAgICBQbHVzLCBpdCBlbGltaW5hdGVkIG1vcmUgdGhhbiAzMDAgbGluZXMgb2YgQysrIGNvZGUgaW4gdGhlCiAgICAgICAgICBQeXRob24gbW9kdWxlLgoKICAgICAgICAgICoqKiBDQVZFQVQgOiBUaGlzIHJlcXVpcmVzIHRoZSBhYnN0cmFjdCBvYmplY3QgaW50ZXJmYWNlLgogICAgICAgICAgSXQgc2hvdWxkIHdvcmsgd2l0aCBQeXRob24gMS40LCBidXQgcHJvYmFibHkgbm90aGluZyBvbGRlcgogICAgICAgICAgdGhhbiB0aGF0LgoKCjgvOC85OSAgOiBGaXhlZCBoYW5kbGluZyBvZiAiY29uc3QiIGFuZCBwb2ludGVycyBpbiBjbGFzc2VzLiAgSW4gcGFydGljdWxhciwKICAgICAgICAgIGRlY2xhcmF0aW9ucyBzdWNoIGFzCgogICAgICAgICAgIGNsYXNzIGZvbyB7CiAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1zZzsKICAgICAgICAgICAgIGNvbnN0IGludCAgKmlwdHI7CiAgICAgICAgICB9CgogICAgICAgICAgYXJlIGhhbmRsZWQgYXMgYXNzaWduYWJsZSB2YXJpYWJsZXMgYXMgb3Bwb3NlZCB0byBjb25zdGFudAogICAgICAgICAgdmFsdWVzICh0aGlzIGlzIHRoZSBjb3JyZWN0IGJlaGF2aW9yIGluIEMvQysrKS4gICBOb3RlOgogICAgICAgICAgZGVjbGFyYXRpb25zIHN1Y2ggYXMgImNoYXIgKmNvbnN0IG1zZyIgYXJlIHN0aWxsIHVuc3VwcG9ydGVkLgogICAgICAgICAgQ29uc3RhbnRzIGRlY2xhcmVkIGF0IHRoZSBnbG9iYWwgbGV2ZWwgdXNpbmcgY29uc3QgYXJlIGFsc28KICAgICAgICAgIGJyb2tlbiAoYmVjYXVzZSBJIGhhdmUgYSBudW1iZXIgb2YgaW50ZXJmYWNlcyB0aGF0IHJlbHkgdXBvbgogICAgICAgICAgdGhpcyBiZWhhdmlvcikuCgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqICBUaGlzIG1heSBicmVhayBpbnRlcmZhY2VzIHRoYXQKICAgICAgICAgIG1pc3Rha2VubHkgdHJlYXQgJ2NvbnN0IGNoYXIgKicgdHlwZXMgYXMgY29uc3RhbnQgdmFsdWVzLgoKOC84Lzk5ICA6IE1vZGlmaWVkIHRoZSBwYXJzZXIgdG8gc3VwcG9ydCBiaXQtZmllbGRzLiAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICB0eXBlZGVmIHN0cnVjdCB7CiAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGlzX2tleXdvcmQgOiAxOwogICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpc19leHRlcm4gIDogMTsKICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaXNfc3RhdGljICA6IDE7CiAgICAgICAgICB9IGZsYWdzOwoKICAgICAgICAgIEJpdC1maWVsZHMgY2FuIG9ubHkgYmUgYXBwbGllZCB0byBpbnRlZ2VyIHR5cGVzIGFuZCB0aGVpcgogICAgICAgICAgYXJlIG90aGVyIHJlc3RyaWN0aW9ucy4gIFNXSUcgcGVyZm9ybXMgbm8gc3VjaCB0eXBlLWNoZWNraW5nCiAgICAgICAgICAoYWx0aG91Z2ggdGhlIEMgY29tcGlsZXIgd2lsbCBjYXRjaCBwcm9ibGVtcyB3aGVuIGl0IHRyaWVzIHRvCiAgICAgICAgICBjb21waWxlIHRoZSB3cmFwcGVyIGNvZGUpLgoKOC84Lzk5ICA6IFJlbW92ZWQgdHJhaWxpbmcgc3BhY2Ugb2YgJGJhc2V0eXBlIHN1YnN0aXR1dGlvbiBpbiB0eXBlbWFwcy4KICAgICAgICAgIFRoaXMgaXMgdG8gYWxsb3cgdGhpbmdzIGxpa2UgdGhpczoKCiAgICAgICAgICAldHlwZW1hcChweXRob24sIGFyZ291dCkgc3BhbSoqIE9VVFBVVHsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICBjaGFyKiBhID0gIiRiYXNldHlwZV9wIjsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgIH0KCiAgICAgICAgICAoUGF0Y2ggc3VnZ2VzdGVkIGJ5IE5hdGhhbiBEdW5maWVsZCkuCgo2LzIyLzk5IDogTWFkZSBhIHZlcnkgc2xpZ2h0IHR3ZWFrIHRvIHRoZSBQZXJsNSBzaGFkb3cgY2xhc3MKICAgICAgICAgIGNvZGUgdGhhdCBhbGxvd3MgdHlwZW1hcHMgdG8gYWx0ZXIgdGhlIHJldHVybiB0eXBlCiAgICAgICAgICBvZiBvYmplY3RzICh0byBzdXBwb3J0IHBvbHltb3JwaGljIHR5cGVzKS4gIFBhdGNoCiAgICAgICAgICBjb250cmlidXRlZCBieSBEcmFrZSBEaWVkcmljaC4KCjQvOC85OSAgOiBGaXhlZCBudWxsIHBvaW50ZXIgaGFuZGxpbmcgYnVnIGluIFBlcmwgbW9kdWxlLgogICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgSnVuaW8gSGFtYW5vLgoKMy8xNy85OSA6IEZpeGVkIGJ1ZyBpbiBwZXJsNXB0ci5zd2cgZm9yIEFjdGl2ZVN0YXRlIFBlcmwuCiAgICAgICAgICBQYXRjaCBjb250cmlidXRlZCBieSBHcmVnIEFuZGVyc29uLgoKMi8yNy85OSA6IEVsaW1pbmF0ZWQgc2VnbWVudGF0aW9uIGZhdWx0IHdoZW4gU3dpZyBydW5zIG9uCiAgICAgICAgICBlbXB0eSBmaWxlcy4KCjIvMjcvOTkgOiBBZGRlZCBwYXRjaCB0byBHdWlsZSBtb2R1bGUgdG8gZWxpbWluYXRlIHVudXNlZAogICAgICAgICAgdmFyaWFibGVzLiAgIENvbnRyaWJ1dGVkIGJ5IE1pa2UgU2ltb25zLgoKMi8yNy85OSA6IEZpeGVkIHByb2JsZW0gd2l0aCAlYWRkbWV0aG9kcyByZXR1cm5pbmcgcmVmZXJlbmNlcy4KCjIvMjcvOTkgOiBGaXhlZCBSdW50aW1lL01ha2VmaWxlLiBQYXRjaCBjb250cmlidXRlZCBieQogICAgICAgICAgTWlrZSBSb21iZXJnLgoKMi8yNy85OSA6IEluY29ycG9yYXRlZCBwYXRjaGVzIHRvIHRoZSB0eXBlLWNoZWNrZXIuCgoyLzI3Lzk5IDogRml4ZWQgcHJvYmxlbSB3aXRoIC1leHBvcnRhbGwgc3dpdGNoIGFuZCBzaGFkb3cgY2xhc3NlcwogICAgICAgICAgaW4gUGVybDUgbW9kdWxlLiAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgRGVubmlzIE1hcnNhLgoKMi8yNy85OSA6IE1vZGlmaWVkIFBlcmw1IG1vZHVsZSB0byByZWNvZ25pemUgJ3VuZGVmJyBhcyBhIE5VTEwgY2hhciAqLgogICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgSnVuaW8gSGFtYW5vLgoKMi8yNy85OSA6IEZpeGVkIHRoZSBQZXJsNSBtb2R1bGUgdG8gc3VwcG9ydCB0aGUgbmV3ZXIgdmVyc2lvbnMgb2YKICAgICAgICAgIEFjdGl2ZVN0YXRlIFBlcmwgZm9yIFdpbjMyLgoKMi8yNy85OSA6IEZpeGVkIHRoZSBpbmNsdWRlIG9yZGVyIG9mIGZpbGVzIHNwZWNpZmllZCB3aXRoIHRoZQogICAgICAgICAgLUkgb3B0aW9uLgoKMi81Lzk4LSA6IERhdmUgZmluaXNoZXMgaGlzIGRpc3NlcnRhdGlvbiwgZ29lcyBqb2IgaHVudGluZywgbW92ZXMgdG8KMi81Lzk5ICAgIENoaWNhZ28gYW5kIGdlbmVyYWxseSB0aHJhc2hlcyBhYm91dC4KClZlcnNpb24gMS4xIFBhdGNoIDUgKEZlYnJ1YXJ5IDUsIDE5OTgpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyLzQvOTggIDogRml4ZWQgYSBidWcgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgd2hlbiBkaWZmZXJlbnQgcGFja2FnZQogICAgICAgICAgbG9jYXRpb25zIGFyZSBzcGVjaWZpZWQgKC0td2l0aC10Y2xpbmNsLCBldGMuLi4pLgoKMi8yLzk4ICA6IEZpeGVkIG5hbWUtY2xhc2ggYnVnIHJlbGF0ZWQgdG8gdGhlIHN3aXRjaCB0byBDIG1hY3JvcyBmb3IgYWNjZXNzb3IKICAgICAgICAgIGZ1bmN0aW9ucy4gIFRoZSBuZXcgc2NoZW1lIGRpZCBub3Qgd29yayBjb3JyZWN0bHkgZm9yIG9iamVjdHMKICAgICAgICAgIHdpdGggbWVtYmVycyBzdWNoIGFzICdvYmonLCAndmFsJywgZXRjLi4uICAgRml4ZWQgdGhlIGJ1ZyBieQogICAgICAgICAgYXBwZW5kaW5nIHRoZSB3b3JkICdzd2lnJyB0byBtYWNybyBhcmd1bWVudCBuYW1lcy4gIFBhdGNoCiAgICAgICAgICBjb250cmlidXRlZCBieSBSdWR5IEFsYmFjaHRlbi4KCjIvMi85OCAgOiBTbGlnaHQgZml4IHRvIHRoZSBQZXJsNSBtb2R1bGUgdG8gZWxpbWluYXRlIHdhcm5pbmcgbWVzc2FnZXMKICAgICAgICAgIGFib3V0ICd2YXJuYW1lIHVzZWQgb25seSBvbmNlIDogcG9zc2libGUgdHlwbycuICBGaXgKICAgICAgICAgIGNvbnRyaWJ1dGVkIGJ5IFJ1ZHkgQWxiYWNodGVuLgoKMS85Lzk4ICA6IEZpeGVkIGEgYnVnIGluIHRoZSBQZXJsIDUgbW9kdWxlIHJlbGF0ZWQgdG8gdGhlIGNyZWF0aW9uIG9mCiAgICAgICAgICBjb25zdGFudHMgYW5kIHNoYWRvdyBjbGFzc2VzLgoKMS85Lzk4ICA6IEZpeGVkIGxpbmtpbmcgYnVnIHdpdGggUHl0aG9uIDEuNSBlbWJlZC5pIGxpYnJhcnkgZmlsZS4KClZlcnNpb24gMS4xIFBhdGNoIDQgKEphbnVhcnkgNCwgMTk5OCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMS80Lzk4ICA6IENoYW5nZWQgc3RydWN0dXJlZCBvZiB0aGUgRXhhbXBsZXMgZGlyZWN0b3J5IHRvIGJlIG1vcmUgZnJpZW5kbHkKICAgICAgICAgIHRvIEJvcmxhbmQgQysrLgoKMS80Lzk4ICA6IEFkZGVkIHRoZSBmdW5jdGlvbiBNYWtlZmlsZS53aW4uYmMgZm9yIGNvbXBpbGluZyB0aGUgZXhhbXBsZXMKICAgICAgICAgIHVuZGVyIEJvcmxhbmQgNS4yLgoKMS80Lzk4ICA6IFNsaWdodCBjaGFuZ2UgdG8gdGhlIHBlcmw1IG1vZHVsZSBhbmQgQysrIGNvbXBpbGF0aW9uLiAgVGhlCiAgICAgICAgICA8bWF0aC5oPiBsaWJyYXJ5IGlzIG5vdyBpbmNsdWRlZCBiZWZvcmUgYW55IFBlcmwgaGVhZGVycwogICAgICAgICAgYmVjYXVzZSBQZXJsIHRoZSBleHRlcm4gIkMiIGxpbmthZ2Ugb2YgbWF0aC5oIHNjcmV3cyBhbG90CiAgICAgICAgICBvZiB0aGluZ3MgdXAgKGVzcGVjaWFsbHkgb24gV2luZG93cykuCgoxLzIvOTggIDogQ2hhbmdlIHRvIHRoZSBQeXRob24gbW9kdWxlIHRoYXQgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIGNvbnN0YW50cwogICAgICAgICAgY3JlYXRlZCBieSBDKysgY2xhc3NlcywgaW5oZXJpdGFuY2UsIGFuZCBzaGFkb3cgY2xhc3Nlcy4gICBUaGlzCiAgICAgICAgICBtb2RpZmljYXRpb24gbWF5IGludHJvZHVjZSBhIGZldyBzbGlnaHQgaW5jb21wYXRpYmlsaXRpZXMgaWYKICAgICAgICAgIHlvdSBhdHRlbXB0IHRvIHVzZSB0aGUgbm9uLXNoYWRvdyBjbGFzcyBpbnRlcmZhY2Ugd2l0aCBzaGFkb3cKICAgICAgICAgIGNsYXNzZXMgZW5hYmxlZC4gICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgTWlrZSBSb21iZXJnLgoKMS8yLzk4ICA6IFN1cHBvcnQgZm9yIFRjbCA4LjAgbmFtZXNwYWNlcyBoYXMgYmVlbiBhZGRlZC4gICBUaGlzICpyZXBsYWNlcyoKICAgICAgICAgIHRoZSBvcmlnaW5hbCBTV0lHIG1lY2hhbmlzbSB0aGF0IGFzc3VtZWQgW2luY3IgVGNsXSBuYW1lc3BhY2VzLgogICAgICAgICAgVG8gdXNlIG5hbWVzcGFjZXMsIHNpbXBseSBydW4gU1dJRyB3aXRoIHRoZSBmb2xsb3dpbmcgb3B0aW9ucwoKICAgICAgICAgICAgIHN3aWcgLXRjbCAtbmFtZXNwYWNlICBmb28uaQoKICAgICAgICAgICAgICAgICAgICBUaGlzIHBsYWNlcyBldmVyeXRoaW5nIGluIGEgbmFtZXNwYWNlIHRoYXQgbWF0Y2hlcwogICAgICAgICAgICAgICAgICAgIHRoZSBtb2R1bGUgbmFtZQoKICAgICAgICAgICAgIHN3aWcgLXRjbCAtbmFtZXNwYWNlIC1wcmVmaXggYmFyIGZvby5pCgogICAgICAgICAgICAgICAgICAgIFRoaXMgcGxhY2VzIGV2ZXJ5dGhpbmcgaW4gdGhlIG5hbWVzcGFjZSAnYmFyJwoKICAgICAgICAgIFRoZSB1c2Ugb2YgbmFtZXNwYWNlcyBpcyBuZXcgaW4gVGNsIDguMC4gIEhvd2V2ZXIsIHRoZSB3cmFwcGVyIGNvZGUKICAgICAgICAgIGdlbmVyYXRlZCBieSBTV0lHIHdpbGwgc3RpbGwgd29yayB3aXRoIGFsbCB2ZXJzaW9ucyBvZiBUY2wgbmV3ZXIKICAgICAgICAgIHRoYW4gYW5kIGluY2x1ZGluZyBUY2wgNy4zL1RrMy42IGV2ZW4gaWYgdGhlIC1uYW1lc3BhY2Ugb3B0aW9uIGlzCiAgICAgICAgICB1c2VkLgoKICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgVGhpcyBjaGFuZ2UgbWF5IGJyZWFrIGV4aXN0aW5nIGFwcGxpY2F0aW9ucyB0aGF0IHJlbGllZCBvbiB0aGUKICAgICAgICAgIC1wcmVmaXggYW5kIC1uYW1lc3BhY2Ugb3B0aW9ucy4KCjEvMi85OCAgOiBBZGRlZCB0aGUgZm9sbG93aW5nIGNvbnN0YW50cyB0byB0aGUgVGNsIHdyYXBwZXIgY29kZQoKICAgICAgICAgICAgICAgICBTV0lHX25hbWUgICAgICAtIE5hbWUgb2YgdGhlIFNXSUcgbW9kdWxlCiAgICAgICAgICAgICAgICAgU1dJR19wcmVmaXggICAgLSBQcmVmaXgvbmFtZXNwYWNlIGFwcGVuZGVkIHRvIGNvbW1hbmQgbmFtZXMKICAgICAgICAgICAgICAgICBTV0lHX25hbWVzcGFjZSAtIE5hbWUgb2YgdGhlIG5hbWVzcGFjZQoKICAgICAgICAgIFNXSUcgbGlicmFyeSB3cml0ZXJzIGNhbiB1c2UgdGhlc2UgdG8gdGhlaXIgYWR2YW50YWdlcy4KCjEvMi85OCAgOiBGaXhlZCBhIGJ1ZyBpbiB0aGUgVGNsOCBtb2R1bGUgcmVsYXRlZCB0byB0aGUgY3JlYXRpb24gb2YKICAgICAgICAgIHBvaW50ZXIgY29uc3RhbnRzICh0aGUgZnVuY3Rpb24gU1dJR19NYWtlUHRyIHdhcyBtaXNzaW5nIGZyb20KICAgICAgICAgIHRoZSB3cmFwcGVyIGNvZGUpLgoKMS8yLzk4ICA6IEFkZGVkIHRoZSBjb25zdGhhc2guaSBsaWJyYXJ5IGZpbGUgdG8gdGhlIFRjbCBhbmQgVGNsOCBtb2R1bGVzLgoKMS8xLzk4ICA6IENoYW5nZWQgYW5kIGNsZWFuZWQgdXAgdGhlIFB5dGhvbiB0eXBlbWFwcy5pIGZpbGUuICAgVGhlIGZvbGxvd2luZwogICAgICAgICAgc2lnbmlmaWNhbnQgY2hhbmdlcyB3ZXJlIG1hZGUgOgoKICAgICAgICAgICAgICAgIDEuICBUaGUgT1VUUFVUIHR5cGVtYXAgbm93IHJldHVybnMgUHl0aG9uIHR1cGxlcyBpbnN0ZWFkIG9mCiAgICAgICAgICAgICAgICAgICAgbGlzdHMuICAgTGlzdHMgY2FuIGJlIHJldHVybmVkIGFzIGJlZm9yZSBieSB1c2luZyB0aGUKICAgICAgICAgICAgICAgICAgICBMX09VVFBVVCB0eXBlLiAgICBJZiBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgdmVyc2lvbnMKICAgICAgICAgICAgICAgICAgICBpcyBuZWVkZWQsIHJ1biBTV0lHIHdpdGggdGhlIC1ET1VUUFVUX0xJU1Qgb3B0aW9uLgoKICAgICAgICAgICAgICAgIDIuICBUaGUgQk9USCB0eXBlbWFwIGhhcyBiZWVuIHJlbmFtZWQgdG8gSU5PVVQuICBGb3IgYmFja3dhcmRzCiAgICAgICAgICAgICAgICAgICAgY29tcGF0aWJpbGl0eSwgdGhlICJCT1RIIiBtZXRob2Qgc3RpbGwgZXhpc3RzIGhvd2V2ZXIuCgogICAgICAgICAgICAgICAgMy4gIE91dHB1dCB0eXBlbWFwcyBub3cgZ2VuZXJhdGUgbGVzcyBjb2RlIHRoYW4gYmVmb3JlLgoKICAgICAgICAgIENoYW5nZXMgdG8gdHlwZW1hcHMuaSBtYXkgYnJlYWsgZXhpc3RpbmcgUHl0aG9uIHNjcmlwdHMgdGhhdCBhc3N1bWUKICAgICAgICAgIG91dHB1dCBpbiB0aGUgZm9ybSBvZiBhIGxpc3QuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEyLzMxLzk3OiBGaXhlZCBsb25nIG92ZXJkdWUgcHJvYmxlbXMgd2l0aCB0aGUgdGVzdGluZyBzY3JpcHRzIGFuZCBjZXJ0YWluCiAgICAgICAgICBtYWtlZmlsZXMgdGhhdCByZXF1aXJlZCB0aGUgdXNlIG9mIHRoZSBiYXNoIHNoZWxsLiAgIEV2ZXJ5dGhpbmcgc2hvdWxkCiAgICAgICAgICB3b3JrIHByb3Blcmx5IHdpdGggdGhlIHN0YW5kYXJkIEJvdXJuZSBzaGVsbCAoc2gpIG5vdy4KCjEyLzMxLzk3OiBNb2RpZmllZCB0eXBlbWFwcyB0byBhbGxvdyAkYmFzZXR5cGUgYXMgYSB2YWxpZCBsb2NhbCB2YXJpYWJsZS4KICAgICAgICAgIFRoaXMgYWxsb3dzIGZvciBhbGwgc29ydHMgb2YgYml6YXJyZSBoYWNraXNoIHR5cGVtYXBzIHRoYXQKICAgICAgICAgIGRvIGNvb2wgdGhpbmdzLiAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IERvbWluaXF1ZSBEdW1vbnQuCgoxMi8zMS85NzogU3dpdGNoZWQgYWNjZXNzb3IgZnVuY3Rpb25zIGdlbmVyYXRlZCBmb3IgbWVtYmVyIGRhdGEgdG8KICAgICAgICAgIEMgcHJlcHJvY2Vzc29yIG1hY3JvcyAoZXhjZXB0IGluIGNhc2VzIGludm9sdmluZyB0eXBlbWFwcwogICAgICAgICAgb3IgY2hhciAqKS4KCjEyLzMxLzk3OiBGaXhlZCBhIGJ1ZyByZWxhdGVkIHRvIEMrKyBtZW1iZXIgZGF0YSBpbnZvbHZpbmcgcmVmZXJlbmNlcy4KCjEyLzMxLzk3OiBDaGFuZ2VkIGFjY2Vzc29yIGZ1bmN0aW9ucyBmb3IgQysrIG1lbWJlciBmdW5jdGlvbnMgdG8KICAgICAgICAgIHByZXByb2Nlc3NvciBtYWNyb3MuICAgVGhpcyBjbGVhbnMgdXAgdGhlIHdyYXBwZXIgY29kZQogICAgICAgICAgYW5kIHJlc3VsdHMgaW4gZmV3ZXIgZnVuY3Rpb24gZGVmaW5pdGlvbnMuCgoxMi8zMS85NzogQ2hhbmdlZCB0aGUgZGVmYXVsdCBDIGNvbnN0cnVjdG9yIHRvIHVzZSBjYWxsb2MoKSBpbnN0ZWFkCiAgICAgICAgICBvZiBtYWxsb2MoKQoKMTIvMzAvOTc6IENoYW5nZWQgdGhlIGNyZWF0aW9uIG9mIGNvbnN0YW50cyBpbiB0aGUgUGVybDUgbW9kdWxlLgogICAgICAgICAgRm9yIGFsbCBwcmFjdGljYWwgcHVycG9zZXMsIHRoZXkgc2hvdWxkIHdvcmsgaW4gZXhhY3RseSB0aGUKICAgICAgICAgIHNhbWUgd2F5IGFzIGJlZm9yZSBleGNlcHQgdGhhdCB0aGV5IG5vdyByZXF1aXJlIG11Y2ggbGVzcwogICAgICAgICAgd3JhcHBlciBjb2RlLiAgIE1vZHVsZXMgY29udGFpbmluZyBsYXJnZSBudW1iZXJzIG9mCiAgICAgICAgICBjb25zdGFudHMgbWF5IHNlZSBncmVhdGVyIHRoYW4gYSA1MCUgcmVkdWN0aW9uIGluIHdyYXBwZXIKICAgICAgICAgIGNvZGUgc2l6ZS4KCjEyLzMwLzk3OiBNb2RpZmllZCB0aGUgUHl0aG9uIG1vZHVsZSB0byBiZSBtb3JlIGludGVsbGlnZW50IGFib3V0IHRoZQogICAgICAgICAgY3JlYXRpb24gb2YgY29uc3RhbnRzLiAgU1dJRyBubyBsb25nZXIgZ2VuZXJhdGVzIHJlZHVuZGFudAogICAgICAgICAgZ2xvYmFsIHZhcmlhYmxlcyBhbmQgdGhlIHNpemUgb2YgdGhlIG1vZHVsZSBpbml0aWFsaXphdGlvbgogICAgICAgICAgZnVuY3Rpb24gc2hvdWxkIGJlIHJlZHVjZWQuICAgKE1hbnkgdGhhbmtzIHRvIEppbSBGdWx0b24pLgoKMTIvMjkvOTc6IEZpeGVkIGEgYnVnIGluIEMrKyBjb2RlIGdlbmVyYXRpb24gcmVsYXRlZCB0byBtZW1iZXIgZnVuY3Rpb25zLAogICAgICAgICAgZGVmYXVsdCBhcmd1bWVudHMsIGFuZCByZWZlcmVuY2VzLgoKMTIvMjkvOTc6IEZpeGVkIGNvbmZpZ3VyZSBzY3JpcHQgYW5kIGEgZmV3IG1ha2VmaWxlcyB0byBzdXBwb3J0IFB5dGhvbiAxLjUKCjEyLzI5Lzk3OiBBZGRlZCAnZW1iZWQxNS5pJyBsaWJyYXJ5IGZpbGUuICBUaGlzIGZpbGUgc2hvdWxkIGJlIHVzZWQgdG8KICAgICAgICAgIHN0YXRpY2FsbHkgbGluayB2ZXJzaW9ucyBvZiBQeXRob24gMS41LiAgICBUbyBtYWtlIGl0IHRoZSBkZWZhdWx0LAogICAgICAgICAgc2ltcGx5IGNvcHkgJ3N3aWdfbGliL3B5dGhvbi9lbWJlZDE1LmknIHRvICdzd2lnX2xpYi9weXRob24vZW1iZWQuaScKClZlcnNpb24gMS4xIFBhdGNoIDMgKE5vdmVtYmVyIDI0LCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMS8yMy85NzogRml4ZWQgYSBidWcgaW4gdGhlIFBlcmw1IG1vZHVsZSB3aXRoIHNoYWRvdyBjbGFzc2VzIGFuZAogICAgICAgICAgc3RhdGljIGNsYXNzIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBjbGFzcyBpbnN0YW5jZXMuCiAgICAgICAgICBOb3RlIDogVGhlIGZpeCBmb3IgdGhpcyBidWcgcmVxdWlyZXMgYSBzbGlnaHQgcmVzdHJ1Y3R1cmluZyBvZgogICAgICAgICAgb2YgdGhlIC5wbSBmaWxlcyBjcmVhdGVkIGJ5IFNXSUcuCgoxMS8yMy85NzogRml4ZWQgYSBidWcgaW4gdGhlIFRjbC9UY2w4IG1vZHVsZXMgcmVsYXRlZCB0byB2YXJpYWJsZSBsaW5raW5nCiAgICAgICAgICBvZiBjaGFyYWN0ZXIgYXJyYXlzLiAgSWYgeW91IGRlY2xhcmVkIGEgZ2xvYmFsIHZhcmlhYmxlICdjaGFyIGZvb1sxMF0nLAogICAgICAgICAgdGhlIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUgd291bGQgZWl0aGVyIGNhdXNlIGEgc2VnbWVudGF0aW9uIGZhdWx0CiAgICAgICAgICBpbW1lZGlhdGVseSB1cG9uIGxvYWRpbmcgb3Igd2VpcmQgbWVtb3J5IGNvcnJ1cHRpb24gZWxzZXdoZXJlLgogICAgICAgICAgVGhpcyBzaG91bGQgbm93IGJlIGZpeGVkIGFsdGhvdWdoIGNoYXJhY3RlciBhcnJheXMgY2FuIG9ubHkgYmUKICAgICAgICAgIHJlYWQtb25seS4KCjExLzIzLzk3OiBGaXhlZCBhIGJ1ZyB3aXRoIHRoZSAlaW1wb3J0IGRpcmVjdGl2ZSB0aGF0IGNhdXNlZCBpdCB0bwogICAgICAgICAgZmFpbCBpZiBmaWxlcyB3ZXJlIGltcG9ydGVkIGZyb20gZGlyZWN0b3JpZXMgb3RoZXIgdGhhbgogICAgICAgICAgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCgoxMS8yMy85NzogRml4ZWQgaW5jb3JyZWN0IGRpYWdub3N0aWMgbWVzc2FnZSBpbiB0aGUgQVNDSUkgZG9jdW1lbnRhdGlvbgogICAgICAgICAgbW9kdWxlLgoKMTEvMjMvOTc6IENoYW5nZWQgdGhlIGJlaGF2aW9yIG9mIHRoZSAtbyBvcHRpb24gd2hlbiB1c2VkIHdpdGggc2hhZG93CiAgICAgICAgICBjbGFzc2VzLiBJZiAtbyB3YXMgdXNlZCB0byBzcGVjaWZ5IGJvdGggdGhlIHBhdGhuYW1lIGFuZCBmaWxlbmFtZQogICAgICAgICAgb2YgU1dJRydzIG91dHB1dCBzdWNoIGFzCgogICAgICAgICAgICAgICAgIHN3aWcgLW8gL2hvbWUvc3dpZy93cmFwcGVyLmMgLXNoYWRvdyAtcGVybDUgZm9vLmkKCiAgICAgICAgICBUaGUgd3JhcHBlciBjb2RlIHdvdWxkIGJlIHBsYWNlZCB0aGUgZmlsZSBzcGVjaWZpZWQgd2l0aCAtbywKICAgICAgICAgIGJ1dCB0aGUgLnBtIGZpbGUgYW5kIGRvY3VtZW50YXRpb24gd291bGQgYmUgcGxhY2VkIGluIHRoZQogICAgICAgICAgZGlyZWN0b3J5IHdoZXJlIFNXSUcgd2FzIHJ1bi4gICBOb3csIHRoZXNlIGZpbGVzIGFyZSBwbGFjZWQKICAgICAgICAgIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgZmlsZSBzcGVjaWZpZWQgd2l0aCB0aGUgLW8gb3B0aW9uLgogICAgICAgICAgVGhpcyBjaGFuZ2UgaXMgYWxzbyBuZWVkZWQgZm9yIHByb3BlciBvcGVyYXRpb24gb24gdGhlCiAgICAgICAgICBNYWNpbnRvc2guCgoxMS8yMy85NzogQWRkZWQgYSAndGhpcygpJyBtZXRob2QgdG8gUGVybDUgc2hhZG93IGNsYXNzZXMuICAgVGhpcyBjYW4KICAgICAgICAgIGJlIHVzZWQgdG8gcmV0dXJuIHRoZSBub3JtYWwgcG9pbnRlciB2YWx1ZSBmcm9tIGEgc2hhZG93CiAgICAgICAgICBjbGFzcyB0aGF0IGlzIHJlcHJlc2VudGVkIGFzIGEgdGllZCBoYXNoLiAgIFRvIHVzZSBqdXN0CiAgICAgICAgICBpbnZva2UgYXMgYSBtZXRob2QgbGlrZSB0aGlzIDoKCiAgICAgICAgICAgICAgJGwgPSBuZXcgTGlzdDsgICAgICAgIyBDcmVhdGUgYW4gb2JqZWN0CiAgICAgICAgICAgICAgJHB0ciA9ICRsLT50aGlzKCk7ICAgIyBHZXQgdGhlIG5vcm1hbCBwb2ludGVyIHZhbHVlCgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTEvMjMvOTc6IEZpeGVkIHRoZSBUY2wgOCBwb2ludGVyLmkgbGlicmFyeSBmaWxlICh3aGljaCB3YXMgY29tcGxldGVseQogICAgICAgICAgYnJva2VuIGluIDEuMXAyKS4KCjExLzIzLzk3OiBNb2RpZmllZCB0aGUgUGVybDUgdHlwZS1jaGVja2VyIHRvIGZpeCBhIGZldyBwcm9ibGVtcwogICAgICAgICAgd2l0aCBnbG9iYWwgdmFyaWFibGVzIG9mIHBvaW50ZXIgdHlwZXMgYW5kIHRvIGFsbG93CiAgICAgICAgICB0aWVkIGhhc2hlcyB0byBiZSB1c2VkIGludGVyY2hhbmdhYmx5IHdpdGggbm9ybWFsCiAgICAgICAgICBwb2ludGVyIHZhbHVlcy4KCjExLzIzLzk3OiBNb2RpZmllZCB0aGUgdHlwZW1hcCBtZWNoYW5pc20gdG8gYWxsb3cgb3V0cHV0CiAgICAgICAgICB0eXBlbWFwcyBvZiB0eXBlICd2b2lkJy4gICBUaGVzZSB3ZXJlIGlnbm9yZWQgcHJldmlvdXNseSwKICAgICAgICAgIGJ1dCBub3cgaWYgeW91IHNwZWNpZnksCgogICAgICAgICAgICAgICAgJXR5cGVtYXAobGFuZyxvdXQpIHZvaWQgewogICAgICAgICAgICAgICAgICAgICAgLi4uIHJldHVybiBhIHZvaWQgLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgWW91IGNhbiBjaGFuZ2Ugb3IgYXNzaWduIGEgcmV0dXJuIHZhbHVlIHRvIHRoZSBmdW5jdGlvbi4KCjExLzIzLzk3OiBGaXhlZCBwcm9jZXNzaW5nIG9mICdib29sJyBkYXRhdHlwZXMgaW4gdGhlIFB5dGhvbiBtb2R1bGUuCgoxMS8yMy85NzogRml4ZWQgbWlub3IgcGFyc2luZyBlcnJvciB3aXRoIEMrKyBpbml0aWFsaXplcnMuIEZvciBleGFtcGxlLAoKICAgICAgICAgICAgICAgICBjbGFzcyBCIDogcHVibGljIEEgewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICBCKCkgOiBBKCkgeyAuLi4gfTsKICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9CgoxMS8yMy85NzogRml4ZWQgdGhlIFRjbDggbW9kdWxlIHNvIHRoYXQgQyBmdW5jdGlvbnMgdGhhdCBjYWxsIGJhY2sgaW50bwogICAgICAgICAgVGNsIGRvbid0IGNvcnJ1cHQgdGhlIHJldHVybiByZXN1bHQgb2JqZWN0IChTV0lHIHdhcyBnYXRoZXJpbmcKICAgICAgICAgIHRoZSByZXN1bHQgb2JqZWN0IHRvbyBlYXJseSB3aGljaCBsZWFkcyB0byBwcm9ibGVtcyBpZiBzdWJzZXF1ZW50CiAgICAgICAgICBUY2wgY2FsbHMgYXJlIG1hZGUpLgoKMTEvMjMvOTc6IEZpeGVkIGEgY29kZSBnZW5lcmF0aW9uIGJ1ZyBpbiB0aGUgUHl0aG9uIG1vZHVsZSB3aGVuIHR3byBvcgogICAgICAgICAgbW9yZSBvdXRwdXQgcGFyYW1ldGVycyB3ZXJlIHVzZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50cyBvZiBhCiAgICAgICAgICBmdW5jdGlvbi4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgJWluY2x1ZGUgdHlwZW1hcHMuaQogICAgICAgICAgICAgICAgIHZvaWQgZm9vKGRvdWJsZSAqT1VUUFVULCBkb3VibGUgKk9VVFBVVCwgZG91YmxlIGEpOwoKICAgICAgICAgIFByZXZpb3VzbHksIGRvaW5nIHRoaXMgcmVzdWx0ZWQgaW4gdGhlIGNyZWF0aW9uIG9mIGFuCiAgICAgICAgICBleHRyYW5lb3VzIGNvbW1hIGluIHRoZSBvdXRwdXQsIHJlc3VsdGluZyBpbiBhIEMgc3ludGF4IGVycm9yLgoKMTEvMjIvOTc6IEZpeGVkIGEgYnVnIHdoZW4gdGVtcGxhdGUgaGFuZGxpbmcgdGhhdCB3YXMgc3RyaXBwaW5nIHdoaXRlc3BhY2UKICAgICAgICAgIGFyb3VuZCBuZXN0ZWQgdGVtcGxhdGVzLiAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgRm9vPEJhcjxkb3VibGU+ID4KCiAgICAgICAgICB3YXMgZ2V0dGluZyBtdW5nZWQgaW50byBGb288QmFyPj4gd2hpY2ggaXMgYSBzeW50YXggZXJyb3IgaW4KICAgICAgICAgIGluIHRoZSBDKysgY29tcGlsZXIuCgoxMS8yMi85NzogRml4ZWQgYnVncyBpbiB0aGUgQm9ybGFuZCBDKysgbWFrZWZpbGVzLgoKMTEvMjIvOTc6IEZpeGVkIG1lbW9yeSBjb3JydXB0aW9uIGJ1ZyB3aGVuIHByb2Nlc3NpbmcgaW50ZWdlcgogICAgICAgICAgYXJndW1lbnRzIGluIFRjbDggbW9kdWxlLgoKMTEvMjEvOTc6IEZpeGVkIGEgYnVnIGluIHRoZSBSdW50aW1lL01ha2VmaWxlIHJlbGF0ZWQgdG8gVGNsIDguCgoxMS8yMS85NzogRml4ZWQgYSBidWcgd2l0aCB0aGUgJW5ldyBkaXJlY3RpdmUgYW5kIFBlcmw1IHNoYWRvdyBjbGFzc2VzLgogICAgICAgICAgTm8gbG9uZ2VyIGdlbmVyYXRlcyBhIHBlcmwgc3ludGF4IGVycm9yLgoKMTEvOS85NyA6IENoYW5nZWQgYSBzdHJuY3B5KCkgdG8gc3RyY3B5KCkgaW4gdGhlIHBvaW50ZXIgdHlwZS1jaGVja2VyLgogICAgICAgICAgVGhpcyByZXN1bHRzIGluIGEgc3Vic3RhbnRpYWwgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgaW4KICAgICAgICAgIHR5cGUtY2hlY2tpbmcuCgoxMC8yOS85NzogRml4ZWQgYSBidWcgaW4gdGhlIGNvZGUgZ2VuZXJhdGlvbiBvZiBkZWZhdWx0IGFyZ3VtZW50cyBhbmQKICAgICAgICAgIHVzZXItZGVmaW5lZCB0eXBlcy4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgdm9pZCBmb28oVmVjdG9yIGEsIFZlY3RvciBiID0gZCk7CgogICAgICAgICAgc2hvdWxkIG5vdyB3b3JrIHByb3Blcmx5LgoKVmVyc2lvbiAxLjEgUGF0Y2ggMiAoU2VwdGVtYmVyIDQsIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKOS80Lzk3ICA6IEZpeGVkIHByb2JsZW0gd2l0aCBoYW5kbGluZyBvZiB2aXJ0dWFsIGZ1bmN0aW9ucyB0aGF0CiAgICAgICAgICB3YXMgaW50cm9kdWNlZCBieSBzb21lIGNoYW5nZXMgaW4gdGhlIEMrKyBtb2R1bGUuCgpWZXJzaW9uIDEuMSBQYXRjaCAxIChBdWd1c3QgMjcsIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjgvMjYvOTcgOiBGaXhlZCBjb21waWxhdGlvbiBhbmQgcnVuLXRpbWUgYnVncyB3aXRoIFRjbCA4LjAgZmluYWwuCgo4LzIxLzk3IDogRml4ZWQgY29kZSBnZW5lcmF0aW9uIGJ1ZyB3aXRoIGFycmF5cyBhcHBlYXJpbmcgYXMgYXJndW1lbnRzCiAgICAgICAgICB0byBDKysgbWVtYmVyIGZ1bmN0aW9ucy4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgdm9pZCBCYXIoaW50IGFbMjBdWzIwXSk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgIFRoZXJlIGlzIHN0aWxsIGEgYnVnIHVzaW5nIGFycmF5cyB3aXRoIGFkZGVkIG1ldGhvZHMKICAgICAgICAgIGhvd2V2ZXIuCgo4LzIwLzk3IDogRml4ZWQgYSBidWcgd2l0aCBnZW5lcmF0aW5nIHRoZSBjb2RlIGZvciBhZGRlZCBtZXRob2RzCiAgICAgICAgICBpbnZvbHZpbmcgcGFzcy1ieS12YWx1ZS4KCjgvMTkvOTcgOiBNb2RpZmllZCB0aGUgdHlwZW1hcHBlciB0byBzdWJzdGl0dXRlIHRoZSAnJGFyZycgdmFsdWUKICAgICAgICAgIHdoZW4gZGVjbGFyaW5nIGxvY2FsIHZhcmlhYmxlcy4gICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAldHlwZW1hcChpbikgZG91YmxlICogKGRvdWJsZSB0ZW1wXyRhcmcpIHsKICAgICAgICAgICAgICAgICAgICAuLi4gZG8gc29tZXRoaW5nIC4uLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICBXaGVuIGFwcGxpZWQgdG8gYSByZWFsIGZ1bmN0aW9uIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyA6CgogICAgICAgICAgICAgIHZvaWQgZm9vKGRvdWJsZSAqYSwgZG91YmxlICpiLCBkb3VibGUgKnJlc3VsdCk7CgogICAgICAgICAgdGhyZWUgbG9jYWwgdmFyaWFibGVzIHdpbGwgYmUgY3JlYXRlZCBhcyBmb2xsb3dzIDoKCiAgICAgICAgICAgICAgZG91YmxlIHRlbXBfYTsKICAgICAgICAgICAgICBkb3VibGUgdGVtcF9iOwogICAgICAgICAgICAgIGRvdWJsZSB0ZW1wX3Jlc3VsdDsKCiAgICAgICAgICBUaGlzIGNhbiBiZSB1c2VkIHdoZW4gd3JpdGluZyBtdWx0aXBsZSB0eXBlbWFwcyB0aGF0IG5lZWQKICAgICAgICAgIHRvIGFjY2VzcyB0aGUgc2FtZSBsb2NhbCB2YXJpYWJsZXMuCgoKNy8yNy85NyA6IEZpeGVkIGEgdmFyaWV0eSBvZiBwcm9ibGVtcyB3aXRoIHRoZSAlYXBwbHkgZGlyZWN0aXZlIGFuZCBhcnJheXMuCiAgICAgICAgICBUaGUgZm9sbG93aW5nIHR5cGVzIG9mIGRlY2xhcmF0aW9ucyBzaG91bGQgbm93IHdvcmsgOgoKICAgICAgICAgICAgICAgJWFwcGx5IGRvdWJsZSBbQU5ZXSB7IFJlYWwgW0FOWV0gfTsKICAgICAgICAgICAgICAgJWFwcGx5IGRvdWJsZSBbNF0geyBkb3VibGUgWzEwXSB9OwoKICAgICAgICAgIEEgZ2VuZXJpYyB2ZXJzaW9uIG9mIGFwcGx5IGxpa2UgdGhpcyA6CgogICAgICAgICAgICAgICAlYXBwbHkgZG91YmxlIHsgUmVhbCB9OwoKICAgICAgICAgIHNob3VsZCBub3cgd29yay0tZXZlbiBpZiBhcnJheXMgaW52b2x2aW5nIGRvdWJsZXMgYW5kIFJlYWxzIGFyZQogICAgICAgICAgdXNlZCBsYXRlci4KCjcvMjcvOTcgOiBDaGFuZ2VkIHdhcm5pbmcgbWVzc2FnZSBhYm91dCAiQXJyYXkgWCBoYXMgYmVlbiBjb252ZXJ0ZWQgdG8gWSIgdG8KICAgICAgICAgIG9ubHkgYXBwZWFyIGlmIHJ1bm5pbmcgU1dJRyBpbiB2ZXJib3NlIG1vZGUuCgo3LzI3Lzk3IDogQWRkZWQgdGhlIHZhcmlhYmxlcyAkcGFybW5hbWUgYW5kICRiYXNlbWFuZ2xlIHRvIHRoZSB0eXBlbWFwCiAgICAgICAgICBnZW5lcmF0b3IuICAgICRwYXJtbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIHVzZWQKICAgICAgICAgIHdoZW4gdGhlIHR5cGVtYXAgd2FzIG1hdGNoZWQuICBJdCBtYXkgYmUgIiIgaWYgbm8gcGFyYW1ldGVyCiAgICAgICAgICB3YXMgdXNlZC4gICAkYmFzZW1hbmdsZSBpcyBhIG1hbmdsZWQgdmVyc2lvbiBvZiB0aGUgYmFzZQogICAgICAgICAgZGF0YXR5cGUuICAgIFNvbWV0aW1lcyB1c2VkIGZvciBhcnJheSBoYW5kbGluZy4KCjcvMjcvOTcgOiBDaGFuZ2VkIHRoZSBiZWhhdmlvciBvZiBvdXRwdXQgYXJndW1lbnRzIHdpdGggUHl0aG9uIHNoYWRvdyBjbGFzc2VzLgogICAgICAgICAgT3JpZ2luYWxseSwgaWYgYSBmdW5jdGlvbiByZXR1cm5lZCBhbiBvYmplY3QgJ0ZvbycsIHRoZSBzaGFkb3cgY2xhc3MKICAgICAgICAgIG1lY2hhbmlzbSB3b3VsZCBjcmVhdGUgY29kZSBsaWtlIHRoaXMgOgoKICAgICAgICAgICAgICAgIGRlZiByZXR1cm5fZm9vKCk6CiAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBGb29QdHIoc2hhZG93Yy5yZXR1cm5fZm9vKCkpCiAgICAgICAgICAgICAgICAgICAgICB2YWwudGhpcyA9IDEKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWwKCiAgICAgICAgICBUaGUgcHJvYmxlbSB3aXRoIHRoaXMgaXMgdGhhdCB0eXBlbWFwcyBhbGxvdyBhIHVzZXIgdG8gcmVkZWZpbmUKICAgICAgICAgIHRoZSBvdXRwdXQgYmVoYXZpb3Igb2YgYSBmdW5jdGlvbi0tYXMgYSByZXN1bHQsIHdlIGNhbiBubyBsb25nZXIKICAgICAgICAgIG1ha2UgYW55IGFzc3VtcHRpb25zIGFib3V0IHRoZSByZXR1cm4gdHlwZSBiZWluZyBhIHBvaW50ZXIgb3IKICAgICAgICAgIGV2ZW4gYmVpbmcgYSBzaW5nbGUgdmFsdWUgZm9yIHRoYXQgbWF0dGVyIChpdCBjb3VsZCBiZSBhIGxpc3QsCiAgICAgICAgICB0dXBsZSwgZXRjLi4uKS4gICBJZiBTV0lHIGRldGVjdHMgdGhlIHVzZSBvZiBvdXRwdXQgdHlwZW1hcHMKICAgICAgICAgIChlaXRoZXIgIm91dCIgb3IgImFyZ291dCIpIGl0IHJldHVybnMgdGhlIHJlc3VsdCB1bm1vZGlmaWVkIGxpa2UKICAgICAgICAgIHRoaXMgOgoKICAgICAgICAgICAgICAgIGRlZiByZXR1cm5fZm9vKCk6CiAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBzaGFkb3djLnJldHVybl9mb28oKQogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbAoKICAgICAgICAgIEluIHRoaXMgY2FzZSwgaXQgaXMgdXAgdG8gdGhlIHVzZXIgdG8gZmlndXJlIG91dCB3aGF0IHRvIGRvCiAgICAgICAgICB3aXRoIHRoZSByZXR1cm4gdmFsdWUgKGluY2x1ZGluZyB0aGUgcG9zc2liaWxpdHkgb2YgY29udmVydGluZyBpdAogICAgICAgICAgaW50byBhIFB5dGhvbiBjbGFzcykuCgo3LzI2Lzk3IDogRml4ZWQgYSBwYXJzaW5nIHByb2JsZW0gd2l0aCB0eXBlcyBsaWtlICd1bnNpZ25lZCBsb25nIGludCcsCiAgICAgICAgICAndW5zaWduZWQgc2hvcnQgaW50JywgZXRjLi4uCgo3LzI0Lzk3IDogTWlub3IgYnVnIGZpeCB0byBUY2wgOCBtb2R1bGUgdG8gcGFyc2UgZW51bXMgcHJvcGVybHkuICBBbHNvCiAgICAgICAgICBmaXhlZCBhIG1lbW9yeSBjb3JydXB0aW9uIHByb2JsZW0gaW4gdGhlIHR5cGUtY2hlY2tlci4KICAgICAgICAgIChwYXRjaCBjb250cmlidXRlZCBieSBIZW5yeSBSb3dsZXkuCgo3LzI0Lzk3IDogQWRkZWQgUHl0aG9uLXR1cGxlIHR5cGVtYXBzIGNvbnRyaWJ1dGVkIGJ5IFJvYmluIER1bm4uCgo3LzI0Lzk3IDogSW5jb3Jwb3JhdGVkIHNvbWUgY2hhbmdlcyB0byB0aGUgUHl0aG9uIG1vZHVsZSBpbiBzdXBwb3J0IG9mCiAgICAgICAgICBNYXJrIEhhbW1vbmQncyBDT00gc3VwcG9ydC4gIEknbSBub3QgZW50aXJlbHkgc3VyZSB0aGV5CiAgICAgICAgICB3b3JrIHlldCBob3dldmVyLiAgTmVlZHMgZG9jdW1lbnRhdGlvbiBhbmQgdGVzdGluZy4KCjcvMjQvOTcgOiBGaXhlZCBjb2RlIGdlbmVyYXRpb24gYnVncyB3aGVuIHN0cnVjdHVyZXMgaGFkIGFycmF5IG1lbWJlcnMKICAgICAgICAgIGFuZCB0eXBlbWFwcyB3ZXJlIHVzZWQuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICV0eXBlbWFwKG1lbWJlcmluKSBkb3VibGUgWzIwXVsyMF0gewogICAgICAgICAgICAgICAgICAgICAgLi4uIGdldCBhIGRvdWJsZSBbMjBdWzIwXSAuLi4KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhWzIwXVsyMF07CiAgICAgICAgICAgICAgfQoKICAgICAgICAgIE9yaWdpbmFsbHksIHRoaXMgd291bGQgZ2VuZXJhdGUgYSBjb21waWxlci10eXBlIGVycm9yIHdoZW4KICAgICAgICAgIHRoZSB3cmFwcGVyIGNvZGUgd2FzIGNvbXBpbGVkLiAgIE5vdywgYSBoZWxwZXIgZnVuY3Rpb24gbGlrZQogICAgICAgICAgdGhpcyBpcyBnZW5lcmF0ZWQgOgoKICAgICAgICAgICAgICAgIGRvdWJsZSAqRm9vX2Ffc2V0KEZvbyAqYSwgZG91YmxlIHZhbFsyMF1bMjBdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAuLi4gbWVtYmVyaW4gdHlwZW1hcCBoZXJlIC4uLgogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkb3VibGUgKikgdmFsOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFdoZW4gd3JpdGluZyB0eXBlbWFwcywgb25lIGNhbiBhc3N1bWUgdGhhdCB0aGUgc291cmNlIHZhcmlhYmxlCiAgICAgICAgICBpcyBhbiBhcnJheSBvZiB0aGUgKnNhbWUqIHR5cGUgYXMgdGhlIHN0cnVjdHVyZSBtZW1iZXIuIFRoaXMKICAgICAgICAgIG1heSBicmVhayBzb21lIGNvZGVzIHRoYXQgbWFuYWdlZCB0byB3b3JrIGFyb3VuZCB0aGUgYXJyYXkgYnVnLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzEzLzk3IDogRml4ZWQgYnVnIGluIFBlcmw1IG1vZHVsZSB3aGVuIHVzaW5nIEMgZ2xvYmFsIHZhcmlhYmxlcyB0aGF0CiAgICAgICAgICBhcmUgcG9pbnRlcnMuICBXaGVuIHVzZWQgaW4gZnVuY3Rpb24gY2FsbHMgYW5kIG90aGVyIG9wZXJhdGlvbnMsCiAgICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIHBvaW50ZXIgd291bGQgYmUgaW52YWxpZC0tLWNhdXNpbmcgY29yZQogICAgICAgICAgZHVtcHMgYW5kIG90aGVyIHByb2JsZW1zLiAgU1dJRyBpbXBsZW1lbnRzIGdsb2JhbCB2YXJpYWJsZXMKICAgICAgICAgIHVzaW5nIFBlcmwgbWFnaWMgdmFyaWFibGVzLiAgQXMgaXQgdHVybnMgb3V0LCB0aGUgZXJyb3IKICAgICAgICAgIHdhcyBjYXVzZWQgYnkgdGhlIGZhY3QgdGhhdCB0aGUgcG9pbnRlci1leHRyYWN0aW9uIGNvZGUKICAgICAgICAgIHdhcyBzb21laG93IGJ5cGFzc2luZyB0aGUgcHJvY2VkdXJlIHVzZWQgdG8gcmVzb2x2ZSBtYWdpY2FsCiAgICAgICAgICB2YXJpYWJsZXMgKGhlbmNlLCBsZWF2aW5nIHRoZSB2YWx1ZSB1bmRlZmluZWQpLiAgVG8gZml4CiAgICAgICAgICB0aGUgcHJvYmxlbSwgU1dJRyBub3cgZXhwbGljaXRseSByZXNvbHZlcyBtYWdpYyBiZWZvcmUKICAgICAgICAgIGV4dHJhY3RpbmcgcG9pbnRlciB2YWx1ZXMuCgo3LzEyLzk3IDogRWxpbWluYXRlZCB0aGUgbGFzdCByZW1uYW50cyBvZiBmcmVlKCkgYW5kIG1hbGxvYygpIGZyb20KICAgICAgICAgIHRoZSBTV0lHIGNvbXBpbGVyLgoKNy8xMi85NyA6IEZpeGVkIHBhcnNpbmcgcHJvYmxlbXMgd2l0aCB0eXBlbWFwcyBpbnZvbHZpbmcgYXJyYXlzIGFuZAogICAgICAgICAgdGVtcG9yYXJ5IHZhcmlhYmxlcyBvZiBhcnJheXMuICAgIEFsc28gbWFkZSBpdCBwb3NzaWJsZSBmb3IKICAgICAgICAgIFNXSUcgdG8gaGFuZGxlIHR5cGVtYXBzIGxpa2UgdGhpcyA6CgogICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBkb3VibGUgW0FOWV0gKGRvdWJsZSB0ZW1wWyRkaW0wXSkgewoJCSAgICAgIC4uLiBzdG9yZSBkYXRhIGluIHRlbXBbJGRpbTBdIC4uLgogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBOb3Qgb25seSBkb2VzIHRoaXMgdHlwZW1hcCBtYXRjaCBhbnkgZG91YmxlIFtdIGFycmF5LCBpdAogICAgICAgICAgY3JlYXRlcyBhIGxvY2FsIHZhcmlhYmxlIHdpdGggcHJlY2lzZWx5IHRoZSByaWdodCBkaW1lbnNpb25zLgogICAgICAgICAgKGllLiAkZGltMCBnZXRzIGZpbGxlZCBpbiB3aXRoIHRoZSByZWFsIG51bWJlciBvZiBkaW1lbnNpb25zKS4KICAgICAgICAgIE9mIGNvdXJzZSwgb2ZmIHRoZSByZWNvcmQsIHRoaXMgd2lsbCBiZSBhIHdheSB0byBhZGQgbW9yZQogICAgICAgICAgZnVuY3Rpb25hbGl0eSB0byB0aGUgdHlwZW1hcHMuaSBsaWJyYXJpZXMuCgo3LzkvOTcgIDogRml4ZWQgc29tZSBwcm9ibGVtcyB3aXRoIFBlcmw1LCBzdGF0aWMgbGlua2luZywgYW5kIHNoYWRvdwogICAgICAgICAgY2xhc3Nlcy4gIFdoZW4gc3RhdGljYWxseSBsaW5raW5nIG11bHRpcGxlIG1vZHVsZXMgdG9nZXRoZXIsIHdyaXRlCiAgICAgICAgICBhIHRvcC1sZXZlbCBpbnRlcmZhY2UgZmlsZSBsaWtlIHRoaXMgd2hlbiBzaGFkb3cgY2xhc3NlcyBhcmUgbm90CiAgICAgICAgICB1c2VkIDoKCiAgICAgICAgICAgICAgICAgJW1vZHVsZSBzd2lnLCBmb28sIGJhciwgZ2xvYjsKICAgICAgICAgICAgICAgICAlaW5jbHVkZSBwZXJsbWFpbi5pCgogICAgICAgICAgV2hlbiBzaGFkb3cgY2xhc3NlcyBhcmUgdXNlZCwgdGhlIG1vZHVsZSBuYW1lcyBoYXZlIGFuIGV4dHJhICdjJwogICAgICAgICAgYXBwZW5kZWQgc28gaXQgc2hvdWxkIHJlYWQgYXMgOgoKICAgICAgICAgICAgICAgICAlbW9kdWxlIHN3aWcsIGZvb2MsIGJhcmMsIGdsb2JjOwogICAgICAgICAgICAgICAgICVpbmNsdWRlIHBlcmxtYWluLmkKCiAgICAgICAgICBXaGVuIGxpbmtpbmcgbXVsdGlwbGUgbW9kdWxlcywgY29uc2lkZXIgdXNpbmcgdGhlIFNXSUcgcnVudGltZQogICAgICAgICAgbGlicmFyeS4KCjcvOC85NyAgOiBJbmNvcnBvcmF0ZWQgZml4ZWQgdmVyc2lvbnMgb2YgdGhlIEJvcmxhbmQgQysrIE1ha2VmaWxlcy4KCjcvOC85NyAgOiBGaXJzdCBjdXQgYXQgdHJ5aW5nIHRvIGVsaW1pbmF0ZSBleGNlc3NpdmUgY29tcGlsZXIgd2FybmluZ3MuCiAgICAgICAgICBBcyBpdCB0dXJucyBvdXQsIGFsb3Qgb2Ygd2FybmluZ3MgZ28gYXdheSBpZiB5b3UganVzdCBtYWtlCiAgICAgICAgICBkZWNsYXJhdGlvbnMgbGlrZSB0aGlzCgogICAgICAgICAgICAgICAgICBjbGllbnREYXRhID0gY2xpZW50RGF0YTsKCiAgICAgICAgICBpbiB0aGUgcmVzdWx0aW5nIHdyYXBwZXIgY29kZS4gIE1vc3QgY29tcGlsZXJzIHNob3VsZCBqdXN0CiAgICAgICAgICBpZ25vcmUgdGhpcyBjb2RlIChhdCBsZWFzdCB3b3VsZCBjYW4gaG9wZSkuCgo3LzgvOTcgIDogRml4ZWQgYml6YXJyZSBjb2RlIGdlbmVyYXRpb24gYnVnIHdpdGggdHlwZW1hcHMgYW5kIEMrKyBjbGFzc2VzLgogICAgICAgICAgSW4gc29tZSBjYXNlcywgdHlwZW1hcHMgY29udGFpbmluZyBwcmludGYgZm9ybWF0dGluZyBzdHJpbmdzIHN1Y2ggYXMKCiAgICAgICAgICAgICAgICAgICV0eXBlbWFwKG1lbWJlcm91dCkgaW50ICogewogICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlZCIsNDIpOwogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgV291bGQgZ2VuZXJhdGUgY29tcGxldGVseSBib2d1cyBjb2RlIHdpdGggZ2FyYmFnZSByZXBsYWNpbmcKICAgICAgICAgIHRoZSAnJWQnLiAgIENhdXNlZCBieSBvbmUgZmF1bHR5IHVzZSBvZiBwcmludGYgKHdhc24ndCBhYmxlIHRvIGZpbmQKICAgICAgICAgIGFueSBvdGhlciBvY2N1cnJlbmNlcykuCgo3LzcvOTcgIDogRml4ZWQgYnVnIGluIFB5dGhvbiBzaGFkb3cgY2xhc3MgZ2VuZXJhdGlvbiB3aXRoIG5vbi1tZW1iZXIKICAgICAgICAgIGZ1bmN0aW9ucyB0aGF0IGFyZSByZXR1cm5pbmcgbW9yZSB0aGFuIG9uZSB2YWx1ZS4KCjcvNy85NyAgOiBJbmNvcnBvcmF0ZWQgbW9kaWZpY2F0aW9ucyB0byBtYWtlIFNXSUcgd29yayB3aXRoIEd1aWxlIDEuMi4KICAgICAgICAgIFN0aWxsIG5lZWQgdG8gdGVzdCBpdCBvdXQsIGJ1dCBpdCBpcyBydW1vcmVkIHRvIHdvcmsuCgo3LzIvOTcgIDogRml4ZWQgc29tZSBidWdzIHJlbGF0ZWQgdG8gb3V0cHV0IGFyZ3VtZW50cyBhbmQgUHl0aG9uIHNoYWRvdwogICAgICAgICAgY2xhc3Nlcy4gICAgSWYgYW4gb3V0cHV0IGFyZ3VtZW50IGlzIGRldGVjdGVkLCBTV0lHIGFzc3VtZXMKICAgICAgICAgIHRoYXQgdGhlIHJlc3VsdCBpcyBhIGxpc3QgYW5kIGhhbmRsZXMgaXQgYXBwcm9wcmlhdGVseS4KICAgICAgICAgIElmIHRoZSBub3JtYWwgcmV0dXJuIHR5cGUgb2YgYW4gZnVuY3Rpb24gaXMgYW4gb2JqZWN0LAogICAgICAgICAgaXQgd2lsbCBiZSBjb252ZXJ0ZWQgaW50byBhIHNoYWRvdyBjbGFzcyBhcyBiZWZvcmUsIGJ1dAogICAgICAgICAgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IGl0IGlzIHRoZSBmaXJzdCBlbGVtZW50IG9mIGEKICAgICAgICAgIGxpc3QuICAqKiogTk9URSA6IFRoaXMgYmVoYXZpb3IgaGFzIGJlZW4gc3Vic2VxdWVudGx5IGNoYW5nZWQgKioqCgo2LzI5Lzk3IDogQ2hhbmdlZCBFWFBPUlQgdG8gU1dJR0VYUE9SVCBpbiBhbGwgb2YgdGhlIGxhbmd1YWdlIG1vZHVsZXMuCiAgICAgICAgICBTaG91bGQgcHJvdmlkZSBiZXR0ZXIgY29tcGF0aWJpbGl0eSB3aXRoIFdpbmRvd3MuCgo2LzI5Lzk3IDogTW9kaWZpZWQgUHl0aG9uIHNoYWRvdyBjbGFzc2VzIHNvIHRoYXQgb3V0cHV0IGFyZ3VtZW50cwogICAgICAgICAgd29yayBjb3JyZWN0bHkgKHdoZW4gdHlwZW1hcHMgYXJlIHVzZWQpLgoKVmVyc2lvbiAxLjEgKEp1bmUgMjQsIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKNi8yNC85NyA6IEZpeGVkIE9iamVjdGl2ZS1DIGNvbnN0cnVjdG9yIGJ1ZyB3aGVuIHdvcmtpbmcgd2l0aCBQZXJsNQogICAgICAgICAgc2hhZG93IGNsYXNzZXMuCgo2LzIzLzk3IDogRml4ZWQgc29tZSBwYXJzaW5nIHByb2JsZW1zIHdpdGggT2JqZWN0aXZlLUMuICBEZWNsYXJhdGlvbnMKICAgICAgICAgIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyBzaG91bGQgd29yayBub3cgOgoKICAgICAgICAgICAgICAgLSBmb28gOiAoaW50KSBhIHdpdGg6IChpbnQpIGI7Cgo2LzIyLzk3IDogQWRkZWQgU1dJRyBSdW50aW1lIGxpYnJhcnkuICAgVGhpcyBsaWJyYXJ5IGNvbnRhaW5zCiAgICAgICAgICB0aGUgU1dJRyBwb2ludGVyIHR5cGUtY2hlY2tlciBhbmQgc3VwcG9ydCBmdW5jdGlvbnMKICAgICAgICAgIHRoYXQgYXJlIG5vcm1hbGx5IGluY2x1ZGVkIGluIGV2ZXJ5IG1vZHVsZS4gIEJ5IHVzaW5nCiAgICAgICAgICB0aGUgbGlicmFyeSwgaXQgaXMgZWFzaWVyIHRvIHdvcmsgd2l0aCBtdWx0aXBsZSBTV0lHCiAgICAgICAgICBnZW5lcmF0ZWQgbW9kdWxlcy4KCjYvMjIvOTcgOiBGaXhlZCBtaW5vciBidWcgaW4gUGVybDUgbW9kdWxlIHJlbGF0ZWQgdG8gc3RhdGljIGxpbmtpbmcKICAgICAgICAgIG9mIG11bHRpcGxlIG1vZHVsZXMuCgo2LzIyLzk3IDogRml4ZWQgc29tZSBidWdzIHdpdGggdGhlICVpbXBvcnQgZGlyZWN0aXZlLiBXaGVuIHVzZWQgd2l0aAogICAgICAgICAgUGVybDUgc2hhZG93IGNsYXNzZXMsIHRoaXMgZ2VuZXJhdGVzIGEgJ3JlcXVpcmUnIHN0YXRlbWVudAogICAgICAgICAgdG8gbG9hZCBpbiBleHRlcm5hbCBtb2R1bGVzLgoKNi8yMi85NyA6IEFkZGVkIC1zd2lnbGliIG9wdGlvbi4gIFRoaXMgcHJpbnRzIG91dCB0aGUgbG9jYXRpb24gb2YgdGhlCiAgICAgICAgICBTV0lHIGxpYnJhcnkgYW5kIGV4aXRzLiAgVGhpcyBvcHRpb24gaXMgb25seSByZWFsbHkgdXNlZnVsIHRvCiAgICAgICAgICBjb25maWd1cmF0aW9uIHRvb2xzIHRoYXQgYXJlIGxvb2tpbmcgZm9yIFNXSUcgYW5kIGl0cyBsaWJyYXJ5CiAgICAgICAgICBsb2NhdGlvbiAoZS5nLiBhdXRvY29uZiwgY29uZmlndXJlLCBldGMuLi4pLgoKNi8yMS85NyA6IEZpeGVkIGV4cG9ydCBidWcgd2l0aCBQZXJsNS4wMDQgb24gV2luZG93cy1OVC4KCjYvMjAvOTcgOiBNaW5vciBjaGFuZ2UgdG8gY29kZSBnZW5lcmF0aW9uIG9mIGNsYXNzL3N0cnVjdHVyZSBtZW1iZXJzIGluCiAgICAgICAgICBvcmRlciB0byB3b3JrIGJldHRlciB3aXRoIHR5cGVtYXBzLiBTaG91bGQgaGF2ZSBubyBub3RpY2FibGUKICAgICAgICAgIGltcGFjdCBvbiBleGlzdGluZyBTV0lHIG1vZHVsZXMuCgo2LzE5Lzk3IDogQWRkZWQgLXQgb3B0aW9uLiBUaGlzIGFsbG93cyBTV0lHIHRvIGxvYWQgYSB0eXBlbWFwIGZpbGUgYmVmb3JlCiAgICAgICAgICBwcm9jZXNzaW5nIGFueSBkZWNsYXJhdGlvbnMuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgIHN3aWcgLXQgdHlwZW1hcHMuaSAtcHl0aG9uIGV4YW1wbGUuaQoKICAgICAgICAgIEF0IG1vc3QsIG9ubHkgb25lIHR5cGVtYXAgZmlsZSBjYW4gYmUgc3BlY2lmaWVkIGluIHRoaXMgbWFubmVyLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKNi8xOC85NyA6IE5lZWQgYSBNYWtlZmlsZSBmYXN0PyBUeXBlCgogICAgICAgICAgICAgICAgIHN3aWcgWy10Y2wsIC1wZXJsNSwgLXB5dGhvbl0gLWNvIE1ha2VmaWxlCgogICAgICAgICAgYW5kIHlvdSB3aWxsIGdldCBhIE1ha2VmaWxlIHNwZWNpZmljIHRvIHRoYXQgdGFyZ2V0IGxhbmd1YWdlLgogICAgICAgICAgWW91IGp1c3QgbmVlZCB0byBtb2RpZnkgaXQgZm9yIHlvdXIgYXBwbGljYXRpb24gYW5kIHlvdSdyZQogICAgICAgICAgcmVhZHkgdG8gcnVuLgoKNi8xOC85NyA6IENvbXBsZXRlZCB0aGUgLWNpIG9wdGlvbi4gIFRoaXMgb3B0aW9uIGNoZWNrcyBhIGZpbGUgaW50byB0aGUKICAgICAgICAgIFNXSUcgbGlicmFyeS4gICBJdCBzaG91bGQgYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGEKICAgICAgICAgIGxhbmd1YWdlIG9wdGlvbi4gRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAgc3dpZyAtdGNsIC1jaSBmb29iYXIuaQoKICAgICAgICAgIENoZWNrcyB0aGUgZmlsZSBmb29iYXIuaSBpbnRvIHRoZSBUY2wgcGFydCBvZiB0aGUgbGlicmFyeS4KICAgICAgICAgIEluIG9yZGVyIHRvIGNoZWNrIGEgZmlsZSBpbnRvIHRoZSBnZW5lcmFsIGxpYnJhcnkgKGFjY2Vzc2libGUKICAgICAgICAgIHRvIGFsbCBsYW5ndWFnZXMgbW9kdWxlcyksIGRvIHRoZSBmb2xsb3dpbmcKCiAgICAgICAgICAgICAgICAgIHN3aWcgLWNpIC1vIC4uL2Zvb2Jhci5pIGZvb2Jhci5pCgogICAgICAgICAgKEFkbWl0dGVkbHkgdGhpcyBsb29rcyBhIGxpdHRsZSBzdHJhbmdlIGJ1dCBpcyB1bmF2b2lkYWJsZSkuCiAgICAgICAgICBUaGUgY2hlY2staW4gb3B0aW9uIGlzIHByaW1hcmlseSBkZXNpZ25lZCBmb3IgU1dJRyBtYWludGVuYW5jZQogICAgICAgICAgYW5kIGxpYnJhcnkgZGV2ZWxvcG1lbnQuIFRoZSBjb21tYW5kIHdpbGwgZmFpbCBpZiB0aGUgdXNlciBkb2VzCiAgICAgICAgICBub3QgaGF2ZSB3cml0ZSBwZXJtaXNzaW9uIHRvIHRoZSBTV0lHIGxpYnJhcnkuICBUaGlyZCBwYXJ0eSBsaWJyYXJ5CiAgICAgICAgICBleHRlbnNpb25zIGNhbiBlYXNpbHkgaW5zdGFsbCB0aGVtc2VsdmVzIGJ5IHNpbXBseSBwcm92aWRpbmcKICAgICAgICAgIGEgc2hlbGwgc2NyaXB0IHRoYXQgdXNlcyAnc3dpZyAtY2knIHRvIGluc3RhbGwgdGhlIGFwcHJvcHJpYXRlCiAgICAgICAgICBsaWJyYXJ5IGZpbGVzLiAgSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBrbm93IHdoZXJlIHRoZSBTV0lHIGxpYnJhcnkKICAgICAgICAgIGlzIGxvY2F0ZWQgaWYgeW91IHVzZSB0aGlzIG1lY2hhbmlzbS4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjYvMTYvOTcgOiBGaXhlZCBhIGJ1ZyBpbiBzaGFkb3cgY2xhc3MgZ2VuZXJhdGlvbiB3aGVuICVuYW1lKCkgd2FzIGFwcGxpZWQKICAgICAgICAgIHRvIGEgY2xhc3MgZGVmaW5pdGlvbi4gICBVbmZvcnR1bmF0ZWx5LCBmaXhpbmcgdGhlIGJ1ZyByZXF1aXJlZAogICAgICAgICAgYSBjaGFuZ2UgaW4gdGhlIExhbmd1YWdlIEMgQVBJIGJ5IGFkZGluZyBhbiBleHRyYSBhcmd1bWVudCB0bwogICAgICAgICAgdGhlIExhbmd1YWdlOjpjcHBfY2xhc3NfZGVjbCgpIGZ1bmN0aW9uLiAgVGhpcyBtYXkgYnJlYWsKICAgICAgICAgIFNXSUcgQysrIGV4dGVuc2lvbnMuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjYvMTUvOTcgOiBBZGRlZCBhIHdhcm5pbmcgbWVzc2FnZSBpZiBubyBtb2R1bGUgbmFtZSBpcyBzcGVjaWZpZWQgd2l0aCB0aGUKICAgICAgICAgICVtb2R1bGUgZGlyZWN0aXZlIG9yIC1tb2R1bGUgb3B0aW9uLgoKNi8xNS85NyA6IEZpeGVkIGxpbmUgbnVtYmVyIGJ1ZyB3aGVuIHJlcG9ydGluZyBlcnJvcnMgZm9yIHVuZGVmaW5lZAogICAgICAgICAgYmFzZSBjbGFzc2VzLgoKNi8xNS85NyA6IEFkZGVkIG5ldyAlcmVuYW1lIGRpcmVjdGl2ZS4gIFRoaXMgYWxsb3dzIHRoZSBmb3J3YXJkIGRlY2xhcmF0aW9uCiAgICAgICAgICBvZiBhIHJlbmFtaW5nLiAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAlcmVuYW1lIE9sZE5hbWUgTmV3TmFtZTsKCiAgICAgICAgICAgICAgICAgLi4uLiBsYXRlciAuLi4KICAgICAgICAgICAgICAgICBpbnQgT2xkTmFtZShpbnQpOwoKICAgICAgICAgIFVubGlrZSAlbmFtZSwgJXJlbmFtZSB3aWxsIHJlbmFtZSBhbnkgb2NjdXJyZW5jZSBvZiB0aGUgb2xkIG5hbWUuCiAgICAgICAgICBUaGlzIGFwcGxpZXMgdG8gZnVuY3Rpb25zLCB2YXJpYWJsZXMsIGNsYXNzIG1lbWJlcnMgYW5kIHNvIGZvcnRoLgogICAgICAgICAgVGhlcmUgaXMgbm8gd2F5IHRvIGRpc2FibGUgJXJlbmFtZSBvbmNlIHNldCwgYnV0IHlvdSBjYW4gY2hhbmdlIHRoZQogICAgICAgICAgbmFtZSBieSByZWRlY2xhcmluZyBpdCB0byBzb21ldGhpbmcgZWxzZS4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjYvMTUvOTcgOiBJbXByb3ZlZCB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlICVuYW1lIGRpcmVjdGl2ZSBzbyB0aGF0IGl0CiAgICAgICAgICBjb3VsZCBiZSB1c2VkIHdpdGggY29uZGl0aW9uYWwgY29tcGlsYXRpb24gOgoKICAgICAgICAgICAgICAgICAgICAjaWZkZWYgU1dJRwogICAgICAgICAgICAgICAgICAgICVuYW1lKE5ld05hbWUpCiAgICAgICAgICAgICAgICAgICAgI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgaW50IE9sZE5hbWUoaW50KTsKCjYvMTUvOTcgOiBBZGRlZCBzdXBwb3J0IGZvciBmdW5jdGlvbnMgd2l0aCBubyByZXR1cm4gZGF0YXR5cGUuICBJbiB0aGlzIGNhc2UsCiAgICAgICAgICBTV0lHIGFzc3VtZXMgYSByZXR1cm4gdHlwZSBvZiAnaW50Jy4KCjYvMTEvOTcgOiBJbXByb3ZlZCBlcnJvciByZXBvcnRpbmcgaW4gdGhlIHBhcnNlci4gIEl0IHNob3VsZCBiZSBhIGxpdHRsZQogICAgICAgICAgbGVzcyBzZW5zaXRpdmUgdG8gZXJyb3JzIHRoYXQgb2NjdXIgaW5zaWRlIGNsYXNzIGRlZmluaXRpb25zCiAgICAgICAgICBub3cuICBBbHNvIHJlcG9ydHMgZXJyb3JzIGZvciBmdW5jdGlvbiBwb2ludGVycy4KCjYvMTEvOTcgOiBNYWRlICckJyBhIGxlZ2FsIHN5bWJvbCBpbiBpZGVudGlmaWVycy4gIFRoaXMgaXMgdG8gc3VwcG9ydAogICAgICAgICAgc29tZSBPYmplY3RpdmUtQyBsaWJyYXJpZXMuICBTb21lIGNvbXBpbGVycyAoc3VjaCBhcyBnY2MpIG1heSBhbHNvCiAgICAgICAgICBhbGxvdyBpZGVudGlmaWVycyB0byBjb250YWluIGEgJCBpbiBDL0MrKyBjb2RlIGFzIHdlbGwgKHRoaXMgaXMKICAgICAgICAgIGFuIG9ic2N1cmUgZmVhdHVyZSBvZiBDKS4gV2hlbiAnJCcgYXBwZWFycyBpbiBpZGVudGlmaWVyLCBTV0lHCiAgICAgICAgICByZW1hcHMgaXQgdG8gdGhlIHN0cmluZyAnX1NfJyB3aGVuIGNyZWF0aW5nIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UKICAgICAgICAgIGZ1bmN0aW9uLiBUaHVzIGEgZnVuY3Rpb24gJ2ZvbyRiYXInIHdvdWxkIGJlIGNhbGxlZCAnZm9vX1NfYmFyJy4KCjYvMTEvOTcgOiBGaXhlZCBidWcgaW4gUHl0aG9uIHNoYWRvdyBjbGFzc2VzIHdpdGggX19yZXByX18gbWV0aG9kLiAgSWYKICAgICAgICAgIHN1cHBsaWVkIGJ5IHRoZSB1c2VyLCBpdCB3YXMgaWdub3JlZCwgYnV0IG5vdyBpdCBzaG91bGQgd29yay4KCjYvOS85NyAgOiBGaXhlZCB0aGUgVGNsIDguMCBtb2R1bGUgdG8gd29yayB3aXRoIFRjbCA4LjBiMS4gICBTV0lHIGlzIG5vCiAgICAgICAgICBsb25nZXIgY29tcGF0aWJsZSB3aXRoICphbnkqIGFscGhhIHJlbGVhc2Ugb2YgVGNsIDguMC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNi83Lzk3ICA6IFB1dCBhIG1heGltYWwgZXJyb3IgY291bnQgaW4gKGN1cnJlbnRseSBzZXQgdG8gMjApLiBTV0lHIHdpbGwgYmFpbCBvdXQKICAgICAgICAgIGlmIGl0IGdlbmVyYXRlcyBtb3JlIGVycm9ycyB0aGFuIHRoaXMgKHVzZWZ1bCBmb3IgcHJldmVudGluZyBTV0lHCiAgICAgICAgICBmcm9tIHByaW50aW5nIDQwMDAgc3ludGF4IGVycm9ycyB3aGVuIGl0IGdldHMgY29uZnVzZWQpLgoKNi83Lzk3ICA6IEZpeGVkIHNlZ21lbnRhdGlvbiBmYXVsdCB3aGVuIHBhcnNpbmcgdmFyaWFibGUgbGVuZ3RoIGFyZ3VtZW50cy4KCjYvNy85NyAgOiBNaW5vciBjaGFuZ2UgdG8gUGVybDUgbW9kdWxlLiAgQysrIHN0YXRpYyBmdW5jdGlvbnMgYXJlIG5vdwogICAgICAgICAgcHV0IGluIHRoZSBzYW1lIHBhY2thZ2UgYXMgdGhlaXIgY2xhc3Mgd2hlbiB1c2luZyBzaGFkb3cgY2xhc3Nlcy4KCjYvNy85NyAgOiBDZW50cmFsaXplZCB0aGUgbmFtaW5nIG9mIGZ1bmN0aW9ucywgbWVtYmVycywgd3JhcHBlcnMgZXRjLi4uIEJ5CiAgICAgICAgICBjZW50cmFsaXppbmcgdGhlIG5hbWluZyBzY2hlbWUsIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBtYWtlCiAgICAgICAgICBzb21lIG11bHRpLWZpbGUgb3B0aW1pemF0aW9ucy4gIEFsc28sIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0bwogICAgICAgICAgY2hhbmdlIFNXSUcncyBuYW1pbmcgc2NoZW1lIChwZXJoYXBzIGEgbmV3IGZlYXR1cmUgdG8gYmUgYWRkZWQKICAgICAgICAgIGxhdGVyKS4KCjYvMi85NyAgOiBBZGRlZCAnYXJnaW5pdCcgdHlwZW1hcC4gICBUaGlzIGNhbiBiZSB1c2VkIHRvIGFzc2lnbiBpbml0aWFsIHZhbHVlcwogICAgICAgICAgdG8gZnVuY3Rpb24gYXJndW1lbnRzLiAgRG9pbmcgc28gbWFrZXMgaXQgc29tZXdoYXQgZWFzaWVyIHRvIGRldGVjdAogICAgICAgICAgaW1wcm9wZXIgYXJndW1lbnQgcGFzc2luZyB3aGVuIHdvcmtpbmcgd2l0aCBvdGhlciB0eXBlbWFwcy4KCjYvMi85NyAgOiBGaXhlZCBjb2RlIGdlbmVyYXRpb24gYnVnIHdoZW4gcmVhZC1vbmx5IHZhcmlhYmxlcyB3ZXJlIGluaGVyaXRlZAogICAgICAgICAgaW50byBvdGhlciBjbGFzc2VzLiAgVW5kZXIgaW5oZXJpdGFuY2UsIHRoZSB2YXJpYWJsZXMgd291bGQKICAgICAgICAgIGJlY29tZSB3cml0YWJsZSwgYnV0IHRoaXMgaGFzIG5vdyBiZWVuIGNvcnJlY3RlZC4KCjUvMzAvOTcgOiBBbiBlbXB0eSAlbmFtZSgpIGRpcmVjdGl2ZSBpcyBubyBsb25nZXIgYWxsb3dlZCBvciBzdXBwb3J0ZWQuCiAgICAgICAgICBUaGlzIGRpcmVjdGl2ZSB3YXMgb3JpZ2luYWxseSB1c2VkIHRvIHN0cmlwIHRoZSBwcmVmaXgKICAgICAgICAgIG9mZiBvZiBhIGNsYXNzIG9yIHN0cnVjdHVyZS4gIFVuZm9ydHVuYXRlbHksIHRoaXMgbmV2ZXIgcmVhbGx5CiAgICAgICAgICBzZWVtZWQgdG8gd29yayByaWdodCBhbmQgaXQgY29tcGxpY2F0ZWQgdGhlIEMrKyBjb2RlIGdlbmVyYXRvcgogICAgICAgICAgc2lnbmlmaWNhbnRseS4gICBBcyBmYXIgYXMgSSBjYW4gdGVsbCBubyBvbmUgdXNlcyBpdCwgc28gaXQKICAgICAgICAgIGlzIG5vdyBoaXN0b3J5LiAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo1LzI4Lzk3IDogRml4ZWQgYSBwYXJzaW5nIGJ1ZyB3aXRoICNkZWZpbmUgYW5kIEMrKyBjb21tZW50cy4gIERlY2xhcmF0aW9ucwogICAgICAgICAgc3VjaCBhcyB0aGUgZm9sbG93aW5nIG5vdyB3b3JrIHByb3Blcmx5IDoKCiAgICAgICAgICAgICAgICAgICAjZGVmaW5lIENPTlNUICAgNCAgICAgLy8gQSBDb21tZW50Cgo1LzI4Lzk3IDogTWFkZSBzb21lIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyB0byB0aGUgU1dJRyBTdHJpbmcgY2xhc3MuCiAgICAgICAgICAob25seSBhZmZlY3RzIHRoZSBTV0lHIGNvbXBpbGVyIGl0c2VsZikuCgo1LzI4Lzk3IDogTW9kaWZpZWQgdGhlIHBhcnNlciB0byBza2lwIHRlbXBsYXRlIGRlZmluaXRpb25zIGFuZCBpc3N1ZSBhCiAgICAgICAgICB3YXJuaW5nIG1lc3NhZ2UuCgo1LzI4Lzk3IDogUHJlbGltaW5hcnkgc3VwcG9ydCBmb3IgcGFyYW1ldGVyaXplZCB0eXBlcyBhZGRlZCAoaWUuIHRlbXBsYXRlcykuCiAgICAgICAgICBUeXBlcyBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgc2hvdWxkIHBhc3MgdGhyb3VnaCB0aGUgU1dJRyBjb21waWxlcgoKICAgICAgICAgICAgICAgICAgICB2b2lkIGZvbyh2ZWN0b3I8Y29tcGxleD4gKmEsIHZlY3Rvcjxkb3VibGU+ICpiKTsKCiAgICAgICAgICBXaGVuIHVzZWQsIHRoZSBlbnRpcmUgbmFtZSAndmVjdG9yPGNvbXBsZXg+JyBiZWNvbWVzIHRoZSBuYW1lCiAgICAgICAgICBvZiB0aGUgZGF0YXR5cGUuICAgICAgRHVlIHRvIHNwYWNlIGxpbWl0YXRpb25zIGluIGRhdGF0eXBlCiAgICAgICAgICByZXByZXNlbnRhdGlvbnMsIHRoZSBuYW1lIHNob3VsZCBub3QgZXhjZWVkIDk2IGNoYXJhY3RlcnMuCgogICAgICAgICAgTm90ZSA6IFRoaXMgaXMgb25seSBwYXJ0IG9mIHdoYXQgaXMgbmVlZGVkIGZvciB0ZW1wbGF0ZSBzdXBwb3J0LgogICAgICAgICAgVGVtcGxhdGUgY2xhc3MgZGVmaW5pdGlvbnMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkIGJ5IFNXSUcuCgogICAgICAgICAgVGhlIHRlbXBsYXRlIG5vdGF0aW9uIGFib3ZlIG1heSBhbHNvIGJlIHVzZWQgd2hlbiBzcGVjaWZ5aW5nCiAgICAgICAgICBPYmplY3RpdmUtQyBwcm90b2NvbCBsaXN0cy4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjUvMjQvOTcgOiBGaXJzdCBjdXQgYXQgT2JqZWN0aXZlLUMgc3VwcG9ydCBhZGRlZC4gICBBcyBpdCB0dXJucyBvdXQsIGFsbW9zdAogICAgICAgICAgZXZlcnl0aGluZyBjYW4gYmUgaGFuZGxlZCB3aXRoIG9ubHkgYSBmZXcgbWlub3IgbW9kaWZpY2F0aW9ucyB0bwogICAgICAgICAgdGhlIEMrKyBtb2R1bGUuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo1LzIzLzk3IDogRml4ZWQgcmVwZWF0ZWQgZGVmaW5pdGlvbiBidWcgaW4gbXVsdGlwbGUgaW5oZXJpdGFuY2UgaGFuZGxpbmcKICAgICAgICAgIHdoZW4gbXVsdGlwbGUgYmFzZSBjbGFzc2VzIHNoYXJlIGEgY29tbW9uIGJhc2UgY2xhc3MgKGllLgogICAgICAgICAgdGhlIGV2aWwgZGlhbW9uZCkuCgo1LzIxLzk3IDogRml4ZWQgcmF0aGVyIGVtYmFycmFzc2luZyB0eXBvIHRoYXQgd29ya2VkIGl0cyB3YXkgaW50byB0aGUKICAgICAgICAgIFRlc3RzL0J1aWxkIGRpcmVjdG9yeS4KCjUvMTkvOTcgOiBGaXhlZCBjb2RlIGdlbmVyYXRpb24gYnVnIHdoZW4gdXNpbmcgbmF0aXZlIG1ldGhvZHMgYW5kCiAgICAgICAgICBzaGFkb3cgY2xhc3NlcyB3aXRoIFB5dGhvbiBhbmQgUGVybDUgbW9kdWxlcy4KCjUvMTkvOTcgOiBNb2RpZmllZCB0aGUgJWFwcGx5IGRpcmVjdGl2ZSBzbGlnaHRseSBzbyB0aGF0IGl0IHdvdWxkIHdvcmsKICAgICAgICAgIHdpdGggcG9pbnRlcnMgYSBsaXR0bGUgYmV0dGVyLiBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgICAlYXBwbHkgdW5zaWduZWQgbG9uZyB7IERXT1JEIH07CgogICAgICAgICAgQXBwbGllcyAqYWxsKiB0eXBlbWFwcyBhc3NvY2lhdGVkIHdpdGggInVuc2lnbmVkIGxvbmciIHRvCiAgICAgICAgICAiRFdPUkQiLiAgIFRoaXMgbm93IGluY2x1ZGVzIHBvaW50ZXJzIHRvIHRoZSB0d28gZGF0YXR5cGVzLgogICAgICAgICAgRm9yIGV4YW1wbGUsIGEgdHlwZW1hcCBhcHBsaWVkIHRvICJ1bnNpZ25lZCBsb25nICoqIiB3b3VsZAogICAgICAgICAgYWxzbyBiZSBhcHBsaWVkIHRvIGFueSBvY2N1cnJlbmNlIG9mICJEV09SRCAqKiIgYXMgd2VsbC4KCjUvMTkvOTcgOiBGaXhlZCBhbiBvd25lcnNoaXAgYXNzaWdubWVudCBidWcgaW4gdGhlIFBlcmw1IG1vZHVsZSB3aGVuCiAgICAgICAgICBjbGFzcyBtZW1iZXJzIHdlcmUgcmV0dXJuaW5nIG5ldyBvYmplY3RzIGJlbG9uZ2luZyB0bwogICAgICAgICAgZGlmZmVyZW50IGNsYXNzZXMuCgo1LzE3Lzk3IDogQWRkZWQgYSBmZXcgbW9yZSB0eXBlbWFwIHZhcmlhYmxlcy4KCiAgICAgICAgICAgICAgICAgICRuYW1lICAgICAgICAgIC0gTmFtZSBvZiBmdW5jdGlvbi92YXJpYWJsZS9tZW1iZXIKICAgICAgICAgICAgICAgICAgJGJhc2V0eXBlICAgICAgLSBCYXNlIGRhdGF0eXBlICh0eXBlIHdpdGhvdXQgcG9pbnRlcnMpCiAgICAgICAgICAgICAgICAgICRhcmdudW0gICAgICAgIC0gQXJndW1lbnQgbnVtYmVyCgo1LzE2Lzk3IDogRml4ZWQgZW1iYXJyYXNzaW5nIHVuZGVyc2NvcmUgZXJyb3IgaW4gbG9jYWwgdmFyaWFibGUKICAgICAgICAgIGFsbG9jYXRvci4KCjUvMTYvOTcgOiBGaXhlZCBuYW1lc3BhY2UgY2xhc2ggYnVnIGluIHBhcmFtZXRlcml6ZWQgdHlwZW1hcHMKICAgICAgICAgIHdoZW4gY3JlYXRpbmcgYXJyYXlzIGFzIG5ldyBsb2NhbCB2YXJpYWJsZXMuCgo1LzE1Lzk3IDogRml4ZWQgc29tZSBidWdzIHdpdGggaW5oZXJpdGFuY2Ugb2YgYWRkZWQgbWV0aG9kcyBhY3Jvc3MKICAgICAgICAgIG11bHRpcGxlIGZpbGVzLiAgIFNXSUcgbm93IHVzZXMgbmFtZXMgb2YgYmFzZSBjbGFzc2VzCiAgICAgICAgICB3aGVuIGdlbmVyYXRpbmcgc3VjaCBmdW5jdGlvbnMuCgo1LzE0Lzk3IDogRmluaXNoZWQgc3VwcG9ydCBmb3IgZGVmYXVsdCB0eXBlbWFwcy4gIFByaW1hcmlseSB1c2VkCiAgICAgICAgICBpbnRlcm5hbGx5LCB0aGV5IGNhbiBiZSB1c2VkIHRvIG1hdGNoIHRoZSBiYXNpYwogICAgICAgICAgYnVpbHQtaW4gZGF0YXR5cGVzIHVzZWQgaW5zaWRlIG9mIFNXSUcuICAgWW91IGNhbgogICAgICAgICAgc3BlY2lmeSB0aGVtIGluIGludGVyZmFjZSBmaWxlcyBhcyB3ZWxsIGxpa2UgdGhpcyA6CgogICAgICAgICAgICAgICAldHlwZW1hcCh0Y2wsaW4pIGludCBTV0lHX0RFRkFVTFRfVFlQRSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPSBhdG9pKCR0YXJnZXQpOwogICAgICAgICAgICAgICB9CgogICAgICAgICAgVW5saWtlIG5vcm1hbCB0eXBlbWFwcywgdGhpcyBkZWZhdWx0IG1hcCB3aWxsIGdldCBhcHBsaWVkCiAgICAgICAgICB0byAqYWxsKiBpbnRlZ2VyIGRhdGF0eXBlcyBlbmNvdW50ZXJlZCwgaW5jbHVkaW5nIHRob3NlCiAgICAgICAgICByZW5hbWVkIHdpdGggdHlwZWRlZiwgZXRjLi4uCgo1LzEzLzk3IDogRml4ZWQgc3Vic3RyaW5nIGJ1ZyBpbiB0eXBlIGNoZWNrZXIuCgo1LzEyLzk3IDogRml4ZWQgYnVnIGluIHBhcmFtZXRlcml6ZWQgdHlwZW1hcHMgd2hlbiBkZWNsYXJpbmcgbG9jYWwKICAgICAgICAgIHZhcmlhYmxlcyBvZiBzdHJ1Y3R1cmVzLgoKVmVyc2lvbiAxLjEgQmV0YTYgKE1heSA5LCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo1LzkvOTcgIDogRml4ZWQgYml6YXJyZSBOVUxMIHBvaW50ZXIgaGFuZGxpbmcgYnVnIGluIFBlcmw1IG1vZHVsZS4KCjUvOC85NyAgOiBGaXhlZCBteXN0ZXJpb3VzIHNlZ21lbnRhdGlvbiBmYXVsdCB3aGVuIHJ1bm5pbmcgU1dJRyBvbiBhbgogICAgICAgICAgZW1wdHkgZmlsZS4KCjUvNy85NyAgOiBUaGUgY29kZSBnZW5lcmF0b3Igd2lsbCBub3cgcmVwbGFjZSB0aGUgc3BlY2lhbCBzeW1ib2wgIiRjbGVhbnVwIgogICAgICAgICAgd2l0aCB0aGUgY2xlYW51cCBjb2RlIHNwZWNpZmllZCB3aXRoIHRoZSAiZnJlZWFyZyIgdHlwZW1hcC4KICAgICAgICAgIFRoaXMgY2hhbmdlIG5lZWRlZCB0byBwcm9wZXJseSBtYW5hZ2UgbWVtb3J5IGFuZCBleGNlcHRpb25zLgoKNS81Lzk3ICA6IEFkZGVkIHRoZSAndHlwZW1hcHMuaScgbGlicmFyeSBmaWxlLiAgVGhpcyBjb250YWlucyBhCiAgICAgICAgICB2YXJpZXR5IG9mIGNvbW1vbiB0eXBlbWFwcyBmb3IgaW5wdXQgdmFsdWVzLCBwb2ludGVycywKICAgICAgICAgIGFuZCBzbyBvbi4KCjUvNS85NyAgOiBDaGFuZ2VkIGJlaGF2aW9yIG9mICJhcmdvdXQiIHR5cGVtYXAgaW4gUHl0aG9uIG1vZHVsZS4KICAgICAgICAgIE9sZCB2ZXJzaW9ucyBhdXRvbWF0aWNhbGx5IHR1cm5lZCB0aGUgcmVzdWx0IGludG8gYQogICAgICAgICAgUHl0aG9uIGxpc3QuICBUaGUgbmV3IHZlcnNpb24gZG9lcyBub3RoaW5nLCBsZWF2aW5nIHRoZQogICAgICAgICAgaW1wbGVtZW50YXRpb24gdXAgdG8gdGhlIHVzZXIuICBUaGlzIHByb3ZpZGVzIG1vcmUgZmxleGliaWxpdHkKICAgICAgICAgIGJ1dCBtYXkgYnJlYWsgb2xkZXIgY29kZXMgdGhhdCByZWx5IG9uIHR5cGVtYXBzLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo1LzUvOTcgIDogRml4ZWQgYnVnIGluIFB5dGhvbiBtb2R1bGUgcmVsYXRlZCB0byB0aGUgaW50ZXJhY3Rpb24gb2YKICAgICAgICAgICJhcmdvdXQiIGFuZCAiaWdub3JlIiB0eXBlbWFwcy4KCjUvNS85NyAgOiBGaXhlZCBidWcgaW4gUHl0aG9uIG1vZHVsZSB0aGF0IHdvdWxkIGdlbmVyYXRlIGluY29ycmVjdCBjb2RlCiAgICAgICAgICBpZiBhbGwgZnVuY3Rpb24gYXJndW1lbnRzIGFyZSAiaWdub3JlZCIuCgo1LzQvOTcgIDogQWRkZWQgJWFwcGx5IGFuZCAlY2xlYXIgZGlyZWN0aXZlcy4gICBUaGVzZSBmb3JtIGEgaGlnaGVyIGxldmVsCiAgICAgICAgICBpbnRlcmZhY2UgdG8gdGhlIHR5cGVtYXAgbWVjaGFuaXNtLiAgSW4gYSBudXRzaGVsbCwgdGhleQogICAgICAgICAgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZSBwcm9jZXNzaW5nIG9mIHZhcmlvdXMgZGF0YXR5cGVzIHdpdGhvdXQKICAgICAgICAgIGV2ZXIgaGF2aW5nIHRvIHdyaXRlIGEgdHlwZW1hcC4gIFNlZSB0aGUgU1dJRyBkb2N1bWVudGF0aW9uCiAgICAgICAgICBmb3IgbW9yZSBkZXRhaWxzLiAgKiogTkVXIEZFQVRVUkUgKioKCjUvNC85NyAgOiBBZGRlZCBhIGxvY2FsIHZhcmlhYmxlIGV4dGVuc2lvbiB0byB0aGUgdHlwZW1hcCBoYW5kbGVyLgogICAgICAgICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAldHlwZW1hcCh0Y2wsaW4pIGRvdWJsZSAqKGRvdWJsZSB0ZW1wKSB7CgkJICAgICAgICB0ZW1wID0gYXRvZigkc291cmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9ICZ0ZW1wOwogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBJbiB0aGlzIGNhc2UsICd0ZW1wJyBpcyBhIGxvY2FsIHZhcmlhYmxlIHRoYXQgZXhpc3RzCiAgICAgICAgICBpbiB0aGUgZW50aXJlIHdyYXBwZXIgZnVuY3Rpb24gKG5vdCBqdXN0IHRoZSB0eXBlbWFwCiAgICAgICAgICBjb2RlKS4gIFRoaXMgbWVjaGFuaXNtIHByb3ZpZGVzIGJldHRlciBzdXBwb3J0IGZvcgogICAgICAgICAgY2VydGFpbiB0eXBlcyBvZiBhcmd1bWVudCBoYW5kbGluZyBhbmQgYWxzbyBtYWtlcyBpdAogICAgICAgICAgcG9zc2libGUgdG8gd3JpdGUgdGhyZWFkLXNhZmUgdHlwZW1hcHMuICBBbnkgbnVtYmVyCiAgICAgICAgICBsb2NhbCB2YXJpYWJsZXMgY2FuIGJlIGRlY2xhcmVkIGJ5IHN1cHBseWluZyBhIGNvbW1hCiAgICAgICAgICBzZXBhcmF0ZWQgbGlzdC4gICBMb2NhbCB2YXJpYWJsZXMgYXJlIGd1YXJhbnRlZWQgdG8gYmUKICAgICAgICAgIHVuaXF1ZSwgZXZlbiBpZiB0aGUgc2FtZSB0eXBlbWFwIGlzIGFwcGxpZWQgbWFueSB0aW1lcwogICAgICAgICAgaW4gYSBnaXZlbiBmdW5jdGlvbi4KICAgICAgICAgICoqIE5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGluIFBlcmw0IG9yIEd1aWxlIG1vZHVsZXMuCgo1LzIvOTcgIDogRml4ZWQgcHJvY2Vzc2luZyBvZiAlaWZkZWYsICVlbmRpZiwgJWlmLCBldGMuLi4gIChUaGVzZSBhcmUKICAgICAgICAgIFNXSUcgZXF1aXZhbGVudHMgb2YgdGhlIEMgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgdGhhdAogICAgICAgICAgY2FuIHBhc3MgdGhyb3VnaCB0aGUgQyBwcmVwcm9jZXNzb3Igd2l0aG91dCBtb2RpZmljYXRpb24pLgoKNS8yLzk3ICA6IEZpeGVkIG1ham9yIChidXQgc3VidGxlKSBidWcgaW4gdGhlIHJ1bi10aW1lIHR5cGUgY2hlY2tlcgogICAgICAgICAgcmVsYXRlZCB0byBzZWFyY2hpbmcgYW5kIHR5cGUtY2hlY2tpbmcgZm9yIEMrKyBpbmhlcml0YW5jZS4KICAgICAgICAgIFRvIG1ha2UgYSBsb25nIHN0b3J5IHNob3J0LCBpZiB5b3UgaGFkIHR3byBjbGFzc2VzIG5hbWVkCiAgICAgICAgICAiRm9vIiBhbmQgIkZvb09iamVjdCIgdGhlIHR5cGUgY2hlY2tlciB3b3VsZCBzb21ldGltZXMKICAgICAgICAgIGdldCBjb25mdXNlZCBhbmQgYmUgdW5hYmxlIHRvIGxvY2F0ZSAiRm9vIiBpbiBhbiBpbnRlcm5hbAogICAgICAgICAgdGFibGUuCgo1LzIvOTcgIDogRml4ZWQgc29tZSBidWdzIGluIHRoZSAtY28gb3B0aW9uLgoKNC8yNC85NyA6IFBvaW50ZXIgbGlicmFyeSBhZGRlZCB0byB0aGUgU1dJRyBsaWJyYXJ5LgoKNC8xOS85NyA6IEFkZGVkIHRoZSAlbmV3IGRpcmVjdGl2ZS4gICBUaGlzIGlzIGEgImhpbnQiIHRoYXQgY2FuIGJlIHVzZWQKICAgICAgICAgIHRvIHRlbGwgU1dJRyB0aGF0IGEgZnVuY3Rpb24gaXMgcmV0dXJuaW5nIGEgbmV3IG9iamVjdC4gRm9yCiAgICAgICAgICBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgICVuZXcgRm9vICpjcmVhdGVfZm9vKCk7CgogICAgICAgICAgVGhpcyB0ZWxscyBTV0lHIHRoYXQgY3JlYXRlX2ZvbygpIGlzIGNyZWF0aW5nIGEgbmV3IG9iamVjdAogICAgICAgICAgYW5kIHJldHVybmluZyBhIHBvaW50ZXIgdG8gaXQuICAgTWFueSBsYW5ndWFnZSBtb2R1bGVzIG1heQogICAgICAgICAgY2hvb3NlIHRvIGlnbm9yZSB0aGUgaGludCwgYnV0IHdoZW4gd29ya2luZyB3aXRoIHNoYWRvdyBjbGFzc2VzLAogICAgICAgICAgdGhlICVuZXcgaXMgdXNlZCB0byBoYW5kbGUgcHJvcGVyIG93bmVyc2hpcCBvZiBvYmplY3RzLgoKICAgICAgICAgICVuZXcgY2FuIGFsc28gYmUgdXNlZCB3aXRoIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBzdHJpbmdzLgogICAgICAgICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAgJW5ldyBjaGFyICpjcmVhdGVfc3RyaW5nKCk7CgogICAgICAgICAgV2hlbiB1c2VkLCBhbGwgb2YgdGhlIGxhbmd1YWdlIG1vZHVsZXMgd2lsbCBhdXRvbWF0aWNhbGx5IGNsZWFudXAKICAgICAgICAgIHRoZSByZXR1cm5lZCBzdHJpbmctLWVsaW1pbmF0aW5nIG1lbW9yeSBsZWFrcy4KICAgICAgICAgICoqIE5FVyBGRUFUVVJFICoqCgo0LzE5Lzk3IDogQWRkZWQgYSBuZXcgdHlwZW1hcCAibmV3ZnJlZSIuICAgVGhpcyBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGgKICAgICAgICAgIHRoZSAlbmV3IGRpcmVjdGl2ZSBhbmQgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZSBtZXRob2QgYnkgd2hpY2gKICAgICAgICAgIGEgbmV3IG9iamVjdCByZXR1cm5lZCBieSBhIGZ1bmN0aW9uIGlzIGRlbGV0ZWQuCgo0LzE5Lzk3IDogVGhlIHN5bWJvbCAiX19jcGx1c3BsdXMiIGlzIG5vdyBkZWZpbmVkIGluIHRoZSBTV0lHIGludGVycHJldGVyCiAgICAgICAgICB3aGVuIHJ1bm5pbmcgd2l0aCB0aGUgLWMrKyBvcHRpb24uCgo0LzE3Lzk3IDogQWRkZWQgc3VwcG9ydCBmb3Igc3RhdGljIG1lbWJlciBmdW5jdGlvbnMgd2hlbiB1c2VkIGluc2lkZSB0aGUKICAgICAgICAgICVhZGRtZXRob2RzIGRpcmVjdGl2ZS4KCjQvMTUvOTcgOiBBZGRlZCBhIHNwZWNpYWwgdHlwZW1hcCBzeW1ib2wgUFJFVklPVVMgdGhhdCBjYW4gYmUgdXNlZCB0bwogICAgICAgICAgcmVzdG9yZSBhIHByZXZpb3VzIHR5cGVtYXAuIEZvciBleGFtcGxlIDoKCgkgICAgICAgICAldHlwZW1hcCh0Y2wsaW4pIGludCAqID0gUFJFVklPVVM7CgogICAgICAgICAgVGhpcyBpcyBwcmltYXJpbHkgdXNlZCBpbiBsaWJyYXJ5IGZpbGVzLgoKNC8xMy85NyA6IEFkZGVkICVwcmFnbWEgZGlyZWN0aXZlIGZvciBQZXJsNSBtb2R1bGUuICAgVHdvIG5ldyBwcmFnbWFzIGFyZQogICAgICAgICAgYXZhaWxhYmxlIDoKCiAgICAgICAgICAgICAgICAgJXByYWdtYShwZXJsNSkgY29kZSA9ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgJXByYWdtYShwZXJsNSkgaW5jbHVkZSA9ICJmaWxlLnBsIgoKICAgICAgICAgIEJvdGggaW5zZXJ0IGNvZGUgaW50byB0aGUgLnBtIGZpbGUgY3JlYXRlZCBieSBTV0lHLiAgVGhpcyBjYW4KICAgICAgICAgIGJlIHVzZWQgdG8gYXV0b21hdGljYWxseSBjdXN0b21pemUgdGhlIC5wbSBmaWxlIGNyZWF0ZWQgYnkgU1dJRy4KCjQvMTMvOTcgOiBTY2FubmVyIG1vZGlmaWVkIHRvIG9ubHkgcmVjb2duaXplIEMrKyBrZXl3b3JkcyB3aGVuIHRoZSAtYysrCiAgICAgICAgICBvcHRpb24gaGFzIGJlZW4gc3BlY2lmaWVkLiAgVGhpcyBwcm92aWRlcyBzdXBwb3J0IGZvciBDIHByb2dyYW1zCiAgICAgICAgICB0aGF0IG1ha2UgdXNlIG9mIHRoZXNlIGtleXdvcmRzIGZvciBpZGVudGlmaWVycy4KICAgICAgICAgIFNXSUcgbWF5IG5lZWQgdG8gYmUgZXhwbGljaXRseSBydW4gd2l0aCB0aGUgLWMrKyBvcHRpb24gd2hlbgogICAgICAgICAgY29tcGlsaW5nIEMrKyBjb2RlICh0aGlzIHdhcyBhbGxvd2VkLCBidXQgbm90IHJlY29tbWVuZGVkIGluCiAgICAgICAgICBwcmV2aW91cyB2ZXJzaW9ucykuICoqUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSoqCgo0LzExLzk3IDogRml4ZWQgYSByYXRoZXIgbmFzdHkgYnVnIGluIHRoZSBQZXJsNSBtb2R1bGUgcmVsYXRlZCB0byB1c2luZwogICAgICAgICAgdmFyaWFibGUgbGlua2luZyB3aXRoIGNvbXBsZXggZGF0YXR5cGVzIGFuZCBwb2ludGVycy4gICBPbiBVbml4LAogICAgICAgICAgY29kZSB3b3VsZCB3b3JrIChzb21laG93KSwgYnV0IHdvdWxkIGNhdXNlIGFuIGFjY2VzcyB2aW9sYXRpb24KICAgICAgICAgIHVuZGVyIFdpbmRvd3MtTlQuICBUaGUgZml4IHNob3VsZCBjb3JyZWN0IHRoZSBwcm9ibGVtLAogICAgICAgICAgYnV0IHRoZXJlIG1heSBzdGlsbCBiZSBhIHByb2JsZW0gdXNpbmcgZ2xvYmFsIHZhcmlhYmxlcyBvZgogICAgICAgICAgY29tcGxleCBkYXRhdHlwZXMgaW4gY29uanVuY3Rpb24gd2l0aCBzaGFkb3cgY2xhc3Nlcy4gIEZvcnR1bmF0ZWx5LAogICAgICAgICAgdGhpcyBzb3J0IG9mIHRoaW5nIHNlZW1zIHRvIGJlIHJlbGF0aXZlbHkgcmFyZSAoY29uc2lkZXJpbmcKICAgICAgICAgIHRoYXQgdGhlIGJ1ZyBoYXMgYmVlbiBhcm91bmQgZm9yIG1vcmUgdGhhbiBhIHllYXIgLSB5aWtlcyEpLgoKNC8xMS85NyA6IEZpeGVkIGJpemFycmUgY29uc3RhbnQgZXZhbHVhdGlvbiBidWcgaW4gUGVybDUgY29kZSBnZW5lcmF0aW9uCiAgICAgICAgICB3aGVuIHJ1bm5pbmcgdW5kZXIgV2luZG93cy1OVC4KCjQvOC85NyAgOiBCdWcgd2hlbiB1c2luZyBkZWZhdWx0IGFyZ3VtZW50cyBhbmQgQysrIHJlZmVyZW5jZXMgZml4ZWQuCgo0LzgvOTcgIDogRml4ZWQgY29kZSBnZW5lcmF0aW9uIGJ1Z3MgaW4gUHl0aG9uIGFuZCBQZXJsNSBtb2R1bGVzIHJlbGF0ZWQgdG8KICAgICAgICAgIHVzaW5nIGNsYXNzIHJlbmFtaW5nIChhcHBseWluZyB0aGUgJW5hbWUgZGlyZWN0aXZlIHRvIGEgY2xhc3MKICAgICAgICAgIGRlZmluaXRpb24pIGFuZCBzaGFkb3cgY2xhc3Nlcy4KCjQvNy85NyAgOiBGaXhlZCBtaW5vciBidWdzIGluIHN3aWdwdHIuc3dnLCB0Y2w4cHRyLnN3ZywgYW5kIHBlcmw1cHRyLnN3ZyB0bwogICAgICAgICAgcHJldmVudCBpbmZpbml0ZSBsb29wcyB3aGVuIHdlaXJkIGRhdGF0eXBlcyBhcmUgcGFzc2VkLgoKMy8yOS85NyA6ICdNYWtlZmlsZS53aW4nIGFkZGVkLiAgIFRoaXMgaXMgdXNlZCB0byBidWlsZCBtb3N0IG9mIHRoZSBleGFtcGxlcwogICAgICAgICAgaW4gdGhlIEV4YW1wbGVzIGRpcmVjdG9yeSB1bmRlciBXaW5kb3dzIE5ULzk1LgoKMy8yNy85NyA6IEZpeGVzIHRvIFNXSUcncyBlcnJvciByZXR1cm4gY29kZXMuICAgU1dJRyBub3cgcmV0dXJucyBub24temVybwogICAgICAgICAgZXhpdCBjb2RlcyBmb3IgY2VydGFpbiBraW5kcyBvZiBlcnJvcnMgKHdoaWNoIG1ha2VzIGl0IG1vcmUKICAgICAgICAgIGZyaWVuZGx5IHRvIG1ha2VmaWxlcykuICAgICBBbiBvdmVyaGF1bCBvZiB0aGUgZXJyb3IgaGFuZGxpbmcKICAgICAgICAgIGlzIG9uIHRoZSB0by1kbyBsaXN0IGFuZCB3aWxsIHByb2JhYmx5IHNob3cgdXAgaW4gYSBsYXRlciByZWxlYXNlLgoKMy8yNS85NyA6IEJ1ZyBmaXguICAiZnJlZWFyZyIgYW5kICJhcmdvdXQiIHR5cGVtYXBzIGhhdmUgYmVlbiBmaXhlZCBpbgogICAgICAgICAgdGhlIFBlcmw1IG1vZHVsZS4gIEluIHByZXZpb3VzIHZlcnNpb25zLCBmdW5jdGlvbiBpbnB1dCBwYXJhbWV0ZXJzCiAgICAgICAgICBhbmQgZnVuY3Rpb24gb3V0cHV0IHBhcmFtZXRlcnMgc2hhcmVkIHRoZSBzYW1lIG1lbW9yeSBzcGFjZS0tY2F1c2luZwogICAgICAgICAgYWxsIHNvcnRzIG9mIG5hc3R5IHByb2JsZW1zIHdoZW4gdHJ5aW5nIHRvIHBhc3MgcGVybCB2YWx1ZXMgYnkKICAgICAgICAgIHJlZmVyZW5jZS4gICBTV0lHIG5vdyBpbnRlcm5hbGx5IG1ha2VzIGEgImNvcHkiICh3aGljaCBpcyByZWFsbHkKICAgICAgICAgIGp1c3QgYSBwb2ludGVyKSBvZiBhZmZlY3RlZCBwYXJhbWV0ZXJzIGFuZCB1c2VzIHRoYXQuICAgVGhpcwogICAgICAgICAgaXMgZG9uZSB0cmFuc3BhcmVudGx5IHNvIHRoZXJlIGlzIG5vIG5vdGljYWJsZSBpbXBhY3Qgb24gYW55CiAgICAgICAgICBTV0lHIGdlbmVyYXRlZCBtb2R1bGVzLiAgIFRoaXMgY2hhbmdlIGlzIHByb2JhYmx5IG9ubHkgbm90aWNhYmxlCiAgICAgICAgICB0byBleHBlcnQgdXNlcnMuCgozLzI1Lzk3IDogQWRkZWQgdHlwZS1jaGVjayB0byB2ZXJib3NlIGFuZCBzdGF0IG1vZGUuICBTV0lHIHdpbGwgbm93IGdlbmVyYXRlIGEgbGlzdAogICAgICAgICAgb2YgYWxsIGRhdGF0eXBlcyB0aGF0IHdlcmUgdXNlZCBidXQgdW5kZWZpbmVkICh1c2VmdWwgZm9yIHRyYWNraW5nCiAgICAgICAgICBkb3duIHdlaXJkIGJ1Z3MpLiAgIFRoaXMgaXMgZW5hYmxlZCB3aXRoIHRoZSAtdiBvcHRpb24gKHdoaWNoCiAgICAgICAgICBpcyBub3cgb2ZmaWNpYWxseSBrbm93biBhcyAib3Zlcmx5IHZlcmJvc2UiIG1vZGUpIG9yIHRoZSAtc3RhdCBvcHRpb24uCgozLzI1Lzk3IDogU2xpZ2h0IGNoYW5nZSB0byB0aGUgcGFyc2VyIHRvIG1ha2UgaW5jbHVkZSBndWFyZHMgd29yayBjb3JyZWN0bHkuCiAgICAgICAgICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgI2lmbmRlZiBJTlRFUkZBQ0VfSQogICAgICAgICAgICAgICAgI2RlZmluZSBJTlRFUkZBQ0VfSQogICAgICAgICAgICAgICAgJW1vZHVsZSBmb29iYXIuaQogICAgICAgICAgICAgICAgLi4uIGRlY2xhcmF0aW9ucyAuLi4KICAgICAgICAgICAgICAgICNlbmRpZgoKMy8yNC85NyA6ICVjaGVja291dCBkaXJlY3RpdmUgYWRkZWQuICAgVGhpcyBhbGxvd3MgYW4gaW50ZXJmYWNlIGZpbGUgdG8KICAgICAgICAgIGV4dHJhY3QgZmlsZXMgZnJvbSB0aGUgU1dJRyBsaWJyYXJ5IGFuZCBwbGFjZSB0aGVtIGluIHRoZQogICAgICAgICAgY3VycmVudCBkaXJlY3RvcnkuICAgVGhpcyBjYW4gYmUgdXNlZCB0byBleHRyYWN0IHNjcmlwdHMgYW5kCiAgICAgICAgICBvdGhlciBoZWxwZXIgY29kZSB0aGF0IG1pZ2h0IGJlIGFzc29jaWF0ZWQgd2l0aCBsaWJyYXJ5IGZpbGVzLgogICAgICAgICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICVjaGVja291dCBhcnJheS50Y2wKCiAgICAgICAgICBXaWxsIGxvb2sgZm9yIGEgZmlsZSAiYXJyYXkudGNsIiBpbiB0aGUgbGlicmFyeSBhbmQgY29weSBpdAogICAgICAgICAgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgICBJZiB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUKICAgICAgICAgIGRpcmVjdG9yeSwgdGhpcyBkaXJlY3RpdmUgZG9lcyBub3RoaW5nIChpdCB3aWxsIG5vdCBvdmVyd3JpdGUgYW4KICAgICAgICAgIGV4aXN0aW5nIGZpbGUpLiAgVGhpcyBvbmx5IGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGZvciBub3cuCgozLzI0Lzk3IDogU1dJRyB3aWxsIG5vdyBsb29rIGluIHRoZSBTV0lHIExpYnJhcnkgZm9yIGEgZmlsZSBpZiBpdCBjYW4ndAogICAgICAgICAgZmluZCBpdCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuICBBcyBhIHJlc3VsdCwgaXQgaXMgZWFzeSB0bwogICAgICAgICAgbWFrZSBtb2R1bGVzIGZyb20gU1dJRyBsaWJyYXJ5IGZpbGVzLiAgRm9yIGV4YW1wbGUsIGlmIHlvdQogICAgICAgICAgd2FudCB0byBtYWtlIGEgUHl0aG9uIG1vZHVsZSBmcm9tIHRoZSBTV0lHIHRpbWVycyBsaWJyYXJ5LCBqdXN0CiAgICAgICAgICB0eXBlIHRoaXMgaW4gYW55IGRpcmVjdG9yeSA6CgogICAgICAgICAgICAgICAgc3dpZyAtcHl0aG9uIHRpbWVycy5pCgogICAgICAgICAgWW91IHdpbGwgZ2V0IHRoZSBmaWxlcyB0aW1lcnNfd3JhcC5jIGFuZCB0aW1lcnNfd3JhcC5kb2MgaW4KICAgICAgICAgIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB0aGF0IHlvdSBjYW4gbm93IGNvbXBpbGUuICAgVGhlIGZpbGUKICAgICAgICAgIHJlbWFpbnMgaW4gdGhlIFNXSUcgbGlicmFyeSAoYWx0aG91Z2ggeW91IGNhbiBjaGVjayBpdCBvdXQKICAgICAgICAgIHVzaW5nIHRoZSAtY28gb3B0aW9uKS4gICoqKiBOZXcgRmVhdHVyZSAqKioKCjMvMjQvOTcgOiAtY28gb3B0aW9uIGFkZGVkIHRvIFNXSUcgdG8gYWxsb3cgZWFzeSBhY2Nlc3MgdG8gdGhlIFNXSUcgbGlicmFyeS4KICAgICAgICAgIFdoZW4gdXNlZCwgdGhpcyBpbnN0cnVjdHMgU1dJRyB0byBjaGVjayBvdXQgYSBsaWJyYXJ5IGZpbGUgYW5kCiAgICAgICAgICBwbGFjZSBpdCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgdW5peCA+IHN3aWcgLWNvIGFycmF5LmkKICAgICAgICAgICAgICAgIGFycmF5LmkgY2hlY2tlZCBvdXQgZnJvbSB0aGUgU1dJRyBsaWJyYXJ5CiAgICAgICAgICAgICAgICB1bml4ID4KCiAgICAgICAgICBPbmNlIGluIHlvdXIgZGlyZWN0b3J5IHlvdSBjYW4gY3VzdG9taXplIHRoZSBmaWxlIHRvIHN1aXQgeW91cgogICAgICAgICAgcGFydGljdWxhciBwdXJwb3Nlcy4gIFRoZSBjaGVja291dCBvcHRpb24gbWFrZXMgaXQgZWFzeSB0bwogICAgICAgICAgZ3JhYiBsaWJyYXJ5IGZpbGVzIHdpdGhvdXQga25vd2luZyBhbnl0aGluZyBhYm91dCB0aGUgU1dJRwogICAgICAgICAgaW5zdGFsbGF0aW9uLCBidXQgaXQgYWxzbyBtYWtlcyBpdCBwb3NzaWJsZSB0byBzdGFydAogICAgICAgICAgaW5jbHVkaW5nIHNjcmlwdHMsIEMgY29kZSwgYW5kIG90aGVyIG1pc2NlbGxhbmVvdXMgZmlsZXMKICAgICAgICAgIGluIHRoZSBsaWJyYXJ5LiAgRm9yIGV4YW1wbGUsIHlvdSBjb3VsZCBwdXQgYSBjb29sIHNjcmlwdAogICAgICAgICAgaW4gdGhlIGxpYnJhcnkgYW5kIGNoZWNrIGl0IG91dCB3aGVuZXZlciB5b3Ugd2FudGVkIHRvIHVzZSBpdC4KICAgICAgICAgICoqKiBOZXcgRmVhdHVyZSAqKioKCjMvMjQvOTcgOiAjcHJhZ21hIGV4cG9ydCBkaXJlY3RpdmVzIGFkZGVkIHRvIFRjbCBvdXRwdXQgZm9yIGNvbXBpbGluZwogICAgICAgICAgc2hhcmVkIGxpYnJhcmllcyBvbiB0aGUgTWFjLgoKMy8yNC85NyA6IE1pbm9yIGNoYW5nZXMgdG8gd2lzaC5pIGFuZCB0Y2xzaC5pIGxpYnJhcnkgZmlsZXMgdG8gcHJvdmlkZQogICAgICAgICAgc3VwcG9ydCBmb3IgdGhlIE1hY2ludG9zaC4KCjMvMTkvOTcgOiBTV0lHJ3MgcG9saWN5IHRvd2FyZHMgTlVMTCBwb2ludGVycyBoYXMgYmVlbiByZWxheGVkLiAgVGhlCiAgICAgICAgICBwb2xpY3kgb2YgcmVxdWlyaW5nIGEgc3BlY2lhbCBjb21waWxlciBkaXJlY3RpdmUgLURBTExPV19OVUxMCiAgICAgICAgICB0byB1c2UgTlVMTCBwb2ludGVycyBpcyBubyBsb25nZXIgc3VwcG9ydGVkLiAgV2hpbGUgdGhpcyBtYXkKICAgICAgICAgIHNlZW0gInVuc2FmZSIsIGl0IHR1cm5zIG91dCB0aGF0IHlvdSBjYW4gdXNlIGEgImNoZWNrIgogICAgICAgICAgdHlwZW1hcCB0byBhY2hpZXZlIHNvbWUgc2FmZXR5LiAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChwZXJsNSxjaGVjaykgTm9kZSAqIHsKICAgICAgICAgICAgICAgICAgICAgICBpZiAoISR0YXJnZXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9haygiTlVMTCBQb2ludGVycyBub3QgYWxsb3dlZC4iKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBUaGlzIHByZXZlbnRzIGFueSBOVUxMIHZhbHVlIG9mIGEgIk5vZGUgKiIgcG9pbnRlciB0byBiZQogICAgICAgICAgcGFzc2VkIHRvIGEgZnVuY3Rpb24uICAgKEkgdGhpbmsgdGhpcyBpcyBtdWNoIGNsZWFuZXIKICAgICAgICAgIHRoYW4gdGhlIG9sZCAtREFMTE9XX05VTEwgaGFjayBhbnl3YXlzKS4KCjMvMTkvOTcgOiBGaXhlZCBwb2ludGVyIGhhbmRsaW5nIGVycm9ycyBpbiBQZXJsNSBtb2R1bGUuICBNb2R1bGVzIG5vCiAgICAgICAgICBsb25nZXIgY29yZSBkdW1wIHdoZW4gYSBQZXJsIHJlZmVyZW5jZSBpcyBpbmFkdmVydGVudGx5CiAgICAgICAgICBwYXNzZWQgaW4gYXMgYSBDIHBvaW50ZXIuCgozLzE4Lzk3IDogQWRkZWQgYSAiY2hlY2siIHR5cGVtYXAuICAgVGhpcyBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGUKICAgICAgICAgIHZhbGlkaXR5IG9mIGZ1bmN0aW9uIGlucHV0IHZhbHVlcy4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChwZXJsNSxjaGVjaykgaW50IHBvc2ludCB7CiAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR0YXJnZXQgPCAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9haygiQXJndW1lbnQgaXMgbm90IGEgcG9zaXRpdmUgaW50ZWdlciIpOwogICAgICAgICAgICAgICAgfQoKMy8xOC85NyA6IEFkZGVkIGFuICRhcmcgdmFyaWFibGUgdG8gVGNsIHR5cGVtYXBzLiAgIFRoaXMgbWFrZXMgaXQgZWFzaWVyCiAgICAgICAgICB0byByZXR1cm4gYXJndW1lbnQgdmFsdWVzIGJ5ICJyZWZlcmVuY2UiLgoKMy8xOC85NyA6IEZpeGVkIGEgY29kZSBnZW5lcmF0aW9uIGJ1ZyB3aGVuIHVzaW5nIEMrKyByZWZlcmVuY2VzIGFuZAogICAgICAgICAgdGhlICVhZGRtZXRob2RzIGRpcmVjdGl2ZS4KCjMvMTgvOTcgOiBGaXhlZCBhIGZldyBnbGl0Y2hlcyBpbiB0aGUgdHlwZW1hcCBtb2R1bGUgd2l0aCByZXNwZWN0IHRvCiAgICAgICAgICBjaGFpbmluZy4gRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKHRjbCxpbikgaW50IHsKICAgICAgICAgICAgICAgICAgICAgICAkaW4gICAgICAgICAgICAgICAgLy8gSW5zZXJ0cyBwcmV4aXN0aW5nIHR5cGVtYXAKICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlJlY2VpdmVkIGEgJWRcbiIsICR0YXJnZXQpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFRoaXMgaGFzIGJlZW4gYWxsb3dlZCBmb3IgcXVpdGUgc29tZSB0aW1lLCBidXQgZGlkbid0IHdvcmsKICAgICAgICAgIGlmIG5vIGV4aXN0aW5nIHR5cGVtYXAgd2FzIGRlZmluZWQuICBOb3csIGl0IHN0aWxsIGRvZXNuJ3QKICAgICAgICAgIHdvcmsgaWYgbm8gZXhpc3RpbmcgdHlwZW1hcCBpcyBkZWZpbmVkLCBidXQgaXQgaXNzdWVzIGEKICAgICAgICAgIHdhcm5pbmcgbWVzc2FnZS4gICBUaGVyZSBpcyBzb21lIHN1cHBvcnQgdXNpbmcgZGVmYXVsdCB0eXBlbWFwcywKICAgICAgICAgIGJ1dCBub25lIG9mIHRoZSBsYW5ndWFnZSBtb2R1bGVzIHRha2UgYWR2YW50YWdlIG9mIGl0LiAgVGhpcwogICAgICAgICAgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZXhwZXJpbWVudGFsIGF0IHRoaXMgdGltZS4KClZlcnNpb24gMS4xYjUgUGF0Y2ggMSAoTWFyY2ggMTYsIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgozLzE2Lzk3IDogRml4ZWQgcmVmZXJlbmNlcyBidWcgd2l0aCBDKysgY29kZSBnZW5lcmF0aW9uLgoKMy8xNi85NyA6IEZpeGVkIGluaXRpYWxpemF0aW9uIGJ1ZyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0gdGhhdAogICAgICAgICAgd2FzIGNhdXNpbmcgd2VpcmQgcHJvYmxlbXMuCgozLzE2Lzk3IDogRml4ZWQgZmF0YWwgYnVnIHdpdGggLWMgb3B0aW9uIGluIHRoZSBQeXRob24gbW9kdWxlLgoKMy8xMy85NyA6IEZpeGVkIGJ1ZyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0gaW52b2x2aW5nIHRoZSAldGV4dCBkaXJlY3RpdmUKICAgICAgICAgIGFuZCBzb3J0aW5nLiBJbiB0aGUgb2xkIHN5c3RlbSwgJXRleHQgZW50cmllcyB3b3VsZCBmbG9hdCB0byB0aGUKICAgICAgICAgIHRvcCBvZiBhIHNlY3Rpb24gYmVjYXVzZSB0aGV5IHdlcmUgIm5hbWVsZXNzIi4gICBOb3cgdGhleSBhcmUKICAgICAgICAgIGF0dGFjaGVkIHRvIHRoZSBwcmV2aW91cyBkZWNsYXJhdGlvbiBhbmQgd2lsbCBzdGF5IGluIHRoZSBwcm9wZXIKICAgICAgICAgIGxvY2F0aW9uIHJlbGF0aXZlIHRvIHRoZSBwcmV2aW91cyBlbnRyeS4KClZlcnNpb24gMS4xYjUgKE1hcmNoIDEyLCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjMvMTEvOTcgOiBGaXhlZCBjb21waWxhdGlvbiBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IFRjbC9UayA4LjBhMi4KICAgICAgICAgICoqKiBJTkNPTVBBVElCSUxJVFkgKioqIFNXSUcgbm8gbG9uZ2VyIHdvcmtzIHdpdGggVGNsL1RrIDguMGExLgoKMy8xMC85NyA6IEZpeGVkIGJ1ZyB3aXRoIGlnbm9yZWQgYXJndW1lbnRzIGFuZCBDKysgbWVtYmVyIGZ1bmN0aW9ucyBpbgogICAgICAgICAgdGhlIFB5dGhvbiBtb2R1bGUuCgozLzkvOTcgIDogUGFyc2luZyBidWdzIHdpdGggbmVzdGVkIGNsYXNzIGRlZmluaXRpb25zIGFuZCBwcml2YXRlbHkKICAgICAgICAgIGRlY2xhcmVkIG5lc3RlZCBjbGFzcyBkZWZpbml0aW9ucyBmaXhlZC4KCjMvOS85NyAgOiBGaXhlZCBhIGZldyBtaW5vciBjb2RlIGdlbmVyYXRpb24gYnVncyB3aXRoIEMrKyBjbGFzc2VzIGFuZAogICAgICAgICAgY29uc3RydWN0b3JzLiAgIEluIHNvbWUgY2FzZXMsIHRoZSByZXN1bHRpbmcgd3JhcHBlciBjb2RlCiAgICAgICAgICB3b3VsZCBub3QgY29tcGlsZSBwcm9wZXJseS4gICBTV0lHIG5vdyBhdHRlbXB0cyB0byB1c2UKICAgICAgICAgIHRoZSBkZWZhdWx0IGNvcHkgY29uc3RydWN0b3IgaW5zdGVhZC4KCjMvOC85NyAgOiBBZGRlZCBhIC1sIG9wdGlvbiB0byBTV0lHIHRoYXQgYWxsb3dzIGFkZGl0aW9uYWwgU1dJRyBsaWJyYXJ5IGZpbGVzCiAgICAgICAgICB0byBiZSBncmFiYmVkIHdpdGhvdXQgaGF2aW5nIHRoZW0gc3BlY2lmaWVkIGluIHRoZSBpbnRlcmZhY2UgZmlsZS4KICAgICAgICAgIFRoaXMgbWFrZXMgaXQgZWFzaWVyIHRvIGtlZXAgdGhlIGludGVyZmFjZSBmaWxlIGNsZWFuIGFuZCBtb3ZlIGNlcnRhaW4KICAgICAgICAgIG9wdGlvbnMgaW50byBhIE1ha2VmaWxlLiAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgc3dpZyAtdGNsIGV4YW1wbGUuaSAgICAgICAgICAgICAgIyAgQnVpbGQgYSBub3JtYWwgVGNsIGV4dGVuc2lvbgogICAgICAgICAgICAgIHN3aWcgLXRjbCAtbHdpc2guaSBleGFtcGxlLmkgICAgICMgIEJ1aWxkIGl0IGFzIGEgd2lzaCBleHRlbnNpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICBieSBpbmNsdWRpbmcgdGhlICd3aXNoLmknIGZpbGUuCgogICAgICAgICAgICAgIHN3aWcgLXB5dGhvbiBleGFtcGxlLmkgICAgICAgICAgICMgQnVpbGQgYSBkeW5hbWljYWxseSBsb2FkZWQgZXh0ZW5zaW9uCiAgICAgICAgICAgICAgc3dpZyAtcHl0aG9uIC1sZW1iZWQuaSBleGFtcGxlLmkgIyBCdWlsZCBhIHN0YXRpYyBleHRlbnNpb24KCiAgICAgICAgICBUaGVzZSBraW5kcyBvZiBvcHRpb25zIGNvdWxkIHByZXZpb3VzbHkgYmUgYWNjb21wbGlzaGVkIHdpdGgKICAgICAgICAgIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHN1Y2ggYXMgOgoKICAgICAgICAgICAgICAgICAgICVtb2R1bGUgZXhhbXBsZQogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAjaWZkZWYgU1RBVElDCiAgICAgICAgICAgICAgICAgICAlaW5jbHVkZSBlbWJlZC5pCiAgICAgICAgICAgICAgICAgICAjZW5kaWYKCjMvOC85NyAgOiBJbmNvcnBvcmF0ZWQgY2hhbmdlcyB0byBHdWlsZSBtb2R1bGUgdG8gdXNlIHRoZSBuZXcgZ2ggaW50ZXJmYWNlCiAgICAgICAgICBpbiBGU0YgR3VpbGUgMS4wLiAgICBUaGUgb2xkZXIgZ3NjbSBpbnRlcmZhY2UgdXNlZCBpbiBDeWdudXMKICAgICAgICAgIEd1aWxlIHJlbGVhc2VzIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgYnkgU1dJRy4KCjMvOC85NyAgOiBDbGVhbmVkIHVwIHRoZSBUY2wgTmV0c2NhcGUgcGx1Z2luIGV4YW1wbGUuICAgSXQgc2hvdWxkIHdvcmsgd2l0aAogICAgICAgICAgdmVyc2lvbiAxLjEgb2YgdGhlIHBsdWdpbiBub3cuCgozLzgvOTcgIDogQWRkZWQgYmV0dGVyIGFycmF5IHN1cHBvcnQgdG8gdGhlIHR5cGVtYXAgbW9kdWxlLiAgVGhlIGtleXdvcmQKICAgICAgICAgIEFOWSBjYW4gbm93IGJlIHVzZWQgdG8gbWF0Y2ggYW55IGFycmF5IGRpbWVuc2lvbi4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgICAgJXR5cGVtYXAodGNsLGluKSBkb3VibGUgW0FOWV0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4gZ2V0IGFuIGFycmF5IC4uLgogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBUaGlzIHdpbGwgbWF0Y2ggYW55IHNpbmdsZS1kaW1lbnNpb25hbCBkb3VibGUgYXJyYXkuICAgVGhlIGFycmF5CiAgICAgICAgICBkaW1lbnNpb24gaXMgcGFzc2VkIGluIHRoZSB2YXJpYWJsZXMgJGRpbTAsICRkaW0xLCAuLi4gJGRpbTkuICBGb3IKICAgICAgICAgIGV4YW1wbGUgOgoKCQkgICAgJXR5cGVtYXAodGNsLGluKSBkb3VibGUgW0FOWV1bQU5ZXVtBTlldIHsKCQkJcHJpbnRmKCJSZWNlaXZlZCBhIGRvdWJsZVslZF1bJWRdWyVkXVxuIiwkZGltMCwkZGltMSwkZGltMik7CgkgICAgICAgICAgICB9CgogICAgICAgICAgQW55IHR5cGVtYXAgaW52b2x2aW5nIGEgc3BlY2lmaWMgYXJyYXkgZGltZW5zaW9uIHdpbGwgb3ZlcnJpZGUgYW55CiAgICAgICAgICBzcGVjaWZpZWQgd2l0aCB0aGUgQU5ZIHRhZy4gIFRodXMsIGEgJXR5cGVtYXAodGNsLGluKSBkb3VibGUgWzVdWzRdW0FOWV0ge30KICAgICAgICAgIHdvdWxkIG92ZXJyaWRlIGEgZG91YmxlIFtBTlldW0FOWV1bQU5ZXS4gIEhvd2V2ZXIsIG92ZXJ1c2Ugb2YgdGhlIEFOWQogICAgICAgICAgdGFnIGluIGFycmF5cyBvZiBoaWdoLWRpbWVuc2lvbnMgbWF5IG5vdCB3b3JrIGFzIHlvdSBleHBlY3QgZHVlIHRvCiAgICAgICAgICB0aGUgcGF0dGVybiBtYXRjaGluZyBydWxlIHVzZWQuIEZvciBleGFtcGxlLCB3aGljaCBvZiB0aGUgZm9sbG93aW5nCiAgICAgICAgICB0eXBlbWFwcyBoYXMgcHJlY2VkZW5jZT8KCiAgICAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgZG91YmxlIFtBTlldWzVdIHt9ICAgICAvLyBBdm9pZCB0aGlzIQogICAgICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGRvdWJsZSBbNV1bQU5ZXSB7fQoKMy83Lzk3ICA6IEZpeGVkIGEgbnVtYmVyIG9mIGJ1Z3MgcmVsYXRlZCB0byBtdWx0aS1kaW1lbnNpb25hbCBhcnJheSBoYW5kbGluZy4KICAgICAgICAgIFR5cGVkZWZzIGludm9sdmluZyBtdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgbm93IHdvcmtzIGNvcnJlY3RseS4KICAgICAgICAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgICAgdHlwZWRlZiBkb3VibGUgTUFUUklYWzRdWzRdOwoKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICBleHRlcm4gZG91YmxlIGZvbyhNQVRSSVggYSk7CgogICAgICAgICAgVHlwZWNhc3Rpbmcgb2YgcG9pbnRlcnMgaW50byBtdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgaXMgbm93CiAgICAgICAgICBpbXBsZW1lbnRlZCBwcm9wZXJseSB3aGVuIG1ha2luZyBDL0MrKyBmdW5jdGlvbiBjYWxscy4KCjMvNi85NyAgOiBGaXhlZCBwb3RlbnRpYWxseSBkYW5nZXJvdXMgYnVnIGluIHRoZSBUY2wgT2JqZWN0LW9yaWVudGVkCiAgICAgICAgICBpbnRlcmZhY2UuICBXZWxsLCBhY3R1YWxseSwgZGlkbid0IGZpeCBpdCBidXQgaXNzdWVkIGEKICAgICAgICAgIFRjbCBlcnJvciBpbnN0ZWFkLiAgIFRoZSBidWcgd291bGQgbWFuaWZlc3QgaXRzZWxmIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICAgICUgc2V0IGwgW0xpc3RdICAgICAgICAgICAjIENyZWF0ZSBhbiBvYmplY3QKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAlIHNldCBtIFtMaXN0IC10aGlzICRsXSAgIyBNYWtlICRtIGludG8gYW4gb2JqZWN0IGFzc3VtaW5nICRsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY29udGFpbnMgYSBwb2ludGVyLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFNpbmNlICRtID09ICRsLCAkbCBnZXRzIGRlc3Ryb3llZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChzaW5jZSBpdHMgdGhlIHNhbWUgY29tbWFuZCBuYW1lKQogICAgICAgICAgICAgICAgICUgJG0gaW5zZXJ0IEZvbwogICAgICAgICAgICAgICAgIFNlZ21lbnRhdGlvbiBmYXVsdCAgICAgICAjIE5vdGUgOiB0aGUgbGlzdCBubyBsb25nZXIgZXhpc3RzIQoKICAgICAgICAgIE5vdywgYW4gZXJyb3Igd2lsbCBiZSBnZW5lcmF0ZWQgaW5zdGVhZCBvZiByZWRlZmluaW5nIHRoZSBjb21tYW5kLgogICAgICAgICAgQXMgaW4gOgoKICAgICAgICAgICAgICAgICAlIHNldCBsIFtMaXN0XQogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICUgc2V0IG0gW0xpc3QgLXRoaXMgJGxdCiAgICAgICAgICAgICAgICAgT2JqZWN0IG5hbWUgYWxyZWFkeSBleGlzdHMhCgogICAgICAgICAgVXNlIGNhdGNoe30gdG8gaWdub3JlIHRoZSBlcnJvci4KCjMvMy85NyAgOiBCZXR0ZXIgc3VwcG9ydCBmb3IgZW51bXMgYWRkZWQuICAgRGF0YXR5cGVzIG9mICdlbnVtIE15RW51bScKICAgICAgICAgIGFuZCB0eXBlZGVmcyBzdWNoIGFzICd0eXBlZGVmIGVudW0gTXlFbnVtIEZvbzsnIG5vdyB3b3JrLgoKMy8zLzk3ICA6IFBhcnNlciBtb2RpZmllZCB0byBpZ25vcmUgY29uc3RydWN0b3IgaW5pdGlhbGl6ZXJzIHN1Y2ggYXMgOgoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIDogcHVibGljIEJhciB7CiAgICAgICAgICAgICAgIGludCBhLGI7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgRm9vKGludCBpKSA6IGEoMCksIGIoaSksIEJhcihpLDApIHsgfTsKICAgICAgICAgICAgICAgfTsKCjMvMy85NyAgOiBNb2RpZmllZCBwYXJzZXIgdG8gaWdub3JlIEMrKyBleGNlcHRpb24gc3BlY2lmaWNhdGlvbnMgc3VjaCBhcyA6CgogICAgICAgICAgICAgICBpbnQgZm9vKGRvdWJsZSkgdGhyb3coWCxZKTsKCjMvMy85NyAgOiBBZGRlZCAlaW1wb3J0IGRpcmVjdGl2ZS4gIFRoaXMgd29ya3MgZXhhY3RseSBsaWtlICVleHRlcm4KICAgICAgICAgIGV4Y2VwdCBpdCB0ZWxscyB0aGUgbGFuZ3VhZ2UgbW9kdWxlIHRoYXQgdGhlIGRlY2xhcmF0aW9ucyBhcmUKICAgICAgICAgIGNvbWluZyBmcm9tIGEgc2VwYXJhdGUgbW9kdWxlLiAgIFRoaXMgaXMgdXN1YWxseSBvbmx5CiAgICAgICAgICBuZWVkZWQgd2hlbiB3b3JraW5nIHdpdGggc2hhZG93IGNsYXNzZXMuCgozLzIvOTcgIDogQ2hhbmdlZCBwb2ludGVyIHR5cGUtY2hlY2tlciB0byBiZSBzaWduaWZpY2FudGx5IG1vcmUKICAgICAgICAgIGVmZmljaWVudCB3aGVuIHdvcmtpbmcgd2l0aCBkZXJpdmVkIGRhdGF0eXBlcy4gIFRoaXMKICAgICAgICAgIGhhcyBiZWVuIGFjY29tcGxpc2hlZCBieSBzdG9yaW5nIHR5cGUtbWFwcGluZ3MgaW4gc29ydGVkCiAgICAgICAgICBvcmRlciwgdXNpbmcgYmluYXJ5IHNlYXJjaCBzY2hlbWVzLCBhbmQgY2FjaGluZyByZWNlbnRseQogICAgICAgICAgdXNlZCBkYXRhdHlwZXMuICAgRm9yIFNXSUcgZ2VuZXJhdGVkIEMrKyBtb2R1bGVzIHRoYXQKICAgICAgICAgIG1ha2UgYSBsYXJnZSBudW1iZXIgb2YgQyBmdW5jdGlvbiBjYWxscyB3aXRoIGRlcml2ZWQgdHlwZXMsCiAgICAgICAgICB0aGlzIGNvdWxkIHJlc3VsdCBpbiBzcGVlZHVwcyBvZiBiZXR3ZWVuIDEwMCBhbmQgNTAwMDAgcGVyY2VudC4KICAgICAgICAgIEhvd2V2ZXIsIGR1ZSB0byB0aGUgcmVxdWlyZWQgc29ydGluZyBvcGVyYXRpb24sIG1vZHVsZQogICAgICAgICAgbG9hZGluZyB0aW1lIG1heSBpbmNyZWFzZWQgc2xpZ2h0bHkgd2hlbiB0aGVyZSBhcmUgbG90cyBvZgogICAgICAgICAgZGF0YXR5cGVzLgoKMy8yLzk3ICA6IEZpeGVkIHNvbWUgQysrIGNvbXBpbGF0aW9uIHByb2JsZW1zIHdpdGggUHl0aG9uCiAgICAgICAgICBlbWJlZC5pIGxpYnJhcnkgZmlsZXMuCgoyLzI3Lzk3IDogU2xpZ2h0IGNoYW5nZSB0byBDKysgY29kZSBnZW5lcmF0aW9uIHRvIHVzZSBjb3B5IGNvbnN0cnVjdG9ycwogICAgICAgICAgd2hlbiByZXR1cm5pbmcgY29tcGxleCBkYXRhIHR5cGUgYnkgdmFsdWUuCgoyLzI2Lzk3IDogRml4ZWQgYnVnIGluIFB5dGhvbiBtb2R1bGUgd2l0aCAtYyBvcHRpb24uCgoyLzI2Lzk3IDogU2xpZ2h0IHR3ZWFrIG9mIHBhcnNlciB0byBhbGxvdyB0cmFpbGluZyBjb21tYSBpbiBlbnVtZXJhdGlvbnMKICAgICAgICAgIHN1Y2ggYXMKCiAgICAgICAgICAgICAgICBlbnVtIFZhbHVlIChBTEUsIFNUT1VULCBMQUdFUiwgfTsKCjIvMjUvOTcgOiBGaXhlZCBjb2RlIGdlbmVyYXRpb24gYnVnIGluIFRjbCBtb2R1bGUgd2hlbiB1c2luZyB0aGUKICAgICAgICAgICVuYW1lKCkgZGlyZWN0aXZlIG9uIGEgY2xhc3NuYW1lLgoKMi8yNS85NyA6IEZpbmlzaGVkIGNvZGUtc2l6ZSBvcHRpbWl6YXRpb24gb2YgQysrIGNvZGUgZ2VuZXJhdGlvbiB3aXRoCiAgICAgICAgICBpbmhlcml0YW5jZSBvZiBhdHRyaWJ1dGVzLiAgICBJbmhlcml0ZWQgYXR0cmlidXRlcyBub3cKICAgICAgICAgIG9ubHkgZ2VuZXJhdGUgb25lIHNldCBvZiB3cmFwcGVyIGZ1bmN0aW9ucyB0aGF0IGFyZSByZS11c2VkCiAgICAgICAgICBpbiBhbnkgZGVyaXZlZCBjbGFzc2VzLiAgIFRoaXMgY291bGQgcHJvdmlkZSBiaWcgY29kZQogICAgICAgICAgc2l6ZSBpbXByb3ZlbWVudHMgaW4gc29tZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgaW50ZXJmYWNlcy4KCjIvMjUvOTcgOiBQZXJsNSBtb2R1bGUgbW9kaWZpZWQgdG8gc3VwcG9ydCBib3RoIHRoZSBVbml4IGFuZCBXaW5kb3dzCiAgICAgICAgICB2ZXJzaW9ucy4gIFRoZSB3aW5kb3dzIHZlcnNpb24gaGFzIGJlZW4gdGVzdGVkIHdpdGggdGhlCiAgICAgICAgICBBY3RpdmV3YXJlIHBvcnQgb2YgUGVybCA1LjAwMyBydW5uaW5nIHVuZGVyIFdpbmRvd3MgOTUuCiAgICAgICAgICBUaGUgQyBzb3VyY2UgZ2VuZXJhdGVkIGJ5IFNXSUcgc2hvdWxkIGNvbXBpbGUgd2l0aG91dAogICAgICAgICAgbW9kaWZpY2F0aW9uIHVuZGVyIGJvdGggdmVyc2lvbnMgb2YgUGVybCwgYnV0IGlzIG5vdwogICAgICAgICAgZXZlbiBtb3JlIGhpZGVvdXMgdGhhbiBiZWZvcmUuCgoyLzI1Lzk3IDogTW9kaWZpZWQgcGFyc2VyIHRvIGFsbG93IHNjb3BlIHJlc29sdXRpb24gb3BlcmF0aW9uIHRvCiAgICAgICAgICBhcHBlYXIgaW4gZXhwcmVzc2lvbnMgYW5kIGRlZmF1bHQgYXJndW1lbnRzIGFzIGluIDoKCiAgICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgYSA9ICBCYXI6OmRlZnZhbHVlKTsKCjIvMjUvOTcgOiBGaXhlZCBidWcgd2hlbiByZXNvbHZpbmcgc3ltYm9scyBpbnNpZGUgQysrIGNsYXNzZXMuCiAgICAgICAgICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICBlbnVtIFZhbHVlIHtBTEUsIFNUT1VULCBMQUdFUn07CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIHZvaWQgZGVmYXJnKFZhbHVlIHYgPSBTVE9VVCk7CgogICAgICAgICAgICAgIH07CgoyLzI0Lzk3IDogRml4ZWQgYnVnIHdpdGggbWVtYmVyIGZ1bmN0aW9ucyByZXR1cm5pbmcgdm9pZCAqLgoKMi8yMy85NyA6IE1vZGlmaWVkIFB5dGhvbiBtb2R1bGUgdG8gYmUgYmV0dGVyIGJlaGF2ZWQgdW5kZXIgV2luZG93cwoKICAgICAgICAgICAgLSAgTW9kdWxlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGlzIG5vdyBwcm9wZXJseSBleHBvcnRlZC4KICAgICAgICAgICAgICAgSXQgc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkgdG8gZXhwbGljaXRseSBleHBvcnQgdGhpcyBmdW5jdGlvbgogICAgICAgICAgICAgICB5b3Vyc2VsZi4KCiAgICAgICAgICAgIC0gIEJpemFycmUgY29tcGlsYXRpb24gcHJvYmxlbXMgd2hlbiBjb21waWxpbmcgdGhlIFNXSUcgd3JhcHBlcgogICAgICAgICAgICAgICBjb2RlIGFzIEFOU0kgQyB1bmRlciBWaXN1YWwgQysrIDQueCBmaXhlZC4KCiAgICAgICAgICAgIC0gIFRlc3RlZCB3aXRoIGJvdGggdGhlIHN0b2NrIFB5dGhvbi0xLjQgZGlzdHJpYnV0aW9uIGFuZCBQeXRob253aW4KICAgICAgICAgICAgICAgcnVubmluZyB1bmRlciBXaW45NS4KCjIvMTkvOTcgOiBGaXhlZCB0eXBlZGVmIGhhbmRsaW5nIGJ1ZyBpbiBQZXJsNSBzaGFkb3cgY2xhc3Nlcy4KCjIvMTkvOTcgOiBBZGRlZCBleGNlcHRpb24gc3VwcG9ydC4gIFRvIHVzZSBpdCwgZG8gdGhlIGZvbGxvd2luZyA6CgogICAgICAgICAgICAgICVleGNlcHQobGFuZykgewogICAgICAgICAgICAgICAgICAuLi4gdHJ5IHBhcnQgb2YgdGhlIGV4Y2VwdGlvbiAuLi4KICAgICAgICAgICAgICAgICAgJGZ1bmN0aW9uCiAgICAgICAgICAgICAgICAgIC4uLiBjYXRjaCBwYXJ0IG9mIGV4Y2VwdGlvbiAuLi4KICAgICAgICAgICAgICB9CgogICAgICAgICAgJGZ1bmN0aW9uIGlzIGEgU1dJRyB2YXJpYWJsZSB0aGF0IHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlCiAgICAgICAgICBhY3R1YWwgQy9DKysgZnVuY3Rpb24gY2FsbCBpbiBhIHdyYXBwZXIgZnVuY3Rpb24uICBUaHVzLAogICAgICAgICAgYSByZWFsIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIG1pZ2h0IGxvb2sgbGlrZSB0aGlzIDoKCiAgICAgICAgICAgICAlZXhjZXB0KHBlcmw1KSB7CiAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICRmdW5jdGlvbgogICAgICAgICAgICAgICAgICB9IGNhdGNoIChjaGFyIComIHN6KSB7CiAgICAgICAgICAgICAgICAgICAgLi4uIHByb2Nlc3MgYW4gZXhjZXB0aW9uIC4uLgogICAgICAgICAgICAgICAgICB9IGNhdGNoKC4uLikgewogICAgICAgICAgICAgICAgICAgIGNyb2FrKCJVbmtub3duIGV4Y2VwdGlvbi4gQmFpbGluZyBvdXQuLi4iKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQoKMi8xOS85NyA6IEFkZGVkIHN1cHBvcnQgZm9yIG1hbmFnaW5nIGdlbmVyaWMgY29kZSBmcmFnbWVudHMgKG5lZWRlZAogICAgICAgICAgZm9yIGV4Y2VwdGlvbnMpLgoKMi8xOS85NyA6IEZpeGVkIHNvbWUgcmVhbGx5IG9ic2N1cmUgdHlwZW1hcCBzY29waW5nIGJ1Z3MgaW4gdGhlIEMrKwogICAgICAgICAgaGFuZGxlci4KCjIvMTgvOTcgOiBDbGVhbmVkIHVwIHBlcmxtYWluLmkgZmlsZSBieSByZW1vdmluZyBzb21lIHByb2JsZW1hdGljLAogICAgICAgICAgYnV0IHNlZW1pbmdseSB1bm5lY2Vzc2FyeSBkZWNsYXJhdGlvbnMuCgoyLzE4Lzk3IDogT3B0aW1pemVkIGhhbmRsaW5nIG9mIG1lbWJlciBmdW5jdGlvbnMgdW5kZXIgaW5oZXJpdGFuY2UuCiAgICAgICAgICBTV0lHIGNhbiBub3cgdXNlIHdyYXBwZXIgZnVuY3Rpb25zIGdlbmVyYXRlZCBmb3IgYQogICAgICAgICAgYmFzZSBjbGFzcyBpbnN0ZWFkIG9mIHJlZ2VuZXJhdGluZyB3cmFwcGVycyBmb3IKICAgICAgICAgIHRoZSBzYW1lIGZ1bmN0aW9ucyBpbiBhIGRlcml2ZWQgY2xhc3MuICAgIFRoaXMgY291bGQKICAgICAgICAgIG1ha2UgYSBkcmFzdGljIHJlZHVjdGlvbiBpbiB3cmFwcGVyIGNvZGUgc2l6ZSBmb3IgQysrCiAgICAgICAgICBhcHBsaWNhdGlvbnMgd2l0aCBkZWVwIGluaGVyaXRhbmNlIGhpZXJhcmNoaWVzIGFuZAogICAgICAgICAgbG90cyBvZiBmdW5jdGlvbnMuCgoyLzE4Lzk3IDogQWRkaXRpb25hbCBtZXRob2RzIHNwZWNpZmllZCB3aXRoICVhZGRtZXRob2RzIGNhbiBub3cKICAgICAgICAgIGJlIGluaGVyaXRlZCBhbG9uZyB3aXRoIG5vcm1hbCBDKysgbWVtYmVyIGZ1bmN0aW9ucy4KCjIvMTgvOTcgOiBNaW5vciBpbnRlcm5hbCBmaXhlcyB0byBtYWtlIFNXSUcncyBzdHJpbmcgaGFuZGxpbmcgYSBsaXR0bGUKICAgICAgICAgIHNhZmVyLgoKMi8xNi85NyA6IE1vdmVkIHNvbWUgY29kZSBnZW5lcmF0aW9uIG9mIFRjbCBzaGFkb3cgY2xhc3NlcyB0bwogICAgICAgICAgbGlicmFyeSBmaWxlcy4KCjIvMTYvOTcgOiBGaXhlZCBkb2N1bWVudGF0aW9uIGVycm9yIG9mICctY29uZmlndXJlJyBtZXRob2QgaW4KICAgICAgICAgIFRjbCBtb2R1bGVzLgoKMi8xNi85NyA6IE1vZGlmaWVkIFBlcmw1IG1vZHVsZSBzbGlnaHRseSB0byBhbGxvdyB0eXBlbWFwcwogICAgICAgICAgdG8gdXNlIFBlcmwgcmVmZXJlbmNlcy4KCjIvMTIvOTcgOiBGaXhlZCBhcmd1bWVudCBjaGVja2luZyBidWcgdGhhdCB3YXMgaW50cm9kdWNlZCBieQogICAgICAgICAgZGVmYXVsdCBhcmd1bWVudHMgKGZ1bmN0aW9uIGNhbGxzIHdpdGggdG9vIG1hbnkKICAgICAgICAgIGFyZ3VtZW50cyB3b3VsZCBzdGlsbCBiZSBleGVjdXRlZCkuICBGdW5jdGlvbnMgbm93CiAgICAgICAgICBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGFyZ3VtZW50cyBhcyBDIHZlcnNpb24KICAgICAgICAgICh3aXRoIHBvc3NpYmlsaXR5IG9mIGRlZmF1bHQvb3B0aW9uYWwgYXJndW1lbnRzCiAgICAgICAgICBzdGlsbCBzdXBwb3J0ZWQpLgoKMi8xMi85NyA6IEZpeGVkIGRlZmF1bHQgYXJndW1lbnQgYnVnIGluIFBlcmw1IG1vZHVsZSB3aGVuCiAgICAgICAgICBnZW5lcmF0aW5nIHdyYXBwZXIgZnVuY3Rpb25zIGludm9sdmluZyBkZWZhdWx0CiAgICAgICAgICBhcmd1bWVudHMgb2YgY29tcGxleCBkYXRhdHlwZXMuCgoyLzEyLzk3IDogRml4ZWQgdHlwZW1hcCBzY29waW5nIHByb2JsZW1zLiAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAldHlwZW1hcCh0Y2wsaW4pIGRvdWJsZSB7CiAgICAgICAgICAgICAgICAgICAgLi4gZ2V0IGEgZG91YmxlIC4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgIGRvdWJsZSBiYXIoZG91YmxlKTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICV0eXBlbWFwKHRjbCxpbikgZG91YmxlIHsKICAgICAgICAgICAgICAgICAgICAuLiBuZXcgZ2V0IGRvdWJsZSAuLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICBXb3VsZCBhcHBseSB0aGUgc2Vjb25kIHR5cGVtYXAgdG8gYWxsIGZ1bmN0aW9ucyBpbiBGb28KICAgICAgICAgIGR1ZSB0byBkZWxheWVkIGdlbmVyYXRpb24gb2YgQysrIHdyYXBwZXIgY29kZSAoY2xlYXJseSB0aGlzCiAgICAgICAgICBpcyBub3QgdGhlIGRlc2lyZWQgZWZmZWN0KS4gICBQcm9ibGVtIGhhcyBiZWVuIGZpeGVkIGJ5CiAgICAgICAgICBhc3NpZ25pbmcgdW5pcXVlIG51bWVyaWNhbCBpZGVudGlmaWVycyB0byBldmVyeSBkYXRhdHlwZSBpbgogICAgICAgICAgYW4gaW50ZXJmYWNlIGZpbGUgYW5kIHJlY29yZGluZyB0aGUgInJhbmdlIG9mIGVmZmVjdCIgb2YgZWFjaAogICAgICAgICAgdHlwZW1hcC4KCjIvMTEvOTcgOiBBZGRlZCBzdXBwb3J0IGZvciAiaWdub3JlIiBhbmQgImRlZmF1bHQiIHR5cGVtYXBzLiAgT25seSB1c2UKICAgICAgICAgIGlmIHlvdSBhYnNvbHV0ZWx5IGtub3cgd2hhdCB5b3UncmUgZG9pbmcuCgoyLzkvOTcgIDogQWRkZWQgYXV0b21hdGljIGNyZWF0aW9uIG9mIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgZm9yCiAgICAgICAgICBDIHN0cnVjdHMgYW5kIEMrKyBjbGFzc2VzIHRoYXQgZG8gbm90IHNwZWNpZnkgYW55IHNvcnQgb2YKICAgICAgICAgIGNvbnN0cnVjdG9yIG9yIGRlc3RydWN0b3IuICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBlbmFibGVkIGJ5CiAgICAgICAgICBydW5uaW5nIFNXSUcgd2l0aCB0aGUgJy1tYWtlX2RlZmF1bHQnIG9wdGlvbiBvciBieSBpbnNlcnRpbmcKICAgICAgICAgIHRoZSBmb2xsb3dpbmcgcHJhZ21hIGludG8gYW4gaW50ZXJmYWNlIGZpbGUgOgoKICAgICAgICAgICAgICAgICAlcHJhZ21hIG1ha2VfZGVmYXVsdAoKICAgICAgICAgIFRoZSBmb2xsb3dpbmcgcHJhZ21hIGRpc2FibGVzIGF1dG9tYXRpYyBjb25zdHJ1Y3RvciBnZW5lcmF0aW9uCgogICAgICAgICAgICAgICAgICVwcmFnbWEgbm9fZGVmYXVsdAoKMi85Lzk3ICA6IEFkZGVkIC1tYWtlX2RlZmF1bHQgb3B0aW9uIGZvciBwcm9kdWNpbmcgZGVmYXVsdCBjb25zdHJ1Y3RvcnMKICAgICAgICAgIGFuZCBkZXN0cnVjdG9ycyBmb3IgY2xhc3NlcyB3aXRob3V0IHRoZW0uCgoyLzkvOTcgIDogQ2hhbmdlZCB0aGUgc3ludGF4IG9mIHRoZSBTV0lHICVwcmFnbWEgZGlyZWN0aXZlIHRvCiAgICAgICAgICAlcHJhZ21hIG9wdGlvbj12YWx1ZSBvciAlcHJhZ21hKGxhbmcpIG9wdGlvbj12YWx1ZS4KICAgICAgICAgIFRoaXMgY2hhbmdlIG1ha2VzIHRoZSBzeW50YXggYSBsaXR0bGUgbW9yZSBjb25zaXN0ZW50CiAgICAgICAgICBiZXR3ZWVuIGdlbmVyYWwgcHJhZ21hcyBhbmQgbGFuZ3VhZ2Utc3BlY2lmaWMgcHJhZ21hcy4KICAgICAgICAgIFRoZSBvbGQgc3ludGF4IHN0aWxsIHdvcmtzLCBidXQgd2lsbCBwcm9iYWJseSBiZSBwaGFzZWQKICAgICAgICAgIG91dCAoYSB3YXJuaW5nIG1lc3NhZ2UgaXMgY3VycmVudGx5IHByaW50ZWQpLgoKMi85Lzk3ICA6IEltcHJvdmVkIFRjbCBzdXBwb3J0IG9mIGdsb2JhbCB2YXJpYWJsZXMgdGhhdCBhcmUgb2YKICAgICAgICAgIHN0cnVjdHVyZXMsIGNsYXNzZXMsIGFuZCB1bmlvbnMuCgoyLzkvOTcgIDogRml4ZWQgQysrIGNvbXBpbGF0aW9uIHByb2JsZW0gaW4gUHl0aG9uICdlbWJlZC5pJyBsaWJyYXJ5IGZpbGUuCgoyLzkvOTcgIDogRml4ZWQgbWlzc2luZyByZXR1cm4gdmFsdWUgaW4gcGVybG1haW4uaSBsaWJyYXJ5IGZpbGUuCgoyLzkvOTcgIDogRml4ZWQgUHl0aG9uIHNoYWRvdyBjbGFzc2VzIHRvIHJldHVybiBhbiBBdHRyaWJ1dGVFcnJvciB3aGVuCiAgICAgICAgICB1bmRlZmluZWQgYXR0cmlidXRlcyBhcmUgYWNjZXNzZWQgKG9sZGVyIHZlcnNpb25zIHJldHVybmVkCiAgICAgICAgICBhIE5hbWVFcnJvcikuCgoyLzkvOTcgIDogRml4ZWQgYnVnIHdoZW4gJWFkZG1ldGhvZHMgaXMgdXNlZCBhZnRlciBhIGNsYXNzIGRlZmluaXRpb24gd2hvc2UKICAgICAgICAgIGxhc3Qgc2VjdGlvbiBpcyBwcm90ZWN0ZWQgb3IgcHJpdmF0ZS4KCjIvOC85NyAgOiBNYWRlIHNsaWdodCBjaGFuZ2VzIGluIGluY2x1ZGUgZmlsZSBwcm9jZXNzaW5nIHRvIHN1cHBvcnQKICAgICAgICAgIHRoZSBNYWNpbnRvc2guCgoyLzgvOTcgIDogRXh0ZW5kZWQgc3dpZ21haW4uY3h4IHRvIHByb3ZpZGUgYSBydWRpbWVudGFyeSBNYWNpbnRvc2ggaW50ZXJmYWNlLgogICAgICAgICAgSXQncyBhIHJlYWxseSBiYWQgaW50ZXJmYWNlLCBidXQgd29ya3MgdW50aWwgc29tZXRoaW5nIGJldHRlcgogICAgICAgICAgaXMgd3JpdHRlbi4KCjEvMjkvOTcgOiBGaXhlZCB0eXBlLWNhc3RpbmcgYnVnIGludHJvZHVjZWQgYnkgMS4xYjQgd2hlbiBzZXR0aW5nL2dldHRpbmcgdGhlCiAgICAgICAgICB2YWx1ZSBvZiBnbG9iYWwgdmFyaWFibGVzIGludm9sdmluZyBjb21wbGV4IGRhdGEgdHlwZXMuCgoxLzI5Lzk3IDogUmVtb3ZlZCBlcnJvbmVvdXMgd2hpdGUgc3BhY2UgYmVmb3JlIGFuICNlbmRpZiBpbiB0aGUgY29kZSBnZW5lcmF0ZWQKICAgICAgICAgIGJ5IHRoZSBQeXRob24gbW9kdWxlICh3YXMgY2F1c2luZyBlcnJvcnMgb24gREVDIEFscGhhIGNvbXBpbGVycykuCgoxLzI2Lzk3IDogRml4ZWQgZXJyb3JzIHdoZW4gdXNpbmcgZGVmYXVsdC9vcHRpb25hbCBhcmd1bWVudHMgaW4gUHl0aG9uIHNoYWRvdwoJICBzaGFkb3cgY2xhc3Nlcy4KCjEvMjMvOTcgOiBGaXhlZCBidWcgd2l0aCBuZXN0ZWQgJWV4dGVybiBkZWNsYXJhdGlvbnMuCgoxLzIxLzk3IDogRml4ZWQgcHJvYmxlbSB3aXRoIHR5cGVkZWYgaW52b2x2aW5nIGNvbnN0IGRhdGF0eXBlcy4KCjEvMjEvOTcgOiBTb21ld2hhdCBvYnNjdXJlLCBidXQgc2VyaW91cyBidWcgd2l0aCBoYXZpbmcgbXVsdGlwbGUgbGV2ZWxzCiAgICAgICAgICBvZiB0eXBlZGVmcyBmaXhlZC4gIEZvciBleGFtcGxlIDoKCgkJdHlwZWRlZiBjaGFyICpTdHJpbmc7CiAgICAgICAgICAgICAgICB0eXBlZGVmIFN0cmluZyAgTmFtZTsKClZlcnNpb24gMS4xIEJldGE0IChKYW51YXJ5IDE2LCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCk5vdGUgOiBTV0lHIDEuMWIzIGNyYXNoZWQgYW5kIGJ1cm5lZCBzaG9ydGx5IGFmdGVyIHRha2Ugb2ZmIGR1ZQp0byBhIGZldyBtYWpvciBydW4tdGltZSBwcm9ibGVtcyB0aGF0IHN1cmZhY2VkIGFmdGVyIHJlbGVhc2UuClRoaXMgcmVsZWFzZSBzaG91bGQgZml4IG1vc3QsIGlmIG5vdCBhbGwsIG9mIHRob3NlIHByb2JsZW1zLgoKMS8xNi85NyA6IEZpeGVkIG1ham9yIG1lbW9yeSBtYW5hZ2VtZW50IGJ1ZyBvbiBMaW51eAoKMS8xNC85NyA6IEZpeGVkIGJ1ZyBpbiBmdW5jdGlvbnMgcmV0dXJuaW5nIGNvbnN0YW50IEMrKyByZWZlcmVuY2VzLgoKMS8xNC85NyA6IE1vZGlmaWVkIEMrKyBtb2R1bGUgdG8gaGFuZGxlIGRhdGF0eXBlcyBiZXR0ZXIuCgoxLzE0Lzk3IDogTW9kaWZpZWQgcGFyc2VyIHRvIGFsbG93IGEgKnNpbmdsZSogc2NvcGUgcmVzb2x1dGlvbgogICAgICAgICAgb3BlcmF0b3IgaW4gZGF0YXR5cGVzLiAgSWUgOiBGb286OmJhci4gICBTV0lHIGRvZXNuJ3QKICAgICAgICAgIHlldCBoYW5kbGUgbmVzdGVkIGNsYXNzZXMsIHNvIHRoaXMgc2hvdWxkIGJlCiAgICAgICAgICBzdWZmaWNpZW50IGZvciBub3cuCgoxLzE0Lzk3IDogTW9kaWZpZWQgcGFyc2VyIHRvIGFsbG93IHR5cGVkZWYgaW5zaWRlIGEgQysrIGNsYXNzLgoKMS8xNC85NyA6IEZpeGVkIHNvbWUgcHJvYmxlbXMgcmVsYXRlZCB0byBkYXRhdHlwZXMgZGVmaW5lZCBpbnNpZGUKICAgICAgICAgIGEgQysrIGNsYXNzLiAgU1dJRyB3YXMgbm90IGdlbmVyYXRpbmcgY29ycmVjdCBjb2RlLAogICAgICAgICAgYnV0IGEgbmV3IHNjb3BpbmcgbWVjaGFuaXNtIGFuZCBtZXRob2QgZm9yIGhhbmRsaW5nCiAgICAgICAgICBkYXRhdHlwZXMgaW5zaWRlIGEgQysrIGNsYXNzIGhhdmUgYmVlbiBhZGRlZC4KCjEvMTQvOTcgOiBDaGFuZ2VkIGVudW1lcmF0aW9ucyB0byB1c2UgdGhlIHZhbHVlIG5hbWUgaW5zdGVhZAogICAgICAgICAgb2YgYW55IHZhbHVlcyB0aGF0IG1pZ2h0IGhhdmUgYXBwZWFyZWQgaW4gdGhlIGludGVyZmFjZQogICAgICAgICAgZmlsZS4gIFRoaXMgbWFrZXMgdGhlIGNvZGUgYSBsaXR0bGUgbW9yZSBmcmllbmRseSB0bwogICAgICAgICAgQysrIGNvbXBpbGVycy4KCjEvMTQvOTcgOiBSZW1vdmVkIHR5cGVkZWYgYnVnIHRoYXQgbWFkZSBhbGwgZW51bWVyYXRpb25zCiAgICAgICAgICBlcXVpdmFsZW50IHRvIGVhY2ggb3RoZXIgaW4gdGhlIHR5cGUgY2hlY2tlciAoc2luY2UKICAgICAgICAgIGl0IGdlbmVyYXRlZCBhbG90IG9mIHVubmVjZXNzYXJ5IGNvZGUpLgoKVmVyc2lvbiAxLjEgQmV0YTMgKEphbnVhcnkgOSwgMTk5NykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCk5vdGUgOiBBICpodWdlKiBudW1iZXIgb2YgY2hhbmdlcyByZWxhdGVkIHRvIG9uZ29pbmcgbW9kaWZpY2F0aW9ucy4KCjEuICBTdXBwb3J0IGZvciBDKysgbXVsdGlwbGUgaW5oZXJpdGFuY2UgYWRkZWQuCgoyLiAgVHlwZW1hcHMgYWRkZWQuCgozLiAgU29tZSBzdXBwb3J0IGZvciBuZXN0ZWQgc3RydWN0dXJlIGRlZmluaXRpb25zIGFkZGVkLgoKNC4gIERlZmF1bHQgYXJndW1lbnQgaGFuZGxpbmcgYWRkZWQuCgo1LiAgLWMgb3B0aW9uIGFkZGVkIGZvciBidWlsZGluZyBiYXJlIHdyYXBwZXIgY29kZSBtb2R1bGVzLgoKNi4gIFJld3JvdGUgUG9pbnRlciB0eXBlLWNoZWNraW5nIHRvIHN1cHBvcnQgbXVsdGlwbGUgaW5oZXJpdGFuY2UKICAgIGNvcnJlY3RseS4KCjcuICBUY2wgOC4wIG1vZHVsZSBhZGRlZC4KCjguICBQZXJsNCBhbmQgR3VpbGUgbW9kdWxlcyByZXN1cnJlY3RlZCBmcm9tIHRoZSBkZWFkICh3ZWxsLCB0aGV5CiAgICBhdCBsZWFzdCB3b3JrIGFnYWluKS4KCjkuICBOZXcgT2JqZWN0IE9yaWVudGVkIFRjbCBpbnRlcmZhY2UgYWRkZWQuCgoxMC4gQnVnIGZpeGVzIHRvIFBlcmw1IHNoYWRvdyBjbGFzc2VzLgoKMTEuIENsZWFuZWQgdXAgbWFueSBvZiB0aGUgaW50ZXJuYWwgbW9kdWxlcyBvZiB0aGUgcGFyc2VyLgoKMTIuIFRvbnMgb2YgZXhhbXBsZXMgYW5kIHRlc3RpbmcgbW9kdWxlcyBhZGRlZC4KCjEzLiBGaXhlZCBidWdzIHJlbGF0ZWQgdG8gdXNlIG9mICJjb25zdCIgcmV0dXJuIHZhbHVlcy4KCjE0LiBGaXhlZCBidWcgd2l0aCBDKysgbWVtYmVyIGZ1bmN0aW9ucyByZXR1cm5pbmcgdm9pZCAqLgoKMTUuIENoYW5nZWQgU1dJRyBjb25maWd1cmF0aW9uIHNjcmlwdC4KClZlcnNpb24gMS4xIEJldGEyIChEZWNlbWJlciAzLCAxOTk2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEuIENvbXBsZXRlbHkgcmV3cm90ZSB0aGUgU1dJRyBkb2N1bWVudGF0aW9uIHN5c3RlbS4gIFRoZSBjaGFuZ2VzCiAgIGludm9sdmVkIGFyZSB0b28gbnVtZXJvdXMgdG8gbWVudGlvbi4gIEJhc2ljYWxseSwgdGFrZSBldmVyeXRoaW5nCiAgIHlvdSBrbmV3IGFib3V0IHRoZSBvbGQgc3lzdGVtLCB0aHJvdyB0aGVtIG91dCwgYW5kIHJlYWQgdGhlCiAgIGZpbGUgRG9jL2RvYy5wcy4KCjIuIExpbWl0ZWQgc3VwcG9ydCBmb3IgI2lmIGRlZmluZWQoKSBhZGRlZC4KCjMuIFR5cGUgY2FzdHMgYXJlIG5vdyBhbGxvd2VkIGluIGNvbnN0YW50IGV4cHJlc3Npb25zLiAgaWUKCiAgICAgICAgICNkZWZpbmUgIEEgICAoaW50KSAzCgo0LiBBZGRlZCBzdXBwb3J0IGZvciB0eXBlZGVmIGxpc3RzLiAgRm9yIGV4YW1wbGUgOgoKCXR5cGVkZWYgc3RydWN0IHsKCSAgICAgICAgZG91YmxlIHgseSx6OwogICAgICAgIH0gVmVjdG9yLCAqVmVjdG9yUHRyOwoKNS4gTmV3IFNXSUcgZGlyZWN0aXZlcyAocmVsYXRlZCB0byBkb2N1bWVudGF0aW9uIHN5c3RlbSkKCgklc3R5bGUKCSVsb2NhbHN0eWxlCgklc3Vic2VjdGlvbgoJJXN1YnN1YnNlY3Rpb24KCjYuIFJlb3JnYW5pemVkIHRoZSBDKysgaGFuZGxpbmcgYW5kIG1hZGUgaXQgYSBsaXR0bGUgZWFzaWVyIHRvCiAgIHdvcmsgd2l0aCBpbnRlcm5hbGx5LgoKNy4gIEZpeGVkIHByb2JsZW0gd2l0aCBpbmhlcml0aW5nIGRhdGEgbWVtYmVycyBpbiBQeXRob24KICAgIHNoYWRvdyBjbGFzc2VzLgoKOC4gIEZpeGVkIHN5bWJvbCB0YWJsZSBwcm9ibGVtcyB3aXRoIHNoYWRvdyBjbGFzc2VzIGluIGJvdGgKICAgIFB5dGhvbiBhbmQgUGVybC4KCjkuICBGaXhlZCBhbm5veWluZyBzZWdtZW50YXRpb24gZmF1bHQgYnVnIGluIHdyYXBwZXIgY29kZQogICAgZ2VuZXJhdGVkIGZvciBQZXJsNS4KCjEwLiBGaXhlZCBidWcgd2l0aCAlYWRkbWV0aG9kcyBkaXJlY3RpdmUuICBOb3cgaXQgY2FuIGJlIHBsYWNlZAogICAgYW55d2hlcmUgaW4gYSBjbGFzcy4KCjExLiBNb3JlIHRlc3QgY2FzZXMgYWRkZWQgdG8gdGhlIFNXSUcgc2VsZi10ZXN0LiAgIERvY3VtZW50YXRpb24KICAgIHRlc3RzIGFyZSBub3cgcGVyZm9ybWVkIGFsb25nIHdpdGggb3RoZXIgdGhpbmdzLgoKMTIuIFJlb3JnYW5pemVkIHRoZSBTV0lHIGxpYnJhcnkgYSBsaXR0bGUgYml0IGFuZCBzZXQgaXQgdXAgdG8KICAgIHNlbGYtZG9jdW1lbnQgaXRzZWxmIHVzaW5nIFNXSUcuCgoxMy4gTG90cyBhbmQgbG90cyBvZiBtaW5vciBidWcgZml4ZXMgKG1vc3RseSBvYnNjdXJlLCBidXQgYnVncwogICAgbm9uZXRoZWxlc3MpLgoKClZlcnNpb24gMS4xIEJldGExIChPY3RvYmVyIDMwLCAxOTk2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEuIEFkZGVkIG5ldyAlZXh0ZXJuIGRpcmVjdGl2ZSBmb3IgaGFuZGxpbmcgbXVsdGlwbGUgZmlsZXMKCjIuIFBlcmw1IHNoYWRvdyBjbGFzc2VzIGFkZGVkCgozLiBSZXdyb3RlIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHRvIHdvcmsgYmV0dGVyCgo0LiBBZGRlZCAnYm9vbCcgZGF0YXR5cGUKCjUuICV7LCV9IGJsb2NrIGlzIG5vdyBvcHRpb25hbC4KCjYuIEZpeGVkIHNvbWUgYnVncyBpbiB0aGUgUHl0aG9uIHNoYWRvdyBjbGFzcyBtb2R1bGUKCjcuIFJld3JvdGUgYWxsIG9mIHRoZSBTV0lHIHRlc3RzIHRvIGJlIG1vcmUgaW5mb3JtYXRpdmUKICAgKGFuZCBsZXNzIHNjYXJ5KS4KCjguIFJld3JvdGUgcGFyYW1ldGVyIGxpc3QgaGFuZGxpbmcgdG8gYmUgbW9yZSBtZW1vcnkKICAgZWZmaWNpZW50IGFuZCBmbGV4aWJsZS4KCjkuIENoYW5nZWQgcGFyc2VyIHRvIGlnbm9yZSAnc3RhdGljJyBkZWNsYXJhdGlvbnMuCgoxMC4gSW5pdGlhbGl6ZXJzIGFyZSBub3cgaWdub3JlZC4gIEZvciBleGFtcGxlIDoKCglzdHJ1Y3QgRm9vQmFyIGEgPSB7Myw0LDV9OwoKMTEuIFNvbWV3aGF0IGJldHRlciBwYXJzaW5nIG9mIGFycmF5cyAoYWx0aG91Z2ggaXQncwogICAgdXN1YWxseSBqdXN0IGEgYmV0dGVyIGVycm9yIG1lc3NhZ2Ugbm93KS4KCjEyLiBMb3QncyBvZiBtaW5vciBidWcgZml4ZXMuCgoKVmVyc2lvbiAxLjAgRmluYWwgKEF1Z3VzdCAzMSwgMTk5NikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEuIEZpeGVkIG1pbm9yIGJ1ZyBpbiBDKysgbW9kdWxlCgoyLiBGaXhlZCBtaW5vciBidWcgaW4gcG9pbnRlciB0eXBlLWNoZWNrZXIgd2hlbiB1c2luZwogICAtREFMTE9XX05VTEwuCgozLiBGaXhlZCBjb25maWd1cmUgc2NyaXB0IHRvIHdvcmsgd2l0aCBQeXRob24gMS40YmV0YTMKCjQuIENoYW5nZWQgY29uZmlndXJlIHNjcmlwdCB0byBhbGxvdyBjb21waWxhdGlvbiB3aXRob3V0CiAgIHlhY2Mgb3IgYmlzb24uCgpWZXJzaW9uIDEuMCBGaW5hbCAoQXVndXN0IDI4LCAxOTk2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMS4gIENoYW5nZWQgcGFyc2VyIHRvIHN1cHBvcnQgbW9yZSBDL0MrKyBkYXRhdHlwZXMgKHdlbGwsCiAgICBtb3JlIHZhcmlhbnRzKS4gICBUeXBlcyBsaWtlICJ1bnNpZ25lZCIsICJzaG9ydCBpbnQiLAogICAgImxvbmcgaW50IiwgZXRjLi4uIG5vdyB3b3JrLgoKMi4gICJ1bmlvbnMiIGFkZGVkIHRvIHBhcnNlci4KCjMuICBVc2Ugb2YgInR5cGVkZWYiIGFzIGluIDoKCgl0eXBlZGVmIHN0cnVjdCB7CgkgICAgIGRvdWJsZSB4LHksejsKCX0gVmVjdG9yOwoKICAgIE5vdyB3b3JrcyBjb3JyZWN0bHkuICAgVGhlIG5hbWUgb2YgdGhlIHR5cGVkZWYgaXMgdXNlZCBhcwogICAgdGhlIHN0cnVjdHVyZSBuYW1lLgoKNC4gIENvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHdpdGggI2lmZGVmLCAjZWxzZSwgI2VuZGlmLCBldGMuLi4KICAgIGFkZGVkLgoKNS4gIE5ldyAlZGlzYWJsZWRvYywgJWVuYWJsZWRvYyBkaXJlY3RpdmVzIGFsbG93IGRvY3VtZW50YXRpb24KICAgIHRvIHNlbGVjdGl2ZWx5IGJlIGRpc2FibGVkIGZvciBjZXJ0YWluIHBhcnRzIG9mIGEgd3JhcHBlcgogICAgZmlsZS4KCjYuICBOZXcgUHl0aG9uIG1vZHVsZSBzdXBwb3J0cyBiZXR0ZXIgdmFyaWFibGUgbGlua2luZywgY29uc3RhbnRzLAogICAgYW5kIHNoYWRvdyBjbGFzc2VzLgoKNy4gIFBlcmw1IG1vZHVsZSBpbXByb3ZlZCB3aXRoIGJldHRlciBjb21wYXRpYmlsaXR5IHdpdGggWFMKICAgIGFuZCB4c3VicHAuICAgU1dJRyBwb2ludGVycyBhbmQgbm93IGNyZWF0ZWQgc28gdGhhdCB0aGV5CiAgICBhcmUgY29tcGF0aWJsZSB3aXRoIHhzdWJwcCBwb2ludGVycy4KCjguICBTdXBwb3J0IGZvciBbaW5jciBUY2xdIG5hbWVzcGFjZXMgYWRkZWQgdG8gVGNsIG1vZHVsZS4KCjkuICAlcHJhZ21hIGRpcmVjdGl2ZSBhZGRlZC4KCjEwLiAlYWRkbWV0aG9kcyBkaXJlY3RpdmUgYWRkZWQuCgoxMS4gJW5hdGl2ZSBkaXJlY3RpdmUgYWRkZWQgdG8gYWxsb3cgcHJlLWV4aXN0aW5nIHdyYXBwZXIgZnVuY3Rpb25zCiAgICB0byBiZSB1c2VkLgoKMTIuIFdyb3RlIGNvbmZpZ3VyZSBzY3JpcHQgZm9yIFNXSUcgaW5zdGFsbGF0aW9uLgoKMTMuIEZ1bmN0aW9uIHBvaW50ZXJzIG5vdyBhbGxvd2VkIHdpdGggdHlwZWRlZiBzdGF0ZW1lbnRzLgoKMTQuICV0eXBlZGVmIG1vZGlmaWVkIHRvIGluc2VydCBhIGNvcnJlc3BvbmRpbmcgQyB0eXBlZGVmIGludG8KICAgIHRoZSBvdXRwdXQgZmlsZS4KCjE1LiBGaXhlZCBzb21lIHByb2JsZW1zIHJlbGF0ZWQgdG8gQysrIHJlZmVyZW5jZXMuCgoxNi4gTmV3IFN0cmluZyBhbmQgV3JhcHBlckZ1bmN0aW9uIGNsYXNzZXMgYWRkIHRvIG1ha2UgZ2VuZXJhdGluZwogICAgd3JhcHBlciBjb2RlIGVhc2llci4KCjE3LiBGaXhlZCBjb21tYW5kIGxpbmUgb3B0aW9uIHByb2Nlc3NpbmcgdG8gZWxpbWluYXRlIGNvcmUgZHVtcHMKICAgIGFuZCB0byBhbGxvdyBoZWxwIG1lc3NhZ2VzLgoKMTguIExvdCdzIG9mIG1pbm9yIGJ1ZyBmaXhlcyB0byBhbG1vc3QgYWxsIGNvZGUgbW9kdWxlcwoKClZlcnNpb24gMS4wIEJldGEgMyAoUGF0Y2ggMSkgSnVseSAxNywgMTk5Ngo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEuMCBGaW5hbCBpcyBub3QgcXVpdGUgcmVhZHkgeWV0LCBidXQgdGhpcyByZWxlYXNlIGZpeGVzIGEKbnVtYmVyIG9mIGltbWVkaWF0ZSBwcm9ibGVtcyA6CgoxLiAgQ29tcGlsZXIgZXJyb3JzIHdoZW4gdXNpbmcgLXN0cmljdCAxIHR5cGUgY2hlY2tpbmcgaGF2ZSBiZWVuIGZpeGVkLgoKMi4gIFBvaW50ZXIgdHlwZSBjaGVja2VyIG5vdyByZWNvZ25pemVzIHBvaW50ZXJzIG9mIHRoZSBmb3JtCiAgICBfMF9UeXBlIGNvcnJlY3RseS4KCjMuICBBIGZldyBtaW5vciBmaXhlcyB3ZXJlIG1hZGUgaW4gdGhlIE1ha2VmaWxlCgpWZXJzaW9uIDEuMCBCZXRhIDMgKEp1bmUgMTQsIDE5OTYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCgpUaGVyZSBhcmUgbG90cyBvZiBjaGFuZ2VzIGluIHRoaXMgcmVsZWFzZSA6CgoxLiAgU1dJRyBpcyBub3cgaW52b2tlZCB1c2luZyB0aGUgInN3aWciIGNvbW1hbmQgaW5zdGVhZCBvZiAid3JhcCIuCiAgICBIZXksIHN3aWcgc291bmRzIGNvb2xlci4KCjIuICBUaGUgU1dJR19MSUIgZW52aXJvbm1lbnQgdmFyaWFibGUgY2FuIGJlIHNldCB0byBjaGFuZ2UgdGhlCiAgICBsb2NhdGlvbiB3aGVyZSBTV0lHIGxvb2tzIGZvciBsaWJyYXJ5IGZpbGVzLgoKMy4gIEMrKyBzdXBwb3J0IGhhcyBiZWVuIGFkZGVkLiAgIFlvdSBzaG91bGQgdXNlIHRoZSAtYysrIG9wdGlvbgogICAgdG8gZW5hYmxlIGl0LgoKNC4gIFRoZSAlaW5pdCBkaXJlY3RpdmUgaGFzIGJlZW4gcmVwbGFjZWQgYnkgdGhlICVtb2R1bGUgZGlyZWN0aXZlLgogICAgJW1vZHVsZSBjb25zdHJ1Y3RzIGEgdmFsaWQgbmFtZSBmb3IgdGhlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uCiAgICBmb3Igd2hhdGV2ZXIgdGFyZ2V0IGxhbmd1YWdlIHlvdSdyZSB1c2luZyAoYWN0dWFsbHkgdGhpcyBtYWtlcwogICAgU1dJRyBmaWxlcyBhIGxpdHRsZSBjbGVhbmVyKS4gIFRoZSBvbGQgJWluaXQgZGlyZWN0aXZlIHN0aWxsIHdvcmtzLgoKNS4gIFRoZSBzeW50YXggb2YgdGhlICVuYW1lIGRpcmVjdGl2ZSBoYXMgYmVlbiBjaGFuZ2VkLiAgIFVzZSBvZiB0aGUKICAgIG9sZCBvbmUgc2hvdWxkIGdlbmVyYXRlIGEgd2FybmluZyBtZXNzYWdlLCBidXQgbWF5IHN0aWxsIHdvcmsuCgo2LiAgVG8gc3VwcG9ydCBUY2wvVGsgb24gbm9uLXVuaXggcGxhdGZvcm1zLCBTV0lHIGltcG9ydHMgYSBmaWxlIGNhbGxlZAogICAgc3dpZ3RjbC5jZmcgZnJvbSB0aGUgJChTV0lHX0xJQikvdGNsIGRpcmVjdG9yeS4gICBJIGRvbid0IGhhdmUgYWNjZXNzCiAgICB0byBhbiBOVCBtYWNoaW5lLCBidXQgdGhpcyBmaWxlIGlzIHN1cHBvc2VkbHkgYWxsb3dzIFNXSUcgdG8KICAgIHByb2R1Y2Ugd3JhcHBlciBjb2RlIHRoYXQgY29tcGlsZXMgb24gYm90aCBVTklYIGFuZCBub24gVU5JWCBtYWNoaW5lcy4KICAgIElmIHRoaXMgZG9lc24ndCB3b3JrLCB5b3UnbGwgaGF2ZSB0byBlZGl0IHRoZSBmaWxlIHN3aWd0Y2wuY2ZnLiBQbGVhc2UKICAgIGxldCBtZSBrbm93IGlmIHRoaXMgZG9lc24ndCB3b3JrIHNvIEkgY2FuIHVwZGF0ZSB0aGUgZmlsZSBhcwogICAgbmVjZXNzYXJ5LgoKNy4gIFRoZSBTV0lHIHJ1bi10aW1lIHR5cGVjaGVja2VyIGhhcyBiZWVuIGltcHJvdmVkLiAgICBZb3UgY2FuIGFsc28KICAgIG5vdyByZWRlZmluZSBob3cgaXQgd29ya3MgYnkgc3VwcGx5aW5nIGEgZmlsZSBjYWxsZWQgInN3aWdwdHIuY2ZnIgogICAgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHlvdXIgU1dJRyBpbnRlcmZhY2UgZmlsZXMuICAgQnkgZGVmYXVsdCwKICAgIFNXSUcgcmVhZHMgdGhpcyBmaWxlIGZyb20gJChTV0lHX0xJQikvY29uZmlnLgoKOC4gIFRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbSBoYXMgYmVlbiBjaGFuZ2VkIHRvIHN1cHBvcnQgdGhlIGZvbGxvd2luZyA6CgoJLSAgRG9jdW1lbnRhdGlvbiBvcmRlciBpcyBwcmludGVkIGluIGludGVyZmFjZSBmaWxlIG9yZGVyIGJ5CiAgICAgICAgICAgZGVmYXVsdC4gICBUaGlzIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHB1dHRpbmcgYW4gJWFscGhhCiAgICAgICAgICAgZGlyZWN0aXZlIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGludGVyZmFjZSBmaWxlLgoKICAgICAgICAtICBZb3UgY2FuIHN1cHBseSBhZGRpdGlvbmFsIGRvY3VtZW50YXRpb24gdGV4dCB1c2luZwoKICAgICAgICAgICAldGV4dCAleyBwdXQgeW91ciB0ZXh0IGhlcmUgJX0KCiAgICAgICAgLSAgQSBmZXcgbWlub3IgYnVncyB3ZXJlIGZpeGVkLgoKOS4gIEEgZmV3IGltcHJvdmVtZW50cyBoYXZlIGJlZW4gbWFkZSB0byB0aGUgaGFuZGxpbmcgb2YgY29tbWFuZCBsaW5lCiAgICBvcHRpb25zIChidXQgaXQncyBzdGlsbCBub3QgZmluaXNoZWQpLgoKMTAuICBMb3RzIG9mIG1pbm9yIGJ1ZyBmaXhlcyBpbiBtb3N0IG9mIHRoZSBsYW5ndWFnZSBtb2R1bGVzIGhhdmUgYmVlbgogICAgIG1hZGUuCgoxMS4gRmlsZW5hbWVzIGhhdmUgYmVlbiBjaGFuZ2VkIHRvIDguMyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGEgU1dJRwogICAgcG9ydCB0byBub24tdW5peCBwbGF0Zm9ybXMgKHdvcmsgaW4gcHJvZ3Jlc3MpLgoKMTIuIEMrKyBmaWxlIHN1ZmZpeCBpcyBub3cgLmN4eCAoZm9yIHNhbWUgcmVhc29uKS4KCjEzLiBUaGUgZG9jdW1lbnRhdGlvbiBoYXMgYmVlbiB1cGdyYWRlZCBzaWduaWZpY2FudGx5IGFuZCBpcyBub3cKICAgIGFyb3VuZCAxMDAgcGFnZXMuICAgIEkgYWRkZWQgbmV3IGV4YW1wbGVzIGFuZCBhIHNlY3Rpb24gb24KICAgIEMrKy4gIFRoZSBkb2N1bWVudGF0aW9uIG5vdyBpbmNsdWRlcyBhIFRhYmxlIG9mIENvbnRlbnRzLgoKMTQuIFRoZSBTV0lHIEV4YW1wbGVzIGRpcmVjdG9yeSBpcyBzdGlsbCB3b2VmdWxseSBzcGFyc2UsIGJ1dCBpcwogICAgZ2V0dGluZyBiZXR0ZXIuCgpTcGVjaWFsIG5vdGljZSBhYm91dCBDKysKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClRoaXMgaXMgdGhlIGZpcnN0IHZlcnNpb24gb2YgU1dJRyB0byBzdXBwb3J0IEMrKyBwYXJzaW5nLiAgQ3VycmVudGx5CnRoZSBDKysgaXMgZmFyIGZyb20gY29tcGxldGUsIGJ1dCBzZWVtcyB0byB3b3JrIGZvciBzaW1wbGUgY2FzZXMuCk5vIHdvcmsgaGFzIGJlZW4gZG9uZSB0byBhZGQgc3BlY2lhbCBDKysgcHJvY2Vzc2luZyB0byBhbnkgb2YKdGhlIHRhcmdldCBsYW5ndWFnZXMuICAgU2VlIHRoZSB1c2VyIG1hbnVhbCBmb3IgZGV0YWlscyBhYm91dCBob3cKQysrIGlzIGhhbmRsZWQuICAgSWYgeW91IGZpbmQgcHJvYmxlbXMgd2l0aCB0aGUgQysrIGltcGxlbWVudGF0aW9uLApwbGVhc2UgbGV0IG1lIGtub3cuICBFeHBlY3QgbWFqb3IgaW1wcm92ZW1lbnRzIGluIHRoaXMgYXJlYS4KCk5vdGUgOiBJIGhhdmUgb25seSBzdWNjZXNzZnVsbHkgdXNlZCBTV0lHIGFuZCBDKysgd2l0aCBUY2wgYW5kClB5dGhvbi4KCk5vdGljZSBhYm91dCBWZXJzaW9uIDEuMEZpbmFsCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpWZXJzaW9uIDEuMEIzIGlzIHRoZSBsYXN0IEJldGEgcmVsZWFzZSBiZWZvcmUgdmVyc2lvbiAxLjAgRmluYWwgaXMKcmVsZWFzZWQuICBJIGhhdmUgZnJvemVuIHRoZSBsaXN0IG9mIGZlYXR1cmVzIHN1cHBvcnRlZCBpbiB2ZXJzaW9uIDEuMAphbmQgd2lsbCBvbmx5IGZpeCBidWdzIGFzIHRoZXkgc2hvdyB1cC4gIFdvcmsgb24gU1dJRyB2ZXJzaW9uIDIuMCBpcwphbHJlYWR5IGluIHByb2dyZXNzLCBidXQgaXMgZ29pbmcgdG8gcmVzdWx0IGluIHJhdGhlciBzaWduaWZpY2FudApjaGFuZ2VzIHRvIFNXSUcncyBpbnRlcm5hbCBzdHJ1Y3R1cmUgKGhvcGVmdWxseSBmb3IgdGhlIGJldHRlcikuICBObwphbnRpY2lwYXRlZCBkYXRlIGZvciB2ZXJzaW9uIDIuMCBpcyBzZXQsIGJ1dCBpZiB5b3UndmUgZ290IGFuIGlkZWEsCmxldCBtZSBrbm93LgoKVmVyc2lvbiAxLjAgQmV0YSAyIChBcHJpbCAyNiwgMTk5NikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClRoaXMgcmVsZWFzZSBpcyBpZGVudGljYWwgdG8gQmV0YTEgZXhjZXB0IGEgZmV3IG1pbm9yIGJ1Z3MgYXJlCmZpeGVkIGFuZCB0aGUgU1dJRyBsaWJyYXJ5IGhhcyBiZWVuIHVwZGF0ZWQgdG8gd29yayB3aXRoIFRjbCA3LjUvVGsgNC4xLgpBIHRjbDcuNSBleGFtcGxlcyBkaXJlY3RvcnkgaXMgbm93IGluY2x1ZGVkLgoKLSBGaXhlZCBhIGJ1ZyBpbiB0aGUgTWFrZWZpbGUgdGhhdCBkaWRuJ3QgaW5zdGFsbCB0aGUgbGlicmFyaWVzCiAgY29ycmVjdGx5LgoKLSBTV0lHIExpYnJhcnkgZmlsZXMgYXJlIG5vdyB1cGRhdGVkIHRvIHdvcmsgd2l0aCBUY2wgNy41IGFuZCBUayA0LjEuCgotIE1pbm9yIGJ1ZyBmaXhlcyBpbiBvdGhlciBtb2R1bGVzLgoKClZlcnNpb24gMS4wIEJldGEgMSAgKEFwcmlsIDEwLCAxOTk2KS4KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKVGhpcyBpcyB0aGUgZmlyc3QgInNlbWktb2ZmaWNpYWwiIHJlbGVhc2Ugb2YgU1dJRy4gICAgSXQgaGFzIGEKbnVtYmVyIG9mIHN1YnN0YW50aWFsIGltcHJvdmVtZW50cyBvdmVyIHRoZSBBbHBoYSByZWxlYXNlLiAgIFRoZXNlCm5vdGVzIGFyZSBpbiBubyBwYXJ0aWN1bGFyIG9yZGVyLS1ob3BlIEkgcmVtZW1iZXJlZCBldmVyeXRoaW5nLi4uLgoKMS4gIFRjbC9UawoKU1dJRyBpcyBrbm93biB0byB3b3JrIHdpdGggVGNsNy4zLCBUazMuNiBhbmQgbGF0ZXIgdmVyc2lvbnMuCkkndmUgYWxzbyB0ZXN0ZWQgU1dJRyB3aXRoIGV4cGVjdC01LjE5LgoKTm9ybWFsbHkgU1dJRyBleHBlY3RzIHRvIHVzZSB0aGUgaGVhZGVyIGZpbGVzICJ0Y2wuaCIgYW5kICJ0ay5oIi4KTmV3ZXIgdmVyc2lvbnMgb2YgVGNsL1RrIHVzZSB2ZXJzaW9uIG51bWJlcnMuICAgWW91IGNhbiBzcGVjaWZ5IHRoZXNlCmluIFNXSUcgYXMgZm9sbG93cyA6CgogICAgICAgICUgd3JhcCAtaHRjbCB0Y2w3LjQuaCAtaHRrIHRrNC4wLmggZXhhbXBsZS5pCgpPZiBjb3Vyc2UsIEkgcHJlZmVyIHRvIHNpbXBseSBzZXQgdXAgc3ltYm9saWMgbGlua3MgYmV0d2VlbiAidGNsLmgiIGFuZAp0aGUgbW9zdCByZWNlbnQgc3RhYmxlIHZlcnNpb24gb24gdGhlIG1hY2hpbmUuCgoyLiAgUGVybDQKClRoaXMgaW1wbGVtZW50YXRpb24gaGFzIGJlZW4gYmFzZWQgb24gUGVybC00LjAzNS4gIFNXSUcncyBpbnRlcmZhY2UgdG8KUGVybDQgaXMgYmFzZWQgb24gdGhlIGRvY3VtZW50YXRpb24gcHJvdmlkZWQgaW4gdGhlICJQcm9ncmFtbWluZyBQZXJsIgpib29rIGJ5IExhcnJ5IFdhbGwsIGFuZCBmaWxlcyBsb2NhdGVkIGluIHRoZSAidXN1YiIgZGlyZWN0b3J5IG9mIHRoZQpQZXJsNCBkaXN0cmlidXRpb24uCgpJbiBvcmRlciB0byBjb21waWxlIHdpdGggUGVybDQsIHlvdSdsbCBuZWVkIHRvIGxpbmsgd2l0aCB0aGUgdXBlcmwubwpmaWxlIGZvdW5kIGluIHRoZSBQZXJsNCBzb3VyY2UgZGlyZWN0b3J5LiAgWW91IG1heSB3YW50IHRvIG1vdmUgdGhpcwpmaWxlIHRvIGEgbW9yZSBjb252ZW5pZW50IGxvY2F0aW9uLgoKMy4gIFBlcmw1CgpUaGlzIGlzIGEgc29tZXdoYXQgZXhwZXJpbWVudGFsIGltcGxlbWVudGF0aW9uLCBidXQgaXMgYWxvdCBsZXNzCmJ1Z2d5IHRoYW4gdGhlIGFscGhhIHJlbGVhc2UuICAgICBTV0lHIG9wZXJhdGVzIGluZGVwZW5kZW50bHkgb2YKdGhlIFhTIGxhbmd1YWdlIGFuZCB4c3VicHAgc3VwcGxpZWQgd2l0aCBQZXJsNS4gIEN1cnJlbnRseSBTV0lHCnByb2R1Y2VzIHRoZSBuZWNlc3NhcnkgQyBjb2RlIGFuZCAucG0gZmlsZSBuZWVkZWQgdG8gZHluYW1pY2FsbHkKbG9hZCBhIG1vZHVsZSBpbnRvIFBlcmw1LgoKVG8gc3VwcG9ydCBQZXJsNSdzIG5vdGlvbiBvZiBtb2R1bGVzIGFuZCBwYWNrYWdlcyAoYXMgd2l0aCB4c3VicHApLAp5b3UgY2FuIHVzZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQgbGluZSBvcHRpb25zIDoKCiAgICAgICAgJSB3cmFwIC1wZXJsNSAtbW9kdWxlIE15TW9kdWxlIC1wYWNrYWdlIE15UGFja2FnZSBleGFtcGxlLmkKCk5vdGUgOiBJbiBvcmRlciBmb3IgZHluYW1pYyBsb2FkaW5nIHRvIGJlIGVmZmVjdGl2ZSwgeW91IG5lZWQgdG8gYmUKY2FyZWZ1bCBhYm91dCBuYW1pbmcuICAgIEZvciBhIG1vZHVsZSBuYW1lZCAiTXlNb2R1bGUiLCB5b3UnbGwgbmVlZCB0bwpjcmVhdGUgYSBzaGFyZWQgb2JqZWN0IGZpbGUgY2FsbGVkICJNeU1vZHVsZS5zbyIgdXNpbmcgc29tZXRoaW5nIGxpa2UKCiAgICAgICAgJSBsZCAtc2hhcmVkIG15X29iai5vIC1vIE15TW9kdWxlLnNvCgpUaGUgdXNlIG9mIHRoZSAlaW5pdCBkaXJlY3RpdmUgbXVzdCBtYXRjaCB0aGUgbW9kdWxlIG5hbWUgc2luY2UgUGVybDUKY2FsbHMgYSBmdW5jdGlvbiAiYm9vdF9Nb2R1bGVOYW1lIiBpbiBvcmRlciB0byBpbml0aWFsaXplIHRoaW5ncy4KU2VlIHRoZSBFeGFtcGxlcyBkaXJlY3RvcnkgZm9yIHNvbWUgZXhhbXBsZXMgb2YgaG93IHRvIGdldCB0aGluZ3MKdG8gd29yay4KCjQuICBQeXRob24xLjMKClRoaXMgaXMgdGhlIGZpcnN0IHJlbGVhc2Ugc3VwcG9ydGluZyBQeXRob24uICAgIFRoZSBQeXRob24gcG9ydCBpcwpleHBlcmltZW50YWwgYW5kIG1heSBiZSByZXdyaXR0ZW4uICAgVmFyaWFibGUgbGlua2FnZSBpcyBkb25lIHRocm91Z2gKZnVuY3Rpb25zIHdoaWNoIGlzIHNvcnQgb2YgYSBrbHVkZ2UuICBJIGFsc28gdGhpbmsgaXQgd291bGQgYmUgbmljZQp0byBpbXBvcnQgU1dJRyBwb2ludGVycyBpbnRvIFB5dGhvbiBhcyBhIG5ldyBvYmplY3QgKGluc3RlYWQgb2Ygc3RyaW5ncykuCk9mIGNvdXJzZSwgdGhpcyBuZWVkcyBhIGxpdHRsZSBtb3JlIHdvcmsuCgo1LiAgR3VpbGUzCgpJZiB5b3UgcmVhbGx5IHdhbnQgdG8gbGl2ZSBvbiB0aGUgZWRnZSwgcGljayB1cCBhIGNvcHkgb2YgR3VpbGUtaWlpIGFuZApwbGF5IGFyb3VuZCB3aXRoIHRoaXMuICAgICAgVGhpcyBpcyBoaWdobHkgZXhwZXJpbWVudGFsLS0tZXNwZWNpYWxseSBzaW5jZQpJJ20gbm90IHN1cmUgd2hhdCB0aGUgb2ZmaWNpYWwgc3RhdGUgb2YgR3VpbGUgaXMgdGhlc2UgZGF5cy4gIFRoaXMKaW1wbGVtZW50YXRpb24gbWF5IGNoYW5nZSBhdCBhbnkgdGltZSBzaG91bGQgSSBzdWRkZW5seSBmaWd1cmUgb3V0IGJldHRlcgp3YXlzIHRvIGRvIHRoaW5ncy4KCjYuICBFeHRlbmRpbmcgU1dJRwoKU1dJRyBpcyB3cml0dGVuIGluIEMrKyBhbHRob3VnaCBJIHRlbmQgdG8gdGhpbmsgb2YgdGhlIGNvZGUgYXMgbW9zdGx5CmJlaW5nIEFOU0kgQyB3aXRoIGEgbGl0dGxlIGluaGVyaXRhbmNlIHRocm93biBpbi4gICBFYWNoIHRhcmdldCBsYW5ndWFnZQppcyBpbXBsZW1lbnRlZCBhcyBhIEMrKyBjbGFzcyB0aGF0IGNhbiBiZSBwbHVnZ2VkIGludG8gdGhlIHN5c3RlbS4KSWYgeW91IHdhbnQgdG8gYWRkIHlvdXIgb3duIG1vZGlmaWNhdGlvbnMsIHNlZSBBcHBlbmRpeCBDIG9mIHRoZSB1c2VyCm1hbnVhbC4gICBUaGVuIHRha2UgYSBsb29rIGF0IHRoZSAidXNlciIgZGlyZWN0b3J5IHdoaWNoIGNvbnRhaW5zIHNvbWUKY29kZSBmb3IgYnVpbGRpbmcgeW91ciBvd24gZXh0ZW5pb25zLgoKNy4gVGhlIFNXSUcgbGlicmFyeQoKVGhlIFNXSUcgbGlicmFyeSBpcyBzdGlsbCBpbmNvbXBsZXRlLiAgU29tZSBvZiB0aGUgZmlsZXMgbWVudGlvbmVkIGluCnRoZSB1c2VyIG1hbnVhbCBhcmUgdW5hdmFpbGFibGUuICAgIFRoZXNlIGZpbGVzIHdpbGwgYmUgbWFkZSBhdmFpbGFibGUKd2hlbiB0aGV5IGFyZSByZWFkeS4gICBTdWJzY3JpYmUgdG8gdGhlIFNXSUcgbWFpbGluZyBsaXN0IGZvciBhbm5vdW5jZW1lbnRzCmFuZCB1cGRhdGVzLgoKOC4gU1dJRyBEb2N1bWVudGF0aW9uCgpJIGhhdmUgc29tZXRpbWVzIGV4cGVyaWVuY2VkIHByb2JsZW1zIHZpZXdpbmcgdGhlIFNXSUcgZG9jdW1lbnRhdGlvbiBpbgpzb21lIHBvc3RzY3JpcHQgdmlld2Vycy4gICBIb3dldmVyLCB0aGUgZG9jdW1lbnRhdGlvbiBzZWVtcyB0byBwcmludApub3JtYWxseS4gICAgSSdtIHdvcmtpbmcgb24gbWFraW5nIG11Y2ggb2YgdGhlIGRvY3VtZW50YXRpb24gb25saW5lLApidXQgdGhpcyB0YWtlcyB0aW1lLgoKVmVyc2lvbiAwLjEgQWxwaGEgKEZlYnJ1YXJ5IDksIDE5OTYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMS4gIFJ1bi10aW1lIHR5cGUtY2hlY2tpbmcgb2YgU1dJRyBwb2ludGVycy4gICBQb2ludGVycyBhcmUgbm93IHJlcHJlc2VudGVkCiAgICBhcyBzdHJpbmdzIHdpdGggYm90aCBudW1lcmljIGFuZCBlbmNvZGVkIHR5cGUgaW5mb3JtYXRpb24uICAgIFRoaXMgbWFrZXMKICAgIGl0IGEgbGl0dGxlIGhhcmRlciB0byBzaG9vdCB5b3Vyc2VsZiBpbiB0aGUgZm9vdCAoYW5kIGl0IGVsaW1pbmF0ZXMKICAgIHNvbWUgc2VnbWVudGF0aW9uIGZhdWx0cyBhbmQgb3RoZXIgb2RkaXRpZXMpLgoKMi4gIFB5dGhvbiAxLjMgbm93IHN1cHBvcnRlZC4KCjMuICAjZGVmaW5lIGFuZCBlbnVtIGNhbiBiZSB1c2VkIHRvIGluc3RhbGwgY29uc3RhbnRzLgoKNC4gIENvbXBsZXRlbHkgcmV3cm90ZSB0aGUgJWluY2x1ZGUgZGlyZWN0aXZlIGFuZCBtYWRlIGl0IGFsb3QgbW9yZSBwb3dlcmZ1bC4KCjUuICBSZXN0cnVjdHVyZWQgdGhlIFNXSUcgbGlicmFyeSB0byBtYWtlIGl0IHdvcmsgYmV0dGVyLgoKNi4gIFZhcmlvdXMgYnVnIGZpeGVzIHRvIFRjbCwgUGVybDQsIFBlcmw1LCBhbmQgR3VpbGUgaW1wbGVtZW50YXRpb25zLgoKNy4gIEJldHRlciBpbXBsZW1lbnRhdGlvbiBvZiAldHlwZWRlZiBkaXJlY3RpdmUuCgo4LiAgTWFkZSBzb21lIGNoYW5nZXMgdG8gU1dJRydzIGNsYXNzIHN0cnVjdHVyZSB0byBtYWtlIGl0IGVhc2llciB0byBleHBhbmQuCiAgICBTV0lHIGlzIG5vdyBidWlsdCBpbnRvIGEgbGlicmFyeSBmaWxlIHRoYXQgeW91IGNhbiB1c2UgdG8gbWFrZSB5b3VyCiAgICBvd24gZXh0ZW5pb25zLgoKOS4gIE1hZGUgZXh0ZW5zaXZlIGNoYW5nZXMgdG8gdGhlIGRvY3VtZW50YXRpb24uCgoxMC4gTWlub3IgY2hhbmdlcyB0byB0aGUgU1dJRyBwYXJzZXIgdG8gbWFrZSBpdCB1c2UgbGVzcyBtZW1vcnkuCiAgICBBbHNvIHRvb2sgb3V0IHNvbWUgZXh0cmFuZW91cyBydWxlcyB0aGF0IHdlcmUgdW5kb2N1bWVudGVkIGFuZAogICAgZGlkbid0IHdvcmsgaW4gdGhlIGZpcnN0IHBsYWNlLgoKMTEuIFRoZSBTV0lHIGxpYnJhcnkgZmlsZXMgInRjbHNoIiwgIndpc2giLCAiZXhwZWN0IiwgZXRjLi4uIGluIHRoZSBmaXJzdAogICAgcmVsZWFzZSBoYXZlIGJlZW4gcmVzdHJ1Y3R1cmVkIGFuZCByZW5hbWVkIHRvICJ0Y2xzaC5pIiwgIndpc2guaSIsCiAgICBhbmQgc28gb24uCg==