LyoKICogQ29weXJpZ2h0IDIwMDYgQW5kcmFzIEtvdmFjcwogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgpMQU5HVUFHRSBMQU5HX0hVTkdBUklBTiwgU1VCTEFOR19ERUZBVUxUCgpJRE1fTUFJTk1FTlUgTUVOVSBESVNDQVJEQUJMRQpCRUdJTgogICAgUE9QVVAgIiZG4WpsIgogICAgQkVHSU4KICAgICAgICBNRU5VSVRFTSAiJtpqLi4uXHRDdHJsK04iLCAgICAgICAgICAgSURfRklMRV9ORVcKICAgICAgICBNRU5VSVRFTSAiJk1lZ255aXThcy4uLlx0Q3RybCtPIiwgSURfRklMRV9PUEVOCiAgICAgICAgTUVOVUlURU0gIk0mZW506XNcdEN0cmwrUyIsICAgICAgIElEX0ZJTEVfU0FWRQogICAgICAgIE1FTlVJVEVNICJNZW506XMgbeEmc2vpbnQuLi4iLCAgICAgICAgSURfRklMRV9TQVZFQVMKICAgICAgICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgICAgICBNRU5VSVRFTSAiJlByaW50Li4uXHRDdHJsK1AiLCAgSURfUFJJTlQKICAgICAgICBNRU5VSVRFTSAiUHJpbnQgcHJldmllJncuLi4iLCAgSURfUFJFVklFVwogICAgICAgIE1FTlVJVEVNICJQYWdlIHNldHVwLi4uIiwgICAgICBJRF9QUklOVFNFVFVQCiAgICAgICAgTUVOVUlURU0gU0VQQVJBVE9SCiAgICAgICAgTUVOVUlURU0gIiZLaWzpcOlzIiwgICAgICBJRF9GSUxFX0VYSVQKICAgIEVORAogICAgUE9QVVAgIlN6JmVya2VzenTpcyIKICAgIEJFR0lOCiAgICAgICAgTUVOVUlURU0gIiZWaXNzemF2b27hc1x0Q3RybCtaIiwgICAgICAgIElEX0VESVRfVU5ETwogICAgICAgIE1FTlVJVEVNICImRWz1cmVcdEN0cmwrWSIsICAgICAgICAgICAgICBJRF9FRElUX1JFRE8KICAgICAgICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgICAgICBNRU5VSVRFTSAiS2l2JuFn4XNcdEN0cmwrWCIsICAgICAgICAgICAgSURfRURJVF9DVVQKICAgICAgICBNRU5VSVRFTSAiTeEmc29s4XNcdEN0cmwrQyIsICAgICAgICAgICAgSURfRURJVF9DT1BZCiAgICAgICAgTUVOVUlURU0gIiZCZWlsbGVzenTpc1x0Q3RybCtWIiwgICAgICAgIElEX0VESVRfUEFTVEUKICAgICAgICBNRU5VSVRFTSAiVPZyJmzpc1x0RGVsIiwgICAgICAgICAgICAgICAgSURfRURJVF9DTEVBUgogICAgICAgIE1FTlVJVEVNICJNJmluZGV0IGtpamVs9mxpXHRDdHJsK0EiLCAgICBJRF9FRElUX1NFTEVDVEFMTAogICAgICAgIE1FTlVJVEVNIFNFUEFSQVRPUgogICAgICAgIE1FTlVJVEVNICImRmluZC4uLlx0Q3J0bCtGIiwgICAgICAgICBJRF9GSU5ECiAgICAgICAgTUVOVUlURU0gIkZpbmQgJm5leHRcdEYzIiwgICAgICAgICAgICAgIElEX0ZJTkRfTkVYVAogICAgICAgIE1FTlVJVEVNICImUmVwbGFjZS4uLlx0Q3RybCtIIiwgICAgICBJRF9SRVBMQUNFCiAgICAgICAgTUVOVUlURU0gU0VQQVJBVE9SCiAgICAgICAgTUVOVUlURU0gIkNzYWsgJm9sdmFzaGF08yIsICAgICAgICAgICAgIElEX0VESVRfUkVBRE9OTFkKICAgICAgICBNRU5VSVRFTSAiTfMmZG9z7XR2YSIsICAgICAgICAgICAgICAgICAgSURfRURJVF9NT0RJRklFRAogICAgICAgIE1FTlVJVEVNIFNFUEFSQVRPUgogICAgICAgIFBPUFVQICImRXh0cuFrIgogICAgICAgIEJFR0lOCiAgICAgICAgICAgIE1FTlVJVEVNICJLaWplbPZs6XMgJmluZm9ybeFjafMiLCAgICAgICBJRF9FRElUX1NFTEVDVElPTklORk8KICAgICAgICAgICAgTUVOVUlURU0gIkthcmFrdGVyJmZvcm3hdHVtIiwgICAgICAgICAgIElEX0VESVRfQ0hBUkZPUk1BVAogICAgICAgICAgICBNRU5VSVRFTSAiQSZsYXBydGVsbWV6ZXR0IGthcmFrdGVyIGZvcm3hdHVtIiwgICAgICAgICAgIElEX0VESVRfREVGQ0hBUkZPUk1BVAogICAgICAgICAgICBNRU5VSVRFTSAiJkJla2V6ZOlzIGZvcm3hdHVtIiwgICAgICAgICAgSURfRURJVF9QQVJBRk9STUFUCiAgICAgICAgICAgIE1FTlVJVEVNICJTeib2dmVnc3plcnrpcyIsICAgICAgICAgICAgICBJRF9FRElUX0dFVFRFWFQKICAgICAgICBFTkQKICAgIEVORAogICAgUE9QVVAgIiZWaWV3IgogICAgQkVHSU4KICAgICAgICBNRU5VSVRFTSAiJlRvb2xiYXIiLCAgICAgICAgSURfVE9HR0xFX1RPT0xCQVIKICAgICAgICBNRU5VSVRFTSAiJkZvcm1hdGJhciIsICAgICAgSURfVE9HR0xFX0ZPUk1BVEJBUgogICAgICAgIE1FTlVJVEVNICImUnVsZXIiLCAgICAgICAgICBJRF9UT0dHTEVfUlVMRVIKICAgICAgICBNRU5VSVRFTSAiJlN0YXR1c2JhciIsICAgICAgSURfVE9HR0xFX1NUQVRVU0JBUgogICAgICAgIE1FTlVJVEVNIFNFUEFSQVRPUgogICAgICAgIE1FTlVJVEVNICImT3B0aW9ucy4uLiIsICBJRF9WSUVXUFJPUEVSVElFUwogICAgRU5ECiAgICBQT1BVUCAiJkluc2VydCIKICAgIEJFR0lOCiAgICAgICAgTUVOVUlURU0gIiZEYXRlIGFuZCB0aW1lLi4uIiwgIElEX0RBVEVUSU1FCiAgICBFTkQKICAgIFBPUFVQICJGJm9ybeF0dW0iCiAgICBCRUdJTgogICAgICAgIE1FTlVJVEVNICImRm9udC4uLiIsICAgICAgICAgICAgICAgICAgSURfRk9OVFNFVFRJTkdTCiAgICAgICAgTUVOVUlURU0gIiZCdWxsZXQgcG9pbnRzIiAgICAgICAgICAgICAgICBJRF9CVUxMRVQKICAgICAgICBNRU5VSVRFTSAiJlBhcmFncmFwaC4uLiIgICAgICAgICAgICAgIElEX1BBUkFGT1JNQVQKICAgICAgICBNRU5VSVRFTSAiJlRhYnMuLi4iICAgICAgICAgICAgICAgICAgIElEX1RBQlNUT1BTCiAgICAgICAgUE9QVVAgIiZI4XR06XIiCiAgICAgICAgQkVHSU4KICAgICAgICAgICAgTUVOVUlURU0gIiZSZW5kc3plclx0Q3RybCsxIiwgICAgICAgICBJRF9CQUNLXzEKICAgICAgICAgICAgTUVOVUlURU0gIiZT4XJn4WJhbiBr6XJlbVx0Q3RybCsyIiwgIElEX0JBQ0tfMgogICAgICAgIEVORAogICAgRU5ECiAgICBQT1BVUCAiJkhlbHAiCiAgICBCRUdJTgogICAgICAgIE1FTlVJVEVNICImQWJvdXQgV2luZSBXb3JkcGFkIiAgICAgICBJRF9BQk9VVAogICAgRU5ECkVORAoKSURNX1BPUFVQIE1FTlUgRElTQ0FSREFCTEUKQkVHSU4KICAgIFBPUFVQICIiCiAgICBCRUdJTgogICAgICAgIE1FTlVJVEVNICJLaXYm4Wfhc1x0Q3RybCtYIiwgICAgIElEX0VESVRfQ1VUCiAgICAgICAgTUVOVUlURU0gIk3hJnNvbOFzXHRDdHJsK0MiLCAgICAgSURfRURJVF9DT1BZCiAgICAgICAgTUVOVUlURU0gIiZCZWlsbGVzenTpc1x0Q3RybCtWIiwgSURfRURJVF9QQVNURQogICAgICAgIE1FTlVJVEVNIFNFUEFSQVRPUgogICAgICAgIE1FTlVJVEVNICImQnVsbGV0IHBvaW50cyIgICAgICAgIElEX0JVTExFVAogICAgICAgIE1FTlVJVEVNICImUGFyYWdyYXBoLi4uIiAgICAgIElEX1BBUkFGT1JNQVQKICAgIEVORApFTkQKCklERF9EQVRFVElNRSBESUFMT0cgRElTQ0FSREFCTEUgMzAsIDIwLCAxMzAsIDgwClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICJEYXRlIGFuZCB0aW1lIgpGT05UIDEwLCAiTVMgU2FucyBTZXJpZiIKQkVHSU4KICAgIExURVhUICAgICAgICAiQXZhaWxhYmxlIGZvcm1hdHMiLDAsMywyLDEwMCwxNQogICAgTElTVEJPWCAgICAgIElEQ19EQVRFVElNRSwzLDEyLDgwLDY1LExCU19OT0lOVEVHUkFMSEVJR0hUIHwgTEJTX05PVElGWQogICAgUFVTSEJVVFRPTiAgICImT0siLElET0ssODcsMTIsNDAsMTIKICAgIFBVU0hCVVRUT04gICAiJkNhbmNlbCIsSURDQU5DRUwsODcsMjYsNDAsMTIKRU5ECgpJRERfTkVXRklMRSBESUFMT0cgRElTQ0FSREFCTEUgMzAsIDIwLCAxNDAsIDgwClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICJOZXciCkZPTlQgMTAsICJNUyBTYW5zIFNlcmlmIgpCRUdJTgogICAgTFRFWFQgICAgICAgICJOZXcgZG9jdW1lbnQgdHlwZSIsMCwzLDIsMTAwLDE1CiAgICBMSVNUQk9YICAgICAgSURDX05FV0ZJTEUsMywxMiw5MCw2NSxMQlNfTk9JTlRFR1JBTEhFSUdIVAogICAgUFVTSEJVVFRPTiAgICImT0siLElET0ssOTcsMTIsNDAsMTIKICAgIFBVU0hCVVRUT04gICAiJkNhbmNlbCIsSURDQU5DRUwsOTcsMjYsNDAsMTIKRU5ECgpJRERfUEFSQUZPUk1BVCBESUFMT0cgRElTQ0FSREFCTEUgMzAsIDIwLCAyMDAsIDExMApTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKQ2FwdGlvbiAiUGFyYWdyYXBoIGZvcm1hdCIKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgpCRUdJTgogICAgR1JPVVBCT1ggIkluZGVudGF0aW9uIiwgMCwgMTAsIDEwLCAxMjAsIDY4CiAgICBMVEVYVCAiTGVmdCIsIDAsIDE1LCAyMiwgNDAsIDEzCiAgICBFRElUVEVYVCBJRENfUEFSQV9MRUZULCA1NSwgMjAsIDYwLCAxMwogICAgTFRFWFQgIlJpZ2h0IiwgMCwgMTUsIDQwLCA0MCwgMTMKICAgIEVESVRURVhUIElEQ19QQVJBX1JJR0hULCA1NSwgMzgsIDYwLCAxMwogICAgTFRFWFQgIkZpcnN0IGxpbmUiLCAwLCAxNSwgNTgsIDQwLCAxMwogICAgRURJVFRFWFQgSURDX1BBUkFfRklSU1QsIDU1LCA1NiwgNjAsIDEzCiAgICBMVEVYVCAiQWxpZ25tZW50IiwgMCwgMTUsIDg3LCA0MCwgMTMKICAgIENPTUJPQk9YIElEQ19QQVJBX0FMSUdOLCA1NSwgODUsIDYwLCA2MCwgQ0JTX0RST1BET1dOTElTVAogICAgUFVTSEJVVFRPTiAiJk9LIiwgSURPSywgMTM3LCAxNSwgNTAsIDE1CiAgICBQVVNIQlVUVE9OICImQ2FuY2VsIiwgSURDQU5DRUwsIDEzNywgMzMsIDUwLCAxNQpFTkQKCklERF9UQUJTVE9QUyBESUFMT0cgRElTQ0FSREFCTEUgMzAsIDIwLCAyMDAsIDExMApTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKQ2FwdGlvbiAiVGFicyIKRk9OVCA4LCAiTVMgU0hlbGwgRExnIgpCRUdJTgogICAgR1JPVVBCT1ggIlRhYiBzdG9wcyIsIDAsIDEwLCAxMCwgMTIwLCA5MAogICAgQ09NQk9CT1ggSURDX1RBQlNUT1BTLCAyMCwgMjAsIDEwMCwgNjAsIENCU19TSU1QTEUgfCBDQlNfU09SVAogICAgREVGUFVTSEJVVFRPTiAiJkFkZCIsIElEX1RBQl9BREQsIDIwLCA4MCwgNDUsIDE1CiAgICBQVVNIQlVUVE9OICImUmVtb3ZlIiwgSURfVEFCX0RFTCwgNzIsIDgwLCA0NSwgMTUKICAgIFBVU0hCVVRUT04gIiZPSyIsIElET0ssIDEzNywgMTUsIDUwLCAxNQogICAgUFVTSEJVVFRPTiAiJkNhbmNlbCIsIElEQ0FOQ0VMLCAxMzcsIDMzLCA1MCwgMTUKICAgIFBVU0hCVVRUT04gIlJlbW92ZSBhbCZsIiwgSURfVEFCX0VNUFRZLCAxMzcsIDUxLCA1MCwgMTUKRU5ECgpJRERfRk9STUFUT1BUUyBESUFMT0cgRElTQ0FSREFCTEUgMCwgMCwgMjgwLCAxMTAKU1RZTEUgRFNfU1lTTU9EQUwKQ2FwdGlvbiAiIgpGT05UIDgsICJNUyBTaGVsbCBEbGciCkJFR0lOCiAgICBHUk9VUEJPWCAiTGluZSB3cmFwcGluZyIsIDAsIDEwLCAxMCwgMTMwLCA4NQogICAgUkFESU9CVVRUT04gIk5vIGxpbmUgd3JhcHBpbmciLCBJRENfUEFHRUZNVF9XTiwgMTgsIDI1LCAxMTcsIDE1CiAgICBSQURJT0JVVFRPTiAiV3JhcCB0ZXh0IGJ5IHRoZSAmd2luZG93IGJvcmRlciIsIElEQ19QQUdFRk1UX1dXLCAxOCwgNDUsIDExNywgMTUKICAgIFJBRElPQlVUVE9OICJXcmFwIHRleHQgYnkgdGhlICZtYXJnaW4iLCBJRENfUEFHRUZNVF9XTSwgMTgsIDY1LCAxMTcsIDE1CiAgICBHUk9VUEJPWCAiVG9vbGJhcnMiLCAwLCAxNTAsIDEwLCAxMjAsIDg1CiAgICBDSEVDS0JPWCAiJlRvb2xiYXIiLCBJRENfUEFHRUZNVF9UQiwgMTYwLCAyMCwgODAsIDE1CiAgICBDSEVDS0JPWCAiJkZvcm1hdGJhciIsIElEQ19QQUdFRk1UX0ZCLCAxNjAsIDM4LCA4MCwgMTUKICAgIENIRUNLQk9YICImUnVsZXIiLCBJRENfUEFHRUZNVF9SVSwgMTYwLCA1NiwgODAsIDE1CiAgICBDSEVDS0JPWCAiJlN0YXR1c2JhciIsIElEQ19QQUdFRk1UX1NCLCAxNjAsIDc0LCA4MCwgMTUKICAgIExURVhUICIiLCBJRENfUEFHRUZNVF9JRCwgMCwwLDAsMApFTkQKClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCkJFR0lOCiAgICBTVFJJTkdfUklDSFRFWFRfRklMRVNfUlRGLCAgICAgIlJpY2ggdGV4dCBmb3JtYXQgKCoucnRmKSIKICAgIFNUUklOR19URVhUX0ZJTEVTX1RYVCwgICAgICAgICAiVGV4dCBkb2N1bWVudHMgKCoudHh0KSIKICAgIFNUUklOR19URVhUX0ZJTEVTX1VOSUNPREVfVFhULCAiVW5pY29kZSB0ZXh0IGRvY3VtZW50ICgqLnR4dCkiCiAgICBTVFJJTkdfQUxMX0ZJTEVTLCAgICAgICAgICAgICAgIkFsbCBkb2N1bWVudHMgKCouKikiCkVORAoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKQkVHSU4KICAgIFNUUklOR19BTElHTl9MRUZULCAgICAgICAgICAgICJMZWZ0IgogICAgU1RSSU5HX0FMSUdOX1JJR0hULCAgICAgICAgICAgIlJpZ2h0IgogICAgU1RSSU5HX0FMSUdOX0NFTlRFUiwgICAgICAgICAgIkNlbnRlciIKRU5ECgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQpCRUdJTgogICAgU1RSSU5HX05FV0ZJTEVfUklDSFRFWFQsICAgICAiUmljaCB0ZXh0IGRvY3VtZW50IgogICAgU1RSSU5HX05FV0ZJTEVfVFhULCAgICAgICAgICAiVGV4dCBkb2N1bWVudCIKICAgIFNUUklOR19ORVdGSUxFX1RYVF9VTklDT0RFLCAgIlVuaWNvZGUgdGV4dCBkb2N1bWVudCIKRU5ECgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQpCRUdJTgogICAgU1RSSU5HX1BSSU5URVJfRklMRVNfUFJOLCAgICAgICAgIlByaW50ZXIgZmlsZXMgKCouUFJOKSIKRU5ECgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQpCRUdJTgogICAgU1RSSU5HX1ZJRVdQUk9QU19USVRMRSwgICAgICAgICAgIk9wdGlvbnMiCiAgICBTVFJJTkdfVklFV1BST1BTX1RFWFQsICAgICAgICAgICAiVGV4dCIKICAgIFNUUklOR19WSUVXUFJPUFNfUklDSFRFWFQsICAgICAgICJSaWNoIHRleHQiCkVORAoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKQkVHSU4KICAgIFNUUklOR19QUkVWSUVXX1BSSU5ULCAgICAgICAgICAgICJQcmludCIKICAgIFNUUklOR19QUkVWSUVXX05FWFRQQUdFLCAgICAgICAgICJOZXh0IHBhZ2UiCiAgICBTVFJJTkdfUFJFVklFV19QUkVWUEFHRSwgICAgICAgICAiUHJldmlvdXMgcGFnZSIKICAgIFNUUklOR19QUkVWSUVXX1RXT1BBR0VTLCAgICAgICAgICJUd28gcGFnZXMiCiAgICBTVFJJTkdfUFJFVklFV19PTkVQQUdFLCAgICAgICAgICAiT25lIHBhZ2UiCiAgICBTVFJJTkdfUFJFVklFV19DTE9TRSwgICAgICAgICAgICAiQ2xvc2UiCkVORAoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKQkVHSU4KICAgIFNUUklOR19VTklUU19DTSwgICAgICAgICAgICAgImNtIgpFTkQK