CiAgICAgICAgICAgICAgICAgICAgICAgICAgIEMtS2VybWl0IDguMCBVcGRhdGUgTm90ZXMKCiAgIFsgWzFdQ29udGVudHMgXSBbIFsyXUMtS2VybWl0IF0gWyBbM11LZXJtaXQgSG9tZSBdCgogICAgICAgICAgICAgIFNlY29uZCBTdXBwbGVtZW50IHRvIFVzaW5nIEMtS2VybWl0LCBTZWNvbmQgRWRpdGlvbgoKRm9yIEMtS2VybWl0IDguMAoKICAgQXMgb2YgQy1LZXJtaXQgdmVyc2lvbjogOC4wLjIxMQogICBEYXRlIG9mIEMtS2VybWl0IHJlbGVhc2U6IDEwIEFwcmlsIDIwMDMKICAgVGhpcyBmaWxlIGxhc3QgdXBkYXRlZDogU2F0IEFwciAxMCAxNjozNjoxMSAyMDA0CgogICAgICogSUYgWU9VIEFSRSBSRUFESU5HIEEgUExBSU4tVEVYVCB2ZXJzaW9uIG9mIHRoaXMgZG9jdW1lbnQsIG5vdGUKICAgICAgIHRoYXQgaXQgaXMgYSBwbGFpbi10ZXh0IGR1bXAgb2YgYSBXZWIgcGFnZS4gWW91IGNhbiB2aXNpdCB0aGUKICAgICAgIG9yaWdpbmFsIChhbmQgcG9zc2libHkgbW9yZSB1cC10by1kYXRlKSBXZWIgcGFnZSBoZXJlOgogIFs0XWh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbAogICAgICogSWYgeW91IGFyZSByZWFkaW5nIHRoZSBIVE1MIHZlcnNpb24gb2YgdGhpcyBmaWxlIHdpdGggYSBHVUkgV2ViCiAgICAgICBicm93c2VyLCB0aGUgZmVhdHVyZXMgYWRkZWQgc2luY2UgQy1LZXJtaXQgOC4wLjIwMSBhcmUgc2hvd24gaW4KICAgICAgIHJlZCBpZiB5b3VyIGJyb3dzZXIgYW5kIG1vbml0b3IgcGVybWl0LiBGZWF0dXJlcyB0aGF0IHdlcmUgbmV3IHRvCiAgICAgICB2ZXJzaW9ucyA4LjAuMjAwIGFuZCAyMDEgYXJlIGluIGJsYWNrLgoKQXV0aG9yczogRnJhbmsgZGEgQ3J1eiBhbmQgQ2hyaXN0aW5lIE0uIEdpYW5vbmUKQWRkcmVzczogVGhlIEtlcm1pdCBQcm9qZWN0CiAgICAgICAgIENvbHVtYmlhIFVuaXZlcnNpdHkKICAgICAgICAgNjEyIFdlc3QgMTE1dGggU3RyZWV0CiAgICAgICAgIE5ldyBZb3JrIE5ZIDEwMDI1LTc3OTkKICAgICAgICAgVVNBCkZheDogICAgICsxICgyMTIpIDY2Mi02NDQyCkUtTWFpbDogIFs1XWtlcm1pdC1zdXBwb3J0QGNvbHVtYmlhLmVkdQpXZWI6ICAgICBbNl1odHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvCk9yOiAgICAgIFs3XWh0dHA6Ly93d3cua2VybWl0LXByb2plY3Qub3JnLwpPcjogICAgICBbOF1odHRwOi8vd3d3LmNvbHVtYmlhLm55Yy5ueS51cy9rZXJtaXQvCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgTk9USUNFUwoKICAgVGhpcyBkb2N1bWVudDoKICAgICAgICAgIENvcHlyaWdodCCpIDE5OTcsIDIwMDIsIEZyYW5rIGRhIENydXogYW5kIENocmlzdGluZSBNLiBHaWFub25lLgogICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAgIEtlcm1pdCA5NToKICAgICAgICAgIENvcHlyaWdodCCpIDE5OTUsIDIwMDIsIFRydXN0ZWVzIG9mIENvbHVtYmlhIFVuaXZlcnNpdHkgaW4gdGhlCiAgICAgICAgICBDaXR5IG9mIE5ldyBZb3JrLiBBbGwgcmlnaHRzIHJlc2VydmVkLgoKICAgQy1LZXJtaXQ6CiAgICAgICAgICBDb3B5cmlnaHQgqSAxOTg1LCAyMDAyLAogICAgICAgICAgVHJ1c3RlZXMgb2YgQ29sdW1iaWEgVW5pdmVyc2l0eSBpbiB0aGUgQ2l0eSBvZiBOZXcgWW9yay4gQWxsCiAgICAgICAgICByaWdodHMgcmVzZXJ2ZWQuIFNlZSB0aGUgQy1LZXJtaXQgWzldQ09QWUlORy5UWFQgZmlsZSBvciB0aGUKICAgICAgICAgIGNvcHlyaWdodCB0ZXh0IGluIHRoZSBbMTBdY2tjbWFpLmMgbW9kdWxlIGZvciBkaXNjbGFpbWVyIGFuZAogICAgICAgICAgcGVybWlzc2lvbnMuCgogICBXaGVuIEtlcmJlcm9zKFRNKSBhbmQvb3IgU1JQKFRNKSAoU2VjdXJlIFJlbW90ZSBQYXNzd29yZCkgYW5kL29yCiAgICAgICAgICBTU0wvVExTIHByb3RvY29sIGFyZSBpbmNsdWRlZDoKICAgICAgICAgIFBvcnRpb25zIENvcHlyaWdodCCpIDE5OTAsIE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mCiAgICAgICAgICBUZWNobm9sb2d5LgogICAgICAgICAgUG9ydGlvbnMgQ29weXJpZ2h0IKkgMTk5MSwgMTk5MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mCiAgICAgICAgICBDYWxpZm9ybmlhLgogICAgICAgICAgUG9ydGlvbnMgQ29weXJpZ2h0IKkgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSBieSBBVCZULgogICAgICAgICAgUG9ydGlvbnMgQ29weXJpZ2h0IKkgMTk5NywgU3RhbmZvcmQgVW5pdmVyc2l0eS4KICAgICAgICAgIFBvcnRpb25zIENvcHlyaWdodCCpIDE5OTUtMTk5NywgRXJpYyBZb3VuZwogICAgICAgICAgPGVheUBjcnlwdG9zb2Z0LmNvbT4uCgogICBGb3IgdGhlIGZ1bGwgdGV4dCBvZiB0aGUgdGhpcmQtcGFydHkgY29weXJpZ2h0IG5vdGljZXMsIHNlZQogICBbMTFdQXBwZW5kaXggVi4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICBXSEFUIElTIElOIFRISVMgRklMRQoKICAgVGhpcyBmaWxlIGxpc3RzIGNoYW5nZXMgbWFkZSB0byBDLUtlcm1pdCBzaW5jZSB2ZXJzaW9uIDcuMCB3YXMKICAgcmVsZWFzZWQgaW4gSmFudWFyeSAyMDAwLiBVc2UgdGhpcyBmaWxlIGFzIGEgc3VwcGxlbWVudCB0bzoKCiAgICAgKiBUaGUgc2Vjb25kIGVkaXRpb24gb2YgWzEyXVVzaW5nIEMtS2VybWl0OyBhbmQ6CiAgICAgKiBUaGUgWzEzXUMtS2VybWl0IDcuMCBVcGRhdGUgTm90ZXMuIEFsc28gYXZhaWxhYmxlIGluIHBsYWluLXRleHQKICAgICAgIGZvcm0gYXMgWzE0XWNrZXJtaXQ3MC50eHQuCgogICB1bnRpbCB0aGUgdGhpcmQgZWRpdGlvbiBvZiBVc2luZyBDLUtlcm1pdCBpcyBwdWJsaXNoZWQuIFdlIGFwb2xvZ2l6ZQogICBmb3IgdGhlIHNjYXR0ZXJlZCBkb2N1bWVudGF0aW9uIGFuZCB3aWxsIGNvbnNvbGlkYXRlIGl0IHdoZW4gd2UgYXJlCiAgIGFibGUuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgIEFERElUSU9OQUwgRklMRVMgU2V2ZXJhbCBvdGhlciBmaWxlcyBhY2NvbXBhbnkgdGhpcyBuZXcgS2VybWl0CiAgIHJlbGVhc2U6CgogICBbMTVdY2t1dHV0b3IuaHRtbAogICAgICAgICAgQy1LZXJtaXQgVHV0b3JpYWwgKGZvciBVbml4KS4gQWxzbyBkaXN0cmlidXRlZCBpbiBOcm9mZiBmb3JtIGFzCiAgICAgICAgICBbMTZdY2t1a2VyLm5yLCB0aGUgVW5peCBDLUtlcm1pdCBtYW51YWwgcGFnZS4KCiAgIFsxN11zZWN1cml0eS5odG0KICAgICAgICAgIERpc2N1c3Npb24gb2YgS2VybWl0J3MgbmV3IGF1dGhlbnRpY2F0aW9uIGFuZCBlbmNyeXB0aW9uCiAgICAgICAgICBmZWF0dXJlcywgdXBkYXRlZCBmb3IgQy1LZXJtaXQgOC4wLgoKICAgWzE4XXRlbG5ldC5odG0KICAgICAgICAgIERldGFpbGVkIGRvY3VtZW50YXRpb24gb2YgS2VybWl0J3MgVGVsbmV0IGNsaWVudCwgdXBkYXRlZCBmb3IKICAgICAgICAgIEMtS2VybWl0IDguMC4KCiAgIFsxOV1mdHBzY3JpcHRzLmh0bWwKICAgICAgICAgIFR1dG9yaWFsOiBXcml0aW5nIEZUUCBhdXRvbWF0aW9uIHNjcmlwdHMKCiAgIFsyMF1ja2Nid3IuaHRtbAogICAgICAgICAgUGxhdGZvcm0taW5kZXBlbmRlbnQgQy1LZXJtaXQgaGludHMgYW5kIHRpcHMuIEFsc28gZGlzdHJpYnV0ZWQKICAgICAgICAgIGluIHBsYWluIHRleHQgZm9ybSBhcyBbMjFdY2tjYndyLnR4dAoKICAgWzIyXWNrdWJ3ci5odG1sCiAgICAgICAgICBVbml4LXNwZWNpZmljIEMtS2VybWl0IGhpbnRzIGFuZCB0aXBzLiBBbHNvIGRpc3RyaWJ1dGVkIGluCiAgICAgICAgICBwbGFpbiB0ZXh0IGZvcm0gYXMgWzIzXWNrdWJ3ci50eHQuCgogICBbMjRdY2t2YndyLmh0bWwKICAgICAgICAgIFZNUy1zcGVjaWZpYyBDLUtlcm1pdCBoaW50cyBhbmQgdGlwcy4gQWxzbyBkaXN0cmlidXRlZCBpbiBwbGFpbgogICAgICAgICAgdGV4dCBmb3JtIGFzIFsyNV1ja3Zid3IudHh0LgoKICAgWzI2XWNrdWlucy5odG1sCiAgICAgICAgICBVbml4IEMtS2VybWl0IGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMuIEFsc28gZGlzdHJpYnV0ZWQgaW4KICAgICAgICAgIHBsYWluIHRleHQgZm9ybSBhcyBbMjddY2t1aW5zLnR4dC4KCiAgIFsyOF1ja3ZpbnMuaHRtbAogICAgICAgICAgVk1TIEMtS2VybWl0IGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMuIEFsc28gZGlzdHJpYnV0ZWQgaW4KICAgICAgICAgIHBsYWluIHRleHQgZm9ybSBhcyBbMjldY2t2aW5zLnR4dC4KCiAgIFszMF1ja2NjZmcuaHRtbAogICAgICAgICAgQ29tcGlsZS10aW1lIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gQWxzbyBkaXN0cmlidXRlZCBpbiBwbGFpbgogICAgICAgICAgdGV4dCBmb3JtIGFzIFszMV1ja2NjZmcudHh0LgoKICAgWzMyXWNrY3BsbS5odG1sCiAgICAgICAgICBDLUtlcm1pdCBQcm9ncmFtIExvZ2ljIE1hbnVhbC4gQWxzbyBkaXN0cmlidXRlZCBpbiBwbGFpbiB0ZXh0CiAgICAgICAgICBmb3JtIGFzIFszM11ja2NwbG0udHh0LgoKICAgWzM0XWlrc2QuaHRtbAogICAgICAgICAgSW50ZXJuZXQgS2VybWl0IFNlcnZpY2UgQW1pbmlzdHJhdG9ycyBHdWlkZSBmb3IgVW5peC4KCiAgIFszNV1za2VybWl0Lmh0bWwKICAgICAgICAgIEMtS2VybWl0IGFzIGFuIFNTSCBTdWJzeXN0ZW0gKFNGVFAgc2VydmVyIHJlcGxhY2VtZW50KS4KCiAgIFsgWzM2XVRvcCBdIFsgWzM3XUMtS2VybWl0IF0gWyBbMzhdS2VybWl0IEhvbWUgXQogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgpDT05URU5UUwoKICAgICBbMzldMC4gV0hBVCdTIE5FVwogICAgIFs0MF0xLiBGSVhFUyBTSU5DRSBWRVJTSU9OIDcuMC4xOTYKICAgICBbNDFdMi4gU1NIIEFORCBIVFRQIAogICAgICAgICBbNDJdMi4xLiBTU0ggQ29ubmVjdGlvbnMKICAgICAgICAgWzQzXTIuMi4gSFRUUCBDb25uZWN0aW9ucwogICAgICAgICAgICBbNDRdMi4yLjEuIEhUVFAgQ29tbWFuZCBTd2l0Y2hlcwogICAgICAgICAgICBbNDVdMi4yLjIuIEhUVFAgQWN0aW9uIENvbW1hbmRzCiAgICAgICAgICAgIFs0Nl0yLjIuMy4gSFRUUCBIZWFkZXJzCiAgICAgICAgICAgIFs0N10yLjIuNC4gU2VjdXJlIEhUVFAgQ29ubmVjdGlvbnMKICAgICAgICAgICAgWzQ4XTIuMi41LiBIVFRQIFZhcmlhYmxlcwogICAgICAgICAgICBbNDldMi4yLjYuIFRoZSBIVFRQIENvbW1hbmQtTGluZSBQZXJzb25hbGl0eQogICAgIFs1MF0zLiBUSEUgQlVJTFQtSU4gRlRQIENMSUVOVAogICAgICAgICBbNTFdMy4xLiBNYWtpbmcgYW5kIE1hbmFnaW5nIEZUUCBDb25uZWN0aW9ucwogICAgICAgICAgICBbNTJdMy4xLjEuIEtlcm1pdCBDb21tYW5kLUxpbmUgT3B0aW9ucyBmb3IgRlRQCiAgICAgICAgICAgIFs1M10zLjEuMi4gVGhlIEZUUCBDb21tYW5kLUxpbmUgUGVyc29uYWxpdHkKICAgICAgICAgICAgWzU0XTMuMS4zLiBUaGUgRlRQIFVSTCBJbnRlcnByZXRlcgogICAgICAgICAgICBbNTVdMy4xLjQuIEludGVyYWN0aXZlIEZUUCBTZXNzaW9uIEVzdGFibGlzaG1lbnQKICAgICAgICAgWzU2XTMuMi4gTWFraW5nIFNlY3VyZSBGVFAgQ29ubmVjdGlvbnMKICAgICAgICAgWzU3XTMuMy4gU2V0dGluZyBGVFAgUHJlZmVyZW5jZXMKICAgICAgICAgWzU4XTMuNC4gTWFuYWdpbmcgRGlyZWN0b3JpZXMgYW5kIEZpbGVzCiAgICAgICAgIFs1OV0zLjUuIFVwbG9hZGluZyBGaWxlcyBXaXRoIEZUUAogICAgICAgICAgICBbNjBdMy41LjEuIEZUUCBQVVQgU3dpdGNoZXMKICAgICAgICAgICAgWzYxXTMuNS4yLiBVcGRhdGUgTW9kZQogICAgICAgICAgICBbNjJdMy41LjMuIFJlY292ZXJ5CiAgICAgICAgIFs2M10zLjYuIERvd25sb2FkaW5nIEZpbGVzIFdpdGggRlRQCiAgICAgICAgICAgIFs2NF0zLjYuMS4gRlRQIEdFVCBTd2l0Y2hlcwogICAgICAgICAgICBbNjVdMy42LjIuIEZpbGVuYW1lIENvbGxpc2lvbnMKICAgICAgICAgICAgWzY2XTMuNi4zLiBSZWNvdmVyeQogICAgICAgICBbNjddMy43LiBUcmFuc2xhdGluZyBDaGFyYWN0ZXIgU2V0cwogICAgICAgICAgICBbNjhdMy43LjEuIENoYXJhY3RlciBTZXRzIGFuZCBVcGxvYWRpbmcKICAgICAgICAgICAgWzY5XTMuNy4yLiBDaGFyYWN0ZXIgU2V0cyBhbmQgRG93bmxvYWRpbmcKICAgICAgICAgWzcwXTMuOC4gRlRQIENvbW1hbmQgU2hvcnRjdXRzCiAgICAgICAgIFs3MV0zLjkuIER1YWwgU2Vzc2lvbnMKICAgICAgICAgWzcyXTMuMTAuIEF1dG9tYXRpbmcgRlRQIFNlc3Npb25zCiAgICAgICAgICAgIFs3M10zLjEwLjEuIEZUUC1TcGVjaWZpYyBWYXJpYWJsZXMgYW5kIEZ1bmN0aW9ucwogICAgICAgICAgICBbNzRdMy4xMC4yLiBFeGFtcGxlcwogICAgICAgICAgICBbNzVdMy4xMC4zLiBBdXRvbWF0aW5nIFNlY3VyZSBGVFAgQ29ubmVjdGlvbnMKICAgICAgICAgWzc2XTMuMTEuIEFkdmFuY2VkIEZUUCBQcm90b2NvbCBGZWF0dXJlcyAgWzc3XTQuIEZJTEUgU0NBTk5JTkcKICAgIFs3OF01LiBGSUxFIEFORCBESVJFQ1RPUlkgTkFNRVMgQ09OVEFJTklORyBTUEFDRVMKICAgIFs3OV02LiBPVEhFUiBDT01NQU5EIFBBUlNJTkcgSU1QUk9WRU1FTlRTCiAgICAgICAgIFs4MF02LjEuIEdyb3VwaW5nIE1hY3JvIEFyZ3VtZW50cwogICAgICAgICBbODFdNi4yLiBEaXJlY3RvcnkgYW5kIEZpbGUgTmFtZSBDb21wbGV0aW9uCiAgICAgICAgIFs4Ml02LjMuIFBhc3NpbmcgQXJndW1lbnRzIHRvIENvbW1hbmQgRmlsZXMKICAgICAgICAgWzgzXTYuNC4gTW9yZS1Qcm9tcHRpbmcKICAgICAgICAgWzg0XTYuNS4gQ29tbWFzIGluIE1hY3JvIERlZmluaXRpb25zCiAgICAgICAgIFs4NV02LjYuIEFycm93IEtleXMKICAgIFs4Nl03LiBORVcgQ09NTUFORFMgQU5EIFNXSVRDSEVTCiAgICBbODddOC4gU0NSSVBUSU5HIElNUFJPVkVNRU5UUwogICAgICAgICBbODhdOC4xLiBQZXJmb3JtYW5jZSBhbmQgRGVidWdnaW5nCiAgICAgICAgIFs4OV04LjIuIFVzaW5nIE1hY3JvcyBhcyBOdW1lcmljIFZhcmlhYmxlcwogICAgICAgICBbOTBdOC4zLiBOZXcgSUYgQ29uZGl0aW9ucwogICAgICAgICBbOTFdOC40LiBUaGUgT05fVU5LTk9XTl9DT01NQU5EIGFuZCBPTl9DRCBNYWNyb3MKICAgICAgICAgWzkyXTguNS4gVGhlIFNIT1cgTUFDUk8gQ29tbWFuZAogICAgICAgICBbOTNdOC42LiBBcnJheXMKICAgICAgICAgWzk0XTguNy4gTmV3IG9yIEltcHJvdmVkIEJ1aWx0LWluIFZhcmlhYmxlcyBhbmQgRnVuY3Rpb25zCiAgICAgICAgIFs5NV04LjguIFRoZSBSRVRVUk4gYW5kIEVORCBDb21tYW5kcwogICAgICAgICBbOTZdOC45LiBVTkRFRklOaW5nIEdyb3VwcyBvZiBWYXJpYWJsZXMKICAgICAgICAgWzk3XTguMTAuIFRoZSBJTlBVVCBhbmQgTUlOUFVUIENvbW1hbmRzCiAgICAgICAgIFs5OF04LjExLiBMZWFybmVkIFNjcmlwdHMKICAgICAgICAgWzk5XTguMTIuIFBhdHRlcm4gTWF0Y2hpbmcKICAgICAgICAgWzEwMF04LjEzLiBEYXRlcyBhbmQgVGltZXMKICAgICAgICAgWzEwMV04LjE0LiBUcmFwcGluZyBLZXlib2FyZCBJbnRlcnJ1cHRpb24KICAgIFsxMDJdOS4gUy1FWFBSRVNTSU9OUwogICAgICAgICBbMTAzXTkuMS4gV2hhdCBpcyBhbiBTLUV4cHJlc3Npb24/CiAgICAgICAgIFsxMDRdOS4yLiBJbnRlZ2VyIGFuZCBGbG9hdGluZy1Qb2ludC1Bcml0aG1ldGljCiAgICAgICAgIFsxMDVdOS4zLiBIb3cgdG8gVXNlIFMtRXhwcmVzc2lvbnMKICAgICAgICAgWzEwNl05LjQuIFN1bW1hcnkgb2YgQnVpbHQtaW4gQ29uc3RhbnRzIGFuZCBPcGVyYXRvcnMKICAgICAgICAgWzEwN105LjUuIFZhcmlhYmxlcwogICAgICAgICBbMTA4XTkuNi4gQXNzaWdubWVudHMgYW5kIFNjb3BlCiAgICAgICAgIFsxMDldOS43LiBDb25kaXRpb25hbCBFeHByZXNzaW9ucwogICAgICAgICBbMTEwXTkuOC4gRXh0ZW5zaWJpbGl0eQogICAgICAgICBbMTExXTkuOS4gRXhhbXBsZXMKICAgICAgICAgWzExMl05LjEwLiBEaWZmZXJlbmNlcyBmcm9tIEFsZ2VicmFpYyBOb3RhdGlvbgogICAgICAgICBbMTEzXTkuMTEuRGlmZmVyZW5jZXMgZnJvbSBMaXNwCiAgICBbMTE0XTEwLiBGSUxFIFRSQU5TRkVSCiAgICBbMTE1XTExLiBNT0RFTVMgQU5EIERJQUxJTkcKICAgIFsxMTZdMTIuIFRFUk1JTkFMIENPTk5FQ1RJT04KICAgIFsxMTddMTMuIENIQVJBQ1RFUiBTRVRTCiAgICBbMTE4XTE0LiBESUFMT1VUIEZST00gVEVMTkVUIFRFUk1JTkFMIFNFUlZFUlMKICAgIFsxMTldMTUuIENPUElORyBXSVRIIEJST0tFTiBLRVJNSVQgUEFSVE5FUlMKICAgIFsxMjBdMTYuIE5FVyBDT01NQU5ELUxJTkUgT1BUSU9OUwogICAgWzEyMV0xNy4gTE9HUwoKICAgWyBbMTIyXVRvcCBdIFsgWzEyM11DLUtlcm1pdCBdIFsgWzEyNF1LZXJtaXQgSG9tZSBdCiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCjAuIFdIQVQnUyBORVcKCiAgIFRoZSBJbml0aWFsaXphdGlvbiBhbmQgQ3VzdG9taXphdGlvbiBGaWxlcwogICAgICAgICAgQy1LZXJtaXQgOC4wIG5vdyBzdXBwb3J0cyBzcGVjaWZpY2F0aW9uIG9mIHRoZSBpbml0aWFsaXphdGlvbgogICAgICAgICAgZmlsZSBuYW1lIChwYXRoKSBpbiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSwgQ0tFUk1JVF9JTkkuIEl0CiAgICAgICAgICBhbHNvIHJlbGllcyBmYXIgbGVzcyB0aGFuIGJlZm9yZSBvbiB0aGUgaW5pdGlhbGl6YXRpb24gZm9yCiAgICAgICAgICBmdW5jdGlvbmluZy4gU2VlIFsxMjVdU2VjdGlvbiA1IG9mIHRoZSBVbml4IEMtS2VybWl0CiAgICAgICAgICBbMTI2XWluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgZm9yIGRldGFpbHMuIEFzIG9mIHZlcnNpb24KICAgICAgICAgIDguMC4yMDEsIEMtS2VybWl0IGFsc28gZXhlY3V0ZXMgeW91ciBjdXN0b21pemF0aW9uIGZpbGUgKGlmIHlvdQogICAgICAgICAgaGF2ZSBvbmUpIGV2ZW4gaWYgdGhlIGluaXRpYWxpemF0aW9uIGZpbGUgd2FzIG5vdCBmb3VuZC4KICAgICAgICAgIFByZXZpb3VzbHksIHRoZSBjdXN0b21pemF0aW9uIGZpbGUgd2FzIGV4ZWN1dGVkIGJ5IGEgVEFLRQogICAgICAgICAgY29tbWFuZCBpbiB0aGUgaW5pdGlhbGl6YXRpb24gZmlsZSAoYW5kIGl0IHN0aWxsIGlzLCBpZiBhbgogICAgICAgICAgaW5pdGlhbGl6YXRpb24gaXMgZm91bmQpLgoKICAgSW5jb21wYXRpYmxlIENoYW5nZXMKICAgICAgICAgIEFzIGFsd2F5cywgd2UgZG8gb3VyIGJlc3QgdG8gYXZvaWQgY2hhbmdlcyB0aGF0IGJyZWFrIGV4aXN0aW5nCiAgICAgICAgICBzY3JpcHRzLiBIb3dldmVyLCBDLUtlcm1pdCA4LjAgZG9lcyBpbmNsdWRlIGEgcmF0aGVyIHBlcnZhc2l2ZQogICAgICAgICAgc3ludGF4IGNoYW5nZSB0aGF0IG1pZ2h0IGFsdGVyIHRoZSBiZWhhdmlvciBvZiBzY3JpcHRzIHRoYXQKICAgICAgICAgIGRlcGVuZCBvbiB0aGUgcHJldmlvdXMgYmVoYXZpb3IuIEFzIGRlc2NyaWJlZCBpbiBbMTI3XVNlY3Rpb24KICAgICAgICAgIDUsIEMtS2VybWl0IG5vdyBhY2NlcHRzIGRvdWJsZXF1b3RlcyBpbiBtb3N0IGNvbnRleHRzIHdoZXJlIHlvdQogICAgICAgICAgcHJldmlvdXNseSBoYWQgdG8gdXNlIGJyYWNlcyB0byBncm91cCBtdWx0aXBsZSB3b3JkcyBpbnRvIGEKICAgICAgICAgIHNpbmdsZSBmaWVsZCwgb3IgdG8gZm9yY2UgaW5jbHVzaW9uIG9mIGxlYWRpbmcgb3IgdHJhaWxpbmcKICAgICAgICAgIGJsYW5rcy4gTW9zdCBub3RpY2VhYmx5LCBpbiBDLUtlcm1pdCA3LjAgYW5kIGVhcmxpZXI6CgogIGVjaG8ge3RoaXMgaXMgYSBzdHJpbmd9CgogICAgICAgICAgd291bGQgcHJpbnQ6CgogIHRoaXMgaXMgYSBzdHJpbmcKCiAgICAgICAgICB3aGVyZWFzOgoKICBlY2hvICJ0aGlzIGlzIGEgc3RyaW5nIgoKICAgICAgICAgIHByaW50ZWQ6CgogICJ0aGlzIGlzIGEgc3RyaW5nIgoKICAgICAgICAgIEluIEMtS2VybWl0IDguMCwgYm90aCBwcmludDoKCiAgdGhpcyBpcyBhIHN0cmluZwoKICAgICAgICAgIFRvIGZvcmNlIHRoZSBkb3VibGVxdW90ZXMgdG8gYmUgdHJlYXRlZCBhcyBwYXJ0IG9mIHRoZSBzdHJpbmcsCiAgICAgICAgICB1c2UgZWl0aGVyIG9mIHRoZSBmb2xsb3dpbmcgZm9ybXM6CgogIGVjaG8geyJ0aGlzIGlzIGEgc3RyaW5nIn0KICBlY2hvICIidGhpcyBpcyBhIHN0cmluZyIiCgogICAgICAgICAgU2ltaWxhcmx5LCB0byBmb3JjZSBicmFjZXMgdG8gYmUgdHJlYXRlZCBhcyBwYXJ0IG9mIHRoZSBzdHJpbmc6CgogIGVjaG8gInt0aGlzIGlzIGEgc3RyaW5nfSIKICBlY2hvIHt7dGhpcyBpcyBhIHN0cmluZ319CgogICAgICAgICAgT3RoZXIgaW5jb21wYXRpYmlsaXRpZXM6CgogICAgICAgICAxLiBVc2luZyB0aGUgU0VUIEhPU1QgY29tbWFuZCB0byBtYWtlIEhUVFAgY29ubmVjdGlvbnMgaXMgbm8KICAgICAgICAgICAgbG9uZ2VyIHN1cHBvcnRlZC4gSW5zdGVhZCwgdXNlIHRoZSBuZXcgSFRUUCBPUEVOIGNvbW1hbmQsCiAgICAgICAgICAgIGRlc2NyaWJlZCBpbiBbMTI4XVNlY3Rpb24gMi4yLgoKICAgQy1LZXJtaXQgNy4xIEFscGhhLjAxICg4IERlY2VtYmVyIDIwMDApCgogICAgIEl0cyBtYWpvciBuZXcgZmVhdHVyZXMgYXJlIHRob3NlIGxpc3RlZCBpbiB0aGUgWzEyOV1UYWJsZSBvZgogICAgICAgICAgQ29udGVudHM6IHRoZSBGVFAgY2xpZW50LCBmaWxlIHNjYW5uaW5nLCBjb21tYW5kIHBhcnNpbmcgYW5kCiAgICAgICAgICBzY3JpcHRpbmcgaW1wcm92ZW1lbnRzLCBTLUV4cHJlc3Npb25zLCBhbmQgc3VwcG9ydCBmb3IgdGhlCiAgICAgICAgICBUZWxuZXQgQ29tIFBvcnQgT3B0aW9uLCBwbHVzIHdpZGVyIGF2YWlsYWJpbGl0eSBvZiB0aGUKICAgICAgICAgIEtlcmJlcm9zLCBTU0wvVExTLCBhbmQgU1JQIHNlY3VyaXR5IG9wdGlvbnMgZm9yIHNlY3VyZSBJbnRlcm5ldAogICAgICAgICAgY29ubmVjdGlvbnMuCgogICBDLUtlcm1pdCA3LjEuMTk5IEFscGhhLjAyICg0IEphbnVhcnkgMjAwMSkKCiAgICAgICAgICArIEMtS2VybWl0IG5vdyBhY2NlcHRzIFsxMzBdRlRQLCBURUxORVQsIGFuZCBJS1NEIFVSTHMgYXMgaXRzCiAgICAgICAgICAgIGZpcnN0IGNvbW1hbmQtbGluZSBhcmd1bWVudC4KICAgICAgICAgICsgQ2hhcmFjdGVyLXNldCB0cmFuc2xhdGlvbiBhZGRlZCB0byB0aGUgRlRQIGNsaWVudCBmb3IKICAgICAgICAgICAgWzEzMV1maWxlbmFtZXMuIAogICAgICAgICAgKyBPcHRpb25hbCBbMTMyXXNldHRpbmcgb2YgZGF0ZSBvZiBpbmNvbWluZyBmaWxlcyBieSBGVFAgW01dR0VUCiAgICAgICAgICAgIGZyb20gdGhlIHNlcnZlciBkYXRlLgogICAgICAgICAgKyBbMTMzXUZUUCBDSEVDSyBmaWxlbmFtZSBhZGRlZCB0byBsZXQgRlRQIGNsaWVudCBjaGVjayB0aGUKICAgICAgICAgICAgZXhpc3RlbmNlIG9mIGEgZmlsZSBvbiB0aGUgc2VydmVyLgogICAgICAgICAgKyBbMTM0XUZUUCBHRVQgL05BTUVMSVNUOmZpbGVuYW1lIGFkZGVkIHRvIGdldCBsaXN0IG9mIHNlcnZlcgogICAgICAgICAgICBmaWxlbmFtZXMgaW50byBhIGxvY2FsIGZpbGUuCiAgICAgICAgICArIFsxMzVdRlRQIFtNXVBVVCAvU0VSVkVSLVJFTkFNRTp0ZW1wbGF0ZSBhZGRlZCB0byBtYWtlIHNlcnZlcgogICAgICAgICAgICByZW5hbWUgYSBmaWxlIGFzIGluZGljYXRlZCBieSB0aGUgdGVtcGxhdGUgYWZ0ZXIgaXQgaGFzCiAgICAgICAgICAgIGFycml2ZWQgY29tcGxldGVseS4KICAgICAgICAgICsgRlRQIFtNXUdFVCAvU0VSVkVSLVJFTkFNRTp0ZW1wbGF0ZSBhZGRlZCB0byBtYWtlIHNlcnZlcgogICAgICAgICAgICByZW5hbWUgYSBmaWxlIGFzIGluZGljYXRlZCBieSB0aGUgdGVtcGxhdGUgYWZ0ZXIgaXQgaGFzIGJlZW4KICAgICAgICAgICAgc2VudCBjb21wbGV0ZWx5LgogICAgICAgICAgKyBGVFAgWzEzNl1WRElSRUNUT1JZIGFkZGVkIGZvciBnZXR0aW5nIHZlcmJvc2UgZGlyZWN0b3J5CiAgICAgICAgICAgIGxpc3RpbmdzIGZyb20gVE9QUy0yMC4KICAgICAgICAgICsgWzEzN11GVFAgVFlQRSBURU5FWCBhZGRlZCBmb3IgdHJhbnNmZXJyaW5nIDgtYml0IGJpbmFyeSBmaWxlcwogICAgICAgICAgICB3aXRoIFBEUC0xMHMuCiAgICAgICAgICArIEFkZGVkIFsxMzhdYXV0b21hdGljIHRleHQvYmluYXJ5IG1vZGUgc3dpdGNoaW5nIGZvciBGVFAKICAgICAgICAgICAgW01dR0VULCBiYXNlZCBvbiBmaWxlbmFtZSBwYXR0ZXJucyAoZS5nLiAqLnppcCwgKi5neiwgKi5leGUKICAgICAgICAgICAgYXJlIGJpbmFyeTsgKi50eHQsICouYyBhcmUgdGV4dCkuCiAgICAgICAgICArIFsxMzldU0VUIFNFTkQgSS1QQUNLRVRTIE9GRiBhZGRlZCBmb3IgY29waW5nIHdpdGggS2VybWl0CiAgICAgICAgICAgIHNlcnZlcnMgdGhhdCBkbyBub3Qgc3VwcG9ydCBJIHBhY2tldHMuCiAgICAgICAgICArIEEgbmV3IG9wdGlvbiB3YXMgYWRkZWQgdG8gWzE0MF1cZndvcmQoKSBhbmQgXGZzcGxpdCgpIGZvcgogICAgICAgICAgICBwYXJzaW5nIGNvbW1hLXNlcGFyYXRlZCBsaXN0cyB0aGF0IG1pZ2h0IGNvbnRhaW4gZW1wdHkKICAgICAgICAgICAgZWxlbWVudHMuCiAgICAgICAgICArIEJ1ZyBmaXhlcyBpbmNsdWRpbmc6CiAgICAgICAgICAgICAgIG8ge30gb3IgIiIgY291bGQgbm90IGJlIHVzZWQgYXMgZXhwZWN0ZWQgdG8gcmVwcmVzZW50IHRoZQogICAgICAgICAgICAgICAgIGVtcHR5IHN0cmluZy4KICAgICAgICAgICAgICAgbyAsLSBvbiBhIGxpbmUgYnkgaXRzZWxmIGluIGEgbWFjcm8gZGVmaW5pdGlvbiBjYXVzZWQKICAgICAgICAgICAgICAgICBzdWJzZXF1ZW50IHN0YXRlbWVudHMgdG8gYmUgc2tpcHBlZC4KICAgICAgICAgICAgICAgbyBGVFAgW01dR0VUIGRpZG4ndCB3b3JrIHJpZ2h0IGlmIHBhdGggc2VnbWVudHMgd2VyZQogICAgICAgICAgICAgICAgIGluY2x1ZGVkIGluIHRoZSBmaWxlc3BlYy4KICAgICAgICAgICAgICAgbyBGVFAgTUdFVCwgaWYgaW50ZXJydXB0ZWQsIGRpZCBub3QgY2xlYXIgaXRzIGZpbGUgbGlzdC4KICAgICAgICAgICAgICAgbyBWYXJpb3VzIHByb2JsZW1zIHdpdGggRlRQIFBVVCAvQVMtTkFNRSB0aGF0IG5vYm9keQogICAgICAgICAgICAgICAgIG5vdGljZWQuCiAgICAgICAgICAgICAgIG8gU29tZSBGVFAgbWVzc2FnZXMgYW5kIGRpc3BsYXlzIGludGVyZmVyZWQgd2l0aCBlYWNoCiAgICAgICAgICAgICAgICAgb3RoZXIuCiAgICAgICAgICAgICAgIG8gUGFyc2luZyBvZiBZRVNURVJEQVksIFRPREFZLCBhbmQgVE9NT1JST1cgaW4gZGF0ZS10aW1lCiAgICAgICAgICAgICAgICAgZmllbGRzIHdhcyBicm9rZW4uCiAgICAgICAgICAgICAgIG8gQXV0b21hdGljIG9sZC10by1uZXcgZGlhbGluZyBkaXJlY3RvcnkgZm9ybWF0IGNvbnZlcnNpb24KICAgICAgICAgICAgICAgICB3YXMgYnJva2VuIG9uIFZNUy4KICAgICAgICAgICAgICAgbyBWYXJpb3VzIHNvdXJjZS1jb2RlIHBvcnRhYmlsaXR5IHByb2JsZW1zIGZpeGVkLgogICAgICAgICAgKyBJbXByb3ZlbWVudCBvZiB2YXJpb3VzIEhFTFAgYW5kIFNIT1cgbWVzc2FnZXMuCgogICBDLUtlcm1pdCA3LjEuMTk5IEFscGhhLjA0ICgxIEFwcmlsIDIwMDEpCgogICAgICAgICAgKyBCaWcgY2hhbmdlczoKICAgICAgICAgICAgICAgbyBDaGFuZ2VkIGRlZmF1bHQgbW9kZW0gdHlwZSBmcm9tIE5PTkUgdG8gR0VORVJJQy4KICAgICAgICAgICAgICAgbyBHZW5lcmljIGRpYWxpbmcgbm93IHNlbmRzIG5vIGluaXQgc3RyaW5nIGF0IGFsbC4KICAgICAgICAgICAgICAgbyBDaGFuZ2VkIGRlZmF1bHQgdGVybWluYWwgYnl0ZXNpemUgZnJvbSA3IHRvIDguCiAgICAgICAgICArIE5ldyBmZWF0dXJlczoKICAgICAgICAgICAgICAgbyBTRVQgU0VTU0lPTi1MT0cgVElNRVNUQU1QRUQtVEVYVCBmb3IgdGltZXN0YW1wZWQgc2Vzc2lvbgogICAgICAgICAgICAgICAgIGxvZy4KICAgICAgICAgICsgTmV3IG1vZGVtIHR5cGVzOgogICAgICAgICAgICAgICBvIENvbmV4YW50IG1vZGVtIGZhbWlseQogICAgICAgICAgICAgICBvIEx1Y2VudCBWRU5VUyBjaGlwc2V0CiAgICAgICAgICAgICAgIG8gUENUZWwgVi45MCBjaGlwc2V0CiAgICAgICAgICAgICAgIG8gWm9vbSBWLjkwCiAgICAgICAgICAgICAgIG8gWm9vbSBWLjkyCiAgICAgICAgICArIEZUUCBjbGllbnQ6CiAgICAgICAgICAgICAgIG8gRlRQIE9QRU4gL1BBU1NJVkUgYW5kIC9BQ1RJVkUgc3dpdGNoZXMgYWRkZWQuCiAgICAgICAgICAgICAgIG8gTm93IHdvcmtzIHdpdGggc2VydmVycyB0aGF0IHRoYXQgZG9uJ3QgaW5jbHVkZSBwYXRoIGluCiAgICAgICAgICAgICAgICAgTkxTVCByZXNwb25zZS4KICAgICAgICAgICAgICAgbyBGaXhlZCBTRU5EIC9SRUNVUlNJVkUgbm90IHRvIGZvbGxvdyBzeW1saW5rcyAoVU5JWCkuCiAgICAgICAgICAgICAgIG8gU0VUIEZUUCBWRVJCT1NFLU1PREUgZGVmYXVsdCBpcyBub3cgT0ZGIGluc3RlYWQgb2YgT04uCiAgICAgICAgICArIEtlcm1pdCBwcm90b2NvbDoKICAgICAgICAgICAgICAgbyBGaXhlZCB3aGF0IEkgaG9wZSBpcyB0aGUgbGFzdCAiUmVjZWl2ZSB3aW5kb3cgZnVsbCIKICAgICAgICAgICAgICAgICBlcnJvci4KICAgICAgICAgICAgICAgbyBTRVQgUFJFRklYSU5HIG9yIFNFVCBDT05UUk9MIFBSRUZJWCBub3cgYXV0b21hdGljYWxseQogICAgICAgICAgICAgICAgIHNldHMgQ0xFQVJDSEFOTkVMIE9GRi4KICAgICAgICAgICAgICAgbyBGaXhlZCBpbmNvcnJlY3QgcmVwb3J0IG9mIG51bWJlciBvZiBmaWxlcyB0cmFuc2ZlcnJlZCBhdAogICAgICAgICAgICAgICAgIGVuZCBvZiB0cmFuc2Zlci4KICAgICAgICAgICAgICAgbyBGaXhlZCBTRU5EIC9SRUNVUlNJVkUgbm90IHRvIGZvbGxvdyBzeW1saW5rcyAoVU5JWCkuCiAgICAgICAgICArIFVOSVg6CiAgICAgICAgICAgICAgIG8gSFRUUCBhbmQgc2hhZG93IHBhc3N3b3JkcyBlbmFibGVkIGZvciBTQ08gNS4wLjYuCiAgICAgICAgICAgICAgIG8gRXZlbiB3aXRoIFNFVCBGSUxFTkFNRVMgQ09OVkVSVEVELCBzcGFjZXMgd2VyZSBzdGlsbAogICAgICAgICAgICAgICAgIGFjY2VwdGVkIGluIGluY29taW5nIGZpbGVuYW1lczsgbm93IHRoZXkgYXJlIGNvbnZlcnRlZAogICAgICAgICAgICAgICAgIHRvIHVuZGVyc2NvcmVzLgogICAgICAgICAgICAgICBvIEFkZGVkIHN1cHBvcnQgZm9yIGNvbXBpbGUtdGltZSBta3RlbXAoKS9ta3N0ZW1wKCkKICAgICAgICAgICAgICAgICBzZWxlY3Rpb24uCiAgICAgICAgICArIFZNUzoKICAgICAgICAgICAgICAgbyBTZXNzaW9uLWxvZyBmb3JtYXQgZm9yIHNjcmlwdGVkIHNlc3Npb25zIGZpeGVkLgogICAgICAgICAgKyBTY3JpcHRpbmc6CiAgICAgICAgICAgICAgIG8gRml4ZWQgXGZyZGlyKCkgbm90IHRvIGZvbGxvdyBzeW1saW5rcyAoVU5JWCkuCiAgICAgICAgICAgICAgIG8gRml4ZWQgXGZkYXkoKSBub3QgdG8gZHVtcCBjb3JlIGZvciBkYXRlcyBwcmlvciB0byAxNyBNYXIKICAgICAgICAgICAgICAgICAxODU4LgogICAgICAgICAgKyBHZW5lcmFsOgogICAgICAgICAgICAgICBvICJDbG9zaW5nIGJsYWguLi4iIG1lc3NhZ2UgdXBvbiBleGl0IGNvdWxkIG5vdCBiZQogICAgICAgICAgICAgICAgIHN1cnByZXNzZWQuCiAgICAgICAgICAgICAgIG8gQWRkZWQgL1BBR0UgYW5kIC9OT1BBR0UgdG8gREVMRVRFIHN3aXRjaGVzLgogICAgICAgICAgICAgICBvIEFkZGVkIEdPIHJlc3BvbnNlIGZvciBERUxFVEUgL0FTSyAoZGVsZXRlIGFsbCB0aGUgcmVzdAogICAgICAgICAgICAgICAgIHdpdGhvdXQgYXNraW5nKS4KICAgICAgICAgICAgICAgbyBBZGRlZCBHTyByZXNwb25zZSB0byAibW9yZT8iIHByb21wdCAoZm9yIG11bHRpLXBhZ2UKICAgICAgICAgICAgICAgICBzY3JlZW4gb3V0cHV0KS4KICAgICAgICAgICAgICAgbyBVcGRhdGVkIEhFTFAgdGV4dHMuCgogICBDLUtlcm1pdCA3LjEuMTk5IEJldGEuMDEgKDEwIE1heSAyMDAxKQoKICAgICAgICAgICsgRlRQIGNsaWVudCB2ZXJib3NpdHkgYWRqdXN0bWVudHMuCiAgICAgICAgICArIEJ1ZyB3aXRoIGdlbmVyaWMgbW9kZW0gZGlhbGluZyBwYXVzaW5nIHNldmVyYWwgc2VjcyBmaXhlZC4KICAgICAgICAgICsgU0VUIEhPU1QgL1VTRVI6LCBTRVQgTE9HSU4gVVNFUklELCBldGMsIGZpeGVkIHdoZW4gZ2l2ZW4gbm8KICAgICAgICAgICAgdXNlciBJRC4KICAgICAgICAgICsgQSBjb3VwbGUgXHYoZG1fYmxhaCkgZGlhbCBtb2RpZmllciB2YXJpYWJsZXMgYWRkZWQuCiAgICAgICAgICArICItLXZlcnNpb24iIGNvbW1hbmQtbGluZSBzd2l0Y2ggYWRkZWQuCiAgICAgICAgICArIEZpeGVkIE5ldEJTRCBzZXJpYWwtcG9ydCBEVFIgaGFuZGxpbmcuCiAgICAgICAgICArIExvdHMgb2Ygc3ludGF4IGNsZWFudXBzIGZvciBGbGV4ZWxpbnQgYW5kIGdjYyAtV2FsbC4KICAgICAgICAgICsgRml4ZWQgbW9kZW0tdHlwZSBhbGlhc2VzIHRvIG5vdCB0YWtlIHByZWNlZGVuY2Ugb3ZlciByZWFsCiAgICAgICAgICAgIG5hbWVzLgogICAgICAgICAgKyBGaXhlZCBmdW5ueSB0cmVhdG1lbnQgb2YgZG91YmxlcXVvdGVzIGJ5IEVDSE8gY29tbWFuZC4KICAgICAgICAgICsgRW5hYmxlZCBTRVQgU0VTU0lPTi1MT0cgZm9yIFZNUyBhbmQgb3RoZXIgbm9uLVVOSVggcGxhdG9ybXMuCiAgICAgICAgICArIEZpeGVkIGNoYW5naW5nIGRpcmVjdGlvbiBpbiBjb21tYW5kIGhpc3RvcnkgYnVmZmVyLgogICAgICAgICAgKyBGaXhlZCBoYW5kbGluZyBvZiBJS1NEIFVSTHMuCiAgICAgICAgICArIE1hZGUgc3VyZSBERUxFVEUgcHJpbnRzIGEgbWVzc2FnZSBpZiBpdCBnb3QgYW55IGVycm9ycy4KCiAgIEMtS2VybWl0IDguMC4yMDAgQmV0YS4wMiAoMjggSnVuZSAyMDAxKQoKICAgICAgICAgICsgTWFqb3IgdmVyc2lvbiBudW1iZXIgaW5jcmVhc2VkIGZyb20gNyB0byA4LgogICAgICAgICAgKyBbMTQxXVNTSCBjb21tYW5kLgogICAgICAgICAgKyBNb3JlLWNvbnNpc3RlbnQgS2VybWl0IHByb3RvY29sIGRlZmF1bHRzLgogICAgICAgICAgKyBDT05ORUNUIGlkbGUgdGltZW91dCBhbmQgYWN0aW9uIHNlbGVjdGlvbi4KICAgICAgICAgICsgQ09OTkVDVCBzdGF0dXMgdmFyaWFibGUuCiAgICAgICAgICArIEEgd2F5IHRvIGFsbG9jYXRlIG1vcmUgc3BhY2UgZm9yIGZpbGVuYW1lIGxpc3RzLgogICAgICAgICAgKyBQc2V1ZG90ZXJtaW5hbCBoYW5kbGVyIGZpeGVkIGZvciBsYXRlLW1vZGVsIExpbnV4ZXMuCiAgICAgICAgICArIENvbW1hbmQtbGluZSBvcHRpb24gLWRkIGZvciB0aW1lc3RhbXBlZCBkZWJ1ZyBsb2cuCiAgICAgICAgICArIERvd25sb2FkIGRpcmVjdG9yeSBub3cgd29ya3MgZm9yIGV4dGVybmFsIHByb3RvY29scyB0b28uCiAgICAgICAgICArIEdSRVAgL0NPVU5UOnZhcmlhYmxlLgogICAgICAgICAgKyBTRVQgQVRUUklCVVRFIFJFQ09SRC1GT1JNQVQgeyBPRkYsIE9OIH0uCiAgICAgICAgICArIEJ1ZyBmaXhlcy4KCiAgIEMtS2VybWl0IDguMC4yMDAgQmV0YS4wMyAoOSBTZXAgMjAwMSkKCiAgICAgICAgICArIFsxNDJdSFRUUCAxLjEgY29ubmVjdGlvbnMgYW5kIHNjcmlwdGluZwogICAgICAgICAgKyBbMTQzXU9OX0NUUkxDIG1hY3JvIGZvciB0cmFwcGluZyBDdHJsLUMgaW4gc2NyaXB0cwogICAgICAgICAgKyBbMTQ0XURhdGUtdGltZSBwYXJzaW5nIGltcHJvdmVtZW50cywgdGltZXpvbmVzLCBjb21wYXJpc29uLAogICAgICAgICAgICBhcml0aG1ldGljCiAgICAgICAgICArIFsxNDVdUGF0dGVybi1tYXRjaGluZyBpbXByb3ZlbWVudHMKICAgICAgICAgICsgRlRQIGltcHJvdmVtZW50cwogICAgICAgICAgKyBTRVQgRVhJVCBIQU5HVVAgeyBPTiwgT0ZGIH0KICAgICAgICAgICsgU0VUIEZJTEUgRU9GIHsgQ1RSTC1aLCBMRU5HVEggfQogICAgICAgICAgKyBBU0tbUV0gL1RJTUVPVVQKICAgICAgICAgICsgQnVnIGZpeGVzCiAgICAgICAgICArIE5ldyBwbGF0Zm9ybXMKCiAgIEMtS2VybWl0IDguMC4yMDAgQmV0YS4wNCAoMTYgTm92IDIwMDEpCgogICAgICAgICAgKyBbMTQ2XU5ldyBVbml4IG1hbiBwYWdlCiAgICAgICAgICArIFsxNDddTmV3IFVuaXggaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucwogICAgICAgICAgKyBTRVQgVEVMT1BUIHBvbGljaWVzIGFyZSBub3cgZW5mb3JjZWQgb24gbm9uLVRlbG5ldCBwb3J0cyBpZgogICAgICAgICAgICB0aGUgc2VydmVyIGJlZ2lucyBUZWxuZXQgbmVnb3RpYXRpb25zLgogICAgICAgICAgKyBTRVQgVEVSTUlOQUwgSURMRS1BQ1RJT04geyBURUxORVQtTk9QLCBURUxORVQtQVlUIH0uCiAgICAgICAgICArIFVVQ1AgbG9ja2ZpbGUgY3JlYXRpb24gcmFjZSBjb25kaXRpb24gZml4ZWQuCiAgICAgICAgICArIERpYWxvdXQsIG1vZGVtIHNpZ25hbHMsIGhhbmd1cCwgaGFyZHdhcmUgZmxvdyBjb250cm9sLCBldGMsCiAgICAgICAgICAgIHRlc3RlZCBleHRlbnNpdmVseSBvbiBtYW55IHBsYXRmb3JtcywgbnVtZXJvdXMgcHJvYmxlbXMKICAgICAgICAgICAgZml4ZWQuCiAgICAgICAgICArIEltcHJvdmVkIGhpbnRzIHdoZW4gZGlhbGluZyBmYWlscy4KICAgICAgICAgICsgU0VUIFNUT1AtQklUUyAyIGNhbiBub3cgYmUgZ2l2ZW4gd2l0aG91dCBTRVQgRkxPVyBIQVJEV0FSRS4KICAgICAgICAgICsgTWFqb3IgaW1wcm92ZW1lbnRzIGluIFJGQyAyMjE3IFRlbG5ldCBDb20tUG9ydCBDb250cm9sLgogICAgICAgICAgKyBJbXByb3ZlZCBhYmlsaXR5IHRvIFJFRElBTCBhIG1vZGVtIHNlcnZlciBwb3J0LgogICAgICAgICAgKyBrZXJtaXQgLWggbm93IHNob3dzIHRoZSBjb21tYW5kIG5hbWUgaW4gdGhlIHVzYWdlIHVzYWdlCiAgICAgICAgICAgIHN0cmluZy4KICAgICAgICAgICsga2VybWl0IC1oIG5vdyBzaG93cyBBTEwgY29tbWFuZC1saW5lIG9wdGlvbnMuCiAgICAgICAgICArIGtlcm1pdCAtcyBibGFoLCB3aGVyZSBibGFoIGlzIGEgc3ltbGluaywgbm93IHdvcmtzLgogICAgICAgICAgKyAtLW5vcGVybXMgY29tbWFuZC1saW5lIG9wdGlvbiA9IFNFVCBBVFRSSUJVVEUgUEVSTUlTU0lPTlMKICAgICAgICAgICAgT0ZGLgogICAgICAgICAgKyBIVFRQIGFuZCBIVFRQUyBVUkxzIG5vdyBzdXBwb3J0ZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KICAgICAgICAgICsgQW4gaHR0cCBjb21tYW5kLWxpbmUgcGVyc29uYWxpdHkgaXMgbm93IGF2YWlsYWJsZS4KICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24gZmlsZSBzdHJlYW1saW5lZCB0byBsb2FkIGZhc3RlciwgYW5hY2hyb25pc21zCiAgICAgICAgICAgIHJlbW92ZWQuCiAgICAgICAgICArIFVwZGF0ZWQgTkVXUywgSU5UUk8sIEhFTFAgdGV4dCwgU0hPVyBjb21tYW5kcy4gSW4gcGFydGljdWxhciwKICAgICAgICAgICAgc2VlIFNIT1cgQ09NTSwgSEVMUCBTRVQgTElORSwgSEVMUCBXQUlULgogICAgICAgICAgKyBEYXRlL3RpbWUgYXJpdGhtZXRpYyByb3V0aW5lcyBjb252ZXJ0ZWQgZnJvbSBmbG9hdGluZy1wb2ludAogICAgICAgICAgICB0byBpbnRlZ2VyIGFyaXRobWV0aWMgKGludGVybmFsbHkpIGZvciBncmVhdGVyIGFjY3VyYWN5IGFuZAogICAgICAgICAgICBwb3J0YWJpbGl0eS4KICAgICAgICAgICsgUXVvdGVkIHN0cmluZ3MgY29udGFpbmluZyBjb21tYXMgbm8gbG9uZ2VyIGJyZWFrIG1hY3JvCiAgICAgICAgICAgIGV4ZWN1dGlvbi4KICAgICAgICAgICsgRHluYW1pYyBLZXJtaXQgZmlsZS10cmFuc2ZlciB0aW1lb3V0cyBhcmUgbm93IG11Y2ggbW9yZQogICAgICAgICAgICBhZ2dyZXNzaXZlLgogICAgICAgICAgKyBOZXcgImhvdCBrZXlzIiB0byB0dXJuIGRlYnVnLmxvZyBvbi9vZmYgZHVyaW5nIGZpbGUgdHJhbnNmZXIuCiAgICAgICAgICArIEltcHJvdmVkIGhpbnRzIHdoZW4gZmlsZSB0cmFuc2ZlciBmYWlscy4KICAgICAgICAgICsgRlRQIENEIG9yaWVudGF0aW9uIG1lc3NhZ2VzIGFyZSBub3cgcHJpbnRlZC4KICAgICAgICAgICsgLVIgbm93IGFjY2VwdGVkIG9uIHRoZSBGVFAgY29tbWFuZCBsaW5lIHRvIHJlcXVlc3QgUmVjdXJzaW9uLgogICAgICAgICAgKyAtbSBhbGxvd3MgQWN0aXZlIG9yIFBhc3NpdmUgbW9kZSB0byBiZSBjaG9zZW4gb24gdGhlIEZUUAogICAgICAgICAgICBjb21tYW5kIGxpbmUuCiAgICAgICAgICArIC1kZCBvbiB0aGUgRlRQIGNvbW1hbmQgbGluZSBjcmVhdGVzIGEgdGltZXN0YW1wZWQgZGVidWcubG9nLgogICAgICAgICAgKyBGVFAgY29tbWFuZC1saW5lIHNlY3VyaXR5IG9wdGlvbnMgZmlsbGVkIGluLgogICAgICAgICAgKyBJbXByb3ZlZCBhdXRvbWF0aWMgdGV4dC9iaW5hcnkgbW9kZSBzd2l0Y2hpbmcgZm9yIE1HRVQuCiAgICAgICAgICArIFJlbW92ZWQgc3B1cmlvdXMgZXJyb3IgbWVzc2FnZXMgdGhhdCBzb21ldGltZXMgb2NjdXIgZHVyaW5nCiAgICAgICAgICAgIE1HRVQuCiAgICAgICAgICArIERJUkVDVE9SWSwgR1JFUCwgVFlQRSwgSEVBRCwgYW5kIFRBSUwgbm93IGhhdmUgYSAvT1VUUFVUOmZpbGUKICAgICAgICAgICAgb3B0aW9uLgogICAgICAgICAgKyBUWVBFIC9OVU1CRVIgYWRkcyBsaW5lIG51bWJlcnMuCiAgICAgICAgICArIENBVCA9IFRZUEUgL05PUEFHRTsgTU9SRSA9IFRZUEUgL1BBR0UuCiAgICAgICAgICArIEdFVE9LID8taGVscCBmaXhlZC4KICAgICAgICAgICsgXHYodGltZXN0YW1wKSAoPSAiXHYobmRhdGUpIFx2KHRpbWUpIikKICAgICAgICAgICsgXHYoaG91cikgKGhvdXIgb2YgdGhlIGRheSwgMC0yMykKICAgICAgICAgICsgXGZ1bml4MmRvc3BhdGgoKSBjb252ZXJ0cyBhIFVOSVggcGF0aCAoLykgdG8gYSBET1Mgb25lIChcKS4KICAgICAgICAgICsgXGZkb3MydW5peHBhdGgoKSBjb252ZXJ0cyBhIERPUyAoV2luZG93cywgT1MvMikgcGF0aCB0byBhCiAgICAgICAgICAgIFVOSVggb25lLgogICAgICAgICAgKyBcZmtleXdvcmR2YWwoKSBwYXJzZXMgbmFtZT12YWx1ZSBwYWlyLCBhbGxvd3MgbWFjcm8ga2V5d29yZAogICAgICAgICAgICBwYXJhbWV0ZXJzLgogICAgICAgICAgKyBXZSBub3cgbWFrZSBldmVyeSBhdHRlbXB0IHRvIG5vdCB3cml0ZSBwYXNzd29yZHMgdG8gdGhlCiAgICAgICAgICAgIGRlYnVnLmxvZy4KICAgICAgICAgICsgTmV3IENlcnRmaWNhdGUgQXV0aG9yaXR5IGNlcnRpZmljYXRlcyBmaWxlLCBpbmNsdWRlcyB0aGUKICAgICAgICAgICAgS2VybWl0IFByb2plY3QgYXQgQ29sdW1iaWEgVW5pdmVyc2l0eSBzbyB5b3UgY2FuIGFjY2VzcyBvdXIKICAgICAgICAgICAgSUtTRCBzZWN1cmVseS4KICAgICAgICAgICsgU2VjdXJlIHRhcmdldHMgaW1wcm92ZWQgYW5kIGJldHRlciBkb2N1bWVudGVkIGluIFVuaXgKICAgICAgICAgICAgbWFrZWZpbGUuCiAgICAgICAgICArIEFsbCBMaW51eCAobGliYyBhbmQgZ2xpYmMpIGJ1aWxkcyBjb25zb2xpZGF0ZWQgdW5kZXIgIm1ha2UKICAgICAgICAgICAgbGludXgiLgogICAgICAgICAgKyBIUC1VWCBtYWtlZmlsZSB0YXJnZXRzIG5vdyBoYXZlIGNvbnNpc3RlbnQgbmFtZXMuCiAgICAgICAgICArIE5ldyBhaXg1MCBhbmQgYWl4NTEgdGFyZ2V0cyBhZGRlZC4KCiAgIEMtS2VybWl0IDguMC4yMDAgRmluYWwgKDEyIERlYyAyMDAxKQoKICAgICAgICAgICsgUmVtb3RlL2xvY2FsLW1vZGUgY29uZnVzaW9uIG9uIHNvbWUgcGxhdGZvcm1zIGludHJvZHVjZWQgaW4KICAgICAgICAgICAgQmV0YS4wNCwgZml4ZWQuCiAgICAgICAgICArIE1hbnkgb2YgdGhlIG1ha2VmaWxlIHRhcmdldHMgYWRqdXN0ZWQsIG5ldyBvbmVzIGFkZGVkLgogICAgICAgICAgKyBOZXcgIm1ha2UgaW5zdGFsbCIgdGFyZ2V0IHNob3VsZCBwbGVhc2UgbW9zdCBwZW9wbGUuCiAgICAgICAgICArIE5ldyBjb21tYW5kOiBTSE9XIElLU0QuCiAgICAgICAgICArIEZUUCBvdmVyIFRMUy4KICAgICAgICAgICsgTGFzdC1taW51dGUgdG91Y2h1cHMgdG8gdGV4dCBtZXNzYWdlcywgSEVMUCB0ZXh0LCBldGMuCiAgICAgICAgICArIEVuYWJsZSBtb2RlbS1zaWduYWwgcmVhZGluZyBmb3IgU0NPIE9TUjUgYW5kIFVuaXh3YXJlIDcuCiAgICAgICAgICArIFNwZWNpYWwgc3VwZXJmYXN0IFRSQU5TTUlUIC9CSU5BUlkgL05PRUNITyAvTk9XQUlUIG1vZGUKICAgICAgICAgICAgYWRkZWQuCiAgICAgICAgICArIEZpeGVkIFBCWCBkaWFsaW5nIGluIHVubWFya2VkLWFyZWEtY29kZSBjYXNlLgogICAgICAgICAgKyBJbXByb3ZlZCBTSE9XIENPTU1VTklDQVRJT05TIHRlbGxzIGxvY2tmaWxlIGRpcmVjdG9yeSwKICAgICAgICAgICAgdHlwaWNhbCBkaWFsb3V0IGRldmljZSBuYW1lLgogICAgICAgICAgKyBTb21lIEZUUCBPUEVOIGNvbW1hbmQgcGFyc2luZyBwcm9ibGVtcyBmaXhlZC4KICAgICAgICAgICsgU29tZSBlcnJvcnMgaW4gZGF0ZSBhcml0aG1ldGljIGZpeGVkLgogICAgICAgICAgKyBOZXcgY29tbWFuZDogU0VUIFRFUk1JTkFMIEFVVE9ET1dOTE9BRCB7IC4uLiwgRVJST1IgeyBTVE9QLAogICAgICAgICAgICBDT05USU5VRSB9IH0KICAgICAgICAgICsgTmV3IGNvbW1hbmQ6IEhFTFAgRklSRVdBTEwuCiAgICAgICAgICArIFNFVCBNT0RFTSBIQU5HVVAtTUVUSE9EIERUUiBhZGRlZCBhcyBzeW5vbXltIGZvciBSUzIzMi1TSUdOQUwKICAgICAgICAgICsgU3VwcG9ydCBmb3Igc2VjdXJlIFVSTCBwcm90b2NvbHMgYWRkZWQ6IHRlbG5ldHM6LCBmdHBzOiwKICAgICAgICAgICAgaHR0cHM6LgoKICAgQy1LZXJtaXQgOC4wLjIwMSAoOCBGZWIgMjAwMikKCiAgICAgICAgICArIEluc3RhbGxhYmlsaXR5IGFzIGFuIFsxNDhdU1NIIHYyIFN1YnN5c3RlbS4KICAgICAgICAgICsgWzE0OV1TRVQgTE9DVVMgY29tbWFuZC4KICAgICAgICAgICsgWzE1MF1MLXZlcnNpb25zIG9mIENELCBESVIsIERFTEVURSwgTUtESVIsIGV0YywgdG8gZm9yY2UKICAgICAgICAgICAgbG9jYWwgZXhlY3V0aW9uLgogICAgICAgICAgKyBbMTUxXVVTRVIgYW5kIEFDQ09VTlQgYWRkZWQgYXMgc3lub255bXMgZm9yIEZUUCBVU0VSIGFuZCBGVFAKICAgICAgICAgICAgQUNDT1VOVC4KICAgICAgICAgICsgWzE1Ml1TSE9XIFZBUklBQkxFUyBub3cgYWNjZXB0cyBhIGxpc3Qgb2YgdmFyaWFibGVzLgogICAgICAgICAgKyBSdWRpbWVudGFyeSBzdXBwb3J0IGZvciBbMTUzXUNhbGxlciBJRCB3aGVuIHJlY2VpdmluZyBwaG9uZQogICAgICAgICAgICBjYWxscy4KICAgICAgICAgICsgVXAvRG93biBbMTU0XUFycm93LWtleSBuYXZpZ2F0aW9uIG9mIGNvbW1hbmQgaGlzdG9yeSBidWZmZXIuCiAgICAgICAgICArIFsxNTVdQXV0b21hdGljIGV4ZWN1dGlvbiBvZiBjdXN0b21pemF0aW9uIGZpbGUgaWYgaW5pdCBmaWxlCiAgICAgICAgICAgIGlzIG1pc3NpbmcuCgogICBDLUtlcm1pdCA4LjAuMjA2IEJldGEuMDEgKDExIE9jdCAyMDAyKQoKICAgICAgICBOZXcgY29tbWFuZHM6CgogICAgICAgICAgICAgICBvIE9SSUVOVEFUSU9OIGxpc3RzIGxvY2F0aW9uLXJlbGF0ZWQgdmFyaWFibGVzIGFuZCB0aGVpcgogICAgICAgICAgICAgICAgIHZhbHVlcy4KICAgICAgICAgICAgICAgbyBLQ0QgY2hhbmdlcyB0byBzcGVjaWFsIGRpcmVjdG9yaWVzIGJ5IHRoZWlyIHN5bWJvbGljCiAgICAgICAgICAgICAgICAgbmFtZXMgKCJrY2QgPyIgZm9yIGEgbGlzdCkuCiAgICAgICAgICAgICAgIG8gU0VUIENEIEhPTUUgcGF0aCB0byBzcGVjaWZ5IGhvbWUgZGlyZWN0b3J5IGZvciBDRCBhbmQKICAgICAgICAgICAgICAgICBLQ0QgY29tbWFuZHMuCiAgICAgICAgICAgICAgIG8gQ09OVElOVUUgZ2l2ZW4gYXQgdG9wIGxldmVsIGlzIGVxdWl2YWxlbnQgdG8gRU5EIC0tCiAgICAgICAgICAgICAgICAgaGFuZHkgd2hlbiBQUk9NUFQnZWQgb3V0IG9mIGEgc2NyaXB0LCB0byBjb250aW51ZSB0aGUKICAgICAgICAgICAgICAgICBzY3JpcHQuCgogICAgICAgIE5ldyBzd2l0Y2hlcyBvciBvcGVyYW5kcyBmb3IgZXhpc3RpbmcgY29tbWFuZHM6CgogICAgICAgICAgICAgICBvIEdFVE9LIC9USU1FT1VUCiAgICAgICAgICAgICAgIG8gQVNLLCBBU0tRLCBHRVRPSyAvUVVJRVQgKHN1cHByZXNzZXMgZXJyb3IgbWVzc2FnZSBvbgogICAgICAgICAgICAgICAgIHRpbWVvdXQpCiAgICAgICAgICAgICAgIG8gQ09QWSAvQVBQRU5EIG5vdyBhbGxvd3MgY29uY2F0ZW5hdGluZyBtdWx0aXBsZSBzb3VyY2UKICAgICAgICAgICAgICAgICBmaWxlcyBpbnRvIG9uZSBkZXN0IGZpbGUuCiAgICAgICAgICAgICAgIG8gU0VUIFRDUCB7IEhUVFAtUFJPWFksIFNPQ0tTLVNFUlZFUiB9IC9VU0VSLCAvUEFTU1dPUkQuCiAgICAgICAgICAgICAgIG8gRElSRUNUT1JZIGNvbW1hbmQgbm93IGFjY2VwdHMgbXVsdGlwbGUgZmlsZXNwZWNzLCBlLmcuCiAgICAgICAgICAgICAgICAgImRpciBhIGIgYyIuCgogICAgICAgIFNFVCBRVUlFVCBPTiBub3cgYWxzbyBhcHBsaWVzIHRvOgoKICAgICAgICAgICAgICAgbyBTRVQgSE9TVCBjb25uZWN0aW9uIHByb2dyZXNzIG1lc3NhZ2VzLgogICAgICAgICAgICAgICBvICJQcmVzcyB0aGUgWCBvciBFIGtleSB0byBjYW5jZWwiIGZpbGUtdHJhbnNmZXIgbWVzc2FnZS4KICAgICAgICAgICAgICAgbyBSRU1PVEUgQ0QgcmVzcG9uc2UuCiAgICAgICAgICAgICAgIG8gUkVNT1RFIExPR0lOIHJlc3BvbnNlLgoKICAgICAgICBJbXByb3ZlbWVudHMgYW5kIG5ldyBmZWF0dXJlczoKCiAgICAgICAgICAgICAgIG8gTnVtZXJvdXMgRlRQIGNsaWVudCBmaXhlcyBhbmQgbmV3IGZlYXR1cmVzLCBsaXN0ZWQKICAgICAgICAgICAgICAgICBiZWxvdy4KICAgICAgICAgICAgICAgbyBDLUtlcm1pdCwgd2hlbiBpbiByZW1vdGUgbW9kZSBhdCB0aGUgZW5kIG9mIGEgZmlsZQogICAgICAgICAgICAgICAgIHRyYW5zZmVyLCBub3cgcHJpbnRzIGEgb25lLWxpbmUgIndoZXJlIiBtZXNzYWdlLiBDb250cm9sCiAgICAgICAgICAgICAgICAgd2l0aCBTRVQgVFJBTlNGRVIgUkVQT1JULgogICAgICAgICAgICAgICBvIFVuaXggbWFrZWZpbGUgImluc3RhbGwiIHRhcmdldCBub3cgY3JlYXRlcyBhbiBVTklOU1RBTEwKICAgICAgICAgICAgICAgICBzY3JpcHQuCiAgICAgICAgICAgICAgIG8gSW1wcm92ZWQgb3BlcmF0aW9uIGFuZCBwZXJmb3JtYW5jZSBvbiBSRkMgMjIxNyBUZWxuZXQKICAgICAgICAgICAgICAgICBjb25uZWN0aW9ucy4KICAgICAgICAgICAgICAgbyBJbXByb3ZlZCBDT05ORUNUIChpbnRlcmFjdGl2ZSB0ZXJtaW5hbCBjb25uZWN0aW9uKQogICAgICAgICAgICAgICAgIHBlcmZvcm1hbmNlLgogICAgICAgICAgICAgICBvIEhFTFAgdGV4dCB1cGRhdGVkIGZvciBtYW55IGNvbW1hbmRzLgoKICAgICAgICBOZXcgb3IgZml4ZWQgbWFrZWZpbGUgdGFyZ2V0czoKCiAgICAgICAgICAgICAgIG8gU29sYXJpcyA5IChzZXZlcmFsIHZhcmlhdGlvbnMpCiAgICAgICAgICAgICAgIG8gQ29uY3VycmVudCBQb3dlck1BWAogICAgICAgICAgICAgICBvIE1hYyBPUyBYIDEwLjIKICAgICAgICAgICAgICAgbyBGcmVlQlNEIDEuMAogICAgICAgICAgICAgICBvIEZyZWVCU0QgNC42LCA1LjAKICAgICAgICAgICAgICAgbyBBSVggNS4yLCA1LjMKCiAgICAgICAgQnVncyBmaXhlZCAoZ2VuZXJhbCk6CgogICAgICAgICAgICAgICBvIEZhaWx1cmUgdG8gcnVuIGluIFZNUyBCYXRjaCBmaXhlZC4KICAgICAgICAgICAgICAgbyBMRElSRUNUT1JZIGZpeGVkIHRvIHJ1biBLZXJtaXQncyBidWlsdC1pbiBESVJFQ1RPUlkKICAgICAgICAgICAgICAgICBjb21tYW5kIHJhdGhlciB0aGFuIGFuIGV4dGVybmFsIG9uZS4KICAgICAgICAgICAgICAgbyBGaXhlZCBTb2xhcmlzIGFuZCBvdGhlciBTVk9SUE9TSVggYnVpbGRzIHRvIGZpbmQgb3V0CiAgICAgICAgICAgICAgICAgdGhlaXIgZnVsbCBob3N0bmFtZXMgcmF0aGVyIHRoYW4ganVzdCB0aGUgInVuYW1lIC1uIgogICAgICAgICAgICAgICAgIG5hbWUuCiAgICAgICAgICAgICAgIG8gRml4ZWQgc29tZSBwcm9ibGVtcyBtYXRjaGluZyBzdHJpbmdzIHRoYXQgc3RhcnQgd2l0aAogICAgICAgICAgICAgICAgICIuIi4KICAgICAgICAgICAgICAgbyBGaXhlZCBzb21lIHByb2JsZW1zIG1hdGNoaW5nIHBhdHRlcm4gdGhhdCBjb250YWluCiAgICAgICAgICAgICAgICAge2EsYixjfSBsaXN0cy4KICAgICAgICAgICAgICAgbyBGaXhlZCBlcnJvbmVvdXMgcmVwb3J0aW5nIG9mIHRleHQtbW9kZSByZWNlcHRpb24gYXMKICAgICAgICAgICAgICAgICBiaW5hcnkgd2hlbiBzZW5kZXIgZGlkIG5vdCByZXBvcnQgdGhlIGZpbGUgc2l6ZQogICAgICAgICAgICAgICAgIChjb3NtZXRpYyBvbmx5KS4KICAgICAgICAgICAgICAgbyBNYW55IHByb2JsZW1zIHdpdGggU1dJVENIIHN0YXRlbWVudHMgZml4ZWQuCiAgICAgICAgICAgICAgIG8gRml4ZWQgU0VUIE9QVElPTlMgRElSRUNUT1JZIC9ET1RGSUxFUyB0byB3b3JrIGZvciBzZXJ2ZXIKICAgICAgICAgICAgICAgICB0b28uCiAgICAgICAgICAgICAgIG8gRml4ZWQgREVMRVRFIHRvIHByaW50IGFuIGVycm9yIG1lc3NhZ2UgaWYgdGhlIGZpbGUgd2FzCiAgICAgICAgICAgICAgICAgbm90IGZvdW5kLgogICAgICAgICAgICAgICBvIEZpeGVkIFNFVCBDT05UUk9MIFVOUFJFRklYIEFMTCBhbmQgU0VUIFBSRUZJWElORyBOT05FIHRvCiAgICAgICAgICAgICAgICAgZG8gdGhlIHNhbWUgdGhpbmcuCiAgICAgICAgICAgICAgIG8gRml4ZWQgYnVncyBleGVjdXRpbmcgbWFjcm9zIGZyb20gd2l0aGluIHRoZSBPTl9FWElUCiAgICAgICAgICAgICAgICAgbWFjcm8uCiAgICAgICAgICAgICAgIG8gXGZkYXkoKSBhbmQgXGZuZGF5KCkgZml4ZWQgZm9yIGRhdGVzIHByaW9yIHRvIDE3IE5vdgogICAgICAgICAgICAgICAgIDE4NTguCiAgICAgICAgICAgICAgIG8gU2VyaWFsIHNwZWVkLWNoYW5naW5nIGJ1ZyBpbiBMaW51eCBmaXhlZC4KICAgICAgICAgICAgICAgbyAiVW5iYWxhbmNlZCBicmFjZXMiIHNjcmlwdCBwYXJzaW5nIGVycm9ycyB3aGVuIHVzaW5nCiAgICAgICAgICAgICAgICAgXHtudW1iZXJ9IGZpeGVkLgogICAgICAgICAgICAgICBvICJpZiBkZWZpbmVkIFx2KG5hbWUpIiBmaXhlZCB0byBiZWhhdmUgYXMgZGVzY3JpYmVkIGluCiAgICAgICAgICAgICAgICAgdGhlIGJvb2suCiAgICAgICAgICAgICAgIG8gRml4ZWQgUHJvYmxlbXMgY2F1c2VkIGJ5IExPQ0FMIHZhcmlhYmxlcyB3aG9zZSBuYW1lcyBhcmUKICAgICAgICAgICAgICAgICBsZWZ0IHN1YnN0cmluZ3Mgb2YgbWFjcm8gbmFtZXMuCiAgICAgICAgICAgICAgIG8gVGhlIElOUFVUIGNvbW1hbmQgd2FzIGZpeGVkIHRvIGhvbm9yIHRoZSBQQVJJVFkgc2V0dGluZy4KICAgICAgICAgICAgICAgbyBGaXhlZCBidWcgd2l0aCBDT1BZIHRvIGV4aXN0aW5nIGZpbGUgdGhhdCBpcyBsb25nZXIgdGhhbgogICAgICAgICAgICAgICAgIHNvdXJjZSBmaWxlLgogICAgICAgICAgICAgICBvIFJFSU5QVVQgY29tbWFuZCBmYWlsZWQgdG8gc3RyaXAgYnJhY2VzL3F1b3RlcyBhcm91bmQgaXRzCiAgICAgICAgICAgICAgICAgdGFyZ2V0IHN0cmluZy4KICAgICAgICAgICAgICAgbyBOZXR3b3JrIGRpcmVjdG9yeSBsb29rdXBzIGRpZG4ndCB3b3JrIGZvciBTU0gKICAgICAgICAgICAgICAgICBjb25uZWN0aW9ucy4KICAgICAgICAgICAgICAgbyBSRU1PVEUgU0VUIHsgRklMRSwgVFJBTlNGRVIgfSBDSEFSQUNURVItU0VUIGZpeGVkLgogICAgICAgICAgICAgICBvIENsb3NlZCBzb21lIGhvbGVzIHdoZXJlYnkgYW4gaW5jb21wbGV0ZWx5IHJlY2VpdmVkIGZpbGUKICAgICAgICAgICAgICAgICB3YXMgbm90IGRlbGV0ZWQgd2hlbiBTRVQgRklMRSBJTkNPTVBMRVRFIGlzIERJU0NBUkQsCiAgICAgICAgICAgICAgICAgZS5nLiB3aGVuIHRoZSBLZXJtaXQgaXMgaHVuZyB1cCB1cG9uLgogICAgICAgICAgICAgICBvIFNFVCBYRkVSIENIQVJBQ1RFUi1TRVQgVFJBTlNQQVJFTlQgZml4ZWQgdG8gZG8gdGhlIHNhbWUKICAgICAgICAgICAgICAgICBhcyBTRVQgWEZFUiBUUkFOU0xBVElPTiBPRkYuCiAgICAgICAgICAgICAgIG8gU0VUIEhPU1QgUFRZIChlLmcuIFNTSCkgY29ubmVjdGlvbiBmaXhlZCB0byBwYXNzIGFsb25nCiAgICAgICAgICAgICAgICAgd2luZG93LXNpemUgY2hhbmdlcy4KICAgICAgICAgICAgICAgbyBDLUtlcm1pdCBzZWFyY2ggcGF0aCBmb3IgVEFLRSBmaWxlcyB3YXMgYWNjaWRlbnRhbGx5CiAgICAgICAgICAgICAgICAgZGlzYWJsZWQuCgogICAgICAgIEZUUCBjbGllbnQgYnVncyBmaXhlZDoKCiAgICAgICAgICAgICAgIG8gQ2hhcmFjdGVyIHNldCB0cmFuc2xhdGlvbiB3YXMgYnJva2VuIG9uIGxpdHRsZS1lbmRpYW4KICAgICAgICAgICAgICAgICAoZS5nLiBQQykgYXJjaGl0ZWN0dXJlcy4KICAgICAgICAgICAgICAgbyBGVFAgUFVUIC9TRVJWRVItUkVOQU1FOiwgL1JFTkFNRS1UTzosIC9NT1ZFLVRPOiBzd2l0Y2hlcwogICAgICAgICAgICAgICAgIHdlcmUgc3RpY2t5LgogICAgICAgICAgICAgICBvIE1ha2UgU0VUIFRSQU5TRkVSIE1PREUgTUFOVUFMIGFwcGx5IHRvIEZUUC4KICAgICAgICAgICAgICAgbyBNYWtlIFNFVCBGSUxFIElOQ09NUExFVEUgeyBLRUVQLCBESVNDQVJEIH0gYXBwbHkgdG8gRlRQLgogICAgICAgICAgICAgICBvIEZUUCBNR0VUIC9VUERBVEUgaGFuZGxlZCBlcXVhbCB0aW1lcyBpbmNvcnJlY3RseS4KICAgICAgICAgICAgICAgbyBGVFAgTUdFVCAvUkVDT1ZFUiBmaXhlZCB0byBpZ25vcmUgZmlsZSBkYXRlcywgdXNlIG9ubHkKICAgICAgICAgICAgICAgICBzaXplLgogICAgICAgICAgICAgICBvIEZUUCBNR0VUIC9SRUNPVkVSIHNvbWV0aW1lcyBkb3dubG9hZGVkIGZpbGVzIGl0IGRpZG4ndAogICAgICAgICAgICAgICAgIG5lZWQgdG8uCiAgICAgICAgICAgICAgIG8gRlRQIGRvd25sb2FkcyB3aXRoIFRSQU5TRkVSIERJU1BMQVkgQlJJRUYgY291bGQgZ2l2ZQogICAgICAgICAgICAgICAgIG1pc2xlYWRpbmcgZXJyb3IgbWVzc2FnZXMuCiAgICAgICAgICAgICAgIG8gRlRQIE1HRVQgdGVtcCBmaWxlIG5vdCBkZWxldGVkIGlmIEZUUCBERUJVRyBzZXQgdG8gT0ZGCiAgICAgICAgICAgICAgICAgYWZ0ZXIgaXQgd2FzIE9OLgogICAgICAgICAgICAgICBvIExPQ1VTIG5vdCBzd2l0Y2hlZCBiYWNrIHdoZW4gRlRQIGNvbm5lY3Rpb24gaXMgbG9zdC4KICAgICAgICAgICAgICAgbyBTZXQgaW5jb21pbmcgZmlsZSBkYXRlIGV2ZW4gaWYgaXQgd2FzIG5vdCBjb21wbGV0ZWx5CiAgICAgICAgICAgICAgICAgcmVjZWl2ZWQuCiAgICAgICAgICAgICAgIG8gRlRQIE1HRVQgc2VudCBTSVpFIGFuZCBNRFRNIGNvbW1hbmRzIGV2ZW4gd2hlbiBpdCBkaWRuJ3QKICAgICAgICAgICAgICAgICBoYXZlIHRvLgogICAgICAgICAgICAgICBvIEZUUCBNR0VUIHNlbnQgU0laRSBhbmQgTURUTSBjb21tYW5kcyBldmVuIHdoZW4gaXQga25ldwogICAgICAgICAgICAgICAgIHRoZXkgd291bGRuJ3Qgd29yay4KICAgICAgICAgICAgICAgbyBGVFAgTUdFVCBmYWlsZWQgaWYgbm8gZmlsZXMgd2VyZSBzZWxlY3RlZCBmb3IgZG93bmxvYWQuCiAgICAgICAgICAgICAgIG8gRlRQIE1HRVQgYSogYiogYyogd291bGQgZmFpbCB0byBnZXQgYW55IGMqJ3MgaWYgbm8gYioncwogICAgICAgICAgICAgICAgIGV4aXN0ZWQuCiAgICAgICAgICAgICAgIG8gQmlnIHByb2JsZW1zIGNhbmNlbGluZyBNR0VUIHdpdGggQ3RybC1DLgogICAgICAgICAgICAgICBvIFNvbWUgZXh0cmFuZW91cyBMT0NVUyBkaWFsb2dzIHNxdWVsY2hlZC4KICAgICAgICAgICAgICAgbyBTb21lIGluY29uc2lzdGVuY2llcyBpbiBTRVQgRlRQIEZJTEVOQU1FUyBBVVRPIGZpeGVkLgogICAgICAgICAgICAgICBvIEZpeGVkIGZpbGUtZGVzY3JpcHRvciBwaWxldXAgYWZ0ZXIgbXVsdGlwbGUgTUdFVHMgd2hlbgogICAgICAgICAgICAgICAgIHVzaW5nIG1rc3RlbXAoKS4KICAgICAgICAgICAgICAgbyBGaXhlZCAibWdldCBmb28iLCB3aGVyZSBmb28gaXMgYSBkaXJlY3RvcnkgbmFtZS4KCiAgICAgICAgRlRQIGltcHJvdmVtZW50czoKCiAgICAgICAgICAgICAgIG8gTmV3IFsxNTZdRlRQIHByb3RvY29sIGZlYXR1cmVzIGFkZGVkIChGRUFULCBNTFNEKS4KICAgICAgICAgICAgICAgbyBGVFAgTUdFVCAvUkVDVVJTSVZFIG5vdyB3b3JrcyBhcyBleHBlY3RlZCBpZiBzZXJ2ZXIKICAgICAgICAgICAgICAgICBzdXBwb3J0cyBNTFNELgogICAgICAgICAgICAgICBvIEZUUCBNR0VUIC9EQVRFUy1ESUZGRVIgdG8gZG93bmxvYWQgaWYgbG9jYWwgYW5kIHJlbW90ZQogICAgICAgICAgICAgICAgIGZpbGUgZGF0ZXMgZGlmZmVyLgogICAgICAgICAgICAgICBvIEZUUCBEQVRFUyBkZWZhdWx0IGNoYW5nZWQgdG8gT04uCiAgICAgICAgICAgICAgIG8gRlRQIE1QVVQsIE1HRVQgL0VYQ0VQVCBub3cgYWxsb3dzIHVwIHRvIDY0IHBhdHRlcm5zICh1cAogICAgICAgICAgICAgICAgIGZyb20gOCkuCiAgICAgICAgICAgICAgIG8gVG9wLWxldmVsIFNJVEUgYW5kIFBBU1NJVkUgY29tbWFuZHMgYWRkZWQgZm9yCiAgICAgICAgICAgICAgICAgY29udmVuaWVuY2UuCiAgICAgICAgICAgICAgIG8gTUdFVCAvQ09MTElTSU9OOkFQUEVORCAvQVMtTkFNRTpuZXdmaWxlICouKiBwdXRzIGFsbAogICAgICAgICAgICAgICAgIHJlbW90ZSBmaWxlcyBpbnRvIG9uZSBsb2NhbCBmaWxlLgogICAgICAgICAgICAgICBvIFNFVCBGVFAgU0VSVkVSLVRJTUUtT0ZGU0VUIGZvciB3aGVuIHNlcnZlciBoYXMgd3JvbmcKICAgICAgICAgICAgICAgICB0aW1lem9uZSBzZXQuCiAgICAgICAgICAgICAgIG8gQWxsb3cgZm9yIGFsdGVybmF0aXZlIHNlcnZlciBpbnRlcnByZXRhdGlvbnMgb2YgW01dTVBVVAogICAgICAgICAgICAgICAgIC9VTklRVUUuCiAgICAgICAgICAgICAgIG8gU0VUIEZUUCBBTk9OT01PVVMtUEFTU1dPUkQgbGV0cyB5b3Ugc3BlY2lmeSB0aGUgZGVmYXVsdAogICAgICAgICAgICAgICAgIGFub255bW91cyBwYXNzd29yZC4KICAgICAgICAgICAgICAgbyBBbGxvdyAiR0VUIC9SRUNVUlNJVkUgcGF0aC9maWxlIiB0byBmb3JjZSBsb2NhbAogICAgICAgICAgICAgICAgIHN1YmRpcmVjdG9yeSBjcmVhdGlvbi4KICAgICAgICAgICAgICAgbyBTRVQgRlRQIERJU1BMQVkgaXMgbGlrZSBTRVQgVFJBTlNGRVIgRElTUExBWSBidXQgYXBwbGllcwogICAgICAgICAgICAgICAgIG9ubHkgdG8gRlRQLgogICAgICAgICAgICAgICBvIEZUUCB7IEVOQUJMRSwgRElTQUJMRSB9IG5ldy1wcm90b2NvbC1mZWF0dXJlLW5hbWUuCiAgICAgICAgICAgICAgIG8gRlRQIE1HRVQgL05PRE9URklMRVMuCiAgICAgICAgICAgICAgIG8gRGVidWcgbG9nIG5vdyByZWNvcmRzIEZUUCBjb21tYW5kcyBhbmQgcmVzcG9uc2VzIGluCiAgICAgICAgICAgICAgICAgZ3JlcC1hYmxlIGZvcm1hdC4KCiAgIFsgWzE1N11Ub3AgXSBbIFsxNThdQ29udGVudHMgXSBbIFsxNTldQy1LZXJtaXQgXSBbIFsxNjBdS2VybWl0IEhvbWUgXQogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgoxLiBGSVhFUyBTSU5DRSBWRVJTSU9OIDcuMC4xOTYgRmlyc3QsIHRoZSBjaGFuZ2VzIGZyb20gNy4wLjE5NiB0byA3LjAuMTk3Li4uClNvdXJjZSBhbmQgbWFrZWZpbGUgdHdlYWtzIHRvIGdldCBzdWNjZXNzZnVsIGJ1aWxkcyBvbiBwbGF0Zm9ybXMgdGhhdCB3ZXJlIG5vdAphdmFpbGFibGUgaW4gdGltZSBmb3IgdGhlIDcuMCByZWxlYXNlOgoKICAgICAqIDQuMkJTRAogICAgICogNC4zQlNECiAgICAgKiBBSVggNC4zCiAgICAgKiBBVCZUIDNCMiBhbmQgM0IyMAogICAgICogQmVPUyA0LjUKICAgICAqIENMSVgKICAgICAqIEludGVyYWN0aXZlIFVOSVggU3lzdGVtIFYvMzg2IFIzLjIgVjQuMS4xCiAgICAgKiBPUy05LzY4MDAwCiAgICAgKiBPU0YvMSAxLjMuCiAgICAgKiBQUy8yIEFJWCAxLjIuMQogICAgICogU0NPIE9TUjUuMC54CiAgICAgKiBTQ08gWGVuaXggMi4zLjQKICAgICAqIFNJTklYIDUuNDEvSW50ZWwKICAgICAqIFN0cmF0dXMgRlRYCiAgICAgKiBTdHJhdHVzIFZPUwogICAgICogU3VuT1MgNC4xIHdpdGggWC4yNQogICAgICogVWx0cml4IDQuMgogICAgICogVW5peHdhcmUgMi4wCgogICBUaGVyZSB3ZXJlIG5vIGZ1bmN0aW9uYWwgY2hhbmdlcyBmcm9tIDE5NiB0byAxOTcuCgogICBGaXhlcyBhcHBsaWVkIGFmdGVyIEMtS2VybWl0IDcuMC4xOTcgd2FzIHJlbGVhc2VkOgoKICAgU291cmNlIGNvZGU6IEJpZyBmbGV4ZWxpbnQgYW5kICJnY2MgLVdhbGwiIGF1ZGl0IGFuZCBjbGVhbnVwLgoKICAgQ29uZmlndXJhdGlvbjoKICAgICAqIFNvbGFyaXMgUlRTL0NUUyAoaGFyZHdhcmUgZmxvdyBjb250cm9sKSBkaWRuJ3Qgd29yay4KICAgICAqIEJTREkgUlRTL0NUUyB3b3JrZWQgb25seSBpbiBvbmUgZGlyZWN0aW9uLgogICAgICogRnJlZUJTRCA0LjAgd2l0aCBuY3Vyc2VzIDUuMCBicm9rZSBpbnRlcmFjdGl2ZSBjb21tYW5kIHBhcnNpbmcuCiAgICAgKiBRTlgtMzIgYnVpbGQgbGFja2VkIC1EQklHQlVGT0sgc28gY291bGRuJ3QgZXhlY3V0ZSBiaWcgbWFjcm9zLgoKICAgQ29ubmVjdGlvbnM6CiAgICAgKiBTRVQgSE9TVCAvUFRZIGRpZG4ndCB3b3JrIG9uIHNvbWUgcGxhdGZvcm1zLgogICAgICogQnJva2VuIFNFVCBIT1NUIC9VU0VSOnh4eCAvUEFTU1dPUkQ6eXl5IC9BQ0NPVU5UOnp6eiBzd2l0Y2hlcwogICAgICAgZml4ZWQuCiAgICAgKiBUcmFuc3BhcmVudCBwcmludGluZyB3YXMgYnJva2VuIGluIFVuaXguCiAgICAgKiBBTlNXRVIgMCAod2FpdCBmb3JldmVyKSBkaWRuJ3Qgd29yay4KICAgICAqIFNvbWUgcHJvYmxlbXMgaW4gTXVsdGl0ZWNoIG1vZGVtIGNvbW1hbmQgc3RyaW5ncy4KICAgICAqIFNwdXJpb3VzICI/U29ycnksIGNhbid0IGNvbmRpdGlvbiBjb25zb2xlIHRlcm1pbmFsIiBlcnJvcnMuCiAgICAgKiBEaXNhYmxpbmcgbW9kZW0gY29tbWFuZCBzdHJpbmdzIGJ5IHNldHRpbmcgdGhlbSB0byBub3RoaW5nIGJyb2tlCiAgICAgICBkaWFsaW5nLgogICAgICogU0VUIERJQUwgVElNRU9VVCB2YWx1ZSB3YXMgdXN1YWxseSBpZ25vcmVkLgogICAgICogU0VUIERJQUwgTUVUSE9EIFBVTFNFIGRpZG4ndCB3b3JrLgogICAgICogQ2VydGFpbiBtb2RlbSBjb21tYW5kcywgaWYgY2hhbmdlZCwgbm90IHJlZnJlc2hlZCBpZiBtb2RlbSB0eXBlCiAgICAgICBjaGFuZ2VkLgogICAgICogU0VUIFNFU1NJT04tTE9HIGNvbW1hbmQgd2FzIG1pc3NpbmcgZnJvbSBWTVMuCiAgICAgKiBWTVMgc2Vzc2lvbiBsb2cgZm9ybWF0IGZpeGVkIGZvciBzY3JpcHRzLgogICAgICogSEFOR1VQIGJ5IGRyb3BwaW5nIERUUiBkaWRuJ3Qgd29yayBpbiBOZXRCU0QuCiAgICAgKiBTRVQgRkxPVyAvQVVUTyB2ZXJzdXMgU0VUIEZMT1cgY29uZnVzaW9uIGZpeGVkLgogICAgICogU3B1cmlvdXMgc2Vjb25kYXJ5IFNvbGFyaXMgbG9ja2ZpbGUgcmVtb3ZlZC4KICAgICAqIFNDTyBPU1I1IERUUiBPbi9PZmYgaGFuZ3VwLgogICAgICogVVVDUCBsb2NrZmlsZSByYWNlIGNvbmRpdGlvbi4KCiAgIENvbW1hbmRzIGFuZCBzY3JpcHRzOgogICAgICogTWlzc2luZyBDQVVUSU9VUyBhbmQgRkFTVCBjb21tYW5kcyByZXN0b3JlZC4KICAgICAqIEJyb2tlbiBQVFkgY29tbWFuZCBpbiBsYXRlLW1vZGVsIExpbnV4ZXMgZml4ZWQgKEFQSSBjaGFuZ2VkKS4KICAgICAqIEZpeGVkIG9mZi1ieS1vbmUgZXJyb3IgaW4gY29tbWFuZCByZWNhbGwgd2hlbiBzd2l0Y2hpbmcgZGlyZWN0aW9uLgogICAgICogRml4ZWQgcmVjYWxsIG9mIGNvbW1hbmRzIHRoYXQgY29udGFpbiAnPycuCiAgICAgKiBDT1BZIC9TV0FQLUJZVEVTIGRpZG4ndCB3b3JrIG9uIHNvbWUgYXJjaGl0ZWN0dXJlcy4KICAgICAqIFZhcmlvdXMgY29tYmluYXRpb25zIG9mIENPUFkgc3dpdGNoZXMgZGlkbid0IHdvcmsuCiAgICAgKiBWYXJpb3VzIHByb2JsZW1zIHdpdGggQ09QWSBvciBSRU5BTUUgd2l0aCBhIGRpcmVjdG9yeSBuYW1lIGFzCiAgICAgICB0YXJnZXQuCiAgICAgKiBTSElGVCBkaWRuJ3QgZGVjcmVtZW50IFx2KGFyZ2MpIGlmIHVzZWQgd2l0aGluIElGLCBFTFNFLCBvciBTV0lUQ0gKICAgICAgIGJsb2NrLgogICAgICogU0hJRlQgZGlkbid0IGFmZmVjdCB0aGUgXCUqIHZhcmlhYmxlLgogICAgICogRGl2aWRlIGJ5IHplcm8gaW1wcm9wZXJseSBoYW5kbGVkIGluIHNvbWUgXGZ1bmN0aW9uKClzLgogICAgICogUHJvYmxlbXMgd2l0aCBSRVRVUk4gZnJvbSByaWdodC1yZWN1cnNpdmUgZnVuY3Rpb25zLgogICAgICogRlNFRUsgL0xJTkUgXCVjIExBU1QgZGlkbid0IHdvcmsgaWYgYWxyZWFkeSBhdCBlbmQuCiAgICAgKiBTb21lIGJ1ZmZlciB2dWxuZXJhYmlsaXRpZXMgYW5kIHBvdGVudGlhbCBtZW1vcnkgbGVha3Mgd2VyZQogICAgICAgZGlzY292ZXJlZCBhbmQgZml4ZWQuCiAgICAgKiBcZnJkaXJlY3RvcnkoKSBmaXhlZCBub3QgdG8gZm9sbG93IHN5bWJvbGljIGxpbmtzLgogICAgICogU0VUIEVYSVQgV0FSTklORyBPRkYgZml4ZWQgdG8gd29yayB3aGVuIEVYSVQgZ2l2ZW4gaW4gYSBzY3JpcHQuCiAgICAgKiBNaXNzaW5nIERFTEVURSBhbmQgTUtESVIgZXJyb3IgbWVzc2FnZSBmaXhlZC4KICAgICAqIFxmZGF5KCkgY29yZSBkdW1wIGZvciBhbmNpZW50IGRhdGVzIGZpeGVkLgoKICAgRmlsZSB0cmFuc2ZlcjoKICAgICAqIFNFTkQgL0NPTU1BTkQgd2FzIGJyb2tlbi4KICAgICAqIENSRUNFSVZFIHdhcyBicm9rZW4gKGJ1dCBSRUNFSVZFIC9DT01NQU5EIHdhcyBPSykuCiAgICAgKiBRdW90aW5nIHdpbGRjYXJkIGNoYXJzIGluIGZpbGVuYW1lcyBkaWRuJ3Qgd29yay4KICAgICAqIFByb2JsZW1zIGNhbmNlbGluZyBzdHJlYW1pbmcgZmlsZSB0cmFuc2ZlcnMgd2l0aCBYIG9yIFouCiAgICAgKiBQcm9ibGVtcyBzaGlmdGluZyBiZXR3ZWVuIHN0cmVhbWluZyBhbmQgd2luZG93aW5nIGZpbGUgdHJhbnNmZXIuCiAgICAgKiBOb24tRlVMTCBmaWxlLXRyYW5zZmVyIGRpc3BsYXlzIGVycm9uZW91c2x5IHNhaWQgU1RSRUFNSU5HIHdoZW4KICAgICAgIG5vdC4KICAgICAqIEFuIGFjdGl2ZSBTRU5ELUxJU1QgcHJldmVudGVkIEdFVCBmcm9tIHdvcmtpbmcuCiAgICAgKiBTRVQgU0VSVkVSIEdFVC1QQVRIIGludGVycHJldGF0aW9uIG9mIHJlbGF0aXZlIG5hbWVzIGxpa2UgIi4iIHdhcwogICAgICAgd3JvbmcuCiAgICAgKiBUaGUgTUFJTCBjb21tYW5kIHdhcyBicm9rZW4uCiAgICAgKiAia2VybWl0IC1zICoiIG1pZ2h0IGhhdmUgc2tpcHBlZCBzb21lIGZpbGVzLgogICAgICogVHJhbnNhY3Rpb24gbG9nIGVudHJpZXMgd2VyZSBub3QgbWFkZSBmb3IgZXh0ZXJuYWwgcHJvdG9jb2wKICAgICAgIHRyYW5zZmVycy4KICAgICAqIEZpbGUgY291bnQgcmVwb3J0IGZpeGVkIHRvIHNob3cgbnVtYmVyIG9mIGZpbGVzIGFjdHVhbGx5CiAgICAgICB0cmFuc2ZlcnJlZC4KICAgICAqIEZpeGVkIGZpbGVuYW1lIGNvbnZlcnNpb24gdG8gY29udmVydCBzcGFjZXMgdG8gdW5kZXJzY29yZXMuCiAgICAgKiBNYWRlIFNFVCBQUkVGSVhJTkcgLyBTRVQgQ09OVFJPTCBQUkVGSVggYWxzbyBhZGp1c3QgQ0xFQVJDSEFOTkVMLgogICAgICogTW9yZSAiUmVjZWl2ZSB3aW5kb3cgZnVsbCIgZXJyb3JzIGZpeGVkLgogICAgICogQnJva2VuIHRlcm1pbmFsIGJ1ZmZlcmluZyBhZnRlciBjdXJzZXMgZGlzcGxheSBpbiBTb2xhcmlzIGZpeGVkLgogICAgICogU0VUIEZJTEUgSU5DT01QTEVURSBESVNDQVJEIGRpZCBub3Qgd29yayBpbiBhbGwgY2FzZXMuCiAgICAgKiBQYWNrZXQgbG9nIGNoYW5nZWQgdG8gcmVmb3JtYXQgdGhlIHN0YXJ0LW9mLXBhY2tldCBjaGFyYWN0ZXIKICAgICAgIHByaW50YWJseS4KICAgICAqIER5bmFtaWMgdGltZW91dHMgY291bGQgZ3JvdyByaWRpY3Vsb3VzbHkgbGFyZ2UuCgogICBDaGFyYWN0ZXIgc2V0czoKICAgICAqIEhlYnJldy03IHRyYW5zbGF0aW9ucyBtaXNzZWQgdGhlIGxldHRlciBUYXYuCiAgICAgKiBDMSBhcmVhIG9mIENQMTI1MiB3YXMgaWdub3JlZC4KICAgICAqIFNFVCBUUkFOU0ZFUiBDSEFSQUNURVItU0VUIFRSQU5TUEFSRU5UIGNvdWxkIGdpdmUgZ2FyYmFnZQogICAgICAgdHJhbnNsYXRpb25zLgogICAgICogVFJBTlNMQVRFIG1pZ2h0IG5vdCB3b3JrIG9uIExpdHRsZSBFbmRpYW4gYXJjaGl0ZWN0dXJlcy4KICAgICAqIEluc3VmZmljaWVudCByYW5nZSBjaGVja2luZyBpbiBjZXJ0YWluIFRSQU5TTEFURSBvcGVyYXRpb25zLgoKICAgVGhlIGZvbGxvd2luZyBidWdzIGluIEMtS2VybWl0IDguMC4yMDAgd2VyZSBmaXhlZCBpbiA4LjAuMjAxOgoKICAgICAqIEFuIG9ic2N1cmUgcGF0aCB0aHJvdWdoIHRoZSBjb2RlIGNvdWxkIGNhdXNlIHRoZSBVbml4IHZlcnNpb24gb2YKICAgICAgIEMtS2VybWl0IHRvIGR1bXAgY29yZSBkdXJpbmcgaXRzIHN0YXJ0dXAgc2VxdWVuY2UuIFRoaXMgaGFwcGVuZWQKICAgICAgIHRvIG9ubHkgb25lIHBlcnNvbiwgYnV0IG5vdyBpdCdzIGZpeGVkLgogICAgICogV2hlbiBDLUtlcm1pdCA4LjAgaXMgaW4gS2VybWl0IHNlcnZlciBtb2RlIGFuZCB0aGUgY2xpZW50IHNheXMKICAgICAgICJnZXQgYmxhaCIsIHdoZXJlIGJsYWggKG9uIHRoZSBzZXJ2ZXIpIGlzIGEgc3ltbGluayByYXRoZXIgdGhhbiBhCiAgICAgICByZWFsIGZpbGUsIHRoZSBzZXJ2ZXIgdW5yZWFzb25hYmx5IHJlZnVzZWQgdG8gc2VuZCB0aGUgbGlua2VkLXRvCiAgICAgICBmaWxlLgogICAgICogV2hlbiBDLUtlcm1pdCBpcyBhbiBGVFAgY2xpZW50IGFuZCBzYXlzICJnZXQgZm9vL2JhciIgKGkuZS4gYQogICAgICAgZmlsZW5hbWUgdGhhdCBpbmNsdWRlcyBvbmUgb3IgbW9yZSBwYXRoIHNlZ21lbnRzKSwgaXQgZmFpbGVkIHRvCiAgICAgICBhY2NlcHQgdGhlIGluY29taW5nIGZpbGUgKHRoaXMgaGFwcGVuZWQgb25seSB3aXRoIEdFVCwgbm90IE1HRVQpLgogICAgICogQXJyYXkgcmVmZXJlbmNlcyBzaG91bGQgYmUgY2FzZSBpbnNlbnNpdGl2ZSBidXQgb25seSBsb3dlcmNhc2UKICAgICAgIGFycmF5IGxldHRlcnMgd2VyZSBhY2NlcHRlZC4KICAgICAqIFNIT1cgVkFSSUFCTEVTIGR1bXBlZCBjb3JlIG9uIFx2KHNleHByZXNzaW9uKSBhbmQgXHYoc3ZhbHVlKS4KICAgICAqIFNwdXJpb3VzIHJlZnVzYWxzIG9mIHJlbW90ZSBkaXJlY3RvcnkgbGlzdGluZ3MgaWYgdGhlIHJlbW90ZQogICAgICAgc2VydmVyJ3MgZGF0ZSB3YXMgc2V0IGluIHRoZSBwYXN0LgogICAgICogSW4gQUlYLCBhbmQgbWF5YmUgZWxzZXdoZXJlIHRvbywgS2VybWl0J3MgQ09QWSBjb21tYW5kIGFsd2F5cwogICAgICAgZmFpbGVkIHdpdGggIlNvdXJjZSBhbmQgZGVzdGluYXRpb24gYXJlIHRoZSBzYW1lIGZpbGUiIHdoZW4gdGhlCiAgICAgICBkZXN0aW5hdGlvbiBmaWxlIGRpZG4ndCBleGlzdC4KICAgICAqIFRoZSBWTVMgdmVyc2lvbiBvZiBDLUtlcm1pdCBkaWQgbm90IHdvcmsgaW4gQmF0Y2ggb3Igd2hlbiBTUEFXTidkLgogICAgICAgVG8gY29tcG91bmQgdGhlIHByb2JsZW0sIGl0IGFsc28gcHJldHR5IG11Y2ggaWdub3JlZCB0aGUgLUIgYW5kIC16CiAgICAgICBjb21tYW5kLWxpbmUgb3B0aW9ucywgd2hvc2UgcHVycG9zZSBpcyB0byB3b3JrIGFyb3VuZCBzdWNoCiAgICAgICBwcm9ibGVtcy4KICAgICAqIEMtS2VybWl0IDguMCBjb3VsZCBub3QgYmUgYnVpbHQgb24gSVJJWCA1LnguCiAgICAgKiBUaGUgQy1LZXJtaXQgOC4wIGJ1aWxkIGZvciBRTlg2IHNhaWQgaXQgd2FzIGFuICIodW5rbm93bgogICAgICAgdmVyc2lvbikiLgoKICAgT3RoZXIgZml4ZXMgYXJlIGxpc3RlZCBpbiB0aGUgWzE2MV1wcmV2aW91cyBzZWN0aW9uLgoKICAgWyBbMTYyXVRvcCBdIFsgWzE2M11Db250ZW50cyBdIFsgWzE2NF1DLUtlcm1pdCBdIFsgWzE2NV1LZXJtaXQgSG9tZSBdCiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCjIuIFNTSCBBTkQgSFRUUAoKICAyLjEuIFNTSCBDb25uZWN0aW9ucwoKICAgICBUaGlzIHNlY3Rpb24gZG9lcyBub3QgYXBwbHkgdG8gWzE2Nl1LZXJtaXQgOTUgMi4wLCB3aGljaCBoYXMgaXRzCiAgICAgb3duIGJ1aWx0LWluIFNTSCBjbGllbnQsIHdoaWNoIGlzIGRvY3VtZW50ZWQgWzE2N11TRVBBUkFURUxZLiAKCiAgIE9uIG1vc3QgVU5JWCBwbGF0Zm9ybXMsIEMtS2VybWl0IGNhbiBtYWtlIFNTSCAoU2VjdXJlIFNIZWxsKQogICBjb25uZWN0aW9uIGJ5IHJ1bm5pbmcgdGhlIGV4dGVybmFsIFNTSCBjb21tYW5kIG9yIHByb2dyYW0gdGhyb3VnaCBpdHMKICAgcHNldWRvdGVybWluYWwgaW50ZXJmYWNlLiBUaGUgY29tbWFuZCBpczoKCiAgIFNTSCB0ZXh0CiAgICAgICAgICBUZWxscyBLZXJtaXQgdG8gc3RhcnQgdGhlIGV4dGVybmFsIFNTSCBjbGllbnQsIHBhc3NpbmcgdGhlCiAgICAgICAgICBnaXZlbiB0ZXh0IHRvIGl0IG9uIHRoZSBjb21tYW5kIGxpbmUuIE5vcm1hbGx5IHRoZSB0ZXh0IGlzIGp1c3QKICAgICAgICAgIHRoZSBob3N0bmFtZSwgYnV0IGl0IGNhbiBiZSBhbnl0aGluZyBlbHNlIHRoYXQgaXMgYWNjZXB0YWJsZSB0bwogICAgICAgICAgdGhlIHNzaCBjbGllbnQuIElmIHRoZSBjb21tYW5kIHN1Y2NlZWRzLCB0aGUgY29ubmVjdGlvbiBpcyBtYWRlCiAgICAgICAgICBhbmQgS2VybWl0IGF1dG9tYXRpY2FsbHkgZW50ZXJzIENPTk5FQ1QgKHRlcm1pbmFsKSBtb2RlLiBZb3UKICAgICAgICAgIGNhbiB1c2UgdGhlIFNTSCBjb21tYW5kIHRvIG1ha2UgYSBjb25uZWN0aW9uIHRvIGFueSBob3N0IHRoYXQKICAgICAgICAgIGhhcyBhbiBTU0ggc2VydmVyLgoKICAgS2VybWl0J3MgU1NIIGNvbW1hbmQgZ2l2ZXMgeW91IGFsbCB0aGUgZmVhdHVyZXMgb2YgS2VybWl0IG9uIGFuIFNTSAogICBjb25uZWN0aW9uOiBjb21tYW5kIGxhbmd1YWdlLCBmaWxlIHRyYW5zZmVyLCBjaGFyYWN0ZXItc2V0CiAgIHRyYW5zbGF0aW9uLCBzY3JpcHRpbmcsIGFuZCBhbGwgdGhlIHJlc3QuIEJ5IGRlZmF1bHQsIEMtS2VybWl0IGludm9rZXMKICAgU1NIIHdpdGggIi1lIG5vbmUiLCB3aGljaCBkaXNhYmxlcyB0aGUgc3NoIGVzY2FwZSBjaGFyYWN0ZXIgYW5kIG1ha2VzCiAgIHRoZSBjb25uZWN0aW9uIHRyYW5zcGFyZW50IGZvciBwdXJwb3NlcyBvZiBmaWxlIHRyYW5zZmVyLiBZb3UgY2FuLAogICBob3dldmVyLCBjaGFuZ2UgdGhlIFNTSCBpbnZvY2F0aW9uIHRvIHdoYXRldmVyIGVsc2UgeW91IG1pZ2h0IG5lZWQgKGFuCiAgIGV4cGxpY2l0IHBhdGgsIGFkZGl0aW9uYWwgY29tbWFuZC1saW5lIGFyZ3VtZW50cywgZXRjKSB3aXRoOgoKICAgU0VUIFNTSCBDT01NQU5EIHRleHQKICAgICAgICAgIFNwZWNpZmllcyB0aGUgc3lzdGVtIGNvbW1hbmQgdGhhdCBLZXJtaXQncyBTU0ggY29tbWFuZCBzaG91bGQKICAgICAgICAgIHVzZSB0byBpbnZva2UgdGhlIGV4dGVybmFsIFNTSCBjbGllbnQuIFVzZSB0aGlzIGNvbW1hbmQgdG8KICAgICAgICAgIHN1cHBseSBhIHNwZWNpZmljIHBhdGggb3IgYWx0ZXJuYXRpdmUgbmFtZSwgb3IgdG8gaW5jbHVkZQogICAgICAgICAgZGlmZmVyZW50IG9yIG1vcmUgY29tbWFuZC1saW5lIG9wdGlvbnMuCgogICBJbiBtb3N0IGNhc2VzLCB0aGVzZSBjb25uZWN0aW9ucyB3b3JrIHF1aXRlIHdlbGwuIFRoZXkgY2FuIGJlIHNjcmlwdGVkCiAgIGxpa2UgYW55IG90aGVyIGNvbm5lY3Rpb24sIGFuZCBmaWxlIHRyYW5zZmVyIGdvZXMgYXMgZmFzdCBhcywgb3IKICAgZmFzdGVyIHRoYW4sIG9uIGEgcmVndWxhciBUZWxuZXQgY29ubmVjdGlvbi4gSW4gc29tZSBjYXNlcywgaG93ZXZlciwKICAgdGhlIHVuZGVybHlpbmcgcHNldWRvdGVybWluYWwgZHJpdmVyIGlzIGEgbGltaXRpbmcgZmFjdG9yLCByZXN1bHRpbmcKICAgaW4gc2xvdyBvciBmYWlsZWQgZmlsZSB0cmFuc2ZlcnMuIFNvbWV0aW1lcyB5b3UgY2FuIHdvcmsgYXJvdW5kIHN1Y2gKICAgcHJvYmxlbXMgYnkgcmVkdWNpbmcgdGhlIEtlcm1pdCBwYWNrZXQgbGVuZ3RoLiBOb3RlIHRoYXQgS2VybWl0IGRvZXMKICAgbm90IGNvbnNpZGVyIFNTSCBjb25uZWN0aW9ucyB0byBiZSByZWxpYWJsZSwgc28gaXQgZG9lcyBub3Qgb2ZmZXIgdG8KICAgdXNlIHN0cmVhbWluZyBpbiBLZXJtaXQgcHJvdG9jb2wgdHJhbnNmZXJzIChidXQgeW91IGNhbiBmb3JjZSBpdCB3aXRoCiAgIFNFVCBSRUxJQUJMRSBvciBTRVQgU1RSRUFNSU5HIGlmIHlvdSB3aXNoKS4KCiAgIFRoZSBTU0ggY29tbWFuZCBpcyBsaWtlIHRoZSBURUxORVQgY29tbWFuZDogaXQgZW50ZXJzIENPTk5FQ1QgbW9kZQogICBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgbWFkZS4gVGhlcmVmb3JlLCB0byBzY3JpcHQgYW4gU1NICiAgIGNvbm5lY3Rpb24sIHVzZToKCiAgc2V0IGhvc3QgL3B0eSBzc2ggLWUgbm9uZSBbIG90aGVyLW9wdGlvbnMgXSBob3N0CiAgaWYgZmFpbCAuLi4KCiAgIHRvIG1ha2UgdGhlIGNvbm5lY3Rpb24uCgogICBIZXJlJ3MgYSBzZXF1ZW5jZSB0aGF0IGNhbiBiZSB1c2VkIHRvIG1ha2UgYSBjb25uZWN0aW9uIHRvIGEgZ2l2ZW4KICAgaG9zdCB1c2luZyBUZWxuZXQgaWYgdGhlIGhvc3QgYWNjZXB0cyBpdCwgb3RoZXJ3aXNlIFNTSDoKCiAgaWYgbm90IGRlZmluZWQgXCUxIGV4aXQgMSBVc2FnZTogXCUwIGhvc3QKICBzZXQgcXVpZXQgb24KICBzZXQgaG9zdCBcJTEgMjMgL3RlbG5ldAogIGlmIGZhaWwgewogICAgICBzZXQgaG9zdCAvcHR5IHNzaCAtbCBcbSh1c2VyKSAtZSBub25lIFwlMQogICAgICBpZiBmYWlsIGV4aXQgMSBcJTE6IFRlbG5ldCBhbmQgU1NIIGJvdGggZmFpbAogICAgICBlY2hvIFNTSCBjb25uZWN0aW9uIHRvIFwlMSBzdWNjZXNzZnVsCiAgfSBlbHNlIHsKICAgICAgZWNobyBUZWxuZXQgY29ubmVjdGlvbiB0byBcJTEgc3VjY2Vzc2Z1bAogIH0KCiAgIEluIFNTSCB2MiwgaXQgaXMgcG9zc2libGUgdG8gbWFrZSBhbiBTU0ggY29ubmVjdGlvbiBkaXJlY3QgdG8gYSBLZXJtaXQKICAgc2VydmVyIHN5c3RlbSBpZiB0aGUgaG9zdCBhZG1pbmlzdHJhdG9yIGhhcyBjb25maWd1cmVkIHRoZSBTU0ggc2VydmVyCiAgIHRvIGFsbG93IHRoaXM7IFsxNjhdQ0xJQ0sgSEVSRSBmb3IgZGV0YWlscy4KCiAgIFNpbmNlIEtlcm1pdCB1c2VzIGV4dGVybmFsIHNzaCBjbGllbnQgc29mdHdhcmUsIGFuZCBzaW5jZSB0aGVyZSBhcmUKICAgZGlmZmVyZW50IHNzaCBjbGllbnRzIChhbmQgZGlmZmVyZW50IHJlbGVhc2VzIG9mIGVhY2ggb25lKSwgdGhlIGV4YWN0CiAgIGNvbW1hbmQgdG8gYmUgdXNlZCB0byBtYWtlIGFuIFNTSC9LZXJtaXQgY29ubmVjdGlvbiBjYW4gdmFyeS4gSGVyZSBpcwogICB0aGUgY29tbWFuZCBmb3IgdGhlIE9wZW5TU0ggMy4wLjJwMSBjbGllbnQ6CgpzZXQgaG9zdCAvcGlwZSBzc2ggLWUgbm9uZSBbIC1sIHVzZXJuYW1lIF0gLVQgLXMgaG9zdG5hbWUga2VybWl0CgogICBFeGFtcGxlOgoKc2V0IGhvc3QgL3BpcGUgc3NoIC1lIG5vbmUgLWwgb2xnYSAtVCAtcyBocS54eXpjb3JwLmNvbSBrZXJtaXQKCiAgIFRoZSBTU0ggY2xpZW50IG1pZ2h0IG9yIG1pZ2h0IG5vdCBwcm9tcHQgeW91IGZvciBhIHBhc3N3b3JkIG9yIG90aGVyCiAgIGluZm9ybWF0aW9uIGJlZm9yZSBpdCBtYWtlcyB0aGUgY29ubmVjdGlvbjsgdGhpcyBkZXBlbmRzIG9uIHlvdXIgU1NICiAgIGNvbmZpZ3VyYXRpb24gKHlvdXIgcHVibGljIGFuZCBwcml2YXRlIGtleXMsIHlvdXIgYXV0aG9yaXplZCBob3N0cwogICBmaWxlLCBldGMpLiBIZXJlJ3MgYSBicmllZiBzeW5vcHNpcyBvZiB0aGUgT3BlblNTSCBjbGllbnQgY29tbWFuZAogICBzeW50YXggKCJtYW4gc3NoIiBmb3IgZGV0YWlscyk6CgogICAtZSBub25lCiAgICAgICAgICBUaGlzIHRlbGxzIHRoZSBTU0ggY2xpZW50IHRvIHVzZSBubyBlc2NhcGUgY2hhcmFjdGVyLiBTaW5jZSB3ZQogICAgICAgICAgd2lsbCBiZSB0cmFuc2ZlcnJpbmcgZmlsZXMgYWNyb3NzIHRoZSBjb25uZWN0aW9uLCB3ZSBkb24ndCB3YW50CiAgICAgICAgICB0aGUgY29ubmVjdGlvbiB0byBzdWRkZW5seSBibG9jayBiZWNhdXNlIHNvbWUgY2hhcmFjdGVyIGluIHRoZQogICAgICAgICAgZGF0YS4KCiAgIC1sIHVzZXJuYW1lCiAgICAgICAgICBUaGlzIGlzIHRoZSB1c2VybmFtZSBvbiB0aGUgcmVtb3RlIGhvc3QuIFlvdSBjYW4gb21pdCB0aGUgLWwKICAgICAgICAgIG9wdGlvbiBhbmQgaXRzIGFyZ3VtZW50IGlmIHlvdXIgbG9jYWwgYW5kIHJlbW90ZSB1c2VybmFtZXMgYXJlCiAgICAgICAgICB0aGUgc2FtZS4gSWYgdGhleSBhcmUgZGlmZmVyZW50LCB5b3UgbXVzdCBzdXBwbHkgdGhlIHJlbW90ZQogICAgICAgICAgdXNlcm5hbWUuCgogICAtVAogICAgICAgICAgVGhpcyB0ZWxscyB0aGUgU1NIIGNsaWVudCB0byB0ZWxsIHRoZSBTU0ggc2VydmVyIG5vdCB0bwogICAgICAgICAgYWxsb2NhdGUgYSBwc2V1ZG90ZXJtaW5hbC4gV2UgYXJlIG5vdCBtYWtpbmcgYSB0ZXJtaW5hbAogICAgICAgICAgY29ubmVjdGlvbiwgd2UgZG9uJ3QgbmVlZCBhIHRlcm1pbmFsLCBhbmQgaW4gZmFjdCBpZiBhIHRlcm1pbmFsCiAgICAgICAgICB3ZXJlIGFsbG9jYXRlZCBvbiB0aGUgcmVtb3RlIGVuZCwgdGhlIGNvbm5lY3Rpb24gd291bGQgbm90CiAgICAgICAgICB3b3JrLgoKICAgLXMgLi4uIGtlcm1pdAogICAgICAgICAgVGhpcyB0ZWxscyB0aGUgU1NIIGNsaWVudCB0byB0ZWxsIHRoZSBTU0ggc2VydmVyIHRvIHN0YXJ0IHRoZQogICAgICAgICAgc3BlY2lmaWVkIHN1YnN5c3RlbSAoImtlcm1pdCIpIG9uY2UgdGhlIGNvbm5lY3Rpb24gaXMgbWFkZS4gVGhlCiAgICAgICAgICBzdWJzeXN0ZW0gbmFtZSBjb21lcyBhZnRlciB0aGUgaG9zdG5hbWUuCgogICBob3N0bmFtZQogICAgICAgICAgVGhlIElQIGhvc3QgbmFtZSBvciBhZGRyZXNzIG9mIHRoZSBkZXNpcmVkIGhvc3QuCgogICBZb3UgbWlnaHQgd2FudCB0byBpbmNsdWRlIG90aGVyIG9yIGFkZGl0aW9uYWwgc3NoIGNvbW1hbmQtbGluZQogICBvcHRpb25zOyAibWFuIHNzaCIgZXhwbGFpbnMgd2hhdCB0aGV5IGFyZS4gSGVyZSBhcmUgc29tZSBleGFtcGxlcyBmb3IKICAgdGhlIE9wZW5TU0ggMy4wLjJwMSBjbGllbnQ6CgogICAtb0NsZWFyQWxsRm9yd2FyZGluZ3MgeWVzCiAgIC1vRm9yd2FyZEFnZW50IG5vCiAgIC1vRm9yd2FyZFgxMSBubwogICAtb0ZhbGxiYWNrVG9Sc2ggbm8KICAgICAgICAgIFRoZXNlIGVuc3VyZSB0aGF0IGEgc2VjdXJlIGNvbm5lY3Rpb24gaXMgdXNlZCBhbmQgdGhhdCB0aGUKICAgICAgICAgIGNvbm5lY3Rpb24gdXNlZCBmb3IgZmlsZSB0cmFuc2ZlciBpcyBub3QgYWxzbyB1c2VkIGZvcgogICAgICAgICAgZm9yd2FyZGluZyBvdGhlciB0aGluZ3MgdGhhdCBtaWdodCBiZSBzcGVjaWZpZWQgaW4gdGhlCiAgICAgICAgICBzc2hfY29uZmlnIGZpbGUuCgogICAtb1Byb3RvY29sIDIKICAgICAgICAgIChpLmUuIFNTSCB2MikgRW5zdXJlcyB0aGF0IHRoZSBuZWdvdGlhdGVkIHByb3RvY29sIHN1cHBvcnRzCiAgICAgICAgICBzdWJzeXN0ZW1zLgoKICAgT25jZSB5b3UgaGF2ZSBhbiBTU0ggY29ubmVjdGlvbiB0byBhIEtlcm1pdCBzZXJ2ZXIsIGl0J3MganVzdCBsaWtlIGFueQogICBvdGhlciBjb25uZWN0aW9uIHRvIGEgS2VybWl0IHNlcnZlciAoYW5kIHZlcnkgc2ltaWxhciB0byBhIGNvbm5lY3Rpb24KICAgdG8gYW4gRlRQIHNlcnZlcikuIFlvdSBnaXZlIHRoZSBjbGllbnQgZmlsZSB0cmFuc2ZlciBhbmQgbWFuYWdlbWVudAogICBjb21tYW5kcyBmb3IgdGhlIHNlcnZlciwgYW5kIHRoZSBzZXJ2ZXIgZXhlY3V0ZXMgdGhlbS4gT2YgY291cnNlIHlvdQogICBjYW4gYWxzbyBnaXZlIHRoZSBjbGllbnQgYW55IG90aGVyIGNvbW1hbmRzIHlvdSB3aXNoLgoKICAgWyBbMTY5XVNTSCBLZXJtaXQgU2VydmVyIFN1YnN5c3RlbSBdIFsgWzE3MF1LZXJtaXQgOTUgQnVpbHQtaW4gU1NICiAgIENsaWVudCBdCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgMi4yLiBIVFRQIENvbm5lY3Rpb25zCgogICBIeXBlcnRleHQgVHJhbnNmZXIgUHJvdG9jb2wsIG9yIEhUVFAsIGlzIHRoZSBhcHBsaWNhdGlvbiBwcm90b2NvbCBvZgogICB0aGUgV29ybGQgV2lkZSBXZWIgKFdXVyksIHVzZWQgYmV0d2VlbiBXZWIgYnJvd3NlcnMgKGNsaWVudHMpIGFuZCBXZWIKICAgc2VydmVycy4gSXQgYWxsb3dzIGEgY2xpZW50IHRvIGdldCBmaWxlcyBmcm9tIHdlYnNpdGVzLCB1cGxvYWQgZmlsZXMKICAgdG8gd2Vic2l0ZXMsIGRlbGV0ZSBmaWxlcyBmcm9tIHdlYnNpdGVzLCBnZXQgaW5mb3JtYXRpb24gYWJvdXQgd2Vic2l0ZQogICBkaXJlY3RvcmllcyBhbmQgZmlsZXMsIGFuZCBpbnRlcmFjdCB3aXRoIHNlcnZlci1zaWRlIENHSSBzY3JpcHRzLgogICBDLUtlcm1pdCBpbmNsdWRlcyBhbiBIVFRQIGNsaWVudCBjYXBhYmxlIG9mIGJvdGggY2xlYXItdGV4dCBhbmQgc2VjdXJlCiAgIEhUVFAgY29ubmVjdGlvbnMsIHRoYXQgY2FuIGRvIGFsbCB0aGVzZSB0YXNrcyBhbmQgY2FuIGJlIGF1dG9tYXRlZAogICB0aHJvdWdoIHRoZSBLZXJtaXQgc2NyaXB0aW5nIGxhbmd1YWdlLgoKICAgQWx0aG91Z2ggQy1LZXJtaXQgNy4wIGNvdWxkIG1ha2UgSFRUUCBjb25uZWN0aW9ucyB0byBXZWIgc2VydmVycywgaXQKICAgY291bGQgZG8gc28gb25seSB3aGVuIG5vIG90aGVyIGNvbm5lY3Rpb24gd2FzIG9wZW4sIGFuZCB0aGUgcHJvY2VkdXJlCiAgIHdhcyBzb21ld2hhdCBhd2t3YXJkLiBDLUtlcm1pdCA4LjAgaW1wcm92ZXMgbWF0dGVycyBieToKCiAgICAgKiBBbGxvd2luZyBhbiBIVFRQIGNvbm5lY3Rpb24gdG8gYmUgb3BlbiBhdCB0aGUgc2FtZSB0aW1lIGFzIGEKICAgICAgIHJlZ3VsYXIgU0VUIExJTkUgb3IgU0VUIEhPU1QgY29ubmVjdGlvbiwgYW5kIGFsc28gYXQgdGhlIHNhbWUgdGltZQogICAgICAgYXMgYW4gRlRQIGNvbm5lY3Rpb24gKFsxNzFdU2VjdGlvbiAzKTsKICAgICAqIFVwZ3JhZGluZyB0aGUgSFRUUCBwcm90b2NvbCBsZXZlbCBmcm9tIDEuMCB0byAxLjEsIHRodXMgYWxsb3dpbmcKICAgICAgIGZvciBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zLCBpbiB3aGljaCBhIHNlcmllcyBvZiBjb21tYW5kcyBjYW4gYmUKICAgICAgIHNlbnQgb24gdGhlIHNhbWUgY29ubmVjdGlvbiwgcmF0aGVyIHRoYW4gb25seSBvbmUgYXMgaW4gSFRUUCAxLjAKICAgICAgIChhbmQgQy1LZXJtaXQgNy4wKTsKICAgICAqIFByb3ZpZGluZyBmb3IgIm9uZS1zaG90IiBVUkwtZHJpdmVuIEhUVFAgb3BlcmF0aW9ucyBzdWNoIGFzIEdFVCBvcgogICAgICAgUFVULgogICAgICogUHJvdmlkaW5nIGEgZGlzdGluY3QgSFRUUCBjb21tYW5kLWxpbmUgcGVyc29uYWxpdHkuCgogICBQZXJzaXN0ZW50IEhUVFAgY29ubmVjdGlvbnMgYXJlIG1hbmFnZWQgd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1hbmRzOgoKICAgSFRUUCBbIHN3aXRjaGVzIF0gT1BFTiBbIHNlY3VyaXR5LW9wdGlvbnMgXSBob3N0LW9yLXVybCBbIHBvcnQgXSAKICAgICAgICAgIE9wZW5zIGEgcGVyc2lzdGVudCBjb25uZWN0aW9uIHRvIHRoZSBzcGVjaWZpZWQgaG9zdCAoSVAgaG9zdAogICAgICAgICAgbmFtZSBvciBhZGRyZXNzKSBvbiB0aGUgc3BlY2lmaWVkIHBvcnQuIElmIGFueSBzd2l0Y2hlcwogICAgICAgICAgKG9wdGlvbnMsIGxpc3RlZCBpbiB0aGUgbmV4dCBzZWN0aW9uKSBhcmUgaW5jbHVkZWQsIHRoZWlyCiAgICAgICAgICB2YWx1ZXMgYXJlIHNhdmVkIGFuZCB1c2VkIGZvciBhbGwgc3Vic2VxdWVudCBIVFRQIGFjdGlvbgogICAgICAgICAgY29tbWFuZHMgb24gdGhlIHNhbWUgY29ubmVjdGlvbi4gSWYgbm8gcG9ydCBpcyBzcGVjaWZpZWQsIEhUVFAKICAgICAgICAgICg4MCkgaXMgdXNlZC4gQSBVbmlmb3JtIFJlc291cmNlIExvY2F0b3IgKFVSTCwgWzE3Ml1SRkMgMTczOCkKICAgICAgICAgIGNhbiBiZSBnaXZlbiBpbnN0ZWFkIG9mIGEgaG9zdG5hbWUgKG9yIGFkZHJlc3MpIGFuZCBwb3J0IChidXQKICAgICAgICAgIHRoZSBVUkwgY2FuIG5vdCBpbmNsdWRlIGEgZGlyZWN0b3J5L2ZpbGUgcGF0aCkuIFRoZSBzZWN1cml0eQogICAgICAgICAgb3B0aW9ucyBhcmUgZXhwbGFpbmVkIFsxNzNdYmVsb3cuIFRoZSBIVFRQIE9QRU4gY29tbWFuZAogICAgICAgICAgcmVwbGFjZXMgdGhlIEMtS2VybWl0IDcuMCBTRVQgSE9TVCBob3N0bmFtZSBIVFRQIGNvbW1hbmQsIHdoaWNoCiAgICAgICAgICBubyBsb25nZXIgd29ya3Mgd2l0aCBIVFRQIEdFVCBhbmQgcmVsYXRlZCBjb21tYW5kcy4KCiAgIEhUVFAgQ0xPU0UKICAgICAgICAgIENsb3NlcyBhbnkgb3BlbiBIVFRQIGNvbm5lY3Rpb24gYW5kIGNsZWFycyBhbnkgc2F2ZWQgc3dpdGNoCiAgICAgICAgICB2YWx1ZXMuCgogICBBIFVSTCBzdGFydHMgd2l0aCBhIHByb3RvY29sIG5hbWUsIHdoaWNoIG11c3QgYmUgaHR0cCBvciBodHRwcyBpbiB0aGlzCiAgIGNhc2U7IG9wdGlvbmFsbHkgaW5jbHVkZXMgYSB1c2VybmFtZSBhbmQgcGFzc3dvcmQ7IGFuZCBtdXN0IGNvbnRhaW4gYQogICBob3N0IG5hbWUgb3IgYWRkcmVzczoKCiAgcHJvdG9jb2w6Ly9bdXNlclsucGFzc3dvcmRdXUBob3N0Wzpwb3J0XVtVUkldCgogICBIVFRQIGlzIEh5cGVydGV4dCBUcmFuc2ZlciBQcm90b2NvbC4gSFRUUFMgaXMgdGhlIHNlY3VyZSAoU1NML1RMUykKICAgdmVyc2lvbiBvZiBIVFRQLiBUaGUgVENQIHNlcnZpY2UgcG9ydCBpcyBkZXJpdmVkIGZyb20gdGhlIHByb3RvY29sCiAgIHByZWZpeCAoc28gbm9ybWFsbHkgdGhlICI6cG9ydCIgZmllbGQgaXMgb21pdHRlZCkuIFRodXMgdGhlIFVSTAogICBwcm90b2NvbCBuYW1lIHNwZWNpZmllcyBhIGRlZmF1bHQgVENQIHNlcnZpY2UgcG9ydCBhbmQgdGhlIFVSTCB1c2VyCiAgIGFuZCBwYXNzd29yZCBmaWVsZHMgY2FuIHRha2UgdGhlIHBsYWNlIG9mIHRoZSAvVVNFUiBhbmQgL1BBU1NXT1JECiAgIHN3aXRjaGVzIChbMTc0XVNlY3Rpb24gMi4yLjEpLiBUaGUgb3B0aW9uYWwgVVJJIGlzIGEgImNvbXBhY3Qgc3RyaW5nCiAgIG9mIGNoYXJhY3RlcnMgZm9yIGlkZW50aWZ5aW5nIGFuIGFic3RyYWN0IG9yIHBoeXNpY2FsIHJlc291cmNlIgogICAoWzE3NV1SRkMgMjM5NiksIHN1Y2ggYXMgYSBmaWxlLiBJdCBtdXN0IGJlZ2luIHdpdGggYSBzbGFzaCAoLyk7IGlmCiAgIHRoZSBVUkkgaXMgb21pdHRlZCwgIi8iIGlzIHN1cHBsaWVkLiBFeGFtcGxlczoKCiAgIGh0dHAgb3BlbiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS8KICAgICAgICAgIEVxdWl2YWxlbnQgdG8gaHR0cCBvcGVuIHd3dy5jb2x1bWJpYS5lZHUgb3IgaHR0cCBvcGVuCiAgICAgICAgICB3d3cuY29sdW1iaWEuZWR1IGh0dHAuCgogICBodHRwIG9wZW4gaHR0cHM6Ly9vbGdhLnNlY3JldEB3d3cxLnh5emNvcnAuY29tLwogICAgICAgICAgRXF1aXZhbGVudCB0byBodHRwIC91c2VyOm9sZ2EgL3Bhc3M6c2VjcmV0IG9wZW4KICAgICAgICAgIHd3dzEueHl6Y29ycC5jb20gaHR0cHMuCgogICBQZXJzaXN0ZW5jZSBpcyBhY2NvbXBsaXNoZWQgdW5pbGF0ZXJhbGx5IGJ5IEMtS2VybWl0IDguMC4gQW4gSFRUUCAxLjAKICAgc2VydmVyIGNsb3NlcyB0aGUgY29ubmVjdGlvbiBhZnRlciBlYWNoIGFjdGlvbi4gQWx0aG91Z2ggSFRUUCAxLjEKICAgYWxsb3dzIG11bHRpcGxlIGFjdGlvbnMgb24gdGhlIHNhbWUgY29ubmVjdGlvbiwgYW4gSFRUUCAxLjEgc2VydmVyCiAgIHRlbmRzIHRvIGNsb3NlIHRoZSBjb25uZWN0aW9uIGlmIGl0IGlzIGlkbGUgZm9yIG1vcmUgdGhhbiBhIGZldwogICBzZWNvbmRzLCB0byBkZWZlbmQgaXRzZWxmIGFnYWluc3QgZGVuaWFsLW9mLXNlcnZpY2UgYXR0YWNrcy4gQnV0IHdoZW4KICAgeW91IHVzZSBLZXJtaXQncyBIVFRQIE9QRU4gY29tbWFuZCB0byBjcmVhdGUgYSBjb25uZWN0aW9uLCBLZXJtaXQKICAgcmVvcGVucyBpdCBhdXRvbWF0aWNhbGx5IChpZiBuZWNlc3NhcnkpIGZvciBlYWNoIEhUVFAgYWN0aW9uIHVudGlsIHlvdQogICBjbG9zZSBpdCB3aXRoIEhUVFAgQ0xPU0UsIHJlZ2FyZGxlc3Mgb2YgdGhlIHNlcnZlcidzIEhUVFAgcHJvdG9jb2wKICAgdmVyc2lvbiwgb3IgaG93IG1hbnkgdGltZXMgaXQgY2xvc2VzIHRoZSBjb25uZWN0aW9uLgoKICAgRmlyZXdhbGxzIGNhbiBiZSBuZWdvdGlhdGVkIHRocm91Z2ggcHJveGllcyB3aXRoIHRoZSBmb2xsb3dpbmcKICAgY29tbWFuZHM6CgogICBTRVQgVENQIEhUVFAtUFJPWFkgWyBob3N0Wzpwb3J0XSBdCiAgICAgICAgICBJZiBhIGhvc3QgKGJ5IGhvc3RuYW1lIG9yIElQIGFkZHJlc3MpIGlzIHNwZWNpZmllZCwgS2VybWl0IHVzZXMKICAgICAgICAgIGl0IGFzIGEgcHJveHkgc2VydmVyIHdoZW4gYXR0ZW1wdGluZyBvdXRnb2luZyBUQ1AgY29ubmVjdGlvbnMKICAgICAgICAgIC0tIG5vdCBvbmx5IEhUVFAgY29ubmVjdGlvbnMsIGJ1dCBhbGwgVENQL0lQIGNvbm5lY3Rpb25zLAogICAgICAgICAgVGVsbmV0IGFuZCBGVFAgaW5jbHVkZWQuIFRoaXMgYWxsb3dzIEtlcm1pdCB0byBhZGFwdCB0byB0aGUKICAgICAgICAgIEhUVFAgZmlyZXdhbGwgcGVuZXRyYXRpb24gbWV0aG9kIChhcyBvcHBvc2VkIHRvIG90aGVyIG1ldGhvZHMKICAgICAgICAgIHN1Y2ggYXMgU09DS1M0KS4gSWYgbm8gaG9zdG5hbWUgb3IgaXAtYWRkcmVzcyBpcyBzcGVjaWZpZWQsIGFueQogICAgICAgICAgcHJldmlvdXNseSBzcGVjaWZpZWQgUHJveHkgc2VydmVyIGlzIHJlbW92ZWQuIElmIG5vIHBvcnQgbnVtYmVyCiAgICAgICAgICBpcyBzcGVjaWZpZWQsIHRoZSAiaHR0cCIgc2VydmljZSBpcyB1c2VkLiBUaGlzIGNvbW1hbmQgbXVzdCBiZQogICAgICAgICAgZ2l2ZW4gYmVmb3JlIHRoZSBIVFRQIE9QRU4gY29tbWFuZCBpZiBhIHByb3h5IGlzIHRvIGJlIHVzZWQgb3IKICAgICAgICAgIGNhbmNlbGVkLgoKICAgSFRUUCBbIHN3aXRjaGVzIF0gQ09OTkVDVCBob3N0Wzpwb3J0XQogICAgICAgICAgSW5zdHJ1Y3RzIHRoZSBIVFRQIHNlcnZlciB0byBhY3QgYXMgYSBwcm94eSwgZXN0YWJsaXNoaW5nIGEKICAgICAgICAgIGNvbm5lY3Rpb24gdG8gdGhlIHNwZWNpZmllZCBob3N0IChJUCBob3N0bmFtZSBvciBhZGRyZXNzKSBvbgogICAgICAgICAgdGhlIGdpdmVuIHBvcnQgKDgwID0gSFRUUCBieSBkZWZhdWx0KSBhbmQgdG8gcmVkaXJlY3QgYWxsIGRhdGEKICAgICAgICAgIHRyYW5zbWl0dGVkIGJldHdlZW4gS2VybWl0IGFuZCBpdHNlbGYgdG8gdGhlIGdpdmVuIGhvc3QgZm9yIHRoZQogICAgICAgICAgbGlmZSBvZiB0aGUgY29ubmVjdGlvbi4gVGhpcyBjb21tYW5kIGlzIHRvIGJlIHVzZWQgb25seSBmb3IKICAgICAgICAgIGRlYnVnZ2luZyBIVFRQIHByb3h5IGNvbm5lY3Rpb25zLiBJZiBhIHByb3h5IGNvbm5lY3Rpb24gaXMKICAgICAgICAgIHJlcXVpcmVkLCBpbnN0cnVjdCBLZXJtaXQgdG8gdXNlIHRoZSBwcm94eSB3aXRoIHRoZSBTRVQgVENQCiAgICAgICAgICBIVFRQLVBST1hZIGNvbW1hbmQuCgogICAgMi4yLjEuIEhUVFAgQ29tbWFuZCBTd2l0Y2hlcwoKICAgSFRUUCBzd2l0Y2hlcywgbGlrZSBhbGwgb3RoZXIgc3dpdGNoZXMsIGFyZSBvcHRpb25hbC4gV2hlbiBIVFRQCiAgIHN3aXRjaGVzIGFyZSBpbmNsdWRlZCB3aXRoIHRoZSBIVFRQIE9QRU4gY29tbWFuZCwgdGhleSBhcHBseQogICBhdXRvbWF0aWNhbGx5IHRvIHRoaXMgYW5kIGFsbCBzdWJzZXF1ZW50IEhUVFAgYWN0aW9ucyAoR0VULCBQVVQsIC4uLikKICAgb24gdGhlIHNhbWUgY29ubmVjdGlvbiB1bnRpbCBhbiBIVFRQIENMT1NFIGNvbW1hbmQgaXMgZ2l2ZW4uIFNvIGlmIHlvdQogICBpbmNsdWRlIHN3aXRjaGVzIChvciB0aGUgZXF1aXZhbGVudCBVUkwgZmllbGRzLCBzdWNoIGFzIHVzZXIgYW5kCiAgIHBhc3N3b3JkKSBpbiB0aGUgSFRUUCBPUEVOIGNvbW1hbmQsIHlvdSBjYW4gb21pdCB0aGVtIGZyb20gc3Vic2VxdWVudAogICBjb21tYW5kcyBvbiB0aGUgc2FtZSBjb25uZWN0aW9uLiBJZiB0aGUgY29ubmVjdGlvbiBoYXMgY2xvc2VkIHNpbmNlCiAgIHlvdXIgbGFzdCBjb21tYW5kLCBpdCBpcyBhdXRvbWF0aWNhbGx5IHJlb3BlbmVkIHdpdGggdGhlIHNhbWUgb3B0aW9ucy4KCiAgIElmIHlvdSBpbmNsdWRlIHN3aXRjaGVzIHdpdGggYW4gSFRUUCBhY3Rpb24gY29tbWFuZCAoc3VjaCBhcyBHRVQgb3IKICAgUFVUKSwgdGhleSBhcHBseSBvbmx5IHRvIHRoYXQgY29tbWFuZC4KCiAgIC9VU0VSOm5hbWUKICAgICAgICAgIFRvIGJlIHVzZWQgaW4gY2FzZSBhIHBhZ2UgcmVxdWlyZXMgYSB1c2VybmFtZSBmb3IgYWNjZXNzLiBUaGUKICAgICAgICAgIHVzZXJuYW1lIGlzIHNlbnQgd2l0aCBwYWdlIHJlcXVlc3RzLiBJZiBpdCBpcyBnaXZlbiB3aXRoIHRoZQogICAgICAgICAgT1BFTiBjb21tYW5kIGl0IGlzIHNhdmVkIHVudGlsIG5lZWRlZC4gSWYgYSB1c2VybmFtZSBpcwogICAgICAgICAgaW5jbHVkZWQgaW4gYSBVUkwsIGl0IG92ZXJyaWRlcyB0aGUgdXNlcm5hbWUgZ2l2ZW4gaW4gdGhlCiAgICAgICAgICBzd2l0Y2guIENBVVRJT046IFVzZXJuYW1lIGFuZCBwYXNzd29yZCAoYW5kIGFsbCBvdGhlcgogICAgICAgICAgaW5mb3JtYXRpb24sIGluY2x1ZGluZyBjcmVkaXQgY2FyZCBudW1iZXJzIGFuZCBvdGhlciBtYXRlcmlhbAogICAgICAgICAgdGhhdCB5b3UgbWlnaHQgcHJlZmVyIHRvIHByb3RlY3QgZnJvbSBwdWJsaWMgdmlldykgYXJlIHNlbnQKICAgICAgICAgIGFjcm9zcyB0aGUgbmV0d29yayBpbiBjbGVhciB0ZXh0IG9uIHJlZ3VsYXIgSFRUUCBjb25uZWN0aW9ucywKICAgICAgICAgIGJ1dCBhdXRoZW50aWNhdGlvbiBpcyBwZXJmb3JtZWQgc2VjdXJlbHkgb24gSFRUUFMgY29ubmVjdGlvbnMuCgogICAvUEFTU1dPUkQ6dGV4dAogICAgICAgICAgVG8gYmUgdXNlZCBpbiBjYXNlIGEgd2ViIHBhZ2UgcmVxdWlyZXMgYSBwYXNzd29yZCBmb3IgYWNjZXNzLgogICAgICAgICAgVGhlIHBhc3N3b3JkIGlzIHNlbnQgd2l0aCBwYWdlIHJlcXVlc3RzLiBJZiBpdCBpcyBnaXZlbiB3aXRoCiAgICAgICAgICB0aGUgT1BFTiBjb21tYW5kIGl0IGlzIHNhdmVkIHVudGlsIG5lZWRlZC4gSWYgYSBwYXNzd29yZCBpcwogICAgICAgICAgZ2l2ZW4gaW4gYSBVUkwsIGl0IG92ZXJyaWRlcyB0aGUgb25lIGdpdmVuIGhlcmUuIENBVVRJT046IChzYW1lCiAgICAgICAgICBhcyBmb3IgL1VTRVI6KS4KCiAgIC9BR0VOVDp1c2VyLWFnZW50CiAgICAgICAgICBJZGVudGlmaWVzIHRoZSBjbGllbnQgdG8gdGhlIHNlcnZlci4gT3ZlcnJpZGVzIHRoZSBkZWZhdWx0CiAgICAgICAgICBhZ2VudCBzdHJpbmcsIHdoaWNoIGlzICJDLUtlcm1pdCIgKGZvciBDLUtlcm1pdCkgb3IgIktlcm1pdC05NSIKICAgICAgICAgIChmb3IgS2VybWl0IDk1KS4KCiAgIC9BUlJBWTphcnJheS1kZXNpZ25hdG9yCiAgICAgICAgICBUZWxscyBLZXJtaXQgdG8gc3RvcmUgdGhlIHJlc3BvbnNlIGhlYWRlcnMgaW4gdGhlIGdpdmVuIGFycmF5LAogICAgICAgICAgb25lIGxpbmUgcGVyIGVsZW1lbnQuIFRoZSBhcnJheSBuZWVkIG5vdCBiZSBkZWNsYXJlZCBpbgogICAgICAgICAgYWR2YW5jZS4gRXhhbXBsZTogL2FycmF5OiZhLgoKICAgL1RPU0NSRUVOCiAgICAgICAgICBUZWxscyBLZXJtaXQgdG8gZGlzcGxheSBhbnkgcmVzcG9uc2UgdGV4dCBvbiB0aGUgc2NyZWVuLiBJdAogICAgICAgICAgYXBwbGllcyBpbmRlcGVuZGVudGx5IG9mIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uOyB0aHVzIGl0CiAgICAgICAgICBpcyBwb3NzaWJsZSB0byBoYXZlIHRoZSBzZXJ2ZXIgcmVzcG9uc2UgZ28gdG8gdGhlIHNjcmVlbiwgYQogICAgICAgICAgZmlsZSwgYm90aCwgb3IgbmVpdGhlci4KCiAgIC9IRUFERVI6aGVhZGVyLWl0ZW0ocykKICAgICAgICAgIFVzZWQgZm9yIHNwZWNpZnlpbmcgYW55IG9wdGlvbmFsIGhlYWRlcnMgdG8gYmUgc2VudCB3aXRoIEhUVFAKICAgICAgICAgIHJlcXVlc3RzLgoKICAvSEVBREVSOnRhZzp2YWx1ZQoKICAgICAgICAgIFRvIHNlbmQgbW9yZSB0aGFuIG9uZSBoZWFkZXIsIHVzZSBicmFjZXMgZm9yIGdyb3VwaW5nOgoKICAvSEVBREVSOnt7dGFnOnZhbHVlfXt0YWc6dmFsdWV9Li4ufQoKICAgICAgICAgIEZvciBhIGxpc3Qgb2YgdmFsaWQgdGFncyBhbmQgdmFsdWUgZm9ybWF0cyBzZWUgWzE3Nl1SRkMgMjYxNiwKICAgICAgICAgICJIeXBlcnRleHQgVHJhbnNmZXIgUHJvdG9jb2wgLS0gSFRUUC8xLjEiLiBBIG1heGltdW0gb2YgZWlnaHQKICAgICAgICAgIGhlYWRlcnMgbWF5IGJlIHNwZWNpZmllZC4KCiAgICAyLjIuMi4gSFRUUCBBY3Rpb24gQ29tbWFuZHMKCiAgIEhUVFAgYWN0aW9ucyBjYW4gb2NjdXIgd2l0aGluIGEgcGVyc2lzdGVudCBjb25uZWN0aW9uLCBvciB0aGV5IGNhbiBiZQogICBzZWxmLWNvbnRhaW5lZCAoImNvbm5lY3Rpb25sZXNzIikuIEEgcGVyc2lzdGVudCBIVFRQIGNvbm5lY3Rpb24gYmVnaW5zCiAgIHdpdGggYW4gSFRUUCBPUEVOIGNvbW1hbmQsIGZvbGxvd2VkIGJ5IHplcm8gb3IgbW9yZSBIVFRQIGFjdGlvbgogICBjb21tYW5kcywgYW5kIGlzIHRlcm1pbmF0ZWQgd2l0aCBhbiBIVFRQIENMT1NFIGNvbW1hbmQ6CgogIGh0dHAgb3BlbiB3d3cuY29sdW1iaWEuZWR1CiAgaWYgZmFpbHVyZSBzdG9wIDEgSFRUUCBPUEVOIGZhaWxlZDogXHYoaHR0cF9tZXNzYWdlKQogIGh0dHAgZ2V0IGtlcm1pdC9pbmRleC5odG1sCiAgaWYgZmFpbHVyZSBzdG9wIDEgSFRUUCBHRVQgZmFpbGVkOiBcdihodHRwX21lc3NhZ2UpCiAgKG1vcmUgYWN0aW9ucyBwb3NzaWJsZSBoZXJlLi4uKQogIGh0dHAgY2xvc2UKCiAgIEEgc2VsZi1jb250YWluZWQgSFRUUCBhY3Rpb24gb2NjdXJzIHdoZW4gYSBVUkwgaXMgZ2l2ZW4gaW5zdGVhZCBvZiBhCiAgIHJlbW90ZSBmaWxlIG5hbWUgdG8gYW4gSFRUUCBhY3Rpb24gY29tbWFuZC4gSW4gdGhpcyBjYXNlLCBLZXJtaXQgbWFrZXMKICAgdGhlIEhUVFAgY29ubmVjdGlvbiwgdGFrZXMgdGhlIGFjdGlvbiwgYW5kIHRoZW4gY2xvc2VzIHRoZSBjb25uZWN0aW9uLgogICBJZiBhbiBIVFRQIGNvbm5lY3Rpb24gd2FzIGFscmVhZHkgb3BlbiwgaXQgaXMgY2xvc2VkIHNpbGVudGx5IGFuZAogICBhdXRvbWF0aWNhbGx5LgoKICBodHRwIGdldCBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAoKICAgS2VybWl0J3MgSFRUUCBhY3Rpb24gY29tbWFuZHMgYXJlIGFzIGZvbGxvd3MuIFN3aXRjaGVzIG1heSBiZSBpbmNsdWRlZAogICB3aXRoIGFueSBvZiB0aGVzZSB0byBvdmVycmlkZSBzd2l0Y2ggKG9yIGRlZmF1bHQpIHZhbHVlcyBnaXZlbiBpbiB0aGUKICAgSFRUUCBPUEVOIGNvbW1hbmQuCgogICBIVFRQIFsgc3dpdGNoZXMgXSBHRVQgcmVtb3RlLWZpbGVuYW1lIFsgbG9jYWwtZmlsZW5hbWUgXQogICAgICAgICAgUmV0cmlldmVzIHRoZSBuYW1lZCBmaWxlIGZyb20gdGhlIHNlcnZlciBzcGVjaWZpZWQgaW4gdGhlIG1vc3QKICAgICAgICAgIHJlY2VudCBIVFRQIE9QRU4gY29tbWFuZCBmb3Igd2hpY2ggYSBjb3JyZXNwb25kaW5nIEhUVFAgQ0xPU0UKICAgICAgICAgIGNvbW1hbmQgaGFzIG5vdCBiZWVuIGdpdmVuLiBUaGUgZmlsZW5hbWUgbWF5IG5vdCBpbmNsdWRlCiAgICAgICAgICB3aWxkY2FyZHMgKEhUVFAgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB0aGVtKS4gSWYgbm8gSFRUUAogICAgICAgICAgT1BFTiBjb21tYW5kIGlzIGluIGVmZmVjdCwgdGhpcyBmb3JtIG9mIHRoZSBIVFRQIEdFVCBjb21tYW5kCiAgICAgICAgICBmYWlscy4gVGhlIGRlZmF1bHQgbG9jYWwgZmlsZW5hbWUgaXMgdGhlIHNhbWUgYXMgdGhlIHJlbW90ZQogICAgICAgICAgbmFtZSwgYnV0IHdpdGggYW55IHBhdGhuYW1lIHN0cmlwcGVkLiBGb3IgZXhhbXBsZSwgdGhlIGNvbW1hbmQKICAgICAgICAgIGh0dHAgZ2V0IGtlcm1pdC9pbmRleC5odG1sIHN0b3JlcyB0aGUgZmlsZSBpbiB0aGUgY3VycmVudCBsb2NhbAogICAgICAgICAgZGlyZWN0b3J5IGFzIGluZGV4Lmh0bWwuIElmIHRoZSAvSEVBREVSUzogc3dpdGNoIGlzIGluY2x1ZGVkLAogICAgICAgICAgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZpbGUgaXMgYWxzbyBzdG9yZWQgaW4gdGhlIHNwZWNpZmllZAogICAgICAgICAgYXJyYXkgKGV4cGxhaW5lZCBpbiBbMTc3XVNlY3Rpb24gMi4yLjMpLiBBbGwgZmlsZXMgYXJlCiAgICAgICAgICB0cmFuc2ZlcnJlZCBpbiBiaW5hcnkgbW9kZS4gSFRUUCBkb2VzIG5vdCBwcm92aWRlIGZvcgogICAgICAgICAgcmVjb3JkLWZvcm1hdCBvciBjaGFyYWN0ZXItc2V0IGNvbnZlcnNpb24uCgogICBIVFRQIFsgc3dpdGNoZXMgXSBHRVQgdXJsIFsgbG9jYWwtZmlsZW5hbWUgXQogICAgICAgICAgV2hlbiBIVFRQIEdFVCBpcyBnaXZlbiBhIFVSTCByYXRoZXIgdGhhbiBhIGZpbGVuYW1lLCBLZXJtaXQKICAgICAgICAgIG9wZW5zIGEgY29ubmVjdGlvbiB0byB0aGUgZGVzaWduYXRlZCBzZXJ2ZXIgKGNsb3NpbmcgYW55CiAgICAgICAgICBwcmV2aW91c2x5IG9wZW4gSFRUUCBjb25uZWN0aW9uKSwgZ2V0cyB0aGUgZmlsZSwgYW5kIHRoZW4KICAgICAgICAgIGNsb3NlcyB0aGUgY29ubmVjdGlvbi4gSWYgdGhlIFVSTCBkb2VzIG5vdCBpbmNsdWRlIGEgZmlsZW5hbWUsCiAgICAgICAgICBpbmRleC5odG1sIGlzIHN1cHBsaWVkLiBUaGlzIGlzIHRoZSBzZWxmLWNvbnRhaW5lZCBvbmUtc3RlcAogICAgICAgICAgImNvbm5lY3Rpb25sZXNzIiBtZXRob2QgZm9yIGdldHRpbmcgYSBmaWxlIGZyb20gYSBXZWIgc2VydmVyLgogICAgICAgICAgVGhlIGRhdGEgaXMgbm90IGludGVycHJldGVkOyBIVFRQIEdFVCBpcyBsaWtlICJseW54IC1zb3VyY2UiCiAgICAgICAgICByYXRoZXIgdGhhbiAibHlueCAtZHVtcCIuCgogICBJbiB0aGUgcmVtYWluaW5nIEhUVFAgYWN0aW9uIGNvbW1hbmRzLCB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBhCiAgIHJlbW90ZSBmaWxlbmFtZSBhbmQgYSBVUkwgYXJlIHRoZSBzYW1lIGFzIGluIHRoZSBIVFRQIEdFVCBjb21tYW5kLgoKICAgSFRUUCBbIHN3aXRjaGVzIF0gSEVBRCByZW1vdGUtZmlsZW5hbWUtb3ItdXJsIFsgbG9jYWwtZmlsZW5hbWUgXQogICAgICAgICAgTGlrZSBHRVQgZXhjZXB0IHdpdGhvdXQgYWN0dWFsbHkgZ2V0dGluZyB0aGUgZmlsZTsgaW5zdGVhZCBpdAogICAgICAgICAgcmV0cmlldmVzIG9ubHkgdGhlIGhlYWRlcnMuIElmIHRoZSAvQVJSQVk6IG9yIC9UT1NDUkVFTiBzd2l0Y2gKICAgICAgICAgIGlzIGluY2x1ZGVkLCB0aGVyZSBpcyBubyBkZWZhdWx0IGxvY2FsIG91dHB1dCBmaWxlbmFtZSBidXQgeW91CiAgICAgICAgICBjYW4gc3RpbGwgc3BlY2lmeSBvbmUuIElmIG5laXRoZXIgb2YgdGhlc2Ugc3dpdGNoZXMgaXMKICAgICAgICAgIGluY2x1ZGVkLCB0aGUgZGVmYXVsdCBsb2NhbCBmaWxlbmFtZSBpcyB0aGUgc2FtZSBhcyB0aGUgcmVtb3RlCiAgICAgICAgICBmaWxlbmFtZSwgYnV0IHdpdGggYW55IHBhdGggc3RyaXBwZWQgYW5kIHdpdGggIi5oZWFkIiBhcHBlbmRlZC4KICAgICAgICAgIFRoZSBIRUFEIGNvbW1hbmQgY2FuIGJlIHVzZWQgaW4gYSBzY3JpcHQgd2l0aCB0aGUgL0FSUkFZOgogICAgICAgICAgc3dpdGNoIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgdG8KICAgICAgICAgIGRldGVybWluZSB3aGV0aGVyIHRoZSByZXNvdXJjZSBzaG91bGQgYWN0dWFsbHkgYmUgcmV0cmlldmVkCiAgICAgICAgICB3aXRoIGEgc3Vic2VxdWVudCBHRVQgcmVxdWVzdC4KCiAgIEhUVFAgWyBzd2l0Y2hlcyBdIElOREVYIHJlbW90ZS1kaXJlY3Rvcnktb3ItdXJsIFsgbG9jYWwtZmlsZW5hbWUgXQogICAgICAgICAgQXNrcyB0aGUgc2VydmVyIHRvIHNlbmQgYSBsaXN0aW5nIG9mIHRoZSBmaWxlcyBpbiB0aGUgZ2l2ZW4KICAgICAgICAgIHNlcnZlciBkaXJlY3RvcnkuIFRoaXMgY29tbWFuZCBpcyBub3Qgc3VwcG9ydGVkIGJ5IG1vc3QgV2ViCiAgICAgICAgICBzZXJ2ZXJzLiBFdmVuIHdoZW4gaXQgaXMgc3VwcG9ydGVkLCB0aGVyZSBpcyBubyBzdGFuZGFyZCBmb3JtYXQKICAgICAgICAgIGZvciB0aGUgbGlzdGluZy4KCiAgIEhUVFAgWyBzd2l0Y2hlcyBdIFBPU1QgWyAvTUlNRS1UWVBFOnR5cGUgXSBzb3VyY2UtZmlsZQogICAgICAgICAgcmVtb3RlLXBhdGgtb3ItdXJsIFsgcmVzdWx0LWZpbGUgXQogICAgICAgICAgU2VuZHMgZGF0YSB0byBhIHByb2Nlc3MgcnVubmluZyBvbiB0aGUgcmVtb3RlIGhvc3Q7IHRoZSByZXN1bHQKICAgICAgICAgIGlzIHVzdWFsbHkgYW4gSFRNTCBmaWxlIGJ1dCBjb3VsZCBiZSBhbnl0aGluZy4gVGhlIGRhdGEgdG8gYmUKICAgICAgICAgIHBvc3RlZCBtdXN0IGJlIHJlYWQgZnJvbSBhIGxvY2FsIGZpbGUgKHRoZSBzb3VyY2UtZmlsZSkuIElmIGEKICAgICAgICAgIHJlc3VsdCBmaWxlIGlzIHNwZWNpZmllZCwgS2VybWl0IHN0b3JlcyB0aGUgc2VydmVyJ3MgcmVzcG9uc2UKICAgICAgICAgIGluIGl0LgoKICAgSFRUUCBbIHN3aXRjaGVzIF0gUFVUIFsgTUlNRS1UWVBFOnR5cGUgXSBsb2NhbC1maWxlIFsKICAgICAgICAgIHJlbW90ZS1maWxlLW9yLXVybCBbIHJlc3VsdC1maWxlIF0gXQogICAgICAgICAgVXBsb2FkcyBhIGxvY2FsIGZpbGUgdG8gdGhlIHNlcnZlci4gT25seSB0aGUgbmFtZSBvZiBhIHNpbmdsZQogICAgICAgICAgZmlsZSBjYW4gYmUgZ2l2ZW47IHdpbGRjYXJkcyAoYW5kIGdyb3VwIHRyYW5zZmVycykgYXJlIG5vdAogICAgICAgICAgc3VwcG9ydGVkIGJ5IEhUVFAgcHJvdG9jb2wuIElmIG5vIHJlbW90ZSBmaWxlbmFtZSBpcyBnaXZlbiwgdGhlCiAgICAgICAgICBmaWxlIGlzIHNlbnQgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBsb2NhbCBmaWxlLCBidXQgd2l0aCBhbnkKICAgICAgICAgIHBhdGhuYW1lIHN0cmlwcGVkLgoKICAgSFRUUCBbIHN3aXRjaGVzIF0gREVMRVRFIHJlbW90ZS1maWxlLW9yLXVybCBbIGxvY2FsLXJlc3VsdC1maWxlIF0KICAgICAgICAgIEFza3MgdGhlIHNlcnZlciB0byBkZWxldGUgdGhlIHNwZWNpZmllZCBzaW5nbGUgZmlsZS4gSWYgYQogICAgICAgICAgcmVzdWx0IGZpbGUgaXMgc3BlY2lmaWVkLCBpdCB3aWxsIGNvbnRhaW4gYW55IHJlc3BvbnNlIGRhdGEKICAgICAgICAgIHJldHVybmVkIGJ5IHRoZSBzZXJ2ZXIuCgogICBOb3RlIHRoZSBsaW1pdGF0aW9ucyBvZiBIVFRQIHByb3RvY29sIGNvbXBhcmVkIHRvIChzYXkpIEZUUCBvciBLZXJtaXQuCiAgIFRoZXJlIGlzIG5vIGNvbW1hbmQgZm9yIGNoYW5naW5nIGRpcmVjdG9yaWVzLCBubyBzdGFuZGFyZCB3YXkgdG8gZ2V0CiAgIGZpbGUgb3IgZGlyZWN0b3J5IGxpc3RzLCBubyB3YXkgdG8gdHJhbnNmZXIgZmlsZSBncm91cHMgYnkgdXNpbmcKICAgd2lsZGNhcmQgbm90YXRpb24sIGV0YywgYW5kIHRoZXJlZm9yZSBubyBnb29kIHdheSB0byAoc2F5KSBmZXRjaCBhbGwKICAgcGFnZXMsIGRlc2NlbmQgdGhyb3VnaCBzdWJkaXJlY3RvcmllcywgcGVyZm9ybSBhdXRvbWF0aWMgdXBkYXRlcywgZXRjLgogICBUaGVyZSBpcyBubyBhc3N1cnJhbmNlIGEgY29ubmVjdGlvbiB3aWxsIHN0YXkgb3BlbiBhbmQsIGFzIG5vdGVkLAogICB0aGVyZSBpcyBubyBwcm92aXNpb24gZm9yIGRhdGEgY29udmVyc2lvbiBiZXR3ZWVuIHVubGlrZSBwbGF0Zm9ybXMuCiAgIFRoZSBkYXRhJ3MgTUlNRSBoZWFkZXJzIGNhbiBiZSB1c2VkIGZvciBwb3N0cHJvY2Vzc2luZy4KCiAgICAyLjIuMy4gSFRUUCBIZWFkZXJzCgogICBFYWNoIEhUVFAgcmVxdWVzdCBhbmQgcmVzcG9uc2UgY29udGFpbnMgYSBzZXQgb2YgbmFtZS92YWx1ZSBwYWlycwogICBjYWxsZWQgaGVhZGVycy4gSFRUUCBoZWFkZXJzIGFyZSBzcGVjaWZpZWQgaW4gWzE3OF1SRkMgMjYxNi4gRm9yCiAgIGV4YW1wbGUsIGFuIEhUVFAgR0VUIHJlcXVlc3QgZm9yIC9pbmRleC5odG1sIG9uIHd3dy5jb2x1bWJpYS5lZHUKICAgY29udGFpbnMgdGhlIGZvbGxvd2luZyBoZWFkZXJzOgoKICBHRVQgL2luZGV4Lmh0bWwgSFRUUC8xLjEKICBIb3N0OiB3d3cuY29sdW1iaWEuZWR1OjgwCiAgVXNlci1hZ2VudDogQy1LZXJtaXQgOC4wCiAgQXV0aG9yaXphdGlvbjogQmFzaWMgYmFzZTY0LWVuY29kZWQtdXNlcm5hbWUtcGFzc3dvcmQKCiAgIFRoZXNlIG1pZ2h0IGJlIGZvbGxvd2VkIGJ5IGFueSBvdGhlcnMgc3BlY2lmaWVkIHdpdGggYSAvSEVBREVSUzoKICAgc3dpdGNoOgoKICBBY2NlcHQ6IGltYWdlL2dpZiwgaW1hZ2UveC14Yml0bWFwLCBpbWFnZS9qcGVnLCAqLioKICBBY2NlcHQtRW5jb2Rpbmc6IGd6aXAKICBBY2NlcHQtTGFuZ3VhZ2U6IGVuCiAgQWNjZXB0LUNoYXJzZXQ6IGlzby04ODU5LTEsdXRmLTgKICBDb29raWU6IGNvb2tpZS1kYXRhCgogICBUaGUgc2VydmVyIHNlbmRzIGJhY2sgYSBzaG9ydCByZXBvcnQgYWJvdXQgdGhlIGZpbGUgcHJpb3IgdG8gc2VuZGluZwogICB0aGUgZmlsZSBjb250ZW50cy4gRXhhbXBsZToKCiAgSFRUUC8xLjEgMjAwIE9LCiAgRGF0ZTogRnJpLCAyNCBBdWcgMjAwMSAyMTowOTozOSBHTVQKICBTZXJ2ZXI6IEFwYWNoZS8xLjMuNCAoVW5peCkKICBMYXN0LU1vZGlmaWVkOiBNb24sIDA2IEF1ZyAyMDAxIDIxOjE2OjEzIEdNVAogIEVUYWc6ICIxZmExMzctMTBkNy0zYjZmMDkxZCIKICBBY2NlcHQtUmFuZ2VzOiBieXRlcwogIENvbnRlbnQtTGVuZ3RoOiA0MzExCiAgQ29udGVudC1UeXBlOiB0ZXh0L2h0bWwKCiAgIElmIHlvdSB3YW50IHRvIGhhdmUgdGhpcyBpbmZvcm1hdGlvbiBhdmFpbGFibGUgdG8gYSBLZXJtaXQgc2NyaXB0IHlvdQogICBjYW4gdXNlIHRoZSAvQVJSQVkgc3dpdGNoIHRvIGhhdmUgS2VybWl0IHB1dCBpdCBpbiBhcnJheSwgb25lIGxpbmUgcGVyCiAgIGFycmF5IGVsZW1lbnQuIEV4YW1wbGU6CgogIHNldCBleGl0IHdhcm5pbmcgb2ZmCiAgaHR0cCBvcGVuIHd3dy5jb2x1bWJpYS5lZHUKICBpZiBmYWlsIGV4aXQgMSBDYW4ndCByZWFjaCBzZXJ2ZXIKICBodHRwIC9hcnJheTomYSBnZXQgL2luZGV4Lmh0bWwKICBpZiBmYWlsIGV4aXQgMSBDYW4ndCBnZXQgZmlsZQogIGVjaG8gSGVhZGVyIGxpbmVzOiBcZmRpbSgmYSkKICBmb3IgXCVpIDEgXGZkaW0oJmEpIDEgewogICAgICBlY2hvIFwlaS4gXCZhW1wlaV0KICB9CgogICBOb3RlIHRoYXQgdGhlICJEYXRlOiIgaXRlbSBpcyB0aGUgY3VycmVudCBkYXRlIGFuZCB0aW1lOyB0aGUKICAgIkxhc3QtTW9kaWZlZDoiIGl0ZW0gaXMgdGhlIGZpbGUncyBtb2RpZmljYXRpb24gZGF0ZSBhbmQgdGltZS4gQW4KICAgZXhhbXBsZSBzaG93aW5nIGhvdyB0byB1c2UgdGhpcyBpbmZvcm1hdGlvbiBpcyBwcmVzZW50ZWQgaW4KICAgWzE3OV1TZWN0aW9uIDguMTMuNy4KCiAgICAyLjIuNC4gU2VjdXJlIEhUVFAgQ29ubmVjdGlvbnMKCiAgIFNTTC9UTFMgKFNlY3VyZSBTb2NrZXRzIExheWVyIC8gVHJhbnNwb3J0IExheWVyIFNlY3VyaXR5KSBpcyB0aGUKICAgcHJvdG9jb2wgdXNlZCB0byBzZWN1cmUgSFRUUCwgU01UUCwgYW5kIG90aGVyIEludGVybmV0IGFwcGxpY2F0aW9ucy4KICAgU2VlIHRoZSBbMTgwXUMtS2VybWl0IFJlZmVyZW5jZSBTZWN0aW9uIDUuNCBmb3IgYW4gaW50cm9kdWN0aW9uIHRvCiAgIFNTTC9UTFMuIFRvIG1ha2UgYSBzZWN1cmUgSFRUUCBjb25uZWN0aW9uLCB5b3UgbmVlZDoKCiAgICAxLiBBIHNlY3VyZSBjbGllbnQgKGEgdmVyc2lvbiBvZiBDLUtlcm1pdCBvciBLZXJtaXQgOTUgd2l0aCBTU0wvVExTCiAgICAgICBzZWN1cml0eSBidWlsdCBpbikuIFR5cGUgImNoZWNrIHNzbCIgYXQgdGhlIEtlcm1pdCBwcm9tcHQgdG8gbWFrZQogICAgICAgc3VyZSB5b3UgaGF2ZSBpdC4KICAgIDIuIEEgc2VjdXJlIHNlcnZlciB0byBjb25uZWN0IHRvLgogICAgMy4gVGhlIENBIFJvb3QgQ2VydGlmaWNhdGUgdXNlZCB0byBhdXRoZW50aWNhdGUgdGhlIHNlcnZlciB0byB0aGUKICAgICAgIGNsaWVudC4gKHNlZSBbMTgxXVNlY3Rpb24gMTUgb2YgdGhlIHNlY3VyaXR5IHJlZmVyZW5jZSBmb3IgYW4KICAgICAgIGludHJvZHVjdGlvbiB0byBjZXJ0aWZpY2F0ZXMpLgoKICAgQW5kIHlvdSBtdXN0IG1ha2UgYSBjb25uZWN0aW9uIHRvIHRoZSBzZWN1cmUgSFRUUCBwb3J0OiBzZXJ2aWNlIG5hbWUKICAgSFRUUFMsIHBvcnQgbnVtYmVyIDQ0MyAoYXMgb3Bwb3NlZCB0byBzZXJ2aWNlIEhUVFAsIHBvcnQgODApLiBZb3UgY2FuCiAgIGFsc28gbWFrZSBzZWN1cmUgY29ubmVjdGlvbnMgdG8gb3RoZXIgcG9ydHMgYnkgaW5jbHVkaW5nIHRoZSAvVExTIG9yCiAgIC9TU0wgc3dpdGNoIHdpdGggdGhlIEhUVFAgT1BFTiBjb21tYW5kLCBpZiB0aGUgaG9zdCBzdXBwb3J0cyBTU0wvVExTCiAgIG9uIHRoZSBnaXZlbiBwb3J0OgoKICAgVGhlIHF1YWxpdHkgb2YgdGhlIFNTTC9UTFMgY29ubmVjdGlvbiBkZXBlbmRzIG9uIHRoZSBjaXBoZXIgc3VpdGUuCiAgIFRoZXJlIGFyZSBzZXZlcmFsIHBvc3NpYmlsaXRpZXM6CgogICBBbm9ueW1vdXMgY2lwaGVyIHN1aXRlOgogICAgICAgICAgSWYgYW4gYW5vbnltb3VzIGNpcGhlciBzdWl0ZSBpcyBuZWdvdGlhdGVkLCB0aGUgY29ubmVjdGlvbiBpcwogICAgICAgICAgZW5jcnlwdGVkIGJ1dCB0aGVyZSBpcyBubyBhdXRoZW50aWNhdGlvbi4gVGhpcyBjb25uZWN0aW9uIGlzCiAgICAgICAgICBzdWJqZWN0IHRvIGEgTWFuLUluLVRoZS1NaWRkbGUgKE1JVE0pIGF0dGFjay4KCiAgIFguNTA5IGNlcnRpZmljYXRlIG9uIHRoZSBzZXJ2ZXI6CiAgICAgICAgICBXaGVuIHlvdSBjb25uZWN0IHRvIGNlcnRhaW4gc2VjdXJlIHNlcnZlcnMsIGFuIFguNTA5CiAgICAgICAgICBjZXJ0aWZpY2F0ZSBpcyByZXR1cm5lZC4gVGhpcyBjZXJ0aWZpY2F0ZSBpcyBpc3N1ZWQgdG8gYQogICAgICAgICAgc3BlY2lhbCBob3N0bmFtZSwgc29tZXRoaW5nIGxpa2Ugd3d3MS54eXpjb3JwLmNvbSBvcgogICAgICAgICAgd3d3cy54eXpjb3JwLmNvbSAocmF0aGVyIHRoYW4gdGhlIG5vcm1hbCB3d3cueHl6Y29ycC5jb20pLiBJdAogICAgICAgICAgaXMgc2lnbmVkIGJ5IHRoZSBob3N0J3MgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IChDQSkuIElmIHRoZSBob3N0CiAgICAgICAgICBjZXJ0aWZpY2F0ZSBpcyBjb25maWd1cmVkIG9uIHRoZSBjbGllbnQsIGl0IGNhbiBiZSB1c2VkIHRvCiAgICAgICAgICB2ZXJpZnkgdGhlIGNlcnRpZmljYXRlIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlci4gSWYgdGhlCiAgICAgICAgICBjZXJ0aWZpY2F0ZSBpdCB2ZXJpZmllZCBhcyBhdXRoZW50aWMsIGEgY2hlY2sgaXMgbWFkZSB0byBlbnN1cmUKICAgICAgICAgIGl0IGhhcyBub3QgZXhwaXJlZCBhbmQgaXQgd2FzIGlzc3VlZCB0byB0aGUgaG9zdCB5b3Ugd2VyZQogICAgICAgICAgYXR0ZW1wdGluZyB0byBjb25uZWN0IHRvLiBJZiB5b3UgaGFkIGFza2VkIHRvIGNvbm5lY3QgdG8gKHNheSkKICAgICAgICAgIHd3dy54eXpjb3JwLmNvbSBidXQgd2VyZSBnaXZlbiBhIGNlcnRpZmljYXRlIGZvcgogICAgICAgICAgd3d3MS54eXpjb3JwLmNvbSwgeW91IHdvdWxkIGJlIHByb21wdGVkIGZvciBwZXJtaXNzaW9uIHRvCiAgICAgICAgICBjb250aW51ZS4KCiAgICAgICAgICBJZiB0aGUgdmVyaWZpY2F0aW9uIHN1Y2NlZWRlZCwgdGhlIGNvbm5lY3Rpb24gd291bGQgYmUKICAgICAgICAgIGVuY3J5cHRlZCB3aXRoIG9uZS13YXkgKHNlcnZlci10by1jbGllbnQpIGF1dGhlbnRpY2F0aW9uLiBUaGlzCiAgICAgICAgICBjb25uZWN0aW9uIGlzIG5vdCBzdWJqZWN0IHRvIGEgTUlUTSBhdHRhY2suCgogICAgICAgICAgSWYgYSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgYXJlIHRyYW5zbWl0dGVkIG92ZXIgdGhpcwogICAgICAgICAgY29ubmVjdGlvbiwgdGhleSBhcmUgbm90IHN1YmplY3QgdG8gaW50ZXJjZXB0aW9uLiBIb3dldmVyLCB0aGUKICAgICAgICAgIHN0YW5kYXJkIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBwYXNzaW5nIHRoZSBwYXNzd29yZCB0byB0aGUgaG9zdAogICAgICAgICAgZm9yIHZlcmlmaWNhdGlvbiBhcHBseTsgZm9yIGV4YW1wbGUsIGlmIHRoZSBob3N0IGhhcyBiZWVuCiAgICAgICAgICBjb21wcm9taXNlZCwgdGhlIHBhc3N3b3JkIHdpbGwgYmUgY29tcHJvbWlzZWQuCgogICBYLjUwOSBjbGllbnQgY2VydGlmaWNhdGU6CiAgICAgICAgICBJZiBhIGNvbm5lY3Rpb24gaGFzIGJlZW4gZXN0YWJsaXNoZWQgd2l0aCBhbiBYLjUwOSBzZXJ2ZXIKICAgICAgICAgIGNlcnRpZmljYXRlLCB0aGUgc2VydmVyIGNhbiBhc2sgdGhlIGNsaWVudCB0byBzZW5kIGEKICAgICAgICAgIGNlcnRpZmljYXRlIG9mIGl0cyBvd24uIFRoaXMgY2VydGlmaWNhdGUgbXVzdCBiZSB2ZXJpZmllZAogICAgICAgICAgYWdhaW5zdCBhIENBIFJvb3QgY2VydGlmaWNhdGUuIFRoZSBjZXJ0aWZpY2F0ZSBpdHNlbGYgKG9yCiAgICAgICAgICBzdWJqZWN0IGluZm8gZnJvbSB0aGUgY2VydGlmaWNhdGUpIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZQogICAgICAgICAgYXV0aG9yaXphdGlvbiBmb3IgdGhlIGNsaWVudCwgYW5kIGlmIHN1Y2Nlc3NmdWwsIHRoZSB1c2VybmFtZQogICAgICAgICAgYW5kIHBhc3N3b3JkIG5lZWQgbm90IGJlIHNlbnQgdG8gdGhlIHNlcnZlci4KCiAgIEtlcmJlcm9zIDU6CiAgICAgICAgICBJbnN0ZWFkIG9mIHVzaW5nIFguNTA5IGNlcnRpZmNhdGVzLCBLZXJiZXJvcyA1IGNhbiBiZSB1c2VkIHRvCiAgICAgICAgICBwZXJmb3JtIHRoZSBhdXRoZW50aWNhdGlvbiBhbmQga2V5IGV4Y2hhbmdlLiBJbiB0aGlzIHNpdHVhdGlvbiwKICAgICAgICAgIHRoZXJlIGlzIG11dHVhbCBhdXRoZW50aWNhdGlvbiBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHNlcnZlci4KICAgICAgICAgIFRoZSBLZXJiZXJvcyA1IHByaW5jaXBhbCBpcyB1c2VkIGJ5IHRoZSBzZXJ2ZXIgdG8gbG9vayB1cCB0aGUKICAgICAgICAgIGFwcHJvcHJpYXRlIGF1dGhvcml6YXRpb24gZGF0YS4gVGhlcmUgaXMgbm8gbmVlZCB0byBzZW5kCiAgICAgICAgICB1c2VybmFtZSBhbmQgcGFzc3dvcmQuCgogICBBbiBIVFRQIGNvbm5lY3Rpb24gaXMgbWFkZSB3aXRoIHRoZSBIVFRQIE9QRU4gY29tbWFuZDoKCiAgIEhUVFAgWyBzd2l0Y2hlcyBdIE9QRU4gWyB7IC9TU0wsIC9UTFMgfSBdIGhvc3QgWyBwb3J0IF0gCiAgICAgICAgICBJZiAvU1NMIG9yIC9UTFMgc3dpdGNoZXMgYXJlIGluY2x1ZGVkICh0aGVzZSBhcmUgc3lub255bXMpLCBvcgogICAgICAgICAgaWYgdGhlIHNlcnZpY2UgaXMgSFRUUFMgb3IgdGhlIHBvcnQgaXMgNDQzLCBhIHNlY3VyZSBjb25uZWN0aW9uCiAgICAgICAgICBpcyBhdHRlbXB0ZWQgdXNpbmcgdGhlIGN1cnJlbnQgYXV0aGVudGljYXRpb24gc2V0dGluZ3M7IHNlZQogICAgICAgICAgSEVMUCBTRVQgQVVUSEVOVElDQVRJT04gZm9yIGRldGFpbHMgKFsxODJdU2VjdGlvbiA2LjIgb2YgdGhlCiAgICAgICAgICBzZWN1cml0eSByZWZlcmVuY2UpLiBJZiB0aGUgbm8gL1NTTCBvciAvVExTIHN3aXRjaCBpcyBpbmNsdWRlZAogICAgICAgICAgYnV0IHRoZSBwb3J0IGlzIDQ0MyBvciB0aGUgc2VydmljZSBpcyBIVFRQUywgYSBzZWN1cmUKICAgICAgICAgIGNvbm5lY3Rpb24gaXMgYXR0ZW1wdGVkLiBJZiBhbiAvU1NMIG9yIC9UTFMgc3dpdGNoIGlzIGluY2x1ZGVkCiAgICAgICAgICBidXQgYSBwb3J0IGlzIG5vdCBzcGVjaWZpZWQsIGFuIFNTTC9UTFMgY29ubmVjdGlvbiBpcyBhdHRlbXB0ZWQKICAgICAgICAgIG9uIHRoZSBkZWZhdWx0IHBvcnQgKDgwKS4KCiAgIENlcnRpZmljYXRlcyBhcmUgY292ZXJlZCBpbiB0aGUgc2VwYXJhdGUgWzE4M11LZXJtaXQgU2VjdXJpdHkKICAgUmVmZXJlbmNlIGZvciBDLUtlcm1pdCA4LjAuIFlvdSBzaG91bGQgbGV0IEtlcm1pdCBrbm93IHRvIHZlcmlmeQogICBjZXJ0aWZpY2F0ZXMgd2l0aCB0aGUgU0VUIEFVVEhFTlRJQ0FUSU9OIFRMUyBjb21tYW5kLiBGb3IgZXhhbXBsZToKCiAgIFNFVCBBVVRIRU5USUNBVElPTiBUTFMgQ1JMLURJUiBkaXJlY3RvcnkKICAgICAgICAgIFNwZWNpZmllcyBhIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGNlcnRpZmljYXRlIHJldm9jYXRpb24KICAgICAgICAgIGZpbGVzIHdoZXJlIGVhY2ggZmlsZSBpcyBuYW1lZCBieSB0aGUgaGFzaCBvZiB0aGUgY2VydGlmaWNhdGUKICAgICAgICAgIHRoYXQgaGFzIGJlZW4gcmV2b2tlZC4KCiAgIFNFVCBBVVRIRU5USUNBVElPTiBUTFMgQ1JMLUZJTEUgZmlsZW5hbWUKICAgICAgICAgIFNwZWNpZmllcyBhIGZpbGUgdGhhdCBjb250YWlucyBhIGxpc3Qgb2YgY2VydGlmaWNhdGUKICAgICAgICAgIHJldm9jYXRpb25zLgoKICAgU0VUIEFVVEhFTlRJQ0FUSU9OIFRMUyBWRVJJRlktRElSIGRpcmVjdG9yeQogICAgICAgICAgU3BlY2lmaWVzIGEgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgcm9vdCBDQSBjZXJ0aWZpY2F0ZSBmaWxlcwogICAgICAgICAgdXNlZCB0byB2ZXJpZnkgdGhlIGNlcnRpZmljYXRlIGNoYWlucyBwcmVzZW50ZWQgYnkgdGhlIHBlZXIuCiAgICAgICAgICBFYWNoIGZpbGUgaXMgbmFtZWQgYnkgYSBoYXNoIG9mIHRoZSBjZXJ0aWZpY2F0ZS4KCiAgIFNFVCBBVVRIRU5USUNBVElPTiBUTFMgVkVSSUZZLUZJTEUgZmlsZW5hbWUKICAgICAgICAgIFNwZWNpZmllcyBhIGZpbGUgdGhhdCBjb250YWlucyByb290IENBIGNlcnRpZmljYXRlcyB0byBiZSB1c2VkCiAgICAgICAgICBmb3IgdmVyaWZ5aW5nIGNlcnRpZmljYXRlIGNoYWlucy4KCiAgIFNFVCBBVVRIRU5USUNBVElPTiBUTFMgVkVSSUZZIE9GRgogICAgICAgICAgVGVsbHMgS2VybWl0IG5vdCB0byByZXF1aXJlIGEgY2VydGlmaWNhdGUgYW5kIGFjY2VwdCBhbnkKICAgICAgICAgIGNlcnRpZmljYXRlIHRoYXQgaXMgcHJlc2VudGVkIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcwogICAgICAgICAgdmFsaWQuCgogICBUaGVyZSBhcmUgbWFueSBvdGhlciBvcHRpb25zOyBzZWUgdGhlIHNlY3VyaXR5IGRvY3VtZW50IGZvciBkZXRhaWxzLgoKICAgTm93IHN1cHBvc2UgeW91IG5lZWQgbmVlZCB0byBmZXRjaCB0aGUgZmlsZSBkZW5vdGVkIGJ5IHRoZSBmb2xsb3dpbmcKICAgVVJMOgoKICBodHRwczovL215dXNlcmlkOm15cGFzc3dvcmRAd3d3cy54eXpjb3JwLmNvbS9jbGllbnRzL2luZm8vc2VjcmV0Lmh0bWwKCiAgIE9uY2UgeW91IGhhdmUgc2V0IHVwIHRoZSBoYW5kbGluZyBvZiBjZXJ0aWZpY2F0ZXMgYXMgZGVzaXJlZCwgeW91IGNhbgogICB1c2UgdGhlIGZvbGxvd2luZyBLZXJtaXQgY29tbWFuZHM6CgogIGh0dHAgL3VzZXI6bXl1c2VyaWQgL3Bhc3N3b3JkOm15cGFzc3dvcmQgb3BlbiB3d3cxLnh5emNvcnAuY29tIGh0dHBzCiAgaWYgc3VjY2VzcyB7CiAgICAgIGh0dHAgZ2V0IC9jbGllbnRzL2luZm8vc2VjcmV0Lmh0bWwKICAgICAgaHR0cCBjbG9zZQogIH0KCiAgIEFzIGFub3RoZXIgZXhhbXBsZSwgbGV0J3Mgc2F5IHRoYXQgeW91IGhhdmUgYSB3ZWIgZm9ybSB5b3UgbmVlZCB0bwogICBwb3B1bGF0ZSB3aXRoIHRocmVlIGZpZWxkczogcmVkLHdoaXRlIGFuZCBibHVlLgoKICA8Rk9STSBBQ1RJT049Imh0dHA6Ly93d3cueHl6Y29ycC5jb20vY2dpLWJpbi9mb3JtLmNnaSIgTUVUSE9EPSJQT1NUIj4KICA8SU5QVVQgTkFNRT0iUmVkIj4KICA8SU5QVVQgTkFNRT0iV2hpdGUiPgogIDxJTlBVVCBOQU1FPSJCbHVlIj4KICA8L0ZPUk0+CgogICBZb3UgY2FuIGhhbmRsZSB0aGlzIHdpdGggdGhlIEhUVFAgUE9TVCBjb21tYW5kLiBUaGUgZGF0YSB0byBiZSBwb3N0ZWQKICAgaXMgc3RvcmVkIGluIHRoZSBsb2NhbCBmaWxlIGRhdGEudHh0LgoKICBSZWQ9c2V2ZW4gc3RyaXBlcyZXaGl0ZT1zaXggc3RyaXBlcyZCbHVlPWZpZnR5IHN0YXJzCgogICBhbmQgdGhlIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlciB3aWxsIGJlIHN0b3JlZCBpbnRvIHJlc3BvbnNlLnR4dC4KCiAgaHR0cCBvcGVuIHd3dy54eXpjb3JwLmNvbSBodHRwCiAgaWYgc3VjY2VzcyB7CiAgICBodHRwIC9hcnJheTpjIHBvc3QgZGF0YS50eHQgL2NnaS1iaW4vZm9ybS5jZ2kgcmVzcG9uc2UudHh0CiAgICBodHRwIGNsb3NlCiAgfQoKICAgSW4gdGhpcyBzY2VuYXJpbywgdGhlIENvbW1vbiBHYXRld2F5IEludGVyZmFjZSAoQ0dJKSBzZW5kcyBhIHJlc3BvbnNlCiAgIHdoZXRoZXIgaXQgc3VjY2VlZHMgb3IgZmFpbHMgaW4gYSBzY3JpcHQtZGVwZW5kZW50IG1hbm5lci4gVGhlIHNjcmlwdAogICBjYW4gZWl0aGVyIHJlcG9ydCBzdWNjZXNzIGFuZCBlbmNsb3NlIHRoZSByZXNwb25zZSBkYXRhOyBvciBpdCBtaWdodAogICBzZW5kIGEgMzAyIEZvdW5kIGVycm9yIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSAiTG9jYXRpb246IiBoZWFkZXIKICAgc2hvdWxkIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBVUkwgYXQgd2hpY2ggdGhlIGRhdGEgY2FuIGJlIGZvdW5kLgoKICAgIDIuMi41LiBIVFRQIFZhcmlhYmxlcwoKICAgXHYoaHR0cF9jb2RlKQogICAgICAgICAgVGhlIEhUVFAgcHJvdG9jb2wgY29kZSBudW1iZXIgb2YgdGhlIG1vc3QgcmVjZW50IHNlcnZlciByZXBseSwKICAgICAgICAgIGUuZy4gNDA0IGZvciAibm90IGZvdW5kIi4KCiAgIFx2KGh0dHBfY29ubmVjdGVkKQogICAgICAgICAgMSB3aGVuIGFuIEhUVFAgY29ubmVjdGlvbiBpcyBvcGVuLCAwIHdoZW4gdGhlcmUgaXMgbm8gSFRUUAogICAgICAgICAgY29ubmVjdGlvbi4KCiAgIFx2KGh0dHBfaG9zdCkKICAgICAgICAgIElmIGFuIEhUVFAgY29ubmVjdGlvbiBpcyBvcGVuLCB0aGUgaG9zdG5hbWU6cG9ydCwgZS5nLgogICAgICAgICAgd3d3LmNvbHVtYmlhLmVkdTo4MDsgb3RoZXJ3aXNlLCBlbXB0eS4KCiAgIFx2KGh0dHBfbWVzc2FnZSkKICAgICAgICAgIFNlcnZlciBlcnJvciBtZXNzYWdlLCBpZiBhbnksIGZyb20gbW9zdCByZWNlbnQgSFRUUCBjb21tYW5kLgoKICAgXHYoaHR0cF9zZWN1cml0eSkKICAgICAgICAgIEEgbGlzdCBvZiB0aGUgc2VjdXJpdHkgcGFyYW1ldGVycyBhbmQgdmFsdWVzIGZvciB0aGUgY3VycmVudAogICAgICAgICAgY29ubmVjdGlvbiwgaWYgYW55LiBFbXB0eSBpZiB0aGUgY29ubmVjdGlvbiBpcyBub3QgdG8gYSBzZWN1cmUKICAgICAgICAgIHNlcnZlciwgb3IgdGhlcmUgaXMgbm8gY29ubmVjdGlvbi4KCiAgIFRvIGRpc3BsYXkgYWxsIHRoZSBIVFRQIHZhcmlhYmxlcyBhdCBvbmNlLCB0eXBlIFNIT1cgVkFSIEhUVFA6CgogIEMtS2VybWl0PiBodHRwIG9wZW4gd3d3LmNvbHVtYmlhLmVkdQogIEMtS2VybWl0PiBodHRwIGdldCBsa2psa2psa2psa2ogCiAgQy1LZXJtaXQ+IHNobyB2YXIgaHR0cAogICBcdihodHRwX2NvZGUpID0gNDA0CiAgIFx2KGh0dHBfY29ubmVjdGVkKSA9IDEKICAgXHYoaHR0cF9ob3N0KSA9IHd3dy5jb2x1bWJpYS5lZHU6ODAKICAgXHYoaHR0cF9tZXNzYWdlKSA9IE5vdCBGb3VuZAogICBcdihodHRwX3NlY3VyaXR5KSA9IE5VTEwKICBDLUtlcm1pdD4KCiAgICAyLjIuNi4gVGhlIEhUVFAgQ29tbWFuZC1MaW5lIFBlcnNvbmFsaXR5CgogICBJZiB5b3UgaW52b2tlIEMtS2VybWl0IHdpdGggdGhlIG5hbWUgImh0dHAiIG9yICJodHRwcyIsIHlvdSBjYW4gdXNlIGEKICAgc3BlY2lhbCBzZXQgb2YgSFRUUC1zcGVjaWZpYyBjb21tYW5kLWxpbmUgb3B0aW9ucy4gWW91IGNhbiBkbyB0aGlzIGJ5CiAgIGNyZWF0aW5nIGEgc3ltYm9saWMgbGlua2UgImh0dHAiIG9yICJodHRwcyIgdG8gdGhlIEMtS2VybWl0IDguMAogICBleGVjdXRhYmxlLCBvciBieSBoYXZpbmcgYSBzZXBhcmF0ZSBjb3B5IG9mIGl0IGNhbGxlZCAiaHR0cCIgb3IKICAgImh0dHBzIi4gSGVyZSdzIHRoZSB1c2FnZSBtZXNzYWdlICgiaHR0cCAtaCIpOgoKICBVc2FnZTogLi9odHRwIGhvc3QgWyBvcHRpb25zLi4uIF0KICAgLWggICAgICAgICAgICAgVGhpcyBtZXNzYWdlLgogICAtZCAgICAgICAgICAgICBEZWJ1ZyB0byBkZWJ1Zy5sb2cuCiAgIC1TICAgICAgICAgICAgIFN0YXkgKGlzc3VlIGNvbW1hbmQgcHJvbXB0IHdoZW4gZG9uZSkuCiAgIC1ZICAgICAgICAgICAgIERvIG5vdCBleGVjdXRlIEtlcm1pdCBpbml0aWFsaXphdGlvbiBmaWxlLgogICAtcSAgICAgICAgICAgICBRdWlldCAoc3VwcHJlc3MgbW9zdCBtZXNzYWdlcykuCiAgIC11IG5hbWUgICAgICAgIFVzZXJuYW1lLgogICAtUCBwYXNzd29yZCAgICBQYXNzd29yZC4KICAgLWcgcGF0aG5hbWUgICAgR2V0IHJlbW90ZSBwYXRobmFtZS4KICAgLXAgcGF0aG5hbWUgICAgUHV0IHJlbW90ZSBwYXRobmFtZS4KICAgLUggcGF0aG5hbWUgICAgSGVhZCByZW1vdGUgcGF0aG5hbWUuCiAgIC1sIHBhdGhuYW1lICAgIExvY2FsIHBhdGggZm9yIC1nLCAtcCwgYW5kIC1ILgogICAteiBvcHRbPXZhbHVlXSBTZWN1cml0eSBvcHRpb25zLi4uCiAgICAgIGNlcnQ9ZmlsZSAgIENsaWVudCBjZXJ0aWZpY2F0ZSBmaWxlCiAgICAgIGNlcnRzb2sgICAgIEFjY2VwdCBhbGwgY2VydGlmaWNhdGVzCiAgICAgIGtleT1maWxlICAgIENsaWVudCBwcml2YXRlIGtleSBmaWxlCiAgICAgIHNlY3VyZSAgICAgIFVzZSBTU0wKICAgICAgdmVyaWZ5PW4gICAgMCA9IG5vbmUsIDEgPSBwZWVyICwgMiA9IGNlcnRpZmljYXRlIHJlcXVpcmVkCgogICBUaGUgImhvc3QiIGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIGEgV2ViIGhvc3QsIGUuZy4gd3d3LmNvbHVtYmlhLmVkdS4KICAgVGhlIGFjdGlvbiBvcHRpb25zIGFyZSAtcCwgLWcsIGFuZCAtSC4gSWYgeW91IGdpdmUgYW4gYWN0aW9uIG9wdGlvbiwKICAgS2VybWl0IGRvZXMgdGhlIGFjdGlvbiBhbmQgdGhlbiBleGl0cy4gSWYgeW91IGdpdmUgYSBob3N0IHdpdGhvdXQgYW4KICAgYWN0aW9uIG9wdGlvbiwgS2VybWl0IG1ha2VzIGFuIEhUVFAgY29ubmVjdGlvbiB0byB0aGUgaG9zdCBhbmQgdGhlbgogICBnaXZlcyB5b3UgdGhlIEMtS2VybWl0IHByb21wdC4gSGVyZSdzIGEgc2ltcGxlIGV4YW1wbGUgdGhhdCBmZXRjaGVzIGEKICAgcHVibGljbHkgcmVhZGFibGUgV2ViIHBhZ2U6CgogIGh0dHAgd3d3LmNvbHVtYmlhLmVkdSAtZyBrZXJtaXQvaW5kZXguaHRtbAoKICAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgd2Vic2l0ZSBmb3Igd2hpY2ggYSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgYXJlCiAgIHJlcXVpcmVkLCB5b3UgY2FuIHN1cHBseSB0aGVtIG9uIHRoZSBjb21tYW5kIGxpbmUgd2l0aCAtdSBhbmQgLVAuIElmCiAgIHlvdSBpbmNsdWRlIGEgdXNlcm5hbWUgYnV0IG9taXQgdGhlIHBhc3N3b3JkLCBLZXJtaXQgcHJvbXB0cyB5b3UgZm9yCiAgIGl0OgoKICBodHRwIHd3dy5jb2x1bWJpYS5lZHUgLXUgb2xnYSAtcCBrZXJtaXQvaW5kZXguaHRtbCAtbCBpbmRleC5odG1sCiAgUGFzc3dvcmQ6CgogICBOb3RlIHRoYXQgd2hlbiBQVVQnaW5nIGZpbGVzIHRvIHdlYnNpdGVzLCB5b3UgaGF2ZSB0byBzdXBwbHkgYm90aCB0aGUKICAgLXAgKHJlbW90ZSBwYXRobmFtZSkgYW5kIC1sIChsb2NhbCBwYXRoKSBvcHRpb25zLgoKICAgSWYgeW91ciB2ZXJzaW9uIG9mIEtlcm1pdCBpcyBidWlsdCB3aXRoIFNTTC9UTFMgc2VjdXJpdHksIHlvdSBjYW4gYWxzbwogICB1c2UgdGhlIC16IG9wdGlvbiB0byBtYWtlIHNlY3VyZSBIVFRQIChodHRwcykgY29ubmVjdGlvbnMuCgogICBGaW5hbGx5LCBhcyBub3RlZCBpbiBbMTg0XVNlY3Rpb24gMTYsIHlvdSBjYW4gYWxzbyBnaXZlIGEgVVJMIGluc3RlYWQKICAgb2YgYSBob3N0IG5hbWUgYW5kIG9wdGlvbnMuCgogICBbIFsxODVdVG9wIF0gWyBbMTg2XUNvbnRlbnRzIF0gWyBbMTg3XUMtS2VybWl0IEhvbWUgXSBbIFsxODhdS2VybWl0CiAgIEhvbWUgXQogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgozLiBUSEUgQlVJTFQtSU4gRlRQIENMSUVOVAoKICAgICAzLjEuICBbMTg5XU1ha2luZyBhbmQgTWFuYWdpbmcgRlRQIENvbm5lY3Rpb25zCiAgICAgMy4yLiAgWzE5MF1NYWtpbmcgU2VjdXJlIEZUUCBDb25uZWN0aW9ucwogICAgIDMuMy4gIFsxOTFdU2V0dGluZyBGVFAgUHJlZmVyZW5jZXMKICAgICAzLjQuICBbMTkyXU1hbmFnaW5nIERpcmVjdG9yaWVzIGFuZCBGaWxlcwogICAgIDMuNS4gIFsxOTNdVXBsb2FkaW5nIEZpbGVzIFdpdGggRlRQCiAgICAgMy42LiAgWzE5NF1Eb3dubG9hZGluZyBGaWxlcyBXaXRoIEZUUAogICAgIDMuNy4gIFsxOTVdVHJhbnNsYXRpbmcgQ2hhcmFjdGVyIFNldHMKICAgICAzLjguICBbMTk2XUZUUCBDb21tYW5kIFNob3J0Y3V0cwogICAgIDMuOS4gIFsxOTddRHVhbCBTZXNzaW9ucwogICAgIDMuMTAuIFsxOThdQXV0b21hdGluZyBGVFAgU2Vzc2lvbnMKICAgICAzLjExLiBbMTk5XUFkdmFuY2VkIEZUUCBQcm90b2NvbCBGZWF0dXJlcwoKICAgRWFybGllciB2ZXJzaW9ucyBvZiBDLUtlcm1pdCBhbmQgSzk1IGluY2x1ZGVkIGFuIEZUUCBjb21tYW5kLCBidXQgaXQKICAgc2ltcGx5IGludm9rZWQgYW4gZXh0ZXJuYWwgRlRQIGNsaWVudC4gTm93LCBieSBwb3B1bGFyIGRlbWFuZCwgS2VybWl0CiAgIGluY2x1ZGVzIGl0cyBvd24gYnVpbHQtaW4gRlRQIGNsaWVudCB0aGF0IG9mZmVycyB0aGUgZm9sbG93aW5nCiAgIGFkdmFudGFnZXMgb3ZlciB0cmFkaXRpb25hbCBGVFAgY2xpZW50cyAoYW5kIGl0cyBwcmV2aW91cyBpbnRlcmZhY2UgdG8KICAgdGhlbSk6CgogICAgICogQW55IG9mIEtlcm1pdCdzIGJ1aWx0LWluIFsyMDBdc2VjdXJpdHkgbWV0aG9kcyBjYW4gYmUgdXNlZCB0bwogICAgICAgZXN0YWJsaXNoIGFuZCBjb25kdWN0IHNlY3VyZSBGVFAgc2Vzc2lvbnMgd2l0aCBbMjAxXUZUUCBzZXJ2ZXJzCiAgICAgICB0aGF0IHN1cHBvcnQgdGhlc2UgbWV0aG9kcy4gKFNlY3VyaXR5IG1vZHVsZXMgY2FuIGJlIHN1YmplY3QgdG8KICAgICAgIGV4cG9ydCByZXN0cmljdGlvbnMuKQogICAgICogS2VybWl0J3MgRlRQIGNsaWVudCB1c2VzICJwYXNzaXZlIG1vZGUiIGJ5IGRlZmF1bHQgdG8gYXZvaWQKICAgICAgIGJsb2NrYWdlIGJ5IGZpcmV3YWxscyBhbmQgbmV0d29yayBhZGRyZXNzIHRyYW5zbGF0b3JzLiBPZiBjb3Vyc2UKICAgICAgIGFjdGl2ZSBtb2RlIGNhbiBiZSBjaG9zZW4gdG9vIHdoZW4gbmVlZGVkLgogICAgICogWzIwMl1DaGFyYWN0ZXIgc2V0cyBjYW4gYmUgdHJhbnNsYXRlZCBhcyBwYXJ0IG9mIHRoZSB0cmFuc2ZlcgogICAgICAgcHJvY2VzcyBldmVuIHdoZW4gdGhlIEZUUCBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBjaGFyYWN0ZXItc2V0CiAgICAgICB0cmFuc2xhdGlvbiwgaW5jbHVkaW5nIHRvL2Zyb20gdGhlIG5ldyBJbnRlcm5ldCBzdGFuZGFyZAogICAgICAgaW50ZXJuYXRpb25hbCBjaGFyYWN0ZXIgc2V0LCBbMjAzXVVuaWNvZGUgVVRGLTguIFRoaXMgaW5jbHVkZXMKICAgICAgIGJvdGggdGhlIGZpbGUncyBuYW1lIGFuZCAoZm9yIHRleHQgZmlsZXMgb25seSkgaXRzIGNvbnRlbnRzLgogICAgICogQWxsIG9mIEMtS2VybWl0J3MgWzIwNF1maWxlLXNlbGVjdGlvbiBtZWNoYW5pc21zIGFyZSBhdmFpbGFibGU6CiAgICAgICBzaXplLCBkYXRlLCBuYW1lIHBhdHRlcm5zIGFuZCBsaXN0cywgZXhjZXB0aW9uIGxpc3RzLCBldGMuCiAgICAgKiBbMjA1XUF0b21pYyBmaWxlIG1vdmVtZW50IGNhcGFiaWxpdGllcyBhcmUgcHJvdmlkZWQgKGRlbGV0ZSwgbW92ZSwKICAgICAgIG9yIHJlbmFtZSBmaWxlcyBhdXRvbWF0aWNhbGx5IGFmdGVyIHN1Y2Nlc3NmdWwgdHJhbnNmZXIpLgogICAgICogVGhlIGNvcnJlY3QgZmlsZSB0eXBlLCAiYXNjaWkiIChpLmUuIHRleHQpIG9yIGJpbmFyeSwgaXMgY2hvc2VuCiAgICAgICBhdXRvbWF0aWNhbGx5IGZvciBlYWNoIGZpbGUgKGV4cGxhaW5lZCBpbiBbMjA2XVNlY3Rpb24gNCksIGFuZCBhbnkKICAgICAgIG1peHR1cmUgb2YgdGV4dCBhbmQgYmluYXJ5IGZpbGVzIGNhbiBiZSBzZW50IGluIGEgc2luZ2xlCiAgICAgICBvcGVyYXRpb24sIGV2ZW4gYWNyb3NzIHBsYXRmb3Jtcy4KICAgICAqIFVwZGF0ZSBtb2RlICgiZG9uJ3QgYm90aGVyIHRyYW5zZmVycmluZyBmaWxlcyB0aGF0IGRpZG4ndCBjaGFuZ2UKICAgICAgIHNpbmNlIGxhc3QgdGltZSIpIGFuZCByZWNvdmVyeSAocmVzdW1wdGlvbiBvZiBhbiBpbnRlcnJ1cHRlZAogICAgICAgdHJhbnNmZXIgZnJvbSB0aGUgcG9pbnQgb2YgZmFpbHVyZSkgYXJlIGF2YWlsYWJsZSBpbiBib3RoCiAgICAgICBkaXJlY3Rpb25zLgogICAgICogV2hlbiB1cGxvYWRpbmcgZmlsZXMgZnJvbSBVTklYIHRvIFVOSVgsIHRoZSBmaWxlJ3MgcGVybWlzc2lvbnMgY2FuCiAgICAgICBiZSBwcmVzZXJ2ZWQgaWYgZGVzaXJlZC4KICAgICAqIFJlY3Vyc2l2ZSBkaXJlY3RvcnktdHJlZSBQVVRzIGFyZSBzdXBwb3J0ZWQgYmV0d2VlbiBhbnkgdHdvCiAgICAgICBwbGF0Zm9ybXMgdGhhdCBoYXZlIHRyZWUtc3RydWN0dXJlZCBmaWxlIHN5c3RlbXMuIFJlY3Vyc2l2ZSBHRVRzCiAgICAgICBhcmUgc3VwcG9ydGVkIGJldHdlZW4gbGlrZSBwbGF0Zm9ybXMgaWYgdGhlIHNlcnZlciBjb29wZXJhdGVzIGFuZAogICAgICAgYmV0d2VlbiBsaWtlIG9yIHVubGlrZSBwbGF0Zm9ybXMgaWYgdGhlIHNlcnZlciBzdXBwb3J0cyBNTFNECiAgICAgICAoWzIwN11TZWN0aW9uIDMuMTEpLgogICAgICogV2hlbiByZWNlaXZpbmcgZmlsZXMsIGFsbCBvZiBLZXJtaXQncyBmaWxlIGNvbGxpc2lvbiBhY3Rpb25zIGFyZQogICAgICAgYXZhaWxhYmxlOiBiYWNrdXAsIHVwZGF0ZSwgcmVmdXNlLCByZW5hbWUsIGV0Yy4KICAgICAqIE11bHRpLWZpbGUgdHJhbnNmZXJzIGNhbiBiZSBpbnRlcnJ1cHRlZCBvbiBhIHBlci1maWxlIGJhc2lzLAogICAgICAgYXV0b21hdGljYWxseSBza2lwcGluZyB0byB0aGUgbmV4dCBmaWxlLgogICAgICogRlRQIHNlc3Npb25zIGFyZSBbMjA4XWZ1bGx5IHNjcmlwdGFibGUuCiAgICAgKiBBbiBlbnRpcmUgRlRQIHNlc3Npb24gKGNvbm5lY3QsIGxvZ2luLCBDRCwgdXBsb2FkIG9yIGRvd25sb2FkLAogICAgICAgbG9nb3V0KSBjYW4gYmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUgd2l0aG91dCB1c2luZyBhCiAgICAgICBzY3JpcHQuCiAgICAgKiBBbGwgb2YgS2VybWl0J3MgbG9nZ2luZyBvcHRpb25zIGFuZCBmb3JtYXRzIGFyZSBhdmFpbGFibGUgdG8ga2VlcAogICAgICAgYW4gYWNjdXJhdGUgYW5kIGNvbXBsZXRlIHJlY29yZCBvZiBlYWNoIGNvbm5lY3Rpb24gYW5kIGZpbGUKICAgICAgIHRyYW5zZmVyLCBhbmQgdG8gYWlkIGluIHRyb3VibGVzaG9vdGluZy4KICAgICAqIEFsbCBvZiBLZXJtaXQncyBmaWxlLXRyYW5zZmVyIGRpc3BsYXkgb3B0aW9ucyBhcmUgYXZhaWxhYmxlCiAgICAgICAoZnVsbHNjcmVlbiwgYnJpZWYsIENSVCwgc2VyaWFsLCBub25lKS4KCiAgIEFuZCBiZXN0IG9mIGFsbDoKICAgICAqIEtlcm1pdCBkb2Vzbid0IGdpdmUgeW91IHRob3NlIGFubm95aW5nIHBlci1maWxlIHByb21wdHMgZXZlcnkgdGltZQogICAgICAgeW91IHN0YXJ0IGEgbXVsdGktZmlsZSB0cmFuc2ZlciB3aXRob3V0IHJlbWVtYmVyaW5nIHRvIGdpdmUgYQogICAgICAgInByb21wdCIgY29tbWFuZCBmaXJzdCA6LSkuCgogICBbIFsyMDldVG9wIF0gWyBbMjEwXUZUUCBUb3AgXSBbIFsyMTFdRlRQIENsaWVudCBPdmVydmlldyBdIFsgWzIxMl1GVFAKICAgU2NyaXB0IFR1dG9yaWFsIF0gWyBbMjEzXUMtS2VybWl0IEhvbWUgXSBbIFsyMTRdS2VybWl0IEhvbWUgXQogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDMuMS4gTWFraW5nIGFuZCBNYW5hZ2luZyBGVFAgQ29ubmVjdGlvbnMKCiAgIEVhY2ggY29weSBvZiBLZXJtaXQgY2FuIGhhdmUgb25lIEZUUCBjb25uZWN0aW9uIG9wZW4gYXQgYSB0aW1lLiBGVFAKICAgY29ubmVjdGlvbnMgYXJlIGluZGVwZW5kZW50IG9mIHJlZ3VsYXIgdGVybWluYWwgY29ubmVjdGlvbnM7IGEKICAgdGVybWluYWwgY29ubmVjdGlvbiAoc2VyaWFsIG9yIG5ldHdvcmsgdmlhIFNFVCBMSU5FLCBESUFMLCBTRVQgSE9TVCwKICAgVEVMTkVULCBldGMpIG1heSBiZSwgYnV0IG5lZWQgbm90IGJlLCBvcGVuIGF0IHRoZSBzYW1lIHRpbWUgYXMgYW4gRlRQCiAgIGNvbm5lY3Rpb24sIGFuZCB0ZXJtaW5hbCBjb25uZWN0aW9ucyBjYW4gYWxzbyBiZSBjbG9zZWQsIGFuZCBuZXcKICAgY29ubmVjdGlvbnMgb3BlbmVkLCB3aXRob3V0IGludGVyZmVyaW5nIHdpdGggdGhlIEZUUCBjb25uZWN0aW9uIChhbmQKICAgdmljZSB2ZXJzYSkuIFRodXMsIGZvciBleGFtcGxlLCBLZXJtaXQgY2FuIGhhdmUgYW4gRlRQIGNvbm5lY3Rpb24gYW5kCiAgIGEgVEVMTkVUIGNvbm5lY3Rpb24gb3BlbiB0byB0aGUgc2FtZSBob3N0IHNpbXVsdGFuZW91c2x5LCB1c2luZyB0aGUKICAgVEVMTkVUIGNvbm5lY3Rpb24gKGUuZy4pIHRvIHNlbmQgbWFpbCBvciB0YWtlIG90aGVyIGRlc2lyZWQgYWN0aW9ucyBhcwogICB2YXJpb3VzIEZUUCBhY3Rpb25zIGNvbXBsZXRlLiBPZiBjb3Vyc2UsIGVhY2ggY29weSBvZiBLZXJtaXQgY2FuIGRvCiAgIG9ubHkgb25lIHRoaW5nIGF0IGEgdGltZSwgc28gaXQgY2FuJ3QgKGZvciBleGFtcGxlKSB0cmFuc2ZlciBhIGZpbGUKICAgd2l0aCBGVFAgYW5kIGFub3RoZXIgZmlsZSB3aXRoIEtlcm1pdCBwcm90b2NvbCBzaW11bHRhbmVvdXNseS4KCiAgIEEgS2VybWl0IEZUUCBzZXNzaW9uIGNhbiBiZSBlc3RhYmxpc2hlZCBieSBbMjE1XWNvbW1hbmQtbGluZSBvcHRpb25zLAogICBieSBbMjE2XVVSTCwgb3IgYnkgWzIxN11pbnRlcmFjdGl2ZSBjb21tYW5kcy4KCiAgICAzLjEuMS4gS2VybWl0IENvbW1hbmQtTGluZSBPcHRpb25zIGZvciBGVFAKCiAgIFRoZSBuZXcgY29tbWFuZC1saW5lIG9wdGlvbiAnLTknIChzb3JyeSwgd2UncmUgb3V0IG9mIGxldHRlcnMpIGNhbiBiZQogICB1c2VkIHdoZW4gc3RhcnRpbmcgQy1LZXJtaXQsIHRlbGxpbmcgaXQgdG8gbWFrZSBhbiBGVFAgY29ubmVjdGlvbjoKCiAga2VybWl0IC05IGhvc3RuYW1lCgogICBvciBpZiBhIG5vbi1kZWZhdWx0IEZUUCBwb3J0IGlzIG5lZWRlZDoKCiAga2VybWl0IC05IGhvc3RuYW1lOnBvcnQKCiAgIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IHRoZSB1c2VybmFtZSBvbiB0aGUgY29tbWFuZCBsaW5lIHdpdGggdGhlIC1NICgiTXkKICAgVXNlciBJRCIpIG9wdGlvbiB0aGF0IHdhcyBhbHJlYWR5IHRoZXJlIGZvciBvdGhlciBjb25uZWN0aW9uIHR5cGVzOgoKICBrZXJtaXQgLTkgaG9zdG5hbWUgLU0gb2xnYQoKICAgSWYgeW91IHNwZWNpZnkgdGhlIHVzZXJuYW1lIG9uIHRoZSBjb21tYW5kIGxpbmUsIEtlcm1pdCB1c2VzIGl0IHdoZW4KICAgbWFraW5nIHRoZSBjb25uZWN0aW9uIGFuZCBkb2VzIG5vdCBwcm9tcHQgeW91IGZvciBpdCAoYnV0IGl0IGRvZXMKICAgcHJvbXB0IHlvdSBmb3IgdGhlIHBhc3N3b3JkIGlmIG9uZSBpcyByZXF1aXJlZCkuCgogICBPbmNlIHRoZSBjb25uZWN0aW9uIGlzIG1hZGUsIHlvdSBnZXQgdGhlIHJlZ3VsYXIgS2VybWl0IHByb21wdCwgYW5kCiAgIGNhbiBnaXZlIGludGVyYWN0aXZlIGNvbW1hbmRzIHN1Y2ggYXMgdGhlIG9uZXMgZGVzY3JpYmVkIGJlbG93LiBXaGVuCiAgIHlvdSBnaXZlIGEgQllFIGNvbW1hbmQsIEtlcm1pdCBjbG9zZXMgdGhlIHNlc3Npb24gYW5kIGV4aXRzLCBqdXN0IGFzIGEKICAgcmVndWxhciBGVFAgY2xpZW50IHdvdWxkIGRvLiBJZiB5b3UgZG9uJ3Qgd2FudCBLZXJtaXQgdG8gZXhpdCB3aGVuIHlvdQogICBnaXZlIGEgQllFIGNvbW1hbmQsIGluY2x1ZGUgdGhlIC1TICgiU3RheSIpIG9wdGlvbiBvbiB0aGUgY29tbWFuZAogICBsaW5lLgoKICAgT3RoZXIgS2VybWl0IGNvbW1hbmQtbGluZSBvcHRpb25zIHRoYXQgYXJlIG5vdCBzcGVjaWZpYyB0byBub24tRlRQCiAgIGNvbm5lY3Rpb25zIHNob3VsZCBhZmZlY3QgdGhlIEZUUCBzZXNzaW9uIGluIHRoZSBleHBlY3RlZCB3YXlzOyBmb3IKICAgZXhhbXBsZSwgLWkgYW5kIC1UIGZvcmNlIGJpbmFyeSBhbmQgdGV4dCBtb2RlIHRyYW5zZmVycywgcmVzcGVjdGl2ZWx5LgoKICAgRmlsZSB0cmFuc2ZlcnMgY2FuIG5vdCBiZSBpbml0aWF0ZWQgb24gdGhlICJrZXJtaXQgLTkiIGNvbW1hbmQgbGluZTsKICAgZm9yIHRoYXQgeW91IG5lZWQgdG8gdXNlIEtlcm1pdCdzIEZUUCBwZXJzb25hbGl0eSAobmV4dCBzZWN0aW9uKSBvcgogICB5b3UgY2FuIHVzZSBVUkxzIChbMjE4XVNlY3Rpb24gMy4xLjMpLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgMy4xLjIuIFRoZSBGVFAgQ29tbWFuZC1MaW5lIFBlcnNvbmFsaXR5CgogICBJZiB5b3Ugd2FudCB0byByZXBsYWNlIHlvdXIgcmVndWxhciBGVFAgY2xpZW50IHdpdGggQy1LZXJtaXQsIHlvdSBjYW4KICAgbWFrZSBhIGxpbmsgY2FsbGVkICJmdHAiIHRvIHRoZSBDLUtlcm1pdCBiaW5hcnkgKG9yIHlvdSBjYW4gc3RvcmUgYQogICBjb3B5IG9mIHRoZSBDLUtlcm1pdCBiaW5hcnkgdW5kZXIgdGhlIG5hbWUgImZ0cCIpLiBXaGVuIEMtS2VybWl0IGlzCiAgIGludm9rZWQgd2l0aCBhIHByb2dyYW0gbmFtZSBvZiAiZnRwIiAob3IgIkZUUCIsIGNhc2UgZG9lc24ndCBtYXR0ZXIpLAogICBpdCBhc3N1bWVzIHRoZSBjb21tYW5kLWxpbmUgcGVyc29uYWxpdHkgb2YgdGhlIHJlZ3VsYXIgRlRQIGNsaWVudDoKCiAgZnRwIFsgb3B0aW9ucyBdIGhvc3RuYW1lIFsgcG9ydCBdCgogICBJbiB0aGlzIGNhc2UgdGhlIG9wdGlvbnMgYXJlIGxpa2UgdGhvc2Ugb2YgYSByZWd1bGFyIEZUUCBjbGllbnQ6CgogIC1kICBEZWJ1ZzogZW5hYmxlcyBkZWJ1ZyBtZXNzYWdlcyBhbmQgY3JlYXRlcyBhIGRlYnVnLmxvZyBmaWxlLgogIC1uICBObyBhdXRvbG9naW46IEtlcm1pdCBzaG91bGQgbm90IHNlbmQgeW91ciB1c2VyIElEIGF1dG9tYXRpY2FsbHkuCiAgLXQgIFBhY2tldCB0cmFjZTogYWNjZXB0ZWQgYnV0IGlzIHRyZWF0ZWQgdGhlIHNhbWUgYXMgLWQuCiAgLXYgIFZlcmJvc2U6IGFjY2VwdGVkIGJ1dCBpZ25vcmVkIChvcGVyYXRpb24gaXMgdmVyYm9zZSBieSBkZWZhdWx0KS4KICAtaSAgTm90IGludGVyYWN0aXZlOiBhY2NlcHRlZCBidXQgaWdub3JlZC4KCiAgIGFuZCB0aGUgaG9zdG5hbWUgY2FuIGFsc28gYmUgYSBVUkwgKGV4cGxhaW5lZCBpbiBbMjE5XVNlY3Rpb24gMy4xLjMpLgogICBUbyBzcGVjaWZ5IGEgbm9uLWRlZmF1bHQgVENQIHBvcnQgZm9yIHRoZSBGVFAgc2VydmVyLCBpbmNsdWRlIHRoZSBwb3J0CiAgIG51bWJlciBvciBuYW1lIGFmdGVyIHRoZSBob3N0bmFtZS4KCiAgIFRoZXJlIGFyZSBhbHNvIHNvbWUgYm9udXMgb3B0aW9ucyB0aGF0IGFsbG93IHlvdSB0byBleGVjdXRlIGFuIGVudGlyZQogICBGVFAgc2Vzc2lvbiBmcm9tIHRoZSBzaGVsbCBjb21tYW5kIGxpbmUsIGFzIGxvbmcgYXMgeW91IGRvbid0IGluY2x1ZGUKICAgdGhlIC1uIG9wdGlvbi4gVGhlc2UgYXJlIG5vdCBhdmFpbGFibGUgd2l0aCByZWd1bGFyIEZUUCBjbGllbnRzLCBhbmQKICAgYXQgbGVhc3Qgb25lIG9mIHRoZXNlIG9wdGlvbnMgKC1nKSBjb25mbGljdHMgd2l0aCBVTklYIGZ0cCAod2hlcmUgLWcKICAgbWVhbnMgIm5vIGdsb2JiaW5nIiwgd2hpY2ggZG9lcyBub3QgYXBwbHkgdG8gS2VybWl0KSwgYW5kIHNvbWUgb2YgdGhlbQogICAobGlrZSB0aGUgb3B0aW9ucyBhYm92ZSkgYWxzbyBjb25mbGljdCB3aXRoIHJlZ3VsYXIgS2VybWl0CiAgIGNvbW1hbmQtbGluZSBvcHRpb25zOgoKICAtbSBtb2RlICAgICAgPSAicGFzc2l2ZSIgKGRlZmF1bHQpIG9yICJhY3RpdmUiCiAgLVkgICAgICAgICAgICBEb24ndCBleGVjdXRlIHRoZSBLZXJtaXQgaW5pdGlhbGl6YXRpb24gZmlsZSBbMV0KICAtcSAgICAgICAgICAgIFF1aWV0LCBzdXBwcmVzc2VzIGFsbCBidXQgZXJyb3IgbWVzc2FnZXMgWzFdCiAgLVMgICAgICAgICAgICBTdGF5LCBkb24ndCBleGl0IGF1dG9tYXRpY2FsbHkgWzFdCiAgLUEgICAgICAgICAgICBBdXRvbG9naW4gYW5vbnltb3VzbHkgWzJdCiAgLXUgbmFtZSAgICAgICBVc2VybmFtZSBmb3IgYXV0b2xvZ2luIFsyXSAoc3lub255bTogLU0gWzFdKQogIC1QIHBhc3N3b3JkICAgUGFzc3dvcmQgZm9yIGF1dG9sb2dpbiAoc2VlIGNhdXRpb25zIGJlbG93KSBbMl0KICAtRCBkaXJlY3RvcnkgIGNkIGFmdGVyIGF1dG9sb2dpbiBbMl0KICAtYiAgICAgICAgICAgIEJpbmFyeSBtb2RlIFsyXQogIC1hICAgICAgICAgICAgVGV4dCAoImFzY2lpIikgbW9kZSBbMl0gKHN5bm9ueW06IC1UIFsxXSkKICAtUiAgICAgICAgICAgIFJlY3Vyc2l2ZSAod29ya3Mgd2l0aCAtcCkgWzRdCiAgLXAgZmlsZXMgICAgICBGaWxlcyB0byBwdXQgKHVwbG9hZCkgYWZ0ZXIgYXV0b2xvZ2luIFsyXSAoc3lub255bTogLXMgWzFdKQogIC1nIGZpbGVzICAgICAgRmlsZXMgdG8gZ2V0IChkb3dubG9hZCkgYWZ0ZXIgYXV0b2xvZ2luIFszXQoKICAgWzFdIFNhbWUgYXMgS2VybWl0LCBub3QgYXZhaWxhYmxlIGluIHJlZ3VsYXIgRlRQIGNsaWVudHMuCiAgIFsyXSBDb25mbGljdHMgd2l0aCBLZXJtaXQsIG5vdCBhdmFpbGFibGUgaW4gcmVndWxhciBGVFAgY2xpZW50cy4KICAgWzNdIFNhbWUgYXMgS2VybWl0LCBjb25mbGljdHMgd2l0aCByZWd1bGFyIEZUUCBjbGllbnRzLgogICBbNF0gQ29uZmxpY3RzIHdpdGggS2VybWl0LCBhdmFpbGFibGUgaW4gc29tZSBGVFAgY2xpZW50cy4KCiAgIEZhbmNpZXIgb3B0aW9ucyBzdWNoIGFzIHJlc3RhcnQsIGNoYXJhY3Rlci1zZXQgdHJhbnNsYXRpb24sIGZpbGVuYW1lCiAgIGNvbGxpc2lvbiBzZWxlY3Rpb24sIGF1dG9tYXRpYyBtb3ZlL3JlbmFtZS9kZWxldGUsIGV0YywgYXJlIG5vdAogICBhdmFpbGFibGUgZnJvbSB0aGUgY29tbWFuZCBsaW5lOyBmb3IgdGhlc2UgeW91IGNhbiB1c2UgdGhlIGNvbW1hbmRzCiAgIGRlc2NyaWJlZCBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb25zLiBUaGUgLVIgb3B0aW9uIG1pZ2h0IGFsc28gd29yawogICB3aXRoIC1nIChHRVQpIGJ1dCB0aGF0IGRlcGVuZHMgb24gdGhlIHNlcnZlci4KCiAgIFRoZSBmb2xsb3dpbmcgc2VjdXJpdHkgb3B0aW9ucyBhcmUgYWxzbyBhdmFpbGFibGUsIGV4cGxhaW5lZCBpbgogICBbMjIwXVNlY3Rpb24gMy4yOgoKICAtayByZWFsbSAgICAgIEtlcmJlcm9zIDQgcmVhbG0gWzRdCiAgLWYgICAgICAgICAgICBLZXJiZXJvcyA1IGNyZWRlbnRpYWxzIGZvcndhcmRpbmcgWzRdCiAgLXggICAgICAgICAgICBhdXRvZW5jcnlwdGlvbiBtb2RlIFs0XQogIC1jIGNpcGhlciAgICAgU1JQIGNpcGhlciB0eXBlIFs0XQogIC1IIGhhc2ggICAgICAgU1JQIGVuY3J5cHRpb24gaGFzaCBbNF0KICAteiBvcHRpb24gICAgIFNlY3VyaXR5IG9wdGlvbnMgWzRdCgogICBJZiB5b3UgaW5jbHVkZSAtQSBvciBzcGVjaWZ5IGEgbmFtZSBvZiAiYW5vbnltb3VzIiBvciAiZnRwIiwgeW91IGFyZQogICBsb2dnZWQgaW4gYW5vbnltb3VzbHkgYW5kLCBpbiB0aGUgYWJzZW5jZSBvZiAtUCwgS2VybWl0IGF1dG9tYXRpY2FsbHkKICAgc3VwcGxpZXMgYSBwYXNzd29yZCBvZiAidXNlckBob3N0Iiwgd2hlcmUgInVzZXIiIGlzIHlvdXIgbG9jYWwgdXNlcgogICBJRCwgYW5kICJob3N0IiBpcyB0aGUgaG9zdG5hbWUgb2YgdGhlIGNvbXB1dGVyIHdoZXJlIEtlcm1pdCBpcwogICBydW5uaW5nLiBJZiB5b3UgZG8gbm90IGluY2x1ZGUgLXAgb3IgLWcsIEtlcm1pdCBlbnRlcnMgY29tbWFuZCBtb2RlIHNvCiAgIHlvdSBjYW4gdHlwZSBjb21tYW5kcyBvciBleGVjdXRlIHRoZW0gZnJvbSBhIHNjcmlwdC4KCiAgIElmIHlvdSBpbmNsdWRlIC1wIG9yIC1nLCBLZXJtaXQgYXR0ZW1wdHMgdG8gdHJhbnNmZXIgdGhlIHNwZWNpZmllZAogICBmaWxlcyBhbmQgdGhlbiBleGl0cyBhdXRvbWF0aWNhbGx5IGF0IHRoZSBlbmQgb2YgdGhlIHRyYW5zZmVyIHVubGVzcwogICB5b3UgYWxzbyBpbmNsdWRlZCAtUyAoU3RheSkuIEl0IHVzZXMgdGhlICJicmllZiIgZmlsZSB0cmFuc2ZlciBkaXNwbGF5CiAgIChvbmUgbGluZSBwZXIgZmlsZSkgdW5sZXNzIHlvdSBpbmNsdWRlIHRoZSAtcSBvcHRpb24gdG8gc3VwcHJlc3MgaXQuCgogICBXaGVuIHVwbG9hZGluZyBmaWxlcyB3aXRoIC1wLCBLZXJtaXQgc3dpdGNoZXMgYXV0b21hdGljYWxseSBiZXR3ZWVuCiAgIHRleHQgYW5kIGJpbmFyeSBtb2RlIGZvciBlYWNoIGZpbGUuCgogICBXaGVuIGRvd25sb2FkaW5nLCB5b3UgY2FuIGVpdGhlciBzcGVjaWZ5IGEgcGFydGljdWxhciBtb2RlICh0ZXh0IG9yCiAgIGJpbmFyeSkgdG8gYmUgdXNlZCBmb3IgYWxsIHRoZSBmaWxlcywgb3IgeW91IGNhbiBsZXQgS2VybWl0IHNlbGVjdCB0aGUKICAgdHlwZSBmb3IgZWFjaCBmaWxlIGF1dG9tYXRpY2FsbHksIGJhc2VkIG9uIGl0cyBuYW1lIChzZWUgWzIyMV1TZWN0aW9ucwogICAzLjUgYW5kIFsyMjJdMy42IGZvciBncmVhdGVyIGRldGFpbCkuIEluIFVOSVggYmUgc3VyZSB0byBxdW90ZSBhbnkKICAgd2lsZGNhcmQgY2hhcmFjdGVycyB0byBwcmV2ZW50IHRoZSBzaGVsbCBmcm9tIGV4cGFuZGluZyB0aGVtLCBhcyBzaG93bgogICBpbiB0aGUgZXhhbXBsZXMganVzdCBiZWxvdy4gRmlsZW5hbWUgY29sbGlzaW9ucyBhcmUgaGFuZGxlZCBhY2NvcmRpbmcKICAgS2VybWl0J3MgRklMRSBDT0xMSVNJT04gc2V0dGluZyAoaWYgc3BlY2lmaWVkIGluIHlvdXIgS2VybWl0CiAgIGN1c3RvbWl6YXRpb24gZmlsZTsgb3RoZXJ3aXNlIHRoZSBkZWZhdWx0LCB3aGljaCBpcyBCQUNLVVApLgoKICAgSXQgc2hvdWxkIGdvIHdpdGhvdXQgc2F5aW5nIHRoYXQgdGhlIC1QIG9wdGlvbiBzaG91bGQgYmUgdXNlZCB3aXRoCiAgIGNhdXRpb24uIEluIGFkZGl0aW9uIHRvIHRoZSB3ZWxsLWtub3duIHJpc2tzIG9mIHRyYW5zbWl0dGluZyBwbGFpbnRleHQKICAgcGFzc3dvcmRzIG92ZXIgdGhlIEludGVybmV0LCBpbiB0aGlzIGNhc2UgdGhlIHBhc3N3b3JkIGFsc28gZWNob3MgdG8KICAgdGhlIHNjcmVlbiBpZiB5b3UgdHlwZSBpdCwgYW5kIGNhbiBiZSBzZWVuIGluIHBzIGFuZCB3IGxpc3RpbmdzIHRoYXQKICAgc2hvdyB0aGUgdXNlcidzIGN1cnJlbnRseSBhY3RpdmUgY29tbWFuZCBhbmQgY29tbWFuZC1saW5lIGFyZ3VtZW50cy4KICAgVGh1cyBjb21tYW5kLWxpbmUgRlRQIHNlc3Npb25zIGFyZSBtb3N0IGFwcHJvcHJpYXRlIGZvciBzZWN1cmUgb3IKICAgYW5vbnltb3VzIGNvbm5lY3Rpb25zICh0aG9zZSB0aGF0IGRvIG5vdCByZXF1aXJlIHBhc3N3b3JkcykuCgogICBIZXJlJ3MgYW4gZXhhbXBsZSBpbiB3aGljaCB5b3UgZG93bmxvYWQgdGhlIGxhdGVzdCBDLUtlcm1pdCAidGFyYmFsbCIKICAgZnJvbSB0aGUgQ29sdW1iaWEgVW5pdmVyc2l0eSBGVFAgYXJjaGl2ZToKCiAgZnRwIC1BIGtlcm1pdC5jb2x1bWJpYS5lZHUgLWJnIGtlcm1pdC9hcmNoaXZlcy9ja2VybWl0LnRhci5negoKICAgVGhpcyBhc3N1bWVzIHRoYXQgImZ0cCIgaXMgYSBzeW1ib2xpYyBsaW5rIHRvIEMtS2VybWl0LiBJdCBsb2dzIHlvdSBpbgogICBhbm9ueW1vdXNseSBhbmQgZ2V0cyB0aGUgY2tlcm1pdC50YXIuZ3ogZmlsZSBpbiBiaW5hcnkgbW9kZSBmcm9tIHRoZQogICBrZXJtaXQvYXJjaGl2ZXMgZGlyZWN0b3J5LgoKICAgSGVyZSdzIGEgc2xpZ2h0bHkgbW9yZSBhbWJpdGlvdXMgZXhhbXBsZSB0aGF0IGlsbHVzdHJhdGVzIENEJ2luZyB0bwogICB0aGUgZGVzaXJlZCBzZXJ2ZXIgZGlyZWN0b3J5IHRvIGdldCBhIGdyb3VwIG9mIGZpbGVzIGluIHRleHQgbW9kZSAoaW4KICAgdGhpcyBjYXNlIHRoZSBDLUtlcm1pdCBzb3VyY2UgZmlsZXMpOgoKICBmdHAgLUEga2VybWl0LmNvbHVtYmlhLmVkdSAtRCBrZXJtaXQvZiAtYWcgImNrW2N1d10qLltjd2hdIiBtYWtlZmlsZQoKICAgSW4gdGhpcyBjYXNlIHdlIENEIHRvIHRoZSBrZXJtaXQvZiBkaXJlY3Rvcnkgc28gd2UgZG9uJ3QgaGF2ZSB0bwogICBpbmNsdWRlIGl0IGluIGVhY2ggZmlsZSBzcGVjaWZpY2F0aW9uLCBhbmQgd2UgcXVvdGUgdGhlIGNrW2N1d10qLltjd2hdCiAgIHNwZWNpZmljYXRpb24gc28gdGhlIHNoZWxsIGRvZXNuJ3QgZXhwYW5kIGl0LCBzaW5jZSB3ZSBoYXZlIHRvIHBhc3MgaXQKICAgYXMtaXMgdG8gdGhlIHNlcnZlci4gTm90ZSBhbHNvIHRoYXQgdGhlIHF1b3RlcyBkb24ndCBnbyBhcm91bmQgdGhlCiAgIGVudGlyZSBmaWxlIGxpc3Q7IG9ubHkgYXJvdW5kIGVhY2ggZmlsZSBzcGVjaWZpY2F0aW9uIHRoYXQgbmVlZHMgdG8gYmUKICAgcXVvdGVkLgoKICAgSGVyZSdzIG9uZSBtb3JlIGV4YW1wbGUsIHRoYXQgdXBsb2FkcyBhIGRlYnVnIGxvZyBmaWxlIGluIGJpbmFyeSBtb2RlCiAgIHRvIHRoZSBLZXJtaXQgaW5jb21pbmcgZGlyZWN0b3J5IChhcyB3ZSBtaWdodCBhc2sgeW91IHRvIGRvIHdoZW4KICAgZm9sbG93aW5nIHVwIG9uIGEgcHJvYmxlbSByZXBvcnQpOgoKICBmdHAgLUEga2VybWl0LmNvbHVtYmlhLmVkdSAtRCBrZXJtaXQvaW5jb21pbmcgLWJwIGRlYnVnLmxvZwoKICAgSW4gdGhpcyBjYXNlIHRoZSAtRCBvcHRpb24gaXMgcmVxdWlyZWQgdG8gdGVsbCB0aGUgc2VydmVyIHdoZXJlIHRvIHB1dAogICB0aGUgaW5jb21pbmcgZmlsZS4KCiAgIFVubGVzcyB0aGUgLVkgb3B0aW9uIGlzIGluY2x1ZGVkLCB5b3VyIEtlcm1pdCBpbml0aWFsaXphdGlvbiBmaWxlCiAgICgubXlrZXJtcmMgaW4gVU5JWCwgSzk1LklOSSBpbiBXaW5kb3dzKSBpcyBleGVjdXRlZCBiZWZvcmUgdGhlIGNvbW1hbmQKICAgbGluZSBvcHRpb25zLCBzbyB5b3UgY2FuIHNldCBhbnkgRlRQLXJlbGF0ZWQgcHJlZmVyZW5jZXMgdGhlcmUsIGFzCiAgIGRlc2NyaWJlZCBpbiB0aGUgc3Vic2VxdWVudCBzZWN0aW9ucy4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDMuMS4zLiBUaGUgRlRQIFVSTCBJbnRlcnByZXRlcgoKICAgSWYgS2VybWl0IGlzIGludm9rZWQgd2l0aCBlaXRoZXIgaXRzIHJlZ3VsYXIgcGVyc29uYWxpdHkgKGFzICJrZXJtaXQiKQogICAgICAgICAgb3IgaXRzIEZUUCBwZXJzb25hbGl0eSAoYXMgImZ0cCIpLCB5b3UgY2FuIGFsc28gZ2l2ZSBhIFVSTAogICAgICAgICAgKFVuaXZlcnNhbCBSZXNvdXJjZSBMb2NhdG9yKSBpbnN0ZWFkIG9mIGEgaG9zdG5hbWUgYW5kIG9wdGlvbnMsCiAgICAgICAgICB3aXRoIG9yIHdpdGhvdXQgYSB1c2VybmFtZSBhbmQgcGFzc3dvcmQ6CiAgICAgICAgICBmdHAgZnRwOi8vdXNlcjpwYXNzd29yZEBob3N0L3BhdGgKICAgICAgICAgIGZ0cCBmdHA6Ly91c2VyQGhvc3QvcGF0aAogICAgICAgICAgZnRwIGZ0cDovL0Bob3N0L3BhdGggICAob3IgZnRwOi8vOkBob3N0L3BhdGgpCiAgICAgICAgICBmdHAgZnRwOi8vaG9zdC9wYXRoCiAgICAgICAgICBrZXJtaXQgZnRwOi8vaG9zdC9wYXRoCgogICBJZiB0aGUgRlRQIHBlcnNvbmFsaXR5IGlzIHVzZWQsIHRoZSBzZXJ2aWNlIG11c3QgYmUgImZ0cCIuIEluIGFsbAogICBjYXNlcywgYSBob3N0bmFtZSBvciBhZGRyZXNzIG11c3QgYmUgaW5jbHVkZWQuIElmIGEgdXNlciBpcyBpbmNsdWRlZAogICBidXQgbm8gcGFzc3dvcmQsIHlvdSBhcmUgcHJvbXB0ZWQgZm9yIHRoZSBwYXNzd29yZC4gSWYgYSBwYXRoCiAgIChmaWxlbmFtZSkgaXMgaW5jbHVkZWQ6CiAgICAgKiBJZiAiQCIgaXMgaW5jbHVkZWQgd2l0aG91dCBhIHVzZXIsIEtlcm1pdCBwcm9tcHRzIGZvciB0aGUgdXNlcm5hbWUKICAgICAgIGFuZCBwYXNzd29yZC4KICAgICAqIElmIG5vIHVzZXIgYW5kIG5vICJAIiBhcmUgaW5jbHVkZWQsICJhbm9ueW1vdXMiIGlzIHVzZWQuCiAgICAgKiBHRVQgaXMgYXNzdW1lZC4KCiAgIElmIG5vIHBhdGggKGFuZCBubyBhY3Rpb24gb3B0aW9ucykgYXJlIGluY2x1ZGVkLCBhbiBpbnRlcmFjdGl2ZSBGVFAKICAgICAgICAgIHNlc3Npb24gaXMgc3RhcnRlZCwgYXMgaW4gdGhpcyBleGFtcGxlOgogICAgICAgICAgZnRwIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUKCiAgIElmIGEgcGF0aCBpcyBpbmNsdWRlZCwgYnV0IGEgdXNlcm5hbWUgaXMgbm90IGluY2x1ZGVkLCAiYW5vbnltb3VzIiBpcwogICB1c2VkIGFuZCBhbiBhcHByb3ByaWF0ZSB1c2VyQGhvc3QgcGFzc3dvcmQgaXMgc3VwcGxpZWQgYXV0b21hdGljYWxseS4KICAgSWYgYXV0aGVudGljYXRpb24gaXMgc3VjY2Vzc2Z1bCwgS2VybWl0IGF0dGVtcHRzIHRvIEdFVCB0aGUgZmlsZQogICBpbmRpY2F0ZWQgYnkgdGhlIHBhdGggb3IsIGlmIHRoZSBwYXRoIGlzIHRoZSBuYW1lIG9mIGEgZGlyZWN0b3J5LCBpdAogICBhc2tzIHRoZSBzZXJ2ZXIgZm9yIGEgZGlyZWN0b3J5IGxpc3RpbmcuIEluIGJvdGggY2FzZXMsIEtlcm1pdAogICBkaXNjb25uZWN0cyBmcm9tIHRoZSBzZXJ2ZXIgYW5kIGV4aXRzIGFmdGVyIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGUKICAgKHVubGVzcyB5b3UgaGF2ZSBpbmNsdWRlZCB0aGUgLVMgb3B0aW9uIG9uIHRoZSBjb21tYW5kIGxpbmUpLgoKICAgSGVyZSdzIGFuIGV4YW1wbGUgdGhhdCBnZXRzIGEgbGlzdGluZyBvZiB0aGUgS2VybWl0IGRpcmVjdG9yeSBhdCB0aGUKICAgICAgICAgIEtlcm1pdCBmdHAgc2l0ZToKICAgICAgICAgIGZ0cCBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC8KCiAgIFRoaXMgZXhhbXBsZSBnZXRzIHRoZSB0b3AtbGV2ZWwgUkVBRC5NRSBmaWxlIGZyb20gdGhlIHNhbWUgZGlyZWN0b3J5OgogICAgICAgICAgZnRwIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L1JFQUQuTUUKCiAgIEhlcmUncyB0aGUgc2FtZSBleGFtcGxlLCBidXQgcmVxdWVzdGluZyBhIHRleHQtbW9kZSB0cmFuc2ZlcjoKICAgICAgICAgIGZ0cCAtVCBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9SRUFELk1FCiAgICAgICAgICBUaGlzIGlsbHVzdHJhdGVzIHRoYXQgeW91IGNhbiBtaXggY29tbWFuZC1saW5lIG9wdGlvbnMgYW5kIFVSTHMKICAgICAgICAgIGlmIHlvdSBkZXNpcmUuCgogICBIZXJlJ3MgYW4gZXhhbXBsZSB0aGF0IGxvZ3MgaW4gYXMgYSAoZmljdGl0aW91cykgcmVhbCB1c2VyIHRvIGdldCBhCiAgICAgICAgICBmaWxlOgogICAgICAgICAgZnRwIGZ0cDovL29sZ2FAZnRwLnh5emNvcnAuY29tL3Jlc3VtZS50eHQKICAgICAgICAgIFRoZSBwYXNzd29yZCBpcyBub3QgaW5jbHVkZWQsIHNvIEtlcm1pdCBwcm9tcHRzIGZvciBpdC4KCiAgIFRoaXMgc2NoZW1lIGFsbG93cyBLZXJtaXQgdG8gYmUgdXNlZCBhcyB0aGUgRlRQIGhlbHBlciBvZiBvdGhlcgogICBhcHBsaWNhdGlvbnMsIHN1Y2ggYXMgV2ViIGJyb3dzZXJzLCB3aXRoIGFsbCBpdHMgYWR2YW50YWdlcyBvdmVyIG90aGVyCiAgIEZUUCBjbGllbnRzIChlc3BlY2lhbGx5IHRoZSBvbmVzIHRoYXQgYXJlIGJ1aWx0IGluIHRvIG1vc3QgV2ViCiAgIGJyb3dzZXJzKSwgZS5nLiB0aGF0IGl0IGNhbiBiZSBnaXZlbiB3aWxkY2FyZHMsIGFuZCBpdCBjYW4gcGljayB0ZXh0CiAgIGFuZCBiaW5hcnkgbW9kZSBhdXRvbWF0aWNhbGx5IGZvciBlYWNoIGZpbGUuCgogICBISU5UOiBzdXBwb3NlIHNvbWVib2R5IHNlbmRzIHlvdSBhbiBGVFAgVVJMIGluIGVtYWlsLCBvciB5b3Ugc2VlIGl0IGluCiAgIHNvbWUgdGV4dC4gSWYgeW91ciB0ZXJtaW5hbCBzY3JlZW4gc3VwcG9ydHMgY29weS9wYXN0ZSwgY29weSB0aGUgdXJsLAogICBhbmQgdGhlbiBhdCB0aGUgc2hlbGwgcHJvbXB0IHR5cGUgImtlcm1pdCIsIGEgc3BhY2UsIGFuZCB0aGVuIHBhc3RlCiAgIHRoZSBVUkwsIGUuZy46CgogICQga2VybWl0IGZ0cDovL2FscGhhLmdyZWVuaWUubmV0L3B1Yi9tZ2V0dHkvc291cmNlLzEuMS9tZ2V0dHkxLjEuMjctTwoKICAgIiQgaXMgdGhlIHNoZWxsIHByb21wdDsgdGhlIHBhcnQgeW91IHR5cGUgaXMgdW5kZXJsaW5lZCwgdGhlIHJlc3QgaXMKICAgcGFzdGVkIGluLiBLZXJtaXQgZG9lcyB0aGUgcmVzdC4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDMuMS40LiBJbnRlcmFjdGl2ZSBGVFAgU2Vzc2lvbiBFc3RhYmxpc2htZW50CgogICBBcyB5b3UgcmVhZCB0aGlzIGFuZCB0aGUgZm9sbG93aW5nIHNlY3Rpb25zLCBiZWFyIGluIG1pbmQgdGhhdCBhbnkKICAgY29tbWFuZCB0aGF0IGNhbiBiZSBnaXZlbiBhdCB0aGUgcHJvbXB0IGNhbiBhbHNvIGJlIHVzZWQgaW4gYSBzY3JpcHQKICAgcHJvZ3JhbS4gS2VybWl0J3Mgc2NyaXB0IHByb2dyYW1taW5nIGxhbmd1YWdlIGlzIHRoZSBzYW1lIGFzIGl0cwogICBpbnRlcmFjdGl2ZSBjb21tYW5kIGxhbmd1YWdlLiBbMjIzXUNMSUNLIEhFUkUgaWYgeW91IHdvdWxkIGxpa2UgdG8KICAgbGVhcm4gYSBiaXQgbW9yZSBhYm91dCBzY3JpcHQgd3JpdGluZy4KCiAgIEFuIEZUUCBzZXNzaW9uIGlzIGVzdGFibGlzaGVkIHdpdGggdGhlIEZUUCBPUEVOIGNvbW1hbmQ6CgogICBGVFAgWyBPUEVOIF0gWyB7IC9TU0wsIC9UTFMgfSBdIGhvc3RuYW1lIFsgc3dpdGNoZXMgXSBbIHBvcnQgXQogICAgICAgICAgT3BlbnMgYW4gRlRQIGNvbm5lY3Rpb24gdG8gdGhlIGdpdmVuIGhvc3Qgb24gdGhlIGdpdmVuIHBvcnQKICAgICAgICAgIGFuZCwgaWYgRlRQIEFVVE9MT0dJTiBpcyBPTiwgYWxzbyBsb2dzIHlvdSBpbiB0byB0aGUgc2VydmVyLAogICAgICAgICAgcHJvbXB0aW5nIGZvciB1c2VybmFtZSBhbmQgcGFzc3dvcmQgaWYgbmVjZXNzYXJ5LiBJZiBubyBwb3J0IGlzCiAgICAgICAgICBzcGVjaWZpZWQsIHRoZSByZWd1bGFyIEZUUCBwcm90b2NvbCBwb3J0ICgyMSkgaXMgdXNlZC4gVGhlIE9QRU4KICAgICAgICAgIGtleXdvcmQgaXMgb3B0aW9uYWwgKHVubGVzcyB0aGUgaG9zdG5hbWUgY29uZmxpY3RzIHdpdGggb25lIG9mCiAgICAgICAgICB0aGUgRlRQIGNvbW1hbmQga2V5d29yZHMsIHdoaWNoIHlvdSBjYW4gbGlzdCBieSB0eXBpbmcgImZ0cAogICAgICAgICAgPyIpLgoKICAgVGhlIGhvc3RuYW1lIGNhbiBiZSBhbiBJUCBob3N0IG5hbWUsIG51bWVyaWMgSVAgYWRkcmVzcywgb3IgaWYgeW91CiAgIGhhdmUgYSBuZXR3b3JrIGRpcmVjdG9yeSBhY3RpdmUgKFNFVCBORVRXT1JLIERJUkVDVE9SWTsgc2VlIENoYXB0ZXIgNgogICBvZiBbMjI0XVVzaW5nIEMtS2VybWl0KSwgYW4gZW50cnkgbmFtZSBpbiB0aGUgZGlyZWN0b3J5LiBJbiB0aGUgbGF0dGVyCiAgIGNhc2UsIGlmIHRoZSBnaXZlbiBob3N0bmFtZSBtYXRjaGVzIGV4YWN0bHkgb25lIGVudHJ5LCB0aGUgYXNzb2NpYXRlZAogICBuYW1lIG9yIGFkZHJlc3MgaXMgdXNlZDsgaWYgaXQgbWF0Y2hlcyBtb3JlIHRoYW4gb25lLCBLZXJtaXQgY3ljbGVzCiAgIHRocm91Z2ggdGhlbSB1bnRpbCBvbmUgaXMgZm91bmQgdGhhdCBjYW4gYmUgb3BlbmVkOyBpZiBpdCBtYXRjaGVzCiAgIG5vbmUsIHRoZW4gdGhlIGhvc3RuYW1lIGlzIHVzZWQgYXMtaXMuIElmIGEgZGlyZWN0b3J5IGlzIGFjdGl2ZSBidXQKICAgeW91IHdhbnQgdG8gYnlwYXNzIGRpcmVjdG9yeSBsb29rdXAsIGluY2x1ZGUgYW4gIj0iIHNpZ24gYXQgdGhlCiAgIGJlZ2lubmluZyBvZiB0aGUgaG9zdG5hbWUsIGFuZC9vciB1c2UgYSBudW1lcmljIElQIGFkZHJlc3MuCgogICBXaGVuIGFuIEZUUCBjb25uZWN0aW9uIGlzIG9wZW5lZCwgdGhlIGRlZmF1bHQgZmlsZS10cmFuc2ZlciBtb2RlIGlzCiAgIHNldCB0byBiaW5hcnkgaWYgdGhlIGNsaWVudCBhbmQgc2VydmVyIHBsYXRmb3JtcyBhcmUgYWxpa2UgKGUuZy4gYm90aAogICBvZiB0aGVtIGFyZSBzb21lIGtpbmQgb2YgVU5JWCksIGFuZCB0byB0ZXh0ICgiYXNjaWkiKSBpZiB0aGV5IGFyZSBub3QKICAgYWxpa2UuIFRoaXMgaGFzIG5vIHBhcnRpY3VsYXIgZWZmZWN0IGZvciB1cGxvYWRpbmcgc2luY2UgS2VybWl0CiAgIGF1dG9tYXRpY2FsbHkgc3dpdGNoZXMgYmV0d2VlbiB0ZXh0IGFuZCBiaW5hcnkgbW9kZSBmb3IgZWFjaCBmaWxlLCBidXQKICAgbWlnaHQgYmUgaW1wb3J0YW50IGZvciBkb3dubG9hZGluZy4gVGhlIGNvbm5lY3Rpb24gaXMgYWxzbyBzZXQgdG8KICAgU3RyZWFtIG1vZGUgYW5kIEZpbGUgc3RydWN0dXJlLiBSZWNvcmQtIG9yIHBhZ2Utb3JpZW50ZWQgZmlsZQogICB0cmFuc2ZlcnMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgQy1LZXJtaXQncyBGVFAgY2xpZW50LgoKICAgVGhlIG9wdGlvbmFsIEZUUCBPUEVOIHN3aXRjaGVzIGFyZToKCiAgIC9BTk9OWU1PVVMKICAgICAgICAgIExvZ3MgeW91IGluIGFub255bW91c2x5LCBhdXRvbWF0aWNhbGx5IHN1cHBseWluZyB1c2VybmFtZQogICAgICAgICAgImFub255bW91cyIgYW5kIHVzZXJAaG9zdCBhcyB0aGUgcGFzc3dvcmQsIGJhc2VkIG9uIHlvdXIgbG9jYWwKICAgICAgICAgIHVzZXIgYW5kIGhvc3QgbmFtZXMuCgogICAvTk9MT0dJTgoKICAgICAgICAgIE92ZXJyaWRlcyBTRVQgRlRQIEFVVE9MT0dJTiBPTiBmb3IgdGhpcyBjb25uZWN0aW9uIG9ubHkuCgogICAvVVNFUjpuYW1lCiAgICAgICAgICBVc2VzIHRoZSBnaXZlbiB1c2VybmFtZSB0byBsb2cgeW91IGluLCB0aHVzIGF2b2lkaW5nIHRoZSBOYW1lOgogICAgICAgICAgcHJvbXB0LgogICAgICAgICAgT3ZlcnJpZGVzIFNFVCBGVFAgQVVUT0xPR0lOIE9GRiBmb3IgdGhpcyBjb25uZWN0aW9uIG9ubHkuCgogICAvUEFTU1dPUkQ6dGV4dAogICAgICAgICAgVXNlcyB0aGUgZ2l2ZW4gdGV4dCBhcyB5b3VyIHBhc3N3b3JkLCB0aHVzIGF2b2lkaW5nIHRoZQogICAgICAgICAgUGFzc3dvcmQ6IHByb21wdC4gVGhpcyBzd2l0Y2ggaXMgbm90IHJlY29tbWVuZGVkIGZvciB1c2UgaW4KICAgICAgICAgIHNjcmlwdCBmaWxlcywgd2hpY2ggd291bGQgYmUgYSBzZWN1cml0eSByaXNrLgoKICAgL0FDQ09VTlQ6dGV4dAogICAgICAgICAgVXNlcyB0aGUgZ2l2ZW4gdGV4dCBhcyB5b3VyIGFjY291bnQgKG9yIHNlY29uZGFyeSBwYXNzd29yZCwKICAgICAgICAgIGRlcGVuZGluZyBvbiB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoZSBzZXJ2ZXI7IG1vc3Qgc2VydmVycyBkbwogICAgICAgICAgbm90IHJlcXVpcmUgb3IgYWNjZXB0IGFuIGFjY291bnQgbmFtZSkuIElmIGFuIGFjY291bnQgaXMgbm90CiAgICAgICAgICBzdXBwbGllZCwgeW91IGFyZSBub3QgcHJvbXB0ZWQgZm9yIG9uZS4KCiAgIC9QQVNTSVZFCiAgICAgICAgICBPcGVucyB0aGUgY29ubmVjdGlvbiBpbiBwYXNzaXZlIG1vZGUuIFBhc3NpdmUgbW9kZSBpcyB0aGUKICAgICAgICAgIGRlZmF1bHQgaW4gS2VybWl0J3MgRlRQIGNsaWVudCwgdW5saWtlIGluIG1vc3Qgb3RoZXJzLCBzaW5jZSBpdAogICAgICAgICAgd29ya3MgYmV0dGVyIHRocm91Z2ggZmlyZXdhbGxzLiBUaGUgL1BBU1NJVkUgYW5kIC9BQ1RJVkUKICAgICAgICAgIHN3aXRjaGVzIGFwcGx5IG9ubHkgdG8gdGhlIGNvbm5lY3Rpb24gdGhhdCBpcyBiZWluZyBvcGVuZWQsIGFuZAogICAgICAgICAgZG8gbm90IGFmZmVjdCB0aGUgZ2xvYmFsIEZUUCBQQVNTSVZFLU1PREUgc2V0dGluZy4KCiAgIC9BQ1RJVkUKICAgICAgICAgIE9wZW5zIHRoZSBjb25uZWN0aW9uIGluIGFjdGl2ZSBtb2RlLiBVc2UgdGhpcyBzd2l0Y2ggaWYgdGhlCiAgICAgICAgICBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBwYXNzaXZlIG1vZGUsIG9yIHVzZSB0aGUgY29tbWFuZCBTRVQKICAgICAgICAgIEZUUCBQQVNTSVZFLU1PREUgT0ZGLgoKICAgL05PSU5JVAogICAgICAgICAgQWRkZWQgaW4gQy1LZXJtaXQgOC4wLjIwMS4gICBUZWxscyBDLUtlcm1pdCBub3QgdG8gc2VuZCBSRVNULAogICAgICAgICAgU1RSVSwgRkVBVCwgYW5kIE1PREUgY29tbWFuZHMgdG8gdGhlIHNlcnZlciB3aGVuIHRoZSBjb25uZWN0aW9uCiAgICAgICAgICBpcyBvcGVuZWQsIHNpbmNlIHRoZXNlIGhhdmUgYmVlbiByZXBvcnRlZCB0byBjYXVzZSBjb25mdXNpb24gaW4KICAgICAgICAgIGNlcnRhaW4gc2VydmVycy4KCiAgIFdoZW4gYSB1c2VybmFtZSBvciBwYXNzd29yZCBpcyBtaXNzaW5nLCBhIHByb21wdCBpcyBpc3N1ZWQgYXQgdGhlCiAgIGNvbnRyb2xsaW5nIHRlcm1pbmFsIGFuZCB5b3UgbXVzdCB0eXBlIHRoZSByZXNwb25zZTsgdGhlIHJlc3BvbnNlIGNhbgogICBub3QgYmUgc2NyaXB0ZWQuIFVzZSB0aGUgc3dpdGNoZXMgdG8gYXZvaWQgcHJvbXB0cywgb3Igb25lIG9mIHRoZQogICBzZWN1cmUgYXV0aGVudGljYXRpb24gbWV0aG9kcyBkZXNjcmliZWQgaW4gdGhlIG5leHQgc2VjdGlvbiwgb3Igc2VlCiAgIFsyMjVdU0VUIEZUUCBBVVRPTE9HSU4gYW5kIHRoZSBbMjI2XUZUUCBVU0VSIGFuZCBzaW1pbGFyIGNvbW1hbmRzCiAgIGRlc2NyaWJlZCBsYXRlciBpbiB0aGlzIHNlY3Rpb24uCgogICBFeGFtcGxlczoKCiAgZnRwIG9wZW4ga2VybWl0LmNvbHVtYmlhLmVkdSAvYW5vbnltb3VzICA7IE9wZW4gYW5kIGxvZyBpbiBhbm9ueW1vdXNseQogIGZ0cCBrZXJtaXQuY29sdW1iaWEuZWR1IC9hbm9ueW1vdXMgICAgICAgOyBUaGUgT1BFTiBrZXl3b3JkIGNhbiBiZSBvbWl0dGVkCiAgZnRwIHh5emNvcnAuY29tICAgICAgICAgICAgICAgICAgICAgICAgICA7IE9wZW4gYW5kIG1heWJlIHByb21wdCBmb3IgdXNlcm5hbWUKICBmdHAgeHl6Y29ycC5jb20gL3VzZXI6b2xnYSAgICAgICAgICAgICAgIDsgT3BlbiBhbmQgbG9nIGluIGFzIG9sZ2EKICBmdHAgdGVzdGluZy5hYmNjb3JwLmNvbSA0NDkgICAgICAgICAgICAgIDsgU3BlY2lmeSBhIHNwZWNpYWwgVENQIHBvcnQgbnVtYmVyCiAgZnRwIHRlc3RpbmcuYWJjY29ycC5jb20gL3VzZXI6b2xhZiAvcGFzc3dvcmQ6c2VjcmV0IDQ0OQoKICAgVGhlIEZUUCBPUEVOIGNvbW1hbmQgc3VjY2VlZHMgaWYgYSBjb25uZWN0aW9uIHdhcyBvcGVuZWQgdG8gdGhlIHNlcnZlcgogICAoZXZlbiBpZiB0aGUgZ2l2ZW4gdXNlcm5hbWUgYW5kIHBhc3N3b3JkIHdlcmUgbm90IHZhbGlkKSBhbmQgZmFpbHMKICAgb3RoZXJ3aXNlIChzZWUgWzIyN11TZWN0aW9uIDMuOCBmb3IgZGV0YWlscykuCgogICBXaGVuIHlvdXIgRlRQIHNlc3Npb24gaXMgY29tcGxldGUsIHlvdSBjYW4gdGVybWluYXRlIGl0IGFzIGZvbGxvd3M6CgogICBGVFAgQllFCiAgICAgICAgICBDbG9zZXMgdGhlIEZUUCBjb25uZWN0aW9uIGlmIG9uZSB3YXMgb3Blbi4gVGhlIEZUUCBwcmVmaXggY2FuCiAgICAgICAgICBiZSBvbWl0dGVkIGlmIG5vIG90aGVyIGNvbm5lY3Rpb24gaXMgb3BlbiBhdCB0aGUgc2FtZSB0aW1lIChzZWUKICAgICAgICAgIFsyMjhdU2VjdGlvbiAzLjggZm9yIGRldGFpbHMpLiBJZiBhIGNvbm5lY3Rpb24gbG9nIGlzIGFjdGl2ZSwKICAgICAgICAgIGFuIEZUUCByZWNvcmQgaXMgd3JpdHRlbiB0byBpdC4gSWYgS2VybWl0IHdhcyBzdGFydGVkIHdpdGggdGhlCiAgICAgICAgICAtOSBjb21tYW5kLWxpbmUgb3B0aW9uIG9yIHdpdGggaXRzIEZUUCBjb21tYW5kLWxpbmUKICAgICAgICAgIHBlcnNvbmFsaXR5LCBhbmQgdGhlIC1TIChTdGF5KSBvcHRpb24gd2FzIG5vdCBnaXZlbiwgQU5EIHRoZXJlCiAgICAgICAgICBpcyBubyBvdGhlciBhY3RpdmUgY29ubmVjdGlvbiwgdGhlIEZUUCBCWUUgY29tbWFuZCBhbHNvIGV4aXRzLAogICAgICAgICAganVzdCBhcyBpdCBkb2VzIG9uIGEgcmVndWxhciBGVFAgY2xpZW50LiBTeW5vbnltczogRlRQIENMT1NFLAogICAgICAgICAgRlRQIFFVSVQgKGJ1dCBpZiB0aGUgRlRQIHByZWZpeCBpcyBvbWl0dGVkIGZyb20gUVVJVCwgdGhpcwogICAgICAgICAgYmVjb21lcyB0aGUgcmVndWxhciBLZXJtaXQgUVVJVCBjb21tYW5kLCB3aGljaCBpcyBlcXVpdmFsZW50IHRvCiAgICAgICAgICBFWElUOyBpLmUuIGl0IGNsb3NlcyB0aGUgY29ubmVjdGlvbiBhbmQgZXhpdHMgZnJvbSBLZXJtaXQpLgoKICAgVGhlIGZvbGxvd2luZyBjb21tYW5kcyBjYW4gYmUgdXNlZCB0byBhY2hpZXZlIGdyZWF0ZXIgY29udHJvbCBvdmVyIHRoZQogICBjb25uZWN0aW9uIGFuZCBsb2dpbiBwcm9jZXNzOgoKICAgU0VUIEZUUCBBTk9OWU1PVVMtUEFTU1dPUkQgdGV4dAogICAgICAgICAgQWxsb3dzIHlvdSB0byBjaG9vc2UgdGhlIHBhc3N3b3JkIHRleHQgdG8gYmUgc2VudCBhdXRvbWF0aWNhbGx5CiAgICAgICAgICBieSBLZXJtaXQgd2hlbiB5b3Ugb3BlbiBhbiBGVFAgY29ubmVjdGlvbiB3aXRoIHRoZSAvQU5PTllNT1VTCiAgICAgICAgICBzd2l0Y2guCgogICBTRVQgRlRQIEFVVE9MT0dJTiB7IE9OLCBPRkYgfQogICAgICAgICAgSWYgeW91IGdpdmUgdGhpcyBjb21tYW5kIHByaW9yIHRvIG9wZW5pbmcgYW4gRlRQIGNvbm5lY3Rpb24sIGl0CiAgICAgICAgICBjb250cm9scyB3aGV0aGVyIEtlcm1pdCB0cmllcyB0byBsb2cgeW91IGluIGF1dG9tYXRpY2FsbHkgYXMKICAgICAgICAgIHBhcnQgb2YgdGhlIGNvbm5lY3Rpb24gcHJvY2Vzcy4gTm9ybWFsbHkgT04sIHdoaWNoIG1lYW5zIHRoZQogICAgICAgICAgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGFyZSBzZW50IGF1dG9tYXRpY2FsbHkgKGFuZCBwcm9tcHRlZCBmb3IKICAgICAgICAgIGlmIHRoZXkgYXJlIG5vdCB5ZXQga25vd24pLiBXaGVuIE9GRiwgRlRQIE9QRU4gY29ubmVjdHMgdG8gdGhlCiAgICAgICAgICBzZXJ2ZXIgd2l0aG91dCBsb2dnaW5nIGluLiBPRkYgaXMgZXF1aXZhbGVudCB0byB0aGUgLW4KICAgICAgICAgIGNvbW1hbmQtbGluZSBvcHRpb24gd2hlbiB1c2luZyBLZXJtaXQncyBGVFAgY29tbWFuZC1saW5lCiAgICAgICAgICBwZXJzb25hbGl0eS4KCiAgIEZUUCBVU0VSIG5hbWUgWyBwYXNzd29yZCBbIGFjY291bnQgXSBdCiAgICAgICAgICBVc2VkIHRvIGxvZyBpbiB0byBhbiBGVFAgc2VydmVyIHRvIHdoaWNoIGEgY29ubmVjdGlvbiBoYXMgYmVlbgogICAgICAgICAgbWFkZSB3aXRob3V0IGF1dG9sb2dpbiwgb3Igd2hlbiBhdXRvbG9naW4gZmFpbGVkLiBJZiB0aGUKICAgICAgICAgIHBhc3N3b3JkIGlzIGZ1cm5pc2hlZCBvbiB0aGUgY29tbWFuZCBsaW5lLCBpdCBpcyB1c2VkOwogICAgICAgICAgb3RoZXJ3aXNlIHlvdSBhcmUgcHJvbXB0ZWQgZm9yIGEgcGFzc3dvcmQuIEFuIGFjY291bnQgbWF5IGFsc28KICAgICAgICAgIGJlIGZ1cm5pc2hlZCBpZiByZXF1aXJlZCBieSB0aGUgc2VydmVyOyBpdCBpcyBub3QgcmVxdWlyZWQgYnkKICAgICAgICAgIEtlcm1pdCBhbmQgaXMgbm90IHByb21wdGVkIGZvciBpZiBvbWl0dGVkLiBTeW5vbnltczogVVNFUiwgRlRQCiAgICAgICAgICBMT0dJTi4KCiAgIEZUUCBBQ0NPVU5UIHRleHQKICAgICAgICAgIFNlbmRzIGFuIGFjY291bnQgbmFtZSB0byBhIHNlcnZlciB0aGF0IHN1cHBvcnRzIGFjY291bnRzLiBJZgogICAgICAgICAgdGhlIHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IGFjY291bnRzLCBhbiBlcnJvciByZXNwb25zZSBvY2N1cnMuCiAgICAgICAgICBJZiB0aGUgc2VydmVyIGRvZXMgc3VwcG9ydCBhY2NvdW50cywgdGhlIGFjY291bnQgaXMgYWNjZXB0ZWQgaWYKICAgICAgICAgIGl0IGlzIHZhbGlkIGFuZCByZWplY3RlZCBpZiBpdCBpcyBub3QuIFRoZSBhY2NvdW50IG1pZ2h0IGJlCiAgICAgICAgICB1c2VkIGZvciBjaGFyZ2luZyBwdXJwb3NlcyBvciBpdCBtaWdodCBiZSBhIHNlY29uZGFyeSBwYXNzd29yZCwKICAgICAgICAgIG9yIGl0IG1pZ2h0IGJlIHVzZWQgZm9yIGFueSBvdGhlciBwdXJwb3NlLCBzdWNoIGFzIGFuIGFjY2VzcwogICAgICAgICAgcGFzc3dvcmQgZm9yIGEgcGFydGljdWxhciBkaXNrLiBTZXJ2ZXJzIHRoYXQgc3VwcG9ydCBhY2NvdW50cwogICAgICAgICAgbWlnaHQgb3IgbWlnaHQgbm90IGFsbG93IG9yIHJlcXVpcmUgdGhlIGFjY291bnQgdG8gYmUgc2VudAogICAgICAgICAgcHJpb3IgdG8gbG9naW47IHVzdWFsbHkgaXQgaXMgc2VudCBhZnRlciBsb2dpbiwgaWYgYXQgYWxsLgogICAgICAgICAgU3lub255bTogQUNDT1VOVC4KCiAgIEV4YW1wbGU6CgpzZXQgZnRwIGF1dG9sb2dpbiBvZmYgICAgICAgICAgICAgICAgICA7IE9uZSB0aGluZyBhdCBhIHRpbWUgcGxlYXNlCmZ0cCB4eXpjb3JwLmNvbSAgICAgICAgICAgICAgICAgICAgICAgIDsgVHJ5IHRvIG1ha2UgdGhlIGNvbm5lY3Rpb24KaWYgZmFpbCBleGl0IDEgRlRQIGNvbm5lY3Rpb24gZmFpbGVkICAgOyBDaGVjayB0aGF0IGl0IHdhcyBtYWRlCmZ0cCB1c2VyIG9sZ2Egc2VjcmV0ICAgICAgICAgICAgICAgICAgIDsgTm93IGxvZyBpbiB0byB0aGUgc2VydmVyCmlmIGZhaWwgZXhpdCAxIEZUUCBsb2dpbiBmYWlsZWQgICAgICAgIDsgQ2hlY2sgdGhhdCBpdCB3b3JrZWQKZnRwIGFjY291bnQgMTAzODk2ODU0ICAgICAgICAgICAgICAgICAgOyBMb2dpbiBPSyAtIHNlbmQgYWNjb3VudAppZiBmYWlsIGVjaG8gV0FSTklORyAtIEZUUCBBQ0NUIGZhaWxlZCA7IFdhcm4gaWYgcHJvYmxlbQouLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IChoYXZlIHNlc3Npb24gaGVyZSkKYnllICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBMb2cgb3V0IGFuZCBkaXNjb25uZWN0CgogICBUaGUgZm9sbG93aW5nIGNvbW1hbmRzIGFyZSB1c2VkIHRvIGNvbnRyb2wgb3IgZ2V0IGluZm9ybWF0aW9uIGFib3V0CiAgIHRoZSBGVFAgY29ubmVjdGlvbi4gQW55IHBhcnRpY3VsYXIgRlRQIHNlcnZlciBkb2VzIG5vdCBuZWNlc3NhcmlseQogICBzdXBwb3J0IGFsbCBvZiB0aGVtLgoKICAgRlRQIFJFU0VUCiAgICAgICAgICBUZXJtaW5hdGVzIGEgdXNlciBzZXNzaW9uIGJ1dCBsZWF2ZXMgdGhlIGNvbm5lY3Rpb24gb3BlbiwKICAgICAgICAgIGFsbG93aW5nIGEgbmV3IGxvZ2luIHZpYSBGVFAgVVNFUi4KCiAgIEZUUCBJRExFIFsgbnVtYmVyIF0KICAgICAgICAgIE1vc3QgRlRQIHNlcnZlcnMgYXV0b21hdGljYWxseSBsb2cgeW91IG91dCBhbmQgYW5kIGRpc2Nvbm5lY3QKICAgICAgICAgIHlvdXIgc2Vzc2lvbiBpZiB0aGVyZSBoYXMgYmVlbiBubyBhY3Rpdml0eSBmb3IgYSBjZXJ0YWluIGFtb3VudAogICAgICAgICAgb2YgdGltZS4gVXNlIHRoaXMgY29tbWFuZCB0byBhc2sgdGhlIHNlcnZlciB0byBzZXQgaXRzIGlkbGUKICAgICAgICAgIGxpbWl0IHRvIHRoZSBnaXZlbiBudW1iZXIgb2Ygc2Vjb25kcy4gT21pdCB0aGUgbnVtYmVyIHRvIGFzawogICAgICAgICAgdGhlIHNlcnZlciB0byBpbmZvcm0geW91IG9mIGl0cyBjdXJyZW50IGlkbGUgbGltaXQuCgogICBGVFAgU1RBVFVTIFsgZmlsZW5hbWUgXQogICAgICAgICAgQXNrcyB0aGUgRlRQIHNlcnZlciB0byBzZW5kIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50CiAgICAgICAgICBzZXNzaW9uLiBUaGUgcmVzdWx0IGlzIGEgZnJlZS1mb3JtYXQgcmVwb3J0IHRoYXQgbWlnaHQgaW5jbHVkZQogICAgICAgICAgc2VydmVyIGlkZW50aWZpY2F0aW9uLCB1c2VybmFtZSBhbmQgbG9naW4gdGltZSwgRlRQIHByb3RvY29sCiAgICAgICAgICBzZXR0aW5ncywgYW5kIGZpbGUtdHJhbnNmZXIgc3RhdGlzdGljcy4gSWYgYSBmaWxlbmFtZSBpcyBnaXZlbiwKICAgICAgICAgIHRoZSBzZXJ2ZXIgaXMgc3VwcG9zZWQgdG8gc2VuZCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUKICAgICAgICAgIGZpbGUuCgogICBGVFAgU1lTVEVNCiAgICAgICAgICBBc2tzIHRoZSBGVFAgc2VydmVyIHRvIGlkZW50aWZ5IGl0cyBvcGVyYXRpbmcgc3lzdGVtIChMaXN0ZWQgaW4KICAgICAgICAgIEludGVybmV0IEFzc2lnbmVkIE51bWJlcnMsIE9wZXJhdGluZyBTeXN0ZW0gTmFtZXMpLiBFeGFtcGxlczoKICAgICAgICAgIFVOSVgsIFZNUywgVk0vQ01TLCBXSU5ET1dTLU5ULiBVbmZvcnR1bmF0ZWx5IG1hbnkgdmFyaWF0aW9ucwogICAgICAgICAgYXJlIGFsbG93ZWQgKGUuZy4gTElOVVgtMi4wLCBMSU5VWC0yLjIsIEZSRUVCU0QsIFVMVFJJWCwgZXRjLAogICAgICAgICAgaW5zdGVhZCBvZiBVTklYOyBXSU5ET1dTLU5ULTMsIFdJTkRPV1MtTlQtMy41LCBXSU5ET1dTLU5ULTMuNTEsCiAgICAgICAgICBXSU5ET1dTLU5ULTQsIGV0YykuIFRoZSByZXBvcnQgbWlnaHQgYWxzbyBpbmNsdWRlIG90aGVyCiAgICAgICAgICBpbmZvcm1hdGlvbiBsaWtlICJUeXBlIEw4IiwgIlR5cGUgSSIsIG9yICJUeXBlIEEiLCBpbmRpY2F0aW5nCiAgICAgICAgICB0aGUgZmlsZS10cmFuc2ZlciBtb2RlLgoKICAgRlRQIEhFTFAgWyBrZXl3b3JkIFsga2V5d29yZCBbIC4uLiBdIF0KICAgICAgICAgIEFza3MgdGhlIHNlcnZlciB0byBsaXN0IHRoZSBjb21tYW5kcyBpdCBzdXBwb3J0cy4gVGhlIHJlc3BvbnNlCiAgICAgICAgICBpcyB1c3VhbGx5IGNyeXB0aWMsIGxpc3RpbmcgRlRQIGNvbW1hbmQgbW5lbW9uaWNzLCBub3QgdGhlCiAgICAgICAgICBjb21tYW5kcyB1c2VkIGJ5IHRoZSBjbGllbnQgKHNpbmNlIHRoZSBzZXJ2ZXIgaGFzIG5vIHdheSBvZgogICAgICAgICAga25vd2luZyBhbnl0aGluZyBhYm91dCB0aGUgY2xpZW50J3MgdXNlciBpbnRlcmZhY2UpLiBGb3IKICAgICAgICAgIGV4YW1wbGUsIHRoZSBQVVQgY29tbWFuZCBpcyBTVE9SIGluIEZUUCBwcm90b2NvbC4gSWYgYSBrZXl3b3JkCiAgICAgICAgICBpcyBnaXZlbiwgd2hpY2ggc2hvdWxkIGJlIGFuIEZUUCBwcm90b2NvbCBjb21tYW5kLAogICAgICAgICAgc2xpZ2h0bHktbW9yZS0gZGV0YWlsZWQgaGVscCBpcyBnaXZlbiBhYm91dCB0aGUgY29ycmVzcG9uZGluZwogICAgICAgICAgY29tbWFuZCAoaWYgdGhlIEZUUCBzZXJ2ZXIgc3VwcG9ydHMgdGhpcyBmZWF0dXJlKS4gRXhhbXBsZXM6CiAgICAgICAgICAiZnRwIGhlbHAiLCAiZnRwIGhlbHAgc3RvciIuCgogICBGVFAgU0lURSB0ZXh0CiAgICAgICAgICAoQWR2YW5jZWQpIFNlbmRzIGFuIEZUUCBTSVRFIChzaXRlLXNwZWNpZmljKSBjb21tYW5kLiBVc3VhbGx5CiAgICAgICAgICB0aGlzIG1lYW5zIHRoYXQgdGhlIEZUUCBzZXJ2ZXIgaXMgYXNrZWQgdG8gcnVuIGFuIGV4dGVybmFsCiAgICAgICAgICBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4gWW91IG1pZ2h0IGJlIGFibGUgdG8gZmluZCBvdXQKICAgICAgICAgIHdoYXQgU0lURSBjb21tYW5kcyBhcmUgYXZhaWxhYmxlIGJ5IHNlbmRpbmcgImZ0cCBoZWxwIHNpdGUiIHRvCiAgICAgICAgICB0aGUgc2VydmVyLCBidXQgaW4gZ2VuZXJhbCB0aGUgYXZhaWxhYmlsaXR5IG9mIGFuZCByZXNwb25zZSB0bwogICAgICAgICAgU0lURSBjb21tYW5kcyBpcyAobm90IHN1cnByaXNpbmdseSkgc2l0ZSBzcGVjaWZpYy4KCiAgIEZUUCBRVU9URSB0ZXh0CiAgICAgICAgICAoQWR2YW5jZWQpIFNlbmRzIGFuIEZUUCBjb21tYW5kIGluIEZUUCBwcm90b2NvbCBmb3JtYXQuIFVzZQogICAgICAgICAgdGhpcyBjb21tYW5kIHRvIHNlbmQgY29tbWFuZHMgdG8gdGhlIHNlcnZlciB0aGF0IHRoZSBGVFAgY2xpZW50CiAgICAgICAgICBtaWdodCBub3Qga25vdyBhYm91dC4KCiAgIFNIT1cgRlRQCiAgICAgICAgICBMaXN0cyBjbGllbnQgKEtlcm1pdCkgRlRQIHNldHRpbmdzIGFuZCBpbmZvcm1hdGlvbi4gQWxzbyBTSE9XCiAgICAgICAgICBDT05ORUNUSU9OLCBTSE9XIENPTU1VTklDQVRJT05TLgoKICAgSEVMUCBGVFAgWyBrZXl3b3JkIF0KICAgICAgICAgIEFza3MgS2VybWl0IHRvIGxpc3QgYW5kIGRlc2NyaWJlIGl0cyBidWlsdC1pbiBGVFAgY29tbWFuZHMuCgogICBIRUxQIFNFVCBGVFAgWyBrZXl3b3JkIF0KICAgICAgICAgIEFza3MgS2VybWl0IHRvIGxpc3QgYW5kIGRlc2NyaWJlIGl0cyBidWlsdC1pbiBTRVQgRlRQIGNvbW1hbmRzLgoKICAgWyBbMjI5XVRvcCBdIFsgWzIzMF1GVFAgVG9wIF0gWyBbMjMxXUMtS2VybWl0IEhvbWUgXSBbIFsyMzJdS2VybWl0CiAgIEhvbWUgXQogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDMuMi4gTWFraW5nIFNlY3VyZSBGVFAgQ29ubmVjdGlvbnMKCiAgIEFsc28gc2VlOiBbMjMzXUFjY2Vzc2luZyBJQk0gSW5mb3JtYXRpb24gRXhjaGFuZ2Ugd2l0aCBLZXJtaXQuCgogICBJbiB0aGUgcHJldmlvdXMgc2VjdGlvbiwgeW91IGNhbiBzZWUgc2V2ZXJhbCBleGFtcGxlcyBvZiB0cmFkaXRpb25hbAogICBpbnNlY3VyZSBhdXRoZW50aWNhdGlvbjogdXNlcm5hbWUgYW5kIHBhc3N3b3JkIHNlbnQgYWNyb3NzIHRoZSBuZXR3b3JrCiAgIGluIGNsZWFyIHRleHQuIE9mIGNvdXJzZSB0aGlzIGlzIGJhZCBwcmFjdGljZSBvbiBhdCBsZWFzdCB0d28gY291bnRzOgogICAoMSkgc3RvcmluZyBwYXNzd29yZHMgaW4gZmlsZXMgKHN1Y2ggYXMgc2NyaXB0IGZpbGVzKSBnaXZlcyBhY2Nlc3MgdG8KICAgdGhlIHRhcmdldCBzeXN0ZW1zIHRvIGFueWJvZHkgd2hvIGNhbiBvYnRhaW4gcmVhZCBhY2Nlc3MgdG8geW91cgogICBzY3JpcHRzOyBhbmQgKDIpIHNlbmRpbmcgdGhpcyBpbmZvcm1hdGlvbiBvdmVyIHRoZSBuZXR3b3JrIGxlYXZlcyBpdAogICBvcGVuIHRvIGludGVyY2VwdGlvbiBieSBuZXR3b3JrIHNuaWZmZXJzIG9yIGNvbXByb21pc2VkIGhvc3RzLgoKICAgQmVjYXVzZSBvZiB0aGUgaW5jcmVhc2luZyBuZWVkIGZvciBzZWN1cml0eSBvbiB0aGUgSW50ZXJuZXQsIEZUUAogICBzZXJ2ZXJzIGFyZSBiZWdpbm5pbmcgdG8gYXBwZWFyIHRoYXQgb2ZmZXIgc2VjdXJlIGZvcm1zIG9mCiAgIGF1dGhlbnRpY2F0aW9uLCBpbiB3aGljaCBubyBpbmZvcm1hdGlvbiBpcyBzZW50IG92ZXIgdGhlIG5ldHdvcmsgdGhhdAogICB3b3VsZCBhbGxvdyBhbnlvbmUgd2hvIGludGVyY2VwdHMgaXQgdG8gdXN1cnAgeW91ciBpZGVudGl0eSBhbmQgZ2FpbgogICB5b3VyIGFjY2VzcyByaWdodHMuCgogICBLZXJtaXQgcHJvdmlkZXMgYW4gZXF1aXZhbGVudCBmb3JtIG9mIEZUUCBzZWN1cml0eSBmb3IgZWFjaCB0eXBlIG9mCiAgIElFVEYgc3RhbmRhcmQgc2VjdXJpdHkgaW1wbGVtZW50ZWQgaW4gVGVsbmV0LiBUaGVzZSBpbmNsdWRlCiAgIEdTU0FQSS1LRVJCRVJPUzUsIEtFUkJFUk9TNCwgU2VjdXJlIFJlbW90ZSBQYXNzd29yZCAoU1JQKSwgYW5kCiAgIFRyYW5zcG9ydCBMYXllciBTZWN1cml0eSAoU1NMIGFuZCBUTFMpLiBJdCBkb2VzIG5vdCBwcmVzZW50bHkgaW5jbHVkZQogICBTU0wgdHVubmVsaW5nIG5vciBhbnkgZm9ybSBvZiBTU0ggdjEgb3IgdjIuIFdoZW4gS2VybWl0IGlzIGJ1aWx0IHdpdGgKICAgdGhlIG5lY2Vzc2FyeSBsaWJyYXJpZXMsIHNlY3VyZSBGVFAgY29ubmVjdGlvbnMgYXJlIGF0dGVtcHRlZCBieQogICBkZWZhdWx0LCBpbiB3aGljaCBhbGwgY29ubmVjdGlvbnMgYXJlIGF1dGhlbnRpY2F0ZWQgYW5kIHRoZSBjb21tYW5kCiAgIGFuZCBkYXRhIGNoYW5uZWxzIGFyZSBwcml2YXRlLgoKICAgVGhlIHVzZSBvZiBhdXRoZW50aWNhdGlvbiBhbmQgZW5jcnlwdGlvbiBmb3IgRlRQIGNvbm5lY3Rpb25zIGNhbiBiZQogICBhZGp1c3RlZCB3aXRoIHRoZSBjb21tYW5kcyBsaXN0ZWQgYmVsb3csIHdoaWNoIGFyZSBhdmFpbGFibGUgb25seSBpZgogICB5b3VyIHZlcnNpb24gb2YgS2VybWl0IHdhcyBidWlsdCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHNlY3VyaXR5CiAgIG9wdGlvbnMgYW5kIGxpYnJhcmllczoKCiAgIFNFVCBGVFAgQVVUSFRZUEUgeyBBVVRPTUFUSUMsIEdTU0FQSS1LUkI1LCBLRVJCRVJPUzQsIFNSUCwgU1NMLCBUTFMgfQogICAgICAgICAgU3BlY2lmaWVzIGFuIG9yZGVyZWQgbGlzdCBvZiBhdXRoZW50aWNhdGlvbiBtZXRob2RzIHRvIGJlCiAgICAgICAgICBhdHRlbXB0ZWQgd2hlbiBBVVRPQVVUSEVOVElDQVRJT04gaXMgT04uIFRoZSBkZWZhdWx0IGxpc3QgaXM6CiAgICAgICAgICBHU1NBUEktS1JCNSwgU1JQLCBLRVJCRVJPU19WNCwgVExTLCBTU0wuIElmIG5vbmUgb2YgdGhlCiAgICAgICAgICBzZWxlY3RlZCBtZXRob2RzIGFyZSBzdXBwb3J0ZWQgYnkgdGhlIHNlcnZlciwgYW4gaW5zZWN1cmUgbG9naW4KICAgICAgICAgIGlzIHVzZWQgYXMgYSBmYWxsYmFjay4gTm90ZSwgYnkgdGhlIHdheSwgdGhhdCBTU0wgb3IgVExTIGNhbiBiZQogICAgICAgICAgdXNlZCB0byBzZWN1cmUgYW4gYW5vbnltb3VzIGNvbm5lY3Rpb24uCgogICBTRVQgRlRQIEFVVE9BVVRIRU5USUNBVElPTiB7IE9OLCBPRkYgfQogICAgICAgICAgVGVsbHMgd2hldGhlciBhdXRoZW50aWNhdGlvbiBzaG91bGQgYmUgbmVnb3RpYXRlZCBieSB0aGUgRlRQCiAgICAgICAgICBPUEVOIGNvbW1hbmQuIERlZmF1bHQgaXMgT04uIFVzZSBTRVQgRlRQIEFVVE9BVVRIRU5USUNBVElPTiBPRkYKICAgICAgICAgIHRvIGZvcmNlIGEgY2xlYXItdGV4dCwgdW5lbmNyeXB0ZWQgY29ubmVjdGlvbiB0byBGVFAgc2VydmVycwogICAgICAgICAgKHN1Y2ggYXMgdGhlIG9uZSBhdCB0aGUgS2VybWl0IEZUUCBzaXRlKSB0aGF0IG5vcm1hbGx5IHdvdWxkCiAgICAgICAgICB0cnkgdG8gbmVnb3RpYXRlIHNlY3VyZSBhdXRoZW50aWNhdGlvbiBhbmQgZW5jcnlwdGlvbi4KCiAgIFNFVCBGVFAgQVVUT0VOQ1JZUFRJT04geyBPTiwgT0ZGIH0KICAgICAgICAgIFRlbGxzIHdoZXRoZXIgZW5jcnlwdGlvbiAocHJpdmFjeSkgc2hvdWxkIGJlIG5lZ290aWF0ZWQgYnkgdGhlCiAgICAgICAgICBGVFAgT1BFTiBjb21tYW5kLCB3aGljaCBjYW4gaGFwcGVuIG9ubHkgaWYgc2VjdXJlCiAgICAgICAgICBhdXRoZW50aWNhdGlvbiBpcyBhbHNvIG5lZ290aWF0ZWQuIERlZmF1bHQgaXMgT04uCgogICBTRVQgRlRQIEFVVE9MT0dJTiB7IE9OLCBPRkYgfQogICAgICAgICAgVGVsbHMgS2VybWl0IHdoZXRoZXIgdG8gdHJ5IGxvZ2dpbmcgaW4gYXV0b21hdGljYWxseSB3aGVuIHlvdQogICAgICAgICAgbWFrZSBhbiBGVFAgY29ubmVjdGlvbiwgYXMgb3Bwb3NlZCB0byBsZXR0aW5nIHlvdSBkbyBpdCAiYnkKICAgICAgICAgIGhhbmQiIHdpdGggdGhlIEZUUCBVU0VSIGNvbW1hbmQuCgogICBTRVQgRlRQIENPTU1BTkQtUFJPVEVDVElPTi1MRVZFTCB7IENMRUFSLCBDT05GSURFTlRJQUwsIFBSSVZBVEUsIFNBRkUKICAgICAgICAgIH0KICAgICAgICAgIERldGVybWluZXMgdGhlIGxldmVsIG9mIHByb3RlY3Rpb24gYXBwbGllZCB0byB0aGUgY29tbWFuZAogICAgICAgICAgY2hhbm5lbDoKCiAgQ0xFQVIgICAgICAgICBEYXRhIGlzIHNlbnQgaW4gcGxhaW50ZXh0IGFuZCBub3QgcHJvdGVjdGVkIGFnYWluc3QgdGFtcGVyaW5nLgogIENPTkZJREVOVElBTCAgRGF0YSBpcyBlbmNyeXB0ZWQgYnV0IG5vdCBwcm90ZWN0ZWQgYWdhaW5zdCB0YW1wZXJpbmcuCiAgUFJJVkFURSAgICAgICBEYXRhIGlzIGVuY3J5cHRlZCBhbmQgaXMgcHJvdGVjdGVkIGFnYWluc3QgdGFtcGVyaW5nLgogIFNBRkUgICAgICAgICAgRGF0YSBpcyBzZW50IGluIHBsYWludGV4dCBidXQgcHJvdGVjdGVkIGFnYWluc3QgdGFtcGVyaW5nLgoKICAgICAgICAgIFRoZSBkZWZhdWx0IGlzIFBSSVZBVEUuCgogICBTRVQgRlRQIENSRURFTlRJQUwtRk9SV0FSRElORyB7IE9OLCBPRkYgfQogICAgICAgICAgVGVsbHMgd2hldGhlciBlbmQtdXNlciBjcmVkZW50aWFscyBhcmUgdG8gYmUgZm9yd2FyZGVkIHRvIHRoZQogICAgICAgICAgc2VydmVyIGlmIHN1cHBvcnRlZCBieSB0aGUgYXV0aGVudGljYXRpb24gbWV0aG9kIChHU1NBUEktS1JCNQogICAgICAgICAgb25seSkuIFRoaXMgaXMgb2Z0ZW4gcmVxdWlyZWQgdG8gYWxsb3cgYWNjZXNzIHRvIGRpc3RyaWJ1dGVkCiAgICAgICAgICBmaWxlIHN5c3RlbXMgKGUuZy4gQUZTLikKCiAgIFNFVCBGVFAgREFUQS1QUk9URUNUSU9OLUxFVkVMIHsgQ0xFQVIsIENPTkZJREVOVElBTCwgUFJJVkFURSwgU0FGRSB9CiAgICAgICAgICBUZWxscyB3aGF0IGxldmVsIG9mIHByb3RlY3Rpb24gaXMgYXBwbGllZCB0byBzdWJzZXF1ZW50IGRhdGEKICAgICAgICAgIGNoYW5uZWxzLiBUaGUgbWVhbmluZ3Mgb2YgdGhlIHByb3RlY3Rpb24tbGV2ZWwga2V5d29yZHMgYXJlIHRoZQogICAgICAgICAgc2FtZSBhcyBmb3IgU0VUIEZUUCBDT01NQU5ELVBST1RFQ1RJT04tTEVWRUwuIFRoZSBkZWZhdWx0IGlzCiAgICAgICAgICBQUklWQVRFLgoKICAgU0VUIEZUUCBTUlAgQ0lQSEVSIG5hbWUKICAgICAgICAgIFNwZWNpZmllcyB0aGUgY2lwaGVyIHRvIGJlIHVzZWQgZm9yIGVuY3J5cHRpb24gd2hlbiBTUlAKICAgICAgICAgIGF1dGhlbnRpY2F0aW9uIGlzIGluIHVzZS4gVGhlIGxpc3Qgb2YgcG9zc2libGUgY2hvaWNlcyBpcwogICAgICAgICAgY29tcHV0ZWQgYmFzZWQgb24gdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgbG9jYWwgU1JQIGxpYnJhcnkgYW5kCiAgICAgICAgICBpbmNsdWRlcyBOT05FIHBsdXMgemVybyBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmc6CgogIEJMT1dGSVNIX0VDQiAgICAgICAgQ0FTVDVfRUNCICAgICAgICAgIERFU19FQ0IgICAgICAgICAgREVTM19FQ0IKICBCTE9XRklTSF9DQkMgICAgICAgIENBU1Q1X0NCQyAgICAgICAgICBERVNfQ0JDICAgICAgICAgIERFUzNfQ0JDCiAgQkxPV0ZJU0hfQ0ZCNjQgICAgICBDQVNUNV9DRkI2NCAgICAgICAgREVTX0NGQjY0ICAgICAgICBERVMzX0NGQjY0CiAgQkxPV0ZJU0hfT0ZCNjQgICAgICBDQVNUNV9PRkI2NCAgICAgICAgREVTX09GQjY0ICAgICAgICBERVMzX09GQjY0CgogICAgICAgICAgVGhlIGRlZmF1bHQgaXMgREVTM19FQ0IuCgogICBTRVQgRlRQIFNSUCBIQVNIIG5hbWUKICAgICAgICAgIFNwZWNpZmllcyB0aGUgaGFzaCB0byBiZSB1c2VkIGZvciBkYXRhIHByb3RlY3Rpb24gd2hlbiBTUlAKICAgICAgICAgIGF1dGhlbnRpY2F0aW9uIGlzIGluIHVzZS4gVGhlIGNob2ljZXMgYXJlIE1ENSBhbmQgU0hBLiBUaGUKICAgICAgICAgIGRlZmF1bHQgaXMgU0hBLgoKICAgQ29tbWFuZC1saW5lIG9wdGlvbnM6CgogICAtayBuYW1lCiAgICAgICAgICBTcGVjaWZpZXMgdGhlIHJlYWxtIHRvIGJlIHVzZWQgd2l0aCBLZXJiZXJvcyA0IGF1dGhlbnRpY2F0aW9uCiAgICAgICAgICAoPSBTRVQgQVVUSCBLNCBSRUFMTSBuYW1lKS4KCiAgIC1mCiAgICAgICAgICBFbmFibGVzIGZvcndhcmRpbmcgb2YgS2VyYmVyb3MgNSBjcmVkZW50aWFscyB0byB0aGUgaG9zdCB3aGVuCiAgICAgICAgICB1c2luZyBHU1NBUEkgYXV0aGVudGljYXRpb24gKD0gU0VUIEFVVEggSzUgRk9SV0FSREFCTEUgT04pLgoKICAgLXgKICAgICAgICAgIEVuYWJsZXMgYXV0b2VuY3J5cHRpb24gKD0gU0VUIEZUUCBBVVRPRU5DUllQVElPTiBPTikuCgogICAtYyBjaXBoZXIKICAgICAgICAgIFNwZWNpZmllcyB0aGUga2luZCBvZiBjaXBoZXIgdG8gYmUgdXNlZCBmb3IgZW5jcnlwdGlvbiB3aXRoIFNSUAogICAgICAgICAgYXV0aGVudGljYXRpb24uIEVxdWl2YWxlbnQgdG8gU0VUIEZUUCBTUlAgQ0lQSEVSLCB3aXRoIHRoZSBzYW1lCiAgICAgICAgICBjaG9pY2VzLiBJZiB0aGlzIG9wdGlvbiBpcyBub3QgZ2l2ZW4sIENBU1Q1X0NCQyBpcyB1c2VkLgoKICAgLUggaGFzaAogICAgICAgICAgU3BlY2lmaWVzIHRoZSBoYXNoIHRvIGJlIHVzZWQgZm9yIGVuY3J5cHRpb24gd2l0aCBTUlAKICAgICAgICAgIGF1dGhlbnRpY2F0aW9uLiBFcXVpdmFsZW50IHRvIFNFVCBGVFAgU1JQIEhBU0gsIHdpdGggdGhlIHNhbWUKICAgICAgICAgIGNob2ljZXMuIElmIHRoaXMgb3B0aW9uIGlzIG5vdCBnaXZlbiwgU0hBIGlzIHVzZWQuCgogICAteiBkZWJ1ZwogICAgICAgICAgVHVybnMgb24gU1NML1RMUyBkZWJ1Z2dpbmcuCgogICAteiBzZWN1cmUKICAgICAgICAgIFJlcXVpcmVzIHNlY3VyZSBjb25uZWN0aW9uLgoKICAgLXogY2VydHNvawogICAgICAgICAgU2F5cyB0byBhY2NlcHQgYWxsIGNlcnRpZmljYXRlcyB3aXRob3V0IGNoZWNraW5nIHZhbGlkaXR5LgoKICAgLXogdmVyaWZ5PW4KICAgICAgICAgIFNldHMgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIG1vZGUgdG8gdGhlIGdpdmVuIG51bWJlciwgbjoKICAgICAgICAgICAgMCA9IG5vIHZlcmlmaWNhdGlvbgogICAgICAgICAgICAxID0gdmVyaWZ5IGNlcnRpZmljYXRlIGlmIHByZXNlbnRlZAogICAgICAgICAgICAyID0gcmVxdWlyZSB2ZXJpZmljYXRpb24gb2YgY2VydGlmaWNhdGUKCiAgIC16IGNlcnQ9ZmlsZW5hbWUKICAgICAgICAgIFNwZWNpZmllcyBhIGZpbGUgY29udGFpbmluZyBhIGNsaWVudCBjZXJ0aWZpY2F0ZSB0byBiZQogICAgICAgICAgcHJlc2VudGVkIHRvIHRoZSBGVFAgc2VydmVyLgoKICAgLXoga2V5PWZpbGVuYW1lCiAgICAgICAgICBTcGVjaWZpZXMgYSBmaWxlIGNvbnRhaW5pbmcgYSBwcml2YXRlIGtleSBtYXRjaGluZyB0aGUgY2xpZW50CiAgICAgICAgICBjZXJ0aWZpY2F0ZS4KCiAgIC16ICFrcmI0CiAgICAgICAgICAobm9rcmI0KSBEaXNhYmxlcyB0aGUgdXNlIG9mIEtlcmJlcm9zIDQuCgogICAteiAhZ3NzCiAgIC16IG5vZ3NzCiAgICAgICAgICBEaXNhYmxlcyB0aGUgdXNlIG9mIEdTU0FQSSAtIEtlcmJlcm9zIDUuCgogICAteiAhc3JwCiAgIC16IG5vc3JwCiAgICAgICAgICBEaXNhYmxlcyB1c2Ugb2YgU1JQLgoKICAgLXogIXNzbAogICAteiBub3NzbAogICAgICAgICAgRGlzYWJsZXMgdGhlIHVzZSBvZiBTU0wuCgogICAteiAhdGxzCiAgIC16IG5vdGxzCiAgICAgICAgICBEaXNhYmxlcyB0aGUgdXNlIG9mIFRMUy4KCiAgIENhdXRpb246IElmIHlvdXIgRlRQIGNvbm5lY3Rpb24gaXMgc2VjdXJlZCB2aWEgQVVUSCBUTFMsIGl0IGlzIG5vdAogICBwb3NzaWJsZSB0byBpbnRlcnJ1cHQgYSBmaWxlIHRyYW5zZmVyLiBUaGlzIGlzIGEgbGltaXRhdGlvbiBvZiBhbGwKICAga25vd24gRlRQIHNlcnZlcnMgdGhhdCBzdXBwb3J0IEFVVEggVExTLgoKICAgTm90ZSB0aGF0IHdoZW4gdXNpbmcgY2VydGFpbiBzZWN1cml0eSBtZXRob2RzLCBzdWNoIGFzIFNTTCBvciBUTFMsIHlvdQogICBtYXkgYmUgcHJvbXB0ZWQgdG8gY29uZmlybSBvciB2ZXJpZnkgY2VydGFpbiBhY3Rpb25zIG9yIGNvbmRpdGlvbnMsCiAgIGZvciBleGFtcGxlLCB3aGV0aGVyIHRvIGFjY2VwdCBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZXMuIFRoaXMgY2FuCiAgIGludGVyZmVyZSB3aXRoIHVuYXR0ZW5kZWQgb3BlcmF0aW9uIG9mIHNjcmlwdHM7IHNlZSBbMjM0XVNlY3Rpb24gMy4xMC4KCiAgIFsgWzIzNV1Ub3AgXSBbIFsyMzZdRlRQIFRvcCBdIFsgWzIzN11DLUtlcm1pdCBIb21lIF0gWyBbMjM4XUtlcm1pdAogICBIb21lIF0KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgMy4zLiBTZXR0aW5nIEZUUCBQcmVmZXJlbmNlcyBGVFAgcHJlZmVyZW5jZXMgY2FuIGJlIHNldCBnbG9iYWxseSBhbmQKICAgcGVyc2lzdGVudGx5IHdpdGggdGhlIGNvbW1hbmRzIGluIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnM7IG1hbnkgb2YKICAgdGhlc2UgY2FuIGFsc28gYmUgb3ZlcnJpZGRlbiBvbiBhIHBlci1jb21tYW5kIGJhc2lzIHdpdGggc3dpdGNoZXMgdGhhdAogICBoYXZlIHRoZSBzYW1lIG5hbWUuCgogICAgMy4zLjEuIExvZ3MsIE1lc3NhZ2VzLCBhbmQgT3RoZXIgRmVlZGJhY2sKCiAgIFlvdSBjYW4gY29udHJvbCB0aGUgYW1vdW50IG9mIGZlZWRiYWNrIHJlY2VpdmVkIGZyb20geW91ciBGVFAgc2Vzc2lvbgogICB3aXRoIHRoZSBjb21tYW5kcyBpbiB0aGlzIHNlY3Rpb24uIEZpcnN0LCB5b3UgY2FuIGNyZWF0ZSBhIGxvZyBvZiB5b3VyCiAgIEZUUCB0cmFuc2ZlcnMgd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1hbmRzOgoKICAgU0VUIFRSQU5TQUNUSU9OLUxPRyB7IFZFUkJPU0UsIEZUUCwgQlJJRUYgfQogICAgICAgICAgU2VsZWN0cyB0aGUgbG9nIGZvcm1hdC4gVkVSQk9TRSBpcyB0aGUgZGVmYXVsdCwgYW5kIGlzCiAgICAgICAgICBkZXNjcmliZWQgaW4gWzIzOV10aGUgbWFudWFsLiBGVFAgY2hvb3NlcyBhIFdVLUZUUEQgZm9ybWF0LCB0aGUKICAgICAgICAgIHNhbWUgYXMgaXMgdXNlZCBieSB0aGUgcG9wdWxhciBGVFAgc2VydmVyLiBCUklFRiBjcmVhdGVzCiAgICAgICAgICBwZXItZmlsZSByZWNvcmRzIGluIGNvbW1hLXNlcGFyYXRlZC1saXN0IGZvcm1hdC4gRm9yIGdyZWF0ZXIKICAgICAgICAgIGRldGFpbCwgc2VlIFsyNDBdU2VjdGlvbiA0LjE3IG9mIHRoZSBbMjQxXUMtS2VybWl0IDcuMCBVcGRhdGUKICAgICAgICAgIE5vdGVzLgoKICAgTE9HIFRSQU5TQUNUSU9OUyBmaWxlbmFtZQogICAgICAgICAgUmVjb3JkcyBGVFAgKG9yIEtlcm1pdCwgb3IgYW55IG90aGVyIHByb3RvY29sKSB1cGxvYWRzIGFuZAogICAgICAgICAgZG93bmxvYWRzIGluIHRoZSBnaXZlbiBmaWxlIHVzaW5nIHRoZSBmb3JtYXQgc2VsZWN0ZWQgYnkgdGhlCiAgICAgICAgICBtb3N0IHJlY2VudCBTRVQgVFJBTlNBQ1RJT04tTE9HIGNvbW1hbmQsIGlmIGFueSwgb3IgZWxzZSB0aGUKICAgICAgICAgIGRlZmF1bHQgZm9ybWF0LgoKICAgRlRQIHNjcmVlbiBtZXNzYWdlcyBhbmQgZGlzcGxheXMgYXJlIGNvbnRyb2xsZWQgYnkgdGhlIGZvbGxvd2luZwogICBjb21tYW5kczoKCiAgIFNFVCBUUkFOU0ZFUiBESVNQTEFZIHsgRlVMTFNDUkVFTiwgQ1JULCBTRVJJQUwsIEJSSUVGLCBOT05FLCBPRkYgfQogICAgICAgICAgRlRQIHRyYW5zZmVycyB1c2UgS2VybWl0J3Mgbm9ybWFsIGZpbGUtdHJhbnNmZXIgZGlzcGxheSBzdHlsZXMuCiAgICAgICAgICBVc2UgdGhpcyBjb21tYW5kIHRvIGNob29zZSB0aGUgZGVzaXJlZCBmb3JtYXQ7IHRoZSBkZWZhdWx0IG9uCiAgICAgICAgICBtb3N0IHBsYXRmb3JtcyBpcyBGVUxMU0NSRUVOLiBUaGUgZGlzcGxheSBpcyBhdXRvbWF0aWNhbGx5CiAgICAgICAgICBkaXNhYmxlZCBpZiBLZXJtaXQgaXMgcnVubmluZyBpbiB0aGUgYmFja2dyb3VuZCBvciBpbiBiYXRjaC4KICAgICAgICAgIEJSSUVGIGlzIGFsd2F5cyB1c2VkIGZvciBjb21tYW5kLWxpbmUgaW5pdGlhdGVkIHRyYW5zZmVycwogICAgICAgICAgKHVubGVzcyBzdXBwcmVzc2VkIGJ5IC1xKS4gV2hpbGUgYSBmaWxlLXRyYW5zZmVyIGlzIGluCiAgICAgICAgICBwcm9ncmVzcywgeW91IGNhbiBpbnRlcnJ1cHQgaXQgaW4gdGhlIG5vcm1hbCBLZXJtaXQgd2F5IGJ5CiAgICAgICAgICB0eXBpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmcga2V5cyBvciBrZXkgY29tYmluYXRpb25zOgogICAgICAgICAgICBYIC0gQ2FuY2VsIGN1cnJlbnQgZmlsZSBidXQgZ28gb24gdG8gdGhlIG5leHQgb25lIChpZiBhbnkpLgogICAgICAgICAgICBaIC0gQ2FuY2VsIHRoZSBlbnRpcmUgdHJhbnNmZXIuICAgQ3RybC1MIG9yIEN0cmwtVyAtIFJlZnJlc2gKICAgICAgICAgIHRoZSBmaWxlLXRyYW5zZmVyIGRpc3BsYXkgKGlmIGFueSkuCgogICBTRVQgRlRQIERJU1BMQVkgeyBGVUxMU0NSRUVOLCBDUlQsIFNFUklBTCwgQlJJRUYsIE5PTkUsIE9GRiB9CiAgICAgICAgICBMaWtlIFNFVCBUUkFOU0ZFUiBESVNQTEFZLCBidXQgYXBwbGllcyBvbmx5IHRvIEZUUCBjb25uZWN0aW9ucywKICAgICAgICAgIGFuZCBkb2VzIG5vdCBhZmZlY3QgS2VybWl0LSBvciBvdGhlciBwcm90b2NvbCBmaWxlIHRyYW5zZmVycy4KCiAgIFNFVCBRVUlFVCB7IE9OLCBPRkYgfQogICAgICAgICAgVGhpcyBjb21tYW5kIGFwcGxpZXMgdG8gS2VybWl0IGluIGdlbmVyYWwsIG5vdCBqdXN0IEZUUC4gT0ZGIGJ5CiAgICAgICAgICBkZWZhdWx0OyB3aGVuIE9OLCBpdCBzdXJwcmVzc2VzIG1vc3QgbWVzc2FnZXMgZnJvbSBtb3N0CiAgICAgICAgICBjb21tYW5kcyBhcyB3ZWxsIGFzIHRoZSBmaWxlLXRyYW5zZmVyIGRpc3BsYXkuCgogICBTRVQgRlRQIFBST0dSRVNTLU1FU1NBR0VTIHsgT04sIE9GRiB9CiAgICAgICAgICBUZWxscyB3aGV0aGVyIEtlcm1pdCBzaG91bGQgcHJpbnQgbG9jYWxseS1nZW5lcmF0ZWQgZmVlZGJhY2sKICAgICAgICAgIG1lc3NhZ2VzIGZvciBlYWNoIG5vbi1maWxlLXRyYW5zZmVyIGNvbW1hbmQuIE9OIGJ5IGRlZmF1bHQuCgogICBTRVQgRlRQIFZFUkJPU0UtTU9ERSB7IE9OLCBPRkYgfQogICAgICAgICAgVGVsbHMgd2hldGhlciB0byBkaXNwbGF5IGFsbCByZXNwb25zZXMgZnJvbSB0aGUgRlRQIHNlcnZlci4gT0ZGCiAgICAgICAgICBieSBkZWZhdWx0LiBUaGlzIHNob3dzIGFsbCByZXNwb25zZXMgdG8gYWxsIGNvbW1hbmRzLCBleGNlcHQKICAgICAgICAgIHdoZW4gdGhlIGZpbGUtdHJhbnNmZXIgZGlzcGxheSBpcyBhY3RpdmUsIGFuZCB1bmxlc3MgeW91IGhhdmUKICAgICAgICAgIFNFVCBRVUlFVCBPTi4gV2hlbiBPRkYsIHJlc3BvbnNlcyBhcmUgc2hvd24gb25seSBmb3IgY29tbWFuZHMKICAgICAgICAgIHN1Y2ggYXMgRlRQIFBXRCB3aG9zZSBwdXJwb3NlIGlzIHRvIGRpc3BsYXkgYSByZXNwb25zZS4KCiAgIFNFVCBGVFAgREVCVUcgeyBPTiwgT0ZGIH0KICAgICAgICAgIFRlbGxzIHdoZXRoZXIgbG9jYWwgY2xpZW50IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBzaG91bGQgYmUKICAgICAgICAgIGRpc3BsYXllZC4gT0ZGIGJ5IGRlZmF1bHQuIFdoZW4gT04sIHRoZSBjb21tYW5kcyB0aGF0IGFyZSBzZW50CiAgICAgICAgICB0byB0aGUgc2VydmVyIGFyZSBzaG93biwgYXMgd2VsbCBhcyBpdHMgcmVzcG9uc2VzIChldmVuIGlmCiAgICAgICAgICBWRVJCT1NFLU1PREUgaXMgT0ZGKSwgcGx1cyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uYWwgbWVzc2FnZXMKICAgICAgICAgIGFyZSBwcmludGVkIHJlZ2FyZGluZyB0aGUgcHJvZ3Jlc3Mgb2Ygc2VjdXJlIG9wZXJhdGlvbnMuIEFsc28sCiAgICAgICAgICB0aGUgdGVtcG9yYXJ5IGZpbGUgY3JlYXRlZCBieSB0aGUgWzI0Ml1NR0VUIGNvbW1hbmQgaXMgbm90CiAgICAgICAgICBkZWxldGVkIHNvIHlvdSBjYW4gc2VlIHdoYXQncyBpbiBpdC4KCiAgIFNldCBhbGwgb2YgdGhlc2UgdG8gT0ZGIHdoZW4gc2lsZW50IHJ1bm5pbmcgaXMgZGVzaXJlZC4KCiAgICAzLjMuMi4gT3BlcmF0aW9uYWwgUHJlZmVyZW5jZXMKCiAgIEZUUCBESVNBQkxFIG5ldy1wcm90b2NvbC1mZWF0dXJlLW5hbWUKICAgRlRQIEVOQUJMRSBuZXctcHJvdG9jb2wtZmVhdHVyZS1uYW1lCiAgICAgICAgICBFeHBsYWluZWQgaW4gWzI0M11TZWN0aW9uIDMuMTEuCgogICBTRVQgRlRQIEFVVE9MT0dJTiB7IE9OLCBPRkYgfQogICAgICAgICAgSWYgeW91IGdpdmUgdGhpcyBjb21tYW5kIHByaW9yIHRvIG9wZW5pbmcgYW4gRlRQIGNvbm5lY3Rpb24sIGl0CiAgICAgICAgICBjb250cm9scyB3aGV0aGVyIEtlcm1pdCB0cmllcyB0byBsb2cgeW91IGluIGF1dG9tYXRpY2FsbHkgYXMKICAgICAgICAgIHBhcnQgb2YgdGhlIGNvbm5lY3Rpb24gcHJvY2Vzcy4gTm9ybWFsbHkgT04sIHdoaWNoIG1lYW5zIHRoZQogICAgICAgICAgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGFyZSBzZW50IGF1dG9tYXRpY2FsbHkgKGFuZCBwcm9tcHRlZCBmb3IKICAgICAgICAgIGlmIHRoZXkgYXJlIG5vdCB5ZXQga25vd24pLiBXaGVuIE9GRiwgRlRQIE9QRU4gY29ubmVjdHMgdG8gdGhlCiAgICAgICAgICBzZXJ2ZXIgd2l0aG91dCBsb2dnaW5nIGluLiBPRkYgaXMgZXF1aXZhbGVudCB0byB0aGUgLW4KICAgICAgICAgIGNvbW1hbmQtbGluZSBvcHRpb24gd2hlbiB1c2luZyBLZXJtaXQncyBGVFAgY29tbWFuZC1saW5lCiAgICAgICAgICBwZXJzb25hbGl0eS4gU2VlIFsyNDRdU2VjdGlvbiAzLjEuNCBmb3IgdXNhZ2UuCgogICBTRVQgRlRQIFBBU1NJVkUtTU9ERSB7IE9OLCBPRkYgfQogICAgICAgICAgT04gYnkgZGVmYXVsdCwgdG8gYXZvaWQgcmFuZG9tIFRDUCBwb3J0IGFzc2lnbm1lbnQgZm9yIGRhdGEKICAgICAgICAgIGNvbm5lY3Rpb25zLCB3aGljaCBjYW4gcHJldmVudCBGVFAgcHJvdG9jb2wgZnJvbSB3b3JraW5nCiAgICAgICAgICB0aHJvdWdoIGZpcmV3YWxscyBhbmQgbmV0d29yayBhZGRyZXNzIHRyYW5zbGF0b3JzIChmb3IgbW9yZSBvbgogICAgICAgICAgdGhlc2UgdG9waWNzLCBzZWUgdGhlIFsyNDVdS2VybWl0IHNlY3VyaXR5IHJlZmVyZW5jZS4gU2V0IHRvCiAgICAgICAgICBPRkYgaW4gY2FzZSB0aGUgRlRQIHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHBhc3NpdmUgbW9kZSwgb3IgaW4KICAgICAgICAgIGNhc2UgdGhlIGNsaWVudCBoYXMgcHJvYmxlbXMgd2l0aCBpdCAoaXQgaGFzIGJlZW4gb2JzZXJ2ZWQsIGZvcgogICAgICAgICAgZXhhbXBsZSwgdGhhdCB3aGVuIHVzaW5nIHBhc3NpdmUgbW9kZSwgdGhlIFNDTyBYRU5JWCAyLjMuNAogICAgICAgICAgVENQL0lQIHN0YWNrIGhhbmdzIGluIHRoZSBjb25uZWN0KCkgY2FsbCBmb3JldmVyKS4gU3lub255bXM6CiAgICAgICAgICBQQVNTSVZFIFsgT04gXSwgUEFTU0lWRSBPRkYsIFBBU1YgWyBPTiBdLCBQQVNWIE9GRi4KCiAgIFNFVCBGVFAgU0VORC1QT1JULUNPTU1BTkRTIHsgT04sIE9GRiB9CiAgICAgICAgICBUaGlzIGNvbW1hbmQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBGVFAgY2xpZW50IHNlbmRzIGEgbmV3IFBPUlQKICAgICAgICAgIGNvbW1hbmQgdG8gdGhlIHNlcnZlciB3aGVuIGFjY2VwdGluZyBpbmNvbWluZyBkYXRhIGNvbm5lY3Rpb25zCiAgICAgICAgICAoYXMgd2hlbiBub3QgdXNpbmcgcGFzc2l2ZSBtb2RlLikgV2hlbiBQQVNTSVZFLU1PREUgaXMgT0ZGIGFuZAogICAgICAgICAgU0VUIFNFTkQtUE9SVCBpcyBPRkYsIHRoZSBwb3J0IHRoYXQgd2FzIG9yaWdpbmFsbHkgc3BlY2lmaWVkIGlzCiAgICAgICAgICByZXVzZWQuIFRoaXMgaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIG5vcm1hbCBGVFAgY2xpZW50cyBidXQKICAgICAgICAgIGl0IGlzIG5vdCBjb21wYXRpYmxlIHdpdGggbWFueSBmaXJld2FsbHMuCgogICBTRVQgRlRQIENIQVJBQ1RFUi1TRVQtVFJBTlNMQVRJT04geyBPTiwgT0ZGIH0KICAgICAgICAgIFdoZXRoZXIgdG8gdHJhbnNsYXRlIGNoYXJhY3RlciBzZXRzIHdoZW4gdHJhbnNmZXJyaW5nIGZpbGVzCiAgICAgICAgICB3aXRoIEZUUCAoZXhwbGFpbmVkIGluIFsyNDZdU2VjdGlvbiAzLjcpLiBPRkYgYnkgZGVmYXVsdC4KCiAgIFNFVCBGVFAgU0VSVkVSLUNIQVJBQ1RFUi1TRVQgbmFtZQogICAgICAgICAgVGVsbHMgS2VybWl0IHRoZSBjaGFyYWN0ZXIgc2V0IHVzZWQgYnkgdGhlIEZUUCBzZXJ2ZXIsIFVURi04IGJ5CiAgICAgICAgICBkZWZhdWx0IChbMjQ3XVNlY3Rpb24gMy43KS4KCiAgIFNFVCBGVFAgU0VSVkVSLVRJTUUtT0ZGU0VUIGRlbHRhLXRpbWUKICAgICAgICAgIFRlbGxzIEtlcm1pdCB0byBhcHBseSB0aGUgZ2l2ZW4gWzI0OF1kZWx0YSB0aW1lIHRvIGZpbGUKICAgICAgICAgIHRpbWVzdGFtcHMgcHJvdmlkZWQgYnkgdGhlIHNlcnZlciBmb3IgaXRzIGZpbGVzOyBmb3IgdXNlIHdoZW4KICAgICAgICAgIChmb3IgZXhhbXBsZSkgdGhlIHNlcnZlciBkb2VzIG5vdCBoYXZlIGl0cyB0aW1lem9uZSBzZXQKICAgICAgICAgIGNvcnJlY3RseS4KCiAgIFNFVCBGVFAgRVJST1ItQUNUSU9OIHsgUFJPQ0VFRCwgUVVJVCB9CiAgICAgICAgICBXaGVuIHRyYW5zZmVycmluZyBhIGdyb3VwIG9mIGZpbGVzIHdpdGggRlRQLCBhbmQgYW4gZXJyb3IKICAgICAgICAgIG9jY3VycyB3aXRoIG9uZSBvZiB0aGUgZmlsZXMsIEtlcm1pdCBub3JtYWxseSBnb2VzIG9uIHRoZSBuZXh0CiAgICAgICAgICBmaWxlLiBVc2UgU0VUIEZUUCBFUlJPUi1BQ1RJT04gdG8gUVVJVCB0byBtYWtlIEtlcm1pdCBzdG9wIHRoZQogICAgICAgICAgdHJhbnNmZXIgaW1tZWRpYXRlbHkgYW5kIGZhaWwgaWYgYW4gZXJyb3Igb2NjdXJzIHdpdGggYW55CiAgICAgICAgICBzaW5nbGUgZmlsZSBpbiB0aGUgZ3JvdXAuIEV4YW1wbGU6IHlvdSBoYXZlIGdpdmVuIEtlcm1pdCBhIGxpc3QKICAgICAgICAgIG9mIGZpbGVzIHRvIHNlbmQsIGFuZCBvbmUgb2YgdGhlIGZpbGVzIGNhbiBub3QgYmUgZm91bmQsIG9yCiAgICAgICAgICByZWFkIHBlcm1pc3Npb24gaXMgZGVuaWVkLiBOb3RlIHRoYXQgY2FuY2VsbGluZyBhIGZpbGUgYnkKICAgICAgICAgIHR5cGluZyAnWCcgZHVyaW5nIHRyYW5zZmVyIGlzIG5vdCBjb25zaWRlcmVkIGFuIGVycm9yIChpZiB5b3UKICAgICAgICAgIHdhbnQgdG8gY2FuY2VsIHRoZSBlbnRpcmUgdHJhbnNmZXIsIHR5cGUgJ1onIG9yIEN0cmwtQykuCgogICBTRVQgRlRQIFBFUk1JU1NJT05TIHsgQVVUTywgT04sIE9GRiB9CiAgICAgICAgICBXaGVuIHVwbG9hZGluZyBmaWxlcyB3aXRoIFBVVCBvciBNUFVULCB0aGlzIHRlbGxzIHdoZXRoZXIKICAgICAgICAgIEtlcm1pdCBzaG91bGQgc2VuZCBlYWNoIGZpbGUncyBwZXJtaXNzaW9ucy4gVGhlIGRlZmF1bHQgaXMgT0ZGLAogICAgICAgICAgd2hpY2ggbWVhbnMgbm90IHRvIHNlbmQgcGVybWlzc2lvbnMsIGluIHdoaWNoIGNhc2UgdGhlIHVwbG9hZGVkCiAgICAgICAgICBmaWxlJ3MgcGVybWlzc2lvbnMgYXJlIHNldCBieSB0aGUgRlRQIHNlcnZlciBhY2NvcmRpbmcgdG8gaXRzCiAgICAgICAgICBvd24gY3JpdGVyaWEuIE9OIG1lYW5zIHRvIHNlbmQgdGhlbSwgQVVUTyBtZWFucyB0byBzZW5kIHRoZW0KICAgICAgICAgIG9ubHkgaWYgdGhlIGNsaWVudCAoS2VybWl0KSBhbmQgc2VydmVyIGFyZSBvbiBsaWtlIHBsYXRmb3JtcwogICAgICAgICAgKGUuZy4gYm90aCBVTklYKS4gVGhpcyBjb21tYW5kIGhhcyBubyBlZmZlY3Qgd2hlbiBkb3dubG9hZGluZywKICAgICAgICAgIHNpbmNlIHRoZSBGVFAgcHJvdG9jb2wgZG9lcyBub3QgaW5jbHVkZSBhIHdheSBmb3IgdGhlIHNlcnZlciB0bwogICAgICAgICAgaW5mb3JtIHRoZSBjbGllbnQgb2YgYSBmaWxlJ3MgcGVybWlzc2lvbnMuIEFsc28gc2VlIFsyNDldRlRQCiAgICAgICAgICBQVVQgL1BFUk1JU1NJT05TLiBOb3RlIHRoYXQgc2V0dGluZyBwZXJtaXNzaW9ucyBhZnRlciB1cGxvYWRpbmcKICAgICAgICAgIGlzIGxpa2VseSB0byB3b3JrIChjb3JyZWN0bHkgb3IgYXQgYWxsKSBvbmx5IHdoZW4gdGhlIGNsaWVudAogICAgICAgICAgYW5kIHNlcnZlciBwbGF0Zm9ybXMgYXJlIGFsaWtlIChlLmcuIGJvdGggb2YgdGhlbSBhcmUgc29tZSBmb3JtCiAgICAgICAgICBvZiBVTklYKS4gQWxzbyBub3RlIHRoYXQgV2luZG93cyBmaWxlcyBkb24ndCBoYXZlIHBlcm1pc3Npb25zLgogICAgICAgICAgQWxzbyBzZWUgWzI1MF1GVFAgQ0hNT0QuCgogICBTRVQgRlRQIERBVEVTIHsgT04sIE9GRiB9CiAgICAgICAgICBXaGVuIGRvd25sb2FkaW5nIGZpbGVzIHdpdGggR0VUIG9yIE1HRVQsIHRoaXMgdGVsbHMgd2hldGhlcgogICAgICAgICAgS2VybWl0IHNob3VsZCB0cnkgdG8gc2V0IHRoZSByZWNlaXZlZCBmaWxlJ3MgZGF0ZSBmcm9tIHRoZQogICAgICAgICAgc2VydmVyJ3MgZGF0ZS4gRlRQIERBVEVTIGlzIE9OIGJ5IGRlZmF1bHQuIE5vdGUsIGhvd2V2ZXIsIHRoYXQKICAgICAgICAgIEZUUCBwcm90b2NvbCBkb2VzIG5vdCBhbGxvdyBkYXRlIHByZXNlcnZhdGlvbiB3aGVuIHVwbG9hZGluZy4KICAgICAgICAgIFNvIGF0IGJlc3QsIFNFVCBGVFAgREFURVMgT04gY2FuIHdvcmsgb25seSB3aGVuIGRvd25sb2FkaW5nLAogICAgICAgICAgYW5kIHRoZW4gb25seSB3aGVuIHRoZSBzZXJ2ZXIgYWdyZWVzIHRvIGZ1cm5pc2ggZmlsZSBkYXRlcy4KCiAgIFNFVCBGVFAgRklMRU5BTUVTIHsgQVVUTywgQ09OVkVSVEVELCBMSVRFUkFMIH0KICAgICAgICAgIFdoZW4gdXBsb2FkaW5nIChzZW5kaW5nKSBmaWxlcywgdGhpcyB0ZWxscyB3aGV0aGVyIHRvIGNvbnZlcnQKICAgICAgICAgIG91dGJvdW5kIGZpbGVuYW1lcyB0byAiY29tbW9uIGZvcm0iLiBUaGlzIG1lYW5zIGFsbG93aW5nIG9ubHkKICAgICAgICAgIG9uZSBwZXJpb2QgaW4gYSBuYW1lLCB1cHBlcmNhc2luZyBhbnkgbG93ZXJjYXNlIGxldHRlcnMsCiAgICAgICAgICByZXBsYWNpbmcgc3BhY2VzIGJ5IHVuZGVyc2NvcmVzLCBldGMuIEFVVE9NQVRJQyBpcyB0aGUgZGVmYXVsdCwKICAgICAgICAgIG1lYW5pbmcgTElURVJBTCB3aGVuIGNsaWVudCBhbmQgc2VydmVyIGFyZSB0aGUgc2FtZSB0eXBlIG9mCiAgICAgICAgICBzeXN0ZW0gKGUuZy4gVU5JWCkgYW5kIENPTlZFUlRFRCBvdGhlcndpc2UuIFNwZWNpYWwgY2FzZTogaWYKICAgICAgICAgIHRoZSBzZXR0aW5nIGlzIEFVVE9NQVRJQyBhbmQgdGhlIGNsaWVudCBpcyBub3QgVU5JWCBhbmQgdGhlCiAgICAgICAgICBzZXJ2ZXIgaWRlbnRpZmllcyBpdHNlbGYgYXMgVU5JWCwgS2VybWl0IHVzZXMgYSBsZXNzLXN0cmljdAogICAgICAgICAgZm9ybSBvZiBjb252ZXJzaW9uLCBpbiB3aGljaCBsb3dlcmNhc2UgbGV0dGVycyBhcmUgbm90CiAgICAgICAgICB1cHBlcmNhc2VkIGFuZCB0aGUgZmlsZW5hbWUgY2FuIGNvbnRhaW4gYW55IG51bWJlciBvZiBwZXJpb2RzLAogICAgICAgICAgYnV0IHNwYWNlcyBhcmUgc3RpbGwgY29udmVydGVkIHRvIHVuZGVyc2NvcmUuIFdoZW4gcmVjZWl2aW5nLAogICAgICAgICAgY29udmVyc2lvbiBnZW5lcmFsbHkgbWVhbnMgdG8gY2hhbmdlIGFsbC11cHBlcmNhc2UgbmFtZXMgdG8KICAgICAgICAgIGxvd2VyY2FzZSBhbmQgc3BhY2VzIHRvIHVuZGVyc2NvcmUuCgogICBTRVQgRlRQIFVOSVFVRS1TRVJWRVItTkFNRVMgeyBPTiwgT0ZGIH0KICAgICAgICAgIEFwcGxpZXMgb25seSB0byB1cGxvYWRzLiBUZWxscyB0aGUgc2VydmVyIHRvIGNyZWF0ZSBuZXcsIHVuaXF1ZQogICAgICAgICAgbmFtZXMgZm9yIGluY29taW5nIGZpbGVzIHRoYXQgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyBleGlzdGluZwogICAgICAgICAgZmlsZXMuIE9GRiBieSBkZWZhdWx0LCBpbiB3aGljaCBjYXNlIHRoZSBzZXJ2ZXIgb3ZlcndyaXRlcwogICAgICAgICAgZXhpc3RpbmcgZmlsZXMgd2l0aCBuZXcgZmlsZXMgb2YgdGhlIHNhbWUgbmFtZS4gV2hlbiBPTiwgdGhlCiAgICAgICAgICBzZXJ2ZXIgdXNlcyBpdHMgb3duIGJ1aWx0LWluIG1ldGhvZCBmb3IgY3JlYXRpbmcgbmV3IG5hbWVzIGZvcgogICAgICAgICAgaW5jb21pbmcgZmlsZXM7IGZvciBleGFtcGxlLCBhcHBlbmRpbmcgYSBwZXJpb2QgKC4pIGFuZCBhCiAgICAgICAgICBudW1iZXIgdG8gdGhlIG5hbWUuIENBVVRJT046IFVzZSB0aGlzIG9wdGlvbiBvbmx5IGlmIHlvdSBkbyBub3QKICAgICAgICAgIG5lZWQgdG8gcmVmZXIgdG8gdGhlIGZpbGUgYWZ0ZXIgaXQgaXMgdXBsb2FkZWQsIHNpbmNlIEZUUAogICAgICAgICAgcHJvdG9jb2wgcHJvdmlkZXMgbm8gbWVjaGFuaXNtIGZvciB0aGUgY2xpZW50IHRvIGZpbmQgb3V0IHdoYXQKICAgICAgICAgIG5hbWUgd2FzIGFzc2lnbmVkIGJ5IHRoZSBzZXJ2ZXIuCgogICBTRVQgRlRQIENPTExJU0lPTiB7IC4uLiB9CiAgICAgICAgICBXaGVuIGRvd25sb2FkaW5nLCB3aGF0IHRvIGRvIGlmIGFuIGluY29taW5nIGZpbGUgaGFzIHRoZSBzYW1lCiAgICAgICAgICBuYW1lIGFzIGFuIGV4aXN0aW5nIGZpbGUuIE9wdGlvbnMgYXJlIHRoZSBzYW1lIGFzIGZvciBTRVQgRklMRQogICAgICAgICAgQ09MTElTSU9OLiBJZiB0aGlzIGNvbW1hbmQgaXMgbm90IGdpdmVuLCBLZXJtaXQncyByZWd1bGFyIEZJTEUKICAgICAgICAgIENPTExJU0lPTiBzZXR0aW5nIGlzIHVzZWQuIElmIHRoaXMgY29tbWFuZCBpcyBnaXZlbiwgaXQKICAgICAgICAgIG92ZXJyaWRlcyB0aGUgRklMRSBDT0xMSVNJT04gc2V0dGluZyBmb3IgRlRQIHRyYW5zZmVycyBvbmx5LgogICAgICAgICAgU2VlIFsyNTFdU2VjdGlvbiAzLjYuMiBmb3IgZGV0YWlscy4KCiAgIFNFVCBGVFAgVFlQRSB7IFRFWFQsIEJJTkFSWSwgVEVORVggfQogICAgICAgICAgQ2hhbmdlcyB0aGUgZGVmYXVsdCB0cmFuc2ZlciBtb2RlLiBXaGVuIHNlbmRpbmcgKHVwbG9hZGluZykKICAgICAgICAgIGZpbGVzLCB0aGlzIGNvbW1hbmQgaGFzIG5vIGVmZmVjdCB1bmxlc3MgeW91IGRpc2FibGUgYXV0b21hdGljCiAgICAgICAgICB0ZXh0L2JpbmFyeSBtb2RlIHN3aXRjaGluZyAoWzI1Ml1TZWN0aW9uIDQpIHdpdGggU0VUIEZJTEUgU0NBTgogICAgICAgICAgT0ZGIG9yIFNFVCBUUkFOU0ZFUiBNT0RFIE1BTlVBTC4gV2hlbiByZWNlaXZpbmcgKGRvd25sb2FkaW5nKQogICAgICAgICAgZmlsZXMsIHRoaXMgY29tbWFuZCBlc3RhYmxpc2hlcyB0aGUgdHJhbnNmZXIgbW9kZSB0byBiZSB1c2VkCiAgICAgICAgICB3aGVuIGEgZmlsZW5hbWUgZG9lcyBub3QgbWF0Y2ggYW55IG9mIEtlcm1pdCdzIHRleHQgb3IgYmluYXJ5CiAgICAgICAgICBmaWxlbmFtZSBwYXR0ZXJucywgdW5sZXNzIHlvdSB1c2UgU0VUIEZUUAogICAgICAgICAgR0VULUZJTEVUWVBFLVNXSVRDSElORyBvciBTRVQgVFJBTlNGRVIgTU9ERSBNQU5VQUwgdG8gZGlzYWJsZQogICAgICAgICAgYXV0b21hdGljIHN3aXRjaGluZywgaW4gd2hpY2ggY2FzZSwgdGhpcyBjb21tYW5kIGVzdGFibGlzaGVzCiAgICAgICAgICB0aGUgdHJhbnNmZXIgbW9kZSBmb3IgYWxsIGRvd25sb2FkZWQgZmlsZXMuIEluIGFsbCBjYXNlcywKICAgICAgICAgIGhvd2V2ZXIsIHRoZSBGVFAgVFlQRSBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhbnkgR0VUIG9yIFBVVAogICAgICAgICAgY29tbWFuZCBieSBpbmNsdWRpbmcgYSAvVEVYVCAoL0FTQ0lJKSwgL0JJTkFSWSwgb3IgL1RFTkVYCiAgICAgICAgICBzd2l0Y2guIFRoZSBGVFAgVFlQRSBpcyBpbmRlcGVuZGVudCBvZiB0aGUgS2VybWl0IEZJTEUgVFlQRQogICAgICAgICAgc2V0dGluZy4gVEVORVggaXMgdXNlZCBmb3Igc2VuZGluZyA4LWJpdCBiaW5hcnkgZmlsZXMgdG8gMzYtYml0CiAgICAgICAgICBwbGF0Zm9ybXMgc3VjaCBhcyBUT1BTLTEwLCBUT1BTLTIwLCBhbmQgVEVORVgsIGFuZCBnZXR0aW5nIHRoZW0KICAgICAgICAgIGJhY2sgYWdhaW4uIFN5bm9ueW06IEFTQ0lJID0gVEVYVC4gTm90ZTogdGhlcmUgaXMgYWxzbyBhbiBGVFAKICAgICAgICAgIFRZUEUgY29tbWFuZCwgd2hpY2ggZG9lcyB3aGF0IFNFVCBGVFAgVFlQRSBkb2VzIGJ1dCBhbHNvIHNlbmRzCiAgICAgICAgICBhIFRZUEUgY29tbWFuZCB0byB0aGUgc2VydmVyIGltbWVkaWF0ZWx5IGlmIHRoZSBnaXZlbiB0eXBlIGlzCiAgICAgICAgICBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBvbmUuCgogICBJZiB5b3Ugd2FudCB3YW50IHNwZWNpZmljIEZUUCBwcmVmZXJlbmNlIHNldHRpbmdzIHRvIGJlIGluIGVmZmVjdCBmb3IKICAgYWxsIHlvdXIgS2VybWl0IEZUUCBzZXNzaW9ucywgcHV0IHRoZSBkZXNpcmVkIFNFVCBGVFAgY29tbWFuZHMgaW4geW91cgogICBLZXJtaXQgY3VzdG9taXphdGlvbiBmaWxlICh+Ly5teWtlcm1yYyBpbiBVTklYLCBLOTVDVVNUT00uSU5JIGluCiAgIFdpbmRvd3MpLgoKICAgWyBbMjUzXVRvcCBdIFsgWzI1NF1GVFAgVG9wIF0gWyBbMjU1XUMtS2VybWl0IEhvbWUgXSBbIFsyNTZdS2VybWl0CiAgIEhvbWUgXQogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDMuNC4gTWFuYWdpbmcgRGlyZWN0b3JpZXMgYW5kIEZpbGVzCgogICBJbiBLZXJtaXQsIGNvbW1hbmRzIGZvciBkaXJlY3RvcnkgYW5kIGZpbGUgbWFuYWdlbWVudCBjYW4gcmVmZXIgdG86CgogICAgICogVGhlIGxvY2FsIGNvbXB1dGVyCiAgICAgKiBBIHJlbW90ZSBjb21wdXRlciB3aGVuIHlvdSBoYXZlIGEgY29ubmVjdGlvbiB0byBhIEtlcm1pdCBzZXJ2ZXIgb3IKICAgICAgIElLU0QuCiAgICAgKiBBIHJlbW90ZSBjb21wdXRlciB3aGVuIHlvdSBoYXZlIGEgY29ubmVjdGlvbiB0byBhbiBGVFAgc2VydmVyLgoKICAgKFRoZXJlIGNhbiBhbHNvIGJlIGFuIEhUVFAgY29ubmVjdGlvbiwgYnV0IHRoZSBjb21tYW5kcyBpbiB0aGlzCiAgIHNlY3Rpb24gZG9uJ3QgYXBwbHkgdG8gSFRUUCBjb25uZWN0aW9ucy4pCgogICBUaHVzIGluIGdlbmVyYWwsIGVhY2ggc3VjaCBjb21tYW5kIGNvbWVzIGluIHRocmVlIGZvcm1zOgoKICAgIDEuIFdpdGggbm8gcHJlZml4IGluIEMtS2VybWl0IDguMC4yMDAsIGl0IHJlZmVycyB0byB0aGUgbG9jYWwKICAgICAgIGNvbXB1dGVyIChDRCwgRElSLCBldGMpLiBJbiBDLUtlcm1pdCA4LjAuMjAxIGFuZCBsYXRlciwgaG93ZXZlciwKICAgICAgIHRoZSAibG9jdXMiIHN3aXRjaGVzIHRvIGF1dG9tYXRpY2FsbHkgdG8gdGhlIHJlbW90ZSBGVFAgc2VydmVyCiAgICAgICB3aGVuIHlvdSBtYWtlIGFuIEZUUCBjb25uZWN0aW9uIChzZWUgdGhlIFNFVCBMT0NVUyBkZXNjcmlwdGlvbgogICAgICAgWzI1N11TZWN0aW9uIDcpOyB0aHVzIEMtS2VybWl0IDguMC4yMDEgYWN0cyBhbG1vc3QgZXhhY3RseSBsaWtlIGEKICAgICAgIHJlZ3VsYXIgRlRQIGNsaWVudCB3aGVuIGl0IGhhcyBhbiBGVFAgY29ubmVjdGlvbiwgeWV0IHN0aWxsIGFjdHMKICAgICAgIGxpa2UgaXRzZWxmIG9uIG90aGVyIGtpbmRzIG9mIGNvbm5lY3Rpb25zLgogICAgMi4gV2l0aCB0aGUgUkVNT1RFIHByZWZpeCwgaXQgaXMgZm9yIGEgS2VybWl0IHNlcnZlciAoUkVNT1RFIENELAogICAgICAgUkVNT1RFIERJUikuCiAgICAzLiBXaXRoIHRoZSBGVFAgcHJlZml4LCBpdCdzIGZvciBhbiBGVFAgc2VydmVyIChGVFAgQ0QsIEZUUCBESVIpLgogICAgNC4gQWxzbyBzZWUgWzI1OF1TZWN0aW9uIDMuOCwgd2hpY2ggZXhwbGFpbnMgIlItY29tbWFuZHMiIGFuZAogICAgICAgIkwtY29tbWFuZHMiLgoKICAgS2VybWl0J3MgRlRQIGZpbGUgYW5kIGRpcmVjdG9yeSBtYW5hZ2VtZW50IGNvbW1hbmRzIGFyZSBhcyBmb2xsb3dzLgogICBXaGVuIGFuIFItY29tbWFuZCBpcyBpbmNsdWRlZCBpbiB0aGUgU3lub255bXMgbGlzdCwgYmUgc3VyZSB0byByZWFkCiAgIFsyNTldU2VjdGlvbiAzLjggYWJvdXQgcnVsZXMgZm9yIHVzZSBvZiBSLWNvbW1hbmRzLgoKICAgRlRQIENEIFsgZGlyZWN0b3J5IF0KICAgICAgICAgIFRlbGxzIHRoZSBGVFAgc2VydmVyIHRvIGNoYW5nZSBpdHMgZGVmYXVsdCAod29ya2luZykgZGlyZWN0b3J5CiAgICAgICAgICB0byB0aGUgb25lIGdpdmVuLCB3aGljaCB1c3VhbGx5IG11c3QgYmUgZXhwcmVzc2VkIGluIHRoZSBzeW50YXgKICAgICAgICAgIG9mIHRoZSBzZXJ2ZXIgcGxhdGZvcm0gKFVOSVgsIFZNUywgZXRjKS4gSWYgdGhlIGRpcmVjdG9yeSBpcwogICAgICAgICAgbm90IHNwZWNpZmllZCwgdGhlIHJlc3VsdCBkZXBlbmRzIG9uIHRoZSBGVFAgc2VydmVyIC0tIGl0IG1pZ2h0CiAgICAgICAgICBjb21wbGFpbiB0aGF0IHRoZSBjb21tYW5kIGlzIGlsbGVnYWwsIG9yIGl0IG1pZ2h0IGNoYW5nZSB0bwogICAgICAgICAgeW91ciBvcmlnaW5hbCBsb2dpbiBkaXJlY3RvcnkuIFN5bm9ueW1zOiBGVFAgQ1dEIChDaGFuZ2UKICAgICAgICAgIFdvcmRpbmcgRGlyZWN0b3J5KTsgUkNELgoKICAgRlRQIENEVVAKICAgICAgICAgIFRlbGxzIHRoZSBGVFAgc2VydmVyIHRvIGNoYW5nZSBpdHMgZGVmYXVsdCAod29ya2luZykgZGlyZWN0b3J5CiAgICAgICAgICB0byB0aGUgcGFyZW50IGRpcmVjdG9yeSBvZiBpdHMgY3VycmVudCBvbmUgKGVxdWl2YWxlbnQgdG8KICAgICAgICAgICJjZCAuLiIgaW4gVU5JWCwgb3IgImNkIFstXSIgaW4gVk1TKS4gU3lub255bXM6IFJDRFVQLCBGVFAgVVAuCgogICBGVFAgUFdECiAgICAgICAgICBBc2tzIHRoZSBGVFAgc2VydmVyIHRvIHJlcG9ydCAoInByaW50IikgaXRzIGN1cnJlbnQgd29ya2luZwogICAgICAgICAgZGlyZWN0b3J5LiBTeW5vbnltOiBSUFdELgoKICAgRlRQIE1LRElSIGRpcmVjdG9yeQogICAgICAgICAgQXNrcyB0aGUgRlRQIHNlcnZlciB0byBjcmVhdGUgdGhlIGRpcmVjdG9yeSB3aG9zZSBuYW1lIGlzCiAgICAgICAgICBnaXZlbi4gSW4gZ2VuZXJhbCwgdGhlIG5hbWUgbXVzdCBiZSBpbiB0aGUgc3ludGF4IG9mIHRoZQogICAgICAgICAgc2VydmVyJ3MgZmlsZSBzeXN0ZW0sIGFuZCBpdCBtdXN0IGJlIGVpdGhlciBhYnNvbHV0ZSAoYSBmdWxsCiAgICAgICAgICBwYXRobmFtZSkgb3IgcmVsYXRpdmUgdG8gdGhlIHNlcnZlcidzIGN1cnJlbnQgKHdvcmtpbmcpCiAgICAgICAgICBkaXJlY3RvcnkuIFRoaXMgY29tbWFuZCBmYWlscyBpZiB0aGUgZGlyZWN0b3J5IGNhbid0IGJlIGNyZWF0ZWQKICAgICAgICAgIGZvciBhbnkgcmVhc29uLCBpbmNsdWRpbmcgdGhhdCBpdCBleGlzdHMgYWxyZWFkeS4gU3lub255bToKICAgICAgICAgIFJNS0RJUi4KCiAgIEZUUCBSTURJUiBkaXJlY3RvcnkKICAgICAgICAgIEFza3MgdGhlIEZUUCBzZXJ2ZXIgdG8gcmVtb3ZlIHRoZSBkaXJlY3Rvcnkgd2hvc2UgbmFtZSBpcwogICAgICAgICAgZ2l2ZW4uIFRoZSBydWxlcyBhcmUgdGhlIHNhbWUgYXMgZm9yIE1LRElSLCBwbHVzIGluIG1vc3QgY2FzZXMsCiAgICAgICAgICB0aGUgc2VydmVyIHdpbGwgbm90IHJlbW92ZSBhbnkgZGlyZWN0b3J5IHVubGVzcyBpdCBpcyBlbXB0eS4KICAgICAgICAgIFN5bm9ueW06IFJSTURJUi4KCiAgIEZUUCBESVJFQ1RPUlkgWyBmaWxlc3BlYyBdIFsgcmVkaXJlY3RvcnMgXQogICAgICAgICAgVGVsbHMgdGhlIEZUUCBzZXJ2ZXIgdG8gc2VuZCBhIGRpcmVjdG9yeSBsaXN0aW5nIG9mIHRoZQogICAgICAgICAgc3BlY2lmaWVkIGZpbGVzLiBJZiBubyBmaWxlc3BlYyBpcyBnaXZlbiwgdGhlIHNlcnZlciBsaXN0cyBhbGwKICAgICAgICAgIGZpbGVzIGluIGl0cyBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiBUaGUgcmVzdWx0cyBhcmUgaW4KICAgICAgICAgIHdoYXRldmVyIGZvcm1hdCB0aGUgc2VydmVyIGNob29zZXMgdG8gc2VuZCB0aGVtLiBZb3UgY2FuIHVzZQogICAgICAgICAgVU5JWC1saWtlIHJlZGlyZWN0b3JzIHRvIHNlbmQgdGhlIGxpc3RpbmcgdG8gYSBmaWxlIG9yIGEKICAgICAgICAgIHBpcGVsaW5lLCBleGFjdGx5IGFzIHdpdGggdGhlIHJlZ3VsYXIgS2VybWl0IGNsaWVudC9zZXJ2ZXIKICAgICAgICAgIFJFTU9URSBESVJFQ1RPUlkgY29tbWFuZCAoWzI2MF1Vc2luZyBDLUtlcm1pdCwgQ2hhcHRlciAxMSkuCiAgICAgICAgICBTeW5vbnltOiBSRElSRUNUT1JZLiBFeGFtcGxlczoKCiAgICBmdHAgZGlyICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBTaG93IGxpc3Rpbmcgb2YgYWxsIGZpbGVzIG9uIHNjcmVlbgogICAgZnRwIGRpciAqLnR4dCAgICAgICAgICAgICAgICAgICAgIDsgTGlzdCAqLnR4dCBmaWxlcyBvbiBzY3JlZW4KICAgIGZ0cCBkaXIgKi50eHQgPiBzb21lZmlsZSAgICAgICAgICA7IFB1dCBsaXN0aW5nIGluIHNvbWVmaWxlCiAgICBmdHAgZGlyICoudHh0ID4+IHNvbWVmaWxlICAgICAgICAgOyBBcHBlbmQgbGlzdGluZyB0byBzb21lZmlsZQogICAgZnRwIGRpciAqLnR4dCB8IHNvcnQgPiBzb21lZmlsZSAgIDsgUHV0IHNvcnRlZCBsaXN0aW5nIGluIHNvbWVmaWxlCiAgICBmdHAgZGlyIHwgbW9yZSAgICAgICAgICAgICAgICAgICAgOyBSdW5zIGxpc3QgdGhyb3VnaCAibW9yZSIKICAgIGZ0cCBkaXIgfCBzb3J0IHwgbW9yZSAgICAgICAgICAgICA7IFJ1bnMgbGlzdCB0aHJvdWdoICJzb3J0IiBhbmQgIm1vcmUiCgogICBGVFAgVkRJUkVDVE9SWSBbIGZpbGVzcGVjIF0gWyByZWRpcmVjdG9ycyBdCiAgICAgICAgICAiVmVyYm9zZSIgZGlyZWN0b3J5LiBUaGlzIGlzIGFuIGFsdGVybmF0aXZlIEZUUCBESVJFQ1RPUlkKICAgICAgICAgIGNvbW1hbmQgcHJpbWFyaWx5IGZvciB1c2Ugd2l0aCBERUNTWVNURU0tMjAgKFRPUFMtMjApIEZUUAogICAgICAgICAgc2VydmVycywgd2hpY2ggc2VuZCBvbmx5IGZpbGVuYW1lcyB3aGVuIGdpdmVuIGEgRElSRUNUT1JZCiAgICAgICAgICBjb21tYW5kOyB0aGUgVkRJUkVDVE9SWSBjb21tYW5kIG1ha2VzIHRoZW0gYWxzbyBzZW5kIGZpbGUKICAgICAgICAgIHNpemVzLCBkYXRlcywgYW5kIGF0dHJpYnV0ZXMuCgogICBGVFAgQ0hFQ0sgZmlsZXNwZWMKICAgICAgICAgIEFza3MgdGhlIEZUUCBzZXJ2ZXIgd2hldGhlciB0aGUgZ2l2ZW4gZmlsZSBleGlzdHMgb3IsIGlmIHRoZQogICAgICAgICAgZmlsZXNwZWMgY29udGFpbnMgd2lsZGNhcmRzLCBpZiBhbnkgZmlsZXMgbWF0Y2gsIGFuZCB0aGlzCiAgICAgICAgICBjb21tYW5kIHN1Y2NlZWRzIG9yIGZhaWxzIGFjY29yZGluZ2x5LgoKICAgRlRQIE1PRFRJTUUgZmlsZW5hbWUKICAgICAgICAgIEFza3MgdGhlIEZUUCBzZXJ2ZXIsIHZpYSB0aGUgbm90LXlldC1zdGFuZGFyZCBGVFAgTURUTSBjb21tYW5kLAogICAgICAgICAgdG8gc2VuZCB0aGUgbW9kaWZpY2F0aW9uIGRhdGUgYW5kIHRpbWUgb2YgdGhlIGdpdmVuIGZpbGUuIFRoZQogICAgICAgICAgcmVzcG9uc2Ugc2hvdWxkIGJlIGEgbnVtZXJpYyBzdHJpbmcgaW4gdGhlIGZvcm1hdDoKICAgICAgICAgIHl5eXltbWRkaGhtbXNzeHh4eHguLi4gd2hlcmUgeXl5eSBpcyB0aGUgeWVhciwgbW0gaXMgdGhlIG1vbnRoLAogICAgICAgICAgZGQgaXMgdGhlIGRheSwgaGggaXMgdGhlIGhvdXIgKDAtMjMpLCBtbSBpcyB0aGUgbWludXRlLCBzcyBpcwogICAgICAgICAgdGhlIHNlY29uZCwgYW5kIHh4eC4uLiBpcyB0aGUgb3B0aW9uYWwgZnJhY3Rpb24gb2YgdGhlIHNlY29uZAogICAgICAgICAgKDAgb3IgbW9yZSBkaWdpdHMpLiBUaGUgZGF0ZSBhbmQgdGltZSBpcyBleHByZXNzZWQgaW4gVVRDIChHTVQsCiAgICAgICAgICBadWx1LCBaZXJvLU1lcmlkaWFuKS4gVGhlIHJlc3VsdCBpcyBhdmFpbGFibGUgcHJvZ3JhbW1hdGljYWxseQogICAgICAgICAgaW4gdGhlIFsyNjFdXHYoZnRwX21lc3NhZ2UpIHZhcmlhYmxlLCBhbmQgaXMgdW5kZXJzdGFuZGFibGUgYnkKICAgICAgICAgIEtlcm1pdCdzIGRhdGUtdGltZSBzd2l0Y2hlcyBhbmQgZnVuY3Rpb25zLiBGb3IgZXhhbXBsZSwgc3VwcG9zZQogICAgICAgICAgd2Ugd2FudCB0byB1cGxvYWQgYWxsIGxvY2FsIGZpbGVzIHRoYXQgYXJlIG5ld2VyIHRoYW4gYQogICAgICAgICAgcGFydGljdWxhciBmaWxlIG9uIHRoZSBzZXJ2ZXI6CgogIEMtS2VybWl0PiBmdHAgbW9kdGltZSBzaWducG9zdAogIEMtS2VybWl0PiBlY2hvIFx2KGZ0cF9tZXNzYWdlKQogIDIwMDEwODA3MTEzNTQyLjAxNAogIEMtS2VybWl0PiBmdHAgbXB1dCAvYWZ0ZXI6XHYoZnRwX21lc3NhZ2UpR01UICoKCiAgICAgICAgICBOb3RlIHRoYXQgd2UgbXVzdCBhcHBlbmQgIkdNVCIgdG8gdGhlIGRhdGUtdGltZSBzdHJpbmcgdG8gbGV0CiAgICAgICAgICB0aGUgL0FGVEVSIHN3aXRjaCBrbm93IHRoZSB0aW1lIGlzIEdNVCByYXRoZXIgdGhhbiBsb2NhbC4KCiAgIEZUUCBTSVpFIGZpbGVuYW1lCiAgICAgICAgICBBc2tzIHRoZSBGVFAgc2VydmVyIHRvIHNlbmQgdGhlIHNpemUgKGluIGJ5dGVzKSBvZiB0aGUgZ2l2ZW4KICAgICAgICAgIGZpbGUuIFRoZSByZXN1bHQgbWlnaHQgdmFyeSBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgY3VycmVudAogICAgICAgICAgRlRQIFRZUEUgaXMgYmluYXJ5IG9yIHRleHQgKCJhc2NpaSIpLiBGb3IgYSByZWxpYWJsZSBieXRlCiAgICAgICAgICBjb3VudCwgZG8gRlRQIFRZUEUgQklOQVJZIGZpcnN0LiBUaGUgcmVzdWx0IGlzIGF2YWlsYWJsZQogICAgICAgICAgcHJvZ3JhbW1hdGljYWxseSBpbiB0aGUgWzI2Ml1cdihmdHBfbWVzc2FnZSkgdmFyaWFibGUuCgogICBGVFAgQ0hNT0QgcGVybWlzc2lvbnMgZmlsZW5hbWUKICAgICAgICAgIFRlbGxzIHRoZSBGVFAgc2VydmVyIHRvIHNldCB0aGUgcGVybWlzc2lvbnMgKHByb3RlY3Rpb24pIG9mIHRoZQogICAgICAgICAgZ2l2ZW4gZmlsZSB0byB0aGUgb25lcyBnaXZlbi4gVGhlIHBlcm1pc3Npb25zIGFuZCBmaWxlbmFtZSBtdXN0CiAgICAgICAgICBiZSBnaXZlbiBpbiB3aGF0ZXZlciBzeW50YXggaXMgcmVxdWlyZWQgYnkgdGhlIHNlcnZlci4gRXhhbXBsZQogICAgICAgICAgKGZvciBhIFVOSVgtYmFzZWQgRlRQIHNlcnZlcik6CgogIGZ0cCBjaG1vZCA2NjQgb29mYS50eHQKCiAgICAgICAgICBOb3QgYWxsIHNlcnZlcnMgc3VwcG9ydCB0aGlzIGNvbW1hbmQuIEZvciBub24tVU5JWC1iYXNlZAogICAgICAgICAgc2VydmVycywgeW91IG1pZ2h0IG5lZWQgdG8gdXNlIEZUUCBRVU9URSBvciBGVFAgU0lURSBhbmQgdGhlCiAgICAgICAgICBhcHByb3ByaWF0ZSBwbGF0Zm9ybS1zcGVjaWZpYyBGVFAgc2VydmVyIGNvbW1hbmQuCgogICBGVFAgVU1BU0sgWyBudW1iZXIgXQogICAgICAgICAgVGhpcyBjb21tYW5kIGlzIHByb2JhYmx5IHNwZWNpZmljIHRvIFVOSVgtYmFzZWQgc2VydmVyczsgaXQKICAgICAgICAgIHNldHMgdGhlIFVOSVggInVtYXNrIiwgd2hpY2ggaXMgdGhlIGRlZmF1bHQgcGVybWlzc2lvbnMgbWFzawogICAgICAgICAgZm9yIG5ldyAoaW4gdGhpcyBjYXNlLCBpbmNvbWluZykgZmlsZXMuIENydWRlbHkgcHV0LCB0aGUgVU5JWAogICAgICAgICAgdW1hc2sgaXMgYW4gb2N0YWwgcmVwcmVzZW50YXRpb24gb2YgYSBiaW5hcnkgbnVtYmVyIGluIGluIHdoaWNoCiAgICAgICAgICBhIDEgYml0IHN0YW5kcyBmb3IgYSBwZXJtaXNzaW9uIGJpdCB0aGF0IG11c3QgYmUgMCwgYW5kIGEgMCBiaXQKICAgICAgICAgIHN0YW5kcyBmb3IgYSBwZXJtaXNzaW9uIGJpdCB0aGF0IGNhbiBiZSAwIG9yIDEgZGVwZW5kaW5nIG9uCiAgICAgICAgICBvdGhlciBmYWN0b3JzLCBzdWNoIGFzIHRoZSBwZXJtaXNzaW9ucyBvZiB0aGUgcGFyZW50IGRpcmVjdG9yeS4KICAgICAgICAgIEV4YW1wbGU6ICJ1bWFzayAwMDciIHJlcXVpcmVzIHRoYXQgbmV3IGZpbGVzIGFyZSBjcmVhdGVkCiAgICAgICAgICB3aXRob3V0IHJlYWQvd3JpdGUvZXhlY3V0ZSB3b3JsZCBwZXJtaXNzaW9uLiBJZiB0aGUgbnVtYmVyIGlzCiAgICAgICAgICBub3Qgc3BlY2lmaWVkLCB0aGUgc2VydmVyJ3MgY3VycmVudCB1bWFzayBpcyByZXBvcnRlZC4KCiAgIEZUUCBSRU5BTUUgZmlsZW5hbWUgbmV3bmFtZQogICAgICAgICAgQXNrcyB0aGUgRlRQIHNlcnZlciB0byByZW5hbWUgdGhlIGZpbGUgd2hvc2UgbmFtZSBpcyAiZmlsZW5hbWUiCiAgICAgICAgICB0byAibmV3bmFtZSIuIFdvcmtzIG9ubHkgZm9yIG9uZSBmaWxlOyBjYW4gbm90IGJlIHVzZWQgd2l0aAogICAgICAgICAgd2lsZGNhcmRzLiBUaGUgc2VydmVyJ3MgaW50ZXJwcmV0YXRpb24gb2YgIm5ld25hbWUiIGNhbiB2YXJ5CiAgICAgICAgICAoaW4gc29tZSBjYXNlcyBpdCBtdXN0IGJlIGEgZmlsZW5hbWUsIGluIG90aGVycyBwZXJoYXBzIGl0IGNhbgogICAgICAgICAgYWxzbyBiZSBhIGRpcmVjdG9yeSBuYW1lLCBpbiB3aGljaCBjYXNlIGlmIHRoZSBmaWxlbmFtZSBkZW5vdGUKICAgICAgICAgIGEgcmVndWxhciBmaWxlLCB0aGUgZmlsZSBtaWdodCBiZSBtb3ZlZCB0byB0aGUgZ2l2ZW4KICAgICAgICAgIGRpcmVjdG9yeSkuIFNvbWUgc2VydmVycyBtaWdodCBhbGxvdyBmaWxlcyB0byBiZSByZW5hbWVkCiAgICAgICAgICAoIm1vdmVkIikgYmV0d2VlbiBwaHlzaWNhbCBkaXNrcyBvciBwYXJ0aXRpb25zLCBvdGhlcnMgbWlnaHQKICAgICAgICAgIG5vdC4gU3lub255bTogUlJFTkFNRS4KCiAgIEZUUCBERUxFVEUgWyBzd2l0Y2hlcyBdIGZpbGVzcGVjIFsgZmlsZXNwZWMgWyAuLi4gXSBdCiAgICAgICAgICBUZWxscyB0aGUgRlRQIHNlcnZlciB0byBkZWxldGUgdGhlIGZpbGUgb3IgZmlsZXMgbGlzdGVkLiBFYWNoCiAgICAgICAgICBmaWxlIHNwZWNpZmljYXRpb24gbWF5LCBidXQgbmVlZCBub3QsIGNvbnRhaW4gd2lsZGNhcmQKICAgICAgICAgIGNoYXJhY3RlcnMgdG8gbWF0Y2ggbXVsdGlwbGUgZmlsZXMuIEZpbGUgc3BlY2lmaWNhdGlvbnMgYW5kCiAgICAgICAgICB3aWxkY2FyZCBzeW50YXggbXVzdCBiZSB0aG9zZSBvZiB0aGUgc2VydmVyLiBBbnkgZmlsZQogICAgICAgICAgc3BlY2lmaWNhdGlvbnMgdGhhdCBjb250YWluIHNwYWNlcyBtdXN0IGJlIGVuY2xvc2VkIGluIGJyYWNlcwogICAgICAgICAgb3IgZG91YmxlcXVvdGVzLiBGVFAgREVMRVRFIHN3aXRjaGVzIGFyZToKCiAvRVJST1ItQUNUSU9OOiAgL0ZJTEVOQU1FUzogICAgIC9OT0JBQ0tVUEZJTEVTICAvUVVJRVQKIC9FWENFUFQ6ICAgICAgICAvTEFSR0VSLVRIQU46ICAgL05PRE9URklMRVMgICAgIC9OT1BBR0UKIC9QQUdFICAgICAgICAgICAvUkVDVVJTSVZFICAgICAgL1NNQUxMRVItVEhBTjoKCiAgICAgICAgICBXaGVuIHVzZWQgd2l0aCBGVFAgREVMRVRFLCB0aGUgL1JFQ1VSU0lWRSBzd2l0Y2ggZGVsZXRlcyBmaWxlcwogICAgICAgICAgYnV0IG5vdCBkaXJlY3RvcmllcywgYW5kIGZ1cnRoZXJtb3JlIGRlcGVuZHMgb24gdGhlIHNlcnZlcgogICAgICAgICAgcHJvdmlkaW5nIHJlY3Vyc2l2ZSBmaWxlIGxpc3RzLCB3aGljaCBpcyBub3QgdGhlIG5vcm1hbAogICAgICAgICAgYmVoYXZpb3IuIEZvciBmdXJ0aGVyIGRldGFpbHMsIHNlZSB0aGUgZGVjcmlwdGlvbnMgb2YgdGhlc2UKICAgICAgICAgIHN3aXRjaGVzIGluIFsyNjNdU2VjdGlvbiAzLjYuIFN5bm9ueW1zOiBGVFAgTURFTEVURSAoS2VybWl0CiAgICAgICAgICBtYWtlcyBubyBkaXN0aW5jdGlvbiBiZXR3ZWVuIERFTEVURSBhbmQgTURFTEVURSk7IFJERUxFVEUuCgogICBGVFAgVFlQRSB7IFRFWFQsIEJJTkFSWSwgVEVORVggfQogICAgICAgICAgVGVsbHMgdGhlIEZUUCBzZXJ2ZXIgdG8gY2hhbmdlIGl0cyBmaWxlLXRyYW5zZmVyIHR5cGUgdG8gdGhlCiAgICAgICAgICBvbmUgZ2l2ZW4sIGltbWVkaWF0ZWx5LiBTZWUgWzI2NF1TRVQgRlRQIFRZUEUgZm9yIGRldGFpbHMuCgogICBbIFsyNjVdVG9wIF0gWyBbMjY2XUZUUCBUb3AgXSBbIFsyNjddQy1LZXJtaXQgSG9tZSBdIFsgWzI2OF1LZXJtaXQKICAgSG9tZSBdCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgMy41LiBVcGxvYWRpbmcgRmlsZXMgV2l0aCBGVFAKCiAgIFVwbG9hZGluZyBtZWFucyBzZW5kaW5nIGZpbGVzIGZyb20gdGhlIGNsaWVudCAoS2VybWl0KSB0byB0aGUgRlRQCiAgIHNlcnZlci4gVGhlIGJhc2ljIGNvbW1hbmQgZm9yIHVwbG9hZGluZyBmaWxlcyB3aXRoIEZUUCBpcyBQVVQ6CgogICBGVFAgUFVUIFsgc3dpdGNoZXMgXSBbIGZpbGVzcGVjIFsgYXMtbmFtZSBdIF0KICAgICAgICAgIFVwbG9hZHMgKHNlbmRzKSB0aGUgZmlsZSBvciBmaWxlcyB0aGF0IG1hdGNoIHRoZSBmaWxlCiAgICAgICAgICBzcGVjaWZpY2F0aW9uLCB3aGljaCBtYXkgaW5jbHVkZSB3aWxkY2FyZHMsIHRvIHRoZSBzZXJ2ZXIuIElmCiAgICAgICAgICBubyBmaWxlc3BlYyBpcyBnaXZlbiwgdGhlIG5hbWVzIG9mIGZpbGVzIHRvIHNlbmQgYXJlIHRha2VuIGZyb20KICAgICAgICAgIHRoZSAvTElTVEZJTEU6IGZpbGUsIGlmIGFueSwgb3RoZXJ3aXNlIGZyb20gdGhlIFNFTkQtTElTVCwgaWYKICAgICAgICAgIGFueS4gVW5sZXNzIHlvdSBnbyBvdXQgb2YgeW91ciB3YXkgdG8gcHJldmVudCBpdCwgS2VybWl0CiAgICAgICAgICBkZXRlcm1pbmVzIHRoZSB0cmFuc2ZlciBtb2RlICh0ZXh0IG9yIGJpbmFyeSkgZm9yIGVhY2ggZmlsZQogICAgICAgICAgYXV0b21hdGljYWxseSwgYW5kIHN3aXRjaGVzIGF1dG9tYXRpY2FsbHkgb24gYSBwZXItZmlsZSBiYXNpcy4KICAgICAgICAgIElmIGFuIGFzLW5hbWUgaXMgZ2l2ZW4sIHRoZSBmaWxlIGlzIHNlbnQgdW5kZXIgdGhhdCBuYW1lCiAgICAgICAgICBpbnN0ZWFkIG9mIGl0cyBvd24gKGlmIGFuIGFzLW5hbWUgaXMgZ2l2ZW4gd2l0aCBhIHdpbGRjYXJkCiAgICAgICAgICBmaWxlc3BlYywgdGhlIHJlc3VsdCBpcyBhIGJpdCBtb3JlIGNvbXBsaWNhdGVkLCBhbmQgaXMKICAgICAgICAgIGV4cGxhaW5lZCBsYXRlciBpbiB0aGlzIHNlY3Rpb24pLgoKICAgVW5saWtlIG5vcm1hbCBGVFAgY2xpZW50cywgS2VybWl0IGRvZXMgbm90IHByb21wdCB5b3UgYnkgZGVmYXVsdCAob3IKICAgYXQgYWxsKSBmb3IgZWFjaCBmaWxlOyBpdCBqdXN0IHNlbmRzIHRoZW0sIGp1c3QgYXMgaXQgZG9lcyB3aXRoIEtlcm1pdAogICBwcm90b2NvbC4gVGhlIGZpbGVzcGVjIGNhbiBiZSBhIGxpdGVyYWwgZmlsZW5hbWUgb3IgYSBLZXJtaXQgcGF0dGVybiwKICAgZGVzY3JpYmVkIGluOgoKICBbMjY5XWh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC45CgogICBLZXJtaXQgcGF0dGVybnMgYXJlIGVxdWl2YWxlbnQgdG8gQy1TaGVsbCBwYXR0ZXJucyBhbmQgcHJvdmlkZSBhIGZhaXIKICAgYW1vdW50IG9mIGZsZXhpYmlsaXR5IGluIHNlbGVjdGluZyB3aGljaCBmaWxlcyB0byBzZW5kLCB3aGljaCBpcwogICBhdWdtZW50ZWQgYnkgdGhlIGZpbGUtc2VsZWN0aW9uIHN3aXRjaGVzIHByZXNlbnRlZCBpbiBbMjcwXVNlY3Rpb24KICAgMy41LjEuCgogICBGVFAgTVBVVCBbIHN3aXRjaGVzIF0gZmlsZXNwZWMgWyBmaWxlc3BlYyBbIC4uLiBdIF0KICAgICAgICAgIEZUUCBNUFVUIGlzIGp1c3QgbGlrZSBGVFAgUFVUIGV4Y2VwdCBpdCBhbGxvd3MgeW91IHRvIGdpdmUgbW9yZQogICAgICAgICAgdGhhbiBvbmUgZmlsZSBzcGVjaWZpY2F0aW9uLCBhbmQgaXQgZG9lcyBub3QgYWxsb3cgYW4gYXMtbmFtZQogICAgICAgICAgaW4gdGhlIGZpbGUgbGlzdC4gSG93ZXZlciwgYXMtbmFtZXMgY2FuIGJlIGdpdmVuIHRvIGVpdGhlciBQVVQKICAgICAgICAgIG9yIE1QVVQgd2l0aCB0aGUgL0FTLU5BTUU6IHN3aXRjaC4KCiAgIElmIGEgUFVUIG9yIE1QVVQgY29tbWFuZCByZXN1bHRzIGluIG9uZSBmaWxlIGJlaW5nIHVwbG9hZGVkLCBpdAogICBzdWNjZWVkcyBpZiB0aGUgZmlsZSBpcyB1cGxvYWRlZCBjb21wbGV0ZWx5IGFuZCBmYWlscyBvdGhlcndpc2UuIElmCiAgIG1vcmUgdGhhbiBvbmUgZmlsZSBpcyBzZWxlY3RlZCBmb3IgdXBsb2FkLCBzdWNjZXNzIG9yIGZhaWx1cmUgZGVwZW5kcwogICBvbiB0aGUgWzI3MV1GVFAgRVJST1ItQUNUSU9OIHNldHRpbmc7IGlmIGl0IGlzIFBST0NFRUQgKHRoZSBkZWZhdWx0CiAgIHNldHRpbmcpLCB0aGVuIHRoZSBbTV1QVVQgY29tbWFuZCBzdWNjZWVkcyBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlCiAgIGZpbGVzIHdhcyBjb21wbGV0ZWx5IHVwbG9hZGVkLCBhbmQgZmFpbHMgb3RoZXJ3aXNlLCBJZiBGVFAKICAgRVJST1ItQUNUSU9OIGlzIFFVSVQsIHRoZSBbTV1QVVQgY29tbWFuZCBzdWNjZWVkcyBpZiBhbGwgc2VsZWN0ZWQKICAgZmlsZXMgd2VyZSB1cGxvYWRlZCBzdWNjZXNzZnVsbHksIGFuZCBmYWlscyBpZiBhbnkgZmlsZSBmYWlsZWQuCgogICBGVFAgdXBsb2FkcyBtYXkgYmUgaW50ZXJydXB0ZWQganVzdCBsaWtlIEtlcm1pdCB1cGxvYWRzLiBXaGlsZSB0aGUKICAgdHJhbnNmZXIgaXMgaW4gcHJvZ3Jlc3MsIHR5cGU6CgogIFggdG8gaW50ZXJydXB0IHRoZSBjdXJyZW50IGZpbGUgYW5kIGdvIG9uIHRvIHRoZSBuZXh0IGZpbGUuCiAgWiB0byBjYW5jZWwgdGhlIGN1cnJlbnQgZmlsZSBhbmQgYWxsIHJlbWFpbmluZyBmaWxlcy4KICBeQyAoQ29udHJvbC1DKTogTGlrZSBaLCBidXQgbWlnaHQgYWN0IG1vcmUgcXVpY2tseS4KCiAgIE1QVVQgbWF5IGJlIHVzZWQgYXMgaW4gcmVndWxhciBGVFAgY2xpZW50cywgYnV0IGl0IGlzIG5vdCByZXF1aXJlZCB0bwogICBzZW5kIG11bHRpcGxlIGZpbGVzOyBpbiBLZXJtaXQgaXQgaXMgcmVxdWlyZWQgb25seSBpZiB5b3Ugd2FudCB0byBnaXZlCiAgIG11bHRpcGxlIGZpbGUgc3BlY2lmaWNhdGlvbnMuIEV4YW1wbGVzOgoKICBmdHAgcHV0IG9vZmEudHh0ICAgICAgICAgICAgICAgOyBTZW5kIGEgc2luZ2xlIGZpbGUgb29mYS50eHQKICBmdHAgcHV0IG9vZmEudHh0IGJ1ZGdldC50eHQgICAgOyBTZW5kIHNpbmdsZSBmaWxlIG9vZmEudHh0IGFzIGJ1ZGdldC50eHQKICBmdHAgcHV0ICoudHh0ICAgICAgICAgICAgICAgICAgOyBTZW5kIGFsbCAqLnR4dCBmaWxlcwogIGZ0cCBtcHV0ICoudHh0ICAgICAgICAgICAgICAgICA7IFNlbmQgYWxsICoudHh0IGZpbGVzIChzYW1lIGFzICJwdXQgKi50eHQiKQogIGZ0cCBtcHV0ICoudHh0IGZvby5iYXIgICAgICAgICA7IFNlbmQgYWxsICoudHh0IGZpbGVzIHBsdXMgZm9vLmJhcgoKICAgVGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gUFVUIGFuZCBNUFVUIGlzIGltcG9ydGFudCBvbmx5IHdoZW4gbW9yZSB0aGFuCiAgIG9uZSBmaWxlc3BlYyBpcyBnaXZlbiwganVzdCBsaWtlIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIEtlcm1pdCBTRU5ECiAgIGFuZCBNU0VORDoKCiAgZnRwIHB1dCBvb2ZhLnR4dCBidWRnZXQudHh0ICAgIDsgU2VuZCBvb2ZhLnR4dCBBUyBidWRnZXQudHh0CiAgZnRwIG1wdXQgb29mYS50eHQgYnVkZ2V0LnR4dCAgIDsgU2VuZCBvb2ZhLnR4dCBBTkQgYnVkZ2V0LnR4dAoKICAgSWYgdGhlIHNvdXJjZSBmaWxlIHNwZWNpZmljYXRpb24gaW5jbHVkZXMgYW55IHBhdGggc2VnbWVudHMsIGZvcgogICBleGFtcGxlOgoKICBwdXQgL3RtcC9vb2ZhLnR4dAogIHB1dCBzdWJkaXIvYW5vdGhlci9hbmRhbm90aGVyL29vZmEudHh0CgogICB0aGUgcGF0aCBwb3J0aW9uIGlzIHN0cmlwcGVkIGZyb20gdGhlIGZpbGVuYW1lIHRoYXQgaXMgc2VudCB0byB0aGUKICAgc2VydmVyLiBIb3dldmVyLCBpZiBhbiBhcy1uYW1lIGNvbnRhaW5zIGEgcGF0aCwgaXQgaXMgcmV0YWluZWQuCiAgIEV4YW1wbGVzOgoKICBmdHAgcHV0IC91c3IvZG9jL29vZmEudHh0ICAgICAgOyBTZW5kIGFzICJvb2ZhLnR4dCIuCiAgZnRwIHB1dCBvb2ZhLnR4dCAvdG1wL29vZmEudHh0IDsgU2VuZCBhcyAiL3RtcC9vb2ZhLnR4dCIKCiAgIFRoZSBsYXR0ZXIgZXhhbXBsZSBzZW5kcyB0aGUgZmlsZSBvb2ZhLnR4dCBmcm9tIHlvdXIgY3VycmVudCBsb2NhbAogICBkaXJlY3RvcnkgdG8gdGhlIHNlcnZlcidzIC90bXAgZGlyZWN0b3J5LiBUaGlzIHdvcmtzIG9ubHkgaWYgdGhlCiAgIHNlcnZlciB1c2VzIHRoZSBzYW1lIGRpcmVjdG9yeSBub3RhdGlvbiB0aGF0IHlvdSB1c2VkIGluIHRoZSBhcy1uYW1lCiAgIEFORCB0aGUgZ2l2ZW4gZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzIG9uIHRoZSBzZXJ2ZXIgQU5EIGlmIHlvdSBoYXZlCiAgIHdyaXRlIGFjY2VzcyB0byBpdC4KCiAgIFVzZSBjYXV0aW9uIHdoZW4gdXBsb2FkaW5nIGZyb20gYSBjYXNlLXNlbnNpdGl2ZSBmaWxlIHN5c3RlbSwgc3VjaCBhcwogICBVTklYLCB0byBhIGZpbGUgc3lzdGVtIHRoYXQgaXMgbm90IGNhc2Ugc2Vuc2l0aXZlLCBzdWNoIGFzIFdpbmRvd3Mgb3IKICAgVk1TLiBJZiB5b3UgaGF2ZSB0d28gZmlsZXMgaW4gVU5JWCwgQUEgYW5kIGFhIGFuZCB1cGxvYWQgYm90aCBvZiB0aGVtLAogICB0aGUgc2Vjb25kIG9uZSB3aWxsIG92ZXJ3cml0ZSB0aGUgZmlyc3QuIFRoZSBvbmx5IHdheSBhcm91bmQgdGhpcwogICBwcm92aWRlZCBieSBGVFAgcHJvdG9jb2wgaXMgaXRzICJ1bmlxdWUgc2VydmVyIG5hbWVzIiBmZWF0dXJlIChTRVQgRlRQCiAgIFVOSVFVRS1TRVJWRVItTkFNRVMgb3IgdGhlIC9VTklRVUUgc3dpdGNoIGRlc2NyaWJlZCBiZWxvdykuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICAzLjUuMS4gRlRQIFBVVCBTd2l0Y2hlcwoKICAgRlRQIFBVVCBhbmQgTVBVVCBhcmUgc2ltaWxhciBpbiBmb3JtYXQgYW5kIGJlaGF2aW9yIHRvIHRoZSByZWd1bGFyCiAgIEtlcm1pdCBTRU5EIGFuZCBNU0VORCBjb21tYW5kcywgYW5kIHRoZXkgYWxsb3cgbW9zdCBvZiB0aGUgc2FtZQogICBvcHRpb25hbCBzd2l0Y2hlczoKCkMtS2VybWl0PmZ0cCBwdXQgPyBGaWxlbmFtZSwgb3Igc3dpdGNoLCBvbmUgb2YgdGhlIGZvbGxvd2luZzoKIC9hZnRlcjogICAgICAgICAgICAgICAgIC9sYXJnZXItdGhhbjogICAgICAgICAgIC9yZW5hbWUtdG86CiAvYXJyYXk6ICAgICAgICAgICAgICAgICAvbGlzdGZpbGU6ICAgICAgICAgICAgICAvc2VydmVyLWNoYXJhY3Rlci1zZXQ6CiAvYXMtbmFtZTogICAgICAgICAgICAgICAvbG9jYWwtY2hhcmFjdGVyLXNldDogICAvc2VydmVyLXJlbmFtZS10bzoKIC9iZWZvcmU6ICAgICAgICAgICAgICAgIC9tb3ZlLXRvOiAgICAgICAgICAgICAgIC9zaW11bGF0ZQogL2JpbmFyeSAgICAgICAgICAgICAgICAgL25vYmFja3VwZmlsZXMgICAgICAgICAgL3NtYWxsZXItdGhhbjoKIC9jb21tYW5kICAgICAgICAgICAgICAgIC9ub2RvdGZpbGVzICAgICAgICAgICAgIC90ZW5leAogL2RlbGV0ZSAgICAgICAgICAgICAgICAgL25vZm9sbG93bGlua3MgICAgICAgICAgL3RleHQKIC9kb3RmaWxlcyAgICAgICAgICAgICAgIC9ub3QtYWZ0ZXI6ICAgICAgICAgICAgIC90cmFuc3BhcmVudAogL2Vycm9yLWFjdGlvbjogICAgICAgICAgL25vdC1iZWZvcmU6ICAgICAgICAgICAgL3R5cGU6CiAvZXhjZXB0OiAgICAgICAgICAgICAgICAvcGVybWlzc2lvbnM6ICAgICAgICAgICAvdXBkYXRlCiAvZmlsZW5hbWVzOiAgICAgICAgICAgICAvcXVpZXQgICAgICAgICAgICAgICAgICAvdW5pcXVlLXNlcnZlci1uYW1lcwogL2ZpbHRlcjogICAgICAgICAgICAgICAgL3JlY292ZXIKIC9mb2xsb3dsaW5rcyAgICAgICAgICAgIC9yZWN1cnNpdmUKCiAgIFNpbmNlIG1vc3Qgb2YgdGhlc2Ugc3dpdGNoZXMgYXJlIGNvbW1vbiB0byBLZXJtaXQncyBTRU5EIGFuZCBNU0VORAogICBjb21tYW5kcywgdGhleSBkZXNjcmliZWQgb25seSBicmllZmx5IGhlcmUuIEZvciBncmVhdGVyIGRldGFpbCBzZWU6CgogICAgIFsyNzJdaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjUgKGV4cGxhbmF0aW9uCiAgIG9mIHN3aXRjaGVzKQogICAgIFsyNzNdaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjcKICAgKGZpbGUtdHJhbnNmZXIgc3dpdGNoZXMpCgogICBGaXJzdCB0aGUgZmlsZS1zZWxlY3Rpb24gc3dpdGNoZXM6CgogICAvQUZURVI6ZGF0ZS10aW1lCiAgIC9CRUZPUkU6ZGF0ZS10aW1lCiAgIC9OT1QtQUZURVI6ZGF0ZS10aW1lCiAgIC9OT1QtQkVGT1JFOmRhdGUtdGltZQogICAgICAgICAgT25seSBzZW5kIHRob3NlIGZpbGVzIG1vZGlmaWVkIG9uIG9yIGFmdGVyIG9yIGJlZm9yZSB0aGUgZ2l2ZW4KICAgICAgICAgIGRhdGUgYW5kIHRpbWUuIFRoZXNlIHN3aXRjaGVzIGNhbiBiZSBjb21iaW5lZCB0byBzZWxlY3QgZmlsZXMKICAgICAgICAgIG1vZGlmaWVkIGJldHdlZW4gdHdvIGRhdGUvdGltZXMuIFZhcmlvdXMgZGF0ZS10aW1lIGZvcm1hdHMgYXJlCiAgICAgICAgICBhY2NlcHRlZDsgaWYgdGhlIGRhdGUtdGltZSBjb250YWlucyBzcGFjZXMsIGl0IG11c3QgYmUgZW5jbG9zZWQKICAgICAgICAgIGluIGJyYWNlcyBvciBkb3VibGVxdW90ZXMuIFNlZQogICAgICAgICAgWzI3NF1odHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuNiBhbmQKICAgICAgICAgIFsyNzVdU2VjdGlvbiA4LjEzIG9mIHRoaXMgZG9jdW1lbnQgZm9yIGRldGFpbHMgYWJvdXQgZGF0ZS10aW1lCiAgICAgICAgICBmb3JtYXRzLiBFeGFtcGxlczoKCiAgZnRwIHB1dCAvYWZ0ZXI6ezEgamFuIDIwMDAgMDowMDowMH0gKgogIGZ0cCBwdXQgL2FmdGVyOi01ZGF5cyAqCgogICAvTEFSR0VSLVRIQU46bnVtYmVyCiAgIC9TTUFMTEVSLVRIQU46bnVtYmVyCiAgICAgICAgICBPbmx5IHNlbmQgZmlsZXMgbGFyZ2VyIChzbWFsbGVyKSB0aGFuIHRoZSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMKICAgICAgICAgIChvY3RldHMpLiBUaGVzZSBzd2l0Y2hlcyBjYW4gYmUgY29tYmluZWQgdG8gc2VsZWN0IGZpbGVzIGluIGEKICAgICAgICAgIGNlcnRhaW4gc2l6ZSByYW5nZS4KCiAgIC9UWVBFOntURVhULEJJTkFSWX0KICAgICAgICAgIE9ubHkgc2VuZCBmaWxlcyB0aGF0IGFyZSB0aGUgZ2l2ZW4gdHlwZSwgd2hpY2ggaXMgZGV0ZXJtaW5lZAogICAgICAgICAgZm9yIGVhY2ggZmlsZSBqdXN0IGJlZm9yZSBzZW5kaW5nIGl0IGJ5IGZpbGUgc2Nhbm5pbmcuIEJJTkFSWQogICAgICAgICAgaW5jbHVkZXMgVEVORVg7IGlmIHlvdSBoYXZlIGluY2x1ZGVkIGEgL1RFTkVYIHN3aXRjaCwgb3IKICAgICAgICAgIHByZXZpb3VzbHkgZ2l2ZW4gYSBbU0VUXSBGVFAgVFlQRSBURU5FWCBjb21tYW5kLCBiaW5hcnkgZmlsZXMKICAgICAgICAgIGFyZSBzZW50IGluIFRFTkVYLCByYXRoZXIgdGhhbiBCSU5BUlkgbW9kZS4KCiAgIC9bTk9dRE9URklMRVMKICAgICAgICAgIFtEb24ndF0gaW5jbHVkZSBmaWxlcyB3aG9zZSBuYW1lcyBiZWdpbiB3aXRoIGRvdCAoLikuIEJ5CiAgICAgICAgICBkZWZhdWx0LCBzdWNoIGZpbGVzIGFyZSBub3QgaW5jbHVkZWQgdW5sZXNzIHlvdXIgZmlsZXNwZWMKICAgICAgICAgIGV4cGxpY2l0bHkgbWVudGlvbnMgdGhlbS4KCiAgIC9OT0JBQ0tVUEZJTEVTCiAgICAgICAgICBEb24ndCBpbmNsdWRlIGZpbGVzIHdob3NlIG5hbWVzIGVuZCB3aXRoIC5+bm5ufiwgd2hlcmUgbm5uIGlzIGEKICAgICAgICAgIG51bWJlciwgZS5nLiBvb2ZhLnR4dC5+Mjd+LiBUaGVzZSBhcmUgYmFja3VwIGZpbGVzIGNyZWF0ZWQgYnkKICAgICAgICAgIEtlcm1pdCwgRU1BQ1MsIGFuZCBvdGhlciBhcHBsaWNhdGlvbnMuIEJ5IGRlZmF1bHQsIGJhY2t1cCBmaWxlcwogICAgICAgICAgYXJlIGluY2x1ZGVkLgoKICAgL05PRk9MTE9XTElOS1MKICAgICAgICAgIChVTklYIG9ubHkpIFNraXAgb3ZlciBzeW1ib2xpYyBsaW5rcyByYXRoZXIgdGhhbiBmb2xsb3dpbmcgdGhlbQogICAgICAgICAgKGRlZmF1bHQpLiBUaGlzIGFwcGxpZXMgdG8gd2lsZGNhcmQgYW5kL29yIHJlY3Vyc2l2ZSBbTV1QVVRzOwogICAgICAgICAgaWYgYSBzaW5nbGUgZmlsZW5hbWUgaXMgZ2l2ZW4sIGFuZCBpdCBoYXBwZW5zIHRvIGJlIGEgc3ltYm9saWMKICAgICAgICAgIGxpbmssIHRoZSBmaWxlIGl0IHBvaW50cyB0byBpcyBzZW50LgoKICAgL0ZPTExPV0xJTktTCiAgICAgICAgICAoVU5JWCBvbmx5KSBBbHdheXMgZm9sbG93IChyZXNvbHZlKSBzeW1ib2xpYyBsaW5rcywgZXZlbiBpbgogICAgICAgICAgd2lsZGNhcmQgb3IgcmVjdXJzaXZlIFtNXVBVVHMuIFVzZSB3aXRoIGNhdXRpb24uIFdhdGNoIG91dCBmb3IKICAgICAgICAgIGNpcmN1bGFyIGxpbmtzLCBlbmRsZXNzIGxvb3BzLCBldGMuCgogICAvRVhDRVBUOnBhdHRlcm4KICAgICAgICAgIEV4Y2VwdGlvbiBsaXN0IC0tIGRvbid0IHNlbmQgZmlsZXMgd2hvc2UgbmFtZXMgbWF0Y2ggdGhlIGdpdmVuCiAgICAgICAgICBwYXR0ZXJuLiBTZWUgWzI3Nl1TZWN0aW9uIDEuNS40IG9mIHRoZSBbMjc3XUMtS2VybWl0IDcuMCBVcGRhdGUKICAgICAgICAgIE5vdGVzIGZvciBkZXRhaWxzLiBJZiB5b3Ugd2FudCB0byBleGNsdWRlIGEgZGlyZWN0b3J5IGZyb20gYQogICAgICAgICAgcmVjdXJzaXZlIFtNXVBVVCwgdXNlIC9FWENFUFQ6e2Rpcm5hbWUvKn0uCgogICAvUkVDVVJTSVZFCiAgICAgICAgICBTZW5kcyB0aGUgZGVzaXJlZCBmaWxlcyBmcm9tIHRoZSBjdXJyZW50IChvciBnaXZlbikgZGlyZWN0b3J5LAogICAgICAgICAgcGx1cyBhbGwgZGlyZWN0b3JpZXMgYmVuZWF0aCBpdCwgaW5jbHVkaW5nIGVtcHR5IGRpcmVjdG9yaWVzLAogICAgICAgICAgcmVwbGljYXRpbmcgdGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgb24gdGhlIHNlcnZlci4gTm8gc3BlY2lhbAogICAgICAgICAgY2FwYWJpbGl0aWVzIGFyZSByZXF1aXJlZCBpbiB0aGUgc2VydmVyLCBidXQgb2YgY291cnNlIHlvdXIKICAgICAgICAgIGxvZ2luIElEIG9uIHRoZSBzZXJ2ZXIgbXVzdCBoYXZlIHRoZSBhcHByb3ByaWF0ZSBhY2Nlc3MgYW5kCiAgICAgICAgICBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBkaXJlY3Rvcmllcy4gUmVjdXJzaXZlIFBVVHMgd29yayBub3Qgb25seQogICAgICAgICAgYmV0d2VlbiBsaWtlIHBsYXRmb3JtcyAoZS5nLiBVTklYIHRvIFVOSVgpIGJ1dCBhbHNvIGJldHdlZW4KICAgICAgICAgIHVubGlrZSBvbmVzIChlLmcuIFVOSVggdG8gVk1TIG9yIFdpbmRvd3MpLCBpbiB3aGljaCBjYXNlCiAgICAgICAgICB0ZXh0LWZpbGUgZm9ybWF0IGRpZmZlcmVuY2VzIGFyZSBoYW5kbGVkIGJ5IEtlcm1pdCdzIGF1dG9tYXRpYwogICAgICAgICAgdGV4dC9iaW5hcnkgbW9kZSBzd2l0Y2hpbmcgKFsyNzhdU2VjdGlvbiA0KSBhbmQgY2hhcmFjdGVyLXNldAogICAgICAgICAgdHJhbnNsYXRpb24gKFsyNzldU2VjdGlvbiAzLjcpLiBTeW5vbnltOiAvU1VCRElSRUNUT1JJRVMuCgogICAvVVBEQVRFCiAgICAgICAgICBTZW5kIG9ubHkgZmlsZXMgdGhhdCBoYXZlIGNoYW5nZWQgc2luY2UgbGFzdCB0aW1lIChbMjgwXVNlY3Rpb24KICAgICAgICAgIDMuNS4yKS4KCiAgIC9BUlJBWTphcnJheW5hbWUKICAgICAgICAgIFRoZSAiZmlsZSIgdG8gYmUgc2VudCBpcyBhbiBhcnJheSwgb3IgYSBzZWdtZW50IG9mIG9uZSwgcmF0aGVyCiAgICAgICAgICB0aGFuIGEgcmVhbCBmaWxlLiBJbiB0aGlzIGNhc2UgdGhlIG90aGVyIHNlbGVjdGlvbiBzd2l0Y2hlcwogICAgICAgICAgZG9uJ3QgYXBwbHkuIFRoZSBhcnJheSBjb250ZW50cyBhcmUgc2VudCBpbiB0ZXh0IG1vZGUsIGFuZCBlYWNoCiAgICAgICAgICBhcnJheSBlbGVtZW50IGlzIHRyZWF0ZWQgYXMgYSBsaW5lLiBFeGFtcGxlOgoKICBmdHAgcHV0IC9hcy1uYW1lOmFycmF5LnR4dCAvYXJyYXk6JmEKCiAgICAgICAgICAob3IsIHRvIHNlbmQgYSBzZWdtZW50IG9mIHRoZSBhcnJheSwgL2FycmF5OiZhWzEwMDoxOTldKS4gSWYKICAgICAgICAgIHlvdSBkb24ndCBpbmNsdWRlIGFuIC9BUy1OQU1FLCBhIG5hbWUgb2YgIl9hcnJheV94XyIgaXMgdXNlZAogICAgICAgICAgKHdoZXJlIHggaXMgdGhlIGFycmF5IGxldHRlcikuIElmIHlvdSBpbmNsdWRlIHRoaXMgc3dpdGNoLCBtb3N0CiAgICAgICAgICBvdGhlciBzd2l0Y2hlcyBhcmUgbWVhbmluZ2xlc3MgYW5kIGlnbm9yZWQuCgogICAvQ09NTUFORAogICAgICAgICAgVGhlICJmaWxlIiB0byBiZSBzZW50IGlzIHRoZSBzdGFuZGFyZCBvdXRwdXQgb2YgYSBjb21tYW5kLAogICAgICAgICAgcmF0aGVyIHRoYW4gYSByZWFsIGZpbGUuIEl0IGlzIHNlbnQgaW4gdGV4dCBvciBiaW5hcnkgbW9kZQogICAgICAgICAgYWNjb3JkaW5nIHRvIHRoZSBwcmV2YWlsaW5nIEZUUCBUWVBFLCB3aGljaCBjYW4gYmUgb3ZlcnJpZGRlbgogICAgICAgICAgd2l0aCBhIC9URVhUIG9yIC9CSU5BUlkgc3dpdGNoLiBFeGFtcGxlOiBFeGFtcGxlOgoKICBmdHAgcHV0IC9jb21tYW5kIC9hcy1uYW1lOnt1c2VybGlzdH0ge2ZpbmdlciB8IHNvcnQgLXJ9CgogICAvTElTVEZJTEU6ZmlsZW5hbWUKICAgICAgICAgIFRlbGxzIEtlcm1pdCB0byBvYnRhaW4gdGhlIGxpc3Qgb2YgZmlsZXMgdG8gYmUgc2VudCBmcm9tIHRoZQogICAgICAgICAgZmlsZSB3aG9zZSBuYW1lIGlzIGdpdmVuLiBUaGlzIGZpbGUgbXVzdCBjb250YWluIG9uZSBmaWxlCiAgICAgICAgICBzcGVjaWZpY2F0aW9uICh3aGljaCBtYXkgYmUgd2lsZCkgcGVyIGxpbmUuIElmIHRoZSBsaXN0CiAgICAgICAgICBpbmNsdWRlcyBmaWxlcyBmcm9tIGRpZmZlcmVudCBkaXJlY3Rvcmllcywgc3VjaCBhcyBhIHJlY3Vyc2l2ZQogICAgICAgICAgbGlzdGluZyBvZiBhIGRpcmVjdG9yeSB0cmVlLCB0aGUgcGF0aHMgYXJlIHJlY3JlYXRlZCBvbiB0aGUKICAgICAgICAgIHNlcnZlciAoaWYgcG9zc2libGUpIGlmIHlvdSBpbmNsdWRlIHRoZSAvUkVDVVJTSVZFIHN3aXRjaDsKICAgICAgICAgIG90aGVyd2lzZSBhbGwgdGhlIGZpbGVzIGFyZSBzZW50IHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBvbgogICAgICAgICAgdGhlIHNlcnZlci4KCiAgIE5vdyB0aGUgb3RoZXIgc3dpdGNoZXM6CgogICAvQVMtTkFNRTp0ZXh0CiAgICAgICAgICBJZiBhIHNpbmdsZSBmaWxlIGlzIGJlaW5nIHNlbnQsIHNlbmQgaXQgd2l0aCB0aGUgZ2l2ZW4gdGV4dCBhcwogICAgICAgICAgaXRzIG5hbWUuIElmIG11bHRpcGxlIGZpbGVzIGFyZSBiZWluZyBzZW50LCB0aGUgdGV4dCBtdXN0IGJlIGEKICAgICAgICAgIHRlbXBsYXRlIHRoYXQgaW5jbHVkZXMgdmFyaWFibGVzIHN1Y2ggYXMgXHYoZmlsZW5hbWUpLAogICAgICAgICAgXHYoZmlsZW51bWJlciksIFx2KG50aW1lKSwgdG8gYWxsb3cgZHluYW1pYyBjcmVhdGlvbiBvZiBlYWNoCiAgICAgICAgICBuYW1lLiBUaGUgc2FtZSBhcHBsaWVzIHRvIHRoZSBhcy1uYW1lIGZpZWxkIG9mIHRoZSBGVFAgUFVUCiAgICAgICAgICBjb21tYW5kLiBJZiB0aGlzIHN3aXRjaCBpcyBub3QgaW5jbHVkZWQgKGFuZCBhbiBhcy1uYW1lIGlzIG5vdAogICAgICAgICAgaW5jbHVkZWQgYXMgdGhlIHNlY29uZCBmaWxlbmFtZSB0byBQVVQpLCBlYWNoIGZpbGUgaXMgc2VudCB3aXRoCiAgICAgICAgICBpdHMgb3duIG5hbWUuCgogICAvQklOQVJZCiAgIC9URVhUCiAgIC9URU5FWAogICAgICAgICAgRm9yY2VzIHRoaXMgdXBsb2FkIHRvIHRha2UgcGxhY2UgaW4gdGhlIGdpdmVuIG1vZGUsIHJlZ2FyZGxlc3MKICAgICAgICAgIG9mIHRoZSBjdXJyZW50IEZUUCBUWVBFIHNldHRpbmcsIGFuZCB3aXRob3V0IGF1dG9tYXRpYwogICAgICAgICAgdGV4dC9iaW5hcnkgc3dpdGNoaW5nLiAvQVNDSUkgaXMgYSBzeW5vbnltIGZvciAvVEVYVC4KCiAgIC9GSUxURVI6Y29tbWFuZAogICAgICAgICAgU3BlY2lmaWVzIHRoYXQgdGhlIGZpbGUocykgaXMvYXJlIHRvIGJlIHBhc3NlZCB0aHJvdWdoIHRoZQogICAgICAgICAgZ2l2ZW4gY29tbWFuZCBvciBwaXBlbGluZSBvbiB0aGVpciB3YXkgdG8gdGhlIHNlcnZlci4gRXhhbXBsZToKCiAgZnRwIHB1dCAvYmluYXJ5IC9maWx0ZXI6e2d6aXAgLWMgXHYoZmlsZW5hbWUpfSAvYXMtbmFtZTpcdihmaWxlbmFtZSkuZ3ogKgoKICAgL1RSQU5TUEFSRU5UCiAgIC9MT0NBTC1DSEFSQUNURVItU0VUOm5hbWUKICAgL1NFUlZFUi1DSEFSQUNURVItU0VUOm5hbWUKICAgICAgICAgIENoYXJhY3Rlci1zZXQgdHJhbnNsYXRpb24gZm9yIHRleHQgZmlsZXMsIGV4cGxhaW5lZCBpbgogICAgICAgICAgWzI4MV1TZWN0aW9uIDMuNy4KCiAgIC9FUlJPUi1BQ1RJT046e1BST0NFRUQsUVVJVH0KICAgICAgICAgIE92ZXJyaWRlcyB0aGUgcHJldmFpbGluZyBbMjgyXUZUUCBFUlJPUi1BQ1RJT04gZm9yIHRoZSBkdXJhdGlvbgogICAgICAgICAgb2YgdGhpcyBQVVQgb3IgTVBVVCBjb21tYW5kIG9ubHkuCgogICAvUkVDT1ZFUgogICAgICAgICAgUmVzdW1lIGFuIGludGVycnVwdGVkIHRyYW5zZmVyIHdoZXJlIGZyb20gdGhlIHBvaW50IG9mCiAgICAgICAgICBpbnRlcnJ1cHRpb24gKGV4cGxhaW5lZCBpbiBbMjgzXVNlY3Rpb24gMy41LjIpLiBTeW5vbnltOgogICAgICAgICAgL1JFU1RBUlQuCgogICAvREVMRVRFCiAgICAgICAgICBUZWxscyBLZXJtaXQgdG8gZGVsZXRlIGVhY2ggc291cmNlIGZpbGUgaW1tZWRpYXRlbHkgYWZ0ZXIsIGFuZAogICAgICAgICAgb25seSBpZiwgaXQgaGFzIGJlZW4gdXBsb2FkZWQgY29tcGxldGVseSBhbmQgc3VjY2Vzc2Z1bGx5LgogICAgICAgICAgVGhpcywgaW4gZWZmZWN0LCBtb3ZlcyB0aGUgZmlsZSBmcm9tIHRoZSBjbGllbnQgdG8gdGhlIHNlcnZlci4KCiAgIC9NT1ZFLVRPOmRpcmVjdG9yeQogICAgICAgICAgVGVsbHMgS2VybWl0IHRvIG1vdmUgZWFjaCBzb3VyY2UgZmlsZSB0byB0aGUgbmFtZWQgbG9jYWwKICAgICAgICAgIGRpcmVjdG9yeSBhZnRlciwgYW5kIG9ubHkgaWYsIGl0IGhhcyBiZWVuIHVwbG9hZGVkIGNvbXBsZXRlbHkKICAgICAgICAgIGFuZCBzdWNjZXNzZnVsbHkuCgogICAvUkVOQU1FLVRPOnRlbXBsYXRlCiAgICAgICAgICBUZWxscyBLZXJtaXQgdG8gcmVuYW1lIGVhY2ggKGxvY2FsKSBzb3VyY2UgZmlsZSBhY2NvcmRpbmcgdG8KICAgICAgICAgIHRoZSBnaXZlbiB0ZW1wbGF0ZSBhZnRlciwgYW5kIG9ubHkgaWYsIGl0IGhhcyBiZWVuIHVwbG9hZGVkCiAgICAgICAgICBjb21wbGV0ZWx5IGFuZCBzdWNjZXNzZnVsbHkuIFRoZSB0ZW1wbGF0ZSB3b3JrcyBhcyBpbiAvQVMtTkFNRS4KCiAgIC9TRVJWRVItUkVOQU1FLVRPOnRlbXBsYXRlCiAgICAgICAgICBUZWxscyBLZXJtaXQgdG8gYXNrIHRoZSBzZXJ2ZXIgdG8gcmVuYW1lIGVhY2ggZmlsZSBhY2NvcmRpbmcgdG8KICAgICAgICAgIHRoZSBnaXZlbiB0ZW1wbGF0ZSBhcyBzb29uIGFzLCBhbmQgb25seSBpZiwgaXQgaGFzIGJlZW4KICAgICAgICAgIHJlY2VpdmVkIGNvbXBsZXRlbHkgYW5kIHN1Y2Nlc3NmdWxseS4gVGhlIHRlbXBsYXRlIHdvcmtzIGFzIGluCiAgICAgICAgICAvQVMtTkFNRS4gUmVxdWlyZXMgd3JpdGUgYW5kIHJlbmFtZSBhY2Nlc3Mgb24gdGhlIHNlcnZlciwgc28KICAgICAgICAgIGRvZXNuJ3QgdXN1YWxseSB3b3JrIHdpdGggKGUuZy4pIGFub255bW91cyB1cGxvYWRzIHRvIHB1YmxpYwogICAgICAgICAgaW5jb21pbmcgYXJlYXMgd2hlcmUgdGhlIHBlcm1pc3Npb25zIGRvbid0IGFsbG93IHJlbmFtaW5nLgogICAgICAgICAgRXhhbXBsZXM6CgogICAgICAgIGZ0cCBtcHV0IC9zZXJ2ZXItcmVuYW1lOlx2KGZpbGVuYW1lKS5vayAqCiAgICAgICAgICAgICAgICBBcHBlbmRzICIub2siIHRvIGVhY2ggZmlsZW5hbWUgb24gdGhlIHNlcnZlciB3aGVuIGl0J3MKICAgICAgICAgICAgICAgIGZpbmlzaGVkIHVwbG9hZGluZy4KCiAgICAgICAgZnRwIG1wdXQgL2FzLW5hbWU6XHYoZmlsZW5hbWUpLnRtcCAvc2VydmVyLXJlbmFtZTpcdihmaWxlbmFtZSkgKgogICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgcmV2ZXJzZSBvZiB0aGUgcHJldmlvdXMgZXhhbXBsZTsgaXQgdXNlcyBhCiAgICAgICAgICAgICAgICB0ZW1wb3JhcnkgbmFtZSB3aGlsZSB1cGxvYWRpbmcgaXMgaW4gcHJvZ3Jlc3MgYW5kIHJldmVydHMKICAgICAgICAgICAgICAgIHRoZSBmaWxlIHRvIGl0cyByZWFsIG5hbWUgd2hlbiB1cGxvYWRpbmcgaXMgY29tcGxldGUuCgogICAgICAgIGZ0cCBtcHV0IC9hcy1uYW1lOlx2KGZpbGVuYW1lKQogICAgICAgICAgICAgICAgL3NlcnZlci1yZW5hbWU6Li4vZmluYWwvXHYoZmlsZW5hbWUpICoKICAgICAgICAgICAgICAgIE1vdmVzIHRoZSBmaWxlIGZyb20gdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRvIGEgZmluYWwKICAgICAgICAgICAgICAgIGRpcmVjdG9yeSB3aGVuIHRoZSB1cGxvYWQgaXMgY29tcGxldGUsIGJ1dCBpbiB0aGlzIGNhc2UKICAgICAgICAgICAgICAgIHlvdSBoYXZlIHRvIGtub3cgdGhlIHBhdGhuYW1lIHN5bnRheCBvZiB0aGUgc2VydmVyLiBJZgogICAgICAgICAgICAgICAgdGhlIHJlbmFtZSBmYWlscywgdGhlIFtNXVBVVCBjb21tYW5kIGZhaWxzIGFjY29yZGluZyB0bwogICAgICAgICAgICAgICAgdGhlIFsyODRdRlRQIEVSUk9SLUFDVElPTiBzZWxlY3Rpb24uCgogICAvRklMRU5BTUVTOntBVVRPTUFUSUMsQ09OVkVSVEVELExJVEVSQUx9CiAgICAgICAgICBPdmVycmlkZXMgdGhlIFsyODVdRlRQIEZJTEVOQU1FUyBzZXR0aW5nIGZvciB0aGlzIHVwbG9hZCBvbmx5LgoKICAgL1BFUk1JU1NJT05TOntPTixPRkZ9CiAgICAgICAgICBPdmVycmlkZXMgdGhlIFsyODZdRlRQIFBFUk1JU1NJT05TIHNldHRpbmcgZm9yIHRoaXMgdXBsb2FkCiAgICAgICAgICBvbmx5LgoKICAgL1VOSVFVRQogICAgICAgICAgVGVsbHMgS2VybWl0IHRvIHRlbGwgdGhlIHNlcnZlciB0byBnaXZlIFsyODdddW5pcXVlIG5hbWVzIHRvCiAgICAgICAgICBpbmNvbWluZyBmaWxlcyB0aGF0IHdvdWxkIG90aGVyd2lzZSBvdmVyd3JpdGUgZXhpc3RpbmcgZmlsZXMKICAgICAgICAgIHRoYXQgaGF2ZSB0aGUgc2FtZSBuYW1lLiBUaGlzIHN3aXRjaCBjb25mbGljdHMgd2l0aCAvVVBEQVRFLAogICAgICAgICAgL1JFQ09WRVIsIC9QRVJNSVNTSU9OUywgYW5kIC9TRVJWRVItUkVOQU1FIHNpbmNlIHRoZSBjbGllbnQgaGFzCiAgICAgICAgICBubyB3YXkgb2Yga25vd2luZyB0aGUgbmFtZSBhc3NpZ25lZCBieSB0aGUgc2VydmVyLgoKICAgL1FVSUVUCiAgICAgICAgICBEb24ndCBkaXNwbGF5IGZpbGUtdHJhbnNmZXIgcHJvZ3Jlc3Mgb3Igc3RhdGlzdGljcy4KCiAgIC9TSU1VTEFURQogICAgICAgICAgU2hvd3Mgd2hpY2ggZmlsZXMgd291bGQgYmUgc2VudCB3aXRob3V0IGFjdHVhbGx5IHNlbmRpbmcgdGhlbS4KICAgICAgICAgIFVzZWZ1bCAoZm9yIGV4YW1wbGUpIHdpdGggL1VQREFURSAobmV4dCBzZWN0aW9uKS4gVGhlIHJlc3VsdHMKICAgICAgICAgIGFyZSBzaG93biBpbiB0aGUgZmlsZS10cmFuc2ZlciBkaXNwbGF5IChpZiBpdCBpcyBub3QgZGlzYWJsZWQpCiAgICAgICAgICBhbmQgaW4gdGhlIHRyYW5zYWN0aW9uIGxvZyAoaWYgb25lIGlzIGFjdGl2ZSkuIEhpbnQ6IHVzZSBTRVQKICAgICAgICAgIFRSQU5TRkVSIERJU1BMQVkgQlJJRUYuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICAzLjUuMi4gVXBkYXRlIE1vZGUKCiAgIFdoZW4geW91IGluY2x1ZGUgdGhlIC9VUERBVEUgc3dpdGNoLCB0aGlzIG1lYW5zIHRvIHNraXAgc2VuZGluZyBhbnkKICAgZmlsZSB0aGF0IGFscmVhZHkgZXhpc3RzIG9uIHRoZSBzZXJ2ZXIgaWYgdGhlIGxvY2FsIGZpbGUncwogICBtb2RpZmljYXRpb24gZGF0ZS90aW1lIGlzIG5vdCBsYXRlciB0aGFuIHRoYXQgb2YgdGhlIGNvcnJlc3BvbmRpbmcKICAgZmlsZSBvbiB0aGUgc2VydmVyLiBIZXJlIGlzIGEgdHlwaWNhbCBhcHBsaWNhdGlvbiBmb3IgdXBkYXRlIG1vZGU6CiAgIFN1cHBvc2UgdGhhdCBvbiBDb21wdXRlciBBLCB5b3UgbWFpbnRhaW4gYSBsYXJnZSBzZXQgb2YgZmlsZXMgKHNheSwgYQogICBjb2xsZWN0aW9uIG9mIFdlYiBwYWdlcyBhbmQgZ3JhcGhpY3MgaW1hZ2VzLCBvciB0aGUgc291cmNlIGZpbGVzIGZvciBhCiAgIHNvZnR3YXJlIGFwcGxpY2F0aW9uKSwgYW5kIHlvdSBuZWVkIHRvIGtlZXAgYSBwYXJhbGxlbCBjb3B5IG9uIGFub3RoZXIKICAgQ29tcHV0ZXIsIEIuIE9mIGNvdXJzZSB5b3UgY291bGQgdXBsb2FkIHRoZSBlbnRpcmUgY29sbGVjdGlvbiBldmVyeQogICBkYXk6CgogIGNkIHNvdXJjZS1kaXJlY3RvcnkKICBmdHAgY29tcHV0ZXJiLnh5emNvcnAuY29tCiAgKCBhdXRoZW50aWNhdGlvbiBkZXRhaWxzLi4uICkKICBmdHAgY2QgdGFyZ2V0LWRpcmVjdG9yeQogIGZ0cCBwdXQgWyBzd2l0Y2hlcyBdICoKCiAgIEJ1dCBpZiB0aGUgdG90YWwgc2l6ZSBpcyBsYXJnZSBvciB0aGUgbmV0d29yayBzbG93LCB0aGlzIHdvdWxkIGJlCiAgIHVubmVjZXNzYXJpbHkgdGltZS1jb25zdW1pbmcuIFdvcnNlLCBpZiBvdGhlciB1c2VycyBvciBzaXRlcyBoYWQgdG8KICAgdXBkYXRlIHdoZW5ldmVyIG5ldyBmaWxlcyBhcHBlYXJlZCBpbiBCJ3MgZGlyZWN0b3J5LCB0aGlzIHdvdWxkIGNhdXNlCiAgIHRoZW0gdW5uZWNlc3Nhcnkgd29yay4gQnkgaW5jbHVkaW5nIHRoZSAvVVBEQVRFIHN3aXRjaDoKCiAgZnRwIHB1dCAvdXBkYXRlIFsgb3RoZXItc3dpdGNoZXMgXSAqCgogICBvbmx5IHRob3NlIGZpbGVzIHRoYXQgY2hhbmdlZCBzaW5jZSBsYXN0IHRpbWUgYXJlIHVwbG9hZGVkLiBIZXJlJ3MgaG93CiAgIGl0IHdvcmtzLiBGb3IgZWFjaCBsb2NhbCBmaWxlIHRoYXQgaXMgc2VsZWN0ZWQgZm9yIHVwbG9hZGluZzoKCiAgICAgKiBUaGUgcmVtb3RlIGZpbGVuYW1lIGlzIGRldGVybWluZWQgaW4gdGhlIG5vcm1hbCB3YXksIGFjY29yZGluZyB0bwogICAgICAgdGhlIFsyODhdRlRQIEZJTEVOQU1FUyBzZXR0aW5nLCAvRklMRU5BTUVTIHN3aXRjaCwgb3IgdGhlIGFzLW5hbWUsCiAgICAgICBpZiBhbnkuCiAgICAgKiBLZXJtaXQgc2VuZHMgYW4gTURUTSAobW9kaWZpY2F0aW9uIHRpbWUpIGNvbW1hbmQgZm9yIHRoZQogICAgICAgY29ycmVzcG9uZGluZyByZW1vdGUgZmlsZW5hbWUgdG8gdGhlIHNlcnZlci4KICAgICAqIElmIHRoZSBzZXJ2ZXIgZG9lcyBub3QgdW5kZXJzdGFuZCB0aGUgTURUTSBjb21tYW5kLCB0aGUgZmlsZSBpcwogICAgICAgc2VudC4KICAgICAqIElmIHRoZSBzZXJ2ZXIgY2FuJ3QgZmluZCBhIGZpbGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgdGhlIGZpbGUgaXMKICAgICAgIHNlbnQuCiAgICAgKiBJZiB0aGUgbG9jYWwgZmlsZSdzIG1vZGlmaWNhdGlvbiB0aW1lIGlzIGxhdGVyIHRoYW4gdGhhdCBvZiB0aGUKICAgICAgIHJlbW90ZSBmaWxlLCB0aGUgZmlsZSBpcyBzZW50LgogICAgICogT3RoZXJ3aXNlIC0tIHRoZSByZW1vdGUgZmlsZSBleGlzdHMgYnV0IGl0cyBtb2RpZmljYXRpb24gdGltZSBpcwogICAgICAgZXF1YWwgdG8gb3IgZWFybGllciB0aGFuIHRoYXQgb2YgdGhlIGxvY2FsIGZpbGUgLS0gdGhlIGZpbGUgaXMKICAgICAgIHNraXBwZWQuCgogICBBbGwgdGltZSBjb21wYXJpc29ucyB0YWtlIHBsYWNlIGluIENvb3JkaW5hdGVkIFVuaXZlcnNhbCBUaW1lCiAgIChVVEMpKFsyODldMSksIGFsc28ga25vd24gYXMgR01UIG9yIFp1bHUgdGltZTogVGltZXpvbmUgMDsgc3RhbmRhcmQKICAgdGltZSwgd2l0aG91dCBkYXlsaWdodCBzYXZpbmdzLgoKICAgICBXQVJOSU5HOiBTb21lIEZUUCBzZXJ2ZXJzLCBzdWNoIGFzIE5vdmVsbCBOV0ZUUEQuTkxNLCBpZ25vcmUgb3IKICAgICBtaXNpbXBsZW1lbnQgdGhlIEZUUCBzcGVjaWZpY2F0aW9uIGFuZCBzZW5kIGxvY2FsIHRpbWUgcmF0aGVyIHRoYW4KICAgICBVVEMuCgogICBVcGRhdGUgbW9kZSBpcyB1c2VmdWwgb25seSB3aGVuIGFsd2F5cyB1c2VkIGluIHRoZSBzYW1lIGRpcmVjdGlvbi4KICAgV2hlbiB5b3UgdXBsb2FkIChQVVQpIGEgZmlsZSB3aXRoIEZUUCwgdGhlIGRlc3RpbmF0aW9uIGZpbGUgcmVjZWl2ZXMKICAgdGhlIGN1cnJlbnQgdGltZXN0YW1wIG9uIHRoZSBzZXJ2ZXIncyBjb21wdXRlciwgbm90IHRoZSBvcmlnaW5hbAogICBmaWxlJ3MgdGltZXN0YW1wIChbMjkwXTIpLiBJZiB5b3UgdHJ5IHRvIEZUUCBQVVQgL1VQREFURSB0aGUgc2FtZSBmaWxlCiAgIGFnYWluLCBpdCB3aWxsIGJlIHNraXBwZWQgKGFzIGV4cGVjdGVkKSBzaW5jZSB0aGUgcmVtb3RlIGNvcHkgaXMKICAgbmV3ZXIuIEhvd2V2ZXIsIGlmIHlvdSB0cnkgdG8gRlRQIEdFVCAvVVBEQVRFIHRoZSBzYW1lIGZpbGUKICAgKFsyOTFdU2VjdGlvbiAzLjYpLCBpdCB3aWxsIGJlIHRyYW5zZmVycmVkIGZvciB0aGUgc2FtZSByZWFzb24uCgogICBUbyBjaGVjayB0aGUgYXZhaWxhYmlsaXR5IG9mIFBVVCAvVVBEQVRFIG9uIGEgcGFydGljdWxhciBjb25uZWN0aW9uLAogICBpc3N1ZSBhbiBGVFAgTU9EVElNRSBjb21tYW5kIGZvciBhIGZpbGUgdGhhdCBpcyBrbm93biB0byBleGlzdCBvbiB0aGUKICAgc2VydmVyLiBJZiBpdCBzdWNjZWVkcywgUFVUIC9VUERBVEUgc2hvdWxkIHdvcmsgYW5kIGluIHRoYXQgY2FzZSwgeW91CiAgIGNhbiBydW4gYSBwcm9jZWR1cmUgbGlrZSB0aGUgb25lIGFib3ZlIGV2ZXJ5IGRheTogdGhlIGZpcnN0IHRpbWUsIGl0CiAgIHNlbmRzIGFsbCB0aGUgZmlsZXM7IGFmdGVyIHRoYXQsIGl0IHNlbmRzIG9ubHkgdGhlIG9uZXMgdGhhdCBjaGFuZ2VkLgogICBJZiBhIHRyYW5zYWN0aW9uIGxvZyBpcyBhY3RpdmUsIGEgbm90YXRpb24gaXMgaW5jbHVkZWQgZm9yIGFueSBmaWxlcwogICB0aGF0IGFyZSBza2lwcGVkLgoKICAgTm90ZXM6CiAgICAxLiBXaHkgaXMgQ29vcmRpbmF0ZWQgVW5pdmVyc2FsIFRpbWUgYWJicmV2aWF0ZWQgVVRDPyBGcm9tIHRoZQogICAgICAgWzI5Ml1OYXRpb25hbCBJbnN0aXR1dGUgb2YgU3RhbmRhcmRzIGFuZCBUZWNobm9sb2d5IEZBUTogIkluIDE5NzAKICAgICAgIHRoZSBDb29yZGluYXRlZCBVbml2ZXJzYWwgVGltZSBzeXN0ZW0gd2FzIGRldmlzZWQgYnkgYW4KICAgICAgIGludGVybmF0aW9uYWwgYWR2aXNvcnkgZ3JvdXAgb2YgdGVjaG5pY2FsIGV4cGVydHMgd2l0aGluIHRoZQogICAgICAgSW50ZXJuYXRpb25hbCBUZWxlY29tbXVuaWNhdGlvbiBVbmlvbiAoSVRVKS4gVGhlIElUVSBmZWx0IGl0IHdhcwogICAgICAgYmVzdCB0byBkZXNpZ25hdGUgYSBzaW5nbGUgYWJicmV2aWF0aW9uIGZvciB1c2UgaW4gYWxsIGxhbmd1YWdlcwogICAgICAgaW4gb3JkZXIgdG8gbWluaW1pemUgY29uZnVzaW9uLiBTaW5jZSB1bmFuaW1vdXMgYWdyZWVtZW50IGNvdWxkCiAgICAgICBub3QgYmUgYWNoaWV2ZWQgb24gdXNpbmcgZWl0aGVyIHRoZSBFbmdsaXNoIHdvcmQgb3JkZXIsIENVVCwgb3IKICAgICAgIHRoZSBGcmVuY2ggd29yZCBvcmRlciwgVFVDLCB0aGUgYWNyb255bSBVVEMgd2FzIGNob3NlbiBhcyBhCiAgICAgICBjb21wcm9taXNlLiIKICAgIDIuIFRoZSBLZXJtaXQgRlRQIGNsaWVudCBpcyB1bnVzdWFsIGluIHRoYXQsIHdoZW4gZG93bmxvYWRpbmcgb25seSwKICAgICAgIGl0IGNhbiBzZXQgdGhlIHJlY2VpdmVkIGZpbGUncyBkYXRlIGZyb20gdGhlIGZpbGUncyBkYXRlIG9uIHRoZQogICAgICAgc2VydmVyLCBidXQgdGhpcyBzaG91bGQgbm90IGFmZmVjdCB0aGUgdXBkYXRlIGZlYXR1cmUuIFdoZW4KICAgICAgIHVwbG9hZGluZyB0byBhbiBGVFAgc2VydmVyLCBob3dldmVyLCB0aGVyZSBpcyBubyBtZWNoYW5pc20gZm9yIHRoZQogICAgICAgY2xpZW50IHRvIHNldCB0aGUgZGF0ZSBvZiB0aGUgdXBsb2FkZWQgZmlsZSBvbiB0aGUgc2VydmVyLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgMy41LjMgUmVjb3ZlcnkKCiAgIFN1cHBvc2UgdGhhdCB3aGlsZSB5b3UgYXJlIHVwbG9hZGluZyBhIGxhcmdlIGZpbGUgb3ZlciBhIHNsb3cKICAgY29ubmVjdGlvbiwgdGhlIGNvbm5lY3Rpb24gaXMgbG9zdCBiZWZvcmUgdGhlIGVudGlyZSBmaWxlIGlzCiAgIHRyYW5zZmVycmVkLiBXaXRoIG1vc3QgRlRQIGNsaWVudHMsIHlvdSB3b3VsZCBoYXZlIHRvIHN0YXJ0IG92ZXIsIHRodXMKICAgcmVzZW5kaW5nIHRoZSBwb3J0aW9uIG9mIHRoZSBmaWxlIHRoYXQgd2FzIHNlbnQgYWxyZWFkeSwgYW5kIHRoYXQgaXMKICAgYWxyZWFkeSBvbiB0aGUgc2VydmVyLiBCdXQgS2VybWl0J3MgL1JFQ09WRVIgc3dpdGNoIChTeW5vbnltOgogICAvUkVTVEFSVCkgbGV0cyB5b3UgY29udGludWUgYW4gaW50ZXJydXB0ZWQgdHJhbnNmZXIgZnJvbSB0aGUgcG9pbnQgb2YKICAgZmFpbHVyZSwgdGh1cyB0cmFuc2ZlcnJpbmcgb25seSB0aGUgcGFydCB0aGF0IHdhc24ndCBzZW50IGFscmVhZHkuIFRoZQogICBwcmVyZXF1aXNpdGVzIGZvciByZWNvdmVyeSBhcmU6CgogICAgICogVGhlIHRyYW5zZmVyIG11c3QgYmUgaW4gQklOQVJZIG1vZGUsIG9yIGVsc2UgdGhlIGNsaWVudCBhbmQgc2VydmVyCiAgICAgICBtdXN0IHJlc2lkZSBvbiBsaWtlIHN5c3RlbXMgKGUuZy4gYm90aCBvbiBzb21lIGZvcm0gb2YgVU5JWCkuCiAgICAgKiBUaGUgRlRQIHNlcnZlciBtdXN0IHN1cHBvcnQgdGhlIFNJWkUgY29tbWFuZC4KCiAgIEhlcmUncyBob3cgaXQgd29ya3MuIFdoZW4geW91IGluY2x1ZGUgdGhlIC9SRUNPVkVSIHN3aXRjaDoKCiAgICAgKiBLZXJtaXQgY2hlY2tzIGZvciBjb25mbGljdGluZyBzd2l0Y2hlcywgc3VjaCBhcyAvVVBEQVRFIGFuZAogICAgICAgL1VOSVFVRTsgaWYgL1JFQ09WRVIgaXMgZ2l2ZW4gd2l0aCB0aGVzZSBzd2l0Y2hlcyBhbiBlcnJvciBvY2N1cnMuCiAgICAgICBJZiAvUkVDT1ZFUiBpcyBnaXZlbiBpbiBvdGhlciBjaXJjdW1zdGFuY2VzIHdoZXJlIGl0IGNvdWxkIHNlcnZlCiAgICAgICBubyB1c2VmdWwgcHVycG9zZSAoZS5nLiB3aXRoIGFycmF5cywgcGlwZXMsIG9yIGZpbHRlcnMpLCBpdCBpcwogICAgICAgaWdub3JlZC4KCiAgIElmIHRoZSBzd2l0Y2ggaXMgYWNjZXB0ZWQsIHRoZW4gZm9yIGVhY2ggc2VsZWN0ZWQgZmlsZToKCiAgICAgKiBJZiBpdCBpcyBub3QgYmluYXJ5IChkZXRlcm1pbmVkIGJ5IHNjYW5uaW5nKSBhbmQgdGhlIGNsaWVudCBhbmQKICAgICAgIHNlcnZlciBhcmUgbm90IG9uIGxpa2UgcGxhdGZvcm1zLCByZWNvdmVyeSBpcyBjYW5jZWxlZCAodGhlIGVudGlyZQogICAgICAgZmlsZSBpcyBzZW50KS4gT3RoZXJ3aXNlOgogICAgICogQSBTSVpFIGNvbW1hbmQgaXMgc2VudCBmb3IgdGhlIGZpbGUgKHVzaW5nIGl0cyByZW1vdGUgbmFtZSkuIElmCiAgICAgICB0aGUgcmVwbHkgaW5kaWNhdGVzIHRoZSBmaWxlIHdhcyBub3QgZm91bmQsIG9yIHRoZSBTSVpFIGNvbW1hbmQKICAgICAgIHdhcyBub3QgdW5kZXJzdG9vZCwgb3IgYW55IG90aGVyIGtpbmQgb2YgZXJyb3IsIHJlY292ZXJ5IGlzCiAgICAgICBjYW5jZWxlZC4gT3RoZXJ3aXNlOgogICAgICogQSBNRFRNIChtb2RpZmljYXRpb24gdGltZSkgY29tbWFuZCBpcyBzZW50IGZvciB0aGUgZmlsZS4gSWYgYQogICAgICAgdmFsaWQgcmVwbHkgaXMgcmVjZWl2ZWQsIGFuZCB0aGUgbW9kaWZpY2F0aW9uIHRpbWUgb2YgdGhlIGxvY2FsCiAgICAgICBmaWxlIGlzIGxhdGVyIHRoYW4gdGhhdCBvZiB0aGUgcmVtb3RlIGZpbGUsIHJlY292ZXJ5IGlzIGNhbmNlbGVkLgogICAgICAgT3RoZXJ3aXNlOgogICAgICogSWYgdGhlIHNpemVzIG9mIHRoZSB0d28gZmlsZXMgYXJlIGlkZW50aWNhbCwgdGhlIGZpbGUgaXMgbm90IHNlbnQuCiAgICAgICBPdGhlcndpc2U6CiAgICAgKiBLZXJtaXQgc2Vla3MgdG8gdGhlIHJlY292ZXJ5IHNwb3QgaW4gdGhlIGxvY2FsIGZpbGUsIHRlbGxzIHRoZQogICAgICAgc2VydmVyIHRvIEFQUEVORCB0aGUgZGF0YSB3aGljaCBpcyBhYm91dCB0byBhcnJpdmUgdG8gdGhlIHJlbW90ZQogICAgICAgZmlsZSwgYW5kIHRoZW4gc2VuZHMgdGhlIGRhdGEgc3RhcnRpbmcgYXQgdGhlIHJlY292ZXJ5IHBvaW50LgoKICAgVG8gc2FmZWd1YXJkIGZpbGUgaW50ZWdyaXR5LCByZWNvdmVyeSBpcyBub3QgYXR0ZW1wdGVkIHVubGVzcyBhbGwgdGhlCiAgIHByZWNvbmRpdGlvbnMgYXJlIG1ldC4gRm9yIHRoZSB3aWRlc3QgcG9zc2libGUgdXNlZnVsbmVzcywgQVBQRU5EIGlzCiAgIHVzZWQgcmF0aGVyIHRoYW4gUkVTVEFSVC4gRm9yIHN0cmVhbSB0cmFuc2ZlcnMgKHRoZSBvbmx5IGtpbmQgdGhhdAogICBLZXJtaXQgc3VwcG9ydHMpIHRoZSByZXN1bHRzIGFyZSB0aGUgc2FtZS4KCiAgIEJ5IGRlc2lnbiwgdGhlIC9SRUNPVkVSIHN3aXRjaCBjYW4gYmUgaW5jbHVkZWQgd2l0aCBhbnkgRlRQIFBVVCBvcgogICBNUFVUIGNvbW1hbmQsIGV2ZW4gaWYgaXQgc3BlY2lmaWVzIGEgZ3JvdXAgb2YgZmlsZXMuIFRoaXMgYWxsb3dzIHlvdQogICB0byByZXN1bWUgYW4gaW50ZXJydXB0ZWQgYmF0Y2ggdHJhbnNmZXIgZnJvbSB3aGVyZSBpdCBsZWZ0IG9mZi4gVGhlCiAgIGZpbGVzIHRoYXQgd2VyZSBhbHJlYWR5IGNvbXBsZXRlbHkgc2VudCBhcmUgc2tpcHBlZCwgdGhlIGZpbGUgdGhhdCB3YXMKICAgaW50ZXJydXB0ZWQgaXMgcmVjb3ZlcmVkLCBhbmQgdGhlIHJlbWFpbmluZyBmaWxlcyBhcmUgdXBsb2FkZWQuCgogICBCeSB0aGUgd2F5LCBpdCBkb2Vzbid0IG1hdHRlciBob3cgdGhlIG9yaWdpbmFsIHBhcnRpYWwgZmlsZSB3YXMKICAgdXBsb2FkZWQgLS0gRlRQLCBLZXJtaXQsIFptb2RlbSwgZXRjOiBhcyBsb25nIGFzIHRoZSBwcmVjb25kaXRpb25zIGFyZQogICBtZXQsIGl0IGNhbiBiZSByZWNvdmVyZWQgd2l0aCBGVFAgUFVUIC9SRUNPVkVSLCBvciBmb3IgdGhhdCBtYXR0ZXIKICAgYWxzbyB1c2luZyBLZXJtaXQgcHJvdG9jb2wgYW5kIFNFTkQgL1JFQ09WRVIuCgogICBBIHdvcmQgb2YgY2F1dGlvbiwgaG93ZXZlciwgd2hlbiB0aGUgb3JpZ2luYWwgdXBsb2FkIHdhcyBpbiB0ZXh0IG1vZGUKICAgd2l0aCBjaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9uIChbMjkzXVNlY3Rpb24gMy43KToKCiAgICAgKiBJZiB0aGUgb3JpZ2luYWwgdXBsb2FkIGludm9sdmVkIGEgdHJhbnNsYXRpb24gZnJvbSBvbmUgc2luZ2xlLWJ5dGUKICAgICAgIGNoYXJhY3RlciBzZXQgdG8gYW5vdGhlciAoZS5nLiBDb2RlIFBhZ2UgODUwIHRvIExhdGluLTEpLCByZWNvdmVyeQogICAgICAgaXMgc2FmZSBpZiB5b3Ugc3BlY2lmeSB0aGUgc2FtZSB0cmFuc2xhdGlvbnMgZm9yIHRoZSByZWNvdmVyeS4gSWYKICAgICAgIHlvdSBkb24ndCwgdGhlIHJlc3VsdGluZyBmaWxlIHdpbGwgY29udGFpbiBhIG1peHR1cmUgb2YgY2hhcmFjdGVyCiAgICAgICBzZXRzLgogICAgICogSWYgdGhlIG9yaWdpbmFsIHVwbG9hZCBpbnZvbHZlZCBhIHRyYW5zbGF0aW9uIHRoYXQgY2hhbmdlZCB0aGUKICAgICAgIHNpemUgb2YgdGhlIGZpbGUgKGUuZy4gZnJvbSBhbiBhbHBoYWJldGljIENvZGUgUGFnZSBvciBMYXRpbgogICAgICAgQWxwaGFiZXQgdG8gVW5pY29kZSwgb3IgdmljZSB2ZXJzYSksIHJlY292ZXJ5IGlzIE5PVCBzYWZlLCBldmVuIGlmCiAgICAgICB5b3Ugc3BlY2lmeSB0aGUgc2FtZSB0cmFuc2xhdGlvbnMuCgogICBLZXJtaXQgaGFzIG5vIHdheSBvZiBrbm93aW5nIGFueXRoaW5nIGFib3V0IHRoZSBwcmV2aW91cyB1cGxvYWQuIEFzIGEKICAgc2FmZWd1YXJkLCBhbiBlcnJvciBvY2N1cnMgaWYgeW91IGluY2x1ZGUgL1JFQ09WRVIgYW5kIGFsc28gc3BlY2lmeSBhCiAgIGNoYXJhY3Rlci1zZXQgb2YgVUNTMiBvciBVVEY4LCBzaW5jZSByZWNvdmVyeSBjYW4ndCBwb3NzaWJseSB3b3JrIGluCiAgIHRoYXQgc2l0dWF0aW9uLiBPdGhlcndpc2UsIGl0J3MgdXAgdG8geW91IHRvIGF2b2lkIHVuc2FmZSByZWNvdmVyeQogICBvcGVyYXRpb25zLgoKICAgWyBbMjk0XVRvcCBdIFsgWzI5NV1GVFAgVG9wIF0gWyBbMjk2XUMtS2VybWl0IEhvbWUgXSBbIFsyOTddS2VybWl0CiAgIEhvbWUgXQogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDMuNi4gRG93bmxvYWRpbmcgRmlsZXMgV2l0aCBGVFAKCiAgIEFsdGhvdWdoIHVwbG9hZGluZyBmaWxlcyB3aXRoIEtlcm1pdCdzIEZUUCBjbGllbnQgaXMganVzdCBhcyBlYXN5IGFuZAogICBmbGV4aWJsZSBhcyBzZW5kaW5nIGZpbGVzIHdpdGggS2VybWl0IHByb3RvY29sLCB0aGUgc2FtZSBpcyBub3QgYWx3YXlzCiAgIHRydWUgZm9yIGRvd25sb2FkaW5nIGJlY2F1c2UgRlRQIHNlcnZlcnMgbGFjayBzb21lIG9mIHRoZSBjYXBhYmlsaXRpZXMKICAgb2YgYSBLZXJtaXQgc2VydmVyOgoKICAgICAqIElmIHlvdSB3YW50IHRvIGdldCBtb3JlIHRoYW4gb25lIGZpbGUsIHlvdSBoYXZlIHRvIHVzZSBNR0VULCBub3QKICAgICAgIEdFVCwgc2luY2UgdGhlIHVuZGVybHlpbmcgRlRQIHByb3RvY29sIGlzIGRpZmZlcmVudCBpbiB0aGUgdHdvCiAgICAgICBjYXNlcy4gS2VybWl0IGNhbid0ICJhdXRvZGV0ZWN0IiB3aGljaCBvbmUgeW91IG1lYW4sIGFzIGl0IGNhbgogICAgICAgd2l0aCBQVVQgYW5kIE1QVVQsIHNpbmNlIGl0IGNhbid0IGJlIGV4cGVjdGVkIHRvIGtub3cgdGhlIHdpbGRjYXJkCiAgICAgICBzeW50YXggb2YgdGhlIHJlbW90ZSBwbGF0Zm9ybSBhbmQvb3IgRlRQIHNlcnZlciAodGhlIHNhbWUgaXMgdHJ1ZQogICAgICAgZm9yIGFsbCBvdGhlciBGVFAgY2xpZW50cykuIFRvIGNvbXBsaWNhdGUgbWF0dGVycywgRlRQIHByb3RvY29sCiAgICAgICBub3cgaW5jbHVkZXMgdHdvIHVuZGVybHlpbmcgbWVjaGFuaXNtcyAoTkxTVCBhbmQgTUxTRCkgZm9yCiAgICAgICBhY2NvbXBsaXNoaW5nIE1HRVQgb3BlcmF0aW9ucyBhbmQsIGFzIGV4cGxhaW5lZCBpbiBbMjk4XVNlY3Rpb24KICAgICAgIDMuMTEsIHRoZSB0d28gYmVoYXZlIGRpZmZlcmVudGx5LgogICAgICogQXV0b21hdGljIHRleHQtYmluYXJ5IG1vZGUgc3dpdGNoaW5nIGlzIG5vdCBkb25lIGJ5IHRoZSBzZXJ2ZXIuIEl0CiAgICAgICBjYW4gYmUgZG9uZSBieSB0aGUgY2xpZW50IChLZXJtaXQpLCBidXQgaW4gdGhpcyBjYXNlIGl0IGlzIG5vdAogICAgICAgYmFzZWQgb24gYSBmaWxlIHNjYW4gKHNpbmNlIHRoZXJlIGlzIG5vIHdheSBmb3IgS2VybWl0IHByZXNjYW4gYQogICAgICAgc2VydmVyIGZpbGUpLCBidXQgcmF0aGVyIG9uIHRoZSBmaWxlbmFtZSwgdXNpbmcgQy1LZXJtaXQgNy4wCiAgICAgICBbMjk5XWZpbGVuYW1lIHBhdHRlcm5zLgogICAgICogU29tZSBvcHRpb25zIHRoYXQgYXJlIGF2YWlsYWJsZSB3aXRoIEZUUCBQVVQgY2FuIG5vdCBiZSB1c2VkIHdpdGgKICAgICAgIEZUUCBbTV1HRVQgb3IgZG9uJ3Qgd29yayB0aGUgc2FtZSB3YXk6CiAgICAgICAgIC9QRVJNSVNTSU9OUyAoRlRQIHByb3RvY29sIGhhcyBubyBtZWNoYW5pc20gZm9yIHRoaXMpLgogICAgICAgICAvW05PVC1dQkVGT1JFLCAvW05PVC1dQUZURVIgKGJlY2F1c2Ugb2YgdGhlIHRpbWV6b25lIHByb2JsZW0pLgogICAgICAgICAvUkVDT1ZFUiB3b3JrcyBvbmx5IGluIGJpbmFyeSBtb2RlLiAgIC9SRUNVUlNJVkUgaGFzIGxpbWl0ZWQKICAgICAgIHV0aWxpdHkuCgogICBUaGUgY29tbWFuZHMgZm9yIGRvd25sb2FkaW5nIGFyZToKCiAgIFNFVCBGSUxFIERPV05MT0FELURJUkVDVE9SWSBbIGRpcmVjdG9yeSBdCiAgICAgICAgICBBcyB3aXRoIEtlcm1pdCB0cmFuc2ZlcnMsIHRoaXMgY29tbWFuZCwgaWYgZ2l2ZW4sIHRlbGxzCiAgICAgICAgICBDLUtlcm1pdCB3aGVyZSB0byBzdG9yZSBpbmNvbWluZyBmaWxlcyBpbiB0aGUgYWJzZW5jZSBvZiBhCiAgICAgICAgICBzcGVjaWZpYyBhcy1uYW1lLiBJZiBub3QgZ2l2ZW4sIGluY29taW5nIGZpbGVzIGFyZSBzdG9yZWQgYXMKICAgICAgICAgIGluZGljYXRlZCBieSB0aGUgYXMtbmFtZSwgaWYgYW55LCBvdGhlcndpc2UgaW4gdGhlIGN1cnJlbnQKICAgICAgICAgIGRpcmVjdG9yeSwganVzdCBhcyB3aXRoIEtlcm1pdCB0cmFuc2ZlcnMuIFRoZSBtb3JlIHZlcmJvc2UKICAgICAgICAgIHRyYW5zZmVyIGRpc3BsYXkgZm9ybWF0cyBnaXZlIHRoZSBmdWxsIHBhdGhuYW1lIG9mIGVhY2gKICAgICAgICAgIHJlY2VpdmVkIGZpbGUsIGFuZCwgaW4gY2FzZSB5b3UgaGF2ZSB0cm91YmxlIGZpbmRpbmcgYQogICAgICAgICAgZG93bmxvYWRlZCBmaWxlIGFmdGVyd2FyZHMsIGl0cyBmdWxsIHBhdGggaXMgYWxzbyBsaXN0ZWQgaW4gdGhlCiAgICAgICAgICB0cmFuc2FjdGlvbiBsb2cgKGlmIHlvdSBrZXB0IG9uZSksIGFuZCB5b3UgY2FuIGFsc28gYXNrIEtlcm1pdAogICAgICAgICAgd2hlcmUgaXQgd2VudCB3aXRoIHRoZSBbMzAwXVdIRVJFIGNvbW1hbmQuCgogICBTRVQgRlRQIEdFVC1GSUxFVFlQRS1TV0lUQ0hJTkcgeyBPTiwgT0ZGIH0KICAgICAgICAgIE9OIGJ5IGRlZmF1bHQsIGNhdXNpbmcgS2VybWl0IHRvIHN3aXRjaCBhdXRvbWF0aWNhbGx5IGludG8gdGV4dAogICAgICAgICAgb3IgYmluYXJ5IG1vZGUgZm9yIGVhY2ggZmlsZSBiYXNlZCBvbiB3aGV0aGVyIGl0cyBuYW1lIG1hdGNoZXMKICAgICAgICAgIGEgdGV4dCBwYXR0ZXJuIG9yIGJpbmFyeSBwYXR0ZXJuLiBTZXQgdGhpcyBPRkYsIG9yIHVzZSBhIC9URVhULAogICAgICAgICAgL0JJTkFSWSwgb3IgL1RFTkVYIHN3aXRjaCB0byBkZWZlYXQgdGhpcyBmZWF0dXJlLiBVc2UgU0hPVwogICAgICAgICAgUEFUVEVSTlMgdG8gc2VlIHRoZSBjdXJyZW50IHBhdHRlcm4gbGlzdC4KCiAgIFsgRlRQIF0gR0VUIFsgc3dpdGNoZXMgXSBmaWxlbmFtZSBbIGFzLW5hbWUgXQogICAgICAgICAgQXNrcyB0aGUgc2VydmVyIHRvIHNlbmQgdGhlIGdpdmVuIGZpbGUsIGFuZCBpZiBpdCBjb21lcywgc3RvcmVzCiAgICAgICAgICBpdCBsb2NhbGx5IHVuZGVyIHRoZSBnaXZlbiBhcy1uYW1lLCBpZiBhbnksIG90aGVyd2lzZSB1bmRlciBpdHMKICAgICAgICAgIG9yaWdpbmFsIG5hbWUgKG1vZGlmaWVkIGFjY29yZGluZyB0byB0aGUgc2VsZWN0ZWQgZmlsZW5hbWUKICAgICAgICAgIGNvbnZlcnNpb24gb3B0aW9uKSwgaW4geW91ciBkb3dubG9hZCBkaXJlY3RvcnksIGlmIHlvdSBoYXZlCiAgICAgICAgICBzcGVjaWZpZWQgb25lLCBvdGhlcndpc2UgaW4gdGhlIGRpcmVjdG9yeSBpbmRpY2F0ZWQgaW4gdGhlCiAgICAgICAgICBhcy1uYW1lLCBpZiBhbnksIG90aGVyd2lzZSBpbiB5b3VyIGN1cnJlbnQgZGlyZWN0b3J5LiBJZiB5b3UKICAgICAgICAgIGFjY2lkZW50YWxseSB1c2UgYSB3aWxkY2FyZCBpbiB0aGUgZmlsZW5hbWUgKCJnZXQgKi50eHQiKSB0aGUKICAgICAgICAgIHNlcnZlciB3aWxsIHJlcGx5IHdpdGggYSBtZXNzYWdlIGxpa2UgIkZpbGUgbm90IGZvdW5kIiAodW5sZXNzCiAgICAgICAgICB0aGVyZSBpcyBhIGZpbGUgd2hvc2UgbmFtZSBhY3R1YWxseSBpcyAiKi50eHQiKS4gSWYgRlRQCiAgICAgICAgICBHRVQtRklMRVRZUEUtU1dJVENISU5HIGlzIE9OLCBhbmQgaW4gdGhlIGFic2VuY2Ugb2YgYW55IEdFVAogICAgICAgICAgc3dpdGNoZXMgdG8gb3ZlcnJpZGUgaXQsIHRoZSBmaWxlIGlzIHRyYW5zZmVycmVkIGluIGJpbmFyeSBtb2RlCiAgICAgICAgICBpZiBpdCBtYXRjaGVzIGFueSBvZiBLZXJtaXQncyBiaW5hcnkgbmFtZSBwYXR0ZXJucywgYW5kIGluIHRleHQKICAgICAgICAgIG1vZGUgaWYgaXQgbWF0Y2hlcyBhbnkgb2YgS2VybWl0J3MgdGV4dCBuYW1lIHBhdHRlcm5zLCBhbmQgaW4KICAgICAgICAgIHRoZSBwcmV2YWlsaW5nIEZUUCBUWVBFIGlmIGl0IG1hdGNoZXMgbm9uZSBvZiB0aGVzZSBwYXR0ZXJucy4KCiAgIFsgRlRQIF0gTUdFVCBbIHN3aXRjaGVzIF0gZmlsZXNwZWMgWyBmaWxlc3BlYyBbIGZpbGVzcGVjIFsgLi4uIF0gXSBdCiAgICAgICAgICBMaWtlIEdFVCwgYnV0IGZvciBtdWx0aXBsZSBmaWxlcy4gT25lIG9yIG1vcmUgZmlsZQogICAgICAgICAgc3BlY2lmaWNhdGlvbnMgY2FuIGJlIGdpdmVuLCBhbmQgYW55IG9yIGFsbCAob3Igbm9uZSkgb2YgdGhlbQogICAgICAgICAgY2FuIGNvbnRhaW4gd2lsZGNhcmRzIG9yIGNhbiBiZSBkaXJlY3RvcnkgbmFtZXMuIFRoZSBmaWxlIGxpc3QKICAgICAgICAgIG1heSBub3QgaW5jbHVkZSBhbiBhcy1uYW1lLCBidXQgeW91IGNhbiBzdGlsbCBnaXZlIG9uZSB3aXRoIHRoZQogICAgICAgICAgL0FTLU5BTUU6IHN3aXRjaC4KCiAgIEluIGJvdGggdGhlIEZUUCBHRVQgYW5kIE1HRVQgY29tbWFuZHMsIGFueSBmaWxlbmFtZXMgdGhhdCBjb250YWluCiAgIHNwYWNlcyBtdXN0IGJlIGVuY2xvc2VkIGluIGJyYWNlcyBvciBkb3VibGVxdW90ZXMgKHNlZSBbMzAxXVNlY3Rpb24gNQogICBmb3IgZGV0YWlscykuCgogICBGVFAgZG93bmxvYWRzIG1heSBiZSBpbnRlcnJ1cHRlZCBqdXN0IGxpa2UgS2VybWl0IHRyYW5zZmVycy4gV2hpbGUgdGhlCiAgIHRyYW5zZmVyIGlzIGluIHByb2dyZXNzLCB0eXBlOgoKICAgICAqIFggdG8gaW50ZXJydXB0IHRoZSBjdXJyZW50IGZpbGUgYW5kIGdvIG9uIHRvIHRoZSBuZXh0IGZpbGUuCiAgICAgKiBaIChvciBDb250cm9sLUMpIHRvIGNhbmNlbCB0aGUgY3VycmVudCBmaWxlIGFuZCBhbGwgcmVtYWluaW5nCiAgICAgICBmaWxlcy4KCiAgIEJlZm9yZSBwcm9jZWVkaW5nLCBhIGJyaWVmIHdvcmQgYWJvdXQgdGVtcG9yYXJ5IGZpbGVzLiBJbiBGVFAKICAgcHJvdG9jb2wsIHRoZSBNR0VUIGNvbW1hbmQgd29ya3MgYnkgcmVxdWVzdGluZyBhIGZpbGUgbGlzdCBmcm9tIHRoZQogICBzZXJ2ZXIsIGFuZCB0aGVuIChpbnRlcm5hbGx5KSBpc3N1aW5nIGEgR0VUIGNvbW1hbmQgKEZUUCBSRVRSIHByb3RvY29sCiAgIGRpcmVjdGl2ZSkgZm9yIGVhY2ggZmlsZS4gVGhlIGZpbGUgbGlzdCByZXR1cm5lZCBieSB0aGUgc2VydmVyIGNhbiBiZQogICBhbnkgc2l6ZSBhdCBhbGwsIHNvIGluIGNhc2UgaXQgaXMgaHVnZSwgd2UgZG9uJ3Qgc3RvcmUgaXQgaW4gbWVtb3J5OwogICBpbnN0ZWFkIHdlIHB1dCBpdCBpbiBhIHRlbXBvcmFyeSBmaWxlLiBGb3IgdHJvdWJsZXNob290aW5nIHB1cnBvc2VzLAogICB5b3Ugc2hvdWxkIGJlIGF3YXJlIG9mIHR3byBwb2ludHM6CgogICAgMS4gVGhlIGxvY2F0aW9uIG9mIHRoZSB0ZW1wb3JhcnkgZmlsZSBpcyBjaG9zZW4gYWNjb3JkaW5nIHRoZSBUTVAgb3IKICAgICAgIFRFTVAgZW52aXJvbm1lbnQgdmFyaWFibGVzLiBJZiBuZWl0aGVyIG9mIHRoZXNlIHZhcmlhYmxlcyBpcwogICAgICAgZGVmaW5lZCwgeW91IG1pZ2h0IG5lZWQgdG8gZGVmaW5lIGl0LiBJbiBjYXNlIHRoZXJlIGlzIG5vdCBlbm91Z2gKICAgICAgIHNwYWNlIG9uIHRoZSBpbmRpY2F0ZWQgZGlzayBvciBwYXJ0aXRpb24gZm9yIHRoZSBzZXJ2ZXIncyBmaWxlCiAgICAgICBsaXN0LCB5b3UgbWlnaHQgbmVlZCB0byBlaXRoZXIgY2xlYW4gdXAgdGhlIHRlbXBvcmFyeSBhcmVhLCBvcgogICAgICAgcmVkZWZpbmUgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGluZGljYXRlIGEgZGlmZmVyZW50IGFyZWEKICAgICAgIHRoYXQgaGFzIHN1ZmZpY2llbnQgc3BhY2UuCiAgICAyLiBJZiB5b3Ugd2FudCB0byBsb29rIGF0IHRoZSBsaXN0IHlvdXJzZWxmLCB1c2UgU0VUIEZUUCBERUJVRyBPTi4KICAgICAgIFRoaXMgdGVsbHMgS2VybWl0IHRvIChhKSBnaXZlIHlvdSB0aGUgZnVsbCBwYXRobmFtZSBvZiB0aGUKICAgICAgIHRlbXBvcmFyeSBmaWxlIGF0IHRoZSBlbmQgb2YgZWFjaCBNR0VUIGNvbW1hbmQsIGFuZCAoYikgbm90IHRvCiAgICAgICBkZWxldGUgaXQsIGFzIGl0IG5vcm1hbGx5IGRvZXMuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICAzLjYuMS4gRlRQIEdFVCBTd2l0Y2hlcwoKICAgVGhlIGZvbGxvd2luZyBzd2l0Y2hlcyBhcmUgYXZhaWxhYmxlIHdpdGggRlRQIEdFVCBhbmQgTUdFVDoKCiAgIC9URVhUCiAgICAgICAgICBTcGVjaWZpZXMgYSB0ZXh0LW1vZGUgdHJhbnNmZXIuIE92ZXJyaWRlcyB0aGUgZ2xvYmFsIEZUUCBUWVBFCiAgICAgICAgICBzZXR0aW5nIGFuZCBmaWxlbmFtZSBwYXR0ZXJuLW1hdGNoaW5nIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlCiAgICAgICAgICBjdXJyZW50IGNvbW1hbmQgb25seSwgQWxsIGZpbGVzIGFyZSBkb3dubG9hZGVkIGluIHRleHQgbW9kZS4KICAgICAgICAgIFN5bm9ueW06IC9BU0NJSS4KCiAgIC9CSU5BUlkKICAgICAgICAgIFNwZWNpZmllcyBhIGJpbmFyeS1tb2RlIHRyYW5zZmVyLiBPdmVycmlkZXMgdGhlIGdsb2JhbCBGVFAgVFlQRQogICAgICAgICAgc2V0dGluZyBhbmQgZmlsZW5hbWUgcGF0dGVybi1tYXRjaGluZyBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZQogICAgICAgICAgY3VycmVudCBjb21tYW5kIG9ubHkuIEFsbCBmaWxlcyBhcmUgZG93bmxvYWRlZCBpbiBiaW5hcnkgbW9kZS4KCiAgIC9URU5FWAogICAgICAgICAgTGlrZSAvQklOQVJZIGJ1dCBzcGVjaWZpZXMgYSBzcGVjaWFsIGJpbmFyeSB0cmFuc2ZlciBtb2RlIHRvIGJlCiAgICAgICAgICB1c2VkIHdoZW4gZ2V0dGluZyA4LWJpdCBiaW5hcnkgZmlsZXMgZnJvbSBhIDM2LWJpdCBwbGF0Zm9ybQogICAgICAgICAgc3VjaCBhcyBUT1BTLTEwLCBUT1BTLTIwLCBvciBURU5FWC4gQWxsIGZpbGVzIGFyZSBkb3dubG9hZGVkIGluCiAgICAgICAgICB0aGUgc3BlY2lhbCBiaW5hcnkgbW9kZS4KCiAgIC9SRUNPVkVSCiAgICAgICAgICBUaGlzIGluc3RydWN0cyBLZXJtaXQgdG8gdHJ5IHRvIHJlY292ZXIgYW4gaW5jb21wbGV0ZSBkb3dubG9hZAogICAgICAgICAgZnJvbSB0aGUgcG9pbnQgb2YgZmFpbHVyZS4gV29ya3Mgb25seSBpbiBiaW5hcnkgbW9kZSwgYW5kIG9ubHkKICAgICAgICAgIGlmIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgdGhlIChub3QteWV0LXN0YW5kYXJkKSBGVFAgIlJFU1QiCiAgICAgICAgICBkaXJlY3RpdmUuIFNlZSBbMzAyXVNlY3Rpb24gMy42LjMgZm9yIGRldGFpbHMuIFN5bm9ueW06CiAgICAgICAgICAvUkVTVEFSVC4KCiAgIC9GSUxFTkFNRVM6e0NPTlZFUlRFRCxMSVRFUkFMfQogICAgICAgICAgT3ZlcnJpZGVzIHRoZSBbMzAzXUZUUCBGSUxFTkFNRVMgKGZpbGVuYW1lIGNvbnZlcnNpb24pIHNldHRpbmcKICAgICAgICAgIGZvciB0aGlzIGRvd25sb2FkIG9ubHksIGZvcmNpbmcgaW5jb21pbmcgZmlsZW5hbWVzIHRvIGJlIGVpdGhlcgogICAgICAgICAgY29udmVydGVkIG9yIHRha2VuIGxpdGVyYWxseS4KCiAgIC9BUy1OQU1FOnRleHQKICAgICAgICAgIEZvciBHRVQsIHRoaXMgaXMgZXF1aXZhbGVudCB0byBnaXZpbmcgYW4gYXMtbmFtZSBhZnRlciB0aGUKICAgICAgICAgIGZpbGVuYW1lLiBGb3IgTUdFVCwgdGhpcyBpcyB0aGUgb25seSB3YXkgdG8gc3BlY2lmeSBhbHRlcm5hdGl2ZQogICAgICAgICAgbmFtZXMgZm9yIHRoZSBpbmNvbWluZyBmaWxlcy4gV2l0aCBNR0VULCB0aGUgL0FTLU5BTUUgdGV4dAogICAgICAgICAgc2hvdWxkIChtdXN0KSBjb250YWluIGEgS2VybWl0IHZhcmlhYmxlLCB1c3VhbGx5IFx2KGZpbGVuYW1lKQogICAgICAgICAgb3IgXHYoZmlsZW51bWJlcikuIEV4YW1wbGU6CgogIG1nZXQgL3RleHQgL2FzLW5hbWU6XHYoZmlsZW5hbWUpLm5ldyAqLmMKCiAgICAgICAgICBUaGlzIGdldHMgYWxsICIuYyIgZmlsZXMgYW5kIHN0b3JlcyB0aGVtIHdpdGggIgoKICAgICAgICAgIC5uZXciIGFwcGVuZGVkIHRvIHRoZWlyIG5hbWVzLiBTZWUgdGhlIFszMDRdQy1LZXJtaXQgNy4wIFVwZGF0ZQogICAgICAgICAgTm90ZXMgZm9yIGRldGFpbHMuCgogICAvQ09NTUFORAogICAgICAgICAgVGhpcyBzcGVjaWZpZXMgdGhhdCB0aGUgaW5jb21pbmcgZmlsZSBpcyB0byBiZSB3cml0dGVuIHRvIHRoZQogICAgICAgICAgc3RhbmRhcmQgaW5wdXQgb2YgYSBjb21tYW5kLCByYXRoZXIgdGhhbiB0byBhIGZpbGUuIFRoZSBjb21tYW5kCiAgICAgICAgICBuYW1lIGlzIHRoZSBhcy1uYW1lIGZyb20gdGhlIEdFVCBjb21tYW5kIG9yIHRoZSAvQVMtTkFNRQogICAgICAgICAgYXJndW1lbnQuIElmIHlvdSBuZWVkIHRvIHJlZmVyIHRvIHRoZSBpbmNvbWluZyBmaWxlJ3MgbmFtZSBpbgogICAgICAgICAgdGhlIGNvbW1hbmQsIHVzZSBcdihmaWxlbmFtZSkuIFNlZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlCiAgICAgICAgICByZWd1bGFyIEtlcm1pdCBbMzA1XUdFVCAvQ09NTUFORCBjb21tYW5kIGZvciBkZXRhaWxzIGFuZAogICAgICAgICAgZXhhbXBsZXMuCgogICAvUVVJRVQKICAgICAgICAgIFRyYW5zZmVycyB0aGUgZmlsZXMgcXVpZXRseTsgZG9uJ3QgcHV0IHVwIGEgZmlsZS10cmFuc2ZlcgogICAgICAgICAgZGlzcGxheS4KCiAgIC9FUlJPUi1BQ1RJT046e1FVSVQsUFJPQ0VFRH0KICAgICAgICAgIFRoaXMgc3dpdGNoIGFmZmVjdHMgb25seSBNR0VULiBJZiBhbiBlcnJvciBvY2N1cnMgd2l0aCBhCiAgICAgICAgICBwYXJ0aWN1bGFyIGZpbGUsIHRoaXMgdGVsbHMgd2hldGhlciB0byBnbyBvbiB0byB0aGUgbmV4dCBmaWxlCiAgICAgICAgICAoUFJPQ0VFRCkgb3IgdG8gc3RvcCByaWdodCBhd2F5IGFuZCBmYWlsIChRVUlUKS4gVGhlIGRlZmF1bHQgaXMKICAgICAgICAgIFBST0NFRUQuCgogICBUaGUgZmlsZSBzZWxlY3Rpb24gc3dpdGNoZXMgYXJlOgoKICAgL0VYQ0VQVDp7cGF0dGVybn0gb3IgL0VYQ0VQVDp7e3BhdHRlcm59e3BhdHRlcm59ey4uLn19CiAgICAgICAgICBFeGNlcHRpb24gbGlzdCBmb3IgTUdFVDsgc2tpcCBkb3dubG9hZGluZyBhbnkgZmlsZSB3aG9zZSBuYW1lCiAgICAgICAgICBtYXRjaGVzIGFueSBvZiB0aGUgZ2l2ZW4gcGF0dGVybnMgKHdoZW4gdXNpbmcgdGhlIHNlY29uZAogICAgICAgICAgZm9ybWF0LCB1cCB0byA2NCBwYXR0ZXJucyBtYXkgYmUgc3BlY2lmaWVkKS4gWzMwNl1DTElDSyBIRVJFCiAgICAgICAgICBmb3Igc3ludGF4IGRldGFpbHMuCgogICAvU01BTExFUi1USEFOOm51bWJlcgogICAgICAgICAgRG93bmxvYWQgb25seSBmaWxlcyB3aG9zZSBzaXplIGlzIHNtYWxsZXIgdGhhbiB0aGUgZ2l2ZW4gbnVtYmVyCiAgICAgICAgICBvZiBieXRlcyAob2N0ZXRzKS4gUmVxdWlyZXMgdGhhdCB0aGUgRlRQIHNlcnZlciBzdXBwb3J0IHRoZQogICAgICAgICAgU0laRSBvciBNTFNEIGRpcmVjdGl2ZS4KCiAgIC9MQVJHRVItVEhBTjpudW1iZXIKICAgICAgICAgIERvd25sb2FkIG9ubHkgZmlsZXMgd2hvc2Ugc2l6ZSBpcyBncmVhdGVyIHRoYW4gdGhlIGdpdmVuIG51bWJlcgogICAgICAgICAgb2YgYnl0ZXMuIFJlcXVpcmVzIHRoYXQgdGhlIEZUUCBzZXJ2ZXIgc3VwcG9ydCB0aGUgU0laRSBvciBNTFNECiAgICAgICAgICBkaXJlY3RpdmUuCgogICAvTk9CQUNLVVBGSUxFUwogICAgICAgICAgRHVyaW5nIE1HRVQsIGRvbid0IGRvd25sb2FkIGFueSBmaWxlcyB3aG9zZSBuYW1lcyBlbmQgd2l0aAogICAgICAgICAgYmFja3VwIHN1ZmZpeGVzICgufm5+IHdoZXJlIG4gaXMgYSBudW1iZXIpLgoKICAgL05PRE9URklMRVMKICAgICAgICAgIER1cmluZyBNR0VULCBkb24ndCBkb3dubG9hZCBhbnkgZmlsZXMgd2hvc2UgbmFtZXMgYmVnaW4gd2l0aAogICAgICAgICAgcGVyaW9kICguKS4gRXF1aXZhbGVudCB0byAvRVhDRVBUOnsuKn0uCgogICAvTElTVEZJTEU6bG9jYWwtZmlsZW5hbWUKICAgICAgICAgIFRoZSBnaXZlbiBmaWxlIGNvbnRhaW5zIGEgbGlzdCBvZiBmaWxlcyB0byBHRVQsIG9uZSBwZXIgbGluZS4KICAgICAgICAgIEZpbGVuYW1lcyBpbiB0aGUgbGlzdGZpbGUgY2FuIGNvbnRhaW4gd2lsZGNhcmQgY2hhcmFjdGVycyBpbgogICAgICAgICAgdGhlIHN5bnRheCBvZiB0aGUgc2VydmVyLiBUaGVyZSBpcyBubyBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mCiAgICAgICAgICBsaW5lcyBpbiB0aGUgbGlzdGZpbGUuCgogICAvTkFNRUxJU1Q6bG9jYWwtZmlsZW5hbWUKICAgICAgICAgIElmIHRoaXMgc3dpdGNoIGlzIGdpdmVuLCB0aGVuIGluc3RlYWQgb2YgYWN0dWFsbHkgcmV0cmlldmluZwogICAgICAgICAgdGhlIHNlbGVjdGVkIGZpbGVzLCB0aGUgR0VUIGNvbW1hbmQgcmV0cmlldmVzIGEgbGlzdCBvZiB0aGUKICAgICAgICAgIG5hbWVzIG9mIHRoZSBmaWxlcyB0aGF0IHdvdWxkIGJlIHJldHJpZXZlZCwgYW5kIHBsYWNlcyBpdCBpbgogICAgICAgICAgdGhlIHNwZWNpZmVkIGZpbGUuIFRoZSByZXN1bHRpbmcgZmlsZSBpcyBhbiBvcmRpbmFyeSB0ZXh0IGZpbGUsCiAgICAgICAgICB3aXRoIG9uZSBmaWxlbmFtZSBwZXIgbGluZSwgc3VpdGFibGUgZm9yIHJlYWRpbmcgYnkgYSBwZXJzb24sCiAgICAgICAgICBvciBwcm9jZXNzaW5nIGJ5IGEgY29tcHV0ZXIgcHJvZ3JhbSwgaW5jbHVkaW5nIEtlcm1pdCBpdHNlbGYKICAgICAgICAgIChGT1BFTiAvIEZSRUFEIC8gRldSSVRFIC8gRkNMT1NFKSwgYW5kIGFzIC9GSUxFTElTVDogZmlsZS4gSWYKICAgICAgICAgIHRoZSBmaWxlbmFtZSBpcyBvbWl0dGVkIG9yIGdpdmVuIGFzICItIiAoZGFzaCwgaHlwaGVuKSwgdGhlCiAgICAgICAgICBsaXN0IGdvZXMgdG8gdGhlIHNjcmVlbi4gTk9URTogaWYgeW91IHdhbnQgYSBjb3B5IG9mIHRoZQogICAgICAgICAgY29tcGxldGUgbGlzdCBzZW50IGJ5IHRoZSBzZXJ2ZXIsIHVzZSBTRVQgRlRQIERFQlVHIE9OLCBwZXJmb3JtCiAgICAgICAgICBhbiBNR0VULCBhbmQgdGhlIHRlbXBvcmFyeSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpc3Qgd2lsbCBiZQogICAgICAgICAga2VwdCByYXRoZXIgdGhhbiBkZWxldGVkIChhbmQgS2VybWl0IHRlbGxzIHlvdSBpdHMgbmFtZSkuCgogICAvVVBEQVRFLCAvQ09MTElTSU9OOmtleXdvcmQKICAgICAgICAgIEV4cGxhaW5lZCBpbiBbMzA3XVNlY3Rpb24gMy42LjIuCgogICAvUkVDVVJTSVZFCiAgICAgICAgICBUaGlzIG1lYW5zIHRvIHRyeSB0byBkb3dubG9hZCBhbiBlbnRpcmUgZGlyZWN0b3J5IHRyZWUsIHJhdGhlcgogICAgICAgICAgdGhhbiBqdXN0IGZpbGVzIGZyb20gYSBwYXJ0aWN1bGFyIGRpcmVjdG9yeS4gSW4gZmFjdCwgRlRQCiAgICAgICAgICBwcm90b2NvbCBkb2VzIG5vdCBwcm92aWRlIGEgbWV0aG9kIHRvIHJlcXVlc3QgYSByZWN1cnNpdmUKICAgICAgICAgIGRvd25sb2FkICh1bmxlc3MgdGhlIHNlcnZlciBzdXBwb3J0cyBNTFNEOyBzZWUgWzMwOF1TZWN0aW9uCiAgICAgICAgICAzLjExKSwgc28gdGhpcyB3b3JrcyBvbmx5IGlmIHRoZSBGVFAgc2VydmVyIGRvZXMgaXQgYW55d2F5LAogICAgICAgICAgd2l0aG91dCBiZWluZyBhc2tlZCwgYXMgc29tZSBkby4gSW4gdGhpcyBjYXNlLCBLZXJtaXQgZGV0ZWN0cwogICAgICAgICAgdGhhdCBuYW1lcyBpbiB0aGUgcmV0dXJuZWQgZmlsZSBsaXN0IGNvbnRhaW4gZGlyZWN0b3J5CiAgICAgICAgICBzZXBhcmF0b3JzLCBhbmQgdGhlcmVmb3JlIGF0dGVtcHRzIHRvIGNyZWF0ZSB0aGUgbmVlZGVkCiAgICAgICAgICBkaXJlY3RvcmllcyBhcyB0aGUgZmlsZXMgYXJyaXZlLiBCdXQgdGhpcyBjYW4gd29yayBvbmx5IGlmIHRoZQogICAgICAgICAgc2VydmVyIGlzIG9uIHRoZSBzYW1lIGtpbmQgb2YgcGxhdGZvcm0gYXMgdGhlIGNsaWVudCwgc28gdGhlCiAgICAgICAgICBwYXRobmFtZSBzeW50YXggY2FuIGJlIHJlY29nbml6ZWQsIGFuZCBhbHNvIGJlY2F1c2UgdGhlIHNlcnZlcgogICAgICAgICAgZG9lcyBub3Qgc3dpdGNoIGJldHdlZW4gdGV4dCBhbmQgYmluYXJ5IG1vZGUsIHdoaWNoIHdvdWxkIGJlCiAgICAgICAgICB2aXRhbCBmb3IgY3Jvc3MtcGxhdGZvcm0gdHJhbnNmZXJzLiBVc2Ugd2l0aCBjYXV0aW9uLiBTeW5vbnltOgogICAgICAgICAgL1NVQkRJUkVDVE9SSUVTLgoKICAgICAgICAgIEV2ZW4gd2hlbiB0aGUgc2VydmVyIGRvZXMgbm90IHByb3ZpZGUgcmVjdXJzaXZlIGZpbGUgbGlzdHMsCiAgICAgICAgICBbTV1HRVQgL1JFQ1VSU0lWRSBmb3JjZXMgS2VybWl0IHRvIHJlcGxpY2F0ZSBhbnkgZGlyZWN0b3J5CiAgICAgICAgICBzdHJ1Y3R1cmUgaW1wbGllZCBvciBleHByZXNzZWQgYnkgdGhlIHNlcnZlcidzIGZpbGUgbGlzdC4gRm9yCiAgICAgICAgICBleGFtcGxlOgoKICBnZXQgc29tZXBhdGgvc29tZWZpbGUKCiAgICAgICAgICBHZXRzIHRoZSBmaWxlIG5hbWVkIHNvbWVmaWxlIGZyb20gdGhlIHNlcnZlcidzIHNvbWVwYXRoCiAgICAgICAgICBkaXJlY3RvcnkgYW5kIHB1dHMgaXQgS2VybWl0J3MgY3VycmVudCAob3IgZG93bmxvYWQpIGRpcmVjdG9yeSwKICAgICAgICAgIHdoZXJlYXM6CgogIGdldCAvcmVjdXJzaXZlIHNvbWVwYXRoL3NvbWVmaWxlCgogICAgICAgICAgY3JlYXRlcyB0aGUgcGF0aCBsb2NhbGx5IGFuZCB0aGVuIHB1dHMgdGhlIGZpbGUgaW4gaXQuCiAgICAgICAgICBTaW1pbGFybHkgZm9yIE1HRVQ6CgogIG1nZXQgKi9kYXRhLyoKCiAgICAgICAgICBkb3dubG9hZHMgYWxsIHRoZSBmaWxlcyBpbiBhbGwgdGhlIGRhdGEgc3ViZGlyZWN0b3JpZXMgb2YgYWxsCiAgICAgICAgICB0aGUgc3ViZGlyZWN0b3JpZXMgb2YgdGhlIHNlcnZlcidzIGN1cnJlbnQgZGlyZWN0b3J5IGFuZCBzdG9yZXMKICAgICAgICAgIHRoZW0gbG9jYWxseSBpbiBLZXJtaXQncyBjdXJyZW50IChvciBkb3dubG9hZCkgZGlyZWN0b3J5LAogICAgICAgICAgd2hlcmVhczoKCiAgbWdldCAvcmVjdXJzaXZlICovZGF0YS8qCgogICAgICAgICAgcmUtY3JlYXRlcyB0aGUgc2VydmVyJ3MgZGlyZWN0b3J5IHN0cnVjdHVyZSBsb2NhbGx5LgoKICAgVGhlIEZUUCBwcm90b2NvbCBkb2VzIG5vdCBpbmNsdWRlIGV4cGxpY2l0IG1lY2hhbmlzbXMgZm9yIHJlY3Vyc2lvbiwKICAgc28gS2VybWl0IGJ1aWxkcyB1cG9uIHdoYXQgaXMgYXZhaWxhYmxlLiBBbHRob3VnaCBhbiBJbnRlcm5ldCBkcmFmdAogICBkZXNjcmliZXMgYSBtZWNoYW5pc20gKCJNTFNEIikgdGhhdCB3b3VsZCBhbGxvdyBwcm90b2NvbC1kcml2ZW4KICAgcmVjdXJzaW9uLCBzaW1pbGFyIHRvIEtlcm1pdCdzIEZpbGUgQXR0cmlidXRlIHBhY2tldHMgKGNpcmNhIDE5ODQpLCBpdAogICBoYXMgbm90IHlldCBhdHRhaW5lZCBSRkMgb3Igc3RhbmRhcmQgc3RhdHVzLCBhbmQgc2VydmVycyBhcmUgbm90IHlldAogICB3aWRlbHkgYXZhaWxhYmxlIHRoYXQgb2ZmZXIgdGhpcyBmZWF0dXJlLiBJbiB0aGUgbWVhbnRpbWUsIHRoZQogICBlZmZlY3RpdmVuZXNzIG9mIE1HRVQgL1JFQ1VSU0lWRSBkZXBlbmRzIG9uIHRoZSBGVFAgc2VydmVyCiAgIGltcGxlbWVudGF0aW9uLiBJZiB0aGUgc2VydmVyIHJldHVybnMgYSByZWN1cnNpdmUgbGlzdCBpbiByZXNwb25zZSB0bwogICB0aGUgc3RhbmRhcmQgTkxTVCBjb21tYW5kICh3aG9zZSBiZWhhdmlvciBpcyBpbGwtZGVmaW5lZCksIEtlcm1pdCdzCiAgIEZUUCBNR0VUIC9SRUNVUlNJVkUgY29tbWFuZCB1c2VzIGl0IHRvIHJlLWNyZWF0ZSB0aGUgcmVtb3RlIGRpcmVjdG9yeQogICB0cmVlIGxvY2FsbHkuIElmIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgTUxTRCwgQy1LZXJtaXQgOC4wLjIwNiBhbmQgS2VybWl0CiAgIDk1IDIuMSBhbmQgbGF0ZXIgYXJlIGFibGUgdG8gc2Vuc2UgaXQgYXV0b21hdGljYWxseSBhbmQgdXNlIGl0LCBhcwogICBkZXNjcmliZWQgYmVsb3cgaW4gWzMwOV1TZWN0aW9uIDMuMTEuCgogICBUaGUgL0JFRk9SRTosIC9BRlRFUjosIC9OT1QtQkVGT1JFOiwgYW5kIC9OT1QtQUZURVI6IHN3aXRjaGVzIGFyZSBub3QKICAgYXZhaWxhYmxlIGZvciBkb3dubG9hZGluZyBiZWNhdXNlIG9mIHRoZSBjb25mdXNpb24gd2l0aCB0aW1lem9uZXMuCiAgIFdvdWxkIHRoZSBnaXZlbiB0aW1lcyBiZSBpbiB0aGUgbG9jYWwgdGltZXpvbmUsIHRoZSBzZXJ2ZXIncyB0aW1lem9uZSwKICAgb3IgR01UPyBUaGUgRlRQIHNlcnZlcidzIGRpcmVjdG9yeSBsaXN0aW5ncyBzaG93IGl0cyBvd24gbG9jYWwgdGltZXMKICAgYnV0IHNpbmNlIHdlIGRvbid0IGtub3cgd2hhdCB0aW1lem9uZSB0aGUgc2VydmVyIGlzIGluLCB0aGVyZSdzIG5vIHdheQogICB0byByZWNvbmNpbGUgb3VyIGxvY2FsIHRpbWVzIHdpdGggdGhlIHNlcnZlcidzLiBTaW1pbGFybHksCiAgIC9QRVJNSVNTSU9OUyBjYW4ndCBiZSBwcmVzZXJ2ZWQgaW4gZG93bmxvYWRzIGJlY2F1c2UgRlRQIHByb3RvY29sCiAgIHByb3ZpZGVzIG5vIG1lYW5zIG9mIHF1ZXJ5aW5nIHRoZSBzZXJ2ZXIgZm9yIGEgZmlsZSdzIHBlcm1pc3Npb24uCgogICBTb3VyY2UtZmlsZSBkaXNwb3NpdGlvbiBzd2l0Y2hlczoKCiAgIC9ERUxFVEUKICAgICAgICAgIEVhY2ggZmlsZSB0aGF0IGlzIGRvd25sb2FkZWQgc3VjY2Vzc2Z1bGx5IGlzIHRvIGJlIGRlbGV0ZWQgZnJvbQogICAgICAgICAgdGhlIHNlcnZlci4gUmVxdWlyZXMgdGhlIGFwcHJvcHJpYXRlIGZpbGUgYWNjZXNzIHJpZ2h0cyBvbiB0aGUKICAgICAgICAgIHNlcnZlci4KCiAgIC9TRVJWRVItUkVOQU1FLVRPOnRlbXBsYXRlCiAgICAgICAgICBBc2tzIHRoZSBzZXJ2ZXIgdG8gcmVuYW1lIGVhY2ggKHJlbW90ZSkgc291cmNlIGZpbGUgaW1tZWRpYXRlbHkKICAgICAgICAgIGFmdGVyLCBhbmQgb25seSBpZiwgaXQgaXMgc2VudCBjb3JyZWN0bHkuIFNlZSBbMzEwXVBVVAogICAgICAgICAgL1NFUlZFUi1SRU5BTUUtVE86IGZvciBkZXRhaWxzLgoKICAgRGVzdGluYXRpb24tZmlsZSBkaXNwb3NpdGlvbiBzd2l0Y2hlczoKCiAgIC9UTy1TQ1JFRU4KICAgICAgICAgIERpc3BsYXlzIHRoZSBpbmNvbWluZyBmaWxlIG9uIHRoZSBzY3JlZW4gcmF0aGVyIHRoYW4gc3RvcmluZyBpdAogICAgICAgICAgb24gZGlzay4gSWYgdGhpcyBzd2l0Y2ggaXMgZ2l2ZW4sIHRoZSAvUkVOQU1FLVRPIGFuZCAvTU9WRS1UTwogICAgICAgICAgc3dpdGNoZXMgYXJlIGlnbm9yZWQsIHRoZSBmaWxlLXRyYW5zZmVyIGRpc3BsYXkgaXMgc3VwcHJlc3NlZCwKICAgICAgICAgIGFuZCB0aGUgZ2l2ZW4gZmlsZShzKSBpcy9hcmUgc2hvd24gb24gdGhlIHNjcmVlbi4gQ2FuIGJlIHVzZWQKICAgICAgICAgIHdpdGggL0ZJTFRFUiwgZS5nLgoKICBnZXQgL3RleHQgL3RvLXNjcmVlbiAvZmlsdGVyOm1vcmUgb29mYS50eHQKCiAgICAgICAgICBJbiBmYWN0LCB5b3Ugc2hvdWxkIGFsd2F5cyB1c2UgL1RPLVNDUkVFTiB3aXRoIC9GSUxURVIgb3IKICAgICAgICAgIC9DT01NQU5EIHdoZW4gdGhlIGNvbW1hbmQgd291bGQgcmVzdWx0IGluIGRpc3BsYXlpbmcgdGhlCiAgICAgICAgICBpbmNvbWluZyBmaWxlIG9uIHRoZSBzY3JlZW47IG90aGVyd2lzZSBDLUtlcm1pdCB3b3VsZCBoYXZlIG5vCiAgICAgICAgICB3YXkgb2Yga25vd2luZyB0byBzdXBwcmVzcyBpdHMgZmlsZSB0cmFuc2ZlciBkaXNwbGF5IChzaW5jZSBpdAogICAgICAgICAgY2FuJ3QgYmUgZXhwZWN0ZWQgdG8ga25vdyB3aGF0IHRoZSBjb21tYW5kIG9yIGZpbHRlciBkb2VzKS4KCiAgIC9SRU5BTUUtVE86dGVtcGxhdGUKICAgICAgICAgIEVhY2ggZmlsZSB0aGF0IGlzIGRvd25sb2FkZWQgaXMgdG8gYmUgcmVuYW1lZCBhcyBpbmRpY2F0ZWQgaWYKICAgICAgICAgIGFuZCBvbmx5IGlmIGl0IHdhcyByZWNlaXZlZCBjb21wbGV0ZWx5IGFuZCB3aXRob3V0IGVycm9yLiBUaGUKICAgICAgICAgIHRlbXBsYXRlIGNhbiBiZSBsaXRlcmFsIHRleHQgb3IgY2FuIGNvbnRhaW4gdmFyaWFibGVzIHRoYXQgYXJlCiAgICAgICAgICBldmFsdWF0ZWQgZm9yIGVhY2ggZmlsZS4gRm9yIE1HRVQsIHRoZSB0ZXh0IG11c3QgY29udGFpbgogICAgICAgICAgdmFyaWFibGVzOyBmb3IgR0VUIGl0IGNhbiBiZSBhIGxpdGVyYWwgc3RyaW5nLiBUaGUgXHYoZmlsZW5hbWUpCiAgICAgICAgICB2YXJpYWJsZSBjb250YWlucyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBmaWxlLCBzbzoKCiAgZnRwIG1nZXQgL3JlbmFtZS10bzpcdihmaWxlbmFtZSkub2sgKgoKICAgICAgICAgIGNhdXNlcyBlYWNoIGZpbGUgdGhhdCBpcyBzdWNjZXNzZnVsbHkgZG93bmxvYWRlZCB0byBoYXZlICIub2siCiAgICAgICAgICBhcHBlbmRlZCB0byBpdHMgbmFtZS4gRm9yIGRldGFpbHMgc2VlIFszMTFdU2VjdGlvbiA0LjEgb2YgdGhlCiAgICAgICAgICBbMzEyXUMtS2VybWl0IDcuMCBVcGRhdGUgTm90ZXMuCgogICAvTU9WRS1UTzp0ZXh0CiAgICAgICAgICBKdXN0IGxpa2UgL1JFTkFNRS1UTzosIGV4Y2VwdCB0aGUgdGV4dCBkZW5vdGVzIHRoZSBuYW1lIG9mIGEKICAgICAgICAgIGRpcmVjdG9yeSB0byB3aGljaCBzdWNjZXNzZnVsbHkgZG93bmxvYWRlZCBmaWxlcyBhcmUgdG8gYmUKICAgICAgICAgIG1vdmVkLiBJZiB0aGUgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LCBpdCBpcyBjcmVhdGVkLgoKICAgVGhlIGZpbGUgdHJhbnNmZXIgZGlzcGxheSBkb2VzIG5vdCBzaG93IHRoZSAvTU9WRS1UTyBvciAvUkVOQU1FLVRPCiAgIHZhbHVlLCBzaW5jZSB0aGUgaW5jb21pbmcgZmlsZSBoYXMgbm90IHlldCBiZWVuIG1vdmVkIG9yIHJlbmFtZWQuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICAzLjYuMi4gRmlsZW5hbWUgQ29sbGlzaW9ucwoKICAgV2hhdCBzaG91bGQgaGFwcGVuIGlmIGFuIGluY29taW5nIGZpbGUgaGFzIHRoZSBzYW1lIG5hbWUgYXMgYW4KICAgZXhpc3RpbmcgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3Rvcnk/IEJ5IGRlZmF1bHQsIEtlcm1pdCdzIEZJTEUKICAgQ09MTElTSU9OIHNldHRpbmcgYXBwbGllczogQkFDS1VQLCBSRU5BTUUsIFVQREFURSwgRElTQ0FSRCwgZXRjLCBhcwogICBkZXNjcmliZWQgaW4gWzMxM11Vc2luZyBDLUtlcm1pdC4gS2VybWl0J3MgZGVmYXVsdCBGSUxFIENPTExJU0lPTgogICBzZXR0aW5nIGlzIEJBQ0tVUCAocmVuYW1lIHRoZSBleGlzdGluZyBmaWxlIGFuZCBzdG9yZSB0aGUgaW5jb21pbmcKICAgZmlsZSB1bmRlciBpdHMgb3duIG5hbWUpIGFuZCB0aGVyZWZvcmUgdGhpcyBpcyBhbHNvIHRoZSBkZWZhdWx0IEZUUAogICBjb2xsaXNpb24gYWN0aW9uLgoKICAgVGhlIG5hbWUgdW5kZXIgd2hpY2ggYW4gaW5jb21pbmcgZmlsZSBpcyB0byBiZSBzdG9yZWQgaXMgZGV0ZXJtaW5lZCBhcwogICBmb2xsb3dzOgoKICAgICAqIElmIGFuIGFzLW5hbWUgd2FzIGdpdmVuLCB0aGUgYXMtbmFtZSBpcyB1c2VkLiBPdGhlcndpc2U6CiAgICAgKiBJZiB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgcGxhdGZvcm1zIGFyZSBhbGlrZSBvciBbMzE0XUZUUCBGSUxFTkFNRVMKICAgICAgIGlzIHNldCB0byBMSVRFUkFMIChvciB0aGUgL0ZJTEVOQU1FUzpMSVRFUkFMIHN3aXRjaCB3YXMgZ2l2ZW4gZm9yCiAgICAgICB0aGlzIGRvd25sb2FkKSwgdGhlIGluY29taW5nIGZpbGVuYW1lIGlzIHVzZWQgbGl0ZXJhbGx5LgogICAgICAgT3RoZXJ3aXNlOgogICAgICogVGhlIGluY29taW5nIGZpbGVuYW1lIGlzIGNvbnZlcnRlZCB0byBhIGZvcm0gdGhhdCBpcyBmcmllbmRseSB0bwogICAgICAgdGhlIGxvY2FsIHBsYXRmb3JtLiBGb3IgVU5JWCwgZm9yIGV4YW1wbGUsIGluY29taW5nIGZpbGVuYW1lcyB0aGF0CiAgICAgICBhcmUgYWxsIHVwcGVyY2FzZSAoYXMgdGhleSBtaWdodCBiZSBmcm9tLCBzYXksIFZNUyBvciBhbiBJQk0KICAgICAgIG1haW5mcmFtZSkgYXJlIGNvbnZlcnRlZCB0byBsb3dlcmNhc2UuCgogICBJZiB0aGUgcmVzdWx0aW5nIG5hbWUgY29pbmNpZGVzIHdpdGggdGhlIG5hbWUgb2YgYSBsb2NhbCBmaWxlIHRoYXQKICAgYWxyZWFkeSBleGlzdHMsIHdlIGhhdmUgYSBmaWxlbmFtZSBjb2xsaXNpb24uIENvbGxpc2lvbnMgYXJlIGhhbmRsZWQKICAgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgY29sbGlzaW9uIGFjdGlvbjoKCiAgIFNFVCBGVFAgQ09MTElTSU9OIHsgQkFDS1VQLCBSRU5BTUUsIFVQREFURSwgRElTQ0FSRCwgQVBQRU5ELCBPVkVSV1JJVEUKICAgICAgICAgIH0KICAgICAgICAgIFRoaXMgZXN0YWJsaXNoZXMgYSBmaWxlbmFtZSBjb2xsaXNpb24gZm9yIEZUUCwgc2VwYXJhdGUgZnJvbQogICAgICAgICAgdGhlIEtlcm1pdCBvbmUuIFRoZSBpbml0aWFsIEZUUCBjb2xsaXNpb24gc2V0dGluZyBpcyBpbmhlcml0ZWQKICAgICAgICAgIGZyb20gS2VybWl0J3MgRklMRSBDT0xMSVNJT04gc2V0dGluZyB3aGVuIHRoZSBmaXJzdCBGVFAgY29tbWFuZAogICAgICAgICAgaXMgZ2l2ZW4sIGJ1dCBzdWJzZXF1ZW50IGNoYW5nZXMgdG8gS2VybWl0J3MgRklMRSBDT0xMSVNJT04KICAgICAgICAgIHNldHRpbmcgZG8gbm90IGFmZmVjdCB0aGUgRlRQIENPTExJU0lPTiBzZXR0aW5nLiBTSE9XIEZUUCB0ZWxscwogICAgICAgICAgdGhlIGN1cnJlbnQgRlRQIENPTExJU0lPTiBzZXR0aW5nLgoKICAgRlRQIEdFVCAvQ09MTElTSU9OOntCQUNLVVAsUkVOQU1FLFVQREFURSxESVNDQVJELEFQUEVORCxPVkVSV1JJVEV9CiAgICAgICAgICBPdmVycmlkZXMgdGhlIGN1cnJlbnQgRlRQIENPTExJU0lPTiBhY3Rpb24gZm9yIHRoaXMgZG93bmxvYWQKICAgICAgICAgIG9ubHkuCgogICBGVFAgR0VUIC9VUERBVEUKICAgICAgICAgIFRoaXMgaXMgZXF1aXZhbGVudCB0byBHRVQgL0NPTExJU0lPTjpVUERBVEUsIGFuZCBpcyBpbmNsdWRlZAogICAgICAgICAgZm9yIHN5bW1ldHJ5IHdpdGggUFVUIC9VUERBVEUKCiAgIEZUUCBHRVQgL1VQREFURSBhbmQgL0NPTExJU0lPTjpVUERBVEUgbWVhbiB0byBkb3dubG9hZCBvbmx5IHRob3NlCiAgIGZpbGVzIHdob3NlIG1vZGlmaWNhdGlvbiBkYXRlcyBvbiB0aGUgc2VydmVyIGFyZSBsYXRlciB0aGFuIHRob3NlIG9uCiAgIHRoZSBjbGllbnQuIERhdGUtdGltZSBjb21wYXJpc29ucyBhcmUgZG9uZSBpbiBDb29yZGluYXRlZCBVbml2ZXJzYWwKICAgVGltZSAoVVRDLCBHTVQsIFpVTFUpLiBUaGUgY29tbWFuZDoKCiAgICAgRlRQIE1HRVQgL0NPTExJU0lPTjpBUFBFTkQgL0FTLU5BTUU6bmV3ZmlsZW5hbWUgKi4qCgogICBEb3dubG9hZHMgYWxsIG1hdGNoaW5nIHJlbW90ZSBmaWxlcyBpbnRvIGEgc2luZ2xlIGxvY2FsIGZpbGUgKGluCiAgIHdoYXRldmVyIG9yZGVyIHRoZSBzZXJ2ZXIgc2VuZHMgdGhlbSkuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICAzLjYuMy4gUmVjb3ZlcnkKCiAgIFJlY292ZXJ5IGlzIGF2YWlsYWJsZSBmb3IgZG93bmxvYWRzIHRvbywgYnV0IHRoZXJlIGFyZSBzb21lCiAgIGRpZmZlcmVuY2VzIGZyb20gdGhlIHVwbG9hZGluZyBjYXNlIGRlc2NyaWJlZCBpbiBbMzE1XVNlY3Rpb24gMy41LjM6CgogICAgICogVGhlIHRyYW5zZmVyIG11c3QgYmUgaW4gQklOQVJZIG1vZGUuIEl0IGNhbiBub3QgYmUgaW4gdGV4dCBtb2RlLAogICAgICAgZXZlbiBpZiB0aGUgRlRQIHNlcnZlciBpcyBvbiB0aGUgc2FtZSBraW5kIG9mIHBsYXRmb3JtIGFzIEtlcm1pdCwKICAgICAgIGFuZCBldmVuIGlmIHRoZXJlIGlzIG5vIGNoYXJhY3Rlci1zZXQgdHJhbnNsYXRpb24uIFRoZSBvcmlnaW5hbAogICAgICAgZG93bmxvYWQgbXVzdCBhbHNvIGhhdmUgYmVlbiBpbiBiaW5hcnkgbW9kZS4KICAgICAqIFRoZSBGVFAgc2VydmVyIG11c3Qgc3VwcG9ydCB0aGUgUkVTVCAoInJlc3RhcnQiKSBkaXJlY3RpdmUuCiAgICAgICBVbmZvcnR1bmF0ZWx5LCB0aGlzIGlzIG5vdCBhIHN0YW5kYXJkIGNvbW1hbmQ7IGF0IHRoaXMgd3JpdGluZywgaXQKICAgICAgIGlzIGRlc2NyaWJlZCBvbmx5IGluIGFuIEludGVybmV0IERyYWZ0LCBub3QgYW4gUkZDIG9yIEludGVybmV0CiAgICAgICBTdGFuZGFyZCwgYnV0IG5ldmVydGhlbGVzcyBpdCBpcyBmb3VuZCBpbiBzZXZlcmFsIHBvcHVsYXIgRlRQCiAgICAgICBzZXJ2ZXJzLCBzdWNoIGFzIFszMTZdUHJvRlRQRC4KCiAgIEhlcmUncyBob3cgZG93bmxvYWQgcmVjb3Zlcnkgd29ya3M6CgogICAgICogS2VybWl0IGNoZWNrcyBmb3IgY29uZmxpY3Rpbmcgc3dpdGNoZXMsIHN1Y2ggYXMgL1VQREFURSwgL0NPTU1BTkQsCiAgICAgICBvciAvRklMVEVSLiBJZiAvUkVDT1ZFUiBpcyBnaXZlbiB3aXRoIHRoZXNlIHN3aXRjaGVzIGFuIGVycm9yCiAgICAgICBvY2N1cnMuCiAgICAgKiBUaGUgcHJldmFpbGluZyB0cmFuc2ZlciBtb2RlIChTRVQgRlRQIFRZUEUpIG11c3QgYmUgQklOQVJZLiBJZiBpdAogICAgICAgaXMgbm90LCB0aGUgL0JJTkFSWSBzd2l0Y2ggbXVzdCBoYXZlIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGUgRlRQCiAgICAgICBbTV1HRVQgY29tbWFuZC4KCiAgIElmIHRoZSAvUkVDT1ZFUiBzd2l0Y2ggaXMgYWNjZXB0ZWQsIHRoZW4gZm9yIGVhY2ggc2VsZWN0ZWQgZmlsZToKCiAgICAgKiBBIFNJWkUgY29tbWFuZCBpcyBzZW50IGZvciB0aGUgZmlsZSAodXNpbmcgaXRzIHJlbW90ZSBuYW1lKS4gSWYKICAgICAgIHRoZSByZXBseSBpbmRpY2F0ZXMgdGhlIGZpbGUgd2FzIG5vdCBmb3VuZCwgb3IgdGhlIFNJWkUgY29tbWFuZAogICAgICAgd2FzIG5vdCB1bmRlcnN0b29kLCBvciBhbnkgb3RoZXIga2luZCBvZiBlcnJvciwgcmVjb3ZlcnkgaXMKICAgICAgIGNhbmNlbGVkIChpLmUuIHRoZSBlbnRpcmUgZmlsZSBpcyBkb3dubG9hZGVkKS4KICAgICAqIElmIHRoZSBzaXplcyBvZiB0aGUgdHdvIGZpbGVzIGFyZSBpZGVudGljYWwsIHRoZSBmaWxlIGlzIG5vdCBzZW50LgogICAgICAgT3RoZXJ3aXNlOgogICAgICogS2VybWl0IHNlbmRzIHRoZSBSRVNUIGRpcmVjdGl2ZSB0byB0aGUgc2VydmVyLCBpbmRpY2F0aW5nIHRoZSBzaXplCiAgICAgICBvZiB0aGUgbG9jYWwgZmlsZS4gSWYgdGhlIHNlcnZlciByZXNwb25kcyBhZmZpcm1hdGl2ZWx5LCBLZXJtaXQKICAgICAgIG9wZW5zIHRoZSBsb2NhbCBmaWxlIGluIGFwcGVuZCBtb2RlIGFuZCBhcHBlbmRzIHRoZSBpbmNvbWluZyBkYXRhCiAgICAgICB0byBpdC4gT3RoZXJ3aXNlLCByZWNvdmVyeSBpcyBjYW5jZWxlZCBhbmQgdGhlIGVudGlyZSBmaWxlIGlzCiAgICAgICBkb3dubG9hZGVkLgoKICAgVGhlIC9SRUNPVkVSIHN3aXRjaCBjYW4gYmUgaW5jbHVkZWQgd2l0aCBhbnkgRlRQIEdFVCBvciBNR0VUIGNvbW1hbmQsCiAgIGV2ZW4gaWYgaXQgc3BlY2lmaWVzIGEgZ3JvdXAgb2YgZmlsZXMuIFRoaXMgbGV0cyB5b3UgcmVzdW1lIGFuCiAgIGludGVycnVwdGVkIGJhdGNoIHRyYW5zZmVyIGZyb20gd2hlcmUgaXQgbGVmdCBvZmYuIFRoZSBmaWxlcyB0aGF0IHdlcmUKICAgYWxyZWFkeSBjb21wbGV0ZWx5IHNlbnQgYXJlIHNraXBwZWQsIHRoZSBmaWxlIHRoYXQgd2FzIGludGVycnVwdGVkIGlzCiAgIHJlY292ZXJlZCwgYW5kIHRoZSByZW1haW5pbmcgZmlsZXMgYXJlIHVwbG9hZGVkLiBCVVQuLi4gdW5saWtlIHdpdGgKICAgdXBsb2FkaW5nLCB3aGVyZSB0aGlzIGNhbiBiZSBkb25lIHdpdGggYW55IG1peHR1cmUgb2YgdGV4dCBhbmQgYmluYXJ5CiAgIGZpbGVzLCB3aGVuIGRvd25sb2FkaW5nLCBpdCBjYW4gb25seSBiZSBkb25lIGlmIGFsbCB0aGUgZmlsZXMgYXJlCiAgIGJpbmFyeS4KCiAgIEl0IGRvZXNuJ3QgbWF0dGVyIGhvdyB0aGUgb3JpZ2luYWwgcGFydGlhbCBmaWxlIHdhcyBkb3dubG9hZGVkIC0tIEZUUCwKICAgS2VybWl0LCBIVFRQLCBabW9kZW0sIGV0YzogYXMgbG9uZyBhcyB0aGUgcHJlY29uZGl0aW9ucyBhcmUgbWV0LCBpdAogICBjYW4gYmUgcmVjb3ZlcmVkIHdpdGggRlRQIFtNXUdFVCAvUkVDT1ZFUiwgb3IgZm9yIHRoYXQgbWF0dGVyIGFsc28KICAgd2l0aCBHRVQgL1JFQ09WRVIgKHVzaW5nIEtlcm1pdCBwcm90b2NvbCkuCgogICBbIFszMTddVG9wIF0gWyBbMzE4XUZUUCBUb3AgXSBbIFszMTldQy1LZXJtaXQgSG9tZSBdIFsgWzMyMF1LZXJtaXQKICAgSG9tZSBdCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgMy43LiBUcmFuc2xhdGluZyBDaGFyYWN0ZXIgU2V0cwoKICAgQSBwb3NzaWJseSB1bmlxdWUgZmVhdHVyZSBvZiBLZXJtaXQncyBGVFAgY2xpZW50IGlzIGl0cyBhYmlsaXR5IHRvCiAgIGNvbnZlcnQgY2hhcmFjdGVyIHNldHMgd2hlbiB0cmFuc2ZlcnJpbmcgZmlsZXMgaW4gdGV4dCBtb2RlLAogICBpbmRlcGVuZGVudCBvZiB0aGUgY2FwYWJpbGl0ZXMgb2YgdGhlIEZUUCBzZXJ2ZXIsIGFzIHdlbGwgYXMgdG8KICAgdHJhbnNsYXRlIHRoZSBjaGFyYWN0ZXIgc2V0cyBvZiBmaWxlbmFtZXMgcmVnYXJkbGVzcyBvZiB0cmFuc2ZlciBtb2RlLgogICBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIEZUUCBjbGllbnRzLCBhbmQgYmVjYXVzZSB0aGVyZSBpcyBhCiAgIGNlcnRhaW4gcGVyZm9ybWFuY2UgcGVuYWx0eSwgS2VybWl0IHdvbid0IGRvIHRoaXMgdW5sZXNzIHlvdSBhc2sgZm9yCiAgIGl0LiBJZiB5b3UgZW5hYmxlIHRoaXMgZmVhdHVyZSwgeW91IG5lZWQgdG8gaW5mb3JtIEtlcm1pdCBvZiB0aGUKICAgY2hhcmFjdGVyIHNldCAodG8gYmUpIHVzZWQgb24gdGhlIHNlcnZlciBhbmQgaW4gc29tZSBjYXNlcyAoZXhwbGFpbmVkCiAgIGJlbG93KSBhbHNvIHRoZSBsb2NhbCBmaWxlIGNoYXJhY3RlciBzZXQuIFRoaXMgZGlzY3Vzc2lvbiBhc3N1bWVzIHlvdQogICBrbm93IGEgYml0IGFib3V0IGNoYXJhY3RlciBzZXRzIChhcyB5b3UgbXVzdCBpZiB5b3UgaGF2ZSB0byB1c2UgdGhlbSk7CiAgIHNlZSBDaGFwdGVyIDE2IG9mIFszMjFdVXNpbmcgQy1LZXJtaXQgZm9yIGEgZGV0YWlsZWQgdHJlYXRtZW50LiBUaGUKICAgS2VybWl0IGNvbW1hbmRzIGZvciBGVFAgY2hhcmFjdGVyLXNldCBjb252ZXJzaW9uIGFyZToKCiAgIFNFVCBGVFAgQ0hBUkFDVEVSLVNFVC1UUkFOU0xBVElPTiB7IE9OLCBPRkYgfQogICAgICAgICAgV2hldGhlciB0byB0cmFuc2xhdGUgY2hhcmFjdGVyIHNldHMgd2hlbiB0cmFuc2ZlcnJpbmcgdGV4dAogICAgICAgICAgZmlsZXMgd2l0aCBGVFAuIE9GRiBieSBkZWZhdWx0LiBTZXQgdGhpcyB0byBPTiB0byBlbmFibGUKICAgICAgICAgIGNoYXJhY3Rlci1zZXQgdHJhbnNsYXRpb24gZm9yIHN1YnNlcXVlbnQgRlRQIHVwbG9hZHMgYW5kCiAgICAgICAgICBkb3dubG9hZHMuCgogICBTRVQgRlRQIFNFUlZFUi1DSEFSQUNURVItU0VUIFszMjJdbmFtZQogICAgICAgICAgVGV4dCBjaGFyYWN0ZXIgc2V0ICh0byBiZSkgdXNlZCBieSB0aGUgc2VydmVyLiBNb3N0IEZUUCBzZXJ2ZXJzCiAgICAgICAgICBhcmUgaWdub3JhbnQgb2YgY2hhcmFjdGVyIHNldHMsIHNvIGFsbCB0cmFuc2xhdGlvbnMgYXJlIGRvbmUKICAgICAgICAgIHVuaWxhdGVyYWxseSBieSBLZXJtaXQncyBGVFAgY2xpZW50LiBUaGlzIG1lYW5zIHRoYXQgd2hlbgogICAgICAgICAgZG93bmxvYWRpbmcgZmlsZXMsIHlvdSBtdXN0IGtub3cgaW4gYWR2YW5jZSB0aGUgY2hhcmFjdGVyLXNldAogICAgICAgICAgdXNlZCBpbiB0aGUgZmlsZXMgeW91IGFyZSBkb3dubG9hZGluZyAoYW5kIGluIHRoZWlyIG5hbWVzKS4KICAgICAgICAgIFdoZW4gdXBsb2FkaW5nLCB5b3UgbXVzdCBzcGVjaWZ5IHRoZSBjaGFyYWN0ZXItc2V0IHRvIHdoaWNoCiAgICAgICAgICBsb2NhbCBmaWxlbmFtZXMgYW5kIHRleHQtZmlsZSBjb250ZW50cyBhcmUgdG8gYmUgdHJhbnNsYXRlZCBmb3IKICAgICAgICAgIHRyYW5zbWlzc2lvbiB0byB0aGUgc2VydmVyLiBJZiB5b3UgU0VUIEZUUAogICAgICAgICAgQ0hBUkFDVEVSLVNFVC1UUkFOU0xBVElPTiBPTiBidXQgZG8gbm90IHNwZWNpZnkgYW4gRlRQCiAgICAgICAgICBTRVJWRVItQ0hBUkFDVEVSLVNFVCwgWzMyM11VVEY4IGlzIHVzZWQsIHNpbmNlIHRoaXMgaXMgdGhlIG5ldwogICAgICAgICAgSW50ZXJuZXQgc3RhbmRhcmQgaW50ZXJuYXRpb25hbCBjaGFyYWN0ZXIgc2V0OyBpdCBpcyB1cHdhcmRzCiAgICAgICAgICBjb21wYXRpYmxlIHdpdGggQVNDSUkgYW5kIGl0IGVuY29tcGFzc2VzIG1vc3Qgd3JpdHRlbiBsYW5ndWFnZXMKICAgICAgICAgIGFuZCB0aGVyZWZvcmUgZG9lcyBub3QgZmF2b3IgYW55IHBhcnRpY3VsYXIgZ3JvdXAgb2YgcGVvcGxlLCBhcwogICAgICAgICAgYW55IG90aGVyIGRlZmF1bHQgd291bGQgZG8uIElmIHlvdSBTRVQgRlRQIFNFUlZFUi1DSEFSQUNURVItU0VUCiAgICAgICAgICB0byBzb21ldGhpbmcgKGFueXRoaW5nKSB3aGVuIEZUUCBDSEFSQUNURVItU0VUIFRSQU5TTEFUSU9OIGlzCiAgICAgICAgICBPRkYsIHRoaXMgYWxzbyBzZXRzIHRoZSBsYXR0ZXIgT04uCgogICBTRVQgRklMRSBDSEFSQUNURVItU0VUIFszMjRdbmFtZQogICAgICAgICAgVGhpcyBpcyB0aGUgcmVndWxhciBLZXJtaXQgKG5vbi1GVFAtc3BlY2lmaWMpIGNvbW1hbmQgZm9yCiAgICAgICAgICBpZGVudGlmeWluZyB0aGUgY2hhcmFjdGVyIHNldCAodG8gYmUpIHVzZWQgaW4gbG9jYWwgdGV4dCBmaWxlcwogICAgICAgICAgYW5kIGZpbGVuYW1lcy4KCiAgIFRPIFJFSVRFUkFURTogSWYgeW91IFNFVCBGVFAgQ0hBUkFDVEVSLVNFVCBUUkFOU0xBVElPTiBPTiBidXQgZG8gbm90CiAgIHNwZWNpZnkgYW4gRlRQIFNFUlZFUi1DSEFSQUNURVItU0VULCBvdXRib3VuZCB0ZXh0IGZpbGVzIGFyZSBjb252ZXJ0ZWQKICAgdG8gVVRGLTggYW5kIGluYm91bmQgdGV4dCBmaWxlcyBhcmUgYXNzdW1lZCB0byBiZSBVVEYtOC4gSWYgdGhpcyBpcwogICBub3QgYXBwcm9wcmlhdGUsIGJlIHN1cmUgdG8gYWxzbyBzcGVjaWZ5IHRoZSBkZXNpcmVkIEZUUAogICBTRVJWRVItQ0hBUkFDVEVSLVNFVC4KCiAgIFlvdSBjYW4gdXNlICJzcGVjaWFsIiAobm9uLUFTQ0lJKSBjaGFyYWN0ZXJzIGluIGZpbGVuYW1lcyBpbiBhbGwgdGhlCiAgIGNsaWVudCAvIHNlcnZlciBmaWxlIG1hbmFnZW1lbnQgY29tbWFuZHMgKEZUUCBNS0RJUiwgUk1ESVIsIERJUkVDVE9SWSwKICAgVkRJUkVDVE9SWSwgREVMRVRFLCBldGMpLCBhbmQgYWxzbyBpbiBmaWxlLXRyYW5zZmVyIGNvbW1hbmRzLiBXaGVuCiAgIGdpdmluZyBjb21tYW5kcyBzdWNoIGFzIEZUUCBESVIgKFJESVIpIGFuZCBGVFAgUFdEIChSUFdEKSwgdGhlIHJlcGx5CiAgIGlzIHRyYW5zbGF0ZWQgdG9vLCBzbyB5b3UgY2FuIHJlYWQgaXQuIEluIHRoaXMgZXhhbXBsZSwgdGhlIGNsaWVudCBhbmQKICAgc2VydmVyIHVzZSBlbnRpcmVseSBkaWZmZXJlbnQgY29kZXMgdG8gcmVwcmVzZW50IHRoZSBzcGVjaWFsCiAgIGNoYXJhY3RlcnMgb2YgR2VybWFuOgoKICBDLUtlcm1pdD4gZnRwIHh5emNvcnAuZGUgL2Fub255bW91cwogIEMtS2VybWl0PiBzZXQgZnRwIHNlcnZlci1jaGFyYWN0ZXItc2V0IGxhdGluMQogIEMtS2VybWl0PiBzZXQgZmlsZSBjaGFyYWN0ZXItc2V0IGdlcm1hbgogIEMtS2VybWl0PiByY2QgU3TkZHRlCiAgQy1LZXJtaXQ+IHJwd2QKICAiL3B1Yi9mdHAvU3TkZHRlIGlzIGN1cnJlbnQgZGlyZWN0b3J5IgogIEMtS2VybWl0PiByZGlyCiAgLXJ3LXJ3LS0tLSAgMSBvbGFmICAgICA1NDAxOCBKYW4gIDYgMTc6NTggQWRlbmL8dHRlbC50eHQKICAtcnctcnctLS0tICAxIHVyc3VsYSAgICAgMzczIEphbiAgNSAxNToxOSBB32xhci50eHQKICAtcnctcnctLS0tICAxIGdpc2JlcnQgICAgNDgyIEphbiAgNSAxNToyMCBCbG93YXR6LnR4dAogIC1ydy1ydy0tLS0gIDEgZ3VkcnVuICAgICAxMjQgSmFuICA1IDE1OjE5IEL2Ymxpbmdlbi50eHQKICAtcnctcnctLS0tICAxIG9sZ2EgICAgIDE0MzQ4IEphbiAgNyAxNDoyMyBL9mxuLnR4dAoKICAgV2hlbiB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgZmlsZSBzeXN0ZW1zIHVzZSBkaWZmZXJlbnQgY2hhcmFjdGVyIHNldHMsCiAgIHlvdSBzaG91bGQgdGFrZSBjYXJlIHRvIHVzZSBvbmx5IHRob3NlIGNoYXJhY3RlcnMgdGhhdCB0aGUgdHdvIHNldHMKICAgc2hhcmUgaW4gY29tbW9uIHdoZW4gY3JlYXRpbmcgZmlsZW5hbWVzIG9yIHRleHQtZmlsZSBjb250ZW50cy4gRm9yCiAgIGV4YW1wbGUsIFBDIGNvZGUgcGFnZXMgY29udGFpbiBhIGxvdCBsaW5lLSBhbmQgYm94LWRyYXdpbmcgY2hhcmFjdGVycywKICAgYW5kIHNvbWV0aW1lcyAic21hcnQgcXVvdGVzIiwgZXRjLCB0aGF0IGFyZSBub3QgZm91bmQgaW4gSVNPIHN0YW5kYXJkCiAgIDgtYml0IGNoYXJhY3RlciBzZXRzLiBZb3Ugc2hvdWxkIGJlIGVzcGVjaWFsbHkgY2FyZWZ1bCB0byBhdm9pZCB1c2luZwogICBzdWNoIGNoYXJhY3RlcnMgaW4gZmlsZW5hbWVzLgoKICAgWyBbMzI1XUMtS2VybWl0IENoYXJhY3RlciBTZXRzIF0KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDMuNy4xLiBDaGFyYWN0ZXIgU2V0cyBhbmQgVXBsb2FkaW5nCgogICBLZXJtaXQncyBQVVQgYW5kIE1QVVQgY29tbWFuZHMgaW5jbHVkZSBmdWxsIGZpbGUtc2Nhbm5pbmcKICAgY2FwYWJpbGl0aWVzLCBhcyBkZXNjcmliZWQgaW4gWzMyNl1TZWN0aW9uIDQuIFRodXMgaWYgRlRQCiAgIENIQVJBQ1RFUi1TRVQtVFJBTlNMQVRJT04gaXMgT04gYW5kIHlvdXIgY2hhcmFjdGVyLXNldCBhc3NvY2lhdGlvbnMKICAgYXJlIHNldCB1cCBhcHByb3ByaWF0ZWx5LCBLZXJtaXQgYXV0b21hdGljYWxseSBzd2l0Y2hlcyBvbiBhIHBlci1maWxlCiAgIGJhc2lzIGJldHdlZW4gdGV4dCBhbmQgYmluYXJ5IG1vZGUsIGFuZCBmb3IgZWFjaCB0ZXh0IGZpbGUgYmV0d2VlbgogICB5b3VyIGNob3NlbiA3LWJpdCB0ZXh0IGNoYXJhY3RlciBzZXQgKGUuZy4gQVNDSUkgb3IgSVNPIDY0NiBHZXJtYW4pLAogICA4LWJpdCB0ZXh0IChlLmcuIExhdGluLTEgb3IgSmFwYW5lc2UgRVVDKSwgVUNTLTIsIGFuZCBVVEYtOCwgYW5kCiAgIGNvbnZlcnRzIGVhY2ggb2YgdGhlc2UgYXV0b21hdGljYWxseSB0byB0aGUgc2VydmVyIGNoYXJhY3Rlci1zZXQsIGFuZAogICBmdXJ0aGVybW9yZSBhdXRvbWF0aWNhbGx5IGRpZmZlcmVudGlhdGVzIGJldHdlZW4gdGhlIExpdHRsZSBhbmQgQmlnCiAgIEVuZGlhbiBmb3JtcyBvZiBVQ1MtMiwgYWx3YXlzIHNlbmRpbmcgaW4gQmlnIEVuZGlhbiBmb3JtLgoKICAgICBXQVJOSU5HOiBJdCBpcyBub3QgYWR2aXNhYmxlIHRvIHVzZSBVQ1MtMiAob3IgYW55IFVuaWNvZGUKICAgICB0cmFuc2Zvcm1hdGlvbiBvdGhlciB0aGFuIFVURi04KSAib24gdGhlIHdpcmUiLCBpLmUuIGFzIGEgc2VydmVyCiAgICAgY2hhcmFjdGVyIHNldC4gTW9zdCBGVFAgc2VydmVycyBhcmUgbm90IGFibGUgdG8gY29wZSB3aXRoIGl0LCBzaW5jZQogICAgIGl0IGNvbnRhaW5zIGxvdHMgb2YgMCAoTlVMKSBjaGFyYWN0ZXJzLiBJZiB5b3UgZG8gdXNlIGl0LCBLZXJtaXQKICAgICBkb2VzIG5vdCB0cmFuc2xhdGUgZmlsZW5hbWVzIHRvIG9yIGZyb20gVUNTLTIsIGZvciByZWFzb25zIHdlbGwKICAgICBrbm93biB0byBDIHByb2dyYW1tZXJzIChmb3IgZXhhbXBsZSwgVU5JWCBBUElzIGFzc3VtZSBmaWxlbmFtZQogICAgIHN0cmluZ3MgYXJlIE5VTC10ZXJtaW5hdGVkKS4gWzMyN11VVEYtOCBpcyB0aGUgcHJlZmVycmVkIChhbmQKICAgICBzdGFuZGFyZCkgVW5pY29kZSBmb3JtYXQgZm9yIHRoZSBJbnRlcm5ldC4KCiAgIEZUUCBjaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9ucyBkaWZmZXIgZnJvbSB0aGUgcmVndWxhciBLZXJtaXQgb25lcyBieQogICBub3QgcmVzdHJpY3RpbmcgdHJhbnNsYXRpb25zIHRvIGEgZmlsZS1jaGFyYWN0ZXItc2V0IC8KICAgdHJhbnNmZXItY2hhcmFjdGVyLXNldCBwYWlyLiBZb3UgY2FuIGhhdmUgS2VybWl0J3MgRlRQIGNsaWVudAogICB0cmFuc2xhdGUgYmV0d2VlbiBhbnkgcGFpciBvZiBjaGFyYWN0ZXIgc2V0cyBpdCBrbm93cyBhYm91dC4gWW91IGNhbgogICBzZWUgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGNoYXJhY3RlciBzZXRzIGJ5IHR5cGluZyBlaXRoZXIgb2YgdGhlCiAgIGZvbGxvd2luZzoKCiAgc2V0IGZ0cCBzZXJ2ZXItY2hhcmFjdGVyLXNldCA/CiAgc2V0IGZpbGUgY2hhcmFjdGVyLXNldCA/CgogICBBIHR5cGljYWwgbGlzdCBsb29rcyBsaWtlIHRoaXMgKFszMjhdQ0xJQ0sgSEVSRSBmb3IgYW4gZXhwbGFuYXRpb24gb2YKICAgdGhlIG5hbWVzKToKCiAgQy1LZXJtaXQ+c2V0IGZpbGUgY2hhciA/IE9uZSBvZiB0aGUgZm9sbG93aW5nOgogICBhc2NpaSAgICAgICAgICAgIGNwODY5LWdyZWVrICAgICAgIGhlYnJldy03ICAgICAgICAgbWF6b3ZpYS1wYwogICBicml0aXNoICAgICAgICAgIGN5cmlsbGljLWlzbyAgICAgIGhlYnJldy1pc28gICAgICAgbmV4dC1tdWx0aW5hdGlvbmFsCiAgIGJ1bGdhcmlhLXBjICAgICAgZGFuaXNoICAgICAgICAgICAgaHAtcm9tYW44ICAgICAgICBub3J3ZWdpYW4KICAgY2FuYWRpYW4tZnJlbmNoICBkZWMta2FuamkgICAgICAgICBodW5nYXJpYW4gICAgICAgIHBvcnR1Z3Vlc2UKICAgY3AxMjUwICAgICAgICAgICBkZWMtbXVsdGluYXRpb25hbCBpc28yMDIyanAta2FuamkgIHNoaWZ0LWppcy1rYW5qaQogICBjcDEyNTEtY3lyaWxsaWMgIGRnLWludGVybmF0aW9uYWwgIGl0YWxpYW4gICAgICAgICAgc2hvcnQta29pCiAgIGNwMTI1MiAgICAgICAgICAgZHV0Y2ggICAgICAgICAgICAgamlzNy1rYW5qaSAgICAgICBzcGFuaXNoCiAgIGNwNDM3ICAgICAgICAgICAgZWxvdDkyNy1ncmVlayAgICAga29pOCAgICAgICAgICAgICBzd2VkaXNoCiAgIGNwODUwICAgICAgICAgICAgZWxvdDkyOC1ncmVlayAgICAga29pOHIgICAgICAgICAgICBzd2lzcwogICBjcDg1MiAgICAgICAgICAgIGV1Yy1qcCAgICAgICAgICAgIGtvaTh1ICAgICAgICAgICAgdWNzMgogICBjcDg1NS1jeXJpbGxpYyAgIGZpbm5pc2ggICAgICAgICAgIGxhdGluMS1pc28gICAgICAgdXRmOAogICBjcDg1OCAgICAgICAgICAgIGZyZW5jaCAgICAgICAgICAgIGxhdGluMi1pc28KICAgY3A4NjItaGVicmV3ICAgICBnZXJtYW4gICAgICAgICAgICBsYXRpbjktaXNvCiAgIGNwODY2LWN5cmlsbGljICAgZ3JlZWstaXNvICAgICAgICAgbWFjaW50b3NoLWxhdGluCiAgQy1LZXJtaXQ+CgogICBUaHVzIHlvdSBjYW4gdHJhbnNsYXRlIG5vdCBvbmx5IGJldHdlZW4gcHJpdmF0ZSBzZXRzIChsaWtlIFBDIGNvZGUKICAgcGFnZXMpIGFuZCBzdGFuZGFyZCBvbmVzIChsaWtlIExhdGluLTEpIGFzIGluIEtlcm1pdCBwcm90b2NvbCwgYnV0CiAgIGFsc28gYmV0d2VlbiBhbnkgZ2l2ZW4gcGFpciBvZiBwcml2YXRlIHNldHMgKGUuZy4gQ1A4NTIgYW5kIE1hem92aWEpLgogICBBbGwgY29udmVyc2lvbnMgZ28gdGhyb3VnaCBVbmljb2RlIGFzIHRoZSBpbnRlcm1lZGlhdGUgY2hhcmFjdGVyIHNldCwKICAgcmVzdWx0aW5nIGluIGEgbWluaW11bSBvZiBjaGFyYWN0ZXIgbG9zcywgc2luY2UgVW5pY29kZSBpcyBhIHN1cGVyc2V0CiAgIG9mIGFsbCBvdGhlciBjaGFyYWN0ZXIgc2V0cyBrbm93biB0byBLZXJtaXQuCgogICBJbiBhZGRpdGlvbiB0byB0aGUgU0VUIGNvbW1hbmRzIGxpc3RlZCBhYm92ZSwgdGhlIEZUUCBQVVQgYW5kIE1QVVQKICAgY29tbWFuZHMgaW5jbHVkZSBzd2l0Y2hlcyB0aGF0IGFwcGx5IG9ubHkgdG8gdGhlIGN1cnJlbnQgY29tbWFuZDoKCiAgIC9MT0NBTC1DSEFSQUNURVItU0VUOm5hbWUKICAgL1NFUlZFUi1DSEFSQUNURVItU0VUOm5hbWUKICAgICAgICAgIFVzZSB0aGVzZSBzd2l0Y2hlcyB0byBmb3JjZSBhIHBhcnRpY3VsYXIgdHJhbnNsYXRpb24uIFRoZXNlCiAgICAgICAgICBzd2l0Y2hlcyBvdmVycmlkZSB0aGUgZ2xvYmFsIEZUUCBDSEFSQUNURVItU0VULVRSQU5TTEFUSU9OIGFuZAogICAgICAgICAgU0VSVkVSLUNIQVJBQ1RFUi1TRVQgc2V0dGluZ3MgYW5kIGFsc28gY2hhcmFjdGVyLXNldAogICAgICAgICAgZGlmZmVyZW50aWF0aW9uIGJ5IGZpbGUgc2Nhbm5pbmcgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgUFVUIG9yCiAgICAgICAgICBNUFVUIGNvbW1hbmQuIFRoZSBmaWxlIHNjYW4gaXMgc3RpbGwgcGVyZm9ybWVkLCBob3dldmVyLCB0bwogICAgICAgICAgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGZpbGUgaXMgdGV4dCBvciBiaW5hcnk7IHRodXMgdGhlc2UKICAgICAgICAgIHN3aXRjaGVzIGRvIG5vdCBhZmZlY3QgYmluYXJ5IGZpbGVzIHVubGVzcyB5b3UgYWxzbyBpbmNsdWRlIHRoZQogICAgICAgICAgL1RFWFQgc3dpdGNoIHRvIGZvcmNlIGFsbCBmaWxlcyB0byBiZSB0cmVhdGVkIGFzIHRleHQuCgogICBJbiBvdGhlciB3b3JkcywgaWYgeW91IGluY2x1ZGUgb25lIG9yIGJvdGggb2YgdGhlc2Ugc3dpdGNoZXMgd2l0aCBhCiAgIFBVVCBvciBNUFVUIGNvbW1hbmQsIHRoZXkgYXJlIHVzZWQuIFNpbWlsYXJseSwgdGhlIC9UUkFOU1BBUkVOVCBzd2l0Y2gKICAgZGlzYWJsZXMgY2hhcmFjdGVyLXNldCB0cmFuc2xhdGlvbiBmb3IgdGhlIFBVVCBvciBNUFVUIGNvbW1hbmQgZGVzcGl0ZQogICB0aGUgcHJldmFpbGluZyBGVFAgQ0hBUkFDVEVSLVNFVC1UUkFOU0xBVElPTiBhbmQgU0VSVkVSLUNIQVJBQ1RFUi1TRVQKICAgc2V0dGluZ3MuCgogICBXaGVuIHVwbG9hZGluZywgdGhlIEZJTEUgQ0hBUkFDVEVSLVNFVCBzZXR0aW5nIGlzIGlnbm9yZWQgdW5sZXNzIHlvdQogICBoYXZlIGZvcmNlZCBLZXJtaXQgbm90IHRvIFszMjldc2NhbiBsb2NhbCBmaWxlcyBieSBpbmNsdWRpbmcgYSAvVEVYVAogICBvciAvQklOQVJZIHN3aXRjaCB3aXRoIHlvdXIgW01dUFVUIGNvbW1hbmQsIG9yIGJ5IGRpc2FibGluZyBhdXRvbWF0aWMKICAgdGV4dC9iaW5hcnkgc3dpdGNoaW5nIGluIHNvbWUgb3RoZXIgd2F5LgoKICAgRXhhbXBsZXM6CgogICAgMS4gU3VwcG9zZSB5b3UgaGF2ZSBhIENQODUyIChFYXN0IEV1cm9wZWFuKSB0ZXh0IGZpbGUgdGhhdCB5b3Ugd2FudAogICAgICAgdG8gdXBsb2FkIGFuZCBzdG9yZSBpbiBJU08gTGF0aW4gQWxwaGFiZXQgMiBlbmNvZGluZzoKICBmdHAgcHV0IC9sb2NhbC1jaGFyOmNwODUyIC9zZXJ2ZXItY2hhcjpsYXRpbjIgbWFneWFyLnR4dAogICAgMi4gU3VwcG9zZSB5b3UgYWx3YXlzIHdhbnQgeW91ciB0ZXh0IGZpbGVzIGNvbnZlcnRlZCB0byBMYXRpbi0yIHdoZW4KICAgICAgIHVwbG9hZGluZyB3aXRoIEZUUC4gVGhlbiBwdXQ6CiAgc2V0IGZ0cCBzZXJ2ZXItY2hhcmFjdGVyLXNldCBsYXRpbjIKICAgICAgIGluIHlvdXIgS2VybWl0IGN1c3RvbWl6YXRpb24gZmlsZSwgYW5kIHRoZW4geW91IGNhbiBvbWl0IHRoZQogICAgICAgL1NFUlZFUi1DSEFSQUNURVItU0VUOiBzd2l0Y2ggZnJvbSB5b3VyIEZUUCBQVVQgY29tbWFuZHM6CiAgZnRwIHB1dCAvbG9jYWwtY2hhcjpjcDg1MiBtYWd5YXIudHh0CiAgICAzLiBOb3cgc3VwcG9zZSB0aGF0IGFsbCB0aGUgdGV4dCBmaWxlcyBvbiB5b3VyIFBDIGFyZSB3cml0dGVuIGluCiAgICAgICBIdW5nYXJpYW4sIGJ1dCB0aGV5IGhhdmUgYSB2YXJpZXR5IG9mIGVuY29kaW5ncywgYW5kIHlvdSBkb24ndAogICAgICAgd2FudCB0byBoYXZlIHRvIGluY2x1ZGUgdGhlIC9MT0NBTC1DSEFSQUNURVItU0VUOiBzd2l0Y2ggb24gZXZlcnkKICAgICAgIEZUUCBQVVQgY29tbWFuZCwgb3IgKG1vcmUgdG8gdGhlIHBvaW50KSB5b3Ugd2FudCB0byBiZSBhYmxlIHRvCiAgICAgICBzZW5kIGEgbWl4dHVyZSBvZiB0aGVzZSBmaWxlcyBhbGwgYXQgb25jZS4gUHV0IHRoZXNlIGNvbW1hbmRzIGluCiAgICAgICB5b3VyIEtlcm1pdCBjdXN0b21pemF0aW9uIGZpbGU6CiAgc2V0IGZ0cCBzZXJ2ZXItY2hhcmFjdGVyLXNldCBsYXRpbjIgICAgICAgICAgICA7IElTTyA4ODU5LTIKICBzZXQgZmlsZSBkZWZhdWx0IDctYml0LWNoYXJhY3Rlci1zZXQgaHVuZ2FyaWFuIDsgSVNPIDY0NiBIdW5nYXJpYW4KICBzZXQgZmlsZSBkZWZhdWx0IDgtYml0LWNoYXJhY3Rlci1zZXQgY3A4NTIgICAgIDsgUEMgRWFzdCBFdXJvcGVhbiBDb2RlIFBhZ2UKICAgICAgIGFuZCBub3cgUFVUIGFuZCBNUFVUIHdpbGwgYXV0b21hdGljYWxseSBkZXRlY3QgYW5kIHN3aXRjaCBhbW9uZwogICAgICAgSVNPIDY0NiBIdW5nYXJpYW4sIENvZGUgUGFnZSA4NTIsIFVURi04LCBhbmQgVUNTLTIgZW5jb2RpbmdzLAogICAgICAgdHJhbnNsYXRpbmcgZWFjaCBvbmUgdG8gTGF0aW4tMiBmb3IgdXBsb2FkaW5nOgogIGZ0cCBwdXQgKi50eHQKCiAgIEFuZCBzaW5jZSBiaW5hcnkgZmlsZXMgYXJlIGFsc28gZGV0ZWN0ZWQgYXV0b21hdGljYWxseSwgdGhlIGxhdHRlciBjYW4KICAgYmUgc2ltcGxpZmllZCB0bzoKCiAgZnRwIHB1dCAqCgogICBldmVuIHdoZW4gIioiIG1hdGNoZXMgYSBkaXZlcnNlIGNvbGxlY3Rpb24gb2YgYmluYXJ5IGFuZCB0ZXh0IGZpbGVzLAogICBiZWNhdXNlIHRyYW5zbGF0aW9ucyBhcmUgc2tpcHBlZCBhdXRvbWF0aWNhbGx5IGZvciBiaW5hcnkgZmlsZXMuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICAzLjcuMi4gQ2hhcmFjdGVyIFNldHMgYW5kIERvd25sb2FkaW5nCgogICBUaGUgY29tbWFuZHMgYW5kIHN3aXRjaGVzIGFyZSB0aGUgc2FtZSBhcyBmb3IgdXBsb2FkaW5nLCBidXQgYXV0b21hdGljCiAgIGNoYXJhY3Rlci1zZXQgc3dpdGNoaW5nIHdvcmtzIGRpZmZlcmVudGx5LCBzaW5jZSBLZXJtaXQgY2FuJ3Qgc2NhbiB0aGUKICAgc2VydmVyIGZpbGVzIGluIGFkdmFuY2UuIEluc3RlYWQsIHRoZSB0cmFuc2ZlciBtb2RlICh0ZXh0IG9yIGJpbmFyeSkKICAgaXMgYmFzZWQgb24gdGhlIGZpbGVuYW1lczsgZWFjaCBuYW1lIGlzIGNvbXBhcmVkIHdpdGggS2VybWl0J3MgbGlzdCBvZgogICB0ZXh0IG5hbWUgcGF0dGVybnMgYW5kIGJpbmFyeSBuYW1lIHBhdHRlcm5zLiBJZiB0aGUgbmFtZSBtYXRjaGVzIGEKICAgYmluYXJ5IHBhdHRlcm4gKGZvciBleGFtcGxlLCBpZiB0aGUgZmlsZW5hbWUgaXMgb29mYS50YXIuZ3ogYW5kIG9uZSBvZgogICB0aGUgZmlsZW5hbWUgcGF0dGVybnMgaXMgIiouZ3oiKSwgdGhlIGZpbGUgaXMgZG93bmxvYWRlZCBpbiBiaW5hcnkKICAgbW9kZTsgb3RoZXJ3aXNlIGlmIGl0IG1hdGNoZXMgYSB0ZXh0IHBhdHRlcm4gKGUuZy4gb29mYS50eHQgbWF0Y2hlcwogICAiKi50eHQiKSwgaXQgaXMgdHJhbnNmZXJyZWQgaW4gdGV4dCAoImFzY2lpIikgbW9kZS4gT3RoZXJ3aXNlLCBpdCBpcwogICB0cmFuc2ZlcnJlZCBpbiB0aGUgcHJldmFpbGluZyBGVFAgVFlQRS4KCiAgIEluIEMtS2VybWl0IDguMCwgdGhlIHBhdHRlcm4gbGlzdHMgdXNlZCB3aXRoIEZUUCBHRVQgYXJlIG5vdCB0aGUgc2FtZQogICBsaXN0cyB1c2VkIHdpdGggS2VybWl0IHRyYW5zZmVycywgYW5kIGNhbiBub3QgYmUgdmlld2VkIHdpdGggU0hPVwogICBQQVRURVJOUywgbm9yIGFkanVzdGVkIHdpdGggQUREIGFuZCBSRU1PVkUgVEVYVC1QQVRURVJOUyBhbmQKICAgQklOQVJZLVBBVFRFUk5TLCBvciBTRVQgRklMRSBURVhULVBBVFRFUk5TIGFuZCBCSU5BUlktUEFUVEVSTlMuCiAgIENvbmZpZ3VyYXRpb24gb2YgdGhlIEZUUCBwYXR0ZXJucyBsaXN0IHdpbGwgYmUgYWRkZWQgaW4gYSBmdXR1cmUKICAgcmVsZWFzZS4KCiAgIEV4YW1wbGVzOgoKICAgZ2V0IC9zZXJ2ZXItY2hhcjpsYXRpbjEgL2xvY2FsLWNoYXI6Y3A4NTAgR3L832UudHh0CiAgICAgICAgICBJbiB0aGlzIGNvbW1hbmQsIHRoZSBmaWxlbmFtZSBjb250YWlucyBzcGVjaWFsIGNoYXJhY3RlcnMsCiAgICAgICAgICB3aGljaCB5b3UgZW50ZXIgdXNpbmcgd2hhdGV2ZXIgY2hhcmFjdGVyIHNldCB5b3VyIGxvY2FsCiAgICAgICAgICBjb21wdXRlciB1c2VzLCBpbiB0aGlzIGNhc2UgUEMgQ29kZSBQYWdlIDg1MCAoY3A4NTApLiBUaGUKICAgICAgICAgIGNvbW1hbmQgdGVsbHMgS2VybWl0IChpbiBjYXNlIGl0IGRpZG4ndCBrbm93IGFscmVhZHkgZnJvbSBpdHMKICAgICAgICAgIEZJTEUgQ0hBUkFDVEVSLVNFVCBzZXR0aW5nKSB0aGF0IHRoZSBsb2NhbCBjaGFyYWN0ZXIgc2V0IGlzCiAgICAgICAgICBjcDg1MCBhbmQgdGhlIHNlcnZlcidzIGNoYXJhY3Rlci1zZXQgaXMgSVNPIDg4NTktMSBMYXRpbgogICAgICAgICAgQWxwaGFiZXQgMSAobGF0aW4xKS4gS2VybWl0IHRyYW5zbGF0ZXMgdGhlIGZpbGVuYW1lIGZyb20gY3A4NTAKICAgICAgICAgIHRvIGxhdGluMSBhbmQgc2VuZHMgdGhlIGxhdGluMSBuYW1lIHRvIHRoZSBzZXJ2ZXIuIFNpbmNlIGl0J3MgYQogICAgICAgICAgdGV4dCBmaWxlIChtYXRjaGVzICIqLnR4dCIpLCBpdHMgY29udGVudHMgYXJlIHRyYW5zbGF0ZWQgdG8KICAgICAgICAgIGNwODUwIG9uIGFycml2YWwsIGFuZCBpdCBpcyBzYXZlZCB3aXRoIGEgY3A4NTAgbmFtZS4KCiAgIG1nZXQgL3RleHQgL3NlcnZlcjpsYXRpbjEgL2xvY2FsOnV0ZjggKi50eHQKICAgICAgICAgIFRoaXMgY29tbWFuZDoKCiAgICAgICAgICArIFRlbGxzIEMtS2VybWl0IHRoYXQgdGhlIHNlcnZlcidzIGZpbGVzIGFyZSBlbmNvZGVkIGluIElTTwogICAgICAgICAgICA4ODU5LTEgTGF0aW4gQWxwaGFiZXQgMS4KICAgICAgICAgICsgVGVsbHMgQy1LZXJtaXQgdG8gdHJhbnNsYXRlIHRoZSBpbmNvbWluZyBmaWxlcyBpbnRvIFVuaWNvZGUKICAgICAgICAgICAgVVRGLTggZm9yIHN0b3JhZ2UuCiAgICAgICAgICArIEFza3MgdGhlIHNlcnZlciB0byBzZW5kIGFsbCAiLnR4dCIgZmlsZXMgaW4gdGV4dCBtb2RlLgoKICAgbWdldCAvc2VydmVyOmxhdGluMSAvbG9jYWw6dXRmOCAqCiAgICAgICAgICBUZWxscyBLZXJtaXQgdG8gZ2V0IGFsbCBmaWxlcyBmcm9tIHRoZSBzZXJ2ZXIncyBkaXJlY3RvcnksCiAgICAgICAgICBzd2l0Y2hpbmcgYmV0d2VlbiB0ZXh0IGFuZCBiaW5hcnkgbW9kZSBiYXNlZCBvbiB0aGUgZmlsZW5hbWUuCiAgICAgICAgICBUaGUgbmFtZXMgb2YgYWxsIHRoZSBmaWxlcyBhcmUgdHJhbnNsYXRlZCAodG8gVVRGLTggaW4gdGhpcwogICAgICAgICAgY2FzZSksIGJ1dCBjb250ZW50cyBhcmUgdHJhbnNsYXRlZCAoYWxzbyB0byBVVEYtOCkgb25seSBmb3IKICAgICAgICAgIHRleHQgZmlsZXMuCgogICBOb3RlIHRoYXQgYW55IHBhaXIgb2YgOC1iaXQgY2hhcmFjdGVyIHNldHMgaXMgbGlrZWx5IHRvIGhhdmUgc29tZQogICBpbmNvbXBhdGliaWxpdGllcy4gQW55IGNoYXJhY3RlcnMgaW4gdGhlIHNvdXJjZSBmaWxlIHRoYXQgZG8gbm90IGhhdmUKICAgZXF1aXZhbGVudHMgaW4gdGhlIGRlc3RpbmF0aW9uIGZpbGUncyBjaGFyYWN0ZXIgc2V0IGFyZSBjb252ZXJ0ZWQgdG8KICAgcXVlc3Rpb24gbWFya3MuIFRoaXMgYXBwbGllcyB0byBib3RoIGZpbGVuYW1lcyBhbmQgdG8gdGV4dCBmaWxlCiAgIGNvbnRlbnRzLgoKICAgQWxzbyBub3RlIHRoYXQgdGhlIHNlcnZlcidzIGFiaWxpdHkgdG8gYWNjZXB0IHNwZWNpYWwgY2hhcmFjdGVycyBpbgogICBmaWxlbmFtZXMgZGVwZW5kcyBvbiB0aGUgcGFydGljdWxhciBzZXJ2ZXIuIEZvciBleGFtcGxlOgoKICBnZXQgR3L832UudHh0CgogICB3b3JrcyB3aXRoIFdVLUZUUEQsIGJ1dDoKCiAgbWdldCBHcvzfKi50eHQKCiAgIGRvZXMgbm90LgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgMy43LjMuIFJGQzI2NDAKCiAgIFszMzBdUkZDMjY0MCwgSnVseSAxOTk5LCBzcGVjaWZpZXMgYSBtZXRob2QgYnkgd2hpY2ggdGhlIEZUUCBjbGllbnQKICAgYW5kIHNlcnZlciBjYW4gbmVnb3RpYXRlIHRoZSB1c2Ugb2YgVVRGOC4gSG93ZXZlciwgUkZDMjY0MC1jYXBhYmxlCiAgIHNlcnZlcnMgYXJlIHJhcmUgdG8gbm9uZXhpc3RlbnQgYXQgdGhpcyB3cml0aW5nLCBhbmQgaW4gYW55IGNhc2UgeW91CiAgIGRvbid0IG5lZWQgdGhlbSB0byBiZSBhYmxlIHRvIHRyYW5zZmVyIHRleHQgaW4gVVRGOC4gQy1LZXJtaXQgbGV0cyB5b3UKICAgdXBsb2FkIGFuZCBkb3dubG9hZCB0ZXh0IGZpbGVzIGluIGFueSBjaGFyYWN0ZXIgc2V0IGl0IGtub3dzIGFib3V0LAogICBjb252ZXJ0aW5nIHRvIG9yIGZyb20gYW55IG90aGVyIGNoYXJhY3RlciBzZXQgaXQga25vd3MgYWJvdXQsIHdpdGhvdXQKICAgdGhlIGtub3dsZWRnZSwgcGVybWlzc2lvbiwgb3IgY29vcGVyYXRpb24gb2YgdGhlIHNlcnZlciwgYW5kCiAgIHJlZ2FyZGxlc3Mgb2YgaXRzIGNhcGFiaWxpdGllcy4KCiAgIFsgWzMzMV1Ub3AgXSBbIFszMzJdRlRQIFRvcCBdIFsgWzMzM11DLUtlcm1pdCBIb21lIF0gWyBbMzM0XUtlcm1pdAogICBIb21lIF0KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAzLjguIEZUUCBDb21tYW5kIFNob3J0Y3V0cwoKICAgQy1LZXJtaXQncyBGVFAgY2xpZW50IGNvZXhpc3RzIHdpdGggb3RoZXIgQy1LZXJtaXQgZnVuY3Rpb25zIGJ5CiAgIHJlcXVpcmluZyB0aGUgImZ0cCIgcHJlZml4IGZvciBlYWNoIEZUUC1yZWxhdGVkIGNvbW1hbmQ6IEZUUCBPUEVOLCBGVFAKICAgR0VULCBGVFAgQllFLCBhbmQgc28gb24uIEZvciBpbnRlcmFjdGl2ZSB1c2UsIGhvd2V2ZXIsIHRoaXMgY2FuIGJlCiAgIHJhdGhlciBhd2t3YXJkIGFuZCBzb21ldGltZXMgc3VycHJpc2luZywgZm9yIGV4YW1wbGUgd2hlbiBhIEdFVAogICBjb21tYW5kIHN0YXJ0cyBhIEtlcm1pdCBHRVQgcmF0aGVyIHRoYW4gYW4gRlRQIEdFVC4gSW4gZmFjdCwgbWFueQogICBLZXJtaXQgY29tbWFuZHMgbWlnaHQganVzdCBhcyBlYXNpbHkgYXBwbHkgdG8gYW4gRlRQIGNvbm5lY3Rpb246IEdFVCwKICAgUFVUIChTRU5EKSwgQllFLCBhbmQgQ0xPU0UuIFRoZSBmb2xsb3dpbmcgY29tbWFuZCBsZXRzIHlvdSBjaG9vc2UgaG93CiAgIHRoZXNlIGNvbW1hbmRzIGFyZSBpbnRlcnByZXRlZDoKCiAgIFNFVCBHRVQtUFVULVJFTU9URSB7IEFVVE8sIEtFUk1JVCwgRlRQIH0KICAgICAgICAgIENvbnRyb2xzIHRoZSBvcmllbnRhdGlvbiBvZiBHRVQsIFBVVCwgUkVNT1RFIGFuZCBvdGhlcgogICAgICAgICAgZmlsZS10cmFuc2ZlciBhbmQgY2xpZW50L3NlcnZlciBjb21tYW5kcyB0aGF0IG1pZ2h0IGFwcGx5IHRvCiAgICAgICAgICBlaXRoZXIgS2VybWl0IG9yIEZUUC4gVGhlIGRlZmF1bHQgc2V0dGluZyBpcyBBVVRPLCBtZWFuaW5nIHRoYXQKICAgICAgICAgIHRoZXNlIGNvbW1hbmRzIGFwcGx5IHRvIEZUUCBpZiBhbiBGVFAgY29ubmVjdGlvbiBpcyBvcGVuLCBhbmQKICAgICAgICAgIHRvIEtlcm1pdCBvdGhlcndpc2UuIEtFUk1JVCBtZWFucyB0aGV5IGFsd2F5cyBhcHBseSB0byBLZXJtaXQsCiAgICAgICAgICBGVFAgbWVhbnMgdGhleSBhbHdheXMgYXBwbHkgdG8gRlRQLgoKICAgSGVyZSBpcyBhIGNvbXBsZXRlIGxpc3Qgb2YgYWZmZWN0ZWQgY29tbWFuZHM6CgogS2VybWl0IENvbW1hbmQgICAgICAgICAgICAgICBGVFAgRXF1aXZhbGVudAogIChub25lKSAgICAgICAgICAgICAgICAgICAgICAgRlRQIFsgT1BFTiBdCiAgTE9HSU4gICAgICAgICAgICAgICAgICAgICAgICBGVFAgVVNFUgogIExPR09VVCAgICAgICAgICAgICAgICAgICAgICAgRlRQIFJFU0VUCiAgQllFICAgICAgICAgICAgICAgICAgICAgICAgICBGVFAgQllFCiAgRklOSVNIICAgICAgICAgICAgICAgICAgICAgICBGVFAgQllFCiAgQ0xPU0UgICAgICAgICAgICAgICAgICAgICAgICBGVFAgQllFCiAgSEFOR1VQICAgICAgICAgICAgICAgICAgICAgICBGVFAgQllFCiAgQklOQVJZICAgICAgICAgICAgICAgICAgICAgICBGVFAgVFlQRSBCSU5BUlkKICBURVhUIChvciBBU0NJSSkgICAgICAgICAgICAgIEZUUCBUWVBFIEFTQ0lJCiAgU0VORCAob3IgUFVUKSAgICAgICAgICAgICAgICBGVFAgUFVUCiAgTVNFTkQgKG9yIE1QVVQpICAgICAgICAgICAgICBGVFAgTVBVVAogIFJFU0VORCAgICAgICAgICAgICAgICAgICAgICAgRlRQIFBVVCAvUkVDT1ZFUgogIENTRU5EICAgICAgICAgICAgICAgICAgICAgICAgRlRQIFBVVCAvQ09NTUFORAogIEdFVCAgICAgICAgICAgICAgICAgICAgICAgICAgRlRQIEdFVAogIE1HRVQgICAgICAgICAgICAgICAgICAgICAgICAgRlRQIE1HRVQKICBSRUdFVCAgICAgICAgICAgICAgICAgICAgICAgIEZUUCBHRVQgL1JFQ09WRVIKICBSRU1PVEUgSEVMUCAgICAgIChSSEVMUCkgICAgIEZUUCBIRUxQCiAgUkVNT1RFIENEICAgICAgICAoUkNEKSAgICAgICBGVFAgQ0QgKENXRCkKICBSRU1PVEUgUFdEICAgICAgIChSUFdEKSAgICAgIEZUUCBQV0QKICBSRU1PVEUgRElSRUNUT1JZIChSRElSKSAgICAgIEZUUCBESVJFQ1RPUlkKICBSRU1PVEUgREVMRVRFICAgIChSREVMKSAgICAgIEZUUCBERUxFVEUKICBSRU1PVEUgTUtESVIgICAgIChSTUtESVIpICAgIEZUUCBNS0RJUgogIFJFTU9URSBSTURJUiAgICAgKFJSTURJUikgICAgRlRQIFJNRElSCiAgUkVNT1RFIFJFTkFNRSAgICAoUlJFTkFNRSkgICBGVFAgUkVOQU1FCiAgUkVNT1RFIFRZUEUgICAgICAoUlRZUEUpICAgICBGVFAgVFlQRQogIFJFTU9URSBFWElUICAgICAgKFJFWElUKSAgICAgRlRQIEJZRQoKICAgVGhlIGNvbW1hbmRzIGluIHRoZSByaWdodC1oYW5kIGNvbHVtbiBhbHdheXMgYWNjZXNzIEZUUC4gVGhlIGNvbW1hbmRzCiAgIGluIHRoZSBsZWZ0IGNvbHVtbiBjYW4gYWNjZXNzIGVpdGhlciBLZXJtaXQgcHJvdG9jb2wgb3IgRlRQOgoKICAgICAqIFdoZW4gR0VULVBVVC1SRU1PVEUgaXMgc2V0IHRvIEtFUk1JVCwgb3IgdG8gQVVUTyB3aGVuIHRoZXJlIGlzIG5vCiAgICAgICBGVFAgY29ubmVjdGlvbiwgdGhlIGNvbW1hbmRzIGluIHRoZSBsZWZ0LWhhbmQgY29sdW1uIGFjY2VzcyBLZXJtaXQKICAgICAgIHByb3RvY29sLCBhbmQgdGhvc2UgcmlnaHQtaGFuZCBjb2x1bW4gYXJlIHJlcXVpcmVkIGZvciBGVFAuCiAgICAgKiBXaGVuIEdFVC1QVVQtUkVNT1RFIGlzIHNldCB0byBGVFAsIG9yIHRvIEFVVE8gd2hlbiB0aGVyZSBpcyBhbgogICAgICAgYWN0aXZlIEZUUCBjb25uZWN0aW9uLCB0aGUgY29tbWFuZHMgaW4gdGhlIGxlZnQtaGFuZCBjb2x1bW4gYWNjZXNzCiAgICAgICB0aGUgRlRQIGNvbm5lY3Rpb24gYW5kIGNhbiBub3QgYmUgdXNlZCB0byBhY2Nlc3MgS2VybWl0IHByb3RvY29sLgogICAgICAgSW4gdGhpcyBjYXNlLCBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIHVzZSBib3RoIEtlcm1pdCBwcm90b2NvbAogICAgICAgYW5kIHRoZSBGVFAgY29ubmVjdGlvbiwgeW91IG11c3QgU0VUIEdFVC1QVVQtUkVNT1RFIEtFUk1JVCwgYW5kCiAgICAgICB0aGVuIHVzZSB0aGUgRlRQIGNvbW1hbmRzIGluIHRoZSByaWdodC1oYW5kIGNvbHVtbiB0byBhY2Nlc3MgdGhlCiAgICAgICBGVFAgY29ubmVjdGlvbi4KCiAgIE5vdGUgdGhhdCBmaWxlLW1hbmFnZW1lbnQgY29tbWFuZHMgc3VjaCBhcyBESVJFQ1RPUlksIERFTEVURSwgQ0QsIFBXRCwKICAgTUtESVIsIFJNRElSLCBIRUxQLCBSRU5BTUUsIENPUFksIFRZUEUsIGFuZCBzbyBvbiwgYWx3YXlzIGFwcGx5CiAgIGxvY2FsbHksIG5vIG1hdHRlciB3aGF0IGtpbmQgb2YgY29ubmVjdGlvbiB5b3UgaGF2ZS4gVGhpcyBpcyB0aGUKICAgb3Bwb3NpdGUgb2YgbW9zdCBGVFAgY2xpZW50cywgd2hlcmUgdGhlc2UgY29tbWFuZHMgYXJlIGludGVuZGVkIGZvcgogICB0aGUgc2VydmVyLCBhbmQgcmVxdWlyZSBhbiAiTCIgcHJlZml4IGZvciBsb2NhbCBleGVjdXRpb24gKGUuZy4gImRpciIKICAgZ2V0cyBhIGRpcmVjdG9yeSBsaXN0aW5nIGZyb20gdGhlIHNlcnZlciwgImxkaXIiIGdldHMgYSBsb2NhbAogICBkaXJlY3RvcnkgbGlzdGluZykuIFRvIGlsbHVzdHJhdGUgd2l0aCB0aGUgQ0QgY29tbWFuZCBhbmQgYSB0eXBpY2FsCiAgIFVOSVggRlRQIGNsaWVudDoKCiBDbGllbnQgICBTZXJ2ZXIgICAgICBDaGFuZ2UgTG9jYWwgRGlyZWN0b3J5ICAgICBDaGFuZ2UgUmVtb3RlIERpcmVjdG9yeQogIEZUUCAgICAgIEZUUCAgICAgICAgIGxjZCAgICAgICAgICAgICAgICAgICAgICAgIGNkIChjd2QpCiAgS2VybWl0ICAgS2VybWl0ICAgICAgY2QgICAgICAgICAgICAgICAgICAgICAgICAgcmNkLCByZW1vdGUgY2QKICBLZXJtaXQgICBGVFAgICAgICAgICBjZCAgICAgICAgICAgICAgICAgICAgICAgICBmdHAgY2QsIHJjZCwgcmVtb3RlIGNkCgogICBBbHNvIG5vdGUgdGhhdCBub3QgYWxsIFJFTU9URSBjb21tYW5kcyBhcmUgdXNlZnVsIHdpdGggRlRQLCBzaW5jZSBGVFAKICAgc2VydmVycyBkbyBub3Qgb2ZmZXIgdGhlIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb25zLiBUaGVzZSBpbmNsdWRlOgoKICAgICAqIFJFTU9URSBBU1NJR04gIC0gRlRQIHNlcnZlcnMgZG9uJ3QgaGF2ZSB2YXJpYWJsZXMKICAgICAqIFJFTU9URSBDT1BZICAgIC0gRlRQIHNlcnZlcnMgZG9uJ3QgY29weSBmaWxlcwogICAgICogUkVNT1RFIEhPU1QgICAgLSBGVFAgc2VydmVycyBkb24ndCBleGVjdXRlIGhvc3QgKHNoZWxsKSBjb21tYW5kcwogICAgICogUkVNT1RFIEtFUk1JVCAgLSBGVFAgc2VydmVycyBkb24ndCBleGVjdXRlIEtlcm1pdCBjb21tYW5kcwogICAgICogUkVNT1RFIFBSSU5UICAgLSBGVFAgc2VydmVycyBkb24ndCBwcmludCBmaWxlcwogICAgICogUkVNT1RFIFFVRVJZICAgLSBGVFAgc2VydmVycyBkb24ndCBoYXZlIHZhcmlhYmxlcwogICAgICogUkVNT1RFIFNFVCAgICAgLSBGVFAgc2VydmVycyBkb24ndCBoYXZlIEtlcm1pdCBzZXR0aW5ncwogICAgICogUkVNT1RFIFdITyAgICAgLSBGVFAgc2VydmVycyBkb24ndCBzZW5kIHVzZXIgbGlzdHMKCiAgIEZpbmFsbHkgbm90ZSB0aGF0IGNvbW1hbmQgc2hvcnRjdXRzIGRvIG5vdCBhcHBseSB0byB0aGUgSEVMUCBjb21tYW5kLgogICBGb3IgaGVscCBhYm91dCBhbiBGVFAgY29tbWFuZCwgdXNlIChmb3IgZXhhbXBsZSkgImhlbHAgZnRwIGRlbGV0ZSIsCiAgIG5vdCAiaGVscCBkZWxldGUiIG9yICJoZWxwIHJkZWxldGUiLgoKICAgWyBbMzM1XVRvcCBdIFsgWzMzNl1GVFAgVG9wIF0gWyBbMzM3XUMtS2VybWl0IEhvbWUgXSBbIFszMzhdS2VybWl0CiAgIEhvbWUgXQogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDMuOS4gRHVhbCBTZXNzaW9ucwoKICAgWW91IGNhbiBoYXZlIGFuIEZUUCBzZXNzaW9uIG9wZW4gYXQgdGhlIHNhbWUgdGltZSBhcyBhIHJlZ3VsYXIgS2VybWl0CiAgIFNFVCBMSU5FIG9yIFNFVCBIT1NUICh0ZXJtaW5hbCkgc2Vzc2lvbi4gSW4gdGhpcyBjYXNlLCB0aGUgZGVmYXVsdCBTRVQKICAgR0VULVBVVC1SRU1PVEUgQVVUTyBzZXR0aW5nIHNob3VsZCBlbnN1cmUgdGhhdCBhbGwgInR3by1mYWNlZCIKICAgY29tbWFuZHMgbGlrZSBHRVQsIFBVVCwgUkVNT1RFLCBIQU5HVVAsIEJZRSwgZXRjLCBhcHBseSB0byB0aGUgS2VybWl0CiAgIHNlc3Npb24sIGFuZCBhbGwgY29tbWFuZHMgZm9yIHRoZSBGVFAgc2Vzc2lvbiBtdXN0IGluY2x1ZGUgdGhlIEZUUAogICBwcmVmaXguIFRvIGJlIGFic29sdXRlbHkgY2VydGFpbiwgeW91IGNhbiB1c2UgU0VUIEdFVC1QVVQtUkVNT1RFCiAgIEtFUk1JVC4KCiAgZnRwIGZvby5iYXIuYmF6LmNvbQogIGlmIGZhaWwgLi4uCiAgKGxvZyBpbikKICBzZXQgaG9zdCBmb28uYmFyLmJhei5jb20KICBpZiBmYWlsIC4uLgogIChsb2cgaW4pCgogICBOb3cgeW91IGhhdmUgYm90aCBhbiBGVFAgYW5kIFRlbG5ldCBjb25uZWN0aW9uIHRvIHRoZSBzYW1lIGhvc3QgKG9mCiAgIGNvdXJzZSB0aGV5IGNvdWxkIGFsc28gYmUgdG8gZGlmZmVyZW50IGhvc3RzLCBhbmQgeW91IGNvdWxkIGFsc28gaGF2ZQogICBhIGRpcmVjdCBvciBkaWFsZWQgc2VyaWFsIGNvbm5lY3Rpb24gaW5zdGVhZCBvZiBhIFRlbG5ldCBjb25uZWN0aW9uKS4KICAgTm93IGFzc3VtaW5nIHlvdSBoYXZlIGEgS2VybWl0IHNlcnZlciBvbiB0aGUgZmFyIGVuZCBvZiB0aGUgS2VybWl0CiAgIGNvbm5lY3Rpb246CgogIHJjZCBpbmNvbWluZyAgICAgIDsgQ2hhbmdlcyBLZXJtaXQgc2VydmVyJ3MgZGlyZWN0b3J5ICg9IFJFTU9URSBDRCkKICBmdHAgY2QgaW5jb21pbmcgICA7IENoYW5nZXMgRlRQIHNlcnZlcidzIGRpcmVjdG9yeQogIHB1dCBvb2ZhLnR4dCAgICAgIDsgU2VuZHMgYSBmaWxlIG9uIHRoZSBLZXJtaXQgY29ubmVjdGlvbgogIGZ0cCBwdXQgb29mYS50eHQgIDsgU2VuZHMgYSBmaWxlIG9uIHRoZSBGVFAgY29ubmVjdGlvbgogIGJ5ZSAgICAgICAgICAgICAgIDsgU2h1dHMgZG93biB0aGUgS2VybWl0IGNvbm5lY3Rpb24KICBmdHAgYnllICAgICAgICAgICA7IFNodXRzIGRvd24gdGhlIEZUUCBjb25uZWN0aW9uCgogICBOb3RlIHRoYXQgUFVUIGFuZCBTRU5EIGFyZSBzeW5vbnltcyBmb3IgYm90aCBGVFAgYW5kIEtlcm1pdAogICBjb25uZWN0aW9ucy4KCiAgIFlvdSBjYW4gYWxzbyBlc3RhYmxpc2ggZHVhbCBzZXNzaW9ucyBvbiB0aGUgS2VybWl0IGNvbW1hbmQgbGluZToKCiAga2VybWl0IC1qIGhvc3QxIC05IGhvc3QyCgogICBUaGlzIG1ha2VzIGEgVGVsbmV0IGNvbm5lY3Rpb24gdG8gaG9zdDEgYW5kIGFuIEZUUCBjb25uZWN0aW9uIHRvCiAgIGhvc3QyLgoKICAgWyBbMzM5XVRvcCBdIFsgWzM0MF1GVFAgVG9wIF0gWyBbMzQxXUMtS2VybWl0IEhvbWUgXSBbIFszNDJdS2VybWl0CiAgIEhvbWUgXQogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDMuMTAuIEF1dG9tYXRpbmcgRlRQIFNlc3Npb25zCgogICBNb3N0IG9mIEtlcm1pdCdzIHNjcmlwdGluZyBmZWF0dXJlcyBjYW4gYmUgdXNlZCB0byBtYWtlIGFuZCBjb250cm9sCiAgIEZUUCBzZXNzaW9uczogRk9SIGFuZCBXSElMRSBsb29wcywgSUYtRUxTRSBhbmQgU1dJVENIIGNvbnN0cnVjdGlvbnMsCiAgIHZhcmlhYmxlcywgYXJyYXlzLCBidWlsdC1pbiBmdW5jdGlvbnMsIGFuZCBhbGwgdGhlIHJlc3QuIFlvdSBjYW4ndCB1c2UKICAgSU5QVVQsIE1JTlBVVCwgT1VUUFVULCBDTEVBUiwgb3IgU0NSSVBUIG9uIGFuIEZUUCBzZXNzaW9uLCBidXQgdGhlc2UKICAgYXJlIG5vdCBuZWVkZWQgc2luY2UgdGhlIEZUUCBwcm90b2NvbCBpcyB3ZWxsIGRlZmluZWQuCgogICBbMzQzXUNMSUNLIEhFUkUgZm9yIGFuIEZUUCBzY3JpcHRpbmcgdHV0b3JpYWwuCgogICAgMy4xMC4xLiBGVFAtU3BlY2lmaWMgVmFyaWFibGVzIGFuZCBGdW5jdGlvbnMKCiAgIFRoZSBmb2xsb3dpbmcgdmFyaWFibGUgdGVsbHMgd2hldGhlciBhbiBGVFAgY29ubmVjdGlvbiBpcyBvcGVuOgoKICAgXHYoZnRwX2Nvbm5lY3RlZCkKICAgICAgICAgIDEgaWYgdGhlcmUgaXMgYW4gYWN0aXZlIEZUUCBjb25uZWN0aW9uLCAwIGlmIHRoZXJlIGlzbid0LgoKICAgVGhlIEZUUCBPUEVOIGNvbW1hbmQgc2V0czoKCiAgIFx2KGZ0cF9ob3N0KQogICAgICAgICAgVGhlIGhvc3QgdG8gd2hpY2ggdGhlIG1vc3QgcmVjZW50IEZUUCBjb25uZWN0aW9uIHdhcyBtYWRlLgoKICAgXHYoZnRwX3NlY3VyaXR5KQogICAgICAgICAgVGhlIHNlY3VyaXR5IG1ldGhvZCBuZWdvdGlhdGVkIGZvciB0aGUgY3VycmVudCBGVFAgc2Vzc2lvbi4gVGhlCiAgICAgICAgICB2YWx1ZSBpcyAiTlVMTCIgd2hlbiBubyBzZWN1cml0eSBpcyB1c2VkLiBTZWUgWzM0NF0zLjIuIE1ha2luZwogICAgICAgICAgU2VjdXJlIEZUUCBDb25uZWN0aW9ucy4KCiAgIFx2KGZ0cF9zZXJ2ZXIpCiAgICAgICAgICBUaGUgT1MgdHlwZSAoVU5JWCwgVk1TLCBldGMpIG9mIHRoZSBGVFAgc2VydmVyIGhvc3QuCgogICBUaGUgRlRQIFVTRVIgY29tbWFuZCAob3IgRlRQIE9QRU4gL1VTRVI6LCBvciBGVFAgd2l0aCBhdXRvbWF0aWMgbG9naW4pCiAgIHNldHM6CgogICBcdihmdHBfbG9nZ2VkaW4pCiAgICAgICAgICAxIGlmIHlvdSBhcmUgbG9nZ2VkIGluIHRvIGFuIEZUUCBzZXJ2ZXIsIDAgaWYgeW91IGFyZSBub3QuCgogICBUaGUgY3VycmVudCBDT01NQU5ELVBST1RFQ1RJT04tTEVWRUwgYW5kIERBVEEtUFJPVEVDVElPTi1MRVZFTCB2YWx1ZXMKICAgYXJlIHJlZmxlY3RlZCBpbjoKCiAgIFx2KGZ0cF9jcGwpCiAgIFx2KGZ0cF9kcGwpCiAgICAgICAgICBUaGUgdmFsdWVzIGFyZSAiY2xlYXIiLCAiY29uZmlkZW50aWFsIiwgInNhZmUiIG9yICJwcml2YXRlIi4KICAgICAgICAgIFNlZSBbMzQ1XTMuMi4gTWFraW5nIFNlY3VyZSBGVFAgQ29ubmVjdGlvbnMuCgogICBUaGUgRlRQIEdFVC1QVVQtUkVNT1RFIHNldHRpbmcgaXMgcmVmbGVjdGVkIGluOgoKICAgXHYoZnRwX2dldHB1dHJlbW90ZSkKICAgICAgICAgIFRoZSB2YWx1ZXMgYXJlICJhdXRvIiwgImZ0cCIsIG9yICJrZXJtaXQiLgoKICAgRXZlcnkgRlRQIGNvbW1hbmQgc2V0cyB0aGUgXHYoc3VjY2VzcykgdmFyaWFibGUsIGFzIHdlbGwgYXMgdGhlCiAgIGZvbGxvd2luZyB0d28gRlRQLXNwZWNpZmljIHZhcmlhYmxlczoKCiAgIFx2KGZ0cF9jb2RlKQogICAgICAgICAgVGhlIHN0YW5kYXJkaXplZCBudW1lcmljIEZUUCBwcm90b2NvbCBjb2RlIGZyb20gdGhlIHNlcnZlcidzCiAgICAgICAgICByZXNwb25zZSB0byB0aGUgbGFzdCBjbGllbnQgY29tbWFuZCwgYSAzLWRpZ2l0IGRlY2ltYWwgbnVtYmVyCiAgICAgICAgICBkZWZpbmVkIGluIFszNDZdUkZDOTU5LiBCcmllZmx5OgoKICAgICAgICAgIDF4eCA9IFBvc2l0aXZlIFByZWxpbWluYXJ5IFJlcGx5CiAgICAgICAgICAyeHggPSBQb3NpdGl2ZSBDb21wbGV0aW9uIFJlcGx5CiAgICAgICAgICAzeHggPSBQb3NpdGl2ZSBJbnRlcm1lZGlhdGUgUmVwbHkKICAgICAgICAgIDR4eCA9IFRyYW5zaWVudCBOZWdhdGl2ZSBDb21wbGV0aW9uIFJlcGx5CiAgICAgICAgICA1eHggPSBQZXJtYW5lbnQgTmVnYXRpdmUgQ29tcGxldGlvbiBSZXBseQoKICAgXHYoZnRwX21lc3NhZ2UpCiAgICAgICAgICBUaGUgdGV4dCBtZXNzYWdlLCBpZiBhbnksIGZyb20gdGhlIHNlcnZlcidzIHJlc3BvbnNlIHRvIHRoZQogICAgICAgICAgbGFzdCBjbGllbnQgY29tbWFuZC4gSWYgdGhlIG1vc3QgcmVjZW50IHJlc3BvbnNlIGhhZCBtdWx0aXBsZQogICAgICAgICAgbGluZXMsIHRoaXMgdmFyaWFibGUgaGFzIG9ubHkgdGhlIGZpbmFsIGxpbmUuIFRoZXNlIG1lc3NhZ2VzCiAgICAgICAgICBhcmUgbm90IHN0YW5kYXJkaXplZCBhbmQgdmFyeSBpbiBmb3JtYXQgYW5kIGNvbnRlbnQgZnJvbSBzZXJ2ZXIKICAgICAgICAgIHRvIHNlcnZlci4gU3lub255bTogXHYoZnRwX21zZykuCgogICBGVFAgZmlsZSB0cmFuc2ZlcnMgc2V0IHRoZSByZWd1bGFyIEtlcm1pdCB0cmFuc2ZlciBzdGF0dXMgdmFyaWFibGVzOgoKICBcdihjcHMpICAgICAgICAgQ2hhcmFjdGVycyBwZXIgc2Vjb25kIG9mIG1vc3QgcmVjZW50IHRyYW5zZmVyLgogIFx2KGZpbGVzcGVjKSAgICBGaWxlIHNwZWNpZmljYXRpb24gdXNlZCBpbiBtb3N0IHJlY2VudCB0cmFuc2Zlci4KICBcdihmc2l6ZSkgICAgICAgU2l6ZSBvZiBmaWxlIG1vc3QgcmVjZW50bHkgdHJhbnNmZXJyZWQuCiAgXHYodGZzaXplKSAgICAgIFRvdGFsIHNpemUgb2YgZmlsZSBncm91cCBtb3N0IHJlY2VudGx5IHRyYW5zZmVycmVkLgogIFx2KHhmZXJzdGF0dXMpICBTdGF0dXMgb2YgbW9zdCByZWNlbnQgdHJhbnNmZXIgKDAgPSBzdWNjZXNzLCAxID0gZmFpbHVyZSkuCiAgXHYodGZ0aW1lKSAgICAgIEVsYXBzZWQgdGltZSBvZiBtb3N0IHJlY2VudCB0cmFuc2ZlciwgaW4gc2Vjb25kcy4KCiAgIER1cmluZyBhbiBGVFAgdHJhbnNmZXIsIHRoZSBwZXItZmlsZSB2YXJpYWJsZXMgYXJlOgoKICBcdihmaWxlbmFtZSkgICAgTmFtZSBvZiBjdXJyZW50IGZpbGUuCiAgXHYoZmlsZW51bWJlcikgIE9yZGluYWwgZmlsZSBudW1iZXIgaW4gZ3JvdXAgKDEsIDIsIDMsIC4uLikKICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDMuMTAuMi4gRXhhbXBsZXMKCiAgIExldCdzIGJlZ2luIHdpdGggYSBzaW1wbGUgZXhhbXBsZSBzaG93aW5nIGhvdyB0byBsb2cgaW4sIHNlbmQgc29tZQogICBmaWxlcywgYW5kIGxvZyBvdXQ6CgogIGRlZmluZSBlcnJvciBpZiBmYWlsIHsgZnRwIGJ5ZSwgc3RvcCAxIEVycm9yOiBcJTEgfQogIHNldCB0cmFuc2FjdCBicmllZgogIGxvZyB0CiAgZnRwIGZ0cC54eXpjb3JwLmNvbSAvYW5vbnltb3VzCiAgaWYgZmFpbCBzdG9wIDEgQ29ubmVjdGlvbiBmYWlsZWQKICBpZiBub3QgXHYoZnRwX2xvZ2dlZGluKSBzdG9wIDEgTG9naW4gZmFpbGVkCiAgZnRwIGNkIGluY29taW5nCiAgZXJyb3Ige2Z0cCBjZH0KICBjZCB1cGxvYWQKICBlcnJvciB7bG9jYWwgY2R9CiAgZnRwIHB1dCAvZGVsZXRlICoKICBlcnJvciB7cHV0fQogIGZ0cCBieWUKCiAgIEZpcnN0IHdlIGRlZmluZSBhbiBlcnJvciBoYW5kbGluZyBtYWNybyB0byBiZSB1c2VkIGFmdGVyIHRoZQogICBjb25uZWN0aW9uIGlzIG1hZGUuIFRoZW4gd2Ugc2V0IHVwIGEgYnJpZWYtZm9ybWF0IHRyYW5zYWN0aW9uIGxvZyB0bwogICBrZWVwIGEgcmVjb3JkIG9mIG91ciBmaWxlIHRyYW5zZmVycy4gVGhlbiB3ZSBtYWtlIGEgY29ubmVjdGlvbiB0byB0aGUKICAgaG9zdCBhbmQgbG9nIGluIGFub255bW91c2x5LiBUaGUgImlmIGZhaWwiIGNvbW1hbmQgY2hlY2tzIHdoZXRoZXIgdGhlCiAgIGNvbm5lY3Rpb24gd2FzIG1hZGUuIFRoZSAiaWYgbm90IiBjb21tYW5kIGNoZWNrcyB3aGV0aGVyIGxvZ2luIHdhcwogICBzdWNjZXNzZnVsLiBPYnZpb3VzbHkgdGhlIHNjcmlwdCBzaG91bGQgbm90IGNvbnRpbnVlIHVubGVzcyBib3RoIHRlc3RzCiAgIHN1Y2NlZWQuCgogICBOZXh0IHdlIGNoYW5nZSB0byB0aGUgc2VydmVyJ3MgJ2luY29taW5nJyBkaXJlY3RvcnkgYW5kIHRvIG91ciBvd24KICAgJ3VwbG9hZCcgZGlyZWN0b3J5LCBhbmQgc2VuZCBhbGwgdGhlIGZpbGVzIHRoYXQgYXJlIGluIGl0ICh0aGV5IGNhbiBiZQogICBhbnkgbWl4dHVyZSBvZiB0ZXh0IGFuZCBiaW5hcnkgZmlsZXMpLCBkZWxldGluZyBlYWNoIHNvdXJjZSBmaWxlCiAgIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgaXQgaXMgc3VjY2Vzc2Z1bGx5IHVwbG9hZGVkLiBFYWNoIG9mIHRoZXNlCiAgIG9wZXJhdGlvbnMgaXMgY2hlY2tlZCB3aXRoIHRoZSBFUlJPUiBtYWNybywgd2hpY2ggcHJldmVudHMgdGhlIHNjcmlwdAogICBmcm9tIGNvbnRpbnVpbmcgcGFzdCBhIGZhaWx1cmUuCgogICBGaW5hbGx5IHdlIGNsb3NlIHRoZSBGVFAgc2Vzc2lvbiB3aXRoIHRoZSAiYnllIiBjb21tYW5kLgoKICAgSnVzdCBsaWtlIGFueSBvdGhlciBLZXJtaXQgc2NyaXB0LCB0aGlzIG9uZSBjYW4gYmUgdXNlZCBpbiBtYW55IHdheXM6CgogICAgICogSXQgY2FuIGJlIHN0b3JlZCBpbiBhIGZpbGUsIGFuZCBLZXJtaXQgY2FuIGJlIHRvbGQgdG8gVEFLRSB0aGUKICAgICAgIGZpbGUuCiAgICAgKiBJbiBVTklYLCBpdCBjYW4gYmUgYSAiWzM0N11rZXJiYW5nIiBzY3JpcHQgYW5kIHRoZXJlZm9yZSBydW4KICAgICAgIGRpcmVjdGx5IGZyb20gdGhlIHNoZWxsIHByb21wdCBvciBhcyBhIGNyb24gam9iLgoKICAgV2UgY291bGQgaGF2ZSB1c2VkIGNvbW1hbmQgc2hvcnRjdXRzIGxpa2UgInJjZCIsICJwdXQiLCBhbmQgImJ5ZSIsIGJ1dAogICBzaW5jZSB0aGV5IGNhbiBiZSBhbWJpZ3VvdXMgdW5kZXIgY2VydGFpbiBjaXJjdW1zdGFuY2VzLCBpdCBpcyBiZXR0ZXIKICAgdG8gYXZvaWQgdGhlbSBpbiBzY3JpcHRzOyB0aGV5IGFyZSBpbnRlbmRlZCBtYWlubHkgZm9yIGNvbnZlbmllbmNlCiAgIGR1cmluZyBpbnRlcmFjdGl2ZSB1c2UuIEhvd2V2ZXIsIGlmIHlvdSB3aXNoIHRvIHVzZSB0aGUgc2hvcnRjdXRzIGluIGEKICAgc2NyaXB0LCB5b3UgY2FuIGRvIGl0IHRoaXMgd2F5IChlcnJvciBoYW5kbGluZyBvbWl0dGVkIGZvciBicmV2aXR5KToKCiAgbG9jYWwgXCV0ICAgICAgICAgICAgICAgICAgICAgICA7IERlY2xhcmUgYSBsb2NhbCB0ZW1wb3JhcnkgdmVyaWFibGUKICBhc3NpZ24gXCV0IFx2KGZ0cF9nZXRwdXRyZW1vdGUpIDsgU2F2ZSBjdXJyZW50IEZUUCBHRVQtUFVULVJFTU9URSBzZXR0aW5nCiAgc2V0IGZ0cCBnZXQtcHV0LXJlbW90ZSBmdHAgICAgICA7IENob29zZSBGVFAgb3JpZW50YXRpb24KICBmdHAgeHl6Y29ycC5jb20gL2Fub255bW91cyAgICAgIDsgT3BlbiBhbiBGVFAgY29ubmVjdGlvbgogIGdldCBvb2ZhLnR4dCAgICAgICAgICAgICAgICAgICAgOyBHRVQgYSBmaWxlCiAgcHV0IGZvby5iYXIgICAgICAgICAgICAgICAgICAgICA7IFBVVCBhIGZpbGUKICByZGVsIHllc3RlcmRheS5sb2cgICAgICAgICAgICAgIDsgRGVsZXRlIGEgZmlsZSBvbiB0aGUgc2VydmVyCiAgYnllICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IExvZyBvdXQgYW5kIGRpc2Nvbm5lY3QgZnJvbSBzZXJ2ZXIuCiAgc2V0IGZ0cCBnZXQtcHV0LXJlbW90ZSBcJXQgICAgICA7IFJlc3RvcmUgcHJldmlvdXMgR0VULVBVVC1SRU1PVEUgc2V0dGluZwoKICAgT2YgY291cnNlLCBGVFAgc2NyaXB0cyBjYW4gYWxzbyBiZSB3cml0dGVuIGFzIG1hY3Jvcy4gVGhpcyBsZXRzIHlvdQogICBwYXNzIHBhcmFtZXRlcnMgc3VjaCBhcyBob3N0bmFtZXMsIHVzZXJuYW1lcywgYW5kIGZpbGVuYW1lcyB0byB0aGVtOgoKICBkZWZpbmUgZG9mdHBnZXQgewogICAgICBpZiA8IFx2KGFyZ2MpIDQgZW5kIDEgVXNhZ2U6IFwlMCBob3N0IHVzZXIgcmVtb3RlZmlsZSBbIGxvY2FsZmlsZSBdCiAgICAgIGZ0cCBcJTEgL3VzZXI6XCUyCiAgICAgIGlmIGZhaWwgZW5kIDEgRlRQIE9QRU4gXCUxIGZhaWxlZAogICAgICBpZiBub3QgXHYoZnRwX2xvZ2dlZGluKSBlbmQgMSBGVFAgTE9HSU4gZmFpbGVkCiAgICAgIGZ0cCBnZXQge1wlM30ge1wlNH0KICAgICAgaWYgZmFpbCBlbmQgMSBGVFAgR0VUIFwlMyBmYWlsZWQKICAgICAgZnRwIGJ5ZQogIH0KCiAgIEFkZCB0aGlzIGRlZmluaXRpb24gdG8geW91ciBLZXJtaXQgY3VzdG9taXphdGlvbiBmaWxlLCBhbmQgaXQgd2lsbAogICBhbHdheXMgYmUgYXZhaWxhYmxlIHdoZW4geW91IHN0YXJ0IEtlcm1pdC4gVGhpcyBtYWNybyBsZXRzIHlvdQogICBkb3dubG9hZCBhIGZpbGUgd2l0aCBGVFAgYnkgZ2l2aW5nIGEgc2luZ2xlIGNvbW1hbmQsIGUuZy46CgogIGRvZnRwZ2V0IHh5emNvcnAuY29tIGFub255bW91cyBvb2ZhLnR4dAogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgMy4xMC4zLiBBdXRvbWF0aW5nIFNlY3VyZSBGVFAgU2Vzc2lvbnMKCiAgIE9mdGVuIHdoZW4gbWFraW5nIHNlY3VyZSBjb25uZWN0aW9ucywgeW91IGFyZSBwcm9tcHRlZCBpbnRlcmFjdGl2ZWx5CiAgIGZvciBjZXJ0YWluIGluZm9ybWF0aW9uIG9yIHBlcm1pc3Npb24gdG8gcHJvY2VlZC4gVGhlc2UgcHJvbXB0cyBjYW4KICAgc3RvcCBhbiBhdXRvbWF0ZWQgcHJvY2VkdXJlLiBUbyBhdm9pZCB0aGVtLCB5b3UgbXVzdCBnaXZlIHRoZQogICBhcHByb3ByaWF0ZSBjb21tYW5kcyB0byBkaXNhYmxlIHRoZW0sIGFuZC9vciBzdXBwbHkgdGhlIHByb21wdGVkLWZvcgogICBpbmZvcm1hdGlvbiBiZWZvcmVoYW5kLiBIZXJlIGFyZSBhIGZldyBoaW50czoKCiAgICAgKiBNYWtlIHN1cmUgdGhhdCBTRVQgVEFLRSBFUlJPUiBhbmQgU0VUIE1BQ1JPIEVSUk9SIGFyZSBib3RoIE9GRi4KICAgICAgIFRoaXMgaXMgdGhlIGRlZmF1bHQsIGJ1dCBpbiBjYXNlIHlvdSBoYXZlIHNldCBlaXRoZXIgb25lIG9mIHRoZXNlCiAgICAgICBPTiBpbiB5b3VyIHNjcmlwdCBvciBpbml0aWFsaXphdGlvbiBmaWxlLCB0aGlzIG1ha2VzIHRoZSBzY3JpcHQKICAgICAgIGhhbHQgb24gYW55IGtpbmQgb2YgZXJyb3IuIE5vcm1hbGx5IHlvdSB3b3VsZCB3YW50IHRvIGNoZWNrIGVhY2gKICAgICAgIG9wZXJhdGlvbiBmb3Igc3VjY2VzcyBvciBmYWlsdXJlIGFuZCB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbi4KICAgICAqIE9uIFNTTCBhbmQgVExTIGNvbm5lY3Rpb25zLCB5b3UgbWF5IGJlIGFza2VkIHdoZXRoZXIgaXQgaXMgT0sgdG8KICAgICAgIHByb2NlZWQgd2l0aCBhIGNvbm5lY3Rpb24gdG8gc2VydmVyIHRoYXQgcHJlc2VudHMgYSBzZWxmLXNpZ25lZAogICAgICAgY2VydGlmaWNhdGUuIFlvdSBjYW4gdXNlIHRoZSBTRVQgQVVUSEVOVElDQVRJT04gU1NMIChvciBUTFMpCiAgICAgICBWRVJJRlkgb3IgU0VUIEFVVEggU1NMIChvciBUTFMpIENFUlRTLU9LIGNvbW1hbmRzIHRvIGF2b2lkIHRoaXMKICAgICAgIHByb21wdCBieSBub3QgcmVxdWVzdGluZyBhIGNlcnRpZmljYXRlIGZyb20gdGhlIHBlZXIuCiAgICAgKiAoTW9yZSB0byBiZSBhZGRlZC4uLikKCiAgIFsgWzM0OF1Ub3AgXSBbIFszNDldRlRQIFRvcCBdIFsgWzM1MF1GVFAgU2NyaXB0IFR1dG9yaWFsIF0gWwogICBbMzUxXUMtS2VybWl0IEhvbWUgXSBbIFszNTJdS2VybWl0IEhvbWUgXQogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDMuMTEuIEFkdmFuY2VkIEZUUCBQcm90b2NvbCBGZWF0dXJlcwoKICAgVGhlIHJlbWFpbmRlciBvZiB0aGUgRlRQIGRvY3VtZW50aW9uICh0aHJvdWdoIHRoZSBlbmQgb2YgU2VjdGlvbiAzKSBpcwogICBuZXcgdG8gQy1LZXJtaXQgOC4wLjIwNiwgYnV0IHdlIGxlYXZlIGl0IGluIGJsYWNrIHRvIHByZXZlbnQKICAgaGVhZGFjaGVzLiBFeGNlcHQgZm9yIHRpdGxlcy4KICAgICAqIFszNTNdVEVSTUlOT0xPR1kKICAgICAqIFszNTRdRkVBVFVSRSBORUdPVElBVElPTgogICAgICogWzM1NV1VU0lORyBNR0VUOiBOTFNUIFZFUlNVUyBNTFNECiAgICAgKiBbMzU2XUVYQU1QTEVTCiAgICAgKiBbMzU3XVJFRkVSRU5DRVMKCiAgIFRoZSBuZXcgcmVsZWFzZXMgb2YgWzM1OF1DLUtlcm1pdCAoOC4wLjIwNikgYW5kIFszNTldS2VybWl0IDk1ICgyLjEpCiAgIHN1cHBvcnQgbmV3IEZUUCBwcm90b2NvbCBmZWF0dXJlcyBmcm9tIFJGQyAyMzg5IGFzIHdlbGwgYXMgbW9zdCBvZgogICB3aGF0J3MgaW4gdGhlIEVseiBhbmQgSGV0aG1vbiBFeHRlbnNpb25zIHRvIEZUUCBJbnRlcm5ldCBEcmFmdCAoc2VlCiAgIFszNjBdUmVmZXJlbmNlcykuIFNvbWUgb2YgdGhlc2UgZmVhdHVyZXMsIHN1Y2ggYXMgU0laRSAocmVxdWVzdCBhCiAgIGZpbGUncyBzaXplKSwgTURUTSAocmVxdWVzdCBmaWxlJ3MgbW9kaWZpY2F0aW9uIHRpbWUpLCBhbmQgUkVTVAogICAocmVzdGFydCBpbnRlcnJ1cHRlZCB0cmFuc2ZlcikgaGF2ZSBiZWVuIHdpZGVseSBpbXBsZW1lbnRlZCBpbiBGVFAKICAgY2xpZW50cyBhbmQgc2VydmVycyBmb3IgeWVhcnMgKGFzIHdlbGwgYXMgaW4gdGhlIGluaXRpYWwgcmVsZWFzZSBvZgogICB0aGUgS2VybWl0IEZUUCBjbGllbnRzKS4gT3RoZXJzIHN1Y2ggYXMgRkVBVCBhbmQgTUxTRCBhcmUgcmFyZWx5IHNlZW4KICAgYW5kIGFyZSBuZXcgdG8gdGhlIHVwY29taW5nIEtlcm1pdCByZWxlYXNlcy4gVFZGUyAoVHJpdmlhbCBWaXJ0dWFsCiAgIEZpbGUgU3RvcmUpIGlzIHN1cHBvcnRlZCBpbXBsaWNpdGx5LCBhbmQgdGhlIFVURi04IGNoYXJhY3Rlci1zZXQgaXMKICAgYWxyZWFkeSBmdWxseSBzdXBwb3J0ZWQgYXQgdGhlIHByb3RvY29sIGFuZCBkYXRhLWludGVyY2hhbmdlIGxldmVsLgoKICAgRm9yIEtlcm1pdCB1c2VycywgdGhlIG1haW4gYmVuZWZpdCBvZiB0aGUgbmV3IEZUUCBwcm90b2NvbCBleHRlbnNpb25zCiAgIGlzIHRoZSBhYmlsaXR5IHRvIGRvIHJlY3Vyc2l2ZSBkb3dubG9hZHMuIEJ1dCB0aGUgZXh0ZW5zaW9ucyBhbHNvCiAgIGludHJvZHVjZSBjb21wbGljYXRpb25zIGFuZCB0cmFkZW9mZnMgdGhhdCB5b3Ugc2hvdWxkIGJlIGF3YXJlIG9mLiBPZgogICBjb3Vyc2UgS2VybWl0IHRyaWVzIHRvICJkbyB0aGUgcmlnaHQgdGhpbmciIGF1dG9tYXRpY2FsbHkgaW4gZXZlcnkKICAgY2FzZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIEJ1dCAoYXMgbm90ZWQgbGF0ZXIpIHNvbWUgY2FzZXMgYXJlCiAgIGluaGVyZW50bHkgYW1iaWd1b3VzIGFuZC9vciBjYW4gcmVzdWx0IGluIG5hc3R5IHN1cnByaXNlcywgYW5kIGZvcgogICB0aG9zZSBzaXR1YXRpb25zIG5ldyBjb21tYW5kcyBhbmQgc3dpdGNoZXMgYXJlIGF2YWlsYWJsZSB0byBnaXZlIHlvdQogICBwcmVjaXNlIGNvbnRyb2wgb3ZlciBLZXJtaXQncyBiZWhhdmlvciwgaW4gY2FzZSB0aGUgZGVmYXVsdHMgZG9uJ3QKICAgcHJvZHVjZSB0aGUgZGVzaXJlZCByZXN1bHRzLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAzLjExLjEuIFRlcm1pbm9sb2d5IENvbW1hbmQtbGluZSBGVFAgY2xpZW50cyBzdWNoIGFzIEtlcm1pdCAoYXMgd2VsbAogICBhcyB0aGUgdHJhZGl0aW9uYWwgRlRQIHByb2dyYW1zIGZvdW5kIG9uIFVuaXgsIFZNUywgLi4uLCBldmVuIFdpbmRvd3MpCiAgIGhhdmUgY29tbWFuZHMgbGlrZSBQVVQsIE1QVVQsIEdFVCwgTUdFVCwgYW5kIEJZRSwgd2hpY2ggdGhleSBjb252ZXJ0CiAgIGludG8gemVybyBvciBtb3JlIEZUUCBwcm90b2NvbCBjb21tYW5kcywgc3VjaCBhcyBOTFNULCBSRVRSLCBRVUlULiBGb3IKICAgY2xhcml0eSwgd2UnbGwgdXNlICJjb21tYW5kIiB0byByZWZlciB0byBjb21tYW5kcyBnaXZlbiBieSB0aGUgdXNlciB0bwogICB0aGUgRlRQIGNsaWVudCwgYW5kICJkaXJlY3RpdmUiIGZvciBGVFAgcHJvdG9jb2wgY29tbWFuZHMgc2VudCBieSB0aGUKICAgRlRQIGNsaWVudCB0byB0aGUgRlRQIHNlcnZlci4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgMy4xMS4yLiBGZWF0dXJlIE5lZ290aWF0aW9uIE5ldyBGVFAgcHJvdG9jb2wgZmVhdHVyZXMgYXJlIG5lZ290aWF0ZWQKICAgYnkgdGhlIGNsaWVudCBzZW5kaW5nIGEgRkVBVCBkaXJlY3RpdmUgYW5kIHRoZSBzZXJ2ZXIgcmVzcG9uZGluZyB3aXRoCiAgIGEgbGlzdCBvZiAobmV3KSBmZWF0dXJlcyBpdCBzdXBwb3J0cywgb3IgZWxzZSB3aXRoIGFuIGVycm9yIGluZGljYXRpb24KICAgaWYgaXQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgRkVBVCBkaXJlY3RpdmUgYXQgYWxsLCBpbiB3aGljaCBjYXNlIHRoZQogICBjbGllbnQgaGFzIHRvIGd1ZXNzIHdoaWNoIG5ldyBmZWF0dXJlcyBpdCBzdXBwb3J0cyAoS2VybWl0IGd1ZXNzZXMKICAgdGhhdCBpdCBzdXBwb3J0cyBTSVpFIGFuZCBNRFRNIGJ1dCBub3QgTUxTVCkuIE5vdGUgdGhhdCB0aGUgTUxTVAogICBmZWF0dXJlIGluY2x1ZGVzIE1MU0QsIHdoaWNoIGlzIG5vdCBsaXN0ZWQgc2VwYXJhdGVseSBhcyBhIGZlYXR1cmUuCgogICBHdWVzc2luZyBpcyBuaWNlIHdoZW4gaXQgd29ya3MsIGJ1dCBzb21ldGltZXMgaXQgZG9lc24ndCwgYW5kIHNvbWUgRlRQCiAgIHNlcnZlcnMgYmVjb21lIGNvbmZ1c2VkIHdoZW4geW91IHNlbmQgdGhlbSBhIGRpcmVjdGl2ZSB0aGV5IGRvbid0CiAgIHVuZGVyc3RhbmQsIG9yIHRoZXkgZG8gc29tZXRoaW5nIHlvdSBkaWRuJ3Qgd2FudCwgc29tZXRpbWVzIHRvIHRoZQogICBwb2ludCBvZiBjbG9zaW5nIHRoZSBjb25uZWN0aW9uLiBGb3IgdGhpcyByZWFzb24sIEtlcm1pdCBsZXRzIHlvdQogICBvdmVycmlkZSBkZWZhdWx0IG9yIG5lZ290aWF0ZWQgZmVhdHVyZXMgd2l0aCB0aGUgZm9sbG93aW5nIG5ldwogICBjb21tYW5kczoKCiAgIEZUUCB7IEVOQUJMRSwgRElTQUJMRSB9IEZFQVQKICAgICAgICAgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGF1dG9tYXRpYyBzZW5kaW5nIG9mIGEgRkVBVCBkaXJlY3RpdmUKICAgICAgICAgIHVwb24gY29ubmVjdGlvbiB0byBhbiBGVFAgc2VydmVyLiBOb3RlIHRoYXQKICAgICAgICAgIEZUUCBbIE9QRU4gXSAvTk9JTklUICAgYWxzbyBpbmhpYml0cyBzZW5kaW5nIHRoZSBGRUFUIGRpcmVjdGl2ZQogICAgICAgICAgKGFuZCBzZXZlcmFsIG90aGVycykgZm9yIHRoZSBjb25uZWN0aW9uIGJlaW5nIE9QRU4nZCwgYnV0CiAgICAgICAgICB3aXRob3V0IG5lY2Vzc2FyaWx5IGRpc2FibGluZyBGRUFUIGZvciBzdWJzZXF1ZW50IGNvbm5lY3Rpb25zCiAgICAgICAgICBpbiB0aGUgc2FtZSBLZXJtaXQgaW5zdGFuY2UuIEZFQVQgaXMgRU5BQkxFRCBieSBkZWZhdWx0LCBpbgogICAgICAgICAgd2hpY2ggY2FzZSBtYW55IEZUUCBzZXJ2ZXJzIGFyZSBsaWtlbHkgdG8gcmVwbHk6Cgo1MDAgJ0ZFQVQnOiBjb21tYW5kIG5vdCB1bmRlcnN0b29kCgogICAgICAgICAgd2hpY2ggaXMgbm9ybWFsbHkgaGFybWxlc3MgKGJ1dCB5b3UgbmV2ZXIga25vdykuIChJbiBDLUtlcm1pdAogICAgICAgICAgOC4wLjIwOCwgdGhpcyBlcnJvciBtZXNzYWdlIGlzIHN1cHByZXNzZWQgdW5sZXNzIHlvdSBTRVQgRlRQCiAgICAgICAgICBERUJVRyBPTi4pCgogICBGVFAgRU5BQkxFIHsgTURUTSwgTUxTVCwgU0laRSB9CiAgICAgICAgICBFbmFibGVzIHRoZSBnaXZlbiBkaXJlY3RpdmUgZm9yIGltcGxpY2l0IHVzZSBieSB0aGUgRlRQIEdFVCBhbmQKICAgICAgICAgIE1HRVQgY29tbWFuZHMgaW4gY2FzZSBpdCBoYXMgYmVlbiBkaXNhYmxlZCBvciBlcnJvbmVvdXNseQogICAgICAgICAgb21pdHRlZCBieSB0aGUgc2VydmVyIGluIGl0cyBGRUFUIHJlc3BvbnNlLiBOb3RlOiBNTFNEIGNhbiBiZQogICAgICAgICAgdXNlZCBpbiB0aGUgRlRQIEVOQUJMRSBhbmQgRElTQUJMRSBjb21tYW5kcyBhcyBhIHN5bm9ueW0gZm9yCiAgICAgICAgICBNTFNULiBZT1UgTVVTVCBHSVZFIFRISVMgQ09NTUFORCBBRlRFUiBNQUtJTkcgVEhFIEZUUAogICAgICAgICAgQ09OTkVDVElPTi4KCiAgIEZUUCBESVNBQkxFIHsgTURUTSwgTUxTVCwgU0laRSB9CiAgICAgICAgICBEaXNhYmxlcyBpbXBsaWNpdCB1c2Ugb2YgdGhlIGdpdmVuIGRpcmVjdGl2ZSBieSBHRVQgb3IgTUdFVCBpbgogICAgICAgICAgY2FzZSBpdCBjYXVzZXMgcHJvYmxlbXM7IGZvciBleGFtcGxlLCBiZWNhdXNlIGl0IG1ha2VzCiAgICAgICAgICBtdWx0aWZpbGUgZG93bmxvYWRzIHRha2UgdG9vIGxvbmcgb3IgdGhlIHNlcnZlciBhbm5vdW5jZXMgaXQKICAgICAgICAgIGVycm9uZW91c2x5IG9yIG1pc2ltcGxlbWVudHMgaXQuIFVzZSBESVNBQkxFIEZFQVQgYmVmb3JlIG1ha2luZwogICAgICAgICAgYSBjb25uZWN0aW9uIHRvIHByZXZlbnQgS2VybWl0IGZyb20gc2VuZGluZyB0aGUgRkVBVCBkaXJlY3RpdmUKICAgICAgICAgIGFzIHBhcnQgb2YgaXRzIGluaXRpYWwgc2VxdWVuY2UuIE5vdGUgdGhhdCBkaXNhYmxpbmcgRkVBVCwKICAgICAgICAgIFNJWkUsIG9yIE1EVE0gZG9lcyBub3QgcHJldmVudCB5b3UgZnJvbSBleGVjdXRpbmcgZXhwbGljaXQgRlRQCiAgICAgICAgICBGRUFUVVJFUywgRlRQIFNJWkUsIG9yIEZUUCBNT0RUSU1FIGNvbW1hbmRzLiBBbHNvIG5vdGUgdGhhdAogICAgICAgICAgZGlzYWJsaW5nIFNJWkUgcHJldmVudHMgUFVUIC9SRVNUQVJUIChyZWNvdmVyeSBvZiBpbnRlcnJ1cHRlZAogICAgICAgICAgdXBsb2FkcykgZnJvbSB3b3JraW5nLiBZT1UgTVVTVCBHSVZFIFRISVMgQ09NTUFORCBBRlRFUiBNQUtJTkcKICAgICAgICAgIFRIRSBGVFAgQ09OTkVDVElPTi4KCiAgIFRvIGVuYWJsZSBvciBkaXNhYmxlIG1vcmUgdGhhbiBvbmUgZmVhdHVyZSwgdXNlIG11bHRpcGxlIEZUUCBFTkFCTEUgb3IKICAgRlRQIERJU0FCTEUgY29tbWFuZHMuIFRoZSBTSE9XIEZUUCBjb21tYW5kIHNob3dzIHdoaWNoIGZlYXR1cmVzIGFyZQogICBjdXJyZW50bHkgZW5hYmxlZCBhbmQgZGlzYWJsZWQuCgogICBGVFAgRkVBVFVSRVMKICAgICAgICAgIFRoaXMgY29tbWFuZCBzZW5kcyBhIEZFQVQgZGlyZWN0aXZlIHRvIHRoZSBzZXJ2ZXIuIEluIGNhc2UgeW91CiAgICAgICAgICBoYXZlIGJlZW4gZGlzYWJsaW5nIGFuZCBlbmFibGluZyBkaWZmZXJlbnQgZmVhdHVyZXMsIHRoaXMKICAgICAgICAgIHJlc3luY2hyb25pemVzIEtlcm1pdCdzIGZlYXR1cmUgbGlzdCB3aXRoIHRoZSBzZXJ2ZXIncy4gSWYgdGhlCiAgICAgICAgICBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgRkVBVCBkaXJlY3RpdmUsIEtlcm1pdCdzIGZlYXR1cmUKICAgICAgICAgIGxpc3QgaXMgbm90IGNoYW5nZWQuCgogICBGVFAgT1BUSU9OUyBkaXJlY3RpdmUKICAgICAgICAgIEluZm9ybWF0aW9uYWwgb25seTogdGhlIHNlcnZlciB0ZWxscyB3aGF0IG9wdGlvbnMsIGlmIGFueSwgaXQKICAgICAgICAgIHN1cHBvcnRzIGZvciB0aGUgZ2l2ZW4gZGlyZWN0aXZlLCBlLmcuIE1MU1QuIEZhaWxzIGlmIHRoZQogICAgICAgICAgc2VydmVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIE9QVFMgZGlyZWN0aXZlIG9yIGlmIHRoZSBkaXJlY3RpdmUKICAgICAgICAgIGZvciB3aGljaCBvcHRpb25zIGFyZSByZXF1ZXN0ZWQgaXMgbm90IHZhbGlkLiBUaGUgZGlyZWN0aXZlIGlzCiAgICAgICAgICBjYXNlLWluc2Vuc2l0aXZlLgoKICAgRlRQIFNJWkUgZmlsZW5hbWUKICAgICAgICAgIFNlbmRzIGEgU0laRSBkaXJlY3RpdmUgdG8gdGhlIHNlcnZlciBmb3IgdGhlIGdpdmVuIGZpbGUuIFRoZQogICAgICAgICAgZmlsZW5hbWUgbXVzdCBub3QgY29udGFpbiB3aWxkY2FyZHMuIFRoZSBzZXJ2ZXIgcmVzcG9uZHMgd2l0aAogICAgICAgICAgYW4gZXJyb3IgaWYgdGhlIGZpbGUgY2FuJ3QgYmUgZm91bmQsIGlzIG5vdCBhY2Nlc3NpYmxlLCBvciB0aGUKICAgICAgICAgIFNJWkUgZGlyZWN0aXZlIGlzIG5vdCBzdXBwb3J0ZWQsIG90aGVyd2lzZSB3aXRoIHRoZSBsZW5ndGggb2YKICAgICAgICAgIHRoZSBmaWxlIGluIGJ5dGVzLCB3aGljaCBLZXJtaXQgZGlzcGxheXMgYW5kIGFsc28gbWFrZXMKICAgICAgICAgIGF2YWlsYWJsZSB0byB5b3UgaW4gaXRzIFx2KGZ0cF9tZXNzYWdlKSB2YXJpYWJsZS4gSWYgdGhlCiAgICAgICAgICBkaXJlY3RpdmUgaXMgc3VjY2Vzc2Z1bCwgS2VybWl0IChyZS0pZW5hYmxlcyBpdCBmb3IgaW50ZXJuYWwKICAgICAgICAgIHVzZSBieSB0aGUgR0VUIGFuZCBNR0VUIGRpcmVjdGl2ZXMgb24gdGhpcyBjb25uZWN0aW9uLgoKICAgRlRQIE1PRFRJTUUgZmlsZW5hbWUKICAgICAgICAgIFdvcmtzIGp1c3QgbGlrZSB0aGUgU0laRSBkaXJlY3RpdmUgZXhjZXB0IGl0IHNlbmRzIGFuIE1EVE0KICAgICAgICAgIGRpcmVjdGl2ZS4gVXBvbiBzdWNjZXNzLCB0aGUgc2VydmVyIHNlbmRzIG1vZGlmaWNhdGlvbgogICAgICAgICAgZGF0ZS10aW1lIHN0cmluZywgd2hpY2ggS2VybWl0IGludGVycHJldHMgZm9yIHlvdSBhbmQgYWxzbwogICAgICAgICAgbWFrZXMgYXZhaWxhYmxlIGluIGl0cyBcdihmdHBfbWVzc2FnZSkgdmFyaWFibGUuCgogICBXaGVuZXZlciBhIFNJWkUgb3IgTURUTSBkaXJlY3RpdmUgaXMgc2VudCBpbXBsaWNpdGx5IGFuZCByZWplY3RlZCBieQogICB0aGUgc2VydmVyIGJlY2F1c2UgaXQgaXMgdW5rbm93biwgS2VybWl0IGF1dG9tYXRpY2FsbHkgZGlzYWJsZXMgaXQuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgIDMuMTEuMy4gVXNpbmcgTUdFVDogTkxTVCB2ZXJzdXMgTUxTRCBXaGVuIHlvdSBnaXZlIGFuIE1HRVQgY29tbWFuZCB0bwogICBhbiBGVFAgY2xpZW50LCBpdCBzZW5kcyBhIHJlcXVlc3QgdG8gdGhlIEZUUCBzZXJ2ZXIgZm9yIGEgbGlzdCBvZgogICBmaWxlcywgYW5kIHRoZW4gdXBvbiBzdWNjZXNzZnVsIHJlY2VpcHQgb2YgdGhlIGxpc3QsIGdvZXMgdGhyb3VnaCBpdAogICBhbmQgaXNzdWVzIGEgUkVUUiAocmV0cmlldmUpIGRpcmVjdGl2ZSBmb3IgZWFjaCBmaWxlIG9uIHRoZSBsaXN0IChvcgogICBwb3NzaWJseSBvbmx5IGZvciBzZWxlY3RlZCBmaWxlcykuCgogICBXaXRoIHRoZSBuZXcgRlRQIHByb3RvY29sIGV4dGVuc2lvbnMsIG5vdyB0aGVyZSBhcmUgdHdvIHdheXMgdG8gZ2V0CiAgIHRoZSBsaXN0IG9mIGZpbGVzOiB0aGUgTkxTVCBkaXJlY3RpdmUsIHdoaWNoIGhhcyBiZWVuIHBhcnQgb2YgRlRQCiAgIHByb3RvY29sIHNpbmNlIHRoZSBiZWdpbm5pbmcsIGFuZCB0aGUgbmV3IE1MU0QgZGlyZWN0aXZlLCB3aGljaCBpcyBuZXcKICAgYW5kIG5vdCB5ZXQgd2lkZWx5IGltcGxlbWVudGVkLiBXaGVuIE5MU1QgaXMgdXNlZCBhbmQgeW91IGdpdmUgYQogICBjb21tYW5kIGxpa2UgIm1nZXQgKi50eHQiLCB0aGUgRlRQIGNsaWVudCBzZW5kczoKCk5MU1QgKi50eHQKCiAgIGFuZCB0aGUgc2VydmVyIHNlbmRzIGJhY2sgYSBsaXN0IG9mIHRoZSBmaWxlcyB3aG9zZSBuYW1lcyBtYXRjaCwgZS5nLgoKZm9vLnR4dApiYXIudHh0CmJhei50eHQKCiAgIFRoZW4gd2hlbiBkb3dubG9hZGluZyBlYWNoIGZpbGUsIHRoZSBjbGllbnQgc2VuZHMgU0laRSAoaWYgaXQgd2FudHMKICAgaGF2ZSBhIHBlcmNlbnQtZG9uZSBkaXNwbGF5KSBhbmQgTURUTSAoaWYgaXQgd2FudHMgdG8gc2V0IHRoZQogICBkb3dubG9hZGVkIGZpbGUncyB0aW1lc3RhbXAgdG8gbWF0Y2ggdGhhdCBvZiB0aGUgb3JpZ2luYWwpLCBhcyB3ZWxsIGFzCiAgIFJFVFIgKHRvIHJldHJpZXZlIHRoZSBmaWxlKS4KCiAgIEJ1dCB3aGVuIE1MU0QgaXMgdXNlZCwgdGhlIGNsaWVudCBpcyBub3Qgc3VwcG9zZWQgdG8gc2VuZCB0aGUgZmlsZW5hbWUKICAgb3Igd2lsZGNhcmQgdG8gdGhlIHNlcnZlcjsgaW5zdGVhZCBpdCBzZW5kcyBhbiBNTFNEIGRpcmVjdGl2ZSB3aXRoIG5vCiAgIGFyZ3VtZW50IChvciB0aGUgbmFtZSBvZiBhIGRpcmVjdG9yeSksIGFuZCB0aGUgc2VydmVyIHNlbmRzIGJhY2sgYQogICBsaXN0IG9mIGFsbCB0aGUgZmlsZXMgaW4gdGhlIGN1cnJlbnQgb3IgZ2l2ZW4gZGlyZWN0b3J5OyB0aGVuIHRoZQogICBjbGllbnQgZ29lcyB0aHJvdWdoIHRoZSBsaXN0IGFuZCBjaGVja3MgZWFjaCBmaWxlIHRvIHNlZSBpZiBpdCBtYXRjaGVzCiAgIHRoZSBnaXZlbiBwYXR0ZXJuLCB0aGUgcmF0aW9uYWxlIGJlaW5nIHRoYXQgdGhlIHVzZXIga25vd3Mgb25seSB0aGUKICAgbG9jYWwgY29udmVudGlvbnMgZm9yIHdpbGRjYXJkcyBhbmQgbm90IG5lY2Vzc2FyaWx5IHRoZSBzZXJ2ZXIncwogICBjb252ZW50aW9ucy4gU28gd2l0aCBOTFNUIHRoZSBzZXJ2ZXIgaW50ZXJwcmV0cyB3aWxkY2FyZHM7IHdpdGggTUxTRAogICB0aGUgY2xpZW50IGRvZXMuCgogICAgIFRoZSBpbnRlcnByZXRhdGlvbiBvZiBOTFNUIHdpbGRjYXJkcyBieSB0aGUgc2VydmVyIGlzIG5vdAogICAgIG5lY2Vzc2FyaWx5IHJlcXVpcmVkIG9yIGV2ZW4gZW52aXNpb25lZCBieSB0aGUgRlRQIHByb3RvY29sCiAgICAgZGVmaW5pdGlvbiAoUkZDIDk1OSksIGJ1dCBpbiBwcmFjdGljZSBtb3N0IGNsaWVudHMgYW5kIHNlcnZlcnMgd29yawogICAgIHRoaXMgd2F5LiAKCiAgIFRoZSBwcmluY2lwYWwgYWR2YW50YWdlIG9mIE1MU0QgaXMgdGhhdCBpbnN0ZWFkIG9mIHNlbmRpbmcgYmFjayBhCiAgIHNpbXBsZSBsaXN0IG9mIGZpbGVuYW1lcywgaXQgc2VuZHMgYmFjayBhIGtpbmQgb2YgZGF0YWJhc2UgaW4gd2hpY2gKICAgZWFjaCBlbnRyeSBjb250YWlucyBhIGZpbGVuYW1lIHRvZ2V0aGVyIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlCiAgIGZpbGU6IHR5cGUsIHNpemUsIHRpbWVzdGFtcCwgYW5kIHNvIG9uOyBmb3IgZXhhbXBsZToKCnNpemU9MDt0eXBlPWRpcjtwZXJtPWVsO21vZGlmeT0yMDAyMDQwOTE5MTUzMDsgYmluCnNpemU9MzkxOTMxMjt0eXBlPWZpbGU7cGVybT1yO21vZGlmeT0yMDAwMDMxMDE0MDQwMDsgYmFyLnR4dApzaXplPTY2ODYxNzY7dHlwZT1maWxlO3Blcm09cjttb2RpZnk9MjAwMDEyMTUxODEwMDA7IGJhei50eHQKc2l6ZT0zODIwMDkyO3R5cGU9ZmlsZTtwZXJtPXI7bW9kaWZ5PTIwMDAwMzEwMTQwMzAwOyBmb28udHh0CnNpemU9Mjc0Mzk7dHlwZT1maWxlO3Blcm09cjttb2RpZnk9MjAwMjA5MjMxNTEzMTI7IGZvby56aXAKKGV0YyBldGMuLi4pCgogICAoSWYgdGhlIGZvcm1hdCBvZiB0aGUgZmlsZSBsaXN0IHdlcmUgdGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIE5MU1QKICAgYW5kIE1MU0QsIHRoZSBkaXNjdXNzaW9uIHdvdWxkIGJlIGZpbmlzaGVkOiBpdCB3b3VsZCBhbHdheXMgYmUgYmV0dGVyCiAgIHRvIHVzZSBNTFNEIHdoZW4gYXZhaWxhYmxlLCBhbmQgdGhlIE1HRVQgdXNlciBpbnRlcmZhY2Ugd291bGQgbmVlZCBubwogICBjaGFuZ2VzLiBCdXQgdGhlcmUncyBhIGxvdCBtb3JlIHRvIE1MU0QgdGhhbiB0aGUgZmlsZS1saXN0IGZvcm1hdDsKICAgcmVhZCBvbi4uLikKCiAgIFRoZSBjbGllbnQgbGVhcm5zIHdoZXRoZXIgdGhlIHNlcnZlciBzdXBwb3J0cyBNTFNEIGluIEZFQVQgZXhjaGFuZ2UuCiAgIEJ1dCB0aGUgZmFjdCB0aGF0IHRoZSBzZXJ2ZXIgc3VwcG9ydHMgTUxTRCBkb2Vzbid0IG1lYW4gdGhlIGNsaWVudAogICBzaG91bGQgYWx3YXlzIHVzZSBpdC4gSXQgaXMgYmV0dGVyIHRvIHVzZSBNTFNEOgoKICAgICAqIE9uIGNvbm5lY3Rpb25zIHdoZXJlIHRoZSBzZXJ2ZXIgaW1wb3NlcyBhIHRpbWUgcGVuYWx0eSBmb3IgZXZlcnkKICAgICAgIGNvbW1hbmQsIGUuZy4gdGhlIFJlZCBIYXQgUmF3aGlkZSBzZXJ2ZXIuIFdpdGggTUxTRCwgdGhlIGNsaWVudAogICAgICAgbmVlZHMgdG8gc2VuZCBvbmx5IG9uZSBjb21tYW5kIChSRVRSKSBwZXIgZmlsZSwgd2hlcmVhcyBOTFNUCiAgICAgICByZXF1aXJlcyB0aHJlZSAoU0laRSwgUkVUUiwgYW5kIE1EVE0pLiBTdXBwb3NlIHRoZXJlIGlzIGEKICAgICAgIDMwLXNlY29uZCBkZWxheSBmb3IgZWFjaCBjb21tYW5kIGFuZCAxMDAwIGZpbGVzIGFyZSB0byBiZSBmZXRjaGVkOwogICAgICAgaW4gdGhhdCBjYXNlLCBNTFNEIHNhdmVzIDYwLDAwMCBzZWNvbmRzID0gMTAwMCBtaW51dGVzID0gMTYgaG91cnMKICAgICAgIGFuZCA0MCBtaW51dGVzLgogICAgICogRm9yIHJlY3Vyc2l2ZSBkb3dubG9hZHMgc2luY2UgdGhlcmUgaXMgbm8gZGVwZW5kYWJsZSB3YXkgdG8KICAgICAgIGRvd25sb2FkIGRpcmVjdG9yeSB0cmVlcyB3aXRoIE5MU1QuCgogICBCdXQgaXQgaXMgYmV0dGVyIHRvIHVzZSBOTFNUOgoKICAgICAqIElmIHlvdSB3YW50IG9ubHkgYSBjb3VwbGUgc2hvcnQgZmlsZXMgb3V0IG9mIGEgbGFyZ2UgZGlyZWN0b3J5LiBJbgogICAgICAgdGhpcyBjYXNlLCBOTFNUIGlzIHRoZSBiZXR0ZXIgY2hvaWNlIHNpbmNlIHRoZSBzZXJ2ZXIgc2VuZHMgYSBsaXN0CiAgICAgICBvZiBvbmx5IHRoZSBmaWxlcyB5b3Ugd2FudCwgbm90IGEgbGlzdCBvZiAoc2F5KSBhIG1pbGxpb24gZmlsZXMsCiAgICAgICB3aGljaCBjYW4gbWFrZSBhIGJpZyBkaWZmZXJlbmNlIG9uIHNsb3cgY29ubmVjdGlvbnMuIEZvciBleGFtcGxlLAogICAgICAgc3VwcG9zZSB5b3VyIHdpbGRjYXJkIG1hdGNoZXMgdGhyZWUgZmlsZXMgb2YgMUsgZWFjaCwgYnV0IHRoZQogICAgICAgbWlsbGlvbi1maWxlIGxpc3RpbmcgaXMgODBNQiBsb25nLCBhbmQgeW91ciBjb25uZWN0aW9uIGlzIHRocm91Z2gKICAgICAgIGEgbW9kZW0uIFRoZSBvdmVyaGVhZCBvZiB1c2luZyBNTFNEIGlzIHByYWN0aWNhbGx5IGluZmluaXRlLgogICAgICogSWYgdGhlIHNlcnZlciBzdXBwb3J0cyB3aWxkY2FyZGluZyBmZWF0dXJlcyBub3Qga25vd24gdG8gdGhlCiAgICAgICBjbGllbnQsIGJ1dCB0aGF0IGNhbiBiZSB1c2VkIHRvIGFjaGlldmUgZGVzaXJhYmxlIGVmZmVjdHMKICAgICAgIG90aGVyd2lzZSB1bm9idGFpbmFibGUsIHN1Y2ggYXMgIltkaXIuLi5dKi50eHQiIGluIFZNUyBvciBBT1MvVlMKICAgICAgICJleGNlcHQiIGNsYXVzZXMuCiAgICAgKiBJZiB5b3UgaGF2ZSBiZWVuIGdpdmVuIGEgd2lsZGNhcmQgc3RyaW5nIGJ5IGFuIEZUUCBzaXRlCiAgICAgICBhZG1pbmlzdHJhdG9yIGZvciBmZXRjaGluZyBhIHNwZWNpZmljIGdyb3VwIG9mIGZpbGVzIG91dCBvZiBhCiAgICAgICBsYXJnZXIgZGlyZWN0b3J5LCBlLmcuICJtZ2V0IGNrW2N1d10qLltjd2hdIG1ha2VmaWxlIiwgdGhhdCBpcwogICAgICAgZXhwZWN0ZWQgdG8gd29yayB3aXRoIGFueSBjbGllbnQgKGFuIEZUUCBzaXRlIGFkbWluaXN0cmF0b3IgY2FuJ3QKICAgICAgIGJlIGV4cGVjdGVkIHRvIGtub3cgdGhlIHdpbGRjYXJkIHN5bnRheCBvZiBldmVyeSBGVFAgY2xpZW50KS4KCiAgIEJ1dCB3aGVuIHVzaW5nIE1MU0QgdGhlcmUgYXJlIGNvbXBsaWNhdGlvbnM6CgogICAgICogTUxTRCB3YW50cyBlaXRoZXIgYSBibGFuayBhcmd1bWVudCAobWVhbmluZyB0aGUgY3VycmVudCBkaXJlY3RvcnkpCiAgICAgICBvciBlbHNlIHRoZSBuYW1lIG9mIGEgc3BlY2lmaWMgZGlyZWN0b3J5LiBUaGUgY2xpZW50IG11c3Qgbm90IHNlbmQKICAgICAgIGl0IGEgd2lsZGNhcmQgb3IgYSBmaWxlbmFtZS4KICAgICAqIEJ1dCBpZiB0aGUgdXNlcidzIGNvbW1hbmQgaXMgIm1nZXQgeHh4IiwgaG93IGRvZXMgdGhlIGNsaWVudCBrbm93CiAgICAgICB3aGV0aGVyIHRvIHNlbmQgInh4eCIgaW4gdGhlIE1MU0QgZGlyZWN0aXZlPyBJdCBtaWdodCBiZSB0aGUgbmFtZQogICAgICAgb2YgYSBkaXJlY3Rvcnkgb24gb24gdGhlIHNlcnZlciwgaW4gd2hpY2ggY2FzZSBpdCBzaG91bGQgYmUgc2VudCwKICAgICAgIG9yIGl0IG1pZ2h0IGJlIHRoZSBuYW1lIG9mIGEgZmlsZSBvbiB0aGUgc2VydmVyIChvciBhIHdpbGRjYXJkKSwKICAgICAgIGluIHdoaWNoIGNhc2UgaXQgbXVzdCBub3QgYmUgc2VudC4gU2luY2UgdGhlIGNsaWVudCBrbm93cyBpdHMgb3duCiAgICAgICB3aWxkY2FyZCBzeW50YXgsIHRoZW4gaW4gbW9zdCBjYXNlcyBpdCB3b3VsZCBiZSByaWdodCB0byBzZW5kCiAgICAgICAiTUxTRCIgd2l0aCBubyBhcmd1bWVudCBpZiB4eHggaXMgd2lsZCwgYW5kIHRvIHNlbmQgIk1MU0QgeHh4IiBpZgogICAgICAgaXQgaXMgbm90LgogICAgICogQnV0IHN1cHBvc2UgdGhlIHNlcnZlcidzIGZpbGUgc3lzdGVtIGFsbG93cyBmaWxlbmFtZSBjaGFyYWN0ZXJzCiAgICAgICB0aGF0IGNvcnJlc3BvbmQgd2l0aCB0aGUgY2xpZW50J3Mgd2lsZGNhcmQgc3ludGF4PyBGb3IgZXhhbXBsZToKICAgICAgICJbYWJjXSIgY291bGQgYmUgZWl0aGVyIGEgdmFsaWQgVk1TIGRpcmVjdG9yeSBuYW1lIG9yIGEgd2lsZGNhcmQKICAgICAgIHBhdHRlcm4gdXNlZCBieSB0aGUgRlRQIGNsaWVudC4gV2hhdCBzaG91bGQgdGhlIGNsaWVudCBkbyB3aXRoCiAgICAgICAibWdldCBbYWJjXSI/IEluIHRoaXMgY2FzZSB0aGVyZSBtdXN0IGJlIGEgd2F5IGZvciB0aGUgdXNlciB0bwogICAgICAgZm9yY2Ugc2VuZGluZyB0aGUgTUdFVCBhcmd1bWVudCBhcyB0aGUgTUxTRCBhcmd1bWVudC4KICAgICAqIElmICJ4eHgiIGlzIGEgcmVndWxhciBmaWxlIGluIHRoZSBzZXJ2ZXIncyBjdXJyZW50IGRpcmVjdG9yeSwKICAgICAgICJtZ2V0IHh4eCIgd29ya3Mgd2l0aCBOTFNUIGJ1dCBub3Qgd2l0aCBNTFNELgoKICAgVG8gZnVydGhlciBjb21wbGljYXRlIG1hdHRlcnMsIE5MU1QgY2FuIChpbiB0aGVvcnkpIHdvcmsganVzdCBsaWtlCiAgIE1MU0Q6IGlmIHNlbnQgd2l0aCBhIGJsYW5rIGFyZ3VtZW50IG9yIGEgZGlyZWN0b3J5IG5hbWUsIGl0IGlzCiAgIHN1cHBvc2VkIHRvIHJldHVybiBhIGNvbXBsZXRlIGxpc3Qgb2YgZmlsZXMgaW4gdGhlIGN1cnJlbnQgb3IgZ2l2ZW4KICAgZGlyZWN0b3J5LCB3aGljaCB0aGUgY2xpZW50IGNhbiBtYXRjaCBsb2NhbGx5IGFnYWluc3Qgc29tZSBwYXR0ZXJuLiBJdAogICBpcyBub3Qga25vd24gaWYgYW55IEZUUCBzZXJ2ZXIgb3IgY2xpZW50IGRvZXMgdGhpcyBidXQgbmV2ZXJ0aGVsZXNzLAogICBpdCBzaG91bGQgYmUgcG9zc2libGUgc2luY2UgdGhpcyBiZWhhdmlvciBjYW4gYmUgaW5mZXJyZWQgZnJvbSBSRkMKICAgOTU5LgoKICAgSW4gdmlldyBvZiB0aGVzZSBjb25zaWRlcmF0aW9ucywgYW5kIGdpdmVuIHRoZSBuZWVkIHRvIHByZXNlcnZlIHRoZQogICB0cmFkaXRpb25hbCBGVFAgY2xpZW50IGNvbW1hbmQgc3RydWN0dXJlIGFuZCBiZWhhdmlvciBzbyB0aGUgc29mdHdhcmUKICAgd2lsbCBiZSB1c2FibGUgYnkgbW9zdCBwZW9wbGU6CgogICAgMS4gVGhlIE1HRVQgY29tbWFuZCBzaG91bGQgcHJvZHVjZSB0aGUgZXhwZWN0ZWQgcmVzdWx0IGluIHRoZSBjb21tb24KICAgICAgIGNhc2VzLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgTkxTVCBvciBNTFNEIGlzIHVzZWQgdW5kZXJuZWF0aC4KICAgIDIuIEZvciBhbm9tYWxvdXMgY2FzZXMsIHRoZSB1c2VyIG5lZWRzIGEgd2F5IHRvIGNvbnRyb2wgd2hldGhlciB0aGUKICAgICAgIE1HRVQgYXJndW1lbnQgaXMgc2VudCB0byB0aGUgc2VydmVyIG9yIGtlcHQgZm9yIGxvY2FsIHVzZS4KICAgIDMuIEF0IHRoZSBzYW1lIHRpbWUsIHRoZSB1c2VyIG1pZ2h0IG5lZWQgYSB3YXkgdG8gc2VuZCBhIGRpcmVjdG9yeQogICAgICAgbmFtZSB0byB0aGUgc2VydmVyLCBpbmRlcGVuZGVudCBvZiBhbnkgd2lsZGNhcmQgcGF0dGVybi4KICAgIDQuIFRoZSB1c2VyIG5lZWRzIGEgd2F5IHRvIGZvcmNlIE5MU1Qgb3IgTUxTRCBmb3IgYSBnaXZlbiBNR0VUCiAgICAgICBjb21tYW5kLgoKICAgQnkgZGVmYXVsdCwgS2VybWl0J3MgTUdFVCBjb21tYW5kIHVzZXMgTUxTRCBpZiBNTFNUIGlzIHJlcG9ydGVkIGJ5IHRoZQogICBzZXJ2ZXIgaW4gaXRzIEZFQVQgbGlzdC4gV2hlbiBNTFNEIGlzIHVzZWQsIHRoZSBmaWxlc3BlYyBpcyBzZW50IHRvCiAgIHRoZSBzZXJ2ZXIgaWYgaXQgaXMgbm90IHdpbGQgKGFjY29yZGluZyB0byBLZXJtaXQncyBvd24gZGVmaW5pdGlvbiBvZgogICAid2lsZCIgc2luY2UgaXQgY2FuJ3QgcG9zc2libHkga25vdyB0aGUgc2VydmVyJ3MgZGVmaW5pdGlvbikuIElmIHRoZQogICBmaWxlc3BlYyBpcyB3aWxkIGl0IGlzIGhlbGQgZm9yIGxvY2FsIHVzZSB0byBzZWxlY3QgZmlsZXMgZnJvbSB0aGUKICAgbGlzdCByZXR1cm5lZCBieSB0aGUgc2VydmVyLiBJZiBNTFNUIGlzIG5vdCByZXBvcnRlZCBieSB0aGUgc2VydmVyIG9yCiAgIGlzIGRpc2FibGVkLCBLZXJtaXQgc2VuZHMgdGhlIE1HRVQgZmlsZXNwZWMgd2l0aCB0aGUgTkxTVCBkaXJlY3RpdmUuCgogICBUaGUgZGVmYXVsdCBiZWhhdmlvciBjYW4gYmUgb3ZlcnJpZGRlbiBnbG9iYWxseSB3aXRoIEZUUCBESVNBQkxFIE1MU1QsCiAgIHdoaWNoIGZvcmNlcyBLZXJtaXQgdG8gdXNlIE5MU1QgdG8gZ2V0IGZpbGUgbGlzdHMuIEFuZCB0aGVuIGZvcgogICBzaXR1YXRpb25zIGluIHdoaWNoIE1MU0QgaXMgZW5hYmxlZCwgdGhlIGZvbGxvd2luZyBNR0VUIHN3aXRjaGVzIGNhbgogICBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0cyBmb3IgYSBzcGVjaWZpYyBNR0VUIG9wZXJhdGlvbjoKCiAgIC9OTFNUCiAgICAgICAgICBGb3JjZXMgdGhlIGNsaWVudCB0byBzZW5kIE5MU1QuIEV4YW1wbGU6CgptZ2V0IC9ubHN0IGZvby4qCgogICAvTUxTRAogICAgICAgICAgRm9yY2VzIHRoZSBjbGllbnQgdG8gc2VuZCBNTFNEIChldmVuIGlmIE1MU1QgaXMgZGlzYWJsZWQpLgogICAgICAgICAgRXhhbXBsZToKCm1nZXQgL21sc2QgZm9vLioKCiAgIC9NQVRDSDpwYXR0ZXJuCiAgICAgICAgICBXaGVuIHRoaXMgc3dpdGNoIGlzIGdpdmVuLCBpdCBmb3JjZXMgdGhlIGNsaWVudCB0byBob2xkIHRoZQogICAgICAgICAgcGF0dGVybiBmb3IgbG9jYWwgdXNlIGFnYWluc3QgdGhlIHJldHVybmVkIGZpbGUgbGlzdC4gSWYgYQogICAgICAgICAgcmVtb3RlIGZpbGVzcGVjIGlzIGFsc28gZ2l2ZW4gKGUuZy4gdGhlICJibGFoIiBpbiAibWdldAogICAgICAgICAgL21hdGNoOioudHh0IGJsYWgiKSwgdGhlbiBpdCBpcyBzZW50IGFzIHRoZSBOTFNUIG9yIE1MU0QKICAgICAgICAgIGFyZ3VtZW50LCBwcmVzdW1hYmx5IHRvIHNwZWNpZnkgdGhlIGRpcmVjdG9yeSB3aG9zZSBmaWxlcyBhcmUKICAgICAgICAgIHRvIGJlIGxpc3RlZC4gV2hlbiB0aGUgL01BVENIIHN3aXRjaCBpcyBub3QgZ2l2ZW4sIHRoZSBNR0VUCiAgICAgICAgICBmaWxlc3BlYyBpcyBzZW50IHRvIHRoZSBzZXJ2ZXIgaWYgdGhlIGRpcmVjdGl2ZSBpcyBOTFNUIG9yIGlmCiAgICAgICAgICB0aGUgZmlsZXNwZWMgaXMgbm90IHdpbGQuIEV4YW1wbGVzOgoKICBDb21tYW5kOiAgICAgICAgICAgICAgICAgICBXaXRoIE5MU1Q6ICAgICBXaXRoIE1MU0Q6CiAgICBtZ2V0ICAgICAgICAgICAgICAgICAgICAgIE5MU1QgICAgICAgICAgIE1MU0QKICAgIG1nZXQgKi50eHQgICAgICAgICAgICAgICAgTkxTVCAqLnR4dCAgICAgTUxTRAogICAgbWdldCBmb28gICAgICAgICAgICAgICAgICBOTFNUIGZvbyAgICAgICBNTFNEIGZvbwogICAgbWdldCAvbWF0Y2g6Ki50eHQgICAgICAgICBOTFNUICAgICAgICAgICBNTFNECiAgICBtZ2V0IC9tYXRjaDoqLnR4dCBmb28gICAgIE5MU1QgZm9vICAgICAgIE1MU0QgZm9vCgogICBJbiBvdGhlciB3b3JkcywgdGhlIHBhdHRlcm4gaXMgYWx3YXlzIGludGVwcmV0ZWQgbG9jYWxseSB1bmxlc3MgTUdFVAogICB1c2VzIE5MU1QgYW5kIG5vIC9NQVRDSCBzd2l0Y2ggd2FzIGdpdmVuLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAzLjExLjQuIEV4YW1wbGVzCgogIDMuMTEuNC4xLiBEb3dubG9hZGluZyBhIFNpbmdsZSBGaWxlCgogICBUaGVyZSBhcmUgbm8gY2hvaWNlcyBoZXJlLCBqdXN0IHVzZSB0aGUgRlRQIEdFVCBjb21tYW5kLiBLZXJtaXQgYWx3YXlzCiAgIHNlbmRzIHRoZSBSRVRSIGRpcmVjdGl2ZSwgYW5kIHBvc3NpYmx5IFNJWkUgYW5kL29yIE1EVE0uIFRoZSBzbWFsbAogICBhZHZhbnRhZ2Ugb2YgdXNpbmcgTUxTVCBpbiB0aGlzIGNhc2UgaXMgb3V0d2VpZ2hlZCBieSB0aGUgcmlzayBhbmQKICAgZWZmb3J0IG9mIGNvZGluZyBhIHNwZWNpYWwgY2FzZS4KCiAgMy4xMS40LjIuIERvd25sb2FkaW5nIGEgR3JvdXAgb2YgRmlsZXMgZnJvbSBhIFNpbmdsZSBEaXJlY3RvcnkKCiAgIFRoaXMgY2FzZSBwcmVzZW50cyB0cmFkZW9mZnMsIGVzcGVjaWFsbHkgb24gc2xvdyBjb25uZWN0aW9uczoKCiAgICAgKiBGb3IgZG93bmxvYWRpbmcgYWxsIG9yIG1vc3Qgb2YgdGhlIGZpbGVzIGluIGEgZGlyZWN0b3J5LCBNTFNEIGlzCiAgICAgICBiZXR0ZXIgYmVjYXVzZSBpdCBlbGltaW5hdGVzIHRoZSBuZWVkIHRvIHNlbmQgU0laRSBhbmQgTURUTSBmb3IKICAgICAgIGVhY2ggZmlsZS4gTm8gc3BlY2lhbCBhY3Rpb25zIGFyZSByZXF1aXJlZCBpbiB0aGlzIGNhc2U7IEtlcm1pdAogICAgICAgdXNlcyBNTFNEIGF1dG9tYXRpY2FsbHkgaWYgdGhlIHNlcnZlciBzdXBwb3J0cyBpdCAodW5sZXNzIHlvdSBoYXZlCiAgICAgICBkaXNhYmxlZCBpdCkuCiAgICAgKiBGb3IgYSBzbWFsbCBudW1iZXIgb2YgZmlsZXMgZnJvbSBhIGxhcmdlIGRpcmVjdG9yeSwgTkxTVCBpcyBiZXR0ZXIKICAgICAgIGJlY2F1c2UgaXQgYnlwYXNzZXMgZG93bmxvYWRpbmcgb2YgYSBwb3RlbnRpYWxseSBodWdlIGZpbGUgbGlzdAogICAgICAgcHJpb3IgdG8gdGhlIGZpbGVzIHRoZW1zZWx2ZXMuIElmIHlvdSBoYXZlIGEgY29ubmVjdGlvbiB0byBhCiAgICAgICBzZXJ2ZXIgdGhhdCBzdXBwb3J0cyBNTFNELCB1c2UgdGhlIC9OTFNUIHN3aXRjaCB0byBmb3JjZSBOTFNUOgoKbWdldCAvbmxzdCB0WzEyMzRdLmgKCiAgICAgKiBJZiB0aGUgc2VydmVyIHN1cHBvcnRzIE1MU0QgYnV0IGRvZXMgbm90IHN1cHBvcnQgc2VwYXJhdGUgU0laRSBvcgogICAgICAgTURUTSBkaXJlY3RpdmVzLCBhbmQgeW91IG5lZWQgdGhlIHNpemUgYW5kL29yIHRpbWVzdGFtcAogICAgICAgaW5mb3JtYXRpb24sIE1MU0QgaXMgYmV0dGVyOyBubyBzcGVjaWFsIGFjdGlvbnMgcmVxdWlyZWQuCiAgICAgKiBJZiB0aGUgc2VydmVyIHN1cHBvcnRzIE1MU0QgYnV0IGRvZXMgbm90IHN1cHBvcnQgdGhlICJzaXplIiBhbmQKICAgICAgICJtb2RpZnkiIGZhY3RzLCBidXQgaXQgZG9lcyBzdXBwb3J0IHRoZSBTSVpFIG9yIE1EVE0gZGlyZWN0aXZlcywKICAgICAgIGFuZCB5b3UgbmVlZCB0aGUgc2l6ZSBhbmQvb3IgdGltZXN0YW1wIGluZm9ybWF0aW9uLCBOTFNUIGlzCiAgICAgICBiZXR0ZXIuCgogIDMuMTEuNC4zLiBEb3dubG9hZGluZyBhIERpcmVjdG9yeSBUcmVlCgogICBNTFNEIGlzIHRoZSBvbmx5IGNob2ljZSBmb3IgcmVjdXJzaXZlIGRvd25sb2FkczsgdGhleSByYXJlbHksIGlmIGV2ZXIsCiAgIHdvcmsgd2l0aCBOTFNUICh0aGUgZmV3IGNhc2VzIHdoZXJlIHRoZXkgZG8gd29yayByZWx5IG9uCiAgIGV4dHJhLXByb3RvY29sICJzZWNyZXQiIG5vdGF0aW9ucyBmb3IgdGhlIE5MU1QgYXJndW1lbnQpLiBObyBzcGVjaWFsCiAgIGFjdGlvbnMgYXJlIHJlcXVpcmVkIHRvIGZvcmNlIE1MU0Qgd2hlbiB0aGUgc2VydmVyIHN1cHBvcnRzIGl0LCB1bmxlc3MKICAgeW91IGhhdmUgZGlzYWJsZWQgaXQuIEV4YW1wbGVzOgoKICAgTUdFVCAvUkVDVVJTSVZFCiAgICAgICAgICBUaGlzIHRlbGxzIHRoZSBzZXJ2ZXIgdG8gc2VuZCBhbGwgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGluIHRoZQogICAgICAgICAgdHJlZSByb290ZWQgYXQgaXRzIGN1cnJlbnQgZGlyZWN0b3J5LgoKICAgTUdFVCAvUkVDVVJTSVZFICoudHh0CiAgICAgICAgICBUaGlzIHRlbGxzIHRoZSBzZXJ2ZXIgdG8gc2VuZCBhbGwgKi50eHQgZmlsZXMgaW4gdGhlIHRyZWUKICAgICAgICAgIHJvb3RlZCBhdCBpdHMgY3VycmVudCBkaXJlY3RvcnkuCgogICBNR0VUIC9NTFNEIC9SRUNVUlNJVkUgKi50eHQKICAgICAgICAgIFNhbWUgYXMgdGhlIHByZXZpb3VzIGV4YW1wbGUgYnV0IGZvcmNlcyBLZXJtaXQgdG8gc2VuZCBNTFNEIGluCiAgICAgICAgICBjYXNlIGl0IHdhcyBkaXNhYmxlZCwgb3IgaW4gY2FzZSB0aGUgc2VydmVyIGlzIGtub3duIHRvIHN1cHBvcnQKICAgICAgICAgIGl0IGV2ZW4gdGhvdWdoIGl0IGRpZCBub3QgYW5ub3VuY2UgaXQgaW4gaXRzIEZFQVQgbGlzdGluZy4KCiAgIE1HRVQgL1JFQ1VSU0lWRSAvTUFUQ0g6Ki56aXAgYXJjaGl2ZXMKICAgICAgICAgIFRlbGxzIHRoZSBzZXJ2ZXIgdG8gc2VuZCBhbGwgWklQIGZpbGVzIGluIHRoZSB0cmVlIHJvb3RlZCBhdAogICAgICAgICAgaXRzICJhcmNoaXZlcyIgZGlyZWN0b3J5LgoKICAgTUdFVCAvUkVDVVJTSVZFIC9NQVRDSDoqIFthYmNdCiAgICAgICAgICBUaGUgc2VydmVyIGlzIHJ1bm5pbmcgb24gVk1TIGFuZCB5b3Ugd2FudCBpdCB0byBzZW5kIGFsbCB0aGUKICAgICAgICAgIGZpbGVzIGluIHRoZSBkaXJlY3RvcnkgdHJlZSByb290ZWQgYXQgW0FCQ10uIEJ1dCBzaW5jZSAiW2FiY10iCiAgICAgICAgICBsb29rcyBqdXN0IGxpa2UgYSB3aWxkY2FyZCwgeW91IGhhdmUgdG8gaW5jbHVkZSBhIC9NQVRDSDoKICAgICAgICAgIHN3aXRjaCB0byBmb3JjZSBLZXJtaXQgdG8gc2VuZCAiW2FiY10iIGFzIHRoZSBNTFNEIGFyZ3VtZW50LgoKICAgSW4gYWxsIGNhc2VzIGluIHdoaWNoIHRoZSAvUkVDVVJTSVZFIHN3aXRjaCBpcyBpbmNsdWRlZCwgdGhlIHNlcnZlcidzCiAgIHRyZWUgaXMgZHVwbGljYXRlZCBsb2NhbGx5LgoKICAgICBBbHRob3VnaCBNTFNEIGFsbG93cyByZWN1cnNpb24gYW5kIE5MU1QgZG9lcyBub3QsIHRoZSBNTFNECiAgICAgc3BlY2lmaWNhdGlvbiBwbGFjZXMgYSBoZWF2eSBidXJkZW4gb24gdGhlIGNsaWVudDsgdGhlIG9idmlvdXMsCiAgICAgc3RyYWlnaHRmb3J3YXJkLCBhbmQgZWxlZ2FudCBpbXBsZW1lbnRhdGlvbiAoZGVwdGgtZmlyc3QsIHRoZSBvbmUKICAgICB0aGF0IEtlcm1pdCBjdXJyZW50bHkgdXNlcykgcmVxdWlyZXMgYXMgbWFueSBvcGVuIHRlbXBvcmFyeSBmaWxlcwogICAgIGFzIHRoZSBzZXJ2ZXIncyBkaXJlY3RvcnkgdHJlZSBpcyBkZWVwLCBhbmQgdGhlcmVmb3JlIGNsaWVudAogICAgIHJlc291cmNlIGV4aGF1c3Rpb24gLS0gZS5nLiBleGNlZWRpbmcgdGhlIG1heGltdW0gbnVtYmVyIG9mIG9wZW4KICAgICBmaWxlcyAtLSBpcyBhIGRhbmdlci4gVW5mb3J0dW5hdGVseSBNTFNEIHdhcyBub3QgZGVzaWduZWQgd2l0aAogICAgIHJlY3Vyc2lvbiBpbiBtaW5kLiAoQnJlYWR0aC1maXJzdCB0cmF2ZXJzYWwgY291bGQgYmUgcHJvYmxlbWF0aWMKICAgICBkdWUgdG8gbGFjayBvZiBzdWZmaWNpZW50IG5hdmlnYXRpb24gaW5mb3JtYXRpb24uKSAKCiAgIE9mIGNvdXJzZSBhbGwgb2YgS2VybWl0J3Mgb3RoZXIgTUdFVCBzd2l0Y2hlcyBjYW4gYmUgdXNlZCB0b28sIGUuZy4KICAgZm9yIGZpbmVyLWdyYWluZWQgZmlsZSBzZWxlY3Rpb24gKGJ5IGRhdGUsIHNpemUsIGV0YyksIGZvciBtb3Zpbmcgb3IKICAgcmVuYW1pbmcgZmlsZXMgYXMgdGhleSBhcnJpdmUsIHRvIG92ZXJyaWRlIEtlcm1pdCdzIGF1dG9tYXRpYyBwZXItZmlsZQogICB0ZXh0L2JpbmFyeSBtb2RlIHN3aXRjaGluZywgdG8gcGFzcyB0aGUgaW5jb21pbmcgZmlsZXMgdGhyb3VnaCBhCiAgIGZpbHRlciwgdG8gY29udmVydCB0ZXh0LWZpbGUgY2hhcmFjdGVyIHNldHMsIGFuZCBzbyBvbi4KCiAgMy4xMS40LjQuIE5MU1QvTUxTRCBTdW1tYXJ5IFRhYmxlCgogICBIZXJlJ3MgYSB0YWJsZSBzdW1tYXJpemluZyBNR0VUIGJlaGF2aW9yIHdoZW4gdGhlIHNlcnZlciBzdXBwb3J0cyBib3RoCiAgIE5MU1QgYW5kIE1MU0QuIC9OTFNUIGFuZCAvTUxTRCBzd2l0Y2hlcyBhcmUgaW5jbHVkZWQgZm9yIGNsYXJpdHkgdG8KICAgaW5kaWNhdGUgd2hpY2ggcHJvdG9jb2wgaXMgYmVpbmcgdXNlZCwgYW5kIHRoZSBleHBlY3RlZCBlZmZlY3RzLiBJbgogICBwcmFjdGljZSB5b3UgY2FuIG9taXQgdGhlIC9OTFNUIGFuZCAvTUxTRCBzd2l0Y2hlcyBhbmQgdGhlIEtlcm1pdAogICBjbGllbnQgY2hvb3NlcyB0aGUgYXBwcm9wcmlhdGUgb3IgZGVzaXJlZCBwcm90b2NvbCBhcyBkZXNjcmliZWQgYWJvdmUuCiAgIFNhbXBsZSBjb21tYW5kcyBwcmVzdW1lIGEgVW5peCBmaWxlIHN5c3RlbSBvbiB0aGUgc2VydmVyLCBidXQgb2YKICAgY291cnNlIHRoZSBzZXJ2ZXIgY2FuIGhhdmUgYW55IGZpbGUgc3lzdGVtIG9yIHN5bnRheCBhdCBhbGwuCgogICBVc2VyJ3MgQ29tbWFuZCBGVFAgU2VuZHMgUmVtYXJrcwogICBtZ2V0IC9ubHN0IE5MU1QgR2V0cyBhIGxpc3Qgb2YgYWxsIHRoZSBmaWxlcyBpbiB0aGUgc2VydmVyJ3MgY3VycmVudAogICBhbmQgZG93bmxvYWRzIGVhY2ggZmlsZS4gVGhlIGxpc3QgaW5jbHVkZXMgbmFtZXMgb25seSwgc28gS2VybWl0IGFsc28KICAgbXVzdCBzZW5kIFNJWkUgYW5kIE1EVE0gZGlyZWN0aXZlcyBpZiBzaXplIGFuZCB0aW1lc3RhbXAgaW5mb3JtYXRpb24KICAgaXMgcmVxdWlyZWQgKHRoaXMgaXMgYWx3YXlzIHRydWUgb2YgTkxTVCkuIFNlbmRpbmcgTkxTVCB3aXRob3V0IGFuCiAgIGFyZ3VtZW50IGlzIGFsbG93ZWQgYnkgdGhlIFJGQzk1OSBOTFNUIGRlZmluaXRpb24gYW5kIGJ5IHRoZSBLZXJtaXQKICAgRlRQIGNsaWVudCwgYnV0IG1pZ2h0IG5vdCB3b3JrIHdpdGggb3RoZXIgY2xpZW50cywgYW5kIGFsc28gbWlnaHQgbm90CiAgIHdvcmsgd2l0aCBldmVyeSBzZXJ2ZXIuCiAgIG1nZXQgL25sc3QgZm9vIE5MU1QgZm9vIElmICJmb28iIGlzIGEgZGlyZWN0b3J5LCB0aGlzIGdldHMgYSBsaXN0IG9mCiAgIGFsbCB0aGUgZmlsZXMgZnJvbSB0aGUgc2VydmVyJ3MgImZvbyIgZGlyZWN0b3J5IGFuZCBkb3dubG9hZHMgZWFjaAogICBmaWxlOyBvdGhlcndpc2UgdGhpcyBkb3dubG9hZHMgdGhlIGZpbGUgbmFtZWQgImZvbyIgKGlmIGFueSkgZnJvbSB0aGUKICAgc2VydmVyJ3MgY3VycmVudCBkaXJlY3RvcnkuCiAgIG1nZXQgL25sc3QgKi50eHQgTkxTVCAqLnR4dCBHZXRzIGEgbGlzdCBvZiB0aGUgZmlsZXMgaW4gdGhlIHNlcnZlcidzCiAgIGN1cnJlbnQgZGlyZWN0b3J5IHdob3NlIG5hbWVzIG1hdGNoIHRoZSBwYXR0ZXJuICoudHh0LCBhbmQgdGhlbgogICBkb3dubG9hZHMgZWFjaCBmaWxlIGZyb20gdGhlIGxpc3QuIEJlY2F1c2Ugd2UgYXJlIHVzaW5nIE5MU1QsIHdlIHNlbmQKICAgdGhlIGZpbGVzcGVjICgqLnR4dCkgdG8gdGhlIHNlcnZlciBhbmQgdGhlIHNlcnZlciBpbnRlcnByZXRzIGFueQogICB3aWxkY2FyZHMuCiAgIG1nZXQgL25sc3QgZm9vLyoudHh0IE5MU1QgZm9vLyoudHh0ICBHZXRzIGEgbGlzdCBvZiB0aGUgZmlsZXMgaW4gdGhlCiAgIHNlcnZlcidzICJmb28iIGRpcmVjdG9yeSB3aG9zZSBuYW1lcyBtYXRjaCB0aGUgcGF0dGVybiAqLnR4dCwgYW5kIHRoZW4KICAgZG93bmxvYWRzIGVhY2ggZmlsZSBmcm9tIHRoZSBsaXN0IChzZXJ2ZXIgaW50ZXJwcmV0cyB3aWxkY2FyZHMpLgogICBtZ2V0IC9ubHN0IC9tYXRjaDoqLnR4dCBOTFNUIEdldHMgYSBsaXN0IG9mIGFsbCB0aGUgZmlsZXMgaW4gdGhlCiAgIHNlcnZlcidzIGN1cnJlbnQgZGlyZWN0b3J5IGFuZCB0aGVuIGRvd25sb2FkcyBlYWNoIG9uZSB3aG9zZSBuYW1lCiAgIG1hdGNoZXMgdGhlIHBhdHRlcm4gKi50eHQgKGNsaWVudCBpbnRlcnByZXRzIHdpbGRjYXJkcykuCiAgIG1nZXQgL25sc3QgL21hdGNoOioudHh0IGZvbyAgTkxTVCBmb28gR2V0cyBhIGxpc3Qgb2YgYWxsIHRoZSBmaWxlcyBpbgogICB0aGUgc2VydmVyJ3MgImZvbyIgZGlyZWN0b3J5IGFuZCB0aGVuIGRvd25sb2FkcyBlYWNoIG9uZSB3aG9zZSBuYW1lCiAgIG1hdGNoZXMgdGhlIHBhdHRlcm4gKi50eHQgKGNsaWVudCBpbnRlcnByZXRzIHdpbGRjYXJkcykuCiAgIG1nZXQgL21sc2QgTUxTRCBHZXRzIGEgbGlzdCBvZiBhbGwgdGhlIGZpbGVzIGZyb20gdGhlIHNlcnZlcidzIGN1cnJlbnQKICAgZGlyZWN0b3J5IGFuZCB0aGVuIGRvd25sb2FkcyBlYWNoIG9uZS4gVGhlIGxpc3QgbWlnaHQgaW5jbHVkZSBzaXplIGFuZAogICB0aW1lc3RhbXAgaW5mb3JtYXRpb24sIGluIHdoaWNoIGNhc2UgS2VybWl0IGRvZXMgbm90IG5lZWQgdG8gc2VuZCBTSVpFCiAgIGFuZCBNRFRNIGRpcmVjdGl2ZXMgZm9yIGVhY2ggZmlsZSAodGhpcyBpcyBhbHdheXMgdHJ1ZSBvZiBNTFNEKS4KICAgbWdldCAvbWxzZCBmb28gTUxTRCBmb28gR2V0cyBhIGxpc3Qgb2YgYWxsIHRoZSBmaWxlcyBmcm9tIHRoZSBzZXJ2ZXIncwogICAiZm9vIiBkaXJlY3RvcnkgKHdoZXJlIHRoZSBzdHJpbmcgImZvbyIgZG9lcyBub3QgY29udGFpbiB3aWxkY2FyZHMpCiAgIGFuZCB0aGVuIGRvd25sb2FkcyBlYWNoIG9uZS4gSWYgImZvbyIgaXMgYSByZWd1bGFyIGZpbGUgYW5kIG5vdCBhCiAgIGRpcmVjdG9yeSwgdGhpcyBjb21tYW5kIGlzIHN1cHBvc2VkIHRvIGZhaWwsIGJ1dCBzb21lIHNlcnZlcnMgaGF2ZQogICBiZWVuIG9ic2VydmVkIHRoYXQgc2VuZCB0aGUgZmlsZS4KICAgbWdldCAvbWxzZCAqLnR4dCBNTFNEIEdldHMgYSBsaXN0IG9mIGFsbCB0aGUgZmlsZXMgZnJvbSB0aGUgc2VydmVyJ3MKICAgY3VycmVudCBkaXJlY3RvcnkgYW5kIHRoZW4gZG93bmxvYWRzIG9ubHkgdGhlIG9uZXMgd2hvc2UgbmFtZXMgbWF0Y2gKICAgdGhlIHBhdHRlcm4gIioudHh0Ii4gQmVjYXVzZSB3ZSBhcmUgdXNpbmcgTUxTRCBhbmQgdGhlIE1HRVQgZmlsZXNwZWMKICAgaXMgd2lsZCwgd2UgZG8gbm90IHNlbmQgdGhlIGZpbGVzcGVjIHRvIHRoZSBzZXJ2ZXIsIGJ1dCB0cmVhdCBpdCBhcwogICB0aG91Z2ggaXQgaGFkIGJlZW4gZ2l2ZW4gaW4gYSAvTUFUQ0g6IHN3aXRjaCBhbmQgdXNlIGl0IGxvY2FsbHkgdG8KICAgbWF0Y2ggdGhlIG5hbWVzIGluIHRoZSBsaXN0LgogICBtZ2V0IC9tbHNkIGZvby8qLnR4dCBNTFNEIFRoaXMgb25lIHdvbid0IHdvcmsgYmVjYXVzZSBNTFNEIHJlcXVpcmVzCiAgIHRoYXQgdGhlIG5vdGlvbnMgb2Ygc2VydmVyIGRpcmVjdG9yeSBhbmQgZmlsZW5hbWUtbWF0Y2hpbmcgcGF0dGVybiBiZQogICBzZXBhcmF0ZWQuIEhvd2V2ZXIsIHRoZSBjbGllbnQsIHdoaWNoIGNhbid0IGJlIGV4cGVjdGVkIHRvIGtub3cgdGhlCiAgIHNlcnZlcidzIGZpbGUtc3lzdGVtIHN5bnRheCwgd2luZHMgdXAgc2VuZGluZyBhIHJlcXVlc3QgdGhhdCB0aGUKICAgc2VydmVyIHdpbGwgKG9yIHNob3VsZCkgcmVqZWN0LgogICBtZ2V0IC9tbHNkIC9tYXRjaDoqLnR4dCBNTFNEIEdldHMgYSBsaXN0IG9mIGFsbCB0aGUgZmlsZXMgZnJvbSB0aGUKICAgc2VydmVyJ3MgY3VycmVudCBkaXJlY3RvcnkgYW5kIHRoZW4gZG93bmxvYWRzIG9ubHkgdGhlIG9uZXMgd2hvc2UKICAgbmFtZXMgbWF0Y2ggdGhlIHBhdHRlcm4gIioudHh0IiAoY2xpZW50IGludGVycHJldHMgd2lsZGNhcmRzKS4KICAgbWdldCAvbWxzZCAvbWF0Y2g6Ki50eHQgZm9vIE1MU0QgZm9vIElmICJmb28iIGlzIGEgZGlyZWN0b3J5IG9uIHRoZQogICBzZXJ2ZXIsIHRoaXMgZ2V0cyBhIGxpc3Qgb2YgYWxsIHRoZSBmaWxlcyBmcm9tIHRoZSBzZXJ2ZXIncyAiZm9vIgogICBkaXJlY3RvcnkgYW5kIHRoZW4gZG93bmxvYWRzIG9ubHkgdGhlIG9uZXMgd2hvc2UgbmFtZXMgbWF0Y2ggdGhlCiAgIHBhdHRlcm4gIioudHh0IiAoY2xpZW50IGludGVycHJldHMgd2lsZGNhcmRzKS4gVGhpcyBsZWF2ZXMgdGhlIHNlcnZlcgogICBDRCdkIHRvIHRoZSAiZm9vIiBkaXJlY3Rvcnk7IHRoZXJlJ3Mgbm8gd2F5IHRoZSBjbGllbnQgY2FuIHJlc3RvcmUgdGhlCiAgIHNlcnZlcidzIG9yaWdpbmFsIGRpcmVjdG9yeSBiZWNhdXNlIE1MU0QgZG9lc24ndCBnaXZlIHRoYXQKICAgaW5mb3JtYXRpb24sIGFuZCBzaW5jZSB0aGUgY2xpZW50IGNhbiBub3QgYmUgZXhwZWN0ZWQgdG8ga25vdyB0aGUKICAgc2VydmVyJ3MgZmlsZS1zeXN0ZW0gc3ludGF4LCBpdCB3b3VsZCBub3QgYmUgc2FmZSB0byBndWVzcy4gSWYgImZvbyIKICAgaXMgYSByZWd1bGFyIGZpbGUsIE1MU0QgZmFpbHMuCiAgIG1nZXQgL21sc2QgZm9vIGJhciBNTFNEIFRoaXMgb25lIGlzIHByb2JsZW1hdGljLiBZb3UncmUgc3VwcG9zZWQgdG8gYmUKICAgYWJsZSB0byBnaXZlIE1HRVQgYSBsaXN0IGEgZmlsZXNwZWNzOyBpbiB0aGlzIGNhc2Ugd2UgbmFtZSB0d28KICAgZGlyZWN0b3JpZXMuIFRoZSBjbGllbnQgbXVzdCBjaGFuZ2UgdGhlIHNlcnZlcidzIGRpcmVjdG9yeSB0byAiZm9vIiB0bwogICBnZXQgdGhlIGxpc3Qgb2YgZmlsZXMsIGFuZCB0aGVuIHRoZSBmaWxlcyB0aGVtc2VsdmVzLiBCdXQgdGhlbiBpdCBoYXMKICAgbm8gd2F5IHRvIHJldHVybiB0byB0aGUgc2VydmVyJ3MgcHJldmlvdXMgZGlyZWN0b3J5IGluIG9yZGVyIHRvIGRvIHRoZQogICBzYW1lIGZvciAiYmFyIiwgYXMgZXhwbGFpbmVkIGluIHRoZSBwcmV2aW91cyBleGFtcGxlLgogICBtZ2V0IC9tbHNkIC9tYXRjaDoqIFthYmNdIE1MU0QgW2FiY10gSW5jbHVkaW5nIGEgL01BVENIOiBzd2l0Y2ggZm9yY2VzCiAgIFthYmNdIHRvIGJlIHNlbnQgdG8gdGhlIHNlcnZlciBldmVuIHRob3VnaCB0aGUgY2xpZW50IHdvdWxkIG5vcm1hbGx5CiAgIHRoaW5rIGl0IHdhcyBhIHdpbGRjYXJkIGFuZCBob2xkIGl0IGZvciBsb2NhbCBpbnRlcnByZXRhdGlvbi4gSW4gdGhpcwogICBleGFtcGxlLCBbYWJjXSBtaWdodCBiZSBhIFZNUyBkaXJlY3RvcnkgbmFtZS4KICAgbWdldCAvbWxzZCAvbWF0Y2g6KiB0Ki5oIE1MU0QgdCouaCBDb250cmFyeSB0byB0aGUgTUxTRCBzcGVjaWZpY2F0aW9uLAogICBzb21lIE1MU0QtY2FwYWJsZSBGVFAgc2VydmVycyBkbyBpbnRlcnByZXQgd2lsZGNhcmRzLiBUaGlzIGZvcm0gb2YgdGhlCiAgIE1HRVQgY29tbWFuZCBjYW4gYmUgdXNlZCB0byBmb3JjZSBhIHdpbGRjYXJkIHRvIGJlIHNlbnQgdG8gdGhlIHNlcnZlcgogICBmb3IgaW50ZXJwcmV0YXRpb24uCgogICBXaGVuIE1MU0QgaXMgdXNlZCBpbXBsaWNpdGx5ICh0aGF0IGlzLCB3aXRob3V0IGFuIC9NTFNEIHN3aXRjaCBnaXZlbgogICB0byBmb3JjZSB0aGUgdXNlIG9mIE1MU0QpIGFuZCBhbiBNR0VUIGNvbW1hbmQgc3VjaCBhcyAibWdldCBmb28vKi50eHQiCiAgIGZhaWxzLCBLZXJtaXQgYXV0b21hdGljYWxseSBmYWxscyBiYWNrIHRvIE5MU1QgYW5kIHRyaWVzIGFnYWluLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAzLjExLjUuIFJlZmVyZW5jZXMKCiAgICAxLiBQb3N0ZWwsIEouLCBhbmQgSi4gUmV5bm9sZHMsIEZpbGUgVHJhbnNmZXIgUHJvdG9jb2wgKEZUUCksIFJGQwogICAgICAgOTU5LCBPY3RvYmVyIDE5ODU6IFszNjFdZnRwOi8vZnRwLmlzaS5lZHUvaW4tbm90ZXMvcmZjOTU5LnR4dC4KICAgIDIuIEhldGhtb24sIFAsIGFuZCBSLiBFbHosIEZlYXR1cmUgbmVnb3RpYXRpb24gbWVjaGFuaXNtIGZvciB0aGUgRmlsZQogICAgICAgVHJhbnNmZXIgUHJvdG9jb2wsIFJGQyAyMzg5LCBBdWd1c3QgMTk5ODoKICAgICAgIFszNjJdZnRwOi8vZnRwLmlzaS5lZHUvaW4tbm90ZXMvcmZjMjM4OS50eHQuCiAgICAzLiBFbHosIFIsIGFuZCBQLiBIZXRobW9uLCBFeHRlbnNpb25zIHRvIEZUUCwgSW50ZXJuZXQgRHJhZnQKICAgICAgIGRyYWZ0LWlldGYtZnRwZXh0LW1sc3QtMTYudHh0LCBTZXB0ZW1iZXIgMjAwMjoKICAgICAgIFszNjNdaHR0cDovL3d3dy5pZXRmLm9yZy9pbnRlcm5ldC1kcmFmdHMvZHJhZnQtaWV0Zi1mdHBleHQtbWxzdC0xNgogICAgICAgLnR4dC4KICAgIDQuIFszNjRdVGhlIEtlcm1pdCBGVFAgQ2xpZW50IChvdmVydmlldykuCgogICBbIFszNjVdVG9wIF0gWyBbMzY2XUZUUCBUb3AgXSBbIFszNjddQy1LZXJtaXQgSG9tZSBdIFsgWzM2OF1LZXJtaXQKICAgSG9tZSBdCiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCjQuIEZJTEUgU0NBTk5JTkcKCiAgIEEgbmV3IGZlYXR1cmUgY2FsbGVkIGZpbGUgc2Nhbm5pbmcgaXMgdXNlZCBpbiB2YXJpb3VzIGNvbnRleHRzIHRvCiAgIGRldGVybWluZSBpZiBhIGZpbGUgaXMgdGV4dCBvciBiaW5hcnksIGFuZCBpZiBpdCBpcyB0ZXh0LCB3aGF0IGtpbmQgb2YKICAgdGV4dC4gVGhlIG92ZXJoZWFkIG9mIGZpbGUgc2Nhbm5pbmcgaXMgc3VycHJpc2luZ2x5IHRvbGVyYWJsZSwgdXN1YWxseQogICBhYm91dCBhIHF1YXJ0ZXIgc2Vjb25kIHBlciBmaWxlLiBGaWxlIHNjYW5uaW5nIGlzIG5vdyB1c2VkIGluc3RlYWQgb2YKICAgZmlsZW5hbWUgcGF0dGVybnMgdW5sZXNzIHlvdSBTRVQgRklMRSBTQ0FOIE9GRiwgd2hpY2ggcmVzdG9yZXMgdGhlCiAgIHByZXZpb3VzIGJlaGF2aW9yLgoKICAgVGhlIHByaW1hcnkgYmVuZWZpdCBvZiBmaWxlIHNjYW5uaW5nIGlzIGluIGZpbGUgdHJhbnNmZXIuIEZvciBhbGwKICAgcHJhY3RpY2FsIHB1cnBvc2VzLCBub3cgeW91IGNhbiBzdG9wIHdvcnJ5aW5nIGFib3V0IHdoZXRoZXIgYSBmaWxlCiAgIHNob3VsZCBiZSBzZW50IGluIGJpbmFyeSBvciB0ZXh0IG1vZGUsIG9yIGFib3V0IHNlbmRpbmcgbWl4dHVyZXMgb2YKICAgdGV4dCBhbmQgYmluYXJ5IGZpbGVzIGluIGEgc2luZ2xlIG9wZXJhdGlvbiwgb3IgY29uZmlndXJpbmcgYW5kCiAgIGZpbmUtdHVuaW5nIHlvdXIgbGlzdHMgb2YgYmluYXJ5LWZpbGUgYW5kIHRleHQtZmlsZSBuYW1lIHBhdHRlcm5zOiBub3cKICAgaXQgYWxsIGp1c3Qgd29ya3MuCgogICBGaWxlIHNjYW5uaW5nIGlzIGRvbmUgYnkgdGhlIGZpbGUgc2VuZGVyLCB3aGljaCBkZXRlcm1pbmVzIHRoZSB0eXBlIG9mCiAgIGVhY2ggZmlsZSBiZWZvcmUgaXQgc2VuZHMgaXQgYW5kIGluZm9ybXMgdGhlIHJlY2VpdmVyIChLZXJtaXQgb3IgRlRQCiAgIHNlcnZlcikgb2YgdGhlIHR5cGUuIEZpbGUgc2Nhbm5pbmcgaXMgTk9UIGRvbmUgYnkgdGhlIHJlY2VpdmVyLAogICBiZWNhdXNlIGl0IGlzIHRoZSBzZW5kZXIncyByZXNwb25zaWJpbGl0eSB0byBkZXRlcm1pbmUgZWFjaCBmaWxlJ3MKICAgdHlwZSwgc2VuZCB0aGUgZmlsZSBpbiB0aGUgcmlnaHQgbW9kZSwgYW5kIGluZm9ybSB0aGUgcmVjZWl2ZXIgb2YgdGhlCiAgIG1vZGUuIElmIGJvdGggdHJhbnNmZXIgcGFydG5lcnMgYXJlIGNhcGFibGUgb2YgdGhpcyAob3IgYW55IG90aGVyKQogICBmb3JtIG9mIGF1dG9tYXRpYyB0ZXh0L2JpbmFyeSBtb2RlIHN3aXRjaGluZywgdGhlbiBmaWxlcyBjYW4gYmUgc2VudAogICBpbiBib3RoIGRpcmVjdGlvbnMgd2l0aCBubyB3b3JyaWVzIGFib3V0IGNvcnJ1cHRpb24gZHVlIHRvCiAgIGluYXBwcm9wcmlhdGUgdHJhbnNmZXIgbW9kZS4gKEFzIG5vdGVkIGluIFszNjldU2VjdGlvbiAzLCBGVFAgc2VydmVycwogICBkb24ndCBkbyB0aGlzLCBzbyB0aGlzIGRpc2N1c3Npb24gZG9lcyBub3QgYXBwbHkgd2hlbiB1c2luZyBLZXJtaXQgdG8KICAgZG93bmxvYWQgZnJvbSBhbiBGVFAgc2VydmVyLikKCiAgIFRoZSByZXN0IG9mIHRoaXMgc2VjdGlvbiBpcyBtYWlubHkgZm9yIHRoZSBjdXJpb3VzLiBJZiB5b3UgZG9uJ3QgcmVhZAogICBpdCBhbmQgc2ltcGx5IGFjY2VwdCBhbGwgZGVmYXVsdHMsIGV2ZXJ5IGZpbGUgeW91IHNlbmQgc2hvdWxkIGdvIGluCiAgIHRoZSBhcHByb3ByaWF0ZSBtb2RlIGF1dG9tYXRpY2FsbHkuIEFzIGFsd2F5cywgaG93ZXZlciwgZm9yCiAgIGNoYXJhY3Rlci1zZXQgdHJhbnNsYXRpb24gdG8gd29yayBmb3IgNy0gYW5kIDgtYml0IGNoYXJhY3Rlci1zZXQKICAgZmlsZXMsIHRoZSBhcHByb3ByaWF0ZSBTRVQgRklMRSBDSEFSQUNURVItU0VUIGNvbW1hbmQocykgbXVzdCBoYXZlCiAgIGJlZW4gZXhlY3V0ZWQgdG8gaWRlbnRpZnkgdGhlaXIgZW5jb2RpbmcgKEtlcm1pdCdzIGRlZmF1bHQgZmlsZQogICBjaGFyYWN0ZXItc2V0IGlzIG5ldXRyYWwgQVNDSUkgZXhjZXB0IG9uIHBsYXRmb3JtcyBsaWtlIEhQLVVYIG9yCiAgIERHL1VYLCB3aGVyZSB0aGUgZGVmYXVsdCBmaWxlIGNoYXJhY3Rlci1zZXQgaXMga25vd24pLiBBbmQgb2YgY291cnNlLAogICByZWNlaXZpbmcgaXMgYW5vdGhlciBtYXR0ZXIgLS0gb2J2aW91c2x5IHRoZSBvdGhlciBLZXJtaXQgbXVzdCBhbHNvCiAgIHNlbmQgZWFjaCBmaWxlIGluIHRoZSBhcHByb3ByaWF0ZSBtb2RlLgoKICAgU2Nhbm5pbmcgaXMgbW9yZSByZWxpYWJsZSB0aGFuIGZpbGVuYW1lIHBhdHRlcm5zIHNpbXBseSBiZWNhdXNlCiAgIGZpbGVuYW1lcyBhcmUgbm90IHJlbGlhYmxlIGluZGljYXRvcnMgb2YgdGhlIGZpbGUncyBjb250ZW50cy4gQ2xhc3NpYwogICBleGFtcGxlcyBpbmNsdWRlICIuZG9jIiBmaWxlcywgd2hpY2ggYXJlIGJpbmFyeSBpZiBNaWNyb3NvZnQgV29yZAogICBkb2N1bWVudHMgYnV0IHRleHQgb24gbW9zdCBvdGhlciBwbGF0Zm9ybXMsIGFuZCAiLmNvbSIgZmlsZXMsIHdoaWNoCiAgIGFyZSBiaW5hcnkgb24gRE9TIGFuZCBXaW5kb3dzIGJ1dCB0ZXh0IG9uIFZNUy4gQW55d2F5LCBub2JvZHkga25vd3MKICAgdGhlIG5hbWluZyBjb252ZW50aW9ucyAoaWYgYW55KSBvZiBhbGwgdGhlIGFwcGxpY2F0aW9ucyAoYW5kIHBlcnNvbnMhKQogICBvbiB5b3VyIGNvbXB1dGVyLiBTY2FubmluZywgb24gdGhlIG90aGVyIGhhbmQsIGRldGVybWluZXMgZWFjaCBmaWxlJ3MKICAgdHlwZSBieSBpbnNwZWN0aW5nIGl0cyBjb250ZW50cyByYXRoZXIgdGhhbiBqdXN0IGxvb2tpbmcgYXQgaXRzIG5hbWUuCgogICBBbHNvLCBmaWxlIHBhdHRlcm5zIC0tIGV2ZW4gd2hlbiB0aGV5IHdvcmsgYXMgaW50ZW5kZWQgLS0gY2F0ZWdvcml6ZQogICBlYWNoIGZpbGUgb25seSBhcyB0ZXh0IG9yIGJpbmFyeSwgd2hlcmVhcyBmaWxlIHNjYW5uaW5nIGNhbiBtYWtlIGZpbmVyCiAgIGRpc3RpbmN0aW9uczoKCiAgIEJJTkFSWQogICAgICAgICAgQmluYXJ5IGRhdGEsIG5vdCB0byBiZSBjb252ZXJ0ZWQgaW4gYW55IHdheS4gRXhhbXBsZXMgaW5jbHVkZQogICAgICAgICAgYmluYXJ5IG1hY2hpbmUgY29kZSAoZXhlY3V0YWJsZSBwcm9ncmFtcyksIGdyYXBoaWNzIGltYWdlcwogICAgICAgICAgKEdJRiwgSlBHLCBldGMpLCBjb21wcmVzc2VkIGZpbGVzIChaLCBHWiwgZXRjKSwgYXJjaGl2ZXMgYW5kCiAgICAgICAgICBwYWNrYWdlcyAoWklQLCBUQVIsIFJQTSwgZXRjKSwgb2JqZWN0IGZpbGVzIGFuZCBsaWJyYXJpZXMgKE9CSiwKICAgICAgICAgIERMTCwgZXRjKS4KCiAgIDctQklUIFRFWFQKICAgICAgICAgIFRleHQgZW5jb2RlZCBpbiBhIDctYml0IGNoYXJhY3RlciBzZXQgc3VjaCBhcyBBU0NJSSBvciBvbmUgb2YKICAgICAgICAgIHRoZSBJU08gNjQ2IG5hdGlvbmFsIHZlcnNpb25zLiBLZXJtaXQgaGFzIG5vIHdheSB0byB0ZWxsIHdoaWNoCiAgICAgICAgICBjaGFyYWN0ZXIgaXMgdXNlZCwgb25seSB0aGF0IGl0J3MgNy1iaXQgdGV4dC4gVHlwaWNhbCBleGFtcGxlcwogICAgICAgICAgaW5jbHVkZSBwcm9ncmFtIHNvdXJjZSBjb2RlLCBSRUFETUUgZmlsZXMsIFBlcmwgb3IgS2VybWl0CiAgICAgICAgICBzY3JpcHRzLCBwbGFpbi10ZXh0IGVtYWlsLCBIVE1MLCBUZVgsIGFuZCB2YXJpb3VzIHRleHR1YWwKICAgICAgICAgIGVuY29kaW5ncyBvZiBiaW5hcnkgZmlsZXM6IEhleCwgQmFzZTY0LCBldGMuIFdoZW4gc2VuZGluZyBzdWNoCiAgICAgICAgICBmaWxlcywgdGhlIEZJTEUgREVGQVVMVCA3QklULUNIQVJBQ1RFUi1TRVQgaXMgdXNlZCBhcyB0aGUgZmlsZQogICAgICAgICAgY2hhcmFjdGVyLXNldCwgYW5kIHRoZW4gdGhlIGFwcHJvcHJpYXRlIHRyYW5zZmVyIGNoYXJhY3RlciBzZXQKICAgICAgICAgIGlzIGNob3NlbiBmcm9tIHRoZSBhc3NvY2lhdGlvbnMgbGlzdCAoQVNTT0NJQVRFLCBTSE9XCiAgICAgICAgICBBU1NPQ0lBVElPTlMpLgoKICAgOC1CSVQgVEVYVAogICAgICAgICAgVGV4dCBlbmNvZGVkIGluIGFuIDgtYml0IGNoYXJhY3RlciBzZXQgc3VjaCBhcyBMYXRpbi0xLAogICAgICAgICAgTGF0aW4tMiwgTGF0aW4vSGVicmV3LCBMYXRpbi9DeXJpbGxpYywgS09JOCwgSFAtUm9tYW44LCBKSVMgWAogICAgICAgICAgMDIwOCwgQ29kZSBQYWdlIDQzNywgb3IgQ29kZSBQYWdlIDEyNTIuIEFnYWluLCBLZXJtaXQgaGFzIG5vCiAgICAgICAgICB3YXkgb2Yga25vd2luZyB3aGljaCBwYXJ0aWN1bGFyIHNldCBpcyBpbiB1c2UsIG9ubHkgdGhhdCBpdCdzCiAgICAgICAgICA4LWJpdCB0ZXh0LiBXaGVuIHNlbmRpbmcgc3VjaCBmaWxlcywgdGhlIEZJTEUgREVGQVVMVAogICAgICAgICAgOEJJVC1DSEFSQUNURVItU0VUIGlzIHVzZWQgYXMgdGhlIGZpbGUgY2hhcmFjdGVyLXNldCwgYW5kIHRoZW4KICAgICAgICAgIHRoZSBhcHByb3ByaWF0ZSB0cmFuc2ZlciBjaGFyYWN0ZXIgc2V0IGlzIGNob3NlbiBmcm9tIHRoZQogICAgICAgICAgYXNzb2NpYXRpb25zIGxpc3QuCgogICBVQ1MyIFRFWFQKICAgICAgICAgIFVuaWNvZGUgaW4gaXRzIGJhc2ljIGZvcm0sIDE2IGJpdHMgKDIgb2N0ZXRzKSBwZXIgY2hhcmFjdGVyLgogICAgICAgICAgV2hlbiBzZW5kaW5nIHN1Y2ggZmlsZXMsIFVDUzIgaXMgdGhlIGZpbGUgY2hhcmFjdGVyLXNldCBhbmQgdGhlCiAgICAgICAgICBieXRlIG9yZGVyIGlzIGlkZW50aWZpZWQgYXV0b21hdGljYWxseTsgdGhlIGFwcHJvcHJpYXRlCiAgICAgICAgICB0cmFuc2ZlciBjaGFyYWN0ZXIgc2V0IGlzIGNob3NlbiBmcm9tIHRoZSBhc3NvY2lhdGlvbnMgbGlzdC4KICAgICAgICAgIE5vcm1hbGx5IHRoaXMgd291bGQgYmUgVVRGOC4gVVRGLTE2IGlzIG5vdCBzdXBwb3J0ZWQgeWV0OwogICAgICAgICAgS2VybWl0J3MgVW5pY29kZSB0cmFuc2xhdGlvbnMgYXJlIHJlc3RyaWN0ZWQgdG8gUGxhbmUgMCwgdGhlCiAgICAgICAgICBCYXNlIE11bHRpbGluZ3VhbCBQbGFuZSAoQk1QKS4KCiAgIFVURjggVEVYVAogICAgICAgICAgVW5pY29kZSBpbiBpdHMgOC1iaXQgdHJhbnNmb3JtYXRpb24gZm9ybWF0LiBXaGVuIHNlbmRpbmcgc3VjaAogICAgICAgICAgZmlsZXMsIFVURjggaXMgdGhlIGZpbGUgY2hhcmFjdGVyLXNldDsgdGhlIGFwcHJvcHJpYXRlIHRyYW5zZmVyCiAgICAgICAgICBjaGFyYWN0ZXIgc2V0IGlzIGNob3NlbiBmcm9tIHRoZSBhc3NvY2lhdGlvbnMgbGlzdCwgbm9ybWFsbHkKICAgICAgICAgIFVDUzIgb3IgVVRGOC4KCiAgIEZpbGUgc2Nhbm5pbmcgaXMgYXZhaWxhYmxlIGluIFVOSVggQy1LZXJtaXQsIGluIEstOTUsIGFuZCB0byBhIGxpbWl0ZWQKICAgZXh0ZW50LCBpbiBWTVMgQy1LZXJtaXQgKGZ1bGwgc2Nhbm5pbmcgaXMgcHJvYmxlbWF0aWMgaW4gVk1TIGJlY2F1c2UKICAgZXZlbiBwbGFpbi10ZXh0IGZpbGVzIG1pZ2h0IGNvbnRhaW4gYmluYXJ5IHJlY29yZC1mb3JtYXQgaW5mb3JtYXRpb24pLgogICBUaGUgcmVsZXZhbnQgY29tbWFuZHMgYXJlOgoKICAgU0VUIFRSQU5TRkVSIE1PREUgeyBBVVRPTUFUSUMsIE1BTlVBTCB9CiAgICAgICAgICBUZWxscyB3aGV0aGVyIHRoZSBmaWxlLXRyYW5zZmVyIG1vZGUgKHRleHQgb3IgYmluYXJ5KSBzaG91bGQgYmUKICAgICAgICAgIHNldCBieSBhdXRvbWF0aWMgb3IgIm1hbnVhbCIgbWVhbnMuIEFVVE9NQVRJQyBpcyB0aGUgZGVmYXVsdCwKICAgICAgICAgIHdoaWNoIGFsbG93cyBhbnkgb2YgdGhlIGF1dG9tYXRpYyBtZXRob2RzIHRoYXQgYXJlIGVuYWJsZWQgdG8KICAgICAgICAgIGRvIHRoZWlyIGpvYnM6IEZJTEUgU0NBTiwgRklMRSBQQVRURVJOUywgcGVlciByZWNvZ25pdGlvbiwgZXRjLgogICAgICAgICAgTUFOVUFMIGxldHMgeW91IGNvbnRyb2wgdGhlIHRyYW5zZmVyIG1vZGUgd2l0aCB0aGUgU0VUIEZJTEUKICAgICAgICAgIFRZUEUgY29tbWFuZHMuIEFzIGFsd2F5cywgL1RFWFQgYW5kIC9CSU5BUlkgc3dpdGNoZXMgb24geW91cgogICAgICAgICAgZmlsZS10cmFuc2ZlciBjb21tYW5kcyBvdmVycmlkZSBhbGwgb3RoZXIgbWV0aG9kczsgaWYgeW91IGdpdmUKICAgICAgICAgIG9uZSBvZiB0aGVzZSBzd2l0Y2hlcywgc2Nhbm5pbmcgaXMgbm90IGRvbmUuIFNIT1cgVFJBTlNGRVIKICAgICAgICAgIGRpc3BsYXlzIHRoZSBjdXJyZW50IFRSQU5TRkVSIE1PREUgc2V0dGluZy4KCiAgIFNFVCBGSUxFIFNDQU4geyBPTiBbIG51bWJlciBdLCBPRkYgfQogICAgICAgICAgVHVybnMgdGhpcyBmZWF0dXJlIG9uIGFuZCBvZmYuIEl0J3MgT04gYnkgZGVmYXVsdC4gV2hlbiBPRkYsCiAgICAgICAgICB0aGUgcHJldmlvdXMgcnVsZXMgYXBwbHkgKFNFVCBGSUxFIFBBVFRFUk5TLCBldGMpLiBXaGVuIE9OIGlzCiAgICAgICAgICBnaXZlbiwgeW91IGNhbiBhbHNvIHNwZWNpZnkgYSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgc2Nhbm5lZC4KICAgICAgICAgIFRoZSBkZWZhdWx0IGlzIDQ5MTUyICg9IDQ4SykuIElmIGEgbmVnYXRpdmUgbnVtYmVyIGlzIGdpdmVuLAogICAgICAgICAgdGhlIGVudGlyZSBmaWxlIGlzIHNjYW5uZWQsIG5vIG1hdHRlciBob3cgYmlnLCBmb3IgbWF4aW11bQogICAgICAgICAgY2VydGFpbnR5IChmb3IgZXhhbXBsZSwgYSBQb3N0U2NyaXB0IGZpbGUgdGhhdCBhcHBlYXJzIHRvIGJlCiAgICAgICAgICBwbGFpbiB0ZXh0IG1pZ2h0IGluY2x1ZGUgYW4gZW1iZWRkZWQgZ3JhcGhpYyBwYXN0IHRoZSBub3JtYWwKICAgICAgICAgIHNjYW5uaW5nIGxpbWl0KS4gU0hPVyBGSUxFIGRpc3BsYXlzIHRoZSBjdXJyZW50IEZJTEUgU0NBTgogICAgICAgICAgc2V0dGluZy4KCiAgIFNFVCBGSUxFIERFRkFVTFQgN0JJVC1DSEFSQUNURVItU0VUIG5hbWUKICAgICAgICAgIFRlbGxzIHRoZSA3LWJpdCBjaGFyYWN0ZXItc2V0IHRvIHVzZSBpZiBzY2FubmluZyBpZGVudGlmaWVzIGEKICAgICAgICAgIDctYml0IHRleHQgZmlsZSwgZS5nLiBHRVJNQU4uIFNIT1cgRklMRSBkaXNwbGF5cyB0aGUgY3VycmVudAogICAgICAgICAgU0VUIEZJTEUgREVGQVVMVCBzZXR0aW5ncy4gU28gZG9lcyBTSE9XIENIQVJBQ1RFUi1TRVRTLgoKICAgU0VUIEZJTEUgREVGQVVMVCA4QklULUNIQVJBQ1RFUi1TRVQgbmFtZQogICAgICAgICAgVGVsbHMgdGhlIDgtYml0IGNoYXJhY3Rlci1zZXQgdG8gdXNlIGlmIHNjYW5uaW5nIGlkZW50aWZpZXMgYW4KICAgICAgICAgIDgtYml0IHRleHQgZmlsZSwgZS5nLiBMQVRJTjEuIFNIT1cgRklMRSBhbmQgU0hPVyBDSEFSQUNURVItU0VUCiAgICAgICAgICBkaXNwbGF5IHRoaXMuCgogICBBU1NPQ0lBVEUgRklMRS1DSEFSQUNURVItU0VUIGZjcyB0Y3MKICAgICAgICAgIFdoZW4gc2VuZGluZyBmaWxlcyBhbmQgYSBmaWxlIGNoYXJhY3Rlci1zZXQgKGZjcykgaXMgaWRlbnRpZmllZAogICAgICAgICAgYnkgc2Nhbm5pbmcsIHRoaXMgdGVsbHMgQy1LZXJtaXQgd2hpY2ggdHJhbnNmZXIgY2hhcmFjdGVyLXNldAogICAgICAgICAgKHRjcykgdG8gdHJhbnNsYXRlIGl0IHRvLiBJdCBhbHNvIGFsbG93cyBDLUtlcm1pdCB0byBzZXQgdGhlCiAgICAgICAgICBhcHByb3ByaWF0ZSB0cmFuc2ZlciBjaGFyYWN0ZXItc2V0IGF1dG9tYXRpY2FsbHkgd2hlbmV2ZXIgeW91CiAgICAgICAgICBnaXZlIGEgU0VUIEZJTEUgQ0hBUkFDVEVSLVNFVCBjb21tYW5kLgoKICAgQVNTT0NJQVRFIFRSQU5TRkVSLUNIQVJBQ1RFUi1TRVQgdGNzIGZjcwogICAgICAgICAgV2hlbiByZWNlaXZpbmdpbmcgZmlsZXMgYW5kIGEgZmlsZSBhcnJpdmVzIHdob3NlIHRyYW5zZmVyCiAgICAgICAgICBjaGFyYWN0ZXItc2V0ICh0Y3MpIGlzIGFubm91bmNlZCBieSB0aGUgc2VuZGVyLCB0aGlzIGNvbW1hbmQKICAgICAgICAgIHRlbGxzIEMtS2VybWl0IHdoaWNoIGZpbGUgY2hhcmFjdGVyLXNldCAoZmNzKSB0byB0cmFuc2xhdGUgaXQKICAgICAgICAgIHRvLiBJdCBhbHNvIGFsbG93cyBDLUtlcm1pdCB0byBzZXQgdGhlIGFwcHJvcHJpYXRlIGZpbGUKICAgICAgICAgIGNoYXJhY3Rlci1zZXQgd2hlbmV2ZXIgeW91IGdpdmUgYSBTRVQgVFJBTlNGRVIgQ0hBUkFDVEVSLVNFVAogICAgICAgICAgY29tbWFuZC4KCiAgIFNFVCBGSUxFIENIQVJBQ1RFUi1TRVQgbmFtZQogICAgICAgICAgV2hlbiBnaXZlbiBmb3IgYSA3LWJpdCBzZXQsIGFsc28gc2V0cyBGSUxFIERFRkFVTFQKICAgICAgICAgIDdCSVQtQ0hBUkFDVEVSLVNFVCB0byB0aGUgc2FtZSBzZXQuIFdoZW4gZ2l2ZW4gZm9yIGFuIDgtYml0CiAgICAgICAgICBzZXQsIGFsc28gc2V0cyBGSUxFIERFRkFVTFQgOEJJVC1DSEFSQUNURVItU0VUIHRvIHRoZSBzYW1lIHNldC4KICAgICAgICAgIElmIGFuIEFTU09DSUFURSBGSUxFLUNIQVJBQ1RFUi1TRVQgY29tbWFuZCBoYXMgYmVlbiBnaXZlbiBmb3IKICAgICAgICAgIHRoaXMgc2V0LCBhbHNvIHNldHMgdGhlIGNvcnJlc3BvbmRpbmcgdHJhbnNmZXIgY2hhcmFjdGVyLXNldC4KCiAgIERJUkVDVE9SWSAvWEZFUk1PREUgWyBmaWxlc3BlYyBdCiAgICAgICAgICBQZXJmb3JtcyBhIGZpbGUgc2NhbiBvZiB0aGUgZ2l2ZW4gZmlsZXMsIGxpc3RpbmcgdGhlIHJlc3VsdCBmb3IKICAgICAgICAgIGVhY2ggZmlsZS4gSWYgRklMRSBTQ0FOIGlzIE9GRiBidXQgUEFUVEVSTlMgYXJlIE9OLCB0aGUgcmVzdWx0CiAgICAgICAgICBzaG93biBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgRklMRSBURVhULVBBVFRFUk5TIGFuZAogICAgICAgICAgQklOQVJZLVBBVFRFUk5TLCBhbmQgYXJlIHJlc3RyaWN0ZWQgdG8gKEIpIGFuZCAoVCkuIFdoZW4gRklMRQogICAgICAgICAgU0NBTiBpcyBPTiwgdGhlIHJlc3VsdHMgYXJlOgoKICAoQikgICAgICAgICAgQmluYXJ5CiAgKFQpKDdCSVQpICAgIFRleHQ6IDctYml0CiAgKFQpKDhCSVQpICAgIFRleHQ6IDgtYml0CiAgKFQpKFVURjgpICAgIFRleHQ6IFVuaWNvZGUgVVRGOAogIChUKShVQ1MyQkUpICBUZXh0OiBVbmljb2RlIFVDUzIgQmlnIEVuZGlhbgogIChUKShVQ1MyTEUpICBUZXh0OiBVbmljb2RlIFVDUzIgTGl0dGxlIEVuZGlhbgoKICAgICAgICAgIFNvIHlvdSBjYW4gdXNlIERJUiAvWEZFUiB0byBnZXQgYSBwcmV2aWV3IG9mIGhvdyBlYWNoIGZpbGUgaW4gYQogICAgICAgICAgc2VsZWN0ZWQgZ3JvdXAgd2lsbCBiZSB0cmFuc2ZlcnJlZC4gRXZlcnl0aGluZyB0byB0aGUgcmlnaHQgb2YKICAgICAgICAgIHRoZSAoQikgb3IgKFQpIGlzIG5ldy4gSWYgRklMRSBTQ0FOIGlzIE9GRiwgeW91IG9ubHkgZ2V0IHRoZQogICAgICAgICAgKEIpIG9yIChUKSBhcyBiZWZvcmUuCgogICAgICAgICAgTm90ZTogQmlnIGFuZCBMaXR0bGUgRW5kaWFuIHJlZmVyIHRvIHRoZSBvcmRlcmluZyBvZiBieXRlcwogICAgICAgICAgd2l0aGluIGEgY29tcHV0ZXIgd29yZC4gQmlnIEVuZGlhbiBhcmNoaXRlY3R1cmUgaXMgc3RhbmRhcmQgYW5kCiAgICAgICAgICBpcyB1c2VkIG9uIG1vc3Qgbm9uLVBDIGNvbXB1dGVycy4gTGl0dGxlIEVuZGlhbiBhcmNoaXRlY3R1cmUgaXMKICAgICAgICAgIHVzZWQgb24gUENzLgoKICAgVG8gaWxsdXN0cmF0ZSBmaWxlLXRyYW5zZmVyIHdpdGggc2Nhbm5pbmcsIHN1cHBvc2UgeW91IGhhdmUgYQogICBkaXJlY3RvcnkgY29udGFpbmluZyBhIG1peHR1cmUgb2YgdGV4dCBhbmQgYmluYXJ5IGZpbGVzLCBhbmQgZWFjaCB0ZXh0CiAgIGZpbGUgY2FuIGJlIDctYml0IEdlcm1hbiBJU08gNjQ2LCA4LWJpdCBMYXRpbi0xLCBvciBVbmljb2RlIGluIGFueSBvZgogICB0aGUgZm9sbG93aW5nIGZvcm1zOiBVQ1MyIExpdHRsZSBFbmRpYW4sIFVDUzIgQmlnIEVuZGlhbiwgb3IgVVRGOAogICAoWzM3MF1VVEYtMTYgaXMgbm90IHN1cHBvcnRlZCB5ZXQpLiBBc3N1bWluZyBhbGwgdGhlIGJ1aWx0LWluIGRlZmF1bHRzCiAgIGFyZSBpbiBlZmZlY3QsIHRoZSBmb2xsb3dpbmcgdGhyZWUgY29tbWFuZHMgZG8gdGhlIGpvYjoKCiAgc2V0IGZpbGUgY2hhciBnZXJtYW4gICA7IFRoaXMgc2V0cyB0aGUgZGVmYXVsdCBmb3IgNy1iaXQgdGV4dCBmaWxlcwogIHNldCBmaWxlIGNoYXIgbGF0aW4xICAgOyBUaGlzIHNldHMgdGhlIGRlZmF1bHQgZm9yIDgtYml0IHRleHQgZmlsZXMKICBzZW5kICoKCiAgIEVhY2ggZmlsZSBpcyBzZW50IGluIHRoZSBhcHByb3ByaWF0ZSBtb2RlICh0ZXh0IG9yIGJpbmFyeSksIHdpdGggdGV4dAogICBmaWxlcyBjb252ZXJ0ZWQgdG8gdGhlIGFwcHJvcHJpYXRlIHRyYW5zZmVyIGNoYXJhY3Rlci1zZXQgYW5kIGxhYmVsZWQKICAgc28gdGhlIHJlY2VpdmVyIGNhbiBjb252ZXJ0IHRoZW0gYWNjb3JkaW5nIHRvIGl0cyBvd24gbG9jYWwKICAgY29udmVudGlvbnMuCgogICBCeSB0aGUgd2F5LCB3aGF0IGlmIHlvdSB3YW50IHRvIGluaGliaXQgY2hhcmFjdGVyLXNldCB0cmFuc2xhdGlvbiBidXQKICAgc3RpbGwgYWxsb3cgYXV0b21hdGljIHRleHQvYmluYXJ5IG1vZGUgc3dpdGNoaW5nPyBQcmV2aW91c2x5LCB5b3UKICAgY291bGQgc2ltcGx5IFNFVCBUUkFOU0ZFUiBDSEFSQUNURVItU0VUIFRSQU5TUEFSRU5ULiBCdXQgbm93IHdpdGggZmlsZQogICBzY2FubmluZywgdGhlIGZpbGUgYW5kIHRyYW5zZmVyIGNoYXJhY3Rlci1zZXRzIGFyZSBzZXQgYXV0b21hdGljYWxseQogICBwZXIgZmlsZS4gQSBuZXcgY29tbWFuZCB3YXMgYWRkZWQgZm9yIHRoaXMgcHVycG9zZToKCiAgIFNFVCBUUkFOU0ZFUiBUUkFOU0xBVElPTiB7IE9OLCBPRkYgfQogICAgICAgICAgRW5hYmxlcyBhbmQgZGlzYWJsZXMgZmlsZS10cmFuc2ZlciBjaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9uLgogICAgICAgICAgSXQgaXMgZW5hYmxlZCBieSBkZWZhdWx0LgoKICAgV2hlbiBUUkFOU0ZFUiBUUkFOU0xBVElPTiBpcyBPRkYgYnV0IEZJTEUgU0NBTiBpcyBPTiwgZmlsZXMgYXJlIHN0aWxsCiAgIHNjYW5uZWQgdG8gc2VlIGlmIHRoZXkgYXJlIHRleHQgb3IgYmluYXJ5LCBidXQgbm8gY2hhcmFjdGVyLXNldAogICB0cmFuc2xhdGlvbiBpcyBkb25lIHdoZW4gdGhleSB0ZXh0OiBvbmx5IHRoZSBub3JtYWwgcmVjb3JkLWZvcm1hdAogICBjb252ZXJzaW9uLgoKICAgTGlrZSBhbGwgU0VUIGNvbW1hbmRzLCBTRVQgVFJBTlNGRVIgVFJBTlNMQVRJT04gaXMgZ2xvYmFsIGFuZAogICBwZXJzaXN0ZW50LiBZb3UgY2FuIGFsc28gZm9yY2UgYSBwYXJ0aWN1bGFyIGZpbGUtdHJhbnNmZXIgY29tbWFuZAogICAoU0VORCwgTVNFTkQsIEdFVCwgUkVDRUlWRSwgVFJBTlNNSVQsIGV0YykgdG8gbm90IHRyYW5zbGF0ZSB3aXRob3V0CiAgIGFmZmVjdGluZyB0aGUgZ2xvYmFsIHRyYW5zbGF0aW9uIHNldHRpbmdzIGJ5IGluY2x1ZGluZyB0aGUgbmV3CiAgIC9UUkFOU1BBUkVOVCBzd2l0Y2gsIGUuZy4KCiAgc2VuZCAvdHJhbnNwYXJlbnQgb29mYS50eHQKCiAgIEFzIG9mIEMtS2VybWl0IDguMC4yMDYsIFNFVCBUUkFOU0ZFUiBDSEFSQUNURVItU0VUIFRSQU5TUEFSRU5UIGltcGxpZXMKICAgU0VUIFRSQU5TRkVSIFRSQU5TTEFUSU9OIE9GRi4KCiAgIEZpbGUgc2Nhbm5pbmcgaXMgYWxzbyB1c2VkIGluIHRoZSBUWVBFIGNvbW1hbmQuIFRoZSBzb3VyY2UgZmlsZSB0eXBlCiAgIGFuZCBjaGFyYWN0ZXIgc2V0IGFyZSBkZXRlcm1pbmVkIGFzIGFib3ZlLCBhbmQgdGhlbiB0aGUgZmlsZSBpcwogICBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byB5b3VyIGRpc3BsYXkgY2hhcmFjdGVyLXNldCwgbGluZSBieSBsaW5lLgogICBJbiBLZXJtaXQgOTUsIHRoZSBkaXNwbGF5IGNoYXJhY3Rlci1zZXQgaXMgVW5pY29kZSwgcGVyaGFwcyBjb252ZXJ0ZWQKICAgdG8geW91ciBjdXJyZW50IGNvbnNvbGUgY29kZSBwYWdlOyBpbiBvdGhlciB2ZXJzaW9ucyBvZiBDLUtlcm1pdCwgaXQKICAgaXMgeW91ciBjdXJyZW50IGZpbGUgY2hhcmFjdGVyLXNldC4gVGh1cyBpZiB5b3UgaGF2ZSB0aGUgZm9sbG93aW5nIHNldAogICBhcHByaWF0ZWx5OgoKICBTRVQgRklMRSBDSEFSQUNURVItU0VUIChuZWNlc3NhcnkgaW4gVW5peCBidXQgbm90IEs5NSkKICBTRVQgRklMRSBERUZBVUxUIDdCSVQgQ0hBUkFDVEVSLVNFVAogIFNFVCBGSUxFIERFRkFVTFQgOEJJVCBDSEFSQUNURVItU0VUCgogICB0aGVuIHlvdSBzaG91bGQgYmUgYWJsZSB0byBUWVBFIGFueSB0ZXh0IGZpbGUgYW5kIHNlZSBzb21ldGhpbmcKICAgcmVhc29uYWJsZS4gRm9yIGV4YW1wbGUsIGluIFVuaXgsIGlmIHlvdXIgREVGQVVMVCA3QklULUNIQVJBQ1RFUi1TRVQKICAgaXMgSVRBTElBTiBhbmQgeW91ciBERUZBVUxUIDhCSVQtQ0hBUkFDVEVSLVNFVCBpcyBMQVRJTjEsIGFuZCB5b3VyCiAgIEZJTEUgQ0hBUkFDVEVSLVNFVCBpcyBMQVRJTjEsIHlvdSBjYW4gVFlQRSBhbiBJdGFsaWFuIElTTyA2NDYgZmlsZSwgYQogICBMYXRpbi0xIGZpbGUsIG9yIGFueSBraW5kIG9mIFVuaWNvZGUgZmlsZSwgYW5kIGhhdmUgaXQgdHJhbnNsYXRlZAogICBhdXRvbWF0aWNhbGx5IHRvIExhdGluLTEgZm9yIHlvdXIgZGlzcGxheS4KCiAgIEluIHRoZSBHVUkgdmVyc2lvbiBvZiBLZXJtaXQgOTUsIHlvdSBjYW4gc2VlIG1peHR1cmVzIG9mIG1hbnkKICAgZGlmZmVyZW50IHNjcmlwdHMgaWYgdGhlIGZpbGUgaXMgVVRGOCBvciBVQ1MyOiBSb21hbiwgQ3lyaWxsaWMsCiAgIEhlYnJldywgR3JlZWssIEFybWVuaWFuLCBHZW9yZ2lhbiwgZXRjLCBhbGwgb24gdGhlIHNhbWUgc2NyZWVuIGF0CiAgIG9uY2UuCgogICBGaWxlIHNjYW5uaW5nIGFsc28gYWRkcyBhIG5ldyBjcml0ZXJpb24gZm9yIGZpbGUgc2VsZWN0aW9uLCBpLmUuIHRvCiAgIHNlbGVjdCBvbmx5IHRleHQgKG9yIGJpbmFyeSkgZmlsZXMuIFNldmVyYWwgY29tbWFuZHMgbm93IGluY2x1ZGUgYSBuZXcKICAgc3dpdGNoLCAvVFlQRTp7QklOQVJZLFRFWFQsQUxMfS4gQklOQVJZIG1lYW5zIHNlbGVjdCBvbmx5IGJpbmFyeQogICByZWd1bGFyIGZpbGVzIChub3QgZGlyZWN0b3JpZXMpLiBURVhUIG1lYW5zIHNlbGVjdCBvbmx5IHRleHQgZmlsZXMuCiAgIEFMTCBtZWFucyBkb24ndCBzY2FuOyBzZWxlY3QgYWxsIGZpbGVzLiBFeGFtcGxlczoKCiAgIFNFTkQgL1RZUEU6QklOQVJZICouKgogICAgICAgICAgU2VuZHMgb25seSBiaW5hcnkgZmlsZXMsIHNraXBwaW5nIG92ZXIgdGV4dCBmaWxlcy4KCiAgIE5PVEU6IEZpbGUgc2Nhbm5pbmcgaXMgTk9UIGRvbmUgd2hlbiB1c2luZyBleHRlcm5hbCBwcm90b2NvbHMgKGJlY2F1c2UKICAgdGhlIGV4dGVybmFsIHByb3RvY29sIHByb2dyYW1zLCBzdWNoIGFzIHN6LCBhcmUgcHJvY2Vzc2luZyBlYWNoIGZpbGUsCiAgIG5vdCBLZXJtaXQpLgoKICAgRElSRUNUT1JZIC9UWVBFOlRFWFQKICAgICAgICAgIExpc3RzIG9ubHkgdGV4dCBmaWxlcyBidXQgbm90IGJpbmFyeSBmaWxlcy4KCiAgIERFTEVURSAvVFlQRTpCSU5BUlkgZm9vLioKICAgICAgICAgIERlbGV0ZXMgYWxsIGZvby4qIGZpbGVzIHRoYXQgYXJlIHJlZ3VsYXIgYmluYXJ5IGZpbGVzIGJ1dCBkb2VzCiAgICAgICAgICBub3QgZGVsZXRlIGFueSB0ZXh0IGZpbGVzLgoKICAgQ0hNT0QgL1RZUEU6QklOQVJZIDc3NSAqCiAgICAgICAgICAoVU5JWCkgQ2hhbmdlcyB0aGUgcGVybWlzc2lvbnMgb2YgYWxsIGJpbmFyeSBmaWxlcyB0byA3NzUuCgogICBXaGVuIEZJTEUgU0NBTiBpcyBPRkYgYW5kIEZJTEUgUEFUVEVSTlMgYXJlIE9OLCBiZWhhdmlvciBpcyBhcyBiZWZvcmUKICAgd2l0aCBQQVRURVJOUyBPTiwgYnV0IHdpdGggc29tZSBpbXByb3ZlbWVudHM6CgogICAgICogUGF0aG5hbWVzIGFyZSBub3cgc3RyaXBwZWQgcHJpb3IgdG8gcGF0dGVybiBtYXRjaGluZy4KICAgICAqIEJhY2t1cCBzdWZmaXhlcyAobGlrZSAufjN+KSBhcmUgc3RyaXBwZWQgcHJpb3IgdG8gcGF0dGVybgogICAgICAgbWF0Y2hpbmcuCgogICBbIFszNzFdVG9wIF0gWyBbMzcyXUNvbnRlbnRzIF0gWyBbMzczXUMtS2VybWl0IEhvbWUgXSBbIFszNzRdS2VybWl0CiAgIEhvbWUgXQogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgo1LiBGSUxFIEFORCBESVJFQ1RPUlkgTkFNRVMgQ09OVEFJTklORyBTUEFDRVMKCiAgIFByaW9yIHRvIHRoZSBpbnRyb2R1Y3Rpb24gb2YgdGhlIGdyYXBoaWNhbCB1c2VyIGludGVyZmFjZSAoR1VJKSwgaXQKICAgd2FzIGluY29uY2VpdmFibGUgdGhhdCBmaWxlIG9yIGRpcmVjdG9yeSBuYW1lcyBjb3VsZCBjb250YWluIHNwYWNlcywKICAgYmVjYXVzZSBzcGFjZSBpcyBhIGZpZWxkIGRlbGltaXRlciBpbiBhbGwgY29tbWFuZCBsYW5ndWFnZXMuIEdVSXMsCiAgIGhvd2V2ZXIsIHVzZSBkaWFsb2cgYm94ZXMgZm9yIGZpbGVuYW1lcywgc28gdGhlcmUgaXMgbmV2ZXIgYW55CiAgIHF1ZXN0aW9uIG9mIGRpc3Rpbmd1aXNoaW5nIGEgZmlsZW5hbWUgZnJvbSBhZGphY2VudCBmaWVsZHMgLS0gYmVjYXVzZQogICB0aGVyZSBhcmUgbm8gYWRqYWNlbnQgZmllbGRzIC0tIGFuZCB0aGVyZWZvcmUgaXQgaGFzIGJlY29tZSBxdWl0ZQogICBjb21tb24gb24gY29tcHV0ZXJzIHRoYXQgaGF2ZSBHVUlzIHRvIGhhdmUgZmlsZSBhbmQgZGlyZWN0b3J5IG5hbWVzCiAgIGNvbXBvc2VkIG9mIG11bHRpcGxlIHdvcmRzLiBPZiBjb3Vyc2UgdGhpcyBwb3NlcyBwcm9ibGVtcyBmb3IgY29tbWFuZAogICBzaGVsbHMgYW5kIG90aGVyIHRleHQtb3JpZW50ZWQgcHJvZ3JhbXMuCgogICBNb3N0IGNvbW1hbmQgc2hlbGxzIGFkZHJlc3MgdGhlc2UgcHJvYmxlbXMgYnkgYWxsb3dpbmcgc3VjaCBuYW1lcyB0bwogICBiZSBlbmNsb3NlZCBpbiBkb3VibGVxdW90ZXMsIGUuZy46CgogIGNkICJjOlxQcm9ncmFtIEZpbGVzIgoKICAgQy1LZXJtaXQgcHJldmlvdXNseSB1c2VkIGJyYWNlcyBmb3IgdGhpczoKCiAgY2Qge2M6XFByb2dyYW0gRmlsZXN9CgogICB3aGljaCB3YXMgbm90IHdoYXQgbW9zdCBwZW9wbGUgZXhwZWN0ZWQuIEFuZCBldmVuIHdoZW4gYnJhY2VzIHdlcmUKICAgdXNlZCwgS2VybWl0IGhhZCBkaWZmaWN1bHRpZXMgd2l0aCBjb21wbGV0aW9uLCBmaWxlIG1lbnVzLCBhbmQgc28KICAgZm9ydGgsIHdpdGhpbiBicmFjZWQgZmllbGRzLgoKICAgQy1LZXJtaXQgOC4wIGFsbG93cyBlaXRoZXIgZG91YmxlcXVvdGVzIG9yIGJyYWNlcyB0byBiZSB1c2VkIGZvcgogICBncm91cGluZzoKCiAgc2VuZCAidGhpcyBmaWxlIgogIHNlbmQge3RoaXMgZmlsZX0KICByZW5hbWUgInRoaXMgZmlsZSIgInRoYXQgZmlsZSIKICByZW5hbWUge3RoaXMgZmlsZX0gInRoYXQgZmlsZSIKICByZW5hbWUgInRoaXMgZmlsZSIge3RoYXQgZmlsZX0KICBjZCB7UHJvZ3JhbSBGaWxlc30KICBjZCAiUHJvZ3JhbSBGaWxlcyIKCiAgIE5vdGUgdGhhdCB0aGUgZG91YmxlcXVvdGVzIG9yIGJyYWNrZXRzIG11c3QgZW5jbG9zZSB0aGUgd2hvbGUgZmlsZSBvcgogICBkaXJlY3Rvcnkgc3BlY2lmaWNhdGlvbjoKCiAgImM6XE15IERpcmVjdG9yeSIKCiAgIG5vdDoKCiAgYzpcIk15IERpcmVjdG9yeSIKCiAgIEluIEMtS2VybWl0IDguMCwgeW91IGNhbiBhbHNvIHVzZSBjb21wbGV0aW9uIG9uIHRoZXNlIGZpbGVuYW1lcywgaW4KICAgd2hpY2ggY2FzZSBLZXJtaXQgc3VwcGxpZXMgdGhlIHF1b3RlcyAob3IgYnJhY2VzKSBhdXRvbWF0aWNhbGx5LgogICBFeGFtcGxlIChpbiB3aGljaCB0aGUgY3VycmVudCBkaXJlY3RvcnkgY29udGFpbnMgb25seSBvbmUgZmlsZSB3aG9zZQogICBuYW1lIHN0YXJ0cyB3aXRoICJ0aCIgYW5kIGl0cyBmdWxsIG5hbWUgaXMgInRoaXMgZmlsZSIgKHdpdGhvdXQgdGhlCiAgIHF1b3RlcywgYnV0IHdpdGggdGhlIHNwYWNlKSk6CgogIGNhdCB0aDxUYWI+CgogICBLZXJtaXQgcmVwYWludHMgdGhlIGZpbGVuYW1lIGZpZWxkIGxpa2UgdGhpczoKCiAgY2F0ICJ0aGlzIGZpbGUiCgogICBUaGF0IGlzLCBpdCBiYWNrc3BhY2VzIG92ZXIgdGhlIG9yaWdpbmFsICJ0aCIgYW5kIHRoZW4gd3JpdGVzIHRoZQogICBmaWxlbmFtZSBpbiBkb3VibGVxdW90ZXMuCgogICBJZiBjb21wbGV0aW9uIGlzIG9ubHkgcGFydGlhbCwgS2VybWl0IHN0aWxsIHN1cHBsaWVzIHRoZSBxdW90ZXMsIGJ1dAogICBpbiB0aGlzIGNhc2UgYWxzbyBiZWVwcy4gVG8gY29udGludWUgdGhlIGZpbGVuYW1lLCB5b3UgbXVzdCBmaXJzdAogICBiYWNrc3BhY2Ugb3ZlciB0aGUgY2xvc2luZyBxdW90ZS4gVGhlIGNsb3NpbmcgcXVvdGUgaXMgc3VwcGxpZWQgaW4KICAgdGhpcyBjYXNlIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdSBjYW4gc2VlIHRoZSBzcGFjZXMsIGVzcGVjaWFsbHkgaWYgdGhleQogICBhcmUgdHJhaWxpbmcuIEZvciBleGFtcGxlLCBpZiB0aGUgY3VycmVudCBkaXJlY3RvcnkgY29udGFpbnMgdHdvIGZpbGVzCiAgIHdob3NlIG5hbWVzIHN0YXJ0IHdpdGggInRoIiwgYW5kIHRoZWlyIGZpbGwgbmFtZXMgYXJlICJ0aGlzIGZpbGUiIGFuZAogICAidGhpcyBvdGhlciBmaWxlIjoKCiAgY2F0IHRoPFRhYj4KCiAgIEtlcm1pdCBwcmludHM6CgogIGNhdCAidGhpcyAiPEJlZXA+CgogICBJZiBpdCBkaWRuJ3QgcHJpbnQgdGhlIGNsb3NpbmcgcXVvdGUsIHlvdSB3b3VsZCBwcm9iYWJseSB3b25kZXIgd2h5IGl0CiAgIHdhcyBiZWVwaW5nLgoKICAgQWxzbywgaWYgeW91IGJlZ2luIGEgZmlsZW5hbWUgZmllbGQgd2l0aCBhIGRvdWJsZXF1b3RlIG9yIG9wZW5pbmcKICAgYnJhY2UsIG5vdyB5b3UgY2FuIHVzZSBjb21wbGV0aW9uIG9yIGdldCA/LWhlbHA7IHRoaXMgd2FzIG5ldmVyCiAgIHBvc3NpYmxlIGJlZm9yZS4KCiBDLUtlcm1pdD50eXBlICJ0aGk/IElucHV0IGZpbGUgc3BlY2lmaWNhdGlvbiwgb25lIG9mIHRoZSBmb2xsb3dpbmc6CiAgIHRoaXMgZmlsZSAgICAgICAgdGhpcyBvdGhlciBmaWxlCiBDLUtlcm1pdD50eXBlICJ0aGlfCgogICBbIFszNzVdVG9wIF0gWyBbMzc2XUNvbnRlbnRzIF0gWyBbMzc3XUMtS2VybWl0IEhvbWUgXSBbIFszNzhdS2VybWl0CiAgIEhvbWUgXQogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgo2LiBPVEhFUiBDT01NQU5EIFBBUlNJTkcgSU1QUk9WRU1FTlRTCgogIDYuMS4gR3JvdXBpbmcgTWFjcm8gQXJndW1lbnRzCgogICBEb3VibGVxdW90ZXMgbm93IGNhbiBiZSB1c2VkIGluIG1hY3JvIGludm9jYXRpb25zIHRvIGdyb3VwIGFyZ3VtZW50cwogICBjb250YWluaW5nIHNwYWNlcywgd2hlcmUgcHJldmlvdXNseSBvbmx5IGJyYWNlcyBjb3VsZCBiZSB1c2VkOgoKICBkZWZpbmUgeHggc2hvdyBhcmdzCiAgeHggb25lICJ0aGlzIGlzIHR3byIgdGhyZWUKCiAgIFJlc3VsdDoKCiAgTWFjcm8gYXJndW1lbnRzIGF0IGxldmVsIDAgKFx2KGFyZ2MpID0gNCk6CiAgIFwlMCA9IHh4CiAgIFwlMSA9IG9uZQogICBcJTIgPSB0aGlzIGlzIHR3bwogICBcJTMgPSB0aHJlZQoKICAgQWxzbywgeW91IGNhbiBub3cgcXVvdGUgYnJhY2VzIGFuZCBxdW90ZXMgaW4gbWFjcm8gYXJncyAodGhpcyBkaWRuJ3QKICAgd29yayBiZWZvcmUpLiBFeGFtcGxlczoKCiAgeHggInsiICA7IFRoZSBhcmd1bWVudCBpcyBhIHNpbmdsZSBsZWZ0IGJyYWNlCiAgeHggeyJ9ICA7IFRoZSBhcmd1bWVudCBpcyBhIGRvdWJsZXF1b3RlIGNoYXJhY3RlcgoKICAgSW4gY2FzZSB0aGlzIG5ldyBiZWhhdmlvciBpbnRlcmZlcmVzIHdpdGggeW91ciBzY3JpcHRzLCB5b3UgY2FuCiAgIHJlc3RvcmUgdGhlIHByZXZpb3VzIGJlaGF2aW9yIHdpdGg6CgogIFNFVCBDT01NQU5EIERPVUJMRVFVT1RJTkcgT0ZGCgogIDYuMi4gRGlyZWN0b3J5IGFuZCBGaWxlIE5hbWUgQ29tcGxldGlvbgoKICAgQy1LZXJtaXQgOC4wIGFsc28gaW5jbHVkZXMgYmV0dGVyIGNvbXBsZXRpb24gZm9yIGRpcmVjdG9yeSBuYW1lcywgZS5nLgogICBpbiB0aGUgQ0QgY29tbWFuZC4gSWYgdGhlIG5hbWUgdHlwZWQgc28gZmFyIHVuaXF1ZWx5IG1hdGNoZXMgYQogICBkaXJlY3RvcnkgbmFtZSwgaXQgaXMgY29tcGxldGVkIChhcyBiZWZvcmUpLCBidXQgbm93IGlmIHRoZSBkaXJlY3RvcnkKICAgY29udGFpbnMgYW55IHN1YmRpcmVjdG9yaWVzLCBjb21wbGV0aW9uIGlzIHBhcnRpYWwgKGFsbG93aW5nIHlvdSB0bwogICBzdXBwbHkgYWRkaXRpb25hbCBwYXRoIHNlZ21lbnRzIHdpdGhvdXQgYmFja3NwYWNpbmcpOyBvdGhlcndpc2UgaXQgaXMKICAgY29tcGxldGUuCgogICBDb21wbGV0aW9uIGhhcyBhbHNvIGJlZW4gaW1wcm92ZWQgZm9yIGZpbGUgYW5kIGRpcmVjdG9yeSBuYW1lcyB0aGF0CiAgIGNvbnRhaW4gbm90IG9ubHkgc3BhY2VzIChhcyBkZXNjcmliZWQgYWJvdmUpIGJ1dCBhbHNvICJtZXRhY2hhcmFjdGVycyIKICAgc3VjaCBhcyBhc3RlcmlzayAoKikgYW5kIHRpbGRlICh+KTogbm93IHRoZSBmaWVsZCBpcyByZXBhaW50ZWQgaWYKICAgbmVjZXNzYXJ5LiBGb3IgZXhhbXBsZSwgaWYgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGNvbnRhaW5zIG9ubHkgb25lCiAgIGZpbGUgd2hvc2UgbmFtZSBjb250YWlucyAiYmxhaCIsIHRoZW4gaW46CgogIHR5cGUgKmJsYWg8VGFiPgoKICAgIipibGFoIiBpcyByZXBsYWNlZCBieSB0aGUgZmlsZW5hbWUuIEluIGVhcmxpZXIgcmVsZWFzZXMsIHRoZSBwYXJ0CiAgIHR5cGVkIHNvIGZhciB3YXMgbGVmdCBvbiB0aGUgY29tbWFuZCBsaW5lIChhbmQgaW4gdGhlIGhpc3RvcnkgYnVmZmVyKSwKICAgc28gZXZlbiB3aGVuIHRoZSBvcmlnaW5hbCBjb21tYW5kIHdvcmtlZCwgdGhlIHJlY2FsbGVkIHZlcnNpb24gd291bGQKICAgbm90LiBTaW1pbGFybHkgZm9yIH4gKHRoZSBuZWFybHktdW5pdmVyc2FsIFVuaXggbm90YXRpb24gZm9yCiAgIHVzZXJuYW1lKToKCiAgdHlwZSB+b2xnYS94PFRhYj4KCiAgIGlzIHJlcGFpbnRlZCBhcyAoZS5nLik6CgogIHR5cGUgL3VzZXJzL2hvbWUvb2xnYS94KEJlZXApCgogICBTcGVha2luZyBvZiBjb21tYW5kIGhpc3RvcnksIHRoZSBuZXcgU0hPVyBISVNUT1JZIGNvbW1hbmQgc2hvd3MgeW91cgogICBjb21tYW5kIGhpc3RvcnkgYW5kIHJlY2FsbCBidWZmZXIuIFNBVkUgQ09NTUFORCBISVNUT1JZIHNhdmVzIGl0IGludG8KICAgYSBmaWxlIG9mIHlvdXIgY2hvaWNlLgoKICA2LjMuIFBhc3NpbmcgQXJndW1lbnRzIHRvIENvbW1hbmQgRmlsZXMKCiAgIFRoZSBtZXRob2QgZm9yIHBhc3NpbmcgYXJndW1lbnRzIHRvIGNvbW1hbmQgZmlsZXMgaGFzIGJlZW4gaW1wcm92ZWQuCiAgIFByaW9yIHRvIEMtS2VybWl0IDcuMCB0aGVyZSB3YXMgbm8gcHJvdmlzaW9uIGZvciBkb2luZyB0aGlzLiBJbgogICBDLUtlcm1pdCA3LjAsIHRoZSBUQUtFIGNvbW1hbmQgd2FzIGNoYW5nZWQgdG8gYWxsb3cgYXJndW1lbnRzIHRvIGJlCiAgIGdpdmVuIGFmdGVyIHRoZSBmaWxlbmFtZToKCiAgdGFrZSBjb21tYW5kZmlsZSBhcmcxIGFyZzIgLi4uCgogICBUaGlzIHdhcyBhY2NvbXBsaXNoZWQgYnkgcmVwbGFjaW5nIHRoZSBjdXJyZW50IFwlMSwgXCUyLCBldGMsIHdpdGggdGhlCiAgIGdpdmVuIGFyZ3VtZW50cywgc2luY2UgYSBuZXcgc2V0IG9mIG1hY3JvIGFyZ3VtZW50IHZhcmlhYmxlcyBpcwogICBjcmVhdGVkIG9ubHkgd2hlbiBhIG1hY3JvIGlzIGV4ZWN1dGVkLCBub3QgYSBjb21tYW5kIGZpbGUuIEl0IGlzIG11Y2gKICAgbW9yZSBpbnR1aXRpdmUsIGhvd2V2ZXIsIGlmIGFyZ3VtZW50cyB0byBjb21tYW5kIGZpbGVzIHdvcmtlZCBsaWtlCiAgIHRob3NlIHRvIG1hY3JvczogdGhlIGNvbW1hbmQgZmlsZSBzZWVzIHRoZSBhcmd1bWVudHMgYXMgaXRzIG93biBcJTEsCiAgIFwlMiwgZXRjLCBidXQgdGhlIGNhbGxlcidzIHZhcmlhYmxlcyBhcmUgbm90IGRpc3R1cmJlZC4gQy1LZXJtaXQgOC4wCiAgIGFjY29tcGxpc2hlcyB0aGlzIGJ5IGF1dG9tYXRpY2FsbHkgY3JlYXRpbmcgYW4gaW50ZXJtZWRpYXRlIHRlbXBvcmFyeQogICBtYWNybyB0byBzdGFydCB0aGUgY29tbWFuZCBmaWxlIChpZiBhbnkgYXJndW1lbnRzIHdlcmUgZ2l2ZW4pLCB0aHVzCiAgIGNyZWF0aW5nIGEgbmV3IGxldmVsIG9mIGFyZ3VtZW50cyBhcyBleHBlY3RlZC4KCiAgNi40LiBNb3JlLVByb21wdGluZwoKICAgVGhlIGZhbWlsaWFyIC0tbW9yZT8tLSBwcm9tcHQgdGhhdCBhcHBlYXJzIGF0IHRoZSBlbmQgb2YgZWFjaAogICBzY3JlZW5mdWwgb2YgY29tbWFuZC1yZXNwb25zZSBvdXRwdXQgbm93IGFjY2VwdHMgYSBuZXcgYW5zd2VyOiBHIChHbykKICAgbWVhbmluZyAic2hvdyBhbGwgdGhlIHJlc3Qgd2l0aG91dCBwYXVzaW5nIGFuZCBhc2tpbmcgbWUgYW55IG1vcmUKICAgcXVlc3Rpb25zIi4gUCAoUHJvY2VlZCkgaXMgYSBzeW5vbnltIGZvciBHLgoKICA2LjUuIENvbW1hcyBpbiBNYWNybyBEZWZpbml0aW9ucwoKICAgQXMgbm90ZWQgaW4gdGhlIFszNzldQy1LZXJtaXQgbWFudWFsLCBjb21tYSBpcyB1c2VkIHRvIHNlcGFyYXRlCiAgIGNvbW1hbmRzIGluIGEgbWFjcm8gZGVmaW5pdGlvbi4gRXZlbiB3aGVuIHRoZSBtYWNybyBpcyBkZWZpbmVkIG9uCiAgIG11bHRpcGxlIGxpbmVzIHVzaW5nIGN1cmx5LWJyYWNlIGJsb2NrLXN0cnVjdHVyZSBub3RhdGlvbiB3aXRob3V0CiAgIGNvbW1hcywgdGhlIGRlZmluaXRpb24gaXMgc3RpbGwgc3RvcmVkIGludGVybmFsbHkgYXMgYSBjb21tYS1zZXBhcmF0ZWQKICAgbGlzdCBvZiBjb21tYW5kcy4gVGhlcmVmb3JlIHNwZWNpYWwgdHJpY2tzIGFyZSBuZWVkZWQgdG8gaW5jbHVkZSBhCiAgIGNvbW1hIGluIGEgY29tbWFuZC4gVGhlIGNsYXNzaWMgZXhhbXBsZSBpczoKCiAgZGVmaW5lIGZvbyB7CiAgICAgIChzb21lIGNvbW1hbmQpCiAgICAgIGlmIGZhaWwgZWNobyBTb3JyeSwgYmxhaCBmYWlsZWQuLi4KICB9CgogICBUaGlzIHdvdWxkIHJlc3VsdCBpbiBLZXJtaXQgdHJ5aW5nIHRvIGV4ZWN1dGUgYSAiYmxhaCIgY29tbWFuZC4gVGhpcwogICBjb3VsZCBhbHdheXMgYmUgaGFuZGxlZCBieSBlbmNsb3NpbmcgdGhlIHRleHQgaW4gYnJhY2VzOgoKICBkZWZpbmUgZm9vIHsKICAgICAgKHNvbWUgY29tbWFuZCkKICAgICAgaWYgZmFpbCBlY2hvIHtTb3JyeSwgYmxhaCBmYWlsZWQuLi59CiAgfQoKICAgYnV0IGRvdWJsZXF1b3RlcyAobW9yZSBpbnR1aXRpdmUpIHNob3VsZCBoYXZlIHdvcmtlZCB0b28uIE5vdyB0aGV5IGRvOgoKICBkZWZpbmUgZm9vIHsKICAgICAgKHNvbWUgY29tbWFuZCkKICAgICAgaWYgZmFpbCBlY2hvICJTb3JyeSwgYmxhaCBmYWlsZWQuLi4iCiAgfQoKICA2LjYuIEFycm93IEtleXMKCiAgIEFzIG9mIHZlcnNpb24gOC4wLjIwMSwgQy1LZXJtaXQgb24gbW9zdCBwbGF0Zm9ybXMgbGV0cyB5b3UgYWNjZXNzIHRoZQogICBjb21tYW5kIGhpc3RvcnkgYnVmZmVyIHdpdGggYXJyb3cga2V5cywganVzdCBhcyB5b3UgYWx3YXlzIGNvdWxkIHdpdGgKICAgY29udHJvbCBjaGFyYWN0ZXJzLiBUaGUgcmVzdHJpY3Rpb25zIGFyZToKCiAgICAxLiBPbmx5IFVwIGFuZCBEb3duIGFycm93IGtleXMgYXJlIGFjY2VwdGVkLgogICAgMi4gT25seSA3LWJpdCBBTlNJIGFycm93LWtleSBzZXF1ZW5jZXMgYXJlIHVuZGVyc3Rvb2QgKEVTQyBmb2xsb3dlZAogICAgICAgYnkgWyBvciB1cHBlcmNhc2UgbGV0dGVyIE8sIGZvbGxvd2VkIGJ5IHVwcGVyY2FzZSBsZXR0ZXIgQSBvciAodXApCiAgICAgICBCIChkb3duKS4KCiAgIFRoaXMgY2hhbmdlIHdhcyBtYWRlIHRvIGZhY2lsaXRhdGUgY29tbWFuZCByZWNhbGwgaW4gTGludXgtYmFzZWQgUERBcwogICB0aGF0IGRvbid0IGhhdmUgYSBDb250cm9sIGtleSwgb3IgYXQgbGVhc3Qgbm90IG9uZSB0aGF0J3MgZWFzaWx5IChvcgogICBhbHdheXMpIGFjY2Vzc2libGUsIHN1Y2ggYXMgdGhlIFNoYXJwIFphdXJ1cyBTTDU1MDAuCgogICBbIFszODBdVG9wIF0gWyBbMzgxXUNvbnRlbnRzIF0gWyBbMzgyXUMtS2VybWl0IEhvbWUgXSBbIFszODNdS2VybWl0CiAgIEhvbWUgXQogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgo3LiBORVcgQ09NTUFORFMgQU5EIFNXSVRDSEVTCgogICBTZWUgWzM4NF1TZWN0aW9uIDQgZm9yIG1vcmUgYWJvdXQgZmlsZSBzY2FubmluZyBhbmQgdGhlIC9UWVBFOiBzd2l0Y2guCgogICBBU0tbUV0gWyAvVElNRU9VVDpudW1iZXIgL1FVSUVUIC9ERUZBVUxUOnRleHQgXSB2YXJpYWJsZSBbIHByb21wdCBdCiAgICAgICAgICBUaGUgbmV3IG9wdGlvbmFsIC9USU1FT1VUOiBzd2l0Y2ggZm9yIEFTSyBhbmQgQVNLUSBjYXVzZXMgdGhlCiAgICAgICAgICBjb21tYW5kIHRvIHRpbWUgb3V0IGFuZCBhbmQgZmFpbCBpZiBubyByZXNwb25zZSBpcyBnaXZlbiB3aXRoaW4KICAgICAgICAgIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHNlY29uZHMsIDEgb3IgZ3JlYXRlciAoMCBvciBsZXNzIG1lYW5zCiAgICAgICAgICBubyB0aW1lb3V0LCB3YWl0IGZvcmV2ZXIpLiBUaGlzIHdvcmtzIGp1c3QgbGlrZSBTRVQgQVNLLVRJTUVSLAogICAgICAgICAgZXhjZXB0IGl0cyBlZmZlY3QgaXMgbG9jYWwgdG8gdGhlIEFTSyBjb21tYW5kIHdpdGggd2hpY2ggaXQgaXMKICAgICAgICAgIGdpdmVuIGFuZCBpdCBkb2VzIG5vdCBkaXN0dXJiIHRoZSBnbG9iYWwgYXNrIHRpbWVyIHNldHRpbmcuIFRoZQogICAgICAgICAgbmV3IC9RVUlFVCBzd2l0Y2ggdGVsbHMgS2VybWl0IG5vdCB0byBwcmludCBhbiBlcnJvciBtZXNzYWdlIGlmCiAgICAgICAgICB0aGUgQVNLIG9yIEFTS1EgY29tbWFuZCB0aW1lcyBvdXQgd2FpdGluZyBmb3IgYSByZXNwb25zZS4KCiAgICAgICAgICBWZXJzaW9uIDguMC4yMTEgYWRkcyB0aGUgL0RFRkFVTFQ6dGV4dCBzd2l0Y2ggZm9yIEFTSy1DbGFzcwogICAgICAgICAgY29tbWFuZHMgKEFTSywgQVNLUSwgYW5kIEdFVE9LKS4gVGhpcyBsZXRzIHlvdSBzdXBwbHkgYSBkZWZhdWx0CiAgICAgICAgICBhbnN3ZXIgaW4gY2FzZSB0aGUgdXNlciBzdXBwbGllcyBhbiBlbXB0eSBhbnN3ZXIgb3IgdGhlCiAgICAgICAgICAvVElNRU9VVDogc3dpdGNoIHdhcyBpbmNsdWRlZCBhbmQgdGhlIHRpbWUgbGltaXQgZXhwaXJlZAogICAgICAgICAgd2l0aG91dCBhbiBhbnN3ZXIuIEluIGJvdGggdGhlc2UgY2FzZXMsIHRoZSBjb21tYW5kIHN1Y2NlZWRzLgoKICAgQ0FUIGZpbGVuYW1lCiAgICAgICAgICBFcXVpdmFsZW50IHRvIFRZUEUgL05PUEFHRS4KCiAgIENEVVAKICAgICAgICAgIENoYW5nZXMgS2VybWl0J3MgbG9jYWwgd29ya2luZyBkaXJlY3RvcnkgdG8gdGhlIHBhcmVudCBvZiB0aGUKICAgICAgICAgIGN1cnJlbnQgb25lLiBFcXVpdmFsZW50IHRvICJjZCAuLiIgaW4gVU5JWCBvciBXaW5kb3dzLCAiY2QgWy1dIgogICAgICAgICAgaW4gVk1TLCAiY2QgXiIgaW4gQU9TL1ZTLCBldGM7IGluIG90aGVyIHdvcmRzLCBpdCdzIGEKICAgICAgICAgIHBsYXRmb3JtLWluZGVwZW5kZW50IHdheSBvZiBtb3Zpbmcgb25lIGxldmVsIHVwIGluIGEgZGlyZWN0b3J5CiAgICAgICAgICB0cmVlLgoKICAgQ0hNT0QgWyBzd2l0Y2hlcyBdIHBlcm1pc3Npb24gZmlsZXMKICAgICAgICAgIFVOSVggb25seS4gU2V0cyBmaWxlIHBlcm1pc3Npb25zIGZvciBvbmUgb3IgbW9yZSBmaWxlcyBvcgogICAgICAgICAgZGlyZWN0b3JpZXMuIFRoZSBwZXJtaXNzaW9uIG11c3QgYmUgZ2l2ZW4gYXMgYW4gb2N0YWwgbnVtYmVyLAogICAgICAgICAgZS5nLiA2NjQsIDc1NS4gU3dpdGNoZXM6IC9ESVJFQ1RPUklFUywgL0ZJTEVTLCAvTk9MSVNULCAvUEFHRSwKICAgICAgICAgIC9ET1RGSUxFUywgL0xJU1QsIC9OT1BBR0UsIC9SRUNVUlNJVkUsIC9UWVBFOntURVhULEJJTkFSWSxBTEx9LAogICAgICAgICAgL1NJTVVMQVRFLiBUaGUgL1RZUEU6IHN3aXRjaCBhbGxvd3Mgc2VsZWN0aW9uIG9mIG9ubHkgdGV4dCBvcgogICAgICAgICAgYmluYXJ5IGZpbGVzLiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBtaXh0dXJlIG9mIHNvdXJjZQogICAgICAgICAgZmlsZXMgYW5kIGV4ZWN1dGFibGVzLCB5b3UgY2FuIHVzZSAiY2htb2QgL2ZpbGVzIC90eXBlOnRleHQKICAgICAgICAgIDY2NCIgdG8gZ2l2ZSBvd25lci9ncm91cCByZWFkL3dyaXRlIGFuZCB3b3JsZCByZWFkIHBlcm1pc3Npb24KICAgICAgICAgIHRvIHRoZSB0ZXh0IGZpbGVzLCBhbmQgImNobW9kIC9maWxlcyAvdHlwZTpiaW5hcnkgNzc1IiB0byBnaXZlCiAgICAgICAgICB0aGUgc2FtZSBwbHVzIGV4ZWN1dGUgcGVybWlzc2lvbiB0byB0aGUgZXhlY3V0YWJsZXMuIFVzZQogICAgICAgICAgL1NJTVVMQVRFIHRvIHNlZSB3aGljaCBmaWxlcyB3b3VsZCBiZSBhZmZlY3RlZCwgd2l0aG91dAogICAgICAgICAgYWN0dWFsbHkgY2hhbmdpbmcgdGhlaXIgcGVybWlzc2lvbnMuCgogICBDTEVBUiBLRVlCT0FSRC1CVUZGRVIKICAgICAgICAgIEZsdXNoZXMgYW55IGFzLXlldCB1bnJlYWQgY2hhcmFjdGVycyBmcm9tIHRoZSBrZXlib2FyZCBpbnB1dAogICAgICAgICAgYnVmZmVyLiBVc2VmdWwgZm9yIGZsdXNoaW5nIHR5cGVhaGVhZCBpbiBzY3JpcHRzLgoKICAgQ09OVElOVUUKICAgICAgICAgIFdoZW4gZ2l2ZW4gYXQgYW4gaW50ZXJhY3RpdmUgY29tbWFuZCBwcm9tcHQgdGhhdCB3YXMgcmVhY2hlZCBieQogICAgICAgICAgaXNzdWluZyBhIFBST01QVCBjb21tYW5kIChkZXNjcmliZWQgaW4gdGhpcyBzZWN0aW9uKSBmcm9tIGEKICAgICAgICAgIHNjcmlwdCwgdGhpcyBjb21tYW5kIHJldHVybnMgdG8gdGhlIHNjcmlwdCwgY29udGludWluZyBpdHMKICAgICAgICAgIGV4ZWN1dGlvbiBhdCB0aGUgY29tbWFuZCBhZnRlciB0aGUgUFJPTVBUIGNvbW1hbmQuIEluIHRoaXMKICAgICAgICAgIGNvbnRleHQsIENPTlRJTlVFIGlzIHNpbXBseSBhIG1vcmUtaW50dWl0aXZlIHN5bm9ueW0gZm9yIEVORC4KCiAgIENPUFksIFJFTkFNRSwgYW5kIFRSQU5TTEFURQogICAgICAgICAgVGhlc2UgY29tbWFuZHMgbm93IHdvcmsgb24gZmlsZSBncm91cHMgaWYgdGhlIHRhcmdldCBmaWxlbmFtZQogICAgICAgICAgaXMgYSBkaXJlY3RvcnksIGUuZy4gImNvcHkgb29mYS4qIC4uIiwgInJlbmFtZSAqIH5vbGdhL3RtcC8iCgogICBDT1BZIC9BUFBFTkQgc291cmNlIGRlc3RpbmF0aW9uCiAgICAgICAgICBUaGUgc291cmNlIGZpbGUgc3BlY2lmaWNhdGlvbiBjYW4gbm93IGluY2x1ZGUgd2lsZGNhcmRzLCBpbgogICAgICAgICAgd2hpY2ggY2FzZSBhbGwgb2YgdGhlIHNvdXJjZSBmaWxlcyB0aGF0IG1hdGNoIHdpbGwgZ28gaW50byB0aGUKICAgICAgICAgIGRlc3RpbmF0aW9uIGZpbGUgaW4gYWxwaGFiZXRpY2FsIG9yZGVyIGJ5IG5hbWUuCgogICBERUxFVEUgL0FTSwogICAgICAgICAgQXNrcyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBlYWNoIGZpbGUgYmVmb3JlIGRlbGV0aW5nIGl0LiBJbgogICAgICAgICAgQy1LZXJtaXQgNy4wLCB0aGUgYW5zd2VycyB3ZXJlICJ5ZXMiIChvciAib2siKSBhbmQgIm5vIi4KICAgICAgICAgIEMtS2VybWl0IDguMCBhZGRzICJnbyIgKG1lYW5pbmcsIGRlbGV0ZSBhbGwgdGhlIHJlc3Qgd2l0aG91dAogICAgICAgICAgYXNraW5nKSBhbmQgInF1aXQiIChjYW5jZWwgdGhlIERFTEVURSBjb21tYW5kIGFuZCByZXR1cm4gdG8gdGhlCiAgICAgICAgICBwcm9tcHQpLgoKICAgREVMRVRFIC9ESVJFQ1RPUklFUwogICAgICAgICAgRGVsZXRlcyBub3Qgb25seSBmaWxlcyBidXQgYWxzbyBkaXJlY3Rvcmllcy4KCiAgIERFTEVURSAvUkVDVVJTSVZFCiAgICAgICAgICBEZWxldGVzIGFsbCBmaWxlcyB0aGF0IG1hdGNoIHRoZSBnaXZlbiBmaWxlIHNwZWNpZmljYXRpb24gaW4KICAgICAgICAgIHRoZSBjdXJyZW50IChvciBnaXZlbikgZGlyZWN0b3J5IGFuZCBhbGwgZGlyZWN0b3JpZXMgYmVuZWF0aAogICAgICAgICAgaXQuCgogICBERUxFVEUgL1NVTU1BUlkKICAgICAgICAgIFByaW50cyBvbmx5IHRoZSBudW1iZXIgb2YgZmlsZXMgZGVsZXRlZCBhbmQgdG90YWwgc2l6ZSBmcmVlZCwKICAgICAgICAgIHdpdGhvdXQgbGlzdGluZyBlYWNoIGZpbGUuCgogICBERUxFVEUgL1RSRUUKICAgICAgICAgIFNob3J0aGFuZCBmb3IgREVMRVRFIC9SRUNVUlNJVkUgL0RJUkVDVE9SSUVTIC9ET1RGSUxFUy8uCiAgICAgICAgICBFcXVpdmFsZW50IHRvIFdpbmRvd3MgREVMVFJFRSBvciBVbml4ICJybSAtUmYiLiBJZiBubyBmaWxlCiAgICAgICAgICBzcGVjaWZpY2F0aW9uIGlzIGdpdmVuLCB0aGUgY29udGVudHMgb2YgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LAogICAgICAgICAgcGx1cyBhbGwgb2YgaXRzIHN1YmRpcmVjdG9yaWVzIGFuZCB0aGVpciBjb250ZW50cywgYXJlIGRlbGV0ZWQuCgogICBERUxFVEUgL1RZUEU6QklOQVJZCiAgICAgICAgICBEZWxldGUgb25seSByZWd1bGFyIGJpbmFyeSBmaWxlcyAocmVxdWlyZXMgRklMRSBTQ0FOIE9OKS4KCiAgIERFTEVURSAvVFlQRTpURVhUCiAgICAgICAgICBEZWxldGUgb25seSByZWd1bGFyIHRleHQgZmlsZXMgKHJlcXVpcmVzIEZJTEUgU0NBTiBPTikuCgogICBESVJFQ1RPUlkgWyBzd2l0Y2hlcyBdIFsgZmlsZXNwZWMgWyBmaWxlc3BlYyBbIGZpbGVzcGVjIC4uLiBdIF0gXQogICAgICAgICAgVGhlIERJUkVDVE9SWSBjb21tYW5kIG5vdyBhY2NlcHRzIG1vcmUgdGhhbiBvbmUgZmlsZQogICAgICAgICAgc3BlY2lmaWNhdGlvbjsgZS5nLiAiZGlyZWN0b3J5IG1vb24udHh0IHN1bi5kb2Mgc3RhcnMuKiIuCgogICBESVJFQ1RPUlkgL05PUkVDVVJTSVZFIHh4eAogICAgICAgICAgSWYgeHh4IGlzIGEgZGlyZWN0b3J5IG5hbWUsIGZvcmNlcyBsaXN0aW5nIG9mIHRoZSBkaXJlY3RvcnkKICAgICAgICAgIGl0c2VsZiByYXRoZXIgdGhhbiBpdHMgY29udGVudHMuCgogICBESVJFQ1RPUlkgL0ZPTExPV0xJTktTIHh4eAogICAgICAgICAgKFVOSVggb25seSkgVGVsbHMgdGhlIERJUkVDVE9SWSBjb21tYW5kIHRvIGZvbGxvdyBzeW1ib2xpYwogICAgICAgICAgbGlua3MuIFRoaXMgbm90IHRoZSBkZWZhdWx0IGJlY2F1c2UgaXQgY2FuIGNhdXNlIGVuZGxlc3MgbG9vcHMuCgogICBESVJFQ1RPUlkgL05PRk9MTE9XTElOS1MgeHh4CiAgICAgICAgICAoVU5JWCBvbmx5KSBUZWxscyB0aGUgRElSRUNUT1JZIGNvbW1hbmQgbm90IHRvIGZvbGxvdyBzeW1ib2xpYwogICAgICAgICAgbGlua3MsIGJ1dCByYXRoZXIsIG1lcmVseSB0byBsaXN0IHRoZW0uIFRoaXMgaXMgdGhlIGRlZmF1bHQuCgogICBESVJFQ1RPUlkgL09VVFBVVDpmaWxlbmFtZQogICAgICAgICAgU2VuZHMgdGhlIHJlc3VsdHMgb2YgdGhlIERJUkVDVE9SWSBjb21tYW5kIHRvIHRoZSBnaXZlbiBmaWxlLgoKICAgRElSRUNUT1JZIC9TVU1NQVJZCiAgICAgICAgICBQcmludHMgb25seSB0aGUgbnVtYmVyIG9mIGRpcmVjdG9yaWVzIGFuZCBmaWxlcyBhbmQgdGhlIHRvdGFsCiAgICAgICAgICBzaXplLCB3aXRob3V0IGxpc3RpbmcgZWFjaCBmaWxlLgoKICAgRElSRUNUT1JZIC9UWVBFOntURVhULEJJTkFSWX0KICAgICAgICAgIFNob3dzIG9ubHkgZmlsZXMgb2YgdGhlIHNlbGVjdGVkIHR5cGUsIGJhc2VkIG9uIGZpbGUgc2Nhbi4KCiAgIERJUkVDVE9SWSAvWEZFUk1PREUKICAgICAgICAgIE5vdyBzaG93cyByZXN1bHRzIG9mIGZpbGUgc2NhbiAoc2VlIFszODVdU2VjdGlvbiA0KS4KCiAgIEZPUEVOIFsgc3dpdGNoZXMgXSBjaGFubmVsIGZpbGVuYW1lCgogICAgICAgICAgQXMgb2YgdmVyc2lvbiA4LjAuMjExLCBGT1BFTiBhbGxvd3MgL2Rldi90dHkgYXMgYSBmaWxlbmFtZSBpbgogICAgICAgICAgVW5peC1iYXNlZCBvcGVyYXRpbmcgc3lzdGVtcy4KCiAgIEZSRUFEIC9UUklNCiAgICAgICAgICAoOC4wLjIxMSkgVHJpbXMgYW55IHRyYWlsaW5nIGJsYW5rcyBvciB0YWJzIGZyb20gdGhlIGl0ZW0gKHN1Y2gKICAgICAgICAgIGFzIGEgbGluZSBvZiB0ZXh0KSB0aGF0IGl0IGhhcyByZWFkLgoKICAgRlJFQUQgL1VOVEFCSUZZCiAgICAgICAgICAoOC4wLjIxMSkgQ29udmVydHMgSG9yaXpvbnRhbCBUYWIgY2hhcmFjdGVycyB0byB0aGUgYXBwcm9wcmlhdGUKICAgICAgICAgIG51bWJlciBvZiBzcGFjZXMsIGJhc2VkIG9uIFZUMTAwLWxpa2UgdGFiIHN0b3BzCiAgICAgICAgICAoMSw5LDE3LDI1LC4uLikuCgogICBHUkVQIFsgc3dpdGNoZXMgXSBwYXR0ZXJuIGZpbGVzCiAgICAgICAgICBTaW1pbGFyIHRvIFVuaXggZ3JlcCBjb21tYW5kOiBkaXNwbGF5cyBmaWxlIGxpbmVzIHRoYXQgbWF0Y2gKICAgICAgICAgIHRoZSBnaXZlbiBbMzg2XXBhdHRlcm4uIFN3aXRjaGVzOgoKICAgICAgICAvQ09VTlRbOnZhcmlhYmxlXQogICAgICAgICAgICAgICAgRG9uJ3Qgc2hvdyB0aGUgbWF0Y2hpbmcgbGluZXMsIGp1c3QgdGVsbCBob3cgbWFueSBsaW5lcwogICAgICAgICAgICAgICAgbWF0Y2guIElmIGEgdmFyaWFibGUgbmFtZSBpcyBzcGVjaWZpZWQsIHRoZSBjb3VudCBpcwogICAgICAgICAgICAgICAgc3RvcmVkIGluIHRoZSBnaXZlbiB2YXJpYWJsZS4KCiAgICAgICAgL0RPVEZJTEVTCiAgICAgICAgICAgICAgICBJbmNsdWRlIGZpbGVzIHdob3NlIG5hbWVzIGJlZ2luIHdpdGggZG90LgoKICAgICAgICAvTElORU5VTUJFUlMKICAgICAgICAgICAgICAgIFNob3cgbGluZSBudW1iZXJzIG9mIG1hdGNoaW5nIGxpbmVzLgoKICAgICAgICAvTkFNRU9OTFkKICAgICAgICAgICAgICAgIG9ubHkgbGlzdCB0aGUgbmFtZXMgb2YgZmlsZXMgdGhhdCBjb250YWluIG1hdGNoaW5nIGxpbmVzLAogICAgICAgICAgICAgICAgYnV0IG5vdCB0aGUgbGluZXMgdGhlbXNlbHZlcy4KCiAgICAgICAgL05PQkFDS1VQCiAgICAgICAgICAgICAgICBTa2lwIGJhY2t1cCBmaWxlcy4KCiAgICAgICAgL05PQ0FTRQogICAgICAgICAgICAgICAgSWdub3JlIGFscGhhYmV0aWMgY2FzZSB3aGlsZSBwYXR0ZXJuIG1hdGNoaW5nLgoKICAgICAgICAvTk9ET1RGSUxFUwogICAgICAgICAgICAgICAgc2tpcCBmaWxlcyB3aG9zZSBuYW1lcyBzdGFydCB3aXRoIGRvdCAocGVyaW9kKS4KCiAgICAgICAgL05PTElTVAogICAgICAgICAgICAgICAgU3VwcHJlc3Mgb3V0cHV0IGJ1dCBzZXQgU1VDQ0VTUyBvciBGQUlMVVJFIGFjY29yZGluZyB0bwogICAgICAgICAgICAgICAgc2VhcmNoIHJlc3VsdC4KCiAgICAgICAgL05PTUFUQ0gKICAgICAgICAgICAgICAgIExvb2sgZm9yIGxpbmVzIHRoYXQgZG8gbm90IG1hdGNoIHRoZSBwYXR0ZXJuLgoKICAgICAgICAvTk9QQUdFCiAgICAgICAgICAgICAgICBEb24ndCBwYXVzZSBiZXR3ZWVuIHNjcmVlbnMgb2Ygb3V0cHV0LgoKICAgICAgICAvT1VUUFVUOmZpbGVuYW1lCiAgICAgICAgICAgICAgICBXcml0ZSByZXN1bHRzIGludG8gdGhlIGdpdmVuIGZpbGUuCgogICAgICAgIC9QQUdFCiAgICAgICAgICAgICAgICBQYXVzZSBiZXR3ZWVuIHNjcmVlbnMgb2Ygb3V0cHV0LgoKICAgICAgICAvUkVDVVJTSVZFCiAgICAgICAgICAgICAgICBTZWFyY2ggZmlsZXMgaW4gc3ViZGlyZWN0b3JpZXMgdG9vLgoKICAgICAgICAvVFlQRTp7VEVYVCxCSU5BUll9CiAgICAgICAgICAgICAgICBTZWFyY2ggb25seSBmaWxlcyBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCgogICAgICAgICAgU3lub255bXM6IEZJTkQsIFNFQVJDSC4KCiAgIEdFVE9LIC9USU1FT1VUOm4gL1FVSUVUIC9ERUZBVUxUOnRleHQKICAgICAgICAgIFRoZSBuZXcgL1FVSUVUIHN3aXRjaCBpbnN0cnVjdHMgR0VUT0ssIHdoZW4gZ2l2ZW4gYSB0aW1lb3V0LAogICAgICAgICAgbm90IHRvIHByaW50IGFuIGVycm9yIG1lc3NhZ2UgaWYgaXQgdGltZXMgb3V0LiBBcyBvZiA4LjAuMjExLCBhCiAgICAgICAgICBkZWZhdWx0IGFuc3dlciBjYW4gYmUgc3VwcGxpZWQgKHNlZSBBU0spLgoKICAgSEVBRCBbIHN3aXRjaGVzIF0gZmlsZW5hbWUKICAgICAgICAgIEVxdWl2YWxlbnQgdG8gVFlQRSAvSEVBRCBbIG90aGVyLXN3aXRjaGVzIF0gZmlsZW5hbWUuCgogICBIRUxQIERBVEUKICAgICAgICAgIEV4cGxhaW5zIGRhdGUtdGltZSBmb3JtYXRzLCBpbmNsdWRpbmcgdGltZXpvbmUgbm90YXRpb24gYW5kCiAgICAgICAgICBkZWx0YSB0aW1lcy4KCiAgIEhFTFAgRklSRVdBTExTCiAgICAgICAgICBFeHBsYWlucyB0aGUgZmlyZXdhbGwgbmVnb3RpYXRpb24gY2FwYWJpbGl0aWVzIG9mIHlvdXIgdmVyc2lvbgogICAgICAgICAgb2YgS2VybWl0LgoKICAgS0NEIFsgc3ltYm9saWMtZGlyZWN0b3J5LW5hbWUgXQogICAgICAgICAgQ2hhbmdlcyBLZXJtaXQncyB3b3JraW5nIGRpcmVjdG9yeSB0byB0aGUgbmFtZWQgc3ltYm9saWMKICAgICAgICAgIGRpcmVjdG9yeSwgc3VjaCBhcyBzdWNoIGFzIGV4ZWRpciwgaW5pZGlyLCBzdGFydHVwLCBkb3dubG9hZCwKICAgICAgICAgIG9yIGFuZCBob21lLiBUeXBlICJrY2QgPyIgZm9yIGEgbGlzdCBvZiBzeW1ib2xpYyBkaXJlY3RvcnkKICAgICAgICAgIG5hbWVzIGtub3duIHRvIHlvdXIgY29weSBvZiBLZXJtaXQsIG9yIGdpdmUgdGhlIG5ldyBPUklFTlRBVElPTgogICAgICAgICAgY29tbWFuZCBmb3IgYSBtb3JlIGRldGFpbGVkIGV4cGxhbmF0aW9uLiBJZiB5b3UgZ2l2ZSBhIEtDRAogICAgICAgICAgY29tbWFuZCB3aXRob3V0IGEgZGlyZWN0b3J5IG5hbWUsIEtlcm1pdCByZXR1cm5zIHRvIGl0cyAiaG9tZSIKICAgICAgICAgIGRpcmVjdG9yeSwgd2hpY2ggaXMgZGV0ZXJtaW5lZCBpbiBzb21lIHdheSB0aGF0IGRlcGVuZHMgb24gdGhlCiAgICAgICAgICB1bmRlcmx5aW5nIG9wZXJhdGluZyBzeXN0ZW0sIGJ1dCB3aGljaCB5b3UgY2FuIHJlZGVmaW5lIHdpdGgKICAgICAgICAgIHRoZSAobmV3KSBTRVQgQ0QgSE9NRSBjb21tYW5kLiBZb3VyIGhvbWUgZGlyZWN0b3J5IGlzIHNob3duIGJ5CiAgICAgICAgICBTSE9XIENEIGFuZCBpdCdzIGFsc28gdGhlIHZhbHVlIG9mIHRoZSBcdihob21lKSB2YXJpYWJsZS4KCiAgIExJQ0VOU0UKICAgICAgICAgIERpc3BsYXlzIHRoZSBDLUtlcm1pdCBsaWNlbnNlLgoKICAgTC1jb21tYW5kcwogICAgICAgICAgV2hlbiBLZXJtaXQgaGFzIGEgY29ubmVjdGlvbiB0byBhIEtlcm1pdCBvciBGVFAgc2VydmVyLCBmaWxlCiAgICAgICAgICBtYW5hZ21lbnQgY29tbWFuZHMgc3VjaCBhcyBDRCwgRElSRUNUT1JZLCBhbmQgREVMRVRFIG1pZ2h0IGJlCiAgICAgICAgICBpbnRlbmRlZCBmb3IgdGhlIGxvY2FsIGNvbXB1dGVyIG9yIHRoZSByZW1vdGUgc2VydmVyLiBDLUtlcm1pdAogICAgICAgICAgOC4wLjIwMCBhbmQgZWFybGllciBhbHdheXMgZXhlY3V0ZXMgdGhlc2UgY29tbWFuZHMgb24gdGhlIGxvY2FsCiAgICAgICAgICBjb21wdXRlci4gSWYgeW91IHdhbnQgdGhlbSBleGVjdXRlZCBieSB0aGUgcmVtb3RlIHNlcnZlciwgeW91CiAgICAgICAgICBoYXZlIHRvIHByZWZpeCB0aGVtIHdpdGggUkVNT1RFIChlLmcuIFJFTU9URSBDRCkgb3IgdXNlIHNwZWNpYWwKICAgICAgICAgIFItY29tbWFuZCBhbGlhc2VzIChlLmcuIFJDRCA9IFJFTU9URSBDRCwgUkRJUiA9IFJFTU9URSBESVIsCiAgICAgICAgICBldGMpLiBCdXQgdGhpcyBmZWVscyB1bm5hdHVyYWwgdG8gRlRQIHVzZXJzLCB3aG8gZXhwZWN0CiAgICAgICAgICB1bnByZWZpeGVkIGZpbGUgbWFuYWdlbWVudCBjb21tYW5kcyB0byBiZSBleGVjdXRlZCBieSB0aGUKICAgICAgICAgIHJlbW90ZSBzZXJ2ZXIsIHJhdGhlciB0aGFuIGxvY2FsbHkuIEMtS2VybWl0IDguMC4yMDEgYWRkcwogICAgICAgICAgYXV0b21hdGljIGxvY3VzIHN3aXRjaGluZyB0byBwcmVzZW50IGFuIEZUUC1saWtlIGludGVyZmFjZSBmb3IKICAgICAgICAgIEZUUCBjb25uZWN0aW9ucyBhbmQgdGhlIG5vcm1hbCBLZXJtaXQgaW50ZXJmYWNlIGZvciBLZXJtaXQKICAgICAgICAgIGNvbm5lY3Rpb25zLCBhbmQgYSBTRVQgTE9DVVMgY29tbWFuZCAoZGVzY3JpYmVkIGJlbG93KSB0bwogICAgICAgICAgY29udHJvbCB3aGV0aGVyIG9yIGhvdyB0aGlzIGlzIGRvbmUuIEZvciB3aGVuIExPQ1VTIGlzIFJFTU9URSwKICAgICAgICAgIGEgbmV3IHNldCBvZiBjb21tYW5kcyB3YXMgYWRkZWQgZm9yIGxvY2FsIG1hbmFnZW1lbnQ6IExDRAogICAgICAgICAgKExvY2FsIENEKSwgTERJUiAoTG9jYWwgRElSKSwgZXRjLiBUaGVzZSBhcmUgZGVzY3JpYmVkIGJlbG93CiAgICAgICAgICB1bmRlciBTRVQgTE9DVVMuCgogICBNT1JFIGZpbGVuYW1lCiAgICAgICAgICBFcXVpdmFsZW50IHRvIFRZUEUgL1BBR0UuCgogICBPUklFTlRBVElPTgogICAgICAgICAgRGlzcGxheXMgc3ltYm9saWMgZGlyZWN0b3J5IG5hbWVzIGFuZCB0aGUgY29ycmVzcG9uZGluZwogICAgICAgICAgdmFyaWFibGUgbmFtZXMgYW5kIHZhbHVlcy4gVGhlIHN5bWJvbGljIG5hbWVzLCBzdWNoIGFzIGV4ZWRpciwKICAgICAgICAgIGluaWRpciwgc3RhcnR1cCwgZG93bmxvYWQsIGFuZCBob21lLCBjYW4gYmUgdXNlZCBhcyBhcmd1bWVudHMKICAgICAgICAgIHRvIHRoZSBuZXcgS0NEIGNvbW1hbmQuCgogICBQUk9NUFQgWyB0ZXh0IF0KICAgICAgICAgIEZvciB1c2UgaW4gYSBtYWNybyBvciBjb21tYW5kIGZpbGU6IGVudGVycyBpbnRlcmFjdGl2ZSBjb21tYW5kCiAgICAgICAgICBtb2RlIHdpdGhpbiB0aGUgY3VycmVudCBjb250ZXh0IChbMzg3XVNlY3Rpb24gOC4xKS4gSWYgdGhlCiAgICAgICAgICBvcHRpb25hbCB0ZXh0IGlzIGluY2x1ZGVkLCB0aGUgcHJvbXB0IGlzIHNldCB0byBpdC4gVGhlIHRleHQKICAgICAgICAgIGNhbiBpbmNsdWRlIHZhcmlhYmxlcywgZnVuY3Rpb25zLCBldGMsIGFzIGluIHRoZSBTRVQgUFJPTVBUCiAgICAgICAgICBjb21tYW5kLiBUaGV5IGFyZSBldmFsdWF0ZWQgZWFjaCB0aW1lIHRoZSBwcm9tcHQgaXMgcHJpbnRlZC4KICAgICAgICAgIFVubGlrZSB0aGUgU0VUIFBST01QVCBjb21tYW5kLCB0aGUgdGV4dCBhcmd1bWVudCBhcHBsaWVzIG9ubHkKICAgICAgICAgIHRvIHRoZSBjdXJyZW50IGNvbW1hbmQgbGV2ZWwuIFRodXMgeW91IGNhbiBoYXZlIGRpZmZlcmVudAogICAgICAgICAgcHJvbXB0cyBhdCBkaWZmZXJlbnQgbGV2ZWxzLgoKICAgUkVNT1RFIFNFVCBNQVRDSCB7IERPVElGSUxFLCBGSUZPIH0geyBPTiwgT0ZGIH0KICAgICAgICAgIEFsbG93cyB0aGUgY2xpZW50IHRvIHRlbGwgdGhlIHNlcnZlciB3aGV0aGVyIHdpbGRjYXJkcyBzZW50IHRvCiAgICAgICAgICB0aGUgc2VydmVyIHNob3VsZCBtYXRjaCBkb3QgZmlsZXMgKGZpbGVzIHdob3NlIG5hbWVzIGJlZ2luIHdpdGgKICAgICAgICAgIHBlcmlvZCkgb3IgRklGT3MgKG5hbWVkIHBpcGVzKS4gU2VlIFNFVCBNQVRDSC4KCiAgIFNFVCBBVFRSSUJVVEUgUkVDT1JELUZPUk1BVCB7IE9OLCBPRkYgfQogICAgICAgICAgQWxsb3dzIGNvbnRyb2wgb2YgdGhlIEtlcm1pdCdzIFJlY29yZC1Gb3JtYXQgYXR0cmlidXRlLiBTZXQKICAgICAgICAgIHRoaXMgdG8gT0ZGIGluIGNhc2UgaW5jb21pbmcgZmlsZSBhcmUgcmVmdXNlZCBkdWUgdG8gdW5rbm93biBvcgogICAgICAgICAgaW52YWxpZCByZWNvcmQgZm9ybWF0cyBpZiB5b3Ugd2FudCB0byBhY2NlcHQgdGhlIGZpbGUgYW55d2F5CiAgICAgICAgICAoYW5kLCBwZXJoYXBzLCBwb3N0cHJvY2VzcyBpdCB0byBmaXggaXRzIHJlY29yZCBmb3JtYXQpLgoKICAgU0VUIENEIEhPTUUgWyBkaXJlY3RvcnkgXQogICAgICAgICAgU3BlY2lmaWVzIHRoZSB0YXJnZXQgZGlyZWN0b3J5IGZvciB0aGUgQ0QgYW5kIEtDRCBjb21tYW5kcywKICAgICAgICAgIHdoZW4gdGhleSBhcmUgZ2l2ZW4gd2l0aG91dCBhbiBhcmd1bWVudCwgYW5kIGFsc28gc2V0cyB0aGUKICAgICAgICAgIHZhbHVlIG9mIHRoZSBcdihob21lKSB2YXJpYWJsZS4KCiAgIFNFVCBFWElUIEhBTkdVUCB7IE9GRiwgT04gfQogICAgICAgICAgTm9ybWFsbHkgT04sIG1lYW5pbmcgdGhhdCB3aGVuIEtlcm1pdCBleGl0cywgaXQgYWxzbyBleHBsaWNpdGx5CiAgICAgICAgICBoYW5ncyB1cCB0aGUgY3VycmVudCBTRVQgTElORSAvIFNFVCBQT1JUIHNlcmlhbCBwb3J0IGFjY29yZGluZwogICAgICAgICAgdG8gdGhlIGN1cnJlbnQgU0VUIE1PREVNIFRZUEUgYW5kIFNFVCBNT0RFTSBIQU5HVVAgTUVUSE9ELCBhbmQKICAgICAgICAgIGNsb3NlcyB0aGUgcG9ydCBkZXZpY2UgaWYgaXQgd2FzIG9wZW5lZCBieSBLZXJtaXQgaW4gdGhlIGZpcnN0CiAgICAgICAgICBwbGFjZSAoYXMgb3Bwb3NlZCB0byBpbmhlcml0ZWQpLiBTRVQgRVhJVCBIQU5HVVAgT0ZGIHRlbGxzCiAgICAgICAgICBLZXJtaXQgbm90IHRvIGRvIHRoaXMuIFRoaXMgY2FuJ3QgcHJldmVudCB0aGUgb3BlcmF0aW5nIHN5c3RlbQogICAgICAgICAgZnJvbSBjbG9zaW5nIHRoZSBkZXZpY2Ugd2hlbiBLZXJtaXQgZXhpdHMgKGFuZCBpdCdzIGEgImxhc3QKICAgICAgICAgIGNsb3NlIikgYnV0IGlmIHRoZSBwb3J0IG9yIG1vZGVtIGhhdmUgYmVlbiBjb25kaXRpb25lZCB0bwogICAgICAgICAgc29tZWhvdyBpZ25vcmUgdGhlIGNsb3NlIGFuZCBrZWVwIHRoZSBjb25uZWN0aW9uIG9wZW4sIGF0IGxlYXN0CiAgICAgICAgICBLZXJtaXQgaXRzZWxmIHdvbid0IGRvIGFueXRoaW5nIGV4cGxpY2l0IHRvIGhhbmcgaXQgdXAgb3IgY2xvc2UKICAgICAgICAgIGl0LgoKICAgU0VUIEZJTEUgRU9GIHsgQ1RSTC1aLCBMRU5HVEggfQogICAgICAgICAgU3BlY2lmaWVzIHRoZSBlbmQtb2YtZmlsZSBkZXRlY3Rpb24gbWV0aG9kIHRvIGJlIHVzZWQgYnkKICAgICAgICAgIEMtS2VybWl0IHdoZW4gc2VuZGluZyBhbmQgcmVjZWl2aW5nIHRleHQgZmlsZXMsIGFuZCBpbiB0aGUgVFlQRQogICAgICAgICAgYW5kIHNpbWlsYXIgdGV4dC1maWxlIG9yaWVudGVkIGNvbW1hbmRzLiBUaGUgbm9ybWFsIGFuZCBkZWZhdWx0CiAgICAgICAgICBtZXRob2QgaXMgTEVOR1RILiBZb3UgY2FuIHNwZWNpZnkgQ1RSTC1aIHdoZW4gaGFuZGxpbmcgQ1AvTSBvcgogICAgICAgICAgTVMtRE9TIGZvcm1hdCB0ZXh0IGZpbGVzLCBpbiB3aGljaCBhIEN0cmwtWiAoQVNDSUkgMjYpCiAgICAgICAgICBjaGFyYWN0ZXIgd2l0aGluIHRoZSBmaWxlIG1hcmtzIHRoZSBlbmQgb2YgdGhlIGZpbGUuCgogICBTRVQgRklMRSBMSVNUU0laRSBudW1iZXIKICAgICAgICAgIEFsbG9jYXRlcyBzcGFjZSBmb3IgdGhlIGdpdmVuIG51bWJlciBvZiBmaWxlbmFtZXMgdG8gYmUgZmlsbGVkCiAgICAgICAgICBpbiBieSB0aGUgd2lsZGNhcmQgZXhwYW5kZXIuIFRoZSBjdXJyZW50IG51bWJlciBpcyBzaG93biBieQogICAgICAgICAgU0hPVyBGSUxFLiBJZiB5b3UgZ2l2ZSBhIGNvbW1hbmQgdGhhdCBpbmNsdWRlcyBhIGZpbGVuYW1lCiAgICAgICAgICBjb250YWluaW5nIGEgd2lsZGNhcmQgKHN1Y2ggYXMgIioiKSB0aGF0IG1hdGNoZXMgbW9yZSBmaWxlcwogICAgICAgICAgdGhhdCBLZXJtaXQncyBsaXN0IGhhcyByb29tIGZvciwgeW91IGNhbiBhZGp1c3QgdGhlIGxpc3Qgc2l6ZQogICAgICAgICAgd2l0aCB0aGlzIGNvbW1hbmQuCgogICBTRVQgRklMRSBTVFJJTkdTUEFDRSBudW1iZXIKICAgICAgICAgIEFsbG9jYXRlcyBzcGFjZSBmb3IgdGhlIGdpdmVuIGFtb3VudCBvZiBmaWxlbmFtZSBzdHJpbmdzIGZvcgogICAgICAgICAgdXNlIGJ5IHRoZSB3aWxkY2FyZCBleHBhbmRlci4gVGhlIGN1cnJlbnQgbnVtYmVyIGlzIHNob3duIGJ5CiAgICAgICAgICBTSE9XIEZJTEUuIFRoZSBudW1iZXIgaXMgdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyBvZiBhbGwgdGhlCiAgICAgICAgICBmaWxlIHNwZWNpZmljYXRpb25zIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIHdpbGRjYXJkLgoKICAgICBJZiB5b3UgbmVlZCB0byBwcm9jZXNzIGEgYmlnZ2VyIGxpc3Qgb2YgZmlsZXMgdGhhbiB5b3VyIGNvbXB1dGVyCiAgICAgaGFzIG1lbW9yeSBmb3IsIHlvdSBtaWdodCBiZSBhYmxlIHVzZSBhbiBleHRlcm5hbCBmaWxlIGxpc3QuIFRoZQogICAgIEtlcm1pdCBTRU5EIGFuZCB0aGUgRlRQIFBVVCBhbmQgR0VUIGNvbW1hbmRzIGFjY2VwdCBhIC9MSVNURklMRToKICAgICBzd2l0Y2gsIHdoaWNoIGdpdmVzIHRoZSBuYW1lIG9mIGEgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBsaXN0IG9mCiAgICAgZmlsZXMgdG8gYmUgdHJhbnNmZXJyZWQuIEV4YW1wbGUgZm9yIFVOSVg6CgogICFmaW5kIC4gLXByaW50IHwgZ3JlcCAvID4gL3RtcC9uYW1lcwogIGZ0cCBwdXQgL3VwZGF0ZSAvcmVjdXJzaXZlIC9saXN0ZmlsZTovdG1wL25hbWVzCgogICBTRVQgTE9DVVMgeyBBVVRPLCBMT0NBTCwgUkVNT1RFIH0KICAgICAgICAgIEFkZGVkIGluIEMtS2VybWl0IDguMC4yMDEuICAgU2V0cyB0aGUgbG9jdXMgZm9yIHVucHJlZml4ZWQgZmlsZQogICAgICAgICAgbWFuYWdlbWVudCBjb21tYW5kcyBzdWNoIGFzIENELCBESVJFQ1RPUlksIE1LRElSLCBldGMuIFdoZW4KICAgICAgICAgIExPQ1VTIGlzIExPQ0FMIHRoZXNlIGNvbW1hbmRzIGFjdCBsb2NhbGx5IGFuZCBhIFJFTU9URSAob3IgUikKICAgICAgICAgIHByZWZpeCAoZS5nLiBSRU1PVEUgQ0QsIFJDRCwgUkRJUikgaXMgcmVxdWlyZWQgdG8gc2VuZCBmaWxlCiAgICAgICAgICBtYW5hZ2VtZW50IGNvbW1hbmRzIHRvIGEgcmVtb3RlIHNlcnZlci4gV2hlbiBMT0NVUyBpcyBSRU1PVEUsCiAgICAgICAgICBhbiBMIHByZWZpeCBpcyByZXF1aXJlZCB0byBpc3N1ZSBsb2NhbCBmaWxlIG1hbmFnZW1lbnQgY29tbWFuZHMKICAgICAgICAgIChlLmcuIExDRCwgTERJUikuIFRoZSB3b3JkIExPQ0FMIGNhbid0IGJlIHVzZWQgYXMgYSBwcmVmaXgKICAgICAgICAgIHNpbmNlIGl0IGlzIGFscmVhZHkgdXNlZCBmb3IgZGVjbGFyaW5nIGxvY2FsIHZhcmlhYmxlcy4gTE9DVVMKICAgICAgICAgIGFwcGxpZXMgdG8gYWxsIHR5cGVzIG9mIGNvbm5lY3Rpb25zLCBhbmQgdGh1cyBpcyBvcnRob2dvbmFsIHRvCiAgICAgICAgICBTRVQgR0VULVBVVC1SRU1PVEUsIHdoaWNoIHNlbGVjdHMgYmV0d2VlbiBLZXJtaXQgYW5kIEZUUCBmb3IKICAgICAgICAgIHJlbW90ZSBmaWxlLXRyYW5zZmVyIGFuZCBtYW5hZ2VtZW50IGNvbW1hbmRzLiBUaGUgZGVmYXVsdCBMT0NVUwogICAgICAgICAgaXMgQVVUTywgd2hpY2ggbWVhbnMgd2Ugc3dpdGNoIHRvIFJFTU9URSB3aGVuZXZlciBhbiBGVFAKICAgICAgICAgIGNvbm5lY3Rpb24gaXMgbWFkZSwgYW5kIHRvIExPQ0FMIHdoZW5ldmVyIGEgbm9uLUZUUCBjb25uZWN0aW9uCiAgICAgICAgICBpcyBtYWRlLCBhbmQgc3dpdGNoIGJhY2sgYWNjb3JkaW5nbHkgd2hlbmV2ZXIgYSBjb25ubmVjdGlvbiBpcwogICAgICAgICAgY2xvc2VkLiBTbyBieSBkZWZhdWx0LCBLZXJtaXQgYmVoYXZlcyBpbiBpdHMgdHJhZGl0aW9uYWwgbWFubmVyCiAgICAgICAgICB1bmxlc3MgeW91IG1ha2UgYW4gRlRQIGNvbm5lY3Rpb24sIGluIHdoaWNoIGNhc2UgaXQgYWN0cyBsaWtlIGEKICAgICAgICAgIHJlZ3VsYXIgRlRQIGNsaWVudCAoYnV0IGJldHRlciA6LSkgICBMT0NVUyBhcHBsaWVzIHRvIHRoZQogICAgICAgICAgZm9sbG93aW5nIGNvbW1hbmRzOgoKICBVbnByZWZpeGVkICAgIFJlbW90ZSAgICAgICBMb2NhbCAgICAgICAgRGVzY3JpcHRpb24gICAgICAgIAogICBDRCAoQ1dEKSAgICAgIFJDRCAgICAgICAgICBMQ0QgICAgICAgICAgQ2hhbmdlIChXb3JraW5nKSBEaXJlY3RvcnkKICAgQ0RVUCAgICAgICAgICBSQ0RVUCAgICAgICAgTENEVVAgICAgICAgIENEIFVwCiAgIFBXRCAgICAgICAgICAgUlBXRCAgICAgICAgIExQV0QgICAgICAgICBQcmludCBXb3JraW5nIERpcmVjdG9yeQogICBESVJFQ1RPUlkgICAgIFJESVIgICAgICAgICBMRElSICAgICAgICAgUmVxdWVzdCBhIGRpcmVjdG9yeSBsaXN0aW5nYQogICBERUxFVEUgICAgICAgIFJERUwgICAgICAgICBMREVMICAgICAgICAgRGVsZXRlIChhKSBmaWxlKHMpCiAgIFJFTkVNRSAgICAgICAgUlJFTiAgICAgICAgIExSRU4gICAgICAgICBSZW5hbWUgYSBmaWxlCiAgIE1LRElSICAgICAgICAgUk1LRElSICAgICAgIExNS0RJUiAgICAgICBDcmVhdGUgYSBkaXJlY3RvcnkKICAgUk1ESVIgICAgICAgICBSUk1ESVIgICAgICAgTFJNRElSICAgICAgIFJlbW92ZSBhIGRpcmVjdG9yeQoKICAgU0VUIE1BVENIIHsgRE9USUZJTEUsIEZJRk8gfSB7IE9OLCBPRkYgfQogICAgICAgICAgV2hldGhlciBDLUtlcm1pdCBmaWxlbmFtZSBwYXR0ZXJucyAod2lsZGNhcmRzKSBzaG91bGQgbWF0Y2gKICAgICAgICAgIGZpbGVuYW1lcyB0aGF0IHN0YXJ0IHdpdGggZG90IChwZXJpb2QpLCBvciAoVW5peCBvbmx5KSBGSUZPcwogICAgICAgICAgKG5hbWVkIHBpcGVzKS4gVGhlIGRlZmF1bHRzIGFyZSB0byBza2lwIGRvdGZpbGVzIGluIFVuaXggYnV0CiAgICAgICAgICBtYXRjaCB0aGVtIGVsc2V3aGVyZSwgYW5kIHRvIHNraXAgRklGT3MuIEFwcGxpZXMgdG8gYm90aAogICAgICAgICAgaW50ZXJhY3RpdmUgdXNlIGFuZCB0byBzZXJ2ZXIgbW9kZSwgd2hlbiB0aGUgc2VydmVyIHJlY2VpdmVzCiAgICAgICAgICB3aWxkY2FyZHMsIGUuZy4gaW4gYSBHRVQgY29tbWFuZC4gQWxzbyBzZWUgUkVNT1RFIFNFVCBNQVRDSC4KCiAgIFNFVCBPUFRJT05TIERJUkVDVE9SWSAvRE9URklMRVMKICAgICAgICAgIE5vdyB3b3JrcyBmb3Igc2VydmVyIGxpc3RpbmdzIHRvbyAoVU5JWCBvbmx5KS4gR2l2ZSB0aGlzCiAgICAgICAgICBjb21tYW5kIHByaW9yIHRvIGhhdmluZyBLZXJtaXQgZW50ZXIgc2VydmVyIG1vZGUsIGFuZCB0aGVuIGl0CiAgICAgICAgICB3aWxsIHNob3cgZmlsZXMgd2hvc2UgbmFtZXMgYmVnaW4gd2l0aCBkb3QgKHBlcmlvZCkgd2hlbiBzZW50IGEKICAgICAgICAgIFJFTU9URSBESVJFQ1RPUlkgY29tbWFuZC4KCiAgIFNFVCBRVUlFVCBPTgogICAgICAgICAgKGFzIHdlbGwgYXMgdGhlIC1xIGNvbW1hbmQtbGluZSBvcHRpb24pIE5vdyBhcHBsaWVzIGFsc28gdG86CgogICAgICAgICAgKyBTRVQgSE9TVCBjb25uZWN0aW9uIHByb2dyZXNzIG1lc3NhZ2VzLgogICAgICAgICAgKyAiUHJlc3MgdGhlIFggb3IgRSBrZXkgdG8gY2FuY2VsIiBmaWxlLXRyYW5zZmVyIG1lc3NhZ2UuCiAgICAgICAgICArIFJFTU9URSBDRCByZXNwb25zZS4KICAgICAgICAgICsgUkVNT1RFIExPR0lOIHJlc3BvbnNlLgoKICAgU0VUIFJFQ0VJVkUgUEVSTUlTU0lPTlMgeyBPTiwgT0ZGIH0KICAgICAgICAgIFRlbGxzIEMtS2VybWl0IHdoZXRoZXIgdG8gc2V0IHRoZSBwZXJtaXNzaW9ucyBvZiBpbmNvbWluZyBmaWxlcwogICAgICAgICAgKHJlY2VpdmVkIHdpdGggS2VybWl0IHByb3RvY29sKSBmcm9tIHRoZSBwZXJtaXNzaW9ucyBzdXBwbGllZAogICAgICAgICAgaW4gdGhlIGZpbGUncyBBdHRyaWJ1dGUgcGFja2V0IChpZiBhbnkpLiBOb3JtYWxseSBPTi4gQWxzbyBzZWUKICAgICAgICAgIFNFVCBTRU5EIFBFUk1JU1NJT05TLgoKICAgU0VUIFJPT1QgZGlyZWN0b3J5CiAgICAgICAgICBMaWtlIFVOSVggY2hyb290LCB3aXRob3V0IHJlcXVpcmluZyBwcml2aWxlZ2UuIFNldHMgdGhlIHJvb3QKICAgICAgICAgIGZvciBmaWxlIGFjY2VzcywgZG9lcyBub3QgYWxsb3cgcmVmZXJlbmNlIHRvIG9yIGNyZWF0aW9uIG9mCiAgICAgICAgICBmaWxlcyBvdXRzaWRlIHRoZSByb290LCBhbmQgY2FuJ3QgYmUgdW5kb25lLgoKICAgU0VUIFNFTkQgUEVSTUlTU0lPTlMgeyBPTiwgT0ZGIH0KICAgICAgICAgIFRlbGxzIEMtS2VybWl0IHdoZXRoZXIgdG8gaW5jbHVkZSBmaWxlIHBlcm1pc3Npb25zIGluIHRoZQogICAgICAgICAgYXR0cmlidXRlcyBpdCBpbmNsdWRlcyB3aXRoIGVhY2ggZmlsZSB3aGVuIHNlbmRpbmcgd2l0aCBLZXJtaXQKICAgICAgICAgIHByb3RvY29sLiBBbHNvIHNlZSBTRVQgUkVDRUlWRSBQRVJNSVNTSU9OUy4KCiAgIFNFVCBUQ1AgeyBIVFRQLVBST1hZLCBTT0NLUy1TRVJWRVIgfSAvVVNFUjpuYW1lIC9QQVNTV09SRDp0ZXh0CiAgICAgICAgICBUaGVzZSBjb21tYW5kcyBub3cgYWxsb3cgc3BlY2lmaWNhdGlvbiBvZiB1c2VybmFtZSBhbmQKICAgICAgICAgIHBhc3N3b3JkLgoKICAgU0VUIFRFUk1JTkFMIC4gLiAuCiAgICAgICAgICAoU2VlIFszODhdU2VjdGlvbiAxMi4pCgogICBTRVQgVFJBTlNGRVIgTUVTU0FHRSBbIHRleHQgXQogICAgICAgICAgU2V0cyBhbiBpbml0aWFsIHRleHQgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlCiAgICAgICAgICBmaWxlLXRyYW5zZmVyIGRpc3BsYXkuIFRoZSB0cmFuc2ZlciBtZXNzYWdlIGlzIGF1dG9tYXRpY2FsbHkKICAgICAgICAgIGRlbGV0ZWQgb25jZSB1c2VkLCBzbyBtdXN0IGJlIHNldCBlYWNoIHRpbWUgYSBtZXNzYWdlIGEKICAgICAgICAgIGRlc2lyZWQuIEFueSB2YXJpYWJsZXMgaW4gdGhlIG1lc3NhZ2UgYXJlIGV2YWx1YXRlZCBhdCB0aGUgdGltZQogICAgICAgICAgdGhlIFNFVCBjb21tYW5kIGlzIGdpdmVuLiBJZiB0aGUgb3B0aW9uYWwgdGV4dCBpcyBvbWl0dGVkLCBhbnkKICAgICAgICAgIHRyYW5zZmVyIG1lc3NhZ2UgdGhhdCBpcyBjdXJyZW50bHkgc2V0IGlzIHJlbW92ZWQuIFN5bm9ueW06IFNFVAogICAgICAgICAgWEZFUiBNU0cuIFNIT1cgVFJBTlNGRVIgZGlzcGxheXMgaXQgaWYgaXQgaGFzIGJlZW4gc2V0IGJ1dCBub3QKICAgICAgICAgIHlldCB1c2VkLgoKICAgU0hPVyBDT01NVU5JQ0FUSU9OUwogICAgICAgICAgSW4gQy1LZXJtaXQgOC4wLCBTSE9XIENPTU1VTklDQVRJT05TLCB3aGVuIGdpdmVuIGluIHJlbW90ZSBtb2RlCiAgICAgICAgICAoaS5lLiBiZWZvcmUgYW55IGNvbm5lY3Rpb24gaGFzIGJlZW4gZXN0YWJsaXNoZWQpLCB0ZWxscyB0aGUKICAgICAgICAgIHR5cGljYWwgZGlhbG91dCBkZXZpY2UgbmFtZSBmb3IgdGhlIHBhcnRpY3VsYXIgcGxhdGZvcm0gb24KICAgICAgICAgIHdoaWNoIGl0J3MgcnVubmluZyAoZS5nLiBUWEEwOiBmb3IgVk1TLCBvciAvZGV2L2N1YTBwMCBmb3IKICAgICAgICAgIEhQLVVYKS4gT24gVW5peCBwbGF0Zm9ybXMsIGl0IGFsc28gdGVsbHMgdGhlIG5hbWUgb2YgdGhlCiAgICAgICAgICBsb2NrZmlsZSBkaXJlY3RvcnkuIFRoaXMgd2F5LCB5b3UgaGF2ZSBhbiBpZGVhIG9mIHdoYXQgdGhlIFNFVAogICAgICAgICAgTElORSBkZXZpY2UgbmFtZSBzaG91bGQgbG9vayBsaWtlLCBhbmQgaWYgdGhlIFNFVCBMSU5FIGNvbW1hbmQKICAgICAgICAgIGZhaWxzLCB5b3Uga25vdyB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IG9yIGRldmljZSB0aGF0IGlzCiAgICAgICAgICBwcm90ZWN0ZWQgYWdhaW5zdCB5b3UuCgogICBTSE9XIFZBUklBQkxFUyBbIG5hbWUgWyBuYW1lIFsgLi4uIF0gXSBdCiAgICAgICAgICBJbiBDLUtlcm1pdCA4LjAuMjAxIHlvdSBjYW4gcmVxdWVzdCB2YWx1ZXMgb2YgYSBsaXN0IG9mCiAgICAgICAgICBidWlsdC1pbiAoXHYoeHh4KSkgdmFyaWFibGVzLiBFYWNoIG5hbWUgaXMgYSBwYXR0ZXJuLCBhcwogICAgICAgICAgYmVmb3JlLCBidXQgbm93IGl0IGEgZnJlZSBwYXR0ZXJuIHJhdGhlciB0aGFuIGFuIGFuY2hvcmVkIG9uZQogICAgICAgICAgKGV4cGxhaW5lZCBpbiBbMzg5XVNlY3Rpb24gOC4xMikgc28gbm93ICJzaG93IHZhciBkYXRlIHRpbWUiCiAgICAgICAgICBzaG93cyB0aGUgdmFsdWVzIG9mIGFsbCB2YXJpYWJsZXMgd2hvc2UgbmFtZXMgaW5jbHVkZSB0aGUKICAgICAgICAgIHN0cmluZ3MgImRhdGUiIG9yICJ0aW1lIi4KCiAgIFRBSUwgWyBzd2l0Y2hlcyBdIGZpbGVuYW1lCiAgICAgICAgICBFcXVpdmFsZW50IHRvIFRZUEUgL1RBSUwgWyBvdGhlci1zd2l0Y2hlcyBdIGZpbGVuYW1lLgoKICAgVFJBTlNNSVQgL05PRUNITyBbIG90aGVyIHN3aXRjaGVzIF0gZmlsZW5hbWUKICAgICAgICAgIFRoZSAvTk9FQ0hPIHN3aXRjaCBpcyBlcXVpdmFsZW50IHRvIGdpdmluZyB0aGUgY29tbWFuZCBTRVQKICAgICAgICAgIFRSQU5TTUlUIEVDSE8gT0ZGIHByaW9yIHRvIHRoZSBUUkFOU01JVCBjb21tYW5kLCBleGNlcHQgdGhlCiAgICAgICAgICBzd2l0Y2ggYWZmZWN0cyBvbmx5IHRoZSBjb21tYW5kIHdpdGggd2hpY2ggaXQgd2FzIGdpdmVuIGFuZAogICAgICAgICAgZG9lcyBub3QgYWZmZWN0IHRoZSBwcmV2YWlsaW5nIGdsb2JhbCBzZXR0aW5nLgoKICAgVFJBTlNNSVQgL05PV0FJVCBbIG90aGVyIHN3aXRjaGVzIF0gZmlsZW5hbWUKICAgICAgICAgIFRoZSAvTk9XQUlUIHN3aXRjaCBpcyBlcXVpdmFsZW50IHRvIGdpdmluZyB0aGUgY29tbWFuZCBTRVQKICAgICAgICAgIFRSQU5TTUlUIFBST01QVCAwIHByaW9yIHRvIHRoZSBUUkFOU01JVCBjb21tYW5kLCBleGNlcHQgdGhlCiAgICAgICAgICBzd2l0Y2ggYWZmZWN0cyBvbmx5IHRoZSBjb21tYW5kIHdpdGggd2hpY2ggaXQgd2FzIGdpdmVuIGFuZAogICAgICAgICAgZG9lcyBub3QgYWZmZWN0IHRoZSBwcmV2YWlsaW5nIGdsb2JhbCBzZXR0aW5nLgoKICAgVFJBTlNNSVQgL05PV0FJVCAvTk9FQ0hPIC9CSU5BUlkgWyBvdGhlciBzd2l0Y2hlcyBdIGZpbGVuYW1lCiAgICAgICAgICBXaGVuIHRoZSBUUkFOU01JVCBjb21tYW5kIGlzIGdpdmVuIHdpdGggdGhlIC9OT1dBSVQsIC9OT0VDSE8sCiAgICAgICAgICBhbmQgL0JJTkFSWSBzd2l0Y2hlcywgdGhpcyBhY3RpdmF0ZXMgYSBzcGVjaWFsICJibGFzdCB0aGUgd2hvbGUKICAgICAgICAgIGZpbGUgb3V0IHRoZSBjb21tdW5pY2F0aW9ucyBjb25uZWN0aW9uIGFsbCBhdCBvbmNlIiBtb2RlIHRoYXQKICAgICAgICAgIEtlcm1pdCBkaWRuJ3QgaGF2ZSBwcmlvciB0byB2ZXJzaW9uIDguMC4gVGhlcmUgaGFzIGJlZW4KICAgICAgICAgIGluY3JlYXNpbmcgZGVtYW5kIGZvciB0aGlzIHR5cGUgb2YgdHJhbnNtaXNzaW9uIHdpdGggdGhlIGFkdmVudAogICAgICAgICAgb2YgZGV2aWNlcyB0aGF0IGV4cGVjdCBpbWFnZSAoZS5nLiAuSlBHKSBvciBzb3VuZCAoZS5nLiAuTVAzKQogICAgICAgICAgZmlsZXMgYXMgcmF3IGlucHV0LiBUaGUgb2J2aW91cyBxdWVzdGlvbiBpczogaG93IGRvZXMgdGhlCiAgICAgICAgICByZWNlaXZpbmcgZGV2aWNlIGtub3cgd2hlbiBpdCBoYXMgdGhlIHdob2xlIGZpbGU/IFRoaXMgZGVwZW5kcwogICAgICAgICAgb24gdGhlIGRldmljZSwgb2YgY291cnNlOyB1c3VhbGx5IGFmdGVyIGEgY2VydGFpbiBhbW91bnQgb2YKICAgICAgICAgIHRpbWUgZWxhcHNlcyB3aXRoIG5vdGhpbmcgYXJyaXZpbmcsIG9yIGVsc2Ugd2hlbiBLZXJtaXQgaGFuZ3MKICAgICAgICAgIHVwIG9yIGNsb3NlcyB0aGUgY29ubmVjdGlvbi4KCiAgIFRZUEUgL0NIQVJBQ1RFUi1TRVQ6bmFtZQogICAgICAgICAgQWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBjaGFyYWN0ZXIgc2V0IGluIHdoaWNoIHRoZSBmaWxlIHRvIGJlCiAgICAgICAgICB0eXBlZCBpcyBlbmNvZGVkLgoKICAgVFlQRSAvTlVNQkVSCiAgICAgICAgICBBZGRzIGxpbmUgbnVtYmVycy4KCiAgIFRZUEUgL09VVFBVVDpmaWxlbmFtZQogICAgICAgICAgU2VuZHMgdGhlIHJlc3VsdHMgb2YgdGhlIFRZUEUgY29tbWFuZCB0byB0aGUgZ2l2ZW4gZmlsZS4KCiAgIFRZUEUgL1RSQU5TTEFURS1UTzpuYW1lCiAgICAgICAgICBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggVFlQRSAvQ0hBUkFDVEVSLVNFVDp4eHg7IGFsbG93cyB5b3UgdG8KICAgICAgICAgIHNwZWNpZnkgdGhlIGNoYXJhY3RlciBzZXQgaW4gd2hpY2ggdGhlIGZpbGUgaXMgdG8gYmUgZGlzcGxheWVkLgoKICAgVFlQRSAvVFJBTlNQQVJFTlQKICAgICAgICAgIFVzZWQgdG8gZGlzYWJsZSBjaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9uIGluIHRoZSBUWVBFIGNvbW1hbmQsCiAgICAgICAgICB3aGljaCBvdGhlcndpc2UgY2FuIHRha2UgcGxhY2UgYXV0b21hdGljYWxseSBiYXNlZCBvbiBmaWxlCiAgICAgICAgICBzY2FubmluZywgZXZlbiB3aGVuIC9DSEFSQUNURVItU0VUIGFuZCAvVFJBTlNMQVRFLVRPIHN3aXRjaGVzCiAgICAgICAgICBhcmUgbm90IGdpdmVuLgoKICAgVk9JRCB0ZXh0CiAgICAgICAgICBQYXJzZXMgdGhlIHRleHQsIGV2YWx1YXRpbmcgYW55IGJhY2tzbGFzaCBpdGVtcyBpbiBpdCAoc3VjaCBhcwogICAgICAgICAgZnVuY3Rpb24gY2FsbHMpIGJ1dCBkb2Vzbid0IGRvIGFueXRoaW5nIGZ1cnRoZXIsIGV4Y2VwdAogICAgICAgICAgcG9zc2libHkgcHJpbnRpbmcgZXJyb3IgbWVzc2FnZXMuIFVzZWZ1bCBmb3IgaW52b2tpbmcgZnVuY3Rpb25zCiAgICAgICAgICB0aGF0IGhhdmUgc2lkZSBlZmZlY3RzIHdpdGhvdXQgdXNpbmcgb3IgcHJpbnRpbmcgdGhlaXIgZGlyZWN0CiAgICAgICAgICByZXN1bHRzLCBlLmcuICJ2b2lkIFxmc3BsaXQoXCVhLCZhKSIuCgogIFN5bWJvbGljIExpbmtzIGluIFVOSVgKCiAgIFRoZSBVTklYIHZlcnNpb25zIG9mIEMtS2VybWl0IGhhdmUgaGFkIC9GT0xMT1dMSU5LUyBhbmQgL05PRk9MTE9XTElOS1MKICAgc3dpdGNoZXMgYWRkZWQgdG8gc2V2ZXJhbCBjb21tYW5kcyB0byBjb250cm9sIHRoZSB0cmVhdG1lbnQgb2YKICAgc3ltYm9saWMgbGlua3MuIERpZmZlcmVudCBjb21tYW5kcyBkZWFsIGRpZmZlcmVudGx5IHdpdGggc3ltYm9saWMKICAgbGlua3M6CgogICBLZXJtaXQgU0VORCwgRlRQIE1QVVQKICAgICAgICAgIC9OT0ZPTExPV0xJTktTIGlzIHRoZSBkZWZhdWx0LCB3aGljaCBtZWFucyBzeW1ib2xpYyBsaW5rcyBhcmUKICAgICAgICAgIHNraXBwZWQgZW50aXJlbHkuIFRoZSBhbHRlcm5hdGl2ZSwgL0ZPTExPV0xJTktTLCBzaG91bGQgYmUgdXNlZAogICAgICAgICAgd2l0aCBjYXV0aW9uLCBzaW5jZSBhbiBpbm5vY2VudCBsaW5rIG1pZ2h0IHBvaW50IHRvIGEgd2hvbGUKICAgICAgICAgIGZpbGUgc3lzdGVtLCBvciBpdCBtaWdodCBjYXVzZSBhIGxvb3AuIFRoZXJlIGlzIG5vIHdheSBpbgogICAgICAgICAgS2VybWl0IG9yIEZUUCBwcm90b2NvbCB0byBzZW5kIHRoZSBsaW5rIGl0c2VsZi4gV2UgZWl0aGVyIHNraXAKICAgICAgICAgIHRoZW0gb3IgZm9sbG93IHRoZW07IHdlIGNhbid0IGR1cGxpY2F0ZSB0aGVtLgoKICAgRElSRUNUT1JZCiAgICAgICAgICAvTk9GT0xMT1dMSU5LUyBpcyB0aGUgZGVmYXVsdCwgd2hpY2ggbWVhbnMgdGhlIERJUkVDVE9SWQogICAgICAgICAgY29tbWFuZCBsaXN0cyBzeW1ib2xpYyBsaW5rcyBpbiBhIHdheSB0aGF0IHNob3dzIHRoZXkgYXJlCiAgICAgICAgICBsaW5rcywgYnV0IGl0IGRvZXMgbm90IGZvbGxvdyB0aGVtLiBUaGUgYWx0ZXJuYXRpdmUsCiAgICAgICAgICAvRk9MTE9XTElOS1MsIGZvbGxvd3MgbGlua3MgYW5kIGdpdmVzIGluZm9ybWF0aW9uIGFib3V0IHRoZQogICAgICAgICAgbGlua2VkLXRvIGRpcmVjdG9yaWVzIGFuZCBmaWxlcy4KCiAgIERFTEVURSwgUk1ESVIKICAgICAgICAgIFRoZSBERUxFVEUgY29tbWFuZCBkb2VzIG5vdCBoYXZlIGxpbmstc3BlY2lmaWMgc3dpdGNoZXMuIERFTEVURQogICAgICAgICAgbmV2ZXIgZm9sbG93cyBsaW5rcy4gSWYgeW91IHRlbGwgS2VybWl0IHRvIGRlbGV0ZSBhIHN5bWJvbGljCiAgICAgICAgICBsaW5rLCBpdCBkZWxldGVzIHRoZSBsaW5rIGl0c2VsZiwgbm90IHRoZSBsaW5rZWQtdG8gZmlsZS4gRGl0dG8KICAgICAgICAgIGZvciBSTURJUi4KCiAgIENPUFkKICAgICAgICAgIFRoZSBDT1BZIGNvbW1hbmQgYmVoYXZlcyBqdXN0IGxpa2UgdGhlIFVOSVggY3AgY29tbWFuZDsgaXQKICAgICAgICAgIGFsd2F5cyBmb2xsb3dzIGxpbmtzLgoKICAgUkVOQU1FCiAgICAgICAgICBUaGUgUkVOQU1FIGNvbW1hbmQgYmVoYXZlcyBqdXN0IGxpa2UgdGhlIFVOSVggbXYgY29tbWFuZDsgaXQKICAgICAgICAgIG9wZXJhdGVzIG9uIGxpbmtzIGRpcmVjdGx5IHJhdGhlciB0aGFuIGZvbGxvd2luZy4KCiAgIFsgWzM5MF1Ub3AgXSBbIFszOTFdQ29udGVudHMgXSBbIFszOTJdQy1LZXJtaXQgSG9tZSBdIFsgWzM5M11LZXJtaXQKICAgSG9tZSBdCiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCjguIE9USEVSIFNDUklQVElORyBJTVBST1ZFTUVOVFMKCiAgOC4xLiBQZXJmb3JtYW5jZSBhbmQgRGVidWdnaW5nCgogICBBIGNvbW1hbmQgY2FjaGUgZm9yIGZyZXF1ZW50bHkgdXNlZCBjb21tYW5kcyBwbHVzIHNvbWUgcmVsYXRlZAogICBvcHRpbWl6YXRpb25zIGluY3JlYXNlcyB0aGUgc3BlZWQgb2YgY29tcHV0ZS1ib3VuZCBzY3JpcHRzIGJ5IGFueXdoZXJlCiAgIGZyb20gNTAlIHRvIDEwMDAlLgoKICAgVGhlIG5ldyBQUk9NUFQgY29tbWFuZCBjYW4gYmUgdXNlZCB0byBzZXQgYnJlYWtwb2ludHMgZm9yIGRlYnVnZ2luZwogICBzY3JpcHRzLiBJZiBleGVjdXRlZCBpbiBhIGNvbW1hbmQgZmlsZSBvciBtYWNybywgaXQgZ2l2ZXMgeW91IGFuCiAgIGludGVyYWN0aXZlIGNvbW1hbmQgcHJvbXB0IGluIHRoZSBjdXJyZW50IGNvbnRleHQgb2YgdGhlIHNjcmlwdCwgd2l0aAogICBhbGwgaXRzIHZhcmlhYmxlcywgYXJndW1lbnRzLCBjb21tYW5kIHN0YWNrLCBldGMsIGF2YWlsYWJsZSBmb3IKICAgZXhhbWluYXRpb24gb3IgY2hhbmdlLCBhbmQgdGhlIGFiaWxpdHkgdG8gcmVzdW1lIHRoZSBzY3JpcHQgYXQgYW55CiAgIHBvaW50IChFTkQgcmVzdW1lcyBpdCwgQ3RybC1DIG9yIFNUT1AgY2FuY2VscyBpdCBhbmQgcmV0dXJucyB0byB0b3AKICAgbGV2ZWwpLgoKICAgVGhlIG5ldyBDdHJsLUMgdHJhcHBpbmcgZmVhdHVyZSAoWzM5NF1TZWN0aW9uIDguMTQpIGxldHMgeW91IGludGVyY2VwdAogICBpbnRlcnJ1cHRpb24gb2Ygc2NyaXB0cy4gVGhpcyBjYW4gYmUgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZQogICBQUk9NUFQgY29tbWFuZCB0byBkZWJ1ZyBzY3JpcHRzLiBFeGFtcGxlOgoKZGVmaW5lIE9OX0NUUkxDIHsKICAgIGVjaG8gSU5URVJSVVBURUQgQlkgQ1RSTC1DLi4uCiAgICBlY2hvIFRoZSBjb21tYW5kIHN0YWNrIGhhcyBub3QgeWV0IGJlZW4gcm9sbGVkIGJhY2s6CiAgICBzaG93IHN0YWNrCiAgICBlY2hvIFR5cGUgQ3RybC1DIGFnYWluIG9yIHVzZSB0aGUgRU5EIGNvbW1hbmQgdG8gcmV0dXJuIHRvIHRvcCBsZXZlbC4KICAgIHByb21wdCBEZWJ1Zz4KfQoKICAgQWRkaW5nIHRoaXMgT05fQ1RSTCBkZWZpbml0aW9uIHRvIHlvdXIgc2NyaXB0IGxldHMgeW91IGludGVycnVwdCBpdCBhdAogICBhbnkgcG9pbnQgYW5kIGdldCBwcm9tcHQgdGhhdCBpcyBpc3N1ZWQgYXQgdGhlIGN1cnJlbnQgY29tbWFuZCBsZXZlbCwKICAgc28geW91IGNhbiBxdWVyeSBsb2NhbCB2YXJpYWJsZXMsIGV0Yy4KCiAgIFsgWzM5NV1Ub3AgXSBbIFszOTZdQ29udGVudHMgXSBbIFszOTddQy1LZXJtaXQgSG9tZSBdIFsgWzM5OF1LZXJtaXQKICAgSG9tZSBdCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgOC4yLiBVc2luZyBNYWNyb3MgYXMgTnVtZXJpYyBWYXJpYWJsZXMKCiAgIEEgbWFjcm8gaXMgYSB3YXkgdG8gYXNzaWduIGEgdmFsdWUgdG8gYSBuYW1lLCBhbmQgdGhlbiB1c2UgdGhlIG5hbWUgdG8KICAgcmVmZXIgdG8gdGhlIHZhbHVlLiBNYWNyb3MgYXJlIHVzZWQgaW4gdHdvIHdheXMgaW4gS2VybWl0OiBhcwogICAic3Vicm91dGluZXMiIG9yIGZ1bmN0aW9ucyBjb21wb3NlZCBvZiBLZXJtaXQgY29tbWFuZHMsIHdoaWNoIGFyZQogICBleGVjdXRlZCwgb3IgYXMgdmFyaWFibGVzIHRvIGhvbGQgYXJiaXRyYXJ5IHZhbHVlcyAtLSB0ZXh0LCBudW1iZXJzLAogICBmaWxlbmFtZXMsIGV0Yy4KCiAgIFdoZW4gYSBtYWNybyBpcyB0byBiZSBleGVjdXRlZCwgaXRzIG5hbWUgaXMgZ2l2ZW4gYXMgaWYgaXQgd2VyZSBhCiAgIEMtS2VybWl0IGNvbW1hbmQsIG9wdGlvbmFsbHkgcHJlY2VkZWQgYnkgdGhlIHdvcmQgImRvIi4gV2hlbiBhIG1hY3JvCiAgIGlzIHVzZWQgYXMgYSB2YXJpYWJsZSwgaXQgbXVzdCBiZSAiZXNjYXBlZCIgd2l0aCBcbSh4eHgpIChvcgogICBlcXVpdmFsZW50IGZ1bmN0aW9uLCBlLmcuIFxzKHh4eCksIFw6KHh4eCksIFxmZGVmaW5pdGlvbih4eHgpKSwgd2hlcmUKICAgeHh4IGlzIHRoZSBtYWNybyBuYW1lLCBmb3IgZXhhbXBsZToKCiAgZGVmaW5lIGZpbGVuYW1lIC91c3Ivb2xnYS9vb2ZhLnR4dAogIHNlbmQgXG0oZmlsZW5hbWUpCgogICBPZiBjb3Vyc2UgdmFyaWFibGVzIGNhbiBhbHNvIGhvbGQgbnVtYmVyczoKCiAgZGVmaW5lIHNpemUgMTcKICBkZWNsYXJlIFwmYVtcbShzaXplKV0KICAuLi4KICBkZWZpbmUgaW5kZXggMwogIGlmICggPT0gXG0oaW5kZXgpIDMgKSBlY2hvIFRoZSB0aGlyZCB2YWx1ZSBpczogXCZhW1xtKGluZGV4KV0KICBldmFsdWF0ZSBpbmRleCAoXG0oaW5kZXgpICogNCkKICBpZiAoID4gXG0oaW5kZXgpIFxtKHNpemUpICkgZWNobyBPdXQgb2YgcmFuZ2UhCgogICBCdXQgdGhlc2UgYXJlIGNvbnRleHRzIGluIHdoaWNoIG9ubHkgbnVtYmVycyBhcmUgdmFsaWQuIEMtS2VybWl0IDguMAogICBoYXMgYmVlbiBjaGFuZ2VkIHRvIHRyZWF0IG5vbi1lc2NhcGVkIG5vbi1udW1lcmljIGl0ZW1zIGluIHN0cmljdGx5CiAgIG51bWVyaWMgY29udGV4dHMgYXMgbWFjcm8gbmFtZXMuIFNvIGl0IGlzIG5vdyBwb3NzaWJsZSAoYnV0IG5vdAogICByZXF1aXJlZCkgdG8gb21pdCB0aGUgXG0oLi4uKSBub3RhdGlvbiBhbmQganVzdCB1c2UgdGhlIG1hY3JvIG5hbWUgaW4KICAgdGhlc2UgY29udGV4dHM6CgogIGRlZmluZSBzaXplIDE3CiAgZGVjbGFyZSBcJmFbc2l6ZV0KICAuLi4KICBkZWZpbmUgaW5kZXggMwogIGlmICggPT0gaW5kZXggMyApIGVjaG8gVGhlIHRoaXJkIHZhbHVlIGlzOiBcJmFbaW5kZXhdCiAgZXZhbHVhdGUgaW5kZXggKGluZGV4ICogNCkKICBpZiAoID4gaW5kZXggc2l6ZSApIGVjaG8gT3V0IG9mIHJhbmdlIQoKICAgVGhpcyBpcyBlc3BlY2lhbGx5IG5pY2UgZm9yIGxvb3BzIHRoYXQgZGVhbCB3aXRoIGFycmF5cy4gSGVyZSwgZm9yCiAgIGV4YW1wbGUsIGlzIGEgbG9vcCB0aGF0IHJldmVyc2VzIHRoZSBvcmRlciBvZiB0aGUgZWxlbWVudHMgaW4gYW4KICAgYXJyYXkuIFdoZXJlYXMgZm9ybWVybHkgaXQgd2FzIG5lY2Vzc2FyeSB0byB3cml0ZToKCiAgLlwlbiA6Oj0gXGZkaW0oJmEpCiAgZm9yIFwlaSAxIFwlbi8yIDEgewogICAgICAudG1wIDo9IFwmYVtcJW4tXCVpKzFdCiAgICAgIC5cJmFbXCVuLVwlaSsxXSA6PSBcJmFbXCVpXQogICAgICAuXCZhW1wlaV0gOj0gXG0odG1wKQogIH0KCiAgIFJlY29kaW5nIHRoaXMgdG8gdXNlIG1hY3JvIG5hbWVzICJpIiBhbmQgIm4iIGluc3RlYWQgb2YgdGhlIGJhY2tzbGFzaAogICB2YXJpYWJsZXMgXCVpIGFuZCBcJW4sIHdlIGhhdmU6CgogIC5uIDo6PSBcZmRpbSgmYSkKICBmb3IgaSAxIG4vMiAxIHsKICAgICAgLnRtcCA6PSBcJmFbbi1pKzFdCiAgICAgIC5cJmFbbi1pKzFdIDo9IFwmYVtpXQogICAgICAuXCZhW2ldIDo9IFxtKHRtcCkKICB9CgogICB3aGljaCByZWR1Y2VzIHRoZSBiYWNrc2xhc2ggY291bnQgdG8gbGVzcyB0aGFuIGhhbGYuIFRoZSBmaW5hbAogICBzdGF0ZW1lbnQgaW4gdGhlIGxvb3AgY291bGQgYmUgd3JpdHRlbiAiLlwmYVtpXSA6Oj0gdG1wIiBpZiB0aGUgYXJyYXkKICAgY29udGFpbmVkIG9ubHkgbnVtYmVycyAoc2luY2UgOjo9IGluZGljYXRlcyBhcml0aG1ldGljIGV4cHJlc3Npb24KICAgZXZhbHVhdGlvbikuCgogICBBbHNvLCBub3cgeW91IGNhbiB1c2UgZmxvYXRpbmctcG9pbnQgbnVtYmVycyBpbiBpbnRlZ2VyIGNvbnRleHRzIChzdWNoCiAgIGFzIGFycmF5IHN1YnNjcmlwdHMpLCBpbiB3aGljaCBjYXNlIHRoZXkgYXJlIHRydW5jYXRlZCB0byBhbiBpbnRlZ2VyCiAgIHZhbHVlIChpLmUuIHRoZSBmcmFjdGlvbmFsIHBhcnQgaXMgZGlzY2FyZGVkKS4KCiAgIEV4YW1wbGVzIG9mIG51bWVyaWMgY29udGV4dHMgaW5jbHVkZToKCiAgICAgKiBBcnJheSBzdWJzY3JpcHRzLgogICAgICogQW55IG51bWVyaWMgZnVuY3Rpb24gYXJndW1lbnQuCiAgICAgKiBSaWdodC1oYW5kIHNpZGUgb2YgOjo9IGFzc2lnbm1lbnRzLgogICAgICogRVZBTFVBVEUgY29tbWFuZCBvciBcZmV2YWx1YXRlKCkgZnVuY3Rpb24gZXhwcmVzc2lvbi4KICAgICAqIFRoZSBJTkNSRU1FTlQgb3IgREVDUkVNRU5UIGJ5LXZhbHVlLgogICAgICogSUYgPSwgPiwgPCwgIT0sID49LCBhbmQgPD0gY29tcGFyYW5kcy4KICAgICAqIFRoZSBJRiBudW1iZXIgY29uc3RydWN0LgogICAgICogRk9SLWxvb3AgdmFyaWFibGVzLgogICAgICogU1RPUCwgRU5ELCBhbmQgRVhJVCBzdGF0dXMgY29kZXMuCiAgICAgKiBUaGUgSU5QVVQgdGltZW91dCB2YWx1ZS4KICAgICAqIFBBVVNFLCBXQUlULCBTTEVFUCwgTVNMRUVQIGludGVydmFscy4KICAgICAqIFRoZSBTSElGVCBhcmd1bWVudC4KICAgICAqIE51bWVyaWMgc3dpdGNoIGFyZ3VtZW50cywgZS5nLiBUWVBFIC9XSURUSDpudW1iZXIsIFNFTkQKICAgICAgIC9MQVJHRVI6bnVtYmVyLgogICAgICogU0NSRUVOIE1PVkUtVE8gcm93IGFuZCBjb2x1bW4gbnVtYmVyLgogICAgICogVmFyaW91cyBTRVQgRElBTCBwYXJhbWV0ZXJzICh0aW1lb3V0LCByZXRyeSBsaW1pdCwgZXRjKS4KICAgICAqIFZhcmlvdXMgU0VUIFNFTkQgb3IgUkVDRUlWRSBwYXJhbWV0ZXJzIChwYWNrZXQgbGVuZ3RoLCB3aW5kb3cKICAgICAgIHNpemUsIGV0YykuCiAgICAgKiBWYXJpb3VzIG90aGVyIFNFVCBwYXJhbWV0ZXJzLgoKICAgYW5kOgoKICAgICAqIFMtRXhwcmVzc2lvbnMgKGV4cGxhaW5lZCBpbiBbMzk5XVNlY3Rpb24gOSkuCgogICBNYWNybyBuYW1lcyB1c2VkIGluIG51bWVyaWMgY29udGV4dHMgbXVzdCBub3QgaW5jbHVkZSBtYXRoZW1hdGljYWwKICAgb3BlcmF0b3JzLiBBbHRob3VnaCBpdCBpcyBsZWdhbCB0byBjcmVhdGUgYSBtYWNybyBjYWxsZWQgImZvbytiYXIiLCBpbgogICBhIG51bWVyaWMgY29udGV4dCB0aGlzIHdvdWxkIGJlIHRha2VuIGFzIHRoZSBzdW0gb2YgdGhlIHZhbHVlcyBvZgogICAiZm9vIiBhbmQgImJhciIuIEFueSBzdWNoIGNvbmZsaWN0IGNhbiBiZSBhdm9pZGVkLCBvZiBjb3Vyc2UsIGJ5CiAgIGVuY2xvc2luZyB0aGUgbWFjcm8gbmFtZSBpbiBcbSguLi4pLgoKICAgWyBbNDAwXVRvcCBdIFsgWzQwMV1Db250ZW50cyBdIFsgWzQwMl1DLUtlcm1pdCBIb21lIF0gWyBbNDAzXUtlcm1pdAogICBIb21lIF0KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICA4LjMuIE5ldyBJRiBDb25kaXRpb25zCgogICBTZXZlcmFsIG5ldyBJRiBjb25kaXRpb25zIGFyZSBhdmFpbGFibGU6CgogICBJRiBERUNMQVJFRCBhcnJheW5hbWUKICAgICAgICAgIEV4cGxhaW5lZCBpbiBbNDA0XVNlY3Rpb24gOC42LgoKICAgSUYgS0JISVQKICAgICAgICAgIEFsbG93cyBhIHNjcmlwdCB0byB0ZXN0IHdoZXRoZXIgYSBrZXkgd2FzIHByZXNzZWQgd2l0aG91dAogICAgICAgICAgYWN0dWFsbHkgdHJ5aW5nIHRvIHJlYWQgaXQuCgogICBJRiBLRVJCQU5HIChVbml4IG9ubHkpCiAgICAgICAgICBUcnVlIGlmIEtlcm1pdCB3YXMgc3RhcnRlZCBmcm9tIGEgS2VyYmFuZyBzY3JpcHQuIFRoaXMgaXMKICAgICAgICAgIHVzZWZ1bCBmb3Iga25vd2luZyBob3cgdG8gaW50ZXJwcmV0IHRoZSBcJkBbXSBhbmQgXCZfW10KICAgICAgICAgIGFyZ3VtZW50IHZlY3RvciBhcnJheXMsIGFuZCB1bmRlciB3aGF0IGNvbmRpdGlvbnMgdG8gZXhpdC4KCiAgIElGIElOVEVHRVIgbgogICAgICAgICAgVGhpcyBpcyBqdXN0IGEgc3lub255bSBmb3IgSUYgTlVNRVJJQywgd2hpY2ggaXMgdHJ1ZSBpZiBuCiAgICAgICAgICBjb250YWlucyBvbmx5IGRpZ2l0cyAob3IsIGlmIG4gaXMgYSB2YXJpYWJsZSwgaXRzIHZhbHVlCiAgICAgICAgICBjb250YWlucyBvbmx5IGRpZ2l0cykuCgogICBCeSBjb250cmFzdCwgSUYgRkxPQVQgbiBzdWNjZWVkcyBpZiBuIGlzIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIE9SIGFuCiAgIGludGVnZXIgKG9yIGEgdmFyaWFibGUgd2l0aCBmbG9hdGluZy1wb2ludCBvciBpbnRlZ2VyIHZhbHVlKS4KICAgVGhlcmVmb3JlLCBJRiBGTE9BVCBzaG91bGQgYmUgdXNlZCB3aGVuZXZlciBhbnkga2luZCBvZiBudW1iZXIgaXMKICAgYWNjZXB0YWJsZSwgd2hlcmVhcyBJRiBJTlRFR0VSIChvciBJRiBOVU1FUklDKSB3aGVuIG9ubHkgYW4gaW50ZWdlcgogICBjYW4gYmUgdXNlZC4KCiAgIFsgWzQwNV1Ub3AgXSBbIFs0MDZdQ29udGVudHMgXSBbIFs0MDddQy1LZXJtaXQgSG9tZSBdIFsgWzQwOF1LZXJtaXQKICAgSG9tZSBdCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgOC40LiBUaGUgT05fVU5LTk9XTl9DT01NQU5EIE1hY3JvCgogICBUaGUgbmV3IE9OX1VOS05PV05fQ09NTUFORCBtYWNybywgaWYgZGVmaW5lZCwgaXMgZXhlY3V0ZWQgd2hlbmV2ZXIgeW91CiAgIGdpdmUgYSBjb21tYW5kIHRoYXQgaXMgbm90IGtub3duIHRvIEMtS2VybWl0OyBhbnkgb3BlcmFuZHMgYXJlIHBhc3NlZAogICBhcyBhcmd1bWVudHMuIEhlcmUgYXJlIHNvbWUgc2FtcGxlIGRlZmluaXRpb25zOgoKICBERUYgT05fVU5LTk9XTl9DT01NQU5EIHRlbG5ldCBcJTEgOyBUcmVhdCB1bmtub3duIGNvbW1hbmRzIGFzIGhvc3RuYW1lcwogIERFRiBPTl9VTktOT1dOX0NPTU1BTkQgZGlhbCBcJTEgICA7IFRyZWF0IHVua25vd24gY29tbWFuZHMgcGhvbmUgbnVtYmVycwogIERFRiBPTl9VTktOT1dOX0NPTU1BTkQgdGFrZSBcJTEgICA7IFRyZWF0IHVua25vd24gY29tbWFuZHMgYXMgZmlsZW5hbWVzCiAgREVGIE9OX1VOS05PV05fQ09NTUFORCAhXCUqICAgICAgIDsgVHJlYXQgdW5rbm93biBjb21tYW5kcyBhcyBzaGVsbCBjb21tYW5kcwoKICAgVGhlIE9OX0NEIG1hY3JvLCBpZiBkZWZpbmVkLCBpcyBleGVjdXRlZCB3aGVuZXZlciBLZXJtaXQgaXMgZ2l2ZW4gYSBDRAogICAoY2hhbmdlIGRpcmVjdG9yeSkgY29tbWFuZCAoOC4wLjIxMSkuIFVwb24gZW50cnkgdG8gdGhpcyBtYWNybywgdGhlCiAgIGRpcmVjdG9yeSBoYXMgYWxyZWFkeSBjaGFuZ2VkIGFuZCB0aGUgbmV3IGRpcmVjdG9yeSBzdHJpbmcgaXMKICAgYXZhaWxhYmxlIGluIHRoZSBcdihkaXJlY3RvcnkpIHZhcmlhYmxlLCBhbmQgYWxzbyBhcyB0aGUgZmlyc3QKICAgYXJndW1lbnQgKFwlMSkuCgogICBbIFs0MDldVG9wIF0gWyBbNDEwXUNvbnRlbnRzIF0gWyBbNDExXUMtS2VybWl0IEhvbWUgXSBbIFs0MTJdS2VybWl0CiAgIEhvbWUgXQogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDguNS4gVGhlIFNIT1cgTUFDUk8gQ29tbWFuZAoKICAgVGhlIFNIT1cgTUFDUk8gY29tbWFuZCBoYXMgYmVlbiBjaGFuZ2VkIHRvIGFjY2VwdCBtb3JlIHRoYW4gb25lIG1hY3JvCiAgIG5hbWU6CgogIChzZXRxIGEgMSBiIDIgYyAzKQogIHNob3cgbWFjIGEgYiBjCiAgYSA9IDEKICBiID0gMgogIGMgPSAzCgogICBBbiBleGFjdCBtYXRjaCBpcyByZXF1aXJlZCBmb3IgZWFjaCBuYW1lIChleGNlcHQgdGhhdCBjYXNlIGRvZXNuJ3QKICAgbWF0dGVyKS4gSWYgeW91IGluY2x1ZGUgd2lsZGNhcmQgY2hhcmFjdGVycywgaG93ZXZlciwgYSBwYXR0ZXJuIG1hdGNoCiAgIGlzIHBlcmZvcm1lZDoKCiAgc2hvdyBtYWMgW2EtY10qeAoKICAgc2hvd3MgYWxsIG1hY3JvcyB3aG9zZSBuYW1lcyBzdGFydCB3aXRoIGEsIGIsIG9yIGMsIGFuZCBlbmQgd2l0aCB4LgoKICAgWyBbNDEzXVRvcCBdIFsgWzQxNF1Db250ZW50cyBdIFsgWzQxNV1DLUtlcm1pdCBIb21lIF0gWyBbNDE2XUtlcm1pdAogICBIb21lIF0KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICA4LjYuIEFycmF5cwoKICAgQSBjbGFyaWZpY2F0aW9uIHJlZ2FyZGluZyByZWZlcmVuY2VzIHRvIGFycmF5IG5hbWVzIChhcyBvcHBvc2VkIHRvCiAgIGFycmF5IGVsZW1lbnRzKTogWW91IGNhbiB1c2UgYXJyYXktbmFtZSAiYWJicmV2aWF0aW9ucyIgbGlrZSAmYSBvbmx5CiAgIGluIGNvbnRleHRzIHRoYXQgZXhwZWN0IGFycmF5IG5hbWVzLCBsaWtlIEFSUkFZIGNvbW1hbmRzIG9yIGFycmF5LW5hbWUKICAgZnVuY3Rpb24gYXJndW1lbnRzIHN1Y2ggYXMgdGhlIHNlY29uZCBhcmd1bWVudCBvZiBcZnNwbGl0KCkuIEluIGEKICAgTE9DQUwgc3RhdGVtZW50LCBob3dldmVyLCB5b3UgaGF2ZSB0byB3cml0ZSBcJmFbXSwgc2luY2UgImxvY2FsICZhIgogICBtaWdodCByZWZlciB0byBhIG1hY3JvIG5hbWVkICImYSIuCgogICBJbiBmdW5jdGlvbiBhcmd1bWVudHMsIGhvd2V2ZXIsIHlvdSBNVVNUIHVzZSB0aGUgYWJicmV2aWF0ZWQgZm9ybToKICAgXGZzcGxpdChcJWEsJmEpIG9yIFxmc3BsaXQoXCVhLCZhW10pLiBJZiB5b3UgaW5jbHVkZSB0aGUgYmFja3NsYXNoIChhcwogICBpbiAiXGZzcGxpdChcJWEsXCZhW10pIikgYSBwYXJzZSBlcnJvciBvY2N1cnMuCgogICBIZXJlIGFyZSB0aGUgbmV3IGFycmF5LXJlbGF0ZWQgY29tbWFuZHM6CgogICBJRiBERUNMQVJFRCBhcnJheW5hbWUKICAgICAgICAgIEFsbG93cyBhIHNjcmlwdCB0byB0ZXN0IHdoZXRoZXIgYW4gYXJyYXkgaGFzIGJlZW4gZGVjbGFyZWQuIFRoZQogICAgICAgICAgYXJyYXluYW1lIGNhbiBiZSBhIG5vbi1hcnJheSBiYWNrc2xhc2ggdmFyaWFibGUgc3VjaCBhcyBcJTEgb3IKICAgICAgICAgIFxtKG5hbWUpLCBpbiB3aGljaCBjYXNlIGl0IGlzIGV2YWx1YXRlZCBmaXJzdCwgYW5kIHRoZSByZXN1bHQKICAgICAgICAgIGlzIHRyZWF0ZWQgYXMgdGhlIGFycmF5IG5hbWUuIE90aGVyd2lzZSwgYXJyYXluYW1lIGlzIHRyZWF0ZWQKICAgICAgICAgIGFzIGluIHRoZSBBUlJBWSBjb21tYW5kczogaXQgY2FuIGJlIGEsICZhLCAmYVtdLCBcJmEsIFwmYVtdLAogICAgICAgICAgXCZhWzNdLCBcJmFbMzo5XSwgZXRjLCB3aXRoIHRoZSBhcHByb3ByaWF0ZSByZXN1bHRzIGluIGVhY2gKICAgICAgICAgIGNhc2UuIFN5bm9ueW06IElGIERDTC4KCiAgIFVOREVDTEFSRSBhcnJheW5hbWUKICAgICAgICAgIFVOREVDTEFSRSBpcyBhIG5ldyB0b3AtbGV2ZWwgY29tbWFuZCB0byB1bmRlY2xhcmUgYW4gYXJyYXkuCiAgICAgICAgICBQcmV2aW91c2x5IHRoaXMgY291bGQgb25seSBiZSBkb25lIHdpdGggImRlY2xhcmUgXCZhWzBdIiAoaS5lLgogICAgICAgICAgcmUtZGVjbGFyZSB0aGUgYXJyYXkgd2l0aCBhIGRpbWVuc2lvbiBvZiAwKS4KCiAgIEFSUkFZIExJTksgbGlua25hbWUgYXJyYXluYW1lCiAgICAgICAgICBDcmVhdGVzIGEgc3ltYm9saWMgbGluayBmcm9tIHRoZSBhcnJheSBuYW1lZCBieSBsaW5rbmFtZSAod2hpY2gKICAgICAgICAgIG11c3QgYmUgdGhlIG5hbWUgb2YgYW4gYXJyYXkgdGhhdCBpcyBub3QgeWV0IGRlY2xhcmVkIGluIHRoZQogICAgICAgICAgY3VycmVudCBjb250ZXh0KSB0byB0aGUgYXJyYXkgbmFtZWQgYnkgYXJyYXluYW1lICh3aGljaCBtdXN0CiAgICAgICAgICB0aGUgbmFtZSBvZiBhIGN1cnJlbnRseSBkZWNsYXJlZCBhcnJheSB0aGF0IGlzIG5vdCBpdHNlbGYgYQogICAgICAgICAgbGluaywgb3IgYSB2YXJpYWJsZSBjb250YWluaW5nIHRoZSBuYW1lIG9mIHN1Y2ggYW4gYXJyYXkpLiBUaGUKICAgICAgICAgIHR3byBuYW1lcyBpbmRpY2F0ZSB0aGUgc2FtZSBhcnJheTogaWYgeW91IGNoYW5nZSBhbiBhcnJheQogICAgICAgICAgZWxlbWVudCwgdGhlIGNoYW5nZSBpcyByZWZsZWN0ZWQgaW4gdGhlIGxpbmsgdG9vLCBhbmQgdmljZQogICAgICAgICAgdmVyc2EuIElmIHlvdSB1bmRlY2xhcmUgdGhlIGxpbmssIHRoZSByZWFsIGFycmF5IGlzIHVuYWZmZWN0ZWQuCiAgICAgICAgICBJZiB5b3UgdW5kZWNsYXJlIHRoZSByZWFsIGFycmF5LCBhbGwgbGlua3MgdG8gaXQgZGlzYXBwZWFyLiBJZgogICAgICAgICAgeW91IHJlc2l6ZSBhbiBhcnJheSAoZGlyZWN0bHkgb3IgdGhyb3VnaCBhIGxpbmspLCBhbGwgbGlua3MgdG8KICAgICAgICAgIGl0IGFyZSB1cGRhdGVkIGF1dG9tYXRpY2FsbHkuCgogICBBcnJheSBsaW5rcyBsZXQgeW91IHBhc3MgYXJyYXkgbmFtZXMgYXMgYXJndW1lbnRzIHRvIG1hY3Jvcy4gRm9yCiAgIGV4YW1wbGUsIHN1cHBvc2UgeW91IGhhZCBhIHByb2dyYW0gdGhhdCBuZWVkZWQgdG8gdXBwZXJjYXNlIGFsbCB0aGUKICAgZWxlbWVudHMgb2YgZGlmZmVyZW50IGFycmF5cyBhdCBkaWZmZXJlbnQgdGltZXMuIFlvdSBjb3VsZCB3cml0ZSBhCiAgIG1hY3JvIHRvIGRvIHRoaXMsIHdpdGggdGhlIGFycmF5IG5hbWUgYXMgYW4gYXJndW1lbnQuIEJ1dCB3aXRob3V0CiAgIGFycmF5IGxpbmtzLCB0aGVyZSB3b3VsZCBiZSBubyB3YXkgdG8gcmVmZXIgdG8gdGhlIGFyZ3VtZW50IGFycmF5CiAgIHdpdGhpbiB0aGUgbWFjcm8uIEFycmF5IGxpbmtzIG1ha2UgaXQgZWFzeToKCiAgZGVmaW5lIGFycmF5dXBwZXIgewogICAgICBsb2NhbCBcJmVbXSBcJWkKICAgICAgYXJyYXkgbGluayBcJmVbXSBcJTEKICAgICAgZm9yIGkgMSBcZmRpbSgmZSkgMSB7IC5cJmVbaV0gOj0gXGZ1cHBlcihcJmVbaV0pIH0KICB9CiAgZGVjbGFyZSBcJmFbXSA9IHRoZXNlIGFyZSBzb21lIHdvcmRzCiAgYXJyYXl1cHBlciAmYQogIHNob3cgYXJyYXkgJmEKCiAgIFRoZSBtYWNybyBkZWNsYXJlcyB0aGUgYXJyYXkgbGluayBMT0NBTCwgd2hpY2ggbWVhbnMgaXQgZG9lc24ndAogICBjb25mbGljdCB3aXRoIGFueSBhcnJheSBvZiB0aGUgc2FtZSBuYW1lIHRoYXQgbWlnaHQgZXhpc3Qgb3V0c2lkZSB0aGUKICAgbWFjcm8sIGFuZCB0aGF0IHRoZSBsaW5rIGlzIGRlc3Ryb3llZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIG1hY3JvCiAgIGV4aXRzLiBUaGlzIHdvcmtzLCBieSB0aGUgd2F5LCBldmVuIGlmIHRoZSBsaW5rIG5hbWUgYW5kIHRoZSBtYWNybwogICBhcmd1bWVudCBuYW1lIGFyZSB0aGUgc2FtZSwgYXMgbG9uZyBhcyB0aGUgbGluayBpcyBkZWNsYXJlZCBMT0NBTC4KCiAgIEFzIG5vdGVkLCB5b3UgY2FuJ3QgbWFrZSBhIGxpbmsgdG8gYSBub25leGlzdGVudCBhcnJheS4gU28gd2hlbgogICB3cml0aW5nIGEgbWFjcm8gd2hvc2Ugam9iIGlzIHRvIGNyZWF0ZSBhbiBhcnJheSB3aG9zZSBuYW1lIGlzIHBhc3NlZAogICBhcyBhbiBhcmd1bWVudCwgeW91IG11c3QgZGVjbGFyZSB0aGUgYXJyYXkgZmlyc3QgKHRoZSBzaXplIGRvZXNuJ3QKICAgbWF0dGVyIGFzIGxvbmcgYXMgaXQncyBncmVhdGVyIHRoYW4gMCkuIEV4YW1wbGU6CgogIGRlZmluZSB0cnltZSB7ICAgICAgICAgICAgICAgIDsgRGVtb25zdHJhdGlvbiBtYWNybwogICAgICBsb2NhbCBcJmVbXSAgICAgICAgICAgICAgIDsgV2Ugb25seSBuZWVkIHRoaXMgaW5zaWRlIHRoZSBtYWNybwogICAgICBhcnJheSBsaW5rIFwmZVtdIFwlMSAgICAgIDsgTWFrZSBsb2NhbCBsaW5rCiAgICAgIHNoaWZ0ICAgICAgICAgICAgICAgICAgICAgOyBTaGlmdCBhcmd1bWVudCBsaXN0CiAgICAgIHZvaWQgXGZzcGxpdChcJSosJmUpICAgICAgOyBTcGxpdCByZW1haW5kZXIgb2YgYXJnIGxpc3QgaW50byBhcnJheQogIH0KICBkZWNsYXJlIFwmYVsxXSAgICAgICAgICAgICAgICA7IERlY2xhcmUgdGFyZ2V0IGFycmF5IGluIGFkdmFuY2UKICB0cnltZSAmYSBoZXJlIGFyZSBzb21lIHdvcmRzICA7IEludm9rZSB0aGUgbWFjcm8gd2l0aCBhcnJheSBuYW1lIGFuZCB3b3JkcwogIHNob3cgYXJyYXkgYSAgICAgICAgICAgICAgICAgIDsgU2VlIHRoZSByZXN1bHRzCgogICBPbmUgZmluYWwgaW1wcm92ZW1lbnQgYWxsb3dzIHRoZSBtYWNybyBpdHNlbGYgdG8gZGVjbGFyZSB0aGUgYXJyYXkKICAgKHRoaXMgd2FzIG5vdCBwb3NzaWJsZSBpbiBlYXJsaWVyIEtlcm1pdCByZWxlYXNlcyk6IGlmIHRoZSBhcnJheSBuYW1lCiAgIGluIHRoZSBERUNMQVJFIGNvbW1hbmQgaXMgYSB2YXJpYWJsZSAoYW5kIG5vdCBhbiBhcnJheSBuYW1lKSwgb3IKICAgaW5jbHVkZXMgdmFyaWFibGVzLCB0aGUgcmVzdWx0aW5nIHZhbHVlIGlzIHVzZWQgYXMgdGhlIGFycmF5IG5hbWUuIFNvOgoKICBkZWZpbmUgdHJ5bWUgeyAgICAgICAgICAgICAgICA7IERlbW9uc3RyYXRpb24gbWFjcm8KICAgICAgZGVjbGFyZSBcJTFbMV0gICAgICAgICAgICA7IFByZWxpbWluYXJ5IGRlY2xhcmF0aW9uIGZvciB0YXJnZXQgYXJyYXkKICAgICAgbG9jYWwgXCZlW10gICAgICAgICAgICAgICA7IFdlIG9ubHkgbmVlZCB0aGlzIGluc2lkZSB0aGUgbWFjcm8KICAgICAgYXJyYXkgbGluayBcJmVbXSBcJTEgICAgICA7IE1ha2UgbG9jYWwgbGluawogICAgICBzaGlmdCAgICAgICAgICAgICAgICAgICAgIDsgU2hpZnQgYXJndW1lbnQgbGlzdAogICAgICB2b2lkIFxmc3BsaXQoXCUqLCZlKSAgICAgIDsgU3BsaXQgcmVtYWluZGVyIG9mIGFyZyBsaXN0IGludG8gYXJyYXkKICB9CiAgdHJ5bWUgJmEgaGVyZSBhcmUgc29tZSB3b3JkcyAgOyBJbnZva2UgdGhlIG1hY3JvIHdpdGggYXJyYXkgbmFtZSBhbmQgd29yZHMKICBzaG93IGFycmF5IGEgICAgICAgICAgICAgICAgICA7IFNlZSB0aGUgcmVzdWx0cwoKICAgVGhlIFNIT1cgQVJSQVkgY29tbWFuZCBub3cgaW5kaWNhdGVzIHdoZXRoZXIgYW4gYXJyYXkgbmFtZSBpcyBhIGxpbmsuCgogICBBbHNvIHNlZSB0aGUgZGVzY3JpcHRpb25zIG9mIFs0MTddXGZqb2luKCkgYW5kIFs0MThdXGZzcGxpdCgpLCBwbHVzCiAgIFs0MTldU2VjdGlvbiA4LjEwIG9uIHRoZSBNSU5QVVQgY29tbWFuZCwgd2hpY2ggc2hvd3MgaG93IGFuIGVudGlyZQogICBhcnJheSAob3Igc2VnbWVudCBvZiBpdCkgY2FuIGJlIHVzZWQgYXMgdGhlIE1JTlBVVCB0YXJnZXQgbGlzdC4KCiAgIFsgWzQyMF1Ub3AgXSBbIFs0MjFdQ29udGVudHMgXSBbIFs0MjJdQy1LZXJtaXQgSG9tZSBdIFsgWzQyM11LZXJtaXQKICAgSG9tZSBdCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgOC43LiBOZXcgb3IgSW1wcm92ZWQgQnVpbHQtaW4gVmFyaWFibGVzIGFuZCBGdW5jdGlvbnMKCiAgIFRoZSBmb2xsb3dpbmcgbmV3IGJ1aWx0LWluIHZhcmlhYmxlcyBhcmUgYXZhaWxhYmxlOgoKICBcdihidWlsZGlkKSAgICAgICBBIGRhdGUgc3RyaW5nIGxpa2UgIjIwMDAwODA4IiBpbmRpY2F0aW5nIHdoZW4gQy1LZXJtaXQgd2FzCmJ1aWx0LgogIFx2KGZ0aW1lKSAgICAgICAgIEN1cnJlbnQgdGltZSwgc2VjcyBzaW5jZSBtaWRuaWdodCwgaW5jbHVkaW5nIGZyYWN0aW9uIG9mIHNlCmNvbmQuCiAgXHYoaXByb21wdCkgICAgICAgVGhlIGN1cnJlbnQgU0VUIFBST01QVCB2YWx1ZQogIFx2KHNleHApICAgICAgICAgIFRoZSBtb3N0IHJlY2VudCBTLUV4cHJlc3Npb24gKHNlZSBbNDI0XVNlY3Rpb24gOSkKICBcdihzZGVwdGgpICAgICAgICBUaGUgY3VycmVudCBTLUV4cHJlc3Npb24gaW52b2NhdGlvbiBkZXB0aCAoWzQyNV1TZWN0aW9uIDkpCiAgXHYoc3ZhbHVlKSAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSBtb3N0IHJlY2VudCBTLUV4cHJlc3Npb24gKFs0MjZdU2VjdGlvbiA5KQoKICBcdihmdHBfY29kZSkgICAgICBNb3N0IHJlY2VudCBGVFAgcmVzcG9uc2UgY29kZSAoWzQyN11TZWN0aW9uIDMpCiAgXHYoZnRwX2Nvbm5lY3RlZCkgRlRQIGNvbm5lY3Rpb24gc3RhdHVzIChbNDI4XVNlY3Rpb24gMykKICBcdihmdHBfY3BsKSAgICAgICBGVFAgQ29tbWFuZCBQcm90ZWN0aW9uIExldmVsIChbNDI5XVNlY3Rpb24gMy4yKQogIFx2KGZ0cF9kcGwpICAgICAgIEZUUCBEYXRhIFByb3RlY3Rpb24gTGV2ZWwgKFs0MzBdU2VjdGlvbiAzLjIpCiAgXHYoZnRwX2dldHB1dHJlbW90ZSkgVGhlIGN1cnJlbnQgU0VUIEdFVC1QVVQtUkVNT1RFIHNldHRpbmcgKFs0MzFdU2VjdGlvbiAzLjgKKQogIFx2KGZ0cF9ob3N0KSAgICAgIE5hbWUgb3IgSVAgYWRkcmVzcyBvZiBGVFAgc2VydmVyIChbNDMyXVNlY3Rpb24gMykKICBcdihmdHBfbG9nZ2VkaW4pICBGVFAgbG9naW4gc3RhdHVzIChbNDMzXVNlY3Rpb24gMykKICBcdihmdHBfbWVzc2FnZSkgICBNb3N0IHJlY2VudCBGVFAgcmVzcG9uc2UgbWVzc2FnZSAoWzQzNF1TZWN0aW9uIDMpCiAgXHYoZnRwX3NlY3VyaXR5KSAgRlRQIFNlY3VyaXR5IG1ldGhvZCAoWzQzNV1TZWN0aW9uIDMuMikKICBcdihmdHBfc2VydmVyKSAgICBPUyB0eXBlIG9mIEZUUCBzZXJ2ZXIgKFs0MzZdU2VjdGlvbiAzKQoKICBcdihodHRwX2NvZGUpICAgICAgIE1vc3QgcmVjZW50IEhUVFAgcmVzcG9uc2UgY29kZQogIFx2KGh0dHBfY29ubmVjdGVkKSAgSFRUUCBjb25uZWN0aW9uIHN0YXR1cwogIFx2KGh0dHBfaG9zdCkgICAgICAgTmFtZSBvciBJUCBhZGRyZXNzIG9mIEhUVFAgc2VydmVyCiAgXHYoaHR0cF9tZXNzYWdlKSAgICBNb3N0IHJlY2VudCBIVFRQIHJlc3BvbnNlIG1lc3NhZ2UKICBcdihodHRwX3NlY3VyaXR5KSAgIFRMUyBjaXBoZXIgdXNlZCB0byBzZWN1cmUgdGhlIEhUVFAgc2Vzc2lvbgoKICBcdihob3VyKSAgICAgICAgICAgIEhvdXIgb2YgdGhlIGRheSwgMCB0byAyMy4KICBcdih0aW1lc3RhbXApICAgICAgIEVxdWl2YWxlbnQgdG8gIlx2KG5kYXRlKSBcdih0aW1lKSIuCgogIFx2KGxvZ19kZWJ1ZykgICAgICAgQ3VycmVudCBkZWJ1ZyBsb2cgZmlsZSwgaWYgYW55LgogIFx2KGxvZ19wYWNrZXQpICAgICAgQ3VycmVudCBwYWNrZXQgbG9nIGZpbGUsIGlmIGFueS4KICBcdihsb2dfc2Vzc2lvbikgICAgIEN1cnJlbnQgc2Vzc2lvbiBsb2cgZmlsZSwgaWYgYW55LgogIFx2KGxvZ190cmFuc2FjdGlvbikgQ3VycmVudCB0cmFuc2FjdGlvbiBsb2cgZmlsZSwgaWYgYW55LgogIFx2KGxvZ19jb25uZWN0aW9uKSAgQ3VycmVudCBjb25uZWN0aW9uIGxvZyBmaWxlLCBpZiBhbnkuCgogICBUaGUgZm9sbG93aW5nIG5ldyBvciBpbXByb3ZlZCBidWlsdC1pbiBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZToKCiAgXGZjbWRzdGFjaygpICAgICAgICAgICAgQWxsb3dzIHByb2dyYW1tYXRpYyBhY2Nlc3MgdG8gdGhlIGNvbW1hbmQgc3RhY2suCiAgXGZjdnRkYXRlKCkgICAgICAgICAgICAgWzQzN11TZWN0aW9uIDguMTMsIGZvcm1hdCBvcHRpb25zIGFkZGVkCiAgXGZkZWx0YTJzZWNzKCkgICAgICAgICAgWzQzOF1TZWN0aW9uIDguMTMKICBcZmRvc3RvdW5peHBhdGgoczEpICAgICBDb252ZXJ0cyBhIERPUyBmaWxlbmFtZSB0byBVbml4IGZvcm1hdC4KICBcZnNwbGl0KCkgICAgICAgICAgICAgICBOb3cgYWxsb3dzIGdyb3VwaW5nL25lc3RpbmcgaW4gc291cmNlIHN0cmluZy4KICBcZndvcmQoKSAgICAgICAgICAgICAgICBBbGxvd3MgdGhlIHNhbWUgZ3JvdXBpbmcgYW5kIG5lc3RpbmcuCiAgXGZqb2luKCZhLHMxLG4xLG4yKSAgICAgQ29waWVzIGFuIGFycmF5IGludG8gYSBzaW5nbGUgc3RyaW5nLgogIFxmc3Vic3RpdHV0ZShzMSxzMixzMykgIFN1YnN0aXR1dGVzIGNoYXJhY3RlcnMgd2l0aGluIGEgc3RyaW5nLgogIFxmcmVwbGFjZSgpICAgICAgICAgICAgIEhhcyBuZXcgNHRoICJvY2N1cnJlbmNlIiBhcmd1bWVudC4KICBcZnNleHByZXNzaW9uKCkgICAgICAgICBFdmFsdWF0ZXMgYW4gUy1FeHByZXNzaW9uIChleHBsYWluZWQgaW4gWzQzOV1TZWN0aW9uCjkpLgogIFxmdHJpbSgpLCBcZmx0cmltKCkgICAgIE5vdyB0cmltIENSIGFuZCBMRiBieSBkZWZhdWx0LCBhcyB3ZWxsIGFzIFNQIGFuZCBUYWIuCiAgXGZ1bml4dG9kb3NwYXRoKHMxKSAgICAgQ29udmVydHMgYSBVbml4IGZpbGVuYW1lIHRvIERPUyBmb3JtYXQuCiAgXGZrZXl3b3JkdmFsKHMxLGMxKSAgICAgQXNzaWducyB2YWx1ZXMgdG8ga2V5d29yZHMgKG1hY3JvcykgKGV4cGxhaW5lZCBiZWxvdykKLgoKICAgTW9zdCBmdW5jdGlvbnMgdGhhdCBoYXZlICIyIiBpbiB0aGVpciBuYW1lcyB0byBzdGFuZCBmb3IgdGhlIHdvcmQgInRvIgogICBjYW4gbm93IGFsc28gYmUgd3JpdHRlbiB3aXRoICJ0byIsIGUuZy4gIlxmZGVsdGEyc2VjcygpLCIKICAgXGZkZWx0YXRvc2VjcygpLiIKCiAgIFxmdW50YWJpZnkoc3RyaW5nKQogICAgICAgICAgKE5ldyB0byA4LjAuMjExKSBSZXBsYWNlcyBIb3Jpem9udGFsIFRhYiBjaGFyYWN0ZXJzIGluIHRoZQogICAgICAgICAgZ2l2ZW4gc3RyaW5nIHdpdGggc3BhY2VzIGJhc2VkIG9uIFZUMTAwLWxpa2UgdGFiIHN0b3BzLgoKICAgXGZ2ZXJpZnkoczEsczIsbikKICAgICAgICAgIEFzIG9mIHZlcnNpb24gOC4wLjIxMSwgcmV0dXJucyAtMSBpZiBzMiBpcyBhbiBlbXB0eSBzdHJpbmcuCiAgICAgICAgICBQcmV2aW91c2x5IGl0IHJldHVybmVkIDAsIG1ha2luZyBcZnZlcmlmeShhYmMsXCVhKSBsb29rIGFzIGlmCiAgICAgICAgICBcJWEgd2FzIGEgc3RyaW5nIGNvbWJvc2VkIG9mIGEncywgYidzLCBhbmQvb3IgYydzIHdoZW4gaW4gZmFjdAogICAgICAgICAgaXQgY29udGFpbmVkIG5vdGhpbmcuCgogICBcZmNvZGUoc3RyaW5nKQogICAgICAgICAgQXMgb2YgdmVyc2lvbiA4LjAuMjExLCByZXR1cm5zIDAgaWYgc3RyaW5nIGlzIGVtcHR5IG9yIG1pc3NpbmcuCiAgICAgICAgICBQcmV2aW91c2x5IGl0IHJldHVybmVkIHRoZSBlbXB0eSBzdHJpbmcsIHdoaWNoIG1hZGUgaXQgdW5zYWZlCiAgICAgICAgICB0byB1c2UgaW4gYXJpdGhtZXRpYyBvciBib29sZWFuIGV4cHJlc3Npb25zLgoKICAgXHYoaW5zY2FsZSkKICAgICAgICAgIE5ldyB0byB2ZXJzaW9uIDguMC4yMTEsIGl0cyB2YWx1ZSBpcyB0aGUgSU5QVVQgU0NBTEUtRkFDVE9SCiAgICAgICAgICAoWzQ0MF1TZWN0aW9uIDguMTApLCBkZWZhdWx0IDEuMC4KCiAgOC43LjEuIFRoZSBcZmtleXdvcmR2YWwoKSBGdW5jdGlvbgoKICAgXGZrZXl3b3JkdmFsKHMxLGMxKSBpcyBuZXcgdG8gQy1LZXJtaXQgOC4wLiBHaXZlbiBhIHN0cmluZyBzMSBvZiB0aGUKICAgZm9ybSAibmFtZT12YWx1ZSIsIGl0IGNyZWF0ZXMgYSBtYWNybyB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCBhc3NpZ25zCiAgIGl0IHRoZSBnaXZlbiB2YWx1ZS4gSWYgbm8gdmFsdWUgYXBwZWFycyBhZnRlciB0aGUgZXF1YWwgc2lnbiwgYW55CiAgIGV4aXN0aW5nIG1hY3JvIG9mIHRoZSBnaXZlbiBuYW1lIGlzIHVuZGVmaW5lZC4gQmxhbmtzIGFyZQogICBhdXRvbWF0aWNhbGx5IHRyaW1tZWQgZnJvbSBhcm91bmQgdGhlIG5hbWUgYW5kIHZhbHVlLiBUaGUgb3B0aW9uYWwgYzEKICAgcGFyYW1ldGVyIGlzIHRoZSBhc3NpZ25tZW50IG9wZXJhdG9yIGNoYXJhY3RlciwgZXF1YWwgc2lnbiAoPSkgYnkKICAgZGVmYXVsdC4gVGhpcyBmdW5jdGlvbiBpcyBoYW5keSBmb3IgcHJvY2Vzc2luZyBrZXl3b3JkIHBhcmFtZXRlcnMgb3IKICAgYW55IG90aGVyIGZvcm0gb2YgcGFyYW1ldGVyLXZhbHVlIHBhaXIuIFN1cHBvc2UsIGZvciBleGFtcGxlLCB5b3Ugd2FudAogICB0byB3cml0ZSBhIG1hY3JvIHRoYXQgYWNjZXB0cyBrZXl3b3JkIHBhcmFtZXRlcnMgcmF0aGVyIHRoYW4KICAgcG9zaXRpb25hbCBvbmVzOgoKICBkZWZpbmUgTVlESUFMIHsKICAgICAgbG9jYWwgXCVpIG1vZGVtIGhhbmd1cCBtZXRob2QgZGV2aWNlIHNwZWVkIG51bWJlcgogICAgICBkZWYgbnVtYmVyIDU1NTEyMzQgICAgICAgICAgOyBBc3NpZ24gZGVmYXVsdCBwYXJhbWV0ZXIgdmFsdWVzCiAgICAgIGRlZiBzcGVlZCA1NzYwMAogICAgICBkZWYgbW9kZW0gdXNyb2JvdGljcwogICAgICBkZWYgaGFuZ3VwIHJzMjMyCiAgICAgIGRlZiBtZXRob2QgdG9uZQogICAgICBkZWYgY291bnRyeSAxCiAgICAgIGZvciBcJWkgMSBcdihhcmdjKS0xIDEgeyAgICA7IFBhcnNlIGFueSBrZXl3b3JkIHBhcmFtZXRlcnMuLi4KICAgICAgICAgIGlmIG5vdCBcZmtleXdvcmR2YWwoXCZfW1wlaV0pIGVuZCAxIEJhZCBwYXJhbWV0ZXI6ICJcJl9bXCVpXSIKICAgICAgfQogICAgICBzZXQgZGlhbCBjb3VudHJ5IFxtKGNvdW50cnkpCiAgICAgIHNldCBtb2RlbSB0eXBlIFxtKG1vZGVtKQogICAgICBzZXQgbW9kZW0gaGFuZyBcbShoYW5ndXApCiAgICAgIHNldCBkaWFsIG1ldGhvZCBcbSh0b25lKQogICAgICBzZXQgbGluZSBcbShkZXZpY2UpCiAgICAgIGlmIGZhaWwgc3RvcCAxCiAgICAgIHNldCBzcGVlZCBcbShzcGVlZCkKICAgICAgaWYgZmFpbCBzdG9wIDEKICAgICAgc2hvdyBjb21tCiAgICAgIHNldCBkaWFsIGRpc3BsYXkgb24KICAgICAgZGlhbCBcbShudW1iZXIpCiAgICAgIGlmIHN1Y2Nlc3MgY29ubmVjdAogIH0KCiAgIEluIHRoaXMgZXhhbXBsZSwgYWxsIHRoZSBkZWZhdWx0cyBhcmUgc2V0IHVwIGluc2lkZSB0aGUgbWFjcm8sIGFuZAogICB0aGVyZWZvcmUgaXQgY2FuIGJlIGludm9rZWQgd2l0aCBubyBwYXJhbWV0ZXJzIGF0IGFsbC4gQnV0IGlmIHlvdSB3YW50CiAgIHRvIGhhdmUgdGhlIG1hY3JvIGRpYWwgYSBkaWZmZXJlbnQgbnVtYmVyLCB5b3UgY2FuIHN1cHBseSBpdCBhcwogICBmb2xsb3dzOgoKICBteWRpYWwgbnVtYmVyPTc2NTQzMjEKCiAgIFlvdSBjYW4gc3VwcGx5IGFueSBudW1iZXIgb2Yga2V5d29yZCBwYXJhbWV0ZXJzLCBhbmQgeW91IGNhbiBnaXZlIHRoZW0KICAgaW4gYW55IG9yZGVyOgoKICBteWRpYWwgbnVtYmVyPTc2NTQzMjEgaGFuZ3VwPW1vZGVtIHNwZWVkPTExNTIwMAoKICA4LjcuMi4gVGhlIFxmc3BsaXQoKSwgXGZqb2luKCksIGFuZCBcZndvcmQoKSBGdW5jdGlvbnMKCiAgIFxmam9pbigmYSxzMSxuMSxuMikgaXMgYWxzbyBuZXc7IGl0IGNyZWF0ZXMgYSBzdHJpbmcgZnJvbSBhbiBhcnJheSAob3IKICAgYSBwaWVjZSBvZiBvbmUpLiAmYSBpcyB0aGUgbmFtZSBvZiB0aGUgYXJyYXkgKGEgcmFuZ2Ugc3BlY2lmaWVyIGNhbiBiZQogICBpbmNsdWRlZCk7IHMxIGlzIGEgY2hhcmFjdGVyIG9yIHN0cmluZyB0byBzZXBhcmF0ZSBlYWNoIGVsZW1lbnQgaW4gdGhlCiAgIHJlc3VsdCBzdHJpbmcgKGNhbiBiZSBvbWl0dGVkLCBpbiB3aGljaCBjYXNlIHRoZSBlbGVtZW50cyBhcmUgbm90CiAgIHNlcGFyYXRlZCBhdCBhbGwpLCBhbmQgbjEgaXMgYSBncm91cGluZyBtYXNrLCBleHBsYWluZWQgYmVsb3cuIElmIHMxCiAgIGlzIGVtcHR5IG9yIG5vdCBzcGVjaWZpZWQsIHRoZSBhcnJheSBlbGVtZW50cyBhcmUgc2VwYXJhdGVkIHdpdGgKICAgc3BhY2VzLiBJZiB5b3Ugd2FudCB0aGUgZWxlbWVudHMgY29uY2F0ZW5hdGVkIHdpdGggbm8gc2VwYXJhdG9yLAogICBpbmNsdWRlIGEgbm9uemVybyBuMiBhcmd1bWVudC4gR2l2ZW4gdGhlIGFycmF5OgoKICBkZWNsYXJlIFwmYVtdID0gMCAxIDIgMyA0IDUgNiA3IDggOQoKICAgeW91IGNhbiBnZXQgZWZmZWN0cyBsaWtlIHRoaXM6CgogIFxmam9pbigmYSkgICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5CiAgXGZqb2luKCZhLDopICAgIDA6MToyOjM6NDo1OjY6Nzo4OjkKICBcZmpvaW4oJmEseyx9KSAgMCwxLDIsMyw0LDUsNiw3LDgsOQogIFxmam9pbigmYSwuLi4pICAwLi4uMS4uLjIuLi4zLi4uNC4uLjUuLi42Li4uNy4uLjguLi45CiAgXGZqb2luKCZhLCwsMSkgIDAxMjM0NTY3ODkKCiAgIFxmc3BsaXQoKSwgXGZ3b3JkKCksIFxmc3RyaXBiKCksIGFuZCBcZmpvaW4oKSBhY2NlcHQgYSAiZ3JvdXBpbmcgbWFzayIKICAgYXJndW1lbnQsIG4xLCB3aGljaCBpcyBhIG51bWJlciBmcm9tIDAgdG8gNjMsIGluIHdoaWNoOgoKICAgMSA9ICIiIGRvdWJsZXF1b3RlcwogICAyID0ge30gYnJhY2VzCiAgIDQgPSAnJyBzaW5nbGVxdW90ZXMKICAgOCA9ICgpIHBhcmVudGhlc2VzCiAgMTYgPSBbXSBzcXVhcmUgYnJhY2tldHMKICAzMiA9IDw+IGFuZ2xlIGJyYWNrZXRzCgogICBUaGVzZSBjYW4gYmUgT1InZCAoYWRkZWQpIHRvZ2V0aGVyIHRvIG1ha2UgYW55IG51bWJlciAwLTYzICgtMSBpcwogICB0cmVhdGVkIHRoZSBzYW1lIGFzIDYzLCAwIG1lYW5zIG5vIGdyb3VwaW5nKS4gSWYgYSBiaXQgaXMgb24sIHRoZQogICBjb3JyZXNwb25kaW5nIGtpbmQgb2YgZ3JvdXBpbmcgaXMgc2VsZWN0ZWQuIChJZiBtb3JlIHRoYW4gMSBiaXQgaXMgc2V0CiAgIGZvciBcZmpvaW4oKSwgb25seSB0aGUgbG93ZXN0LW9yZGVyIG9uZSBpcyB1c2VkLikKCiAgIElmIHlvdSBpbmNsdWRlIHRoZSBzYW1lIGNoYXJhY3RlciBpbiB0aGUgZ3JvdXBpbmcgbWFzayBhbmQgdGhlIGluY2x1ZGUKICAgbGlzdCwgdGhlIGdyb3VwaW5nIG1hc2sgdGFrZXMgcHJlY2VkZW5jZS4gRXhhbXBsZToKCiAgZGVmIFwlYSAgYSAiYiBjIGQiIGUKICBcZnNwbGl0KFwlYSwmYVtdLCwsLTEpICA9IDMgIDwtLSBkb3VibGVxdW90ZSB1c2VkIGZvciBncm91cGluZwogIFxmc3BsaXQoXCVhLCZhW10sLCIsLTEpID0gMyAgPC0tIGRvdWJsZXF1b3RlIHN0aWxsIHVzZWQgZm9yIGdyb3VwaW5nCgogICBOZXN0aW5nIG9mIG1hdGNoZWQgbGVmdCBhbmQgcmlnaHQgZ3JvdXBpbmcgY2hhcmFjdGVycyAocGFyZW50aGVzZXMsCiAgIGJyYWNlcywgYW5kIGJyYWNrZXRzLCBidXQgbm90IHF1b3RlcykgaXMgcmVjb2duaXplZC4gRXhhbXBsZToKCiAgZGVmIFwlYSBhIChiIGMgPGQgZSBbZiBnIHtoIGl9IGoga10gbCBtPiBuIG8pIHAKICBcZnNwbGl0KFwlYSwmYSwsLDApICA9IDE2IChubyBncm91cGluZykKICBcZnNwbGl0KFwlYSwmYSwsLDIpICA9IDE1IChicmFjZXMgb25seSkKICBcZnNwbGl0KFwlYSwmYSwsLDE2KSA9IDExIChzcXVhcmUgYnJhY2tldHMgb25seSkKICBcZnNwbGl0KFwlYSwmYSwsLDMyKSA9ICA3IChhbmdsZSBicmFja2V0cyBvbmx5KQogIFxmc3BsaXQoXCVhLCZhLCwsNjMpID0gIDMgKGFsbCkKICBcZnNwbGl0KFwlYSwmYSwsLC0xKSA9ICAzIChhbGwpCgogICBcZnNwbGl0KCkgYW5kIFxmam9pbigpIGFyZSAicmVjaXByb2NhbCIgZnVuY3Rpb25zLiBZb3UgY2FuIHNwbGl0IGEKICAgc3RyaW5nIHVwIGludG8gYW4gYXJyYXkgYW5kIGpvaW4gaXQgYmFjayBpbnRvIGEgbmV3IHN0cmluZyB0aGF0IGlzCiAgIGVxdWl2YWxlbnQsIGFzIGxvbmcgYXMgXGZzcGxpdCgpIGFuZCBcZmpvaW4oKSBhcmUgZ2l2ZW4gZXF1aXZhbGVudAogICBncm91cGluZyBtYXNrcywgZXhjZXB0IHRoYXQgdGhlIHR5cGUgb2YgYnJhY2VzIG1pZ2h0IGNoYW5nZS4gRXhhbXBsZToKCiAgZGVmIFwlYSBhIHtiIGMgW2QgZV0gZiBnfSAiaCBpIiBqIDxrIGw+IG0KICBlY2hvIFNUUklORz1bXCVhXQogIGVjaG8gV09SRFM9XGZzcGxpdChcJWEsJmEsLCwtMSkKICBzaG93IGFycmF5IGEKICBhc2cgXCViIFxmam9pbigmYSx7IH0sMikKICBlY2hvIEpPSU4gID1bXCViXQogIGVjaG8gV09SRFM9XGZzcGxpdChcJWIsJmIsLCwtMSkKICBzaG93IGFycmF5IGIKCiAgIFRoZSBhcnJheXMgYSBhbmQgYiBhcmUgaWRlbnRpY2FsLiBUaGUgc3RyaW5ncyBhIGFuZCBiIGFyZSBhcyBmb2xsb3dzOgoKICBcJWE6IGEge2IgYyBbZCBlXSBmIGd9ICJoIGkiIGogPGsgbD4gbQogIFwlYjogYSB7YiBjIFtkIGVdIGYgZ30ge2ggaX0gaiB7ayBsfSBtCgogICBJdCBpcyBwb3NzaWJsZSB0byBxdW90ZSBzZXBhcmF0b3IgZ3JvdXBpbmcgY2hhcmFjdGVycyB3aXRoIGJhY2tzbGFzaAogICB0byBvdmVycmlkZSB0aGVpciBncm91cGluZyBmdW5jdGlvbi4gQW5kIG9mIGNvdXJzZSB0byBpbmNsdWRlCiAgIGJhY2tzbGFzaCBpdHNlbGYgaW4gdGhlIHN0cmluZywgaXQgbXVzdCBiZSBxdW90ZWQgdG9vLiBGdXJ0aGVybW9yZSwKICAgZWFjaCBiYWNrc2xhc2ggbXVzdCBiZSBkb3VibGVkLCBzbyB0aGUgY29tbWFuZCBwYXJzZXIgd2lsbCBzdGlsbCBwYXNzCiAgIG9uZSBiYWNrc2xhc2ggdG8gXGZzcGxpdCgpIGZvciBlYWNoIHR3byB0aGF0IGl0IHNlZXMuIEhlcmUgYXJlIHNvbWUKICAgZXhhbXBsZXMgdXNpbmcgXGZzcGxpdCgpIHdpdGggYSBncm91cGluZyBtYXNrIG9mIDggKHRyZWF0IHBhcmVudGhlc2VzCiAgIGFzIGdyb3VwaW5nIGNoYXJhY3RlcnMpLgoKICBTdHJpbmcgICAgICAgICAgICAgICAgICBSZXN1bHQKICAgIGEgYiBjIGQgZSBmICAgICAgICAgICAgIDYKICAgIGEgYlxcIGMgZCBlIGYgICAgICAgICAgIDUKICAgIGEgYiAoYyBkIGUpIGYgICAgICAgICAgIDQKICAgIGEgYiBcXChjIGQgZVxcKSBmICAgICAgIDYKICAgIGEgYiBcXFxcKGMgZCBlXFxcXCkgZiAgIDcKCiAgIFxmc3BsaXQoKSBoYXMgYWxzbyBiZWVuIGNoYW5nZWQgdG8gY3JlYXRlIGl0cyBhcnJheSAoaWYgb25lIGlzIGdpdmVuKQogICBlYWNoIHRpbWUgaXQgaXMgY2FsbGVkLCBzbyBub3cgaXQgY2FuIGJlIGNvbnZlbmllbnRseSBjYWxsZWQgaW4gYSBsb29wCiAgIHdpdGhvdXQgaGF2aW5nIHRvIHJlZGVjbGFyZSB0aGUgYXJyYXkgZWFjaCB0aW1lLgoKICAgSW5jaWRlbnRhbGx5Li4uIFNvbWV0aW1lcyB5b3UgbWlnaHQgd2FudCB0byBpbnZva2UgXGZzcGxpdCgpIGluIGEKICAgc2l0dWF0aW9uIHdoZXJlIHlvdSBkb24ndCBjYXJlIGFib3V0IGl0cyByZXR1cm4gdmFsdWUsIGUuZy4gd2hlbiB5b3UKICAganVzdCB3YW50IHRvIGZpbGwgdGhlIGFycmF5LiBOb3cgeW91IGNhbiAiY2FsbCIgXGZzcGxpdCgpIG9yIGFueSBvdGhlcgogICBmdW5jdGlvbiB3aXRoIHRoZSBuZXcgWzQ0MV1WT0lEIGNvbW1hbmQ6CgogIHZvaWQgXGZzcGxpdChcJWEsJmEpCgogICBcZnNwbGl0KCkgYW5kIFxmam9pbigpIGFsc28gYWNjZXB0IGEgbmV3LCBvcHRpb25hbCA2dGggYXJndW1lbnQsIGFuCiAgIG9wdGlvbnMgZmxhZywgYSBudW1iZXIgdGhhdCBjYW4gc3BlY2lmeSBhIG51bWJlciBvZiBvcHRpb25zLiBTbyBmYXIKICAgdGhlcmUgaXMganVzdCBvbmUgb3B0aW9uLCB3aG9zZSB2YWx1ZSBpcyAxOgoKICAgc2VwYXJhdG9yLWZsYWcKICAgICAgICAgIE5vcm1hbGx5IHNlcGFyYXRvcnMgYXJlIGNvbGxhcHNlZC4gU28sIGZvciBleGFtcGxlLAoKICBcZndvcmQoVGhyZWUgICAgICAgIGxpdHRsZSAgICAgICAgICB3b3JkcywyKQoKICAgICAgICAgIHJldHVybnMgImxpdHRsZSIgKHRoZSBzZWNvbmQgd29yZCkuIFNwYWNlIGlzIGEgc2VwYXJhdG9yLCBidXQKICAgICAgICAgIHRoZXJlIGFyZSBtdWx0aXBsZSBzcGFjZXMgYmV0d2VlbiBlYWNoIHdvcmQuIElmIHRoZSB2YWx1ZSAxIGlzCiAgICAgICAgICBpbmNsdWRlZCBpbiB0aGUgb3B0aW9uIGZsYWcsIGhvd2V2ZXIsIGVhY2ggc2VwYXJhdG9yIGNvdW50cy4gSWYKICAgICAgICAgIHR3byBzZXBhcmF0b3JzIGFyZSBhZGphY2VudCwgYW4gZW1wdHkgd29yZCBpcyBwcm9kdWNlZCBiZXR3ZWVuCiAgICAgICAgICB0aGVtLiBUaGlzIGlzIHVzZWZ1bCBmb3IgcGFyc2luZyAoZS5nLikgY29tbWEtc2VwYXJhdGVkIGxpc3RzCiAgICAgICAgICBleHBvcnRlZCBmcm9tIGRhdGFiYXNlcyBvciBzcHJlYWRzaGVldHMuCgogIDguNy4zLiBUaGUgXGZjbWRzdGFjaygpIEZ1bmN0aW9uCgogICBUaGUgbmV3IFxmY21kc3RhY2soKSBmdW5jdGlvbiBnaXZlcyBhY2Nlc3MgdG8gdGhlIGNvbW1hbmQgc3RhY2s6CgogICBcZmNtZHN0YWNrKG4xLG4yKQogICAgICAgICAgQXJndW1lbnRzOiBuMSBpcyB0aGUgY29tbWFuZCBzdGFjayBsZXZlbC4gSWYgb21pdHRlZCwgdGhlCiAgICAgICAgICBjdXJyZW50IGxldmVsLCBcdihjbWRsZXZlbCksIGlzIHVzZWQuIG4yIGlzIGEgZnVuY3Rpb24gY29kZQogICAgICAgICAgc3BlY2lmeWluZyB0aGUgZGVzaXJlZCB0eXBlIG9mIGluZm9ybWF0aW9uOgoKICAwIChkZWZhdWx0KSA9IG5hbWUgb2Ygb2JqZWN0IGF0IGxldmVsIG4xLgogIDEgKG5vbnplcm8pID0gb2JqZWN0IHR5cGUgKDAgPSBwcm9tcHQ7IDEgPSBjb21tYW5kIGZpbGU7IDIgPSBtYWNybykuCgogICAgICAgICAgVGhlIGRlZmF1bHQgZm9yIG4yIGlzIDAuCgogICBUaGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggcHJvbXB0IGlzICIocHJvbXB0KSIuIEhlcmUncyBhIGxvb3AgdGhhdCBjYW4KICAgYmUgaW5jbHVkZWQgaW4gYSBtYWNybyBvciBjb21tYW5kIGZpbGUgdG8gc2hvdyB0aGUgc3RhY2sgKHNpbWlsYXIgdG8KICAgd2hhdCB0aGUgU0hPVyBTVEFDSyBjb21tYW5kIGRvZXMpOgoKICBmb3IgXCVpIFx2KGNtZGxldmVsKSAwIC0xIHsKICAgICAgZWNobyBcJWkuIFtcZmNtZHN0YWNrKFwlaSwxKV0gXGZjbWRzdGFjayhcJWksMCkKICB9CgogICBJbiB0aGlzIGNvbm5lY3Rpb24sIG5vdGUgdGhhdCBcdihjbWRmaWxlKSBhbHdheXMgaW5kaWNhdGVzIHRoZSBtb3N0CiAgIHJlY2VudGx5IGludm9rZWQgYWN0aXZlIGNvbW1hbmQgZmlsZSAoaWYgYW55KSwgZXZlbiBpZiB0aGF0IGZpbGUgaXMKICAgZXhlY3V0aW5nIGEgbWFjcm8uIFNpbWlsYXJseSwgXHYobWFjcm8pIGluZGljYXRlcyB0aGUgbW9zdCByZWNlbnRseQogICBpbnZva2VkIG1hY3JvIChpZiBhbnkpLCBldmVuIGlmIHRoZSBjdXJyZW50IGNvbW1hbmQgc291cmNlIGlzIG5vdCBhCiAgIG1hY3JvLiBUaGUgbmFtZSBvZiB0aGUgImNhbGxlciIgb2YgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgb2JqZWN0CiAgIChjb21tYW5kIGZpbGUgb3IgbWFjcm8pIGlzOgoKICBcZmNtZHN0YWNrKFx2KGNtZGxldmVsKS0xKQoKICAgYW5kIGl0cyB0eXBlIGlzOgoKICBcZmNtZHN0YWNrKFx2KGNtZGxldmVsKS0xLDEpCgogICBUbyBmaW5kIHRoZSBuYW1lIG9mIHRoZSBtYWNybyB0aGF0IGludm9rZWQgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcKICAgb2JqZWN0LCBldmVuIGlmIG9uZSBvciBtb3JlIGludGVybWVkaWF0ZSBjb21tYW5kIGZpbGVzIChvciBwcm9tcHRpbmcKICAgbGV2ZWxzKSBhcmUgaW52b2x2ZWQsIHVzZSBhIGxvb3AgbGlrZSB0aGlzOgoKICBmb3IgXCVpIFx2KGNtZGxldmVsKS0xIDAgLTEgewogICAgICBpZiA9IFxmY21kc3RhY2soXCVpLDEpIDIgZWNobyBDQUxMRVIgPSBcZmNtZHN0YWNrKFwlaSwwKQogIH0KCiAgIE9mIGNvdXJzZSBpZiB5b3UgbWFrZSBhIG1hY3JvIHRvIGRvIHRoaXMsIHRoZSBtYWNybyBtdXN0IGFjY291bnQgZm9yCiAgIGl0cyBvd24gYWRkaXRpb25hbCBsZXZlbDoKCiAgZGVmaW5lIENBTExFUiB7CiAgICAgIGZvciBcJWkgXHYoY21kbGV2ZWwpLTIgMCAtMSB7CiAgICAgICAgICBpZiA9IFxmY21kc3RhY2soXCVpLDEpIDIgcmV0dXJuIFxmY21kc3RhY2soXCVpLDApCiAgICAgIH0KICAgICAgcmV0dXJuICIobm9uZSkiCiAgfQoKICAgVGhlIGJ1aWx0LWluIHZhcmlhYmxlIFx2KGNtZHNvdXJjZSkgZ2l2ZXMgdGhlIGN1cnJlbnQgY29tbWFuZCBzb3VyY2UKICAgYXMgYSB3b3JkICgicHJvbXB0IiwgImZpbGUiLCBvciAibWFjcm8iKS4KCiAgOC43LjQuIFRoZSBWT0lEIENvbW1hbmQKCiAgIFZPSUQgaXMgbGlrZSBFQ0hPIGluIHRoYXQgYWxsIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzIGluIGl0cyBhcmd1bWVudAogICB0ZXh0IGFyZSBldmFsdWF0ZWQuIGJ1dCBpdCBkb2Vzbid0IHByaW50IGFueXRoaW5nIChleGNlcHQgcG9zc2libHkgYW4KICAgZXJyb3IgbWVzc2FnZSBpZiBhIGZ1bmN0aW9uIHdhcyBpbnZvY2F0aW9uIGNvbnRhaW5lZCBvciByZXN1bHRlZCBpbgogICBhbnkgZXJyb3JzKS4gVk9JRCBzZXRzIEZBSUxVUkUgaWYgaXQgZW5jb3VudGVycyBhbnkgZXJyb3JzLCBTVUNDRVNTCiAgIG90aGVyd2lzZS4KCiAgIFsgWzQ0Ml1Ub3AgXSBbIFs0NDNdQ29udGVudHMgXSBbIFs0NDRdQy1LZXJtaXQgSG9tZSBdIFsgWzQ0NV1LZXJtaXQKICAgSG9tZSBdCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgOC44LiBUaGUgUkVUVVJOIGFuZCBFTkQgQ29tbWFuZHMKCiAgIFRoZSBleGVjdXRpb24gb2YgYSBtYWNybyBpcyB0ZXJtaW5hdGVkIGluIGFueSBvZiB0aGUgZm9sbG93aW5nIHdheXM6CgogICAgICogV2l0aCBhbiBFTkQgWyBudW1iZXIgWyBtZXNzYWdlIF0gXSBjb21tYW5kLiBJZiBhIG51bWJlciBpcyBnaXZlbiwKICAgICAgIHRoZSBtYWNybyBzdWNjZWVkcyBpZiB0aGUgbnVtYmVyIGlzIDAsIGFuZCBmYWlscyBpZiBpdCBpcyBub3QKICAgICAgIHplcm87IGlmIGEgbnVtYmVyIGlzIG5vdCBnaXZlbiwgdGhlIG1hY3JvIHN1Y2NlZWRzLgogICAgICogV2l0aCBhIFNUT1AgY29tbWFuZCwgd2hpY2ggd29ya3MganVzdCBsaWtlIEVORCBleGNlcHQgaXQgcGVlbHMKICAgICAgIGJhY2sgdGhlIGNvbW1hbmQgc3RhY2sgYWxsIHRoZSB3YXkgdG8gdG9wIGxldmVsLgogICAgICogV2l0aCBhIFJFVFVSTiBbIHRleHQgXSBjb21tYW5kLCBpbiB3aGljaCBjYXNlIHRoZSBtYWNybyBhbHdheXMKICAgICAgIHN1Y2NlZWRzLgogICAgICogQnkgcnVubmluZyBvdXQgb2YgY29tbWFuZHMgdG8gZXhlY3V0ZSwgaW4gd2hpY2ggY2FzZSB0aGUgbWFjcm8KICAgICAgIHN1Y2NlZWRzIG9yIGZhaWxzIGFjY29yZGluZyB0aGUgbW9zdCByZWNlbnRseSBleGVjdXRlZCBjb21tYW5kCiAgICAgICB0aGF0IHNldHMgc3VjY2VzcyBvciBmYWlsdXJlLgoKICAgVGhlIHNhbWUgY29uc2lkZXJhdGlvbnMgYXBwbHkgdG8gY29tbWFuZCBmaWxlcyBpbnZva2VkIGJ5IHRoZSBUQUtFCiAgIGNvbW1hbmQuCgogICBJZiBhIG1hY3JvIGRvZXMgbm90IGV4ZWN1dGUgYW55IGNvbW1hbmRzIHRoYXQgc2V0IHN1Y2Nlc3Mgb3IgZmFpbHVyZSwKICAgdGhlbiBpbnZva2luZyB0aGUgbWFjcm8gZG9lcyBub3QgY2hhbmdlIHRoZSBjdXJyZW50IFNVQ0NFU1MvRkFJTFVSRQogICBzdGF0dXMuIEl0IGZvbGxvd3MsIHRoZW4sIHRoYXQgdGhlIG1lcmUgaW52b2NhdGlvbiBvZiBhIG1hY3JvIGRvZXMgbm90CiAgIGNoYW5nZSB0aGUgU1VDQ0VTUy9GQUlMVVJFIHN0YXR1cyBlaXRoZXIuIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8KICAgd3JpdGUgbWFjcm9zIHRvIHJlYWN0IHRvIHRoZSBzdGF0dXMgb2Ygb3RoZXIgY29tbWFuZHMgKG9yIG1hY3JvcyksIGZvcgogICBleGFtcGxlOgoKICBkZWZpbmUgQ0hLTElORSB7CiAgICAgIGlmIHN1Y2Nlc3MgZW5kIDAKICAgICAgc3RvcCAxIFNFVCBMSU5FIGZhaWxlZCAtIHBsZWFzZSB0cnkgYW5vdGhlciBkZXZpY2UuCiAgfQogIHNldCBtb2RlbSB0eXBlIHVzcm9ib3RpY3MKICBzZXQgbGluZSAvZGV2L2N1YTAKICBjaGtsaW5lCiAgc2V0IHNwZWVkIDU3NjAwCiAgZGlhbCA3NjU0MzIxCgogICBCeSB0aGUgd2F5LCBub25lIG9mIHRoaXMgaXMgbmV3cy4gQnV0IGl0IHdhcyBub3QgZXhwbGljaXRseSBkb2N1bWVudGVkCiAgIGJlZm9yZSwgYW5kIEMtS2VybWl0IDcuMCBhbmQgZWFybGllciBkaWQgbm90IGFsd2F5cyBoYW5kbGUgdGhlIFJFVFVSTgogICBzdGF0ZW1lbnQgYXMgaXQgc2hvdWxkIGhhdmUuCgogICBbIFs0NDZdVG9wIF0gWyBbNDQ3XUNvbnRlbnRzIF0gWyBbNDQ4XUMtS2VybWl0IEhvbWUgXSBbIFs0NDldS2VybWl0CiAgIEhvbWUgXQogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDguOS4gVU5ERUZJTmluZyBHcm91cHMgb2YgVmFyaWFibGVzCgogICBUaGUgVU5ERUZJTkUgY29tbWFuZCwgd2hpY2ggcHJldmlvdXNseSBhY2NlcHRlZCBvbmUgdmFyaWFibGUgbmFtZSwgbm93CiAgIGFjY2VwdHMgYSBsaXN0IG9mIHRoZW0sIGFuZCBhbHNvIGFjY2VwdHMgd2lsZGNhcmQgbm90YXRpb24gdG8gYWxsb3cKICAgZGVsZXRpb24gb2YgdmFyaWFibGVzIHRoYXQgbWF0Y2ggYSBnaXZlbiBwYXR0ZXJuLgoKICAgVU5ERUZJTkUgWyBzd2l0Y2hlcyBdIG5hbWUgWyBuYW1lIFsgbmFtZSBbIC4uLiBdIF0gXQogICAgICAgICAgVW5kZWZpbmVzIHRoZSB2YXJpYWJsZXMgd2hvc2UgbmFtZXMgYXJlIGdpdmVuLiBVcCB0byA2NCBuYW1lcwogICAgICAgICAgbWF5IGJlIGdpdmVuIGluIG9uZSBVTkRFRklORSBjb21tYW5kLgoKICAgSWYgeW91IG9taXQgdGhlIHN3aXRjaGVzIGFuZCBpbmNsdWRlIG9ubHkgb25lIG5hbWUsIHRoZSBVTkRFRklORQogICBjb21tYW5kIHdvcmtzIGFzIGJlZm9yZS4KCiAgIFN3aXRjaGVzIGluY2x1ZGU6CgogICAvTUFUQ0hJTkcKICAgICAgICAgIFNwZWNpZmllcyB0aGF0IHRoZSBuYW1lcyBnaXZlbiBhcmUgdG8gdHJlYXRlZCBhcyBwYXR0ZXJucwogICAgICAgICAgcmF0aGVyIHRoYW4gbGl0ZXJhbCB2YXJpYWJsZSBuYW1lcy4gTm90ZTogcGF0dGVybiBtYXRjaGluZwogICAgICAgICAgY2FuJ3QgYmUgdXNlZCB3aXRoIGFycmF5IHJlZmVyZW5jZXM7IHVzZSB0aGUgQVJSQVkgY29tbWFuZCB0bwogICAgICAgICAgbWFuaXB1bGF0ZSBhcnJheXMgYW5kIHN1YmFycmF5cy4KCiAgIC9MSVNUCiAgICAgICAgICBMaXN0IHRoZSBuYW1lIG9mIGVhY2ggdmFyaWFibGUgdG8gYmUgdW5kZWZpbmVkLCBhbmQgd2hldGhlciBpdAogICAgICAgICAgd2FzIHVuZGVmaW5lZCBzdWNjZXNzZnVsbHkgKCJvayIgb3IgImVycm9yIiksIHBsdXMgYSBzdW1tYXJ5CiAgICAgICAgICBjb3VudCBhdCB0aGUgZW5kLgoKICAgL1NJTVVMQVRFCiAgICAgICAgICBMaXN0IHRoZSBuYW1lcyBvZiB0aGUgdmFyaWFibGVzIHRoYXQgd291bGQgYmUgZGVsZXRlZCB3aXRob3V0CiAgICAgICAgICBhY3R1YWxseSBkZWxldGluZyB0aGVtLiBJbXBsaWVzIC9MSVNULgoKICAgVGhlIFVOREVGSU5FIGNvbW1hbmQgZmFpbHMgaWYgdGhlcmUgd2VyZSBhbnkgZXJyb3JzIGFuZCBzdWNjZWVkcwogICBvdGhlcndpc2UuCgogICBUaGUgbmV3IF9VTkRFRklORSBjb21tYW5kIGlzIGxpa2UgVU5ERUZJTkUsIGV4Y2VwdCB0aGUgbmFtZXMgYXJlCiAgIGFzc3VtZWQgdG8gYmUgdmFyaWFibGUgbmFtZXMgdGhlbXNlbHZlcywgd2hpY2ggY29udGFpbiB0aGUgbmFtZXMgKG9yCiAgIHBhcnRzIG9mIHRoZW0pIG9mIHRoZSB2YXJpYWJsZXMgdG8gYmUgdW5kZWZpbmVkLiBGb3IgZXhhbXBsZSwgaWYgeW91CiAgIGhhdmUgdGhlIGZvbGxvd2luZyBkZWZpbml0aW9uczoKCiAgZGVmaW5lIFwlYSBmb28KICBkZWZpbmUgZm9vIFRoaXMgaXMgc29tZSB0ZXh0CgogICB0aGVuOgoKICB1bmRlZiBcJWEKCiAgIHVuZGVmaW5lcyB0aGUgdmFyaWFibGUgXCVhLCBidXQ6CgogIF91bmRlZiBcJWEKCiAgIHVuZGVmaW5lcyB0aGUgbWFjcm8gZm9vLgoKICAgTm9ybWFsIEtlcm1pdCBwYXR0ZXJucyBhcmUgdXNlZCBmb3IgbWF0Y2hpbmc7IG1ldGFjaGFyYWN0ZXJzIGluY2x1ZGUKICAgYXN0ZXJpc2ssIHF1ZXN0aW9uIG1hcmssIGJyYWNlcywgYW5kIHNxdWFyZSBicmFja2V0cy4gVGh1cywgd2hlbiB1c2luZwogICB0aGUgL01BVENISU5HIHN3aXRjaCwgaWYgdGhlIG5hbWVzIG9mIHRoZSBtYWNyb3MgeW91IHdhbnQgdG8gdW5kZWZpbmUKICAgY29udGFpbiBhbnkgb2YgdGhlc2UgY2hhcmFjdGVycywgeW91IG11c3QgcXVvdGUgdGhlbSB3aXRoIGJhY2tzbGFzaCB0bwogICBmb3JjZSB0aGVtIHRvIGJlIHRha2VuIGxpdGVyYWxseS4gQWxzbyBub3RlIHRoYXQgXCUqIGlzIG5vdCB0aGUgbmFtZQogICBvZiBhIHZhcmlhYmxlOyBpdCBpcyBhIHNwZWNpYWwgbm90YXRpb24gdXNlZCB3aXRoaW4gYSBtYWNybyBmb3IgImFsbAogICBteSBhcmd1bWVudHMiLiBUaGUgY29tbWFuZCAidW5kZWYgL21hdGNoIFwlKiIgZGVsZXRlcyBhbGwgXCV4CiAgIHZhcmlhYmxlcywgd2hlcmUgeCBpcyAwLi45IGFuZCBhLi56LiBVc2UgInVuZGVmIC9tYXRjaCBcJVswLTldIiB0bwogICBkZWxldGUgbWFjcm8gYXJndW1lbnQgdmFyaWFibGVzIG9yICJ1bmRlZiAvbWF0Y2ggXCVbaS1uXSIgdG8gZGVsZXRlIGEKICAgcmFuZ2Ugb2YgXCV4IHZhcmlhYmxlcy4KCiAgIFsgWzQ1MF1Ub3AgXSBbIFs0NTFdQ29udGVudHMgXSBbIFs0NTJdQy1LZXJtaXQgSG9tZSBdIFsgWzQ1M11LZXJtaXQKICAgSG9tZSBdCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgOC4xMC4gVGhlIElOUFVUIGFuZCBNSU5QVVQgQ29tbWFuZHMKCiAgIEFzIG9mIEMtS2VybWl0IDguMC4yMTEsIHRoZSBJTlBVVCBhbmQgTUlOUFVUIGNvbW1hbmRzIGFjY2VwdCBhIHN3aXRjaDoKCiAgIFtNXUlOUFVUIC9OT01BVENIIHRpbWVvdXQKICAgICAgICAgIFRoZSAvTk9NQVRDSCBzd2l0Y2ggYWxsb3dzIElOUFVUIG9yIE1JTlBVVCB0byByZWFkIGluY29taW5nCiAgICAgICAgICBtYXRlcmlhbCBmb3IgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgdGltZSwgd2l0aG91dCBhdHRlbXB0aW5nCiAgICAgICAgICB0byBtYXRjaCBpdCB3aXRoIGFueSB0ZXh0IG9yIHBhdHRlcm5zLiBXaGVuIHRoaXMgc3dpdGNoIGlzCiAgICAgICAgICBpbmNsdWRlZCwgdGhlIFtNXUlOUFVUIGNvbW1hbmQgc3VjY2VlZHMgd2hlbiB0aGUgdGltZW91dAogICAgICAgICAgaW50ZXJ2YWwgZXhwaXJlcywgd2l0aCBcdihpbnN0YXR1cykgc2V0IHRvIDEsIG1lYW5pbmcgInRpbWVkCiAgICAgICAgICBvdXQiLCBvciBmYWlscyB1cG9uIGludGVycnVwdGlvbiBvciBpL28gZXJyb3IuCgogICBBbHNvIGluIHZlcnNpb24gOC4wLjIxMSwgdGhlcmUgaXMgYSBuZXcgd2F5IHRvIGFwcGx5IGEgc2NhbGUgZmFjdG9yIHRvCiAgIFtNXUlOUFVUIHRpbWVvdXRzOgoKICAgU0VUIElOUFVUIFNDQUxFLUZBQ1RPUiBmbG9hdGluZy1wb2ludC1udW1iZXIKICAgICAgICAgIFRoaXMgc2NhbGVzIGFsbCBbTV1JTlBVVCB0aW1lb3V0cyBieSB0aGUgZ2l2ZW4gZmFjdG9yLCBhbGxvd2luZwogICAgICAgICAgdGltZS1zZW5zaXRpdmUgc2NyaXB0cyB0byBiZSBhZGp1c3RlZCB0byBjaGFuZ2luZyBjb25kaXRpb25zCiAgICAgICAgICBzdWNoIGFzIGNvbmdlc3RlZCBuZXR3b3JrcyBvciBkaWZmZXJlbnQtc3BlZWQgbW9kZW1zIHdpdGhvdXQKICAgICAgICAgIGhhdmluZyB0byBjaGFuZ2UgZWFjaCBJTlBVVC1jbGFzcyBjb21tYW5kLiBUaGlzIGFmZmVjdHMgb25seQogICAgICAgICAgdGhvc2UgdGltZW91dHMgdGhhdCBhcmUgZ2l2ZW4gaW4gc2Vjb25kcywgbm90IGFzIHdhbGwtY2xvY2sKICAgICAgICAgIHRpbWVzLiBBbHRob3VnaCB0aGUgc2NhbGUgZmFjdG9yIGNhbiBoYXZlIGEgZnJhY3Rpb25hbCBwYXJ0LAogICAgICAgICAgdGhlIElOUFVUIHRpbWVvdXQgaXMgc3RpbGwgYW4gaW50ZWdlci4gVGhlIG5ldyBidWlsdC1pbgogICAgICAgICAgdmFyaWFibGUgXHYoaW5zY2FsZSkgdGVsbHMgdGhlIGN1cnJlbnQgSU5QVVQgU0NBTEUtRkFDVE9SLgoKICAgVGhlIE1JTlBVVCBjb21tYW5kIGNhbiBiZSB1c2VkIHRvIHNlYXJjaCB0aGUgaW5jb21pbmcgZGF0YSBzdHJlYW0gZm9yCiAgIHNldmVyYWwgdGFyZ2V0cyBzaW11bHRhbmVvdXNseS4gRm9yIGV4YW1wbGU6CgogIE1JTlBVVCA4IG9uZSB0d28gdGhyZWUKCiAgIHdhaXRzIHVwIHRvIDggc2Vjb25kcyBmb3Igb25lIG9mIHRoZSB3b3JkcyAib25lIiwgInR3byIsIG9yICJ0aHJlZSIgdG8KICAgYXJyaXZlLiBXb3JkcyBjYW4gYmUgZ3JvdXBlZCB0byBpbmRpY2F0ZSB0YXJnZXRzIHRoYXQgY29udGFpbiBzcGFjZXM6CgogIE1JTlBVVCA4IG5pbmV0ZWVlbiB0d2VudHkgInR3ZW50eSBvbmUiCgogICBBbmQgb2YgY291cnNlIHlvdSBjYW4gYWxzbyB1c2UgdmFyaWFibGVzIGluIHBsYWNlIG9mIChvciBhcyBwYXJ0IG9mKQogICB0aGUgdGFyZ2V0IG5hbWVzOgoKICBNSU5QVVQgOCBcJWEgXCZ4WzNdIFxtKGZvbykKCiAgIFVudGlsIG5vdyB5b3UgaGFkIHRvIGtub3cgdGhlIG51bWJlciBvZiB0YXJnZXRzIGluIGFkdmFuY2Ugd2hlbgogICB3cml0aW5nIHRoZSBNSU5QVVQgc3RhdGVtZW50LiBFYWNoIG9mIHRoZSBleGFtcGxlcyBhYm92ZSBoYXMgZXhhY3RseQogICB0aHJlZSB0YXJnZXRzLgoKICAgQnV0IHN1cHBvc2UgeW91ciBzY3JpcHQgbmVlZHMgdG8gbG9vayBmb3IgYSB2YXJpYWJsZSBudW1iZXIgb2YKICAgdGFyZ2V0cy4gRm9yIHRoaXMgeW91IGNhbiB1c2UgYXJyYXlzIGFuZCBcZmpvaW4oKSwgZGVzY3JpYmVkIGluCiAgIFs0NTRdU2VjdGlvbiA4LjcuIEFueSBudW1iZXIgb2YgXGZqb2luKCkgaW52b2NhdGlvbnMgY2FuIGJlIGluY2x1ZGVkCiAgIGluIHRoZSBNSU5QVVQgdGFyZ2V0IGxpc3QsIGFuZCBlYWNoIG9uZSBpcyBleHBhbmRlZCBpbnRvIHRoZQogICBhcHByb3ByaWF0ZSBudW1iZXIgb2Ygc2VwYXJhdGUgdGFyZ2V0cyBlYWNoIHRpbWUgdGhlIE1JTlBVVCBjb21tYW5kIGlzCiAgIGV4ZWN1dGVkLiBFeGFtcGxlOgoKICBkZWNsYXJlIFwmYVsxMF0gPSBvbmUgdHdvIHRocmVlCiAgbWlucHV0IDEwIGZvbyBcZmpvaW4oJmEpIGJhcgoKICAgVGhpcyBkZWNsYXJlcyBhbiBhcnJheSBvZiB0ZW4gZWxlbWVudHMsIGFuZCBhc3NpZ25zIHZhbHVlcyB0byB0aGUKICAgZmlyc3QgdGhyZWUgb2YgdGhlbS4gVGhlIE1JTlBVVCBjb21tYW5kIGxvb2tzIGZvciB0aGVzZSB0aHJlZSAoYXMgd2VsbAogICBhcyB0aGUgd29yZHMgImZvbyIgYW5kICJiYXIiKS4gTGF0ZXIsIGlmIHlvdSBhc3NpZ24gYWRkaXRpb25hbAogICBlbGVtZW50cyB0byB0aGUgYXJyYXksIHRoZSBzYW1lIE1JTlBVVCBjb21tYW5kIGFsc28gbG9va3MgZm9yIHRoZSBuZXcKICAgZWxlbWVudHMuCgogICBJZiBhbiBhcnJheSBlbGVtZW50IGNvbnRhaW5zIHNwYWNlcywgZWFjaCB3b3JkIGJlY29tZXMgYSBzZXBhcmF0ZQogICB0YXJnZXQuIFRvIGNyZWF0ZSBvbmUgdGFyZ2V0IHBlciBhcnJheSBlbGVtZW50LCB1c2UgXGZqb2luKCkncwogICBncm91cGluZyBmZWF0dXJlOgoKICBkY2wgXCZhW10gPSB7YWFhIGJiYn0ge2NjYyBkZGR9IHt4eHggeXl5IHp6en0KCiAgbWlucHV0IDEwIFxmam9pbigmYSkgICAgIDwtLSA3IHRhcmdldHMKICBtaW5wdXQgMTAgXGZqb2luKCZhLCwyKSAgPC0tIDMgdGFyZ2V0cwoKICAgWyBbNDU1XVRvcCBdIFsgWzQ1Nl1Db250ZW50cyBdIFsgWzQ1N11DLUtlcm1pdCBIb21lIF0gWyBbNDU4XUtlcm1pdAogICBIb21lIF0KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICA4LjExLiBMZWFybmVkIFNjcmlwdHMKCiAgIEMtS2VybWl0IG5vdyBpbmNsdWRlcyBhIHNpbXBsZSBzY3JpcHQgcmVjb3JkZXIgdGhhdCBtb25pdG9ycyB5b3VyCiAgIGNvbW1hbmRzLCBwbHVzIHlvdXIgYWN0aW9ucyBkdXJpbmcgQ09OTkVDVCBtb2RlLCBhbmQgYXV0b21hdGljYWxseQogICBnZW5lcmF0ZXMgYSBzY3JpcHQgcHJvZ3JhbSB0aGF0IG1pbWljcyB3aGF0IGl0IG9ic2VydmVkLiBZb3Ugc2hvdWxkCiAgIHRoaW5rIG9mIHRoaXMgZmVhdHVyZSBhcyBhIHNjcmlwdC13cml0aW5nIEFTU0lTVEFOVCBzaW5jZSwgYXMgeW91IHdpbGwKICAgc2VlIFs0NTldbGF0ZXIgaW4gdGhpcyBzZWN0aW9uLCB0aGUgcmVzdWx0IGdlbmVyYWxseSBuZWVkcyBzb21lCiAgIGVkaXRpbmcgdG8gbWFrZSBpdCBib3RoIHNlY3VyZSBhbmQgZmxleGlibGUuIFRoZSBzY3JpcHQgcmVjb3JkZXIgaXMKICAgY29udHJvbGxlZCBieSB0aGUgbmV3IExFQVJOIGNvbW1hbmQ6CgogICBMRUFSTiBbIC9PTiAvT0ZGIC9DTE9TRSBdIFsgZmlsZW5hbWUgXQogICAgICAgICAgSWYgeW91IGdpdmUgYSBmaWxlbmFtZSwgdGhlIGZpbGUgaXMgb3BlbmVkIGZvciBzdWJzZXF1ZW50CiAgICAgICAgICByZWNvcmRpbmcuIFRoZSAvT04gc3dpdGNoIGVuYWJsZXMgcmVjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGZpbGUKICAgICAgICAgIChpZiBhbnkpOyAvT0ZGIGRpc2FibGVzIHJlY29yZGluZy4gL0NMT1NFIGNsb3NlcyB0aGUgY3VycmVudAogICAgICAgICAgc2NyaXB0IHJlY29yZGluZyBmaWxlIChpZiBhbnkpLiBJZiB5b3UgZ2l2ZSBhIGZpbGVuYW1lIHdpdGhvdXQKICAgICAgICAgIGFueSBzd2l0Y2hlcywgL09OIGlzIGFzc3VtZWQuCgogICBUaGUgL09GRiBhbmQgL09OIHN3aXRjaGVzIGxldCB5b3UgdHVybiByZWNvcmRpbmcgb2ZmIGFuZCBvbiBkdXJpbmcgYQogICBzZXNzaW9uIHdpdGhvdXQgY2xvc2luZyB0aGUgZmlsZS4KCiAgIFdoZW4gcmVjb3JkaW5nOgoKICAgICAqIEFsbCBjb21tYW5kcyB0aGF0IHlvdSB0eXBlIChvciByZWNhbGwpIGF0IHRoZSBwcm9tcHQgYXJlIHJlY29yZGVkCiAgICAgICBpbiB0aGUgZmlsZSBleGNlcHQ6CiAgICAgICAgICArIExFQVJOIGNvbW1hbmRzIGFyZSBub3QgcmVjb3JkZWQuCiAgICAgICAgICArIFRoZSBDT05ORUNUIGNvbW1hbmQgaXMgbm90IHJlY29yZGVkLgogICAgICAgICAgKyBUaGUgVEVMTkVUIGNvbW1hbmQgaXMgY29udmVydGVkIHRvIFNFVCBIT1NUIC9ORVRXT1JLOlRDUC4KICAgICAqIENvbW1hbmRzIG9idGFpbmVkIGZyb20gbWFjcm9zIG9yIGNvbW1hbmQgZmlsZXMgYXJlIG5vdCByZWNvcmRlZC4KICAgICAqIER1cmluZyBDT05ORUNUOgogICAgICAgICAgKyBFdmVyeSBsaW5lIHlvdSB0eXBlIGlzIGNvbnZlcnRlZCB0byBhbiBPVVRQVVQgY29tbWFuZC4KICAgICAgICAgICsgVGhlIGxhc3QgcHJvbXB0IGJlZm9yZSBhbnkgbGluZSB5b3UgdHlwZSBiZWNvbWVzIGFuIElOUFVUCiAgICAgICAgICAgIGNvbW1hbmQuCiAgICAgICAgICArIFRpbWVvdXRzIGFyZSBjYWxjdWxhdGVkIGF1dG9tYXRpY2FsbHkgZm9yIGVhY2ggSU5QVVQgY29tbWFuZC4KICAgICAgICAgICsgQSBQQVVTRSBjb21tYW5kIGlzIGluc2VydGVkIGJlZm9yZSBlYWNoIE9VVFBVVCBjb21tYW5kIGp1c3QKICAgICAgICAgICAgdG8gYmUgc2FmZS4KCiAgIFRodXMgdGhlIHNjcmlwdCByZWNvcmRlciBpcyBpbmhlcmVudGx5IGxpbmUtb3JpZW50ZWQuIEl0IGNhbid0IGJlIHVzZWQKICAgdG8gc2NyaXB0IGNoYXJhY3Rlci1vcmllbnRlZCBpbnRlcmFjdGlvbnMgbGlrZSB0eXBpbmcgU3BhY2UgdG8gYQogICAiTW9yZT8iIHByb21wdCBvciBlZGl0aW5nIGEgdGV4dCBmaWxlIHdpdGggVkkgb3IgRU1BQ1MuCgogICBCdXQgaXQgaGFzIGFkdmFudGFnZXMgdG9vOyBmb3IgZXhhbXBsZSBpdCB0YWtlcyBjb250cm9sIGNoYXJhY3RlcnMKICAgaW50byBhY2NvdW50IHRoYXQgbWlnaHQgbm90IGJlIHZpc2libGUgdG8geW91IG90aGVyd2lzZSwgYW5kIGl0CiAgIGF1dG9tYXRpY2FsbHkgY29udmVydHMgY29udHJvbCBjaGFyYWN0ZXJzIGluIGJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQKICAgc3RyZWFtcyB0byB0aGUgYXBwcm9wcmlhdGUgbm90YXRpb24uIEl0IGNhbiB0ZWxsLCBmb3IgZXhhbXBsZSB0aGF0IHRoZQogICAiJCAiIHByb21wdCBvbiB0aGUgbGVmdCBtYXJnaW4gaW4gVU5JWCBpcyByZWFsbHkge1x7MTN9XHsxMH0kIH0sCiAgIHdoZXJlYXMgaW4gVk1TIGl0IG1pZ2h0IGJlIHtcezEzfVx7MTB9XHsxM30kIH0uIFRoZXNlIHNlcXVlbmNlcyBhcmUKICAgZGV0ZWN0ZWQgYW5kIHJlY29yZGVkIGF1dG9tYXRpY2FsbHkuCgogICBBIGxlYXJuZWQgc2NyaXB0IHNob3VsZCBleGVjdXRlIGNvcnJlY3RseSB3aGVuIHlvdSBnaXZlIGEgVEFLRSBjb21tYW5kCiAgIGZvciBpdC4gSG93ZXZlciwgaXQgaXMgdXN1YWxseSBhcHByb3ByaWF0ZSB0byBlZGl0IHRoZSBzY3JpcHQgYSBiaXQuCiAgIFRoZSBtb3N0IGltcG9ydGFudCBjaGFuZ2Ugd291bGQgYmUgdG8gcmVtb3ZlIGFueSBwYXNzd29yZHMgZnJvbSBpdC4KICAgRm9yIGV4YW1wbGUsIGlmIHRoZSBzY3JpcHQgY29udGFpbnM6CgogIElOUFVUIDkge1x7MTN9XHsxMH1QYXNzd29yZDogfQogIElGIEZBSUwgU1RPUCAxIElOUFVUIHRpbWVvdXQKICBQQVVTRSAxCiAgT1VUUFVUIGJpZ3NlY3JldFx7MTN9CgogICB5b3Ugc2hvdWxkIHJlcGxhY2UgdGhpcyBieSBzb21ldGhpbmcgbGlrZToKCiAgSU5QVVQgOSB7XHsxM31cezEwfVBhc3N3b3JkOiB9CiAgSUYgRkFJTCBTVE9QIDEgSU5QVVQgdGltZW91dAogIEFTS1EgcHN3ZCBQbGVhc2UgdHlwZSB5b3VyIHBhc3N3b3JkOgogIFBBVVNFIDEKICBPVVRQVVQgXG0ocHN3ZClcezEzfQoKICAgVGhlIExFQVJOIGNvbW1hbmQgY2FuJ3QgZG8gdGhpcyBmb3IgeW91IHNpbmNlIGl0IGtub3dzIG5vdGhpbmcgYWJvdXQKICAgImNvbnRlbnQiOyBpdCBvbmx5IGtub3dzIGFib3V0IGxpbmVzIGFuZCBjYW4ndCBiZSBleHBlY3RlZCB0byBwYXJzZSBvcgogICB1bmRlcnN0YW5kIHRoZW0gLS0gYWZ0ZXIgYWxsLCB0aGUgUGFzc3dvcmQgcHJvbXB0IG1pZ2h0IGJlIGluIHNvbWUKICAgb3RoZXIgbGFuZ3VhZ2UuIFNvIHJlbWVtYmVyOiBpZiB5b3UgdXNlIHRoZSBMRUFSTiBjb21tYW5kIHRvIHJlY29yZCBhCiAgIGxvZ2luIHNjcmlwdCwgYmUgc3VyZSBlZGl0IHRoZSByZXN1bHRpbmcgZmlsZSB0byByZW1vdmUgYW55IHBhc3N3b3Jkcy4KICAgQWxzbyBiZSBzdXJlIHRvIGRlbGV0ZSBhbnkgYmFja3VwIGNvcGllcyB5b3VyIGVkaXRvciBvciBPUyBtaWdodCBoYXZlCiAgIG1hZGUgb2YgdGhlIGZpbGUuCgogICBPdGhlciBtYW51YWwgYWRqdXN0bWVudHMgbWlnaHQgYWxzbyBiZSBhcHByb3ByaWF0ZToKCiAgICAgKiBJZiB0aGUgdGFyZ2V0IG9mIGFuIElOUFVUIGNvbW1hbmQgY2FuIHZhcnksIHlvdSBjYW4gcmVwbGFjZSB0aGUKICAgICAgIElOUFVUIGNvbW1hbmQgd2l0aCBNSU5QVVQgYW5kIHRoZSBhcHByb3ByaWF0ZSB0YXJnZXQgbGlzdCwgYW5kL29yCiAgICAgICB0aGUgdGFyZ2V0IHdpdGggYSBcZnBhdHRlcm4oKS4gRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IGFyZQogICAgICAgZGlhbGluZyBhIG51bWJlciB0aGF0IGNhbiBiZSBhbnN3ZXJlZCBieSBhbnkgb25lIG9mIDEwMCB0ZXJtaW5hbAogICAgICAgc2VydmVycywgd2hvc2UgcHJvbXB0cyBhcmUgdHMtMDA+LCB0cy0wMT4sIHRzLTAyPiwgLi4uIHRzLTk5Pi4gVGhlCiAgICAgICBzY3JpcHQgcmVjb3JkcyBhIHBhcnRpY3VsYXIgb25lIG9mIHRoZXNlLCBidXQgeW91IHdhbnQgaXQgdG8gd29yawogICAgICAgZm9yIGFsbCBvZiB0aGVtLCBzbyBjaGFuZ2UgKGUuZy4pOgogIElOUFVUIDEwIHRzLTIzPiAgOyBvciB3aGF0ZXZlcgogICAgICAgdG86CiAgSU5QVVQgMTAgXGZwYXR0ZXJuKHRzLVswLTldWzAtOV0+KQogICAgICogVGhlIElOUFVUIHRpbWVvdXQgdmFsdWVzIGFyZSBjb25zZXJ2YXRpdmUsIGJ1dCB0aGV5IGFyZSBiYXNlZCBvbmx5CiAgICAgICBvbiBhIHNpbmdsZSBvYnNlcnZhdGlvbjsgeW91IG1pZ2h0IG5lZWQgdG8gdHVuZSB0aGVtLgogICAgICogVGhlIFBBVVNFIGNvbW1hbmRzIG1pZ2h0IG5vdCBiZSBuZWNlc3NhcnksIG9yIHRoZSBQQVVTRSBpbnRlcnZhbAogICAgICAgbWlnaHQgbmVlZCBhZGp1c3RtZW50LgogICAgICogSW4gY2FzZSB5b3UgbWFkZSB0eXBvZ3JhcGhpY2FsIGVycm9ycyBkdXJpbmcgcmVjb3JkaW5nLCB0aGV5IGFyZQogICAgICAgaW5jb3Jwb3JhdGVkIGluIHlvdXIgc2NyaXB0OyB5b3UgY2FuIGVkaXQgdGhlbSBvdXQgaWYgeW91IHdhbnQgdG8uCgogICBIZXJlIGlzIGEgc2FtcGxlIHNjcmlwdCBnZW5lcmF0ZWQgYnkgS2VybWl0ICgibGVhcm4gdm1zLmtzYyIpIGluIHdoaWNoCiAgIGEgVGVsbmV0IGNvbm5lY3Rpb24gaXMgbWFkZSB0byBhIFZNUyBjb21wdXRlciwgdGhlIHVzZXIgbG9ncyBpbiwKICAgc3RhcnRzIEtlcm1pdCBvbiBWTVMsIHNlbmRzIGl0IGEgZmlsZSwgYW5kIHRoZW4gbG9ncyBvdXQ6CgogIDsgU2NyaXB0ZmlsZTogdm1zLmtzYwogIDsgRGlyZWN0b3J5OiAgL3Vzci9vbGdhCiAgOyBSZWNvcmRlZDogICAyMDAwMTEyNCAxNToyMToyMwoKICBTRVQgSE9TVCAvTkVUV09SSzpUQ1Agdm1zLnh5emNvcnAuY29tCiAgSUYgRkFJTCBTVE9QIDEgQ29ubmVjdGlvbiBmYWlsZWQKCiAgSU5QVVQgNyB7XHsxM31cezEwfVx7MTN9VXNlcm5hbWU6IH0KICBJRiBGQUlMIFNUT1AgMSBJTlBVVCB0aW1lb3V0CiAgUEFVU0UgMQogIE9VVFBVVCBvbGdhXHsxM30KICBJTlBVVCAzIHtcezEzfVx7MTB9XHsxM31QYXNzd29yZDogfQogIElGIEZBSUwgU1RPUCAxIElOUFVUIHRpbWVvdXQKICBQQVVTRSAxCiAgT1VUUFVUIHNlY3JldFx7MTN9CiAgSU5QVVQgMTgge1x7MTN9XHsxMH1cezEzfSQgfQogIElGIEZBSUwgU1RPUCAxIElOUFVUIHRpbWVvdXQKICBQQVVTRSAxCiAgT1VUUFVUIHNldCBkZWZhdWx0IFsuaW5jb21pbmddXHsxM30KICBJTlBVVCAxMiB7XHsxM31cezEwfVx7MTN9JCB9CiAgSUYgRkFJTCBTVE9QIDEgSU5QVVQgdGltZW91dAogIFBBVVNFIDEKICBPVVRQVVQga2VybWl0XHsxM30KICBJTlBVVCAxNSB7XHsxM31cezEwfVx7MTN9QUxUTzpbT0xHQS5JTkNPTUlOR10gQy1LZXJtaXQ+fQogIElGIEZBSUwgU1RPUCAxIElOUFVUIHRpbWVvdXQKICBQQVVTRSAxCiAgT1VUUFVUIHJlY2VpdmVcezEzfQogIHNlbmQgbXlmaWxlLnR4dAoKICBJTlBVVCAxOCB7XHsxM31cezEwfVx7MTN9QUxUTzpbT0xHQS5JTkNPTUlOR10gQy1LZXJtaXQ+fQogIElGIEZBSUwgU1RPUCAxIElOUFVUIHRpbWVvdXQKICBQQVVTRSAxCiAgT1VUUFVUIGV4aXRcezEzfQogIElOUFVUIDYge1x7MTN9XHsxMH1cezEzfSQgfQogIElGIEZBSUwgU1RPUCAxIElOUFVUIHRpbWVvdXQKICBQQVVTRSAxCiAgT1VUUFVUIGxvZ291dFx7MTN9CiAgY2xvc2UKICBleGl0CgogICBUaGUgY29tbWFuZHMgZ2VuZXJhdGVkIGJ5IEtlcm1pdCBkdXJpbmcgQ09OTkVDVCAoSU5QVVQsIElGIEZBSUwsCiAgIFBBVVNFLCBhbmQgT1VUUFVUKSBoYXZlIHVwcGVyY2FzZSBrZXl3b3JkczsgdGhlIGNvbW1hbmRzIHR5cGVkIGJ5IHRoZQogICB1c2VyIGFyZSBpbiB3aGF0ZXZlciBmb3JtIHRoZSB1c2VyIHR5cGVkIHRoZW0gKGluIHRoaXMgY2FzZSwKICAgbG93ZXJjYXNlKS4KCiAgIFsgWzQ2MF1Ub3AgXSBbIFs0NjFdQ29udGVudHMgXSBbIFs0NjJdQy1LZXJtaXQgSG9tZSBdIFsgWzQ2M11LZXJtaXQKICAgSG9tZSBdCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgOC4xMi4gUGF0dGVybiBNYXRjaGluZwoKICAgQSBwYXR0ZXJuIGlzIGEgY2hhcmFjdGVyIHN0cmluZyB0aGF0IGlzIHVzZWQgdG8gbWF0Y2ggb3RoZXIgc3RyaW5ncy4KICAgUGF0dGVybnMgY2FuIGNvbnRhaW4gbWV0YWNoYXJhY3RlcnMgdGhhdCByZXByZXNlbnQgc3BlY2lhbCBhY3Rpb25zCiAgIGxpa2UgIm1hdGNoIGFueSBzaW5nbGUgY2hhcmFjdGVyIiwgIm1hdGNoIHplcm8gb3IgbW9yZSBjaGFyYWN0ZXJzIiwKICAgIm1hdGNoIGFueSBzaW5nbGUgY2hhcmFjdGVyIGZyb20gYSBsaXN0IiwgYW5kIHNvIG9uLiBUaGUgYmVzdCBrbm93bgogICBhcHBsaWNhdGlvbiBvZiBwYXR0ZXJucyBpcyBpbiBmaWxlIHNwZWNpZmljYXRpb25zIHRoYXQgY29udGFpbgogICB3aWxkY2FyZHMsIGFzIGluICJzZW5kICoudHh0IiwgbWVhbmluZyAic2VuZCBhbGwgZmlsZXMgd2hvc2UgbmFtZXMgZW5kCiAgIHdpdGggLnR4dCIuCgogICBQYXR0ZXJucyBhcmUgYWxzbyB1c2VkIGluIGluY3JlYXNpbmdseSBtYW55IG90aGVyIHdheXMsIHRvIHRoZSBleHRlbnQKICAgaXQgaXMgdXNlZnVsIHRvIHBvaW50IG91dCBjZXJ0YWluIGltcG9ydGFudCBkaXN0aW5jdGlvbnMgaW4gdGhlIHdheXMKICAgaW4gd2hpY2ggdGhleSBhcmUgdXNlZDoKCiAgIEFuY2hvcmVkIFBhdHRlcm5zCiAgICAgICAgICBJZiBhbiBhbmNob3JlZCBwYXR0ZXJuIGRvZXMgbm90IGJlZ2luIHdpdGggIioiLCBpdCBtdXN0IG1hdGNoCiAgICAgICAgICB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcsIGFuZCBpZiBpdCBkb2VzIG5vdCBlbmQgd2l0aCAiKiIsCiAgICAgICAgICBpdCBtdXN0IG1hdGNoIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4gRm9yIGV4YW1wbGUsIHRoZSBhbmNob3JlZAogICAgICAgICAgcGF0dGVybiAiYWJjIiBtYXRjaGVzIG9ubHkgdGhlIHN0cmluZyAiYWJjIiwgbm90ICJhYmNkZSIgb3IKICAgICAgICAgICJ4eXphYmMiIG9yICJhYmNhYmMiLiBUaGUgYW5jaG9yZWQgcGF0dGVybiAiYWJjKiIgbWF0Y2hlcyBhbnkKICAgICAgICAgIHN0cmluZyB0aGF0IHN0YXJ0cyB3aXRoICJhYmMiOyB0aGUgYW5jaG9yZWQgcGF0dGVybiAiKmFiYyIKICAgICAgICAgIG1hdGNoZXMgYW55IHN0cmluZyB0aGF0IGVuZHMgd2l0aCAiYWJjIjsgdGhlIGFuY2hvcmVkIHBhdHRlcm4KICAgICAgICAgICIqYWJjKiIgbWF0Y2hlcyBhbnkgc3RyaW5nIHRoYXQgY29udGFpbnMgImFiYyIgKGluY2x1ZGluZyBhbnkKICAgICAgICAgIHRoYXQgc3RhcnQgYW5kL29yIGVuZCB3aXRoIGl0KS4KCiAgIEZsb2F0aW5nIFBhdHRlcm5zCiAgICAgICAgICBBIGZsb2F0aW5nIHBhdHRlcm4gbWF0Y2hlcyBhbnkgc3RyaW5nIHRoYXQgY29udGFpbnMgYSBzdWJzdHJpbmcKICAgICAgICAgIHRoYXQgbWF0Y2hlcyB0aGUgcGF0dGVybi4gSW4gb3RoZXIgd29yZHMsIGEgZmxvYXRpbmcgcGF0dGVybgogICAgICAgICAgaGFzIGFuIGltcGxpZWQgIioiIGF0IHRoZSBiZWdpbm5pbmcgYW5kIGVuZC4gWW91IGNhbiBhbmNob3IgYQogICAgICAgICAgZmxvYXRpbmcgcGF0dGVybiB0byB0aGUgYmVnaW5uaW5nIGJ5IHN0YXJ0aW5nIGl0IHdpdGggIl4iLCBhbmQKICAgICAgICAgIHlvdSBjYW4gYW5jaG9yIGl0IHRvIHRoZSBlbmQgYnkgZW5kaW5nIGl0IHdpdGggIiQiIChzZWUKICAgICAgICAgIGV4YW1wbGVzIGJlbG93KS4KCiAgIFdpbGRjYXJkcwogICAgICAgICAgQSB3aWxkY2FyZCBpcyBhbiBhbmNob3JlZCBwYXR0ZXJuIHRoYXQgaGFzIHRoZSBhZGRpdGlvbmFsCiAgICAgICAgICBwcm9wZXJ0eSB0aGF0ICIqIiBkb2VzIG5vdCBtYXRjaCBkaXJlY3Rvcnkgc2VwYXJhdG9ycy4KCiAgIFRoaXMgdGVybWlub2xvZ3kgbGV0cyB1cyBkZXNjcmliZSBLZXJtaXQncyBjb21tYW5kcyB3aXRoIGEgYml0IG1vcmUKICAgcHJlY2lzaW9uLiBXaGVuIGEgcGF0dGVybiBpcyB1c2VkIGZvciBtYXRjaGluZyBmaWxlbmFtZXMsIGl0IGlzIGEKICAgd2lsZGNhcmQsIGV4Y2VwdCBpbiB0aGUgVEVYVC1QQVRURVJOUyBhbmQgQklOQVJZLVBBVFRFUk5TIGxpc3RzIGFuZAogICAvRVhDRVBUOiBjbGF1c2VzLCBpbiB3aGljaCBjYXNlIGRpcmVjdG9yeSBzZXBhcmF0b3JzIGFyZSBub3QKICAgc2lnbmlmaWNhbnQgKGZvciBleGFtcGxlLCBhIEJJTkFSWS1QQVRURVJOIG9mICIqLmV4ZSIgbWF0Y2hlcyBhbnkgZmlsZQogICB3aG9zZSBuYW1lIGVuZHMgaW4gLmV4ZSwgbm8gbWF0dGVyIGhvdyBkZWVwbHkgaXQgbWlnaHQgYmUgYnVyaWVkIGluCiAgIHN1YmRpcmVjdG9yaWVzKS4gV2hlbiBLZXJtaXQgcGFyc2VzIGEgZmlsZSBzcGVjaWZpY2F0aW9uIGRpcmVjdGx5LAogICBob3dldmVyLCBpdCB1c2VzIHRoZSBzdHJpY3Qgd2lsZGNhcmQgZGVmaW5pdGlvbi4gRm9yIGV4YW1wbGUsICJzZW5kCiAgIGEqYiIgc2VuZHMgYWxsIGZpbGVzIHdob3NlIG5hbWVzIHN0YXJ0IHdpdGggImEiIGFuZCBlbmQgd2l0aCAiYiIgaW4KICAgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBhbmQgbm90IGFueSBmaWxlcyB3aG9zZSBuYW1lcyBlbmQgd2l0aCAiYiIgdGhhdAogICBoYXBwZW4gdG8gYmUgaW4gc3ViZGlyZWN0b3JpZXMgd2hvc2UgbmFtZXMgc3RhcnQgd2l0aCAiYSIuIEFuZCBhcwogICBub3RlZCwgd2lsZGNhcmRzIGFyZSBhbmNob3JlZCwgc28gImRlbGV0ZSBmb28iIGRlbGV0ZXMgdGhlIGZpbGUgbmFtZWQKICAgImZvbyIsIGFuZCBub3QgYWxsIGZpbGVzIHdob3NlIG5hbWVzIGhhcHBlbiB0byBjb250YWluICJmb28iLgoKICAgTW9zdCBvdGhlciBwYXR0ZXJucyBhcmUgYW5jaG9yZWQuIEZvciBleGFtcGxlOgoKICBpZiBtYXRjaCBhYmMgYmMgLi4uCgogICBkb2VzIG5vdCBzdWNjZWVkIChhbmQgeW91IHdvdWxkIGJlIHN1cnByaXNlZCBpZiBpdCBkaWQhKS4gSW4gZmFjdCwgdGhlCiAgIG9ubHkgZmxvYXRpbmcgcGF0dGVybnMgYXJlIHRoZSBvbmVzIHVzZWQgYnkgY29tbWFuZHMgb3IgZnVuY3Rpb25zIHRoYXQKICAgc2VhcmNoIGZvciBwYXR0ZXJucyBpbiBmaWxlcywgYXJyYXlzLCBvciBzdHJpbmdzLiBUaGVzZSBpbmNsdWRlOgoKICAgICAqIFRoZSBHUkVQIGFuZCBUWVBFIC9NQVRDSCBjb21tYW5kcy4KICAgICAqIFRoZSBcZnNlYXJjaCgpLCBcZnJzZWFyY2goKSwgYW5kIFxmYXJyYXlsb29rKCkgZnVuY3Rpb25zLgoKICAgVGh1cyB0aGVzZSBhcmUgdGhlIG9ubHkgY29udGV4dHMgaW4gd2hpY2ggZXhwbGljaXQgYW5jaG9ycyAoIl4iIGFuZAogICAiJCIpIG1heSBiZSB1c2VkOgoKICAgZ3JlcCBhYmMgKi50eHQKICAgICAgICAgIFByaW50cyBhbGwgbGluZXMgY29udGFpbmluZyAiYWJjIiBpbiBhbGwgZmlsZXMgd2hvc2UgbmFtZXMgZW5kCiAgICAgICAgICB3aXRoICIudHh0Ii4KCiAgIGdyZXAgXmFiYyAqLnR4dAogICAgICAgICAgUHJpbnRzIGFsbCBsaW5lcyB0aGF0IHN0YXJ0IHdpdGggImFiYyIgaW4gYWxsICIudHh0IiBmaWxlcy4KCiAgIGdyZXAgYWJjJCAqLnR4dAogICAgICAgICAgUHJpbnRzIGFsbCBsaW5lcyB0aGF0IGVuZCB3aXRoICJhYmMiIGluIGFsbCAiLnR4dCIgZmlsZXMuCgogICBncmVwIF5hKnokICoudHh0CiAgICAgICAgICBQcmludHMgYWxsIGxpbmVzIHRoYXQgc3RhcnQgd2l0aCAiYSIgYW5kIGVuZCB3aXRoICJ6IiBpbiBhbGwKICAgICAgICAgICIudHh0IiBmaWxlcy4KCiAgIFNpbWlsYXJseSBmb3IgVFlQRSAvUEFHRSwgL2ZzZWFyY2goKSwgL2Zyc2VhcmNoKCksIGFuZCBcZmFycmF5bG9vaygpLgoKICAgSGVyZSBpcyBhIGJyaWVmIHN1bW1hcnkgb2YgYW5jaG9yZWQgYW5kIGZsb2F0aW5nIHBhdHRlcm4gZXF1aXZhbGVuY2VzOgoKICBBbmNob3JlZCAgIEZsb2F0aW5nCiAgICBhYmMgICAgICAgXmFiYyQKICAgICphYmMgICAgICBhYmMkCiAgICBhYmMqICAgICAgXmFiYwogICAgKmFiYyogICAgIGFiYwoKICAgWyBbNDY0XVRvcCBdIFsgWzQ2NV1Db250ZW50cyBdIFsgWzQ2Nl1DLUtlcm1pdCBIb21lIF0gWyBbNDY3XUtlcm1pdAogICBIb21lIF0KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICA4LjEzLiBEYXRlcyBhbmQgVGltZXMKCiAgIEMtS2VybWl0J3MgY29tcHJlaGVuc2lvbiBvZiBkYXRlLXRpbWUgZm9ybWF0cyBpcyBjb25zaWRlcmFibHkgZXhwYW5kZWQKICAgaW4gdmVyc2lvbiA4LjAuIEFueSBjb21tYW5kIHRoYXQgcmVhZHMgZGF0ZXMsIGluY2x1ZGluZyB0aGUgREFURQogICBjb21tYW5kIGl0c2VsZiwgb3IgYW55IHN3aXRjaCwgc3VjaCBhcyB0aGUgL0JFRk9SRTogYW5kIC9BRlRFUjoKICAgc3dpdGNoZXMsIG9yIGFueSBmdW5jdGlvbiBzdWNoIGFzIFxmY3Z0ZGF0ZSgpLCBub3cgY2FuIHVuZGVyc3RhbmQKICAgZGF0ZXMgYW5kIHRpbWVzIGV4cHJlc3NlZCBpbiBhbnkgSVNPIDg2MDEgZm9ybWF0LCBpbiBVbml4ICJhc2N0aW1lIgogICBmb3JtYXQsIGluIEZUUCBNRFRNIGZvcm1hdCwgYW5kIGluIHByYWN0aWNhbGx5IGFueSBmb3JtYXQgdXNlZCBpbiBSRkMKICAgODIyIG9yIFJGQyAyODIyIGVsZWN0cm9uaWMgbWFpbCwgd2l0aCBvciB3aXRob3V0IHRpbWV6b25lcywgYW5kIGluIGEKICAgZ3JlYXQgbWFueSBvdGhlciBmb3JtYXRzIGFzIHdlbGwuIEhFTFAgREFURSBicmllZmx5IHN1bW1hcml6ZXMgdGhlCiAgIGFjY2VwdGFibGUgZGF0ZS10aW1lIGZvcm1hdHMuCgogICBGdXJ0aGVybW9yZSwgQy1LZXJtaXQgOC4wIGluY2x1ZGVzIGEgbmV3IGFuZCBlYXN5LXRvLXVzZSBmb3JtIG9mCiAgIGRhdGUtdGltZSBhcml0aG1ldGljLCBpbiB3aGljaCBhbnkgZGF0ZSBvciB0aW1lIGNhbiBiZSBjb21iaW5lZCB3aXRoIGEKICAgImRlbHRhIHRpbWUiLCB0byBhZGQgb3Igc3VidHJhY3QgdGhlIGRlc2lyZWQgdGltZSBpbnRlcnZhbCAoeWVhcnMsCiAgIG1vbnRocywgd2Vla3MsIGRheXMsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzKSB0by9mcm9tIHRoZSBnaXZlbiBkYXRlLgogICBBbmQgbmV3IGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlIHRvIGNvbXBhcmUgZGF0ZXMgYW5kIHRvIGNvbXB1dGUgdGhlaXIKICAgZGlmZmVyZW5jZXMuCgogICBBcyB5b3UgY2FuIGltYWdpbmUsIGFsbCB0aGlzIHJlcXVpcmVzIHF1aXRlIGEgYml0IG9mICJzeW50YXgiLiBUaGUKICAgYmFzaWMgZm9ybWF0IGlzOgoKICBbIGRhdGUgXSBbIHRpbWUgXSBbIGRlbHRhIF0KCiAgIEVhY2ggZmllbGQgaXMgb3B0aW9uYWwsIGJ1dCBpbiBtb3N0IGNhc2VzIChkZXBlbmRpbmcgb24gdGhlIGNvbnRleHQpCiAgIHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGZpZWxkLiBJZiBhIGRhdGUgaXMgZ2l2ZW4sIGl0IG11c3QgY29tZQogICBmaXJzdC4gSWYgbm8gZGF0ZSBpcyBnaXZlbiwgdGhlIGN1cnJlbnQgZGF0ZSBpcyBhc3N1bWVkLiBJZiBubyB0aW1lIGlzCiAgIGdpdmVuLCBhbiBhcHByb3ByaWF0ZSB0aW1lIGlzIHN1cHBsaWVkIGRlcGVuZGluZyBvbiB3aGV0aGVyIGEgZGF0ZSB3YXMKICAgc3VwcGxpZWQuIElmIG5vIGRlbHRhIGlzIGdpdmVuLCBubyBhcml0aG1ldGljIGlzIGRvbmUuIElmIGEgZGVsdGEgaXMKICAgZ2l2ZW4gd2l0aG91dCBhIGRhdGUgb3IgdGltZSwgdGhlIGN1cnJlbnQgZGF0ZSBhbmQgdGltZSBhcmUgdXNlZCBhcwogICB0aGUgYmFzZS4KCiAgIERhdGUtdGltZS1kZWx0YSBmaWVsZHMgYXJlIGxpa2VseSB0byBjb250YWluIHNwYWNlcyAoYWx0aG91Z2ggdGhleQogICBuZWVkIG5vdDsgc3BhY2UtZnJlZSBmb3JtcyBhcmUgYWx3YXlzIGF2YWlsYWJsZSkuIFRoZXJlZm9yZSwgaW4gbW9zdAogICBjb250ZXh0cyAtLSBhbmQgbm90YWJseSBhcyBzd2l0Y2ggYXJndW1lbnRzIC0tIGRhdGUtdGltZSBpbmZvcm1hdGlvbgogICBtdXN0IGJlIGVuY2xvc2VkIGluIGJyYWNlcyBvciBkb3VibGVxdW90ZXMsIGZvciBleGFtcGxlOgoKICBzZW5kIC9hZnRlcjoiOC1BdWctMjAwMSAxMjowMCBVVEMiICoudHh0CgogICBLZXJtaXQncyBzdGFuZGFyZCBpbnRlcm5hbCBmb3JtYXQgZm9yIGRhdGVzIGFuZCB0aW1lcyBpczoKCiAgeXl5eW1tZGQgaGg6bW06c3MKCiAgIGZvciBleGFtcGxlOgoKICAyMDAxMDIwOCAxMDoyODowMQoKICAgRGF0ZS10aW1lcyBjYW4gYWx3YXlzIGJlIGdpdmVuIGluIHRoaXMgZm9ybWF0LiB5eXl5IGlzIHRoZSA0LWRpZ2l0CiAgIHllYXIsIG1tIGlzIHRoZSB0d28tZGlnaXQgbW9udGggKDEtMTI7IHN1cHBseSBsZWFkaW5nIHplcm8gZm9yCiAgIEphbi1TZXApLCBkZCBpcyB0aGUgMi1kaWdpdCBkYXkgKGxlYWRpbmcgemVybyBmb3IgMS05KSwgaGggaXMgdGhlIGhvdXIKICAgKDAtMjMpLCBtbSB0aGUgbWludXRlICgwLTU5KSwgc3MgdGhlIHNlY29uZCAoMC01OSksIGVhY2ggd2l0aCBsZWFkaW5nCiAgIHplcm8gaWYgbGVzcyB0aGFuIHRoZSBmaWVsZCB3aWR0aC4gVGhlIGRhdGUgYW5kIHRpbWUgY2FuIGJlIHNlcGFyYXRlZAogICBieSBhIHNwYWNlLCBhbiB1bmRlcnNjb3JlLCBhIGNvbG9uLCBvciB0aGUgbGV0dGVyIFQuIFRoZSB0aW1lIGlzIGluCiAgIDI0LWhvdXIgZm9ybWF0LiBUaHVzIHRoZSB2YXJpb3VzIHF1YW50aXRlcyBhcmUgYXQgdGhlIGZvbGxvd2luZyBmaXhlZAogICBwb3NpdGlvbnM6CgpQb3NpdGlvbiAgQ29udGVudHMgICAgICAgICAgICAgICAgICAgIAogICAxLTQgICAgWWVhciAgICg0IGRpZ2l0cywgMDAwMC05OTk5KQogICA1LTYgICAgTW9udGggICgyIGRpZ2l0cywgMS0xMikKICAgNy04ICAgIERheSAgICAoMiBkaWdpdHMsIDEtMzEpCiAgIDkgICAgICBEYXRlLVRpbWUgU2VwYXJhdG9yIChzcGFjZSwgOiwgXywgb3IgdGhlIGxldHRlciBUKQogIDEwLTExICAgSG91ciAgICgyIGRpZ2l0cywgMC0yMykKICAxMiAgICAgIEhvdXItTWludXRlIFNlcGFyYXRvciAoY29sb24pCiAgMTMtMTQgICBNaW51dGUgKDIgZGlnaXRzLCAwLTU5KQogIDE1ICAgICAgTWludXRlLVNlY29uZCBTZXBhcmF0b3IgKGNvbG9uKQogIDE2LTE3ICAgU2Vjb25kICgyIGRpZ2l0cywgMC01OSkKCiAgIEV4YW1wbGU6CgogIDE5ODAwNTI2IDEzOjA3OjEyICAyNiBNYXkgMTk4MCwgMTM6MDc6MTIgKDE6MDc6MTJQTSkKCiAgIFRoaXMgaXMgdGhlIGZvcm1hdCBwcm9kdWNlZCBieSB0aGUgREFURSBjb21tYW5kIGFuZCBieSBhbnkgZnVuY3Rpb24KICAgdGhhdCByZXR1cm5zIGEgZGF0ZS10aW1lLiBJdCBpcyBzdWl0YWJsZSBmb3IgbGV4aWNhbCBjb21wYXJpc29uIGFuZAogICBzb3J0aW5nLCBhbmQgZm9yIHVzZSBhcyBhIGRhdGUtdGltZSBpbiBhbnkgS2VybWl0IGNvbW1hbmQuIFdoZW4gdGhpcwogICBmb3JtYXQgaXMgZ2l2ZW4gYXMgaW5wdXQgdG8gYSBjb21tYW5kIG9yIGZ1bmN0aW9uLCB2YXJpb3VzIGRhdGUtdGltZQogICBzZXBhcmF0b3JzIChhcyBub3RlZCkgYXJlIGFjY2VwdGVkOgoKICAxOTgwMDUyNiAxMzowNzoxMiAgMjYgTWF5IDE5ODAsIDEzOjA3OjEyICgxOjA3OjEyUE0pCiAgMjAwMTAyMDhfMTA6Mjg6MzUgIDIgRmVicnVhcnkgMjAwMSwgMTA6Mjg6MzUgQU0KICAxODU4MDEwMToxMjowMDowMCAgMSBKYW51YXJ5IDE4NTgsIG5vb24KICAyMDExMDIwOFQwMDowMDowMCAgMiBGZWJydWFyeSAyMDExLCBtaWRuaWdodAoKICAgQ2VydGFpbiBvdGhlciBzcGVjaWFsIGRhdGUtdGltZSBmb3JtYXRzIHRoYXQgYXJlIGVuY291bnRlcmVkIG9uCiAgIGNvbXB1dGVyIG5ldHdvcmtzIGFyZSByZWNvZ25pemVkOgoKICAgQXNjdGltZSBGb3JtYXQKICAgICAgICAgIFRoaXMgaXMgYSBmaXhlZCBmb3JtYXQgdXNlZCBieSBVbml4LCBuYW1lZCBhZnRlciBVbml4J3MKICAgICAgICAgIGFzY3RpbWUoKSAoIkFTQ0lJIHRpbWUiKSBmdW5jdGlvbi4gSXQgaXMgYWx3YXlzIGV4YWN0bHkgMjQKICAgICAgICAgIGNoYXJhY3RlcnMgbG9uZy4gRXhhbXBsZTogRnJpIEF1ZyAxMCAxNjozODowMSAyMDAxCgogICBBc2N0aW1lIHdpdGggVGltZXpvbmUKICAgICAgICAgIFRoaXMgaXMgbGlrZSBBc2N0aW1lIGZvcm1hdCwgYnV0IGluY2x1ZGVzIGEgMy1jaGFyYWN0ZXIKICAgICAgICAgIHRpbWV6b25lIGJldHdlZW4gdGhlIHRpbWUgYW5kIHllYXIuIEl0IGlzIGV4YWN0bHkgMjggY2hhcmFjdGVycwogICAgICAgICAgbG9uZy4gRXhhbXBsZTogRnJpIEF1ZyAxMCAxNjozODowMSBHTVQgMjAwMQoKICAgRS1NYWlsIEZvcm1hdAogICAgICAgICAgRS1tYWlsIGRhdGUtdGltZSBmb3JtYXRzIGFyZSBkZWZpbmVkIGluIFs0NjhdUkZDIDI4MjIgd2l0aCBhCiAgICAgICAgICBmYWlyIGFtb3VudCBvZiBmbGV4aWJpbGl0eSBhbmQgb3B0aW9ucy4gVGhlIGZvbGxvd2luZyBleGFtcGxlcwogICAgICAgICAgYXJlIHR5cGljYWwgb2YgZS1tYWlscyBhbmQgSFRUUCAod2ViLXBhZ2UpIGhlYWRlcnM6CgogIFNhdCwgMTQgSnVsIDIwMDEgMTE6NDk6MjkgICAgICAgICAgICAgICAgKE5vIHRpbWV6b25lKQogIEZyaSwgMjQgTWFyIDIwMDAgMTQ6MTk6NTkgRVNUICAgICAgICAgICAgKFN5bWJvbGljIHRpbWV6b25lKQogIFR1ZSwgMjYgSnVuIDIwMDEgMTA6MTk6NDUgLTA0MDAgKEVEVCkgICAgKEdNVCBPZmZzZXQgKyBjb21tZW50KQoKICAgRlRQIE1EVE0gRm9ybWF0CiAgICAgICAgICBUaGlzIGlzIHRoZSBkYXRlLXRpbWUgZm9ybWF0IHN1cHBsaWVkIGJ5IEZUUCBzZXJ2ZXJzIHRoYXQKICAgICAgICAgIHN1cHBvcnQgdGhlIChub3QgeWV0IHN0YW5kYXJkIGJ1dCB3aWRlbHkgdXNlZCBuZXZlcnRoZWxlc3MpCiAgICAgICAgICBNRFRNIGNvbW1hbmQsIGJ5IHdoaWNoIHRoZSBGVFAgY2xpZW50IGFza3MgZm9yIGEgZmlsZSdzCiAgICAgICAgICBtb2RpZmljYXRpb24gdGltZToKCiAgeXl5eW1tZGRoaG1tc3NbLmZmZmZdCgogICAgICAgICAgd2hlcmUgeXl5eSBpcyB0aGUgNC1kaWdpdCB5ZWFyLCBtbSBpcyB0aGUgMi1kaWdpdCBtb250aCwgYW5kIHNvCiAgICAgICAgICBvbiwgZXhhY3RseSAxNCBkaWdpdHMgbG9uZy4gQW4gb3B0aW9uYWwgZnJhY3Rpb25hbCBwYXJ0CiAgICAgICAgICAoZnJhY3Rpb24gb2Ygc2Vjb25kKSBtYXkgYWxzbyBiZSBpbmNsdWRlZCwgc2VwYXJhdGVkIGJ5IGEKICAgICAgICAgIGRlY2ltYWwgcG9pbnQgKHBlcmlvZCkuIEtlcm1pdCByb3VuZHMgdG8gdGhlIG5lYXJlc3Qgc2Vjb25kLgogICAgICAgICAgRXhhbXBsZToKCiAgMjAwMjAyMDgxMDI4MzUuNTE1ICAgICAgICAgICAgICAgICAgICAgICAoOCBGZWJydWFyeSAyMDAyIDEwOjI4OjM2IEFNKQoKICAgIDguMTMuMS4gVGhlIERhdGUKCiAgIFRoZSBkYXRlLCBpZiBnaXZlbiwgbXVzdCBwcmVjZWRlIHRoZSB0aW1lIGFuZC9vciBkZWx0YSwgYW5kIGNhbiBiZSBpbgogICBtYW55LCBtYW55IGZvcm1hdHMuIEZvciBzdGFydGVycywgeW91IGNhbiB1c2Ugc2V2ZXJhbCBzeW1ib2xpYyBkYXRlCiAgIG5hbWVzIGluIHBsYWNlIG9mIGFjdHVhbCBkYXRlczoKCiAgIE5PVwogICAgICAgICAgVGhpcyBpcyByZXBsYWNlZCBieSB0aGUgY3VycmVudCBkYXRlIGFuZCB0aW1lLiBUaGUgdGltZSBjYW4gbm90CiAgICAgICAgICBiZSBvdmVycmlkZW4gKGlmIHlvdSB3YW50IHRvIHN1cHBseSBhIHNwZWNpZmljIHRpbWUsIHVzZSBUT0RBWQogICAgICAgICAgcmF0aGVyIHRoYW4gTk9XKS4KCiAgIFRPREFZCiAgICAgICAgICBUaGlzIGlzIHJlcGxhY2VkIGJ5IHRoZSBjdXJyZW50IGRhdGUgYW5kIGEgZGVmYXVsdCB0aW1lIG9mCiAgICAgICAgICAwMDowMDowMCBpcyBzdXBwbGllZCwgYnV0IGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgc3BlY2lmaWMgdGltZTsKICAgICAgICAgIGZvciBleGFtcGxlLCBpZiB0b2RheSBpcyA4IEZlYnJ1YXJ5IDIwMDIsIHRoZW4gIlRPREFZIiBpcwogICAgICAgICAgIjIwMDIwODAyIDAwOjAwOjAwIiBidXQgIlRPREFZIDEwOjI4IiBpcyAiMjAwMjA4MDIgMTA6Mjg6MDAiLgoKICAgVE9NT1JST1cKICAgICAgICAgIExpa2UgVE9EQVksIGJ1dCBvbmUgZGF5IGxhdGVyIChpZiB0b2RheSBpcyA4IEZlYnJ1YXJ5IDIwMDIsCiAgICAgICAgICB0aGVuICJUT01PUlJPVyIgaXMgIjIwMDIwODAzIDAwOjAwOjAwIiBidXQgIlRPTU9SUk9XIDE2OjMwIiBpcwogICAgICAgICAgIjIwMDIwODAzIDE2OjMwOjAwIikuCgogICBZRVNURVJEQVkKICAgICAgICAgIExpa2UgVE9EQVksIGJ1dCBvbmUgZGF5IGVhcmxpZXIuCgogICBNT05EQVksIFRVRVNEQVksIFdFRE5FU0RBWSwgLi4uLCBTVU5EQVkKICAgICAgICAgIFRoZSBkYXRlIG9uIHRoZSBnaXZlbiBkYXkgb2YgdGhlIHdlZWssIHRvZGF5IG9yIGxhdGVyLiBBCiAgICAgICAgICBkZWZhdWx0IHRpbWUgb2YgMDA6MDA6MDAgaXMgc3VwcGxpZWQgYnV0IGNhbiBiZSBvdmVycmlkZGVuLgogICAgICAgICAgRXhhbXBsZTogIlNBVFVSREFZIDEyOjAwIiBtZWFucyBuZXh0IFNhdHVyZGF5IChvciB0b2RheSwgaWYKICAgICAgICAgIHRvZGF5IGlzIFNhdHVyZGF5KSBhdCBub29uLgoKICAgWW91IGNhbiBnaXZlIGFuIGV4cGxpY2l0IGRhdGUgaW4gYWxtb3N0IGFueSBjb25jZWl2YWJsZSBmb3JtYXQsIGJ1dAogICB0aGVyZSBhcmUgc29tZSBydWxlczoKCiAgICAgKiBJZiBhIGRhdGUgaXMgZ2l2ZW4sIGl0IG11c3QgaGF2ZSB0aHJlZSBmaWVsZHM6IGRheSwgbW9udGgsIGFuZAogICAgICAgeWVhcjsgdGhlIG9yZGVyIGNhbiB2YXJ5IChleGNlcHQgdGhhdCB0aGUgbW9udGggY2FuIG5vdCBiZSBsYXN0KS4KICAgICAqIElmIG5hbWVzIGFyZSB1c2VkIGZvciBkYXlzLCBtb250aHMsIGV0YywgdGhleSBtdXN0IGJlIEVuZ2xpc2guCiAgICAgKiBUaGUgeWVhciBtdXN0IGxpZSBiZXR3ZWVuIDAwMDAgYW5kIDk5OTksIGluY2x1c2l2ZS4KICAgICAqIEFsbCBjYWxlbmRhciBjYWxjdWxhdGlvbnMgdXNlIEdyZWdvcmlhbiBkYXRpbmcsIHNvIGNhbGN1bGF0ZWQKICAgICAgIGRhdGVzIGZvciB5ZWFycyBwcmlvciB0byAxNTgyIChvciBsYXRlciwgZGVwZW5kaW5nIG9uIHRoZSBjb3VudHJ5KQogICAgICAgd2lsbCBub3QgYWdyZWUgd2l0aCBoaXN0b3JpY2FsIGRhdGVzLiBPdGhlciBmb3JtcyBvZiBkYXRpbmcgKGUuZy4KICAgICAgIEhlYnJldywgQ2hpbmVzZSkgYXJlIG5vdCBzdXBwb3J0ZWQuCgogICBWYXJpb3VzIGRhdGUtZmllbGQgc2VwYXJhdG9ycyBhcmUgYWNjZXB0ZWQ6IGh5cGhlbiwgc2xhc2gsIHNwYWNlLAogICB1bmRlcnNjb3JlLCBwZXJpb2QuIFRoZSBzYW1lIGZpZWxkIHNlcGFyYXRvciAoaWYgYW55KSBtdXN0IGJlIHVzZWQgaW4KICAgYm90aCBwbGFjZXM7IGZvciBleGFtcGxlIDE4LVNlcC0yMDAxIGJ1dCBub3QgMTgtU2VwLzIwMDEuIE1vbnRocyBjYW4KICAgYmUgbnVtZXJpYyAoMS0xMikgb3IgRW5nbGlzaCBuYW1lcyBvciBhYmJyZXZpYXRpb25zLiBNb250aCBuYW1lCiAgIGFiYnJldmlhdGlvbnMgYXJlIG5vcm1hbGx5IHRocmVlIGxldHRlcnMsIGUuZy4gQXByLCBNYXksIEp1biwgSnVsLgogICBDYXBpdGFsaXphdGlvbiBkb2Vzbid0IG1hdHRlci4KCiAgIEhlcmUgYXJlIGEgZmV3IGV4YW1wbGVzOgoKICAxOCBTZXAgMjAwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChFbmdsaXNoIG1vbnRoLCBhYmJyZXZpYXRlZCkKICAxOCBTZXB0ZW1iZXIgMjAwMSAgICAgICAgICAgICAgICAgICAgICAgIChFbmdsaXNoIG1vbnRoLCBzcGVsbGVkIG91dCkKICAyMDAxIFNlcHQgMTggICAgICAgICAgICAgICAgICAgICAgICAgICAgIChZZWFyLCBtb250aCwgZGF5KQogIDE4LVNlcC0yMDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdpdGggaHlwaGVucykKICAxOC8wOS8yMDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBbGwgbnVtZXJpYyB3aXRoIHNsYXNoZXMpCiAgMTguMDkuMjAwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRGl0dG8sIHdpdGggcGVyaW9kcykKICAxOF8wOV8yMDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEaXR0bywgd2l0aCB1bmRlcnNjb3JlcykKICAwOS8xOC8yMDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTZWUgYmVsb3cpCiAgMjAwMS8wOS8xOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU2VlIGJlbG93KQogIFNlcHRlbWJlciAxOCwgMjAwMSAgICAgICAgICAgICAgICAgICAgICAgKENvcnJlc3BvbmRlbmNlIHN0eWxlKQogIFNlcC0xOC0yMDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1vbnRoLWRheS15ZWFyKQogIDIwMDEwOTE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE51bWVyaWMsIG5vIHNlcGFyYXRvcnMpCgogICBZb3UgY2FuIGFsc28gaW5jbHVkZSB0aGUgZGF5IG9mIHRoZSB3ZWVrIHdpdGggYSBzcGVjaWZpYyBkYXRlLCBpbgogICB3aGljaCBjYXNlIGl0IGlzIGFjY2VwdGVkIChpZiBpdCBpcyBhIHZhbGlkIGRheSBuYW1lKSwgYnV0IG5vdAogICB2ZXJpZmllZCB0byBhZ3JlZSB3aXRoIHRoZSBnaXZlbiBkYXRlOgoKICBUdWUsIDE4IFNlcCAyMDAxICAgICAgICAgICAgICAgICAgICAgICAgIChBYmJyZXZpYXRlZCwgd2l0aCBjb21tYSkKICBUdWUsMTggU2VwIDIwMDEgICAgICAgICAgICAgICAgICAgICAgICAgIChDb21tYSBidXQgbm8gc3BhY2UpCiAgVHVlIDE4IFNlcCAyMDAxICAgICAgICAgICAgICAgICAgICAgICAgICAoQWJicmV2aWF0ZWQsIG5vIGNvbW1hKQogIFR1ZXNkYXkgMTggU2VwIDIwMDEgICAgICAgICAgICAgICAgICAgICAgKFNwZWxsZWQgb3V0KQogIFR1ZXNkYXksIDE4IFNlcCAyMDAxICAgICAgICAgICAgICAgICAgICAgKGV0YykKICBGcmlkYXksIDE4IFNlcCAyMDAxICAgICAgICAgICAgICAgICAgICAgIChBY2NlcHRlZCBldmVuIGlmIG5vdCBGcmlkYXkpCgogICBJbiBhbGwtbnVtZXJpYyBkYXRlcyB3aXRoIHRoZSB5ZWFyIGxhc3QsIHN1Y2ggYXMgMTgvMDkvMjAwMSwgS2VybWl0CiAgIGlkZW50aWZpZXMgdGhlIHllYXIgYmVjYXVzZSBpdCdzIDQgZGlnaXRzLCB0aGVuIGRlY2lkZXMgd2hpY2ggb2YgdGhlCiAgIG90aGVyIHR3byBudW1iZXJzIGlzIHRoZSBtb250aCBvciBkYXkgYmFzZWQgb24gaXRzIHZhbHVlLiBJZiBib3RoIGFyZQogICAxMiBvciBsZXNzIGFuZCBhcmUgdW5lcXVhbCwgdGhlIGRhdGUgaXMgYW1iaWd1b3VzIGFuZCBpcyByZWplY3RlZC4gSW4KICAgYWxsLW51bWVyaWMgZGF0ZXMgd2l0aCB0aGUgeWVhciBmaXJzdCwgdGhlIHNlY29uZCBmaWVsZCBpcyBhbHdheXMgdGhlCiAgIG1vbnRoIGFuZCB0aGUgdGhpcmQgaXMgdGhlIGRheS4gVGhlIG1vbnRoIG5ldmVyIGNvbWVzIGxhc3QuIEEgZGF0ZQogICB3aXRoIG5vIHNlcGFyYXRvcnMgaXMgYWNjZXB0ZWQgb25seSBpZiBpdCBpcyBhbGwgbnVtZXJpYyBhbmQgaGFzCiAgIGV4YWN0bHkgZWlnaHQgZGlnaXRzLCBhbmQgaXMgYXNzdW1lZCB0byBiZSBpbiB5eXl5bW1kZCBmb3JtYXQuCgogIDIwMDEwOTE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE4LVNlcC0yMDAxIDAwOjAwOjAwKQoKICAgb3IgMTQgZGlnaXRzIChhcyBpbiBGVFAgTURUTSBmb3JtYXQpOgoKICAyMDAxMDkxODEyMzQ1NiAgICAgICAgICAgICAgICAgICAgICAgICAgICgxOC1TZXAtMjAwMSAxMjozNDo1NikKCiAgIFlvdSBjYW4gYWx3YXlzIGF2b2lkIGFtYmlndWl0eSBieSBwdXR0aW5nIHRoZSB5ZWFyIGZpcnN0LCBvciBieSB1c2luZwogICBhbiBFbmdsaXNoLCByYXRoZXIgdGhhbiBudW1lcmljLCBtb250aC4gQSBkYXRlIHN1Y2ggYXMgMDkvMDgvMjAwMQogICB3b3VsZCBiZSBhbWJpZ3VvdXMgYnV0IDIwMDEvMDkvMDggaXMgbm90LCBub3IgaXMgMDktQXVnLTIwMDEuCgogICBVbnRpbCB0aGUgbGF0ZSAxOTkwcywgaXQgd2FzIGNvbW1vbiB0byBlbmNvdW50ZXIgMi1kaWdpdCB5ZWFycywgYW5kCiAgIHRoZXNlIGFyZSBmb3VuZCB0byB0aGlzIGRheSBpbiBvbGQgZS1tYWlscyBhbmQgb3RoZXIgZG9jdW1lbnRzLiBLZXJtaXQKICAgYWNjZXB0cyB0aGVzZSBkYXRlcyBpZiB0aGV5IGhhdmUgRW5nbGlzaCBtb250aHMsIGFuZCBpbnRlcnByZXRzIHRoZW0KICAgYWNjb3JkaW5nIHRvIHRoZSB3aW5kb3dpbmcgcnVsZXMgb2YgWzQ2OV1SRkMgMjgyMjogIklmIGEgdHdvIGRpZ2l0CiAgIHllYXIgaXMgZW5jb3VudGVyZWQgd2hvc2UgdmFsdWUgaXMgYmV0d2VlbiAwMCBhbmQgNDksIHRoZSB5ZWFyIGlzCiAgIGludGVycHJldGVkIGJ5IGFkZGluZyAyMDAwLCBlbmRpbmcgdXAgd2l0aCBhIHZhbHVlIGJldHdlZW4gMjAwMCBhbmQKICAgMjA0OS4gSWYgYSB0d28gZGlnaXQgeWVhciBpcyBlbmNvdW50ZXJlZCB3aXRoIGEgdmFsdWUgYmV0d2VlbiA1MCBhbmQKICAgOTksIG9yIGFueSB0aHJlZSBkaWdpdCB5ZWFyIGlzIGVuY291bnRlcmVkLCB0aGUgeWVhciBpcyBpbnRlcnByZXRlZCBieQogICBhZGRpbmcgMTkwMC4iCgogICBJZiB5b3UgbmVlZCB0byBzcGVjaWZ5IGEgeWVhciBwcmlvciB0byAxMDAwLCB1c2UgbGVhZGluZyB6ZXJvcyB0bwogICBlbnN1cmUgaXQgaXMgbm90IG1pc2ludGVycHJldGVkIGFzIGEgIm5vbi1ZMkstY29tcGxpYW50IiBtb2Rlcm4geWVhcjoKCiAgNy1PY3QtNzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTk3NzEwMDcgMDA6MDA6MDApCiAgNy1PY3QtMDA3NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMDA3NzEwMDcgMDA6MDA6MDApCgogICAgOC4xMy4yLiBUaGUgVGltZQoKICAgVGhlIGJhc2ljIHRpbWUgZm9ybWF0IGlzIGhoOm1tOmRkOyB0aGF0IGlzIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLAogICBzZXBhcmF0ZWQgYnkgY29sb25zLCBwZXJoYXBzIHdpdGggYW4gb3B0aW9uYWwgZnJhY3Rpb25hbCBzZWNvbmQKICAgc2VwYXJhdGVkIGJ5IGEgZGVjaW1hbCBwb2ludCAocGVyaW9kKS4gVGhlIGhvdXJzIGFyZSBpbiAyNC1ob3VyCiAgIGZvcm1hdDsgMTIgaXMgbm9vbiwgMTMgaXMgMXBtLCBhbmQgc28gb24uIEZpZWxkcyBvbWl0dGVkIGZyb20gdGhlCiAgIHJpZ2h0IGRlZmF1bHQgdG8gemVyby4gRmllbGRzIGNhbiBiZSBvbWl0dGVkIGZyb20gdGhlIGxlZnQgb3IgbWlkZGxlCiAgIGJ5IGluY2x1ZGluZyB0aGUgZmllbGQncyB0ZXJtaW5hdGluZyBjb2xvbi4gRXhhbXBsZXM6CgogIDExOjU5OjU5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDExOjU5OjU5IEFNKQogIDExOjU5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDExOjU5OjAwIEFNKQogIDExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDExOjAwOjAwIEFNKQogIDExOjU5OjU5LjMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDExOjU5OjU5IEFNKQogIDExOjU5OjU5LjY2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5vb24pCiAgMDM6MjE6MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMzoyMTowMCBBTSkKICAzOjIxOjAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgzOjIxOjAwIEFNKQogIDE1OjIxOjAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDM6MjE6MDAgUE0pCiAgOjIxOjAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMDA6MjE6MDAgQU0pCiAgOjowMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMDA6MDA6MDEgQU0pCiAgMTE6OjU5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTE6MDA6NTkgQU0pCgogICBMZWFkaW5nIHplcm9zIGNhbiBiZSBvbWl0dGVkLCBidXQgaXQgaXMgY3VzdG9tYXJ5IGFuZCBtb3JlIHJlYWRhYmxlIHRvCiAgIGtlZXAgdGhlbSBpbiB0aGUgbWludXRlIGFuZCBzZWNvbmQgZmllbGRzOgoKICAwMzowMjowMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwMzowMjowMSBBTSkKICAzOjAyOjAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwMzowMjowMSBBTSkKICAzOjI6MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwMzowMjowMSBBTSkKCiAgIEFNL1BNIG5vdGF0aW9uIGlzIGFjY2VwdGVkIGlmIHlvdSB3aXNoIHRvIHVzZSBpdDoKCiAgMTE6NTk6NTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTE6NTk6NTkgQU0pCiAgMTE6NTk6NTlBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTE6NTk6NTkgQU0pCiAgMTE6NTk6NTlBLk0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTE6NTk6NTkgQU0pCiAgMTE6NTk6NTlhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTE6NTk6NTkgQU0pCiAgMTE6NTk6NTlhLm0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTE6NTk6NTkgQU0pCiAgMTE6NTk6NTlQTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTE6NTk6NTkgUE0gPSAyMzo1OTo1OSkKICAxMTo1OTo1OVAuTS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxMTo1OTo1OSBQTSA9IDIzOjU5OjU5KQogIDExOjU5OjU5cG0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDExOjU5OjU5IFBNID0gMjM6NTk6NTkpCiAgMTE6NTk6NTlwLm0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTE6NTk6NTkgUE0gPSAyMzo1OTo1OSkKCiAgIFlvdSBjYW4gb21pdCB0aGUgY29sb25zIGlmIHlvdSB3aXNoLCBpbiB3aGljaCBjYXNlIEtlcm1pdCB1c2VzIHRoZQogICBmb2xsb3dpbmcgcnVsZXMgdG8gaW50ZXJwcmV0IHRoZSB0aW1lOgoKICAgIDEuIDYgZGlnaXRzIGlzIGhoOm1tOnNzLCBlLmcuIDEyMzQ1NiBpcyAxMjozNDo1Ni4KICAgIDIuIDUgZGlnaXRzIGlzIGg6bW06c3MsIGUuZy4gMTIzNDUgaXMgMToyMzo0NS4KICAgIDMuIDQgZGlnaXRzIGlzIGhoOm1tLCBlLmcuIDEyMzQgaXMgMTI6MzQuCiAgICA0LiAzIGRpZ2l0cyBpcyBoOm1tLCBlLmcuIDEyMyBpcyAxOjIzLgogICAgNS4gMiBkaWdpdHMgaXMgaGgsIGUuZy4gMTIgaXMgMTI6MDAuCiAgICA2LiAxIGRpZ2l0IGlzIGggKHRoZSBob3VyKSwgZS5nLiAxIGlzIDE6MDAuCgogICBFeGFtcGxlczoKCiAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMDE6MDA6MDAgQU0pCiAgMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTA6MDA6MDAgQU0pCiAgMjMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMDI6MzA6MDAgQU0pCiAgMjMwcG0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMDI6MzA6MDAgUE0gPSAxNDozMDowMCkKICAxMTE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxMToxNTowMCBBTSkKICAyMzE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxMToxNTowMCBQTSA9IDIzOjE1OjAwIFBNKQogIDIzMTUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAyOjMxOjUwIEFNKQogIDIzMTUwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIzOjE1OjAwIFBNKQoKICAgIDguMTMuMy4gVGltZSBab25lcwoKICAgSWYgYSB0aW1lIGlzIGdpdmVuLCBpdCBjYW4gKGJ1dCBuZWVkIG5vdCkgYmUgZm9sbG93ZWQgYnkgYSB0aW1lIHpvbmUKICAgZGVzaWduYXRvci4gSWYgbm8gdGltZSB6b25lIGlzIGluY2x1ZGVkLCB0aGUgdGltZSBpcyB0cmVhdGVkIGFzIGxvY2FsCiAgIHRpbWUgYW5kIG5vIHRpbWV6b25lIGNvbnZlcnNpb25zIGFyZSBwZXJmb3JtZWQuCgogICBUaGUgcHJlZmVycmVkIHRpbWUgem9uZSBkZXNpZ25hdG9yIGlzIHRoZSBVVEMgT2Zmc2V0LCBhcyBzcGVjaWZpZWQgaW4KICAgWzQ3MF1SRkMgMjgyMjogYSBwbHVzIHNpZ24gb3IgbWludXMgc2lnbiBpbW1lZGlhdGVseSBmb2xsb3dlZCBieQogICBleGFjdGx5IGZvdXIgZGVjaW1hbCBkaWdpdHMsIHNpZ25pZnlpbmcgdGhlIGRpZmZlcmVuY2UgaW4gaGggKGhvdXJzKQogICBhbmQgbW0gKG1pbnV0ZXMpIGZyb20gVW5pdmVyc2FsIENvb3JkaW5hdGVkIFRpbWUgKFVUQywgYWxzbyBrbm93biBhcwogICBHcmVlbndpY2ggTWVhbiBUaW1lLCBvciBHTVQpLCB3aXRoIG5lZ2F0aXZlIG51bWJlcnMgdG8gdGhlIFdlc3QgYW5kCiAgIHBvc2l0aXZlIG51bWJlcnMgdG8gdGhlIEVhc3QuIEZvciBleGFtcGxlOgoKICBGcmksIDEzIEp1bCAyMDAxIDEyOjU0OjI5IC0wNzAwCgogICBpbmRpY2F0ZXMgYSBsb2NhbCB0aW1lIG9mIDEyOjU0OjI5IHRoYXQgaXMgMDcgaG91cnMgYW5kIDAwIG1pbnV0ZXMKICAgYmVoaW5kIChsZXNzIHRoYW4sIEVhc3Qgb2YpIFVuaXZlcnNhbCBUaW1lLiBUaGUgc3BhY2UgaXMgb3B0aW9uYWwsIHNvCiAgIHRoZSBleGFtcGxlIGNvdWxkIGFsc28gYmUgd3JpdHRlbiBhczoKCiAgRnJpLCAxMyBKdWwgMjAwMSAxMjo1NDoyOS0wNzAwCgogICBUaGUgZm9sbG93aW5nIHN5bWJvbGljIHRpbWUgem9uZXMgYXJlIGFsc28gYWNjZXB0ZWQsIGFzIHNwZWNpZmllZCBieQogICBbNDcxXVJGQyAyODIyIGFuZC9vciBpbiBJU08gODYwMToKCiAgR01UICA9ICArMDAwMCAgICAgICBHcmVlbndpY2ggTWVhbiBUaW1lCiAgWiAgICA9ICArMDAwMCAgICAgICBadWx1IChaZXJvIE1lcmlkaWFuKSBUaW1lCiAgVVRDICA9ICArMDAwMCAgICAgICBVbml2ZXJzYWwgQ29vcmRpbmF0ZWQgVGltZQogIFVUICAgPSAgKzAwMDAgICAgICAgVW5pdmVyc2FsIFRpbWUKICBFRFQgID0gIC0wNDAwICAgICAgIEVhc3Rlcm4gKFVTQSkgRGF5bGlnaHQgVGltZQogIEVTVCAgPSAgLTA1MDAgICAgICAgRWFzdGVybiAoVVNBKSBTdGFuZGFyZCBUaW1lCiAgQ0RUICA9ICAtMDUwMCAgICAgICBDZW50cmFsIChVU0EpIERheWxpZ2h0IFRpbWUKICBDU1QgID0gIC0wNjAwICAgICAgIENlbnRyYWwgKFVTQSkgU3RhbmRhcmQgVGltZQogIE1EVCAgPSAgLTA2MDAgICAgICAgTW91bnRhaW4gKFVTQSkgRGF5bGlnaHQgVGltZQogIE1TVCAgPSAgLTA3MDAgICAgICAgTW91bnRhaW4gKFVTQSkgU3RhbmRhcmQgVGltZQogIFBEVCAgPSAgLTA3MDAgICAgICAgUGFjaWZpYyAoVVNBKSBEYXlsaWdodCBUaW1lCiAgUFNUICA9ICAtMDgwMCAgICAgICBQYWNpZmljIChVU0EpIFN0YW5kYXJkIFRpbWUKCiAgIE5vdGUgdGhhdCBHTVQsIFosIFVUQywgYW5kIFVUIGFsbCBleHByZXNzIHRoZSBzYW1lIGNvbmNlcHQ6IHN0YW5kYXJkCiAgIChub3QgZGF5bGlnaHQpIHRpbWUgYXQgdGhlIFplcm8gTWVyaWRpYW4uIFVUQywgYnkgdGhlIHdheSwgaXMgYW4KICAgaW50ZXJuYXRpb25hbCBzdGFuZGFyZCBzeW1ib2wgYW5kIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gdGhlIG9yZGVyIG9mCiAgIHRoZSBFbmdsaXNoIHdvcmRzLCBVbml2ZXJzYWwgQ29vcmRpbmF0ZWQgVGltZSwgYnV0IGl0IGhhcHBlbnMgdG8gaGF2ZQogICB0aGUgc2FtZSBpbml0aWFsIGxldHRlcnMgYXMgdGhlc2Ugd29yZHMuIE9mIGNvdXJzZSBodW5kcmVkcyBvZiBvdGhlcgogICBzeW1ib2xpYyB0aW1lem9uZXMgYW5kIHZhcmlhdGlvbnMgZXhpc3QsIGJ1dCB0aGV5IGFyZSBub3QKICAgc3RhbmRhcmRpemVkLCBhbmQgYXJlIHRoZXJlZm9yZSBub3Qgc3VwcG9ydGVkIGJ5IEtlcm1pdC4KCiAgIFdoZW4gYSB0aW1lIHpvbmUgaXMgaW5jbHVkZWQgd2l0aCBhIHRpbWUsIHRoZSB0aW1lIGlzIGNvbnZlcnRlZCB0bwogICBsb2NhbCB0aW1lLiBJbiBjYXNlIHRoZSBjb252ZXJzaW9uIGNyb3NzZXMgYSBtaWRuaWdodCBib3VuZGFyeSwgdGhlCiAgIGRhdGUgaXMgYWRqdXN0ZWQgYWNjb3JkaW5nbHkuIEV4YW1wbGVzIGNvbnZlcnRpbmcgdG8gRVNUIChFYXN0ZXJuIFVTQQogICBTdGFuZGFyZCBUaW1lID0gLTA1MDApOgoKIDExOjMwOjAwICAgICAgPSAgMTE6MzA6MDAKIDExOjMwOjAwIEVTVCAgPSAgMTE6MzA6MDAKIDExOjMwOjAwIEdNVCAgPSAgMDY6MzA6MDAKIDExOjMwOjAwIFBTVCAgPSAgMTQ6MzA6MDAKIDExOjMwOjAwWiAgICAgPSAgMDY6MzA6MDAKIDExOjMwUE0gR01UICAgPSAgMTg6MzA6MDAKIDExOjMwIC0wNTAwICAgPSAgMTE6MzA6MDAKIDExOjMwIC0wODAwICAgPSAgMDg6MzA6MDAKIDExOjMwICswMjAwICAgPSAgMDQ6MzA6MDAKCiAgIFVubGlrZSBtb3N0IG9mIEtlcm1pdCdzIG90aGVyIGRhdGUtdGltZSBjb252ZXJzaW9ucywgdGltZXpvbmUKICAga25vd2xlZGdlIChzcGVjaWZpY2FsbHksIHRoZSBvZmZzZXQgb2YgbG9jYWwgdGltZSBmcm9tIFVUQykgaXMKICAgZW1ib2RpZWQgaW4gdGhlIHVuZGVybHlpbmcgb3BlcmF0aW5nIHN5c3RlbSwgbm90IGluIEtlcm1pdCBpdHNlbGYsIGFuZAogICBhbnkgY29udmVyc2lvbiBlcnJvcnMgaW4gdGhpcyBkZXBhcnRtZW50IGFyZSB0aGUgZmF1bHQgb2YgdGhlIE9TLiBGb3IKICAgZXhhbXBsZSwgbW9zdCBVTklYIHBsYXRmb3JtcyBkbyBub3QgcGVyZm9ybSBjb252ZXJzaW9ucyBmb3IgeWVhcnMKICAgcHJpb3IgdG8gMTk3MC4KCiAgICA4LjEzLjQuIERlbHRhIFRpbWUKCiAgIERhdGUvdGltZSBleHByZXNzaW9ucyBjYW4gYmUgY29tcG9zZWQgb2YgYSBkYXRlIGFuZC9vciB0aW1lIGFuZCBhCiAgIGRlbHRhIHRpbWUsIG9yIGEgZGVsdGEgdGltZSBieSBpdHNlbGYuIFdoZW4gYSBkZWx0YSB0aW1lIGlzIGdpdmVuIGJ5CiAgIGl0c2VsZiwgaXQgaXMgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgbG9jYWwgZGF0ZSBhbmQgdGltZS4gRGVsdGEgdGltZXMKICAgaGF2ZSB0aGUgZm9sbG93aW5nIGdlbmVyYWwgZm9ybWF0OgoKICB7KywtfVtudW1iZXIgdW5pdHNdW2hoWzptbVs6c3NdXV0KCiAgIEluIG90aGVyIHdvcmRzLCBhIGRlbHRhIHRpbWUgYWx3YXlzIHN0YXJ0cyB3aXRoIGEgcGx1cyBvciBtaW51cyBzaWduLAogICB3aGljaCBpcyBmb2xsb3dlZCBieSBhICJwYXJ0MSIsIGEgInBhcnQyIiwgb3IgYm90aC4gVGhlICJwYXJ0MSIsIGlmCiAgIGdpdmVuLCBzcGVjaWZpZXMgYSBudW1iZXIgb2YgZGF5cywgd2Vla3MsIG1vbnRocywgb3IgeWVhcnM7ICJwYXJ0MiIKICAgc3BlY2lmaWVzIGEgdGltZSBpbiBoaDptbTpzcyBub3RhdGlvbi4gSW4gYXJpdGhtZXRpYyB0ZXJtcywgdGhlc2UKICAgcmVwcmVzZW50cyBzb21lIG51bWJlciBvZiBkYXlzIG9yIG90aGVyIGJpZyB0aW1lIHVuaXRzLCBhbmQgdGhlbiBhCiAgIGZyYWN0aW9uIG9mIGEgZGF5IGV4cHJlc3NlZCBhcyBob3VycywgbWludXRlcywgYW5kIHNlY29uZHM7IHRoZXNlIGFyZQogICB0byBiZSBhZGRlZCB0byBvciBzdWJ0cmFjdGVkIGZyb20gdGhlIGdpdmVuIChvciBpbXBsaWVkKSBkYXRlIGFuZAogICB0aW1lLiBUaGUgc3ludGF4IGlzIHNvbWV3aGF0IGZsZXhpYmxlLCBhcyBzaG93biBieSB0aGUgZm9sbG93aW5nCiAgIGV4YW1wbGVzOgoKICArMSBkYXkgICAgICAgICAgICAgICAgKFBsdXMgb25lIGRheSkKICArMWRheSAgICAgICAgICAgICAgICAgKERpdHRvKQogICsxZCAgICAgICAgICAgICAgICAgICAoRGl0dG8pCiAgKyAxIGRheSAgICAgICAgICAgICAgIChEaXR0bykKICArIDEgZGF5IDM6MDAgICAgICAgICAgKFBsdXMgb25lIGRheSBhbmQgMyBob3VycykKICArMWQzOjAwICAgICAgICAgICAgICAgKERpdHRvKQogICsxZDMgICAgICAgICAgICAgICAgICAoRGl0dG8pCiAgKzM6MDA6MDAgICAgICAgICAgICAgIChQbHVzIDMgaG91cnMpCiAgKzM6MDAgICAgICAgICAgICAgICAgIChEaXR0bykKICArMyAgICAgICAgICAgICAgICAgICAgKERpdHRvKQogICsyIGRheXMgICAgICAgICAgICAgICAoUGx1cyAyIGRheXMpCiAgLTEyIGRheXMgNzoxNDoyMiAgICAgIChNaW51cyAxMiBkYXlzLCA3IGhvdXJzLCAxNCBtaW51dGVzLCBhbmQgMjIgc2Vjb25kcykKCiAgIFRoZSB3b3JkcyAid2VlayIsICJtb250aCIsIGFuZCAieWVhciIgY2FuIGJlIHVzZWQgbGlrZSAiZGF5IiBpbiB0aGUKICAgZXhhbXBsZXMgYWJvdmUuIEEgd2VlayBpcyBleGFjdGx5IGVxdWl2YWxlbnQgdG8gNyBkYXlzLiBXaGVuIG1vbnRocwogICBhcmUgc3BlY2lmaWVkLCB0aGUgbnVtZXJpYyBtb250aCBudW1iZXIgb2YgdGhlIGRhdGUgaXMgaW5jcmVtZW50ZWQgb3IKICAgZGVjcmVtZW50ZWQgYnkgdGhlIGdpdmVuIG51bWJlciwgYW5kIHRoZSB5ZWFyIGFuZCBkYXkgYWRqdXN0ZWQKICAgYWNjb3JkaW5nbHkgaWYgbmVjZXNzYXJ5IChmb3IgZXhhbXBsZSwgMzEtSmFuLTIwMDEgKzFtb250aCA9CiAgIDAzLU1hci0yMDAxIGJlY2F1c2UgRmVicnVhcnkgZG9lcyBub3QgaGF2ZSAzMSBkYXlzKS4gV2hlbiB5ZWFycyBhcmUKICAgc3BlY2lmaWVkLCB0aGV5IGFyZSBhZGRlZCBvciBzdWJ0cmFjdGVkIHRvIHRoZSBiYXNlIHllYXIuIEV4YW1wbGVzCiAgIChhc3N1bWluZyB0aGUgY3VycmVudCBkYXRlIGlzIDEwLUF1Zy0yMDAxIGFuZCB0aGUgY3VycmVudCB0aW1lIGlzCiAgIDE5OjIxOjExKToKCiAgMTgtU2VwLTIwMDEgKzFkYXkgICAgICAgICAgICAgICgyMDAxMDkxOCAwMDowMDowMCkKICB0b2RheSArMWRheSAgICAgICAgICAgICAgICAgICAgKDIwMDEwODExIDAwOjAwOjAwKQogIG5vdysxZCAgICAgICAgICAgICAgICAgICAgICAgICAoMjAwMTA4MTEgMTk6MjE6MTEpCiAgKyAxIGRheSAgICAgICAgICAgICAgICAgICAgICAgICgyMDAxMDgxMSAxOToyMToxMSkKICArIDEgZGF5IDM6MTQ6NDIgICAgICAgICAgICAgICAgKDIwMDEwODExIDIyOjM1OjU0KQogICsgNyB3ZWVrcyAgICAgICAgICAgICAgICAgICAgICAoMjAwMTA5MjggMTk6MjE6MTEpCiAgKzFkMzoxNDo0MiAgICAgICAgICAgICAgICAgICAgICgyMDAxMDgxMSAyMjozNTo1NCkKICArMXczOjE0OjQyICAgICAgICAgICAgICAgICAgICAgKDIwMDEwODE3IDIyOjM1OjU0KQogICsxbTM6MTQ6NDIgICAgICAgICAgICAgICAgICAgICAoMjAwMTA5MTAgMjI6MzU6NTQpCiAgKzF5MzoxNDo0MiAgICAgICAgICAgICAgICAgICAgICgyMDAyMDgxMCAyMjozNTo1NCkKICAyIGZlYiAyMDAxICsgMTAgeWVhcnMgICAgICAgICAgKDIwMTEwMjA4IDAwOjAwOjAwKQogIDIwMDEtMDItMDggKzEweTEyICAgICAgICAgICAgICAoMjAxMTAyMDggMTI6MDA6MDApCiAgMzEtZGVjLTE5OTkgMjM6NTk6NTkrMDA6MDA6MDEgICgyMDAwMDEwMSAwMDowMDowMCkKICAyOC1mZWItMTk5NiArMWRheSAgICAgICAgICAgICAgKDE5OTYwMjI5IDAwOjAwOjAwKSAobGVhcCB5ZWFyKQogIDI4LWZlYi0xOTk3ICsxZGF5ICAgICAgICAgICAgICAoMTk5NzAzMDEgMDA6MDA6MDApIChub25sZWFwIHllYXIpCiAgMjgtZmViLTE5OTcgKzFtb250aCAgICAgICAgICAgICgxOTk3MDMyOCAwMDowMDowMCkKICAyOC1mZWItMTk5NyArMW1vbnRoIDExOjU5OjU5ICAgKDE5OTcwMzI4IDExOjU5OjU5KQogIDI4LWZlYi0xOTk3ICsyMHllYXJzICAgICAgICAgICAoMjAxNzAyMjggMDA6MDA6MDApCiAgMjgtZmViLTE5OTcgKzgwMDB5ZWFycyAgICAgICAgICg5OTk3MDIyOCAwMDowMDowMCkKCiAgIEZvciBjb21wYXRpYmlsaXR5IHdpdGggVk1TLCB0aGUgZm9sbG93aW5nIHNwZWNpYWwgZGVsdGEtdGltZSBmb3JtYXQgaXMKICAgYWxzbyBhY2NlcHRlZDoKCiAgK251bWJlci1oaDptbTpzcwogIC1udW1iZXItaGg6bW06c3MKCiAgIChubyBzcGFjZXMpLiBUaGUgaHlwaGVuIGFmdGVyIHRoZSBudW1iZXIgaW5kaWNhdGVzIGRheXMuIEl0CiAgIGNvcnJlc3BvbmRzIGV4YWN0bHkgdG8gdGhlIEtlcm1pdCBub3RhdGlvbjoKCiAgK251bWJlcmRoaDptbTpzcwogIC1udW1iZXJkaGg6bW06c3MKCiAgIFRoZSBmb2xsb3dpbmcgZm9ybXMgYWxsIGluZGljYXRlIGV4YWN0bHkgdGhlIHNhbWUgZGF0ZSBhbmQgdGltZToKCiAgMTgtU2VwLTIwMDEgMTI6MzQ6NTYgKzEtMzoyMzowMQogIDE4LVNlcC0yMDAxIDEyOjM0OjU2ICsxZDM6MjM6MDEKICAxOC1TZXAtMjAwMSAxMjozNDo1NiArMSBkYXkgMzoyMzowMQoKICAgYW5kIG1lYW4gImFkZCBhIGRheSBwbHVzIDMgaG91cnMsIDIzIG1pbnV0ZXMsIGFuZCAxIHNlY29uZCIgdG8gdGhlCiAgIGdpdmVuIGRhdGUuCgogICBOb3RlIHRoYXQgZGVsdGEgdGltZXMgYXJlIG5vdCBhdCBhbGwgdGhlIHNhbWUgYXMgVVRDIG9mZnNldHM7IHRoZQogICBmb3JtZXIgc3BlY2lmaWVzIGFuIGFkanVzdG1lbnQgdG8gdGhlIGdpdmVuIGRhdGUvdGltZSBhbmQgdGhlIGxhdHRlcgogICBzcGVjaWZpZXMgdGhhdCB0aGUgbG9jYWwgdGltZSBpcyBhIHBhcnRpY3VsYXIgZGlzdGFuY2UgZnJvbSBVbml2ZXJzYWwKICAgVGltZSwgZm9yIGV4YW1wbGU6CgogIDExLUF1Zy0yMDAxIDEyOjM0OjU2IC0wODAwICAgICAgICAgICgyMDAxMDgxMSAxNjozNDo1NiAtLSBVVEMgT2Zmc2V0KQogIDExLUF1Zy0yMDAxIDEyOjM0OjU2IC0wODowMCAgICAgICAgICgyMDAxMDgxMSAwNDozNDo1NiAtLSBEZWx0YSB0aW1lKQoKICAgSWYgeW91IGdpdmUgYSB0aW1lIGZvbGxvd2VkIGJ5IGEgbW9kaWZlciB0aGF0IHN0YXJ0cyB3aXRoIGEgKyBvciAtCiAgIHNpZ24sIGhvdyBkb2VzIEtlcm1pdCBrbm93IHdoZXRoZXIgaXQncyBhIFVUQyBvZmZzZXQgb3IgYSBkZWx0YSB0aW1lPwogICBJdCBpcyB0cmVhdGVkIGFzIGEgVVRDIG9mZnNldCBpZiB0aGUgc2lnbiBpcyBmb2xsb3dlZCBieSBleGFjdGx5IGZvdXIKICAgZGVjaW1hbCBkaWdpdHM7IG90aGVyd2lzZSBpdCBpcyBhIGRlbHRhIHRpbWUuIEV4YW1wbGVzIChmb3IgVVNBCiAgIEVhc3Rlcm4gRGF5bGlnaHQgVGltZSk6CgogIDExLUF1Zy0yMDAxIDEyOjM0OjU2IC0wODAwICAgICAgICAgICgyMDAxMDgxMSAxNjozNDo1NiAtLSBVVEMgT2Zmc2V0KQogIDExLUF1Zy0yMDAxIDEyOjM0OjU2IC0wODowMCAgICAgICAgICgyMDAxMDgxMSAwNDozNDo1NiAtLSBEZWx0YSB0aW1lKQogIDExLUF1Zy0yMDAxIDEyOjM0OjU2IC04MDAgICAgICAgICAgICgyMDAxMDgxMSAwNDozNDo1NiAtLSBEZWx0YSB0aW1lKQogIDExLUF1Zy0yMDAxIDEyOjM0OjU2IC04ICAgICAgICAgICAgICgyMDAxMDgxMSAwNDozNDo1NiAtLSBEZWx0YSB0aW1lKQoKICAgVGhlIGZpcnN0IGV4YW1wbGUgc2F5cyB0aGF0IGF0IHNvbWUgdW5rbm93biBwbGFjZSB3aGljaCBpcyA4IGhvdXJzCiAgIGFoZWFkIG9mIFVuaXZlcnNhbCBUaW1lLCB0aGUgdGltZSBpcyAxMjozNDo1NiwgYW5kIHRoaXMgY29ycmVzcG9uZHMgdG8KICAgMTY6MzQ6NTYgaW4gRWFzdGVybiBEYXlsaWdodCB0aW1lLiBUaGUgc2Vjb25kIGV4YW1wbGUgc2F5cyB0byBzdWJ0cmFjdAogICA4IGhvdXJzIGZyb20gdGhlIGxvY2FsIHRpbWUuIFRoZSB0aGlyZCBhbmQgZm91cnRoIGFyZSBkZWx0YSB0aW1lcwogICBiZWNhdXNlLCBldmVuIHRob3VnaCBhIGNvbG9uIGlzIG5vdCBpbmNsdWRlZCwgdGhlIHRpbWUgZG9lcyBub3QKICAgY29uc2lzdCBvZiBleGFjdGx5IDQgZGlnaXRzLgoKICAgV2hlbiBhIGRlbHRhIHRpbWUgaXMgd3JpdHRlbiBhZnRlciBhIHRpbWV6b25lLCBob3dldmVyLCB0aGVyZSBpcyBubwogICBhbWJpZ3VpdHkgYW5kIG5vIHN5bnRheCBkaXN0aW5jdGlvbiBpcyByZXF1aXJlZDoKCiAgMTEtQXVnLTIwMDEgMTI6MzQ6NTYgLTA4MDAgLTA4MDAgICAgKDIwMDEwODExIDA4OjM0OjU2KQogIDExLUF1Zy0yMDAxIDEyOjM0OjU2IC0wODAwIC0wODowMCAgIChEaXR0bykKICAxMS1BdWctMjAwMSAxMjozNDo1NiAtMDg6MDAgLTA4OjAwICAoSWxsZWdhbCkKCiAgICA4LjEzLjUuIFRoZSBEQVRFIENvbW1hbmQKCiAgIE9idmlvdXNseSBhIGdyZWF0IG1hbnkgY29tYmluYXRpb25zIG9mIGRhdGUsIHRpbWUsIHRpbWUgem9uZSwgYW5kCiAgIGRlbHRhIHRpbWUgYXJlIHBvc3NpYmxlLCBhcyB3ZWxsIGFzIG1hbnkgZm9ybWF0dGluZyBvcHRpb25zLiBUaGUKICAgcHVycG9zZSBvZiBhbGwgdGhpcyBmbGV4aWJpbGl0eSBpcyB0byBjb21wbHkgd2l0aCBhcyBtYW55IHN0YW5kYXJkcyBhcwogICBwb3NzaWJsZSAtLSBJbnRlcm5ldCBSRkNzLCBJU08gc3RhbmRhcmRzLCBhbmQgcHJvdmVuIGNvcnBvcmF0ZQogICBzdGFuZGFyZHMgLS0gYXMgd2VsbCBhcyB3aXRoIG5vdGF0aW9ucyBjb21tb25seSB1c2VkIGJ5IHJlYWwgcGVvcGxlLAogICBpbiBvcmRlciB0aGF0IGRhdGVzIGFuZCB0aW1lcyBmcm9tIHRoZSB3aWRlc3QgdmFyaWV0eSBvZiBzb3VyY2VzIGNhbgogICBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIGFuZCB1c2VkIGluIGFueSBkYXRlLXRpbWUgZmllbGQgaW4gYW55CiAgIEtlcm1pdCBjb21tYW5kLgoKICAgWW91IGNhbiB0ZXN0IGFueSBkYXRlLWFuZC9vci10aW1lIGZvcm1hdCB3aXRoIHRoZSBEQVRFIGNvbW1hbmQsIHdoaWNoCiAgIGNvbnZlcnRzIGl0IHRvIHN0YW5kYXJkIHl5eXltbWRkIGhoOm1tOnNzIGZvcm1hdCBpZiBpdCBpcyB1bmRlcnN0b29kLAogICBvciBlbHNlIGdpdmVzIGFuIGV4cGxpY2l0IGVycm9yIG1lc3NhZ2UgKHJhdGhlciB0aGFuIGp1c3QgIkJBRCBEQVRFIgogICBhcyBpbiBwcmV2aW91cyBDLUtlcm1pdCByZWxlYXNlcykgdG8gaW5kaWNhdGUgd2hhdCBpcyB3cm9uZyB3aXRoIGl0LgogICBFeGFtcGxlcyAob24gVHVlc2RheSwgMzEgSnVseSAyMDAxIGluIE5ldyBZb3JrIENpdHksIEVhc3Rlcm4gRGF5bGlnaHQKICAgVGltZSwgVVRDIC0wNDAwKToKCiAgREFURSBjb21tYW5kIGFyZ3VtZW50ICAgICAgICAgICAgICAgICAgIFJlc3VsdCAgICAgICAgICAgCiAgMTI6MzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwNzMxIDEyOjMwOjAwCiAgMTI6MzA6MDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwNzMxIDEyOjMwOjAxCiAgMTI6MzA6MDEuNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwNzMxIDEyOjMwOjAyCiAgMTIzMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwNzMxIDEyOjMwOjAwCiAgMjMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwNzMxIDAyOjMwOjAwCiAgMjMwKzFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwODAxIDAyOjMwOjAwCiAgMjMwKzFkMzowMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwODAxIDA1OjMwOjAwCiAgMjAwMTA3MTggMTk6MjE6MTUgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwNzE4IDE5OjIxOjE1CiAgMjAwMTA3MThfMTkyMTE1ICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwNzE4IDE5OjIxOjE1CiAgMjAwMTA3MThUMTkyMTE1ICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwNzE4IDE5OjIxOjE1CiAgMTggSnVsIDIwMDEgKzA0MDAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwNzE3IDIzOjU5OjU5CiAgMTggSnVsIDIwMDEgMTkyMTE1ICAgICAgICAgICAgICAgICAgICAgIDIwMDEwNzE4IDE5OjIxOjE1CiAgMTggSnVsIDIwMDEgMTkyMTE1LjggICAgICAgICAgICAgICAgICAgIDIwMDEwNzE4IDE5OjIxOjE2CiAgMTgtSnVsLTIwMDFUMTkyMSAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwNzE4IDE5OjIxOjAwCiAgMTgtSnVsLTIwMDEgMTkyMVogICAgICAgICAgICAgICAgICAgICAgIDIwMDEwNzE4IDE1OjIxOjAwCiAgMTgtSnVsLTIwMDEgMTkyMSBHTVQgICAgICAgICAgICAgICAgICAgIDIwMDEwNzE4IDE1OjIxOjAwCiAgMTgtSnVsLTIwMDEgMTkyMSBVVEMgICAgICAgICAgICAgICAgICAgIDIwMDEwNzE4IDE1OjIxOjAwCiAgMTgtSnVsLTIwMDEgMTkyMSBaICAgICAgICAgICAgICAgICAgICAgIDIwMDEwNzE4IDE1OjIxOjAwCiAgMTgtSnVsLTIwMDEgMTkyMVogICAgICAgICAgICAgICAgICAgICAgIDIwMDEwNzE4IDE1OjIxOjAwCiAgMTgtSnVsLTIwMDEgMTkyMSAtMDQ6MDA6MDAgICAgICAgICAgICAgIDIwMDEwNzE4IDE5OjIxOjAwCiAgMjEtSnVsLTIwMDFfMDg6MjA6MDBhbSAgICAgICAgICAgICAgICAgIDIwMDEwNzIxIDA4OjIwOjAwCiAgMjEtSnVsLTIwMDFfODoyMDowMFAuTS4gICAgICAgICAgICAgICAgIDIwMDEwNzIxIDIwOjIwOjAwCiAgRnJpIEp1bCAyMCAxMToyNjoyNSAyMDAxICAgICAgICAgICAgICAgIDIwMDEwNzIwIDExOjI2OjI1CiAgRnJpIEp1bCAyMCAxMToyNjoyNSBHTVQgMjAwMSAgICAgICAgICAgIDIwMDEwNzIwIDA3OjI2OjI1CiAgU3VuLCA5IEFwciAyMDAwIDA2OjQ2OjQ2ICswMTAwICAgICAgICAgIDIwMDAwNDA5IDAxOjQ2OjQ2CiAgU3VuZGF5LCA5IEFwciAyMDAwIDA2OjQ2OjQ2ICswMTAwICAgICAgIDIwMDAwNDA5IDAxOjQ2OjQ2CiAgbm93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwNzMxIDE5OjQxOjEyCiAgdG9kYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwNzMxIDAwOjAwOjAwCiAgdG9kYXkgMDk6MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwNzMxIDA5OjAwOjAwCiAgdG9tb3Jyb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwODAxIDAwOjAwOjAwCiAgdG9tb3Jyb3cgMDk6MDAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwODAxIDA5OjAwOjAwCiAgdG9tb3Jyb3cgMDk6MDAgR01UICAgICAgICAgICAgICAgICAgICAgIDIwMDEwODAxIDA1OjAwOjAwCiAgeWVzdGVyZGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwNzMwIDAwOjAwOjAwCiAgeWVzdGVyZGF5IDA5OjAwICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwNzMwIDA5OjAwOjAwCiAgKyAzIGRheXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwODAzIDAwOjAwOjAwCiAgKzMgZGF5cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwODAzIDAwOjAwOjAwCiAgKzNkYXlzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwODAzIDAwOjAwOjAwCiAgKyAzZGF5cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwODAzIDAwOjAwOjAwCiAgKyAzIGRheXMgMDk6MDAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwODAzIDA5OjAwOjAwCiAgKyAyIHdlZWtzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwODE0IDAwOjAwOjAwCiAgKyAxIG1vbnRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwODMxIDAwOjAwOjAwCiAgLSA3IG1vbnRocyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDAxMjMxIDAwOjAwOjAwCiAgKyAxMCB5ZWFycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMTEwNzMxIDAwOjAwOjAwCiAgZnJpZGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwODAzIDAwOjAwOjAwCiAgc2F0dXJkYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwODA0IDAwOjAwOjAwCiAgc3VuZGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwODA1IDAwOjAwOjAwCiAgbW9uZGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwODA2IDAwOjAwOjAwCiAgdHVlc2RheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwNzMxIDAwOjAwOjAwCiAgd2VkbmVzZGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwODAxIDAwOjAwOjAwCiAgdGh1cnNkYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwODAyIDAwOjAwOjAwCiAgZnJpZGF5IDA3OjAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwODAzIDA3OjAwOjAwCiAgdGh1cnNkYXkgMTowMHBtICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwODAyIDEzOjAwOjAwCiAgdGh1cnNkYXkgMTowMHBtIEdNVCAgICAgICAgICAgICAgICAgICAgIDIwMDEwODAyIDA5OjAwOjAwCiAgVGh1LCAxMCBOb3YgOTQgMTA6NTA6NDcgRVNUICAgICAgICAgICAgIDE5OTQxMTEwIDEwOjUwOjQ3CiAgRnJpLCAyMCBPY3QgMTk5NSAxODozNToxNSAtMDQwMCAoRURUKSAgIDE5OTUxMDIwIDE4OjM1OjE1CiAgMzEvMTIvMjAwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDExMjMxIDAwOjAwOjAwCiAgMTIvMzEvMjAwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDExMjMxIDAwOjAwOjAwCiAgMjAwMS1KdWx5LTIwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwNzIwIDAwOjAwOjAwCiAgMjAwMS1TZXB0ZW1iZXItMzAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwOTMwIDAwOjAwOjAwCiAgMzAtU2VwdGVtYmVyLTIwMDEgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwOTMwIDAwOjAwOjAwCiAgU2VwIDMwLCAyMDAxIDEyOjM0OjU2ICAgICAgICAgICAgICAgICAgIDIwMDEwOTMwIDEyOjM0OjU2CiAgU2VwdGVtYmVyIDMwLCAyMDAxICAgICAgICAgICAgICAgICAgICAgIDIwMDEwOTMwIDAwOjAwOjAwCiAgU2VwdGVtYmVyIDMwLCAyMDAxIDYzMCAgICAgICAgICAgICAgICAgIDIwMDEwOTMwIDA2OjMwOjAwCiAgU2VwdGVtYmVyIDMwIDIwMDEgNjMwICAgICAgICAgICAgICAgICAgIDIwMDEwOTMwIDA2OjMwOjAwCiAgU2VwLTMwLTIwMDEgMTI6MzQ6NTkgICAgICAgICAgICAgICAgICAgIDIwMDEwOTMwIDEyOjM0OjU5CiAgMjAwMTA4MDcxMTM1NDIuMDE0ICAgICAgICAgICAgICAgICAgICAgIDIwMDEwODA3IDExOjM1LjQyCiAgMjAwMTA4MDcxMTM1NDIuMDE0WiAgICAgICAgICAgICAgICAgICAgIDIwMDEwODA3IDA3OjM1OjQyCgogICAgOC4xMy42LiBOZXcgRGF0ZS1UaW1lIEZ1bmN0aW9ucwoKICAgSW4gdGhlIGZvbGxvd2luZyBkZXNjcmlwdGlvbnMsIGRhdGUtdGltZSBmdW5jdGlvbiBhcmd1bWVudHMgYXJlIHRoZQogICBzYW1lIGZyZWUtZm9ybWF0IGRhdGUtdGltZSBzdHJpbmdzIGRpc2N1c3NlZCBhYm92ZSwgd2l0aCB0aGUgc2FtZQogICBkZWZhdWx0cyBmb3IgbWlzc2luZyBmaWVsZHMuIFRoZXkgYXJlIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIHRvCiAgIHN0YW5kYXJkIGZvcm1hdCBpbnRlcm5hbGx5IHByaW9yIHRvIHByb2Nlc3NpbmcuCgogICBcZmN2dGRhdGUoZDEpCiAgICAgICAgICBDb252ZXJ0cyB0aGUgZGF0ZS10aW1lIGQxIHRvIHN0YW5kYXJkIGZvcm1hdCBhbmQgbG9jYWwgdGltZS4KICAgICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IG5ldywgYnV0IG5vdyBpdCBhY2NlcHRzIGEgd2lkZXIgcmFuZ2Ugb2YKICAgICAgICAgIGFyZ3VtZW50IGZvcm1hdHMgdGhhdCBjYW4gaW5jbHVkZSB0aW1lem9uZXMgYW5kL29yIGRlbHRhIHRpbWVzLgogICAgICAgICAgSWYgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIG9taXR0ZWQsIHRoZSBjdXJyZW50IGRhdGUgYW5kIHRpbWUgYXJlCiAgICAgICAgICBhc3N1bWVkLiBUaGUgb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50IGlzIGEgZm9ybWF0IGNvZGUgZm9yIHRoZQogICAgICAgICAgcmVzdWx0OgoKICAgICBuMSA9IDE6IHl5eXktbW1tLWRkIGhoOm1tOnNzIChtbW0gPSBFbmdsaXNoIDMtbGV0dGVyIG1vbnRoCiAgICAgYWJicmV2aWF0aW9uKQogICAgIG4xID0gMjogZGQtbW1tLXl5eXkgaGg6bW06c3MgKGRpdHRvKQogICAgIG4xID0gMzogeXl5eW1tZGRoaG1tc3MgKGFsbCBudW1lcmljKQoKICAgXGZ1dGNkYXRlKGQxKQogICAgICAgICAgQ29udmVydHMgdGhlIGRhdGUtdGltZSBkMSB0byBVbml2ZXJzYWwgQ29vcmRpbmF0ZWQgVGltZSAoVVRDKSwKICAgICAgICAgIGFsc28ga25vd24gYXMgR01UIG9yIFp1bHUgb3IgWmVyby1NZXJpZGlhbiB0aW1lLiBUaGUgZGVmYXVsdCBkMQogICAgICAgICAgaXMgTk9XLiBJZiBkMSBpcyBhIHZhbGlkIGRhdGUtdGltZSwgdGhlIFVUQyByZXN1bHQgaXMgcmV0dXJuZWQKICAgICAgICAgIGluIHN0YW5kYXJkIGZvcm1hdCwgeXl5eW1tZGQgaGg6c3M6bW0uCgogICBcZmNtcGRhdGVzKGQxLGQyKQogICAgICAgICAgQ29tcGFyZXMgdHdvIGZyZWUtZm9ybWF0IGRhdGUtdGltZXMsIGQxIGFuZCBkMiwgYW5kLCBpZiBib3RoCiAgICAgICAgICBhcmd1bWVudHMgYXJlIHZhbGlkLCByZXR1cm5zIGEgbnVtYmVyOiAtMSBpZiBkMSBpcyBlYXJsaWVyIHRoYW4KICAgICAgICAgIChiZWZvcmUpIGQyOyAwIGlmIGQxIGlzIHRoZSBzYW1lIGFzIGQyOyAxIGlmIGQxIGlzIGxhdGVyIHRoYW4KICAgICAgICAgIChhZnRlcikgZDIuCgogICBcZmRpZmZkYXRlcyhkMSxkMikKICAgICAgICAgIENvbXB1dGVzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGZyZWUtZm9ybWF0IGRhdGUtdGltZXMsIGQxCiAgICAgICAgICBhbmQgZDIuIElmIGJvdGggYXJndW1lbnRzIGFyZSB2YWxpZCwgcmV0dXJucyBhIGRlbHRhIHRpbWUgd2hpY2gKICAgICAgICAgIGlzIG5lZ2F0aXZlIGlmIGQxIGlzIGVhcmxpZXIgdGhhbiAoYmVmb3JlKSBkMiBhbmQgcG9zaXRpdmUKICAgICAgICAgIG90aGVyd2lzZS4gSWYgZDEgYW5kIGQyIGFyZSBlcXVhbCwgdGhlIHJlc3VsdCBpcyAiKzA6MDAiLgogICAgICAgICAgT3RoZXJ3aXNlLCB0aGUgcmVzdWx0IGNvbnNpc3RzIG9mIHRoZSBudW1iZXIgb2YgZGF5cywgaG91cnMsCiAgICAgICAgICBtaW51dGVzLCBhbmQgc2Vjb25kcyB0aGF0IHNlcGFyYXRlIHRoZSB0d28gZGF0ZS10aW1lcy4gSWYgdGhlCiAgICAgICAgICBudW1iZXIgb2YgZGF5cyBpcyB6ZXJvLCBpdCBpcyBvbWl0dGVkLiBJZiB0aGUgbnVtYmVyIG9mIGRheXMgaXMKICAgICAgICAgIG5vbnplcm8gYnV0IHRoZSBob3VycywgbWludXRlcywgYW5kIHNlY29uZHMgYXJlIGFsbCB6ZXJvLCB0aGUKICAgICAgICAgIHRpbWUgaXMgb21pdHRlZC4gaWYgdGhlIHNlY29uZHMgYXJlIHplcm8sIHRoZXkgYXJlIG9taXR0ZWQuCgogICBcZmRlbHRhMnNlY3MoZHQpCiAgICAgICAgICBDb252ZXJ0cyBhIGRlbHRhIHRpbWUgdG8gc2Vjb25kcy4gRm9yIGV4YW1wbGUsICIrMWQwMDowMDowMSIgdG8KICAgICAgICAgIDg2NDAxLiBWYWxpZCBkZWx0YSB0aW1lcyBtdXN0IHN0YXJ0IHdpdGggYSArIG9yIC0gc2lnbi4gRGF5cwogICAgICAgICAgYXJlIGFjY2VwdGVkIGFzIHRpbWUgdW5pdHMsIGJ1dCBub3QgeWVhcnMsIG1vbnRocywgb3Igd2Vla3MuIElmCiAgICAgICAgICB0aGUgcmVzdWx0IHdvdWxkIG92ZXJmbG93IGEgY29tcHV0ZXIgbG9uZyB3b3JkIChhcyB3b3VsZCBoYXBwZW4KICAgICAgICAgIHdpdGggMzItYml0IGxvbmcgd29yZHMgd2hlbiB0aGUgbnVtYmVyIG9mIGRheXMgaXMgZ3JlYXRlciB0aGFuCiAgICAgICAgICAyNDg1NCksIHRoZSBmdW5jdGlvbiBmYWlscy4KCiAgIEhJTlQ6IEFsdGhvdWdoIEtlcm1pdCBoYXMgYSBudW1iZXIgb2YgYnVpbHQtaW4gZGF0ZSBhbmQgdGltZQogICB2YXJpYWJsZXMsIGl0IGRvZXNuJ3QgaGF2ZSBhIHNpbmdsZSBvbmUgc3VpdGFibGUgZm9yIHdyaXRpbmcgYQogICB0aW1lc3RhbXAuIEZvciB0aGlzIHlvdSB3b3VsZCBub3JtYWxseSB1c2Ugc29tZXRoaW5nIGxpa2UgIlx2KG5kYXRlKQogICBcdih0aW1lKSIuIEJ1dCBcZmN2dGRhdGUoKSAod2l0aCBubyBhcmd1bWVudHMpIGlzIGVxdWl2YWxlbnQ6IGl0CiAgIHJldHVybnMgdGhlIGN1cnJlbnQgZGF0ZSBhbmQgdGltZSBpbiB5eXl5bW1kZCBoaDptbTpzcyBmb3JtYXQsCiAgIHN1aXRhYmxlIGZvciB0aW1lIHN0YW1waW5nLgoKICAgIDguMTMuNy4gRGF0ZS1UaW1lIFByb2dyYW1taW5nIEV4YW1wbGVzCgogICBIZXJlJ3MgYSBtYWNybyB0aGF0IGNvbnZlcnRzIGFueSBkYXRlLXRpbWUgdG8gVVRDLCB3aGljaCB5b3UgbWlnaHQgdXNlCiAgIGlmIEMtS2VybWl0IGRpZG4ndCBhbHJlYWR5IGhhdmUgYSBcZnV0Y2RhdGUoKSBmdW5jdGlvbjoKCiAgZGVmaW5lIHV0Y2RhdGUgewogICAgICAubG9jYWwgOj0gXGZjdnRkYXRlKFwlKikgICAgICAgICAgICAgICAgIDsgMS4KICAgICAgLnRtcCA6PSBcZmN2dGRhdGUoXG0obG9jYWwpVVRDKSAgICAgICAgICA7IDIuCiAgICAgIC5vZmZzZXQgOj0gXGZkaWZmZGF0ZShcbShsb2NhbCksXG0odG1wKSkgOyAzLgogICAgICAudXRjIDo9IFxmY3Z0ZGF0ZShcbShsb2NhbClcbShvZmZzZXQpKSAgIDsgNC4KICAgICAgc2hvIG1hYyB1dGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IDUuCiAgfQoKICAgQnJpZWYgZXhwbGFuYXRpb246IExpbmUgMSBjb252ZXJ0cyB0aGUgbWFjcm8gYXJndW1lbnQsIGEgZnJlZS1mb3JtYXQKICAgZGF0ZS10aW1lLCB0byBzdGFuZGFyZC1mb3JtYXQgbG9jYWwgdGltZS4gTGluZSAyIGFwcGVuZHMgdGhlICJVVEMiCiAgIHRpbWV6b25lIHRvIHRoZSBsb2NhbCB0aW1lIGFuZCBjb252ZXJ0cyB0aGUgcmVzdWx0IHRvIGxvY2FsIHRpbWUuIEluCiAgIG90aGVyIHdvcmRzLCB3ZSB0YWtlIHRoZSBzYW1lIHRpbWUgYXMgdGhlIGxvY2FsIHRpbWUsIGJ1dCBwcmV0ZW5kIGl0J3MKICAgVVRDIHRpbWUsIGFuZCBjb252ZXJ0IGl0IHRvIGxvY2FsIHRpbWUuIEZvciBleGFtcGxlLCBpZiBOZXcgWW9yayB0aW1lCiAgIGlzIDQgaG91cnMgYWhlYWQgb2YgVVRDLCB0aGVuIDY6MDBwbSBOZXcgWW9yayB0aW1lIGlzIDI6MDBwbSBVVEMuIExpbmUKICAgMyBnZXRzIHRoZSBkaWZmZXJlbmNlIG9mIHRoZSB0d28gcmVzdWx0cyAoZS5nLiAiKzA0OjAwIikuIExpbmUgNAogICBhcHBlbmRzIHRoZSBkaWZmZXJlbmNlIChkZWx0YSB0aW1lKSB0byB0aGUgbG9jYWwgdGltZSwgYW5kIGNvbnZlcnRzIGl0CiAgIGFnYWluLCB3aGljaCBhZGRzIChvciBzdWJ0cmFjdHMpIHRoZSBVVEMgb2Zmc2V0IHRvIHRoZSBnaXZlbiB0aW1lLgogICBMaW5lIDUgZGlzcGxheXMgdGhlIHJlc3VsdC4KCiAgIEhlcmUncyBhIHNjcmlwdCB0aGF0IG9wZW5zIGEgd2ViIHBhZ2UsIGdldHMgaXRzIGhlYWRlcnMgaW50byBhbiBhcnJheSwKICAgc2NhbnMgdGhlIGFycmF5IGZvciB0aGUgIkxhc3QtTW9kaWZpZWQ6IiBoZWFkZXIsIGFuZCBpbnRlcHJldHMgaXQ6CiAgaHR0cCBvcGVuIHd3dy5jb2x1bWJpYS5lZHUKICBpZiBmYWlsIHN0b3AgMSBIVFRQIE9QRU4gZmFpbGVkCiAgaHR0cCAvYXJyYXk6YSBoZWFkIGluZGV4Lmh0bWwgL2Rldi9udWxsCiAgaWYgZmFpbCBzdG9wIDEgSFRUUCBHRVQgZmFpbGVkCiAgc2hvdyBhcnJheSBhCiAgZm9yIFwlaSAxIFxmZGltKCZhKSAxIHsKICAgICAgLlwleCA6PSBcZmluZGV4KDosXCZhW1wlaV0pCiAgICAgIGlmIG5vdCBcJXggY29udGludWUKICAgICAgLnRhZyA6PSBcZmxlZnQoXCZhW1wlaV0sXCV4LTEpCiAgICAgIC52YWwgOj0gXGZsdHJpbShcZnN1YnN0cihcJmFbXCVpXSxcJXgrMSkpCiAgICAgIGlmICggZXEgIlxtKHRhZykiICJMYXN0LU1vZGlmaWVkIiApIHsKICAgICAgICAgIGVjaG8gSFRUUCBEYXRlOiBcbSh2YWwpCiAgICAgICAgICAucmRhdGUgOj0gXGZjdnRkYXRlKFxtKHZhbCkpCiAgICAgICAgICBlY2hvIHtTdGFuZGFyZCBEYXRlIChsb2NhbCk6IFxtKHJkYXRlKX0KICAgICAgICAgIGVjaG8ge1N0YW5kYXJkIERhdGUgKFVUQyk6ICAgXGZ1dGNkYXRlKFxtKHJkYXRlKSl9CiAgICAgICAgICBicmVhawogICAgICB9CiAgfQogIGh0dHAgY2xvc2UKCiAgIFRoZSByZXN1bHQ6CgogIEhUVFAgRGF0ZTogTW9uLCAxMyBBdWcgMjAwMSAyMDowNTo0MiBHTVQKICBTdGFuZGFyZCBEYXRlIChsb2NhbCk6IDIwMDEwODEzIDE2OjA1OjQyCiAgU3RhbmRhcmQgRGF0ZSAoVVRDKTogICAyMDAxMDgxMyAyMDowNTo0MgoKICAgQXMgeW91IGNhbiBzZWUsIEtlcm1pdCBoYWQgbm8gdHJvdWJsZSBkZWNvZGluZyB0aGUgZGF0ZS10aW1lLXN0cmluZwogICBmcm9tIHRoZSB3ZWJzaXRlLCBjb252ZXJ0aW5nIHRvIGxvY2FsIHRpbWUsIGFuZCBjb252ZXJ0aW5nIGJhY2sgdG8gVVRDCiAgIHdpdGggbm8gY29uZmxpY3RzIG9yIGxvc3Mgb2YgaW5mb3JtYXRpb24uIElmIGl0IGhhZCBiZWVuIGluIGFueSBvdGhlcgogICBrbm93biBmb3JtYXQsIHRoZSByZXN1bHQgd291bGQgaGF2ZSBiZWVuIHRoZSBzYW1lLgoKICAgTm93IHN1cHBvc2Ugd2Ugd2FudCB0byBkb3dubG9hZCB0aGUgd2ViIHBhZ2Ugb25seSBpZiBpdCBpcyBuZXdlciB0aGFuCiAgIG91ciBsb2NhbCBjb3B5LiBUaGUgXGZkYXRlKGZpbGVuYW1lKSBmdW5jdGlvbiAod2hpY2ggcmV0dXJucyB0aGUKICAgbW9kaWZpY2F0aW9uIGRhdGUtdGltZSBvZiB0aGUgZ2l2ZW4gZmlsZSkgYW5kIHRoZSBuZXcgXGZjbXBkYXRlcygpCiAgIGZ1bmN0aW9uIG1ha2UgaXQgZWFzeS4gSW5zZXJ0IHRoZSBmb2xsb3dpbmcganVzdCBiZWZvcmUgdGhlIEJSRUFLCiAgIHN0YXRlbWVudDoKCiAgaWYgKCA8IDAgXGZjbXBkYXRlcyhcbShyZGF0ZSksXGZkYXRlKGluZGV4Lmh0bWwpKSApIHsKICAgICBlY2hvIEdFVFRJTkcgaW5kZXguaHRtbC4uLgogICAgIGh0dHAgZ2V0IGluZGV4Lmh0bWwgaW5kZXguaHRtbAogICAgIGlmIHN1Y2Nlc3MgZWNobyBIVFRQIEdFVCBPSwogIH0gZWxzZSB7CiAgICAgZWNobyBpbmRleC5odG1sOiBubyB1cGRhdGUgbmVlZGVkCiAgfQogIGh0dHAgY2xvc2UKICBleGl0CgogICBUaGlzIHNheXMsICJpZiAwIGlzIGxlc3MgdGhhbiB0aGUgY29tcGFyaXNvbiBvZiB0aGUgcmVtb3RlIGZpbGUgZGF0ZQogICBhbmQgdGhlIGxvY2FsIGZpbGUgZGF0ZSwgZ2V0IHRoZSByZW1vdGUgZmlsZSwgb3RoZXJ3aXNlIHNraXAgaXQuIiBBbmQKICAgaXQgYXV0b21hdGljYWxseSByZWNvbmNpbGVzIHRoZSB0aW1lLXpvbmUgZGlmZmVyZW5jZSAoaWYgYW55KS4KCiAgIEl0IHdvdWxkIGJlIG5pY2UgdG8gYmUgYWJsZSB0byBleHRlbmQgdGhpcyBzY3JpcHQgaW50byBhCiAgIGdlbmVyYWwtcHVycG9zZSB3ZWJzaXRlIHVwZGF0ZXIsIGJ1dCB1bmZvcnR1bmF0ZWx5IEhUVFAgcHJvdG9jb2wKICAgZG9lc24ndCBwcm92aWRlIGFueSBtZWNoYW5pc20gZm9yIHRoZSBjbGllbnQgdG8gYXNrIHRoZSBzZXJ2ZXIgZm9yIGEKICAgbGlzdCBvZiBmaWxlcywgcmVjdXJzaXZlIG9yIG90aGVyd2lzZS4KCiAgIFsgWzQ3Ml1Ub3AgXSBbIFs0NzNdQ29udGVudHMgXSBbIFs0NzRdQy1LZXJtaXQgSG9tZSBdIFsgWzQ3NV1LZXJtaXQKICAgSG9tZSBdCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgOC4xNC4gVHJhcHBpbmcgS2V5Ym9hcmQgSW50ZXJydXB0aW9uCgogICBOb3JtYWxseSB3aGVuIHlvdSB0eXBlIEN0cmwtQyBhbmQgS2VybWl0IGlzIGluIGNvbW1hbmQgbW9kZSAoYXMKICAgb3Bwb3NlZCB0byBDT05ORUNUIG1vZGUpIHdpdGggQ09NTUFORCBJTlRFUlJVUFRJT04gT04gKGFzIGl0IGlzIHVubGVzcwogICB5b3UgaGF2ZSBzZXQgaXQgT0ZGKSwgS2VybWl0IGludGVycnVwdHMgYW55IGNvbW1hbmQgdGhhdCBpcyBjdXJyZW50bHkKICAgaW4gcHJvZ3Jlc3MsIGFuZCBpZiBhIGNvbW1hbmQgZmlsZSBvciBtYWNybyBpcyBleGVjdXRpbmcsIHJvbGxzIHRoZQogICBjb21tYW5kIHN0YWNrIGJhY2sgdG8gdG9wIGxldmVsLCBjbG9zaW5nIGFsbCBvcGVuIGNvbW1hbmQgZmlsZXMsCiAgIGRlYWN0aXZhdGluZyBhbGwgbWFjcm9zLCBkZWFsbG9jYXRpbmcgYWxsIGxvY2FsIHZhcmlhYmxlcyBhbmQgYXJyYXlzLAogICBhbmQgbGVhdmluZyB5b3UgYXQgdGhlIGNvbW1hbmQgcHJvbXB0LgoKICAgU3VwcG9zZSwgaG93ZXZlciwgeW91IHdhbnQgY2VydGFpbiBhY3Rpb25zIHRvIG9jY3VyIHdoZW4gYSBzY3JpcHQgaXMKICAgaW50ZXJydXB0ZWQ7IGZvciBleGFtcGxlLCBjbG9zaW5nIG9wZW4gZmlsZXMsIHdyaXRpbmcgbG9nIGVudHJpZXMsIG9yCiAgIGRpc3BsYXlpbmcgc3VtbWFyeSByZXN1bHRzLiBZb3UgY2FuIGRvIHRoaXMgYnkgZGVmaW5pbmcgYSBtYWNybyBuYW1lZAogICBPTl9DVFJMQy4gV2hlbiBDdHJsLUMgaXMgZGV0ZWN0ZWQsIGFuZCBhIG1hY3JvIHdpdGggdGhpcyBuYW1lIGlzCiAgIGRlZmluZWQsIEtlcm1pdCBleGVjdXRlcyBpdCBmcm9tIHRoZSBjdXJyZW50IGNvbW1hbmQgbGV2ZWwsIHRodXMKICAgZ2l2aW5nIGl0IGZ1bGwgYWNjZXNzIHRvIHRoZSBlbnZpcm9ubWVudCBpbiB3aGljaCB0aGUgaW50ZXJydXB0aW9uCiAgIG9jY3VycmVkLCBpbmNsdWRpbmcgbG9jYWwgdmFyaWFibGVzIGFuZCBvcGVuIGZpbGVzLiBPbmx5IHdoZW4gdGhlCiAgIE9OX0NUUkxDIG1hY3JvIGNvbXBsZXRlcyBleGVjdXRpb24gaXMgdGhlIGNvbW1hbmQgc3RhY2sgcm9sbGVkIGJhY2sgdG8KICAgdG9wIGxldmVsLgoKICAgT25jZSB0aGUgT05fQ1RSTEMgbWFjcm8gaXMgZGVmaW5lZCwgaXQgY2FuIGJlIGV4ZWN1dGVkIG9ubHkgb25jZS4gVGhpcwogICBpcyB0byBwcmV2ZW50IHJlY3Vyc2lvbiBpZiB0aGUgdXNlciB0eXBlcyBDdHJsLUMgd2hpbGUgdGhlIE9OX0NUUkxDCiAgIG1hY3JvIGlzIGV4ZWN1dGluZy4gSWYgeW91IHR5cGUgQ3RybC1DIHdoaWxlIHRoZSBDdHJsLUMgbWFjcm8gaXMKICAgYWN0aXZlLCB0aGlzIGRvZXMgbm90IHN0YXJ0IGEgbmV3IGNvcHkgb2YgT05fQ1RSTEM7IHJhdGhlciwgaXQgcmV0dXJucwogICB0byB0aGUgdG9wLWxldmVsIGNvbW1hbmQgcHJvbXB0LiBBZnRlciB0aGUgT05fQ1RSTEMgbWFjcm8gcmV0dXJucywgaXQKICAgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBtYWNybyB0YWJsZSBzbyBpZiB5b3Ugd2FudCB0byB1c2UgaXQgYWdhaW4KICAgb3IgaW5zdGFsbCBhIGRpZmZlcmVudCBDdHJsLUMgdHJhcCwgeW91IG11c3QgZXhlY3V0ZSBhIG5ldyBERUZJTkUKICAgT05fQ1RSTEMgY29tbWFuZC4gSW4gYW55IGNhc2UsIGFzIGFsd2F5cyB3aGVuIHlvdSBpbnRlcnJ1cHQgYSBzY3JpcHQKICAgd2l0aCBDdHJsLUMsIGl0cyBjb21wbGV0aW9uIHN0YXR1cyBpcyBGQUlMVVJFLgoKICAgTm9ybWFsbHkgdGhlIE9OX0NUUkxDIG1hY3JvIHdvdWxkIGJlIGRlZmluZWQgaW4gdGhlIGNvbW1hbmQgZmlsZSBvcgogICBtYWNybyB0byB3aGljaCBpdCBhcHBsaWVzLCBhbmQgc2hvdWxkIGJlIGRlY2xhcmVkIExPQ0FMLiBUaGlzIHdheSwgaWYKICAgdGhlIGNvbW1hbmQgZmlsZSBvciBtYWNybyBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5IHdpdGhvdXQgYmVpbmcKICAgaW50ZXJydXB0ZWQsIHRoZSBPTl9DVFJMQyBkZWZpbml0aW9uIGRpc2FwcGVhcnMgYXV0b21hdGljYWxseS4KICAgT3RoZXJ3aXNlIHRoZSBkZWZpbml0aW9uIHdvdWxkIHN0aWxsIGJlIHZhbGlkIGFuZCB0aGUgbWFjcm8gd291bGQgYmUKICAgZXhlY3V0ZWQsIHByb2JhYmx5IG91dCBvZiBjb250ZXh0LCB0aGUgbmV4dCB0aW1lIHlvdSB0eXBlZCBDdHJsLUMuCgogICBIZXJlJ3MgYSBzaW1wbGUgZXhhbXBsZSBvZiBhIGNvbW1hbmQgZmlsZSB0aGF0IHNldHMgYSBDdHJsLUMgdHJhcCBmb3IKICAgaXRzZWxmOgoKICBsb2NhbCBvbl9jdHJsYyAgICAgICAgICAgICAgOyBNYWtlIEN0cmwtQyB0cmFwIGxvY2FsIHRvIHRoaXMgY29tbWFuZCBmaWxlLgogIGRlZmluZSBvbl9jdHJsYyB7ICAgICAgICAgICA7IERlZmluZSB0aGUgT05fQ1RSTEMgbWFjcm8uCiAgICAgIGVjaG8gSW50ZXJydXB0ZWQgYXQgXHYodGltZSkuCiAgICAgIGVjaG8gSXRlcmF0aW9uczogXCVuCiAgfQogIHhlY2hvIFR5cGUgQ3RybC1DIHRvIHF1aXQKICBmb3IgXCVuIDEgOTk5IDEgeyAgICAgICAgICAgOyBQcmludHMgYSBkb3QgZXZlcnkgc2Vjb25kIHVudGlsIGludGVycnVwdGVkLgogICAgICBzbGVlcCAxCiAgICAgIHhlY2hvIC4KICB9CiAgZWNobyBGaW5pc2hlZCBub3JtYWxseSBhdCBcdih0aW1lKSA7IEdldCBoZXJlIG9ubHkgaWYgbm90IGludGVycnVwdGVkLgogIGRlY3JlbWVudCBcJW4KICBlY2hvIEl0ZXJhdGlvbnM6IFwlbgoKICAgVGhpcyBwcmludHMgYSBzdW1tYXJ5IG5vIG1hdHRlciB3aGV0aGVyIGl0IGNvbXBsZXRlcyBub3JtYWxseSBvciBpcwogICBpbnRlcnJ1cHRlZCBmcm9tIHRoZSBrZXlib2FyZC4gSW4gYm90aCBjYXNlcyB0aGUgdHJhcCBpcyBhdXRvbWF0aWNhbGx5CiAgIHJlbW92ZWQgYWZ0ZXJ3YXJkcy4KCiAgIEZvciBhbiBleGFtcGxlIG9mIGhvdyB0byB1c2UgT05fQ1RSTEMgdG8gZGVidWcgc2NyaXB0cywgc2VlCiAgIFs0NzZdU2VjdGlvbiA4LjEuCgogICBbIFs0NzddVG9wIF0gWyBbNDc4XUNvbnRlbnRzIF0gWyBbNDc5XUMtS2VybWl0IEhvbWUgXSBbIFs0ODBdS2VybWl0CiAgIEhvbWUgXQogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgo5LiBTLUVYUFJFU1NJT05TCgogICBUaGlzIHNlY3Rpb24gaXMgcHJpbWFyaWx5IGZvciB0aG9zZSB3aG8gd2FudCB0byB3cml0ZQogICBjYWxjdWxhdGlvbi1pbnRlbnNpdmUgc2NyaXB0cywgZXNwZWNpYWxseSBpZiB0aGV5IHJlcXVpcmUKICAgZmxvYXRpbmctcG9pbnQgYXJpdGhtZXRpYywgYW5kL29yIGZvciB0aG9zZSB3aG8gYXJlIGZhbWlsaWFyIHdpdGggdGhlCiAgIExJU1AgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuCgogICBFdmVyIHNpbmNlIEMtS2VybWl0IHZlcnNpb24gNSB3YXMgcmVsZWFzZWQgaW4gMTk4OCwgc2NyaXB0aW5nIGhhcyBiZWVuCiAgIG9uZSBvZiBpdHMgbWFqb3IgYXR0cmFjdGlvbnMsIGFuZCBhcml0aG1ldGljIGlzIGEga2V5IHBhcnQgb2YgaXQuCiAgIFZlcnNpb25zIDUgYW5kIDYgaW5jbHVkZWQgaW50ZWdlciBhcml0aG1ldGljIG9ubHksIHVzaW5nIHRyYWRpdGlvbmFsCiAgIGFsZ2VicmFpYyBub3RhdGlvbiwgZS5nLjoKCiAgZWNobyBcZmV2YWx1YXRlKDMqKDIrNykvMikKICAxMwoKICAgQy1LZXJtaXQgNy4wIGFkZGVkIHN1cHBvcnQgZm9yIGZsb2F0aW5nLXBvaW50IGFyaXRobWV0aWMsIGJ1dCBvbmx5CiAgIHRocm91Z2ggZnVuY3Rpb24gY2FsbHM6CgogIGVjaG8gXGZmcGRpdmlkZShcZmZwbXVsdGlwbHkoMy4wLFxmZnBhZGQoMi4wLDcuMCkpLDIuMCkKICAxMy41CgogICBDLUtlcm1pdCA4LjAgaW50cm9kdWNlcyBhIHRoaXJkIGZvcm0gb2YgYXJpdGhtZXRpYyB0aGF0IHRyZWF0cwogICBpbnRlZ2VycyBhbmQgZmxvYXRpbmctcG9pbnQgbnVtYmVycyB1bmlmb3JtbHksIGlzIGVhc2llciB0byByZWFkIGFuZAogICB3cml0ZSwgYW5kIGV4ZWN1dGVzIHZlcnkgcXVpY2tseToKCiAgKC8gKCogMyAoKyAyIDcpKSAyKQogIDEzLjUKCiAgIEJ1dCBmaXJzdCBzb21lIGJhY2tncm91bmQuCgogICBUaGUgS2VybWl0IGNvbW1hbmQgYW5kIHNjcmlwdGluZyBsYW5ndWFnZSBkaWZmZXJzIGZyb20gdHJ1ZQogICBwcm9ncmFtbWluZyBsYW5ndWFnZXMgKHN1Y2ggYXMgQyBvciBGb3J0cmFuKSBpbiBtYW55IHdheXM7IG9uZSBvZiB0aGUKICAgbW9zdCBwcm9taW5lbnQgZGlmZmVyZW5jZXMgaXMgdGhlIHdheSBpbiB3aGljaCB2YXJpYWJsZXMgYXJlCiAgIGRpc3Rpbmd1aXNoZWQgZnJvbSBjb25zdGFudHMuIEluIGEgY29tbWFuZCBsYW5ndWFnZSwgd29yZHMgYXJlIHRha2VuCiAgIGxpdGVyYWxseTsgZm9yIGV4YW1wbGUsIHRoZSBVbml4IHNoZWxsOgoKICBjYXQgZm9vLmJhcgoKICAgZGlzcGxheXMgdGhlIGZpbGUgbmFtZWQgZm9vLmJhci4gV2hlcmVhcyBpbiBhIHByb2dyYW1taW5nIGxhbmd1YWdlCiAgIGxpa2UgQywgd29yZHMgYXJlIGFzc3VtZWQgdG8gYmUgdmFyaWFibGVzOgoKICBzID0gZm9vLmJhcjsgICAgLyogQXNzaWducyB0aGUgdmFsdWUgb2YgZm9vLmJhciB0byB0aGUgdmFyaWFibGUgcyAqLwoKICAgVG8gbWFrZSBhIHByb2dyYW1taW5nIGxhbmd1YWdlIHRha2Ugd29yZHMgbGl0ZXJhbGx5LCB5b3UgaGF2ZSB0byBxdW90ZQogICBvciAiZXNjYXBlIiB0aGVtOgoKICBzID0gImZvby5iYXIiOyAgLyogQXNzaWducyBhIHBvaW50ZXIgdG8gdGhlIHN0cmluZyAiZm9vLmJhciIgdG8gdGhlIHZhcmlhYmxlCnMgKi8KCiAgIFRoZSBvcHBvc2l0ZSBob2xkcyBmb3IgY29tbWFuZCBsYW5ndWFnZXM6IHRvIGdldCB0aGVtIHRvIHRyZWF0IGEgd29yZAogICBhcyBhIHZhcmlhYmxlIHJhdGhlciB0aGFuIGEgY29uc3RhbnQsIHlvdSBoYXZlIHRvIGVzY2FwZSB0aGVtLiBGb3IKICAgZXhhbXBsZSwgaW4gdGhlIFVuaXggc2hlbGw6CgogIGZvbz0xMjMgICAgICAgICA7IEFzc2lnbiB2YWx1ZSAxMjMgdG8gdmFyaWFibGUgZm9vLgogIGVjaG8gZm9vICAgICAgICA7IFByaW50cyAiZm9vIgogIGVjaG8gJGZvbyAgICAgICA7IFByaW50cyAiMTIzIgoKICAgQW5kIGluIEtlcm1pdDoKCiAgZGVmaW5lIGZvbyAxMjMgIDsgQXNzaWduIHZhbHVlIDEyMyB0byB2YXJpYWJsZSBmb28uCiAgZWNobyAxMjMgICAgICAgIDsgVGhpcyBwcmludHMgIjEyMyIuCiAgZWNobyBmb28gICAgICAgIDsgVGhpcyBwcmludHMgImZvbyIuCiAgZWNobyBcbShmb28pICAgIDsgVGhpcyBwcmludHMgIjEyMyIuCgogICBJbiBvdGhlciB3b3JkcywgY2hhcmFjdGVyIHN0cmluZ3MgKHN1Y2ggYXMgImZvbyIgYWJvdmUpIGFyZQogICBpbnRlcnByZXRlZCBhcyBsaXRlcmFsIHN0cmluZ3MsIHJhdGhlciB0aGFuIHZhcmlhYmxlIG5hbWVzLCBleGNlcHQgaW4KICAgc3BlY2lhbCBjb21tYW5kcyBsaWtlIERFRklORSB0aGF0IGRlYWwgc3BlY2lmaWNhbGx5IHdpdGggdmFyaWFibGUKICAgbmFtZXMgKG9yIGluIG51bWVyaWMgY29udGV4dHMgYXMgZXhwbGFpbmVkIGluIFs0ODFdU2VjdGlvbiA4LjIpLiBUaGUKICAgc3BlY2lhbCAiZXNjYXBlIiBjaGFyYWN0ZXIgKGRvbGxhciBzaWduICgkKSBmb3IgdGhlIHNoZWxsLCBiYWNrc2xhc2gKICAgKFwpIGZvciBLZXJtaXQpIGluZGljYXRlcyB0aGF0IGEgdmFyaWFibGUgaXMgdG8gYmUgcmVwbGFjZWQgYnkgaXRzCiAgIHZhbHVlLgoKICAgVGhlIHJlcXVpcmVtZW50IHRvIGVzY2FwZSB2YXJpYWJsZSBuYW1lcyBpbiBjb21tYW5kIGxhbmd1YWdlcyBub3JtYWxseQogICBkb2VzIG5vdCBpbXBvc2UgYW55IHNwZWNpYWwgaGFyZHNoaXAsIGJ1dCBjYW4gYWRkIGEgY29uc2lkZXJhYmxlCiAgIG5vdGF0aW9uYWwgYnVyZGVuIHRvIGFyaXRobWV0aWMgZXhwcmVzc2lvbnMsIHdoaWNoIGFyZSB0eXBpY2FsbHkgZnVsbAogICBvZiB2YXJpYWJsZXMuIEVzcGVjaWFsbHkgaW4gS2VybWl0IHdoZW4gZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBhcmUKICAgaW52b2x2ZWQsIHdoZXJlIHlvdSBtdXN0IHVzZSBzcGVjaWFsIFxmZnB4eHgoKSBmdW5jdGlvbnMsIGUuZy4KICAgIlxmZnBhZGQoXG0oYSksXG0oYikpIiByYXRoZXIgdGhhbiB0aGUgc2ltcGxlICIrIiBvcGVyYXRvciB0byBhZGQgdHdvCiAgIGZsb2F0aW5nLXBvaW50IG51bWJlcnMgdG9nZXRoZXIsIGJlY2F1c2UgdGhlIG9yaWdpbmFsIGFyaXRobWV0aWMKICAgaGFuZGxlciBkb2Vzbid0IHN1cHBvcnQgZmxvYXRpbmcgcG9pbnQgKHRoaXMgbWlnaHQgY2hhbmdlIGluIHRoZQogICBmdXR1cmUpLiBUbyBpbGx1c3RyYXRlLCB0aGUgZ2VuZXJhbCBmb3JtdWxhIGZvciB0aGUgYXJlYSBvZiBhIHRyaWFuZ2xlCiAgIGlzOgoKICBzcXJ0KHMgKiAocyAtIGEpICogKHMgLSBiKSAqIChzIC0gYykpCgogICB3aGVyZSBhLCBiLCBhbmQgYyBhcmUgdGhlIGxlbmd0aHMgb2YgdGhlIHRyaWFuZ2xlJ3MgdGhyZWUgc2lkZXMgYW5kOgoKICBzID0gKGEgKyBiICsgYykgLyAyCgogICBFeGNlcHQgaW4gc3BlY2lhbCBjYXNlcyAoZS5nLiBhID0gMywgYiA9IDQsIGMgPSA1KSwgdGhlIHJlc3VsdCBoYXMgYQogICBmcmFjdGlvbmFsIHBhcnQgc28gdGhlIGNvbXB1dGF0aW9uIG11c3QgYmUgZG9uZSB1c2luZyBmbG9hdGluZy1wb2ludAogICBhcml0aG1ldGljLiBXZSBjYW4gY3JlYXRlIGEgS2VybWl0IDcuMCBmdW5jdGlvbiBmb3IgdGhpcyBhcyBmb2xsb3dzOgoKICBkZWYgYXJlYSB7CiAgICAgIGxvY2FsIHMgdDEgdDIgdDMKICAgICAgYXNzaWduIHMgXGZmcGRpdihcZmZwYWRkKFxmZnBhZGQoXCUxLFwlMiksXCUzKSwyLjApCiAgICAgIGFzc2lnbiB0MSBcZmZwc3ViKFxtKHMpLFwlMSkKICAgICAgYXNzaWduIHQyIFxmZnBzdWIoXG0ocyksXCUyKQogICAgICBhc3NpZ24gdDMgXGZmcHN1YihcbShzKSxcJTMpCiAgICAgIHJldHVybiBcZmZwc3FydChcZmZwbXVsKFxtKHMpLFxmZnBtdWwoXG0odDEpLFxmZnBtdWwoXG0odDIpLFxtKHQzKSkpKSkKICB9CgogICBCdXQgYXMgeW91IGNhbiBzZWUsIHRoaXMgaXMgcmF0aGVyIGN1bWJlcnNvbWUuIE5vdGUsIGluIHBhcnRpY3VsYXIsCiAgIHRoYXQgYXJpdGhtZXRpYyBmdW5jdGlvbnMgbGlrZSBcZmZwYWRkKCksIFxmZnBtdWwoKSwgZXRjLCB0YWtlIGV4YWN0bHkKICAgdHdvIG9wZXJhbmRzIChsaWtlIHRoZWlyIHN5bWJvbGljIGNvdW50ZXJwYXJ0cyArIGFuZCAqKSwgc28gb2J0YWluaW5nCiAgIHRoZSBwcm9kdWN0IG9mIHRocmVlIG9yIG1vcmUgbnVtYmVycyAoYXMgd2UgZG8gaW4gdGhpcyBjYXNlKSBpcwogICBhd2t3YXJkLgoKICAgVXNpbmcgdGhlIGFsdGVybmF0aXZlIFMtRXhwcmVzc2lvbiBub3RhdGlvbiwgd2UgY2FuIHJlZHVjZSB0aGlzIHRvIGEKICAgZm9ybSB0aGF0IGlzIGJvdGggZWFzaWVyIHRvIHJlYWQgYW5kIGV4ZWN1dGVzIGZhc3RlciAodGhlIGRldGFpbHMgYXJlCiAgIGV4cGxhaW5lZCBsYXRlcik6CgogIGRlZiBuZXdhcmVhIHsKICAgICAgKGxldCBzICgvICgrIFwlMSBcJTIgXCUzKSAyLjApKQogICAgICAoc3FydCAoKiBzICgtIHMgXCUxKSAoLSBzIFwlMikgKC0gcyBcJTMpKSkKICB9CgogICBJbiBib3RoIGV4YW1wbGVzLCB0aGUgXCUxLi4zIHZhcmlhYmxlcyBhcmUgdGhlIG5vcm1hbCBLZXJtaXQgbWFjcm8KICAgYXJndW1lbnRzLCByZWZlcmVuY2VkIGJ5IHRoZSBub3JtYWwgZXNjYXBpbmcgbWVjaGFuaXNtLiBGb3IgaW5jcmVhc2VkCiAgIHJlYWRhYmlsaXR5LCB3ZSBjYW4gYWxzbyBhc3NpZ24gdGhlIG1hY3JvIGFyZ3VtZW50cyBcJTEsIFwlMiwgYW5kIFwlMwogICB0byB0aGUgbGV0dGVycyBhLCBiLCBhbmQgYyBjb3JyZXNwb25kaW5nIHRvIG91ciBmb3JtdWxhOgoKZGVmIG5ld2FyZWEgewogICAgKGxldCBhIFwlMSBiIFwlMiBjIFwlMykKICAgIChsZXQgcyAoLyAoKyBhIGIgYykgMi4wKSkKICAgIChzcXJ0ICgqIHMgKC0gcyBhKSAoLSBzIGIpICgtIHMgYykpKQp9CgogICBBbmQgbm93IHRoZSBLZXJtaXQgZnVuY3Rpb24gcmVhZHMgYWxtb3N0IGxpa2UgdGhlIG9yaWdpbmFsIGZvcm11bGEuCiAgIEhlcmUgS2VybWl0IGJlaGF2ZXMgbW9yZSBsaWtlIGEgcmVndWxhciBwcm9ncmFtbWluZyBsYW5ndWFnZS4gSW4gYW4KICAgUy1FeHByZXNzaW9uLCBtYWNybyBuYW1lcyBuZWVkIG5vdCBiZSBlc2NhcGVkIHdoZW4gdGhleSBhcmUgdXNlZCBhcwogICB0aGUgbmFtZXMgb2YgbnVtZXJpYyB2YXJpYWJsZXMuCgogICBbIFs0ODJdVG9wIF0gWyBbNDgzXUNvbnRlbnRzIF0gWyBbNDg0XUMtS2VybWl0IEhvbWUgXSBbIFs0ODVdS2VybWl0CiAgIEhvbWUgXQogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDkuMS4gV2hhdCBpcyBhbiBTLUV4cHJlc3Npb24/CgogICBUaGUgUy1FeHByZXNzaW9uIGNvbmNlcHQgaXMgYm9ycm93ZWQgZnJvbSB0aGUgTGlzcCBwcm9ncmFtbWluZwogICBsYW5ndWFnZS4gIlMtRXhwcmVzc2lvbiIgaXMgc2hvcnQgZm9yIFN5bWJvbGljIEV4cHJlc3Npb24gKGl0c2VsZgogICBzb21ldGltZXMgc2hvcnRlbmVkIHRvIFNFWFApLiBTLUV4cHJlc3Npb25zIHByb3ZpZGUgYSBraW5kIG9mCiAgIEFsdGVybmF0aXZlIE1pbmktVW5pdmVyc2Ugd2l0aGluIHRoZSBLZXJtaXQgY29tbWFuZCBsYW5ndWFnZSB3aGVuIHRoZQogICByZWd1bGFyIHJ1bGVzIGRvbid0IGFwcGx5LCBhIHVuaXZlcnNlIGVuY2xvc2VkIGluIHBhcmVudGhlc2VzLgoKICAgQy1LZXJtaXQgZG9lcyBub3QgcHJldGVuZCB0byBiZSBhIGZ1bGwgTGlzcCBpbnRlcnByZXRlcjsgb25seSB0aGUKICAgYXJpdGhtZXRpYyBwYXJ0cyBvZiBMaXNwIGhhdmUgYmVlbiBpbmNvcnBvcmF0ZWQ6IFMtRXhwcmVzc2lvbnMgdGhhdAogICBvcGVyYXRlIG9uIG51bWJlcnMgYW5kIHJldHVybiBudW1lcmljIHZhbHVlcyAocGx1cyBleHRlbnNpYmlsaXR5CiAgIGZlYXR1cmVzIGRlc2NyaWJlZCBpbiBbNDg2XVNlY3Rpb24gOS44LCB3aGljaCBhbGxvdyBzb21lIGRlZ3JlZSBvZgogICBzdHJpbmcgcHJvY2Vzc2luZykuCgogICBBbiBTLUV4cHJlc3Npb24gaXMgYSBsaXN0IG9mIHplcm8gb3IgbW9yZSBpdGVtcywgc2VwYXJhdGVkIGJ5IHNwYWNlcywKICAgd2l0aGluIHBhcmVudGhlc2VzLiBFeGFtcGxlczoKCiAgKCkKICAoMSkKICAoYSkKICAoKyBhIDEpCiAgKCogMiBhIGIpCgogICBJZiB0aGUgUy1FeHByZXNzaW9uIGlzIGVtcHR5LCBpdCBoYXMgdGhlIE5JTCAoZW1wdHkpIHZhbHVlLiBJZiBpdCBpcwogICBub3QgZW1wdHkgYW5kIHRoZSBmaXJzdCBpdGVtIGlzIGFuIG9wZXJhdG9yIChzdWNoIGFzICsgb3IgKiksIHRoZXJlCiAgIGNhbiBiZSB6ZXJvIG9yIG1vcmUgc3Vic2VxdWVudCBpdGVtcywgY2FsbGVkIHRoZSBvcGVyYW5kczoKCiAgKCsgMSAyKQoKICAgSGVyZSB0aGUgb3BlcmF0b3IgaXMgIisiIGFuZCB0aGUgb3BlcmFuZHMgYXJlICIxIiBhbmQgIjIiLCBhbmQgdGhlCiAgIHZhbHVlIG9mIHRoZSBTLUV4cHJlc3Npb24gaXMgdGhlIHZhbHVlIG9mIHRoZSBvcGVyYXRpb24gKGluIHRoaXMgY2FzZQogICAzKS4gVGhlIG9wZXJhdG9yIGFsd2F5cyBjb21lcyBmaXJzdCwgd2hpY2ggaXMgZGlmZmVyZW50IGZyb20gdGhlCiAgIGZhbWlsaWFyIGFsZ2VicmFpYyBub3RhdGlvbjsgdGhpcyBiZWNhdXNlIFMtRXhwcmVzc2lvbiBvcGVyYXRvcnMgY2FuCiAgIGhhdmUgZGlmZmVyZW50IG51bWJlcnMgb2Ygb3BlcmFuZHM6CgogICgrIDEpCiAgKCsgMSAyKQogICgrIDEgMiAzIDQgNSA2IDcgOCA5KQoKICAgSWYgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIFMtRXhwcmVzc2lvbiBpcyBub3QgYW4gb3BlcmF0b3IsIHRoZW4gaXQgbXVzdAogICBiZSBhIHZhcmlhYmxlIG9yIGEgbnVtYmVyIChvciBhIG1hY3JvOyBzZWUgWzQ4N11TZWN0aW9uIDkuOCksIGFuZCB0aGUKICAgUy1FeHByZXNzaW9uIGNhbiBvbmx5IGNvbnRhaW4gb25lIGl0ZW07IGluIHRoaXMgY2FzZSwgdGhlCiAgIFMtRXhwcmVzc2lvbidzIHZhbHVlIGlzIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgb3IgbnVtYmVyOgoKICAoYSkKICAoMykKCiAgIE9wZXJhbmRzIGNhbiBiZSBudW1iZXJzLCB2YXJpYWJsZXMgdGhhdCBoYXZlIG51bWVyaWMgdmFsdWVzLCBmdW5jdGlvbnMKICAgdGhhdCByZXR1cm4gbnVtYmVycywgb3Igb3RoZXIgUy1FeHByZXNzaW9ucy4gVG8gaWxsdXN0cmF0ZSBhbgogICBTLUV4cHJlc3Npb24gd2l0aGluIGFuIFMtRXhwcmVzc2lvbiwgb2JzZXJ2ZSB0aGF0OgoKICAoKyAxIDIpCgogICBpcyBlcXVpdmFsZW50IHRvIGFueSBvZiB0aGUgZm9sbG93aW5nIChwbHVzIGFuIGluZmluaXRlIG51bWJlciBvZgogICBvdGhlcnMpOgoKICAoKyAxICgrIDEgMSkpCiAgKCsgKC0gMyAyKSAoLyAxNCAoKyAzIDQpKSkKCiAgIFMtRXhwcmVzc2lvbnMgY2FuIGJlIG5lc3RlZCB0byBhbnkgcmVhc29uYWJsZSBsZXZlbDsgZm9yIGV4YW1wbGUsIHRoZQogICB2YWx1ZSBvZiB0aGUgZm9sbG93aW5nIFMtRXhwcmVzc2lvbiBpcyA2NDoKCiAgKC0gKCogKCsgMiAoKiAzIDQpKSAoLSA5ICgqIDIgMikpKSA2KQoKICAgT3BlcmF0b3JzIGhhdmUgbm8gcHJlY2VkZW5jZSwgaW1wbGllZCBvciBvdGhlcndpc2UsIHNpbmNlIHRoZXkgY2FuJ3QKICAgYmUgbWl4ZWQuIFRoZSBvbmx5IGV4Y2VwdGlvbnMgYXJlIHVuYXJ5ICsgYW5kIC0sIHdoaWNoIHNpbXBseSBpbmRpY2F0ZQogICB0aGUgc2lnbiBvZiBhIG51bWJlcjoKCiAgKCogMyAtMSkKCiAgIE9yZGVyIG9mIGV2YWx1YXRpb24gaXMgc3BlY2lmaWVkIGVudGlyZWx5IGJ5IHBhcmVudGhlc2VzLCB3aGljaCBhcmUKICAgcmVxdWlyZWQgYXJvdW5kIGVhY2ggb3BlcmF0b3IgYW5kIGl0cyBvcGVyYW5kczogKCsgYSAoKiBiIGMpKSBpbnN0ZWFkCiAgIG9mIChhICsgYiAqIGMpLgoKICAgUy1FeHByZXNzaW9ucyBwcm92aWRlIGEgc2ltcGxlIGFuZCBpc29sYXRlZCBlbnZpcm9ubWVudCBpbiB3aGljaAogICBLZXJtaXQncyBtYWNybyBuYW1lcyBjYW4gYmUgdXNlZCB3aXRob3V0IHRoZSBcbSguLi4pIGVzY2FwaW5nIHRoYXQgaXMKICAgbm9ybWFsbHkgcmVxdWlyZWQuIEdpdmVuOgoKICBkZWZpbmUgYSAxCiAgZGVmaW5lIGIgMgogIGRlZmluZSBjIDMKCiAgIFRoZW46CgogICgrIFxtKGEpIFxtKGIpIFxtKGMpKQoKICAgaXMgZXF1aXZhbGVudCB0bzoKCiAgKCsgYSBiIGMpCgogICBXaXRoaW4gYW4gUy1FeHByZXNzaW9uLCBhcyBpbiBvdGhlciBzdHJpY3RseSBudW1lcmljIGNvbnRleHRzCiAgIChbNDg4XVNlY3Rpb24gOC4yKSwgYW55IG9wZXJhbmQgdGhhdCBzdGFydHMgd2l0aCBhIGxldHRlciBpcyB0cmVhdGVkCiAgIGFzIGEgS2VybWl0IG1hY3JvIG5hbWUuIEluIHRoaXMgY29udGV4dCwgYWJicmV2aWF0aW9ucyBhcmUgbm90CiAgIGFjY2VwdGVkOyB2YXJpYWJsZSBuYW1lcyBtdXN0IGJlIHNwZWxsZWQgb3V0IGluIGZ1bGwuIEFscGhhYmV0aWMgY2FzZQogICBpcyBub3Qgc2lnbmlmaWNhbnQ7ICJhIiBhbmQgIkEiIGFyZSB0aGUgc2FtZSB2YXJpYWJsZSwgYnV0IGJvdGggYXJlCiAgIGRpZmZlcmVudCBmcm9tICJhcmVhIi4KCiAgIE9mIGNvdXJzZSwgcmVndWxhciBLZXJtaXQgdmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgY2FuIGJlIHVzZWQgaW4KICAgUy1FeHByZXNzaW9ucyBpbiB0aGUgbm9ybWFsIHdheXM6CgogICgqIFx2KG1hdGhfcGkpICheIFwlciAyKSkgICAgICAgICAgICAgOyBBcmVhIG9mIGEgY2lyY2xlIHdpdGggcmFkaXVzIFwlcgogICgrIFxmam9pbigmYSkpICAgICAgICAgICAgICAgICAgICAgICAgOyBTdW0gb2YgYWxsIGVsZW1lbnRzIG9mIGFycmF5IFwmYVtdCgogICBbIFs0ODldVG9wIF0gWyBbNDkwXUNvbnRlbnRzIF0gWyBbNDkxXUMtS2VybWl0IEhvbWUgXSBbIFs0OTJdS2VybWl0CiAgIEhvbWUgXQogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDkuMi4gSW50ZWdlciBhbmQgRmxvYXRpbmctUG9pbnQtQXJpdGhtZXRpYwoKICAgTm9ybWFsbHksIGlmIGFsbCBudW1iZXJzIGluIGFuIFMtRXhwcmVzc2lvbiBhcmUgaW50ZWdlcnMsIHRoZSByZXN1bHQKICAgaXMgYW4gaW50ZWdlcjoKCiAgKCsgMSAxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IFJlc3VsdCBpcyAyCiAgKC8gOSAzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IFJlc3VsdCBpcyAzCgogICBJZiBhbnkgb2YgdGhlIG9wZXJhbmRzIGlzIGZsb2F0aW5nIHBvaW50LCBob3dldmVyLCB0aGUgcmVzdWx0IGlzIGFsc28KICAgZmxvYXRpbmcgcG9pbnQ6CgogICgrIDEgMS4wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBSZXN1bHQgaXMgMi4wCiAgKC8gOS4wIDMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IFJlc3VsdCBpcyAzLjAKCiAgIElmIGFsbCB0aGUgb3BlcmFuZHMgYXJlIGludGVnZXJzIGJ1dCB0aGUgcmVzdWx0IGhhcyBhIGZyYWN0aW9uYWwgcGFydCwKICAgdGhlIHJlc3VsdCBpcyBmbG9hdGluZyBwb2ludDoKCiAgKC8gMTAgMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IFJlc3VsdCBpcyAzLjMzMzMzMzMzMzMzMzMzMwoKICAgVG8gZm9yY2UgYW4gaW50ZWdlciByZXN1bHQgaW4gc3VjaCBjYXNlcywgdXNlIHRoZSBUUlVOQ0FURSBvcGVyYXRvcjoKCiAgKHRydW5jYXRlICgvIDEwIDMpKSAgICAgICAgICAgICAgICAgICA7IFJlc3VsdCBpcyAzCgogICBTaW1pbGFybHksIHRvIGZvcmNlIGEgY29tcHV0YXRpb24gdG8gb2NjdXIgaW4gZmxvYXRpbmcgcG9pbnQsIHlvdSBjYW4KICAgY29lcmNlIG9uZSBvZiBpdHMgb3BlcmFuZHMgdG8gRkxPQVQ6CgogICgrIDEgKGZsb2F0IDEpKSAgICAgICAgICAgICAgICAgICAgICAgOyBSZXN1bHQgaXMgMi4wCgogICBUaGUgcmVzdWx0IGlzIGFsc28gZmxvYXRpbmcgcG9pbnQgaWYgdGhlIG1hZ25pdHVkZSBvZiBhbnkgaW50ZWdlcgogICBvcGVyYW5kLCBpbnRlcm1lZGlhdGUgcmVzdWx0LCBvciB0aGUgcmVzdWx0IGl0c2VsZiwgaXMgbGFyZ2VyIHRoYW4gdGhlCiAgIG1heGltdW0gZm9yIHRoZSB1bmRlcmx5aW5nIG1hY2hpbmUgYXJjaGl0ZWN0dXJlOgoKICAoXiAxMDAgMTAwKQoKICAgSWYgdGhlIHJlc3VsdCBpcyB0b28gbGFyZ2UgZXZlbiBmb3IgZmxvYXRpbmctcG9pbnQgcmVwcmVzZW50YXRpb24sCiAgICJJbmZpbml0eSIgaXMgcHJpbnRlZDsgaWYgaXQgaXMgdG9vIHNtYWxsIHRvIGJlIGRpc3Rpbmd1aXNoZWQgZnJvbSAwLAogICAwLjAgaXMgcmV0dXJuZWQuCgogICBMYXJnZSBudW1iZXJzIGNhbiBiZSB1c2VkIGFuZCBsYXJnZSByZXN1bHRzIGdlbmVyYXRlZCwgYnV0IHRoZXkgYXJlCiAgIGFjY3VyYXRlIG9ubHkgdG8gdGhlIHByZWNpc2lvbiBvZiB0aGUgdW5kZXJseWluZyBtYWNoaW5lLiBGb3IgZXhhbXBsZSwKICAgdGhlIHJlc3VsdCBvZjoKCiAoKyAxMTExMTExMTExMTExMTExMTExMTEgMjIyMjIyMjIyMjIyMjIyMjIyMjIyKQoKICAgc2hvdWxkIGJlIDMzMzMzMzMzMzMzMzMzMzMzMzMzMywgYnV0IDMzMzMzMzMzMzMzMzMzMzMwMDAwMC4wIGlzCiAgIHByb2R1Y2VkIGluc3RlYWQgaWYgdGhlIG1hY2hpbmUgaXMgYWNjdXJhdGUgdG8gb25seSBhYm91dCAxNiBkZWNpbWFsCiAgIGRpZ2l0cywgZXZlbiB3aXRoIGNvZXJjaW9uIHRvIGZsb2F0aW5nLXBvaW50LiBUaGUgb3JkZXIgb2YgbWFnbml0dWRlCiAgIGlzIGNvcnJlY3QgYnV0IHRoZSBsZWFzdCBzaWduaWZpY2FudCBkaWdpdHMgYXJlIHdyb25nLiBUaGUgaW1wcmVjaXNlCiAgIG5hdHVyZSBvZiB0aGUgcmVzdWx0IGlzIGluZGljYXRlZCBieSB0aGUgIi4wIiBhdCB0aGUgZW5kLiBDb250cmFzdAogICB3aXRoOgoKICgrIDExMTExMTExMSAyMjIyMjIyMjIpCgogICB3aGljaCBwcm9kdWNlcyBhbiBleGFjdCBpbnRlZ2VyIHJlc3VsdC4KCiAgIFsgWzQ5M11Ub3AgXSBbIFs0OTRdQ29udGVudHMgXSBbIFs0OTVdQy1LZXJtaXQgSG9tZSBdIFsgWzQ5Nl1LZXJtaXQKICAgSG9tZSBdCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgOS4zLiBIb3cgdG8gVXNlIFMtRXhwcmVzc2lvbnMKCiAgIFMtRXhwcmVzc2lvbnMgbWF5IGJlIGdpdmVuIGFzIGNvbW1hbmRzIHRvIEMtS2VybWl0LiBBbnkgY29tbWFuZCB3aG9zZQogICBmaXJzdCBjaGFyYWN0ZXIgaXMgIigiIChsZWZ0IHBhcmVudGhlc2lzKSBpcyBpbnRlcnByZXRlZCBhcyBhbgogICBTLUV4cHJlc3Npb24uCgogICBJZiB5b3UgZW50ZXIgYW4gUy1FeHByZXNzaW9uIGF0IHRoZSBDLUtlcm1pdD4gcHJvbXB0LCBpdHMgcmVzdWx0IGlzCiAgIHByaW50ZWQ6CgogIEMtS2VybWl0PigvIDEwLjAgMykKICAgMy4zMzMzMzMzMzMzMzMzMzMKICBDLUtlcm1pdD4KCiAgIElmIGFuIFMtRXhwcmVzc2lvbiBpcyBleGVjdXRlZCB3aXRoaW4gYSBtYWNybyBvciBjb21tYW5kIGZpbGUsIGl0cwogICB2YWx1ZSBpcyBub3QgcHJpbnRlZC4gSG93ZXZlciwgeW91IGNhbiBjb250cm9sIHRoZSBwcmludGluZyBhY3Rpb24KICAgd2l0aDoKCiAgIFNFVCBTRVhQUkVTU0lPTiBFQ0hPIHsgQVVUTywgT04sIE9GRiB9CiAgICAgICAgICBBVVRPIGlzIHRoZSBkZWZhdWx0LCBtZWFuaW5nIHByaW50IHRoZSB2YWx1ZSBhdCB0b3AgbGV2ZWwgb25seTsKICAgICAgICAgIE9OIG1lYW5zIGFsd2F5cyBwcmludCB0aGUgdmFsdWU7IE9GRiBtZWFucyBuZXZlciBwcmludCBpdC4KCiAgIEluIGFueSBjYXNlLCB0aGUgdmFsdWUgb2YgdGhlIG1vc3QgcmVjZW50IFMtRXhwcmVzc2lvbiAoYW5kIHRoZQogICBTLUV4cHJlc3Npb24gaXRzZWxmKSBtYXkgYmUgYWNjZXNzZWQgcHJvZ3JhbW1hdGljYWxseSB0aHJvdWdoIHRoZQogICBmb2xsb3dpbmcgdmFyaWFibGVzOgoKICAgXHYoc2V4cHJlc3Npb24pCiAgICAgICAgICBUaGUgUy1FeHByZXNzaW9uIG1vc3QgcmVjZW50bHkgZXhlY3V0ZWQuCgogICBcdihzdmFsdWUpCiAgICAgICAgICBUaGUgdmFsdWUgb2YgdGhlIFMtRXhwcmVzc2lvbiBtb3N0IHJlY2VudGx5IGV4ZWN1dGVkLgoKICAgQmVzaWRlcyBpc3N1aW5nIFMtRXhwcmVzc2lvbnMgYXMgY29tbWFuZHMgaW4gdGhlbXNlbHZlcywgeW91IGNhbiBhbHNvCiAgIGV4ZWN1dGUgdGhlbSBhbnl3aGVyZSB3aXRoaW4gYSBLZXJtaXQgY29tbWFuZCwgYnV0IGluIHRoaXMgY2FzZSB0aGV5CiAgIG11c3QgYmUgZW5jbG9zZWQgaW4gYSBmdW5jdGlvbiBjYWxsIChvdGhlcndpc2UgdGhleSBhcmUgdGFrZW4KICAgbGl0ZXJhbGx5KToKCiAgIFxmc2V4cHJlc3Npb24ocykKICAgICAgICAgIFRoZSBhcmd1bWVudCAicyIgaXMgYW4gUy1FeHByZXNzaW9uOyB0aGUgb3V0ZXIgcGFyZW50aGVzZXMgbWF5CiAgICAgICAgICBiZSBvbWl0dGVkLiBUaGUgdmFsdWUgb2YgdGhlIFMtRXhwcmVzc2lvbiBpcyByZXR1cm5lZC4gTm90ZQogICAgICAgICAgdGhhdCBzaW5jZSBTLUV4cHJlc3Npb25zIHVzdWFsbHkgY29udGFpbiBzcGFjZXMsIHNvbWUgZm9ybSBvZgogICAgICAgICAgZ3JvdXBpbmcgb3IgcXVvdGluZyBtaWdodCBiZSBuZWVkZWQgaW4gc29tZSBjb250ZXh0czoKCiAgZWNobyBcZnNleHByZXNzaW9uKCgrIDEgMSkpICAgICAgICAgICAgOyBPdXRlciBwYXJlbnRoZXNlcyBtYXkgYmUgaW5jbHVkZWQKICBlY2hvIFxmc2V4cHIoKyAxIDEpICAgICAgICAgICAgICAgICAgICA7IE91dGVyIHBhcmVudGhlc2VzIG1heSBiZSBvbWl0dGVkCiAgZWNobyBWYWx1ZSA9ICJcZnNleHAoKyAxIGEpIiAgICAgICAgICAgOyBDYW4gYmUgZW1iZWRkZWQgaW4gc3RyaW5ncwogIGVjaG8gVmFsdWUgPSBcJmFbXGZzZXhwKC8gYiAyKV0gICAgICAgIDsgQ2FuIGJlIHVzZWQgaW4gYXJyYXkgc3Vic2NyaXB0cwogIGlmID0ge1xmc2V4cCgrIDEgMSl9IDIgeyAgICAgICAgICAgICAgIDsgQnJhY2VzIG5lZWRlZCBoZXJlIGZvciBncm91cGluZwogICAgICBlY2hvIE9uZSBwbHVzIG9uZSBzdGlsbCBlcXVhbHMgdHdvCiAgfQoKICAgVGhlIElGIHN0YXRlbWVudCBpbGx1c3RyYXRlcyBob3cgdG8gdXNlIFMtRXhwcmVzc2lvbnMgYXMgKG9yIGluKSBJRiBvcgogICBXSElMRSBjb25kaXRpb25zOgoKICAgICAqIEFsdGhvdWdoIFMtRXhwcmVzc2lvbnMgYW5kIElGIGNvbmRpdGlvbnMgYXJlIHNpbWlsYXIgaW4KICAgICAgIGFwcGVhcmFuY2UsIHRoZXkgYXJlIG5vdCBpbnRlcmNoYW5nZWFibGUuIFRoZXJlZm9yZSB5b3UgbXVzdCB1c2UKICAgICAgIFxmc2V4cHIoKSB0byBsZXQgS2VybWl0IGtub3cgaXQncyBhbiBTLUV4cHJlc3Npb24gcmF0aGVyIHRoYW4gYQogICAgICAgcmVndWxhciBJRiBjb25kaXRpb24sIG9yIGEgYm9vbGVhbiBvciBhbGdlYnJhaWMgZXhwcmVzc2lvbiB3aXRoaW4KICAgICAgIGFuIElGIGNvbmRpdGlvbi4KICAgICAqIEluIGNvbnRleHRzIHdoZXJlIGEgc2luZ2xlICJ3b3JkIiBpcyBleHBlY3RlZCwgeW91IG11c3QgZW5jbG9zZQogICAgICAgdGhlIFxmc2V4cCgpIGludm9jYXRpb24gaW4gYnJhY2VzIGlmIHRoZSBTLUV4cHJlc3Npb24gY29udGFpbnMKICAgICAgIHNwYWNlcyAoYW5kIG1vc3Qgb2YgdGhlbSBkbykuCgogICBJZiBhbiBTLUV4cHJlc3Npb24gaXMgdGhlIGxhc3QgY29tbWFuZCBleGVjdXRlZCBpbiBhIG1hY3JvLCBpdHMgdmFsdWUKICAgYmVjb21lcyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBtYWNybzsgbm8gUkVUVVJOIGNvbW1hbmQgaXMgbmVlZGVkLgogICBFeGFtcGxlOgoKICBkZWYgbmV3YXJlYSB7CiAgICAgIChsZXQgcyAoLyAoKyBcJTEgXCUyIFwlMykgMi4wKSkKICAgICAgKHNxcnQgKCogcyAoLSBzIFwlMSkgKC0gcyBcJTIpICgtIHMgXCUzKSkpCiAgfQoKICAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbW9yZSBlZmZpY2llbnQgdGhhbik6CgogIGRlZiBuZXdhcmVhIHsKICAgICAgKGxldCBzICgvICgrIFwlMSBcJTIgXCUzKSAyLjApKQogICAgICByZXR1cm4gXGZzZXhwKHNxcnQgKCogcyAoLSBzIFwlMSkgKC0gcyBcJTIpICgtIHMgXCUzKSkpCiAgfQoKICAgV2hlbiBhbiBTLUV4cHJlc3Npb24gaXMgZW50ZXJlZCBhcyBhIGNvbW1hbmQgLS0gdGhhdCBpcywgdGhlIGZpcnN0CiAgIG5vbmJsYW5rIGNoYXJhY3RlciBvZiB0aGUgY29tbWFuZCBpcyBhIGxlZnQgcGFyZW50aGVzaXMgLS0gdGhlbiBpdCBpcwogICBhbGxvd2VkIHRvIHNwYW4gbXVsdGlwbGUgbGluZXMsIGFzIG1hbnkgYXMgeW91IGxpa2UsIHVudGlsIHRoZSBmaXJzdAogICBsZWZ0IHBhcmVudGhlc2lzIGlzIG1hdGNoZWQ6CgogIChsZXQgcyAoLwogICAgICAgICAgKCsKICAgICAgICAgICBcJTEKICAgICAgICAgICBcJTIKICAgICAgICAgICBcJTMKICAgICAgICAgICApCiAgICAgICAgICAyLjAKICAgICAgICAgICkKICAgICAgICkKICAoc3FydCAoKgogICAgICAgICBzCiAgICAgICAgICgtIHMgXCUxKQogICAgICAgICAoLSBzIFwlMikKICAgICAgICAgKC0gcyBcJTMpCiAgICAgICAgICkKICAgICAgICApCgogICBUaGUgUy1FeHByZXNzaW9uIGNvbmNlcHQgbGVuZHMgaXRzZWxmIGVhc2lseSB0byBlbWJlZGRpbmcgYW5kCiAgIHJlY3Vyc2lvbiwgYnV0IHRoZSBkZXB0aCB0byB3aGljaCByZWN1cnNpb24gY2FuIG9jY3VyIGlzIGxpbWl0ZWQgYnkKICAgdGhlIHJlc291cmNlcyBvZiB0aGUgY29tcHV0ZXIgKG1lbW9yeSBzaXplLCBhZGRyZXNzIHNwYWNlLCBzd2FwIHNwYWNlCiAgIG9uIGRpc2spIGFuZCBvdGhlciBmYWN0b3JzLiBUaGVyZSBpcyBubyB3YXkgdGhhdCBDLUtlcm1pdCBjYW4ga25vdwogICB3aGF0IHRoaXMgbGltaXQgaXMsIHNpbmNlIGl0IHZhcmllcyBub3Qgb25seSBmcm9tIGNvbXB1dGVyIHRvCiAgIGNvbXB1dGVyLCBidXQgYWxzbyBmcm9tIG1vbWVudCB0byBtb21lbnQuIElmIHJlc291cmNlcyBhcmUgZXhoYXVzdGVkCiAgIGJ5IHJlY3Vyc2lvbiwgQy1LZXJtaXQgc2ltcGx5IGNyYXNoZXM7IHRoZXJlJ3Mgbm8gd2F5IHRvIHRyYXAgdGhpcwogICBlcnJvci4gSG93ZXZlciwgeW91IGNhbiBzZXQgYSBkZXB0aCBsaW1pdCBvbiBTLUV4cHJlc3Npb25zOgoKICAgU0VUIFNFWFBSRVNTSU9OIERFUFRILUxJTUlUIG51bWJlcgogICAgICAgICAgTGltaXRzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIFMtRXhwcmVzc2lvbiByZWFkZXIgY2FuIGludm9rZQogICAgICAgICAgaXRzZWxmIHdpdGhvdXQgcmV0dXJuaW5nIHRvIHRoZSBnaXZlbiBudW1iZXIuIFRoZSBkZWZhdWx0IGxpbWl0CiAgICAgICAgICBpcyAxMDAwLiBUaGlzIGxpbWl0IGFwcGxpZXMgdG8gUy1FeHByZXNzaW9ucyBlbWJlZGRlZCB3aXRoaW4KICAgICAgICAgIG90aGVyIFMtRXhwcmVzc2lvbnMgYXMgd2VsbCBhcyB0byBTLUV4cHJlc3Npb25zIHRoYXQgaW52b2tlCiAgICAgICAgICByZWN1cnNpdmUgbWFjcm9zLiBJZiB0aGUgbGltaXQgaXMgZXhjZWVkZWQsIEtlcm1pdCBwcmludHMKICAgICAgICAgICI/Uy1FeHByZXNzaW9uIGRlcHRoIGxpbWl0IGV4Y2VlZGVkIiBhbmQgcmV0dXJucyB0byBpdHMgcHJvbXB0LgogICAgICAgICAgTW9yZSBhYm91dCByZWN1cnNpb24gaW4gWzQ5N11TZWN0aW9uIDkuOC4KCiAgIFlvdSBjYW4gYWxzbyB0ZXN0IHRoZSBkZXB0aCBwcm9ncmFtbWF0aWNhbGx5OgoKICAgXHYoc2RlcHRoKQogICAgICAgICAgVGhlIGN1cnJlbnQgUy1FeHByZXNzaW9uIGludm9jYXRpb24gZGVwdGguIFRoZSBkZXB0aCBpbmNsdWRlcwogICAgICAgICAgYm90aCBuZXN0aW5nIGxldmVsIGFuZCByZWN1cnNpb24uIEZvciBleGFtcGxlLCBpbjoKICAgICAgICAgIChmb28gKGZvbyAoZm9vIChmb28gKGZvbykpKSkpLCB0aGUgaW5uZXJtb3N0IChmb28pIGlzIGF0IGRlcHRoCiAgICAgICAgICA1LgoKICAgSGVscCwgY29tcGxldGlvbiwgYW5kIHN5bnRheCBjaGVja2luZyBhcmUgbm90IGF2YWlsYWJsZSB3aXRoaW4gYW4KICAgUy1FeHByZXNzaW9uLiBJZiB5b3UgdHlwZSA/IHdpdGhpbiBhbiBTLUV4cHJlc3Npb24sIGl0IHNheXM6CgogIEMtS2VybWl0Pig/IFMtRXhwcmVzc2lvbiAoImhlbHAgc2V4cCIgZm9yIGRldGFpbHMpCgogICBBcyBpdCBzYXlzLCB0eXBpbmcgImhlbHAgc2V4cCIgd2lsbCBkaXNwbGF5IGEgYnJpZWYgaGVscCB0ZXh0LgoKICAgVGhlIFNIT1cgU0VYUFJFU1NJT04gY29tbWFuZCBkaXNwbGF5cyBjdXJyZW50IFNFVCBTRVhQUkVTU0lPTiBzZXR0aW5ncwogICBhbmQgcmVsYXRlZCBpbmZvcm1hdGlvbi4KCiAgIFsgWzQ5OF1Ub3AgXSBbIFs0OTldQ29udGVudHMgXSBbIFs1MDBdQy1LZXJtaXQgSG9tZSBdIFsgWzUwMV1LZXJtaXQKICAgSG9tZSBdCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgOS40LiBTdW1tYXJ5IG9mIEJ1aWx0LWluIENvbnN0YW50cyBhbmQgT3BlcmF0b3JzCgogICBUaHJlZSBjb25zdGFudHMgYXJlIGJ1aWx0IGluOgoKICAgICAqIFBJLCB3aG9zZSB2YWx1ZSBpcyB0aGUgdmFsdWUgb2YgcGkgKHRoZSBxdW90aWVudCBvZiBjaXJjdW1mZXJlbmNlCiAgICAgICBvZiBhbnkgY2lyY2xlIGFuZCBpdHMgZGlhbWV0ZXIsIDMuMTQxNTkyNjUzLi4uKSB0byB0aGUgdW5kZXJseWluZwogICAgICAgbWFjaGluZSdzIHByZWNpc2lvbjsKICAgICAqIFQsIHdoaWNoIGFsd2F5cyBoYXMgdGhlIHZhbHVlIDEsIHdoaWNoIHNpZ25pZmllcyB0cnV0aCBpbiBLZXJtaXQKICAgICAgIGxvZ2ljYWwgZXhwcmVzc2lvbnMgb3IgUy1FeHByZXNzaW9uczsKICAgICAqIE5JTCwgd2hpY2ggYWx3YXlzIGhhcyB0aGUgZW1wdHkgdmFsdWUsIGFuZCBjYW4gc2VydmUgYXMgYSBGYWxzZQogICAgICAgdHJ1dGggdmFsdWUuCgogICBUaGVzZSBjb25zdGFudHMgYXJlIHNwZWNpZmljIHRvIFMtRXhwcmVzc2lvbnMgYW5kIGFyZSBub3QgdmlzaWJsZQogICBvdXRzaWRlIHRoZW0uIFRoZXkgbWF5IG5vdCBiZSB1c2VkIGFzIHRoZSB0YXJnZXQgb2YgYW4gYXNzaWdubWVudC4gU28sCiAgIGZvciBleGFtcGxlOgoKICAoc2V0cSB0IDApICAgRmFpbHMKICBhc3NpZ24gdCAwICAgU3VjY2VlZHMgYnV0IHRoaXMgaXMgbm90IHRoZSBzYW1lIFQhCgogICBFICh0aGUgYmFzZSBvZiBuYXR1cmFsIGxvZ2FyaXRobXMsIDIuNzE4MjgxODE4NC4uLikgaXMgbm90IGJ1aWx0IGluCiAgIHNpbmNlIGl0IGlzIG5vdCBpbnRyaW5zaWMgaW4gbW9zdCBMaXNwIGRpYWxlY3RzLiBJZiB5b3Ugd2FudCBFIHRvIGJlCiAgIHRoZSBiYXNlIG9mIG5hdHVyYWwgbG9nYXJpdGhtcyB5b3UgY2FuOgoKICAoc2V0cSBlIChleHAgMSkpCgogICBPcGVyYXRvcnMgYXJlIGVpdGhlciBzeW1ib2xzIChzdWNoIGFzICIrIikgb3Igd29yZHMuIFdvcmRzIG11c3QgYmUKICAgc3BlbGxlZCBvdXQgaW4gZnVsbCwgbm90IGFiYnJldmlhdGVkLiBEaWZmZXJlbmNlcyBvZiBhbHBoYWJldGljIGNhc2UKICAgYXJlIGlnbm9yZWQuCgogICBUaGUgbW9zdCBiYXNpYyBvcGVyYXRpb24gaW4gUy1FeHByZXNzaW9ucyBpcyBldmFsdWF0aW9uOgoKICAgRVZBTCBbIHMtZXhwcmVzc2lvbiBvciB2YXJpYWJsZSBvciBudW1iZXIgWyBhbm90aGVyIFsgYW5vdGhlciAuLi4gXSBdCiAgICAgICAgICBdCiAgICAgICAgICBFdmFsdWF0ZXMgaXRzIG9wZXJhbmRzIGFuZCByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgbGFzdCBvbmUKICAgICAgICAgIGV2YWx1YXRlZC4gRXhhbXBsZXM6CgogIChldmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAogIChldmFsIDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQogIChldmFsIGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgb2YgYQogIChldmFsICgrIDEgYSkpICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgb2YgYSsxCiAgKGV2YWwgKHNldHEgYSAxKSAoc2V0cSBiICgrIGEgMC41KSkpICB2YWx1ZSBvZiBiICg9IGErMC41KQoKICAgICAgICAgIFlvdSBjYW4gdXNlICIuIiBhcyBhIHNob3J0aGFuZCBmb3IgRVZBTDoKCiAgKC4pCiAgKC4gMSkKICAoLiBhKQogICguICgrIDEgYSkpCiAgKC4gKHNldHEgYSAxKSAoc2V0cSBiICgrIGEgMC41KSkpCgogICBPcHBvc2l0ZSBvZiBFVkFMIGlzIHRoZSBvcGVyYXRvciB0aGF0IHN1cHByZXNzZXMgZXZhbHVhdGlvbiBvZiBpdHMKICAgb3BlcmFuZDoKCiAgIFFVT1RFIGl0ZW0KICAgICAgICAgIFRoZSB2YWx1ZSAocXVvdGUgaXRlbSkgaXMgIml0ZW0iLiBJZiB0aGUgaXRlbSBpcyBpdHNlbGYgYW4KICAgICAgICAgIFMtRXhwcmVzc2lvbiwgdGhlIHJlc3VsdCBpcyB0aGUgUy1FeHByZXNzaW9uIHdpdGggdGhlIG91dGVyCiAgICAgICAgICBwYXJlbnRoZXNlcyBzdHJpcHBlZC4gRXhhbXBsZXM6CgogIChxdW90ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlsbGVnYWwpCiAgKHF1b3RlIGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhCiAgKHF1b3RlIGhlbGxvKSAgICAgICAgICAgICAgICAgICAgICAgICBoZWxsbwogIChxdW90ZSAodGhpcyBpcyBhIHN0cmluZykpICAgICAgICAgICAgdGhpcyBpcyBhIHN0cmluZwogIChxdW90ZSB0aGlzIGlzIGEgc3RyaW5nKSAgICAgICAgICAgICAgKGlsbGVnYWwpCgogICAgICAgICAgQSBzaG9ydGhhbmQgbm90YXRpb24gaXMgYWxzbyBhY2NlcHRlZCBmb3IgcXVvdGluZzoKICAgICAgICAgICdhIGlzIGVxdWl2YWxlbnQgdG8gKHF1b3RlIGEpLiBBbmQgdGhlcmVmb3JlOgogICAgICAgICAgJyhhIGIgYykgaXMgZXF1aXZhbGVudCB0byAocXVvdGUgKGEgYiBjKSkuCiAgICAgICAgICBNb3JlIGFib3V0IHF1b3RpbmcgaW4gWzUwMl1TZWN0aW9uIDkuOC4KCiAgIFNUUklORyBpdGVtCiAgICAgICAgICBJcyBhIGNvbWJpbmF0aW9uIG9mIEVWQUwgYW5kIFFVT1RFLiBJdCBldmFsdWF0ZXMgdGhlIGl0ZW0gYXMgYW4KICAgICAgICAgIFMtRXhwcmVzc2lvbiwgYW5kIHRoZW4gcHV0cyBxdW90ZXMgYXJvdW5kIHRoZSByZXN1bHQgKG1vcmUKICAgICAgICAgIGFib3V0IHRoaXMgaW4gWzUwM11TZWN0aW9uIDkuOCkuCgogICBUaGUgZm9sbG93aW5nIG9wZXJhdG9ycyBhc3NpZ24gdmFsdWVzIHRvIHZhcmlhYmxlczoKCiAgIFNFVFEgWyB2YXJpYWJsZSBbIHZhbHVlIFsgdmFyaWFibGUgWyB2YWx1ZSBbIC4uLiBdIF0gXSBdIF0KICAgICAgICAgIEFwcGxpZXMgdG8gZ2xvYmFsIHZhcmlhYmxlcy4gRm9yIGVhY2ggdmFyaWFibGUgZ2l2ZW46IGlmIGEKICAgICAgICAgIHZhbHVlIGlzIG5vdCBnaXZlbiwgdGhlIHZhcmlhYmxlIGlzIHVuZGVmaW5lZC4gSWYgYSB2YWx1ZSBpcwogICAgICAgICAgZ2l2ZW4sIGFzc2lnbnMgdGhlIHZhbHVlIHRvIHRoZSB2YXJpYWJsZS4gVGhlIHZhbHVlIG1heSBiZSBhCiAgICAgICAgICBudW1iZXIsIGEgdmFyaWFibGUsIG9yIGFueXRoaW5nIHRoYXQgcmVzb2x2ZXMgdG8gYSBudW1iZXIKICAgICAgICAgIGluY2x1ZGluZyBhbiBTLUV4cHJlc3Npb24uIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBsYXN0CiAgICAgICAgICBhc3NpZ25tZW50LiBFeGFtcGxlczoKCiAgKHNldHEpICAgICAgICAgICAgIERvZXMgbm90aGluZywgcmV0dXJucyBOSUwuCiAgKHNldHEgYSkgICAgICAgICAgIFVuZGVmaW5lcyBhLCByZXR1cm5zIE5JTC4KICAoc2V0cSBhIDEpICAgICAgICAgQXNzaWducyAxIHRvIGEsIHJldHVybnMgMS4KICAoc2V0cSBhIDEgYiAyKSAgICAgQXNzaWducyAxIHRvIGEsIDIgdG8gYiwgcmV0dXJucyAyLgogIChzZXRxIGEgMSBiIDIgYykgICBBc3NpZ25zIDEgdG8gYSwgMiB0byBiLCB1bmRlZmluZXMgYywgcmV0dXJucyBOSUwuCgogICBUbyB1bmRlZmluZSBhIHZhcmlhYmxlIHRoYXQgaXMgbm90IHRoZSBmaW5hbCBvbmUgaW4gdGhlIGxpc3QsIGdpdmUgaXQKICAgYSB2YWx1ZSBvZiAiKCkiIG9yIE5JTDoKCiAgKHNldHEgYSAoKSBiIDIpICAgIFVuZGVmaW5lcyBhLCBhc3NpZ25zIDIgdG8gYiwgcmV0dXJucyAyLgogIChzZXRxIGEgbmlsIGIgMikgICBEaXR0by4KCiAgIE5vdGUgdGhhdCBhIHZhcmlhYmxlIGNhbiBiZSB1c2VkIHJpZ2h0IGF3YXkgb25jZSBpdCBoYXMgYSB2YWx1ZToKCiAgKHNldHEgYSAxIGIgYSkgICAgIEFzc2lnbnMgMSB0byBhLCB0aGUgdmFsdWUgb2YgYSAoMSkgdG8gYiwgcmV0dXJucyAxLgoKICAgVGhlIHJlc3VsdHMgb2YgU0VUUSAod2hlbiB1c2VkIHdpdGggbWFjcm8gbmFtZXMpIGNhbiBiZSBjaGVja2VkCiAgIGNvbnZlbmllbnRseSB3aXRoIFNIT1cgTUFDUk8sIGUuZzoKCiAgc2hvdyBtYWMgYSBiIGMKCiAgIExFVCBbIHZhcmlhYmxlIFsgdmFsdWUgWyB2YXJpYWJsZSBbIHZhbHVlIFsgLi4uIF0gXSBdIF0gXQogICAgICAgICAgTGlrZSBTRVRRLCBidXQgYXBwbGllcyB0byBsb2NhbCB2YXJpYWJsZXMuIE5vdGUgdGhhdCAibG9jYWwiIGlzCiAgICAgICAgICB1c2VkIGluIHRoZSBLZXJtaXQgc2Vuc2UsIG5vdCB0aGUgTGlzcCBzZW5zZTsgaXQgYXBwbGllcyB0byB0aGUKICAgICAgICAgIGN1cnJlbnQgS2VybWl0IGNvbW1hbmQgbGV2ZWwsIG5vdCB0byB0aGUgY3VycmVudCBTLUV4cHJlc3Npb24uCgogICBJZiB5b3Ugd2FudCB0byB1c2UgU0VUUSBvciBMRVQgdG8gYXNzaWduIGEgdmFsdWUgdG8gYSBiYWNrc2xhc2gKICAgdmFyaWFibGUgc3VjaCBhcyBcJWEgb3IgXCZhWzJdLCB5b3UgbXVzdCBkb3VibGUgdGhlIGJhY2tzbGFzaDoKCiAgKHNldHEgXFwlYSAzKQogIChzZXRxIFxcJWIgKCsgXCVhIDEpKQogIChzZXRxIFxcJmFbMl0gKHNldHEgKFxcJWMgKCsgXCVhIFwlYikpKSkKCiAgIEluIG90aGVyIHdvcmRzOgoKICAgICAqIERvdWJsZSB0aGUgYmFja3NsYXNoIHdoZW4geW91IHdhbnQgdG8gaW5kaWNhdGUgdGhlIHZhcmlhYmxlJ3MKICAgICAgIE5BTUU7CiAgICAgKiBEb24ndCBkb3VibGUgdGhlIGJhY2tzbGFzaCB3aGVuIHlvdSB3YW50IGl0cyBWQUxVRS4KCiAgIFNlZSBbNTA0XVNlY3Rpb24gOS42IGZvciBhIGZ1bGxlciBleHBsYW5hdGlvbiBvZiB2YXJpYWJsZSBzeW50YXggYW5kCiAgIHNjb3BlLgoKICAgSGVyZSdzIGEgc3VtbWFyeSB0YWJsZSBvZiBhcml0aG1ldGljIG9wZXJhdG9yczsgaW4gdGhlIGV4YW1wbGVzLCBhIGlzCiAgIDIgYW5kIGIgaXMgLTEuMzoKCiAgT3BlcmF0b3IgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4YW1wbGUgICAgICAgICAgIFJlc3VsdAogICsgICAgICAgICBBZGRzIGFsbCBvcGVyYW5kcyAoMCBvciBtb3JlKSAgICAgICAgICAoKyBhIGIpICAgICAgICAgICAwLjcKICAtICAgICAgICAgU3VidHJhY3RzIGFsbCBvcGVyYW5kcyAoMCBvciBtb3JlKSAgICAgKC0gOSA1IDIgMSkgICAgICAgMQogICogICAgICAgICBNdWx0aXBsaWVzIGFsbCBvcGVyYW5kcyAoMCBvciBtb3JlKSAgICAoKiBhICgrIGIgMSkgMykgIC0xLjgwCiAgLyAgICAgICAgIERpdmlkZXMgYWxsIG9wZXJhbmRzICgyIG9yIG1vcmUpICAgICAgICgvIGIgYSAyKSAgICAgICAgLTAuMzI1CiAgXiAgICAgICAgIFJhaXNlIGdpdmVuIG51bWJlciB0byBnaXZlbiBwb3dlciAgICAgICheIDMgMikgICAgICAgICAgIDkKICArKyAgICAgICAgSW5jcmVtZW50cyB2YXJpYWJsZXMgICAgICAgICAgICAgICAgICAgKCsrIGEgMS4yKSAgICAgICAgMy4yCiAgLS0gICAgICAgIERlY3JlbWVudHMgdmFyaWFibGVzICAgICAgICAgICAgICAgICAgICgtLSBhKSAgICAgICAgICAgIDEKICBBQlMgICAgICAgQWJzb2x1dGUgdmFsdWUgb2YgMSBvcGVyYW5kICAgICAgICAgICAgKGFicyAoKiBhIGIgMykpICAgNy44CiAgTUFYICAgICAgIE1heGltdW0gb2YgYWxsIG9wZXJhbmRzICgxIG9yIG1vcmUpICAgIChtYXggMSAyIDMgNCkgICAgIDQKICBNSU4gICAgICAgTWluaW11bSBvZiBhbGwgb3BlcmFuZHMgKDEgb3IgbW9yZSkgICAgKG1pbiAxIDIgMyA0KSAgICAgMQogIE1PRCAoJSkgICBNb2R1bHVzIG9mIGFsbCBvcGVyYW5kcyAoMSBvciBtb3JlKSAgICAobW9kIDcgNCAyKSAgICAgICAxCiAgRkxPQVQgICAgIENvbnZlcnQgYW4gaW50ZWdlciB0byBmbG9hdGluZy1wb2ludCAgIChmbG9hdCAxKSAgICAgICAgIDEuMAogIFRSVU5DQVRFICBJbnRlZ2VyIHBhcnQgb2YgZmxvYXRpbmctcG9pbnQgb3BlcmFuZCAodHJ1bmNhdGUgMy4zMzMpICAzCiAgQ0VJTElORyAgIENlaWxpbmcgb2YgZmxvYXRpbmctcG9pbnQgb3BlcmFuZCAgICAgIChjZWlsaW5nIDEuMjUpICAgIDIKICBGTE9PUiAgICAgRmxvb3Igb2YgZmxvYXRpbmctcG9pbnQgb3BlcmFuZCAgICAgICAgKGZsb29yIDEuMjUpICAgICAgMQogIFJPVU5EICAgICBPcGVyYW5kIHJvdW5kZWQgdG8gbmVhcmVzdCBpbnRlZ2VyICAgICAocm91bmQgMS43NSkgICAgICAyCiAgU1FSVCAgICAgIFNxdWFyZSByb290IG9mIDEgb3BlcmFuZCAgICAgICAgICAgICAgIChzcXJ0IDIpICAgICAgICAgIDEuNDE0Li4KICBFWFAgICAgICAgZSAoMi43MTgyOC4uKSB0byB0aGUgZ2l2ZW4gcG93ZXIgICAgICAgKGV4cCAtMSkgICAgICAgICAgMC4zNjcuLgogIFNJTiAgICAgICBTaW5lIG9mIGFuZ2xlLWluLXJhZGlhbnMgICAgICAgICAgICAgICAoc2luICgvIHBpIDIpKSAgICAxLjAKICBDT1MgICAgICAgQ29zaW5lIG9mIGFuZ2xlLWluLXJhZGlhbnMgICAgICAgICAgICAgKGNvcyBwaSkgICAgICAgICAtMS4wCiAgVEFOICAgICAgIFRhbmdlbnQgb2YgYW5nbGUtaW4tcmFkaWFucyAgICAgICAgICAgICh0YW4gcGkpICAgICAgICAgIDAuMAogIExPRyAgICAgICBOYXR1cmFsIGxvZyAoYmFzZSBlKSBvZiBnaXZlbiBudW1iZXIgICAobG9nIDIuNzE4MykgICAgICAxLjAwMC4uCiAgTE9HMTAgICAgIExvZyBiYXNlIDEwIG9mIGdpdmVuIG51bWJlciAgICAgICAgICAgIChsb2cxMCAxMDAwKSAgICAgIDMuMAoKICAgVGhlICsrIGFuZCAtLSBvcGVyYXRvcnMgYXJlIGFsc28gYXNzaWdubWVudCBvcGVyYXRvcnMgYW5kIHdvcmsganVzdAogICBsaWtlIFNFVFEgYW5kIExFVCBpbiB0aGVpciBpbnRlcnByZXRhdGlvbnMgb2Ygb3BlcmF0b3JzIGFuZCBvcGVyYW5kcywKICAgYnV0OgoKICAgICAqIEVhY2ggdGFyZ2V0IHZhcmlhYmxlIG11c3QgYWxyZWFkeSBiZSBkZWZpbmVkIGFuZCBoYXZlIGEgbnVtZXJpYwogICAgICAgdmFsdWU7CiAgICAgKiBUaGUgYXNzaWdubWVudCB2YWx1ZSBpcyB0aGUgYW1vdW50IGJ5IHdoaWNoIHRvIGluY3JlbWVudCBvcgogICAgICAgZGVjcmVtZW50IHRoZSB2YXJpYWJsZS4KICAgICAqIElmIGFuIGFzc2lnbm1lbnQgdmFsdWUgaXMgbm90IGdpdmVuLCAxIGlzIHVzZWQuCgogICBJZiB5b3UgaW5jbHVkZSBtb3JlIHRoYW4gb25lIHZhcmlhYmxlLXZhbHVlIHBhaXIgaW4gYSArKyBvciAtLQogICBleHByZXNzaW9uLCBldmVyeSB2YXJpYWJsZSAoZXhjZXB0LCBvcHRpb25hbGx5LCB0aGUgbGFzdCkgbXVzdCBiZQogICBmb2xsb3dlZCBieSBhIHZhbHVlLiBFeGFtcGxlczoKCiAgKCsrIGEpICAgICAgICAgICAgICAgIEVxdWl2YWxlbnQgdG8gKHNldHEgYSAoKyBhIDEpKSBhbmQgdG8gKCsrIGEgMSkKICAoKysgYSAyKSAgICAgICAgICAgICAgRXF1aXZhbGVudCB0byAoc2V0cSBhICgrIGEgMikpCiAgKC0tIGEgKCogMiBwaSkpICAgICAgIEVxdWl2YWxlbnQgdG8gKHNldHEgYSAoLSBhICgqIDIgcGkpKSkKICAoKysgYSAxIGIgMSBjIDEgZCkgICAgRXF1aXZhbGVudCB0byBmb3VyIFNFVFFzIGluY3JlbWVudGluZyBhLGIsYyxkIGJ5IDEuCgogICBBbm90aGVyIGdyb3VwIG9mIG9wZXJhdG9ycyBmb3JtcyB0aGUgcHJlZGljYXRlcy4gVGhlc2UgcmV0dXJuIGEgInRydXRoCiAgIHZhbHVlIiwgaW4gd2hpY2ggMCAob3IgTklMKSBpcyBmYWxzZSwgYW5kIDEgb3IgYW55IG90aGVyIG5vbnplcm8KICAgbnVtYmVyIGlzIHRydWUuCgogIE9wZXJhdG9yICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGFtcGxlICAgICAgICAgICBSZXN1bHQKICA9IChvciA9PSkgT3BlcmFuZHMgYXJlIGVxdWFsICAgICAgICAgICAgICAgICAgICAgKD0gMSAxLjApICAgICAgICAgMQogICE9ICAgICAgICBPcGVyYW5kcyBhcmUgbm90IGVxdWFsICAgICAgICAgICAgICAgICAoIT0gMSAxLjApICAgICAgICAwCiAgPCAgICAgICAgIE9wZXJhbmRzIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlciAgICg8IDEgMiAzKSAgICAgICAgIDEKICA8PSAgICAgICAgT3BlcmFuZHMgaW4gYXNjZW5kaW5nIG9yZGVyICAgICAgICAgICAgKDw9IDEgMSAyIDMpICAgICAgMQogID4gICAgICAgICBPcGVyYW5kcyBpbiBzdHJpY3RseSBkZXNjZW5kaW5nIG9yZGVyICAoPiAzIDIgMSkgICAgICAgICAxCiAgPj0gICAgICAgIE9wZXJhbmRzIGluIGRlc2NlbmRpbmcgb3JkZXIgICAgICAgICAgICg8PSAzIDMgMiAxKSAgICAgIDEKICBBTkQgKCYmKSAgT3BlcmFuZHMgYXJlIGFsbCB0cnVlICAgICAgICAgICAgICAgICAgKGFuZCAxIDEgMSAxIDApICAgMAogIE9SICAofHwpICBBdCBsZWFzdCBvbmUgb3BlcmFuZCBpcyB0cnVlICAgICAgICAgICAob3IgMSAxIDEgMSAwKSAgICAxCiAgWE9SICAgICAgIExvZ2ljYWwgRXhjbHVzaXZlIE9SICAgICAgICAgICAgICAgICAgICh4b3IgMyAxKSAgICAgICAgIDAKICBOT1QgKCEpICAgUmV2ZXJzZXMgdHJ1dGggdmFsdWUgb2Ygb3BlcmFuZCAgICAgICAgKG5vdCAzKSAgICAgICAgICAgMAoKICAgVGhlIEV4Y2x1c2l2ZSBPUiBvZiB0d28gdmFsdWVzIGlzIHRydWUgaWYgb25lIHZhbHVlIGlzIHRydWUgYW5kIHRoZQogICBvdGhlciB2YWx1ZSBpcyBmYWxzZS4KCiAgIEFuZCBhbm90aGVyIGdyb3VwIG9wZXJhdGVzIG9uIGJpdHMgd2l0aGluIGFuIGludGVnZXIgd29yZDoKCiAgT3BlcmF0b3IgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4YW1wbGUgICAgICAgICAgIFJlc3VsdAogICYgICAgICAgICBCaXR3aXNlIEFORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJiA3IDIpICAgICAgICAgICAyCiAgfCAgICAgICAgIEJpdHdpc2UgT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh8IDEgMiAzIDQpICAgICAgIDcKICAjICAgICAgICAgQml0d2lzZSBFeGNsdXNpdmUgT1IgICAgICAgICAgICAgICAgICAgKCMgMyAxKSAgICAgICAgICAgMgogIH4gICAgICAgICBSZXZlcnNlcyBhbGwgYml0cyAgICAgICAgICAgICAgICAgICAgICAofiAzKSAgICAgICAgICAgIC00CgogICBUaGVzZSBvcGVyYXRvcnMgY29lcmNlIHRoZWlyIG9wZXJhbmRzIHRvIGludGVnZXIgYnkgdHJ1bmNhdGlvbiBpZgogICBuZWNlc3NhcnkuIFRoZSByZXN1bHQgb2YgYml0IHJldmVyc2FsIGlzIGhhcmR3YXJlIGRlcGVuZGVudC4KCiAgIFRoZSBmaW5hbCBjYXRlZ29yeSBvZiBvcGVyYXRvciB3b3JrcyBvbiB0cnV0aCB2YWx1ZXM6CgogIE9wZXJhdG9yICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGFtcGxlICAgICAgICAgICBSZXN1bHQKICBJRiAgICAgICAgQ29uZGl0aW9uYWwgZXZhbHVhdGlvbiAgICAgICAgICAgICAgICAgKGlmICgxKSAyIDMpICAgICAgMgoKICAgSUYgKHByZWRpY2F0ZSkgKHMxKSBbIChzMikgXQogICAgICAgICAgVGhlIElGIG9wZXJhdG9yIGlzIHNpbWlsYXIgdG8gS2VybWl0J3MgSUYgY29tbWFuZC4gSWYgdGhlCiAgICAgICAgICBwcmVkaWNhdGUgaXMgdHJ1ZSAoaS5lLiBldmFsdWF0ZXMgdG8gYSBub256ZXJvIG51bWJlciksIHRoZQogICAgICAgICAgZmlyc3QgUy1FeHByZXNzaW9uIChzMSkgaXMgZXZhbHVhdGVkIGFuZCBpdHMgdmFsdWUgaXMgcmV0dXJuZWQuCiAgICAgICAgICBPdGhlcndpc2UsIGlmIChzMikgaXMgZ2l2ZW4sIGl0IGlzIGV2YWx1YXRlZCBhbmQgaXRzIHZhbHVlCiAgICAgICAgICByZXR1cm5lZDsgaWYgKHMyKSBpcyBub3QgZ2l2ZW4sIG5vdGhpbmcgaGFwcGVucyBhbmQgdGhlIE5JTAogICAgICAgICAgKGVtcHR5KSB2YWx1ZSBpcyByZXR1cm5lZC4KCiAgIFlvdSBjYW4gZ3JvdXAgbXVsdGlwbGUgZXhwcmVzc2lvbnMgaW4gdGhlIHMxIGFuZCBzMiBleHByZXNzaW9ucyB1c2luZwogICBFVkFMIChvciAiLiIpOgoKICAoaWYgKDwgYSAwKSAoZXZhbCAoc2V0cSB4IDApIChzZXRxIHkgMCkpIChldmFsIChzZXRxIHggYSkgKHNldHEgeSBiKSkpCgogICBvciBlcXVpdmFsZW50bHk6CgogIChpZiAoPCBhIDApICguIChzZXRxIHggMCkgKHNldHEgeSAwKSkgKC4gKHNldHEgeCBhKSAoc2V0cSB5IGIpKSkKCiAgIEVhY2ggb3BlcmF0b3IgaGFzIGl0cyBvd24gcmVxdWlyZW1lbnQgYXMgdG8gbnVtYmVyIGFuZCB0eXBlIG9mCiAgIG9wZXJhbmRzLiBJbiB0aGUgZm9sbG93aW5nIHRhYmxlLCAibnVtYmVyIiBtZWFucyBhbnkga2luZCBvZiBudW1iZXIgLS0KICAgaW50ZWdlciBvciBmbG9hdGluZy1wb2ludCAtLSBvciBhIHZhcmlhYmxlLCBmdW5jdGlvbiwgbWFjcm8sIG9yCiAgIFMtRXhwcmVzc2lvbiB0aGF0IHJldHVybnMgYSBudW1iZXI7ICJ2bmFtZSIgbWVhbnMgdmFyaWFibGUgbmFtZSwKICAgImZwbnVtYmVyIiBtZWFucyBhIGZsb2F0aW5nLXBvaW50IG51bWJlciAob3IgYW55dGhpbmcgdGhhdCByZXNvbHZlcyB0bwogICBvbmUpLCBhbmQgImludGVnZXIiIG1lYW5zIGludGVnZXIgKG9yIGFueXRoaW5nIHRoYXQgcmVzb2x2ZXMgdG8gb25lKS4KICAgInRydXRodmFsdWUiIG1lYW5zIGFueXRoaW5nIHRoYXQgcmVzb2x2ZXMgdG8gYSB2YWx1ZSBvZiB6ZXJvIG9yIGFuCiAgIGVtcHR5IHZhbHVlICh3aGljaCBpbmRpY2F0ZXMgZmFsc2UpIG9yIGEgbm9uemVybyB2YWx1ZSAod2hpY2gKICAgaW5kaWNhdGVzIHRydWUpLiAiYW55IiBtZWFucyBhbnkga2luZCBvZiB2YWx1ZSwgaW5jbHVkaW5nIG5vbmUgYXQgYWxsLgoKICBPcGVyYXRvciAgTnVtYmVyIG9mIG9wZXJhbmRzICAgVHlwZSBvZiBvcGVyYW5kcyAgICBSZXR1cm5zCiAgRVZBTCAgKC4pIDAgb3IgbW9yZSAgICAgICAgICAgIFMtRXhwcmVzc2lvbiAgICAgICAgTGFzdCB2YWx1ZSAoZGVmYXVsdCBOSUwpCiAgU1RSSU5HICAgIDEgICAgICAgICAgICAgICAgICAgIFMtRXhwcmVzc2lvbiAgICAgICAgc3RyaW5nCiAgUVVPVEUgKCcpIDEgICAgICAgICAgICAgICAgICAgIHdvcmQgICAgICAgICAgICAgICAgc3RyaW5nCiAgU0VUUSAgICAgIDAgb3IgbW9yZSAgICAgICAgICAgIHZuYW1lIHZhbHVlIHBhaXJzICAgTGFzdCB2YWx1ZSAoZGVmYXVsdCBOSUwpCiAgTEVUICAgICAgIDAgb3IgbW9yZSAgICAgICAgICAgIHZuYW1lIHZhbHVlIHBhaXJzICAgTGFzdCB2YWx1ZSAoZGVmYXVsdCBOSUwpCiAgKyAgICAgICAgIDAgb3IgbW9yZSAgICAgICAgICAgIG51bWJlciAgICAgICAgICAgICAgbnVtYmVyICAgICAoZGVmYXVsdCAwKQogIC0gICAgICAgICAwIG9yIG1vcmUgICAgICAgICAgICBudW1iZXIgICAgICAgICAgICAgIG51bWJlciAgICAgKGRlZmF1bHQgMCkKICAqICAgICAgICAgMCBvciBtb3JlICAgICAgICAgICAgbnVtYmVyICAgICAgICAgICAgICBudW1iZXIgICAgIChzZWUgbm90ZSAoMSkpCiAgLyAgICAgICAgIDIgb3IgbW9yZSAgICAgICAgICAgIG51bWJlciAgICAgICAgICAgICAgbnVtYmVyCiAgXiAgICAgICAgIDIgb3IgbW9yZSAgICAgICAgICAgIG51bWJlciAgICAgICAgICAgICAgbnVtYmVyCiAgKysgICAgICAgIDEgb3IgbW9yZSAgICAgICAgICAgIHZuYW1lIHZhbHVlIHBhaXJzICAgUmVzdWx0IG9mIGxhc3QgaW5jcmVtZW50CiAgLS0gICAgICAgIDEgb3IgbW9yZSAgICAgICAgICAgIHZuYW1lIHZhbHVlIHBhaXJzICAgUmVzdWx0IG9mIGxhc3QgZGVjcmVtZW50CiAgQUJTICAgICAgIDEgICAgICAgICAgICAgICAgICAgIG51bWJlciAgICAgICAgICAgICAgbnVtYmVyCiAgTUFYICAgICAgIDEgb3IgbW9yZSAgICAgICAgICAgIG51bWJlciAgICAgICAgICAgICAgbnVtYmVyCiAgTUlOICAgICAgIDEgb3IgbW9yZSAgICAgICAgICAgIG51bWJlciAgICAgICAgICAgICAgbnVtYmVyCiAgTU9EICglKSAgIDIgICAgICAgICAgICAgICAgICAgIG51bWJlciAgICAgICAgICAgICAgbnVtYmVyCiAgRkxPQVQgICAgIDEgICAgICAgICAgICAgICAgICAgIG51bWJlciAgICAgICAgICAgICAgZnBudW1iZXIKICBUUlVOQ0FURSAgMSAgICAgICAgICAgICAgICAgICAgbnVtYmVyICAgICAgICAgICAgICBpbnRlZ2VyCiAgQ0VJTElORyAgIDEgICAgICAgICAgICAgICAgICAgIG51bWJlciAgICAgICAgICAgICAgaW50ZWdlcgogIEZMT09SICAgICAxICAgICAgICAgICAgICAgICAgICBudW1iZXIgICAgICAgICAgICAgIGludGVnZXIKICBST1VORCAgICAgMSAgICAgICAgICAgICAgICAgICAgbnVtYmVyICAgICAgICAgICAgICBpbnRlZ2VyCiAgU1FSVCAgICAgIDEgICAgICAgICAgICAgICAgICAgIG51bWJlciAgICAgICAgICAgICAgZnBudW1iZXIKICBFWFAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgbnVtYmVyICAgICAgICAgICAgICBmcG51bWJlcgogIFNJTiAgICAgICAxICAgICAgICAgICAgICAgICAgICBudW1iZXIgICAgICAgICAgICAgIGZwbnVtYmVyCiAgQ09TICAgICAgIDEgICAgICAgICAgICAgICAgICAgIG51bWJlciAgICAgICAgICAgICAgZnBudW1iZXIKICBUQU4gICAgICAgMSAgICAgICAgICAgICAgICAgICAgbnVtYmVyICAgICAgICAgICAgICBmcG51bWJlcgogIExPRyAgICAgICAxICAgICAgICAgICAgICAgICAgICBudW1iZXIgICAgICAgICAgICAgIGZwbnVtYmVyCiAgTE9HMTAgICAgIDEgICAgICAgICAgICAgICAgICAgIG51bWJlciAgICAgICAgICAgICAgZnBudW1iZXIKICA9ICg9PSkgICAgMSBvciBtb3JlICAgICAgICAgICAgbnVtYmVyICAgICAgICAgICAgICB0cnV0aHZhbHVlCiAgIT0gICAgICAgIDEgb3IgbW9yZSAgICAgICAgICAgIG51bWJlciAgICAgICAgICAgICAgdHJ1dGh2YWx1ZQogIDwgICAgICAgICAxIG9yIG1vcmUgICAgICAgICAgICBudW1iZXIgICAgICAgICAgICAgIHRydXRodmFsdWUKICA8PSAgICAgICAgMSBvciBtb3JlICAgICAgICAgICAgbnVtYmVyICAgICAgICAgICAgICB0cnV0aHZhbHVlCiAgPiAgICAgICAgIDEgb3IgbW9yZSAgICAgICAgICAgIG51bWJlciAgICAgICAgICAgICAgdHJ1dGh2YWx1ZQogID49ICAgICAgICAxIG9yIG1vcmUgICAgICAgICAgICBudW1iZXIgICAgICAgICAgICAgIHRydXRodmFsdWUKICBBTkQgKCYmKSAgMSBvciBtb3JlICAgICAgICAgICAgdHJ1dGh2YWx1ZSAgICAgICAgICB0cnV0aHZhbHVlCiAgT1IgICh8fCkgIDEgb3IgbW9yZSAgICAgICAgICAgIHRydXRodmFsdWUgICAgICAgICAgdHJ1dGh2YWx1ZQogIFhPUiAgICAgICAyICAgICAgICAgICAgICAgICAgICB0cnV0aHZhbHVlICAgICAgICAgIHRydXRodmFsdWUKICBOT1QgKCEpICAgMSAgICAgICAgICAgICAgICAgICAgdHJ1dGh2YWx1ZSAgICAgICAgICB0cnV0aHZhbHVlCiAgJiAgICAgICAgIDEgb3IgbW9yZSAgICAgICAgICAgIG51bWJlciAoc2VlIG5vdGUgMikgaW50ZWdlcgogIHwgICAgICAgICAxIG9yIG1vcmUgICAgICAgICAgICBudW1iZXIgKHNlZSBub3RlIDIpIGludGVnZXIKICAjICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAgbnVtYmVyIChzZWUgbm90ZSAyKSBpbnRlZ2VyCiAgfiAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgIG51bWJlciAoc2VlIG5vdGUgMikgaW50ZWdlcgogIElGICAgICAgICAyIG9yIDMgICAgICAgICAgICAgICB0cnV0aHZhbHVlLGFueSxhbnkgIGFueQoKICAgT3BlcmF0b3JzIHRoYXQgZG9uJ3QgcmVxdWlyZSBhbnkgYXJndW1lbnRzIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZXMKICAgc2hvd24uCgogICAgMS4gVGhlIHZhbHVlIG9mICIqIiwgd2hlbiB1c2VkIGFzIGFuIG9wZXJhdG9yLCBpcyBpbml0aWFsbHkgIjEiIGFuZAogICAgICAgdGhlIHZhbHVlIG9mIHRoZSBtb3N0IHJlY2VudCBTLUV4cHJlc3Npb24gdGhlcmVhZnRlciwgYXMgaW4gRnJhbnoKICAgICAgIExpc3AuIFRoaXMgaXMgaGFuZHkgd2hlbiBkb2luZyBhIHNlcmllcyBvZiBjYWxjdWxhdGlvbnMgYnkgaGFuZDoKICBDLUtlcm1pdD4oKiAxMzI3Mi40MiAwLjQwKQogICA1MzA4Ljk2OAogIEMtS2VybWl0PigvICogMikKICAgMjY1NC40ODQwCiAgQy1LZXJtaXQ+CiAgICAyLiBUaGUgYml0d2lzZSBvcGVyYXRvcnMgY29lcmNlIHRoZWlyIG9wZXJhbmRzIHRvIGludGVnZXIgYnkKICAgICAgIHRydW5jYXRpb24uCgogICBbIFs1MDVdVG9wIF0gWyBbNTA2XUNvbnRlbnRzIF0gWyBbNTA3XUMtS2VybWl0IEhvbWUgXSBbIFs1MDhdS2VybWl0CiAgIEhvbWUgXQogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDkuNS4gVmFyaWFibGVzCgogICBBcyBub3RlZCBlbHNld2hlcmUgaW4gdGhpcyBkaXNjdXNzaW9uLCBhbGwgYmFja3NsYXNoIGl0ZW1zICh2YXJpYWJsZXMKICAgc3VjaCBhcyBcJWEsIG1hY3JvIHBhcmFtZXRlcnMgc3VjaCBhcyBcJTEsIGFycmF5IGVsZW1lbnRzIHN1Y2ggYXMKICAgXCZhW1wlaV0sIGJ1aWx0LWluIHZhcmlhYmxlcyBzdWNoIGFzIFx2KG5kYXRlKSwgYnVpbHQtaW4gZnVuY3Rpb25zCiAgIHN1Y2ggYXMgXGZqb2luKCksIG1hY3JvIG5hbWVzIGVuY2xvc2VkIGluIFxtKCksIFxzKCksIG9yIFw6KCksIGV0YykKICAgYXJlIGV2YWx1YXRlZCBhdCAidG9wIGxldmVsIiBiZWZvcmUgdGhlIFMtRXhwcmVzc2lvbiBpcyBzZW50IHRvIHRoZQogICBTLUV4cHJlc3Npb24gcmVhZGVyLiBUbyB1c2UgYSBiYWNrc2xhc2ggdmFyaWFibGUgYXMgdGhlIHRhcmdldCBvZiBhbgogICBhc3NpZ25tZW50IChlLmcuIGJ5IFNFVFEsIExFVCwgKyssIG9yIC0tKSwgeW91IG11c3QgZG91YmxlIHRoZQogICBiYWNrc2xhc2gsIGUuZy4gKHNldHEgXFwlciAxMjM0KS4gVGhpcyBpcyBkaXNjdXNzZWQgYXQgZ3JlYXRlciBsZW5ndGgKICAgaW4gdGhlIG5leHQgc2VjdGlvbi4KCiAgIFRodXMgUy1FeHByZXNzaW9uIHJlYWRlciBnZW5lcmFsbHkgZGVhbHMgb25seSB3aXRoIG1hY3JvIG5hbWVzIChub3QKICAgYmFja3NsYXNoIGl0ZW1zKSBhcyB2YXJpYWJsZXMuIEl0IGlzIGltcG9ydGFudCB0byB1bmRlcnN0YW5kIGhvdyB0aGUKICAgcmVhZGVyIGhhbmRsZXMgbWFjcm8gbmFtZXMuIFRoZXJlIGFyZSBmdW5kYW1lbnRhbGx5IHR3byBraW5kcyBvZgogICBTLUV4cHJlc3Npb25zOiB0aG9zZSB0aGF0IGNvbnRhaW4gYSBzaW5nbGUgZWxlbWVudCwgc3VjaCBhczoKCiAgKGZvbykKCiAgIGFuZCB0aG9zZSB0aGF0IGNvbnRhaW4gbW9yZSB0aGFuIG9uZSBlbGVtZW50OgoKICAoZm9vIGEgYiBjKQoKICAgSWYgYW4gUy1FeHByZXNzaW9uIGNvbnRhaW5zIG9ubHkgb25lIGVsZW1lbnQsIGFuZCBpdCBpcyB0aGUgbmFtZSBvZiBhCiAgIG1hY3JvLCB0aGUgbWFjcm8ncyBkZWZpbml0aW9uIGlzIGV4YW1pbmVkLiBJZiB0aGUgZGVmaW5pdGlvbiBpcyBhCiAgIG51bWJlciAoaW50ZWdlciBvciBmbG9hdGluZy1wb2ludCwgcG9zaXRpdmUgb3IgbmVnYXRpdmUpLCB0aGVuIHRoaXMKICAgYmVjb21lcyB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24uIElmIHRoZSBkZWZpbml0aW9uIHN0YXJ0cyB3aXRoICcKICAgKGFwb3N0cm9waGUpLCB0aGVuIHRoZSBxdW90ZWQgd29yZCBvciBzdHJpbmcgaXMgdGhlIHZhbHVlIG9mIHRoZQogICBleHByZXNzaW9uIChleHBsYWluZWQgaW4gWzUwOV1TZWN0aW9uIDkuOCkuIE90aGVyd2lzZSwgdGhlIG1hY3JvIGlzCiAgIGFzc3VtZWQgdG8gYmUgY29tcG9zZWQgb2YgS2VybWl0IGNvbW1hbmRzIChwb3NzaWJseSBpbmNsdWRpbmcKICAgUy1FeHByZXNzaW9ucyksIHdoaWNoIGFyZSBleGVjdXRlZC4gSWYgdGhlIG1hY3JvIGhhcyBhIFJFVFVSTiB2YWx1ZSwKICAgb3IgaXQgZXhlY3V0ZXMgYW4gUy1FeHByZXNzaW9uIGFzIGl0cyBsYXN0IGNvbW1hbmQsIHRoZSByZXN1bHQgYmVjb21lcwogICB0aGUgdmFsdWUgb2YgdGhlIFMtRXhwcmVzc2lvbjsgb3RoZXJ3aXNlIHRoZSByZXN1bHQgaXMgZW1wdHkuCgogICBGb3IgUy1FeHByZXNzaW9ucyB0aGF0IGNvbnRhaW4gbW9yZSB0aGFuIG9uZSBlbGVtZW50LCBhbmQgdGhlIGZpcnN0CiAgIGVsZW1lbnQgaXMgdGhlIG5hbWUgb2YgYSBtYWNybywgdGhlbiB0aGlzIG1hY3JvIGlzIGV4ZWN1dGVkIHdpdGggdGhlCiAgIGFyZ3VtZW50cyB0aGF0IGFyZSBnaXZlbiwgYWZ0ZXIgdGhlIGFyZ3VtZW50cyBhcmUgZXZhbHVhdGVkIGJ5IHRoZQogICBTLUV4cHJlc3Npb24gcmVhZGVyLiBMaWtld2lzZSwgSWYgdGhlIGZpcnN0IGVsZW1lbnQgaXMgYSBidWlsdC1pbgogICBvcGVyYXRvciwgdGhlbiBpdCBpcyBhcHBsaWVkIHRvIHRoZSBvcGVyYW5kcyBhZnRlciB0aGV5IGFyZSBldmFsdWF0ZWQuCiAgIEluIGJvdGggY2FzZXMsIGVhY2ggb3BlcmFuZCBpcyBmZWQgdG8gdGhlIFMtRXhwcmVzc2lvbiByZWFkZXIKICAgcmVjdXJzaXZlbHkgZm9yIGV2YWx1YXRpb24uIElmIGFuIG9wZXJhbmQgaXMgYSBudW1iZXIgb3IgYSBxdW90ZWQKICAgc3RyaW5nLCBpdCBpcyB1c2VkIGFzLWlzLiBCdXQgaWYgaXQncyBhIG1hY3JvIG5hbWUsIHRoaXMgZGVnZW5lcmF0ZXMKICAgaW50byB0aGUgZmlyc3QgY2FzZSwgYW5kIHRoZSBwcmV2aW91cyBwYXJhZ3JhcGggYXBwbGllcy4KCiAgIEV4YW1wbGVzOgoKICBkZWZpbmUgZm9vIDEyMwogIChmb28pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHQ6IDEyMwogIGRlZmluZSBmb28gJ2FiYwogIChmb28pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHQ6IGFiYwogIGRlZmluZSBmb28gJyhvbmUgdHdvIHRocmVlKQogIChmb28pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHQ6IG9uZSB0d28gdGhyZWUKICBkZWZpbmUgZm9vIHJldHVybiBcZnJhbmRvbSgxMDAwKQogIChmb28pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHQ6IDcxMyAob3Igb3RoZXIgbnVtYmVyKQogIGRlZmluZSBmb28gKCsgYSBiKQogIChmb28pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHQ6IFRoZSBzdW0gb2YgYSBhbmQgYgoKICAgQSBtb3JlIGRpZmZpY3VsdCBleGFtcGxlOgoKICBkZWZpbmUgZm9vIGFiYwogIChmb28pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHQ6ID8/PwoKICAgVGhlIHJlc3VsdCBpbiB0aGUgbGFzdCBleGFtcGxlIGRlcGVuZHMgb24gdGhlIGRlZmluaXRpb24gb2YgYWJjOgoKICAgICAqIElmIGl0IGhhcyBubyBkZWZpbml0aW9uLCBhbiBlcnJvciBvY2N1cnM7IG90aGVyd2lzZToKICAgICAqIElmIHRoZSBkZWZpbml0aW9uIGlzIGFuIFMtRXhwcmVzc2lvbiwgdGhlIHJlc3VsdCBpcyB0aGUKICAgICAgIFMtRXhwcmVzc2lvbidzIHZhbHVlOyBvdGhlcndpc2U6CiAgICAgKiBJZiB0aGUgZGVmaW5pdGlvbiBjb25zaXN0cyBvZiBLZXJtaXQgY29tbWFuZHMsIHRoZXkgYXJlIGV4ZWN1dGVkLgogICAgICAgQnV0IGluIHRoaXMgY2FzZSAiKGZvbykiIHByb2R1Y2VzIHRoZSBlbXB0eSByZXN1bHQsIGJlY2F1c2UgaXQKICAgICAgIGRvZXNuJ3QgUkVUVVJOIGFueXRoaW5nLgoKICAgVGhlIHVzZSBvZiBtYWNyb3MgYXMgUy1FeHByZXNzaW9uIG9wZXJhdG9ycyBpcyBkZXNjcmliZWQgaW4KICAgWzUxMF1TZWN0aW9uIDkuOC4KCiAgIFsgWzUxMV1Ub3AgXSBbIFs1MTJdQ29udGVudHMgXSBbIFs1MTNdQy1LZXJtaXQgSG9tZSBdIFsgWzUxNF1LZXJtaXQKICAgSG9tZSBdCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgOS42LiBBc3NpZ25tZW50cyBhbmQgU2NvcGUKCiAgIFRoZSBhc3NpZ25tZW50IG9wZXJhdG9ycyBTRVRRIGFuZCBMRVQgYXBwbHkgdG8gZ2xvYmFsIGFuZCBsb2NhbAogICB2YXJpYWJsZXMsIHJlc3BlY3RpdmVseS4gU0VUUSBhbmQgTEVUIGFyZSBzdGFuZGFyZCBMaXNwIG9wZXJhdG9ycwogICBhZGFwdGVkIHRvIEtlcm1pdCBzY29waW5nIHJ1bGVzLiBXaGVuIHRoZSBvcGVyYW5kcyBhcmUgbnVtZXJpYyBvcgogICBhcml0aG1ldGljLCBTRVRRIGlzIGVxdWl2YWxlbnQgdG8gS2VybWl0J3MgRVZBTFVBVEUgY29tbWFuZDoKCiAgKHNldHEgYSAoKyAxIDIpKQogIGV2YWx1YXRlIGEgMSArIDIKCiAgIFdoZW4gdGhlIG9wZXJhbmQgaXMgYSBzdHJpbmcsIFNFVFEgaXMgZXF1aXZhbGVudCB0byBERUZJTkU6CgogIChzZXRxIGEgJyh0aGlzIGlzIGEgc3RyaW5nKSkKICBkZWZpbmUgYSB0aGlzIGlzIGEgc3RyaW5nCgogICBJbiB0aGUgZmlyc3QgY2FzZSwgYm90aCBzdGF0ZW1lbnRzIGNyZWF0ZSBhIG1hY3JvIG5hbWVkICJhIiB3aXRoIGEKICAgdmFsdWUgb2YgMy4gQnV0IGluIG5laXRoZXIgY2FzZSBpcyB0aGUgbWFjcm8gImEiIG5lY2Vzc2FyaWx5IGdsb2JhbC4KICAgSWYgZWl0aGVyIG9mIHRoZXNlIGNvbW1hbmRzIGV4ZWN1dGVzIGluIGFuIGVudmlyb25tZW50IChpLmUuIG1hY3JvCiAgIGludm9jYXRpb24gbGV2ZWwpIHdoZXJlIGEgImxvY2FsIGEiIGNvbW1hbmQgaGFzIGJlZW4gZ2l2ZW4sIHRoZSAiYSIKICAgbWFjcm8gaXMgZ2xvYmFsIHRvIHRoYXQgZW52aXJvbm1lbnQsIGJ1dCBpcyBub3QgdmlzaWJsZSBvdXRzaWRlIGl0LgoKICAgTEVUIGlzIGVxdWl2YWxlbnQgdG8gdGhlIEtlcm1pdCBMT0NBTCBjb21tYW5kLCBmb2xsb3dlZCBieSB0aGUKICAgY29ycmVzcG9uZGluZyBFVkFMVUFURToKCiAgKGxldCBhICgrIDEgMikpCgogICBpcyBlcXVpdmFsZW50IHRvOgoKICBsb2NhbCBhCiAgZXZhbHVhdGUgYSAxICsgMgoKICAgQWdhaW4sICJsb2NhbCIgaW4gdGhpcyBjb250ZXh0IGFwcGxpZXMgdG8gdGhlIEtlcm1pdCBtYWNybyBpbnZvY2F0aW9uCiAgIHN0YWNrLCBub3QgdG8gdGhlIFMtRXhwcmVzc2lvbiBuZXN0aW5nIGxldmVsLiBUbyBpbGx1c3RyYXRlLCByZWNhbGwKICAgb3VyICJuZXdhcmVhIiBtYWNybzoKCmRlZiBuZXdhcmVhIHsKICAgIChsZXQgYSBcJTEgYiBcJTIgYyBcJTMpCiAgICAobGV0IHMgKC8gKCsgYSBiIGMpIDIuMCkpCiAgICAoc3FydCAoKiBzICgtIHMgYSkgKC0gcyBiKSAoLSBzIGMpKSkKfQoKICAgQmVjYXVzZSBTRVRRIGFuZCBMRVQgZXhwcmVzc2lvbnMgcmV0dXJuIGEgdmFsdWUsIHRoZXkgY2FuIGJlIHBsYWNlZAogICB3aXRoaW4gYSBsYXJnZXIgUy1FeHByZXNzaW9uLiBJbiB0aGlzIGNhc2Ugd2UgY2FuIHJlcGxhY2UgdGhlIGZpcnN0CiAgIHJlZmVyZW5jZSB0byB0aGUgInMiIHZhcmlhYmxlIGJ5IGl0cyBkZWZpbmluZyBleHByZXNzaW9uOgoKZGVmIG5ld2FyZWEgewogICAgKGxldCBhIFwlMSBiIFwlMiBjIFwlMykKICAgIChzcXJ0ICgqIChsZXQgcyAoLyAoKyBhIGIgYykgMi4wKSkgKC0gcyBhKSAoLSBzIGIpICgtIHMgYykpKQp9CgogICBUaGlzIHdvdWxkIG5vdCB3b3JrIGlmIExFVCB3ZXJlIGxvY2FsIHRvIHRoZSBTLUV4cHJlc3Npb24sIGJ1dCBpdAogICB3b3JrcyBuaWNlbHkgaW4gdGhlIGNvbnRleHQgb2YgS2VybWl0IG1hY3Jvcy4gVGhlIHByZXZpb3VzIGRlZmluaXRpb24KICAgaXMgZXF1aXZhbGVudCB0bzoKCmRlZiBuZXdhcmVhIHsKICAgIGxvY2FsIGEgYiBjIHMKICAgIChzZXRxIGEgXCUxIGIgXCUyIGMgXCUzKQogICAgKHNxcnQgKCogKHNldHEgcyAoLyAoKyBhIGIgYykgMi4wKSkgKC0gcyBhKSAoLSBzIGIpICgtIHMgYykpKQp9CgogICBJbiBib3RoIGNhc2VzLCB0aGUgdmFyaWFibGVzIGEsIGIsIGMsIGFuZCBzIGFyZSBsb2NhbCB0byB0aGUgIm5ld2FyZWEiCiAgIG1hY3JvLCBhbmQgZ2xvYmFsIHdpdGhpbiBpdC4KCiAgIE11bHRpcGxlIGFzc2lnbm1lbnRzIGNhbiBiZSBoYW5kbGVkIGluIHNldmVyYWwgd2F5cy4gSGVyZSBpcyB0aGUKICAgb2J2aW91cyB3YXkgdG8gaW5pdGlhbGl6ZSBhIHNlcmllcyBvZiB2YXJpYWJsZXMgdG8gdGhlIHNhbWUgdmFsdWU6CgogIChzZXRxIGEgMCkKICAoc2V0cSBiIDApCiAgKHNldHEgYyAwKQogIChzZXRxIHMgMCkKCiAgIEhlcmUgaXMgYSBtb3JlIGNvbXBhY3QgYW5kIGVmZmljaWVudCB3YXkgb2YgZG9pbmcgdGhlIHNhbWUgdGhpbmc6CgogIChzZXRxIGEgMCBiIDAgYyAwIHMgMCkKCiAgIEhvd2V2ZXIsIGluIGNhc2UgdGhlIHZhbHVlIHdhcyBtb3JlIGNvbXBsZXgsIGl0J3MgYmV0dGVyIHRvIHB1dCBvbmx5CiAgIG9uZSBjb3B5IG9mIGl0IGluIHRoZSBTLUV4cHJlc3Npb247IGluIHRoaXMgY2FzZSB3ZSByZWx5IG9uIHRoZSBmYWN0CiAgIHRoYXQgU0VUUSByZXR1cm5zIHRoZSB2YWx1ZSBvZiBpdHMgbGFzdCBhc3NpZ25tZW50OgoKICAoc2V0cSBhIChzZXRxIGIgKHNldHEgYyAoc2V0cSBzICgqIHggKF4geSAyKSkpKSkpCgogICBTaW1pbGFybHksIHRvIHNldCBhIHNlcmllcyBvZiB2YXJpYWJsZXMgdG8geCwgeCsxLCB4KzIsIC4uLgoKICAoc2V0cSBjICgrIChzZXRxIGIgKCsgKHNldHEgYSAoKyAoc2V0cSBzIHgpIDEpKSAxKSkgMSkpCgogICBJbiB0aGUgbGFzdCBleGFtcGxlLCB5b3UgY2FuIHNlZSB3aHkgImxhc3QiIGRvZXMgbm90IGFsd2F5cyBjb3JyZXNwb25kCiAgIHRvICJyaWdodG1vc3QiICh0aGUgbGVmdG1vc3QgdmFyaWFibGUgImMiIGlzIGFzc2lnbmVkIGxhc3QpLgoKICAgSWYgeW91IGFyZSB3b3JraW5nIHdpdGggYmFja3NsYXNoIHZhcmlhYmxlcyBsaWtlIFwlYSBvciBhcnJheSBlbGVtZW50cwogICBsaWtlIFwmYVsxXSwgcmVtZW1iZXIgdHdvIHJ1bGVzOgogICAgMS4gRG9uJ3QgcHV0IHNwYWNlcyBpbnNpZGUgYXJyYXkgYnJhY2tldHMuCiAgICAyLiBZb3UgbXVzdCBkb3VibGUgdGhlIGJhY2tzbGFzaCB3aGVuIHVzaW5nIFNFVFEsIExFVCwgKyssIG9yIC0tIHRvCiAgICAgICBhc3NpZ24gYSB2YWx1ZSB0byBhIGJhY2tzbGFzaCB2YXJpYWJsZS4KCiAgIEV4YW1wbGVzIG9mIGFzc2lnbmluZyB0byBhIGJhY2tzbGFzaCB2YXJpYWJsZToKCiAgKHNldHEgeCAxKQogIChzZXRxIFxcJWEgMCkKICAoc2V0cSBcXCZhW3grMV0gMSkKICAoKysgXFwleCkKICAoLS0gXFwmYVt4KzJdKQoKICAgRXhhbXBsZXMgb2YgcmVmZXJyaW5nIHRvIGEgYmFja3NsYXNoIHZhcmlhYmxlJ3MgdmFsdWU6CgogIChzZXRxIGEgKCsgXCVhIDEpKQogIChzZXRxIGIgKCsgXCVhIFwmYVsxXSkpCiAgKCsrIGEgXCV4KQogICgtLSBiIFwmYVsxXSkKCiAgIFRoZSBzcGVjaWFsIG5vdGF0aW9uIGlzIHJlcXVpcmVkIGJlY2F1c2UgYWxsIGJhY2tzbGFzaGVkIGl0ZW1zIChcJXgKICAgdmFyaWFibGVzLCBhcnJheSBlbGVtZW50cywgYnVpbHQtaW4gXHYoeHh4KSB2YXJpYWJsZXMsIGFuZCBcZnh4eCgpCiAgIGZ1bmN0aW9uIGludm9jYXRpb25zKSBhcmUgZXZhbHVhdGVkIGluIGEgc2luZ2xlIHBhc3MgQkVGT1JFIHRoZQogICBTLUV4cHJlc3Npb24gaXMgZXhlY3V0ZWQ7IGFueSBvdGhlciBhcHByb2FjaCB3b3VsZCByZXN1bHQgaW4KICAgdW5hY2NlcHRhYmxlIHBlcmZvcm1hbmNlLiBTbywgZm9yIGV4YW1wbGUsIGluOgoKICBkZWNsYXJlIFwmYVtdID0gMSAyIDMKICBkZWZpbmUgXCV4IDQKICBkZWZpbmUgXCV5IDAKICAoc2V0cSBcXCV5ICgrIFwleCBcJmFbMV0pKQoKICAgdGhlIFMtRXhwcmVzc2lvbiBiZWNvbWVzOgoKICAoc2V0cSBcJXkgKCsgNCAxKSkKCiAgIGJlZm9yZSBpdCBpcyBzZW50IHRvIHRoZSBTLUV4cHJlc3Npb24gZXZhbHVhdG9yLiBJZiB0aGUgYmFja3NsYXNoIGhhZAogICBub3QgYmVlbiBkb3VibGVkIG9uIHRoZSBhc3NpZ25tZW50IHRhcmdldCwgdGhlIHJlc3VsdCB3b3VsZCBoYXZlIGJlZW46CgogIChzZXRxIDAgKCsgNCAxKSkKCiAgIHdoaWNoIGlzIGlsbGVnYWwgYmVjYXVzZSB5b3UgY2FuJ3QgYXNzaWduIGEgdmFsdWUgdG8gYSBudW1iZXIuCiAgIENvbnZlcnNlbHksIGlmIGJhY2tzbGFzaGVzIHdlcmUgZG91YmxlZCBvbiByaWdodC1oYW5kLXNpZGUgdmFsdWVzOgoKICAoc2V0cSBcXCV5ICgrIFxcJXggXFwmYVsxXSkKCiAgIHRoaXMgdG9vLCB3b3VsZCBnaXZlIGFuIGVycm9yIChub3QgbnVtZXJpYyAtICJcJXgiKS4KCiAgIElmIHlvdSBvbWl0IHRoZSBkb3VibGUgYmFja3NsYXNoIGluIHRoZSBhc3NpZ25tZW50IHRhcmdldCwgdGhlIHJlc3VsdAogICBkZXBlbmRzIG9uIHdoZXRoZXIgdGhlIHZhcmlhYmxlIGFscmVhZHkgaGFzIGEgdmFsdWU6CgogIChzZXRxIFwlYSAoKiAzIDMpKQoKICAgSWYgXCVhIGhhcyBhIG5vbi1udW1lcmljIHNpbmdsZS13b3JkIHZhbHVlLCB0aGVuIHRoaXMgYmVjb21lcyB0aGUgbmFtZQogICBvZiB0aGUgdmFyaWFibGUgdGhhdCBpcyBhc3NpZ25lZCBieSBTRVRRLiBUbyBpbGx1c3RyYXRlOgoKICBkZWZpbmUgXCVhIGZvbwogIGVjaG8gXCVhCiAgZm9vCiAgKHNldHEgXCVhICgqIDMgMykpCiAgZWNobyBcJWEKICBmb28KICBzaG93IG1hY3JvIGZvbwogIGZvbyA9IDkKCiAgIElmIFwlYSBoYXMgbm8gdmFsdWUsIGEgbnVtZXJpYyB2YWx1ZSwgb3IgYSBtdWx0aXdvcmQgdmFsdWUsIGFuCiAgICJpbnZhbGlkIGFzc2lnbm1lbnQiIGVycm9yIG9jY3Vycy4KCiAgIFsgWzUxNV1Ub3AgXSBbIFs1MTZdQ29udGVudHMgXSBbIFs1MTddQy1LZXJtaXQgSG9tZSBdIFsgWzUxOF1LZXJtaXQKICAgSG9tZSBdCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgOS43LiBDb25kaXRpb25hbCBFeHByZXNzaW9ucwoKICAgVGhlIElGIG9wZXJhdG9yIHByb3ZpZGVzIGEgY29tcGFjdCBmb3JtIG9mIGRlY2lzaW9uLW1ha2luZyB3aXRoaW4KICAgUy1FeHByZXNzaW9ucy4gQW4gSUYgZXhwcmVzc2lvbiBjYW4gc3RhbmQgd2hlcmV2ZXIgYSBudW1iZXIgbWlnaHQKICAgc3RhbmQsIGFzIGxvbmcgaXMgaXQgcmV0dXJucyBhIG51bWJlci4gSGVyZSdzIGEgcXVpY2sgd2F5IHRvIG9idGFpbgogICB0aGUgYXZlcmFnZSB2YWx1ZSBvZiBhbGwgdGhlIGVsZW1lbnRzIGluIGFuIGFycmF5IHRoYXQgY29udGFpbnMgb25seQogICBudW1iZXJzOgoKICAoLyAoKyBcZmpvaW4oJmEpKSAoZmxvYXQgXGZkaW0oJmEpKSkKCiAgIFRoaXMgcmVzdWx0cyBpbiBhICJEaXZpZGUgYnkgemVybyIgZXJyb3IgaWYgdGhlIGFycmF5IGlzIGVtcHR5LiBJZiB5b3UKICAgd2FudCB0byBkZWZpbmUgdGhlIGF2ZXJhZ2UgdmFsdWUgb2YgYW4gZW1wdHkgYXJyYXkgdG8gYmUgMCBpbnN0ZWFkIG9mCiAgIGdldHRpbmcgYW4gZXJyb3IsIHlvdSBjYW4gdXNlIElGIHRvIGNoZWNrIHRoZSBhcnJheSBzaXplOgoKICAoaWYgXGZkaW0oJmEpICgvICgrIFxmam9pbigmYSkpIChmbG9hdCBcZmRpbSgmYSkpKSAwKQoKICAgb3IgZXF1aXZhbGVudGx5OgoKICAoaWYgKG5vdCBcZmRpbSgmYSkpIDAgKC8gKCsgXGZqb2luKCZhKSkgKGZsb2F0IFxmZGltKCZhKSkpKQoKICAgT2YgY291cnNlLCBJRiBjYW4gZml0IGFueXdoZXJlIGVsc2UgaW50byBhbiBTLUV4cHJlc3Npb246CgogIChzZXRxIGEgKCsgYiAoaWYgKDwgYyAwKSAwIGMpKSkKCiAgIGFuZCB0aGUgSUYgZXhwcmVzc2lvbiBjYW4gYmUgYXMgY29tcGxleCBhcyB5b3UgbGlrZToKCiAgKHNldHEgYSAoKyBiIChpZiAoYW5kIChvciAoPiB4IDApICg+IHkgMCkpICg8IGMgMCkgKD4gZCAxKSAoIT0gZSAwKSkgMSAwKSkpCgogICBhbmQgdGhlICJ0aGVuIiBhbmQgImVsc2UiIHBhcnRzIGNhbiBjb250YWluIG11bHRpcGxlIFMtRXhwcmVzc2lvbnMKICAgZW5jbG9zZWQgd2l0aGluIChFVkFMIC4uLik6CgogIChpZiB4IChldmFsICguLi4pICguLi4pICguLi4pKSAoZXZhbCAoLi4uKSAoLi4uKSAoLi4uKSkpCgogICBBTkQgYW5kIE9SIG9wZXJhdG9ycyBhcmUgZ3VhcmFudGVlZCB0byAic2hvcnQgY2lyY3VpdCIuIElmIGFueSBvcGVyYW5kCiAgIG9mIEFORCBpcyBmYWxzZSwgbm9uZSBvZiB0aGUgc3Vic2VxdWVudCBvcGVyYW5kcyBpcyBldmFsdWF0ZWQ7CiAgIGxpa2V3aXNlLCBpZiBhbiBPUiBvcGVyYW5kIGlzIHRydWUsIG5vIGZ1cnRoZXIgb3BlcmFuZHMgYXJlIGV2YWx1YXRlZC4KCiAgIEJlYXIgaW4gbWluZCB0aGF0IHRoZSBTLUV4cHJlc3Npb24gSUYgaXMgbm90IHRoZSBzYW1lIGFzIEtlcm1pdCBJRjsKICAgdGhlIGNvbmRpdGlvbiBpcyBvbmx5IGFsbG93ZWQgdG8gYmUgYW4gUy1FeHByZXNzaW9uIG9yIGEgdmFyaWFibGUgb3IKICAgbnVtYmVyLCBub3QgdGhlIHdob2xlIGxpc3Qgb2YgcG9zc2liaWxpdGllcyB5b3Ugc2VlIHdoZW4geW91IHR5cGUgImlmCiAgID8iIGF0IHRoZSBDLUtlcm1pdD4gcHJvbXB0LiBCdXQga2VlcCByZWFkaW5nLi4uCgogICBbIFs1MTldVG9wIF0gWyBbNTIwXUNvbnRlbnRzIF0gWyBbNTIxXUMtS2VybWl0IEhvbWUgXSBbIFs1MjJdS2VybWl0CiAgIEhvbWUgXQogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDkuOC4gRXh0ZW5zaWJpbGl0eQoKICAgVG8gZXh0ZW5kIHRoZSBjYXBhYmlsaXRpZXMgb2YgUy1FeHByZXNzaW9ucywgeW91IGNhbiB1c2UgS2VybWl0IG1hY3JvCiAgIG5hbWVzIGFzIG9wZXJhdG9ycywgd2l0aCB0aGUgZm9sbG93aW5nIGxpbWl0YXRpb25zOgoKICAgICAqIFRoZSBtYWNybyBtdXN0IG5vdCBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgYSBidWlsdC1pbiBvcGVyYXRvci4KICAgICAqIFlvdSBtdXN0IHVzZSB0aGUgZnVsbCBtYWNybyBuYW1lLCBub3QgYW4gYWJicmV2aWF0aW9uLgoKICAgQW5kIHdpdGggdGhlIGZvbGxvd2luZyBlbmhhbmNlbWVudDoKCiAgICAgKiBJZiB0aGUgbGFzdCBzdGF0ZW1lbnQgZXhlY3V0ZWQgYnkgdGhlIG1hY3JvIGlzIGFuIFMtRXhwcmVzc2lvbiwKICAgICAgIGl0cyB2YWx1ZSBpcyByZXR1cm5lZCBhdXRvbWF0aWNhbGx5LiBJbiBvdGhlciB3b3JkczoKCiAgZGVmaW5lIGJ1bXAgKCsrIFwlMSkKCiAgIGlzIGVxdWl2YWxlbnQgdG86CgogIGRlZmluZSBidW1wIHJldHVybiBcZnNleHByZXNzaW9uKCsrIFwlMSkKCiAgIEhlcmUncyBhbiBleGFtcGxlIGluIHdoaWNoIHdlIGRlZmluZSBhIEZJQk9OQUNDSSBvcGVyYXRvciB0aGF0IHJldHVybnMKICAgdGhlIG50aCBlbGVtZW50LCBuID49IDAsIG9mIHRoZSBGaWJvbmFjY2kgc2VyaWVzLCAwIDEgMSAyIDMgNSA4IDEzIDIxCiAgIDM0IDU1LCAuIC4gLiwgaW4gd2hpY2ggdGhlIGZpcnN0IGVsZW1lbnQgaXMgMCwgdGhlIHNlY29uZCBpcyAxLCBhbmQKICAgZWFjaCBzdWJzZXF1ZW50IGVsZW1lbnQgaXMgdGhlIHN1bSBvZiB0aGUgdHdvIGJlZm9yZSBpdC4gVGhpcyBzZXJpZXMKICAgd2FzIGRldmlzZWQgYnkgTGVvbmFyZG8gUGlzYW5vLCBGaWxpdXMgQm9uYWNjaSAoRmlib25hY2NpIGZvciBzaG9ydCkKICAgaW4gMTIwMiB0byBkZXNjcmliZSBob3cgZmFzdCByYWJiaXRzIGNhbiBicmVlZCwgYW5kIGFsc28gZm9ybXMgdGhlCiAgIGJhc2lzIGZvciB0aGUgR29sZGVuIE1lYW4sIHRoZSBicmFuY2hpbmcgYmVoYXZpb3Igb2YgcGxhbnRzLCB0aGUKICAgc3BpcmFsIG9mIGEgbmF1dGlsdXMgc2hlbGwsIGV0Yy4gKFRoYW5rcyB0byBbNTIzXURhdCBUaHVjIE5ndXllbiBmb3IKICAgRGVjZW1iZXIgMjAwMyBjb3JyZWN0aW9ucyB0byB0aGlzIHNlY3Rpb24hKQoKICAgV2UgY2FuIHdyaXRlIGEgRklCT05BQ0NJIGZ1bmN0aW9uIGFzIGEgbWFjcm8gZWFzaWx5IHdpdGgKICAgUy1FeHByZXNzaW9uczoKCiAgZGVmaW5lIEZJQk9OQUNDSSB7CiAgICAoaWYgKD09IFwlMSAwKSAwCiAgICAgICAgKGlmICg9PSBcJTEgMSkgMSAoKyAoZmlib25hY2NpICgtIFwlMSAyKSkgKGZpYm9uYWNjaSAoLSBcJTEgMSkpKSkpCiAgfQoKICAgWW91IGNhbiByZWFkIHRoaXMgYXM6CgogICAgIElmIHRoZSBhcmd1bWVudCAoXCUxKSBpcyAwLCByZXR1cm4gYSByZXN1bHQgb2YgMDsgaWYgaXQgaXMgMSwKICAgICByZXR1cm4gMTsgb3RoZXJ3aXNlOgogICAgIHJldHVybiB0aGUgc3VtIG9mIGZpYm9uYWNjaShhcmd1bWVudCAtIDIpIGFuZCBmaWJvbmFjY2koYXJndW1lbnQgLQogICAgIDEpCgogICBOb3RlIHRoYXQgYSBSRVRVUk4gc3RhdGVtZW50IGlzIG5vdCBuZWVkZWQsIHNpbmNlIFMtRXhwcmVzc2lvbnMKICAgYXV0b21hdGljYWxseSBzZXQgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGVpciBjb250YWluaW5nIG1hY3Jvcy4KCiAgIEZvciBjb21wYXJpc29uLCBoZXJlJ3MgaG93IGl0IHdvdWxkIGJlIGNvZGVkIHdpdGhvdXQgUy1FeHByZXNzaW9uczoKCiAgZGVmaW5lIEZJQk9OQUNDSSB7CiAgICAgIGlmID09IFwlMSAwIHsKICAgICAgICAgIHJldHVybiAwCiAgICAgIH0gZWxzZSBpZiA9PSBcJTEgMSB7CiAgICAgICAgICByZXR1cm4gMQogICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIFxmZXZhbChcZmV4ZWMoZmlib25hY2NpIFxmZXZhbChcJTEtMikpIC0KICAgICAgICAgICAgICAgKyBcZmV4ZWMoZmlib25hY2NpIFxmZXZhbChcJTEtMSkpKQogICAgICB9CiAgfQoKICAgTm93IHdlIGNhbiB1c2UgdGhlIEZJQk9OQUNDSSBmdW5jdGlvbiAod2hpY2hldmVyIHdheSB5b3Ugd3JpdGUgaXQpCiAgIGp1c3QgYXMgaWYgaXQgd2VyZSBhIGJ1aWx0LWluIG9wZXJhdG9yOgoKICAoZmlib25hY2NpIDYpCgogICBPcjoKCiAgKHNldHEgYSAxMCkKICAoZmlib25hY2NpIGEpCgogICBXaXRoaW4gUy1FeHByZXNzaW9ucyBvbmx5IChub3Qgb3V0c2lkZSB0aGVtKSwgUy1FeHByZXNzaW9ucyB0aGVtc2VsdmVzCiAgIGNhbiBiZSB1c2VkIGFzIG1hY3JvIGFyZ3VtZW50czoKCiAgKHNldHEgYSAyIGIgNCkKICAoc2V0cSB4IChmaWJvbmFjY2kgKCogYSBiICkpKQoKICAgVGhlIHZhbHVlIG9mIHRoZSBTLUV4cHJlc3Npb24gKGluIHRoaXMgY2FzZSAiOCIpLCBhbmQgbm90IHRoZQogICBTLUV4cHJlc3Npb24gaXRzZWxmLCBpcyBzZW50IHRvIHRoZSBtYWNyby4KCiAgIFlvdXIgbWFjcm8gaXMgcmVzcG9uc2libGUgZm9yIGFyZ3VtZW50IHZhbGlkYXRpb24gYW5kIGVycm9yIGhhbmRsaW5nLgogICBBIHJvYnVzdCBGaWJvbmFjY2kgbWFjcm8gd291bGQgYmUgbW9yZSBsaWtlIHRoaXM6CgogIGRlZmluZSBGSUJPTkFDQ0kgewogICAgICBpZiA8IFx2KGFyZ2MpIDIgZW5kIDEgP1wlMDogTWlzc2luZyBhcmd1bWVudAogICAgICBpZiA+IFx2KGFyZ2MpIDIgZW5kIDEgP1wlMDogVG9vIG1hbnkgYXJndW1lbnRzCiAgICAgIGlmIG5vdCBpbnRlZ2VyIFwlMSBlbmQgMSA/XCUwOiBJbnRlZ2VycyBvbmx5CiAgICAgIGlmIDwgXCUxIDEgZW5kIDEgP1wlMDogQXJndW1lbnQgb3V0IG9mIHJhbmdlCiAgICAgIChpZiAoPT0gXCUxIDApIDAKICAgICAgICAgKGlmICg9PSBcJTEgMSkgMSAoKyAoZmlib25hY2NpICgtIFwlMSAyKSkgKGZpYm9uYWNjaSAoLSBcJTEgMSkpKSkpCiAgfQoKICAgUmVjYWxsIHRoYXQgIkVORCBub256ZXJvLW51bWJlciBbIG1lc3NhZ2UgXSIgY2F1c2VzIGEgbWFjcm8gaW52b2NhdGlvbgogICB0byBmYWlsLiBXaGVuIHRoZSBtYWNybyBpcyB0aGUgb3BlcmF0b3IgaW4gYW4gUy1FeHByZXNzaW9uLCB0aGlzIG1ha2VzCiAgIHRoZSBTLUV4cHJlc3Npb24gZmFpbCB0b28uIEFsc28gbm90ZSB0aGF0IG91ciBGaWJvbmFjY2kgbWFjcm8gaXMganVzdAogICBhbiBpbGx1c3RyYXRpb24sIG5vdCBhIHByYWN0aWNhbCBleGFtcGxlLiBTaW5jZSBpdCBpcyByZWN1cnNpdmUgKGNhbGxzCiAgIGl0c2VsZiksIGl0IHdvbid0IHdvcmsgZm9yIGxhcmdlIGFyZ3VtZW50cyBiZWNhdXNlIHRoZSBjYWxsIHN0YWNrIGNhbgogICBleGNlZWQgYXZhaWxhYmxlIG1lbW9yeS4gU2VlIFs1MjRdU2VjdGlvbiA5LjkuMiBmb3IgYSBwcmFjdGljYWwKICAgYWx0ZXJuYXRpdmUuCgogICBLZXJtaXQgbWFjcm9zLCB3aGVuIHVzZWQgYXMgUy1FeHByZXNzaW9uIG9wZXJhdG9ycywgY2FuIGRvIGFueXRoaW5nIGF0CiAgIGFsbCBleGNlcHQgaW5pdGlhdGUgZmlsZSB0cmFuc2ZlcnM6IHRoZXkgY2FuIHByaW50IG1lc3NhZ2VzIG9uIHRoZQogICBzY3JlZW4sIHJlYWQgYW5kIHdyaXRlIGZpbGVzLCBpbnRlcmFjdCB3aXRoIHRoZSB1c2VyLCBhbmQgc28gb24uIEZvcgogICBleGFtcGxlLCBoZXJlJ3MgYSBtYWNybyBBU0tNRSB0aGF0IGFza3MgeW91IHRvIGVudGVyIGEgbnVtYmVyLCBtYWtlcwogICBzdXJlIHRoYXQgeW91IGRpZCwgYW5kIHRoZW4gcmV0dXJucyBpdHMgdmFsdWUgZm9yIHVzZSBpbiB0aGUKICAgUy1FeHByZXNzaW9uOgoKICBkZWZpbmUgQVNLTUUgewogICAgICBsb2NhbCBcJW4KICAgICAgd2hpbGUgdHJ1ZSB7CiAgICAgICAgICBhc2sgXCVuIHsgTnVtYmVyOiB9CiAgICAgICAgICBpZiBub3QgZGVmIFwlbiBjb250aW51ZQogICAgICAgICAgaWYgbm90IG51bWVyaWMgXCVuIHsKICAgICAgICAgICAgICBlY2hvIE5vdCBudW1lcmljIC0gIlwlbiIKICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgfQogICAgICAgICAgYnJlYWsKICAgICAgfQogICAgICByZXR1cm4gXCVuCiAgfQogIChzZXRxIGEgKCogMiAoYXNrbWUpKSkgOyBHZXQgbnVtYmVyIGZyb20gdXNlciwgZG91YmxlIGl0LCBhc3NpZ24gcmVzdWx0IHRvIGEuCgogICBIZXJlJ3MgYSBtYWNybyB5b3UgY2FuIHVzZSB0byB2YWxpZGF0ZSB0aGF0IGEgbnVtYmVyIGlzIGluIGEgZ2l2ZW4KICAgcmFuZ2U6CgogIGRlZmluZSBpbnJhbmdlIHsKICAgICAgaWYgIT0gXHYoYXJnYykgNCBlbmQgMSA/XCUwOiBXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzCiAgICAgIGlmICggPCBcJTEgXCUyIHx8ID4gXCUxIFwlMyApIHJldHVybiAwCiAgICAgIHJldHVybiAxCiAgfQoKICAgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBudW1iZXIgdG8gYmUgY2hlY2tlZCwgdGhlIHNlY29uZCBpcyB0aGUKICAgbWluaW11bSBhY2NlcHRhYmxlIHZhbHVlLCB0aGUgdGhpcmQgaXMgdGhlIG1heGltdW0uIFlvdSBjYW4gdXNlIHRoaXMKICAgKGZvciBleGFtcGxlKSBpbiBJRiBjb25kaXRpb25zOgoKICBkZWZpbmUgeWVzIGVjaG8gXCUxIElTIE9LCiAgZGVmaW5lIG5vIGVjaG8gXCUxIElTIE5PVCBPSwoKICAoc2V0cSBhIC0xIGIgOTk5KQogIChpZiAoaW5yYW5nZSBhIDAgMTAwKSAoeWVzIGEpIChubyBhKSkKICAoaWYgKGlucmFuZ2UgYiAtMTAwMCArMTAwMCkgKHllcyBiKSAobm8gYikpCgogICBUaGlzIGlzIGp1c3QgYW4gaWxsdXN0cmF0aW9uLCBvZiBjb3Vyc2U7IHRoZXJlJ3MgYWxyZWFkeSBhIGJ1aWx0LWluCiAgIG9wZXJhdG9yIHRvIGxldCB5b3UgZG8gcmFuZ2UgY2hlY2tpbmcgd2l0aG91dCBoZWxwIGZyb20gbWFjcm9zOgoKICAoaWYgKDw9IDAgYSAxMDApICh5ZXMgYSkgKG5vIGEpKQogIChpZiAoPD0gLTEwMDAgYiArMTAwMCkgKHllcyBiKSAobm8gYikpCgogICBUbyBzZW5kIHN0cmluZyBwYXJhbWV0ZXJzIHRvIGEgbWFjcm8sIHNvbWUga2luZCBvZiBxdW90aW5nIGlzIHJlcXVpcmVkCiAgIHRvIHRlbGwgdGhlIFMtRXhwcmVzc2lvbiBwYXJzZXIgdG8gdGFrZSBhIGdpdmVuICJ3b3JkIiBsaXRlcmFsbHkKICAgcmF0aGVyIHRoYW4gcmVwbGFjaW5nIGl0IGJ5IGl0cyB2YWx1ZS4gRm9yIHRoaXMgd2UgdXNlIHRoZSBMaXNwIFFVT1RFCiAgIG9wZXJhdG9yOgoKICBkZWZpbmUgbGVuZ3RoIHJldHVybiBcZmxlbmd0aChcJTEpCiAgKGxlbmd0aCAocXVvdGUgYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXopKQogIDI2CgogICBUaGlzIGNhdXNlcyB0aGUgc3RyaW5nICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIgdG8gYmUgc2VudAogICBsaXRlcmFsbHkgdG8gdGhlIExFTkdUSCBtYWNyby4gS2VybWl0LCBsaWtlIExpc3AsIGFsc28gb2ZmZXJzIGEKICAgc2hvcnRjdXQgZm9yIFFVT1RFLCB0aGF0IGxldHMgdXMgcXVvdGUgYSB3b3JkIGJ5IHByZWZpeGluZyBpdCB3aXRoIGEKICAgc2luZ2xlIHF1b3RlICgnKSBjaGFyYWN0ZXIsIGFsc28gY2FsbGVkIGFwb3N0b3BoZSAoQVNDSUkgMzkpOgoKICAobGVuZ3RoICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eikKICAyNgoKICAgVGhlIHR3byBmb3JtcyBhcmUgZXF1aXZhbGVudC4KCiAgIEhvdyB0aGUgbWFjcm8gdHJlYXRzIGl0cyBhcmd1bWVudHMgaXMgdXAgdG8gdGhlIG1hY3JvLiBJbiB0aGUgZXhhbXBsZQogICBhYm92ZSwgdGhlIGFyZ3VtZW50IGlzIHRyZWF0ZWQgYXMgYSBsaXRlcmFsIHN0cmluZy4gSG93ZXZlciwgaXQgY2FuCiAgIGFsc28gYmUgdHJlYXRlZCBhcyBhIHZhcmlhYmxlIG5hbWU6CgogIGRlZmluZSBzdHJpbmcgVGhpcyBpcyBhIHN0cmluZwogIGRlZmluZSBsZW5ndGggcmV0dXJuIFxmbGVuZ3RoKFxtKFwlMSkpCiAgKGxlbmd0aCAnc3RyaW5nKQogIDE2CgogICBOb3RlIHRoZSBjb25zdHJ1Y3QgXG0oXCUxKS4gVGhpcyBtZWFucyAidGhlIHZhbHVlIG9mIHRoZSBtYWNybyB3aG9zZQogICBuYW1lIGlzIHRoZSB2YWx1ZSBvZgogICBcJTEiLiBUaGUgdmFsdWUgb2YgXCUxIGluIHRoaXMgY2FzZSBpcyB0aGUgd29yZCAic3RyaW5nIiwgYW5kIHRoZQogICB2YWx1ZSBvZiB0aGUgbWFjcm8gd2hvc2UgbmFtZSBpcyAic3RyaW5nIiBpcyAiVGhpcyBpcyBhIHN0cmluZyIuCgogICBXaGF0IGlmIHRoZSBtYWNybyB0YWtlcyBtdWx0aXBsZSBhcmd1bWVudHMsIG9yIGEgdmFyaWFibGUgbnVtYmVyIG9mCiAgIHRoZW0/IEhlcmUncyBhIHNpbXBsZSBtYWNybyB0aGF0IHByaW50cyBhIHBocmFzZSB0aGF0IGluY2x1ZGVzIGl0cwogICBhcmd1bWVudHM6CgogIGRlZmluZSBjb21wbGFpbiBlY2hvIEl0J3MgdG9vIFwlKiEKCiAgIChSZWNhbGwgdGhhdCBcJSogbWVhbnMgImFsbCBhcmd1bWVudHMiLikKCiAgIEl0IGNhbiBiZSBjYWxsZWQgaW4gdGhlIHRyYWRpdGlvbmFsIHdheToKCiAgY29tcGxhaW4gaG90ICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHQ6ICJJdCdzIHRvbyBob3QhIgogIGNvbXBsYWluIGNvbGQgYW5kIHdldCAgICAgICAgICAgICAgUmVzdWx0OiAiSXQncyB0b28gY29sZCBhbmQgd2V0ISIKCiAgIE9yIGZyb20gYW4gUy1FeHByZXNzaW9uIGlmIHlvdSBxdW90ZSB0aGUgYXJndW1lbnRzOgoKICAoY29tcGxhaW4gJ2hvdCkgICAgICAgICAgICAgICAgICAgIFJlc3VsdDogIkl0J3MgdG9vIGhvdCEiCiAgKGNvbXBsYWluICdjb2xkICdhbmQgJ3dldCkgICAgICAgICBSZXN1bHQ6ICJJdCdzIHRvbyBjb2xkIGFuZCB3ZXQhIgoKICAgVG8gZ3JvdXAgbXVsdGlwbGUgd29yZHMgaW50byBhIHNpbmdsZSBhcmd1bWVudCwgdXNlIHBhcmVudGhlc2VzOgoKICAoY29tcGxhaW4gKHF1b3RlIChjb2xkIGFuZCB3ZXQpKSkgIFJlc3VsdDogIkl0J3MgdG9vIGNvbGQgYW5kIHdldCEiCiAgKGNvbXBsYWluICcoY29sZCBhbmQgd2V0KSkgICAgICAgICBSZXN1bHQ6ICJJdCdzIHRvbyBjb2xkIGFuZCB3ZXQhIgoKICAgTm90ZSB0aGUgZGlmZmVyZW5jZToKCiAgKGNvbXBsYWluICdjb2xkICdhbmQgJ3dldCkgICAgICAgICBUaHJlZSBhcmd1bWVudHMKICAoY29tcGxhaW4gJyhjb2xkIGFuZCB3ZXQpKSAgICAgICAgIE9uZSBhcmd1bWVudAoKICAgU2luY2UgdGhlIENPTVBMQUlOIG1hY3JvIHVzZXMgXCUqIHRvIHJlZmVyIHRvIGFsbCBpdHMgYXJndW1lbnRzLCBubwogICBtYXR0ZXIgaG93IG1hbnksIGl0IGRvZXNuJ3QgY2FyZSB3aGljaCBmb3JtIHlvdSB1c2UuIEJ1dCBpdCBtYWtlcyBhCiAgIGRpZmZlcmVuY2UgaW4gY2FzZXMgd2hlcmUgdGhlIG1hY3JvIHJlZmVycyB0byBpdHMgYXJndW1lbnRzCiAgIGluZGl2aWR1YWxseS4KCiAgIFRvIGlsbHVzdHJhdGUsIGxldCdzIGNvbnNpZGVyIGEgbWFjcm8gdGhhdCByZWNlaXZlcyB0aGUgbmFtZSBvZiBhCiAgIG1hY3JvIGFuZCBpdHMgYXJndW1lbnQgbGlzdCBhbmQgZXhlY3V0ZXMgaXQgd2l0aCBpdHMgYXJndW1lbnRzLAogICB3aXRob3V0IGtub3dpbmcgaG93IG1hbnkgYXJndW1lbnRzIHRoZXJlIGFyZS4gVGhlIGZvbGxvd2luZyBMT09QIG1hY3JvCiAgIGlzIHVzZWQgdG8gZXhlY3V0ZSB0aGUgZ2l2ZW4gbWFjcm8gd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnQgbGlzdCB0aGUKICAgcmVxdWVzdGVkIG51bWJlciBvZiB0aW1lczoKCiAgZGVmIGxvb3AgeyBsb2NhbCBpLCBmb3IgaSAxIFwlMSAxIGRvIFwlMiBcJTMgfQoKICAgV2l0aGluIHRoZSBMT09QIG1hY3JvLCB0aGUgZmlyc3QgYXJndW1lbnQgKFwlMSkgaXMgdGhlIGxvb3AgY291bnQsIFwlMgogICBpcyB0aGUgbWFjcm8gbmFtZSwgYW5kIFwlMyBpcyB0aGUgYXJndW1lbnQgbGlzdC4gV2hlbiB0aGUgTE9PUCBtYWNybwogICBpcyBpbnZva2VkIHRyYWRpdGlvbmFsbHkgbGlrZSB0aGlzOgoKICBsb29wIDMgY29tcGxhaW4gaG90CgogICBpdCBwcmludHMgIkl0J3MgdG9vIGhvdCEiIHRocmVlIHRpbWVzLiBUbyBpbnZva2UgaXQgZnJvbSBhbgogICBTLUV4cHJlc3Npb24sIHlvdSBtdXN0IHF1b3RlIGJvdGggdGhlIG1hY3JvIG5hbWUgYXMgd2VsbCBhcyB0aGUKICAgYXJndW1lbnQsIHNpbmNlIGluIHRoaXMgY2FzZSB0aGUgbWFjcm8gbmFtZSBpdHNlbGYgaXMgYW4gYXJndW1lbnQ6CgogIChsb29wIDMgJ2NvbXBsYWluICdob3QpCgogICBOb3cgd2hhdCBpZiB5b3UgbmVlZCB0byBzZW5kIGRpZmZlcmVudCBvciB2YXJpYWJsZSBudW1iZXJzIG9mCiAgIGFyZ3VtZW50cyB0byB0aGUgTE9PUCBtYWNybz8gVGhlIExPT1AgbWFjcm8gY2FuIGhhbmRsZSBpdCBhbHJlYWR5LAogICBwcm92aWRlZCB5b3UgZ3JvdXAgdGhlIGFyZ3VtZW50cyBpbnRvIExPT1AncyB0aGlyZCBhcmd1bWVudCAoXCUzKS4gSW4KICAgS2VybWl0IHN5bnRheCwgd2l0aG91dCBncm91cGluZzoKCiAgbG9vcCAzIGNvbXBsYWluIGNvbGQgYW5kIHdldAoKICAgcHJpbnRzICJJdCdzIHRvbyBjb2xkISIgdGhyZWUgdGltZXMgKCJhbmQgd2V0IiBpcyBsb3N0KTsgYnV0IHdpdGgKICAgZ3JvdXBpbmcgKGVpdGhlciBvZiB0aGUgZm9sbG93aW5nIHR3byBmb3Jtcyk6CgogIGxvb3AgMyBjb21wbGFpbiB7Y29sZCBhbmQgd2V0fQogIGxvb3AgMyBjb21wbGFpbiAiY29sZCBhbmQgd2V0IgoKICAgdGhlIExPT1AgbWFjcm8gcHJpbnRzICJJdCdzIHRvbyBjb2xkIGFuZCB3ZXQhIiB0aHJlZSB0aW1lcyBhcyBkZXNpcmVkLgoKICAgVG8gZG8gdGhlIHNhbWUgdGhpbmcgaW4gYW4gUy1FeHByZXNzaW9uLCBqdXN0IHVzZSB0aGUgTGlzcCBmb3JtcyBvZgogICBxdW90aW5nIGluc3RlYWQgb2YgdGhlIEtlcm1pdCBmb3JtczsgdGhlIGZvbGxvd2luZyB0d28gYXJlIGVxdWl2YWxlbnQ6CgogIChsb29wIDMgJ2NvbXBsYWluIChxdW90ZSAoY29sZCBhbmQgd2V0KSkpCiAgKGxvb3AgMyAnY29tcGxhaW4gJyhjb2xkIGFuZCB3ZXQpKQoKICAgSGVyZSdzIGEgc2ltaWxhciBleGFtcGxlIGluIHdoaWNoIHdlIHdyaXRlIGEgbWFjcm8gdGhhdCBzaG93cyBib3RoIHRoZQogICBuYW1lIGFuZCB0aGUgdmFsdWUgb2Ygb25lIG9yIG1vcmUgb3RoZXIgbWFjcm9zLCB3aG9zZSBuYW1lcyBhcmUgZ2l2ZW4KICAgYXMgYXJndW1lbnRzIChzaW1pbGFyIHRvICJzaG93IG1hY3JvIik6CgogIGRlZmluZSBkaXNwbGF5IHsKICAgICAgbG9jYWwgXCVpCiAgICAgIGZvciBcJWkgMSBcdihhcmdjKS0xIDEgewogICAgICAgICAgZWNobyBcJl9bXCVpXSA9IFxtKFwmX1tcJWldKQogICAgICB9CiAgfQoKICAgKFJlY2FsbCB0aGF0IFwmX1tdIGlzIHRoZSBtYWNybydzIGFyZ3VtZW50IHZlY3RvciBhcnJheSwgZXF1aXZhbGVudCB0bwogICBcJTEsIFwlMiwgLi4uKSBUaGUgRElTUExBWSBtYWNybyBjYW4gYmUgdXNlZCBpbiBTLUV4cHJlc3Npb25zIGxpa2UKICAgdGhpczoKCiAgKHNldHEgYSAxIGIgMiBjIDMpCiAgKGRpc3BsYXkgJ2EgJ2IgJ2MgJ2QpCgogICB3aGljaCBwcmludHM6CgogIGEgPSAxCiAgYiA9IDIKICBjID0gMwogIGQgPQoKICAgVGhlIG5hbWVzIG11c3QgYmUgcXVvdGVkIHRvIHByZXZlbnQgdGhlaXIgZXZhbHVhdGlvbiBiZWZvcmUgdGhleSBhcmUKICAgc2VudCB0byB0aGUgbWFjcm8uIFRoaXMgYWJpbGl0eSB0byBwYXNzIHZhcmlhYmxlcyAiYnkgbmFtZSIgdG8gbWFjcm9zLAogICByYXRoZXIgdGhhbiBieSB2YWx1ZSwgbGV0cyB5b3Ugd3JpdGUgbWFjcm9zIHRoYXQgY2hhbmdlIHRoZSB2YWx1ZXMgb2YKICAgYXJndW1lbnQgdmFyaWFibGVzLiBGb3IgZXhhbXBsZSwgaGVyZSdzIGEgbWFjcm8gdGhhdCBkb3VibGVzIHRoZSB2YWx1ZQogICBvZiBpdHMgYXJndW1lbnQgdmFyaWFibGU6CgogIGRlZmluZSBkb3VibGUgKCsrIFwlMSBcJTEpCgogICB3aGljaCB5b3UgY2FuIGNhbGwgbGlrZSB0aGlzOgoKICAoc2V0cSBhIDEyKQogIChkb3VibGUgJ2EpCgogICBJbiB0aGUgbWFjcm8sIFwlMSBpcyByZXBsYWNlIGJ5IHRoZSB2YXJpYWJsZSBuYW1lICJhIjsgIigrKyBhIGEpIiBhZGRzCiAgICJhIiB0byBpdHNlbGYsIGFuZCBzZXRzIHRoZSB2YWx1ZSBvZiAiYSIgdG8gdGhlIHJlc3VsdC4KCiAgIFRoZXJlIGFyZSBubyBidWlsdC1pbiBvcGVyYXRvcnMgb3RoZXIgdGhhbiBRVU9URSwgJywgYW5kIFNUUklORyBmb3IKICAgaGFuZGxpbmcgc3RyaW5ncyBpbiBTLUV4cHJlc3Npb25zLCBidXQgdXNpbmcganVzdCB0aGVzZSwgcGx1cyBtYWNyb3MKICAgdGhhdCB1c2UgS2VybWl0J3MgcmVndWxhciBzdHJpbmctaGFuZGxpbmcgZmVhdHVyZXMsIHlvdSBjYW4gZWFzaWx5CiAgIGV4dGVuZCBTLUV4cHJlc3Npb25zIHRvIGRvIHN0cmluZyBtYW5pcHVsYXRpb246CgogIGRlZmluZSBsZW4gcmV0dXJuIFxmbGVuKFwlMSkgICAgICAgICAgICAgICBSZXR1cm5zIGxlbmd0aCBvZiBhcmd1bWVudCBzdHJpbmcKICBkZWZpbmUgY2FwIHJldHVybiBcZnVwcGVyKFwlMSkgICAgICAgICAgICAgVXBwZXJjYXNlIGFyZ3VtZW50IHN0cmluZwogIGRlZmluZSByZXYgcmV0dXJuIFxmcmV2ZXJzZShcJTEpICAgICAgICAgICBSZXZlcnNlcyBhcmd1bWVudCBzdHJpbmcKICBkZWZpbmUgc3ViIHJldHVybiBcZnN1YnN0cihcJTEsXCUyLFwlMykgICAgUmV0dXJucyBzdWJzdHJpbmcgb2YgYXJnIHN0cmluZwoKICAobGVuICcodGhpcyBpcyBhIHN0cmluZykpICAgICAgICAgICAgICAgICAgUmVzdWx0OiAxNgogIChyZXYgJyh0aGlzIGlzIGEgc3RyaW5nKSkgICAgICAgICAgICAgICAgICBSZXN1bHQ6IGduaXJ0cyBhIHNpIHNpaHQKICAocmV2IChjYXAgJyh0aGlzIGlzIGEgc3RyaW5nKSkpICAgICAgICAgICAgUmVzdWx0OiBHTklSVFMgQSBTSSBTSUhUCiAgKHN1YiAocmV2IChjYXAgJyh0aGlzIGlzIGEgc3RyaW5nKSkpIDUgOSkgIFJlc3VsdDogVFMgQSBTSSBTCgogICBZb3UgY2FuIGFzc2lnbiBhIHN0cmluZyB0byBhIG1hY3JvIG5hbWUgYXMgZm9sbG93czoKCiAgKHNldHEgZm9vICcodGhpcyBpcyBhIHN0cmluZykpCiAgKHNldHEgZm9vIChxdW90ZSAodGhpcyBpcyBhIHN0cmluZykpKQoKICAgVGhlIHR3byBhcmUgZXhhY3RseSBlcXVpdmFsZW50LiBJbiBib3RoIGNhc2VzLCB0aGUgbWFjcm8gImZvbyIgaGFzIHRoZQogICB2YWx1ZToKCiAgJyh0aGlzIGlzIGEgc3RyaW5nKQoKICAgc28gd2hlbiBpdCBpcyByZXRyaWV2ZWQgaXQgY2FuIGJlIGlkZW50aWZpZWQgYXMgYSBzdHJpbmcgcmF0aGVyIHRoYW4gYQogICBudW1iZXIgb3IgY29tbWFuZHMgdG8gYmUgZXhlY3V0ZWQuIFRodXM6CgogIChzZXRxIGZvbyAocXVvdGUgKHRoaXMgaXMgYSBzdHJpbmcpKSkKICBzaG93IG1hY3JvIGZvbwogIGZvbyA9ICcodGhpcyBpcyBhIHN0cmluZykKICAoZm9vKQogIHRoaXMgaXMgYSBzdHJpbmcKCiAgIE5vdGUgdGhlIGRpZmZlcmVudCByZXN1bHRzIGZvciAic2hvdyBtYWNybyBmb28iIGFuZCAiKGZvbykiLiBUaGUKICAgZm9ybWVyIHNob3dzIHRoZSBpbnRlcm5hbCBkZWZpbml0aW9uOyB0aGUgbGF0dGVyIGV2YWx1YXRlcyB0aGUKICAgdmFyaWFibGUsIHdoaWNoIHJlbW92ZXMgdGhlIHF1b3RpbmcuIEFuZCBwZXJoYXBzIG1vcmUgaW1wb3J0YW50LCBub3RlCiAgIHRoYXQgaWYgdGhlIGFwb3N0cm9waGUgYW5kIHN1cnJvdW5kaW5nIHBhcmVudGhlc2VzIHdlcmUgbm90IHN0b3JlZCBhcwogICBwYXJ0IG9mIHRoZSBkZWZpbml0aW9uLCAoZm9vKSB3b3VsZCB0cnkgdG8gZXhlY3V0ZSAidGhpcyBpcyBhIHN0cmluZyIKICAgYXMgYSBjb21tYW5kLgoKICAgR2l2ZW4gdGhlIGFzc2lnbm1lbnQgYWJvdmUsIHRoZSBmb2xsb3dpbmcgd29yayBhcyBleHBlY3RlZDoKCiAgKGxlbiBmb28pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdDogMTYKICAocmV2IGZvbykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0OiBnbmlydHMgYSBzaSBzaWh0CiAgKHJldiAoY2FwIGZvbykpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdDogR05JUlRTIEEgU0kgU0lIVAogIChzdWIgKHJldiAoY2FwIGZvbykpIDUgOCkgICAgICAgICAgICAgICAgICBSZXN1bHQ6IFRTIEEgU0kgUwoKICAgTm90ZSB0aGF0LCB1bmxpa2UgYnVpbHQtaW4gUy1FeHByZXNzaW9uIG9wZXJhdG9ycyB0aGF0IHJldHVybiBudW1iZXJzCiAgIG9yIHRydXRoIHZhbHVlcywgdGhlc2Ugb3BlcmF0b3JzIHJldHVybiBzdHJpbmdzLiBJZiB5b3Ugd2FudCB0byBhc3NpZ24KICAgdGhlaXIgcmV0dXJuIHZhbHVlcyB0byBvdGhlciB2YXJpYWJsZXMsIHlvdSBjYW4gZG8gc286CgogIChzZXRxIGJhciAocmV2IChjYXAgZm9vKSkpICAgICAgICAgICAgICAgICBSZXN1bHQ6IEdOSVJUUyBBIFNJIFNJSFQKCiAgIEJ1dCBub3cgdGhlIFMtRXhwcmVzc2lvbiBwcm9jZXNzb3IgZG9lc24ndCBrbm93IHRoZSB2YWx1ZSBvZiAiYmFyIiBpcwogICBzdXBwb3NlZCB0byBiZSBhIHN0cmluZywgcmF0aGVyIHRoYW4gYSBtYWNybyB0byBleGVjdXRlLiBGb3IgdGhpcyB5b3UKICAgbmVlZCBvbmUgZmluYWwgc3BlY2lhbCBvcGVyYXRvciwgU1RSSU5HLiBUaGUgU1RSSU5HIG9wZXJhdG9yIHRha2VzIGFuCiAgIFMtRXhwcmVzc2lvbiBhcyBhbiBvcGVyYW5kLCBldmFsdWF0ZXMgaXQsIGFuZCB0aGVuIHJldHVybnMgaXRzIHZhbHVlCiAgIGVuY2xvc2VkIGluICcoKSwgc28geW91IGNhbiB1c2UgdGhlIHZhbHVlIGFzIGEgc3RyaW5nIGlzIHN1YnNlcXVlbnQKICAgUy1FeHByZXNzaW9ucy4gVXNlIFNUUklORyBmb3IgcmVmZXJlbmNpbmcgbWFjcm9zIHRoYXQgcmV0dXJuIHN0cmluZ3M6CgogIChzZXRxIGJhciAoc3RyaW5nIChyZXYgKGNhcCBmb28pKSkpICAgICAgICBSZXN1bHQ6ICcoR05JUlRTIEEgU0kgU0lIVCkKCiAgIFNUUklORyBpcyBsaWtlIFFVT1RFLCBleGNlcHQgdGhhdCBpdCBldmFsdWF0ZXMgaXRzIG9wZXJhbmQgYmVmb3JlCiAgIGFwcGx5aW5nIHRoZSBxdW90aW5nLCByYXRoZXIgdGhhbiB0YWtpbmcgdGhlIG9wZXJhbmQgbGl0ZXJhbGx5LgoKICAgVG8gcmVmZXJlbmNlIGJhY2tzbGFzaCB2YXJpYWJsZXMgb3IgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIHN0cmluZwogICB2YWx1ZXMsIHlvdSBtdXN0IHVzZSB0aGUgcmVndWxhciBxdW90aW5nIG1lY2hhbmlzbXM6CgogIChzZXRxIHRpbWUgJyhcdih0aW1lKSkpCiAgKHNldHEgZGF0ZSAnKFx2KGRhdGUpKSkKICBhc3NpZ24gXCVyIHRoaXMgaXMgYSBzdHJpbmcKICAoc2V0cSBzMSAnKFwlcikpCgogICBUaGF0J3MgYmVjYXVzZSBiYWNrc2xhc2ggaXRlbXMgYXJlIGV2YWx1YXRlZCBCRUZPUkUgdGhlIFMtRXhwcmVzc2lvbgogICBwYXJzZXIgZXZlciBzZWVzIHRoZW0sIGFuZCB0aGUgdmFsdWVzIG9mIFx2KHRpbWUpIGFuZCBzbyBvbiBhcmUgbm90CiAgIHZhbGlkIFMtRXhwcmVzc2lvbnMsIHNvIFNUUklORyB3b24ndCBsaWtlIHRoZW0uCgogICBGaW5hbGx5IGEgYnJpZWYgd29yZCBvbiB0aGUgdG91Y2h5IHRvcGljIG9mIHF1b3RpbmcuIFN1cHBvc2UgeW91IHdhbnQKICAgdG8gaW5jbHVkZSAoc2F5KSBsaXRlcmFsIHBhcmVudGhlc2VzIGluIGEgc3RyaW5nIHRoYXQgd2lsbCBsYXRlciBiZQogICBwcm9jZXNzZWQgYnkgdGhlIFMtRXhwcmVzc2lvbiByZWFkZXIgKG9yIFxmc3BsaXQoKSBvciBcZndvcmQoKSkuCiAgIE5vcm1hbGx5LCB5b3UgY2FuJ3QgZG8gdGhpcyBiZWNhdXNlIHBhcmVudGhlc2VzIGFyZSBtZWFuaW5nZnVsIGluCiAgIHRoZXNlIGNvbnRleHRzLiBUbyBkZWZlYXQgdGhlIG5vcm1hbCBwYXJzaW5nIHJ1bGVzLCB5b3UgY2FuIHF1b3RlIHRoZQogICBwYXJlbnRoZXNlcyB3aXRoIGJhY2tzbGFzaC4gSG93ZXZlciwgZHVlIHRvIHRoZSBtYW55IGxldmVscyBvZiBzdHJpbmcKICAgcHJvY2Vzc2luZyBpbnZvbHZlZCwgYSBzdXJwcmlzaW5nbHkgbGFyZ2UgYW1vdW50IG9mIGJhY2tzbGFzaGVzIG1pZ2h0CiAgIGJlIHJlcXVpcmVkLCBmb3IgZXhhbXBsZToKCiAgKHNldHEgcyAnKGEgYiAoYyBkKSBcXFxcXFxcXFxcXFxcXFxcKGUgZiAoZyBoKSB4XFxcXFxcXFxcXFxcXFxcXCkgaiBrKSkKCiAgIFRoaXMgaXMgbmVhcmx5IGltcG9zc2libGUgdG8gZXhwbGFpbigqKS4gSW5zdGVhZCwganVzdCByZW1lbWJlciB0d28KICAgcG9pbnRzOgoKICAgICAqIEluIHNpdHVhdGlvbnMgbGlrZSB0aGlzLCBpdCdzIGJldHRlciB0byB1c2UgREVGSU5FIHRvIGNyZWF0ZSB0aGUKICAgICAgIHN0cmluZywgcmF0aGVyIHRoYW4gU0VUUS4gVGhlIGV4YW1wbGUgYWJvdmUgcmVxdWlyZXMgb25seSBkb3VibGUKICAgICAgIGJhY2tzbGFzaGVzIHdoZW4gREVGSU5FIGlzIHVzZWQ6CiAgZGVmaW5lIHMgJyhhIGIgKGMgZCkgXFwoZSBmIChnIGgpIHhcXCkgaiBrKQogICAgICogVGhlIGxldmVsIG9mIHF1b3RpbmcgZGVwZW5kcyBvbiBob3cgbWFueSBsZXZlbHMgb2YgZXZhbHVhdGlvbiB0aGUKICAgICAgIHN0cmluZyBtdXN0IHBhc3MgdGhyb3VnaCwgd2hpY2ggaXMgbm90IGFsd2F5cyBvYnZpb3VzLiBIb3dldmVyLAogICAgICAgdGhlIG51bWJlciBvZiBiYWNrc2xhc2hlcyByZXF1aXJlZCBpbiBhbnkgZ2l2ZW4gc2l0dWF0aW9uIGlzCiAgICAgICBhbHdheXMgYSBwb3dlciBvZiAyLiBTbyBpZiAxIGRvZXNuJ3Qgd29yaywgdHJ5IDI7IGlmIDIgZG9lc24ndAogICAgICAgd29yaywgdHJ5IDQ7IGlmIDQgZG9lc24ndCB3b3JrLCB0cnkgOCwgMTYsIDMyLCBhbmQgc28gb24uCgogICBDb25zaWRlcmF0aW9ucyBsaWtlIHRoaXMgYXBwbHkgaW4gYW55IHNjcmlwdGluZyBsYW5ndWFnZSAoc2hlbGwsIFRjbCwKICAgUGVybCwgUHl0aG9uLCBldGMpLiBUaGUgc2l0dWF0aW9uIGlzIGtub3duIGFzICJRdW90aW5nIEhlbGwiLgoKICAgKCopIElmIHlvdSByZWFsbHkgd2FudCBhbiBleHBsYW5hdGlvbiwgaGVyZSBpdCBpczoKCiAgICAgKiBFdmVyeSBTRVhQIGhhcyBpdHMgYmFja3NsYXNoIGl0ZW1zIGV2YWx1YXRlZCBpbiBhIHNpbmdsZSBwYXNzIGF0CiAgICAgICB0b3AgbGV2ZWwgYmVmb3JlIGJlaW5nIHBhc3NlZCB0byB0aGUgU0VYUCByZWFkZXIsIHNvIFwlMSwKICAgICAgIFx2KGZ0aW1lKSwgZXRjLCBjYW4gYmUgZXZhbHVhdGVkIHVwIGZyb250LCBmcmVlaW5nIHRoZSBTRVhQIHJlYWRlcgogICAgICAgb2YgaGF2aW5nIHRvIGtub3cgYWJvdXQgc3VjaCB0aGluZ3MsIHdoaWNoIGluIHR1cm4gbWFrZXMgaXQgbXVjaAogICAgICAgbW9yZSBlZmZpY2llbnQuIFRoZXJlZm9yZSBvbmUgbGV2ZWwgb2YgcXVvdGluZyBpcyBsb3N0IHJpZ2h0IGF3YXksCiAgICAgICBhbmQgdGhlcmVmb3JlIHlvdSBtdXN0IGRvdWJsZSBlYWNoIGJhY2tzbGFzaCB0aGF0IGlzIHRvIGJlIHVzZWQgYXMKICAgICAgIGEgcXVvdGUuCiAgICAgKiBXaGVuIHRoZSBTRVhQIHJlYWRlciBzZWVzICdcJywgaXQgdHJlYXRzIGl0IGFzIGEgcXVvdGU7IGRpc2NhcmRzCiAgICAgICBpdCBhbmQga2VlcHMgdGhlIG5leHQgY2hhcmFjdGVyLiBUaHVzICdcXCcgYmVjb21lcyAnXCcuIFRoaXMgd291bGQKICAgICAgIGJlIHRoZSBlbmQgb2YgaXQsIGV4Y2VwdCB0aGF0OgogICAgICogVGhlIFNFWFAgcmVhZGVyIG11c3QgY2FsbCBpdHNlbGYgcmVjdXJzaXZlbHkgb24gaXRzIG9wZXJhbmRzLCBzbwogICAgICAgd2UgbXVzdCBkb3VibGUgYW55IHF1b3RlcyBpbiB0aGUgb3BlcmFuZHM6IDJeMiA9IDQuCiAgICAgKiBJZiB0aGUgcmVzdWx0IGlzIHRvIGJlIHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0byBhIG1hY3JvLCB0aGUKICAgICAgIGJhY2tzbGFzaGVzIG11c3QgYWdhaW4gYmUgZG91YmxlZCwgYmVjYXVzZSB0aGUgbWFjcm8gcHJvY2Vzc29yCiAgICAgICBldmFsdWF0ZXMgdGhlIGFyZ3VtZW50cyBiZWZvcmUgc2VuZGluZyB0aGVtIHRvIHRoZSBtYWNybzogMl4zID0gOC4KICAgICAqIElmIHRoZSBtYWNybyBpdHNlbGYgaXMgdG8gc2VlIHRoZSBxdW90ZXMsIHJhdGhlciB0aGFuIGp1c3QgdGhlCiAgICAgICByZXN1bHQgb2YgdGhlIHF1b3RpbmcsIHRoZSBxdW90ZXMgbXVzdCBiZSBkb3VibGVkIGFnYWluOiAyXjQgPSAxNi4KCiAgIE1vcmFsOiBUbyBjcmVhdGUgc3RyaW5nIGNvbnN0YW50cyBpbiB3aGljaCBncm91cGluZyBjaGFyYWN0ZXJzIG11c3QgYmUKICAgcXVvdGVkLCB1c2UgREVGSU5FIHJhdGhlciB0aGFuIFNFVFEuCgogICBbIFs1MjVdVG9wIF0gWyBbNTI2XUNvbnRlbnRzIF0gWyBbNTI3XUMtS2VybWl0IEhvbWUgXSBbIFs1MjhdS2VybWl0CiAgIEhvbWUgXQogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDkuOS4gRXhhbXBsZXMKCiAgICA5LjkuMS4gU3RhdGlzdGljcwoKICAgVGhlIGZvbGxvd2luZyBwcm9ncmFtIGNvbXB1dGVzIHN0YXRpc3RpY3MgLS0gbWVhbnMsIG1heGltYSwgbWltaW1hLAogICB2YXJpYW5jZSwgc3RhbmRhcmQgZGV2aWF0aW9uLCBhbmQgY29ycmVsYXRpb24gLS0gZnJvbSBkYXRhIHN0b3JlZCBpbgogICBwYXJhbGxlbCBhcnJheXMsIFwmeFtdIGFuZCBcJnlbXSwgd2hpY2ggY2FuIGNvbnRhaW4gYW55IG1peHR1cmUgb2YKICAgaW50ZWdlciBhbmQgZmxvYXRpbmctcG9pbnQgbnVtYmVyczogcG9zaXRpdmUsIG5lZ2F0aXZlLCBvciB6ZXJvLiBBcnJheQogICBzZXR1cCBhbmQgdmFsaWRhdGlvbiBhcmUgbm90IHNob3duLiBFeGNlcHQgZm9yIHRoZSB0cmFkaXRpb25hbCBGT1IKICAgbG9vcCBhbmQgcHJpbnRpbmcgdGhlIHJlc3VsdHMgYXQgdGhlIGVuZCwgdGhlIGVudGlyZSBjb21wdXRhdGlvbiBpcwogICBkb25lIHdpdGggUy1FeHByZXNzaW9uczoKCjsgSW5pdGlhbGl6ZSBzdW1zLCBtYXhpbWEsIG1pbmltYSwgYW5kIG51bWJlciBvZiBlbGVtZW50cwoKICAoc2V0cSB4c3VtIDAgeXN1bSAwIHhzdW0yIDAgeXN1bTIgMCB4eXN1bSAwKQogIChzZXRxIHhtaW4gKHNldHEgeG1heCBcJnhbMV0pIHltaW4gKHNldHEgeW1heCBcJnlbMV0pKQogIChzZXRxIG4gXGZkaW0oJngpKQoKOyBMb29wIHRocm91Z2ggZWxlbWVudHMgYW5kIGFjY3VtdWxhdGUgc3VtcywgbWF4aW1hLCBhbmQgbWluaW1hCgogIGZvciBpIDEgbiAxIHsKICAgICAgKHNldHEgeCBcJnhbaV0geSBcJnlbaV0pICAgICAgICAgICAgICAgICAgICA7IE5vdGF0aW9uYWwgY29udmVuaWVuY2UKICAgICAgKHNldHEgeG1heCAobWF4IHhtYXggeCkgeW1heCAobWF4IHltYXggeSkpICA7IFggYW5kIFkgbWF4aW1hCiAgICAgIChzZXRxIHhtaW4gKG1pbiB4bWluIHgpIHltaW4gKG1pbiB5bWluIHkpKSAgOyBYIGFuZCBZIG1pbmltYQogICAgICAoKysgeHN1bSB4IHlzdW0geSkgICAgICAgICAgICAgICAgICAgICAgICAgIDsgWCBhbmQgWSBzdW1zCiAgICAgICgrKyB4c3VtMiAoXiB4IDIpIHlzdW0yICheIHkgMikpICAgICAgICAgICAgOyBTdW0gb2YgWCBhbmQgWSBzcXVhcmVzCiAgICAgICgrKyB4eXN1bSAoKiB4IHkpKSAgICAgICAgICAgICAgICAgICAgICAgICAgOyBTdW0gb2YgWFkgcHJvZHVjdHMKICB9Cgo7IENhbGN1bGF0ZSByZXN1bHRzCgogIChzZXRxIHhtZWFuICgvIHhzdW0gbikgeW1lYW4gKC8geXN1bSBuKSkgICAgICAgIDsgTWVhbiBYIGFuZCBZCiAgKHNldHEgeHNzICgtIHhzdW0yICgvICheIHhzdW0gMikgbikpKSAgICAgICAgICAgOyBJbnRlcm1lZGlhdGUgdmFsdWVzCiAgKHNldHEgeXNzICgtIHlzdW0yICgvICheIHlzdW0gMikgbikpKQogIChzZXRxIHh5c3MgKC0geHlzdW0gKC8gKCogeHN1bSB5c3VtKSBuKSkpCiAgKHNldHEgeHZhciAoLyB4c3MgbikgeXZhciAoLyB5c3MgbikpICAgICAgICAgICAgOyBYIGFuZCBZIHZhcmlhbmNlCiAgKHNldHEgc2R4IChzcXJ0IHh2YXIpIHNkeSAoc3FydCB5dmFyKSkgICAgICAgICAgOyBTdGQgZGV2aWF0aW9uIGluIFggYW5kIFkKICAoc2V0cSB0bXAgKCogeHNzIHlzcykpCiAgKHNldHEgY2MgKGlmIHRtcCAoLyB4eXNzIChzcXJ0IHRtcCkpIDEuMCkpICAgICAgOyBDb3JyZWxhdGlvbiBjb2VmZmljaWVudAogIHNob3cgbWFjcm8geG1lYW4geW1lYW4geHZhciB5dmFyIHNkeCBzZHkgY2MgICAgIDsgUHJpbnQgdGhlIHJlc3VsdHMKCiAgIFRoZSBmaW5hbCAiaWYgdG1wIiBjaGVjayBhY2NvdW50cyBmb3IgdGhlIHBvc3NpYmlsaXR5IHRoYXQgYm90aCBhcnJheXMKICAgY29udGFpbiBhbGwgMCdzLiBSZXN1bHRzIGNhbiBhbHNvIGJlIHByaW50ZWQgd2l0aCAiZWNobyBDQyA9IFxtKGNjKSIsCiAgIG9yIGFueSBvdGhlciBkZXNpcmVkIHdheS4gSW50ZXJlc3RpbmdseSwgaWYgd2UgaGFkIG5vdCBuZWVkZWQgdGhlIHN1bQogICBvZiB0aGUgc3F1YXJlcyBhbmQgcHJvZHVjdHMsIHdlIGNvdWxkIGhhdmUgb2J0YWluZWQgdGhlIHN1bXMsIG1heGltYSwKICAgYW5kIG1pbmltYSBvZiB0aGUgWCdzIGFuZCBZJ3Mgd2l0aG91dCBhIGxvb3AgbGlrZSB0aGlzOgoKICAoc2V0cSB4c3VtICgrIFxmam9pbigmeCkpIHlzdW0gKCsgXGZqb2luKCZ5KSkpCiAgKHNldHEgeG1heCAobWF4IFxmam9pbigmeCkpIHltYXggKG1heCBcZmpvaW4oJnkpKSkKICAoc2V0cSB4bWluIChtaW4gXGZqb2luKCZ4KSkgeW1pbiAobWluIFxmam9pbigmeSkpKQoKICAgQW55IEtlcm1pdCBmdW5jdGlvbiB0aGF0IHJldHVybnMgbnVtYmVycyBvciBsaXN0cyBvZiBudW1iZXJzIGNhbiBiZQogICBpbmNsdWRlZCBpbiBhbiBTLUV4cHJlc3Npb24gYXMgYW4gb3BlcmFuZC4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDkuOS4yLiBQcmFjdGljYWwgRmlib25hY2NpIFNlcmllcwoKICAgVGhlIHJlY3Vyc2l2ZSBGaWJvbmFjY2kgZXhhbXBsZSBnaXZlbiBwcmV2aW91c2x5IGlzIHNpbXBsZSBhbmQKICAgZWxlZ2FudCwgYnV0IG5vdCB2ZXJ5IHVzZWZ1bCBzaW5jZSBpdCBjYXVzZXMgbWVtb3J5IG9jY3VwYXRpb24gdG8gZ3JvdwogICBlYWNoIHRpbWUgaXQgY2FsbHMgaXRzZWxmLCB1bnRpbCBldmVudHVhbGx5IGJvdGggcGh5c2ljYWwgbWVtb3J5IGFuZAogICBkaXNrIHN3YXAgc3BhY2UgYXJlIGZpbGxlZCBhbmQgdGhlIHByb2dyYW0gY3Jhc2hlcy4gRXZlbiBmb3Igc21hbGwKICAgYXJndW1lbnRzLCBsaWtlIDE3LCBleGVjdXRpb24gdGltZSBjYW4gYmUgcHJvaGliaXRpdmU6CgogIChzZXRxIHQxIFx2KGZ0aW1lKSkKICAoc2V0cSByZXN1bHQgKGZpYm9uYWNjaSAxNykpCiAgKHNldHEgdDIgKC0gXHYoZnRpbWUpIHQxKSkKICBlY2hvIEZJQk9OQUNDSSgxNykgPSBcbShyZXN1bHQpOiBUSU1FID0gXGZmcHJvdW5kKHQyLDMpCgogICBwcmludHMgKG9uIGEgY2VydGFpbiByYXRoZXIgc2xvdyBjb21wdXRlcik6CgogIEZJQk9OQUNDSSgxNykgPSAxNTk3OiBUSU1FID0gNS44NjEKCiAgIEFueSByZWN1cnNpdmUgZnVuY3Rpb24gY2FuIGJlIHJlY29kZWQgaXRlcmF0aXZlbHkuIFRoZSByZXN1bHQgaXMgbm90CiAgIGFzIHByZXR0eSwgYnV0IGV4ZWN1dGlvbiBpcyBmYXIgbGVzcyBleHBlbnNpdmU6CgogICAgZGVmaW5lIEZJQklURVIgewogICAgICAgIChpZiAoPT0gXCUzIDApIChcJTIpIChmaWJpdGVyICgrIFwlMSBcJTIpIFwlMSAoLSBcJTMgMSkpKQogICAgfQogICAgZGVmaW5lIEZJQk9OQUNDSSB7CiAgICAgICAgKGZpYml0ZXIgMSAwIFwlMSkKICAgIH0KCiAgIEhlcmUncyB0aGUgcmVzdWx0IG9uIHRoZSBzYW1lIGNvbXB1dGVyIGZvciB0aGUgc2FtZSBhcmd1bWVudCBvZiAxNzoKCiAgRklCT05BQ0NJKDE3KSA9IDE1OTc6IFRJTUUgPSAwLjAxNQoKICAgKDQ3IHRpbWVzIGZhc3Rlci4pIEV4ZWN1dGlvbiB0aW1lIGluY3JlYXNlcyBwcm9wb3J0aW9uYWxseSB0byB0aGUgc2l6ZQogICBvZiB0aGUgYXJndW1lbnQgaW4gdGhlIGl0ZXJhdGl2ZSBjYXNlLCB3aGVyZWFzIGluIHRoZSByZWN1cnNpdmUgY2FzZQogICBpdCBnb2VzIHVwIGdlb21ldHJpY2FsbHksIHF1aWNrbHkgcmVhY2hpbmcgaW5maW5pdHkuCgogICBbIFs1MjldVG9wIF0gWyBbNTMwXUNvbnRlbnRzIF0gWyBbNTMxXUMtS2VybWl0IEhvbWUgXSBbIFs1MzJdS2VybWl0CiAgIEhvbWUgXQogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDkuMTAuIERpZmZlcmVuY2VzIGZyb20gQWxnZWJyYWljIE5vdGF0aW9uCgogICBJbiBDLUtlcm1pdDoKCiAgICAgKiBBbGdlYnJhaWMgbm90YXRpb24gdXNlcyBpbmZpeCBvcGVyYXRvcnMgYW5kIG5vcm1hbCBydWxlcyBvZgogICAgICAgb3BlcmF0b3IgcHJlY2VkZW5jZSwgd2l0aCBwYXJlbnRoZXNlcyB1c2VkIHRvIGZvcmNlIGV4Y2VwdGlvbnMgdG8KICAgICAgIHRoZSBydWxlczsgbWFueSBvcGVyYXRpb25zIGNhbiBiZSBpbmNsdWRlZCBpbiBhbiBleHByZXNzaW9uLgogICAgICAgUy1FeHByZXNzaW9ucyB1c2UgcHJlZml4IG9wZXJhdG9ycyB3aXRoIG5vIGludHJpbnNpYyBwcmVjZWRlbmNlOwogICAgICAgZWFjaCBvcGVyYXRpb24gaXMgZW5jbG9zZWQgaW4gcGFyZW50aGVzZXMsIGFuZCB0aGUgYXJyYW5nZW1lbnQgb2YKICAgICAgIHBhcmVudGhlc2VzIGRldGVybWluZXMgcHJlY2VkZW5jZS4KICAgICAqIEFsZ2VicmFpYyBpbmZpeCBvcGVyYXRvcnMgcmVxdWlyZSB0d28gb3BlcmFuZHM7IFMtRXhwcmVzc2lvbgogICAgICAgcHJlZml4IG9wZXJhdG9ycyBjYW4gYWNjZXB0IGEgdmFyaWFibGUgbnVtYmVyIG9mIG9wZXJhbmRzLgogICAgICogWW91IGNhbiB1c2UgYWxnZWJyYWljIG5vdGF0aW9uIGFueXdoZXJlIHRoYXQgQy1LZXJtaXQgYWNjZXB0cyBhCiAgICAgICBudW1iZXIsIGUuZy4gImVjaG8gXCZhWygoMSsxKSoyLTFdIiwgYnV0IHlvdSBjYW4gdXNlIFMtRXhwcmVzc2lvbnMKICAgICAgIG9ubHkgYXMgdG9wLWxldmVsIGNvbW1hbmRzLiBZb3UgY2FuLCBob3dldmVyLCB1c2UgZWl0aGVyIGFsZ2VicmFpYwogICAgICAgb3IgUy1FeHByZXNzaW9ucyBhbnl3aGVyZSBhdCBhbGwgYnkgZW5jbG9zaW5nIHRoZW0gaW4gXGZldmFsdWF0ZSgpCiAgICAgICBvciBcZnNleHByZXNzaW9uKCksIHJlc3BlY3RpdmVseS4KICAgICAqIFlvdSBjYW4gdXNlIGFueSBtaXh0dXJlIG9mIGludGVnZXIgYW5kIGZsb2F0aW5nLXBvaW50IG51bWJlcnMgaW4KICAgICAgIFMtRXhwcmVzc2lvbnMsIGJ1dCBvbmx5IGludGVnZXJzIGFyZSBwZXJtaXR0ZWQgaW4gYWxnZWJyYWljCiAgICAgICBleHByZXNzaW9ucy4gT3V0c2lkZSBvZiBTLUV4cHJlc3Npb25zLCBmbG9hdGluZyBwb2ludCBhcml0aG1ldGljCiAgICAgICBpcyBzdXBwb3J0ZWQgb25seSBieSBcZmZwLi4uKCkgZnVuY3Rpb24gY2FsbHMuCiAgICAgKiBPcGVyYXRvcnMgYW5kIG9wZXJhbmRzIGluIFMtRXhwcmVzc2lvbnMgbXVzdCBiZSBzZXBhcmF0ZWQgYnkKICAgICAgIHNwYWNlcywgZS5nLiAiKCsgYSBiKSIuIFNwYWNlcyBhcmUgbm90IHJlcXVpcmVkIGluIGFsZ2VicmFpYwogICAgICAgZXhwcmVzc2lvbnM6ICIoKGErYikqYykiLgogICAgICogV2hlbiBhc3NpZ25pbmcgdmFsdWVzIHRvIGJhY2tzbGFzaCB2YXJpYWJsZXMgKHN1Y2ggYXMgXCV4IG9yCiAgICAgICBcJmFbMl0pIHVzaW5nIFNFVFEgb3IgTEVULCB5b3UgbXVzdCBkb3VibGUgdGhlIGJhY2tzbGFzaC4KCiAgIFsgWzUzM11Ub3AgXSBbIFs1MzRdQ29udGVudHMgXSBbIFs1MzVdQy1LZXJtaXQgSG9tZSBdIFsgWzUzNl1LZXJtaXQKICAgSG9tZSBdCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgOS4xMS4gRGlmZmVyZW5jZXMgZnJvbSBMaXNwCgogICAgICogS2VybWl0IGhhcyBhIGxvdCBvZiBidWlsdC1pbiBvcGVyYXRvcnMgbm90IGZvdW5kIGluIExpc3A6ICsrLCBeLAogICAgICAgZXRjLgogICAgICogTW9zdCBkaWFsZWN0cyBvZiByZWFsIExpc3AgZG8gbm90IGFsbG93IFMtRXhwcmVzc2lvbnMgdGhhdCBkb24ndAogICAgICAgc3RhcnQgd2l0aCBhbiBvcGVyYXRvciwgZm9yIGV4YW1wbGU6CiAgKGEpCiAgICAgICBUaGlzIGV4cHJlc3Npb24gY2FuIGNhdXNlIGFuIGVycm9yIGluIExpc3AgKGV2ZW4gaWYgImEiIGhhcyBhCiAgICAgICB2YWx1ZSksIGJ1dCBpcyBhY2NlcHRhYmxlIGluIEtlcm1pdCwgd2hlcmUgaXQgcmV0dXJucyB0aGUgdmFsdWUgb2YKICAgICAgIHRoZSB2YXJpYWJsZSAiYSIuIFNpbWlsYXJseSwgKDEpIHJldHVybnMgdGhlIHZhbHVlICIxIi4KICAgICAqIEluIHJlYWwgTGlzcCwgRVZBTCByZXF1aXJlcyBleGFjdGx5IG9uZSBvcGVyYW5kLiBJbiBLZXJtaXQsIGl0IGNhbgogICAgICAgaGF2ZSAwLCAxLCAyLCBvciBtb3JlIG9wZXJhbmRzLiBJdCByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgbGFzdAogICAgICAgb3BlcmFuZCBldmFsdWF0ZWQuCiAgICAgKiBSZWFsIExpc3AgU0VUUSBhbmQgTEVUIHVzdWFsbHkgcmVxdWlyZSBhbiBldmVuIG51bWJlciBvZiBvcGVyYW5kcy4KICAgICAgIEtlcm1pdCBhbGxvd3MgYW4gb2RkIG51bWJlciwgaW4gd2hpY2ggY2FzZSB0aGUgbGFzdCAob3Igb25seSkKICAgICAgIHZhcmlhYmxlIGlzIHVuZGVmaW5lZCAoaS5lLiBkZWxldGVkLCBkZXN0cm95ZWQpLgogICAgICogS2VybWl0IGRvZXMgbm90IHN1cHBvcnQgcmF0aW9zIHN1Y2ggYXMgIjcvOCIuIFNvbWUgTGlzcCBkaWFsZWN0cwogICAgICAgYWNjZXB0IHJhdGlvcyBhcyBudW1iZXJzLCBhbmQgZ2VuZXJhdGUgcmF0aW9zIHdoZW4gdG9sZCB0byBkaXZpZGUKICAgICAgIHR3byBpbnRlZ2VycyB3aG9zZSBxdW90aWVudCBpcyBub3QgYSB3aG9sZSBudW1iZXI7IGUuZy4gaW4gQ29tbW9uCiAgICAgICBMaXNwOgogIFsxM10gVVNFUigzNyk6ICgvICgrIDEgMiAzIDQpIDMpCiAgMTAvMwogIFsxM10gVVNFUigzOCk6CiAgICAgKiBUaGUgcmVzdWx0IG9mICgvIDEwIDMpIGlzIDMuMzMzLi4uLiBTb21lIExpc3AgZGlhbGVjdHMgdHJ1bmNhdGUKICAgICAgIHRoZSByZXN1bHQgdG8gMyBzaW5jZSBib3RoIG9wZXJhbmRzIGFyZSBpbnRlZ2Vycywgc29tZSBkb24ndDsgc29tZQogICAgICAgZ2l2ZSB0aGUgcmVzdWx0IGFzIGEgcmF0aW8uIEMtS2VybWl0IGFsd2F5cyBnaXZlcyBhIGZsb2F0aW5nIHBvaW50CiAgICAgICByZXN1bHQgd2hlbiB0aGVyZSBpcyBhIGZyYWN0aW9uYWwgcGFydC4gSWYgeW91IHdhbnQgYW4gaW50ZWdlcgogICAgICAgcmVzdWx0LCB5b3UgY2FuIHVzZSBUUlVOQ0FURSwgRkxPT1IsIG9yIENFSUxJTkcsIGUuZy4gKHRydW5jYXRlICgvCiAgICAgICAxMCAzKSkuCiAgICAgKiBUaGVyZSBpcyBjdXJyZW50bHkgbm8gImJpZ251bSIgc3VwcG9ydC4gTGFyZ2UgbnVtYmVycyBjYW4gYmUgdXNlZAogICAgICAgYW5kIGxhcmdlIHJlc3VsdHMgZ2VuZXJhdGVkLCBidXQgKGFzIG5vdGVkIGluIFs1MzddU2VjdGlvbiA5LjIpCiAgICAgICB0aGV5IGFyZSBhY2N1cmF0ZSBvbmx5IHRvIHRoZSBwcmVjaXNpb24gb2YgdGhlIHVuZGVybHlpbmcgbWFjaGluZS4KICAgICAgIFx2KG1hdGhfcHJlY2lzaW9uKSBnaXZlcyB0aGUgbWFjaGluZSBwcmVjaXNpb24gYXMgYSBudW1iZXIgb2YKICAgICAgIGRlY2ltYWwgZGlnaXRzLCBlLmcuIDE2LgogICAgICogU2NpZW50aWZpYyBub3RhdGlvbiBmb3IgZmxvYXRpbmctcG9pbnQgbnVtYmVycyBpcyBub3Qgc3VwcG9ydGVkLgogICAgICAgSWYgdGhlIG1hZ25pdHVkZSBvZiBhIG51bWJlciBpcyBncmVhdGVyIHRoYW4gdGhlIHByZWNpc2lvbiBvZiB0aGUKICAgICAgIHVuZGVybHlpbmcgaGFyZHdhcmUsIHRoZSBsZXNzLXNpZ25pZmljYW50IGRpZ2l0cyBhcmUgc2hvd24gYnV0CiAgICAgICB0aGVpciB2YWx1ZXMgYXJlIG1lYW5pbmdsZXNzLiBJZiBpdCB0aGUgbnVtYmVyIGlzIHRvbyBzbWFsbCB0byBiZQogICAgICAgcmVwcmVzZW50ZWQgaW50ZXJuYWxseSwgaXQgaXMgc2hvd24gYXMgIjAuMCIuCiAgICAgKiBNYW55IExpc3AgZmVhdHVyZXMgYXJlIG9taXR0ZWQ6IExpc3QgcHJvY2Vzc2luZyAoQ0FSLCBDRFIsIGV0YyksCiAgICAgICBERUZVTiwgTGlzcC1zcGVjaWZpYyBjb250cm9sIHN0cnVjdHVyZXMsIGFuZCBzbyBvbi4KCiAgIFsgWzUzOF1Ub3AgXSBbIFs1MzldQ29udGVudHMgXSBbIFs1NDBdQy1LZXJtaXQgSG9tZSBdIFsgWzU0MV1LZXJtaXQKICAgSG9tZSBdCiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCjEwLiBGSUxFIFRSQU5TRkVSCgogICBOZXcgY29tbWFuZHMgYW5kIHN3aXRjaGVzOgoKICAgU0VUIFRSQU5TRkVSIFJFUE9SVCB7IE9GRiwgT04gfQogICAgICAgICAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgKG5ldykgb25lLWxpbmUgbWVzc2FnZSBwcmludGVkIGJ5CiAgICAgICAgICBLZXJtaXQgYWZ0ZXIgYSByZW1vdGUtbW9kZSBmaWxlIHRyYW5zZmVyIHRvIGluZGljYXRlIHRoZSBzb3VyY2UKICAgICAgICAgIGFuZCBkZXN0aW5hdGlvbiBmaWxlLCBjb21wbGV0ZSB3aXRoIHBhdGgsIHRvIGxldCB5b3Uga25vdyB3aGVyZQogICAgICAgICAgdGhlIGZpbGUgd2VudC4KCiAgIFNFTkQgL1RZUEU6e1RFWFQsQklOQVJZfQogICAgICAgICAgU2VuZHMgb25seSBmaWxlcyBvZiB0aGUgZ2l2ZW4gdHlwZSAoc2VlIFs1NDJdU2VjdGlvbiA0KS4KCiAgIFNFTkQgL05PRk9MTE9XTElOS1M6CiAgICAgICAgICAoVU5JWCBvbmx5KSBTa2lwIG92ZXIgc3ltYm9saWMgbGlua3MgcmF0aGVyIHRoYW4gZm9sbG93aW5nIHRoZW0KICAgICAgICAgIChkZWZhdWx0KS4gVGhpcyBhcHBsaWVzIHRvIHdpbGRjYXJkIGFuZC9vciByZWN1cnNpdmUgU0VORHM7IGlmCiAgICAgICAgICBhIHNpbmdsZSBmaWxlbmFtZSBpcyBnaXZlbiwgYW5kIGl0IGhhcHBlbnMgdG8gYmUgYSBzeW1ib2xpYwogICAgICAgICAgbGluaywgdGhlIGZpbGUgaXQgcG9pbnRzIHRvIGlzIHNlbnQuCgogICBTRU5EIC9GT0xMT1dMSU5LUzoKICAgICAgICAgIChVTklYIG9ubHkpIEZvbGxvdyAocmVzb2x2ZSkgc3ltYm9saWMgbGlua3MuIFdhdGNoIG91dCBmb3IKICAgICAgICAgIGNpcmN1bGFyIGxpbmtzLCBlbmRsZXNzIGxvb3BzLCBldGMuCgogICBTRVQgU0VORCBJLVBBQ0tFVFMgeyBPRkYsIE9OIH0KICAgICAgICAgIFdoZW4gc2VuZGluZyBjb21tYW5kcyB0byBhIEtlcm1pdCBzZXJ2ZXIsIHRoaXMgdGVsbHMgd2hldGhlcgogICAgICAgICAgY29tbWFuZCBwYWNrZXRzIHNob3VsZCBiZSBwcmVjZWRlZCBieSBhbiBJIChpbmZvcm1hdGlvbikKICAgICAgICAgIHBhY2tldCwgd2hpY2ggaXMgdXNlZCB0byBzeW5jaHJvbml6ZSBwYXJhbWV0ZXJzIHByaW9yIHRvCiAgICAgICAgICBleGVjdXRpbmcgdGhlIGNvbW1hbmQuIE5vcm1hbGx5IE9OLiBUaGUgb25seSByZWFzb24gdG8gc2V0IHRoaXMKICAgICAgICAgIE9GRiBpcyBmb3IgY29tbXVuaWNhdGluZyB3aXRoIGJ1Z2d5IEtlcm1pdCBzZXJ2ZXJzIHRoYXQKICAgICAgICAgIG1pc2JlaGF2ZSB3aGVuIGFuIEkgcGFja2V0IGlzIHNlbnQgdG8gdGhlbS4gVGhlcmUgaXMgYWxzbyBhIFNFVAogICAgICAgICAgUkVDRUlWRSBJLVBBQ0tFVFMgY29tbWFuZCwgYnV0IHByZXNlbnRseSBpdCBoYXMgbm8gZWZmZWN0LgoKICAgU0VUIFRSQU5TRkVSIE1FU1NBR0UgWyB0ZXh0IF0KICAgICAgICAgIFNldHMgYW4gaW5pdGlhbCBtZXNzYWdlIHRvIGJlIHNob3duIGluIHRoZSBMYXN0IE1lc3NhZ2UgZmllbGQKICAgICAgICAgIG9mIHRoZSBmdWxsc2NyZWVuIGZpbGUtdHJhbnNmZXIgZGlzcGxheS4KCiAgIFNFVCBUUkFOU0ZFUiBUUkFOU0xBVElPTiB7IE9OLCBPRkYgfQogICAgICAgICAgSW5oaWJpdHMgb3IgcmUtZW5hYmxlcyB0ZXh0LWZpbGUgdHJhbnNmZXIgY2hhcmFjdGVyLXNldAogICAgICAgICAgdHJhbnNsYXRpb24gZ2xvYmFsbHkuCgogICB7IFNFTkQsIE1TRU5ELCBHRVQsIFJFQ0VJVkUgfSAvVFJBTlNQQVJFTlQKICAgICAgICAgIEluaGliaXRzIGNoYXJhY3Rlci1zZXQgdHJhbnNsYXRpb24gZm9yIHRoaXMgdHJhbnNmZXIgb25seS4KCiAgIHsgR0VULCBSRUNFSVZFIH0gL1BJUEVTOntPTixPRkZ9CiAgICAgICAgICBPdmVycmlkZXMgZ2xvYmFsIFRSQU5TRkVSIFBJUEVTIHNldHRpbmcgZm9yIHRoaXMgdHJhbnNmZXIgb25seTsKICAgICAgICAgIE9OIGFsbG93cyBpbmNvbWluZyBmaWxlcyB3aXRoIG5hbWVzIGxpa2UgIiF0YXIgeGYgLSIgdG8gYmUKICAgICAgICAgIG9wZW5lZCBhcyBwaXBlbGluZXMgcmF0aGVyIHRoYW4gcmVndWxhciBmaWxlcy4KCiAgIFRoZSBmb2xsb3dpbmcgbmV3ICJob3Qga2V5cyIgYXJlIGF2YWlsYWJsZSB3aGVuIEtlcm1pdCdzIGZpbGUtdHJhbnNmZXIKICAgZGlzcGxheSBpcyB2aXNpYmxlOgoKICAgICBEOiBUdXJuIG9uIGRlYnVnZ2luZywgb3BlbiAiZGVidWcubG9nIiBpZiBub3QgYWxyZWFkeSBvcGVuLgogICAgIGQ6IFR1cm4gb2ZmIGRlYnVnZ2luZyBidXQgbGVhdmUgbG9nIG9wZW4gKGlmIGl0IHdhcyBvcGVuKS4KICAgICBUOiBUdXJuIG9uIGRlYnVnLWxvZyB0aW1lc3RhbXBzLgogICAgIHQ6IFR1cm4gb2ZmIGRlYnVnLWxvZyB0aW1lc3RhbXBzLgoKICAgT3RoZXIgaW1wcm92ZW1lbnRzOgogICAgICogU0VUIEZJTEUgRE9XTkxPQUQtRElSRUNUT1JZIG5vdyB3b3JrcyBmb3IgZXh0ZXJuYWwgcHJvdG9jb2xzIChlLmcuCiAgICAgICBzei9yeikgdG9vLgogICAgICogSW1wcm92ZWQgYXV0b21hdGljIHBlci1maWxlIHRleHQvYmluYXJ5IHN3aXRjaGluZywgZGVzY3JpYmVkIGluCiAgICAgICBbNTQzXVNlY3Rpb24gNC4KICAgICAqIFdoZW4gc2VuZGluZyBhIGZpbGUgZ3JvdXAgKGUuZy4gInNlbmQgKi4qIiksIGZhaWx1cmUgdG8gb3BlbiBhCiAgICAgICBmaWxlIGlzIG5vIGxvbmdlciBmYXRhbDsgbm93IEMtS2VybWl0IHNpbXBseSBnb2VzIGFoZWFkIHRvIHRoZQogICAgICAgbmV4dCBmaWxlLgogICAgICogVHJhbnNhY3Rpb24gbG9nIGVudHJpZXMgYXJlIG5vdyBtYWRlIGZvciBleHRlcm5hbCBwcm90b2NvbHMgdG9vLgoKICAgWyBbNTQ0XVRvcCBdIFsgWzU0NV1Db250ZW50cyBdIFsgWzU0Nl1DLUtlcm1pdCBIb21lIF0gWyBbNTQ3XUtlcm1pdAogICBIb21lIF0KICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKMTEuIE1PREVNUyBBTkQgRElBTElORwoKICAgSW4gQy1LZXJtaXQgOC4wLCB0aGUgZGVmYXVsdCBtb2RlbSB0eXBlIGZvciBkaWFsaW5nIGhhcyBjaGFuZ2VkIGZyb20KICAgTk9ORSAoPSBESVJFQ1QsIG1lYW5pbmcgbm8gbW9kZW0pIHRvIEdFTkVSSUMuIFRoaXMgY2hhbmdlIHNob3VsZCBoYXZlCiAgIG5vIGltcGFjdCBvbiBkaXJlY3QgY29ubmVjdGlvbnMuIEZvciBkaWFsaW5nLCBpdCBtZWFucyB0aGF0LCB1bmxlc3MKICAgeW91IFNFVCBNT0RFTSBUWVBFIHRvIGEgc3BlY2lmaWMgdHlwZSwgc3VjaCBhcyBVU1JPQk9USUNTIG9yIENPTkVYQU5ULAogICBLZXJtaXQgYXNzdW1lczoKCiAgICAxLiBUaGUgbW9kZW0gdXNlcyB0aGUgSGF5ZXMgQVQgY29tbWFuZCBzZXQuCiAgICAyLiBUaGUgbW9kZW0gc3VwcG9ydHMgZXJyb3IgY29ycmVjdGlvbiwgZGF0YSBjb21wcmVzc2lvbiwgYW5kCiAgICAgICBoYXJkd2FyZSBmbG93IGNvbnRyb2wgYW5kIGlzIGFscmVhZHkgY29uZmlndXJlZCB0byB1c2UgdGhlbS4KCiAgIEluIGZhY3QsIEtlcm1pdCBhc3N1bWVzIHRoZSBtb2RlbSBpcyBjb21wbGV0ZWx5IGNvbmZpZ3VyZWQsIGFuZAogICB0aGVyZWZvcmUgZG9lcyBub3Qgc2VuZCBpdCBhbiBpbml0aWFsaXphdGlvbiBzdHJpbmcgb3IgYW55CiAgIGNvbmZpZ3VyYXRpb24gY29tbWFuZHMuIEluc3RlYWQsIGl0IHNlbmRzIG9ubHkgdGhlIHNpbXBsZXN0IGFuZCBtb3N0CiAgIHBvcnRhYmxlIGNvbW1hbmRzOgoKICAgICBBVFEwVjEgICAgICAgICAgR2l2ZSBkaWFsIHJlc3VsdCBjb2Rlcy4KICAgICBBVERUbnVtYmVyICAgICAgRGlhbCB0aGUgbnVtYmVyLgoKICAgKG9yIEFURCBvciBBVERQLCBhcyBhcHByb3ByaWF0ZSkuCgogICBUaGUgbmV3IGRlZmF1bHRzIHdvcmsgZm9yIGRpcmVjdCBjb25uZWN0aW9ucyBhbmQgZm9yIG1vc3QgbW9kZXJuCiAgIG1vZGVtcyBvbiBtb3N0IHBsYXRmb3JtcywgYW5kIHRoZXkgd29yayBtdWNoIGZhc3RlciB0aGFuCiAgICJmdWxsLXRyZWF0bWVudCIgZGlhbGluZy4gSWYgdGhlIG5ldyBkZWZhdWx0cyBkb24ndCB3b3JrIGZvciB5b3UsIG9yCiAgIGlmIHlvdSBuZWVkIHRvIHBlcmZvcm0gZXhwbGljaXQgbW9kZW0gY29uZmlndWF0aW9ucyBvciBpbnRlcmFjdGlvbnMsCiAgIHRoZW4gc2V0IGEgc3BlY2lmaWMgbW9kZW0gdHlwZSBhbmQgdXNlIHRoZSBTRVQgTU9ERU0gYW5kIFNFVCBESUFMCiAgIGNvbW1hbmRzIGFzIGRvY3VtZW50ZWQgaW4gVXNpbmcgQy1LZXJtaXQuCgogICAgIFdBUk5JTkc6IERvbid0IHVzZSB0aGUgZ2VuZXJpYyBtb2RlbSBvbiBob3N0cyB0aGF0IGRvIG5vdCBzdXBwb3J0CiAgICAgUlRTL0NUUyBmbG93IGNvbnRyb2wuIElmIFhvbi9Yb2ZmIGlzIGluIHVzZSBvbiB0aGUgc2VyaWFsIHBvcnQsCiAgICAgeW91J2xsIG5lZWQgdG8gc2VsZWN0IGEgcGFydGljdWxhciBtb2RlbSB0eXBlIHNvIEtlcm1pdCBrbm93cyB3aGF0CiAgICAgY29tbWFuZCB0byBnaXZlIGl0IHRvIGVuYWJsZSBYb24vWG9mZiBmbG93IGNvbnRyb2wgYmV0d2VlbiBpdHNlbGYKICAgICBhbmQgeW91ciBzZXJpYWwgcG9ydC4KCiAgIFRoZSBmb2xsb3dpbmcgbmV3IG1vZGVtIHR5cGVzIHdlcmUgYWRkZWQgaW4gQy1LZXJtaXQgOC4wOgoKICAgICBsdWNlbnQ6ICAgICAgICAgIEx1Y2VudCBWZW51cyBjaGlwc2V0CiAgICAgcGN0ZWw6ICAgICAgICAgICBQQ1RlbCBWLjkwIGNoaXBzZXQKICAgICBjb25leGFudDogICAgICAgIENvbmV4YW50IChleC1Sb2Nrd2VsbCkgbW9kZW0gZmFtaWx5CiAgICAgem9vbS12MzJiaXM6ICAgICBOZXcgbmFtZSBmb3IgIlpvb20iCiAgICAgem9vbS12MzQgICAgICAgICBab29tIFYuMzQKICAgICB6b29tLXY5MCAgICAgICAgIFpvb20gVi45MCA1NksKICAgICB6b29tLXY5MjogICAgICAgIFpvb20gVi45MiB3aXRoIFYuNDQgZGF0YSBjb21wcmVzc2lvbgogICAgIHpvbHRyaXgtdjM0OiAgICAgTmV3IG5hbWUgZm9yICJ6b2x0cml4IgogICAgIHpvbHRyaXgtaHNwLXY5MDogU3lub255bSBmb3IgUENUZWwKICAgICB6b2x0cml4LWhjZi12OTA6IFN5bm9ueW0gZm9yIElUVS1ULVYyNTAKICAgICBzbWFydGxpbmstdjkwOiAgIFN5bm9ueW0gZm9yIHVzcm9ib3RpY3MgKHNhbWUgY2hpcHNldCkKICAgICBhY2VyLXY5MDogICAgICAgIFN5bm9ueW0gZm9yIFJvY2t3ZWxsLXY5MAoKICAgTmV3IERJQUwtcmVsYXRlZCB2YXJpYWJsZXM6CgogICAgIFx2KGRtX2hmKTogIERpYWwgbW9kaWZpZXI6IFdhaXQgZm9yIEhvb2stRmxhc2guCiAgICAgXHYoZG1fd2IpOiAgRGlhbCBtb2RpZmllcjogV2FpdCBmb3IgQm9uZy4KCiAgIEZpbmFsbHksIGlmIGRpYWxpbmcgZmFpbHMsIEtlcm1pdCBub3cgcHJpbnRzIGEgY29udGV4dC1zZW5zaXRpdmUgaGludAogICBzdWdnZXN0aW5nIHBvc3NpYmxlIHJlYXNvbnMgYW5kIHJlbWVkaWVzLgoKICAgQWRkZWQgaW4gQy1LZXJtaXQgOC4wLjIwMTogICBSdWRpbWVudGFyeSBzdXBwb3J0IGZvciBDYWxsZXIgSUQsIGZvcgogICB1c2Ugd2l0aCB0aGUgQU5TV0VSIGNvbW1hbmQuIElmIHRoZSBtb2RlbSByZXBvcnRzIENhbGxlciBJRAogICBpbmZvcm1hdGlvbiwgS2VybWl0IHN0b3JlcyBpdCBpbiB2YXJpYWJsZXMgdGhhdCB5b3UgY2FuIGFjY2VzcyBhZnRlcgogICB0aGUgY2FsbCBpcyBhbnN3ZXJlZDoKCiAgXHYoY2FsbGlkX2RhdGUpICAgVGhlIGRhdGUgb2YgdGhlIGNhbGwKICBcdihjYWxsaWRfdGltZSkgICBUaGUgdGltZSBvZiB0aGUgY2FsbAogIFx2KGNhbGxpZF9uYW1lKSAgIFRoZSBuYW1lIG9mIHRoZSBjYWxsZXIKICBcdihjYWxsaWRfbm1icikgICBUaGUgdGVsZXBob25lIG51bWJlciBvZiB0aGUgY2FsbGVyCiAgXHYoY2FsbGlkX21lc2cpICAgQSBtZXNzYWdlCgogICBUaGUgZm9ybWF0IG9mIHRoZXNlIGl0ZW1zIGRlcGVuZHMgb24gdGhlIG9yaWdpbmF0aW5nIGFuZCBhbnN3ZXJpbmcKICAgcGhvbmUgY29tcGFuaWVzIGFuZCB0aGUgbW9kZW1zIGFuZCB0aGVpciBjb25maWd1cmF0aW9uLgoKICAgTm90IHZlcnkgbWFueSBtb2RlbXMgc3VwcG9ydCBDYWxsZXIgSUQsIGFuZCB0aG9zZSB0aGF0IGRvIChhKSB0ZW5kIHRvCiAgIGhhdmUgaXQgZGlzYWJsZWQgYnkgZGVmYXVsdCwgYW5kIChiKSB1c2UgZGlmZmVyZW50IGNvbW1hbmRzIHRvIGVuYWJsZQogICBpdC4gQSBxdWljayBzdXJ2ZXkgc2hvd3Mgb2Ygc29tZSBjdXJyZW50IG1vZGVscyBzaG93czoKCiAgIC0gVVNSIFYuOTA6ICAgICAgTm8KICAgLSBJVFUtVCBWLjI1MDogICBObwogICAtIEx1Y2VudCBWZW51czogIE5vCiAgIC0gRGlhbW9uZCBTdXByYTogI0NJRD0xCiAgIC0gUm9ja3dlbGwgNTZLOiAgI0NJRD0xCiAgIC0gUENURUw6ICAgICAgICAgI0NJRD0xCiAgIC0gWm9sdHJpeDogICAgICAgK1ZDSUQ9MQogICAtIENvbmV4YW50OiAgICAgICtWQ0lEPTEKCiAgIFRvIHVzZSBLZXJtaXQncyBDYWxsZXIgSUQgZmVhdHVyZSwgeW91IGhhdmUgdG8gc2V0IHRoZSBtb2RlbSB0byB3YWl0CiAgIGZvciBhdCBsZWFzdCB0d28gcmluZ3MgYmVmb3JlIGFuc3dlcmluZywgYW5kIHlvdSBoYXZlIHRvIGdpdmUgdGhlCiAgIGNvbW1hbmQgdG8gZW5hYmxlIENhbGxlciBJRDsgZm9yIGV4YW1wbGUgKGFmdGVyIGNob29zaW5nIGEgbW9kZW0gd2l0aAogICBTRVQgTU9ERU0gVFlQRSk6CgogIHNldCBtb2RlbSBjb21tYW5kIGF1dG9hbnN3ZXIgb24gQVRTMD0yI0NJRD0xXHsxM30KICBzZXQgbW9kZW0gY29tbWFuZCBhdXRvYW5zd2VyIG9uIEFUUzA9MitWQ0lEPTFcezEzfQoKICAgVGhlc2UgY29tbWFuZHMgY2FuIGJlIHVuZG9uZSB3aXRoOgoKICBzZXQgbW9kZW0gY29tbWFuZCBhdXRvYW5zd2VyIG9uIEFUUzA9MSNDSUQ9MFx7MTN9CiAgc2V0IG1vZGVtIGNvbW1hbmQgYXV0b2Fuc3dlciBvbiBBVFMwPTErVkNJRD0wXHsxM30KCiAgIEtlcm1pdCBwcmVzZW50bHkgaGFzIG5vIGJ1aWx0LWluIGtub3dsZWRnZSBvZiB0aGUgQ2FsbGVyIElECiAgIGNhcGFiaWxpdGllcyBvciBjb21tYW5kcyBvZiB0aGUgbW9kZW1zIGluIGl0cyBkYXRhYmFzZS4KCiAgIFNpbmNlIHRoZSB2YXJpYWJsZXMgY2FuIGJlIGFjY2Vzc2VkIG9ubHkgYWZ0ZXIgdGhlIGNhbGwgaXMgYW5zd2VyZWQsCiAgIHRoZSBvbmx5IHdheSB0byByZWZ1c2UgYSBjYWxsIGlzIHRvIGFuc3dlciBpdCwgaW5zcGVjdCB0aGUgdmFyaWFibGVzLAogICBhbmQgdGhlbiBoYW5nIGl0IHVwIGlmIGRlc2lyZWQuCgogICBbIFs1NDhdVG9wIF0gWyBbNTQ5XUNvbnRlbnRzIF0gWyBbNTUwXUMtS2VybWl0IEhvbWUgXSBbIFs1NTFdS2VybWl0CiAgIEhvbWUgXQogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgoxMi4gVEVSTUlOQUwgQ09OTkVDVElPTgoKICAgTm93IHRoYXQgNy1iaXQgY29ubmVjdGlvbnMgYXJlIG5vIGxvbmdlciB0aGUgbm9ybSwgdGhlIGRlZmF1bHQKICAgdGVybWluYWwgYnl0ZXNpemUgKGFsc28gY2FsbGVkICJkYXRhIHNpemUiIG9yICJ3b3JkIHNpemUiKSBpbiBDLUtlcm1pdAogICA4LjAgaXMgOCBiaXRzLCByYXRoZXIgdGhhbiA3IGJpdHMgYXMgaXQgd2FzIGluIEMtS2VybWl0IDcuMCBhbmQKICAgZWFybGllcjoKCiAgIFNFVCBFU0NBUEUgY2hhcmFjdGVyCiAgICAgICAgICBUaGlzIGNvbW1hbmQsIHdoaWNoIHNwZWNpZmllcyB5b3VyIENPTk5FQ1QtbW9kZSBlc2NhcGUKICAgICAgICAgIGNoYXJhY3RlciwgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IGFueSBBU0NJSSBjb250cm9sIGNoYXJhY3RlciBpbgogICAgICAgICAgYSB2YXJpZXR5IG9mIGZvcm1hdHMuIEMtS2VybWl0IDguMC4yMDEgbm93IGFsc28gbGV0cyB5b3UKICAgICAgICAgIHNwZWNpZnkgYW55IDgtYml0IHZhbHVlLCAxMjgtMjU1LCBhcyB0aGUgZXNjYXBlIGNoYXJhY3Rlci4gSW4KICAgICAgICAgIHRoZSBTRVQgRVNDQVBFIGNvbW1hbmQsIHlvdSBjYW4gdHlwZSB0aGUgOC1iaXQgY2hhcmFjdGVyCiAgICAgICAgICBsaXRlcmFsbHkgb3IgeW91IGNhbiBlbnRlciBpdHMgbnVtZXJpYyBjb2RlLiBIZXJlIGFyZSBleGFtcGxlcwogICAgICAgICAgdGhhdCB5b3UgY2FuIGVudGVyIGZyb20gYSB0ZXJtaW5hbCBvciBjb25zb2xlIHRoYXQgdXNlcyB0aGUgSVNPCiAgICAgICAgICBMYXRpbi0xIGNoYXJhY3RlciBzZXQ6CgogIEMtS2VybWl0PiBzZXQgZXNjYXBlIMMKICBDLUtlcm1pdD4gc2V0IGVzY2FwZSAxOTUKICBDLUtlcm1pdD4gc2hvdyBlc2NhcGUKICAgRXNjYXBlIGNoYXJhY3RlcjogQ29kZSAxOTUgKMMpOiBlbmFibGVkCiAgQy1LZXJtaXQ+CgogICAgICAgICAgQm90aCBvZiB0aGVzZSBjb21tYW5kcyBzZXQgdGhlIGVzY2FwZSBjaGFyYWN0ZXIgdmFsdWUgdG8gMTk1CiAgICAgICAgICAoZGVjaW1hbCksIHdoaWNoIGhhcHBlbnMgdG8gYmUgdXBwZXJjYXNlIGxldHRlciBBIHdpdGggVGlsZGUgaW4KICAgICAgICAgIExhdGluLTEuIFNIT1cgRVNDQVBFIGFuZCBTSE9XIFRFUk1JTkFMIHNob3cgdGhlIHZhbHVlLCBhcyBkb2VzCiAgICAgICAgICB0aGUgQ09OTkVDVCBtZXNzYWdlLgoKICAgU0VUIFRFUk1JTkFMIEFVVE9ET1dOTE9BRCBFUlJPUiB7IFNUT1AsIENPTlRJTlVFIH0KICAgICAgICAgIFdoZW4gS2VybWl0IGhhcyBhIHRlcm1pbmFsIGNvbm5lY3Rpb24gdG8gYW5vdGhlciBjb21wdXRlciwgYW5kCiAgICAgICAgICBhIGZpbGUgdHJhbnNmZXIgaXMgaW5pdGlhdGVkIGF1dG9tYXRpY2FsbHkgYmVjYXVzZSBhIEtlcm1pdAogICAgICAgICAgcGFja2V0IHdhcyByZWNlaXZlZCBpbiBDT05ORUNUIG1vZGUgKGkuZS4gaW4gdGhlIHRlcm1pbmFsCiAgICAgICAgICBzY3JlZW4pLCB0aGlzIGNvbW1hbmQgdGVsbHMgd2hhdCBLZXJtaXQgc2hvdWxkIGRvIGlmIHRoZQogICAgICAgICAgdHJhbnNmZXIgZmFpbHMuIFRoZSBkZWZhdWx0IGlzIHRvIFNUT1AsIHdoaWNoIGxlYXZlcyBLZXJtaXQgaW4KICAgICAgICAgIGNvbW1hbmQgbW9kZSB3aXRoIGl0cyBmaWxlLXRyYW5zZmVyIGRpc3BsYXkgc2hvd2luZywgc28geW91IGNhbgogICAgICAgICAgc2VlIHRoYXQgdGhlIHRyYW5zZmVyIGZhaWxlZCBhbmQgd2h5LiBJZiB5b3UgU0VUIFRFUk1JTkFMCiAgICAgICAgICBBVVRPRE9XTkxPQUQgRVJST1IgQ09OVElOVUUsIHRoaXMgY2F1c2VzIEtlcm1pdCB0byByZXR1cm4KICAgICAgICAgIGF1dG9tYXRpY2FsbHkgdG8gaXRzIHRlcm1pbmFsIHNjcmVlbiAoaS5lLiByZXN1bWUgaXRzIENPTk5FQ1QKICAgICAgICAgIHNlc3Npb24pIGFzIGlmIHRoZSB0cmFuc2ZlciBoYWQgc3VjY2VlZGVkOyB0aGlzIGNhbiBiZQogICAgICAgICAgZGVzaXJhYmxlIGlmIHRoZSBlbnRpcmUgc2Vzc2lvbiBpcyB1bmRlciBjb250cm9sIG9mIGEKICAgICAgICAgIGhvc3QtYmFzZWQgc2NyaXB0LgoKICAgU0VUIFRFUk1JTkFMIEJZVEVTSVpFIHsgNywgOCB9CiAgICAgICAgICBUaGUgYnl0ZSBzaXplIHRvIHVzZSBkdXJpbmcgQ09OTkVDVCBhbmQgSU5QVVQgY29tbWFuZAogICAgICAgICAgZXhlY3V0aW9uLCB3aGljaCBjYW4gYmUgbW9yZSByZXN0cmljdGl2ZSB0aGFuIHRoZSBieXRlc2l6ZQogICAgICAgICAgaW1wbGllZCBieSB0aGUgY3VycmVudCBQQVJJVFkgc2V0dGluZywgYnV0IG5vdCBsZXNzCiAgICAgICAgICByZXN0cmljdGl2ZS4gSW4gQy1LZXJtaXQgNy4wIGFuZCBlYXJsaWVyLCB0aGUgdGVybWluYWwgYnl0ZXNpemUKICAgICAgICAgIHdhcyA3IGJ5IGRlZmF1bHQgdG8gcHJvdGVjdCBhZ2FpbnN0IHRoZSBsaWtlbGlob29kIHRoYXQgcGFyaXR5CiAgICAgICAgICB3YXMgaW4gdXNlIG9uIHRoZSBjb25uZWN0aW9uIHdpdGhvdXQgdGhlIHVzZXIncyBrbm93bGVkZ2UuIFdoZW4KICAgICAgICAgIHRoZSB0ZXJtaW5hbCBieXRlc2l6ZSBpcyA4IChhcyBpdCBpcyBpbiBDLUtlcm1pdCA4LjAgYW5kCiAgICAgICAgICBsYXRlciksIHRoZSB1c2VyIHdpbGwgc2VlIGdhcmJhZ2UgaW4gdGhpcyAoaW5jcmVhc2luZ2x5CiAgICAgICAgICB1bmxpa2VseSkgc2l0dWF0aW9uLiBOb3RlIHRoYXQgOCBkYXRhIGJpdHMgYXJlIHJlcXVpcmVkIGZvcgogICAgICAgICAgbW9zdCBjaGFyYWN0ZXIgc2V0cyBvdGhlciB0aGFuIEFTQ0lJOiBMYXRpbi0xLCBVVEYtOCwgYW5kIHNvCiAgICAgICAgICBvbi4KCiAgIEEgbmV3IGNvbW1hbmQgaGFzIGJlZW4gYWRkZWQgdG8gcHJvZHVjZSB0aW1lc3RhbXBlZCBzZXNzaW9uIGxvZ3M6CgogICBTRVQgVEVSTUlOQUwgU0VTU0lPTi1MT0cgVElNRVNUQU1QRUQtVEVYVAogICAgICAgICAgUmVjb3JkcyB0aGUgdGVybWluYWwgc2Vzc2lvbiBpbiB0ZXh0IG1vZGUgKGxpa2UgU0VUIFRFUk1JTkFMCiAgICAgICAgICBTRVNTSU9OLUxPRyBURVhUKSBidXQgYWRkcyBhIHRpbWVzdGFtcCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2gKICAgICAgICAgIGxpbmUuIFRoZSB0aW1lc3RhbXAgZm9ybWF0IGlzIGhoOm1tOnNzLm5ubiwgYW5kIGluZGljYXRlcyB0aGUKICAgICAgICAgIHRpbWUgYXQgd2hpY2ggdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgbGluZSBhcHBlYXJlZC4KCiAgIEluIG1vc3QgVU5JWCB2ZXJzaW9ucyAodGhvc2UgYnVpbHQgd2l0aCB0aGUgc2VsZWN0KCktY2FwYWJsZSBDT05ORUNUCiAgIG1vZHVsZSAtLSBwcmV0dHkgbXVjaCBhbGwgdGhlIG9uZXMgdGhhdCBoYXZlIG9yIGNvdWxkIGhhdmUgVEVMTkVUCiAgIGluY2x1ZGVkKSwgYW4gaWRsZSB0aW1lb3V0IGZlYXR1cmUgaGFzIGJlZW4gYWRkZWQ6CgogICBTRVQgVEVSTUlOQUwgSURMRS1USU1FT1VUIG51bWJlcgogICAgICAgICAgSWYgdGhlIG51bWJlciBpcyBub3QgMCwgdGhlbiBLZXJtaXQgaXMgdG8gdGFrZSBhbiBhY3Rpb24gd2hlbgogICAgICAgICAgdGhlIGdpdmVuIGFtb3VudCBvZiB0aW1lIHBhc3NlcyB3aXRoIG5vIGFjdGl2aXR5IGR1cmluZyBDT05ORUNUCiAgICAgICAgICBtb2RlLiBJZiB0aGUgbnVtYmVyIGlzIHBvc2l0aXZlIGl0IGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZgogICAgICAgICAgaWRsZSBzZWNvbmRzOyBpZiBudW1iZXIgaXMgbmVnYXRpdmUgaXQgcmVwcmVzZW50cyBtaWxsaXNlY29uZHMKICAgICAgICAgICh0aG91c2FuZHRocyBvZiBzZWNvbmRzKS4gSWYgMCBpcyBnaXZlbiBhcyB0aGUgbnVtYmVyLCB0aGVyZQogICAgICAgICAgYXJlIG5vIGlkbGUgdGltZW91dHMuIFN5bm9ueW06IFNFVCBURVJNSU5BTCBJRExFLUxJTUlULgoKICAgU0VUIFRFUk1JTkFMIElETEUtQUNUSU9OIHsgUkVUVVJOLCBIQU5HVVAsIEVYSVQsIE9VVFBVVCBbIHN0cmluZyBdIH0KICAgICAgICAgIFRoZSBhY3Rpb24gdG8gYmUgdGFrZW4gdXBvbiBhbiBpZGxlIHRpbWVvdXQgaW4gQ09OTkVDVCBtb2RlLgogICAgICAgICAgUkVUVVJOIHRvIHRoZSBwcm9tcHQsIEhBTkdVUCB0aGUgY29ubmVjdGlvbiwgRVhJVCBmcm9tIEtlcm1pdCwKICAgICAgICAgIG9yIE9VVFBVVCB0aGUgZ2l2ZW4gc3RyaW5nIChpZiBubyBzdHJpbmcgaXMgZ2l2ZW4sIGEgTlVMIChBU0NJSQogICAgICAgICAgMCkgY2hhcmFjdGVyIGlzIHNlbnQpLgoKICAgU0VUIFRFUk1JTkFMIElETEUtQUNUSU9OIHsgVEVMTkVULU5PUCwgVEVMTkVULUFZVCB9CiAgICAgICAgICBBY3Rpb25zIHRoYXQgY2FuIGJlIHNlbGVjdGVkIG9uIFRlbG5ldCBjb25uZWN0aW9ucyBvbmx5LCB0aGF0CiAgICAgICAgICBtaWdodCBiZSB1c2VmdWwgaWYgaWRsZSBsaW1pdHMgYXJlIGVuZm9yY2VkIGJ5IHRoZSBUZWxuZXQKICAgICAgICAgIHNlcnZlciBvciBpbiB0aGUgVENQL0lQIHByb3RvY29sOiBURUxORVQtTk9QIHNlbmRzIGEgIk5PCiAgICAgICAgICBPcGVyYXRpb24iIChkby1ub3RoaW5nKSBjb21tYW5kLCB3aGljaCBjYXVzZXMgbm8gcmVzcG9uc2UgZnJvbQogICAgICAgICAgdGhlIHNlcnZlcjsgVEVMTkVULUFZVCBzZW5kcyBhbiAiQXJlIFlvdSBUaGVyZSIgbWVzc2FnZSB0byB0aGUKICAgICAgICAgIHNlcnZlciwgd2hpY2ggc2hvdWxkIG1ha2UgdGhlIHNlcnZlciBzZW5kIGJhY2sgYSBtZXNzYWdlLgogICAgICAgICAgTmVpdGhlciBvZiB0aGVzZSBhY3Rpb25zIGludGVyZmVyZXMgd2l0aCB5b3VyIHJlbW90ZSBzZXNzaW9uLgoKICAgU0VUIFRFUk1JTkFMIElETEUtQUNUSU9OIGlzIHVzZWZ1bCBmb3IgY29ubmVjdGlvbnMgdG8gaG9zdHMgb3IKICAgc2VydmljZXMgdGhhdCBhdXRvbWF0aWNhbGx5IGxvZyB5b3Ugb3V0IGFmdGVyIGEgY2VydGFpbiBhbW91bnQgb2YgaWRsZQogICB0aW1lLCBlLmcuOgoKICBzZXQgdGVybSBpZGxlLXRpbWVvdXQgMzAwCiAgc2V0IHRlcm0gaWRsZS1hY3Rpb24gb3V0cHV0IFwzMgoKICAgc2VuZHMgYSBzcGFjZSAoYXMgaWYgeW91IGhhZCBwcmVzc2VkIHRoZSBzcGFjZSBiYXIpIGV2ZXJ5IDMwMCBzZWNvbmRzCiAgIChmaXZlIG1pbnV0ZXMpIHdoaWxlIHRoZXJlIGlzIG5vIGFjdGl2aXR5ICgzMiBpcyB0aGUgQVNDSUkgY29kZSBmb3IKICAgc3BhY2UpLgoKICAgV2hlbiBDLUtlcm1pdCByZXR1cm5zIGZyb20gQ09OTkVDVCB0byBjb21tYW5kIG1vZGUsIHRoZSByZWFzb24gZm9yIHRoZQogICB0cmFuc2l0aW9uIGlzIGdpdmVuIGluIGEgbmV3IHZhcmlhYmxlLCBcdihjeF9zdGF0dXMpOgoKICAgICAgMCAgTm8gQ09OTkVDVCBjb21tYW5kIGdpdmVuIHlldC4KICAgICAgMSAgVXNlciBlc2NhcGVkIGJhY2sgbWFudWFsbHkuCiAgICAgIDIgIEEgdHJpZ2dlciBzdHJpbmcgd2FzIGVuY291bnRlcmVkLgogICAgICAzICBJS1NEIGVudGVyZWQgc2VydmVyIG1vZGUuCiAgICAgIDQgIEFwcGxpY2F0aW9uIFByb2dyYW0gQ29tbWFuZCByZWNlaXZlZCBmcm9tIGhvc3QuCiAgICAgIDUgIElkbGUgdGltZW91dC4KICAgICAgNiAgVGVsbmV0IHByb3RvY29sIGVycm9yLgogICAgICA3ICBLZXlzdHJva2UgbWFjcm8uCiAgICAgIDggIFRpbWUgbGltaXQgZXhjZWVkZWQuCiAgICAxMDAgIEludGVybmFsIGVycm9yLgogICAgMTAxICBDYXJyaWVyIHJlcXVpcmVkIGJ5IG5vdCBkZXRlY3RlZC4KICAgIDEwMiAgSS9PIGVycm9yIG9uIGNvbm5lY3Rpb24uCiAgICAxMDMgIERpc2Nvbm5lY3RlZCBieSBob3N0LgogICAgMTA0ICBEaXNjb25uZWN0ZWQgYnkgdXNlci4KICAgIDEwNSAgU2Vzc2lvbiBsaW1pdCBleGNlZWRlZC4KICAgIDEwNiAgUmVqZWN0ZWQgZHVlIHRvIFRlbG5ldCBwb2xpY3kuCiAgICAxMDcgIFJlY2VpdmVkIGtpbGwgc2lnbmFsLgoKICAgVmFsdWVzIDEwMCBhbmQgYWJvdmUgaW5kaWNhdGUgdGhlcmUgaXMgbm8gY29ubmVjdGlvbi4KCiAgIFsgWzU1Ml1Ub3AgXSBbIFs1NTNdQ29udGVudHMgXSBbIFs1NTRdQy1LZXJtaXQgSG9tZSBdIFsgWzU1NV1LZXJtaXQKICAgSG9tZSBdCiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCjEzLiBDSEFSQUNURVIgU0VUUwoKICAgU2VlIHRoZSBzZWN0aW9uIG9uIFs1NTZdZmlsZSBzY2FubmluZyBhYm92ZSwgYW5kIHRoZSBzZWN0aW9uIG9uCiAgIGNoYXJhY3Rlci1zZXQgY29udmVyc2lvbiBpbiBbNTU3XUZUUC4gQWxzbzoKCiAgICAgKiBUcnVlIHN1cHBvcnQgZm9yIENQMTI1MiAocmF0aGVyIHRoYW4gdHJlYXRpbmcgaXQgYXMgTGF0aW4tMSkuCiAgICAgKiBQcm9wZXIgaGFuZGxpbmcgb2YgQzEgdmFsdWVzIHdoZW4gY29udmVydGluZyBJU08gOC1iaXQgdGV4dCB0bwogICAgICAgVVRGLTguCiAgICAgKiBUWVBFIC9DSEFSQUNURVItU0VUOiAvVFJBTlNMQVRFLVRPOiBhbGxvd3Mgc3BlY2lmaWMgdHJhbnNsYXRpb25zLgogICAgICogVGhlIFRSQU5TTEFURSBjb21tYW5kIG5vdyB3b3JrcyBvbiBtdWx0aXBsZSBmaWxlcy4KICAgICAqIEtfQ0hBUlNFVCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBzZXQgdGhlIGZpbGUgY2hhcmFjdGVyLXNldC4KICAgICAqIFNFVCBUUkFOU0ZFUiBUUkFOU0xBVElPTiBPRkYuCiAgICAgKiBGVFAgY2xpZW50IGNoYXJhY3Rlci1zZXQgdHJhbnNsYXRpb24gKFs1NThdU2VjdGlvbiAzLjcpLgoKICAgWyBbNTU5XVRvcCBdIFsgWzU2MF1Db250ZW50cyBdIFsgWzU2MV1DLUtlcm1pdCBIb21lIF0gWyBbNTYyXUtlcm1pdAogICBIb21lIF0KICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKMTQuIERJQUxPVVQgRlJPTSBURUxORVQgVEVSTUlOQUwgU0VSVkVSUwoKICAgRm9yIHllYXJzLCBDLUtlcm1pdCBoYXMgc3VwcG9ydGVkIGRpYWxpbmcgb3V0IGZyb20gVGVsbmV0IG1vZGVtCiAgIHNlcnZlcnMgKGFsc28gY2FsbGVkIHJldmVyc2UgdGVybWluYWwgc2VydmVycyBvciBhY2Nlc3Mgc2VydmVycyksIGJ1dAogICB1bnRpbCBub3cgdGhlcmUgd2FzIG5vIHdheSBmb3IgS2VybWl0IHRvIGNvbnRyb2wgdGhlIGNvbW11bmljYXRpb24KICAgcGFyYW1ldGVycyAoc3BlZWQsIHBhcml0eSwgZXRjKSBvbiB0aGUgc2VyaWFsIHBvcnQgb2YgdGhlIHRlcm1pbmFsCiAgIHNlcnZlcjsgaXQgaGFkIHRvIHVzZSB3aGF0ZXZlciB3YXMgdGhlcmUuCgogICBCdXQgbm93LCBpZiB5b3UgbWFrZSBhIGNvbm5lY3Rpb24gdG8gYSBzZXJ2ZXIgdGhhdCBzdXBwb3J0cyB0aGUgVGVsbmV0CiAgIENvbSBQb3J0IENvbnRyb2wgT3B0aW9uLCBbNTYzXVJGQyAyMjE3LCB5b3UgaGF2ZSB0aGUgc2FtZSBkZWdyZWUgb2YKICAgY29udHJvbCBhcyB5b3Ugd291bGQgaGF2ZSBvdmVyIGEgc2VyaWFsIHBvcnQgb24gdGhlIGNvbXB1dGVyIHdoZXJlCiAgIEtlcm1pdCBpcyBydW5uaW5nOiBTRVQgU1BFRUQsIFNFVCBGTE9XLCBTRVQgUEFSSVRZLCBTRVQgU1RPUC1CSVRTLAogICBTSE9XIENPTU0sIFdBSVQsIFNFVCBDQVJSSUVSLVdBVENILCB0aGUgbW9kZW0tc2lnbmFsIHZhcmlhYmxlcywKICAgc2VuZGluZyBCcmVhaywgYW5kIHNvIG9uLCBhcHBseSB0byB0aGUgY29ubmVjdGlvbiBiZXR3ZWVuIHRoZSB0ZXJtaW5hbAogICBzZXJ2ZXIgYW5kIHRoZSBtb2RlbS4KCiAgIEZvciBleGFtcGxlLCB1c2luZyBhIENpc2NvIEFjY2VzcyBTZXJ2ZXIgMjUwOSwgd2hlcmUgc3BlY2lmeWluZyBhIFRDUAogICBwb3J0IGluIHRoZSA2MDAwJ3Mgc2VsZWN0cyBhIHNlcmlhbCBwb3J0IHRoYXQgY2FuIGJlIHVzZWQgZm9yIGRpYWxpbmcKICAgb3V0OgoKICBzZXQgaG9zdCB4eHggNjAwMSAgICAgIDsgeHh4IGlzIHRoZSBJUCBob3N0bmFtZSBvciBhZGRyZXNzIG9mIHRoZSBzZXJ2ZXIKICAobG9nIGluIGlmIG5lY2Vzc2FyeSkgIDsgV2l0aCBhIHNjcmlwdCBvciBieSBoYW5kCiAgc2V0IG1vZGVtIHR5cGUgdXNyICAgICA7IFRlbGwgS2VybWl0IHdoYXQga2luZCBvZiBtb2RlbSBpdCBoYXMKICBzZXQgc3BlZWQgNTc2MDAgICAgICAgIDsgVGhpcyBhZmZlY3RzIHRoZSBzZXJ2ZXIncyBwb3J0CiAgc2V0IGZsb3cgcnRzL2N0cyAgICAgICA7IERpdHRvCiAgZGlhbCA3NjU0MzIxCgogICBUaGUgbW9kZW0gc2VydmVyIG1pZ2h0IG9yIG1pZ2h0IG5vdCByZXF1aXJlIGEgbG9naW4gc2VxdWVuY2UuIEl0IG1pZ2h0CiAgIGFsc28gYWxsb3cgZm9yIGF1dG9tYXRpYyBhdXRoZW50aWNhdGlvbiwgZS5nLiB2aWEgS2VyYmVyb3MgdGlja2V0cy4KICAgTk9URTogSWYgdGhlIG1vZGVtIHNlcnZlciByZXF1aXJlcyBhIGxvZ2luIHNlcXVlbmNlLCB0aGVuIFJFRElBTCBtaWdodAogICBub3Qgd29yayBhcyBleHBlY3RlZC4KCiAgIFdoZW4geW91IGhhdmUgYSBUZWxuZXQgQ29tIFBvcnQgY29ubmVjdGlvbiwgeW91ciBTRVQgU1BFRUQgYW5kIFNFVAogICBGTE9XIG9wdGlvbnMgY2hhbmdlIGF1dG9tYXRpY2FsbHkgdG8gcmVmbGVjdCB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZQogICBzZXJ2ZXIsIHJhdGhlciB0aGFuIHRob3NlIG9mIHlvdXIgbG9jYWwgY29tcHV0ZXIuCgogICBTZWUgdGhlIGNvbmZpZ3VyYXRpb24gbWFudWFsIGZvciB5b3VyIHNlcnZlciBmb3IgYWRkaXRpb25hbAogICBpbmZvcm1hdGlvbi4gRm9yIGV4YW1wbGUsIGhvdyB0byBzZXQgdXAgdGhlIHNlcnZlciB0byBkcm9wIHRoZSBUZWxuZXQKICAgY29ubmVjdGlvbiBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIHRlbGVwaG9uZSBjYWxsIGlzIGh1bmcgdXAgKGUuZy4KICAgImF1dG9oYW5ndXAiIG9uIENpc2NvIG1vZGVscykuCgogICBGb3IgYSBMaW51eC1iYXNlZCBUZWxuZXQgQ29tLVBvcnQgc2VydmVyLCBjbGljayB0aGUgU3JkaXJkIGxpbms6CgogICBbIFs1NjRdVG9wIF0gWyBbNTY1XUNvbnRlbnRzIF0gWyBbNTY2XVNyZWRpcmQgXSBbIFs1NjddQy1LZXJtaXQgSG9tZSBdCiAgIFsgWzU2OF1LZXJtaXQgSG9tZSBdCiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCjE1LiBDT1BJTkcgV0lUSCBCUk9LRU4gS0VSTUlUIFBBUlRORVJTCgogICBUaGVyZSBhcmUgbG90cyBvZiBmYXVsdHkgS2VybWl0IHByb3RvY29sIGltcGxlbWVudGF0aW9ucyBvdXQgdGhlcmUsCiAgIGZvdW5kIG1haW5seSBpbiAzcmQtcGFydHkgcHJvZHVjdHMgcmFuZ2luZyBmcm9tIGNvbW11bmljYXRpb25zCiAgIHNvZnR3YXJlIHBhY2thZ2VzIHRvIGZpbGUtdHJhbnNmZXIgZnVuY3Rpb25zIGltYmVkZGVkIHdpdGhpbiBkZXZpY2VzLgogICBUaGlzIHRvcGljIGlzIGNvdmVyZWQgWzU2OV1IRVJFIGZvciBDLUtlcm1pdCA3LjAsIGJ1dCBDLUtlcm1pdCA4LjAKICAgYWRkcyBzb21lIGFkZGl0aW9uYWwgdHJpY2tzLgoKICAgU0VUIEFUVFJJQlVURSBSRUNPUkQtRk9STUFUIHsgT04sIE9GRiB9CiAgICAgICAgICBBbGxvd3MgY29udHJvbCBvZiB0aGUgS2VybWl0J3MgUmVjb3JkLUZvcm1hdCBhdHRyaWJ1dGUuIFNldAogICAgICAgICAgdGhpcyB0byBPRkYgaW4gY2FzZSBpbmNvbWluZyBmaWxlIGFyZSByZWZ1c2VkIGR1ZSB0byB1bmtub3duIG9yCiAgICAgICAgICBpbnZhbGlkIHJlY29yZCBmb3JtYXRzIGlmIHlvdSB3YW50IHRvIGFjY2VwdCB0aGUgZmlsZSBhbnl3YXkuCgogICBTRVQgU0VORCBJLVBBQ0tFVFMgeyBPTiwgT0ZGIH0KICAgICAgICAgIEEgS2VybWl0IHNlcnZlciBpcyBzdXBwb3NlZCB0byBhY2NlcHQgSS1wYWNrZXRzOyB0aGlzIGlzIGhvdwogICAgICAgICAgdGhlIGNsaWVudCBsZXRzIHRoZSBzZXJ2ZXIga25vdyBpdHMgY2FwYWJpbGl0aWVzIGFuZAogICAgICAgICAgcHJlZmVyZW5jZXMgYmVmb3JlIHNlbmRpbmcgYSBjb21tYW5kLiBBcHBhcmVudGx5IHRoZXJlIGlzIGF0CiAgICAgICAgICBsZWFzdCBvbmUgS2VybWl0IHNlcnZlciBpbXBsZW1lbnRhdGlvbiB0aGF0IGRvZXMgbm90IGFjY2VwdAogICAgICAgICAgSS1wYWNrZXRzLCBhbmQgZG9lcyBub3QgcHJvcGVybHkgcmVzcG9uZCB3aXRoIGFuIEVycm9yIHBhY2tldAogICAgICAgICAgaWYgaXQgZ2V0cyBvbmUuIFRvIGdldCBhcm91bmQgc3VjaCBzaXR1YXRpb25zIGluIEMtS2VybWl0IDguMCwKICAgICAgICAgIHlvdSBjYW4gdXNlIFNFVCBTRU5EIEktUEFDS0VUUyBPRkYgdG8gaW5oaWJpdCB0aGUgc2VuZGluZyBvZiBJCiAgICAgICAgICBwYWNrZXRzLiBJbiB0aGlzIGNhc2UsIHRoZSBjbGllbnQgbXVzdCBiZSBhYmxlIHRvIGFkanVzdCB0byB0aGUKICAgICAgICAgIHNlcnZlcidzIGNvbmZpZ3VyYXRpb24sIHJhdGhlciB0aGFuIHRoZSBvdGhlciB3YXkgYXJvdW5kIGFzIHdlCiAgICAgICAgICBhcmUgdXNlZCB0by4KCiAgIFNFVCBQUk9UT0NPTCBLRVJNSVQge30ge30ge30KICAgICAgICAgIEMtS2VybWl0IDYuMCBhbmQgbGF0ZXIgYXV0b21hdGljYWxseSBzZW5kICJhdXRvdXBsb2FkIiBhbmQKICAgICAgICAgICJhdXRvZG93bmxvYWQiIGNvbW1hbmRzIHdoZW4gaW4gbG9jYWwgbW9kZSBhbmQgeW91IGdpdmUgYSBmaWxlCiAgICAgICAgICB0cmFuc2ZlciBjb21tYW5kLiBGb3IgZXhhbXBsZSwgaWYgeW91IHRlbGwga2VybWl0IHRvICJzZW5kCiAgICAgICAgICBvb2ZhLnR4dCIsIEtlcm1pdCBzZW5kcyAia2VybWl0IC1yIiBhbmQgYSBjYXJyaWFnZSByZXR1cm4sIGluCiAgICAgICAgICBjYXNlIHlvdSBoYWQgZm9yZ290dGVuIHRvIHN0YXJ0IEtlcm1pdCBvbiB0aGUgZmFyIGVuZCBhbmQgdG9sZAogICAgICAgICAgaXQgdG8gcmVjZWl2ZSBhIGZpbGUuIElmIGEgS2VybWl0IHByb2dyYW0gaGFkIGFscmVhZHkgYmVlbgogICAgICAgICAgc3RhcnRlZCBvbiB0aGUgZmFyIGVuZCwgaXQgc2hvdWxkIGhhcm1sZXNzbHkgYWJzb3JiIHRoaXMKICAgICAgICAgIHN0cmluZy4gSG93ZXZlciwgc29tZSBLZXJtaXQgcHJvZ3JhbXMgdmlvbGF0ZSB0aGUgS2VybWl0CiAgICAgICAgICBwcm90b2NvbCBkZWZpbml0aW9uIGFuZCB0cmVhdCBzdWNoIHN0cmluZ3MgYXMgS2VybWl0IHBhY2tldHMKICAgICAgICAgIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIG5vdC4gSW4gc3VjaCBjYXNlcywgZ2l2ZSB0aGlzIGNvbW1hbmQgdG8KICAgICAgICAgIHNldCB0aGUgS2VybWl0IHByb3RvY29sIGF1dG91cGxvYWQgYW5kIGRvd25sb2FkIHN0cmluZ3MgdG8KICAgICAgICAgIG5vdGhpbmcsIHdoaWNoIHRlbGxzIEtlcm1pdCBub3QgdG8gc2VuZCB0aGVtLiAoVGhpcyBpcyBub3QgYQogICAgICAgICAgbmV3IGZlYXR1cmUsIGJ1dCBpdCB3YXMgbm90IHByZXZpb3VzbHkgaW5jbHVkZWQgaW4gdGhlICJDb3BpbmciCiAgICAgICAgICBzZWN0aW9uIG9mIHRoZSBkb2N1bWVudGF0aW9uLikKCiAgIFsgWzU3MF1Ub3AgXSBbIFs1NzFdQ29udGVudHMgXSBbIFs1NzJdQy1LZXJtaXQgSG9tZSBdIFsgWzU3M11LZXJtaXQKICAgSG9tZSBdCiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCjE2LiBORVcgQ09NTUFORC1MSU5FIE9QVElPTlMKCiAgIGtlcm1pdCAtaCBOb3cgcHJpbnRzIGEgY29tcGxldGUgbGlzdGluZyBvZiBpdHMgY29tbWFuZC1saW5lIG9wdGlvbnMsCiAgIHJhdGhlciB0aGFuIGFuIGFiYnJldmlhdGVkIGxpc3Qgc3F1ZWV6ZWQgaW50byBhIDI0eDgwIHNwYWNlLgoKICAgLWRkICAgICAgICAgICAgICBEZWJ1ZywgbGlrZSAtZCBidXQgYWRkcyB0aW1lc3RhbXBzCiAgIC0tdmVyc2lvbiAgU2hvd3MgQy1LZXJtaXQgdmVyc2lvbiBudW1iZXIuCiAgIC0tbm9wZXJtcyAgRXF1aXZhbGVudCB0byBTRVQgQVRUUklCVVRFIFBST1RFQ1RJT04gT0ZGLgoKICAgS2VybWl0IG5vdyBhY2NlcHRzIGEgc2VsZWN0aW9uIG9mIFVSTHMgKFVuaXZlcnNhbCBSZXNvdXJjZSBMb2NhdG9ycykKICAgYXMgaXRzIGZpcnN0IGNvbW1hbmQtbGluZSBhcmd1bWVudC4gVGhlc2UgYXJlOgoKICAgdGVsbmV0Omhvc3RuYW1lCiAgICAgICAgICBNYWtlcyBhIFRlbG5ldCBjb25uZWN0aW9uIHRvIHRoZSBnaXZlbiBob3N0IChJUCBob3N0bmFtZSBvcgogICAgICAgICAgYWRkcmVzcykuCgogICBmdHA6Ly9bdXNlcls6cGFzc3dvcmRdQF1ob3N0bmFtZVsvcGF0aC4uLl0KICAgICAgICAgIE1ha2VzIGFuIEZUUCBjb25uZWN0aW9uIHRvIHRoZSBnaXZlbiBob3N0IChJUCBob3N0bmFtZSBvcgogICAgICAgICAgYWRkcmVzcykuIElmIGEgdXNlcm5hbWUgaXMgZ2l2ZW4sIEtlcm1pdCB0cmllcyB0byBsb2cgeW91IGluOwogICAgICAgICAgaWYgYSBwYXNzd29yZCBpcyBnaXZlbiwgaXQgaXMgdXNlZDsgaWYgbm90LCB5b3UgYXJlIHByb21wdGVkCiAgICAgICAgICBmb3Igb25lLiBJZiBubyB1c2VybmFtZSBpcyBnaXZlbiwgYW4gYW5vbnltb3VzIGxvZ2luIGlzCiAgICAgICAgICBwZXJmb3JtZWQuIElmIGEgcGF0aG5hbWUgaXMgaW5jbHVkZWQsIEtlcm1pdCB0cmllcyB0byBHRVQgdGhlCiAgICAgICAgICBnaXZlbiBmaWxlLiBTZWUgWzU3NF1TZWN0aW9uIDMuMS4zIGZvciBkZXRhaWxzLgoKICAgZnRwczovL1t1c2VyWzpwYXNzd29yZF1AXWhvc3RuYW1lWy9wYXRoLi4uXQogICAgICAgICAgTWFrZXMgYSBzZWN1cmUgRlRQIGNvbm5lY3Rpb24gb3ZlciBTU0wuCgogICB0ZWxuZXRzOi8vW3VzZXJbOnBhc3N3b3JkXUBdaG9zdG5hbWUKICAgICAgICAgIE1ha2VzIGEgc2VjdXJlIFRlbG5ldCBjb25uZWN0aW9uIG92ZXIgU1NMLgoKICAga2VybWl0Oi8vW3VzZXJbOnBhc3N3b3JkXUBdaG9zdG5hbWVbL3BhdGguLi5dCiAgICAgICAgICBNYWtlcyBhIGNvbm5lY3Rpb24gdG8gYW4gWzU3NV1JbnRlcm5ldCBLZXJtaXQgU2VydmVyLgoKICAgaHR0cDovL1t1c2VyWzpwYXNzd29yZF1AXWhvc3RuYW1lWy9wYXRoLi4uXQogICAgICAgICAgTWFrZXMgYSBjb25uZWN0aW9uIHRvIFdlYiBzZXJ2ZXIuCgogICBodHRwczovL1t1c2VyWzpwYXNzd29yZF1AXWhvc3RuYW1lWy9wYXRoLi4uXQogICAgICAgICAgTWFrZXMgYSBjb25uZWN0aW9uIHRvIHNlY3VyZSBXZWIgc2VydmVyLgoKICAgWyBbNTc2XVRvcCBdIFsgWzU3N11Db250ZW50cyBdIFsgWzU3OF1DLUtlcm1pdCBIb21lIF0gWyBbNTc5XUtlcm1pdAogICBIb21lIF0KICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKMTcuIExPR1MKCiAgIEluIEMtS2VybWl0IDguMCwgd2UgbWFrZSBhbiBlZmZvcnQgdG8ga2VlcCBwYXNzd29yZHMgb3V0IG9mIHRoZSBkZWJ1ZwogICBsb2cuIFRoaXMgY2FuIG5ldmVyIGJlIDEwMCUgZWZmZWN0aXZlLCBidXQgaXQncyBiZXR0ZXIgdGhhbiBiZWZvcmUsCiAgIHdoZW4gdGhlcmUgd2VyZSBubyBwcmVjYXV0aW9ucyBhdCBhbGwuIFdoZW5ldmVyIEtlcm1pdCBrbm93cyBpdCdzCiAgIHByb21wdGluZyBmb3IsIHBhcnNpbmcsIG9yIHRyYW5zbWl0dGluZyBhIHBhc3N3b3JkLCBpdCB0ZW1wb3JhcmlseQogICB0dXJucyBvZmYgbG9nZ2luZyBhbmQgdGhlbiB0dXJucyBpdCBiYWNrIG9uIGFmdGVyd2FyZHMuIFRoaXMga2VlcHMgdGhlCiAgIGRlYnVnIGxvZyBwYXNzd29yZC1mcmVlIGluIG1vc3QgY29tbW9uIGNhc2VzLCBidXQgdGhlcmUgY2FuIGJlIG5vCiAgIGd1YXJhbnRlZXMuCgogICBBcyBub3RlZCBlbHNld2hlcmUsIHRoZSBuZXcgIi1kZCIgY29tbWFuZC1saW5lIG9wdGlvbiBzZWxlY3RzIGEKICAgdGltZXN0YW1wZWQgZGVidWcgbG9nIChlcXVpdmFsZW50IHRvICJzZXQgZGVidWcgdGltZXN0YW1wcyBvbiIsICJsb2cKICAgZGVidWcgZGVidWcubG9nIikuCgogICBDLUtlcm1pdCA4LjAgYWxzbyBzdXBwb3J0cyBhIG5ldyB0aW1lc3RhbXBlZCBzZXNzaW9uIGxvZyB2aWEgInNldAogICBzZXNzaW9uLWxvZyB0aW1lc3RhbXBlZC10ZXh0IiwgImxvZyBzZXNzaW9uIi4KCiAgIFRoZXJlIGhhdmUgYmVlbiByZXF1ZXN0cyBmb3Igb3RoZXIga2luZHMgb2YgbG9ncywgZm9yIGV4YW1wbGUgYQogICBjb21tYW5kIGxvZy4gVGhlc2UgbWlnaHQgYmUgYWRkZWQgYXQgc29tZSBwb2ludC4gT25lIHBlcnNvbiB3YW50ZWQgdG8KICAgYmUgYWJsZSB0byBsb2cgY29tbWFuZHMgd2l0aCB0aW1lc3RhbXBzLCBidXQgb25seSBjb21tYW5kcyBpc3N1ZWQgYXQKICAgdGhlIHByb21wdCwgbm90IGNvbW1hbmRzIGZyb20gZmlsZXMgb3IgbWFjcm9zLCBhbmQgYWxzbyB3YW50ZWQgYQogICBoZWFkZXIgbGluZSBhdCB0aGUgYmVnaW5uaW5nIHNob3dpbmcgdGhlIGRhdGUsIHVzZXIsIGFuZCBob3N0LiBUaGlzCiAgIGNhbiBiZSBkb25lIGFzIGZvbGxvd3M6CgogIC5maWxlbmFtZSA6PSBcdihob21lKWNvbW1hbmRzLmxvZyAgOyAoZm9yIGV4YW1wbGUpCiAgZm9wZW4gL3dyaXRlIFwlYyBcbShmaWxlbmFtZSkKICBpZiBzdWNjZXNzIHsKICAgICAgZndyaXRlIC9saW5lIFwlYyBcdihkYXRlKTogVXNlcj1cdih1c2VyKSBIb3N0PVx2KGhvc3QpCiAgICAgIGZjbG9zZSBcJWMKICAgICAgc2V0IGRlYnVnIHRpbWVzdGFtcHMgb24KICAgICAgbG9nIGRlYnVnIHt8IGdyZXAgIkNNRChQKSIgPj4gXG0oZmlsZW5hbWUpfSBhcHBlbmQKICB9CgogICBbIFs1ODBdVG9wIF0gWyBbNTgxXUNvbnRlbnRzIF0gWyBbNTgyXUMtS2VybWl0IEhvbWUgXSBbIFs1ODNdS2VybWl0CiAgIEhvbWUgXQogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICBDLUtlcm1pdCA4LjAgVXBkYXRlIE5vdGVzIC8gWzU4NF1UaGUgS2VybWl0IFByb2plY3QgLyBDb2x1bWJpYQogICBVbml2ZXJzaXR5IC8gMTUgRGVjIDIwMDMKClJlZmVyZW5jZXMKCiAgIDEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNjb250ZW50cwogICAyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCiAgIDMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCiAgIDQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbAogICA1LiBtYWlsdG86a2VybWl0LXN1cHBvcnRAY29sdW1iaWEuZWR1CiAgIDYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC8KICAgNy4gaHR0cDovL3d3dy5rZXJtaXQtcHJvamVjdC5vcmcvCiAgIDguIGh0dHA6Ly93d3cuY29sdW1iaWEubnljLm55LnVzL2tlcm1pdC8KICAgOS4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvZi9DT1BZSU5HLlRYVAogIDEwLiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9mL2NrY21haS5jCiAgMTEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4dgogIDEyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2s2MG1hbnVhbC5odG1sCiAgMTMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWk3MC5odG1sCiAgMTQuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2YvY2tlcm1pdDcwLnR4dAogIDE1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbAogIDE2LiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9mL2NrdWtlci5ucgogIDE3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvc2VjdXJpdHkuaHRtCiAgMTguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC90ZWxuZXQuaHRtCiAgMTkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9mdHBzY3JpcHRzLmh0bWwKICAyMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2J3ci5odG1sCiAgMjEuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2YvY2tjYndyLnR4dAogIDIyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwKICAyMy4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvZi9ja3Vid3IudHh0CiAgMjQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Zid3IuaHRtbAogIDI1LiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9mL2NrdmJ3ci50eHQKICAyNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sCiAgMjcuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2YvY2t1aW5zLnR4dAogIDI4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t2aW5zLmh0bWwKICAyOS4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvZi9ja3ZpbnMudHh0CiAgMzAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NjZmcuaHRtbAogIDMxLiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9mL2NrY2NmZy50eHQKICAzMi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY3BsbS5odG1sCiAgMzMuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2YvY2tjcGxtLnR4dAogIDM0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaWtzZC5odG1sCiAgMzUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9za2VybWl0Lmh0bWwKICAzNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3RvcAogIDM3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCiAgMzguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCiAgMzkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4MAogIDQwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDEKICA0MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gyCiAgNDIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4Mi4xCiAgNDMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4Mi4yCiAgNDQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4Mi4yLjEKICA0NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gyLjIuMgogIDQ2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDIuMi4zCiAgNDcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4Mi4yLjQKICA0OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gyLjIuNQogIDQ5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDIuMi42CiAgNTAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4MwogIDUxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuMQogIDUyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuMS4xCiAgNTMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My4xLjIKICA1NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjEuMwogIDU1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuMS40CiAgNTYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My4yCiAgNTcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My4zCiAgNTguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My40CiAgNTkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My41CiAgNjAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My41LjEKICA2MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjUuMgogIDYyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuNS4zCiAgNjMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My42CiAgNjQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My42LjEKICA2NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjYuMgogIDY2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuNi4zCiAgNjcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My43CiAgNjguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My43LjEKICA2OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjcuMgogIDcwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuOAogIDcxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuOQogIDcyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuMTAKICA3My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjEwLjEKICA3NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjEwLjIKICA3NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjEwLjMKICA3Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjExCiAgNzcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4NAogIDc4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDUKICA3OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g2CiAgODAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4Ni4xCiAgODEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4Ni4yCiAgODIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4Ni4zCiAgODMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4Ni40CiAgODQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4Ni41CiAgODUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4Ni42CiAgODYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4NwogIDg3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDgKICA4OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g4LjEKICA4OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g4LjIKICA5MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g4LjMKICA5MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g4LjQKICA5Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g4LjUKICA5My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g4LjYKICA5NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g4LjcKICA5NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g4LjgKICA5Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g4LjkKICA5Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g4LjEwCiAgOTguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OC4xMQogIDk5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDguMTIKIDEwMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g4LjEzCiAxMDEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OC4xNAogMTAyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDkKIDEwMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g5LjEKIDEwNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g5LjIKIDEwNS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g5LjMKIDEwNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g5LjQKIDEwNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g5LjUKIDEwOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g5LjYKIDEwOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g5LjcKIDExMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g5LjgKIDExMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g5LjkKIDExMi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g5LjEwCiAxMTMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OS4xMQogMTE0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDEwCiAxMTUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4MTEKIDExNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gxMgogMTE3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDEzCiAxMTguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4MTQKIDExOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gxNQogMTIwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDE2CiAxMjEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4MTcKIDEyMi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3RvcAogMTIzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCiAxMjQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCiAxMjUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4NQogMTI2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwKIDEyNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g1CiAxMjguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4Mi4yCiAxMjkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNjb250ZW50cwogMTMwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDE1CiAxMzEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My43CiAxMzIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNmdHBkYXRlcwogMTMzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjZnRwY2hlY2sKIDEzNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2Z0cG5hbWVsaXN0CiAxMzUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNzcnZyZW5hbWUKIDEzNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2Z0cHZkaXIKIDEzNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3NldGZ0cHR5cGUKIDEzOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjYKIDEzOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gxNQogMTQwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDguNwogMTQxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDIuMQogMTQyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDIuMgogMTQzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDguMTQKIDE0NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g4LjEzCiAxNDUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OC4xMwogMTQ2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbAogMTQ3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwKIDE0OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L3NrZXJtaXQuaHRtbAogMTQ5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjc2V0bG9jdXMKIDE1MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2xjb21tYW5kcwogMTUxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjZnRwdXNlcgogMTUyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjc2hvd3ZhcgogMTUzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjY2FsbGVyaWQKIDE1NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g2LjYKIDE1NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gwCiAxNTYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My4xMQogMTU3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjdG9wCiAxNTguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNjb250ZW50cwogMTU5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCiAxNjAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCiAxNjEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4MAogMTYyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjdG9wCiAxNjMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNjb250ZW50cwogMTY0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCiAxNjUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCiAxNjYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9rOTUuaHRtbAogMTY3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvc3NoY2xpZW50Lmh0bWwKIDE2OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L3NrZXJtaXQuaHRtbAogMTY5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvc2tlcm1pdC5odG1sCiAxNzAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9zc2hjbGllbi5odG0KIDE3MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzCiAxNzIuIGZ0cDovL2Z0cC5pc2kuZWR1L2luLW5vdGVzL3JmYzE3MzgudHh0CiAxNzMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4Mi4yLjIKIDE3NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gyLjIuMQogMTc1LiBmdHA6Ly9mdHAuaXNpLmVkdS9pbi1ub3Rlcy9yZmMyMzk2LnR4dAogMTc2LiBmdHA6Ly9mdHAuaXNpLmVkdS9pbi1ub3Rlcy9yZmMyNjE2LnR4dAogMTc3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDIuMi4zCiAxNzguIGZ0cDovL2Z0cC5pc2kuZWR1L2luLW5vdGVzL3JmYzI2MTYudHh0CiAxNzkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OC4xMy43CiAxODAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9zZWN1cml0eS5odG0jeDUuNAogMTgxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvc2VjdXJpdHkuaHRtI3gxNQogMTgyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvc2VjdXJpdHkuaHRtI3g2LjIKIDE4My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L3NlY3VyaXR5Lmh0bWwKIDE4NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gxNgogMTg1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjdG9wCiAxODYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNjb250ZW50cwogMTg3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCiAxODguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCiAxODkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My4xCiAxOTAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My4yCiAxOTEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My4zCiAxOTIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My40CiAxOTMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My41CiAxOTQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My42CiAxOTUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My43CiAxOTYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My44CiAxOTcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My45CiAxOTguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My4xMAogMTk5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuMTEKIDIwMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L3NlY3VyaXR5Lmh0bQogMjAxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvc2VjdXJpdHkuaHRtI3NlcnZlcnMKIDIwMi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY3NldHMuaHRtbAogMjAzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvdW5pY29kZS5odG1sCiAyMDQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWk3MC5odG0jeDEuNS40CiAyMDUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9jYXNlMTAuaHRtbAogMjA2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDQKIDIwNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjExCiAyMDguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9mdHBzY3JpcHRzLmh0bWwKIDIwOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3RvcAogMjEwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjZnRwCiAyMTEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9mdHBjbGllbnQuaHRtbAogMjEyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvZnRwc2NyaXB0cy5odG1sCiAyMTMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKIDIxNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKIDIxNS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjEuMQogMjE2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuMS4zCiAyMTcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My4xLjQKIDIxOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjEuMwogMjE5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuMS4zCiAyMjAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My4yCiAyMjEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My41CiAyMjIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My42CiAyMjMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9mdHBzY3JpcHRzLmh0bWwKIDIyNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrYjIuaHRtCiAyMjUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNmdHBhdXRvbG9nCiAyMjYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNmdHB1c2VyCiAyMjcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My44CiAyMjguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My44CiAyMjkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN0b3AKIDIzMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2Z0cAogMjMxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCiAyMzIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCiAyMzMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pYm1faWUuaHRtbAogMjM0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuMTAKIDIzNS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3RvcAogMjM2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjZnRwCiAyMzcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKIDIzOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKIDIzOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrNjBtYW51YWwuaHRtbAogMjQwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMTcKIDI0MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sCiAyNDIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My42CiAyNDMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My4xMQogMjQ0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuMS40CiAyNDUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9zZWN1cml0eS5odG1sCiAyNDYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My43CiAyNDcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My43CiAyNDguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OC4xMy40CiAyNDkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNwZXJtc3dpdGNoCiAyNTAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNmdHBjaG1vZAogMjUxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuNi4yCiAyNTIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4NAogMjUzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjdG9wCiAyNTQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNmdHAKIDI1NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAogMjU2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAogMjU3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDcKIDI1OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjgKIDI1OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjgKIDI2MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrYjIuaHRtCiAyNjEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My4xMAogMjYyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuMTAKIDI2My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjYKIDI2NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3NldGZ0cHR5cGUKIDI2NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3RvcAogMjY2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjZnRwCiAyNjcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKIDI2OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKIDI2OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjkKIDI3MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjUuMQogMjcxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjZXJyb3JhY3Rpb24KIDI3Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjUKIDI3My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjcKIDI3NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjYKIDI3NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g4LjEzCiAyNzYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWk3MC5odG0jeDEuNS40CiAyNzcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWk3MC5odG0KIDI3OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g0CiAyNzkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My43CiAyODAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My41LjIKIDI4MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjcKIDI4Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2Vycm9yYWN0aW9uCiAyODMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My41LjIKIDI4NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2Vycm9yYWN0aW9uCiAyODUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNmdHBmaWxlbmFtZXMKIDI4Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2Z0cHBlcm1zCiAyODcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNmdHB1bmlxdWUKIDI4OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2Z0cGZpbGVuYW1lcwogMjg5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjbm90ZV91dGMKIDI5MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI25vdGVfZGF0ZQogMjkxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuNgogMjkyLiBodHRwOi8vd3d3LmJvdWxkZXIubmlzdC5nb3YvdGltZWZyZXEvZmFxL2ZhcS5odG0jMTA6CiAyOTMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My43CiAyOTQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN0b3AKIDI5NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2Z0cAogMjk2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCiAyOTcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCiAyOTguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My4xMQogMjk5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pNzAuaHRtI3g0LjMKIDMwMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sCiAzMDEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4NQogMzAyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuNi4zCiAzMDMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNmdHBmaWxlbmFtZXMKIDMwNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaTcwLmh0bSN4NC4xCiAzMDUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWk3MC5odG0jeDQuMi4yCiAzMDYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWk3MC5odG0jeDEuNS40CiAzMDcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My42LjIKIDMwOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjExCiAzMDkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My4xMQogMzEwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjc3J2cmVuYW1lCiAzMTEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWk3MC5odG0jeDQuMQogMzEyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pNzAuaHRtCiAzMTMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2IyLmh0bQogMzE0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjZnRwZmlsZW5hbWVzCiAzMTUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My41LjMKIDMxNi4gaHR0cDovL3d3dy5wcm9mdHBkLm5ldC8KIDMxNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3RvcAogMzE4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjZnRwCiAzMTkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKIDMyMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKIDMyMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrYjIuaHRtCiAzMjIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NzZXRzLmh0bWwKIDMyMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L3VuaWNvZGUuaHRtbAogMzI0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjc2V0cy5odG1sCiAzMjUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NzZXRzLmh0bWwKIDMyNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g0CiAzMjcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC91dGY4Lmh0bWwKIDMyOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY3NldHMuaHRtbAogMzI5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDQKIDMzMC4gZnRwOi8vZnRwLmlzaS5lZHUvaW4tbm90ZXMvcmZjMjY0MC50eHQKIDMzMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3RvcAogMzMyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjZnRwCiAzMzMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKIDMzNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKIDMzNS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3RvcAogMzM2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjZnRwCiAzMzcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKIDMzOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKIDMzOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3RvcAogMzQwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjZnRwCiAzNDEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKIDM0Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKIDM0My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2Z0cHNjcmlwdHMuaHRtbAogMzQ0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuMgogMzQ1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuMgogMzQ2LiBmdHA6Ly9mdHAuaXNpLmVkdS9pbi1ub3Rlcy9yZmM5NTkudHh0CiAzNDcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3NjcmlwdHMuaHRtbAogMzQ4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjdG9wCiAzNDkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNmdHAKIDM1MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2Z0cHNjcmlwdC5odG1sCiAzNTEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKIDM1Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKIDM1My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjExLjEKIDM1NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjExLjIKIDM1NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjExLjMKIDM1Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjExLjQKIDM1Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjExLjUKIDM1OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAogMzU5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvazk1Lmh0bWwKIDM2MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjExLjUKIDM2MS4gZnRwOi8vZnRwLmlzaS5lZHUvaW4tbm90ZXMvcmZjOTU5LnR4dAogMzYyLiBmdHA6Ly9mdHAuaXNpLmVkdS9pbi1ub3Rlcy9yZmMyMzg5LnR4dAogMzYzLiBodHRwOi8vd3d3LmlldGYub3JnL2ludGVybmV0LWRyYWZ0cy9kcmFmdC1pZXRmLWZ0cGV4dC1tbHN0LTE2LnR4dAogMzY0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvZnRwY2xpZW50Lmh0bWwKIDM2NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3RvcAogMzY2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjZnRwCiAzNjcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKIDM2OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKIDM2OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzCiAzNzAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN1Y3MyCiAzNzEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN0b3AKIDM3Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2NvbnRlbnRzCiAzNzMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKIDM3NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKIDM3NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3RvcAogMzc2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjY29udGVudHMKIDM3Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAogMzc4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAogMzc5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tiMi5odG0KIDM4MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3RvcAogMzgxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjY29udGVudHMKIDM4Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAogMzgzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAogMzg0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDQKIDM4NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g0CiAzODYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OC4xMgogMzg3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDguMQogMzg4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDEyCiAzODkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OC4xMgogMzkwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjdG9wCiAzOTEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNjb250ZW50cwogMzkyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCiAzOTMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCiAzOTQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OC4xNAogMzk1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjdG9wCiAzOTYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNjb250ZW50cwogMzk3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCiAzOTguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCiAzOTkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OQogNDAwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjdG9wCiA0MDEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNjb250ZW50cwogNDAyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCiA0MDMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCiA0MDQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OC42CiA0MDUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN0b3AKIDQwNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2NvbnRlbnRzCiA0MDcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKIDQwOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKIDQwOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3RvcAogNDEwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjY29udGVudHMKIDQxMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAogNDEyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAogNDEzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjdG9wCiA0MTQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNjb250ZW50cwogNDE1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCiA0MTYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCiA0MTcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNmam9pbgogNDE4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjZnNwbGl0CiA0MTkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OC4xMAogNDIwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjdG9wCiA0MjEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNjb250ZW50cwogNDIyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCiA0MjMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCiA0MjQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OQogNDI1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDkKIDQyNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g5CiA0MjcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4MwogNDI4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMKIDQyOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjIKIDQzMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjIKIDQzMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjgKIDQzMi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzCiA0MzMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4MwogNDM0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMKIDQzNS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjIKIDQzNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzCiA0MzcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OC4xMwogNDM4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDguMTMKIDQzOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g5CiA0NDAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OC4xMAogNDQxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDguNy40CiA0NDIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN0b3AKIDQ0My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2NvbnRlbnRzCiA0NDQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKIDQ0NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKIDQ0Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3RvcAogNDQ3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjY29udGVudHMKIDQ0OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAogNDQ5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAogNDUwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjdG9wCiA0NTEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNjb250ZW50cwogNDUyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCiA0NTMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCiA0NTQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OC43CiA0NTUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN0b3AKIDQ1Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2NvbnRlbnRzCiA0NTcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKIDQ1OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKIDQ1OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3NjcmlwdGVkaXQKIDQ2MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3RvcAogNDYxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjY29udGVudHMKIDQ2Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAogNDYzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAogNDY0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjdG9wCiA0NjUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNjb250ZW50cwogNDY2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCiA0NjcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCiA0NjguIGZ0cDovL2Z0cC5pc2kuZWR1L2luLW5vdGVzL3JmYzI4MjIudHh0CiA0NjkuIGZ0cDovL2Z0cC5pc2kuZWR1L2luLW5vdGVzL3JmYzI4MjIudHh0CiA0NzAuIGZ0cDovL2Z0cC5pc2kuZWR1L2luLW5vdGVzL3JmYzI4MjIudHh0CiA0NzEuIGZ0cDovL2Z0cC5pc2kuZWR1L2luLW5vdGVzL3JmYzI4MjIudHh0CiA0NzIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN0b3AKIDQ3My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2NvbnRlbnRzCiA0NzQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKIDQ3NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKIDQ3Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g4LjEKIDQ3Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3RvcAogNDc4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjY29udGVudHMKIDQ3OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAogNDgwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAogNDgxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDguMgogNDgyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjdG9wCiA0ODMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNjb250ZW50cwogNDg0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCiA0ODUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCiA0ODYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OS44CiA0ODcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OS44CiA0ODguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OC4yCiA0ODkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN0b3AKIDQ5MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2NvbnRlbnRzCiA0OTEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKIDQ5Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKIDQ5My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3RvcAogNDk0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjY29udGVudHMKIDQ5NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAogNDk2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAogNDk3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDkuOAogNDk4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjdG9wCiA0OTkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNjb250ZW50cwogNTAwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCiA1MDEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCiA1MDIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OS44CiA1MDMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OS44CiA1MDQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OS42CiA1MDUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN0b3AKIDUwNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2NvbnRlbnRzCiA1MDcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKIDUwOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKIDUwOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g5LjgKIDUxMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g5LjgKIDUxMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3RvcAogNTEyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjY29udGVudHMKIDUxMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAogNTE0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAogNTE1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjdG9wCiA1MTYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNjb250ZW50cwogNTE3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCiA1MTguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCiA1MTkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN0b3AKIDUyMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2NvbnRlbnRzCiA1MjEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKIDUyMi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKIDUyMy4gbWFpbHRvOnRodWNkYXRAaG90bWFpbC5jb20KIDUyNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g5LjkuMgogNTI1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjdG9wCiA1MjYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNjb250ZW50cwogNTI3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCiA1MjguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCiA1MjkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN0b3AKIDUzMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2NvbnRlbnRzCiA1MzEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKIDUzMi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKIDUzMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3RvcAogNTM0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjY29udGVudHMKIDUzNS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAogNTM2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAogNTM3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDkuMgogNTM4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjdG9wCiA1MzkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNjb250ZW50cwogNTQwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCiA1NDEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCiA1NDIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4NAogNTQzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDQKIDU0NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3RvcAogNTQ1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjY29udGVudHMKIDU0Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAogNTQ3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAogNTQ4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjdG9wCiA1NDkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNjb250ZW50cwogNTUwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCiA1NTEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCiA1NTIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN0b3AKIDU1My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2NvbnRlbnRzCiA1NTQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKIDU1NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKIDU1Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g0CiA1NTcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My43CiA1NTguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My43CiA1NTkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN0b3AKIDU2MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2NvbnRlbnRzCiA1NjEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKIDU2Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKIDU2My4gZnRwOi8vZnRwLmlzaS5lZHUvaW4tbm90ZXMvcmZjMjIxNy50eHQKIDU2NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3RvcAogNTY1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjY29udGVudHMKIDU2Ni4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvc3JlZGlyZC8KIDU2Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAogNTY4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAogNTY5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pNzAuaHRtI3g0LjIyCiA1NzAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN0b3AKIDU3MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2NvbnRlbnRzCiA1NzIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKIDU3My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKIDU3NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjEuMwogNTc1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY3Vpa3NkLmh0bWwKIDU3Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3RvcAogNTc3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjY29udGVudHMKIDU3OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAogNTc5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAogNTgwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjdG9wCiA1ODEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNjb250ZW50cwogNTgyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCiA1ODMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCiA1ODQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCg==